pax_global_header00006660000000000000000000000064151234325400014511gustar00rootroot0000000000000052 comment=ad52062945110598e056f82d17a6fd50057e30da plee-the-bear-20251226/000077500000000000000000000000001512343254000143705ustar00rootroot00000000000000plee-the-bear-20251226/.gitignore000066400000000000000000000005441512343254000163630ustar00rootroot00000000000000build/ # Files generated by CMake CMakeFiles cmake_install.cmake cmake_uninstall.cmake CMakeCache.txt install_manifest.txt CTestTestfile.cmake Testing cmake-module/bear-config-version.cmake # Binaries bin # Temporary files *~ # Translations *.gmo # Man pages *.1 *.6 # Documentation bear-engine/doc/html # Examples bear-engine/doc/examples/*/ex-* plee-the-bear-20251226/CMakeLists.txt000066400000000000000000000012741512343254000171340ustar00rootroot00000000000000cmake_minimum_required(VERSION 2.6) enable_testing() set( BEAR_ROOT_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" ) set( BEAR_ENGINE_COMMON_INCLUDE_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/bear-engine/common/include" ) set( CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake-helper" ) include( bear-config ) include( gettext ) include( compiler-defaults ) include( docbook-to-man ) if( BEAR_NO_MANPAGES ) set(BEAR_ENGINE_NO_MANPAGES true) set(BF_NO_MANPAGES true) endif() option( BEAR_EDITORS_ENABLED "Tells to compile the Bear Factory, the editors of the Bear engine" TRUE ) subdirs( bear-engine cmake-module ) if( BEAR_EDITORS_ENABLED ) subdirs( bear-factory ) endif() plee-the-bear-20251226/LICENSE000066400000000000000000000014261512343254000154000ustar00rootroot00000000000000Unless otherwise specified, this software, its resources and all tools developed for them, are provided under the terms of the licenses below. You can contact us at for details. The source code located in this directory and its subdirectories is provided under the the terms of the version 3 of the GNU GPL. See the file named "license/GPL" for details about the license. The multimedia resources (pictures, sounds, levels, etc.), located in this directory and its subdirectories are provided under the terms of the version 3 of the Creative Commons License, with attribution and share-alike clauses (CC-by-sa). See the file named "license/CCPL" for details about the license, or http://creativecommons.org/licenses/by-sa/3.0/ for its human-readable summary. plee-the-bear-20251226/Makefile000066400000000000000000000020021512343254000160220ustar00rootroot00000000000000CFLAGS=-Wall -Wno-sign-compare -fdiagnostics-color=always -fext-numeric-literals CXXFLAGS= $(CFLAGS) LDFLAGS= CMAKE_BUILD_TYPE= ifeq ($(BUILD),release) CMAKE_BUILD_TYPE=release BUILD_DIR=build/release else ifeq ($(BUILD),profile) CMAKE_BUILD_TYPE=release CXXFLAGS += -pg -fPIC LDFLAGS += -fPIC BUILD_DIR=build/profile CMAKE_ARGS=-DBEAR_ENGINE_CORE_LINK_TYPE=STATIC else CMAKE_BUILD_TYPE=debug BUILD_DIR=build/debug endif CMAKE_ARGS += -DCMAKE_BUILD_TYPE=$(CMAKE_BUILD_TYPE) \ -DCMAKE_INSTALL_PREFIX=/usr all: test install: test cd $(BUILD_DIR) && $(MAKE) install uninstall: [ ! -d $(BUILD_DIR) ] || cd $(BUILD_DIR) && $(MAKE) uninstall test: target cd $(BUILD_DIR) && CTEST_OUTPUT_ON_FAILURE=1 ctest target: .cmake cd $(BUILD_DIR) && $(MAKE) VERBOSE=$(VERBOSE) .cmake: $(BUILD_DIR) cd $(BUILD_DIR) \ && CFLAGS="$(CFLAGS)" CXXFLAGS="$(CXXFLAGS)" LDFLAGS="$(LDFLAGS)" \ cmake ../.. $(CMAKE_ARGS) $(BUILD_DIR): [ -d $(BUILD_DIR) ] || mkdir -p $(BUILD_DIR) clean: rm -fr build plee-the-bear-20251226/README.md000066400000000000000000000060101512343254000156440ustar00rootroot00000000000000What is this? ==== This is the Bear engine, a set of C++ libraries and tools dedicated to creating great 2D games. It has been used to create Plee the Bear, Andy's Super Great Park and Tunnel. The engine provides at least the following functionalities: - multiple layers levels, - character models with multiple actions, multiple parts, interpolated movement and event handling, - multiple collision detection regions per character, - complex animations with loops, pre loop and post loop sequences, - music and sound playing, with distance tone down effects, - understandable physics with blocks, curves and areas with different densities, - predefined classical movements (rotating around something, tracking something, going back and forth two target positions, etc.), - simple rendering procedure supporting sprites, polygons, lines, scaling, rotations, color variation, - fragment shaders at the sprite, item or layer level, - true type fonts and bitmap fonts, - basic scripting for cut scenes, - easy creation and restoration of save states - a set of widgets for dialog interfaces, - keyboard, mouse and joystick support. There is also a collection of classical 2D games items provided with the engine, like: - decorative items (sprites, animations, flows, stars), - cameras tracking some objects, - pushable blocks, - fireworks, - springs, - rolling credits, - elastic links, - etc. The engine comes with a set of tools, namely the Bear Factory, intended to help creating resources for the game. These tools include a level editor, a character/model editor and an animation editor. On what system relies the Bear engine? ==== The engine uses the SDL and OpenGL as subsystems. There is no other back-end yet but you are welcome to propose yours :) What are the other build dependencies? ==== We use CMake as the build system (http://www.cmake.org/). You will also need a C++ compiler and the following libraries in order to build the engine and its tools: - Boost: http://www.boost.org, - SDL 2: http://www.libsdl.org, - SDL Mixer 2: http://www.libsdl.org/projects/SDL_mixer/, - Claw: http://libclaw.sourceforge.net, - Gettext: http://www.gnu.org/software/gettext/, - FreeType: http://www.freetype.org/, - wxWidgets (for the editors): http://www.wxwidgets.org/, How to build the project? ==== 1. Enter the source directory and type the following command: cmake . 2. If everything went well, go to 4. 3. Grumble about missing libraries, unreadable messages and inaccurate documentation. Fix the problems and go to 1. 4. Type the following command and wait: make Where to get help? ==== Issues should be reported on the projects page on GitHub: https://github.com/j-jorge/bear For general questions, send an email to julien.jorge@stuff-o-matic.com. Legal information ==== The software is licensed under the version 3 of the GNU GPL. All multimedia resources are provided under the terms of the version 3 of the Creative Commons license, with attribution and share-alike clauses (CC-by-sa). See the accompanying LICENSE file for details. plee-the-bear-20251226/bear-engine/000077500000000000000000000000001512343254000165445ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/CMakeLists.txt000066400000000000000000000067261512343254000213170ustar00rootroot00000000000000cmake_minimum_required(VERSION 2.6) project(bear-engine) # Directories where the executable and libraries are built set( BEAR_ENGINE_EXECUTABLE_OUTPUT_PATH "${CMAKE_CURRENT_BINARY_DIR}/bin" ) set( BEAR_ENGINE_LIBRARY_OUTPUT_PATH "${BEAR_ENGINE_EXECUTABLE_OUTPUT_PATH}" ) set( EXECUTABLE_OUTPUT_PATH "${BEAR_ENGINE_EXECUTABLE_OUTPUT_PATH}" ) set( LIBRARY_OUTPUT_PATH "${BEAR_ENGINE_LIBRARY_OUTPUT_PATH}" ) # common flags set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}" ) #------------------------------------------------------------------------------- # various libraries #------------------------------------------------------------------------------- # Claw find_package( libclaw 1.7.4 ) #------------------------------------------------------------------------------- # Include directories for Claw include_directories( ${CLAW_INCLUDE_DIRECTORY} ${CLAW_GRAPHIC_INCLUDE_DIRECTORY} ) #------------------------------------------------------------------------------- # Link directories for Claw link_directories( ${CLAW_LINK_DIRECTORY} ${CLAW_GRAPHIC_LINK_DIRECTORY} ) #------------------------------------------------------------------------------- # Boost include(FindBoost) find_package( Boost 1.42 REQUIRED COMPONENTS filesystem regex system thread ) if( NOT Boost_FOUND ) message( FATAL_ERROR "You must have boost::filesystem, boost::thread and boost::regex libraries installed (at least 1.42)" ) endif( NOT Boost_FOUND ) #------------------------------------------------------------------------------- # Include directories for Boost include_directories( ${Boost_INCLUDE_DIR} ) #------------------------------------------------------------------------------- # Link directories for Boost link_directories( ${Boost_LIBRARY_DIRS} ) #------------------------------------------------------------------------------- # check OpenGL if( NOT BUILD_PLATFORM STREQUAL "android" ) include( FindOpenGL ) if( NOT OPENGL_FOUND ) message( FATAL_ERROR "OpenGL must be installed." ) endif() endif() #------------------------------------------------------------------------------- # check SDL2 include( FindSDL2 ) if( NOT SDL2_FOUND ) message( FATAL_ERROR "SDL2 library must be installed." ) else( NOT SDL2_FOUND ) #----------------------------------------------------------------------------- # Include directories for SDL include_directories( ${SDL2_INCLUDE_DIR} ) endif( NOT SDL2_FOUND ) #------------------------------------------------------------------------------- # check SDL2_mixer include( FindSDL2_mixer ) if( NOT SDL2MIXER_FOUND ) message( FATAL_ERROR "SDL2_mixer lbrary must be installed." ) else( NOT SDL2MIXER_FOUND ) #----------------------------------------------------------------------------- # Include directories for all these libraries include_directories( ${SDL2MIXER_INCLUDE_DIR} ) endif( NOT SDL2MIXER_FOUND ) #------------------------------------------------------------------------------- # Link directories for the game link_directories( ${LIBRARY_OUTPUT_PATH} ) #------------------------------------------------------------------------------- include_directories( common/include ) set( BEAR_ENGINE_INCLUDE_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/core/src" ) #------------------------------------------------------------------------------- subdirs( core lib desktop ) option( RUNNING_BEAR_ENABLED "Tells to compile the main program of the engine." FALSE ) if( RUNNING_BEAR_ENABLED ) subdirs( running_bear ) endif() plee-the-bear-20251226/bear-engine/common/000077500000000000000000000000001512343254000200345ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/common/include/000077500000000000000000000000001512343254000214575ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/common/include/easing.hpp000066400000000000000000000222361512343254000234430ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Codes describing various values for the easing functions. * \author Julien Jorge */ #ifndef __BEAR_EASING_HPP__ #define __BEAR_EASING_HPP__ #include "claw/tween/single_tweener.hpp" #include "claw/tween/easing/easing_back.hpp" #include "claw/tween/easing/easing_bounce.hpp" #include "claw/tween/easing/easing_circ.hpp" #include "claw/tween/easing/easing_cubic.hpp" #include "claw/tween/easing/easing_elastic.hpp" #include "claw/tween/easing/easing_expo.hpp" #include "claw/tween/easing/easing_linear.hpp" #include "claw/tween/easing/easing_none.hpp" #include "claw/tween/easing/easing_quad.hpp" #include "claw/tween/easing/easing_quart.hpp" #include "claw/tween/easing/easing_quint.hpp" #include "claw/tween/easing/easing_sine.hpp" namespace bear { /** * \brief Codes describing the easing functions. * \param Julien Jorge */ class easing { public: /** \brief The easing functions. */ class function { public: typedef unsigned int function_type; public: static const function_type not_an_easing_function = 0; static const function_type back = 1; static const function_type bounce = 2; static const function_type circ = 3; static const function_type cubic = 4; static const function_type elastic = 5; static const function_type expo = 6; static const function_type linear = 7; static const function_type none = 8; static const function_type quad = 9; static const function_type quart = 10; static const function_type quint = 11; static const function_type sine = 12; /** * \brief Convert a function type into a string. * \param f The function type. */ static std::string to_string( function_type f ) { switch ( f ) { case back: return "back"; case bounce: return "bounce"; case circ: return "circ"; case cubic: return "cubic"; case elastic: return "elastic"; case expo: return "expo"; case linear: return "linear"; case none: return "none"; case quad: return "quad"; case quart: return "quart"; case quint: return "quint"; case sine: return "sine"; default: return "not_an_easing_function"; } } // to_string() /** * \brief Get a fonction type given a string containing its name. * \param f The function. */ static function_type from_string( const std::string& f ) { if ( f == "back" ) return back; else if ( f == "bounce" ) return bounce; else if ( f == "circ" ) return circ; else if ( f == "cubic" ) return cubic; else if ( f == "elastic" ) return elastic; else if ( f == "expo" ) return expo; else if ( f == "linear" ) return linear; else if ( f == "none" ) return none; else if ( f == "quad" ) return quad; else if ( f == "quart" ) return quart; else if ( f == "quint" ) return quint; else if ( f == "sine" ) return sine; else return not_an_easing_function; } // from_string() }; // class function /** \brief The easing directions. */ class direction { public: typedef unsigned int direction_type; public: static const direction_type not_an_easing_direction = 0; static const direction_type in = 1; static const direction_type out = 2; static const direction_type in_out = 3; /** * \brief Convert a direction type into a string. * \param d The direction type. */ static std::string to_string( direction_type d ) { switch ( d ) { case in: return "in"; case out: return "out"; case in_out: return "in_out"; default: return "not_an_easing_direction"; } } // to_string() /** * \brief Get a fonction type given a string containing its name. * \param d The direction. */ static direction_type from_string( const std::string& d ) { if ( d == "in" ) return in; else if ( d == "out" ) return out; else if ( d == "in_out" ) return in_out; else return not_an_easing_direction; } // from_string() }; // direction_type public: /** * \brief Constructor. */ easing() : m_function(function::none), m_direction(direction::in) { } /** * \brief Constructor. * \param f The function. * \param d The direction. */ easing( function::function_type f, direction::direction_type d ) : m_function(f), m_direction(d) { } /** * \brief Check if this easing is the same than another one. * \param that The instance to compare to. */ bool operator==( const easing& that ) const { return (m_function == that.m_function) && (m_direction == that.m_direction); } // operator==() /** * \brief Check if this easing isnot the same than another one. * \param that The instance to compare to. */ bool operator!=( const easing& that ) const { return !(*this == that ); } // operator!=() /** \brief Get the function of this easing. */ function::function_type get_function() const { return m_function; } /** * \brief Set the function of this easing. * \param f The function. */ void set_function( function::function_type f ) { m_function = f; } /** \brief Get the direction of this easing. */ direction::direction_type get_direction() const { return m_direction; } /** * \brief Set the direction of this easing. * \param d The direction. */ void set_direction( direction::direction_type d ) { m_direction = d; } /** * \brief Get a string made of the function name, a colon and the direction * name. */ std::string to_string() const { return function::to_string(m_function) + ':' + direction::to_string(m_direction); } // to_string() /** * \brief Initialize the instance from a string made of the function name, a * colon and the direction name. * \param s The string to initialize from. */ void from_string( const std::string& s ) { const std::size_t pos = s.find_last_of(':'); if ( (pos == std::string::npos) || (pos == 0) ) { m_function = function::not_an_easing_function; m_direction = direction::not_an_easing_direction; } else { m_function = function::from_string( s.substr(0, pos) ); m_direction = direction::from_string( s.substr(pos + 1) ); } } // from_string() /** * \brief Get the easing from claw function corresponding to this instance. */ claw::tween::single_tweener::easing_function to_claw_easing_function() const { switch (m_function) { case function::back: return get_claw_easing_direction(); case function::bounce: return get_claw_easing_direction(); case function::circ: return get_claw_easing_direction(); case function::cubic: return get_claw_easing_direction(); case function::elastic: return get_claw_easing_direction(); case function::expo: return get_claw_easing_direction(); case function::linear: return get_claw_easing_direction(); case function::quad: return get_claw_easing_direction(); case function::quart: return get_claw_easing_direction(); case function::quint: return get_claw_easing_direction(); case function::sine: return get_claw_easing_direction(); default: return get_claw_easing_direction(); } } // to_claw_easing_function() private: /** * \brief Get the easing function corresponding to the direction. */ template claw::tween::single_tweener::easing_function get_claw_easing_direction() const { switch( m_direction ) { case direction::in: return &Easing::ease_in; case direction::out: return &Easing::ease_out; default: return &Easing::ease_in_out; } } // get_claw_easing_direction() private: /** \brief The function of the easing. */ function::function_type m_function; /** \brief The direction of the easing. */ direction::direction_type m_direction; }; // class easing } // namespace bear #endif // __BEAR_EASING_HPP__ plee-the-bear-20251226/bear-engine/common/include/level_code_value.hpp000066400000000000000000000047241512343254000254740ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Codes describing level parameters in a compiled level file. * \author Julien Jorge */ #ifndef __BEAR_LEVEL_CODE_VALUE_HPP__ #define __BEAR_LEVEL_CODE_VALUE_HPP__ namespace bear { /** * \brief Codes describing level parameters in a compiled level file. */ class level_code_value { public: /** \brief The type of the codes. */ typedef unsigned int value_type; public: /** \brief End of file. */ static const value_type eof = 0; /** \brief Declare that an item will be defined. */ static const value_type item_declaration = 30; /** \brief Defition of the fields of a declared item. */ static const value_type item_definition = 31; /** \brief Known class of type bear::engine::base_item. */ static const value_type base_item = 32; /** \brief Dynamic field of type integer. */ static const value_type field_int = 40; /** \brief Dynamic field of type value_typeeger. */ static const value_type field_u_int = 41; /** \brief Dynamic field of type real. */ static const value_type field_real = 42; /** \brief Dynamic field of type boolean. */ static const value_type field_bool = 43; /** \brief Dynamic field of type string. */ static const value_type field_string = 44; /** \brief Dynamic field of type sprite. */ static const value_type field_sprite = 45; /** \brief Dynamic field of type animation. */ static const value_type field_animation = 46; /** \brief Dynamic field of type item. */ static const value_type field_item = 47; /** \brief Dynamic field of type sample. */ static const value_type field_sample = 48; /** \brief Dynamic field of type font. */ static const value_type field_font = 49; /** \brief Dynamic field taking a list of values. */ static const value_type field_list = 50; /** \brief Layer. */ static const value_type layer = 70; /** \brief Dynamic field of type color. */ static const value_type field_color = 100; /** \brief Dynamic field of type easing. */ static const value_type field_easing = 101; }; // class level_code_value } // namespace bear #endif // __BEAR_LEVEL_CODE_VALUE_HPP__ plee-the-bear-20251226/bear-engine/core/000077500000000000000000000000001512343254000174745ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/core/CMakeLists.txt000066400000000000000000000003221512343254000222310ustar00rootroot00000000000000set( BEAR_ENGINE_INCLUDE_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/src/" ) subdirs( src ) option( TESTING_ENABLED "Tells to compile the unit tests." TRUE ) if( TESTING_ENABLED ) subdirs( test ) endif() plee-the-bear-20251226/bear-engine/core/src/000077500000000000000000000000001512343254000202635ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/core/src/CMakeLists.txt000066400000000000000000000004571512343254000230310ustar00rootroot00000000000000if( NOT BEAR_ENGINE_CORE_LINK_TYPE ) set( BEAR_ENGINE_CORE_LINK_TYPE "SHARED" ) endif( NOT BEAR_ENGINE_CORE_LINK_TYPE ) include_directories( ${BEAR_ENGINE_INCLUDE_DIRECTORY} ) subdirs( audio communication debug engine expr gui input net text_interface time universe visual ) plee-the-bear-20251226/bear-engine/core/src/audio/000077500000000000000000000000001512343254000213645ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/core/src/audio/CMakeLists.txt000066400000000000000000000015771512343254000241360ustar00rootroot00000000000000set( AUDIO_TARGET_NAME bear_audio ) add_definitions( "-DUSE_RWOPS" ) #------------------------------------------------------------------------------- set( AUDIO_SOURCE_FILES code/sample.cpp code/sdl_sample.cpp code/sdl_sound.cpp code/sound.cpp code/sound_effect.cpp code/sound_manager.cpp ) add_library( ${AUDIO_TARGET_NAME} ${BEAR_ENGINE_CORE_LINK_TYPE} ${AUDIO_SOURCE_FILES} ) set_target_properties( ${AUDIO_TARGET_NAME} PROPERTIES INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/${BEAR_ENGINE_INSTALL_LIBRARY_DIR}" ) install( TARGETS ${AUDIO_TARGET_NAME} DESTINATION ${BEAR_ENGINE_INSTALL_LIBRARY_DIR} ) target_link_libraries( ${AUDIO_TARGET_NAME} ${SDL2MIXER_LIBRARY} ${SDL2_LIBRARY} ${CLAW_LOGGER_LIBRARIES} ${Boost_THREAD_LIBRARY} ${Boost_SYSTEM_LIBRARY} ) if( WIN32 ) target_link_libraries( ${AUDIO_TARGET_NAME} winmm ) endif() plee-the-bear-20251226/bear-engine/core/src/audio/class_export.hpp000066400000000000000000000014211512343254000246010ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Definition of the AUDIO_EXPORT macro according to the fact that we * create the library or link to it. * \author Julien Jorge */ #ifndef __AUDIO_CLASS_EXPORT_HPP__ #define __AUDIO_CLASS_EXPORT_HPP__ #ifndef AUDIO_EXPORT # ifdef _WIN32 # ifdef bear_audio_EXPORTS # define AUDIO_EXPORT __declspec(dllexport) # else # define AUDIO_EXPORT __declspec(dllimport) # endif // def bear_audio_EXPORTS # else // def _WIN32 # define AUDIO_EXPORT # endif // def _WIN32 #endif // ndef AUDIO_EXPORT #endif // __AUDIO_CLASS_EXPORT_HPP__ plee-the-bear-20251226/bear-engine/core/src/audio/code/000077500000000000000000000000001512343254000222765ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/core/src/audio/code/sample.cpp000066400000000000000000000123131512343254000242630ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementaion of the bear::audio::sample class. * \author Julien Jorge */ #include "audio/sample.hpp" #include "audio/sound_manager.hpp" #include /*----------------------------------------------------------------------------*/ std::size_t bear::audio::sample::s_next_id(1); /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param name The name of the sound resource. */ bear::audio::sample::sample( const std::string& name ) : m_manager(NULL), m_id(s_next_id), m_name(name), m_is_playing(false) { ++s_next_id; } // sample::sample() /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param name The name of the sound resource. * \param owner The instance of sound_manager who manages the sound. */ bear::audio::sample::sample( const std::string& name, sound_manager& owner ) : m_manager(&owner), m_id(s_next_id), m_name(name), m_is_playing(false) { ++s_next_id; } // sample::sample() /*----------------------------------------------------------------------------*/ /** * \brief Destructor. */ bear::audio::sample::~sample() { stop(); if (m_manager != NULL) m_manager->sample_deleted(this); } // sample::~sample() /*----------------------------------------------------------------------------*/ /** * \brief Create a copy of this sample. */ bear::audio::sample* bear::audio::sample::clone() const { sample* result = NULL; if ( m_manager != NULL ) { result = m_manager->new_sample( get_sound_name() ); result->set_effect(get_effect()); } return result; } // sample::clone() /*----------------------------------------------------------------------------*/ /** * \brief Get the identifier of the sample. * \remark identifiers are strictly greater than zero. */ std::size_t bear::audio::sample::get_id() const { return m_id; } // sample::get_id() /*----------------------------------------------------------------------------*/ /** * \brief Get the name of the sound resource. */ const std::string& bear::audio::sample::get_sound_name() const { return m_name; } // sample::get_sound_name() /*----------------------------------------------------------------------------*/ /** * \brief Start to play the sound. */ void bear::audio::sample::play() { set_playing(); stop(); } // sample::play() /*----------------------------------------------------------------------------*/ /** * \brief Start to play the sound, with an effect. * \param effect The effect applied to the sound. */ void bear::audio::sample::play( const sound_effect& effect ) { set_playing(); stop(); } // sample::play() /*----------------------------------------------------------------------------*/ /** * \brief Pause the sound. */ void bear::audio::sample::pause() { /* nothing. */ } // sample::pause() /*----------------------------------------------------------------------------*/ /** * \brief Resume the sound. */ void bear::audio::sample::resume() { /* nothing. */ } // sample::resume() /*----------------------------------------------------------------------------*/ /** * \brief Stop the sample. */ void bear::audio::sample::stop() { sample_finished(); } // sample::stop() /*----------------------------------------------------------------------------*/ /** * \brief Stop the sound after fading out. * \param d Fade out this duration (in seconds). */ void bear::audio::sample::stop( double d ) { sample_finished(); } // sample::stop() /*----------------------------------------------------------------------------*/ /** * \brief Get the effect of the sample. */ bear::audio::sound_effect bear::audio::sample::get_effect() const { return sound_effect(); } // sample::get_effect() /*----------------------------------------------------------------------------*/ /** * \brief Set the effect of the sample. * \param effect The new effect. */ void bear::audio::sample::set_effect( const sound_effect& effect ) { } // sample::set_effect() /*----------------------------------------------------------------------------*/ /** * \brief Set the volume of the sample (for sound_manager only). * \param v The volume. */ void bear::audio::sample::set_volume( double v ) { } // sample::set_volume() /*----------------------------------------------------------------------------*/ /** * \brief Tells if this sample is currently playing. */ bool bear::audio::sample::is_playing() const { return m_is_playing; } // sample::is_playing() /*----------------------------------------------------------------------------*/ /** * \brief Inform the manager that this sample is finished. */ void bear::audio::sample::sample_finished() { m_is_playing = false; if (m_manager != NULL) m_manager->sample_finished(this); } // sample::sample_finished() /*----------------------------------------------------------------------------*/ /** * \brief Flag this sample as currently playing. */ void bear::audio::sample::set_playing() { m_is_playing = true; } // sample::sample_finished() plee-the-bear-20251226/bear-engine/core/src/audio/code/sdl_sample.cpp000066400000000000000000000351341512343254000251330ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::audio::sdl_sample class. * \author Julien Jorge */ #include "audio/sdl_sample.hpp" #include "audio/sdl_sound.hpp" #include "audio/sound_manager.hpp" #include #include #include #include #include #include #include /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \post is_empty() == true. */ bear::audio::sdl_sample::channel_attribute::channel_attribute() : m_sample(NULL) { } // sdl_sample::channel_attribute::channel_attribute() /*----------------------------------------------------------------------------*/ /** * \brief Destructor. */ bear::audio::sdl_sample::channel_attribute::~channel_attribute() { clear(); } // sdl_sample::channel_attribute::~channel_attribute() /*----------------------------------------------------------------------------*/ /** * \brief Set the sample attribute. * \param s The sample. * \post is_empty() = false. */ void bear::audio::sdl_sample::channel_attribute::set_sample( const sdl_sample& s ) { m_sample = &s; } // sdl_sample::channel_attribute::set_sample() /*----------------------------------------------------------------------------*/ /** * \brief Get the stored sample. * \pre is_empty() = false. */ const bear::audio::sdl_sample& bear::audio::sdl_sample::channel_attribute::get_sample() const { CLAW_PRECOND( m_sample != NULL ); return *m_sample; } // sdl_sample::channel_attribute::get_sample() /*----------------------------------------------------------------------------*/ /** * \brief Set the effect of the sound. * \param effect The effect. */ void bear::audio::sdl_sample::channel_attribute::set_effect ( const sound_effect& effect ) { m_effect = effect; } // sdl_sample::channel_attribute::set_effect() /*----------------------------------------------------------------------------*/ /** * \brief Get the effect of the sound. */ const bear::audio::sound_effect& bear::audio::sdl_sample::channel_attribute::get_effect() const { return m_effect; } // sdl_sample::channel_attribute::get_effect() /*----------------------------------------------------------------------------*/ /** * \brief Remove the sound attribute. */ void bear::audio::sdl_sample::channel_attribute::clear() { m_sample = NULL; } // sdl_sample::channel_attribute::clear() /*----------------------------------------------------------------------------*/ /** * \brief Tell if there's a sound associated. */ bool bear::audio::sdl_sample::channel_attribute::is_empty() const { return m_sample == NULL; } // sdl_sample::channel_attribute::is_empty() /*----------------------------------------------------------------------------*/ std::vector bear::audio::sdl_sample::s_playing_channels; /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param s The sound of which we are a sample. * \param owner The instance of sound_manager who manage the sound. */ bear::audio::sdl_sample::sdl_sample( const sdl_sound& s, sound_manager& owner ) : sample(s.get_sound_name(), owner), m_channel(-1), m_sound(&s) { } // sdl_sample::sdl_sample() /*----------------------------------------------------------------------------*/ /** * \brief Destructor. */ bear::audio::sdl_sample::~sdl_sample() { stop(); } // sdl_sample::~sdl_sample() /*----------------------------------------------------------------------------*/ /** * \brief Start to play the sound. */ void bear::audio::sdl_sample::play() { inside_play(); } // sdl_sample::play() /*----------------------------------------------------------------------------*/ /** * \brief Start to play the sound, with an effect. * \param effect The effect applied to the sound. */ void bear::audio::sdl_sample::play( const sound_effect& effect ) { m_effect = effect; inside_play(); } // sdl_sample::play() [effect] /*----------------------------------------------------------------------------*/ /** * \brief Pause the sound. */ void bear::audio::sdl_sample::pause() { if ( m_channel != -1 ) Mix_Pause( m_channel ); } // sdl_sample::pause() /*----------------------------------------------------------------------------*/ /** * \brief Resume the sound. */ void bear::audio::sdl_sample::resume() { if ( m_channel != -1 ) Mix_Resume( m_channel ); } // sdl_sample::resume() /*----------------------------------------------------------------------------*/ /** * \brief Stop the sound now. */ void bear::audio::sdl_sample::stop() { if ( m_channel != -1 ) Mix_HaltChannel( m_channel ); m_channel = -1; sample_finished(); } // sdl_sample::stop() /*----------------------------------------------------------------------------*/ /** * \brief Stop the sound after fading out. * \param d Fade out this duration (in seconds). */ void bear::audio::sdl_sample::stop( double d ) { if ( m_channel != -1 ) { const int ms( d * 1000 + 0.5 ); if ( ms <= 0 ) stop(); else if ( Mix_FadeOutChannel( m_channel, ms ) != 1 ) stop(); } } // sdl_sample::stop() /*----------------------------------------------------------------------------*/ /** * \brief Get the effect applied to this sample. */ bear::audio::sound_effect bear::audio::sdl_sample::get_effect() const { if ( m_channel != -1 ) return s_playing_channels[m_channel]->get_effect(); else return m_effect; } // sdl_sample::get_effect() /*----------------------------------------------------------------------------*/ /** * \brief Change the effect of the sample. * \param effect The new effect. */ void bear::audio::sdl_sample::set_effect( const sound_effect& effect ) { m_effect = effect; if ( m_channel != -1 ) { if ( !Mix_UnregisterAllEffects(m_channel) ) claw::logger << claw::log_warning << "sdl_sample::set_effect(): " << Mix_GetError() << std::endl; inside_set_effect(); } } // sdl_sample::change_effect() /*----------------------------------------------------------------------------*/ /** * \brief Set the volume of the sample (for sound_manager only). * \param v The volume. */ void bear::audio::sdl_sample::set_volume( double v ) { if ( m_channel != -1 ) Mix_Volume( m_channel, (int)(v * MIX_MAX_VOLUME) ); } // sdl_sample::set_volume() /*----------------------------------------------------------------------------*/ /** * \brief Callback function called when a channel is finished. * \param channel The finished channel. */ void bear::audio::sdl_sample::channel_finished(int channel) { /* This is the last use of s_playing_channels[channel] for this sound. sdl_sample::finished() can't be const for now because it needs to remove channel from the m_channels list. That's why we exceptionally remove the const attribute. */ sdl_sample* s = const_cast (&s_playing_channels[channel]->get_sample()); s->finished(); } // sdl_sample::channel_finished() /*----------------------------------------------------------------------------*/ /** * \brief Callback function applying a distance tone down effect to a channel. * \param channel The channel receiving the effect. * \param stream (in/out) Sound data. * \param length The size of the stream. * \param attr (in) Channel attribute. * \pre attr != NULL. */ void bear::audio::sdl_sample::distance_tone_down (int channel, void* stream, int length, void* attr) { CLAW_PRECOND( attr != NULL ); CLAW_PRECOND( length >= 0 ); CLAW_PRECOND( length % 2 == 0 ); CLAW_PRECOND( sdl_sound::get_audio_format() == AUDIO_S16 ); claw::int_16* buffer = static_cast(stream); length /= 2; const channel_attribute* attribute = static_cast(attr); const sdl_sound* sound = attribute->get_sample().m_sound; const claw::math::coordinate_2d ears = sound->get_manager().get_ears_position(); const claw::math::coordinate_2d pos = attribute->get_effect().get_position(); const double distance = std::abs(ears.x - pos.x) + std::abs(ears.y - pos.y); const double tone_down = sound->get_manager().get_volume_for_distance( distance ); if ( tone_down <= std::numeric_limits::epsilon() ) std::fill( buffer, buffer + (unsigned int)length, 0 ); else if ( tone_down < 1.0 ) for (unsigned int i=0; i!=(unsigned)length; ++i) buffer[i] = (claw::int_16)((double)buffer[i] * tone_down); } // sdl_sample::distance_tone_down() /*----------------------------------------------------------------------------*/ /** * \brief Callback function applying the balance effect to a channel. * \param channel The channel receiving the effect. * \param stream (in/out) Sound data. * \param length The size of the stream. * \param attr (in) Channel attribute. * \pre attr != NULL. */ void bear::audio::sdl_sample::balance (int channel, void* stream, int length, void* attr) { CLAW_PRECOND( attr != NULL ); CLAW_PRECOND( length >= 0 ); CLAW_PRECOND( length % 2 == 0 ); CLAW_PRECOND( sdl_sound::get_audio_format() == AUDIO_S16 ); const channel_attribute* attribute = static_cast(attr); const sdl_sound* sound = attribute->get_sample().m_sound; const claw::math::coordinate_2d ears = sound->get_manager().get_ears_position(); const claw::math::coordinate_2d pos = attribute->get_effect().get_position(); const double distance = std::abs(ears.x - pos.x); const double tone_down = sound->get_manager().get_volume_for_distance( distance ); double left_volume; double right_volume; if ( ears.x < pos.x ) { right_volume = 1; left_volume = tone_down; } else { right_volume = tone_down; left_volume = 1; } claw::int_16* buffer = static_cast(stream); length /= 2; CLAW_PRECOND( length % 2 == 0 ); for ( int i=0; i!=length; i += 2 ) { buffer[i] *= left_volume; buffer[i+1] *= right_volume; } } // sdl_sample::balance() /*----------------------------------------------------------------------------*/ /** * \brief Callback function changing the volume of a channel. * \param channel The channel receiving the effect. * \param stream (in/out) Sound data. * \param length The size of the stream. * \param attr (in) Channel attribute. * \pre attr != NULL. * \remark This method adjust the volume of the sample, independently of the * global volume, actually stored in Mix_Volume(). */ void bear::audio::sdl_sample::volume (int channel, void* stream, int length, void* attr) { CLAW_PRECOND( attr != NULL ); CLAW_PRECOND( length % 2 == 0 ); CLAW_PRECOND( sdl_sound::get_audio_format() == AUDIO_S16 ); claw::int_16* buffer = static_cast(stream); length /= 2; const channel_attribute* attribute = static_cast(attr); const double v = attribute->get_effect().get_volume(); if ( v <= std::numeric_limits::epsilon() ) std::fill( buffer, buffer + (unsigned int)length, 0 ); else for (unsigned int i=0; i!=(unsigned)length; ++i) buffer[i] = (claw::int_16)((double)buffer[i] * v); } // sdl_sample::volume() /*----------------------------------------------------------------------------*/ /** * \brief Start to play the sample. */ void bear::audio::sdl_sample::inside_play() { if ( m_channel != -1 ) stop(); if ( m_sound != NULL ) m_channel = m_sound->play(m_effect.get_loops()); if ( m_channel != -1 ) { set_playing(); global_add_channel(); Mix_Volume ( m_channel, (int)(m_sound->get_manager().get_volume(this) * MIX_MAX_VOLUME) ); inside_set_effect(); } } // sdl_sample::inside_play() /*----------------------------------------------------------------------------*/ /** * \brief Set the effect associated to a channel. * \pre m_channel >= 0 * \pre s_playing_channels[channel]->is_empty() == false. * \post s_playing_channels[channel]->get_effect().get_position() == position. */ void bear::audio::sdl_sample::inside_set_effect() { CLAW_PRECOND( m_channel >= 0 ); CLAW_PRECOND( s_playing_channels[m_channel]->is_empty() == false ); s_playing_channels[m_channel]->set_effect( m_effect ); if ( m_effect.has_a_position() ) { int ok; ok = Mix_RegisterEffect ( m_channel, distance_tone_down, NULL, s_playing_channels[m_channel] ); if (!ok) claw::logger << claw::log_warning << "position effect distance: " << Mix_GetError() << std::endl; ok = Mix_RegisterEffect ( m_channel, balance, NULL, s_playing_channels[m_channel] ); if (!ok) claw::logger << claw::log_warning << "position effect balance: " << Mix_GetError() << std::endl; } if ( m_effect.get_volume() != 1 ) { int ok; ok = Mix_RegisterEffect ( m_channel, volume, NULL, s_playing_channels[m_channel] ); if (!ok) claw::logger << claw::log_warning << "volume effect: " << Mix_GetError() << std::endl; } } // sdl_sample::inside_set_effect() /*----------------------------------------------------------------------------*/ /** * \brief Associate the current instance to a channel in the common list. * \pre m_channel >= 0 * \pre s_playing_channels[m_channel].is_empty(). * \post &sdl_sample::s_playing_channels[m_channel].get_sound() == this. */ void bear::audio::sdl_sample::global_add_channel() { CLAW_PRECOND( m_channel >= 0 ); if ( (unsigned int)m_channel >= s_playing_channels.size() ) s_playing_channels.resize(m_channel+1, NULL); else { CLAW_PRECOND( s_playing_channels[m_channel] == NULL ); } s_playing_channels[m_channel] = new channel_attribute; s_playing_channels[m_channel]->set_sample(*this); } // sdl_sample::global_add_channel() /*----------------------------------------------------------------------------*/ /** * \brief Remove a finished channel from the playing list. * \pre m_channel >= 0 * \post sdl_sample::s_playing_channels[channel]->is_empty() = true. * \post m_channels.find( channel ) == m_channels.end(). */ void bear::audio::sdl_sample::finished() { CLAW_PRECOND( m_channel >= 0 ); if ( !Mix_UnregisterAllEffects(m_channel) ) claw::logger << claw::log_warning << "sdl_sample::finished(): " << Mix_GetError() << std::endl; delete s_playing_channels[m_channel]; s_playing_channels[m_channel] = NULL; m_channel = -1; sample_finished(); } // sdl_sample::finished() plee-the-bear-20251226/bear-engine/core/src/audio/code/sdl_sound.cpp000066400000000000000000000132231512343254000247750ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::audio::sdl_sound class. * \author Julien Jorge */ #include "audio/sdl_sound.hpp" #include "audio/sdl_sample.hpp" #include "audio/sound_manager.hpp" #include #include #include #include /*----------------------------------------------------------------------------*/ unsigned int bear::audio::sdl_sound::s_audio_rate = 44100; unsigned int bear::audio::sdl_sound::s_audio_format = AUDIO_S16; unsigned int bear::audio::sdl_sound::s_audio_channels = 2; unsigned int bear::audio::sdl_sound::s_audio_buffers = 1024; unsigned int bear::audio::sdl_sound::s_audio_mix_channels = 256; /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param file The stream containing the wav file. * \param name The name of the sound resource. * \param owner The instance of sound_manager who stores me. */ bear::audio::sdl_sound::sdl_sound ( std::istream& file, const std::string& name, sound_manager& owner ) : sound(name, owner), m_sound(NULL), m_raw_audio(NULL) { file.seekg( 0, std::ios::end ); std::streamoff file_size = file.tellg(); file.seekg( 0, std::ios::beg ); char* buffer = new char[file_size]; file.read( buffer, file_size ); m_loader = new boost::thread ( boost::bind( &sdl_sound::load_sound, this, buffer, file_size ) ); } // sdl_sound::sdl_sound() /*----------------------------------------------------------------------------*/ /** * \brief Copy constructor. * \param that The instance to copy from. * \param owner The instance of sound_manager who stores me. */ bear::audio::sdl_sound::sdl_sound ( const sdl_sound& that, sound_manager& owner ) : sound(that.get_sound_name(), owner), m_sound(NULL), m_loader(NULL) { const Uint32 buffer_length( that.m_sound->alen ); m_raw_audio = new Uint8[buffer_length]; std::copy ( that.m_sound->abuf, that.m_sound->abuf + buffer_length, m_raw_audio ); m_sound = Mix_QuickLoad_RAW( m_raw_audio, buffer_length ); if (!m_sound) { delete[] m_raw_audio; throw claw::exception( Mix_GetError() ); } } // sdl_sound::sdl_sound() /*----------------------------------------------------------------------------*/ /** * \brief Destructor. */ bear::audio::sdl_sound::~sdl_sound() { ensure_loaded(); delete m_loader; Mix_FreeChunk( m_sound ); delete[] m_raw_audio; } // sdl_sound::~sdl_sound() /*----------------------------------------------------------------------------*/ /** * \brief Create a new sample of this sound. */ bear::audio::sample* bear::audio::sdl_sound::new_sample() { return new sdl_sample( *this, get_manager() ); } // sdl_sound::new_sample() /*----------------------------------------------------------------------------*/ /** * \brief Start to play the sound. * \param loops Number of loops, 0 for infinite. * \return The channel in which the sound is played. */ int bear::audio::sdl_sound::play( unsigned int loops ) const { ensure_loaded(); const int sdl_loops((int)loops - 1); const int channel = Mix_PlayChannel(-1, m_sound, sdl_loops); if (channel == -1) claw::logger << claw::log_warning << "sdl_sound::play(): " << Mix_GetError() << std::endl; return channel; } // sdl_sound::play() /*----------------------------------------------------------------------------*/ /** * \brief Initialize the SDL. */ bool bear::audio::sdl_sound::initialize() { bool result = false; if ( SDL_InitSubSystem(SDL_INIT_AUDIO) != 0 ) claw::logger << claw::log_error << SDL_GetError() << std::endl; else if ( Mix_OpenAudio(s_audio_rate, s_audio_format, s_audio_channels, s_audio_buffers) != 0 ) claw::logger << claw::log_error << Mix_GetError() << std::endl; else { result = true; Mix_AllocateChannels(s_audio_mix_channels); Mix_ChannelFinished(sdl_sample::channel_finished); } return result; } // sdl_sound::initialize() /*----------------------------------------------------------------------------*/ /** * \brief Close the SDL. */ void bear::audio::sdl_sound::release() { SDL_QuitSubSystem(SDL_INIT_AUDIO); } // sdl_sound::release() /*----------------------------------------------------------------------------*/ /** * \brief Get the format of the output audio stream. */ unsigned int bear::audio::sdl_sound::get_audio_format() { return s_audio_format; } // sdl_sound::get_audio_format() /*----------------------------------------------------------------------------*/ /** * \brief Loads the sound from a given data. * \param buffer The buffer from which the sound is read. It will be deleted by * the end of the call. * \param buffer_length The length of buffer. */ void bear::audio::sdl_sound::load_sound ( char* buffer, std::size_t buffer_length ) { SDL_RWops* rw( SDL_RWFromMem(buffer, buffer_length) ); if (rw) m_sound = Mix_LoadWAV_RW( rw, 1 ); delete[] buffer; if (!m_sound) { claw::logger << claw::log_error << Mix_GetError() << std::endl; throw claw::exception( Mix_GetError() ); } } // sdl_sound::load_sound() /*----------------------------------------------------------------------------*/ /** * \brief Ensures the sound has been fully loaded. The function will force the * loading to finish if the sound has not been loaded yet. */ void bear::audio::sdl_sound::ensure_loaded() const { if ( m_loader == NULL ) return; m_loader->join(); } // sdl_sound::ensure_loaded() plee-the-bear-20251226/bear-engine/core/src/audio/code/sound.cpp000066400000000000000000000036541512343254000241420ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::audio::sound class. * \author Julien Jorge */ #include "audio/sound.hpp" #include "audio/sound_manager.hpp" #include "audio/sample.hpp" #include /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param name The name of the sound resource. * \param owner The instance of sound_manager who stores me. */ bear::audio::sound::sound( const std::string& name, sound_manager& owner ) : m_owner(owner), m_name(name) { } // sound::sound() /*----------------------------------------------------------------------------*/ /** * \brief Destructor. */ bear::audio::sound::~sound() { } // sound::~sound() /*----------------------------------------------------------------------------*/ /** * \brief Create a new sample of this sound. */ bear::audio::sample* bear::audio::sound::new_sample() { return new sample( get_sound_name(), get_manager() ); } // sound::play() /*----------------------------------------------------------------------------*/ /** * \brief Get the sound_manager who owns this sound. */ bear::audio::sound_manager& bear::audio::sound::get_manager() { return m_owner; } // sound::get_manager() /*----------------------------------------------------------------------------*/ /** * \brief Get the sound_manager who owns this sound. */ const bear::audio::sound_manager& bear::audio::sound::get_manager() const { return m_owner; } // sound::get_manager() /*----------------------------------------------------------------------------*/ /** * \brief Get the name of the sound resource. */ const std::string& bear::audio::sound::get_sound_name() const { return m_name; } // sound::get_sound_name() plee-the-bear-20251226/bear-engine/core/src/audio/code/sound_effect.cpp000066400000000000000000000124261512343254000254530ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::audio::sound_effect class. * \author Julien Jorge */ #include "audio/sound_effect.hpp" #include /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * * Defaults values are : * - volume = 1 * - loops = 1 * - no position */ bear::audio::sound_effect::sound_effect() : m_volume(1), m_loops(1), m_position(NULL) { } // sound_effect::sound_effect() /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param volume The volume of the sound. */ bear::audio::sound_effect::sound_effect( double volume ) : m_volume(volume), m_loops(1), m_position(NULL) { if ( m_volume < 0 ) m_volume = 0; else if ( m_volume > 1 ) m_volume = 1; } // sound_effect::sound_effect() /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param loops Set the number of loops. 0 means infinite. * \param volume The volume of the sound. Will be croped in [0, 1]. */ bear::audio::sound_effect::sound_effect( unsigned int loops, double volume ) : m_volume(volume), m_loops(loops), m_position(NULL) { if ( m_volume < 0 ) m_volume = 0; else if ( m_volume > 1 ) m_volume = 1; } // sound_effect::sound_effect() /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param pos The position from which the sound is emitted. */ bear::audio::sound_effect::sound_effect ( const claw::math::coordinate_2d& pos ) : m_volume(1), m_loops(1), m_position( new claw::math::coordinate_2d(pos) ) { } // sound_effect::sound_effect() /*----------------------------------------------------------------------------*/ /** * \brief Copy constructor. * \param that The instance to copy from. */ bear::audio::sound_effect::sound_effect( const sound_effect& that ) : m_volume(that.m_volume), m_loops(that.m_loops), m_position(NULL) { if ( that.has_a_position() ) m_position = new claw::math::coordinate_2d( that.get_position() ); } // sound_effect::sound_effect() /*----------------------------------------------------------------------------*/ /** * \brief Destructor. */ bear::audio::sound_effect::~sound_effect() { delete m_position; } // sound_effect::~sound_effect() /*----------------------------------------------------------------------------*/ /** * \brief Assignment. * \param that The instance to copy from. */ bear::audio::sound_effect& bear::audio::sound_effect::operator=( const sound_effect& that ) { if ( this != &that ) { delete m_position; m_position = NULL; m_volume = that.m_volume; m_loops = that.m_loops; if ( that.has_a_position() ) m_position = new claw::math::coordinate_2d ( that.get_position() ); } return *this; } // sound_effect::operator=() /*----------------------------------------------------------------------------*/ /** * \brief Set the volume value. * \param volume The volume. Will be croped in [0, 1]. */ void bear::audio::sound_effect::set_volume( double volume ) { m_volume = volume; if ( m_volume < 0 ) m_volume = 0; else if ( m_volume > 1 ) m_volume = 1; } // sound_effect::set_volume() /*----------------------------------------------------------------------------*/ /** * \brief Get volume value. */ double bear::audio::sound_effect::get_volume() const { return m_volume; } // sound_effect::get_volume() /*----------------------------------------------------------------------------*/ /** * \brief Set the number of loops. * \param loops The number of loops. A value of 0 means infinite. */ void bear::audio::sound_effect::set_loops( unsigned int loops ) { m_loops = loops; } // sound_effect::set_loops() /*----------------------------------------------------------------------------*/ /** * \brief Get the number of loops. * \remark See set_loops for a detailed explanation of the meaning of the * values. */ int bear::audio::sound_effect::get_loops() const { return m_loops; } // sound_effect::get_loops() /*----------------------------------------------------------------------------*/ /** * \brief Tell if the effect has a position. */ bool bear::audio::sound_effect::has_a_position() const { return m_position != NULL; } // sound_effect::has_a_position() /*----------------------------------------------------------------------------*/ /** * \brief Set the position. * \param pos The new position. */ void bear::audio::sound_effect::set_position ( const claw::math::coordinate_2d& pos ) { if (m_position != NULL) *m_position = pos; else m_position = new claw::math::coordinate_2d(pos); } // sound_effect::set_position() /*----------------------------------------------------------------------------*/ /** * \brief Get the position. * \pre has_a_position() == true. */ const claw::math::coordinate_2d& bear::audio::sound_effect::get_position() const { CLAW_PRECOND( has_a_position() ); return *m_position; } // sound_effect::get_position() plee-the-bear-20251226/bear-engine/core/src/audio/code/sound_manager.cpp000066400000000000000000000413131512343254000256260ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the sound_manager class. * \author Julien Jorge */ #include "audio/sound_manager.hpp" #include "audio/sdl_sound.hpp" #include "audio/sample.hpp" #include #include #include #include /*----------------------------------------------------------------------------*/ bool bear::audio::sound_manager::s_initialized = false; /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ bear::audio::sound_manager::sound_manager() : m_ears_position(0, 0), m_current_music(NULL), m_sound_volume(1), m_music_volume(1), m_silence_distance(1200), m_full_volume_distance(200), m_distance_unit(1) { } // sound_manager::sound_manager() /*----------------------------------------------------------------------------*/ /** * \brief Destructor. */ bear::audio::sound_manager::~sound_manager() { clear(); } // sound_manager::~sound_manager() /*----------------------------------------------------------------------------*/ /** * \brief Delete all sounds and musics. If a music is playing, she will be * stopped * \post m_sounds.empty == true. */ void bear::audio::sound_manager::clear() { stop_all(); std::map::iterator it; for (it=m_sounds.begin(); it!=m_sounds.end(); ++it) delete it->second; m_samples.clear(); m_sounds.clear(); m_muted_musics.clear(); } // sound_manager::clear() /*----------------------------------------------------------------------------*/ /** * \brief Add a sound to the cache. * \param name The name of the sound. * \param file A stream containing the sound. * \pre name is not used by another sound. */ void bear::audio::sound_manager::load_sound ( const std::string& name, std::istream& file ) { CLAW_PRECOND( !sound_exists(name) ); if (s_initialized) m_sounds[name] = new sdl_sound(file, name, *this); else m_sounds[name] = new sound(name, *this); } // sound_manager::load_sound() /*----------------------------------------------------------------------------*/ /** * \brief Adds a copy of a sound from another cache into this one. * \param name The name of the sound. * \param source The cache from which the sound is copied. * \pre name is not used by another sound and source.sound_exists(name) is true. */ void bear::audio::sound_manager::copy_sound ( const std::string& name, const sound_manager& source ) { CLAW_PRECOND( !sound_exists(name) ); CLAW_PRECOND( source.sound_exists(name) ); if (s_initialized) { sound* const ref( source.m_sounds.find(name)->second ); m_sounds[name] = new sdl_sound( *dynamic_cast(ref), *this); } else m_sounds[name] = new sound(name, *this); } // sound_manager::copy_sound() /*----------------------------------------------------------------------------*/ /** * \brief Start to play a sound. * \param name The name of the sound to play. */ void bear::audio::sound_manager::play_sound( const std::string& name ) { CLAW_PRECOND( sound_exists(name) ); sample* s = m_sounds[name]->new_sample(); m_samples[s] = true; s->play(); } // sound_manager::play_sound() /*----------------------------------------------------------------------------*/ /** * \brief Start to play the sound, with an effect. * \param name The name of the sound to play. * \param effect The effect applied to the sound. */ void bear::audio::sound_manager::play_sound ( const std::string& name, const sound_effect& effect ) { CLAW_PRECOND( sound_exists(name) ); sample* s = m_sounds[name]->new_sample(); m_samples[s] = true; s->play( effect ); } // sound_manager::play_sound() /*----------------------------------------------------------------------------*/ /** * \brief Get a sound sample. * \param name The name of the sound to get. * \pre There is an sound called "name". * \remark You are responsible of deleting the sample. */ bear::audio::sample* bear::audio::sound_manager::new_sample( const std::string& name ) { CLAW_PRECOND( sound_exists(name) ); sample* result = m_sounds[name]->new_sample(); m_samples[result] = false; return result; } // sound_manager::new_sample() /*----------------------------------------------------------------------------*/ /** * \brief Get a copy of a sound sample. * \param s The sample to copy. * \remark You are responsible of deleting the sample. */ bear::audio::sample* bear::audio::sound_manager::new_sample( const sample& s ) { return new_sample(s.get_sound_name()); } // sound_manager::new_sample() /*----------------------------------------------------------------------------*/ /** * \brief Play a music. * \param name The name of the music to play. * \param loops How many times the music loops (zero means infinite). * \pre There is a sound called "name". * \return The identifier of the music. */ std::size_t bear::audio::sound_manager::play_music (const std::string& name, unsigned int loops) { CLAW_PRECOND( sound_exists(name) ); if (m_current_music != NULL) { sound_effect e(m_current_music->get_effect()); m_muted_musics.push_front( muted_music_data(m_current_music, e) ); e.set_volume(0); m_current_music->set_effect(e); } m_current_music = m_sounds[name]->new_sample(); // Calling m_current_music->play() may stop immediately if there is no sound // card or if the sound is empty. Consequently, m_current_music will be erased // and made NULL. So we must store the id now to return something to the // caller. std::size_t result = m_current_music->get_id(); m_samples[m_current_music] = true; sound_effect e(loops); m_current_music->play(e); return result; } // sound_manager::play_music() /*----------------------------------------------------------------------------*/ /** * \brief Stop a music. * \param id The identifier of the music. * \param fadeout The duration of the fadeout, if any. */ void bear::audio::sound_manager::stop_music( std::size_t id, double fadeout ) { sample* m(NULL); if ( m_current_music != NULL ) if ( m_current_music->get_id() == id ) m = m_current_music; muted_music_list::const_iterator it; for (it=m_muted_musics.begin(); (m==NULL) && (it!=m_muted_musics.end()); ++it) if (it->first->get_id() == id ) m = it->first; if ( m != NULL ) // calls sample_finished() m->stop(fadeout); } // sound_manager::stop_music() /*----------------------------------------------------------------------------*/ /** * \brief Stop all musics, including muted ones. * \param fadeout The duration of the fadeout, if any. */ void bear::audio::sound_manager::stop_all_musics( double fadeout ) { muted_music_list::iterator it = m_muted_musics.begin(); while ( it != m_muted_musics.end() ) { muted_music_list::iterator tmp(it); ++it; // calls sample_finished() it->first->stop( fadeout ); } if ( m_current_music != NULL ) m_current_music->stop( fadeout ); } // sound_manager::stop_all_musics() /*----------------------------------------------------------------------------*/ /** * \brief Set the position of the ears. * \param position The new position. */ void bear::audio::sound_manager::set_ears_position ( const claw::math::coordinate_2d& position ) { m_ears_position = position; } // sound_manager::set_ears_position() /*----------------------------------------------------------------------------*/ /** * \brief Get the position of the ears. */ const claw::math::coordinate_2d& bear::audio::sound_manager::get_ears_position() const { return m_ears_position; } // sound_manager::get_ears_position() /*----------------------------------------------------------------------------*/ /** * \brief Set the volume of the sound. * \param v The new volume. * \pre 0 <= v <= 1 */ void bear::audio::sound_manager::set_sound_volume( double v ) { CLAW_PRECOND( v >= 0 ); CLAW_PRECOND( v <= 1 ); m_sound_volume = v; std::map::iterator it; for ( it=m_samples.begin(); it!=m_samples.end(); ++it ) if ( !is_music(it->first) ) it->first->set_volume(m_sound_volume); } // sound_manager::set_sound_volume() /*----------------------------------------------------------------------------*/ /** * \brief Set the volume of the music. * \param v The new volume. * \pre 0 <= v <= 1 */ void bear::audio::sound_manager::set_music_volume( double v ) { CLAW_PRECOND( v >= 0 ); CLAW_PRECOND( v <= 1 ); m_music_volume = v; if (m_current_music != NULL) m_current_music->set_volume(m_music_volume); } // sound_manager::set_music_volume() /*----------------------------------------------------------------------------*/ /** * \brief Get the volume of the sound. */ double bear::audio::sound_manager::get_sound_volume() const { return m_sound_volume; } // sound_manager::get_sound_volume() /*----------------------------------------------------------------------------*/ /** * \brief Get the volume of the music. */ double bear::audio::sound_manager::get_music_volume() const { return m_music_volume; } // sound_manager::get_music_volume() /*----------------------------------------------------------------------------*/ /** * \brief Get the adequate volume for a sample. * \param s The sample. * \return The music volume or the sound volume, according to the type of \a s. */ double bear::audio::sound_manager::get_volume( const sample* s ) const { if ( s == m_current_music ) return get_music_volume(); else return get_sound_volume(); } // sound_manager::get_volume() /*----------------------------------------------------------------------------*/ /** * \brief Tell if a sound is in the cache. */ bool bear::audio::sound_manager::sound_exists(const std::string& name) const { return m_sounds.find(name) != m_sounds.end(); } // sound_manager::sound_exists() /*----------------------------------------------------------------------------*/ /** * \brief Inform the manager that a sample is finished. If the sample is managed * by the manager, it will be deleted. */ void bear::audio::sound_manager::sample_finished( sample* s ) { std::map::iterator it; bool do_delete(false); it = m_samples.find(s); if ( it==m_samples.end() ) do_delete = it->second; if ( do_delete ) delete s; // will call sample_deleted() if ( s == m_current_music ) { if ( m_muted_musics.empty() ) m_current_music = NULL; else { m_current_music = m_muted_musics.front().first; m_current_music->set_effect( m_muted_musics.front().second ); m_muted_musics.pop_front(); } } else remove_muted_music(s); } // sound_manager::sample_finished() /*----------------------------------------------------------------------------*/ /** * \brief Inform the manager that a sample is deleted. The sample is removed * from the set of samples. */ void bear::audio::sound_manager::sample_deleted( sample* s ) { m_samples.erase(s); } // sound_manager::sample_finished() /*----------------------------------------------------------------------------*/ /** * \brief Stop all musics and sounds. */ void bear::audio::sound_manager::stop_all() { // some samples can be removed from m_samples when calling sample::stop(). // avoir looping on a map that changes. std::map::iterator it_s; std::vector s; s.reserve( m_samples.size() ); for ( it_s=m_samples.begin(); it_s!=m_samples.end(); ++it_s ) s.push_back(it_s->first); for (unsigned int i=0; i!=s.size(); ++i) s[i]->stop(); CLAW_POSTCOND(m_current_music == NULL); } // sound_manager::stop_all() /*----------------------------------------------------------------------------*/ /** * \brief Pause all musics and sounds. */ void bear::audio::sound_manager::pause_all() { std::map::iterator it; for ( it=m_samples.begin(); it!=m_samples.end(); ++it ) it->first->pause(); } // sound_manager::pause_all() /*----------------------------------------------------------------------------*/ /** * \brief Resume all musics and sounds. */ void bear::audio::sound_manager::resume_all() { std::map::iterator it; for ( it=m_samples.begin(); it!=m_samples.end(); ++it ) it->first->resume(); } // sound_manager::resume_all() /*----------------------------------------------------------------------------*/ /** * \brief Initialize the sound system. */ void bear::audio::sound_manager::initialize() { s_initialized = sdl_sound::initialize(); } // sound_manager::initialize() /*----------------------------------------------------------------------------*/ /** * \brief Close the sound system. */ void bear::audio::sound_manager::release() { sdl_sound::release(); s_initialized = false; } // sound_manager::release() /*----------------------------------------------------------------------------*/ /** * \brief Remove a music from m_muted_musics. * \param m The music to remove. */ void bear::audio::sound_manager::remove_muted_music( sample* m ) { muted_music_list::iterator it(m_muted_musics.begin()); bool found(false); while ( !found && (it!=m_muted_musics.end()) ) if ( it->first == m ) found = true; else ++it; if (found) m_muted_musics.erase(it); } // sound_manager::remove_muted_music() /*----------------------------------------------------------------------------*/ /** * \brief Tell if a sample is used as a music. */ bool bear::audio::sound_manager::is_music( const sample* m ) const { bool result( m == m_current_music ); muted_music_list::const_iterator it; for ( it=m_muted_musics.begin(); !result && (it!=m_muted_musics.end()); ++it ) result = (it->first == m); return result; } // sound_manager::is_music() /*----------------------------------------------------------------------------*/ /** * \brief Sets the distance under which sounds are at maximum volume. * \param d The distance. */ void bear::audio::sound_manager::set_full_volume_distance( double d ) { m_full_volume_distance = std::max( 0.0, d ); if ( m_full_volume_distance > m_silence_distance ) m_silence_distance = m_full_volume_distance; } // sound_manager::set_full_volume_distance() /*----------------------------------------------------------------------------*/ /** * \brief Returns the distance under which sounds are at maximum volume. */ double bear::audio::sound_manager::get_full_volume_distance() const { return m_full_volume_distance; } // sound_manager::get_full_volume_distance() /*----------------------------------------------------------------------------*/ /** * \brief Sets the distance from which we can't hear a sound. * \param d The distance. */ void bear::audio::sound_manager::set_silence_distance( double d ) { m_silence_distance = std::max( 0.0, d ); if ( m_silence_distance < m_full_volume_distance ) m_full_volume_distance = m_silence_distance; } // sound_manager::set_silence_distance() /*----------------------------------------------------------------------------*/ /** * \brief Returns the distance from which we can't hear a sound. */ double bear::audio::sound_manager::get_silence_distance() const { return m_silence_distance; } // sound_manager::get_silence_distance() /*----------------------------------------------------------------------------*/ /** * \brief Sets the unit of the measures applied in the computation of the * distances for the sound effects. * \param d The unit. * \remark The function has no effect if d <= 0; */ void bear::audio::sound_manager::set_distance_unit( double d ) { if ( d > 0 ) m_distance_unit = d; } // sound_manager::set_distance_unit() /*----------------------------------------------------------------------------*/ /** * \brief Returns the unit of the measures applied in the computation of the * distances for the sound effects. */ double bear::audio::sound_manager::get_distance_unit() const { return m_distance_unit; } // sound_manager::get_distance_unit() /*----------------------------------------------------------------------------*/ /** * \brief Computes the tone down at a given distance of the ears. * \param d The distance. * \returns A value between zero and one representing the percent of the volume. */ double bear::audio::sound_manager::get_volume_for_distance( double d ) const { double result; const double distance( d / get_distance_unit() ); if ( distance <= get_full_volume_distance() ) result = 1; else if ( get_silence_distance() <= distance ) result = 0; else result = 1.0 - ( distance - get_full_volume_distance() ) / ( get_silence_distance() - get_full_volume_distance() ); return result; } // sound_manager::get_volume_for_distance() plee-the-bear-20251226/bear-engine/core/src/audio/sample.hpp000066400000000000000000000037361512343254000233670ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A class representing a sound sample. * \author Julien Jorge */ #ifndef __AUDIO_SAMPLE_HPP__ #define __AUDIO_SAMPLE_HPP__ #include "audio/sound_effect.hpp" #include "audio/class_export.hpp" #include #include #include namespace bear { namespace audio { class sound_manager; /** * \brief A class representing a sound. */ class AUDIO_EXPORT sample: public claw::pattern::non_copyable { public: explicit sample( const std::string& name ); sample( const std::string& name, sound_manager& owner ); virtual ~sample(); sample* clone() const; std::size_t get_id() const; const std::string& get_sound_name() const; virtual void play(); virtual void play( const sound_effect& effect ); virtual void pause(); virtual void resume(); virtual void stop(); virtual void stop( double d ); virtual sound_effect get_effect() const; virtual void set_effect( const sound_effect& effect ); /* for sound_manager only. */ virtual void set_volume( double v ); bool is_playing() const; protected: void sample_finished(); void set_playing(); private: /** \brief The sound of which we are a sample. */ sound_manager* m_manager; /** \brief The identifier of the sound. */ const std::size_t m_id; /** \brief The name of the sound resource. */ const std::string& m_name; /** \brief Tells if this sample is currently playing. */ bool m_is_playing; /** \brief The next available identifier. */ static std::size_t s_next_id; }; // class sample } // namespace audio } // namespace bear #endif // __AUDIO_SAMPLE_HPP__ plee-the-bear-20251226/bear-engine/core/src/audio/sdl_sample.hpp000066400000000000000000000054361512343254000242300ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A class representing a sound sample. This class uses the SDL_mixer * library. * \author Julien Jorge */ #ifndef __AUDIO_SDL_SAMPLE_HPP__ #define __AUDIO_SDL_SAMPLE_HPP__ #include "audio/sample.hpp" #include "audio/class_export.hpp" #include namespace bear { namespace audio { class sdl_sound; /** * \brief A class representing a sound sample. */ class AUDIO_EXPORT sdl_sample: public sample { private: /** * \brief Informations stored in the s_playing_channels vector. */ class AUDIO_EXPORT channel_attribute { public: channel_attribute(); ~channel_attribute(); void set_sample( const sdl_sample& s ); const sdl_sample& get_sample() const; void set_effect( const sound_effect& effect ); const sound_effect& get_effect() const; void clear(); bool is_empty() const; private: /** \brief The sample in this channel. */ const sdl_sample* m_sample; /** \brief The effect applied to the sound. */ sound_effect m_effect; }; // class channel_attribute public: sdl_sample( const sdl_sound& s, sound_manager& owner ); ~sdl_sample(); void play(); void play( const sound_effect& effect ); void pause(); void resume(); void stop(); void stop( double d ); sound_effect get_effect() const; void set_effect( const sound_effect& effect ); /* for sound_manager only. */ void set_volume( double v ); static void channel_finished(int channel); private: static void distance_tone_down ( int channel, void *stream, int length, void *position ); static void balance ( int channel, void *stream, int length, void *position ); static void volume ( int channel, void *stream, int length, void *position ); void inside_play(); void stop_sample(); void inside_set_effect(); void global_add_channel(); void finished(); private: /** \brief The channel in which this sample is played. */ int m_channel; /** \brief The sound of which we are a sample. */ const sdl_sound* m_sound; /** \brief The effects applied to the sample, by default. */ sound_effect m_effect; /** \brief Global vector giving, for a channel, the sample currently played. */ static std::vector s_playing_channels; }; // class sdl_sample } // namespace audio } // namespace bear #endif // __AUDIO_SDL_SAMPLE_HPP__ plee-the-bear-20251226/bear-engine/core/src/audio/sdl_sound.hpp000066400000000000000000000037661512343254000241030ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A class representing a sound. This class uses the SDL_mixer library. * \author Julien Jorge */ #ifndef __AUDIO_SDL_SOUND_HPP__ #define __AUDIO_SDL_SOUND_HPP__ #include "audio/sound.hpp" #include #include #include #include "audio/class_export.hpp" namespace bear { namespace audio { class sound_manager; /** * \brief A class representing a sound. */ class AUDIO_EXPORT sdl_sound: public sound { public: sdl_sound ( std::istream& file, const std::string& name, sound_manager& owner ); sdl_sound( const sdl_sound& that, sound_manager& owner ); ~sdl_sound(); sample* new_sample(); int play( unsigned int loops ) const; static bool initialize(); static void release(); static unsigned int get_audio_format(); private: void load_sound( char* buffer, std::size_t buffer_length ); void ensure_loaded() const; private: /** \brief The sound allocated by SDL_mixer. */ Mix_Chunk* m_sound; /** \brief The thread loading the sound. */ boost::thread* m_loader; /** \brief The raw audio data passed to the SDL mixer functions, eventually. */ Uint8* m_raw_audio; /** \brief Output audio rate. */ static unsigned int s_audio_rate; /** \brief Output audio format. */ static unsigned int s_audio_format; /** \brief Number of channels. */ static unsigned int s_audio_channels; /** \brief Size of the buffer. */ static unsigned int s_audio_buffers; /** \brief Count of channels for mixing. */ static unsigned int s_audio_mix_channels; }; // class sdl_sound } // namespace audio } // namespace bear #endif // __AUDIO_SDL_SOUND_HPP__ plee-the-bear-20251226/bear-engine/core/src/audio/sound.hpp000066400000000000000000000021631512343254000232270ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A class representing a sound. * \author Julien Jorge */ #ifndef __AUDIO_SOUND_HPP__ #define __AUDIO_SOUND_HPP__ #include "audio/sound_manager.hpp" #include "audio/class_export.hpp" namespace bear { namespace audio { class sample; class sound_manager; /** * \brief A class representing a sound. */ class AUDIO_EXPORT sound { public: sound( const std::string& name, sound_manager& owner ); virtual ~sound(); virtual sample* new_sample(); sound_manager& get_manager(); const sound_manager& get_manager() const; const std::string& get_sound_name() const; private: /** \brief The sound_manager who stores me. */ sound_manager& m_owner; /** \brief The name of the sound resource. */ const std::string m_name; }; // class sound } // namespace audio } // namespace bear #endif // __AUDIO_SOUND_HPP__ plee-the-bear-20251226/bear-engine/core/src/audio/sound_effect.hpp000066400000000000000000000032141512343254000245410ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Basic class for basic not progressive sounds effects. * \author Julien Jorge */ #ifndef __AUDIO_SOUND_EFFECT_HPP__ #define __AUDIO_SOUND_EFFECT_HPP__ #include #include "audio/class_export.hpp" namespace bear { namespace audio { /** * \brief Basic class for basic not progressive sounds effects. */ class AUDIO_EXPORT sound_effect { public: sound_effect(); explicit sound_effect( double volume ); explicit sound_effect( unsigned int loops, double volume = 1 ); explicit sound_effect( const claw::math::coordinate_2d& pos ); sound_effect( const sound_effect& that ); ~sound_effect(); sound_effect& operator=( const sound_effect& that ); void set_volume( double volume ); double get_volume() const; void set_loops( unsigned int loops ); int get_loops() const; bool has_a_position() const; void set_position( const claw::math::coordinate_2d& pos ); const claw::math::coordinate_2d& get_position() const; private: /** \brief Sound volume, in [0, 1]. */ double m_volume; /** \brief Number of loops (added to a first default play). */ int m_loops; /** \brief The position, if any. */ claw::math::coordinate_2d* m_position; }; // class sound_effect } // namespace audio } // namespace bear #endif // __AUDIO_SOUND_EFFECT_HPP__ plee-the-bear-20251226/bear-engine/core/src/audio/sound_manager.hpp000066400000000000000000000076301512343254000247250ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A class to manage sound resources. * \author Julien Jorge */ #ifndef __AUDIO_SOUND_MANAGER_HPP__ #define __AUDIO_SOUND_MANAGER_HPP__ #include #include #include #include #include #include "audio/class_export.hpp" namespace bear { namespace audio { class sample; class sound; class sound_effect; /** * \brief A class to manage sound resources. * \author Julien Jorge */ class AUDIO_EXPORT sound_manager { private: /** \brief The information stored when muting a music. */ typedef std::pair muted_music_data; /** \brief The list of musics muted by the current music. */ typedef std::list muted_music_list; public: sound_manager(); ~sound_manager(); void clear(); void load_sound( const std::string& name, std::istream& file ); void copy_sound( const std::string& name, const sound_manager& source ); void play_sound( const std::string& name ); void play_sound( const std::string& name, const sound_effect& effect ); sample* new_sample( const std::string& name ); sample* new_sample( const sample& s ); std::size_t play_music( const std::string& name, unsigned int loops ); void stop_music( std::size_t id, double fadeout = 0 ); void stop_all_musics( double fadeout = 0 ); void set_ears_position( const claw::math::coordinate_2d& position ); const claw::math::coordinate_2d& get_ears_position() const; void set_sound_volume( double v ); void set_music_volume( double v ); double get_sound_volume() const; double get_music_volume() const; double get_volume( const sample* s ) const; bool sound_exists( const std::string& name ) const; void sample_finished( sample* s ); void sample_deleted( sample* s ); void pause_all(); void resume_all(); void stop_all(); void set_full_volume_distance( double d ); double get_full_volume_distance() const; void set_silence_distance( double d ); double get_silence_distance() const; void set_distance_unit( double d ); double get_distance_unit() const; double get_volume_for_distance( double d ) const; static void initialize(); static void release(); private: void remove_muted_music( sample* m ); bool is_music( const sample* m ) const; private: /** \brief All sounds. */ std::map m_sounds; /** \brief Ears position. */ claw::math::coordinate_2d m_ears_position; /** \brief The samples currently played and the boolean telling if they are managed or not. */ std::map m_samples; /** \brief The music currently played. */ sample* m_current_music; /** \brief The musics muted by the current music. */ muted_music_list m_muted_musics; /** \brief The volume of the sounds, in [0, 1]. */ double m_sound_volume; /** \brief The volume of the music, in [0, 1]. */ double m_music_volume; /** \brief Distance from which we can't hear a sound. */ double m_silence_distance; /** \brief Distance under which sounds are at maximum volume. */ double m_full_volume_distance; /** \brief The unit of the measures applied in the computation of the distances for the sound effects. */ double m_distance_unit; /** \brief Tell if the sound system is initialized. */ static bool s_initialized; }; // class sound_manager } // namespace audio } // namespace bear #endif // __AUDIO_SOUND_MANAGER_HPP__ plee-the-bear-20251226/bear-engine/core/src/bear_gettext.hpp000066400000000000000000000007351512343254000234560ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Macro to call gettext on the bear-engine text domain. * \author Julien Jorge */ #ifndef __BEAR_GETTEXT_HPP__ #define __BEAR_GETTEXT_HPP__ #include #define bear_gettext(s) dgettext( "bear-engine", (s) ) #endif // __BEAR_GETTEXT_HPP__ plee-the-bear-20251226/bear-engine/core/src/charset/000077500000000000000000000000001512343254000217145ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/core/src/charset/def.hpp000066400000000000000000000026461512343254000231730ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Various types to use for strings and unicode. * \author Julien Jorge */ #ifndef __CHARSET_DEF_HPP__ #define __CHARSET_DEF_HPP__ #include #include namespace bear { namespace charset { /** \brief Unicode character type. */ typedef wchar_t char_type; /** \brief Unicode string. */ typedef std::wstring string_type; /** * \brief Converts a given multibyte string into a charset::string_type. * \param s The string to convert. */ inline string_type convert_string( const std::string& s ) { // This buffer will receive the result of the conversion of input_text to // a wide char string. The size is computed under the assumption that // Unicode allows up to 4 bytes per character. char_type* const wide_text( new char_type[ 4 * s.size() + 1 ] ); const std::size_t string_length ( std::mbstowcs( wide_text, s.c_str(), s.size() ) ); string_type result; if ( string_length != std::size_t( -1 ) ) result = string_type( wide_text, wide_text + string_length ); delete[] wide_text; return result; } } // namespace charset } // namespace bear #endif // __CHARSET_DEF_HPP__ plee-the-bear-20251226/bear-engine/core/src/communication/000077500000000000000000000000001512343254000231305ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/core/src/communication/CMakeLists.txt000066400000000000000000000012531512343254000256710ustar00rootroot00000000000000set( COMMUNICATION_TARGET_NAME bear_communication ) #------------------------------------------------------------------------------- set( COMMUNICATION_SOURCE_FILES code/post_office.cpp code/message.cpp code/messageable.cpp ) add_library( ${COMMUNICATION_TARGET_NAME} ${BEAR_ENGINE_CORE_LINK_TYPE} ${COMMUNICATION_SOURCE_FILES} ) set_target_properties( ${COMMUNICATION_TARGET_NAME} PROPERTIES INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/${BEAR_ENGINE_INSTALL_LIBRARY_DIR}" ) install( TARGETS ${COMMUNICATION_TARGET_NAME} DESTINATION ${BEAR_ENGINE_INSTALL_LIBRARY_DIR} ) target_link_libraries( ${COMMUNICATION_TARGET_NAME} ${CLAW_LOGGER_LIBRARIES} ) plee-the-bear-20251226/bear-engine/core/src/communication/class_export.hpp000066400000000000000000000015511512343254000263510ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Definition of the COMMUNICATION_EXPORT macro according to the fact * that we create the library or link to it. * \author Julien Jorge */ #ifndef __COMMUNICATION_CLASS_EXPORT_HPP__ #define __COMMUNICATION_CLASS_EXPORT_HPP__ #ifndef COMMUNICATION_EXPORT # ifdef _WIN32 # ifdef bear_communication_EXPORTS # define COMMUNICATION_EXPORT __declspec(dllexport) # else # define COMMUNICATION_EXPORT __declspec(dllimport) # endif // def bear_communication_EXPORTS # else // def _WIN32 # define COMMUNICATION_EXPORT # endif // def _WIN32 #endif // ndef COMMUNICATION_EXPORT #endif // __COMMUNICATION_CLASS_EXPORT_HPP__ plee-the-bear-20251226/bear-engine/core/src/communication/code/000077500000000000000000000000001512343254000240425ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/core/src/communication/code/message.cpp000066400000000000000000000010451512343254000261720ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::communication::message class. * \author Julien Jorge */ #include "communication/message.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Destructor. */ bear::communication::message::~message() { // nothing to do } // message::~message() plee-the-bear-20251226/bear-engine/core/src/communication/code/messageable.cpp000066400000000000000000000101311512343254000270120ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::communication::messageable class. * \author Julien Jorge */ #include "communication/messageable.hpp" #include "communication/post_office.hpp" #include /*---------------------------------------------------------------------------*/ /** * \brief Constructor. */ bear::communication::messageable::messageable() : m_name(post_office::no_name) { } // messageable::messageable() /*---------------------------------------------------------------------------*/ /** * \brief Constructor. * \param name The name of this item. */ bear::communication::messageable::messageable( const std::string& name ) : m_name(name) { } // messageable::messageable() /*---------------------------------------------------------------------------*/ /** * \brief Copy constructor. * \param that The instance to copy from. * * The new instance has no name. */ bear::communication::messageable::messageable( const messageable& that ) : super(that), m_name(post_office::no_name) { } // messageable::messageable() /*---------------------------------------------------------------------------*/ /** * \brief Destructor. */ bear::communication::messageable::~messageable() { } // messageable::~messageable() /*---------------------------------------------------------------------------*/ /** * \brief Set/change the name of the item. */ void bear::communication::messageable::set_name(const std::string& name) { m_name = name; } // messageable::set_name() /*---------------------------------------------------------------------------*/ /** * \brief Get the name of the item. */ const std::string& bear::communication::messageable::get_name() const { return m_name; } // messageable::get_name() /*---------------------------------------------------------------------------*/ /** * \brief Add a message in the message queue. * \param msg The message to enqueue. */ void bear::communication::messageable::post_message(message& msg) { message* m = &msg; register_item( m ); } // messageable::post_message() /*---------------------------------------------------------------------------*/ /** * \brief Immediatly process a message. * \param msg The message to process. * \return true if the message has been proceded. */ bool bear::communication::messageable::send_message(message& msg) { return process_message( msg ); } // messageable::send_message() /*---------------------------------------------------------------------------*/ /** * \brief Process all messages in queue. */ void bear::communication::messageable::process_messages() { CLAW_PRECOND( !locked() ); std::list::iterator it; lock(); for (it=m_message_queue.begin(); it!=m_message_queue.end(); ++it) process_message(**it); m_message_queue.clear(); unlock(); } // messageable::process_messages() /*---------------------------------------------------------------------------*/ /** * \brief Process one message. * \remark You should specialize this method. * \return true if the message has been proceded. */ bool bear::communication::messageable::process_message(message& msg) { return msg.apply_to(*this); } // messageable::process_message() /*---------------------------------------------------------------------------*/ /** * \brief Enqueue a message. * \param who The message to add. */ void bear::communication::messageable::add( message* const& who ) { m_message_queue.push_back( who ); } // messageable::messageable::add() /*---------------------------------------------------------------------------*/ /** * \brief Should remove a message from the queue but do nothing. * \param who The message that should be removed. * \remark This method shouldn't be called. */ void bear::communication::messageable::remove( message* const& who ) { claw::logger << claw::log_warning << "messageable::remove(): souldn't be called." << std::endl; } // messageable::remove() plee-the-bear-20251226/bear-engine/core/src/communication/code/post_office.cpp000066400000000000000000000075161512343254000270570ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::communication::post_office class. * \author Julien Jorge */ #include "communication/post_office.hpp" #include "communication/message.hpp" #include "communication/messageable.hpp" #include #include /*---------------------------------------------------------------------------*/ const std::string bear::communication::post_office::no_name; /*---------------------------------------------------------------------------*/ /** * \brief Immediately send a message to an item. * \param target The name of the item receiving the message. * \param msg The message to send. * \return true if the message has been proceded. */ bool bear::communication::post_office::send_message ( const std::string& target, message& msg ) const { CLAW_PRECOND( target != no_name ); std::map::const_iterator it; bool result = false; it = m_items.find( target ); if ( it!=m_items.end() ) result = it->second->send_message( msg ); else claw::logger << claw::log_warning << "post_office::send_message(): can't find target " << target << std::endl; return result; } // post_office::send_message() /*---------------------------------------------------------------------------*/ /** * \brief Process messages of all items. */ void bear::communication::post_office::process_messages() { CLAW_PRECOND( !locked() ); std::map::const_iterator it; lock(); for(it=m_items.begin(); it!=m_items.end(); ++it) it->second->process_messages(); unlock(); } // post_office::process_messages() /*---------------------------------------------------------------------------*/ /** * \brief Tell if there exists an item having a given name. */ bool bear::communication::post_office::exists( const std::string& name ) const { return m_items.find(name) != m_items.end(); } // post_office::exists() /*---------------------------------------------------------------------------*/ /** * \brief Remove all items. */ void bear::communication::post_office::clear() { std::map::const_iterator it; lock(); for(it=m_items.begin(); it!=m_items.end(); ++it) release_item(it->second); unlock(); } // post_office::process_messages() /*---------------------------------------------------------------------------*/ /** * \brief Add an item in the list. * \param who The item to add. */ void bear::communication::post_office::add( messageable* const& who) { if ( who->get_name() == no_name ) { claw::logger << claw::log_warning << "post_office::send_message(): '" << no_name << "' can't be use for a name." << std::endl; return; } std::map::const_iterator it; it = m_items.find( who->get_name() ); if ( it == m_items.end() ) m_items[who->get_name()] = who; else claw::logger << claw::log_warning << "post_office::add(): item " << who->get_name() << " is already in the list" << std::endl; } // post_office::add() /*---------------------------------------------------------------------------*/ /** * \brief Remove an item from the list. * \param who The item to remove. */ void bear::communication::post_office::remove(messageable* const& who) { std::map::iterator it; it = m_items.find( who->get_name() ); if ( it != m_items.end() ) m_items.erase(it); else claw::logger << claw::log_warning << "post_office::remove(): item " << who->get_name() << " isn't in the list" << std::endl; } // post_office::remove() plee-the-bear-20251226/bear-engine/core/src/communication/impl/000077500000000000000000000000001512343254000240715ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/core/src/communication/impl/typed_message.tpp000066400000000000000000000013601512343254000274470ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::communication::typed_message class. * \author Julien Jorge */ #include /*----------------------------------------------------------------------------*/ /** * \brief Apply the message to something. * \param that The thing to apply the message to. */ template bool bear::communication::typed_message::apply_to(messageable& that) { T* p = dynamic_cast< T* >( &that ); if (p != NULL) return apply_to(*p); else return false; } // typed_message::apply_to() plee-the-bear-20251226/bear-engine/core/src/communication/message.hpp000066400000000000000000000014661512343254000252740ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Base class for message events. * \author Julien Jorge */ #ifndef __COMMUNICATION_MESSAGE_HPP__ #define __COMMUNICATION_MESSAGE_HPP__ #include "communication/class_export.hpp" namespace bear { namespace communication { class messageable; /** * \brief Base class for message events. * \author Julien Jorge */ class COMMUNICATION_EXPORT message { public: virtual ~message(); virtual bool apply_to( messageable& that ) = 0; }; // class message } // namespace communication } // namespace bear #endif // __COMMUNICATION_MESSAGE_HPP__ plee-the-bear-20251226/bear-engine/core/src/communication/messageable.hpp000066400000000000000000000032671512343254000261210ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A class for items that can receaive message events. * \author Julien Jorge */ #ifndef __COMMUNICATION_MESSAGEABLE_HPP__ #define __COMMUNICATION_MESSAGEABLE_HPP__ #include "communication/message.hpp" #include "concept/item_container.hpp" #include "communication/class_export.hpp" #include namespace bear { namespace communication { /** * \brief A class for items that can receaive message events. * \author Julien Jorge */ class COMMUNICATION_EXPORT messageable: private concept::item_container { public: /** \brief The type of the parent class. */ typedef concept::item_container super; public: messageable(); messageable( const std::string& name ); messageable( const messageable& that ); virtual ~messageable(); void set_name(const std::string& name); const std::string& get_name() const; void post_message( message& msg ); bool send_message( message& msg ); void process_messages(); private: virtual bool process_message( message& msg ); virtual void add( message* const& who); virtual void remove( message* const& who); private: /** \brief The (unique) name of the item. */ std::string m_name; /** \brief Message queue. */ std::list m_message_queue; }; // class messageable } // namespace communication } // namespace bear #endif // __COMMUNICATION_MESSAGEABLE_HPP__ plee-the-bear-20251226/bear-engine/core/src/communication/post_office.hpp000066400000000000000000000025211512343254000261410ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A class to transfer message to items. * \author Julien Jorge */ #ifndef __COMMUNICATION_POST_OFFICE_HPP__ #define __COMMUNICATION_POST_OFFICE_HPP__ #include "communication/messageable.hpp" #include "concept/item_container.hpp" #include #include namespace bear { namespace communication { class message; /** * \brief A class to transfer message to items. * \author Julien Jorge */ class COMMUNICATION_EXPORT post_office: public concept::item_container { public: bool send_message( const std::string& target, message& msg ) const; void process_messages(); bool exists( const std::string& name ) const; void clear(); protected: void add( messageable* const& who ); void remove( messageable* const& who ); public: /** \brief The name of items that do not have a name... */ static const std::string no_name; private: std::map m_items; }; // class post_office } // namespace communication } // namespace bear #endif // __COMMUNICATION_POST_OFFICE_HPP__ plee-the-bear-20251226/bear-engine/core/src/communication/typed_message.hpp000066400000000000000000000016661512343254000265030ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A message that can be applied only to a given type. * \author Julien Jorge */ #ifndef __COMMUNICATION_TYPED_MESSAGE_HPP__ #define __COMMUNICATION_TYPED_MESSAGE_HPP__ #include "communication/message.hpp" namespace bear { namespace communication { /** * \brief A message that can be applied only to a given type. * \author Julien Jorge */ template class typed_message: public message { protected: virtual bool apply_to( T& that ) = 0; private: bool apply_to( messageable& that ); }; // class message } // namespace communication } // namespace bear #include "communication/impl/typed_message.tpp" #endif // __COMMUNICATION_MESSAGE_HPP__ plee-the-bear-20251226/bear-engine/core/src/concept/000077500000000000000000000000001512343254000217165ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/core/src/concept/impl/000077500000000000000000000000001512343254000226575ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/core/src/concept/impl/item_container.tpp000066400000000000000000000064061512343254000264120ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementaiton of the bear::concept::item_container class. * \author Julien Jorge. */ #include /*---------------------------------------------------------------------------*/ /** * \brief Constructor. */ template bear::concept::item_container::item_container() : m_locked(false) { } // item_container::item_container() [constructor] /*---------------------------------------------------------------------------*/ /** * \brief Copy constructor. * \param that The instance to copy from. * * Nothing is copied. */ template bear::concept::item_container::item_container ( const item_container& that ) : m_locked(false) { } // item_container::item_container() [copy constructor] /*---------------------------------------------------------------------------*/ /** * \brief Destructor. * \pre The container is unlocked. */ template bear::concept::item_container::~item_container() { if ( m_locked ) { claw::logger << claw::log_warning << "bear::concept::item_container::~item_container(): " << "destructor is called but the instance is locked." << std::endl; } } // item_container::~item_container() [destructor] /*---------------------------------------------------------------------------*/ /** * \brief Add an item in the container. * \param who The item to add. */ template void bear::concept::item_container::register_item(const item_type& who) { if (m_locked) m_life_queue.push_back(who); else add(who); } // item_container::register() /*---------------------------------------------------------------------------*/ /** * \brief Remove an item of the container. * \param who The item to remove. */ template void bear::concept::item_container::release_item(const item_type& who) { if (m_locked) m_death_queue.push_back(who); else remove(who); } // item_container::release() /*---------------------------------------------------------------------------*/ /** * \brief Tell if the instance is locked. */ template bool bear::concept::item_container::locked() const { return m_locked; } // item_container::locked() /*---------------------------------------------------------------------------*/ /** * \brief Lock the container : items added and removed are now buffered. */ template void bear::concept::item_container::lock() { m_locked = true; } // item_container::lock() /*---------------------------------------------------------------------------*/ /** * \brief Unlock the buffer, add and remove the corresponding pending items. */ template void bear::concept::item_container::unlock() { m_locked = false; // add items for(; !m_life_queue.empty(); m_life_queue.pop_front()) add( m_life_queue.front() ); // delete items for(; !m_death_queue.empty(); m_death_queue.pop_front()) remove( m_death_queue.front() ); } // item_container::unlock() plee-the-bear-20251226/bear-engine/core/src/concept/impl/region.tpp000066400000000000000000000034341512343254000246730ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::concept::region class. * \author Julien Jorge. */ /*----------------------------------------------------------------------------*/ /** * \brief Tell if the region intersects a shape. * \param The shape to check. */ template bool bear::concept::region::intersects ( const shape_type& shape ) const { bool result = false; typename super::const_iterator it; for (it=this->begin(); (it!=this->end()) && !result; ++it) result = it->intersects( shape ); return result; } // region::intersects() /*----------------------------------------------------------------------------*/ /** * \brief Tell if the region includes a shape. * \param The shape to check. */ template bool bear::concept::region::includes ( const shape_type& shape ) const { bool result = false; typename super::const_iterator it; for (it=this->begin(); (it!=this->end()) && !result; ++it) result = it->includes( shape ); return result; } // region::includes() /*----------------------------------------------------------------------------*/ /** * \brief Tell if the region includes a point. * \param The point to check. */ template template bool bear::concept::region::includes( const Point& p ) const { bool result = false; typename super::const_iterator it; for (it=this->begin(); (it!=this->end()) && !result; ++it) result = it->includes( p ); return result; } // region::includes() plee-the-bear-20251226/bear-engine/core/src/concept/item_container.hpp000066400000000000000000000035631512343254000254360ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A template class for item managing. Use it when you need to store * items that can be added or deleted anytime but must wait if a * process is running. * \author Julien Jorge. */ #ifndef __CONCEPT_ITEM_CONTAINER_HPP__ #define __CONCEPT_ITEM_CONTAINER_HPP__ #include namespace bear { namespace concept { /** * \brief A template class for item managing. Use it when you need to store * items that may want to be added or deleted anytime but should wait * a signal to be really added or deleted. * \author Julien Jorge. */ template class item_container { public: /** \brief The type of the stored items. */ typedef ItemType item_type; public: item_container(); item_container( const item_container& that ); virtual ~item_container(); void register_item( const item_type& who ); void release_item( const item_type& who ); bool locked() const; protected: virtual void add( const item_type& who ) = 0; virtual void remove( const item_type& who ) = 0; void lock(); void unlock(); private: /** \brief True if items can't be immediatly added. Items will be buffered. */ bool m_locked; /** \brief The queue of the items to add. */ std::list m_life_queue; /** \brief The queue of the items to delete. */ std::list m_death_queue; }; // class item_container } // namespace concept } // namespace bear // template methods #include "concept/impl/item_container.tpp" #endif // __CONCEPT_ITEM_CONTAINER_HPP__ plee-the-bear-20251226/bear-engine/core/src/concept/region.hpp000066400000000000000000000026321512343254000237150ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A region is a list of shapes in a 2D space. * \author Julien Jorge. */ #ifndef __CONCEPT_REGION_HPP__ #define __CONCEPT_REGION_HPP__ #include namespace bear { namespace concept { /** * \brief A region is a list of shapes in a 2D space. * * The \a Shape type should have the following methods : * - bool intersects( Shape ) : tell if two shapes intersects, * - bool includes( Shape ) : tell if a shape is included in an other one, * - bool includes( Point ) : tell if a shape includes a coordinate. * * \author Julien Jorge. */ template > class region : public Container { public: /** \brief The type of the shapes. */ typedef Shape shape_type; /** \brief The type of the parent class. */ typedef Container super; public: bool intersects( const shape_type& shape ) const; bool includes( const shape_type& shape ) const; template bool includes( const Point& p ) const; }; // class region } // namespace concept } // namespace bear #include "concept/impl/region.tpp" #endif // __CONCEPT_REGION_HPP__ plee-the-bear-20251226/bear-engine/core/src/debug/000077500000000000000000000000001512343254000213515ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/core/src/debug/CMakeLists.txt000066400000000000000000000011761512343254000241160ustar00rootroot00000000000000set( DEBUG_TARGET_NAME bear_debug ) #------------------------------------------------------------------------------- set( DEBUG_SOURCE_FILES code/scoped_time_measure.cpp code/timelog.cpp code/timing_log.cpp ) add_library( ${DEBUG_TARGET_NAME} ${BEAR_ENGINE_CORE_LINK_TYPE} ${DEBUG_SOURCE_FILES} ) set_target_properties( ${DEBUG_TARGET_NAME} PROPERTIES INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/${BEAR_ENGINE_INSTALL_LIBRARY_DIR}" ) install( TARGETS ${DEBUG_TARGET_NAME} DESTINATION ${BEAR_ENGINE_INSTALL_LIBRARY_DIR} ) target_link_libraries( ${DEBUG_TARGET_NAME} ${CLAW_LOGGER_LIBRARIES} bear_time ) plee-the-bear-20251226/bear-engine/core/src/debug/class_export.hpp000066400000000000000000000014211512343254000245660ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Definition of the DEBUG_EXPORT macro according to the fact that we * create the library or link to it. * \author Julien Jorge */ #ifndef __DEBUG_CLASS_EXPORT_HPP__ #define __DEBUG_CLASS_EXPORT_HPP__ #ifndef DEBUG_EXPORT # ifdef _WIN32 # ifdef bear_debug_EXPORTS # define DEBUG_EXPORT __declspec(dllexport) # else # define DEBUG_EXPORT __declspec(dllimport) # endif // def bear_debug_EXPORTS # else // def _WIN32 # define DEBUG_EXPORT # endif // def _WIN32 #endif // ndef DEBUG_EXPORT #endif // __DEBUG_CLASS_EXPORT_HPP__ plee-the-bear-20251226/bear-engine/core/src/debug/code/000077500000000000000000000000001512343254000222635ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/core/src/debug/code/scoped_time_measure.cpp000066400000000000000000000024701512343254000270060ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::debug::scoped_time_measure class. * \author Julien Jorge */ #include "debug/scoped_time_measure.hpp" #include "debug/timelog.hpp" #include /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param name The name of the timer. */ bear::debug::scoped_time_measure::scoped_time_measure ( const std::string& name ) : m_name( timelog::format_key(name) ), m_start_date( systime::get_date_ms() ) { } // scoped_time_measure::scoped_time_measure() /*----------------------------------------------------------------------------*/ /** * \brief Destructor. */ bear::debug::scoped_time_measure::~scoped_time_measure() { #ifdef __ANDROID__ claw::logger << claw::log_verbose << "[PROF]" << m_name << '\t' << systime::get_date_ms() - m_start_date << '\n'; #else timelog::get_output() << m_name << '\t' << systime::get_date_ms() - m_start_date << '\n'; #endif } // scoped_time_measure::~scoped_time_measure() plee-the-bear-20251226/bear-engine/core/src/debug/code/timelog.cpp000066400000000000000000000022201512343254000244230ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::debug::timelog class. * \author Julien Jorge */ #include "debug/timelog.hpp" #include #include /*----------------------------------------------------------------------------*/ std::ostream* bear::debug::timelog::s_output(NULL); /*----------------------------------------------------------------------------*/ /** * \brief Gets the stream in which to write the measures. */ std::ostream& bear::debug::timelog::get_output() { if ( s_output == NULL ) s_output = new std::ofstream( "prof.log" ); return *s_output; } // timelog::get_output() /*----------------------------------------------------------------------------*/ /** * \brief Formats a string to be used as the key in the timelog. * \param key The key to format. */ std::string bear::debug::timelog::format_key( std::string key ) { std::replace( key.begin(), key.end(), ' ', '_' ); return key; } // format_key() plee-the-bear-20251226/bear-engine/core/src/debug/code/timing_log.cpp000066400000000000000000000046151512343254000251250ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::debug::timing_log class. * \author Julien Jorge */ #include "debug/timing_log.hpp" #include /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param name The name of the timer. * \param avg_interval The duration of the time window in which we compute the * average duration. */ bear::debug::timing_log::timing_log ( const std::string& name, systime::milliseconds_type avg_interval ) : m_name(name), m_duration_counter(0), m_duration_sum(0), m_avg_interval(avg_interval), m_avg_counter(0), m_avg_sum(0) { } // timing_log::timing_log() /*----------------------------------------------------------------------------*/ /** * \brief Destructior. */ bear::debug::timing_log::~timing_log() { if ( !m_duration.empty() ) { std::list::const_iterator it; std::ofstream f( (m_name + ".timelog").c_str() ); unsigned int i = 0; for (it=m_duration.begin(); it!=m_duration.end(); ++it, ++i) f << i << ' ' << *it << '\n'; } claw::logger << claw::log_verbose << "timelog " << m_name << " total=" << m_duration_sum << " ms, avg=" << ((double)m_duration_sum / (double)m_duration_counter) << " ms." << std::endl; } // timing_log::~timing_log() /*----------------------------------------------------------------------------*/ /** * \brief Start to measure something. */ void bear::debug::timing_log::start() { m_last_date = systime::get_date_ms(); } // timing_log::start() /*----------------------------------------------------------------------------*/ /** * \brief Stop the last measure. */ void bear::debug::timing_log::stop() { systime::milliseconds_type current_time = systime::get_date_ms(); m_duration_sum += current_time - m_last_date; ++m_duration_counter; if (m_avg_counter == 0) m_last_avg = m_last_date; m_avg_sum += current_time - m_last_date; ++m_avg_counter; if ( current_time - m_last_avg >= m_avg_interval ) { m_duration.push_back( (double)m_avg_sum / (double)m_avg_counter ); m_avg_sum = 0; m_avg_counter = 0; } } // timing_log::stop() plee-the-bear-20251226/bear-engine/core/src/debug/scoped_time_measure.hpp000066400000000000000000000034151512343254000261010ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief This class measures the time spent between its creation and its * destruction. * \author Julien Jorge */ #ifndef __DEBUG_SCOPED_TIME_MEASURE_HPP__ #define __DEBUG_SCOPED_TIME_MEASURE_HPP__ #include "time/time.hpp" #include "debug/class_export.hpp" #include #include namespace bear { namespace debug { /** * \brief This class measures the time spent between its creation and its * destruction. * \author Julien Jorge */ class DEBUG_EXPORT scoped_time_measure { public: explicit scoped_time_measure( const std::string& name ); ~scoped_time_measure(); private: /** \brief The name of this measure. */ const std::string m_name; /** \brief The date at which the measure started. */ systime::milliseconds_type m_start_date; }; // class scoped_time_measure } // namespace debug } // namespace bear /** * \brief Creates a scoped_time_measure. * \param name The name of the timer. */ #define BEAR_SCOPED_TIMELOG( name ) \ bear::debug::scoped_time_measure \ __FUNCTION__ ## __LINE__ ## _scoped_time_log( (name) ) #ifdef BEAR_PROFILE /** * \brief Creates a scoped_time_measure. * \param name The name of the timer. */ #define BEAR_CREATE_SCOPED_TIMELOG( name ) \ BEAR_SCOPED_TIMELOG( name ) #else // def BEAR_PROFILE #define BEAR_CREATE_SCOPED_TIMELOG( name ) #endif // def BEAR_PROFILE #endif // __DEBUG_SCOPED_TIME_MEASURE_HPP__ plee-the-bear-20251226/bear-engine/core/src/debug/timelog.hpp000066400000000000000000000017101512343254000235210ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief This class provides some utility methods to log the time measures. * \author Julien Jorge */ #ifndef __DEBUG_TIMELOG_HPP__ #define __DEBUG_TIMELOG_HPP__ #include "debug/class_export.hpp" #include namespace bear { namespace debug { /** * \brief This class provides some utility methods to log the time measures. * \author Julien Jorge */ class DEBUG_EXPORT timelog { public: static std::ostream& get_output(); static std::string format_key( std::string key ); private: /** \brief The stream in which the measures are written. */ static std::ostream* s_output; }; // class timelog } // namespace debug } // namespace bear #endif // __DEBUG_TIMELOG_HPP__ plee-the-bear-20251226/bear-engine/core/src/debug/timing_log.hpp000066400000000000000000000055631512343254000242230ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief This class keep traces of different durations and output the total * and average durations. * \author Julien Jorge */ #ifndef __DEBUG_TIMING_LOG_HPP__ #define __DEBUG_TIMING_LOG_HPP__ #include "time/time.hpp" #include "debug/class_export.hpp" #include #include namespace bear { namespace debug { /** * \brief This class keep traces of different durations and output the total * and average durations. * \author Julien Jorge */ class DEBUG_EXPORT timing_log { public: timing_log ( const std::string& name, systime::milliseconds_type avg_interval ); ~timing_log(); void start(); void stop(); private: /** \brief The durations in m_avg_interval interval of time. */ std::list m_duration; /** \brief The name of this timer. */ const std::string m_name; /** \brief The last time saved by a call to start(). */ systime::milliseconds_type m_last_date; /** \brief The count of measures since the begining. */ unsigned int m_duration_counter; /** \brief The sum of measures since the begining. */ systime::milliseconds_type m_duration_sum; /** \brief The duration of the time intervals in which we compute the average duration. */ systime::milliseconds_type m_avg_interval; /** \brief The date of the last computation of an average time. */ systime::milliseconds_type m_last_avg; /** \brief The count of measures since the last computation of an average time. */ unsigned int m_avg_counter; /** \brief The sum of measures since the last computation of an average time. */ systime::milliseconds_type m_avg_sum; }; // class timing_log } // namespace debug } // namespace bear #ifdef BEAR_PROFILE /** * \brief Create a static timer. * \param name The name of the timer. * \param d The duration of the time window in which we compute the average * duration. */ #define BEAR_CREATE_TIMELOG( name, d ) \ static bear::debug::timing_log name ## _time_log( #name, d ) /** * \brief Start a timer with a given name. * \param name The name of the timer. */ #define BEAR_START_TIMELOG( name ) name ## _time_log.start() /** * \brief Stop a timer with a given name. * \param name The name of the timer. */ #define BEAR_STOP_TIMELOG( name ) name ## _time_log.stop() #else // def BEAR_PROFILE #define BEAR_CREATE_TIMELOG( name, d ) #define BEAR_START_TIMELOG( name ) #define BEAR_STOP_TIMELOG( name ) #endif // def BEAR_PROFILE #endif // __DEBUG_TIMING_LOG_HPP__ plee-the-bear-20251226/bear-engine/core/src/engine/000077500000000000000000000000001512343254000215305ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/core/src/engine/CMakeLists.txt000066400000000000000000000142311512343254000242710ustar00rootroot00000000000000set( ENGINE_TARGET_NAME bear_engine ) #------------------------------------------------------------------------------- set( ENGINE_SOURCE_FILES code/base_item.cpp code/bitmap_font_loader.cpp code/compiled_file.cpp code/game.cpp code/game_description.cpp code/game_initializer.cpp code/game_local_client.cpp code/game_network.cpp code/game_stats.cpp code/item_factory.cpp code/item_flag_type.cpp code/level.cpp code/level_globals.cpp code/level_loader.cpp code/level_object.cpp code/libraries_pool.cpp code/model_loader.cpp code/population.cpp code/resource_pool.cpp code/shader_loader.cpp code/scene_visual.cpp code/sprite_loader.cpp code/spritepos.cpp code/world.cpp comic/code/balloon.cpp comic/item/code/speaker_item.cpp comic/layer/code/balloon_layer.cpp comic/layer/balloon_placement/code/balloon_placement.cpp comic/loader/code/speaker_item_loader.cpp comic/message/code/balloon_layer_add_message.cpp expr/code/check_item_class.cpp expr/code/check_item_instance.cpp expr/code/collision_in_expression.cpp expr/code/count_items_by_class_name.cpp expr/code/get_toggle_status.cpp forced_movement/code/toggle_in_forced_movement.cpp function/code/bool_game_variable_getter.cpp function/code/bool_level_variable_getter.cpp game_action/code/game_action_load_level.cpp game_action/code/game_action_pop_level.cpp game_action/code/game_action_push_level.cpp game_action/code/game_action_set_current_level.cpp i18n/code/base_translator.cpp i18n/code/android_gettext_translator.cpp i18n/code/gettext_translator.cpp i18n/code/translator.cpp item_brick/code/activable_sides.cpp item_brick/code/forced_movement_applicator.cpp item_brick/code/forced_movement_repeater.cpp item_brick/code/with_boolean_expression_assignment.cpp item_brick/code/with_boolean_expression_creation.cpp item_brick/code/with_linear_expression_assignment.cpp item_brick/code/with_linear_expression_creation.cpp item_brick/code/with_rendering_attributes.cpp item_brick/code/with_text.cpp item_brick/code/with_toggle.cpp item_brick/code/with_trigger.cpp item_brick/code/z_shift.cpp item_brick/loader/code/activable_sides_loader.cpp item_brick/loader/code/forced_movement_applicator_loader.cpp item_brick/loader/code/forced_movement_loader.cpp item_brick/loader/code/forced_movement_repeater_loader.cpp item_brick/loader/code/single_tweener_loader.cpp item_brick/loader/code/z_shift_loader.cpp layer/code/base_debugging_layer.cpp layer/code/gui_layer.cpp layer/code/gui_layer_stack.cpp layer/code/layer.cpp layer/code/layer_factory.cpp layer/code/transition_layer.cpp loader/code/base_item_loader.cpp loader/code/item_loader.cpp loader/code/item_loader_base.cpp loader/code/item_loader_fallback.cpp loader/code/item_loader_map.cpp message/code/transition_effect_erase_message.cpp model/code/model_action.cpp model/code/model_actor.cpp model/code/model_mark.cpp model/code/model_mark_item.cpp model/code/model_mark_placement.cpp model/code/model_snapshot.cpp model/code/model_snapshot_tweener.cpp network/code/client_connection.cpp network/code/client_future.cpp network/code/client_observer.cpp network/code/message_factory.cpp network/message/code/sync.cpp resource_pool/code/android_resource_pool.cpp resource_pool/code/directory_resource_pool.cpp script/code/call_sequence.cpp script/code/method_call.cpp script/code/script_context.cpp script/code/script_parser.cpp script/code/script_runner.cpp script/node_parser/code/node_parser.cpp script/node_parser/code/node_parser_argument.cpp script/node_parser/code/node_parser_argument_list.cpp script/node_parser/code/node_parser_call.cpp script/node_parser/code/node_parser_call_entry.cpp script/node_parser/code/node_parser_call_group.cpp script/node_parser/code/node_parser_file.cpp system/code/android_game_filesystem.cpp system/code/android_system_event_manager.cpp system/code/base_game_filesystem.cpp system/code/default_game_filesystem.cpp system/code/default_system_event_manager.cpp system/code/freedesktop_game_filesystem.cpp system/code/game_filesystem.cpp transition_effect/code/fade_effect.cpp transition_effect/code/strip_effect.cpp transition_effect/code/transition_effect.cpp variable/code/base_variable.cpp variable/code/type_to_string.cpp variable/code/var_map.cpp variable/code/variable_copy.cpp variable/code/variable_list_reader.cpp variable/code/variable_eraser.cpp variable/code/variable_saver.cpp ) if( WIN32 ) set( ENGINE_SOURCE_FILES ${ENGINE_SOURCE_FILES} system/code/system_api_windows.cpp ) else() set( ENGINE_SOURCE_FILES ${ENGINE_SOURCE_FILES} system/code/system_api_default.cpp ) endif() add_library( ${ENGINE_TARGET_NAME} ${BEAR_ENGINE_CORE_LINK_TYPE} ${ENGINE_SOURCE_FILES} ) set_target_properties( ${ENGINE_TARGET_NAME} PROPERTIES INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/${BEAR_ENGINE_INSTALL_LIBRARY_DIR}" ) set( BEAR_ENGINE_DEFINITIONS ) if( BEAR_BUILD_TAG ) set( BEAR_ENGINE_DEFINITIONS ${BEAR_ENGINE_DEFINITIONS} "BEAR_BUILD_TAG=${BEAR_BUILD_TAG}" ) endif() if( BEAR_USES_FREEDESKTOP ) set( BEAR_ENGINE_DEFINITIONS ${BEAR_ENGINE_DEFINITIONS} "BEAR_USES_FREEDESKTOP" ) endif() if( BEAR_ENGINE_DEFINITIONS ) set_target_properties( ${ENGINE_TARGET_NAME} PROPERTIES COMPILE_DEFINITIONS ${BEAR_ENGINE_DEFINITIONS} ) endif() install( TARGETS ${ENGINE_TARGET_NAME} DESTINATION ${BEAR_ENGINE_INSTALL_LIBRARY_DIR} ) set( ENGINE_LINK_LIBRARIES ${SDL2MIXER_LIBRARY} ${OPENGL_LIBRARIES} bear_audio bear_communication bear_expr bear_gui bear_input bear_net bear_text_interface bear_time bear_universe bear_visual bear_debug ${CLAW_APPLICATION_LIBRARIES} ${CLAW_DYNAMIC_LIBRARY_LIBRARIES} ${CLAW_GRAPHIC_LIBRARIES} ${CLAW_NET_LIBRARIES} ${CLAW_TWEEN_LIBRARIES} ${Boost_REGEX_LIBRARY} ${Boost_FILESYSTEM_LIBRARY} ${Boost_SYSTEM_LIBRARY} ) if(WIN32 OR APPLE) set( ENGINE_LINK_LIBRARIES ${ENGINE_LINK_LIBRARIES} intl ) endif(WIN32 OR APPLE) target_link_libraries( ${ENGINE_TARGET_NAME} ${ENGINE_LINK_LIBRARIES} ) plee-the-bear-20251226/bear-engine/core/src/engine/base_item.hpp000066400000000000000000000207161512343254000241770ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief The basic physical item of our game. * \author Julien Jorge */ #ifndef __ENGINE_BASE_ITEM_HPP__ #define __ENGINE_BASE_ITEM_HPP__ #include #include "engine/class_export.hpp" #include "universe/derived_item_handle.hpp" #include "universe/physical_item.hpp" #include "engine/item_flag_type.hpp" #include "engine/level_object.hpp" #include "engine/scene_visual.hpp" #include "engine/loader/item_loader_map.hpp" #include "text_interface/base_exportable.hpp" #include "audio/sample.hpp" #include "visual/animation.hpp" #include "visual/color.hpp" #include "visual/sprite.hpp" #include "visual/shader_program.hpp" #include "visual/font/font.hpp" namespace bear { namespace engine { class layer; class level; class world; /** * \brief The basic physical item of our game. * \author Julien Jorge * - \a position.left: \c The x-coordinate of the left edge, * - \a position.bottom: \c The y-coordinate of the bottom egde, * - \a position.depth: \c The z-coordinate, * - \a size.height: \c The height of the box, * - \a size.width: \c The width of the box, * - \a mass: \c Mass of the item, * - \a density: \c Density of the item, * - \a elasticty: \c Elasticity of the item, * - \a hardness: \c Hardness of the item, * - \a system_angle: \c Angle of the item, * - \a speed.x: \c The initial speed on the x-axis, * - \a speed.y: \c The initial speed on the y-axis, * - \a angular_speed: \c The initial angular speed, * - \a artificial: \c Tell if the item is artificial, * - \a can_move_items: \c Tell if the item can move other items, * - \a phantom: \c Tell if the item is a phantom, * - \a global: \c Tell if the item is global, * - \a fixed.x: \c Tell if the item is fixed on x-coordinate, * - \a fixed.y: \c Tell if the item is fixed on y-coordinate, * - \a free_system: \c Tell if the system angle of the item is not * modified by the collisions. */ class ENGINE_EXPORT base_item: public universe::physical_item, public text_interface::base_exportable, virtual public level_object { public: /** \brief type of the unique identifier of items. */ typedef unsigned int id_type; /** \brief The type of the class that stores our fields. */ typedef physical_item_state state_type; /** \brief The type of the parent class. */ typedef universe::physical_item super; TEXT_INTERFACE_DECLARE_METHOD_LIST (text_interface::base_exportable, init_exported_methods); private: /** \brief The type of the handles on a base_item. */ typedef universe::derived_item_handle item_handle; /** \brief The type of the list of the items to kill with this item. */ typedef std::list life_chain_list; public: static void print_allocated(); base_item(); base_item( const base_item& that ); ~base_item(); virtual base_item* clone() const; void build_item(); bool is_built() const; void enters_layer(); void leaves_layer(); item_loader_map get_loaders(); virtual void pre_cache(); virtual void progress( universe::time_type elapsed_time ); scene_visual get_visual() const; virtual void get_visual( std::list& visuals ) const; virtual bool set_u_integer_field ( const std::string& name, unsigned int value ); virtual bool set_integer_field( const std::string& name, int value ); virtual bool set_real_field( const std::string& name, double value ); virtual bool set_bool_field( const std::string& name, bool value ); virtual bool set_string_field ( const std::string& name, const std::string& value ); virtual bool set_item_field ( const std::string& name, base_item* value ); virtual bool set_sprite_field ( const std::string& name, const visual::sprite& value ); virtual bool set_animation_field ( const std::string& name, const visual::animation& value ); virtual bool set_sample_field ( const std::string& name, audio::sample* value ); virtual bool set_font_field ( const std::string& name, visual::font value ); virtual bool set_color_field ( const std::string& name, visual::color value ); virtual bool set_u_integer_list_field ( const std::string& name, const std::vector& value ); virtual bool set_integer_list_field ( const std::string& name, const std::vector& value ); virtual bool set_real_list_field ( const std::string& name, const std::vector& value ); virtual bool set_bool_list_field ( const std::string& name, const std::vector& value ); virtual bool set_string_list_field ( const std::string& name, const std::vector& value ); virtual bool set_item_list_field ( const std::string& name, const std::vector& value ); virtual bool set_sprite_list_field ( const std::string& name, const std::vector& value ); virtual bool set_animation_list_field ( const std::string& name, const std::vector& value ); virtual bool set_sample_list_field ( const std::string& name, const std::vector& value ); virtual bool set_font_list_field ( const std::string& name, const std::vector& value ); virtual bool set_color_list_field ( const std::string& name, const std::vector& value ); virtual bool is_valid() const; id_type get_id() const; virtual const char* get_class_name() const; virtual std::size_t size_of() const; void kill(); bool is_dead() const; void clear_environment(); void set_environment( layer& owner ); bool is_in_layer() const; bool is_in_layer( const layer& the_layer ) const; void set_z_position( int z ); int get_z_position() const; void set_z_fixed( bool fixed ); bool is_z_fixed() const; void set_shader( visual::shader_program s ); void clear_shader(); void set_insert_as_static(); bool get_insert_as_static() const; bool has_world() const; const world& get_world() const; /* public only for engine::world. */ void set_world( const world& w ); layer& get_layer() const; void new_item( base_item& item ) const; void kill_when_dying( base_item& item ); virtual void get_dependent_items ( universe::physical_item::item_list& d ) const; protected: void set_always_displayed(bool b); virtual void populate_loader_map( item_loader_map& m ); virtual void collision ( base_item& that, universe::collision_info& info ); virtual void build(); virtual void on_enters_layer(); virtual void on_leaves_layer(); virtual void destroy(); void to_string( std::string& str ) const; static void init_exported_methods(); private: void collision( universe::collision_info& info ); void time_step( universe::time_type elapsed_time ); void clean_life_chain(); private: /** * \brief Unique identifier. * * Valid identifiers are strictly greater than zero. */ const id_type m_id; /** \brief The layer in which I am. */ layer* m_layer; /** \brief The z position of the item in the layer. */ int m_z_position; /** \brief Flags applyed to the item. */ item_flag_type m_flags; /** \brief Tell if the kill() method has been called. */ bool m_dying; /** \brief The world in which the item is. */ world const* m_world; /** \brief The items to kill with this item. */ life_chain_list m_life_chain; /** \brief The shader to apply to this item. */ visual::shader_program m_shader; /** \brief Next item identifier. */ static id_type s_next_id; #ifndef NDEBUG /** \brief A list in which we store the reference of the items, so we can detect memory leaks. */ static std::list s_allocated; #endif }; // class base_item } // namespace engine } // namespace bear #endif // __ENGINE_BASE_ITEM_HPP__ plee-the-bear-20251226/bear-engine/core/src/engine/bitmap_font_loader.hpp000066400000000000000000000033621512343254000260750ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief This class loads a bitmap font. * \author Julien Jorge */ #ifndef __ENGINE_BITMAP_FONT_LOADER_HPP__ #define __ENGINE_BITMAP_FONT_LOADER_HPP__ #include "visual/font/bitmap_charmap.hpp" #include "engine/class_export.hpp" namespace bear { namespace engine { class level_globals; /** * \brief This class loads a bitmap font. * \author Julien Jorge */ class ENGINE_EXPORT bitmap_font_loader { public: bitmap_font_loader( std::istream& f, level_globals& glob ); visual::bitmap_charmap run(); private: visual::bitmap_charmap read_legacy(); visual::bitmap_charmap read_autofont(); void read_autofont_image ( visual::bitmap_charmap& cs, const std::string& image_name ) const; void read_autofont_options( visual::bitmap_charmap& cs ); void upper_to_lower( visual::bitmap_charmap& cs ) const; std::string get_next_line() const; void fail( const std::string& msg ) const; private: /** \brief The file from which we load the font. */ std::istream& m_file; /** \brief The level_globals in which we load the resources. */ level_globals& m_level_globals; /** \brief The keyword that starts an autofont file. */ static const std::string s_autofont_keyword; /** \brief The keyword that starts a section of options. */ static const std::string s_options_keyword; }; // class bitmap_font_loader } // namespace engine } // namespace bear #endif // __ENGINE_BITMAP_FONT_LOADER_HPP__ plee-the-bear-20251226/bear-engine/core/src/engine/class_export.hpp000066400000000000000000000014341512343254000247510ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Definition of the ENGINE_EXPORT macro according to the fact that we * create the library or link to it. * \author Julien Jorge */ #ifndef __ENGINE_CLASS_EXPORT_HPP__ #define __ENGINE_CLASS_EXPORT_HPP__ #ifndef ENGINE_EXPORT # ifdef _WIN32 # ifdef bear_engine_EXPORTS # define ENGINE_EXPORT __declspec(dllexport) # else # define ENGINE_EXPORT __declspec(dllimport) # endif // def bear_engine_EXPORTS # else // def _WIN32 # define ENGINE_EXPORT # endif // def _WIN32 #endif // ndef ENGINE_EXPORT #endif // __ENGINE_CLASS_EXPORT_HPP__ plee-the-bear-20251226/bear-engine/core/src/engine/code/000077500000000000000000000000001512343254000224425ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/core/src/engine/code/base_item.cpp000066400000000000000000001047111512343254000251020ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::engine::base_item class. * \author Julien Jorge. */ #include "engine/base_item.hpp" #include #include #include "engine/layer/layer.hpp" #include "engine/loader/base_item_loader.hpp" #include "engine/loader/item_loader_fallback.hpp" #include "engine/level.hpp" #include "universe/collision_info.hpp" #include "visual/scene_element_sequence.hpp" #include "visual/scene_shader_pop.hpp" #include "visual/scene_shader_push.hpp" #include "debug/scoped_time_measure.hpp" /*----------------------------------------------------------------------------*/ bear::engine::base_item::id_type bear::engine::base_item::s_next_id = 1; #ifndef NDEBUG std::list bear::engine::base_item::s_allocated; struct item_count { public: struct decreasing_max { bool operator()( const item_count& a, const item_count& b ) const { if ( a.get_max() != b.get_max() ) return a.get_max() > b.get_max(); if ( a.get_max_size() != b.get_max_size() ) return a.get_max_size() > b.get_max_size(); return a.get_size() > b.get_size(); } }; // struct decreasing_max() public: item_count() : m_count(0), m_max(0), m_size(0) { } item_count( const bear::engine::base_item& item ) : m_count(1), m_max(1), m_size(item.size_of()) { } void add() { ++m_count; m_max = std::max(m_count, m_max); } void remove() { --m_count; } std::size_t get_max() const { return m_max; } std::size_t get_max_size() const { return m_max * m_size; } std::size_t get_size() const { return m_size; } private: std::size_t m_count; std::size_t m_max; std::size_t m_size; }; struct item_counter { private: typedef std::map counter_map; public: void count( const bear::engine::base_item& item ) { if ( m_counter.find( item.get_class_name() ) == m_counter.end() ) m_counter[item.get_class_name()] = item_count(item); else m_counter[item.get_class_name()].add(); } void uncount( const bear::engine::base_item& item ) { m_counter[item.get_class_name()].remove(); } ~item_counter() { typedef std::multimap < item_count, std::string, item_count::decreasing_max > max_map_type; max_map_type by_max; for ( counter_map::const_iterator it=m_counter.begin(); it!=m_counter.end(); ++it ) by_max.insert( max_map_type::value_type( it->second, it->first ) ); std::size_t c(0), s(0); for ( max_map_type::const_iterator it=by_max.begin(); it!=by_max.end(); ++it ) { c += it->first.get_max(); s += it->first.get_max_size(); std::cout << it->second << ": " << it->first.get_max() << " instances " << it->first.get_max_size() << " bytes (" << it->first.get_size() << " each)." << std::endl; } std::cout << "sum: " << c << " instances " << s << " bytes." << std::endl; } private: std::map m_counter; }; // struct static item_counter s_item_counter; #endif /*----------------------------------------------------------------------------*/ /** * \brief Print the address of the items that were not deleted. */ void bear::engine::base_item::print_allocated() { #ifdef BEAR_DEBUG_ALLOCATED_ITEMS unsigned int s = s_allocated.size(); if ( s == 0 ) claw::logger << claw::log_verbose << "All base_item have been deleted." << std::endl; else { claw::logger << claw::log_verbose << s << " base_item have NOT been deleted." << std::endl; std::list::const_iterator it; for (it=s_allocated.begin(); it!=s_allocated.end(); ++it) { std::string str; (*it)->to_string( str ); claw::logger << claw::log_verbose << "-- Item\n" << str << std::endl; } } #endif } // base_item::print_allocated() /*----------------------------------------------------------------------------*/ /** * \brief Contructor. */ bear::engine::base_item::base_item() : m_id( s_next_id ), m_layer(NULL), m_z_position(0), m_flags(item_flag_z_fixed), m_dying(false), m_world(NULL) { ++s_next_id; #ifndef NDEBUG s_allocated.push_front(this); #endif } // base_item::base_item() /*----------------------------------------------------------------------------*/ /** * \brief Copy contructor. */ bear::engine::base_item::base_item( const base_item& that ) : level_object(that), physical_item(that), m_id( s_next_id ), m_layer(NULL), m_z_position(that.get_z_position()), m_flags(item_flag_z_fixed), m_dying(false) { m_flags |= that.m_flags & item_flag_built; ++s_next_id; #ifndef NDEBUG s_allocated.push_front(this); #endif } // base_item::base_item() /*----------------------------------------------------------------------------*/ /** * \brief Destructor. */ bear::engine::base_item::~base_item() { #ifndef NDEBUG s_item_counter.uncount(*this); s_allocated.erase( std::find(s_allocated.begin(), s_allocated.end(), this) ); #endif } // base_item::~base_item() /*----------------------------------------------------------------------------*/ /** * \brief Instanciate a copy of this item. */ bear::engine::base_item* bear::engine::base_item::clone() const { return new base_item(*this); } // base_item::clone() /*----------------------------------------------------------------------------*/ /** * \brief Build the item if it has never been built. */ void bear::engine::base_item::build_item() { if ( !is_built() ) { #ifndef NDEBUG s_item_counter.count(*this); #endif m_flags |= item_flag_built; build(); } } // base_item::build_item() /*----------------------------------------------------------------------------*/ /** * \brief Tells if build_item has been called on this item. */ bool bear::engine::base_item::is_built() const { return (m_flags & item_flag_built) != item_flag_none; } // base_item::is_built() /*----------------------------------------------------------------------------*/ /** * \brief Inform the item that it is in a layer now. */ void bear::engine::base_item::enters_layer() { on_enters_layer(); } // base_item::enters_layer() /*----------------------------------------------------------------------------*/ /** * \brief Informs the item that it has been be removed from its layer. */ void bear::engine::base_item::leaves_layer() { on_leaves_layer(); } // base_item::leaves_layer() /*----------------------------------------------------------------------------*/ /** * \brief Get the loaders to use to initialize this item from a level file. */ bear::engine::item_loader_map bear::engine::base_item::get_loaders() { item_loader_map result( item_loader_fallback(*this) ); populate_loader_map( result ); return result; } // base_item::get_loaders() /*----------------------------------------------------------------------------*/ /** * \brief Pre-cache the resources you need. This method is called automatically * by the owner. */ void bear::engine::base_item::pre_cache() { // nothing to do } // base_item::pre_cache() /*----------------------------------------------------------------------------*/ /** * \brief Do one iteration in the progression of the item. * \param elapsed_time Elapsed time since the last call. */ void bear::engine::base_item::progress( universe::time_type elapsed_time ) { // nothing to do } // base_item::progress() /*----------------------------------------------------------------------------*/ /** * \brief Gets the visual of the item. * * This method uses get_visual( std::list<>& ) to get the visuals and make a * visual::scene_element_sequence of them. */ bear::engine::scene_visual bear::engine::base_item::get_visual() const { BEAR_CREATE_SCOPED_TIMELOG ( std::string("insert_visual ") + get_class_name() ); visual::scene_element_sequence result; std::list v; get_visual( v ); v.sort( scene_visual::z_position_compare() ); for ( ; !v.empty() ; v.pop_front() ) { #ifndef NDEBUG const visual::scene_element& elem( v.front().scene_element ); if ( !elem.always_displayed() && elem.get_bounding_box().empty() ) claw::logger << claw::log_warning << "Empty visual::scene_element is inserted in a " << "visual::scene_element_sequence by '" << get_class_name() << "'. This should be avoided." << std::endl; #endif // NDEBUG result.push_back( v.front().scene_element ); } if ( m_shader.is_valid() ) { result.push_front( visual::scene_shader_push( m_shader ) ); result.push_back( visual::scene_shader_pop() ); } return scene_visual( result, get_z_position() ); } // base_item::get_visual() /*----------------------------------------------------------------------------*/ /** * \brief Get the visuals representing the item. * \param visuals (out) The sprites of the item, and their positions. */ void bear::engine::base_item::get_visual( std::list& visuals ) const { // nothing to do } // base_item::get_visual() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type \c unsigned \c integer. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::engine::base_item::set_u_integer_field ( const std::string& name, unsigned int value ) { return false; } // base_item::set_u_integer_field() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type \c integer. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::engine::base_item::set_integer_field( const std::string& name, int value ) { return false; } // base_item::set_integer_field() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type \c real. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::engine::base_item::set_real_field( const std::string& name, double value ) { return false; } // base_item::set_real_field() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type \c bool. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::engine::base_item::set_bool_field( const std::string& name, bool value ) { return false; } // base_item::set_bool_field() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type \c string. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::engine::base_item::set_string_field ( const std::string& name, const std::string& value ) { return false; } // base_item::set_string_field() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type \c base_item. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::engine::base_item::set_item_field ( const std::string& name, base_item* value ) { return false; } // base_item::set_item_field() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type \c visual::sprite. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::engine::base_item::set_sprite_field ( const std::string& name, const visual::sprite& value ) { return false; } // base_item::set_sprite_field() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type \c visual::animation. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::engine::base_item::set_animation_field ( const std::string& name, const visual::animation& value ) { return false; } // base_item::set_animation_field() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type \c audio::sample. * \param name The name of the field. * \param value The new value of the field. The item receiving this value must * release de memory with a delete at some time. * \return false if the field "name" is unknow, true otherwise. */ bool bear::engine::base_item::set_sample_field ( const std::string& name, audio::sample* value ) { return false; } // base_item::set_sample_field() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type \c visual::font. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::engine::base_item::set_font_field ( const std::string& name, visual::font value ) { return false; } // base_item::set_font_field() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type \c visual::color. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::engine::base_item::set_color_field ( const std::string& name, visual::color value ) { return false; } // base_item::set_color_field() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type \c list of unsigned integer. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::engine::base_item::set_u_integer_list_field ( const std::string& name, const std::vector& value ) { return false; } // base_item::set_u_integer_list_field() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type \c list of integer. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::engine::base_item::set_integer_list_field ( const std::string& name, const std::vector& value ) { return false; } // base_item::set_integer_list_field() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type \c list of real. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::engine::base_item::set_real_list_field ( const std::string& name, const std::vector& value ) { return false; } // base_item::set_real_list_field() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type \c list of bool. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::engine::base_item::set_bool_list_field ( const std::string& name, const std::vector& value ) { return false; } // base_item::set_bool_list_field() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type \c list of string. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::engine::base_item::set_string_list_field ( const std::string& name, const std::vector& value ) { return false; } // base_item::set_string_list_field() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type \c list of item. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::engine::base_item::set_item_list_field ( const std::string& name, const std::vector& value ) { return false; } // base_item::set_item_list_field() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type \c list of visual::sprite. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::engine::base_item::set_sprite_list_field ( const std::string& name, const std::vector& value ) { return false; } // base_item::set_sprite_list_field() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type \c list of visual::animation. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::engine::base_item::set_animation_list_field ( const std::string& name, const std::vector& value ) { return false; } // base_item::set_animation_list_field() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type \c list of audio::sample. * \param name The name of the field. * \param value The new value of the field. The item receiving this value must * release de memory with a delete at some time. * \return false if the field "name" is unknow, true otherwise. */ bool bear::engine::base_item::set_sample_list_field ( const std::string& name, const std::vector& value ) { return false; } // base_item::set_sample_list_field() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type \c list of visual::font. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::engine::base_item::set_font_list_field ( const std::string& name, const std::vector& value ) { return false; } // base_item::set_font_list_field() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type \c list of visual::color. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::engine::base_item::set_color_list_field ( const std::string& name, const std::vector& value ) { return false; } // base_item::set_color_list_field() /*----------------------------------------------------------------------------*/ /** * \brief Tell if the item is correctly initialized. */ bool bear::engine::base_item::is_valid() const { return true; } // base_item::is_valid() /*----------------------------------------------------------------------------*/ /** * \brief Get item's identifier. */ bear::engine::base_item::id_type bear::engine::base_item::get_id() const { return m_id; } // base_item::get_id() /*----------------------------------------------------------------------------*/ /** * \brief Get item's class name. */ const char* bear::engine::base_item::get_class_name() const { return "bear::engine::base_item"; } // base_item::get_class_name() /*----------------------------------------------------------------------------*/ /** * \brief Get the size of the derived class. */ std::size_t bear::engine::base_item::size_of() const { return sizeof(*this); } // base_item::size_of() /*----------------------------------------------------------------------------*/ /** * \brief Kill the item. * \pre m_owner != NULL */ void bear::engine::base_item::kill() { claw::logger << claw::log_verbose << "Killing id #" << m_id << std::endl; CLAW_PRECOND( !get_insert_as_static() ); if (!m_dying) { CLAW_PRECOND( m_layer != NULL ); m_dying = true; destroy(); m_layer->remove_item(*this); for ( life_chain_list::iterator it = m_life_chain.begin(); it != m_life_chain.end(); ++it ) if ( *it != (base_item*)NULL ) (*it)->kill(); m_life_chain.clear(); } } // base_item::kill() /*----------------------------------------------------------------------------*/ /** * \brief Indicates if the fonction "kill" has been called. */ bool bear::engine::base_item::is_dead() const { return m_dying; } // base_item::is_dead() /*----------------------------------------------------------------------------*/ /** * \brief Remove the data about the environment of the item. * \post m_layer == NULL * * This method is called automatically when the item is removed from a layer. */ void bear::engine::base_item::clear_environment() { clear_level(); m_layer = NULL; m_world = NULL; } // base_item::clear_environment() /*----------------------------------------------------------------------------*/ /** * \brief Tell the environment in which the item is. * \param the_level The level in which we are. * \pre m_layer == NULL * * This method is called automatically when the item is added in a layer. */ void bear::engine::base_item::set_environment( layer& the_layer ) { CLAW_PRECOND( m_layer == NULL ); set_level( the_layer.get_level() ); m_layer = &the_layer; } // base_item::set_environment() /*----------------------------------------------------------------------------*/ /** * \brief Tells if the item is in any layer. */ bool bear::engine::base_item::is_in_layer() const { return m_layer != NULL; } // base_item::is_in_layer() /*----------------------------------------------------------------------------*/ /** * \brief Tell if the item is in a given layer. * \param the_layer The layer where the item could be. */ bool bear::engine::base_item::is_in_layer ( const bear::engine::layer& the_layer ) const { return m_layer == &the_layer; } // base_item::is_in_layer() /*----------------------------------------------------------------------------*/ /** * \brief Set the position of the item on the Z axis. * \param z The new position. */ void bear::engine::base_item::set_z_position( int z ) { m_z_position = z; } // base_item::set_z_position() /*----------------------------------------------------------------------------*/ /** * \brief Get the position of the item on the Z axis. */ int bear::engine::base_item::get_z_position() const { return m_z_position; } // base_item::get_z_position() /*----------------------------------------------------------------------------*/ /** * \brief Set the z fixed statut. * \param fixed The new statut. */ void bear::engine::base_item::set_z_fixed( bool fixed ) { if (fixed) m_flags |= item_flag_z_fixed; else m_flags &= ~item_flag_z_fixed; } // base_item::set_z_fixed() /*----------------------------------------------------------------------------*/ /** * \brief Return the z fixed statut. */ bool bear::engine::base_item::is_z_fixed() const { return m_flags & item_flag_z_fixed; } // base_item::is_z_fixed() /*----------------------------------------------------------------------------*/ /** * \brief Sets the shader program to apply when rendering this item. * \param s The shader. */ void bear::engine::base_item::set_shader( visual::shader_program s ) { m_shader = s; } // base_item::set_shader() /*----------------------------------------------------------------------------*/ /** * \brief Removes the shader program applied when rendering this item. */ void bear::engine::base_item::clear_shader() { set_shader( visual::shader_program() ); } // base_item::clear_shader() /*----------------------------------------------------------------------------*/ /** * \brief Call this method before inserting the item in a level to ensure it * will be static in the world. */ void bear::engine::base_item::set_insert_as_static() { m_flags |= item_flag_insert_as_static; } // base_item::set_insert_as_static() /*----------------------------------------------------------------------------*/ /** * \brief Tell if this item has to be inserted as a static item in the level. */ bool bear::engine::base_item::get_insert_as_static() const { return m_flags & item_flag_insert_as_static; } // base_item::get_insert_as_static() /*----------------------------------------------------------------------------*/ /** * \brief Tell if this item is in a world. */ bool bear::engine::base_item::has_world() const { return m_world != NULL; } // base_item::has_world() /*----------------------------------------------------------------------------*/ /** * \brief Get the world in which this item is. */ const bear::engine::world& bear::engine::base_item::get_world() const { CLAW_PRECOND( has_world() ); return *m_world; } // base_item::get_world() /*----------------------------------------------------------------------------*/ /** * \brief Set the world in which this item is. * \param w The world. */ void bear::engine::base_item::set_world( const world& w ) { m_world = &w; } // base_item::set_world() /*----------------------------------------------------------------------------*/ /** * \brief Get the layer in which the item is. * \pre m_layer != NULL */ bear::engine::layer& bear::engine::base_item::get_layer() const { CLAW_PRECOND( m_layer != NULL ); return *m_layer; } // base_item::get_layer() /*----------------------------------------------------------------------------*/ /** * \brief Add an item in the same environment of \a this. * \pre m_layer != NULL */ void bear::engine::base_item::new_item( base_item& item ) const { CLAW_PRECOND( m_layer != NULL ); m_layer->add_item(item); } // base_item::new_item() /*----------------------------------------------------------------------------*/ /** * \brief Adds an item that must be killed when this item dies. * \param item The item to kill when this one dies. */ void bear::engine::base_item::kill_when_dying( base_item& item ) { clean_life_chain(); m_life_chain.push_back( item ); } // base_item::kill_when_dying() /*----------------------------------------------------------------------------*/ /** * \brief Gets the items that must be updated when this one is updated. * \param d (out) The items to update with this one. */ void bear::engine::base_item::get_dependent_items ( universe::physical_item::item_list& d ) const { super::get_dependent_items(d); for ( life_chain_list::const_iterator it = m_life_chain.begin(); it != m_life_chain.end(); ++it ) if ( *it != (base_item*)NULL ) d.push_back( it->get_item() ); } // base_item::get_dependent_items() /*----------------------------------------------------------------------------*/ /** * \brief Tell that this item is always displayed. * \param b Always displayed or not. */ void bear::engine::base_item::set_always_displayed(bool b) { if (m_layer != NULL) { if (b) m_layer->set_always_displayed(*this); else m_layer->unset_always_displayed(*this); } } // base_item::set_always_displayed() /*----------------------------------------------------------------------------*/ /** * \brief Add the loaders of this item class into a given loader map. * \param m The map in which the loaders are inserted. */ void bear::engine::base_item::populate_loader_map( item_loader_map& m ) { m.insert( base_item_loader(*this) ); } // base_item::populate_loader_map() /*----------------------------------------------------------------------------*/ /** * \brief A collision with an other item has occured. * \param that The other item of the collision. * \param info Some informations about the collision. */ void bear::engine::base_item::collision ( base_item& that, universe::collision_info& info ) { // nothing to do } // base_item::collision() /*----------------------------------------------------------------------------*/ /** * \brief Build the item. This method is called automatically by the owner. */ void bear::engine::base_item::build() { // nothing to do } // base_item::build() /*----------------------------------------------------------------------------*/ /** * \brief Tells the item it is in a layer now. */ void bear::engine::base_item::on_enters_layer() { // nothing to do } // base_item::on_enters_layer() /*----------------------------------------------------------------------------*/ /** * \brief Tells the item it has been removed from its layer. */ void bear::engine::base_item::on_leaves_layer() { // nothing to do } // base_item::on_leaves_layer() /*----------------------------------------------------------------------------*/ /** * \brief Destroy the item. This method is called automatically when the item * is killed. * \pre The item has been added in a layer. */ void bear::engine::base_item::destroy() { // nothing to do } // base_item::destroy() /*----------------------------------------------------------------------------*/ /** * \brief Give a string representation of the item. * \param str (out) The result of the convertion. */ void bear::engine::base_item::to_string( std::string& str ) const { std::ostringstream oss; oss << "id/class: " << m_id << '/' << get_class_name() << "\n"; oss << "pos_z: " << m_z_position << " (fixed =" << is_z_fixed() << ")\n"; universe::physical_item::to_string(str); str = oss.str() + str; } // base_item::to_string() /*----------------------------------------------------------------------------*/ /** * \brief Export the methods of the class. */ void bear::engine::base_item::init_exported_methods() { TEXT_INTERFACE_CONNECT_METHOD_1 ( base_item, set_z_position, void, int ); TEXT_INTERFACE_CONNECT_METHOD_0 ( base_item, kill, void ); TEXT_INTERFACE_CONNECT_PARENT_METHOD_0 ( base_item, universe::physical_item_state, remove_position_constraint_x, void ); TEXT_INTERFACE_CONNECT_PARENT_METHOD_0 ( base_item, universe::physical_item_state, remove_position_constraint_y, void ); TEXT_INTERFACE_CONNECT_PARENT_METHOD_0 ( base_item, universe::physical_item_state, add_position_constraint_x, void ); TEXT_INTERFACE_CONNECT_PARENT_METHOD_0 ( base_item, universe::physical_item_state, add_position_constraint_y, void ); TEXT_INTERFACE_CONNECT_PARENT_METHOD_2 ( base_item, universe::physical_item_state, set_speed, void, double, double ); TEXT_INTERFACE_CONNECT_PARENT_METHOD_2 ( base_item, universe::physical_item_state, set_center_of_mass, void, const universe::coordinate_type&, const universe::coordinate_type& ); TEXT_INTERFACE_CONNECT_PARENT_METHOD_2 ( base_item, universe::physical_item_state, set_top_left, void, const universe::coordinate_type&, const universe::coordinate_type& ); TEXT_INTERFACE_CONNECT_PARENT_METHOD_2 ( base_item, universe::physical_item_state, set_top_middle, void, const universe::coordinate_type&, const universe::coordinate_type& ); TEXT_INTERFACE_CONNECT_PARENT_METHOD_2 ( base_item, universe::physical_item_state, set_top_right, void, const universe::coordinate_type&, const universe::coordinate_type& ); TEXT_INTERFACE_CONNECT_PARENT_METHOD_2 ( base_item, universe::physical_item_state, set_bottom_left, void, const universe::coordinate_type&, const universe::coordinate_type& ); TEXT_INTERFACE_CONNECT_PARENT_METHOD_2 ( base_item, universe::physical_item_state, set_bottom_middle, void, const universe::coordinate_type&, const universe::coordinate_type& ); TEXT_INTERFACE_CONNECT_PARENT_METHOD_2 ( base_item, universe::physical_item_state, set_bottom_right, void, const universe::coordinate_type&, const universe::coordinate_type& ); TEXT_INTERFACE_CONNECT_PARENT_METHOD_2 ( base_item, universe::physical_item_state, set_left_middle, void, const universe::coordinate_type&, const universe::coordinate_type& ); TEXT_INTERFACE_CONNECT_PARENT_METHOD_2 ( base_item, universe::physical_item_state, set_right_middle, void, const universe::coordinate_type&, const universe::coordinate_type& ); TEXT_INTERFACE_CONNECT_PARENT_METHOD_1 ( base_item, universe::physical_item_state, set_horizontal_middle, void, universe::coordinate_type ); TEXT_INTERFACE_CONNECT_PARENT_METHOD_1 ( base_item, universe::physical_item_state, set_vertical_middle, void, universe::coordinate_type ); TEXT_INTERFACE_CONNECT_PARENT_METHOD_1 ( base_item, universe::physical_item_state, set_center_on, void, const universe::physical_item_state& ); } // god::init_exported_methods() /*----------------------------------------------------------------------------*/ /** * \brief Cast the other item and call collision(base_item, collision_info). * \param info Some informations about the collision. */ void bear::engine::base_item::collision( universe::collision_info& info ) { base_item* o = dynamic_cast(&info.other_item()); if (o) collision(*o, info); else claw::logger << claw::log_error << "bear::engine::base_item::collision(): Collision with an " << "item of type different of bear::engine::base_item." << std::endl; } // base_item::collision() /*----------------------------------------------------------------------------*/ /** * \brief Do one iteration in the progression of the item. * \param elapsed_time Elapsed time since the last call. */ void bear::engine::base_item::time_step( universe::time_type elapsed_time ) { BEAR_CREATE_SCOPED_TIMELOG( std::string("progress ") + get_class_name() ); super::time_step(elapsed_time); if (!m_dying) progress(elapsed_time); } // base_item::time_step() /*----------------------------------------------------------------------------*/ /** * \brief Removes the items that are already dead in m_life_chain. */ void bear::engine::base_item::clean_life_chain() { life_chain_list::iterator it = m_life_chain.begin(); while ( it != m_life_chain.end() ) if ( *it == (universe::physical_item*)NULL ) it = m_life_chain.erase( it ); else ++it; } // base_item::clean_life_chain() /*----------------------------------------------------------------------------*/ TEXT_INTERFACE_IMPLEMENT_METHOD_LIST( bear::engine::base_item ) plee-the-bear-20251226/bear-engine/core/src/engine/code/bitmap_font_loader.cpp000066400000000000000000000177721512343254000270140ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bitmap_font_loader class. * \author Julien Jorge */ #include "engine/bitmap_font_loader.hpp" #include "engine/level_globals.hpp" #include "engine/resource_pool.hpp" #include "engine/spritepos.hpp" #include "visual/font/bitmap_font.hpp" #include #include /*----------------------------------------------------------------------------*/ const std::string bear::engine::bitmap_font_loader::s_autofont_keyword( "autofont" ); const std::string bear::engine::bitmap_font_loader::s_options_keyword( "options" ); /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param f The file from which we load the file. * \param glob The level_globals in which we load the resources. */ bear::engine::bitmap_font_loader::bitmap_font_loader ( std::istream& f, level_globals& glob ) : m_file(f), m_level_globals(glob) { } // bitmap_font_loader::bitmap_font_loader() /*----------------------------------------------------------------------------*/ /** * \brief Loads the font. */ bear::visual::bitmap_charmap bear::engine::bitmap_font_loader::run() { const std::istream::pos_type p( m_file.tellg() ); const std::string line( get_next_line() ); m_file.seekg( p ); if ( line == s_autofont_keyword ) return read_autofont(); else return read_legacy(); } // bitmap_font_loader::run() /*----------------------------------------------------------------------------*/ /** * \brief Load the font in the legacy format. * * The legacy format is defined as follows: * * The file begins with two values giving the width and the height of the * characters. They are followed by the number of images in which we take * the characters, followed by the image resources. * * The remaining of the file consists in a description of the * characters. Each line has four fields. The first one is the character, * then come the X and Y position of the character in the image. The last * field is the zero-based index of the image resource where the * character is, in the list defined before. * * There must be no empty lines between the image resources and the lines * describing the characters. */ bear::visual::bitmap_charmap bear::engine::bitmap_font_loader::read_legacy() { visual::bitmap_charmap cs; unsigned int n = 0; std::istringstream parser(get_next_line()); parser >> cs.size.x >> cs.size.y; parser.clear(); parser.str( get_next_line() ); if( parser >> n ) cs.font_images.reserve(n); for ( std::size_t i=0; i!=n; ++i ) cs.font_images.push_back( m_level_globals.get_image(get_next_line()) ); std::string line = get_next_line(); while ( !line.empty() ) { unsigned int x, y; std::size_t i; char c; parser.clear(); parser.str(line); if ( (parser.get(c) >> x >> y >> i) && (i < n) ) { cs.characters[c].image_index = i; cs.characters[c].position.set(x, y); } line = get_next_line(); } if ( !( (cs.font_images.size() == n) && m_file.eof()) ) fail( "Bad font" ); return cs; } // bitmap_font_loader::read_legacy() /*----------------------------------------------------------------------------*/ /** * \brief Load the font in the autofont format. * * The format is defined as follows: * * The file begins with the "autofont" keyword. Then the images from which the * caracters are taken are listed, with one file per line. The font is built * from the .spritepos files associated with the images. For each entry whose * name is a single caracter, the corrisponding sprite is assigned to the * character in the font. * * The options of the font can be set at the end of the font file with the * "options" keyword. The single available option is "upper_to_lower", which * builds the glyphes for the lower case letters by assigning the ones of the * corresponding upper case letter. */ bear::visual::bitmap_charmap bear::engine::bitmap_font_loader::read_autofont() { visual::bitmap_charmap cs; std::string line(get_next_line()); if ( line != s_autofont_keyword ) fail( "Missing keyword: " + s_autofont_keyword ); line = get_next_line(); while ( !line.empty() && (line != s_options_keyword) ) { read_autofont_image(cs, line); line = get_next_line(); } if ( line == s_options_keyword ) read_autofont_options( cs ); return cs; } // bitmap_font_loader::read_autofont() /*----------------------------------------------------------------------------*/ /** * \brief Get the glyphes of the characters from the spritepos file associated * with a given image. * \param image_name The name of the image from which the sprites are taken. * \param cs The symbol table where the characters are saved. */ void bear::engine::bitmap_font_loader::read_autofont_image ( visual::bitmap_charmap& cs, const std::string& image_name ) const { const std::string spritepos_path ( m_level_globals.get_spritepos_path( image_name ) ); if ( spritepos_path.empty() ) fail( "No spritepos file for \"" + image_name + '"' ); std::stringstream f; resource_pool::get_instance().get_file(spritepos_path, f); const spritepos pos( f ); const std::size_t image_index( cs.font_images.size() ); cs.font_images.push_back( m_level_globals.get_image(image_name) ); for ( spritepos::const_iterator it=pos.begin(); it!=pos.end(); ++it ) if ( it->get_name().length() == 1 ) { const char c( it->get_name()[0] ); cs.characters[c].image_index = image_index; cs.characters[c].position.set ( it->get_clip().left(), it->get_clip().top() ); cs.size = it->get_clip().size(); } } // bitmap_font_loader::read_autofont_image() /*----------------------------------------------------------------------------*/ /** * \brief Read the options of the autofont file. * \param cs The symbol table where the characters are saved. */ void bear::engine::bitmap_font_loader::read_autofont_options ( visual::bitmap_charmap& cs ) { std::string line( get_next_line() ); while ( !line.empty() ) { if ( line == "upper_to_lower" ) upper_to_lower(cs); else fail( "Unknown option: \"" + line + '"' ); line = get_next_line(); } } // bitmap_font_loader::read_autofont_options() /*----------------------------------------------------------------------------*/ /** * \brief Builds the glyphes for the lower case characters from their upper case * counterpart. * \param cs The symbol table where the characters are saved. */ void bear::engine::bitmap_font_loader::upper_to_lower ( visual::bitmap_charmap& cs ) const { visual::bitmap_charmap::character_map new_characters; typedef visual::bitmap_charmap::character_map::const_iterator character_map_iterator; for ( character_map_iterator it=cs.characters.begin(); it!=cs.characters.end(); ++it ) { charset::char_type c( std::tolower( it->first ) ); if ( cs.characters.find(c) == cs.characters.end() ) new_characters[c] = it->second; } cs.characters.insert( new_characters.begin(), new_characters.end() ); } // bitmap_font_loader::upper_to_lower() /*----------------------------------------------------------------------------*/ /** * \brief Get the next non empty line from the file, if any. */ std::string bear::engine::bitmap_font_loader::get_next_line() const { std::string result; while ( result.empty() && getline(m_file, result) ); return result; } // bitmap_font_loader::get_next_line() /*----------------------------------------------------------------------------*/ /** * \brief Process an error in the processing of the font file. * \param msg The message describing the error. */ void bear::engine::bitmap_font_loader::fail( const std::string& msg ) const { throw claw::exception(msg); } // bitmap_font_loader::fail() plee-the-bear-20251226/bear-engine/core/src/engine/code/compiled_file.cpp000066400000000000000000000213171512343254000257450ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::engine::compiled_file class. * \author Julien Jorge */ #include #include #include "engine/compiled_file.hpp" #include /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param f The file from which we will read. * \param text True if we use the file as a text file, false for binary. */ bear::engine::compiled_file::compiled_file( std::istream& f, bool text ) : m_file(f), m_text(text) { } // compiled_file::compiled_file() /*----------------------------------------------------------------------------*/ /** * \brief Read a string from the file. * \param s The string to read. */ bear::engine::compiled_file& bear::engine::compiled_file::operator>>( std::string& s ) { if (m_text) input_string_as_text(s); else input_string_as_binary(s); return *this; } // compiled_file::operator>>() [string] /*----------------------------------------------------------------------------*/ /** * \brief Read an long from the file. * \param i The long to read. */ bear::engine::compiled_file& bear::engine::compiled_file::operator>>( long& i ) { if (m_text) input_long_as_text(i); else input_long_as_binary(i); return *this; } // compiled_file::operator>>() [long] /*----------------------------------------------------------------------------*/ /** * \brief Read an unsigned long from the file. * \param i The long to read. */ bear::engine::compiled_file& bear::engine::compiled_file::operator>>( unsigned long& i ) { if (m_text) input_unsigned_long_as_text(i); else input_unsigned_long_as_binary(i); return *this; } // compiled_file::operator>>() [unsigned long] /*----------------------------------------------------------------------------*/ /** * \brief Read an integer from the file. * \param i The integer to read. */ bear::engine::compiled_file& bear::engine::compiled_file::operator>>( int& i ) { if (m_text) input_integer_as_text(i); else input_integer_as_binary(i); return *this; } // compiled_file::operator>>() [int] /*----------------------------------------------------------------------------*/ /** * \brief Read an unsigned integer from the file. * \param i The integer to read. */ bear::engine::compiled_file& bear::engine::compiled_file::operator>>( unsigned int& i ) { if (m_text) input_unsigned_integer_as_text(i); else input_unsigned_integer_as_binary(i); return *this; } // compiled_file::operator>>() [unsigned int] /*----------------------------------------------------------------------------*/ /** * \brief Read a real from the file. * \param r The value to read. */ bear::engine::compiled_file& bear::engine::compiled_file::operator>>( double& r ) { if (m_text) input_real_as_text(r); else input_real_as_binary(r); return *this; } // compiled_file::operator>>() [real] /*----------------------------------------------------------------------------*/ /** * \brief Read a boolean from the file. * \param b The value to read. */ bear::engine::compiled_file& bear::engine::compiled_file::operator>>( bool& b ) { if (m_text) input_bool_as_text(b); else input_bool_as_binary(b); return *this; } // compiled_file::operator>>() [bool] /*----------------------------------------------------------------------------*/ /** * \brief Convert to a boolean indicating if the stream is ok. */ bear::engine::compiled_file::operator bool() const { return !!m_file; } // compiled_file::operator bool() /*----------------------------------------------------------------------------*/ /** * \brief Read a string from the file. * \param s The string to read. */ void bear::engine::compiled_file::input_string_as_binary( std::string& s ) { unsigned int len; m_file.read( reinterpret_cast(&len), sizeof(len) ); std::string::value_type* buffer = new char[len+1]; m_file.read( buffer, sizeof(std::string::value_type) * len ); buffer[len] = '\0'; s = buffer; delete[] buffer; } // compiled_file::input_string_as_binary() /*----------------------------------------------------------------------------*/ /** * \brief Read a string from the file. * \param s The string to read. */ void bear::engine::compiled_file::input_string_as_text( std::string& s ) { claw::text::getline(m_file, s); } // compiled_file::input_string_as_text() /*----------------------------------------------------------------------------*/ /** * \brief Read an long from the file. * \param i The long to read. */ void bear::engine::compiled_file::input_long_as_binary( long& i ) { m_file.read( reinterpret_cast(&i), sizeof(i) ); } // compiled_file::input_long_as_binary() /*----------------------------------------------------------------------------*/ /** * \brief Read an long from the file. * \param i The long to read. */ void bear::engine::compiled_file::input_long_as_text( long& i ) { m_file >> i; m_file.ignore( std::numeric_limits::max(), '\n' ); } // compiled_file::input_long_as_text() /*----------------------------------------------------------------------------*/ /** * \brief Read an unsigned long from the file. * \param i The long to read. */ void bear::engine::compiled_file::input_unsigned_long_as_binary( unsigned long& i ) { m_file.read( reinterpret_cast(&i), sizeof(i) ); } // compiled_file::input_unsigned_long_as_binary() /*----------------------------------------------------------------------------*/ /** * \brief Read an unsigned long from the file. * \param i The long to read. */ void bear::engine::compiled_file::input_unsigned_long_as_text( unsigned long& i ) { m_file >> i; m_file.ignore( std::numeric_limits::max(), '\n' ); } // compiled_file::input_unsigned_long_as_text() /*----------------------------------------------------------------------------*/ /** * \brief Read an integer from the file. * \param i The integer to read. */ void bear::engine::compiled_file::input_integer_as_binary( int& i ) { m_file.read( reinterpret_cast(&i), sizeof(i) ); } // compiled_file::input_integer_as_binary() /*----------------------------------------------------------------------------*/ /** * \brief Read an integer from the file. * \param i The integer to read. */ void bear::engine::compiled_file::input_integer_as_text( int& i ) { m_file >> i; m_file.ignore( std::numeric_limits::max(), '\n' ); } // compiled_file::input_integer_as_text() /*----------------------------------------------------------------------------*/ /** * \brief Read an unsigned integer from the file. * \param i The integer to read. */ void bear::engine::compiled_file::input_unsigned_integer_as_binary( unsigned int& i ) { m_file.read( reinterpret_cast(&i), sizeof(i) ); } // compiled_file::input_unsigned_integer_as_binary() /*----------------------------------------------------------------------------*/ /** * \brief Read an unsigned integer from the file. * \param i The integer to read. */ void bear::engine::compiled_file::input_unsigned_integer_as_text( unsigned int& i ) { m_file >> i; m_file.ignore( std::numeric_limits::max(), '\n' ); } // compiled_file::input_unsigned_integer_as_text() /*----------------------------------------------------------------------------*/ /** * \brief Read a real from the file. * \param r The real to read. */ void bear::engine::compiled_file::input_real_as_binary( double& r ) { m_file.read( reinterpret_cast(&r), sizeof(r) ); } // compiled_file::input_real_as_binary() /*----------------------------------------------------------------------------*/ /** * \brief Read a real from the file. * \param r The real to read. */ void bear::engine::compiled_file::input_real_as_text( double& r ) { m_file >> r; m_file.ignore( std::numeric_limits::max(), '\n' ); } // compiled_file::input_real_as_text() /*----------------------------------------------------------------------------*/ /** * \brief Read a boolean from the file. * \param b The boolean to read. */ void bear::engine::compiled_file::input_bool_as_binary( bool& b ) { m_file.read( reinterpret_cast(&b), sizeof(b) ); } // compiled_file::input_bool_as_binary() /*----------------------------------------------------------------------------*/ /** * \brief Read a bool from the file. * \param b The bool to read. */ void bear::engine::compiled_file::input_bool_as_text( bool& b ) { m_file >> b; m_file.ignore( std::numeric_limits::max(), '\n' ); } // compiled_file::input_bool_as_text() plee-the-bear-20251226/bear-engine/core/src/engine/code/game.cpp000066400000000000000000000456741512343254000240770ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::engine::game class. * \author Julien Jorge */ #include "engine/game.hpp" #include "engine/game_local_client.hpp" #include "engine/variable/variable_saver.hpp" #include /*----------------------------------------------------------------------------*/ bear::engine::game* bear::engine::game::s_instance(NULL); /*----------------------------------------------------------------------------*/ /** * \brief Get the instance of the game. * \pre s_instance != NULL */ bear::engine::game& bear::engine::game::get_instance() { CLAW_PRECOND( s_instance != NULL ); return *s_instance; } // game::get_instance() /*----------------------------------------------------------------------------*/ /** * \brief Print the options of the program. */ void bear::engine::game::print_help() { game_local_client::print_help(); } // game::print_help() /*----------------------------------------------------------------------------*/ /** * \brief Constructs the game from the command line arguments. * \param argc Number of program arguments. * \param argv Program arguments. */ bear::engine::game::game( int& argc, char** &argv ) { CLAW_PRECOND( s_instance == NULL ); s_instance = this; m_game = new game_local_client(argc, argv); } // game::game() /*----------------------------------------------------------------------------*/ /** * \brief Constructs the game from a pre built description. * \param descripton The description of the game to run. */ bear::engine::game::game( const game_description& description ) { CLAW_PRECOND( s_instance == NULL ); s_instance = this; m_game = new game_local_client( description ); } // game::game() /*----------------------------------------------------------------------------*/ /** * \brief Destructor. */ bear::engine::game::~game() { delete m_game; s_instance = NULL; } // game::~game() /*----------------------------------------------------------------------------*/ /** * \brief Run the game. */ void bear::engine::game::run() { m_game->run(); } // game::run() /*----------------------------------------------------------------------------*/ /** * \brief Tells the running game to stop its activities. */ void bear::engine::game::sleep() { m_game->sleep(); } // game::sleep() /*----------------------------------------------------------------------------*/ /** * \brief Tells the running game to come back to work. */ void bear::engine::game::wake_up() { m_game->wake_up(); } // game::wake_up() /*----------------------------------------------------------------------------*/ /** * \brief Get the time step between to progress on the level. */ bear::systime::milliseconds_type bear::engine::game::get_time_step() const { return m_game->get_time_step(); } // game::get_time_step() /*----------------------------------------------------------------------------*/ /** * Set the scale of the time (ie. how many ingame seconds it takes for a real * second. * \param s The scale. If s is less or equal to zero, its value is ignored and * the scale is set to 1. */ void bear::engine::game::set_time_scale( double s ) { m_game->set_time_scale(s); } // game::set_time_scale() /*----------------------------------------------------------------------------*/ /** * Get the scale of the time. */ double bear::engine::game::get_time_scale() const { return m_game->get_time_scale(); } // game::get_time_scale() /*----------------------------------------------------------------------------*/ /** * \brief Returns the access to the network. */ bear::engine::game_network& bear::engine::game::get_network() { return m_game->get_network(); } // game::get_network() /*----------------------------------------------------------------------------*/ /** * \brief Returns the translator for the plugins. */ bear::engine::translator bear::engine::game::get_translator() const { return m_game->get_translator(); } // game::get_translator() /*----------------------------------------------------------------------------*/ /** * \brief Sets the translator for the plugins. * \param t The new translator. */ void bear::engine::game::set_translator( const bear::engine::translator& t ) { return m_game->set_translator( t ); } // game::set_translator() /*----------------------------------------------------------------------------*/ /** * \brief Turn on/off the dumb rendering mode. * \param b Tell if we must activate the dumb rendering mode. */ void bear::engine::game::set_dumb_rendering( bool b ) { m_game->set_dumb_rendering(b); } // game::set_dumb_rendering() /*----------------------------------------------------------------------------*/ /** * \brief Tells if the dumb rendering mode is active. */ bool bear::engine::game::get_dumb_rendering() const { return m_game->get_dumb_rendering(); } // game::get_dumb_rendering() /*----------------------------------------------------------------------------*/ /** * \brief Turn on/off the full screen mode. * \param full Tell if we must activate the fullscreen mode. */ void bear::engine::game::set_fullscreen( bool full ) { m_game->set_fullscreen(full); } // game::set_fullscreen() /*----------------------------------------------------------------------------*/ /** * \brief Return the full screen mode. */ bool bear::engine::game::get_fullscreen() const { return m_game->get_fullscreen(); } // game::get_fullscreen() /*----------------------------------------------------------------------------*/ /** * \brief Toggle the status of the fullscreen mode. */ void bear::engine::game::toggle_fullscreen() { set_fullscreen( !get_fullscreen() ); } // game::toggle_fullscreen() /*----------------------------------------------------------------------------*/ /** * \brief Turn on/off the overview mode. * \param mode Tell if we must activate the overview mode. */ void bear::engine::game::set_overview_mode( bool mode ) { m_game->set_overview_mode(mode); } // game::set_overview_mode() /*----------------------------------------------------------------------------*/ /** * \brief Return the state of the overview mode. */ bool bear::engine::game::get_overview_mode() const { return m_game->get_overview_mode(); } // game::get_overview_mode() /*----------------------------------------------------------------------------*/ /** * \brief Toggle the status of the overview mode. */ void bear::engine::game::toggle_overview_mode() { set_overview_mode( !get_overview_mode() ); } // game::toggle_overview_mode() /*----------------------------------------------------------------------------*/ /** * \brief Mute/unmute the sounds. * \param m The mute status. */ void bear::engine::game::set_sound_muted( bool m ) { m_game->set_sound_muted(m); } // game::set_sound_muted() /*----------------------------------------------------------------------------*/ /** * \brief Tell if the sound is muted. */ bool bear::engine::game::get_sound_muted() const { return m_game->get_sound_muted(); } // game::get_sound_muted() /*----------------------------------------------------------------------------*/ /** * \brief Change the "mute" status of the sounds. */ void bear::engine::game::toggle_sound_muted() { set_sound_muted( !get_sound_muted() ); } // game::toggle_sound_muted() /*----------------------------------------------------------------------------*/ /** * \brief Set the volume of the sounds. * \param v The volume. */ void bear::engine::game::set_sound_volume( double v ) { m_game->set_sound_volume(v); } // game::set_sound_volume() /*----------------------------------------------------------------------------*/ /** * \brief Get the volume of the sounds. */ double bear::engine::game::get_sound_volume() const { return m_game->get_sound_volume(); } // game::get_sound_colume() /*----------------------------------------------------------------------------*/ /** * \brief Mute/unmute the music. * \param m The mute status. */ void bear::engine::game::set_music_muted( bool m ) { m_game->set_music_muted(m); } // game::set_music_muted() /*----------------------------------------------------------------------------*/ /** * \brief Tell if the music is muted. */ bool bear::engine::game::get_music_muted() const { return m_game->get_music_muted(); } // game::get_music_muted() /*----------------------------------------------------------------------------*/ /** * \brief Change the "mute" status of the music. */ void bear::engine::game::toggle_music_muted() { set_music_muted( !get_music_muted() ); } // game::toggle_music_muted() /*----------------------------------------------------------------------------*/ /** * \brief Set the volume of the musics. * \param v The volume. */ void bear::engine::game::set_music_volume( double v ) { m_game->set_music_volume(v); } // game::set_music_volume() /*----------------------------------------------------------------------------*/ /** * \brief Get the volume of the musics. */ double bear::engine::game::get_music_volume() const { return m_game->get_music_volume(); } // game::get_music_volume() /*----------------------------------------------------------------------------*/ /** * \brief Take a shot of the screen. * \param img The image in which we save the screen. */ void bear::engine::game::screenshot( claw::graphic::image& img ) const { m_game->screenshot( img ); } // game::screenshot() bear::visual::capture bear::engine::game::screen_capture() const { return m_game->screen_capture(); } /*----------------------------------------------------------------------------*/ /** * \brief Take a shot of the whole level. * \param img The image in which we save the level. */ void bear::engine::game::levelshot( claw::graphic::image& img ) const { m_game->levelshot( img ); } // game::levelshot() /*----------------------------------------------------------------------------*/ /** * \brief End the game. */ void bear::engine::game::end() { m_game->end(); } // game::end() #include "engine/variable/variable_list_reader.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Give the name of a level to load as soon as possible. * \param path The path of the level to load. */ void bear::engine::game::set_waiting_level( const std::string& path ) { m_game->set_waiting_level(path); } // game::set_waiting_level() /*----------------------------------------------------------------------------*/ /** * \brief Set the level to run as soon as possible. * \param the_level The level to run as soon as possible. */ void bear::engine::game::set_waiting_level( level* the_level ) { m_game->set_waiting_level(the_level); } // game::set_waiting_level() /*----------------------------------------------------------------------------*/ /** * \brief Give the name of a level to load as soon as possible but keep the * current level in memory for future restoration. * \param path The path of the level to load. */ void bear::engine::game::push_level( const std::string& path ) { m_game->push_level(path); } // game::push_level() /*----------------------------------------------------------------------------*/ /** * \brief Restore the level at the top of the stack. */ void bear::engine::game::pop_level() { m_game->pop_level(); } // game::pop_level() /*----------------------------------------------------------------------------*/ /** * \brief Get the size of the screen. */ claw::math::coordinate_2d bear::engine::game::get_screen_size() const { return m_game->get_screen_size(); } // game::get_screen_size() /*----------------------------------------------------------------------------*/ /** * \brief Get the size of the main window. */ claw::math::coordinate_2d bear::engine::game::get_window_size() const { return m_game->get_window_size(); } // game::get_window_size() /*----------------------------------------------------------------------------*/ /** * \brief Get the margin of the active area around the camera. */ double bear::engine::game::get_active_area_margin() const { return m_game->get_active_area_margin(); } // game::get_active_area_margin() /*----------------------------------------------------------------------------*/ /** * \brief Gets an abstraction of the filesystem that can be used by the game. */ bear::engine::game_filesystem bear::engine::game::get_game_filesystem() const { return m_game->get_game_filesystem(); } // game::get_game_filesystem() /*----------------------------------------------------------------------------*/ /** * \brief Sets the abstraction of the filesystem that can be used by the game. * \param f The abstract file system. */ void bear::engine::game::set_game_filesystem( const game_filesystem& f ) { m_game->set_game_filesystem(f); } // game::set_game_filesystem() /*----------------------------------------------------------------------------*/ /** * \brief Get the value of a global variable. * \param val (in/out) The variable for which we want the value. */ void bear::engine::game::get_game_variable( base_variable& val ) const { m_game->get_game_variable(val); } // game::get_game_variable() /*----------------------------------------------------------------------------*/ /** * \brief Get the game variables whose name match a given regular * expression; * \param vars The list of matched game variables. * \param pattern The expression that has to be matched by the variable names. */ void bear::engine::game::get_game_variables ( var_map& vars, const std::string& pattern ) { m_game->get_game_variables(vars, pattern); } // game::get_game_variables() /*----------------------------------------------------------------------------*/ /** * \brief Set the value of a global variable. * \param val (in/out) The variable for which we set the value. */ void bear::engine::game::set_game_variable( const base_variable& val ) { m_game->set_game_variable(val); } // game::set_game_variable() /*----------------------------------------------------------------------------*/ /** * \brief Set several game variables at once. * \param vars The variables. */ void bear::engine::game::set_game_variables( const var_map& vars ) { m_game->set_game_variables(vars); } // game::set_game_variables() /*----------------------------------------------------------------------------*/ /** * \brief Erase the variables whose name match a given pattern. * \param pattern The pattern to match. */ void bear::engine::game::erase_game_variables( const std::string& pattern ) { m_game->erase_game_variables(pattern); } // game::erase_game_variables() /*----------------------------------------------------------------------------*/ /** * \brief Tell if a given variable exists in the game. * \param val (in/out) The variable to check. */ bool bear::engine::game::game_variable_exists( const base_variable& val ) const { return m_game->game_variable_exists(val); } // game::game_variable_exists() /*----------------------------------------------------------------------------*/ /** * \brief Save all the game variables whose name match a given regular * expression; * \param os The stream in which the variables are saved. * \param pattern The expression that has to be matched by the variable names. */ void bear::engine::game::save_game_variables ( std::ostream& os, const std::string& pattern ) { var_map vars; m_game->get_all_game_variables(vars); vars.for_each( variable_saver(os, boost::regex(pattern)) ); } // game::save_game_variables() /*----------------------------------------------------------------------------*/ /** * \brief Add a listener to follow the change on a game variable of type int. * \param name The name of the variable. * \param f The listener. */ boost::signals2::connection bear::engine::game::listen_int_variable_change ( const std::string& name, const boost::function& f ) { return m_game->listen_int_variable_change( name, f ); } // game::listen_int_variable_change() /*----------------------------------------------------------------------------*/ /** * \brief Add a listener to follow the change on a game variable of type * unsigned int. * \param name The name of the variable. * \param f The listener. */ boost::signals2::connection bear::engine::game::listen_uint_variable_change ( const std::string& name, const boost::function& f ) { return m_game->listen_uint_variable_change( name, f ); } // game::listen_uint_variable_change() /*----------------------------------------------------------------------------*/ /** * \brief Add a listener to follow the change on a game variable of type bool. * \param name The name of the variable. * \param f The listener. */ boost::signals2::connection bear::engine::game::listen_bool_variable_change ( const std::string& name, const boost::function& f ) { return m_game->listen_bool_variable_change( name, f ); } // game::listen_bool_variable_change() /*----------------------------------------------------------------------------*/ /** * \brief Add a listener to follow the change on a game variable of type double. * \param name The name of the variable. * \param f The listener. */ boost::signals2::connection bear::engine::game::listen_double_variable_change ( const std::string& name, const boost::function& f ) { return m_game->listen_double_variable_change( name, f ); } // game::listen_double_variable_change() /*----------------------------------------------------------------------------*/ /** * \brief Add a listener to follow the change on a game variable of type string. * \param name The name of the variable. * \param f The listener. */ boost::signals2::connection bear::engine::game::listen_string_variable_change ( const std::string& name, const boost::function& f ) { return m_game->listen_string_variable_change( name, f ); } // game::listen_string_variable_change() /*----------------------------------------------------------------------------*/ /** * \brief Get the name of the game. */ const std::string& bear::engine::game::get_name() const { return m_game->get_name(); } // game::get_name() /*----------------------------------------------------------------------------*/ /** * \brief Send a variable to the destination page. * \param operation The name of the operation stored in the stats. * \param name The name of the variable. * \param value The value of the variable. */ void bear::engine::game::send_data ( std::string operation, std::string name, std::string value ) const { m_game->send_data( operation, name, value ); } // game::send_data() /*----------------------------------------------------------------------------*/ /** * \brief Send some variables to the destination. * \param operation The name of the operation stored in the stats. * \param vars The variables to send. */ void bear::engine::game::send_data ( std::string operation, std::list vars ) const { m_game->send_data(operation, vars); } // game::send_data() plee-the-bear-20251226/bear-engine/core/src/engine/code/game_description.cpp000066400000000000000000000233461512343254000264720ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::engine::game_description class. * \author Julien Jorge */ #include "engine/game_description.hpp" #include "bear_gettext.hpp" #include #include #include #include #include #include /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ bear::engine::game_description::game_description() : m_game_name("Anonymous game"), m_screen_size(640, 480), m_active_area_margin(500), m_use_dumb_rendering(false) { } // game_description::game_description() /*----------------------------------------------------------------------------*/ /** * \brief Constructs the description from the command line arguments. * \param arg The arguments received on the command line. * \throws claw::exception if an argument could not be parsed. The message of * the exception tells which argument has a bad value. */ bear::engine::game_description::game_description ( const claw::arguments_table& arg ) : m_game_name("Anonymous game"), m_screen_size(640, 480), m_active_area_margin(500), m_use_dumb_rendering(false) { if ( arg.has_value("--game-name") ) set_game_name( arg.get_string("--game-name") ); if ( arg.has_value("--active-area") ) { if ( arg.only_integer_values("--active-area") ) set_active_area_margin( arg.get_integer("--active-area") ); else throw claw::exception ( "--active-area=" + arg.get_string("--active-area" )); } set_dumb_rendering ( arg.get_bool( "--dumb-rendering" ) && !arg.get_bool( "--no-dumb-rendering" ) ); if ( arg.has_value("--screen-height") ) { if ( arg.only_integer_values("--screen-height") ) set_screen_height( arg.get_integer("--screen-height") ); else throw claw::exception ( "--screen-height=" + arg.get_string("--screen-height") ); } if ( arg.has_value("--screen-width") ) { if ( arg.only_integer_values("--screen-width") ) set_screen_width( arg.get_integer("--screen-width") ); else throw claw::exception ( "--screen-width=" + arg.get_string("--screen-width") ); } if ( arg.has_value("--start-level") ) set_start_level( arg.get_string("--start-level") ); add_item_library( arg.get_all_of_string("--item-library") ); add_resources_path( arg.get_all_of_string("--data-path") ); } // game_description::game_description() /*----------------------------------------------------------------------------*/ /** * \brief Fills a command line argument table with the argument supported by the * constructors of this class. * \param arg The argument table in which we add the arguments. */ void bear::engine::game_description::get_valid_command_line_arguments ( claw::arguments_table& arg ) { arg.add_long ( "--game-name", bear_gettext("The name of the game."), true, bear_gettext("string") ); arg.add_long ( "--active-area", bear_gettext ("The margin around the camera in which we check for activity."), true, bear_gettext("integer") ); arg.add_long ( "--screen-width", bear_gettext("The width of the screen."), true, bear_gettext("integer") ); arg.add_long ( "--screen-height", bear_gettext("The height of the screen."), true, bear_gettext("integer") ); arg.add_long ( "--data-path", bear_gettext("Path to the directory containing the data of the game."), true, bear_gettext("path") ); arg.add_long ( "--dumb-rendering", bear_gettext("Tells to use the dumbest rendering procedure."), true ); arg.add_long ( "--no-dumb-rendering", bear_gettext("Tells not to use the dumbest rendering procedure."), true ); arg.add_long ( "--item-library", bear_gettext("Path to a library containing items for the game."), true, bear_gettext("path") ); arg.add_long ( "--start-level", bear_gettext("The path of the first level to run."), true, bear_gettext("string") ); } // game_description::get_valid_command_line_arguments() /*----------------------------------------------------------------------------*/ /** * \brief Get the name of the first level to load. */ const std::string& bear::engine::game_description::start_level() const { return m_start_level; } // game_description::start_level() /*----------------------------------------------------------------------------*/ /** * \brief Get the name of the game. */ const std::string& bear::engine::game_description::game_name() const { return m_game_name; } // game_description::game_name() /*----------------------------------------------------------------------------*/ /** * \brief Get the size of the screen. */ const claw::math::coordinate_2d& bear::engine::game_description::screen_size() const { return m_screen_size; } // game_description::screen_size() /*----------------------------------------------------------------------------*/ /** * \brief Tells if we use dumb rendering by default. */ bool bear::engine::game_description::dumb_rendering() const { return m_use_dumb_rendering; } // game_description::dumb_rendering() /*----------------------------------------------------------------------------*/ /** * \brief Get the margin of the active area around the screen. */ double bear::engine::game_description::active_area_margin() const { return m_active_area_margin; } // game_description::active_area_margin() /*----------------------------------------------------------------------------*/ /** * \brief Get the paths to the forder containing the resources. */ const bear::engine::game_description::string_list& bear::engine::game_description::resources_path() const { return m_resources_path; } // game_description::resources_path() /*----------------------------------------------------------------------------*/ /** * \brief Get the paths to the libraries to link to. */ const bear::engine::game_description::string_list& bear::engine::game_description::libraries() const { return m_libraries; } // game_description::libraries() /*----------------------------------------------------------------------------*/ /** * \brief Set the name of the game. * \param value The name of the game. */ void bear::engine::game_description::set_game_name( const std::string& value ) { m_game_name = value; } // game_description::set_game_name() /*----------------------------------------------------------------------------*/ /** * \brief Set the width of the screen. * \param value The width of the screen. */ void bear::engine::game_description::set_screen_width( unsigned int value ) { m_screen_size.x = value; } // game_description::set_screen_width() /*----------------------------------------------------------------------------*/ /** * \brief Set the height of the screen. * \param value The height of the screen. */ void bear::engine::game_description::set_screen_height( unsigned int value ) { m_screen_size.y = value; } // game_description::set_screen_height() /*----------------------------------------------------------------------------*/ /** * \brief Tells to use the dumb rendering procedure. * \param v Tells to use it or not. */ void bear::engine::game_description::set_dumb_rendering( bool v ) { m_use_dumb_rendering = v; } // game_description::set_dumb_rendering() /*----------------------------------------------------------------------------*/ /** * \brief Set the margin of the active_area around the screen. * \param value The size of the margin. */ void bear::engine::game_description::set_active_area_margin ( unsigned int value ) { m_active_area_margin = value; } // game_description::set_active_area_margin() /*----------------------------------------------------------------------------*/ /** * \brief Adds a path to a directory where the game's resources can be found. * \param value The path to the resources' directory. */ void bear::engine::game_description::add_resources_path ( const std::string& value ) { m_resources_path.push_back( value ); } // game_description::add_resources_path() /*----------------------------------------------------------------------------*/ /** * \brief Adds the paths to the directory where the game's resources can be * found. * \param value The paths to the resources' directories. */ void bear::engine::game_description::add_resources_path ( const string_list& value ) { m_resources_path.insert( m_resources_path.end(), value.begin(), value.end() ); } // game_description::add_resources_path() /*----------------------------------------------------------------------------*/ /** * \brief Adds a library that must be loaded to launch the game. * \param value The name of the library. */ void bear::engine::game_description::add_item_library ( const std::string& value ) { m_libraries.push_back( value ); } // game_description::add_item_library() /*----------------------------------------------------------------------------*/ /** * \brief Adds the libraries that must be loaded to launch the game. * \param value The names of the libraries. */ void bear::engine::game_description::add_item_library ( const string_list& value ) { m_libraries.insert( m_libraries.end(), value.begin(), value.end() ); } // game_description::add_item_library() /*----------------------------------------------------------------------------*/ /** * \brief Set the name of the first level. * \param value The name of the first level. */ void bear::engine::game_description::set_start_level( const std::string& value ) { m_start_level = value; } // game_description::set_start_level() plee-the-bear-20251226/bear-engine/core/src/engine/code/game_initializer.cpp000066400000000000000000000045701512343254000264700ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::engine::game_initializer class. * \author Julien Jorge */ #include "engine/game_initializer.hpp" #include /*----------------------------------------------------------------------------*/ /** * \brief Returns the single instance of this class. */ bear::engine::game_initializer& bear::engine::game_initializer::get_instance() { return super::get_instance(); } // game_initializer::get_instance() /*----------------------------------------------------------------------------*/ /** * \brief Sets the function to call when initializing the game. * \param f The function. */ bool bear::engine::game_initializer::set_init( init_game_function_type f ) { if ( m_init == NULL ) { m_init = f; return true; } return false; } // game_initializer::set_init() /*----------------------------------------------------------------------------*/ /** * \brief Sets the function to call when ending the game. * \param f The function. */ bool bear::engine::game_initializer::set_end( end_game_function_type f ) { if ( m_end == NULL ) { m_end = f; return true; } return false; } // game_initializer::set_end() /*----------------------------------------------------------------------------*/ /** * \brief Calls the function initializing the game, if any, and unsets the init * function. */ void bear::engine::game_initializer::init() { if ( m_init != NULL ) { m_init(); m_init = NULL; } } // game_initializer::init() /*----------------------------------------------------------------------------*/ /** * \brief Calls the function of the end of the game, if any, and unsets the * ending function. */ void bear::engine::game_initializer::end() { if ( m_end != NULL ) { m_end(); m_end = NULL; } } // game_initializer::end() /*----------------------------------------------------------------------------*/ /** * \brief Constructs a game_initializer with the default values: no init * function nor ending function. */ bear::engine::game_initializer::game_initializer() : m_init(NULL), m_end(NULL) { } // game_initializer::game_initializer() plee-the-bear-20251226/bear-engine/core/src/engine/code/game_local_client.cpp000066400000000000000000001406161512343254000265770ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::engine::game_local_client class. * \author Julien Jorge */ #include "engine/game_local_client.hpp" #include "debug/timing_log.hpp" #include "engine/game_action/game_action.hpp" #include "engine/game_action/game_action_load_level.hpp" #include "engine/game_action/game_action_pop_level.hpp" #include "engine/game_action/game_action_push_level.hpp" #include "engine/game_action/game_action_set_current_level.hpp" #include "engine/compiled_file.hpp" #include "engine/game_initializer.hpp" #include "engine/level.hpp" #include "engine/level_globals.hpp" #include "engine/level_loader.hpp" #include "engine/resource_pool.hpp" #include "engine/version.hpp" #include "engine/system/android_game_filesystem.hpp" #include "engine/system/android_system_event_manager.hpp" #include "engine/system/default_game_filesystem.hpp" #include "engine/system/default_system_event_manager.hpp" #include "engine/system/freedesktop_game_filesystem.hpp" #include "engine/variable/base_variable.hpp" #include "engine/variable/variable_eraser.hpp" #include "engine/variable/variable_copy.hpp" #include "input/display_projection.hpp" #include "input/system.hpp" #include "bear_gettext.hpp" #include #include #include #include #include #include #include #include /*----------------------------------------------------------------------------*/ /** * \brief Print the options of the program. */ void bear::engine::game_local_client::print_help() { get_arguments_table().help(); } // game_local_client::print_help() /*----------------------------------------------------------------------------*/ /** * \brief Constructs the game from the command line arguments. * \param argc Number of program arguments. * \param argv Program arguments. */ bear::engine::game_local_client::game_local_client( int& argc, char** &argv ) { constructor_common_init_members(); if ( !check_arguments(argc, argv) ) m_status = status_quit; else constructor_common_init(); } // game_local_client::game_local_client() /*----------------------------------------------------------------------------*/ /** * \brief Constructs the game from a pre built description. * \param descripton The description of the game to run. */ bear::engine::game_local_client::game_local_client ( const game_description& description ) { constructor_common_init_members(); m_game_description = description; constructor_common_init(); } // game_local_client::game_local_client() /*----------------------------------------------------------------------------*/ /** * \brief Destructor. */ bear::engine::game_local_client::~game_local_client() { delete m_event_manager; clear(); close_environment(); base_item::print_allocated(); } // game_local_client::~game_local_client() /*----------------------------------------------------------------------------*/ /** * \brief Run the game. */ void bear::engine::game_local_client::run() { if ( m_status != status_quit ) { init_stats(); init_game(); if ( m_current_level == NULL ) load_level( m_game_description.start_level() ); m_screen->unpause(); run_level(); end_game(); clear(); m_stats.end(); close_environment(); } } // game_local_client::run() /*----------------------------------------------------------------------------*/ /** * \brief Tells the running game to stop its activities. */ void bear::engine::game_local_client::sleep() { if ( m_status == status_sleep ) return; m_sleep_status = m_status; m_status = status_sleep; m_screen->pause(); if ( m_current_level != NULL ) m_current_level->set_pause(); } // game_local_client::sleep() /*----------------------------------------------------------------------------*/ /** * \brief Tells the running game to come back to work. */ void bear::engine::game_local_client::wake_up() { if ( m_status != status_sleep ) return; m_screen->unpause(); if ( m_current_level != NULL ) m_current_level->unset_pause(); m_status = m_sleep_status; set_last_progress_date(); } // game_local_client::wake_up() /*----------------------------------------------------------------------------*/ /** * \brief Get the time step between to progress on the level. */ bear::systime::milliseconds_type bear::engine::game_local_client::get_time_step() const { return m_time_step; } // game_local_client::get_time_step() /*----------------------------------------------------------------------------*/ /** * Set the scale of the time (ie. how many ingame seconds it takes for a real * second. * \param s The scale. If s is less or equal to zero, its value is ignored and * the scale is set to 1. */ void bear::engine::game_local_client::set_time_scale( double s ) { if ( s <= 0 ) m_time_scale = 0; else m_time_scale = s; } // game_local_client::set_time_scale() /*----------------------------------------------------------------------------*/ /** * Get the scale of the time. */ double bear::engine::game_local_client::get_time_scale() const { return m_time_scale; } // game_local_client::get_time_scale() /*----------------------------------------------------------------------------*/ /** * \brief Get the access to the network. */ bear::engine::game_network& bear::engine::game_local_client::get_network() { return m_network; } // game_local_client::get_network() /*----------------------------------------------------------------------------*/ /** * \brief Returns the translator for the plugins. */ bear::engine::translator bear::engine::game_local_client::get_translator() const { return m_translator; } // game_local_client::get_translator() /*----------------------------------------------------------------------------*/ /** * \brief Sets the translator for the plugins. * \param t The new translator. */ void bear::engine::game_local_client::set_translator ( const bear::engine::translator& t ) { m_translator = t; } // game_local_client::set_translator() /*----------------------------------------------------------------------------*/ /** * \brief Turn on/off the dumb rendering mode. * \param b Tell if we must activate the dumb rendering mode. */ void bear::engine::game_local_client::set_dumb_rendering( bool b ) { if ( m_screen == NULL ) m_game_description.set_dumb_rendering( b ); else m_screen->set_dumb_rendering(b); } // game_local_client::set_dumb_rendering() /*----------------------------------------------------------------------------*/ /** * \brief Tells if the dumb rendering mode is active. */ bool bear::engine::game_local_client::get_dumb_rendering() const { if ( m_screen == NULL ) return m_game_description.dumb_rendering(); else return m_screen->get_dumb_rendering(); } // game_local_client::get_dumb_rendering() /*----------------------------------------------------------------------------*/ /** * \brief Turn on/off the full screen mode. * \param full Tell if we must activate the fullscreen mode. */ void bear::engine::game_local_client::set_fullscreen( bool full ) { if ( m_fullscreen != full ) { m_fullscreen = full; m_screen->fullscreen(m_fullscreen); } } // game_local_client::set_fullscreen() /*----------------------------------------------------------------------------*/ /** * \brief Return the full screen mode. */ bool bear::engine::game_local_client::get_fullscreen() const { return m_fullscreen; } // game_local_client::get_fullscreen() /*----------------------------------------------------------------------------*/ /** * \brief Turn on/off the overview mode. * \param mode Tell if we must activate the overview mode. */ void bear::engine::game_local_client::set_overview_mode( bool mode ) { m_current_level->set_overview_activated(mode); } // game_local_client::set_overview_mode() /*----------------------------------------------------------------------------*/ /** * \brief Return the state of the overview mode. */ bool bear::engine::game_local_client::get_overview_mode() const { return m_current_level->get_overview_activated(); } // game_local_client::get_overview_mode() /*----------------------------------------------------------------------------*/ /** * \brief Mute/unmute the sounds. * \param m The mute status. */ void bear::engine::game_local_client::set_sound_muted( bool m ) { if ( m_current_level == NULL ) level_globals::global_set_sound_muted(m); else m_current_level->get_globals().mute_sound(m); } // game_local_client::set_sound_muted() /*----------------------------------------------------------------------------*/ /** * \brief Tell if the sound is muted. */ bool bear::engine::game_local_client::get_sound_muted() const { return level_globals::global_get_sound_muted(); } // game_local_client::get_sound_muted() /*----------------------------------------------------------------------------*/ /** * \brief Set the volume of the sounds. * \param v The volume. */ void bear::engine::game_local_client::set_sound_volume( double v ) { if ( m_current_level == NULL ) level_globals::global_set_sound_volume(v); else m_current_level->get_globals().set_sound_volume(v); } // game_local_client::set_sound_volume() /*----------------------------------------------------------------------------*/ /** * \brief Get the volume of the sounds. */ double bear::engine::game_local_client::get_sound_volume() const { return level_globals::global_get_sound_volume(); } // game_local_client::get_sound_colume() /*----------------------------------------------------------------------------*/ /** * \brief Mute/unmute the music. * \param m The mute status. */ void bear::engine::game_local_client::set_music_muted( bool m ) { if ( m_current_level == NULL ) level_globals::global_set_music_muted(m); else m_current_level->get_globals().mute_music(m); } // game_local_client::set_music_muted() /*----------------------------------------------------------------------------*/ /** * \brief Tell if the music is muted. */ bool bear::engine::game_local_client::get_music_muted() const { return level_globals::global_get_music_muted(); } // game_local_client::get_music_muted() /*----------------------------------------------------------------------------*/ /** * \brief Set the volume of the musics. * \param v The volume. */ void bear::engine::game_local_client::set_music_volume( double v ) { if ( m_current_level == NULL ) level_globals::global_set_music_volume(v); else m_current_level->get_globals().set_music_volume(v); } // game_local_client::set_music_volume() /*----------------------------------------------------------------------------*/ /** * \brief Get the volume of the musics. */ double bear::engine::game_local_client::get_music_volume() const { return level_globals::global_get_music_volume(); } // game_local_client::get_music_volume() /*----------------------------------------------------------------------------*/ /** * \brief Take a shot of the screen. * \param img The image in which we save the screen. */ void bear::engine::game_local_client::screenshot( claw::graphic::image& img ) const { m_screen->shot( img ); } // game_local_client::screenshot() bear::visual::capture bear::engine::game_local_client::screen_capture() const { return m_screen->capture_scene(); } /*----------------------------------------------------------------------------*/ /** * \brief Take a shot of the whole level. * \param img The image in which we save the level. */ void bear::engine::game_local_client::levelshot( claw::graphic::image& img ) const { m_current_level->shot( *m_screen, img ); } // game_local_client::levelshot() /*----------------------------------------------------------------------------*/ /** * \brief End the game. */ void bear::engine::game_local_client::end() { m_status = status_quit; } // game_local_client::end() /*----------------------------------------------------------------------------*/ /** * \brief Give the name of a level to load as soon as possible. * \param path The path of the level to load. */ void bear::engine::game_local_client::set_waiting_level( const std::string& path ) { m_post_actions.push( new game_action_load_level(path) ); } // game_local_client::set_waiting_level() /*----------------------------------------------------------------------------*/ /** * \brief Set the level to run as soon as possible. * \param the_level The level to run as soon as possible. */ void bear::engine::game_local_client::set_waiting_level( level* the_level ) { CLAW_PRECOND( the_level != NULL ); if ( m_status == status_init ) set_current_level( the_level ); else m_post_actions.push( new game_action_set_current_level(the_level) ); } // game_local_client::set_waiting_level() /*----------------------------------------------------------------------------*/ /** * \brief Give the name of a level to load as soon as possible but keep the * current level in memory for future restoration. * \param path The path of the level to load. */ void bear::engine::game_local_client::push_level( const std::string& path ) { m_post_actions.push( new game_action_push_level(path) ); } // game_local_client::push_level() /*----------------------------------------------------------------------------*/ /** * \brief Restore the level at the top of the stack. */ void bear::engine::game_local_client::pop_level() { m_post_actions.push( new game_action_pop_level ); } // game_local_client::pop_level() /*----------------------------------------------------------------------------*/ /** * \brief Get the size of the screen. */ claw::math::coordinate_2d bear::engine::game_local_client::get_screen_size() const { if ( m_screen == NULL ) return m_game_description.screen_size(); else return m_screen->get_size(); } // game_local_client::get_screen_size() /*----------------------------------------------------------------------------*/ /** * \brief Get the size of the main window. */ claw::math::coordinate_2d bear::engine::game_local_client::get_window_size() const { if ( m_screen == NULL ) return get_screen_size(); else return m_screen->get_size(); } // game_local_client::get_window_size() /*----------------------------------------------------------------------------*/ /** * \brief Get the margin of the active area around the camera. */ double bear::engine::game_local_client::get_active_area_margin() const { return m_game_description.active_area_margin(); } // game_local_client::get_active_area_margin() /*----------------------------------------------------------------------------*/ /** * \brief Gets an abstraction of the filesystem that can be used by the game. */ bear::engine::game_filesystem bear::engine::game_local_client::get_game_filesystem() const { return m_game_filesystem; } // game_local_client::get_game_filesystem() /*----------------------------------------------------------------------------*/ /** * \brief Sets the abstraction of the filesystem that can be used by the game. * \param f The abstract file system. */ void bear::engine::game_local_client::set_game_filesystem ( const game_filesystem& f ) { m_game_filesystem = f; } // game_filesystem::set_game_filesystem() /*----------------------------------------------------------------------------*/ /** * \brief Get the value of a global variable. * \param val (in/out) The variable for which we want the value. */ void bear::engine::game_local_client::get_game_variable( base_variable& val ) const { val.get_value_from(m_game_variables); } // game_local_client::get_game_variable() /*----------------------------------------------------------------------------*/ /** * \brief Get the game variables whose name match a given regular * expression; * \param vars The list of matched game variables. * \param pattern The expression that has to be matched by the variable names. */ void bear::engine::game_local_client::get_game_variables ( var_map& vars, const std::string& pattern ) { m_game_variables.for_each( variable_copy(vars, boost::regex(pattern)) ); } // game_local_client::get_game_variables() /*----------------------------------------------------------------------------*/ /** * \brief Set the value of a global variable. * \param val (in/out) The variable for which we set the value. */ void bear::engine::game_local_client::set_game_variable ( const base_variable& val ) { val.assign_value_to(m_game_variables); } // game_local_client::set_game_variable() /*----------------------------------------------------------------------------*/ /** * \brief Set several game variables at once. * \param vars The variables. */ void bear::engine::game_local_client::set_game_variables( const var_map& vars ) { m_game_variables.set(vars); } // game_local_client::set_game_variables() /*----------------------------------------------------------------------------*/ /** * \brief Erase the variables whose name match a given pattern. * \param pattern The pattern to match. */ void bear::engine::game_local_client::erase_game_variables ( const std::string& pattern ) { m_game_variables.for_each ( variable_eraser( m_game_variables, boost::regex(pattern) ) ); } // game_local_client::erase_game_variables() /*----------------------------------------------------------------------------*/ /** * \brief Tell if a given variable exists in the game. * \param val (in/out) The variable to check. */ bool bear::engine::game_local_client::game_variable_exists ( const base_variable& val ) const { return val.exists(m_game_variables); } // game_local_client::game_variable_exists() /*----------------------------------------------------------------------------*/ /** * \brief Get all the game variables. * \param vars (in/out) All the variables. */ void bear::engine::game_local_client::get_all_game_variables( var_map& vars ) const { vars = m_game_variables; } // game_local_client::get_all_game_variables() /*----------------------------------------------------------------------------*/ /** * \brief Add a listener to follow the change on a game variable of type int. * \param name The name of the variable. * \param f The listener. */ boost::signals2::connection bear::engine::game_local_client::listen_int_variable_change ( const std::string& name, const boost::function& f ) { return listen_variable_change( name, f ); } // game_local_client::listen_int_variable_change() /*----------------------------------------------------------------------------*/ /** * \brief Add a listener to follow the change on a game variable of type * unsigned int. * \param name The name of the variable. * \param f The listener. */ boost::signals2::connection bear::engine::game_local_client::listen_uint_variable_change ( const std::string& name, const boost::function& f ) { return listen_variable_change( name, f ); } // game_local_client::listen_uint_variable_change() /*----------------------------------------------------------------------------*/ /** * \brief Add a listener to follow the change on a game variable of type bool. * \param name The name of the variable. * \param f The listener. */ boost::signals2::connection bear::engine::game_local_client::listen_bool_variable_change ( const std::string& name, const boost::function& f ) { return listen_variable_change( name, f ); } // game_local_client::listen_bool_variable_change() /*----------------------------------------------------------------------------*/ /** * \brief Add a listener to follow the change on a game variable of type double. * \param name The name of the variable. * \param f The listener. */ boost::signals2::connection bear::engine::game_local_client::listen_double_variable_change ( const std::string& name, const boost::function& f ) { return listen_variable_change( name, f ); } // game_local_client::listen_double_variable_change() /*----------------------------------------------------------------------------*/ /** * \brief Add a listener to follow the change on a game variable of type string. * \param name The name of the variable. * \param f The listener. */ boost::signals2::connection bear::engine::game_local_client::listen_string_variable_change ( const std::string& name, const boost::function& f ) { return listen_variable_change( name, f ); } // game_local_client::listen_string_variable_change() /*----------------------------------------------------------------------------*/ /** * \brief Get the name of the game. */ const std::string& bear::engine::game_local_client::get_name() const { return m_game_description.game_name(); } // game_local_client::get_name() /*----------------------------------------------------------------------------*/ /** * \brief Send a variable to the destination page. * \param operation The name of the operation stored in the stats. * \param name The name of the variable. * \param value The value of the variable. */ void bear::engine::game_local_client::send_data ( std::string operation, std::string name, std::string value ) const { m_stats.send_data( operation, name, value ); } // game_local_client::send_data() /*----------------------------------------------------------------------------*/ /** * \brief Send some variables to the destination. * \param operation The name of the operation stored in the stats. * \param vars The variables to send. */ void bear::engine::game_local_client::send_data ( std::string operation, std::list vars ) const { m_stats.send_data(operation, vars); } // game_local_client::send_data() /*----------------------------------------------------------------------------*/ /** * \brief Assigns their default value to the members of this instance. */ void bear::engine::game_local_client::constructor_common_init_members() { m_status = status_init; m_screen = NULL; m_fullscreen = false; m_current_level = NULL; m_level_in_abeyance = NULL; m_time_step = 15; m_time_scale = 1; m_frames_per_second = 60; m_synchronized_render = false; m_level_paused_sync = false; m_event_manager = NULL; } // game_local_client::constructor_common_init_members() /*----------------------------------------------------------------------------*/ /** * \brief Constructs the game according to the description m_game_description. */ void bear::engine::game_local_client::constructor_common_init() { load_libraries( m_game_description.libraries() ); init_resource_pool( m_game_description.resources_path() ); init_environment(); init_game_filesystem(); try { m_screen = new visual::screen ( m_game_description.screen_size(), m_game_description.game_name(), m_fullscreen ); init_event_manager(); set_dumb_rendering( m_game_description.dumb_rendering() ); } catch(...) { clear(); close_environment(); throw; } } // game_local_client::constructor_common_init() /*----------------------------------------------------------------------------*/ /** * \brief Initialize the game statistics. */ void bear::engine::game_local_client::init_stats() { const std::string file_name ( get_game_filesystem().get_custom_config_file_name( "engine-stats" ) ); std::ifstream f(file_name.c_str()); boost::uuids::uuid id; if ( !f ) { id = boost::uuids::random_generator()(); std::ofstream of( file_name.c_str() ); of << id; } else f >> id; std::ostringstream oss; oss << id; m_stats.start( get_formatted_game_name(), oss.str() ); } // game_local_client::init_stats() /*----------------------------------------------------------------------------*/ /** * \brief Call the game specific function for initialisation. */ void bear::engine::game_local_client::init_game() const { claw::logger << claw::log_verbose << "Initializing game." << std::endl; game_initializer::get_instance().init(); } // game_local_client::init_game() /*----------------------------------------------------------------------------*/ /** * \brief Call the game specific function for ending the game. */ void bear::engine::game_local_client::end_game() const { claw::logger << claw::log_verbose << "Ending game." << std::endl; game_initializer::get_instance().end(); } // game_local_client::end_game() /*----------------------------------------------------------------------------*/ /** * \brief Gets the name of the game in a string usable for a file name. */ std::string bear::engine::game_local_client::get_formatted_game_name() const { std::string result( m_game_description.game_name() ); std::transform( result.begin(), result.end(), result.begin(), tolower ); for (unsigned int i=0; i!=result.size(); ++i) if ( !( ('a' <= result[i]) && (result[i] <= 'z') ) && !( ('0' <= result[i]) && (result[i] <= '9') ) ) result[i] = '_'; claw::text::squeeze( result, "_" ); return result; } // game_local_client::get_formatted_game_name() /*----------------------------------------------------------------------------*/ /** * \brief Assigns the current date to m_last_progress. */ void bear::engine::game_local_client::set_last_progress_date() { m_last_progress = systime::get_date_ms(); } // game_local_client::set_last_progress_date() /*----------------------------------------------------------------------------*/ /** * \brief Run the current_level. */ void bear::engine::game_local_client::run_level() { m_status = status_run; while (m_status != status_quit) { set_last_progress_date(); m_last_render = m_last_progress; do { if ( m_event_manager != NULL ) m_event_manager->refresh(); if ( m_status == status_sleep ) { systime::sleep( 1000 ); set_last_progress_date(); } else one_step_beyond(); } while ( !do_post_actions() && (m_status != status_quit) ); } } // game_local_client::run_level() /*----------------------------------------------------------------------------*/ /** * \brief Do one progress()/render() iteration. */ void bear::engine::game_local_client::one_step_beyond() { systime::milliseconds_type current_time( systime::get_date_ms() ); // The value of m_time_scale may be changed by an item during the progress const universe::time_type time_scale( m_time_scale ); const universe::time_type time_range( current_time - m_last_progress ); universe::time_type dt( time_range * time_scale ); if ( dt >= m_time_step ) { progress( current_time, dt, time_range, time_scale ); render(); current_time = systime::get_date_ms(); } if ( current_time < m_last_progress + m_time_step ) systime::sleep( m_last_progress + m_time_step - current_time ); } // game_local_client::one_step_beyond() /*----------------------------------------------------------------------------*/ /** * \brief Try to synchronize the network and pause the level if it is not * synchronized. */ bool bear::engine::game_local_client::synchronize_network() { bool result(false); if ( m_network.synchronize() ) { result = true; if ( m_level_paused_sync ) { m_current_level->unset_pause(); m_level_paused_sync = false; } } else if ( !m_level_paused_sync ) { m_current_level->set_pause(); m_level_paused_sync = true; } return result; } // game_local_client::synchronize_network() /*----------------------------------------------------------------------------*/ /** * \brief Do one progress of the game. * \param dt The elapsed time since the last progress, according to the game's * point of view. * \return The amount of dt that was not used for in the progress. */ bear::universe::time_type bear::engine::game_local_client::synchronous_progress( universe::time_type dt ) { // Read the messages arriving on the network. If some clients did not // receive a sync message then pause the level. synchronize_network(); progress( (universe::time_type)m_time_step / 1000 ); // seconds // send a synchronization message on each server m_network.send_synchronization(); const universe::time_type result = dt - m_time_step; return result; } // game_local_client::synchronous_progress() /*----------------------------------------------------------------------------*/ /** * \brief Do as many progresses of the game as possible. * \param t The elapsed time since the last progress, according to the game's * point of view. * \param current_time The real date at the beginning of the progress. * \param time_range The elapsed time since the last progress, according to the * engine's point of view. * \return The amount of t that was not used for in the progress. */ bear::universe::time_type bear::engine::game_local_client::asynchronous_progress ( universe::time_type t, systime::milliseconds_type current_time, universe::time_type time_range ) { bool overload = false; universe::time_type dt(t); do { // Read the messages arriving on the network. If some clients did // not receive a sync message then pause the level. synchronize_network(); progress( (universe::time_type)m_time_step / 1000 ); // seconds // send a synchronization message on each server m_network.send_synchronization(); dt -= m_time_step; overload = (systime::get_date_ms() - current_time > time_range); } while ( (dt >= m_time_step) && (m_time_step > 0) && !overload ); if ( overload ) return 0; else return dt; } // game_local_client::asynchronous_progress() /*----------------------------------------------------------------------------*/ /** * \brief Do one iteration in the progression of the game. * \param current_time The date at which the progress is done. * \param dt The elapsed time since the last progress, according to the game's * point of view. * \param time_range The elapsed time since the last progress, according to the * engine's point of view. * \param time_scale The scale factor applied to the engine's time to obtain the * game's time. */ void bear::engine::game_local_client::progress ( systime::milliseconds_type current_time, universe::time_type dt, universe::time_type time_range, universe::time_type time_scale ) { set_time_scale(1); m_last_progress = current_time; if ( m_synchronized_render ) dt = synchronous_progress(dt); else dt = asynchronous_progress(dt, current_time, time_range); m_last_progress -= dt / time_scale; } // game_local_client::progress() /*----------------------------------------------------------------------------*/ /** * \brief Do one iteration in the progression of the game. * \param elapsed_time Elapsed time since the last call. */ void bear::engine::game_local_client::progress ( universe::time_type elapsed_time ) { input::system::get_instance().set_display ( input::display_projection ( m_screen->get_container_size(), m_screen->get_size(), m_screen->get_viewport_size() ) ); input::system::get_instance().refresh(); m_current_level->progress( elapsed_time ); } // game_local_client::progress() /*----------------------------------------------------------------------------*/ /** * \brief Render the current level. */ void bear::engine::game_local_client::render() { if ( (m_frames_per_second != 0) && !m_synchronized_render ) { const systime::milliseconds_type render_date ( m_last_render + 1000 / m_frames_per_second ); const systime::milliseconds_type current_date( systime::get_date_ms() ); if ( (current_date < render_date) && (render_date - current_date > m_time_step) ) return; } // effective procedure m_screen->begin_render(); m_current_level->render( *m_screen ); m_screen->end_render(); m_last_render = systime::get_date_ms(); } // game_local_client::render() /*----------------------------------------------------------------------------*/ /** * \brief Initialize the environment (screen, inputs, sounds). */ void bear::engine::game_local_client::init_environment() const { claw::logger << claw::log_verbose << "Initializing screen environment." << std::endl; visual::screen::initialize( visual::screen::screen_gl ); claw::logger << claw::log_verbose << "Initializing input environment." << std::endl; input::system::initialize(); claw::logger << claw::log_verbose << input::joystick::number_of_joysticks() << " joysticks found." << std::endl; claw::logger << claw::log_verbose << "Initializing sound environment." << std::endl; audio::sound_manager::initialize(); if ( !claw::socket_traits::init() ) claw::logger << claw::log_error << "Failed to initialize the network." << std::endl; } // game_local_client::init_environment() /*----------------------------------------------------------------------------*/ /** * \brief Close the environment (screen, inputs, sounds). */ void bear::engine::game_local_client::close_environment() const { claw::logger << claw::log_verbose << "Closing sound environment." << std::endl; audio::sound_manager::release(); claw::logger << claw::log_verbose << "Closing input environment." << std::endl; input::system::release(); claw::logger << claw::log_verbose << "Closing screen environment." << std::endl; visual::screen::release(); claw::socket_traits::release(); } // game_local_client::close_environment() /*----------------------------------------------------------------------------*/ /** * \brief Initializes the abstraction of the filesystem as seen by the game. */ void bear::engine::game_local_client::init_game_filesystem() { #if defined( __ANDROID__ ) m_game_filesystem = android_game_filesystem( m_game_description.game_name() ); #elif defined( BEAR_USES_FREEDESKTOP ) m_game_filesystem = freedesktop_game_filesystem( m_game_description.game_name() ); #else m_game_filesystem = default_game_filesystem( m_game_description.game_name() ); #endif } // game_local_client::init_game_filesystem() /*----------------------------------------------------------------------------*/ /** * \brief Initializes the abstraction of the event handler. */ void bear::engine::game_local_client::init_event_manager() { #ifdef __ANDROID__ m_event_manager = event_manager_ptr( new android_system_event_manager() ); #else m_event_manager = event_manager_ptr( new default_system_event_manager() ); #endif } // game_local_client::init_event_manager() /*----------------------------------------------------------------------------*/ /** * \brief Load the libraries containing the items. * \param p A list of paths to libraries. */ void bear::engine::game_local_client::load_libraries ( const std::list& p ) { std::list::const_iterator it; for ( it=p.begin(); it!=p.end(); ++it ) { claw::logger << claw::log_verbose << "Add library '" << *it << "'." << std::endl; m_symbols.add_library(*it); } } // game_local_client::load_libraries() /*----------------------------------------------------------------------------*/ /** * \brief Add paths in the resource_pool. * \param p A list of paths. */ void bear::engine::game_local_client::init_resource_pool ( const std::list& p ) const { std::list::const_iterator it; for ( it=p.begin(); it!=p.end(); ++it ) { claw::logger << claw::log_verbose << "Adding resource path '" << *it << "'." << std::endl; resource_pool::get_instance().add_path(*it); } } // game_local_client::init_resource_pool() /*----------------------------------------------------------------------------*/ /** * \brief Do the pending actions. */ bool bear::engine::game_local_client::do_post_actions() { bool result = false; while ( !m_post_actions.empty() ) { game_action* a=m_post_actions.front(); m_post_actions.pop(); result = a->apply(*this); delete a; } return result; } // game_local_client::do_post_actions() /*----------------------------------------------------------------------------*/ /** * \brief Set the current level (and delete the level currently running). * \param the_level The new current level. */ void bear::engine::game_local_client::set_current_level( level* the_level ) { CLAW_PRECOND( the_level != NULL ); if ( m_current_level != NULL ) close_level(); m_current_level = the_level; m_stats.start_level( m_current_level->get_filename() ); start_current_level(); } // game_local_client::set_current_level() /*----------------------------------------------------------------------------*/ /** * \brief Load a level. * \param path The path of the level to load. */ void bear::engine::game_local_client::load_level( const std::string& path ) { claw::logger << claw::log_verbose << "------------ Loading level '" << path << "'... ------------" << std::endl; std::stringstream f; resource_pool::get_instance().get_file( path, f ); if ( !f ) throw claw::exception( "Can't open level file '" + path + "'." ); /// \todo test the file to see if it's text or binary compiled_file level_file( f, true ); level_globals* shared_resources = NULL; if ( m_level_in_abeyance == NULL ) shared_resources = NULL; else shared_resources = &m_level_in_abeyance->get_globals(); const systime::milliseconds_type loading_date( systime::get_date_ms() ); const level_globals* resources_source ( (m_current_level == NULL) ? NULL : &m_current_level->get_globals() ); level_loader loader( level_file, path, shared_resources, resources_source ); loader.complete_run(); claw::logger << "Level loaded in " << ( (double)(systime::get_date_ms() - loading_date) ) / 1000 << " s." << std::endl; set_current_level( loader.drop_level() ); } // game_local_client::load_level() /*----------------------------------------------------------------------------*/ /** * \brief Close the current level. * \pre m_current_level != NULL * \post m_current_level == NULL */ void bear::engine::game_local_client::close_level() { CLAW_PRECOND( m_current_level != NULL ); delete m_current_level; m_current_level = NULL; CLAW_POSTCOND( m_current_level == NULL ); } // game_local_client::close_level() /*----------------------------------------------------------------------------*/ /** * \brief Add a level on the stack. * \param path The path of the level to load. */ void bear::engine::game_local_client::do_push_level( const std::string& path ) { claw::logger << claw::log_verbose << "------------ Pushing '" << path << "'. ------------" << std::endl; CLAW_PRECOND( m_level_in_abeyance == NULL ); m_level_in_abeyance = m_current_level; m_level_in_abeyance->set_pause(); m_current_level = NULL; load_level( path ); CLAW_POSTCOND( m_level_in_abeyance != NULL ); } // game_local_client::do_push_level() /*----------------------------------------------------------------------------*/ /** * \brief Restore the level on the top of the stack. */ void bear::engine::game_local_client::do_pop_level() { claw::logger << claw::log_verbose << "------------ Popping. ------------" << std::endl; CLAW_PRECOND( m_level_in_abeyance != NULL ); CLAW_PRECOND( m_current_level != NULL ); close_level(); m_current_level = m_level_in_abeyance; m_level_in_abeyance = NULL; m_stats.pop_level( m_current_level->get_filename() ); m_current_level->unset_pause(); set_music_muted(get_music_muted()); set_sound_muted(get_sound_muted()); set_music_volume(get_music_volume()); set_sound_volume(get_sound_volume()); } // game_local_client::do_pop_level() /*----------------------------------------------------------------------------*/ /** * \brief Start the current level. */ void bear::engine::game_local_client::start_current_level() { claw::logger << claw::log_verbose << "------------ Starting level. ------------" << std::endl; CLAW_PRECOND( m_current_level != NULL ); m_current_level->start(); m_current_level->set_pause(); m_level_paused_sync = true; } // game_local_client::start_current_level() /*----------------------------------------------------------------------------*/ /** * \brief Remove all layers, controllers and the screen. */ void bear::engine::game_local_client::clear() { if ( m_current_level != NULL ) { if ( m_level_in_abeyance != NULL ) do_pop_level(); close_level(); } if (m_screen != NULL) { delete m_screen; m_screen = NULL; } // deleting pending actions while ( !m_post_actions.empty() ) { delete m_post_actions.front(); m_post_actions.pop(); } } // game_local_client::clear() /*----------------------------------------------------------------------------*/ /** * \brief Check the arguments to initialise the game. * \param argc Number of program arguments. * \param argv Program arguments. */ bool bear::engine::game_local_client::check_arguments( int& argc, char** &argv ) { bool result = false; std::string help; bool auto_exit(false); claw::arguments_table arg( get_arguments_table() ); char game_var_assignment('='); arg.parse( argc, argv ); try { m_game_description = game_description( arg ); } catch( std::exception& e ) { help = e.what(); } if ( arg.get_bool("--version") ) { std::cout << BEAR_VERSION_STRING << std::endl; auto_exit = true; } if ( arg.has_value( "--stats-destination" ) ) m_stats.set_destination( arg.get_string("--stats-destination") ); if ( arg.has_value("--tag") ) m_stats.set_tag( arg.get_string("--tag") ); m_fullscreen = arg.get_bool("--fullscreen") && !arg.get_bool("--windowed"); if ( arg.has_value("--network-horizon") ) { if ( arg.only_integer_values("--network-horizon") ) m_network.set_min_horizon( arg.get_integer("--network-horizon") ); else help = "--network-horizon=" + arg.get_string("--network-horizon"); } if ( arg.has_value("--game-var-assignment") ) { const std::string v( arg.get_string("--game-var-assignment") ); if ( v.length() == 1 ) game_var_assignment = v[0]; else help = bear_gettext("--game-var-assignment: not a character."); } if ( arg.has_value("--set-game-var-int") ) if ( !set_game_variable_from_arg ( arg.get_all_of_string("--set-game-var-int"), game_var_assignment ) ) help = bear_gettext("--set-game-var-int: not an integer"); if ( arg.has_value("--set-game-var-uint") ) if ( !set_game_variable_from_arg ( arg.get_all_of_string("--set-game-var-uint"), game_var_assignment ) ) help = bear_gettext("--set-game-var-uint: not an unsigned integer"); if ( arg.has_value("--set-game-var-bool") ) if ( !set_game_variable_from_arg ( arg.get_all_of_string("--set-game-var-bool"), game_var_assignment ) ) help = bear_gettext("--set-game-var-bool: not a boolean"); if ( arg.has_value("--set-game-var-real") ) if ( !set_game_variable_from_arg ( arg.get_all_of_string("--set-game-var-real"), game_var_assignment ) ) help = bear_gettext("--set-game-var-real: not a real number"); if ( arg.has_value("--set-game-var-string") ) set_game_variable_from_arg ( arg.get_all_of_string("--set-game-var-string"), game_var_assignment ); m_synchronized_render = arg.get_bool("--sync-render"); if ( arg.has_value("--fps") ) { if ( arg.only_integer_values("--fps") ) m_frames_per_second = arg.get_integer("--fps"); else help = "--fps=" + arg.get_string("--fps"); } if ( !help.empty() ) { std::cout << bear_gettext("Bad argument value: '") << help << bear_gettext("'\n"); arg.help(); } else if ( !auto_exit ) { if ( arg.get_bool( "--auto-load-symbols" ) ) m_symbols.add_library( std::string(), true ); result = true; } return result; } // game_local_client::check_arguments() /*----------------------------------------------------------------------------*/ /** * \brief Set a game variable from a command line argument string formated * "namevalue". * \param args The values assigned to the command line arguments. * \param sep The separator between the name and the value. Must not be * present in the variable's name. */ template bool bear::engine::game_local_client::set_game_variable_from_arg ( const std::list& args, const char sep ) { bool result(true); std::list::const_iterator it; for (it=args.begin(); it!=args.end(); ++it) { const std::size_t pos( it->find_first_of(sep) ); if ( pos == std::string::npos ) result = false; else { const std::string name( it->substr(0, pos) ); const std::string value( it->substr(pos+1) ); if ( !claw::text::is_of_type(value) ) result = false; else { std::istringstream iss(value); T v; iss >> v; m_game_variables.set(name, v); result = true; } } } return result; } // game_local_client::set_game_variable_from_arg() /*----------------------------------------------------------------------------*/ /** * \brief Add a listener on the changes of a game variable. * \param name The name of the variable to listen. * \param f The function to call when the value of the variable change. */ template boost::signals2::connection bear::engine::game_local_client::listen_variable_change ( const std::string& name, boost::function f ) { return m_game_variables.variable_changed(name).connect(f); } // game_local_client::listen_variable_change() /*----------------------------------------------------------------------------*/ /** * \brief Get the arguments table with the arguments of the engine. */ claw::arguments_table bear::engine::game_local_client::get_arguments_table() { claw::arguments_table arg( bear_gettext("Engine's options:") ); game_description::get_valid_command_line_arguments( arg ); arg.add_long ( "--fullscreen", bear_gettext("Runs the game in fullscreen mode."), true ); arg.add_long( "--windowed", bear_gettext("Run the game in a window."), true ); arg.add_long ( "--auto-load-symbols", bear_gettext("Search the items in the game launcher."), true ); arg.add_long ( "--network-horizon", bear_gettext("The delay to apply to the network messages in term of game" " iterations. Default is 1."), true, bear_gettext("value") ); arg.add_long ( "--set-game-var-int", bear_gettext("Sets the value of an integer game variable."), true, bear_gettext("name=value") ); arg.add_long ( "--set-game-var-uint", bear_gettext("Sets the value of a non negative integer game variable."), true, bear_gettext("name=value") ); arg.add_long ( "--set-game-var-bool", bear_gettext("Sets the value of a boolean game variable."), true, bear_gettext("name=value") ); arg.add_long ( "--set-game-var-real", bear_gettext("Sets the value of a real number game variable."), true, bear_gettext("name=value") ); arg.add_long ( "--set-game-var-string", bear_gettext("Sets the value of a string game variable."), true, bear_gettext("name=value") ); arg.add_long ( "--game-var-assignment", bear_gettext ("Changes the delimiter used in --set-game-var- to separate the" " name and the value of the variable."), true, bear_gettext("character") ); arg.add_long ( "--stats-destination", bear_gettext ("Sets the value of the destination to which game statistics are sent."), true ); arg.add_long ( "--tag", bear_gettext("Associates an identifier with this game."), true ); arg.add_long ( "--fps", bear_gettext("Sets the limit of the number of frames per second."), true ); arg.add_long ( "--sync-render", bear_gettext ("Tells to do a rendering of the scene for each progress of the game."), true ); arg.add ( "-v", "--version", bear_gettext("Prints the version of the engine and exit."), true ); return arg; } // game_local_client::get_arguments_table() plee-the-bear-20251226/bear-engine/core/src/engine/code/game_network.cpp000066400000000000000000000230371512343254000256350ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::engine::game_network class. * \author Julien Jorge */ #include "engine/game_network.hpp" #include "engine/network/client_connection.hpp" #include "engine/network/message/sync.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ bear::engine::game_network::game_network() : m_sync_id(0), m_min_horizon(1), m_active(false) { } // game_network::game_network() /*----------------------------------------------------------------------------*/ /** * \brief Destructor. */ bear::engine::game_network::~game_network() { for ( server_map::const_iterator it=m_server.begin(); it!=m_server.end(); ++it ) delete it->second; } // game_network::~game_network() /*----------------------------------------------------------------------------*/ /** * \brief Get the number of clients managed by this instance. */ std::size_t bear::engine::game_network::get_client_count() const { return m_future.size(); } // game_network::get_client_count() /*----------------------------------------------------------------------------*/ /** * \brief Get the representation of the future of a given client. * \param client_index The index of the client for which the future is * returned. */ const bear::engine::client_future& bear::engine::game_network::get_future( std::size_t client_index ) const { CLAW_PRECOND( client_index < m_future.size() ); client_future_map::const_iterator it=m_future.begin(); std::advance( it, client_index ); return it->second; } // game_network::get_future() /*----------------------------------------------------------------------------*/ /** * \brief Get the connection of a client at a given index. * \param client_index The index of the client whose connection is returned. */ const bear::engine::client_connection& bear::engine::game_network::get_connection( std::size_t client_index ) const { CLAW_PRECOND( client_index < m_future.size() ); client_future_map::const_iterator it=m_future.begin(); std::advance( it, client_index ); return *it->first; } // game_network::get_connection() /*----------------------------------------------------------------------------*/ /** * \brief Get the minimum number of message lists that can effectively be given * to the clients. */ std::size_t bear::engine::game_network::get_horizon() const { if ( m_future.empty() ) return 0; std::size_t result( std::numeric_limits::max() ); for ( client_future_map::const_iterator it=m_future.begin(); it != m_future.end(); ++it ) result = std::min( result, it->second.get_horizon() ); return result; } // game_network::get_horizon() /*----------------------------------------------------------------------------*/ /** * \brief Get the minimum number of message lists that must be ready in order to * pass the oldest one to the clients. */ std::size_t bear::engine::game_network::get_min_horizon() const { return m_min_horizon; } // game_network::get_min_horizon() /*----------------------------------------------------------------------------*/ /** * \brief Set the minimum number of message lists that must be ready in order to * pass the oldest one to the clients. * \param m The minimum number of message lists. */ void bear::engine::game_network::set_min_horizon( std::size_t m ) { m_min_horizon = m; } // game_network::set_min_horizon() /*----------------------------------------------------------------------------*/ /** * \brief Send a message through a service. * \param service_name The name of the service. * \param m The message to send. */ void bear::engine::game_network::send_message ( const std::string& service_name, net::message& m ) const { CLAW_PRECOND( m_server.find(service_name) != m_server.end() ); m.set_date( m_sync_id ); m_server.find(service_name)->second->dispatch_message(m); } // game_network::send_message() /*----------------------------------------------------------------------------*/ /** * \brief Create a new service with a given name and listening on a given port. * \param name The name of the service. * \param port The port on which the service listens. */ void bear::engine::game_network::create_service ( const std::string& name, unsigned int port ) { if ( m_server.find(name) == m_server.end() ) { net::server* s = new net::server(port); s->on_new_client.connect ( boost::bind( &game_network::on_new_client, this, s, _1 ) ); m_server[name] = s; } } // game_network::create_service() /*----------------------------------------------------------------------------*/ /** * \brief Get an observer for a client. * \param host The host to which the client is connected. * \param port The port through which the client listens. */ bear::engine::client_observer bear::engine::game_network::connect_to_service ( const std::string& host, unsigned int port ) { client_connection* result = NULL; for ( client_list::const_iterator it=m_client.begin(); (it != m_client.end()) && (result == NULL); ++it ) { client_connection* connection = *it; if ( (connection->get_host() == host) && (connection->get_port() == port) ) result = connection; } if ( result == NULL ) result = create_new_client(host, port); return client_observer(result); } // game_network::connect_to_service() /*----------------------------------------------------------------------------*/ /** * \brief Synchronize the servers and the clients. */ bool bear::engine::game_network::synchronize() { for ( server_map::const_iterator it=m_server.begin(); it!=m_server.end(); ++it ) it->second->check_for_new_clients(); for ( client_list::iterator it=m_client.begin(); it!=m_client.end(); ++it ) pull_client_messages(*it); m_active = set_client_messages(); return m_active; } // game_network::synchronize() /*----------------------------------------------------------------------------*/ /** * \brief Send a sync message on all servers. */ void bear::engine::game_network::send_synchronization() { if ( !m_active ) return; sync s(m_sync_id + m_min_horizon, true); ++m_sync_id; for ( server_map::const_iterator it=m_server.begin(); it!=m_server.end(); ++it ) it->second->dispatch_message( s ); } // game_network::send_synchronize() /*----------------------------------------------------------------------------*/ /** * \brief Create a new client. * \param host The host to which the client is connected. * \param port The port through which the client listens. * \return A pointer to the client added in the m_client list. */ bear::engine::client_connection* bear::engine::game_network::create_new_client ( const std::string& host, unsigned int port ) { client_connection* result = new client_connection(host, port); m_client.push_back( result ); m_future[result] = client_future( get_min_horizon() ); return result; } // game_network::create_new_client() /*----------------------------------------------------------------------------*/ /** * \brief Read the messages of a client until a sync message is received. * \param c The client from which the messages are read. */ void bear::engine::game_network::pull_client_messages( client_connection* c ) { net::message_handle m = c->get_client().pull_message(); while ( m != NULL ) { m_future[c].push_message( m ); m = c->get_client().pull_message(); } } // game_network::pull_client_messages() /*----------------------------------------------------------------------------*/ /** * \brief Set the messages of a client connection for the current date. */ bool bear::engine::game_network::prepare_clients() { std::size_t total(0); std::size_t ready(0); for ( client_list::iterator it=m_client.begin(); it!=m_client.end(); ++it ) { ++total; client_connection* const c = *it; c->clear_message_queue(); if ( m_future[c].get_horizon() == 0 ) m_filling.insert(c); else { if ( m_future[c].get_horizon() >= m_min_horizon ) m_filling.erase(c); const sync& s = m_future[c].get_sync_message(0); if ( s.is_active_sync() && (s.get_id() == m_sync_id) ) ++ready; } } if ( ready == total ) return m_filling.empty(); else return false; } // game_network::prepare_clients() /*----------------------------------------------------------------------------*/ /** * \brief Set the messages of the client connections for the current date. */ bool bear::engine::game_network::set_client_messages() { const bool ready = prepare_clients(); if ( ready ) for ( client_list::iterator it=m_client.begin(); it!=m_client.end(); ++it ) { client_connection* const c = *it; c->set_messages( m_future[c].next() ); } return ready; } // game_network::set_client_messages() /*----------------------------------------------------------------------------*/ /** * \brief Send some messages to initialize a new client. * \param s The server that has accepted the client. * \param client_id The identifier of the client as provided by the server. */ void bear::engine::game_network::on_new_client ( net::server* s, std::size_t client_id ) { for ( std::size_t i=0; i!=m_min_horizon; ++i ) s->send_message( client_id, sync( m_sync_id + i, true ) ); } // game_network::on_new_client() plee-the-bear-20251226/bear-engine/core/src/engine/code/game_stats.cpp000066400000000000000000000165761512343254000253140ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::engine::game_stats class. * \author Julien Jorge */ #include "engine/game_stats.hpp" #include "engine/version.hpp" #include #include #include #include #include #include #include #include #include #include #include /*----------------------------------------------------------------------------*/ /** * \brief Send the stats to a given server via HTTP POST. */ void bear::engine::game_stats::statistic_sender::operator()() const { std::string page; std::string server(address); std::size_t pos = server.find_first_of('/'); if ( pos != std::string::npos ) { page = server.substr( pos ); server = server.substr( 0, pos ); } const int port(80); claw::net::socket_stream os( server.c_str(), port ); if ( !os ) { #ifdef _DEBUG claw::logger << claw::log_error << "Cannot connect to " << server << " on port " << port << "."; #endif } else { #ifdef _DEBUG claw::logger << claw::log_verbose << "Connected to " << server << ", requesting " << page << '\n' << xml_string << std::endl; #endif os << "POST " << page << " HTTP/1.1\n" << "Host: " << server << "\n" << "From: stats@gamned.org\n" << "Content-Length: " << xml_string.size() << '\n' << "Content-Type: application/xml\n" << '\n' << xml_string << std::flush; #ifdef _DEBUG claw::logger << claw::log_verbose << "Result is:" << std::endl; std::string result; while ( std::getline( os, result ) ) claw::logger << claw::log_verbose << result << std::endl; #endif } } // game_stats::statistic_sender() /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ bear::engine::game_stats::game_stats() : m_init_date(systime::get_unix_time()) { std::ostringstream oss; oss << boost::uuids::random_generator()(); m_launch_id = oss.str(); } // game_stats::game_stats() /*----------------------------------------------------------------------------*/ /** * \brief Initializes the start. * \param name The name of the game. * \param id The identifier of the player. */ void bear::engine::game_stats::start( std::string name, std::string id ) const { std::list params; params.push_back( stat_variable( "name", name ) ); params.push_back( stat_variable( "player-id", id ) ); std::string tag; #if defined( _WIN32 ) tag = "win32"; #elif defined( __ANDROID__ ) tag = "android"; #else tag = "unix"; #endif if ( !m_tag.empty() ) tag += '-' + m_tag; params.push_back( stat_variable( "tag", tag ) ); send_data( "start-game", params ); } // game_stats::start() /*----------------------------------------------------------------------------*/ /** * \brief Finalizes the statistics. */ void bear::engine::game_stats::end() const { std::list params; send_data( "end-game", params ); } // game_stats::end() /*----------------------------------------------------------------------------*/ /** * \brief Note that a level is launched. * \param name The name of the level. */ void bear::engine::game_stats::start_level( std::string name ) const { send_data( "start-level", "level", name ); } // game_stats::start_level() /*----------------------------------------------------------------------------*/ /** * \brief Note that a level is restored. * \param name The name of the level. */ void bear::engine::game_stats::pop_level( std::string name ) const { send_data( "pop-level", "level", name ); } // game_stats::pop_level() /*----------------------------------------------------------------------------*/ /** * \brief Set the tag of the build. * \param tag The new tag. */ void bear::engine::game_stats::set_tag( std::string tag ) { m_tag = tag; } // game_stats::set_tag() /*----------------------------------------------------------------------------*/ /** * \brief Set the URL of the page to which the statistics are sent. * \param destination The URL of a php script that can receive the statistics. */ void bear::engine::game_stats::set_destination( std::string destination ) { if ( m_destination.empty() ) m_destination = destination; } // game_stats::set_destination() /*----------------------------------------------------------------------------*/ /** * \brief Send a variable to the destination page. * \param operation The name of the operation stored in the stats. * \param name The name of the variable. * \param value The value of the variable. */ void bear::engine::game_stats::send_data ( std::string operation, std::string name, std::string value ) const { std::list vars; vars.push_back( stat_variable( name, value ) ); send_data( operation, vars ); } // game_stats::send_data() /*----------------------------------------------------------------------------*/ /** * \brief Send some variables to the destination. * \param operation The name of the operation stored in the stats. * \param vars The variables to send. */ void bear::engine::game_stats::send_data ( std::string operation, std::list vars ) const { send( generate_xml_stats(operation, vars) ); } // game_stats::send_data() /*----------------------------------------------------------------------------*/ /** * \brief Send the stats to the destination set with set_destination. * \param xml_string The data to send. */ void bear::engine::game_stats::send( std::string xml_string ) const { const std::string prefix("http://"); if ( m_destination.find(prefix) != 0 ) return; http_post( m_destination.substr(prefix.length()), xml_string ); } // game_stats::send() /*----------------------------------------------------------------------------*/ /** * \brief Send the stats to a given server via HTTP POST. * \param address The address of the server to which the stats are sent. * \param xml_string The xml data to post at the given address. */ void bear::engine::game_stats::http_post ( std::string address, std::string xml_string ) const { statistic_sender sender; sender.address = address; sender.xml_string = xml_string; boost::thread t(sender); } // game_stats::http_post() /*----------------------------------------------------------------------------*/ /** * \brief Generates an XML representation of the stats. * \param operation The name of the operation stored in the stats. * \param vars The variables to put in the XML. */ std::string bear::engine::game_stats::generate_xml_stats ( std::string operation, std::list vars ) const { std::ostringstream result; result << "" << ""; for ( std::list::const_iterator it=vars.begin(); it != vars.end(); ++it ) result << "name << "='" << it->value << "'/>"; result << ""; return result.str(); } // game_stats::generate_xml_stats() plee-the-bear-20251226/bear-engine/core/src/engine/code/item_factory.cpp000066400000000000000000000015771512343254000256450ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::engine::item_factory class. * \author Julien Jorge */ #include "engine/item_factory.hpp" /*----------------------------------------------------------------------------*/ bear::engine::item_factory::factory_type* bear::engine::item_factory::s_factory_instance(NULL); /*----------------------------------------------------------------------------*/ /** * \brief Get the single instance of the factory. */ bear::engine::item_factory::factory_type& bear::engine::item_factory::get_instance() { if ( s_factory_instance == NULL ) s_factory_instance = new factory_type; return *s_factory_instance; } // item_factory::get_instance() plee-the-bear-20251226/bear-engine/core/src/engine/code/item_flag_type.cpp000066400000000000000000000057101512343254000261410ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the methods for the bear::engine::item_flag_type * type. * \author Julien Jorge */ #include "engine/item_flag_type.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Operator "&" for item_flag_type. * \param a Left operand. * \param b Right operand. */ bear::engine::item_flag_type bear::engine::operator& (bear::engine::item_flag_type a, bear::engine::item_flag_type b) { return item_flag_type(static_cast(a) & static_cast(b)); } // operator&() [item_flag_type] /*----------------------------------------------------------------------------*/ /** * \brief Operator "|" for item_flag_type. * \param a Left operand. * \param b Right operand. */ bear::engine::item_flag_type bear::engine::operator| (bear::engine::item_flag_type a, bear::engine::item_flag_type b) { return item_flag_type(static_cast(a) | static_cast(b)); } // operator|() [item_flag_type] /*----------------------------------------------------------------------------*/ /** * \brief Operator "^" for item_flag_type. * \param a Left operand. * \param b Right operand. */ bear::engine::item_flag_type bear::engine::operator^ (bear::engine::item_flag_type a, bear::engine::item_flag_type b) { return item_flag_type(static_cast(a) ^ static_cast(b)); } // operator^() [item_flag_type] /*----------------------------------------------------------------------------*/ /** * \brief Operator "~" for item_flag_type. * \param a Operand. */ bear::engine::item_flag_type bear::engine::operator~(bear::engine::item_flag_type a) { return item_flag_type(~static_cast(a)); } // operator~() [item_flag_type] /*----------------------------------------------------------------------------*/ /** * \brief Operator "&=" for item_flag_type. * \param a Left operand. * \param b Right operand. */ bear::engine::item_flag_type& bear::engine::operator&= (bear::engine::item_flag_type& a, bear::engine::item_flag_type b) { return a = a & b; } // operator&=() [item_flag_type] /*----------------------------------------------------------------------------*/ /** * \brief Operator "|=" for item_flag_type. * \param a Left operand. * \param b Right operand. */ bear::engine::item_flag_type& bear::engine::operator|= (bear::engine::item_flag_type& a, bear::engine::item_flag_type b) { return a = a | b; } // operator|=() [item_flag_type] /*----------------------------------------------------------------------------*/ /** * \brief Operator "^=" for item_flag_type. * \param a Left operand. * \param b Right operand. */ bear::engine::item_flag_type& bear::engine::operator^= (bear::engine::item_flag_type& a, bear::engine::item_flag_type b) { return a = a ^ b; } // operator^=() [item_flag_type] plee-the-bear-20251226/bear-engine/core/src/engine/code/level.cpp000066400000000000000000000652641512343254000242720ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::engine::level class. * \author Julien Jorge */ #include "engine/level.hpp" #include #include #include "engine/game.hpp" #include "engine/level_globals.hpp" #include "engine/layer/gui_layer.hpp" #include "engine/variable/base_variable.hpp" #include "universe/const_item_handle.hpp" #include "debug/scoped_time_measure.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param name The name of the level. * \param filename The filename of the level. * \param level_size The size of the level. * \param level_music The default music of the level. * \param shared_resources A level_globals from which we can take the resources * instead of building new ones in the new level. * \param resource_source A level_globals from which we can temporarily take * the resources instead of building new ones in the new level. */ bear::engine::level::level ( const std::string& name, const std::string& filename, const universe::size_box_type& level_size, const std::string& level_music, const level_globals* shared_resources, const level_globals* resource_source ) : m_name(name), m_filename(filename), m_camera(NULL), m_level_size(level_size), m_level_globals( new level_globals(shared_resources, resource_source) ), m_music(level_music), m_music_id(0), m_paused(0), m_overview_activated(false) { set_pause(); if ( !m_music.empty() ) m_level_globals->load_sound(m_music); } // level::level() /*----------------------------------------------------------------------------*/ /** * \brief Destructor. */ bear::engine::level::~level() { stop(); clear(); } // level::~level() /*----------------------------------------------------------------------------*/ /** * \brief Start the level. */ void bear::engine::level::start() { m_level_globals->freeze(); unset_pause(); for (unsigned int i=0; i!=m_layers.size(); ++i) m_layers[i]->start(); play_music(); m_started_signal(); } // level::start() /*----------------------------------------------------------------------------*/ /** * \brief Adds a function to call when the start of the level is done. * \param f The function to call. */ boost::signals2::connection bear::engine::level::on_started( boost::function f ) { return m_started_signal.connect( f ); } // bear::engine::level::on_started() /*----------------------------------------------------------------------------*/ /** * \brief Stop the level. */ void bear::engine::level::stop() { stop_music(); } // level::stop() /*----------------------------------------------------------------------------*/ /** * \brief Progress all layers in the active area. * \param elapsed_time Elapsed time since the last call. */ void bear::engine::level::progress( universe::time_type elapsed_time ) { BEAR_CREATE_SCOPED_TIMELOG( std::string("progress level") ); if ( !is_paused() ) { region_type active_regions; get_active_regions( active_regions ); for (unsigned int i=0; i!=m_layers.size(); ++i) { region_type areas(active_regions); get_layer_region(i, areas); m_layers[i]->update( areas, elapsed_time ); } if ( m_ears != universe::item_handle(NULL) ) m_level_globals->set_ears_position( m_ears->get_center_of_mass() ); else m_level_globals->set_ears_position( get_camera_center() ); set_sound_distance_unit(); } m_gui.progress( elapsed_time ); m_progress_done_signal(); } // level::progress() /*----------------------------------------------------------------------------*/ /** * \brief Adds a function to call when the progress of the level is over. * \param f The function to call. */ boost::signals2::connection bear::engine::level::on_progress_done( boost::function f ) { return m_progress_done_signal.connect( f ); } // bear::engine::level::on_progress_done() /*----------------------------------------------------------------------------*/ /** * \brief Draw the visible part of the level on the screen. * \param screen The screen on which we draw. */ void bear::engine::level::render( visual::screen& screen ) const { BEAR_CREATE_SCOPED_TIMELOG( std::string("render level") ); render_layers(screen); render_gui(screen); } // level::render() /*----------------------------------------------------------------------------*/ /** * \brief Set the position and the scale factor of a scene_element relatively to * the screen. * \param e The scene element in the level coordinates. */ bear::visual::scene_element bear::engine::level::element_to_screen_coordinates ( const visual::scene_element& e ) const { const universe::rectangle_type area( get_camera_focus() ); return element_to_screen_coordinates ( e, area.bottom_left(), (double)game::get_instance().get_screen_size().x / get_camera_size().x, (double)game::get_instance().get_screen_size().y / get_camera_size().y ); } // level::element_to_screen_coordinates() /*----------------------------------------------------------------------------*/ /** * \brief Create a big picture of the level. * \param screen The screen on which we do the captured drawings. * \param img The image in which we save the resulting capture. */ void bear::engine::level::shot ( visual::screen& screen, claw::graphic::image& img ) const { img.set_size( get_size().x, get_size().y ); claw::logger << claw::log_verbose << "Level image allocated." << std::endl; claw::graphic::image tmp(screen.get_size().x, screen.get_size().y); const double ratio = 1; const visual::color_type c = screen.get_background_color(); screen.set_background_color( claw::graphic::white_pixel ); for ( unsigned int y=0; ysound_exists( m_music ) ) m_music_id = m_level_globals->play_music( m_music ); } // level::play_music() /*----------------------------------------------------------------------------*/ /** * \brief Stop the music of the level. * \param fade_duration The length of the fade out of the music. */ void bear::engine::level::stop_music( universe::time_type fade_duration ) { m_level_globals->stop_music( m_music_id, fade_duration ); } // level::stop_music() /*----------------------------------------------------------------------------*/ /** * \brief Get the current camera. */ bear::universe::item_handle bear::engine::level::get_camera() { return m_camera; } // level::get_camera() /*----------------------------------------------------------------------------*/ /** * \brief Get the size of the camera. */ bear::universe::size_box_type bear::engine::level::get_camera_size() const { if ( m_camera == NULL ) return game::get_instance().get_screen_size(); else return m_camera->get_size(); } // level::get_camera_size() /*----------------------------------------------------------------------------*/ /** * \brief Get the focus of the camera. */ bear::universe::rectangle_type bear::engine::level::get_camera_focus() const { if ( m_camera == NULL ) return universe::rectangle_type ( 0, 0, game::get_instance().get_screen_size().x, game::get_instance().get_screen_size().y ); else return m_camera->get_bounding_box(); } // level::get_camera_focus() /*----------------------------------------------------------------------------*/ /** * \brief Get the position of the center of the camera. */ bear::universe::position_type bear::engine::level::get_camera_center() const { if ( m_camera == NULL ) return game::get_instance().get_screen_size() / 2; else return m_camera->get_center_of_mass(); } // level::get_camera_center() /*----------------------------------------------------------------------------*/ /** * \brief Sets the position of the ears in the sound system. * \param ears The item receiving the sounds. */ void bear::engine::level::set_ears( universe::item_handle ears ) { m_ears = ears; } // set_ears() /*----------------------------------------------------------------------------*/ /** * \brief Converts a position from the screen's coordinates into the coordinates * of the level. * \param p The position in the screen's coordinates. */ bear::universe::position_type bear::engine::level::screen_to_level( visual::position_type p ) const { const visual::size_box_type screen_size ( game::get_instance().get_window_size() ); const universe::rectangle_type camera_focus( get_camera_focus() ); return universe::position_type ( camera_focus.left() + p.x * camera_focus.width() / screen_size.x, camera_focus.bottom() + p.y * camera_focus.height() / screen_size.y ); } // level::screen_to_level() /*----------------------------------------------------------------------------*/ /** * \brief Get the value of a global variable. * \param val (in/out) The variable for which we want the value. */ void bear::engine::level::get_level_variable( base_variable& val ) const { val.get_value_from(m_level_variables); } // level::get_level_variable() /*----------------------------------------------------------------------------*/ /** * \brief Set the value of a global variable. * \param val (in/out) The variable for which we set the value. */ void bear::engine::level::set_level_variable( const base_variable& val ) { val.assign_value_to(m_level_variables); } // level::set_level_variable() /*----------------------------------------------------------------------------*/ /** * \brief Tell if a given variable exists in the level. * \param val (in/out) The variable to check. */ bool bear::engine::level::level_variable_exists( const base_variable& val ) const { return val.exists(m_level_variables); } // level::level_variable_exists() /*----------------------------------------------------------------------------*/ /** * \brief Draw the visible part of the level layers on the screen. * \param screen The screen on which we draw. */ void bear::engine::level::render_layers( visual::screen& screen ) const { universe::rectangle_type view; if ( m_overview_activated ) view.set( 0, 0, get_size().x, get_size().y ); else view = get_camera_focus(); render_layers( screen, view ); } // level::render_layers() /*----------------------------------------------------------------------------*/ /** * \brief Draw the visible part of the level layers on the screen. * \param screen The screen on which we draw. * \param view The region in the level from which the elements are taken. */ void bear::engine::level::render_layers ( visual::screen& screen, const universe::rectangle_type& view ) const { const double r_x = (double)screen.get_size().x / view.width(); const double r_y = (double)screen.get_size().y / view.height(); for (unsigned int i=0; i!=m_layers.size(); ++i) { // get four times the area covered by the camera region_type r; add_region( r, view, get_camera_size() / 2 ); universe::rectangle_type active( r.front() ); get_layer_area(i, active); // the active area scaled in the layer std::list visuals; m_layers[i]->get_visual( visuals, active ); universe::rectangle_type area( view ); get_layer_area(i, area); // the camera scaled in the layer const double layer_r_x ( std::max ( r_x, (double)screen.get_size().x / m_layers[i]->get_size().x ) ); const double layer_r_y ( std::max ( r_y, (double)screen.get_size().y / m_layers[i]->get_size().y ) ); render( visuals, area.bottom_left(), screen, layer_r_x, layer_r_y ); } } // level::render_layers() /*----------------------------------------------------------------------------*/ /** * \brief Draw the visible part of the level layers on the screen. * \param screen The screen on which we draw. */ void bear::engine::level::render_gui( visual::screen& screen ) const { gui_layer_stack::scene_element_list vis; m_gui.render(vis); for ( ; !vis.empty(); vis.pop_front() ) screen.render( vis.front() ); } // level::render_gui() /*----------------------------------------------------------------------------*/ /** * \brief Render the visible sprites. * \param visuals The sprites to display and their coordinates in the world. * \param cam_pos The position of the camera. * \param screen The screen on which we draw. * \param r_w Ratio on the width of the sprites. * \param r_h Ratio on the height of the sprites. */ void bear::engine::level::render ( const std::list& visuals, const universe::position_type& cam_pos, visual::screen& screen, double r_w, double r_h ) const { std::list::const_iterator it; for ( it=visuals.begin(); it!=visuals.end(); ++it ) screen.render ( element_to_screen_coordinates(it->scene_element, cam_pos, r_w, r_h) ); } // level::render() /*----------------------------------------------------------------------------*/ /** * \brief Set the position and the scale factor of a scene_visual relatively to * the screen. * \param e The scene element in the level coordinates. * \param cam_pos The position of the camera. * \param r_w Ratio on the width of the elements. * \param r_h Ratio on the height of the elements. */ bear::visual::scene_element bear::engine::level::element_to_screen_coordinates ( const visual::scene_element& e, const universe::position_type& cam_pos, double r_w, double r_h ) const { visual::scene_element result(e); // the y-axis of the screen is in reversed direction universe::position_type pos( result.get_position() - cam_pos ); result.set_position(pos.x * r_w, pos.y * r_h); result.set_scale_factor ( e.get_scale_factor_x() * r_w, e.get_scale_factor_y() * r_h); return result; } // level::element_to_screen_coordinates() /*----------------------------------------------------------------------------*/ /** * \brief Remove all the layers. */ void bear::engine::level::clear() { m_gui.clear(); std::for_each ( m_layers.begin(), m_layers.end(), claw::delete_function() ); m_layers.clear(); delete m_level_globals; m_level_globals = NULL; } // layer::clear() /*----------------------------------------------------------------------------*/ /** * \brief Get the repositioned region in a layer from the area in the * level/action layer. * \param layer_index The index of the layer in which we want the repositioned * region. * \param the_region (in) The region in the action layer, (out) the repositioned * region. */ void bear::engine::level::get_layer_region ( unsigned int layer_index, region_type& the_region ) const { region_type::iterator it; for (it=the_region.begin(); it!=the_region.end(); ++it) get_layer_area( layer_index, *it ); } // level::get_layer_region() /*----------------------------------------------------------------------------*/ /** * \brief Get the repositioned area in a layer from the area in the level/action * layer. * \param layer_index The index of the layer in which we want the repositioned * area. * \param area (in) The area in the level, (out) the repositioned area. */ void bear::engine::level::get_layer_area ( unsigned int layer_index, universe::rectangle_type& area ) const { if ( area.width() > m_layers[layer_index]->get_size().x ) area.left(0); else if ( m_level_size.x > area.width() ) area.left (( area.left() * ( m_layers[layer_index]->get_size().x - area.width() ) ) / ( m_level_size.x - area.width() )); if ( area.height() > m_layers[layer_index]->get_size().y ) area.bottom(0); else if ( m_level_size.y > area.height() ) area.bottom (( area.bottom() * ( m_layers[layer_index]->get_size().y - area.height() ) ) / ( m_level_size.y - area.height() )); } // level::get_layer_area() /*----------------------------------------------------------------------------*/ /** * \brief Find the active regions in the level. * \param active_regions (out) The active regions in the level. */ void bear::engine::level::get_active_regions( region_type& active_regions ) { activity_map_type::iterator it(m_activity.begin()); while ( it!=m_activity.end() ) if ( it->first == NULL ) { const activity_map_type::iterator tmp(it); ++it; m_activity.erase(tmp); } else { add_region ( active_regions, it->first->get_bounding_box(), it->second ); ++it; } add_region ( active_regions, get_camera_focus(), universe::size_box_type ( game::get_instance().get_active_area_margin(), game::get_instance().get_active_area_margin() ) ); } // level::get_active_regions() /*----------------------------------------------------------------------------*/ /** * \brief Adds an active region centered on a point in a list of regions. * \param active_regions (out) The active regions. * \param r The bounding box of the item around which there is an activity. * \param s The size of the area around the center. */ void bear::engine::level::add_region ( region_type& active_regions, const universe::rectangle_type& r, const universe::size_box_type& s ) const { universe::size_box_type box_size( r.size() ); const universe::position_type center ( r.left() + r.width() / 2, r.bottom() + r.height() / 2 ); box_size.x += 2 * s.x; box_size.y += 2 * s.y; universe::position_type bottom_left(0, 0); // set bottom-left position so we stay in the level if (center.x >= box_size.x / 2) bottom_left.x = center.x - box_size.x / 2; else box_size.x -= box_size.x / 2 - center.x; if (center.y >= box_size.y / 2) bottom_left.y = center.y - box_size.y / 2; else box_size.y -= box_size.y / 2 - center.y; // set size for the same reason if (bottom_left.x + box_size.x >= get_size().x) box_size.x = get_size().x - bottom_left.x; if (bottom_left.y + box_size.y >= get_size().y) box_size.y = get_size().y - bottom_left.y; active_regions.push_front ( universe::rectangle_type(bottom_left, bottom_left + box_size) ); } // level::add_region() /*----------------------------------------------------------------------------*/ /** * \brief Sets the distance unit in the sound system according to the size of * the screen and the size of the camera. */ void bear::engine::level::set_sound_distance_unit() const { const universe::rectangle_type view( get_camera_focus() ); const universe::size_box_type screen_size = game::get_instance().get_screen_size(); const double u = std::max( view.width() / screen_size.x, view.height() / screen_size.y ); m_level_globals->set_distance_unit( u ); } // level::set_sound_distance_unit() plee-the-bear-20251226/bear-engine/core/src/engine/code/level_globals.cpp000066400000000000000000001027461512343254000257720ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::engine::level_globals class. * \author Julien Jorge */ #include "engine/level_globals.hpp" #include "engine/bitmap_font_loader.hpp" #include "engine/model_loader.hpp" #include "engine/resource_pool.hpp" #include "engine/shader_loader.hpp" #include "engine/sprite_loader.hpp" #include "engine/spritepos.hpp" #include #include #include #include #include /*----------------------------------------------------------------------------*/ double bear::engine::level_globals::s_sound_volume(1); double bear::engine::level_globals::s_music_volume(1); bool bear::engine::level_globals::s_sound_muted(false); bool bear::engine::level_globals::s_music_muted(false); /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ bear::engine::level_globals::level_globals() : m_shared_resources(NULL), m_temporary_resources(NULL), m_frozen(false) { constructor_default(); } // level_globals::level_globals() /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param shared Another level_globals from which we can take the resources * instead of building new ones. * \param temporary_resources Another level_globals from which we can * temporarily take the resources instead of building new ones. */ bear::engine::level_globals::level_globals ( const level_globals* shared, const level_globals* temporary_resources ) : m_shared_resources( shared ), m_temporary_resources( temporary_resources ), m_frozen(false) { constructor_default(); } // level_globals::level_globals() void bear::engine::level_globals::add_image ( const std::string& file_name, const bear::visual::image& image ) { if ( image_exists(file_name) ) return; m_image_manager.add_image(file_name, image); } /*----------------------------------------------------------------------------*/ /** * \brief Load an image. * \param file_name The name of the file to load the image from. */ void bear::engine::level_globals::load_image( const std::string& file_name ) { if ( image_exists(file_name) ) return; if ( (m_temporary_resources != NULL) && m_temporary_resources->image_exists( file_name ) ) m_image_manager.add_image ( file_name, m_temporary_resources->get_existing_image( file_name ) ); else { claw::logger << claw::log_verbose << "loading image '" << file_name << "'." << std::endl; std::stringstream f; resource_pool::get_instance().get_file(file_name, f); if (f) m_image_manager.load_image(file_name, f); else claw::logger << claw::log_error << "can not open file '" << file_name << "'." << std::endl; } } // level_globals::load_image() /*----------------------------------------------------------------------------*/ /** * \brief Load a sound. * \param file_name The name of the file to load the sound from. */ void bear::engine::level_globals::load_sound( const std::string& file_name ) { if ( m_sound_manager.sound_exists(file_name) ) return; const level_globals* source(NULL); if ( ( m_shared_resources != NULL ) && m_shared_resources->sound_exists( file_name ) ) source = m_shared_resources; else if ( (m_temporary_resources != NULL) && m_temporary_resources->sound_exists( file_name ) ) source = m_temporary_resources; if ( source != NULL ) m_sound_manager.copy_sound( file_name, source->m_sound_manager ); else { claw::logger << claw::log_verbose << "loading sound '" << file_name << "'." << std::endl; std::stringstream f; resource_pool::get_instance().get_file(file_name, f); if (f) m_sound_manager.load_sound(file_name, f); else claw::logger << claw::log_error << "can not open file '" << file_name << "'." << std::endl; } } // level_globals::load_sound() /*----------------------------------------------------------------------------*/ /** * \brief Load a model. * \param file_name The name of the file to load the model from. */ void bear::engine::level_globals::load_model( const std::string& file_name ) { if ( !model_exists(file_name) ) { claw::logger << claw::log_verbose << "loading model '" << file_name << "'." << std::endl; std::stringstream f; resource_pool::get_instance().get_file(file_name, f); if (f) { model_loader ldr( f, *this ); model_actor* m = ldr.run(); m_model[file_name] = *m; delete m; } else claw::logger << claw::log_error << "can not open file '" << file_name << "'." << std::endl; } } // level_globals::load_model() /*----------------------------------------------------------------------------*/ /** * \brief Load an animation. * \param file_name The name of the file to load the animation from. */ void bear::engine::level_globals::load_animation( const std::string& file_name ) { if ( !animation_exists(file_name) ) { claw::logger << claw::log_verbose << "loading animation '" << file_name << "'." << std::endl; std::stringstream f; resource_pool::get_instance().get_file(file_name, f); if (f) { compiled_file cf(f, true); sprite_loader ldr; m_animation[file_name] = ldr.load_animation( cf, *this ); } else claw::logger << claw::log_error << "can not open file '" << file_name << "'." << std::endl; } } // level_globals::load_animation() /*----------------------------------------------------------------------------*/ /** * \brief Load a font. * \param file_name Path to the font file. * \todo Implement the support of true type fonts. */ void bear::engine::level_globals::load_font( const std::string& file_name ) { if ( !font_exists(file_name) ) { claw::logger << claw::log_verbose << "loading font '" << file_name << "'." << std::endl; std::stringstream f; resource_pool::get_instance().get_file(file_name, f); if (f) { if ( boost::algorithm::ends_with( file_name, ".fnt" ) ) { bitmap_font_loader ldr( f, *this ); m_font_manager.load_font( file_name, ldr.run() ); } else m_font_manager.load_font( file_name, f ); } else claw::logger << claw::log_error << "can not open file '" << file_name << "'." << std::endl; } } // level_globals::load_font() /*----------------------------------------------------------------------------*/ /** * \brief Loads a shader program. * \param file_name The name of the file to load the shader from. */ void bear::engine::level_globals::load_shader( const std::string& file_name ) { if ( !shader_exists(file_name) ) { claw::logger << claw::log_verbose << "loading shader '" << file_name << "'." << std::endl; std::stringstream f; shader_loader::parse_shader_file( f, file_name ); if (f) m_image_manager.load_shader_program(file_name, f); else claw::logger << claw::log_error << "can not open file '" << file_name << "'." << std::endl; } } // level_globals::load_shader() /*----------------------------------------------------------------------------*/ /** * \brief Gets an image. * \param name The name of the image to get. * \pre There is an image named \a name. */ bear::visual::image bear::engine::level_globals::get_image( const std::string& name ) { if ( !image_exists(name) ) { warn_missing_ressource( name ); load_image(name); } return get_existing_image( name ); } // level_globals::get_image() /*----------------------------------------------------------------------------*/ /** * \brief Gets an image with a given name. The image must exist in this instance * or in the shared resources. * \pre There is an image named \a name. */ bear::visual::image bear::engine::level_globals::get_existing_image( const std::string& name ) const { CLAW_PRECOND( image_exists( name ) ); if ( m_image_manager.exists( name ) ) return m_image_manager.get_image( name ); else return m_shared_resources->get_existing_image( name ); } // level_globals::get_existing_image() /*----------------------------------------------------------------------------*/ /** * \brief Gets a model. * \param name The name of the model to get. */ const bear::engine::model_actor& bear::engine::level_globals::get_model( const std::string& name ) { if ( !model_exists(name) ) { warn_missing_ressource( name ); load_model(name); } return get_existing_model( name ); } // level_globals::get_model() /*----------------------------------------------------------------------------*/ /** * \brief Gets a model with a given name. The model must exist in this instance * or in the shared resources. * \param name The name of the model to get. */ const bear::engine::model_actor& bear::engine::level_globals::get_existing_model( const std::string& name ) const { CLAW_PRECOND( model_exists( name ) ); if ( m_model.find( name ) != m_model.end() ) return m_model.find( name )->second; else return m_shared_resources->get_existing_model( name ); } // level_globals::get_existing_model() /*----------------------------------------------------------------------------*/ /** * \brief Get an animation. * \param name The name of the animation to get. */ const bear::visual::animation& bear::engine::level_globals::get_animation( const std::string& name ) { if ( !animation_exists(name) ) { warn_missing_ressource( name ); load_animation(name); } return get_existing_animation( name ); } // level_globals::get_animation() /*----------------------------------------------------------------------------*/ /** * \brief Gets a animation with a given name. The animation must exist in this * instance or in the shared resources. * \param name The name of the animation to get. */ const bear::visual::animation& bear::engine::level_globals::get_existing_animation ( const std::string& name ) const { CLAW_PRECOND( animation_exists( name ) ); if ( m_animation.find( name ) != m_animation.end() ) return m_animation.find( name )->second; else return m_shared_resources->get_existing_animation( name ); } // level_globals::get_existing_animation() /*----------------------------------------------------------------------------*/ /** * \brief Gets a font, loads it if it does not exist yet. * \param name The name of the font. * \param size The size of the font. */ bear::visual::font bear::engine::level_globals::get_font( const std::string& name, double size ) { if ( !font_exists(name) ) { warn_missing_ressource( name ); load_font(name); } return get_existing_font( name, size ); } // level_globals::get_font() /*----------------------------------------------------------------------------*/ /** * \brief Gets a font with a given name. The font must exist in this instance * or in the shared resources. * \param name The name of the font to get. * \param size The size of the font. */ bear::visual::font bear::engine::level_globals::get_existing_font ( const std::string& name, double size ) const { CLAW_PRECOND( font_exists( name ) ); if ( m_font_manager.exists( name ) ) return m_font_manager.get_font( name, size ); else return m_shared_resources->get_existing_font( name, size ); } // level_globals::get_existing_font() /*----------------------------------------------------------------------------*/ /** * \brief Gets a shader. * \param name The name of the shader to get. * \pre There is a shader named \a name. */ bear::visual::shader_program bear::engine::level_globals::get_shader( const std::string& name ) { if ( !shader_exists(name) ) { warn_missing_ressource( name ); load_shader(name); } return get_existing_shader( name ); } // level_globals::get_shader() /*----------------------------------------------------------------------------*/ /** * \brief Gets a shader with a given name. The shader must exist in this * instance or in the shared resources. * \pre There is an shader named \a name. */ bear::visual::shader_program bear::engine::level_globals::get_existing_shader ( const std::string& name ) const { CLAW_PRECOND( shader_exists( name ) ); if ( m_image_manager.has_shader_program( name ) ) return m_image_manager.get_shader_program( name ); else return m_shared_resources->get_existing_shader( name ); } // level_globals::get_existing_shader() /*----------------------------------------------------------------------------*/ /** * \brief Get the name of the spritepos file associated with a given image. * \param image_name The name of the image. */ std::string bear::engine::level_globals::get_spritepos_path ( const std::string& image_name ) const { std::size_t pos( image_name.find_last_of('.') ); if ( pos != std::string::npos ) { const std::string candidate( image_name.substr(0, pos) + ".spritepos" ); if ( resource_pool::get_instance().exists( candidate ) ) return candidate; } return std::string(); } // level_globals::get_spritepos_path() /*----------------------------------------------------------------------------*/ /** * \brief Create a sprite by reading its position and its size in the spritepos * file associated with the image. * \param image_name The name of the image. * \param sprite_name The name of the sprite in the spritepos file. * \remark The spritepos file in opened in each call and read until the sprite * is found. */ bear::visual::sprite bear::engine::level_globals::auto_sprite ( const std::string& image_name, const std::string& sprite_name ) { const spritepos_entry entry(image_name, sprite_name); const auto_sprite_cache::const_iterator it ( m_auto_sprite_cache.find( entry ) ); if ( it != m_auto_sprite_cache.end() ) return it->second; const std::string spritepos_file( get_spritepos_path(image_name) ); visual::sprite result; if ( !spritepos_file.empty() ) { std::stringstream f; resource_pool::get_instance().get_file( spritepos_file, f ); if (f) { const spritepos s(f); const spritepos::const_iterator it( s.find( sprite_name ) ); if ( it != s.end() ) { const visual::image& img( get_image(image_name) ); result = visual::sprite( img, it->get_clip() ); } else claw::logger << claw::log_error << "can not find a valid sprite '" << sprite_name << "' in the spritepos file of '" << image_name << "'." << std::endl; } else claw::logger << claw::log_error << "can not open spritepos file for '" << image_name << "'." << std::endl; } m_auto_sprite_cache[ entry ] = result; return result; } // level_globals::auto_sprite() /*----------------------------------------------------------------------------*/ /** * \brief Start to play a sound. * \param name The name of the sound to play. */ void bear::engine::level_globals::play_sound( const std::string& name ) { // The sounds cannot be shared between the level globals, thus we search only // in this instance. if ( !m_sound_manager.sound_exists(name) ) { warn_missing_ressource( name ); load_sound(name); } m_sound_manager.play_sound( name ); } // level_globals::play_sound() /*----------------------------------------------------------------------------*/ /** * \brief Start to play the sound, with an effect. * \param name The name of the sound to play. * \param effect The effect applied to the sound. */ void bear::engine::level_globals::play_sound ( const std::string& name, const audio::sound_effect& effect ) { // The sounds cannot be shared between the level globals, thus we search only // in this instance. if ( !m_sound_manager.sound_exists(name) ) { warn_missing_ressource( name ); load_sound(name); } m_sound_manager.play_sound( name, effect ); } // level_globals::play_sound() /*----------------------------------------------------------------------------*/ /** * \brief Create a new sample of a sound. * \param name The name of the sound to get. */ bear::audio::sample* bear::engine::level_globals::new_sample( const std::string& name ) { // The sounds cannot be shared between the level globals, thus we search only // in this instance. if ( !m_sound_manager.sound_exists(name) ) { warn_missing_ressource( name ); load_sound(name); } return m_sound_manager.new_sample(name); } // level_globals::new_sample() /*----------------------------------------------------------------------------*/ /** * \brief Create a copy of a sample. * \param s The sample to copy. */ bear::audio::sample* bear::engine::level_globals::new_sample( const audio::sample& s ) { // The sounds cannot be shared between the level globals, thus we search only // in this instance. return m_sound_manager.new_sample(s); } // level_globals::new_sample() /*----------------------------------------------------------------------------*/ /** * \brief Play a music. * \param name The name of the music to play. * \param loops How many times the music loops (zero means infinite). * \return The identifier of the music. * \remark identifiers are strictly greater than zero. */ std::size_t bear::engine::level_globals::play_music ( const std::string& name, unsigned int loops ) { // The sounds cannot be shared between the level globals, thus we search only // in this instance. if ( !m_sound_manager.sound_exists(name) ) { warn_missing_ressource( name ); load_sound(name); } return m_sound_manager.play_music(name, loops); } // level_globals::play_music() /*----------------------------------------------------------------------------*/ /** * \brief Stop the music. * \param id The identifier of the music. * \param fadeout The duration of the fadeout, if any. */ void bear::engine::level_globals::stop_music( std::size_t id, double fadeout ) { m_sound_manager.stop_music(id, fadeout); } // level_globals::stop_music() /*----------------------------------------------------------------------------*/ /** * \brief Stop all musics. * \param fadeout The duration of the fadeout, if any. */ void bear::engine::level_globals::stop_all_musics( double fadeout ) { m_sound_manager.stop_all_musics( fadeout ); } // level_globals::stop_all_musics() /*----------------------------------------------------------------------------*/ /** * \brief Pause all music and sounds. */ void bear::engine::level_globals::pause_audio() { m_sound_manager.pause_all(); } // level_globals::pause_audio() /*----------------------------------------------------------------------------*/ /** * \brief Resume all music and sounds. */ void bear::engine::level_globals::resume_audio() { m_sound_manager.resume_all(); } // level_globals::resume_audio() /*----------------------------------------------------------------------------*/ /** * \brief Mute/unmute the sounds. * \param m The mute status. */ void bear::engine::level_globals::global_set_sound_muted( bool m ) { s_sound_muted = m; } // level_globals::global_set_sound_muted() /*----------------------------------------------------------------------------*/ /** * \brief Tell if the sound is muted. */ bool bear::engine::level_globals::global_get_sound_muted() { return s_sound_muted; } // level_globals::global_get_sound_muted() /*----------------------------------------------------------------------------*/ /** * \brief Set the volume of the sounds. * \param v The volume. */ void bear::engine::level_globals::global_set_sound_volume( double v ) { s_sound_volume = v; } // level_globals::global_set_sound_volume() /*----------------------------------------------------------------------------*/ /** * \brief Get the volume of the sounds. */ double bear::engine::level_globals::global_get_sound_volume() { return s_sound_volume; } // level_globals::global_get_sound_volume() /*----------------------------------------------------------------------------*/ /** * \brief Mute/unmute the music. * \param m The mute status. */ void bear::engine::level_globals::global_set_music_muted( bool m ) { s_music_muted = m; } // level_globals::global_set_music_muted() /*----------------------------------------------------------------------------*/ /** * \brief Tell if the music is muted. */ bool bear::engine::level_globals::global_get_music_muted() { return s_music_muted; } // level_globals::global_get_music_muted() /*----------------------------------------------------------------------------*/ /** * \brief Set the volume of the musics. * \param v The volume. */ void bear::engine::level_globals::global_set_music_volume( double v ) { s_music_volume = v; } // level_globals::global_set_music_volume() /*----------------------------------------------------------------------------*/ /** * \brief Get the volume of the musics. */ double bear::engine::level_globals::global_get_music_volume() { return s_music_volume; } // level_globals::global_get_music_volume() /*----------------------------------------------------------------------------*/ /** * \brief Set the volume of the sounds. * \param v The new volume. */ void bear::engine::level_globals::set_sound_volume( double v ) { global_set_sound_volume(v); if (!s_sound_muted) m_sound_manager.set_sound_volume(v); } // level_globals::set_sound_volume() /*----------------------------------------------------------------------------*/ /** * \brief Set the volume of the music. * \param v The new volume. */ void bear::engine::level_globals::set_music_volume( double v ) { global_set_music_volume(v); if (!s_music_muted) m_sound_manager.set_music_volume(v); } // level_globals::set_music_volume() /*----------------------------------------------------------------------------*/ /** * \brief Mute/unmute the sound and the music. * \param m The mute status. */ void bear::engine::level_globals::mute( bool m ) { mute_sound(m); mute_music(m); } // level_globals::mute() /*----------------------------------------------------------------------------*/ /** * \brief Mute/unmute the sounds. * \param m The mute status. */ void bear::engine::level_globals::mute_sound( bool m ) { global_set_sound_muted(m); if ( global_get_sound_muted() ) m_sound_manager.set_sound_volume(0); else m_sound_manager.set_sound_volume( global_get_sound_volume() ); } // level_globals::mute_sound() /*----------------------------------------------------------------------------*/ /** * \brief Mute/unmute the music. * \param m The mute status. */ void bear::engine::level_globals::mute_music( bool m ) { global_set_music_muted(m); if ( global_get_music_muted() ) m_sound_manager.set_music_volume(0); else m_sound_manager.set_music_volume( global_get_music_volume() ); } // level_globals::mute_music() /*----------------------------------------------------------------------------*/ /** * \brief Tell if there is an image with a given name. * \param name The name of the image to check. */ bool bear::engine::level_globals::image_exists( const std::string& name ) const { if ( m_image_manager.exists(name) ) return true; else if ( m_shared_resources != NULL ) return m_shared_resources->image_exists( name ); else return false; } // level_globals::image_exists() /*----------------------------------------------------------------------------*/ /** * \brief Tell if there is a sound with a given name. * \param name The name of the sound to check. */ bool bear::engine::level_globals::sound_exists( const std::string& name ) const { // The sounds cannot be shared between the level globals, thus we search only // in this instance. if ( m_sound_manager.sound_exists(name) ) return true; else return false; } // level_globals::sound_exists() /*----------------------------------------------------------------------------*/ /** * \brief Tell if there is a model with a given name. * \param name The name of the model to check. */ bool bear::engine::level_globals::model_exists( const std::string& name ) const { // The sounds of the model cannot be shared between the level globals, thus // we search the model only in this instance until we find a new solution. if ( m_model.find(name) != m_model.end() ) return true; else return false; } // level_globals::model_exists() /*----------------------------------------------------------------------------*/ /** * \brief Tell if there is an animation with a given name. * \param name The name of the animation to check. */ bool bear::engine::level_globals::animation_exists( const std::string& name ) const { if ( m_animation.find(name) != m_animation.end() ) return true; else if ( m_shared_resources != NULL ) return m_shared_resources->animation_exists( name ); else return false; } // level_globals::animation_exists() /*----------------------------------------------------------------------------*/ /** * \brief Tell if there is a font with a given name. * \param name The name of the font to check. */ bool bear::engine::level_globals::font_exists( const std::string& name ) const { if ( m_font_manager.exists(name) ) return true; else if ( m_shared_resources != NULL ) return m_shared_resources->font_exists( name ); else return false; } // level_globals::font_exists() /*----------------------------------------------------------------------------*/ /** * \brief Tell if there is a shader with a given name. * \param name The name of the shader to check. */ bool bear::engine::level_globals::shader_exists( const std::string& name ) const { if ( m_image_manager.has_shader_program(name) ) return true; else if ( m_shared_resources != NULL ) return m_shared_resources->shader_exists( name ); else return false; } // level_globals::shader_exists() /*----------------------------------------------------------------------------*/ /** * \brief Register an item in the post office. * \param item The item to register. */ void bear::engine::level_globals::register_item ( communication::messageable& item ) { m_post_office.register_item( &item ); } // level_globals::register_item() /*----------------------------------------------------------------------------*/ /** * \brief Release an item from the post office. * \param item The item to release. */ void bear::engine::level_globals::release_item ( communication::messageable& item ) { m_post_office.release_item( &item ); } // level_globals::release_item() /*----------------------------------------------------------------------------*/ /** * \brief Send a message to an item via the post office. * \param name The name of the item to contact. * \param msg The message to send to this item. */ bool bear::engine::level_globals::send_message ( const std::string& target, communication::message& msg ) const { return m_post_office.send_message( target, msg ); } // level_globals::send_message() /*----------------------------------------------------------------------------*/ /** * \brief Set the position of the ears. * \param position The new position. */ void bear::engine::level_globals::set_ears_position ( const claw::math::coordinate_2d& position ) { m_sound_manager.set_ears_position(position); } // level_globals::set_ears_position() /*----------------------------------------------------------------------------*/ /** * \brief Sets the distance under which sounds are at maximum volume. * \param d The distance. */ void bear::engine::level_globals::set_full_volume_distance( double d ) { m_sound_manager.set_full_volume_distance( d ); } // level_globals::set_full_volume_distance() /*----------------------------------------------------------------------------*/ /** * \brief Returns the distance under which sounds are at maximum volume. */ double bear::engine::level_globals::get_full_volume_distance() const { return m_sound_manager.get_full_volume_distance(); } // level_globals::get_full_volume_distance() /*----------------------------------------------------------------------------*/ /** * \brief Sets the distance from which we can't hear a sound. * \param d The distance. */ void bear::engine::level_globals::set_silence_distance( double d ) { m_sound_manager.set_silence_distance( d ); } // level_globals::set_silence_distance() /*----------------------------------------------------------------------------*/ /** * \brief Returns the distance from which we can't hear a sound. */ double bear::engine::level_globals::get_silence_distance() const { return m_sound_manager.get_silence_distance(); } // level_globals::get_silence_distance() /*----------------------------------------------------------------------------*/ /** * \brief Sets the unit of the measures applied in the computation of the * distances for the sound effects. * \param d The unit. * \remark The function has no effect if d <= 0; */ void bear::engine::level_globals::set_distance_unit( double d ) { m_sound_manager.set_distance_unit( d ); } // level_globals::set_distance_unit() /*----------------------------------------------------------------------------*/ /** * \brief Returns the unit of the measures applied in the computation of the * distances for the sound effects. */ double bear::engine::level_globals::get_distance_unit() const { return m_sound_manager.get_distance_unit(); } // level_globals::get_distance_unit() /*----------------------------------------------------------------------------*/ /** * \brief Reload the resources. */ void bear::engine::level_globals::restore_resources() { restore_images(); restore_shader_programs(); } // level_globals::restore_resources() /*----------------------------------------------------------------------------*/ /** * \brief Tells that no more resources are supposed to be created. */ void bear::engine::level_globals::freeze() { m_frozen = true; m_temporary_resources = NULL; } // level_globals::freeze() /*----------------------------------------------------------------------------*/ /** * \brief Prints a warning telling that a resource was not preloaded. * \param name The name of the resource. */ void bear::engine::level_globals::warn_missing_ressource( std::string name ) const { if ( m_frozen ) claw::logger << claw::log_warning << "The following resource was not preloaded: '" << name << "'." << std::endl; } // level_globals::warn_missing_ressource() /*----------------------------------------------------------------------------*/ /** * \brief Reload the images. */ void bear::engine::level_globals::restore_images() { std::vector names; m_image_manager.get_image_names(names); // Clearing the images will delete the textures. All images must be cleared // before restoring any image, otherwise one of the older images may delete a // texture whose id is used by a restored image. m_image_manager.clear_images(); m_font_manager.clear_fonts(); if ( m_shared_resources != NULL ) const_cast( m_shared_resources )->restore_images(); for (unsigned int i=0; i!=names.size(); ++i) { claw::logger << claw::log_verbose << "restoring image '" << names[i] << "'." << std::endl; std::stringstream f; resource_pool::get_instance().get_file(names[i], f); if (f) m_image_manager.restore_image(names[i], f); else claw::logger << claw::log_error << "cannot open file '" << names[i] << "'." << std::endl; } m_font_manager.restore_fonts(); } // level_globals::restore_images() /*----------------------------------------------------------------------------*/ /** * \brief Reload the shaders. */ void bear::engine::level_globals::restore_shader_programs() { std::vector names; m_image_manager.get_shader_program_names(names); // Clearing the shaders will delete programs. All shaders must be cleared // before restoring any shader, otherwise one of the older shaders may delete // a program whose id is used by a restored shader. m_image_manager.clear_shader_programs(); if ( m_shared_resources != NULL ) const_cast( m_shared_resources )->restore_shader_programs(); for (unsigned int i=0; i!=names.size(); ++i) { claw::logger << claw::log_verbose << "restoring shader '" << names[i] << "'." << std::endl; std::stringstream f; shader_loader::parse_shader_file( f, names[i] ); if (f) m_image_manager.restore_shader_program(names[i], f); else claw::logger << claw::log_error << "cannot open file '" << names[i] << "'." << std::endl; } } // level_globals::restore_shader_programs() /*----------------------------------------------------------------------------*/ /** * \brief Do the initializations that must be done in each constructor. */ void bear::engine::level_globals::constructor_default() { if (s_sound_muted) m_sound_manager.set_sound_volume(0); else m_sound_manager.set_sound_volume(s_sound_volume); if (s_music_muted) m_sound_manager.set_music_volume(0); else m_sound_manager.set_music_volume(s_music_volume); } // level_globals::constructor_default() plee-the-bear-20251226/bear-engine/core/src/engine/code/level_loader.cpp000066400000000000000000000750061512343254000256130ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::engine::level_loader class. * \author Julien Jorge */ #include "engine/level_loader.hpp" #include "level_code_value.hpp" #include "engine/base_item.hpp" #include "engine/compiled_file.hpp" #include "engine/export_function.hpp" #include "engine/game.hpp" #include "engine/item_factory.hpp" #include "engine/level.hpp" #include "engine/level_globals.hpp" #include "engine/libraries_pool.hpp" #include "engine/sprite_loader.hpp" #include "engine/i18n/translator.hpp" #include "engine/layer/layer_creator.hpp" #include "engine/layer/layer_factory.hpp" #include "engine/loader/item_loader_map.hpp" #include "easing.hpp" #include /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param f The file from which we load the level. * \param path The path of the level to load. * \param shared_resources A level_globals from which we can take the resources * instead of building new ones in the new level. * \param resource_source A level_globals from which we can temporarily take * the resources instead of building new ones in the new level. */ bear::engine::level_loader::level_loader ( compiled_file& f, const std::string& path, const level_globals* shared_resources, const level_globals* resource_source ) : m_level(NULL), m_layer(NULL), m_file(f), m_current_item(NULL), m_current_loader(NULL), m_items_count(0), m_item_index(0), m_maj(0), m_min(0), m_rel(0) { if ( !(m_file >> m_maj >> m_min >> m_rel) ) throw claw::exception( "Can't read the version of the level file." ); if ( (m_maj != 0) || (m_min <= 4) ) throw claw::exception( "This version of the level file is not supported." ); unsigned int layers_count; std::string level_music; universe::size_box_type level_size; std::string name("Anonymous"); if ( (m_maj == 0) && (m_min >= 5) ) m_file >> name; m_file >> level_size.x >> level_size.y >> level_music >> m_items_count >> layers_count >> m_next_code; m_level = new level ( name, path, level_size, level_music, shared_resources, resource_source ); } // level_loader::level_loader() /*----------------------------------------------------------------------------*/ /** * \brief Destructor. */ bear::engine::level_loader::~level_loader() { delete m_level; delete m_current_item; delete m_current_loader; } // level_loader::~level_loader() /*----------------------------------------------------------------------------*/ /** * \brief Get the index of the currently loaded item. */ unsigned int bear::engine::level_loader::get_item_index() const { return m_item_index; } // level_loader::get_item_index() /*----------------------------------------------------------------------------*/ /** * \brief Get the total number of items in the currently loaded layer. */ unsigned int bear::engine::level_loader::get_items_count() const { return m_items_count; } // level_loader::get_items_count() /*----------------------------------------------------------------------------*/ /** * \brief Extract the level. * \pre m_level != NULL. */ bear::engine::level* bear::engine::level_loader::drop_level() { CLAW_PRECOND( m_level != NULL ); bear::engine::level* result( m_level ); m_level = NULL; return result; } // level_loader::drop_level() /*----------------------------------------------------------------------------*/ /** * \brief Load the whole level at once. */ void bear::engine::level_loader::complete_run() { bool stop = false; do { stop = one_step(); } while( !stop ); } // level_loader::run() /*----------------------------------------------------------------------------*/ /** * \brief Load the next thing to load. * \return true if the level is completely loaded. */ bool bear::engine::level_loader::one_step() { bool result = true; if ( m_current_item != NULL ) result = one_step_item(); if ( result ) // no item or completed item result = one_step_level(); return result; } // level_loader::one_step() /*----------------------------------------------------------------------------*/ /** * \brief Load the next thing to load in the item (fields). * \return true if the item is completely loaded. */ bool bear::engine::level_loader::one_step_item() { bool result = false; switch( m_next_code ) { case level_code_value::field_list : load_item_field_list(); break; case level_code_value::field_int : load_item_field_int(); break; case level_code_value::field_u_int : load_item_field_u_int(); break; case level_code_value::field_real : load_item_field_real(); break; case level_code_value::field_bool : load_item_field_bool(); break; case level_code_value::field_string : load_item_field_string(); break; case level_code_value::field_sprite : load_item_field_sprite(); break; case level_code_value::field_animation : load_item_field_animation(); break; case level_code_value::field_item : load_item_field_item(); break; case level_code_value::field_sample : load_item_field_sample(); break; case level_code_value::field_font : load_item_field_font(); break; case level_code_value::field_color : load_item_field_color(); break; case level_code_value::field_easing : load_item_field_easing(); break; default: { validate_current_item(); result = true; } } return result; } // level_loader::one_step_item() /*----------------------------------------------------------------------------*/ /** * \brief Load the next thing to load in the level. * \return true if the level is completely loaded. */ bool bear::engine::level_loader::one_step_level() { bool result = false; switch( m_next_code ) { case level_code_value::layer : load_layer(); break; case level_code_value::item_declaration : load_item_declaration(); break; case level_code_value::item_definition : load_item_definition(); break; case level_code_value::base_item : load_item(); break; case level_code_value::eof: result = true; } return result; } // level_loader::one_step_level() /*----------------------------------------------------------------------------*/ /** * \brief Load the action layer. */ void bear::engine::level_loader::load_layer() { claw::math::coordinate_2d size; std::string class_name; std::string tag; m_file >> class_name >> size.x >> size.y; if ( (m_maj == 0) && (m_min >= 9) ) m_file >> tag; m_file >> m_next_code; m_referenced_index = 0; m_referenced.clear(); m_layer = create_layer_from_string( class_name, size ); if ( (m_maj == 0) && (m_min >= 9) ) m_layer->set_tag(tag); m_level->push_layer( m_layer ); } // level_loader::load_layer() /*----------------------------------------------------------------------------*/ /** * \brief Validate the current item and add it in the level. */ void bear::engine::level_loader::validate_current_item() { assert( m_current_item != NULL ); if ( !m_current_item->is_valid() ) throw claw::exception ( std::string("Invalid item: ") + m_current_item->get_class_name() ); m_layer->add_item( *m_current_item ); m_current_item = NULL; delete m_current_loader; m_current_loader = NULL; } // level_loader::validate_current_item() /*----------------------------------------------------------------------------*/ /** * \brief Instanciate an item inheriting from bear::engine::base_item. */ void bear::engine::level_loader::load_item_declaration() { CLAW_PRECOND( m_current_item == NULL ); CLAW_PRECOND( m_current_loader == NULL ); unsigned int n; std::string class_name; m_file >> n; m_referenced.resize(n); claw::logger << claw::log_verbose << "Preparing " << n << " items." << std::endl; for (unsigned int i=0; i!=n; ++i) { m_file >> class_name; m_referenced[i] = create_item_from_string(class_name); } m_file >> m_next_code; } // level_loader::load_item_declaration() /*----------------------------------------------------------------------------*/ /** * \brief Fill the fields of a referenced item. */ void bear::engine::level_loader::load_item_definition() { CLAW_PRECOND( m_current_item == NULL ); CLAW_PRECOND( m_current_loader == NULL ); claw::logger << claw::log_verbose << "Defining item #" << m_referenced_index << ' ' << m_referenced[m_referenced_index]->get_class_name() << std::endl; bool fixed; m_current_item = m_referenced[m_referenced_index]; m_current_loader = new item_loader_map( m_current_item->get_loaders() ); m_file >> fixed >> m_next_code; ++m_referenced_index; if (fixed) m_current_item->set_insert_as_static(); } // level_loader::load_item_definition() /*----------------------------------------------------------------------------*/ /** * \brief Load an item inheriting from bear::engine::base_item. */ void bear::engine::level_loader::load_item() { CLAW_PRECOND( m_current_item == NULL ); CLAW_PRECOND( m_current_loader == NULL ); std::string class_name; bool fixed; m_file >> class_name >> fixed >> m_next_code; ++m_item_index; m_current_item = create_item_from_string(class_name); m_current_loader = new item_loader_map( m_current_item->get_loaders() ); if (fixed) m_current_item->set_insert_as_static(); } // level_loader::load_item() /*----------------------------------------------------------------------------*/ /** * \brief Load the a field of type list. */ void bear::engine::level_loader::load_item_field_list() { CLAW_PRECOND(m_next_code == level_code_value::field_list); m_file >> m_next_code; switch( m_next_code ) { case level_code_value::field_int: load_item_field_int_list(); break; case level_code_value::field_u_int: load_item_field_u_int_list(); break; case level_code_value::field_real: load_item_field_real_list(); break; case level_code_value::field_bool: load_item_field_bool_list(); break; case level_code_value::field_string: load_item_field_string_list(); break; case level_code_value::field_sprite: load_item_field_sprite_list(); break; case level_code_value::field_animation: load_item_field_animation_list(); break; case level_code_value::field_item: load_item_field_item_list(); break; case level_code_value::field_sample: load_item_field_sample_list(); break; case level_code_value::field_font: load_item_field_font_list(); break; case level_code_value::field_color: load_item_field_color_list(); break; case level_code_value::field_easing: load_item_field_easing_list(); break; } } // level_loader::load_item_field_list() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type integer to an item. */ void bear::engine::level_loader::load_item_field_int() { std::string field_name; int val; m_file >> field_name >> val >> m_next_code; if ( !m_current_loader->set_field( field_name, val ) ) claw::logger << claw::log_warning << "field '" << field_name << "' of item '" << m_current_item->get_class_name() << "' has not been set." << std::endl; } // level_loader::load_item_field_int() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type unsigned integer to an item. */ void bear::engine::level_loader::load_item_field_u_int() { std::string field_name; unsigned int val; m_file >> field_name >> val >> m_next_code; if ( !m_current_loader->set_field( field_name, val ) ) claw::logger << claw::log_warning << "field '" << field_name << "' of item '" << m_current_item->get_class_name() << "' has not been set." << std::endl; } // level_loader::load_item_field_u_int() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type real to an item. */ void bear::engine::level_loader::load_item_field_real() { std::string field_name; double val; m_file >> field_name >> val >> m_next_code; if ( !m_current_loader->set_field( field_name, val ) ) claw::logger << claw::log_warning << "field '" << field_name << "' of item '" << m_current_item->get_class_name() << "' has not been set." << std::endl; } // level_loader::load_item_field_real() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type boolean to an item. */ void bear::engine::level_loader::load_item_field_bool() { std::string field_name; bool val; m_file >> field_name >> val >> m_next_code; if ( !m_current_loader->set_field( field_name, val ) ) claw::logger << claw::log_warning << "field '" << field_name << "' of item '" << m_current_item->get_class_name() << "' has not been set." << std::endl; } // level_loader::load_item_field_bool() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type string to an item. */ void bear::engine::level_loader::load_item_field_string() { std::string field_name; std::string val; m_file >> field_name >> val >> m_next_code; val = game::get_instance().get_translator().get( val ); escape(val); if ( !m_current_loader->set_field( field_name, val ) ) claw::logger << claw::log_warning << "field '" << field_name << "' of item '" << m_current_item->get_class_name() << "' has not been set." << std::endl; } // level_loader::load_item_field_string() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type sprite to an item. */ void bear::engine::level_loader::load_item_field_sprite() { std::string field_name; m_file >> field_name; visual::sprite val ( sprite_loader::load_sprite( m_file, m_level->get_globals() ) ); m_file >> m_next_code; if ( !m_current_loader->set_field( field_name, val ) ) claw::logger << claw::log_warning << "field '" << field_name << "' of item '" << m_current_item->get_class_name() << "' has not been set." << std::endl; } // level_loader::load_item_field_sprite() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type animation to an item. */ void bear::engine::level_loader::load_item_field_animation() { std::string field_name; m_file >> field_name; visual::animation val = sprite_loader::load_any_animation(m_file, m_level->get_globals()); m_file >> m_next_code; if ( !m_current_loader->set_field( field_name, val ) ) claw::logger << claw::log_warning << "field '" << field_name << "' of item '" << m_current_item->get_class_name() << "' has not been set." << std::endl; } // level_loader::load_item_field_animation() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type item to an item. */ void bear::engine::level_loader::load_item_field_item() { std::string field_name; unsigned int index; m_file >> field_name >> index >> m_next_code; if ( !m_current_loader->set_field( field_name, m_referenced[index] ) ) claw::logger << claw::log_warning << "field '" << field_name << "' of item '" << m_current_item->get_class_name() << "' has not been set." << std::endl; } // level_loader::load_item_field_item() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type sample to an item. */ void bear::engine::level_loader::load_item_field_sample() { std::string field_name; m_file >> field_name; audio::sample* s = load_sample_data(); m_file >> m_next_code; if ( !m_current_loader->set_field( field_name, s ) ) { delete s; claw::logger << claw::log_warning << "field '" << field_name << "' of item '" << m_current_item->get_class_name() << "' has not been set." << std::endl; } } // level_loader::load_item_field_sample() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type font to an item. */ void bear::engine::level_loader::load_item_field_font() { std::string field_name; m_file >> field_name; visual::font f( load_font_data() ); m_file >> m_next_code; if ( !m_current_loader->set_field( field_name, f ) ) claw::logger << claw::log_warning << "field '" << field_name << "' of item '" << m_current_item->get_class_name() << "' has not been set." << std::endl; } // level_loader::load_item_field_font() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type color to an item. */ void bear::engine::level_loader::load_item_field_color() { std::string field_name; m_file >> field_name; visual::color f( load_color_data() ); m_file >> m_next_code; if ( !m_current_loader->set_field( field_name, f ) ) claw::logger << claw::log_warning << "field '" << field_name << "' of item '" << m_current_item->get_class_name() << "' has not been set." << std::endl; } // level_loader::load_item_field_color() /*----------------------------------------------------------------------------*/ /** * \brief Sets a field of type easing to an item. */ void bear::engine::level_loader::load_item_field_easing() { std::string field_name; m_file >> field_name; easing_function e( load_easing_data() ); m_file >> m_next_code; if ( !m_current_loader->set_field( field_name, e ) ) claw::logger << claw::log_warning << "field '" << field_name << "' of item '" << m_current_item->get_class_name() << "' has not been set." << std::endl; } // level_loader::load_item_field_color() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type list of integer to an item. */ void bear::engine::level_loader::load_item_field_int_list() { std::vector val; std::string field_name = load_list(val); if ( !m_current_loader->set_field( field_name, val ) ) claw::logger << claw::log_warning << "field '" << field_name << "' of item '" << m_current_item->get_class_name() << "' has not been set." << std::endl; } // level_loader::load_item_field_int_list() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type list of unsigned integer to an item. */ void bear::engine::level_loader::load_item_field_u_int_list() { std::vector val; std::string field_name = load_list(val); if ( !m_current_loader->set_field( field_name, val ) ) claw::logger << claw::log_warning << "field '" << field_name << "' of item '" << m_current_item->get_class_name() << "' has not been set." << std::endl; } // level_loader::load_item_field_u_int_list() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type list of real to an item. */ void bear::engine::level_loader::load_item_field_real_list() { std::vector val; std::string field_name = load_list(val); if ( !m_current_loader->set_field( field_name, val ) ) claw::logger << claw::log_warning << "field '" << field_name << "' of item '" << m_current_item->get_class_name() << "' has not been set." << std::endl; } // level_loader::load_item_field_real_list() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type list of bool to an item. */ void bear::engine::level_loader::load_item_field_bool_list() { std::vector val; std::string field_name = load_list(val); if ( !m_current_loader->set_field( field_name, val ) ) claw::logger << claw::log_warning << "field '" << field_name << "' of item '" << m_current_item->get_class_name() << "' has not been set." << std::endl; } // level_loader::load_item_field_bool_list() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type list of string to an item. */ void bear::engine::level_loader::load_item_field_string_list() { unsigned int n; std::string v; std::string field_name; m_file >> field_name >> n; std::vector val(n); for (unsigned int i=0; i!=n; ++i) { m_file >> v; v = game::get_instance().get_translator().get( v ); escape(v); val[i] = v; } m_file >> m_next_code; if ( !m_current_loader->set_field( field_name, val ) ) claw::logger << claw::log_warning << "field '" << field_name << "' has not been set." << std::endl; } // level_loader::load_item_field_string_list() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type list of sprite to an item. */ void bear::engine::level_loader::load_item_field_sprite_list() { std::string field_name; unsigned int n; m_file >> field_name >> n; std::vector val(n); for (unsigned int i=0; i!=n; ++i) val[i] = sprite_loader::load_sprite( m_file, m_level->get_globals() ); m_file >> m_next_code; if ( !m_current_loader->set_field( field_name, val ) ) claw::logger << claw::log_warning << "field '" << field_name << "' has not been set." << std::endl; } // level_loader::load_item_field_sprite_list() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type list of animation to an item. */ void bear::engine::level_loader::load_item_field_animation_list() { std::string field_name; unsigned int n; m_file >> field_name >> n; std::vector val(n); for (unsigned int i=0; i!=n; ++i) val[i] = sprite_loader::load_any_animation(m_file, m_level->get_globals()); m_file >> m_next_code; if ( !m_current_loader->set_field( field_name, val ) ) claw::logger << claw::log_warning << "field '" << field_name << "' has not been set." << std::endl; } // level_loader::load_item_field_animation_list() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type list of item to an item. */ void bear::engine::level_loader::load_item_field_item_list() { std::string field_name; unsigned int n; m_file >> field_name >> n; std::vector val(n); for (unsigned int i=0; i!=n; ++i) { unsigned int index; m_file >> index; CLAW_ASSERT( index < m_referenced.size(), "bad reference index" ); val[i] = m_referenced[index]; } m_file >> m_next_code; if ( !m_current_loader->set_field( field_name, val ) ) claw::logger << claw::log_warning << "field '" << field_name << "' has not been set." << std::endl; } // level_loader::load_item_field_item_list() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type sample to an item. */ void bear::engine::level_loader::load_item_field_sample_list() { std::string field_name; unsigned int n; m_file >> field_name >> n; std::vector val(n); for (unsigned int i=0; i!=n; ++i) val[i] = load_sample_data(); m_file >> m_next_code; if ( !m_current_loader->set_field( field_name, val ) ) { for (unsigned int i=0; i!=n; ++i) delete val[i]; claw::logger << claw::log_warning << "field '" << field_name << "' has not been set." << std::endl; } } // level_loader::load_item_field_sample_list() /*----------------------------------------------------------------------------*/ /** * \brief Sets a field of type font to an item. */ void bear::engine::level_loader::load_item_field_font_list() { std::string field_name; unsigned int n; m_file >> field_name >> n; std::vector val(n); for (unsigned int i=0; i!=n; ++i) val[i] = load_font_data(); m_file >> m_next_code; if ( !m_current_loader->set_field( field_name, val ) ) claw::logger << claw::log_warning << "field '" << field_name << "' has not been set." << std::endl; } // level_loader::load_item_field_font_list() /*----------------------------------------------------------------------------*/ /** * \brief Sets a field of type color to an item. */ void bear::engine::level_loader::load_item_field_color_list() { std::string field_name; unsigned int n; m_file >> field_name >> n; std::vector val(n); for (unsigned int i=0; i!=n; ++i) val[i] = load_color_data(); m_file >> m_next_code; if ( !m_current_loader->set_field( field_name, val ) ) claw::logger << claw::log_warning << "field '" << field_name << "' has not been set." << std::endl; } // level_loader::load_item_field_color_list() /*----------------------------------------------------------------------------*/ /** * \brief Sets a field of type easing to an item. */ void bear::engine::level_loader::load_item_field_easing_list() { std::string field_name; unsigned int n; m_file >> field_name >> n; std::vector val(n); for (unsigned int i=0; i!=n; ++i) val[i] = load_easing_data(); m_file >> m_next_code; if ( !m_current_loader->set_field( field_name, val ) ) claw::logger << claw::log_warning << "field '" << field_name << "' has not been set." << std::endl; } // level_loader::load_item_field_easing_list() /*----------------------------------------------------------------------------*/ /** * \brief Create an item using the create_* method exported by the item class. * \param name The name of the class to instanciate. */ bear::engine::base_item* bear::engine::level_loader::create_item_from_string ( const std::string& name ) const { claw::logger << claw::log_verbose << "Creating item '" << name << "'..." << std::endl; base_item* result(NULL); if ( item_factory::get_instance().is_known_type(name) ) { result = item_factory::get_instance().create(name); result->set_level(*m_level); claw::logger << claw::log_verbose << "Item '" << name << "' id=" << result->get_id() << std::endl; } else { claw::logger << claw::log_error << "Can't find item class '" << name << "'." << std::endl; throw claw::exception("Can't find item class '" + name + "'."); } return result; } // level_loader::create_item_from_string() /*----------------------------------------------------------------------------*/ /** * \brief Create a layer using the create_layer_* method exported by the layer * class. * \param name The name of the class to instanciate. * \param s The size of the layer. */ bear::engine::layer* bear::engine::level_loader::create_layer_from_string ( const std::string& name, const universe::size_box_type& s ) const { claw::logger << claw::log_verbose << "Creating layer '" << name << "'" << std::endl; layer* result(NULL); if ( layer_factory::get_instance().is_known_type(name) ) { layer_creator* creator = layer_factory::get_instance().create(name); result = creator->create(s); delete creator; } else { claw::logger << claw::log_error << "Can't find layer class '" << name << "'." << std::endl; throw claw::exception("Can't find layer class '" + name + "'."); } return result; } // level_loader::create_layer_from_string() /*----------------------------------------------------------------------------*/ /** * \brief Convert the escaped "\n", "\t", etc. substrings of a string into their * equivalent in the C language. * \param str (in/out) The string to convert. */ void bear::engine::level_loader::escape( std::string& str ) const { std::string result; result.reserve(str.size()); claw::text::c_escape( str.begin(), str.end(), std::back_inserter(result) ); str.swap(result); } // level_loader::escape() /*----------------------------------------------------------------------------*/ /** * \brief Loads a sample. */ bear::audio::sample* bear::engine::level_loader::load_sample_data() const { std::string sample_path; int loops; double volume; m_file >> sample_path >> loops >> volume; audio::sound_effect e(loops, volume); audio::sample* s = m_level->get_globals().new_sample(sample_path); s->set_effect(e); return s; } // level_loader::load_sample_data() /*----------------------------------------------------------------------------*/ /** * \brief Loads a font. */ bear::visual::font bear::engine::level_loader::load_font_data() const { std::string font_path; double size; m_file >> font_path >> size; return m_level->get_globals().get_font( font_path, size ); } // level_loader::load_font_data() /*----------------------------------------------------------------------------*/ /** * \brief Loads a color. */ bear::visual::color bear::engine::level_loader::load_color_data() const { double red, green, blue, opacity; m_file >> opacity >> red >> green >> blue; bear::visual::color result; result.set_opacity(opacity); result.set_red_intensity(red); result.set_green_intensity(green); result.set_blue_intensity(blue); return result; } // level_loader::load_color_data() /*----------------------------------------------------------------------------*/ /** * \brief Loads an easing function. */ bear::engine::easing_function bear::engine::level_loader::load_easing_data() const { std::string s; m_file >> s; easing result; result.from_string( s ); return result.to_claw_easing_function(); } // level_loader::load_easing_data() /*----------------------------------------------------------------------------*/ /** * \brief Load a list of values. * \param v (out) The values read from the file. * \return The name of the corresponding field. */ template std::string bear::engine::level_loader::load_list( std::vector& v ) { std::string field_name; unsigned int n; T val; m_file >> field_name >> n; v.resize(n); for (unsigned int i=0; i!=n; ++i) { m_file >> val; v[i] = val; } m_file >> m_next_code; return field_name; } // level_loader::load_list() plee-the-bear-20251226/bear-engine/core/src/engine/code/level_object.cpp000066400000000000000000000050041512343254000256020ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::engine::level_object class. * \author Julien Jorge. */ #include "engine/level_object.hpp" #include "engine/layer/layer.hpp" #include "engine/level.hpp" #include "engine/level_globals.hpp" #include /*----------------------------------------------------------------------------*/ /** * \brief Contructor. */ bear::engine::level_object::level_object() : m_level(NULL) { } // level_object::level_object() /*----------------------------------------------------------------------------*/ /** * \brief Copy contructor. * \param that The instance to copy from. */ bear::engine::level_object::level_object( const level_object& that ) : m_level(NULL) { // just ignore } // level_object::level_object() /*----------------------------------------------------------------------------*/ /** * \brief Destructor. */ bear::engine::level_object::~level_object() { // do nothing } // level_object::~level_object() /*----------------------------------------------------------------------------*/ /** * \brief Remove the data related to the level containing the object. * \post m_level == NULL */ void bear::engine::level_object::clear_level() { m_level = NULL; } // level_object::clear_level() /*----------------------------------------------------------------------------*/ /** * \brief Tell the level in which this object is. * \param the_level The level in which we are. * \pre m_level == NULL */ void bear::engine::level_object::set_level( level& the_level ) { CLAW_PRECOND( (m_level == NULL) || (m_level == &the_level) ); m_level = &the_level; } // level_object::set_level() /*----------------------------------------------------------------------------*/ /** * \brief Get the level in which this item is. * \pre m_level != NULL */ bear::engine::level& bear::engine::level_object::get_level() const { CLAW_PRECOND( m_level != NULL ); return *m_level; } // level_object::get_level() /*----------------------------------------------------------------------------*/ /** * \brief Get the level_globals of the level in which this item is. * \pre m_level != NULL */ bear::engine::level_globals& bear::engine::level_object::get_level_globals() const { CLAW_PRECOND( m_level != NULL ); return m_level->get_globals(); } // level_object::get_level_globals() plee-the-bear-20251226/bear-engine/core/src/engine/code/libraries_pool.cpp000066400000000000000000000031741512343254000261600ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::engine::libraries_pool class. * \author Julien Jorge */ #include #include "engine/libraries_pool.hpp" #include /*----------------------------------------------------------------------------*/ /** * \brief Destructor. */ bear::engine::libraries_pool::~libraries_pool() { std::for_each( m_libraries.begin(), m_libraries.end(), claw::delete_function() ); } // libraries_pool::~libraries_pool() /*----------------------------------------------------------------------------*/ /** * \brief Add a library in the pool. * \param name The name of the library. * \param current_program Tell if \a name is the current program. */ void bear::engine::libraries_pool::add_library ( const std::string& name, bool current_program ) { m_libraries.push_front( new claw::dynamic_library(name, current_program) ); } // libraries_pool::add_library() /*----------------------------------------------------------------------------*/ /** * \brief Tell if one of the libraries has a given symbol. * \param symbol The symbol to find. */ bool bear::engine::libraries_pool::have_symbol( const std::string& symbol ) const { bool result=false; libraries_list::const_iterator it; for (it=m_libraries.begin(); !result && (it!=m_libraries.end()); ++it) result = (*it)->have_symbol( symbol ); return result; } // libraries_pool::have_symbol() plee-the-bear-20251226/bear-engine/core/src/engine/code/model_loader.cpp000066400000000000000000000235101512343254000255750ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::engine::model_loader class. * \author Julien Jorge */ #include "engine/model_loader.hpp" #include "engine/level_globals.hpp" #include "engine/sprite_loader.hpp" #include "engine/model/model_action.hpp" #include "engine/model/model_snapshot.hpp" #include "universe/types.hpp" #include "easing.hpp" #include #include /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param f The file from which we load the model. * \param glob The level_globals in which we load the resources. * * \a f must live longer than this instance of model_loader. */ bear::engine::model_loader::model_loader ( std::istream& f, level_globals& glob ) : m_file(f, true), m_level_globals(glob), m_major_version(0), m_minor_version(0), m_release_version(0) { } // model_loader::model_loader() /*----------------------------------------------------------------------------*/ /** * \brief Builds the model */ bear::engine::model_actor* bear::engine::model_loader::run() { m_file >> m_major_version >> m_minor_version >> m_release_version; if ( !m_file ) throw claw::exception("Can't read the version of the model file."); else if ( !model_version_greater_or_equal( 0, 6, 0 ) ) throw claw::exception("This version of the model file is not supported."); else { anim_map_type anim_map; load_animations( anim_map ); model_actor* result = new model_actor; load_actions(*result, anim_map); return result; } } // model_loader::run() /*----------------------------------------------------------------------------*/ /** * \brief Tells if the version of the model in process is greater or equal to * a given version. * \param major The major version number to compare to. * \param minor The minor version number to compare to. * \param release The realese version number to compare to. * \return true if the version of the model is lexicographically greater or * equal to the provided version. */ bool bear::engine::model_loader::model_version_greater_or_equal ( unsigned int major, unsigned int minor, unsigned int release ) const { if ( major == m_major_version ) { if ( minor == m_minor_version ) return release <= m_release_version; else return minor <= m_minor_version; } else return major <= m_major_version; } // model_loader::model_version_greater_or_equal() /*----------------------------------------------------------------------------*/ /** * \brief Load all the actions of a model. * \param m The model. * \param anim_map All the animations of the model. */ void bear::engine::model_loader::load_actions ( model_actor& m, const anim_map_type& anim_map ) { std::size_t count; if ( m_file >> count ) { for ( std::size_t i=0; i!=count; ++i ) load_action(m, anim_map); } else claw::logger << claw::log_error << "No action found in the model." << std::endl; } // model_loader::load_actions() /*----------------------------------------------------------------------------*/ /** * \brief Load an action of a model. * \param m The model. * \param anim_map All the animations of the model. */ void bear::engine::model_loader::load_action ( model_actor& m, const anim_map_type& anim_map ) { std::string name, autonext; universe::time_type duration; if ( m_file >> name >> duration >> autonext ) { std::vector sounds; bool glob; load_sound( sounds, glob ); std::string sound_name; if ( !sounds.empty() ) sound_name = sounds[0]; std::size_t n; m_file >> n; model_action a( n, duration, autonext, sound_name, glob ); load_marks(a, anim_map); load_snapshots(a); m.add_action( name, a ); } else claw::logger << claw::log_error << "Invalid action." << std::endl; } // model_loader::load_action() /*----------------------------------------------------------------------------*/ /** * \brief Loads a set of sounds with their properties. * \param sounds (out) The sounds. * \param glob (out) Tells if the the sounds are played globally. */ void bear::engine::model_loader::load_sound ( std::vector& sounds, bool& glob ) { std::size_t count; if ( m_file >> glob >> count ) { sounds.resize( count ); for ( std::size_t i=0; i!=count; ++i ) { m_file >> sounds[i]; m_level_globals.load_sound( sounds[i] ); } } } // model_loader::load_sound() /*----------------------------------------------------------------------------*/ /** * \brief Load the marks of an action. * \param a The action. * \param anim_map All the animations of the model. */ void bear::engine::model_loader::load_marks ( model_action& a, const anim_map_type& anim_map ) { for ( std::size_t i=0; i!=a.get_marks_count(); ++i ) { std::string label; bool apply_angle; bool pause_hidden; bool reset_with_action( true ); std::size_t anim_index; if ( m_file >> label >> apply_angle >> pause_hidden ) { if ( model_version_greater_or_equal( 0, 10, 0 ) ) m_file >> reset_with_action; m_file >> anim_index; } if ( m_file ) { model_animation anim; if ( anim_index < anim_map.size() ) anim = anim_map[anim_index]; a.get_mark(i) = model_mark ( label, anim, apply_angle, pause_hidden, reset_with_action ); } else claw::logger << claw::log_error << "The mark is incomplete." << std::endl; } } // model_loader::load_marks() /*----------------------------------------------------------------------------*/ /** * \brief Load the snpashots of an action. * \param a The action. */ void bear::engine::model_loader::load_snapshots( model_action& a ) { std::size_t n; m_file >> n; for ( ; n!=0; --n ) load_snapshot(a); } // model_loader::load_snapshots() /*----------------------------------------------------------------------------*/ /** * \brief Load a snapshot of an action. * \param a The action. */ void bear::engine::model_loader::load_snapshot( model_action& a ) { universe::time_type date; std::string func; std::string x_align, y_align; universe::coordinate_type x_align_value, y_align_value; universe::size_type width, height; if ( m_file >> date >> func >> width >> height >> x_align >> y_align >> x_align_value >> y_align_value ) { bool glob; std::vector sounds; load_sound(sounds, glob); model_snapshot s(date, a.get_marks_count(), func, sounds, glob); s.set_size(width, height); s.set_x_alignment (model_snapshot::horizontal_alignment::from_string(x_align)); s.set_y_alignment (model_snapshot::vertical_alignment::from_string(y_align)); s.set_x_alignment_value(x_align_value); s.set_y_alignment_value(y_align_value); load_mark_placements(s); a.add_snapshot(s); } else claw::logger << claw::log_error << "The snapshot is incomplete." << std::endl; } // model_loader::load_snapshot() /*----------------------------------------------------------------------------*/ /** * \brief Load the mark placements of a snapshot. * \param s The snapshot. */ void bear::engine::model_loader::load_mark_placements( model_snapshot& s ) { for ( std::size_t i=0; i!=s.get_mark_placements_count(); ++i ) load_mark_placement(s); } // model_loader::load_mark_placements() /*----------------------------------------------------------------------------*/ /** * \brief Load a mark placements of a snapshot. * \param s The snapshot. */ void bear::engine::model_loader::load_mark_placement( model_snapshot& s ) { unsigned int id; universe::coordinate_type x, y, w, h; int z; double angle; bool visible; std::string collision_function; bear::easing::function::function_type x_func, y_func, width_func, height_func, angle_func; bear::easing::direction::direction_type x_dir, y_dir, width_dir, height_dir, angle_dir; if ( m_file >> id >> x >> x_func >> x_dir >> y >> y_func >> y_dir >> w >> width_func >> width_dir >> h >> height_func >> height_dir >> z >> angle >> angle_func >> angle_dir >> visible >> collision_function ) { model_mark_placement m (id, x, y, w, h, z, angle, visible, collision_function); m.set_x_position_easing ( easing(x_func, x_dir).to_claw_easing_function() ); m.set_y_position_easing ( easing(y_func, y_dir).to_claw_easing_function() ); m.set_width_easing ( easing(width_func, width_dir).to_claw_easing_function() ); m.set_height_easing ( easing(height_func, height_dir).to_claw_easing_function() ); m.set_angle_easing ( easing(angle_func, angle_dir).to_claw_easing_function() ); s.set_mark_placement(m); } else claw::logger << claw::log_error << "The mark_placement is incomplete." << std::endl; } // model_loader::load_mark_placement() /*----------------------------------------------------------------------------*/ /** * \brief Load all the animations used in the model. * \param anim_map All the animations of the model. */ void bear::engine::model_loader::load_animations( anim_map_type& anim_map ) { std::size_t n; m_file >> n; anim_map.resize(n); for (std::size_t i=0; i!=n; ++i) { visual::animation val = sprite_loader::load_any_animation(m_file, m_level_globals); anim_map[i] = new visual::animation(val); } } // model_loader::load_animation() plee-the-bear-20251226/bear-engine/core/src/engine/code/population.cpp000066400000000000000000000074551512343254000253530ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::engine::population class. * \author Julien Jorge */ #include "engine/population.hpp" #include #include /*----------------------------------------------------------------------------*/ /** * \brief Destructor. */ bear::engine::population::~population() { clear(); } // population::~population() /*----------------------------------------------------------------------------*/ /** * \brief Insert an item in the population. * \param item The item to insert. */ void bear::engine::population::insert( base_item* item ) { CLAW_PRECOND( item != NULL ); CLAW_PRECOND( !exists( item->get_id() ) || ( m_dropped_items.find(item->get_id()) != m_dropped_items.end() ) ); if ( m_dropped_items.find(item->get_id()) != m_dropped_items.end() ) m_dropped_items.erase(item->get_id()); m_items[ item->get_id() ] = item; } // population::insert() /*----------------------------------------------------------------------------*/ /** * \brief Kill an item. * \param item The item to delete. */ void bear::engine::population::kill( const base_item* item ) { CLAW_PRECOND( item != NULL ); m_dead_items.insert( item->get_id() ); m_dropped_items.erase( item->get_id() ); } // population::kill() /*----------------------------------------------------------------------------*/ /** * \brief Drop an item. * \param item The item to drop. */ void bear::engine::population::drop( const base_item* item ) { CLAW_PRECOND( item != NULL ); if ( m_dead_items.find( item->get_id() ) == m_dead_items.end() ) m_dropped_items.insert( item->get_id() ); } // population::drop() /*----------------------------------------------------------------------------*/ /** * \brief Tell if an item exists. * \param id The identifier of the item. */ bool bear::engine::population::exists( base_item::id_type id ) const { return m_items.find(id) != m_items.end(); } // population::exists() /*----------------------------------------------------------------------------*/ /** * \brief Delete items on the dead-items list. */ void bear::engine::population::remove_dead_items() { std::set::const_iterator it; for (it=m_dead_items.begin(); it!=m_dead_items.end(); ++it) if ( exists(*it) ) { delete m_items[*it]; m_items.erase(*it); } m_dead_items.clear(); for ( it=m_dropped_items.begin(); it!=m_dropped_items.end(); ++it ) m_items.erase(*it); m_dropped_items.clear(); } // population::remove_dead_items() /*----------------------------------------------------------------------------*/ /** * \brief Delete all items. */ void bear::engine::population::clear() { remove_dead_items(); std::map< base_item::id_type, base_item* >::const_iterator it; for (it=m_items.begin(); it!=m_items.end(); ++it) { // The item may have been dropped by the deletion of another item. if ( m_dropped_items.find( it->first ) == m_dropped_items.end() ) delete it->second; } m_items.clear(); } // population::clear() /*----------------------------------------------------------------------------*/ /** * \brief Get an iterator on the beginning of the items. */ bear::engine::population::const_iterator bear::engine::population::begin() const { return m_items.begin(); } // population::begin() /*----------------------------------------------------------------------------*/ /** * \brief Get an iterator on the end of the items. */ bear::engine::population::const_iterator bear::engine::population::end() const { return m_items.end(); } // population::end() plee-the-bear-20251226/bear-engine/core/src/engine/code/resource_pool.cpp000066400000000000000000000053421512343254000260320ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::engine::resource_pool class. * \author Julien Jorge */ #include "engine/resource_pool.hpp" #include "engine/resource_pool/base_resource_pool.hpp" #include "engine/resource_pool/directory_resource_pool.hpp" #include #include /*----------------------------------------------------------------------------*/ /** * \brief Gets the instance. */ bear::engine::resource_pool& bear::engine::resource_pool::get_instance() { return super::get_instance(); } // resource_pool::get_instance() /*----------------------------------------------------------------------------*/ /** * \brief Destroy the instance. */ bear::engine::resource_pool::~resource_pool() { for ( std::size_t i(0); i!=m_pool.size(); ++i ) delete m_pool[i]; } // resource_pool::add_path() /*----------------------------------------------------------------------------*/ /** * \brief Adds a path in which to seek resources. * \param path The path to add. */ void bear::engine::resource_pool::add_path( const std::string& path ) { add_pool( new directory_resource_pool( path ) ); } // resource_pool::add_path() /*----------------------------------------------------------------------------*/ /** * \brief Adds a pool in which to seek resources. * \param pool The pool to add. The instance will keep the pointer and delete it * in the destructor. */ void bear::engine::resource_pool::add_pool( base_resource_pool* pool ) { CLAW_PRECOND( pool != NULL ); m_pool.insert( m_pool.begin(), pool ); } // resource_pool::add_pool() /*----------------------------------------------------------------------------*/ /** * \brief Gets a file. * \param name The path of the file to get. * \param os Where we must write the content of the file. */ void bear::engine::resource_pool::get_file ( const std::string& name, std::ostream& os ) { for ( std::size_t i(0); i!=m_pool.size(); ++i ) if ( m_pool[i]->exists( name ) ) { m_pool[i]->get_file( name, os ); return; } throw claw::exception( "Can't find file '" + name + "'" ); } // resource_pool::get_file() /*----------------------------------------------------------------------------*/ /** * \brief Checks if we know a file with a given name. * \param name The name of the file to find. */ bool bear::engine::resource_pool::exists( const std::string& name ) const { for ( std::size_t i(0); i!=m_pool.size(); ++i ) if ( m_pool[i]->exists( name ) ) return true; return false; } // resource_pool::exists() plee-the-bear-20251226/bear-engine/core/src/engine/code/scene_visual.cpp000066400000000000000000000052131512343254000256270ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::engine::scene_visual class. * \author Julien Jorge */ #include "engine/scene_visual.hpp" #include "visual/scene_sprite.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Compare two scene_visual instances on their z_position. * \return s1.z_position < s2.z_position */ bool bear::engine::scene_visual::z_position_compare::operator() ( const scene_visual& s1, const scene_visual& s2 ) const { return s1.z_position < s2.z_position; } // scene_visual::z_position_compare::operator()() /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param x X-coordinate of the sprite in the world. * \param y Y-coordinate of the sprite in the world. * \param spr The sprite to display. * \param z The position of the visual in the render procedure. */ bear::engine::scene_visual::scene_visual ( universe::coordinate_type x, universe::coordinate_type y, const visual::sprite& spr, int z ) : scene_element( visual::scene_sprite(x, y, spr) ), z_position(z) { } // scene_visual::scene_visual() /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param pos Position of the sprite in the world. * \param spr The sprite to display. * \param z The position of the visual in the render procedure. */ bear::engine::scene_visual::scene_visual ( const universe::position_type& pos, const visual::sprite& spr, int z ) : scene_element( visual::scene_sprite(pos.x, pos.y, spr) ), z_position(z) { } // scene_visual::scene_visual() /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param pos Position of the sprite in the world. * \param e The element to display. * \param z The position of the visual in the render procedure. */ bear::engine::scene_visual::scene_visual ( const visual::scene_element& e, int z ) : scene_element(e), z_position(z) { } // scene_visual::scene_visual() /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param pos Position of the sprite in the world. * \param e The element to display. * \param z The position of the visual in the render procedure. */ bear::engine::scene_visual::scene_visual ( const visual::base_scene_element& e, int z ) : scene_element(e), z_position(z) { } // scene_visual::scene_visual() plee-the-bear-20251226/bear-engine/core/src/engine/code/shader_loader.cpp000066400000000000000000000075361512343254000257550ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::engine::shader_loader class. * \author Julien Jorge */ #include "engine/shader_loader.hpp" #include "engine/resource_pool.hpp" #include #include #include /*----------------------------------------------------------------------------*/ /** * \brief Reads the content of a shader file. * \param result The stream in which is written the shader program. * \param name The path to the resource file to read. */ void bear::engine::shader_loader::parse_shader_file ( std::stringstream& result, std::string name ) { std::vector seen; load_include( result, name, seen ); } // shader_loader::parse_shader_file() /*----------------------------------------------------------------------------*/ /** * \brief Reads the content of a shader file. * \param output The stream in which is written the shader program. * \param file_name The path to the resource file to read. * \param seen The paths to the resources files that have already been included * in the output. */ void bear::engine::shader_loader::load_include ( std::stringstream& output, std::string file_name, std::vector& seen ) { seen.push_back( file_name ); std::stringstream f; resource_pool::get_instance().get_file(file_name, f); std::string line; while ( std::getline( f, line ) ) { claw::text::trim( line ); if ( !parse_include( output, file_name, line, seen ) ) output << line << '\n'; } } // shader_loader::load_include() /*----------------------------------------------------------------------------*/ /** * \brief Reads a shader file included in another shader file. * \param output The stream in which is written the shader program. * \param file_name The path to the resource file that includes the other file. * \param line The line to parse to get the include. * \param seen The paths to the resources files that have already been included * in the output. * \return true if line is effectively an include. It such a case it will have * been included in the output. */ bool bear::engine::shader_loader::parse_include ( std::stringstream& output, std::string file_name, std::string line, std::vector& seen ) { std::istringstream iss( line ); std::string pragma; std::string include; if ( (iss >> pragma) && std::getline(iss, include, '"') ) { claw::text::trim(pragma); claw::text::trim(include); if ( (pragma == "#pragma") && (include == "include") ) { std::string included_file; std::getline( iss, included_file, '"' ); included_file = get_relative_file_name( file_name, included_file ); if ( std::find( seen.begin(), seen.end(), included_file ) == seen.end() ) { load_include( output, included_file, seen ); return true; } } } return false; } // shader_loader::parse_include() /*----------------------------------------------------------------------------*/ /** * \brief Gets the path to the shader program resource included in another * shader program. * \param reference The file that does the include. * \param file_name The included file. */ std::string bear::engine::shader_loader::get_relative_file_name ( std::string reference, std::string file_name ) { const std::string::size_type last_separator( reference.find_last_of( '/' ) ); if ( last_separator == std::string::npos ) return file_name; else return reference.substr( 0, last_separator + 1 ) + file_name; } // shader_loader::get_relative_file_name() plee-the-bear-20251226/bear-engine/core/src/engine/code/sprite_loader.cpp000066400000000000000000000126401512343254000260050ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::engine::sprite_loader class. * \author Julien Jorge */ #include "engine/sprite_loader.hpp" #include "engine/compiled_file.hpp" #include "engine/game.hpp" #include "engine/i18n/translator.hpp" #include "engine/level_globals.hpp" #include /*----------------------------------------------------------------------------*/ /** * \brief Load a sprite. * \param f The file from which we will read the sprite. * \param glob The level globals from which we take the images. */ bear::visual::sprite bear::engine::sprite_loader::load_sprite ( compiled_file& f, level_globals& glob ) { std::string image_name; claw::math::coordinate_2d size; claw::math::rectangle clip; visual::rectangle_type opacity; f >> image_name >> clip.position.x >> clip.position.y >> clip.width >> clip.height >> opacity.first_point.x >> opacity.first_point.y >> opacity.second_point.x >> opacity.second_point.y; const visual::image& resource = glob.get_image ( engine::game::get_instance().get_translator().get( image_name ) ); visual::sprite result( resource, clip, opacity ); load_bitmap_rendering_attributes(f, result); return result; } // sprite_loader::load_sprite() /*----------------------------------------------------------------------------*/ /** * \brief Load an animation. * \param f The file from which we will read the animation. * \param glob The level globals from which we take the images. */ bear::visual::animation bear::engine::sprite_loader::load_animation ( compiled_file& f, level_globals& glob ) { unsigned int maj(0), min(0), rel(0); f >> maj >> min >> rel; if ( (maj != 0) || (min <= 4) ) throw claw::exception ( "This version of the animation file is not supported." ); else return load_animation_v0_5(f, glob); } // sprite_loader::load_animation() /*----------------------------------------------------------------------------*/ /** * \brief Load any animation. * \param f The file from which we will read the animation. * \param glob The level globals from which we take the images. * * This function expects the content of f to be wether a complete animation or * a path to an animation file, with extra rendering attributes in the latter * case. * */ bear::visual::animation bear::engine::sprite_loader::load_any_animation ( compiled_file& f, level_globals& glob ) { std::string content_type; visual::animation result; f >> content_type; if ( content_type == "content_file" ) { std::string path; f >> path; result = glob.get_animation ( engine::game::get_instance().get_translator().get(path) ); load_bitmap_rendering_attributes(f, result); } else if ( content_type == "content_animation" ) result = load_animation_data(f, glob); else throw claw::exception ( "Unknown animation content type: '" + content_type + "'." ); return result; } // sprite_loader::load_any_animation() /*----------------------------------------------------------------------------*/ /** * \brief Load an animation. * \param f The file from which we will read the animation. * \param glob The level globals from which we take the images. */ bear::visual::animation bear::engine::sprite_loader::load_animation_data ( compiled_file& f, level_globals& glob ) { return load_animation_v0_5(f, glob); } // sprite_loader::load_animation_data() /*----------------------------------------------------------------------------*/ /** * \brief Load a bitmap_rendering_attributes. * \param f The file from which we will read the attributes. * \param result The attributes to set. */ void bear::engine::sprite_loader::load_bitmap_rendering_attributes ( compiled_file& f, visual::bitmap_rendering_attributes& result ) { claw::math::coordinate_2d size; bool flip, mirror; double alpha; double r, g, b; double angle; f >> size.x >> size.y >> mirror >> flip >> alpha >> r >> g >> b >> angle; result.flip( flip ); result.mirror( mirror ); result.set_opacity( alpha ); result.set_size( size ); result.set_intensity( r, g, b ); result.set_angle(angle); } // sprite_loader::load_bitmap_rendering_attributes() /*----------------------------------------------------------------------------*/ /** * \brief Load an animation. * \param f The file from which we will read the animation. * \param glob The level globals from which we take the images. */ bear::visual::animation bear::engine::sprite_loader::load_animation_v0_5 ( compiled_file& f, level_globals& glob ) { unsigned int frames_count; f >> frames_count; std::vector frames(frames_count); std::vector duration(frames_count); for ( unsigned int i=0; i!=frames_count; ++i) { f >> duration[i]; frames[i] = load_sprite(f, glob); } unsigned int loops, first_index, last_index; bool loop_back; f >> loops >> loop_back >> first_index >> last_index; visual::animation result( frames, duration ); load_bitmap_rendering_attributes(f, result); result.set_loops( loops ); result.set_loop_back( loop_back ); result.set_first_index(first_index); result.set_last_index(last_index); return result; } // sprite_loader::load_animation_v0_5() plee-the-bear-20251226/bear-engine/core/src/engine/code/spritepos.cpp000066400000000000000000000071451512343254000252050ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::engine::spritepos class. * \author Julien Jorge */ #include "engine/spritepos.hpp" #include /*----------------------------------------------------------------------------*/ /** * \brief Build a spritepos entry given its name and clip rectangle. * \param name The name of the entry. * \param clip The region of the sprite in the source image. */ bear::engine::spritepos::sprite_entry::sprite_entry ( const std::string& name, const rectangle_type& clip ) : m_name(name), m_clip(clip) { } // sprite_entry::sprite_entry() /*----------------------------------------------------------------------------*/ /** * \brief Get the name of the entry. */ const std::string& bear::engine::spritepos::sprite_entry::get_name() const { return m_name; } // sprite_entry::get_name() /*----------------------------------------------------------------------------*/ /** * \brief Get the region of the sprite in the source image. */ const bear::engine::spritepos::sprite_entry::rectangle_type& bear::engine::spritepos::sprite_entry::get_clip() const { return m_clip; } // sprite_entry::get_clip() /*----------------------------------------------------------------------------*/ /** * \brief Build a spritepos by reading the entries from a stream. * \param f The stream from which we load the entries. */ bear::engine::spritepos::spritepos( std::istream& f ) { load(f); } // spritepos::spritepos() /*----------------------------------------------------------------------------*/ /** * \brief Get an iterator on the first entry. */ bear::engine::spritepos::const_iterator bear::engine::spritepos::begin() const { return m_entries.begin(); } // spritepos::begin() /*----------------------------------------------------------------------------*/ /** * \brief Get an iterator just past the last entry. */ bear::engine::spritepos::const_iterator bear::engine::spritepos::end() const { return m_entries.end(); } // spritepos::end() /*----------------------------------------------------------------------------*/ /** * \brief Get an iterator on the first entry with a given name. * \param name The name of the entry. */ bear::engine::spritepos::const_iterator bear::engine::spritepos::find( const std::string& name ) const { for ( const_iterator it=m_entries.begin(); it!=m_entries.end(); ++it ) if ( it->get_name() == name ) return it; return end(); } // spritepos::end() /*----------------------------------------------------------------------------*/ /** * \brief Load a spritepos file. * \param f The file from which we load the entries. */ void bear::engine::spritepos::load( std::istream& f ) { std::string line; while ( claw::text::getline(f, line) ) if ( !line.empty() ) if ( line[0] != '#' ) { std::string::size_type pos( line.find_first_of(':') ); const std::string::size_type next ( line.find_first_of( ':', pos + 1 ) ); if ( next != std::string::npos ) pos = next; std::string n( line.substr(0, pos) ); claw::text::trim(n); // read the coordinates of the clip rectangle std::istringstream iss( line.substr(pos+1) ); sprite_entry::rectangle_type r; if ( iss >> r.position.x >> r.position.y >> r.width >> r.height ) m_entries.push_back( sprite_entry( n, r ) ); } } // spritepos::load() plee-the-bear-20251226/bear-engine/core/src/engine/code/world.cpp000066400000000000000000000134551512343254000243050ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::engine::world class. * \author Julien Jorge */ #include "engine/world.hpp" #include "engine/base_item.hpp" #include "engine/game.hpp" #include "engine/population.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Constructor * \param size Size of the world. */ bear::engine::world::world( const universe::size_box_type& size ) : universe::world(size) { } // world::world() /*----------------------------------------------------------------------------*/ /** * \brief Destructor * \param size Size of the world. */ bear::engine::world::~world() { for ( ; !m_static_items.empty(); m_static_items.pop_front() ) delete m_static_items.front(); } // world::~world() /*----------------------------------------------------------------------------*/ /** * \brief Initialize the world. */ void bear::engine::world::start() { print_stats(); } // world::start() /*----------------------------------------------------------------------------*/ /** * \brief Call the progress() method on entities in the active region, then * apply physic rules. * \param regions The active regions. * \param elapsed_time Elapsed time since the last call of this method. */ void bear::engine::world::progress_entities ( const region_type& regions, universe::time_type elapsed_time ) { universe::world::progress_entities(regions, elapsed_time); m_population.remove_dead_items(); } // world::progress_entities() /*----------------------------------------------------------------------------*/ /** * \brief Get the sprites of the visible items in the active region. * \param visuals (out) The sprites in the visible area, and their positions. * \param camera_box The part of the world visible through the camera. */ void bear::engine::world::get_visual ( std::list& visuals, const universe::rectangle_type& camera_box ) const { item_list items; item_list::const_iterator it; pick_items_in_rectangle(items, camera_box); for (it=items.begin(); it!=items.end(); ++it) { base_item* i( dynamic_cast(*it) ); if ( i==NULL ) claw::logger << claw::log_warning << "bear::engine::world::get_visual(): " << "item is not a base_item. Not rendered: " << **it << std::endl; else visuals.push_back( i->get_visual() ); } } // world::get_visual() /*----------------------------------------------------------------------------*/ /** * \brief Get an iterator on the beginning of the living items. */ bear::engine::world::const_item_iterator bear::engine::world::living_items_begin() const { return m_population.begin(); } // world::living_items_begin() /*----------------------------------------------------------------------------*/ /** * \brief Get an iterator on the end of the living items. */ bear::engine::world::const_item_iterator bear::engine::world::living_items_end() const { return m_population.end(); } // world::living_items_end() /*----------------------------------------------------------------------------*/ /** * \brief Add a permanent and fixed item in the world. * \param who The item to add. */ void bear::engine::world::add_static( base_item* const& who ) { who->set_world(*this); universe::world::add_static( who ); m_static_items.push_front( who ); } // world::add_static() /*----------------------------------------------------------------------------*/ /** * \brief Add an item in the world. * \param who The item to add. */ void bear::engine::world::register_item( base_item* const& who ) { /* !!Julien. January 2010, 6th. The base_item::kill() method may have been called before adding the item (in base_item::build(), for example). In such case, the item is not added to the world, but we still insert him in the population to kill him immediately. */ m_population.insert( who ); if ( !who->is_dead() ) { who->set_world(*this); universe::world::register_item(who); } else m_population.kill( who ); } // world::register_item() /*----------------------------------------------------------------------------*/ /** * \brief Kill and remove an item from the world. * \param who The item to kill. */ void bear::engine::world::release_item( base_item* const& who ) { m_population.kill(who); universe::world::release_item(who); } // world::release_item() /*----------------------------------------------------------------------------*/ /** * \brief Remove an item from the world without killing him. * \param who The item to remove. */ void bear::engine::world::drop_item( base_item* const& who ) { m_population.drop(who); universe::world::release_item(who); } // world::drop_item() /*----------------------------------------------------------------------------*/ /** * \brief Print some statistics about the living items in the console. */ void bear::engine::world::print_item_stats() const { std::map items; for ( const_item_iterator it=living_items_begin(); it!=living_items_end(); ++it ) { const std::string name(it->get_class_name()); std::map::iterator c = items.find(name); if ( c != items.end() ) ++c->second; else items[name] = 1; } for ( std::map::const_iterator it=items.begin(); it!=items.end(); ++it ) std::cout << get_world_time() << '\t' << it->first << '\t' << it->second << std::endl; std::cout << "----------------------------------------" << std::endl; } // world::print_item_stats() plee-the-bear-20251226/bear-engine/core/src/engine/comic/000077500000000000000000000000001512343254000226225ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/core/src/engine/comic/balloon.hpp000066400000000000000000000071641512343254000247710ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A balloon in which we display what a speaker_item says. * \author Sébastien Angibaud */ #ifndef __BEAR_BALLOON_HPP__ #define __BEAR_BALLOON_HPP__ #include "gui/static_text.hpp" #include "universe/types.hpp" #include "engine/class_export.hpp" #include #include #include namespace bear { namespace engine { /** * \brief A balloon in which we display what a speaker_item says. * \author Sebastien Angibaud */ class ENGINE_EXPORT balloon { public: balloon(); void progress( universe::time_type elapsed_time ); void render( std::list& e ); void set_spike_sprite( visual::sprite spr ); void set_corner_sprite( visual::sprite spr ); void set_horizontal_border_sprite( visual::sprite spr ); void set_vertical_border_sprite( visual::sprite spr ); void set_font( visual::font f ); bool is_finished() const; visual::size_box_type get_size() const; visual::size_box_type get_final_size() const; void set_position ( const visual::position_type& pos, bool on_top, bool on_right ); visual::position_type get_position() const; bool is_on_top() const; bool is_on_right() const; void set_speeches( const std::list& speeches ); void close(); private: void render_bottom_left_corner ( std::list& e, visual::sprite s ) const; void render_bottom_right_corner ( std::list& e, visual::sprite s ) const; void render_top_left_corner ( std::list& e, visual::sprite s ) const; void render_top_right_corner ( std::list& e, visual::sprite s ) const; void increase( universe::time_type elapsed_time ); void decrease( universe::time_type elapsed_time ); void set_content_size( const visual::size_box_type& s ); void write_text(); private: /** \brief The speech. */ std::list m_speeches; /** \brief The spike, going out of the mouth of the speaker. */ visual::sprite m_spike; /** \brief The corner of the balloon. */ visual::sprite m_corner; /** \brief The horizontal border of the balloon. */ visual::sprite m_horizontal_border; /** \brief The vertical border of the balloon. */ visual::sprite m_vertical_border; /** \brief The size of the frame. */ gui::size_box_type m_size_frame; /** \brief Indicates if the balloon is at its maximum size. */ bool m_has_started; /** \brief The component in which we show the text. */ gui::static_text m_text; /** \brief Elapsed time since the creation. */ universe::time_type m_time; /** \brief Indicates how long the text is visible. */ universe::time_type m_play_time; /** \brief Indicates if the balloon is on the top of the item. */ bool m_on_top; /** \brief Indicates if the balloon is on the right of the item. */ bool m_on_right; /** \brief Indicates if the balloon is currently showing something, or about to show something. */ bool m_active; /** \brief Indicates increasing duration. */ universe::time_type m_increasing_duration; }; // class balloon } // namespace engine } // namespace bear #endif // __BEAR_BALLOON_HPP__ plee-the-bear-20251226/bear-engine/core/src/engine/comic/code/000077500000000000000000000000001512343254000235345ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/core/src/engine/comic/code/balloon.cpp000066400000000000000000000324271512343254000256760ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::engine::balloon class. * \author Sébastien Angibaud */ #include "engine/comic/balloon.hpp" #include "visual/scene_sprite.hpp" #include /*----------------------------------------------------------------------------*/ /** * \brief Constructor of a balloon. */ bear::engine::balloon::balloon() : m_size_frame(0, 0), m_has_started(false), m_time(0), m_play_time(0), m_on_top(true), m_on_right(true), m_active(false), m_increasing_duration(0.25) { m_text.set_background_color( claw::graphic::white_pixel ); m_text.get_text_rendering_attributes().set_intensity(0,0,0); m_text.set_size( 0, 0 ); m_text.set_margin(0, 0); } // balloon::balloon() /*----------------------------------------------------------------------------*/ /** * \brief Update the size of the balloon. * \param elapsed_time The time elapsed since the last call. */ void bear::engine::balloon::progress( universe::time_type elapsed_time ) { if ( m_has_started ) { m_time += elapsed_time; if ( m_time >= m_play_time ) { if ( m_speeches.empty() ) decrease(elapsed_time); else { m_time = 0; write_text(); } } } else { increase(elapsed_time); m_time += elapsed_time; if ( m_time >= m_increasing_duration ) { m_has_started = true; m_time = 0; } } } // balloon::progress() /*----------------------------------------------------------------------------*/ /** * \brief Get the visuals of the balloon. * \param e (out) The visuals. */ void bear::engine::balloon::render( std::list& e ) { if ( (m_text.width() == 0) || (m_text.height() == 0) ) return; m_text.render( e ); m_horizontal_border.flip(false); e.push_back ( visual::scene_sprite (m_text.left(), m_text.bottom() - m_horizontal_border.height(), m_horizontal_border) ); m_horizontal_border.flip(true); e.push_back ( visual::scene_sprite (m_text.left(), m_text.top(), m_horizontal_border) ); m_vertical_border.mirror(false); e.push_back ( visual::scene_sprite (m_text.left() - m_vertical_border.width(), m_text.bottom(), m_vertical_border) ); m_vertical_border.mirror(true); e.push_back ( visual::scene_sprite (m_text.right(), m_text.bottom(), m_vertical_border) ); if ( m_on_right ) { if (m_on_top) { render_bottom_left_corner(e, m_spike); render_bottom_right_corner(e, m_corner); render_top_left_corner(e, m_corner); render_top_right_corner(e, m_corner); } else { render_bottom_left_corner(e, m_corner); render_bottom_right_corner(e, m_corner); render_top_left_corner(e, m_spike); render_top_right_corner(e, m_corner); } } else if (m_on_top) { render_bottom_left_corner(e, m_corner); render_bottom_right_corner(e, m_spike); render_top_left_corner(e, m_corner); render_top_right_corner(e, m_corner); } else { render_bottom_left_corner(e, m_corner); render_bottom_right_corner(e, m_corner); render_top_left_corner(e, m_corner); render_top_right_corner(e, m_spike); } } // balloon::render() /*----------------------------------------------------------------------------*/ /** * \brief Sets the sprite to use to render the spike of the balloon. * \param spr The sprite to use. */ void bear::engine::balloon::set_spike_sprite( visual::sprite spr ) { m_spike = spr; } // balloon::set_spike_sprite() /*----------------------------------------------------------------------------*/ /** * \brief Sets the sprite to use to render the corners of the balloon. * \param spr The sprite to use. It will be rendered not flipped nor mirrored * for the bottom left corner, and flipped or mirrored for the other * corners. */ void bear::engine::balloon::set_corner_sprite( visual::sprite spr ) { m_corner = spr; } // balloon::set_corner_sprite() /*----------------------------------------------------------------------------*/ /** * \brief Sets the sprite to use to render the horizontal borders of the * balloon. * \param spr The sprite to use. It will be rendered not flipped for the bottom * border and flipped for the top border. */ void bear::engine::balloon::set_horizontal_border_sprite( visual::sprite spr ) { m_horizontal_border = spr; } // balloon::set_horizontal_border_sprite() /*----------------------------------------------------------------------------*/ /** * \brief Sets the sprite to use to render the vertical borders of the * balloon. * \param spr The sprite to use. It will be rendered not mirrored for the left * border and mirrored for the right border. */ void bear::engine::balloon::set_vertical_border_sprite( visual::sprite spr ) { m_vertical_border = spr; } // balloon::set_vertical_border_sprite() /*----------------------------------------------------------------------------*/ /** * \brief Sets the font to use to render the text. * \param f The font to use. */ void bear::engine::balloon::set_font( visual::font f ) { m_text.set_font( f ); } // balloon::set_font() /*----------------------------------------------------------------------------*/ /** * \brief Test if the balloon is finished. */ bool bear::engine::balloon::is_finished() const { return !m_active; } // balloon::is_finished() /*----------------------------------------------------------------------------*/ /** * \brief Get the size of the balloon. */ bear::visual::size_box_type bear::engine::balloon::get_size() const { visual::size_box_type result; result.x = m_text.width() + m_vertical_border.width() + m_spike.width(); result.y = m_text.height() + m_horizontal_border.height() + m_spike.height(); return result; } // balloon::get_size() /*----------------------------------------------------------------------------*/ /** * \brief Get the final size of the balloon. */ bear::visual::size_box_type bear::engine::balloon::get_final_size() const { visual::size_box_type result(m_size_frame); result.x += m_vertical_border.width() + m_spike.width(); result.y += m_horizontal_border.height() + m_spike.height(); return result; } // balloon::get_final_size() /*----------------------------------------------------------------------------*/ /** * \brief Set the position of the balloon. * \param pos The position of the balloon. * \param on_top Tell that the balloon is on the top of the item. * \param on_right Tell that the balloon is on the right of the item. */ void bear::engine::balloon::set_position ( const visual::position_type& pos, bool on_top, bool on_right ) { m_on_right = on_right; m_on_top = on_top; visual::position_type delta; if (m_on_right) delta.x = m_spike.width(); else delta.x = m_vertical_border.width() + (m_size_frame.x - m_text.width()); if (m_on_top) delta.y = m_spike.height(); else delta.y = m_horizontal_border.height() + (m_size_frame.y - m_text.height()); m_text.set_position(pos + delta); } // balloon::set_position() /*----------------------------------------------------------------------------*/ /** * \brief Get the position of the balloon. */ bear::visual::position_type bear::engine::balloon::get_position() const { visual::position_type delta; if (m_on_right) delta.x = -m_spike.width(); else delta.x = -m_vertical_border.width(); if (m_on_top) delta.y = -m_spike.height(); else delta.y = -m_horizontal_border.height(); return m_text.bottom_left() + delta; } // balloon::get_position() /*----------------------------------------------------------------------------*/ /** * \brief Tell if the balloon is on the top of the item. */ bool bear::engine::balloon::is_on_top() const { return m_on_top; } // balloon::is_on_top() /*----------------------------------------------------------------------------*/ /** * \brief Tell if the balloon is on the right of the item. */ bool bear::engine::balloon::is_on_right() const { return m_on_right; } // balloon::is_on_right() /*----------------------------------------------------------------------------*/ /** * \brief Set a new list of things to say. * \param speeches Speeches said by the speaker. */ void bear::engine::balloon::set_speeches( const std::list& speeches ) { m_speeches = speeches; m_has_started = false; m_time = 0; if ( !m_speeches.empty() ) write_text(); m_size_frame = m_text.get_size(); m_text.set_size( 0, 0 ); m_active = true; } // balloon::set_speeches() /*----------------------------------------------------------------------------*/ /** * \brief Close the balloon. All speeches are removed. */ void bear::engine::balloon::close() { m_speeches.clear(); m_text.set_size( 0, 0 ); m_active = false; } // balloon::close() /*----------------------------------------------------------------------------*/ /** * \brief Render a sprite in the bottom left corner. * \param e (out) The visuals. * \param s The sprite to render. */ void bear::engine::balloon::render_bottom_left_corner ( std::list& e, visual::sprite s ) const { s.mirror(false); s.flip(false); e.push_back ( visual::scene_sprite (m_text.left() - s.width(), m_text.bottom() - s.height(), s) ); } // balloon::render_bottom_left_corner() /*----------------------------------------------------------------------------*/ /** * \brief Render a sprite in the bottom left corner. * \param e (out) The visuals. * \param s The sprite to render. */ void bear::engine::balloon::render_bottom_right_corner ( std::list& e, visual::sprite s ) const { s.mirror(true); s.flip(false); e.push_back ( visual::scene_sprite (m_text.right(), m_text.bottom() - s.height(), s) ); } // balloon::render_bottom_right_corner() /*----------------------------------------------------------------------------*/ /** * \brief Render a sprite in the bottom left corner. * \param e (out) The visuals. * \param s The sprite to render. */ void bear::engine::balloon::render_top_left_corner ( std::list& e, visual::sprite s ) const { s.mirror(false); s.flip(true); e.push_back ( visual::scene_sprite(m_text.left() - s.width(), m_text.top(), s) ); } // balloon::render_top_left_corner() /*----------------------------------------------------------------------------*/ /** * \brief Render a sprite in the top right corner. * \param e (out) The visuals. * \param s The sprite to render. */ void bear::engine::balloon::render_top_right_corner ( std::list& e, visual::sprite s ) const { s.mirror(true); s.flip(true); e.push_back( visual::scene_sprite(m_text.right(), m_text.top(), s) ); } // balloon::render_top_right_corner() /*----------------------------------------------------------------------------*/ /** * \brief Increase the balloon. * \param elapsed_time The time elapsed since the last call. */ void bear::engine::balloon::increase( universe::time_type elapsed_time ) { const visual::size_box_type enlargement ( m_size_frame / m_increasing_duration * elapsed_time ); visual::size_box_type size( m_text.get_size() ); size.x = std::min( size.x + enlargement.x, m_size_frame.x ); size.y = std::min( size.y + enlargement.y, m_size_frame.y ); set_content_size(size); } // balloon::increase() /*----------------------------------------------------------------------------*/ /** * \brief Decrease the balloon. * \param elapsed_time The time elapsed since the last call. */ void bear::engine::balloon::decrease( universe::time_type elapsed_time ) { const visual::size_box_type enlargement ( m_size_frame / m_increasing_duration * elapsed_time ); visual::size_box_type size( m_text.get_size() ); size.x = std::max( size.x - enlargement.x, 0.0 ); size.y = std::max( size.y - enlargement.y, 0.0 ); set_content_size(size); m_active = (size.x > 0) || (size.y > 0); } // balloon::decrease() /*----------------------------------------------------------------------------*/ /** * \brief Set the size of the content of the balloon. */ void bear::engine::balloon::set_content_size( const visual::size_box_type& s ) { m_text.set_size(s); m_horizontal_border.set_width(s.x); m_vertical_border.set_height(s.y); if ( !m_on_top ) m_text.set_bottom( m_text.top() - m_text.height() ); if ( !m_on_right ) m_text.set_left( m_text.right() - m_text.width() ); } // balloon::set_content_size() /*----------------------------------------------------------------------------*/ /** * \brief Write the new text. */ void bear::engine::balloon::write_text() { m_text.set_position( 0, 0 ); m_text.set_auto_size(true); m_text.set_text(m_speeches.front()); m_text.set_auto_size(false); if ( m_text.width() > 200 ) { m_text.set_width(200); m_text.expand_vertically(); } set_content_size(m_text.get_size()); m_play_time = m_speeches.front().length()/10; if ( m_play_time < 2 ) m_play_time = 2; else if ( m_play_time > 6 ) m_play_time = 6; m_speeches.pop_front(); } // balloon::write_text() plee-the-bear-20251226/bear-engine/core/src/engine/comic/item/000077500000000000000000000000001512343254000235605ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/core/src/engine/comic/item/code/000077500000000000000000000000001512343254000244725ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/core/src/engine/comic/item/code/speaker_item.cpp000066400000000000000000000077201512343254000276540ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::engine::speaker_item class. * \author Sébastien Angibaud */ #include "engine/comic/item/speaker_item.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ bear::engine::speaker_item::speaker_item() : m_persistent_balloon(false) { // nothing to do } // speaker_item::speaker_item() /*----------------------------------------------------------------------------*/ /** * \brief Copy constructor. * \param that The instance to copy from. */ bear::engine::speaker_item::speaker_item( const speaker_item& that ) : m_speeches(that.m_speeches), m_persistent_balloon(that.m_persistent_balloon) { } // speaker_item::speaker_item() /*----------------------------------------------------------------------------*/ /** * \brief Destructor. */ bear::engine::speaker_item::~speaker_item() { // must exist and be virtual for dynamic_casts } // speaker_item::~speaker_item() /*---------------------------------------------------------------------------*/ /** * \brief Do one iteration in the progression of the item. * \param elapsed_time Elapsed time since the last call. */ void bear::engine::speaker_item::progress( universe::time_type elapsed_time ) { m_balloon.progress(elapsed_time); if ( has_finished_to_speak() && has_more_things_to_say() ) { m_balloon.set_speeches(m_speeches.front()); m_speeches.pop_front(); } } // speaker_item::create_balloon() /*----------------------------------------------------------------------------*/ /** * \brief Indicates if the speaker has finished to speak. */ bool bear::engine::speaker_item::has_finished_to_speak() const { return m_balloon.is_finished(); } // speaker_item::has_finished_to_speak() /*----------------------------------------------------------------------------*/ /** * \brief Indicates if the speaker has more things to say. */ bool bear::engine::speaker_item::has_more_things_to_say() const { return !m_speeches.empty(); } // speaker_item::has_more_things_to_say() /*----------------------------------------------------------------------------*/ /** * \brief Stop speaking. */ void bear::engine::speaker_item::stop_speaking() { m_balloon.close(); } // speaker_item::stop_speaking() /*----------------------------------------------------------------------------*/ /** * \brief Start a speech. * \param speech The new speech. */ void bear::engine::speaker_item::speak(const std::vector& speech) { const std::list s( speech.begin(), speech.end() ); m_speeches.push_back(s); } // speaker_item::speak() /*----------------------------------------------------------------------------*/ /** * \brief Start a speech. * \param s The sentence to say. * * \a s is added at the end of the pending speeches. */ void bear::engine::speaker_item::speak(const std::string& s) { std::list t; t.push_back( s ); m_speeches.push_back(t); } // speaker_item::speak() /*----------------------------------------------------------------------------*/ /** * \brief Get the balloon. */ bear::engine::balloon& bear::engine::speaker_item::get_balloon() { return m_balloon; } // speaker_item::get_balloon() /*----------------------------------------------------------------------------*/ /** * \brief Set the persistency of the balloon. * \param b Persistent or not. */ void bear::engine::speaker_item::set_persistent_balloon( bool b ) { m_persistent_balloon = b; } // speaker_item::set_persistent_balloon() /*----------------------------------------------------------------------------*/ /** * \brief Tell if the balloon is persistent. */ bool bear::engine::speaker_item::get_persistent_balloon() const { return m_persistent_balloon; } // speaker_item::get_persistent_balloon() plee-the-bear-20251226/bear-engine/core/src/engine/comic/item/impl/000077500000000000000000000000001512343254000245215ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/core/src/engine/comic/item/impl/item_that_speaks.tpp000066400000000000000000000061361512343254000306000ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the engine::item_that_speaks class. * \author Sebastien Angibaud */ #include "engine/level_globals.hpp" #include "engine/comic/loader/speaker_item_loader.hpp" #include "engine/comic/message/balloon_layer_add_message.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param balloon_layer_name The name of the layer in which the balloon of the * speaker item is displayed. */ template bear::engine::item_that_speaks::item_that_speaks ( std::string balloon_layer_name ) : m_registered_in_layer( false ), m_balloon_layer_name( balloon_layer_name ) { } // item_that_speaks::item_that_speaks() /*----------------------------------------------------------------------------*/ /** * \brief Copy constructor. * \param that The instance to copy from. */ template bear::engine::item_that_speaks::item_that_speaks ( const item_that_speaks& that ) : super( that ), speaker_item( that ), m_registered_in_layer( false ), m_balloon_layer_name( that.m_balloon_layer_name ) { } // item_that_speaks::item_that_speaks() /*---------------------------------------------------------------------------*/ /** * \brief Do one iteration in the progression of the item. * \param elapsed_time Elapsed time since the last call. */ template void bear::engine::item_that_speaks::progress ( universe::time_type elapsed_time ) { super::progress(elapsed_time); speaker_item::progress(elapsed_time); if ( !m_registered_in_layer ) { balloon_layer_add_message msg_speaker; msg_speaker.set_speaker(this); m_registered_in_layer = this->get_level_globals().send_message ( m_balloon_layer_name, msg_speaker ); } } // item_that_speaks::progress() /*----------------------------------------------------------------------------*/ /** * \brief Adds the loaders of this item class into a given loader map. * \param m The map in which the loaders are inserted. */ template void bear::engine::item_that_speaks::populate_loader_map( item_loader_map& m ) { super::populate_loader_map( m ); m.insert( speaker_item_loader("item_that_speaks", *this) ); } // item_that_speaks::populate_loader_map() /*----------------------------------------------------------------------------*/ /** * \brief Export the methods of the class. */ template void bear::engine::item_that_speaks::init_exported_methods() { TEXT_INTERFACE_CONNECT_PARENT_METHOD_1 ( item_that_speaks, speaker_item, speak, void, const std::vector& ); } // item_that_speaks::init_exported_methods() /*----------------------------------------------------------------------------*/ TEXT_INTERFACE_IMPLEMENT_TEMPLATE_METHOD_LIST_1( bear::engine::item_that_speaks, typename, Base ) plee-the-bear-20251226/bear-engine/core/src/engine/comic/item/item_that_speaks.hpp000066400000000000000000000033171512343254000276210ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief An implementation of base_item that extends item_that_speaks. * \author Sebastien Angibaud */ #ifndef __BEAR_ITEM_THAT_SPEAKS_HPP__ #define __BEAR_ITEM_THAT_SPEAKS_HPP__ #include "engine/loader/item_loader_map.hpp" #include "engine/comic/item/speaker_item.hpp" #include "text_interface/base_exportable.hpp" namespace bear { namespace engine { /** * \brief An item that speaks. * * \b template \b parameters : * - \a Base : the base class for this item. Must inherit from * engine::base_item, * \author Sebastien Angibaud */ template class item_that_speaks: public Base, public speaker_item { typedef Base super; TEXT_INTERFACE_DECLARE_METHOD_LIST(super, init_exported_methods) public: explicit item_that_speaks( std::string balloon_layer_name ); item_that_speaks( const item_that_speaks& that ); void progress( universe::time_type elapsed_time ); protected: virtual void populate_loader_map( item_loader_map& m ); private: static void init_exported_methods(); private: /** \brief Tell if this item has been registered in a balloon layer. */ bool m_registered_in_layer; /** \brief The name of the layer to which the messages are sent to display the balloon of this item. */ std::string m_balloon_layer_name; }; // class item_that_speaks } // namespace engine } // namespace bear #include "engine/comic/item/impl/item_that_speaks.tpp" #endif // __BEAR_ITEM_THAT_SPEAKS_HPP__ plee-the-bear-20251226/bear-engine/core/src/engine/comic/item/speaker_item.hpp000066400000000000000000000030731512343254000267440ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief The class describing a speaker_item. * \author Sébastien Angibaud */ #ifndef __BEAR_SPEAKER_ITEM_HPP__ #define __BEAR_SPEAKER_ITEM_HPP__ #include "engine/comic/balloon.hpp" #include "engine/class_export.hpp" #include #include #include namespace bear { namespace engine { /** * \brief The class describing a speaker. * \author Sébastien Angibaud */ class ENGINE_EXPORT speaker_item { public: speaker_item(); speaker_item( const speaker_item& that ); virtual ~speaker_item(); void progress( universe::time_type elapsed_time ); bool has_finished_to_speak() const; bool has_more_things_to_say() const; void stop_speaking(); void speak( const std::vector& speech ); void speak( const std::string& s ); balloon& get_balloon(); void set_persistent_balloon( bool b ); bool get_persistent_balloon() const; private: /** \brief The balloon. */ balloon m_balloon; /** \brief The list of speeches. */ std::list< std::list > m_speeches; /** \brief Tell if the balloon must stay visible even if the item is off screen. */ bool m_persistent_balloon; }; // class speaker_item } // namespace engine } // namespace bear #endif // __BEAR_SPEAKER_ITEM_HPP__ plee-the-bear-20251226/bear-engine/core/src/engine/comic/layer/000077500000000000000000000000001512343254000237365ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/core/src/engine/comic/layer/balloon_layer.hpp000066400000000000000000000036071512343254000272770ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief The balloon displays the balloons of the speaker_item. * \author Angibaud Sebastien */ #ifndef __BEAR_BALLOON_LAYER_HPP__ #define __BEAR_BALLOON_LAYER_HPP__ #include "communication/messageable.hpp" #include "engine/layer/gui_layer.hpp" #include "universe/derived_item_handle.hpp" #include "engine/class_export.hpp" #include #include namespace bear { namespace engine { class speaker_item; /** * \brief The balloon displays the balloons of the speaker_item. * \author Angibaud Sebastien */ class ENGINE_EXPORT balloon_layer: public communication::messageable, public engine::gui_layer { public: /** \brief The type of a list of scene elements retrieved from the layer. */ typedef engine::gui_layer::scene_element_list scene_element_list; /** \brief The type of the pointers on the speaker items. */ typedef universe::derived_item_handle handle_type; /** \brief The type of the list of all speakers. */ typedef std::list speaker_list; public: balloon_layer( const std::string& name ); void build(); void progress( universe::time_type elapsed_time ); void render( scene_element_list& e ) const; void add_speaker( speaker_item* speaker ); private: universe::rectangle_type get_bounding_box_on_screen(handle_type& speaker) const; private: /** \brief List of speakers. */ speaker_list m_speakers; /** \brief The size of the border. */ unsigned int m_border; }; // class balloon_layer } // namespace engine } // namespace bear #endif // __BEAR_BALLOON_LAYER_HPP__ plee-the-bear-20251226/bear-engine/core/src/engine/comic/layer/balloon_placement/000077500000000000000000000000001512343254000274145ustar00rootroot00000000000000balloon_placement.hpp000066400000000000000000000131371512343254000335310ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/core/src/engine/comic/layer/balloon_placement/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A class that tries to place the balloons such that they don't overlap. * \author Julien Jorge */ #ifndef __BEAR_BALLOON_PLACEMENT_HPP__ #define __BEAR_BALLOON_PLACEMENT_HPP__ #include "universe/types.hpp" #include "engine/class_export.hpp" #include namespace bear { namespace engine { class speaker_item; /** * \brief A class that tries to place the balloons such that they don't * overlap. * \author Julien Jorge */ class ENGINE_EXPORT balloon_placement { private: /** \brief A character speaking in the scene. */ struct scene_character { public: scene_character ( speaker_item& i, const universe::rectangle_type& r, bool v ); universe::size_box_type get_balloon_size() const; /** \brief The bounding box of the character. */ const universe::rectangle_type box; /** \brief The speaking item. */ speaker_item& item; /** \brief Tell if the speaker is visible. */ bool visible; }; // struct scene_character class candidate; typedef std::list candidate_group; /** \brief A candidate position for a balloon. */ class candidate { public: /** \brief This function object compares two candidates in decreasing order of their quality. */ struct increasing_conflicts { bool operator()( const candidate* a, const candidate* b ) const; }; // struct increasing_conflicts public: candidate ( const universe::rectangle_type& r, const scene_character& s, int score ); void add_covered_area( double percent ); void set_in_conflict_with( candidate* c ); std::size_t get_conclicts_count() const; /** \brief Get the candidates conflicting with this one. */ const candidate_group& get_conflicts() const { return m_conflicts; } bool is_valid() const; void invalidate(); int eval() const; void print_formatted( std::ostream& os, bool top, bool right ) const; public: /** \brief The rectangle where the balloon would be. */ const universe::rectangle_type rect; /** \brief The character owning the balloon. */ const scene_character& speaker; private: /** \brief The candidates in conflicts with this one. */ candidate_group m_conflicts; /** \brief The size of m_conflicts. */ int m_conflicts_count; /** \brief Tell if this candidate is still usable. */ bool m_is_valid; /** \brief The score of this candidate. */ int m_score; /** \brief Percentage of the area of the balloon covered by something else. */ double m_covered_area; }; // class candidate /** \brief The list of candidates, where each group concerns the same speaker. */ typedef std::list candidate_group_list; /** \brief This function object compares two groups in decreasing order of the quality of their first candidate. */ struct group_ordering { bool operator() ( const candidate_group& a, const candidate_group& b ) const; }; // struct group_ordering /** \brief The type of the list in which we store the speakers. */ typedef std::list character_list_type; public: balloon_placement ( universe::size_type w, universe::size_type h ); void add_speaker ( speaker_item& c, const universe::rectangle_type& rect ); void place_balloons() const; private: void sort_candidates( candidate_group_list& c ) const; void create_candidates( candidate_group_list& c ) const; void check_conflicts( candidate_group& g, candidate_group_list& result ) const; void new_candidate ( const scene_character& c, candidate_group& result, universe::coordinate_type left, universe::coordinate_type bottom, int score ) const; void create_candidate_visible ( const scene_character& c, candidate_group& result ) const; void create_candidate_not_visible ( const scene_character& c, candidate_group& result ) const; void repeat_candidate_horizontally ( const scene_character& c, candidate_group& result, universe::coordinate_type first, universe::coordinate_type last, universe::coordinate_type y ) const; void repeat_candidate_vertically ( const scene_character& c, candidate_group& result, universe::coordinate_type first, universe::coordinate_type last, universe::coordinate_type x ) const; void repeat_candidate_placed_horizontally ( const scene_character& c, candidate_group& result, universe::coordinate_type y ) const; void repeat_candidate_placed_vertically ( const scene_character& c, candidate_group& result, universe::coordinate_type x ) const; bool check_on_top( const candidate& c ) const; bool check_on_right( const candidate& c ) const; private: /** \brief The size of the view where the speakers are visible. */ universe::rectangle_type m_view; /** \brief The list of all speakers. */ character_list_type m_characters; }; // class balloon_placement } // namespace engine } // namespace bear #endif // __BEAR_BALLOON_PLACEMENT_HPP__ plee-the-bear-20251226/bear-engine/core/src/engine/comic/layer/balloon_placement/code/000077500000000000000000000000001512343254000303265ustar00rootroot00000000000000balloon_placement.cpp000066400000000000000000000537531512343254000344460ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/core/src/engine/comic/layer/balloon_placement/code/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::engine::balloon_placement class. * \author Julien Jorge */ #include "engine/comic/layer/balloon_placement/balloon_placement.hpp" #include "engine/comic/item/speaker_item.hpp" #include "universe/zone.hpp" /** * Define this macro to disable the placement of the balloons. The balloons can * then overlap and be offscreen. */ // #define BALLOON_PLACEMENT_DISABLED /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param i The speaking item. * \param r The bounding box of the speaking item. * \param v Tell if the item is visible on the screen. */ bear::engine::balloon_placement::scene_character::scene_character ( speaker_item& i, const universe::rectangle_type& r, bool v ) : box(r), item(i), visible(v) { // nothing to do } // balloon_placement::scene_character::scene_character() /*----------------------------------------------------------------------------*/ /** * \brief Get the size of the balloon for this speaker. */ bear::universe::size_box_type bear::engine::balloon_placement::scene_character::get_balloon_size() const { return item.get_balloon().get_final_size(); } // balloon_placement::scene_character::get_balloon_size() /*----------------------------------------------------------------------------*/ /** * \brief Compare two candidates in decreasing order of quality. * \param a The left operand. * \param b The right operand. */ bool bear::engine::balloon_placement::candidate::increasing_conflicts::operator() ( const candidate* a, const candidate* b ) const { return a->eval() > b->eval(); } // balloon_placement::candidate::increasing_conflicts::operator()() /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param r The rectangle where the balloon would be. * \param s The character owning this balloon. * \param score The score of this candidate. */ bear::engine::balloon_placement::candidate::candidate ( const universe::rectangle_type& r, const scene_character& s, int score ) : rect(r), speaker(s), m_conflicts_count(0), m_is_valid(true), m_score(score), m_covered_area(0) { // nothing to do } // balloon_placement::candidate::candidate() /*----------------------------------------------------------------------------*/ /** * \brief Indicate a covered area in the balloon. * \param percent Percent of covered area between zero and one. */ void bear::engine::balloon_placement::candidate::add_covered_area ( double percent ) { m_covered_area = std::min( 1.0, m_covered_area + percent ); } // balloon_placement::candidate::add_covered_area() /*----------------------------------------------------------------------------*/ /** * \brief Indicate a conflict with an other candidate. * \param c The other candidate. */ void bear::engine::balloon_placement::candidate::set_in_conflict_with ( candidate* c ) { CLAW_PRECOND(c != this); CLAW_PRECOND( std::find( m_conflicts.begin(), m_conflicts.end(), c ) == m_conflicts.end() ); ++m_conflicts_count; m_conflicts.push_back(c); } // balloon_placement::candidate::set_in_conflict_with() /*----------------------------------------------------------------------------*/ /** * \brief Get the number of conflicts. */ std::size_t bear::engine::balloon_placement::candidate::get_conclicts_count() const { return m_conflicts_count; } // balloon_placement::candidate::get_conclicts_count() /*----------------------------------------------------------------------------*/ /** * \brief Tell if this is still a valid candidate. */ bool bear::engine::balloon_placement::candidate::is_valid() const { return m_is_valid; } // balloon_placement::candidate::is_valid() /*----------------------------------------------------------------------------*/ /** * \brief Indicate that this candidate should not be used anymore. */ void bear::engine::balloon_placement::candidate::invalidate() { m_is_valid = false; } // balloon_placement::candidate::invalidate() /*----------------------------------------------------------------------------*/ /** * \brief Get an evaluation of this candidate. */ int bear::engine::balloon_placement::candidate::eval() const { return m_score - m_conflicts_count - (int)(m_covered_area * 100 + 0.5); } // balloon_placement::candidate::eval() /*----------------------------------------------------------------------------*/ /** * \brief Prints the candidate details in a stream. * \param os The stream in which we write. */ void bear::engine::balloon_placement::candidate::print_formatted ( std::ostream& os, bool top, bool right ) const { os << "Candidate left=" << rect.left() << " right=" << rect.right() << " bottom=" << rect.bottom() << " top=" << rect.top() << '\n' << "placed " << (top ? "top" : "bottom") << '-' << (right ? "right" : "left") << '\n' << "Evaluated at " << eval() << " with\n" << "score:\t" << m_score << '\n' << "conflicts:\t" << m_conflicts_count << '\n' << "covered area:\t" << (int)(m_covered_area * 100 + 0.5) << std::endl; } // balloon_placement::candidate::print_formatted() /*----------------------------------------------------------------------------*/ /** * \brief Compare two candidate groups by decreasing order of the quality of * their first candidate. * \param a The left operand. * \param b The right operand. */ bool bear::engine::balloon_placement::group_ordering::operator() ( const candidate_group& a, const candidate_group& b ) const { CLAW_PRECOND( !a.empty() ); CLAW_PRECOND( !b.empty() ); return a.front()->eval() > b.front()->eval(); } // balloon_placement::group_ordering::operator()() /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param w The width of the area where the speakers are. * \param h The height of the area where the speakers are. */ bear::engine::balloon_placement::balloon_placement ( universe::size_type w, universe::size_type h ) : m_view(0, 0, w, h) { } // balloon_placement::balloon_placement() /*----------------------------------------------------------------------------*/ /** * \brief Add a speaker. * \param c The speaker to add. * \param rect The bounding box of the speaker in the area. */ void bear::engine::balloon_placement::add_speaker ( speaker_item& c, const universe::rectangle_type& rect ) { bool is_visible(false); if ( rect.intersects(m_view) ) is_visible = !rect.intersection(m_view).empty() || rect.empty(); m_characters.push_back(scene_character(c, rect, is_visible)); } // balloon_placement::add_speaker() /*----------------------------------------------------------------------------*/ /** * \brief Compute the position of the balloons for all speakers previously added * by add_speaker. */ void bear::engine::balloon_placement::place_balloons() const { candidate_group_list clist; create_candidates(clist); sort_candidates(clist); candidate_group_list::iterator it; candidate_group remaining; for (it=clist.begin(); it!=clist.end(); ++it) { candidate_group::iterator git; candidate* c(NULL); for (git=it->begin(); (c==NULL) && (git!=it->end()); ++git) if ( (*git)->is_valid() ) c = *git; if (c == NULL) c = it->front(); else c->invalidate(); c->speaker.item.get_balloon().set_position ( c->rect.bottom_left(), check_on_top(*c), check_on_right(*c) ); candidate_group::const_iterator cit; for (cit=c->get_conflicts().begin(); cit!=c->get_conflicts().end(); ++cit) (*cit)->invalidate(); } for (it=clist.begin(); it!=clist.end(); ++it) { candidate_group::iterator git; for (git=it->begin(); git!=it->end(); ++git) delete *git; } } // balloon_placement::place_balloons() /*----------------------------------------------------------------------------*/ /** * \brief Sort the candidate groups such that the most interestings become * first. * \param c The groups. */ void bear::engine::balloon_placement::sort_candidates ( candidate_group_list& c ) const { candidate_group_list::iterator it; for ( it=c.begin(); it!=c.end(); ++it ) it->sort( candidate::increasing_conflicts() ); c.sort( group_ordering() ); } // balloon_placement::sort_candidates() /*----------------------------------------------------------------------------*/ /** * \brief Create the candidates for all characters. * \param c (out) The candidates. */ void bear::engine::balloon_placement::create_candidates ( candidate_group_list& c ) const { character_list_type::const_iterator it; for ( it=m_characters.begin(); it!=m_characters.end(); ++it ) { candidate_group result; if ( it->item.get_balloon().is_finished() ) result.push_back ( new candidate( it->box, *it, -1000 ) ); else if ( it->visible ) create_candidate_visible(*it, result); else { #ifdef BALLOON_PLACEMENT_DISABLED create_candidate_visible(*it, result); #else if ( it->item.get_persistent_balloon() ) create_candidate_not_visible(*it, result); else create_candidate_visible(*it, result); #endif } if ( result.empty() ) result.push_back ( new candidate ( universe::rectangle_type ( it->box.top_left(), it->box.top_left() + it->get_balloon_size() ), *it, -1000 ) ); #ifndef BALLOON_PLACEMENT_DISABLED check_conflicts(result, c); #endif c.push_back(result); } } // balloon_placement::create_candidates() /*----------------------------------------------------------------------------*/ /** * \brief Set the conflicts of a group with the other groups. * \param g The group of new candidates. * \param result (in/out) The candidates created before the ones in \a g. * \pre All candidates in \a g concern the same item. */ void bear::engine::balloon_placement::check_conflicts ( candidate_group& g, candidate_group_list& result ) const { candidate_group_list::iterator it; candidate_group::iterator sit, git; for ( it=result.begin(); it!=result.end(); ++it ) for ( sit=it->begin(); sit!=it->end(); ++sit ) for ( git=g.begin(); git!=g.end(); ++git ) { bool conflict(false); if ( (*sit)->rect.intersects( (*git)->rect ) ) conflict = !(*sit)->rect.intersection( (*git)->rect ).empty(); if (!conflict) if ( (*sit)->rect.intersects( (*git)->speaker.box ) ) conflict = !(*sit)->rect.intersection( (*git)->speaker.box ).empty(); if (!conflict) if ( (*git)->rect.intersects( (*sit)->speaker.box ) ) conflict = !(*git)->rect.intersection( (*sit)->speaker.box ).empty(); if (conflict) { (*sit)->set_in_conflict_with( *git ); (*git)->set_in_conflict_with( *sit ); } } } // balloon_placement::check_conflicts() /*----------------------------------------------------------------------------*/ /** * \brief Add a new candidate for a given character. * \param c The caracter for which we create the candidate. * \param result (out) The group where is added the candidate. * \param left The left position of the balloon. * \param bottom The bottom position of the balloon. * \param score The score assigned to this candidate, by default. The final * score given to the candidate can be different. */ void bear::engine::balloon_placement::new_candidate ( const scene_character& c, candidate_group& result, universe::coordinate_type left, universe::coordinate_type bottom, int score ) const { const universe::rectangle_type r ( left, bottom, left + c.get_balloon_size().x, bottom + c.get_balloon_size().y ); double covered_area = 0; if ( c.visible ) { #ifndef BALLOON_PLACEMENT_DISABLED if ( m_view.includes(r) ) score += 10; else if ( c.item.get_persistent_balloon() ) return; else if ( !m_view.intersects(r) ) score = -1; else { score = -1; covered_area = 1.0 - m_view.intersection(r).area() / r.area(); } #endif } else if ( !m_view.intersects(r) ) score = -1; candidate* cd = new candidate(r, c, score); cd->add_covered_area( covered_area ); result.push_back( cd ); } // balloon_placement::new_candidate() /*----------------------------------------------------------------------------*/ /** * \brief Create the candidates for an item visible in the area. * \param c The item. * \param result (out) The candidates for \a c. */ void bear::engine::balloon_placement::create_candidate_visible ( const scene_character& c, candidate_group& result ) const { const int on_finished_preference = c.item.get_balloon().is_finished() ? 1 : 0; const int score_left = !c.item.get_balloon().is_on_right() ? (1 - on_finished_preference) : 0; const int score_right = c.item.get_balloon().is_on_right() ? 1 : on_finished_preference; const int score_bottom = !c.item.get_balloon().is_on_top() ? (1 - on_finished_preference) : 0; const int score_top = c.item.get_balloon().is_on_top() ? 1 : on_finished_preference; const int top_factor( 2 ); #ifdef BALLOON_PLACEMENT_DISABLED const int right_factor( 10 ); #else const int right_factor( 2 ); #endif const int left_factor( 2 ); new_candidate ( c, result, c.box.right(), c.box.top(), top_factor * right_factor * (score_right + score_top) ); new_candidate ( c, result, c.box.left() - c.get_balloon_size().x, c.box.top(), top_factor * left_factor * (score_left + score_top) ); new_candidate ( c, result, c.box.right(), c.box.bottom() - c.get_balloon_size().y, right_factor * (score_right + score_bottom) ); new_candidate ( c, result, c.box.left() - c.get_balloon_size().x, c.box.bottom() - c.get_balloon_size().y, left_factor * (score_left + score_bottom) ); } // balloon_placement::create_candidate_visible() /*----------------------------------------------------------------------------*/ /** * \brief Create the candidates for an off-screen item. * \param c The item. * \param result (out) The candidates for \a c. */ void bear::engine::balloon_placement::create_candidate_not_visible ( const scene_character& c, candidate_group& result ) const { switch( universe::zone::find( c.box, m_view ) ) { case universe::zone::top_left_zone: repeat_candidate_horizontally ( c, result, m_view.left(), m_view.width() / 2, m_view.top() - c.get_balloon_size().y ); repeat_candidate_vertically ( c, result, m_view.top() - c.get_balloon_size().y, m_view.top() - m_view.height() / 2, m_view.left() ); break; case universe::zone::top_zone: repeat_candidate_placed_horizontally ( c, result, m_view.top() - c.get_balloon_size().y ); break; case universe::zone::top_right_zone: repeat_candidate_horizontally ( c, result, m_view.right(), m_view.right() - m_view.width() / 2, m_view.top() - c.get_balloon_size().y ); repeat_candidate_vertically ( c, result, m_view.top() - c.get_balloon_size().y, m_view.top() - m_view.height() / 2, m_view.right() - c.get_balloon_size().x ); break; case universe::zone::middle_left_zone: repeat_candidate_placed_vertically( c, result, m_view.left() ); break; case universe::zone::middle_right_zone: repeat_candidate_placed_vertically ( c, result, m_view.right() - c.get_balloon_size().x ); break; case universe::zone::bottom_left_zone: repeat_candidate_horizontally ( c, result, m_view.left(), m_view.width() / 2, m_view.bottom() ); repeat_candidate_vertically ( c, result, m_view.bottom() + c.get_balloon_size().y, m_view.bottom() + m_view.height() / 2, m_view.left() ); break; case universe::zone::bottom_zone: repeat_candidate_placed_horizontally( c, result, m_view.bottom() ); break; case universe::zone::bottom_right_zone: repeat_candidate_horizontally ( c, result, m_view.right(), m_view.right() - m_view.width() / 2, m_view.bottom() ); repeat_candidate_vertically ( c, result, m_view.bottom() + c.get_balloon_size().y, m_view.bottom() + m_view.height() / 2, m_view.right() - c.get_balloon_size().x ); break; default: { CLAW_FAIL("Invalid zone for an invisible candidate."); } } } // balloon_placement::create_candidate_not_visible() /*----------------------------------------------------------------------------*/ /** * \brief Create an horizontal line of candidates for an off-screen item. * \param c The item. * \param result (out) The candidates for \a c. * \param first X-position of the first candidate. * \param last X-position of the last candidate. * \param y Y-position for the candidates. */ void bear::engine::balloon_placement::repeat_candidate_horizontally ( const scene_character& c, candidate_group& result, universe::coordinate_type first, universe::coordinate_type last, universe::coordinate_type y ) const { const unsigned int count = (unsigned int)(std::abs(last - first) / c.get_balloon_size().x); universe::coordinate_type x; if ( first < last ) x = first; else x = first - count * c.get_balloon_size().x; for (unsigned int i=0; i!=count; ++i, x+=c.get_balloon_size().x) new_candidate(c, result, x, y, 1); } // balloon_placement::repeat_candidate_horizontally() /*----------------------------------------------------------------------------*/ /** * \brief Create a vertical line of candidates for an off-screen item. * \param c The item. * \param result (out) The candidates for \a c. * \param first Y-position of the first candidate. * \param last Y-position of the last candidate. * \param x X-position for the candidates. */ void bear::engine::balloon_placement::repeat_candidate_vertically ( const scene_character& c, candidate_group& result, universe::coordinate_type first, universe::coordinate_type last, universe::coordinate_type x ) const { const unsigned int count = (unsigned int)(std::abs(last - first) / c.get_balloon_size().y); universe::coordinate_type y; if ( first < last ) y = first; else y = first - count * c.get_balloon_size().y; for (unsigned int i=0; i!=count; ++i, y+=c.get_balloon_size().y) new_candidate(c, result, x, y, 1); } // balloon_placement::repeat_candidate_vertically() /*----------------------------------------------------------------------------*/ /** * \brief Create an horizontal line of candidates for an off-screen item, with a * balloon placed near the item. * \param c The item. * \param result (out) The candidates for \a c. * \param y Y-position for the candidates. * \pre ( c.box.left() <= m_view.right() ) * && ( c.box.right() >= m_view.left() ) */ void bear::engine::balloon_placement::repeat_candidate_placed_horizontally ( const scene_character& c, candidate_group& result, universe::coordinate_type y ) const { CLAW_PRECOND( c.box.left() <= m_view.right() ); CLAW_PRECOND( c.box.right() >= m_view.left() ); universe::coordinate_type origin = c.box.left() - c.get_balloon_size().x; if ( origin < m_view.left() ) { origin = c.box.right(); if ( origin > m_view.right() ) origin = m_view.left() + m_view.width() / 2; } universe::coordinate_type x = origin; while ( x >= m_view.left() ) { new_candidate(c, result, x, y, 1); x -= c.get_balloon_size().x; } x = origin + c.get_balloon_size().x; while ( x + c.get_balloon_size().x <= m_view.right() ) { new_candidate(c, result, x, y, 1); x += c.get_balloon_size().x; } } // balloon_placement::repeat_candidate_placed_horizontally() /*----------------------------------------------------------------------------*/ /** * \brief Create a vertical line of candidates for an off-screen item, with a * balloon placed near the item. * \param c The item. * \param result (out) The candidates for \a c. * \param x X-position for the candidates. * \pre ( c.box.bottom() <= m_view.top() ) * && ( c.box.top() >= m_view.bottom() ) */ void bear::engine::balloon_placement::repeat_candidate_placed_vertically ( const scene_character& c, candidate_group& result, universe::coordinate_type x ) const { CLAW_PRECOND( c.box.bottom() <= m_view.top() ); CLAW_PRECOND( c.box.top() >= m_view.bottom() ); universe::coordinate_type origin = c.box.top(); if ( origin + c.get_balloon_size().y > m_view.top() ) { origin = c.box.bottom() - c.get_balloon_size().y; if ( origin < m_view.bottom() ) origin = m_view.bottom() + m_view.height() / 2; } universe::coordinate_type y = origin; while ( y >= m_view.bottom() ) { new_candidate(c, result, x, y, 1); y -= c.get_balloon_size().y; } y = origin + c.get_balloon_size().y; while ( y + c.get_balloon_size().y <= m_view.top() ) { new_candidate(c, result, x, y, 1); y += c.get_balloon_size().y; } } // balloon_placement::repeat_candidate_placed_vertically() /*----------------------------------------------------------------------------*/ /** * \brief Tell if the balloon of a candidate is on the top of the item. * \param c The candidate. */ bool bear::engine::balloon_placement::check_on_top( const candidate& c ) const { return c.rect.bottom() >= c.speaker.box.bottom() + c.speaker.box.height() / 2; } // balloon_placement::check_on_top() /*----------------------------------------------------------------------------*/ /** * \brief Tell if the balloon of a candidate is on the right of the item. * \param c The candidate. */ bool bear::engine::balloon_placement::check_on_right( const candidate& c ) const { return c.rect.left() >= c.speaker.box.left() + c.speaker.box.width() / 2; } // balloon_placement::check_on_right() plee-the-bear-20251226/bear-engine/core/src/engine/comic/layer/code/000077500000000000000000000000001512343254000246505ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/core/src/engine/comic/layer/code/balloon_layer.cpp000066400000000000000000000075541512343254000302110ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::engine::balloon_layer class. * \author Sebastien Angibaud */ #include "engine/comic/layer/balloon_layer.hpp" #include "engine/comic/balloon.hpp" #include "engine/comic/item/speaker_item.hpp" #include "engine/comic/layer/balloon_placement/balloon_placement.hpp" #include "engine/level.hpp" #include "engine/level_globals.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param name The name of the layer. */ bear::engine::balloon_layer::balloon_layer( const std::string& name ) : communication::messageable(name), m_border(20) { } // balloon_layer::balloon_layer() /*----------------------------------------------------------------------------*/ /** * \brief Initialize the layer. */ void bear::engine::balloon_layer::build() { get_level_globals().register_item(*this); } // balloon_layer::build() /*----------------------------------------------------------------------------*/ /** * \brief Adjust the postion of the balloons. * \param elapsed_time The time elapsed since the last call. */ void bear::engine::balloon_layer::progress( universe::time_type elapsed_time ) { if ( get_level().is_paused() ) return; speaker_list::iterator it; balloon_placement placement(get_size().x, get_size().y); for ( it = m_speakers.begin(); it != m_speakers.end(); ) if ( (*it) == (speaker_item*)(NULL) ) it = m_speakers.erase(it); else { placement.add_speaker( **it, get_bounding_box_on_screen(*it) ); ++it; } placement.place_balloons(); } // balloon_layer::progress() /*----------------------------------------------------------------------------*/ /** * \brief Get the scene elements of the layer. * \param e (out) The scene elements. */ void bear::engine::balloon_layer::render( scene_element_list& e ) const { speaker_list::const_iterator it; for ( it = m_speakers.begin(); it != m_speakers.end(); ++it) if ( !(*it)->has_finished_to_speak() ) (*it)->get_balloon().render(e); } // balloon_layer::render() /*----------------------------------------------------------------------------*/ /** * \brief Add a speaker. * \param speaker The speaker. * \pre The speaker is unknown by this layer. */ void bear::engine::balloon_layer::add_speaker( speaker_item* speaker ) { #ifndef NDEBUG bool known = false; speaker_list::iterator it; for ( it=m_speakers.begin(); (it!=m_speakers.end()) && !known; ++it) if ( *it == speaker ) known = true; if (known) CLAW_FAIL("The item is already in the balloon layer."); #endif m_speakers.push_back( universe::item_handle_from(speaker) ); } // balloon_layer::add_speaker() /*----------------------------------------------------------------------------*/ /** * \brief Get the bounding box of a speaker of the screen. * \param speaker The speaker. */ bear::universe::rectangle_type bear::engine::balloon_layer::get_bounding_box_on_screen ( handle_type& speaker ) const { const universe::rectangle_type cam( get_level().get_camera_focus() ); const double x_ratio = get_size().x / cam.size().x; const double y_ratio = get_size().y / cam.size().y; const universe::coordinate_type left = x_ratio * (speaker.get_item()->get_left() - cam.left()); const universe::coordinate_type right = x_ratio * (speaker.get_item()->get_right() - cam.left()); const universe::coordinate_type top = y_ratio * (speaker.get_item()->get_top() - cam.bottom()); const universe::coordinate_type bottom = y_ratio * (speaker.get_item()->get_bottom() - cam.bottom()); return universe::rectangle_type( left, bottom, right, top ); } // balloon_layer::get_bounding_box_on_screen() plee-the-bear-20251226/bear-engine/core/src/engine/comic/loader/000077500000000000000000000000001512343254000240705ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/core/src/engine/comic/loader/code/000077500000000000000000000000001512343254000250025ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/core/src/engine/comic/loader/code/speaker_item_loader.cpp000066400000000000000000000043001512343254000315010ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::engine::speaker_item_loader class. * \author Julien Jorge. */ #include "engine/comic/loader/speaker_item_loader.hpp" #include "engine/comic/item/speaker_item.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param prefix The prefix of the fields that can be set through this loader. * \param item The item loaded by this loader. */ bear::engine::speaker_item_loader::speaker_item_loader ( std::string prefix, speaker_item& item ) : item_loader_base( prefix ), m_item(item) { } // speaker_item_loader::speaker_item_loader() /*----------------------------------------------------------------------------*/ /** * \brief Instanciate a copy of this object. */ bear::engine::speaker_item_loader* bear::engine::speaker_item_loader::clone() const { return new speaker_item_loader(*this); } // speaker_item_loader::clone() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type liste of strings. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::engine::speaker_item_loader::set_field ( const std::string& name, const std::vector& value ) { bool ok(true); if (name == "speeches") m_item.speak( value ); else ok = false; return ok; } // speaker_item_loader::set_field() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type \c bool. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::engine::speaker_item_loader::set_field ( const std::string& name, bool value ) { bool ok(true); if (name == "persistent_balloon") m_item.set_persistent_balloon( value ); else ok = false; return ok; } // speaker_item_loader::set_field() plee-the-bear-20251226/bear-engine/core/src/engine/comic/loader/speaker_item_loader.hpp000066400000000000000000000026611512343254000306040ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief The item loader for speaker_item. * \author Julien Jorge */ #ifndef __ENGINE_SPEAKER_ITEM_LOADER_HPP__ #define __ENGINE_SPEAKER_ITEM_LOADER_HPP__ #include #include "engine/class_export.hpp" #include "engine/loader/item_loader_base.hpp" namespace bear { namespace engine { class speaker_item; /** * \brief The item loader for the speaker_item. * * The valid fields for this item are * - \a speeches: \c The speeches, * - \a persistent_balloon: \c Tells that the balloon is visible even if * the item is off screen. * * \author Julien Jorge */ class ENGINE_EXPORT speaker_item_loader: public item_loader_base { public: speaker_item_loader( std::string prefix, speaker_item& item ); virtual speaker_item_loader* clone() const; virtual bool set_field ( const std::string& name, const std::vector& value ); virtual bool set_field( const std::string& name, bool value ); private: /** \brief The item loaded by this loader. */ speaker_item& m_item; }; // class speaker_item_loader } // namespace engine } // namespace bear #endif // __ENGINE_SPEAKER_ITEM_LOADER_HPP__ plee-the-bear-20251226/bear-engine/core/src/engine/comic/message/000077500000000000000000000000001512343254000242465ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/core/src/engine/comic/message/balloon_layer_add_message.hpp000066400000000000000000000023031512343254000321130ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A message that adds a speaker in a balloon layer. * \author Angibaud Sébastien */ #ifndef __BEAR_BALLOON_LAYER_ADD_MESSAGE_HPP__ #define __BEAR_BALLOON_LAYER_ADD_MESSAGE_HPP__ #include "communication/typed_message.hpp" #include "engine/class_export.hpp" #include "engine/comic/layer/balloon_layer.hpp" namespace bear { namespace engine { class balloon_layer; class speaker_item; /** * \brief A message that adds a speaker in a balloon layer. * \author Sébastien Angibaud */ class ENGINE_EXPORT balloon_layer_add_message: public communication::typed_message { public: balloon_layer_add_message(); void set_speaker( speaker_item* speaker ); bool apply_to( balloon_layer& that ); private: /** \brief Pointer to the speaker. */ speaker_item* m_speaker; }; // class balloon_layer_add_message } // namespace engine } // namespace bear #endif // __BEAR_BALLOON_LAYER_ADD_MESSAGE_HPP__ plee-the-bear-20251226/bear-engine/core/src/engine/comic/message/code/000077500000000000000000000000001512343254000251605ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/core/src/engine/comic/message/code/balloon_layer_add_message.cpp000066400000000000000000000026141512343254000330250ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::engine::balloon_layer_add_message class. * \author Sebastien Angibaud */ #include "engine/comic/message/balloon_layer_add_message.hpp" #include "engine/comic/layer/balloon_layer.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ bear::engine::balloon_layer_add_message::balloon_layer_add_message() : m_speaker(NULL) { } // balloon_layer_add_message::balloon_layer_add_message() /*----------------------------------------------------------------------------*/ /* * \brief Set the speaker. * \param speaker The speaker. */ void bear::engine::balloon_layer_add_message::set_speaker ( speaker_item* speaker) { m_speaker = speaker; } // balloon_layer_add_message::set_speaker() /*----------------------------------------------------------------------------*/ /** * \brief Apply the message to the balloon layer. * \param that The balloon layer to apply the message to. */ bool bear::engine::balloon_layer_add_message::apply_to( balloon_layer& that ) { if ( m_speaker == NULL ) return false; that.add_speaker(m_speaker); return true; } // balloon_layer_add_message::apply_to() plee-the-bear-20251226/bear-engine/core/src/engine/compiled_file.hpp000066400000000000000000000040431512343254000250350ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief This class masks the kind of input (text or binary) to the level * loader. * \author Julien Jorge */ #ifndef __ENGINE_COMPILED_FILE_HPP__ #define __ENGINE_COMPILED_FILE_HPP__ #include #include "engine/class_export.hpp" namespace bear { namespace engine { /** * \brief This class masks the kind of input (text or binary) to the level * loader. */ class ENGINE_EXPORT compiled_file { public: compiled_file( std::istream& f, bool text ); compiled_file& operator>>( std::string& s ); compiled_file& operator>>( unsigned long& i ); compiled_file& operator>>( long& i ); compiled_file& operator>>( unsigned int& i ); compiled_file& operator>>( int& i ); compiled_file& operator>>( double& i ); compiled_file& operator>>( bool& b ); operator bool() const; private: void input_string_as_binary( std::string& s ); void input_string_as_text( std::string& s ); void input_long_as_binary( long& i ); void input_long_as_text( long& i ); void input_unsigned_long_as_binary( unsigned long& i ); void input_unsigned_long_as_text( unsigned long& i ); void input_integer_as_binary( int& i ); void input_integer_as_text( int& i ); void input_unsigned_integer_as_binary( unsigned int& i ); void input_unsigned_integer_as_text( unsigned int& i ); void input_real_as_binary( double& r ); void input_real_as_text( double& r ); void input_bool_as_binary( bool& b ); void input_bool_as_text( bool& b ); private: /** \brief The file we are writing in. */ std::istream& m_file; /** \brief Are we in text mode ? */ bool m_text; }; // compiled_file } // namespace engine } // namespace bear #endif // __ENGINE_COMPILED_FILE_HPP__ plee-the-bear-20251226/bear-engine/core/src/engine/easing.hpp000066400000000000000000000012351512343254000235100ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief The types related to the easing functions. * \author Julien Jorge */ #ifndef __ENGINE_EASING_HPP__ #define __ENGINE_EASING_HPP__ #include namespace bear { namespace engine { /** \brief The type of the easing functions passed to the tweeners. */ typedef claw::tween::single_tweener::easing_function easing_function; } // namespace engine } // namespace bear #endif // __ENGINE_EASING_HPP__ plee-the-bear-20251226/bear-engine/core/src/engine/export.hpp000066400000000000000000000124211512343254000235620ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Macros and function useful for class exportation. * \author Julien Jorge */ #ifndef __ENGINE_EXPORT_HPP__ #define __ENGINE_EXPORT_HPP__ #ifndef DLL_EXPORT # ifdef _WIN32 # define DLL_EXPORT __declspec(dllexport) # else // def _WIN32 # define DLL_EXPORT # endif // def _WIN32 #endif // ndef EXPORT #include "engine/item_factory.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Prepare a class inheriting from engine::base_item. * * \param class_name The name of the class. * * Add this macro at the beginning of your class, like: * * namespace my_game * { * class my_class: public bear::engine::base_item * { * DECLARE_BASE_ITEM( my_class ); * * // some stuff... * * }; // class my_class * } // namespace my_game * * This macro adds the methods and members to get the class name of your class: * - const char* get_class_name() const; * - static const char* static_class_name(); * - static const char* s_my_class_class_name; * * Also, this macro redefines the virtual method * - base_item* clone() const * of base_item with * - my_class* clone() const */ #define DECLARE_BASE_ITEM( class_name ) \ public: \ class_name* clone() const { return new class_name(*this); } \ \ const char* get_class_name() const { return static_class_name(); } \ std::size_t size_of() const { return sizeof(class_name); } \ \ static const char* static_class_name() \ { \ return s_ ## class_name ## _class_name; \ } \ \ private: \ static const char* s_ ## class_name ## _class_name /*----------------------------------------------------------------------------*/ /** * \brief Implement common members of a class inheriting from engine::base_item. * * \param class_name The name of the class to instanciate. * \param env The full namespace of this class. * * Call this macro in the .cpp file, only if you don't call * BASE_ITEM_EXPORT. */ #define BASE_ITEM_IMPLEMENT( class_name, env ) \ const char* env::class_name::s_ ## class_name ## _class_name = \ #env "::" #class_name; /*----------------------------------------------------------------------------*/ /** * \brief Implement common members of a class inheriting from engine::base_item * and declared outside any namespace. * * \param class_name The name of the class to instanciate. * * Call this macro in the .cpp file, only if you don't call * BASE_ITEM_EXPORT_NO_NAMESPACE. * * \sa BASE_ITEM_IMPLEMENT */ #define BASE_ITEM_IMPLEMENT_NO_NAMESPACE( class_name ) \ const char* class_name::s_ ## class_name ## _class_name = #class_name; /*----------------------------------------------------------------------------*/ /** * \brief Register a base_item derived class in bear::engine::item_factory. * * \param class_name The name of the class to instanciate. * \param env The full namespace of this class. * * The env::class_name class must have a constructor without parameters. */ #define BASE_ITEM_EXPORT( class_name, env ) \ BASE_ITEM_IMPLEMENT( class_name, env ) \ \ static bool class_name ## _registered = \ bear::engine::item_factory::get_instance().register_type \ ( env::class_name::static_class_name() ); /*----------------------------------------------------------------------------*/ /** * \brief Export a function instanciating a class inheriting from * engine::base_item and declared outside any namespace. * * \param class_name The name of the class to instanciate. * * The class_name class must have a constructor without parameters. * * The signature of the function declared by this macro is * * engine::base_item* create_class_name() * * The name of the function can be obtained by a call to * engine::export_function_name( class_name ). */ #define BASE_ITEM_EXPORT_NO_NAMESPACE( class_name ) \ BASE_ITEM_IMPLEMENT_NO_NAMESPACE( class_name ) \ \ static bool class_name ## _registered = \ bear::engine::item_factory::get_instance().register_type \ ( #class_name ); #endif // __ENGINE_EXPORT_HPP__ plee-the-bear-20251226/bear-engine/core/src/engine/export_function.hpp000066400000000000000000000027251512343254000254750ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Macros and function useful for class exportation. * \author Julien Jorge */ #ifndef __ENGINE_EXPORT_FUNCTION_HPP__ #define __ENGINE_EXPORT_FUNCTION_HPP__ #include namespace bear { namespace engine { class base_item; class layer; /** * \brief Get the name of the exported function made for a class. * \param class_name The name of the class that has been exported. */ inline std::string export_function_name( const std::string& class_name ) { // prefix must be the string used for prefix in BASE_ITEM_EXPORT return "create_" + class_name; } // export_function_name() typedef base_item* (*base_export_function_type)(); /** * \brief Get the name of the exported function made for a class. * \param class_name The name of the class that has been exported. */ inline std::string layer_export_function_name( const std::string& class_name ) { // prefix must be the string used for prefix in LAYER_EXPORT return "create_layer_" + class_name; } // layer_export_function_name() typedef layer* (*layer_export_function_type)(const universe::size_box_type& s); } // namespace engine } // namespace bear #endif // __ENGINE_EXPORT_FUNCTION_HPP__ plee-the-bear-20251226/bear-engine/core/src/engine/expr/000077500000000000000000000000001512343254000225065ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/core/src/engine/expr/check_item_class.hpp000066400000000000000000000031511512343254000264770ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief An expression that checks if a colliding item is an instance of a * given class. * \author Julien Jorge */ #ifndef __ENGINE_CHECK_ITEM_CLASS_HPP__ #define __ENGINE_CHECK_ITEM_CLASS_HPP__ #include "expr/base_boolean_expression.hpp" #include "engine/expr/collision_in_expression.hpp" #include "engine/class_export.hpp" namespace bear { namespace engine { /** * \brief An expression that checks if a colliding item is an instance of a * given class. * * \remark This expression does not check the parent classes. * \sa check_item_class_hierarchy * \author Julien Jorge */ class ENGINE_EXPORT check_item_class: public expr::base_boolean_expression { public: void set_class_name( const std::string& class_name ); const std::string& get_class_name() const; void set_collision_data( const collision_in_expression& data ); const collision_in_expression& get_collision_data() const; expr::base_boolean_expression* clone() const; bool evaluate() const; std::string formatted_string() const; private: /** \brief The name of the class. */ std::string m_class_name; /** \brief The data on the colliding item. */ collision_in_expression m_collision; }; // class check_item_class } // namespace engine } // namespace bear #endif // __ENGINE_CHECK_ITEM_CLASS_HPP__ plee-the-bear-20251226/bear-engine/core/src/engine/expr/check_item_class_hierarchy.hpp000066400000000000000000000030741512343254000305410ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief An expression that checks if a colliding item inherit from a given * class. * \author Julien Jorge */ #ifndef __ENGINE_CHECK_ITEM_CLASS_HIERARCHY_HPP__ #define __ENGINE_CHECK_ITEM_CLASS_HIERARCHY_HPP__ #include "expr/base_boolean_expression.hpp" #include "engine/expr/collision_in_expression.hpp" #include "engine/class_export.hpp" namespace bear { namespace engine { /** * \brief An expression that checks if a colliding item inherit from a given * class. * * \b Template \b arguments * - \a T the type from which the colliding item must inherit. * * \sa check_item_class * \author Julien Jorge */ template class check_item_class_hierarchy: public expr::base_boolean_expression { public: void set_collision_data( const collision_in_expression& data ); const collision_in_expression& get_collision_data() const; expr::base_boolean_expression* clone() const; bool evaluate() const; std::string formatted_string() const; private: /** \brief The data on the colliding item. */ collision_in_expression m_collision; }; // class check_item_class_hierarchy } // namespace engine } // namespace bear #include "engine/expr/impl/check_item_class_hierarchy.tpp" #endif // __ENGINE_CHECK_ITEM_CLASS_HIERARCHY_HPP__ plee-the-bear-20251226/bear-engine/core/src/engine/expr/check_item_instance.hpp000066400000000000000000000031611512343254000271770ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief An expression that checks if a colliding item is a given item. * \author Julien Jorge */ #ifndef __ENGINE_CHECK_ITEM_INSTANCE_HPP__ #define __ENGINE_CHECK_ITEM_INSTANCE_HPP__ #include "expr/base_boolean_expression.hpp" #include "engine/expr/collision_in_expression.hpp" #include "universe/const_item_handle.hpp" #include "engine/class_export.hpp" namespace bear { namespace engine { /** * \brief An expression that checks if a colliding item is a given item. * \author Julien Jorge */ class ENGINE_EXPORT check_item_instance: public expr::base_boolean_expression { public: /** \brief The type of the handles on the item in the expression. */ typedef universe::const_item_handle handle_type; public: void set_instance( handle_type item ); handle_type get_instance() const; void set_collision_data( const collision_in_expression& data ); const collision_in_expression& get_collision_data() const; expr::base_boolean_expression* clone() const; bool evaluate() const; std::string formatted_string() const; private: /** \brief The instance to check. */ handle_type m_instance; /** \brief The data on the colliding item. */ collision_in_expression m_collision; }; // class check_item_instance } // namespace engine } // namespace bear #endif // __ENGINE_CHECK_ITEM_INSTANCE_HPP__ plee-the-bear-20251226/bear-engine/core/src/engine/expr/code/000077500000000000000000000000001512343254000234205ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/core/src/engine/expr/code/check_item_class.cpp000066400000000000000000000050421512343254000274050ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::engine::check_item_class class. * \author Julien Jorge. */ #include "engine/expr/check_item_class.hpp" #include "engine/base_item.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Set the name of the class. * \param class_name The name of the class. */ void bear::engine::check_item_class::set_class_name ( const std::string& class_name ) { m_class_name = class_name; } // check_item_class::set_class_name() /*----------------------------------------------------------------------------*/ /** * \brief Get the name of the class. */ const std::string& bear::engine::check_item_class::get_class_name() const { return m_class_name; } // check_item_class::get_class_name() /*----------------------------------------------------------------------------*/ /** * \brief Set the data on the colliding item. * \param data The data on the colliding item. */ void bear::engine::check_item_class::set_collision_data ( const collision_in_expression& data ) { m_collision = data; } // check_item_class::set_collision_data() /*----------------------------------------------------------------------------*/ /** * \brief Get the data on the colliding item. */ const bear::engine::collision_in_expression& bear::engine::check_item_class::get_collision_data() const { return m_collision; } // check_item_class::get_collision_data() /*----------------------------------------------------------------------------*/ /** * \brief Create a copy of this expression. */ bear::expr::base_boolean_expression* bear::engine::check_item_class::clone() const { return new check_item_class(*this); } // check_item_class::clone() /*----------------------------------------------------------------------------*/ /** * \brief Evaluate the expression. */ bool bear::engine::check_item_class::evaluate() const { if ( m_collision == NULL ) return false; else return m_collision->get_class_name() == m_class_name; } // check_item_class::evaluate() /*----------------------------------------------------------------------------*/ /** * \brief Gets a formatted and human readable representation of this expression. */ std::string bear::engine::check_item_class::formatted_string() const { return "check_item_class( " + m_class_name + " )"; } // check_item_class::formatted_string() plee-the-bear-20251226/bear-engine/core/src/engine/expr/code/check_item_instance.cpp000066400000000000000000000053111512343254000301030ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::engine::check_item_instance class. * \author Julien Jorge. */ #include "engine/expr/check_item_instance.hpp" #include "engine/base_item.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Set the instance that validates the expression. * \param item The instance. */ void bear::engine::check_item_instance::set_instance( handle_type item ) { m_instance = item; } // check_item_instance::set_instance() /*----------------------------------------------------------------------------*/ /** * \brief Get the instance that validates the expression. */ bear::engine::check_item_instance::handle_type bear::engine::check_item_instance::get_instance() const { return m_instance; } // check_item_instance::get_instance() /*----------------------------------------------------------------------------*/ /** * \brief Set the data on the colliding item. * \param data The data on the colliding item. */ void bear::engine::check_item_instance::set_collision_data ( const collision_in_expression& data ) { m_collision = data; } // check_item_instance::set_collision_data() /*----------------------------------------------------------------------------*/ /** * \brief Get the data on the colliding item. */ const bear::engine::collision_in_expression& bear::engine::check_item_instance::get_collision_data() const { return m_collision; } // check_item_instance::get_collision_data() /*----------------------------------------------------------------------------*/ /** * \brief Create a copy of this expression. */ bear::expr::base_boolean_expression* bear::engine::check_item_instance::clone() const { return new check_item_instance(*this); } // check_item_instance::clone() /*----------------------------------------------------------------------------*/ /** * \brief Evaluate the expression. */ bool bear::engine::check_item_instance::evaluate() const { if ( (m_collision == NULL) || (m_instance == NULL) ) return false; else return m_collision.get_item_ptr() == m_instance.get(); } // check_item_instance::evaluate() /*----------------------------------------------------------------------------*/ /** * \brief Gets a formatted and human readable representation of this expression. */ std::string bear::engine::check_item_instance::formatted_string() const { std::ostringstream result; result << "check_item_instance( " << m_instance.get() << " )"; return result.str(); } // check_item_instance::formatted_string() plee-the-bear-20251226/bear-engine/core/src/engine/expr/code/collision_in_expression.cpp000066400000000000000000000061301512343254000310640ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::engine::collision_in_expression class. * \author Julien Jorge */ #include "engine/expr/collision_in_expression.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ bear::engine::collision_in_expression::collision_in_expression() : m_colliding_item(NULL), m_collision_info(NULL) { } // collision_in_expression::collision_in_expression() /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param item A pointer on the pointer that will be updated with the colliding * item. * \param info A pointer on the pointer that will be updated with the collision * info. */ bear::engine::collision_in_expression::collision_in_expression ( const_item_pointer const* item, const_collision_info_pointer const* info ) : m_colliding_item(item), m_collision_info(info) { } // collision_in_expression::collision_in_expression() /*----------------------------------------------------------------------------*/ /** * \brief Tell if there is a collision data in this instance. */ bool bear::engine::collision_in_expression::is_valid() const { return (m_colliding_item != NULL ) && (m_collision_info != NULL); } // collision_in_expression::is_valid() /*----------------------------------------------------------------------------*/ /** * \brief Get a pointer on the colliding item. */ const bear::engine::base_item* bear::engine::collision_in_expression::get_item_ptr() const { return *m_colliding_item; } // collision_in_expression::get_item_ptr() /*----------------------------------------------------------------------------*/ /** * \brief Member by pointer. Returns a pointer on the colliding item. */ const bear::engine::base_item* bear::engine::collision_in_expression::operator->() const { return get_item_ptr(); } // collision_in_expression::operator->() /*----------------------------------------------------------------------------*/ /** * \brief Indirection. Returns the colliding item. */ const bear::engine::base_item& bear::engine::collision_in_expression::operator*() const { return **m_colliding_item; } // collision_in_expression::operator*() /*----------------------------------------------------------------------------*/ /** * \brief Equality. Compares the data in collision. * \param that The pointer to compare to. */ bool bear::engine::collision_in_expression::operator==( base_item const* that ) const { return *m_colliding_item == that; } // collision_in_expression::operator==() /*----------------------------------------------------------------------------*/ /** * \brief Disquality. Compares the data in collision. * \param that The pointer to compare to. */ bool bear::engine::collision_in_expression::operator!=( base_item const* that ) const { return !operator==(that); } // collision_in_expression::operator!=() plee-the-bear-20251226/bear-engine/core/src/engine/expr/code/count_items_by_class_name.cpp000066400000000000000000000054601512343254000313410ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::engine::count_items_by_class_name class. * \author Julien Jorge. */ #include "engine/expr/count_items_by_class_name.hpp" #include "engine/world.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ bear::engine::count_items_by_class_name::count_items_by_class_name() { // nothing to do } // count_items_by_class_name::count_items_by_class_name() /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param w An item in the world in which the items are searched. * \param c The name of the class of the counted items. */ bear::engine::count_items_by_class_name::count_items_by_class_name ( const base_item& w, const std::string& c ) : m_world_proxy(w), m_class_name(c) { } // count_items_by_class_name::count_items_by_class_name() /*----------------------------------------------------------------------------*/ /** * \brief Set the item through which we get the world in which the items are * searched. * \param w The item. */ void bear::engine::count_items_by_class_name::set_world_through ( const base_item& w ) { m_world_proxy = &w; } // count_items_by_class_name::set_world() /*----------------------------------------------------------------------------*/ /** * \brief Set the name of the class of the counted items. * \param c The name of the class. */ void bear::engine::count_items_by_class_name::set_class_name( const std::string& c ) { m_class_name = c; } // count_items_by_class_name::set_class_name() /*----------------------------------------------------------------------------*/ /** * \brief Create a copy of this expression. */ bear::expr::base_linear_expression* bear::engine::count_items_by_class_name::clone() const { return new count_items_by_class_name(*this); } // count_items_by_class_name::clone() /*----------------------------------------------------------------------------*/ /** * \brief Evaluate the expression. */ double bear::engine::count_items_by_class_name::evaluate() const { std::size_t result(0); if ( m_world_proxy == (base_item*)NULL ) { claw::logger << claw::log_warning << "count_items_by_class_name: the item is NULL, the " "evaluation is zero." << std::endl; return result; } world::const_item_iterator it; const world& w( m_world_proxy->get_world() ); for ( it=w.living_items_begin(); it!=w.living_items_end(); ++it ) if ( it->get_class_name() == m_class_name ) ++result; return result; } // count_items_by_class_name::evaluate() plee-the-bear-20251226/bear-engine/core/src/engine/expr/code/get_toggle_status.cpp000066400000000000000000000056161512343254000276570ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::engine::get_toggle_status class. * \author Julien Jorge. */ #include "engine/expr/get_toggle_status.hpp" #include "engine/base_item.hpp" #include "engine/item_brick/with_toggle.hpp" #include #include #include /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ bear::engine::get_toggle_status::get_toggle_status() { // nothing to do } // get_toggle_status::get_toggle_status() /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param item The toggle from which we take the status. */ bear::engine::get_toggle_status::get_toggle_status( const base_item& item ) : m_toggle(&item) { } // get_toggle_status::get_toggle_status() /*----------------------------------------------------------------------------*/ /** * \brief Set the toggle from which we take the status. * \param item The toggle. */ void bear::engine::get_toggle_status::set_toggle( const base_item& item ) { m_toggle = &item; } // get_toggle_status::set_toggle() /*----------------------------------------------------------------------------*/ /** * \brief Get the toggle from which we take the status. */ const bear::engine::base_item* bear::engine::get_toggle_status::get_toggle() const { return m_toggle.get_item(); } // get_toggle_status::get_toggle() /*----------------------------------------------------------------------------*/ /** * \brief Create a copy of this expression. */ bear::expr::base_boolean_expression* bear::engine::get_toggle_status::clone() const { return new get_toggle_status(*this); } // get_toggle_status::clone() /*----------------------------------------------------------------------------*/ /** * \brief Evaluate the expression. */ bool bear::engine::get_toggle_status::evaluate() const { if ( m_toggle == (with_toggle*)NULL ) { claw::logger << claw::log_warning << "get_toggle_status: the toggle is NULL, the evaluation" " is 'false'." << std::endl; return false; } else return m_toggle->is_on(); } // get_toggle_status::evaluate() /*----------------------------------------------------------------------------*/ /** * \brief Gets a formatted and human readable representation of this expression. */ std::string bear::engine::get_toggle_status::formatted_string() const { std::ostringstream result; result << "get_toggle_status( "; if ( m_toggle == (with_toggle*)NULL ) result << "null"; else result << typeid(*m_toggle).name(); result << " [= " << evaluate() << "] )"; return result.str(); } // get_toggle_status::formatted_string() plee-the-bear-20251226/bear-engine/core/src/engine/expr/collision_in_expression.hpp000066400000000000000000000040361512343254000301620ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A class that stores some informations on a collision to be used in an * expression. * \author Julien Jorge */ #ifndef __ENGINE_COLLISION_IN_EXPRESSION_HPP__ #define __ENGINE_COLLISION_IN_EXPRESSION_HPP__ #include "universe/collision_info.hpp" #include "engine/class_export.hpp" namespace bear { namespace engine { class base_item; /** * \brief A class that stores some informations on a collision to be used in * an expression. * * The class stores pointers on the data stored by engine::with_trigger. So, * this latter class can change its data and the values are automatically * changed in collision_in_expression. * * Moreover, this class can be used as a kind of pointer on the colliding * base_item, thanks to operator overloading. * * \author Julien Jorge */ class ENGINE_EXPORT collision_in_expression { public: typedef base_item const* const_item_pointer; typedef universe::collision_info const* const_collision_info_pointer; public: collision_in_expression(); collision_in_expression ( const_item_pointer const* item, const_collision_info_pointer const* info ); bool is_valid() const; const base_item* get_item_ptr() const; const base_item* operator->() const; const base_item& operator*() const; bool operator==( base_item const* that ) const; bool operator!=( base_item const* that ) const; private: /** \brief The item in collision. */ const_item_pointer const* m_colliding_item; /** \brief The informations about the collision. */ const_collision_info_pointer const* m_collision_info; }; // class collision_in_expression } // namespace engine } // namespace bear #endif // __ENGINE_COLLISION_IN_EXPRESSION_HPP__ plee-the-bear-20251226/bear-engine/core/src/engine/expr/count_items_by_class_name.hpp000066400000000000000000000034111512343254000304260ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief An expression that returns the status of a toggle. * \author Julien Jorge */ #ifndef __ENGINE_COUNT_ITEMS_BY_CLASS_NAME_HPP__ #define __ENGINE_COUNT_ITEMS_BY_CLASS_NAME_HPP__ #include "engine/base_item.hpp" #include "expr/base_linear_expression.hpp" #include "universe/derived_item_handle.hpp" #include "engine/class_export.hpp" #include namespace bear { namespace engine { /** * \brief An expression that returns the number of items of a given class in * the world. * * \remark This expression does not check the parent classes. * \author Julien Jorge */ class ENGINE_EXPORT count_items_by_class_name: public expr::base_linear_expression { private: /** \brief The type of the handle on an item that will give us the world. */ typedef universe::const_derived_item_handle item_handle; public: count_items_by_class_name(); count_items_by_class_name( const base_item& w, const std::string& c ); void set_world_through( const base_item& w ); void set_class_name( const std::string& n ); expr::base_linear_expression* clone() const; double evaluate() const; private: /** \brief An item in the world in which the items are searched. */ item_handle m_world_proxy; /** \brief The name of the class of the items to count. */ std::string m_class_name; }; // class count_items_by_class_name } // namespace engine } // namespace bear #endif // __ENGINE_COUNT_ITEMS_BY_CLASS_NAME_HPP__ plee-the-bear-20251226/bear-engine/core/src/engine/expr/get_toggle_status.hpp000066400000000000000000000027641512343254000267530ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief An expression that returns the status of a toggle. * \author Julien Jorge */ #ifndef __ENGINE_GET_TOGGLE_STATUS_HPP__ #define __ENGINE_GET_TOGGLE_STATUS_HPP__ #include "expr/base_boolean_expression.hpp" #include "universe/derived_item_handle.hpp" #include "engine/class_export.hpp" namespace bear { namespace engine { class base_item; class with_toggle; /** * \brief An expression that returns the status of a toggle. * * \author Julien Jorge */ class ENGINE_EXPORT get_toggle_status: public expr::base_boolean_expression { private: /** \brief The type of the handles on the toggles. */ typedef universe::const_derived_item_handle toggle_handle; public: get_toggle_status(); explicit get_toggle_status( const base_item& item ); void set_toggle( const base_item& item ); const base_item* get_toggle() const; expr::base_boolean_expression* clone() const; bool evaluate() const; std::string formatted_string() const; private: /** \brief The toggle to check. */ toggle_handle m_toggle; }; // class get_toggle_status } // namespace engine } // namespace bear #endif // __ENGINE_GET_TOGGLE_STATUS_HPP__ plee-the-bear-20251226/bear-engine/core/src/engine/expr/impl/000077500000000000000000000000001512343254000234475ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/core/src/engine/expr/impl/check_item_class_hierarchy.tpp000066400000000000000000000042371512343254000315200ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::engine::check_item_class_hierarchy class. * \author Julien Jorge. */ #include "engine/base_item.hpp" #include /*----------------------------------------------------------------------------*/ /** * \brief Set the data on the colliding item. * \param data The data on the colliding item. */ template void bear::engine::check_item_class_hierarchy::set_collision_data ( const collision_in_expression& data ) { m_collision = data; } // check_item_class_hierarchy::set_collision_data() /*----------------------------------------------------------------------------*/ /** * \brief Get the data on the colliding item. */ template const bear::engine::collision_in_expression& bear::engine::check_item_class_hierarchy::get_collision_data() const { return m_collision; } // check_item_class_hierarchy::get_collision_data() /*----------------------------------------------------------------------------*/ /** * \brief Create a copy of this expression. */ template bear::expr::base_boolean_expression* bear::engine::check_item_class_hierarchy::clone() const { return new check_item_class_hierarchy(*this); } // check_item_class_hierarchy::clone() /*----------------------------------------------------------------------------*/ /** * \brief Evaluate the expression. */ template bool bear::engine::check_item_class_hierarchy::evaluate() const { return dynamic_cast(m_collision.get_item_ptr()) != NULL; } // check_item_class_hierarchy::evaluate() /*----------------------------------------------------------------------------*/ /** * \brief Gets a formatted and human readable representation of this expression. */ template std::string bear::engine::check_item_class_hierarchy::formatted_string() const { return std::string( "check_item_class_hierarchy( " ) + typeid(T).name() + " )"; } // check_item_class_hierarchy::formatted_string() plee-the-bear-20251226/bear-engine/core/src/engine/forced_movement/000077500000000000000000000000001512343254000247045ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/core/src/engine/forced_movement/code/000077500000000000000000000000001512343254000256165ustar00rootroot00000000000000toggle_in_forced_movement.cpp000066400000000000000000000064601512343254000334540ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/core/src/engine/forced_movement/code/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::engine::toggle_in_forced_movement class. * \author Julien Jorge */ #include "engine/forced_movement/toggle_in_forced_movement.hpp" #include "universe/physical_item.hpp" #include "engine/item_brick/with_toggle.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ bear::engine::toggle_in_forced_movement::toggle_in_forced_movement() : m_use_toggle_delay(false), m_elapsed_time(0) { } // toggle_in_forced_movement::toggle_in_forced_movement() /*----------------------------------------------------------------------------*/ /** * \brief Instanciate a copy of this movement. */ bear::universe::base_forced_movement* bear::engine::toggle_in_forced_movement::clone() const { return new toggle_in_forced_movement(*this); } // toggle_in_forced_movement::clone() /*----------------------------------------------------------------------------*/ /** * \brief Tell if the movement is finished. */ bool bear::engine::toggle_in_forced_movement::is_finished() const { return !m_use_toggle_delay || (get_toggle() == NULL) || !get_toggle()->is_on(); } // toggle_in_forced_movement::is_finished() /*----------------------------------------------------------------------------*/ /** * \brief Tell if the duration of the forced movement in the duration of * the toggle. * \param b True if the movement use the delay of the toggle. */ void bear::engine::toggle_in_forced_movement::use_toggle_delay( bool b ) { m_use_toggle_delay = b; } // toggle_in_forced_movement::use_toggle_delay() /*----------------------------------------------------------------------------*/ /** * \brief Initialize the movement. */ void bear::engine::toggle_in_forced_movement::do_init() { m_elapsed_time = 0; with_toggle* const t = get_toggle(); if ( t != NULL ) t->toggle_on( NULL ); } // toggle_in_forced_movement::do_init() /*----------------------------------------------------------------------------*/ /** * \brief Do an iteration of the movement. * \param elapsed_time Elapsed time since the last call. * \return The remaining time if the movement is finished. */ bear::universe::time_type bear::engine::toggle_in_forced_movement::do_next_position ( universe::time_type elapsed_time ) { if ( !m_use_toggle_delay ) return elapsed_time; universe::time_type remaining_time = 0; with_toggle* const t = get_toggle(); if ( t == NULL ) remaining_time = elapsed_time; else if ( t->get_delay() >= elapsed_time ) remaining_time = 0; else remaining_time = m_elapsed_time + elapsed_time - t->get_delay(); m_elapsed_time += elapsed_time - remaining_time; return remaining_time; } // toggle_in_forced_movement::do_next_position() /*----------------------------------------------------------------------------*/ /** * \brief Get the toggle observed by this movement. */ bear::engine::with_toggle* bear::engine::toggle_in_forced_movement::get_toggle() const { if ( !has_reference_item() ) return NULL; return dynamic_cast( &get_reference_item() ); } // toggle_in_forced_movement::get_toggle() plee-the-bear-20251226/bear-engine/core/src/engine/forced_movement/toggle_in_forced_movement.hpp000066400000000000000000000031031512343254000326150ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief The toggle_in_forced_movement class is used to insert a toggle in a * forced movement. * \author Julien Jorge */ #ifndef __ENGINE_TOGGLE_IN_FORCED_MOVEMENT_HPP__ #define __ENGINE_TOGGLE_IN_FORCED_MOVEMENT_HPP__ #include "universe/forced_movement/base_forced_movement.hpp" #include "engine/class_export.hpp" namespace bear { namespace engine { class with_toggle; /** * \brief The toggle_in_forced_movement class is used to insert a toggle in * a forced movement. * \author Julien Jorge */ class ENGINE_EXPORT toggle_in_forced_movement: public universe::base_forced_movement { public: toggle_in_forced_movement(); universe::base_forced_movement* clone() const; void use_toggle_delay( bool b ); bool is_finished() const; private: void do_init(); universe::time_type do_next_position( universe::time_type elapsed_time ); with_toggle* get_toggle() const; private: /** \brief Tell if the duration of the forced movement in the duration of the toggle. */ bool m_use_toggle_delay; /** \brief The elapsed time since the creation of the movement. */ universe::time_type m_elapsed_time; }; // class toggle_in_forced_movement } // namespace engine } // namespace bear #endif // __ENGINE_TOGGLE_IN_FORCED_MOVEMENT_HPP__ plee-the-bear-20251226/bear-engine/core/src/engine/function/000077500000000000000000000000001512343254000233555ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/core/src/engine/function/bool_game_variable_getter.hpp000066400000000000000000000030061512343254000312300ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A boolean expression that returns the value of a game variable. * \author Sébastien Angibaud */ #ifndef __BEAR_BOOL_GAME_VARIABLE_GETTER_HPP__ #define __BEAR_BOOL_GAME_VARIABLE_GETTER_HPP__ #include "engine/function/game_variable_getter.hpp" #include "expr/boolean_function.hpp" #include "expr/base_boolean_expression.hpp" #include "engine/class_export.hpp" namespace bear { namespace engine { /** * \brief A boolean expression that returns the value of a game variable. * * The valid fields for this item are * - name The name of the variable to get, * - default_value The default value of the variable, if not set, * - any field supported by the parent classes. * * \author Julien Jorge */ class ENGINE_EXPORT bool_game_variable_getter: public expr::base_boolean_expression, public game_variable_getter { public: /** \brief The type of the parent class. */ typedef expr::base_boolean_expression super; public: bool_game_variable_getter(); bool_game_variable_getter* clone() const; bool evaluate() const; std::string formatted_string() const; }; // class bool_game_variable_getter } // namespace engine } // namespace bear #endif // __BEAR_BOOL_GAME_VARIABLE_GETTER_HPP__ plee-the-bear-20251226/bear-engine/core/src/engine/function/bool_level_variable_getter.hpp000066400000000000000000000031571512343254000314350ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A boolean expression that returns the value of a level variable. * \author Sébastien Angibaud */ #ifndef __BEAR_BOOL_LEVEL_VARIABLE_GETTER_HPP__ #define __BEAR_BOOL_LEVEL_VARIABLE_GETTER_HPP__ #include "engine/function/level_variable_getter.hpp" #include "expr/boolean_function.hpp" #include "expr/base_boolean_expression.hpp" #include "engine/class_export.hpp" namespace bear { namespace engine { /** * \brief A boolean expression that returns the value of a level variable. * * The valid fields for this item are * - name The name of the variable to get, * - default_value The default value of the variable, if not set, * - any field supported by the parent classes. * * \author Sébastien Angibaud */ class ENGINE_EXPORT bool_level_variable_getter: public expr::base_boolean_expression, public level_variable_getter { public: /** \brief The type of the parent class. */ typedef expr::base_boolean_expression super; public: bool_level_variable_getter(); bool_level_variable_getter (const level* lvl, const std::string& var_name); bool_level_variable_getter* clone() const; bool evaluate() const; std::string formatted_string() const; }; // class bool_level_variable_getter } // namespace engine } // namespace bear #endif // __BEAR_BOOL_LEVEL_VARIABLE_GETTER_HPP__ plee-the-bear-20251226/bear-engine/core/src/engine/function/code/000077500000000000000000000000001512343254000242675ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/core/src/engine/function/code/bool_game_variable_getter.cpp000066400000000000000000000032171512343254000321410ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::bool_game_variable_getter class. * \author Sébastien Angibaud */ #include "engine/function/bool_game_variable_getter.hpp" #include /*----------------------------------------------------------------------------*/ /** * \brief Contructor. */ bear::engine::bool_game_variable_getter::bool_game_variable_getter() { set_default_value(false); } // bool_game_variable_getter::bool_game_variable_getter() /*----------------------------------------------------------------------------*/ /** * \brief Create a copy of this expression. */ bear::engine::bool_game_variable_getter* bear::engine::bool_game_variable_getter::clone() const { return new bool_game_variable_getter(*this); } // bool_game_variable_getter::clone() /*----------------------------------------------------------------------------*/ /** * \brief Evaluate the expression. */ bool bear::engine::bool_game_variable_getter::evaluate() const { return (*this)(); } // bool_game_variable_getter::evaluate() /*----------------------------------------------------------------------------*/ /** * \brief Gets a formatted and human readable representation of this expression. */ std::string bear::engine::bool_game_variable_getter::formatted_string() const { std::ostringstream result; result << "gamevar( " << get_name() << " [=" << evaluate() << "] )"; return result.str(); } // bool_game_variable_getter::formatted_string() plee-the-bear-20251226/bear-engine/core/src/engine/function/code/bool_level_variable_getter.cpp000066400000000000000000000037651512343254000323470ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::bool_level_variable_getter class. * \author Sébastien Angibaud */ #include "engine/function/bool_level_variable_getter.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Contructor. */ bear::engine::bool_level_variable_getter::bool_level_variable_getter() { set_default_value(false); } // bool_level_variable_getter::bool_level_variable_getter() /*----------------------------------------------------------------------------*/ /** * \brief Contructor. */ bear::engine::bool_level_variable_getter::bool_level_variable_getter ( const level* lvl, const std::string& var_name ) { set_level(lvl); set_name(var_name); set_default_value(false); } // bool_level_variable_getter::bool_level_variable_getter() /*----------------------------------------------------------------------------*/ /** * \brief Create a copy of this expression. */ bear::engine::bool_level_variable_getter* bear::engine::bool_level_variable_getter::clone() const { return new bool_level_variable_getter(*this); } // bool_level_variable_getter::clone() /*----------------------------------------------------------------------------*/ /** * \brief Evaluate the expression. */ bool bear::engine::bool_level_variable_getter::evaluate() const { return (*this)(); } // bool_level_variable_getter::evaluate() /*----------------------------------------------------------------------------*/ /** * \brief Gets a formatted and human readable representation of this expression. */ std::string bear::engine::bool_level_variable_getter::formatted_string() const { std::ostringstream result; result << "levelvar( " << get_name() << " [=" << evaluate() << "] )"; return result.str(); } // bool_level_variable_getter::formatted_string() plee-the-bear-20251226/bear-engine/core/src/engine/function/game_variable_getter.hpp000066400000000000000000000025211512343254000302160ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A function object to get the value of a game variable. * \author Julien Jorge */ #ifndef __BEAR_ENGINE_GAME_VARIABLE_GETTER_HPP__ #define __BEAR_ENGINE_GAME_VARIABLE_GETTER_HPP__ #include namespace bear { namespace engine { /** * \brief A function object to get the value of a game variable. * \author Julien Jorge */ template class game_variable_getter { public: game_variable_getter(); game_variable_getter(const game_variable_getter& that); explicit game_variable_getter ( const std::string& var_name, const T& default_value = T() ); void set_name( const std::string& n ); const std::string& get_name() const; void set_default_value( const T& v ); T operator()() const; private: /** \brief The name of the variable. */ std::string m_name; /** \brief The default value. */ T m_default_value; }; // class game_variable_getter } // namespace engine } // namespace bear #include "engine/function/impl/game_variable_getter.tpp" #endif // __BEAR_ENGINE_GAME_VARIABLE_GETTER_HPP__ plee-the-bear-20251226/bear-engine/core/src/engine/function/impl/000077500000000000000000000000001512343254000243165ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/core/src/engine/function/impl/game_variable_getter.tpp000066400000000000000000000054601512343254000312000ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::engine::game_variable_getter class. * \author Julien Jorge */ #include "engine/game.hpp" #include "engine/variable/variable.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ template bear::engine::game_variable_getter::game_variable_getter() { } // game_variable_getter::game_variable_getter() /*----------------------------------------------------------------------------*/ /** * \brief Copy constructor. */ template bear::engine::game_variable_getter::game_variable_getter (const game_variable_getter& that) : m_name(that.m_name), m_default_value(that.m_default_value) { } // game_variable_getter::game_variable_getter() /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param var_name The name of the game variable. * \param default_value The default value returned if the variable is not set. */ template bear::engine::game_variable_getter::game_variable_getter ( const std::string& var_name, const T& default_value ) : m_name(var_name), m_default_value(default_value) { } // game_variable_getter::game_variable_getter() /*----------------------------------------------------------------------------*/ /** * \brief Set the name of the variable. * \param n The name of the variable. */ template void bear::engine::game_variable_getter::set_name( const std::string& n ) { m_name = n; } // game_variable_getter::set_name() /*----------------------------------------------------------------------------*/ /** * \brief Get the name of the variable. */ template const std::string& bear::engine::game_variable_getter::get_name() const { return m_name; } // game_variable_getter::get_name() /*----------------------------------------------------------------------------*/ /** * \brief Set the default value, returned if the variable is not set. * \param v The default value. */ template void bear::engine::game_variable_getter::set_default_value( const T& v ) { m_default_value = v; } // game_variable_getter::set_default_value() /*----------------------------------------------------------------------------*/ /** * \brief Get the value of the game variable. */ template T bear::engine::game_variable_getter::operator()() const { variable v(m_name, m_default_value); if ( game::get_instance().game_variable_exists(v) ) game::get_instance().get_game_variable(v); return v.get_value(); } // game_variable_getter::operator()() plee-the-bear-20251226/bear-engine/core/src/engine/function/impl/level_variable_getter.tpp000066400000000000000000000065741512343254000314050ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::engine::level_variable_getter class. * \author Julien Jorge */ #include "engine/level.hpp" #include "engine/variable/variable.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ template bear::engine::level_variable_getter::level_variable_getter() : m_level(NULL) { } // level_variable_getter::level_variable_getter() /*----------------------------------------------------------------------------*/ /** * \brief Copy constructor. */ template bear::engine::level_variable_getter::level_variable_getter (const level_variable_getter& that) : m_level(that.m_level), m_name(that.m_name), m_default_value(that.m_default_value) { } // level_variable_getter::level_variable_getter() /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param lvl The level where we search for the variable. * \param var_name The name of the level variable. * \param default_value The default value returned if the variable is not set. */ template bear::engine::level_variable_getter::level_variable_getter ( const level* lvl, const std::string& var_name, const T& default_value ) : m_level(lvl), m_name(var_name), m_default_value(default_value) { } // level_variable_getter::level_variable_getter() /*----------------------------------------------------------------------------*/ /** * \brief Set the level where we search for the variable. * \param lvl The level where we search for the variable. */ template void bear::engine::level_variable_getter::set_level( const level* lvl ) { m_level = lvl; } // level_variable_getter::set_level() /*----------------------------------------------------------------------------*/ /** * \brief Set the name of the variable. * \param n The name of the variable. */ template void bear::engine::level_variable_getter::set_name( const std::string& n ) { m_name = n; } // level_variable_getter::set_name() /*----------------------------------------------------------------------------*/ /** * \brief Get the name of the variable. */ template const std::string& bear::engine::level_variable_getter::get_name() const { return m_name; } // level_variable_getter::get_name() /*----------------------------------------------------------------------------*/ /** * \brief Set the default value, returned if the variable is not set. * \param v The default value. */ template void bear::engine::level_variable_getter::set_default_value( const T& v ) { m_default_value = v; } // level_variable_getter::set_default_value() /*----------------------------------------------------------------------------*/ /** * \brief Get the value of the level variable. */ template T bear::engine::level_variable_getter::operator()() const { if ( m_level == NULL ) return m_default_value; else { variable v(m_name, m_default_value); if ( m_level->level_variable_exists(v) ) m_level->get_level_variable(v); return v.get_value(); } } // level_variable_getter::operator()() plee-the-bear-20251226/bear-engine/core/src/engine/function/impl/linear_game_variable_getter.tpp000066400000000000000000000023641512343254000325320ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::linear_game_variable_getter class. * \author Julien Jorge */ /*----------------------------------------------------------------------------*/ /** * \brief Contructor. */ template bear::engine::linear_game_variable_getter::linear_game_variable_getter() { this->set_default_value(0); } // linear_game_variable_getter::linear_game_variable_getter() /*----------------------------------------------------------------------------*/ /** * \brief Create a copy of this expression. */ template bear::engine::linear_game_variable_getter* bear::engine::linear_game_variable_getter::clone() const { return new linear_game_variable_getter(*this); } // linear_game_variable_getter::clone() /*----------------------------------------------------------------------------*/ /** * \brief Evaluate the expression. */ template double bear::engine::linear_game_variable_getter::evaluate() const { return (double)(*this)(); } // linear_game_variable_getter::evaluate() plee-the-bear-20251226/bear-engine/core/src/engine/function/impl/linear_level_variable_getter.tpp000066400000000000000000000032341512343254000327250ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::linear_level_variable_getter class. * \author Julien Jorge */ /*----------------------------------------------------------------------------*/ /** * \brief Contructor. */ template bear::engine::linear_level_variable_getter::linear_level_variable_getter() { this->set_default_value(0); } // linear_level_variable_getter::linear_level_variable_getter() /*----------------------------------------------------------------------------*/ /** * \brief Contructor. */ template bear::engine::linear_level_variable_getter::linear_level_variable_getter ( const level* lvl, const std::string& var_name ) { this->set_level(lvl); this->set_name(var_name); this->set_default_value(false); } // linear_level_variable_getter::linear_level_variable_getter() /*----------------------------------------------------------------------------*/ /** * \brief Create a copy of this expression. */ template bear::engine::linear_level_variable_getter* bear::engine::linear_level_variable_getter::clone() const { return new linear_level_variable_getter(*this); } // linear_level_variable_getter::clone() /*----------------------------------------------------------------------------*/ /** * \brief Evaluate the expression. */ template double bear::engine::linear_level_variable_getter::evaluate() const { return (double)(*this)(); } // linear_level_variable_getter::evaluate() plee-the-bear-20251226/bear-engine/core/src/engine/function/level_variable_getter.hpp000066400000000000000000000030071512343254000304140ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A function object to get the value of a level variable. * \author Julien Jorge */ #ifndef __BEAR_ENGINE_LEVEL_VARIABLE_GETTER_HPP__ #define __BEAR_ENGINE_LEVEL_VARIABLE_GETTER_HPP__ #include namespace bear { namespace engine { class level; /** * \brief A function object to get the value of a level variable. * \author Julien Jorge */ template class level_variable_getter { public: level_variable_getter(); level_variable_getter(const level_variable_getter& that); level_variable_getter ( const level* lvl, const std::string& var_name, const T& default_value = T() ); void set_level( const level* lvl ); void set_name( const std::string& n ); const std::string& get_name() const; void set_default_value( const T& v ); T operator()() const; private: /** \brief The level from which we take the variable. */ const level* m_level; /** \brief The name of the variable. */ std::string m_name; /** \brief The default value. */ T m_default_value; }; // class level_variable_getter } // namespace engine } // namespace bear #include "engine/function/impl/level_variable_getter.tpp" #endif // __BEAR_ENGINE_LEVEL_VARIABLE_GETTER_HPP__ plee-the-bear-20251226/bear-engine/core/src/engine/function/linear_game_variable_getter.hpp000066400000000000000000000030051512343254000315460ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A linear expression that returns the value of a game variable. * \author Julien Jorge */ #ifndef __BEAR_LINEAR_GAME_VARIABLE_GETTER_HPP__ #define __BEAR_LINEAR_GAME_VARIABLE_GETTER_HPP__ #include "engine/function/game_variable_getter.hpp" #include "expr/linear_function.hpp" #include "expr/base_linear_expression.hpp" namespace bear { namespace engine { /** * \brief A linear expression that returns the value of a game variable. * * The valid fields for this item are * - name The name of the variable to get, * - default_value The default value of the variable, if not set, * - any field supported by the parent classes. * * \author Julien Jorge */ template class linear_game_variable_getter: public expr::base_linear_expression, public game_variable_getter { public: /** \brief The type of the parent class. */ typedef expr::base_linear_expression super; public: linear_game_variable_getter(); linear_game_variable_getter* clone() const; double evaluate() const; }; // class linear_game_variable_getter } // namespace engine } // namespace bear #include "engine/function/impl/linear_game_variable_getter.tpp" #endif // __BEAR_LINEAR_GAME_VARIABLE_GETTER_HPP__ plee-the-bear-20251226/bear-engine/core/src/engine/function/linear_level_variable_getter.hpp000066400000000000000000000031531512343254000317500ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A linear expression that returns the value of a level variable. * \author Julien Jorge */ #ifndef __BEAR_LINEAR_LEVEL_VARIABLE_GETTER_HPP__ #define __BEAR_LINEAR_LEVEL_VARIABLE_GETTER_HPP__ #include "engine/function/level_variable_getter.hpp" #include "expr/linear_function.hpp" #include "expr/base_linear_expression.hpp" namespace bear { namespace engine { /** * \brief A linear expression that returns the value of a level variable. * * The valid fields for this item are * - name The name of the variable to get, * - default_value The default value of the variable, if not set, * - any field supported by the parent classes. * * \author Julien Jorge */ template class linear_level_variable_getter: public expr::base_linear_expression, public level_variable_getter { public: /** \brief The type of the parent class. */ typedef expr::base_linear_expression super; public: linear_level_variable_getter(); linear_level_variable_getter (const level* lvl, const std::string& var_name); linear_level_variable_getter* clone() const; double evaluate() const; }; // class linear_level_variable_getter } // namespace engine } // namespace bear #include "engine/function/impl/linear_level_variable_getter.tpp" #endif // __BEAR_LINEAR_LEVEL_VARIABLE_GETTER_HPP__ plee-the-bear-20251226/bear-engine/core/src/engine/game.hpp000066400000000000000000000111531512343254000231530ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief The class managing the levels and the development of the game. * \author Julien Jorge */ #ifndef __ENGINE_GAME_HPP__ #define __ENGINE_GAME_HPP__ #include "engine/class_export.hpp" #include "engine/stat_variable.hpp" #include "engine/variable/var_map.hpp" #include "visual/capture.hpp" #include "time/time.hpp" #include #include #include #include namespace bear { namespace engine { class base_variable; class game_description; class game_filesystem; class game_local_client; class game_network; class level; class libraries_pool; class translator; /** * \brief The class managing the levels and the evolution of the game. * \author Julien Jorge */ class ENGINE_EXPORT game { public: static game& get_instance(); static void print_help(); game( int& argc, char** &argv ); explicit game( const game_description& description ); ~game(); void run(); void sleep(); void wake_up(); systime::milliseconds_type get_time_step() const; void set_time_scale( double s ); double get_time_scale() const; game_network& get_network(); translator get_translator() const; void set_translator( const translator& t ); void set_dumb_rendering( bool b ); bool get_dumb_rendering() const; void set_fullscreen( bool full ); bool get_fullscreen() const; void toggle_fullscreen(); void set_overview_mode( bool m ); bool get_overview_mode() const; void toggle_overview_mode(); void set_sound_muted( bool m ); bool get_sound_muted() const; void toggle_sound_muted(); void set_sound_volume( double v ); double get_sound_volume() const; void set_music_muted( bool m ); bool get_music_muted() const; void toggle_music_muted(); void set_music_volume( double v ); double get_music_volume() const; void screenshot( claw::graphic::image& img ) const; visual::capture screen_capture() const; void levelshot( claw::graphic::image& img ) const; void end(); void set_waiting_level( const std::string& path ); void set_waiting_level( level* the_level ); void push_level( const std::string& path ); void pop_level(); claw::math::coordinate_2d get_screen_size() const; claw::math::coordinate_2d get_window_size() const; double get_active_area_margin() const; game_filesystem get_game_filesystem() const; void set_game_filesystem( const game_filesystem& f ); void get_game_variable( base_variable& val ) const; void get_game_variables (var_map& vars, const std::string& pattern = ".*" ); void set_game_variable( const base_variable& val ); void set_game_variables( const var_map& vars ); void erase_game_variables( const std::string& pattern ); bool game_variable_exists( const base_variable& val ) const; void save_game_variables ( std::ostream& os, const std::string& pattern = ".*" ); boost::signals2::connection listen_int_variable_change ( const std::string& name, const boost::function& f ); boost::signals2::connection listen_uint_variable_change ( const std::string& name, const boost::function& f ); boost::signals2::connection listen_bool_variable_change ( const std::string& name, const boost::function& f ); boost::signals2::connection listen_double_variable_change ( const std::string& name, const boost::function& f ); boost::signals2::connection listen_string_variable_change ( const std::string& name, const boost::function& f ); const std::string& get_name() const; void send_data ( std::string operation, std::string name, std::string value ) const; void send_data ( std::string operation, std::list vars ) const; private: /** \brief The instance of the game on this computer. */ static game* s_instance; /** \brief The effective implementation of the game. */ game_local_client* m_game; }; // class game } // namespace engine } // namespace bear #endif // __ENGINE_GAME_HPP__ plee-the-bear-20251226/bear-engine/core/src/engine/game_action/000077500000000000000000000000001512343254000237765ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/core/src/engine/game_action/code/000077500000000000000000000000001512343254000247105ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/core/src/engine/game_action/code/game_action_load_level.cpp000066400000000000000000000020561512343254000320530ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the engine::game_action_load_level class. * \author Julien Jorge */ #include "engine/game_action/game_action_load_level.hpp" #include "engine/game_local_client.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param path The path of the level to load. */ bear::engine::game_action_load_level::game_action_load_level ( const std::string& path ) : m_path(path) { } // game_action_load_level::game_action_load_level() /*----------------------------------------------------------------------------*/ /** * \brief Apply the action to a game. * \param the_game The game to apply to. */ bool bear::engine::game_action_load_level::apply( game_local_client& the_game ) { the_game.load_level( m_path ); return true; } // game_action_load_level::apply() plee-the-bear-20251226/bear-engine/core/src/engine/game_action/code/game_action_pop_level.cpp000066400000000000000000000013431512343254000317300ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the engine::game_action_pop_level class. * \author Julien Jorge */ #include "engine/game_action/game_action_pop_level.hpp" #include "engine/game_local_client.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Apply the action to a game. * \param the_game The game to apply to. */ bool bear::engine::game_action_pop_level::apply( game_local_client& the_game ) { the_game.do_pop_level(); return true; } // game_action_pop_level::apply() plee-the-bear-20251226/bear-engine/core/src/engine/game_action/code/game_action_push_level.cpp000066400000000000000000000020611512343254000321070ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the engine::game_action_push_level class. * \author Julien Jorge */ #include "engine/game_action/game_action_push_level.hpp" #include "engine/game_local_client.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param path The path of the level to push. */ bear::engine::game_action_push_level::game_action_push_level ( const std::string& path ) : m_path(path) { } // game_action_push_level::game_action_push_level() /*----------------------------------------------------------------------------*/ /** * \brief Apply the action to a game. * \param the_game The game to apply to. */ bool bear::engine::game_action_push_level::apply( game_local_client& the_game ) { the_game.do_push_level( m_path ); return true; } // game_action_push_level::apply() game_action_set_current_level.cpp000066400000000000000000000022121512343254000334040ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/core/src/engine/game_action/code/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the engine::game_action_set_current_level class. * \author Julien Jorge */ #include "engine/game_action/game_action_set_current_level.hpp" #include "engine/game_local_client.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param the_level The level to set. */ bear::engine::game_action_set_current_level::game_action_set_current_level ( level* the_level ) : m_level(the_level) { CLAW_PRECOND( the_level != NULL ); } // game_action_set_current_level::game_action_set_current_level() /*----------------------------------------------------------------------------*/ /** * \brief Apply the action to a game. * \param the_game The game to apply to. */ bool bear::engine::game_action_set_current_level::apply ( game_local_client& the_game ) { the_game.set_current_level( m_level ); return true; } // game_action_set_current_level::apply() plee-the-bear-20251226/bear-engine/core/src/engine/game_action/game_action.hpp000066400000000000000000000015641512343254000267630ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Base class for actions that can be applied to a game. * \author Julien Jorge */ #ifndef __ENGINE_GAME_ACTION_HPP__ #define __ENGINE_GAME_ACTION_HPP__ #include "engine/class_export.hpp" namespace bear { namespace engine { // forward declaration class game_local_client; /** * \brief Base class for actions that can be applied to a game. * \author Julien Jorge */ class ENGINE_EXPORT game_action { public: virtual ~game_action() {} virtual bool apply( game_local_client& the_game ) = 0; }; // class game_action } // namespace engine } // namespace bear #endif // __ENGINE_GAME_ACTION_HPP__ plee-the-bear-20251226/bear-engine/core/src/engine/game_action/game_action_load_level.hpp000066400000000000000000000020041512343254000311370ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Tell a game to load a level. * \author Julien Jorge */ #ifndef __ENGINE_GAME_ACTION_LOAD_LEVEL_HPP__ #define __ENGINE_GAME_ACTION_LOAD_LEVEL_HPP__ #include "engine/game_action/game_action.hpp" #include #include "engine/class_export.hpp" namespace bear { namespace engine { /** * \brief Tell a game to load a level. * \author Julien Jorge */ class ENGINE_EXPORT game_action_load_level: public game_action { public: game_action_load_level( const std::string& path ); bool apply( game_local_client& the_game ); private: /** \brief The path of the level to load. */ std::string m_path; }; // class game_action_load_level } // namespace engine } // namespace bear #endif // __ENGINE_GAME_ACTION_LOAD_LEVEL_HPP__ plee-the-bear-20251226/bear-engine/core/src/engine/game_action/game_action_pop_level.hpp000066400000000000000000000015511512343254000310240ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Tell a game to pop the current level. * \author Julien Jorge */ #ifndef __ENGINE_GAME_ACTION_POP_LEVEL_HPP__ #define __ENGINE_GAME_ACTION_POP_LEVEL_HPP__ #include "engine/game_action/game_action.hpp" #include "engine/class_export.hpp" namespace bear { namespace engine { /** * \brief Tell a game to pop the current level. * \author Julien Jorge */ class ENGINE_EXPORT game_action_pop_level: public game_action { public: bool apply( game_local_client& the_game ); }; // class game_action_pop_level } // namespace engine } // namespace bear #endif // __ENGINE_GAME_ACTION_POP_LEVEL_HPP__ plee-the-bear-20251226/bear-engine/core/src/engine/game_action/game_action_push_level.hpp000066400000000000000000000020041512343254000311770ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Tell a game to push a level. * \author Julien Jorge */ #ifndef __ENGINE_GAME_ACTION_PUSH_LEVEL_HPP__ #define __ENGINE_GAME_ACTION_PUSH_LEVEL_HPP__ #include "engine/game_action/game_action.hpp" #include #include "engine/class_export.hpp" namespace bear { namespace engine { /** * \brief Tell a game to push a level. * \author Julien Jorge */ class ENGINE_EXPORT game_action_push_level: public game_action { public: game_action_push_level( const std::string& path ); bool apply( game_local_client& the_game ); private: /** \brief The path of the level to push. */ std::string m_path; }; // class game_action_push_level } // namespace engine } // namespace bear #endif // __ENGINE_GAME_ACTION_PUSH_LEVEL_HPP__ plee-the-bear-20251226/bear-engine/core/src/engine/game_action/game_action_set_current_level.hpp000066400000000000000000000020201512343254000325530ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Change the current level. * \author Julien Jorge */ #ifndef __ENGINE_GAME_ACTION_SET_CURRENT_LEVEL_HPP__ #define __ENGINE_GAME_ACTION_SET_CURRENT_LEVEL_HPP__ #include "engine/game_action/game_action.hpp" #include "engine/class_export.hpp" namespace bear { namespace engine { class level; /** * \brief Change the current level. * \author Julien Jorge */ class ENGINE_EXPORT game_action_set_current_level: public game_action { public: game_action_set_current_level( level* the_level ); bool apply( game_local_client& the_game ); private: /** \brief The level to set.. */ level* m_level; }; // class game_action_set_current_level } // namespace engine } // namespace bear #endif // __ENGINE_GAME_ACTION_SET_CURRENT_LEVEL_HPP__ plee-the-bear-20251226/bear-engine/core/src/engine/game_description.hpp000066400000000000000000000052461512343254000255640ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief This class loads and store informations from a game description file. * \author Julien Jorge */ #ifndef __ENGINE_GAME_DESCRIPTION_HPP__ #define __ENGINE_GAME_DESCRIPTION_HPP__ #include #include #include #include #include #include "engine/class_export.hpp" namespace bear { namespace engine { /** * \brief This class stores some information about the initialization of the * game. * \author Julien Jorge */ class ENGINE_EXPORT game_description { public: typedef std::list string_list; public: game_description(); explicit game_description( const claw::arguments_table& arg ); static void get_valid_command_line_arguments ( claw::arguments_table& arg ); const std::string& start_level() const; const std::string& game_name() const; const claw::math::coordinate_2d& screen_size() const; bool dumb_rendering() const; double active_area_margin() const; const string_list& resources_path() const; const string_list& libraries() const; void set_game_name( const std::string& value ); void set_screen_width( unsigned int value ); void set_screen_height( unsigned int value ); void set_dumb_rendering( bool v ); void set_active_area_margin( unsigned int value ); void add_resources_path( const std::string& value ); void add_resources_path( const string_list& value ); void add_item_library( const std::string& value ); void add_item_library( const string_list& value ); void set_start_level( const std::string& value ); private: /** \brief The name of the first level to load. */ std::string m_start_level; /** \brief The name of the game. */ std::string m_game_name; /** \brief The size of the screen. */ claw::math::coordinate_2d m_screen_size; /** \brief The margin of the active area around the screen. */ double m_active_area_margin; /** \brief The paths to the forder containing the resources. */ string_list m_resources_path; /** \brief The game libraries to link to. */ string_list m_libraries; /** \brief Tells if we use dumb rendering by default. */ bool m_use_dumb_rendering; }; // class game_description } // namespace engine } // namespace bear #endif // __ENGINE_GAME_DESCRIPTION_HPP__ plee-the-bear-20251226/bear-engine/core/src/engine/game_initializer.hpp000066400000000000000000000051201512343254000255530ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief The game_initializer class manages the functions used to initialize * and to end the game. * \author Julien Jorge */ #ifndef __ENGINE_GAME_INITIALIZER_HPP__ #define __ENGINE_GAME_INITIALIZER_HPP__ #include #include "engine/class_export.hpp" /** * \brief Sets the function to call when initializing the game. * \param f The function. Its signature must be void (). */ #define BEAR_ENGINE_GAME_INIT_FUNCTION( f ) \ static bool f ## _init_registered = \ bear::engine::game_initializer::get_instance().set_init( f ); /** * \brief Sets the function to call when ending the game. * \param f The function. Its signature must be void (). */ #define BEAR_ENGINE_GAME_END_FUNCTION( f ) \ static bool f ## _end_registered = \ bear::engine::game_initializer::get_instance().set_end( f ); namespace bear { namespace engine { /** * \brief The game_initializer class manages the functions used to * initialize and to end the game. * \author Julien Jorge */ class ENGINE_EXPORT game_initializer: public claw::pattern::basic_singleton { private: /** \brief The type of the parent class. */ typedef claw::pattern::basic_singleton super; friend class claw::pattern::basic_singleton; public: /** \brief Type of the game specific initialisation procedure. */ typedef void (*init_game_function_type)(); /** \brief Type of the game specific ending procedure. */ typedef void (*end_game_function_type)(); public: // Must be redefined to work correctly with dynamic libraries. // At least under Windows with MinGW. static game_initializer& get_instance(); bool set_init( init_game_function_type f ); bool set_end( end_game_function_type f ); void init(); void end(); private: game_initializer(); private: /** \brief The function to call when initializing the game. */ init_game_function_type m_init; /** \brief The function to call when ending the game. */ end_game_function_type m_end; }; // class game_initializer } // namespace engine } // namespace bear #endif // __ENGINE_GAME_INITIALIZER_HPP__ plee-the-bear-20251226/bear-engine/core/src/engine/game_local_client.hpp000066400000000000000000000227571512343254000256770ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief The class managing the levels and the development of the game. * \author Julien Jorge */ #ifndef __ENGINE_GAME_LOCAL_CLIENT_HPP__ #define __ENGINE_GAME_LOCAL_CLIENT_HPP__ #include #include #include "engine/class_export.hpp" #include "engine/game_description.hpp" #include "engine/game_network.hpp" #include "engine/game_stats.hpp" #include "engine/i18n/translator.hpp" #include "engine/libraries_pool.hpp" #include "engine/stat_variable.hpp" #include "engine/system/base_system_event_manager.hpp" #include "engine/system/game_filesystem.hpp" #include "engine/variable/var_map.hpp" #include "time/time.hpp" #include "visual/screen.hpp" #include "universe/types.hpp" #include #include #include namespace bear { namespace engine { class base_variable; class game_action; class game_action_load_level; class game_action_pop_level; class game_action_push_level; class game_action_set_current_level; class game_action_set_current_level; class level; /** * \brief The class managing the levels and the development of the game. * \author Julien Jorge */ class ENGINE_EXPORT game_local_client { friend class game_action; friend class game_action_load_level; friend class game_action_pop_level; friend class game_action_push_level; friend class game_action_set_current_level; private: /** * \brief Game status. */ enum status { /** \brief The game is under initialization. */ status_init, /** \brief The game is running. */ status_run, /** \brief The game is sleeping. */ status_sleep, /** \brief We're quiting. */ status_quit }; // enum status /** \brief The type of the pointer on the instance of the event manager. */ typedef base_system_event_manager* event_manager_ptr; public: static void print_help(); game_local_client( int& argc, char** &argv ); explicit game_local_client( const game_description& description ); ~game_local_client(); void run(); void sleep(); void wake_up(); systime::milliseconds_type get_time_step() const; void set_time_scale( double s ); double get_time_scale() const; game_network& get_network(); translator get_translator() const; void set_translator( const translator& t ); void set_dumb_rendering( bool b ); bool get_dumb_rendering() const; void set_fullscreen( bool full ); bool get_fullscreen() const; void set_overview_mode( bool m ); bool get_overview_mode() const; void set_sound_muted( bool m ); bool get_sound_muted() const; void set_sound_volume( double v ); double get_sound_volume() const; void set_music_muted( bool m ); bool get_music_muted() const; void set_music_volume( double v ); double get_music_volume() const; void screenshot( claw::graphic::image& img ) const; visual::capture screen_capture() const; void levelshot( claw::graphic::image& img ) const; void end(); void set_waiting_level( const std::string& path ); void set_waiting_level( level* the_level ); void push_level( const std::string& path ); void pop_level(); claw::math::coordinate_2d get_screen_size() const; claw::math::coordinate_2d get_window_size() const; double get_active_area_margin() const; game_filesystem get_game_filesystem() const; void set_game_filesystem( const game_filesystem& f ); void get_game_variable( base_variable& val ) const; void get_game_variables ( var_map& vars, const std::string& pattern = ".*"); void set_game_variable( const base_variable& val ); void set_game_variables( const var_map& vars ); void erase_game_variables( const std::string& pattern ); bool game_variable_exists( const base_variable& val ) const; void get_all_game_variables( var_map& vars ) const; boost::signals2::connection listen_int_variable_change ( const std::string& name, const boost::function& f ); boost::signals2::connection listen_uint_variable_change ( const std::string& name, const boost::function& f ); boost::signals2::connection listen_bool_variable_change ( const std::string& name, const boost::function& f ); boost::signals2::connection listen_double_variable_change ( const std::string& name, const boost::function& f ); boost::signals2::connection listen_string_variable_change ( const std::string& name, const boost::function& f ); const std::string& get_name() const; void send_data ( std::string operation, std::string name, std::string value ) const; void send_data ( std::string operation, std::list vars ) const; private: void constructor_common_init_members(); void constructor_common_init(); void init_stats(); void init_game() const; void end_game() const; std::string get_formatted_game_name() const; void set_last_progress_date(); void run_level(); void one_step_beyond(); bool synchronize_network(); bear::universe::time_type synchronous_progress( universe::time_type dt ); bear::universe::time_type asynchronous_progress ( universe::time_type dt, systime::milliseconds_type current_time, universe::time_type time_range ); void progress ( systime::milliseconds_type current_time, universe::time_type dt, universe::time_type time_range, universe::time_type time_scale ); void progress( universe::time_type elapsed_time ); void render(); void update_inputs(); void init_environment() const; void close_environment() const; void init_game_filesystem(); void init_event_manager(); void load_libraries( const std::list& p ); void init_resource_pool( const std::list& p ) const; bool do_post_actions(); void set_current_level( level* the_level ); void load_level( const std::string& path ); void close_level(); void do_push_level( const std::string& path ); void do_pop_level(); void start_current_level(); void clear(); bool check_arguments( int& argc, char** &argv ); template bool set_game_variable_from_arg ( const std::list& args, const char sep ); template boost::signals2::connection listen_variable_change ( const std::string& name, boost::function f ); static claw::arguments_table get_arguments_table(); private: // must be declared before m_game_description /** \brief The libraries in which we take custom functions. */ libraries_pool m_symbols; /** \brief The current status of the game. */ status m_status; /** \brief The status of the game before it was sent to sleep. */ status m_sleep_status; /** \brief Description of the game. */ game_description m_game_description; /** \brief Global variables of the game. */ var_map m_game_variables; /** \brief The screen. */ visual::screen* m_screen; /** \brief Tell if we are fullscreen or not. */ bool m_fullscreen; /** \brief The current level. */ level* m_current_level; /** \brief A level in abeyance. */ level* m_level_in_abeyance; /** \brief The name of the next level to load, if any. */ std::string m_waiting_level; /** \brief Actions to do once an iteration is done. */ std::queue m_post_actions; /** \brief Number of milliseconds between two iterations. */ systime::milliseconds_type m_time_step; /** \brief The scale of the time in the game. */ universe::time_type m_time_scale; /** \brief The expected number of frames per seconds. */ std::size_t m_frames_per_second; /** \brief The date of the last render. */ systime::milliseconds_type m_last_render; /** \brief The date of the last call to progress. */ systime::milliseconds_type m_last_progress; /** \brief Tell to do one render for each progress. */ bool m_synchronized_render; /** \brief The statistics sent at the end of the game. */ game_stats m_stats; /** \brief The instance that manages the connections to the network. */ game_network m_network; /** \brief Tell if the current level is paused due to a desynchronization of the network. */ bool m_level_paused_sync; /** \brief The translator for the plugins. */ translator m_translator; /** \brief The abstraction of the filesystem, as seen by the game. */ game_filesystem m_game_filesystem; /** \brief The abstraction of the system event handler. */ event_manager_ptr m_event_manager; }; // class game_local_client } // namespace engine } // namespace bear #endif // __ENGINE_GAME_LOCAL_CLIENT_HPP__ plee-the-bear-20251226/bear-engine/core/src/engine/game_network.hpp000066400000000000000000000062411512343254000247260ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief The class managing the access to the network used by the game. * \author Julien Jorge */ #ifndef __ENGINE_GAME_NETWORK_HPP__ #define __ENGINE_GAME_NETWORK_HPP__ #include "engine/network/client_future.hpp" #include "engine/network/client_observer.hpp" #include "engine/class_export.hpp" #include "net/client.hpp" #include "net/server.hpp" #include #include namespace bear { namespace engine { class client_connection; /** * \brief The class managing the access to the network used by the game. * \author Julien Jorge */ class ENGINE_EXPORT game_network { private: /** \brief The type of the map containing the server associated with each service name. */ typedef std::map server_map; /** \brief The list of the client connections to the servers. */ typedef std::list client_list; /** \brief The type of the map associating the pending messages to each client. */ typedef std::map client_future_map; public: game_network(); ~game_network(); std::size_t get_client_count() const; const client_future& get_future( std::size_t client_index ) const; const client_connection& get_connection( std::size_t client_index ) const; std::size_t get_horizon() const; std::size_t get_min_horizon() const; void set_min_horizon( std::size_t m ); void send_message ( const std::string& service_name, net::message& m ) const; void create_service( const std::string& name, unsigned int port ); client_observer connect_to_service( const std::string& host, unsigned int port ); bool synchronize(); void send_synchronization(); private: client_connection* create_new_client( const std::string& host, unsigned int port ); void pull_client_messages( client_connection* c ); bool prepare_clients(); bool set_client_messages(); void on_new_client( net::server* s, std::size_t client_id ); private: /** \brief The services provided by the local game. */ server_map m_server; /** \brief The connections to the servers. */ client_list m_client; /** \brief The pending messages of each client. */ client_future_map m_future; /** \brief The last id given to the sync message. */ std::size_t m_sync_id; /** \brief The minimum horizon to consider the synchronization successful. */ std::size_t m_min_horizon; /** \brief The clients for which we are waiting to have enough messages. */ std::set m_filling; /** \brief Tell if at the last call to synchronize all clients received the messages for the active iteration. */ bool m_active; }; // class game_network } // namespace engine } // namespace bear #endif // __ENGINE_GAME_NETWORK_HPP__ plee-the-bear-20251226/bear-engine/core/src/engine/game_stats.hpp000066400000000000000000000045621512343254000243770ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A class that stores some statistics about the game. * \author Julien Jorge */ #ifndef __ENGINE_GAME_STATS_HPP__ #define __ENGINE_GAME_STATS_HPP__ #include "engine/class_export.hpp" #include "engine/stat_variable.hpp" #include "time/time.hpp" #include namespace bear { namespace engine { /** * \brief A class that stores some statistics about the game. * \author Julien Jorge */ class ENGINE_EXPORT game_stats { private: /** * \brief A function object that sends a statistic information. */ class statistic_sender { public: void operator()() const; public: /** \brief The address. */ std::string address; /** \brief The xml to send. */ std::string xml_string; }; // struct statistic_sender public: game_stats(); void start( std::string name, std::string id ) const; void end() const; void start_level( std::string name ) const; void pop_level( std::string name ) const; void set_tag( std::string tag ); void set_destination( std::string destination ); void send_data ( std::string operation, std::string name, std::string value ) const; void send_data ( std::string operation, std::list vars ) const; private: void send( std::string xml_string ) const; void http_post( std::string address, std::string xml_string ) const; std::string generate_xml_stats ( std::string operation, std::list vars ) const; private: /** \brief The identifier of the game instance. */ std::string m_launch_id; /** \brief The date at which the game was started. */ const systime::milliseconds_type m_init_date; /** \brief The identifier of the current user. */ std::string m_user_id; /** \brief The tag of the build. */ std::string m_tag; /** \brief The destination to which the stats are sent. */ std::string m_destination; }; // class game_stats } // namespace engine } // namespace bear #endif // __ENGINE_GAME_STATS_HPP__ plee-the-bear-20251226/bear-engine/core/src/engine/i18n/000077500000000000000000000000001512343254000223075ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/core/src/engine/i18n/android_gettext_translator.hpp000066400000000000000000000031111512343254000304510ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief The android_gettext_translator class is an implementation of the * base_translator class using the gettext library. * \author Julien Jorge */ #ifdef __ANDROID__ #ifndef __ENGINE_ANDROID_GETTEXT_TRANSLATOR_HPP__ #define __ENGINE_ANDROID_GETTEXT_TRANSLATOR_HPP__ #include "engine/i18n/base_translator.hpp" namespace bear { namespace engine { /** * \brief The android_gettext_translator class is an implementation of the * base_translator class using the gettext library. * \author Julien Jorge */ class ENGINE_EXPORT android_gettext_translator: public base_translator { public: android_gettext_translator( std::string domain_name ); virtual android_gettext_translator* clone() const; virtual std::string get( std::string key ); private: std::string get_mo_file_path( std::string language ) const; std::string make_translation_file_path( std::string language ) const; std::string get_user_locale() const; void read_mo_file( std::string mo_file_path ) const; private: /** \brief The domain name passed to gettext to retrieve the translations. */ const std::string m_domain_name; }; // class android_gettext_translator } // namespace engine } // namespace bear #endif // __ENGINE_ANDROID_GETTEXT_TRANSLATOR_HPP__ #endif // __ANDROID__ plee-the-bear-20251226/bear-engine/core/src/engine/i18n/base_translator.hpp000066400000000000000000000020701512343254000262020ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief The base_translator class is the base class for the objects that * manages a set of translations provided by the game's plugins. * \author Julien Jorge */ #ifndef __ENGINE_BASE_TRANSLATOR_HPP__ #define __ENGINE_BASE_TRANSLATOR_HPP__ #include "engine/class_export.hpp" #include namespace bear { namespace engine { /** * \brief The base_translator class is the base class for the objects that * manages a set of translations provided by the game's plugins. * \author Julien Jorge */ class ENGINE_EXPORT base_translator { public: virtual ~base_translator(); virtual base_translator* clone() const = 0; virtual std::string get( std::string key ) = 0; }; // class base_translator } // namespace engine } // namespace bear #endif // __ENGINE_BASE_TRANSLATOR_HPP__ plee-the-bear-20251226/bear-engine/core/src/engine/i18n/code/000077500000000000000000000000001512343254000232215ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/core/src/engine/i18n/code/android_gettext_translator.cpp000066400000000000000000000130031512343254000313570ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::engine::android_gettext_translator class. * \author Julien Jorge */ #ifdef __ANDROID__ #include "engine/i18n/android_gettext_translator.hpp" #include "engine/resource_pool.hpp" #include #include #include #include #include /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param domain_name The domain name passed to gettext to retrieve the * translators. */ bear::engine::android_gettext_translator::android_gettext_translator ( std::string domain_name ) : m_domain_name( domain_name ) { std::string user_locale( get_user_locale() ); if ( user_locale.empty() ) return; const std::string mo_file_path( get_mo_file_path( user_locale ) ); if ( mo_file_path.empty() ) return; read_mo_file( mo_file_path ); } // android_gettext_translator::android_gettext_translator() /*----------------------------------------------------------------------------*/ /** * \brief Creates a dynamically allocated copy of this instance. */ bear::engine::android_gettext_translator* bear::engine::android_gettext_translator::clone() const { return new android_gettext_translator( *this ); } // android_gettext_translator::clone() /*----------------------------------------------------------------------------*/ /** * \brief Returns the translator of a given text. * \param key The text to translate. */ std::string bear::engine::android_gettext_translator::get( std::string key ) { return dgettext( m_domain_name.c_str(), key.c_str() ); } // android_gettext_translator::get() /*----------------------------------------------------------------------------*/ /** * \brief Returns the path to the best translation file for the current domain. * \param language The languae code for which we search the translations. */ std::string bear::engine::android_gettext_translator::get_mo_file_path ( std::string language ) const { std::string path( make_translation_file_path(language) ); if ( resource_pool::get_instance().exists( path ) ) return path; const std::string separators( "#._" ); for ( std::string::const_iterator next_separator(separators.begin()); next_separator != separators.end(); ++next_separator ) { const std::size_t separator_position ( language.find_last_of( *next_separator ) ); if ( separator_position != std::string::npos ) { language = language.substr(0, separator_position); path = make_translation_file_path(language); if ( resource_pool::get_instance().exists( path ) ) return path; } } claw::logger << claw::log_warning << "Can't find translations in domain '" << m_domain_name << "'." << std::endl; return std::string(); } // android_gettext_translator::get_mo_file_path() /*----------------------------------------------------------------------------*/ /** * \brief Buids the path to the translation file for a given language in the * current domain. * \param language The languae code for which we search the translations. */ std::string bear::engine::android_gettext_translator::make_translation_file_path ( std::string language ) const { return "share/locale/" + language + "/LC_MESSAGES/" + m_domain_name + ".mo"; } // android_gettext_translator::make_translation_file_path() /*----------------------------------------------------------------------------*/ /** * \brief Finds the user's locale name. */ std::string bear::engine::android_gettext_translator::get_user_locale() const { char* user_locale( SDL_AndroidGetLocale() ); std::string result; if ( user_locale == NULL ) claw::logger << claw::log_warning << "Can't get user's locale."<< std::endl; else { claw::logger << claw::log_verbose << "User's locale is '" << user_locale << "'." << std::endl; result = user_locale; SDL_free( user_locale ); } return result; } // android_gettext_translator::get_user_locale() /*----------------------------------------------------------------------------*/ /** * \brief Reads the translations from a given .mo file. * \param mo_file_path The path to the file, relatively to the root of the * resource pool. */ void bear::engine::android_gettext_translator::read_mo_file ( std::string mo_file_path ) const { // get the content of the translation file std::stringstream mo_file_stream; resource_pool::get_instance().get_file( mo_file_path, mo_file_stream ); // compute the size of the file mo_file_stream.seekg( 0, std::ios::end ); const std::size_t mo_file_content_length( mo_file_stream.tellg() ); mo_file_stream.seekg( 0, std::ios::beg ); // read the file in a buffer so we can access it as a FILE using fmemopen char* const mo_file_content( new char[ mo_file_content_length ] ); mo_file_stream.read( mo_file_content, mo_file_content_length ); FILE* const mo_file ( fmemopen( mo_file_content, mo_file_content_length, "rb" ) ); if ( mo_file != NULL ) { // and finally pass the file to the internationalization library. loadMessageCatalogFile( m_domain_name.c_str(), mo_file ); fclose( mo_file ); } delete[] mo_file_content; } // android_gettext_translator::android_gettext_translator() #endif // __ANDROID__ plee-the-bear-20251226/bear-engine/core/src/engine/i18n/code/base_translator.cpp000066400000000000000000000011061512343254000271060ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::engine::base_translator class. * \author Julien Jorge */ #include "engine/i18n/base_translator.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Destructor. */ bear::engine::base_translator::~base_translator() { // Nothing to do. } // base_translator::~base_translator() plee-the-bear-20251226/bear-engine/core/src/engine/i18n/code/gettext_translator.cpp000066400000000000000000000025761512343254000276740ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::engine::gettext_translator class. * \author Julien Jorge */ #include "engine/i18n/gettext_translator.hpp" #include /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param domain_name The domain name passed to gettext to retrieve the * translators. */ bear::engine::gettext_translator::gettext_translator ( std::string domain_name ) : m_domain_name( domain_name ) { } // gettext_translator::gettext_translator() /*----------------------------------------------------------------------------*/ /** * \brief Creates a dynamically allocated copy of this instance. */ bear::engine::gettext_translator* bear::engine::gettext_translator::clone() const { return new gettext_translator( *this ); } // gettext_translator::clone() /*----------------------------------------------------------------------------*/ /** * \brief Returns the translator of a given text. * \param key The text to translate. */ std::string bear::engine::gettext_translator::get( std::string key ) { return dgettext( m_domain_name.c_str(), key.c_str() ); } // gettext_translator::get() plee-the-bear-20251226/bear-engine/core/src/engine/i18n/code/translator.cpp000066400000000000000000000051521512343254000261210ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::engine::translator class. * \author Julien Jorge */ #include "engine/i18n/translator.hpp" #include "engine/i18n/base_translator.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ bear::engine::translator::translator() : m_impl(NULL) { } // translator::translator() /*----------------------------------------------------------------------------*/ /** * \brief Copy constructor. * \param that The instance to copy. */ bear::engine::translator::translator( const translator& that ) { if ( that.m_impl == NULL ) m_impl = NULL; else m_impl = that.m_impl->clone(); } // translator::translator() /*----------------------------------------------------------------------------*/ /** * \brief Constructor from a given implementation. * \param impl The implementation. */ bear::engine::translator::translator( const base_translator& impl ) : m_impl( impl.clone() ) { } // translator::translator() /*----------------------------------------------------------------------------*/ /** * \brief Destructor. */ bear::engine::translator::~translator() { delete m_impl; } // translator::~translator() /*----------------------------------------------------------------------------*/ /** * \brief Swap this instance with another one. * \param that The instance to swap with. */ void bear::engine::translator::swap( translator& that ) { std::swap( m_impl, that.m_impl ); } // translator::swap() /*----------------------------------------------------------------------------*/ /** * \brief Assign another instance to this one. * \param that The instance to copy. */ bear::engine::translator& bear::engine::translator::operator=( translator that ) { swap( that ); return *this; } // translator::operator=() /*----------------------------------------------------------------------------*/ /** * \brief Returns the translator of a given text. * \param key The text to translate. */ std::string bear::engine::translator::get( std::string key ) { if ( m_impl != NULL ) return m_impl->get( key ); else return key; } // translator::get() namespace std { /** * \brief Swaps the value of two translators. * \param a One translator. * \param b Another translator. */ void swap( bear::engine::translator& a, bear::engine::translator& b ) { a.swap( b ); } // swap() } // namespace std plee-the-bear-20251226/bear-engine/core/src/engine/i18n/gettext_translator.hpp000066400000000000000000000023221512343254000267540ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief The gettext_translator class is an implementation of the * base_translator class using the gettext library. * \author Julien Jorge */ #ifndef __ENGINE_GETTEXT_TRANSLATOR_HPP__ #define __ENGINE_GETTEXT_TRANSLATOR_HPP__ #include "engine/i18n/base_translator.hpp" namespace bear { namespace engine { /** * \brief The gettext_translator class is an implementation of the * base_translator class using the gettext library. * \author Julien Jorge */ class ENGINE_EXPORT gettext_translator: public base_translator { public: gettext_translator( std::string domain_name ); virtual gettext_translator* clone() const; virtual std::string get( std::string key ); private: /** \brief The domain name passed to gettext to retrieve the translations. */ const std::string m_domain_name; }; // class gettext_translator } // namespace engine } // namespace bear #endif // __ENGINE_GETTEXT_TRANSLATOR_HPP__ plee-the-bear-20251226/bear-engine/core/src/engine/i18n/translator.hpp000066400000000000000000000024631512343254000252160ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief This class manages a set of translations provided by the game's * plugins. * \author Julien Jorge */ #ifndef __ENGINE_TRANSLATOR_HPP__ #define __ENGINE_TRANSLATOR_HPP__ #include "engine/class_export.hpp" #include namespace bear { namespace engine { class base_translator; /** * \brief This class manages a set of translations provided by the game's * plugins. * \author Julien Jorge */ class ENGINE_EXPORT translator { public: translator(); translator( const translator& that ); translator( const base_translator& impl ); ~translator(); void swap( translator& that ); translator& operator=( translator that ); std::string get( std::string key ); private: /** \brief The instance that effectively provides the translations. */ base_translator* m_impl; }; // class translator } // namespace engine } // namespace bear namespace std { void swap( bear::engine::translator& a, bear::engine::translator& b ); } // namespace std #endif // __ENGINE_TRANSLATOR_HPP__ plee-the-bear-20251226/bear-engine/core/src/engine/impl/000077500000000000000000000000001512343254000224715ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/core/src/engine/impl/libraries_pool.tpp000066400000000000000000000016711512343254000262300ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the template methods of the * bear::engine::libraries_pool class. * \author Julien Jorge */ #include /*----------------------------------------------------------------------------*/ /** * \brief Get a symbol from the libraries. * \param name The symbol to get. * \pre have_symbol( name ) */ template T bear::engine::libraries_pool::get_symbol( const std::string& name ) const { CLAW_PRECOND( have_symbol(name) ); bool found=false; libraries_list::const_iterator it = m_libraries.begin(); while ( !found ) if ( (*it)->have_symbol(name) ) found = true; else ++it; return (*it)->get_symbol( name ); } // libraries_pool::get_symbol() plee-the-bear-20251226/bear-engine/core/src/engine/impl/messageable_item.tpp000066400000000000000000000074711512343254000265150ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::engine::messageable_item class. * \author Julien Jorge. */ #include "communication/post_office.hpp" #include "engine/level_globals.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ template bear::engine::messageable_item::messageable_item() { } // messageable_item::messageable_item() /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param name The name of the item. */ template bear::engine::messageable_item::messageable_item ( const std::string& name ) : communication::messageable(name) { } // messageable_item::messageable_item() /*----------------------------------------------------------------------------*/ /** * \brief Initialise the item. */ template void bear::engine::messageable_item::on_enters_layer() { super::on_enters_layer(); if ( get_name() != communication::post_office::no_name ) this->get_level_globals().register_item(*this); } // messageable_item::on_enters_layer() /*----------------------------------------------------------------------------*/ /** * \brief Destroy the item. */ template void bear::engine::messageable_item::destroy() { this->get_level_globals().release_item(*this); super::destroy(); } // messageable_item::destroy() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type "string". * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ template bool bear::engine::messageable_item::set_string_field ( const std::string& name, const std::string& value ) { bool result = true; if (name == "messageable_item.name") communication::messageable::set_name(value); else result = super::set_string_field(name, value); return result; } // messageable_item::set_string_field() /*----------------------------------------------------------------------------*/ /** * \brief Tell if the item is correctly initialized. */ template bool bear::engine::messageable_item::is_valid() const { return (get_name() != communication::post_office::no_name) && super::is_valid(); } // messageable_item::is_valid() /*----------------------------------------------------------------------------*/ /** * \brief Give a string representation of the item. * \param str (out) The result of the convertion. */ template void bear::engine::messageable_item::to_string( std::string& str ) const { std::string s; super::to_string(s); str = "name: " + get_name() + "\n" + s; } // messageable_item::to_string() /*----------------------------------------------------------------------------*/ /** * \brief Set/change the name of the item. The item is first released of the * post_office if it was previously registered. * \param name The new name of the item. * \remark Do not call this method from the constructor of items appearing in a * level file or created in the constructor of such an item. */ template bool bear::engine::messageable_item::set_name( const std::string& name ) { bool result = false; if ( name != communication::post_office::no_name ) { if ( get_name() != communication::post_office::no_name ) this->get_level_globals().release_item(*this); communication::messageable::set_name(name); result = true; } return result; } // messageable_item::set_name() plee-the-bear-20251226/bear-engine/core/src/engine/impl/model.tpp000066400000000000000000001110661512343254000243230ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::engine::model class. * \author Julien Jorge */ #include "engine/level_globals.hpp" #include "engine/base_item.hpp" #include "engine/layer/layer.hpp" #include "engine/model/model_mark_item.hpp" #include "engine/model/model_snapshot.hpp" #include "engine/reference_point/model_mark_reference_point.hpp" #include "universe/forced_movement/forced_tracking.hpp" #include /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ template bear::engine::model::model() : m_action(NULL), m_sample(NULL), m_current_snapshot(NULL) { } // model::model() /*----------------------------------------------------------------------------*/ /** * \brief Copy constructor. * \param that The instance to copy from. */ template bear::engine::model::model( const model& that ) : super(that), m_actor(that.m_actor), m_action(NULL), m_sample(NULL), m_current_snapshot(NULL) { } // model::model() /*----------------------------------------------------------------------------*/ /** * \brief Destructor */ template bear::engine::model::~model() { clear(); } // model::~model() /*----------------------------------------------------------------------------*/ /** * \brief Assignment operator. * \param that The instance to copy from. */ template bear::engine::model& bear::engine::model::operator=( const model& that ) { model tmp(that); std::swap(tmp, *this); return *this; } // model::operator=() /*----------------------------------------------------------------------------*/ /** * \brief Do the progression of the model. * \param elapsed_time Elapsed time since the last call. */ template void bear::engine::model::progress( universe::time_type elapsed_time ) { super::progress( elapsed_time ); progress_model(elapsed_time); } // model::progress() /*----------------------------------------------------------------------------*/ /** * \brief Get the sprites representing the item. * \param visuals (out) The sprites of the item, and their positions. */ template void bear::engine::model::get_visual( std::list& visuals ) const { if ( m_action!=NULL ) if ( m_snapshot != m_action->snapshot_end() ) { model_snapshot::const_mark_placement_iterator it; for ( it=m_snapshot->mark_placement_begin(); it!=m_snapshot->mark_placement_end(); ++it ) { const model_mark& mark( m_action->get_mark( it->get_mark_id() ) ); if ( mark.has_animation() && it->is_visible() ) visuals.push_front( get_mark_visual(mark, *it) ); } } } // model::get_visual() /*----------------------------------------------------------------------------*/ /** * \brief Set the model actor. * \param actor The model_actor to copy from. */ template void bear::engine::model::set_model_actor( const model_actor& actor ) { clear(); m_actor = actor; } // model::set_model_actor() /*----------------------------------------------------------------------------*/ /** * \brief Start an action. * \param name The name of the action to start. */ template void bear::engine::model::start_model_action( const std::string& name ) { model_action* a = m_actor.get_action( name ); if ( a != NULL ) { if ( a == m_action ) reset_action(0); else { stop_action(); m_action = a; m_action_name = name; start_action(0); } execute_snapshot(); } } // model::start_model_action() /*----------------------------------------------------------------------------*/ /** * \brief Switch to an other action. * \param name The name of the action to start. * \remark The difference with start_model_action is that the date is not reset * to zero. The new action begins at the date of the current action. */ template void bear::engine::model::switch_to_model_action( const std::string& name ) { model_action* a = m_actor.get_action( name ); if ( a != NULL ) if ( a != m_action ) { const universe::time_type d(m_date); stop_action(); m_action = a; m_action_name = name; start_action(d); } } // model::switch_to_model_action() /*----------------------------------------------------------------------------*/ /** * \brief Get the name of the current action. */ template const std::string& bear::engine::model::get_current_action_name() const { return m_action_name; } // model::get_current_action_name() /*----------------------------------------------------------------------------*/ /** * \brief Get an action from the model actor. * \param name The name of the action to get. */ template bear::engine::model_action const* bear::engine::model::get_action( const std::string& name ) const { return m_actor.get_action(name); } // model::get_action() /*----------------------------------------------------------------------------*/ /** * \brief Get the current action from the model actor. */ template bear::engine::model_action const* bear::engine::model::get_current_action() const { return m_action; } // model::get_current_action() /*----------------------------------------------------------------------------*/ /** * \brief Get the current action from the model actor. */ template const bear::engine::model_action::const_snapshot_iterator bear::engine::model::get_current_snapshot() const { CLAW_PRECOND( m_snapshot != model_action::const_snapshot_iterator() ); return m_snapshot; } // model::get_current_snapshot() /*----------------------------------------------------------------------------*/ /** * \brief Get the position of a mark relatively to the world. * \param i The identifier of the mark. */ template bear::universe::position_type bear::engine::model::get_mark_world_position( std::size_t i ) const { CLAW_PRECOND( m_snapshot != model_action::const_snapshot_iterator() ); CLAW_PRECOND( i < m_snapshot->get_mark_placements_count() ); model_mark_placement m; m.set_mark_id(i); get_mark_placement(m); return m.get_position(); } // model::get_mark_world_position() /*----------------------------------------------------------------------------*/ /** * \brief Get the position of a mark relatively to the world. * \param mark_name The name of the mark. */ template bear::universe::position_type bear::engine::model::get_mark_world_position ( const std::string& mark_name ) const { CLAW_PRECOND( m_snapshot != model_action::const_snapshot_iterator() ); CLAW_PRECOND( m_action != NULL ); return get_mark_world_position( m_action->get_mark_id(mark_name) ); } // model::get_mark_world_position() /*----------------------------------------------------------------------------*/ /** * \brief Get the model mark item placed on a given mark in the active action. * \param name The name of the mark. */ template bear::engine::model_mark_item* bear::engine::model::get_model_mark_item( const std::string& name ) const { if ( m_action != NULL ) { const std::size_t id = m_action->get_mark_id(name); if ( id != model_action::not_an_id ) return &(m_action->get_mark(id).get_box_item()); } return NULL; } // model::get_model_mark_item() /*----------------------------------------------------------------------------*/ /** * \brief Get the data associated to a mark placement, relatively to the world. * \param mark_name The name of the mark. * \param m (out) The mark placement. */ template bool bear::engine::model::get_mark_placement ( const std::string& mark_name, model_mark_placement& m ) const { if ( m_action != NULL ) return get_mark_placement( get_mark_id(mark_name), m ); else return false; } // model::get_mark_placement() /*----------------------------------------------------------------------------*/ /** * \brief Get the data associated to a mark placement in the current state of * the model and relatively to the model. * \param mark_name The name of the mark. * \param m (out) The mark placement. */ template bool bear::engine::model::get_current_local_mark_placement ( const std::string& mark_name, model_mark_placement& m ) const { if ( m_action != NULL ) return get_current_local_mark_placement( get_mark_id(mark_name), m ); else return false; } // model::get_current_local_mark_placement() /*----------------------------------------------------------------------------*/ /** * \brief Set the visibility of a mark in the current action. * \param name The name of the mark. * \param b The visibility of the mark. */ template void bear::engine::model::set_mark_visibility_in_action ( const std::string& name, bool b ) { if ( m_action == NULL ) return; const std::size_t id = m_action->get_mark_id(name); if ( id == model_action::not_an_id ) return; typename model_action::snapshot_iterator its; for (its=m_action->snapshot_begin(); its!=m_action->snapshot_end(); ++its) { model_mark_placement m = its->get_mark_placement(id); m.set_visibility(b); its->set_mark_placement(m); } m_current_snapshot->get_mark_placement(id).set_visibility(b); } // model::set_mark_visibility_in_action() /*----------------------------------------------------------------------------*/ /** * \brief Do the progression of the model. * \param elapsed_time Elapsed time since the last call. */ template void bear::engine::model::progress_model( universe::time_type elapsed_time ) { if ( m_action==NULL ) return; if ( m_snapshot==m_action->snapshot_end() ) return; const universe::time_type initial_time(m_date); m_date += elapsed_time; model_action::const_snapshot_iterator eit( m_action->get_snapshot_at(m_date) ); if (eit==m_snapshot) { progress_animations(initial_time, elapsed_time); update_sound_position(); m_current_snapshot->update(elapsed_time); update_bounding_box(); update_mark_items_positions(); } else progress_to_snapshot(initial_time, elapsed_time, eit); } // model::progress_model() /*----------------------------------------------------------------------------*/ /** * \brief Set a substitute for the animation of all marks with a given name. * \param mark_name The name of the mark. * \param anim The new animation on the mark. */ template void bear::engine::model::set_global_substitute ( const std::string& mark_name, const model_animation& anim ) { m_actor.set_global_substitute(mark_name, anim); } // model::set_global_substitute() /*----------------------------------------------------------------------------*/ /** * \brief Restore the default animation of all marks with a given name. * \param mark_name The name of the mark. */ template void bear::engine::model::remove_global_substitute ( const std::string& mark_name ) { m_actor.remove_global_substitute(mark_name); } // model::remove_global_substitute() /*----------------------------------------------------------------------------*/ /** * \brief Force the angle of a mark in all the snapshots of the current action. * \param mark_name The name of the mark. * \param angle The angle to apply to the mark. */ template void bear::engine::model::set_mark_angle_in_action ( const std::string& mark_name, double angle ) { if ( m_action == NULL ) return; const std::size_t id = m_action->get_mark_id(mark_name); if ( id == model_action::not_an_id ) return; for ( model_action::snapshot_iterator it=m_action->snapshot_begin(); it!=m_action->snapshot_end(); ++it ) { model_mark_placement m=it->get_mark_placement(id); m.set_angle(angle); it->set_mark_placement(m); } m_current_snapshot->get_mark_placement(id).set_angle( angle ); } // model::set_mark_angle_in_action() /*----------------------------------------------------------------------------*/ /** * \brief Force the position of a mark in all the snapshots of the current * action. * \param mark_name The name of the mark. * \param position The position to apply to the mark. */ template void bear::engine::model::set_mark_position_in_action ( const std::string& mark_name, universe::position_type position ) { if ( m_action == NULL ) return; std::size_t id = m_action->get_mark_id(mark_name); if ( id == model_action::not_an_id ) return; for ( model_action::snapshot_iterator it=m_action->snapshot_begin(); it!=m_action->snapshot_end(); ++it ) { model_mark_placement m=it->get_mark_placement(id); m.set_position(position); it->set_mark_placement(m); } m_current_snapshot->get_mark_placement(id).set_position( position ); } // model::set_mark_position_in_action() /*----------------------------------------------------------------------------*/ /** * \brief Get the identifier of a mark, given its name. * \param mark_name The name of the mark. */ template std::size_t bear::engine::model::get_mark_id ( const std::string& mark_name ) const { if ( m_action != NULL ) return m_action->get_mark_id(mark_name); else return model_action::not_an_id; } // model::get_mark_id() /*----------------------------------------------------------------------------*/ /** * \brief Get the identifier of a mark. * \param mark The mark for which we want the identifier. */ template std::size_t bear::engine::model::get_mark_id( const model_mark& mark ) const { return get_mark_id(mark.get_label()); } // model::get_mark_id() /*----------------------------------------------------------------------------*/ /** * \brief Get the data associated to a mark placement, relatively to the world. * \param i The id of the mark. * \param m (out) The mark placement. */ template bool bear::engine::model::get_mark_placement ( std::size_t i, model_mark_placement& m ) const { bool result = false; if ( m_action != NULL ) { if ( i < m_action->get_marks_count() ) { m.set_mark_id( i ); result = get_mark_placement(m); } } return result; } // model::get_mark_placement() /*----------------------------------------------------------------------------*/ /** * \brief Get the data associated to a mark placement, relatively to the world. * \param m (in/out) The mark placement. * * \remark You must set the mark identifier of \a m before calling. */ template bool bear::engine::model::get_mark_placement( model_mark_placement& m ) const { bool result(false); if ( m_snapshot != m_action->snapshot_end() ) { result = get_oriented_mark_placement(m); m.set_position( m.get_position() + this->get_bottom_left() ); m.set_angle( m.get_angle() + this->get_visual_angle() ); m.set_depth_position( m.get_depth_position() + this->get_z_position() ); } return result; } // model::get_mark_placement() /*----------------------------------------------------------------------------*/ /** * \brief Get the data associated to a mark placement in the current state of * the model and relatively to the model. * \param id The id of the mark. * \param m (out) The mark placement. */ template bool bear::engine::model::get_current_local_mark_placement ( std::size_t id, model_mark_placement& m ) const { bool result(false); if ( ( m_action != NULL ) && ( id < m_action->get_marks_count() ) && ( m_current_snapshot != NULL ) ) { m = m_current_snapshot->get_mark_placement( id ); result = true; } return result; } // model::get_current_local_mark_placement() /*----------------------------------------------------------------------------*/ /** * \brief Give a string representation of the item. * \param str (out) The result of the convertion. */ template void bear::engine::model::to_string( std::string& str ) const { super::to_string(str); std::string action("\naction: "); str += action + m_action_name; } // model::to_string() /*----------------------------------------------------------------------------*/ /** * \brief Removes the items of the mark from the layer when this item leaves its * layer. */ template void bear::engine::model::on_leaves_layer() { super::on_leaves_layer(); remove_all_mark_items_from_layer(); } // model::on_leaves_layer() /*----------------------------------------------------------------------------*/ /** * \brief Do the progression up to a given snapshot. * \param initial_type The value of m_date before the call to progress. * \param elapsed_time Elapsed time since the last call. * \param eit The snapshot to reach. */ template void bear::engine::model::progress_to_snapshot ( universe::time_type initial_time, universe::time_type elapsed_time, const model_action::const_snapshot_iterator& eit ) { model_action::const_snapshot_iterator it(m_snapshot); for ( ++it; it != eit; ++it ) { m_snapshot = it; execute_snapshot(); } if ( eit != m_action->snapshot_end() ) { m_snapshot = eit; create_tweeners(); execute_snapshot(); progress_animations(initial_time, elapsed_time); update_sound_position(); } else { const std::string action_name( m_action->get_next_action() ); const universe::time_type t( m_date - m_action->get_duration() ); if ( action_name.empty() ) { progress_animations(initial_time, elapsed_time); update_sound_position(); update_mark_items_positions(); } else { start_model_action( m_action->get_next_action() ); progress_model( t ); } } } // model::progress_to_snapshot() /*----------------------------------------------------------------------------*/ /** * \brief Execute a function associated with a snapshot. * \param name The name of the function. */ template void bear::engine::model::execute_function( const std::string& name ) { if ( !name.empty() ) this->execute(name); } // model::execute_function() /*----------------------------------------------------------------------------*/ /** * \brief Get the sprite displayed on a given mark. * \param mark The mark for which we want the sprite. * \param p The placement of this mark. */ templatebear::engine::scene_visual bear::engine::model::get_mark_visual ( const model_mark& mark, const model_mark_placement& p ) const { CLAW_PRECOND( m_action!=NULL ); CLAW_PRECOND( m_snapshot!=m_action->snapshot_end() ); CLAW_PRECOND( mark.has_animation() && p.is_visible() ); scene_visual v = this->get_scene_visual( *mark.get_animation() ); model_mark_placement m(p); get_oriented_mark_placement(m); if ( mark.apply_angle_to_animation() ) { double a ( v.scene_element.get_rendering_attributes().get_angle() + m.get_angle() ); if ( this->get_rendering_attributes().is_mirrored() ) a -= 3.14159; v.scene_element.get_rendering_attributes().set_angle(a); } v.z_position += m.get_depth_position(); const visual::rectangle_type bounding_box ( v.scene_element.get_bounding_box() ); v.scene_element.set_position ( m.get_position() + this->get_bottom_left() - bounding_box.size() / 2 + (v.scene_element.get_position() - bounding_box.bottom_left() )); if ( this->get_rendering_attributes().is_mirrored() ) v.scene_element.set_position ( v.scene_element.get_position().x - this->get_gap().x, v.scene_element.get_position().y ); else v.scene_element.set_position ( v.scene_element.get_position().x + this->get_gap().x, v.scene_element.get_position().y ); if ( this->get_rendering_attributes().is_flipped() ) v.scene_element.set_position ( v.scene_element.get_position().x, v.scene_element.get_position().y - this->get_gap().y ); else v.scene_element.set_position ( v.scene_element.get_position().x, v.scene_element.get_position().y + this->get_gap().y ); return v; } // model::get_mark_visual() /*----------------------------------------------------------------------------*/ /** * \brief Get the data associated to a mark placement, relatively to the * orientation of the model. * \param m (in/out) The mark placement. * * \remark You must set the mark identifier of \a m before calling. */ template bool bear::engine::model::get_oriented_mark_placement ( model_mark_placement& m ) const { bool result(false); if ( m_snapshot != m_action->snapshot_end() ) if ( m.get_mark_id() < m_action->get_marks_count() ) { result = true; m = m_current_snapshot->get_mark_placement( m.get_mark_id() ); const double rot( this->get_visual_angle() ); universe::coordinate_type dx(m.get_position().x); universe::coordinate_type dy(m.get_position().y); double a( m.get_angle() ); if ( this->get_rendering_attributes().is_mirrored() ) { dx = this->get_width() - dx; a = 3.14159265 - a; } if ( this->get_rendering_attributes().is_flipped() ) { dy = this->get_height() - dy; a = -a; } dx -= this->get_width() / 2; dy -= this->get_height() / 2; const universe::coordinate_type save_dx(dx); dx = dx * std::cos(rot) - dy * std::sin(rot) + this->get_width() / 2; dy = save_dx * std::sin(rot) + dy * std::cos(rot) + this->get_height() / 2; m.set_position( dx, dy ); m.set_angle(a); } return result; } // model::get_oriented_mark_placement() /*----------------------------------------------------------------------------*/ /** * \brief Start the current action. * \param d The date at which the action is reset (new start). */ template void bear::engine::model::start_action( universe::time_type d ) { CLAW_PRECOND(m_action != NULL); delete m_sample; m_sample = NULL; const std::string s( m_action->get_sound_name() ); if ( this->get_level_globals().sound_exists(s) ) { m_sample = this->get_level_globals().new_sample(s); audio::sound_effect effect; if ( !m_action->sound_is_global() ) effect.set_position( this->get_center_of_mass() ); effect.set_loops(0); m_sample->play( effect ); } reset_action(d); } // model::start_action() /*----------------------------------------------------------------------------*/ /** * \brief Stop the current action. */ template void bear::engine::model::stop_action() { if ( m_action == NULL ) return; if ( m_sample != NULL ) { m_sample->stop(); delete m_sample; m_sample = NULL; } remove_all_mark_items_from_layer(); m_action = NULL; m_snapshot = model_action::snapshot_iterator(); delete m_current_snapshot; m_current_snapshot = NULL; } // model::stop_action() /*----------------------------------------------------------------------------*/ /** * \brief Reset the current action. * \param d The date at which the action is reset (new start). */ template void bear::engine::model::reset_action( universe::time_type d ) { CLAW_PRECOND(m_action != NULL); universe::time_type remaining_time(0); if ( d <= m_action->get_duration() ) m_date = d; else { remaining_time = d - m_action->get_duration(); m_date = m_action->get_duration(); } m_snapshot = m_action->get_snapshot_at(m_date); create_tweeners(); model_action::mark_iterator it; for ( it=m_action->mark_begin(); it!=m_action->mark_end(); ++it ) if ( it->reset_animation_with_action() ) { if ( it->get_label() == "fire" ) std::cout << "reset fire in " << m_action_name << std::endl; it->get_animation()->reset(); } progress_animations(0, m_date, true); if ( remaining_time != 0 ) { const std::string action_name( m_action->get_next_action() ); if ( action_name.empty() ) { progress_animations(m_date, remaining_time); m_date = d; update_sound_position(); } else { m_date = remaining_time; switch_to_model_action(action_name); } } } // model::reset_action() /*----------------------------------------------------------------------------*/ /** * \brief Update the position of the sound emitted by the model. */ template void bear::engine::model::update_sound_position() { if ( (m_sample != NULL) && (m_action!=NULL) ) if ( !m_action->sound_is_global() ) { audio::sound_effect effect( m_sample->get_effect() ); effect.set_position( this->get_center_of_mass() ); m_sample->set_effect( effect ); } } // model::update_sound_position() /*----------------------------------------------------------------------------*/ /** * \brief Do the progression of the animations of the marks. * \param initial_time The date at which the animations where stopped. * \param elapsed_time Elapsed time since \a initial_time. */ template void bear::engine::model::progress_animations ( universe::time_type initial_time, universe::time_type elapsed_time, bool only_finite ) { // We must pay attention not to call next() several times on the same // animation, in the case where an animation is shared by several marks. // Also, for the animations paused when the mark is hidden, we must save the // time during which the animation effectively evolves. typedef std::map anim_map_type; anim_map_type anim; model_action::mark_iterator it; for ( it=m_action->mark_begin(); it!=m_action->mark_end(); ++it ) if ( it->has_animation() ) if ( !only_finite || it->get_animation()->is_finite() ) { const model_animation a=it->get_animation(); const anim_map_type::iterator ita=anim.find(a); const universe::time_type d ( m_action->accumulated_mark_visibility ( *it, initial_time, initial_time + elapsed_time ) ); if ( ita == anim.end() ) anim[a] = d; else if (ita->second < d ) ita->second = d; } for ( ; !anim.empty(); anim.erase(anim.begin()) ) anim.begin()->first->next(anim.begin()->second); } // model::progress_animations() /*----------------------------------------------------------------------------*/ /** * \brief Execute the current action. */ template void bear::engine::model::execute_snapshot() { std::string s( m_snapshot->get_random_sound_name() ); if ( this->get_level_globals().sound_exists(s) ) { audio::sound_effect effect; if ( !m_snapshot->sound_is_global() ) effect.set_position( this->get_center_of_mass() ); effect.set_loops(1); this->get_level_globals().play_sound( s, effect ); } update_bounding_box(); update_mark_items(); execute_function( m_snapshot->get_function() ); } // model::execute_snapshot() /*----------------------------------------------------------------------------*/ /** * \brief Set the bounding box of the item according to the new action. */ template void bear::engine::model::update_mark_items() { CLAW_PRECOND( m_snapshot != model_action::snapshot_iterator() ); model_snapshot_tweener::const_mark_placement_iterator it; for ( it=m_current_snapshot->mark_placement_begin(); it!=m_current_snapshot->mark_placement_end(); ++it ) if ( !it->is_visible() || it->get_collision_function().empty() || (it->get_size().x == 0) || (it->get_size().y == 0) ) m_action->get_mark( it->get_mark_id() ).drop_box_item_from_layer(); else { add_mark_item_in_layer( it->get_mark_id() ); model_mark_item& item = m_action->get_mark(it->get_mark_id()).get_box_item(); item.set_collision_function( it->get_collision_function() ); } update_mark_items_positions(); } // model::update_mark_items() /*----------------------------------------------------------------------------*/ /** * \brief Set the position and the size of the mark items. */ template void bear::engine::model::update_mark_items_positions() { CLAW_PRECOND( m_snapshot != model_action::snapshot_iterator() ); for ( std::size_t i=0; i!=m_snapshot->get_mark_placements_count(); ++i ) { model_mark_placement m; get_mark_placement(i, m); model_mark_item& item = m_action->get_mark(i).get_box_item(); item.set_size( m.get_size() ); item.set_center_of_mass( m.get_position() ); item.set_z_position( m.get_depth_position() ); const bool empty_mark( (m.get_size().x == 0) || (m.get_size().y == 0) ); item.set_can_move_items( !empty_mark && this->can_move_items() ); item.set_artificial( empty_mark || this->is_artificial() ); item.set_weak_collisions( empty_mark || this->has_weak_collisions() ); } } // model::update_mark_item_positions() /*----------------------------------------------------------------------------*/ /** * \brief Set the bounding box of the item according to the new action. */ template void bear::engine::model::update_bounding_box() { update_bounding_box_width(); update_bounding_box_height(); } // model::update_bounding_box() /*----------------------------------------------------------------------------*/ /** * \brief Set the width bounding box of the item according to the new action. */ template void bear::engine::model::update_bounding_box_width() { universe::coordinate_type delta( m_snapshot->get_x_alignment_value() ); universe::coordinate_type pos; model_snapshot::horizontal_alignment::value a ( m_snapshot->get_x_alignment() ); if ( this->get_rendering_attributes().is_mirrored() ) { if ( a == model_snapshot::horizontal_alignment::align_left ) a = model_snapshot::horizontal_alignment::align_right; else if ( a == model_snapshot::horizontal_alignment::align_right ) a = model_snapshot::horizontal_alignment::align_left; delta = -delta; } switch ( a ) { case model_snapshot::horizontal_alignment::align_left: pos = this->get_left(); this->set_width( m_snapshot->get_width() ); this->set_left( pos + delta ); break; case model_snapshot::horizontal_alignment::align_right: pos = this->get_right(); this->set_width( m_snapshot->get_width() ); this->set_right( pos + delta ); break; case model_snapshot::horizontal_alignment::align_center: pos = this->get_horizontal_middle(); this->set_width( m_snapshot->get_width() ); this->set_horizontal_middle( pos + delta ); } } // model::update_bounding_box_width() /*----------------------------------------------------------------------------*/ /** * \brief Set the height bounding box of the item according to the new action. */ template void bear::engine::model::update_bounding_box_height() { universe::coordinate_type delta( m_snapshot->get_y_alignment_value() ); universe::coordinate_type pos; model_snapshot::vertical_alignment::value a( m_snapshot->get_y_alignment() ); if ( this->get_rendering_attributes().is_flipped() ) { if ( a == model_snapshot::vertical_alignment::align_bottom ) a = model_snapshot::vertical_alignment::align_top; else if ( a == model_snapshot::vertical_alignment::align_top ) a = model_snapshot::vertical_alignment::align_bottom; delta = -delta; } switch ( a ) { case model_snapshot::vertical_alignment::align_bottom: pos = this->get_bottom(); this->set_height( m_snapshot->get_height() ); this->set_bottom( pos + delta ); break; case model_snapshot::vertical_alignment::align_top: pos = this->get_top(); this->set_height( m_snapshot->get_height() ); this->set_top( pos + delta ); break; case model_snapshot::vertical_alignment::align_center: pos = this->get_vertical_middle(); this->set_height( m_snapshot->get_height() ); this->set_vertical_middle( pos + delta ); } } // model::update_bounding_box_height() /*----------------------------------------------------------------------------*/ /** * \brief Clear the model. Delete the functions, the sample. */ template void bear::engine::model::clear() { delete m_sample; m_sample = NULL; remove_all_mark_items_from_layer(); m_action = NULL; m_action_name.clear(); m_snapshot = model_action::const_snapshot_iterator(); delete m_current_snapshot; m_current_snapshot = NULL; } // model::clear() /*----------------------------------------------------------------------------*/ /** * \brief Remove the items associated with the mark from the layer where the * model is. */ template void bear::engine::model::remove_all_mark_items_from_layer() const { if ( m_action == NULL ) return; for ( std::size_t i=0; i!=m_action->get_marks_count(); ++i ) m_action->get_mark(i).drop_box_item_from_layer(); } // model::remove_all_mark_items_from_layer() /*----------------------------------------------------------------------------*/ /** * \brief Add an item associated with a mark in the same layer than the model. * \param i The index of the mark whose item is added in the layer. */ template void bear::engine::model::add_mark_item_in_layer( std::size_t i ) { model_mark& mark( m_action->get_mark(i) ); mark.add_box_item_in_layer( this->get_layer() ); mark.get_box_item().set_model_item( *this ); universe::forced_tracking mvt; mvt.set_distance( universe::position_type(0, 0) ); mvt.set_reference_point ( model_mark_reference_point< model >( *this, mark.get_label() ) ); mark.get_box_item().set_forced_movement( mvt ); } // model::add_mark_item_in_layer() /*----------------------------------------------------------------------------*/ /** * \brief Create the tweeners for the current snapshot. */ template void bear::engine::model::create_tweeners() { CLAW_PRECOND( m_action != NULL ); CLAW_PRECOND( m_snapshot != m_action->snapshot_end() ); delete m_current_snapshot; m_current_snapshot = NULL; model_action::const_snapshot_iterator it(m_snapshot); ++it; if ( it != m_action->snapshot_end() ) create_tweeners_to_snapshot( *it ); else if ( !m_action->get_next_action().empty() ) create_tweeners_to_action( *get_action(m_action->get_next_action()) ); else m_current_snapshot = new model_snapshot_tweener(*m_snapshot); } // model::create_tweeners() /*----------------------------------------------------------------------------*/ /** * \brief Create the tweeners to an other snapshot of the current action. * \param s The other snapshot. */ template void bear::engine::model::create_tweeners_to_snapshot ( const model_snapshot& s ) { CLAW_PRECOND( m_action != NULL ); CLAW_PRECOND( m_snapshot != m_action->snapshot_end() ); m_current_snapshot = new model_snapshot_tweener ( *m_snapshot, s, *m_action, *m_action, s.get_date() - m_snapshot->get_date()); } // model::create_tweeners_to_snapshot() /*----------------------------------------------------------------------------*/ /** * \brief Create the tweeners to the first snapshot of an other action. * \param a The other action. */ template void bear::engine::model::create_tweeners_to_action ( const model_action& a ) { CLAW_PRECOND( m_action != NULL ); CLAW_PRECOND( m_snapshot != m_action->snapshot_end() ); const universe::time_type d = std::max( 0.0, m_action->get_duration() - m_snapshot->get_date() ); m_current_snapshot = new model_snapshot_tweener ( *m_snapshot, *a.snapshot_begin(), *m_action, a, d ); } // model::create_tweeners_to_action() /*----------------------------------------------------------------------------*/ /** * \brief Export the methods of the class. */ template void bear::engine::model::init_exported_methods() { TEXT_INTERFACE_CONNECT_METHOD_1 ( model, start_model_action, void, const std::string& ); } // model::init_exported_methods() /*----------------------------------------------------------------------------*/ TEXT_INTERFACE_IMPLEMENT_TEMPLATE_METHOD_LIST_1( bear::engine::model, class, Base ) plee-the-bear-20251226/bear-engine/core/src/engine/impl/stat_variable.tpp000066400000000000000000000014061512343254000260370ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::engine::stat_variable structure. * \author Julien Jorge */ #include "engine/stat_variable.hpp" #include /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param n The name of the variable. * \param v The value of the variable. */ template bear::engine::stat_variable::stat_variable( std::string n, ValueType v ) { name = n; std::ostringstream oss; oss << v; value = oss.str(); } // stat_variable::stat_variable() plee-the-bear-20251226/bear-engine/core/src/engine/item_brick/000077500000000000000000000000001512343254000236405ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/core/src/engine/item_brick/activable_sides.hpp000066400000000000000000000027051512343254000274760ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief An item with a boolean associated to each side. * \author Julien Jorge */ #ifndef __ENGINE_ACTIVABLE_SIDES_HPP__ #define __ENGINE_ACTIVABLE_SIDES_HPP__ #include "engine/class_export.hpp" namespace bear { namespace engine { /** * \brief An item with a boolean associated to each side. * \author Julien Jorge */ class ENGINE_EXPORT activable_sides { public: activable_sides(); bool left_side_is_active() const; bool right_side_is_active() const; bool top_side_is_active() const; bool bottom_side_is_active() const; void set_left_side_activation(bool a); void set_right_side_activation(bool a); void set_top_side_activation(bool a); void set_bottom_side_activation(bool a); private: /** \brief Tell if the left side is solid. */ bool m_left_side_is_active; /** \brief Tell if the right side is solid. */ bool m_right_side_is_active; /** \brief Tell if the top side is solid. */ bool m_top_side_is_active; /** \brief Tell if the bottom side is solid. */ bool m_bottom_side_is_active; }; // class activable_sides } // namespace engine } // namespace bear #endif // __ENGINE_ACTIVABLE_SIDES_HPP__ plee-the-bear-20251226/bear-engine/core/src/engine/item_brick/basic_renderable_item.hpp000066400000000000000000000070361512343254000306410ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A renderable item. * \author Sebastien Angibaud */ #ifndef __ENGINE_BASIC_RENDERABLE_ITEM_HPP__ #define __ENGINE_BASIC_RENDERABLE_ITEM_HPP__ #include "engine/scene_visual.hpp" #include "engine/item_brick/with_rendering_attributes.hpp" #include "visual/sprite_sequence.hpp" #include #include #include namespace bear { namespace engine { /** * \brief A renderable item. * * \b template \b parameters : * - \a Base : the base class for this item. Must inherit from * engine::base_item, * * \author Sebastien Angibaud */ template class basic_renderable_item: public Base, public with_rendering_attributes { typedef Base super; public: basic_renderable_item(); void on_enters_layer(); void progress( bear::universe::time_type elapsed_time ); bool set_real_field( const std::string& name, double value ); bool set_integer_field( const std::string& name, int value ); bool set_bool_field( const std::string& name, bool value ); bool set_color_field ( const std::string& name, visual::color value ); const visual::position_type& get_gap() const; visual::position_type get_oriented_gap ( visual::coordinate_type w, visual::coordinate_type h ) const; void set_gap( const visual::position_type& gap ); void set_gap( visual::coordinate_type x, visual::coordinate_type y ); void set_gap_x( visual::coordinate_type x ); void set_gap_y( visual::coordinate_type y ); void set_auto_mirror( bool b ); void set_auto_flip( bool b ); double get_visual_angle() const; void set_system_angle_as_visual_angle( bool b ); void set_auto_angular_speed_factor(double factor); protected: void add_visual ( const visual::scene_element& v, std::list& visuals ) const; void add_visual ( const visual::sprite& spr, std::list& visuals ) const; void add_visual ( const visual::sprite_sequence& seq, std::list& visuals ) const; scene_visual get_scene_visual( const visual::scene_element& e ) const; scene_visual get_scene_visual( const visual::sprite& spr ) const; scene_visual get_scene_visual( const visual::sprite_sequence& seq ) const; private: visual::bitmap_rendering_attributes get_auto_rendering_attributes() const; private: /** \brief The gap between position of the item and the position of his sprite. */ visual::position_type m_gap; /** \brief Tell if we use the system angle of the item as the visual angle. */ bool m_system_angle_as_visual; /** \brief Tell if we automatically mirror the item if needed. */ bool m_auto_mirror; /** \brief Tell if we automatically flip the item if needed. */ bool m_auto_flip; /** \brief The factor of movement applied at angular speed. */ double m_auto_angular_speed_factor; /** \brief The visual position in the last iteration. */ bear::universe::position_type m_last_visual_position; }; // class basic_renderable_item } // namespace engine } // namespace bear #include "engine/item_brick/impl/basic_renderable_item.tpp" #endif // __ENGINE_BASIC_RENDERABLE_ITEM_HPP__ plee-the-bear-20251226/bear-engine/core/src/engine/item_brick/code/000077500000000000000000000000001512343254000245525ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/core/src/engine/item_brick/code/activable_sides.cpp000066400000000000000000000055351512343254000304070ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::engine::activable_sides class. * \author Julien Jorge */ #include "engine/item_brick/activable_sides.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Contructor. */ bear::engine::activable_sides::activable_sides() : m_left_side_is_active(false), m_right_side_is_active(false), m_top_side_is_active(false), m_bottom_side_is_active(false) { } // activable_sides::activable_sides() /*----------------------------------------------------------------------------*/ /** * \brief Tell if the left side is active. */ bool bear::engine::activable_sides::left_side_is_active() const { return m_left_side_is_active; } // activable_sides::left_side_is_active() /*----------------------------------------------------------------------------*/ /** * \brief Tell if the right side is active. */ bool bear::engine::activable_sides::right_side_is_active() const { return m_right_side_is_active; } // activable_sides::right_side_is_active() /*----------------------------------------------------------------------------*/ /** * \brief Tell if the top side is active. */ bool bear::engine::activable_sides::top_side_is_active() const { return m_top_side_is_active; } // activable_sides::top_side_is_active() /*----------------------------------------------------------------------------*/ /** * \brief Tell if the bottom side is active. */ bool bear::engine::activable_sides::bottom_side_is_active() const { return m_bottom_side_is_active; } // activable_sides::bottom_side_is_active() /*----------------------------------------------------------------------------*/ /** * \brief Set left side activation. */ void bear::engine::activable_sides::set_left_side_activation(bool a) { m_left_side_is_active = a; } // activable_sides::set_left_side_activation() /*----------------------------------------------------------------------------*/ /** * \brief Set right side activation. */ void bear::engine::activable_sides::set_right_side_activation(bool a) { m_right_side_is_active = a; } // activable_sides::set_right_side_activation() /*----------------------------------------------------------------------------*/ /** * \brief Set tom side activation. */ void bear::engine::activable_sides::set_top_side_activation(bool a) { m_top_side_is_active = a; } // activable_sides::set_top_side_activation() /*----------------------------------------------------------------------------*/ /** * \brief Set bottom side activation. */ void bear::engine::activable_sides::set_bottom_side_activation(bool a) { m_bottom_side_is_active = a; } // activable_sides::set_top_side_activation() plee-the-bear-20251226/bear-engine/core/src/engine/item_brick/code/forced_movement_applicator.cpp000066400000000000000000000025441512343254000326550ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::engine::forced_movement_applicator class. * \author Sebastien Angibaud */ #include "engine/item_brick/forced_movement_applicator.hpp" #include "engine/base_item.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Tell if all required fields are initialized. */ bool bear::engine::forced_movement_applicator::is_valid() const { return !m_movement.is_null(); } // forced_movement_applicator::is_valid() /*----------------------------------------------------------------------------*/ /** * \brief Get the movement. */ const bear::universe::forced_movement& bear::engine::forced_movement_applicator::get_movement() const { return m_movement; } // forced_movement_applicator::get_movement() /*----------------------------------------------------------------------------*/ /** * \brief Initialize the item. */ void bear::engine::forced_movement_applicator::give_movement() { for (unsigned int i=0; i!=m_actor.size(); ++i) if ( m_actor[i] != (handle_type)NULL ) m_actor[i]->set_forced_movement(m_movement); } // forced_movement_applicator::give_movement() plee-the-bear-20251226/bear-engine/core/src/engine/item_brick/code/forced_movement_repeater.cpp000066400000000000000000000034431512343254000323250ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::engine::forced_movement_repeater class. * \author Julien Jorge */ #include "engine/item_brick/forced_movement_repeater.hpp" #include "engine/base_item.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ bear::engine::forced_movement_repeater::forced_movement_repeater() : m_actor(NULL), m_count(0), m_delay(0) { } // forced_movement_repeater::forced_movement_repeater() /*----------------------------------------------------------------------------*/ /** * \brief Destructor. */ bear::engine::forced_movement_repeater::~forced_movement_repeater() { delete m_actor; } // forced_movement_repeater::~forced_movement_repeater() /*----------------------------------------------------------------------------*/ /** * \brief Tell if all required fields are initialized. */ bool bear::engine::forced_movement_repeater::is_valid() const { return !m_movement.is_null() && (m_delay >= 0); } // forced_movement_repeater::is_valid() /*----------------------------------------------------------------------------*/ /** * \brief Create the clones and apply the movement to them. */ void bear::engine::forced_movement_repeater::give_movement() { CLAW_PRECOND( m_actor != NULL ); m_actor->set_forced_movement( m_movement ); for (unsigned int i=0; i!=m_count; ++i) { base_item* const c = m_actor->clone(); m_actor->new_item( *c ); c->set_forced_movement( m_movement ); c->move( (i+1) * m_delay ); } m_actor = NULL; } // forced_movement_repeater::give_movement() with_boolean_expression_assignment.cpp000066400000000000000000000020631512343254000343610ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/core/src/engine/item_brick/code/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::engine::with_boolean_expression_assignment * class. * \author Julien Jorge */ #include "engine/item_brick/with_boolean_expression_assignment.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Destructor. */ bear::engine::with_boolean_expression_assignment:: ~with_boolean_expression_assignment () { // nothing to do } // with_boolean_expression_assignment::~with_boolean_expression_assignment() /*----------------------------------------------------------------------------*/ /** * \brief Set the expression. * \param e The expression to assign to the item. */ void bear::engine::with_boolean_expression_assignment::set_expression ( const expr::boolean_expression& e ) { do_set_expression(e); } // with_boolean_expression_assignment::set_expression() with_boolean_expression_creation.cpp000066400000000000000000000017621512343254000340220ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/core/src/engine/item_brick/code/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::engine::with_boolean_expression_creation * class. * \author Julien Jorge */ #include "engine/item_brick/with_boolean_expression_creation.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Destructor. */ bear:: engine::with_boolean_expression_creation::~with_boolean_expression_creation() { // nothing to do } // with_boolean_expression_creation::~with_boolean_expression_creation() /*----------------------------------------------------------------------------*/ /** * \brief Get the expression. */ bear::expr::boolean_expression bear::engine::with_boolean_expression_creation::get_expression() const { return do_get_expression(); } // with_boolean_expression_creation::get_expression() with_linear_expression_assignment.cpp000066400000000000000000000020521512343254000342120ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/core/src/engine/item_brick/code/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::engine::with_linear_expression_assignment * class. * \author Julien Jorge */ #include "engine/item_brick/with_linear_expression_assignment.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Destructor. */ bear::engine::with_linear_expression_assignment:: ~with_linear_expression_assignment () { // nothing to do } // with_linear_expression_assignment::~with_linear_expression_assignment() /*----------------------------------------------------------------------------*/ /** * \brief Set the expression. * \param e The expression to assign to the item. */ void bear::engine::with_linear_expression_assignment::set_expression ( const expr::linear_expression& e ) { do_set_expression(e); } // with_linear_expression_assignment::set_expression() with_linear_expression_creation.cpp000066400000000000000000000017511512343254000336530ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/core/src/engine/item_brick/code/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::engine::with_linear_expression_creation * class. * \author Julien Jorge */ #include "engine/item_brick/with_linear_expression_creation.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Destructor. */ bear::engine::with_linear_expression_creation::~with_linear_expression_creation () { // nothing to do } // with_linear_expression_creation::~with_linear_expression_creation() /*----------------------------------------------------------------------------*/ /** * \brief Get the expression. */ bear::expr::linear_expression bear::engine::with_linear_expression_creation::get_expression() const { return do_get_expression(); } // with_linear_expression_creation::get_expression() plee-the-bear-20251226/bear-engine/core/src/engine/item_brick/code/with_rendering_attributes.cpp000066400000000000000000000032661512343254000325430ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::engine::with_rendering_attributes class. * \author Julien Jorge */ #include "engine/item_brick/with_rendering_attributes.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Destructor. */ bear::engine::with_rendering_attributes::~with_rendering_attributes() { // Nothing to do. } // with_rendering_attributes::~with_rendering_attributes() /*----------------------------------------------------------------------------*/ /** * \brief Get the rendering attributes. */ bear::visual::bitmap_rendering_attributes& bear::engine::with_rendering_attributes::get_rendering_attributes() { return m_rendering_attributes; } // with_rendering_attributes::get_rendering_attributes() /*----------------------------------------------------------------------------*/ /** * \brief Get the rendering attributes. */ const bear::visual::bitmap_rendering_attributes& bear::engine::with_rendering_attributes::get_rendering_attributes() const { return m_rendering_attributes; } // with_rendering_attributes::get_rendering_attributes() /*----------------------------------------------------------------------------*/ /** * \brief Set the rendering attributes. * \param attr The rendering attributes. */ void bear::engine::with_rendering_attributes::set_rendering_attributes ( const visual::bitmap_rendering_attributes& attr ) { m_rendering_attributes = attr; } // with_rendering_attributes::set_rendering_attributes() plee-the-bear-20251226/bear-engine/core/src/engine/item_brick/code/with_text.cpp000066400000000000000000000075131512343254000273030ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::engine::with_text class. * \author Julien Jorge */ #include "engine/item_brick/with_text.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ bear::engine::with_text::with_text() : m_horizontal_align( visual::text_align::align_left ), m_vertical_align( visual::text_align::align_top ) { } // with_text::with_text() /*----------------------------------------------------------------------------*/ /** * \brief Set the text of the item. * \param text The text. */ void bear::engine::with_text::set_text( const std::string& text ) { m_text = text; refresh_writing(); } // with_text::set_text() /*----------------------------------------------------------------------------*/ /** * \brief Get the text of the item. */ const std::string& bear::engine::with_text::get_text() const { return m_text; } // with_text::get_text() /*----------------------------------------------------------------------------*/ /** * \brief Set the font of the text. * \param f The font. */ void bear::engine::with_text::set_font( const visual::font& f ) { m_font = f; refresh_writing(); } // with_text::set_font() /*----------------------------------------------------------------------------*/ /** * \brief Get the font of the text. */ const bear::visual::font& bear::engine::with_text::get_font() const { return m_font; } // with_text::get_font() /*----------------------------------------------------------------------------*/ /** * \brief Sets the horizontal alignment of the text. * \param a The horizontal alignment. */ void bear::engine::with_text::set_horizontal_align ( visual::text_align::horizontal_align a ) { m_horizontal_align = a; refresh_writing(); } // with_text::set_horizontal_align() /*----------------------------------------------------------------------------*/ /** * \brief Gets the horizontal alignment of the text. */ bear::visual::text_align::horizontal_align bear::engine::with_text::get_horizontal_align() const { return m_horizontal_align; } // with_text::get_horizontal_align() /*----------------------------------------------------------------------------*/ /** * \brief Sets the vertical alignment of the text. * \param a The vertical alignment. */ void bear::engine::with_text::set_vertical_align ( visual::text_align::vertical_align a ) { m_vertical_align = a; refresh_writing(); } // with_text::set_vertical_align() /*----------------------------------------------------------------------------*/ /** * \brief Gets the vertical alignment of the text. */ bear::visual::text_align::vertical_align bear::engine::with_text::get_vertical_align() const { return m_vertical_align; } // with_text::get_vertical_align() /*----------------------------------------------------------------------------*/ /** * \brief Return the writing of the text with the font. */ const bear::visual::writing& bear::engine::with_text::get_writing() const { return m_writing; } // with_text::get_writing() /*----------------------------------------------------------------------------*/ /** * \brief Fit the text in a box. * \param s The bounds of the text. */ void bear::engine::with_text::fit_in_box( const universe::size_box_type& s ) { m_writing.create( m_font, m_text, s, m_horizontal_align, m_vertical_align ); } // with_text::fit_in_box() /*----------------------------------------------------------------------------*/ /** * \brief Refresh the content of the writing. */ void bear::engine::with_text::refresh_writing() { m_writing.create( m_font, m_text, m_horizontal_align, m_vertical_align ); } // with_text::refresh_writing() plee-the-bear-20251226/bear-engine/core/src/engine/item_brick/code/with_toggle.cpp000066400000000000000000000043031512343254000275720ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::engine::with_toggle class. * \author Julien Jorge */ #include "engine/item_brick/with_toggle.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Change the state of the toggle. * \param activator The item that activates the toggle, if any. */ void bear::engine::with_toggle::toggle( base_item* activator ) { toggle( !is_on(), activator ); } // with_toggle::toggle() /*----------------------------------------------------------------------------*/ /** * \brief Change the state of the toggle. * \param b The new state. * \param activator The item that activates the toggle, if any. */ void bear::engine::with_toggle::toggle( bool b, base_item* activator ) { if ( b ) { if ( !is_on() ) toggle_on( activator ); } else if ( is_on() ) toggle_off( activator ); } // with_toggle::toggle() /*----------------------------------------------------------------------------*/ /** * \brief Get the delay before the toggle goes automatically off after being * turned on. */ bear::universe::time_type bear::engine::with_toggle::get_delay() const { return 0; } // get_delay() /*----------------------------------------------------------------------------*/ /** * \brief Turn the toggle on. * \param activator The item that activates the toggle, if any. */ void bear::engine::with_toggle::toggle_on( base_item* activator ) { // nothing to do } // with_toggle::toggle_on() /*----------------------------------------------------------------------------*/ /* * \brief Turn the toggle on. * \param activator The item that activates the toggle, if any. */ void bear::engine::with_toggle::toggle_off( base_item* activator ) { // nothing to do } // with_toggle::toggle_off() /*----------------------------------------------------------------------------*/ /** * \brief Tell if the toggle is turned on. */ bool bear::engine::with_toggle::is_on() const { return false; } // with_toggle::is_on() plee-the-bear-20251226/bear-engine/core/src/engine/item_brick/code/with_trigger.cpp000066400000000000000000000111521512343254000277540ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::engine::with_trigger class. * \author Julien Jorge */ #include "engine/item_brick/with_trigger.hpp" #include "engine/item_brick/with_toggle.hpp" #include "universe/physical_item.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ bear::engine::with_trigger::with_trigger() : m_colliding_item(NULL), m_collision_info(NULL) { } // with_trigger::with_trigger() /*----------------------------------------------------------------------------*/ /** * \brief Copy constructor. * \param that The instance to copy from. */ bear::engine::with_trigger::with_trigger( const with_trigger& that ) : with_boolean_expression_assignment(that), m_colliding_item(NULL), m_collision_info(NULL) { // the collision_in_expression in the expression cannot be copied, so we just // not copy the expression. } // with_trigger::with_trigger() /*----------------------------------------------------------------------------*/ /** * \brief Assignment. * \param that The instance to copy from. */ bear::engine::with_trigger bear::engine::with_trigger::operator=( const with_trigger& that ) { // the collision_in_expression in the expression cannot be copied, so we just // not copy the expression. return *this; } // with_trigger::operator=() /*----------------------------------------------------------------------------*/ /** * \brief Set the condition to verify to turn on the toggles. */ void bear::engine::with_trigger::set_condition ( const expr::boolean_expression& e ) { m_condition = e; } // with_trigger::set_condition() /*----------------------------------------------------------------------------*/ /** * \brief Get the condition to verify to turn on the toggles. */ const bear::expr::boolean_expression& bear::engine::with_trigger::get_condition() const { return m_condition; } // with_trigger::get_condition() /*----------------------------------------------------------------------------*/ /** * \brief Get the informations on a collision that can be used in an expression. */ bear::engine::collision_in_expression bear::engine::with_trigger::get_collision_in_expression() const { return collision_in_expression(&m_colliding_item, &m_collision_info); } // with_trigger::get_collision_in_expression() /*----------------------------------------------------------------------------*/ /** * \brief Set the informations on a collision that can be used in an expression. * \param that The colliding item. * \param info Some informations about the collision. */ void bear::engine::with_trigger::set_collision_data ( base_item& that, universe::collision_info& info ) { m_colliding_item = &that; m_collision_info = &info; } // with_trigger::set_collision_data() /*----------------------------------------------------------------------------*/ /** * \brief Set the informations on a collision that can be used in an expression. */ void bear::engine::with_trigger::clear_collision_data() { m_colliding_item = NULL; m_collision_info = NULL; } // with_trigger::clear_collision_data() /*----------------------------------------------------------------------------*/ /** * \brief Check the condition and call the adequate on_trigger_* method. * \param activator The item that activated the trigger. */ void bear::engine::with_trigger::check_condition( base_item* activator ) { if ( m_condition ) on_trigger_on(activator); else on_trigger_off(activator); } // with_trigger::check_condition() /*----------------------------------------------------------------------------*/ /** * \brief Function called when the trigger is activated. * \param activator The item that activated the trigger. */ void bear::engine::with_trigger::on_trigger_on( base_item* activator ) { } // with_trigger::on_trigger_on() /*----------------------------------------------------------------------------*/ /** * \brief Function called when the trigger is deactivated. * \param activator The item that activated the trigger. */ void bear::engine::with_trigger::on_trigger_off( base_item* activator ) { } // with_trigger::on_trigger_off() /*----------------------------------------------------------------------------*/ /** * \brief Set the expression used for the condition. * \param e The expression. */ void bear::engine::with_trigger::do_set_expression ( const expr::boolean_expression& e ) { set_condition(e); } // with_trigger::do_set_expression() plee-the-bear-20251226/bear-engine/core/src/engine/item_brick/code/z_shift.cpp000066400000000000000000000037651512343254000267370ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::engine::z_shift class. * \author Julien Jorge */ #include "engine/item_brick/z_shift.hpp" #include "engine/base_item.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Contructor. */ bear::engine::z_shift::z_shift() : m_z_shift(0), m_force_z_position(false) { } // z_shift::z_shift() /*----------------------------------------------------------------------------*/ /** * \brief Set the amount of shifting. * \param s The amount. */ void bear::engine::z_shift::set_z_shift( int s ) { m_z_shift = s; } // z_shift::set_z_shift() /*----------------------------------------------------------------------------*/ /** * \brief Indicates if the item force the z_position. * \param b True to force the z position. */ void bear::engine::z_shift::set_force_z_position( bool b ) { m_force_z_position = b; } // set_force_z_position() /*----------------------------------------------------------------------------*/ /** * \brief Shift a item on the z axis. * \param that The item to shift. * \param ref The item according to which \a that is shifted. */ void bear::engine::z_shift::do_z_shift ( base_item& that, const base_item& ref ) const { if ( !that.is_z_fixed() ) { const int that_z( that.get_z_position() ); const int ref_z( ref.get_z_position() ); if( ((m_z_shift > 0) && ( that_z <= ref_z )) || ((m_z_shift < 0) && ( that_z >= ref_z )) || m_force_z_position ) that.set_z_position( ref_z + m_z_shift ); } } // z_shift::do_z_shift() /*----------------------------------------------------------------------------*/ /** * \brief Get the relative z position. */ int bear::engine::z_shift::get_z_shift() const { return m_z_shift; } // z_shift::get_z_shift() plee-the-bear-20251226/bear-engine/core/src/engine/item_brick/decorated_item_with_toggle.hpp000066400000000000000000000044021512343254000317150ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A toggle with an animation for its two states. * \author Julien Jorge */ #ifndef __ENGINE_DECORATED_ITEM_WITH_TOGGLE_HPP__ #define __ENGINE_DECORATED_ITEM_WITH_TOGGLE_HPP__ #include "engine/scene_visual.hpp" #include "engine/item_brick/item_with_toggle.hpp" #include "universe/types.hpp" #include namespace bear { namespace engine { /** * \brief An item that can be toggled on or off. * * \b template \b parameters : * - \a Base: the base class for this item. Must inherit from * basic_renderable_item. * * The custom fields of this class are: * - visual_on: animation, the animation played when the item is on * (default = none), * - visual_off: animation, the animation played when the item is off * (default = none), * - any field supported by the parent classes. * * \author Julien Jorge */ template class decorated_item_with_toggle: public item_with_toggle { /** \brief The type of the parent class. */ typedef item_with_toggle super; public: bool set_animation_field ( const std::string& name, const visual::animation& value ); void get_visual( std::list& visuals ) const; protected: void set_toggle_visual_on( const visual::animation& anim ); void set_toggle_visual_off( const visual::animation& anim ); void on_toggle_on( base_item* activator ); void on_toggle_off( base_item* activator ); void progress_on( universe::time_type elapsed_time ); void progress_off( universe::time_type elapsed_time ); private: /** \brief The animation played when the item is turned on. */ visual::animation m_visual_on; /** \brief The animation played when the item is turned off. */ visual::animation m_visual_off; }; // class decorated_item_with_toggle } // namespace engine } // namespace bear #include "engine/item_brick/impl/decorated_item_with_toggle.tpp" #endif // __ENGINE_DECORATED_ITEM_WITH_TOGGLE_HPP__ plee-the-bear-20251226/bear-engine/core/src/engine/item_brick/forced_movement_applicator.hpp000066400000000000000000000046211512343254000317460ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief An item that can give forced movement. * \author Sebastien Angibaud */ #ifndef __ENGINE_FORCED_MOVEMENT_APPLICATOR_HPP__ #define __ENGINE_FORCED_MOVEMENT_APPLICATOR_HPP__ #include "engine/class_export.hpp" #include "universe/forced_movement/forced_movement.hpp" #include "universe/derived_item_handle.hpp" #include namespace bear { namespace engine { class base_item; class forced_movement_applicator_loader; /** * \brief An item that can give forced movement. * * The custom fields of this class are: * * - \a actor: (item list) \b the item to which the movement is applied * (default = none), * - \a movement: (item) \b [required] \c an item having a movement * applied to him, the movement that will be applied to the actor, * - \a auto_remove: (bool) \c tell if the movement removes himself * from the moving item when finished (default = false). * - \a auto_remove: (bool) Tell if the angle of moving items are * updated according to their angular speed (default = false). * - ratio.x: real, the ratio of width to compute actor's position * (0 for left side, 0.5 for middle, 1 for right side). (default = 0.5) * - ratio.y: real, the ratio of height to compute actor's position * (0 for bottom side, 0.5 for middle, 1 for top side). (default = 0.5) * - gap.x: real, The x-gap to applied. (default = 0) * - gap.y: real, The y-gap to applied. (default = 0) * * \author Sebastien Angibaud */ class ENGINE_EXPORT forced_movement_applicator { friend class forced_movement_applicator_loader; private: typedef universe::derived_item_handle handle_type; public: bool is_valid() const; const universe::forced_movement& get_movement() const; void give_movement(); private: /** \brief The items to move. */ std::vector m_actor; /** \brief The item from which we take the movement. */ universe::forced_movement m_movement; }; // class forced_movement_applicator } // namespace engine } // namespace bear #endif // __ENGINE_FORCED_MOVEMENT_APPLICATOR_HPP__ forced_movement_creator_with_reference.hpp000066400000000000000000000042631512343254000342430ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/core/src/engine/item_brick/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief An item that can set target of forced_movement. * \author Sebastien Angibaud */ #ifndef __ENGINE_FORCED_MOVEMENT_CREATOR_WITH_REFERENCE_HPP__ #define __ENGINE_FORCED_MOVEMENT_CREATOR_WITH_REFERENCE_HPP__ #include "engine/base_item.hpp" namespace bear { namespace engine { /** * \brief An item that can set target of forced_movement. * * \b template \b parameters : * - \a Base: the base class for this item. Must inherit from * engine::base_item, * * The custom fields of this class are: * - ratio.x: real, the ratio of width to use * (0 for left side, 0.5 for middle, 1 for right side). (default = 0.5) * - ratio.y: real, the ratio of height to use * (0 for bottom side, 0.5 for middle, 1 for top side). (default = 0.5) * - gap.x: real, The x-gap to applied. (default = 0) * - gap.y: real, The y-gap to applied. (default = 0) * \author Sebastien Angibaud */ template class forced_movement_creator_with_reference: public Base { typedef Base super; typedef MovementType forced_movement_type; public: forced_movement_creator_with_reference(); bool set_real_field( const std::string& name, double value ); bool set_item_field( const std::string& name, engine::base_item* value ); bool is_valid() const; void build(); forced_movement_type& get_movement(); private: /** \brief The movement finally applied. */ forced_movement_type m_movement; /* \brief The ratio applied to compute reference point. */ universe::position_type m_ratio; /* \brief The gap applied to compute reference point. */ universe::position_type m_gap; }; // class forced_movement_creator_with_reference } // namespace engine } // namespace bear #include "engine/item_brick/impl/forced_movement_creator_with_reference.tpp" #endif // __ENGINE_FORCED_MOVEMENT_CREATOR_WITH_REFERENCE_HPP__ plee-the-bear-20251226/bear-engine/core/src/engine/item_brick/forced_movement_repeater.hpp000066400000000000000000000055271512343254000314250ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief An item that can give a forced movement to several clones of a given * item and place them at a constant time interval from each other. * \author Julien Jorge */ #ifndef __ENGINE_FORCED_MOVEMENT_REPEATER_HPP__ #define __ENGINE_FORCED_MOVEMENT_REPEATER_HPP__ #include "engine/class_export.hpp" #include "universe/forced_movement/forced_movement.hpp" #include namespace bear { namespace engine { class base_item; class forced_movement_repeater_loader; /** * \brief An item that can give a forced movement to several clones of a * given item and place them at a constant time interval from each * other. * * The custom fields of this class are: * * - \a actor: (item) the item to which and to the clones of which * the movement is applied (default = none), * - \a count: (unsigned int) the number of clones to create (default = 0), * - \a delay: (real) the time interval between the placement of two * clones, * - \a movement: (item) \b [required] \c an item having a movement * applied to him, the movement that will be applied to the actor, * - \a auto_remove: (bool) \c tell if the movement removes himself * from the moving item when finished (default = false). * - \a auto_remove: (bool) Tell if the angle of moving items are * updated according to their angular speed (default = false). * - ratio.x: real, the ratio of width to compute actor's position * (0 for left side, 0.5 for middle, 1 for right side). (default = 0.5) * - ratio.y: real, the ratio of height to compute actor's position * (0 for bottom side, 0.5 for middle, 1 for top side). (default = 0.5) * - gap.x: real, The x-gap to applied. (default = 0) * - gap.y: real, The y-gap to applied. (default = 0) * * \author Julien Jorge */ class ENGINE_EXPORT forced_movement_repeater { friend class forced_movement_repeater_loader; public: forced_movement_repeater(); ~forced_movement_repeater(); bool is_valid() const; void give_movement(); private: /** \brief The item to clone and to move. */ base_item* m_actor; /** \brief The movement to apply. */ universe::forced_movement m_movement; /** \brief The number of clones to create. */ std::size_t m_count; /** \brief The time difference between the positions of the clones. */ universe::time_type m_delay; }; // class forced_movement_repeater } // namespace engine } // namespace bear #endif // __ENGINE_FORCED_MOVEMENT_REPEATER_HPP__ plee-the-bear-20251226/bear-engine/core/src/engine/item_brick/impl/000077500000000000000000000000001512343254000246015ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/core/src/engine/item_brick/impl/basic_renderable_item.tpp000066400000000000000000000345201512343254000316140ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::engine::basic_renderable_item class. * \author Sebastien Angibaud */ #include "visual/scene_sprite.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Contructor. */ template bear::engine::basic_renderable_item::basic_renderable_item() : m_gap(0, 0), m_system_angle_as_visual(false), m_auto_mirror(false), m_auto_flip(false), m_auto_angular_speed_factor(0) { } // basic_renderable_item::basic_renderable_item() /*----------------------------------------------------------------------------*/ /** * \brief Initialise the item. */ template void bear::engine::basic_renderable_item::on_enters_layer() { super::on_enters_layer(); m_last_visual_position = this->get_center_of_mass(); } // basic_renderable_item::on_enters_layer() /*---------------------------------------------------------------------------*/ /** * \brief Do one iteration in the progression of the item. * \param elapsed_time Elapsed time since the last call. */ template void bear::engine::basic_renderable_item::progress ( bear::universe::time_type elapsed_time ) { super::progress( elapsed_time ); if ( m_auto_angular_speed_factor != 0 ) { bear::universe::coordinate_type dist ( this->get_center_of_mass().distance(m_last_visual_position) ); if ( this->get_speed().x < 0 ) this->add_angular_speed ( m_auto_angular_speed_factor * dist * 3.14 / ( this->get_height() + this->get_width() ) ); else this->add_angular_speed ( - m_auto_angular_speed_factor * dist * 3.14 / ( this->get_height() + this->get_width() ) ); } m_last_visual_position = this->get_center_of_mass(); } // basic_renderable_item::progress() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type \c integer. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ template bool bear::engine::basic_renderable_item::set_integer_field ( const std::string& name, int value ) { bool ok = true; if (name == "basic_renderable_item.gap.x") m_gap.x = value; else if (name == "basic_renderable_item.gap.y") m_gap.y = value; else ok = super::set_integer_field(name, value); return ok; } // basic_renderable_item::set_integer_field() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type \c real. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ template bool bear::engine::basic_renderable_item::set_real_field ( const std::string& name, double value ) { bool ok = true; if (name == "basic_renderable_item.angle") get_rendering_attributes().set_angle(value); else if (name == "basic_renderable_item.auto_angular_speed_factor") m_auto_angular_speed_factor = value; else ok = super::set_real_field(name, value); return ok; } // basic_renderable_item::set_real_field() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type \c bool. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ template bool bear::engine::basic_renderable_item::set_bool_field ( const std::string& name, bool value ) { bool ok = true; if (name == "basic_renderable_item.use_system_angle_as_visual_angle") set_system_angle_as_visual_angle( value ); else if (name == "basic_renderable_item.flip") get_rendering_attributes().flip( value ); else if (name == "basic_renderable_item.mirror") get_rendering_attributes().mirror( value ); else if (name == "basic_renderable_item.auto_flip") set_auto_flip( value ); else if (name == "basic_renderable_item.auto_mirror") set_auto_mirror( value ); else ok = super::set_bool_field(name, value); return ok; } // basic_renderable_item::set_bool_field() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type \c real. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ template bool bear::engine::basic_renderable_item::set_color_field ( const std::string& name, visual::color value ) { bool ok = true; if (name == "basic_renderable_item.color") get_rendering_attributes().set_color(value); else ok = super::set_color_field(name, value); return ok; } // basic_renderable_item::set_clor_field() /*----------------------------------------------------------------------------*/ /** * \brief Return the gap between the position of the item and the position of * his sprite. */ template const bear::visual::position_type& bear::engine::basic_renderable_item::get_gap() const { return m_gap; } // basic_renderable_item::get_gap() /*----------------------------------------------------------------------------*/ /** * \brief Return the gap between the position of the item and the position of * his sprite, with respect to the orientation of the sprite (flipped, * mirrored). * \param w The width to consider for the visual. * \param h The height to consider for the visual. */ template bear::visual::position_type bear::engine::basic_renderable_item::get_oriented_gap ( visual::coordinate_type w, visual::coordinate_type h ) const { visual::position_type result(m_gap); if ( get_auto_rendering_attributes().is_mirrored() ) result.x = this->get_width() - result.x - w; if ( get_auto_rendering_attributes().is_flipped() ) result.y = this->get_height() - result.y - h; return result; } // basic_renderable_item::get_oriented_gap() /*----------------------------------------------------------------------------*/ /** * \brief Set the gap between the position of the item and the position of his * sprite. * \param gap The new value of the gap. */ template void bear::engine::basic_renderable_item::set_gap ( const visual::position_type& gap ) { set_gap( gap.x, gap.y ); } // basic_renderable_item::set_gap() /*----------------------------------------------------------------------------*/ /** * \brief Set the gap between the position of the item and the position of his * sprite. * \param x The new X value of the gap. * \param y The new Y value of the gap. */ template void bear::engine::basic_renderable_item::set_gap ( visual::coordinate_type x, visual::coordinate_type y ) { set_gap_x(x); set_gap_y(y); } // basic_renderable_item::set_gap() /*----------------------------------------------------------------------------*/ /** * \brief Set the gap between the position of the item and the position of his * sprite, on the X-axis. * \param x The new value of the gap. */ template void bear::engine::basic_renderable_item::set_gap_x ( visual::coordinate_type x ) { m_gap.x = x; } // basic_renderable_item::set_gap_x() /*----------------------------------------------------------------------------*/ /** * \brief Set the gap between the position of the item and the position of his * sprite, on the Y-axis. * \param y The new value of the gap. */ template void bear::engine::basic_renderable_item::set_gap_y ( visual::coordinate_type y ) { m_gap.y = y; } // basic_renderable_item::set_gap_y() /*----------------------------------------------------------------------------*/ /** * \brief Tell if the visuals must be mirrored according to the status of the * item. * \param b Mirror it or not. */ template void bear::engine::basic_renderable_item::set_auto_mirror( bool b ) { m_auto_mirror = b; } // basic_renderable_item::set_auto_mirror() /*----------------------------------------------------------------------------*/ /** * \brief Tell if the visuals must be flipped according to the status of the * item. * \param b Flip it or not. */ template void bear::engine::basic_renderable_item::set_auto_flip( bool b ) { m_auto_flip = b; } // basic_renderable_item::set_auto_flip() /*----------------------------------------------------------------------------*/ /** * \brief Get the angle to use to display this item. */ template double bear::engine::basic_renderable_item::get_visual_angle() const { if (m_system_angle_as_visual) return this->get_system_angle(); else return 0; } // basic_renderable_item::get_system_angle() /*----------------------------------------------------------------------------*/ /** * \brief Tell to use the system angle as the visual angle. * \param b Use it or not. */ template void bear::engine::basic_renderable_item::set_system_angle_as_visual_angle ( bool b ) { m_system_angle_as_visual = b; } // basic_renderable_item::set_system_angle_as_visual_angle() /*----------------------------------------------------------------------------*/ /** * \brief Set the factor of movement applied at angular speed. * \param factor The new factor. */ template void bear::engine::basic_renderable_item::set_auto_angular_speed_factor ( double factor) { m_auto_angular_speed_factor = factor; } // basic_renderable_item::set_auto_angular_speed_factor() /*----------------------------------------------------------------------------*/ /** * \brief Add a visual::scene_element in the rendering pipeline. * \param v The element to render. * \param visuals (out) The sprites of the item, and their positions. */ template void bear::engine::basic_renderable_item::add_visual ( const visual::scene_element& v, std::list& visuals ) const { visuals.push_front( get_scene_visual(v) ); } // basic_renderable_item::add_visual() /*----------------------------------------------------------------------------*/ /** * \brief Add a sprite in the rendering pipeline. * \param spr The sprite to render. * \param visuals (out) The sprites of the item, and their positions. */ template void bear::engine::basic_renderable_item::add_visual ( const visual::sprite& spr, std::list& visuals ) const { if ( spr.is_valid() ) visuals.push_front( get_scene_visual(spr) ); } // basic_renderable_item::add_visual() /*----------------------------------------------------------------------------*/ /** * \brief Add a sprite in the rendering pipeline. * \param seq The sequence in which we take the sprite to render. * \param visuals (out) The sprites of the item, and their positions. */ template void bear::engine::basic_renderable_item::add_visual ( const visual::sprite_sequence& seq, std::list& visuals ) const { if ( seq.is_valid() ) add_visual( seq.get_sprite(), visuals ); } // basic_renderable_item::add_visual() /*----------------------------------------------------------------------------*/ /** * \brief Get a scene visual as in the rendering pipeline. * \param e The initial element. */ template bear::engine::scene_visual bear::engine::basic_renderable_item::get_scene_visual ( const visual::scene_element& e ) const { visual::scene_element new_e(e); const visual::size_box_type s( e.get_rendering_attributes().get_size() ); visual::position_type local_position( e.get_position() ); if ( get_auto_rendering_attributes().is_mirrored() ) local_position.x = -local_position.x; if ( get_auto_rendering_attributes().is_flipped() ) local_position.y = -local_position.y; new_e.set_position ( this->get_bottom_left() + local_position + get_oriented_gap ( new_e.get_bounding_box().width(), new_e.get_bounding_box().height() ) ); new_e.set_rendering_attributes(get_auto_rendering_attributes()); new_e.get_rendering_attributes().set_angle ( new_e.get_rendering_attributes().get_angle() + this->get_visual_angle() ); // do not change the size of the element new_e.get_rendering_attributes().set_size(s); return scene_visual( new_e ); } // basic_renderable_item::get_scene_visual() /*----------------------------------------------------------------------------*/ /** * \brief Get a sprite as in the rendering pipeline. * \param spr The initial sprite. */ template bear::engine::scene_visual bear::engine::basic_renderable_item::get_scene_visual ( const visual::sprite& spr ) const { return get_scene_visual( visual::scene_sprite(0, 0, spr) ); } // basic_renderable_item::get_scene_visual() /*----------------------------------------------------------------------------*/ /** * \brief Get a sprite as in the rendering pipeline. * \param seq The sequence in which we take the sprite. * \param visuals (out) The sprites of the item, and their positions. */ template bear::engine::scene_visual bear::engine::basic_renderable_item::get_scene_visual ( const visual::sprite_sequence& seq ) const { return get_scene_visual( seq.get_sprite() ); } // basic_renderable_item::get_scene_visual() /*----------------------------------------------------------------------------*/ /** * \brief Get the rendering attributes with the values infered from the item. */ template bear::visual::bitmap_rendering_attributes bear::engine::basic_renderable_item::get_auto_rendering_attributes() const { visual::bitmap_rendering_attributes result(get_rendering_attributes()); if ( m_auto_mirror ) { if ( this->get_acceleration().x != 0 ) result.mirror ( result.is_mirrored() ^ (this->get_acceleration().x < 0) ); else result.mirror( result.is_mirrored() ^ (this->get_speed().x < 0) ); } if ( m_auto_flip ) { if ( this->get_acceleration().y != 0 ) result.flip( result.is_flipped() ^ (this->get_acceleration().y > 0) ); else result.flip( result.is_flipped() ^ (this->get_speed().y > 0) ); } return result; } // basic_renderable_item::get_auto_rendering_attributes() plee-the-bear-20251226/bear-engine/core/src/engine/item_brick/impl/decorated_item_with_toggle.tpp000066400000000000000000000101101512343254000326630ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::engine::decorated_item_with_toggle class. * \author Julien Jorge */ #include /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type animation. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ template bool bear::engine::decorated_item_with_toggle::set_animation_field ( const std::string& name, const visual::animation& value ) { bool ok = true; if (name == "decorated_item_with_toggle.visual_on") set_toggle_visual_on( value ); else if ( name == "decorated_item_with_toggle.visual_off" ) set_toggle_visual_off( value ); else ok = super::set_animation_field(name, value); return ok; } // decorated_item_with_toggle::set_animation_field() /*----------------------------------------------------------------------------*/ /** * \brief Get the sprites representing the item. * \param visuals (out) The sprites of the item, and their positions. */ template void bear::engine::decorated_item_with_toggle::get_visual ( std::list& visuals ) const { super::get_visual(visuals); if ( this->is_on() ) this->add_visual( m_visual_on, visuals ); else this->add_visual( m_visual_off, visuals ); } // decorated_item_with_toggle::get_visual() /*----------------------------------------------------------------------------*/ /** * \brief Set the animation shown when the toggle is on. * \param anim The animation. */ template void bear::engine::decorated_item_with_toggle::set_toggle_visual_on ( const visual::animation& anim ) { m_visual_on = anim; } // decorated_item_with_toggle::set_toggle_visual_on() /*----------------------------------------------------------------------------*/ /** * \brief Set the animation shown when the toggle is off. * \param anim The animation. */ template void bear::engine::decorated_item_with_toggle::set_toggle_visual_off ( const visual::animation& anim ) { m_visual_off = anim; } // decorated_item_with_toggle::set_toggle_visual_off() /*----------------------------------------------------------------------------*/ /** * \brief This method is called when the toggle switches on. * \param activator The item that activates the toggle, if any. */ template void bear::engine::decorated_item_with_toggle::on_toggle_on ( base_item* activator ) { super::on_toggle_on(activator); m_visual_on.reset(); } // decorated_item_with_toggle::on_toggle_on() /*----------------------------------------------------------------------------*/ /** * \brief This method is called when the toggle switches off. * \param activator The item that activates the toggle, if any. */ template void bear::engine::decorated_item_with_toggle::on_toggle_off ( base_item* activator ) { super::on_toggle_off(activator); m_visual_off.reset(); } // decorated_item_with_toggle::on_toggle_off() /*----------------------------------------------------------------------------*/ /** * \brief Progress the item as it is turned on. * \param elapsed_time The duration of the activity. */ template void bear::engine::decorated_item_with_toggle::progress_on ( universe::time_type elapsed_time ) { super::progress_on(elapsed_time); m_visual_on.next(elapsed_time); } // decorated_item_with_toggle::progress_on() /*----------------------------------------------------------------------------*/ /** * \brief Progress the item as it is turned off. * \param elapsed_time The duration of the activity. */ template void bear::engine::decorated_item_with_toggle::progress_off ( universe::time_type elapsed_time ) { super::progress_off(elapsed_time); m_visual_off.next(elapsed_time); } // decorated_item_with_toggle::progress_off() forced_movement_creator_with_reference.tpp000066400000000000000000000067671512343254000352330ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/core/src/engine/item_brick/impl/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the * bear::engine::forced_movement_creator_with_reference class. * \author Sebastien Angibaud */ /*----------------------------------------------------------------------------*/ /** * \brief Contructor. */ template bear::engine::forced_movement_creator_with_reference:: forced_movement_creator_with_reference() : m_ratio(0.5, 0.5), m_gap(0, 0) { } // forced_movement_creator_with_reference::forced_movement_creator_with_reference() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type real. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ template bool bear::engine::forced_movement_creator_with_reference:: set_real_field ( const std::string& name, double value ) { bool ok(true); if (name == "forced_movement_creator_with_reference.target.ratio.x") m_ratio.x = value; else if (name == "forced_movement_creator_with_reference.target.ratio.y") m_ratio.y = value; else if (name == "forced_movement_creator_with_reference.target.gap.x") m_gap.x = value; else if (name == "forced_movement_creator_with_reference.target.gap.y") m_gap.y = value; else ok = super::set_real_field(name, value); return ok; } // forced_movement_creator_with_reference::set_real_field() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type "item". * \param name The name of the field. * \param value The value of the field. */ template bool bear::engine::forced_movement_creator_with_reference:: set_item_field ( const std::string& name, engine::base_item* value ) { bool result = true; if ( (name == "forced_movement_creator_with_reference.target") && (value != NULL) ) m_movement.set_ratio_reference_point(*value, m_ratio, m_gap); else result = super::set_item_field(name, value); return result; } // forced_movement_creator_with_reference::set_item_field() /*----------------------------------------------------------------------------*/ /** * \brief Tell if all required fields are initialized. */ template bool bear::engine::forced_movement_creator_with_reference:: is_valid() const { return m_movement.has_reference_item() && super::is_valid(); } // forced_movement_creator_with_reference::is_valid() /*----------------------------------------------------------------------------*/ /** * \brief Initialize the item. */ template void bear::engine::forced_movement_creator_with_reference:: build() { super::build(); this->set_forced_movement(m_movement); this->kill(); } // forced_movement_creator_with_reference::build() /*----------------------------------------------------------------------------*/ /** * \brief Get the movement. */ template MovementType& bear::engine::forced_movement_creator_with_reference:: get_movement() { return m_movement; } // forced_movement_creator_with_reference::get_movement() plee-the-bear-20251226/bear-engine/core/src/engine/item_brick/impl/item_with_decoration.tpp000066400000000000000000000177211512343254000315360ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::engine::item_with_decoration class. * \author Sebastien Angibaud */ #include /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ template bear::engine::item_with_decoration::item_with_decoration() : m_item_to_mimic(NULL), m_extend_on_bounding_box(false) { } // item_with_decoration::item_with_decoration() /*----------------------------------------------------------------------------*/ /** * \brief Initialize the item. */ template void bear::engine::item_with_decoration::build() { super::build(); if ( (this->get_size().x == 0) && (this->get_size().y == 0) ) auto_size(); } // item_with_decoration::build() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type visual::sprite. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. * * Valid values for the \a name and \a value parameters are : * - "sprite", visual::sprite * - anything supported by the parent class */ template bool bear::engine::item_with_decoration::set_sprite_field ( const std::string& name, const visual::sprite& value ) { bool ok = true; if (name == "item_with_decoration.sprite") m_animation = visual::animation(value); else ok = super::set_sprite_field(name, value); return ok; } // item_with_decoration::set_sprite_field() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type visual::animation. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. * * Valid values for the \a name and \a value parameters are : * - "animation", visual::animation * - anything supported by the parent class */ template bool bear::engine::item_with_decoration::set_animation_field ( const std::string& name, const visual::animation& value ) { bool ok = true; if (name == "item_with_decoration.animation") m_animation = value; else ok = super::set_animation_field(name, value); return ok; } // item_with_decoration::set_animation_field() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type engine::base_item. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ template bool bear::engine::item_with_decoration::set_item_field ( const std::string& name, base_item* value ) { bool ok = true; if ((name == "item_with_decoration.item_to_mimic") && (value != NULL)) m_item_to_mimic = value; else ok = super::set_item_field(name, value); return ok; } // item_with_decoration::set_animation_field() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type bool. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ template bool bear::engine::item_with_decoration::set_bool_field ( const std::string& name, bool value ) { bool ok = true; if (name == "item_with_decoration.extend_on_bounding_box") m_extend_on_bounding_box = value; else ok = super::set_bool_field(name, value); return ok; } // item_with_decoration::set_bool_field() /*----------------------------------------------------------------------------*/ /** * \brief Do one iteration in the progression of the item. * \param elapsed_time Elapsed time since the last call. */ template void bear::engine::item_with_decoration::progress ( universe::time_type elapsed_time ) { super::progress(elapsed_time); if ( m_animation.is_valid() ) { m_animation.next(elapsed_time); if ( m_extend_on_bounding_box ) m_animation.set_size(this->get_width(), this->get_height()); } } // item_with_decoration::progress() /*----------------------------------------------------------------------------*/ /** * \brief Get the sprites representing the item. * \param visuals (out) The sprites of the item, and their positions. */ template void bear::engine::item_with_decoration::get_visual ( std::list& visuals ) const { super::get_visual(visuals); this->add_visual(m_animation, visuals); if (m_item_to_mimic != NULL) { std::list mimic; m_item_to_mimic->get_visual(mimic); for ( ; !mimic.empty(); mimic.pop_front() ) { if ( m_extend_on_bounding_box ) mimic.front().scene_element.get_rendering_attributes().set_size (this->get_size()); mimic.front().scene_element.set_position(0,0); this->add_visual( mimic.front().scene_element, visuals ); } } } // item_with_decoration::get_visual() /*----------------------------------------------------------------------------*/ /** * \brief Set the animation of the item. * \param anim The animation. */ template void bear::engine::item_with_decoration::set_animation ( const bear::visual::animation& anim ) { m_animation = anim; } // item_with_decoration::set_animation() /*----------------------------------------------------------------------------*/ /** * \brief Set the sprite of the item. * \param spr The sprite. */ template void bear::engine::item_with_decoration::set_sprite ( const bear::visual::sprite& spr ) { std::vector images; std::vector d(1, std::numeric_limits::infinity()); images.push_back(spr); m_animation = visual::animation(images, d); } // item_with_decoration::set_sprite() /*----------------------------------------------------------------------------*/ /** * \brief Get the animation of the item. */ template const bear::visual::animation& bear::engine::item_with_decoration::get_animation() const { return m_animation; } // item_with_decoration::get_animation() /*----------------------------------------------------------------------------*/ /** * \brief Get the current sprite of the item. */ template bear::visual::sprite bear::engine::item_with_decoration::get_sprite() const { visual::sprite result(m_animation.get_sprite()); result.set_angle( result.get_angle() + this->get_visual_angle() ); return result; } // item_with_decoration::get_animation() /*----------------------------------------------------------------------------*/ /** * \brief Compute the size of the item according to its decoration. */ template void bear::engine::item_with_decoration::auto_size() { if ( m_animation.is_valid() ) this->set_size( m_animation.get_max_size() ); else if ( m_item_to_mimic != NULL ) this->set_size( m_item_to_mimic->get_size() ); } // item_with_decoration::auto_size() /*----------------------------------------------------------------------------*/ /** * \brief Tells the item to adjust the size of its decoration to the bounds of * its bounding box. * \param extend Extend to the bounds, or not. */ template void bear::engine::item_with_decoration::extend_to_bounding_box ( bool extend ) { m_extend_on_bounding_box = extend; } // item_with_decoration::extend_to_bounding_box() /*----------------------------------------------------------------------------*/ /** * \brief Get the animation of the item. */ template bear::visual::animation& bear::engine::item_with_decoration::get_animation() { return m_animation; } // item_with_decoration::get_animation() plee-the-bear-20251226/bear-engine/core/src/engine/item_brick/impl/item_with_friction.tpp000066400000000000000000000075651512343254000312310ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::engine::item_with_friction class. * \author Sebastien Angibaud */ /*----------------------------------------------------------------------------*/ /** * \brief Contructor. */ template bear::engine::item_with_friction::item_with_friction() : m_left_friction(1), m_right_friction(1), m_top_friction(1), m_bottom_friction(1) { } // item_with_friction::item_with_friction() /*----------------------------------------------------------------------------*/ /** * \brief Get the left friction. */ template double bear::engine::item_with_friction::get_left_friction() const { return m_left_friction; } // item_with_friction::get_left_friction() /*----------------------------------------------------------------------------*/ /** * \brief Sets the left friction. * \param f The new friction. */ template void bear::engine::item_with_friction::set_left_friction( double f ) { m_left_friction = f; } // item_with_friction::set_left_friction() /*----------------------------------------------------------------------------*/ /** * \brief Get the right friction. */ template double bear::engine::item_with_friction::get_right_friction() const { return m_right_friction; } // item_with_friction::get_right_friction() /*----------------------------------------------------------------------------*/ /** * \brief Sets the right friction. * \param f The new friction. */ template void bear::engine::item_with_friction::set_right_friction( double f ) { m_right_friction = f; } // item_with_friction::set_right_friction() /*----------------------------------------------------------------------------*/ /** * \brief Get the top friction. */ template double bear::engine::item_with_friction::get_top_friction() const { return m_top_friction; } // item_with_friction::get_top_friction() /*----------------------------------------------------------------------------*/ /** * \brief Sets the top friction. * \param f The new friction. */ template void bear::engine::item_with_friction::set_top_friction( double f ) { m_top_friction = f; } // item_with_friction::set_top_friction() /*----------------------------------------------------------------------------*/ /** * \brief Get the bottom. */ template double bear::engine::item_with_friction::get_bottom_friction() const { return m_bottom_friction; } // item_with_friction::get_bottom_friction() /*----------------------------------------------------------------------------*/ /** * \brief Sets the bottom friction. * \param f The new friction. */ template void bear::engine::item_with_friction::set_bottom_friction( double f ) { m_bottom_friction = f; } // item_with_friction::set_bottom_friction() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type real. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ template bool bear::engine::item_with_friction::set_real_field ( const std::string& name, double value ) { bool ok(true); if (name == "item_with_friction.left_friction") m_left_friction = value; else if (name == "item_with_friction.right_friction") m_right_friction = value; else if (name == "item_with_friction.top_friction") m_top_friction = value; else if (name == "item_with_friction.bottom_friction") m_bottom_friction = value; else ok = super::set_real_field(name, value); return ok; } // invisible_block::set_real_field() plee-the-bear-20251226/bear-engine/core/src/engine/item_brick/impl/item_with_input_listener.tpp000066400000000000000000000215771512343254000324570ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::engine::with_input_reader. * \author Julien Jorge */ #include "engine/level.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Read inputs and apply them to the item. * \param elapsed_time Elapsed time since the last call. */ template void bear::engine::item_with_input_listener::progress_input_reader ( universe::time_type elapsed_time ) { m_elapsed_time = elapsed_time; m_input_status.read(); m_input_status.scan_inputs( *this ); } // item_with_input_listener::progress_input_reader() /*----------------------------------------------------------------------------*/ /** * \brief A keyboard key is maintained. * \param elapsed_time How long the key has been pressed. * \param key The code of the key. */ template bool bear::engine::item_with_input_listener::key_maintained ( universe::time_type elapsed_time, const input::key_info& key ) { return false; } // item_with_input_listener::key_maintained() /*----------------------------------------------------------------------------*/ /** * \brief A joystick button is maintained. * \param elapsed_time How long the button has been pressed. * \param button The code of the button. * \param joy_index The index of the joystick. */ template bool bear::engine::item_with_input_listener::button_maintained ( universe::time_type elapsed_time, input::joystick::joy_code button, unsigned int joy_index ) { return false; } // item_with_input_listener::button_maintained() /*----------------------------------------------------------------------------*/ /** * \brief A mouse button is maintained. * \param elapsed_time How long the button has been pressed. * \param button The code of the button. * \param pos The position of the cursor on the screen. */ template bool bear::engine::item_with_input_listener::mouse_maintained ( universe::time_type elapsed_time, input::mouse::mouse_code button, const claw::math::coordinate_2d& pos ) { const universe::position_type global ( this->get_level().screen_to_level( pos ) ); if ( this->get_bounding_box().includes( global ) ) return mouse_maintained_local ( elapsed_time, button, global - this->get_bottom_left() ); else return false; } // item_with_input_listener::mouse_maintained() /*----------------------------------------------------------------------------*/ /** * \brief A mouse button has been pressed on the item. * \param button The code of the button. * \param pos The position of the cursor on the item. */ template bool bear::engine::item_with_input_listener::mouse_pressed_local ( input::mouse::mouse_code button, const universe::position_type& pos ) { return false; } // item_with_input_listener::mouse_pressed_local() /*----------------------------------------------------------------------------*/ /** * \brief A mouse button has been maintained on the item. * \param elapsed_time How long the button has been pressed. * \param button The code of the button. * \param pos The position of the cursor on the item. */ template bool bear::engine::item_with_input_listener::mouse_maintained_local ( universe::time_type elapsed_time, input::mouse::mouse_code button, const universe::position_type& pos ) { return false; } // item_with_input_listener::mouse_maintained_local() /*----------------------------------------------------------------------------*/ /** * \brief A mouse button has been released on the item. * \param button The code of the button. * \param pos The position of the cursor on the item. */ template bool bear::engine::item_with_input_listener::mouse_released_local ( input::mouse::mouse_code button, const universe::position_type& pos ) { return false; } // item_with_input_listener::mouse_released_local() /*----------------------------------------------------------------------------*/ /** * \brief The mouse is moving over the item. * \param pos The position of the cursor on the item. */ template bool bear::engine::item_with_input_listener::mouse_move_local ( const universe::position_type& pos ) { return false; } // item_with_input_listener::mouse_move_local() /*----------------------------------------------------------------------------*/ /** * \brief A finger has been used over the item. * \param event The event dispatched by the finger. */ template bool bear::engine::item_with_input_listener::finger_action_local ( const input::finger_event& event ) { return false; } // item_with_input_listener::finger_action_local() /*----------------------------------------------------------------------------*/ /** * \brief A keyboard key is maintained. * \param key The code of the key. */ template bool bear::engine::item_with_input_listener::key_maintained ( const input::key_info& key ) { return key_maintained(m_elapsed_time, key); } // item_with_input_listener::key_maintained() /*----------------------------------------------------------------------------*/ /** * \brief A joystick button is maintained. * \param button The code of the button. * \param joy_index The index of the joystick. */ template bool bear::engine::item_with_input_listener::button_maintained ( input::joystick::joy_code button, unsigned int joy_index ) { return button_maintained( m_elapsed_time, button, joy_index ); } // item_with_input_listener::button_maintained() /*----------------------------------------------------------------------------*/ /** * \brief A mouse button is pressed. * \param button The code of the button. * \param pos The position of the cursor on the screen. */ template bool bear::engine::item_with_input_listener::mouse_pressed ( input::mouse::mouse_code button, const claw::math::coordinate_2d& pos ) { const universe::position_type global ( this->get_level().screen_to_level( pos ) ); if ( this->get_bounding_box().includes( global ) ) return mouse_pressed_local( button, global - this->get_bottom_left() ); else return input_listener::mouse_pressed( button, pos ); } // item_with_input_listener::mouse_pressed() /*----------------------------------------------------------------------------*/ /** * \brief A mouse button is maintained. * \param button The code of the button. * \param pos The position of the cursor on the screen. */ template bool bear::engine::item_with_input_listener::mouse_maintained ( input::mouse::mouse_code button, const claw::math::coordinate_2d& pos ) { return mouse_maintained( m_elapsed_time, button, pos ); } // item_with_input_listener::mouse_maintained() /*----------------------------------------------------------------------------*/ /** * \brief A mouse button is released. * \param button The code of the button. * \param pos The position of the cursor on the screen. */ template bool bear::engine::item_with_input_listener::mouse_released ( input::mouse::mouse_code button, const claw::math::coordinate_2d& pos ) { const universe::position_type global ( this->get_level().screen_to_level( pos ) ); if ( this->get_bounding_box().includes( global ) ) return mouse_released_local( button, global - this->get_bottom_left() ); else return input_listener::mouse_released( button, pos ); } // item_with_input_listener::mouse_released() /*----------------------------------------------------------------------------*/ /** * \brief The mouse is moving. * \param pos The new position of the cursor on the screen. */ template bool bear::engine::item_with_input_listener::mouse_move ( const claw::math::coordinate_2d& pos ) { const universe::position_type global ( this->get_level().screen_to_level( pos ) ); if ( this->get_bounding_box().includes( global ) ) return mouse_move_local( global - this->get_bottom_left() ); else return input_listener::mouse_move( pos ); } // item_with_input_listener::mouse_move() /*----------------------------------------------------------------------------*/ /** * \brief The finger has been used. * \param event The event dispatched by the usage of the finger. */ template bool bear::engine::item_with_input_listener::finger_action ( const input::finger_event& event ) { const universe::position_type global ( this->get_level().screen_to_level( event.get_position() ) ); if ( this->get_bounding_box().includes( global ) ) return finger_action_local ( event.at_position( global - this->get_bottom_left() ) ); else return input_listener::finger_action( event ); } // item_with_input_listener::finget_action() item_with_restricted_z_collision.tpp000066400000000000000000000053061512343254000341000ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/core/src/engine/item_brick/impl/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::engine::item_with_restricted_z_collision * class. * \author Julien Jorge */ #include /*----------------------------------------------------------------------------*/ /** * \brief Contructor. */ template bear::engine::item_with_restricted_z_collision:: item_with_restricted_z_collision() : m_min_z(std::numeric_limits::min()), m_max_z(std::numeric_limits::max()) { } // item_with_restricted_z_collision::item_with_restricted_z_collision() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type int. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ template bool bear::engine::item_with_restricted_z_collision::set_integer_field ( const std::string& name, int value ) { bool ok(true); if (name == "item_with_restricted_z_collision.min_z_for_collision") m_min_z = value; else if (name == "item_with_restricted_z_collision.max_z_for_collision") m_max_z = value; else ok = super::set_integer_field(name, value); return ok; } // item_with_restricted_z_collision::set_integer_field() /*----------------------------------------------------------------------------*/ /** * \brief Sets the minimum z-position to be aligned. * \param z The new bound. */ template void bear::engine::item_with_restricted_z_collision:: set_min_z_for_collision( int z ) { m_min_z = z; } // item_with_restricted_z_collision::set_min_z_for_collision() /*----------------------------------------------------------------------------*/ /** * \brief Sets the maximum z-position to be aligned. * \param z The new bound. */ template void bear::engine::item_with_restricted_z_collision:: set_max_z_for_collision( int z ) { m_max_z = z; } // item_with_restricted_z_collision::set_max_z_for_collision() /*----------------------------------------------------------------------------*/ /** * \brief Check if the other item satisfies the condition for the collision * treatment to be applied. * \param that The item to check. */ template bool bear::engine::item_with_restricted_z_collision:: satisfy_collision_condition( const base_item& that ) const { return (that.get_z_position() >= m_min_z) && (that.get_z_position() <= m_max_z); } // item_with_restricted_z_collision::satisfy_collision_condition() plee-the-bear-20251226/bear-engine/core/src/engine/item_brick/impl/item_with_text.tpp000066400000000000000000000170501512343254000303660ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::engine::item_with_text class. * \author Julien Jorge */ #include "engine/level_globals.hpp" #include "visual/scene_writing.hpp" #include #include /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ template bear::engine::item_with_text::item_with_text() : m_text_inside(false), m_stretched_text(false), m_scale_to_fit(false) { } // item_with_text::item_with_text() /*----------------------------------------------------------------------------*/ /** * \brief Initialize the item. */ template void bear::engine::item_with_text::build() { super::build(); if ( (this->get_size().x == 0) && (this->get_size().y == 0) ) this->set_size( this->get_writing().get_size() ); } // item_with_text::build() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type string. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ template bool bear::engine::item_with_text::set_string_field ( const std::string& name, const std::string& value ) { bool ok = true; if (name == "item_with_text.text") this->set_text( gettext(value.c_str()) ); else if ( name == "item_with_text.horizontal_align" ) this->set_horizontal_align ( visual::text_align::horizontal_align_from_string ( value, this->get_horizontal_align() ) ); else if ( name == "item_with_text.vertical_align" ) this->set_vertical_align ( visual::text_align::vertical_align_from_string ( value, this->get_vertical_align() ) ); else ok = super::set_string_field(name, value); return ok; } // item_with_text::set_string_field() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type bool. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ template bool bear::engine::item_with_text::set_bool_field ( const std::string& name, bool value ) { bool ok = true; if (name == "item_with_text.text_inside") m_text_inside = value; else if (name == "item_with_text.stretched_text") m_stretched_text = value; else if (name == "item_with_text.scale_to_fit") m_scale_to_fit = value; else ok = super::set_bool_field(name, value); return ok; } // item_with_text::set_bool_field() /*----------------------------------------------------------------------------*/ /** * \brief Sets a field of type font. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ template bool bear::engine::item_with_text::set_font_field ( const std::string& name, visual::font value ) { bool ok = true; if ( name == "item_with_text.font" ) this->set_font( value ); else ok = super::set_font_field(name, value); return ok; } // item_with_text::set_font_field() /*----------------------------------------------------------------------------*/ /** * \brief Do one iteration in the progression of the item. * \param elapsed_time Elapsed time since the last call. */ template void bear::engine::item_with_text::progress ( universe::time_type elapsed_time ) { super::progress(elapsed_time); if ( m_text_inside && ( this->get_writing().get_size()!=this->get_size() ) ) this->fit_in_box( this->get_size() ); } // item_with_text::progress() /*----------------------------------------------------------------------------*/ /** * \brief Get the sprites representing the item. * \param visuals (out) The sprites of the item, and their positions. */ template void bear::engine::item_with_text::get_visual ( std::list& visuals ) const { super::get_visual(visuals); if ( !this->get_text().empty() ) { visual::scene_writing e( 0, 0, this->get_writing() ); if ( m_stretched_text ) e.set_scale_factor ( this->get_width() / this->get_writing().get_width(), this->get_height() / this->get_writing().get_height() ); else if ( m_scale_to_fit ) { double ratio = std::min ( this->get_width() / this->get_writing().get_width(), this->get_height() / this->get_writing().get_height() ); e.set_scale_factor( ratio, ratio ); bear::visual::position_type gap = get_gap_for_scale_to_fit(e); e.set_position(gap); } this->add_visual( e, visuals ); } } // item_with_text::get_visual() /*----------------------------------------------------------------------------*/ /** * \brief Tell if the text is drawn only in the bounds of the item. * \param b True if the text must be drawn only in the bounds of the item. */ template void bear::engine::item_with_text::set_text_inside( bool b ) { m_text_inside = b; if ( m_text_inside ) this->fit_in_box( this->get_size() ); } // item_with_text::set_text_inside() /*----------------------------------------------------------------------------*/ /** * \brief Tell if the text has to be stretched to fit the bounds of the item. * \param b True if the text must be stretched. */ template void bear::engine::item_with_text::set_stretched_text( bool b ) { m_stretched_text = b; } // item_with_text::set_stretched_text() /*----------------------------------------------------------------------------*/ /** * \brief Tell if the text has to be scaled to fit the bounds of the item. * \param b True if the text must be scaled. */ template void bear::engine::item_with_text::set_scale_to_fit( bool b ) { m_scale_to_fit = b; } // item_with_text::set_scale_to_fit() /*----------------------------------------------------------------------------*/ /** * \brief Tell the item to adjust its size to the size of the text. */ template void bear::engine::item_with_text::fit_to_text() { this->refresh_writing(); this->set_size( this->get_writing().get_size() ); } // item_with_text::fit_to_text() /*----------------------------------------------------------------------------*/ /** * \brief Return the gap of the visual according to alignment. * \param e The writing on which we compute the gap. */ template bear::visual::position_type bear::engine::item_with_text::get_gap_for_scale_to_fit (const visual::scene_writing& e) const { bear::visual::position_type gap(0,0); visual::text_align::horizontal_align h_align = get_horizontal_align(); visual::text_align::vertical_align v_align = get_vertical_align(); if ( h_align == visual::text_align::align_center ) gap.x = ( this->get_width() - e.get_bounding_box().width() ) / 2; else if ( h_align == visual::text_align::align_right ) gap.x = this->get_width() - e.get_bounding_box().width(); if ( v_align == visual::text_align::align_middle ) gap.y = ( this->get_height() - e.get_bounding_box().height() ) / 2; else if ( v_align == visual::text_align::align_top ) gap.y = this->get_height() - e.get_bounding_box().height(); return gap; } // item_with_text::get_gap_for_scale_to_fit() plee-the-bear-20251226/bear-engine/core/src/engine/item_brick/impl/item_with_toggle.tpp000066400000000000000000000331351512343254000306650ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::engine::item_with_toggle class. * \author Julien Jorge */ #include /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ template bear::engine::item_with_toggle::item_with_toggle() : m_is_on(false), m_elapsed_time(0), m_delay(std::numeric_limits::infinity()), m_fadeout(0), m_sample(NULL) { this->set_phantom(true); this->set_can_move_items(false); this->set_artificial(true); } // item_with_toggle::item_with_toggle() /*----------------------------------------------------------------------------*/ /** * \brief Copy constructor. * \param that The instance to copy from. */ template bear::engine::item_with_toggle::item_with_toggle ( const item_with_toggle& that ) : super(that), m_is_on(false), m_elapsed_time(0), m_delay(that.m_delay), m_fadeout(that.m_fadeout), m_sample( that.m_sample == NULL ? NULL : that.m_sample->clone() ) { } // item_with_toggle::item_with_toggle() /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ template bear::engine::item_with_toggle::~item_with_toggle() { delete m_sample; } // item_with_toggle::~item_with_toggle() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type real. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ template bool bear::engine::item_with_toggle::set_real_field ( const std::string& name, double value ) { bool ok = true; if (name == "item_with_toggle.delay") set_delay(value); else if (name == "item_with_toggle.fadeout") m_fadeout = value; else ok = super::set_real_field(name, value); return ok; } // item_with_toggle::set_real_field() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type bool. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ template bool bear::engine::item_with_toggle::set_bool_field ( const std::string& name, bool value ) { bool ok = true; if (name == "item_with_toggle.initial_state") m_is_on = value; else ok = super::set_bool_field(name, value); return ok; } // item_with_toggle::set_bool_field() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type \c . * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ template bool bear::engine::item_with_toggle::set_sample_field ( const std::string& name, audio::sample* value ) { bool ok = true; if (name == "item_with_toggle.sample") m_sample = value; else ok = super::set_sample_field(name, value); return ok; } // item_with_toggle::set_sample_field() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type item_list. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ template bool bear::engine::item_with_toggle::set_item_list_field ( const std::string& name, const std::vector& value ) { bool ok = true; if (name == "item_with_toggle.linked_toggles") for( std::size_t i=0; i!=value.size(); ++i ) m_linked.push_back( toggle_handle(value[i]) ); else ok = super::set_item_list_field(name, value); return ok; } // item_with_toggle::set_item_list_field() /*----------------------------------------------------------------------------*/ /** * \brief Initialise the item. */ template void bear::engine::item_with_toggle::build() { super::build(); if (is_on()) { play_sound(); build_on(); } else build_off(); } // item_with_toggle::build() /*----------------------------------------------------------------------------*/ /** * \brief Do one iteration in the progression of the item. * \param elapsed_time Elapsed time since the last call. */ template void bear::engine::item_with_toggle::progress ( universe::time_type elapsed_time ) { super::progress(elapsed_time); progress_toggle(elapsed_time); } // item_with_toggle::progress() /*----------------------------------------------------------------------------*/ /** * \brief Add a linked toggle. * \param t The toggle. */ template void bear::engine::item_with_toggle::add_linked_toggle( with_toggle* t ) { m_linked.push_back( toggle_handle::create_from_derived(t) ); } // item_with_toggle::add_linked_toggle() /*----------------------------------------------------------------------------*/ /** * \brief Get the linked toggles. */ template std::vector bear::engine::item_with_toggle::get_linked_toggles() const { std::vector result; result.reserve( m_linked.size() ); for ( handle_list::const_iterator it=m_linked.begin(); it!=m_linked.end(); ++it ) result.push_back( it->get() ); return result; } // item_with_toggle::get_linked_toggles() /*----------------------------------------------------------------------------*/ /** * \brief Get the delay before turning the item off. */ template bear::universe::time_type bear::engine::item_with_toggle::get_delay() const { return m_delay; } // item_with_toggle::get_delay() /*----------------------------------------------------------------------------*/ /** * \brief Delay before turning the item off * \param d The delay. */ template void bear::engine::item_with_toggle::set_delay( universe::time_type d ) { m_delay = d; } // item_with_toggle::set_delay() /*----------------------------------------------------------------------------*/ /** * \brief Set the sample played when the toggle is on. * \param s The sample. */ template void bear::engine::item_with_toggle::set_sample( audio::sample* s ) { delete m_sample; m_sample = s; } // item_with_toggle::set_sample() /*----------------------------------------------------------------------------*/ /** * \brief Set the fade out duration of the sample. * \param d The duration. */ template void bear::engine::item_with_toggle::set_fadeout( universe::time_type d ) { m_fadeout = d; } // item_with_toggle::set_fadeout() /*----------------------------------------------------------------------------*/ /** * \brief Tell if the toggle is turned on. */ template bool bear::engine::item_with_toggle::is_on() const { return m_is_on; } // item_with_toggle::is_on() /*----------------------------------------------------------------------------*/ /** * \brief Turn the toggle on. * \param activator The item that activates the toggle, if any. */ template void bear::engine::item_with_toggle::toggle_on( base_item* activator ) { if ( !is_on() && !this->is_dead() ) { m_is_on = true; m_elapsed_time = 0; play_sound(); on_toggle_on(activator); toggle_linked( activator ); if ( m_delay == 0 ) toggle_off(activator); } } // item_with_toggle::toggle_on() /*----------------------------------------------------------------------------*/ /** * \brief Turn the toggle off. * \param activator The item that activates the toggle, if any. */ template void bear::engine::item_with_toggle::toggle_off( base_item* activator ) { if ( is_on() && !this->is_dead() ) { m_is_on = false; stop_sound(); on_toggle_off(activator); toggle_linked( activator ); } } // item_with_toggle::toggle_off() /*----------------------------------------------------------------------------*/ /** * \brief Get the items concerned by a progress/move of this one. * \param d (out) A list to which are added such items. */ template void bear::engine::item_with_toggle::get_dependent_items ( typename super::item_list& d ) const { handle_list::const_iterator it; for (it=m_linked.begin(); it!=m_linked.end(); ++it) if ( *it != (with_toggle*)NULL ) d.push_back(it->get_item()); } // item_with_toggle::get_dependent_items() /*----------------------------------------------------------------------------*/ /** * \brief Do one iteration in the progression of the item. * \param elapsed_time Elapsed time since the last call. */ template void bear::engine::item_with_toggle::progress_toggle ( universe::time_type elapsed_time ) { if ( is_on() ) { if (m_elapsed_time + elapsed_time >= m_delay) { const universe::time_type new_duration (m_elapsed_time + elapsed_time - m_delay); const universe::time_type old_duration(m_delay - m_elapsed_time); if ( old_duration > 0 ) progress_on( old_duration ); toggle_off(this); if ( new_duration > 0 ) progress_off( new_duration ); } else { m_elapsed_time += elapsed_time; progress_on(elapsed_time); } } else progress_off(elapsed_time); } // item_with_toggle::progress_toggle() /*----------------------------------------------------------------------------*/ /** * \brief Initialise the item in its activated state. * * You should overload this method when the initialisation of your item must do * different things than a call to on_toggle_on(NULL). */ template void bear::engine::item_with_toggle::build_on() { on_toggle_on(NULL); } // item_with_toggle::build_on() /*----------------------------------------------------------------------------*/ /** * \brief Initialise the item in its deactivated state. * * You should overload this method when the initialisation of your item must do * different things than a call to on_toggle_off(NULL). */ template void bear::engine::item_with_toggle::build_off() { on_toggle_off(NULL); } // item_with_toggle::build_off() /*----------------------------------------------------------------------------*/ /** * \brief This method is called when the toggles switches on. * \param activator The item that activates the toggle, if any. */ template void bear::engine::item_with_toggle::on_toggle_on( base_item* activator ) { // nothing to do } // item_with_toggle::on_toggle_on() /*----------------------------------------------------------------------------*/ /** * \brief This method is called when the toggles switches off. * \param activator The item that deactivates the toggle, if any. */ template void bear::engine::item_with_toggle::on_toggle_off( base_item* activator ) { // nothing to do } // item_with_toggle::on_toggle_off() /*----------------------------------------------------------------------------*/ /** * \brief Progress the item as it is turned on. * \param elapsed_time The duration of the activity. */ template void bear::engine::item_with_toggle::progress_on ( universe::time_type elapsed_time ) { progress_sound(); } // item_with_toggle::progress_on() /*----------------------------------------------------------------------------*/ /** * \brief Progress the item as it is turned off. * \param elapsed_time The duration of the activity. */ template void bear::engine::item_with_toggle::progress_off ( universe::time_type elapsed_time ) { // nothing to do } // item_with_toggle::progress_off() /*----------------------------------------------------------------------------*/ /** * \brief Play the sample. */ template void bear::engine::item_with_toggle::play_sound() const { if ( m_sample == NULL ) return; audio::sound_effect effect(m_sample->get_effect()); if (!this->is_global()) effect.set_position( this->get_center_of_mass() ); m_sample->play(effect); } // item_with_toggle::play_sound() /*----------------------------------------------------------------------------*/ /** * \brief Stop the sample. */ template void bear::engine::item_with_toggle::stop_sound() const { if ( m_sample != NULL ) m_sample->stop(m_fadeout); } // item_with_toggle::stop_sound() /*----------------------------------------------------------------------------*/ /** * \brief Update the position of the sample. */ template void bear::engine::item_with_toggle::progress_sound() const { if ( !this->is_global() && (m_sample != NULL) ) { audio::sound_effect effect(m_sample->get_effect()); effect.set_position( this->get_center_of_mass() ); m_sample->set_effect(effect); } } // item_with_toggle::progress_sound() /*----------------------------------------------------------------------------*/ /** * \brief Toggle the linked toggles. * \param activator The item that changed the state of the toggle, if any. */ template void bear::engine::item_with_toggle::toggle_linked ( base_item* activator ) { handle_list::iterator it; for (it=m_linked.begin(); it!=m_linked.end(); ++it) if ( *it == (with_toggle*)NULL ) it = m_linked.erase(it); else (*it)->toggle( m_is_on, activator ); } // item_with_toggle::toggle_linked() plee-the-bear-20251226/bear-engine/core/src/engine/item_brick/impl/item_with_trigger.tpp000066400000000000000000000070271512343254000310500ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::engine::item_with_trigger class. * \author Julien Jorge */ #include /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ template bear::engine::item_with_trigger::item_with_trigger() : m_check_on_progress(true), m_check_on_collision(false) { this->set_phantom(true); } // item_with_trigger::item_with_trigger() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type bool. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ template bool bear::engine::item_with_trigger::set_bool_field ( const std::string& name, bool value ) { bool ok = true; if (name == "item_with_trigger.check_on_collision") m_check_on_collision = value; else if (name == "item_with_trigger.check_on_progress") m_check_on_progress = value; else ok = super::set_bool_field(name, value); return ok; } // item_with_trigger::set_bool_field() /*----------------------------------------------------------------------------*/ /** * \brief Do one iteration in the progression of the item. * \param elapsed_time Elapsed time since the last call. */ template void bear::engine::item_with_trigger::progress ( universe::time_type elapsed_time ) { super::progress(elapsed_time); progress_trigger(elapsed_time); } // item_with_trigger::progress() /*----------------------------------------------------------------------------*/ /** * \brief Check the condition and modify the toggle if true. * \param activator The item that activates the toggle. */ template void bear::engine::item_with_trigger::check_and_toggle( base_item* activator ) { check_condition(activator); } // item_with_trigger::check_and_toggle() /*----------------------------------------------------------------------------*/ /** * \brief Do one iteration in the progression of the item. * \param elapsed_time Elapsed time since the last call. */ template void bear::engine::item_with_trigger::progress_trigger ( universe::time_type elapsed_time ) { if ( m_check_on_progress ) check_and_toggle(this); } // item_with_trigger::progress_trigger() /*----------------------------------------------------------------------------*/ /** * \brief A collision occured with an other item. * \param that The other item of the collision. * \param info Some informations about the collision. */ template void bear::engine::item_with_trigger::collision_trigger ( base_item& that, universe::collision_info& info ) { if ( m_check_on_collision ) { set_collision_data(that, info); check_condition(&that); clear_collision_data(); } } // item_with_trigger::collision_trigger() /*----------------------------------------------------------------------------*/ /** * \brief A collision occured with an other item. * \param that The other item of the collision. * \param info Some informations about the collision. */ template void bear::engine::item_with_trigger::collision ( base_item& that, universe::collision_info& info ) { collision_trigger(that, info); } // item_with_trigger::collision() plee-the-bear-20251226/bear-engine/core/src/engine/item_brick/impl/make_autokill_from_class.tpp000066400000000000000000000017741512343254000323700ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::engine::make_autokill_from_class class. * \author Julien Jorge */ /*----------------------------------------------------------------------------*/ /** * \brief Initialise the item. */ template void bear::engine::make_autokill_from_class::build() { Base::build(); (this->*Method)(); this->kill(); } // make_autokill_from_class::on_toggle_on() /*----------------------------------------------------------------------------*/ /** * \brief Initialise the item. */ template void bear::engine::make_autokill_from_class_const::build() { Base::build(); (this->*Method)(); this->kill(); } // make_autokill_from_class_const::on_toggle_on() plee-the-bear-20251226/bear-engine/core/src/engine/item_brick/impl/make_toggle_on_from_class.tpp000066400000000000000000000022711512343254000325120ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::engine::make_toggle_on_from_class class. * \author Julien Jorge */ /*----------------------------------------------------------------------------*/ /** * \brief This method is called when the toggles switches on. * \param activator The item that activates the toggle, if any. */ template void bear::engine::make_toggle_on_from_class::on_toggle_on ( base_item* activator ) { (this->*Method)(); } // make_toggle_on_from_class::on_toggle_on() /*----------------------------------------------------------------------------*/ /** * \brief This method is called when the toggles switches on. * \param activator The item that activates the toggle, if any. */ template void bear::engine::make_toggle_on_from_class_const::on_toggle_on ( base_item* activator ) { (this->*Method)(); } // make_toggle_on_from_class_const::on_toggle_on() plee-the-bear-20251226/bear-engine/core/src/engine/item_brick/item_with_decoration.hpp000066400000000000000000000051231512343254000305520ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief An item with a decoration (a sprite or an animation). * \author Sebastien Angibaud */ #ifndef __ENGINE_ITEM_WITH_DECORATION_HPP__ #define __ENGINE_ITEM_WITH_DECORATION_HPP__ #include "engine/base_item.hpp" #include "engine/scene_visual.hpp" #include "universe/types.hpp" #include "visual/animation.hpp" #include namespace bear { namespace engine { /** * \brief An item with a decoration (a sprite or an animation). * * \b template \b parameters : * - \a Base: the base class for this item. Must inherit from * engine::base_item and basic_renderable_item. * * The custom fields of this class are: * - sprite: sprite, the sprite of this item, * - animation: animation, the animation of this item, * - item_to_mimic: item, an item from which we copy the visuals, * - any field supported by the parent classes. * * \author Sebastien Angibaud */ template class item_with_decoration: public Base { private: typedef Base super; public: item_with_decoration(); void build(); bool set_sprite_field ( const std::string& name, const visual::sprite& value ); bool set_animation_field ( const std::string& name, const visual::animation& value ); bool set_item_field( const std::string& name, base_item* value ); bool set_bool_field( const std::string& name, bool value ); void progress( universe::time_type elapsed_time ); void get_visual( std::list& visuals ) const; void set_animation( const visual::animation& anim ); void set_sprite( const visual::sprite& spr ); const visual::animation& get_animation() const; visual::sprite get_sprite() const; void auto_size(); void extend_to_bounding_box( bool extend ); protected: visual::animation& get_animation(); private: /** \brief The decoration. */ visual::animation m_animation; /** \brief An item from which we take the sprites. */ base_item* m_item_to_mimic; /** \brief Indicates if the decoration must be extended on the bounding box. */ bool m_extend_on_bounding_box; }; // class item_with_decoration } // namespace engine } // namespace bear #include "engine/item_brick/impl/item_with_decoration.tpp" #endif // __ENGINE_ITEM_WITH_DECORATION_HPP__ plee-the-bear-20251226/bear-engine/core/src/engine/item_brick/item_with_friction.hpp000066400000000000000000000045011512343254000302370ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief An item that have friction on its sides. * \author Sebastien Angibaud */ #ifndef __ENGINE_ITEM_WITH_FRICTION_HPP__ #define __ENGINE_ITEM_WITH_FRICTION_HPP__ #include "engine/base_item.hpp" namespace bear { namespace engine { /** * \brief An item that have friction its sides. * * \b template \b parameters : * - \a Base: the base class for this item. Must inherit from * engine::base_item, * * The custom fields of this class are: * - left_friction: real, the friction applied to the items in contact * on the left (default = 1). * - right_friction: real, the friction applied to the items in contact * on the right (default = 1). * - top_friction: real, the friction applied to the items in contact * on the top (default = 1). * - bottom_friction: real, the friction applied to the items in contact * on the bottom (default = 1). * * \author Sebastien Angibaud */ template class item_with_friction: public Base { typedef Base super; public: item_with_friction(); bool set_real_field( const std::string& name, double value ); double get_left_friction() const; void set_left_friction( double f ); double get_right_friction() const; void set_right_friction( double f ); double get_top_friction() const; void set_top_friction( double f ); double get_bottom_friction() const; void set_bottom_friction( double f ); private: /** \brief The friction applied to the item colliding on the left. */ double m_left_friction; /** \brief The friction applied to the item colliding on the right. */ double m_right_friction; /** \brief The friction applied to the item colliding on the top. */ double m_top_friction; /** \brief The friction applied to the item colliding on the bottom. */ double m_bottom_friction; }; // class item_with_friction } // namespace engine } // namespace bear #include "engine/item_brick/impl/item_with_friction.tpp" #endif // __ENGINE_ITEM_WITH_FRICTION_HPP__ plee-the-bear-20251226/bear-engine/core/src/engine/item_brick/item_with_input_listener.hpp000066400000000000000000000066041512343254000314740ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Inherit from this class to allow your item to read the player's * inputs. * \author Julien Jorge */ #ifndef __ENGINE_ITEM_WITH_INPUT_LISTENER_HPP__ #define __ENGINE_ITEM_WITH_INPUT_LISTENER_HPP__ #include "input/input_listener.hpp" #include "input/input_status.hpp" #include "universe/types.hpp" namespace bear { namespace engine { /** * \brief Inherit from this class to allow your item to read the controller * inputs. * * \b template \b parameters : * - \a Base : the base class for this item. Must inherit from * engine::base_item. * * There is no custom field of this class. * * The processing of the inputs is not done automatically. You must call the * method progress_input_reader() when you are ready to process them. * * \author Julien Jorge */ template class item_with_input_listener: public Base, public input::input_listener { private: typedef Base super; protected: void progress_input_reader( universe::time_type elapsed_time ); virtual bool key_maintained ( universe::time_type elapsed_time, const input::key_info& key ); virtual bool button_maintained ( universe::time_type elapsed_time, input::joystick::joy_code button, unsigned int joy_index ); virtual bool mouse_maintained ( universe::time_type elapsed_time, input::mouse::mouse_code button, const claw::math::coordinate_2d& pos ); virtual bool mouse_pressed_local ( input::mouse::mouse_code button, const universe::position_type& pos ); virtual bool mouse_maintained_local ( universe::time_type elapsed_time, input::mouse::mouse_code button, const universe::position_type& pos ); virtual bool mouse_released_local ( input::mouse::mouse_code button, const universe::position_type& pos ); virtual bool mouse_move_local( const universe::position_type& pos ); virtual bool finger_action_local( const input::finger_event& event ); private: bool key_maintained( const input::key_info& key ); bool button_maintained ( input::joystick::joy_code button, unsigned int joy_index ); bool mouse_pressed ( input::mouse::mouse_code button, const claw::math::coordinate_2d& pos ); bool mouse_maintained ( input::mouse::mouse_code button, const claw::math::coordinate_2d& pos ); bool mouse_released ( input::mouse::mouse_code button, const claw::math::coordinate_2d& pos ); bool mouse_move( const claw::math::coordinate_2d& pos ); bool finger_action( const input::finger_event& event ); private: /** \brief The status of the controllers. */ input::input_status m_input_status; /** \brief Last value of \a elapsed_time passed to progress_input_reader(). */ universe::time_type m_elapsed_time; }; // class item_with_input_listener } // namespace engine } // namespace bear #include "engine/item_brick/impl/item_with_input_listener.tpp" #endif // __ENGINE_ITEM_WITH_INPUT_LISTENER_HPP__ plee-the-bear-20251226/bear-engine/core/src/engine/item_brick/item_with_restricted_z_collision.hpp000066400000000000000000000036311512343254000332010ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief An item that check if the z-position of the other item is in a given * interval before aligning it. * \author Julien Jorge */ #ifndef __ENGINE_ITEM_WITH_RESTRICTED_Z_COLLISION_HPP__ #define __ENGINE_ITEM_WITH_RESTRICTED_Z_COLLISION_HPP__ #include "engine/base_item.hpp" namespace bear { namespace engine { /** * \brief An item that check if the z-position of the other item is in a * given interval before aligning it. * * \b template \b parameters : * - \a Base: the base class for this item. Must inherit from * engine::base_item, * * The custom fields of this class are: * - min_z_for_collision: int, minimum z-position of the other item to align * it (default = -inf.), * - max_z_for_collision: int, maximum z-position of the other item to align * it (default = -inf.). * * \author Julien Jorge */ template class item_with_restricted_z_collision: public Base { typedef Base super; public: item_with_restricted_z_collision(); bool set_integer_field( const std::string& name, int value ); void set_min_z_for_collision( int z ); void set_max_z_for_collision( int z ); protected: bool satisfy_collision_condition( const base_item& that ) const; private: /** \brief Minimum z-position to be aligned. */ int m_min_z; /** \brief Maximum z-position to be aligned. */ int m_max_z; }; // class item_with_restricted_z_collision } // namespace engine } // namespace bear #include "engine/item_brick/impl/item_with_restricted_z_collision.tpp" #endif // __ENGINE_ITEM_WITH_RESTRICTED_Z_COLLISION_HPP__ plee-the-bear-20251226/bear-engine/core/src/engine/item_brick/item_with_text.hpp000066400000000000000000000053351512343254000274140ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief An item with a text inside. * \author Julien Jorge */ #ifndef __ENGINE_ITEM_WITH_TEXT_HPP__ #define __ENGINE_ITEM_WITH_TEXT_HPP__ #include "engine/scene_visual.hpp" #include "engine/item_brick/with_text.hpp" #include "universe/types.hpp" #include "visual/font/font.hpp" #include "visual/writing.hpp" #include namespace bear { namespace engine { /** * \brief An item with a text inside. * * \b template \b parameters : * - \a Base: the base class for this item. Must inherit from * basic_renderable_item. * * The custom fields of this class are: * - text: string, the text in the item (default = empty string), * - font: font, the font to use to display the text (default = none), * - text_inside: boolean, tell if the text is drawn only in the bounds of * the item (default = false), * - stretched_text: boolean, tell if the text has to be stretched to fit * the bounds of the item (default = false), * - scale_to_fit: boolean, tell if the text has to be scaled to fit * the bounds of the item (default = false), * - any field supported by the parent classes. * * \author Julien Jorge */ template class item_with_text: public Base, public with_text { typedef Base super; public: item_with_text(); void build(); bool set_string_field ( const std::string& name, const std::string& value ); bool set_bool_field( const std::string& name, bool value ); bool set_font_field( const std::string& name, visual::font value ); void progress( universe::time_type elapsed_time ); void get_visual( std::list& visuals ) const; void set_text_inside( bool b ); void set_scale_to_fit( bool b ); void set_stretched_text( bool b ); void fit_to_text(); private: bear::visual::position_type get_gap_for_scale_to_fit( const visual::scene_writing& e ) const; private: /** \brief Tell if the text is drawn only in the bounds of the item. */ bool m_text_inside; /** \brief Tell if the text has to be stretched to fit the bounds of the item. */ bool m_stretched_text; /** \brief Tell if the text has to be scaled to fit the bounds of the item. */ bool m_scale_to_fit; }; // class item_with_text } // namespace engine } // namespace bear #include "engine/item_brick/impl/item_with_text.tpp" #endif // __ENGINE_ITEM_WITH_TEXT_HPP__ plee-the-bear-20251226/bear-engine/core/src/engine/item_brick/item_with_toggle.hpp000066400000000000000000000102701512343254000277030ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief An item that can be toggled on or off. * \author Julien Jorge */ #ifndef __ENGINE_ITEM_WITH_TOGGLE_HPP__ #define __ENGINE_ITEM_WITH_TOGGLE_HPP__ #include "audio/sample.hpp" #include "engine/item_brick/with_toggle.hpp" #include "universe/derived_item_handle.hpp" #include "universe/types.hpp" #include #include namespace bear { namespace engine { /** * \brief An item that can be toggled on or off. * * \b template \b parameters : * - \a Base: the base class for this item. Must inherit from base_item. * * The custom fields of this class are: * - initial_state: bool, the initial state (default = off/false), * - delay: real, the delay, in seconds, before turning off automatically * (default = infinity), * - linked_toggles: list of toggles, a list of toggles to which the status * of this toggle is transmitted (default = none), * - any field supported by the parent classes. * * \author Julien Jorge */ template class item_with_toggle: public Base, public with_toggle { typedef Base super; private: /** \brief The type of the handles on the toggles to which the state of this toggle is transmitted. */ typedef universe::derived_item_handle toggle_handle; /** \brief The type of the list of the handles to the toggles to which the state of this toggle is transmitted. */ typedef std::list handle_list; public: item_with_toggle(); item_with_toggle( const item_with_toggle& that ); ~item_with_toggle(); bool set_real_field( const std::string& name, double value ); bool set_bool_field( const std::string& name, bool value ); bool set_sample_field( const std::string& name, audio::sample* value ); bool set_item_list_field ( const std::string& name, const std::vector& value ); void build(); void progress( universe::time_type elapsed_time ); void add_linked_toggle( with_toggle* t ); std::vector get_linked_toggles() const; universe::time_type get_delay() const; void set_delay( universe::time_type d ); void set_sample( audio::sample* s ); void set_fadeout( universe::time_type d ); bool is_on() const; void toggle_on( base_item* activator ); void toggle_off( base_item* activator ); virtual void get_dependent_items( typename super::item_list& d ) const; protected: void progress_toggle( universe::time_type elapsed_time ); virtual void build_on(); virtual void build_off(); virtual void on_toggle_on( base_item* activator ); virtual void on_toggle_off( base_item* activator ); virtual void progress_on( universe::time_type elapsed_time ); virtual void progress_off( universe::time_type elapsed_time ); private: // not implemented item_with_toggle& operator=( const item_with_toggle& that ); void play_sound() const; void stop_sound() const; void progress_sound() const; void toggle_linked( base_item* activator ); private: /** \brief Tell if the item is turned on. */ bool m_is_on; /** \brief Time elapsed since the item has been turned on. */ universe::time_type m_elapsed_time; /** \brief Delay before turning the item off. */ universe::time_type m_delay; /** \brief Fade out the sample during this duration when stopping. */ universe::time_type m_fadeout; /** \brief The sample played when the toggle is on. */ audio::sample* m_sample; /** * \brief A list of toggles to which the state of this toggle is * transmitted. */ handle_list m_linked; }; // class item_with_toggle } // namespace engine } // namespace bear #include "engine/item_brick/impl/item_with_toggle.tpp" #endif // __ENGINE_ITEM_WITH_TOGGLE_HPP__ plee-the-bear-20251226/bear-engine/core/src/engine/item_brick/item_with_trigger.hpp000066400000000000000000000043061512343254000300700ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A trigger to control some toggles. * \author Julien Jorge */ #ifndef __ENGINE_ITEM_WITH_TRIGGER_HPP__ #define __ENGINE_ITEM_WITH_TRIGGER_HPP__ #include "engine/item_brick/with_trigger.hpp" #include "universe/types.hpp" #include namespace bear { namespace engine { /** * \brief A trigger to control some toggles. * * \b template \b parameters : * - \a Base: the base class for this item. * * The custom fields of this class are: * - toggle: item list, the toggles controlled by this trigger * (default = none), * - check_on_progress: bool, check the condition at each progress * (default = true), * - check_on_collision: bool, check the condition at each collision * (default = false), * - mode: string in {one_way, switch, condition}, defines the behaviour of * the trigger (see item_with_trigger::mode) (default = one_way), * - any field supported by the parent classes. * * \author Julien Jorge */ template class item_with_trigger: public Base, public with_trigger { typedef Base super; public: item_with_trigger(); bool set_bool_field( const std::string& name, bool value ); void progress( universe::time_type elapsed_time ); protected: void check_and_toggle( base_item* activator ); void progress_trigger( universe::time_type elapsed_time ); void collision_trigger( base_item& that, universe::collision_info& info ); private: void collision( base_item& that, universe::collision_info& info ); private: /** \brief Tell if the condition is checked at each progress. */ bool m_check_on_progress; /** \brief Tell if the condition is checked at each collision. */ bool m_check_on_collision; }; // class item_with_trigger } // namespace engine } // namespace bear #include "engine/item_brick/impl/item_with_trigger.tpp" #endif // __ENGINE_ITEM_WITH_TRIGGER_HPP__ plee-the-bear-20251226/bear-engine/core/src/engine/item_brick/loader/000077500000000000000000000000001512343254000251065ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/core/src/engine/item_brick/loader/activable_sides_loader.hpp000066400000000000000000000031171512343254000322700ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief The item loader for activable_sides. * \author Julien Jorge */ #ifndef __ENGINE_ACTIVABLE_SIDES_LOADER_HPP__ #define __ENGINE_ACTIVABLE_SIDES_LOADER_HPP__ #include #include "engine/class_export.hpp" #include "engine/loader/item_loader_base.hpp" namespace bear { namespace engine { class activable_sides; /** * \brief The item loader for the activable_sides. * * The custom fields of this class are: * - left_side_is_active: bool, tell if the left side is active * (default = false), * - right_side_is_active: bool, tell if the right side is active * (default = false), * - top_side_is_active: bool, tell if the top side is active * (default = false), * - bottom_side_is_active: bool, tell if the bottom side is active * (default = false). * * \author Julien Jorge */ class ENGINE_EXPORT activable_sides_loader: public item_loader_base { public: explicit activable_sides_loader( activable_sides& item ); virtual activable_sides_loader* clone() const; virtual bool set_field( const std::string& name, bool value ); private: /** \brief The item loaded by this loader. */ activable_sides& m_item; }; // class activable_sides_loader } // namespace engine } // namespace bear #endif // __ENGINE_ACTIVABLE_SIDES_LOADER_HPP__ plee-the-bear-20251226/bear-engine/core/src/engine/item_brick/loader/code/000077500000000000000000000000001512343254000260205ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/core/src/engine/item_brick/loader/code/activable_sides_loader.cpp000066400000000000000000000036101512343254000331730ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::engine::activable_sides_loader class. * \author Julien Jorge. */ #include "engine/item_brick/loader/activable_sides_loader.hpp" #include "engine/item_brick/activable_sides.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param item The item loaded by this loader. */ bear::engine::activable_sides_loader::activable_sides_loader ( activable_sides& item ) : item_loader_base("item_with_activable_sides"), m_item(item) { } // activable_sides_loader::activable_sides_loader() /*----------------------------------------------------------------------------*/ /** * \brief Instanciate a copy of this object. */ bear::engine::activable_sides_loader* bear::engine::activable_sides_loader::clone() const { return new activable_sides_loader(*this); } // activable_sides_loader::clone() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type \c bool. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::engine::activable_sides_loader::set_field ( const std::string& name, bool value ) { bool ok(true); if (name == "left_side_is_active") m_item.set_left_side_activation( value ); else if (name == "right_side_is_active") m_item.set_right_side_activation( value ); else if (name == "top_side_is_active") m_item.set_top_side_activation( value ); else if (name == "bottom_side_is_active") m_item.set_bottom_side_activation( value ); else ok = false; return ok; } // activable_sides_loader::set_field() forced_movement_applicator_loader.cpp000066400000000000000000000035461512343254000353750ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/core/src/engine/item_brick/loader/code/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::engine::forced_movement_applicator_loader * class. * \author Julien Jorge. */ #include "engine/item_brick/loader/forced_movement_applicator_loader.hpp" #include "engine/item_brick/forced_movement_applicator.hpp" #include "engine/base_item.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param item The item loaded by this loader. */ bear::engine::forced_movement_applicator_loader:: forced_movement_applicator_loader ( forced_movement_applicator& item ) : forced_movement_loader("forced_movement_applicator", item.m_movement), m_item(item) { } // forced_movement_applicator_loader::forced_movement_applicator_loader() /*----------------------------------------------------------------------------*/ /** * \brief Instantiates a copy of this object. */ bear::engine::forced_movement_applicator_loader* bear::engine::forced_movement_applicator_loader::clone() const { return new forced_movement_applicator_loader(*this); } // forced_movement_applicator_loader::clone() /*----------------------------------------------------------------------------*/ /** * \brief Sets a field of type "list of item". * \param name The name of the field. * \param value The value of the field. */ bool bear::engine::forced_movement_applicator_loader::set_field ( const std::string& name, const std::vector& value ) { bool result = true; if ( name == "actor" ) m_item.m_actor.insert( m_item.m_actor.end(), value.begin(), value.end() ); else result = false; return result; } // forced_movement_applicator_loader::set_field() plee-the-bear-20251226/bear-engine/core/src/engine/item_brick/loader/code/forced_movement_loader.cpp000066400000000000000000000066451512343254000332410ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::engine::forced_movement_loader class. * \author Julien Jorge. */ #include "engine/item_brick/loader/forced_movement_loader.hpp" #include "engine/base_item.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param prefix The prefix of the fields loaded by this loader. * \param movement The movement by this loader. */ bear::engine::forced_movement_loader::forced_movement_loader ( const std::string& prefix, universe::forced_movement& mvt ) : item_loader_base( prefix ), m_forced_movement(mvt) { } // forced_movement_loader::forced_movement_loader() /*----------------------------------------------------------------------------*/ /** * \brief Instanciate a copy of this object. */ bear::engine::forced_movement_loader* bear::engine::forced_movement_loader::clone() const { return new forced_movement_loader(*this); } // forced_movement_loader::clone() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type \c bool. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::engine::forced_movement_loader::set_field ( const std::string& name, bool value ) { bool result = true; if ( name == "auto_remove" ) m_forced_movement.set_auto_remove( value ); else if ( name == "auto_angle" ) m_forced_movement.set_auto_angle( value ); else result = false; return result; } // forced_movement_loader::set_field() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type real. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::engine::forced_movement_loader::set_field ( const std::string& name, double value ) { bool ok(true); if (name == "actor.ratio.x") m_forced_movement.set_moving_item_ratio ( universe::position_type ( value, m_forced_movement.get_moving_item_ratio().y ) ); else if (name == "actor.ratio.y") m_forced_movement.set_moving_item_ratio ( universe::position_type ( m_forced_movement.get_moving_item_ratio().x, value ) ); else if (name == "actor.gap.x") m_forced_movement.set_moving_item_gap ( universe::position_type ( value, m_forced_movement.get_moving_item_gap().y ) ); else if (name == "actor.gap.y") m_forced_movement.set_moving_item_gap ( universe::position_type ( m_forced_movement.get_moving_item_gap().x, value ) ); else ok = false; return ok; } // forced_movement_loader::set_field() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type "item". * \param name The name of the field. * \param value The value of the field. */ bool bear::engine::forced_movement_loader::set_field ( const std::string& name, engine::base_item* value ) { bool result = true; if ( name == "movement" ) m_forced_movement = value->get_forced_movement(); else result = false; return result; } // forced_movement_loader::set_field() forced_movement_repeater_loader.cpp000066400000000000000000000055701512343254000350450ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/core/src/engine/item_brick/loader/code/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::engine::forced_movement_repeater_loader * class. * \author Julien Jorge. */ #include "engine/item_brick/loader/forced_movement_repeater_loader.hpp" #include "engine/item_brick/forced_movement_repeater.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param item The item loaded by this loader. */ bear::engine::forced_movement_repeater_loader::forced_movement_repeater_loader ( forced_movement_repeater& item ) : forced_movement_loader("forced_movement_repeater", item.m_movement), m_item(item) { } // forced_movement_repeater_loader::forced_movement_repeater_loader() /*----------------------------------------------------------------------------*/ /** * \brief Instanciate a copy of this object. */ bear::engine::forced_movement_repeater_loader* bear::engine::forced_movement_repeater_loader::clone() const { return new forced_movement_repeater_loader(*this); } // forced_movement_repeater_loader::clone() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type \c unsigned int. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::engine::forced_movement_repeater_loader::set_field ( const std::string& name, unsigned int value ) { bool result = true; if ( name == "count" ) m_item.m_count = value; else result = false; return result; } // forced_movement_repeater_loader::set_field() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type real. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::engine::forced_movement_repeater_loader::set_field ( const std::string& name, double value ) { bool ok(true); if (name == "delay") m_item.m_delay = value; else ok = forced_movement_loader::set_field( name, value ); return ok; } // forced_movement_repeater_loader::set_field() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type "item". * \param name The name of the field. * \param value The value of the field. */ bool bear::engine::forced_movement_repeater_loader::set_field ( const std::string& name, engine::base_item* value ) { bool result = true; if ( name == "actor" ) m_item.m_actor = value; else result = forced_movement_loader::set_field( name, value ); return result; } // forced_movement_repeater_loader::set_field() plee-the-bear-20251226/bear-engine/core/src/engine/item_brick/loader/code/single_tweener_loader.cpp000066400000000000000000000046331512343254000330720ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::engine::single_tweener_loader class. * \author Julien Jorge. */ #include "engine/item_brick/loader/single_tweener_loader.hpp" #include "engine/item_brick/z_shift.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param prefix The prefix of the field names read by this loader. * \param tweener The tweener loaded by this loader. */ bear::engine::single_tweener_loader::single_tweener_loader ( std::string prefix, claw::tween::single_tweener& tweener ) : item_loader_base(prefix), m_tweener(tweener) { } // single_tweener_loader::single_tweener_loader() /*----------------------------------------------------------------------------*/ /** * \brief Instanciates a copy of this object. */ bear::engine::single_tweener_loader* bear::engine::single_tweener_loader::clone() const { return new single_tweener_loader(*this); } // single_tweener_loader::clone() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type \c real. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::engine::single_tweener_loader::set_field ( const std::string& name, double value ) { bool ok(true); if (name == "origin") m_tweener.set_init( value ); else if (name == "target") m_tweener.set_end( value ); else if (name == "duration") m_tweener.set_duration( value ); else ok = item_loader_base::set_field( name, value ); return ok; } // single_tweener_loader::set_field() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type \c easing function. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::engine::single_tweener_loader::set_field ( const std::string& name, easing_function value ) { bool ok(true); if (name == "easing") m_tweener.set_easing( value ); else ok = item_loader_base::set_field( name, value ); return ok; } // single_tweener_loader::set_field() plee-the-bear-20251226/bear-engine/core/src/engine/item_brick/loader/code/z_shift_loader.cpp000066400000000000000000000037721512343254000315310ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::engine::z_shift_loader class. * \author Julien Jorge. */ #include "engine/item_brick/loader/z_shift_loader.hpp" #include "engine/item_brick/z_shift.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param item The item loaded by this loader. */ bear::engine::z_shift_loader::z_shift_loader( z_shift& item ) : item_loader_base("item_with_z_shift"), m_item(item) { } // z_shift_loader::z_shift_loader() /*----------------------------------------------------------------------------*/ /** * \brief Instanciate a copy of this object. */ bear::engine::z_shift_loader* bear::engine::z_shift_loader::clone() const { return new z_shift_loader(*this); } // z_shift_loader::clone() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type \c integer. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::engine::z_shift_loader::set_field ( const std::string& name, int value ) { bool ok(true); if (name == "z_shift") m_item.set_z_shift( value ); else ok = false; return ok; } // z_shift_loader::set_field() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type \c bool. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::engine::z_shift_loader::set_field ( const std::string& name, bool value ) { bool ok(true); if (name == "force_z_position") m_item.set_force_z_position( value ); else ok = false; return ok; } // z_shift_loader::set_field() forced_movement_applicator_loader.hpp000066400000000000000000000045441512343254000344670ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/core/src/engine/item_brick/loader/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief The item loader for forced_movement_applicator. * \author Julien Jorge */ #ifndef __ENGINE_FORCED_MOVEMENT_APPLICATOR_LOADER_HPP__ #define __ENGINE_FORCED_MOVEMENT_APPLICATOR_LOADER_HPP__ #include #include "engine/class_export.hpp" #include "engine/item_brick/loader/forced_movement_loader.hpp" #include "universe/types.hpp" namespace bear { namespace engine { class forced_movement_applicator; /** * \brief The item loader for the forced_movement_applicator. * * The custom fields of this class are: * * - \a actor: (item list) \b the item to which the movement is applied * (default = none), * - \a movement: (item) \b [required] \c an item having a movement * applied to him, the movement that will be applied to the actor, * - \a auto_remove: (bool) \c tell if the movement removes himself * from the moving item when finished (default = false). * - \a auto_remove: (bool) Tell if the angle of moving items are * updated according to their angular speed (default = false). * - ratio.x: real, the ratio of width to compute actor's position * (0 for left side, 0.5 for middle, 1 for right side). (default = 0.5) * - ratio.y: real, the ratio of height to compute actor's position * (0 for bottom side, 0.5 for middle, 1 for top side). (default = 0.5) * - gap.x: real, The x-gap to applied. (default = 0) * - gap.y: real, The y-gap to applied. (default = 0) * * \author Julien Jorge */ class ENGINE_EXPORT forced_movement_applicator_loader: public forced_movement_loader { public: explicit forced_movement_applicator_loader ( forced_movement_applicator& item ); virtual forced_movement_applicator_loader* clone() const; bool set_field ( const std::string& name, const std::vector& value ); private: /** \brief The item loaded by this loader. */ forced_movement_applicator& m_item; }; // class forced_movement_applicator_loader } // namespace engine } // namespace bear #endif // __ENGINE_FORCED_MOVEMENT_APPLICATOR_LOADER_HPP__ plee-the-bear-20251226/bear-engine/core/src/engine/item_brick/loader/forced_movement_loader.hpp000066400000000000000000000043361512343254000323270ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief The item loader for forced_movement. * \author Julien Jorge */ #ifndef __ENGINE_FORCED_MOVEMENT_LOADER_HPP__ #define __ENGINE_FORCED_MOVEMENT_LOADER_HPP__ #include #include "engine/class_export.hpp" #include "engine/loader/item_loader_base.hpp" #include "universe/forced_movement/forced_movement.hpp" #include "universe/types.hpp" namespace bear { namespace engine { /** * \brief The item loader for the forced_movement. * * The custom fields of this class are: * * - \a movement: (item) \b [required] \c an item having a movement * applied to him, * - \a auto_remove: (bool) \c tell if the movement removes himself * from the moving item when finished (default = false). * - \a auto_remove: (bool) Tell if the angle of moving items are * updated according to their angular speed (default = false). * - ratio.x: real, the ratio of width to compute actor's position * (0 for left side, 0.5 for middle, 1 for right side). (default = 0.5) * - ratio.y: real, the ratio of height to compute actor's position * (0 for bottom side, 0.5 for middle, 1 for top side). (default = 0.5) * - gap.x: real, The x-gap to applied. (default = 0) * - gap.y: real, The y-gap to applied. (default = 0) * * \author Julien Jorge */ class ENGINE_EXPORT forced_movement_loader: public item_loader_base { public: forced_movement_loader ( const std::string& prefix, universe::forced_movement& mvt ); virtual forced_movement_loader* clone() const; bool set_field( const std::string& name, bool value ); bool set_field( const std::string& name, double value ); bool set_field( const std::string& name, base_item* value ); private: /** \brief The item loaded by this loader. */ universe::forced_movement& m_forced_movement; }; // class forced_movement_loader } // namespace engine } // namespace bear #endif // __ENGINE_FORCED_MOVEMENT_LOADER_HPP__ forced_movement_repeater_loader.hpp000066400000000000000000000035341512343254000341360ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/core/src/engine/item_brick/loader/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief The item loader for forced_movement_repeater. * \author Julien Jorge */ #ifndef __ENGINE_FORCED_MOVEMENT_REPEATER_LOADER_HPP__ #define __ENGINE_FORCED_MOVEMENT_REPEATER_LOADER_HPP__ #include #include "engine/class_export.hpp" #include "engine/item_brick/loader/forced_movement_loader.hpp" #include "universe/types.hpp" namespace bear { namespace engine { class forced_movement_repeater; /** * \brief The item loader for the forced_movement_repeater. * * The custom fields of this class are: * * - \a actor: (item) the item to which and to the clones of which * the movement is applied (default = none), * - \a count: (unsigned int) the number of clones to create (default = 0), * - \a delay: (real) the time interval between the placement of two * clones, * - any field supported by the parent classes. * * \author Julien Jorge */ class ENGINE_EXPORT forced_movement_repeater_loader: public forced_movement_loader { public: explicit forced_movement_repeater_loader ( forced_movement_repeater& item ); virtual forced_movement_repeater_loader* clone() const; bool set_field( const std::string& name, unsigned int value ); bool set_field( const std::string& name, double value ); bool set_field( const std::string& name, base_item* value ); private: /** \brief The item loaded by this loader. */ forced_movement_repeater& m_item; }; // class forced_movement_repeater_loader } // namespace engine } // namespace bear #endif // __ENGINE_FORCED_MOVEMENT_REPEATER_LOADER_HPP__ plee-the-bear-20251226/bear-engine/core/src/engine/item_brick/loader/single_tweener_loader.hpp000066400000000000000000000032331512343254000321600ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief The item loader for a claw::tween::single_tweener. * \author Julien Jorge */ #ifndef __ENGINE_SINGLE_TWEENER_LOADER_HPP__ #define __ENGINE_SINGLE_TWEENER_LOADER_HPP__ #include #include "engine/class_export.hpp" #include "engine/loader/item_loader_base.hpp" namespace bear { namespace engine { /** * \brief The item loader for the claw::tween::single_tweener. * * The custom fields of this class are: * - origin: real, the initial value of the tweener (default = 0), * - target: real, the final value of the tweener (default = 1), * - duration: real, the duration of the interpolation in seconds * (default = 1), * - easing: easing_function, the easing function applied to the tweener * (default = none). * * \author Julien Jorge */ class ENGINE_EXPORT single_tweener_loader: public item_loader_base { public: single_tweener_loader ( std::string prefix, claw::tween::single_tweener& tweener ); virtual single_tweener_loader* clone() const; virtual bool set_field( const std::string& name, double value ); virtual bool set_field( const std::string& name, easing_function value ); private: /** \brief The tweener loaded by this loader. */ claw::tween::single_tweener& m_tweener; }; // class single_tweener_loader } // namespace engine } // namespace bear #endif // __ENGINE_SINGLE_TWEENER_LOADER_HPP__ plee-the-bear-20251226/bear-engine/core/src/engine/item_brick/loader/z_shift_loader.hpp000066400000000000000000000025441512343254000306200ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief The item loader for z_shift. * \author Julien Jorge */ #ifndef __ENGINE_Z_SHIFT_LOADER_HPP__ #define __ENGINE_Z_SHIFT_LOADER_HPP__ #include #include "engine/class_export.hpp" #include "engine/loader/item_loader_base.hpp" namespace bear { namespace engine { class z_shift; /** * \brief The item loader for the z_shift. * * The custom fields of this class are: * - z_shift: int, Relative z position to put the other item at * (default = 0). * - force_z_position : bool, Indicates if the item force the z_position. * * \author Julien Jorge */ class ENGINE_EXPORT z_shift_loader: public item_loader_base { public: explicit z_shift_loader( z_shift& item ); virtual z_shift_loader* clone() const; virtual bool set_field( const std::string& name, int value ); virtual bool set_field( const std::string& name, bool value ); private: /** \brief The item loaded by this loader. */ z_shift& m_item; }; // class z_shift_loader } // namespace engine } // namespace bear #endif // __ENGINE_Z_SHIFT_LOADER_HPP__ plee-the-bear-20251226/bear-engine/core/src/engine/item_brick/make_autokill_from_class.hpp000066400000000000000000000032011512343254000313760ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief This class calls a method of an existing class in its build, then * commit suicide. * \author Julien Jorge */ #ifndef __ENGINE_MAKE_AUTOKILL_FROM_CLASS_HPP__ #define __ENGINE_MAKE_AUTOKILL_FROM_CLASS_HPP__ namespace bear { namespace engine { /** * \brief This class calls a method of an existing class in its build, then * commit suicide. * * \b Template \b parameters: * - \a Base The base class, in which we call the method. * - \a Method The method to call in Base. * * \author Julien Jorge */ template class make_autokill_from_class: public Base { private: void build(); }; // class make_autokill_from_class /** * \brief This class calls a const method of an existing class in its build, * then commit suicide. * * \b Template \b parameters: * - \a Base The base class, in which we call the method. * - \a Method The method to call in Base. * * \author Julien Jorge */ template class make_autokill_from_class_const: public Base { private: void build(); }; // class make_autokill_from_class_const } // namespace engine } // namespace bear #include "engine/item_brick/impl/make_autokill_from_class.tpp" #endif // __ENGINE_MAKE_AUTOKILL_FROM_CLASS_HPP__ plee-the-bear-20251226/bear-engine/core/src/engine/item_brick/make_toggle_on_from_class.hpp000066400000000000000000000034401512343254000315340ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief This class defines a toggle calling a method of an existing class * when toggled on. * \author Julien Jorge */ #ifndef __ENGINE_MAKE_TOGGLE_ON_FROM_CLASS_HPP__ #define __ENGINE_MAKE_TOGGLE_ON_FROM_CLASS_HPP__ #include "engine/item_brick/item_with_toggle.hpp" namespace bear { namespace engine { /** * \brief This class defines a toggle calling a method of an existing class * when toggled on. * * \b Template \b parameters: * - \a Base The base class, in which we call the method. * - \a Method The method to call in Base. * * \author Julien Jorge */ template class make_toggle_on_from_class: public item_with_toggle { private: void on_toggle_on( base_item* activator ); }; // class make_toggle_on_from_class /** * \brief This class defines a toggle calling a constant method of an * existing class when toggled on. * * \b Template \b parameters: * - \a Base The base class, in which we call the method. * - \a Method The method to call in Base. * * \author Julien Jorge */ template class make_toggle_on_from_class_const: public item_with_toggle { private: void on_toggle_on( base_item* activator ); }; // class make_toggle_on_from_class_const } // namespace engine } // namespace bear #include "engine/item_brick/impl/make_toggle_on_from_class.tpp" #endif // __ENGINE_MAKE_TOGGLE_ON_FROM_CLASS_HPP__ plee-the-bear-20251226/bear-engine/core/src/engine/item_brick/with_boolean_expression_assignment.hpp000066400000000000000000000024601512343254000335340ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief An utility class to serve as a base class for items that can * receive boolean expressions. * \author Julien Jorge */ #ifndef __ENGINE_WITH_BOOLEAN_EXPRESSION_ASSIGNMENT_HPP__ #define __ENGINE_WITH_BOOLEAN_EXPRESSION_ASSIGNMENT_HPP__ #include "expr/boolean_expression.hpp" #include "engine/class_export.hpp" namespace bear { namespace engine { /** * \brief An utility class to serve as a base class for items that can * receive boolean expressions. * * \author Julien Jorge */ class ENGINE_EXPORT with_boolean_expression_assignment { public: /** \brief The type of the expression created. */ typedef expr::boolean_expression expression_type; public: virtual ~with_boolean_expression_assignment(); void set_expression( const expr::boolean_expression& e ); private: virtual void do_set_expression( const expr::boolean_expression& e ) = 0; }; // class with_boolean_expression_assignment } // namespace engine } // namespace bear #endif // __ENGINE_WITH_BOOLEAN_EXPRESSION_ASSIGNMENT_HPP__ plee-the-bear-20251226/bear-engine/core/src/engine/item_brick/with_boolean_expression_creation.hpp000066400000000000000000000024321512343254000331670ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief An utility class to serve as a base class for items that can * instanciate boolean expressions. * \author Julien Jorge */ #ifndef __ENGINE_WITH_BOOLEAN_EXPRESSION_CREATION_HPP__ #define __ENGINE_WITH_BOOLEAN_EXPRESSION_CREATION_HPP__ #include "expr/boolean_expression.hpp" #include "engine/class_export.hpp" namespace bear { namespace engine { /** * \brief An utility class to serve as a base class for items that can * instanciate boolean expressions. * * \author Julien Jorge */ class ENGINE_EXPORT with_boolean_expression_creation { public: /** \brief The type of the expression created. */ typedef expr::boolean_expression expression_type; public: virtual ~with_boolean_expression_creation(); expr::boolean_expression get_expression() const; private: virtual expr::boolean_expression do_get_expression() const = 0; }; // class with_boolean_expression_creation } // namespace engine } // namespace bear #endif // __ENGINE_WITH_BOOLEAN_EXPRESSION_CREATION_HPP__ plee-the-bear-20251226/bear-engine/core/src/engine/item_brick/with_expression_assignment.hpp000066400000000000000000000036071512343254000320410ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief An utility class to determine the item brick to use as the * assignment class for a given expression type. * \author Julien Jorge */ #ifndef __ENGINE_WITH_EXPRESSION_ASSIGNMENT_HPP__ #define __ENGINE_WITH_EXPRESSION_ASSIGNMENT_HPP__ #include "engine/item_brick/with_boolean_expression_assignment.hpp" #include "engine/item_brick/with_linear_expression_assignment.hpp" #include #include #include namespace bear { namespace engine { /** * \brief An utility class to determine the item brick to use as the * assignment class for a given expression type. * * \author Julien Jorge */ template class with_expression_assignment { public: /** \brief The type of the class to use to instanciate Expression. */ typedef typename claw::meta::if_then_else < claw::meta::is_base_of /* check if it's a boolean expression. */ < expr::base_boolean_expression, Expression >::result, with_boolean_expression_assignment, typename claw::meta::if_then_else /* maybe a linear expression then? */ < claw::meta::is_base_of < expr::base_linear_expression, Expression >::result, with_linear_expression_assignment, claw::meta::no_type /* I can't determine the expression. */ >::result >::result assignment_class_type; }; // class with_expression_assignment } // namespace engine } // namespace bear #endif // __ENGINE_WITH_EXPRESSION_ASSIGNMENT_HPP__ plee-the-bear-20251226/bear-engine/core/src/engine/item_brick/with_expression_creation.hpp000066400000000000000000000051531512343254000314730ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief An utility class to determine the item brick to use as the * creation class for a given expression type. * \author Julien Jorge */ #ifndef __ENGINE_WITH_EXPRESSION_CREATION_HPP__ #define __ENGINE_WITH_EXPRESSION_CREATION_HPP__ #include "engine/item_brick/with_boolean_expression_creation.hpp" #include "engine/item_brick/with_linear_expression_creation.hpp" #include #include #include #include namespace bear { namespace engine { /** * \brief An utility class to determine the item brick to use as the * creation class for a given expression type. * * \author Julien Jorge */ template class with_expression_creation { public: /** \brief The type of the class to use to instanciate Expression. */ typedef typename claw::meta::if_then_else < claw::meta::is_base_of /* check if it's a boolean expression. */ < expr::base_boolean_expression, Expression >::result, with_boolean_expression_creation, typename claw::meta::if_then_else /* maybe a linear expression then? */ < claw::meta::is_base_of < expr::base_linear_expression, Expression >::result, with_linear_expression_creation, typename claw::meta::if_then_else < claw::meta::same_type /* general boolean expression. */ < expr::boolean_expression, Expression >::result, with_boolean_expression_creation, typename claw::meta::if_then_else /* general linear expression */ < claw::meta::same_type < expr::linear_expression, Expression >::result, with_linear_expression_creation, claw::meta::no_type /* I can't determine the expression. */ >::result /* linear_expression */ >::result /* boolean expression */ >::result /* base_linear_expression */ >::result /* base_boolean_expression */ creation_class_type; }; // class with_expression_creation } // namespace engine } // namespace bear #endif // __ENGINE_WITH_EXPRESSION_CREATION_HPP__ plee-the-bear-20251226/bear-engine/core/src/engine/item_brick/with_linear_expression_assignment.hpp000066400000000000000000000024441512343254000333710ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief An utility class to serve as a base class for items that can * receive linear expressions. * \author Julien Jorge */ #ifndef __ENGINE_WITH_LINEAR_EXPRESSION_ASSIGNMENT_HPP__ #define __ENGINE_WITH_LINEAR_EXPRESSION_ASSIGNMENT_HPP__ #include "expr/linear_expression.hpp" #include "engine/class_export.hpp" namespace bear { namespace engine { /** * \brief An utility class to serve as a base class for items that can * receive linear expressions. * * \author Julien Jorge */ class ENGINE_EXPORT with_linear_expression_assignment { public: /** \brief The type of the expression created. */ typedef expr::linear_expression expression_type; public: virtual ~with_linear_expression_assignment(); void set_expression( const expr::linear_expression& e ); private: virtual void do_set_expression( const expr::linear_expression& e ) = 0; }; // class with_linear_expression_assignment } // namespace engine } // namespace bear #endif // __ENGINE_WITH_LINEAR_EXPRESSION_ASSIGNMENT_HPP__ plee-the-bear-20251226/bear-engine/core/src/engine/item_brick/with_linear_expression_creation.hpp000066400000000000000000000024161512343254000330240ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief An utility class to serve as a base class for items that can * instanciate linear expressions. * \author Julien Jorge */ #ifndef __ENGINE_WITH_LINEAR_EXPRESSION_CREATION_HPP__ #define __ENGINE_WITH_LINEAR_EXPRESSION_CREATION_HPP__ #include "expr/linear_expression.hpp" #include "engine/class_export.hpp" namespace bear { namespace engine { /** * \brief An utility class to serve as a base class for items that can * instanciate linear expressions. * * \author Julien Jorge */ class ENGINE_EXPORT with_linear_expression_creation { public: /** \brief The type of the expression created. */ typedef expr::linear_expression expression_type; public: virtual ~with_linear_expression_creation(); expr::linear_expression get_expression() const; private: virtual expr::linear_expression do_get_expression() const = 0; }; // class with_linear_expression_creation } // namespace engine } // namespace bear #endif // __ENGINE_WITH_LINEAR_EXPRESSION_CREATION_HPP__ plee-the-bear-20251226/bear-engine/core/src/engine/item_brick/with_rendering_attributes.hpp000066400000000000000000000024201512343254000316250ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief An item with a visual::bitmap_rendering_attributes. * \author Julien Jorge */ #ifndef __ENGINE_WITH_RENDERING_ATTRIBUTES_HPP__ #define __ENGINE_WITH_RENDERING_ATTRIBUTES_HPP__ #include "visual/bitmap_rendering_attributes.hpp" #include "engine/class_export.hpp" namespace bear { namespace engine { /** * \brief An item with a visual::bitmap_rendering_attributes. * \author Julien Jorge */ class ENGINE_EXPORT with_rendering_attributes { public: virtual ~with_rendering_attributes(); visual::bitmap_rendering_attributes& get_rendering_attributes(); const visual::bitmap_rendering_attributes& get_rendering_attributes() const; void set_rendering_attributes ( const visual::bitmap_rendering_attributes& attr ); private: /** \brief Global rendering attributes of the item. */ visual::bitmap_rendering_attributes m_rendering_attributes; }; // class with_rendering_attributes } // namespace engine } // namespace bear #endif // __ENGINE_WITH_RENDERING_ATTRIBUTES_HPP__ plee-the-bear-20251226/bear-engine/core/src/engine/item_brick/with_text.hpp000066400000000000000000000036561512343254000264020ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Inherit from this class to add some text in your item. * \author Julien Jorge */ #ifndef __ENGINE_WITH_TEXT_HPP__ #define __ENGINE_WITH_TEXT_HPP__ #include "universe/types.hpp" #include "visual/font/font.hpp" #include "visual/writing.hpp" #include "engine/class_export.hpp" namespace bear { namespace engine { /** * \brief Inherit from this class to add some text in your item. * \author Julien Jorge */ class ENGINE_EXPORT with_text { public: with_text(); void set_text( const std::string& text ); const std::string& get_text() const; void set_font( const visual::font& spr ); const visual::font& get_font() const; void set_horizontal_align( visual::text_align::horizontal_align a ); visual::text_align::horizontal_align get_horizontal_align() const; void set_vertical_align( visual::text_align::vertical_align a ); visual::text_align::vertical_align get_vertical_align() const; const visual::writing& get_writing() const; void fit_in_box( const universe::size_box_type& s ); void refresh_writing(); private: /** \brief The text. */ std::string m_text; /** \brief The font used to display the text. */ visual::font m_font; /** \brief How the text is aligned horizontally in the writing. */ visual::text_align::horizontal_align m_horizontal_align; /** \brief How the text is aligned vertically in the writing. */ visual::text_align::vertical_align m_vertical_align; /** \brief The writing displayed on the screen. */ visual::writing m_writing; }; // class with_text } // namespace engine } // namespace bear #endif // __ENGINE_WITH_TEXT_HPP__ plee-the-bear-20251226/bear-engine/core/src/engine/item_brick/with_toggle.hpp000066400000000000000000000020741512343254000266700ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief This class describes the interface of a two states item. * \author Julien Jorge */ #ifndef __ENGINE_WITH_TOGGLE_HPP__ #define __ENGINE_WITH_TOGGLE_HPP__ #include "universe/types.hpp" #include "engine/class_export.hpp" namespace bear { namespace engine { class base_item; /** * \brief This class describes the interface of a two states item. * \author Julien Jorge */ class ENGINE_EXPORT with_toggle { public: void toggle( base_item* activator ); void toggle( bool b, base_item* activator ); virtual universe::time_type get_delay() const; virtual void toggle_on( base_item* activator ); virtual void toggle_off( base_item* activator ); virtual bool is_on() const; }; // class with_toggle } // namespace engine } // namespace bear #endif // __ENGINE_WITH_TOGGLE_HPP__ plee-the-bear-20251226/bear-engine/core/src/engine/item_brick/with_trigger.hpp000066400000000000000000000042601512343254000270510ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief This class describes a trigger that can activate a toggle when a given * condition is verified. * \author Julien Jorge */ #ifndef __ENGINE_WITH_TRIGGER_HPP__ #define __ENGINE_WITH_TRIGGER_HPP__ #include "engine/expr/collision_in_expression.hpp" #include "engine/item_brick/with_boolean_expression_assignment.hpp" #include "expr/boolean_expression.hpp" #include "universe/derived_item_handle.hpp" #include "engine/class_export.hpp" namespace bear { namespace engine { class base_item; /** * \brief This class describes a trigger that can activate a toggle when a * given condition is verified. * \author Julien Jorge */ class ENGINE_EXPORT with_trigger: public with_boolean_expression_assignment { public: with_trigger(); with_trigger( const with_trigger& that ); with_trigger operator=( const with_trigger& that ); void set_condition( const expr::boolean_expression& e ); const expr::boolean_expression& get_condition() const; collision_in_expression get_collision_in_expression() const; protected: void set_collision_data ( base_item& that, universe::collision_info& info ); void clear_collision_data(); void check_condition( base_item* activator ); private: virtual void on_trigger_on( base_item* activator ); virtual void on_trigger_off( base_item* activator ); void do_set_expression( const expr::boolean_expression& e ); private: /** \brief The condition to verify to turn on the toggles. */ expr::boolean_expression m_condition; /** \brief The item in collision, when checking in collisions. */ const base_item* m_colliding_item; /** \brief The informations about the collision, when checking in collisions. */ const universe::collision_info* m_collision_info; }; // class with_trigger } // namespace engine } // namespace bear #endif // __ENGINE_WITH_TRIGGER_HPP__ plee-the-bear-20251226/bear-engine/core/src/engine/item_brick/z_shift.hpp000066400000000000000000000027221512343254000260220ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief An item that shift other items on the z axis. * \author Julien Jorge */ #ifndef __ENGINE_Z_SHIFT_HPP__ #define __ENGINE_Z_SHIFT_HPP__ #include "engine/class_export.hpp" namespace bear { namespace engine { class base_item; /** * \brief An item that shifts other items on the z axis. * * \b template \b parameters : * - \a Base: the base class for this item. Must inherit from * engine::base_item, * * The custom fields of this class are: * - z_shift: int, Relative z position to put the other item at * (default = 0). * - force_z_position : bool, Indicates if the item force the z_position. * * \author Julien Jorge */ class ENGINE_EXPORT z_shift { public: z_shift(); void set_z_shift( int s ); void set_force_z_position( bool b ); void do_z_shift( base_item& that, const base_item& ref ) const; int get_z_shift() const; private: /** \brief Relative z position to put the other item at. */ int m_z_shift; /** \brief Indicates if the item force the z_position. */ bool m_force_z_position; }; // class z_shift } // namespace engine } // namespace bear #endif // __ENGINE_Z_SHIFT_HPP__ plee-the-bear-20251226/bear-engine/core/src/engine/item_factory.hpp000066400000000000000000000021231512343254000247240ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A factory to instanciate classes inheriting from base_item. * \author Julien Jorge */ #ifndef __ENGINE_ITEM_FACTORY_HPP__ #define __ENGINE_ITEM_FACTORY_HPP__ #include "engine/class_export.hpp" #include #include namespace bear { namespace engine { class base_item; /** * \brief A factory to instanciate classes inheriting from base_item. * \author Julien Jorge */ class ENGINE_EXPORT item_factory { public: /** \brief The type of the factory. */ typedef claw::pattern::factory factory_type; public: static factory_type& get_instance(); private: /** \brief A factory that creates items. */ static factory_type* s_factory_instance; }; // class item_factory } // namespace engine } // namespace bear #endif // __ENGINE_ITEM_FACTORY_HPP__ plee-the-bear-20251226/bear-engine/core/src/engine/item_flag_type.hpp000066400000000000000000000027121512343254000252330ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief The type of the flags passed to a layer when inserting a new item. * \author Julien Jorge */ #ifndef __ENGINE_ITEM_FLAG_TYPE_HPP__ #define __ENGINE_ITEM_FLAG_TYPE_HPP__ namespace bear { namespace engine { /** \brief Flags that can be passed to the item method. */ enum item_flag_type { /** \brief No flag specified. */ item_flag_none = 0, /** \brief Insert the item with a definitive size and position. */ item_flag_insert_as_static = 1L << 0, /** \brief The z position of the item can't change. */ item_flag_z_fixed = 1L << 1, /** \brief The item has been built. */ item_flag_built = 1L << 2 }; // enum item_flag_type item_flag_type operator&(item_flag_type a, item_flag_type b); item_flag_type operator|(item_flag_type a, item_flag_type b); item_flag_type operator^(item_flag_type a, item_flag_type b); item_flag_type operator~(item_flag_type a); item_flag_type& operator&=(item_flag_type& a, item_flag_type b); item_flag_type& operator|=(item_flag_type& a, item_flag_type b); item_flag_type& operator^=(item_flag_type& a, item_flag_type b); } // namespace engine } // namespace bear #endif // __ENGINE_ITEM_FLAG_TYPE_HPP__ plee-the-bear-20251226/bear-engine/core/src/engine/layer/000077500000000000000000000000001512343254000226445ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/core/src/engine/layer/base_debugging_layer.hpp000066400000000000000000000040161512343254000274770ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Base layer for the ones that give debugging information about the * visible items. * \author Julien Jorge */ #ifndef __ENGINE_BASE_DEBUGGING_LAYER_HPP__ #define __ENGINE_BASE_DEBUGGING_LAYER_HPP__ #include "engine/class_export.hpp" #include "engine/layer/gui_layer.hpp" #include "engine/base_item.hpp" #include "input/key_info.hpp" namespace bear { namespace engine { /** * \brief Base layer for the ones that give debugging information about the * visible items. * \author Julien Jorge */ class ENGINE_EXPORT base_debugging_layer: public gui_layer { public: /** \brief The type of a list of scene elements retrieved from the layer. */ typedef gui_layer::scene_element_list scene_element_list; protected: /** \brief The type of a list of items. */ typedef std::vector item_list; public: base_debugging_layer( input::key_code toggle_key ); void progress( universe::time_type elapsed_time ); void render( scene_element_list& e ) const; bool key_pressed( const input::key_info& key ); protected: virtual void render( scene_element_list& e, const visual::position_type& delta ) const = 0; virtual void progress ( const item_list& items, universe::time_type elapsed_time ) = 0; private: void find_items( item_list& items ) const; virtual void on_show(); private: /** \brief Tell if the bow must be drawn. */ bool m_visible; /** \brief The value of the key that changes the visibility of the layer. */ const input::key_code m_toggle_key; }; // class base_debugging_layer } // namespace engine } // namespace bear #endif // __ENGINE_BASE_DEBUGGING_LAYER_HPP__ plee-the-bear-20251226/bear-engine/core/src/engine/layer/code/000077500000000000000000000000001512343254000235565ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/core/src/engine/layer/code/base_debugging_layer.cpp000066400000000000000000000056741512343254000304170ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::engine::base_debugging_layer class. * \author Julien Jorge */ #include "engine/layer/base_debugging_layer.hpp" #include "engine/layer/layer.hpp" #include "engine/level.hpp" #include "engine/level_globals.hpp" #include "engine/world.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param toggle_key The value of the key that changes the visibility of the * layer. */ bear::engine::base_debugging_layer::base_debugging_layer ( bear::input::key_code toggle_key ) : m_visible(false), m_toggle_key(toggle_key) { } // base_debugging_layer::base_debugging_layer() /*----------------------------------------------------------------------------*/ /** * \brief Do one step in the progression of the layer. * \param elapsed_time Elapsed time since the last call. */ void bear::engine::base_debugging_layer::progress ( bear::universe::time_type elapsed_time ) { item_list items; find_items(items); if ( !items.empty() ) progress(items, elapsed_time); } // base_debugging_layer::progress() /*----------------------------------------------------------------------------*/ /** * \brief Render the layer on a screen. * \param e (out) The scene elements. */ void bear::engine::base_debugging_layer::render( scene_element_list& e ) const { if (m_visible) render(e, get_level().get_camera_focus().bottom_left()); } // base_debugging_layer::render() /*----------------------------------------------------------------------------*/ /** * \brief Inform the layer that a keyboard key has been pressed. * \param key The value of the pressed key. */ bool bear::engine::base_debugging_layer::key_pressed ( const bear::input::key_info& key ) { bool result = true; if ( key.get_code() == m_toggle_key ) { m_visible = !m_visible; if ( m_visible ) on_show(); } else result = false; return result; } // base_debugging_layer::key_pressed() /*----------------------------------------------------------------------------*/ /** * \brief Get the visible items. * \param items (out) The items found. */ void bear::engine::base_debugging_layer::find_items( item_list& items ) const { for ( engine::level::const_layer_iterator it=get_level().layer_begin(); it!=get_level().layer_end(); ++it ) if ( it->has_world() ) it->get_world().pick_items_in_rectangle ( items, get_level().get_camera_focus() ); } // base_debugging_layer::find_items() /*----------------------------------------------------------------------------*/ /** * \brief Inform the subclasses that the layer is displayed. */ void bear::engine::base_debugging_layer::on_show() { // nothing to do } // base_debugging_layer::on_show() plee-the-bear-20251226/bear-engine/core/src/engine/layer/code/gui_layer.cpp000066400000000000000000000153431512343254000262500ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::engine::gui_layer class. * \author Julien Jorge */ #include "engine/layer/gui_layer.hpp" #include "engine/game.hpp" #include "input/finger_event.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ bear::engine::gui_layer::gui_layer() : m_size( game::get_instance().get_screen_size() ), m_root(NULL) { } // gui_layer::gui_layer() /*----------------------------------------------------------------------------*/ /** * \brief Load the media required by this class. */ void bear::engine::gui_layer::pre_cache() { // nothing to do } // gui_layer::pre_cache() /*----------------------------------------------------------------------------*/ /** * \brief Initialise the layer. */ void bear::engine::gui_layer::build() { // nothing to do } // gui_layer::build() /*----------------------------------------------------------------------------*/ /** * \brief Do one step in the progression of the layer. * \param elapsed_time Elapsed time since the last call. */ void bear::engine::gui_layer::progress( universe::time_type elapsed_time ) { // nothing to do } // gui_layer::progress() /*----------------------------------------------------------------------------*/ /** * \brief Get the scene elements of the layer. * \param e (out) The scene elements. */ void bear::engine::gui_layer::render( scene_element_list& e ) const { if ( m_root != NULL ) m_root->render( e ); } // gui_layer::render() /*----------------------------------------------------------------------------*/ /** * \brief Get the size of the layer. */ const claw::math::coordinate_2d& bear::engine::gui_layer::get_size() const { return m_size; } // gui_layer::get_size() /*----------------------------------------------------------------------------*/ /** * \brief Converts screen coordinates to layer coordinates. */ claw::math::coordinate_2d bear::engine::gui_layer::adjust_screen_position ( const claw::math::coordinate_2d& pos ) const { return claw::math::coordinate_2d ( get_size().x * pos.x / game::get_instance().get_window_size().x, get_size().y * pos.y / game::get_instance().get_window_size().y ); } // gui_layer::adjust_screen_position() /*----------------------------------------------------------------------------*/ /** * \brief Sets the component rendered by default and to which the inputs are * sent. */ void bear::engine::gui_layer::set_root_component( gui::visual_component* c ) { m_root = c; } // gui_layer::set_root_component() /*----------------------------------------------------------------------------*/ /** * \brief Inform the layer that a key has been pressed. * \param key The value of the pressed key. */ bool bear::engine::gui_layer::key_pressed( const bear::input::key_info& key ) { if ( m_root != NULL ) return m_root->key_pressed(key); else return false; } // gui_layer::key_pressed() /*----------------------------------------------------------------------------*/ /** * \brief Inform the layer that a character has been entered. * \param key The value of the pressed key. */ bool bear::engine::gui_layer::char_pressed( const bear::input::key_info& key ) { if ( m_root != NULL ) return m_root->char_pressed(key); else return false; } // gui_layer::char_pressed() /*----------------------------------------------------------------------------*/ /** * \brief Inform the layer that a joystick button had been pressed. * \param button The value of the pressed button. * \param joy_index The index of the joystick. */ bool bear::engine::gui_layer::button_pressed ( bear::input::joystick::joy_code button, unsigned int joy_index ) { if ( m_root != NULL ) return m_root->button_pressed(button, joy_index); else return false; } // gui_layer::button_pressed() /*----------------------------------------------------------------------------*/ /** * \brief Inform the layer that a mouse button has been pressed. * \param pos The current position of the cursor. * \param key The value of the pressed button. */ bool bear::engine::gui_layer::mouse_pressed ( bear::input::mouse::mouse_code key, const claw::math::coordinate_2d& pos ) { if ( m_root != NULL ) return m_root->mouse_pressed ( key, adjust_screen_position(pos) - m_root->get_position() ); else return false; } // gui_layer::mouse_pressed() /*----------------------------------------------------------------------------*/ /** * \brief Inform the layer that a mouse button has been released. * \param pos The current position of the cursor. * \param key The value of the pressed button. */ bool bear::engine::gui_layer::mouse_released ( bear::input::mouse::mouse_code key, const claw::math::coordinate_2d& pos ) { if ( m_root != NULL ) return m_root->mouse_released ( key, adjust_screen_position(pos) - m_root->get_position() ); else return false; } // gui_layer::mouse_released() /*----------------------------------------------------------------------------*/ /** * \brief Inform the layer that a mouse button has been maintained. * \param pos The current position of the cursor. * \param key The value of the pressed button. */ bool bear::engine::gui_layer::mouse_maintained ( bear::input::mouse::mouse_code key, const claw::math::coordinate_2d& pos ) { if ( m_root != NULL ) return m_root->mouse_maintained ( key, adjust_screen_position(pos) - m_root->get_position() ); else return false; } // gui_layer::mouse_maintained() /*----------------------------------------------------------------------------*/ /** * \brief Inform the layer that the mouse has been moved. * \param pos The new position of the mouse. */ bool bear::engine::gui_layer::mouse_move ( const claw::math::coordinate_2d& pos ) { if ( m_root != NULL ) return m_root->mouse_move ( adjust_screen_position(pos) - m_root->get_position() ); else return false; } // gui_layer::mouse_move() /*----------------------------------------------------------------------------*/ /** * \brief Process an event triggered by a finger. * \param event The event to process. */ bool bear::engine::gui_layer::finger_action ( const bear::input::finger_event& event ) { if ( m_root != NULL ) return m_root->finger_action ( event.at_position ( adjust_screen_position(event.get_position()) - m_root->get_position() ) ); else return false; } // gui_layer::finger_action() plee-the-bear-20251226/bear-engine/core/src/engine/layer/code/gui_layer_stack.cpp000066400000000000000000000232571512343254000274400ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::engine::gui_layer_stack class. * \author Julien Jorge */ #include "engine/layer/gui_layer_stack.hpp" #include "engine/layer/gui_layer.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Destructor. */ bear::engine::gui_layer_stack::~gui_layer_stack() { clear(); } // gui_layer_stack::~gui_layer_stack() /*----------------------------------------------------------------------------*/ /** * \brief Add a layer in front of the others. * \param the_layer The layer to add (it will be deleted in the destructor). * \pre the_layer != NULL */ void bear::engine::gui_layer_stack::push_layer( gui_layer* the_layer ) { CLAW_PRECOND( the_layer != NULL ); m_sub_layers.push_back(the_layer); } // gui_layer_stack::push_layer() /*----------------------------------------------------------------------------*/ /** * \brief Do one step in the progression of the sub layers. * \param elapsed_time Elapsed time since the last call. */ void bear::engine::gui_layer_stack::progress( universe::time_type elapsed_time ) { m_input_status.read(); m_input_status.scan_inputs( *this ); for (unsigned int i=0; i!=m_sub_layers.size(); ++i) m_sub_layers[i]->progress(elapsed_time); } // gui_layer_stack::progress() /*----------------------------------------------------------------------------*/ /** * \brief Render the visibles components of the sub layers on a screen. * \param e The container in which we store the visuals. */ void bear::engine::gui_layer_stack::render( scene_element_list& e ) const { for (unsigned int i=0; i!=m_sub_layers.size(); ++i) { scene_element_list new_e; m_sub_layers[i]->render( new_e ); e.insert( e.end(), new_e.begin(), new_e.end() ); } } // gui_layer_stack::render() /*----------------------------------------------------------------------------*/ /** * \brief Delete all layers. */ void bear::engine::gui_layer_stack::clear() { for (unsigned int i=0; i!=m_sub_layers.size(); ++i) delete m_sub_layers[i]; m_sub_layers.clear(); } // gui_layer_stack::clear() /*----------------------------------------------------------------------------*/ /** * \brief Inform the layer that a key has been pressed. * \param key The value of the pressed key. * \remark The message is sent to the sub layers until one processes it. */ bool bear::engine::gui_layer_stack::key_pressed( const input::key_info& key ) { bool result = false; unsigned int i = m_sub_layers.size(); while ( (i != 0) && !result ) { --i; result = m_sub_layers[i]->key_pressed(key); } return result; } // gui_layer_stack::key_pressed() /*----------------------------------------------------------------------------*/ /** * \brief Inform the layer that a key is maintained * \param key The value of the pressed key. * \remark The message is sent to the sub layers until one processes it. */ bool bear::engine::gui_layer_stack::key_maintained( const input::key_info& key ) { bool result = false; unsigned int i = m_sub_layers.size(); while ( (i != 0) && !result ) { --i; result = m_sub_layers[i]->key_maintained(key); } return result; } // gui_layer_stack::key_maintained() /*----------------------------------------------------------------------------*/ /** * \brief Inform the layer that a key has been released. * \param key The value of the pressed key. * \remark The message is sent to the sub layers until one processes it. */ bool bear::engine::gui_layer_stack::key_released( const input::key_info& key ) { bool result = false; unsigned int i = m_sub_layers.size(); while ( (i != 0) && !result ) { --i; result = m_sub_layers[i]->key_released(key); } return result; } // gui_layer_stack::key_released() /*----------------------------------------------------------------------------*/ /** * \brief Inform the layer that a character has been entered. * \param key The value of the pressed key. * \remark The message is sent to the sub layers until one processes it. */ bool bear::engine::gui_layer_stack::char_pressed( const input::key_info& key ) { bool result = false; unsigned int i = m_sub_layers.size(); while ( (i != 0) && !result ) { --i; result = m_sub_layers[i]->char_pressed(key); } return result; } // gui_layer_stack::char_pressed() /*----------------------------------------------------------------------------*/ /** * \brief Inform the layer that a joystick button had been pressed. * \param button The value of the pressed button. * \param joy_index The index of the joystick. * \remark The message is sent to the sub layers until one processes it. */ bool bear::engine::gui_layer_stack::button_pressed ( input::joystick::joy_code button, unsigned int joy_index ) { bool result = false; unsigned int i = m_sub_layers.size(); while ( (i != 0) && !result ) { --i; result = m_sub_layers[i]->button_pressed(button, joy_index); } return result; } // gui_layer_stack::button_pressed() /*----------------------------------------------------------------------------*/ /** * \brief Inform the layer that a joystick button is maintained. * \param button The value of the pressed button. * \param joy_index The index of the joystick. * \remark The message is sent to the sub layers until one processes it. */ bool bear::engine::gui_layer_stack::button_maintained ( input::joystick::joy_code button, unsigned int joy_index ) { bool result = false; unsigned int i = m_sub_layers.size(); while ( (i != 0) && !result ) { --i; result = m_sub_layers[i]->button_maintained(button, joy_index); } return result; } // gui_layer_stack::button_maintained() /*----------------------------------------------------------------------------*/ /** * \brief Inform the layer that a joystick button has been released. * \param button The value of the pressed button. * \param joy_index The index of the joystick. * \remark The message is sent to the sub layers until one processes it. */ bool bear::engine::gui_layer_stack::button_released ( input::joystick::joy_code button, unsigned int joy_index ) { bool result = false; unsigned int i = m_sub_layers.size(); while ( (i != 0) && !result ) { --i; result = m_sub_layers[i]->button_released(button, joy_index); } return result; } // gui_layer_stack::button_released() /*----------------------------------------------------------------------------*/ /** * \brief Inform the layer that a mouse button has been pressed. * \param pos The current position of the cursor. * \param key The value of the pressed button. * \remark The message is sent to the sub layers until one processes it. */ bool bear::engine::gui_layer_stack::mouse_pressed ( input::mouse::mouse_code key, const claw::math::coordinate_2d& pos ) { bool result = false; unsigned int i = m_sub_layers.size(); while ( (i != 0) && !result ) { --i; result = m_sub_layers[i]->mouse_pressed(key, pos); } return result; } // gui_layer_stack::mouse_pressed() /*----------------------------------------------------------------------------*/ /** * \brief Inform the layer that a mouse button is maintained. * \param pos The current position of the cursor. * \param key The value of the maintained button. * \remark The message is sent to the sub layers until one processes it. */ bool bear::engine::gui_layer_stack::mouse_maintained ( input::mouse::mouse_code key, const claw::math::coordinate_2d& pos ) { bool result = false; unsigned int i = m_sub_layers.size(); while ( (i != 0) && !result ) { --i; result = m_sub_layers[i]->mouse_maintained(key, pos); } return result; } // gui_layer_stack::mouse_maintained() /*----------------------------------------------------------------------------*/ /** * \brief Inform the layer that a mouse button has been released. * \param pos The current position of the cursor. * \param key The value of the released button. * \remark The message is sent to the sub layers until one processes it. */ bool bear::engine::gui_layer_stack::mouse_released ( input::mouse::mouse_code key, const claw::math::coordinate_2d& pos ) { bool result = false; unsigned int i = m_sub_layers.size(); while ( (i != 0) && !result ) { --i; result = m_sub_layers[i]->mouse_released(key, pos); } return result; } // gui_layer_stack::mouse_released() /*----------------------------------------------------------------------------*/ /** * \brief Inform the layer that the mouse has been moved. * \param pos The new position of the mouse. * \remark The message is sent to the sub layers until one processes it. */ bool bear::engine::gui_layer_stack::mouse_move ( const claw::math::coordinate_2d& pos ) { bool result = false; unsigned int i = m_sub_layers.size(); while ( (i != 0) && !result ) { --i; result = m_sub_layers[i]->mouse_move(pos); } return result; } // gui_layer_stack::mouse_move() /*----------------------------------------------------------------------------*/ /** * \brief Inform the layer that the finger has been used. * \param event The event dispatched by the finger. */ bool bear::engine::gui_layer_stack::finger_action ( const input::finger_event& event ) { bool result = false; unsigned int i = m_sub_layers.size(); while ( (i != 0) && !result ) { --i; result = m_sub_layers[i]->finger_action( event ); } return result; } // gui_layer_stack::finger_action() plee-the-bear-20251226/bear-engine/core/src/engine/layer/code/layer.cpp000066400000000000000000000260531512343254000254040ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::engine::layer class. * \author Julien Jorge */ #include "engine/layer/layer.hpp" #include #include #include "visual/scene_shader_pop.hpp" #include "visual/scene_shader_push.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param size The size of the layer. */ bear::engine::layer::layer( const universe::size_box_type& size ) : m_size( size ), m_visible( true ), m_active( true ), m_currently_updating( false ) { CLAW_PRECOND( size.x != 0 ); CLAW_PRECOND( size.y != 0 ); } // engine::layer::layer() /*----------------------------------------------------------------------------*/ /** * \brief Destructor. */ bear::engine::layer::~layer() { // nothing to do } // layer::~layer() /*----------------------------------------------------------------------------*/ /** * \brief Initialize the content of the layer. */ void bear::engine::layer::start() { // nothing to do } // layer::start() /*----------------------------------------------------------------------------*/ /** * \brief Get the size of the layer. */ const bear::universe::size_box_type& bear::engine::layer::get_size() const { return m_size; } // layer::get_size() /*----------------------------------------------------------------------------*/ /** * \brief Set the tag of the layer. * \param tag The new tag of the layer. */ void bear::engine::layer::set_tag(const std::string& tag) { m_tag = tag; } // layer::set_tag() /*----------------------------------------------------------------------------*/ /** * \brief Return the tag of the layer. */ std::string bear::engine::layer::get_tag() const { return m_tag; } // layer::get_tag() /*----------------------------------------------------------------------------*/ /** * \brief Updates a region in the layer. * \param active_area The region to update. * \param elapsed_time The elapsed time since the last call. */ void bear::engine::layer::update ( const region_type& active_area, universe::time_type elapsed_time ) { if ( !is_active() ) return; m_currently_updating = true; progress( active_area, elapsed_time ); m_currently_updating = false; apply_post_update_changes(); } // layer::update() /*----------------------------------------------------------------------------*/ /** * \brief Get the sprites of the items in the visible area. * \param visuals (out) The sprites in the visible area, and their positions. * \param visible_area The visible part of the layer. */ void bear::engine::layer::get_visual ( std::list& visuals, const universe::rectangle_type& visible_area ) const { if ( !is_visible() ) return; std::set::const_iterator it; for ( it=m_always_displayed.begin(); it!=m_always_displayed.end(); ++it ) if ( !visible_area.intersects( (*it)->get_bounding_box() ) ) visuals.push_back( (*it)->get_visual() ); do_get_visual(visuals, visible_area); visuals.sort( scene_visual::z_position_compare() ); if ( m_shader.is_valid() ) { visuals.push_front( visual::scene_shader_push( m_shader ) ); visuals.push_back( visual::scene_shader_pop() ); } } // layer::get_visual() /*----------------------------------------------------------------------------*/ /** * \brief Add an item in the layer and call item.build_item(). * \param item The item to add. * \pre item.is_valid() && !item.is_fixed() */ void bear::engine::layer::add_item( base_item& item ) { CLAW_PRECOND( item.is_valid() ); CLAW_PRECOND( !item.is_fixed() ); CLAW_PRECOND( !item.is_in_layer() ); claw::logger << claw::log_verbose << "Adding item #" << item.get_id() << " '" << item.get_class_name() << "' in layer." << std::endl; m_post_creation_action[ &item ] = add; item.set_environment(*this); if ( !item.is_built() ) { item.pre_cache(); item.build_item(); } item.enters_layer(); if ( item.get_insert_as_static() ) { item.fix(); item.set_phantom(true); } switch ( mark_as_built( item ) ) { case add: do_add_item( item ); break; case remove: remove_item( item ); break; case drop: drop_item( item ); break; } } // layer::add_item() /*----------------------------------------------------------------------------*/ /** * \brief Remove an item from the layer and delete it. * \param item The item to remove. */ void bear::engine::layer::remove_item( base_item& item ) { if ( m_currently_updating ) m_post_update_removal.push_back( &item ); else if ( is_currently_building( item ) ) m_post_creation_action[ &item ] = remove; else { m_always_displayed.erase(&item); do_remove_item(item); item.clear_environment(); item.leaves_layer(); } } // layer::remove_item() /*----------------------------------------------------------------------------*/ /** * \brief Remove an item from the layer without deleting it. * \param item The item to remove. */ void bear::engine::layer::drop_item( base_item& item ) { CLAW_PRECOND( item.is_in_layer( *this ) ); CLAW_PRECOND( std::find ( m_post_update_removal.begin(), m_post_update_removal.end(), &item ) == m_post_update_removal.end() ); if ( is_currently_building( item ) ) m_post_creation_action[ &item ] = remove; else { m_always_displayed.erase(&item); do_drop_item(item); item.clear_environment(); item.leaves_layer(); } } // layer::drop_item() /*----------------------------------------------------------------------------*/ /** * \brief Tell that an item is always displayed. * \param item The item to display. */ void bear::engine::layer::set_always_displayed( base_item& item ) { m_always_displayed.insert(&item); } // layer::set_always_displayed() /*----------------------------------------------------------------------------*/ /** * \brief Tell that an item is not always displayed. * \param item The item not to display. */ void bear::engine::layer::unset_always_displayed( base_item& item ) { m_always_displayed.erase(&item); } // layer::unset_always_displayed() /*----------------------------------------------------------------------------*/ /** * \brief Tell if the layer has a world. */ bool bear::engine::layer::has_world() const { return do_get_world() != NULL; } // layer::has_world() /*----------------------------------------------------------------------------*/ /** * \brief Get the world. */ bear::engine::world& bear::engine::layer::get_world() { CLAW_PRECOND( has_world() ); return *do_get_world(); } // layer::get_world() /*----------------------------------------------------------------------------*/ /** * \brief Get the world. */ const bear::engine::world& bear::engine::layer::get_world() const { CLAW_PRECOND( has_world() ); return *do_get_world(); } // layer::get_world() /*----------------------------------------------------------------------------*/ /** * \brief Changes the visibility of the layer. * \param v The new visibility. */ void bear::engine::layer::set_visible( bool v ) { m_visible = v; } // layer::set_visible() /*----------------------------------------------------------------------------*/ /** * \brief Tells if the layer is visible. */ bool bear::engine::layer::is_visible() const { return m_visible; } // layer::is_visible() /*----------------------------------------------------------------------------*/ /** * \brief Sets if the layer is active, i.e. the update function has an effect. * \param v The new value of the active flag. */ void bear::engine::layer::set_active( bool v ) { m_active = v; } // layer::set_active() /*----------------------------------------------------------------------------*/ /** * \brief Tells if the layer is active, i.e. the update function has an effect. */ bool bear::engine::layer::is_active() const { return m_active; } // layer::is_active() /*----------------------------------------------------------------------------*/ /** * \brief Sets the shader to apply to the items in this layer. * \param s The shader. */ void bear::engine::layer::set_shader( visual::shader_program s ) { m_shader = s; } // layer::set_shader() /*----------------------------------------------------------------------------*/ /** * \brief Effectively add an item in the layer. * \param item The item to add. */ void bear::engine::layer::do_add_item( base_item& item ) { // nothing to do } // layer::do_add_item() /*----------------------------------------------------------------------------*/ /** * \brief Effectively remove an item from the layer. * \param item The item to remove. */ void bear::engine::layer::do_remove_item( base_item& item ) { // nothing to do } // layer::do_remove_item() /*----------------------------------------------------------------------------*/ /** * \brief Effectively drop an item from the layer. * \param item The item to remove. */ void bear::engine::layer::do_drop_item( base_item& item ) { // nothing to do } // layer::do_drop_item() /*----------------------------------------------------------------------------*/ /** * \brief Get the world. */ bear::engine::world* bear::engine::layer::do_get_world() { return NULL; } // layer::do_get_world() /*----------------------------------------------------------------------------*/ /** * \brief Get the world. */ const bear::engine::world* bear::engine::layer::do_get_world() const { return NULL; } // layer::do_get_world() /*----------------------------------------------------------------------------*/ /** * \brief Marks an item as built and returns the action that must be done after * the creation. * \param item The item. */ bear::engine::layer::post_create_action bear::engine::layer::mark_as_built( base_item& item ) { std::map::iterator it ( m_post_creation_action.find( &item ) ); const post_create_action result( it->second ); m_post_creation_action.erase( it ); return result; } // layer::mark_as_built() /*----------------------------------------------------------------------------*/ /** * \brief Tell if an item is currently being inserted in the layer. * \param item The item. */ bool bear::engine::layer::is_currently_building( base_item& item ) const { return m_post_creation_action.find( &item ) != m_post_creation_action.end(); } // layer::is_currently_building() /*----------------------------------------------------------------------------*/ /** * \brief Applies the changes that have been postponed until the end of the * update. */ void bear::engine::layer::apply_post_update_changes() { CLAW_PRECOND( !m_currently_updating ); for ( std::list::const_iterator it=m_post_update_removal.begin(); it != m_post_update_removal.end(); ++it ) remove_item( **it ); m_post_update_removal.clear(); } // layer::apply_post_update_changes() plee-the-bear-20251226/bear-engine/core/src/engine/layer/code/layer_factory.cpp000066400000000000000000000016141512343254000271270ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::engine::layer_factory class. * \author Julien Jorge */ #include "engine/layer/layer_factory.hpp" /*----------------------------------------------------------------------------*/ bear::engine::layer_factory::factory_type* bear::engine::layer_factory::s_factory_instance(NULL); /*----------------------------------------------------------------------------*/ /** * \brief Get the single instance of the factory. */ bear::engine::layer_factory::factory_type& bear::engine::layer_factory::get_instance() { if ( s_factory_instance == NULL ) s_factory_instance = new factory_type; return *s_factory_instance; } // layer_factory::get_instance() plee-the-bear-20251226/bear-engine/core/src/engine/layer/code/transition_layer.cpp000066400000000000000000000253771512343254000276660ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::engine::transition_layer class. * \author Julien Jorge */ #include "engine/layer/transition_layer.hpp" #include "engine/level.hpp" #include "engine/level_globals.hpp" #include "engine/transition_effect/transition_effect.hpp" #include /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param e The effect. * \param i The identifier given to the effect. */ bear::engine::transition_layer::effect_entry::effect_entry ( transition_effect* e, std::size_t i ) : effect(e), id(i) { } // transition_effect::effect_entry::effect_entry() /*----------------------------------------------------------------------------*/ const std::size_t bear::engine::transition_layer::not_an_id(0); std::size_t bear::engine::transition_layer::s_next_id(1); /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param name The name of the of the layer in the post office. */ bear::engine::transition_layer::transition_layer( const std::string& name ) : communication::messageable(name) { } // transition_layer::transition_layer() /*----------------------------------------------------------------------------*/ /** * \brief Destructor. */ bear::engine::transition_layer::~transition_layer() { clear(); } // transition_layer::~transition_layer() /*----------------------------------------------------------------------------*/ /** * \brief Initialise the layer. */ void bear::engine::transition_layer::build() { get_level_globals().register_item(*this); } // transition_layer::build() /*----------------------------------------------------------------------------*/ /** * \brief Adjust the components of the layer. * \param elapsed_time Elapsed time since the last call. */ void bear::engine::transition_layer::progress ( universe::time_type elapsed_time ) { effect_map_type::iterator it; for ( it=m_effect.begin(); it!=m_effect.end(); ) if ( (it->second.effect == NULL) || it->second.effect->is_finished() ) { effect_map_type::iterator tmp = it; ++it; m_effect.erase(tmp); } else { it->second.effect->progress( elapsed_time ); ++it; } } // transition_layer::progress() /*----------------------------------------------------------------------------*/ /** * \brief Render the components of the layer. * \param e (out) The scene elements. */ void bear::engine::transition_layer::render( scene_element_list& e ) const { effect_map_type::const_iterator it; for ( it=m_effect.begin(); it!=m_effect.end(); ++it ) it->second.effect->render( e ); } // transition_layer::render() /*----------------------------------------------------------------------------*/ /** * \brief Inform the layer that a key had been pressed. * \param key The value of the pressed key. */ bool bear::engine::transition_layer::key_pressed( const input::key_info& key ) { return diffuse_call ( boost::bind( &transition_effect::key_pressed, _1, key) ); } // transition_layer::key_pressed() /*----------------------------------------------------------------------------*/ /** * \brief Inform the layer that a key is maintained. * \param key The value of the pressed key. */ bool bear::engine::transition_layer::key_maintained ( const input::key_info& key ) { return diffuse_call ( boost::bind( &transition_effect::key_maintained, _1, key) ); } // transition_layer::key_maintained() /*----------------------------------------------------------------------------*/ /** * \brief Inform the layer that a key had been released. * \param key The value of the pressed key. */ bool bear::engine::transition_layer::key_released( const input::key_info& key ) { return diffuse_call ( boost::bind( &transition_effect::key_released, _1, key) ); } // transition_layer::key_released() /*----------------------------------------------------------------------------*/ /** * \brief Inform the layer that a character has been entered. * \param key The value of the pressed key. */ bool bear::engine::transition_layer::char_pressed( const input::key_info& key ) { return diffuse_call ( boost::bind( &transition_effect::char_pressed, _1, key) ); } // transition_layer::char_pressed() /*----------------------------------------------------------------------------*/ /** * \brief Inform the layer that a joystick button had been pressed. * \param button The value of the pressed button. * \param joy_index The index of the joystick. */ bool bear::engine::transition_layer::button_pressed ( input::joystick::joy_code button, unsigned int joy_index ) { return diffuse_call ( boost::bind( &transition_effect::button_pressed, _1, button, joy_index) ); } // transition_layer::button_pressed() /*----------------------------------------------------------------------------*/ /** * \brief Inform the layer that a joystick button is maintained. * \param button The value of the pressed button. * \param joy_index The index of the joystick. */ bool bear::engine::transition_layer::button_maintained ( input::joystick::joy_code button, unsigned int joy_index ) { return diffuse_call ( boost::bind ( &transition_effect::button_maintained, _1, button, joy_index) ); } // transition_layer::button_maintained() /*----------------------------------------------------------------------------*/ /** * \brief Inform the layer that a joystick button had been released. * \param button The value of the pressed button. * \param joy_index The index of the joystick. */ bool bear::engine::transition_layer::button_released ( input::joystick::joy_code button, unsigned int joy_index ) { return diffuse_call ( boost::bind ( &transition_effect::button_released, _1, button, joy_index) ); } // transition_layer::button_released() /*----------------------------------------------------------------------------*/ /** * \brief Inform the layer that a mouse button has been pressed. * \param pos The current position of the cursor. * \param key The value of the pressed button. */ bool bear::engine::transition_layer::mouse_pressed ( input::mouse::mouse_code key, const claw::math::coordinate_2d& pos ) { return diffuse_call ( boost::bind( &transition_effect::mouse_pressed, _1, key, pos) ); } // transition_layer::mouse_pressed() /*----------------------------------------------------------------------------*/ /** * \brief Inform the layer that a mouse button is maintained. * \param pos The current position of the cursor. * \param key The value of the maintained button. */ bool bear::engine::transition_layer::mouse_maintained ( input::mouse::mouse_code key, const claw::math::coordinate_2d& pos ) { return diffuse_call ( boost::bind( &transition_effect::mouse_maintained, _1, key, pos) ); } // transition_layer::mouse_maintained() /*----------------------------------------------------------------------------*/ /** * \brief Inform the layer that a mouse button has been released. * \param pos The current position of the cursor. * \param key The value of the released button. */ bool bear::engine::transition_layer::mouse_released ( input::mouse::mouse_code key, const claw::math::coordinate_2d& pos ) { return diffuse_call ( boost::bind( &transition_effect::mouse_released, _1, key, pos) ); } // transition_layer::mouse_released() /*----------------------------------------------------------------------------*/ /** * \brief Inform the layer that the mouse has been moved. * \param pos The new position of the mouse. */ bool bear::engine::transition_layer::mouse_move ( const claw::math::coordinate_2d& pos ) { return diffuse_call( boost::bind( &transition_effect::mouse_move, _1, pos) ); } // transition_layer::mouse_move() /*----------------------------------------------------------------------------*/ /** * \brief Process an event triggered by a finger. * \param event The event to process. */ bool bear::engine::transition_layer::finger_action ( const bear::input::finger_event& event ) { return diffuse_call ( boost::bind( &transition_effect::finger_action, _1, event) ); } // transition_layer::finger_action() /*----------------------------------------------------------------------------*/ /** * \brief Erase an effect. * \param id The identifier of the effect to erase. */ void bear::engine::transition_layer::erase_effect( std::size_t id ) { effect_map_type::iterator it; for ( it=m_effect.begin(); it!=m_effect.end(); ++it ) if ( id == it->second.id ) { delete it->second.effect; it->second.effect = NULL; it->second.id = not_an_id; } } // transition_layer::erase_effect() /*----------------------------------------------------------------------------*/ /** * \brief Push an effect in the layer. * \param e The effect. It will be deleted by the layer. * \param p The prefered depth position of the effect if several effects are * displayed simultaneously. * \remark This method call transition_layer::build(). */ std::size_t bear::engine::transition_layer::push_effect( transition_effect* e, int p ) { const std::size_t id(s_next_id); ++s_next_id; m_effect.insert( effect_map_type::value_type( p, effect_entry(e, id) ) ); e->set_layer(*this); e->build(); return id; } // transition_layer::push_effect() /*----------------------------------------------------------------------------*/ /** * \brief Replace all effects with a new effect. * \param e The effect. It will be deleted by the layer. * \param p The prefered depth position of the effect if several effects are * displayed simultaneously. * \remark This method call transition_layer::build(). */ std::size_t bear::engine::transition_layer::set_effect( transition_effect* e, int p ) { clear(); return push_effect(e, p); } // transition_layer::set_effect() /*----------------------------------------------------------------------------*/ /** * \brief Remove all effects. */ void bear::engine::transition_layer::clear() { for ( ; !m_effect.empty(); m_effect.erase(m_effect.begin()) ) delete m_effect.begin()->second.effect; } // transition_layer::clear() /*----------------------------------------------------------------------------*/ /** * \brief Diffuse a call to the effects. */ template bool bear::engine::transition_layer::diffuse_call( F f ) const { bool result(false); effect_map_type::const_iterator it; for ( it=m_effect.begin(); !result && (it!=m_effect.end()); ++it ) if ( it->second.effect != NULL ) result = f(*it->second.effect); return result; } // transition_layer::diffuse_call() plee-the-bear-20251226/bear-engine/core/src/engine/layer/export.hpp000066400000000000000000000023251512343254000247000ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Macros and function useful for layer exportat. * \author Julien Jorge */ #ifndef __ENGINE_LAYER_EXPORT_HPP__ #define __ENGINE_LAYER_EXPORT_HPP__ #include "engine/layer/layer_factory.hpp" #include "engine/layer/typed_layer_creator.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Export a function instanciating a class inheriting from * engine::layer_creator. * * \param class_name The name of the layer class to instanciate. * \param env The full namespace of this class. * * The env::class_name class must have a constructor taking a const * universe::size_box_type& as parameter. */ #define LAYER_EXPORT( class_name, env ) \ static bool class_name ## _registered = \ bear::engine::layer_factory::get_instance().register_type \ < bear::engine::typed_layer_creator > \ ( #class_name ); #endif // __ENGINE_LAYER_EXPORT_HPP__ plee-the-bear-20251226/bear-engine/core/src/engine/layer/gui_layer.hpp000066400000000000000000000050161512343254000253370ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Inherit from the engine::gui_layer class to create a layer in the * graphical user interface. * \author Julien Jorge */ #ifndef __ENGINE_GUI_LAYER_HPP__ #define __ENGINE_GUI_LAYER_HPP__ #include "engine/level_object.hpp" #include "gui/visual_component.hpp" #include "input/input_listener.hpp" #include "visual/screen.hpp" #include "universe/types.hpp" #include "engine/class_export.hpp" namespace bear { namespace engine { /** * \brief Inherit from this class to create a layer in the graphical user * interface. * \author Julien Jorge */ class ENGINE_EXPORT gui_layer: public input::input_listener, virtual public level_object { public: typedef std::list scene_element_list; public: gui_layer(); virtual void pre_cache(); virtual void build(); virtual void progress( universe::time_type elapsed_time ); virtual void render( scene_element_list& e ) const; const claw::math::coordinate_2d& get_size() const; claw::math::coordinate_2d adjust_screen_position ( const claw::math::coordinate_2d& pos ) const; void set_root_component( gui::visual_component* c ); bool key_pressed( const input::key_info& key ); bool char_pressed( const input::key_info& key ); bool button_pressed ( input::joystick::joy_code button, unsigned int joy_index ); bool mouse_pressed ( input::mouse::mouse_code key, const claw::math::coordinate_2d& pos ); bool mouse_released ( input::mouse::mouse_code key, const claw::math::coordinate_2d& pos ); bool mouse_maintained ( input::mouse::mouse_code key, const claw::math::coordinate_2d& pos ); bool mouse_move( const claw::math::coordinate_2d& pos ); bool finger_action( const bear::input::finger_event& event ); private: /** \brief The size of the layer. */ const claw::math::coordinate_2d m_size; /** \brief The component that receives the inputs by default. */ gui::visual_component* m_root; }; // class gui_layer } // namespace engine } // namespace bear #endif // __ENGINE_GUI_LAYER_HPP__ plee-the-bear-20251226/bear-engine/core/src/engine/layer/gui_layer_stack.hpp000066400000000000000000000050671512343254000265320ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief The stack of the layers for the graphical user interface. * \author Julien Jorge */ #ifndef __BEAR_GUI_LAYER_STACK_HPP__ #define __BEAR_GUI_LAYER_STACK_HPP__ #include "input/input_listener.hpp" #include "input/input_status.hpp" #include "visual/scene_element.hpp" #include "universe/types.hpp" #include "engine/class_export.hpp" #include namespace bear { namespace engine { class gui_layer; /** * \brief The stack of the layers for the graphical user interface. * \author Julien Jorge */ class ENGINE_EXPORT gui_layer_stack: public input::input_listener { public: /** \brief The type of the container in which we store the visuals when rendering. */ typedef std::list scene_element_list; public: ~gui_layer_stack(); void push_layer( gui_layer* the_layer ); void progress( universe::time_type elapsed_time ); void render( scene_element_list& e ) const; void clear(); private: bool key_pressed( const input::key_info& key ); bool key_maintained( const input::key_info& key ); bool key_released( const input::key_info& key ); bool char_pressed( const input::key_info& key ); bool button_pressed ( input::joystick::joy_code button, unsigned int joy_index ); bool button_maintained ( input::joystick::joy_code button, unsigned int joy_index ); bool button_released ( input::joystick::joy_code button, unsigned int joy_index ); bool mouse_pressed( input::mouse::mouse_code key, const claw::math::coordinate_2d& pos ); bool mouse_released( input::mouse::mouse_code button, const claw::math::coordinate_2d& pos ); bool mouse_maintained ( input::mouse::mouse_code button, const claw::math::coordinate_2d& pos ); bool mouse_move( const claw::math::coordinate_2d& pos ); bool finger_action( const input::finger_event& event ); private: /** \brief The sub layers */ std::vector m_sub_layers; /** \brief The status of the input controllers. */ input::input_status m_input_status; }; // class gui_layer_stack } // namespace engine } // namespace bear #endif // __BEAR_GUI_LAYER_STACK_HPP__ plee-the-bear-20251226/bear-engine/core/src/engine/layer/impl/000077500000000000000000000000001512343254000236055ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/core/src/engine/layer/impl/typed_layer_creator.tpp000066400000000000000000000012351512343254000303730ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::engine::typed_layer_creator class. * \author Julien Jorge */ /*----------------------------------------------------------------------------*/ /** * \brief Create a layer. * \param s The size of the layer. */ template LayerType* bear::engine::typed_layer_creator::create ( const universe::size_box_type& s ) const { return new LayerType(s); } // typed_layer_creator::create() plee-the-bear-20251226/bear-engine/core/src/engine/layer/layer.hpp000066400000000000000000000077711512343254000245050ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A layer represent a part of the world, but with an orhtogonal view. * Each layer is a little environment with its own items. * \author Julien Jorge */ #ifndef __ENGINE_LAYER_HPP__ #define __ENGINE_LAYER_HPP__ #include "concept/region.hpp" #include "engine/base_item.hpp" #include "visual/shader_program.hpp" #include #include #include "engine/class_export.hpp" namespace bear { namespace engine { class level; class world; /** * \brief A layer represent a part of the world, but with an orhtogonal * view. Each layer is a little environment with its own items. */ class ENGINE_EXPORT layer: virtual public level_object { private: /** Tells what to do with an item once it has been built. */ enum post_create_action { /** \brief Add the item to the layer. */ add, /** \brief Remove the item from the layer. */ remove, /** \brief Drop the item from the layer. */ drop }; // enum post_create_action public: /** \brief The type of the active area passed to the progress() method. */ typedef concept::region region_type; public: layer( const universe::size_box_type& size ); virtual ~layer(); const universe::size_box_type& get_size() const; void set_tag(const std::string& tag); std::string get_tag() const; virtual void start(); void update ( const region_type& active_area, universe::time_type elapsed_time ); void get_visual ( std::list& visuals, const universe::rectangle_type& visible_area ) const; void add_item( base_item& item ); void remove_item( base_item& item ); void drop_item( base_item& item ); void set_always_displayed( base_item& item ); void unset_always_displayed( base_item& item ); bool has_world() const; world& get_world(); const world& get_world() const; void set_visible( bool v ); bool is_visible() const; void set_active( bool v ); bool is_active() const; void set_shader( visual::shader_program s ); private: virtual void progress ( const region_type& active_area, universe::time_type elapsed_time ) = 0; virtual void do_add_item( base_item& item ); virtual void do_remove_item( base_item& item ); virtual void do_drop_item( base_item& item ); virtual void do_get_visual ( std::list& visuals, const universe::rectangle_type& visible_area ) const = 0; virtual world* do_get_world(); virtual const world* do_get_world() const; post_create_action mark_as_built( base_item& item ); bool is_currently_building( base_item& item ) const; void apply_post_update_changes(); protected: /** \brief Size of the layer. */ const universe::size_box_type m_size; private: /** \brief Always displayed items. */ std::set m_always_displayed; /** \brief The tag of the layer. */ std::string m_tag; /** \brief Tells if the layer is visible. */ bool m_visible; /** \brief Tells if the layer is active. */ bool m_active; /** \brief The shader to apply to the items in this layer. */ visual::shader_program m_shader; /** \brief The items we are currently adding in the layer. */ std::map m_post_creation_action; /** \brief Tells if an update is ongoing. */ bool m_currently_updating; /** \brief The items that must be removed at the end of the update. */ std::list m_post_update_removal; }; // class layer } // namespace engine } // namespace bear #endif // __ENGINE_LAYER_HPP__ plee-the-bear-20251226/bear-engine/core/src/engine/layer/layer_creator.hpp000066400000000000000000000016211512343254000262100ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Base class for the proxy used to instanciate layers. * \author Julien Jorge */ #ifndef __ENGINE_LAYER_CREATOR_HPP__ #define __ENGINE_LAYER_CREATOR_HPP__ #include "universe/types.hpp" #include "engine/class_export.hpp" namespace bear { namespace engine { class layer; /** * \brief Base class for layer creators, classes that instanciate layers. * \author Julien Jorge */ class ENGINE_EXPORT layer_creator { public: virtual ~layer_creator() { } virtual layer* create( const universe::size_box_type& s ) const = 0; }; // class layer_creator } // namespace engine } // namespace bear #endif // __ENGINE_LAYER_CREATOR_HPP__ plee-the-bear-20251226/bear-engine/core/src/engine/layer/layer_factory.hpp000066400000000000000000000021711512343254000262210ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A factory to instanciate classes inheriting from layer_creator. * \author Julien Jorge */ #ifndef __ENGINE_LAYER_FACTORY_HPP__ #define __ENGINE_LAYER_FACTORY_HPP__ #include "engine/layer/layer_creator.hpp" #include "engine/class_export.hpp" #include #include namespace bear { namespace engine { /** * \brief A factory to instanciate classes inheriting from layer_creator. * \author Julien Jorge */ class ENGINE_EXPORT layer_factory { public: /** \brief The type of the factory. */ typedef claw::pattern::factory factory_type; public: static factory_type& get_instance(); private: /** \brief A factory that creates layers. */ static factory_type* s_factory_instance; }; // class layer_factory } // namespace engine } // namespace bear #endif // __ENGINE_LAYER_FACTORY_HPP__ plee-the-bear-20251226/bear-engine/core/src/engine/layer/transition_layer.hpp000066400000000000000000000071731512343254000267530ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief This layer displays transition effects. * \author Julien Jorge */ #ifndef __BEAR_ENGINE_TRANSITION_LAYER_HPP__ #define __BEAR_ENGINE_TRANSITION_LAYER_HPP__ #include "communication/messageable.hpp" #include "engine/layer/gui_layer.hpp" #include "engine/class_export.hpp" #include namespace bear { namespace engine { class transition_effect; /** * \brief This layer displays transition effects. * \author Julien Jorge * * The progress() method does nothing if the level is paused. Effect coders * can prevent the user from setting the pause by returning true in the * methods transition_effect::key_pressed() and * transition_effect::button_pressed(). */ class ENGINE_EXPORT transition_layer: public gui_layer, public communication::messageable { public: /** \brief The type of a list of scene elements retrieved from the layer. */ typedef gui_layer::scene_element_list scene_element_list; private: /** \brief The data associated with the effects. */ struct effect_entry { effect_entry( transition_effect* e, std::size_t id ); /** \brief The displayed effect. */ transition_effect* effect; /** \brief The identifier of the effect. */ std::size_t id; }; // struct effect_entry /** \brief The type of the map in which are stored the active effects. */ typedef std::multimap effect_map_type; public: transition_layer( const std::string& name ); ~transition_layer(); void build(); void progress( universe::time_type elapsed_time ); void render( scene_element_list& e ) const; bool key_pressed( const input::key_info& key ); bool key_maintained( const input::key_info& key ); bool key_released( const input::key_info& key ); bool char_pressed( const input::key_info& key ); bool button_pressed ( input::joystick::joy_code button, unsigned int joy_index ); bool button_maintained ( input::joystick::joy_code button, unsigned int joy_index ); bool button_released ( input::joystick::joy_code button, unsigned int joy_index ); bool mouse_pressed ( input::mouse::mouse_code key, const claw::math::coordinate_2d& pos ); bool mouse_released ( input::mouse::mouse_code button, const claw::math::coordinate_2d& pos ); bool mouse_maintained ( input::mouse::mouse_code button, const claw::math::coordinate_2d& pos ); bool mouse_move( const claw::math::coordinate_2d& pos ); bool finger_action( const bear::input::finger_event& event ); void erase_effect( std::size_t id ); std::size_t push_effect( transition_effect* e, int p = 0 ); std::size_t set_effect( transition_effect* e, int p = 0 ); private: void clear(); template bool diffuse_call( F f ) const; public: /** \brief An invalid value for the identifiers of the effects. */ static const std::size_t not_an_id; private: /** \brief The current effect displayed. */ effect_map_type m_effect; /** \brief The next available id for the effects. */ static std::size_t s_next_id; }; // class transition_layer } // namespace engine } // namespace bear #endif // __BEAR_ENGINE_TRANSITION_LAYER_HPP__ plee-the-bear-20251226/bear-engine/core/src/engine/layer/typed_layer_creator.hpp000066400000000000000000000016651512343254000274250ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A class that instanciate a layer of a given type. * \author Julien Jorge */ #ifndef __ENGINE_TYPED_LAYER_CREATOR_HPP__ #define __ENGINE_TYPED_LAYER_CREATOR_HPP__ #include "engine/layer/layer_creator.hpp" namespace bear { namespace engine { /** * \brief A class that instanciate a layer of a given type. * \author Julien Jorge */ template class typed_layer_creator: public layer_creator { public: virtual LayerType* create( const universe::size_box_type& s ) const; }; // class typed_layer_creator } // namespace engine } // namespace bear #include "engine/layer/impl/typed_layer_creator.tpp" #endif // __ENGINE_TYPED_LAYER_CREATOR_HPP__ plee-the-bear-20251226/bear-engine/core/src/engine/level.hpp000066400000000000000000000152141512343254000233530ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief One level in the game. * \author Julien Jorge */ #ifndef __ENGINE_LEVEL_HPP__ #define __ENGINE_LEVEL_HPP__ #include #include "engine/layer/gui_layer_stack.hpp" #include "engine/layer/layer.hpp" #include "engine/variable/var_map.hpp" #include "visual/screen.hpp" #include "engine/class_export.hpp" #include #include #include #include #include namespace bear { namespace engine { class base_variable; class level_globals; class level_loader; /** * \brief One level in the game. * \author Julien Jorge */ class ENGINE_EXPORT level { private: typedef layer::region_type region_type; typedef std::map activity_map_type; /** \brief The type of the list containing the layers on the level. */ typedef std::vector layer_vector; public: /** \brief The type of the iterators on the layers of the level. */ typedef claw::wrapped_iterator < const layer, layer_vector::const_iterator, claw::const_dereference > ::iterator_type const_layer_iterator; /** \brief The type of the iterators on the layers of the level. */ typedef claw::wrapped_iterator < layer, layer_vector::iterator, claw::dereference > ::iterator_type layer_iterator; public: level ( const std::string& name, const std::string& filename, const universe::size_box_type& level_size, const std::string& level_music, const level_globals* shared_resources, const level_globals* resource_source ); ~level(); void start(); boost::signals2::connection on_started( boost::function f ); void stop(); void progress( universe::time_type elapsed_time ); boost::signals2::connection on_progress_done( boost::function f ); void render( visual::screen& screen ) const; visual::scene_element element_to_screen_coordinates( const visual::scene_element& e ) const; void shot( visual::screen& screen, claw::graphic::image& img ) const; void set_overview_activated( bool b ); bool get_overview_activated() const; const universe::size_box_type& get_size() const; unsigned int get_depth() const; const std::string& get_name() const; const std::string& get_filename() const; level_globals& get_globals(); void set_camera( base_item& cam ); void add_interest_around( const base_item* item ); void add_interest_around ( const base_item* item, const universe::size_box_type& s ); void push_layer( layer* the_layer ); void push_layer( gui_layer* the_layer ); void move_layer( const layer& the_layer, int distance ); layer_iterator layer_begin(); layer_iterator layer_end(); const_layer_iterator layer_begin() const; const_layer_iterator layer_end() const; void set_pause(); void unset_pause(); bool is_paused() const; void play_music(); void stop_music( universe::time_type fade_duration = 0 ); universe::item_handle get_camera(); universe::size_box_type get_camera_size() const; universe::rectangle_type get_camera_focus() const; universe::position_type get_camera_center() const; void set_ears( universe::item_handle ears ); universe::position_type screen_to_level( visual::position_type p ) const; void get_level_variable( base_variable& val ) const; void set_level_variable( const base_variable& val ); bool level_variable_exists( const base_variable& val ) const; private: void render_layers( visual::screen& screen ) const; void render_layers ( visual::screen& screen, const universe::rectangle_type& view ) const; void render_gui( visual::screen& screen ) const; void render ( const std::list& visuals, const universe::position_type& cam_pos, visual::screen& screen, double r_w, double r_h ) const; visual::scene_element element_to_screen_coordinates ( const visual::scene_element& e, const universe::position_type& cam_pos, double r_w, double r_h ) const; void clear(); void get_layer_region ( unsigned int layer_index, region_type& the_region ) const; void get_layer_area ( unsigned int layer_index, universe::rectangle_type& area ) const; void get_active_regions( region_type& active_regions ); void add_region ( region_type& active_regions, const universe::rectangle_type& r, const universe::size_box_type& s ) const; void set_sound_distance_unit() const; private: /** \brief The name of the level. */ const std::string m_name; /** \brief The filename of the level. */ const std::string m_filename; /** \brief Visible/active part of the level. */ universe::item_handle m_camera; /** \brief A set of items around which the activity is. */ activity_map_type m_activity; /** \brief The layers of the level, from the back to the front. */ layer_vector m_layers; /** \brief The size of the level. */ universe::size_box_type m_level_size; /** \brief Resources of the level. */ level_globals* m_level_globals; /** \brief The default music to play in the level. */ std::string m_music; /** \brief The identifier of the music when played. */ std::size_t m_music_id; /** \brief The layers of the interface. */ gui_layer_stack m_gui; /** \brief How many times this level is currently paused. */ unsigned int m_paused; /** \brief Variables global to the level. */ var_map m_level_variables; /** \brief Tell to render the whole level in the screen. */ bool m_overview_activated; /** \brief The item to use to set the ears in the sound manager. */ universe::item_handle m_ears; /** \brief The signal emitted when the level starts. */ boost::signals2::signal m_started_signal; /** \brief The signal emitted when the progress of the whole level is done. */ boost::signals2::signal m_progress_done_signal; }; // class level } // namespace engine } // namespace bear #endif // __ENGINE_LEVEL_HPP__ plee-the-bear-20251226/bear-engine/core/src/engine/level_globals.hpp000066400000000000000000000150301512343254000250520ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Some global classes in a level. * \author Julien Jorge */ #ifndef __ENGINE_LEVEL_GLOBALS_HPP__ #define __ENGINE_LEVEL_GLOBALS_HPP__ #include "audio/sound_manager.hpp" #include "visual/animation.hpp" #include "visual/image_manager.hpp" #include "visual/font/font_manager.hpp" #include "communication/post_office.hpp" #include "engine/model/model_actor.hpp" #include "engine/class_export.hpp" namespace bear { namespace engine { /** * \brief Some global classes in a level: the image_manager, the * sound_manager and the post office. * \author Julien Jorge */ class ENGINE_EXPORT level_globals { private: /** \brief The type of the key identifying a sprite loaded from a spritepos file. */ typedef std::pair spritepos_entry; /** \brief The type of the map storing the sprites loaded from the spritepos files. */ typedef std::map auto_sprite_cache; public: level_globals(); level_globals ( const level_globals* shared, const level_globals* temporary_resources ); void add_image ( const std::string& file_name, const bear::visual::image& image ); void load_image( const std::string& file_name ); void load_sound( const std::string& file_name ); void load_model( const std::string& file_name ); void load_animation( const std::string& file_name ); void load_font( const std::string& file_name ); void load_shader( const std::string& file_name ); visual::image get_image( const std::string& name ); visual::image get_existing_image( const std::string& name ) const; const model_actor& get_model( const std::string& name ); const model_actor& get_existing_model( const std::string& name ) const; const visual::animation& get_animation( const std::string& name ); const visual::animation& get_existing_animation( const std::string& name ) const; visual::font get_font( const std::string& name, double size ); visual::font get_existing_font ( const std::string& name, double size ) const; visual::shader_program get_shader( const std::string& name ); visual::shader_program get_existing_shader ( const std::string& name ) const; std::string get_spritepos_path( const std::string& image_name ) const; visual::sprite auto_sprite ( const std::string& image_name, const std::string& sprite_name ); void play_sound( const std::string& name ); void play_sound ( const std::string& name, const audio::sound_effect& effect ); audio::sample* new_sample( const std::string& name ); audio::sample* new_sample( const audio::sample& s ); std::size_t play_music( const std::string& name, unsigned int loops = 0 ); void stop_music( std::size_t id, double fadeout = 0 ); void stop_all_musics( double fadeout = 0 ); void pause_audio(); void resume_audio(); static void global_set_sound_muted( bool m ); static bool global_get_sound_muted(); static void global_set_music_muted( bool m ); static bool global_get_music_muted(); static void global_set_sound_volume( double m ); static double global_get_sound_volume(); static void global_set_music_volume( double m ); static double global_get_music_volume(); void set_sound_volume( double v ); void set_music_volume( double v ); void mute( bool m ); void mute_sound( bool m ); void mute_music( bool m ); bool image_exists( const std::string& name ) const; bool sound_exists( const std::string& name ) const; bool model_exists( const std::string& name ) const; bool animation_exists( const std::string& name ) const; bool font_exists( const std::string& name ) const; bool shader_exists( const std::string& name ) const; void register_item( communication::messageable& item ); void release_item( communication::messageable& item ); bool send_message ( const std::string& target, communication::message& msg ) const; void set_ears_position ( const claw::math::coordinate_2d& position ); void set_full_volume_distance( double d ); double get_full_volume_distance() const; void set_silence_distance( double d ); double get_silence_distance() const; void set_distance_unit( double d ); double get_distance_unit() const; void restore_resources(); void freeze(); private: void warn_missing_ressource( std::string name ) const; void restore_images(); void restore_shader_programs(); void constructor_default(); private: /** \brief Another level_globals from which we can take the resources instead of building new ones. */ const level_globals* m_shared_resources; /** \brief Another level_globals from which we can temporarily take the resources instead of building new ones. */ const level_globals* m_temporary_resources; /** \brief The image resources in the level. */ visual::image_manager m_image_manager; /** \brief The font resources in the level. */ visual::font_manager m_font_manager; /** \brief The sound resources in the level. */ audio::sound_manager m_sound_manager; /** \brief The post office in the level. */ communication::post_office m_post_office; /** \brief The models of the items in the level. */ std::map m_model; /** \brief The animations in the level. */ std::map m_animation; /** \brief This map stores the sprites read from spritepos files. */ auto_sprite_cache m_auto_sprite_cache; /** \brief Tells if no more resources are supposed to be created. */ bool m_frozen; /** \brief The volume of the sounds of the game. */ static double s_sound_volume; /** \brief The volume of the music of the game. */ static double s_music_volume; /** \brief Tell if the sounds are muted. */ static bool s_sound_muted; /** \brief Tell if the music is muted. */ static bool s_music_muted; }; // struct level_globals } // namespace engine } // namespace bear #endif // __ENGINE_LEVEL_GLOBALS_HPP__ plee-the-bear-20251226/bear-engine/core/src/engine/level_loader.hpp000066400000000000000000000101371512343254000247000ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A class that loads a level file. * \author Julien Jorge */ #ifndef __ENGINE_LEVEL_LOADER_HPP__ #define __ENGINE_LEVEL_LOADER_HPP__ #include "audio/sample.hpp" #include "universe/types.hpp" #include "visual/color.hpp" #include "visual/font/font.hpp" #include "engine/easing.hpp" #include "engine/class_export.hpp" #include namespace bear { namespace engine { class base_item; class compiled_file; class item_loader_map; class layer; class level; class level_globals; /** * \brief This class loads a level from a compiled level file. * \author Julien Jorge */ class ENGINE_EXPORT level_loader { public: explicit level_loader ( compiled_file& f, const std::string& path, const level_globals* shared_resources, const level_globals* resource_source ); ~level_loader(); unsigned int get_item_index() const; unsigned int get_items_count() const; level* drop_level(); void complete_run(); bool one_step(); private: bool one_step_item(); bool one_step_level(); void load_layer(); void validate_current_item(); void load_item_declaration(); void load_item_definition(); void load_item(); void load_item_field_list(); void load_item_field_int(); void load_item_field_u_int(); void load_item_field_real(); void load_item_field_bool(); void load_item_field_string(); void load_item_field_sprite(); void load_item_field_animation(); void load_item_field_item(); void load_item_field_sample(); void load_item_field_font(); void load_item_field_color(); void load_item_field_easing(); void load_item_field_int_list(); void load_item_field_u_int_list(); void load_item_field_real_list(); void load_item_field_bool_list(); void load_item_field_string_list(); void load_item_field_sprite_list(); void load_item_field_animation_list(); void load_item_field_item_list(); void load_item_field_sample_list(); void load_item_field_font_list(); void load_item_field_color_list(); void load_item_field_easing_list(); base_item* create_item_from_string( const std::string& name ) const; layer* create_layer_from_string ( const std::string& name, const universe::size_box_type& s ) const; void escape( std::string& str ) const; audio::sample* load_sample_data() const; visual::font load_font_data() const; visual::color load_color_data() const; easing_function load_easing_data() const; template std::string load_list( std::vector& v ); private: /** \brief The code of the next thing to read. */ unsigned int m_next_code; /** \brief The level that we are building. */ level* m_level; /** \brief The current layer. */ layer* m_layer; /** \brief The file that we are reading. */ compiled_file& m_file; /** \brief The item we are currently loading, if any. */ base_item* m_current_item; /** \brief The loaders for the current item. */ item_loader_map* m_current_loader; /** \brief Referenced items. */ std::vector m_referenced; /** \brief Count of items in the level. */ unsigned int m_items_count; /** \brief Index of the currently built item. */ unsigned int m_item_index; /** \brief Index of the next item definition to read. */ unsigned int m_referenced_index; /** \brief The major version of the level. */ unsigned int m_maj; /** \brief The major version of the level. */ unsigned int m_min; /** \brief The release version of the level. */ unsigned int m_rel; }; // class level_loader } // namespace engine } // namespace bear #endif // __ENGINE_LEVEL_LOADER_HPP__ plee-the-bear-20251226/bear-engine/core/src/engine/level_object.hpp000066400000000000000000000020201512343254000246700ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief An item in a level. * \author Julien Jorge */ #ifndef __ENGINE_LEVEL_OBJECT_HPP__ #define __ENGINE_LEVEL_OBJECT_HPP__ #include "engine/class_export.hpp" namespace bear { namespace engine { class level; class level_globals; /** * \brief An item in a level. * \author Julien Jorge */ class ENGINE_EXPORT level_object { public: level_object(); level_object( const level_object& that ); virtual ~level_object(); void clear_level(); void set_level( level& lvl ); level& get_level() const; level_globals& get_level_globals() const; private: /** \brief The level in which I am. */ level* m_level; }; // class level_object } // namespace engine } // namespace bear #endif // __ENGINE_LEVEL_OBJECT_HPP__ plee-the-bear-20251226/bear-engine/core/src/engine/libraries_pool.hpp000066400000000000000000000027121512343254000252500ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A class containing a set of dynamic libraries from which we can get * functions. * \author Julien Jorge */ #ifndef __ENGINE_LIBRARIES_POOL_HPP__ #define __ENGINE_LIBRARIES_POOL_HPP__ #include #include #include #include "engine/class_export.hpp" namespace bear { namespace engine { /** * \brief The libraries_pool is a class containing a set of dynamic * libraries from which we can get functions. * * \author Julien Jorge */ class libraries_pool { private: /** \brief The type of the list of libraries. */ typedef std::list libraries_list; public: ENGINE_EXPORT ~libraries_pool(); ENGINE_EXPORT void add_library( const std::string& name, bool current_program = false ); ENGINE_EXPORT bool have_symbol( const std::string& symbol ) const; template T get_symbol( const std::string& name ) const; private: /** \brief The libraries stored in this pool. */ libraries_list m_libraries; }; // class libraries_pool } // namespace engine } // namespace bear #include "engine/impl/libraries_pool.tpp" #endif // __ENGINE_LIBRARIES_POOL_HPP__ plee-the-bear-20251226/bear-engine/core/src/engine/loader/000077500000000000000000000000001512343254000227765ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/core/src/engine/loader/base_item_loader.hpp000066400000000000000000000045661512343254000270000ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief The item loader for the base item. * \author Julien Jorge */ #ifndef __ENGINE_BASE_ITEM_LOADER_HPP__ #define __ENGINE_BASE_ITEM_LOADER_HPP__ #include #include "engine/class_export.hpp" #include "engine/loader/item_loader_base.hpp" namespace bear { namespace engine { class base_item; /** * \brief The item loader for the base item. * \author Julien Jorge * - \a position.left: \c The x-coordinate of the left edge, * - \a position.bottom: \c The y-coordinate of the bottom egde, * - \a position.depth: \c The z-coordinate, * - \a size.height: \c The height of the box, * - \a size.width: \c The width of the box, * - \a mass: \c Mass of the item, * - \a density: \c Density of the item, * - \a elasticty: \c Elasticity of the item, * - \a hardness: \c Hardness of the item, * - \a system_angle: \c Angle of the item, * - \a speed.x: \c The initial speed on the x-axis, * - \a speed.y: \c The initial speed on the y-axis, * - \a angular_speed: \c The initial angular speed, * - \a artificial: \c Tell if the item is artificial, * - \a can_move_items: \c Tell if the item can move other items, * - \a phantom: \c Tell if the item is a phantom, * - \a global: \c Tell if the item is global, * - \a fixed.x: \c Tell if the item is fixed on x-coordinate, * - \a fixed.y: \c Tell if the item is fixed on y-coordinate, * - \a free_system: \c Tell if the system angle of the item is not * modified by the collisions. */ class ENGINE_EXPORT base_item_loader: public item_loader_base { public: explicit base_item_loader( base_item& item ); virtual base_item_loader* clone() const; virtual bool set_field( const std::string& name, int value ); virtual bool set_field( const std::string& name, double value ); virtual bool set_field( const std::string& name, bool value ); private: /** \brief The item loaded by this loader. */ base_item& m_item; }; // class base_item_loader } // namespace engine } // namespace bear #endif // __ENGINE_BASE_ITEM_LOADER_HPP__ plee-the-bear-20251226/bear-engine/core/src/engine/loader/code/000077500000000000000000000000001512343254000237105ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/core/src/engine/loader/code/base_item_loader.cpp000066400000000000000000000074611512343254000277020ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::engine::base_item_loader class. * \author Julien Jorge. */ #include "engine/loader/base_item_loader.hpp" #include "engine/base_item.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param item The item loaded by this loader. */ bear::engine::base_item_loader::base_item_loader( base_item& item ) : item_loader_base("base_item"), m_item(item) { } // base_item_loader::base_item_loader() /*----------------------------------------------------------------------------*/ /** * \brief Instanciate a copy of this object. */ bear::engine::base_item_loader* bear::engine::base_item_loader::clone() const { return new base_item_loader(*this); } // base_item_loader::clone() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type \c integer. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::engine::base_item_loader::set_field ( const std::string& name, int value ) { bool ok = true; if (name == "position.depth") m_item.set_z_position( value ); else ok = false; return ok; } // base_item_loader::set_field() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type \c real. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::engine::base_item_loader::set_field ( const std::string& name, double value ) { bool ok = true; if (name == "position.left") m_item.set_left(value); else if (name == "position.bottom") m_item.set_bottom(value); else if (name == "size.height") m_item.set_height(value); else if (name == "size.width") m_item.set_width(value); else if (name == "mass") m_item.set_mass(value); else if (name == "density") m_item.set_density(value); else if (name == "elasticity") m_item.set_elasticity(value); else if (name == "hardness") m_item.set_hardness(value); else if (name == "system_angle") m_item.set_system_angle(value); else if (name == "speed.x") m_item.set_speed( universe::speed_type(value, m_item.get_speed().y) ); else if (name == "speed.y") m_item.set_speed( universe::speed_type(m_item.get_speed().x, value) ); else if (name == "angular_speed") m_item.set_angular_speed( value ); else ok = false; return ok; } // base_item_loader::set_field() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type \c bool. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::engine::base_item_loader::set_field ( const std::string& name, bool value ) { bool ok = true; if (name == "artificial") m_item.set_artificial(value); else if (name == "can_move_items") m_item.set_can_move_items(value); else if (name == "global") m_item.set_global(value); else if (name == "phantom") m_item.set_phantom(value); else if (name == "fixed.x") { if ( value ) m_item.add_position_constraint_x(); } else if (name == "fixed.y") { if ( value ) m_item.add_position_constraint_y(); } else if (name == "fixed.z") m_item.set_z_fixed(value); else if (name == "free_system") m_item.set_free_system(value); else ok = false; return ok; } // base_item_loader::set_field() plee-the-bear-20251226/bear-engine/core/src/engine/loader/code/item_loader.cpp000066400000000000000000000044261512343254000267060ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::engine::item_loader class. * \author Julien Jorge. */ #include "engine/loader/item_loader.hpp" #include "engine/loader/item_loader_base.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ bear::engine::item_loader::item_loader() : m_impl(NULL) { } // item_loader::item_loader() /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param impl The implementation that effectively loads the item. */ bear::engine::item_loader::item_loader( const item_loader_base& impl ) : m_impl( impl.clone() ) { } // item_loader::item_loader() /*----------------------------------------------------------------------------*/ /** * \brief Copy constructor. * \param that The instance to copy from. */ bear::engine::item_loader::item_loader( const item_loader& that ) : m_impl( (that.m_impl == NULL) ? NULL : that.m_impl->clone() ) { } // item_loader::item_loader() /*----------------------------------------------------------------------------*/ /** * \brief Destructor. */ bear::engine::item_loader::~item_loader() { delete m_impl; } // item_loader::~item_loader() /*----------------------------------------------------------------------------*/ /** * \brief Assign an other loader to this one. * \param that The instance to copy from. */ bear::engine::item_loader& bear::engine::item_loader::operator=( item_loader that ) { swap(that); return *this; } // item_loader::operator=() /*----------------------------------------------------------------------------*/ /** * \brief Swap this loader with an other one. * \param that The loader to swap with. */ void bear::engine::item_loader::swap( item_loader& that ) { std::swap( m_impl, that.m_impl ); } // item_loader::swap() /*----------------------------------------------------------------------------*/ /** * \brief Get the name assigned to this loader. */ std::string bear::engine::item_loader::get_name() const { return m_impl->get_name(); } // item_loader::get_name() plee-the-bear-20251226/bear-engine/core/src/engine/loader/code/item_loader_base.cpp000066400000000000000000000273221512343254000277000ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::engine::item_loader_base class. * \author Julien Jorge. */ #include "engine/loader/item_loader_base.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param name The name of this loader. */ bear::engine::item_loader_base::item_loader_base( const std::string& name ) : m_name(name) { // nothing to do } // item_loader_base::item_loader_base() /*----------------------------------------------------------------------------*/ /** * \brief Destructor. */ bear::engine::item_loader_base::~item_loader_base() { // nothing to do } // item_loader_base::~item_loader_base() /*----------------------------------------------------------------------------*/ /** * \brief Get the name assigned to this loader. */ const std::string& bear::engine::item_loader_base::get_name() const { return m_name; } // item_loader_base::get_name() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type \c unsigned \c integer. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::engine::item_loader_base::set_field ( const std::string& name, unsigned int value ) { return false; } // item_loader_base::set_field() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type \c integer. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::engine::item_loader_base::set_field ( const std::string& name, int value ) { return false; } // item_loader_base::set_field() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type \c real. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::engine::item_loader_base::set_field ( const std::string& name, double value ) { return false; } // item_loader_base::set_field() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type \c bool. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::engine::item_loader_base::set_field ( const std::string& name, bool value ) { return false; } // item_loader_base::set_field() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type \c string. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::engine::item_loader_base::set_field ( const std::string& name, const std::string& value ) { return false; } // item_loader_base::set_field() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type \c base_item. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::engine::item_loader_base::set_field ( const std::string& name, base_item* value ) { return false; } // item_loader_base::set_field() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type \c visual::sprite. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::engine::item_loader_base::set_field ( const std::string& name, const visual::sprite& value ) { return false; } // item_loader_base::set_field() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type \c visual::animation. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::engine::item_loader_base::set_field ( const std::string& name, const visual::animation& value ) { return false; } // item_loader_base::set_field() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type \c audio::sample. * \param name The name of the field. * \param value The new value of the field. The item receiving this value must * release de memory with a delete at some time. * \return false if the field "name" is unknow, true otherwise. */ bool bear::engine::item_loader_base::set_field ( const std::string& name, audio::sample* value ) { return false; } // item_loader_base::set_field() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type \c visual::font. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::engine::item_loader_base::set_field ( const std::string& name, visual::font value ) { return false; } // item_loader_base::set_field() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type \c visual::color. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::engine::item_loader_base::set_field ( const std::string& name, visual::color value ) { return false; } // item_loader_base::set_field() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type \c easing function. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::engine::item_loader_base::set_field ( const std::string& name, easing_function value ) { return false; } // item_loader_base::set_field() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type \c list of unsigned integer. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::engine::item_loader_base::set_field ( const std::string& name, const std::vector& value ) { return false; } // item_loader_base::set_field() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type \c list of integer. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::engine::item_loader_base::set_field ( const std::string& name, const std::vector& value ) { return false; } // item_loader_base::set_field() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type \c list of real. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::engine::item_loader_base::set_field ( const std::string& name, const std::vector& value ) { return false; } // item_loader_base::set_field() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type \c list of bool. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::engine::item_loader_base::set_field ( const std::string& name, const std::vector& value ) { return false; } // item_loader_base::set_field() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type \c list of string. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::engine::item_loader_base::set_field ( const std::string& name, const std::vector& value ) { return false; } // item_loader_base::set_field() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type \c list of item. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::engine::item_loader_base::set_field ( const std::string& name, const std::vector& value ) { return false; } // item_loader_base::set_field() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type \c list of visual::sprite. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::engine::item_loader_base::set_field ( const std::string& name, const std::vector& value ) { return false; } // item_loader_base::set_field() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type \c list of visual::animation. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::engine::item_loader_base::set_field ( const std::string& name, const std::vector& value ) { return false; } // item_loader_base::set_field() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type \c list of audio::sample. * \param name The name of the field. * \param value The new value of the field. The item receiving this value must * release de memory with a delete at some time. * \return false if the field "name" is unknow, true otherwise. */ bool bear::engine::item_loader_base::set_field ( const std::string& name, const std::vector& value ) { return false; } // item_loader_base::set_field() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type \c list of visual::font. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::engine::item_loader_base::set_field ( const std::string& name, const std::vector& value ) { return false; } // item_loader_base::set_field() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type \c list of visual::color. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::engine::item_loader_base::set_field ( const std::string& name, const std::vector& value ) { return false; } // item_loader_base::set_field() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type \c list of easing functions. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::engine::item_loader_base::set_field ( const std::string& name, const std::vector& value ) { return false; } // item_loader_base::set_field() plee-the-bear-20251226/bear-engine/core/src/engine/loader/code/item_loader_fallback.cpp000066400000000000000000000272221512343254000305240ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::engine::item_loader_fallback class. * \author Julien Jorge. */ #include "engine/loader/item_loader_fallback.hpp" #include "engine/base_item.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param item The item to which the fields' values are passed. */ bear::engine::item_loader_fallback::item_loader_fallback( base_item& item ) : item_loader_base("- fallback- "), m_item( item ) { } // item_loader_fallback::clone() /*----------------------------------------------------------------------------*/ /** * \brief Create a copy of this instance. */ bear::engine::item_loader_fallback* bear::engine::item_loader_fallback::clone() const { return new item_loader_fallback(*this); } // item_loader_fallback::clone() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type \c unsigned \c integer. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::engine::item_loader_fallback::set_field ( const std::string& name, unsigned int value ) { return m_item.set_u_integer_field( name, value ); } // item_loader_fallback::set_field() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type \c integer. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::engine::item_loader_fallback::set_field ( const std::string& name, int value ) { return m_item.set_integer_field( name, value ); } // item_loader_fallback::set_field() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type \c real. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::engine::item_loader_fallback::set_field ( const std::string& name, double value ) { return m_item.set_real_field( name, value ); } // item_loader_fallback::set_field() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type \c bool. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::engine::item_loader_fallback::set_field ( const std::string& name, bool value ) { return m_item.set_bool_field( name, value ); } // item_loader_fallback::set_field() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type \c string. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::engine::item_loader_fallback::set_field ( const std::string& name, const std::string& value ) { return m_item.set_string_field( name, value ); } // item_loader_fallback::set_field() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type \c base_item. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::engine::item_loader_fallback::set_field ( const std::string& name, base_item* value ) { return m_item.set_item_field( name, value ); } // item_loader_fallback::set_field() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type \c visual::sprite. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::engine::item_loader_fallback::set_field ( const std::string& name, const visual::sprite& value ) { return m_item.set_sprite_field( name, value ); } // item_loader_fallback::set_field() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type \c visual::animation. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::engine::item_loader_fallback::set_field ( const std::string& name, const visual::animation& value ) { return m_item.set_animation_field( name, value ); } // item_loader_fallback::set_field() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type \c audio::sample. * \param name The name of the field. * \param value The new value of the field. The item receiving this value must * release de memory with a delete at some time. * \return false if the field "name" is unknow, true otherwise. */ bool bear::engine::item_loader_fallback::set_field ( const std::string& name, audio::sample* value ) { return m_item.set_sample_field( name, value ); } // item_loader_fallback::set_field() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type \c visual::font. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::engine::item_loader_fallback::set_field ( const std::string& name, visual::font value ) { return m_item.set_font_field( name, value ); } // item_loader_fallback::set_field() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type \c visual::color. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::engine::item_loader_fallback::set_field ( const std::string& name, visual::color value ) { return m_item.set_color_field( name, value ); } // item_loader_fallback::set_field() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type \c list of unsigned integer. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::engine::item_loader_fallback::set_field ( const std::string& name, const std::vector& value ) { return m_item.set_u_integer_list_field( name, value ); } // item_loader_fallback::set_field() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type \c list of integer. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::engine::item_loader_fallback::set_field ( const std::string& name, const std::vector& value ) { return m_item.set_integer_list_field( name, value ); } // item_loader_fallback::set_field() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type \c list of real. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::engine::item_loader_fallback::set_field ( const std::string& name, const std::vector& value ) { return m_item.set_real_list_field( name, value ); } // item_loader_fallback::set_field() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type \c list of bool. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::engine::item_loader_fallback::set_field ( const std::string& name, const std::vector& value ) { return m_item.set_bool_list_field( name, value ); } // item_loader_fallback::set_field() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type \c list of string. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::engine::item_loader_fallback::set_field ( const std::string& name, const std::vector& value ) { return m_item.set_string_list_field( name, value ); } // item_loader_fallback::set_field() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type \c list of item. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::engine::item_loader_fallback::set_field ( const std::string& name, const std::vector& value ) { return m_item.set_item_list_field( name, value ); } // item_loader_fallback::set_field() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type \c list of visual::sprite. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::engine::item_loader_fallback::set_field ( const std::string& name, const std::vector& value ) { return m_item.set_sprite_list_field( name, value ); } // item_loader_fallback::set_field() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type \c list of visual::animation. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::engine::item_loader_fallback::set_field ( const std::string& name, const std::vector& value ) { return m_item.set_animation_list_field( name, value ); } // item_loader_fallback::set_field() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type \c list of audio::sample. * \param name The name of the field. * \param value The new value of the field. The item receiving this value must * release de memory with a delete at some time. * \return false if the field "name" is unknow, true otherwise. */ bool bear::engine::item_loader_fallback::set_field ( const std::string& name, const std::vector& value ) { return m_item.set_sample_list_field( name, value ); } // item_loader_fallback::set_field() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type \c list of visual::font. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::engine::item_loader_fallback::set_field ( const std::string& name, const std::vector& value ) { return m_item.set_font_list_field( name, value ); } // item_loader_fallback::set_field() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type \c list of visual::color. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::engine::item_loader_fallback::set_field ( const std::string& name, const std::vector& value ) { return m_item.set_color_list_field( name, value ); } // item_loader_fallback::set_field() plee-the-bear-20251226/bear-engine/core/src/engine/loader/code/item_loader_map.cpp000066400000000000000000000045001512343254000275340ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::engine::item_loader_map class. * \author Julien Jorge. */ #include "engine/loader/item_loader_map.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Construcor. * \param fallback The loader that receives the fields' values if no loader has * been found. */ bear::engine::item_loader_map::item_loader_map( const item_loader& fallback ) : m_fallback(fallback) { } // item_loader_map::item_loader_map() /*----------------------------------------------------------------------------*/ /** * \brief Add a new loader in the map. * \param loader The loader to insert. * * Equivalent to insert( loader.get_name(), loader ). */ void bear::engine::item_loader_map::insert( const item_loader& loader ) { insert( loader.get_name(), loader ); } // item_loader_map::insert() /*----------------------------------------------------------------------------*/ /** * \brief Add a new loader in the map. * \param prefix The prefix associated to the loader in the map. * \param loader The loader to insert. */ void bear::engine::item_loader_map::insert ( const std::string& prefix, const item_loader& loader ) { CLAW_PRECOND( m_loader.find(prefix) == m_loader.end() ); m_loader.insert( loader_map::value_type( prefix, loader ) ); } // item_loader_map::insert() /*----------------------------------------------------------------------------*/ /** * \brief Get the part before the first dot and the part after it in a given * string. * \param name The string to split. * \param prefix (out) The part of \a name before the first dot. * \param suffix (out) The part of \a name after the first dot. * \return false if the \a name has no dot. */ bool bear::engine::item_loader_map::split_field_name ( const std::string& name, std::string& prefix, std::string& suffix ) const { std::string::size_type pos = name.find_first_of('.'); if ( pos == std::string::npos ) return false; else { prefix = name.substr( 0, pos ); suffix = name.substr( pos + 1 ); return true; } } // item_loader_map::split_field_name() plee-the-bear-20251226/bear-engine/core/src/engine/loader/impl/000077500000000000000000000000001512343254000237375ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/core/src/engine/loader/impl/item_loader.tpp000066400000000000000000000015601512343254000267520ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the template methods of the * bear::engine::item_loader class. * \author Julien Jorge. */ #include "engine/loader/item_loader.hpp" #include "engine/loader/item_loader_base.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Set a field of the item. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ template bool bear::engine::item_loader::set_field ( const std::string& name, T value ) { return m_impl->set_field( name, value ); } // item_loader::set_field() plee-the-bear-20251226/bear-engine/core/src/engine/loader/impl/item_loader_map.tpp000066400000000000000000000024711512343254000276110ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the template methods of the * bear::engine::item_loader_map class. * \author Julien Jorge. */ #include "engine/loader/item_loader.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Set a field of the item. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ template bool bear::engine::item_loader_map::set_field ( const std::string& name, T value ) { std::string prefix; std::string suffix; split_field_name( name, prefix, suffix ); typedef loader_map::iterator iterator_type; const std::pair range = m_loader.equal_range( prefix ); iterator_type it = range.first; const iterator_type eit = range.second; bool applied(false); while ( !applied && (it != eit) ) { applied = it->second.set_field( suffix, value ); ++it; } if ( !applied ) applied = m_fallback.set_field( name, value ); return applied; } // item_loader_map::set_field() plee-the-bear-20251226/bear-engine/core/src/engine/loader/item_loader.hpp000066400000000000000000000025451512343254000260010ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief The classes related to the loading of the items in the level files. * \author Julien Jorge */ #ifndef __ENGINE_ITEM_LOADER_HPP__ #define __ENGINE_ITEM_LOADER_HPP__ #include #include "engine/class_export.hpp" #include "audio/sample.hpp" #include "visual/sprite.hpp" #include "visual/animation.hpp" namespace bear { namespace engine { class item_loader_base; /** * \brief Base class for the loaders of the items. * \author Julien Jorge */ class ENGINE_EXPORT item_loader { public: item_loader(); item_loader( const item_loader_base& l ); item_loader( const item_loader& that ); ~item_loader(); item_loader& operator=( item_loader that ); void swap( item_loader& that ); std::string get_name() const; template bool set_field( const std::string& name, T value ); private: /** The implementation that effectively loads the item. */ item_loader_base* m_impl; }; // class item_loader } // namespace engine } // namespace bear #include "engine/loader/impl/item_loader.tpp" #endif // __ENGINE_ITEM_LOADER_HPP__ plee-the-bear-20251226/bear-engine/core/src/engine/loader/item_loader_base.hpp000066400000000000000000000065771512343254000270040ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief The classes related to the loading of the items in the level files. * \author Julien Jorge */ #ifndef __ENGINE_ITEM_LOADER_BASE_HPP__ #define __ENGINE_ITEM_LOADER_BASE_HPP__ #include #include "engine/class_export.hpp" #include "audio/sample.hpp" #include "visual/animation.hpp" #include "visual/sprite.hpp" #include "visual/color.hpp" #include "visual/font/font.hpp" #include "engine/easing.hpp" namespace bear { namespace engine { class base_item; /** * \brief Base class for the loaders of the items. * \author Julien Jorge */ class ENGINE_EXPORT item_loader_base { public: explicit item_loader_base( const std::string& name ); virtual ~item_loader_base(); virtual item_loader_base* clone() const = 0; const std::string& get_name() const; virtual bool set_field( const std::string& name, unsigned int value ); virtual bool set_field( const std::string& name, int value ); virtual bool set_field( const std::string& name, double value ); virtual bool set_field( const std::string& name, bool value ); virtual bool set_field ( const std::string& name, const std::string& value ); virtual bool set_field( const std::string& name, base_item* value ); virtual bool set_field ( const std::string& name, const visual::sprite& value ); virtual bool set_field ( const std::string& name, const visual::animation& value ); virtual bool set_field( const std::string& name, audio::sample* value ); virtual bool set_field( const std::string& name, visual::font value ); virtual bool set_field( const std::string& name, visual::color value ); virtual bool set_field( const std::string& name, easing_function value ); virtual bool set_field ( const std::string& name, const std::vector& value ); virtual bool set_field ( const std::string& name, const std::vector& value ); virtual bool set_field ( const std::string& name, const std::vector& value ); virtual bool set_field ( const std::string& name, const std::vector& value ); virtual bool set_field ( const std::string& name, const std::vector& value ); virtual bool set_field ( const std::string& name, const std::vector& value ); virtual bool set_field ( const std::string& name, const std::vector& value ); virtual bool set_field ( const std::string& name, const std::vector& value ); virtual bool set_field ( const std::string& name, const std::vector& value ); virtual bool set_field ( const std::string& name, const std::vector& value ); virtual bool set_field ( const std::string& name, const std::vector& value ); virtual bool set_field ( const std::string& name, const std::vector& value ); private: /** The name assigned to this loader. */ std::string m_name; }; // class item_loader_base } // namespace engine } // namespace bear #endif // __ENGINE_ITEM_LOADER_BASE_HPP__ plee-the-bear-20251226/bear-engine/core/src/engine/loader/item_loader_fallback.hpp000066400000000000000000000061221512343254000276130ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief The item_loader_fallback loader passes the field values to a * base_item. * \author Julien Jorge */ #ifndef __ENGINE_ITEM_LOADER_FALLBACK_HPP__ #define __ENGINE_ITEM_LOADER_FALLBACK_HPP__ #include "engine/loader/item_loader_base.hpp" namespace bear { namespace engine { class base_item; /** * \brief The item_loader_fallback loader passes the field values to a * base_item. * \author Julien Jorge */ class ENGINE_EXPORT item_loader_fallback: public item_loader_base { public: item_loader_fallback( base_item& item ); virtual item_loader_fallback* clone() const; virtual bool set_field ( const std::string& name, unsigned int value ); virtual bool set_field( const std::string& name, int value ); virtual bool set_field( const std::string& name, double value ); virtual bool set_field( const std::string& name, bool value ); virtual bool set_field ( const std::string& name, const std::string& value ); virtual bool set_field ( const std::string& name, base_item* value ); virtual bool set_field ( const std::string& name, const visual::sprite& value ); virtual bool set_field ( const std::string& name, const visual::animation& value ); virtual bool set_field ( const std::string& name, audio::sample* value ); virtual bool set_field ( const std::string& name, visual::font value ); virtual bool set_field ( const std::string& name, visual::color value ); virtual bool set_field ( const std::string& name, const std::vector& value ); virtual bool set_field ( const std::string& name, const std::vector& value ); virtual bool set_field ( const std::string& name, const std::vector& value ); virtual bool set_field ( const std::string& name, const std::vector& value ); virtual bool set_field ( const std::string& name, const std::vector& value ); virtual bool set_field ( const std::string& name, const std::vector& value ); virtual bool set_field ( const std::string& name, const std::vector& value ); virtual bool set_field ( const std::string& name, const std::vector& value ); virtual bool set_field ( const std::string& name, const std::vector& value ); virtual bool set_field ( const std::string& name, const std::vector& value ); virtual bool set_field ( const std::string& name, const std::vector& value ); private: /** \brief The item to which the field values are passed. */ base_item& m_item; }; // class item_loader_fallback } // namespace engine } // namespace bear #endif // __ENGINE_ITEM_LOADER_FALLBACK_HPP__ plee-the-bear-20251226/bear-engine/core/src/engine/loader/item_loader_map.hpp000066400000000000000000000033331512343254000266320ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief The item_loader_map class associates some item_loader to the prefixes * of their field names. * \author Julien Jorge */ #ifndef __ENGINE_ITEM_LOADER_MAP_HPP__ #define __ENGINE_ITEM_LOADER_MAP_HPP__ #include #include #include "engine/class_export.hpp" #include "engine/loader/item_loader.hpp" namespace bear { namespace engine { /** * \brief The item_loader_map class associates some item_loader to the * prefixes of their field names. * \author Julien Jorge */ class ENGINE_EXPORT item_loader_map { private: /** The type of the map in which the loaders are stored. */ typedef std::multimap loader_map; public: explicit item_loader_map( const item_loader& fallback ); void insert( const item_loader& loader ); void insert( const std::string& prefix, const item_loader& loader ); template bool set_field( const std::string& name, T value ); private: bool split_field_name ( const std::string& name, std::string& prefix, std::string& suffix ) const; private: /** The loaders and their prefixes. */ loader_map m_loader; /** The loader that receives the fields' values if no loader has been found. */ item_loader m_fallback; }; // class item_loader_map } // namespace engine } // namespace bear #include "engine/loader/impl/item_loader_map.tpp" #endif // __ENGINE_ITEM_LOADER_MAP_HPP__ plee-the-bear-20251226/bear-engine/core/src/engine/message/000077500000000000000000000000001512343254000231545ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/core/src/engine/message/code/000077500000000000000000000000001512343254000240665ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/core/src/engine/message/code/transition_effect_erase_message.cpp000066400000000000000000000034231512343254000331650ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::engine::transition_effect_erase_message * class. * \author Julien Jorge */ #include "engine/message/transition_effect_erase_message.hpp" #include "engine/layer/transition_layer.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ bear::engine::transition_effect_erase_message::transition_effect_erase_message() { set_id(transition_layer::not_an_id); } // transition_effect_erase_message::transition_effect_erase_message() /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param id The identifier of the effect to erase. */ bear::engine::transition_effect_erase_message::transition_effect_erase_message ( std::size_t id ) : m_id(transition_layer::not_an_id) { set_id(id); } // transition_effect_erase_message::transition_effect_erase_message() /*----------------------------------------------------------------------------*/ /** * \brief Apply the message to thelayer. * \param that The layer to apply the message to. */ bool bear::engine::transition_effect_erase_message::apply_to ( transition_layer& that ) { that.erase_effect( m_id ); return true; } // transition_effect_erase_message::apply_to() /*----------------------------------------------------------------------------*/ /** * \brief Set the identifier of the effect. * \param id The identifier. */ void bear::engine::transition_effect_erase_message::set_id( std::size_t id ) { m_id = id; } // transition_effect_erase_message::set_id() plee-the-bear-20251226/bear-engine/core/src/engine/message/impl/000077500000000000000000000000001512343254000241155ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/core/src/engine/message/impl/transition_effect_message.tpp000066400000000000000000000037421512343254000320620ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::engine::transition_effect_message class. * \author Julien Jorge */ /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param p The prefered position of the effect if several effects are played * simultaneously. * \param replace Tell if the new effect replaces the current ones. */ template bear::engine::transition_effect_message::transition_effect_message ( int p, bool replace ) : m_id(transition_layer::not_an_id), m_replace(replace), m_position(p) { } // transition_effect_message::transition_effect_message() /*----------------------------------------------------------------------------*/ /** * \brief Apply the message to thelayer. * \param that The layer to apply the message to. */ template bool bear::engine::transition_effect_message::apply_to ( transition_layer& that ) { if ( m_replace ) m_id = that.set_effect( new EffectType(m_effect), m_position ); else m_id = that.push_effect( new EffectType(m_effect), m_position ); return true; } // transition_effect_message::apply_to() /*----------------------------------------------------------------------------*/ /** * \brief Get the effect. */ template EffectType& bear::engine::transition_effect_message::get_effect() { return m_effect; } // transition_effect_message::get_effect() /*----------------------------------------------------------------------------*/ /** * \brief Get the identifier of the effect added in the layer. */ template std::size_t bear::engine::transition_effect_message::get_id() const { return m_id; } // transition_effect_message::get_id() plee-the-bear-20251226/bear-engine/core/src/engine/message/transition_effect_erase_message.hpp000066400000000000000000000024601512343254000322600ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A message to be sent to the transition_layer to create a transition * effect. * \author Julien Jorge */ #ifndef __BEAR_ENGINE_TRANSITION_EFFECT_ERASE_MESSAGE_HPP__ #define __BEAR_ENGINE_TRANSITION_EFFECT_ERASE_MESSAGE_HPP__ #include "communication/typed_message.hpp" #include "engine/class_export.hpp" namespace bear { namespace engine { class transition_layer; /** * \brief A message to be sent to the transition_layer to erase a * transition effect. * \author Julien Jorge */ class ENGINE_EXPORT transition_effect_erase_message: public communication::typed_message { public: transition_effect_erase_message(); transition_effect_erase_message( std::size_t id ); bool apply_to( transition_layer& that ); void set_id( std::size_t id ); private: /** \brief The identifier returned by the layer. */ std::size_t m_id; }; // class transition_effect_erase_message } // namespace engine } // namespace bear #endif // __BEAR_ENGINE_TRANSITION_EFFECT_ERASE_MESSAGE_HPP__ plee-the-bear-20251226/bear-engine/core/src/engine/message/transition_effect_message.hpp000066400000000000000000000032161512343254000311010ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A message to be sent to the transition_layer to create a transition * effect. * \author Julien Jorge */ #ifndef __BEAR_ENGINE_TRANSITION_EFFECT_MESSAGE_HPP__ #define __BEAR_ENGINE_TRANSITION_EFFECT_MESSAGE_HPP__ #include "communication/typed_message.hpp" #include "engine/layer/transition_layer.hpp" namespace bear { namespace engine { /** * \brief A message to be sent to the transition_layer to create a * transition effect. * \author Julien Jorge */ template class transition_effect_message: public communication::typed_message { public: explicit transition_effect_message( int p = 0, bool replace = false ); bool apply_to( transition_layer& that ); EffectType& get_effect(); std::size_t get_id() const; private: /** \brief The effect to add in the layer. */ EffectType m_effect; /** \brief The identifier returned by the layer. */ std::size_t m_id; /** \brief Tell if the new effect replaces the current ones. */ bool m_replace; /** \brief The prefered position of the effect if several effects are played simultaneously. */ int m_position; }; // class transition_effect_message } // namespace engine } // namespace bear #include "engine/message/impl/transition_effect_message.tpp" #endif // __BEAR_ENGINE_TRANSITION_EFFECT_MESSAGE_HPP__ plee-the-bear-20251226/bear-engine/core/src/engine/messageable_item.hpp000066400000000000000000000025731512343254000255360ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A physical item that can receive messages. * \author Julien Jorge */ #ifndef __ENGINE_MESSAGEABLE_ITEM_HPP__ #define __ENGINE_MESSAGEABLE_ITEM_HPP__ #include "communication/messageable.hpp" namespace bear { namespace engine { /** * \brief A physical item that can receive messages. * \author Julien Jorge * * \b Template \b arguments: * - \a Base: any hierarchy ending by base_item. */ template class messageable_item : public Base, public communication::messageable { public: /** \brief The type of the parent class. */ typedef Base super; public: messageable_item(); messageable_item( const std::string& name ); void on_enters_layer(); void destroy(); bool set_string_field( const std::string& name, const std::string& value ); bool is_valid() const; protected: void to_string( std::string& str ) const; bool set_name( const std::string& name ); }; // class messageable_item } // namespace engine } // namespace bear #include "engine/impl/messageable_item.tpp" #endif // __ENGINE_MESSAGEABLE_ITEM_HPP__ plee-the-bear-20251226/bear-engine/core/src/engine/model.hpp000066400000000000000000000131201512343254000233360ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief This class manage some basic informations on items: actions with * their sounds, animations and bounding boxes. * \author Julien Jorge */ #ifndef __ENGINE_MODEL_HPP__ #define __ENGINE_MODEL_HPP__ #include "audio/sample.hpp" #include "engine/item_brick/basic_renderable_item.hpp" #include "engine/model/model_action.hpp" #include "engine/model/model_actor.hpp" #include "engine/model/model_snapshot_tweener.hpp" #include "text_interface/base_exportable.hpp" namespace bear { namespace engine { class base_item; /** * \brief This class manage some basic informations on items: actions with * their sounds, animations and bounding boxes. * * \b Template \b arguments: * - \a Base the base class of the model. * * \remark This class assume that animations are oriented to the right by * default. * * \author Julien Jorge */ template class model: public basic_renderable_item { public: /** \brief The type of the parent class. */ typedef basic_renderable_item super; private: TEXT_INTERFACE_DECLARE_METHOD_LIST(super, init_exported_methods) public: model(); model( const model& that ); ~model(); model& operator=( const model& that ); void progress( universe::time_type elapsed_time ); void get_visual( std::list& visuals ) const; void set_model_actor(const model_actor& actor); void start_model_action(const std::string& name); void switch_to_model_action(const std::string& name); const std::string& get_current_action_name() const; model_action const* get_action( const std::string& name ) const; model_action const* get_current_action() const; const model_action::const_snapshot_iterator get_current_snapshot() const; universe::position_type get_mark_world_position( std::size_t i ) const; universe::position_type get_mark_world_position( const std::string& mark_name ) const; bool get_mark_placement ( const std::string& mark_name, model_mark_placement& m ) const; bool get_current_local_mark_placement ( const std::string& mark_name, model_mark_placement& m ) const; model_mark_item* get_model_mark_item( const std::string& name ) const; void set_mark_visibility_in_action( const std::string& name, bool b ); protected: void progress_model( universe::time_type elapsed_time ); void set_global_substitute ( const std::string& mark_name, const model_animation& anim ); void remove_global_substitute( const std::string& mark_name ); void set_mark_angle_in_action ( const std::string& mark_name, double angle ); void set_mark_position_in_action ( const std::string& mark_name, universe::position_type ); std::size_t get_mark_id( const model_mark& mark ) const; std::size_t get_mark_id( const std::string& mark_name ) const; bool get_mark_placement( std::size_t i, model_mark_placement& m ) const; bool get_mark_placement( model_mark_placement& m ) const; bool get_current_local_mark_placement ( std::size_t i, model_mark_placement& m ) const; void to_string( std::string& str ) const; void on_leaves_layer(); private: void progress_to_snapshot ( universe::time_type initial_time, universe::time_type elapsed_time, const model_action::const_snapshot_iterator& eit ); void execute_function( const std::string& name ); scene_visual get_mark_visual ( const model_mark& mark, const model_mark_placement& p ) const; bool get_oriented_mark_placement( model_mark_placement& m ) const; void start_action( universe::time_type d ); void stop_action(); void reset_action( universe::time_type d ); void update_sound_position(); void progress_animations ( universe::time_type initial_time, universe::time_type elapsed_time, bool only_finite = false ); void execute_snapshot(); void update_mark_items(); void update_mark_items_positions(); void update_bounding_box(); void update_bounding_box_width(); void update_bounding_box_height(); void clear(); void remove_all_mark_items_from_layer() const; void add_mark_item_in_layer( std::size_t i ); void create_tweeners(); void create_tweeners_to_snapshot( const model_snapshot& s ); void create_tweeners_to_action( const model_action& a ); static void init_exported_methods(); private: /** \brief The model_actor (the actions) of this model. */ model_actor m_actor; /** \brief The action currently done by the model. */ model_action* m_action; /** \brief The name of the current action done by the model. */ std::string m_action_name; /** \brief The current snapshot in the current action. */ model_action::const_snapshot_iterator m_snapshot; /** \brief The time elapsed on the current action. */ universe::time_type m_date; /** \brief The sound played during the action. */ audio::sample* m_sample; /** \brief The tweeners for the current snapshot. */ model_snapshot_tweener* m_current_snapshot; }; // class model } // namespace engine } // namespace bear #include "engine/impl/model.tpp" #endif // __ENGINE_MODEL_HPP__ plee-the-bear-20251226/bear-engine/core/src/engine/model/000077500000000000000000000000001512343254000226305ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/core/src/engine/model/code/000077500000000000000000000000001512343254000235425ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/core/src/engine/model/code/model_action.cpp000066400000000000000000000303211512343254000267020ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::engine::model_action class. * \author Julien Jorge */ #include "engine/model/model_action.hpp" #include "engine/model/model_snapshot.hpp" #include #include #include /*----------------------------------------------------------------------------*/ const std::size_t bear::engine::model_action::not_an_id ( std::numeric_limits::max() ); /*----------------------------------------------------------------------------*/ /** * \brief Default constructor. */ bear::engine::model_action::model_action() { } // model_action::model_action() /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param n The count of marks. * \param dur The duration of the action. * \param next The action to play after this one. * \param snd The sound to play during this action. * \param glob Tell if the sound is played globally. */ bear::engine::model_action::model_action ( std::size_t n, universe::time_type dur, const std::string& next, const std::string& snd, bool glob ) : m_mark(n), m_duration(dur), m_next(next), m_sound_name(snd), m_sound_is_global(glob) { for ( std::size_t i=0; i!=m_mark.size(); ++i ) m_mark[i] = new model_mark; } // model_action::model_action() /*----------------------------------------------------------------------------*/ /** * \brief Copy constructor. * \param that The instance to copy from. */ bear::engine::model_action::model_action( const model_action& that ) : m_mark(that.m_mark.size()), m_duration(that.m_duration), m_next(that.m_next), m_sound_name(that.m_sound_name), m_sound_is_global(that.m_sound_is_global) { for ( std::size_t i=0; i!=that.m_mark.size(); ++i ) m_mark[i] = new model_mark(that.get_mark(i)); snapshot_map::const_iterator it; for ( it=that.m_snapshot.begin(); it!=that.m_snapshot.end(); ++it ) m_snapshot[it->first] = new model_snapshot(*it->second); } // model_action::model_action() /*----------------------------------------------------------------------------*/ /** * \brief Destructor. */ bear::engine::model_action::~model_action() { snapshot_map::iterator it; for ( it=m_snapshot.begin(); it!=m_snapshot.end(); ++it ) delete it->second; for ( std::size_t i=0; i!=m_mark.size(); ++i ) delete m_mark[i]; } // model_action::~model_action() /*----------------------------------------------------------------------------*/ /** * \brief Assignment operator. * \param that The instance to copy from. */ bear::engine::model_action& bear::engine::model_action::operator=( model_action that ) { swap(that); return *this; } // model_action::operator=() /*----------------------------------------------------------------------------*/ /** * \brief Swap with an other action. * \param that The instance to swap with. */ void bear::engine::model_action::swap( model_action& that ) throw() { std::swap(m_mark, that.m_mark); std::swap(m_snapshot, that.m_snapshot); std::swap(m_duration, that.m_duration); std::swap(m_next, that.m_next); std::swap(m_sound_name, that.m_sound_name); std::swap(m_sound_is_global, that.m_sound_is_global); } // model_action::swap() /*----------------------------------------------------------------------------*/ /** * \brief Get a mark. * \param i The index of the mark. */ bear::engine::model_mark& bear::engine::model_action::get_mark( std::size_t i ) const { CLAW_PRECOND( i < m_mark.size() ); return *m_mark[i]; } // model_action::get_mark() /*----------------------------------------------------------------------------*/ /** * \brief Get a mark given his name. * \param n The label of the mark. */ bear::engine::model_mark& bear::engine::model_action::get_mark( const std::string& n ) const { return get_mark( get_mark_id(n) ); } // model_action::get_mark() /*----------------------------------------------------------------------------*/ /** * \brief Get the id of a mark given its label. * \param n The label of the mark. * \return The id of the mark, or get_marks_count() if no mark is found with * this label. */ std::size_t bear::engine::model_action::get_mark_id( const std::string& n ) const { std::size_t i; bool found(false); for ( i=0; !found && (i!=m_mark.size()); ++i ) found = m_mark[i]->get_label() == n; if ( found ) return i-1; else return not_an_id; } // model_action::get_mark_id() /*----------------------------------------------------------------------------*/ /** * \brief Get the count of marks in the action. */ std::size_t bear::engine::model_action::get_marks_count() const { return m_mark.size(); } // model_action::get_marks_count() /*----------------------------------------------------------------------------*/ /** * \brief Get the duration of the action. */ bear::universe::time_type bear::engine::model_action::get_duration() const { return m_duration; } // model_action::get_duration() /*----------------------------------------------------------------------------*/ /** * \brief Add a snapshot in the action. * \param s The snapshot. */ void bear::engine::model_action::add_snapshot( const model_snapshot& s ) { CLAW_PRECOND( m_snapshot.find(s.get_date()) == m_snapshot.end() ); m_snapshot[s.get_date()] = new model_snapshot(s); } // model_action::add_snapshot() /*----------------------------------------------------------------------------*/ /** * \brief Get the snapshot of a given date (or the one before the date). * \param t The date. */ bear::engine::model_action::const_snapshot_iterator bear::engine::model_action::get_snapshot_at( universe::time_type t ) const { return get_snapshot_const_iterator_at(t); } // model_action::get_snapshot_at() /*----------------------------------------------------------------------------*/ /** * \brief Get an iterator at the beginning of the snapshot sequence. */ bear::engine::model_action::const_snapshot_iterator bear::engine::model_action::snapshot_begin() const { return m_snapshot.begin(); } // model_action::snapshot_begin() /*----------------------------------------------------------------------------*/ /** * \brief Get an iterator past the end of the snapshot sequence. */ bear::engine::model_action::const_snapshot_iterator bear::engine::model_action::snapshot_end() const { return m_snapshot.end(); } // model_action::snapshot_end() /*----------------------------------------------------------------------------*/ /** * \brief Get an iterator at the beginning of the snapshot sequence. */ bear::engine::model_action::snapshot_iterator bear::engine::model_action::snapshot_begin() { return m_snapshot.begin(); } // model_action::snapshot_begin() /*----------------------------------------------------------------------------*/ /** * \brief Get an iterator past the end of the snapshot sequence. */ bear::engine::model_action::snapshot_iterator bear::engine::model_action::snapshot_end() { return m_snapshot.end(); } // model_action::snapshot_end() /*----------------------------------------------------------------------------*/ /** * \brief Get the action to play after this one. */ const std::string& bear::engine::model_action::get_next_action() const { return m_next; } // model_action::get_next_action() /*----------------------------------------------------------------------------*/ /** * \brief Get the name of the sound to play. */ const std::string& bear::engine::model_action::get_sound_name() const { return m_sound_name; } // model_action::get_sound_name() /*----------------------------------------------------------------------------*/ /** * \brief Tell if the sound is played globally. */ bool bear::engine::model_action::sound_is_global() const { return m_sound_is_global; } // model_action::sound_is_global() /*----------------------------------------------------------------------------*/ /** * \brief Get the greatest size of this action, among all snapshots. * \param width The greatest width. * \param height The greatest height */ void bear::engine::model_action::get_max_size ( double& width, double& height ) const { snapshot_map::const_iterator it(m_snapshot.begin()); snapshot_map::const_iterator eit(m_snapshot.end()); if ( it != eit ) { width = it->second->get_width(); height = it->second->get_height(); } else { width = 0; height = 0; } for (; it!=eit; ++it) { if ( width > it->second->get_width() ) width = it->second->get_width(); if ( height > it->second->get_height() ) height = it->second->get_height(); } } // model_action::get_max_size() /*----------------------------------------------------------------------------*/ /** * \brief Get an iterator on the beginning of the marks. */ bear::engine::model_action::mark_iterator bear::engine::model_action::mark_begin() const { return m_mark.begin(); } // model_action::mark_begin() /*----------------------------------------------------------------------------*/ /** * \brief Get an iterator on the end of the marks. */ bear::engine::model_action::mark_iterator bear::engine::model_action::mark_end() const { return m_mark.end(); } // model_action::mark_end() /*----------------------------------------------------------------------------*/ /** * \brief Get the cumulated visibility of a mark in a time interval. * \param m The mark for which we want the visibility. * \param from The beginning of the time interval. * \param to The end of the time interval. */ bear::universe::time_type bear::engine::model_action::accumulated_mark_visibility ( const model_mark& m, universe::time_type from, universe::time_type to ) const { CLAW_PRECOND( from <= to ); snapshot_map::const_iterator it( get_snapshot_const_iterator_at(from) ); snapshot_map::const_iterator to_s( get_snapshot_const_iterator_at(to) ); const std::size_t id=get_mark_id(m.get_label()); double result; if ( it == m_snapshot.end() ) --it; if ( to_s == m_snapshot.end() ) --to_s; // The first iterator is before \a from. If the mark is visible, we // remove the time between the snapshot and \a from. if ( it->second->get_mark_placement(id).is_visible() ) result = -(from - it->first); else result = 0; // Then we sum the duration of the snapshots where the mark is // visible until the last snapshot. while ( it!=to_s ) { snapshot_map::const_iterator n(it); ++n; if ( it->second->get_mark_placement(id).is_visible() ) result += n->first - it->first; it = n; } // Finally, we add the time during which the mark is visible during // the last snapshot if ( to_s->second->get_mark_placement(id).is_visible() ) result += to - to_s->first; return result; } // model_action::accumulated_mark_visibility() /*----------------------------------------------------------------------------*/ /** * \brief Get the snapshot of a given date (or the one before the date). * \param t The date. */ bear::engine::model_action::snapshot_map::const_iterator bear::engine::model_action::get_snapshot_const_iterator_at ( universe::time_type t ) const { if ( claw::real_number(t) > get_duration() ) return m_snapshot.end(); else if ( m_snapshot.empty() ) return m_snapshot.end(); else { snapshot_map::const_iterator it( m_snapshot.lower_bound(t) ); const snapshot_map::const_iterator eit( m_snapshot.end() ); if ( it == eit ) --it; else if ( it->first != t ) --it; return it; } } // model_action::get_snapshot_const_iterator_at() /*----------------------------------------------------------------------------*/ /** * \brief Swap two actions. * \param a The first action. * \param b The second action. */ void bear::engine::swap( engine::model_action& a, engine::model_action& b ) throw() { a.swap(b); } // bear::swap() /*----------------------------------------------------------------------------*/ /** * \brief Swap two actions. * \param a The first action. * \param b The second action. */ template<> void std::swap ( bear::engine::model_action& a, bear::engine::model_action& b ) { a.swap(b); } // std::swap() plee-the-bear-20251226/bear-engine/core/src/engine/model/code/model_actor.cpp000066400000000000000000000152341512343254000265430ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::engine::model_actor class. * \author Julien Jorge */ #include "engine/model/model_actor.hpp" #include "engine/model/model_action.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ bear::engine::model_actor::model_actor() { // nothing to do } // model_actor::model_actor() /*----------------------------------------------------------------------------*/ /** * \brief Copy constructor. * \param that The instance to copy from. */ bear::engine::model_actor::model_actor( const model_actor& that ) { action_map::const_iterator it; for (it=that.m_actions.begin(); it!=that.m_actions.end(); ++it) m_actions[it->first] = new model_action(*it->second); // The animations of the marks are shared among the marks of a model, but not // among two models. So, we must replace the animations of the copies with // copies of the animations and make them shared among the new marks. // this associates the new animation to each animation in \a that typedef std::map anim_map_type; anim_map_type anim_map; anim_map[NULL] = NULL; for ( action_map::iterator ita=m_actions.begin(); ita!=m_actions.end(); ++ita) for ( model_action::mark_iterator itm=ita->second->mark_begin(); itm != ita->second->mark_end(); ++itm ) { const model_animation main_anim( itm->get_main_animation() ); const model_animation substitute( itm->get_substitute() ); // get or create a copy of the main animation anim_map_type::iterator anim( anim_map.find( main_anim ) ); if ( anim == anim_map.end() ) { model_animation a( new visual::animation(*main_anim) ); anim = anim_map.insert( std::make_pair( main_anim, a ) ).first; } itm->set_main_animation(anim->second); // get or create a copy of the substitute anim = anim_map.find( itm->get_substitute() ); if ( anim == anim_map.end() ) { model_animation a( new visual::animation(*substitute) ); anim = anim_map.insert( std::make_pair( main_anim, a ) ).first; } itm->set_substitute(anim->second); } } // model_actor::model_actor() /*----------------------------------------------------------------------------*/ /** * \brief Destructor. */ bear::engine::model_actor::~model_actor() { action_map::const_iterator it; for (it=m_actions.begin(); it!=m_actions.end(); ++it) delete it->second; } // model_actor::~model_actor() /*----------------------------------------------------------------------------*/ /** * \brief Assignment operator. * \param that The instance to copy from. */ bear::engine::model_actor& bear::engine::model_actor::operator=( model_actor that ) { swap(that); return *this; } // model_actor::operator=() /*----------------------------------------------------------------------------*/ /** * \brief Swap two actors. * \param that The instance to swap with. */ void bear::engine::model_actor::swap( model_actor& that ) throw() { std::swap(m_actions, that.m_actions); } // model_actor::swap() /*----------------------------------------------------------------------------*/ /** * \brief Get an action of the model. * \param action_name The name of the action. */ bear::engine::model_action* bear::engine::model_actor::get_action( const std::string& action_name ) const { CLAW_PRECOND( m_actions.find(action_name) != m_actions.end() ); return m_actions.find(action_name)->second; } // model_actor::get_action() /*----------------------------------------------------------------------------*/ /** * \brief Add an action to the model. * \param name The name of the action. * \param a The action to add. */ void bear::engine::model_actor::add_action ( const std::string& name, const model_action& a ) { action_map::iterator it( m_actions.find(name) ); if ( it == m_actions.end() ) m_actions[name] = new model_action(a); else { *it->second = a; } } // model_actor::add_action() /*----------------------------------------------------------------------------*/ /** * \brief Set a substitute for the animation of all marks with a given name. * \param mark_name The name of the marks. * \param anim The new animation on the marks. */ void bear::engine::model_actor::set_global_substitute ( const std::string& mark_name, const model_animation& anim ) { action_map::iterator it; for( it=m_actions.begin(); it!=m_actions.end(); ++it ) { const std::size_t i( it->second->get_mark_id(mark_name) ); if ( i!=model_action::not_an_id ) it->second->get_mark(i).set_substitute(anim); } } // model_actor::set_global_substitute() /*----------------------------------------------------------------------------*/ /** * \brief Restore the default animation of all marks with a given name. * \param mark_name The name of the marks. */ void bear::engine::model_actor::remove_global_substitute ( const std::string& mark_name ) { action_map::iterator it; for( it=m_actions.begin(); it!=m_actions.end(); ++it ) { const std::size_t i( it->second->get_mark_id(mark_name) ); if ( i!=model_action::not_an_id ) it->second->get_mark(i).remove_substitute(); } } // model_actor::remove_global_substitute() /*----------------------------------------------------------------------------*/ /** * \brief Get an iterator on the beginning of the actions. */ bear::engine::model_actor::const_action_iterator bear::engine::model_actor::action_begin() const { return m_actions.begin(); } // model_actor::action_begin() /*----------------------------------------------------------------------------*/ /** * \brief Get an iterator on the end of the actions. */ bear::engine::model_actor::const_action_iterator bear::engine::model_actor::action_end() const { return m_actions.end(); } // model_actor::action_end() /*----------------------------------------------------------------------------*/ /** * \brief Swap two actors. * \param a The first actor. * \param b The second actor. */ void bear::engine::swap( engine::model_actor& a, engine::model_actor& b ) throw() { a.swap(b); } // bear::swap() /*----------------------------------------------------------------------------*/ /** * \brief Swap two actors. * \param a The first actor. * \param b The second actor. */ template<> void std::swap( bear::engine::model_actor& a, bear::engine::model_actor& b ) { a.swap(b); } // std::swap() plee-the-bear-20251226/bear-engine/core/src/engine/model/code/model_mark.cpp000066400000000000000000000222001512343254000263540ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::engine::model_mark class. * \author Julien Jorge */ #include "engine/model/model_mark.hpp" #include "engine/model/model_mark_item.hpp" #include "engine/layer/layer.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ bear::engine::model_mark::model_mark() : m_apply_angle_to_animation(false), m_pause_when_hidden(false), m_reset_animation_with_action(true), m_box_item( new model_mark_item ), m_item_in_layer(false) { } // model_mark::model_mark() /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param label The label of the mark. * \param anim The animation displayed on the mark. * \param apply_angle Tells if the angle of the mark is applied to the * animation. * \param pause_hidden Tells if the animation must be paused when hidden. * \param reset_animation_with_action Tells if the animation must be reset when * the action begins. */ bear::engine::model_mark::model_mark ( const std::string& label, const model_animation& anim, bool apply_angle, bool pause_hidden, bool reset_animation_with_action ) : m_label(label), m_animation(anim), m_apply_angle_to_animation(apply_angle), m_pause_when_hidden(pause_hidden), m_reset_animation_with_action(reset_animation_with_action), m_box_item( new model_mark_item ), m_item_in_layer(false) { } // model_mark::model_mark() /*----------------------------------------------------------------------------*/ /** * Copy constructor. * \param that The instance to copy from. */ bear::engine::model_mark::model_mark( const model_mark& that ) : m_label(that.m_label), m_animation( that.m_animation ), m_substitute( that.m_substitute ), m_apply_angle_to_animation( that.m_apply_angle_to_animation ), m_pause_when_hidden( that.m_pause_when_hidden ), m_reset_animation_with_action( that.m_reset_animation_with_action ), m_box_item(that.m_box_item->clone()), m_item_in_layer(false) { } // model_mark::model_mark() /*----------------------------------------------------------------------------*/ /** * \brief Destructor. */ bear::engine::model_mark::~model_mark() { // If the item is in a layer, it will be deleted with it. Thus we do not have // to delete it here. if ( m_item_in_layer ) drop_box_item_from_layer(); delete m_box_item; } // model_mark::~model_mark() /*----------------------------------------------------------------------------*/ /** * Assignment. * \param that The instance to assign from. */ bear::engine::model_mark& bear::engine::model_mark::operator=( model_mark that ) { swap(that); return *this; } // model_mark::operator=() /*----------------------------------------------------------------------------*/ /** * Swap the mark with an other mark. * \param that The mark to swap with. */ void bear::engine::model_mark::swap( model_mark& that ) throw() { std::swap(m_label, that.m_label); std::swap(m_animation, that.m_animation); std::swap(m_substitute, that.m_substitute); std::swap(m_apply_angle_to_animation, that.m_apply_angle_to_animation); std::swap(m_pause_when_hidden, that.m_pause_when_hidden); std::swap(m_reset_animation_with_action, that.m_reset_animation_with_action); std::swap(m_box_item, that.m_box_item); std::swap(m_item_in_layer, that.m_item_in_layer); } // model_mark::swap() /*----------------------------------------------------------------------------*/ /** * \brief Get the label of the mark. */ const std::string& bear::engine::model_mark::get_label() const { return m_label; } // model_mark::get_label() /*----------------------------------------------------------------------------*/ /** * \brief Tell if there is an animation on the mark. */ bool bear::engine::model_mark::has_animation() const { if (m_substitute != NULL) return m_substitute->is_valid(); else if (m_animation != NULL) return m_animation->is_valid(); else return false; } // model_mark::has_animation() /*----------------------------------------------------------------------------*/ /** * \brief Get the animation on the mark. */ bear::engine::model_animation& bear::engine::model_mark::get_animation() { if ( m_substitute != NULL ) return m_substitute; else return m_animation; } // model_mark::get_animation() /*----------------------------------------------------------------------------*/ /** * \brief Get the animation on the mark. */ const bear::engine::model_animation& bear::engine::model_mark::get_animation() const { if ( m_substitute != NULL ) return m_substitute; else return m_animation; } // model_mark::get_animation() /*----------------------------------------------------------------------------*/ /** * \brief Get the animation on the mark. */ const bear::engine::model_animation& bear::engine::model_mark::get_main_animation() const { return m_animation; } // model_mark::get_main_animation() /*----------------------------------------------------------------------------*/ /** * \brief Set the main animation for the mark. * \param anim The new animation on this mark. */ void bear::engine::model_mark::set_main_animation( const model_animation& anim ) { m_animation = anim; } // model_mark::set_main_animation() /*----------------------------------------------------------------------------*/ /** * \brief Tell if the angle is applied to the animation. */ bool bear::engine::model_mark::apply_angle_to_animation() const { return m_apply_angle_to_animation; } // model_mark::apply_angle_to_animation() /*----------------------------------------------------------------------------*/ /** * \brief Tell if the animation must be paused when the mark is hidden. */ bool bear::engine::model_mark::pause_when_hidden() const { return m_pause_when_hidden; } // model_mark::pause_when_hidden() /*----------------------------------------------------------------------------*/ /** * \brief Get the substitute for the animation of the mark. */ const bear::engine::model_animation& bear::engine::model_mark::get_substitute() const { return m_substitute; } // model_mark::get_substitute() /*----------------------------------------------------------------------------*/ /** * \brief Set a substitute for the animation of this mark. * \param anim The new animation on this mark. */ void bear::engine::model_mark::set_substitute( const model_animation& anim ) { m_substitute = anim; } // model_mark::set_substitute() /*----------------------------------------------------------------------------*/ /** * \brief Restore the default animation. */ void bear::engine::model_mark::remove_substitute() { m_substitute = NULL; } // model_mark::remove_substitute() /*----------------------------------------------------------------------------*/ /** * \brief Tells if the animation of the mark must be reset when the action * begins. */ bool bear::engine::model_mark::reset_animation_with_action() const { return m_reset_animation_with_action && has_animation() && ( get_animation()->is_finite() || (get_animation()->get_first_index() != 0) ); } // model_mark::reset_animation_with_action() /*----------------------------------------------------------------------------*/ /** * Get the item to keep centered on this mark. */ bear::engine::model_mark_item& bear::engine::model_mark::get_box_item() const { return *m_box_item; } // model_mark::get_box_item() /*----------------------------------------------------------------------------*/ /** * \brief Inserts the box item in a given layer. The item will not be deleted if * the mark is destroyed. * \param the_layer The layer in which the item must be inserted. */ void bear::engine::model_mark::add_box_item_in_layer( layer& the_layer ) { if ( m_box_item->is_in_layer( the_layer ) ) { CLAW_PRECOND( m_item_in_layer ); return; } CLAW_PRECOND( !m_item_in_layer ); m_item_in_layer = true; the_layer.add_item( *m_box_item ); } // model_mark::add_box_item_in_layer() /*----------------------------------------------------------------------------*/ /** * \brief Removes the item from its containing layer. The item will be deleted * if the mark is destroyed. */ void bear::engine::model_mark::drop_box_item_from_layer() { if ( !m_item_in_layer ) return; m_item_in_layer = false; m_box_item->get_layer().drop_item( *m_box_item ); } // model_mark::drop_box_item_from_layer() /*----------------------------------------------------------------------------*/ /** * \brief Swap two marks. * \param a The first mark. * \param b The second mark. */ void bear::engine::swap( engine::model_mark& a, engine::model_mark& b ) throw() { a.swap(b); } // bear::swap() /*----------------------------------------------------------------------------*/ /** * \brief Swap two marks. * \param a The first mark. * \param b The second mark. */ template<> void std::swap( bear::engine::model_mark& a, bear::engine::model_mark& b ) { a.swap(b); } // std::swap() plee-the-bear-20251226/bear-engine/core/src/engine/model/code/model_mark_item.cpp000066400000000000000000000065361512343254000274100ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::engine::model_mark_item class. * \author Julien Jorge */ #include "engine/model/model_mark_item.hpp" #include "text_interface/auto_converter_maker.hpp" #include "universe/collision_info.hpp" BASE_ITEM_IMPLEMENT(model_mark_item, bear::engine) /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ bear::engine::model_mark_item::model_mark_item() : base_item(), m_model_item(NULL) { set_phantom(true); } // model_mark_item::model_mark_item() /*----------------------------------------------------------------------------*/ /** * \brief Copy constructor. * \param that The instance to copy from. * \remark The model to which \a that item belongs will not kept in the copy. */ bear::engine::model_mark_item::model_mark_item( const model_mark_item& that ) : level_object(that), base_item(that), m_model_item(NULL), m_collision_function(that.m_collision_function) { } // model_mark_item::model_mark_item() /*----------------------------------------------------------------------------*/ /** * \brief Set the model item to which the collisions are reported. * \param item The item to which the collisions are reported. */ void bear::engine::model_mark_item::set_model_item( base_item& item ) { m_model_item = &item; } // model_mark_item::set_model_item() /*----------------------------------------------------------------------------*/ /** * \brief Get the model item to which the collisions are reported. */ bear::engine::base_item& bear::engine::model_mark_item::get_model_item() { return *m_model_item; } // model_mark_item::get_model_item() /*----------------------------------------------------------------------------*/ /** * \brief Set the name of the function called when a collision occurs. * \param f The name of the collision function. */ void bear::engine::model_mark_item::set_collision_function( const std::string& f ) { m_collision_function = f; } // model_mark_item::set_collision_function() /*----------------------------------------------------------------------------*/ /** * \brief Process a collision with another item. * \param that The other item. * \param info Some informations about the collision. */ void bear::engine::model_mark_item::collision ( base_item& that, universe::collision_info& info ) { if ( (&that != m_model_item) && (m_model_item != (base_item*)NULL) ) { const model_mark_item* m = dynamic_cast(&that); if ( (m == NULL) || (m->m_model_item != m_model_item) ) m_model_item->execute ( m_collision_function, text_interface::auto_converter_maker(this, &that, &info) ); } } // model_mark_item::collision() /*----------------------------------------------------------------------------*/ /** * \brief Tells if it is interesting to process a collision against a given * item. * \param that The other item. */ bool bear::engine::model_mark_item::do_interesting_collision ( const universe::physical_item& that ) const { return ( m_model_item != handle_type(NULL) ) && ( &that != m_model_item.get() ); } // model_mark_item::do_interesting_collision() plee-the-bear-20251226/bear-engine/core/src/engine/model/code/model_mark_placement.cpp000066400000000000000000000260341512343254000304150ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::engine::model_mark_placement class. * \author Julien Jorge */ #include "engine/model/model_mark_placement.hpp" #include /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ bear::engine::model_mark_placement::model_mark_placement() : m_angle_easing(&claw::tween::easing_none::ease_in_out), m_x_easing(&claw::tween::easing_none::ease_in_out), m_y_easing(&claw::tween::easing_none::ease_in_out), m_width_easing(&claw::tween::easing_none::ease_in_out), m_height_easing(&claw::tween::easing_none::ease_in_out) { } // model_mark_placement::model_mark_placement() /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param id The identifier of the mark. * \param x The x-position. * \param y The y-position. * \param w The width of the box around the mark. * \param h The height of the box around the mark. * \param depth The depth-position. * \param angle The angle. * \param visible The visibility. * \param collision_function The name of the function called when a collision * occurs on the box around the mark. */ bear::engine::model_mark_placement::model_mark_placement ( unsigned int id, universe::coordinate_type x, universe::coordinate_type y, universe::coordinate_type w, universe::coordinate_type h, int depth, double angle, bool visible, const std::string& collision_function ) : m_mark_id(id), m_position(x, y), m_size(w, h), m_depth(depth), m_angle(angle), m_visible(visible), m_collision_function(collision_function), m_angle_easing(&claw::tween::easing_none::ease_in_out), m_x_easing(&claw::tween::easing_none::ease_in_out), m_y_easing(&claw::tween::easing_none::ease_in_out), m_width_easing(&claw::tween::easing_none::ease_in_out), m_height_easing(&claw::tween::easing_none::ease_in_out) { } // model_mark_placement::model_mark_placement() /*----------------------------------------------------------------------------*/ /** * \brief Set the identifier or the mark concerned by this placement. * \param i The identifier of the mark. */ void bear::engine::model_mark_placement::set_mark_id( unsigned int i ) { m_mark_id = i; } // model_mark_placement::set_mark_id() /*----------------------------------------------------------------------------*/ /** * \brief Get the identifier or the mark concerned by this placement. */ unsigned int bear::engine::model_mark_placement::get_mark_id() const { return m_mark_id; } // model_mark_placement::get_mark_id() /*----------------------------------------------------------------------------*/ /** * \brief Set the position of the mark. * \param x The new x-position. * \param y The new y-position. */ void bear::engine::model_mark_placement::set_position ( universe::coordinate_type x, universe::coordinate_type y ) { m_position.set(x, y); } // model_mark_placement::set_position() /*----------------------------------------------------------------------------*/ /** * \brief Set the position of the mark. * \param pos The new position. */ void bear::engine::model_mark_placement::set_position ( const universe::position_type& pos ) { m_position = pos; } // model_mark_placement::set_position() /*----------------------------------------------------------------------------*/ /** * \brief Get the position of the mark. */ const bear::universe::position_type& bear::engine::model_mark_placement::get_position() const { return m_position; } // model_mark_placement::get_position() /*----------------------------------------------------------------------------*/ /** * \brief Set the x-position of the mark. * \param x The new position. */ void bear::engine::model_mark_placement::set_x_position ( universe::coordinate_type x ) { m_position.x = x; } // model_mark_placement::set_x_position() /*----------------------------------------------------------------------------*/ /** * \brief Set the y-position of the mark. * \param y The new position. */ void bear::engine::model_mark_placement::set_y_position ( universe::coordinate_type y ) { m_position.y = y; } // model_mark_placement::set_y_position() /*----------------------------------------------------------------------------*/ /** * \brief Set the size of the box around the mark. * \param s The new size. */ void bear::engine::model_mark_placement::set_size ( const universe::size_box_type& s ) { m_size = s; } // model_mark_placement::set_size() /*----------------------------------------------------------------------------*/ /** * \brief Get the size of the box around the mark. */ const bear::universe::size_box_type& bear::engine::model_mark_placement::get_size() const { return m_size; } // model_mark_placement::get_size() /*----------------------------------------------------------------------------*/ /** * \brief Set the width of the mark. * \param s The new width. */ void bear::engine::model_mark_placement::set_width( universe::size_type s ) { m_size.x = s; } // model_mark_placement::set_width() /*----------------------------------------------------------------------------*/ /** * \brief Set the height of the mark. * \param s The new height. */ void bear::engine::model_mark_placement::set_height( universe::size_type s ) { m_size.y = s; } // model_mark_placement::set_height() /*----------------------------------------------------------------------------*/ /** * \brief Set the depth-position of the mark. * \param z The new depth-position. */ void bear::engine::model_mark_placement::set_depth_position( int z ) { m_depth = z; } // model_mark_placement::set_depth_position() /*----------------------------------------------------------------------------*/ /** * \brief Get the depth-position of the mark. */ int bear::engine::model_mark_placement::get_depth_position() const { return m_depth; } // model_mark_placement::get_depth_position() /*----------------------------------------------------------------------------*/ /** * \brief Set the angle of the mark. * \param a The new angle. */ void bear::engine::model_mark_placement::set_angle( double a ) { m_angle = a; } // model_mark_placement::set_angle() /*----------------------------------------------------------------------------*/ /** * \brief Get the angle of the mark. */ double bear::engine::model_mark_placement::get_angle() const { return m_angle; } // model_mark_placement::get_angle() /*----------------------------------------------------------------------------*/ /** * \brief Set if the mark is visible or not. * \param v Visible or not. */ void bear::engine::model_mark_placement::set_visibility( bool v ) { m_visible = v; } // model_mark_placement::set_visibility() /*----------------------------------------------------------------------------*/ /** * \brief Tell if the mark is visible or not. */ bool bear::engine::model_mark_placement::is_visible() const { return m_visible; } // model_mark_placement::is_visible() /*----------------------------------------------------------------------------*/ /** * \brief Set the name of the function to call when something collides in the * box around the mark. * \param f The name of the function. */ void bear::engine::model_mark_placement::set_collision_function ( const std::string& f ) { m_collision_function = f; } // model_mark_placement::set_collision_function() /*----------------------------------------------------------------------------*/ /** * \brief Get the name of the function to call when something collides in the * box around the mark. */ const std::string& bear::engine::model_mark_placement::get_collision_function() const { return m_collision_function; } // model_mark_placement::get_collision_function() /*----------------------------------------------------------------------------*/ /** * \brief Get the easing function for the angle. */ bear::engine::model_mark_placement::easing_function bear::engine::model_mark_placement::get_angle_easing() const { return m_angle_easing; } // model_mark_placement::get_angle_easing() /*----------------------------------------------------------------------------*/ /** * \brief Set the easing function for the angle. * \param f The function. */ void bear::engine::model_mark_placement::set_angle_easing( easing_function f ) { m_angle_easing = f; } // model_mark_placement::set_angle_easing() /*----------------------------------------------------------------------------*/ /** * \brief Get the easing function for the x-position. */ bear::engine::model_mark_placement::easing_function bear::engine::model_mark_placement::get_x_position_easing() const { return m_x_easing; } // model_mark_placement::get_x_position_easing() /*----------------------------------------------------------------------------*/ /** * \brief Set the easing function for the x-position. * \param f The function. */ void bear::engine::model_mark_placement::set_x_position_easing ( easing_function f ) { m_x_easing = f; } // model_mark_placement::() /*----------------------------------------------------------------------------*/ /** * \brief Get the easing function for the y-position. */ bear::engine::model_mark_placement::easing_function bear::engine::model_mark_placement::get_y_position_easing() const { return m_y_easing; } // model_mark_placement::get_y_position_easing() /*----------------------------------------------------------------------------*/ /** * \brief Set the easing function for the y-position. * \param f The function. */ void bear::engine::model_mark_placement::set_y_position_easing ( easing_function f ) { m_y_easing = f; } // model_mark_placement::set_y_position_easing() /*----------------------------------------------------------------------------*/ /** * \brief Get the easing function for the width. */ bear::engine::model_mark_placement::easing_function bear::engine::model_mark_placement::get_width_easing() const { return m_width_easing; } // model_mark_placement::get_width_easing() /*----------------------------------------------------------------------------*/ /** * \brief Set the easing function for the width. * \param f The function. */ void bear::engine::model_mark_placement::set_width_easing( easing_function f ) { m_width_easing = f; } // model_mark_placement::set_width_easing() /*----------------------------------------------------------------------------*/ /** * \brief Get the easing function for the height. */ bear::engine::model_mark_placement::easing_function bear::engine::model_mark_placement::get_height_easing() const { return m_height_easing; } // model_mark_placement::get_height_easing() /*----------------------------------------------------------------------------*/ /** * \brief Set the easing function for the height. * \param f The function. */ void bear::engine::model_mark_placement::set_height_easing( easing_function f ) { m_height_easing = f; } // model_mark_placement::set_height_easing() plee-the-bear-20251226/bear-engine/core/src/engine/model/code/model_snapshot.cpp000066400000000000000000000207221512343254000272700ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::engine::model_snapshot class. * \author Julien Jorge */ #include "engine/model/model_snapshot.hpp" #include /*----------------------------------------------------------------------------*/ /** * \brief Get the alignment from its string representation. */ bear::engine::model_snapshot::horizontal_alignment::value bear::engine::model_snapshot::horizontal_alignment::from_string ( const std::string& str ) { if ( str == "align_left" ) return align_left; else if ( str == "align_right" ) return align_right; else if ( str == "align_center" ) return align_center; else throw std::invalid_argument("not a horizontal alignment '" + str + '\''); } // model_snapshot::horizontal_alignment::from_string() /*----------------------------------------------------------------------------*/ /** * \brief Get the alignment from its string representation. */ bear::engine::model_snapshot::vertical_alignment::value bear::engine::model_snapshot::vertical_alignment::from_string ( const std::string& str ) { if ( str == "align_top" ) return align_top; else if ( str == "align_bottom" ) return align_bottom; else if ( str == "align_center" ) return align_center; else throw std::invalid_argument("not a vertical alignment '" + str + '\''); } // model_snapshot::vertical_alignment::from_string() /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param d The date at which the snapshot is in the action. * \param n The count of marks in the model. * \param func The function to call when passing on the snapshot. * \param sounds The name of the sounds among which the one to play is randomly * picked. * \param glob Tell if the sound is played globally. */ bear::engine::model_snapshot::model_snapshot ( universe::time_type d, std::size_t n, std::string func, std::vector sounds, bool glob ) : m_date(d), m_placement(n), m_function(func), m_sound_name(sounds), m_sound_is_global(glob) { } // model_snapshot::model_snapshot() /*----------------------------------------------------------------------------*/ /** * \brief Get the date at which the snapshot is in the action. */ bear::universe::time_type bear::engine::model_snapshot::get_date() const { return m_date; } // model_snapshot::get_date() /*----------------------------------------------------------------------------*/ /** * \brief Set a mark placement. * \param m The mark placement to add. */ void bear::engine::model_snapshot::set_mark_placement ( const model_mark_placement& m ) { m_placement[m.get_mark_id()] = m; } // model_snapshot::set_mark_placement() /*----------------------------------------------------------------------------*/ /** * \brief Get a mark placement. * \param i The mark number for which we want the placement. */ const bear::engine::model_mark_placement& bear::engine::model_snapshot::get_mark_placement( std::size_t i ) const { return m_placement[i]; } // model_snapshot::get_mark_placement() /*----------------------------------------------------------------------------*/ /** * \brief Get the number of mark placements. */ std::size_t bear::engine::model_snapshot::get_mark_placements_count() const { return m_placement.size(); } // model_snapshot::get_mark_placements_count() /*----------------------------------------------------------------------------*/ /** * \brief Get the function to call when passing on the snapshot. */ std::string bear::engine::model_snapshot::get_function() const { return m_function; } // model_snapshot::get_function() /*----------------------------------------------------------------------------*/ /** * \brief Get the name of the sound to play when passing on this snapshot. */ std::string bear::engine::model_snapshot::get_random_sound_name() const { if ( m_sound_name.empty() ) return std::string(); else { std::vector::const_iterator it=m_sound_name.begin(); std::advance( it, rand() % m_sound_name.size() ); return *it; } } // model_snapshot::get_random_sound_name() /*----------------------------------------------------------------------------*/ /** * \brief Tell if the sound is played globally. */ bool bear::engine::model_snapshot::sound_is_global() const { return m_sound_is_global; } // model_snapshot::sound_is_global() /*----------------------------------------------------------------------------*/ /** * \brief Get an iterator on the beginning of the mark_placements. */ bear::engine::model_snapshot::const_mark_placement_iterator bear::engine::model_snapshot::mark_placement_begin() const { return m_placement.begin(); } // model_snapshot::mark_placement_begin() /*----------------------------------------------------------------------------*/ /** * \brief Get an iterator on the end of the mark_placements. */ bear::engine::model_snapshot::const_mark_placement_iterator bear::engine::model_snapshot::mark_placement_end() const { return m_placement.end(); } // model_snapshot::mark_placement_end() /*----------------------------------------------------------------------------*/ /** * \brief Set the size of this model_snapshot. * \param width The width of the box. * \param height The height of the box. */ void bear::engine::model_snapshot::set_size( double width, double height ) { m_width = width; m_height = height; } // model_snapshot::set_bounding_box() /*----------------------------------------------------------------------------*/ /** * \brief Get the width of this snapsot. */ double bear::engine::model_snapshot::get_width() const { return m_width; } // model_snapshot::get_width() /*----------------------------------------------------------------------------*/ /** * \brief Get the height of this model_snapshot. */ double bear::engine::model_snapshot::get_height() const { return m_height; } // model_snapshot::get_height() /*----------------------------------------------------------------------------*/ /** * \brief Set the alignment type on x-coordinate. */ void bear::engine::model_snapshot::set_x_alignment (const horizontal_alignment::value a) { m_x_alignment = a; } // model_snapshot::set_x_alignment() /*----------------------------------------------------------------------------*/ /** * \brief Get the alignment type on x-coordinate. */ bear::engine::model_snapshot::horizontal_alignment::value bear::engine::model_snapshot::get_x_alignment() const { return m_x_alignment; } // model_snapshot::get_x_alignment() /*----------------------------------------------------------------------------*/ /** * \brief Set the value alignment on x-coordinate. */ void bear::engine::model_snapshot::set_x_alignment_value (universe::coordinate_type value) { m_x_alignment_value = value; } // model_snapshot::set_x_alignment_value() /*----------------------------------------------------------------------------*/ /** * \brief Get value of the alignment on x-coordinate. */ bear::universe::coordinate_type bear::engine::model_snapshot::get_x_alignment_value() const { return m_x_alignment_value; } // model_snapshot::get_x_alignment_value() /*----------------------------------------------------------------------------*/ /** * \brief Set the alignment type on y-coordinate. */ void bear::engine::model_snapshot::set_y_alignment (const vertical_alignment::value a) { m_y_alignment = a; } // model_snapshot::set_y_alignment() /*----------------------------------------------------------------------------*/ /** * \brief Get the alignment type on y-coordinate. */ bear::engine::model_snapshot::vertical_alignment::value bear::engine::model_snapshot::get_y_alignment() const { return m_y_alignment; } // model_snapshot::get_y_alignment() /*----------------------------------------------------------------------------*/ /** * \brief Set the value alignment on y-coordinate. */ void bear::engine::model_snapshot::set_y_alignment_value (universe::coordinate_type value) { m_y_alignment_value = value; } // model_snapshot::set_y_alignment_value() /*----------------------------------------------------------------------------*/ /** * \brief Get value of the alignment on y-coordinate. */ bear::universe::coordinate_type bear::engine::model_snapshot::get_y_alignment_value() const { return m_y_alignment_value; } // model_snapshot::get_y_alignment_value() plee-the-bear-20251226/bear-engine/core/src/engine/model/code/model_snapshot_tweener.cpp000066400000000000000000000172161512343254000310250ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::engine::model_snapshot_tweener class; * \author Julien Jorge */ #include "engine/model/model_snapshot_tweener.hpp" #include "engine/model/model_action.hpp" #include "engine/model/model_mark_placement.hpp" #include "engine/model/model_snapshot.hpp" #include /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param init The initial positions of the marks. * \remark This constructor can be use when there is no target snapshot. */ bear::engine::model_snapshot_tweener::model_snapshot_tweener ( const model_snapshot& init ) { m_placement.resize(init.get_mark_placements_count()); for ( std::size_t i=0; i!=m_placement.size(); ++i ) m_placement[i] = init.get_mark_placement(i); } // model_snapshot_tweener::model_snapshot_tweener() /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param init The initial positions of the marks. * \param end The final positions of the marks. * \param start_action The action from which init was taken. * \param end_action The action from which end was taken. * \param d The duration of the movement. */ bear::engine::model_snapshot_tweener::model_snapshot_tweener ( const model_snapshot& init, const model_snapshot& end, const model_action& init_action, const model_action& end_action, universe::time_type d ) { m_placement.resize(init.get_mark_placements_count()); for ( std::size_t i=0; i!=m_placement.size(); ++i ) { m_placement[i] = init.get_mark_placement(i); const std::size_t end_id ( end_action.get_mark_id(init_action.get_mark(i).get_label()) ); if ( end_id != model_action::not_an_id ) { const model_mark_placement end_mark = get_mark_in_local_coordinates(init, end, end_id); insert_tweener( i, end_mark, d ); } } } // model_snapshot_tweener::model_snapshot_tweener() /*----------------------------------------------------------------------------*/ /** * \brief Get a mark placement. * \param i The mark number for which we want the placement. */ bear::engine::model_mark_placement& bear::engine::model_snapshot_tweener::get_mark_placement( std::size_t i ) { return m_placement[i]; } // model_snapshot_tweener::get_mark_placement() /*----------------------------------------------------------------------------*/ /** * \brief Get a mark placement. * \param i The mark number for which we want the placement. */ const bear::engine::model_mark_placement& bear::engine::model_snapshot_tweener::get_mark_placement( std::size_t i ) const { return m_placement[i]; } // model_snapshot_tweener::get_mark_placement() /*----------------------------------------------------------------------------*/ /** * \brief Get an iterator on the beginning of the mark_placements. */ bear::engine::model_snapshot_tweener::const_mark_placement_iterator bear::engine::model_snapshot_tweener::mark_placement_begin() const { return m_placement.begin(); } // model_snapshot_tweener::mark_placement_begin() /*----------------------------------------------------------------------------*/ /** * \brief Get an iterator on the end of the mark_placements. */ bear::engine::model_snapshot_tweener::const_mark_placement_iterator bear::engine::model_snapshot_tweener::mark_placement_end() const { return m_placement.end(); } // model_snapshot_tweener::mark_placement_end() /*----------------------------------------------------------------------------*/ /** * \brief Update the tweeners for a given amount of time. * \param elapsed_time The duration of the update. */ void bear::engine::model_snapshot_tweener::update ( universe::time_type elapsed_time ) { m_tweeners.update(elapsed_time); } // model_snapshot_tweener::update() /*----------------------------------------------------------------------------*/ /** * \brief Get a mark placement from the target snapshot in the coordinates of * the current snapshot. * \param init The current snapshot. * \param end The target snapshot. * \param id The identifier of the mark. */ bear::engine::model_mark_placement bear::engine::model_snapshot_tweener::get_mark_in_local_coordinates ( const model_snapshot& init, const model_snapshot& end, std::size_t id ) const { bear::universe::coordinate_type dx = end.get_x_alignment_value(); bear::universe::coordinate_type dy = end.get_y_alignment_value(); switch ( end.get_x_alignment() ) { case model_snapshot::horizontal_alignment::align_center: dx += (end.get_width() - init.get_width()) / 2; break; case model_snapshot::horizontal_alignment::align_right: dx += end.get_width() - init.get_width(); break; case model_snapshot::horizontal_alignment::align_left: dx += 0; break; } switch ( end.get_y_alignment() ) { case model_snapshot::vertical_alignment::align_center: dy += (end.get_height() - init.get_height()) / 2; break; case model_snapshot::vertical_alignment::align_top: dy += end.get_height() - init.get_height(); break; case model_snapshot::vertical_alignment::align_bottom: dy += 0; break; } model_mark_placement result( end.get_mark_placement(id) ); result.set_x_position( result.get_position().x - dx ); result.set_y_position( result.get_position().y - dy ); return result; } // model_snapshot_tweener::get_mark_in_local_coordinates() /*----------------------------------------------------------------------------*/ /** * \brief Create a tweener to move a given mark placement to reach an other * placement. * \param id The identifier of the mark to tween. * \param end The mark placement at the final position. * \param d The duration of the movement. */ void bear::engine::model_snapshot_tweener::insert_tweener ( std::size_t id, const model_mark_placement& end, universe::time_type d ) { if ( m_placement[id].get_angle() != end.get_angle() ) m_tweeners.insert ( claw::tween::single_tweener (m_placement[id].get_angle(), end.get_angle(), d, boost::bind( &model_mark_placement::set_angle, &m_placement[id], _1 ), m_placement[id].get_angle_easing() ) ); if ( m_placement[id].get_position().x != end.get_position().x ) m_tweeners.insert ( claw::tween::single_tweener (m_placement[id].get_position().x, end.get_position().x, d, boost::bind ( &model_mark_placement::set_x_position, &m_placement[id], _1 ), m_placement[id].get_x_position_easing() ) ); if ( m_placement[id].get_position().y != end.get_position().y ) m_tweeners.insert ( claw::tween::single_tweener (m_placement[id].get_position().y, end.get_position().y, d, boost::bind ( &model_mark_placement::set_y_position, &m_placement[id], _1 ), m_placement[id].get_y_position_easing() ) ); if ( m_placement[id].get_size().x != end.get_size().x ) m_tweeners.insert ( claw::tween::single_tweener (m_placement[id].get_size().x, end.get_size().x, d, boost::bind ( &model_mark_placement::set_width, &m_placement[id], _1 ), m_placement[id].get_width_easing() ) ); if ( m_placement[id].get_size().y != end.get_size().y ) m_tweeners.insert ( claw::tween::single_tweener (m_placement[id].get_size().y, end.get_size().y, d, boost::bind ( &model_mark_placement::set_height, &m_placement[id], _1 ), m_placement[id].get_height_easing() ) ); } // model_snapshot_tweener::insert_tweener() plee-the-bear-20251226/bear-engine/core/src/engine/model/model_action.hpp000066400000000000000000000101561512343254000260010ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief An action of a model. * \author Julien Jorge */ #ifndef __ENGINE_MODEL_ACTION_HPP__ #define __ENGINE_MODEL_ACTION_HPP__ #include "engine/model/model_mark.hpp" #include "engine/class_export.hpp" #include #include #include namespace bear { namespace engine { class model_snapshot; /** * \brief An action of a model. * \author Julien Jorge */ class ENGINE_EXPORT model_action { private: /** \brief The type of a map of snapshots. */ typedef std::map snapshot_map; public: /** \brief Iterators on the snapshots of the action. */ typedef claw::wrapped_iterator < const model_snapshot, snapshot_map::const_iterator, claw::unary_compose < claw::const_dereference, claw::const_pair_second > > ::iterator_type const_snapshot_iterator; /** \brief Iterators on the snapshots of the action. */ typedef claw::wrapped_iterator < model_snapshot, snapshot_map::iterator, claw::unary_compose < claw::dereference, claw::pair_second > > ::iterator_type snapshot_iterator; /** \brief Iterators on the marks of the action. */ typedef claw::wrapped_iterator < model_mark, std::vector::const_iterator, claw::dereference > ::iterator_type mark_iterator; public: model_action(); model_action ( std::size_t n, universe::time_type dur, const std::string& next, const std::string& snd, bool glob ); model_action( const model_action& that ); ~model_action(); model_action& operator=( model_action that ); void swap( model_action& that ) throw(); model_mark& get_mark( std::size_t i ) const; model_mark& get_mark( const std::string& n ) const; std::size_t get_mark_id( const std::string& n ) const; std::size_t get_marks_count() const; universe::time_type get_duration() const; void add_snapshot( const model_snapshot& s ); const_snapshot_iterator get_snapshot_at( universe::time_type t ) const; const_snapshot_iterator snapshot_begin() const; const_snapshot_iterator snapshot_end() const; snapshot_iterator snapshot_begin(); snapshot_iterator snapshot_end(); const std::string& get_next_action() const; const std::string& get_sound_name() const; bool sound_is_global() const; void get_max_size( double& width, double& height ) const; mark_iterator mark_begin() const; mark_iterator mark_end() const; universe::time_type accumulated_mark_visibility ( const model_mark& m, universe::time_type from, universe::time_type to ) const; private: snapshot_map::const_iterator get_snapshot_const_iterator_at( universe::time_type t ) const; public: /** \brief An invalid mark identifier. */ static const std::size_t not_an_id; private: /** \brief The marks in the action. */ std::vector m_mark; /** \brief The snapshots in the action. */ snapshot_map m_snapshot; /** \brief The duration of the action. */ universe::time_type m_duration; /** \brief The action to play after this one. */ std::string m_next; /** \brief The sound to play during this action. */ std::string m_sound_name; /** \brief Tell if the sound is played globally. */ bool m_sound_is_global; }; // class model_action void swap( engine::model_action& a, engine::model_action& b ) throw(); } // namespace engine } // namespace bear namespace std { template<> void swap( bear::engine::model_action& a, bear::engine::model_action& b ); } // namespace std #endif // __ENGINE_MODEL_ACTION_HPP__ plee-the-bear-20251226/bear-engine/core/src/engine/model/model_actor.hpp000066400000000000000000000042621512343254000256350ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A model is a group of animations and sounds. * \author Julien Jorge */ #ifndef __ENGINE_MODEL_ACTOR_HPP__ #define __ENGINE_MODEL_ACTOR_HPP__ #include "engine/model/model_animation.hpp" #include "engine/class_export.hpp" #include #include #include #include namespace bear { namespace engine { class model_action; /** * \brief A model is a group of animations and sounds. * \author Julien Jorge */ class ENGINE_EXPORT model_actor { private: /** \brief A map of actions. */ typedef std::map action_map; public: /** \brief Iterators on the actions of the actor. */ typedef claw::wrapped_iterator < const model_action, action_map::const_iterator, claw::unary_compose < claw::const_dereference, claw::const_pair_second > > ::iterator_type const_action_iterator; public: model_actor(); model_actor( const model_actor& that ); ~model_actor(); model_actor& operator=( model_actor that ); void swap( model_actor& that ) throw(); model_action* get_action( const std::string& action_name ) const; void add_action( const std::string& name, const model_action& a ); void set_global_substitute ( const std::string& mark_name, const model_animation& anim ); void remove_global_substitute( const std::string& mark_name ); const_action_iterator action_begin() const; const_action_iterator action_end() const; private: /** \brief The actions. */ action_map m_actions; }; // class model_actor void swap( engine::model_actor& a, engine::model_actor& b ) throw(); } // namespace engine } // namespace bear namespace std { template<> void swap( bear::engine::model_actor& a, bear::engine::model_actor& b ); } // namespace std #endif // __ENGINE_MODEL_ACTOR_HPP__ plee-the-bear-20251226/bear-engine/core/src/engine/model/model_animation.hpp000066400000000000000000000013211512343254000264750ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A model is a group of animations and sounds. * \author Julien Jorge */ #ifndef __ENGINE_MODEL_ANIMATION_HPP__ #define __ENGINE_MODEL_ANIMATION_HPP__ #include "visual/animation.hpp" #include namespace bear { namespace engine { /** \brief An animation shared by all the actions and marks of a model. */ typedef claw::memory::smart_ptr model_animation; } // namespace engine } // namespace bear #endif // __ENGINE_MODEL_ANIMATION_HPP__ plee-the-bear-20251226/bear-engine/core/src/engine/model/model_mark.hpp000066400000000000000000000054211512343254000254550ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A mark in an action. * \author Julien Jorge */ #ifndef __ENGINE_MODEL_MARK_HPP__ #define __ENGINE_MODEL_MARK_HPP__ #include "universe/types.hpp" #include "engine/model/model_animation.hpp" #include "engine/class_export.hpp" namespace bear { namespace engine { class layer; class model_mark_item; /** * \brief A placement for a mark in a snapshot. * \author Julien Jorge */ class ENGINE_EXPORT model_mark { public: model_mark(); model_mark ( const std::string& label, const model_animation& anim, bool apply_angle, bool pause_hidden, bool reset_animation_with_action ); model_mark( const model_mark& that ); ~model_mark(); model_mark& operator=( model_mark that ); void swap( model_mark& that ) throw(); const std::string& get_label() const; bool has_animation() const; model_animation& get_animation(); const model_animation& get_animation() const; const model_animation& get_main_animation() const; void set_main_animation( const model_animation& anim ); bool apply_angle_to_animation() const; bool pause_when_hidden() const; const model_animation& get_substitute() const; void set_substitute( const model_animation& anim ); void remove_substitute(); bool reset_animation_with_action() const; model_mark_item& get_box_item() const; void add_box_item_in_layer( layer& the_layer ); void drop_box_item_from_layer(); private: /** \brief The label of the mark. */ std::string m_label; /** \brief The animation displayed on the mark. */ model_animation m_animation; /** \brief A substitution to the main animation. */ model_animation m_substitute; /** \brief Tell if the angle is applied to the animation. */ bool m_apply_angle_to_animation; /** \brief Tell if the animation must be paused when hidden. */ bool m_pause_when_hidden; /** \brief Tells if the animation must be reset when an action begins. */ bool m_reset_animation_with_action; /** \brief The item centered on this mark. */ model_mark_item* m_box_item; /** \brief Tells if m_box_item has been inserted in a layer. */ bool m_item_in_layer; }; // class model_mark void swap( engine::model_mark& a, engine::model_mark& b ) throw(); } // namespace engine } // namespace bear namespace std { template<> void swap( bear::engine::model_mark& a, bear::engine::model_mark& b ); } // namespace std #endif // __ENGINE_MODEL_MARK_HPP__ plee-the-bear-20251226/bear-engine/core/src/engine/model/model_mark_item.hpp000066400000000000000000000034061512343254000264740ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief The type of the items kept on the marks of the items. * \author Julien Jorge */ #ifndef __ENGINE_MODEL_MARK_ITEM_HPP__ #define __ENGINE_MODEL_MARK_ITEM_HPP__ #include "engine/base_item.hpp" #include "universe/derived_item_handle.hpp" #include "engine/export.hpp" namespace bear { namespace engine { /** * \brief The type of the items kept on the marks of the items. * \author Julien Jorge */ class ENGINE_EXPORT model_mark_item: public base_item { DECLARE_BASE_ITEM(model_mark_item); private: /** \brief The type of the handle on the model of which this is a mark. */ typedef universe::derived_item_handle handle_type; public: model_mark_item(); model_mark_item( const model_mark_item& that ); // Not implemented model_mark_item& operator=( const model_mark_item& that ); void set_model_item( base_item& item ); base_item& get_model_item(); void set_collision_function( const std::string& f ); private: void collision( base_item& that, universe::collision_info& info ); bool do_interesting_collision ( const universe::physical_item& that ) const; private: /** \brief The model object owning this mark object. */ handle_type m_model_item; /** \brief The function to call on m_model_item when a collision occurs on this item. */ std::string m_collision_function; }; // class model_mark_item } // namespace engine } // namespace bear #endif // __ENGINE_MODEL_MARK_ITEM_HPP__ plee-the-bear-20251226/bear-engine/core/src/engine/model/model_mark_placement.hpp000066400000000000000000000073361512343254000275140ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A placement for a mark in a snapshot. * \author Julien Jorge */ #ifndef __ENGINE_MODEL_MARK_PLACEMENT_HPP__ #define __ENGINE_MODEL_MARK_PLACEMENT_HPP__ #include "universe/types.hpp" #include "engine/class_export.hpp" #include namespace bear { namespace engine { /** * \brief A placement for a mark in a snapshot. * \author Julien Jorge */ class ENGINE_EXPORT model_mark_placement { public: typedef claw::tween::single_tweener::easing_function easing_function; public: model_mark_placement(); model_mark_placement ( unsigned int id, universe::coordinate_type x, universe::coordinate_type y, universe::coordinate_type w, universe::coordinate_type h, int depth, double angle, bool visible, const std::string& collision_function ); void set_mark_id( unsigned int i ); unsigned int get_mark_id() const; void set_position ( universe::coordinate_type x, universe::coordinate_type y ); void set_position( const universe::position_type& pos ); const universe::position_type& get_position() const; void set_x_position( universe::coordinate_type x ); void set_y_position( universe::coordinate_type y ); void set_size( const universe::size_box_type& s ); const universe::size_box_type& get_size() const; void set_width( universe::size_type s ); void set_height( universe::size_type s ); void set_depth_position( int z ); int get_depth_position() const; void set_angle( double a ); double get_angle() const; void set_visibility( bool v ); bool is_visible() const; void set_collision_function( const std::string& f ); const std::string& get_collision_function() const; easing_function get_angle_easing() const; void set_angle_easing( easing_function f ); easing_function get_x_position_easing() const; void set_x_position_easing( easing_function f ); easing_function get_y_position_easing() const; void set_y_position_easing( easing_function f ); easing_function get_width_easing() const; void set_width_easing( easing_function f ); easing_function get_height_easing() const; void set_height_easing( easing_function f ); private: /** \brief The identifier or the mark concerned by this placement. */ unsigned int m_mark_id; /** \brief The position of the mark. */ universe::position_type m_position; /** \brief The size of the mark. */ universe::size_box_type m_size; /** \brief The depth-position of the mark. */ int m_depth; /** \brief The angle of the mark. */ double m_angle; /** \brief Tell if the mark is visible or not. */ bool m_visible; /** \brief The name of the function to call when there is a collision on the mark. */ std::string m_collision_function; /** \brief The easing function for the angle. */ easing_function m_angle_easing; /** \brief The easing function for the x-position. */ easing_function m_x_easing; /** \brief The easing function for the y-position. */ easing_function m_y_easing; /** \brief The easing function for the width. */ easing_function m_width_easing; /** \brief The easing function for the height. */ easing_function m_height_easing; }; // class model_mark_placement } // namespace engine } // namespace bear #endif // __ENGINE_MODEL_MARK_PLACEMENT_HPP__ plee-the-bear-20251226/bear-engine/core/src/engine/model/model_snapshot.hpp000066400000000000000000000100111512343254000263510ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A snapshot in an model_action of a model_actor. * \author Julien Jorge */ #ifndef __ENGINE_MODEL_SNAPSHOT_HPP__ #define __ENGINE_MODEL_SNAPSHOT_HPP__ #include "engine/model/model_mark_placement.hpp" #include "engine/class_export.hpp" #include #include namespace bear { namespace engine { /** * \brief A snapshot in an model_action of a model_actor. * \author Julien Jorge */ class ENGINE_EXPORT model_snapshot { public: typedef std::vector::const_iterator const_mark_placement_iterator; /** \brief How to align the action, horizontally, with the previous action. */ struct horizontal_alignment { enum value { align_left, align_right, align_center }; // enum value static value from_string( const std::string& str ); }; // horizontal_alignment /** \brief How to align the action, vertically, with the previous action. */ struct vertical_alignment { enum value { align_top, align_bottom, align_center }; // enum value static value from_string( const std::string& str ); }; // vertical_alignment public: model_snapshot ( universe::time_type d, std::size_t n, std::string func, std::vector sounds, bool glob ); universe::time_type get_date() const; void set_mark_placement( const model_mark_placement& m ); const model_mark_placement& get_mark_placement( std::size_t i ) const; std::size_t get_mark_placements_count() const; std::string get_function() const; std::string get_random_sound_name() const; bool sound_is_global() const; const_mark_placement_iterator mark_placement_begin() const; const_mark_placement_iterator mark_placement_end() const; void set_size( double width, double height ); double get_width() const; double get_height() const; void set_x_alignment(horizontal_alignment::value a); horizontal_alignment::value get_x_alignment() const; void set_x_alignment_value(universe::coordinate_type value); universe::coordinate_type get_x_alignment_value() const; void set_y_alignment(const vertical_alignment::value a); vertical_alignment::value get_y_alignment() const; void set_y_alignment_value(universe::coordinate_type value); universe::coordinate_type get_y_alignment_value() const; private: /** \brief The date of this snapshot in the action. */ const universe::time_type m_date; /** \brief The placement of the marks in this snapshot. */ std::vector m_placement; /** \brief The name of a function to call when passing on this snapshot. */ std::string m_function; /** * \brief The name of the sound to play when passing on this * snapshot. One of them will be randomly picked. */ std::vector m_sound_name; /** \brief Tell if the sound is played globally. */ bool m_sound_is_global; /** \brief The width of the snapshot. */ double m_width; /** \brief The height of the snaphot. */ double m_height; /** \brief The alignment on x-coordinate. */ horizontal_alignment::value m_x_alignment; /** \brief The alignment on x-coordinate. */ universe::coordinate_type m_x_alignment_value; /** \brief The alignment on y-coordinate. */ vertical_alignment::value m_y_alignment; /** \brief The alignment on y-coordinate. */ universe::coordinate_type m_y_alignment_value; }; // class model_snapshot } // namespace engine } // namespace bear #endif // __ENGINE_MODEL_SNAPSHOT_HPP__ plee-the-bear-20251226/bear-engine/core/src/engine/model/model_snapshot_tweener.hpp000066400000000000000000000045761512343254000301250ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A structure that manages all the values that can be interpolated in a * snapshot. * \author Julien Jorge */ #ifndef __ENGINE_MODEL_TWEENER_HPP__ #define __ENGINE_MODEL_TWEENER_HPP__ #include "universe/types.hpp" #include "engine/class_export.hpp" #include #include namespace bear { namespace engine { class model_action; class model_mark_placement; class model_snapshot; /** * \brief A structure that manages all the values that can be interpolated * in a snapshot. * \author Julien Jorge */ class ENGINE_EXPORT model_snapshot_tweener { public: typedef std::vector::const_iterator const_mark_placement_iterator; public: explicit model_snapshot_tweener( const model_snapshot& init ); model_snapshot_tweener ( const model_snapshot& init, const model_snapshot& end, const model_action& init_action, const model_action& end_action, universe::time_type d ); model_mark_placement& get_mark_placement( std::size_t i ); const model_mark_placement& get_mark_placement( std::size_t i ) const; const_mark_placement_iterator mark_placement_begin() const; const_mark_placement_iterator mark_placement_end() const; void update( universe::time_type elapsed_time ); private: model_mark_placement get_mark_in_local_coordinates ( const model_snapshot& init, const model_snapshot& end, std::size_t id ) const; void insert_tweener ( std::size_t id, const model_mark_placement& end, universe::time_type d ); // not implemented model_snapshot_tweener( const model_snapshot_tweener& that ); model_snapshot_tweener& operator=( const model_snapshot_tweener& that ); private: /** \brief The placement of the marks in this snapshot. */ std::vector m_placement; /** \brief The tweeners for the values of the mark placements. */ claw::tween::tweener_group m_tweeners; }; // class model_snapshot_tweener } // namespace engine } // namespace bear #endif // __ENGINE_MODEL_TWEENER_HPP__ plee-the-bear-20251226/bear-engine/core/src/engine/model_loader.hpp000066400000000000000000000044321512343254000246720ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief This class loads a model_actor. * \author Julien Jorge */ #ifndef __ENGINE_MODEL_LOADER_HPP__ #define __ENGINE_MODEL_LOADER_HPP__ #include "engine/compiled_file.hpp" #include "engine/model/model_animation.hpp" #include "engine/class_export.hpp" namespace bear { namespace engine { class level_globals; class model_action; class model_actor; class model_snapshot; /** * \brief This class loads a model_actor. * \author Julien Jorge */ class ENGINE_EXPORT model_loader { private: /** \brief The type of the map containing all the animations of the model. */ typedef std::vector anim_map_type; public: model_loader( std::istream& f, level_globals& glob ); model_actor* run(); private: bool model_version_greater_or_equal ( unsigned int major, unsigned int minor, unsigned int release ) const; void load_actions( model_actor& m, const anim_map_type& anim_map ); void load_action( model_actor& m, const anim_map_type& anim_map ); void load_sound( std::vector& sound_name, bool& glob ); void load_marks( model_action& a, const anim_map_type& anim_map ); void load_snapshots( model_action& a ); void load_snapshot( model_action& a ); void load_mark_placements( model_snapshot& s ); void load_mark_placement( model_snapshot& s ); void load_animations( anim_map_type& anim_map ); private: /** \brief The file from which we load the model. */ compiled_file m_file; /** \brief The level_globals in which we load the resources. */ level_globals& m_level_globals; /** \brief The major version number in the model file. */ unsigned int m_major_version; /** \brief The minor version number in the model file. */ unsigned int m_minor_version; /** \brief The release version number in the model file. */ unsigned int m_release_version; }; // class model_loader } // namespace engine } // namespace bear #endif // __ENGINE_MODEL_LOADER_HPP__ plee-the-bear-20251226/bear-engine/core/src/engine/network/000077500000000000000000000000001512343254000232215ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/core/src/engine/network/client_connection.hpp000066400000000000000000000034761512343254000274410ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief The client_connection class keep the informations of the client * connections to the servers. * \author Julien Jorge */ #ifndef __ENGINE_CLIENT_CONNECTION_HPP__ #define __ENGINE_CLIENT_CONNECTION_HPP__ #include "net/client.hpp" #include "engine/class_export.hpp" #include #include #include namespace bear { namespace engine { /** * \brief The client_connection class keep the informations of the client * connections to the servers. * \author Julien Jorge */ class ENGINE_EXPORT client_connection { private: /** \brief The type of the list containing the messages. */ typedef std::list message_list; public: client_connection( const std::string& host, unsigned int port ); const std::string& get_host() const; unsigned int get_port() const; net::client& get_client(); void clear_message_queue(); void set_messages( const message_list& m ); std::vector get_messages() const; private: /** \brief The host to which the client is connected. */ const std::string m_host; /** \brief The port through which the client is connected. */ const unsigned int m_port; /** \brief The client that does the connection to the server. */ net::client m_client; /** \brief The messages received by this client at the last synchronization. */ message_list m_message; }; // class client_connection } // namespace engine } // namespace bear #endif // __ENGINE_CLIENT_CONNECTION_HPP__ plee-the-bear-20251226/bear-engine/core/src/engine/network/client_future.hpp000066400000000000000000000041421512343254000266030ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief The client_future class manages the lists of the future messages that * will be applied to the clients. * \author Julien Jorge */ #ifndef __ENGINE_CLIENT_FUTURE_HPP__ #define __ENGINE_CLIENT_FUTURE_HPP__ #include "engine/network/client_observer.hpp" #include "engine/class_export.hpp" #include "net/client.hpp" #include "net/server.hpp" #include #include namespace bear { namespace engine { class client_connection; class sync; /** * \brief The client_future class manages the lists of the future messages * that will be applied to the clients. * \author Julien Jorge */ class ENGINE_EXPORT client_future { public: /** \brief The type of the collection in which the pending messages are kept. */ typedef std::list message_list; private: /** \brief The type of the collection in which the future message lists are stored. */ typedef std::list future; public: client_future(); explicit client_future( std::size_t h ); void push_message( net::message_handle m ); std::size_t get_horizon() const; const sync& get_sync_message( std::size_t i ) const; void set_prefered_horizon( std::size_t h ); message_list next(); private: /** \brief The message lists that will be returned by the next calls to next(). */ future m_future; /** \brief The list in construction. It will be added at the end of m_future when a sync message will be received. */ message_list m_pending; /** \brief The size of m_future up to which the message lists closed with a not active sync message are still stored. */ std::size_t m_prefered_horizon; }; // class client_future } // namespace engine } // namespace bear #endif // __ENGINE_CLIENT_FUTURE_HPP__ plee-the-bear-20251226/bear-engine/core/src/engine/network/client_observer.hpp000066400000000000000000000031361512343254000271220ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A client_observer is an object that dispatch the messages received by * a client. * \author Sebastien Angibaud */ #ifndef __NET_CLIENT_OBSERVER_HPP__ #define __NET_CLIENT_OBSERVER_HPP__ #include "engine/class_export.hpp" #include "net/message_listener/message_listener_group.hpp" #include #include #include namespace bear { namespace engine { class client_connection; /** * \brief A client_observer is an object that dispatch the messages * received by a client. * \author Sebastien Angibaud */ class ENGINE_EXPORT client_observer { private: /** \brief The type of the map in which the listeners are stored. */ typedef std::map listener_map; public: explicit client_observer( client_connection* c ); void process_message(); public: template void subscribe( boost::function f ); private: /** \brief The client of which we listen the messages. */ client_connection* m_client; /** \brief The map containing all messages to dispatch. */ listener_map m_listeners; }; // class client_observer } // namespace engine } // namespace bear #include "engine/network/impl/client_observer.tpp" #endif // __NET_CLIENT_OBSERVER_HPP__ plee-the-bear-20251226/bear-engine/core/src/engine/network/code/000077500000000000000000000000001512343254000241335ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/core/src/engine/network/code/client_connection.cpp000066400000000000000000000054131512343254000303370ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::engine::client_connection class. * \author Julien Jorge */ #include "engine/network/client_connection.hpp" #include "engine/network/message_factory.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param h The host to which the client is connected. * \param p The port through which the client is connected. */ bear::engine::client_connection::client_connection ( const std::string& host, unsigned int port ) : m_host(host), m_port(port), m_client(host, port, message_factory::get_instance()) { } // client_connection::client_connection() /*----------------------------------------------------------------------------*/ /** * \brief Get the host to which the client is connected. */ const std::string& bear::engine::client_connection::get_host() const { return m_host; } // client_connection::get_host() /*----------------------------------------------------------------------------*/ /** * \brief Get the port through which the client is connected. */ unsigned int bear::engine::client_connection::get_port() const { return m_port; } // client_connection::get_port() /*----------------------------------------------------------------------------*/ /** * \brief Get the client connected to the server. */ bear::net::client& bear::engine::client_connection::get_client() { return m_client; } // client_connection::get_client() /*----------------------------------------------------------------------------*/ /** * \brief Clear the list of messages received by this client. */ void bear::engine::client_connection::clear_message_queue() { m_message.clear(); } // client_connection::clear_message_queue() /*----------------------------------------------------------------------------*/ /** * \brief Set the messages to be processed by this client. * \param m The messages. */ void bear::engine::client_connection::set_messages( const message_list& m ) { m_message = m; } // client_connection::push_message() /*----------------------------------------------------------------------------*/ /** * \brief Get the messages received by this client. */ std::vector bear::engine::client_connection::get_messages() const { std::vector result; result.reserve(m_message.size()); for ( message_list::const_iterator it=m_message.begin(); it!=m_message.end(); ++it ) { net::message_handle m = *it; net::message* p = &*m; result.push_back(p); } return result; } // client_connection::get_messages() plee-the-bear-20251226/bear-engine/core/src/engine/network/code/client_future.cpp000066400000000000000000000061721512343254000275150ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::engine::client_future class. * \author Julien Jorge */ #include "engine/network/client_future.hpp" #include "engine/network/message/sync.hpp" #include /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ bear::engine::client_future::client_future() : m_prefered_horizon( std::numeric_limits::max() ) { } // client_future::client_future() /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param h The size of the horizon up to which the message lists closed with * a not active sync message are still stored. */ bear::engine::client_future::client_future( std::size_t h ) : m_prefered_horizon(h) { } // client_future::client_future() /*----------------------------------------------------------------------------*/ /** * \brief Add a message in the future of the client. * \param m The message to add. */ void bear::engine::client_future::push_message( net::message_handle m ) { m_pending.push_back(m); sync* s = dynamic_cast(&*m); if ( s != NULL ) { if ( s->is_active_sync() || (m_future.size() < m_prefered_horizon) ) m_future.push_back( m_pending ); m_pending.clear(); } } // client_future::push_message() /*----------------------------------------------------------------------------*/ /** * \brief Get the number of message lists ready to be processed. */ std::size_t bear::engine::client_future::get_horizon() const { return m_future.size(); } // client_future::get_horizon() /*----------------------------------------------------------------------------*/ /** * \brief Set the size of the horizon up to which the message lists closed with * a not active sync message are still stored. * \param h The prefered horizon. */ void bear::engine::client_future::set_prefered_horizon( std::size_t h ) { m_prefered_horizon = h; } // client_future::set_prefered_horizon() /*----------------------------------------------------------------------------*/ /** * \brief Get the sync message that closes a given message list. * \param i The index of the message list for which we want the message. */ const bear::engine::sync& bear::engine::client_future::get_sync_message( std::size_t i ) const { future::const_iterator it = m_future.begin(); std::advance(it, i); net::message_handle m = it->back(); return *static_cast(&*m); } // client_future::get_sync_message() /*----------------------------------------------------------------------------*/ /** * \brief Get the next message list to process and remove it from the future. */ bear::engine::client_future::message_list bear::engine::client_future::next() { CLAW_PRECOND( get_horizon() != 0 ); message_list result; result.swap( m_future.front() ); m_future.pop_front(); return result; } // client_future::next() plee-the-bear-20251226/bear-engine/core/src/engine/network/code/client_observer.cpp000066400000000000000000000025341512343254000300300ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::engine::client_observer class. * \author Sebastien Angibaud */ #include "engine/network/client_observer.hpp" #include "engine/network/client_connection.hpp" #include "net/message/message.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Contructor. * \param c The client of which we listen the messages. */ bear::engine::client_observer::client_observer( client_connection* c ) : m_client(c) { } // client_observer::client_observer() /*----------------------------------------------------------------------------*/ /** * \brief Read the messages and dispatch them to the listeners. */ void bear::engine::client_observer::process_message() { if ( m_client == NULL ) return; std::vector messages = m_client->get_messages(); for ( unsigned int i = 0; i != messages.size(); ++i ) { const listener_map::const_iterator listener = m_listeners.find(messages[i]->get_name()); if ( listener != m_listeners.end() ) listener->second.process_message(*(messages[i])); } } // client_observer::process_message() plee-the-bear-20251226/bear-engine/core/src/engine/network/code/message_factory.cpp000066400000000000000000000016341512343254000300160ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::engine::message_factory class. * \author Julien Jorge */ #include "engine/network/message_factory.hpp" /*----------------------------------------------------------------------------*/ bear::engine::message_factory::factory_type* bear::engine::message_factory::s_factory_instance(NULL); /*----------------------------------------------------------------------------*/ /** * \brief Get the single instance of the factory. */ bear::engine::message_factory::factory_type& bear::engine::message_factory::get_instance() { if ( s_factory_instance == NULL ) s_factory_instance = new factory_type; return *s_factory_instance; } // message_factory::get_instance() plee-the-bear-20251226/bear-engine/core/src/engine/network/impl/000077500000000000000000000000001512343254000241625ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/core/src/engine/network/impl/client_observer.tpp000066400000000000000000000017151512343254000301000ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::engine::client_observer class. * \author Sebastien Angibaud */ #include "engine/network/client_observer.hpp" #include "net/message_listener/typed_message_listener.hpp" #include "net/message_listener/message_listener.hpp" /*----------------------------------------------------------------------------*/ /** * \brief The client want to subscribe for a given message type. * \param f The fonction called for each received messages. */ template void bear::engine::client_observer::subscribe ( boost::function f ) { m_listeners[MessageType::static_get_name()].add ( net::message_listener(net::typed_message_listener(f)) ); } // client_observer::() plee-the-bear-20251226/bear-engine/core/src/engine/network/message/000077500000000000000000000000001512343254000246455ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/core/src/engine/network/message/code/000077500000000000000000000000001512343254000255575ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/core/src/engine/network/message/code/sync.cpp000066400000000000000000000042051512343254000272400ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::engine::sync class. * \author Julien Jorge */ #include "engine/network/message/sync.hpp" #include MESSAGE_EXPORT( sync, bear::engine ) /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ bear::engine::sync::sync() { } // sync::sync() /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param id An identifier associated with the message. * \param active_sync Tell if this synchronization is the result of an active * iteration. */ bear::engine::sync::sync( std::size_t id, bool active_sync ) : m_id(id), m_active_sync(active_sync) { } // sync::sync() /*----------------------------------------------------------------------------*/ /** * \brief Get the identifier associated with the synchronization. */ std::size_t bear::engine::sync::get_id() const { return m_id; } // sync::get_id() /*----------------------------------------------------------------------------*/ /** * \brief Tell if this synchronization is the result of an active * iteration. */ bool bear::engine::sync::is_active_sync() const { return m_active_sync; } // sync::is_active_sync() /*----------------------------------------------------------------------------*/ /** * \brief Write a formatted representation of this message in a stream. * \param os The stream in which we write. */ std::ostream& bear::engine::sync::formatted_output( std::ostream& os ) const { return os << m_id << ' ' << m_active_sync; } // sync::formatted_output() /*----------------------------------------------------------------------------*/ /** * \brief Read a formatted representation of this message from a stream. * \param os The stream from which we read. */ std::istream& bear::engine::sync::formatted_input( std::istream& is ) { return is >> m_id >> m_active_sync; } // sync::formatted_input() plee-the-bear-20251226/bear-engine/core/src/engine/network/message/message_export.hpp000066400000000000000000000120211512343254000303770ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Macros and function useful for class exportation. * \author Julien Jorge */ #ifndef __ENGINE_MESSAGE_EXPORT_HPP__ #define __ENGINE_MESSAGE_EXPORT_HPP__ #include "engine/network/message_factory.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Prepare a class inheriting from net::message. * * \param message_name The name of the message. * * Add this macro at the beginning of your class, like: * * namespace my_game * { * class my_class: public bear::net::message * { * DECLARE_MESSAGE( my_class ); * * // some stuff... * * }; // class my_class * } // namespace my_game * * This macro adds the methods and members to get the class name of your class: * - static const std::string& static_get_name(); * - static const std::string s_my_class_message_name; * * Also, this macro redefines the virtual method * - std::string do_get_name() const; * of bear::net::message. */ #define DECLARE_MESSAGE( message_name ) \ private: \ std::string do_get_name() const { return static_get_name(); } \ \ public: \ static const std::string& static_get_name() \ { \ return s_ ## message_name ## _message_name; \ } \ \ private: \ static const std::string s_ ## message_name ## _message_name /*----------------------------------------------------------------------------*/ /** * \brief Implement common members of a class inheriting from net::message. * * \param message_name The name of the class to instanciate. * \param env The full namespace of this class. * * Call this macro in the .cpp file, only if you don't call * MESSAGE_EXPORT. */ #define MESSAGE_IMPLEMENT( message_name, env ) \ const std::string env::message_name::s_ ## message_name ## _message_name = \ #env "::" #message_name; /*----------------------------------------------------------------------------*/ /** * \brief Implement common members of a class inheriting from net::message * and declared outside any namespace. * * \param message_name The name of the class to instanciate. * * Call this macro in the .cpp file, only if you don't call * MESSAGE_EXPORT_NO_NAMESPACE. * * \sa MESSAGE_IMPLEMENT */ #define MESSAGE_IMPLEMENT_NO_NAMESPACE( message_name ) \ const std::string message_name::s_ ## message_name ## _message_name = \ #message_name; /*----------------------------------------------------------------------------*/ /** * \brief Register a message derived class in bear::engine::message_factory. * * \param message_name The name of the class to instanciate. * \param env The full namespace of this class. * * The env::message_name class must have a constructor without parameters. */ #define MESSAGE_EXPORT( message_name, env ) \ MESSAGE_IMPLEMENT( message_name, env ) \ \ static bool message_name ## _registered = \ bear::engine::message_factory::get_instance() \ .register_type \ ( env::message_name::static_get_name() ); /*----------------------------------------------------------------------------*/ /** * \brief Export a function instanciating a class inheriting from * net::message and declared outside any namespace. * * \param message_name The name of the class to instanciate. * * The message_name class must have a constructor without parameters. * * The signature of the function declared by this macro is * * net::message* create_message_name() * * The name of the function can be obtained by a call to * net::export_function_name( message_name ). */ #define MESSAGE_EXPORT_NO_NAMESPACE( message_name ) \ MESSAGE_IMPLEMENT_NO_NAMESPACE( message_name ) \ \ static bool message_name ## _registered = \ bear::engine::message_factory::get_instance().register_type \ ( #message_name ); #endif // __ENGINE_MESSAGE_EXPORT_HPP__ plee-the-bear-20251226/bear-engine/core/src/engine/network/message/sync.hpp000066400000000000000000000030511512343254000263310ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief The sync message is used to synchronize the clients and the servers. * \author Julien Jorge */ #ifndef __ENGINE_SYNC_HPP__ #define __ENGINE_SYNC_HPP__ #include "net/message/message.hpp" #include "engine/network/message/message_export.hpp" #include "engine/class_export.hpp" namespace bear { namespace engine { /** * \brief The sync message is used to synchronize the clients and the * servers. * * A server would send a sync message to its clients to tell them to prepare * for a new wave of messages. * * \author Julien Jorge */ class ENGINE_EXPORT sync: public net::message { DECLARE_MESSAGE(sync); public: sync(); sync( std::size_t id, bool active_sync ); std::size_t get_id() const; bool is_active_sync() const; private: virtual std::ostream& formatted_output( std::ostream& os ) const; virtual std::istream& formatted_input( std::istream& is ); private: /** \brief An identifier associated with the sync message to not confuse with an other one. */ std::size_t m_id; /** \brief Tell if this synchronization is the result of an active iteration. */ bool m_active_sync; }; // class sync } // namespace engine } // namespace bear #endif // __ENGINE_SYNC_HPP__ plee-the-bear-20251226/bear-engine/core/src/engine/network/message_factory.hpp000066400000000000000000000020601512343254000271030ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A factory to instanciate classes inheriting from base_message. * \author Julien Jorge */ #ifndef __ENGINE_MESSAGE_FACTORY_HPP__ #define __ENGINE_MESSAGE_FACTORY_HPP__ #include "engine/class_export.hpp" #include "net/message_factory.hpp" namespace bear { namespace engine { /** * \brief A factory to instanciate classes inheriting from net::message. * \author Julien Jorge */ class ENGINE_EXPORT message_factory { public: /** \brief The type of the factory. */ typedef net::message_factory factory_type; public: static factory_type& get_instance(); private: /** \brief A factory that creates messages. */ static factory_type* s_factory_instance; }; // class message_factory } // namespace engine } // namespace bear #endif // __ENGINE_MESSAGE_FACTORY_HPP__ plee-the-bear-20251226/bear-engine/core/src/engine/population.hpp000066400000000000000000000036531512343254000244420ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief All the items of a level. * \author Julien Jorge */ #ifndef __ENGINE_POPULATION_HPP__ #define __ENGINE_POPULATION_HPP__ #include #include #include #include #include "engine/base_item.hpp" #include "engine/class_export.hpp" namespace bear { namespace engine { /** * \brief All the items of a level. * \author Julien Jorge */ class ENGINE_EXPORT population { private: /** brief The type of the map containing the items. */ typedef std::map item_map; public: /** \brief Iterator on the living items. */ typedef claw::wrapped_iterator < base_item, item_map::const_iterator, claw::unary_compose < claw::dereference, claw::const_pair_second > > ::iterator_type const_iterator; public: ~population(); void insert( base_item* item ); void kill( const base_item* item ); void drop( const base_item* item ); bool exists( base_item::id_type id ) const; void remove_dead_items(); void clear(); const_iterator begin() const; const_iterator end() const; private: /** \brief All items currently in the game. */ item_map m_items; /** \brief The items that will be deleted by calling remove_dead_items(). */ std::set m_dead_items; /** \brief The items that will be removed by calling remove_dead_items(). */ std::set m_dropped_items; }; // class population } // namespace engine } // namespace bear #endif // __ENGINE_POPULATION_HPP__ plee-the-bear-20251226/bear-engine/core/src/engine/reference_point/000077500000000000000000000000001512343254000246775ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/core/src/engine/reference_point/impl/000077500000000000000000000000001512343254000256405ustar00rootroot00000000000000model_mark_reference_point.tpp000066400000000000000000000051611512343254000336520ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/core/src/engine/reference_point/impl/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the model_mark_reference_point class. * \author Sébastien Angibaud */ #include "engine/reference_point/model_mark_reference_point.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param item The item of which the attack point is returned. */ template bear::engine::model_mark_reference_point::model_mark_reference_point ( bear::universe::physical_item& item, const std::string& mark_name ) : m_item(item), m_mark_name(mark_name) { } // model_mark_reference_point::model_mark_reference_point() /*----------------------------------------------------------------------------*/ /** * \brief Duplicate this instance. */ template bear::universe::base_reference_point* bear::engine::model_mark_reference_point::clone() const { return new model_mark_reference_point(*this); } // model_mark_reference_point::clone() /*----------------------------------------------------------------------------*/ /** * \brief Tell if this reference is usable. */ template bool bear::engine::model_mark_reference_point::is_valid() const { if ( has_item() ) { bear::engine::model_mark_placement m; return m_item->get_mark_placement(m_mark_name, m); } else return false; } // model_mark_reference_point::is_valid() /*----------------------------------------------------------------------------*/ /** * \brief Get the center of mass of the item. */ template bear::universe::position_type bear::engine::model_mark_reference_point::get_point() const { CLAW_PRECOND( has_item() ); return m_item->get_mark_world_position(m_mark_name); } // model_mark_reference_point::get_point() /*----------------------------------------------------------------------------*/ /** * \brief Tell if the item is still valid. */ template bool bear::engine::model_mark_reference_point::has_item() const { return m_item != (Base*)NULL; } // model_mark_reference_point::has_item() /*----------------------------------------------------------------------------*/ /** * \brief Get the item of which the center of mass is returned. */ template bear::universe::physical_item& bear::engine::model_mark_reference_point::get_item() const { CLAW_PRECOND( has_item() ); return *m_item.get_item(); } // model_mark_reference_point::get_item() plee-the-bear-20251226/bear-engine/core/src/engine/reference_point/model_mark_reference_point.hpp000066400000000000000000000037061512343254000327570ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Instances of model_mark_reference_point compute the reference point * of in forced movements as the mark position of an item. * \author Sébastien Angibaud */ #ifndef __ENGINE_MODEL_MARK_REFERENCE_POINT_HPP__ #define __ENGINE_MODEL_MARK_REFERENCE_POINT_HPP__ #include "engine/model.hpp" #include "universe/forced_movement/base_reference_point.hpp" #include "universe/derived_item_handle.hpp" namespace bear { namespace engine { /** * \brief Instances of model_mark_reference_point compute the reference * point of in forced movements as the mark position of an item. * * \author Sébastien Angibaud */ template class model_mark_reference_point: public bear::universe::base_reference_point { private: /** The type of the handle on the item. */ typedef bear::universe::derived_item_handle item_handle_type; public: explicit model_mark_reference_point ( bear::universe::physical_item& item, const std::string& mark_name ); virtual bear::universe::base_reference_point* clone() const; virtual bool is_valid() const; virtual bear::universe::position_type get_point() const; virtual bool has_item() const; virtual bear::universe::physical_item& get_item() const; private: /** \brief The item on which we take the mark position. */ item_handle_type m_item; /** \brief The item on which we take the mark position. */ std::string m_mark_name; }; // class model_mark_reference_point } // namespace engine } // namespace bear #include "engine/reference_point/impl/model_mark_reference_point.tpp" #endif // __ENGINE_MODEL_MARK_REFERENCE_POINT_HPP__ plee-the-bear-20251226/bear-engine/core/src/engine/resource_pool.hpp000066400000000000000000000031441512343254000251230ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief The resource pool allows to access resource files regardless if they * are in a resource archive or in a folder. * \author Julien Jorge */ #ifndef __ENGINE_RESOURCE_POOL_HPP__ #define __ENGINE_RESOURCE_POOL_HPP__ #include #include #include #include #include "engine/class_export.hpp" namespace bear { namespace engine { class base_resource_pool; /** * \brief The resource pool stores the resource files. * \author Julien Jorge */ class ENGINE_EXPORT resource_pool : public claw::pattern::basic_singleton { private: /** \brief The type of the parent class. */ typedef claw::pattern::basic_singleton super; public: // Must be redefined to work correctly with dynamic libraries. // At least under Windows with MinGW. static resource_pool& get_instance(); ~resource_pool(); void add_path( const std::string& path ); void add_pool( base_resource_pool* pool ); void get_file( const std::string& name, std::ostream& os ); bool exists( const std::string& name ) const; private: /** \brief Pools in which the files are searched. */ std::vector m_pool; }; // class resource_pool } // namespace engine } // namespace bear #endif // __ENGINE_RESOURCE_POOL_HPP__ plee-the-bear-20251226/bear-engine/core/src/engine/resource_pool/000077500000000000000000000000001512343254000244105ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/core/src/engine/resource_pool/android_resource_pool.hpp000066400000000000000000000023121512343254000314770ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief This implementation of resource pool allows to access resource files * from a android on disk. * \author Julien Jorge */ #ifdef __ANDROID__ #ifndef __ENGINE_ANDROID_RESOURCE_POOL_HPP__ #define __ENGINE_ANDROID_RESOURCE_POOL_HPP__ #include "engine/resource_pool/base_resource_pool.hpp" #include #include #include namespace bear { namespace engine { /** * \brief This implementation of resource pool allows to access resource * files from a android on disk. * \author Julien Jorge */ class android_resource_pool: public base_resource_pool { public: void get_file( const std::string& name, std::ostream& os ); bool exists( const std::string& name ) const; private: AAssetManager* get_asset_manager() const; }; // class android_resource_pool } // namespace engine } // namespace bear #endif // __ENGINE_ANDROID_RESOURCE_POOL_HPP__ #endif // __ANDROID__ plee-the-bear-20251226/bear-engine/core/src/engine/resource_pool/base_resource_pool.hpp000066400000000000000000000017071512343254000310000ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief The base interface for the resource pools. * \author Julien Jorge */ #ifndef __ENGINE_BASE_RESOURCE_POOL_HPP__ #define __ENGINE_BASE_RESOURCE_POOL_HPP__ #include #include #include "engine/class_export.hpp" namespace bear { namespace engine { /** * \brief The base interface for the resource pools. * \author Julien Jorge */ class ENGINE_EXPORT base_resource_pool { public: virtual ~base_resource_pool() {} virtual void get_file( const std::string& name, std::ostream& os ) = 0; virtual bool exists( const std::string& name ) const = 0; }; // class base_resource_pool } // namespace engine } // namespace bear #endif // __ENGINE_BASE_RESOURCE_POOL_HPP__ plee-the-bear-20251226/bear-engine/core/src/engine/resource_pool/code/000077500000000000000000000000001512343254000253225ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/core/src/engine/resource_pool/code/android_resource_pool.cpp000066400000000000000000000033241512343254000324100ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::engine::android_resource_pool class. * \author Julien Jorge */ #ifdef __ANDROID__ #include "engine/resource_pool/android_resource_pool.hpp" #include #include #include #include /*----------------------------------------------------------------------------*/ /** * \brief Gets a file. * \param name The path of the file to get. * \param os Where we must write the content of the file. */ void bear::engine::android_resource_pool::get_file ( const std::string& name, std::ostream& os ) { SDL_RWops* rw = SDL_RWFromFile( name.c_str(), "rb" ); if ( rw == NULL ) throw claw::exception( "Can't find file '" + name + "'" ); const std::size_t buffer_size(4096); char buffer[buffer_size]; int count = SDL_RWread( rw, buffer, sizeof(char), buffer_size ); while ( count > 0 ) { os.write( buffer, count ); count = SDL_RWread( rw, buffer, sizeof(char), buffer_size ); } SDL_RWclose( rw ); } // android_resource_pool::get_file() /*----------------------------------------------------------------------------*/ /** * \brief Checks if we know a file with a given name. * \param name The name of the file to find. */ bool bear::engine::android_resource_pool::exists( const std::string& name ) const { SDL_RWops* rw = SDL_RWFromFile( name.c_str(), "rb" ); if ( rw == NULL ) return false; SDL_RWclose(rw); return true; } // android_resource_pool::exists() #endif // __ANDROID__ plee-the-bear-20251226/bear-engine/core/src/engine/resource_pool/code/directory_resource_pool.cpp000066400000000000000000000060451512343254000327770ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::engine::directory_resource_pool class. * \author Julien Jorge */ #include "engine/resource_pool/directory_resource_pool.hpp" #include #include #include /*----------------------------------------------------------------------------*/ /** * \brief Constructs the instance to search in a given director. * \param path The path where the resources are searched. */ bear::engine::directory_resource_pool::directory_resource_pool ( const std::string& path ) : m_path( path ) { } // directory_resource_pool::directory_resource_pool() /*----------------------------------------------------------------------------*/ /** * \brief Gets a file. * \param name The path of the file to get. * \param os Where we must write the content of the file. */ void bear::engine::directory_resource_pool::get_file ( const std::string& name, std::ostream& os ) { std::ifstream f; if ( find_file(name, f) ) { f >> os.rdbuf(); f.close(); } else throw claw::exception( "Can't find file '" + name + "'" ); } // directory_resource_pool::get_file() /*----------------------------------------------------------------------------*/ /** * \brief Checks if we know a file with a given name. * \param name The name of the file to find. */ bool bear::engine::directory_resource_pool::exists( const std::string& name ) const { bool result = false; std::ifstream f; if ( find_file(name, f) ) { f.close(); result = true; } return result; } // directory_resource_pool::exists() /*----------------------------------------------------------------------------*/ /** * \brief Finds a file in the path. * \param name The name of the file to find. * \param f We will open the file with this variable. * \return True if we found the file (f is opened); false otherwise. */ bool bear::engine::directory_resource_pool::find_file ( const std::string& name, std::ifstream& f ) const { std::string n(name); if ( find_file_name_straight(n) ) { f.open( n.c_str(), std::ios::binary ); return true; } else return false; } // directory_resource_pool::find_file() /*----------------------------------------------------------------------------*/ /** * \brief Find a file in the paths. * \param name The name of the file to find. * \return True if we found the file; false otherwise. */ bool bear::engine::directory_resource_pool::find_file_name_straight ( std::string& name ) const { bool result(false); const boost::filesystem::path path( boost::filesystem::path(m_path) / name ); if ( boost::filesystem::exists( path ) ) if ( !boost::filesystem::is_directory( path ) ) { result = true; name = path.string(); } return result; } // directory_resource_pool::find_file_name_straight() plee-the-bear-20251226/bear-engine/core/src/engine/resource_pool/directory_resource_pool.hpp000066400000000000000000000027011512343254000320650ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief This implementation of resource pool allows to access resource files * from a directory on disk. * \author Julien Jorge */ #ifndef __ENGINE_DIRECTORY_RESOURCE_POOL_HPP__ #define __ENGINE_DIRECTORY_RESOURCE_POOL_HPP__ #include #include #include "engine/resource_pool/base_resource_pool.hpp" #include "engine/class_export.hpp" namespace bear { namespace engine { /** * \brief This implementation of resource pool allows to access resource * files from a directory on disk. * \author Julien Jorge */ class ENGINE_EXPORT directory_resource_pool: public base_resource_pool { public: directory_resource_pool( const std::string& path ); void get_file( const std::string& name, std::ostream& os ); bool exists( const std::string& name ) const; private: bool find_file( const std::string& name, std::ifstream& f ) const; bool find_file_name_straight( std::string& name ) const; private: /** \brief The path of the directory where the resources are searched. */ std::string m_path; }; // class directory_resource_pool } // namespace engine } // namespace bear #endif // __ENGINE_DIRECTORY_RESOURCE_POOL_HPP__ plee-the-bear-20251226/bear-engine/core/src/engine/scene_visual.hpp000066400000000000000000000036151512343254000247260ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A class that stores a graphic representation of an object and its * position in the world. This class is used to store the visible items * in the rendering step. * \author Julien Jorge */ #ifndef __ENGINE_SCENE_VISUAL_HPP__ #define __ENGINE_SCENE_VISUAL_HPP__ #include "visual/scene_element.hpp" #include "visual/sprite.hpp" #include "universe/types.hpp" #include "engine/class_export.hpp" namespace bear { namespace engine { /** * \brief A class that stores a graphic representation of an object and its * position in the world. This class is used to store the visible * items in the rendering step. * \author Julien Jorge */ class ENGINE_EXPORT scene_visual { public: /** \brief Compare two scene_visual instances on their z_position. */ struct ENGINE_EXPORT z_position_compare { bool operator()( const scene_visual& s1, const scene_visual& s2 ) const; }; // struct z_position_compare public: scene_visual( universe::coordinate_type x, universe::coordinate_type y, const visual::sprite& spr, int z = 0 ); scene_visual( const universe::position_type& pos, const visual::sprite& spr, int z = 0 ); scene_visual( const visual::scene_element& e, int z = 0 ); scene_visual( const visual::base_scene_element& e, int z = 0 ); public: /** \brief The visual to display. */ visual::scene_element scene_element; /** \brief Position of the visual in the rendering procedure. */ int z_position; }; // class scene_visual } // namespace engine } // namespace bear #endif // __ENGINE_SCENE_VISUAL_HPP__ plee-the-bear-20251226/bear-engine/core/src/engine/script/000077500000000000000000000000001512343254000230345ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/core/src/engine/script/call_sequence.hpp000066400000000000000000000035771512343254000263640ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief The sequence of the methods called in a script. * \author Julien Jorge */ #ifndef __ENGINE_CALL_SEQUENCE_HPP__ #define __ENGINE_CALL_SEQUENCE_HPP__ #include "engine/class_export.hpp" #include "engine/script/method_call.hpp" #include "universe/types.hpp" namespace bear { namespace engine { /** * \brief The sequence of the methods called in a script. * \author Julien Jorge */ class ENGINE_EXPORT call_sequence { public: /** \brief Informations on a call in the sequence. */ struct call_info { public: /** \brief Compare two calls according to their dates, in increasing order. */ struct compare_by_date { bool operator()( const call_info& a, const call_info& b ) const; }; // struct compare_by_date public: call_info( universe::time_type d, const method_call& c ); /** \brief The date at which the call must be done. */ universe::time_type date; /** \brief The call to do. */ method_call call; }; // struct call_info /** \brief const iterator on the calls. */ typedef std::vector::const_iterator const_iterator; public: void add_call( universe::time_type date, const method_call& c ); const_iterator begin() const; const_iterator end() const; bool empty() const; std::size_t size() const; universe::time_type get_last_date() const; private: /** \brief The calls to the methods. */ std::vector m_sequence; }; // class call_sequence } // namespace engine } // namespace bear #endif // __ENGINE_CALL_SEQUENCE_HPP__ plee-the-bear-20251226/bear-engine/core/src/engine/script/code/000077500000000000000000000000001512343254000237465ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/core/src/engine/script/code/call_sequence.cpp000066400000000000000000000072171512343254000272640ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::engine::call_sequence class. * \author Julien Jorge */ #include "engine/script/call_sequence.hpp" #include "engine/script/method_call.hpp" #include #include /*----------------------------------------------------------------------------*/ /** * \brief Compare two calls according to their dates, in increasing order. * \param a The left operand. * \param b The right operand. * \return a.date < b.date */ bool bear::engine::call_sequence::call_info::compare_by_date::operator() ( const call_info& a, const call_info& b ) const { return a.date < b.date; } // call_sequence::call_info::compare_by_date() /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param d The date at which the method has to be called. * \param c The data of the call. */ bear::engine::call_sequence::call_info::call_info ( universe::time_type d, const method_call& c ) : date(d), call(c) { } // call_sequence::call_info::call_info() /*----------------------------------------------------------------------------*/ /** * \brief Add a call to a method in the sequence. * \param date The date at which the method has to be called. * \param c The data of the call. */ void bear::engine::call_sequence::add_call ( universe::time_type date, const method_call& c ) { if ( m_sequence.empty() ) m_sequence.push_back( call_info(date, c) ); else { if ( m_sequence.back().date <= date ) m_sequence.push_back( call_info(date, c) ); else { claw::logger << claw::log_warning << "The script is not ordered. You should consider to " << "order the calls by increasing order of date." << std::endl; m_sequence.push_back( call_info(date, c) ); std::push_heap ( m_sequence.begin(), m_sequence.end(), call_info::compare_by_date() ); } } } // call_sequence::add_call() /*----------------------------------------------------------------------------*/ /** * \brief Get an iterator on the first call. */ bear::engine::call_sequence::const_iterator bear::engine::call_sequence::begin() const { return m_sequence.begin(); } // call_sequence::begin() /*----------------------------------------------------------------------------*/ /** * \brief Get an iterator just past the last call. */ bear::engine::call_sequence::const_iterator bear::engine::call_sequence::end() const { return m_sequence.end(); } // call_sequence::end() /*----------------------------------------------------------------------------*/ /** * \brief Tell if the sequence is empty. */ bool bear::engine::call_sequence::empty() const { return m_sequence.empty(); } // call_sequence::empty() /*----------------------------------------------------------------------------*/ /** * \brief Tell how many calls are in this sequence. */ std::size_t bear::engine::call_sequence::size() const { return m_sequence.size(); } // call_sequence::size() /*----------------------------------------------------------------------------*/ /** * \brief Get the date of the last entry. * \return The date of the last entry or zero if the sequence is empty. */ bear::universe::time_type bear::engine::call_sequence::get_last_date() const { if ( m_sequence.empty() ) return 0; else return m_sequence.back().date; } // call_sequence::last_date() plee-the-bear-20251226/bear-engine/core/src/engine/script/code/method_call.cpp000066400000000000000000000041521512343254000267270ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::engine::method_call class. * \author Julien Jorge */ #include "engine/script/method_call.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Set the name of the actor on which the method is called. * \param name The name. */ void bear::engine::method_call::set_actor_name( const std::string& name ) { m_actor_name = name; } // method_call::set_actor_name() /*----------------------------------------------------------------------------*/ /** * \brief Get the name of the actor on which the method is called. */ const std::string& bear::engine::method_call::get_actor_name() const { return m_actor_name; } // method_call::get_actor_name() /*----------------------------------------------------------------------------*/ /** * \brief Set the name of the method to call. * \param name The name. */ void bear::engine::method_call::set_method_name( const std::string& name ) { m_method_name = name; } // method_call::set_method_name() /*----------------------------------------------------------------------------*/ /** * \brief Get the name of the method to call. */ const std::string& bear::engine::method_call::get_method_name() const { return m_method_name; } // method_call::get_method_name() /*----------------------------------------------------------------------------*/ /** * \brief Set the argument values passed to the called method. * \param val The values of the arguments. */ void bear::engine::method_call::set_arguments ( const std::vector& val ) { m_arguments = val; } // method_call::set_arguments() /*----------------------------------------------------------------------------*/ /** * \brief Get the values passed as arguments to the called method. */ const std::vector& bear::engine::method_call::get_arguments() const { return m_arguments; } // method_call::get_arguments() plee-the-bear-20251226/bear-engine/core/src/engine/script/code/script_context.cpp000066400000000000000000000135051512343254000275260ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::engine::script_context class. * \author Julien Jorge */ #include "engine/script/script_context.hpp" #include "engine/base_item.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Set an actor of the script that inherits of base_item. * \param name The name of the actor. * \param item The actor. * \pre \a item inherit from bear::engine::with_text_interface */ void bear::engine::script_context::set_actor_item ( const std::string& name, base_item* item ) { handle_type h(item); CLAW_PRECOND(h != (text_interface::base_exportable*)NULL); m_actor_item[name] = h; } // script_context::set_actor_item() /*----------------------------------------------------------------------------*/ /** * \brief Get an actor from the script, that inherits of base_item. * \param name The name of the actor. * \return NULL if there is no actor with this name. */ bear::engine::base_item* bear::engine::script_context::get_actor_item( const std::string& name ) const { const actor_item_map_type::const_iterator it(m_actor_item.find(name)); if (it == m_actor_item.end()) return NULL; else return it->second.get_item(); } // script_context::get_actor_item() /*----------------------------------------------------------------------------*/ /** * \brief Set an actor of the script. * \param name The name of the actor. * \param item The actor. * \pre \a item inherit from text_interface::base_exportable */ void bear::engine::script_context::set_actor ( const std::string& name, text_interface::base_exportable* item ) { m_actor[name] = item; } // script_context::set_actor() /*----------------------------------------------------------------------------*/ /** * \brief Get an actor from the script. * \param name The name of the actor. * \return NULL if there is no actor with this name. */ bear::text_interface::base_exportable* bear::engine::script_context::get_actor( const std::string& name ) const { const actor_map_type::const_iterator it(m_actor.find(name)); if (it == m_actor.end()) { const actor_item_map_type::const_iterator it2(m_actor_item.find(name)); if (it2 == m_actor_item.end()) return NULL; else return it2->second.get(); } else return it->second; } // script_context::get_actor() /*----------------------------------------------------------------------------*/ /** * \brief Get the iterator on the beginning of the actor map. */ bear::engine::script_context::actor_item_map_iterator_type bear::engine::script_context::get_actors_item_begin() { return m_actor_item.begin(); } // script_context::get_actors_item_begin() /*----------------------------------------------------------------------------*/ /** * \brief Get the iterator on the end of the actor map. */ bear::engine::script_context::actor_item_map_iterator_type bear::engine::script_context::get_actors_item_end() { return m_actor_item.end(); } // script_context::get_actors_item_end() /*----------------------------------------------------------------------------*/ /** * \brief Get the iterator on the beginning of the actor map. */ bear::engine::script_context::actor_map_iterator_type bear::engine::script_context::get_actors_begin() { return m_actor.begin(); } // script_context::get_actors_begin() /*----------------------------------------------------------------------------*/ /** * \brief Get the iterator on the end of the actor map. */ bear::engine::script_context::actor_map_iterator_type bear::engine::script_context::get_actors_end() { return m_actor.end(); } // script_context::get_actors_end() /*----------------------------------------------------------------------------*/ /** * \brief Get the const iterator on the beginning of the actor map. */ bear::engine::script_context::actor_item_map_const_iterator_type bear::engine::script_context::get_actors_item_begin() const { return m_actor_item.begin(); } // script_context::get_actors_item_begin() /*----------------------------------------------------------------------------*/ /** * \brief Get the const iterator on the end of the actor map. */ bear::engine::script_context::actor_item_map_const_iterator_type bear::engine::script_context::get_actors_item_end() const { return m_actor_item.end(); } // script_context::get_actors_item_end() /*----------------------------------------------------------------------------*/ /** * \brief Get the const iterator on the beginning of the actor map. */ bear::engine::script_context::actor_map_const_iterator_type bear::engine::script_context::get_actors_begin() const { return m_actor.begin(); } // script_context::get_actors_begin() /*----------------------------------------------------------------------------*/ /** * \brief Get the const iterator on the end of the actor map. */ bear::engine::script_context::actor_map_const_iterator_type bear::engine::script_context::get_actors_end() const { return m_actor.end(); } // script_context::get_actors_end() /*----------------------------------------------------------------------------*/ /** * \brief Convert an argument into the adequate type. * \param arg The argument to convert. * \param type The description of the expected type for the result value. */ bear::text_interface::converted_argument bear::engine::script_context::do_convert_argument ( const std::string& arg, const std::type_info& type ) const { base_item* item = get_actor_item(arg); if ( item != NULL ) return item; text_interface::base_exportable* actor = get_actor(arg); if ( actor != NULL ) return actor; throw text_interface::no_converter(arg, type); } // script_context::do_convert_argument() plee-the-bear-20251226/bear-engine/core/src/engine/script/code/script_parser.cpp000066400000000000000000000061351512343254000273370ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::engine::script_parser class. * \author Julien Jorge */ #include "engine/script/script_parser.hpp" #include "engine/script/call_sequence.hpp" #include "engine/script/script_grammar.hpp" #include "engine/script/node_parser/node_parser_file.hpp" #include "engine/game.hpp" #include "engine/resource_pool.hpp" #include #include #include /*----------------------------------------------------------------------------*/ /** * \brief Parse a script. * \param seq The call_sequence in which the result is stored. * \param path The path of the script resource. */ bool bear::engine::script_parser::run ( call_sequence& seq, const std::string& path ) { std::stringstream file_data; bool ok; if ( !resource_pool::get_instance().exists(path) ) { claw::logger << claw::log_error << "Can't find file '" << path << "'." << std::endl; ok = false; } else { resource_pool::get_instance().get_file(path, file_data); ok = run( seq, file_data.str().c_str(), file_data.str().size() ); } return ok; } // model_compiler::run() /*----------------------------------------------------------------------------*/ /** * \brief Parse a script. * \param seq The call_sequence in which the result is stored. * \param in_file The script to parse. */ bool bear::engine::script_parser::run ( call_sequence& seq, const std::istream& in_file ) { std::stringstream file_data; file_data << in_file.rdbuf(); bool ok = run( seq, file_data.str().c_str(), file_data.str().size() ); return ok; } // model_compiler::run() /*----------------------------------------------------------------------------*/ /** * \brief Parse a script. * \param seq The call_sequence in which the result is stored. * \param file_data The content of the file to compile. * \param file_size Size of the \a file_data buffer. */ bool bear::engine::script_parser::run ( call_sequence& seq, const char* file_data, unsigned int file_size ) { bool ok; boost::spirit::classic::tree_parse_info info; script_grammar grammar; iterator begin(file_data, file_data + file_size, "script"), end; info = boost::spirit::classic::ast_parse ( begin, end, grammar, boost::spirit::classic::comment_p("/*", "*/") | boost::spirit::classic::space_p ); ok = info.match; scan_tree( seq, info.trees[0] ); return ok; } // model_compiler::run() /*----------------------------------------------------------------------------*/ /** * \brief Compile the tree of the file. * \param seq The file to write in. * \param node The root of the tree to compile. */ void bear::engine::script_parser::scan_tree ( call_sequence& seq, const tree_node& node ) { node_parser_file file; file.parse_node( seq, node, game::get_instance().get_translator() ); } // bear::engine::script_parser::parse_tree() plee-the-bear-20251226/bear-engine/core/src/engine/script/code/script_runner.cpp000066400000000000000000000123231512343254000273500ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::engine::script_runner class. * \author Julien Jorge */ #include "engine/script/script_runner.hpp" #include "engine/script/script_parser.hpp" #include #include /*----------------------------------------------------------------------------*/ /** * \brief Set an actor of the script. * \param name The name of the actor. * \param item The actor. * \pre \a item inherit from bear::engine::with_text_interface */ void bear::engine::script_runner::set_actor_item ( const std::string& name, base_item* item ) { m_context.set_actor_item(name, item); } // script_runner::set_actor_item() /*----------------------------------------------------------------------------*/ /** * \brief Set an actor of the script. * \param name The name of the actor. * \param item The actor. * \pre \a item inherit from text_interface::base_exportable */ void bear::engine::script_runner::set_actor ( const std::string& name, text_interface::base_exportable* item ) { m_context.set_actor(name, item); } // script_runner::set_actor() /*----------------------------------------------------------------------------*/ /** * \brief Load a script. * \param s The path to the script to load. */ bool bear::engine::script_runner::load_script( const std::string& s ) { script_parser parser; bool result = parser.run( m_sequence, s ); reset(); m_context.set_actor("script", this); return result; } // script_runner::load_script() /*----------------------------------------------------------------------------*/ /** * \brief Go back to the beginning of the script. */ void bear::engine::script_runner::reset() { m_date = 0; m_current_call = m_sequence.begin(); } // script_runner::reset() /*----------------------------------------------------------------------------*/ /** * \brief Tell if we are done with this script. */ bool bear::engine::script_runner::finished() const { return m_current_call == m_sequence.end(); } // script_runner::finished() /*----------------------------------------------------------------------------*/ /** * \brief Play some actions of the script. * \param duration How long do we play the script. */ void bear::engine::script_runner::play( universe::time_type duration ) { if ( m_date == 0 ) on_script_started(); m_date += duration; bool done(false); while ( !done && (m_current_call != m_sequence.end()) ) if ( claw::real_number(m_current_call->date) > m_date ) done = true; else { play_action(); ++m_current_call; } } // script_runner::play() /*----------------------------------------------------------------------------*/ /** * \brief Get the total duration of the script. */ bear::universe::time_type bear::engine::script_runner::get_script_duration() const { if ( m_sequence.empty() ) return 0; else { call_sequence::const_iterator it = m_sequence.end(); --it; return it->date; } } // script_runner::get_script_duration() /*----------------------------------------------------------------------------*/ /** * \brief Get the context. */ const bear::engine::script_context& bear::engine::script_runner::get_context() const { return m_context; } // script_runner::get_context() /*----------------------------------------------------------------------------*/ /** * \brief Extra processing by subclasses at the beginning of the script. */ void bear::engine::script_runner::on_script_started() { } // script_runner::on_script_started() /*----------------------------------------------------------------------------*/ /** * \brief Extra processing by subclasses at the end of the script. */ void bear::engine::script_runner::on_script_stopped() { } // script_runner::on_script_stopped() /*----------------------------------------------------------------------------*/ /** * \brief Inform that the script is finished. */ void bear::engine::script_runner::end() { on_script_stopped(); } // script_runner::end() /*----------------------------------------------------------------------------*/ /** * \brief Play current action of the script. */ void bear::engine::script_runner::play_action() { text_interface::base_exportable* actor = m_context.get_actor( m_current_call->call.get_actor_name() ); if ( actor == NULL ) claw::logger << claw::log_error << "Unknown actor '" << m_current_call->call.get_actor_name() << "' at date " << m_current_call->date << std::endl; else actor->execute ( m_current_call->call.get_method_name(), m_current_call->call.get_arguments(), m_context ); } // script_runner::play_action() /*----------------------------------------------------------------------------*/ /** * \brief Export the methods of the class. */ void bear::engine::script_runner::init_exported_methods() { TEXT_INTERFACE_CONNECT_METHOD_0( bear::engine::script_runner, end, void ); } // script_runner::init_exported_methods() TEXT_INTERFACE_IMPLEMENT_METHOD_LIST(bear::engine::script_runner) plee-the-bear-20251226/bear-engine/core/src/engine/script/impl/000077500000000000000000000000001512343254000237755ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/core/src/engine/script/impl/script_grammar.tpp000066400000000000000000000132741512343254000275430ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implemenation of the bear::engine::script_grammar class. * \author Julien Jorge. */ #include #include /*----------------------------------------------------------------------------*/ /** * \brief Default constructor. */ template bear::engine::script_grammar::definition:: error_report_parser::error_report_parser() { // nothing to do. } // definition::error_report_parser::error_report_parser() /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param msg A text explaining the error. */ template bear::engine::script_grammar::definition:: error_report_parser::error_report_parser( const std::string msg ) : m_msg(msg) { } // definition::error_report_parser::error_report_parser() /*----------------------------------------------------------------------------*/ /** * \brief Print the message on standard error output. * \param scan The scanner detecting the error. */ template template int bear::engine::script_grammar::definition:: error_report_parser::operator() (const LocalScanner& scan, result_t& /*result*/) const { boost::spirit::classic::file_position fpos = scan.first.get_position(); claw::logger << claw::log_error << fpos.file << ": " << fpos.line << ": " << fpos.column << ": " << m_msg << std::endl; return -1; } // definition::operator() /*----------------------------------------------------------------------------*/ /** * \brief Default constructor. */ template bear::engine::script_grammar::definition:: char_error_report_parser::char_error_report_parser() { } // definition::char_error_report_parser::char_error_report_parser() /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param c The missing character. */ template bear::engine::script_grammar::definition:: char_error_report_parser::char_error_report_parser( char c ) : error_report_parser( std::string("Missing character '") + c + "'." ) { } // definition::char_error_report_parser::char_error_report_parser() /*----------------------------------------------------------------------------*/ /** * \brief Definition of the rules. * \param self The concerned bear::engine::script_grammar instance. */ template bear::engine::script_grammar::definition::definition ( const script_grammar& self ) { initialize_error_parsers(); // Whole file m_file = *m_call_entry; m_call_entry = m_date >> ( m_call | m_call_group ); m_call = m_identifier >> ( boost::spirit::classic::no_node_d[ boost::spirit::classic::ch_p('.') ] | m_error_dot ) >> ( m_identifier | m_error_identifier ) >> ( boost::spirit::classic::no_node_d[ boost::spirit::classic::ch_p('(') ] | m_error_left_parenthesis ) >> !m_argument_list >> ( boost::spirit::classic::no_node_d[ boost::spirit::classic::ch_p(')') ] | m_error_right_parenthesis ) >> ( boost::spirit::classic::no_node_d[ boost::spirit::classic::ch_p(';') ] | m_error_semicolon ) ; m_call_group = ( boost::spirit::classic::no_node_d[ boost::spirit::classic::ch_p('{') ] | m_error_left_brace ) >> +m_call >> ( boost::spirit::classic::no_node_d[ boost::spirit::classic::ch_p('}') ] | m_error_right_brace ) ; m_identifier = boost::spirit::classic::no_node_d[ *boost::spirit::classic::blank_p ] >> boost::spirit::classic::token_node_d [ boost::spirit::classic::lexeme_d[ (boost::spirit::classic::alpha_p | '_') >> *(boost::spirit::classic::alnum_p | '_') ] ]; m_date = boost::spirit::classic::real_p; m_argument_list = boost::spirit::classic::list_p ( m_argument, ( boost::spirit::classic::no_node_d [ boost::spirit::classic::ch_p(',') ] ) ); m_string = boost::spirit::classic::lexeme_d [ boost::spirit::classic::no_node_d[ boost::spirit::classic::ch_p('"') ] >> boost::spirit::classic::token_node_d [ *(boost::spirit::classic::strlit<>("\\\"") | (boost::spirit::classic::anychar_p - '"') ) ] >> boost::spirit::classic::no_node_d [ ( '"' | m_error_not_terminated_string ) ] ]; m_argument = m_string | m_identifier | boost::spirit::classic::real_p; } // script_grammar::definition::definition() /*----------------------------------------------------------------------------*/ /** * \brief Initialize the error parsers */ template void bear::engine::script_grammar::definition::initialize_error_parsers() { m_error_date = error_report_parser( "Date (real number) expected." ); m_error_identifier = error_report_parser( "Identifier expected." ); m_error_not_terminated_string = error_report_parser( "Not terminated string." ); m_error_missing_argument = error_report_parser( "Missing argument." ); m_error_dot = char_error_report_parser( '.' ); m_error_comma = char_error_report_parser( ',' ); m_error_semicolon = char_error_report_parser( ';' ); m_error_right_parenthesis = char_error_report_parser( ')' ); m_error_left_parenthesis = char_error_report_parser( '(' ); m_error_right_brace = char_error_report_parser( '}' ); m_error_left_brace = char_error_report_parser( '{' ); } // script_grammar::definition::initialize_error_parsers() plee-the-bear-20251226/bear-engine/core/src/engine/script/method_call.hpp000066400000000000000000000025601512343254000260230ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief The data needed to call a method on an item when executing a script. * \author Julien Jorge */ #ifndef __ENGINE_METHOD_CALL_HPP__ #define __ENGINE_METHOD_CALL_HPP__ #include "engine/class_export.hpp" #include #include namespace bear { namespace engine { /** * \brief The context in which the scripts on items are executed. * \author Julien Jorge */ class ENGINE_EXPORT method_call { public: void set_actor_name( const std::string& name ); const std::string& get_actor_name() const; void set_method_name( const std::string& name ); const std::string& get_method_name() const; void set_arguments( const std::vector& val ); const std::vector& get_arguments() const; private: /** \brief The name of the actor. */ std::string m_actor_name; /** \brief The name of the method. */ std::string m_method_name; /** \brief The arguments passed to the method. */ std::vector m_arguments; }; // class method_call } // namespace engine } // namespace bear #endif // __ENGINE_METHOD_CALL_HPP__ plee-the-bear-20251226/bear-engine/core/src/engine/script/node_parser/000077500000000000000000000000001512343254000253355ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/core/src/engine/script/node_parser/code/000077500000000000000000000000001512343254000262475ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/core/src/engine/script/node_parser/code/node_parser.cpp000066400000000000000000000017151512343254000312600ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::engine::node_parser class. * \author Julien Jorge */ #include "engine/script/node_parser/node_parser.hpp" #include /*----------------------------------------------------------------------------*/ /** * \brief Write an error on the log stream. * \param first Begining of the incorrect input. * \param last End of the incorrect input. * \param msg Informative message. */ void bear::engine::node_parser::error ( data_iterator first, const std::string& msg ) const { boost::spirit::classic::file_position pos = first.get_position(); claw::logger << claw::log_error << pos.file << ": " << pos.line << ": " << pos.column << ": " << msg << std::endl; } // node_parser::error() plee-the-bear-20251226/bear-engine/core/src/engine/script/node_parser/code/node_parser_argument.cpp000066400000000000000000000022611512343254000331570ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::engine::node_parser_argument class. * \author Julien Jorge */ #include "engine/script/node_parser/node_parser_argument.hpp" #include "engine/i18n/translator.hpp" #include "engine/script/script_grammar.hpp" #include /*----------------------------------------------------------------------------*/ /** * \brief Parse a node of type argument. * \param val The value of the argument. * \param node Node to parse. * \param t The translator to use to translate the texts. */ void bear::engine::node_parser_argument::parse_node ( std::string& val, const tree_node& node, translator t ) const { val = std::string( node.value.begin(), node.value.end() ); if ( node.value.id() == script_grammar::id_string ) { std::string tmp( t.get( val ) ); val.clear(); claw::text::c_escape ( tmp.begin(), tmp.end(), std::inserter(val, val.end()) ); } } // node_parser_argument::parse_node() node_parser_argument_list.cpp000066400000000000000000000026261512343254000341400ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/core/src/engine/script/node_parser/code/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::engine::node_parser_argument_list class. * \author Julien Jorge */ #include "engine/script/node_parser/node_parser_argument_list.hpp" #include "engine/script/method_call.hpp" #include "engine/script/script_grammar.hpp" #include "engine/script/node_parser/node_parser_argument.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Parse a node of type argument_list. * \param call The method call for which we set the arguments. * \param node Node to parse. * \param t The translator to use to translate the texts. */ void bear::engine::node_parser_argument_list::parse_node ( method_call& call, const tree_node& node, translator t ) const { std::vector args; node_parser_argument parser; std::string val; if ( node.value.id() == script_grammar::id_argument_list ) { for (std::size_t i=0; i!=node.children.size(); ++i) { parser.parse_node(val, node.children[i], t); args.push_back(val); } } else { parser.parse_node(val, node, t); args.push_back(val); } call.set_arguments(args); } // node_parser_argument_list::parse_node() plee-the-bear-20251226/bear-engine/core/src/engine/script/node_parser/code/node_parser_call.cpp000066400000000000000000000030761512343254000322550ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::engine::node_parser_call class. * \author Julien Jorge */ #include "engine/script/node_parser/node_parser_call.hpp" #include "engine/script/node_parser/node_parser_argument_list.hpp" #include "engine/script/call_sequence.hpp" #include "engine/script/method_call.hpp" #include #include /*----------------------------------------------------------------------------*/ /** * \brief Parse a node of type call. * \param seq The sequence in which the calls are inserted. * \param node Node to parse. * \param date The date of the call. * \param t The translator to use to translate the texts. */ void bear::engine::node_parser_call::parse_node ( call_sequence& seq, const tree_node& node, universe::time_type date, translator t ) const { CLAW_PRECOND( node.children.size() >= 2 ); CLAW_PRECOND( node.children.size() <= 3 ); method_call call; call.set_actor_name ( std::string( node.children[0].value.begin(), node.children[0].value.end() ) ); call.set_method_name ( std::string( node.children[1].value.begin(), node.children[1].value.end() ) ); if ( node.children.size() > 2 ) { node_parser_argument_list parser; parser.parse_node(call, node.children[2], t); } seq.add_call(date, call); } // node_parser_call::parse_node() node_parser_call_entry.cpp000066400000000000000000000032511512343254000334120ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/core/src/engine/script/node_parser/code/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::engine::node_parser_call_entry class. * \author Julien Jorge */ #include "engine/script/node_parser/node_parser_call_entry.hpp" #include "engine/script/node_parser/node_parser_call.hpp" #include "engine/script/node_parser/node_parser_call_group.hpp" #include "engine/script/call_sequence.hpp" #include "engine/script/script_grammar.hpp" #include #include /*----------------------------------------------------------------------------*/ /** * \brief Parse a node of type call. * \param seq The sequence in which the calls are inserted. * \param node Node to parse. * \param t The translator to use to translate the texts. */ void bear::engine::node_parser_call_entry::parse_node ( call_sequence& seq, const tree_node& node, translator t ) const { CLAW_PRECOND( node.children.size() == 2 ); universe::time_type date; std::istringstream iss ( std::string( node.children[0].value.begin(), node.children[0].value.end() ) ); iss >> date; if ( *node.children[0].value.begin() == '+' ) date += seq.get_last_date(); if ( node.children[1].value.id() == script_grammar::id_call ) { node_parser_call call; call.parse_node(seq, node.children[1], date, t); } else // node.value.id() == script_grammar::id_call_group { node_parser_call_group call; call.parse_node(seq, node.children[1], date, t); } } // node_parser_call_entry::parse_node() node_parser_call_group.cpp000066400000000000000000000022151512343254000334040ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/core/src/engine/script/node_parser/code/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::engine::node_parser_call_group class. * \author Julien Jorge */ #include "engine/script/node_parser/node_parser_call_group.hpp" #include "engine/script/node_parser/node_parser_call.hpp" #include /*----------------------------------------------------------------------------*/ /** * \brief Parse a node of type call_group. * \param seq The sequence in which the calls are inserted. * \param node Node to parse. * \param date The date of the call. * \param t The translator to use to translate the texts. */ void bear::engine::node_parser_call_group::parse_node ( call_sequence& seq, const tree_node& node, universe::time_type date, translator t ) const { CLAW_PRECOND( node.children.size() >= 1 ); node_parser_call call; for ( std::size_t i=0; i!=node.children.size(); ++i ) call.parse_node( seq, node.children[i], date, t ); } // node_parser_call_group::parse_node() plee-the-bear-20251226/bear-engine/core/src/engine/script/node_parser/code/node_parser_file.cpp000066400000000000000000000022501512343254000322520ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::engine::node_parser_file class. * \author Julien Jorge */ #include "engine/script/node_parser/node_parser_file.hpp" #include "engine/script/node_parser/node_parser_call_entry.hpp" #include "engine/script/script_grammar.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Parse a node of type file. * \param seq The sequence in which the calls are inserted. * \param node Node to parse. * \param t The translator to use to translate the texts. */ void bear::engine::node_parser_file::parse_node ( call_sequence& seq, const tree_node& node, translator t ) const { node_parser_call_entry call; if ( node.value.id() == script_grammar::id_call_entry ) call.parse_node(seq, node, t); else // node.value.id() == script_grammar::id_file for (std::size_t i=0; i!=node.children.size(); ++i) call.parse_node(seq, node.children[i], t); } // node_parser_file::parse_node() plee-the-bear-20251226/bear-engine/core/src/engine/script/node_parser/node_parser.hpp000066400000000000000000000026241512343254000303530ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Base class for node parsers. * \author Julien Jorge */ #ifndef __ENGINE_NODE_PARSER_HPP__ #define __ENGINE_NODE_PARSER_HPP__ #include "engine/class_export.hpp" #include #include #include #include namespace bear { namespace engine { /** * \brief Base class for node parsers. * \author Julien Jorge */ class ENGINE_EXPORT node_parser { public: /** \brief The type of an iterator on the input data. */ typedef boost::spirit::classic::position_iterator data_iterator; typedef boost::spirit::classic::node_iter_data_factory node_factory; typedef boost::spirit::classic::tree_match tree_match; /** \brief The type of a node of the tree built by the compiler. */ typedef tree_match::node_t tree_node; protected: void error( data_iterator first, const std::string& msg ) const; }; // class node_parser } // namespace engine } // namespace bear #endif // __ENGINE_NODE_PARSER_HPP__ plee-the-bear-20251226/bear-engine/core/src/engine/script/node_parser/node_parser_argument.hpp000066400000000000000000000017051512343254000322540ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Compile the node of the "argument" rule. * \author Julien Jorge */ #ifndef __ENGINE_NODE_PARSER_ARGUMENT_HPP__ #define __ENGINE_NODE_PARSER_ARGUMENT_HPP__ #include "engine/class_export.hpp" #include "engine/script/node_parser/node_parser.hpp" #include "engine/i18n/translator.hpp" namespace bear { namespace engine { /** * \brief Compile the node of the "argument" rule. * \author Julien Jorge */ class ENGINE_EXPORT node_parser_argument: public node_parser { public: void parse_node ( std::string& val, const tree_node& node, translator t ) const; }; // class node_parser_argument } // namespace engine } // namespace bear #endif // __ENGINE_NODE_PARSER_ARGUMENT_HPP__ plee-the-bear-20251226/bear-engine/core/src/engine/script/node_parser/node_parser_argument_list.hpp000066400000000000000000000020011512343254000332750ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Compile the node of the "argument_list" rule. * \author Julien Jorge */ #ifndef __ENGINE_NODE_PARSER_ARGUMENT_LIST_HPP__ #define __ENGINE_NODE_PARSER_ARGUMENT_LIST_HPP__ #include "engine/script/node_parser/node_parser.hpp" #include "engine/class_export.hpp" #include "engine/i18n/translator.hpp" namespace bear { namespace engine { class method_call; /** * \brief Compile the node of the "argument_list" rule. * \author Julien Jorge */ class ENGINE_EXPORT node_parser_argument_list: public node_parser { public: void parse_node ( method_call& call, const tree_node& node, translator t ) const; }; // class node_parser_argument_list } // namespace engine } // namespace bear #endif // __ENGINE_NODE_PARSER_ARGUMENT_LIST_HPP__ plee-the-bear-20251226/bear-engine/core/src/engine/script/node_parser/node_parser_call.hpp000066400000000000000000000020041512343254000313360ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Compile the node of the "call" rule. * \author Julien Jorge */ #ifndef __ENGINE_NODE_PARSER_CALL_HPP__ #define __ENGINE_NODE_PARSER_CALL_HPP__ #include "engine/class_export.hpp" #include "engine/script/node_parser/node_parser.hpp" #include "engine/i18n/translator.hpp" #include "universe/types.hpp" namespace bear { namespace engine { class call_sequence; /** * \brief Compile the node of the "call" rule. * \author Julien Jorge */ class ENGINE_EXPORT node_parser_call: public node_parser { public: void parse_node ( call_sequence& seq, const tree_node& node, universe::time_type date, translator t ) const; }; // class node_parser_call } // namespace engine } // namespace bear #endif // __ENGINE_NODE_PARSER_CALL_HPP__ plee-the-bear-20251226/bear-engine/core/src/engine/script/node_parser/node_parser_call_entry.hpp000066400000000000000000000017631512343254000325720ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Compile the node of the "call_entry" rule. * \author Julien Jorge */ #ifndef __ENGINE_NODE_PARSER_CALL_ENTRY_HPP__ #define __ENGINE_NODE_PARSER_CALL_ENTRY_HPP__ #include "engine/class_export.hpp" #include "engine/script/node_parser/node_parser.hpp" #include "engine/i18n/translator.hpp" namespace bear { namespace engine { class call_sequence; /** * \brief Compile the node of the "call" rule. * \author Julien Jorge */ class ENGINE_EXPORT node_parser_call_entry: public node_parser { public: void parse_node ( call_sequence& seq, const tree_node& node, translator t ) const; }; // class node_parser_call_entry } // namespace engine } // namespace bear #endif // __ENGINE_NODE_PARSER_CALL_ENTRY_HPP__ plee-the-bear-20251226/bear-engine/core/src/engine/script/node_parser/node_parser_call_group.hpp000066400000000000000000000020561512343254000325610ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Compile the node of the "call_group" rule. * \author Julien Jorge */ #ifndef __ENGINE_NODE_PARSER_CALL_GROUP_HPP__ #define __ENGINE_NODE_PARSER_CALL_GROUP_HPP__ #include "engine/class_export.hpp" #include "engine/script/node_parser/node_parser.hpp" #include "engine/i18n/translator.hpp" #include "universe/types.hpp" namespace bear { namespace engine { class call_sequence; /** * \brief Compile the node of the "call_group" rule. * \author Julien Jorge */ class ENGINE_EXPORT node_parser_call_group: public node_parser { public: void parse_node ( call_sequence& seq, const tree_node& node, universe::time_type date, translator t ) const; }; // class node_parser_call_group } // namespace engine } // namespace bear #endif // __ENGINE_NODE_PARSER_CALL_GROUP_HPP__ plee-the-bear-20251226/bear-engine/core/src/engine/script/node_parser/node_parser_file.hpp000066400000000000000000000017201512343254000313460ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Compile the node of the "file" rule. * \author Julien Jorge */ #ifndef __ENGINE_NODE_PARSER_FILE_HPP__ #define __ENGINE_NODE_PARSER_FILE_HPP__ #include "engine/script/node_parser/node_parser.hpp" #include "engine/i18n/translator.hpp" #include "engine/class_export.hpp" namespace bear { namespace engine { class call_sequence; /** * \brief Compile the node of the "file" rule. * \author Julien Jorge */ class ENGINE_EXPORT node_parser_file: public node_parser { public: void parse_node ( call_sequence& seq, const tree_node& node, translator t ) const; }; // class node_parser_file } // namespace engine } // namespace bear #endif // __ENGINE_NODE_PARSER_FILE_HPP__ plee-the-bear-20251226/bear-engine/core/src/engine/script/script_context.hpp000066400000000000000000000064211512343254000266200ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief The context in which the scripts on items are executed. * \author Julien Jorge */ #ifndef __ENGINE_SCRIPT_CONTEXT_HPP__ #define __ENGINE_SCRIPT_CONTEXT_HPP__ #include "engine/class_export.hpp" #include "text_interface/argument_converter.hpp" #include "text_interface/base_exportable.hpp" #include "universe/derived_item_handle.hpp" #include "universe/physical_item.hpp" #include #include namespace bear { namespace engine { class base_item; /** * \brief The context in which the scripts on items are executed. * \author Julien Jorge */ class ENGINE_EXPORT script_context: public text_interface::argument_converter { private: /** \brief Handle on the actor. */ typedef universe::derived_item_handle handle_type; public: /** \brief The type of the container in which we store the actors inheriting from base_item. */ typedef std::map actor_item_map_type; /** \brief The type of iterator on actor map. */ typedef actor_item_map_type::iterator actor_item_map_iterator_type; /** \brief The type of const iterator on actor map. */ typedef actor_item_map_type::const_iterator actor_item_map_const_iterator_type; /** \brief The type of the container in which we store the actors. */ typedef std::map actor_map_type; /** \brief The type of iterator on actor map. */ typedef actor_map_type::iterator actor_map_iterator_type; /** \brief The type of const iterator on actor map. */ typedef actor_map_type::const_iterator actor_map_const_iterator_type; public: void set_actor_item( const std::string& name, base_item* item ); base_item* get_actor_item( const std::string& name ) const; void set_actor ( const std::string& name, text_interface::base_exportable* item ); text_interface::base_exportable* get_actor( const std::string& name ) const; actor_item_map_iterator_type get_actors_item_begin(); actor_item_map_iterator_type get_actors_item_end(); actor_map_iterator_type get_actors_begin(); actor_map_iterator_type get_actors_end(); actor_item_map_const_iterator_type get_actors_item_begin() const; actor_item_map_const_iterator_type get_actors_item_end() const; actor_map_const_iterator_type get_actors_begin() const; actor_map_const_iterator_type get_actors_end() const; private: virtual text_interface::converted_argument do_convert_argument ( const std::string& arg, const std::type_info& type ) const; private: /** \brief The actor used in the script that inherits of base_item. */ actor_item_map_type m_actor_item; /** \brief The items used in the script that inherits of with_text_interface. */ actor_map_type m_actor; }; // class script_context } // namespace engine } // namespace bear #endif // __ENGINE_SCRIPT_CONTEXT_HPP__ plee-the-bear-20251226/bear-engine/core/src/engine/script/script_grammar.hpp000066400000000000000000000123511512343254000265610ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief The grammar of a script file. * \author Julien Jorge */ #ifndef __ENGINE_SCRIPT_GRAMMAR_HPP__ #define __ENGINE_SCRIPT_GRAMMAR_HPP__ #include "engine/class_export.hpp" #include namespace bear { namespace engine { /** * \brief The grammar of a script file. * \author Julien Jorge */ class ENGINE_EXPORT script_grammar: public boost::spirit::classic::grammar { public: static const int id_file = 10; static const int id_call_entry = 20; static const int id_argument_list = 40; static const int id_argument = 41; static const int id_string = 50; static const int id_call = 60; static const int id_call_group = 70; public: /** * \brief Grammar definition. */ template class definition { private: /** * \brief Report any error. */ class error_report_parser { public: typedef boost::spirit::classic::nil_t result_t; public: error_report_parser(); error_report_parser( const std::string msg ); template int operator()(const LocalScanner& scan, result_t& /*result*/) const; private: /** \brief A text explaining the error. */ std::string m_msg; }; // class error_report_parser /** * \brief Report a "missing character" error. */ class char_error_report_parser: public error_report_parser { public: char_error_report_parser(); char_error_report_parser( char c ); }; // class char_error_report_parser typedef boost::spirit::classic::functor_parser generic_error; typedef boost::spirit::classic::functor_parser char_error; public: definition( const script_grammar& /*self*/ ); /** * \brief Get the axiom rule. */ const boost::spirit::classic::rule < ScannerT, boost::spirit::classic::parser_tag >& start() const { return m_file; } private: void initialize_error_parsers(); private: /** \brief Rule matching the full file. */ boost::spirit::classic::rule < ScannerT, boost::spirit::classic::parser_tag > m_file; /** \brief Rule matching one or more calls after a date. */ boost::spirit::classic::rule < ScannerT, boost::spirit::classic::parser_tag > m_call_entry; /** \brief Rule matching a single call. */ boost::spirit::classic::rule < ScannerT, boost::spirit::classic::parser_tag > m_call; /** \brief Rule matching several calls. */ boost::spirit::classic::rule < ScannerT, boost::spirit::classic::parser_tag > m_call_group; /** \brief Rule matching an identifier. */ boost::spirit::classic::rule m_identifier; /** \brief Rule matching the date of the call. */ boost::spirit::classic::rule m_date; /** \brief Rule matching the list of the arguments values of a method call. */ boost::spirit::classic::rule < ScannerT, boost::spirit::classic::parser_tag > m_argument_list; /** \brief Rule matching the value of an argument of a method call. */ boost::spirit::classic::rule < ScannerT, boost::spirit::classic::parser_tag > m_argument; /** \brief Rule matching a C string. */ boost::spirit::classic::rule < ScannerT, boost::spirit::classic::parser_tag > m_string; /** * \brief Syntaxic errors. * \{ */ /** \brief Date expected. */ generic_error m_error_date; /** \brief Identifier expected. */ generic_error m_error_identifier; /** \brief Not terminated string. */ generic_error m_error_not_terminated_string; /** \brief Missing argument. */ generic_error m_error_missing_argument; /** \brief Dot expected. */ char_error m_error_dot; /** \brief Comma expected. */ char_error m_error_comma; /** \brief Semicolon expected. */ char_error m_error_semicolon; /** \brief Right parenthesis expected. */ char_error m_error_right_parenthesis; /** \brief Left parenthesis expected. */ char_error m_error_left_parenthesis; /** \brief Right brace expected. */ char_error m_error_right_brace; /** \brief Left brace expected. */ char_error m_error_left_brace; }; // class definition }; // class script_grammar } // namespace engine } // namespace bear #include "engine/script/impl/script_grammar.tpp" #endif // __ENGINE_SCRIPT_GRAMMAR_HPP__ plee-the-bear-20251226/bear-engine/core/src/engine/script/script_parser.hpp000066400000000000000000000031111512343254000264210ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief The parser for the script files. * \author Julien Jorge */ #ifndef __ENGINE_SCRIPT_PARSER_HPP__ #define __ENGINE_SCRIPT_PARSER_HPP__ #include "engine/class_export.hpp" #include #include #include #include namespace bear { namespace engine { class call_sequence; /** * \brief The parser for the script files. * \author Julien Jorge */ class ENGINE_EXPORT script_parser { public: typedef boost::spirit::classic::position_iterator iterator; typedef boost::spirit::classic::node_iter_data_factory node_factory; typedef boost::spirit::classic::tree_match tree_match; typedef tree_match::node_t tree_node; private: typedef boost::spirit::classic::scanner scanner; public: bool run( call_sequence& seq, const std::string& path ); bool run( call_sequence& seq, const std::istream& in_file ); bool run ( call_sequence& seq, const char* file_data, unsigned int file_size ); private: void scan_tree( call_sequence& seq, const tree_node& node ); }; // class script_parser } // namespace engine } // namespace bear #endif // __ENGINE_SCRIPT_PARSER_HPP__ plee-the-bear-20251226/bear-engine/core/src/engine/script/script_runner.hpp000066400000000000000000000037571512343254000264560ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A class that runs a script. * \author Julien Jorge */ #ifndef __ENGINE_SCRIPT_RUNNER_HPP__ #define __ENGINE_SCRIPT_RUNNER_HPP__ #include "engine/base_item.hpp" #include "engine/script/call_sequence.hpp" #include "engine/script/script_context.hpp" #include "engine/class_export.hpp" namespace bear { namespace engine { /** * \brief A class that runs a script. * \author Julien Jorge */ class ENGINE_EXPORT script_runner : public text_interface::base_exportable { public: typedef text_interface::base_exportable super; private: TEXT_INTERFACE_DECLARE_METHOD_LIST(super, init_exported_methods) public: void set_actor_item( const std::string& name, base_item* item ); void set_actor ( const std::string& name, text_interface::base_exportable* item ); bool load_script( const std::string& s ); void reset(); bool finished() const; void play( universe::time_type duration ); universe::time_type get_script_duration() const; protected: const script_context& get_context() const; virtual void on_script_started(); virtual void on_script_stopped(); private: void end(); void play_action(); private: static void init_exported_methods(); private: /** \brief The calls of the script. */ call_sequence m_sequence; /** \brief The context in which the script is executed. */ script_context m_context; /** \brief The elapsed time since the beginning of the script. */ universe::time_type m_date; /** \brief The next call to do. */ call_sequence::const_iterator m_current_call; }; // class script_runner } // namespace engine } // namespace bear #endif // __ENGINE_SCRIPT_RUNNER_HPP__ plee-the-bear-20251226/bear-engine/core/src/engine/shader_loader.hpp000066400000000000000000000023401512343254000250340ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A class to load the shader files. * \author Julien Jorge */ #ifndef __ENGINE_SHADER_LOADER_HPP__ #define __ENGINE_SHADER_LOADER_HPP__ #include #include #include "engine/class_export.hpp" namespace bear { namespace engine { /** * \brief A class to load the shader files. * \author Julien Jorge */ class ENGINE_EXPORT shader_loader { public: static void parse_shader_file ( std::stringstream& result, std::string name ); private: static void load_include ( std::stringstream& output, std::string name, std::vector& seen ); static bool parse_include ( std::stringstream& output, std::string file_name, std::string line, std::vector& seen ); static std::string get_relative_file_name ( std::string reference, std::string file_name ); }; // class shader_loader } // namespace engine } // namespace bear #endif // __ENGINE_SHADER_LOADER_HPP__ plee-the-bear-20251226/bear-engine/core/src/engine/sprite_loader.hpp000066400000000000000000000024541512343254000251020ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A class to load sprites and animations * \author Julien Jorge */ #ifndef __ENGINE_SPRITE_LOADER_HPP__ #define __ENGINE_SPRITE_LOADER_HPP__ #include "visual/animation.hpp" #include "engine/class_export.hpp" namespace bear { namespace engine { class compiled_file; class level_globals; class ENGINE_EXPORT sprite_loader { public: static visual::sprite load_sprite( compiled_file& f, level_globals& glob ); static visual::animation load_animation( compiled_file& f, level_globals& glob ); static visual::animation load_any_animation( compiled_file& f, level_globals& glob ); static visual::animation load_animation_data( compiled_file& f, level_globals& glob ); static void load_bitmap_rendering_attributes ( compiled_file& f, visual::bitmap_rendering_attributes& result ); private: static visual::animation load_animation_v0_5( compiled_file& f, level_globals& glob ); }; // class sprite_loader } // namespace engine } // namespace bear #endif // __ENGINE_SPRITE_LOADER_HPP__ plee-the-bear-20251226/bear-engine/core/src/engine/spritepos.hpp000066400000000000000000000042021512343254000242670ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief The spritepos class describes the content of a spritepos file. * \author Julien Jorge */ #ifndef __ENGINE_SPRITEPOS_HPP__ #define __ENGINE_SPRITEPOS_HPP__ #include #include #include "engine/class_export.hpp" namespace bear { namespace engine { /** * \brief The spritepos class describes the content of a spritepos file. * \author Julien Jorge */ class ENGINE_EXPORT spritepos { public: /** * \brief A description of a sprite in a spritepos file. */ class sprite_entry { public: /** \brief The type of the rectangle used to describe the region of a sprite in the source image. */ typedef claw::math::rectangle rectangle_type; public: sprite_entry( const std::string& name, const rectangle_type& clip ); const std::string& get_name() const; const rectangle_type& get_clip() const; private: /** \brief The name of the entry in the spritepos file. */ const std::string m_name; /** \brief The region of the sprite in the source image. */ const rectangle_type m_clip; }; // class sprite_entry private: /** \brief The type of the container in which the sprite entries are stored. */ typedef std::list entry_list; public: /** \brief The type of the iterator on non modifiable entries. */ typedef entry_list::const_iterator const_iterator; public: spritepos( std::istream& f ); const_iterator begin() const; const_iterator end() const; const_iterator find( const std::string& name ) const; private: void load( std::istream& f ); private: /** \brief The entries of the spritepos file. */ entry_list m_entries; }; // class spritepos } // namespace engine } // namespace bear #endif // __ENGINE_SPRITEPOS_HPP__ plee-the-bear-20251226/bear-engine/core/src/engine/stat_variable.hpp000066400000000000000000000016531512343254000250660ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A structure that stores a statistic variable. * \author Julien Jorge */ #ifndef __ENGINE_STAT_VARIABLE_HPP__ #define __ENGINE_STAT_VARIABLE_HPP__ #include namespace bear { namespace engine { /** * \brief A variable that can be sent to the server. */ struct stat_variable { template stat_variable( std::string n, ValueType v ); /** \brief The name of the variable. */ std::string name; /** \brief The value of the variable. */ std::string value; }; // struct variable } // namespace engine } // namespace bear #include "engine/impl/stat_variable.tpp" #endif // __ENGINE_STAT_VARIABLE_HPP__ plee-the-bear-20251226/bear-engine/core/src/engine/system/000077500000000000000000000000001512343254000230545ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/core/src/engine/system/android_game_filesystem.hpp000066400000000000000000000024071512343254000304450ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief The android_game_filesystem class is an implementation of the * base_game_filesystem class that allow to write game files for an * Android application. * \author Julien Jorge */ #ifdef __ANDROID__ #ifndef __ENGINE_ANDROID_GAME_FILESYSTEM_HPP__ #define __ENGINE_ANDROID_GAME_FILESYSTEM_HPP__ #include "engine/system/default_game_filesystem.hpp" namespace bear { namespace engine { /** * \brief The android_game_filesystem class is an implementation of the * base_game_filesystem class that allow to write game files for an * Android application. * \author Julien Jorge */ class android_game_filesystem: public default_game_filesystem { public: android_game_filesystem( std::string game_name ); virtual android_game_filesystem* clone() const; private: std::string get_android_root() const; }; // class android_game_filesystem } // namespace engine } // namespace bear #endif // __ENGINE_ANDROID_GAME_FILESYSTEM_HPP__ #endif // __ANDROID__ plee-the-bear-20251226/bear-engine/core/src/engine/system/android_system_event_manager.hpp000066400000000000000000000024331512343254000315060ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief The android_system_event_manager handles Android's application events * and reacts to them by adjusting the behavior of the game. * \author Julien Jorge */ #ifdef __ANDROID__ #ifndef __ENGINE_ANDROID_SYSTEM_EVENT_MANAGER_HPP__ #define __ENGINE_ANDROID_SYSTEM_EVENT_MANAGER_HPP__ #include "engine/system/base_system_event_manager.hpp" #include namespace bear { namespace engine { /** * \brief The android_system_event_manager handles Android's application * events and reacts to them by adjusting the behavior of the game. * \author Julien Jorge */ class ENGINE_EXPORT android_system_event_manager: public base_system_event_manager { public: android_system_event_manager(); ~android_system_event_manager(); void refresh(); private: static int event_filter( void* user_data, SDL_Event* event ); }; // class android_system_event_manager } // namespace engine } // namespace bear #endif // __ENGINE_ANDROID_SYSTEM_EVENT_MANAGER_HPP__ #endif // __ANDROID__ plee-the-bear-20251226/bear-engine/core/src/engine/system/base_game_filesystem.hpp000066400000000000000000000023301512343254000277320ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief The base_game_filesystem class provides an access to various game * related directories and files. * \author Julien Jorge */ #ifndef __ENGINE_BASE_GAME_FILESYSTEM_HPP__ #define __ENGINE_BASE_GAME_FILESYSTEM_HPP__ #include "engine/class_export.hpp" #include namespace bear { namespace engine { /** * \brief The base_game_filesystem class provides an access to various game * related directories and files. * \author Julien Jorge */ class ENGINE_EXPORT base_game_filesystem { public: virtual ~base_game_filesystem(); virtual base_game_filesystem* clone() const = 0; virtual std::string get_custom_config_file_name( std::string name ) = 0; virtual std::string get_custom_data_file_name( std::string name ) = 0; protected: std::string get_name_as_filename( std::string name ) const; }; // class base_game_filesystem } // namespace engine } // namespace bear #endif // __ENGINE_BASE_GAME_FILESYSTEM_HPP__ plee-the-bear-20251226/bear-engine/core/src/engine/system/base_system_event_manager.hpp000066400000000000000000000021171512343254000307770ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief The base_system_event_manager class is an interface of the classes * handling the system events in order to adjust the behavior of the * game. * \author Julien Jorge */ #ifndef __ENGINE_BASE_SYSTEM_EVENT_MANAGER_HPP__ #define __ENGINE_BASE_SYSTEM_EVENT_MANAGER_HPP__ #include "engine/class_export.hpp" namespace bear { namespace engine { /** * \brief The base_system_event_manager class is an interface of the classes * handling the system events in order to adjust the behavior of the * game. * \author Julien Jorge */ class ENGINE_EXPORT base_system_event_manager { public: virtual ~base_system_event_manager() {}; virtual void refresh() = 0; }; // class base_system_event_manager } // namespace engine } // namespace bear #endif // __ENGINE_BASE_SYSTEM_EVENT_MANAGER_HPP__ plee-the-bear-20251226/bear-engine/core/src/engine/system/code/000077500000000000000000000000001512343254000237665ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/core/src/engine/system/code/android_game_filesystem.cpp000066400000000000000000000031321512343254000313460ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::engine::android_game_filesystem class. * \author Julien Jorge */ #ifdef __ANDROID__ #include "engine/system/android_game_filesystem.hpp" #include #include /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param game_name The name of the game */ bear::engine::android_game_filesystem::android_game_filesystem ( std::string game_name ) : default_game_filesystem( game_name, get_android_root() ) { claw::logger << claw::log_verbose << "Internal storage is '" << get_android_root() << std::endl; } // android_game_filesystem::android_game_filesystem() /*----------------------------------------------------------------------------*/ /** * \brief Creates a dynamically allocated copy of this instance. */ bear::engine::android_game_filesystem* bear::engine::android_game_filesystem::clone() const { return new android_game_filesystem( *this ); } // android_game_filesystem::clone() /*----------------------------------------------------------------------------*/ /** * \brief Gets the root directory where the application can write its files. */ std::string bear::engine::android_game_filesystem::get_android_root() const { return SDL_AndroidGetInternalStoragePath(); } // android_game_filesystem::get_android_root() #endif // __ANDROID__ plee-the-bear-20251226/bear-engine/core/src/engine/system/code/android_system_event_manager.cpp000066400000000000000000000073121512343254000324140ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::engine::android_system_event_manager * class. * \author Julien Jorge */ #ifdef __ANDROID__ #include "engine/system/android_system_event_manager.hpp" #include "engine/game.hpp" #include /*----------------------------------------------------------------------------*/ /** * \brief Constructs the instance. Setup the event handling with the SDL. */ bear::engine::android_system_event_manager::android_system_event_manager() { SDL_EventState( SDL_APP_TERMINATING, SDL_ENABLE ); SDL_EventState( SDL_APP_LOWMEMORY, SDL_ENABLE ); SDL_EventState( SDL_APP_WILLENTERBACKGROUND, SDL_ENABLE ); SDL_EventState( SDL_APP_DIDENTERBACKGROUND, SDL_ENABLE ); SDL_EventState( SDL_APP_WILLENTERFOREGROUND, SDL_ENABLE ); SDL_EventState( SDL_APP_DIDENTERFOREGROUND, SDL_ENABLE ); SDL_SetEventFilter( &event_filter, this ); } // android_system_event_manager::android_system_event_manager() /*----------------------------------------------------------------------------*/ /** * \brief Destroys the instance. Cleans up the event handling with the SDL. */ bear::engine::android_system_event_manager::~android_system_event_manager() { SDL_EventFilter current_filter; void* user_data; if ( SDL_GetEventFilter( ¤t_filter, &user_data ) ) if ( ( current_filter == &event_filter ) && ( user_data == this ) ) SDL_SetEventFilter( NULL, NULL ); } // android_system_event_manager::~android_system_event_manager() /*----------------------------------------------------------------------------*/ /** * \brief Processes the pending events. */ void bear::engine::android_system_event_manager::refresh() { SDL_PumpEvents(); } // android_system_event_manager::refresh() /*----------------------------------------------------------------------------*/ /** * \brief Processes an event prepared by the sdl. We handle the application * events and let the SDL to process the others. * \param g The running instance of rp::game. * \param event The event to check. */ int bear::engine::android_system_event_manager::event_filter ( void* user_data, SDL_Event* event ) { int result(0); switch ( event->type ) { case SDL_APP_TERMINATING: claw::logger << claw::log_verbose << "Ignoring application event: SDL_APP_TERMINATING" << std::endl; break; case SDL_APP_LOWMEMORY: claw::logger << claw::log_verbose << "Ignoring application event: SDL_APP_LOWMEMORY" << std::endl; break; case SDL_APP_WILLENTERBACKGROUND: claw::logger << claw::log_verbose << "Processing: SDL_APP_WILLENTERBACKGROUND" << std::endl; game::get_instance().sleep(); break; case SDL_APP_DIDENTERBACKGROUND: claw::logger << claw::log_verbose << "Ignoring application event: SDL_APP_DIDENTERBACKGROUND" << std::endl; break; case SDL_APP_WILLENTERFOREGROUND: claw::logger << claw::log_verbose << "Processing: SDL_APP_WILLENTERFOREGROUND" << std::endl; game::get_instance().wake_up(); break; case SDL_APP_DIDENTERFOREGROUND: claw::logger << claw::log_verbose << "Ignoring application event: SDL_APP_DIDENTERFOREGROUND" << std::endl; break; default: result = 1; } return result; } // android_system_event_manager::event_filter() #endif // __ANDROID__ plee-the-bear-20251226/bear-engine/core/src/engine/system/code/base_game_filesystem.cpp000066400000000000000000000025661512343254000306520ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::engine::base_game_filesystem class. * \author Julien Jorge */ #include "engine/system/base_game_filesystem.hpp" #include #include /*----------------------------------------------------------------------------*/ /** * \brief Destructor. */ bear::engine::base_game_filesystem::~base_game_filesystem() { // Nothing to do. } // base_game_filesystem::~base_game_filesystem() /*----------------------------------------------------------------------------*/ /** * \brief Converts a string in order to create a valid name file, with no * blanks. * \param name The name to convert. */ std::string bear::engine::base_game_filesystem::get_name_as_filename ( std::string name ) const { std::string result( name ); std::transform( result.begin(), result.end(), result.begin(), tolower ); const std::string prohibited( " \t<>:\"|/\\?*" ); for (unsigned int i=0; i!=result.size(); ++i) if ( prohibited.find_first_of( result[i] ) != std::string::npos ) result[i] = '_'; claw::text::squeeze( result, "_" ); return result; } // game_local_client::get_game_name_as_filename() plee-the-bear-20251226/bear-engine/core/src/engine/system/code/default_game_filesystem.cpp000066400000000000000000000072741512343254000313650ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::engine::default_game_filesystem class. * \author Julien Jorge */ #include "engine/system/default_game_filesystem.hpp" #include #include #include /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param game_name The name of the game */ bear::engine::default_game_filesystem::default_game_filesystem ( std::string game_name ) : m_game_name( game_name ), m_root( claw::system_info::get_user_directory() ) { } // default_game_filesystem::default_game_filesystem() /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param game_name The name of the game * \param root The root directory where the game files are created. */ bear::engine::default_game_filesystem::default_game_filesystem ( std::string game_name, std::string root ) : m_game_name( game_name ), m_root( root ) { } // default_game_filesystem::default_game_filesystem() /*----------------------------------------------------------------------------*/ /** * \brief Creates a dynamically allocated copy of this instance. */ bear::engine::default_game_filesystem* bear::engine::default_game_filesystem::clone() const { return new default_game_filesystem( *this ); } // default_game_filesystem::clone() /*----------------------------------------------------------------------------*/ /** * \brief Returns the full path of a configuration file of the game. * \param name The name of the configuration file. */ std::string bear::engine::default_game_filesystem::get_custom_config_file_name ( std::string name ) { return get_custom_game_file( name ); } // default_game_filesystem::get_custom_config_file_name() /*----------------------------------------------------------------------------*/ /** * \brief Returns the full path of a file generated by the user in the game. * \param name The name of the file. */ std::string bear::engine::default_game_filesystem::get_custom_data_file_name ( std::string name ) { return get_custom_game_file( name ); } // default_game_filesystem::get_custom_data_file_name() /*----------------------------------------------------------------------------*/ /** * \brief Get the path of a file in the user's game directory. * \param name The name of the file. */ std::string bear::engine::default_game_filesystem::get_custom_game_file ( std::string name ) const { std::string result = get_game_directory(); if ( !result.empty() ) { boost::filesystem::path path( result ); path /= name; result = path.string(); } else result = name; return result; } // default_game_filesystem::get_custom_game_file() /*----------------------------------------------------------------------------*/ /** * \brief Gets, and creates, the personal game directory of the user. */ std::string bear::engine::default_game_filesystem::get_game_directory() const { boost::filesystem::path dir( m_root ); std::string result; std::string subdir = '.' + get_name_as_filename( m_game_name ); dir /= boost::filesystem::path( subdir ); try { boost::filesystem::create_directories(dir); result = dir.string(); } catch( std::exception& e ) { claw::logger << claw::log_error << "Can't create game directory '" << dir.string() << "': " << e.what() << std::endl; } return result; } // default_game_filesystem::get_game_directory() plee-the-bear-20251226/bear-engine/core/src/engine/system/code/default_system_event_manager.cpp000066400000000000000000000056471512343254000324310ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::engine::default_system_event_manager * class. * \author Julien Jorge */ #include "engine/system/default_system_event_manager.hpp" #include "engine/game.hpp" #include /*----------------------------------------------------------------------------*/ /** * \brief Constructs the instance. Setup the event handling with the SDL. */ bear::engine::default_system_event_manager::default_system_event_manager() { SDL_EventState( SDL_WINDOWEVENT, SDL_ENABLE ); SDL_EventState( SDL_QUIT, SDL_ENABLE ); SDL_SetEventFilter( &event_filter, this ); } // default_system_event_manager::default_system_event_manager() /*----------------------------------------------------------------------------*/ /** * \brief Destroys the instance. Cleans up the event handling with the SDL. */ bear::engine::default_system_event_manager::~default_system_event_manager() { SDL_EventFilter current_filter; void* user_data; if ( SDL_GetEventFilter( ¤t_filter, &user_data ) ) if ( ( current_filter == &event_filter ) && ( user_data == this ) ) SDL_SetEventFilter( NULL, NULL ); } // default_system_event_manager::~default_system_event_manager() /*----------------------------------------------------------------------------*/ /** * \brief Processes the pending events. */ void bear::engine::default_system_event_manager::refresh() { SDL_PumpEvents(); } // default_system_event_manager::refresh() /*----------------------------------------------------------------------------*/ /** * \brief Processes an event prepared by the sdl. We handle the application * events and let the SDL to process the others. * \param g The running instance of rp::game. * \param event The event to check. */ int bear::engine::default_system_event_manager::event_filter ( void* user_data, SDL_Event* event ) { int result(0); switch ( event->type ) { case SDL_QUIT: game::get_instance().end(); break; case SDL_WINDOWEVENT: result = process_window_event( event->window ); break; default: result = 1; } return result; } // default_system_event_manager::event_filter() /*----------------------------------------------------------------------------*/ /** * \brief Process an event occuring on the main window. * \param event The event to process. */ int bear::engine::default_system_event_manager::process_window_event ( const SDL_WindowEvent& event ) { switch( event.event ) { case SDL_WINDOWEVENT_MINIMIZED: game::get_instance().sleep(); break; case SDL_WINDOWEVENT_RESTORED: game::get_instance().wake_up(); break; } return 0; } // default_system_event_manager::process_window_event() plee-the-bear-20251226/bear-engine/core/src/engine/system/code/freedesktop_game_filesystem.cpp000066400000000000000000000107721512343254000322510ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::engine::freedesktop_game_filesystem class. * \author Julien Jorge */ #include "engine/system/freedesktop_game_filesystem.hpp" #include #include #include /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param game_name The name of the game */ bear::engine::freedesktop_game_filesystem::freedesktop_game_filesystem ( std::string game_name ) : m_game_name( game_name ) { } // freedesktop_game_filesystem::freedesktop_game_filesystem() /*----------------------------------------------------------------------------*/ /** * \brief Creates a dynamically allocated copy of this instance. */ bear::engine::freedesktop_game_filesystem* bear::engine::freedesktop_game_filesystem::clone() const { return new freedesktop_game_filesystem( *this ); } // freedesktop_game_filesystem::clone() /*----------------------------------------------------------------------------*/ /** * \brief Returns the full path of a configuration file of the game. * \param name The name of the configuration file. */ std::string bear::engine::freedesktop_game_filesystem::get_custom_config_file_name ( std::string name ) { return get_custom_game_file ( name, get_freedesktop_directory( "XDG_CONFIG_HOME", ".config" ) ); } // freedesktop_game_filesystem::get_custom_config_file_name() /*----------------------------------------------------------------------------*/ /** * \brief Returns the full path of a file generated by the user in the game. * \param name The name of the file. */ std::string bear::engine::freedesktop_game_filesystem::get_custom_data_file_name ( std::string name ) { return get_custom_game_file ( name, get_freedesktop_directory( "XDG_DATA_HOME", ".local/share" ) ); } // freedesktop_game_filesystem::get_custom_data_file_name() /*----------------------------------------------------------------------------*/ /** * \brief Get the path of a file in the user's game directory. * \param name The name of the file. * \param dir The directory where the game's directory, containing the file, * will be created. */ std::string bear::engine::freedesktop_game_filesystem::get_custom_game_file ( std::string name, std::string dir ) const { std::string result; const std::string game_directory( get_game_directory(dir) ); if ( !game_directory.empty() ) { boost::filesystem::path path( game_directory ); path /= name; result = path.string(); } else result = name; return result; } // freedesktop_game_filesystem::get_custom_game_file() /*----------------------------------------------------------------------------*/ /** * \brief Gets, and creates, the personal game directory of the user. * \param dir The directory where the game's directory will be created. */ std::string bear::engine::freedesktop_game_filesystem::get_game_directory ( std::string dir ) const { boost::filesystem::path path( dir ); std::string result; std::string subdir = get_name_as_filename( m_game_name ); path /= boost::filesystem::path( subdir ); try { boost::filesystem::create_directories(path); result = path.string(); } catch( std::exception& e ) { claw::logger << claw::log_error << "Can't create game directory '" << path.string() << "': " << e.what() << std::endl; } return result; } // freedesktop_game_filesystem::get_game_directory() /*----------------------------------------------------------------------------*/ /** * \brief Gets, and creates, a directory according to the freedesktop.org * specifications. * \param env The environment variable declaring the directory. * \param default_dir The default directory to use if env is not set, relatively * to the user's home directory. */ std::string bear::engine::freedesktop_game_filesystem::get_freedesktop_directory ( std::string env, std::string default_dir ) const { boost::filesystem::path dir; std::string env_dir( claw::system_info::get_environment(env) ); if ( env_dir.empty() ) dir = boost::filesystem::path( claw::system_info::get_user_directory() ) / default_dir; else dir = env_dir; return dir.string(); } // freedesktop_game_filesystem::get_freedesktop_directory() plee-the-bear-20251226/bear-engine/core/src/engine/system/code/game_filesystem.cpp000066400000000000000000000065121512343254000276530ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::engine::game_filesystem class. * \author Julien Jorge */ #include "engine/system/game_filesystem.hpp" #include "engine/system/base_game_filesystem.hpp" #include /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ bear::engine::game_filesystem::game_filesystem() : m_impl(NULL) { } // game_filesystem::game_filesystem() /*----------------------------------------------------------------------------*/ /** * \brief Copy constructor. * \param that The instance to copy. */ bear::engine::game_filesystem::game_filesystem( const game_filesystem& that ) { if ( that.m_impl == NULL ) m_impl = NULL; else m_impl = that.m_impl->clone(); } // game_filesystem::game_filesystem() /*----------------------------------------------------------------------------*/ /** * \brief Constructor from a given implementation. * \param impl The implementation. */ bear::engine::game_filesystem::game_filesystem ( const base_game_filesystem& impl ) : m_impl( impl.clone() ) { } // game_filesystem::game_filesystem() /*----------------------------------------------------------------------------*/ /** * \brief Destructor. */ bear::engine::game_filesystem::~game_filesystem() { delete m_impl; } // game_filesystem::~game_filesystem() /*----------------------------------------------------------------------------*/ /** * \brief Swap this instance with another one. * \param that The instance to swap with. */ void bear::engine::game_filesystem::swap( game_filesystem& that ) { std::swap( m_impl, that.m_impl ); } // game_filesystem::swap() /*----------------------------------------------------------------------------*/ /** * \brief Assign another instance to this one. * \param that The instance to copy. */ bear::engine::game_filesystem& bear::engine::game_filesystem::operator=( game_filesystem that ) { swap( that ); return *this; } // game_filesystem::operator=() /*----------------------------------------------------------------------------*/ /** * \brief Returns the full path of a configuration file of the game. * \param name The name of the configuration file. */ std::string bear::engine::game_filesystem::get_custom_config_file_name( std::string name ) { CLAW_PRECOND( m_impl != NULL ); return m_impl->get_custom_config_file_name( name ); } // game_filesystem::get_custom_config_file_name() /*----------------------------------------------------------------------------*/ /** * \brief Returns the full path of a file generated by the user in the game. * \param name The name of the file. */ std::string bear::engine::game_filesystem::get_custom_data_file_name( std::string name ) { CLAW_PRECOND( m_impl != NULL ); return m_impl->get_custom_data_file_name( name ); } // game_filesystem::get_custom_data_file_name() namespace std { /** * \brief Swaps the value of two game_filesystems. * \param a One game_filesystem. * \param b Another game_filesystem. */ void swap ( bear::engine::game_filesystem& a, bear::engine::game_filesystem& b ) { a.swap( b ); } // swap() } // namespace std plee-the-bear-20251226/bear-engine/core/src/engine/system/code/system_api_default.cpp000066400000000000000000000021601512343254000303520ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::engine::system_api class for Unix * platforms. * \author Julien Jorge */ #include "engine/system/system_api.hpp" #include #include /*----------------------------------------------------------------------------*/ /** * \brief Opens an object (file, url, …) with the default application. * \param object The object to open. */ void bear::engine::system_api::open( const std::string& object ) { const std::string argument ( boost::algorithm::replace_all_copy( object, "'", "'\"'\"'" ) ); const std::string command("xdg-open '" + argument + "'"); const int exec_result( system(command.c_str()) ); if ( exec_result == -1 ) claw::logger << claw::log_error << "Failed to open '" << object << "' with command: " << command << std::endl; } // system_api::open() plee-the-bear-20251226/bear-engine/core/src/engine/system/code/system_api_windows.cpp000066400000000000000000000016371512343254000304300ustar00rootroot00000000000000#ifdef WIN32 /* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::engine::system_api class for Windows * platforms. * \author Julien Jorge */ #include "engine/system/system_api.hpp" #include #include #include #include /*----------------------------------------------------------------------------*/ /** * \brief Opens an object (file, url, …) with the default application. * \param object The object to open. */ void bear::engine::system_api::open( const std::string& object ) { CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE); ShellExecute(NULL, "open", object.c_str(), NULL, NULL, SW_SHOWDEFAULT); } // system_api::open() #endif plee-the-bear-20251226/bear-engine/core/src/engine/system/default_game_filesystem.hpp000066400000000000000000000032761512343254000304560ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief The default_game_filesystem class is an implementation of the * base_game_filesystem class using a single directory in the user's home * directory. * \author Julien Jorge */ #ifndef __ENGINE_DEFAULT_GAME_FILESYSTEM_HPP__ #define __ENGINE_DEFAULT_GAME_FILESYSTEM_HPP__ #include "engine/system/base_game_filesystem.hpp" namespace bear { namespace engine { /** * \brief The default_game_filesystem class is an implementation of the * base_game_filesystem class using a single directory in the user's * home directory. * \author Julien Jorge */ class ENGINE_EXPORT default_game_filesystem: public base_game_filesystem { public: explicit default_game_filesystem( std::string game_name ); default_game_filesystem( std::string game_name, std::string root ); virtual default_game_filesystem* clone() const; virtual std::string get_custom_config_file_name( std::string name ); virtual std::string get_custom_data_file_name( std::string name ); private: std::string get_custom_game_file( std::string name ) const; std::string get_game_directory() const; private: /** \brief The name of the game. */ const std::string m_game_name; /** brief The root directory where the files are stored. */ std::string m_root; }; // class default_game_filesystem } // namespace engine } // namespace bear #endif // __ENGINE_DEFAULT_GAME_FILESYSTEM_HPP__ plee-the-bear-20251226/bear-engine/core/src/engine/system/default_system_event_manager.hpp000066400000000000000000000024741512343254000315170ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief The default_system_event_manager handles default's application events * and reacts to them by adjusting the behavior of the game. * \author Julien Jorge */ #ifndef __ENGINE_DEFAULT_SYSTEM_EVENT_MANAGER_HPP__ #define __ENGINE_DEFAULT_SYSTEM_EVENT_MANAGER_HPP__ #include "engine/system/base_system_event_manager.hpp" #include namespace bear { namespace engine { /** * \brief The default_system_event_manager handles default's application * events and reacts to them by adjusting the behavior of the game. * \author Julien Jorge */ class ENGINE_EXPORT default_system_event_manager: public base_system_event_manager { public: default_system_event_manager(); ~default_system_event_manager(); void refresh(); private: static int event_filter( void* user_data, SDL_Event* event ); static int process_window_event( const SDL_WindowEvent& event ); }; // class default_system_event_manager } // namespace engine } // namespace bear #endif // __ENGINE_DEFAULT_SYSTEM_EVENT_MANAGER_HPP__ plee-the-bear-20251226/bear-engine/core/src/engine/system/freedesktop_game_filesystem.hpp000066400000000000000000000033021512343254000313330ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief The freedesktop_game_filesystem class is an implementation of the * base_game_filesystem class that follows the specifications of * freedesktop.org. * \author Julien Jorge */ #ifndef __ENGINE_FREEDESKTOP_GAME_FILESYSTEM_HPP__ #define __ENGINE_FREEDESKTOP_GAME_FILESYSTEM_HPP__ #include "engine/system/base_game_filesystem.hpp" namespace bear { namespace engine { /** * \brief The freedesktop_game_filesystem class is an implementation of the * base_game_filesystem class using a single directory in the user's * home directory. * \author Julien Jorge */ class ENGINE_EXPORT freedesktop_game_filesystem: public base_game_filesystem { public: freedesktop_game_filesystem( std::string game_name ); virtual freedesktop_game_filesystem* clone() const; virtual std::string get_custom_config_file_name( std::string name ); virtual std::string get_custom_data_file_name( std::string name ); private: std::string get_custom_game_file( std::string name, std::string dir ) const; std::string get_game_directory( std::string dir ) const; std::string get_freedesktop_directory ( std::string env, std::string default_dir ) const; private: /** \brief The name of the game. */ const std::string m_game_name; }; // class freedesktop_game_filesystem } // namespace engine } // namespace bear #endif // __ENGINE_FREEDESKTOP_GAME_FILESYSTEM_HPP__ plee-the-bear-20251226/bear-engine/core/src/engine/system/game_filesystem.hpp000066400000000000000000000027571512343254000267550ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief This class provides an access to various game related directories * and files. * \author Julien Jorge */ #ifndef __ENGINE_GAME_FILESYSTEM_HPP__ #define __ENGINE_GAME_FILESYSTEM_HPP__ #include "engine/class_export.hpp" #include namespace bear { namespace engine { class base_game_filesystem; /** * \brief This class provides an access to various game related directories * and files. * \author Julien Jorge */ class ENGINE_EXPORT game_filesystem { public: game_filesystem(); game_filesystem( const game_filesystem& that ); game_filesystem( const base_game_filesystem& impl ); ~game_filesystem(); void swap( game_filesystem& that ); game_filesystem& operator=( game_filesystem that ); std::string get_custom_config_file_name( std::string name ); std::string get_custom_data_file_name( std::string name ); private: /** \brief The instance that effectively provides the files. */ base_game_filesystem* m_impl; }; // class game_filesystem } // namespace engine } // namespace bear namespace std { void swap ( bear::engine::game_filesystem& a, bear::engine::game_filesystem& b ); } // namespace std #endif // __ENGINE_GAME_FILESYSTEM_HPP__ plee-the-bear-20251226/bear-engine/core/src/engine/system/system_api.hpp000066400000000000000000000015431512343254000257450ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief The system_api class provides functions to do operations in the system * running the game. * \author Julien Jorge */ #ifndef __ENGINE_SYSTEM_API_HPP__ #define __ENGINE_SYSTEM_API_HPP__ #include "engine/class_export.hpp" #include namespace bear { namespace engine { /** * \brief The system_api class provides functions to do operations in the * system running the game. */ class ENGINE_EXPORT system_api { public: static void open( const std::string& object ); }; // class system_api } // namespace engine } // namespace bear #endif // __ENGINE_SYSTEM_API_HPP__ plee-the-bear-20251226/bear-engine/core/src/engine/transition_effect/000077500000000000000000000000001512343254000252365ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/core/src/engine/transition_effect/code/000077500000000000000000000000001512343254000261505ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/core/src/engine/transition_effect/code/fade_effect.cpp000066400000000000000000000115011512343254000310650ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::engine::fade_effect class. * \author Julien Jorge */ #include "engine/transition_effect/fade_effect.hpp" #include "engine/level.hpp" #include "visual/scene_rectangle.hpp" #include /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ bear::engine::fade_effect::fade_effect() : m_fade_in_duration(1), m_full_duration(0), m_fade_out_duration(0), m_elapsed_time(0), m_opacity(1) { m_color.components.red = 0; m_color.components.green = 0; m_color.components.blue = 0; m_color.components.alpha = std::numeric_limits::max(); } // fade_effect::fade_effect() /*----------------------------------------------------------------------------*/ /** * \brief Tell if the effect is finished. */ bool bear::engine::fade_effect::is_finished() const { return m_elapsed_time >= m_fade_in_duration + m_full_duration + m_fade_out_duration; } // fade_effect::is_finished() /*----------------------------------------------------------------------------*/ /** * \brief Adjust the components of the effect. * \param elapsed_time Elapsed time since the last call. */ bear::universe::time_type bear::engine::fade_effect::progress( universe::time_type elapsed_time ) { universe::time_type result(0); if ( !get_layer().get_level().is_paused() ) { const universe::time_type total_time ( m_fade_in_duration + m_full_duration + m_fade_out_duration ); if ( m_elapsed_time + elapsed_time >= total_time ) { if ( m_elapsed_time < total_time ) result = m_elapsed_time + elapsed_time - total_time; else result = elapsed_time; } m_elapsed_time += elapsed_time; if ( result != elapsed_time ) adjust_opacity(); } return result; } // fade_effect::progress() /*----------------------------------------------------------------------------*/ /** * \brief Render the components of the effect. * \param e (out) The scene elements. */ void bear::engine::fade_effect::render( scene_element_list& e ) const { e.push_back ( visual::scene_rectangle ( 0, 0, m_color, visual::rectangle_type (0, 0, get_layer().get_size().x, get_layer().get_size().y) ) ); } // fade_effect::render() /*----------------------------------------------------------------------------*/ /** * \brief Set the durations of the effect. * \param in How long the fade in is. * \param full How long the full intensity is kept. * \param out How long the fade out is. */ void bear::engine::fade_effect::set_duration ( universe::time_type in, universe::time_type full, universe::time_type out ) { m_fade_in_duration = in; m_full_duration = full; m_fade_out_duration = out; } // fade_effect::set_duration() /*----------------------------------------------------------------------------*/ /** * \brief Set the color of the effect. * \param r Intensity of the red component in [0, 1]. * \param g Intensity of the green component in [0, 1]. * \param b Intensity of the blue component in [0, 1]. */ void bear::engine::fade_effect::set_color( double r, double g, double b ) { const visual::color_type::component_type comp_max ( std::numeric_limits::max() ); m_color.components.red = r * comp_max; m_color.components.green = g * comp_max; m_color.components.blue = b * comp_max; } // fade_effect::set_color() /*----------------------------------------------------------------------------*/ /** * \brief Set the maximum intensity of the effect. * \param o The maximum opacity [0, 1]. */ void bear::engine::fade_effect::set_opacity( double o ) { if ( o < 0 ) o = 0; else if ( o > 1 ) o = 1; m_opacity = o; } // fade_effect::set_opacity() /*----------------------------------------------------------------------------*/ /** * \brief Adjust the opacity of the sprite. */ void bear::engine::fade_effect::adjust_opacity() { double opacity; if ( m_elapsed_time > m_fade_in_duration ) { if ( m_elapsed_time > m_fade_in_duration + m_full_duration ) { const universe::time_type t (m_elapsed_time - m_fade_in_duration - m_full_duration); if ( t >= m_fade_out_duration ) opacity = 0; else opacity = 1 - (t) / m_fade_out_duration; } else opacity = 1; } else opacity = m_elapsed_time / m_fade_in_duration; m_color.components.alpha = opacity * m_opacity * std::numeric_limits::max(); } // fade_effect::adjust_opacity() plee-the-bear-20251226/bear-engine/core/src/engine/transition_effect/code/strip_effect.cpp000066400000000000000000000115171512343254000313360ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::engine::strip_effect class. * \author Julien Jorge */ #include "engine/transition_effect/strip_effect.hpp" #include "engine/level.hpp" #include "visual/scene_rectangle.hpp" #include /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ bear::engine::strip_effect::strip_effect() : m_strip_in_duration(1), m_full_duration(0), m_strip_out_duration(0), m_elapsed_time(0), m_opacity(1), m_height(100) { m_color.components.red = 0; m_color.components.green = 0; m_color.components.blue = 0; m_color.components.alpha = std::numeric_limits::max(); } // strip_effect::strip_effect() /*----------------------------------------------------------------------------*/ /** * \brief Tell if the effect is finished. */ bool bear::engine::strip_effect::is_finished() const { return m_elapsed_time >= m_strip_in_duration + m_full_duration + m_strip_out_duration; } // strip_effect::is_finished() /*----------------------------------------------------------------------------*/ /** * \brief Adjust the components of the effect. * \param elapsed_time Elapsed time since the last call. */ bear::universe::time_type bear::engine::strip_effect::progress( universe::time_type elapsed_time ) { universe::time_type result(0); if ( !get_layer().get_level().is_paused() ) { const universe::time_type total_time ( m_strip_in_duration + m_full_duration + m_strip_out_duration ); if ( m_elapsed_time + elapsed_time >= total_time ) { if ( m_elapsed_time < total_time ) result = m_elapsed_time + elapsed_time - total_time; else result = elapsed_time; } m_elapsed_time += elapsed_time; } return result; } // strip_effect::progress() /*----------------------------------------------------------------------------*/ /** * \brief Render the components of the effect. * \param e (out) The scene elements. */ void bear::engine::strip_effect::render( scene_element_list& e ) const { visual::coordinate_type h(m_height); if ( m_elapsed_time >= m_strip_in_duration + m_full_duration + m_strip_out_duration ) return; if ( m_elapsed_time < m_strip_in_duration ) h = m_height * m_elapsed_time / m_strip_in_duration; else if ( m_elapsed_time > m_strip_in_duration + m_full_duration ) h = m_height * ( 1 - ( (m_elapsed_time - m_strip_in_duration - m_full_duration) / m_strip_out_duration ) ); e.push_back ( visual::scene_rectangle ( 0, 0, m_color, visual::rectangle_type(0, 0, get_layer().get_size().x, h) ) ); e.push_back ( visual::scene_rectangle ( 0, get_layer().get_size().y - h, m_color, visual::rectangle_type(0, 0, get_layer().get_size().x, h) ) ); } // strip_effect::render() /*----------------------------------------------------------------------------*/ /** * \brief Set the durations of the effect. * \param in How long the fade in is. * \param full How long the full intensity is kept. * \param out How long the fade out is. */ void bear::engine::strip_effect::set_duration ( universe::time_type in, universe::time_type full, universe::time_type out ) { m_strip_in_duration = in; m_full_duration = full; m_strip_out_duration = out; } // strip_effect::set_duration() /*----------------------------------------------------------------------------*/ /** * \brief Set the color of the effect. * \param r Intensity of the red component in [0, 1]. * \param g Intensity of the green component in [0, 1]. * \param b Intensity of the blue component in [0, 1]. */ void bear::engine::strip_effect::set_color( double r, double g, double b ) { const visual::color_type::component_type comp_max ( std::numeric_limits::max() ); m_color.components.red = r * comp_max; m_color.components.green = g * comp_max; m_color.components.blue = b * comp_max; } // strip_effect::set_color() /*----------------------------------------------------------------------------*/ /** * \brief Set the maximum intensity of the effect. * \param o The maximum opacity [0, 1]. */ void bear::engine::strip_effect::set_opacity( double o ) { if ( o < 0 ) o = 0; else if ( o > 1 ) o = 1; m_opacity = o; } // strip_effect::set_opacity() /*----------------------------------------------------------------------------*/ /** * \brief Set the height of the strips. * \param h The height of the strips. */ void bear::engine::strip_effect::set_strip_height( visual::coordinate_type h ) { m_height = h; } // strip_effect::set_strip_height() plee-the-bear-20251226/bear-engine/core/src/engine/transition_effect/code/transition_effect.cpp000066400000000000000000000063721512343254000323720ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implmentation of the bear::engine::transition_effect class. * \author Julien Jorge */ #include "engine/transition_effect/transition_effect.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ bear::engine::transition_effect::transition_effect() : m_layer(NULL) { } // transition_effect::transition_effect() /*----------------------------------------------------------------------------*/ /** * \brief Destructor. */ bear::engine::transition_effect::~transition_effect() { // nothing to do } // transition_effect::~transition_effect() /*----------------------------------------------------------------------------*/ /** * \brief Set the layer displaying the effect. * \param lay The layer. */ void bear::engine::transition_effect::set_layer( gui_layer& lay ) { m_layer = &lay; } // transition_effect::set_layer() /*----------------------------------------------------------------------------*/ /** * \brief Tell if the effect is finished. */ bool bear::engine::transition_effect::is_finished() const { return true; } // transition_effect::is_finished() /*----------------------------------------------------------------------------*/ /** * \brief Initialise the effect. */ void bear::engine::transition_effect::build() { // nothing to do } // transition_effect::build() /*----------------------------------------------------------------------------*/ /** * \brief Progress the effect. * \param elapsed_time Elapsed time since the last call. * \return The remaining time on \a elapsed_time at the end of the progress. */ bear::universe::time_type bear::engine::transition_effect::progress( universe::time_type elapsed_time ) { return elapsed_time; } // transition_effect::progress() /*----------------------------------------------------------------------------*/ /** * \brief Render the components of the effect. * \param e (out) The scene elements. */ void bear::engine::transition_effect::render( scene_element_list& e ) const { // nothing to do } // transition_effect::render() /*----------------------------------------------------------------------------*/ /** * \brief Get the level globals of the level in which the layer owning the * effect is. */ bear::engine::level_globals& bear::engine::transition_effect::get_level_globals() const { return get_layer().get_level_globals(); } // transition_effect::get_level_globals() /*----------------------------------------------------------------------------*/ /** * \brief Get the layer in which the effect is. */ const bear::engine::gui_layer& bear::engine::transition_effect::get_layer() const { CLAW_PRECOND( m_layer != NULL ); return *m_layer; } // transition_effect::get_layer() /*----------------------------------------------------------------------------*/ /** * \brief Get the level in which the layer owning the effect is. */ const bear::engine::level& bear::engine::transition_effect::get_level() const { CLAW_PRECOND( m_layer != NULL ); return m_layer->get_level(); } // transition_effect::get_level() plee-the-bear-20251226/bear-engine/core/src/engine/transition_effect/fade_effect.hpp000066400000000000000000000036131512343254000301650ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A color fading in and out. * \author Julien Jorge */ #ifndef __BEAR_ENGINE_FADE_EFFECT_HPP__ #define __BEAR_ENGINE_FADE_EFFECT_HPP__ #include "engine/transition_effect/transition_effect.hpp" namespace bear { namespace engine { /** * \brief A color fading in and out. * \author Julien Jorge */ class ENGINE_EXPORT fade_effect: public transition_effect { public: /** \brief The type of a list of scene elements retrieved from the layer. */ typedef std::list scene_element_list; public: fade_effect(); bool is_finished() const; universe::time_type progress( bear::universe::time_type elapsed_time ); void render( scene_element_list& e ) const; void set_duration ( universe::time_type in, universe::time_type full, universe::time_type out ); void set_color( double r, double g, double b ); void set_opacity( double o ); private: void adjust_opacity(); private: /** \brief How long the fade in is. */ universe::time_type m_fade_in_duration; /** \brief How long the full intensity is kept. */ universe::time_type m_full_duration; /** \brief How long the fade out is. */ universe::time_type m_fade_out_duration; /** \brief Elapsed time since the effect was created. */ universe::time_type m_elapsed_time; /** \brief The color displayed. */ visual::color_type m_color; /** \brief The opacity of at the maximum intensity. */ double m_opacity; }; // class fade_effect } // namepspace engine } // namespace bear #endif // __BEAR_ENGINE_FADE_EFFECT_HPP__ plee-the-bear-20251226/bear-engine/core/src/engine/transition_effect/strip_effect.hpp000066400000000000000000000041261512343254000304270ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Add a strip at the top and the bottom of the screen. * \author Julien Jorge */ #ifndef __BEAR_ENGINE_STRIP_EFFECT_HPP__ #define __BEAR_ENGINE_STRIP_EFFECT_HPP__ #include "engine/transition_effect/transition_effect.hpp" namespace bear { namespace engine { /** * \brief Add a strip at the top and the bottom of the screen. * \author Julien Jorge */ class ENGINE_EXPORT strip_effect: public transition_effect { public: /** \brief The type of a list of scene elements retrieved from the layer. */ typedef std::list scene_element_list; public: strip_effect(); bool is_finished() const; universe::time_type progress( bear::universe::time_type elapsed_time ); void render( scene_element_list& e ) const; void set_duration ( universe::time_type in, universe::time_type full, universe::time_type out ); void set_color( double r, double g, double b ); void set_opacity( double o ); void set_strip_height( visual::coordinate_type h ); private: /** \brief How long does it take to the strips to appear. */ universe::time_type m_strip_in_duration; /** \brief How long the strips are fully visible. */ universe::time_type m_full_duration; /** \brief How long does it take to the strips to disapear. */ universe::time_type m_strip_out_duration; /** \brief Elapsed time since the effect was created. */ universe::time_type m_elapsed_time; /** \brief The color displayed. */ visual::color_type m_color; /** \brief The opacity of at the maximum intensity. */ double m_opacity; /** \brief The height of the strips. */ visual::coordinate_type m_height; }; // class strip_effect } // namepspace engine } // namespace bear #endif // __BEAR_ENGINE_STRIP_EFFECT_HPP__ plee-the-bear-20251226/bear-engine/core/src/engine/transition_effect/transition_effect.hpp000066400000000000000000000031761512343254000314640ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief The base class for the effects of the transition_layer. * \author Julien Jorge */ #ifndef __BEAR_ENGINE_TRANSITION_EFFECT_HPP__ #define __BEAR_ENGINE_TRANSITION_EFFECT_HPP__ #include "universe/types.hpp" #include "input/input_listener.hpp" #include "engine/layer/gui_layer.hpp" #include "engine/class_export.hpp" namespace bear { namespace engine { class level; /** * \brief The base class for the effects of the transition_layer. * \author Julien Jorge */ class ENGINE_EXPORT transition_effect: public input::input_listener { public: /** \brief The type of a list of scene elements retrieved from the layer. */ typedef gui_layer::scene_element_list scene_element_list; public: transition_effect(); virtual ~transition_effect(); void set_layer( gui_layer& lay ); virtual bool is_finished() const; virtual void build(); virtual universe::time_type progress( universe::time_type elapsed_time ); virtual void render( scene_element_list& e ) const; protected: level_globals& get_level_globals() const; const gui_layer& get_layer() const; const level& get_level() const; private: /** \brief The layer that displays the effect. */ gui_layer* m_layer; }; // class transition_effect } // namespace engine } // namespace bear #endif // __BEAR_ENGINE_TRANSITION_EFFECT_HPP__ plee-the-bear-20251226/bear-engine/core/src/engine/variable/000077500000000000000000000000001512343254000233155ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/core/src/engine/variable/base_variable.hpp000066400000000000000000000022101512343254000266000ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief This class represent a level variable or a game variable. * \author Julien Jorge */ #ifndef __ENGINE_BASE_VARIABLE_HPP__ #define __ENGINE_BASE_VARIABLE_HPP__ #include "engine/class_export.hpp" #include "engine/variable/var_map.hpp" namespace bear { namespace engine { /** * \brief The base class for a level variable or a game variable. * \author Julien Jorge */ class ENGINE_EXPORT base_variable { public: explicit base_variable( const std::string& name ); const std::string& get_name() const; virtual void assign_value_to( var_map& m ) const = 0; virtual void get_value_from( const var_map& m ) = 0; virtual bool exists( const var_map& m ) const = 0; private: /** \brief The name of the variable. */ const std::string m_name; }; // class base_variable; } // namespace engine } // namespace bear #endif // __ENGINE_BASE_VARIABLE_HPP__ plee-the-bear-20251226/bear-engine/core/src/engine/variable/code/000077500000000000000000000000001512343254000242275ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/core/src/engine/variable/code/base_variable.cpp000066400000000000000000000015621512343254000275160ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::engine::base_variable class. * \author Julien Jorge */ #include "engine/variable/base_variable.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param name The name of the variable. */ bear::engine::base_variable::base_variable( const std::string& name ) : m_name(name) { } // base_variable::base_variable() /*----------------------------------------------------------------------------*/ /** * \brief Get the name of the variable. */ const std::string& bear::engine::base_variable::get_name() const { return m_name; } // base_variable::get_name() plee-the-bear-20251226/bear-engine/core/src/engine/variable/code/type_to_string.cpp000066400000000000000000000013701512343254000300050ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the specialisations of the * bear::engine::type_to_string class. * \author Julien Jorge */ #include "engine/variable/type_to_string.hpp" const char* const bear::engine::type_to_string::value = "int"; const char* const bear::engine::type_to_string::value = "uint"; const char* const bear::engine::type_to_string::value = "bool"; const char* const bear::engine::type_to_string::value = "string"; const char* const bear::engine::type_to_string::value = "real"; plee-the-bear-20251226/bear-engine/core/src/engine/variable/code/var_map.cpp000066400000000000000000000105131512343254000263600ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the template methods of bear::engine::var_map. * \author Julien Jorge */ #include "engine/variable/var_map.hpp" #include /*----------------------------------------------------------------------------*/ /** * \brief Call delete on a pointer to boost::signal. */ template void bear::engine::var_map::delete_signal::operator() ( const std::string& name, boost::signals2::signal* value ) const { delete value; } // var_map::delete_signal::operator()() /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param m The map in which the signals are searched. */ bear::engine::var_map::trigger_signal::trigger_signal( const signal_map& m ) : m_signals(m) { // nothing to do } // var_map::trigger_signal::trigger_signal() /*----------------------------------------------------------------------------*/ /** * \brief Trigger the signal corresponding to a given variable. * \param name The name of the variable. * \param value The value of the variable. */ template void bear::engine::var_map::trigger_signal::operator() ( const std::string& name, const T& value ) const { typedef boost::signals2::signal* signal_type; if ( m_signals.exists(name) ) (*m_signals.get(name))(value); } // trigger_signal::operator()() /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param m The map used as the reference for the variables to keep. * \param s The map in which the signals are searched. */ bear::engine::var_map::delete_signal_not_in::delete_signal_not_in ( const var_map& m, signal_map& s ) : m_map(m), m_signals(s) { // nothing to do } // var_map::delete_signal_not_in::delete_signal_not_in() /*----------------------------------------------------------------------------*/ /** * \brief Delete the signal associated with a variable, if needed. * \param name The name of the variable. * \param value The value of the variable. * * If there is no variable named \a name in m_map, the signal associated with * \a name in m_signals, if any, is deleted and removed. */ template void bear::engine::var_map::delete_signal_not_in::operator() ( const std::string& name, const T& value ) const { if ( !m_map.exists(name) ) { typedef boost::signals2::signal* signal_type; if ( m_signals.exists(name) ) { delete m_signals.get(name); m_signals.erase(name); } } } // var_map::delete_signal_not_in::operator()() /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ bear::engine::var_map::var_map() { // nothing to do } // var_map::var_map() /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ bear::engine::var_map::~var_map() { claw::multi_type_map_visitor v; delete_signal f; v.run( m_signals, f ); } // var_map::~var_map() /*----------------------------------------------------------------------------*/ /** * \brief Copy constructor. * \param that The instance to copy from. */ bear::engine::var_map::var_map( const var_map& that ) : super(that) { } // var_map() /*----------------------------------------------------------------------------*/ /** * \brief Assignment operator. * \param that The instance to copy from. */ bear::engine::var_map& bear::engine::var_map::operator=( const var_map& that ) { /// \todo Trigger a signal for the deleted variables too. claw::multi_type_map_visitor v; delete_signal_not_in remove(that, m_signals); v.run(*(super*)this, remove); super::operator=(that); trigger_signal update(m_signals); v.run((super&)that, update); return *this; } // var_map::operator=() /*----------------------------------------------------------------------------*/ /** * \brief Copy all the values of an other map. * \param m The other map. */ void bear::engine::var_map::set( const var_map& m ) { super::set(m); } // set() plee-the-bear-20251226/bear-engine/core/src/engine/variable/code/variable_copy.cpp000066400000000000000000000025351512343254000275570ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::engine::variable_copy class. * \author Sebastien Angibaud */ #include "engine/variable/variable_copy.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param os The stream in which the result will be written. * \param pattern A regular expression that must be verified by the variable's * name to be serialised. */ bear::engine::variable_copy::variable_copy ( var_map& vars, const boost::regex& pattern ) : m_vars(vars), m_pattern(pattern) { } // variable_copy::variable_copy() /*----------------------------------------------------------------------------*/ /** * \brief Escape value to avoid ambiguity. * \param value The value to escape. */ std::string bear::engine::variable_copy::escape( const std::string& value ) const { std::string result; result.reserve(value.size()); for (std::size_t i=0; i!=value.length(); ++i) switch( value[i] ) { case '"': case '\\': result += '\\'; /* no break */ default: result += value[i]; } return result; } // variable_copy::escape() plee-the-bear-20251226/bear-engine/core/src/engine/variable/code/variable_eraser.cpp000066400000000000000000000014351512343254000300640ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::engine::variable_eraser class. * \author Julien Jorge */ #include "engine/variable/variable_eraser.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param m The map from which the variable is erased. * \param pattern A regular expression that must be verified by the variable's * name to be erased. */ bear::engine::variable_eraser::variable_eraser ( var_map& m, boost::regex pattern ) : m_map(m), m_pattern(pattern) { } // variable_eraser::variable_eraser() plee-the-bear-20251226/bear-engine/core/src/engine/variable/code/variable_list_reader.cpp000066400000000000000000000126671512343254000311110ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::engine::variable_list_reader class. * \author Julien Jorge */ #include "engine/variable/variable_list_reader.hpp" #include "engine/variable/type_to_string.hpp" #include #include #include /*----------------------------------------------------------------------------*/ /** * \brief Read a set of variable assignment from a stream. * \param iss The stream from which the assignments are read. * \param output The var_map in which the variables are inserted. */ void bear::engine::variable_list_reader::operator() ( std::istream& iss, var_map& output ) const { std::stringstream data; data << iss.rdbuf(); typedef boost::spirit::classic::phrase_scanner_t scanner_type; typedef boost::spirit::classic::parse_info parse_info; typedef boost::spirit::classic::rule rule_type; rule_type identifier = boost::spirit::classic::lexeme_d [ (boost::spirit::classic::alpha_p | '_') >> *(boost::spirit::classic::alnum_p | '_') ]; rule_type string = boost::spirit::classic::lexeme_d [ *(boost::spirit::classic::strlit<>("\\\"") | (boost::spirit::classic::anychar_p - '"') ) ]; std::string type; std::string name; std::string value; rule_type assignment = identifier[boost::spirit::classic::assign_a(type)] >> boost::spirit::classic::lexeme_d [ boost::spirit::classic::ch_p('"') >> string[boost::spirit::classic::assign_a(name)] >> boost::spirit::classic::ch_p('"') ] >> boost::spirit::classic::ch_p('=') >> boost::spirit::classic::lexeme_d [ boost::spirit::classic::ch_p('"') >> string[boost::spirit::classic::assign_a(value)] >> boost::spirit::classic::ch_p('"') ] >> boost::spirit::classic::ch_p(';') [boost::bind (&variable_list_reader::apply, this, boost::ref(output), boost::ref(type), boost::ref(name), boost::ref(value))] ; parse_info result = boost::spirit::classic::parse ( data.str().c_str(), *assignment >> boost::spirit::classic::end_p, boost::spirit::classic::space_p ); if ( !result.full ) claw::logger << claw::log_error << "Failed to read variable assignments from the stream." << " Last variable is '" << name << "'." << std::endl; } // variable_list_reader::operator()() /*----------------------------------------------------------------------------*/ /** * \brief Add the game variable in a var_map. * \param v The var_map in which the variable is added. * \param type The type of the variable. * \param name The name of the variable. * \param value The value of the variable. */ void bear::engine::variable_list_reader::apply ( var_map& v, const std::string& type, const std::string& name, const std::string& value ) const { if ( type == "bool" ) add_variable( v, name, value ); else if ( type == "int" ) add_variable( v, name, value ); else if ( type == "uint" ) add_variable( v, name, value ); else if ( type == "real" ) add_variable( v, name, value ); else if ( type == "string" ) add_string_variable( v, name, value ); else claw::logger << claw::log_error << "Unknown type '" << type << "' (assigning variable '" << name << "')." << std::endl; } // variable_list_reader::apply() /*----------------------------------------------------------------------------*/ /** * \brief Remove the escaped sequences from a string. * \param s The string to process. */ std::string bear::engine::variable_list_reader::unescape ( const std::string& s ) const { bool escape = false; std::string result; result.reserve(s.size()); for ( std::size_t i=0; i!=s.length(); ++i ) if ( !escape && (s[i] == '\\') ) escape = true; else { result += s[i]; escape = false; } return result; } // variable_list_reader::unescape() /*----------------------------------------------------------------------------*/ /** * \brief Add the game variable of type string in a var_map. * \param v The var_map in which the variable is added. * \param name The name of the variable. * \param value The value of the variable. */ void bear::engine::variable_list_reader::add_string_variable ( var_map& v, const std::string& name, const std::string& value ) const { v.set( unescape(name), unescape(value) ); } // variable_list_reader::add_string_variable() /*----------------------------------------------------------------------------*/ /** * \brief Add the game variable in a var_map. * \param v The var_map in which the variable is added. * \param name The name of the variable. * \param value The value of the variable. */ template void bear::engine::variable_list_reader::add_variable ( var_map& v, const std::string& name, const std::string& value ) const { std::istringstream iss(value); T val; iss >> val; if ( iss.eof() ) v.set( unescape(name), val ); else claw::logger << claw::log_error << '\'' << value << "' is not of type '" << type_to_string::value << "' (assigning variable '" << name << "')." << std::endl; } // variable_list_reader::add_variable() plee-the-bear-20251226/bear-engine/core/src/engine/variable/code/variable_saver.cpp000066400000000000000000000025331512343254000277230ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::engine::variable_saver class. * \author Julien Jorge */ #include "engine/variable/variable_saver.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param os The stream in which the result will be written. * \param pattern A regular expression that must be verified by the variable's * name to be serialised. */ bear::engine::variable_saver::variable_saver ( std::ostream& os, boost::regex pattern ) : m_output(os), m_pattern(pattern) { } // variable_saver::variable_saver() /*----------------------------------------------------------------------------*/ /** * \brief Escape value to avoid ambiguity. * \param value The value to escape. */ std::string bear::engine::variable_saver::escape( const std::string& value ) const { std::string result; result.reserve(value.size()); for (std::size_t i=0; i!=value.length(); ++i) switch( value[i] ) { case '"': case '\\': result += '\\'; /* no break */ default: result += value[i]; } return result; } // variable_saver::escape() plee-the-bear-20251226/bear-engine/core/src/engine/variable/impl/000077500000000000000000000000001512343254000242565ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/core/src/engine/variable/impl/var_map.tpp000066400000000000000000000041621512343254000264330ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the template methods of bear::engine::var_map. * \author Julien Jorge */ #include #include /*----------------------------------------------------------------------------*/ /** * \brief Get a signal to connect to be informed when the value of a given * variable change. * \param name The name of the variable to listen. */ template boost::signals2::signal& bear::engine::var_map::variable_changed( const std::string& name ) { typedef boost::signals2::signal signal_type; if ( !m_signals.exists(name) ) m_signals.set( name, new signal_type() ); return *m_signals.get(name); } // var_map::variable_changed() /*----------------------------------------------------------------------------*/ /** * \brief Set the value of a given variable. * \param k The name of the variable. * \param v The new value of the variable. */ template void bear::engine::var_map::set( const std::string& k, const T& v ) { bool signal = true; if ( exists(k) ) { T old_value = get(k); super::set(k, v); signal = ( old_value != v ); } else super::set(k, v); typedef boost::signals2::signal signal_type; if ( signal && m_signals.exists(k) ) (*m_signals.get(k))(v); } // var_map::set() /*----------------------------------------------------------------------------*/ /** * \brief Apply a function on each entry. * \param f The template function to call. The first argument must be compatible * with std::string and the second one must be a parameter of the * template. */ template void bear::engine::var_map::for_each( Function f ) { claw::multi_type_map_visitor visitor; visitor.run( *(super*)this, f ); } // var_map::for_each() plee-the-bear-20251226/bear-engine/core/src/engine/variable/impl/variable.tpp000066400000000000000000000045511512343254000265750ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the template methods of the * bear::engine::variable class. * \author Julien Jorge */ #include /*----------------------------------------------------------------------------*/ /** * \brief Constructor * \param name The name of the variable. */ template bear::engine::variable::variable( const std::string& name ) : base_variable(name) { } // variable::variable() /*----------------------------------------------------------------------------*/ /** * \brief Constructor * \param name The name of the variable. * \param val The value of the variable. */ template bear::engine::variable::variable( const std::string& name, const T& val ) : base_variable(name), m_value(val) { } // variable::variable() /*----------------------------------------------------------------------------*/ /** * \brief Get the value of the variable. */ template const T& bear::engine::variable::get_value() const { return m_value; } // variable::get_value() /*----------------------------------------------------------------------------*/ /** * \brief Assign the value to the variable in a var_map. * \param m The var_map in which the value is to be set. */ template void bear::engine::variable::assign_value_to( var_map& m ) const { m.set( this->get_name(), m_value ); } // variable::assign_value_to() /*----------------------------------------------------------------------------*/ /** * \brief Get the value to the variable from a var_map. * \param m The var_map in which the value is taken. */ template void bear::engine::variable::get_value_from( const var_map& m ) { CLAW_PRECOND( exists(m) ); m_value = m.get( this->get_name() ); } // variable::get_value_from() /*----------------------------------------------------------------------------*/ /** * \brief Tell if there is a value associated with the variable's name in a * var_map. * \param m The var_map in which the value is checked. */ template bool bear::engine::variable::exists( const var_map& m ) const { return m.exists( this->get_name() ); } // variable::exists() plee-the-bear-20251226/bear-engine/core/src/engine/variable/impl/variable_copy.tpp000066400000000000000000000024421512343254000276240ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the template methods of the * bear::engine::variable_copy class. * \author Sebastien Angibaud */ #include "engine/variable/type_to_string.hpp" #include "engine/variable/variable.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Save a variable's value. * \param name The name of the variable. * \param value The value of the variable. */ template void bear::engine::variable_copy::operator() ( const std::string& name, const T& value ) const { if ( boost::regex_match(name, m_pattern) ) { bear::engine::variable var( escape(name), escape(value) ); var.assign_value_to(m_vars); } } // variable_copy::operator() /*----------------------------------------------------------------------------*/ /** * \brief Escape value to avoid ambiguity. * \param value The value to escape. * \remark There is nothing to do by default. */ template const T& bear::engine::variable_copy::escape( const T& value ) const { return value; } // variable_copy::escape() plee-the-bear-20251226/bear-engine/core/src/engine/variable/impl/variable_eraser.tpp000066400000000000000000000015231512343254000301320ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the template methods of the * bear::engine::variable_eraser class. * \author Julien Jorge */ #include "engine/variable/type_to_string.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Erase a variable if the pattern match her name. * \param name The name of the variable. * \param value The value of the variable. */ template void bear::engine::variable_eraser::operator() ( const std::string& name, const T& value ) const { if ( boost::regex_match(name, m_pattern) ) m_map.erase(name); } // variable_eraser::operator() plee-the-bear-20251226/bear-engine/core/src/engine/variable/impl/variable_saver.tpp000066400000000000000000000024061512343254000277720ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the template methods of the * bear::engine::variable_saver class. * \author Julien Jorge */ #include "engine/variable/type_to_string.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Save a variable's value. * \param name The name of the variable. * \param value The value of the variable. */ template void bear::engine::variable_saver::operator() ( const std::string& name, const T& value ) const { if ( boost::regex_match(name, m_pattern) ) m_output << type_to_string::value << " \"" << escape(name) << "\" = \"" << escape(value) << "\";" << std::endl; } // variable_saver::operator() /*----------------------------------------------------------------------------*/ /** * \brief Escape value to avoid ambiguity. * \param value The value to escape. * \remark There is nothing to do by default. */ template const T& bear::engine::variable_saver::escape( const T& value ) const { return value; } // variable_saver::escape() plee-the-bear-20251226/bear-engine/core/src/engine/variable/type_to_string.hpp000066400000000000000000000043421512343254000271020ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Converts a type into its string representation as used for the * serialisation of variables. * \author Julien Jorge */ #ifndef __ENGINE_TYPE_TO_STRING_HPP__ #define __ENGINE_TYPE_TO_STRING_HPP__ #include namespace bear { namespace engine { /** * \brief Converts a type into its string representation as used for the * serialisation of variables. * \author Julien Jorge */ template class type_to_string; /** * \brief Specialization for type int. * \author Julien Jorge */ template<> class type_to_string { public: /** \brief The string representation of the type. */ static const char* const value; }; // class type_to_string [int] /** * \brief Specialization for type unsigned int. * \author Julien Jorge */ template<> class type_to_string { public: /** \brief The string representation of the type. */ static const char* const value; }; // class type_to_string [unsigned int] /** * \brief Specialization for type bool. * \author Julien Jorge */ template<> class type_to_string { public: /** \brief The string representation of the type. */ static const char* const value; }; // class type_to_string [bool] /** * \brief Specialization for type std::string. * \author Julien Jorge */ template<> class type_to_string { public: /** \brief The string representation of the type. */ static const char* const value; }; // class type_to_string [] /** * \brief Specialization for type double. * \author Julien Jorge */ template<> class type_to_string { public: /** \brief The string representation of the type. */ static const char* const value; }; // class type_to_string [double] } // namespace engine } // namespace bear #endif // __ENGINE_TYPE_TO_STRING_HPP__ plee-the-bear-20251226/bear-engine/core/src/engine/variable/var_map.hpp000066400000000000000000000076131512343254000254620ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief The structure in which we store the level variables or game variables. * \author Julien Jorge */ #ifndef __ENGINE_VAR_MAP_HPP__ #define __ENGINE_VAR_MAP_HPP__ #include "engine/class_export.hpp" #include #include #include #include #include namespace bear { namespace engine { /** \brief The types supported by the engine. */ typedef claw::meta::type_list_maker ::result var_types; /** * \brief The structure in which we store the level variables or game * variables. */ class ENGINE_EXPORT var_map: public claw::multi_type_map { private: /** \brief The type of the parent map. */ typedef claw::multi_type_map super; /** \brief The types of the signals used to observe the variables. */ typedef claw::meta::type_list_maker < boost::signals2::signal*, boost::signals2::signal*, boost::signals2::signal*, boost::signals2::signal*, boost::signals2::signal* >::result signal_types; /** * \brief The map containing the signals associated with the variables. */ typedef claw::multi_type_map signal_map; /** * \brief A function object that deletes the signal associated with a * variable. * \author Julien Jorge */ class delete_signal { public: template void operator() ( const std::string& name, boost::signals2::signal* value ) const; }; // class delete_signal /** * \brief A function object that triggers the signal associated with a * variable. * \author Julien Jorge */ class trigger_signal { public: trigger_signal( const signal_map& m ); template void operator() ( const std::string& name, const T& value ) const; private: /** \brief The map in which the signals are searched. */ const signal_map& m_signals; }; // class trigger_signal /** * \brief A function object that deletes the the signals for the variables * not declared in a given var_map. * \author Julien Jorge */ class delete_signal_not_in { public: delete_signal_not_in( const var_map& m, signal_map& s ); template void operator() ( const std::string& name, const T& value ) const; private: /** \brief The var_map in which the variables are searched. */ const var_map& m_map; /** \brief The map in which the signals are searched. */ signal_map& m_signals; }; // class delete_signal_not_in() public: var_map(); ~var_map(); var_map( const var_map& that ); var_map& operator=( const var_map& that ); template boost::signals2::signal& variable_changed( const std::string& name ); template void set( const std::string& k, const T& v ); void set( const var_map& m ); template void for_each( Function f ); private: /** \brief The signals triggered when the value of a variable change. */ signal_map m_signals; }; // class var_map } // namespace engine } // namespace bear #include "engine/variable/impl/var_map.tpp" #endif // __ENGINE_VAR_MAP_HPP__ plee-the-bear-20251226/bear-engine/core/src/engine/variable/variable.hpp000066400000000000000000000023021512343254000256100ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief This class represent a level variable or a game variable. * \author Julien Jorge */ #ifndef __ENGINE_VARIABLE_HPP__ #define __ENGINE_VARIABLE_HPP__ #include "engine/variable/base_variable.hpp" #include "engine/variable/var_map.hpp" namespace bear { namespace engine { /** * \brief A variable of a known type. * \author Julien Jorge */ template class variable: public base_variable { public: explicit variable( const std::string& name ); variable( const std::string& name, const T& val ); const T& get_value() const; virtual void assign_value_to( var_map& m ) const; virtual void get_value_from( const var_map& m ); virtual bool exists( const var_map& m ) const; private: /** \brief The value of the variable. */ T m_value; }; // class variable } // namespace engine } // namespace bear #include "engine/variable/impl/variable.tpp" #endif // __ENGINE_VARIABLE_HPP__ plee-the-bear-20251226/bear-engine/core/src/engine/variable/variable_copy.hpp000066400000000000000000000026061512343254000266510ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A function object that copies a variable in a var map. * \author Sebastien Angibaud */ #ifndef __ENGINE_VARIABLE_COPY_HPP__ #define __ENGINE_VARIABLE_COPY_HPP__ #include #include "engine/variable/var_map.hpp" namespace bear { namespace engine { /** * \brief A function object that copies a variable in a var map. * \author Sebastien Angibaud */ class ENGINE_EXPORT variable_copy { public: explicit variable_copy( var_map& vars, const boost::regex& pattern ); template void operator()( const std::string& name, const T& value ) const; private: template const T& escape( const T& value ) const; std::string escape( const std::string& value ) const; private: /** \brief The var map in which we copy varaiable. */ var_map& m_vars; /** \brief A regular expression that must be verified by the variable's name to be serialised. */ const boost::regex& m_pattern; }; // class variable_copy } // namespace engine } // namespace bear #include "engine/variable/impl/variable_copy.tpp" #endif // __ENGINE_VARIABLE_COPY_HPP__ plee-the-bear-20251226/bear-engine/core/src/engine/variable/variable_eraser.hpp000066400000000000000000000024631512343254000271610ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A function object that erases the variables whose name match a given * pattern. * \author Julien Jorge */ #ifndef __ENGINE_VARIABLE_ERASER_HPP__ #define __ENGINE_VARIABLE_ERASER_HPP__ #include "engine/variable/var_map.hpp" #include namespace bear { namespace engine { /** * \brief A function object that erases the variables whose name match a * given pattern. * \author Julien Jorge */ class ENGINE_EXPORT variable_eraser { public: explicit variable_eraser( var_map& m, boost::regex pattern ); template void operator()( const std::string& name, const T& value ) const; private: /** \brief The map from which the variables are erased. */ var_map& m_map; /** \brief A regular expression that must be verified by the variable's name to be serialised. */ const boost::regex m_pattern; }; // class variable_eraser } // namespace engine } // namespace bear #include "engine/variable/impl/variable_eraser.tpp" #endif // __ENGINE_VARIABLE_ERASER_HPP__ plee-the-bear-20251226/bear-engine/core/src/engine/variable/variable_list_reader.hpp000066400000000000000000000025611512343254000301740ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A function object that reads a list of variable assignments as saved * with a variable_saver. * \author Julien Jorge */ #ifndef __ENGINE_VARIABLE_LIST_READER_HPP__ #define __ENGINE_VARIABLE_LIST_READER_HPP__ #include "engine/variable/var_map.hpp" namespace bear { namespace engine { /** * \brief A function object that reads a list of variable assignments as * saved with a variable_saver. * \author Julien Jorge */ class ENGINE_EXPORT variable_list_reader { public: void operator()( std::istream& iss, var_map& output ) const; private: void apply ( var_map& v, const std::string& type, const std::string& name, const std::string& value ) const; std::string unescape( const std::string& s ) const; void add_string_variable ( var_map& v, const std::string& name, const std::string& value ) const; template void add_variable ( var_map& v, const std::string& name, const std::string& value ) const; }; // class variable_list_reader } // namespace engine } // namespace bear #endif // __ENGINE_VARIABLE_LIST_READER_HPP__ plee-the-bear-20251226/bear-engine/core/src/engine/variable/variable_saver.hpp000066400000000000000000000025651512343254000270230ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A function object that saves a variable in a stream. * \author Julien Jorge */ #ifndef __ENGINE_VARIABLE_SAVER_HPP__ #define __ENGINE_VARIABLE_SAVER_HPP__ #include #include "engine/class_export.hpp" namespace bear { namespace engine { /** * \brief A function object that saves a variable in a stream. * \author Julien Jorge */ class ENGINE_EXPORT variable_saver { public: variable_saver( std::ostream& os, boost::regex pattern ); template void operator()( const std::string& name, const T& value ) const; private: template const T& escape( const T& value ) const; std::string escape( const std::string& value ) const; private: /** \brief The stream in which the variable is saved. */ std::ostream& m_output; /** \brief A regular expression that must be verified by the variable's name to be serialised. */ const boost::regex m_pattern; }; // class variable_saver } // namespace engine } // namespace bear #include "engine/variable/impl/variable_saver.tpp" #endif // __ENGINE_VARIABLE_SAVER_HPP__ plee-the-bear-20251226/bear-engine/core/src/engine/version.hpp000066400000000000000000000012531512343254000237270ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Version of the engine. * \author Julien Jorge */ #ifndef __BEAR_VERSION_HPP__ #define __BEAR_VERSION_HPP__ #define BEAR_TO_STR_BIS(v) # v #define BEAR_TO_STR(v) BEAR_TO_STR_BIS(v) #define BEAR_MAJOR_VERSION 0 #define BEAR_MINOR_VERSION 7 #define BEAR_RELEASE_NUMBER 0 #define BEAR_VERSION_STRING "Bear Engine " BEAR_TO_STR(BEAR_MAJOR_VERSION) "." \ BEAR_TO_STR(BEAR_MINOR_VERSION) "." BEAR_TO_STR(BEAR_RELEASE_NUMBER) #endif // __BEAR_VERSION_HPP__ plee-the-bear-20251226/bear-engine/core/src/engine/world.hpp000066400000000000000000000035151512343254000233740ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Description of the world. * \author Julien Jorge */ #ifndef __ENGINE_WORLD_HPP__ #define __ENGINE_WORLD_HPP__ #include "universe/world.hpp" #include "engine/class_export.hpp" #include "engine/population.hpp" #include "engine/scene_visual.hpp" #include namespace bear { namespace engine { /** * \brief Description of the world. * * The world contains the walls and all the entities. */ class ENGINE_EXPORT world : public universe::world { public: /** \brief The type of the iterator on the living items. */ typedef population::const_iterator const_item_iterator; public: world( const universe::size_box_type& size ); ~world(); void start(); void progress_entities ( const region_type& regions, universe::time_type elapsed_time ); void get_visual ( std::list& visuals, const universe::rectangle_type& camera_box ) const; const_item_iterator living_items_begin() const; const_item_iterator living_items_end() const; void add_static( base_item* const& who ); void register_item( base_item* const& who ); void release_item( base_item* const& who ); void drop_item( base_item* const& who ); void print_item_stats() const; private: /** \brief The static items won't be deleted when cleaning the population. */ std::list m_static_items; /** \brief All items that can die a any time. */ population m_population; }; // class world } // namespace engine } // namespace bear #endif // __ENGINE_WORLD_HPP__ plee-the-bear-20251226/bear-engine/core/src/expr/000077500000000000000000000000001512343254000212415ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/core/src/expr/CMakeLists.txt000066400000000000000000000012541512343254000240030ustar00rootroot00000000000000set( EXPR_TARGET_NAME bear_expr ) #------------------------------------------------------------------------------- set( EXPR_SOURCE_FILES code/boolean_constant.cpp code/boolean_expression.cpp code/boolean_variable.cpp code/linear_constant.cpp code/linear_expression.cpp code/linear_variable.cpp code/logical_not.cpp code/logical_xor.cpp ) add_library( ${EXPR_TARGET_NAME} ${BEAR_ENGINE_CORE_LINK_TYPE} ${EXPR_SOURCE_FILES} ) set_target_properties( ${EXPR_TARGET_NAME} PROPERTIES INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/${BEAR_ENGINE_INSTALL_LIBRARY_DIR}" ) install( TARGETS ${EXPR_TARGET_NAME} DESTINATION ${BEAR_ENGINE_INSTALL_LIBRARY_DIR} ) plee-the-bear-20251226/bear-engine/core/src/expr/base_boolean_expression.hpp000066400000000000000000000021011512343254000266340ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief The base class for a boolean expression. * \author Julien Jorge */ #ifndef __EXPR_BASE_BOOLEAN_EXPRESSION_HPP__ #define __EXPR_BASE_BOOLEAN_EXPRESSION_HPP__ #include #include "expr/class_export.hpp" namespace bear { namespace expr { /** * \brief The base class for a boolean expression. * \author Julien Jorge */ class EXPR_EXPORT base_boolean_expression { public: /** \brief The type of the result of the evaluation. */ typedef bool result_type; public: virtual ~base_boolean_expression() {}; virtual base_boolean_expression* clone() const = 0; virtual result_type evaluate() const = 0; virtual std::string formatted_string() const = 0; }; // class base_boolean_expression } // namespace expr } // namespace bear #endif // __EXPR_BASE_BOOLEAN_EXPRESSION_HPP__ plee-the-bear-20251226/bear-engine/core/src/expr/base_linear_expression.hpp000066400000000000000000000020741512343254000265000ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief The base class for a linear expression. * \author Julien Jorge */ #ifndef __EXPR_BASE_LINEAR_EXPRESSION_HPP__ #define __EXPR_BASE_LINEAR_EXPRESSION_HPP__ #include #include "expr/class_export.hpp" namespace bear { namespace expr { /** * \brief The base class for a linear expression. * \author Julien Jorge */ class EXPR_EXPORT base_linear_expression { public: /** \brief The type of the result of the evaluation. */ typedef double result_type; public: virtual ~base_linear_expression() {}; virtual base_linear_expression* clone() const = 0; virtual result_type evaluate() const = 0; std::string formatted_string() const { return ""; } }; // class base_linear_expression } // namespace expr } // namespace bear #endif // __EXPR_BASE_LINEAR_EXPRESSION_HPP__ plee-the-bear-20251226/bear-engine/core/src/expr/binary_boolean_expression.hpp000066400000000000000000000032331512343254000272150ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A logical and of two boolean expressions. * \author Julien Jorge */ #ifndef __EXPR_BINARY_BOOLEAN_EXPRESSION_HPP__ #define __EXPR_BINARY_BOOLEAN_EXPRESSION_HPP__ #include "expr/base_boolean_expression.hpp" #include "expr/binary_expression.hpp" #include "expr/boolean_expression.hpp" #include namespace bear { namespace expr { /** * \brief Utility class to create a binary_expression whose operands are * boolean_expressions. * \author Julien Jorge */ template class logical_expression_maker { public: typedef binary_expression type; }; // class logical_expression_maker /** Tell if two booleans are equal. */ typedef logical_expression_maker< std::equal_to >::type boolean_equality; /** Tell if two booleans are not equal. */ typedef logical_expression_maker< std::not_equal_to >::type boolean_disequality; /** Compute the logical and value of the evaluation of two boolean expressions. */ typedef logical_expression_maker< std::logical_and >::type logical_and; /** Compute the logical or value of the evaluation of two boolean expressions. */ typedef logical_expression_maker< std::logical_or >::type logical_or; } // namespace expr } // namespace bear #endif // __EXPR_BINARY_BOOLEAN_EXPRESSION_HPP__ plee-the-bear-20251226/bear-engine/core/src/expr/binary_expression.hpp000066400000000000000000000033131512343254000255150ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief An operation on two expressions. * \author Julien Jorge */ #ifndef __EXPR_BINARY_EXPRESSION_HPP__ #define __EXPR_BINARY_EXPRESSION_HPP__ namespace bear { namespace expr { /** * \brief A linear expression with two operands. * \author Julien Jorge */ template class binary_expression: public Base { public: /** \brief The type of the result. */ typedef typename Base::result_type result_type; /** \brief The type of the operands. */ typedef Operand operand_type; /** \brief The type of this class. */ typedef binary_expression self_type; public: binary_expression(); binary_expression(const self_type& that); binary_expression ( const operand_type& left, const operand_type& right ); const operand_type& get_left_operand() const; void set_left_operand( const operand_type& op ); const operand_type& get_right_operand() const; void set_right_operand( const operand_type& op ); Base* clone() const; result_type evaluate() const; std::string formatted_string() const; private: /** \brief The left operand. */ operand_type m_left; /** \brief The right operand. */ operand_type m_right; }; // class binary_expression } // namespace expr } // namespace bear #include "expr/impl/binary_expression.tpp" #endif // __EXPR_BINARY_EXPRESSION_HPP__ plee-the-bear-20251226/bear-engine/core/src/expr/binary_linear_expression.hpp000066400000000000000000000070221512343254000270500ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A logical and of two linear expressions. * \author Julien Jorge */ #ifndef __EXPR_BINARY_LINEAR_EXPRESSION_HPP__ #define __EXPR_BINARY_LINEAR_EXPRESSION_HPP__ #include "expr/base_boolean_expression.hpp" #include "expr/base_linear_expression.hpp" #include "expr/binary_expression.hpp" #include "expr/linear_expression.hpp" #include namespace bear { namespace expr { /** * \brief Utility class to create a binary_expression whose operands are * linear_expressions. * \author Julien Jorge */ template class binary_linear_expression_maker { public: typedef binary_expression type; }; // class binary_linear_expression_maker /** * \brief Utility class to create a binary_expression whose operands are * linear_expressions and the result a linear_expression too. * \author Julien Jorge */ template class linear_operation_maker: public binary_linear_expression_maker { // nothing }; // class linear_operation_maker /** * \brief Utility class to create a binary_expression whose operands are * linear_expressions and the result a boolean_expression too. * \author Julien Jorge */ template class linear_comparison_maker: public binary_linear_expression_maker { // nothing }; // class linear_comparison_maker /** Add the evaluation of two expressions. */ typedef linear_operation_maker< std::plus >::type linear_plus; /** Subtract the evaluation of an expression to the evaluation of an other. */ typedef linear_operation_maker< std::minus >::type linear_minus; /** Multiply the evaluation of two expressions. */ typedef linear_operation_maker< std::multiplies >::type linear_multiplies; /** Divide the evaluation of an expression by the evaluation of an other. */ typedef linear_operation_maker< std::divides >::type linear_divides; /** Tell if the evaluation of two expressions are equal. */ typedef linear_comparison_maker< std::equal_to >::type linear_equality; /** Tell if the evaluation of two expressions are not equal. */ typedef linear_comparison_maker< std::not_equal_to >::type linear_disequality; /** Tell if the evaluation of an expression is lower than the evaluation of an other. */ typedef linear_comparison_maker< std::less >::type linear_less; /** Tell if the evaluation of an expression is lower or equal to the evaluation of an other. */ typedef linear_comparison_maker< std::less_equal >::type linear_less_equal; /** Tell if the evaluation of an expression is greater than the evaluation of an other. */ typedef linear_comparison_maker< std::greater >::type linear_greater; /** Tell if the evaluation of an expression is greater or equal to the evaluation of an other. */ typedef linear_comparison_maker< std::greater_equal >::type linear_greater_equal; } // namespace expr } // namespace bear #endif // __EXPR_BINARY_LINEAR_EXPRESSION_HPP__ plee-the-bear-20251226/bear-engine/core/src/expr/boolean_constant.hpp000066400000000000000000000020351512343254000253020ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A boolean expression made of a boolean constant. * \author Julien Jorge */ #ifndef __EXPR_BOOLEAN_CONSTANT_HPP__ #define __EXPR_BOOLEAN_CONSTANT_HPP__ #include "expr/base_boolean_expression.hpp" namespace bear { namespace expr { /** * \brief A boolean expression made of a boolean constant. * \author Julien Jorge */ class EXPR_EXPORT boolean_constant: public base_boolean_expression { public: boolean_constant( bool v ); base_boolean_expression* clone() const; bool evaluate() const; std::string formatted_string() const; void set_value( bool b ); private: /** \brief The value of the constant. */ bool m_value; }; // class boolean_constant } // namespace expr } // namespace bear #endif // __EXPR_BOOLEAN_CONSTANT_HPP__ plee-the-bear-20251226/bear-engine/core/src/expr/boolean_expression.hpp000066400000000000000000000034351512343254000256550ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A boolean expression. * \author Julien Jorge */ #ifndef __EXPR_BOOLEAN_EXPRESSION_HPP__ #define __EXPR_BOOLEAN_EXPRESSION_HPP__ #include #include "expr/class_export.hpp" namespace bear { namespace expr { class base_boolean_expression; /** * \brief A boolean expression. * \author Julien Jorge */ class EXPR_EXPORT boolean_expression { public: /** \brief The base class for boolean expressions. */ typedef base_boolean_expression base_expression_type; public: boolean_expression(); boolean_expression( const base_boolean_expression& e ); boolean_expression( const boolean_expression& that ); ~boolean_expression(); bool evaluate() const; operator bool() const; boolean_expression& operator=( const boolean_expression& that ); boolean_expression operator==( const boolean_expression& that ) const; boolean_expression operator!=( const boolean_expression& that ) const; boolean_expression operator&&( const boolean_expression& that ) const; boolean_expression operator||( const boolean_expression& that ) const; boolean_expression operator^( const boolean_expression& that ) const; std::string formatted_string() const; private: /** \brief The implemented expression. */ base_boolean_expression* m_expr; }; // class boolean_expression } // namespace expr } // namespace bear EXPR_EXPORT bear::expr::boolean_expression operator!( const bear::expr::boolean_expression& that ); #endif // __EXPR_BOOLEAN_EXPRESSION_HPP__ plee-the-bear-20251226/bear-engine/core/src/expr/boolean_function.hpp000066400000000000000000000052511512343254000253010ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief An expression returning the result of a call of a function on any * class instance. * \author Julien Jorge */ #ifndef __EXPR_BOOLEAN_FUNCTION_HPP__ #define __EXPR_BOOLEAN_FUNCTION_HPP__ #include "expr/base_boolean_expression.hpp" namespace bear { namespace expr { /** * \brief An expression returning the result of a call of a function on any * class instance. * * The evaluation of this expression is m(*inst), where \a m is the function * passed to the constructor, and \a inst the pointer passed to the * constructor. * * \author Julien Jorge */ template class boolean_function: public base_boolean_expression { public: boolean_function(); boolean_function ( const boolean_function& that); boolean_function( const PointerType& inst, FunctionType m ); base_boolean_expression* clone() const; bool evaluate() const; std::string formatted_string() const; void set_function( FunctionType m ); private: /** \brief The class on which we call the function. */ const PointerType m_value; /** \brief The member function to call. */ FunctionType m_function; }; // class boolean_function /** * \brief An expression returning the result of a call of a function. * * The evaluation of this expression is m(), where \a m is the function * passed to the constructor. * * \author Julien Jorge */ template class boolean_function: public base_boolean_expression { public: boolean_function(); boolean_function( FunctionType m ); base_boolean_expression* clone() const; bool evaluate() const; std::string formatted_string() const; void set_function( FunctionType m ); private: /** \brief The member function to call. */ FunctionType m_function; }; // class boolean_function template boolean_function boolean_function_maker( const PointerType& inst, FunctionType m); template boolean_function boolean_function_maker( FunctionType m); } // namespace expr } // namespace bear #include "expr/impl/boolean_function.tpp" #endif // __EXPR_BOOLEAN_FUNCTION_HPP__ plee-the-bear-20251226/bear-engine/core/src/expr/boolean_variable.hpp000066400000000000000000000020121512343254000252310ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A boolean expression made of a boolean variable. * \author Julien Jorge */ #ifndef __EXPR_BOOLEAN_VARIABLE_HPP__ #define __EXPR_BOOLEAN_VARIABLE_HPP__ #include "expr/base_boolean_expression.hpp" namespace bear { namespace expr { /** * \brief A boolean expression made of a boolean variable. * \author Julien Jorge */ class EXPR_EXPORT boolean_variable: public base_boolean_expression { public: boolean_variable( const bool& v ); base_boolean_expression* clone() const; bool evaluate() const; std::string formatted_string() const; private: /** \brief The value of the variable. */ const bool& m_value; }; // class boolean_variable } // namespace expr } // namespace bear #endif // __EXPR_BOOLEAN_VARIABLE_HPP__ plee-the-bear-20251226/bear-engine/core/src/expr/class_export.hpp000066400000000000000000000014061512343254000244610ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Definition of the EXPR_EXPORT macro according to the fact that we * create the library or link to it. * \author Julien Jorge */ #ifndef __EXPR_CLASS_EXPORT_HPP__ #define __EXPR_CLASS_EXPORT_HPP__ #ifndef EXPR_EXPORT # ifdef _WIN32 # ifdef bear_expr_EXPORTS # define EXPR_EXPORT __declspec(dllexport) # else # define EXPR_EXPORT __declspec(dllimport) # endif // def bear_expr_EXPORTS # else // def _WIN32 # define EXPR_EXPORT # endif // def _WIN32 #endif // ndef EXPR_EXPORT #endif // __EXPR_CLASS_EXPORT_HPP__ plee-the-bear-20251226/bear-engine/core/src/expr/code/000077500000000000000000000000001512343254000221535ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/core/src/expr/code/boolean_constant.cpp000066400000000000000000000033561512343254000262160ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::expr::boolean_constant class. * \author Julien Jorge. */ #include "expr/boolean_constant.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param v The constant from which we take the value. */ bear::expr::boolean_constant::boolean_constant( bool v ) : m_value(v) { } // boolean_constant::boolean_constant() /*----------------------------------------------------------------------------*/ /** * \brief Create a copy of this expression. */ bear::expr::base_boolean_expression* bear::expr::boolean_constant::clone() const { return new boolean_constant(*this); } // boolean_constant::boolean_constant() /*----------------------------------------------------------------------------*/ /** * \brief Evaluate the expression. */ bool bear::expr::boolean_constant::evaluate() const { return m_value; } // boolean_constant::evaluate() /*----------------------------------------------------------------------------*/ /** * \brief Gets a formatted and human readable representation of this expression. */ std::string bear::expr::boolean_constant::formatted_string() const { if ( m_value ) return "true"; else return "false"; } // boolean_constant::formatted_string() /*----------------------------------------------------------------------------*/ /** * \brief Set the value of the constant. * \param b The new value. */ void bear::expr::boolean_constant::set_value( bool b ) { m_value = b; } // boolean_constant::set_value() plee-the-bear-20251226/bear-engine/core/src/expr/code/boolean_expression.cpp000066400000000000000000000114401512343254000265550ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::expr::boolean_expression class. * \author Julien Jorge. */ #include "expr/boolean_expression.hpp" #include "expr/binary_boolean_expression.hpp" #include "expr/boolean_constant.hpp" #include "expr/logical_not.hpp" #include "expr/logical_xor.hpp" #include /*----------------------------------------------------------------------------*/ /** * \brief Contructor. */ bear::expr::boolean_expression::boolean_expression() : m_expr( new boolean_constant(false) ) { } // boolean_expression::boolean_expression() /*----------------------------------------------------------------------------*/ /** * \brief Contructor. * \param e An expression to init from. */ bear::expr::boolean_expression::boolean_expression ( const base_boolean_expression& e ) : m_expr(e.clone()) { } // boolean_expression::boolean_expression() /*----------------------------------------------------------------------------*/ /** * \brief Copy contructor. * \param that The instance to copy from. */ bear::expr::boolean_expression::boolean_expression ( const boolean_expression& that ) : m_expr( that.m_expr->clone() ) { } // boolean_expression::boolean_expression() /*----------------------------------------------------------------------------*/ /** * \brief Destructor. */ bear::expr::boolean_expression::~boolean_expression() { delete m_expr; } // boolean_expression::~boolean_expression() /*----------------------------------------------------------------------------*/ /** * \brief Evaluate the expression. */ bool bear::expr::boolean_expression::evaluate() const { return m_expr->evaluate(); } // boolean_expression::evaluate() /*----------------------------------------------------------------------------*/ /** * \brief Evaluate the expression. */ bear::expr::boolean_expression::operator bool() const { return evaluate(); } // boolean_expression::operator bool() /*----------------------------------------------------------------------------*/ /** * \brief Assignment. * \param that The instance to copy from. */ bear::expr::boolean_expression& bear::expr::boolean_expression::operator=( const boolean_expression& that ) { boolean_expression tmp(that); std::swap(tmp.m_expr, m_expr); return *this; } // boolean_expression::operator=() /*----------------------------------------------------------------------------*/ /** * \brief Equality. * \param that The expression to compare to. */ bear::expr::boolean_expression bear::expr::boolean_expression::operator== ( const boolean_expression& that ) const { return boolean_equality( *this, that ); } // boolean_expression::operator==() /*----------------------------------------------------------------------------*/ /** * \brief Disequality. * \param that The expression to compare to. */ bear::expr::boolean_expression bear::expr::boolean_expression::operator!= ( const boolean_expression& that ) const { return boolean_disequality( *this, that ); } // boolean_expression::operator!=() /*----------------------------------------------------------------------------*/ /** * \brief Logical and. * \param that The expression to compare to. */ bear::expr::boolean_expression bear::expr::boolean_expression::operator&& ( const boolean_expression& that ) const { return logical_and( *this, that ); } // boolean_expression::operator&&() /*----------------------------------------------------------------------------*/ /** * \brief Logical or. * \param that The expression to compare to. */ bear::expr::boolean_expression bear::expr::boolean_expression::operator|| ( const boolean_expression& that ) const { return logical_or( *this, that ); } // boolean_expression::operator||() /*----------------------------------------------------------------------------*/ /** * \brief Logical xor. * \param that The expression to compare to. */ bear::expr::boolean_expression bear::expr::boolean_expression::operator^ ( const boolean_expression& that ) const { return logical_xor( *this, that ); } // boolean_expression::operator^() /*----------------------------------------------------------------------------*/ /** * \brief Gets a formatted and human readable representation of this expression. */ std::string bear::expr::boolean_expression::formatted_string() const { return m_expr->formatted_string(); } // boolean_expression::formatted_string() /*----------------------------------------------------------------------------*/ /** * \brief Logical not. * \param e The expression to negate. */ bear::expr::boolean_expression operator!( const bear::expr::boolean_expression& e ) { return bear::expr::logical_not(e); } // operator!() plee-the-bear-20251226/bear-engine/core/src/expr/code/boolean_variable.cpp000066400000000000000000000031201512343254000261370ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::expr::boolean_variable class. * \author Julien Jorge. */ #include "expr/boolean_variable.hpp" #include /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param v The variable from which we take the value. * \remark \a v must live longer than \a this. */ bear::expr::boolean_variable::boolean_variable( const bool& v ) : m_value(v) { } // boolean_variable::boolean_variable() /*----------------------------------------------------------------------------*/ /** * \brief Create a copy of this expression. */ bear::expr::base_boolean_expression* bear::expr::boolean_variable::clone() const { return new boolean_variable(*this); } // boolean_variable::boolean_variable() /*----------------------------------------------------------------------------*/ /** * \brief Evaluate the expression. */ bool bear::expr::boolean_variable::evaluate() const { return m_value; } // boolean_variable::evaluate() /*----------------------------------------------------------------------------*/ /** * \brief Gets a formatted and human readable representation of this expression. */ std::string bear::expr::boolean_variable::formatted_string() const { std::ostringstream result; result << "var( " << m_value << " )"; return result.str(); } // boolean_variable::formatted_string() plee-the-bear-20251226/bear-engine/core/src/expr/code/linear_constant.cpp000066400000000000000000000026021512343254000260420ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::expr::linear_constant class. * \author Julien Jorge. */ #include "expr/linear_constant.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param v The constant from which we take the value. */ bear::expr::linear_constant::linear_constant( double v ) : m_value(v) { } // linear_constant::linear_constant() /*----------------------------------------------------------------------------*/ /** * \brief Create a copy of this expression. */ bear::expr::base_linear_expression* bear::expr::linear_constant::clone() const { return new linear_constant(*this); } // linear_constant::clone() /*----------------------------------------------------------------------------*/ /** * \brief Evaluate the expression. */ double bear::expr::linear_constant::evaluate() const { return m_value; } // linear_constant::evaluate() /*----------------------------------------------------------------------------*/ /** * \brief Set the value of the constant. * \param b The new value. */ void bear::expr::linear_constant::set_value( double b ) { m_value = b; } // linear_constant::set_value() plee-the-bear-20251226/bear-engine/core/src/expr/code/linear_expression.cpp000066400000000000000000000414501512343254000264140ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::expr::linear_expression class. * \author Julien Jorge. */ #include "expr/linear_expression.hpp" #include "expr/linear_constant.hpp" #include "expr/binary_linear_expression.hpp" #include /*----------------------------------------------------------------------------*/ /** * \brief Contructor. * \param v The initial value. */ bear::expr::linear_expression::linear_expression( double v ) : m_expr( new linear_constant(v) ) { } // linear_expression::linear_expression() /*----------------------------------------------------------------------------*/ /** * \brief Contructor. * \param e An expression to init from. */ bear::expr::linear_expression::linear_expression ( const base_linear_expression& e ) : m_expr(e.clone()) { } // linear_expression::linear_expression() /*----------------------------------------------------------------------------*/ /** * \brief Copy contructor. * \param that The instance to copy from. */ bear::expr::linear_expression::linear_expression ( const linear_expression& that ) : m_expr( that.m_expr->clone() ) { } // linear_expression::linear_expression() /*----------------------------------------------------------------------------*/ /** * \brief Destructor. */ bear::expr::linear_expression::~linear_expression() { delete m_expr; } // linear_expression::~linear_expression() /*----------------------------------------------------------------------------*/ /** * \brief Evaluate the expression. */ double bear::expr::linear_expression::evaluate() const { return m_expr->evaluate(); } // linear_expression::evaluate() /*----------------------------------------------------------------------------*/ /** * \brief Assignment. * \param that The instance to copy from. */ bear::expr::linear_expression& bear::expr::linear_expression::operator=( const linear_expression& that ) { linear_expression tmp(that); std::swap(tmp.m_expr, m_expr); return *this; } // linear_expression::operator=() /*----------------------------------------------------------------------------*/ /** * \brief Equality. * \param that The expression to compare to. */ bear::expr::boolean_expression bear::expr::linear_expression::operator== ( const linear_expression& that ) const { return linear_equality( *this, that ); } // linear_expression::operator==() /*----------------------------------------------------------------------------*/ /** * \brief Disequality. * \param that The expression to compare to. */ bear::expr::boolean_expression bear::expr::linear_expression::operator!= ( const linear_expression& that ) const { return linear_disequality( *this, that ); } // linear_expression::operator!=() /*----------------------------------------------------------------------------*/ /** * \brief Less than. * \param that The expression to compare to. */ bear::expr::boolean_expression bear::expr::linear_expression::operator< ( const linear_expression& that ) const { return linear_less( *this, that ); } // linear_expression::operator<() /*----------------------------------------------------------------------------*/ /** * \brief Less equal. * \param that The expression to compare to. */ bear::expr::boolean_expression bear::expr::linear_expression::operator<= ( const linear_expression& that ) const { return linear_less_equal( *this, that ); } // linear_expression::operator<=() /*----------------------------------------------------------------------------*/ /** * \brief Greater than. * \param that The expression to compare to. */ bear::expr::boolean_expression bear::expr::linear_expression::operator> ( const linear_expression& that ) const { return linear_greater( *this, that ); } // linear_expression::operator>() /*----------------------------------------------------------------------------*/ /** * \brief Greater equal. * \param that The expression to compare to. */ bear::expr::boolean_expression bear::expr::linear_expression::operator>= ( const linear_expression& that ) const { return linear_greater_equal( *this, that ); } // linear_expression::operator>=() /*----------------------------------------------------------------------------*/ /** * \brief Plus. * \param that The right operand. */ bear::expr::linear_expression& bear::expr::linear_expression::operator+= ( const linear_expression& that ) { linear_plus result( *this, that ); *this = result; return *this; } // linear_expression::operator+=() /*----------------------------------------------------------------------------*/ /** * \brief Minus. * \param that The right operand. */ bear::expr::linear_expression& bear::expr::linear_expression::operator-= ( const linear_expression& that ) { linear_minus result( *this, that ); *this = result; return *this; } // linear_expression::operator-=() /*----------------------------------------------------------------------------*/ /** * \brief Multiply. * \param that The right operand. */ bear::expr::linear_expression& bear::expr::linear_expression::operator*= ( const linear_expression& that ) { linear_multiplies result( *this, that ); *this = result; return *this; } // linear_expression::operator*=() /*----------------------------------------------------------------------------*/ /** * \brief Divide * \param that The right operand. */ bear::expr::linear_expression& bear::expr::linear_expression::operator/= ( const linear_expression& that ) { linear_divides result( *this, that ); *this = result; return *this; } // linear_expression::operator/=() /*----------------------------------------------------------------------------*/ /** * \brief Plus. * \param that The right operand. */ bear::expr::linear_expression bear::expr::linear_expression::operator+ ( const linear_expression& that ) const { return linear_plus( *this, that ); } // linear_expression::operator+() /*----------------------------------------------------------------------------*/ /** * \brief Minus. * \param that The right operand. */ bear::expr::linear_expression bear::expr::linear_expression::operator- ( const linear_expression& that ) const { return linear_minus( *this, that ); } // linear_expression::operator-() /*----------------------------------------------------------------------------*/ /** * \brief Multiply. * \param that The right operand. */ bear::expr::linear_expression bear::expr::linear_expression::operator* ( const linear_expression& that ) const { return linear_multiplies( *this, that ); } // linear_expression::operator*() /*----------------------------------------------------------------------------*/ /** * \brief Divide * \param that The right operand. */ bear::expr::linear_expression bear::expr::linear_expression::operator/ ( const linear_expression& that ) const { return linear_divides( *this, that ); } // linear_expression::operator/() /*----------------------------------------------------------------------------*/ /** * \brief Gets a formatted and human readable representation of this expression. */ std::string bear::expr::linear_expression::formatted_string() const { return m_expr->formatted_string(); } // linear_expression::formatted_string() /*----------------------------------------------------------------------------*/ /** * \brief Create an expression checking if the evaluation of two linear * expressions are equal. * \param a The left operand. * \param b The right operand. */ bear::expr::boolean_expression operator== ( const bear::expr::base_linear_expression& a, const bear::expr::base_linear_expression& b ) { return bear::expr::linear_equality( a, b ); } // operator==() /*----------------------------------------------------------------------------*/ /** * \brief Create an expression checking if the evaluation of two linear * expressions are not equal. * \param a The left operand. * \param b The right operand. */ bear::expr::boolean_expression operator!= ( const bear::expr::base_linear_expression& a, const bear::expr::base_linear_expression& b ) { return bear::expr::linear_disequality( a, b ); } // operator!=() /*----------------------------------------------------------------------------*/ /** * \brief Create an expression checking if the evaluation of two linear * expressions are equal. * \param v The value. * \param e The expression. */ bear::expr::boolean_expression operator==( double v, const bear::expr::base_linear_expression& e ) { return bear::expr::linear_equality( bear::expr::linear_constant(v), e ); } // operator==() /*----------------------------------------------------------------------------*/ /** * \brief Create an expression checking if a value is equal to the evaluation of * an expression. * \param v The value. * \param e The expression. */ bear::expr::boolean_expression operator!=( double v, const bear::expr::base_linear_expression& e ) { return bear::expr::linear_disequality( bear::expr::linear_constant(v), e ); } // operator!=() /*----------------------------------------------------------------------------*/ /** * \brief Create an expression checking if a value is not equal to the * evaluation of an expression. * \param v The value. * \param e The expression. */ bear::expr::boolean_expression operator<( double v, const bear::expr::base_linear_expression& e ) { return bear::expr::linear_less( bear::expr::linear_constant(v), e ); } // operator<() /*----------------------------------------------------------------------------*/ /** * \brief Create an expression to check if a value is lower or equal to the * evaluation of an expression. * \param v The value. * \param e The expression. */ bear::expr::boolean_expression operator<=( double v, const bear::expr::base_linear_expression& e ) { return bear::expr::linear_less_equal( bear::expr::linear_constant(v), e ); } // operator<=() /*----------------------------------------------------------------------------*/ /** * \brief Create an expression to check if a value is greater than the * evaluation of an expression. * \param v The value. * \param e The expression. */ bear::expr::boolean_expression operator>( double v, const bear::expr::base_linear_expression& e ) { return bear::expr::linear_greater( bear::expr::linear_constant(v), e ); } // operator>() /*----------------------------------------------------------------------------*/ /** * \brief Create an expression to check if a value is greater or equal to the * evaluation of an expression. * \param v The value. * \param e The expression. */ bear::expr::boolean_expression operator>=( double v, const bear::expr::base_linear_expression& e ) { return bear::expr::linear_greater_equal( bear::expr::linear_constant(v), e ); } // operator>=() /*----------------------------------------------------------------------------*/ /** * \brief Create an expression that compute the sum of a value and the * evaluation of an expression. * \param v The value. * \param e The expression. */ bear::expr::linear_expression operator+( double v, const bear::expr::base_linear_expression& e ) { return bear::expr::linear_plus( bear::expr::linear_constant(v), e ); } // operator+() /*----------------------------------------------------------------------------*/ /** * \brief Create an expression that compute the difference of a value and the * evaluation of an expression. * \param v The value. * \param e The expression. */ bear::expr::linear_expression operator-( double v, const bear::expr::base_linear_expression& e ) { return bear::expr::linear_minus( bear::expr::linear_constant(v), e ); } // operator-() /*----------------------------------------------------------------------------*/ /** * \brief Create an expression that multiplies a value with the evaluation of * an expression. * \param v The value. * \param e The expression. */ bear::expr::linear_expression operator*( double v, const bear::expr::base_linear_expression& e ) { return bear::expr::linear_multiplies( bear::expr::linear_constant(v), e ); } // operator*() /*----------------------------------------------------------------------------*/ /** * \brief Create an expression that divides a value by the evaluation of an * expression. * \param v The value. * \param e The expression. */ bear::expr::linear_expression operator/( double v, const bear::expr::base_linear_expression& e ) { return bear::expr::linear_divides( bear::expr::linear_constant(v), e ); } // operator/() /*----------------------------------------------------------------------------*/ /** * \brief Create an expression checking if the evaluation of two linear * expressions are equal. * \param e The expression. * \param v The value. */ bear::expr::boolean_expression operator==( const bear::expr::base_linear_expression& e, double v ) { return bear::expr::linear_equality( e, bear::expr::linear_constant(v) ); } // operator==() /*----------------------------------------------------------------------------*/ /** * \brief Create an expression checking if a value is equal to the evaluation of * an expression. * \param e The expression. * \param v The value. */ bear::expr::boolean_expression operator!=( const bear::expr::base_linear_expression& e, double v ) { return bear::expr::linear_disequality( e, bear::expr::linear_constant(v) ); } // operator!=() /*----------------------------------------------------------------------------*/ /** * \brief Create an expression checking if a value is not equal to the * evaluation of an expression. * \param e The expression. * \param v The value. */ bear::expr::boolean_expression operator<( const bear::expr::base_linear_expression& e, double v ) { return bear::expr::linear_less( e, bear::expr::linear_constant(v) ); } // operator<() /*----------------------------------------------------------------------------*/ /** * \brief Create an expression to check if a value is lower or equal to the * evaluation of an expression. * \param e The expression. * \param v The value. */ bear::expr::boolean_expression operator<=( const bear::expr::base_linear_expression& e, double v ) { return bear::expr::linear_less_equal( e, bear::expr::linear_constant(v) ); } // operator<=() /*----------------------------------------------------------------------------*/ /** * \brief Create an expression to check if a value is greater than the * evaluation of an expression. * \param e The expression. * \param v The value. */ bear::expr::boolean_expression operator>( const bear::expr::base_linear_expression& e, double v ) { return bear::expr::linear_greater( e, bear::expr::linear_constant(v) ); } // operator>() /*----------------------------------------------------------------------------*/ /** * \brief Create an expression to check if a value is greater or equal to the * evaluation of an expression. * \param e The expression. * \param v The value. */ bear::expr::boolean_expression operator>=( const bear::expr::base_linear_expression& e, double v ) { return bear::expr::linear_greater_equal( e, bear::expr::linear_constant(v) ); } // operator>=() /*----------------------------------------------------------------------------*/ /** * \brief Create an expression that compute the sum of a value and the * evaluation of an expression. * \param e The expression. * \param v The value. */ bear::expr::linear_expression operator+( const bear::expr::base_linear_expression& e, double v ) { return bear::expr::linear_plus( e, bear::expr::linear_constant(v) ); } // operator+() /*----------------------------------------------------------------------------*/ /** * \brief Create an expression that compute the difference of a value and the * evaluation of an expression. * \param e The expression. * \param v The value. */ bear::expr::linear_expression operator-( const bear::expr::base_linear_expression& e, double v ) { return bear::expr::linear_minus( e, bear::expr::linear_constant(v) ); } // operator-() /*----------------------------------------------------------------------------*/ /** * \brief Create an expression that multiplies a value with the evaluation of * an expression. * \param e The expression. * \param v The value. */ bear::expr::linear_expression operator*( const bear::expr::base_linear_expression& e, double v ) { return bear::expr::linear_multiplies( e, bear::expr::linear_constant(v) ); } // operator*() /*----------------------------------------------------------------------------*/ /** * \brief Create an expression that divides a value by the evaluation of an * expression. * \param e The expression. * \param v The value. */ bear::expr::linear_expression operator/( const bear::expr::base_linear_expression& e, double v ) { return bear::expr::linear_divides( e, bear::expr::linear_constant(v) ); } // operator/() plee-the-bear-20251226/bear-engine/core/src/expr/code/linear_variable.cpp000066400000000000000000000022711512343254000260000ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::expr::linear_variable class. * \author Julien Jorge. */ #include "expr/linear_variable.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param v The variable from which we take the value. * \remark \a v must live longer than \a this. */ bear::expr::linear_variable::linear_variable( const double& v ) : m_value(v) { } // linear_variable::linear_variable() /*----------------------------------------------------------------------------*/ /** * \brief Create a copy of this expression. */ bear::expr::base_linear_expression* bear::expr::linear_variable::clone() const { return new linear_variable(*this); } // linear_variable::linear_variable() /*----------------------------------------------------------------------------*/ /** * \brief Evaluate the expression. */ double bear::expr::linear_variable::evaluate() const { return m_value; } // linear_variable::evaluate() plee-the-bear-20251226/bear-engine/core/src/expr/code/logical_not.cpp000066400000000000000000000041541512343254000251550ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::expr::logical_not class. * \author Julien Jorge. */ #include "expr/logical_not.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Contructor. */ bear::expr::logical_not::logical_not() { } // logical_not::logical_not() /*----------------------------------------------------------------------------*/ /** * \brief Contructor. * \param op The operand. */ bear::expr::logical_not::logical_not( const boolean_expression& op ) : m_operand(op) { } // logical_not::logical_not() /*----------------------------------------------------------------------------*/ /** * \brief Get the operand. */ const bear::expr::boolean_expression& bear::expr::logical_not::get_operand() const { return m_operand; } // logical_not::get_operand() /*----------------------------------------------------------------------------*/ /** * \brief Set the operand. * \param op The new operand. */ void bear::expr::logical_not::set_operand( const boolean_expression& op ) { m_operand = op; } // logical_not::set_operand() /*----------------------------------------------------------------------------*/ /** * \brief Create a copy of this expression. */ bear::expr::base_boolean_expression* bear::expr::logical_not::clone() const { return new logical_not(*this); } // logical_not::logical_not() /*----------------------------------------------------------------------------*/ /** * \brief Evaluate the expression. */ bool bear::expr::logical_not::evaluate() const { return !m_operand.evaluate(); } // logical_not::evaluate() /*----------------------------------------------------------------------------*/ /** * \brief Gets a formatted and human readable representation of this expression. */ std::string bear::expr::logical_not::formatted_string() const { return "not( " + m_operand.formatted_string() + " )"; } // logical_not::formatted_string() plee-the-bear-20251226/bear-engine/core/src/expr/code/logical_xor.cpp000066400000000000000000000030661512343254000251660ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::expr::logical_xor class. * \author Julien Jorge. */ #include "expr/logical_xor.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Contructor. * \param left The left operand. * \param right The right operand. */ bear::expr::logical_xor::logical_xor ( const boolean_expression& left, const boolean_expression& right ) : m_left(left), m_right(right) { } // logical_xor::logical_xor() /*----------------------------------------------------------------------------*/ /** * \brief Create a copy of this expression. */ bear::expr::base_boolean_expression* bear::expr::logical_xor::clone() const { return new logical_xor(*this); } // logical_xor::logical_xor() /*----------------------------------------------------------------------------*/ /** * \brief Evaluate the expression. */ bool bear::expr::logical_xor::evaluate() const { return m_left.evaluate() ^ m_right.evaluate(); } // logical_xor::evaluate() /*----------------------------------------------------------------------------*/ /** * \brief Gets a formatted and human readable representation of this expression. */ std::string bear::expr::logical_xor::formatted_string() const { return "xor( " + m_left.formatted_string() + ", " + m_right.formatted_string() + " )"; } // logical_xor::formatted_string() plee-the-bear-20251226/bear-engine/core/src/expr/impl/000077500000000000000000000000001512343254000222025ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/core/src/expr/impl/binary_expression.tpp000066400000000000000000000106251512343254000264760ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::expr::binary_expression class. * \author Julien Jorge. */ #include #include /*----------------------------------------------------------------------------*/ /** * \brief Contructor. */ template bear::expr::binary_expression::binary_expression() { } // binary_expression::binary_expression() /*----------------------------------------------------------------------------*/ /** * \brief Copy contructor. */ template bear::expr::binary_expression::binary_expression (const binary_expression& that) : m_left(that.m_left), m_right(that.m_right) { } // binary_expression::binary_expression() /*----------------------------------------------------------------------------*/ /** * \brief Contructor. * \param left The left operand. * \param right The right operand. */ template bear::expr::binary_expression::binary_expression ( const operand_type& left, const operand_type& right ) : m_left(left), m_right(right) { } // binary_expression::binary_expression() /*----------------------------------------------------------------------------*/ /** * \brief Get the left operand. */ template const typename bear::expr::binary_expression::operand_type& bear::expr::binary_expression::get_left_operand() const { return m_left; } // binary_expression::get_left_operand() /*----------------------------------------------------------------------------*/ /** * \brief Set the left operand. * \param op The operand. */ template void bear::expr::binary_expression::set_left_operand ( const operand_type& op ) { m_left = op; } // binary_expression::set_left_operand() /*----------------------------------------------------------------------------*/ /** * \brief Get the right operand. */ template const typename bear::expr::binary_expression::operand_type& bear::expr::binary_expression:: get_right_operand() const { return m_right; } // binary_expression::get_right_operand() /*----------------------------------------------------------------------------*/ /** * \brief Set the right operand. * \param op The operand. */ template void bear::expr::binary_expression::set_right_operand ( const operand_type& op ) { m_right = op; } // binary_expression::set_right_operand() /*----------------------------------------------------------------------------*/ /** * \brief Create a copy of this expression. */ template Base* bear::expr::binary_expression::clone() const { return new binary_expression(*this); } // binary_expression::clone() /*----------------------------------------------------------------------------*/ /** * \brief Evaluate the expression. */ template typename bear::expr::binary_expression::result_type bear::expr::binary_expression::evaluate() const { Function f; return f(get_left_operand().evaluate(), get_right_operand().evaluate()); } // binary_expression::evaluate() /*----------------------------------------------------------------------------*/ /** * \brief Gets a formatted and human readable representation of this expression. */ template std::string bear::expr::binary_expression::formatted_string() const { std::ostringstream result; result << typeid(Function).name() << "( " << get_left_operand().formatted_string() << ", " << get_right_operand().formatted_string() << " )"; return result.str(); } // binary_expression::formatted_string() plee-the-bear-20251226/bear-engine/core/src/expr/impl/boolean_function.tpp000066400000000000000000000155521512343254000262630ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::expr::boolean_function class. * \author Julien Jorge. */ #include /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ template bear::expr::boolean_function::boolean_function() { } // boolean_function::boolean_function() /*----------------------------------------------------------------------------*/ /** * \brief Copy _constructor. */ template bear::expr::boolean_function::boolean_function (const boolean_function& that) : m_value(that.m_value), m_function(that.m_function) { } // boolean_function::boolean_function() /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param inst The instance on which we call the function. * \param m The function to call with \a *inst as the only parameter. */ template bear::expr::boolean_function::boolean_function ( const PointerType& inst, FunctionType m ) : m_value(inst), m_function(m) { } // boolean_function::boolean_function() /*----------------------------------------------------------------------------*/ /** * \brief Create a copy of this expression. */ template bear::expr::base_boolean_expression* bear::expr::boolean_function::clone() const { return new boolean_function(*this); } // boolean_function::clone() /*----------------------------------------------------------------------------*/ /** * \brief Evaluate the expression. */ template bool bear::expr::boolean_function::evaluate() const { return m_function(*m_value); } // boolean_function::evaluate() /*----------------------------------------------------------------------------*/ /** * \brief Gets a formatted and human readable representation of this expression. */ template std::string bear::expr::boolean_function::formatted_string() const { return std::string( typeid(m_function).name() ) + "( " + typeid(*m_value).name() + " )"; } // boolean_function::formatted_string() /*----------------------------------------------------------------------------*/ /** * \brief Set the fonction to call. * \param m The function to call. */ template void bear::expr::boolean_function::set_function ( FunctionType m ) { m_function(m); } // boolean_function::set_function() /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ template bear::expr::boolean_function::boolean_function() { } // boolean_function::boolean_function() /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param m The function to call with \a *inst as the only parameter. */ template bear::expr::boolean_function::boolean_function ( FunctionType m ) : m_function(m) { } // boolean_function::boolean_function() /*----------------------------------------------------------------------------*/ /** * \brief Create a copy of this expression. */ template bear::expr::base_boolean_expression* bear::expr::boolean_function::clone() const { return new boolean_function(*this); } // boolean_function::clone() /*----------------------------------------------------------------------------*/ /** * \brief Evaluate the expression. */ template bool bear::expr::boolean_function::evaluate() const { return m_function(); } // boolean_function::evaluate() /*----------------------------------------------------------------------------*/ /** * \brief Gets a formatted and human readable representation of this expression. */ template std::string bear::expr::boolean_function::formatted_string() const { return std::string( typeid(m_function).name() ) + "()"; } // boolean_function::formatted_string() /*----------------------------------------------------------------------------*/ /** * \brief Set the fonction to call. * \param m The function to call. */ template void bear::expr::boolean_function::set_function ( FunctionType m ) { m_function = m; } // boolean_function::set_function() /*----------------------------------------------------------------------------*/ /** * \brief Construct a boolean_function. * \param inst The instance on which we call the function. * \param m The function to call with \a *inst as the only parameter. * * This function is an easier way to create a boolean function than using the * constructor. Compare those two solutions, both creating a boolean function * that calls a member function of bear::expr::base_item: * * \code * typedef std::const_mem_fun_ref_t function_type; * boolean_expression f * ( boolean_function * ( item, function_type(&base_item::get_left()) ) ); * \endcode * and * \code * boolean_expression f * ( boolean_expression_maker * ( item, std::mem_fun_ref(&base_item::get_left()) ) ); * \endcode */ template bear::expr::boolean_function bear::expr::boolean_function_maker(const PointerType& inst, FunctionType m) { return boolean_function(inst, m); } // boolean_function_maker() /*----------------------------------------------------------------------------*/ /** * \brief Construct a boolean_function. * \param m The function to call. * * This function is an easier way to create a boolean function than using the * constructor. Compare those two solutions, both creating a boolean function * that calls boolean function: * * \code * typedef bool (*some_function)() function_type; * boolean_expression f * ( boolean_function( &my_function ) ); * \endcode * and * \code * boolean_expression f( boolean_expression_maker( &my_function ) ); * \endcode */ template bear::expr::boolean_function bear::expr::boolean_function_maker(FunctionType m) { return boolean_function(); } // boolean_function_maker() plee-the-bear-20251226/bear-engine/core/src/expr/impl/linear_function.tpp000066400000000000000000000053221512343254000261100ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::expr::linear_function class. * \author Julien Jorge. */ #include /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param inst The instance on which we call the function. * \param m The function to call with \a *inst as the only parameter. */ template bear::expr::linear_function::linear_function ( const PointerType& inst, FunctionType m ) : m_value(inst), m_function(m) { } // linear_function::linear_function() /*----------------------------------------------------------------------------*/ /** * \brief Create a copy of this expression. */ template bear::expr::base_linear_expression* bear::expr::linear_function::clone() const { return new linear_function(*this); } // linear_function::clone() /*----------------------------------------------------------------------------*/ /** * \brief Evaluate the expression. */ template double bear::expr::linear_function::evaluate() const { if ( m_value == static_cast(NULL) ) return std::numeric_limits::quiet_NaN(); else return (double)m_function(*m_value); } // linear_function::evaluate() /*----------------------------------------------------------------------------*/ /** * \brief Construct a linear_function. * \param inst The instance on which we call the function. * \param m The function to call with \a *inst as the only parameter. * * This function is an easier way to create a linear function than using the * constructor. Compare those two solutions, both creating a linear function * that calls a member function of bear::expr::base_item: * * \code * typedef std::const_mem_fun_ref_t function_type; * linear_expression f * ( linear_function * ( item, function_type(&base_item::get_left) ) ); * \endcode * and * \code * linear_expression f * ( linear_expression_maker * ( item, std::mem_fun_ref(&base_item::get_left) ) ); * \endcode */ template bear::expr::linear_function bear::expr::linear_function_maker(const PointerType& inst, FunctionType m) { return linear_function(inst, m); } // linear_function_maker() plee-the-bear-20251226/bear-engine/core/src/expr/linear_constant.hpp000066400000000000000000000017521512343254000251420ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A linear expression made of a single constant. * \author Julien Jorge */ #ifndef __EXPR_LINEAR_CONSTANT_HPP__ #define __EXPR_LINEAR_CONSTANT_HPP__ #include "expr/base_linear_expression.hpp" namespace bear { namespace expr { /** * \brief A linear expression made of a single constant. * \author Julien Jorge */ class EXPR_EXPORT linear_constant: public base_linear_expression { public: linear_constant( double v ); base_linear_expression* clone() const; double evaluate() const; void set_value( double b ); private: /** \brief The value of the constant. */ double m_value; }; // class linear_constant } // namespace expr } // namespace bear #endif // __EXPR_LINEAR_CONSTANT_HPP__ plee-the-bear-20251226/bear-engine/core/src/expr/linear_expression.hpp000066400000000000000000000113611512343254000255050ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A linear expression. * \author Julien Jorge */ #ifndef __EXPR_LINEAR_EXPRESSION_HPP__ #define __EXPR_LINEAR_EXPRESSION_HPP__ #include "expr/boolean_expression.hpp" namespace bear { namespace expr { class base_linear_expression; /** * \brief A linear expression. * \author Julien Jorge */ class EXPR_EXPORT linear_expression { public: /** \brief The base class for linear expressions. */ typedef base_linear_expression base_expression_type; public: linear_expression( double v = 0 ); linear_expression( const base_linear_expression& e ); linear_expression( const linear_expression& that ); ~linear_expression(); double evaluate() const; linear_expression& operator=( const linear_expression& that ); boolean_expression operator==( const linear_expression& that ) const; boolean_expression operator!=( const linear_expression& that ) const; boolean_expression operator<( const linear_expression& that ) const; boolean_expression operator<=( const linear_expression& that ) const; boolean_expression operator>( const linear_expression& that ) const; boolean_expression operator>=( const linear_expression& that ) const; linear_expression& operator+=( const linear_expression& that ); linear_expression& operator-=( const linear_expression& that ); linear_expression& operator*=( const linear_expression& that ); linear_expression& operator/=( const linear_expression& that ); linear_expression operator+( const linear_expression& that ) const; linear_expression operator-( const linear_expression& that ) const; linear_expression operator*( const linear_expression& that ) const; linear_expression operator/( const linear_expression& that ) const; std::string formatted_string() const; private: /** \brief The implemented expression. */ base_linear_expression* m_expr; }; // class linear_expression } // namespace expr } // namespace bear EXPR_EXPORT bear::expr::boolean_expression operator== ( const bear::expr::base_linear_expression& a, const bear::expr::base_linear_expression& b ); EXPR_EXPORT bear::expr::boolean_expression operator!= ( const bear::expr::base_linear_expression& a, const bear::expr::base_linear_expression& b ); EXPR_EXPORT bear::expr::boolean_expression operator==( double v, const bear::expr::base_linear_expression& e ); EXPR_EXPORT bear::expr::boolean_expression operator!=( double v, const bear::expr::base_linear_expression& e ); EXPR_EXPORT bear::expr::boolean_expression operator<( double v, const bear::expr::base_linear_expression& e ); EXPR_EXPORT bear::expr::boolean_expression operator<=( double v, const bear::expr::base_linear_expression& e ); EXPR_EXPORT bear::expr::boolean_expression operator>( double v, const bear::expr::base_linear_expression& e ); EXPR_EXPORT bear::expr::boolean_expression operator>=( double v, const bear::expr::base_linear_expression& e ); EXPR_EXPORT bear::expr::linear_expression operator+( double v, const bear::expr::base_linear_expression& e ); EXPR_EXPORT bear::expr::linear_expression operator-( double v, const bear::expr::base_linear_expression& e ); EXPR_EXPORT bear::expr::linear_expression operator*( double v, const bear::expr::base_linear_expression& e ); EXPR_EXPORT bear::expr::linear_expression operator/( double v, const bear::expr::base_linear_expression& e ); EXPR_EXPORT bear::expr::boolean_expression operator==( const bear::expr::base_linear_expression& e, double v ); EXPR_EXPORT bear::expr::boolean_expression operator!=( const bear::expr::base_linear_expression& e, double v ); EXPR_EXPORT bear::expr::boolean_expression operator<( const bear::expr::base_linear_expression& e, double v ); EXPR_EXPORT bear::expr::boolean_expression operator<=( const bear::expr::base_linear_expression& e, double v ); EXPR_EXPORT bear::expr::boolean_expression operator>( const bear::expr::base_linear_expression& e, double v ); EXPR_EXPORT bear::expr::boolean_expression operator>=( const bear::expr::base_linear_expression& e, double v ); EXPR_EXPORT bear::expr::linear_expression operator+( const bear::expr::base_linear_expression& e, double v ); EXPR_EXPORT bear::expr::linear_expression operator-( const bear::expr::base_linear_expression& e, double v ); EXPR_EXPORT bear::expr::linear_expression operator*( const bear::expr::base_linear_expression& e, double v ); EXPR_EXPORT bear::expr::linear_expression operator/( const bear::expr::base_linear_expression& e, double v ); #endif // __EXPR_LINEAR_EXPRESSION_HPP__ plee-the-bear-20251226/bear-engine/core/src/expr/linear_function.hpp000066400000000000000000000031541512343254000251340ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief An expression returning the result of a call of a function on any * class instance. * \author Julien Jorge */ #ifndef __EXPR_LINEAR_FUNCTION_HPP__ #define __EXPR_LINEAR_FUNCTION_HPP__ #include "expr/base_linear_expression.hpp" namespace bear { namespace expr { /** * \brief An expression returning the result of a call of a function on any * class instance. * * The evaluation of this expression is m(*inst), where \a m is the function * passed to the constructor, and \a inst the pointer passed to the * constructor. * * \author Julien Jorge */ template class linear_function: public base_linear_expression { public: linear_function( const PointerType& inst, FunctionType m ); base_linear_expression* clone() const; double evaluate() const; private: /** \brief The class on which we call the function. */ PointerType m_value; /** \brief The member function to call. */ FunctionType m_function; }; // class linear_function template linear_function linear_function_maker( const PointerType& inst, FunctionType m ); } // namespace expr } // namespace bear #include "expr/impl/linear_function.tpp" #endif // __EXPR_LINEAR_FUNCTION_HPP__ plee-the-bear-20251226/bear-engine/core/src/expr/linear_variable.hpp000066400000000000000000000017261512343254000250770ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A linear expression made of a linear variable. * \author Julien Jorge */ #ifndef __EXPR_LINEAR_VARIABLE_HPP__ #define __EXPR_LINEAR_VARIABLE_HPP__ #include "expr/base_linear_expression.hpp" namespace bear { namespace expr { /** * \brief A linear expression made of a linear variable. * \author Julien Jorge */ class EXPR_EXPORT linear_variable: public base_linear_expression { public: linear_variable( const double& v ); base_linear_expression* clone() const; double evaluate() const; private: /** \brief The value of the variable. */ const double& m_value; }; // class linear_variable } // namespace expr } // namespace bear #endif // __EXPR_LINEAR_VARIABLE_HPP__ plee-the-bear-20251226/bear-engine/core/src/expr/logical_not.hpp000066400000000000000000000022141512343254000242430ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A logical not of a boolean expression. * \author Julien Jorge */ #ifndef __EXPR_LOGICAL_NOT_HPP__ #define __EXPR_LOGICAL_NOT_HPP__ #include "expr/base_boolean_expression.hpp" #include "expr/boolean_expression.hpp" namespace bear { namespace expr { /** * \brief A logical not of a boolean expression. * \author Julien Jorge */ class EXPR_EXPORT logical_not: public base_boolean_expression { public: logical_not(); logical_not( const boolean_expression& op ); const boolean_expression& get_operand() const; void set_operand( const boolean_expression& op ); base_boolean_expression* clone() const; bool evaluate() const; std::string formatted_string() const; private: /** \brief The operand. */ boolean_expression m_operand; }; // class logical_not } // namespace expr } // namespace bear #endif // __EXPR_LOGICAL_NOT_HPP__ plee-the-bear-20251226/bear-engine/core/src/expr/logical_xor.hpp000066400000000000000000000022051512343254000242530ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A logical xor of two boolean expressions. * \author Julien Jorge */ #ifndef __EXPR_LOGICAL_XOR_HPP__ #define __EXPR_LOGICAL_XOR_HPP__ #include "expr/base_boolean_expression.hpp" #include "expr/boolean_expression.hpp" namespace bear { namespace expr { /** * \brief A logical xor of two boolean expressions. * \author Julien Jorge */ class EXPR_EXPORT logical_xor: public base_boolean_expression { public: logical_xor ( const boolean_expression& left, const boolean_expression& right ); base_boolean_expression* clone() const; bool evaluate() const; std::string formatted_string() const; private: /** \brief The left operand. */ boolean_expression m_left; /** \brief The right operand. */ boolean_expression m_right; }; // class logical_xor } // namespace expr } // namespace bear #endif // __EXPR_LOGICAL_XOR_HPP__ plee-the-bear-20251226/bear-engine/core/src/gui/000077500000000000000000000000001512343254000210475ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/core/src/gui/CMakeLists.txt000066400000000000000000000015631512343254000236140ustar00rootroot00000000000000set( GUI_TARGET_NAME bear_gui ) #------------------------------------------------------------------------------- set( GUI_SOURCE_FILES code/button.cpp code/callback.cpp code/callback_group.cpp code/checkable.cpp code/checkbox.cpp code/frame.cpp code/horizontal_flow.cpp code/multi_page.cpp code/picture.cpp code/radio_button.cpp code/radio_group.cpp code/scene_element.cpp code/static_text.cpp code/text_input.cpp code/visual_component.cpp ) add_library( ${GUI_TARGET_NAME} ${BEAR_ENGINE_CORE_LINK_TYPE} ${GUI_SOURCE_FILES} ) set_target_properties( ${GUI_TARGET_NAME} PROPERTIES INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/${BEAR_ENGINE_INSTALL_LIBRARY_DIR}" ) install( TARGETS ${GUI_TARGET_NAME} DESTINATION ${BEAR_ENGINE_INSTALL_LIBRARY_DIR} ) target_link_libraries( ${GUI_TARGET_NAME} bear_input bear_visual bear_time ) plee-the-bear-20251226/bear-engine/core/src/gui/base_callback.hpp000066400000000000000000000015621512343254000243120ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Base class for the callbacks of the controls. * \author Julien Jorge */ #ifndef __GUI_BASE_CALLBACK_HPP__ #define __GUI_BASE_CALLBACK_HPP__ #include "gui/class_export.hpp" namespace bear { namespace gui { /** * \brief Base class for the callbacks of the controls. * \author Julien Jorge */ class GUI_EXPORT base_callback { public: virtual ~base_callback() {} virtual base_callback* clone() const = 0; /** * \brief Execute the callback. */ virtual void execute() = 0; }; // class base_callback } // namespace gui } // namespace bear #endif // __GUI_BASE_CALLBACK_HPP__ plee-the-bear-20251226/bear-engine/core/src/gui/button.hpp000066400000000000000000000042621512343254000230770ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A button on which the user click to produce an action. * \author Julien Jorge */ #ifndef __GUI_BUTTON_HPP__ #define __GUI_BUTTON_HPP__ #include "gui/callback_group.hpp" #include "gui/visual_component.hpp" #include "gui/class_export.hpp" #include "visual/font/font.hpp" namespace bear { namespace gui { class picture; class static_text; /** * \brief A button on which the user click to produce an action. * \author Julien Jorge */ class GUI_EXPORT button: public visual_component { public: /** \brief The type of the font used to display the text. */ typedef visual::font font_type; public: button( const font_type& f, const std::string& label ); button( const font_type& f, const std::string& label, const callback& c ); button( const visual::sprite& icon ); void set_font( font_type f ); void set_margin( size_type m ); void set_text( const std::string& text ); void set_icon( const visual::sprite& icon ); const std::string& get_text() const; void add_callback( const callback& c ); private: void create(); void adjust_component_positions(); bool on_key_press( const input::key_info& key ); bool on_button_press ( input::joystick::joy_code joy_button, unsigned int joy_index ); bool on_mouse_press ( input::mouse::mouse_code key, const claw::math::coordinate_2d& pos ); bool on_finger_action( const input::finger_event& event ); private: /** \brief The text in the button. */ static_text* m_text; /** \brief The icon in the button. */ picture* m_icon; /** \brief Callback executed when the button is clicked. */ callback_group m_click_callback; /** \brief The size of the margin around the text of the button. */ size_type m_margin; }; // class button } // namespace gui } // namespace bear #endif // __GUI_BUTTON_HPP__ plee-the-bear-20251226/bear-engine/core/src/gui/callback.hpp000066400000000000000000000020641512343254000233160ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Wrapper for base_callback. * \author Julien Jorge */ #ifndef __GUI_CALLBACK_HPP__ #define __GUI_CALLBACK_HPP__ #include "gui/class_export.hpp" namespace bear { namespace gui { class base_callback; /** * \brief Wrapper for base_callback. * \author Julien Jorge */ class GUI_EXPORT callback { public: callback(); callback( const base_callback& c ); callback( const callback& that ); ~callback(); callback& operator=( const callback& that ); void execute(); bool operator==( const callback& that ) const; bool operator!=( const callback& that ) const; private: /** \brief The callback executed by this wrapper. */ base_callback* m_callback; }; // class callback } // namespace gui } // namespace bear #endif // __GUI_CALLBACK_HPP__ plee-the-bear-20251226/bear-engine/core/src/gui/callback_function.hpp000066400000000000000000000024321512343254000252220ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A callback that calls a given function. * \author Julien Jorge */ #ifndef __GUI_CALLBACK_FUNCTION_HPP__ #define __GUI_CALLBACK_FUNCTION_HPP__ #include "gui/base_callback.hpp" namespace bear { namespace gui { /** * \brief A callback that calls a given function. * \author Julien Jorge */ template class callback_function: public base_callback { public: callback_function( const F& f ); callback_function* clone() const; void execute(); private: /** \brief The function called by this callback. */ F m_function; }; // class callback_function /** * \brief A function to ease the creation of a callback_function. * \param f The function called by the callback. */ template callback_function callback_function_maker( const F& f ) { return callback_function(f); } // callback_function_maker() } // namespace gui } // namespace bear #include "gui/impl/callback_function.tpp" #endif // __GUI_CALLBACK_FUNCTION_HPP__ plee-the-bear-20251226/bear-engine/core/src/gui/callback_group.hpp000066400000000000000000000020051512343254000245250ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A callback that calls several callbacks. * \author Julien Jorge */ #ifndef __GUI_CALLBACK_GROUP_HPP__ #define __GUI_CALLBACK_GROUP_HPP__ #include "gui/base_callback.hpp" #include "gui/callback.hpp" #include namespace bear { namespace gui { class callback; /** * \brief A callback that calls several callbacks. * \author Julien Jorge */ class GUI_EXPORT callback_group: public base_callback { public: callback_group* clone() const; void execute(); void add( const callback& c ); bool empty() const; private: /** \brief The group called by this callback. */ std::vector m_group; }; // class callback_group } // namespace gui } // namespace bear #endif // __GUI_CALLBACK_GROUP_HPP__ plee-the-bear-20251226/bear-engine/core/src/gui/checkable.hpp000066400000000000000000000043511512343254000234640ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A checkable is something that can be checked, next to a text. * \author Julien Jorge */ #ifndef __GUI_CHECKABLE_HPP__ #define __GUI_CHECKABLE_HPP__ #include "gui/callback_group.hpp" #include "gui/visual_component.hpp" #include "gui/class_export.hpp" #include "visual/font/font.hpp" #include "visual/sprite.hpp" namespace bear { namespace gui { class static_text; /** * \brief A checkable is something that can be checked, next to a text. * \author Julien Jorge */ class GUI_EXPORT checkable: public visual_component { public: /** \brief The type of the font used to display the text. */ typedef visual::font font_type; public: checkable( const visual::sprite& off, const visual::sprite& on ); checkable ( const visual::sprite& off, const visual::sprite& on, font_type f ); void set_font( font_type f ); void set_text( const std::string& text ); void check( bool b = true ); void toggle_value(); void set_value( bool b ); const std::string& get_text() const; bool checked() const; void add_checked_callback( const callback& c ); void add_unchecked_callback( const callback& c ); private: void display( scene_element_list& e ) const; void create(); void fit(); void adjust_text_position(); private: /** \brief The text to draw. */ static_text* m_text; /** \brief Tell if the box is checked or not. */ bool m_checked; /** \brief The sprite displayed when the box is not checked. */ const visual::sprite m_off; /** \brief The sprite displayed when the box is checked. */ const visual::sprite m_on; /** \brief Callback executed when the checkable is checked. */ callback_group m_checked_callback; /** \brief Callback executed when the checkable is unchecked. */ callback_group m_unchecked_callback; }; // class checkable } // namespace gui } // namespace bear #endif // __GUI_CHECKABLE_HPP__ plee-the-bear-20251226/bear-engine/core/src/gui/checkbox.hpp000066400000000000000000000023761512343254000233560ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A checkbox with a text. * \author Julien Jorge */ #ifndef __GUI_CHECKBOX_HPP__ #define __GUI_CHECKBOX_HPP__ #include "gui/checkable.hpp" #include "gui/class_export.hpp" #include "visual/font/font.hpp" #include "visual/sprite.hpp" namespace bear { namespace gui { /** * \brief A checkbox with a text. * \author Julien Jorge */ class GUI_EXPORT checkbox: public checkable { public: checkbox( const visual::sprite& off, const visual::sprite& on ); checkbox ( const visual::sprite& off, const visual::sprite& on, font_type f ); private: bool on_key_press( const input::key_info& key ); bool on_button_press ( input::joystick::joy_code button, unsigned int joy_index ); bool on_mouse_press ( input::mouse::mouse_code key, const claw::math::coordinate_2d& pos ); bool on_finger_action( const input::finger_event& event ); }; // class checkbox } // namespace gui } // namespace bear #endif // __GUI_CHECKBOX_HPP__ plee-the-bear-20251226/bear-engine/core/src/gui/class_export.hpp000066400000000000000000000013731512343254000242720ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Definition of the GUI_EXPORT macro according to the fact that we * create the library or link to it. * \author Julien Jorge */ #ifndef __GUI_CLASS_EXPORT_HPP__ #define __GUI_CLASS_EXPORT_HPP__ #ifndef GUI_EXPORT # ifdef _WIN32 # ifdef bear_gui_EXPORTS # define GUI_EXPORT __declspec(dllexport) # else # define GUI_EXPORT __declspec(dllimport) # endif // def bear_gui_EXPORTS # else // def _WIN32 # define GUI_EXPORT # endif // def _WIN32 #endif // ndef GUI_EXPORT #endif // __GUI_CLASS_EXPORT_HPP__ plee-the-bear-20251226/bear-engine/core/src/gui/code/000077500000000000000000000000001512343254000217615ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/core/src/gui/code/button.cpp000066400000000000000000000162151512343254000240050ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the gui::button class. * \author Julien Jorge */ #include "gui/button.hpp" #include "gui/static_text.hpp" #include "gui/picture.hpp" #include "input/finger_event.hpp" #include "input/keyboard.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param f The font used to display the text. * \param label The text displayed in the button. */ bear::gui::button::button( const font_type& f, const std::string& label ) : visual_component(), m_text( NULL ), m_icon( NULL ), m_margin(0) { create(); m_text->set_font(f); m_text->set_text(label); fit(m_margin); } // button::button() /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param f The font used to display the text. * \param label The text displayed in the button. * \param c The function called when the button is activated. */ bear::gui::button::button ( const font_type& f, const std::string& label, const callback& c ) : visual_component(), m_text( NULL ), m_icon( NULL ), m_margin(0) { m_click_callback.add(c); create(); m_text->set_font(f); m_text->set_text(label); fit(m_margin); } // button::button() /*----------------------------------------------------------------------------*/ /** * \brief Constructs a button with an icon and no text. * \param icon The icon. */ bear::gui::button::button( const visual::sprite& icon ) : visual_component(), m_text( NULL ), m_icon( NULL ), m_margin(0) { create(); m_icon->set_size( icon.get_size() ); m_icon->set_picture( icon ); fit(m_margin); } // button::button() /*----------------------------------------------------------------------------*/ /** * \brief Set the font of the text. * \param f The new font. */ void bear::gui::button::set_font( font_type f ) { set_size_maximum(); m_text->set_font(f); adjust_component_positions(); } // button::set_font() /*----------------------------------------------------------------------------*/ /** * \brief Set the margin around the text of the control. * \param m The margin. */ void bear::gui::button::set_margin( size_type m ) { m_margin = m; adjust_component_positions(); } // button::set_margin() /*----------------------------------------------------------------------------*/ /** * \brief Set the text of the control. * \param text The new text. */ void bear::gui::button::set_text( const std::string& text ) { set_size_maximum(); m_text->set_text(text); adjust_component_positions(); } // button::set_text() /*----------------------------------------------------------------------------*/ /** * \brief Get the text of the control. */ const std::string& bear::gui::button::get_text() const { return m_text->get_text(); } // button::get_text() /*----------------------------------------------------------------------------*/ /** * \brief Sets the icon of the control. * \param icon The new icon. */ void bear::gui::button::set_icon( const visual::sprite& icon ) { set_size_maximum(); m_icon->set_size( icon.get_size() ); m_icon->set_picture( icon ); adjust_component_positions(); } // button::set_icon() /*----------------------------------------------------------------------------*/ /** * \brief Add a callback called when the button is clicked. * \param c The callback. */ void bear::gui::button::add_callback( const callback& c ) { m_click_callback.add(c); } // button::add_callback() /*----------------------------------------------------------------------------*/ /** * \brief Initialize the control. */ void bear::gui::button::create() { set_size_maximum(); m_text = new static_text(); insert( m_text ); m_text->set_auto_size(true); m_icon = new picture(); insert( m_icon ); } // button::create() /*----------------------------------------------------------------------------*/ /** * \brief Adjusts the placement of the icon and the label. */ void bear::gui::button::adjust_component_positions() { set_size_maximum(); const size_type h = std::max( m_text->height(), m_icon->height() ); m_icon->set_left( 0 ); m_icon->set_bottom( ( h - m_icon->height() ) / 2 ); if ( m_text->get_text().empty() || ( m_icon->width() == 0) ) m_text->set_left( 0 ); else m_text->set_left( m_icon->right() + m_margin ); m_text->set_bottom( ( h - m_text->height() ) / 2 ); fit(m_margin); } // button::adjust_component_positions() /*----------------------------------------------------------------------------*/ /** * \brief Tell that a key has been pressed. * \param key The code of the key. */ bool bear::gui::button::on_key_press( const bear::input::key_info& key ) { bool result = true; if ( key.is_enter() || (key.get_code() == input::keyboard::kc_space) ) m_click_callback.execute(); else result = false; return result; } // button::on_key_press() /*----------------------------------------------------------------------------*/ /** * \brief Tell that a joystick button has been pressed. * \param joy_button The code of the button. * \param joy_index The index of the joytick. */ bool bear::gui::button::on_button_press ( bear::input::joystick::joy_code joy_button, unsigned int joy_index ) { bool result = true; switch( joy_button ) { case bear::input::joystick::jc_button_1: case bear::input::joystick::jc_button_2: case bear::input::joystick::jc_button_3: case bear::input::joystick::jc_button_4: case bear::input::joystick::jc_button_5: case bear::input::joystick::jc_button_6: case bear::input::joystick::jc_button_7: case bear::input::joystick::jc_button_8: case bear::input::joystick::jc_button_9: case bear::input::joystick::jc_button_10: case bear::input::joystick::jc_button_11: case bear::input::joystick::jc_button_12: case bear::input::joystick::jc_button_13: case bear::input::joystick::jc_button_14: case bear::input::joystick::jc_button_15: case bear::input::joystick::jc_button_16: m_click_callback.execute(); break; default: result = false; } return result; } // button::on_button_press() /*----------------------------------------------------------------------------*/ /** * \brief Tell that a mouse button has been pressed. * \param key The code of the button. * \param pos The position of the mouse. */ bool bear::gui::button::on_mouse_press ( input::mouse::mouse_code key, const claw::math::coordinate_2d& pos ) { m_click_callback.execute(); return true; } // button::on_mouse_press() /*----------------------------------------------------------------------------*/ /** * \brief Validates the button in response to a finger event of type * finger_event::finger_event_pressed. * \param event The event. */ bool bear::gui::button::on_finger_action( const input::finger_event& event ) { if ( event.get_type() != input::finger_event::finger_event_pressed ) return false; m_click_callback.execute(); return true; } // button::on_finger_action() plee-the-bear-20251226/bear-engine/core/src/gui/code/callback.cpp000066400000000000000000000052201512343254000242200ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::gui::callback class. * \author Julien Jorge */ #include "gui/callback.hpp" #include "gui/base_callback.hpp" #include #include /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ bear::gui::callback::callback() : m_callback(NULL) { } // callback::callback() /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param c The callback to execute. */ bear::gui::callback::callback( const base_callback& c ) : m_callback(c.clone()) { } // callback::callback() /*----------------------------------------------------------------------------*/ /** * \brief Copy constructor. * \param that The instance to copy from. */ bear::gui::callback::callback( const callback& that ) : m_callback(NULL) { if ( that.m_callback != NULL ) m_callback = that.m_callback->clone(); } // callback::callback() /*----------------------------------------------------------------------------*/ /** * \brief Destructor. */ bear::gui::callback::~callback() { delete m_callback; } // callback::~callback() /*----------------------------------------------------------------------------*/ /** * \brief Assignement operator. * \param that The instance to copy from. */ bear::gui::callback& bear::gui::callback::operator=( const callback& that ) { callback tmp(that); std::swap(tmp.m_callback, m_callback); return *this; } // callback::operator=() /*----------------------------------------------------------------------------*/ /** * \brief Execute the callback. */ void bear::gui::callback::execute() { if ( m_callback != NULL ) m_callback->execute(); else claw::logger << claw::log_warning << "Executing a NULL callback." << std::endl; } // callback::execute() /*----------------------------------------------------------------------------*/ /** * \brief Check for equality. * \param that The instance to compare to. */ bool bear::gui::callback::operator==( const callback& that ) const { return m_callback == that.m_callback; } // callback::operator==() /*----------------------------------------------------------------------------*/ /** * \brief Check for disequality. * \param that The instance to compare to. */ bool bear::gui::callback::operator!=( const callback& that ) const { return m_callback != that.m_callback; } // callback::operator!=() plee-the-bear-20251226/bear-engine/core/src/gui/code/callback_group.cpp000066400000000000000000000025761512343254000254470ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::gui::callback_group class. * \author Julien Jorge */ #include "gui/callback_group.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Create a copy of this callback. */ bear::gui::callback_group* bear::gui::callback_group::clone() const { return new callback_group(*this); } // callback_group::clone() /*----------------------------------------------------------------------------*/ /** * \brief Execute the callback. */ void bear::gui::callback_group::execute() { for ( std::size_t i=0; i!=m_group.size(); ++i ) m_group[i].execute(); } // callback_group::execute() /*----------------------------------------------------------------------------*/ /** * \brief Add a callback in the group. * \param c The callback to add. */ void bear::gui::callback_group::add( const callback& c ) { m_group.push_back(c); } // callback_group::execute() /*----------------------------------------------------------------------------*/ /** * \brief Tell if there is no callback in the group. */ bool bear::gui::callback_group::empty() const { return m_group.empty(); } // callback_group::empty() plee-the-bear-20251226/bear-engine/core/src/gui/code/checkable.cpp000066400000000000000000000132701512343254000243710ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the gui::checkable class. * \author Julien Jorge */ #include "gui/checkable.hpp" #include "gui/static_text.hpp" #include "input/keyboard.hpp" #include "visual/scene_sprite.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param off The sprite displayed when the box is not checked. * \param on The sprite displayed when the box is checked. */ bear::gui::checkable::checkable ( const visual::sprite& off, const visual::sprite& on ) : visual_component(), m_text(NULL), m_checked(false), m_off(off), m_on(on) { create(); } // checkable::checkable() /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param off The sprite displayed when the box is not checked. * \param on The sprite displayed when the box is checked. * \param f The font used to display the text. */ bear::gui::checkable::checkable ( const visual::sprite& off, const visual::sprite& on, font_type f ) : visual_component(), m_text(NULL), m_checked(false), m_off(off), m_on(on) { create(); m_text->set_font(f); } // checkable::checkable() /*----------------------------------------------------------------------------*/ /** * \brief Set the font of the text. * \param f The new font. */ void bear::gui::checkable::set_font( font_type f ) { set_size_maximum(); m_text->set_font(f); adjust_text_position(); fit(); } // checkable::set_font() /*----------------------------------------------------------------------------*/ /** * \brief Set the text of the control. * \param text The new text. */ void bear::gui::checkable::set_text( const std::string& text ) { set_size_maximum(); m_text->set_text(text); adjust_text_position(); fit(); } // checkable::set_text() /*----------------------------------------------------------------------------*/ /** * \brief Check/uncheck the box. * \param b Tell if the box is checked or not. */ void bear::gui::checkable::check( bool b ) { if ( b == m_checked ) return; set_value(b); if ( m_checked ) m_checked_callback.execute(); else m_unchecked_callback.execute(); } // checkable::check() /*----------------------------------------------------------------------------*/ /** * \brief Toggle the value of the box. */ void bear::gui::checkable::toggle_value() { check( !checked() ); } // checkable::toggle_value() /*----------------------------------------------------------------------------*/ /** * \brief Set the value, without calling the callbacks. */ void bear::gui::checkable::set_value( bool b ) { m_checked = b; } // checkable::set_value() /*----------------------------------------------------------------------------*/ /** * \brief Get the text of the control. */ const std::string& bear::gui::checkable::get_text() const { return m_text->get_text(); } // checkable::get_text() /*----------------------------------------------------------------------------*/ /** * \brief Tell if the box is checked or not. */ bool bear::gui::checkable::checked() const { return m_checked; } // checkable::checked() /*----------------------------------------------------------------------------*/ /** * \brief Add a callback called when the box becomes checked. * \param c The callback. */ void bear::gui::checkable::add_checked_callback( const callback& c ) { m_checked_callback.add(c); } // checkable::add_checked_callback() /*----------------------------------------------------------------------------*/ /** * \brief Add a callback called when the box becomes unchecked. * \param c The callback. */ void bear::gui::checkable::add_unchecked_callback( const callback& c ) { m_unchecked_callback.add(c); } // checkable::add_unchecked_callback() /*----------------------------------------------------------------------------*/ /** * \brief Get the scene elements of the component. * \param e (out) The scene elements. */ void bear::gui::checkable::display( std::list& e ) const { position_type p( bottom_left() ); const coordinate_type c_x( std::max( m_on.width(), m_off.width() ) / 2 ); if (m_checked) { p.x += c_x - m_on.width() / 2; p.y += (height() - m_on.height()) / 2; e.push_back( visual::scene_sprite(p.x, p.y, m_on) ); } else { p.x += c_x - m_off.width() / 2; p.y += (height() - m_off.height()) / 2; e.push_back( visual::scene_sprite(p.x, p.y, m_off) ); } } // checkable::display() /*----------------------------------------------------------------------------*/ /** * \brief Initialize the control. */ void bear::gui::checkable::create() { set_size_maximum(); m_text = new static_text(); insert(m_text); m_text->set_auto_size(true); adjust_text_position(); fit(); } // checkable::create() /*----------------------------------------------------------------------------*/ /** * \brief Adjusts the size of the control to the size of its sub controls. */ void bear::gui::checkable::fit() { size_type w( std::max(m_on.width(), m_off.width()) ); if ( !m_text->get_text().empty() ) w += m_text->width() + 5; set_size ( w, std::max( std::max(m_on.height(), m_off.height()), m_text->height() ) ); } // checkable::fit() /*----------------------------------------------------------------------------*/ /** * \brief Adjusts the position of the text. */ void bear::gui::checkable::adjust_text_position() { m_text->set_position( std::max(m_off.width(), m_on.width() ) + 5, 0 ); } // checkable::adjust_text_position() plee-the-bear-20251226/bear-engine/core/src/gui/code/checkbox.cpp000066400000000000000000000073041512343254000242570ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the gui::checkbox class. * \author Julien Jorge */ #include "gui/checkbox.hpp" #include "input/finger_event.hpp" #include "input/keyboard.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param off The sprite displayed when the box is not checked. * \param on The sprite displayed when the box is checked. */ bear::gui::checkbox::checkbox ( const visual::sprite& off, const visual::sprite& on ) : checkable(off, on) { } // checkbox::checkbox() /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param off The sprite displayed when the box is not checked. * \param on The sprite displayed when the box is checked. * \param f The font used to display the text. */ bear::gui::checkbox::checkbox ( const visual::sprite& off, const visual::sprite& on, font_type f ) : checkable(off, on, f) { } // checkbox::checkbox() /*----------------------------------------------------------------------------*/ /** * \brief Tell that a key has been pressed. * \param key The code of the key. */ bool bear::gui::checkbox::on_key_press( const bear::input::key_info& key ) { bool result = true; if ( key.is_enter() || (key.get_code() == input::keyboard::kc_space) ) toggle_value(); else result = false; return result; } // checkbox::on_key_press() /*----------------------------------------------------------------------------*/ /** * \brief Tell that a joystick button has been pressed. * \param button The code of the button. * \param joy_index The index of the joytick. */ bool bear::gui::checkbox::on_button_press ( bear::input::joystick::joy_code button, unsigned int joy_index ) { bool result = true; switch( button ) { case bear::input::joystick::jc_button_1: case bear::input::joystick::jc_button_2: case bear::input::joystick::jc_button_3: case bear::input::joystick::jc_button_4: case bear::input::joystick::jc_button_5: case bear::input::joystick::jc_button_6: case bear::input::joystick::jc_button_7: case bear::input::joystick::jc_button_8: case bear::input::joystick::jc_button_9: case bear::input::joystick::jc_button_10: case bear::input::joystick::jc_button_11: case bear::input::joystick::jc_button_12: case bear::input::joystick::jc_button_13: case bear::input::joystick::jc_button_14: case bear::input::joystick::jc_button_15: case bear::input::joystick::jc_button_16: toggle_value(); break; default: result = false; } return result; } // checkbox::on_button_press() /*----------------------------------------------------------------------------*/ /** * \brief Tell that a mouse button has been pressed. * \param key The code of the button. * \param pos The position of the mouse. */ bool bear::gui::checkbox::on_mouse_press ( input::mouse::mouse_code key, const claw::math::coordinate_2d& pos ) { toggle_value(); return true; } // checkbox::on_mouse_press() /*----------------------------------------------------------------------------*/ /** * \brief Toggles the state of the box in response to a finger event of type * finger_event::finger_event_pressed. * \param event The event. */ bool bear::gui::checkbox::on_finger_action( const input::finger_event& event ) { if ( event.get_type() != input::finger_event::finger_event_pressed ) return false; toggle_value(); return true; } // checkbox::on_finger_action() plee-the-bear-20251226/bear-engine/core/src/gui/code/frame.cpp000066400000000000000000000137101512343254000235610ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::gui::frame class. * \author Julien Jorge */ #include "gui/frame.hpp" #include "visual/scene_writing.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ bear::gui::frame::frame() : visual_component(), m_content_frame(new visual_component()), m_font_size(0) { insert(m_content_frame); } // frame::frame() /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param title The title of the frame. */ bear::gui::frame::frame( const std::string& title ) : visual_component(), m_content_frame(new visual_component()), m_font_size(0) { insert(m_content_frame); set_title( title ); } // frame::frame() /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param title The title of the frame. * \param f The font used to display the title. * \param font_size The size of the font. */ bear::gui::frame::frame ( const std::string& title, const visual::font& f, visual::size_type font_size ) : visual_component(), m_content_frame(new visual_component()) { insert(m_content_frame); set_font(f); set_font_size(font_size); set_title( title ); } // frame::frame() /*----------------------------------------------------------------------------*/ /** * \brief Set the title of the frame. * \param t The new title. */ void bear::gui::frame::set_title( const std::string& t ) { m_title = t; update_displayed_title(); } // frame::() /*----------------------------------------------------------------------------*/ /** * \brief Get the title of the frame. */ const std::string& bear::gui::frame::get_title() const { return m_title; } // frame::get_title() /*----------------------------------------------------------------------------*/ /** * \brief Set the font used to display the title. * \param f The font. */ void bear::gui::frame::set_font( const visual::font& f ) { m_font = f; set_font_size(m_font_size); update_displayed_title(); } // frame::set_font() /*----------------------------------------------------------------------------*/ /** * \brief Get the font used to display the title. */ const bear::visual::font& bear::gui::frame::get_font() const { return m_font; } // frame::get_font() /*----------------------------------------------------------------------------*/ /** * \brief Set the size applied to the font when rendering the title. * \param s The size. */ void bear::gui::frame::set_font_size( visual::size_type s ) { if ( s <= 0 ) m_font_size = m_font.get_size(); else m_font_size = s; } // frame::set_font_size() /*----------------------------------------------------------------------------*/ /** * \brief Get the size applied to the font when rendering the title. */ bear::visual::size_type bear::gui::frame::get_font_size() const { return m_font_size; } // frame::get_font_size() /*----------------------------------------------------------------------------*/ /** * \brief Call this method when you close the frame. * \return True if the frame has been closed. */ bool bear::gui::frame::close() { return on_close(); } // frame::close() /*----------------------------------------------------------------------------*/ /** * \brief Method called before closing the frame. * \return True if the frame can be closed. */ bool bear::gui::frame::on_close() { return true; } // frame::on_close() /*----------------------------------------------------------------------------*/ /** * \brief Get the component in which to add the children of the frame. */ bear::gui::visual_component& bear::gui::frame::get_content() { return *m_content_frame; } // frame::get_content() /*----------------------------------------------------------------------------*/ /** * \brief Call this method to make the component fitting its children. * \param margin The margin around the content frame. */ void bear::gui::frame::fit( size_type margin ) { m_content_frame->fit( margin ); set_size( std::max(m_content_frame->width(), m_displayed_title.get_width()) + 2 * get_border_size(), m_content_frame->height() + compute_title_height() + 2 * get_border_size() ); } // frame::fit() /*----------------------------------------------------------------------------*/ /** * \brief Get the scene elements of the component. * \param e (out) The scene elements. */ void bear::gui::frame::display( std::list& e ) const { visual::scene_writing t ( left() + get_border_size(), top() - compute_title_height() - get_border_size(), m_displayed_title ); const double factor = m_font_size / m_font.get_line_spacing(); t.set_scale_factor( factor, factor ); e.push_back(t); } // frame::display() /*----------------------------------------------------------------------------*/ /** * \brief Method called after the component has been resized. */ void bear::gui::frame::on_resized() { m_content_frame->set_size ( width() - 2 * get_border_size(), height() - 2 * get_border_size() - compute_title_height() ); } // frame::on_resized() /*----------------------------------------------------------------------------*/ /** * \brief Get the scene elements for the background of the frame. * \param e (out) The scene elements. */ bear::visual::size_type bear::gui::frame::compute_title_height() const { return (m_displayed_title.get_height() / m_font.get_size()) * m_font_size; } // frame::compute_title_height() /*----------------------------------------------------------------------------*/ /** * \brief Update the writing used to display the text. */ void bear::gui::frame::update_displayed_title() { m_displayed_title.create( m_font, m_title ); } // frame::update_displayed_title() plee-the-bear-20251226/bear-engine/core/src/gui/code/horizontal_flow.cpp000066400000000000000000000327241512343254000257150ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::gui::horizontal_flow class. * \author Julien Jorge */ #include "gui/horizontal_flow.hpp" #include "visual/scene_rectangle.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param horizontal_margin The horizontal margin between the children * components. * \param vertical_margin The vertical margin between the children components. * \param selected color Color used to display rectangle around selected * childrens. */ bear::gui::horizontal_flow::horizontal_flow ( size_type horizontal_margin, size_type vertical_margin, bear::visual::color_type selected_color ) : visual_component(), m_horizontal_margin(horizontal_margin), m_vertical_margin(vertical_margin), m_selected_children(NULL), m_selected_color(selected_color) { // nothing to do } // horizontal_flow::horizontal_flow() /*----------------------------------------------------------------------------*/ /** * \brief Set the horizontal margin between the children components. * \param m The horizontal margin between the children components. */ void bear::gui::horizontal_flow::set_horizontal_margin( size_type m ) { set_margins( m, m_vertical_margin ); } // horizontal_flow::set_horizontal_margin() /*----------------------------------------------------------------------------*/ /** * \brief Set the vertical margin between the children components. * \param m The vertical margin between the children components. */ void bear::gui::horizontal_flow::set_vertical_margin( size_type m ) { set_margins( m_horizontal_margin, m ); } // horizontal_flow::set_vertical_margin() /*----------------------------------------------------------------------------*/ /** * \brief Set the margins between the children components. * \param horizontal The horizontal margin between the chidren components. * \param vertical The vertical margin between the children components. */ void bear::gui::horizontal_flow::set_margins ( size_type horizontal, size_type vertical ) { m_horizontal_margin = horizontal; m_vertical_margin = vertical; adjust_children_positions(); } // horizontal_flow::set_margins() /*----------------------------------------------------------------------------*/ /** * \brief Get the scene elements of the component. * \param e (out) The scene elements. */ void bear::gui::horizontal_flow::display ( std::list& e ) const { if ( m_selected_children != NULL ) { visual::rectangle_type rect (0, 0, m_selected_children->get_size().x + 2, m_selected_children->get_size().y + 2 ); e.push_back ( visual::scene_rectangle (left() + m_selected_children->left() - 1, bottom() + m_selected_children->bottom() - 1, m_selected_color, rect, false, 2) ); } } // horizontal_flow::display() /*----------------------------------------------------------------------------*/ /** * \brief Method called when a mouse moves over the frame. * \param pos The position of the mouse. */ bool bear::gui::horizontal_flow::process_mouse_move ( const claw::math::coordinate_2d& pos ) { highlight_control_at(pos); return false; } // frame::process_mouse_move() /*----------------------------------------------------------------------------*/ /** * \brief Function called when a key is pressed. * \param key The pressed key. */ bool bear::gui::horizontal_flow::on_key_press( const input::key_info& key ) { return special_code( key ); } // horizontal_flow::on_key_press() /*----------------------------------------------------------------------------*/ /** * \brief Method called when a mouse moves over the frame. * \param pos The position of the mouse. */ bool bear::gui::horizontal_flow::on_mouse_move ( const claw::math::coordinate_2d& pos ) { return process_mouse_move(pos); } // frame::on_mouse_move() /*----------------------------------------------------------------------------*/ /** * \brief Highlight a control at a given position. * \param pos A position where the control is. */ bool bear::gui::horizontal_flow::highlight_control_at ( const claw::math::coordinate_2d& pos ) { bool stop(false); for ( iterator it = begin(); !stop && (it != end()); ++it ) if ( it->get_rectangle().includes(pos) && it->get_visible() ) { stop = true; m_selected_children = &(*it); it->set_focus(); } return stop; } // frame::highlight_control_at() /*----------------------------------------------------------------------------*/ /** * \brief Process a special key code. * \param key The code of the key. * \return True if the code has been processed. */ bool bear::gui::horizontal_flow::special_code( const input::key_info& key ) { bool result = false; if ( key.is_left() ) result = move_left(); else if ( key.is_right() ) result = move_right(); else if ( key.is_up() ) result = move_up(); else if ( key.is_down() ) result = move_down(); return result; } // horizontal_flow::special_code() /*----------------------------------------------------------------------------*/ /** * \brief Give focus at a chidren at top of a given position. * \param line The line of current focused children. * \param column Column of current focused children. * \return True if children at left exists. */ bool bear::gui::horizontal_flow::children_at_top (unsigned int line, unsigned int column) { bool result(false); if ( line > 0 ) { line--; if ( !m_childrens_array[line].empty() ) { if ( column >= m_childrens_array[line].size() ) column = m_childrens_array[line].size() - 1; m_selected_children = m_childrens_array[line][column]; m_childrens_array[line][column]->set_focus(); result = true; } } return result; } // children_at_top() /*----------------------------------------------------------------------------*/ /** * \brief Give focus at a chidren at bottom of a given position. * \param line The line of current focused children. * \param column Column of current focused children. * \return True if children at left exists. */ bool bear::gui::horizontal_flow::children_at_bottom (unsigned int line, unsigned int column) { bool result(false); line++; if ( line < m_childrens_array.size() ) { if ( !m_childrens_array[line].empty() ) { if ( column >= m_childrens_array[line].size() ) column = m_childrens_array[line].size() - 1; m_selected_children = m_childrens_array[line][column]; m_childrens_array[line][column]->set_focus(); result = true; } } return result; } // children_at_bottom() /*----------------------------------------------------------------------------*/ /** * \brief Get the iterator on selected children. */ bear::gui::visual_component::iterator bear::gui::horizontal_flow::get_selected_children() { iterator it=begin(); bool stop(false); if ( m_selected_children != NULL ) while ( ( it != end() ) && ( !stop ) ) { if ( &(*it) == m_selected_children ) stop = true; else ++it; } else it = end(); return it; } // get_selected_children() /*----------------------------------------------------------------------------*/ /** * \brief Compute position of selected children in childrens array. * \param line The line of selected children (out). * \param column Column of selected chldren (out). * \return True if found. */ bool bear::gui::horizontal_flow::get_selected_children_in_array (unsigned int & line, unsigned int & column) { bool stop(false); if (m_selected_children != NULL ) for (unsigned int i = 0; (i < m_childrens_array.size()) && !stop; ++i ) for (unsigned int j = 0; (jset_focus(); result = true; } return result; } // horizontal_flow::move_left() /*----------------------------------------------------------------------------*/ /** * \brief Move the cursor one character to the right. * \return True if the code has been processed. */ bool bear::gui::horizontal_flow::move_right() { bool result(false); iterator it=get_selected_children(); if ( it!=end() ) { ++it; if ( it!=end() ) if ( it->get_visible() ) { m_selected_children = &(*it); it->set_focus(); result = true; } } return result; } // horizontal_flow::move_right() /*----------------------------------------------------------------------------*/ /** * \brief Move the cursor one character to the top. * \return True if the code has been processed. */ bool bear::gui::horizontal_flow::move_up() { bool result(false); unsigned int line, column; if ( get_selected_children_in_array(line, column) ) result = children_at_top(line, column); return result; } // horizontal_flow::move_up() /*----------------------------------------------------------------------------*/ /** * \brief Move the cursor one character to the bottom. * \return True if the code has been processed. */ bool bear::gui::horizontal_flow::move_down() { bool result(false); unsigned int line, column; if ( get_selected_children_in_array(line, column) ) result = children_at_bottom(line, column); return result; } // horizontal_flow::move_down() /*----------------------------------------------------------------------------*/ /** * \brief Method called after the component has been resized. The position of * the children are updated to fill the component. */ void bear::gui::horizontal_flow::on_resized() { adjust_children_positions(); } // horizontal_flow::on_resized() /*----------------------------------------------------------------------------*/ /** * \brief Method called after calling clear function. */ void bear::gui::horizontal_flow::on_clear() { m_selected_children = NULL; } // horizontal_flow::on_clear() /*----------------------------------------------------------------------------*/ /** * \brief Method called after the insertion of a child. * \param child The child inserted in this component. */ void bear::gui::horizontal_flow::on_child_inserted( visual_component* child ) { adjust_children_positions(); if ( m_selected_children == NULL ) m_selected_children = child; } // horizontal_flow::on_child_inserted() /*----------------------------------------------------------------------------*/ /** * \brief Method called after the removal of a child. * \param child The child removed from this component. */ void bear::gui::horizontal_flow::on_child_removed( visual_component* child ) { adjust_children_positions(); } // horizontal_flow::on_child_removed() /*----------------------------------------------------------------------------*/ /** * \brief The focus has been set on the frame or one of its children. */ void bear::gui::horizontal_flow::on_focused() { iterator it(get_selected_children()); if ( it != end() ) m_selected_children = &(*it); else if ( begin() != end() ) { m_selected_children = &(*(begin())); m_selected_children->set_focus(); } } // gui::horizontal_flow::on_focused() /*----------------------------------------------------------------------------*/ /** * \brief Adjust he position of the children to fill the component. */ void bear::gui::horizontal_flow::adjust_children_positions() { iterator first=begin(); coordinate_type top = height() - m_vertical_margin; unsigned int line=0; m_childrens_array.clear(); while ( first != end() ) { bool stop = false; size_type line_width = 2 * m_horizontal_margin; size_type line_height = 0; iterator last = first; while ( !stop && last!=end() ) if ( line_width + last->width() > width() ) stop = true; else { line_width += last->width() + m_horizontal_margin; line_height = std::max( line_height, last->height() ); ++last; } if ( top < line_height ) // no more child will be visible. for ( ; first!=end(); ++first ) first->set_visible(false); else { if ( first!=last ) m_childrens_array.push_back(std::vector()); coordinate_type x = m_horizontal_margin; for ( ; first!=last; ++first ) { first->set_visible(true); first->set_position ( x, top - line_height + (line_height - first->height()) / 2 ); x += first->width() + m_horizontal_margin; m_childrens_array[line].push_back(&(*first)); } } top -= line_height + m_vertical_margin; line++; } } // horizontal_flow::adjust_children_positions() plee-the-bear-20251226/bear-engine/core/src/gui/code/multi_page.cpp000066400000000000000000000101501512343254000246100ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::gui::multi_page class. * \author Julien Jorge */ #include "gui/multi_page.hpp" #include "gui/static_text.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param f The font used to draw the text. */ bear::gui::multi_page::multi_page( font_type f ) : visual_component(), m_current_mark(0) { m_static_text = new static_text(f); m_dots_text = new static_text(f); m_dots_text->set_auto_size(true); m_dots_text->set_text("[...]"); m_dots_text->set_visible(false); // The multipage must at least contain the dots. */ set_size( m_dots_text->get_size() ); insert( m_static_text ); insert( m_dots_text ); set_text(""); } // multi_page::multi_page() /*----------------------------------------------------------------------------*/ /** * \brief Show the previous page of text. */ void bear::gui::multi_page::previous() { if ( m_current_mark != 0 ) { --m_current_mark; set_static_text(); } } // multi_page::previous() /*----------------------------------------------------------------------------*/ /** * \brief Show the next page of text. */ void bear::gui::multi_page::next() { if (m_bookmark.size() > 1) if ( m_current_mark + 1 < m_bookmark.size() ) { ++m_current_mark; set_static_text(); } } // multi_page::next() /*----------------------------------------------------------------------------*/ /** * \brief Set the text to show. * \param text the new text. */ void bear::gui::multi_page::set_text( const std::string& text ) { m_text = text; create_indices(); m_current_mark = 0; set_static_text(); } // multi_page::set_text() /*----------------------------------------------------------------------------*/ /** * \brief Adjust sub components when the size is changed. */ void bear::gui::multi_page::on_resized() { const bool large_enough ( ( width() >= m_dots_text->width() ) && ( height() >= 2 * m_dots_text->height() ) ); m_dots_text->set_visible( large_enough ); m_static_text->set_visible( large_enough ); if ( large_enough ) { m_dots_text->set_position ( position_type( width() - m_dots_text->width() - 1, 1 ) ); m_static_text->set_size ( size_box_type( width(), height() - m_dots_text->height() ) ); m_static_text->set_position( position_type( 0, m_dots_text->height() ) ); } create_indices(); m_current_mark = 0; set_static_text(); } // multi_page::on_resized() /*----------------------------------------------------------------------------*/ /** * \brief Set the text displayed in the static_text and move m_current_mark. */ void bear::gui::multi_page::set_static_text() { if ( m_current_mark + 1 != m_bookmark.size() ) { m_static_text->set_text( std::string( m_bookmark[m_current_mark], m_bookmark[m_current_mark + 1] ) ); m_dots_text->set_visible( m_bookmark[m_current_mark+1] != m_text.end() ); } } // multi_page::set_static_text() /*----------------------------------------------------------------------------*/ /** * \brief Create the iterators on each page of the text. */ void bear::gui::multi_page::create_indices() { m_bookmark.clear(); std::string::const_iterator it = m_text.begin(); m_bookmark.push_back( it ); while ( it != m_text.end() ) { const std::string text( it, std::string::const_iterator(m_text.end()) ); const std::size_t text_length( m_static_text->get_longest_text( text ) ); if ( text_length == 0 ) break; const std::string::size_type next_position ( m_text.find_first_not_of ( ' ', (it - m_text.begin()) + text_length ) ); if ( next_position == std::string::npos ) it = m_text.end(); else it = m_text.begin() + next_position; m_bookmark.push_back( it ); } } // multi_page::create_indices() plee-the-bear-20251226/bear-engine/core/src/gui/code/picture.cpp000066400000000000000000000017521512343254000241450ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::gui::picture class. * \author Julien Jorge */ #include "gui/picture.hpp" #include "visual/scene_sprite.hpp" #include /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param pict The sprite to display. */ bear::gui::picture::picture( const visual::sprite& pict ) : scene_element(visual::scene_sprite(0, 0, pict)) { } // picture::picture() /*----------------------------------------------------------------------------*/ /** * \brief Set the displayed picture. * \param pict The picture to display. */ void bear::gui::picture::set_picture( const visual::sprite& pict ) { set_scene_element( visual::scene_sprite(0, 0, pict) ); } // picture::set_picture() plee-the-bear-20251226/bear-engine/core/src/gui/code/radio_button.cpp000066400000000000000000000063571512343254000251710ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the gui::radio_button class. * \author Julien Jorge */ #include "gui/radio_button.hpp" #include "input/keyboard.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param off The sprite displayed when the box is not checked. * \param on The sprite displayed when the box is checked. */ bear::gui::radio_button::radio_button ( const visual::sprite& off, const visual::sprite& on ) : checkable(off, on) { } // radio_button::radio_button() /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param off The sprite displayed when the box is not checked. * \param on The sprite displayed when the box is checked. * \param f The font used to display the text. */ bear::gui::radio_button::radio_button ( const visual::sprite& off, const visual::sprite& on, font_type f ) : checkable(off, on, f) { } // radio_button::radio_button() /*----------------------------------------------------------------------------*/ /** * \brief Tell that a key has been pressed. * \param key The code of the key. */ bool bear::gui::radio_button::on_key_press( const bear::input::key_info& key ) { bool result = true; if ( key.is_enter() || (key.get_code() == input::keyboard::kc_space) ) check(); else result = false; return result; } // radio_button::on_key_press() /*----------------------------------------------------------------------------*/ /** * \brief Tell that a joystick button has been pressed. * \param button The code of the button. * \param joy_index The index of the joytick. */ bool bear::gui::radio_button::on_button_press ( bear::input::joystick::joy_code button, unsigned int joy_index ) { bool result = true; switch( button ) { case bear::input::joystick::jc_button_1: case bear::input::joystick::jc_button_2: case bear::input::joystick::jc_button_3: case bear::input::joystick::jc_button_4: case bear::input::joystick::jc_button_5: case bear::input::joystick::jc_button_6: case bear::input::joystick::jc_button_7: case bear::input::joystick::jc_button_8: case bear::input::joystick::jc_button_9: case bear::input::joystick::jc_button_10: case bear::input::joystick::jc_button_11: case bear::input::joystick::jc_button_12: case bear::input::joystick::jc_button_13: case bear::input::joystick::jc_button_14: case bear::input::joystick::jc_button_15: case bear::input::joystick::jc_button_16: check(); break; default: result = false; } return result; } // radio_button::on_button_press() /*----------------------------------------------------------------------------*/ /** * \brief Tell that a mouse button has been pressed. * \param key The code of the button. * \param pos The position of the mouse. */ bool bear::gui::radio_button::on_mouse_press ( input::mouse::mouse_code key, const claw::math::coordinate_2d& pos ) { check(); return true; } // radio_button::on_mouse_press() plee-the-bear-20251226/bear-engine/core/src/gui/code/radio_group.cpp000066400000000000000000000034561512343254000250070ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::gui::radio_group class. * \author Julien Jorge */ #include "gui/radio_group.hpp" #include "gui/callback_function.hpp" #include "gui/radio_button.hpp" #include /*----------------------------------------------------------------------------*/ /** * \brief Add a button in the group. * \param b The button to add. * \param margin The margin with the previous button in the group. */ void bear::gui::radio_group::add_button ( radio_button* b, visual::size_type margin ) { if ( m_buttons.empty() ) b->set_bottom(margin); else b->set_bottom( m_buttons.back()->top() + margin ); b->add_checked_callback ( callback_function_maker ( boost::bind( &radio_group::on_check, this, m_buttons.size() ) ) ); m_buttons.push_back(b); insert( b ); } // radio_group::add_button() /*----------------------------------------------------------------------------*/ /** * \brief Returns the selected radio button. */ const bear::gui::radio_button* bear::gui::radio_group::get_selection() const { for ( std::size_t i=0; i!=m_buttons.size(); ++i ) if ( m_buttons[i]->checked() ) return m_buttons[i]; return NULL; } // radio_group::get_selection( ) /*----------------------------------------------------------------------------*/ /** * \brief Answer to a click on a button of the group; * \param b The index of the selected button. */ void bear::gui::radio_group::on_check( std::size_t b ) const { for ( std::size_t i=0; i!=m_buttons.size(); ++i ) if ( b != i ) m_buttons[i]->set_value(false); } // radio_group::on_check() plee-the-bear-20251226/bear-engine/core/src/gui/code/scene_element.cpp000066400000000000000000000043551512343254000253020ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::gui::scene_element class. * \author Julien Jorge */ #include "gui/scene_element.hpp" #include /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param e The element to display. */ bear::gui::scene_element::scene_element( const visual::scene_element& e ) : visual_component(), m_element(e) { set_size( e.get_element_width(), e.get_element_height() ); } // scene_element::scene_element() /*----------------------------------------------------------------------------*/ /** * \brief Set the displayed scene_element. * \param e The scene_element to display. */ void bear::gui::scene_element::set_scene_element( const visual::scene_element& e ) { m_element = e; stretch_element(); } // scene_element::set_scene_element() /*----------------------------------------------------------------------------*/ /** * \brief Get the scene elements of the component. * \param e (out) The scene elements. */ void bear::gui::scene_element::display ( std::list& e ) const { visual::scene_element elem(m_element); elem.set_position(left(), bottom()); e.push_back(elem); } // scene_element::display() /*----------------------------------------------------------------------------*/ /** * \brief Method called after the component has been resized. */ void bear::gui::scene_element::on_resized() { visual_component::on_resized(); stretch_element(); } // visual_component::on_resized() /*----------------------------------------------------------------------------*/ /** * \brief Make the scene element to fit the component */ void bear::gui::scene_element::stretch_element() { const double rx = width() / m_element.get_element_width(); const double ry = height() / m_element.get_element_height(); m_element.set_scale_factor( std::min(rx, ry) ); m_element.set_position ( (width() - m_element.get_width()) / 2, (height() - m_element.get_height()) / 2 ); } // visual_component::stretch_element() plee-the-bear-20251226/bear-engine/core/src/gui/code/static_text.cpp000066400000000000000000000210111512343254000250130ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::gui::static_text class. * \author Julien Jorge */ #include "gui/static_text.hpp" #include "visual/scene_writing.hpp" #include "visual/text_metric.hpp" #include "visual/text_layout.hpp" #include "visual/text_layout_display_size.hpp" #include /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param result (out) The length of the longest text. * * The instance keep the references on each parameter. So they must live longen * than \a this. */ bear::gui::static_text::arrange_longest_text::arrange_longest_text ( std::size_t& result ) : m_result(result) { } // static_text::arrange_longest_text::arrange_longest_text() /*----------------------------------------------------------------------------*/ /** * \brief Save the index of the last character displayed. * \param p The position where the word starts. * \param first The first character of the word to display. * \param last The character just past the last character to display. */ void bear::gui::static_text::arrange_longest_text::operator() ( position_type p, std::size_t first, std::size_t last ) { m_result = last; } // static_text::arrange_longest_text::operator()() /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ bear::gui::static_text::static_text() : visual_component(), m_auto_size(false), m_margin(1, 1) { set_size(m_margin); } // static_text::static_text() /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param f The font used to draw the text. */ bear::gui::static_text::static_text( font_type f ) : visual_component(), m_font(f), m_auto_size(false), m_margin(1, 1) { } // static_text::static_text() /*----------------------------------------------------------------------------*/ /** * \brief Set the Font used to draw the text. * \param b The new value. */ void bear::gui::static_text::set_font( font_type f ) { m_font = f; if (m_auto_size) adjust_size_to_text(); refresh_writing(); } // static_text::set_font() /*----------------------------------------------------------------------------*/ /** * \brief Tell if the control must adjust its size to fit the text. * \param b The new value. */ void bear::gui::static_text::set_auto_size( bool b ) { m_auto_size = b; if (m_auto_size) adjust_size_to_text(); } // static_text::set_auto_size() /*----------------------------------------------------------------------------*/ /** * \brief Remove the text from the component. */ void bear::gui::static_text::clear() { set_text( std::string() ); } // static_text::clear() /*----------------------------------------------------------------------------*/ /** * \brief Set the text to draw. * \param text The text to draw. */ void bear::gui::static_text::set_text( const std::string& text ) { m_text = text; if (m_auto_size) adjust_size_to_text(); refresh_writing(); } // static_text::set_text() /*----------------------------------------------------------------------------*/ /** * \brief Get the text. */ const std::string& bear::gui::static_text::get_text() const { return m_text; } // static_text::get_text() /*----------------------------------------------------------------------------*/ /** * \brief Get the font used for displaying the text. */ bear::gui::static_text::font_type bear::gui::static_text::get_font() const { return m_font; } // static_text::get_font() /*----------------------------------------------------------------------------*/ /** * \brief Adjusts the height to fit the text. */ void bear::gui::static_text::expand_vertically() { const size_box_type s ( width() - 2 * m_margin.x, m_font.get_line_spacing() * m_text.length() ); visual::text_layout_display_size func( m_text, m_font, s.y ); visual::text_layout layout ( m_font, m_text, s, visual::text_align::align_left ); layout.arrange_text( func ); set_size( func.get_bounding_box().size() + 2 * m_margin ); } // static_text::expand_vertically() /*----------------------------------------------------------------------------*/ /** * \brief Gets the length of the longest text that can be displayed in this * component. * \param text The text on which we work. * \return the position of the first character out of the component. */ std::size_t bear::gui::static_text::get_longest_text ( const std::string& text ) const { std::size_t result(0); arrange_longest_text func(result); visual::text_layout layout( m_font, text, get_size() - 2 * m_margin ); layout.arrange_text( func ); return result; } // static_text::get_longest_text() /*----------------------------------------------------------------------------*/ /** * \brief Set the margins between the text and the borders of the control. * \param x The margin on the x-axis. * \param y The margin on the y-axis. */ void bear::gui::static_text::set_margin( coordinate_type x, coordinate_type y ) { m_margin.x = x; m_margin.y = y; } // static_text::set_margin() /*----------------------------------------------------------------------------*/ /** * \brief Set the margins between the text and the borders of the control. * \param m The margins. */ void bear::gui::static_text::set_margin( const size_box_type& m ) { m_margin = m; } // static_text::set_margin() /*----------------------------------------------------------------------------*/ /** * \brief Gets the margins between the text and the borders of the control. */ bear::gui::size_box_type bear::gui::static_text::get_margin() const { return m_margin; } // static_text::get_margin() /*----------------------------------------------------------------------------*/ /** * \brief Get the minimal height required to display one line of text. */ bear::gui::size_type bear::gui::static_text::get_min_height_with_text() const { return 2 * m_margin.y + m_font.get_line_spacing(); } // static_text::get_min_height_with_text() /*----------------------------------------------------------------------------*/ /** * \brief Get the rendering attributes on text. */ bear::visual::bitmap_rendering_attributes& bear::gui::static_text::get_text_rendering_attributes() { return m_text_rendering_attributes; } // static_text::get_text_rendering_attributes() /*----------------------------------------------------------------------------*/ /** * \brief Get the rendering attributes on text. */ const bear::visual::bitmap_rendering_attributes& bear::gui::static_text::get_text_rendering_attributes() const { return m_text_rendering_attributes; } // static_text::get_text_rendering_attributes() /*----------------------------------------------------------------------------*/ /** * \brief Get the scene elements of the component. * \param e (out) The scene elements. */ void bear::gui::static_text::display ( std::list& e ) const { visual::scene_writing new_e (left() + m_margin.x, bottom() + m_margin.y, m_writing); new_e.get_rendering_attributes().combine(m_text_rendering_attributes); e.push_back( new_e ); } // static_text::display() /*----------------------------------------------------------------------------*/ /** * \brief Adjust the size of the component to fit the text. */ void bear::gui::static_text::adjust_size_to_text() { visual::text_metric tm( m_text, m_font ); size_box_type size( tm.width(), tm.height() ); set_size( size + 2 * m_margin ); } // static_text::adjust_size_to_text() /*----------------------------------------------------------------------------*/ /** * \brief Method called when the size of the component has changed. */ void bear::gui::static_text::on_resized() { bool invalid_size(false); size_box_type s(get_size()); if ( width() < 2 * m_margin.x ) { s.x = 2 * m_margin.x; invalid_size = true; } if ( height() < 2 * m_margin.y ) { s.y = 2 * m_margin.y; invalid_size = true; } if (invalid_size) set_size(s); else refresh_writing(); } // static_text::on_resized() /*----------------------------------------------------------------------------*/ /** * \brief Recreate m_writing. */ void bear::gui::static_text::refresh_writing() { m_writing.create( m_font, m_text, get_size() - 2 * m_margin ); } // static_text::refresh_writing() plee-the-bear-20251226/bear-engine/core/src/gui/code/text_input.cpp000066400000000000000000000210531512343254000246710ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::gui::text_input class. * \author Julien Jorge */ #include "gui/text_input.hpp" #include "gui/static_text.hpp" #include "visual/scene_line.hpp" #include "time/time.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param f The font used to draw the text. * \param cursor_color The color of the cursor. */ bear::gui::text_input::text_input ( font_type f, visual::color_type cursor_color ) : visual_component(), m_cursor(0), m_cursor_color(cursor_color), m_first(0), m_last(0), m_line_length(0) { m_static_text = new static_text(f); insert(m_static_text); } // text_input::text_input() /*----------------------------------------------------------------------------*/ /** * \brief Remove the text from the control. */ void bear::gui::text_input::clear() { set_text( std::string() ); } // text_input::clear() /*----------------------------------------------------------------------------*/ /** * \brief Sets the text of the component. * * Calling this method does not trigger the callback passed to * add_changed_callback(). * * \param text The new text. */ void bear::gui::text_input::set_text( const std::string& text ) { m_text = text; m_cursor = m_last = m_text.size(); m_first = m_last - std::min( m_text.size(), m_line_length-1 ); adjust_visible_part_of_text(); } // text_input::set_text() /*----------------------------------------------------------------------------*/ /** * \brief Get the text of the component. */ const std::string& bear::gui::text_input::get_text() const { return m_text; } // text_input::get_text() /*----------------------------------------------------------------------------*/ /** * \brief Adds a callback called when enter is pressed. * \param c The callback. */ void bear::gui::text_input::add_enter_callback( const callback& c ) { m_enter_callback.add(c); } // text_input::add_enter_callback() /*----------------------------------------------------------------------------*/ /** * \brief Adds a callback called when the text has changed. * \param c The callback. */ void bear::gui::text_input::add_changed_callback( const callback& c ) { m_changed_callback.add(c); } // text_input::add_changed_callback() /*----------------------------------------------------------------------------*/ /** * \brief Set the margins between the text and the borders of the control. * \param x The margin on the x-axis. * \param y The margin on the y-axis. */ void bear::gui::text_input::set_margin( coordinate_type x, coordinate_type y ) { m_static_text->set_margin( x, y ); } // text_input::set_margin() /*----------------------------------------------------------------------------*/ /** * \brief Set the margins between the text and the borders of the control. * \param m The margins. */ void bear::gui::text_input::set_margin( const size_box_type& m ) { m_static_text->set_margin(m); } // text_input::set_margin() /*----------------------------------------------------------------------------*/ /** * \brief Insert a key in the text. * \param key The pressed key. */ bool bear::gui::text_input::on_key_press( const input::key_info& key ) { bool result = true; if ( !key.is_printable() ) result = special_code( key ); if (result) adjust_visible_part_of_text(); return result; } // text_input::on_key_press() /*----------------------------------------------------------------------------*/ /** * \brief Insert a character in the text. * \param key The pressed key. */ bool bear::gui::text_input::on_char_pressed( const input::key_info& key ) { if ( key.is_printable() ) { insert_character( key.get_symbol() ); adjust_visible_part_of_text(); } return true; } // text_input::on_char_pressed() /*----------------------------------------------------------------------------*/ /** * \brief Force the height to be a little higher that the font size. */ void bear::gui::text_input::on_resized() { const size_type default_height( m_static_text->get_min_height_with_text() ); set_size( width(), default_height ); m_static_text->set_size( width(), default_height ); m_line_length = m_static_text->width() / m_static_text->get_font().get_metrics('m').get_advance().x; } // text_input::on_resized() /*----------------------------------------------------------------------------*/ /** * \brief Get the scene elements of the component. * \param e (out) The scene elements. */ void bear::gui::text_input::display( std::list& e ) const { if ( systime::get_date_ms() % 600 < 300 ) return; std::vector p(2); p[0].x = m_static_text->get_margin().x; p[0].y = m_static_text->get_margin().y; p[1].y = height() - m_static_text->get_margin().y; for (std::size_t i(m_first); i!=m_cursor; ++i) p[0].x += m_static_text->get_font().get_metrics( m_text[i] ).get_advance().x; p[1].x = p[0].x; e.push_back( visual::scene_line(left(), bottom(), m_cursor_color, p, 1) ); } // text_input::display() /*----------------------------------------------------------------------------*/ /** * \brief Insert a character at cursor position. * \param key The character to insert. */ void bear::gui::text_input::insert_character( char key ) { m_text.insert( m_cursor, 1, key ); if ( m_text.size() < m_line_length ) ++m_last; move_right(); m_changed_callback.execute(); } // text_input::insert_character() /*----------------------------------------------------------------------------*/ /** * \brief Process a special key code. * \param key The code of the key. * \return True if the code has been processed. */ bool bear::gui::text_input::special_code( const input::key_info& key ) { bool result = true; if( key.is_delete() ) { if (m_cursor < m_text.size() ) { m_text.erase(m_cursor, 1); if (m_last == m_text.size() + 1) --m_last; m_changed_callback.execute(); } } else if ( key.is_backspace() ) { if (m_cursor > 0) { m_text.erase(m_cursor - 1, 1); if (m_last == m_text.size()) --m_last; move_left(); m_changed_callback.execute(); } } else if ( key.is_left() ) move_left(); else if ( key.is_right() ) move_right(); else if ( key.is_home() ) { m_cursor = 0; adjust_text_by_left(); } else if ( key.is_end() ) { m_cursor = m_text.size(); adjust_text_by_right(); } else if ( key.is_enter() && !m_enter_callback.empty() ) m_enter_callback.execute(); else result = false; return result; } // text_input::special_code() /*----------------------------------------------------------------------------*/ /** * \brief Move the cursor one character to the left. */ void bear::gui::text_input::move_left() { if (m_cursor > 0) { --m_cursor; adjust_text_by_left(); } } // text_input::move_left() /*----------------------------------------------------------------------------*/ /** * \brief Move the cursor one character to the right. */ void bear::gui::text_input::move_right() { if (m_cursor < m_text.size()) { ++m_cursor; adjust_text_by_right(); } } // text_input::move_right() /*----------------------------------------------------------------------------*/ /** * \brief Adjust the part of the visible text when the cursor is before the * begining. */ void bear::gui::text_input::adjust_text_by_left() { if (m_cursor < m_first) { m_first = m_cursor; m_last = m_first + std::min( m_text.size() - m_first, m_line_length-1 ); } } // text_input::adjust_text_by_left() /*----------------------------------------------------------------------------*/ /** * \brief Adjust the part of the visible text when the cursor is after the end. */ void bear::gui::text_input::adjust_text_by_right() { if (m_cursor > m_last) { m_last = m_cursor; m_first = m_last - std::min( m_text.size(), m_line_length-1 ); } } // text_input::adjust_text_by_right() /*----------------------------------------------------------------------------*/ /** * \brief Adjust the visible text according to cursor's position. */ void bear::gui::text_input::adjust_visible_part_of_text() { m_static_text->set_text( std::string(m_text, m_first, m_last - m_first) ); } // text_input::adjust_visible_part_of_text() plee-the-bear-20251226/bear-engine/core/src/gui/code/visual_component.cpp000066400000000000000000001212311512343254000260520ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::gui::visual_component class. * \author Julien Jorge */ #include "gui/visual_component.hpp" #include "input/key_info.hpp" #include "input/finger_event.hpp" #include "visual/scene_line.hpp" #include "visual/scene_rectangle.hpp" #include #include #include #include #include #include /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ bear::gui::visual_component::visual_component() : m_box(0, 0, 0, 0), m_owner(NULL), m_focused_component(-1), m_visible(true), m_input_priority(false), m_enabled(true), m_top_left_border_color(0, 0, 0, 0), m_bottom_right_border_color(0, 0, 0, 0), m_background_color(0, 0, 0, 0) { } // visual_component::visual_component() /*----------------------------------------------------------------------------*/ /** * \brief Destructor. */ bear::gui::visual_component::~visual_component() { clear(); } // visual_component::~visual_component() /*----------------------------------------------------------------------------*/ /** * \brief Set this component as the owner of an other component. * \param child The component that becomes a child of this component. */ void bear::gui::visual_component::insert( visual_component* child ) { if ( child->m_owner != NULL ) child->m_owner->remove(child); m_components.push_back(child); child->m_owner = this; if (m_focused_component < 0) m_focused_component = 0; child->stay_in_owner(); on_child_inserted(child); } // visual_component::insert() /*----------------------------------------------------------------------------*/ /** * \brief Remove a child component of this component. * \param child The component to remove. * \pre child is effectively a child of this component. * \remark The child will not be deleted. */ void bear::gui::visual_component::remove( visual_component* child ) { CLAW_PRECOND( std::find( m_components.begin(), m_components.end(), child ) != m_components.end() ); m_components.erase ( std::find( m_components.begin(), m_components.end(), child ) ); if ( m_focused_component >= (int)m_components.size() ) --m_focused_component; on_child_removed(child); } // visual_component::remove() /*----------------------------------------------------------------------------*/ /** * \brief Remove all children components of this component. * \remark The children will not be deleted. */ void bear::gui::visual_component::remove_all() { while ( !m_components.empty() ) remove( m_components.back() ); } // visual_component::remove_all() /*----------------------------------------------------------------------------*/ /** * \brief Get an iterator on the beginning of the children. */ bear::gui::visual_component::iterator bear::gui::visual_component::begin() const { return m_components.begin(); } // visual_component::begin() /*----------------------------------------------------------------------------*/ /** * \brief Get an iterator on the beginning of the children. */ bear::gui::visual_component::iterator bear::gui::visual_component::end() const { return m_components.end(); } // visual_component::end() /*----------------------------------------------------------------------------*/ /** * \brief Draw the component and its sub components on a screen. * \param e The scene elements of the component and its sub components. */ void bear::gui::visual_component::render ( std::list& e ) const { if (!m_visible) return; const scene_element_list result( get_scene_elements() ); e.insert( e.end(), result.begin(), result.end() ); } // visual_component::render() /*----------------------------------------------------------------------------*/ /** * \brief Inform the component that a key had been pressed. * \param key The value of the pressed key. */ bool bear::gui::visual_component::key_pressed( const input::key_info& key ) { if ( !is_enabled() ) return false; bool result; if (m_input_priority) { result = on_key_press(key); if ( !result ) if ( m_focused_component >= 0 ) result = m_components[m_focused_component]->key_pressed(key); } else if ( m_focused_component >= 0 ) { result = m_components[m_focused_component]->key_pressed(key); if ( !result ) result = on_key_press(key); } else result = on_key_press(key); return result; } // visual_component::key_pressed() /*----------------------------------------------------------------------------*/ /** * \brief Inform the component that a character had been entered. * \param key The value of the pressed key. */ bool bear::gui::visual_component::char_pressed( const input::key_info& key ) { if ( !is_enabled() ) return false; bool result; if (m_input_priority) { result = on_char_pressed(key); if ( !result ) if ( m_focused_component >= 0 ) result = m_components[m_focused_component]->char_pressed(key); } else if ( m_focused_component >= 0 ) { result = m_components[m_focused_component]->char_pressed(key); if ( !result ) result = on_char_pressed(key); } else result = on_char_pressed(key); return result; } // visual_component::char_pressed() /*----------------------------------------------------------------------------*/ /** * \brief Inform the component that a joystick button had been pressed. * \param button The value of the pressed button. * \param joy_index The index of the joystick. */ bool bear::gui::visual_component::button_pressed ( input::joystick::joy_code button, unsigned int joy_index ) { if ( !is_enabled() ) return false; bool result; if (m_input_priority) { result = on_button_press(button, joy_index); if ( !result ) if ( m_focused_component >= 0) result = m_components[m_focused_component]->button_pressed (button, joy_index); } else if ( m_focused_component >= 0) { result = m_components[m_focused_component]->button_pressed (button, joy_index); if ( !result ) result = on_button_press(button, joy_index); } else result = on_button_press(button, joy_index); return result; } // visual_component::button_pressed() /*----------------------------------------------------------------------------*/ /** * \brief Inform the component that a mouse button had been pressed. * \param key The value of the pressed button. * \param pos The current position of the cursor. */ bool bear::gui::visual_component::mouse_pressed ( input::mouse::mouse_code key, const claw::math::coordinate_2d& pos ) { if ( !is_enabled() ) return false; bool result; if (m_input_priority) { result = on_mouse_press(key, pos); if ( !result ) result = broadcast_mouse_press(key, pos); } else { result = broadcast_mouse_press(key, pos); if ( !result ) result = on_mouse_press(key, pos); } return result; } // visual_component::mouse_pressed() /*----------------------------------------------------------------------------*/ /** * \brief Inform the component that a mouse button had been released. * \param key The value of the released button. * \param pos The current position of the cursor. */ bool bear::gui::visual_component::mouse_released ( input::mouse::mouse_code key, const claw::math::coordinate_2d& pos ) { if ( !is_enabled() ) return false; bool result; if (m_input_priority) { result = on_mouse_released(key, pos); if ( !result ) result = broadcast_mouse_released(key, pos); } else { result = broadcast_mouse_released(key, pos); if ( !result ) result = on_mouse_released(key, pos); } return result; } // visual_component::mouse_released() /*----------------------------------------------------------------------------*/ /** * \brief Inform the component that a mouse button had been maintained. * \param key The value of the maintained button. * \param pos The current position of the cursor. */ bool bear::gui::visual_component::mouse_maintained ( input::mouse::mouse_code key, const claw::math::coordinate_2d& pos ) { if ( !is_enabled() ) return false; bool result; if (m_input_priority) { result = on_mouse_maintained(key, pos); if ( !result ) result = broadcast_mouse_maintained(key, pos); } else { result = broadcast_mouse_maintained(key, pos); if ( !result ) result = on_mouse_maintained(key, pos); } return result; } // visual_component::mouse_maintained() /*----------------------------------------------------------------------------*/ /** * \brief Inform the component that the mouse has been moved. * \param pos The new position of the cursor. */ bool bear::gui::visual_component::mouse_move ( const claw::math::coordinate_2d& pos ) { if ( !is_enabled() ) return false; bool result; if (m_input_priority) { result = on_mouse_move(pos); if ( !result ) result = broadcast_mouse_move( pos ); } else { result = broadcast_mouse_move( pos ); if ( !result ) result = on_mouse_move(pos); } return result; } // visual_component::mouse_move() /*----------------------------------------------------------------------------*/ /** * \brief Inform the component that the finger has been used. * \param event The event dispatched by the finger. */ bool bear::gui::visual_component::finger_action( const input::finger_event& event ) { if ( !is_enabled() ) return false; bool result; if (m_input_priority) { result = on_finger_action(event); if ( !result ) result = broadcast_finger_action( event ); } else { result = broadcast_finger_action( event ); if ( !result ) result = on_finger_action(event); } return result; } // visual_component::finger_action() /*----------------------------------------------------------------------------*/ /** * \brief Adjust the size of the component to fit its sub components. * \param margin The margin around the children. */ void bear::gui::visual_component::fit( visual::size_type margin ) { size_type min_x( std::numeric_limits::max() ); size_type min_y( std::numeric_limits::max() ); size_type max_x( std::numeric_limits::min() ); size_type max_y( std::numeric_limits::min() ); component_list::const_iterator it; for ( it=m_components.begin(); it!=m_components.end(); ++it ) { min_x = std::min( min_x, (*it)->left() ); min_y = std::min( min_y, (*it)->bottom() ); max_x = std::max( max_x, (*it)->right() ); max_y = std::max( max_y, (*it)->top() ); } const size_type delta_x = min_x - margin; const size_type delta_y = min_y - margin; for ( it=m_components.begin(); it!=m_components.end(); ++it ) (*it)->set_bottom_left ( (*it)->left() - delta_x, (*it)->bottom() - delta_y ); set_size( max_x - delta_x + margin, max_y - delta_y + margin ); } // visual_component::fit() /*----------------------------------------------------------------------------*/ /** * \brief Set the size of the component to its maximum size. */ void bear::gui::visual_component::set_size_maximum() { set_size( std::numeric_limits::max(), std::numeric_limits::max() ); } // visual_component::set_size() /*----------------------------------------------------------------------------*/ /** * \brief Set the size of the component. * \param size The new size. */ void bear::gui::visual_component::set_size( const size_box_type& size ) { set_size( size.x, size.y ); } // visual_component::set_size() /*----------------------------------------------------------------------------*/ /** * \brief Set the size of the component. * \param w The new width. * \param h The new height. */ void bear::gui::visual_component::set_size( size_type w, size_type h ) { const size_type old_w = m_box.width(); const size_type old_h = m_box.height(); m_box.set( left(), bottom(), m_box.left() + w, m_box.bottom() + h ); stay_in_owner(); if ( (old_w != m_box.width()) || (old_h != m_box.height()) ) on_resized(); } // visual_component::set_size() /*----------------------------------------------------------------------------*/ /** * \brief Set the width of the component. * \param w The new width. */ void bear::gui::visual_component::set_width( size_type w ) { set_size( w, height() ); } // visual_component::set_width() /*----------------------------------------------------------------------------*/ /** * \brief Set the height of the component. * \param h The new height. */ void bear::gui::visual_component::set_height( size_type h ) { set_size( width(), h ); } // visual_component::set_height() /*----------------------------------------------------------------------------*/ /** * \brief Set the position of the component in its owner. * \param pos The new position. */ void bear::gui::visual_component::set_position ( const position_type& pos ) { set_position( pos.x, pos.y ); } // visual_component::set_position() /*----------------------------------------------------------------------------*/ /** * \brief Set the position of the component. * \param x The new x-coordinate. * \param y The new y-coordinate. */ void bear::gui::visual_component::set_position ( coordinate_type x, coordinate_type y ) { set_bottom_left(x, y); } // visual_component::set_position() /*----------------------------------------------------------------------------*/ /** * \brief Show or hide the component. * \param b The new visibility. */ void bear::gui::visual_component::set_visible( bool b ) { m_visible = b; } // visual_component::set_visible() /*----------------------------------------------------------------------------*/ /** * \brief Set the position of this component when tabbing. * \param v The new position. */ void bear::gui::visual_component::set_tab_order( unsigned int v ) { if (m_owner) m_owner->change_tab_position( this, v ); } // visual_component::set_tab_order() /*----------------------------------------------------------------------------*/ /** * \brief Set if the current component must process key_ press event before its * children. * \param this_first True to set this compoment as priority. */ void bear::gui::visual_component::set_input_priority( bool this_first ) { m_input_priority = this_first; } // visual_component::set_input_priority() /*----------------------------------------------------------------------------*/ /** * \brief Set the left position of the component in its owner. * \param x The new position. */ void bear::gui::visual_component::set_left( coordinate_type x ) { set_bottom_left( x, bottom() ); } // visual_component::set_left() /*----------------------------------------------------------------------------*/ /** * \brief Set the right position of the component in its owner. * \param x The new position. */ void bear::gui::visual_component::set_right( coordinate_type x ) { set_bottom_left( x - width(), bottom() ); } // visual_component::set_right() /*----------------------------------------------------------------------------*/ /** * \brief Set the top position of the component in its owner. * \param y The new position. */ void bear::gui::visual_component::set_top( coordinate_type y ) { set_bottom_left( left(), y - height() ); } // visual_component::set_top() /*----------------------------------------------------------------------------*/ /** * \brief Set the bottom position of the component in its owner. * \param x The new position. */ void bear::gui::visual_component::set_bottom( coordinate_type y ) { set_bottom_left( left(), y ); } // visual_component::set_bottom() /*----------------------------------------------------------------------------*/ /** * \brief Set the top-left position of the component in its owner. * \param x The new x-position. * \param y The new y-position. */ void bear::gui::visual_component::set_top_left ( coordinate_type x, coordinate_type y ) { set_bottom_left( x, y - height() ); } // visual_component::set_top_left() /*----------------------------------------------------------------------------*/ /** * \brief Set the bottom-left position of the component in its owner. * \param x The new x-position. * \param y The new y-position. */ void bear::gui::visual_component::set_bottom_left ( coordinate_type x, coordinate_type y ) { const coordinate_type w = m_box.width(); const coordinate_type h = m_box.height(); m_box.left(x); m_box.bottom(y); stay_in_owner(); if ( std::abs( w - m_box.width() ) > 0.000001 || std::abs( h - m_box.height() ) > 0.000001 ) on_resized(); } // visual_component::set_bottom_left() /*----------------------------------------------------------------------------*/ /** * \brief Set the top-right position of the component in its owner. * \param x The new x-position. * \param y The new y-position. */ void bear::gui::visual_component::set_top_right ( coordinate_type x, coordinate_type y ) { set_bottom_left( x - width(), y - height() ); } // visual_component::set_top_right() /*----------------------------------------------------------------------------*/ /** * \brief Set the bottom-right position of the component in its owner. * \param x The new x-position. * \param y The new y-position. */ void bear::gui::visual_component::set_bottom_right ( coordinate_type x, coordinate_type y ) { set_bottom_left( x - width(), y ); } // visual_component::set_bottom_right() /*----------------------------------------------------------------------------*/ /** * \brief Get the width of the component. */ bear::gui::size_type bear::gui::visual_component::width() const { return m_box.width(); } // visual_component::width() /*----------------------------------------------------------------------------*/ /** * \brief Get the height of the component. */ bear::gui::size_type bear::gui::visual_component::height() const { return m_box.height(); } // visual_component::height() /*----------------------------------------------------------------------------*/ /** * \brief Get the x-coordinate of the component's left edge. */ bear::gui::coordinate_type bear::gui::visual_component::left() const { return m_box.left(); } // visual_component::left() /*----------------------------------------------------------------------------*/ /** * \brief Get the x-coordinate of the component's right edge. */ bear::gui::coordinate_type bear::gui::visual_component::right() const { return m_box.right(); } // visual_component::right() /*----------------------------------------------------------------------------*/ /** * \brief Get the y-coordinate of the component's bottom edge. */ bear::gui::coordinate_type bear::gui::visual_component::bottom() const { return m_box.bottom(); } // visual_component::bottom() /*----------------------------------------------------------------------------*/ /** * \brief Get the y-coordinate of the component's top edge. */ bear::gui::coordinate_type bear::gui::visual_component::top() const { return m_box.top(); } // visual_component::top() /*----------------------------------------------------------------------------*/ /** * \brief Get the coordinates of the component's top left corner. */ bear::gui::position_type bear::gui::visual_component::top_left() const { return m_box.top_left(); } // visual_component::top_left() /*----------------------------------------------------------------------------*/ /** * \brief Get the coordinates of the component's top right corner. */ bear::gui::position_type bear::gui::visual_component::top_right() const { return m_box.top_right(); } // visual_component::top_right() /*----------------------------------------------------------------------------*/ /** * \brief Get the coordinates of the component's bottom left corner. */ bear::gui::position_type bear::gui::visual_component::bottom_left() const { return m_box.bottom_left(); } // visual_component::bottom_left() /*----------------------------------------------------------------------------*/ /** * \brief Get the coordinates of the component's bottom right corner. */ bear::gui::position_type bear::gui::visual_component::bottom_right() const { return m_box.bottom_right(); } // visual_component::bottom_right() /*----------------------------------------------------------------------------*/ /** * \brief Get the size of the component. */ bear::gui::size_box_type bear::gui::visual_component::get_size() const { return m_box.size(); } // visual_component::get_size() /*----------------------------------------------------------------------------*/ /** * \brief Get the position of the component in its owner. */ bear::gui::position_type bear::gui::visual_component::get_position() const { return m_box.bottom_left(); } // visual_component::get_position() /*----------------------------------------------------------------------------*/ /** * \brief Get the rectangle bounding this component. */ const bear::gui::rectangle_type& bear::gui::visual_component::get_rectangle() const { return m_box; } // visual_component::get_rectangle() /*----------------------------------------------------------------------------*/ /** * \brief Tell if the component is visible. */ bool bear::gui::visual_component::get_visible() const { return m_visible; } // visual_component::get_visible() /*----------------------------------------------------------------------------*/ /** * \brief Get the size of the borders. */ bear::gui::size_type bear::gui::visual_component::get_border_size() const { return 1; } // visual_component::get_border_size() /*----------------------------------------------------------------------------*/ /** * \brief Set the color of the border. * \param clr The new color. */ void bear::gui::visual_component::set_border_color( const color_type& clr ) { set_top_left_border_color( clr ); set_bottom_right_border_color( clr ); } // visual_component::set_border_color() /*----------------------------------------------------------------------------*/ /** * \brief Set the color of the top and left borders. * \param clr The new color. */ void bear::gui::visual_component::set_top_left_border_color( const color_type& clr ) { m_top_left_border_color = clr; } // visual_component::set_top_left_border_color() /*----------------------------------------------------------------------------*/ /** * \brief Get the color of the top and left borders. */ const bear:: gui::color_type& bear::gui::visual_component::get_top_left_border_color() const { return m_top_left_border_color; } // visual_component::get_top_left_border_color() /*----------------------------------------------------------------------------*/ /** * \brief Set the color of the bottom and right borders. * \param clr The new color. */ void bear::gui::visual_component::set_bottom_right_border_color ( const color_type& clr ) { m_bottom_right_border_color = clr; } // visual_component::set_bottom_right_border_color() /*----------------------------------------------------------------------------*/ /** * \brief Get the color of the bottom and right borders. */ const bear::gui::color_type& bear::gui::visual_component::get_bottom_right_border_color() const { return m_bottom_right_border_color; } // visual_component::get_bottom_right_border_color() /*----------------------------------------------------------------------------*/ /** * \brief Set the color of the background. * \param clr The new color. */ void bear::gui::visual_component::set_background_color( const color_type& clr ) { m_background_color = clr; } // visual_component::set_background_color() /*----------------------------------------------------------------------------*/ /** * \brief Get the color of the background. * \param clr The new color. */ const bear::gui::color_type& bear::gui::visual_component::get_background_color() const { return m_background_color; } // visual_component::get_background_color() /*----------------------------------------------------------------------------*/ /** * \brief Disable this component. */ void bear::gui::visual_component::disable() { m_enabled = false; } // visual_component::disable() /*----------------------------------------------------------------------------*/ /** * \brief Enable this component. */ void bear::gui::visual_component::enable() { m_enabled = true; } // visual_component::enable() /*----------------------------------------------------------------------------*/ /** * \brief Tell if this compontent is enabled. */ bool bear::gui::visual_component::is_enabled() const { return m_enabled; } // visual_component::is_enabled() /*----------------------------------------------------------------------------*/ /** * \brief Set the focus on this component. */ void bear::gui::visual_component::set_focus() { const visual_component* foc = get_focus(); if ( foc != this ) { // all parent controls up to the top component std::list s; visual_component* c; for ( c = this; c!=NULL; c=c->m_owner ) s.push_front(c); std::list::const_iterator it_parent(s.begin()); std::list::const_iterator it_child(it_parent); ++it_child; for ( ; it_child!=s.end(); ++it_parent, ++it_child ) (*it_parent)->set_focus(*it_child); for ( it_parent=s.begin(); it_parent!=s.end(); ++it_parent ) (*it_parent)->on_focused(); } } // visual_component::set_focus() /*----------------------------------------------------------------------------*/ /** * \brief Get the child component having the focus. */ bear::gui::visual_component* bear::gui::visual_component::get_focus() const { if ( m_focused_component < 0 ) return NULL; else return m_components[m_focused_component]; } // visual_component::get_focus() /*----------------------------------------------------------------------------*/ /** * \brief Add a callback called when the component receives the focus. * \param c The callback. */ void bear::gui::visual_component::add_focus_callback( const callback& c ) { m_focus_callback.add(c); } // visual_component::add_focus_callback() /*----------------------------------------------------------------------------*/ /** * \brief Remove all the children of the component. */ void bear::gui::visual_component::clear() { std::for_each( m_components.begin(), m_components.end(), claw::delete_function() ); m_components.clear(); m_focused_component = -1; on_clear(); } // visual_component::clear() /*----------------------------------------------------------------------------*/ /** * \brief Get the rendering attributes. */ bear::visual::bitmap_rendering_attributes& bear::gui::visual_component::get_rendering_attributes() { return m_rendering_attributes; } // visual_component::get_rendering_attributes() /*----------------------------------------------------------------------------*/ /** * \brief Get the rendering attributes. */ const bear::visual::bitmap_rendering_attributes& bear::gui::visual_component::get_rendering_attributes() const { return m_rendering_attributes; } // visual_component::get_rendering_attributes() /*----------------------------------------------------------------------------*/ /** * \brief Change the position of a component when tabbing. * \param that The component to move. * \param pos The new position. * \remark The item which was at the position \a pos will be placed at the old * position of \a that. */ void bear::gui::visual_component::change_tab_position ( const visual_component* that, unsigned int pos ) { CLAW_PRECOND( std::find(m_components.begin(), m_components.end(), that) != m_components.end() ); if ( pos > m_components.size() - 1 ) pos = m_components.size() - 1; std::swap( m_components[pos], *std::find(m_components.begin(), m_components.end(), that) ); } // visual_component::change_tab_position() /*----------------------------------------------------------------------------*/ /** * \brief Method called after the component has been resized. */ void bear::gui::visual_component::on_resized() { // nothing to do } // visual_component::on_resized() /*----------------------------------------------------------------------------*/ /** * \brief Method called after calling clear function. */ void bear::gui::visual_component::on_clear() { // nothing to do } // visual_component::on_clear() /*----------------------------------------------------------------------------*/ /** * \brief Method called after the insertion of a child. * \param child The child inserted in this component. */ void bear::gui::visual_component::on_child_inserted( visual_component* child ) { // nothing to do } // visual_component::on_child_inserted() /*----------------------------------------------------------------------------*/ /** * \brief Method called after the removal of a child. * \param child The child removed from this component. */ void bear::gui::visual_component::on_child_removed( visual_component* child ) { // nothing to do } // visual_component::on_child_removed() /*----------------------------------------------------------------------------*/ /** * \brief Get the scene elements of the component. * \param e (out) The scene elements. */ void bear::gui::visual_component::display( scene_element_list& e ) const { // nothing to do } // visual_component::display() /*----------------------------------------------------------------------------*/ /** * \brief Tell the focused component that a key has been pressed. * \param key The pressed key. * \return true if the key has been processed. */ bool bear::gui::visual_component::on_key_press( const input::key_info& key ) { bool result = false; if ( key.is_tab() ) { if ( !m_components.empty() ) { result = true; m_focused_component = (m_focused_component + 1) % m_components.size(); } } return result; } // visual_component::on_key_press() /*----------------------------------------------------------------------------*/ /** * \brief Tell the focused component that a character has been entered. * \param key The pressed key. * \return true if the key has been processed. */ bool bear::gui::visual_component::on_char_pressed( const input::key_info& key ) { return false; } // visual_component::on_char_pressed() /*----------------------------------------------------------------------------*/ /** * \brief Tell the component that a joystick button has been pressed. * \param button The value of the pressed button. * \param joy_index The index of the joystick. * \return true if the button has been processed. */ bool bear::gui::visual_component::on_button_press ( input::joystick::joy_code button, unsigned int joy_index ) { return false; } // visual_component::on_button_press() /*----------------------------------------------------------------------------*/ /** * \brief Tell the focused component that a mouse button has been pressed. * \param key The pressed key. * \param pos The current position of the cursor. * \return true if the key has been processed. */ bool bear::gui::visual_component::on_mouse_press ( input::mouse::mouse_code key, const claw::math::coordinate_2d& pos ) { return false; } // visual_component::on_mouse_press() /*----------------------------------------------------------------------------*/ /** * \brief Tell the focused component that a mouse button has been released. * \param key The pressed key. * \param pos The current position of the cursor. * \return true if the key has been processed. */ bool bear::gui::visual_component::on_mouse_released ( input::mouse::mouse_code key, const claw::math::coordinate_2d& pos ) { return false; } // visual_component::on_mouse_released() /*----------------------------------------------------------------------------*/ /** * \brief Tell the focused component that a mouse button has been maintained. * \param key The pressed key. * \param pos The current position of the cursor. * \return true if the key has been processed. */ bool bear::gui::visual_component::on_mouse_maintained ( input::mouse::mouse_code key, const claw::math::coordinate_2d& pos ) { return false; } // visual_component::on_mouse_maintained() /*----------------------------------------------------------------------------*/ /** * \brief Tells the component that the mouse has been moved. * \param pos The new position of the cursor. * \return true if the button has been processed. */ bool bear::gui::visual_component::on_mouse_move ( const claw::math::coordinate_2d& pos ) { return false; } // visual_component::on_mouse_move() /*----------------------------------------------------------------------------*/ /** * \brief Tells the component that the finger has been used. * \param event The event dispatched by the finger. */ bool bear::gui::visual_component::on_finger_action ( const input::finger_event& event ) { return false; } // visual_component::on_finger_action() /*----------------------------------------------------------------------------*/ /** * \brief Tell the component he received the focus. */ void bear::gui::visual_component::on_focused() { m_focus_callback.execute(); } // visual_component::on_focused() /*----------------------------------------------------------------------------*/ /** * \brief Inform the sub components that the mouse has been moved. * \param pos The new position of the cursor. */ bool bear::gui::visual_component::broadcast_mouse_move ( const claw::math::coordinate_2d& pos ) { bool result(false); component_list::iterator it; for (it=m_components.begin(); !result && (it!=m_components.end()); ++it) if ( (*it)->m_box.includes(pos) ) result = (*it)->mouse_move( pos - (*it)->get_position() ); return result; } // visual_component::broadcast_mouse_move() /*----------------------------------------------------------------------------*/ /** * \brief Inform the sub components that a mouse button has been pressed. * \param button The pressed key. * \param pos The current position of the cursor. * \return true if the key has been processed. */ bool bear::gui::visual_component::broadcast_mouse_press ( input::mouse::mouse_code button, const claw::math::coordinate_2d& pos ) { bool result(false); component_list::iterator it; for (it=m_components.begin(); !result && (it!=m_components.end()); ++it) if ( (*it)->m_box.includes(pos) ) result = (*it)->mouse_pressed( button, pos - (*it)->get_position() ); return result; } // visual_component::broadcast_mouse_press() /*----------------------------------------------------------------------------*/ /** * \brief Inform the sub components that a mouse button has been released. * \param button The pressed key. * \param pos The current position of the cursor. * \return true if the key has been processed. */ bool bear::gui::visual_component::broadcast_mouse_released ( input::mouse::mouse_code button, const claw::math::coordinate_2d& pos ) { bool result(false); component_list::iterator it; for (it=m_components.begin(); !result && (it!=m_components.end()); ++it) if ( (*it)->m_box.includes(pos) ) result = (*it)->mouse_released( button, pos - (*it)->get_position() ); return result; } // visual_component::broadcast_mouse_released() /*----------------------------------------------------------------------------*/ /** * \brief Inform the sub components that a mouse button has been maintained. * \param button The pressed key. * \param pos The current position of the cursor. * \return true if the key has been processed. */ bool bear::gui::visual_component::broadcast_mouse_maintained ( input::mouse::mouse_code button, const claw::math::coordinate_2d& pos ) { bool result(false); component_list::iterator it; for (it=m_components.begin(); !result && (it!=m_components.end()); ++it) if ( (*it)->m_box.includes(pos) ) result = (*it)->mouse_maintained( button, pos - (*it)->get_position() ); return result; } // visual_component::broadcast_mouse_maintained() /*----------------------------------------------------------------------------*/ /** * \brief Informs the sub components that the finger has been used. * \param event The event dispatched by the finger. */ bool bear::gui::visual_component::broadcast_finger_action ( const input::finger_event& event ) { bool result(false); component_list::iterator it; const position_type pos( event.get_position() ); for (it=m_components.begin(); !result && (it!=m_components.end()); ++it) if ( (*it)->m_box.includes(pos) ) result = (*it)->finger_action ( event.at_position( pos - (*it)->get_position() ) ); return result; } // visual_component::broadcast_finger_action() /*----------------------------------------------------------------------------*/ /** * \brief Adjust the width and the height of the component to stay in the owner. */ void bear::gui::visual_component::stay_in_owner() { if (m_owner) { coordinate_type n_left(m_box.left()); coordinate_type n_right(m_box.right()); coordinate_type n_bottom(m_box.bottom()); coordinate_type n_top(m_box.top()); if ( n_left >= m_owner->width() ) n_left = m_owner->width(); if ( n_bottom >= m_owner->height() ) n_bottom = m_owner->height(); if ( n_right >= m_owner->width() ) n_right = m_owner->width(); if ( n_top >= m_owner->height() ) n_top = m_owner->height(); m_box.set( n_left, n_bottom, n_right, n_top ); } } // visual_component::stay_in_owner() /*----------------------------------------------------------------------------*/ /** * \brief Set the focus on a given component. * \param c The component on which the focus is set. */ void bear::gui::visual_component::set_focus( visual_component* c ) { int i(0); bool stop(false); m_focused_component = -1; for ( component_list::const_iterator it=m_components.begin(); !stop && (it != m_components.end()); ++it, ++i ) if ( *it == c ) { m_focused_component = i; stop = true; } } // visual_component::set_focus() /*----------------------------------------------------------------------------*/ /** * \brief Get the scene elements representing this component. */ bear::gui::visual_component::scene_element_list bear::gui::visual_component::get_scene_elements() const { scene_element_list result; // display the current component display( result ); scene_element_list sub_e; // display the sub components for ( component_list::const_iterator it=m_components.begin(); it!=m_components.end(); ++it ) (*it)->render( sub_e ); // the scene elements are placed in the current component, so we adjust // their position according to our position. for ( scene_element_list::iterator it=sub_e.begin(); it!=sub_e.end(); ++it ) it->set_position( it->get_position() + m_box.bottom_left() ); result.insert( result.end(), sub_e.begin(), sub_e.end() ); render_faces( result ); for ( scene_element_list::iterator it=result.begin(); it!=result.end(); ++it ) it->get_rendering_attributes().combine(m_rendering_attributes); return result; } // visual_component::get_scene_elements() /*----------------------------------------------------------------------------*/ /** * \brief Draw the background and the borders of the component. * \param e The scene elements of the borders and the background. */ void bear::gui::visual_component::render_faces ( std::list& e ) const { // and we draw the borders and the background of the current component visual::rectangle_type box (visual::position_type(0, 0), visual::position_type( width(), height() )); if ( get_border_size() != 0 ) { std::vector line(3); line[0] = box.bottom_left(); line[1] = box.bottom_right(); line[2] = box.top_right(); if ( m_bottom_right_border_color.components.alpha != 0 ) e.push_front ( visual::scene_line (left(), bottom(), m_bottom_right_border_color, line, get_border_size()) ); line[1] = box.top_left(); if ( m_top_left_border_color.components.alpha != 0 ) e.push_front ( visual::scene_line (left(), bottom(), m_top_left_border_color, line, get_border_size()) ); } if ( m_background_color.components.alpha != 0 ) e.push_front ( visual::scene_rectangle(left(), bottom(), m_background_color, box) ); } // visual_component::render_faces() plee-the-bear-20251226/bear-engine/core/src/gui/frame.hpp000066400000000000000000000037051512343254000226570ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A frame: a box with a border and a background. * \author Julien Jorge */ #ifndef __GUI_FRAME_HPP__ #define __GUI_FRAME_HPP__ #include "gui/visual_component.hpp" #include "visual/writing.hpp" #include "gui/class_export.hpp" namespace bear { namespace gui { /** * \brief A frame: a box with a border and a background. * \author Julien Jorge */ class GUI_EXPORT frame: public visual_component { public: frame(); explicit frame( const std::string& title ); frame( const std::string& title, const visual::font& f, visual::size_type font_size = 0 ); void set_title( const std::string& t ); const std::string& get_title() const; void set_font( const visual::font& f ); const visual::font& get_font() const; void set_font_size( visual::size_type s ); visual::size_type get_font_size() const; bool close(); protected: virtual bool on_close(); visual_component& get_content(); void fit( size_type margin = 10 ); void display( scene_element_list& e ) const; private: void on_resized(); visual::size_type compute_title_height() const; void update_displayed_title(); private: /** \brief The component in this frame. */ visual_component* m_content_frame; /** \brief The title of the frame. */ std::string m_title; /** \brief The font used to display the title of the frame. */ visual::font m_font; /** \brief The size of the font. */ visual::size_type m_font_size; /** \brief The title as displayed. */ visual::writing m_displayed_title; }; // class frame } // namespace gui } // namespace bear #endif // __GUI_FRAME_HPP__ plee-the-bear-20251226/bear-engine/core/src/gui/horizontal_flow.hpp000066400000000000000000000057141512343254000250070ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A horizontal flow displays his children from the left to the right and * from the top to the bottom, keeping them aligned on a grid. * \author Julien Jorge */ #ifndef __GUI_HORIZONTAL_FLOW_HPP__ #define __GUI_HORIZONTAL_FLOW_HPP__ #include "gui/visual_component.hpp" #include "gui/class_export.hpp" #include "input/keyboard.hpp" namespace bear { namespace gui { /** * \brief A horizontal flow displays his children from the left to the right * and from the top to the bottom, keeping them aligned on a grid. * \author Julien Jorge */ class GUI_EXPORT horizontal_flow: public visual_component { public: explicit horizontal_flow ( size_type horizontal_margin = 0, size_type vertical_margin = 0, bear::visual::color_type color = bear::visual::color_type()); void set_horizontal_margin( size_type m ); void set_vertical_margin( size_type m ); void set_margins( size_type horizontal, size_type vertical ); void display( std::list& e ) const; private: bool process_mouse_move ( const claw::math::coordinate_2d& pos ); bool on_key_press( const input::key_info& key ); bool on_mouse_move( const claw::math::coordinate_2d& pos ); bool highlight_control_at ( const claw::math::coordinate_2d& pos ); bool special_code( const input::key_info& key ); bool children_at_top(unsigned int line, unsigned int column); bool children_at_bottom(unsigned int line, unsigned int column); bear::gui::visual_component::iterator get_selected_children(); bool get_selected_children_in_array (unsigned int & line, unsigned int & column); bool move_left(); bool move_right(); bool move_up(); bool move_down(); virtual void on_resized(); virtual void on_clear(); virtual void on_child_inserted( visual_component* child ); virtual void on_child_removed( visual_component* child ); virtual void on_focused(); void adjust_children_positions(); private: /** \brief The horizontal margin between the components. */ size_type m_horizontal_margin; /** \brief The vertical margin between the components. */ size_type m_vertical_margin; /** \brief The selected children. */ visual_component* m_selected_children; /** \brief Color used to display rectangle around selected childrens. */ bear::visual::color_type m_selected_color; /** \brief Array of visible childrens. */ std::vector< std::vector< visual_component* > > m_childrens_array; }; // class horizontal_flow } // namespace gui } // namespace bear #endif // __GUI_HORIZONTAL_FLOW_HPP__ plee-the-bear-20251226/bear-engine/core/src/gui/impl/000077500000000000000000000000001512343254000220105ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/core/src/gui/impl/callback_function.tpp000066400000000000000000000022331512343254000261760ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::gui::callback_function class. * \author Julien Jorge */ /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param f The function called by this callback. */ template bear::gui::callback_function::callback_function( const F& f ) : m_function(f) { } // callback_function::callback_function() /*----------------------------------------------------------------------------*/ /** * \brief Create a copy of this callback. */ template bear::gui::callback_function* bear::gui::callback_function::clone() const { return new callback_function(*this); } // callback_function::clone() /*----------------------------------------------------------------------------*/ /** * \brief Execute the callback. */ template void bear::gui::callback_function::execute() { m_function(); } // callback_function::execute() plee-the-bear-20251226/bear-engine/core/src/gui/impl/slider.tpp000066400000000000000000000157151512343254000240300ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the gui::slider class. * \author Julien Jorge */ #include #include "visual/scene_sprite.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param bar The sprite of the bar on which the slider slides.. * \param slider The sprite of the slide. * \param min The minimum value. * \param max The maximum value. * \param value The initial value. * \pre min <= max */ template bear::gui::slider::slider ( const visual::sprite& bar, const visual::sprite& slider, T min, T max, T value ) : visual_component(), m_bar(bar), m_slider(slider), m_min(min), m_max(max), m_delta(0) { CLAW_PRECOND(min <= max); set_value(value); } // slider::slider() /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param bar The sprite of the bar on which the slider slides.. * \param slider The sprite of the slide. * \param min The minimum value. * \param max The maximum value. * \param value The initial value. * \param value_changed The callback called when the valued has changed. * \pre min <= max */ template bear::gui::slider::slider ( const visual::sprite& bar, const visual::sprite& slider, T min, T max, T value, const callback& value_changed ) : visual_component(), m_bar(bar), m_slider(slider), m_min(min), m_max(max), m_delta(0) { CLAW_PRECOND(min <= max); set_value(value); m_value_changed_callback.add(value_changed); } // slider::slider() /*----------------------------------------------------------------------------*/ /** * \brief Set the delta applied when moving the slider. * \param v The new delta. */ template void bear::gui::slider::set_delta( T v ) { m_delta = v; } // slider::set_delta() /*----------------------------------------------------------------------------*/ /** * \brief Set the position of the slider. * \param v The new value. */ template void bear::gui::slider::set_value( T v ) { const T old(m_value); if ( v < m_min ) m_value = m_min; else if ( v > m_max ) m_value = m_max; else m_value = v; if ( old != m_value ) m_value_changed_callback.execute(); } // slider::set_value() /*----------------------------------------------------------------------------*/ /** * \brief Get the position of the slider. * \param text The new text. */ template T bear::gui::slider::get_value() const { return m_value; } // slider::get_value() /*----------------------------------------------------------------------------*/ /** * \brief Get the scene elements of the component. * \param e (out) The scene elements. */ template void bear::gui::slider::display ( std::list& e ) const { position_type p(bottom_left()); if ( height() > m_bar.height() ) p.y += (height() - m_bar.height()) / 2; e.push_back( visual::scene_sprite(p.x, p.y, m_bar) ); p = bottom_left(); if ( height() > m_slider.height() ) p.y += (height() - m_slider.height()) / 2; if (m_min != m_max) p.x += (m_slider.width() / 2) + (int)( ((m_value - m_min) * (width() - 2 * m_slider.width())) / (m_max - m_min) ); e.push_back( visual::scene_sprite(p.x, p.y, m_slider) ); } // slider::display() /*----------------------------------------------------------------------------*/ /** * \brief Set the slider's x-position at a given coordinate, adjust the value * accordingly. * \param x The new x position of the center of the slider. */ template void bear::gui::slider::set_slider_at( unsigned int x ) { if ( x <= (m_slider.width() / 2) ) set_value(m_min); else if ( x >= (right() - m_slider.width() / 2) ) set_value(m_max); else set_value( m_min + (T)( (x - m_slider.width()) * (m_max - m_min)) / (T)(width() - 2 * m_slider.width()) ); } // slider::set_slider_at() /*----------------------------------------------------------------------------*/ /** * \brief The control was resized. */ template void bear::gui::slider::on_resized() { m_bar.set_width( width() ); } // slider::on_resized() /*----------------------------------------------------------------------------*/ /** * \brief Tell that a key has been pressed. * \param key The code of the key. */ template bool bear::gui::slider::on_key_press( const bear::input::key_info& key ) { bool result = true; if ( key.is_left() ) set_value( m_value - m_delta ); else if ( key.is_right() ) set_value( m_value + m_delta ); else result = false; return result; } // slider::on_key_press() /*----------------------------------------------------------------------------*/ /** * \brief Tell that a joystick button has been pressed. * \param button The code of the button. * \param joy_index The index of the joytick. */ template bool bear::gui::slider::on_button_press ( bear::input::joystick::joy_code button, unsigned int joy_index ) { bool result = true; switch( button ) { case bear::input::joystick::jc_axis_left: set_value( m_value - m_delta ); break; case bear::input::joystick::jc_axis_right: set_value( m_value + m_delta ); break; default: result = false; } return result; } // slider::on_button_press() /*----------------------------------------------------------------------------*/ /** * \brief Inform the component that a mouse button had been pressed. * \param key The value of the pressed button. * \param pos The current position of the cursor. */ template bool bear::gui::slider::on_mouse_press ( input::mouse::mouse_code key, const claw::math::coordinate_2d& pos ) { set_slider_at(pos.x); return true; } // slider::on_mouse_pressed() /*----------------------------------------------------------------------------*/ /** * \brief Inform the component that a mouse button had been released. * \param key The value of the released button. * \param pos The current position of the cursor. */ template bool bear::gui::slider::on_mouse_released ( input::mouse::mouse_code key, const claw::math::coordinate_2d& pos ) { set_slider_at(pos.x); return true; } // slider::on_mouse_released() /*----------------------------------------------------------------------------*/ /** * \brief Inform the component that a mouse button had been released. * \param key The value of the released button. * \param pos The current position of the cursor. */ template bool bear::gui::slider::on_mouse_maintained ( input::mouse::mouse_code key, const claw::math::coordinate_2d& pos ) { set_slider_at(pos.x); return true; } // slider::on_mouse_maintained() plee-the-bear-20251226/bear-engine/core/src/gui/multi_page.hpp000066400000000000000000000032351512343254000237110ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A component containing multiple pages of text. * \author Julien Jorge */ #ifndef __GUI_MULTI_PAGE_HPP__ #define __GUI_MULTI_PAGE_HPP__ #include "gui/visual_component.hpp" #include "visual/font/font.hpp" #include "gui/class_export.hpp" #include namespace bear { namespace gui { class static_text; /** * \brief A component containing multiple pages of text. * \author Julien Jorge */ class GUI_EXPORT multi_page: public visual_component { public: /** \brief The type of the font used to display the text. */ typedef visual::font font_type; public: explicit multi_page( font_type f ); void previous(); void next(); void set_text( const std::string& text ); private: void on_resized(); void set_static_text(); void create_indices(); private: /** \brief The text to display. */ std::string m_text; /** \brief Positions, in the text, of each page. */ std::vector m_bookmark; /** \brief Current page of text. */ unsigned int m_current_mark; /** \brief Component used to display the text. */ static_text* m_static_text; /** \brief Component used to display the "..." text when there's more text to display. */ static_text* m_dots_text; }; // class multi_page } // namespace gui } // namespace bear #endif // __GUI_MULTI_PAGE_HPP__ plee-the-bear-20251226/bear-engine/core/src/gui/picture.hpp000066400000000000000000000017521512343254000232400ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A simple component to display an image (sprite) in windows or any * visual component. * \author Julien Jorge */ #ifndef __GUI_PICTURE_HPP__ #define __GUI_PICTURE_HPP__ #include "gui/scene_element.hpp" #include "visual/sprite.hpp" #include "gui/class_export.hpp" namespace bear { namespace gui { /** * \brief A simple component to display an image (sprite) in windows or any * visual component. * \author Julien Jorge */ class GUI_EXPORT picture: public scene_element { public: explicit picture ( const visual::sprite& pict = visual::sprite() ); void set_picture( const visual::sprite& pict ); }; // class picture } // namespace gui } // namespace bear #endif // __GUI_PICTURE_HPP__ plee-the-bear-20251226/bear-engine/core/src/gui/radio_button.hpp000066400000000000000000000024111512343254000242470ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A radio_button is a checkable that cannot be unchecked by the user. * \author Julien Jorge */ #ifndef __GUI_RADIO_BUTTON_HPP__ #define __GUI_RADIO_BUTTON_HPP__ #include "gui/checkable.hpp" #include "gui/class_export.hpp" #include "visual/font/font.hpp" #include "visual/sprite.hpp" namespace bear { namespace gui { /** * \brief A radio_button with a text. * \author Julien Jorge */ class GUI_EXPORT radio_button: public checkable { public: radio_button( const visual::sprite& off, const visual::sprite& on ); radio_button ( const visual::sprite& off, const visual::sprite& on, font_type f ); private: bool on_key_press( const input::key_info& key ); bool on_button_press ( input::joystick::joy_code button, unsigned int joy_index ); bool on_mouse_press ( input::mouse::mouse_code key, const claw::math::coordinate_2d& pos ); }; // class radio_button } // namespace gui } // namespace bear #endif // __GUI_RADIO_BUTTON_HPP__ plee-the-bear-20251226/bear-engine/core/src/gui/radio_group.hpp000066400000000000000000000022471512343254000240770ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A radio_group is a group of radio_button ensuring that at most one of * them is checked at once. * \author Julien Jorge */ #ifndef __GUI_RADIO_GROUP_HPP__ #define __GUI_RADIO_GROUP_HPP__ #include "gui/visual_component.hpp" #include "gui/class_export.hpp" namespace bear { namespace gui { class radio_button; /** * \brief A radio_group is a group of radio_button ensuring that at most one * of them is checked at once. * \author Julien Jorge */ class GUI_EXPORT radio_group: public visual_component { public: void add_button( radio_button* b, visual::size_type margin ); const radio_button* get_selection() const; private: void on_check( std::size_t i ) const; private: /** \brief The buttons in this group. */ std::vector m_buttons; }; // class radio_group } // namespace gui } // namespace bear #endif // __GUI_RADIO_GROUP_HPP__ plee-the-bear-20251226/bear-engine/core/src/gui/scene_element.hpp000066400000000000000000000026031512343254000243670ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A simple component to display any visual::scene_element * in windows or any visual component. * \author Julien Jorge */ #ifndef __GUI_SCENE_ELEMENT_HPP__ #define __GUI_SCENE_ELEMENT_HPP__ #include "gui/visual_component.hpp" #include "visual/scene_element.hpp" #include "gui/class_export.hpp" namespace bear { namespace gui { /** * \brief A simple component to display any visual::scene_element * in windows or any visual component. * \author Julien Jorge */ class GUI_EXPORT scene_element: public visual_component { public: explicit scene_element ( const visual::scene_element& e = visual::scene_element() ); void set_scene_element( const visual::scene_element& e ); private: void display( scene_element_list& e ) const; virtual void on_resized(); void stretch_element(); private: /** \brief The element to render. */ visual::scene_element m_element; /** \brief Tell if the element is stretched to fill the control. */ bool m_stretch; }; // class scene_element } // namespace gui } // namespace bear #endif // __GUI_SCENE_ELEMENT_HPP__ plee-the-bear-20251226/bear-engine/core/src/gui/slider.hpp000066400000000000000000000044311512343254000230440ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A slider. * \author Julien Jorge */ #ifndef __GUI_SLIDER_HPP__ #define __GUI_SLIDER_HPP__ #include "gui/callback_group.hpp" #include "gui/visual_component.hpp" #include "visual/sprite.hpp" #include "input/key_info.hpp" namespace bear { namespace gui { /** * \brief A slider. * \author Julien Jorge */ template class slider: public visual_component { public: slider( const visual::sprite& bar, const visual::sprite& slider, T min, T max, T value ); slider( const visual::sprite& bar, const visual::sprite& slider, T min, T max, T value, const callback& value_changed ); void set_delta( T v ); void set_value( T v ); T get_value() const; private: void display( std::list& e ) const; void set_slider_at( unsigned int x ); void on_resized(); bool on_key_press( const input::key_info& key ); bool on_button_press ( input::joystick::joy_code button, unsigned int joy_index ); bool on_mouse_press ( input::mouse::mouse_code button, const claw::math::coordinate_2d& pos ); bool on_mouse_released ( input::mouse::mouse_code button, const claw::math::coordinate_2d& pos ); bool on_mouse_maintained ( input::mouse::mouse_code button, const claw::math::coordinate_2d& pos ); private: /** \brief The bar on which the slider slides. */ visual::sprite m_bar; /** \brief The slider. */ visual::sprite m_slider; /** \brief The minimum value. */ const T m_min; /** \brief The maximum value. */ const T m_max; /** \brief The current value. */ T m_value; /** \brief The delta applied to the value. */ T m_delta; /** \brief Callback executed when the value changed. */ callback_group m_value_changed_callback; }; // class slider } // namespace gui } // namespace bear #include "gui/impl/slider.tpp" #endif // __GUI_SLIDER_HPP__ plee-the-bear-20251226/bear-engine/core/src/gui/static_text.hpp000066400000000000000000000057161512343254000241240ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Simple component to print a text on the screen. * \author Julien Jorge */ #ifndef __GUI_STATIC_TEXT_HPP__ #define __GUI_STATIC_TEXT_HPP__ #include "gui/visual_component.hpp" #include "visual/font/font.hpp" #include "visual/writing.hpp" #include #include "gui/class_export.hpp" namespace bear { namespace gui { /** * \brief Simple component to print a text on the screen. * \author Julien Jorge */ class GUI_EXPORT static_text: public visual_component { public: /** \brief The type of the font used to display the text. */ typedef visual::font font_type; private: /** \brief The class passed to text_layout to compute the longest text that can be displayed. */ class arrange_longest_text { public: arrange_longest_text( std::size_t& result ); void operator() ( visual::position_type p, std::size_t first, std::size_t last ); private: /** \brief The length of the text. */ std::size_t& m_result; }; // class arrange_sprite_list public: static_text(); explicit static_text( font_type f ); void set_font( font_type f ); void set_auto_size( bool b ); void clear(); void set_text( const std::string& text ); const std::string& get_text() const; font_type get_font() const; void expand_vertically(); std::size_t get_longest_text( const std::string& text ) const; void set_margin( coordinate_type x, coordinate_type y ); void set_margin( const size_box_type& m ); size_box_type get_margin() const; size_type get_min_height_with_text() const; visual::bitmap_rendering_attributes& get_text_rendering_attributes(); const visual::bitmap_rendering_attributes& get_text_rendering_attributes() const; private: size_box_type get_auto_size_with_max_width( size_type w ) const; void display( std::list& e ) const; void adjust_size_to_text(); void on_resized(); void refresh_writing(); private: /** \brief The text to draw. */ std::string m_text; /** \brief The font used to draw the text. */ font_type m_font; /** \brief Tell if we must adjust the size of the component to the size of the text. */ bool m_auto_size; /** \brief The text displayed. */ visual::writing m_writing; /** \brief The margins around the text. */ size_box_type m_margin; /** \brief Rendering attributes of the text. */ visual::bitmap_rendering_attributes m_text_rendering_attributes; }; // class static_text } // namespace gui } // namespace bear #endif // __GUI_STATIC_TEXT_HPP__ plee-the-bear-20251226/bear-engine/core/src/gui/text_input.hpp000066400000000000000000000053331512343254000237670ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A component that display a modifiable text. * \author Julien Jorge */ #ifndef __GUI_TEXT_INPUT_HPP__ #define __GUI_TEXT_INPUT_HPP__ #include "gui/callback_group.hpp" #include "gui/visual_component.hpp" #include "input/keyboard.hpp" #include "visual/font/font.hpp" #include "gui/class_export.hpp" namespace bear { namespace gui { class static_text; /** * \brief A component that display a modifiable text. * \author Julien Jorge */ class GUI_EXPORT text_input: public visual_component { public: /** \brief The type of the font used to display the text. */ typedef visual::font font_type; public: text_input( font_type f, visual::color_type cursor_color ); void clear(); void set_text( const std::string& text ); const std::string& get_text() const; void add_enter_callback( const callback& c ); void add_changed_callback( const callback& c ); void set_margin( coordinate_type x, coordinate_type y ); void set_margin( const size_box_type& m ); private: bool on_key_press( const input::key_info& key ); bool on_char_pressed( const input::key_info& key ); void on_resized(); void display( std::list& e ) const; void insert_character( char key ); bool special_code( const input::key_info& key ); void move_left(); void move_right(); void adjust_text_by_left(); void adjust_text_by_right(); void adjust_visible_part_of_text(); private: /** \brief A static text, used for displaying the visible part of the text. */ static_text* m_static_text; /** \brief Position for next character. */ unsigned int m_cursor; /** \brief The input text. */ std::string m_text; /** \brief The color of the cursor. */ visual::color_type m_cursor_color; /** \brief Position of the first visible character in the text. */ std::string::size_type m_first; /** \brief Position of the last visible character in the text. */ std::string::size_type m_last; /** \brief Maximum number of characters in the line. */ std::string::size_type m_line_length; /** \brief Callback executed when enter is pressed. */ callback_group m_enter_callback; /** \brief Callback executed when the text has changed. */ callback_group m_changed_callback; }; // class text_input } // namespace gui } // namespace bear #endif // __GUI_TEXT_INPUT_HPP__ plee-the-bear-20251226/bear-engine/core/src/gui/types.hpp000066400000000000000000000020461512343254000227260ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Data types for the gui:: namespace. * \author Julien Jorge */ #ifndef __GUI_TYPES_HPP__ #define __GUI_TYPES_HPP__ #include "visual/types.hpp" namespace bear { namespace gui { /** \brief The type of a coordinate. */ typedef visual::coordinate_type coordinate_type; /** \brief The type of the vectors used for representing coordinates. */ typedef visual::position_type position_type; /** \brief The type of a size. */ typedef visual::size_type size_type; /** \brief The type of a box size (width and height). */ typedef visual::size_box_type size_box_type; /** \brief The type of a rectangle. */ typedef visual::rectangle_type rectangle_type; /** \brief A color. */ typedef visual::color_type color_type; } // namespace gui } // namespace bear #endif // __GUI_TYPES_HPP__ plee-the-bear-20251226/bear-engine/core/src/gui/visual_component.hpp000066400000000000000000000200511512343254000251430ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Base class for all gui components. * \author Julien Jorge */ #ifndef __GUI_VISUAL_COMPONENT_HPP__ #define __GUI_VISUAL_COMPONENT_HPP__ #include "gui/types.hpp" #include "visual/scene_element.hpp" #include "input/input_listener.hpp" #include "gui/callback_group.hpp" #include "visual/bitmap_rendering_attributes.hpp" #include #include #include #include #include "gui/class_export.hpp" namespace bear { namespace gui { /** * \brief Base class for all gui components. * \author Julien Jorge */ class GUI_EXPORT visual_component: public claw::pattern::non_copyable, public input::input_listener { public: typedef std::list scene_element_list; private: typedef std::vector component_list; public: /** The type of the iterators on the children components. */ typedef claw::wrapped_iterator < visual_component, component_list::const_iterator, claw::dereference >::iterator_type iterator; public: visual_component(); virtual ~visual_component(); void insert( visual_component* child ); void remove( visual_component* child ); void remove_all(); iterator begin() const; iterator end() const; void render( scene_element_list& e ) const; bool key_pressed( const input::key_info& key ); bool char_pressed( const input::key_info& key ); bool button_pressed ( input::joystick::joy_code button, unsigned int joy_index ); bool mouse_pressed( input::mouse::mouse_code button, const claw::math::coordinate_2d& pos ); bool mouse_released( input::mouse::mouse_code button, const claw::math::coordinate_2d& pos ); bool mouse_maintained( input::mouse::mouse_code button, const claw::math::coordinate_2d& pos ); bool mouse_move( const claw::math::coordinate_2d& pos ); bool finger_action( const input::finger_event& event ); void fit( size_type margin = 0 ); void set_size_maximum(); void set_size( const size_box_type& size ); void set_size( size_type w, size_type h ); void set_width( size_type w ); void set_height( size_type h ); void set_position( const position_type& pos ); void set_position( coordinate_type x, coordinate_type y ); void set_visible( bool b ); void set_tab_order( unsigned int v ); void set_input_priority( bool this_first ); void set_left( coordinate_type x ); void set_right( coordinate_type x ); void set_top( coordinate_type y ); void set_bottom( coordinate_type y ); void set_top_left( coordinate_type x, coordinate_type y ); void set_bottom_left( coordinate_type x, coordinate_type y ); void set_top_right( coordinate_type x, coordinate_type y ); void set_bottom_right( coordinate_type x, coordinate_type y ); size_type width() const; size_type height() const; coordinate_type left() const; coordinate_type right() const; coordinate_type bottom() const; coordinate_type top() const; position_type top_left() const; position_type top_right() const; position_type bottom_left() const; position_type bottom_right() const; size_box_type get_size() const; position_type get_position() const; const rectangle_type& get_rectangle() const; bool get_visible() const; size_type get_border_size() const; void set_border_color( const color_type& clr ); void set_top_left_border_color( const color_type& clr ); const color_type& get_top_left_border_color() const; void set_bottom_right_border_color( const color_type& clr ); const color_type& get_bottom_right_border_color() const; void set_background_color( const color_type& clr ); const color_type& get_background_color() const; void disable(); void enable(); bool is_enabled() const; void set_focus(); visual_component* get_focus() const; void add_focus_callback( const callback& c ); void clear(); visual::bitmap_rendering_attributes& get_rendering_attributes(); const visual::bitmap_rendering_attributes& get_rendering_attributes() const; protected: void change_tab_position( const visual_component* that, unsigned int pos ); virtual void on_resized(); virtual void on_clear(); virtual void on_child_inserted( visual_component* child ); virtual void on_child_removed( visual_component* child ); virtual void display( scene_element_list& e ) const; virtual bool on_key_press( const input::key_info& key ); virtual bool on_char_pressed( const input::key_info& key ); virtual bool on_button_press( input::joystick::joy_code button, unsigned int joy_index ); virtual bool on_mouse_press ( input::mouse::mouse_code key, const claw::math::coordinate_2d& pos ); virtual bool on_mouse_move( const claw::math::coordinate_2d& pos ); virtual bool on_mouse_released ( input::mouse::mouse_code key, const claw::math::coordinate_2d& pos ); virtual bool on_mouse_maintained ( input::mouse::mouse_code key, const claw::math::coordinate_2d& pos ); virtual bool on_finger_action( const input::finger_event& event ); virtual void on_focused(); private: bool broadcast_mouse_move ( const claw::math::coordinate_2d& pos ); bool broadcast_mouse_press ( input::mouse::mouse_code button, const claw::math::coordinate_2d& pos ); bool broadcast_mouse_released ( input::mouse::mouse_code button, const claw::math::coordinate_2d& pos ); bool broadcast_mouse_maintained ( input::mouse::mouse_code button, const claw::math::coordinate_2d& pos ); bool broadcast_finger_action( const input::finger_event& event ); void stay_in_owner(); void set_focus( visual_component* c ); scene_element_list get_scene_elements() const; void render_faces( scene_element_list& e ) const; private: /** * \brief The box in which the component will be. The position is relative * to the bottom left corner of the owner. */ rectangle_type m_box; /** \brief The component containing this component. */ visual_component* m_owner; /** \brief The components in this component. */ component_list m_components; /** \brief The component having the focus. */ int m_focused_component; /** \brief Tell if the component is visible or not. */ bool m_visible; /** \brief Tell if the component catches the inputs before its children. */ bool m_input_priority; /** \brife Tell if this component is enabled or not. */ bool m_enabled; /** \brief The color of the top and left borders of the control. */ color_type m_top_left_border_color; /** \brief The color of the bottom and right borders of the control. */ color_type m_bottom_right_border_color; /** \brief The color of the background of the control. */ color_type m_background_color; /** \brief Callback executed when the component receives the focus. */ callback_group m_focus_callback; /** \brief Global rendering attributes of the item. */ visual::bitmap_rendering_attributes m_rendering_attributes; }; // class visual_component } // namespace gui } // namespace bear #endif // __GUI_VISUAL_COMPONENT_HPP__ plee-the-bear-20251226/bear-engine/core/src/input/000077500000000000000000000000001512343254000214225ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/core/src/input/CMakeLists.txt000066400000000000000000000021671512343254000241700ustar00rootroot00000000000000set( INPUT_TARGET_NAME bear_input ) #------------------------------------------------------------------------------- set( INPUT_SOURCE_FILES code/controller_button.cpp code/display_projection.cpp code/finger.cpp code/finger_event.cpp code/finger_status.cpp code/input_listener.cpp code/input_status.cpp code/joystick.cpp code/joystick_button.cpp code/joystick_status.cpp code/key_event.cpp code/key_info.cpp code/keyboard.cpp code/keyboard_status.cpp code/mouse.cpp code/mouse_status.cpp code/system.cpp ) add_library( ${INPUT_TARGET_NAME} ${BEAR_ENGINE_CORE_LINK_TYPE} ${INPUT_SOURCE_FILES} ) set_target_properties( ${INPUT_TARGET_NAME} PROPERTIES INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/${BEAR_ENGINE_INSTALL_LIBRARY_DIR}" ) install( TARGETS ${INPUT_TARGET_NAME} DESTINATION ${BEAR_ENGINE_INSTALL_LIBRARY_DIR} ) set( INPUT_LINK_LIBRARIES ${SDL2_LIBRARY} ${CLAW_LOGGER_LIBRARIES} ) if(WIN32 OR APPLE) set( INPUT_LINK_LIBRARIES ${INPUT_LINK_LIBRARIES} intl ) endif(WIN32 OR APPLE) target_link_libraries( ${INPUT_TARGET_NAME} ${INPUT_LINK_LIBRARIES} ) plee-the-bear-20251226/bear-engine/core/src/input/class_export.hpp000066400000000000000000000014211512343254000246370ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Definition of the INPUT_EXPORT macro according to the fact that we * create the library or link to it. * \author Julien Jorge */ #ifndef __INPUT_CLASS_EXPORT_HPP__ #define __INPUT_CLASS_EXPORT_HPP__ #ifndef INPUT_EXPORT # ifdef _WIN32 # ifdef bear_input_EXPORTS # define INPUT_EXPORT __declspec(dllexport) # else # define INPUT_EXPORT __declspec(dllimport) # endif // def bear_input_EXPORTS # else // def _WIN32 # define INPUT_EXPORT # endif // def _WIN32 #endif // ndef INPUT_EXPORT #endif // __INPUT_CLASS_EXPORT_HPP__ plee-the-bear-20251226/bear-engine/core/src/input/code/000077500000000000000000000000001512343254000223345ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/core/src/input/code/controller_button.cpp000066400000000000000000000075171512343254000266300ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Informations on a pressed key. * \author Julien Jorge */ #include "input/controller_button.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ bear::input::controller_button::controller_button() : m_type(controller_not_set) { } // controller_button::controller_button() /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param key The keyboard key to store. */ bear::input::controller_button::controller_button( const key_info& key ) : m_type(controller_keyboard), m_keyboard(key) { } // controller_button::controller_button() /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param joy The joystick button to store. */ bear::input::controller_button::controller_button( const joystick_button& joy ) : m_type(controller_joystick), m_joystick(joy) { } // controller_button::controller_button() /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param m The mouse button to store. */ bear::input::controller_button::controller_button( mouse::mouse_code m ) : m_type(controller_mouse), m_mouse(m) { } // controller_button::controller_button() /*----------------------------------------------------------------------------*/ /** * \brief Assignment operator. * \param key The keyboard key to store. */ bear::input::controller_button& bear::input::controller_button::operator=( const key_info& key ) { m_type = controller_keyboard; m_keyboard = key; return *this; } // controller_button::operator=() /*----------------------------------------------------------------------------*/ /** * \brief Assignement operator. * \param joy The joystick button to store. */ bear::input::controller_button& bear::input::controller_button::operator=( const joystick_button& joy ) { m_type = controller_joystick; m_joystick = joy; return *this; } // controller_button::operator=() /*----------------------------------------------------------------------------*/ /** * \brief Assignment operator. * \param m The mouse button to store. */ bear::input::controller_button& bear::input::controller_button::operator=( mouse::mouse_code m ) { m_type = controller_mouse; m_mouse = m; return *this; } // controller_button::operator=() /*----------------------------------------------------------------------------*/ /** * \brief Get the type of the controller for which the button is stored. */ bear::input::controller_button::controller_type bear::input::controller_button::get_type() const { return m_type; } // controller_button::get_type() /*----------------------------------------------------------------------------*/ /** * \brief Get the keyboard button. */ const bear::input::key_info& bear::input::controller_button::get_key_info() const { CLAW_PRECOND( m_type == controller_keyboard ); return m_keyboard; } // controller_button::get_key_info() /*----------------------------------------------------------------------------*/ /** * \brief Get the joystick button. */ const bear::input::joystick_button& bear::input::controller_button::get_joystick_button() const { CLAW_PRECOND( m_type == controller_joystick ); return m_joystick; } // controller_button::get_joystick_button() /*----------------------------------------------------------------------------*/ /** * \brief Get the mouse button. */ bear::input::mouse::mouse_code bear::input::controller_button::get_mouse_code() const { CLAW_PRECOND( m_type == controller_mouse ); return m_mouse; } // controller_button::get_mouse_code() plee-the-bear-20251226/bear-engine/core/src/input/code/display_projection.cpp000066400000000000000000000033161512343254000267440ustar00rootroot00000000000000#include "input/display_projection.hpp" #include bear::input::display_projection::display_projection() : m_window_size( 1, 1 ), m_view_size( 1, 1 ), m_viewport_size( 1, 1 ) { } bear::input::display_projection::display_projection ( const claw::math::coordinate_2d< int >& window_size, const claw::math::coordinate_2d< int >& view_size, const claw::math::coordinate_2d< int >& viewport_size ) : m_window_size( window_size ), m_view_size( view_size ), m_viewport_size( viewport_size ) { } claw::math::coordinate_2d< unsigned int > bear::input::display_projection::window_position_to_display ( int x, int y ) const { const claw::math::coordinate_2d< int > result ( transform( x, m_window_size.y - y ) ); return claw::math::coordinate_2d< unsigned int > ( std::min( std::max( 0, result.x ), m_view_size.x ), std::min( std::max( 0, result.y ), m_view_size.y ) ); } claw::math::coordinate_2d< unsigned int > bear::input::display_projection::window_ratio_to_display ( double x, double y ) const { return window_position_to_display ( int( x * m_window_size.x ), int( y * m_window_size.y ) ); } claw::math::coordinate_2d< int > bear::input::display_projection::window_offset_to_display ( double x, double y ) const { return transform( x * m_window_size.x, -y * m_window_size.y ); } claw::math::coordinate_2d< int > bear::input::display_projection::transform( int x, int y ) const { const int rx ( ( x - ( m_window_size.x - m_viewport_size.x ) / 2 ) * m_view_size.x / m_viewport_size.x ); const int ry ( ( y - ( m_window_size.y - m_viewport_size.y ) / 2 ) * m_view_size.y / m_viewport_size.y ); return claw::math::coordinate_2d< int >( rx, ry ); } plee-the-bear-20251226/bear-engine/core/src/input/code/finger.cpp000066400000000000000000000050671512343254000243220ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::input::finger class. * \author Julien Jorge */ #include "input/finger.hpp" #include void bear::input::finger::set_display( const display_projection& display ) { m_display = display; } /*----------------------------------------------------------------------------*/ /** * \brief Returns the last events. */ const bear::input::finger::event_list& bear::input::finger::get_events() const { return m_events; } // finger::get_events() /*----------------------------------------------------------------------------*/ /** * \brief Re-read the status of all keys. * \pre The caller is an instance of bear::input::system. */ void bear::input::finger::refresh() { m_events.clear(); SDL_Event e; // The range of events to process. It includes button up and button down. const SDL_EventType event_min( SDL_FINGERDOWN ); const SDL_EventType event_max( SDL_FINGERMOTION ); while ( SDL_PeepEvents(&e, 1, SDL_GETEVENT, event_min, event_max ) == 1 ) { const SDL_TouchFingerEvent* const evt = reinterpret_cast(&e); const position_type position( convert_position( evt->x, evt->y ) ); if ( e.type == SDL_FINGERDOWN ) m_events.push_back ( finger_event::create_pressed_event( position, evt->fingerId ) ); else if ( e.type == SDL_FINGERUP ) m_events.push_back ( finger_event::create_released_event( position, evt->fingerId ) ); else if ( e.type == SDL_FINGERMOTION ) m_events.push_back ( finger_event::create_motion_event ( position, evt->fingerId, convert_delta( evt->dx, evt->dy ) ) ); } } // finger::refresh() /*----------------------------------------------------------------------------*/ /** * \brief Converts SDL's finger position into the coordinates of the engine. */ bear::input::position_type bear::input::finger::convert_position( double x, double y ) const { return m_display.window_ratio_to_display( x, y ); } // finger::convert_position() /*----------------------------------------------------------------------------*/ /** * \brief Converts SDL's finger movement into the coordinates of the engine. */ bear::input::position_type bear::input::finger::convert_delta( double x, double y ) const { return m_display.window_offset_to_display( x, y ); } // finger::convert_delta() plee-the-bear-20251226/bear-engine/core/src/input/code/finger_event.cpp000066400000000000000000000074261512343254000255240ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the input::finger_event class. * \author Julien Jorge */ #include "input/finger_event.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Creates a pressed event. * \param p The position where the finger has been pressed. * \param finger_id The identifier of the finger emitting this event. */ bear::input::finger_event bear::input::finger_event::create_pressed_event ( const position_type& p, int finger_id ) { finger_event e( finger_event_pressed, finger_id ); e.m_position = p; return e; } // finger_event::create_pressed_event() /*----------------------------------------------------------------------------*/ /** * \brief Creates a released event. * \param p The position where the finger has been released. * \param finger_id The identifier of the finger emitting this event. */ bear::input::finger_event bear::input::finger_event::create_released_event ( const position_type& p, int finger_id ) { finger_event e( finger_event_released, finger_id ); e.m_position = p; return e; } // finger_event::create_released_event() /*----------------------------------------------------------------------------*/ /** * \brief Creates a motion event. * \param p The position where the event occurred. * \param d The distance of the motion. * \param finger_id The identifier of the finger emitting this event. */ bear::input::finger_event bear::input::finger_event::create_motion_event ( const position_type& p, int finger_id, const position_type& d ) { finger_event e( finger_event_motion, finger_id ); e.m_position = p; e.m_distance = d; return e; } // finger_event::create_motion_event() /*----------------------------------------------------------------------------*/ /** * \brief Returns the identifier of the finger emitting this event. */ int bear::input::finger_event::get_finger_id() const { return m_finger_id; } // finger_event::get_finger_id() /*----------------------------------------------------------------------------*/ /** * \brief Returns the type of the event. */ bear::input::finger_event::event_type bear::input::finger_event::get_type() const { return m_type; } // finger_event::get_type() /*----------------------------------------------------------------------------*/ /** * \brief Returns the position where the event occurred. */ const bear::input::position_type& bear::input::finger_event::get_position() const { return m_position; } // finger_event::get_position() /*----------------------------------------------------------------------------*/ /** * \brief Returns a copy of this event as if it occurred at a given position. * \param p The position of the returned event. */ bear::input::finger_event bear::input::finger_event::at_position( const position_type& p ) const { finger_event result(*this); result.m_position = p; return result; } // finger_event::at_position() /*----------------------------------------------------------------------------*/ /** * \brief Returns the distance of the motion. */ const bear::input::position_type& bear::input::finger_event::get_distance() const { return m_distance; } // finger_event::get_distance() /*----------------------------------------------------------------------------*/ /** * \brief Constructs an event of an unknown type. * \param t The type of the event. * \param finger_id The identifier of the finger emitting this event. */ bear::input::finger_event::finger_event( event_type t, int finger_id ) : m_type(t), m_finger_id( finger_id ), m_position(0, 0), m_distance(0, 0) { } // finger_event::finger_event() plee-the-bear-20251226/bear-engine/core/src/input/code/finger_status.cpp000066400000000000000000000022001512343254000257070ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::input::finger_status class. * \author Julien Jorge */ #include "input/finger_status.hpp" #include "input/input_listener.hpp" #include "input/system.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Read the status of the finger. */ void bear::input::finger_status::read() { const finger& f = system::get_instance().get_finger(); m_events = f.get_events(); } // finger_status::read() /*----------------------------------------------------------------------------*/ /** * \brief Send the status of the finger to an input_listener. * \param listener The listener to pass informations to. */ void bear::input::finger_status::scan_inputs( input_listener& listener ) const { for ( event_list::const_iterator it = m_events.begin(); it != m_events.end(); ++it ) listener.finger_action( *it ); } // finger_status::scan_inputs() plee-the-bear-20251226/bear-engine/core/src/input/code/input_listener.cpp000066400000000000000000000133401512343254000261050ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::input::input_listener class. * \author Julien Jorge */ #include "input/input_listener.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Destructor. */ bear::input::input_listener::~input_listener() { // nothing to do } // input_listener::~input_listener() /*----------------------------------------------------------------------------*/ /** * \brief Method called when a key is pressed. * \param key The value of the key. * \return true if the key has been processed. * * This methods use raw key codes as \a key. If you want the character as * entered by the user, use char_pressed. */ bool bear::input::input_listener::key_pressed( const key_info& key ) { return false; } // input_listener::key_pressed() /*----------------------------------------------------------------------------*/ /** * \brief Method called when a key is released. * \param key The value of the key. * \return true if the key has been processed. * * This methods use raw key codes as \a key. If you want the character as * entered by the user, use char_pressed. */ bool bear::input::input_listener::key_released( const key_info& key ) { return false; } // input_listener::key_released() /*----------------------------------------------------------------------------*/ /** * \brief Method called when a key is maintained. * \param key The value of the key. * \return true if the key has been processed. * * This methods use raw key codes as \a key. If you want the character as * entered by the user, use char_pressed. */ bool bear::input::input_listener::key_maintained( const key_info& key ) { return false; } // input_listener::key_maintained() /*----------------------------------------------------------------------------*/ /** * \brief Method called when a character is entered by the user. * \param key The value of the key. * \return true if the key has been processed. */ bool bear::input::input_listener::char_pressed( const key_info& key ) { return false; } // input_listener::char_pressed() /*----------------------------------------------------------------------------*/ /** * \brief Method called when a joystick button is pressed. * \param button The value of the button. * \param joy_index The index of the joystick. * \return true if the button has been processed. */ bool bear::input::input_listener::button_pressed ( joystick::joy_code button, unsigned int joy_index ) { return false; } // input_listener::button_pressed() /*----------------------------------------------------------------------------*/ /** * \brief Method called when a joystick button is released. * \param button The value of the button. * \param joy_index The index of the joystick. * \return true if the button has been processed. */ bool bear::input::input_listener::button_released ( joystick::joy_code button, unsigned int joy_index ) { return false; } // input_listener::button_released() /*----------------------------------------------------------------------------*/ /** * \brief Method called when a joystick button is maintained. * \param button The value of the button. * \param joy_index The index of the joystick. * \return true if the button has been processed. */ bool bear::input::input_listener::button_maintained ( joystick::joy_code button, unsigned int joy_index ) { return false; } // input_listener::button_maintained() /*----------------------------------------------------------------------------*/ /** * \brief Method called when a mouse button is pressed. * \param button The code of the button. * \param pos The current position of the cursor. * \return true if the button has been processed. */ bool bear::input::input_listener::mouse_pressed ( mouse::mouse_code button, const claw::math::coordinate_2d& pos ) { return false; } // input_listener::mouse_pressed() /*----------------------------------------------------------------------------*/ /** * \brief Method called when a mouse button is released. * \param button The code of the button. * \param pos The current position of the cursor. * \return true if the button has been processed. */ bool bear::input::input_listener::mouse_released ( mouse::mouse_code button, const claw::math::coordinate_2d& pos ) { return false; } // input_listener::mouse_released() /*----------------------------------------------------------------------------*/ /** * \brief Method called when a mouse button is maintained. * \param button The code of the button. * \param pos The current position of the cursor. * \return true if the button has been processed. */ bool bear::input::input_listener::mouse_maintained ( mouse::mouse_code button, const claw::math::coordinate_2d& pos ) { return false; } // input_listener::mouse_maintained() /*----------------------------------------------------------------------------*/ /** * \brief Method called when the position of the mouse changes. * \param pos The new position of the cursor. * \return true if the event has been processed. */ bool bear::input::input_listener::mouse_move ( const claw::math::coordinate_2d& pos ) { return false; } // input_listener::mouse_move() /*----------------------------------------------------------------------------*/ /** * \brief Method called a finger related event occurs. * \param event The event. * \return true if the event has been processed. */ bool bear::input::input_listener::finger_action( const finger_event& event ) { return false; } // input_listener::finger_action() plee-the-bear-20251226/bear-engine/core/src/input/code/input_status.cpp000066400000000000000000000020761512343254000256070ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::input::input_status class. * \author Julien Jorge */ #include "input/input_status.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Read the status of the keys. */ void bear::input::input_status::read() { m_keyboard.read(); m_joystick.read(); m_mouse.read(); m_finger.read(); } // input_status::read() /*----------------------------------------------------------------------------*/ /** * \brief Send the status of the keys to an input_listener. * \param listener The listener to pass informations to. */ void bear::input::input_status::scan_inputs( input_listener& listener ) const { m_keyboard.scan_inputs( listener ); m_joystick.scan_inputs( listener ); m_mouse.scan_inputs( listener ); m_finger.scan_inputs( listener ); } // input_status::scan_inputs() plee-the-bear-20251226/bear-engine/core/src/input/code/joystick.cpp000066400000000000000000000152741512343254000247100ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::input::joystick class. * \author Julien Jorge */ #include "input/joystick.hpp" #include "bear_gettext.hpp" #include #include #include #include #include /*----------------------------------------------------------------------------*/ /** * \brief Get the number of plugged joysticks. */ unsigned int bear::input::joystick::number_of_joysticks() { #ifdef __ANDROID__ return 0; #else return SDL_NumJoysticks(); #endif } // joystick::number_of_joysticks() /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ bear::input::joystick::joystick( unsigned int joy_id ) : m_id(joy_id) { CLAW_PRECOND( joy_id < number_of_joysticks() ); const char* name( SDL_JoystickNameForIndex(joy_id) ); if ( name != NULL ) claw::logger << claw::log_verbose << "Creating joystick number " << joy_id << ": \"" << name << "\"." << std::endl; m_joystick = SDL_JoystickOpen(joy_id); if (!m_joystick) throw claw::exception( SDL_GetError() ); } // joystick::joystick() /*----------------------------------------------------------------------------*/ /** * \brief Destructor. */ bear::input::joystick::~joystick() { SDL_JoystickClose(m_joystick); } // joystick::~joystick() /*----------------------------------------------------------------------------*/ /** * \brief Convert a joy_code to a human-readable string. * \param k The button to convert. */ std::string bear::input::joystick::get_name_of( joy_code k ) { std::string result; switch(k) { case jc_axis_up: result = "up"; break; case jc_axis_down: result = "down"; break; case jc_axis_left: result = "left"; break; case jc_axis_right: result = "right"; break; case jc_axis_up_left: result = "up left"; break; case jc_axis_up_right: result = "up right"; break; case jc_axis_down_left: result = "down left"; break; case jc_axis_down_right: result = "down right"; break; default: { std::ostringstream oss; oss << "button" << ' ' << (k - jc_button_1 + 1); result = oss.str(); } } return result; } // joystick::get_name_of() /*----------------------------------------------------------------------------*/ /** * \brief Convert a joy_code to a human-readable string translated with gettext. * \param k The button to convert. */ std::string bear::input::joystick::get_translated_name_of( joy_code k ) { std::string result; if ( k >= jc_button_1 ) { std::ostringstream oss; oss << bear_gettext("button") << ' ' << (k - jc_button_1 + 1); result = oss.str(); } else result = bear_gettext( get_name_of(k).c_str() ); return result; } // joystick::get_translated_name_of() /*----------------------------------------------------------------------------*/ /** * \brief Get a joy_code from its human-readable name. * \param n The name of the code. */ bear::input::joystick::joy_code bear::input::joystick::get_code_named( const std::string& n ) { for (joy_code i=jc_range_min; i<=jc_range_max; ++i) if ( get_name_of(i) == n ) return i; return jc_invalid; } // joystick::get_code_named() /*----------------------------------------------------------------------------*/ /** * \brief Get an iterator on the first pressed button. */ bear::input::joystick::const_iterator bear::input::joystick::begin() const { return m_pressed_buttons.begin(); } // joystick::begin() /*----------------------------------------------------------------------------*/ /** * \brief Get an iterator after the last pressed button. */ bear::input::joystick::const_iterator bear::input::joystick::end() const { return m_pressed_buttons.end(); } // joystick::end() /*----------------------------------------------------------------------------*/ /** * \brief Tell if no buttons are pressed. */ bool bear::input::joystick::empty() const { return m_pressed_buttons.empty(); } // joystick::empty() /*----------------------------------------------------------------------------*/ /** * \brief Get the identifier of the joystick. */ unsigned int bear::input::joystick::get_id() const { return m_id; } // joystick::get_id() /*----------------------------------------------------------------------------*/ /** * \brief Re-read the status of all buttons. * \pre The caller is an instance of bear::input::system. */ void bear::input::joystick::refresh() { m_pressed_buttons.clear(); SDL_JoystickUpdate(); joy_code axis = get_pressed_axis(); if (axis != jc_invalid) m_pressed_buttons.push_back( axis ); unsigned int num_buttons = c_number_of_buttons; if ( num_buttons > (unsigned int)SDL_JoystickNumButtons(m_joystick) ) num_buttons = SDL_JoystickNumButtons(m_joystick); for (unsigned int button=0; button!=num_buttons; ++button) if ( SDL_JoystickGetButton(m_joystick, button) ) if ( sdl_button_to_local(button) != jc_invalid ) m_pressed_buttons.push_back( sdl_button_to_local(button) ); } // joystick::refresh() /*----------------------------------------------------------------------------*/ /** * \brief Get the currently pressed axis. */ bear::input::joystick::joy_code bear::input::joystick::get_pressed_axis() const { const bool up = SDL_JoystickGetAxis( m_joystick, 1 ) < -15000; const bool down = SDL_JoystickGetAxis( m_joystick, 1 ) > 15000; const bool left = SDL_JoystickGetAxis( m_joystick, 0 ) < -15000; const bool right = SDL_JoystickGetAxis( m_joystick, 0 ) > 15000; joy_code result = jc_invalid; if (up) { if (left) result = jc_axis_up_left; else if (right) result = jc_axis_up_right; else result = jc_axis_up; } else if (down) { if (left) result = jc_axis_down_left; else if (right) result = jc_axis_down_right; else result = jc_axis_down; } else if (left) result = jc_axis_left; else if (right) result = jc_axis_right; return result; } // joystick::get_pressed_axis() /*----------------------------------------------------------------------------*/ /** * \brief Convert a SDL_Joystick button index value to the corresponding * joy_code. */ bear::input::joystick::joy_code bear::input::joystick::sdl_button_to_local( unsigned int sdl_val ) const { unsigned int b = jc_button_1 + sdl_val; if (b > c_number_of_buttons) return jc_invalid; else return b; } // joystick::sdl_button_to_local() plee-the-bear-20251226/bear-engine/core/src/input/code/joystick_button.cpp000066400000000000000000000070501512343254000262740ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::input::joystick_button class. * \author Julien Jorge */ #include "input/joystick_button.hpp" #include "bear_gettext.hpp" #include #include /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ bear::input::joystick_button::joystick_button() : joystick_index(joystick::number_of_joysticks()), button(joystick::jc_invalid) { } // joystick_button::joystick_button() /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param joy The index of the joystick. * \param b The code of the button. */ bear::input::joystick_button::joystick_button ( unsigned int joy, joystick::joy_code b ) : joystick_index(joy), button(b) { } // joystick_button::joystick_button() /*----------------------------------------------------------------------------*/ /** * \brief Compare two joystick_button in lexicographic order. * \param that joystick_button to compare to. */ bool bear::input::joystick_button::operator<( const joystick_button& that ) const { if ( joystick_index == that.joystick_index ) return button < that.button; else return joystick_index < that.joystick_index; } // joystick_button::operator<() /*----------------------------------------------------------------------------*/ /** * \brief Tell if two joystick buttons are the same. * \param that joystick_button to compare to. */ bool bear::input::joystick_button::operator==( const joystick_button& that ) const { return ( joystick_index == that.joystick_index ) && (button == that.button); } // joystick_button::operator==() /*----------------------------------------------------------------------------*/ /** * \brief Convert a joystick_button to a human-readable string. * \param j The button to convert. */ std::string bear::input::joystick_button::get_name_of( const joystick_button& j ) { std::ostringstream oss; oss << "joystick" << ' ' << j.joystick_index << ' ' << joystick::get_name_of(j.button); return oss.str(); } // joystick_button::get_name_of() /*----------------------------------------------------------------------------*/ /** * \brief Convert a joystick_button to a human-readable string translated with * gettext. * \param j The button to convert. */ std::string bear::input::joystick_button::get_translated_name_of( const joystick_button& j ) { std::ostringstream oss; oss << bear_gettext("joystick") << ' ' << j.joystick_index << ' ' << joystick::get_translated_name_of(j.button); return oss.str(); } // joystick_button::get_translated_name_of() /*----------------------------------------------------------------------------*/ /** * \brief Get a joystick_button from its human-readable name. * \param n The name of the button. */ bear::input::joystick_button bear::input::joystick_button::get_button_named( const std::string& n ) { std::istringstream iss(n); unsigned int j; std::string joy_str; if ( iss >> joy_str >> j ) if ( joy_str == "joystick" ) { std::string button( n.end() - iss.rdbuf()->in_avail(), n.end() ); claw::text::trim(button); return joystick_button( j, joystick::get_code_named(button) ); } return joystick_button(0, joystick::jc_invalid); } // joystick_button::get_button_named() plee-the-bear-20251226/bear-engine/core/src/input/code/joystick_status.cpp000066400000000000000000000111711512343254000263030ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::input::joystick_status class. * \author Julien Jorge */ #include "input/joystick_status.hpp" #include "input/input_listener.hpp" #include "input/system.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Read the status of the keys. */ void bear::input::joystick_status::read() { const unsigned int nb_joy = joystick::number_of_joysticks(); set_type current; for (unsigned int i=0; i!=nb_joy; ++i) { const joystick& joy = system::get_instance().get_joystick(i); joystick::const_iterator it; for (it=joy.begin(); it!=joy.end(); ++it) current.insert( joystick_button(i, *it) ); } (m_released = m_pressed).join(m_maintained).difference(current); m_maintained.join(m_pressed).intersection(current); (m_pressed = current).difference(m_maintained); m_forget_button.difference( m_released ); } // joystick_status::read() /*----------------------------------------------------------------------------*/ /** * \brief Send the status of the keys to an input_listener. * \param listener The listener to pass informations to. */ void bear::input::joystick_status::scan_inputs( input_listener& listener ) const { set_type::const_iterator it; for (it=m_pressed.begin(); it!=m_pressed.end(); ++it) switch (it->button) { case joystick::jc_axis_up_left: listener.button_pressed( joystick::jc_axis_up, it->joystick_index ); listener.button_pressed( joystick::jc_axis_left, it->joystick_index ); break; case joystick::jc_axis_up_right: listener.button_pressed( joystick::jc_axis_up, it->joystick_index ); listener.button_pressed( joystick::jc_axis_right, it->joystick_index ); break; case joystick::jc_axis_down_left: listener.button_pressed( joystick::jc_axis_down, it->joystick_index ); listener.button_pressed( joystick::jc_axis_left, it->joystick_index ); break; case joystick::jc_axis_down_right: listener.button_pressed( joystick::jc_axis_down, it->joystick_index ); listener.button_pressed( joystick::jc_axis_right, it->joystick_index ); break; default: listener.button_pressed( it->button, it->joystick_index ); } for (it=m_maintained.begin(); it!=m_maintained.end(); ++it) switch (it->button) { case joystick::jc_axis_up_left: listener.button_maintained( joystick::jc_axis_up, it->joystick_index ); listener.button_maintained ( joystick::jc_axis_left, it->joystick_index ); break; case joystick::jc_axis_up_right: listener.button_maintained( joystick::jc_axis_up, it->joystick_index ); listener.button_maintained ( joystick::jc_axis_right, it->joystick_index ); break; case joystick::jc_axis_down_left: listener.button_maintained ( joystick::jc_axis_down, it->joystick_index ); listener.button_maintained ( joystick::jc_axis_left, it->joystick_index ); break; case joystick::jc_axis_down_right: listener.button_maintained ( joystick::jc_axis_down, it->joystick_index ); listener.button_maintained ( joystick::jc_axis_right, it->joystick_index ); break; default: listener.button_maintained( it->button, it->joystick_index ); } for (it=m_released.begin(); it!=m_released.end(); ++it) switch (it->button) { case joystick::jc_axis_up_left: listener.button_released( joystick::jc_axis_up, it->joystick_index ); listener.button_released( joystick::jc_axis_left, it->joystick_index ); break; case joystick::jc_axis_up_right: listener.button_released( joystick::jc_axis_up, it->joystick_index ); listener.button_released( joystick::jc_axis_right, it->joystick_index ); break; case joystick::jc_axis_down_left: listener.button_released( joystick::jc_axis_down, it->joystick_index ); listener.button_released( joystick::jc_axis_left, it->joystick_index ); break; case joystick::jc_axis_down_right: listener.button_released( joystick::jc_axis_down, it->joystick_index ); listener.button_released( joystick::jc_axis_right, it->joystick_index ); break; default: listener.button_released( it->button, it->joystick_index ); } } // joystick_status::scan_inputs() plee-the-bear-20251226/bear-engine/core/src/input/code/key_event.cpp000066400000000000000000000022111512343254000250250ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::input::key_event class. * \author Julien Jorge */ #include "input/key_event.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param t The type of the event. * \param info Informations about the key. */ bear::input::key_event::key_event( event_type t, const key_info& info ) : m_type(t), m_info(info) { } // key_event::key_event() /*----------------------------------------------------------------------------*/ /** * \brief Get the type of the event. */ bear::input::key_event::event_type bear::input::key_event::get_type() const { return m_type; } // key_event::get_type() /*----------------------------------------------------------------------------*/ /** * \brief Get the informations about the key. */ const bear::input::key_info& bear::input::key_event::get_info() const { return m_info; } // key_event::get_info() plee-the-bear-20251226/bear-engine/core/src/input/code/key_info.cpp000066400000000000000000000202431512343254000246440ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::input::key_info class. * \author Julien Jorge */ #include "input/key_info.hpp" #include "input/keyboard.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Default constructor. */ bear::input::key_info::key_info() { } // key_info::key_info() /*----------------------------------------------------------------------------*/ /** * \brief Constructor from a key_code. * \param c The code of the key. */ bear::input::key_info::key_info( key_code c ) : m_code(c), m_symbol(0) { } // key_info::key_info() /*----------------------------------------------------------------------------*/ /** * \brief Constructor from a key_code and a character. * \param c The code of the key. * \param s The character. */ bear::input::key_info::key_info( key_code c, charset::char_type s ) : m_code(c), m_symbol(s) { } // key_info::key_info() /*----------------------------------------------------------------------------*/ /** * \brief Builds a key_info from a character. * \param s The character. */ bear::input::key_info bear::input::key_info::from_char( charset::char_type s ) { if ( sizeof( charset::char_type ) <= sizeof( key_code ) ) return key_info( (charset::char_type)s, s ); else return key_info( 0, s ); } // key_info::from_char() /*----------------------------------------------------------------------------*/ /** * \brief Tell if two key_info are equals. * \param that The key_info to compare to. */ bool bear::input::key_info::operator==( const key_info& that ) const { return (m_code == that.m_code) && (m_symbol == that.m_symbol); } // key_info::operator<() /*----------------------------------------------------------------------------*/ /** * \brief Tell if this key is lower than an other. * \param that The key_info to compare to. */ bool bear::input::key_info::operator<( const key_info& that ) const { if ( m_code < that.m_code ) return true; else return (m_code == that.m_code) && (m_symbol < that.m_symbol); } // key_info::operator<() /*----------------------------------------------------------------------------*/ /** * \brief Get the code of the keyboard key. */ bear::input::key_code bear::input::key_info::get_code() const { return m_code; } // key_info::get_code() /*----------------------------------------------------------------------------*/ /** * \brief Get the translated symbol. */ bear::charset::char_type bear::input::key_info::get_symbol() const { return m_symbol; } // key_info::get_symbol() /*----------------------------------------------------------------------------*/ /** * \brief Tell if this key is the escape key. */ bool bear::input::key_info::is_escape() const { return m_code == keyboard::kc_escape; } // key_info::is_enter() /*----------------------------------------------------------------------------*/ /** * \brief Tell if this key is an enter key. */ bool bear::input::key_info::is_enter() const { return (m_code == keyboard::kc_new_line) || (m_code == keyboard::kc_keypad_enter) || (m_code == '\r'); // can't find the SDLKey for this one } // key_info::is_enter() /*----------------------------------------------------------------------------*/ /** * \brief Tell if this key is a tabulation. */ bool bear::input::key_info::is_tab() const { return m_code == keyboard::kc_tab; } // key_info::is_tab() /*----------------------------------------------------------------------------*/ /** * \brief Tell if this key is a control key. */ bool bear::input::key_info::is_control() const { return (m_code == keyboard::kc_left_control) || (m_code == keyboard::kc_right_control); } // key_info::is_control() /*----------------------------------------------------------------------------*/ /** * \brief Tell if this key is a shift key. */ bool bear::input::key_info::is_shift() const { return (m_code == keyboard::kc_left_shift) || (m_code == keyboard::kc_right_shift); } // key_info::is_shift() /*----------------------------------------------------------------------------*/ /** * \brief Tell if this key is an alt key. */ bool bear::input::key_info::is_alt() const { return (m_code == keyboard::kc_left_alt) || (m_code == keyboard::kc_right_alt); } // key_info::is_alt() /*----------------------------------------------------------------------------*/ /** * \brief Tell if this key is the arrow up key. */ bool bear::input::key_info::is_up() const { return m_code == keyboard::kc_up; } // key_info::is_up() /*----------------------------------------------------------------------------*/ /** * \brief Tell if this key is the arrow down key. */ bool bear::input::key_info::is_down() const { return m_code == keyboard::kc_down; } // key_info::is_down() /*----------------------------------------------------------------------------*/ /** * \brief Tell if this key is the arrow left key. */ bool bear::input::key_info::is_left() const { return m_code == keyboard::kc_left; } // key_info::is_left() /*----------------------------------------------------------------------------*/ /** * \brief Tell if this key is the arrow right key. */ bool bear::input::key_info::is_right() const { return m_code == keyboard::kc_right; } // key_info::is_right() /*----------------------------------------------------------------------------*/ /** * \brief Tell if this key is the home key. */ bool bear::input::key_info::is_home() const { return m_code == keyboard::kc_home; } // key_info::is_home() /*----------------------------------------------------------------------------*/ /** * \brief Tell if this key is the end key. */ bool bear::input::key_info::is_end() const { return m_code == keyboard::kc_end; } // key_info::is_end() /*----------------------------------------------------------------------------*/ /** * \brief Tell if this key is the delete key. */ bool bear::input::key_info::is_delete() const { return m_code == keyboard::kc_delete; } // key_info::is_delete() /*----------------------------------------------------------------------------*/ /** * \brief Tell if this key is the backspace key. */ bool bear::input::key_info::is_backspace() const { return m_code == keyboard::kc_backspace; } // key_info::is_backspace() /*----------------------------------------------------------------------------*/ /** * \brief Tells if this key is the back key. */ bool bear::input::key_info::is_back() const { return m_code == keyboard::kc_back; } // key_info::is_back() /*----------------------------------------------------------------------------*/ /** * \brief Tell if this key is a given function key. * \param f The function number. */ bool bear::input::key_info::is_function(unsigned int f) const { bool result; switch( m_code ) { case keyboard::kc_F1: result = (f == 1); break; case keyboard::kc_F2: result = (f == 2); break; case keyboard::kc_F3: result = (f == 3); break; case keyboard::kc_F4: result = (f == 4); break; case keyboard::kc_F5: result = (f == 5); break; case keyboard::kc_F6: result = (f == 6); break; case keyboard::kc_F7: result = (f == 7); break; case keyboard::kc_F8: result = (f == 8); break; case keyboard::kc_F9: result = (f == 9); break; case keyboard::kc_F10: result = (f == 10); break; case keyboard::kc_F11: result = (f == 11); break; case keyboard::kc_F12: result = (f == 12); break; case keyboard::kc_F13: result = (f == 13); break; case keyboard::kc_F14: result = (f == 14); break; case keyboard::kc_F15: result = (f == 15); break; default: result = false; } return result; } // key_info::is_function() /*----------------------------------------------------------------------------*/ /** * \brief Tell the key represents a printable symbol. */ bool bear::input::key_info::is_printable() const { return !(m_symbol < 0x20) /* unicode "space" */ && ( (m_symbol < 0x7F) /* unicode "delete" */ || ( m_symbol > 0x9F ) ) /* unicode ??? */ && ( m_symbol != 0xAD ); /* unicode ??? */ } // key_info::is_printable() plee-the-bear-20251226/bear-engine/core/src/input/code/keyboard.cpp000066400000000000000000000442131512343254000246440ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::input::keyboard class. * \author Julien Jorge */ #include "input/keyboard.hpp" #include "bear_gettext.hpp" #include #include #include #include /*----------------------------------------------------------------------------*/ /** * \brief Convert a key_code to a human-readable string. * \param k The key to convert. */ std::string bear::input::keyboard::get_name_of( key_code k ) { switch(k) { case kc_backspace: return "backspace"; break; case kc_tab: return "tab"; break; case kc_new_line: return "new line"; break; case kc_pause: return "pause"; break; case kc_escape: return "escape"; break; case kc_space: return "space"; break; case kc_exclamation_mark: return "!"; break; case kc_double_quotes: return "\""; break; case kc_hash: return "#"; break; case kc_dollar: return "$"; break; case kc_percent: return "%"; break; case kc_ampersand: return "&"; break; case kc_quote: return "'"; break; case kc_left_parenthesis: return "("; break; case kc_right_parenthesis: return ")"; break; case kc_asterisk: return "*"; break; case kc_plus: return "+"; break; case kc_comma: return ", "; break; case kc_minus: return "-"; break; case kc_period: return "."; break; case kc_slash: return "/"; break; case kc_0: return "0"; break; case kc_1: return "1"; break; case kc_2: return "2"; break; case kc_3: return "3"; break; case kc_4: return "4"; break; case kc_5: return "5"; break; case kc_6: return "6"; break; case kc_7: return "7"; break; case kc_8: return "8"; break; case kc_9: return "9"; break; case kc_colon: return ":"; break; case kc_semicolon: return "; break;"; break; case kc_less: return "<"; break; case kc_equal: return "="; break; case kc_greater: return ">"; break; case kc_question: return "?"; break; case kc_at: return "@"; break; case kc_A: return "A"; break; case kc_B: return "B"; break; case kc_C: return "C"; break; case kc_D: return "D"; break; case kc_E: return "E"; break; case kc_F: return "F"; break; case kc_G: return "G"; break; case kc_H: return "H"; break; case kc_I: return "I"; break; case kc_J: return "J"; break; case kc_K: return "K"; break; case kc_L: return "L"; break; case kc_M: return "M"; break; case kc_N: return "N"; break; case kc_O: return "O"; break; case kc_P: return "P"; break; case kc_Q: return "Q"; break; case kc_R: return "R"; break; case kc_S: return "S"; break; case kc_T: return "T"; break; case kc_U: return "U"; break; case kc_V: return "V"; break; case kc_W: return "W"; break; case kc_X: return "X"; break; case kc_Y: return "Y"; break; case kc_Z: return "Z"; break; case kc_left_bracket: return "["; break; case kc_backslash: return "\\"; break; case kc_right_bracket: return "]"; break; case kc_caret: return "^"; break; case kc_underscore: return "_"; break; case kc_backquote: return "`"; break; case kc_a: return "a"; break; case kc_b: return "b"; break; case kc_c: return "c"; break; case kc_d: return "d"; break; case kc_e: return "e"; break; case kc_f: return "f"; break; case kc_g: return "g"; break; case kc_h: return "h"; break; case kc_i: return "i"; break; case kc_j: return "j"; break; case kc_k: return "k"; break; case kc_l: return "l"; break; case kc_m: return "m"; break; case kc_n: return "n"; break; case kc_o: return "o"; break; case kc_p: return "p"; break; case kc_q: return "q"; break; case kc_r: return "r"; break; case kc_s: return "s"; break; case kc_t: return "t"; break; case kc_u: return "u"; break; case kc_v: return "v"; break; case kc_w: return "w"; break; case kc_x: return "x"; break; case kc_y: return "y"; break; case kc_z: return "z"; break; case kc_left_brace: return "{"; break; case kc_vertical_line: return "|"; break; case kc_right_brace: return "}"; break; case kc_tilde: return "~"; break; case kc_delete: return "delete"; break; case kc_keypad_0: return "keypad 0"; break; case kc_keypad_1: return "keypad 1"; break; case kc_keypad_2: return "keypad 2"; break; case kc_keypad_3: return "keypad 3"; break; case kc_keypad_4: return "keypad 4"; break; case kc_keypad_5: return "keypad 5"; break; case kc_keypad_6: return "keypad 6"; break; case kc_keypad_7: return "keypad 7"; break; case kc_keypad_8: return "keypad 8"; break; case kc_keypad_9: return "keypad 9"; break; case kc_keypad_period: return "keypad ."; break; case kc_keypad_divide: return "keypad /"; break; case kc_keypad_multiply: return "keypad *"; break; case kc_keypad_minus: return "keypad -"; break; case kc_keypad_plus: return "keypad +"; break; case kc_keypad_enter: return "keypad enter"; break; case kc_keypad_equals: return "keypad ="; break; case kc_up: return "up"; break; case kc_down: return "down"; break; case kc_right: return "right"; break; case kc_left: return "left"; break; case kc_insert: return "insert"; break; case kc_home: return "home"; break; case kc_end: return "end"; break; case kc_page_up: return "page up"; break; case kc_page_down: return "page down"; break; case kc_F1: return "F1"; break; case kc_F2: return "F2"; break; case kc_F3: return "F3"; break; case kc_F4: return "F4"; break; case kc_F5: return "F5"; break; case kc_F6: return "F6"; break; case kc_F7: return "F7"; break; case kc_F8: return "F8"; break; case kc_F9: return "F9"; break; case kc_F10: return "F10"; break; case kc_F11: return "F11"; break; case kc_F12: return "F12"; break; case kc_F13: return "F13"; break; case kc_F14: return "F14"; break; case kc_F15: return "F15"; break; case kc_num_lock: return "numlock"; break; case kc_caps_lock: return "capslock"; break; case kc_scroll_lock: return "scrolllock"; break; case kc_right_shift: return "right shift"; break; case kc_left_shift: return "left shift"; break; case kc_right_control: return "right control"; break; case kc_left_control: return "left control"; break; case kc_right_alt: return "right alt"; break; case kc_left_alt: return "left alt"; break; case kc_right_super: return "right super"; break; case kc_left_super: return "left super"; break; case kc_print_screen: return "print screen"; break; case kc_system: return "system"; break; case kc_break: return "break"; break; case kc_menu: return "menu"; break; case kc_back: return "back"; break; default: return "Unknown key"; } } // keyboard::get_name_of() /*----------------------------------------------------------------------------*/ /** * \brief Convert a key_code to a human-readable string translated with gettext. * \param k The key to convert. */ std::string bear::input::keyboard::get_translated_name_of( key_code k ) { return bear_gettext( get_name_of(k).c_str() ); } // keyboard::get_translated_name_of() /*----------------------------------------------------------------------------*/ /** * \brief Get a key_code from its human-readable name. * \param n The name of the code. */ bear::input::key_code bear::input::keyboard::get_key_named( const std::string& n ) { for (key_code i=kc_range_min; i<=kc_range_max; ++i) if ( get_name_of(i) == n ) return i; return kc_not_a_key; } // keyboard::get_key_named() /*----------------------------------------------------------------------------*/ /** * \brief Get an iterator on the first pressed key. */ bear::input::keyboard::const_iterator bear::input::keyboard::begin() const { return m_pressed_keys.begin(); } // keyboard::begin() /*----------------------------------------------------------------------------*/ /** * \brief Get an iterator after the last pressed key. */ bear::input::keyboard::const_iterator bear::input::keyboard::end() const { return m_pressed_keys.end(); } // keyboard::end() /*----------------------------------------------------------------------------*/ /** * \brief Returns the last events. */ const bear::input::keyboard::event_list& bear::input::keyboard::get_events() const { return m_key_events; } // keyboard::get_events() /*----------------------------------------------------------------------------*/ /** * \brief Tell if no keys are pressed. */ bool bear::input::keyboard::empty() const { return m_pressed_keys.empty(); } // keyboard::empty() /*----------------------------------------------------------------------------*/ /** * \brief Re-read the status of all keys. * \pre The caller is an instance of bear::input::system. */ void bear::input::keyboard::refresh() { refresh_events(); refresh_keys(); } // keyboard::refresh() /*----------------------------------------------------------------------------*/ /** * \brief Get all keyboard events. */ void bear::input::keyboard::refresh_events() { SDL_Event e; m_key_events.clear(); // The range of events to process. const SDL_EventType event_min( SDL_TEXTINPUT ); const SDL_EventType event_max( event_min ); while ( SDL_PeepEvents(&e, 1, SDL_GETEVENT, event_min, event_max ) == 1 ) { const SDL_TextInputEvent* const evt ( reinterpret_cast(&e) ); const charset::string_type text( charset::convert_string( evt->text ) ); for ( std::wstring::const_iterator it( text.begin() ); it != text.end(); ++it ) m_key_events.push_back ( key_event ( key_event::key_event_character, key_info::from_char( *it ) ) ); } } // keyboard::refresh_events() /*----------------------------------------------------------------------------*/ /** * \brief Refresh the state of the keys. */ void bear::input::keyboard::refresh_keys() { int num_codes; const Uint8* scan_codes( SDL_GetKeyboardState( &num_codes ) ); m_pressed_keys.clear(); for (unsigned int i=0; i!=(unsigned int)num_codes; ++i) if ( scan_codes[i] == 1 ) { const SDL_Keymod mod( SDL_GetModState() ); const key_code k ( sdl_key_to_local ( SDL_GetKeyFromScancode( static_cast(i) ), mod & KMOD_SHIFT, mod & KMOD_ALT) ); if ( (k != kc_not_a_key) && (k != kc_num_lock) && (k != kc_caps_lock) && (k != kc_scroll_lock) ) m_pressed_keys.push_back( k ); } } // keyboard::refresh_keys() /*----------------------------------------------------------------------------*/ /** * \brief Convert a SDLK_* value to the corresponding key_code. * \param sdl_val The SDL value to convert. * \param shift Tell if a shift button is considered pressed. * \param alt Tell if an alt button is considered pressed. */ bear::input::key_code bear::input::keyboard::sdl_key_to_local ( unsigned int sdl_val, bool shift, bool alt ) const { switch(sdl_val) { case SDLK_BACKSPACE : return kc_backspace; break; case SDLK_TAB : return kc_tab; break; case SDLK_CLEAR : return kc_new_page; break; case SDLK_RETURN : return kc_new_line; break; case SDLK_PAUSE : return kc_pause; break; case SDLK_ESCAPE : return kc_escape; break; case SDLK_SPACE : return kc_space; break; case SDLK_EXCLAIM : return kc_exclamation_mark; break; case SDLK_QUOTEDBL : return kc_double_quotes; break; case SDLK_HASH : return kc_hash; break; case SDLK_DOLLAR : return kc_dollar; break; case SDLK_AMPERSAND : return kc_ampersand; break; case SDLK_QUOTE : return kc_quote; break; case SDLK_LEFTPAREN : return kc_left_parenthesis; break; case SDLK_RIGHTPAREN : return kc_right_parenthesis; break; case SDLK_ASTERISK : return kc_asterisk; break; case SDLK_PLUS : return kc_plus; break; case SDLK_COMMA : return kc_comma; break; case SDLK_MINUS : return kc_minus; break; case SDLK_PERIOD : return kc_period; break; case SDLK_SLASH : return kc_slash; break; case SDLK_0 : return kc_0; break; case SDLK_1 : return kc_1; break; case SDLK_2 : return kc_2; break; case SDLK_3 : return kc_3; break; case SDLK_4 : return kc_4; break; case SDLK_5 : return kc_5; break; case SDLK_6 : return kc_6; break; case SDLK_7 : return kc_7; break; case SDLK_8 : return kc_8; break; case SDLK_9 : return kc_9; break; case SDLK_COLON : return kc_colon; break; case SDLK_SEMICOLON : return kc_semicolon; break; case SDLK_LESS : return kc_less; break; case SDLK_EQUALS : return kc_equal; break; case SDLK_GREATER : return kc_greater; break; case SDLK_QUESTION : return kc_question; break; case SDLK_AT : return kc_at; break; case SDLK_LEFTBRACKET : return kc_left_bracket; break; case SDLK_BACKSLASH : return kc_backslash; break; case SDLK_RIGHTBRACKET : return kc_right_bracket; break; case SDLK_CARET : return kc_caret; break; case SDLK_UNDERSCORE : return kc_underscore; break; case SDLK_BACKQUOTE : return kc_backquote; break; case SDLK_a : if (shift) return kc_A; else return kc_a; break; case SDLK_b : if (shift) return kc_B; else return kc_b; break; case SDLK_c : if (shift) return kc_C; else return kc_c; break; case SDLK_d : if (shift) return kc_D; else return kc_d; break; case SDLK_e : if (shift) return kc_E; else return kc_e; break; case SDLK_f : if (shift) return kc_F; else return kc_f; break; case SDLK_g : if (shift) return kc_G; else return kc_g; break; case SDLK_h : if (shift) return kc_H; else return kc_h; break; case SDLK_i : if (shift) return kc_I; else return kc_i; break; case SDLK_j : if (shift) return kc_J; else return kc_j; break; case SDLK_k : if (shift) return kc_K; else return kc_k; break; case SDLK_l : if (shift) return kc_L; else return kc_l; break; case SDLK_m : if (shift) return kc_M; else return kc_m; break; case SDLK_n : if (shift) return kc_N; else return kc_n; break; case SDLK_o : if (shift) return kc_O; else return kc_o; break; case SDLK_p : if (shift) return kc_P; else return kc_p; break; case SDLK_q : if (shift) return kc_Q; else return kc_q; break; case SDLK_r : if (shift) return kc_R; else return kc_r; break; case SDLK_s : if (shift) return kc_S; else return kc_s; break; case SDLK_t : if (shift) return kc_T; else return kc_t; break; case SDLK_u : if (shift) return kc_U; else return kc_u; break; case SDLK_v : if (shift) return kc_V; else return kc_v; break; case SDLK_w : if (shift) return kc_W; else return kc_w; break; case SDLK_x : if (shift) return kc_X; else return kc_x; break; case SDLK_y : if (shift) return kc_Y; else return kc_y; break; case SDLK_z : if (shift) return kc_Z; else return kc_z; break; case SDLK_DELETE : return kc_delete; break; case SDLK_KP_0 : return kc_keypad_0; break; case SDLK_KP_1 : return kc_keypad_1; break; case SDLK_KP_2 : return kc_keypad_2; break; case SDLK_KP_3 : return kc_keypad_3; break; case SDLK_KP_4 : return kc_keypad_4; break; case SDLK_KP_5 : return kc_keypad_5; break; case SDLK_KP_6 : return kc_keypad_6; break; case SDLK_KP_7 : return kc_keypad_7; break; case SDLK_KP_8 : return kc_keypad_8; break; case SDLK_KP_9 : return kc_keypad_9; break; case SDLK_KP_PERIOD : return kc_keypad_period; break; case SDLK_KP_DIVIDE : return kc_keypad_divide; break; case SDLK_KP_MULTIPLY : return kc_keypad_multiply; break; case SDLK_KP_MINUS : return kc_keypad_minus; break; case SDLK_KP_PLUS : return kc_keypad_plus; break; case SDLK_KP_ENTER : return kc_keypad_enter; break; case SDLK_KP_EQUALS : return kc_keypad_equals; break; case SDLK_UP : return kc_up; break; case SDLK_DOWN : return kc_down; break; case SDLK_RIGHT : return kc_right; break; case SDLK_LEFT : return kc_left; break; case SDLK_INSERT : return kc_insert; break; case SDLK_HOME : return kc_home; break; case SDLK_END : return kc_end; break; case SDLK_PAGEUP : return kc_page_up; break; case SDLK_PAGEDOWN : return kc_page_down; break; case SDLK_F1 : return kc_F1; break; case SDLK_F2 : return kc_F2; break; case SDLK_F3 : return kc_F3; break; case SDLK_F4 : return kc_F4; break; case SDLK_F5 : return kc_F5; break; case SDLK_F6 : return kc_F6; break; case SDLK_F7 : return kc_F7; break; case SDLK_F8 : return kc_F8; break; case SDLK_F9 : return kc_F9; break; case SDLK_F10 : return kc_F10; break; case SDLK_F11 : return kc_F11; break; case SDLK_F12 : return kc_F12; break; case SDLK_F13 : return kc_F13; break; case SDLK_F14 : return kc_F14; break; case SDLK_F15 : return kc_F15; break; case SDLK_NUMLOCKCLEAR : return kc_num_lock; break; case SDLK_CAPSLOCK : return kc_caps_lock; break; case SDLK_SCROLLLOCK : return kc_scroll_lock; break; case SDLK_RSHIFT : return kc_right_shift; break; case SDLK_LSHIFT : return kc_left_shift; break; case SDLK_RCTRL : return kc_right_control; break; case SDLK_LCTRL : return kc_left_control; break; case SDLK_RALT : return kc_right_alt; break; case SDLK_LALT : return kc_left_alt; break; case SDLK_LGUI : return kc_left_super; break; case SDLK_RGUI : return kc_right_super; break; case SDLK_PRINTSCREEN : return kc_print_screen; break; case SDLK_SYSREQ : return kc_system; break; case SDLK_MENU : return kc_menu; break; case SDLK_AC_BACK : return kc_back; break; default: return kc_not_a_key; } } // keyboard::sdl_key_to_local() plee-the-bear-20251226/bear-engine/core/src/input/code/keyboard_status.cpp000066400000000000000000000037531512343254000262530ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::input::keyboard_status class. * \author Julien Jorge */ #include "input/keyboard_status.hpp" #include "input/input_listener.hpp" #include "input/system.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Read the status of the keys. */ void bear::input::keyboard_status::read() { const keyboard& kb = system::get_instance().get_keyboard(); keyboard::const_iterator it; set_type current; for (it=kb.begin(); it!=kb.end(); ++it) current.insert(*it); m_released = m_pressed; m_released.join(m_maintained); m_released.difference(current); m_maintained.join(m_pressed).intersection(current); (m_pressed = current).difference(m_maintained); m_forget_key.difference( m_released ); m_events = kb.get_events(); } // keyboard_status::read() /*----------------------------------------------------------------------------*/ /** * \brief Send the status of the keys to an input_listener. * \param listener The listener to pass informations to. */ void bear::input::keyboard_status::scan_inputs( input_listener& listener ) const { set_type::const_iterator it; for (it=m_pressed.begin(); it!=m_pressed.end(); ++it) listener.key_pressed( key_info(*it) ); for (it=m_maintained.begin(); it!=m_maintained.end(); ++it) listener.key_maintained( key_info(*it) ); for (it=m_released.begin(); it!=m_released.end(); ++it) listener.key_released( key_info(*it) ); event_list::const_iterator itk; for ( itk=m_events.begin(); itk!=m_events.end(); ++itk ) switch( itk->get_type() ) { case key_event::key_event_character: listener.char_pressed( itk->get_info() ); break; default: { /* ignored */ } } } // keyboard_status::scan_inputs() plee-the-bear-20251226/bear-engine/core/src/input/code/mouse.cpp000066400000000000000000000161251512343254000241750ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::input::mouse class. * \author Julien Jorge */ #include "input/mouse.hpp" #include "bear_gettext.hpp" #include #include /*----------------------------------------------------------------------------*/ const bear::input::mouse::mouse_code bear::input::mouse::mc_left_button; const bear::input::mouse::mouse_code bear::input::mouse::mc_middle_button; const bear::input::mouse::mouse_code bear::input::mouse::mc_right_button; const bear::input::mouse::mouse_code bear::input::mouse::mc_wheel_up; const bear::input::mouse::mouse_code bear::input::mouse::mc_wheel_down; const bear::input::mouse::mouse_code bear::input::mouse::mc_invalid; const unsigned int bear::input::mouse::c_mouse_codes_count; /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ bear::input::mouse::mouse() : m_position( 0, 0 ) { } // mouse::mouse() /*----------------------------------------------------------------------------*/ /** * \brief Convert a mouse_code to a human-readable string. * \param k The code to convert. */ std::string bear::input::mouse::get_name_of( mouse_code b ) { switch (b) { case mc_left_button: return "left click"; break; case mc_middle_button: return "middle click"; break; case mc_right_button: return "right click"; break; case mc_wheel_up: return "wheel up"; break; case mc_wheel_down: return "wheel down"; break; default: { CLAW_FAIL( "Invalid mouse code given to mouse::get_name_of()" ); return "invalid mouse code"; } } } // mouse::get_name_of() /*----------------------------------------------------------------------------*/ /** * \brief Convert a mouse_code to a human-readable string translated with * gettext. * \param k The code to convert. */ std::string bear::input::mouse::get_translated_name_of( mouse_code b ) { return bear_gettext( get_name_of(b).c_str() ); } // mouse::get_translated_name_of() /*----------------------------------------------------------------------------*/ /** * \brief Get a mouse_code from its human-readable name. * \param n The name of the code. */ bear::input::mouse::mouse_code bear::input::mouse::get_button_named( const std::string& n ) { for (mouse_code i=mc_range_min; i<=mc_range_max; ++i) if ( get_name_of(i) == n ) return i; return mc_invalid; } // mouse::get_button_named() /*----------------------------------------------------------------------------*/ /** * \brief Get an iterator on the first pressed button. */ bear::input::mouse::const_iterator bear::input::mouse::begin() const { return m_current_state.begin(); } // mouse::begin() /*----------------------------------------------------------------------------*/ /** * \brief Get an iterator after the last pressed button. */ bear::input::mouse::const_iterator bear::input::mouse::end() const { return m_current_state.end(); } // mouse::end() /*----------------------------------------------------------------------------*/ /** * \brief Tell if no keys are pressed. */ bool bear::input::mouse::empty() const { return m_current_state.empty(); } // mouse::empty() void bear::input::mouse::set_display( const display_projection& display ) { m_display = display; } /*----------------------------------------------------------------------------*/ /** * \brief Get the position of the mouse. */ const claw::math::coordinate_2d& bear::input::mouse::get_position() const { return m_position; } // mouse::get_position() /*----------------------------------------------------------------------------*/ /** * \brief Re-read the status of all keys. * \pre The caller is an instance of bear::input::system. */ void bear::input::mouse::refresh() { update_position(); m_current_state.clear(); SDL_Event e; // The range of events to process. It includes button up and button down. const SDL_EventType event_min( SDL_MOUSEMOTION ); const SDL_EventType event_max( SDL_MOUSEWHEEL ); while ( SDL_PeepEvents(&e, 1, SDL_GETEVENT, event_min, event_max ) == 1 ) if ( e.type == SDL_MOUSEBUTTONDOWN ) process_button_down_event( reinterpret_cast(&e) ); else if ( e.type == SDL_MOUSEBUTTONUP ) process_button_up_event( reinterpret_cast(&e) ); else if ( e.type == SDL_MOUSEWHEEL ) process_wheel_event( reinterpret_cast(&e) ); m_current_state.insert( m_pressed_buttons.begin(), m_pressed_buttons.end() ); #ifdef __ANDROID__ m_current_state.clear(); #endif } // mouse::refresh() /*----------------------------------------------------------------------------*/ /** * \brief Adds a button in m_pressed_buttons in response to a mouse button down * event. * \param evt The event dispatched by the SDL. */ void bear::input::mouse::process_button_down_event( const SDL_MouseButtonEvent* evt ) { if ( evt->state == SDL_PRESSED ) m_pressed_buttons.insert( sdl_button_to_local( evt->button ) ); } // mouse::process_button_down_event() /*----------------------------------------------------------------------------*/ /** * \brief Adds a button in m_pressed_buttons in response to a mouse button up * event. * \param evt The event dispatched by the SDL. */ void bear::input::mouse::process_button_up_event( const SDL_MouseButtonEvent* evt ) { if ( evt->state == SDL_RELEASED ) m_pressed_buttons.erase( sdl_button_to_local( evt->button ) ); } // mouse::process_button_up_event() /*----------------------------------------------------------------------------*/ /** * \brief Adds a button in m_pressed_buttons in response to a mouse wheel event. * \param evt The event dispatched by the SDL. */ void bear::input::mouse::process_wheel_event( const SDL_MouseWheelEvent* evt ) { if ( evt->y > 0 ) m_current_state.insert( mc_wheel_up ); else m_current_state.insert( mc_wheel_down ); } // mouse::process_wheel_event() /*----------------------------------------------------------------------------*/ /** * \brief Update the position of the mouse. */ void bear::input::mouse::update_position() { int x, y; SDL_GetMouseState( &x, &y ); m_position = m_display.window_position_to_display( x, y ); } // mouse::update_position() /*----------------------------------------------------------------------------*/ /** * \brief Convert a SDLK_* value to the corresponding mouse_code. * \param sdl_val The SDL value to convert. * \param shift Tell if a shift button is considered pressed. * \param alt Tell if an alt button is considered pressed. */ bear::input::mouse::mouse_code bear::input::mouse::sdl_button_to_local ( unsigned int sdl_val ) const { switch(sdl_val) { case SDL_BUTTON_LEFT : return mc_left_button; break; case SDL_BUTTON_MIDDLE : return mc_middle_button; break; case SDL_BUTTON_RIGHT : return mc_right_button; break; default: return mc_invalid; } } // mouse::sdl_mouse_to_local() plee-the-bear-20251226/bear-engine/core/src/input/code/mouse_status.cpp000066400000000000000000000043061512343254000255760ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::input::mouse_status class. * \author Julien Jorge */ #include "input/mouse_status.hpp" #include "input/input_listener.hpp" #include "input/system.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ bear::input::mouse_status::mouse_status() : m_cursor_position_is_set(false) { } // mouse_status::mouse_status() /*----------------------------------------------------------------------------*/ /** * \brief Read the status of the keys. */ void bear::input::mouse_status::read() { const mouse& ms = system::get_instance().get_mouse(); mouse::const_iterator it; set_type current; for (it=ms.begin(); it!=ms.end(); ++it) current.insert(*it); m_released = m_pressed; m_released.join(m_maintained); m_released.difference(current); m_maintained.join(m_pressed).intersection(current); (m_pressed = current).difference(m_maintained); if ( m_cursor_position_is_set ) { m_previous_cursor_pos = m_cursor_pos; m_cursor_pos = ms.get_position(); } else { m_cursor_pos = ms.get_position(); m_previous_cursor_pos = m_cursor_pos; m_cursor_position_is_set = true; } } // mouse_status::read() /*----------------------------------------------------------------------------*/ /** * \brief Send the status of the keys to an input_listener. * \param listener The listener to pass informations to. */ void bear::input::mouse_status::scan_inputs( input_listener& listener ) const { set_type::const_iterator it; for (it=m_pressed.begin(); it!=m_pressed.end(); ++it) listener.mouse_pressed( *it, m_cursor_pos ); for (it=m_maintained.begin(); it!=m_maintained.end(); ++it) listener.mouse_maintained( *it, m_cursor_pos ); for (it=m_released.begin(); it!=m_released.end(); ++it) listener.mouse_released( *it, m_cursor_pos ); if ( m_cursor_pos != m_previous_cursor_pos ) listener.mouse_move( m_cursor_pos ); } // mouse_status::scan_inputs() plee-the-bear-20251226/bear-engine/core/src/input/code/system.cpp000066400000000000000000000117301512343254000243660ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::input::system class. * \author Julien Jorge */ #include "input/system.hpp" #include "input/finger.hpp" #include "input/joystick.hpp" #include "input/keyboard.hpp" #include "input/mouse.hpp" #include #include #include /*----------------------------------------------------------------------------*/ /** * \brief Global initializations. Must be called at the begining of your * program. */ void bear::input::system::initialize() { CLAW_PRECOND( SDL_WasInit(SDL_INIT_VIDEO) ); if ( SDL_InitSubSystem(SDL_INIT_JOYSTICK) != 0 ) throw claw::exception( SDL_GetError() ); #ifndef __ANDROID__ // Disable keyboard events on Android because SDL_TEXTINPUT makes the keyboard // visible. SDL_EventState( SDL_TEXTINPUT, SDL_ENABLE ); SDL_EventState( SDL_KEYDOWN, SDL_ENABLE ); #endif SDL_EventState( SDL_MOUSEBUTTONDOWN, SDL_ENABLE ); SDL_EventState( SDL_MOUSEBUTTONUP, SDL_ENABLE ); SDL_EventState( SDL_MOUSEWHEEL, SDL_ENABLE ); SDL_EventState( SDL_FINGERDOWN, SDL_ENABLE ); SDL_EventState( SDL_FINGERUP, SDL_ENABLE ); SDL_EventState( SDL_FINGERMOTION, SDL_ENABLE ); // force the creation of the instance get_instance().refresh(); } // system::initialize() /*----------------------------------------------------------------------------*/ /** * \brief Global uninitializations. Must be called at the end of your program. */ void bear::input::system::release() { system::get_instance().clear(); SDL_QuitSubSystem(SDL_INIT_JOYSTICK); } // system::release() /*----------------------------------------------------------------------------*/ /** * \brief Get the instance. */ bear::input::system& bear::input::system::get_instance() { return super::get_instance(); } // system::get_instance() /*----------------------------------------------------------------------------*/ /** * \brief Refresh the controllers. * \remark Actually this method refresh all bear::input::system instances. */ void bear::input::system::refresh() { SDL_PumpEvents(); refresh_alone(); } // system::refresh() void bear::input::system::set_display( const display_projection& display ) { m_mouse->set_display( display ); m_finger->set_display( display ); } /*----------------------------------------------------------------------------*/ /** * \brief Returns the instance of the bear::input::finger class. */ bear::input::finger& bear::input::system::get_finger() { return *m_finger; } // system::get_finger() /*----------------------------------------------------------------------------*/ /** * \brief Returns the instance of the bear::input::keyboard class. */ bear::input::keyboard& bear::input::system::get_keyboard() { return *m_keyboard; } // system::get_keyboard() /*----------------------------------------------------------------------------*/ /** * \brief Returns the instance of the bear::input::mouse class. */ bear::input::mouse& bear::input::system::get_mouse() { return *m_mouse; } // system::get_mouse() /*----------------------------------------------------------------------------*/ /** * \brief Returns the instance of the bear::input::joystick class for a given * joystick. * \param joy_id Joystick identifier. * \pre joy_id < bear::input::joystick::number_of_joysticks() */ bear::input::joystick& bear::input::system::get_joystick( unsigned int joy_id ) { CLAW_PRECOND( joy_id < joystick::number_of_joysticks() ); return *m_joystick[joy_id]; } // system::get_joystick() /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ bear::input::system::system() { m_keyboard = new keyboard; m_mouse = new mouse; for (unsigned int i=0; i!=joystick::number_of_joysticks(); ++i) m_joystick.push_back( new joystick(i) ); m_finger = new finger; } // system::system() /*----------------------------------------------------------------------------*/ /** * \brief Destructor. */ bear::input::system::~system() { clear(); } // system::~system() /*----------------------------------------------------------------------------*/ /** * \brief Refresh all controllers of this instance. */ void bear::input::system::refresh_alone() { m_keyboard->refresh(); m_mouse->refresh(); for (unsigned int i=0; i!=m_joystick.size(); ++i) m_joystick[i]->refresh(); m_finger->refresh(); } // system::refresh_alone() /*----------------------------------------------------------------------------*/ /** * \brief Close and delete the controllers. */ void bear::input::system::clear() { delete m_keyboard; m_keyboard = NULL; delete m_mouse; m_mouse = NULL; for (unsigned int i=0; i!=m_joystick.size(); ++i) delete m_joystick[i]; m_joystick.clear(); delete m_finger; m_finger = NULL; } // system::clear() plee-the-bear-20251226/bear-engine/core/src/input/controller_button.hpp000066400000000000000000000040421512343254000257110ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Informations on a pressed key. * \author Julien Jorge */ #ifndef __INPUT_CONTROLLER_BUTTON_HPP__ #define __INPUT_CONTROLLER_BUTTON_HPP__ #include "input/key_info.hpp" #include "input/joystick_button.hpp" #include "input/mouse.hpp" #include "input/class_export.hpp" namespace bear { namespace input { /** * \brief Informations on a pressed key. * \author Julien Jorge */ class INPUT_EXPORT controller_button { public: /** \brief The type of the controller for which the button is stored. */ enum controller_type { controller_keyboard, controller_joystick, controller_mouse, controller_not_set }; // enum controller_type public: controller_button(); controller_button( const key_info& key ); controller_button( const joystick_button& joy ); controller_button( mouse::mouse_code m ); controller_button& operator=( const key_info& key ); controller_button& operator=( const joystick_button& joy ); controller_button& operator=( mouse::mouse_code m ); controller_type get_type() const; const key_info& get_key_info() const; const joystick_button& get_joystick_button() const; mouse::mouse_code get_mouse_code() const; private: /** \brief The type of the controller for which the button is stored. */ controller_type m_type; /** \brief The keyboard key, when the button is a keyboard one. */ key_info m_keyboard; /** \brief The joystick button, when the button is a joystick one. */ joystick_button m_joystick; /** \brief The mouse button, when the button is a mouse one. */ mouse::mouse_code m_mouse; }; // class controller_button } // namespace input } // namespace bear #endif // __INPUT_CONTROLLER_BUTTON_HPP__ plee-the-bear-20251226/bear-engine/core/src/input/display_projection.hpp000066400000000000000000000017031512343254000260350ustar00rootroot00000000000000#pragma once #include namespace bear { namespace input { class display_projection { public: display_projection(); display_projection ( const claw::math::coordinate_2d< int >& window_size, const claw::math::coordinate_2d< int >& view_size, const claw::math::coordinate_2d< int >& viewport_size ); claw::math::coordinate_2d< unsigned int > window_position_to_display ( int x, int y ) const; claw::math::coordinate_2d< unsigned int > window_ratio_to_display ( double x, double y ) const; claw::math::coordinate_2d< int > window_offset_to_display ( double x, double y ) const; private: claw::math::coordinate_2d< int > transform( int x, int y ) const; private: claw::math::coordinate_2d< int > m_window_size; claw::math::coordinate_2d< int > m_view_size; claw::math::coordinate_2d< int > m_viewport_size; }; } } plee-the-bear-20251226/bear-engine/core/src/input/finger.hpp000066400000000000000000000024031512343254000234040ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A class representing a finger. * \author Julien Jorge */ #ifndef __INPUT_FINGER_HPP__ #define __INPUT_FINGER_HPP__ #include "input/display_projection.hpp" #include "input/finger_event.hpp" #include #include "input/class_export.hpp" namespace bear { namespace input { /** * \brief A class representing a finger. */ class INPUT_EXPORT finger { public: /** \brief The type of the lists of finger events. */ typedef std::vector event_list; public: void set_display( const display_projection& display ); const event_list& get_events() const; // only for input::system void refresh(); private: position_type convert_position( double x, double y ) const; position_type convert_delta( double x, double y ) const; private: display_projection m_display; /** \brief The events generated by the finger. */ event_list m_events; }; // class finger } // namespace input } // namespace bear #endif // __INPUT_FINGER_HPP__ plee-the-bear-20251226/bear-engine/core/src/input/finger_event.hpp000066400000000000000000000035531512343254000246140ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A class representing a finger finger event. * \author Julien Jorge */ #ifndef __INPUT_FINGER_EVENT_HPP__ #define __INPUT_FINGER_EVENT_HPP__ #include "input/types.hpp" #include "input/class_export.hpp" namespace bear { namespace input { /** * \brief A finger event. * \author Julien Jorge */ class INPUT_EXPORT finger_event { public: /** \brief Different types of events. */ enum event_type { finger_event_pressed, finger_event_released, finger_event_motion }; // enum event_type public: static finger_event create_pressed_event ( const position_type& p, int finger_id ); static finger_event create_released_event ( const position_type& p, int finger_id ); static finger_event create_motion_event ( const position_type& p, int finger_id, const position_type& d ); int get_finger_id() const; event_type get_type() const; const position_type& get_position() const; const position_type& get_distance() const; finger_event at_position( const position_type& p ) const; private: finger_event( event_type t, int finger_id ); private: /** \brief The type of the event. */ event_type m_type; /** \brief The identifier of the finger emitting this event. */ int m_finger_id; /** \brief The position where the event occurred. */ position_type m_position; /** \brief The distance of the motion. */ position_type m_distance; }; // class finger_event } // namespace input } // namespace bear #endif // __INPUT_FINGER_EVENT_HPP__ plee-the-bear-20251226/bear-engine/core/src/input/finger_status.hpp000066400000000000000000000020201512343254000250020ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A class observing the state of the finger. * \author Julien Jorge */ #ifndef __INPUT_FINGER_STATUS_HPP__ #define __INPUT_FINGER_STATUS_HPP__ #include "input/finger.hpp" #include "input/class_export.hpp" namespace bear { namespace input { class input_listener; /** * \brief A class observing the state of the finger. * \author Julien Jorge */ class INPUT_EXPORT finger_status { private: /** \brief The type of the event list of the finger. */ typedef finger::event_list event_list; public: void read(); void scan_inputs( input_listener& listener ) const; private: /** \brief The key events. */ event_list m_events; }; // finger_status } // namespace input } // namespace bear #endif // __INPUT_FINGER_STATUS_HPP__ plee-the-bear-20251226/bear-engine/core/src/input/input_listener.hpp000066400000000000000000000040551512343254000252030ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Base class for classes who want to be informed about the state of the * keyboard's keys or joysticks' buttons. * \author Julien Jorge */ #ifndef __INPUT_INPUT_LISTENER_HPP__ #define __INPUT_INPUT_LISTENER_HPP__ #include "input/joystick.hpp" #include "input/mouse.hpp" #include "input/class_export.hpp" namespace bear { namespace input { class key_info; class finger_event; /** * \brief Base class for classes who want to be informed about the state of * the keyboard's keys or joysticks' buttons. * \author Julien Jorge */ class INPUT_EXPORT input_listener { public: virtual ~input_listener(); virtual bool key_pressed( const key_info& key ); virtual bool key_released( const key_info& key ); virtual bool key_maintained( const key_info& key ); virtual bool char_pressed( const key_info& key ); virtual bool button_pressed ( joystick::joy_code button, unsigned int joy_index ); virtual bool button_released ( joystick::joy_code button, unsigned int joy_index ); virtual bool button_maintained ( joystick::joy_code button, unsigned int joy_index ); virtual bool mouse_pressed ( mouse::mouse_code button, const claw::math::coordinate_2d& pos ); virtual bool mouse_released ( mouse::mouse_code button, const claw::math::coordinate_2d& pos ); virtual bool mouse_maintained ( mouse::mouse_code button, const claw::math::coordinate_2d& pos ); virtual bool mouse_move( const claw::math::coordinate_2d& pos ); virtual bool finger_action( const finger_event& event ); }; // class input_listener } // namespace input } // namespace bear #endif // __INPUT_INPUT_LISTENER_HPP__ plee-the-bear-20251226/bear-engine/core/src/input/input_status.hpp000066400000000000000000000023631512343254000247010ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A class observing the state of keys/buttons. * \author Julien Jorge */ #ifndef __INPUT_INPUT_STATUS_HPP__ #define __INPUT_INPUT_STATUS_HPP__ #include "input/joystick_status.hpp" #include "input/keyboard_status.hpp" #include "input/mouse_status.hpp" #include "input/finger_status.hpp" #include "input/class_export.hpp" namespace bear { namespace input { /** * \brief A class observing the state of keys/buttons. * \author Julien Jorge */ class INPUT_EXPORT input_status { public: void read(); void scan_inputs( input_listener& listener ) const; private: /** \brief Status of the keyboard's keys. */ keyboard_status m_keyboard; /** \brief Status of the joysticks' buttons. */ joystick_status m_joystick; /** \brief Status of the mouse's keys. */ mouse_status m_mouse; /** \brief Status of the finger. */ finger_status m_finger; }; // input_status } // namespace input } // namespace bear #endif // __INPUT_INPUT_STATUS_HPP__ plee-the-bear-20251226/bear-engine/core/src/input/joy_codes.hpp000066400000000000000000000034451512343254000241170ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief This file contains all joystick button codes values and must not be * included anywhere but in the input/joystick.hpp file. * * Values are here only for readability, but are members of the input::joystick * class. */ static const joy_code jc_axis_up = 0; static const joy_code jc_axis_down = 1; static const joy_code jc_axis_left = 2; static const joy_code jc_axis_right = 3; static const joy_code jc_axis_up_left = 4; static const joy_code jc_axis_up_right = 5; static const joy_code jc_axis_down_left = 6; static const joy_code jc_axis_down_right = 7; static const joy_code jc_button_1 = 8; static const joy_code jc_button_2 = 9; static const joy_code jc_button_3 = 10; static const joy_code jc_button_4 = 11; static const joy_code jc_button_5 = 12; static const joy_code jc_button_6 = 13; static const joy_code jc_button_7 = 14; static const joy_code jc_button_8 = 15; static const joy_code jc_button_9 = 16; static const joy_code jc_button_10 = 17; static const joy_code jc_button_11 = 18; static const joy_code jc_button_12 = 19; static const joy_code jc_button_13 = 20; static const joy_code jc_button_14 = 21; static const joy_code jc_button_15 = 22; static const joy_code jc_button_16 = 23; /** * \brief Code representing an invalid code. * \remark Currently the same as c_key_codes_count. */ static const joy_code jc_invalid = 24; /** \brief Number of valid key codes. */ static const unsigned int c_number_of_buttons = 16; private: static const joy_code jc_range_min = jc_axis_up; static const joy_code jc_range_max = jc_button_16; plee-the-bear-20251226/bear-engine/core/src/input/joystick.hpp000066400000000000000000000035721512343254000240010ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A class representing a joystick. * \author Julien Jorge */ #ifndef __INPUT_JOYSTICK_HPP__ #define __INPUT_JOYSTICK_HPP__ #include #include #include #include #include #include "input/class_export.hpp" namespace bear { namespace input { /** * \brief A class representing a joystick. */ class INPUT_EXPORT joystick: public claw::pattern::non_copyable { public: /** \brief Code representing a button on the joystick. */ typedef unsigned int joy_code; /** \brief Iterator on the pressed buttons. */ typedef std::list::const_iterator const_iterator; public: static unsigned int number_of_joysticks(); joystick(unsigned int joy_id); ~joystick(); static std::string get_name_of( joy_code k ); static std::string get_translated_name_of( joy_code k ); static joy_code get_code_named( const std::string& n ); const_iterator begin() const; const_iterator end() const; bool empty() const; unsigned int get_id() const; // only for input::system void refresh(); private: joy_code get_pressed_axis() const; joy_code sdl_button_to_local( unsigned int sdl_val ) const; public: #include "input/joy_codes.hpp" private: /** \brief Pressed buttons. */ std::list m_pressed_buttons; /** \brief Identifier of the opened joystick. */ const unsigned int m_id; /** \brief SDL joystick. */ SDL_Joystick* m_joystick; }; // class joystick } // namespace input } // namespace bear #endif // __INPUT_JOYSTICK_HPP__ plee-the-bear-20251226/bear-engine/core/src/input/joystick_button.hpp000066400000000000000000000026671512343254000254000ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief This class stores a button of a joystick and the index of this * joystick. * \author Julien Jorge */ #ifndef __INPUT_JOYSTICK_BUTTON_HPP__ #define __INPUT_JOYSTICK_BUTTON_HPP__ #include "input/joystick.hpp" #include "input/class_export.hpp" namespace bear { namespace input { /** * \brief This class stores a button of a joystick and the index of this * joystick. * \author Julien Jorge */ class INPUT_EXPORT joystick_button { public: joystick_button(); joystick_button( unsigned int joy, input::joystick::joy_code b ); bool operator<( const joystick_button& that ) const; bool operator==( const joystick_button& that ) const; static std::string get_name_of( const joystick_button& j ); static std::string get_translated_name_of( const joystick_button& j ); static joystick_button get_button_named( const std::string& n ); public: /** \brief The index of the joystick containing the key. */ unsigned int joystick_index; /** \brief The code of the button. */ joystick::joy_code button; }; // class joystick_button } // namespace input } // namespace bear #endif // __INPUT_JOYSTICK_BUTTON_HPP__ plee-the-bear-20251226/bear-engine/core/src/input/joystick_status.hpp000066400000000000000000000026611512343254000254020ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A class observing the state of the joysticks' buttons. * \author Julien Jorge */ #ifndef __INPUT_JOYSTICK_STATUS_HPP__ #define __INPUT_JOYSTICK_STATUS_HPP__ #include "input/joystick_button.hpp" #include #include "input/class_export.hpp" namespace bear { namespace input { class input_listener; /** * \brief A class observing the state of the joysticks' buttons. * \author Julien Jorge */ class INPUT_EXPORT joystick_status { private: /** \brief The type of the set storing the keys. */ typedef claw::math::ordered_set set_type; public: void read(); void scan_inputs( input_listener& listener ) const; private: /** \brief The set of the keys that have just been pressed. */ set_type m_pressed; /** \brief The set of the keys that have just been released. */ set_type m_released; /** \brief The set of the keys that are actually pressed. */ set_type m_maintained; /** \brief Buttons that must not be taken into account. */ set_type m_forget_button; }; // joystick_status } // namespace input } // namespace bear #endif // __INPUT_JOYSTICK_STATUS_HPP__ plee-the-bear-20251226/bear-engine/core/src/input/key_codes.hpp000066400000000000000000000344001512343254000241010ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief This file contains all key codes values and must not be included * anywhere but in the input/keyboard.hpp file. * * Values are here only for readability, but are members of the input::keyboard * class. */ static const key_code kc_null = '\0'; static const key_code kc_start_heading = 1; static const key_code kc_start_text = 2; static const key_code kc_end_of_text = 3; static const key_code kc_end_of_transmission = 4; static const key_code kc_enquiry = 5; static const key_code kc_acknowledge = 6; static const key_code kc_bell = 7; static const key_code kc_backspace = 8; static const key_code kc_tab = '\t'; static const key_code kc_new_line = '\n'; static const key_code kc_vertical_tab = 11; static const key_code kc_new_page = 12; static const key_code kc_carriage_return = '\r'; static const key_code kc_shift_out = 14; static const key_code kc_shift_in = 15; static const key_code kc_data_link_escape = 16; static const key_code kc_device_control_1 = 17; static const key_code kc_device_control_2 = 18; static const key_code kc_pause = 19; static const key_code kc_device_control_4 = 20; static const key_code kc_negative_acknowledge = 21; static const key_code kc_synchronous_idle = 22; static const key_code kc_end_of_block = 23; static const key_code kc_cancel = 24; static const key_code kc_end_of_medium = 25; static const key_code kc_substitute = 26; static const key_code kc_escape = 27; static const key_code kc_file_separator = 28; static const key_code kc_group_separator = 29; static const key_code kc_record_separator = 30; static const key_code kc_unit_separator = 31; static const key_code kc_space = ' '; // 32 static const key_code kc_exclamation_mark = '!'; // 33 static const key_code kc_double_quotes = '"'; // 34 static const key_code kc_hash = '#'; // 35 static const key_code kc_dollar = '$'; // 36 static const key_code kc_percent = '%'; // 37 static const key_code kc_ampersand = '&'; // 38 static const key_code kc_quote = '\''; // 39 static const key_code kc_left_parenthesis = '('; // 40 static const key_code kc_right_parenthesis = ')'; // 41 static const key_code kc_asterisk = '*'; // 42 static const key_code kc_plus = '+'; // 43 static const key_code kc_comma = ','; // 44 static const key_code kc_minus = '-'; // 45 static const key_code kc_period = '.'; // 46 static const key_code kc_slash = '/'; // 47 static const key_code kc_0 = '0'; // 48 static const key_code kc_1 = '1'; // 49 static const key_code kc_2 = '2'; // 50 static const key_code kc_3 = '3'; // 51 static const key_code kc_4 = '4'; // 52 static const key_code kc_5 = '5'; // 53 static const key_code kc_6 = '6'; // 54 static const key_code kc_7 = '7'; // 55 static const key_code kc_8 = '8'; // 56 static const key_code kc_9 = '9'; // 57 static const key_code kc_colon = ':'; // 58 static const key_code kc_semicolon = ';'; // 59 static const key_code kc_less = '<'; // 60 static const key_code kc_equal = '='; // 61 static const key_code kc_greater = '>'; // 62 static const key_code kc_question = '?'; // 63 static const key_code kc_at = '@'; // 64 static const key_code kc_A = 'A'; // 65 static const key_code kc_B = 'B'; // 66 static const key_code kc_C = 'C'; // 67 static const key_code kc_D = 'D'; // 68 static const key_code kc_E = 'E'; // 69 static const key_code kc_F = 'F'; // 70 static const key_code kc_G = 'G'; // 71 static const key_code kc_H = 'H'; // 72 static const key_code kc_I = 'I'; // 73 static const key_code kc_J = 'J'; // 74 static const key_code kc_K = 'K'; // 75 static const key_code kc_L = 'L'; // 76 static const key_code kc_M = 'M'; // 77 static const key_code kc_N = 'N'; // 78 static const key_code kc_O = 'O'; // 79 static const key_code kc_P = 'P'; // 80 static const key_code kc_Q = 'Q'; // 81 static const key_code kc_R = 'R'; // 82 static const key_code kc_S = 'S'; // 83 static const key_code kc_T = 'T'; // 84 static const key_code kc_U = 'U'; // 85 static const key_code kc_V = 'V'; // 86 static const key_code kc_W = 'W'; // 87 static const key_code kc_X = 'X'; // 88 static const key_code kc_Y = 'Y'; // 89 static const key_code kc_Z = 'Z'; // 90 static const key_code kc_left_bracket = '['; // 91 static const key_code kc_backslash = '\\'; // 92 static const key_code kc_right_bracket = ']'; // 93 static const key_code kc_caret = '^'; // 94 static const key_code kc_underscore = '_'; // 95 static const key_code kc_backquote = '`'; // 96 static const key_code kc_a = 'a'; // 97 static const key_code kc_b = 'b'; // 98 static const key_code kc_c = 'c'; // 99 static const key_code kc_d = 'd'; // 100 static const key_code kc_e = 'e'; // 101 static const key_code kc_f = 'f'; // 102 static const key_code kc_g = 'g'; // 103 static const key_code kc_h = 'h'; // 104 static const key_code kc_i = 'i'; // 105 static const key_code kc_j = 'j'; // 106 static const key_code kc_k = 'k'; // 107 static const key_code kc_l = 'l'; // 108 static const key_code kc_m = 'm'; // 109 static const key_code kc_n = 'n'; // 110 static const key_code kc_o = 'o'; // 111 static const key_code kc_p = 'p'; // 112 static const key_code kc_q = 'q'; // 113 static const key_code kc_r = 'r'; // 114 static const key_code kc_s = 's'; // 115 static const key_code kc_t = 't'; // 116 static const key_code kc_u = 'u'; // 117 static const key_code kc_v = 'v'; // 118 static const key_code kc_w = 'w'; // 119 static const key_code kc_x = 'x'; // 120 static const key_code kc_y = 'y'; // 121 static const key_code kc_z = 'z'; // 122 static const key_code kc_left_brace = '{'; // 123 static const key_code kc_vertical_line = '|'; // 124 static const key_code kc_right_brace = '}'; // 125 static const key_code kc_tilde = '~'; // 126 static const key_code kc_delete = 127; // 127 // undefined until 256 static const key_code kc_128 = 128; // 128 static const key_code kc_129 = 129; // 129 static const key_code kc_130 = 130; // 130 static const key_code kc_131 = 131; // 131 static const key_code kc_132 = 132; // 132 static const key_code kc_133 = 133; // 133 static const key_code kc_134 = 134; // 134 static const key_code kc_135 = 135; // 135 static const key_code kc_136 = 136; // 136 static const key_code kc_137 = 137; // 137 static const key_code kc_138 = 138; // 138 static const key_code kc_139 = 139; // 139 static const key_code kc_140 = 140; // 140 static const key_code kc_141 = 141; // 141 static const key_code kc_142 = 142; // 142 static const key_code kc_143 = 143; // 143 static const key_code kc_144 = 144; // 144 static const key_code kc_145 = 145; // 145 static const key_code kc_146 = 146; // 146 static const key_code kc_147 = 147; // 147 static const key_code kc_148 = 148; // 148 static const key_code kc_149 = 149; // 149 static const key_code kc_150 = 150; // 150 static const key_code kc_151 = 151; // 151 static const key_code kc_152 = 152; // 152 static const key_code kc_153 = 153; // 153 static const key_code kc_154 = 154; // 154 static const key_code kc_155 = 155; // 155 static const key_code kc_156 = 156; // 156 static const key_code kc_157 = 157; // 157 static const key_code kc_158 = 158; // 158 static const key_code kc_159 = 159; // 159 static const key_code kc_160 = 160; // 160 static const key_code kc_161 = 161; // 161 static const key_code kc_162 = 162; // 162 static const key_code kc_163 = 163; // 163 static const key_code kc_164 = 164; // 164 static const key_code kc_165 = 165; // 165 static const key_code kc_166 = 166; // 166 static const key_code kc_167 = 167; // 167 static const key_code kc_168 = 168; // 168 static const key_code kc_169 = 169; // 169 static const key_code kc_170 = 170; // 170 static const key_code kc_171 = 171; // 171 static const key_code kc_172 = 172; // 172 static const key_code kc_173 = 173; // 173 static const key_code kc_174 = 174; // 174 static const key_code kc_175 = 175; // 175 static const key_code kc_176 = 176; // 176 static const key_code kc_177 = 177; // 177 static const key_code kc_178 = 178; // 178 static const key_code kc_179 = 179; // 179 static const key_code kc_180 = 180; // 180 static const key_code kc_181 = 181; // 181 static const key_code kc_182 = 182; // 182 static const key_code kc_183 = 183; // 183 static const key_code kc_184 = 184; // 184 static const key_code kc_185 = 185; // 185 static const key_code kc_186 = 186; // 186 static const key_code kc_187 = 187; // 187 static const key_code kc_188 = 188; // 188 static const key_code kc_189 = 189; // 189 static const key_code kc_190 = 190; // 190 static const key_code kc_191 = 191; // 191 static const key_code kc_192 = 192; // 192 static const key_code kc_193 = 193; // 193 static const key_code kc_194 = 194; // 194 static const key_code kc_195 = 195; // 195 static const key_code kc_196 = 196; // 196 static const key_code kc_197 = 197; // 197 static const key_code kc_198 = 198; // 198 static const key_code kc_199 = 199; // 199 static const key_code kc_200 = 200; // 200 static const key_code kc_201 = 201; // 201 static const key_code kc_202 = 202; // 202 static const key_code kc_203 = 203; // 203 static const key_code kc_204 = 204; // 204 static const key_code kc_205 = 205; // 205 static const key_code kc_206 = 206; // 206 static const key_code kc_207 = 207; // 207 static const key_code kc_208 = 208; // 208 static const key_code kc_209 = 209; // 209 static const key_code kc_210 = 210; // 210 static const key_code kc_211 = 211; // 211 static const key_code kc_212 = 212; // 212 static const key_code kc_213 = 213; // 213 static const key_code kc_214 = 214; // 214 static const key_code kc_215 = 215; // 215 static const key_code kc_216 = 216; // 216 static const key_code kc_217 = 217; // 217 static const key_code kc_218 = 218; // 218 static const key_code kc_219 = 219; // 219 static const key_code kc_220 = 220; // 220 static const key_code kc_221 = 221; // 221 static const key_code kc_222 = 222; // 222 static const key_code kc_223 = 223; // 223 static const key_code kc_224 = 224; // 224 static const key_code kc_225 = 225; // 225 static const key_code kc_226 = 226; // 226 static const key_code kc_227 = 227; // 227 static const key_code kc_228 = 228; // 228 static const key_code kc_229 = 229; // 229 static const key_code kc_230 = 230; // 230 static const key_code kc_231 = 231; // 231 static const key_code kc_232 = 232; // 232 static const key_code kc_233 = 233; // 233 static const key_code kc_234 = 234; // 234 static const key_code kc_235 = 235; // 235 static const key_code kc_236 = 236; // 236 static const key_code kc_237 = 237; // 237 static const key_code kc_238 = 238; // 238 static const key_code kc_239 = 239; // 239 static const key_code kc_240 = 240; // 240 static const key_code kc_241 = 241; // 241 static const key_code kc_242 = 242; // 242 static const key_code kc_243 = 243; // 243 static const key_code kc_244 = 244; // 244 static const key_code kc_245 = 245; // 245 static const key_code kc_246 = 246; // 246 static const key_code kc_247 = 247; // 247 static const key_code kc_248 = 248; // 248 static const key_code kc_249 = 249; // 249 static const key_code kc_250 = 250; // 250 static const key_code kc_251 = 251; // 251 static const key_code kc_252 = 252; // 252 static const key_code kc_253 = 253; // 253 static const key_code kc_254 = 254; // 254 static const key_code kc_255 = 255; // 255 static const key_code kc_keypad_0 = 256; static const key_code kc_keypad_1 = 257; static const key_code kc_keypad_2 = 258; static const key_code kc_keypad_3 = 259; static const key_code kc_keypad_4 = 260; static const key_code kc_keypad_5 = 261; static const key_code kc_keypad_6 = 262; static const key_code kc_keypad_7 = 263; static const key_code kc_keypad_8 = 264; static const key_code kc_keypad_9 = 265; static const key_code kc_keypad_period = 266; static const key_code kc_keypad_divide = 267; static const key_code kc_keypad_multiply = 268; static const key_code kc_keypad_minus = 269; static const key_code kc_keypad_plus = 270; static const key_code kc_keypad_enter = 271; static const key_code kc_keypad_equals = 272; static const key_code kc_up = 273; static const key_code kc_down = 274; static const key_code kc_right = 275; static const key_code kc_left = 276; static const key_code kc_insert = 277; static const key_code kc_home = 278; static const key_code kc_end = 279; static const key_code kc_page_up = 280; static const key_code kc_page_down = 281; static const key_code kc_F1 = 282; static const key_code kc_F2 = 283; static const key_code kc_F3 = 284; static const key_code kc_F4 = 285; static const key_code kc_F5 = 286; static const key_code kc_F6 = 287; static const key_code kc_F7 = 288; static const key_code kc_F8 = 289; static const key_code kc_F9 = 290; static const key_code kc_F10 = 291; static const key_code kc_F11 = 292; static const key_code kc_F12 = 293; static const key_code kc_F13 = 294; static const key_code kc_F14 = 295; static const key_code kc_F15 = 296; static const key_code kc_num_lock = 297; static const key_code kc_caps_lock = 298; static const key_code kc_scroll_lock = 299; static const key_code kc_right_shift = 300; static const key_code kc_left_shift = 301; static const key_code kc_right_control = 302; static const key_code kc_left_control = 303; static const key_code kc_right_alt = 304; static const key_code kc_left_alt = 305; static const key_code kc_right_super = 306; static const key_code kc_left_super = 307; static const key_code kc_print_screen = 308; static const key_code kc_system = 309; static const key_code kc_break = 310; static const key_code kc_menu = 311; static const key_code kc_back = 312; /** * \brief Code representing an invalid code. * \remark Currently the same as c_key_codes_count. */ static const key_code kc_not_a_key = 313; /** \brief Number of valid key codes. */ static const unsigned int c_key_codes_count = 313; private: static const key_code kc_range_min = kc_null; static const key_code kc_range_max = kc_back; plee-the-bear-20251226/bear-engine/core/src/input/key_event.hpp000066400000000000000000000023211512343254000241220ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A class representing a keyboard key event. * \author Julien Jorge */ #ifndef __INPUT_KEY_EVENT_HPP__ #define __INPUT_KEY_EVENT_HPP__ #include "input/key_info.hpp" namespace bear { namespace input { /** * \brief A key event. * \author Julien Jorge */ class INPUT_EXPORT key_event { public: /** \brief Different types of events. */ enum event_type { key_event_pressed, key_event_released, key_event_maintained, key_event_character, key_event_unknown }; // enum event_type public: key_event( event_type t, const key_info& info ); event_type get_type() const; const key_info& get_info() const; private: /** \brief The type of the event. */ event_type m_type; /** \brief Some informations about the concerned key. */ key_info m_info; }; // class key_event } // namespace input } // namespace bear #endif // __INPUT_KEY_EVENT_HPP__ plee-the-bear-20251226/bear-engine/core/src/input/key_info.hpp000066400000000000000000000034411512343254000237400ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Informations on a pressed key. * \author Julien Jorge */ #ifndef __INPUT_KEY_INFO_HPP__ #define __INPUT_KEY_INFO_HPP__ #include "charset/def.hpp" #include "input/class_export.hpp" namespace bear { namespace input { /** \brief Code representing a key on the keyboard. */ typedef unsigned int key_code; /** * \brief A keyboard entry, by the user. * \author Julien Jorge */ class INPUT_EXPORT key_info { public: key_info(); explicit key_info( key_code c ); key_info( key_code c, charset::char_type s ); static key_info from_char( charset::char_type s ); bool operator==( const key_info& that ) const; bool operator<( const key_info& that ) const; key_code get_code() const; charset::char_type get_symbol() const; bool is_escape() const; bool is_enter() const; bool is_tab() const; bool is_control() const; bool is_shift() const; bool is_alt() const; bool is_up() const; bool is_down() const; bool is_left() const; bool is_right() const; bool is_home() const; bool is_end() const; bool is_delete() const; bool is_backspace() const; bool is_back() const; bool is_function(unsigned int f) const; bool is_printable() const; private: /** \brief A code representing the keyboard key. */ key_code m_code; /** \brief The translated symbol. */ charset::char_type m_symbol; }; // class key_info } // namespace input } // namespace bear #endif // __INPUT_KEY_INFO_HPP__ plee-the-bear-20251226/bear-engine/core/src/input/keyboard.hpp000066400000000000000000000033271512343254000237400ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A class representing a keyboard. * \author Julien Jorge */ #ifndef __INPUT_KEYBOARD_HPP__ #define __INPUT_KEYBOARD_HPP__ #include #include #include #include "charset/def.hpp" #include "input/key_event.hpp" #include "input/class_export.hpp" namespace bear { namespace input { /** * \brief A class representing a keyboard. */ class INPUT_EXPORT keyboard { public: /** \brief Iterator on the pressed keys. */ typedef std::list::const_iterator const_iterator; /** \brief The type of the list of the key events. */ typedef std::list event_list; public: static std::string get_name_of( key_code k ); static std::string get_translated_name_of( key_code k ); static key_code get_key_named( const std::string& n ); const_iterator begin() const; const_iterator end() const; const event_list& get_events() const; bool empty() const; // only for input::system void refresh(); private: void refresh_events(); void refresh_keys(); key_code sdl_key_to_local( unsigned int sdl_val, bool shift, bool alt ) const; public: #include "input/key_codes.hpp" private: /** \brief Pressed keys. */ std::list m_pressed_keys; /** \brief Pressed keys. */ event_list m_key_events; }; // class keyboard } // namespace input } // namespace bear #endif // __INPUT_KEYBOARD_HPP__ plee-the-bear-20251226/bear-engine/core/src/input/keyboard_status.hpp000066400000000000000000000031151512343254000253360ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A class observing the state of the keyboard's buttons. * \author Julien Jorge */ #ifndef __INPUT_KEYBOARD_STATUS_HPP__ #define __INPUT_KEYBOARD_STATUS_HPP__ #include "input/keyboard.hpp" #include #include "input/class_export.hpp" namespace bear { namespace input { class input_listener; /** * \brief A class observing the state of the keyboard's buttons. * \author Julien Jorge */ class INPUT_EXPORT keyboard_status { private: /** \brief The type of the set storing the keys. */ typedef claw::math::ordered_set set_type; /** \brief The type of the event list of the keyboard. */ typedef keyboard::event_list event_list; public: void read(); void scan_inputs( input_listener& listener ) const; private: /** \brief The set of the keys that have just been pressed. */ set_type m_pressed; /** \brief The set of the keys that have just been released. */ set_type m_released; /** \brief The set of the keys that are actually pressed. */ set_type m_maintained; /** \brief Keys that must not be taken into account. */ set_type m_forget_key; /** \brief The key events. */ event_list m_events; }; // keyboard_status } // namespace input } // namespace bear #endif // __INPUT_KEYBOARD_STATUS_HPP__ plee-the-bear-20251226/bear-engine/core/src/input/mouse.hpp000066400000000000000000000043331512343254000232660ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A class representing a mouse. * \author Julien Jorge */ #ifndef __INPUT_MOUSE_HPP__ #define __INPUT_MOUSE_HPP__ #include "input/class_export.hpp" #include "input/display_projection.hpp" #include #include #include #include #include namespace bear { namespace input { /** * \brief A class representing a mouse. */ class INPUT_EXPORT mouse { public: /** \brief Code representing a button on the mouse. */ typedef unsigned char mouse_code; /** \brief Iterator on the pressed buttons. */ typedef std::unordered_set::const_iterator const_iterator; public: mouse(); static std::string get_name_of( mouse_code b ); static std::string get_translated_name_of( mouse_code b ); static mouse_code get_button_named( const std::string& n ); const_iterator begin() const; const_iterator end() const; bool empty() const; void set_display( const display_projection& display ); const claw::math::coordinate_2d& get_position() const; // only for input::system void refresh(); public: #include "input/mouse_codes.hpp" private: void process_button_down_event( const SDL_MouseButtonEvent* evt ); void process_button_up_event( const SDL_MouseButtonEvent* evt ); void process_wheel_event( const SDL_MouseWheelEvent* evt ); void update_position(); mouse_code sdl_button_to_local( unsigned int sdl_val ) const; private: display_projection m_display; /** \brief The last result of refresh(). */ std::unordered_set m_current_state; /** \brief Pressed buttons, does not include the wheel. */ std::unordered_set m_pressed_buttons; /** \brief Position of the cursor. */ claw::math::coordinate_2d m_position; }; // class mouse } // namespace input } // namespace bear #endif // __INPUT_MOUSE_HPP__ plee-the-bear-20251226/bear-engine/core/src/input/mouse_codes.hpp000066400000000000000000000020301512343254000244330ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief This file contains all mouse button codes values and must not be * included anywhere but in the input/mouse.hpp file. * * Values are here only for readability, but are members of the input::mouse * class. */ static const mouse_code mc_left_button = 0; static const mouse_code mc_middle_button = 1; static const mouse_code mc_right_button = 2; static const mouse_code mc_wheel_up = 3; static const mouse_code mc_wheel_down = 4; /** * \brief Code representing an invalid code. * \remark Currently the same as c_mouse_codes_count. */ static const mouse_code mc_invalid = 5; /** \brief Number of valid key codes. */ static const unsigned int c_mouse_codes_count = 5; private: static const mouse_code mc_range_min = mc_left_button; static const mouse_code mc_range_max = mc_wheel_down; plee-the-bear-20251226/bear-engine/core/src/input/mouse_status.hpp000066400000000000000000000032311512343254000246650ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A class observing the state of the mouses' buttons. * \author Julien Jorge */ #ifndef __INPUT_MOUSE_STATUS_HPP__ #define __INPUT_MOUSE_STATUS_HPP__ #include "input/mouse.hpp" #include "input/class_export.hpp" #include namespace bear { namespace input { class input_listener; /** * \brief A class observing the state of the mouse's buttons. * \author Julien Jorge */ class INPUT_EXPORT mouse_status { private: /** \brief The type of the set storing the keys. */ typedef claw::math::ordered_set set_type; public: mouse_status(); void read(); void scan_inputs( input_listener& listener ) const; private: /** \brief The set of the keys that have just been pressed. */ set_type m_pressed; /** \brief The set of the keys that have just been released. */ set_type m_released; /** \brief The set of the keys that are actually pressed. */ set_type m_maintained; /** \brief The position of the cursor. */ claw::math::coordinate_2d m_cursor_pos; /** \brief Previous position of the cursor. */ claw::math::coordinate_2d m_previous_cursor_pos; /** \brief Tells if we did store a value in m_cursor_pos. */ bool m_cursor_position_is_set; }; // mouse_status } // namespace input } // namespace bear #endif // __INPUT_MOUSE_STATUS_HPP__ plee-the-bear-20251226/bear-engine/core/src/input/system.hpp000066400000000000000000000037031512343254000234620ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A class containing initialization and releasing methods for using the * classes of the namespace input. * \author Julien Jorge */ #ifndef __INPUT_SYSTEM_HPP__ #define __INPUT_SYSTEM_HPP__ #include #include #include "input/class_export.hpp" namespace bear { namespace input { class display_projection; class finger; class joystick; class keyboard; class mouse; /** * \brief A class containing initialization and releasing methods for using * the classes of the namespace input. */ class INPUT_EXPORT system: public claw::pattern::basic_singleton { // need an access to the constructor/destructor. friend class claw::pattern::basic_singleton; typedef claw::pattern::basic_singleton super; public: static void initialize(); static void release(); // Must be redefined to work correctly with dynamic libraries. // At least under Windows with MinGW. static system& get_instance(); void refresh(); void set_display( const display_projection& display ); finger& get_finger(); keyboard& get_keyboard(); mouse& get_mouse(); joystick& get_joystick( unsigned int joy_id ); private: system(); ~system(); void refresh_alone(); void clear(); private: /** \brief The keyboard. */ keyboard* m_keyboard; /** \brief The mouse. */ mouse* m_mouse; /** \brief The joysticks. */ std::vector m_joystick; /** \brief The finger. */ finger* m_finger; }; // class system } // namespace input } // namespace bear #endif // __INPUT_SYSTEM_HPP__ plee-the-bear-20251226/bear-engine/core/src/input/types.hpp000066400000000000000000000013241512343254000232770ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Data types for the input:: namespace. * \author Julien Jorge */ #ifndef __INPUT_TYPES_HPP__ #define __INPUT_TYPES_HPP__ #include namespace bear { namespace input { /** \brief The type of a coordinate. */ typedef int coordinate_type; /** \brief The type of the vectors used for representing coordinates. */ typedef claw::math::coordinate_2d position_type; } // namespace input } // namespace bear #endif // __INPUT_TYPES_HPP__ plee-the-bear-20251226/bear-engine/core/src/net/000077500000000000000000000000001512343254000210515ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/core/src/net/CMakeLists.txt000066400000000000000000000014671512343254000236210ustar00rootroot00000000000000set( NET_TARGET_NAME bear_net ) #------------------------------------------------------------------------------- set( NET_SOURCE_FILES code/client.cpp code/connection_task.cpp code/server.cpp message/code/message.cpp message_listener/code/base_message_listener.cpp message_listener/code/message_listener.cpp message_listener/code/message_listener_group.cpp ) add_library( ${NET_TARGET_NAME} ${BEAR_ENGINE_CORE_LINK_TYPE} ${NET_SOURCE_FILES} ) set_target_properties( ${NET_TARGET_NAME} PROPERTIES INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/${BEAR_ENGINE_INSTALL_LIBRARY_DIR}" ) install( TARGETS ${NET_TARGET_NAME} DESTINATION ${BEAR_ENGINE_INSTALL_LIBRARY_DIR} ) target_link_libraries( ${NET_TARGET_NAME} ${CLAW_NET_LIBRARIES} ${Boost_THREAD_LIBRARY} ${Boost_SYSTEM_LIBRARY} ) plee-the-bear-20251226/bear-engine/core/src/net/class_export.hpp000066400000000000000000000013731512343254000242740ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Definition of the NET_EXPORT macro according to the fact that we * create the library or link to it. * \author Julien Jorge */ #ifndef __NET_CLASS_EXPORT_HPP__ #define __NET_CLASS_EXPORT_HPP__ #ifndef NET_EXPORT # ifdef _WIN32 # ifdef bear_net_EXPORTS # define NET_EXPORT __declspec(dllexport) # else # define NET_EXPORT __declspec(dllimport) # endif // def bear_net_EXPORTS # else // def _WIN32 # define NET_EXPORT # endif // def _WIN32 #endif // ndef NET_EXPORT #endif // __NET_CLASS_EXPORT_HPP__ plee-the-bear-20251226/bear-engine/core/src/net/client.hpp000066400000000000000000000045111512343254000230410ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A client is an object that can connect to a server to receive its * messages. * \author Julien Jorge */ #ifndef __NET_CLIENT_HPP__ #define __NET_CLIENT_HPP__ #include "net/class_export.hpp" #include "net/connection_status.hpp" #include "net/message/message.hpp" #include "net/message_factory.hpp" #include #include #include #include #include #include namespace bear { namespace net { typedef claw::memory::smart_ptr message_handle; class connection_thread; /** * \brief A client is an object that can connect to a server to receive its * messages. * \author Julien Jorge */ class NET_EXPORT client: private claw::pattern::non_copyable { friend class connection_thread; public: client ( const std::string& host, unsigned int port, const message_factory& f, int read_time_limit = 0 ); ~client(); connection_status get_status() const; message_handle pull_message(); private: void connect(); void set_stream( claw::net::socket_stream* stream ); private: /** \brief The host to which we connect. */ const std::string m_host; /** \brief The port through which we connect. */ const unsigned int m_port; /** \brief How long do we wait when nothing comes while reading the stream. */ const int m_read_time_limit; /** \brief This is the socket from which the messages are read. */ claw::net::socket_stream* m_stream; /** \brief The factory to use to instantiate the received messages. */ const message_factory& m_message_factory; /** \brief The thread currently trying to create the connection. */ boost::thread* m_connection; /** \brief This mutex is used to avoid accessing the m_stream and changing it at the same time. */ mutable boost::mutex m_stream_mutex; }; // class client } // namespace net } // namespace bear #endif // __NET_CLIENT_HPP__ plee-the-bear-20251226/bear-engine/core/src/net/code/000077500000000000000000000000001512343254000217635ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/core/src/net/code/client.cpp000066400000000000000000000065711512343254000237560ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::net::client class. * \author Julien Jorge */ #include "net/client.hpp" #include "net/connection_task.hpp" #include "net/message/message.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param host The host to which this client is connected. * \param port The port to which this client is connected. * \param f The factory to use to instantiate the received messages. The * instance must live longer than this. * \param read_time_limit How long do we wait when nothing comes. */ bear::net::client::client ( const std::string& host, unsigned int port, const message_factory& f, int read_time_limit ) : m_host(host), m_port(port), m_read_time_limit(read_time_limit), m_stream(NULL), m_message_factory(f), m_connection(NULL) { connect(); } // client::client() /*----------------------------------------------------------------------------*/ /** * \brief Destructor. */ bear::net::client::~client() { boost::mutex::scoped_lock lock(m_stream_mutex); delete m_connection; delete m_stream; } // client::client() /*----------------------------------------------------------------------------*/ /** * \brief Get the status of the connection. */ bear::net::connection_status bear::net::client::get_status() const { boost::mutex::scoped_lock lock(m_stream_mutex); if ( m_stream != NULL ) { if ( m_stream->is_open() ) return connection_status_connected; else return connection_status_disconnected; } else if ( m_connection == NULL ) return connection_status_disconnected; else return connection_status_connecting; } // client::get_status() /*----------------------------------------------------------------------------*/ /** * \brief Get the oldest message message received by this client and still not * retrieved. */ bear::net::message_handle bear::net::client::pull_message() { if ( get_status() == connection_status_disconnected ) connect(); if ( get_status() != connection_status_connected ) return NULL; std::string message_name; message* result = NULL; m_stream->clear(); while ( (result == NULL) && std::getline(*m_stream, message_name) ) if ( !message_name.empty() ) { result = m_message_factory.create(message_name); *m_stream >> *result; } return result; } // client::pull_message() /*----------------------------------------------------------------------------*/ /** * \brief Initialize the connection. */ void bear::net::client::connect() { const connection_task connection ( boost::bind( &client::set_stream, this, _1 ), m_host, m_port, m_read_time_limit ); //m_connection = new boost::thread(connection); connection(); } // client::connect() /*----------------------------------------------------------------------------*/ /** * \brief Set the stream used by this client. * \param stream The stream. */ void bear::net::client::set_stream( claw::net::socket_stream* stream ) { boost::mutex::scoped_lock lock(m_stream_mutex); delete m_stream; m_stream = stream; delete m_connection; m_connection = NULL; } // client::set_stream() plee-the-bear-20251226/bear-engine/core/src/net/code/connection_task.cpp000066400000000000000000000027121512343254000256520ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::net::connection_task class. * \author Julien Jorge */ #include "net/connection_task.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param f The function to which the resulting stream is passed when ready. * \param host The host to which this connection_task is connected. * \param port The port to which this connection_task is connected. * \param read_time_limit How long do we wait when nothing comes. */ bear::net::connection_task::connection_task ( callback_type f, const std::string& host, unsigned int port, int read_time_limit ) : m_callback(f), m_host(host), m_port(port), m_read_time_limit(read_time_limit) { } // connection_task::connection_task() /*----------------------------------------------------------------------------*/ /** * \brief Start the connection and pass the result to the callback. */ void bear::net::connection_task::operator()() const { claw::net::socket_stream* result = new claw::net::socket_stream(m_host.c_str(), m_port); /*bool stop = false; while ( !stop && !result->is_open() );*/ result->set_read_time_limit(m_read_time_limit); m_callback(result); } // connection_task::operator()() plee-the-bear-20251226/bear-engine/core/src/net/code/server.cpp000066400000000000000000000055211512343254000240000ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::net::server class. * \author Julien Jorge */ #include "net/server.hpp" #include "net/message/message.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param port The port on which the server listens. * \param client_read_time_limit How long do we wait when asking a client for * its content. */ bear::net::server::server( unsigned int port, int client_read_time_limit ) : m_server(port), m_client_read_time_limit(client_read_time_limit) { } // server::server() /*----------------------------------------------------------------------------*/ /** * \brief Destructor. */ bear::net::server::~server() { for ( client_list::const_iterator it=m_clients.begin(); it!=m_clients.end(); ++it ) delete *it; } // server::~server() /*----------------------------------------------------------------------------*/ /** * \brief Get the number of connections to which this server sends the messages. */ std::size_t bear::net::server::get_connection_count() const { return m_clients.size(); } // server::get_connection_count() /*----------------------------------------------------------------------------*/ /** * \brief Dispatch a message to the clients. * \param m The message to dispatch. */ void bear::net::server::dispatch_message( const message& m ) { for ( std::size_t i=0; i!=get_connection_count(); ++i ) send_message( i, m ); } // server::dispatch_message() /*----------------------------------------------------------------------------*/ /** * \brief Send a message to one client. * \param client_id The identifier of the client to which the message is sent. * \param m The message to send. */ void bear::net::server::send_message( std::size_t client_id, const message& m ) { CLAW_PRECOND( client_id < m_clients.size() ); client_list::const_iterator it=m_clients.begin(); std::advance(it, client_id); client_type& client = **it; client << m.get_name() << '\n' << m << std::endl; } // server::send_message() /*----------------------------------------------------------------------------*/ /** * \brief Update the list of alive clients. */ void bear::net::server::check_for_new_clients() { bool check_client = true; while (check_client) { client_pointer c = new client_type(m_client_read_time_limit); m_server.accept( *c, 0 ); if ( c->is_open() ) { m_clients.push_back(c); on_new_client(m_clients.size() - 1); } else { delete c; check_client = false; } } } // server::check_for_new_clients() plee-the-bear-20251226/bear-engine/core/src/net/connection_status.hpp000066400000000000000000000020741512343254000253270ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief The connection_status enum list the various states in which a * connection can be. * \author Julien Jorge */ #ifndef __NET_CONNECTION_STATUS_HPP__ #define __NET_CONNECTION_STATUS_HPP__ namespace bear { namespace net { /** * \brief The connection_status enum list the various states in which a * connection can be. * \author Julien Jorge */ enum connection_status { /** \brief The connection is on its way, you should wait. */ connection_status_connecting, /** \brief The connection is ready, you can use it. */ connection_status_connected, /** \brief There is no connection, you should create one. */ connection_status_disconnected }; // enum connection_status } // namespace net } // namespace bear #endif // __NET_CONNECTION_STATUS_HPP__ plee-the-bear-20251226/bear-engine/core/src/net/connection_task.hpp000066400000000000000000000032521512343254000247450ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief The connection_task starts a connection with a server and pass the * resulting socket to a given client. * \author Julien Jorge */ #ifndef __NET_CONNECTION_TASK_HPP__ #define __NET_CONNECTION_TASK_HPP__ #include "net/class_export.hpp" #include #include #include namespace bear { namespace net { class client; /** * \brief The connection_task starts a connection with a server and pass * the resulting socket to a given client. * \author Julien Jorge */ class NET_EXPORT connection_task { public: /** \brief The type of the function called when the stream is ready. */ typedef boost::function callback_type; public: connection_task ( callback_type f, const std::string& host, unsigned int port, int read_time_limit ); void operator()() const; private: /** \brief The function called when the stream is ready. */ callback_type m_callback; /** \brief The host to which we connect. */ const std::string m_host; /** \brief The port through which we connect. */ const unsigned int m_port; /** \brief How long do we wait when nothing comes while reading the stream. */ const int m_read_time_limit; }; // class connection_task } // namespace net } // namespace bear #endif // __NET_CONNECTION_TASK_HPP__ plee-the-bear-20251226/bear-engine/core/src/net/message/000077500000000000000000000000001512343254000224755ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/core/src/net/message/code/000077500000000000000000000000001512343254000234075ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/core/src/net/message/code/message.cpp000066400000000000000000000054151512343254000255440ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::net::message class. * \author Julien Jorge */ #include "net/message/message.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Print a formatted message in a stream. * \param The stream in which the message is written. * \param mThe message to write. */ std::ostream& operator<<( std::ostream& os, const bear::net::message& m ) { return m.formatted_output(os); } // operator<<() /*----------------------------------------------------------------------------*/ /** * \brief Read a formatted message from a stream. * \param is The stream from which the message is read. * \param m (out) The message read from the stream. */ std::istream& operator>>( std::istream& is, bear::net::message& m ) { return m.formatted_input(is); } // operator>>() /*----------------------------------------------------------------------------*/ /** * Constructor. */ bear::net::message::message() : m_date(0) { // nothing to do } // message::message() /*----------------------------------------------------------------------------*/ /** * Destructor. */ bear::net::message::~message() { // nothing to do } // message::~message() /*----------------------------------------------------------------------------*/ /** * Get the name of this kind of messages. */ std::string bear::net::message::get_name() const { return do_get_name(); } // message::get_name() /*----------------------------------------------------------------------------*/ /** * Get the date at which the message must be processed. */ std::size_t bear::net::message::get_date() const { return m_date; } // message::get_date() /*----------------------------------------------------------------------------*/ /** * Set the date at which the message must be processed. * \param date The date */ void bear::net::message::set_date( std::size_t date ) { m_date = date; } // message::set_date() /*----------------------------------------------------------------------------*/ /** * \brief Write a formatted representation of this message in a stream. * \param os The stream in which we write. */ std::ostream& bear::net::message::formatted_output( std::ostream& os ) const { return os; } // message::formatted_output() /*----------------------------------------------------------------------------*/ /** * \brief Read a formatted representation of this message from a stream. * \param os The stream from which we read. */ std::istream& bear::net::message::formatted_input( std::istream& is ) { return is; } // message::formatted_input() plee-the-bear-20251226/bear-engine/core/src/net/message/message.hpp000066400000000000000000000033241512343254000246340ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief The message objects carry some data to be exchanged between the * servers and the clients. * \author Julien Jorge */ #ifndef __NET_MESSAGE_HPP__ #define __NET_MESSAGE_HPP__ #include "net/class_export.hpp" #include #include namespace bear { namespace net { class message; } // namespace net } // namespace bear NET_EXPORT std::ostream& operator<< ( std::ostream& os, const bear::net::message& m ); NET_EXPORT std::istream& operator>>( std::istream& is, bear::net::message& m ); namespace bear { namespace net { /** * \brief The message objects carry some data to be exchanged between the * servers and the clients. * \author Julien Jorge */ class NET_EXPORT message { friend NET_EXPORT std::ostream& ::operator<< ( std::ostream& os, const message& m ); friend NET_EXPORT std::istream& ::operator>> ( std::istream& is, message& m ); public: message(); virtual ~message(); std::string get_name() const; std::size_t get_date() const; void set_date( std::size_t date ); private: virtual std::ostream& formatted_output( std::ostream& os ) const; virtual std::istream& formatted_input( std::istream& is ); virtual std::string do_get_name() const = 0; private: /** The date at which the message has to be considered. */ std::size_t m_date; }; // class message } // namespace net } // namespace bear #endif // __NET_MESSAGE_HPP__ plee-the-bear-20251226/bear-engine/core/src/net/message_factory.hpp000066400000000000000000000014461512343254000247420ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A message_factory instantiate subclasses of bear::net::message. * \author Julien Jorge */ #ifndef __NET_MESSAGE_FACTORY_HPP__ #define __NET_MESSAGE_FACTORY_HPP__ #include "net/class_export.hpp" #include #include namespace bear { namespace net { class message; /** * \brief A message_factory instantiate subclasses of bear::net::message. * \author Julien Jorge */ typedef claw::pattern::factory message_factory; } // namespace net } // namespace bear #endif // __NET_MESSAGE_FACTORY_HPP__ plee-the-bear-20251226/bear-engine/core/src/net/message_listener/000077500000000000000000000000001512343254000244025ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/core/src/net/message_listener/base_message_listener.hpp000066400000000000000000000017601512343254000314420ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief The base class for the message listener classes. * \author Julien Jorge */ #ifndef __NET_BASE_MESSAGE_LISTENER_HPP__ #define __NET_BASE_MESSAGE_LISTENER_HPP__ #include "net/class_export.hpp" namespace bear { namespace net { class message; /** * \brief The base class for the message listener classes. * \author Julien Jorge */ class NET_EXPORT base_message_listener { public: virtual ~base_message_listener(); virtual base_message_listener* clone() const = 0; void process_message( const message& m ) const; private: virtual void do_process_message( const message& m ) const = 0; }; // class base_message_listener } // namespace net } // namespace bear #endif // __NET_BASE_MESSAGE_LISTENER_HPP__ plee-the-bear-20251226/bear-engine/core/src/net/message_listener/code/000077500000000000000000000000001512343254000253145ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/core/src/net/message_listener/code/base_message_listener.cpp000066400000000000000000000016171512343254000323500ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::net::base_message_listener class. * \author Julien Jorge */ #include "net/message_listener/base_message_listener.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Destructor. */ bear::net::base_message_listener::~base_message_listener() { } // base_message_listener::~base_message_listener() /*----------------------------------------------------------------------------*/ /** * \brief Process a message. * \param m The message to process. */ void bear::net::base_message_listener::process_message( const message& m ) const { do_process_message(m); } // base_message_listener::process_message() plee-the-bear-20251226/bear-engine/core/src/net/message_listener/code/message_listener.cpp000066400000000000000000000047651512343254000313650ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::net::message_listener class. * \author Julien Jorge */ #include "net/message_listener/message_listener.hpp" #include "net/message_listener/base_message_listener.hpp" #include /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ bear::net::message_listener::message_listener() : m_impl( NULL ) { } // message_listener::message_listener() /*----------------------------------------------------------------------------*/ /** * \brief Copy constructor. * \param that The instance to copy from. */ bear::net::message_listener::message_listener( const message_listener& that ) : m_impl( that.m_impl->clone() ) { } // message_listener::message_listener() /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param listener The implementation of this instance. */ bear::net::message_listener::message_listener ( const base_message_listener& listener ) : m_impl(listener.clone()) { } // message_listener::message_listener() /*----------------------------------------------------------------------------*/ /** * \brief Destructor. */ bear::net::message_listener::~message_listener() { delete m_impl; } // message_listener::~message_listener() /*----------------------------------------------------------------------------*/ /** * \brief Process a message. * \param m The message to process. */ void bear::net::message_listener::process_message( const message& m ) const { if ( m_impl != NULL ) m_impl->process_message(m); } // message_listener::process_message() /*----------------------------------------------------------------------------*/ /** * \brief Assign an other listener to this listener. * \param that The other listener. */ bear::net::message_listener& bear::net::message_listener::operator=( const message_listener& that ) { message_listener tmp(that); swap( tmp ); return *this; } // message_listener::operator=() /*----------------------------------------------------------------------------*/ /** * \brief Swap this listener with an other. * \param that The other listener. */ void bear::net::message_listener::swap( message_listener& that ) { std::swap(m_impl, that.m_impl); } // message_listener::swap() plee-the-bear-20251226/bear-engine/core/src/net/message_listener/code/message_listener_group.cpp000066400000000000000000000021421512343254000325640ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::net::message_listener_group class. * \author Julien Jorge */ #include "net/message_listener/message_listener_group.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Dispatch a message to the listeners. * \param m The message to dispatch. */ void bear::net::message_listener_group::process_message( const message& m ) const { for ( listener_list_type::const_iterator it=m_listener.begin(); it!=m_listener.end(); ++it ) it->process_message(m); } // message_listener_group::process_message() /*----------------------------------------------------------------------------*/ /** * \brief Add a message listener. * \param listener The listener to add. */ void bear::net::message_listener_group::add( const message_listener& listener ) { m_listener.push_back(listener); } // message_listener::add() plee-the-bear-20251226/bear-engine/core/src/net/message_listener/impl/000077500000000000000000000000001512343254000253435ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/core/src/net/message_listener/impl/typed_message_listener.tpp000066400000000000000000000030131512343254000326230ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::net::typed_message_listener class. * \author Julien Jorge */ /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param f The function to which are passed the messages. */ template bear::net::typed_message_listener::typed_message_listener ( const callback_type f ) : m_callback(f) { } // typed_message_listener::typed_message_listener() /*----------------------------------------------------------------------------*/ /** * \brief Create a copy of this listener. */ template typename bear::net::typed_message_listener::self_type* bear::net::typed_message_listener::clone() const { return new self_type(*this); } // typed_message_listener::clone() /*----------------------------------------------------------------------------*/ /** * \brief Process a message. * \param m The message to process. */ template void bear::net::typed_message_listener::do_process_message ( const message& m ) const { const MessageType* real_message = dynamic_cast(&m); CLAW_PRECOND( real_message != NULL ); m_callback(*real_message); } // typed_message_listener::do_process_message() plee-the-bear-20251226/bear-engine/core/src/net/message_listener/message_listener.hpp000066400000000000000000000022511512343254000304440ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A class that process messages. * \author Julien Jorge */ #ifndef __NET_MESSAGE_LISTENER_HPP__ #define __NET_MESSAGE_LISTENER_HPP__ #include "net/class_export.hpp" namespace bear { namespace net { class base_message_listener; class message; /** * \brief A class that process messages. * \author Julien Jorge */ class NET_EXPORT message_listener { public: message_listener(); message_listener( const message_listener& that ); message_listener( const base_message_listener& listener ); ~message_listener(); void process_message( const message& m ) const; message_listener& operator=( const message_listener& that ); void swap( message_listener& that ); private: /** \brief The implementation of this instance. */ base_message_listener* m_impl; }; // class message_listener } // namespace net } // namespace bear #endif // __NET_MESSAGE_LISTENER_HPP__ plee-the-bear-20251226/bear-engine/core/src/net/message_listener/message_listener_group.hpp000066400000000000000000000022511512343254000316600ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief The message_listener group manages several message listeners. * \author Julien Jorge */ #ifndef __NET_MESSAGE_LISTENER_GROUP_HPP__ #define __NET_MESSAGE_LISTENER_GROUP_HPP__ #include "net/message_listener/message_listener.hpp" #include "net/class_export.hpp" #include namespace bear { namespace net { class message; /** * \brief A class that process messages. * \author Julien Jorge */ class NET_EXPORT message_listener_group { private: /** \brief The type of the list containing the listeners. */ typedef std::list listener_list_type; public: void process_message( const message& m ) const; void add( const message_listener& listener ); private: /** \brief The listeners in this group. */ listener_list_type m_listener; }; // class message_listener_group } // namespace net } // namespace bear #endif // __NET_MESSAGE_LISTENER_GROUP_HPP__ plee-the-bear-20251226/bear-engine/core/src/net/message_listener/typed_message_listener.hpp000066400000000000000000000031321512343254000316500ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A message listener for a given message type. * \author Julien Jorge */ #ifndef __NET_TYPED_MESSAGE_LISTENER_HPP__ #define __NET_TYPED_MESSAGE_LISTENER_HPP__ #include "net/class_export.hpp" #include "net/message_listener/base_message_listener.hpp" namespace bear { namespace net { class message; /** * \brief A message listener for a given message type. * \author Julien Jorge */ template class typed_message_listener : public base_message_listener { public: /** \brief The type of the messages processed by this listener. */ typedef MessageType message_type; /** \brief The type of the callback called with the messages. */ typedef boost::function callback_type; /** \brief The type of this class. */ typedef typed_message_listener self_type; public: typed_message_listener( const callback_type f ); virtual self_type* clone() const; private: virtual void do_process_message( const message& m ) const; private: /** \brief The function to which are passed the messages. */ callback_type m_callback; }; // class typed_message_listener } // namespace net } // namespace bear #include "net/message_listener/impl/typed_message_listener.tpp" #endif // __NET_TYPED_MESSAGE_LISTENER_HPP__ plee-the-bear-20251226/bear-engine/core/src/net/server.hpp000066400000000000000000000037431512343254000230770ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A server is an object that can dispatch messages to clients. * \author Julien Jorge */ #ifndef __NET_SERVER_HPP__ #define __NET_SERVER_HPP__ #include "net/class_export.hpp" #include #include #include #include namespace bear { namespace net { class message; /** * \brief A server is an object that can dispatch messages to clients. * \author Julien Jorge */ class NET_EXPORT server: private claw::pattern::non_copyable { private: /** \brief The type of a clients connected to this server. */ typedef claw::net::socket_stream client_type; /** \brief The type of a pointer on a client connected to this server. */ typedef client_type* client_pointer; /** \brief The list of clients connected to this server. */ typedef std::list client_list; public: server( unsigned int port, int client_read_time_limit = 0 ); ~server(); std::size_t get_connection_count() const; void dispatch_message( const message& m ); void send_message( std::size_t client_id, const message& m ); boost::signals2::signal on_new_client; void check_for_new_clients(); private: /** \brief This is the socket in which the messages are dispatched and from which the new clients are taken. */ claw::net::socket_server m_server; /** \brief Those are the clients to which the messages are dispatched. */ client_list m_clients; /** \brief How long do we wait when asking a client for its content. */ int m_client_read_time_limit; }; // class server } // namespace net } // namespace bear #endif // __NET_SERVER_HPP__ plee-the-bear-20251226/bear-engine/core/src/text_interface/000077500000000000000000000000001512343254000232675ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/core/src/text_interface/CMakeLists.txt000066400000000000000000000015111512343254000260250ustar00rootroot00000000000000set( TEXT_INTERFACE_TARGET_NAME bear_text_interface ) #------------------------------------------------------------------------------- set( TEXT_INTERFACE_SOURCE_FILES code/argument_converter.cpp code/auto_converter.cpp code/base_exportable.cpp code/converted_argument.cpp code/string_to_arg.cpp ) add_library( ${TEXT_INTERFACE_TARGET_NAME} ${BEAR_ENGINE_CORE_LINK_TYPE} ${TEXT_INTERFACE_SOURCE_FILES} ) set_target_properties( ${TEXT_INTERFACE_TARGET_NAME} PROPERTIES INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/${BEAR_ENGINE_INSTALL_LIBRARY_DIR}" ) install( TARGETS ${TEXT_INTERFACE_TARGET_NAME} DESTINATION ${BEAR_ENGINE_INSTALL_LIBRARY_DIR} ) set( TEXT_INTERFACE_LINK_LIBRARIES ${CLAW_LOGGER_LIBRARIES} ) target_link_libraries( ${TEXT_INTERFACE_TARGET_NAME} ${TEXT_INTERFACE_LINK_LIBRARIES} ) plee-the-bear-20251226/bear-engine/core/src/text_interface/argument_converter.hpp000066400000000000000000000042041512343254000277110ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A class that converts a string into the adequate value to be passed * to a function of a base_exportable by the method_caller classes. * \author Julien Jorge. */ #ifndef __TEXT_INTERFACE_ARGUMENT_CONVERTER_HPP__ #define __TEXT_INTERFACE_ARGUMENT_CONVERTER_HPP__ #include #include #include #include "text_interface/converted_argument.hpp" namespace bear { namespace text_interface { template struct string_to_arg; /** * \brief This exception is thrown when an argument could not be converted * into the desired type. * \author Julien Jorge */ class no_converter: public claw::exception { public: no_converter( const std::string& arg, const std::type_info& type ) : claw::exception ( "Can't convert arg '" + arg + "' as '" + type.name() + "'" ) { } }; // class no_converter /** * \brief A class that converts a string into the adequate value to be * passed to a function of a base_exportable by the method_caller * classes. * \author Julien Jorge. */ class argument_converter { public: /** The type of the result of the conversion for a given input type. */ template struct conversion_result { typedef typename string_to_arg::result_type result_type; }; // struct conversion_result public: virtual ~argument_converter(); template typename conversion_result::result_type convert_argument( const std::string& arg ) const; virtual converted_argument do_convert_argument ( const std::string& arg, const std::type_info& type ) const; }; // class argument_converter } // namespace text_interface } // namespace bear #include "text_interface/impl/argument_converter.tpp" #endif // __TEXT_INTERFACE_ARGUMENT_CONVERTER_HPP__ plee-the-bear-20251226/bear-engine/core/src/text_interface/auto_converter.hpp000066400000000000000000000031211512343254000270340ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief This class is an argument converter used to statically associate a * name with each of the elements of a list of arguments. * \author Julien Jorge. */ #ifndef __TEXT_AUTO_CONVERTER_HPP__ #define __TEXT_AUTO_CONVERTER_HPP__ #include "text_interface/argument_converter.hpp" #include namespace bear { namespace text_interface { /** * \brief This class is an argument converter used to statically associate a * name with each of the elements of a list of arguments. * * You will typicall use this converter when the name of the function to * call is unknown but its arguments are known. * * \author Julien Jorge */ class auto_converter: public argument_converter { private: /** \brief The type of the map associating the arguments with their names. */ typedef std::map arg_map_type; public: std::vector get_arguments() const; converted_argument do_convert_argument ( const std::string& arg, const std::type_info& type ) const; void push( converted_argument argv ); private: /** \brief The map associating the arguments with their names. */ arg_map_type m_args; }; // class auto_converter } // namespace text_interface } // namespace bear #endif // __TEXT_AUTO_CONVERTER_HPP__ plee-the-bear-20251226/bear-engine/core/src/text_interface/auto_converter_maker.hpp000066400000000000000000000017561512343254000302270ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief The base class for all classes for which we want to be able to call * methods from a text_interface file. * \author Julien Jorge. */ #ifndef __TEXT_AUTO_CONVERTER_MAKER_HPP__ #define __TEXT_AUTO_CONVERTER_MAKER_HPP__ #include "text_interface/auto_converter.hpp" namespace bear { namespace text_interface { template auto_converter auto_converter_maker( A0 arg0 ); template auto_converter auto_converter_maker( A0 arg0, A1 arg1 ); template auto_converter auto_converter_maker( A0 arg0, A1 arg1, A2 arg2 ); } // namespace text_interface } // namespace bear #include "text_interface/impl/auto_converter_maker.tpp" #endif // __TEXT_AUTO_CONVERTER_MAKER_HPP__ plee-the-bear-20251226/bear-engine/core/src/text_interface/base_exportable.hpp000066400000000000000000000332741512343254000271500ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief The base class for all classes for which we want to be able to call * methods from a text_interface file. * \author Julien Jorge. */ #ifndef __TEXT_INTERFACE_BASE_EXPORTABLE_HPP__ #define __TEXT_INTERFACE_BASE_EXPORTABLE_HPP__ #include "text_interface/method_caller_implement.hpp" #include #include #include #include #include /** * \brief This macro, used in a base_exportable class definition, defines the * static members used to store the callers of the methods. The call is * done from TEXT_INTERFACE_DECLARE_METHOD_LIST. */ #define TEXT_INTERFACE_DECLARE_METHOD_LIST_BASE \ protected: \ typedef \ std::map \ \ method_list_data_type; \ \ static bear::text_interface::base_exportable::method_list s_method_list; \ \ static void self_methods_set \ ( const std::string& name, \ bear::text_interface::method_caller const* m ) \ { s_method_list.data[name] = m; } \ \ private: \ virtual bear::text_interface::base_exportable::method_list const* \ get_method_list() const \ { \ init_method_list(); \ return &s_method_list; \ } /*--------------------------------------------------------------------------*/ /** * \brief This macro, used in a base_exportable class definition, defines the * static members used to store the callers of the methods. * \param parent_class The type of the parent class. Must inherit from * base_exportable. * \param export_func A static method from the class, called to initialise the * method callers. */ #define TEXT_INTERFACE_DECLARE_METHOD_LIST(parent_class, export_func) \ TEXT_INTERFACE_DECLARE_METHOD_LIST_BASE \ protected: \ static void init_method_list() \ { \ if ( s_method_list.parent == NULL ) \ { \ parent_class::init_method_list(); \ s_method_list.parent = &parent_class::s_method_list; \ export_func(); \ } \ } namespace bear { namespace text_interface { class auto_converter; /** * \brief The base class for all classes for which we want to be able to * call methods from a text_interface file. * * Those classes contain a static table of the methods to call, associated * with their names. * * \author Julien Jorge. */ class base_exportable { protected: /** \brief The type of the list of callable methods. */ struct method_list { public: /** \brief The type of the container where the method callers are stored. */ typedef std::map list_type; method_list(); public: /** \brief The list of the parent class. Multiple inheritance is not allowed yet. */ method_list const* parent; /** \brief The callers of the methods. */ list_type data; }; // struct method_list private: TEXT_INTERFACE_DECLARE_METHOD_LIST_BASE public: /** \remark The desctructor must be virtual so we can use dynamic_cast in explicit_method_caller. */ virtual ~base_exportable(); void execute ( const std::string& n, const std::vector& args = std::vector() ); void execute( const std::string& n, const auto_converter& c ); void execute( const std::string& n, const std::vector& args, const argument_converter& c ); protected: static void init_method_list(); private: method_caller const* find_function( const std::string& n ) const; }; // class base_exportable } // namespace text_interface } // namespace bear /** * \brief This macro is used in the implementation of base_exportable to mark * the end of the method lists in the hierarchy. */ #define TEXT_INTERFACE_IMPLEMENT_ROOT_METHOD_LIST \ bear::text_interface::base_exportable::method_list \ bear::text_interface::base_exportable::s_method_list; /** * \brief Use this macro in the implementation file of your class to implement * the data required by base_exportable. * \param self_type The type of your class. */ #define TEXT_INTERFACE_IMPLEMENT_METHOD_LIST(self_type) \ bear::text_interface::base_exportable::method_list \ self_type::s_method_list; /** * \brief Use this macro in the implementation file of your template class to * implement the data required by base_exportable. * \param self_type The type of your class. * \param K1 The keyword before T1. * \param T1 The first type of the template. */ #define TEXT_INTERFACE_IMPLEMENT_TEMPLATE_METHOD_LIST_1(self_type, K1, T1) \ template \ bear::text_interface::base_exportable::method_list \ self_type::s_method_list; /** * \brief This macro is used in the implementation of a class inheriting from * base_exportable to define an caller for a method without arguments. * \param self_type The class for which we declare the methods. * \param parent_type The parent class of self_type in which the method is * defined. * \param method_name The name of the method to execute. * \param R The return type of the method. */ #define TEXT_INTERFACE_CONNECT_PARENT_METHOD_0( self_type, parent_type, \ method_name, R ) \ self_methods_set \ ( #method_name, \ &bear::text_interface::method_caller_implement_0 \ < \ self_type, parent_type, \ R, \ &parent_type::method_name>::s_caller ); /** * \brief This macro is used in the implementation of a class inheriting from * base_exportable to define an caller for a method with a single * argument. * \param self_type The class for which we declare the methods. * \param parent_type The parent class of self_type in which the method is * defined. * \param method_name The name of the method to execute. * \param R The return type of the method. * \param T1 The type of the first argument of self_type::method_name(). */ #define TEXT_INTERFACE_CONNECT_PARENT_METHOD_1( self_type, parent_type, \ method_name, R, T1 ) \ self_methods_set \ ( #method_name, \ &bear::text_interface::method_caller_implement_1 \ < \ self_type, parent_type, \ R, T1, \ &self_type::method_name >::s_caller ); /** * \brief This macro is used in the implementation of a class inheriting from * base_exportable to define an caller for a method with two arguments. * \param self_type The class for which we declare the methods. * \param parent_type The parent class of self_type in which the method is * defined. * \param method_name The name of the method to execute. * \param R The return type of the method. * \param T1 The type of the first argument of self_type::method_name(). * \param T2 The type of the second argument of self_type::method_name(). */ #define TEXT_INTERFACE_CONNECT_PARENT_METHOD_2( self_type, parent_type, \ method_name, R, T1, T2 ) \ self_methods_set \ ( #method_name, \ &bear::text_interface::method_caller_implement_2 \ < \ self_type, parent_type, \ R, T1, T2, \ &self_type::method_name >::s_caller ); /** * \brief This macro is used in the implementation of a class inheriting from * base_exportable to define an caller for a method with three arguments. * \param self_type The class for which we declare the methods. * \param method_name The name of the method to execute. * \param R The return type of the method. * \param T1 The type of the first argument of self_type::method_name(). * \param T2 The type of the second argument of self_type::method_name(). * \param T3 The type of the third argument of self_type::method_name(). */ #define TEXT_INTERFACE_CONNECT_PARENT_METHOD_3( self_type, parent_type, \ method_name, R, T1, T2, \ T3 ) \ self_methods_set \ ( #method_name, \ &bear::text_interface::method_caller_implement_3 \ < \ self_type, parent_type, \ R, T1, T2, T3, \ &self_type::method_name >::s_caller ); /** * \brief This macro is used in the implementation of a class inheriting from * base_exportable to define an caller for a method without arguments. * \param self_type The class for which we declare the methods. * \param method_name The name of the method to execute. * \param R The return type of the method. */ #define TEXT_INTERFACE_CONNECT_METHOD_0( self_type, method_name, R ) \ TEXT_INTERFACE_CONNECT_PARENT_METHOD_0(self_type, self_type, method_name, R); /** * \brief This macro is used in the implementation of a class inheriting from * base_exportable to define an caller for a method with a single * argument. * \param self_type The class for which we declare the methods. * \param method_name The name of the method to execute. * \param R The return type of the method. * \param T1 The type of the first argument of self_type::method_name(). */ #define TEXT_INTERFACE_CONNECT_METHOD_1( self_type, method_name, R, T1 ) \ TEXT_INTERFACE_CONNECT_PARENT_METHOD_1(self_type, self_type, method_name, R, \ T1); /** * \brief This macro is used in the implementation of a class inheriting from * base_exportable to define an caller for a method with two arguments. * \param self_type The class for which we declare the methods. * \param parent_type The parent class of self_type in which the method is * defined. * \param method_name The name of the method to execute. * \param R The return type of the method. * \param T1 The type of the first argument of self_type::method_name(). * \param T2 The type of the second argument of self_type::method_name(). */ #define TEXT_INTERFACE_CONNECT_METHOD_2( self_type, method_name, R, T1, T2 ) \ TEXT_INTERFACE_CONNECT_PARENT_METHOD_2(self_type, self_type, method_name, R, \ T1, T2); /** * \brief This macro is used in the implementation of a class inheriting from * base_exportable to define an caller for a method with three arguments. * \param self_type The class for which we declare the methods. * \param method_name The name of the method to execute. * \param R The return type of the method. * \param T1 The type of the first argument of self_type::method_name(). * \param T2 The type of the second argument of self_type::method_name(). * \param T3 The type of the third argument of self_type::method_name(). */ #define TEXT_INTERFACE_CONNECT_METHOD_3( self_type, method_name, R, T1, \ T2, T3 ) \ TEXT_INTERFACE_CONNECT_PARENT_METHOD_3(self_type, self_type, method_name, R, \ T1, T2, T3); #endif // __TEXT_INTERFACE_BASE_EXPORTABLE_HPP__ plee-the-bear-20251226/bear-engine/core/src/text_interface/code/000077500000000000000000000000001512343254000242015ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/core/src/text_interface/code/argument_converter.cpp000066400000000000000000000022431512343254000306170ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::text_interface::argument_converter class. * \author Julien Jorge. */ #include "text_interface/argument_converter.hpp" #include /*----------------------------------------------------------------------------*/ /** * \brief Destructor. */ bear::text_interface::argument_converter::~argument_converter() { // nothing to do } // argument_converter::~argument_converter() /*----------------------------------------------------------------------------*/ /** * \brief Delegate conversion of an argument, if no adequate conversion has * been found. * \param arg The argument to convert. * \param type The description of the expected type for the result value. */ bear::text_interface::converted_argument bear::text_interface::argument_converter::do_convert_argument ( const std::string& arg, const std::type_info& type ) const { throw no_converter(arg, type); } // argument_converter::do_convert_argument() plee-the-bear-20251226/bear-engine/core/src/text_interface/code/auto_converter.cpp000066400000000000000000000035261512343254000277520ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::text_interface::auto_converter class. * \author Julien Jorge. */ #include "text_interface/auto_converter.hpp" #include #include /*----------------------------------------------------------------------------*/ /** * \brief Get the names of the arguments. */ std::vector bear::text_interface::auto_converter::get_arguments() const { std::vector result( m_args.size() ); std::transform ( m_args.begin(), m_args.end(), result.begin(), claw::const_pair_first() ); return result; } // auto_converter::get_arguments() /*----------------------------------------------------------------------------*/ /** * \brief Convert an argument into its value. * \param arg The string representation of the argument. * \param type The expected result type. */ bear::text_interface::converted_argument bear::text_interface::auto_converter::do_convert_argument ( const std::string& arg, const std::type_info& type ) const { arg_map_type::const_iterator it = m_args.find(arg); if ( it != m_args.end() ) return it->second; else throw std::invalid_argument("Can't convert '" + arg + "'");; } // auto_converter::do_convert_argument() /*----------------------------------------------------------------------------*/ /** * \brief Add an argument value at the end of the argument list. * \param arg The value of the argument. */ void bear::text_interface::auto_converter::push( converted_argument argv ) { std::ostringstream oss; oss << "arg" << m_args.size(); m_args[oss.str()] = argv; } // auto_converter::push() plee-the-bear-20251226/bear-engine/core/src/text_interface/code/base_exportable.cpp000066400000000000000000000114651512343254000300530ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::text_interface::base_exportable class. * \author Julien Jorge. */ #include "text_interface/base_exportable.hpp" #include "text_interface/auto_converter.hpp" #include "text_interface/method_caller.hpp" #include /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ bear::text_interface::base_exportable::method_list::method_list() : parent(NULL) { // nothing to do } // base_exportable::method_list::method_list() /*----------------------------------------------------------------------------*/ /** * \brief Destructor. */ bear::text_interface::base_exportable::~base_exportable() { // nothing to do } // base_exportable::~base_exportable() /*----------------------------------------------------------------------------*/ /** * \brief Export the methods of the class. */ void bear::text_interface::base_exportable::init_method_list() { // nothing to do } // base_exportable::init_method_list() /*----------------------------------------------------------------------------*/ /** * \brief Execute a method from the class from its name and its arguments as * passed as strings. * \param n The name of the method to call. * \param args The string representation of the value of the arguments of the * method. * \remark The call is make without any context, which mean that some argument * conversion may not work. */ void bear::text_interface::base_exportable::execute ( const std::string& n, const std::vector& args ) { method_caller const* f = find_function(n); if (f!=NULL) f->execute(this, args, argument_converter()); } // base_exportable::execute() /*----------------------------------------------------------------------------*/ /** * \brief Execute a method from the class from its name and its arguments as * passed as strings. * \param n The name of the method to call. * \param c The argument_converter used to convert the arguments. */ void bear::text_interface::base_exportable::execute ( const std::string& n, const auto_converter& c ) { method_caller const* f = find_function(n); if (f!=NULL) f->execute(this, c.get_arguments(), c); } // base_exportable::execute() /*----------------------------------------------------------------------------*/ /** * \brief Execute a method from the class from its name and its arguments as * passed as strings. * \param n The name of the method to call. * \param args The string representation of the value of the arguments of the * method. * \param c The argument_converter used to convert the arguments. */ void bear::text_interface::base_exportable::execute ( const std::string& n, const std::vector& args, const argument_converter& c ) { method_caller const* f = find_function(n); if (f!=NULL) f->execute(this, args, c); } // base_exportable::execute() /*----------------------------------------------------------------------------*/ /** * \brief Execute a method from the class from its name and its arguments as * passed as strings. * \param n The name of the method to call. * \param args The string representation of the value of the arguments of the * method. * \param context The context in which these methods are called. */ bear::text_interface::method_caller const* bear::text_interface::base_exportable::find_function ( const std::string& n ) const { method_caller const* result=NULL; // Get the callers from the lowest class in the hierarchy. const method_list* m( get_method_list() ); method_list_data_type::const_iterator it(m->data.find(n)); bool stop(false); while( !stop ) // there is at least the null-terminating entry in m.data if ( it == m->data.end() ) { // We are at the end of the caller tables. We will now look in the // table of the parent class, if there is such a class. if ( m->parent != NULL ) { m = m->parent; it = m->data.find(n); } else { claw::logger << claw::log_warning << "Method '" << n << "' not found." << std::endl; stop = true; } } else { // We found the method. Execute. stop = true; result = it->second; } return result; } // base_exportable::find_function() /*----------------------------------------------------------------------------*/ /** Initialisation of the static member variables used for the caller table in bear::text_interface::base_exportable. */ TEXT_INTERFACE_IMPLEMENT_ROOT_METHOD_LIST plee-the-bear-20251226/bear-engine/core/src/text_interface/code/converted_argument.cpp000066400000000000000000000017071512343254000306050ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::text_interface::converted_argument class. * \author Julien Jorge. */ #include "text_interface/converted_argument.hpp" #include /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ bear::text_interface::converted_argument::converted_argument() : m_holder(NULL) { } // converted_argument::converted_argument() /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param that The instance to copy from. */ bear::text_interface::converted_argument::converted_argument ( const converted_argument& that ) : m_holder(that.m_holder) { } // converted_argument::converted_argument() plee-the-bear-20251226/bear-engine/core/src/text_interface/code/string_to_arg.cpp000066400000000000000000000015401512343254000275460ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::text_interface::string_to_arg class. * \author Julien Jorge. */ #include "text_interface/string_to_arg.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Convert a string to the equivalent value to pass as an argument for a * character method. * \param c The context on which the conversion is done. * \param arg The string representation of the value. */ std::string bear::text_interface::string_to_arg::convert_argument ( const argument_converter& c, const std::string& arg ) { return arg; } // string_to_arg::convert_argument() plee-the-bear-20251226/bear-engine/core/src/text_interface/converted_argument.hpp000066400000000000000000000024051512343254000276740ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Convert a string to the equivalent value to pass as an argument for a * character method. * \author Julien Jorge. */ #ifndef __TEXT_INTERFACE_CONVERTED_ARGUMENT_HPP__ #define __TEXT_INTERFACE_CONVERTED_ARGUMENT_HPP__ namespace bear { namespace text_interface { /** * \brief Helper class to decide whether an argument is converted using the * default procedure or delegated to the implementation of the * subclass. */ class converted_argument { public: converted_argument(); converted_argument( const converted_argument& that ); template converted_argument( T* v ); template converted_argument( T& v ); template T cast_to() const; private: /** \brief The converted value. */ void* m_holder; }; // class converted_argument() } // namespace text_interface } // namespace bear #include "text_interface/impl/converted_argument.tpp" #endif // __TEXT_INTERFACE_CONVERTED_ARGUMENT_HPP__ plee-the-bear-20251226/bear-engine/core/src/text_interface/get_inner_type.hpp000066400000000000000000000025441512343254000270200ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Get the most inner type in a declaration of a constant and/or a * reference. * \author Julien Jorge. */ #ifndef __TEXT_INTERFACE_GET_INNER_TYPE_HPP__ #define __TEXT_INTERFACE_GET_INNER_TYPE_HPP__ namespace bear { namespace text_interface { /** * \brief Get the most inner type in a declaration of a constant and/or a * reference. * \author Julien Jorge. */ template class get_inner_type { public: /** \brief The inner type. */ typedef T type; }; // class get_inner_type /** * \brief Get the most inner type in a declaration of a constant. * \author Julien Jorge. */ template class get_inner_type: public get_inner_type { }; // class get_inner_type /** * \brief Get the most inner type in a declaration of a constant reference. * \author Julien Jorge. */ template class get_inner_type: public get_inner_type { }; // class get_inner_type } // namespace text_interface } // namespace bear #endif // __TEXT_INTERFACE_GET_INNER_TYPE_HPP__ plee-the-bear-20251226/bear-engine/core/src/text_interface/impl/000077500000000000000000000000001512343254000242305ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/core/src/text_interface/impl/argument_converter.tpp000066400000000000000000000016401512343254000306670ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the template methods of the * bear::text_interface::argument_converter class. * \author Julien Jorge. */ #include "text_interface/string_to_arg.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Convert a string representation of a value into a value of a given * type. * \param arg The argument to convert. */ template typename bear::text_interface::argument_converter::conversion_result::result_type bear::text_interface::argument_converter::convert_argument ( const std::string& arg ) const { return string_to_arg::convert_argument(*this, arg); } // argument_converter::convert_argument() plee-the-bear-20251226/bear-engine/core/src/text_interface/impl/auto_converter_maker.tpp000066400000000000000000000033261512343254000311770ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief The base class for all classes for which we want to be able to call * methods from a text_interface file. * \author Julien Jorge. */ /*----------------------------------------------------------------------------*/ /** * \brief Create an auto_converter containing one value. * \param arg0 The value. */ template bear::text_interface::auto_converter bear::text_interface::auto_converter_maker( A0 arg0 ) { auto_converter result; result.push(arg0); return result; } // auto_converter_maker() /*----------------------------------------------------------------------------*/ /** * \brief Create an auto_converter containing 2 values. * \param arg0 The first value. * \param arg1 The second value. */ template bear::text_interface::auto_converter bear::text_interface::auto_converter_maker( A0 arg0, A1 arg1 ) { auto_converter result( auto_converter_maker(arg0) ); result.push(arg1); return result; } // auto_converter_maker() /*----------------------------------------------------------------------------*/ /** * \brief Create an auto_converter containing 3 values. * \param arg0 The first value. * \param arg1 The second value. * \param arg2 The third value. */ template bear::text_interface::auto_converter bear::text_interface::auto_converter_maker( A0 arg0, A1 arg1, A2 arg2 ) { auto_converter result( auto_converter_maker( arg0, arg1 ) ); result.push(arg2); return result; } // auto_converter_maker() plee-the-bear-20251226/bear-engine/core/src/text_interface/impl/converted_argument.tpp000066400000000000000000000023551512343254000306550ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::text_interface::converted_argument class. * \author Julien Jorge. */ /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param v The converted value of the argument. */ template bear::text_interface::converted_argument::converted_argument( T* v ) : m_holder(v) { } // converted_argument::converted_argument() /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param v The converted value of the argument. */ template bear::text_interface::converted_argument::converted_argument( T& v ) : m_holder(&v) { } // converted_argument::converted_argument() /*----------------------------------------------------------------------------*/ /** * \brief Cast the value into a given type. */ template T bear::text_interface::converted_argument::cast_to() const { return static_cast( m_holder ); } // converted_argument::converted_argument() plee-the-bear-20251226/bear-engine/core/src/text_interface/impl/method_caller_implement.tpp000066400000000000000000000165721512343254000316440ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::text_interface::method_caller_implement * class. * \author Julien Jorge. */ #include "text_interface/argument_converter.hpp" #include /*----------------------------------------------------------------------------*/ template < typename SelfClass, typename ParentClass, typename R, R (ParentClass::*Member)() > const typename bear::text_interface::method_caller_implement_0 ::caller_type bear::text_interface::method_caller_implement_0 ::s_caller; /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ template < typename SelfClass, typename ParentClass, typename R, R (ParentClass::*Member)() > bear::text_interface::method_caller_implement_0 ::caller_type::caller_type() { // nothing to do } // method_caller_implement_0::caller_type::caller_type() /*----------------------------------------------------------------------------*/ /** * \brief Execute a method of a given instance. * \param self The instance on which the method is called. * \param args The string representation of the value of the arguments passed to * the method. * \param c The converter used to convert the arguments. */ template < typename SelfClass, typename ParentClass, typename R, R (ParentClass::*Member)() > void bear::text_interface::method_caller_implement_0 ::caller_type::explicit_execute ( SelfClass& self, const std::vector& args, const argument_converter& c ) const { CLAW_PRECOND( args.size() == 0 ); const mem_fun_type member(Member); (self.*member)(); } // method_caller_implement_0::caller_type::explicit_execute() /*----------------------------------------------------------------------------*/ template < typename SelfClass, typename ParentClass, typename R, typename A0, R (ParentClass::*Member)(A0) > const typename bear::text_interface::method_caller_implement_1 ::caller_type bear::text_interface::method_caller_implement_1 ::s_caller; /*----------------------------------------------------------------------------*/ /** * \brief Execute a method of a given instance. * \param self The instance on which the method is called. * \param args The string representation of the value of the arguments passed to * the method. * \param c The converter used to convert the arguments. */ template < typename SelfClass, typename ParentClass, typename R, typename A0, R (ParentClass::*Member)(A0) > void bear::text_interface::method_caller_implement_1 ::caller_type::explicit_execute ( SelfClass& self, const std::vector& args, const argument_converter& c ) const { CLAW_PRECOND( args.size() == 1 ); const mem_fun_type member(Member); (self.*member) ( c.convert_argument(args[0]) ); } // method_caller_implement_1::caller_type::explicit_execute() /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ template < typename SelfClass, typename ParentClass, typename R, typename A0, R (ParentClass::*Member)(A0) > bear::text_interface::method_caller_implement_1 ::caller_type::caller_type() { // nothing to do } // method_caller_implement_1::caller_type::caller_type() /*----------------------------------------------------------------------------*/ template < typename SelfClass, typename ParentClass, typename R, typename A0, typename A1, R (ParentClass::*Member)(A0, A1) > const typename bear::text_interface::method_caller_implement_2 ::caller_type bear::text_interface::method_caller_implement_2 ::s_caller; /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ template < typename SelfClass, typename ParentClass, typename R, typename A0, typename A1, R (ParentClass::*Member)(A0, A1) > bear::text_interface::method_caller_implement_2 ::caller_type::caller_type() { // nothing to do } // method_caller_implement_2::caller_type::caller_type() /*----------------------------------------------------------------------------*/ /** * \brief Execute a method of a given instance. * \param self The instance on which the method is called. * \param args The string representation of the value of the arguments passed to * the method. * \param c The converter used to convert the arguments. */ template < typename SelfClass, typename ParentClass, typename R, typename A0, typename A1, R (ParentClass::*Member)(A0, A1) > void bear::text_interface::method_caller_implement_2 ::caller_type::explicit_execute ( SelfClass& self, const std::vector& args, const argument_converter& c ) const { CLAW_PRECOND( args.size() == 2 ); const mem_fun_type member(Member); (self.*member) ( c.template convert_argument(args[0]), c.template convert_argument(args[1]) ); } // method_caller_implement_2::caller_type::explicit_execute() /*----------------------------------------------------------------------------*/ template < typename SelfClass, typename ParentClass, typename R, typename A0, typename A1, typename A2, R (ParentClass::*Member)(A0, A1, A2) > const typename bear::text_interface::method_caller_implement_3 ::caller_type bear::text_interface::method_caller_implement_3 ::s_caller; /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ template < typename SelfClass, typename ParentClass, typename R, typename A0, typename A1, typename A2, R (ParentClass::*Member)(A0, A1, A2) > bear::text_interface::method_caller_implement_3 ::caller_type::caller_type() { // nothing to do } // method_caller_implement_3::caller_type::caller_type() /*----------------------------------------------------------------------------*/ /** * \brief Execute a method of a given instance. * \param self The instance on which the method is called. * \param args The string representation of the value of the arguments passed to * the method. * \param c The converter used to convert the arguments. */ template < typename SelfClass, typename ParentClass, typename R, typename A0, typename A1, typename A2, R (ParentClass::*Member)(A0, A1, A2) > void bear::text_interface::method_caller_implement_3 ::caller_type::explicit_execute ( SelfClass& self, const std::vector& args, const argument_converter& c ) const { CLAW_PRECOND( args.size() == 3 ); const mem_fun_type member(Member); (self.*member) ( c.template convert_argument(args[0]), c.template convert_argument(args[1]), c.template convert_argument(args[2]) ); } // method_caller_implement_3::caller_type::explicit_execute() plee-the-bear-20251226/bear-engine/core/src/text_interface/impl/string_to_arg.tpp000066400000000000000000000101631512343254000276170ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::text_interface::string_to_arg class. * \author Julien Jorge. */ #include "text_interface/argument_converter.hpp" #include #include #include #include /*----------------------------------------------------------------------------*/ /** * \brief Convert an argument using the default conversion. * \param c (ignored) The argument converter. * \param arg The argument to convert. */ template typename bear::text_interface::string_to_arg_helper::result_type bear::text_interface::string_to_arg_helper::convert_argument ( const argument_converter& c, const std::string& arg ) { result_type result; std::istringstream iss(arg); iss >> result; if ( !iss || (iss.rdbuf()->in_avail() != 0) ) { claw::logger << claw::log_warning << "Can't convert '" << arg << "'" << std::endl; throw std::invalid_argument("Can't convert '" + arg + "'"); } return result; } // string_to_arg_helper::convert_argument() /*----------------------------------------------------------------------------*/ /** * \brief Convert an argument using the implementation of the sub classe of the * argument converter. * \param c The argument converter. * \param arg The argument to convert. */ template typename bear::text_interface::string_to_arg_helper::result_type bear::text_interface::string_to_arg_helper::convert_argument ( const argument_converter& c, const std::string& arg ) { return c.do_convert_argument(arg, typeid(T)).cast_to(); } // string_to_arg_helper::convert_argument() /*----------------------------------------------------------------------------*/ /** * \brief Convert an argument using the implementation of the sub classe of the * argument converter. * \param c The argument converter. * \param arg The argument to convert. */ template typename bear::text_interface::string_to_arg_helper::result_type bear::text_interface::string_to_arg_helper::convert_argument ( const argument_converter& c, const std::string& arg ) { converted_argument converted = c.do_convert_argument(arg, typeid(T*)); T* result = converted.cast_to(); if ( result == NULL ) throw std::invalid_argument("Can't convert '" + arg + "'"); return *result; } // string_to_arg_helper::convert_argument() /*----------------------------------------------------------------------------*/ /** * \brief Convert an argument using the implementation of the sub classe of the * argument converter. * \param c The argument converter. * \param arg The argument to convert. */ template typename bear::text_interface::string_to_arg_helper::result_type bear::text_interface::string_to_arg_helper::convert_argument ( const argument_converter& c, const std::string& arg ) { converted_argument converted = c.do_convert_argument(arg, typeid(const T*)); const T* result = converted.cast_to(); if ( result == NULL ) throw std::invalid_argument("Can't convert '" + arg + "'"); return *result; } // string_to_arg_helper::convert_argument() /*----------------------------------------------------------------------------*/ /** * \brief Convert a string to the equivalent sequence of value to pass as an * argument for a character method. * \param c The context on which the conversion is done. * \param arg The string representation of the value. */ template typename bear::text_interface::string_to_sequence_arg::result_type bear::text_interface::string_to_sequence_arg::convert_argument ( const argument_converter& c, const std::string& arg ) { result_type result; if ( !arg.empty() ) claw::text::split( result, arg.begin()+1, arg.end(), arg[0] ); return result; } // string_to_sequence_arg::convert_argument() plee-the-bear-20251226/bear-engine/core/src/text_interface/impl/typed_method_caller.tpp000066400000000000000000000022131512343254000307620ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::text_interface::typed_method_caller class. * \author Julien Jorge. */ #include /*----------------------------------------------------------------------------*/ /** * \brief Execute a method of a given instance. * \param self The instance on which the method is called. * \param args The string representation of the value of the arguments passed to * the method. * \param c The converter used to convert the arguments. */ template void bear::text_interface::typed_method_caller::execute ( base_exportable* self, const std::vector& args, const argument_converter& c ) const { SelfClass* s = dynamic_cast(self); if ( s!=NULL ) explicit_execute(*s, args, c); else claw::logger << claw::log_warning << "Failed to cast base_exportable." << std::endl; } // typed_method_caller::execute() plee-the-bear-20251226/bear-engine/core/src/text_interface/method_caller.hpp000066400000000000000000000026341512343254000266070ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Base class for calling a method of an instance given the string * representation of the value of the arguments. * \author Julien Jorge. */ #ifndef __TEXT_INTERFACE_METHOD_CALLER_HPP__ #define __TEXT_INTERFACE_METHOD_CALLER_HPP__ #include #include namespace bear { namespace text_interface { class base_exportable; class argument_converter; /** * \brief Base class for calling a method of an instance given the string * representation of the value of the arguments. * * \author Julien Jorge. */ class method_caller { public: /** * \brief Execute a method of a given instance. * \param self The instance on which the method is called. * \param args The string representation of the value of the arguments * passed to the method. * \param c The converter used to convert the arguments. */ virtual void execute ( base_exportable* self, const std::vector& args, const argument_converter& c ) const = 0; }; // class method_caller } // namespace text_interface } // namespace bear #endif // __TEXT_INTERFACE_METHOD_CALLER_HPP__ plee-the-bear-20251226/bear-engine/core/src/text_interface/method_caller_implement.hpp000066400000000000000000000156671512343254000306730ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Define the type of a member function of a class, given the class and * the list of the types of the arguments of the fuction. * \author Julien Jorge. */ #ifndef __TEXT_INTERFACE_METHOD_CALLER_IMPLEMENT_HPP__ #define __TEXT_INTERFACE_METHOD_CALLER_IMPLEMENT_HPP__ #include "text_interface/typed_method_caller.hpp" namespace bear { namespace text_interface { /** * \brief Define a method caller for a member function of a class, given the * class, the return type of the method, the types of the arguments, * and the adress of the method. * * There is one class for each number of parameters. If there is no class * for the number of parameters of your method, I suggest that you write * the following class, assuming that the method has N+1 parameters: * * \code * template< typename SelfClass, typename ParentClass, typename R, * typename A0, typename A1, ..., typename AN, * R (ParentClass::*Member)(A0, A1, ..., AN) > * class method_caller_implement_N+1 * { * public: * // The type of the member function. * typedef R (ParentClass::*mem_fun_type)(A0, A1, ..., AN); * * // The caller for SelfClass with the givent argument types * class caller_type: * public typed_method_caller * { * private: * void explicit_execute * ( SelfClass& self, const std::vector& args, * const argument_converter& c ) const * { * const mem_fun_type member(Member); * (self.*member) * ( c.convert_argument(args[0]), * string_to_arg::convert(c, args[1]), * // ... * string_to_arg::convert(c, args[N]), ); * } // explicit_execute() * * }; // class caller_type * * public: * // The instance of the caller. * // A single instance is sufficient since there is no member variables * // in caller_type (s_caller only does the transition toward the method * // to call). We can use its adress and avoid dynamic allocations. * // Do not forget to implement this member variable. * static const caller_type s_caller; * * }; // class method_caller_N+1 * \endcode * * Then, send us a patch :) * * \author Julien Jorge. */ template< typename SelfClass, typename ParentClass, typename R, R (ParentClass::*Member)() > class method_caller_implement_0 { public: typedef R (ParentClass::*mem_fun_type)(); public: class caller_type: public typed_method_caller { public: caller_type(); private: void explicit_execute ( SelfClass& self, const std::vector& args, const argument_converter& c ) const; }; // class caller_type; public: /** * \brief The instance of the caller. * * A single instance is sufficient since there is no member variables in * caller_type (s_caller only does the transition toward the method to * call). We can use its adress and avoid dynamic allocations. */ static const caller_type s_caller; }; // class method_caller_implement_0 /** * \brief Same as method_caller_implement_0 but for a method with a single * parameter. * \author Julien Jorge. */ template< typename SelfClass, typename ParentClass, typename R, typename A0, R (ParentClass::*Member)(A0) > class method_caller_implement_1 { public: typedef R (ParentClass::*mem_fun_type)(A0); public: class caller_type: public typed_method_caller { public: caller_type(); private: void explicit_execute ( SelfClass& self, const std::vector& args, const argument_converter& c ) const; }; // class caller_type public: /** * \brief The instance of the caller. * * A single instance is sufficient since there is no member variables in * caller_type (s_caller only does the transition toward the method to * call). We can use its adress and avoid dynamic allocations. */ static const caller_type s_caller; }; // class method_caller_implement_1 /** * \brief Same as method_caller_implement_0 but for a method with two * parameter. * \author Julien Jorge. */ template< typename SelfClass, typename ParentClass, typename R, typename A0, typename A1, R (ParentClass::*Member)(A0, A1) > class method_caller_implement_2 { public: typedef R (ParentClass::*mem_fun_type)(A0, A1); public: class caller_type: public typed_method_caller { public: caller_type(); private: void explicit_execute ( SelfClass& self, const std::vector& args, const argument_converter& c ) const; }; // class caller_type public: /** * \brief The instance of the caller. * * A single instance is sufficient since there is no member variables in * caller_type (s_caller only does the transition toward the method to * call). We can use its adress and avoid dynamic allocations. */ static const caller_type s_caller; }; // class method_caller_implement_2 /** * \brief Same as method_caller_implement_0 but for a method with three * parameter. * \author Julien Jorge. */ template< typename SelfClass, typename ParentClass, typename R, typename A0, typename A1, typename A2, R (ParentClass::*Member)(A0, A1, A2) > class method_caller_implement_3 { public: typedef R (ParentClass::*mem_fun_type)(A0, A1, A2); public: class caller_type: public typed_method_caller { public: caller_type(); private: void explicit_execute ( SelfClass& self, const std::vector& args, const argument_converter& c ) const; }; // class caller_type public: /** * \brief The instance of the caller. * * A single instance is sufficient since there is no member variables in * caller_type (s_caller only does the transition toward the method to * call). We can use its adress and avoid dynamic allocations. */ static const caller_type s_caller; }; // class method_caller_implement_3 } // namespace text_interface } // namespace bear #include "text_interface/impl/method_caller_implement.tpp" #endif // __TEXT_INTERFACE_METHOD_CALLER_IMPLEMENT_HPP__ plee-the-bear-20251226/bear-engine/core/src/text_interface/string_to_arg.hpp000066400000000000000000000124251512343254000266450ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Convert a string to the equivalent value to pass as an argument for a * character method. * \author Julien Jorge. */ #ifndef __TEXT_INTERFACE_STRING_TO_ARG_HPP__ #define __TEXT_INTERFACE_STRING_TO_ARG_HPP__ #include "text_interface/get_inner_type.hpp" #include #include #include #include namespace bear { namespace text_interface { class argument_converter; /** * \brief Helper class to decide whether an argument is converted using the * default procedure or delegated to the implementation of the * subclass. */ template struct string_to_arg_helper; // Do the default conversion of the argument template struct string_to_arg_helper { /** The type of the result value obtained with this converter. */ typedef typename get_inner_type::type result_type; static result_type convert_argument ( const argument_converter& c, const std::string& arg ); }; // struct string_to_arg_helper [true] // Let the sub class convert the argument. template struct string_to_arg_helper { /** The type of the result value obtained with this converter. */ typedef T result_type; static T convert_argument ( const argument_converter& c, const std::string& arg ); }; // struct string_to_arg_helper [false] // Let the sub class convert the argument. template struct string_to_arg_helper { /** The type of the result value obtained with this converter. */ typedef T& result_type; static result_type convert_argument ( const argument_converter& c, const std::string& arg ); }; // struct string_to_arg_helper [false] // Let the sub class convert the argument. template struct string_to_arg_helper { /** The type of the result value obtained with this converter. */ typedef const T& result_type; static result_type convert_argument ( const argument_converter& c, const std::string& arg ); }; // struct string_to_arg_helper [false] /** * \brief Convert a string to the equivalent value to pass as an argument * for a character method. * \author Julien Jorge. */ template struct string_to_arg: public string_to_arg_helper < T, claw::meta::type_list_contains < T, claw::meta::cpp_type_list >::result > { }; // struct string_to_arg /** * \brief Convert a string to the equivalent value to pass as an argument * for a character method. * \author Julien Jorge. */ template struct string_to_arg: public string_to_arg_helper < const T&, claw::meta::type_list_contains < T, claw::meta::cpp_type_list >::result > { }; // struct string_to_arg /** * \brief Specialisation for std::string. There is no conversion to do. * \author Sébastien Angibaud */ template<> struct string_to_arg { /** The type of the result value obtained with this converter. */ typedef std::string result_type; static std::string convert_argument ( const argument_converter& c, const std::string& arg ); }; // struct string_to_arg [std::string] /** * \brief Specialisation for std::string&. There is no conversion to do. * \author Sébastien Angibaud */ template<> struct string_to_arg: public string_to_arg { }; // struct string_to_arg [std::string&] /** * \brief Specialisation for const std::string&. There is no conversion to * do. * \author Sébastien Angibaud */ template<> struct string_to_arg: public string_to_arg { }; // struct string_to_arg [const std::string&] /** * \brief Convert a string to the equivalent sequence of value to pass as an * argument for a character method. * \author Julien Jorge */ template struct string_to_sequence_arg { public: typedef Sequence result_type; static result_type convert_argument ( const argument_converter& c, const std::string& arg ); }; // struct string_to_sequence_arg /** * \brief Specialisation for std::vector. * \author Julien Jorge */ template struct string_to_arg< const std::vector& >: public string_to_sequence_arg< std::vector > { }; /** * \brief Specialisation for std::list. * \author Julien Jorge */ template struct string_to_arg< const std::list& >: public string_to_sequence_arg< std::list > { }; } // namespace text_interface } // namespace bear #include "text_interface/impl/string_to_arg.tpp" #endif // __TEXT_INTERFACE_STRING_TO_ARG_HPP__ plee-the-bear-20251226/bear-engine/core/src/text_interface/typed_method_caller.hpp000066400000000000000000000035421512343254000300130ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Base class for calling a method of an instance given the string * representation of the value of the arguments. Contrary to * method_caller, this class cast the instance to a given type. * \author Julien Jorge. */ #ifndef __TEXT_INTERFACE_TYPED_METHOD_CALLER_HPP__ #define __TEXT_INTERFACE_TYPED_METHOD_CALLER_HPP__ #include #include #include "text_interface/method_caller.hpp" namespace bear { namespace text_interface { /** * \brief Base class for calling a method of an instance given the string * representation of the value of the arguments. Contrary to * method_caller, this class cast the instance to a given type. * * \author Julien Jorge. */ template class typed_method_caller: public method_caller { public: /** * \brief Execute a method of a given instance. * \param self The instance on which the method is called. * \param args The string representation of the value of the arguments * passed to the method. * \param c The converter used to convert the arguments. */ virtual void explicit_execute ( SelfClass& self, const std::vector& args, const argument_converter& c ) const = 0; private: void execute ( base_exportable* self, const std::vector& args, const argument_converter& c ) const; }; // class typed_method_caller } // namespace text_interface } // namespace bear #include "text_interface/impl/typed_method_caller.tpp" #endif // __TEXT_INTERFACE_TYPED_METHOD_CALLER_HPP__ plee-the-bear-20251226/bear-engine/core/src/time/000077500000000000000000000000001512343254000212215ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/core/src/time/CMakeLists.txt000066400000000000000000000007451512343254000237670ustar00rootroot00000000000000set( TIME_TARGET_NAME bear_time ) #------------------------------------------------------------------------------- set( TIME_SOURCE_FILES code/time.cpp ) add_library( ${TIME_TARGET_NAME} ${BEAR_ENGINE_CORE_LINK_TYPE} ${TIME_SOURCE_FILES} ) set_target_properties( ${TIME_TARGET_NAME} PROPERTIES INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/${BEAR_ENGINE_INSTALL_LIBRARY_DIR}" ) install( TARGETS ${TIME_TARGET_NAME} DESTINATION ${BEAR_ENGINE_INSTALL_LIBRARY_DIR} ) plee-the-bear-20251226/bear-engine/core/src/time/class_export.hpp000066400000000000000000000014061512343254000244410ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Definition of the TIME_EXPORT macro according to the fact that we * create the library or link to it. * \author Julien Jorge */ #ifndef __TIME_CLASS_EXPORT_HPP__ #define __TIME_CLASS_EXPORT_HPP__ #ifndef TIME_EXPORT # ifdef _WIN32 # ifdef bear_time_EXPORTS # define TIME_EXPORT __declspec(dllexport) # else # define TIME_EXPORT __declspec(dllimport) # endif // def bear_time_EXPORTS # else // def _WIN32 # define TIME_EXPORT # endif // def _WIN32 #endif // ndef TIME_EXPORT #endif // __TIME_CLASS_EXPORT_HPP__ plee-the-bear-20251226/bear-engine/core/src/time/code/000077500000000000000000000000001512343254000221335ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/core/src/time/code/time.cpp000066400000000000000000000030521512343254000235750ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the free functions of the namespace bear::systime. * \author Julien Jorge. */ #include "time/time.hpp" #ifdef _WIN32 #include "time/code/time_win32.cpp" #else // _WIN32 #include "time/code/time_unix.cpp" #endif #include #include #include /*----------------------------------------------------------------------------*/ /** * \brief Get the unix date, in seconds since January 1, 1970. */ bear::systime::seconds_type TIME_EXPORT bear::systime::get_unix_time() { std::time_t t = std::time(NULL); return static_cast( t ); } // get_unix_time() /*----------------------------------------------------------------------------*/ /** * \brief Get a string representation of a time in seconds according to a given * format. * \param t The time. * \param format The format. * \sa std::time_put. */ std::string TIME_EXPORT bear::systime::format_time_s ( unsigned long t, const std::string& format ) { std::locale loc; const std::time_put& tmput = std::use_facet< std::time_put >(loc); std::tm date; std::ostringstream oss; date.tm_sec = t % 60; t /= 60.; date.tm_min = t % 60; t /= 60.; date.tm_hour = t; tmput.put ( oss, oss, ' ', &date, format.c_str(), format.c_str() + format.length() ); return oss.str(); } // format_time() plee-the-bear-20251226/bear-engine/core/src/time/code/time_unix.cpp000066400000000000000000000021341512343254000246400ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Unix implementation of the functions of the namespace bear::systime. * \author Julien Jorge. */ #include #include #include #include /*----------------------------------------------------------------------------*/ /** * \brief Stop the process for a given amount of time. * \param ms Stop the process this number of milliseconds. */ void bear::systime::sleep( milliseconds_type ms ) { struct timespec time; time.tv_sec = ms / 1000; time.tv_nsec = ( ms % 1000 ) * ( 1000 * 1000 ); nanosleep( &time, NULL ); } // sleep() /*----------------------------------------------------------------------------*/ /** * \brief Get the current date, in milliseconds. */ bear::systime::milliseconds_type bear::systime::get_date_ms() { timeval tv; gettimeofday( &tv, NULL ); return tv.tv_sec * 1000 + tv.tv_usec / 1000; } // get_date_ms() plee-the-bear-20251226/bear-engine/core/src/time/code/time_win32.cpp000066400000000000000000000020441512343254000246170ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief MS Windows implementation of the functions of the namespace * bear::systime. * \author Julien Jorge. */ #include /*----------------------------------------------------------------------------*/ /** * \brief Stop the process for a given amount of time. * \param ms Stop the process this number of milliseconds. */ void TIME_EXPORT bear::systime::sleep( milliseconds_type ms ) { Sleep( (DWORD)ms ); } // sleep() /*----------------------------------------------------------------------------*/ /** * \brief Get the current date, in milliseconds. */ bear::systime::milliseconds_type TIME_EXPORT bear::systime::get_date_ms() { LARGE_INTEGER freq, c; QueryPerformanceFrequency(&freq); QueryPerformanceCounter(&c); return (milliseconds_type)((c.QuadPart * 1000) / freq.QuadPart); } // get_date_ms() plee-the-bear-20251226/bear-engine/core/src/time/time.hpp000066400000000000000000000015341512343254000226730ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Some functions and types related to time management. * \author Julien Jorge. */ #ifndef __TIME_TIME_HPP__ #define __TIME_TIME_HPP__ #include "time/class_export.hpp" #include namespace bear { namespace systime { typedef unsigned long milliseconds_type; typedef unsigned long seconds_type; void TIME_EXPORT sleep( milliseconds_type ms ); milliseconds_type TIME_EXPORT get_date_ms(); seconds_type TIME_EXPORT get_unix_time(); std::string TIME_EXPORT format_time_s ( unsigned long t, const std::string& format ); } // namespace systime } // namespace bear #endif // __TIME_TIME_HPP__ plee-the-bear-20251226/bear-engine/core/src/universe/000077500000000000000000000000001512343254000221235ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/core/src/universe/CMakeLists.txt000066400000000000000000000045021512343254000246640ustar00rootroot00000000000000set( UNIVERSE_TARGET_NAME bear_universe ) #------------------------------------------------------------------------------- set( UNIVERSE_SOURCE_FILES alignment/code/align_bottom.cpp alignment/code/align_bottom_left.cpp alignment/code/align_bottom_right.cpp alignment/code/align_left.cpp alignment/code/alignment.cpp alignment/code/align_right.cpp alignment/code/align_top.cpp alignment/code/align_top_left.cpp alignment/code/align_top_right.cpp code/collision_align_policy.cpp code/collision_info.cpp code/collision_repair.cpp code/const_item_handle.cpp code/contact_info.cpp code/contact_mode.cpp code/contact_range.cpp code/density_rectangle.cpp code/environment_rectangle.cpp code/force_rectangle.cpp code/friction_rectangle.cpp code/item_handle.cpp code/item_picking_filter.cpp code/physical_item.cpp code/physical_item_attributes.cpp code/physical_item_state.cpp code/world.cpp code/world_progress_structure.cpp code/zone.cpp forced_movement/code/base_forced_movement.cpp forced_movement/code/center_of_mass_reference_point.cpp forced_movement/code/forced_aiming.cpp forced_movement/code/forced_goto.cpp forced_movement/code/forced_join.cpp forced_movement/code/forced_movement.cpp forced_movement/code/forced_movement_function.cpp forced_movement/code/forced_rotation.cpp forced_movement/code/forced_sequence.cpp forced_movement/code/forced_stay_around.cpp forced_movement/code/forced_tracking.cpp forced_movement/code/forced_translation.cpp forced_movement/code/natural_forced_movement.cpp forced_movement/code/ratio_reference_point.cpp forced_movement/code/reference_point.cpp forced_movement/code/sinus_speed_generator.cpp internal/code/item_selection.cpp link/code/base_link.cpp link/code/chain_link.cpp link/code/link.cpp shape/code/curved_box.cpp shape/code/shape_base.cpp shape/code/rectangle.cpp shape/code/shape.cpp ) add_library( ${UNIVERSE_TARGET_NAME} ${BEAR_ENGINE_CORE_LINK_TYPE} ${UNIVERSE_SOURCE_FILES} ) set_target_properties( ${UNIVERSE_TARGET_NAME} PROPERTIES INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/${BEAR_ENGINE_INSTALL_LIBRARY_DIR}" ) install( TARGETS ${UNIVERSE_TARGET_NAME} DESTINATION ${BEAR_ENGINE_INSTALL_LIBRARY_DIR} ) target_link_libraries( ${UNIVERSE_TARGET_NAME} ${CLAW_LOGGER_LIBRARIES} ) plee-the-bear-20251226/bear-engine/core/src/universe/alignment/000077500000000000000000000000001512343254000241015ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/core/src/universe/alignment/align_bottom.hpp000066400000000000000000000015621512343254000272740ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Align a rectangle at the bottom of an other. * \author Julien Jorge */ #ifndef __UNIVERSE_ALIGN_BOTTOM_HPP__ #define __UNIVERSE_ALIGN_BOTTOM_HPP__ #include "universe/alignment/alignment.hpp" namespace bear { namespace universe { /** * \brief Align a rectangle at the bottom of another. */ class UNIVERSE_EXPORT align_bottom: public alignment { public: virtual void align ( const rectangle_type& this_box, const position_type& that_old_pos, rectangle_type& that_new_box ) const; }; // class align_bottom } // namespace universe } // namespace bear #endif // __UNIVERSE_ALIGN_BOTTOM_HPP__ plee-the-bear-20251226/bear-engine/core/src/universe/alignment/align_bottom_left.hpp000066400000000000000000000024631512343254000303070ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Align a box at the bottom or on the left, according to the first * touched edge. * \author Julien Jorge */ #ifndef __UNIVERSE_ALIGN_BOTTOM_LEFT_HPP__ #define __UNIVERSE_ALIGN_BOTTOM_LEFT_HPP__ #include "universe/alignment/alignment.hpp" namespace bear { namespace universe { /** * \brief Align a box at the bottom or on the left, according to the first * touched edge. */ class UNIVERSE_EXPORT align_bottom_left: public alignment { public: virtual void align ( const rectangle_type& this_box, const position_type& that_old_pos, rectangle_type& that_new_box ) const; private: void align_bottom ( const rectangle_type& this_box, rectangle_type& that_new_box, const claw::math::line_2d& dir ) const; void align_left ( const rectangle_type& this_box, rectangle_type& that_new_box, const claw::math::line_2d& dir ) const; }; // class align_bottom_left } // namespace universe } // namespace bear #endif // __UNIVERSE_ALIGN_BOTTOM_LEFT_HPP__ plee-the-bear-20251226/bear-engine/core/src/universe/alignment/align_bottom_right.hpp000066400000000000000000000024731512343254000304730ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Align a box at the bottom or on the right, according to the first * touched edge. * \author Julien Jorge */ #ifndef __UNIVERSE_ALIGN_BOTTOM_RIGHT_HPP__ #define __UNIVERSE_ALIGN_BOTTOM_RIGHT_HPP__ #include "universe/alignment/alignment.hpp" namespace bear { namespace universe { /** * \brief Align a box at the bottom or on the right, according to the first * touched edge. */ class UNIVERSE_EXPORT align_bottom_right: public alignment { public: virtual void align ( const rectangle_type& this_box, const position_type& that_old_pos, rectangle_type& that_new_box ) const; private: void align_bottom ( const rectangle_type& this_box, rectangle_type& that_new_box, const claw::math::line_2d& dir ) const; void align_right ( const rectangle_type& this_box, rectangle_type& that_new_box, const claw::math::line_2d& dir ) const; }; // class align_bottom_right } // namespace universe } // namespace bear #endif // __UNIVERSE_ALIGN_BOTTOM_RIGHT_HPP__ plee-the-bear-20251226/bear-engine/core/src/universe/alignment/align_left.hpp000066400000000000000000000015451512343254000267230ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Align a rectangle on the left of an other. * \author Julien Jorge */ #ifndef __UNIVERSE_ALIGN_LEFT_HPP__ #define __UNIVERSE_ALIGN_LEFT_HPP__ #include "universe/alignment/alignment.hpp" namespace bear { namespace universe { /** * \brief Align a rectangle on the left of an other. */ class UNIVERSE_EXPORT align_left: public alignment { public: virtual void align ( const rectangle_type& this_box, const position_type& that_old_pos, rectangle_type& that_new_box ) const; }; // class align_left } // namespace universe } // namespace bear #endif // __UNIVERSE_ALIGN_LEFT_HPP__ plee-the-bear-20251226/bear-engine/core/src/universe/alignment/align_right.hpp000066400000000000000000000015541512343254000271060ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Align a rectangle on the right of an other. * \author Julien Jorge */ #ifndef __UNIVERSE_ALIGN_RIGHT_HPP__ #define __UNIVERSE_ALIGN_RIGHT_HPP__ #include "universe/alignment/alignment.hpp" namespace bear { namespace universe { /** * \brief Align a rectangle on the right of an other. */ class UNIVERSE_EXPORT align_right: public alignment { public: virtual void align ( const rectangle_type& this_box, const position_type& that_old_pos, rectangle_type& that_new_box ) const; }; // class align_right } // namespace universe } // namespace bear #endif // __UNIVERSE_ALIGN_RIGHT_HPP__ plee-the-bear-20251226/bear-engine/core/src/universe/alignment/align_top.hpp000066400000000000000000000016031512343254000265660ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Align a rectangle at the top of an other. * \author Julien Jorge */ #ifndef __UNIVERSE_ALIGN_TOP_HPP__ #define __UNIVERSE_ALIGN_TOP_HPP__ #include "universe/alignment/alignment.hpp" #include "universe/class_export.hpp" namespace bear { namespace universe { /** * \brief Align a rectangle at the top of an other. */ class UNIVERSE_EXPORT align_top: public alignment { public: virtual void align ( const rectangle_type& this_box, const position_type& that_old_pos, rectangle_type& that_new_box ) const; }; // class align_top } // namespace universe } // namespace bear #endif // __UNIVERSE_ALIGN_TOP_HPP__ plee-the-bear-20251226/bear-engine/core/src/universe/alignment/align_top_left.hpp000066400000000000000000000024331512343254000276020ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Align a box at the top or on the left, according to the first * touched edge. * \author Julien Jorge */ #ifndef __UNIVERSE_ALIGN_TOP_LEFT_HPP__ #define __UNIVERSE_ALIGN_TOP_LEFT_HPP__ #include "universe/alignment/alignment.hpp" namespace bear { namespace universe { /** * \brief Align a box at the top or on the left, according to the first * touched edge. */ class UNIVERSE_EXPORT align_top_left: public alignment { public: virtual void align ( const rectangle_type& this_box, const position_type& that_old_pos, rectangle_type& that_new_box ) const; private: void align_top ( const rectangle_type& this_box, rectangle_type& that_new_box, const claw::math::line_2d& dir ) const; void align_left ( const rectangle_type& this_box, rectangle_type& that_new_box, const claw::math::line_2d& dir ) const; }; // class align_top_left } // namespace universe } // namespace bear #endif // __UNIVERSE_ALIGN_TOP_LEFT_HPP__ plee-the-bear-20251226/bear-engine/core/src/universe/alignment/align_top_right.hpp000066400000000000000000000024431512343254000277660ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Align a box at the top or on the right, according to the first * touched edge. * \author Julien Jorge */ #ifndef __UNIVERSE_ALIGN_TOP_RIGHT_HPP__ #define __UNIVERSE_ALIGN_TOP_RIGHT_HPP__ #include "universe/alignment/alignment.hpp" namespace bear { namespace universe { /** * \brief Align a box at the top or on the right, according to the first * touched edge. */ class UNIVERSE_EXPORT align_top_right: public alignment { public: virtual void align ( const rectangle_type& this_box, const position_type& that_old_pos, rectangle_type& that_new_box ) const; private: void align_top ( const rectangle_type& this_box, rectangle_type& that_new_box, const claw::math::line_2d& dir ) const; void align_right ( const rectangle_type& this_box, rectangle_type& that_new_box, const claw::math::line_2d& dir ) const; }; // class align_top_right } // namespace universe } // namespace bear #endif // __UNIVERSE_ALIGN_TOP_RIGHT_HPP__ plee-the-bear-20251226/bear-engine/core/src/universe/alignment/alignment.hpp000066400000000000000000000016431512343254000265740ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Base class for rectangle alignment. * \author Julien Jorge */ #ifndef __UNIVERSE_ALIGNMENT_HPP__ #define __UNIVERSE_ALIGNMENT_HPP__ #include #include "universe/types.hpp" #include "universe/class_export.hpp" namespace bear { namespace universe { /** * \brief Base class for rectangle alignment. * \author Julien Jorge */ class UNIVERSE_EXPORT alignment { public: virtual ~alignment(); virtual void align ( const rectangle_type& this_box, const position_type& that_old_pos, rectangle_type& that_new_box ) const; }; // class alignment } // namespace universe } // namespace bear #endif // __UNIVERSE_ALIGNMENT_HPP__ plee-the-bear-20251226/bear-engine/core/src/universe/alignment/alignment_type.hpp000066400000000000000000000064141512343254000276360ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief This is tool class that helps us to get the alignment class * corresponding to a given zone. * \author Julien Jorge */ #ifndef __UNIVERSE_ALIGNMENT_TYPE_HPP__ #define __UNIVERSE_ALIGNMENT_TYPE_HPP__ #include "universe/zone.hpp" #include "universe/alignment/align_top_left.hpp" #include "universe/alignment/align_top.hpp" #include "universe/alignment/align_top_right.hpp" #include "universe/alignment/align_left.hpp" #include "universe/alignment/align_right.hpp" #include "universe/alignment/align_bottom_left.hpp" #include "universe/alignment/align_bottom.hpp" #include "universe/alignment/align_bottom_right.hpp" namespace bear { namespace universe { /** * \brief This is tool class that helps us to get the alignment class * corresponding to a given zone. * \author Julien Jorge */ template class alignment_type { // nothing }; // class alignment_type /** * \brief Specialization for the top left zone. * \author Julien Jorge */ template<> class alignment_type { public: typedef align_top_left type; }; // class alignment_type [top_left_zone] /** * \brief Specialization for the top zone. * \author Julien Jorge */ template<> class alignment_type { public: typedef align_top type; }; // class alignment_type [top_zone] /** * \brief Specialization for the top right zone. * \author Julien Jorge */ template<> class alignment_type { public: typedef align_top_right type; }; // class alignment_type [top_right_zone] /** * \brief Specialization for the middle left zone. * \author Julien Jorge */ template<> class alignment_type { public: typedef align_left type; }; // class alignment_type [middle_left_zone] /** * \brief Specialization for the middle right zone. * \author Julien Jorge */ template<> class alignment_type { public: typedef align_right type; }; // class alignment_type [middle_right_zone] /** * \brief Specialization for the bottom left zone. * \author Julien Jorge */ template<> class alignment_type { public: typedef align_bottom_left type; }; // class alignment_type [bottom_left_zone] /** * \brief Specialization for the bottom zone. * \author Julien Jorge */ template<> class alignment_type { public: typedef align_bottom type; }; // class alignment_type [bottom_zone] /** * \brief Specialization for the bottom right zone. * \author Julien Jorge */ template<> class alignment_type { public: typedef align_bottom_right type; }; // class alignment_type [bottom_right_zone] } // namespace universe } // namespace bear #endif // __UNIVERSE_ALIGNMENT_TYPE_HPP__ plee-the-bear-20251226/bear-engine/core/src/universe/alignment/code/000077500000000000000000000000001512343254000250135ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/core/src/universe/alignment/code/align_bottom.cpp000066400000000000000000000016141512343254000301770ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::universe::align_bottom class. * \author Julien Jorge */ #include "universe/alignment/align_bottom.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Align one box at the bottom of an other one. * \param this_box The box to which we will align the other. * \param that_old_pos The position from where comes the other box. * \param that_new_box (in/out) The box we will align. */ void bear::universe::align_bottom::align ( const rectangle_type& this_box, const position_type& that_old_pos, rectangle_type& that_new_box ) const { that_new_box.top( this_box.bottom() ); } // align_bottom::align() plee-the-bear-20251226/bear-engine/core/src/universe/alignment/code/align_bottom_left.cpp000066400000000000000000000060201512343254000312050ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::universe::align_bottom_left class. * \author Julien Jorge */ #include "universe/alignment/align_bottom_left.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Align a box at the bottom or on the left, according to the first * touched edge. * \param this_box The box to which we will align the other. * \param that_old_pos The position from where comes the other box. * \param that_new_box (in/out) The position of the box we will align. */ void bear::universe::align_bottom_left::align ( const rectangle_type& this_box, const position_type& that_old_pos, rectangle_type& that_new_box ) const { claw::math::line_2d dir, ortho; position_type inter; dir.origin = that_old_pos + that_new_box.size(); dir.direction = dir.origin - that_new_box.top_right(); ortho.origin = this_box.bottom_left(); ortho.direction = dir.direction.get_orthonormal_anticlockwise(); inter = dir.intersection( ortho ); if ( inter.x < this_box.left() ) align_left(this_box, that_new_box, dir); else if ( inter.x > this_box.left() ) align_bottom(this_box, that_new_box, dir); else that_new_box.top_right( inter ); } // align_bottom_left::align() /*----------------------------------------------------------------------------*/ /** * \brief Align a box at the bottom. * \param this_box The box to which we will align the other. * \param that_new_box (in/out) The position of the box we will align. * \param dir A line representing the movement of the top right corner of the * other box. */ void bear::universe::align_bottom_left::align_bottom ( const rectangle_type& this_box, rectangle_type& that_new_box, const claw::math::line_2d& dir ) const { claw::math::line_2d edge; position_type inter; edge.origin = this_box.bottom_left(); edge.direction.x = 1; edge.direction.y = 0; inter = dir.intersection( edge ); that_new_box.top_right( inter ); } // align_bottom_left::align_bottom() /*----------------------------------------------------------------------------*/ /** * \brief Align a box on the left. * \param this_box The box to which we will align the other. * \param that_new_box (in/out) The position of the box we will align. * \param dir A line representing the movement of the top right corner of the * other box. */ void bear::universe::align_bottom_left::align_left ( const rectangle_type& this_box, rectangle_type& that_new_box, const claw::math::line_2d& dir ) const { claw::math::line_2d edge; position_type inter; edge.origin = this_box.top_left(); edge.direction.x = 0; edge.direction.y = 1; inter = edge.intersection( dir ); that_new_box.top_right( inter ); } // align_bottom_left::align_left() plee-the-bear-20251226/bear-engine/core/src/universe/alignment/code/align_bottom_right.cpp000066400000000000000000000061041512343254000313730ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief implementation of the bear::universe::align_bottom_right class. * \author Julien Jorge */ #include "universe/alignment/align_bottom_right.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Align a box at the bottom or on the right, according to the first * touched edge. * \param this_box The box to which we will align the other. * \param that_old_pos The position from where comes the other box. * \param that_new_box (in/out) The position of the box we will align. */ void bear::universe::align_bottom_right::align ( const rectangle_type& this_box, const position_type& that_old_pos, rectangle_type& that_new_box ) const { claw::math::line_2d dir, ortho; position_type inter; dir.origin.x = that_old_pos.x; dir.origin.y = that_old_pos.y + that_new_box.height(); dir.direction = dir.origin - that_new_box.top_left(); ortho.origin = this_box.bottom_right(); ortho.direction = dir.direction.get_orthonormal_anticlockwise(); inter = dir.intersection( ortho ); if ( inter.x < this_box.right() ) align_bottom(this_box, that_new_box, dir); else if ( inter.x > this_box.right() ) align_right(this_box, that_new_box, dir); else that_new_box.top_left( inter ); } // align_bottom_right::align() /*----------------------------------------------------------------------------*/ /** * \brief Align a box at the bottom. * \param this_box The box to which we will align the other. * \param that_new_box (in/out) The position of the box we will align. * \param dir A line representing the movement of the top right corner of the * other box. */ void bear::universe::align_bottom_right::align_bottom ( const rectangle_type& this_box, rectangle_type& that_new_box, const claw::math::line_2d& dir ) const { claw::math::line_2d edge; position_type inter; edge.origin = this_box.bottom_left(); edge.direction.x = 1; edge.direction.y = 0; inter = dir.intersection( edge ); that_new_box.top_left( inter ); } // align_bottom_right::align_bottom() /*----------------------------------------------------------------------------*/ /** * \brief Align a box on the right. * \param this_box The box to which we will align the other. * \param that_new_box (in/out) The position of the box we will align. * \param dir A line representing the movement of the top right corner of the * other box. */ void bear::universe::align_bottom_right::align_right ( const rectangle_type& this_box, rectangle_type& that_new_box, const claw::math::line_2d& dir ) const { claw::math::line_2d edge; position_type inter; edge.origin = this_box.top_right(); edge.direction.x = 0; edge.direction.y = 1; inter = edge.intersection( dir ); that_new_box.top_left( inter ); } // align_bottom_right::align_right() plee-the-bear-20251226/bear-engine/core/src/universe/alignment/code/align_left.cpp000066400000000000000000000016001512343254000276200ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::universe::align_left class. * \author Julien Jorge */ #include "universe/alignment/align_left.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Align a rectangle on the left of an other. * \param this_box The box to which we will align the other. * \param that_old_pos The position from where comes the other box. * \param that_new_box (in/out) The box we will align. */ void bear::universe::align_left::align ( const rectangle_type& this_box, const position_type& that_old_pos, rectangle_type& that_new_box ) const { that_new_box.right(this_box.left()); } // align_left::align() plee-the-bear-20251226/bear-engine/core/src/universe/alignment/code/align_right.cpp000066400000000000000000000016051512343254000300100ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::universe::align_right class. * \author Julien Jorge */ #include "universe/alignment/align_right.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Align a rectangle on the right of an other. * \param this_box The box to which we will align the other. * \param that_old_pos The position from where comes the other box. * \param that_new_box (in/out) The box we will align. */ void bear::universe::align_right::align ( const rectangle_type& this_box, const position_type& that_old_pos, rectangle_type& that_new_box ) const { that_new_box.left(this_box.right()); } // align_right::align() plee-the-bear-20251226/bear-engine/core/src/universe/alignment/code/align_top.cpp000066400000000000000000000015721512343254000275000ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief implementation of the bear::universe::align_up class. * \author Julien Jorge */ #include "universe/alignment/align_top.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Align a rectangle at the top of an other. * \param this_box The box to which we will align the other. * \param that_old_pos The position from where comes the other box. * \param that_new_box (in/out) The box we will align. */ void bear::universe::align_top::align ( const rectangle_type& this_box, const position_type& that_old_pos, rectangle_type& that_new_box ) const { that_new_box.bottom(this_box.top()); } // align_top::align() plee-the-bear-20251226/bear-engine/core/src/universe/alignment/code/align_top_left.cpp000066400000000000000000000060251512343254000305100ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief implementation of the bear::universe::align_top_left class. * \author Julien Jorge */ #include "universe/alignment/align_top_left.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Align a box at the top or on the left, according to the first * touched edge. * \param this_box The box to which we will align the other. * \param that_old_pos The position from where comes the other box. * \param that_new_box (in/out) The position of the box we will align. */ void bear::universe::align_top_left::align ( const rectangle_type& this_box, const position_type& that_old_pos, rectangle_type& that_new_box ) const { claw::math::line_2d dir, ortho; position_type inter; dir.origin.x = that_old_pos.x + that_new_box.width(); dir.origin.y = that_old_pos.y; dir.direction = dir.origin - that_new_box.bottom_right(); ortho.origin = this_box.top_left(); ortho.direction = dir.direction.get_orthonormal_anticlockwise(); inter = dir.intersection( ortho ); if ( inter.x < this_box.left() ) align_left(this_box, that_new_box, dir); else if ( inter.x > this_box.left() ) align_top(this_box, that_new_box, dir); else that_new_box.bottom_right( inter ); } // align_top_left::align() /*----------------------------------------------------------------------------*/ /** * \brief Align a box at the top. * \param this_box The box to which we will align the other. * \param that_new_box (in/out) The position of the box we will align. * \param dir A line representing the movement of the top right corner of the * other box. */ void bear::universe::align_top_left::align_top ( const rectangle_type& this_box, rectangle_type& that_new_box, const claw::math::line_2d& dir ) const { claw::math::line_2d edge; position_type inter; edge.origin = this_box.top_left(); edge.direction.x = 1; edge.direction.y = 0; inter = dir.intersection( edge ); that_new_box.bottom_right( inter ); } // align_top_left::align_top() /*----------------------------------------------------------------------------*/ /** * \brief Align a box on the left. * \param this_box The box to which we will align the other. * \param that_new_box (in/out) The position of the box we will align. * \param dir A line representing the movement of the top right corner of the * other box. */ void bear::universe::align_top_left::align_left ( const rectangle_type& this_box, rectangle_type& that_new_box, const claw::math::line_2d& dir ) const { claw::math::line_2d edge; position_type inter; edge.origin = this_box.top_left(); edge.direction.x = 0; edge.direction.y = 1; inter = edge.intersection( dir ); that_new_box.bottom_right( inter ); } // align_top_left::align_left() plee-the-bear-20251226/bear-engine/core/src/universe/alignment/code/align_top_right.cpp000066400000000000000000000062061512343254000306740ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief implementation of the bear::universe::align_top_right class. * \author Julien Jorge */ #include "universe/alignment/align_top_right.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Align a box at the top or on the right, according to the first * touched edge. * \param this_box The box to which we will align the other. * \param that_old_pos The position from where comes the other box. * \param that_new_box (in/out) The position of the box we will align. */ void bear::universe::align_top_right::align ( const bear::universe::rectangle_type& this_box, const bear::universe::position_type& that_old_pos, bear::universe::rectangle_type& that_new_box ) const { claw::math::line_2d dir, ortho; bear::universe::position_type inter; dir.origin = that_old_pos; dir.direction = that_old_pos - that_new_box.bottom_left(); ortho.origin = this_box.top_right(); ortho.direction = dir.direction.get_orthonormal_anticlockwise(); inter = dir.intersection( ortho ); if ( inter.y < this_box.top() ) align_right(this_box, that_new_box, dir); else if ( inter.y > this_box.top() ) align_top(this_box, that_new_box, dir); else that_new_box.bottom_left( inter ); } // align_top_right::align() /*----------------------------------------------------------------------------*/ /** * \brief Align a box at the top. * \param this_box The box to which we will align the other. * \param that_new_box (in/out) The position of the box we will align. * \param dir A line representing the movement of the top right corner of the * other box. */ void bear::universe::align_top_right::align_top ( const bear::universe::rectangle_type& this_box, bear::universe::rectangle_type& that_new_box, const claw::math::line_2d& dir ) const { claw::math::line_2d edge; bear::universe::position_type inter; edge.origin = this_box.top_left(); edge.direction.x = 1; edge.direction.y = 0; inter = dir.intersection( edge ); that_new_box.bottom_left( inter ); } // align_top_right::align_top /*----------------------------------------------------------------------------*/ /** * \brief Align a box on the right. * \param this_box The box to which we will align the other. * \param that_new_box (in/out) The position of the box we will align. * \param dir A line representing the movement of the top right corner of the * other box. */ void bear::universe::align_top_right::align_right ( const bear::universe::rectangle_type& this_box, bear::universe::rectangle_type& that_new_box, const claw::math::line_2d& dir ) const { claw::math::line_2d edge; bear::universe::position_type inter; edge.origin = this_box.top_right(); edge.direction.x = 0; edge.direction.y = 1; inter = edge.intersection( dir ); that_new_box.bottom_left( inter ); } // align_top_right::align_right plee-the-bear-20251226/bear-engine/core/src/universe/alignment/code/alignment.cpp000066400000000000000000000022231512343254000274740ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief implementation of the bear::universe::alignment class. * \author Julien Jorge */ #include "universe/alignment/alignment.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Destructor. */ bear::universe::alignment::~alignment() { // nothing to do } // alignment::~alignment() /*----------------------------------------------------------------------------*/ /** * \brief Align one box with another. * \param this_box The box to which we will align the other. * \param that_old_pos The position from where comes the other box. * \param that_new_box (in/out) The box we will align. * \remark This method does nothing. */ void bear::universe::alignment::align ( const bear::universe::rectangle_type& this_box, const bear::universe::position_type& that_old_pos, bear::universe::rectangle_type& that_new_box ) const { that_new_box.bottom_left( that_old_pos ); } // alignment::align() plee-the-bear-20251226/bear-engine/core/src/universe/class_export.hpp000066400000000000000000000014621512343254000253450ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Definition of the UNIVERSE_EXPORT macro according to the fact that we * create the library or link to it. * \author Julien Jorge */ #ifndef __UNIVERSE_CLASS_EXPORT_HPP__ #define __UNIVERSE_CLASS_EXPORT_HPP__ #ifndef UNIVERSE_EXPORT # ifdef _WIN32 # ifdef bear_universe_EXPORTS # define UNIVERSE_EXPORT __declspec(dllexport) # else # define UNIVERSE_EXPORT __declspec(dllimport) # endif // def bear_universe_EXPORTS # else // def _WIN32 # define UNIVERSE_EXPORT # endif // def _WIN32 #endif // ndef UNIVERSE_EXPORT #endif // __UNIVERSE_CLASS_EXPORT_HPP__ plee-the-bear-20251226/bear-engine/core/src/universe/code/000077500000000000000000000000001512343254000230355ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/core/src/universe/code/collision_align_policy.cpp000066400000000000000000000017601512343254000302710ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::universe::collision_align_policy. * \author Julien Jorge */ #include "universe/collision_align_policy.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param c Tells how the contacts are set. */ bear::universe::collision_align_policy::collision_align_policy ( contact_mode::value_type c ) : m_contact_mode( c ) { } // collision_align_policy::collision_align_policy() /*----------------------------------------------------------------------------*/ /** * \brief Tell how the contacts are set. */ bear::universe::contact_mode::value_type bear::universe::collision_align_policy::get_contact_mode() const { return m_contact_mode; } // collision_align_policy::get_contact_mode() plee-the-bear-20251226/bear-engine/core/src/universe/code/collision_info.cpp000066400000000000000000000133161512343254000265530ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ #include "universe/collision_info.hpp" #include "universe/alignment/align_bottom.hpp" #include "universe/alignment/align_bottom_left.hpp" #include "universe/alignment/align_bottom_right.hpp" #include "universe/alignment/align_left.hpp" #include "universe/alignment/align_right.hpp" #include "universe/alignment/align_top.hpp" #include "universe/alignment/align_top_left.hpp" #include "universe/alignment/align_top_right.hpp" #include "universe/collision_repair.hpp" #include "universe/physical_item_state.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param previous_self Previous state of the reference item. * \param previous_that Previous state of the other item. * \param self The reference item. * \param that The other item. * \param repair Informations for repairing the collision. */ bear::universe::collision_info::collision_info ( const physical_item_state& previous_self, const physical_item_state& previous_that, physical_item_state& self, physical_item_state& that, collision_repair& repair ) : m_previous_self( previous_self ), m_previous_other( previous_that ), m_other(that), m_repair(repair) { alignment* align = find_alignment(); apply_alignment( *align, self ); delete align; } // collision_info::collision_info() /*----------------------------------------------------------------------------*/ /** * \brief Get the side of the reference item hit first by the other item. */ bear::universe::zone::position bear::universe::collision_info::get_collision_side() const { return m_side; } // collision_info::get_collision_side() /*----------------------------------------------------------------------------*/ /** * \brief Get the position of the other item when it hit the reference item. */ const bear::universe::position_type& bear::universe::collision_info::get_bottom_left_on_contact() const { return m_position_on_contact; } // collision_info::get_bottom_left_on_contact() /*----------------------------------------------------------------------------*/ /** * \brief Get the previous state of the other item. */ const bear::universe::physical_item_state& bear::universe::collision_info::other_previous_state() const { return m_previous_other; } // collision_info::other_previous_state() /*----------------------------------------------------------------------------*/ /** * \brief Get the previous state of the reference item. */ const bear::universe::physical_item_state& bear::universe::collision_info::reference_previous_state() const { return m_previous_self; } // collision_info::reference_previous_state() /*----------------------------------------------------------------------------*/ /** * \brief Get the other item. */ bear::universe::physical_item_state& bear::universe::collision_info::other_item() const { return m_other; } // collision_info::other_item() /*----------------------------------------------------------------------------*/ /** * \brief Get the informations for repairing the collision. */ bear::universe::collision_repair& bear::universe::collision_info::get_collision_repair() const { return m_repair; } // collision_info::get_collision_repair() /*----------------------------------------------------------------------------*/ /** * \brief Find the correct alignment class to compute the position that the * other item had when the collision occured. */ bear::universe::alignment* bear::universe::collision_info::find_alignment() const { const rectangle_type& self_previous_box( m_previous_self.get_bounding_box() ); const rectangle_type& that_previous_box ( m_previous_other.get_bounding_box() ); zone::position z = zone::find(that_previous_box, self_previous_box ); alignment* result(NULL); switch( z ) { case zone::top_left_zone: result = new align_top_left(); break; case zone::top_zone: result = new align_top(); break; case zone::top_right_zone: result = new align_top_right(); break; case zone::middle_left_zone: result = new align_left(); break; case zone::middle_zone: result = new alignment(); break; case zone::middle_right_zone: result = new align_right(); break; case zone::bottom_left_zone: result = new align_bottom_left(); break; case zone::bottom_zone: result = new align_bottom(); break; case zone::bottom_right_zone: result = new align_bottom_right(); break; default: { CLAW_FAIL( "Invalid side." ); } } return result; } // collision_info::find_alignment() /*----------------------------------------------------------------------------*/ /** * \brief Find the position that the other item had when the collision occured. * \param align The alignment to use to compute the position. * \param self The reference item. */ void bear::universe::collision_info::apply_alignment ( const alignment& align, const physical_item_state& self ) { rectangle_type self_new_box; rectangle_type that_new_box; self_new_box = self.get_bounding_box(); that_new_box = m_other.get_bounding_box(); align.align( self_new_box, m_previous_other.get_bottom_left(), that_new_box ); m_position_on_contact = that_new_box.bottom_left(); m_side = zone::find(that_new_box, self_new_box); // we want m_side to be a side. switch( m_side ) { case zone::top_right_zone: case zone::top_left_zone: m_side = zone::top_zone; break; case zone::bottom_left_zone: case zone::bottom_right_zone: m_side = zone::bottom_zone; break; default: { } } } // collision_info::apply_alignment() plee-the-bear-20251226/bear-engine/core/src/universe/code/collision_repair.cpp000066400000000000000000000067311512343254000271050ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::universe::collision_repair class. * \author Julien Jorge */ #include "universe/collision_repair.hpp" #include "universe/collision_info.hpp" #include "universe/physical_item_state.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param first_item The first item in the collision. * \param second_item The second item in the collision. */ bear::universe::collision_repair::collision_repair ( physical_item_state& first_item, physical_item_state& second_item ) : m_first_item(first_item), m_second_item(second_item), m_contact_normal(0, 0), m_contact_reference(NULL) { } // collision_repair::collision_repair() /*----------------------------------------------------------------------------*/ /** * \brief Set the normal of the contact. * \param ref The item to use as the reference. * \param normal The normal of the contact. */ void bear::universe::collision_repair::set_contact_normal ( const physical_item_state& ref, const vector_type& normal ) { CLAW_PRECOND( (&ref == &m_first_item) || (&ref == &m_second_item) ); if ( &ref == &m_first_item ) m_contact_reference = &m_first_item; else m_contact_reference = &m_second_item; m_contact_normal = normal; } // collision_repair::set_contact_normal() /*----------------------------------------------------------------------------*/ /** * \brief Repair the collision. */ void bear::universe::collision_repair::apply() { if (m_contact_reference != NULL) apply_force_transfert(); } // collision_repair::apply() /*----------------------------------------------------------------------------*/ /** * \brief Apply the transfert of forces in a collision. */ void bear::universe::collision_repair::apply_force_transfert() { physical_item_state* other; if( m_contact_reference == &m_first_item ) other = &m_second_item; else other = &m_first_item; // transfer the forces // Find the velocity in the direction of the contact. const speed_type relative_velocity ( m_contact_reference->get_speed() - other->get_speed() ); const double separating_velocity ( relative_velocity.dot_product(m_contact_normal) ); if ( separating_velocity < 0 ) { // calculate the new separating velocity const double restitution ( m_contact_reference->get_hardness() * other->get_elasticity() + m_contact_reference->get_elasticity() * other->get_hardness() ); const double new_sep_velocity( -separating_velocity * restitution ); const double delta_velocity( new_sep_velocity - separating_velocity ); const double total_inverse_mass ( 1 / m_contact_reference->get_mass() + 1 / other->get_mass() ); if ( total_inverse_mass > 0 ) { const double impulse( delta_velocity / total_inverse_mass ); const speed_type impulse_per_inverse_mass ( m_contact_normal * impulse ); m_contact_reference->set_speed ( m_contact_reference->get_speed() + impulse_per_inverse_mass / m_contact_reference->get_mass() ); other->set_speed ( other->get_speed() - impulse_per_inverse_mass / other->get_mass() ); } } } // collision_repair::apply_force_transfert() plee-the-bear-20251226/bear-engine/core/src/universe/code/const_item_handle.cpp000066400000000000000000000133521512343254000272240ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::universe::const_item_handle class. * \author Julien Jorge */ #include "universe/const_item_handle.hpp" #include "universe/physical_item.hpp" #include /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ bear::universe::const_item_handle::const_item_handle() : m_item(NULL) { } // const_item_handle::const_item_handle() /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param item The item to handle. */ bear::universe::const_item_handle::const_item_handle( const item_type* item ) : m_item(item) { if ( m_item ) m_item->add_handle( this ); } // const_item_handle::const_item_handle() /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param item The item to handle. */ bear::universe::const_item_handle::const_item_handle( const item_type& item ) : m_item(&item) { m_item->add_handle( this ); } // const_item_handle::const_item_handle() /*----------------------------------------------------------------------------*/ /** * \brief Copy constructor. * \param that The handle from which we copy. */ bear::universe::const_item_handle::const_item_handle ( const const_item_handle& that ) : m_item(that.m_item) { if ( m_item ) m_item->add_handle( this ); } // const_item_handle::const_item_handle() /*----------------------------------------------------------------------------*/ /** * \brief Destructor. */ bear::universe::const_item_handle::~const_item_handle() { if ( m_item ) m_item->remove_handle( this ); } // const_item_handle::const_item_handle() /*----------------------------------------------------------------------------*/ /** * \brief Get the pointer. */ const bear::universe::const_item_handle::item_type* bear::universe::const_item_handle::get() const { return m_item; } // const_item_handle::get() /*----------------------------------------------------------------------------*/ /** * \brief Dereference operator. */ const bear::universe::const_item_handle::item_type& bear::universe::const_item_handle::operator*() const { return *m_item; } // const_item_handle::operator*() /*----------------------------------------------------------------------------*/ /** * \brief Pointer-to-member operator. */ const bear::universe::const_item_handle::item_type* bear::universe::const_item_handle::operator->() const { return m_item; } // const_item_handle::operator->() /*----------------------------------------------------------------------------*/ /** * \brief Assigment operator. * \param item The item to assign. */ bear::universe::const_item_handle& bear::universe::const_item_handle::operator=( const item_type* item ) { if ( m_item != NULL ) m_item->remove_handle( this ); m_item = item; if ( m_item != NULL ) m_item->add_handle( this ); return *this; } // const_item_handle::operator=() /*----------------------------------------------------------------------------*/ /** * \brief Assigment operator. * \param that The item to assign. */ bear::universe::const_item_handle& bear::universe::const_item_handle::operator=( const const_item_handle& that ) { return *this = that.m_item; } // const_item_handle::operator=() /*----------------------------------------------------------------------------*/ /** * \brief Equality. * \param item The pointer to compare to. */ bool bear::universe::const_item_handle::operator== ( const item_type* item ) const { return m_item == item; } // const_item_handle::operator==() /*----------------------------------------------------------------------------*/ /** * \brief Equality. * \param that The pointer to compare to. */ bool bear::universe::const_item_handle::operator== ( const const_item_handle& that ) const { return m_item == that.m_item; } // const_item_handle::operator==() /*----------------------------------------------------------------------------*/ /** * \brief Disequality. * \param item The pointer to compare to. */ bool bear::universe::const_item_handle::operator!= ( const item_type* item ) const { return m_item != item; } // const_item_handle::operator!=() /*----------------------------------------------------------------------------*/ /** * \brief Disequality. * \param that The instance to compare to. */ bool bear::universe::const_item_handle::operator!= ( const const_item_handle& that ) const { return m_item != that.m_item; } // const_item_handle::operator!=() /*----------------------------------------------------------------------------*/ /** * \brief "Less than" operator. * \param that The pointer to compare to. */ bool bear::universe::const_item_handle::operator< ( const const_item_handle& that ) const { return m_item < that.m_item; } // const_item_handle::operator<() /*----------------------------------------------------------------------------*/ /** * \brief Compare a pointer to a physical_item with an item_handle. * \param a The pointer. * \param b The item handle. * \return b == a */ bool operator== ( const bear::universe::physical_item* a, const bear::universe::const_item_handle& b ) { return b == a; } // operator==() /*----------------------------------------------------------------------------*/ /** * \brief Compare a pointer to a physical_item with an item_handle. * \param a The pointer. * \param b The item handle. * \return b != a */ bool operator!= ( const bear::universe::physical_item* a, const bear::universe::const_item_handle& b ) { return b != a; } // operator!=() plee-the-bear-20251226/bear-engine/core/src/universe/code/contact_info.cpp000066400000000000000000000165001512343254000262110ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::universe::contact_info class. * \author Julien Jorge */ #include "universe/contact_info.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ bear::universe::contact_info::contact_info() : m_middle_contact(false) { } // contact_info::contact_info() /*----------------------------------------------------------------------------*/ /** * \brief Get the range of the contacts on the top side. */ const bear::universe::contact_range& bear::universe::contact_info::get_top_contact() const { return m_top_contact; } // contact_info::get_top_contact() /*----------------------------------------------------------------------------*/ /** * \brief Tell if the object has a contact on the top side. */ bool bear::universe::contact_info::has_top_contact() const { return !m_top_contact.empty(); } // contact_info::has_top_contact() /*----------------------------------------------------------------------------*/ /** * \brief Tell that the object has no contact on the top side. */ void bear::universe::contact_info::clear_top_contact() { m_top_contact.clear(); } // contact_info::clear_top_contact() /*----------------------------------------------------------------------------*/ /** * \brief Set the range of the contacts on the top side. * \param left The coordinate where the contact begins. * \param right The coordinate where the contact ends. */ void bear::universe::contact_info::set_top_contact ( coordinate_type left, coordinate_type right ) { m_top_contact = contact_range( left, right ); } // contact_info::set_top_contact() /*----------------------------------------------------------------------------*/ /** * \brief Get the range of the contacts on the bottom side. */ const bear::universe::contact_range& bear::universe::contact_info::get_bottom_contact() const { return m_bottom_contact; } // contact_info::get_bottom_contact() /*----------------------------------------------------------------------------*/ /** * \brief Tell if the object has a contact on the bottom side. */ bool bear::universe::contact_info::has_bottom_contact() const { return !m_bottom_contact.empty(); } // contact_info::has_bottom_contact() /*----------------------------------------------------------------------------*/ /** * \brief Tell that the object has no contact on the bottom side. */ void bear::universe::contact_info::clear_bottom_contact() { m_bottom_contact.clear(); } // contact_info::clear_bottom_contact() /*----------------------------------------------------------------------------*/ /** * \brief Set the range of the contacts on the bottom side. * \param left The coordinate where the contact begins. * \param right The coordinate where the contact ends. */ void bear::universe::contact_info::set_bottom_contact ( coordinate_type left, coordinate_type right ) { m_bottom_contact = contact_range( left, right ); } // contact_info::set_bottom_contact() /*----------------------------------------------------------------------------*/ /** * \brief Get the range of the contacts on the left side. */ const bear::universe::contact_range& bear::universe::contact_info::get_left_contact() const { return m_left_contact; } // contact_info::get_left_contact() /*----------------------------------------------------------------------------*/ /** * \brief Tell if the object has a contact on the left side. */ bool bear::universe::contact_info::has_left_contact() const { return !m_left_contact.empty(); } // contact_info::has_left_contact() /*----------------------------------------------------------------------------*/ /** * \brief Tell that the object has no contact on the left side. */ void bear::universe::contact_info::clear_left_contact() { m_left_contact.clear(); } // contact_info::clear_left_contact() /*----------------------------------------------------------------------------*/ /** * \brief Set the range of the contacts on the left side. * \param bottom The coordinate where the contact begins. * \param top The coordinate where the contact ends. */ void bear::universe::contact_info::set_left_contact ( coordinate_type bottom, coordinate_type top ) { m_left_contact = contact_range( bottom, top ); } // contact_info::set_left_contact() /*----------------------------------------------------------------------------*/ /** * \brief Get the range of the contacts on the right side. */ const bear::universe::contact_range& bear::universe::contact_info::get_right_contact() const { return m_right_contact; } // contact_info::get_right_contact() /*----------------------------------------------------------------------------*/ /** * \brief Tell if the object has a contact on the right side. */ bool bear::universe::contact_info::has_right_contact() const { return !m_right_contact.empty(); } // contact_info::has_right_contact() /*----------------------------------------------------------------------------*/ /** * \brief Tell that the object has no contact on the right side. */ void bear::universe::contact_info::clear_right_contact() { m_right_contact.clear(); } // contact_info::clear_right_contact() /*----------------------------------------------------------------------------*/ /** * \brief Set the range of the contacts on the right side. * \param bottom The coordinate where the contact begins. * \param top The coordinate where the contact ends. */ void bear::universe::contact_info::set_right_contact ( coordinate_type bottom, coordinate_type top ) { m_right_contact = contact_range( bottom, top ); } // contact_info::set_right_contact() /*----------------------------------------------------------------------------*/ /** * \brief Tell if there is a contact in the middle of the object. */ bool bear::universe::contact_info::has_middle_contact() const { return m_middle_contact; } // contact_info::has_middle_contact() /*----------------------------------------------------------------------------*/ /** * \brief Tell if there is a contact in the middle of the object. * \param contact Tell if there is a contact. */ void bear::universe::contact_info::set_middle_contact( bool contact ) { m_middle_contact = contact; } // contact_info::set_middle_contact() /*----------------------------------------------------------------------------*/ /** * \brief Tell if the object has a contact. */ bool bear::universe::contact_info::has_contact() const { return has_side_contact() || has_middle_contact(); } // contact_info::has_contact() /*----------------------------------------------------------------------------*/ /** * \brief Tell if the object has a contact on one of his sides. */ bool bear::universe::contact_info::has_side_contact() const { return has_bottom_contact() || has_top_contact() || has_right_contact() || has_left_contact(); } // contact_info::has_side_contact() /*----------------------------------------------------------------------------*/ /** * \brief Tell that the object has no contact. */ void bear::universe::contact_info::clear_contacts() { clear_left_contact(); clear_right_contact(); clear_top_contact(); clear_bottom_contact(); set_middle_contact( false ); } // contact_info::clear_contacts() plee-the-bear-20251226/bear-engine/core/src/universe/code/contact_mode.cpp000066400000000000000000000015351512343254000262040ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::universe::contact_mode class. * \author Julien Jorge */ #include "universe/contact_mode.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Get the value type corresponding to a given string representation. * \param v The string from which we find the value_type */ bear::universe::contact_mode::value_type bear::universe::contact_mode::from_string( const std::string& v ) { if ( v == "full_contact" ) return full_contact; else if ( v == "range_contact" ) return range_contact; else return no_contact; } // contact_mode::from_string() plee-the-bear-20251226/bear-engine/core/src/universe/code/contact_range.cpp000066400000000000000000000033441512343254000263540ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::universe::contact_range class. * \author Julien Jorge */ #include "universe/contact_range.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param min The coordinate where the contact starts. * \param max The coordinate where the contact ends. */ bear::universe::contact_range::contact_range ( coordinate_type min, coordinate_type max ) : m_min(min), m_max(max) { } // contact_range::contact_range() /*----------------------------------------------------------------------------*/ /** * \brief Get the coordinate where the contact starts. */ bear::universe::coordinate_type bear::universe::contact_range::get_min() const { return m_min; } // contact_range::get_min() /*----------------------------------------------------------------------------*/ /** * \brief Get the coordinate where the contact ends. */ bear::universe::coordinate_type bear::universe::contact_range::get_max() const { return m_max; } // contact_range::get_max() /*----------------------------------------------------------------------------*/ /** * \brief Ensure that empty() returns true. */ void bear::universe::contact_range::clear() { m_min = m_max = 0; } // contact_range::clear() /*----------------------------------------------------------------------------*/ /** * \brief Tell if the end of the contact is not after the beginning. */ bool bear::universe::contact_range::empty() const { return m_max <= m_min; } // contact_range::empty() plee-the-bear-20251226/bear-engine/core/src/universe/code/density_rectangle.cpp000066400000000000000000000017121512343254000272450ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::universe::density_rectangle class. * \author Sebastien Angibaud */ #include "universe/density_rectangle.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Default constructor. */ bear::universe::density_rectangle::density_rectangle() { } // density_rectangle::density_rectangle() /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param r The rectangle where the density is different. * \param f The density in this rectangle. */ bear::universe::density_rectangle::density_rectangle ( const rectangle_type& r, double f ) : rectangle(r), density(f) { } // density_rectangle::density_rectangle() plee-the-bear-20251226/bear-engine/core/src/universe/code/environment_rectangle.cpp000066400000000000000000000020161512343254000301300ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::universe::environment_rectangle class. * \author Sébastien Angibaud */ #include "universe/environment_rectangle.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Default constructor. */ bear::universe::environment_rectangle::environment_rectangle() { } // environment_rectangle::environment_rectangle() /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param r The rectangle where the environment is different. * \param e The environment in this rectangle. */ bear::universe::environment_rectangle::environment_rectangle ( const rectangle_type& r, const environment_type e ) : rectangle(r), environment(e) { } // environment_rectangle::environment_rectangle() plee-the-bear-20251226/bear-engine/core/src/universe/code/force_rectangle.cpp000066400000000000000000000016701512343254000266670ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::universe::force_rectangle class. * \author Julien Jorge */ #include "universe/force_rectangle.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Default constructor. */ bear::universe::force_rectangle::force_rectangle() { } // force_rectangle::force_rectangle() /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param r The rectangle where the force is different. * \param f The force in this rectangle. */ bear::universe::force_rectangle::force_rectangle ( const rectangle_type& r, universe::force_type f ) : rectangle(r), force(f) { } // force_rectangle::force_rectangle() plee-the-bear-20251226/bear-engine/core/src/universe/code/friction_rectangle.cpp000066400000000000000000000017211512343254000274030ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::universe::friction_rectangle class. * \author Julien Jorge */ #include "universe/friction_rectangle.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Default constructor. */ bear::universe::friction_rectangle::friction_rectangle() { } // friction_rectangle::friction_rectangle() /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param r The rectangle where the friction is different. * \param f The friction in this rectangle. */ bear::universe::friction_rectangle::friction_rectangle ( const rectangle_type& r, double f ) : rectangle(r), friction(f) { } // friction_rectangle::friction_rectangle() plee-the-bear-20251226/bear-engine/core/src/universe/code/item_handle.cpp000066400000000000000000000126001512343254000260110ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::universe::item_handle class. * \author Julien Jorge */ #include "universe/item_handle.hpp" #include "universe/physical_item.hpp" #include /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ bear::universe::item_handle::item_handle() : m_item(NULL) { } // item_handle::item_handle() /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param item The item to handle. */ bear::universe::item_handle::item_handle( item_type* item ) : m_item(item) { if ( m_item ) m_item->add_handle( this ); } // item_handle::item_handle() /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param item The item to handle. */ bear::universe::item_handle::item_handle( item_type& item ) : m_item(&item) { m_item->add_handle( this ); } // item_handle::item_handle() /*----------------------------------------------------------------------------*/ /** * \brief Copy constructor. * \param that The handle from which we copy. */ bear::universe::item_handle::item_handle( const item_handle& that ) : m_item(that.m_item) { if ( m_item ) m_item->add_handle( this ); } // item_handle::item_handle() /*----------------------------------------------------------------------------*/ /** * \brief Destructor. */ bear::universe::item_handle::~item_handle() { if ( m_item ) m_item->remove_handle( this ); } // item_handle::item_handle() /*----------------------------------------------------------------------------*/ /** * \brief Get the pointer. */ bear::universe::item_handle::item_type* bear::universe::item_handle::get() const { return m_item; } // item_handle::get() /*----------------------------------------------------------------------------*/ /** * \brief Dereference operator. */ bear::universe::item_handle::item_type& bear::universe::item_handle::operator*() const { return *m_item; } // item_handle::operator*() /*----------------------------------------------------------------------------*/ /** * \brief Pointer-to-member operator. */ bear::universe::item_handle::item_type* bear::universe::item_handle::operator->() const { return m_item; } // item_handle::operator->() /*----------------------------------------------------------------------------*/ /** * \brief Assigment operator. * \param item The item to assign. */ bear::universe::item_handle& bear::universe::item_handle::operator=( item_type* item ) { if ( m_item != NULL ) m_item->remove_handle( this ); m_item = item; if ( m_item != NULL ) m_item->add_handle( this ); return *this; } // item_handle::operator=() /*----------------------------------------------------------------------------*/ /** * \brief Assigment operator. * \param that The item to assign. */ bear::universe::item_handle& bear::universe::item_handle::operator=( const item_handle& that ) { return *this = that.m_item; } // item_handle::operator=() /*----------------------------------------------------------------------------*/ /** * \brief Equality. * \param item The pointer to compare to. */ bool bear::universe::item_handle::operator== ( const item_type* item ) const { return m_item == item; } // item_handle::operator==() /*----------------------------------------------------------------------------*/ /** * \brief Equality. * \param that The pointer to compare to. */ bool bear::universe::item_handle::operator== ( const item_handle& that ) const { return m_item == that.m_item; } // item_handle::operator==() /*----------------------------------------------------------------------------*/ /** * \brief Disequality. * \param item The pointer to compare to. */ bool bear::universe::item_handle::operator!= ( const item_type* item ) const { return m_item != item; } // item_handle::operator!=() /*----------------------------------------------------------------------------*/ /** * \brief Disequality. * \param that The instance to compare to. */ bool bear::universe::item_handle::operator!= ( const item_handle& that ) const { return m_item != that.m_item; } // item_handle::operator!=() /*----------------------------------------------------------------------------*/ /** * \brief "Less than" operator. * \param that The pointer to compare to. */ bool bear::universe::item_handle::operator< ( const item_handle& that ) const { return m_item < that.m_item; } // item_handle::operator<() /*----------------------------------------------------------------------------*/ /** * \brief Compare a pointer to a physical_item with an item_handle. * \param a The pointer. * \param b The item handle. * \return b == a */ bool operator== ( const bear::universe::physical_item* a, const bear::universe::item_handle& b ) { return b == a; } // operator==() /*----------------------------------------------------------------------------*/ /** * \brief Compare a pointer to a physical_item with an item_handle. * \param a The pointer. * \param b The item handle. * \return b != a */ bool operator!= ( const bear::universe::physical_item* a, const bear::universe::item_handle& b ) { return b != a; } // operator!=() plee-the-bear-20251226/bear-engine/core/src/universe/code/item_picking_filter.cpp000066400000000000000000000076761512343254000275700ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::universe::item_picking_filter class. * \author Julien Jorge */ #include "universe/item_picking_filter.hpp" #include "universe/physical_item.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ bear::universe::item_picking_filter::item_picking_filter() : m_check_artificial(false), m_check_phantom(false), m_check_can_move_items(false), m_check_fixed(false), m_check_forbidden_position(false) { } // item_picking_filter::item_picking_filter() /*----------------------------------------------------------------------------*/ /** * \brief Destructor. */ bear::universe::item_picking_filter::~item_picking_filter() { } // item_picking_filter::~item_picking_filter() /*----------------------------------------------------------------------------*/ /** * \brief Tell if an item satisfies the condition of the filter. * \param item The item to check. */ bool bear::universe::item_picking_filter::satisfies_condition ( const physical_item& item ) const { return (!m_check_artificial || (item.is_artificial() == m_artificial_value)) && (!m_check_phantom || (item.is_phantom() == m_phantom_value)) && (!m_check_can_move_items || (item.can_move_items() == m_can_move_items_value)) && (!m_check_fixed || (item.is_fixed() == m_fixed_value)) && (!m_check_forbidden_position || !item.get_bounding_box().includes(m_forbidden_position) ) && do_satisfies_condition(item); } // item_picking_filter::satisfies_condition() /*----------------------------------------------------------------------------*/ /** * \brief Set the value of the flag "artificial" for the selected items. * \param v The value this flag must have. */ void bear::universe::item_picking_filter::set_artificial_value( bool v ) { m_check_artificial = true; m_artificial_value = v; } // item_picking_filter::set_artificial_value() /*----------------------------------------------------------------------------*/ /** * \brief Set the value of the flag "phantom" for the selected items. * \param v The value this flag must have. */ void bear::universe::item_picking_filter::set_phantom_value( bool v ) { m_check_phantom = true; m_phantom_value = v; } // item_picking_filter::set_phantom_value() /*----------------------------------------------------------------------------*/ /** * \brief Set the value of the flag "can_move_items" for the selected items. * \param v The value this flag must have. */ void bear::universe::item_picking_filter::set_can_move_items_value( bool v ) { m_check_can_move_items = true; m_can_move_items_value = v; } // item_picking_filter::set_can_move_items_value() /*----------------------------------------------------------------------------*/ /** * \brief Set the value of the flag "fixed" for the selected items. * \param v The value this flag must have. */ void bear::universe::item_picking_filter::set_fixed_value( bool v ) { m_check_fixed = true; m_fixed_value = v; } // item_picking_filter::set_fixed_value() /*----------------------------------------------------------------------------*/ /** * \brief Set a position where the item must not be. * \param pos The position of the origin. */ void bear::universe::item_picking_filter::set_forbidden_position ( const position_type& pos ) { m_check_forbidden_position = true; m_forbidden_position = pos; } // item_picking_filter::set_forbidden_position() /*----------------------------------------------------------------------------*/ /** * \brief Overridden condition checking. * \param The item to check */ bool bear::universe::item_picking_filter::do_satisfies_condition ( const physical_item& item ) const { return true; } // item_picking_filter::do_satisfies_condition() plee-the-bear-20251226/bear-engine/core/src/universe/code/physical_item.cpp000066400000000000000000001025631512343254000264020ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::universe::physical_item class. * \author Julien Jorge */ #include "universe/physical_item.hpp" #include #include "universe/collision_align_policy.hpp" #include "universe/collision_info.hpp" #include "universe/collision_repair.hpp" #include "universe/item_handle.hpp" #include "universe/world.hpp" #include "universe/zone.hpp" #include "universe/forced_movement/natural_forced_movement.hpp" #include "universe/link/base_link.hpp" #include #include #include /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ bear::universe::physical_item::physical_item() : m_owner(NULL), m_world_progress_structure(*this), m_age(0) { } // physical_item::physical_item() /*----------------------------------------------------------------------------*/ /** * \brief Copy constructor. * \param that The item to copy from. * \remark Links are not copied. */ bear::universe::physical_item::physical_item( const physical_item& that ) : physical_item_state(that), m_owner(NULL), m_world_progress_structure(*this), m_age(0) // new item, new age { set_forced_movement( that.m_forced_movement ); } // physical_item::physical_item() /*----------------------------------------------------------------------------*/ /** * \brief Destructor. */ bear::universe::physical_item::~physical_item() { remove_all_links(); remove_all_handles(); } // physical_item::~physical_item() /*----------------------------------------------------------------------------*/ /** * \brief Get the forced movement applied to this item, if any. * \pre this->has_force_movement() */ bear::universe::forced_movement& bear::universe::physical_item::get_forced_movement() { return m_forced_movement; } // physical_item::get_forced_movement() /*----------------------------------------------------------------------------*/ /** * \brief Apply a forced movement to the item. * \param m The movement to apply. * \remark If this object already have a movement, il will be released. */ void bear::universe::physical_item::set_forced_movement( const forced_movement& m ) { clear_forced_movement(); if ( is_fixed() ) claw::logger << claw::log_warning << "physical_item::set_forced_movement(): setting a " << "forced movement but the item is fixed." << std::endl; set_acceleration( force_type(0, 0) ); m_forced_movement = m; if ( !m_forced_movement.is_null() ) { m_forced_movement.set_item(*this); m_forced_movement.init(); } } // physical_item::set_forced_movement() /*----------------------------------------------------------------------------*/ /** * \brief Check if the item has a forced movement. */ bool bear::universe::physical_item::has_forced_movement() const { return !m_forced_movement.is_null(); } // physical_item::has_forced_movement() /*----------------------------------------------------------------------------*/ /** * \brief Remove the forced movement, if any. */ void bear::universe::physical_item::clear_forced_movement() { m_forced_movement.clear(); } // physical_item::clear_forced_movement() /*----------------------------------------------------------------------------*/ /** * \brief Set the item relative to which this item moves. * \param item The item. */ void bear::universe::physical_item::set_movement_reference ( const physical_item* item ) { m_movement_reference = item; } // physical_item::set_movement_reference() /*----------------------------------------------------------------------------*/ /** * \brief Get the item relative to which this item moves. */ const bear::universe::physical_item* bear::universe::physical_item::get_movement_reference() const { const physical_item* result = NULL; if ( !m_forced_movement.is_null() ) if ( m_forced_movement.has_reference_item() ) result = &m_forced_movement.get_reference_item(); if ( result == NULL ) result = m_movement_reference.get(); return result; } // physical_item::get_movement_reference() /*----------------------------------------------------------------------------*/ /** * \brief Tell if this item is linked to an other item. * \param item The other item. */ bool bear::universe::physical_item::is_linked_to ( const physical_item& item ) const { link_list_type::const_iterator it; bool result(false); for (it=m_links.begin(); !result && (it!=m_links.end()); ++it) result = ( ( &(*it)->get_first_item() == this ) && ( &(*it)->get_second_item() == &item ) ) || ( ( &(*it)->get_first_item() == &item ) && ( &(*it)->get_second_item() == this ) ); return result; } // physical_item::is_linked_to() /*----------------------------------------------------------------------------*/ /** * \brief Tell if this item is linked to an other item with a given link. * \param item The other item. * \param id The identifier of the link. */ bool bear::universe::physical_item::is_linked_to ( const physical_item& item, std::size_t id ) const { link_list_type::const_iterator it; bool result(false); for (it=m_links.begin(); !result && (it!=m_links.end()); ++it) if ( (*it)->get_id() == id ) result = ( ( &(*it)->get_first_item() == this ) && ( &(*it)->get_second_item() == &item ) ) || ( ( &(*it)->get_first_item() == &item ) && ( &(*it)->get_second_item() == this ) ); return result; } // physical_item::is_linked_to() /*----------------------------------------------------------------------------*/ /** * \brief Gets the age of this item. */ bear::universe::time_type bear::universe::physical_item::get_age() const { return m_age; } // physical_item::get_age() /*----------------------------------------------------------------------------*/ /** * \brief Get the items concerned by a progress/move of this one. * \param d (out) A list to which are added such items. */ void bear::universe::physical_item::get_dependent_items( item_list& d ) const { // nothing to do } // physical_item::get_dependent_items() /*----------------------------------------------------------------------------*/ /** * \brief Do one iteration in the progression of the item. * \param elapsed_time Elapsed time since the last call. */ void bear::universe::physical_item::time_step( time_type elapsed_time ) { m_age += elapsed_time; } // physical_item::time_step() /*----------------------------------------------------------------------------*/ /** * \brief Inform the item tat he is entering the active region. */ void bear::universe::physical_item::enters_active_region() { } // physical_item::enters_active_region() /*----------------------------------------------------------------------------*/ /** * \brief Inform the item tat he is leaving the active region. */ void bear::universe::physical_item::leaves_active_region() { get_world_progress_structure().unselect(); } // physical_item::leaves_active_region() /*----------------------------------------------------------------------------*/ /** * \brief Apply the movement of the item. * \param elapsed_time Elasped time since the last progress. */ void bear::universe::physical_item::move( time_type elapsed_time ) { default_move(elapsed_time); } // physical_item::move() /*----------------------------------------------------------------------------*/ /** * \brief Process a collision. * \param info Some informations about the collision. */ void bear::universe::physical_item::collision( collision_info& info ) { } // physical_item::collision() /*----------------------------------------------------------------------------*/ /** * \brief Check if this item is in collision with an other item. * \param that The item to check the collision with. */ bool bear::universe::physical_item::collides_with( const physical_item& that ) const { return get_shape().intersects( that.get_shape() ); } // physical_item::collides_with() /*----------------------------------------------------------------------------*/ /** * \brief Tell this item which world owns him. * \param The world that owns this item. */ void bear::universe::physical_item::set_owner(world& owner) { CLAW_PRECOND( !has_owner() ); m_owner = &owner; } // physical_item::set_owner() /*----------------------------------------------------------------------------*/ /** * \brief Remove the item from its owner. */ void bear::universe::physical_item::quit_owner() { clear_forced_movement(); remove_all_links(); remove_all_handles(); m_owner = NULL; } // physical_item::quit_owner() /*----------------------------------------------------------------------------*/ /** * \brief Get the world's selection structure for this item. */ bear::universe::world_progress_structure& bear::universe::physical_item::get_world_progress_structure() { return m_world_progress_structure; } // physical_item::get_world_progress_structure() /*----------------------------------------------------------------------------*/ /** * \brief Get the world's selection structure for this item. */ const bear::universe::world_progress_structure& bear::universe::physical_item::get_world_progress_structure() const { return m_world_progress_structure; } // physical_item::get_world_progress_structure() /*----------------------------------------------------------------------------*/ /** * \brief Add a link in this item. * \param link The link to add. * \pre The caller is bear::universe::base_link. * \pre The link is not already in the item's list. * \remark The item keeps a reference on the link. */ void bear::universe::physical_item::add_link( base_link& link ) { CLAW_PRECOND ( std::find(m_links.begin(), m_links.end(), &link) == m_links.end() ); m_links.push_front(&link); } // physical_item::add_link() /*----------------------------------------------------------------------------*/ /** * \brief Remove a link from this items. * \param link The link to remove. * \pre The caller is bear::universe::base_link. * \pre The link is in the item's list. */ void bear::universe::physical_item::remove_link( base_link& link ) { CLAW_PRECOND ( std::find(m_links.begin(), m_links.end(), &link) != m_links.end() ); m_links.erase( std::find(m_links.begin(), m_links.end(), &link) ); } // physical_item::remove_link() /*----------------------------------------------------------------------------*/ /** * \brief Get an iterator at the begining of the list of links. */ bear::universe::physical_item::const_link_iterator bear::universe::physical_item::links_begin() const { return m_links.begin(); } // physical_item::links_begin() /*----------------------------------------------------------------------------*/ /** * \brief Get an iterator at the end of the list of links. */ bear::universe::physical_item::const_link_iterator bear::universe::physical_item::links_end() const { return m_links.end(); } // physical_item::links_end() /*----------------------------------------------------------------------------*/ /** * \brief Remove all the links from this items. */ void bear::universe::physical_item::remove_all_links() { // The base_link::unlink() method must call physical_item::remove_link() so // we don't have to remove it from here. while ( !m_links.empty() ) delete m_links.front(); } // physical_item::remove_all_links() /*----------------------------------------------------------------------------*/ /** * \brief Add an handle to the item. * \pre (h != NULL) * && (std::find(m_handles.begin(), m_handles.end(), h) * == m_handles.end()) */ void bear::universe::physical_item::add_handle( item_handle* h ) const { CLAW_PRECOND( h != NULL ); CLAW_PRECOND( std::find(m_handles.begin(), m_handles.end(), h) == m_handles.end() ); m_handles.push_front( h ); } // physical_item::add_handle() /*----------------------------------------------------------------------------*/ /** * \brief Add a handle to the item. * \pre (h != NULL) * && (std::find(m_const_handles.begin(), m_const_handles.end(), h) * == m_const_handles.end()) */ void bear::universe::physical_item::add_handle( const_item_handle* h ) const { CLAW_PRECOND( h != NULL ); CLAW_PRECOND( std::find(m_const_handles.begin(), m_const_handles.end(), h) == m_const_handles.end() ); m_const_handles.push_front( h ); } // physical_item::add_handle() /*----------------------------------------------------------------------------*/ /** * \brief Remove a handle to the item. * \pre (h != NULL) * && (std::find(m_handles.begin(), m_handles.end(), h) * != m_handles.end()) */ void bear::universe::physical_item::remove_handle( item_handle* h ) const { CLAW_PRECOND( h != NULL ); CLAW_PRECOND( std::find(m_handles.begin(), m_handles.end(), h) != m_handles.end() ); m_handles.erase( std::find( m_handles.begin(), m_handles.end(), h ) ); } // physical_item::remove_handle() /*----------------------------------------------------------------------------*/ /** * \brief Remove an handle to the item. * \pre (h != NULL) * && (std::find(m_const_handles.begin(), m_const_handles.end(), h) * != m_const_handles.end()) */ void bear::universe::physical_item::remove_handle( const_item_handle* h ) const { CLAW_PRECOND( h != NULL ); CLAW_PRECOND( std::find(m_const_handles.begin(), m_const_handles.end(), h) != m_const_handles.end() ); m_const_handles.erase ( std::find( m_const_handles.begin(), m_const_handles.end(), h ) ); } // physical_item::remove_handle() /*----------------------------------------------------------------------------*/ /** * \brief Calculate the new acceleration of the item. */ void bear::universe::physical_item::adjust_cinetic() { speed_type s( get_speed() ); if ( has_owner() ) { const speed_type eps(get_owner().get_speed_epsilon()); if ( (s.x < eps.x) && (s.x > -eps.x) ) s.x = 0; if ( (s.y < eps.y) && (s.y > -eps.y) ) s.y = 0; set_speed(s); if ( (get_angular_speed() < get_owner().get_angular_speed_epsilon()) && (get_angular_speed() > -get_owner().get_angular_speed_epsilon()) ) set_angular_speed(0); } } // physical_item::adjust_cinetic() /*----------------------------------------------------------------------------*/ /** * \brief Tell if this item knows which world owns him. */ bool bear::universe::physical_item::has_owner() const { return m_owner != NULL; } // physical_item::has_owner() /*----------------------------------------------------------------------------*/ /** * \brief Get the world that owns this item. * \pre has_owner() == true */ bear::universe::world& bear::universe::physical_item::get_owner() const { CLAW_PRECOND( has_owner() ); return *m_owner; } // physical_item::get_owner() /*----------------------------------------------------------------------------*/ /** * \brief Align the other item of the collision. * \param info Some informations about the collision. */ bool bear::universe::physical_item::default_collision ( const collision_info& info ) { return default_collision( info, collision_align_policy() ); } // physical_item::default_collision() /*----------------------------------------------------------------------------*/ /** * \brief Align the other item of the collision. * \param info Some informations about the collision. * \param policy The description of how to align the items. */ bool bear::universe::physical_item::default_collision ( const collision_info& info, const collision_align_policy& policy ) { bool result(false); position_type p( info.get_bottom_left_on_contact() ); switch( info.get_collision_side() ) { case zone::bottom_zone: p.y -= get_align_epsilon(); result = collision_align_bottom(info, p, policy); break; case zone::top_zone: p.y += get_align_epsilon(); result = collision_align_top(info, p, policy); break; case zone::middle_left_zone: p.x -= get_align_epsilon(); result = collision_align_left(info, p, policy); break; case zone::middle_right_zone: p.x += get_align_epsilon(); result = collision_align_right(info, p, policy); break; case zone::middle_zone: result = collision_middle(info, policy); break; default: { CLAW_ASSERT( false, "Invalid collision side." ); } } return result; } // physical_item::default_collision() /*----------------------------------------------------------------------------*/ /** * \brief Tells if it is interesting to process a collision against a given * item. * \param that The other item. */ bool bear::universe::physical_item::interesting_collision ( const physical_item& that ) const { return do_interesting_collision( that ); } // physical_item::interesting_collision() /*----------------------------------------------------------------------------*/ /** * \brief Apply the default movement of the item (forced_movement or * acceleration and speed). * \param elapsed_time Elasped time since the last progress. */ void bear::universe::physical_item::default_move( time_type elapsed_time ) { if ( has_forced_movement() ) m_forced_movement.next_position(elapsed_time); else { natural_forced_movement f; f.set_item( *this ); f.init(); f.next_position( elapsed_time ); } } // physical_item::default_move() /*----------------------------------------------------------------------------*/ /** * \brief Align the other item of the collision on the left of \a this. * \param info Some informations about the collision. */ bool bear::universe::physical_item::collision_align_left ( const collision_info& info ) { return collision_align_left( info, collision_align_policy() ); } // physical_item::collision_align_left() /*----------------------------------------------------------------------------*/ /** * \brief Align the other item of the collision on the right of \a this. * \param info Some informations about the collision. */ bool bear::universe::physical_item::collision_align_right ( const collision_info& info ) { return collision_align_right( info, collision_align_policy() ); } // physical_item::collision_align_right() /*----------------------------------------------------------------------------*/ /** * \brief Align the other item of the collision on the top of \a this. * \param info Some informations about the collision. */ bool bear::universe::physical_item::collision_align_top ( const collision_info& info ) { return collision_align_top( info, collision_align_policy() ); } // physical_item::collision_align_top() /*----------------------------------------------------------------------------*/ /** * \brief Align the other item of the collision on the bottom of \a this. * \param info Some informations about the collision. */ bool bear::universe::physical_item::collision_align_bottom ( const collision_info& info ) { return collision_align_bottom( info, collision_align_policy() ); } // physical_item::collision_align_bottom() /*----------------------------------------------------------------------------*/ /** * \brief Set the contacts for a collision in the middle of \a this. * \param info Some informations about the collision. */ bool bear::universe::physical_item::collision_middle ( const collision_info& info ) { bool result = false; if ( !info.other_item().is_phantom() && can_move_items() ) { info.other_item().set_middle_contact(); set_middle_contact(); } // We don't align return result; } // physical_item::collision_middle() /*----------------------------------------------------------------------------*/ /** * \brief Align the other item of the collision on the left of \a this. * \param info Some informations about the collision. * \param policy The description of how to align the items. */ bool bear::universe::physical_item::collision_align_left ( const collision_info& info, const collision_align_policy& policy ) { position_type pos; if ( info.get_collision_side() == zone::middle_left_zone ) pos = info.get_bottom_left_on_contact(); else pos.set( get_left() - info.other_item().get_width(), info.other_item().get_bottom() ); pos.x -= get_align_epsilon(); return collision_align_left( info, pos, policy ); } // physical_item::collision_align_left() /*----------------------------------------------------------------------------*/ /** * \brief Align the other item of the collision on the right of \a this. * \param info Some informations about the collision. * \param policy The description of how to align the items. */ bool bear::universe::physical_item::collision_align_right ( const collision_info& info, const collision_align_policy& policy ) { position_type pos; if ( info.get_collision_side() == zone::middle_right_zone ) pos = info.get_bottom_left_on_contact(); else pos.set( get_right(), info.other_item().get_bottom() ); pos.x += get_align_epsilon(); return collision_align_right( info, pos, policy ); } // physical_item::collision_align_right() /*----------------------------------------------------------------------------*/ /** * \brief Align the other item of the collision on the top of \a this. * \param info Some informations about the collision. * \param policy The description of how to align the items. */ bool bear::universe::physical_item::collision_align_top ( const collision_info& info, const collision_align_policy& policy ) { position_type pos; if ( info.get_collision_side() == zone::top_zone ) pos = info.get_bottom_left_on_contact(); else pos.set( info.other_item().get_left(), get_top() ); pos.y += get_align_epsilon(); return collision_align_top( info, pos, policy ); } // physical_item::collision_align_top() /*----------------------------------------------------------------------------*/ /** * \brief Align the other item of the collision on the bottom of \a this. * \param info Some informations about the collision. * \param policy The description of how to align the items. */ bool bear::universe::physical_item::collision_align_bottom ( const collision_info& info, const collision_align_policy& policy ) { position_type pos; if ( info.get_collision_side() == zone::bottom_zone ) pos = info.get_bottom_left_on_contact(); else pos.set( info.other_item().get_left(), get_bottom() - info.other_item().get_height() ); pos.y -= get_align_epsilon(); return collision_align_bottom( info, pos, policy ); } // physical_item::collision_align_bottom() /*----------------------------------------------------------------------------*/ /** * \brief Set the contacts for a collision in the middle of \a this. * \param info Some informations about the collision. * \param policy The description of how to align the items. */ bool bear::universe::physical_item::collision_middle ( const collision_info& info, const collision_align_policy& policy ) { bool result = false; physical_item_state& that( info.other_item() ); if ( !that.is_phantom() && can_move_items() ) { switch( policy.get_contact_mode() ) { case contact_mode::full_contact: case contact_mode::range_contact: that.set_middle_contact(); set_middle_contact(); break; case contact_mode::no_contact: // nothing to do break; } } // We don't align return result; } // physical_item::collision_middle() /*----------------------------------------------------------------------------*/ /** * \brief Align the other item of the collision on the left of \a this. * \param info Some informations about the collision. * \param pos The bottom left position to put the other item at. */ bool bear::universe::physical_item::collision_align_left ( const collision_info& info, const position_type& pos ) { return collision_align_left( info, pos, collision_align_policy() ); } // physical_item::collision_align_left() /*----------------------------------------------------------------------------*/ /** * \brief Align the other item of the collision on the right of \a this. * \param info Some informations about the collision. * \param pos The bottom left position to put the other item at. */ bool bear::universe::physical_item::collision_align_right ( const collision_info& info, const position_type& pos ) { return collision_align_right( info, pos, collision_align_policy() ); } // physical_item::collision_align_right() /*----------------------------------------------------------------------------*/ /** * \brief Align the other item of the collision on the top of \a this. * \param info Some informations about the collision. * \param pos The bottom left position to put the other item at. */ bool bear::universe::physical_item::collision_align_top ( const collision_info& info, const position_type& pos ) { return collision_align_top( info, pos, collision_align_policy() ); } // physical_item::collision_align_top() /*----------------------------------------------------------------------------*/ /** * \brief Align the other item of the collision on the bottom of \a this. * \param info Some informations about the collision. * \param pos The bottom left position to put the other item at. */ bool bear::universe::physical_item::collision_align_bottom ( const collision_info& info, const position_type& pos ) { return collision_align_bottom( info, pos, collision_align_policy() ); } // physical_item::collision_align_bottom() /*----------------------------------------------------------------------------*/ /** * \brief Align the other item of the collision on the left of \a this. * \param info Some informations about the collision. * \param pos The bottom left position to put the other item at. * \param policy The description of how to align the items. */ bool bear::universe::physical_item::collision_align_left ( const collision_info& info, const position_type& pos, const collision_align_policy& policy ) { bool result(false); if ( collision_align_at(info.other_item(), pos) ) { result = true; physical_item_state& that = info.other_item(); switch ( policy.get_contact_mode() ) { case contact_mode::full_contact: that.set_right_contact(); set_left_contact(); break; case contact_mode::range_contact: that.set_right_contact( get_bottom(), get_top() ); set_left_contact( that.get_bottom(), that.get_top() ); break; case contact_mode::no_contact: // nothing to do break; } info.get_collision_repair().set_contact_normal (info.other_item(), vector_type(-1, 0)); } return result; } // physical_item::collision_align_left() /*----------------------------------------------------------------------------*/ /** * \brief Align the other item of the collision on the right of \a this. * \param info Some informations about the collision. * \param pos The bottom left position to put the other item at. * \param policy The description of how to align the items. */ bool bear::universe::physical_item::collision_align_right ( const collision_info& info, const position_type& pos, const collision_align_policy& policy ) { bool result(false); if ( collision_align_at(info.other_item(), pos) ) { result = true; physical_item_state& that = info.other_item(); switch ( policy.get_contact_mode() ) { case contact_mode::full_contact: that.set_left_contact(); set_right_contact(); break; case contact_mode::range_contact: that.set_left_contact( get_bottom(), get_top() ); set_right_contact( that.get_bottom(), that.get_top() ); break; case contact_mode::no_contact: // nothing to do break; } info.get_collision_repair().set_contact_normal (info.other_item(), vector_type(1, 0)); } return result; } // physical_item::collision_align_right() /*----------------------------------------------------------------------------*/ /** * \brief Align the other item of the collision on the top of \a this. * \param info Some informations about the collision. * \param pos The bottom left position to put the other item at. * \param policy The description of how to align the items. */ bool bear::universe::physical_item::collision_align_top ( const collision_info& info, const position_type& pos, const collision_align_policy& policy ) { bool result(false); if ( collision_align_at(info.other_item(), pos) ) { result = true; physical_item_state& that = info.other_item(); switch ( policy.get_contact_mode() ) { case contact_mode::full_contact: that.set_bottom_contact(); set_top_contact(); break; case contact_mode::range_contact: that.set_bottom_contact( get_left(), get_right() ); set_top_contact( that.get_left(), that.get_right() ); break; case contact_mode::no_contact: // nothing to do break; } info.get_collision_repair().set_contact_normal (info.other_item(), vector_type(0, 1)); } return result; } // physical_item::collision_align_top() /*----------------------------------------------------------------------------*/ /** * \brief Align the other item of the collision on the bottom of \a this. * \param info Some informations about the collision. * \param pos The bottom left position to put the other item at. * \param policy The description of how to align the items. */ bool bear::universe::physical_item::collision_align_bottom ( const collision_info& info, const position_type& pos, const collision_align_policy& policy ) { bool result(false); if ( collision_align_at(info.other_item(), pos) ) { result = true; physical_item_state& that = info.other_item(); switch ( policy.get_contact_mode() ) { case contact_mode::full_contact: that.set_top_contact(); set_bottom_contact(); break; case contact_mode::range_contact: that.set_top_contact( get_left(), get_right() ); set_bottom_contact( that.get_left(), that.get_right() ); break; case contact_mode::no_contact: // nothing to do break; } info.get_collision_repair().set_contact_normal (info.other_item(), vector_type(0, -1)); } return result; } // physical_item::collision_align_bottom() /*----------------------------------------------------------------------------*/ /** * \brief Test if the item is only in a given environment. * \param e The considered environment. */ bool bear::universe::physical_item::is_only_in_environment (const universe::environment_type e) const { bool result = false; if ( has_owner() ) { std::set environments; get_owner().get_environments(get_bounding_box(), environments); if ( environments.size() == 1 ) result = ( *(environments.begin()) == e ); } return result; } // physical_item::is_only_in_environment() /*----------------------------------------------------------------------------*/ /** * \brief Test if the item is in a given environment. * \param e The considered environment. */ bool bear::universe::physical_item::is_in_environment (const universe::environment_type e) const { bool result = false; if ( has_owner() ) { std::set environments; get_owner().get_environments(get_bounding_box(), environments); result = ( environments.find(e) != environments.end()); } return result; } // physical_item::is_in_environment() /*----------------------------------------------------------------------------*/ /** * \brief Align an item at a given position. * \param that The other item. * \param pos The bottom left position to put the other item at. */ bool bear::universe::physical_item::collision_align_at ( physical_item_state& that, const position_type& pos ) const { bool result(true); if ( that.is_phantom() || !can_move_items() ) result = false; else that.set_bottom_left( pos ); return result; } // physical_item::collision_align_at() /*----------------------------------------------------------------------------*/ /** * \brief Remove (invalidates) all the handles on this item. */ void bear::universe::physical_item::remove_all_handles() const { // force a call to remove_handle, that will remove the handle from the list while ( !m_handles.empty() ) *m_handles.front() = NULL; // force a call to remove_handle, that will remove the handle from the list while ( !m_const_handles.empty() ) *m_const_handles.front() = NULL; } // physical_item::remove_all_handles() /*----------------------------------------------------------------------------*/ /** * \brief Get the epsilon to apply when the item is aligned. */ bear::universe::coordinate_type bear::universe::physical_item::get_align_epsilon() const { if ( has_owner() ) return get_owner().get_position_epsilon(); else return 0; } // physical_item::get_align_epsilon() /*----------------------------------------------------------------------------*/ /** * \brief Tells if it is interesting to process a collision against a given * item. * \param that The other item. */ bool bear::universe::physical_item::do_interesting_collision ( const physical_item& that ) const { return true; } // physical_item::do_interesting_collision() plee-the-bear-20251226/bear-engine/core/src/universe/code/physical_item_attributes.cpp000066400000000000000000000021211512343254000306350ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::universe::physical_item_attributes class. * \author Julien Jorge */ #include "universe/physical_item_attributes.hpp" #include "universe/shape/rectangle.hpp" #include /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ bear::universe::physical_item_attributes::physical_item_attributes() : m_shape( rectangle() ), m_flags( physical_item_flags::can_move_items ), m_internal_force(0, 0), m_external_force(0, 0), m_system_angle(0), m_mass(std::numeric_limits::infinity()), m_self_friction(0.98), m_contact_friction(1), m_speed(0, 0), m_angular_speed(0), m_x_fixed(0), m_y_fixed(0), m_density(1), m_acceleration(0, 0), m_elasticity(0), m_hardness(1) { } // physical_item_attributes::physical_item_attributes() plee-the-bear-20251226/bear-engine/core/src/universe/code/physical_item_state.cpp000066400000000000000000001456451512343254000276120ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::universe::physical_item_state class. * \author Julien Jorge */ #include "universe/physical_item_state.hpp" #include "universe/shape/shape_traits.hpp" #include #include /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ bear::universe::physical_item_state::physical_item_state() : m_fixed(false), m_bounding_box_getter( &physical_item_state::get_cached_bounding_box ), m_bounding_box( 0, 0, 0, 0 ) { } // physical_item_state::physical_item_state() /*----------------------------------------------------------------------------*/ /** * \brief Copy constructor. * \param that The instance to copy from. * * By default, this copy is not fixed. */ bear::universe::physical_item_state::physical_item_state ( const physical_item_state& that ) : m_attributes(that.m_attributes), m_fixed(false), m_bounding_box_getter(that.m_bounding_box_getter), m_bounding_box(that.m_bounding_box) { } // physical_item_state::physical_item_state() /*----------------------------------------------------------------------------*/ /** * \brief Destructor. */ bear::universe::physical_item_state::~physical_item_state() { // nothing to do } // physical_item_state::physical_item_state() /*----------------------------------------------------------------------------*/ /** * \brief Get the size of the item. */ bear::universe::size_box_type bear::universe::physical_item_state::get_size() const { return ( this->*m_bounding_box_getter )().size(); } // physical_item_state::get_size() /*----------------------------------------------------------------------------*/ /** * \brief Get the width of the item. */ bear::universe::size_type bear::universe::physical_item_state::get_width() const { return ( this->*m_bounding_box_getter )().width(); } // physical_item_state::get_width() /*----------------------------------------------------------------------------*/ /** * \brief Get the height of the item. */ bear::universe::size_type bear::universe::physical_item_state::get_height() const { return ( this->*m_bounding_box_getter )().height(); } // physical_item_state::get_height() /*----------------------------------------------------------------------------*/ /** * \brief Set the bouding box of this item. * \param r the new bounding box of the item. */ void bear::universe::physical_item_state::set_bounding_box ( const bear::universe::rectangle_type& r ) { set_bottom_left( r.bottom_left() ); set_size( r.size() ); } // physical_item_state::set_bounding_box() /*----------------------------------------------------------------------------*/ /** * \brief Get the bouding box of this item. */ const bear::universe::rectangle_type& bear::universe::physical_item_state::get_bounding_box() const { return ( this->*m_bounding_box_getter )(); } // physical_item_state::get_bounding_box() /*----------------------------------------------------------------------------*/ /** * \brief Get the current acceleration of the item. */ const bear::universe::force_type& bear::universe::physical_item_state::get_acceleration() const { return m_attributes.m_acceleration; } // physical_item_state::get_acceleration() /*----------------------------------------------------------------------------*/ /** * \brief Set the acceleration of the item. */ void bear::universe::physical_item_state::set_acceleration(const force_type& a) { if (!m_fixed) { if (m_attributes.m_x_fixed == 0) m_attributes.m_acceleration.x = a.x; if (m_attributes.m_y_fixed == 0) m_attributes.m_acceleration.y = a.y; } } // physical_item_state::set_acceleration() /*----------------------------------------------------------------------------*/ /** * \brief Get the current total force applied to the item. */ bear::universe::force_type bear::universe::physical_item_state::get_force() const { const vector_type x_axis(get_x_axis()); return m_attributes.m_external_force + m_attributes.m_internal_force.x * x_axis + m_attributes.m_internal_force.y * x_axis.get_orthonormal_anticlockwise(); } // physical_item_state::get_force() /*----------------------------------------------------------------------------*/ /** * \brief Get the current internal force applied to the item. */ const bear::universe::force_type& bear::universe::physical_item_state::get_internal_force() const { return m_attributes.m_internal_force; } // physical_item_state::get_internal_force() /*----------------------------------------------------------------------------*/ /** * \brief Get the current external force applied to the item. */ const bear::universe::force_type& bear::universe::physical_item_state::get_external_force() const { return m_attributes.m_external_force; } // physical_item_state::get_external_force() /*----------------------------------------------------------------------------*/ /** * \brief Apply one more internal force to the item. * \param force The force to apply. */ void bear::universe::physical_item_state::add_internal_force ( const force_type& force ) { if (!m_fixed) { if (m_attributes.m_x_fixed == 0) m_attributes.m_internal_force.x += force.x; if (m_attributes.m_y_fixed == 0) m_attributes.m_internal_force.y += force.y; } } // physical_item_state::add_internal_force() /*----------------------------------------------------------------------------*/ /** * \brief Apply one more external force to the item. * \param force The force to apply. */ void bear::universe::physical_item_state::add_external_force ( const force_type& force ) { if (!m_fixed) { if (m_attributes.m_x_fixed == 0) m_attributes.m_external_force.x += force.x; if (m_attributes.m_y_fixed == 0) m_attributes.m_external_force.y += force.y; } } // physical_item_state::add_external_force() /*----------------------------------------------------------------------------*/ /** * \brief Set the external force of the item. */ void bear::universe::physical_item_state::set_external_force (const force_type& f) { if (!m_fixed) { if (m_attributes.m_x_fixed == 0) m_attributes.m_external_force.x = f.x; if (m_attributes.m_y_fixed == 0) m_attributes.m_external_force.y = f.y; } } // physical_item_state::set_external_force() /*----------------------------------------------------------------------------*/ /** * \brief Set the internal force of the item. */ void bear::universe::physical_item_state::set_internal_force (const force_type& f) { if (!m_fixed) { if (m_attributes.m_x_fixed == 0) m_attributes.m_internal_force.x = f.x; if (m_attributes.m_y_fixed == 0) m_attributes.m_internal_force.y = f.y; } } // physical_item_state::set_internal_force() /*----------------------------------------------------------------------------*/ /** * \brief Get the mass of the item. */ double bear::universe::physical_item_state::get_mass() const { return m_attributes.m_mass; } // physical_item_state::get_mass() /*----------------------------------------------------------------------------*/ /** * \brief Get the density of the item. */ double bear::universe::physical_item_state::get_density() const { return m_attributes.m_density; } // physical_item_state::get_density() /*----------------------------------------------------------------------------*/ /** * \brief Get the current speed of the item. */ const bear::universe::speed_type& bear::universe::physical_item_state::get_speed() const { return m_attributes.m_speed; } // physical_item_state::get_speed() /*----------------------------------------------------------------------------*/ /** * \brief Set the current speed of the item. * \param speed The speed. */ void bear::universe::physical_item_state::set_speed( const speed_type& speed ) { set_speed( speed.x, speed.y ); } // physical_item_state::set_speed() /*----------------------------------------------------------------------------*/ /** * \brief Set the current speed of the item. * \param x The speed on the x-axis. * \param y The speed on the y-axis. */ void bear::universe::physical_item_state::set_speed( double x, double y ) { if (!m_fixed) { if (m_attributes.m_x_fixed == 0) m_attributes.m_speed.x = x; if (m_attributes.m_y_fixed == 0) m_attributes.m_speed.y = y; } } // physical_item_state::set_speed() /*----------------------------------------------------------------------------*/ /** * \brief Get the current angular speed of the item. */ double bear::universe::physical_item_state::get_angular_speed() const { return m_attributes.m_angular_speed; } // physical_item_state::get_angular_speed() /*----------------------------------------------------------------------------*/ /** * \brief Set the current angular speed of the item. * \param The new angular speed. */ void bear::universe::physical_item_state::set_angular_speed( double speed ) { m_attributes.m_angular_speed = speed; } // physical_item_state::set_angular_speed() /*----------------------------------------------------------------------------*/ /** * \brief Add a speed at the current angular speed of the item. * \param speed The angular speed to add. */ void bear::universe::physical_item_state::add_angular_speed( double speed ) { m_attributes.m_angular_speed += speed; } // physical_item_state::set_angular_speed() /*----------------------------------------------------------------------------*/ /** * \brief Get the friction applied to this item. */ double bear::universe::physical_item_state::get_friction() const { return m_attributes.m_self_friction; } // physical_item_state::get_friction(); /*----------------------------------------------------------------------------*/ /** * \brief Set the friction applied to this item. * \param f The value of the friction applied to this item. */ void bear::universe::physical_item_state::set_friction( double f ) { m_attributes.m_self_friction = f; } // physical_item_state::set_friction() /*----------------------------------------------------------------------------*/ /** * \brief Get the friction applied to this item by a contact with an other item. */ double bear::universe::physical_item_state::get_contact_friction() const { return m_attributes.m_contact_friction; } // physical_item_state::get_contact_friction(); /*----------------------------------------------------------------------------*/ /** * \brief Set the friction applied to this item by a contact with an other item. * \param f The value of the friction applied to this item. */ void bear::universe::physical_item_state::set_contact_friction( double f ) { m_attributes.m_contact_friction = f; } // physical_item_state::set_contact_friction() /*----------------------------------------------------------------------------*/ /** * \brief Get the elasticity of this item. */ double bear::universe::physical_item_state::get_elasticity() const { return m_attributes.m_elasticity; } // physical_item_state::get_elasticity(); /*----------------------------------------------------------------------------*/ /** * \brief Set the elasticity of this item. * \param e The value of the elasticity of this item. */ void bear::universe::physical_item_state::set_elasticity( double e ) { m_attributes.m_elasticity = e; } // physical_item_state::set_elasticity() /*----------------------------------------------------------------------------*/ /** * \brief Get the hardness of this item. */ double bear::universe::physical_item_state::get_hardness() const { return m_attributes.m_hardness; } // physical_item_state::get_hardness(); /*----------------------------------------------------------------------------*/ /** * \brief Set the hardness of this item. * \param h The value of the hardness of this item. */ void bear::universe::physical_item_state::set_hardness( double h ) { m_attributes.m_hardness = h; } // physical_item_state::set_hardness() /*----------------------------------------------------------------------------*/ /** * \brief Get the angle of this item. */ double bear::universe::physical_item_state::get_system_angle() const { return m_attributes.m_system_angle; } // physical_item_state::get_system_angle(); /*----------------------------------------------------------------------------*/ /** * \brief Set the angle of this item. * \param a The value of the angle. */ void bear::universe::physical_item_state::set_system_angle( double a ) { m_attributes.m_system_angle = a; } // physical_item_state::set_system_angle() /*----------------------------------------------------------------------------*/ /** * \brief Set the angle of this item on a contact. * \param a The value of the angle. */ void bear::universe::physical_item_state::set_contact_angle( double a ) { if ( !has_free_system() ) m_attributes.m_system_angle = a; } // physical_item_state::set_contact_angle() /*----------------------------------------------------------------------------*/ /** * \brief Tell if the system angle of the item is not modified by the * collisions. */ bool bear::universe::physical_item_state::has_free_system() const { return m_attributes.m_flags & physical_item_flags::free_system_angle; } // physical_item_state::has_free_system(); /*----------------------------------------------------------------------------*/ /** * \brief Tell if the system angle of the item is not modified by the * collisions. * \param b True if the system angle of the item is not modified by the * collisions. */ void bear::universe::physical_item_state::set_free_system( bool b ) { if ( b ) m_attributes.m_flags |= physical_item_flags::free_system_angle; else m_attributes.m_flags &= ~physical_item_flags::free_system_angle; } // physical_item_state::set_free_system(); /*----------------------------------------------------------------------------*/ /** * \brief Get the local x-axis of the item. */ bear::universe::vector_type bear::universe::physical_item_state::get_x_axis() const { return vector_type ( std::cos(m_attributes.m_system_angle), std::sin(m_attributes.m_system_angle) ); } // physical_item_state::get_x_axis() /*----------------------------------------------------------------------------*/ /** * \brief Set (force) the position of the top edge of the item. * \param pos The new position. */ void bear::universe::physical_item_state::set_top( coordinate_type pos ) { set_bottom( pos - get_height() ); } // physical_item_state::set_top() /*----------------------------------------------------------------------------*/ /** * \brief Set (force) the position of the bottom edge of the item. * \param pos The new position. */ void bear::universe::physical_item_state::set_bottom( coordinate_type pos ) { if (!m_fixed && (m_attributes.m_y_fixed == 0)) { m_bounding_box_getter = &physical_item_state::refresh_bounding_box; shape_traits::set_bottom( m_attributes.m_shape, pos ); } } // physical_item_state::set_bottom() /*----------------------------------------------------------------------------*/ /** * \brief Set (force) the position of the left edge of the item. * \param pos The new position. */ void bear::universe::physical_item_state::set_left( coordinate_type pos ) { if (!m_fixed && (m_attributes.m_x_fixed == 0)) { m_bounding_box_getter = &physical_item_state::refresh_bounding_box; shape_traits::set_left( m_attributes.m_shape, pos ); } } // physical_item_state::set_left() /*----------------------------------------------------------------------------*/ /** * \brief Set (force) the position of the right edge of the item. * \param pos The new position. */ void bear::universe::physical_item_state::set_right( coordinate_type pos ) { set_left( pos - get_width() ); } // physical_item_state::set_right() /*----------------------------------------------------------------------------*/ /** * \brief Set (force) the x-position of the center of the item. * \param pos The new position. */ void bear::universe::physical_item_state::set_horizontal_middle ( coordinate_type pos ) { set_left( pos - get_width() / 2 ); } // physical_item_state::set_horizontal_middle() /*----------------------------------------------------------------------------*/ /** * \brief Set (force) the y-position of the center of the item. * \param pos The new position. */ void bear::universe::physical_item_state::set_vertical_middle ( coordinate_type pos ) { set_bottom( pos - get_height() / 2 ); } // physical_item_state::set_vertical_middle() /*----------------------------------------------------------------------------*/ /** * \brief Set (force) the position of the top left corner of the item. * \param pos The new position. */ void bear::universe::physical_item_state::set_top_left( const position_type& pos ) { set_left(pos.x); set_top(pos.y); } // physical_item_state::set_top_left() /*----------------------------------------------------------------------------*/ /** * \brief Set (force) the position of the middle of the top edge of the item. * \param pos The new position. */ void bear::universe::physical_item_state::set_top_middle( const position_type& pos ) { set_horizontal_middle(pos.x); set_top(pos.y); } // physical_item_state::set_top_middle() /*----------------------------------------------------------------------------*/ /** * \brief Set (force) the position of the top right corner of the item. * \param pos The new position. */ void bear::universe::physical_item_state::set_top_right( const position_type& pos ) { set_right(pos.x); set_top(pos.y); } // physical_item_state::set_top_right() /*----------------------------------------------------------------------------*/ /** * \brief Set (force) the position of the bottom left corner of the item. * \param pos The new position. */ void bear::universe::physical_item_state::set_bottom_left( const position_type& pos ) { set_left(pos.x); set_bottom(pos.y); } // physical_item_state::set_bottom_left() /*----------------------------------------------------------------------------*/ /** * \brief Set (force) the position of the middle of the bottom edge of the item. * \param pos The new position. */ void bear::universe::physical_item_state::set_bottom_middle ( const position_type& pos ) { set_horizontal_middle(pos.x); set_bottom(pos.y); } // physical_item_state::set_bottom_middle() /*----------------------------------------------------------------------------*/ /** * \brief Set (force) the position of the bottom right corner of the item. * \param pos The new position. */ void bear::universe::physical_item_state::set_bottom_right ( const position_type& pos ) { set_right(pos.x); set_bottom(pos.y); } // physical_item_state::set_bottom_right() /*----------------------------------------------------------------------------*/ /** * \brief Set (force) the position of the middle of the left edge of the item. * \param pos The new position. */ void bear::universe::physical_item_state::set_left_middle( const position_type& pos ) { set_left(pos.x); set_vertical_middle(pos.y); } // physical_item_state::set_left_middle() /*----------------------------------------------------------------------------*/ /** * \brief Set (force) the position of the middle of the right edge of the item. * \param pos The new position. */ void bear::universe::physical_item_state::set_right_middle ( const position_type& pos ) { set_right(pos.x); set_vertical_middle(pos.y); } // physical_item_state::set_right_middle() /*----------------------------------------------------------------------------*/ /** * \brief Set (force) the position of the top left corner of the item. * \param x The new x-position. * \param y The new y-position. */ void bear::universe::physical_item_state::set_top_left ( const coordinate_type& x, const coordinate_type& y ) { set_left(x); set_top(y); } // physical_item_state::set_top_left() /*----------------------------------------------------------------------------*/ /** * \brief Set (force) the position of the middle of the top edge of the item. * \param x The new x-position. * \param y The new y-position. */ void bear::universe::physical_item_state::set_top_middle ( const coordinate_type& x, const coordinate_type& y ) { set_horizontal_middle(x); set_top(y); } // physical_item_state::set_top_middle() /*----------------------------------------------------------------------------*/ /** * \brief Set (force) the position of the top right corner of the item. * \param x The new x-position. * \param y The new y-position. */ void bear::universe::physical_item_state::set_top_right ( const coordinate_type& x, const coordinate_type& y ) { set_right(x); set_top(y); } // physical_item_state::set_top_right() /*----------------------------------------------------------------------------*/ /** * \brief Set (force) the position of the bottom left corner of the item. * \param x The new x-position. * \param y The new y-position. */ void bear::universe::physical_item_state::set_bottom_left ( const coordinate_type& x, const coordinate_type& y ) { set_left(x); set_bottom(y); } // physical_item_state::set_bottom_left() /*----------------------------------------------------------------------------*/ /** * \brief Set (force) the position of the middle of the bottom edge of the item. * \param x The new x-position. * \param y The new y-position. */ void bear::universe::physical_item_state::set_bottom_middle ( const coordinate_type& x, const coordinate_type& y ) { set_horizontal_middle(x); set_bottom(y); } // physical_item_state::set_bottom_middle() /*----------------------------------------------------------------------------*/ /** * \brief Set (force) the position of the bottom right corner of the item. * \param x The new x-position. * \param y The new y-position. */ void bear::universe::physical_item_state::set_bottom_right ( const coordinate_type& x, const coordinate_type& y ) { set_right(x); set_bottom(y); } // physical_item_state::set_bottom_right() /*----------------------------------------------------------------------------*/ /** * \brief Set (force) the position of the middle of the left edge of the item. * \param x The new x-position. * \param y The new y-position. */ void bear::universe::physical_item_state::set_left_middle ( const coordinate_type& x, const coordinate_type& y ) { set_left(x); set_vertical_middle(y); } // physical_item_state::set_left_middle() /*----------------------------------------------------------------------------*/ /** * \brief Set (force) the position of the middle of the right edge of the item. * \param x The new x-position. * \param y The new y-position. */ void bear::universe::physical_item_state::set_right_middle ( const coordinate_type& x, const coordinate_type& y ) { set_right(x); set_vertical_middle(y); } // physical_item_state::set_right_middle() /*----------------------------------------------------------------------------*/ /** * \brief Get the lowest X-coordinate covered by the bounding box of this item. */ bear::universe::coordinate_type bear::universe::physical_item_state::get_left() const { return ( this->*m_bounding_box_getter )().left(); } // physical_item_state::get_left() /*----------------------------------------------------------------------------*/ /** * \brief Get the lowest Y-coordinate covered by the bounding box of this item. */ bear::universe::coordinate_type bear::universe::physical_item_state::get_top() const { return get_bottom() + get_height(); } // physical_item_state::get_top() /*----------------------------------------------------------------------------*/ /** * \brief Get the highest X-coordinate covered by the bounding box of this item. */ bear::universe::coordinate_type bear::universe::physical_item_state::get_right() const { return get_left() + get_width(); } // physical_item_state::get_right() /*----------------------------------------------------------------------------*/ /** * \brief Get the highest Y-coordinate covered by the bounding box of this item. */ bear::universe::coordinate_type bear::universe::physical_item_state::get_bottom() const { return ( this->*m_bounding_box_getter )().bottom(); } // physical_item_state::get_bottom() /*----------------------------------------------------------------------------*/ /** * \brief Get the x-coordinate of the center of this item. */ bear::universe::coordinate_type bear::universe::physical_item_state::get_horizontal_middle() const { return get_left() + get_width() / 2; } // physical_item_state::get_horizontal_middle() /*----------------------------------------------------------------------------*/ /** * \brief Get the Y-coordinate of the center of this item. */ bear::universe::coordinate_type bear::universe::physical_item_state::get_vertical_middle() const { return get_bottom() + get_height() / 2; } // physical_item_state::get_vertical_middle() /*----------------------------------------------------------------------------*/ /** * \brief Get the position of the top left corner of the item. */ bear::universe::position_type bear::universe::physical_item_state::get_top_left() const { return position_type( get_left(), get_top() ); } // physical_item_state::get_top_left() /*----------------------------------------------------------------------------*/ /** * \brief Get the position of the middle of the top edge of the item. */ bear::universe::position_type bear::universe::physical_item_state::get_top_middle() const { return position_type( get_center_of_mass().x, get_top() ); } // physical_item_state::get_top_middle() /*----------------------------------------------------------------------------*/ /** * \brief Get the position of the top right corner of the item. */ bear::universe::position_type bear::universe::physical_item_state::get_top_right() const { return position_type( get_right(), get_top() ); } // physical_item_state::get_top_right() /*----------------------------------------------------------------------------*/ /** * \brief Get the position of the bottom left corner of the item. */ bear::universe::position_type bear::universe::physical_item_state::get_bottom_left() const { return position_type( get_left(), get_bottom() ); } // physical_item_state::get_bottom_left() /*----------------------------------------------------------------------------*/ /** * \brief Get the position of the middle of the bottom edge of the item. */ bear::universe::position_type bear::universe::physical_item_state::get_bottom_middle() const { return position_type( get_center_of_mass().x, get_bottom() ); } // physical_item_state::get_bottom_middle() /*----------------------------------------------------------------------------*/ /** * \brief Get the position of the bottom right corner of the item. */ bear::universe::position_type bear::universe::physical_item_state::get_bottom_right() const { return position_type( get_right(), get_bottom() ); } // physical_item_state::get_bottom_right() /*----------------------------------------------------------------------------*/ /** * \brief Get the position of the middle of the left edge of the item. */ bear::universe::position_type bear::universe::physical_item_state::get_left_middle() const { return position_type( get_left(), get_center_of_mass().y ); } // physical_item_state::get_left_middle() /*----------------------------------------------------------------------------*/ /** * \brief Get the position of the middle of the right edge of the item. */ bear::universe::position_type bear::universe::physical_item_state::get_right_middle() const { return position_type( get_right(), get_center_of_mass().y ); } // physical_item_state::get_right_middle() /*----------------------------------------------------------------------------*/ /** * \brief Get the position, in the world, of the center of mass. */ bear::universe::position_type bear::universe::physical_item_state::get_center_of_mass() const { return get_bottom_left() + get_size() / 2; } // physical_item_state::get_center_of_mass() /*----------------------------------------------------------------------------*/ /** * \brief Set (force) the position of the center of the item. * \param pos The new center of mass. */ void bear::universe::physical_item_state::set_center_of_mass ( const position_type& pos ) { set_bottom_left( pos - get_size() / 2 ); } // physical_item_state::set_center_of_mass() /*----------------------------------------------------------------------------*/ /** * \brief Set (force) the position of the center of the item on the center of * mass of an other item. * \param pos The item on which the center will be aligned. */ void bear::universe::physical_item_state::set_center_on ( const physical_item_state& that ) { set_center_of_mass( that.get_center_of_mass() ); } // physical_item_state::set_center_on() /*----------------------------------------------------------------------------*/ /** * \brief Set (force) the position of the center of the item. * \param x The new x_coordinate of the center of mass. * \param y The new y-coordinate of the center of mass. */ void bear::universe::physical_item_state::set_center_of_mass ( const coordinate_type& x, const coordinate_type& y ) { set_center_of_mass( position_type(x, y) ); } // physical_item_state::set_center_of_mass() /*----------------------------------------------------------------------------*/ /** * \brief Tell if the item is fixed. */ bool bear::universe::physical_item_state::is_fixed() const { return m_fixed; } // physical_item_state::is_fixed() /*----------------------------------------------------------------------------*/ /** * \brief Fix the item. Its speed and acceleration are set to zero. Its * position, speed and acceleration won't be able to cange anymore. */ void bear::universe::physical_item_state::fix() { m_attributes.m_acceleration = m_attributes.m_speed = speed_type(0, 0); m_fixed = true; } // physical_item_state::fix() /*----------------------------------------------------------------------------*/ /** * \brief Remove a constraint on the position of the item. */ void bear::universe::physical_item_state::remove_position_constraints() { remove_position_constraint_x(); remove_position_constraint_y(); } // physical_item_state::remove_position_constraints() /*----------------------------------------------------------------------------*/ /** * \brief Remove a constraint on the X-position of the item. */ void bear::universe::physical_item_state::remove_position_constraint_x() { --m_attributes.m_x_fixed; } // physical_item_state::remove_position_constraint_x() /*----------------------------------------------------------------------------*/ /** * \brief Remove a constraint on the Y-position of the item. */ void bear::universe::physical_item_state::remove_position_constraint_y() { --m_attributes.m_y_fixed; } // physical_item_state::remove_position_constraint_y() /*----------------------------------------------------------------------------*/ /** * \brief Add a constraint on the position of the item. */ void bear::universe::physical_item_state::add_position_constraints() { add_position_constraint_x(); add_position_constraint_y(); } // physical_item_state::add_position_constraint_x() /*----------------------------------------------------------------------------*/ /** * \brief Add a constraint on the X-position of the item. */ void bear::universe::physical_item_state::add_position_constraint_x() { ++m_attributes.m_x_fixed; } // physical_item_state::add_position_constraint_x() /*----------------------------------------------------------------------------*/ /** * \brief Add a constraint on the Y-position of the item. */ void bear::universe::physical_item_state::add_position_constraint_y() { ++m_attributes.m_y_fixed; } // physical_item_state::add_position_constraint_y() /*----------------------------------------------------------------------------*/ /** * \brief Tell if the item can move items. */ bool bear::universe::physical_item_state::can_move_items() const { return m_attributes.m_flags & physical_item_flags::can_move_items; } // physical_item_state::can_move_items() /*----------------------------------------------------------------------------*/ /** * \brief Set the field can_move_items. */ void bear::universe::physical_item_state::set_can_move_items(bool value) { if ( value ) m_attributes.m_flags |= physical_item_flags::can_move_items; else m_attributes.m_flags &= ~physical_item_flags::can_move_items; } // physical_item_state::set_can_move_items() /*----------------------------------------------------------------------------*/ /** * \brief Tell if this item is global or not. A global item is always considered * in world::progress(). */ bool bear::universe::physical_item_state::is_global() const { return m_attributes.m_flags & physical_item_flags::global; } // physical_item_state::is_global() /*----------------------------------------------------------------------------*/ /** * \brief Set the global status of this item. A global item is always considered * in world::progress(). * \param global The new global status. * \remark Changing the global status has no effect once the item has been added * in a world. */ void bear::universe::physical_item_state::set_global( bool global ) { if ( global ) m_attributes.m_flags |= physical_item_flags::global; else m_attributes.m_flags &= ~physical_item_flags::global; } // physical_item_state::set_global() /*----------------------------------------------------------------------------*/ /** * \brief Tell if the item has a contact on its left. */ bool bear::universe::physical_item_state::has_left_contact() const { return m_attributes.m_contact.has_left_contact(); } // physical_item_state::has_left_contact() /*----------------------------------------------------------------------------*/ /** * \brief Get the contact range on the left side of the item. */ bear::universe::contact_range bear::universe::physical_item_state::get_left_contact() const { return m_attributes.m_contact.get_left_contact(); } // physical_item_state::get_left_contact() /*----------------------------------------------------------------------------*/ /** * \brief Tell if the item has a contact on its right. */ bool bear::universe::physical_item_state::has_right_contact() const { return m_attributes.m_contact.has_right_contact(); } // physical_item_state::has_right_contact() /*----------------------------------------------------------------------------*/ /** * \brief Get the contact range on the right side of the item. */ bear::universe::contact_range bear::universe::physical_item_state::get_right_contact() const { return m_attributes.m_contact.get_right_contact(); } // physical_item_state::get_right_contact() /*----------------------------------------------------------------------------*/ /** * \brief Tell if the item has a contact on its top. */ bool bear::universe::physical_item_state::has_top_contact() const { return m_attributes.m_contact.has_top_contact(); } // physical_item_state::has_top_contact() /*----------------------------------------------------------------------------*/ /** * \brief Get the contact range on the top side of the item. */ bear::universe::contact_range bear::universe::physical_item_state::get_top_contact() const { return m_attributes.m_contact.get_top_contact(); } // physical_item_state::get_top_contact() /*----------------------------------------------------------------------------*/ /** * \brief Tell if the item has a contact on its bottom. */ bool bear::universe::physical_item_state::has_bottom_contact() const { return m_attributes.m_contact.has_bottom_contact(); } // physical_item_state::has_bottom_contact() /*----------------------------------------------------------------------------*/ /** * \brief Get the contact range on the bottom side of the item. */ bear::universe::contact_range bear::universe::physical_item_state::get_bottom_contact() const { return m_attributes.m_contact.get_bottom_contact(); } // physical_item_state::get_bottom_contact() /*----------------------------------------------------------------------------*/ /** * \brief Tell if the item has a contact in middle zone. */ bool bear::universe::physical_item_state::has_middle_contact() const { return m_attributes.m_contact.has_middle_contact(); } // physical_item_state::has_middle_contact() /*----------------------------------------------------------------------------*/ /** * \brief Tell if the item has a contact. */ bool bear::universe::physical_item_state::has_contact() const { return m_attributes.m_contact.has_contact(); } // physical_item_state::has_contact() /*----------------------------------------------------------------------------*/ /** * \brief Tell if the item has a contact on one of his sides. */ bool bear::universe::physical_item_state::has_side_contact() const { return m_attributes.m_contact.has_side_contact(); } // physical_item_state::has_side_contact() /*----------------------------------------------------------------------------*/ /** * \brief Tell that the item has a contact on its left. * \param contact The new contact status. */ void bear::universe::physical_item_state::set_left_contact(bool contact) { if ( contact ) m_attributes.m_contact.set_left_contact( 0, 1 ); else m_attributes.m_contact.clear_left_contact(); } // physical_item_state::set_left_contact() /*----------------------------------------------------------------------------*/ /** * \brief Set the contact range on the left side of the item. * \param bottom The coordinate of the bottom of the contact in the world's * coordinates. * \param top The coordinate of the top of the contact in the world's * coordinates. */ void bear::universe::physical_item_state::set_left_contact ( coordinate_type bottom, coordinate_type top ) { CLAW_PRECOND( bottom <= top ); return m_attributes.m_contact.set_left_contact ( std::max(0.0, (bottom - get_bottom()) / get_height()), std::min(1.0, (top - get_bottom()) / get_height()) ); } // physical_item_state::set_left_contact() /*----------------------------------------------------------------------------*/ /** * \brief Tell that the item has a contact on its right. * \param contact The new contact status. */ void bear::universe::physical_item_state::set_right_contact(bool contact) { if ( contact ) m_attributes.m_contact.set_right_contact( 0, 1 ); else m_attributes.m_contact.clear_right_contact(); } // physical_item_state::set_right_contact() /*----------------------------------------------------------------------------*/ /** * \brief Set the contact range on the right side of the item. * \param bottom The coordinate of the bottom of the contact in the world's * coordinates. * \param top The coordinate of the top of the contact in the world's * coordinates. */ void bear::universe::physical_item_state::set_right_contact ( coordinate_type bottom, coordinate_type top ) { CLAW_PRECOND( bottom <= top ); return m_attributes.m_contact.set_right_contact ( std::max(0.0, (bottom - get_bottom()) / get_height()), std::min(1.0, (top - get_bottom()) / get_height()) ); } // physical_item_state::set_right_contact() /*----------------------------------------------------------------------------*/ /** * \brief Tell that the item has a contact on its top. * \param contact The new contact status. */ void bear::universe::physical_item_state::set_top_contact(bool contact) { if ( contact ) m_attributes.m_contact.set_top_contact( 0, 1 ); else m_attributes.m_contact.clear_top_contact(); } // physical_item_state::set_top_contact() /*----------------------------------------------------------------------------*/ /** * \brief Set the contact range on the top side of the item. * \param left The coordinate of the left of the contact in the world's * coordinates. * \param right The coordinate of the right of the contact in the world's * coordinates. */ void bear::universe::physical_item_state::set_top_contact ( coordinate_type left, coordinate_type right ) { CLAW_PRECOND( left <= right ); return m_attributes.m_contact.set_top_contact ( std::max(0.0, (left - get_left()) / get_width()), std::min(1.0, (right - get_left()) / get_width()) ); } // physical_item_state::set_top_contact() /*----------------------------------------------------------------------------*/ /** * \brief Tell that the item has a contact on its bottom. * \param contact The new contact status. */ void bear::universe::physical_item_state::set_bottom_contact(bool contact) { if ( contact ) m_attributes.m_contact.set_bottom_contact( 0, 1 ); else m_attributes.m_contact.clear_bottom_contact(); } // physical_item_state::set_bottom_contact() /*----------------------------------------------------------------------------*/ /** * \brief Set the contact range on the bottom side of the item. * \param left The coordinate of the left of the contact in the world's * coordinates. * \param right The coordinate of the right of the contact in the world's * coordinates. */ void bear::universe::physical_item_state::set_bottom_contact ( coordinate_type left, coordinate_type right ) { CLAW_PRECOND( left <= right ); return m_attributes.m_contact.set_bottom_contact ( std::max(0.0, (left - get_left()) / get_width()), std::min(1.0, (right - get_left()) / get_width()) ); } // physical_item_state::set_bottom_contact() /*----------------------------------------------------------------------------*/ /** * \brief Tell that the item has a contact in middle zone. * \param contact The new contact status. */ void bear::universe::physical_item_state::set_middle_contact(bool contact) { m_attributes.m_contact.set_middle_contact( contact ); } // physical_item_state::set_middle_contact() /*----------------------------------------------------------------------------*/ /** * \brief Tell that the item has not any contact. */ void bear::universe::physical_item_state::clear_contacts() { m_attributes.m_contact.clear_contacts(); m_attributes.m_contact_friction = 1; } // physical_item_state::clear_contacts() /*----------------------------------------------------------------------------*/ /** * \brief Set the phantom status. * \param phantom The new status. */ void bear::universe::physical_item_state::set_phantom( bool phantom ) { if ( phantom ) m_attributes.m_flags |= physical_item_flags::phantom; else m_attributes.m_flags &= ~physical_item_flags::phantom; } // physical_item_state::set_phantom() /*----------------------------------------------------------------------------*/ /** * \brief Return the phantom status. */ bool bear::universe::physical_item_state::is_phantom() const { return m_attributes.m_flags & physical_item_flags::phantom; } // physical_item_state::is_phantom() /*----------------------------------------------------------------------------*/ /** * \brief Set the artificial status. * \param a The new status. */ void bear::universe::physical_item_state::set_artificial( bool a ) { if ( a ) m_attributes.m_flags |= physical_item_flags::artificial; else m_attributes.m_flags &= ~physical_item_flags::artificial; } // physical_item_state::set_artificial() /*----------------------------------------------------------------------------*/ /** * \brief Return the artificial status. */ bool bear::universe::physical_item_state::is_artificial() const { return m_attributes.m_flags & physical_item_flags::artificial; } // physical_item_state::is_artificial() /*----------------------------------------------------------------------------*/ /** * \brief Indicate if the item is considered for weak or strong collisions. * \param w The new status. */ void bear::universe::physical_item_state::set_weak_collisions( bool w ) { if ( w ) m_attributes.m_flags |= physical_item_flags::weak_collisions; else m_attributes.m_flags &= ~physical_item_flags::weak_collisions; } // physical_item_state::set_weak_collisions() /*----------------------------------------------------------------------------*/ /** * \brief Tell if the item has to be considered as weak collisions. * \param w The new status. */ bool bear::universe::physical_item_state::has_weak_collisions() const { return m_attributes.m_flags & physical_item_flags::weak_collisions; } // physical_item_state::has_weak_collisions() /*----------------------------------------------------------------------------*/ /** * \brief Set the size of the object. * \param size The new size. */ void bear::universe::physical_item_state::set_size( const size_box_type& size ) { set_width( size.x ); set_height( size.y ); } // physical_item_state::set_size() /*----------------------------------------------------------------------------*/ /** * \brief Set the size of the object. * \param width The width of the object. * \param height The height of the object. */ void bear::universe::physical_item_state::set_size ( size_type width, size_type height ) { set_size( size_box_type(width, height) ); } // physical_item_state::set_size() /*----------------------------------------------------------------------------*/ /** * \brief Set the width of the object. * \param width The width of the object. */ void bear::universe::physical_item_state::set_width( size_type width ) { if (!m_fixed && (m_attributes.m_x_fixed == 0)) { m_bounding_box_getter = &physical_item_state::refresh_bounding_box; shape_traits::set_width( m_attributes.m_shape, width ); } } // physical_item_state::set_width() /*----------------------------------------------------------------------------*/ /** * \brief Set the height of the object. * \param height The height of the object. */ void bear::universe::physical_item_state::set_height( size_type height ) { if (!m_fixed && (m_attributes.m_y_fixed == 0)) { m_bounding_box_getter = &physical_item_state::refresh_bounding_box; shape_traits::set_height( m_attributes.m_shape, height ); } } // physical_item_state::set_height() /*----------------------------------------------------------------------------*/ /** * \brief Sets the shape of the object. * \param s The new shape. */ void bear::universe::physical_item_state::set_shape( const shape& s ) { const rectangle_type& bounding_box( get_bounding_box() ); m_attributes.m_shape = s; if ( m_fixed || (m_attributes.m_x_fixed != 0) ) { shape_traits::set_left ( m_attributes.m_shape, bounding_box.left() ); shape_traits::set_width ( m_attributes.m_shape, bounding_box.width() ); } else m_bounding_box_getter = &physical_item_state::refresh_bounding_box; if ( m_fixed || (m_attributes.m_y_fixed != 0) ) { shape_traits::set_bottom ( m_attributes.m_shape, bounding_box.bottom() ); shape_traits::set_height ( m_attributes.m_shape, bounding_box.height() ); } else m_bounding_box_getter = &physical_item_state::refresh_bounding_box; } // physical_item_state::set_shape() /*----------------------------------------------------------------------------*/ /** * \brief Gets the shape of the object. */ bear::universe::shape bear::universe::physical_item_state::get_shape() const { return m_attributes.m_shape; } // physical_item_state::get_shape() /*----------------------------------------------------------------------------*/ /** * \brief Set the mass of the object. * \param m The new mass. */ void bear::universe::physical_item_state::set_mass( double m ) { m_attributes.m_mass = m; } // physical_item_state::set_mass() /*----------------------------------------------------------------------------*/ /** * \brief Set the density of the object. * \param d The new density. */ void bear::universe::physical_item_state::set_density( double d ) { m_attributes.m_density = d; } // physical_item_state::set_density() /*----------------------------------------------------------------------------*/ /** * \brief Assigns the properties of another state to this one. * \param s The instance from which we copy the properties. */ void bear::universe::physical_item_state::set_physical_state ( const physical_item_state& s ) { if ( is_fixed() ) return; m_attributes = s.m_attributes; m_bounding_box_getter = s.m_bounding_box_getter; if ( s.is_fixed() ) fix(); } // physical_item_state::set_physical_state() /*----------------------------------------------------------------------------*/ /** * \brief Give a string representation of the item. * \param str (out) The result of the convertion. */ void bear::universe::physical_item_state::to_string( std::string& str ) const { std::ostringstream oss; oss << "0x" << std::hex << this; oss << "\nmass: " << get_mass(); oss << "\npos: " << get_left() << ' ' << get_bottom(); oss << "\nsize: " << get_width() << ' ' << get_height(); oss << "\nspeed: " << get_speed().x << ' ' << get_speed().y; oss << "\naccel: " << get_acceleration().x << ' ' << get_acceleration().y; oss << "\nangular speed: " << get_angular_speed(); oss << "\nforce (int.): " << get_internal_force().x << ' ' << get_internal_force().y; oss << "\nforce (ext.): " << get_external_force().x << ' ' << get_external_force().y; oss << "\nfriction: s=" << get_friction(); oss << " c=" << get_contact_friction(); oss << "\ndensity: " << get_density(); oss << "\nhardness/elasticity: " << get_hardness() << ' ' << get_elasticity(); oss << "\nangle: " << get_system_angle(); oss << "\nfixed: " << is_fixed() << ' ' << m_attributes.m_x_fixed << ' ' << m_attributes.m_y_fixed; oss << "\nphantom/c.m.i./art./weak.: " << is_phantom() << ' ' << can_move_items() << ' ' << is_artificial() << ' ' << has_weak_collisions(); oss << "\ncontact: { "; if ( has_left_contact() ) oss << "left [" << get_left_contact().get_min() << ", " << get_left_contact().get_max() << "] "; if ( has_right_contact() ) oss << "right [" << get_right_contact().get_min() << ", " << get_right_contact().get_max() << "] "; if ( has_top_contact() ) oss << "top [" << get_top_contact().get_min() << ", " << get_top_contact().get_max() << "] "; if ( has_bottom_contact() ) oss << "bottom [" << get_bottom_contact().get_min() << ", " << get_bottom_contact().get_max() << "] "; if ( has_middle_contact() ) oss << "middle "; oss << "}"; str += oss.str(); } // physical_item_state::to_string() const bear::universe::rectangle_type& bear::universe::physical_item_state::get_cached_bounding_box() const { return m_bounding_box; } const bear::universe::rectangle_type& bear::universe::physical_item_state::refresh_bounding_box() const { m_bounding_box = shape_traits::get_bounding_box( m_attributes.m_shape ); m_bounding_box_getter = &physical_item_state::get_cached_bounding_box; return m_bounding_box; } /*----------------------------------------------------------------------------*/ /** * \brief Output a text representation of an item. * \param os The stream in which we write. * \param item The item to output. */ std::ostream& std::operator<< ( std::ostream& os, const bear::universe::physical_item_state& item ) { std::string s; item.to_string(s); return os << s; } // operator<<() plee-the-bear-20251226/bear-engine/core/src/universe/code/world.cpp000066400000000000000000001340421512343254000246740ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::universe::world class. * \author Julien Jorge */ #include "universe/world.hpp" #include "universe/collision_info.hpp" #include "universe/collision_repair.hpp" #include "universe/density_rectangle.hpp" #include "universe/environment_rectangle.hpp" #include "universe/force_rectangle.hpp" #include "universe/friction_rectangle.hpp" #include "universe/internal/item_selection.hpp" #include "universe/link/base_link.hpp" #include "universe/shape/rectangle.hpp" #include #include #include #include template struct item_graph_visitor: public boost::dfs_visitor<> { item_graph_visitor(OutputIterator _iter) : m_iter(_iter) { } template void finish_vertex(const Vertex& u, Graph&) { *m_iter++ = u; } private: OutputIterator m_iter; }; template item_graph_visitor make_item_graph_visitor( OutputIterator it ) { return item_graph_visitor( it ); } bear::universe::world::candidate_collision::candidate_collision ( physical_item* i ) : item( i ) { } /*----------------------------------------------------------------------------*/ const unsigned int bear::universe::world::s_map_compression = 256; /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param size Size of the world. */ bear::universe::world::world( const size_box_type& size ) : m_time(0), m_static_surfaces( (unsigned int)size.x + 1, (unsigned int)size.y + 1, s_map_compression ), m_size(size), m_unit(50), m_gravity(0, -9.81*m_unit), m_default_friction(1), m_default_environment(air_environment), m_default_density(0), m_position_epsilon(0.001), m_speed_epsilon(1, 1), m_angular_speed_epsilon(0.01) { m_entities.reserve( 1024 ); } // world::world() /*----------------------------------------------------------------------------*/ /** * \brief Destructor. */ bear::universe::world::~world() { unlock(); for ( auto e : m_friction_rectangle ) delete e; for ( auto e : m_force_rectangle ) delete e; for ( auto e : m_density_rectangle ) delete e; for ( auto e : m_environment_rectangle ) delete e; } // world::~world() /*----------------------------------------------------------------------------*/ /** * \brief Call the time_step() method on entities in the active region, then * apply physic rules. * \param regions The active regions. * \param elapsed_time Elapsed time since the last call of this method. */ void bear::universe::world::progress_entities ( const region_type& regions, time_type elapsed_time ) { item_list items; candidate_collisions potential_collision; lock(); // search each item in the active zone and global item search_interesting_items(regions, items, potential_collision); assert ( std::unordered_set(items.begin(), items.end()).size() == items.size() ); // call progress for each interesting item progress_items(items, elapsed_time); // move the item and apply the links progress_physic( elapsed_time, items ); for ( candidate_collisions::iterator it( potential_collision.begin() ); it != potential_collision.end(); ++it ) it->bounding_box = it->item->get_bounding_box(); // collision detection detect_collision_all( items, potential_collision ); // inform living_item if they go out the active zone active_region_traffic( items ); while ( !items.empty() ) internal::unselect_item( items, items.begin() ); unlock(); m_time += elapsed_time; } // world::progress_entities() /*----------------------------------------------------------------------------*/ /** * \brief Add a static item in the world. * \param who The item to add. */ void bear::universe::world::add_static(physical_item* who) { CLAW_PRECOND( who != NULL ); CLAW_PRECOND( !locked() ); who->fix(); who->set_owner(*this); if ( who->is_global() ) m_global_static_items.push_back( who ); m_static_surfaces.insert( who ); } // world::add_static() /*----------------------------------------------------------------------------*/ /** * \brief Get the elapsed time since the creation of the world. */ bear::universe::time_type bear::universe::world::get_world_time() const { return m_time; } // get_world_time() /*----------------------------------------------------------------------------*/ /** * \brief Get the size of the world. */ const bear::universe::size_box_type& bear::universe::world::get_size() const { return m_size; } // world::get_size() /*----------------------------------------------------------------------------*/ /** * \brief Print some statistics. */ void bear::universe::world::print_stats() const { unsigned int min, max; double avg; m_static_surfaces.cells_load(min, max, avg); claw::logger << claw::log_verbose << "World's size is " << m_size.x << ", " << m_size.y << '\n' << "Cells' size is " << s_map_compression << '\n' << "The loading is (min, max, avg) (" << min << '\t' << max << '\t' << avg << ")\n" << m_static_surfaces.empty_cells() << " cells are empty\n" << "There are " << m_entities.size() << " entities." << std::endl; } // world::print_stats() /*----------------------------------------------------------------------------*/ /** * \brief Get the gravity applied to the items. */ const bear::universe::force_type& bear::universe::world::get_gravity() const { return m_gravity; } // world::get_gravity() /*----------------------------------------------------------------------------*/ /** * \brief Set the gravity applied to the items. * \param g The value of the gravity applied to the items. */ void bear::universe::world::set_gravity( const force_type& g ) { m_gravity = g; } // world::set_gravity(); /*----------------------------------------------------------------------------*/ /** * \brief Set the gravity applied to the items, call to_world_unit() on the * given value. * \param g The value of the gravity applied to the items. */ void bear::universe::world::set_scaled_gravity( const force_type& g ) { m_gravity.set( to_world_unit(g.x), to_world_unit(g.y) ); } // world::set_scaled_gravity(); /*----------------------------------------------------------------------------*/ /** * \brief Get the value under which the absolute value of a coordinate is * considered equals to zero. */ bear::universe::coordinate_type bear::universe::world::get_position_epsilon() const { return m_position_epsilon; } // world::get_position_epsilon() /*----------------------------------------------------------------------------*/ /** * \brief Set the value under which the absolute value of a coordinate is * considered equals to zero. * \param epsilon The minimum absolute coordinate. */ void bear::universe::world::set_position_epsilon( coordinate_type epsilon ) { m_position_epsilon = epsilon; } // world::set_position_epsilon() /*----------------------------------------------------------------------------*/ /** * \brief Set the value under which the absolute value of a coordinate is * considered equals to zero. to_world_unit() is called on the given * value. * \param epsilon The minimum absolute coordinate. */ void bear::universe::world::set_scaled_position_epsilon( coordinate_type epsilon ) { m_position_epsilon = to_world_unit(epsilon); } // world::set_scaled_position_epsilon() /*----------------------------------------------------------------------------*/ /** * \brief Get the value under which the absolute value of the speed is * considered equals to zero. */ const bear::universe::speed_type& bear::universe::world::get_speed_epsilon() const { return m_speed_epsilon; } // world::get_speed_epsilon() /*----------------------------------------------------------------------------*/ /** * \brief Set the value under which the absolute value of the speed is * considered equals to zero. * \param speed The minimum absolute speed. */ void bear::universe::world::set_speed_epsilon( const speed_type& speed ) { m_speed_epsilon = speed; } // world::set_speed_epsilon() /*----------------------------------------------------------------------------*/ /** * \brief Set the value under which the absolute value of the speed is * considered equals to zero. to_world_unit() is called on the given * value. * \param speed The minimum absolute speed. */ void bear::universe::world::set_scaled_speed_epsilon( const speed_type& speed ) { m_speed_epsilon.set( to_world_unit(speed.x), to_world_unit(speed.y) ); } // world::set_scaled_speed_epsilon() /*----------------------------------------------------------------------------*/ /** * \brief Get the value under which the absolute value of the angular speed is * considered equals to zero. */ double bear::universe::world::get_angular_speed_epsilon() const { return m_angular_speed_epsilon; } // world::get_angular_speed_epsilon() /*----------------------------------------------------------------------------*/ /** * \brief Set the value under which the absolute value of the angular speed is * considered equals to zero. * \param angular_speed The minimum absolute angular speed. */ void bear::universe::world::set_angular_speed_epsilon( double angular_speed ) { m_angular_speed_epsilon = angular_speed; } // world::set_angular_speed_epsilon() /*----------------------------------------------------------------------------*/ /** * \brief Set the unit of the world. \a u units == 1 meter. * \param u The new unit. */ void bear::universe::world::set_unit( coordinate_type u ) { m_unit = u; } // world::set_unit() /*----------------------------------------------------------------------------*/ /** * \brief Convert meters in the units of the world. * \param m The value to convert. */ bear::universe::coordinate_type bear::universe::world::to_world_unit( coordinate_type m ) const { return m * m_unit; } // world::to_world_unit() /*----------------------------------------------------------------------------*/ /** * \brief Set the unit the default friction applied to the items by the * environment. * \param f The new friction. */ void bear::universe::world::set_default_friction( double f ) { m_default_friction = f; } // world::set_default_friction() /*----------------------------------------------------------------------------*/ /** * \brief Get the average friction in an area of the world. * \param r The area to search in. */ double bear::universe::world::get_average_friction( const rectangle_type& r ) const { const double r_area( r.area() ); double result(0); if (r_area != 0) { std::vector::const_iterator it; double sum_area(0); for ( it=m_friction_rectangle.begin(); it!=m_friction_rectangle.end(); ++it ) if ( r.intersects( (*it)->rectangle ) ) { const double area = r.intersection( (*it)->rectangle ).area(); result += area / r_area * (*it)->friction; sum_area += area; } if ( sum_area < r_area ) result += (r_area - sum_area) / r_area * m_default_friction; } return result; } // world::get_average_friction() /*----------------------------------------------------------------------------*/ /** * \brief Add a region with an environment friction different * from m_default_friction. * \param r The region of the world where the friction is different. * \param f The friction in this region. * \return The friction_rectangle stored by the world. You can change its values * as you need. */ bear::universe::friction_rectangle* bear::universe::world::add_friction_rectangle ( const rectangle_type& r, double f ) { m_friction_rectangle.push_back( new friction_rectangle(r, f) ); return m_friction_rectangle.back(); } // world::add_friction_rectangle() /*----------------------------------------------------------------------------*/ /** * \brief Get the average force in an area of the world. * \param r The area to search in. */ bear::universe::force_type bear::universe::world::get_average_force( const rectangle_type& r ) const { const double r_area( r.area() ); force_type result(0, 0); if (r_area != 0) { std::vector::const_iterator it; for ( it=m_force_rectangle.begin(); it!=m_force_rectangle.end(); ++it ) if ( r.intersects( (*it)->rectangle ) ) { const double area = r.intersection( (*it)->rectangle ).area(); result += area / r_area * (*it)->force; } } return result; } // world::get_average_force() /*----------------------------------------------------------------------------*/ /** * \brief Add a region with a force is applied. * \param r The region of the world where the force is applied. * \param f The force in this region. * \return The force_rectangle stored by the world. You can change its values * as you need. */ bear::universe::force_rectangle* bear::universe::world::add_force_rectangle ( const rectangle_type& r, universe::force_type f ) { m_force_rectangle.push_back( new force_rectangle(r, f) ); return m_force_rectangle.back(); } // world::add_force_rectangle() /*----------------------------------------------------------------------------*/ /** * \brief Set the default density applied to the items by the environment. * \param f The new density. */ void bear::universe::world::set_default_density( double d ) { m_default_density = d; } // world::set_default_density() /*----------------------------------------------------------------------------*/ /** * \brief Get the average density in an area of the world. * \param r The area to search in. */ double bear::universe::world::get_average_density( const rectangle_type& r ) const { const double r_area( r.area() ); double result(0); if (r_area != 0) { std::vector::const_iterator it; double sum_area(0); for ( it=m_density_rectangle.begin(); it!=m_density_rectangle.end(); ++it ) if ( r.intersects( (*it)->rectangle ) ) { const double area = r.intersection( (*it)->rectangle ).area(); result += area / r_area * (*it)->density; sum_area += area; } if ( sum_area < r_area ) result += (r_area - sum_area) / r_area * m_default_density; } return result; } // world::get_average_density() /*----------------------------------------------------------------------------*/ /** * \brief Add a region with an environment density different * from m_default_density. * \param r The region of the world where the density is different. * \param f The density in this region. * \return The density_rectangle stored by the world. You can change its values * as you need. */ bear::universe::density_rectangle* bear::universe::world::add_density_rectangle ( const rectangle_type& r, double f ) { m_density_rectangle.push_back( new density_rectangle(r, f) ); return m_density_rectangle.back(); } // world::add_density_rectangle() /*----------------------------------------------------------------------------*/ /** * \brief Returns the force applied to an item. The result is the sum of the * forces of the world (gravity, environments…) plus the force inherent * to the item. * \param item The item for which we compute the force. */ bear::universe::force_type bear::universe::world::get_total_force_on_item ( const physical_item_state& item ) const { const rectangle_type& bounding_box( item.get_bounding_box() ); force_type result( item.get_force() + get_average_force( bounding_box ) ); if ( (item.get_density() != 0) && ( item.get_mass() != std::numeric_limits::infinity() ) ) result -= get_gravity() * item.get_mass() * get_average_density( bounding_box ) / item.get_density(); return result; } // world::get_total_force_on_item() /*----------------------------------------------------------------------------*/ /** * \brief Get the environments in an area of the world. * \param r The area to search in. * \param environments The list of environment */ void bear::universe::world::get_environments ( const rectangle_type& r, std::set& environments) const { const double r_area( r.area() ); if (r_area != 0) { std::vector::const_iterator it; double sum_area(0); for ( it=m_environment_rectangle.begin(); it!=m_environment_rectangle.end(); ++it ) if ( r.intersects( (*it)->rectangle ) ) { const double area = r.intersection( (*it)->rectangle ).area(); environments.insert((*it)->environment); sum_area += area; } if ( sum_area < r_area ) environments.insert(m_default_environment); } } // world::get_environments() /*----------------------------------------------------------------------------*/ /** * \brief Test if a position is in a given environment. * \param pos The position to consider. * \param environment The environment to check. */ bool bear::universe::world::is_in_environment (const position_type& pos, universe::environment_type environment) const { bool result = false; std::vector::const_iterator it; for ( it=m_environment_rectangle.begin(); (it!=m_environment_rectangle.end()) && !result; ++it ) if ( ( (*it)->environment== environment ) && (*it)->rectangle.includes( pos ) ) result = true; return result; } // world::is_in_environment() /*----------------------------------------------------------------------------*/ /** * \brief Set the default environment applied to the items by the * environment. * \param e The new environment. */ void bear::universe::world::set_default_environment ( const universe::environment_type e ) { m_default_environment = e; } // world::set_default_environment() /*----------------------------------------------------------------------------*/ /** * \brief Add a region with a environment is applied. * \param r The region of the world whith the environment. * \param e The environment in this region. * \return The environment_rectangle stored by the world. * You can change its values as you need. */ bear::universe::environment_rectangle* bear::universe::world::add_environment_rectangle ( const rectangle_type& r, const universe::environment_type e ) { m_environment_rectangle.push_back( new environment_rectangle(r, e) ); return m_environment_rectangle.back(); } // world::add_environment_rectangle() /*----------------------------------------------------------------------------*/ /** * \brief Pick the items overlapping a given coordinate. * \param items (out) The interesting items. * \param p The position where the items must be. * \param filter The conditions the selected items must satisfy. */ void bear::universe::world::pick_items_by_position ( item_list& items, position_type p, const item_picking_filter& filter ) const { region_type region; region.push_front( rectangle_type(p.x - 1, p.y - 1, p.x + 1, p.y + 1) ); item_list candidates; item_list::const_iterator it; list_active_items(candidates, region, filter); for ( it=candidates.begin(); it!=candidates.end(); ++it ) if ( (*it)->get_bounding_box().includes(p) ) items.push_back(*it); } // world::pick_items_by_position() /*----------------------------------------------------------------------------*/ /** * \brief Pick the items in a given rectangle. * \param items (out) The interesting items. * \param r The rectangle where the items must be. * \param filter The conditions the selected items must satisfy. */ void bear::universe::world::pick_items_in_rectangle ( item_list& items, rectangle_type r, const item_picking_filter& filter ) const { region_type region; region.push_front(r); item_list candidates; list_active_items( candidates, region, filter ); const rectangle s( r ); // We keep the items that intersects s and the items that have no size but are // placed inside r. Items having only one dimension set to zero will not be // selected yet; it must be implemented one day. for ( item_list::const_iterator it = candidates.begin(); it != candidates.end(); ++it ) if ( r.includes( (*it)->get_bottom_left() ) || (*it)->get_shape().intersects( s ) ) items.push_back(*it); } // world::pick_items_in_rectangle() /*----------------------------------------------------------------------------*/ /** * \brief Pick the items in a given area according to a given criterion. * \param items (out) The interesting items. * \param c The center of the circle where the items must be. * \param r The radius of the circle where the items must be. * \param filter The conditions the selected items must satisfy. */ void bear::universe::world::pick_items_in_circle ( item_list& items, position_type c, coordinate_type r, const item_picking_filter& filter ) const { region_type region; region.push_front( rectangle_type(c.x - r, c.y - r, c.x + r, c.y + r) ); item_list candidates; item_list::const_iterator it; list_active_items(candidates, region, filter); for ( it=candidates.begin(); it!=candidates.end(); ++it ) if ( (*it)->get_center_of_mass().distance(c) <= r ) items.push_back(*it); } // world::pick_items_in_circle() /*----------------------------------------------------------------------------*/ /** * \brief Pick an item in a given direction. * \param p The position where the search begins. * \param dir The direction in which the items are searched. * \param filter The conditions the selected items must satisfy. * \return The first item in the direction, or NULL. */ bear::universe::physical_item* bear::universe::world::pick_item_in_direction ( position_type p, vector_type dir, const item_picking_filter& filter ) const { region_type region; region.push_front( rectangle_type(p, p + dir) ); item_list candidates; item_list::const_iterator it; list_active_items(candidates, region, filter); typedef claw::math::line_2d line_type; const line_type line(p, dir); coordinate_type dist( std::numeric_limits::max() ); physical_item* result(NULL); rectangle_type p_rect(p, p); for ( it=candidates.begin(); (dist>0) && (it!=candidates.end()); ++it ) if ( (*it)->get_bounding_box().includes(p) ) { dist=0; result = *it; } else { const rectangle_type& item_box( (*it)->get_bounding_box() ); line_type item_line(0, 0, 0, 0); // vertical edges if ( item_box.left() > p.x ) item_line = line_type( item_box.bottom_left(), vector_type(0, 1) ); else if ( item_box.right() < p.x ) item_line = line_type( item_box.bottom_right(), vector_type(0, 1) ); if ( !line.parallel(item_line) ) { position_type inter = line.intersection(item_line); if ( (inter.y >= item_box.bottom()) && (inter.y <= item_box.top()) ) { coordinate_type d( inter.distance(p) ); if ( d < dist ) { dist = d; result = *it; } } } item_line = line_type(0, 0, 0, 0); // horizontal edges if ( item_box.bottom() > p.y ) item_line = line_type( item_box.bottom_left(), vector_type(1, 0) ); else if ( item_box.top() < p.y ) item_line = line_type( item_box.top_left(), vector_type(1, 0) ); if ( !line.parallel(item_line) ) { position_type inter = line.intersection(item_line); if ( (inter.x >= item_box.left()) && (inter.x <= item_box.right()) ) { coordinate_type d( inter.distance(p) ); if ( d < dist ) { dist = d; result = *it; } } } } return result; } // world::pick_item_in_direction() /*----------------------------------------------------------------------------*/ /** * \brief List items and entities which are in the active region. * \param items (out) The interesting items. * \param regions A list of regions in which we take the items. * \param filter The conditions the selected items must satisfy. */ void bear::universe::world::list_active_items ( item_list& items, const region_type& regions, const item_picking_filter& filter ) const { item_list static_items; list_static_items( regions, static_items ); item_list::const_iterator it; for (it=static_items.begin(); it!=static_items.end(); ++it) if ( filter.satisfies_condition(**it) ) items.push_back(*it); for ( it=m_entities.begin(); it!=m_entities.end(); ++it ) if ( item_in_regions(**it, regions) && filter.satisfies_condition(**it) ) items.push_back( *it ); } // world::list_active_items() /*----------------------------------------------------------------------------*/ /** * \brief Detect and correct the collisions. * \param items (in/out) The items on which we detect the collisions. * \param potential_collision The items in the world that can be involved in * collisions. */ void bear::universe::world::detect_collision_all ( item_list& items, const candidate_collisions& potential_collision ) { item_list pending; for (item_list::iterator it=items.begin(); it!=items.end(); ++it) if ( !(*it)->is_fixed() ) add_to_collision_queue(pending, *it, potential_collision); while ( !pending.empty() ) { physical_item* item(pick_next_collision(pending)); item->get_world_progress_structure().unset_waiting_for_collision(); detect_collision( item, pending, items, potential_collision ); } } // world::detect_collision_all() /*----------------------------------------------------------------------------*/ /** * \brief Find the next item to process in the collision detection. * \param pending The list of items waiting for the collision detection. * \return The first item with the greatest mass and the largest collision area. */ bear::universe::physical_item* bear::universe::world::pick_next_collision( item_list& pending ) const { CLAW_PRECOND( !pending.empty() ); item_list::iterator item = pending.begin(); double m( (*item)->get_world_progress_structure().get_collision_mass() ); double a( (*item)->get_world_progress_structure().get_collision_area() ); for (item_list::iterator it=item; it!=pending.end(); ++it) { const double mass ( (*it)->get_world_progress_structure().get_collision_mass() ); const double area ( (*it)->get_world_progress_structure().get_collision_area() ); if ( ( mass > m ) || ( ( mass == m ) && ( area > a ) ) ) { item = it; m = mass; a = area; } } physical_item* result = *item; pending.erase(item); return result; } // world::pick_next_collision() /*----------------------------------------------------------------------------*/ /** * \brief Detect and correct the collisions of an item. * \param item The item for which we search the collisions. * \param coll_detection (in/out) The instance of collision detection. * \param pending (out) A list in which are added the items in collision. * \param all_items (out) The set of all items processed in the iteration of the * current world::progress() call. * \param potential_collision The items in the world that can be involved in * collisions. */ void bear::universe::world::detect_collision ( physical_item* item, item_list& pending, item_list& all_items, const candidate_collisions& potential_collision ) const { physical_item* it = item->get_world_progress_structure().pick_next_neighbor(); if ( (it != NULL) && !it->is_artificial() ) { CLAW_ASSERT( it != item, "ref item found in collision" ); CLAW_ASSERT( !item->get_world_progress_structure().has_met(it), "repeated collision" ); const rectangle_type item_box( item->get_bounding_box() ); const rectangle_type it_box( it->get_bounding_box() ); if ( process_collision(*item, *it) ) { internal::select_item( all_items, it ); item->get_world_progress_structure().meet(it); if ( it->get_bounding_box() != it_box ) add_to_collision_queue(pending, it, potential_collision); } if ( item->get_bounding_box() == item_box ) add_to_collision_queue_no_neighborhood(pending, item); else add_to_collision_queue(pending, item, potential_collision); } } // world::detect_collision() /*----------------------------------------------------------------------------*/ /** * \brief Process the collision of two items. * \param self The first item in the collision. * \param that The other item in the collision. */ bool bear::universe::world::process_collision ( physical_item& self, physical_item& that ) const { bool result(false); if ( self.collides_with(that) ) { result = true; collision_repair repair(self, that); collision_info info_ab ( self.get_world_progress_structure().get_initial_state(), that.get_world_progress_structure().get_initial_state(), self, that, repair ); collision_info info_ba ( that.get_world_progress_structure().get_initial_state(), self.get_world_progress_structure().get_initial_state(), that, self, repair ); self.collision(info_ab); that.collision(info_ba); repair.apply(); self.adjust_cinetic(); that.adjust_cinetic(); } return result; } // world::process_collision() /*----------------------------------------------------------------------------*/ /** * \brief Search all items interesting for a collision with an other item. * \param item The item for which we search the collisions. * \param potential_collision The items in the world that can be involved * in collisions. * \param colliding (out) The colliding items. * \param mass (in/out) The largest mass of the items found in the collision. * \param area (in/out) The largest area of the collision with the items of mass * \a mass. */ void bear::universe::world::search_items_for_collision ( const physical_item& item, const candidate_collisions& potential_collision, item_list& colliding, double& mass, double& area ) const { const rectangle_type& r( item.get_bounding_box() ); // add static items item_list static_items; item_list::const_iterator its; m_static_surfaces.get_area_unique( r, static_items ); for( its=static_items.begin(); its!=static_items.end(); ++its) if ( interesting_collision( item, **its ) ) item_found_in_collision( item, *its, colliding, mass, area ); candidate_collisions::const_iterator it; // add living item for ( it=potential_collision.begin(); it!=potential_collision.end(); ++it ) if ( (it->item!=&item) && it->item->get_bounding_box().intersects(r) && interesting_collision( item, *it->item ) ) item_found_in_collision( item, it->item, colliding, mass, area ); } // world::search_items_for_collision() /*----------------------------------------------------------------------------*/ /** * \brief An item has been found in collision with an other. Update de largest * mass and the largest area, and add the item in the list. * \param item The item for which we search the collisions. * \param it The item found in collision. * \param colliding (out) The list in which we add \a it. * \param mass (in/out) The largest mass of the items found in the collision. * \param area (in/out) The largest area of the collision with the items of mass * \a mass. */ void bear::universe::world::item_found_in_collision ( const physical_item& item, physical_item* it, item_list& colliding, double& mass, double& area ) const { const double a = it->get_bounding_box().intersection(item.get_bounding_box()).area(); if ( a != 0 ) { it->get_world_progress_structure().init(); colliding.push_back(it); if ( !(item.is_phantom() || item.is_fixed() ) && it->can_move_items() ) { if ( it->get_mass() > mass ) { mass = it->get_mass(); area = a; } else if ( it->get_mass() == mass ) if ( a > area ) area = a; } } } // world::item_found_in_collision() /*----------------------------------------------------------------------------*/ /** * \brief Search all interesting items in the active region * and add dependent items. * \param regions The active regions. * \param items (out) The items in the region. * \param potential_collision (out) The items in the world that can be involved * in collisions. */ void bear::universe::world::search_interesting_items ( const region_type& regions, item_list& items, candidate_collisions& potential_collision ) const { item_list::const_iterator it; // add static items of the active zone item_list static_items; m_static_surfaces.get_areas( regions.begin(), regions.end(), static_items ); for( it=static_items.begin(); it!=static_items.end(); ++it) internal::select_item(items, *it); // add global static items for (it=m_global_static_items.begin(); it!=m_global_static_items.end(); ++it) internal::select_item(items, *it); // add living item of the active zone and global living item for ( it=m_entities.begin(); it!=m_entities.end(); ++it ) { if ( (*it)->is_global() || item_in_regions(**it, regions) ) internal::select_item(items, *it); if ( !(*it)->is_artificial() ) potential_collision.push_back( candidate_collision( *it ) ); } // add dependent item stabilize_dependent_items(items); } // world::search_interesting_items() /*----------------------------------------------------------------------------*/ /** * \brief Get all items depending of an initial set of items. * \param items (in) The items for which we want the dependents, (out) the * initial items plus the dependent ones. */ void bear::universe::world::stabilize_dependent_items( item_list& items ) const { dependency_graph_type g; dependency_vertex_map vertex; std::unordered_set single_items( items.begin(), items.end() ); item_list pending; std::swap( items, pending ); while ( !pending.empty() ) { physical_item* const src( pending.back() ); pending.pop_back(); find_dependency_links( pending, g, vertex, single_items, src ); } make_sorted_dependency_list( g, vertex, single_items, items ); } void bear::universe::world::find_dependency_links ( item_list& pending, dependency_graph_type& graph, dependency_vertex_map& vertex, std::unordered_set& single_items, physical_item* item ) const { // get the item relatively to which I move physical_item* const ref ( const_cast( item->get_movement_reference() ) ); if ( ref != NULL ) add_dependency_edge( pending, graph, vertex, single_items, ref, item ); // get the items depending on me item_list dep_items; item->get_dependent_items(dep_items); // check if there is any new item in dep_items for ( item_list::const_iterator it = dep_items.begin(); it != dep_items.end(); ++it ) { physical_item* dep( *it ); if ( dep == NULL ) claw::logger << claw::log_warning << "Dependent item is NULL" << std::endl; else add_dependency_edge( pending, graph, vertex, single_items, item, dep ); } } void bear::universe::world::add_dependency_edge ( item_list& pending, dependency_graph_type& graph, dependency_vertex_map& vertex, std::unordered_set& single_items, physical_item* tail, physical_item* head ) const { add_dependency_vertex( pending, graph, vertex, single_items, tail ); add_dependency_vertex( pending, graph, vertex, single_items, head ); boost::add_edge( vertex.left.at( tail ), vertex.left.at( head ), graph ); } void bear::universe::world::add_dependency_vertex ( item_list& pending, dependency_graph_type& graph, dependency_vertex_map& vertex, std::unordered_set& single_items, physical_item* v ) const { internal::select_item( pending, v ); if ( vertex.left.find( v ) == vertex.left.end() ) { single_items.erase( v ); vertex.insert ( dependency_vertex_map::value_type( v, boost::add_vertex( graph ) ) ); } } void bear::universe::world::make_sorted_dependency_list ( const dependency_graph_type& graph, const dependency_vertex_map& vertex, const std::unordered_set& single_items, item_list& items ) const { typedef std::vector vertex_list; vertex_list sorted; sorted.reserve( boost::num_vertices( graph ) ); boost::bgl_named_params params(0); boost::depth_first_search ( graph, params.visitor ( make_item_graph_visitor( std::back_inserter( sorted ) ) ) ); items.reserve( single_items.size() + sorted.size() ); items.insert( items.end(), single_items.begin(), single_items.end() ); for ( vertex_list::const_reverse_iterator it( sorted.rbegin() ); it != sorted.rend(); ++it ) items.push_back( vertex.right.at( *it ) ); } /*----------------------------------------------------------------------------*/ /** * \brief Call the time_step() method on some items. * \param items The items on which we call the method. * \param elapsed_time Elapsed time since the last call. */ void bear::universe::world::progress_items ( const item_list& items, time_type elapsed_time ) const { item_list::const_iterator it; for( it=items.begin(); it!=items.end(); ++it ) (*it)->time_step( elapsed_time ); } // world::progress_items() /*----------------------------------------------------------------------------*/ /** * \brief Update position of some items. * \param elapsed_time Elasped time since the last progress. * \param items The items to move. */ void bear::universe::world::progress_physic ( time_type elapsed_time, const item_list& items ) const { item_list::const_iterator it; apply_links(items); for(it=items.begin(); it!=items.end(); ++it) progress_physic_move_item(elapsed_time, **it); } // world::progress_physic() /*----------------------------------------------------------------------------*/ /** * \brief Update position of an items. * \param elapsed_time Elasped time since the last progress. * \param item The item to move. */ void bear::universe::world::progress_physic_move_item ( time_type elapsed_time, physical_item& item ) const { if ( item.is_fixed() ) item.get_world_progress_structure().set_move_done(); else { physical_item* ref = const_cast( item.get_movement_reference() ); bool move_it(true); if ( ref != NULL ) if ( !ref->get_world_progress_structure().move_is_done() && (ref != &item) ) { claw::logger << claw::log_warning << "The reference item for the movement has not " << "been moved yet, so the current item will not be " << "moved. The reference item is "; if ( !ref->get_world_progress_structure().is_selected() ) claw::logger << "not "; claw::logger << "selected for movement." << std::endl; move_it = false; } if ( move_it ) { item.move( elapsed_time ); item.get_world_progress_structure().set_move_done(); } } item.clear_contacts(); } // world::progress_physic_move_item() /*----------------------------------------------------------------------------*/ /** * \brief Apply the forces of the links between items. * \param items The set of items for which we want the links. */ void bear::universe::world::apply_links(const item_list& items) const { claw::avl links; claw::avl::const_iterator it_link; item_list::const_iterator it; for (it=items.begin(); it!=items.end(); ++it) links.insert( (*it)->links_begin(), (*it)->links_end() ); for( it_link=links.begin(); it_link!=links.end(); ++it_link ) (*it_link)->adjust(); } // world::apply_links() /*----------------------------------------------------------------------------*/ /** * \brief Tell items if they leave the active region. * \param items The items to verify. */ void bear::universe::world::active_region_traffic( const item_list& items ) { item_list::const_iterator it; for( it=m_last_interesting_items.begin(); it!=m_last_interesting_items.end(); ++it ) if ( !(*it)->get_world_progress_structure().is_selected() ) (*it)->leaves_active_region(); for( it=items.begin(); it!=items.end(); ++it ) if ( !(*it)->get_world_progress_structure().was_selected() ) (*it)->enters_active_region(); m_last_interesting_items = items; } // world::active_region_traffic() /*----------------------------------------------------------------------------*/ /** * \brief List static items which are in the active region. * \param items (out) The interesting items. * \param regions A list of regions in which we take the items. */ void bear::universe::world::list_static_items ( const region_type& regions, item_list& items ) const { m_static_surfaces.get_areas_unique( regions.begin(), regions.end(), items ); } // world::list_static_items() /*----------------------------------------------------------------------------*/ /** * \brief Tell if an item is in a region. * \param item The item to check. * \param regions A list of regions in which search the item. */ bool bear::universe::world::item_in_regions ( const physical_item& item, const region_type& regions ) const { return regions.intersects( item.get_bounding_box() ); } // world::item_in_regions() /*----------------------------------------------------------------------------*/ /** * \brief Add an entity in the world. * \param who The entity to add. */ void bear::universe::world::add(physical_item* const& who) { who->set_owner(*this); m_entities.push_back( who ); } // world::add() /*----------------------------------------------------------------------------*/ /** * \brief Remove an entity from the world. * \param who The entity to remove. */ void bear::universe::world::remove(physical_item* const& who) { item_list::iterator eit(m_entities.end()); item_list::iterator it = std::find( m_entities.begin(), eit, who ); if ( it != eit ) { std::swap( *it, m_entities.back() ); m_entities.pop_back(); who->quit_owner(); } else claw::logger << claw::log_warning << "Can't remove unknown item." << std::endl; eit = m_last_interesting_items.end(); it = std::find( m_last_interesting_items.begin(), eit, who ); if ( it != eit ) { std::swap( *it, m_last_interesting_items.back() ); m_last_interesting_items.pop_back(); } } // world::remove() /*----------------------------------------------------------------------------*/ /** * \brief Add an item in the queue for collision detection. * \param pending (out) List of items to which is added the item. * \param item The item to add. * \param potential_collision The items in the world that can be involved in * collisions. */ void bear::universe::world::add_to_collision_queue ( item_list& pending, physical_item* item, const candidate_collisions& potential_collision ) const { if ( !item->has_weak_collisions() && !item->is_artificial() ) if ( create_neighborhood(*item, potential_collision) ) if ( !item->get_world_progress_structure().is_waiting_for_collision() ) { item->get_world_progress_structure().set_waiting_for_collision(); pending.push_back(item); } } // world::add_to_collision_queue() /*----------------------------------------------------------------------------*/ /** * \brief Add an item in the queue for collision detection, without computing * the neighborhood. * \param pending (out) List of items to which is added the item. * \param item The item to add. */ void bear::universe::world::add_to_collision_queue_no_neighborhood ( item_list& pending, physical_item* item ) const { if ( !item->has_weak_collisions() && !item->is_artificial() ) if ( item->get_world_progress_structure().update_collision_penetration() ) if ( !item->get_world_progress_structure().is_waiting_for_collision() ) { item->get_world_progress_structure().set_waiting_for_collision(); pending.push_back(item); } } // world::add_to_collision_queue_no_neighborhood() /*----------------------------------------------------------------------------*/ /** * \brief Find the neighborhood of an item. * \param item The item for which we want the neighborhood. * \param potential_collision The items in the world that can be involved in * collisions. */ bool bear::universe::world::create_neighborhood ( physical_item& item, const candidate_collisions& potential_collision ) const { item_list n; double area(0); double mass(0); search_items_for_collision( item, potential_collision, n, mass, area ); bool result(!n.empty()); item.get_world_progress_structure().set_collision_neighborhood(n, mass, area); return result; } // world::create_neighborhood() /*----------------------------------------------------------------------------*/ /** * \brief Tells if it is interesting to process a collision against two given * items. The function returns true if one of the items is not interested * by the collision. * \param a The first item. * \param b The other item. */ bool bear::universe::world::interesting_collision ( const physical_item& a, const physical_item& b ) const { return !b.is_artificial() && !a.get_world_progress_structure().has_met(&b) && a.interesting_collision( b ) && b.interesting_collision( a ); } // world::interesting_collision() plee-the-bear-20251226/bear-engine/core/src/universe/code/world_progress_structure.cpp000066400000000000000000000266601512343254000307460ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::universe::selection_structure class. * \author Julien Jorge */ #include "universe/world_progress_structure.hpp" #include "universe/physical_item.hpp" #include namespace bear { namespace universe { namespace detail { static constexpr std::uint32_t initialized( 1 << 0 ); static constexpr std::uint32_t is_selected( 1 << 1 ); static constexpr std::uint32_t was_selected( 1 << 2 ); static constexpr std::uint32_t move_is_done( 1 << 3 ); static constexpr std::uint32_t is_waiting_for_collision( 1 << 4 ); } } } /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param item The item with which we compute the intersection. */ bear::universe::world_progress_structure::lt_collision::lt_collision ( const physical_item& item ) : m_item(item) { } // world_progress_structure::lt_collision::lt_collision() /*----------------------------------------------------------------------------*/ /** * \brief Comparator. * \param a The first item to compare. * \param b The second item to compare. */ bool bear::universe::world_progress_structure::lt_collision::operator() ( const physical_item* a, const physical_item* b ) const { bool result; if ( a->get_mass() == b->get_mass() ) { double area_a(0); double area_b(0); const rectangle_type& r( m_item.get_bounding_box() ); const rectangle_type& a_box( a->get_bounding_box() ); if ( a_box.intersects(r) ) area_a = a_box.intersection(r).area(); const rectangle_type& b_box( b->get_bounding_box() ); if ( b_box.intersects(r) ) area_b = b_box.intersection(r).area(); result = area_a < area_b; } else result = a->get_mass() < b->get_mass(); return result; } // world_progress_structure::lt_collision::operator()() /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param item The item that can be selected. */ bear::universe::world_progress_structure::world_progress_structure ( physical_item& item ) : m_item(item), m_collision_mass(0), m_collision_area(0), m_flags( 0 ) { } // world_progress_structure::world_progress_structure() /*----------------------------------------------------------------------------*/ /** * \brief Initialize the structure, if not already initialized. */ void bear::universe::world_progress_structure::init() { if ( m_flags & detail::initialized ) return; m_initial_state = m_item; m_flags |= detail::initialized; m_collision_neighborhood.clear(); m_collision_mass = 0; m_collision_area = 0; m_already_met.clear(); } // world_progress_structure::init() /*----------------------------------------------------------------------------*/ /** * \brief Remove the selection. */ void bear::universe::world_progress_structure::deinit() { CLAW_PRECOND( m_flags & detail::initialized ); if ( is_selected() ) m_flags = detail::was_selected; else m_flags = 0; m_collision_neighborhood.clear(); m_collision_mass = 0; m_collision_area = 0; m_already_met.clear(); } // world_progress_structure::deinit() /*----------------------------------------------------------------------------*/ /** * \brief Mark the item as selected. */ void bear::universe::world_progress_structure::select() { CLAW_PRECOND( m_flags & detail::initialized ); m_flags |= detail::is_selected; } // world_progress_structure::select() /*----------------------------------------------------------------------------*/ /** * \brief Mark the item as unselected. */ void bear::universe::world_progress_structure::unselect() { m_flags &= ~( detail::is_selected | detail::was_selected ); } // world_progress_structure::select() /*----------------------------------------------------------------------------*/ /** * \brief Tell if the item is selected. */ bool bear::universe::world_progress_structure::is_selected() const { CLAW_PRECOND( !( m_flags & detail::is_selected ) || ( m_flags & detail::initialized ) ); return m_flags & detail::is_selected; } // world_progress_structure::is_selected() /*----------------------------------------------------------------------------*/ /** * \brief Tell if the item was previously selected. */ bool bear::universe::world_progress_structure::was_selected() const { return m_flags & detail::was_selected; } // world_progress_structure::was_selected() /*----------------------------------------------------------------------------*/ /** * \brief Mark the item as waiting for collision detection. */ void bear::universe::world_progress_structure::set_waiting_for_collision() { m_flags |= detail::is_waiting_for_collision; } // world_progress_structure::set_waiting_for_collision() /*----------------------------------------------------------------------------*/ /** * \brief Mark the item as not waiting for collision detection. */ void bear::universe::world_progress_structure::unset_waiting_for_collision() { m_flags &= ~detail::is_waiting_for_collision; } // world_progress_structure::unset_waiting_for_collision() /*----------------------------------------------------------------------------*/ /** * \brief Tell if the item is waiting for collision detection. */ bool bear::universe::world_progress_structure::is_waiting_for_collision() const { return m_flags & detail::is_waiting_for_collision; } // world_progress_structure::is_waiting_for_collision() /*----------------------------------------------------------------------------*/ /** * \brief Set that the move of the item has been done. */ void bear::universe::world_progress_structure::set_move_done() { m_flags |= detail::move_is_done; } // world_progress_structure::set_move_done() /*----------------------------------------------------------------------------*/ /** * \brief Tell if the move of the item has been done. */ bool bear::universe::world_progress_structure::move_is_done() const { return m_flags & detail::move_is_done; } // world_progress_structure::move_is_done() /*----------------------------------------------------------------------------*/ /** * \brief Get the initial state. */ const bear::universe::physical_item_state& bear::universe::world_progress_structure::get_initial_state() const { CLAW_PRECOND( m_flags & detail::initialized ); return m_initial_state; } // world_progress_structure::get_initial_state() /*----------------------------------------------------------------------------*/ /** * \brief Set the neighborhood in collisions with the item. * \param n The items in collision. * \param mass The largest mass of the items in \a n. * \param area The largest area of the items in \a n with the same mass * \a mass. * \post n.empty() == true. */ void bear::universe::world_progress_structure::set_collision_neighborhood ( item_list& n, double mass, double area ) { m_collision_neighborhood.clear(); std::swap( m_collision_neighborhood, n ); m_collision_mass = mass; m_collision_area = area; } // world_progress_structure::set_collision_neighborhood() /*----------------------------------------------------------------------------*/ /** * \brief Get the collision neighborhood of this item. * \param n (out) The neighborhood. * \post m_collision_neighborhood.empty() == true. */ void bear::universe::world_progress_structure::swap_collision_neighborhood ( item_list& n ) { std::swap( n, m_collision_neighborhood ); m_collision_neighborhood.clear(); } // world_progress_structure::swap_collision_neighborhood() /*----------------------------------------------------------------------------*/ /** * \brief Get the largest mass of the items in collision with this item. */ double bear::universe::world_progress_structure::get_collision_mass() const { return m_collision_mass; } // world_progress_structure::get_collision_mass() /*----------------------------------------------------------------------------*/ /** * \brief Get the largest area of the items in collision with this item, having * the same mass (equal to get_collision_mass()). */ double bear::universe::world_progress_structure::get_collision_area() const { return m_collision_area; } // world_progress_structure::get_collision_area() /*----------------------------------------------------------------------------*/ /** * \brief Tell that this item meets an other item. * \param item The other item. */ void bear::universe::world_progress_structure::meet( physical_item* item ) { if ( &m_item < item ) m_already_met.push_back(item); else item->get_world_progress_structure().meet(&m_item); } // world_progress_structure::meet() /*----------------------------------------------------------------------------*/ /** * \brief Tell if this item meets an other item. * \param item The other item. */ bool bear::universe::world_progress_structure::has_met ( const physical_item* item ) const { if ( &m_item < item ) return std::find(m_already_met.begin(), m_already_met.end(), item) != m_already_met.end(); else return item->get_world_progress_structure().has_met(&m_item); } // world_progress_structure::has_met() /*----------------------------------------------------------------------------*/ /** * \brief Get the next neighbor to process. * \param item The other item. */ bear::universe::physical_item* bear::universe::world_progress_structure::pick_next_neighbor() { physical_item* result(NULL); while ( (result==NULL) && !m_collision_neighborhood.empty() ) { const item_list::iterator eit( m_collision_neighborhood.end() ); item_list::iterator it = std::max_element ( m_collision_neighborhood.begin(), eit, lt_collision(m_item) ); if ( it != eit ) { if ( !has_met(*it) ) result = *it; m_collision_neighborhood.erase(it); } } return result; } // world_progress_structure::pick_next_neighbor() /*----------------------------------------------------------------------------*/ /** * \brief Update the largest mass and area of the collisions with this item. */ bool bear::universe::world_progress_structure::update_collision_penetration() { m_collision_mass = 0; m_collision_area = 0; item_list::iterator it = m_collision_neighborhood.begin(); const rectangle_type& item_box( m_item.get_bounding_box() ); while ( it != m_collision_neighborhood.end() ) { bool collision(false); const rectangle_type& box( ( *it )->get_bounding_box() ); if ( item_box.intersects( box ) ) { const double a( item_box.intersection( box ).area() ); if ( a != 0 ) { collision = true; if ( (*it)->get_mass() > m_collision_mass ) { m_collision_mass = (*it)->get_mass(); m_collision_area = a; } else if ( (*it)->get_mass() == m_collision_mass ) { m_collision_mass = (*it)->get_mass(); if ( a > m_collision_area ) m_collision_area = a; } } } if ( collision ) ++it; else it = m_collision_neighborhood.erase( it ); } return !m_collision_neighborhood.empty(); } // world_progress_structure::update_collision_penetration() plee-the-bear-20251226/bear-engine/core/src/universe/code/zone.cpp000066400000000000000000000051261512343254000245200ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::universe::zone class. * \author Julien Jorge */ #include "universe/zone.hpp" #include /*----------------------------------------------------------------------------*/ const unsigned int bear::universe::zone::cardinality = 9; /*----------------------------------------------------------------------------*/ /** * \brief Find the zone where is a box. * \param that_box The box to locate. * \param this_box The considered box (the box who split the space). */ bear::universe::zone::position bear::universe::zone::find ( const rectangle_type& that_box, const rectangle_type& this_box ) { position result; // he's on my left if ( that_box.right() <= this_box.left() ) { if ( that_box.bottom() >= this_box.top() ) result = top_left_zone; else if ( that_box.top() <= this_box.bottom() ) result = bottom_left_zone; else result = middle_left_zone; } // on my right else if ( that_box.left() >= this_box.right() ) { if ( that_box.bottom() >= this_box.top() ) result = top_right_zone; else if ( that_box.top() <= this_box.bottom() ) result = bottom_right_zone; else result = middle_right_zone; } else // in the middle { if ( that_box.bottom() >= this_box.top() ) result = top_zone; else if ( that_box.top() <= this_box.bottom() ) result = bottom_zone; else result = middle_zone; } return result; } // zone::find() /*----------------------------------------------------------------------------*/ /** * \brief Get the opposite side of a given side. * \param side The side from which we want the opposite. */ bear::universe::zone::position bear::universe::zone::opposite_of( position side ) { switch(side) { case top_left_zone: return bottom_right_zone; case top_zone: return bottom_zone; case top_right_zone: return bottom_left_zone; case middle_left_zone: return middle_right_zone; case middle_zone: return middle_zone; case middle_right_zone: return middle_left_zone; case bottom_left_zone: return top_right_zone; case bottom_zone: return top_zone; case bottom_right_zone: return top_left_zone; } // this should never happen but it turns a warning off throw new claw::exception ( "bear::universe::zone::opposite_of(): Invalid position size" ); } // zone::opposite_of() plee-the-bear-20251226/bear-engine/core/src/universe/collision_align_policy.hpp000066400000000000000000000022371512343254000273640ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Defines how the informations related to the alignment are set. * \author Julien Jorge */ #ifndef __UNIVERSE_COLLISION_ALIGN_POLICY_HPP__ #define __UNIVERSE_COLLISION_ALIGN_POLICY_HPP__ #include "universe/contact_mode.hpp" #include "universe/class_export.hpp" namespace bear { namespace universe { /** * \brief The collision_align_policy classe defines how the informations * related to the alignment are set. * \author Julien Jorge */ class UNIVERSE_EXPORT collision_align_policy { public: explicit collision_align_policy ( contact_mode::value_type c = contact_mode::range_contact ); contact_mode::value_type get_contact_mode() const; private: /** \brief Tell how the contacts are set. */ contact_mode::value_type m_contact_mode; }; // class collision_align_policy } // namespace universe } // namespace bear #endif // __UNIVERSE_COLLISION_ALIGN_POLICY_HPP__ plee-the-bear-20251226/bear-engine/core/src/universe/collision_info.hpp000066400000000000000000000046001512343254000256420ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Find some informations on how the scene was when a collision occured. * \author Julien Jorge */ #ifndef __UNIVERSE_COLLISION_INFO_HPP__ #define __UNIVERSE_COLLISION_INFO_HPP__ #include "universe/zone.hpp" #include "universe/class_export.hpp" namespace bear { namespace universe { class alignment; class collision_repair; class physical_item_state; /** * \brief Find some informations on how the scene was when a collision * occured. * \author Julien Jorge */ class UNIVERSE_EXPORT collision_info { public: collision_info( const physical_item_state& previous_self, const physical_item_state& previous_that, physical_item_state& self, physical_item_state& that, collision_repair& repair ); zone::position get_collision_side() const; const position_type& get_bottom_left_on_contact() const; const physical_item_state& other_previous_state() const; const physical_item_state& reference_previous_state() const; physical_item_state& other_item() const; collision_repair& get_collision_repair() const; private: alignment* find_alignment() const; void apply_alignment ( const alignment& align, const physical_item_state& self ); private: /** \brief The previous state of the item considered as reference in the collision. */ const physical_item_state& m_previous_self; /** \brief The previous state of the other item in the collision. */ const physical_item_state& m_previous_other; /** \brief The other item in the collision. */ physical_item_state& m_other; /** \brief Position of the bottom-left corner of the other item when the collision occured. */ position_type m_position_on_contact; /** \brief Side of the reference item hit first when the collision occured. */ zone::position m_side; /** \brief Informations for repairing the collision. */ collision_repair& m_repair; }; // class collision_info } // namespace universe } // namespace bear #endif // __UNIVERSE_COLLISION_INFO_HPP__ plee-the-bear-20251226/bear-engine/core/src/universe/collision_repair.hpp000066400000000000000000000030041512343254000261660ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief This class stores the needs for repairing a collision. * \author Julien Jorge */ #ifndef __UNIVERSE_COLLISION_REPAIR_HPP__ #define __UNIVERSE_COLLISION_REPAIR_HPP__ #include "universe/types.hpp" #include "universe/class_export.hpp" namespace bear { namespace universe { class physical_item_state; /** * \brief This class stores the needs for repairing a collision. * \author Julien Jorge */ class UNIVERSE_EXPORT collision_repair { public: collision_repair ( physical_item_state& first_item, physical_item_state& second_item ); void set_contact_normal ( const physical_item_state& ref, const vector_type& normal ); void apply(); private: void apply_force_transfert(); private: /** \brief The first item in the collision. */ physical_item_state& m_first_item; /** \brief The second item in the collision. */ physical_item_state& m_second_item; /** \brief The vector normal of the contact. */ vector_type m_contact_normal; /** \brief The item to use as the reference for the contact normal. */ physical_item_state* m_contact_reference; }; // class collision_repair } // namespace universe } // namespace bear #endif // __UNIVERSE_COLLISION_REPAIR_HPP__ plee-the-bear-20251226/bear-engine/core/src/universe/collision_test/000077500000000000000000000000001512343254000251555ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/core/src/universe/collision_test/bottom_contact_is_lower.hpp000066400000000000000000000031101512343254000326030ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Check, in a collision context, if the bottom of the "that" item was * lower than a given value, relative to the top of the "self" item. * \author Julien Jorge */ #ifndef __UNIVERSE_BOTTOM_CONTACT_IS_LOWER_HPP__ #define __UNIVERSE_BOTTOM_CONTACT_IS_LOWER_HPP__ #include "universe/collision_info.hpp" #include "universe/class_export.hpp" namespace bear { namespace universe { /** * \brief Check, in a collision context, if the bottom of the "that" item * was lower than a given value, relative to the top of the "self" * item. * \author Julien Jorge */ class UNIVERSE_EXPORT bottom_contact_is_lower { public: /** \brief The type of the line that separate the block into two regions. */ typedef claw::math::line_2d line_type; public: bottom_contact_is_lower( const line_type& line ); bottom_contact_is_lower( coordinate_type val ); bool operator()( const collision_info& info, physical_item& self, physical_item& that ) const; private: /** \brief We will check if the bottom of the other item was in the part at the top of this line. */ const line_type m_line; }; // class bottom_contact_is_lower } // namespace universe } // namespace bear #endif // __UNIVERSE_BOTTOM_CONTACT_IS_LOWER_HPP__ plee-the-bear-20251226/bear-engine/core/src/universe/collision_test/code/000077500000000000000000000000001512343254000260675ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/core/src/universe/collision_test/code/bottom_contact_is_lower.cpp000066400000000000000000000053641512343254000335250ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bottom_contact_is_lower class. * \author Julien Jorge */ #include "universe/collision_test/bottom_contact_is_lower.hpp" #include /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param line We will check if the bottom of the other item was in the part on * the top of this line. */ bear::universe::bottom_contact_is_lower::bottom_contact_is_lower ( const line_type& line ) : m_line(line) { } // bottom_contact_is_lower::bottom_contact_is_lower() /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param val We will check if the bottom of the other item was lower than this * value. */ bear::universe::bottom_contact_is_lower::bottom_contact_is_lower ( bear::universe::coordinate_type val ) : m_line(0, val, 1, 0) { } // bottom_contact_is_lower::bottom_contact_is_lower() /*----------------------------------------------------------------------------*/ /** * \brief Check if the bottom of the "that" item was * lower than \a m_value, relative to the top of the "self" item. * \param info Informations on the collision. * \param self The first item in the collision. * \param that The other item in the collision. */ bool bear::universe::bottom_contact_is_lower::operator() ( const collision_info& info, physical_item& self, physical_item& that ) const { bear::universe::position_type origin( that.get_bottom_middle() ); claw::math::line_2d movement ( origin, info.other_previous_state().get_bottom_middle() - origin ); bear::universe::coordinate_type that_bottom; bear::universe::coordinate_type y_bound; switch ( info.get_collision_side() ) { case zone::middle_right_zone: that_bottom = movement.y_value( self.get_right() ); y_bound = m_line.y_value( self.get_width() ); break; case zone::middle_left_zone: that_bottom = movement.y_value( self.get_top_left().x ); y_bound = m_line.y_value( self.get_top_left().x ); break; case zone::middle_zone: that_bottom = info.other_previous_state().get_bottom(); y_bound = m_line.y_value ( info.other_previous_state().get_center_of_mass().x - self.get_top_left().x ); break; default: { CLAW_ASSERT( false, "This test is for left/middle/right collisions" ); } } return that_bottom - (int)self.get_top_left().y < y_bound; } // bottom_contact_is_lower::operator()() plee-the-bear-20251226/bear-engine/core/src/universe/const_item_handle.hpp000066400000000000000000000036121512343254000263150ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Safe way to point an item that could die between two uses. * \author Julien Jorge */ #ifndef __UNIVERSE_CONST_ITEM_HANDLE_HPP__ #define __UNIVERSE_CONST_ITEM_HANDLE_HPP__ #include "universe/class_export.hpp" namespace bear { namespace universe { class physical_item; /** * \brief Safe way to point an item that could die between two uses. * \author Julien Jorge */ class UNIVERSE_EXPORT const_item_handle { public: typedef const physical_item item_type; public: const_item_handle(); const_item_handle( const item_type* item ); const_item_handle( const item_type& item ); const_item_handle( const const_item_handle& that ); ~const_item_handle(); const item_type* get() const; const item_type& operator*() const; const item_type* operator->() const; const_item_handle& operator=( const item_type* item ); const_item_handle& operator=( const const_item_handle& that ); bool operator==( const item_type* item ) const; bool operator==( const const_item_handle& that ) const; bool operator!=( const item_type* item ) const; bool operator!=( const const_item_handle& that ) const; bool operator<( const const_item_handle& that ) const; private: /** \brief The critical item. */ const item_type* m_item; }; // class const_item_handle } // namespace universe } // namespace bear bool operator== ( const bear::universe::physical_item* a, const bear::universe::const_item_handle& b ); bool operator!= ( const bear::universe::physical_item* a, const bear::universe::const_item_handle& b ); #endif // __UNIVERSE_CONST_ITEM_HANDLE_HPP__ plee-the-bear-20251226/bear-engine/core/src/universe/contact_info.hpp000066400000000000000000000044621512343254000253100ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Defines the informations related to the contacts of an item. * \author Julien Jorge */ #ifndef __UNIVERSE_CONTACT_INFO_HPP__ #define __UNIVERSE_CONTACT_INFO_HPP__ #include "universe/contact_range.hpp" #include "universe/types.hpp" #include "universe/class_export.hpp" namespace bear { namespace universe { /** * \brief The contact_info class defines the informations related to the * contacts of an item. * \author Julien Jorge */ class UNIVERSE_EXPORT contact_info { public: contact_info(); const contact_range& get_top_contact() const; bool has_top_contact() const; void clear_top_contact(); void set_top_contact( coordinate_type left, coordinate_type right ); const contact_range& get_bottom_contact() const; bool has_bottom_contact() const; void clear_bottom_contact(); void set_bottom_contact( coordinate_type left, coordinate_type right ); const contact_range& get_left_contact() const; bool has_left_contact() const; void clear_left_contact(); void set_left_contact( coordinate_type bottom, coordinate_type top ); const contact_range& get_right_contact() const; bool has_right_contact() const; void clear_right_contact(); void set_right_contact( coordinate_type bottom, coordinate_type top ); bool has_middle_contact() const; void set_middle_contact( bool contact ); bool has_contact() const; bool has_side_contact() const; void clear_contacts(); private: /** \brief The contacts on the top side. */ contact_range m_top_contact; /** \brief The contacts on the bottom side. */ contact_range m_bottom_contact; /** \brief The contacts on the right side. */ contact_range m_right_contact; /** \brief The contacts on the left side. */ contact_range m_left_contact; /** \brief Tell if there is a contact inside the object. */ bool m_middle_contact; }; // class contact_info } // namespace universe } // namespace bear #endif // __UNIVERSE_CONTACT_INFO_HPP__ plee-the-bear-20251226/bear-engine/core/src/universe/contact_mode.hpp000066400000000000000000000023431512343254000252750ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Defines how the contacts are set in a collision. * \author Julien Jorge */ #ifndef __UNIVERSE_CONTACT_MODE_HPP__ #define __UNIVERSE_CONTACT_MODE_HPP__ #include "universe/class_export.hpp" #include namespace bear { namespace universe { /** * \brief The contact_mode class defines how the contacts are set. * \author Julien Jorge */ class UNIVERSE_EXPORT contact_mode { public: /** * The various ways the contacts are set when aligning the items. */ enum value_type { /** The contact is set on the whole side of the item. */ full_contact, /** The contact is set on the range of the collision. */ range_contact, /** The contact is not set at all. */ no_contact }; // enum contact_mode public: static value_type from_string( const std::string& v ); }; // class contact_mode } // namespace universe } // namespace bear #endif // __UNIVERSE_CONTACT_MODE_HPP__ plee-the-bear-20251226/bear-engine/core/src/universe/contact_range.hpp000066400000000000000000000022501512343254000254420ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Stores the informations related to the length of a contact. * \author Julien Jorge */ #ifndef __UNIVERSE_CONTACT_RANGE_HPP__ #define __UNIVERSE_CONTACT_RANGE_HPP__ #include "universe/types.hpp" #include "universe/class_export.hpp" namespace bear { namespace universe { /** * \brief The contact_range class describes the length of a contact. * \author Julien Jorge */ class UNIVERSE_EXPORT contact_range { public: contact_range( coordinate_type min = 0, coordinate_type max = 0 ); coordinate_type get_min() const; coordinate_type get_max() const; void clear(); bool empty() const; private: /** \brief The coordinate where the contact starts. */ coordinate_type m_min; /** \brief The coordinate where the contact ends. */ coordinate_type m_max; }; // class contact_range } // namespace universe } // namespace bear #endif // __UNIVERSE_CONTACT_RANGE_HPP__ plee-the-bear-20251226/bear-engine/core/src/universe/density_rectangle.hpp000066400000000000000000000022301512343254000263340ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A rectangle in the world, where the density is different from the * default density. * \author Sebastien Angibaud */ #ifndef __UNIVERSE_DENSITY_RECTANGLE_HPP__ #define __UNIVERSE_DENSITY_RECTANGLE_HPP__ #include "universe/types.hpp" #include "universe/class_export.hpp" namespace bear { namespace universe { /** * \brief A rectangle in the world, where the density is different from the * default density. * \author Sebastien Angibaud. */ class UNIVERSE_EXPORT density_rectangle { public: density_rectangle(); density_rectangle( const rectangle_type& r, double f ); public: /** \brief The rectangle where the density is different. */ rectangle_type rectangle; /** \brief The density in this rectangle. */ double density; }; // class density_rectangle } // namespace universe } // namespace bear #endif // __UNIVERSE_DENSITY_RECTANGLE_HPP__ plee-the-bear-20251226/bear-engine/core/src/universe/derived_item_handle.hpp000066400000000000000000000145261512343254000266170ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Safe way to point to an item that could die between two uses. * \author Julien Jorge */ #ifndef __UNIVERSE_DERIVED_ITEM_HANDLE_HPP__ #define __UNIVERSE_DERIVED_ITEM_HANDLE_HPP__ #include "universe/item_handle.hpp" #include "universe/const_item_handle.hpp" namespace bear { namespace universe { /** * \brief Safe way to point an item that could die between two uses. * \author Julien Jorge * * \b Template \b parameters: * - \a DerivedType: the final type of the pointed item. * - \a ItemType: a class that inherits from universe::physical_item. * * \b Sample \b usage: * * Let's consider the following item class * \code * class my_item: * public physical_item, * public an_other_class * { * // ... * }; // my_item * \endcode * * Let \c special_item be an item that deals only with instances of \c * an_other_class. \c special_item can keep a handle on an item of type \c * my_item and still consider the \c an_other_class part by using a \c * derived_item_handle. * \code * class special_item * { * public: * void set_item( physical_item* item ) { m_item = item; } * * private: * // The item on which we work. * derived_item_handle m_item; * * }; // special_item * \endcode * * \sa derived_item_handle_maker, const_derived_item_handle_maker */ template class derived_item_handle { public: typedef derived_item_handle self_type; typedef item_handle handle_type; typedef ItemType item_type; typedef DerivedType derived_type; public: derived_item_handle(); derived_item_handle( ItemType* item ); derived_item_handle( ItemType& item ); derived_item_handle( const handle_type& item ); derived_item_handle( const self_type& that ); static self_type create_from_derived( DerivedType* item ); static self_type create_from_derived( DerivedType& item ); DerivedType* get() const; ItemType* get_item() const; DerivedType& operator*() const; DerivedType* operator->() const; self_type& operator=( ItemType* item ); self_type& operator=( const self_type& that ); self_type& operator=( const handle_type& item ); bool operator==( const ItemType* item ) const; bool operator==( const DerivedType* item ) const; bool operator==( const self_type& that ) const; bool operator!=( const ItemType* item ) const; bool operator!=( const DerivedType* item ) const; bool operator!=( const self_type& that ) const; bool operator<( const self_type& that ) const; private: void cast_item(); private: /** \brief The critical item. */ handle_type m_item; DerivedType* m_derived; }; // class derived_item_handle /** * \brief Safe way to point a const item that could die between two uses. * \author Julien Jorge * * \sa derived_item_handle, const_derived_item_handle_maker */ template class const_derived_item_handle { public: typedef const_derived_item_handle self_type; typedef const_item_handle handle_type; typedef ItemType item_type; typedef DerivedType derived_type; public: const_derived_item_handle(); const_derived_item_handle( const ItemType* item ); const_derived_item_handle( const ItemType& item ); const_derived_item_handle( const handle_type& item ); const_derived_item_handle( const self_type& that ); static self_type create_from_derived( DerivedType* item ); static self_type create_from_derived( DerivedType& item ); const DerivedType* get() const; const ItemType* get_item() const; const DerivedType& operator*() const; const DerivedType* operator->() const; self_type& operator=( const ItemType* item ); self_type& operator=( const self_type& that ); self_type& operator=( const handle_type& item ); bool operator==( const ItemType* item ) const; bool operator==( const DerivedType* item ) const; bool operator==( const self_type& that ) const; bool operator!=( const ItemType* item ) const; bool operator!=( const DerivedType* item ) const; bool operator!=( const self_type& that ) const; bool operator<( const self_type& that ) const; private: void cast_item(); private: /** \brief The critical item. */ handle_type m_item; const DerivedType* m_derived; }; // class const_derived_item_handle /** * \brief A wrapper to easily create a derived_item_handle for a non * constant class type inheriting from physical_item. */ template derived_item_handle item_handle_from( DerivedType* item ); /** * \brief A wrapper to easily create a derived_item_handle for a constant * class type inheriting from physical_item. */ template const_derived_item_handle const_item_handle_from( const DerivedType* item ); } // namespace universe } // namespace bear template bool operator== ( const DerivedType* item, const bear::universe::derived_item_handle& handle ); template bool operator!= ( const DerivedType* item, const bear::universe::derived_item_handle& handle ); template bool operator== ( const DerivedType* item, const bear::universe::const_derived_item_handle& handle ); template bool operator!= ( const DerivedType* item, const bear::universe::const_derived_item_handle& handle ); #include "universe/impl/derived_item_handle.tpp" #endif // __UNIVERSE_DERIVED_ITEM_HANDLE_HPP__ plee-the-bear-20251226/bear-engine/core/src/universe/environment_rectangle.hpp000066400000000000000000000024471512343254000272330ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A rectangle in the world, where the environment is different from the * default environment. * \author Sébastien Angibaud */ #ifndef __UNIVERSE_ENVIRONMENT_RECTANGLE_HPP__ #define __UNIVERSE_ENVIRONMENT_RECTANGLE_HPP__ #include "universe/types.hpp" #include "universe/class_export.hpp" #include "universe/environment_type.hpp" namespace bear { namespace universe { /** * \brief A rectangle in the world, where the environment is different * from the default environment. * \author Sebastien Angibaud. */ class UNIVERSE_EXPORT environment_rectangle { public: environment_rectangle(); environment_rectangle ( const rectangle_type& r, const universe::environment_type e ); public: /** \brief The rectangle where the environment is different. */ rectangle_type rectangle; /** \brief The environment in this rectangle. */ universe::environment_type environment; }; // class environment_rectangle } // namespace universe } // namespace bear #endif // __UNIVERSE_ENVIRONMENT_RECTANGLE_HPP__ plee-the-bear-20251226/bear-engine/core/src/universe/environment_type.hpp000066400000000000000000000013761512343254000262500ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Data environment_type for the universe::namespace. * \author Sebastien Angibaud */ #ifndef __UNIVERSE_ENVIRONMENT_TYPE_HPP__ #define __UNIVERSE_ENVIRONMENT_TYPE_HPP__ #include #include namespace bear { namespace universe { enum environment_type { air_environment = 0, fire_environment, ice_environment, water_environment }; // enum environment_type } // namespace universe } // namespace bear #endif // __UNIVERSE_ENVIRONMENT_TYPE_HPP__ plee-the-bear-20251226/bear-engine/core/src/universe/force_rectangle.hpp000066400000000000000000000021121512343254000257520ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A rectangle in the world, where a force is applied. * \author Sebastien Angibaud */ #ifndef __UNIVERSE_FORCE_RECTANGLE_HPP__ #define __UNIVERSE_FORCE_RECTANGLE_HPP__ #include "universe/types.hpp" #include "universe/class_export.hpp" namespace bear { namespace universe { /** * \brief A rectangle in the world, where a force is applied. * \author Sebastien Angibaud. */ class UNIVERSE_EXPORT force_rectangle { public: force_rectangle(); force_rectangle( const rectangle_type& r, universe::force_type f ); public: /** \brief The rectangle where the force is different. */ rectangle_type rectangle; /** \brief The force in this rectangle. */ universe::force_type force; }; // class force_rectangle } // namespace universe } // namespace bear #endif // __UNIVERSE_FORCE_RECTANGLE_HPP__ plee-the-bear-20251226/bear-engine/core/src/universe/forced_movement/000077500000000000000000000000001512343254000252775ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/core/src/universe/forced_movement/base_forced_movement.hpp000066400000000000000000000064571512343254000321720ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief The base class for all forced movements. * \author Julien Jorge */ #ifndef __UNIVERSE_BASE_FORCED_MOVEMENT_HPP__ #define __UNIVERSE_BASE_FORCED_MOVEMENT_HPP__ #include "universe/item_handle.hpp" #include "universe/forced_movement/reference_point.hpp" #include "universe/class_export.hpp" namespace bear { namespace universe { class physical_item; /** * \brief The base class for all forced movements. * * If an item have a forced movement, the physic rules won't apply to him. * * \author Julien Jorge */ class UNIVERSE_EXPORT base_forced_movement { public: base_forced_movement(); virtual ~base_forced_movement(); virtual base_forced_movement* clone() const = 0; void init(); void clear_item(); void set_item( physical_item& item ); bool has_reference_point() const; void set_reference_point( const reference_point& r ); position_type get_reference_position() const; void set_reference_point_on_center( physical_item& item ); void set_ratio_reference_point ( physical_item& item, const position_type& ratio, const position_type& gap ); bool has_reference_item() const; physical_item& get_reference_item() const; void set_auto_remove(bool b); void set_auto_angle(bool b); position_type get_moving_item_ratio() const; void set_moving_item_ratio(const position_type & ratio); position_type get_moving_item_gap() const; void set_moving_item_gap(const position_type & gap); time_type next_position( time_type elapsed_time ); virtual bool is_finished() const = 0; protected: physical_item& get_item(); const physical_item& get_item() const; const position_type get_moving_item_position() const; void set_moving_item_position(const position_type& pos); void set_moving_item_system_angle( double angle ); double get_moving_item_system_angle() const; private: void update_angle( time_type elapsed_time ) const; void adjust_cinetic ( const position_type& initial_position, double initial_angle, time_type dt ) const; virtual void do_init() = 0; virtual time_type do_next_position( time_type elapsed_time ) = 0; private: /** \brief The item currently moving. */ item_handle m_moving_item; /** \brief An computation of the reference point. */ reference_point m_reference_point; /** \brief Tell if the movement removes himself from the moving item when finished. */ bool m_auto_remove; /** \brief Tell if the angle of the moving item is updated according to its angular speed. */ bool m_auto_angle; /* \brief The ratio on size applied to compute moving item's position. */ universe::position_type m_moving_item_ratio; /* \brief The gap applied to compute moving item's position. */ universe::position_type m_moving_item_gap; }; // class base_forced_movement } // namespace universe } // namespace bear #endif // __UNIVERSE_BASE_FORCED_MOVEMENT_HPP__ plee-the-bear-20251226/bear-engine/core/src/universe/forced_movement/base_reference_point.hpp000066400000000000000000000030641512343254000321540ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Instances of base_reference_point compute the reference * point used in forced movements. * \author Julien Jorge */ #ifndef __UNIVERSE_BASE_REFERENCE_POINT_HPP__ #define __UNIVERSE_BASE_REFERENCE_POINT_HPP__ #include "universe/types.hpp" #include "universe/class_export.hpp" namespace bear { namespace universe { class physical_item; /** * \brief Instances of base_reference_point compute the reference * point used in forced movements. * * \author Julien Jorge */ class UNIVERSE_EXPORT base_reference_point { public: /** \brief Destructor. */ virtual ~base_reference_point() {} /** \brief Create a copy of this instance using the operator new. */ virtual base_reference_point* clone() const = 0; /** \brief Tell if get_point() can be safely called. */ virtual bool is_valid() const = 0; /** \brief Get the position of the reference point. */ virtual position_type get_point() const = 0; /** \brief Tell if a call to get_item() can be done. */ virtual bool has_item() const = 0; /** \brief Get the item used to compute the position. */ virtual physical_item& get_item() const = 0; }; // class base_reference_point } // namespace universe } // namespace bear #endif // __UNIVERSE_BASE_REFERENCE_POINT_HPP__ center_of_mass_reference_point.hpp000066400000000000000000000030431512343254000341470ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/core/src/universe/forced_movement/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Instances of center_of_mass_reference_point compute the reference * point of in forced movements as the center of mass of a given item. * \author Julien Jorge */ #ifndef __UNIVERSE_CENTER_OF_MASS_REFERENCE_POINT_HPP__ #define __UNIVERSE_CENTER_OF_MASS_REFERENCE_POINT_HPP__ #include "universe/forced_movement/base_reference_point.hpp" #include "universe/item_handle.hpp" #include "universe/class_export.hpp" namespace bear { namespace universe { /** * \brief Instances of center_of_mass_reference_point compute the reference * point of in forced movements as the center of mass of a given * item. * * \author Julien Jorge */ class UNIVERSE_EXPORT center_of_mass_reference_point: public base_reference_point { public: explicit center_of_mass_reference_point( physical_item& item ); virtual base_reference_point* clone() const; virtual bool is_valid() const; virtual position_type get_point() const; virtual bool has_item() const; virtual physical_item& get_item() const; private: /** The item on which we take the center of mass. */ item_handle m_item; }; // class center_of_mass_reference_point } // namespace universe } // namespace bear #endif // __UNIVERSE_CENTER_OF_MASS_REFERENCE_POINT_HPP__ plee-the-bear-20251226/bear-engine/core/src/universe/forced_movement/code/000077500000000000000000000000001512343254000262115ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/core/src/universe/forced_movement/code/base_forced_movement.cpp000066400000000000000000000274731512343254000331000ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the base_forced_movement class. * \author Julien Jorge. */ #include "universe/forced_movement/base_forced_movement.hpp" #include "universe/forced_movement/center_of_mass_reference_point.hpp" #include "universe/forced_movement/ratio_reference_point.hpp" #include "universe/physical_item.hpp" #include #include /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ bear::universe::base_forced_movement::base_forced_movement() : m_moving_item(NULL), m_auto_remove(false), m_auto_angle(false), m_moving_item_ratio(0.5, 0.5), m_moving_item_gap(0, 0) { } // base_forced_movement::base_forced_movement() /*----------------------------------------------------------------------------*/ /** * \brief Destructor. */ bear::universe::base_forced_movement::~base_forced_movement() { // nothing to do. } // base_forced_movement::~base_forced_movement() /*----------------------------------------------------------------------------*/ /** * \brief Initialise the item. */ void bear::universe::base_forced_movement::init() { if ( m_moving_item != NULL ) do_init(); else claw::logger << claw::log_warning << "base_forced_movement::init(): no item." << std::endl; } // base_forced_movement::init() /*----------------------------------------------------------------------------*/ /** * \brief Stop applying this movement to the item. */ void bear::universe::base_forced_movement::clear_item() { m_moving_item = NULL; } // base_forced_movement::clear_item() /*----------------------------------------------------------------------------*/ /** * \brief Set the item concerned by this movement. * \param item The item to which is applied this movement. */ void bear::universe::base_forced_movement::set_item( physical_item& item ) { m_moving_item = &item; } // base_forced_movement::set_item() /*----------------------------------------------------------------------------*/ /** * \brief Tell if the reference point used by this movement is valid. */ bool bear::universe::base_forced_movement::has_reference_point() const { return m_reference_point.is_valid(); } // base_forced_movement::has_reference_point() /*----------------------------------------------------------------------------*/ /** * \brief Set the reference point used by this movement. * \param r The reference point. */ void bear::universe::base_forced_movement::set_reference_point ( const reference_point& r ) { m_reference_point = r; } // base_forced_movement::set_reference_point() /*----------------------------------------------------------------------------*/ /** * \brief Get the point used as the reference for the movement. */ bear::universe::position_type bear::universe::base_forced_movement::get_reference_position() const { CLAW_PRECOND( has_reference_item() ); return m_reference_point.get_point(); } // base_forced_movement::get_reference_position() /*----------------------------------------------------------------------------*/ /** * \brief Set the reference point on the center of mass of a given item. * \param item The item of which we use the center of mass. */ void bear::universe::base_forced_movement::set_reference_point_on_center ( physical_item& item ) { set_reference_point( center_of_mass_reference_point(item) ); } // base_forced_movement::set_reference_point_on_center() /*----------------------------------------------------------------------------*/ /** * \brief Set the reference point on a point of a given item calculated with * ratio of size and gap. * \param item The item of which we use the center of mass. * \param ratio The ratio to applied on size. * \param gap The gap to applied. */ void bear::universe::base_forced_movement::set_ratio_reference_point ( physical_item& item, const position_type& ratio, const position_type & gap ) { set_reference_point( ratio_reference_point(item, ratio, gap) ); } // base_forced_movement::set_ratio_reference_point() /*----------------------------------------------------------------------------*/ /** * \brief Tell if this movement has a reference item. */ bool bear::universe::base_forced_movement::has_reference_item() const { return m_reference_point.has_item(); } // base_forced_movement::has_reference_item() /*----------------------------------------------------------------------------*/ /** * \brief Get the item used as a reference in the movement. * \pre has_reference_item() */ bear::universe::physical_item& bear::universe::base_forced_movement::get_reference_item() const { CLAW_PRECOND( has_reference_item() ); return m_reference_point.get_item(); } // base_forced_movement::get_reference_item() /*----------------------------------------------------------------------------*/ /** * \brief Tell if the movement removes himself from the moving item when * finished. */ void bear::universe::base_forced_movement::set_auto_remove(bool b) { m_auto_remove = b; } // base_forced_movement::set_auto_remove() /*----------------------------------------------------------------------------*/ /** * \brief Tell if the angle of the moving item is updated according to its * angular speed. */ void bear::universe::base_forced_movement::set_auto_angle(bool b) { m_auto_angle = b; } // base_forced_movement::set_auto_angle() /*----------------------------------------------------------------------------*/ /** * \brief Get the ratio of the size to use when computing moving item's * position. */ bear::universe::position_type bear::universe::base_forced_movement::get_moving_item_ratio() const { return m_moving_item_ratio; } // base_forced_movement::get_moving_item_ratio() /*----------------------------------------------------------------------------*/ /** * \brief Set the ratio of the size to use when computing moving item's * position. * \param ratio The ratio to use. */ void bear::universe::base_forced_movement::set_moving_item_ratio (const position_type & ratio) { m_moving_item_ratio = ratio; } // base_forced_movement::set_moving_item_ratio() /*----------------------------------------------------------------------------*/ /** * \brief Get the gap to use when computing moving item's position. */ bear::universe::position_type bear::universe::base_forced_movement::get_moving_item_gap() const { return m_moving_item_gap; } // base_forced_movement::get_moving_item_gap() /*----------------------------------------------------------------------------*/ /** * \brief Set the gap to use when computing moving item's position. * \param gap The ratio to use. */ void bear::universe::base_forced_movement::set_moving_item_gap (const position_type & gap) { m_moving_item_gap = gap; } // base_forced_movement::set_moving_item_gap() /*----------------------------------------------------------------------------*/ /** * \brief Move the item to the next position. * \param elapsed_time Elapsed time since the last call. * \return The remaining time if the movement is finished. */ bear::universe::time_type bear::universe::base_forced_movement::next_position( time_type elapsed_time ) { time_type remaining_time(elapsed_time); if ( m_moving_item != NULL ) { const position_type pos( get_moving_item_position() ); const double angle( m_moving_item->get_system_angle() ); remaining_time = do_next_position(elapsed_time); const time_type dt( elapsed_time - remaining_time ); if ( m_auto_angle ) update_angle( dt ); if ( dt > 0 ) adjust_cinetic( pos, angle, dt ); if (is_finished() && m_auto_remove) m_moving_item->clear_forced_movement(); } else claw::logger << claw::log_warning << "base_forced_movement::next_position(): no item." << std::endl; return remaining_time; } // base_forced_movement::next_position() /*----------------------------------------------------------------------------*/ /** * \brief Get the item concerned by this movement. */ bear::universe::physical_item& bear::universe::base_forced_movement::get_item() { CLAW_PRECOND( m_moving_item != NULL ); return *m_moving_item; } // base_forced_movement::get_item() /*----------------------------------------------------------------------------*/ /** * \brief Get the item concerned by this movement. */ const bear::universe::physical_item& bear::universe::base_forced_movement::get_item() const { CLAW_PRECOND( m_moving_item != NULL ); return *m_moving_item; } // base_forced_movement::get_item() /*----------------------------------------------------------------------------*/ /** * \brief Set the position of moving item. * \param pos The position to give at moving item. */ void bear::universe::base_forced_movement::set_moving_item_position ( const position_type& pos ) { if ( m_moving_item != NULL ) { m_moving_item->set_bottom_left ( pos.x - m_moving_item->get_width() * m_moving_item_ratio.x - m_moving_item_gap.x, pos.y - m_moving_item->get_height() * m_moving_item_ratio.y - m_moving_item_gap.y ); } } // base_forced_movement::set_moving_item_position() /*----------------------------------------------------------------------------*/ /** * \brief Get the position of moving item. */ const bear::universe::position_type bear::universe::base_forced_movement::get_moving_item_position() const { position_type pos(0, 0); if ( m_moving_item != NULL ) { pos.x = m_moving_item->get_left() + m_moving_item->get_width() * m_moving_item_ratio.x + m_moving_item_gap.x; pos.y = m_moving_item->get_bottom() + m_moving_item->get_height() * m_moving_item_ratio.y + m_moving_item_gap.y; } return pos; } //base_forced_movement::get_moving_item_position() /*----------------------------------------------------------------------------*/ /** * \brief Set the system angle of moving item. */ void bear::universe::base_forced_movement::set_moving_item_system_angle ( double angle ) { if ( m_moving_item != NULL ) m_moving_item->set_system_angle(angle); } // base_forced_movement::set_moving_item_system_angle() /*----------------------------------------------------------------------------*/ /** * \brief Get the system angle of moving item. */ double bear::universe::base_forced_movement::get_moving_item_system_angle() const { double angle(0); if ( m_moving_item != NULL ) angle = m_moving_item->get_system_angle(); return angle; } // base_forced_movement::set_moving_item_system_angle() /*----------------------------------------------------------------------------*/ /** * Update the system angle of the moving item. * \param elapsed_time The time during which the item moved. */ void bear::universe::base_forced_movement::update_angle ( time_type elapsed_time ) const { const double angular_speed( m_moving_item->get_angular_speed() ); m_moving_item->set_system_angle ( m_moving_item->get_system_angle() + angular_speed * elapsed_time ); } // base_forced_movement::update_angle() /*----------------------------------------------------------------------------*/ /** * Adjust the informations about the cinetic for the moving item. * \param initial_position The initial position of the moving item. * \param initial_angle The initial angle of the moving item. * \param dt The time during which the item moved. */ void bear::universe::base_forced_movement::adjust_cinetic ( const position_type& initial_position, double initial_angle, time_type dt ) const { m_moving_item->set_angular_speed ( (m_moving_item->get_system_angle() - initial_angle) / dt ); m_moving_item->set_speed ( (get_moving_item_position() - initial_position) / dt ); } // base_forced_movement::adjust_cinetic() center_of_mass_reference_point.cpp000066400000000000000000000045051512343254000350600ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/core/src/universe/forced_movement/code/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the center_of_mass_reference_point class. * \author Julien Jorge */ #include "universe/forced_movement/center_of_mass_reference_point.hpp" #include "universe/physical_item.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param item The item of which the center of mass is returned. */ bear::universe::center_of_mass_reference_point::center_of_mass_reference_point ( physical_item& item ) : m_item(item) { } // center_of_mass_reference_point::center_of_mass_reference_point() /*----------------------------------------------------------------------------*/ /** * \brief Duplicate this instance. */ bear::universe::base_reference_point* bear::universe::center_of_mass_reference_point::clone() const { return new center_of_mass_reference_point(*this); } // center_of_mass_reference_point::clone() /*----------------------------------------------------------------------------*/ /** * \brief Tell if this reference is usable. */ bool bear::universe::center_of_mass_reference_point::is_valid() const { return has_item(); } // center_of_mass_reference_point::is_valid() /*----------------------------------------------------------------------------*/ /** * \brief Get the center of mass of the item. */ bear::universe::position_type bear::universe::center_of_mass_reference_point::get_point() const { CLAW_PRECOND( has_item() ); return m_item->get_center_of_mass(); } // center_of_mass_reference_point::get_point() /*----------------------------------------------------------------------------*/ /** * \brief Tell if the item is still valid. */ bool bear::universe::center_of_mass_reference_point::has_item() const { return m_item != NULL; } // center_of_mass_reference_point::has_item() /*----------------------------------------------------------------------------*/ /** * \brief Get the item of which the center of mass is returned. */ bear::universe::physical_item& bear::universe::center_of_mass_reference_point::get_item() const { CLAW_PRECOND( has_item() ); return *m_item; } // center_of_mass_reference_point::get_item() plee-the-bear-20251226/bear-engine/core/src/universe/forced_movement/code/forced_aiming.cpp000066400000000000000000000153031512343254000315050ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::universe::forced_aiming class. * \author Julien Jorge */ #include "universe/forced_movement/forced_aiming.hpp" #include "universe/physical_item.hpp" #include #include /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param length The duration of the movement. */ bear::universe::forced_aiming::forced_aiming( time_type length ) : m_max_angle( std::numeric_limits::infinity() ), m_max_speed( std::numeric_limits::infinity() ), m_acceleration( std::numeric_limits::infinity() ), m_total_time( length ), m_remaining_time(m_total_time), m_apply_angle(false) { } // forced_aiming::forced_aiming() /*----------------------------------------------------------------------------*/ /** * \brief Instanciate a copy of this movement. */ bear::universe::base_forced_movement* bear::universe::forced_aiming::clone() const { return new forced_aiming(*this); } // forced_aiming::clone() /*----------------------------------------------------------------------------*/ /** * \brief Set the maximum angle when the direction changes. * \param a The angle. */ void bear::universe::forced_aiming::set_max_angle( double a ) { if (a < 0) m_max_angle = -a; else m_max_angle = a; } // forced_aiming::set_max_angle() /*----------------------------------------------------------------------------*/ /** * \brief Set the maximum speed of the moving item. * \param s The speed. */ void bear::universe::forced_aiming::set_max_speed( double s ) { if( s < 0 ) m_max_speed = -s; else m_max_speed = s; } // forced_aiming::set_max_speed() /*----------------------------------------------------------------------------*/ /** * \brief Set the acceleration of the moving item. * \param a The acceleration. */ void bear::universe::forced_aiming::set_acceleration( double a ) { if( a < 0 ) m_acceleration = -a; else m_acceleration = a; } // forced_aiming::set_acceleration() /*----------------------------------------------------------------------------*/ /** * \brief Tell if we apply the angle of the movement to the item. * \param b Apply or not. */ void bear::universe::forced_aiming::set_apply_angle( bool b ) { m_apply_angle = b; } // forced_aiming::set_apply_angle() /*----------------------------------------------------------------------------*/ /** * \brief Set the duration of the movement. * \param length The duration of the movement. */ void bear::universe::forced_aiming::set_total_time( time_type length ) { m_total_time = length; } // forced_aiming::set_total_time() /*----------------------------------------------------------------------------*/ /** * \brief Tell if the movement is finished. */ bool bear::universe::forced_aiming::is_finished() const { return !has_reference_point() || (m_remaining_time == 0); } // forced_aiming::is_finished() /*----------------------------------------------------------------------------*/ /** * \brief Initialize the movement. */ void bear::universe::forced_aiming::do_init() { m_remaining_time = m_total_time; } // forced_aiming::do_init() /*----------------------------------------------------------------------------*/ /** * \brief Do an iteration of the movement. * \param elapsed_time Elapsed time since the last call. * \return The remaining time if the movement is finished. */ bear::universe::time_type bear::universe::forced_aiming::do_next_position( time_type elapsed_time ) { time_type remaining_time(0); if ( has_reference_point() ) { remaining_time = compute_remaining_time(elapsed_time); double s = compute_speed(elapsed_time); vector_type dir; double a = compute_direction(dir); set_moving_item_position ( get_moving_item_position() + dir * s * elapsed_time ); if ( m_apply_angle ) set_moving_item_system_angle( a ); } return remaining_time; } // forced_aiming::do_next_position() /*----------------------------------------------------------------------------*/ /** * \brief Compute the remaining time after this step of the movement. * \param elapsed_time Elapsed time since the last call to do_next_position(). */ bear::universe::time_type bear::universe::forced_aiming::compute_remaining_time( time_type& elapsed_time ) { time_type result; if ( elapsed_time > m_remaining_time ) { result = elapsed_time - m_remaining_time; elapsed_time = m_remaining_time; m_remaining_time = 0; } else { result = 0; m_remaining_time -= elapsed_time; } return result; } // forced_aiming::compute_remaining_time() /*----------------------------------------------------------------------------*/ /** * \brief Compute the speed to apply to the item. * \param elapsed_time Elapsed time since the last call to do_next_position(). */ double bear::universe::forced_aiming::compute_speed( time_type elapsed_time ) const { double s = get_item().get_speed().length(); if ( s < m_max_speed ) s = std::min(s + m_acceleration * elapsed_time, m_max_speed); else if ( s > m_max_speed ) s = std::max(s - m_acceleration * elapsed_time, m_max_speed); return s; } // forced_aiming::compute_speed() /*----------------------------------------------------------------------------*/ /** * \brief Compute the direction to apply to the item. * \param dir (out) The direction. * \return The angle of the direction. */ double bear::universe::forced_aiming::compute_direction( vector_type& dir ) const { vector_type current_dir( get_item().get_speed() ); dir = vector_type( get_moving_item_position(), get_reference_position() ); current_dir.normalize(); dir.normalize(); if ( current_dir == vector_type(0, 0) ) current_dir = dir; double v = dir.dot_product(current_dir); if ( v > 1 ) v = 1; if ( v < -1 ) v = -1; double delta_angle = std::acos(v); double sign = current_dir.x * dir.y - current_dir.y * dir.x; double current_angle = std::atan2(current_dir.y, current_dir.x); double final_angle; if ( sign > 0 ) // the item goes on its left { if ( delta_angle > m_max_angle ) final_angle = current_angle + m_max_angle; else final_angle = current_angle + delta_angle; } else { if ( delta_angle > m_max_angle ) final_angle = current_angle - m_max_angle; else final_angle = current_angle - delta_angle; } dir.set( std::cos(final_angle), std::sin(final_angle) ); return final_angle; } // forced_aiming::compute_direction() plee-the-bear-20251226/bear-engine/core/src/universe/forced_movement/code/forced_goto.cpp000066400000000000000000000104451512343254000312130ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::universe::forced_goto class. * \author Julien Jorge. */ #include "universe/forced_movement/forced_goto.hpp" #include "universe/physical_item.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param length Maximum time to reach the target. */ bear::universe::forced_goto::forced_goto( time_type length ) : m_total_time(length), m_elapsed_time(0), m_target_position(0, 0), m_length(0, 0) { } // forced_goto::forced_goto() /*----------------------------------------------------------------------------*/ /** * \brief Instanciate a copy of this movement. */ bear::universe::base_forced_movement* bear::universe::forced_goto::clone() const { return new forced_goto(*this); } // forced_goto::clone() /*----------------------------------------------------------------------------*/ /** * \brief Set the total time to reach the target position. * \param length Total time to reach the target position. */ void bear::universe::forced_goto::set_total_time( time_type length ) { m_total_time = length; } // forced_goto::set_total_time() /*----------------------------------------------------------------------------*/ /** * \brief Set the duration of the acceleration and deceleration. * \param length The duration of the acceleration and deceleration. */ void bear::universe::forced_goto::set_acceleration_time( time_type length ) { m_speed_generator.set_acceleration_time(length); } // forced_goto::set_acceleration_time() /*----------------------------------------------------------------------------*/ /** * \brief Set the length of the movement. * \param v The length of the movement. */ void bear::universe::forced_goto::set_length( const vector_type& v ) { set_x_length(v.x); set_y_length(v.y); } // forced_goto::set_length() /*----------------------------------------------------------------------------*/ /** * \brief Set the X-length of the movement. * \param v The length. */ void bear::universe::forced_goto::set_x_length( coordinate_type v ) { m_length.x = v; } // forced_goto::set_x_length() /*----------------------------------------------------------------------------*/ /** * \brief Set the Y-length of the movement. * \param v The length. */ void bear::universe::forced_goto::set_y_length( coordinate_type v ) { m_length.y = v; } // forced_goto::set_y_length() /*----------------------------------------------------------------------------*/ /** * \brief Tell if the movement is finished. */ bool bear::universe::forced_goto::is_finished() const { return m_elapsed_time == m_total_time; } // forced_goto::is_finished() /*----------------------------------------------------------------------------*/ /** * \brief Initialize the movement. */ void bear::universe::forced_goto::do_init() { m_elapsed_time = 0; m_target_position = get_moving_item_position() + m_length; m_speed_generator.set_distance ( m_target_position.distance(get_moving_item_position()) ); m_speed_generator.set_total_time(m_total_time); if ( m_speed_generator.get_acceleration_time() > m_total_time ) m_speed_generator.set_acceleration_time( m_total_time / 2 ); } // forced_goto::do_init() /*----------------------------------------------------------------------------*/ /** * \brief Do an iteration of the movement. * \param elapsed_time Elapsed time since the last call. * \return The remaining time if the movement is finished. */ bear::universe::time_type bear::universe::forced_goto::do_next_position( time_type elapsed_time ) { time_type remaining_time(0); if ( m_elapsed_time + elapsed_time >= m_total_time ) { remaining_time = m_elapsed_time + elapsed_time - m_total_time; m_elapsed_time = m_total_time; set_moving_item_position(m_target_position); } else { vector_type d(m_length); d.normalize(); set_moving_item_position ( get_moving_item_position() + m_speed_generator.get_speed(m_elapsed_time) * d * elapsed_time ); m_elapsed_time += elapsed_time; } return remaining_time; } // forced_goto::do_next_position() plee-the-bear-20251226/bear-engine/core/src/universe/forced_movement/code/forced_join.cpp000066400000000000000000000061331512343254000312010ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::universe::forced_join class. * \author Julien Jorge. */ #include "universe/forced_movement/forced_join.hpp" #include "universe/physical_item.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \steps length Maximum time to reach the target. */ bear::universe::forced_join::forced_join( time_type length ) : m_total_time(length), m_remaining_time(m_total_time) { } // forced_join::forced_join() /*----------------------------------------------------------------------------*/ /** * \brief Instanciate a copy of this movement. */ bear::universe::base_forced_movement* bear::universe::forced_join::clone() const { return new forced_join(*this); } // forced_join::clone() /*----------------------------------------------------------------------------*/ /** * \brief Set the total time to reach the target. * \steps length Maximum time to reach the target. */ void bear::universe::forced_join::set_total_time( time_type length ) { m_total_time = length; } // forced_join::set_total_time() /*----------------------------------------------------------------------------*/ /** * \brief Tell if the movement is finished. */ bool bear::universe::forced_join::is_finished() const { return !has_reference_point() || (m_remaining_time == 0); } // forced_join::is_finished() /*----------------------------------------------------------------------------*/ /** * \brief Initialize the movement. */ void bear::universe::forced_join::do_init() { m_remaining_time = m_total_time; m_initial_item_position = get_moving_item_position(); m_initial_target_position = get_reference_position(); next_position(0); } // forced_join::do_init() /*----------------------------------------------------------------------------*/ /** * \brief Do an iteration of the movement. * \param elapsed_time Elapsed time since the last call. * \return The remaining time if the movement is finished. */ bear::universe::time_type bear::universe::forced_join::do_next_position( time_type elapsed_time ) { time_type remaining_time(0); if ( has_reference_point() ) { const position_type target_center = get_reference_position(); const position_type fictive_item = m_initial_item_position + target_center - m_initial_target_position; position_type dp = m_initial_target_position - m_initial_item_position; if ( m_remaining_time > elapsed_time ) { dp = dp / m_total_time * ( m_total_time - m_remaining_time); m_remaining_time -= elapsed_time; } else { remaining_time = elapsed_time - m_remaining_time; m_remaining_time = 0; } set_moving_item_position( fictive_item + dp ); if ( (fictive_item + dp) == target_center ) m_remaining_time = 0; } return remaining_time; } // forced_join::do_next_position() plee-the-bear-20251226/bear-engine/core/src/universe/forced_movement/code/forced_movement.cpp000066400000000000000000000206641512343254000321010ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the forced_movement class. * \author Julien Jorge. */ #include "universe/forced_movement/forced_movement.hpp" #include "universe/forced_movement/base_forced_movement.hpp" #include /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ bear::universe::forced_movement::forced_movement() : m_movement(NULL) { } // forced_movement::forced_movement() /*----------------------------------------------------------------------------*/ /** * \brief Copy constructor. * \param that The instance to copy from. */ bear::universe::forced_movement::forced_movement( const forced_movement& that ) { if ( that.is_null() ) m_movement = NULL; else m_movement = that.m_movement->clone(); } // forced_movement::forced_movement() /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param m The effective movement. */ bear::universe::forced_movement::forced_movement ( const base_forced_movement& m ) : m_movement( m.clone() ) { } // forced_movement::forced_movement() /*----------------------------------------------------------------------------*/ /** * \brief Destructor. */ bear::universe::forced_movement::~forced_movement() { clear(); } // forced_movement::~forced_movement() /*----------------------------------------------------------------------------*/ /** * \brief Assignment. * \param that The instance to copy from. */ bear::universe::forced_movement& bear::universe::forced_movement::operator=( forced_movement that ) { std::swap(m_movement, that.m_movement); return *this; } // forced_movement::operator=() /*----------------------------------------------------------------------------*/ /** * \brief Tell if the forced movement contain an effective movement. */ bool bear::universe::forced_movement::is_null() const { return m_movement == NULL; } // forced_movement::is_null() /*----------------------------------------------------------------------------*/ /** * \brief Remove the effective movement. */ void bear::universe::forced_movement::clear() { delete m_movement; m_movement = NULL; } // forced_movement::clear() /*----------------------------------------------------------------------------*/ /** * \brief Initialise the item. */ void bear::universe::forced_movement::init() { CLAW_PRECOND( !is_null() ); m_movement->init(); } // forced_movement::init() /*----------------------------------------------------------------------------*/ /** * \brief Stop applying this movement to the item. */ void bear::universe::forced_movement::clear_item() { CLAW_PRECOND( !is_null() ); m_movement->clear_item(); } // forced_movement::clear_item() /*----------------------------------------------------------------------------*/ /** * \brief Set the item concerned by this movement. * \param item The item to which is applied this movement. */ void bear::universe::forced_movement::set_item( physical_item& item ) { CLAW_PRECOND( !is_null() ); m_movement->set_item(item); } // forced_movement::set_item() /*----------------------------------------------------------------------------*/ /** * \brief Tell if the reference point used by this movement is valid. */ bool bear::universe::forced_movement::has_reference_point() const { CLAW_PRECOND( !is_null() ); return m_movement->has_reference_point(); } // forced_movement::has_reference_point() /*----------------------------------------------------------------------------*/ /** * \brief Set the reference point used by this movement. * \param r The reference point. */ void bear::universe::forced_movement::set_reference_point ( const reference_point& r ) { CLAW_PRECOND( !is_null() ); m_movement->set_reference_point(r); } // forced_movement::set_reference_point() /*----------------------------------------------------------------------------*/ /** * \brief Get the point used as the reference for the movement. */ bear::universe::position_type bear::universe::forced_movement::get_reference_position() const { CLAW_PRECOND( !is_null() ); return m_movement->get_reference_position(); } // forced_movement::get_reference_position() /*----------------------------------------------------------------------------*/ /** * \brief Set the item used as a reference by this movement. * \param item The item used as a reference by this movement. */ void bear::universe::forced_movement::set_reference_point_on_center ( physical_item& item ) { CLAW_PRECOND( !is_null() ); m_movement->set_reference_point_on_center( item ); } // forced_movement::set_reference_point_on_center() /*----------------------------------------------------------------------------*/ /** * \brief Tell if this movement has a reference item. */ bool bear::universe::forced_movement::has_reference_item() const { CLAW_PRECOND( !is_null() ); return m_movement->has_reference_item(); } // forced_movement::has_reference_item() /*----------------------------------------------------------------------------*/ /** * \brief Get the item used as a reference in the movement. * \pre has_reference_item() */ bear::universe::physical_item& bear::universe::forced_movement::get_reference_item() const { CLAW_PRECOND( !is_null() ); return m_movement->get_reference_item(); } // forced_movement::get_reference_item() /*----------------------------------------------------------------------------*/ /** * \brief Tell if the movement removes himself from the moving item when * finished. */ void bear::universe::forced_movement::set_auto_remove(bool b) { CLAW_PRECOND( !is_null() ); m_movement->set_auto_remove(b); } // forced_movement::set_auto_remove() /*----------------------------------------------------------------------------*/ /** * \brief Tell if the angle of the moving item is updated according to its * angular speed. */ void bear::universe::forced_movement::set_auto_angle(bool b) { CLAW_PRECOND( !is_null() ); m_movement->set_auto_angle(b); } // forced_movement::set_auto_angle() /*----------------------------------------------------------------------------*/ /** * \brief Get the ratio of the size to use when computing moving item's * position. */ bear::universe::position_type bear::universe::forced_movement::get_moving_item_ratio() const { CLAW_PRECOND( !is_null() ); return m_movement->get_moving_item_ratio(); } // forced_movement::get_moving_item_ratio() /*----------------------------------------------------------------------------*/ /** * \brief Set ratio of size to compute moving item's position. * \param ratio The ratio to use. */ void bear::universe::forced_movement::set_moving_item_ratio (const position_type & ratio) { CLAW_PRECOND( !is_null() ); m_movement->set_moving_item_ratio(ratio); } // forced_movement::set_moving_item_ratio() /*----------------------------------------------------------------------------*/ /** * \brief Get the gap to use when computing moving item's position. */ bear::universe::position_type bear::universe::forced_movement::get_moving_item_gap() const { CLAW_PRECOND( !is_null() ); return m_movement->get_moving_item_gap(); } // forced_movement::get_moving_item_gap() /*----------------------------------------------------------------------------*/ /** * \brief Set gap to compute moving item's position. * \param gap The ratio to use. */ void bear::universe::forced_movement::set_moving_item_gap (const position_type & gap) { CLAW_PRECOND( !is_null() ); m_movement->set_moving_item_gap(gap); } // forced_movement::set_moving_item_gap() /*----------------------------------------------------------------------------*/ /** * \brief Move the item to the next position. * \param elapsed_time Elapsed time since the last call. * \return The remaining time if the movement is finished. */ bear::universe::time_type bear::universe::forced_movement::next_position( time_type elapsed_time ) { CLAW_PRECOND( !is_null() ); return m_movement->next_position(elapsed_time); } // forced_movement::next_position() /*----------------------------------------------------------------------------*/ /** * \brief Tell if the movement is finished. */ bool bear::universe::forced_movement::is_finished() const { CLAW_PRECOND( !is_null() ); return m_movement->is_finished(); } // forced_movement::is_finished() forced_movement_function.cpp000066400000000000000000000053661512343254000337310ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/core/src/universe/forced_movement/code/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::universe::forced_movement_function class. * \author Julien Jorge */ #include "universe/forced_movement/forced_movement_function.hpp" #include "universe/physical_item.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param f The function to call to get the position of the item. * \param length The duration of the movement. */ bear::universe::forced_movement_function::forced_movement_function ( const function_type& f, time_type length ) : m_total_time( length ), m_remaining_time(m_total_time), m_function(f) { } // forced_movement_function::forced_movement_function() /*----------------------------------------------------------------------------*/ /** * \brief Instanciate a copy of this movement. */ bear::universe::base_forced_movement* bear::universe::forced_movement_function::clone() const { return new forced_movement_function(*this); } // forced_movement_function::clone() /*----------------------------------------------------------------------------*/ /** * \brief Set the duration of the movement. * \param length The duration of the movement. */ void bear::universe::forced_movement_function::set_total_time( time_type length ) { m_total_time = length; } // forced_movement_function::set_total_time() /*----------------------------------------------------------------------------*/ /** * \brief Tell if the movement is finished. */ bool bear::universe::forced_movement_function::is_finished() const { return m_remaining_time == 0; } // forced_movement_function::is_finished() /*----------------------------------------------------------------------------*/ /** * \brief Initialize the movement. */ void bear::universe::forced_movement_function::do_init() { m_remaining_time = m_total_time; } // forced_movement_function::do_init() /*----------------------------------------------------------------------------*/ /** * \brief Do an iteration of the movement. * \param elapsed_time Elapsed time since the last call. * \return The remaining time if the movement is finished. */ bear::universe::time_type bear::universe::forced_movement_function::do_next_position ( time_type elapsed_time ) { time_type result; if ( m_remaining_time < elapsed_time ) { result = elapsed_time - m_remaining_time; m_remaining_time = 0; } else { m_remaining_time -= elapsed_time; result = 0; } get_item().set_center_of_mass( m_function() ); return result; } // forced_movement_function::do_next_position() plee-the-bear-20251226/bear-engine/core/src/universe/forced_movement/code/forced_rotation.cpp000066400000000000000000000212551512343254000321030ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::universe::forced_rotation class. * \author Julien Jorge */ #include "universe/forced_movement/forced_rotation.hpp" #include "universe/physical_item.hpp" #include #include /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ bear::universe::forced_rotation::forced_rotation() : m_start_angle(-3.14159), m_end_angle(3.14159), m_angle(0), m_radius( std::numeric_limits::infinity() ), m_total_time( std::numeric_limits::infinity() ), m_elapsed_time(0), m_loop_back(false), m_loops(0), m_loop_count(0), m_angle_application(apply_keep) { } // forced_rotation::forced_rotation() /*----------------------------------------------------------------------------*/ /** * \brief Instanciate a copy of this movement. */ bear::universe::base_forced_movement* bear::universe::forced_rotation::clone() const { return new forced_rotation(*this); } // forced_rotation::clone() /*----------------------------------------------------------------------------*/ /** * \brief Set the radius of the rotation. * \param radius The radius. * * Give an infinite radius if you want it to be computed automatically at * initialization time. */ void bear::universe::forced_rotation::set_radius( double radius ) { m_radius = radius; } // forced_rotation::set_radius() /*----------------------------------------------------------------------------*/ /** * \brief Set the initial angle of the rotation. * \param start_angle The initial angle. */ void bear::universe::forced_rotation::set_start_angle( double start_angle ) { m_start_angle = start_angle; } // forced_rotation::set_start_angle() /*----------------------------------------------------------------------------*/ /** * \brief Set the final angle of the rotation. * \param end_angle The final angle. */ void bear::universe::forced_rotation::set_end_angle( double end_angle ) { m_end_angle = end_angle; } // forced_rotation::set_end_angle() /*----------------------------------------------------------------------------*/ /** * \brief Tell how the angle of the rotation is applied to the rotating item. * \param a The application mode. */ void bear::universe::forced_rotation::set_angle_application( angle_application a ) { m_angle_application = a; } // forced_rotation::set_angle_application() /*----------------------------------------------------------------------------*/ /** * \brief Tell how long it takes to go from the initial angle to the last angle. * \param length The duration of the movement from the initial angle to the last * angle. */ void bear::universe::forced_rotation::set_total_time( time_type length ) { m_total_time = length; } // forced_rotation::set_total_time() /*----------------------------------------------------------------------------*/ /** * \brief Set the duration of the acceleration and deceleration. * \param length The duration of the acceleration and deceleration. */ void bear::universe::forced_rotation::set_acceleration_time( time_type length ) { m_speed_generator.set_acceleration_time(length); } // forced_rotation::set_acceleration_time() /*----------------------------------------------------------------------------*/ /** * \brief Tell how many times the movement from the initial angle to the last * angle must be done. * \param loops The number of loops. */ void bear::universe::forced_rotation::set_loops( unsigned int loops ) { m_loops = loops; } // forced_rotation::set_loops() /*----------------------------------------------------------------------------*/ /** * \brief Tell if we go backward when the final angle is reached. * \param loop_back Go backward. */ void bear::universe::forced_rotation::set_loop_back( bool loop_back ) { m_loop_back = loop_back; } // forced_rotation::set_loop_back() /*----------------------------------------------------------------------------*/ /** * \brief Tell if the movement is finished. */ bool bear::universe::forced_rotation::is_finished() const { return (m_loop_count == m_loops) && m_loops; } // forced_rotation::is_finished() /*----------------------------------------------------------------------------*/ /** * \brief Initialize the movement. */ void bear::universe::forced_rotation::do_init() { if ( m_radius == std::numeric_limits::infinity() ) if ( has_reference_point() ) m_radius = get_reference_position().distance( get_moving_item_position() ); m_speed_generator.set_distance(m_end_angle - m_start_angle); m_speed_generator.set_total_time(m_total_time); if ( m_speed_generator.get_acceleration_time() > m_total_time ) m_speed_generator.set_acceleration_time( m_total_time / 2 ); m_angle = m_start_angle; m_loop_count = 0; m_is_playing_forward = true; set_item_position(); } // forced_rotation::do_init() /*----------------------------------------------------------------------------*/ /** * \brief Do an iteration of the movement. * \param elapsed_time Elapsed time since the last call. * \return The remaining time if the movement is finished. */ bear::universe::time_type bear::universe::forced_rotation::do_next_position( time_type elapsed_time ) { if ( is_finished() ) return elapsed_time; const time_type remaining_time = update_angle(elapsed_time); set_item_position(); return remaining_time; } // forced_rotation::do_next_position() /*----------------------------------------------------------------------------*/ /** * \brief Calculate the next angle. * \param elapsed_time Elapsed time since the last call. * \return The remaining time if the movement is finished. */ bear::universe::time_type bear::universe::forced_rotation::update_angle( const time_type elapsed_time ) { time_type remaining_time = 0; time_type t = elapsed_time; bool adjust(false); if ( m_elapsed_time + t > m_total_time ) { remaining_time = m_elapsed_time + t - m_total_time; t = m_total_time - m_elapsed_time; adjust = true; } if ( m_total_time == 0 ) m_angle = m_end_angle; else { m_elapsed_time += t; const double angular_velocity ( m_speed_generator.get_speed(m_elapsed_time) ); m_angle += angular_velocity * t; } // movement is finished if ( adjust ) { if ( m_is_playing_forward ) end_reached(); else start_reached(); if ( (remaining_time > 0) && !is_finished() && (remaining_time != elapsed_time) ) remaining_time = update_angle(remaining_time); } return remaining_time; } // forced_rotation::update_angle() /*----------------------------------------------------------------------------*/ /** * \brief The rotation reached the final angle. Loop back or stop. */ void bear::universe::forced_rotation::end_reached() { m_elapsed_time = 0; if (m_loop_back) { m_speed_generator.set_distance( -m_speed_generator.get_distance() ); m_angle = m_end_angle; m_is_playing_forward = false; } else { ++m_loop_count; if ( m_loop_count == m_loops ) m_angle = m_end_angle; else m_angle = m_start_angle; } } // forced_rotation::end_reached() /*----------------------------------------------------------------------------*/ /** * \brief The rotation reached the initial angle. Loop. */ void bear::universe::forced_rotation::start_reached() { ++m_loop_count; m_elapsed_time = 0; m_angle = m_start_angle; m_speed_generator.set_distance( -m_speed_generator.get_distance() ); m_is_playing_forward = true; } // forced_rotation::start_reached() /*----------------------------------------------------------------------------*/ /** * \brief Set the position of the moving item. */ void bear::universe::forced_rotation::set_item_position() { if ( has_reference_point() ) { position_type pos; pos = get_reference_position(); pos.x += (m_radius * cos( m_angle )); pos.y += (m_radius * sin( m_angle )); set_moving_item_position(pos); } switch (m_angle_application) { case apply_add: set_moving_item_system_angle( get_moving_item_system_angle() + m_angle ); break; case apply_force: set_moving_item_system_angle( m_angle ); break; case apply_force_delta: set_moving_item_system_angle( m_angle - m_start_angle ); break; case apply_force_remaining: set_moving_item_system_angle( m_angle - m_end_angle ); break; case apply_keep: { /* nothing to do */ } } } // forced_rotation::set_item_position() plee-the-bear-20251226/bear-engine/core/src/universe/forced_movement/code/forced_sequence.cpp000066400000000000000000000113201512343254000320440ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::universe::forced_sequence class. * \author Julien Jorge */ #include "universe/forced_movement/forced_sequence.hpp" #include /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ bear::universe::forced_sequence::forced_sequence() : m_index(0), m_loops(0), m_play_count(0), m_finished(false), m_has_changed(false) { } // forced_sequence::forced_sequence() /*----------------------------------------------------------------------------*/ /** * \brief Instanciate a copy of this movement. */ bear::universe::base_forced_movement* bear::universe::forced_sequence::clone() const { return new forced_sequence(*this); } // forced_sequence::clone() /*----------------------------------------------------------------------------*/ /** * \brief Add a movement at the end of the sequence. * \param m The movement to add. */ void bear::universe::forced_sequence::push_back( const forced_movement& m ) { m_sub_sequence.push_back( m ); m_sub_sequence.back().set_auto_remove(false); } // forced_sequence::push_back() /*----------------------------------------------------------------------------*/ /** * \brief Tell how many times the sequence must be done. * \param loops The number of loops. */ void bear::universe::forced_sequence::set_loops( unsigned int loops ) { m_loops = loops; } // forced_sequence::set_loops() /*----------------------------------------------------------------------------*/ /** * \brief Tells if the movement is finished. */ bool bear::universe::forced_sequence::is_finished() const { return ( (m_play_count == m_loops) && m_loops ) || m_finished; } // forced_sequence::is_finished() /*----------------------------------------------------------------------------*/ /** * \brief Initialize the movement. */ void bear::universe::forced_sequence::do_init() { m_play_count = 0; m_index = 0; m_has_changed = false; m_finished = false; for ( unsigned int i = 0; i != m_sub_sequence.size(); ++i ) { m_sub_sequence[i].set_moving_item_gap( get_moving_item_gap() ); m_sub_sequence[i].set_moving_item_ratio( get_moving_item_ratio() ); } if ( !m_sub_sequence.empty() ) init_current_subsequence(); } // forced_sequence::do_init() /*----------------------------------------------------------------------------*/ /** * \brief Do an iteration of the movement. * \param elapsed_time Elapsed time since the last call. * \return The remaining time if the movement is finished. */ bear::universe::time_type bear::universe::forced_sequence::do_next_position( time_type elapsed_time ) { if ( is_finished() ) return elapsed_time; time_type remaining_time(elapsed_time); if ( !m_sub_sequence.empty() ) { remaining_time = m_sub_sequence[m_index].next_position(remaining_time); if ( m_sub_sequence[m_index].is_finished() ) { next_sequence(); m_has_changed = m_has_changed || (remaining_time != elapsed_time); if ( remaining_time > 0 ) if ( !is_finished() ) remaining_time = next_position(remaining_time); } } return remaining_time; } // forced_sequence::do_next_position() /*----------------------------------------------------------------------------*/ /** * \brief Go to the next sub sequence. */ void bear::universe::forced_sequence::next_sequence() { m_sub_sequence[m_index].clear_item(); ++m_index; if ( m_index == m_sub_sequence.size() ) { ++m_play_count; m_index = 0; if ( !m_has_changed && (m_loops == 0) ) { claw::logger << claw::log_warning << "forced_sequence loop has no effect. Stopping." << std::endl; m_finished = true; } else m_has_changed = false; } if ( !is_finished() ) init_current_subsequence(); } // forced_sequence::next_sequence() /*----------------------------------------------------------------------------*/ /** * \brief Initializes the current subsequence. The item of this movement is * passed to it and the reference item of the subsequence, if any, is * passed to this. */ void bear::universe::forced_sequence::init_current_subsequence() { m_sub_sequence[m_index].set_item( get_item() ); m_sub_sequence[m_index].init(); if ( m_sub_sequence[m_index].has_reference_item() ) set_reference_point_on_center ( m_sub_sequence[m_index].get_reference_item() ); } // forced_sequence::init_current_subsequence() plee-the-bear-20251226/bear-engine/core/src/universe/forced_movement/code/forced_stay_around.cpp000066400000000000000000000164651512343254000326030ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::universe::forced_stay_around class. * \author Julien Jorge */ #include "universe/forced_movement/forced_stay_around.hpp" #include "universe/physical_item.hpp" #include #include /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param length The duration of the movement. */ bear::universe::forced_stay_around::forced_stay_around( time_type length ) : m_max_angle( std::numeric_limits::infinity() ), m_speed( std::numeric_limits::infinity() ), m_max_distance( std::numeric_limits::infinity() ), m_total_time( length ), m_remaining_time(m_total_time), m_apply_angle(false) { } // forced_stay_around::forced_stay_around() /*----------------------------------------------------------------------------*/ /** * \brief Instanciate a copy of this movement. */ bear::universe::base_forced_movement* bear::universe::forced_stay_around::clone() const { return new forced_stay_around(*this); } // forced_stay_around::clone() /*----------------------------------------------------------------------------*/ /** * \brief Set the maximum angle when the direction changes. * \param a The angle. */ void bear::universe::forced_stay_around::set_max_angle( double a ) { if (a < 0) m_max_angle = -a; else m_max_angle = a; } // forced_stay_around::set_max_angle() /*----------------------------------------------------------------------------*/ /** * \brief Set the constant speed of the moving item. * \param s The speed. */ void bear::universe::forced_stay_around::set_speed( double s ) { if( s < 0 ) m_speed = -s; else m_speed = s; } // forced_stay_around::set_max_speed() /*----------------------------------------------------------------------------*/ /** * \brief Set the maximum distance to the center. * \param d The distance. */ void bear::universe::forced_stay_around::set_max_distance( coordinate_type d ) { if( d < 0 ) m_max_distance = -d; else m_max_distance = d; } // forced_stay_around::set_max_distance() /*----------------------------------------------------------------------------*/ /** * \brief Tell if we apply the angle of the movement to the item. * \param b Apply or not. */ void bear::universe::forced_stay_around::set_apply_angle( bool b ) { m_apply_angle = b; } // forced_stay_around::set_apply_angle() /*----------------------------------------------------------------------------*/ /** * \brief Set the duration of the movement. * \param length The duration of the movement. */ void bear::universe::forced_stay_around::set_total_time( time_type length ) { m_total_time = length; } // forced_stay_around::set_total_time() /*----------------------------------------------------------------------------*/ /** * \brief Tell if the movement is finished. */ bool bear::universe::forced_stay_around::is_finished() const { return !has_reference_point() || (m_remaining_time == 0); } // forced_stay_around::is_finished() /*----------------------------------------------------------------------------*/ /** * \brief Initialize the movement. */ void bear::universe::forced_stay_around::do_init() { m_remaining_time = m_total_time; if ( has_reference_point() ) { m_previous_reference_position = get_reference_position(); m_position_delta = get_moving_item_position() - get_reference_position(); } else { m_position_delta = position_type(0, 0); m_previous_reference_position = position_type(0, 0); } } // forced_stay_around::do_init() /*----------------------------------------------------------------------------*/ /** * \brief Do an iteration of the movement. * \param elapsed_time Elapsed time since the last call. * \return The remaining time if the movement is finished. */ bear::universe::time_type bear::universe::forced_stay_around::do_next_position( time_type elapsed_time ) { time_type remaining_time(0); if ( has_reference_point() ) { remaining_time = compute_remaining_time(elapsed_time); // The direction of the moving item relatively to the reference is the // movement done during the elapsed time minus the movement of the // reference. const vector_type current_dir ( get_item().get_speed() - ( get_reference_position() - m_previous_reference_position ) / elapsed_time ); vector_type dir; double a = compute_direction(dir, current_dir); m_position_delta += dir * m_speed * elapsed_time; set_moving_item_position( get_reference_position() + m_position_delta ); if ( m_apply_angle ) set_moving_item_system_angle( a ); m_previous_reference_position = get_reference_position(); } return remaining_time; } // forced_stay_around::do_next_position() /*----------------------------------------------------------------------------*/ /** * \brief Compute the remaining time after this step of the movement. * \param elapsed_time Elapsed time since the last call to do_next_position(). */ bear::universe::time_type bear::universe::forced_stay_around::compute_remaining_time ( time_type& elapsed_time ) { time_type result; if ( elapsed_time > m_remaining_time ) { result = elapsed_time - m_remaining_time; elapsed_time = m_remaining_time; m_remaining_time = 0; } else { result = 0; m_remaining_time -= elapsed_time; } return result; } // forced_stay_around::compute_remaining_time() /*----------------------------------------------------------------------------*/ /** * \brief Compute the direction to apply to the item. * \param dir (out) The direction. * \param current_dir The relative direction of the moving item according to the * reference. * \return The angle of the direction. */ double bear::universe::forced_stay_around::compute_direction ( vector_type& dir, vector_type current_dir ) const { // try to come back to the reference dir = vector_type( get_moving_item_position(), get_reference_position() ); // random angle with a preference toward the reference if we are far from it const coordinate_type dist_from_ref ( std::min(1.0, dir.length() / m_max_distance) ); const double max_a(2 * 3.14159 * (1 - dist_from_ref)); const double a = max_a * (double)rand() / RAND_MAX - max_a / 2; current_dir.normalize(); dir.normalize(); double v = dir.dot_product(current_dir); if ( v > 1 ) v = 1; if ( v < -1 ) v = -1; double delta_angle = std::acos(v) + a; double sign = current_dir.x * dir.y - current_dir.y * dir.x; double current_angle = std::atan2(current_dir.y, current_dir.x); double final_angle; if ( sign > 0 ) // the item goes on its left { if ( delta_angle > m_max_angle ) final_angle = current_angle + m_max_angle; else final_angle = current_angle + delta_angle; } else { if ( delta_angle > m_max_angle ) final_angle = current_angle - m_max_angle; else final_angle = current_angle - delta_angle; } dir.set( std::cos(final_angle), std::sin(final_angle) ); return final_angle; } // forced_stay_around::compute_direction() plee-the-bear-20251226/bear-engine/core/src/universe/forced_movement/code/forced_tracking.cpp000066400000000000000000000101621512343254000320410ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::universe::forced_tracking class. * \author Julien Jorge */ #include "universe/forced_movement/forced_tracking.hpp" #include "universe/physical_item.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param length The duration of the movement. */ bear::universe::forced_tracking::forced_tracking( time_type length ) : m_distance( std::numeric_limits::infinity(), std::numeric_limits::infinity() ), m_total_time(length), m_remaining_time(m_total_time) { } // forced_tracking::forced_tracking() /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param distance The distance to maintain. * \param length The duration of the movement. */ bear::universe::forced_tracking::forced_tracking ( const position_type& distance, time_type length ) : m_distance(distance), m_total_time(length), m_remaining_time(m_total_time) { } // forced_tracking::forced_tracking() /*----------------------------------------------------------------------------*/ /** * \brief Instanciate a copy of this movement. */ bear::universe::base_forced_movement* bear::universe::forced_tracking::clone() const { return new forced_tracking(*this); } // forced_tracking::clone() /*----------------------------------------------------------------------------*/ /** * \brief Set the distance to maintain. * \param distance The distance to maintain. */ void bear::universe::forced_tracking::set_distance( const position_type& distance ) { m_distance = distance; } // forced_tracking::set_distance() /*----------------------------------------------------------------------------*/ /** * \brief Set the duration of the movement. * \param length The duration of the movement. */ void bear::universe::forced_tracking::set_total_time( time_type length ) { m_total_time = length; } // forced_tracking::set_total_time() /*----------------------------------------------------------------------------*/ /** * \brief Get the distance to maintain. */ const bear::universe::position_type& bear::universe::forced_tracking::get_distance() const { return m_distance; } // forced_tracking::get_distance() /*----------------------------------------------------------------------------*/ /** * \brief Tell if the movement is finished. */ bool bear::universe::forced_tracking::is_finished() const { return !has_reference_point() || (m_remaining_time == 0); } // forced_tracking::is_finished() /*----------------------------------------------------------------------------*/ /** * \brief Initialize the movement. */ void bear::universe::forced_tracking::do_init() { m_remaining_time = m_total_time; if ( has_reference_point() ) { if ( m_distance.x == std::numeric_limits::infinity() ) m_distance.x = get_moving_item_position().x - get_reference_position().x; if ( m_distance.y == std::numeric_limits::infinity() ) m_distance.y = get_moving_item_position().y - get_reference_position().y; } next_position(0); } // forced_tracking::do_init() /*----------------------------------------------------------------------------*/ /** * \brief Do an iteration of the movement. * \param elapsed_time Elapsed time since the last call. * \return The remaining time if the movement is finished. */ bear::universe::time_type bear::universe::forced_tracking::do_next_position( time_type elapsed_time ) { time_type result(0); if ( has_reference_point() ) { set_moving_item_position( get_reference_position() + m_distance ); if ( m_remaining_time < elapsed_time ) { result = elapsed_time - m_remaining_time; m_remaining_time = 0; } else m_remaining_time -= elapsed_time; } return result; } // forced_tracking::do_next_position() plee-the-bear-20251226/bear-engine/core/src/universe/forced_movement/code/forced_translation.cpp000066400000000000000000000106341512343254000326010ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::universe::forced_translation class. * \author Sébastien Angibaud */ #include "universe/forced_movement/forced_translation.hpp" #include "universe/physical_item.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param length The duration of the movement. */ bear::universe::forced_translation::forced_translation( time_type length ) : m_speed(0, 0), m_total_time(length), m_remaining_time(m_total_time), m_angle(0), m_force_angle(false) { } // forced_translation::forced_translation() /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param speed The speed of the item. * \param length The duration of the movement. */ bear::universe::forced_translation::forced_translation ( const speed_type& speed, time_type length ) : m_speed(speed), m_total_time(length), m_remaining_time(m_total_time), m_angle(0), m_force_angle(false) { } // forced_translation::forced_translation() /*----------------------------------------------------------------------------*/ /** * \brief Instanciate a copy of this movement. */ bear::universe::base_forced_movement* bear::universe::forced_translation::clone() const { return new forced_translation(*this); } // forced_translation::clone() /*----------------------------------------------------------------------------*/ /** * \brief Set the angle applied to the item. * \param angle The angle. */ void bear::universe::forced_translation::set_angle( double angle ) { m_angle = angle; } // forced_translation::set_angle() /*----------------------------------------------------------------------------*/ /** * \brief Tell if we force the angle of the item (otherwise the angles are * added). * \param bool f Force the angle. */ void bear::universe::forced_translation::set_force_angle( bool f ) { m_force_angle = f; } // forced_translation::set_force_angle() /*----------------------------------------------------------------------------*/ /** * \brief Set the speed of the item. * \param speed The speed. */ void bear::universe::forced_translation::set_speed( const speed_type& speed ) { m_speed = speed; } // forced_translation::set_speed() /*----------------------------------------------------------------------------*/ /** * \brief Set the duration of the movement. * \param length The duration of the movement. */ void bear::universe::forced_translation::set_total_time( time_type length ) { m_total_time = length; } // forced_translation::set_total_time() /*----------------------------------------------------------------------------*/ /** * \brief Get the speed of the movement. */ const bear::universe::speed_type& bear::universe::forced_translation::get_speed() const { return m_speed; } // forced_translation::get_speed() /*----------------------------------------------------------------------------*/ /** * \brief Tell if the movement is finished. */ bool bear::universe::forced_translation::is_finished() const { return m_remaining_time == 0; } // forced_translation::is_finished() /*----------------------------------------------------------------------------*/ /** * \brief Initialize the movement. */ void bear::universe::forced_translation::do_init() { m_remaining_time = m_total_time; } // forced_translation::do_init() /*----------------------------------------------------------------------------*/ /** * \brief Do an iteration of the movement. * \param elapsed_time Elapsed time since the last call. * \return The remaining time if the movement is finished. */ bear::universe::time_type bear::universe::forced_translation::do_next_position( time_type elapsed_time ) { time_type remaining_time(0); if ( elapsed_time > m_remaining_time ) { remaining_time = elapsed_time - m_remaining_time; elapsed_time = m_remaining_time; } set_moving_item_position ( get_moving_item_position() + m_speed * elapsed_time ); if ( m_force_angle ) set_moving_item_system_angle( m_angle ); else set_moving_item_system_angle( get_moving_item_system_angle() + m_angle ); m_remaining_time -= elapsed_time; return remaining_time; } // forced_translation::do_next_position() natural_forced_movement.cpp000066400000000000000000000076621512343254000335530ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/core/src/universe/forced_movement/code/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::universe::natural_forced_movement class. * \author Sébastien Angibaud */ #include "universe/forced_movement/natural_forced_movement.hpp" #include "universe/physical_item.hpp" #include "universe/world.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param duration The duration of the movement. */ bear::universe::natural_forced_movement::natural_forced_movement ( time_type duration ) : m_duration(duration), m_remaining_time(m_duration) { } // natural_forced_movement::natural_forced_movement() /*----------------------------------------------------------------------------*/ /** * \brief Instantiates a copy of this movement. */ bear::universe::base_forced_movement* bear::universe::natural_forced_movement::clone() const { return new natural_forced_movement(*this); } // natural_forced_movement::clone() /*----------------------------------------------------------------------------*/ /** * \brief Sets the total duration of the movement. * \param d The total duration of the movement. */ void bear::universe::natural_forced_movement::set_total_time( time_type d ) { m_duration = d; } // natural_forced_movement::set_total_time() /*----------------------------------------------------------------------------*/ /** * \brief Tells if the movement is finished. */ bool bear::universe::natural_forced_movement::is_finished() const { return m_remaining_time == 0; } // natural_forced_movement::is_finished() /*----------------------------------------------------------------------------*/ /** * \brief Initializes the movement. */ void bear::universe::natural_forced_movement::do_init() { m_remaining_time = m_duration; } // natural_forced_movement::do_init() /*----------------------------------------------------------------------------*/ /** * \brief Updates the position of the moving item. * \param elapsed_time Elapsed time since the last call. * \return The remaining time, if the movement is finished. */ bear::universe::time_type bear::universe::natural_forced_movement::do_next_position ( time_type elapsed_time ) { time_type remaining_time(0); if ( elapsed_time > m_remaining_time ) { remaining_time = elapsed_time - m_remaining_time; elapsed_time = m_remaining_time; } update_position( elapsed_time ); m_remaining_time -= elapsed_time; return remaining_time; } // natural_forced_movement::do_next_position() /*----------------------------------------------------------------------------*/ /** * \brief Updates the position, the speed and the acceleration of the item. * \param elapsed_time Elasped time since the last progress. */ void bear::universe::natural_forced_movement::update_position ( time_type elapsed_time ) { physical_item& item( get_item() ); const world *const w( item.has_owner() ? &item.get_owner() : NULL ); const force_type force ( (w == NULL) ? item.get_force() : w->get_total_force_on_item(item) ); force_type a( force / item.get_mass() ); double f = item.get_friction() * item.get_contact_friction(); if ( (w != NULL) && ( item.get_mass() != std::numeric_limits::infinity() ) ) { a += w->get_gravity(); f *= w->get_average_friction( item.get_bounding_box() ); } const speed_type speed( f * ( a * elapsed_time + item.get_speed() ) ); set_moving_item_position( get_moving_item_position() + speed * elapsed_time ); const double angular_speed( item.get_angular_speed() * elapsed_time * f ); item.set_system_angle( item.get_system_angle() + angular_speed ); item.set_acceleration( a ); item.set_internal_force( force_type(0, 0) ); item.set_external_force( force_type(0, 0) ); } // natural_forced_movement::update_position() plee-the-bear-20251226/bear-engine/core/src/universe/forced_movement/code/ratio_reference_point.cpp000066400000000000000000000046541512343254000332730ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the ratio_reference_point class. * \author Sebastien Angibaud */ #include "universe/forced_movement/ratio_reference_point.hpp" #include "universe/physical_item.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param item The item of which the center of mass is returned. */ bear::universe::ratio_reference_point::ratio_reference_point ( physical_item& item, const universe::position_type& ratio, const universe::position_type& gap ) : m_item(item), m_ratio(ratio), m_gap(gap) { } // ratio_reference_point::ratio_reference_point() /*----------------------------------------------------------------------------*/ /** * \brief Duplicate this instance. */ bear::universe::base_reference_point* bear::universe::ratio_reference_point::clone() const { return new ratio_reference_point(*this); } // ratio_reference_point::clone() /*----------------------------------------------------------------------------*/ /** * \brief Tell if this reference is usable. */ bool bear::universe::ratio_reference_point::is_valid() const { return has_item(); } // ratio_reference_point::is_valid() /*----------------------------------------------------------------------------*/ /** * \brief Get the center of mass of the item. */ bear::universe::position_type bear::universe::ratio_reference_point::get_point() const { CLAW_PRECOND( has_item() ); return bear::universe::position_type ( m_item->get_left() + m_item->get_width() * m_ratio.x + m_gap.x, m_item->get_bottom() + m_item->get_height() * m_ratio.y + m_gap.y ); } // ratio_reference_point::get_point() /*----------------------------------------------------------------------------*/ /** * \brief Tell if the item is still valid. */ bool bear::universe::ratio_reference_point::has_item() const { return m_item != NULL; } // ratio_reference_point::has_item() /*----------------------------------------------------------------------------*/ /** * \brief Get the item of which the center of mass is returned. */ bear::universe::physical_item& bear::universe::ratio_reference_point::get_item() const { CLAW_PRECOND( has_item() ); return *m_item; } // ratio_reference_point::get_item() plee-the-bear-20251226/bear-engine/core/src/universe/forced_movement/code/reference_point.cpp000066400000000000000000000063121512343254000320660ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the reference_point class. * \author Julien Jorge. */ #include "universe/forced_movement/reference_point.hpp" #include "universe/forced_movement/base_reference_point.hpp" #include /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ bear::universe::reference_point::reference_point() : m_reference(NULL) { } // reference_point::reference_point() /*----------------------------------------------------------------------------*/ /** * \brief Copy constructor. * \param that The instance to copy from. */ bear::universe::reference_point::reference_point( const reference_point& that ) { if ( that.m_reference == NULL ) m_reference = NULL; else m_reference = that.m_reference->clone(); } // reference_point::reference_point() /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param p The effective reference point. */ bear::universe::reference_point::reference_point ( const base_reference_point& p ) : m_reference( p.clone() ) { } // reference_point::reference_point() /*----------------------------------------------------------------------------*/ /** * \brief Destructor. */ bear::universe::reference_point::~reference_point() { delete m_reference; } // reference_point::~reference_point() /*----------------------------------------------------------------------------*/ /** * \brief Assignment. * \param that The instance to copy from. */ bear::universe::reference_point& bear::universe::reference_point::operator=( const reference_point& that ) { reference_point tmp(that); std::swap(m_reference, tmp.m_reference); return *this; } // reference_point::operator=() /*----------------------------------------------------------------------------*/ /** * \brief Tell if this reference is usable. */ bool bear::universe::reference_point::is_valid() const { return (m_reference != NULL) && m_reference->is_valid(); } // reference_point::is_valid() /*----------------------------------------------------------------------------*/ /** * \brief Get the point the forced movement has to use. */ bear::universe::position_type bear::universe::reference_point::get_point() const { CLAW_PRECOND( is_valid() ); return m_reference->get_point(); } // reference_point::get_point() /*----------------------------------------------------------------------------*/ /** * \brief Tell if the reference use an item to compute the point. */ bool bear::universe::reference_point::has_item() const { if ( m_reference == NULL ) return false; else return m_reference->has_item(); } // reference_point::has_item() /*----------------------------------------------------------------------------*/ /** * \brief Get the item this instance uses to compute the point. */ bear::universe::physical_item& bear::universe::reference_point::get_item() const { CLAW_PRECOND( has_item() ); return m_reference->get_item(); } // reference_point::get_item() plee-the-bear-20251226/bear-engine/core/src/universe/forced_movement/code/sinus_speed_generator.cpp000066400000000000000000000067071512343254000333160ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::universe::sinus_speed_generator class. * \author Julien Jorge. */ #include "universe/forced_movement/sinus_speed_generator.hpp" #include /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ bear::universe::sinus_speed_generator::sinus_speed_generator() : m_total_time(std::numeric_limits::infinity()), m_acceleration_time(m_total_time), m_distance(std::numeric_limits::infinity()) { } // sinus_speed_generator::sinus_speed_generator() /*----------------------------------------------------------------------------*/ /** * \brief Set the total time of the movement. * \param length Total time of the movement. */ void bear::universe::sinus_speed_generator::set_total_time( time_type length ) { m_total_time = length; } // sinus_speed_generator::set_total_time() /*----------------------------------------------------------------------------*/ /** * \brief Get the total time of the movement. */ bear::universe::time_type bear::universe::sinus_speed_generator::get_total_time() const { return m_total_time; } // sinus_speed_generator::get_total_time() /*----------------------------------------------------------------------------*/ /** * \brief Set the duration of the acceleration and deceleration. * \param length The duration of the acceleration and deceleration. */ void bear::universe::sinus_speed_generator::set_acceleration_time( time_type length ) { m_acceleration_time = length; } // sinus_speed_generator::set_acceleration_time() /*----------------------------------------------------------------------------*/ /** * \brief Get the duration of the acceleration and deceleration. */ bear::universe::time_type bear::universe::sinus_speed_generator::get_acceleration_time() const { return m_acceleration_time; } // sinus_speed_generator::get_acceleration_time() /*----------------------------------------------------------------------------*/ /** * \brief Set the distance of the journey. * \param d The distance */ void bear::universe::sinus_speed_generator::set_distance( coordinate_type d ) { m_distance = d; } // sinus_speed_generator::set_distance() /*----------------------------------------------------------------------------*/ /** * \brief Get the distance of the journey. */ bear::universe::coordinate_type bear::universe::sinus_speed_generator::get_distance() const { return m_distance; } // sinus_speed_generator::get_distance() /*----------------------------------------------------------------------------*/ /** * \brief Get the speed at a given time. * \param t The date at which we want the speed. */ bear::universe::coordinate_type bear::universe::sinus_speed_generator::get_speed( time_type t ) const { const coordinate_type vmax = m_distance / ( m_total_time - m_acceleration_time ); coordinate_type result; if ( t < m_acceleration_time ) result = (-std::cos(t * 3.14159 / m_acceleration_time) + 1) * vmax / 2; else if ( t > m_total_time - m_acceleration_time ) { t -= m_total_time - m_acceleration_time; result = (std::cos(t * 3.14159 / m_acceleration_time) + 1) * vmax / 2; } else result = vmax; return result; } // sinus_speed_generator::get_speed() plee-the-bear-20251226/bear-engine/core/src/universe/forced_movement/forced_aiming.hpp000066400000000000000000000042641512343254000306040ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A forced movement that will make the current item rotating around * another item. * \author Julien Jorge */ #ifndef __UNIVERSE_FORCED_AIMING_HPP__ #define __UNIVERSE_FORCED_AIMING_HPP__ #include "universe/forced_movement/base_forced_movement.hpp" #include "universe/class_export.hpp" #include namespace bear { namespace universe { /** * \brief A forced movement that will make the current item going in the * direction of an other item. * * The positions considered for the items are their center of mass. * * \author Julien Jorge */ class UNIVERSE_EXPORT forced_aiming: public base_forced_movement { public: forced_aiming ( time_type length = std::numeric_limits::infinity() ); base_forced_movement* clone() const; void set_max_angle( double a ); void set_max_speed( double s ); void set_acceleration( double a ); void set_apply_angle( bool b ); void set_total_time( time_type length ); bool is_finished() const; private: void do_init(); time_type do_next_position( time_type elapsed_time ); time_type compute_remaining_time( time_type& elapsed_time ); double compute_speed( time_type elapsed_time ) const; double compute_direction( vector_type& dir ) const; private: /** \brief Maximum angle when the direction changes. */ double m_max_angle; /** \brief The maximum speed of the moving item. */ double m_max_speed; /** \brief The acceleration of the moving item. */ double m_acceleration; /** \brief Total time of the movement. */ time_type m_total_time; /** \brief Remaining time. */ time_type m_remaining_time; /** \brief Tell if we apply the angle of the movement to the item. */ bool m_apply_angle; }; // class forced_aiming } // namespace universe } // namespace bear #endif // __UNIVERSE_FORCED_AIMING_HPP__ plee-the-bear-20251226/bear-engine/core/src/universe/forced_movement/forced_goto.hpp000066400000000000000000000035601512343254000303060ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A forced movement that will bring an item to a given position. * \author Julien Jorge */ #ifndef __UNIVERSE_FORCED_GOTO_HPP__ #define __UNIVERSE_FORCED_GOTO_HPP__ #include "universe/forced_movement/base_forced_movement.hpp" #include "universe/forced_movement/sinus_speed_generator.hpp" #include "universe/class_export.hpp" namespace bear { namespace universe { /** * \brief A forced movement that will bring an item to a given position. * \author Julien Jorge */ class UNIVERSE_EXPORT forced_goto: public base_forced_movement { public: forced_goto( time_type length = 1 ); base_forced_movement* clone() const; void set_total_time( time_type length ); void set_acceleration_time( time_type length ); void set_length( const vector_type& v ); void set_x_length( coordinate_type v ); void set_y_length( coordinate_type v ); bool is_finished() const; private: void do_init(); time_type do_next_position( time_type elapsed_time ); coordinate_type get_speed( time_type t ) const; private: /** \brief Total time to reach the target. */ time_type m_total_time; /** \brief Time elapsed since the begining of the movement. */ time_type m_elapsed_time; /** \brief The position to reach. */ position_type m_target_position; /** \brief The length of the journey. */ vector_type m_length; /** \brief The speed generator used to move the item. */ sinus_speed_generator m_speed_generator; }; // class forced_goto } // namespace universe } // namespace bear #endif // __UNIVERSE_FORCED_GOTO_HPP__ plee-the-bear-20251226/bear-engine/core/src/universe/forced_movement/forced_join.hpp000066400000000000000000000030361512343254000302730ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A forced movement that will try to bring an item to an other item. * \author Julien Jorge */ #ifndef __UNIVERSE_FORCED_JOIN_HPP__ #define __UNIVERSE_FORCED_JOIN_HPP__ #include "universe/forced_movement/base_forced_movement.hpp" #include "universe/class_export.hpp" namespace bear { namespace universe { /** * \brief A forced movement that will try to bring an item to an other item. * \author Julien Jorge */ class UNIVERSE_EXPORT forced_join: public base_forced_movement { public: forced_join( time_type length = 0 ); base_forced_movement* clone() const; void set_total_time( time_type length ); bool is_finished() const; private: void do_init(); time_type do_next_position( time_type elapsed_time ); private: /** \brief Total time to reach the target. */ time_type m_total_time; /** \brief Remaining time to reach the target. */ time_type m_remaining_time; /** \brief The initial position of moving item. */ bear::universe::position_type m_initial_item_position; /** \brief The initial position of target item. */ bear::universe::position_type m_initial_target_position; }; // class forced_join } // namespace universe } // namespace bear #endif // __UNIVERSE_FORCED_JOIN_HPP__ plee-the-bear-20251226/bear-engine/core/src/universe/forced_movement/forced_movement.hpp000066400000000000000000000041141512343254000311640ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief An interface to the forced movements. * \author Julien Jorge */ #ifndef __UNIVERSE_FORCED_MOVEMENT_HPP__ #define __UNIVERSE_FORCED_MOVEMENT_HPP__ #include "universe/forced_movement/reference_point.hpp" #include "universe/types.hpp" #include "universe/class_export.hpp" namespace bear { namespace universe { class base_forced_movement; class physical_item; /** * \brief An interface to the forced movements. * * If an item has a forced movement, the physical rules won't apply to him. * * \author Julien Jorge */ class UNIVERSE_EXPORT forced_movement { public: forced_movement(); forced_movement( const forced_movement& that ); forced_movement( const base_forced_movement& m ); ~forced_movement(); forced_movement& operator=( forced_movement that ); bool is_null() const; void clear(); void init(); void clear_item(); void set_item( physical_item& item ); bool has_reference_point() const; void set_reference_point( const reference_point& r ); position_type get_reference_position() const; void set_reference_point_on_center( physical_item& item ); bool has_reference_item() const; physical_item& get_reference_item() const; void set_auto_remove(bool b); void set_auto_angle(bool b); position_type get_moving_item_ratio() const; void set_moving_item_ratio(const position_type & ratio); position_type get_moving_item_gap() const; void set_moving_item_gap(const position_type & gap); time_type next_position( time_type elapsed_time ); bool is_finished() const; private: /** \brief The effective movement. */ base_forced_movement* m_movement; }; // class forced_movement } // namespace universe } // namespace bear #endif // __UNIVERSE_FORCED_MOVEMENT_HPP__ plee-the-bear-20251226/bear-engine/core/src/universe/forced_movement/forced_movement_function.hpp000066400000000000000000000034001512343254000330660ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A forced movement that will assign the result of a function to the * center of mass on an item. * \author Julien Jorge */ #ifndef __UNIVERSE_FORCED_MOVEMENT_FUNCTION_HPP__ #define __UNIVERSE_FORCED_MOVEMENT_FUNCTION_HPP__ #include "universe/forced_movement/base_forced_movement.hpp" #include #include namespace bear { namespace universe { /** * \brief A forced movement that will assign the result of a function to the * center of mass on an item. * * \author Julien Jorge */ class UNIVERSE_EXPORT forced_movement_function: public base_forced_movement { public: /** \brief The type of the function called to move the item. */ typedef boost::function function_type; public: forced_movement_function ( const function_type& f, time_type length = std::numeric_limits::infinity() ); base_forced_movement* clone() const; void set_total_time( time_type length ); bool is_finished() const; private: void do_init(); time_type do_next_position( time_type elapsed_time ); private: /** \brief Total time of the movement. */ time_type m_total_time; /** \brief Remaining time. */ time_type m_remaining_time; /** \brief The function called to move the item. */ function_type m_function; }; // class forced_movement_function } // namespace universe } // namespace bear #endif // __UNIVERSE_FORCED_MOVEMENT_FUNCTION_HPP__ plee-the-bear-20251226/bear-engine/core/src/universe/forced_movement/forced_rotation.hpp000066400000000000000000000072561512343254000312030ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A forced movement that will make the current item rotating around * another item. * \author Julien Jorge */ #ifndef __UNIVERSE_FORCED_ROTATION_HPP__ #define __UNIVERSE_FORCED_ROTATION_HPP__ #include "universe/forced_movement/base_forced_movement.hpp" #include "universe/forced_movement/sinus_speed_generator.hpp" #include "universe/class_export.hpp" namespace bear { namespace universe { /** * \brief A forced movement that will make the current item rotating around * another item. * * The positions considered for the items are their center of mass. * * \author Julien Jorge */ class UNIVERSE_EXPORT forced_rotation: public base_forced_movement { public: /** \brief How the angle of the rotation is applied to the item. */ enum angle_application { /** \brief The angle is added to the angle of the item. */ apply_add, /** \brief The angle is given to the item, regardless of its previous value. */ apply_force, /** \brief The angle of the item is not changed. */ apply_keep, /** \forte The angle of the item is the difference between the current angle and the initial one. */ apply_force_delta, /** \forte The angle of the item is the difference between the final angle and the current one. */ apply_force_remaining }; // enum angle_application public: forced_rotation(); base_forced_movement* clone() const; void set_radius( double radius ); void set_start_angle( double start_angle ); void set_end_angle( double end_angle ); void set_angle_application( angle_application a ); void set_total_time( time_type length ); void set_acceleration_time( time_type length ); void set_loops( unsigned int loops ); void set_loop_back( bool loop_back ); bool is_finished() const; private: void do_init(); time_type do_next_position( time_type elapsed_time ); time_type update_angle( const time_type elapsed_time ); void end_reached(); void start_reached(); void set_item_position(); private: /** \brief Initial angle. */ double m_start_angle; /** \brief End angle. */ double m_end_angle; /** \brief Current angle. */ double m_angle; /** \brief Distance of the moving item from the center of the rotation. */ double m_radius; /** \brief Total time of the movement. */ time_type m_total_time; /** \brief Elapsed time in the movement. */ time_type m_elapsed_time; /** \brief Must we play the rotation backward when the end is reached or just come back to the start angle ? */ bool m_loop_back; /** \brief How many times the rotation will be done. */ unsigned int m_loops; /** \brief How many full loops have we done ? */ unsigned int m_loop_count; /** \brief How the angle of the rotation is applied to the item. */ angle_application m_angle_application; /** \brief The speed generator used to move the item. */ sinus_speed_generator m_speed_generator; /** \brief Tells if we are moving the item from the start angle toward the end angle. */ bool m_is_playing_forward; }; // class forced_rotation } // namespace universe } // namespace bear #endif // __UNIVERSE_FORCED_ROTATION_HPP__ plee-the-bear-20251226/bear-engine/core/src/universe/forced_movement/forced_sequence.hpp000066400000000000000000000035561512343254000311530ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A forced movement made of a sequence of forced movements. * \author Julien Jorge */ #ifndef __UNIVERSE_FORCED_SEQUENCE_HPP__ #define __UNIVERSE_FORCED_SEQUENCE_HPP__ #include "universe/forced_movement/base_forced_movement.hpp" #include "universe/forced_movement/forced_movement.hpp" #include "universe/class_export.hpp" #include namespace bear { namespace universe { /** * \brief A forced movement made of a sequence of forced movements. * \author Julien Jorge */ class UNIVERSE_EXPORT forced_sequence: public base_forced_movement { public: forced_sequence(); base_forced_movement* clone() const; void push_back( const forced_movement& m ); void set_loops( unsigned int loops ); bool is_finished() const; private: void do_init(); time_type do_next_position( time_type elapsed_time ); void next_sequence(); void init_current_subsequence(); private: /** \brief The sub sequences. */ std::vector m_sub_sequence; /** \brief Index of the current sub sequence. */ unsigned int m_index; /** \brief How many times the sequence will be done. */ unsigned int m_loops; /** \brief How many full play have we done ? */ unsigned int m_play_count; /** \brief Tells if the movement is finished for another reason that the end of the loops. */ bool m_finished; /** \brief Tells if the last loop has produced a change. */ bool m_has_changed; }; // class forced_sequence } // namespace universe } // namespace bear #endif // __UNIVERSE_FORCED_SEQUENCE_HPP__ plee-the-bear-20251226/bear-engine/core/src/universe/forced_movement/forced_stay_around.hpp000066400000000000000000000047031512343254000316660ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A forced movement that will make the current item rotating around * another item. * \author Julien Jorge */ #ifndef __UNIVERSE_FORCED_STAY_AROUND_HPP__ #define __UNIVERSE_FORCED_STAY_AROUND_HPP__ #include "universe/forced_movement/base_forced_movement.hpp" #include "universe/class_export.hpp" #include namespace bear { namespace universe { /** * \brief A forced movement that will make the current item going in the * direction of an other item. * * The positions considered for the items are their center of mass. * * \author Julien Jorge */ class UNIVERSE_EXPORT forced_stay_around: public base_forced_movement { public: forced_stay_around ( time_type length = std::numeric_limits::infinity() ); base_forced_movement* clone() const; void set_max_angle( double a ); void set_speed( double s ); void set_max_distance( coordinate_type d ); void set_apply_angle( bool b ); void set_total_time( time_type length ); bool is_finished() const; private: void do_init(); time_type do_next_position( time_type elapsed_time ); time_type compute_remaining_time( time_type& elapsed_time ); double compute_direction ( vector_type& dir, vector_type current_dir ) const; private: /** \brief Maximum angle when the direction changes. */ double m_max_angle; /** \brief The constant speed of the moving item. */ double m_speed; /** \brief The maximum distance to the center. */ coordinate_type m_max_distance; /** \brief Total time of the movement. */ time_type m_total_time; /** \brief Remaining time. */ time_type m_remaining_time; /** \brief Tell if we apply the angle of the movement to the item. */ bool m_apply_angle; /** \brief The previous position of the moving item, relatively to the reference. */ position_type m_position_delta; /** \brief The previous position of the reference item. */ position_type m_previous_reference_position; }; // class forced_stay_around } // namespace universe } // namespace bear #endif // __UNIVERSE_FORCED_STAY_AROUND_HPP__ plee-the-bear-20251226/bear-engine/core/src/universe/forced_movement/forced_tracking.hpp000066400000000000000000000034201512343254000311330ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A forced movement that will force the current item to be at a precise * distance of an other item. * \author Julien Jorge */ #ifndef __UNIVERSE_FORCED_TRACKING_HPP__ #define __UNIVERSE_FORCED_TRACKING_HPP__ #include "universe/forced_movement/base_forced_movement.hpp" #include "universe/class_export.hpp" #include namespace bear { namespace universe { /** * \brief A forced movement that will force the current item to be at a * precise distance of an other item. * \author Julien Jorge */ class UNIVERSE_EXPORT forced_tracking: public base_forced_movement { public: forced_tracking ( time_type length = std::numeric_limits::infinity() ); forced_tracking ( const position_type& distance, time_type length = std::numeric_limits::infinity() ); base_forced_movement* clone() const; void set_distance( const position_type& distance ); void set_total_time( time_type length ); const position_type& get_distance() const; bool is_finished() const; private: void do_init(); time_type do_next_position( time_type elapsed_time ); private: /** \brief Stay at this distance of the reference. */ position_type m_distance; /** \brief Total time of the movement. */ time_type m_total_time; /** \brief Remaining time. */ time_type m_remaining_time; }; // class forced_tracking } // namespace universe } // namespace bear #endif // __UNIVERSE_FORCED_TRACKING_HPP__ plee-the-bear-20251226/bear-engine/core/src/universe/forced_movement/forced_translation.hpp000066400000000000000000000040721512343254000316730ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A forced movement that will make the current item translating. * \author Sébastien Angibaud */ #ifndef __UNIVERSE_FORCED_TRANSLATION_HPP__ #define __UNIVERSE_FORCED_TRANSLATION_HPP__ #include #include #include "universe/forced_movement/base_forced_movement.hpp" #include "universe/class_export.hpp" namespace bear { namespace universe { /** * \brief A forced movement that will make the current item translating. * * The positions considered for the items are their center of mass. * * \author Sébastien Angibaud */ class UNIVERSE_EXPORT forced_translation: public base_forced_movement { public: forced_translation ( time_type length = std::numeric_limits::infinity() ); forced_translation ( const speed_type& speed, time_type length = std::numeric_limits::infinity() ); base_forced_movement* clone() const; void set_angle( double angle ); void set_force_angle( bool f ); void set_speed( const speed_type& speed ); void set_total_time( time_type length ); const speed_type& get_speed() const; bool is_finished() const; private: void do_init(); time_type do_next_position( time_type elapsed_time ); private: /** \brief Speed of the item. */ speed_type m_speed; /** \brief Total time of the movement. */ time_type m_total_time; /** \brief Remaining time. */ time_type m_remaining_time; /** \brief The angle added to the initial angle of the item. */ double m_angle; /** \brief Tell if we force the angle of the item (otherwise the angles are added). */ bool m_force_angle; }; // class forced_translation } // namespace universe } // namespace bear #endif // __UNIVERSE_FORCED_TRANSLATION_HPP__ plee-the-bear-20251226/bear-engine/core/src/universe/forced_movement/natural_forced_movement.hpp000066400000000000000000000030001512343254000327030ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A forced movement that applies a natural movement to the moving * item. * \author Julien Jorge */ #ifndef __UNIVERSE_NATURAL_FORCED_MOVEMENT_HPP__ #define __UNIVERSE_NATURAL_FORCED_MOVEMENT_HPP__ #include #include #include "universe/forced_movement/base_forced_movement.hpp" #include "universe/class_export.hpp" namespace bear { namespace universe { /** * \brief A forced movement that applies a natural movement to the moving * item. * \author Julien Jorge */ class UNIVERSE_EXPORT natural_forced_movement: public base_forced_movement { public: natural_forced_movement ( time_type duration = std::numeric_limits::infinity() ); base_forced_movement* clone() const; void set_total_time( time_type t ); bool is_finished() const; private: void do_init(); time_type do_next_position( time_type elapsed_time ); void update_position( time_type elapsed_time ); private: /** \brief Total time of the movement. */ time_type m_duration; /** \brief Remaining time. */ time_type m_remaining_time; }; // class natural_forced_movement } // namespace universe } // namespace bear #endif // __UNIVERSE_NATURAL_FORCED_MOVEMENT_HPP__ plee-the-bear-20251226/bear-engine/core/src/universe/forced_movement/ratio_reference_point.hpp000066400000000000000000000034171512343254000323620ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Instances of ratio_reference_point compute the reference * point of in forced movements of a given item according to * ratio and gap. * \author Sebastien Angibaud */ #ifndef __UNIVERSE_RATIO_REFERENCE_POINT_HPP__ #define __UNIVERSE_RATIO_REFERENCE_POINT_HPP__ #include "universe/forced_movement/base_reference_point.hpp" #include "universe/item_handle.hpp" #include "universe/class_export.hpp" namespace bear { namespace universe { /** * \brief Instances of ratio_reference_point compute the reference * point of in forced movements of a given item according to * ratio and gap. * * \author Sebastien Angibaud */ class UNIVERSE_EXPORT ratio_reference_point: public base_reference_point { public: ratio_reference_point ( physical_item& item, const position_type& ratio, const position_type& gap = position_type(0, 0) ); virtual base_reference_point* clone() const; virtual bool is_valid() const; virtual position_type get_point() const; virtual bool has_item() const; virtual physical_item& get_item() const; private: /** The item on which we take the center of mass. */ item_handle m_item; /* \brief The ratio applied to compute reference point. */ position_type m_ratio; /* \brief The gap applied to compute reference point. */ position_type m_gap; }; // class ratio_reference_point } // namespace universe } // namespace bear #endif // __UNIVERSE_RATIO_REFERENCE_POINT_HPP__ plee-the-bear-20251226/bear-engine/core/src/universe/forced_movement/reference_point.hpp000066400000000000000000000026071512343254000311640ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Instances of reference_point compute the reference point used in * forced movements. * \author Julien Jorge */ #ifndef __UNIVERSE_REFERENCE_POINT_HPP__ #define __UNIVERSE_REFERENCE_POINT_HPP__ #include "universe/types.hpp" #include "universe/class_export.hpp" namespace bear { namespace universe { class physical_item; class base_reference_point; /** * \brief Instances of reference_point compute the reference * point used in forced movements. * * \author Julien Jorge */ class UNIVERSE_EXPORT reference_point { public: reference_point(); reference_point( const reference_point& that ); reference_point( const base_reference_point& p ); ~reference_point(); reference_point& operator=( const reference_point& that ); bool is_valid() const; position_type get_point() const; bool has_item() const; physical_item& get_item() const; private: /** \brief The effective reference point. */ base_reference_point* m_reference; }; // class reference_point } // namespace universe } // namespace bear #endif // __UNIVERSE_REFERENCE_POINT_HPP__ plee-the-bear-20251226/bear-engine/core/src/universe/forced_movement/sinus_speed_generator.hpp000066400000000000000000000033121512343254000323760ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A speed generator which, for a given time-window and a distance, * applies a sinusoïdal speed curve during the acceleration time and the * deceleration time. * \author Julien Jorge */ #ifndef __UNIVERSE_SINUS_SPEED_GENERATOR_HPP__ #define __UNIVERSE_SINUS_SPEED_GENERATOR_HPP__ #include "universe/types.hpp" #include "universe/class_export.hpp" namespace bear { namespace universe { /** * \brief A speed generator which, for a given time-window and a distance, * applies a sinusoïdal speed curve during the acceleration time and * the deceleration time. * \author Julien Jorge */ class UNIVERSE_EXPORT sinus_speed_generator { public: sinus_speed_generator(); void set_total_time( time_type length ); time_type get_total_time() const; void set_acceleration_time( time_type length ); time_type get_acceleration_time() const; void set_distance( coordinate_type d ); coordinate_type get_distance() const; coordinate_type get_speed( time_type t ) const; private: /** \brief Total time to reach the target. */ time_type m_total_time; /** \brief The duration of the acceleration and deceleration. */ time_type m_acceleration_time; /** \brief The total distance of the journey. */ coordinate_type m_distance; }; // class sinus_speed_generator } // namespace universe } // namespace bear #endif // __UNIVERSE_SINUS_SPEED_GENERATOR_HPP__ plee-the-bear-20251226/bear-engine/core/src/universe/friction_rectangle.hpp000066400000000000000000000022321512343254000264740ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A rectangle in the world, where the friction is different from the * default friction. * \author Julien Jorge */ #ifndef __UNIVERSE_FRICTION_RECTANGLE_HPP__ #define __UNIVERSE_FRICTION_RECTANGLE_HPP__ #include "universe/types.hpp" #include "universe/class_export.hpp" namespace bear { namespace universe { /** * \brief A rectangle in the world, where the friction is different from the * default friction. * \author Julien Jorge. */ class UNIVERSE_EXPORT friction_rectangle { public: friction_rectangle(); friction_rectangle( const rectangle_type& r, double f ); public: /** \brief The rectangle where the friction is different. */ rectangle_type rectangle; /** \brief The friction in this rectangle. */ double friction; }; // class friction_rectangle } // namespace universe } // namespace bear #endif // __UNIVERSE_FRICTION_RECTANGLE_HPP__ plee-the-bear-20251226/bear-engine/core/src/universe/impl/000077500000000000000000000000001512343254000230645ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/core/src/universe/impl/derived_item_handle.tpp000066400000000000000000000520461512343254000275730ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the universe::derived_item_handle class. * \author Julien Jorge */ #include /*----------------------------------------------------------------------------*/ /** * \brief Default Constructor. */ template bear::universe::derived_item_handle:: derived_item_handle() : m_derived(NULL) { } // derived_item_handle::derived_item_handle() /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param item The item on which we keep a handle. */ template bear::universe::derived_item_handle:: derived_item_handle( ItemType* item ) : m_item(item) { cast_item(); } // derived_item_handle::derived_item_handle() /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param item The item on which we keep a handle. */ template bear::universe::derived_item_handle:: derived_item_handle( ItemType& item ) : m_item(item) { cast_item(); } // derived_item_handle::derived_item_handle() /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param item The item on which we keep a handle. */ template bear::universe::derived_item_handle:: derived_item_handle( const handle_type& item ) : m_item(item) { cast_item(); } // derived_item_handle::derived_item_handle() /*----------------------------------------------------------------------------*/ /** * \brief Copy constructor. */ template bear::universe::derived_item_handle:: derived_item_handle( const self_type& that ) : m_item(that.m_item), m_derived(that.m_derived) { } // derived_item_handle::derived_item_handle() /*----------------------------------------------------------------------------*/ /** * \brief Build a derived_item_handle from a pointer on an instance of the * derived type. * \param item The item for which we create the derived_item_handle. */ template bear::universe::derived_item_handle bear::universe::derived_item_handle:: create_from_derived( DerivedType* item ) { return self_type( dynamic_cast(item) ); } // derived_item_handle::create_from_derived() /*----------------------------------------------------------------------------*/ /** * \brief Build a derived_item_handle from a pointer on an instance of the * derived type. * \param item The item for which we create the derived_item_handle. */ template bear::universe::derived_item_handle bear::universe::derived_item_handle:: create_from_derived( DerivedType& item ) { return self_type( dynamic_cast(&item) ); } // derived_item_handle::create_from_derived() /*----------------------------------------------------------------------------*/ /** * \brief Get the pointer on the derived class. */ template DerivedType* bear::universe::derived_item_handle::get() const { if ( m_item.get() == NULL ) return NULL; else return m_derived; } // derived_item_handle::get() /*----------------------------------------------------------------------------*/ /** * \brief Get the pointer on the handled item. */ template ItemType* bear::universe::derived_item_handle::get_item() const { return static_cast(m_item.get()); } // derived_item_handle::get_item() /*----------------------------------------------------------------------------*/ /** * \brief Dereference operator. */ template DerivedType& bear::universe::derived_item_handle::operator*() const { return *get(); } // derived_item_handle::operator*() /*----------------------------------------------------------------------------*/ /** * \brief Pointer-to-member operator. */ template DerivedType* bear::universe::derived_item_handle::operator->() const { return get(); } // derived_item_handle::operator->() /*----------------------------------------------------------------------------*/ /** * \brief Assign a new item to keep an handle to. * \param item The item. */ template typename bear::universe::derived_item_handle::self_type& bear::universe::derived_item_handle::operator= ( ItemType* item ) { m_item = item; cast_item(); return *this; } // derived_item_handle::operator=() /*----------------------------------------------------------------------------*/ /** * \brief Assignment operator. */ template typename bear::universe::derived_item_handle::self_type& bear::universe::derived_item_handle::operator= ( const self_type& that ) { m_item = that.m_item; m_derived = that.m_derived; return *this; } // derived_item_handle::operator=() /*----------------------------------------------------------------------------*/ /** * \brief Assign a new item to keep an handle to. * \param item The item. */ template typename bear::universe::derived_item_handle::self_type& bear::universe::derived_item_handle::operator= ( const handle_type& item ) { m_item = item; cast_item(); return *this; } // derived_item_handle::operator=() /*----------------------------------------------------------------------------*/ /** * \brief Equality. * \param item The item to compare to. */ template bool bear::universe::derived_item_handle::operator== ( const ItemType* item ) const { return m_item == item; } // derived_item_handle::operator==() /*----------------------------------------------------------------------------*/ /** * \brief Equality. * \param item The item to compare to. */ template bool bear::universe::derived_item_handle::operator== ( const DerivedType* item ) const { return (m_derived == item) || ((item == NULL) && (m_item == NULL)); } // derived_item_handle::operator==() /*----------------------------------------------------------------------------*/ /** * \brief Equality. * \param that The instance to compare to. */ template bool bear::universe::derived_item_handle::operator== ( const self_type& that ) const { return m_item == that.m_item; } // derived_item_handle::operator==() /*----------------------------------------------------------------------------*/ /** * \brief Disequality. * \param item The pointer to compare to. */ template bool bear::universe::derived_item_handle::operator!= ( const ItemType* item ) const { return !(*this == item); } // derived_item_handle::operator!=() /*----------------------------------------------------------------------------*/ /** * \brief Disequality. * \param item The pointer to compare to. */ template bool bear::universe::derived_item_handle::operator!= ( const DerivedType* item ) const { return !(*this == item); } // derived_item_handle::operator!=() /*----------------------------------------------------------------------------*/ /** * \brief Disequality. * \param that The instance to compare to. */ template bool bear::universe::derived_item_handle::operator!= ( const self_type& that ) const { return !(*this == that); } // derived_item_handle::operator!=() /*----------------------------------------------------------------------------*/ /** * \brief "Less than" operator. * \param that The pointer to compare to. */ template bool bear::universe::derived_item_handle::operator< ( const self_type& that ) const { return m_item < that.m_item; } // derived_item_handle::operator<() /*----------------------------------------------------------------------------*/ /** * \brief Dynamically cast the item into the derived type. */ template void bear::universe::derived_item_handle::cast_item() { m_derived = dynamic_cast(m_item.get()); } // derived_item_handle::cast_item() /*----------------------------------------------------------------------------*/ /** * \brief Default Constructor. */ template bear::universe::const_derived_item_handle:: const_derived_item_handle() : m_derived(NULL) { } // const_derived_item_handle::const_derived_item_handle() /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param item The item on which we keep a handle. */ template bear::universe::const_derived_item_handle:: const_derived_item_handle( const ItemType* item ) : m_item(item) { cast_item(); } // const_derived_item_handle::const_derived_item_handle() /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param item The item on which we keep a handle. */ template bear::universe::const_derived_item_handle:: const_derived_item_handle( const ItemType& item ) : m_item(item) { cast_item(); } // const_derived_item_handle::const_derived_item_handle() /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param item The item on which we keep a handle. */ template bear::universe::const_derived_item_handle:: const_derived_item_handle( const handle_type& item ) : m_item(item) { cast_item(); } // const_derived_item_handle::const_derived_item_handle() /*----------------------------------------------------------------------------*/ /** * \brief Copy constructor. */ template bear::universe::const_derived_item_handle:: const_derived_item_handle( const self_type& that ) : m_item(that.m_item), m_derived(that.m_derived) { } // const_derived_item_handle::const_derived_item_handle() /*----------------------------------------------------------------------------*/ /** * \brief Build a derived_item_handle from a pointer on an instance of the * derived type. * \param item The item for which we create the derived_item_handle. */ template bear::universe::const_derived_item_handle bear::universe::const_derived_item_handle:: create_from_derived( DerivedType* item ) { return self_type( dynamic_cast(item) ); } // const_derived_item_handle::create_from_derived() /*----------------------------------------------------------------------------*/ /** * \brief Build a derived_item_handle from a pointer on an instance of the * derived type. * \param item The item for which we create the derived_item_handle. */ template bear::universe::const_derived_item_handle bear::universe::const_derived_item_handle:: create_from_derived( DerivedType& item ) { return self_type( dynamic_cast(&item) ); } // const_derived_item_handle::create_from_derived() /*----------------------------------------------------------------------------*/ /** * \brief Get the pointer on the derived class. */ template const DerivedType* bear::universe::const_derived_item_handle::get() const { if ( m_item.get() == NULL ) return NULL; else return m_derived; } // const_derived_item_handle::get() /*----------------------------------------------------------------------------*/ /** * \brief Get the pointer on the handled item. */ template const ItemType* bear::universe::const_derived_item_handle:: get_item() const { return (ItemType*)m_item.get(); } // const_derived_item_handle::get_item() /*----------------------------------------------------------------------------*/ /** * \brief Dereference operator. */ template const DerivedType& bear::universe::const_derived_item_handle:: operator*() const { return *get(); } // const_derived_item_handle::operator*() /*----------------------------------------------------------------------------*/ /** * \brief Pointer-to-member operator. */ template const DerivedType* bear::universe::const_derived_item_handle:: operator->() const { return get(); } // const_derived_item_handle::operator->() /*----------------------------------------------------------------------------*/ /** * \brief Assign a new item to keep an handle to. * \param item The item. */ template typename bear::universe::const_derived_item_handle::self_type& bear::universe::const_derived_item_handle::operator= ( const ItemType* item ) { m_item = item; cast_item(); return *this; } // const_derived_item_handle::operator=() /*----------------------------------------------------------------------------*/ /** * \brief Assignment operator. */ template typename bear::universe::const_derived_item_handle::self_type& bear::universe::const_derived_item_handle::operator= ( const self_type& that ) { m_item = that.m_item; m_derived = that.m_derived; return *this; } // const_derived_item_handle::operator=() /*----------------------------------------------------------------------------*/ /** * \brief Assign a new item to keep an handle to. * \param item The item. */ template typename bear::universe::const_derived_item_handle::self_type& bear::universe::const_derived_item_handle::operator= ( const handle_type& item ) { m_item = item; cast_item(); return *this; } // const_derived_item_handle::operator=() /*----------------------------------------------------------------------------*/ /** * \brief Equality. * \param item The item to compare to. */ template bool bear::universe::const_derived_item_handle::operator== ( const ItemType* item ) const { return m_item == item; } // const_derived_item_handle::operator==() /*----------------------------------------------------------------------------*/ /** * \brief Equality. * \param item The item to compare to. */ template bool bear::universe::const_derived_item_handle::operator== ( const DerivedType* item ) const { return (m_derived == item) || ((item == NULL) && (m_item == NULL)); } // const_derived_item_handle::operator==() /*----------------------------------------------------------------------------*/ /** * \brief Equality. * \param that The instance to compare to. */ template bool bear::universe::const_derived_item_handle::operator== ( const self_type& that ) const { return m_item == that.m_item; } // const_derived_item_handle::operator==() /*----------------------------------------------------------------------------*/ /** * \brief Disequality. * \param item The pointer to compare to. */ template bool bear::universe::const_derived_item_handle::operator!= ( const ItemType* item ) const { return !(*this == item); } // const_derived_item_handle::operator!=() /*----------------------------------------------------------------------------*/ /** * \brief Disequality. * \param item The pointer to compare to. */ template bool bear::universe::const_derived_item_handle::operator!= ( const DerivedType* item ) const { return !(*this == item); } // const_derived_item_handle::operator!=() /*----------------------------------------------------------------------------*/ /** * \brief Disequality. * \param that The instance to compare to. */ template bool bear::universe::const_derived_item_handle::operator!= ( const self_type& that ) const { return !(*this == that); } // const_derived_item_handle::operator!=() /*----------------------------------------------------------------------------*/ /** * \brief "Less than" operator. * \param that The pointer to compare to. */ template bool bear::universe::const_derived_item_handle::operator< ( const self_type& that ) const { return m_item < that.m_item; } // const_derived_item_handle::operator<() /*----------------------------------------------------------------------------*/ /** * \brief Dynamically cast the item into the derived type. */ template void bear::universe::const_derived_item_handle::cast_item() { m_derived = dynamic_cast(m_item.get()); } // const_derived_item_handle::cast_item() /*----------------------------------------------------------------------------*/ /** * \brief A wrapper to easily create a derived_item_handle for a non constant * class type inheriting from physical_item. */ template bear::universe::derived_item_handle bear::universe::item_handle_from( DerivedType* item ) { return derived_item_handle( dynamic_cast(item) ); } // item_handle_from() /*----------------------------------------------------------------------------*/ /** * \brief A wrapper to easily create a derived_item_handle for a constant class * type inheriting from physical_item. */ template bear::universe::const_derived_item_handle bear::universe::const_item_handle_from( const DerivedType* item ) { return const_derived_item_handle ( dynamic_cast(item) ); } // const_item_handle_from() /*----------------------------------------------------------------------------*/ /** * \brief Compare a pointer to an item with an item handle. Return true if the * item handle contains the given item. * \param item The item. * \param handle The item handle. */ template bool operator== ( const DerivedType* item, const bear::universe::derived_item_handle& handle ) { return handle == item; } // operator==() /*----------------------------------------------------------------------------*/ /** * \brief Compare a pointer to an item with an item handle. Return true if the * item handle does not contain the given item. * \param item The item. * \param handle The item handle. */ template bool operator!= ( const DerivedType* item, const bear::universe::derived_item_handle& handle ) { return handle != item; } // operator!=() /*----------------------------------------------------------------------------*/ /** * \brief Compare a pointer to an item with an item handle. Return true if the * item handle contains the given item. * \param item The item. * \param handle The item handle. */ template bool operator== ( const DerivedType* item, const bear::universe::const_derived_item_handle& handle ) { return handle == item; } // operator==() /*----------------------------------------------------------------------------*/ /** * \brief Compare a pointer to an item with an item handle. Return true if the * item handle does not contain the given item. * \param item The item. * \param handle The item handle. */ template bool operator!= ( const DerivedType* item, const bear::universe::const_derived_item_handle& handle ) { return handle != item; } // operator!=() plee-the-bear-20251226/bear-engine/core/src/universe/impl/static_map.tpp000066400000000000000000000207001512343254000257340ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::universe::static_map class. * \author Julien Jorge. */ #include #include #include #include /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param width Width of the whole map. * \param height Height of the whole map. * \param box_size Size of the boxes. * * \remark Big values for box_size increase the compression but also the work * done by get_area(). In an other hand, small values decrease the * work but also the compression. You should find a good compromize * (the empty_cells() and cells_load() methods are made to help you). */ template bear::universe::static_map::static_map ( unsigned int width, unsigned int height, unsigned int box_size ) : m_box_size(box_size), m_size(width / m_box_size + 1, height / m_box_size + 1), m_map( m_size.x * m_size.y ) { CLAW_PRECOND( width > 0 ); CLAW_PRECOND( height > 0 ); // in fact, floating point exception had already been thrown CLAW_PRECOND( box_size > 0 ); } // static_map::static_map() /*----------------------------------------------------------------------------*/ /** * \brief Add an item in the map. * \param item The item to add. */ template void bear::universe::static_map::insert( const item_type& item ) { const area_type box = item->get_bounding_box(); int top = (int)box.top() / (int)m_box_size; int left = (int)box.left() / (int)m_box_size; int bottom = (int)box.bottom() / (int)m_box_size; int right = (int)box.right() / (int)m_box_size; if ( (top < 0) || (bottom >= (int)m_size.y) || (right < 0) || (left >= (int)m_size.x) ) claw::logger << claw::log_warning << "Item is outside the map. Its position in the map is (" << left << ' ' << bottom << ' ' << right << ' ' << top << ' ' << "), its real position is (" << box.left() << ' ' << box.bottom() << ' ' << box.right() << ' ' << box.top() << ")." << std::endl; if ( top >= (int)m_size.y ) top = m_size.y - 1; if ( bottom < 0 ) bottom = 0; if ( right >= (int)m_size.x ) right = m_size.x - 1; if ( left < 0 ) left = 0; const std::size_t id( m_items.size() ); m_items.push_back( item ); m_bounding_boxes.push_back( box ); for ( int col = left; col <= right; ++col ) for ( int line = bottom; line <= top; ++line ) m_map[ col * m_size.y + line ].push_back( id ); } // static_map::insert() /*----------------------------------------------------------------------------*/ /** * \brief Get all items inside rectangular regions of the map, without * duplicates. * \param first Iterator on the first area from which to take the items. * \param last Iterator just past the last the first area from which to take the * items. * \param items (in/out) The items found. */ template template void bear::universe::static_map::get_areas_unique ( AreaIterator first, AreaIterator last, item_list& items ) const { get_areas(first, last, items); make_set(items); } // static_map::get_areas_unique() /*----------------------------------------------------------------------------*/ /** * \brief Get all items inside rectangular regions of the map. * \param first Iterator on the first area from which to take the items. * \param last Iterator just past the last the first area from which to take the * items. * \param items (in/out) The items found. */ template template void bear::universe::static_map::get_areas ( AreaIterator first, AreaIterator last, item_list& items ) const { for ( ; first!=last; ++first ) get_area( *first, items ); } // static_map::get_areas() /*----------------------------------------------------------------------------*/ /** * \brief Get all items inside a rectangular region of the map. * \param area The area from which to take the items. * \param items (out) The items found. */ template void bear::universe::static_map::get_area_unique ( const area_type& area, item_list& items ) const { item_list result; get_area( area, result ); make_set( result ); items.insert( items.end(), result.begin(), result.end() ); } // static_map::get_area() /*----------------------------------------------------------------------------*/ /** * \brief Get all items inside a rectangular region of the map. * \param area The area from which to take the items. * \param items (out) The items found. */ template void bear::universe::static_map::get_area ( const area_type& area, item_list& items ) const { unsigned int min_x = (unsigned int)area.left() / m_box_size; unsigned int max_x = (unsigned int)area.right() / m_box_size; unsigned int min_y = (unsigned int)area.bottom() / m_box_size; unsigned int max_y = (unsigned int)area.top() / m_box_size; if ( max_x >= m_size.x ) max_x = m_size.x - 1; if ( max_y >= m_size.y ) max_y = m_size.y - 1; std::vector ids_in_area; for ( unsigned int x( min_x ); x<=max_x; ++x ) for ( unsigned int y( min_y ); y<=max_y; ++y ) { const unsigned int cell( x * m_size.y + y ); ids_in_area.insert ( ids_in_area.end(), m_map[ cell ].begin(), m_map[ cell ].end() ); } items.reserve( items.size() + ids_in_area.size() ); for ( typename std::vector::const_iterator it ( ids_in_area.begin() ); it != ids_in_area.end(); ++it ) if ( m_bounding_boxes[ *it ].intersects(area) ) items.push_back( m_items[ *it ] ); } // static_map::get_area() /*----------------------------------------------------------------------------*/ /** * \brief Get all items. * \param items (out) The items found. */ template void bear::universe::static_map::get_all_unique( item_list& items ) const { item_list result; for (typename map::const_iterator it(m_map.begin()); it!=m_map.end(); ++it) for ( typename item_box::const_iterator it_id( it->begin() ); it_id != it->end(); ++it_id ) result.push_back( m_items[ *it_id ] ); make_set(result); items.insert( items.end(), result.begin(), result.end() ); } // static_map::get_all() /*----------------------------------------------------------------------------*/ /** * \brief Tell the number of empty cells in the compressed map. */ template unsigned int bear::universe::static_map::empty_cells() const { unsigned int cells=0; for (typename map::const_iterator it(m_map.begin()); it!=m_map.end(); ++it) if ( it->empty() ) ++cells; return cells; } // static_map::empty_cells() /*----------------------------------------------------------------------------*/ /** * \brief Get some statistics about the cells content. * \param min (out) Minimum number of items found in a cell. * \param max (out) Maximum number of items found in a cell. * \param avg (out) Average number of items found in not empty cells. */ template void bear::universe::static_map::cells_load ( unsigned int& min, unsigned int& max, double& avg ) const { unsigned int not_empty_cells=0; unsigned int load=0; min = std::numeric_limits::max(); max = 0; avg = 0; for (typename map::const_iterator it(m_map.begin()); it!=m_map.end(); ++it) { const std::size_t size( it->size() ); if ( size > max ) max = size; if ( size < min ) min = size; if (size != 0) { load += size; ++not_empty_cells; } } if ( (load != 0) && (not_empty_cells!=0) ) avg = (double)load / (double)not_empty_cells; } // static_map::cells_load() /*----------------------------------------------------------------------------*/ /** * \brief Remove duplicate items in a list of items. * \param items The list from which we make a set. */ template void bear::universe::static_map::make_set ( item_list& items ) const { const std::set unique( items.begin(), items.end() ); item_list result( unique.begin(), unique.end() ); items.swap(result); } // static_map::make_set() plee-the-bear-20251226/bear-engine/core/src/universe/internal/000077500000000000000000000000001512343254000237375ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/core/src/universe/internal/code/000077500000000000000000000000001512343254000246515ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/core/src/universe/internal/code/item_selection.cpp000066400000000000000000000012101512343254000303520ustar00rootroot00000000000000#include "universe/internal/item_selection.hpp" #include "universe/physical_item.hpp" #include bool bear::universe::internal::select_item( item_list& items, physical_item* it ) { if ( it->get_world_progress_structure().is_selected() ) return false; items.push_back(it); it->get_world_progress_structure().init(); it->get_world_progress_structure().select(); return true; } void bear::universe::internal::unselect_item ( item_list& items, item_list::iterator it ) { CLAW_PRECOND( (*it)->get_world_progress_structure().is_selected() ); (*it)->get_world_progress_structure().deinit(); items.erase(it); } plee-the-bear-20251226/bear-engine/core/src/universe/internal/item_selection.hpp000066400000000000000000000006301512343254000274520ustar00rootroot00000000000000#ifndef __UNIVERSE_ITEM_SELECTION_HPP__ #define __UNIVERSE_ITEM_SELECTION_HPP__ #include namespace bear { namespace universe { class physical_item; namespace internal { typedef std::vector item_list; bool select_item( item_list& items, physical_item* it ); void unselect_item( item_list& items, item_list::iterator it ); } } } #endif plee-the-bear-20251226/bear-engine/core/src/universe/item_handle.hpp000066400000000000000000000033501512343254000251060ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Safe way to point an item that could die between two uses. * \author Julien Jorge */ #ifndef __UNIVERSE_ITEM_HANDLE_HPP__ #define __UNIVERSE_ITEM_HANDLE_HPP__ #include "universe/class_export.hpp" namespace bear { namespace universe { class physical_item; /** * \brief Safe way to point an item that could die between two uses. * \author Julien Jorge */ class UNIVERSE_EXPORT item_handle { public: typedef physical_item item_type; public: item_handle(); item_handle( item_type* item ); item_handle( item_type& item ); item_handle( const item_handle& that ); ~item_handle(); item_type* get() const; item_type& operator*() const; item_type* operator->() const; item_handle& operator=( item_type* item ); item_handle& operator=( const item_handle& that ); bool operator==( const item_type* item ) const; bool operator==( const item_handle& that ) const; bool operator!=( const item_type* item ) const; bool operator!=( const item_handle& that ) const; bool operator<( const item_handle& that ) const; private: /** \brief The critical item. */ item_type* m_item; }; // class item_handle } // namespace universe } // namespace bear bool operator== ( const bear::universe::physical_item* a, const bear::universe::item_handle& b ); bool operator!= ( const bear::universe::physical_item* a, const bear::universe::item_handle& b ); #endif // __UNIVERSE_ITEM_HANDLE_HPP__ plee-the-bear-20251226/bear-engine/core/src/universe/item_picking_filter.hpp000066400000000000000000000045631512343254000266530ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A filter passed to bear::universe::world::pick_items to get only * interesting items. * \author Julien Jorge */ #ifndef __UNIVERSE_ITEM_PICKING_FILTER_HPP__ #define __UNIVERSE_ITEM_PICKING_FILTER_HPP__ #include "universe/class_export.hpp" #include "universe/types.hpp" namespace bear { namespace universe { class physical_item; /** * \brief A filter passed to bear::universe::world::pick_items to get only * interesting items. * \author Julien Jorge */ class UNIVERSE_EXPORT item_picking_filter { public: item_picking_filter(); virtual ~item_picking_filter(); bool satisfies_condition( const physical_item& item ) const; void set_artificial_value( bool v ); void set_phantom_value( bool v ); void set_can_move_items_value( bool v ); void set_fixed_value( bool v ); void set_forbidden_position( const position_type& pos ); protected: virtual bool do_satisfies_condition( const physical_item& item ) const; private: /** \brief Tell if the "artificial" flag must be checked. */ bool m_check_artificial; /** \brief The value of the "artificial" flag, if checked. */ bool m_artificial_value; /** \brief Tell if the "phantom" flag must be checked. */ bool m_check_phantom; /** \brief The value of the "phantom" flag, if checked. */ bool m_phantom_value; /** \brief Tell if the "can_move_items" flag must be checked. */ bool m_check_can_move_items; /** \brief The value of the "can_move_items" flag, if checked. */ bool m_can_move_items_value; /** \brief Tell if the "fixed" flag must be checked. */ bool m_check_fixed; /** \brief The value of the "fixed" flag, if checked. */ bool m_fixed_value; /** \brief Tell if we check that the item is not at the forbidden position. */ bool m_check_forbidden_position; /** \brief A position where the item must not be. */ position_type m_forbidden_position; }; // class item_picking_filter } // namespace universe } // namespace bear #endif // __UNIVERSE_ITEM_PICKING_FILTER_HPP__ plee-the-bear-20251226/bear-engine/core/src/universe/link/000077500000000000000000000000001512343254000230605ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/core/src/universe/link/base_link.hpp000066400000000000000000000036641512343254000255310ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Base class for links between items. * \author Julien Jorge */ #ifndef __UNIVERSE_BASE_LINK_HPP__ #define __UNIVERSE_BASE_LINK_HPP__ #include "universe/physical_item.hpp" #include #include "universe/class_export.hpp" namespace bear { namespace universe { /** * \brief Base class for links between items. * * A link is an abstract entity representing an interaction between two * items. For example: * - an elastic connecting two items. It's hard for an item to move from * away from the other. * - a magnetic field attract two items. * * \author Julien Jorge */ class UNIVERSE_EXPORT base_link: public claw::pattern::non_copyable { public: base_link( physical_item& first_item, physical_item& second_item ); base_link ( const reference_point& first_item, const reference_point& second_item ); virtual ~base_link(); virtual void adjust() = 0; std::size_t get_id() const; void unlink(); const physical_item& get_first_item() const; const physical_item& get_second_item() const; public: /** \brief An incorrect identifier for the links. */ static std::size_t not_an_id; protected: /** \brief One of the linked items. */ reference_point m_first_item; /** \brief The second linked item. */ reference_point m_second_item; private: /** \brief The identifier of the link. */ std::size_t m_id; /** \brief The next identifier for the links. */ static std::size_t s_next_id; }; // class base_link } // namespace universe } // namespace bear #endif // __UNIVERSE_BASE_LINK_HPP__ plee-the-bear-20251226/bear-engine/core/src/universe/link/chain_link.hpp000066400000000000000000000026721512343254000256770ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief This class is a chain link between two items. * \author Julien Jorge */ #ifndef __UNIVERSE_CHAIN_LINK_HPP__ #define __UNIVERSE_CHAIN_LINK_HPP__ #include "universe/link/base_link.hpp" #include "universe/class_export.hpp" namespace bear { namespace universe { /** * \brief This class is a chain chain_link between two items. * \author Julien Jorge */ class UNIVERSE_EXPORT chain_link: public base_link { public: chain_link( physical_item& first_item, physical_item& second_item, universe::coordinate_type minimal_length, universe::coordinate_type maximal_length ); chain_link ( const reference_point& first_item, const reference_point& second_item, universe::coordinate_type minimal_length, universe::coordinate_type maximal_length ); virtual void adjust(); private: /** \brief The minimum length of the link. */ const universe::coordinate_type m_minimal_length; /** \brief The maximum length of the link. */ const universe::coordinate_type m_maximal_length; }; // class chain_link } // namespace universe } // namespace bear #endif // __UNIVERSE_CHAIN_LINK_HPP__ plee-the-bear-20251226/bear-engine/core/src/universe/link/code/000077500000000000000000000000001512343254000237725ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/core/src/universe/link/code/base_link.cpp000066400000000000000000000065721512343254000264370ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::universe::base_link class. * \author Julien Jorge */ #include "universe/link/base_link.hpp" #include "universe/forced_movement/center_of_mass_reference_point.hpp" #include /*----------------------------------------------------------------------------*/ std::size_t bear::universe::base_link::base_link::not_an_id(0); std::size_t bear::universe::base_link::base_link::s_next_id(1); /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param first_item The first linked item. * \param second_item The second linked item. * \pre \a first_item and \a second_item are distinct. */ bear::universe::base_link::base_link ( physical_item& first_item, physical_item& second_item ) : m_first_item( center_of_mass_reference_point(first_item) ), m_second_item( center_of_mass_reference_point(second_item) ), m_id(s_next_id++) { CLAW_PRECOND( &first_item != &second_item ); m_first_item.get_item().add_link(*this); m_second_item.get_item().add_link(*this); } // base_link::base_link() /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param first_item The first linked item. * \param second_item The second linked item. * \pre \a first_item and \a second_item are distinct. */ bear::universe::base_link::base_link ( const reference_point& first_item, const reference_point& second_item ) : m_first_item(first_item), m_second_item(second_item), m_id(s_next_id++) { CLAW_PRECOND( &first_item.get_item() != &second_item.get_item() ); m_first_item.get_item().add_link(*this); m_second_item.get_item().add_link(*this); } // base_link::base_link /*----------------------------------------------------------------------------*/ /** * \brief Destructor. */ bear::universe::base_link::~base_link() { unlink(); } // base_link::~base_link() /*----------------------------------------------------------------------------*/ /** * \brief Get the identifier of the link. */ std::size_t bear::universe::base_link::get_id() const { return m_id; } // base_link::get_id() /*----------------------------------------------------------------------------*/ /** * \brief Unlink the two items. */ void bear::universe::base_link::unlink() { if ( m_first_item.has_item() ) { m_first_item.get_item().remove_link(*this); m_first_item = reference_point(); } if ( m_second_item.has_item() ) { m_second_item.get_item().remove_link(*this); m_second_item = reference_point(); } } // base_link::unlink() /*----------------------------------------------------------------------------*/ /** * \brief Get the first item concerned by this link. */ const bear::universe::physical_item& bear::universe::base_link::get_first_item() const { return m_first_item.get_item(); } // base_link::get_first_item() /*----------------------------------------------------------------------------*/ /** * \brief Get the second item concerned by this link. */ const bear::universe::physical_item& bear::universe::base_link::get_second_item() const { return m_second_item.get_item(); } // base_link::get_second_item() plee-the-bear-20251226/bear-engine/core/src/universe/link/code/chain_link.cpp000066400000000000000000000061251512343254000266010ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::universe::chain_link class. * \author Julien Jorge */ #include "universe/link/chain_link.hpp" #include /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param first_item The first linked item. * \param second_item The second linked item. * \param minimal_length The length under which the link moves the items apart * from each other. * \param maximal_length The length over which the link moves the items toward * each other. */ bear::universe::chain_link::chain_link ( physical_item& first_item, physical_item& second_item, bear::universe::coordinate_type minimal_length, bear::universe::coordinate_type maximal_length ) : base_link(first_item, second_item), m_minimal_length(minimal_length), m_maximal_length(maximal_length) { } // chain_link::chain_link() /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param first_item The first linked item. * \param second_item The second linked item. * \param minimal_length The length under which the link moves the items apart * from each other. * \param maximal_length The length over which the link moves the items toward * each other. */ bear::universe::chain_link::chain_link ( const reference_point& first_item, const reference_point& second_item, universe::coordinate_type minimal_length, universe::coordinate_type maximal_length ) : base_link(first_item, second_item), m_minimal_length(minimal_length), m_maximal_length(maximal_length) { } // chain_link::chain_link() /*----------------------------------------------------------------------------*/ /** * \brief Update the forces applied to each item. */ void bear::universe::chain_link::adjust() { force_type dir( m_first_item.get_point(), m_second_item.get_point() ); const double d = dir.length(); double delta(0); if (d > m_maximal_length) delta = d - m_maximal_length; else if (d < m_minimal_length) delta = d - m_minimal_length; // negative value to move the items apart dir.normalize(); position_type d1(0, 0); position_type d2(0, 0); const double infinity( std::numeric_limits::infinity() ); const double m1( m_first_item.get_item().get_mass() ); const double m2( m_second_item.get_item().get_mass() ); if ( (m1 != infinity) ) { if ( (m2 != infinity) && (m1 + m2 != 0) ) { d1 = dir * delta * m2 / (m1 + m2); d2 = -dir * delta * m1 / (m1 + m2); } else d1 = dir * delta; } else if ( m2 != infinity ) d2 = -dir * delta; m_first_item.get_item().set_center_of_mass ( m_first_item.get_item().get_center_of_mass() + d1 ); m_second_item.get_item().set_center_of_mass ( m_second_item.get_item().get_center_of_mass() + d2 ); } // chain_link::adjust() plee-the-bear-20251226/bear-engine/core/src/universe/link/code/link.cpp000066400000000000000000000050431512343254000254350ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::universe::link class. * \author Julien Jorge */ #include "universe/link/link.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param first_item The first linked item. * \param second_item The second linked item. * \param strength The strength of the elastic. * \param minimal_length The length under which the link moves the items apart * from each other. * \param maximal_length The length over which the link moves the items toward * each other. */ bear::universe::link::link ( physical_item& first_item, physical_item& second_item, double strength, bear::universe::coordinate_type minimal_length, bear::universe::coordinate_type maximal_length ) : base_link(first_item, second_item), m_strength(strength), m_minimal_length(minimal_length), m_maximal_length(maximal_length) { } // link::link() /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param first_item The first linked item. * \param second_item The second linked item. * \param minimal_length The length under which the link moves the items apart * from each other. * \param maximal_length The length over which the link moves the items toward * each other. */ bear::universe::link::link ( const reference_point& first_item, const reference_point& second_item, double strength, universe::coordinate_type minimal_length, universe::coordinate_type maximal_length ) : base_link(first_item, second_item), m_strength(strength), m_minimal_length(minimal_length), m_maximal_length(maximal_length) { } // link::link() /*----------------------------------------------------------------------------*/ /** * \brief Update the forces applied to each item. */ void bear::universe::link::adjust() { force_type dir( m_second_item.get_point(), m_first_item.get_point() ); const double d = dir.length(); double delta(0); if (d > m_maximal_length) delta = d - m_maximal_length; else if (d < m_minimal_length) delta = d - m_minimal_length; // negative value to move the items apart dir.normalize(); dir *= m_strength * delta / d; m_first_item.get_item().add_external_force(-dir); m_second_item.get_item().add_external_force(dir); } // link::adjust() plee-the-bear-20251226/bear-engine/core/src/universe/link/link.hpp000066400000000000000000000031171512343254000245300ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief This class is an elastic link between two items. * \author Julien Jorge */ #ifndef __UNIVERSE_LINK_HPP__ #define __UNIVERSE_LINK_HPP__ #include "universe/link/base_link.hpp" #include "universe/class_export.hpp" namespace bear { namespace universe { /** * \brief This class is an elastic link between two items. * * A link makes hard to move two items away from each other. * * \author Julien Jorge */ class UNIVERSE_EXPORT link: public base_link { public: link( physical_item& first_item, physical_item& second_item, double strength, universe::coordinate_type minimal_length, universe::coordinate_type maximal_length ); link( const reference_point& first_item, const reference_point& second_item, double strength, universe::coordinate_type minimal_length, universe::coordinate_type maximal_length ); virtual void adjust(); private: /** \brief The strength of the elastic. */ const double m_strength; /** \brief The minimum length of the link. */ const universe::coordinate_type m_minimal_length; /** \brief The maximum length of the link. */ const universe::coordinate_type m_maximal_length; }; // class link } // namespace universe } // namespace bear #endif // __UNIVERSE_LINK_HPP__ plee-the-bear-20251226/bear-engine/core/src/universe/physical_item.hpp000066400000000000000000000161151512343254000254720ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief The common interface for all the physical items living in our * universe. * \author Julien Jorge */ #ifndef __UNIVERSE_PHYSICAL_ITEM_HPP__ #define __UNIVERSE_PHYSICAL_ITEM_HPP__ #include "universe/const_item_handle.hpp" #include "universe/physical_item_state.hpp" #include "universe/environment_type.hpp" #include "universe/world_progress_structure.hpp" #include "universe/forced_movement/forced_movement.hpp" #include #include #include namespace bear { namespace universe { class collision_align_policy; class collision_info; class item_handle; class base_link; class world; /** * \brief The common interface for all the physical items living in our * universe. * \author Julien Jorge */ class UNIVERSE_EXPORT physical_item : public physical_item_state { public: /** \brief The type of the class that stores our fields. */ typedef physical_item_state super; /** \brief The type of the list in which we store the links. */ typedef std::list link_list_type; /** \brief Const iterator on the list of links. */ typedef link_list_type::const_iterator const_link_iterator; /** \brief The list of items passed to get_dependent_items(). */ typedef std::vector item_list; private: /** \brief A list of handles. */ typedef std::list handle_list; /** \brief A list of const_handles. */ typedef std::list const_handle_list; public: physical_item(); physical_item( const physical_item& that ); virtual ~physical_item(); forced_movement& get_forced_movement(); void set_forced_movement( const forced_movement& m ); bool has_forced_movement() const; void clear_forced_movement(); void set_movement_reference( const physical_item* item ); const physical_item* get_movement_reference() const; bool is_linked_to( const physical_item& item ) const; bool is_linked_to( const physical_item& item, std::size_t id ) const; time_type get_age() const; virtual void get_dependent_items( item_list& d ) const; virtual void time_step( time_type elapsed_time ); virtual void enters_active_region(); virtual void leaves_active_region(); virtual void move( time_type elapsed_time ); virtual void collision( collision_info& info ); bool collides_with( const physical_item& that ) const; // public only for world void set_owner(world& owner); void quit_owner(); world_progress_structure& get_world_progress_structure(); const world_progress_structure& get_world_progress_structure() const; // -end- public only for world // public only for base_link void add_link( base_link& link ); void remove_link( base_link& link ); // -end- public only for base_link const_link_iterator links_begin() const; const_link_iterator links_end() const; void remove_all_links(); // public only for item_handle void add_handle( item_handle* h ) const; void add_handle( const_item_handle* h ) const; void remove_handle( item_handle* h ) const; void remove_handle( const_item_handle* h ) const; // -end- public only for item_handle void adjust_cinetic(); bool has_owner() const; world& get_owner() const; bool default_collision( const collision_info& info ); bool default_collision ( const collision_info& info, const collision_align_policy& policy ); bool interesting_collision( const physical_item& that ) const; protected: void default_move( time_type elapsed_time ); bool collision_align_left( const collision_info& info ); bool collision_align_right( const collision_info& info ); bool collision_align_top( const collision_info& info ); bool collision_align_bottom( const collision_info& info ); bool collision_middle( const collision_info& info ); bool collision_align_left ( const collision_info& info, const collision_align_policy& policy ); bool collision_align_right ( const collision_info& info, const collision_align_policy& policy ); bool collision_align_top ( const collision_info& info, const collision_align_policy& policy ); bool collision_align_bottom ( const collision_info& info, const collision_align_policy& policy ); bool collision_middle ( const collision_info& info, const collision_align_policy& policy ); bool collision_align_left ( const collision_info& info, const position_type& pos ); bool collision_align_right ( const collision_info& info, const position_type& pos ); bool collision_align_top ( const collision_info& info, const position_type& pos ); bool collision_align_bottom ( const collision_info& info, const position_type& pos ); bool collision_align_left ( const collision_info& info, const position_type& pos, const collision_align_policy& policy ); bool collision_align_right ( const collision_info& info, const position_type& pos, const collision_align_policy& policy ); bool collision_align_top ( const collision_info& info, const position_type& pos, const collision_align_policy& policy ); bool collision_align_bottom ( const collision_info& info, const position_type& pos, const collision_align_policy& policy ); bool is_only_in_environment(const universe::environment_type e) const; bool is_in_environment(const universe::environment_type e) const; private: bool collision_align_at ( physical_item_state& that, const position_type& pos ) const; void remove_all_handles() const; coordinate_type get_align_epsilon() const; virtual bool do_interesting_collision( const physical_item& that ) const; // not implemented physical_item& operator=(const physical_item&); private: /** \brief Forced movement applied to this item. */ forced_movement m_forced_movement; /** \brief The item relative to which I move. */ const_item_handle m_movement_reference; /** \brief The links concerning the item. */ link_list_type m_links; /** \brief The handles on me. */ mutable handle_list m_handles; /** \brief The handles on me. */ mutable const_handle_list m_const_handles; /** \brief The world in which this item lives. */ world* m_owner; /** \brief A structure used by the world for the progress of the item. */ world_progress_structure m_world_progress_structure; /** \brief The age of this item. */ time_type m_age; }; // class physical_item } // namespace universe } // namespace bear #endif // __UNIVERSE_PHYSICAL_ITEM_HPP__ plee-the-bear-20251226/bear-engine/core/src/universe/physical_item_attributes.hpp000066400000000000000000000045731512343254000277450ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Description of a physical item. * \author Julien Jorge */ #ifndef __UNIVERSE_PHYSICAL_ITEM_ATTRIBUTES_HPP__ #define __UNIVERSE_PHYSICAL_ITEM_ATTRIBUTES_HPP__ #include "universe/contact_info.hpp" #include "universe/physical_item_flags.hpp" #include "universe/shape/shape.hpp" #include "universe/class_export.hpp" namespace bear { namespace universe { /** * \brief Description of a physical item. * \author Julien Jorge */ class UNIVERSE_EXPORT physical_item_attributes { public: physical_item_attributes(); /** \brief The shape of the item, defines its position and its size. */ shape m_shape; physical_item_flags::type m_flags; /** \brief Current item's internal force. */ force_type m_internal_force; /** \brief Current item's external force. */ force_type m_external_force; /** \brief Item's orientation. */ double m_system_angle; /** \brief Item's mass. */ double m_mass; /** \brief Item friction as a percentage of the kept movement. */ double m_self_friction; /** \brief Friction applied to the item by a contact with an other item, as a percentage of the kept movement. */ double m_contact_friction; /** \brief Current item's speed. */ speed_type m_speed; /** \brief Current item's angular speed. */ double m_angular_speed; /** \brief How many temporary constaints the item has on its X-position. */ std::uint8_t m_x_fixed; /** \brief How many temporary constaints the item has on its Y-position. */ std::uint8_t m_y_fixed; /** \brief Item's density. */ double m_density; /** \brief Current item's acceleration (forces coming from the item). */ force_type m_acceleration; /** \brief Item elasticity. */ double m_elasticity; /** \brief Item hardness. */ double m_hardness; /** \brief The structure describing the contacts. */ contact_info m_contact; }; // class physical_item_attributes } // namespace universe } // namespace bear #endif // __UNIVERSE_PHYSICAL_ITEM_ATTRIBUTES_HPP__ plee-the-bear-20251226/bear-engine/core/src/universe/physical_item_flags.hpp000066400000000000000000000014531512343254000266450ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ #ifndef __UNIVERSE_PHYSICAL_ITEM_FLAGS_HPP__ #define __UNIVERSE_PHYSICAL_ITEM_FLAGS_HPP__ #include "universe/class_export.hpp" #include namespace bear { namespace universe { struct UNIVERSE_EXPORT physical_item_flags { typedef std::int8_t type; static constexpr type free_system_angle = 1 << 0; static constexpr type can_move_items = 1 << 1; static constexpr type phantom = 1 << 2; static constexpr type artificial = 1 << 3; static constexpr type weak_collisions = 1 << 4; static constexpr type global = 1 << 5; }; } } #endif plee-the-bear-20251226/bear-engine/core/src/universe/physical_item_state.hpp000066400000000000000000000173171512343254000266770ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Important fields of the physical items. * \author Julien Jorge */ #ifndef __UNIVERSE_PHYSICAL_ITEM_STATE_HPP__ #define __UNIVERSE_PHYSICAL_ITEM_STATE_HPP__ #include "physical_item_attributes.hpp" #include "universe/class_export.hpp" namespace bear { namespace universe { /** * \brief Important fields of the physical items. * \author Julien Jorge */ class UNIVERSE_EXPORT physical_item_state { public: physical_item_state(); physical_item_state( const physical_item_state& that ); virtual ~physical_item_state(); size_box_type get_size() const; size_type get_width() const; size_type get_height() const; void set_bounding_box( const universe::rectangle_type& r ); const universe::rectangle_type& get_bounding_box() const; const force_type& get_acceleration() const; void set_acceleration( const force_type& a ); force_type get_force() const; const force_type& get_internal_force() const; const force_type& get_external_force() const; void add_internal_force( const force_type& force ); void add_external_force( const force_type& force ); void set_internal_force( const force_type& f ); void set_external_force( const force_type& f ); double get_mass() const; void set_mass( double m ); double get_density() const; void set_density( double d ); const speed_type& get_speed() const; void set_speed( const speed_type& speed ); void set_speed( double x, double y ); double get_angular_speed() const; void set_angular_speed( double speed ); void add_angular_speed( double speed ); double get_friction() const; void set_friction( double f ); double get_contact_friction() const; void set_contact_friction( double f ); double get_elasticity() const; void set_elasticity( double e ); double get_hardness() const; void set_hardness( double h ); double get_system_angle() const; void set_system_angle( double a ); void set_contact_angle( double a ); bool has_free_system() const; void set_free_system( bool b ); vector_type get_x_axis() const; void set_top( coordinate_type pos ); void set_bottom( coordinate_type pos ); void set_left( coordinate_type pos ); void set_right( coordinate_type pos ); void set_horizontal_middle( coordinate_type pos ); void set_vertical_middle( coordinate_type pos ); void set_top_left( const position_type& pos ); void set_top_middle( const position_type& pos ); void set_top_right( const position_type& pos ); void set_bottom_left( const position_type& pos ); void set_bottom_middle( const position_type& pos ); void set_bottom_right( const position_type& pos ); void set_left_middle( const position_type& pos ); void set_right_middle( const position_type& pos ); void set_top_left( const coordinate_type& x, const coordinate_type& y ); void set_top_middle( const coordinate_type& x, const coordinate_type& y ); void set_top_right( const coordinate_type& x, const coordinate_type& y ); void set_bottom_left ( const coordinate_type& x, const coordinate_type& y ); void set_bottom_middle ( const coordinate_type& x, const coordinate_type& y ); void set_bottom_right ( const coordinate_type& x, const coordinate_type& y ); void set_left_middle ( const coordinate_type& x, const coordinate_type& y ); void set_right_middle ( const coordinate_type& x, const coordinate_type& y ); coordinate_type get_left() const; coordinate_type get_top() const; coordinate_type get_right() const; coordinate_type get_bottom() const; coordinate_type get_horizontal_middle() const; coordinate_type get_vertical_middle() const; position_type get_top_left() const; position_type get_top_middle() const; position_type get_top_right() const; position_type get_bottom_left() const; position_type get_bottom_middle() const; position_type get_bottom_right() const; position_type get_left_middle() const; position_type get_right_middle() const; position_type get_center_of_mass() const; void set_center_of_mass ( const coordinate_type& x, const coordinate_type& y ); void set_center_of_mass( const position_type& pos ); void set_center_on( const physical_item_state& that ); bool is_fixed() const; void fix(); void remove_position_constraints(); void remove_position_constraint_x(); void remove_position_constraint_y(); void add_position_constraints(); void add_position_constraint_x(); void add_position_constraint_y(); bool can_move_items() const; void set_can_move_items(bool value); bool is_global() const; void set_global( bool global ); bool has_left_contact() const; contact_range get_left_contact() const; bool has_right_contact() const; contact_range get_right_contact() const; bool has_top_contact() const; contact_range get_top_contact() const; bool has_bottom_contact() const; contact_range get_bottom_contact() const; bool has_middle_contact() const; bool has_contact() const; bool has_side_contact() const; void set_left_contact( bool contact = true ); void set_left_contact( coordinate_type bottom, coordinate_type top ); void set_right_contact( bool contact = true ); void set_right_contact( coordinate_type bottom, coordinate_type top ); void set_top_contact( bool contact = true ); void set_top_contact( coordinate_type left, coordinate_type right ); void set_bottom_contact( bool contact = true ); void set_bottom_contact( coordinate_type left, coordinate_type right ); void set_middle_contact( bool contact = true ); void clear_contacts(); void set_phantom( bool phantom ); bool is_phantom() const; void set_artificial( bool a ); bool is_artificial() const; void set_weak_collisions( bool w ); bool has_weak_collisions() const; void set_size( const size_box_type& size ); void set_size( size_type width, size_type height ); void set_width( size_type width ); void set_height( size_type height ); void set_shape( const shape& s ); shape get_shape() const; void set_physical_state( const physical_item_state& s ); virtual void to_string( std::string& str ) const; private: typedef const rectangle_type& ( physical_item_state::*bounding_box_getter )() const; private: const rectangle_type& get_cached_bounding_box() const; const rectangle_type& refresh_bounding_box() const; private: /** The attributes that define the physical state. */ physical_item_attributes m_attributes; /** * \brief Tell if the item is fixed or not. * * If an item is fixed, its position, speed and acceleration won't be able * to change any more. */ bool m_fixed; mutable bounding_box_getter m_bounding_box_getter; mutable universe::rectangle_type m_bounding_box; }; // class physical_item_state } // namespace universe } // namespace bear namespace std { UNIVERSE_EXPORT std::ostream& operator<< ( std::ostream& os, const bear::universe::physical_item_state& item ); } // namespace std #endif // __UNIVERSE_PHYSICAL_ITEM_STATE_HPP__ plee-the-bear-20251226/bear-engine/core/src/universe/shape/000077500000000000000000000000001512343254000232235ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/core/src/universe/shape/code/000077500000000000000000000000001512343254000241355ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/core/src/universe/shape/code/curved_box.cpp000066400000000000000000000253111512343254000270030ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::universe::curved_box class. * \author Julien Jorge */ #include "universe/shape/curved_box.hpp" #include "universe/shape/rectangle.hpp" #include "universe/shape/shape_traits.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ bear::universe::curved_box::curved_box() : m_bottom_left(0, 0), m_size(0, 0), m_steepness(0), m_top_margin(0), m_left_control_point(0, 0), m_right_control_point(0, 0), m_line_width(10) { } // curved_box::curved_box() /*----------------------------------------------------------------------------*/ /** * \brief Instantiates a copy of this instance. */ bear::universe::curved_box* bear::universe::curved_box::clone() const { return new curved_box( *this ); } // curved_box::clone() /*----------------------------------------------------------------------------*/ /** * \brief Tells if this curved_box intersects a given rectangle. * \param that The other curved_box. */ bool bear::universe::curved_box::intersects( const rectangle& that ) const { if ( shape_traits::get_bottom( that ) > shape_traits::get_bottom( *this ) ) return check_intersection_above ( shape_traits::get_bottom_left( that ), shape_traits::get_bottom_right( that ) ); return bounding_box_intersects( that ); } // curved_box::intersects() /*----------------------------------------------------------------------------*/ /** * \brief Tells if this curved_box intersects another given curved_box. * \param that The curved_box. */ bool bear::universe::curved_box::intersects( const curved_box& that ) const { if ( shape_traits::get_bottom( that ) < shape_traits::get_bottom( *this ) ) return that.intersects( *this ); return check_intersection_above ( shape_traits::get_bottom_left( that ), shape_traits::get_bottom_right( that ) ); } // curved_box::intersects() /*----------------------------------------------------------------------------*/ /** * \brief Tells if this shape intersects another shape. * \param that The other shape. */ bool bear::universe::curved_box::intersects_strict ( const shape_base& that ) const { curved_box strict_this(*this); strict_this.m_line_width = 0; return that.intersects( strict_this ); } // curved_box::intersects_strict() /*----------------------------------------------------------------------------*/ /** * \brief Gets the steepness of the top of the shape. */ bear::universe::coordinate_type bear::universe::curved_box::get_steepness() const { return m_steepness; } // curved_box::get_steepness() /*----------------------------------------------------------------------------*/ /** * \brief Sets the steepness of the top of the shape. * \param s The new steepness of the shape. */ void bear::universe::curved_box::set_steepness( coordinate_type s ) { m_steepness = s; } // curved_box::set_steepness() /*----------------------------------------------------------------------------*/ /** * \brief Gets the margin above the shape. */ bear::universe::coordinate_type bear::universe::curved_box::get_margin() const { return m_top_margin; } // curved_box::get_margin() /*----------------------------------------------------------------------------*/ /** * \brief Sets the margin above the shape. * \param s The new margin. */ void bear::universe::curved_box::set_margin( coordinate_type s ) { m_top_margin = s; } // curved_box::set_margin() /*----------------------------------------------------------------------------*/ /** * \brief Gets the control point for the left side of the shape. */ bear::universe::vector_type bear::universe::curved_box::get_left_control_point() const { return m_left_control_point; } // curved_box::get_left_control_point() /*----------------------------------------------------------------------------*/ /** * \brief Sets the control point for the left side of the shape. * \param p The new control point. */ void bear::universe::curved_box::set_left_control_point( const vector_type& p ) { m_left_control_point = p; } // curved_box::set_left_control_point() /*----------------------------------------------------------------------------*/ /** * \brief Gets the control point for the right side of the shape. */ bear::universe::vector_type bear::universe::curved_box::get_right_control_point() const { return m_right_control_point; } // curved_box::get_right_control_point() /*----------------------------------------------------------------------------*/ /** * \brief Sets the control point for the right side of the shape. * \param p The new control point. */ void bear::universe::curved_box::set_right_control_point( const vector_type& p ) { m_right_control_point = p; } // curved_box::set_right_control_point() /*----------------------------------------------------------------------------*/ /** * \brief Returns a description of the top of the shape. */ bear::universe::curved_box::curve_type bear::universe::curved_box::get_curve() const { position_type top_left_anchor( 0, get_height() - m_top_margin ); position_type top_right_anchor( get_width(), get_height() - m_top_margin ); if ( m_steepness > 0 ) top_left_anchor.y -= m_steepness; else top_right_anchor.y += m_steepness; const position_type left_control_point ( m_left_control_point + top_left_anchor ); const position_type right_control_point ( m_right_control_point + top_right_anchor ); curve_type result; result.push_back ( curve_type::control_point ( top_left_anchor, top_left_anchor, left_control_point ) ); result.push_back ( curve_type::control_point ( top_right_anchor, right_control_point, top_right_anchor ) ); return result; } // curved_box::get_curve() /*----------------------------------------------------------------------------*/ /** * \brief Get the Y-coordinate on the top according to a given X-coordinate. * \param x The considered X-coordinate. */ bear::universe::coordinate_type bear::universe::curved_box::get_y_at_x( coordinate_type x ) const { coordinate_type result( shape_traits::get_bottom( *this ) ); const curve_type c( get_curve() ); const std::vector p ( c.get_section( c.begin() ).get_point_at_x ( x - shape_traits::get_left( *this ) ) ); if ( p.size() > 0 ) result += p[0].get_position().y; return result; } // curved_box::get_y_at_x() /*----------------------------------------------------------------------------*/ /** * \brief Gets the coordinate of the bottom edge. */ bear::universe::coordinate_type bear::universe::curved_box::do_get_bottom() const { return m_bottom_left.y; } // curved_box::do_get_bottom() /*----------------------------------------------------------------------------*/ /** * \brief Moves the shape such that its bottom edge is at a given position. * \param p The position. */ void bear::universe::curved_box::do_set_bottom( coordinate_type p ) { m_bottom_left.y = p; } // curved_box::do_set_bottom() /*----------------------------------------------------------------------------*/ /** * \brief Gets the coordinate of the left edge. */ bear::universe::coordinate_type bear::universe::curved_box::do_get_left() const { return m_bottom_left.x; } // curved_box::do_get_left() /*----------------------------------------------------------------------------*/ /** * \brief Moves the shape such that its left edge is at a given position. * \param p The position. */ void bear::universe::curved_box::do_set_left( coordinate_type p ) { m_bottom_left.x = p; } // curved_box::do_set_left() /*----------------------------------------------------------------------------*/ /** * \brief Gets the width of the shape. */ bear::universe::size_type bear::universe::curved_box::do_get_width() const { return m_size.x; } // curved_box::do_get_width() /*----------------------------------------------------------------------------*/ /** * \brief Resize the shape to a given width without changing its bottom left * position. * \param s The new width. */ void bear::universe::curved_box::do_set_width( size_type s ) { m_size.x = s; } // curved_box::do_set_width() /*----------------------------------------------------------------------------*/ /** * \brief Gets the height of the shape. */ bear::universe::size_type bear::universe::curved_box::do_get_height() const { return m_size.y + m_top_margin; } // curved_box::do_get_height() /*----------------------------------------------------------------------------*/ /** * \brief Resize the shape to a given height without changing its bottom left * position. * \param s The new height. */ void bear::universe::curved_box::do_set_height( size_type s ) { m_size.y = std::max( size_type(0), s - m_top_margin ); } // curved_box::do_set_height() /*----------------------------------------------------------------------------*/ /** * \brief Tells if this shape intersects another shape. * \param that The other shape. */ bool bear::universe::curved_box::do_intersects( const shape_base& that ) const { return that.intersects( *this ); } // curved_box::do_intersects() /*----------------------------------------------------------------------------*/ /** * \brief Tells if there is an intersection regarding the bottom edge of another * shape. * \param bottom_left_position The bottom left position of the other shape. * \param bottom_right_position The bottom right position of the other shape. */ bool bear::universe::curved_box::check_intersection_above ( const position_type& bottom_left_position, const position_type& bottom_right_position ) const { // Check the horizontal center of the other const position_type middle_position ( ( bottom_left_position + bottom_right_position ) / 2 ); coordinate_type x( middle_position.x ); // The horizontal center of the other is on our left. We apply the test as if // it was on our left edge. if ( middle_position.x < shape_traits::get_left( *this ) ) x = shape_traits::get_left( *this ); // The horizontal center of the other is on our left. We apply the test as if // it was on our right edge. if ( middle_position.x > shape_traits::get_right( *this ) ) x = shape_traits::get_right( *this ); // We check if the vertical position of the other is above or below the // curve. In the latter case, there is an intersection. return get_y_at_x( x ) + m_line_width > middle_position.y; } // curved_box::check_intersection_above() plee-the-bear-20251226/bear-engine/core/src/universe/shape/code/rectangle.cpp000066400000000000000000000106611512343254000266110ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::universe::rectangle class. * \author Julien Jorge */ #include "universe/shape/rectangle.hpp" #include "universe/shape/curved_box.hpp" #include "universe/shape/shape_traits.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ bear::universe::rectangle::rectangle() : m_bottom_left(0, 0), m_size(0, 0) { } // rectangle::rectangle() /*----------------------------------------------------------------------------*/ /** * \brief Constructor from a universe::rectangle_type. */ bear::universe::rectangle::rectangle( const rectangle_type& that ) : m_bottom_left( that.bottom_left() ), m_size( that.size() ) { } // rectangle::rectangle() /*----------------------------------------------------------------------------*/ /** * \brief Instantiates a copy of this instance. */ bear::universe::rectangle* bear::universe::rectangle::clone() const { return new rectangle( *this ); } // rectangle::clone() /*----------------------------------------------------------------------------*/ /** * \brief Tells if this rectangle intersects another given rectangle. * \param that The other rectangle. */ bool bear::universe::rectangle::intersects( const rectangle& that ) const { return bounding_box_intersects( that ); } // rectangle::intersects() /*----------------------------------------------------------------------------*/ /** * \brief Tells if this rectangle intersects a curved_box. * \param that The curved_box. */ bool bear::universe::rectangle::intersects( const curved_box& that ) const { return that.intersects( *this ); } // rectangle::intersects() /*----------------------------------------------------------------------------*/ /** * \brief Gets the coordinate of the bottom edge. */ bear::universe::coordinate_type bear::universe::rectangle::do_get_bottom() const { return m_bottom_left.y; } // rectangle::do_get_bottom() /*----------------------------------------------------------------------------*/ /** * \brief Moves the shape such that its bottom edge is at a given position. * \param p The position. */ void bear::universe::rectangle::do_set_bottom( coordinate_type p ) { m_bottom_left.y = p; } // rectangle::do_set_bottom() /*----------------------------------------------------------------------------*/ /** * \brief Gets the coordinate of the left edge. */ bear::universe::coordinate_type bear::universe::rectangle::do_get_left() const { return m_bottom_left.x; } // rectangle::do_get_left() /*----------------------------------------------------------------------------*/ /** * \brief Moves the shape such that its left edge is at a given position. * \param p The position. */ void bear::universe::rectangle::do_set_left( coordinate_type p ) { m_bottom_left.x = p; } // rectangle::do_set_left() /*----------------------------------------------------------------------------*/ /** * \brief Gets the width of the shape. */ bear::universe::size_type bear::universe::rectangle::do_get_width() const { return m_size.x; } // rectangle::do_get_width() /*----------------------------------------------------------------------------*/ /** * \brief Resize the shape to a given width without changing its bottom left * position. * \param s The new width. */ void bear::universe::rectangle::do_set_width( size_type s ) { m_size.x = s; } // rectangle::do_set_width() /*----------------------------------------------------------------------------*/ /** * \brief Gets the height of the shape. */ bear::universe::size_type bear::universe::rectangle::do_get_height() const { return m_size.y; } // rectangle::do_get_height() /*----------------------------------------------------------------------------*/ /** * \brief Resize the shape to a given height without changing its bottom left * position. * \param s The new height. */ void bear::universe::rectangle::do_set_height( size_type s ) { m_size.y = s; } // rectangle::do_set_height() /*----------------------------------------------------------------------------*/ /** * \brief Tells if this shape intersects another shape. */ bool bear::universe::rectangle::do_intersects( const shape_base& that ) const { return that.intersects( *this ); } // rectangle::do_intersects() plee-the-bear-20251226/bear-engine/core/src/universe/shape/code/shape.cpp000066400000000000000000000125521512343254000257460ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::universe::shape class. * \author Julien Jorge */ #include "universe/shape/shape.hpp" #include "universe/shape/shape_base.hpp" namespace bear { namespace universe { class dummy_shape: public shape_base { dummy_shape* clone() const { return const_cast( this ); } bool intersects( const rectangle& that ) const { return false; } bool intersects( const curved_box& that ) const { return false; } coordinate_type do_get_bottom() const { return 0; } void do_set_bottom( coordinate_type p ) {} coordinate_type do_get_left() const { return 0; } void do_set_left( coordinate_type p ) {} size_type do_get_width() const { return 0; } void do_set_width( size_type s ) {} size_type do_get_height() const { return 0; } void do_set_height( size_type s ) {} bool do_intersects( const shape_base& that ) const { return false; } }; static dummy_shape g_dummy_shape; } } /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ bear::universe::shape::shape() : m_impl( &g_dummy_shape ) { } // shape::shape() /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param s The underlying shape. */ bear::universe::shape::shape( const shape_base& s ) : m_impl( s.clone() ) { } // shape::shape() /*----------------------------------------------------------------------------*/ /** * \brief Copy constructor. * \param that The instance to copy. */ bear::universe::shape::shape( const shape& that ) : m_impl( that.clone_impl() ) { } // shape::shape() /*----------------------------------------------------------------------------*/ /** * \brief Destructor. */ bear::universe::shape::~shape() { if ( m_impl != &g_dummy_shape ) delete m_impl; } // shape::shape() /*----------------------------------------------------------------------------*/ /** * \brief Assigns a shape to this one. * \param that The instance to copy. */ bear::universe::shape& bear::universe::shape::operator=( shape that ) { std::swap( m_impl, that.m_impl ); return *this; } // shape::operator=() /*----------------------------------------------------------------------------*/ /** * \brief Tells if this shape has an intersection with another given shape. * \param that The other shape. */ bool bear::universe::shape::intersects( const shape& that ) const { return m_impl->intersects( *that.m_impl ); } // shape::intersects() /*----------------------------------------------------------------------------*/ /** * \brief Gets the width of the shape. */ bear::universe::size_type bear::universe::shape::get_width() const { return m_impl->get_width(); } // shape::get_width() /*----------------------------------------------------------------------------*/ /** * \brief Sets the width of the shape. * \param width The width of the shape. */ void bear::universe::shape::set_width( size_type width ) { m_impl->set_width( width ); } // shape::set_width() /*----------------------------------------------------------------------------*/ /** * \brief Gets the height of the shape. */ bear::universe::size_type bear::universe::shape::get_height() const { return m_impl->get_height(); } // shape::get_height() /*----------------------------------------------------------------------------*/ /** * \brief Set the height of the shape. * \param height The height of the shape. */ void bear::universe::shape::set_height( size_type height ) { m_impl->set_height( height ); } // shape::set_height() /*----------------------------------------------------------------------------*/ /** * \brief Gets the highest Y-coordinate covered by the bounding box of this * shape. */ bear::universe::coordinate_type bear::universe::shape::get_bottom() const { return m_impl->get_bottom(); } // shape::get_bottom() /*----------------------------------------------------------------------------*/ /** * \brief Moves the shape such that its bottom is at a given coordinate. * \param pos The new position. */ void bear::universe::shape::set_bottom( coordinate_type pos ) { m_impl->set_bottom( pos ); } // shape::set_bottom() /*----------------------------------------------------------------------------*/ /** * \brief Gets the lowest X-coordinate covered by the bounding box of this * shape. */ bear::universe::coordinate_type bear::universe::shape::get_left() const { return m_impl->get_left(); } // shape::get_left() /*----------------------------------------------------------------------------*/ /** * \brief Moves the shape such that its left is at a given coordinate. * \param pos The new position. */ void bear::universe::shape::set_left( coordinate_type pos ) { m_impl->set_left( pos ); } // shape::set_left() /*----------------------------------------------------------------------------*/ /** * \brief Instantiates a copy of the implementation of this shape. The caller * has the responsability to delete the returned instance. */ bear::universe::shape_base* bear::universe::shape::clone_impl() const { return m_impl->clone(); } // shape::clone_impl() plee-the-bear-20251226/bear-engine/core/src/universe/shape/code/shape_base.cpp000066400000000000000000000100531512343254000267320ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::universe::shape_base class. * \author Julien Jorge */ #include "universe/shape/shape_base.hpp" #include "universe/shape/shape_traits.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Destructor. */ bear::universe::shape_base::~shape_base() { // nothing to do } // shape_base::shape_base() /*----------------------------------------------------------------------------*/ /** * \brief Tells if this shape has an intersection with another given shape. * \param that The other shape. */ bool bear::universe::shape_base::intersects( const shape_base& that ) const { return do_intersects( that ); } // shape_base::intersects() /*----------------------------------------------------------------------------*/ /** * \brief Tells if the bounding box of this shape has an intersection with the * bounding box of another given shape. * \param that The other shape. */ bool bear::universe::shape_base::bounding_box_intersects ( const shape_base& that ) const { const rectangle_type this_bounding_box ( shape_traits::get_bounding_box( *this ) ); const rectangle_type that_bounding_box ( shape_traits::get_bounding_box( that ) ); if ( this_bounding_box.intersects( that_bounding_box ) ) { const rectangle_type inter = this_bounding_box.intersection( that_bounding_box ); return (inter.width() != 0) && (inter.height() != 0); } else return false; } // shape_base::bounding_box_intersects() /*----------------------------------------------------------------------------*/ /** * \brief Gets the width of the shape. */ bear::universe::size_type bear::universe::shape_base::get_width() const { return do_get_width(); } // shape_base::get_width() /*----------------------------------------------------------------------------*/ /** * \brief Sets the width of the shape. * \param width The width of the shape. */ void bear::universe::shape_base::set_width( size_type width ) { do_set_width( width ); } // shape_base::set_width() /*----------------------------------------------------------------------------*/ /** * \brief Gets the height of the shape. */ bear::universe::size_type bear::universe::shape_base::get_height() const { return do_get_height(); } // shape_base::get_height() /*----------------------------------------------------------------------------*/ /** * \brief Set the height of the shape. * \param height The height of the shape. */ void bear::universe::shape_base::set_height( size_type height ) { do_set_height( height ); } // shape_base::set_height() /*----------------------------------------------------------------------------*/ /** * \brief Gets the highest Y-coordinate covered by the bounding box of this * shape. */ bear::universe::coordinate_type bear::universe::shape_base::get_bottom() const { return do_get_bottom(); } // shape_base::get_bottom() /*----------------------------------------------------------------------------*/ /** * \brief Moves the shape such that its bottom is at a given coordinate. * \param pos The new position. */ void bear::universe::shape_base::set_bottom( coordinate_type pos ) { do_set_bottom( pos ); } // shape_base::set_bottom() /*----------------------------------------------------------------------------*/ /** * \brief Gets the lowest X-coordinate covered by the bounding box of this * shape. */ bear::universe::coordinate_type bear::universe::shape_base::get_left() const { return do_get_left(); } // shape_base::get_left() /*----------------------------------------------------------------------------*/ /** * \brief Moves the shape such that its left is at a given coordinate. * \param pos The new position. */ void bear::universe::shape_base::set_left( coordinate_type pos ) { do_set_left( pos ); } // shape_base::set_left() plee-the-bear-20251226/bear-engine/core/src/universe/shape/curved_box.hpp000066400000000000000000000056111512343254000260770ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A rectangle with a curved top. * \author Julien Jorge */ #ifndef __UNIVERSE_CURVED_BOX_HPP__ #define __UNIVERSE_CURVED_BOX_HPP__ #include "universe/shape/shape_base.hpp" #include namespace bear { namespace universe { class rectangle; /** * \brief A rectangle with a curved top. * \author Julien Jorge */ class UNIVERSE_EXPORT curved_box: public shape_base { public: /** \brief The type of the curve describing the top of the shape. */ typedef claw::math::curve curve_type; public: curved_box(); virtual curved_box* clone() const; virtual bool intersects( const rectangle& that ) const; virtual bool intersects( const curved_box& that ) const; bool intersects_strict( const shape_base& that ) const; coordinate_type get_steepness() const; void set_steepness( coordinate_type s ); coordinate_type get_margin() const; void set_margin( coordinate_type s ); vector_type get_left_control_point() const; void set_left_control_point( const vector_type& p ); vector_type get_right_control_point() const; void set_right_control_point( const vector_type& p ); curve_type get_curve() const; coordinate_type get_y_at_x( coordinate_type x ) const; private: virtual coordinate_type do_get_bottom() const; virtual void do_set_bottom( coordinate_type p ); virtual coordinate_type do_get_left() const; virtual void do_set_left( coordinate_type p ); virtual size_type do_get_width() const; virtual void do_set_width( size_type s ); virtual size_type do_get_height() const; virtual void do_set_height( size_type s ); virtual bool do_intersects( const shape_base& that ) const; bool check_intersection_above ( const position_type& bottom_left_position, const position_type& bottom_right_position ) const; private: /** \brief The reference position. */ position_type m_bottom_left; /** \brief The size of the rectangle. */ size_box_type m_size; /** \brief The steepness of the top. */ coordinate_type m_steepness; /** \brief The margin of the top. */ coordinate_type m_top_margin; /** \brief The vector of left control point. */ vector_type m_left_control_point; /** \brief The vector of right control point. */ vector_type m_right_control_point; /** \brief The width of the curve, used to check the collisions. */ coordinate_type m_line_width; }; // class curved_box } // namespace universe } // namespace bear #endif // __UNIVERSE_CURVED_BOX_HPP__ plee-the-bear-20251226/bear-engine/core/src/universe/shape/impl/000077500000000000000000000000001512343254000241645ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/core/src/universe/shape/impl/shape_traits.tpp000066400000000000000000000470451512343254000274110ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::universe::shape_traits class. * \author Julien Jorge */ /*----------------------------------------------------------------------------*/ /** * \brief Gets the size of the shape. * \param s The shape. */ template bear::universe::size_box_type bear::universe::shape_traits::get_size( const shape_type& s ) { return size_box_type( get_width(s), get_height(s) ); } // shape_traits::get_size() /*----------------------------------------------------------------------------*/ /** * \brief Set the size of the object. * \param s The shape. * \param size The new size. */ template void bear::universe::shape_traits::set_size ( shape_type& s, const size_box_type& size ) { set_width( s, size.x ); set_height( s, size.y ); } // shape_traits::set_size() /*----------------------------------------------------------------------------*/ /** * \brief Gets the width of the shape. * \param s The shape. */ template bear::universe::size_type bear::universe::shape_traits::get_width( const shape_type& s ) { return s.get_width(); } // shape_traits::get_width() /*----------------------------------------------------------------------------*/ /** * \brief Sets the width of the shape. * \param s The shape. * \param width The width of the shape. */ template void bear::universe::shape_traits::set_width ( shape_type& s, size_type width ) { s.set_width( width ); } // shape_traits::set_width() /*----------------------------------------------------------------------------*/ /** * \brief Gets the height of the shape. * \param s The shape. */ template bear::universe::size_type bear::universe::shape_traits::get_height( const shape_type& s ) { return s.get_height(); } // shape_traits::get_height() /*----------------------------------------------------------------------------*/ /** * \brief Set the height of the shape. * \param s The shape. * \param height The height of the shape. */ template void bear::universe::shape_traits::set_height ( shape_type& s, size_type height ) { s.set_height( height ); } // shape_traits::set_height() /*----------------------------------------------------------------------------*/ /** * \brief Sets the bouding box of this shape_traits. * \param s The shape. * \param r the new bounding box of the shape. */ template void bear::universe::shape_traits::set_bounding_box ( shape_type& s, const rectangle_type& r ) { set_bottom_left( s, r.bottom_left() ); set_size( s, r.size() ); } // shape_traits::set_bounding_box() /*----------------------------------------------------------------------------*/ /** * \brief Gets the bouding box of this shape_traits. * \param s The shape. */ template bear::universe::rectangle_type bear::universe::shape_traits::get_bounding_box( const shape_type& s ) { return rectangle_type( get_bottom_left(s), get_bottom_left(s) + get_size(s) ); } // shape_traits::get_bounding_box() /*----------------------------------------------------------------------------*/ /** * \brief Moves the shape such that its top is at a given coordinate. * \param s The shape. * \param pos The new position. */ template void bear::universe::shape_traits::set_top ( shape_type& s, coordinate_type pos ) { set_bottom( s, pos - get_height(s) ); } // shape_traits::set_top() /*----------------------------------------------------------------------------*/ /** * \brief Moves the shape such that its bottom is at a given coordinate. * \param s The shape. * \param pos The new position. */ template void bear::universe::shape_traits::set_bottom ( shape_type& s, coordinate_type pos ) { s.set_bottom( pos ); } // shape_traits::set_bottom() /*----------------------------------------------------------------------------*/ /** * \brief Moves the shape such that its left is at a given coordinate. * \param s The shape. * \param pos The new position. */ template void bear::universe::shape_traits::set_left ( shape_type& s, coordinate_type pos ) { s.set_left( pos ); } // shape_traits::set_left() /*----------------------------------------------------------------------------*/ /** * \brief Moves the shape such that its right is at a given coordinate. * \param s The shape. * \param pos The new position. */ template void bear::universe::shape_traits::set_right ( shape_type& s, coordinate_type pos ) { set_left( s, pos - get_width(s) ); } // shape_traits::set_right() /*----------------------------------------------------------------------------*/ /** * \brief Moves the shape such that its horizontal center is at a given * coordinate. * \param s The shape. * \param pos The new position. */ template void bear::universe::shape_traits::set_horizontal_middle ( shape_type& s, coordinate_type pos ) { set_left( s, pos - get_width(s) / 2 ); } // shape_traits::set_horizontal_middle() /*----------------------------------------------------------------------------*/ /** * \brief Moves the shape such that its vertical middle is at a given * coordinate. * \param s The shape. * \param pos The new position. */ template void bear::universe::shape_traits::set_vertical_middle ( shape_type& s, coordinate_type pos ) { set_bottom( s, pos - get_height(s) / 2 ); } // shape_traits::set_vertical_middle() /*----------------------------------------------------------------------------*/ /** * \brief Moves the shape such that its top left corner is at a given position. * \param s The shape. * \param pos The new position. */ template void bear::universe::shape_traits::set_top_left ( shape_type& s, const position_type& pos ) { set_left( s, pos.x ); set_top( s, pos.y ); } // shape_traits::set_top_left() /*----------------------------------------------------------------------------*/ /** * \brief Moves the shape such that the middle of its top edge is at a given * position. * \param s The shape. * \param pos The new position. */ template void bear::universe::shape_traits::set_top_middle ( shape_type& s, const position_type& pos ) { set_horizontal_middle( s, pos.x ); set_top( s, pos.y ); } // shape_traits::set_top_middle() /*----------------------------------------------------------------------------*/ /** * \brief Moves the shape such that its top right corner is at a given position. * \param s The shape. * \param pos The new position. */ template void bear::universe::shape_traits::set_top_right ( shape_type& s, const position_type& pos ) { set_right( s, pos.x ); set_top( s, pos.y ); } // shape_traits::set_top_right() /*----------------------------------------------------------------------------*/ /** * \brief Moves the shape such that its bottom left corner is at a given * position. * \param s The shape. * \param pos The new position. */ template void bear::universe::shape_traits::set_bottom_left ( shape_type& s, const position_type& pos ) { set_left( s, pos.x ); set_bottom( s, pos.y ); } // shape_traits::set_bottom_left() /*----------------------------------------------------------------------------*/ /** * \brief Moves the shape such that the middle of its bottom is at a given * position. * \param s The shape. * \param pos The new position. */ template void bear::universe::shape_traits::set_bottom_middle ( shape_type& s, const position_type& pos ) { set_horizontal_middle( s, pos.x ); set_bottom( s, pos.y ); } // shape_traits::set_bottom_middle() /*----------------------------------------------------------------------------*/ /** * \brief Moves the shape such that its bottom right corner is at a given * position. * \param s The shape. * \param pos The new position. */ template void bear::universe::shape_traits::set_bottom_right ( shape_type& s, const position_type& pos ) { set_right( s, pos.x ); set_bottom( s, pos.y ); } // shape_traits::set_bottom_right() /*----------------------------------------------------------------------------*/ /** * \brief Moves the shape such that the middle of its left edge is at a given * position. * \param s The shape. * \param pos The new position. */ template void bear::universe::shape_traits::set_left_middle ( shape_type& s, const position_type& pos ) { set_left( s, pos.x ); set_vertical_middle( s, pos.y ); } // shape_traits::set_left_middle() /*----------------------------------------------------------------------------*/ /** * \brief Moves the shape such that the middle of its right edge is at a given * position. * \param s The shape. * \param pos The new position. */ template void bear::universe::shape_traits::set_right_middle ( shape_type& s, const position_type& pos ) { set_right( s, pos.x ); set_vertical_middle( s, pos.y ); } // shape_traits::set_right_middle() /*----------------------------------------------------------------------------*/ /** * \brief Moves the shape such that its top left corner is at a given position. * \param s The shape. * \param x The new x-position. * \param y The new y-position. */ template void bear::universe::shape_traits::set_top_left ( shape_type& s, coordinate_type x, coordinate_type y ) { set_left( s, x ); set_top( s, y ); } // shape_traits::set_top_left() /*----------------------------------------------------------------------------*/ /** * \brief Moves the shape such that the middle of its top edge is at a given * position. * \param s The shape. * \param x The new x-position. * \param y The new y-position. */ template void bear::universe::shape_traits::set_top_middle ( shape_type& s, coordinate_type x, coordinate_type y ) { set_horizontal_middle(s, x); set_top(s, y); } // shape_traits::set_top_middle() /*----------------------------------------------------------------------------*/ /** * \brief Moves the shape such that its top right corner is at a given position. * \param s The shape. * \param x The new x-position. * \param y The new y-position. */ template void bear::universe::shape_traits::set_top_right ( shape_type& s, coordinate_type x, coordinate_type y ) { set_right(s, x); set_top(s, y); } // shape_traits::set_top_right() /*----------------------------------------------------------------------------*/ /** * \brief Moves the shape such that its bottom left corner is at a given * position. * \param s The shape. * \param x The new x-position. * \param y The new y-position. */ template void bear::universe::shape_traits::set_bottom_left ( shape_type& s, coordinate_type x, coordinate_type y ) { set_left(s, x); set_bottom(s, y); } // shape_traits::set_bottom_left() /*----------------------------------------------------------------------------*/ /** * \brief Moves the shape such that the middle of its bottom is at a given * position. * \param s The shape. * \param x The new x-position. * \param y The new y-position. */ template void bear::universe::shape_traits::set_bottom_middle ( shape_type& s, coordinate_type x, coordinate_type y ) { set_horizontal_middle(s, x); set_bottom(s, y); } // shape_traits::set_bottom_middle() /*----------------------------------------------------------------------------*/ /** * \brief Moves the shape such that its bottom right corner is at a given * position. * \param s The shape. * \param x The new x-position. * \param y The new y-position. */ template void bear::universe::shape_traits::set_bottom_right ( shape_type& s, coordinate_type x, coordinate_type y ) { set_right(s, x); set_bottom(s, y); } // shape_traits::set_bottom_right() /*----------------------------------------------------------------------------*/ /** * \brief Moves the shape such that the middle of its left edge is at a given * position. * \param s The shape. * \param x The new x-position. * \param y The new y-position. */ template void bear::universe::shape_traits::set_left_middle ( shape_type& s, coordinate_type x, coordinate_type y ) { set_left(s, x); set_vertical_middle(s, y); } // shape_traits::set_left_middle() /*----------------------------------------------------------------------------*/ /** * \brief Moves the shape such that the middle of its right edge is at a given * position. * \param s The shape. * \param x The new x-position. * \param y The new y-position. */ template void bear::universe::shape_traits::set_right_middle ( shape_type& s, coordinate_type x, coordinate_type y ) { set_right(s, x); set_vertical_middle(s, y); } // shape_traits::set_right_middle() /*----------------------------------------------------------------------------*/ /** * \brief Gets the lowest X-coordinate covered by the bounding box of this * shape_traits. * \param s The shape. */ template bear::universe::coordinate_type bear::universe::shape_traits::get_left( const shape_type& s ) { return s.get_left(); } // shape_traits::get_left() /*----------------------------------------------------------------------------*/ /** * \brief Gets the lowest Y-coordinate covered by the bounding box of this * shape_traits. * \param s The shape. */ template bear::universe::coordinate_type bear::universe::shape_traits::get_top( const shape_type& s ) { return get_bottom(s) + get_height(s); } // shape_traits::get_top() /*----------------------------------------------------------------------------*/ /** * \brief Gets the highest X-coordinate covered by the bounding box of this * shape_traits. * \param s The shape. */ template bear::universe::coordinate_type bear::universe::shape_traits::get_right( const shape_type& s ) { return get_left(s) + get_width(s); } // shape_traits::get_right() /*----------------------------------------------------------------------------*/ /** * \brief Gets the highest Y-coordinate covered by the bounding box of this * shape_traits. * \param s The shape. */ template bear::universe::coordinate_type bear::universe::shape_traits::get_bottom( const shape_type& s ) { return s.get_bottom(); } // shape_traits::get_bottom() /*----------------------------------------------------------------------------*/ /** * \brief Gets the x-coordinate of the center of this shape_traits. * \param s The shape. */ template bear::universe::coordinate_type bear::universe::shape_traits::get_horizontal_middle ( const shape_type& s ) { return get_left(s) + get_width(s) / 2; } // shape_traits::get_horizontal_middle() /*----------------------------------------------------------------------------*/ /** * \brief Gets the Y-coordinate of the center of this shape_traits. * \param s The shape. */ template bear::universe::coordinate_type bear::universe::shape_traits::get_vertical_middle ( const shape_type& s ) { return get_bottom(s) + get_height(s) / 2; } // shape_traits::get_vertical_middle() /*----------------------------------------------------------------------------*/ /** * \brief Gets the position of the top left corner of the shape. * \param s The shape. */ template bear::universe::position_type bear::universe::shape_traits::get_top_left( const shape_type& s ) { return position_type( get_left(s), get_top(s) ); } // shape_traits::get_top_left() /*----------------------------------------------------------------------------*/ /** * \brief Gets the position of the middle of the top edge of the shape. * \param s The shape. */ template bear::universe::position_type bear::universe::shape_traits::get_top_middle( const shape_type& s ) { return position_type( get_center(s).x, get_top(s) ); } // shape_traits::get_top_middle() /*----------------------------------------------------------------------------*/ /** * \brief Gets the position of the top right corner of the shape. * \param s The shape. */ template bear::universe::position_type bear::universe::shape_traits::get_top_right( const shape_type& s ) { return position_type( get_right(s), get_top(s) ); } // shape_traits::get_top_right() /*----------------------------------------------------------------------------*/ /** * \brief Gets the position of the bottom left corner of the shape. * \param s The shape. */ template bear::universe::position_type bear::universe::shape_traits::get_bottom_left( const shape_type& s ) { return position_type( get_left(s), get_bottom(s) ); } // shape_traits::get_bottom_left() /*----------------------------------------------------------------------------*/ /** * \brief Gets the position of the middle of the bottom edge of the shape. * \param s The shape. */ template bear::universe::position_type bear::universe::shape_traits::get_bottom_middle( const shape_type& s ) { return position_type( get_center(s).x, get_bottom(s) ); } // shape_traits::get_bottom_middle() /*----------------------------------------------------------------------------*/ /** * \brief Gets the position of the bottom right corner of the shape. * \param s The shape. */ template bear::universe::position_type bear::universe::shape_traits::get_bottom_right( const shape_type& s ) { return position_type( get_right(s), get_bottom(s) ); } // shape_traits::get_bottom_right() /*----------------------------------------------------------------------------*/ /** * \brief Gets the position of the middle of the left edge of the shape. * \param s The shape. */ template bear::universe::position_type bear::universe::shape_traits::get_left_middle( const shape_type& s ) { return position_type( get_left(s), get_center(s).y ); } // shape_traits::get_left_middle() /*----------------------------------------------------------------------------*/ /** * \brief Gets the position of the middle of the right edge of the shape. * \param s The shape. */ template bear::universe::position_type bear::universe::shape_traits::get_right_middle( const shape_type& s ) { return position_type( get_right(s), get_center(s).y ); } // shape_traits::get_right_middle() /*----------------------------------------------------------------------------*/ /** * \brief Gets the position, in the world, of the center of mass. * \param s The shape. */ template bear::universe::position_type bear::universe::shape_traits::get_center( const shape_type& s ) { return get_bottom_left(s) + get_size(s) / 2; } // shape_traits::get_center() /*----------------------------------------------------------------------------*/ /** * \brief Moves the shape such that its center is at a given position. * \param s The shape. * \param pos The new center of mass. */ template void bear::universe::shape_traits::set_center ( shape_type& s, const position_type& pos ) { set_bottom_left( s, pos - get_size(s) / 2 ); } // shape_traits::set_center() /*----------------------------------------------------------------------------*/ /** * \brief Moves the shape such that its center is at a given position. * \param s The shape. * \param x The new x_coordinate of the center of mass. * \param y The new y-coordinate of the center of mass. */ template void bear::universe::shape_traits::set_center ( shape_type& s, coordinate_type x, coordinate_type y ) { set_center( s, position_type(x, y) ); } // shape_traits::set_center() plee-the-bear-20251226/bear-engine/core/src/universe/shape/rectangle.hpp000066400000000000000000000031241512343254000257000ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A rectangular shape. * \author Julien Jorge */ #ifndef __UNIVERSE_RECTANGLE_HPP__ #define __UNIVERSE_RECTANGLE_HPP__ #include "universe/shape/shape_base.hpp" namespace bear { namespace universe { class curved_box; /** * \brief A rectangular shape. * \author Julien Jorge */ class UNIVERSE_EXPORT rectangle: public shape_base { public: rectangle(); explicit rectangle( const rectangle_type& that ); virtual rectangle* clone() const; virtual bool intersects( const rectangle& that ) const; virtual bool intersects( const curved_box& that ) const; private: virtual coordinate_type do_get_bottom() const; virtual void do_set_bottom( coordinate_type p ); virtual coordinate_type do_get_left() const; virtual void do_set_left( coordinate_type p ); virtual size_type do_get_width() const; virtual void do_set_width( size_type s ); virtual size_type do_get_height() const; virtual void do_set_height( size_type s ); virtual bool do_intersects( const shape_base& that ) const; private: /** \brief The reference position. */ position_type m_bottom_left; /** \brief The size of the rectangle. */ size_box_type m_size; }; // class rectangle } // namespace universe } // namespace bear #endif // __UNIVERSE_RECTANGLE_HPP__ plee-the-bear-20251226/bear-engine/core/src/universe/shape/shape.hpp000066400000000000000000000025471512343254000250440ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A proxy for the various shapes. * \author Julien Jorge */ #ifndef __UNIVERSE_SHAPE_HPP__ #define __UNIVERSE_SHAPE_HPP__ #include "universe/types.hpp" #include "universe/class_export.hpp" namespace bear { namespace universe { class shape_base; /** * \brief A proxy for the various shapes. * \author Julien Jorge */ class UNIVERSE_EXPORT shape { public: shape(); shape( const shape_base& s ); shape( const shape& that ); ~shape(); shape& operator=( shape that ); bool intersects( const shape& that ) const; size_type get_width() const; void set_width( size_type width ); size_type get_height() const; void set_height( size_type height ); coordinate_type get_bottom() const; void set_bottom( coordinate_type pos ); coordinate_type get_left() const; void set_left( coordinate_type pos ); shape_base* clone_impl() const; private: /** \brief The real shape behind this object. */ shape_base* m_impl; }; // class shape } // namespace universe } // namespace bear #endif // __UNIVERSE_SHAPE_HPP__ plee-the-bear-20251226/bear-engine/core/src/universe/shape/shape_base.hpp000066400000000000000000000037441512343254000260360ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief The common interface for all the shapes of the physical items. * \author Julien Jorge */ #ifndef __UNIVERSE_SHAPE_BASE_HPP__ #define __UNIVERSE_SHAPE_BASE_HPP__ #include "universe/types.hpp" #include "universe/class_export.hpp" namespace bear { namespace universe { class rectangle; class curved_box; /** * \brief The common interface for all the shapes of the physical items. * \author Julien Jorge */ class UNIVERSE_EXPORT shape_base { public: virtual ~shape_base(); virtual shape_base* clone() const = 0; bool intersects( const shape_base& that ) const; bool bounding_box_intersects( const shape_base& that ) const; size_type get_width() const; void set_width( size_type width ); size_type get_height() const; void set_height( size_type height ); coordinate_type get_bottom() const; void set_bottom( coordinate_type pos ); coordinate_type get_left() const; void set_left( coordinate_type pos ); virtual bool intersects( const rectangle& that ) const = 0; virtual bool intersects( const curved_box& that ) const = 0; private: virtual coordinate_type do_get_bottom() const = 0; virtual void do_set_bottom( coordinate_type p ) = 0; virtual coordinate_type do_get_left() const = 0; virtual void do_set_left( coordinate_type p ) = 0; virtual size_type do_get_width() const = 0; virtual void do_set_width( size_type s ) = 0; virtual size_type do_get_height() const = 0; virtual void do_set_height( size_type s ) = 0; virtual bool do_intersects( const shape_base& that ) const = 0; }; // class shape_base } // namespace universe } // namespace bear #endif // __UNIVERSE_SHAPE_BASE_HPP__ plee-the-bear-20251226/bear-engine/core/src/universe/shape/shape_traits.hpp000066400000000000000000000115061512343254000264250ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A traits class that helps to access remarkable points of shapes. * \author Julien Jorge */ #ifndef __UNIVERSE_SHAPE_TRAITS_HPP__ #define __UNIVERSE_SHAPE_TRAITS_HPP__ #include "universe/types.hpp" namespace bear { namespace universe { /** * \brief A traits class that helps to access remarkable points of shapes. * * The type passed as template parameter must implements the following * methods: * - coordinate_type T::get_bottom() const, * - void T::set_bottom( coordinate_type ) const, * - coordinate_type T::get_left() const, * - void T::set_left( coordinate_type ) const, * - size_type T::get_width() const, * - void T::set_width( size_type ) const, * - size_type T::get_height() const, * - void T::set_height( size_type ) const. * * \author Julien Jorge */ template struct shape_traits { /** \brief The type of the shape to which these traits are applied. */ typedef T shape_type; static size_box_type get_size( const shape_type& s ); static void set_size( shape_type& s, const size_box_type& size ); static size_type get_width( const shape_type& s ); static void set_width( shape_type& s, size_type width ); static size_type get_height( const shape_type& s ); static void set_height( shape_type& s, size_type height ); static void set_bounding_box ( shape_type& s, const rectangle_type& r ); static rectangle_type get_bounding_box( const shape_type& s ); static void set_top( shape_type& s, coordinate_type pos ); static void set_bottom( shape_type& s, coordinate_type pos ); static void set_left( shape_type& s, coordinate_type pos ); static void set_right( shape_type& s, coordinate_type pos ); static void set_horizontal_middle( shape_type& s, coordinate_type pos ); static void set_vertical_middle( shape_type& s, coordinate_type pos ); static void set_top_left( shape_type& s, const position_type& pos ); static void set_top_middle( shape_type& s, const position_type& pos ); static void set_top_right( shape_type& s, const position_type& pos ); static void set_bottom_left( shape_type& s, const position_type& pos ); static void set_bottom_middle( shape_type& s, const position_type& pos ); static void set_bottom_right( shape_type& s, const position_type& pos ); static void set_left_middle( shape_type& s, const position_type& pos ); static void set_right_middle( shape_type& s, const position_type& pos ); static void set_top_left ( shape_type& s, coordinate_type x, coordinate_type y ); static void set_top_middle ( shape_type& s, coordinate_type x, coordinate_type y ); static void set_top_right ( shape_type& s, coordinate_type x, coordinate_type y ); static void set_bottom_left ( shape_type& s, coordinate_type x, coordinate_type y ); static void set_bottom_middle ( shape_type& s, coordinate_type x, coordinate_type y ); static void set_bottom_right ( shape_type& s, coordinate_type x, coordinate_type y ); static void set_left_middle ( shape_type& s, coordinate_type x, coordinate_type y ); static void set_right_middle ( shape_type& s, coordinate_type x, coordinate_type y ); static coordinate_type get_left( const shape_type& s ); static coordinate_type get_top( const shape_type& s ); static coordinate_type get_right( const shape_type& s ); static coordinate_type get_bottom( const shape_type& s ); static coordinate_type get_horizontal_middle( const shape_type& s ); static coordinate_type get_vertical_middle( const shape_type& s ); static position_type get_top_left( const shape_type& s ); static position_type get_top_middle( const shape_type& s ); static position_type get_top_right( const shape_type& s ); static position_type get_bottom_left( const shape_type& s ); static position_type get_bottom_middle( const shape_type& s ); static position_type get_bottom_right( const shape_type& s ); static position_type get_left_middle( const shape_type& s ); static position_type get_right_middle( const shape_type& s ); static position_type get_center( const shape_type& s ); static void set_center ( shape_type& s, coordinate_type x, coordinate_type y ); static void set_center( shape_type& s, const position_type& pos ); }; // struct shape_traits } // namespace universe } // namespace bear #include "universe/shape/impl/shape_traits.tpp" #endif // __UNIVERSE_SHAPE_TRAITS_HPP__ plee-the-bear-20251226/bear-engine/core/src/universe/static_map.hpp000066400000000000000000000062331512343254000247640ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A static map is a class allowing us to represent a 2D map of items in * a compact way. * \author Julien Jorge. */ #ifndef __UNIVERSE_STATIC_MAP_HPP__ #define __UNIVERSE_STATIC_MAP_HPP__ #include #include #include #include #include "universe/types.hpp" namespace bear { namespace universe { /** * \brief A static map is a class allowing us to represent a 2D map of items * in a compact way. * * The full map is divided into little boxes in which items are listed. * Let's say that we have a map of 1000 x 1000 cells. There isn't items in * all the million cells but all take place in memory. By using a static_map * of size 100 x 100 (with boxes of size 10 x 10), we can reduce the memory * used by a square of 100 empty cells into only one cell. If there is items * in a box, we list them in a cell ; the memory used remains the same but * the access is a little bit longer. * * \b Template parameters * - ItemType is the type of the stored items. Must inherit from * physical_item_state. */ template class static_map { public: /** \brief The type of the items we store. */ typedef ItemType item_type; /** \brief The type of an area. */ typedef rectangle_type area_type; /** \brief A list of items, can contains duplicates. */ typedef std::vector item_list; private: /** \brief Items in a cell. */ typedef std::vector item_box; /** \brief The whole map. */ typedef std::vector map; public: static_map ( unsigned int width, unsigned int height, unsigned int box_size ); void insert( const item_type& item ); template void get_areas ( AreaIterator first, AreaIterator last, item_list& items ) const; template void get_areas_unique ( AreaIterator first, AreaIterator last, item_list& items ) const; void get_area_unique( const area_type& area, item_list& items ) const; private: void get_area( const area_type& area, item_list& items ) const; public: void get_all_unique( item_list& items ) const; unsigned int empty_cells() const; void cells_load( unsigned int& min, unsigned int& max, double& avg ) const; private: void make_set( item_list& items ) const; private: /** \brief The size of the boxes. */ const unsigned int m_box_size; /** \brief The real size of the map. */ const claw::math::coordinate_2d m_size; /** \brief The whole map. */ map m_map; item_list m_items; std::vector m_bounding_boxes; }; // class static_map } // namespace universe } // namespace bear #include "universe/impl/static_map.tpp" #endif // __UNIVERSE_STATIC_MAP__ plee-the-bear-20251226/bear-engine/core/src/universe/types.hpp000066400000000000000000000027031512343254000240020ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Data types for the universe:: namespace. * \author Julien Jorge */ #ifndef __UNIVERSE_TYPES_HPP__ #define __UNIVERSE_TYPES_HPP__ #include #include namespace bear { namespace universe { /** \brief The type of the vectors. */ typedef claw::math::vector_2d vector_type; /** \brief The type of the vectors used for representing forces. */ typedef vector_type force_type; /** \brief The type of the vectors used for representing speed. */ typedef vector_type speed_type; /** \brief The type of a coordinate. */ typedef double coordinate_type; /** \brief The type of the vectors used for representing coordinates. */ typedef claw::math::coordinate_2d position_type; /** \brief The type of the rectangles. */ typedef claw::math::box_2d rectangle_type; /** \brief The type of a size. */ typedef double size_type; /** \brief The type of a box size (width and height). */ typedef claw::math::coordinate_2d size_box_type; /** \brief Type used for representing time. */ typedef double time_type; } // namespace universe } // namespace bear #endif // __UNIVERSE_TYPES_HPP__ plee-the-bear-20251226/bear-engine/core/src/universe/world.hpp000066400000000000000000000246031512343254000237700ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief This is the representation of the world. * \author Julien Jorge. */ #ifndef __UNIVERSE_WORLD_HPP__ #define __UNIVERSE_WORLD_HPP__ #include "concept/item_container.hpp" #include "concept/region.hpp" #include "universe/environment_type.hpp" #include "universe/item_picking_filter.hpp" #include "universe/static_map.hpp" #include "universe/class_export.hpp" #include #include #include #include namespace bear { namespace universe { class density_rectangle; class environment_rectangle; class force_rectangle; class friction_rectangle; class physical_item; class physical_item_state; /** * \brief This is the representation of the world. * * The world is made of static surfaces (round, walls, ...), living items * (heroes, enemies, ... ) and everything is governed by physical rules. * * \author Julien Jorge. */ class UNIVERSE_EXPORT world: public concept::item_container { public: /** \brief Structure used for representing a region (a part) of the world. */ typedef concept::region region_type; /** \brief The type of the map containing static items. */ typedef static_map item_map; /** \brief A list of items. */ typedef std::vector item_list; private: typedef boost::adjacency_list<> dependency_graph_type; typedef boost::bimap< physical_item*, dependency_graph_type::vertex_descriptor > dependency_vertex_map; public: explicit world( const size_box_type& size ); ~world(); void progress_entities ( const region_type& regions, time_type elapsed_time ); void add_static(physical_item* who); time_type get_world_time() const; const size_box_type& get_size() const; void print_stats() const; const force_type& get_gravity() const; void set_gravity( const force_type& g ); void set_scaled_gravity( const force_type& g ); coordinate_type get_position_epsilon() const; void set_position_epsilon( coordinate_type epsilon ); void set_scaled_position_epsilon( coordinate_type epsilon ); const speed_type& get_speed_epsilon() const; void set_speed_epsilon( const speed_type& speed ); void set_scaled_speed_epsilon( const speed_type& speed ); double get_angular_speed_epsilon() const; void set_angular_speed_epsilon( double angular_speed ); void set_unit( coordinate_type u ); coordinate_type to_world_unit( coordinate_type m ) const; void set_default_friction( double f ); double get_average_friction( const rectangle_type& r ) const; friction_rectangle* add_friction_rectangle( const rectangle_type& r, double f ); universe::force_type get_average_force( const rectangle_type& r ) const; force_rectangle* add_force_rectangle( const rectangle_type& r, universe::force_type f ); void set_default_density( double d ); double get_average_density( const rectangle_type& r ) const; density_rectangle* add_density_rectangle( const rectangle_type& r, double f ); force_type get_total_force_on_item( const physical_item_state& item ) const; void get_environments ( const rectangle_type& r, std::set& environments ) const; bool is_in_environment (const position_type& pos, universe::environment_type environment) const; environment_rectangle* add_environment_rectangle ( const rectangle_type& r, const universe::environment_type e ); void set_default_environment( const universe::environment_type e ); void pick_items_by_position ( item_list& items, position_type p, const item_picking_filter& filter = item_picking_filter() ) const; void pick_items_in_rectangle ( item_list& items, rectangle_type r, const item_picking_filter& filter = item_picking_filter() ) const; void pick_items_in_circle ( item_list& items, position_type c, coordinate_type r, const item_picking_filter& filter = item_picking_filter() ) const; physical_item* pick_item_in_direction ( position_type p, vector_type dir, const item_picking_filter& filter = item_picking_filter() ) const; protected: void list_active_items ( item_list& items, const region_type& regions, const item_picking_filter& filter = item_picking_filter() ) const; private: struct candidate_collision { explicit candidate_collision( physical_item* i ); physical_item* item; rectangle_type bounding_box; }; typedef std::vector candidate_collisions; private: void detect_collision_all ( item_list& items, const candidate_collisions& potential_collision ); physical_item* pick_next_collision( item_list& pending ) const; void detect_collision ( physical_item* item, item_list& pending, item_list& all_items, const candidate_collisions& potential_collision ) const; bool process_collision( physical_item& self, physical_item& that ) const; void search_items_for_collision ( const physical_item& item, const candidate_collisions& potential_collision, item_list& colliding, double& mass, double& area ) const; void item_found_in_collision ( const physical_item& item, physical_item* it, item_list& colliding, double& mass, double& area ) const; void search_interesting_items ( const region_type& regions, item_list& items, candidate_collisions& potential_collision ) const; void stabilize_dependent_items( item_list& items ) const; void find_dependency_links ( item_list& pending, dependency_graph_type& graph, dependency_vertex_map& vertex, std::unordered_set& single_items, physical_item* item ) const; void add_dependency_edge ( item_list& pending, dependency_graph_type& graph, dependency_vertex_map& vertex, std::unordered_set& single_items, physical_item* tail, physical_item* head ) const; void add_dependency_vertex ( item_list& pending, dependency_graph_type& graph, dependency_vertex_map& vertex, std::unordered_set& single_items, physical_item* v ) const; void make_sorted_dependency_list ( const dependency_graph_type& graph, const dependency_vertex_map& vertex, const std::unordered_set& single_items, item_list& items ) const; void progress_items ( const item_list& items, time_type elapsed_time ) const; void progress_physic ( time_type elapsed_time, const item_list& items ) const; void progress_physic_move_item ( time_type elapsed_time, physical_item& item ) const; void apply_links(const item_list& items) const; void active_region_traffic( const item_list& items ); void list_static_items ( const region_type& regions, item_list& items ) const; bool item_in_regions ( const physical_item& item, const region_type& regions ) const; void add( physical_item* const& who ); void remove( physical_item* const& who ); void add_to_collision_queue ( item_list& items, physical_item* item, const candidate_collisions& potential_collision ) const; void add_to_collision_queue_no_neighborhood ( item_list& items, physical_item* item ) const; bool create_neighborhood ( physical_item& item, const candidate_collisions& potential_collision ) const; bool interesting_collision ( const physical_item& a, const physical_item& b ) const; private: // not implemented. world( const world& ); world& operator=( world ); private: /** \brief Size of the parts of m_static_surfaces. */ static const unsigned int s_map_compression; /** \brief The elapsed time since the creation of the world. */ time_type m_time; /** \brief The living entities. Can be added and deleted any time. */ item_list m_entities; /** \brief The static surfaces of the world. */ item_map m_static_surfaces; /** \brief The global static items. */ item_list m_global_static_items; /** \brief The size of the world. */ size_box_type m_size; /** \brief Entity in the last active region. */ item_list m_last_interesting_items; /** \brief The unit of the world. m_unit units == 1 meter. */ coordinate_type m_unit; /** \brief Gravity applied to the items. */ force_type m_gravity; /** \brief Default friction applied to the items. */ double m_default_friction; /** \brief A set of regions where the friction of the environment differs from m_default_friction. */ std::vector m_friction_rectangle; /** \brief A set of regions where the force is applied. */ std::vector m_force_rectangle; /** \brief A set of regions with environment. */ std::vector m_environment_rectangle; /** \brief Default environment of the world. */ environment_type m_default_environment; /** \brief Default density applied to the items. */ double m_default_density; /** \brief A set of regions where the density of the environment differs from m_default_density. */ std::vector m_density_rectangle; /** \brief Value under which a coordinate is considered as zero. */ coordinate_type m_position_epsilon; /** \brief Value under which the speed is considered as zero. */ speed_type m_speed_epsilon; /** \brief Value under which the angular speed is considered as zero. */ double m_angular_speed_epsilon; /** \brief Value under which the acceleration is considered as zero. */ force_type m_acceleration_epsilon; }; // class world } // namespace universe } // namespace bear #endif // __UNIVERSE_WORLD_HPP__ plee-the-bear-20251226/bear-engine/core/src/universe/world_progress_structure.hpp000066400000000000000000000066061512343254000300370ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief This class stores some informations about the progression of an item * by the world. * \author Julien Jorge. */ #ifndef __UNIVERSE_WORLD_PROGRESS_STRUCTURE_HPP__ #define __UNIVERSE_WORLD_PROGRESS_STRUCTURE_HPP__ #include "universe/class_export.hpp" #include "universe/physical_item_state.hpp" #include #include #include namespace bear { namespace universe { class physical_item; class physical_item_state; /** * \brief This class stores some informations about the progression of an * item by the world. * \author Julien Jorge. */ class UNIVERSE_EXPORT world_progress_structure: public claw::pattern::non_copyable { public: /** \brief A list of items, the same than universe::world. */ typedef std::vector item_list; /** \brief A list of constant items. */ typedef std::vector const_item_list; private: /** \brief Comparator to sort the neighbours in a collision by increasing mass and increasing intersection. */ class lt_collision { public: lt_collision( const physical_item& item ); bool operator()( const physical_item* a, const physical_item* b ) const; private: /** \brief The item with which we compute the intersection. */ const physical_item& m_item; }; // classe lt_collision public: world_progress_structure( physical_item& item ); void init(); void deinit(); void select(); void unselect(); bool is_selected() const; bool was_selected() const; void set_waiting_for_collision(); void unset_waiting_for_collision(); bool is_waiting_for_collision() const; void set_move_done(); bool move_is_done() const; const physical_item_state& get_initial_state() const; void set_collision_neighborhood( item_list& n, double mass, double area ); void swap_collision_neighborhood( item_list& n ); double get_collision_mass() const; double get_collision_area() const; void meet( physical_item* item ); bool has_met( const physical_item* item ) const; physical_item* pick_next_neighbor(); bool update_collision_penetration(); private: /** \brief The item that can be selected. */ physical_item& m_item; /** \brief The initial state of the item. */ physical_item_state m_initial_state; /** \brief The list of items colliding with this one. */ item_list m_collision_neighborhood; /** \brief The largest mass of the items in \a m_collision_neighborhood. */ double m_collision_mass; /** \brief The largest area of the items in \a m_collision_neighborhood with the same mass \a m_collision_mass. */ double m_collision_area; /** \brief The set of items with which the collision has already been processed. */ const_item_list m_already_met; std::uint32_t m_flags; }; // class world_progress_structure } // namespace universe } // namespace bear #endif // __UNIVERSE_WORLD_PROGRESS_STRUCTURE_HPP__ plee-the-bear-20251226/bear-engine/core/src/universe/zone.hpp000066400000000000000000000024771512343254000236210ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Watching a rectangle placed in a 2D space, we can consider nine zones, * described here. * \author Julien Jorge */ #ifndef __UNIVERSE_ZONE_HPP__ #define __UNIVERSE_ZONE_HPP__ #include "universe/types.hpp" #include "universe/class_export.hpp" namespace bear { namespace universe { /** * \brief Watching a rectangle placed in a 2D space, we can consider nine * zones, described here. */ class UNIVERSE_EXPORT zone { public: enum position { top_left_zone = 0, top_zone, top_right_zone, middle_left_zone, middle_zone, middle_right_zone, bottom_left_zone, bottom_zone, bottom_right_zone }; // enum position /** \brief Number of zones considered. */ static const unsigned int cardinality; static position find ( const rectangle_type& that_box, const rectangle_type& this_box ); static position opposite_of( position p ); }; // class zone } // namespace universe } // namespace bear #endif // __UNIVERSE_ZONE_HPP__ plee-the-bear-20251226/bear-engine/core/src/visual/000077500000000000000000000000001512343254000215665ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/core/src/visual/CMakeLists.txt000066400000000000000000000045261512343254000243350ustar00rootroot00000000000000set( VISUAL_TARGET_NAME bear_visual ) #------------------------------------------------------------------------------- include(FindFreetype) #------------------------------------------------------------------------------- set( VISUAL_SOURCE_FILES code/animation.cpp code/base_scene_element.cpp code/bitmap_rendering_attributes.cpp code/bitmap_writing.cpp code/capture.cpp code/color.cpp code/gl_capture.cpp code/gl_capture_queue.cpp code/gl_draw.cpp code/gl_error.cpp code/gl_image.cpp code/gl_screen.cpp code/gl_fragment_shader.cpp code/gl_renderer.cpp code/gl_shader_program.cpp code/gl_state.cpp code/gl_vertex_shader.cpp code/image.cpp code/image_manager.cpp code/placed_sprite.cpp code/scene_element.cpp code/scene_element_sequence.cpp code/scene_sprite.cpp code/scene_line.cpp code/scene_polygon.cpp code/scene_rectangle.cpp code/scene_shader_pop.cpp code/scene_shader_push.cpp code/scene_star.cpp code/scene_writing.cpp code/screen.cpp code/sdl_error.cpp code/sequence_effect.cpp code/shader_program.cpp code/sprite.cpp code/sprite_sequence.cpp code/star.cpp code/text_align.cpp code/text_layout.cpp code/text_layout_display_size.cpp code/text_metric.cpp code/writing.cpp detail/code/apply_shader.cpp detail/code/get_default_fragment_shader_code.cpp detail/code/get_default_vertex_shader_code.cpp font/code/base_font.cpp font/code/bitmap_charmap.cpp font/code/bitmap_font.cpp font/code/font.cpp font/code/font_manager.cpp font/code/freetype_face.cpp font/code/glyph_metrics.cpp font/code/true_type_font.cpp font/code/true_type_memory_file.cpp ) if( WIN32 ) set( VISUAL_SOURCE_FILES glew/code/glew.cpp ${VISUAL_SOURCE_FILES} ) endif() add_library( ${VISUAL_TARGET_NAME} ${BEAR_ENGINE_CORE_LINK_TYPE} ${VISUAL_SOURCE_FILES} ) set_target_properties( ${VISUAL_TARGET_NAME} PROPERTIES INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/${BEAR_ENGINE_INSTALL_LIBRARY_DIR}" ) include_directories( ${FREETYPE_INCLUDE_DIRS} ) install( TARGETS ${VISUAL_TARGET_NAME} DESTINATION ${BEAR_ENGINE_INSTALL_LIBRARY_DIR} ) target_link_libraries( ${VISUAL_TARGET_NAME} bear_time ${SDL2_LIBRARY} ${OPENGL_LIBRARIES} ${CLAW_GRAPHIC_LIBRARIES} ${CLAW_LOGGER_LIBRARIES} ${FREETYPE_LIBRARIES} ${Boost_THREAD_LIBRARY} ${Boost_SYSTEM_LIBRARY} ) plee-the-bear-20251226/bear-engine/core/src/visual/animation.hpp000066400000000000000000000024611512343254000242610ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief An animation. * \author Julien Jorge */ #ifndef __VISUAL_ANIMATION_HPP__ #define __VISUAL_ANIMATION_HPP__ #include "visual/sprite_sequence.hpp" namespace bear { namespace visual { /** * \brief An animation. * \author Julien Jorge */ class VISUAL_EXPORT animation: public sprite_sequence { public: animation(); animation( const sprite& spr ); animation ( const std::vector& images, const std::vector& d ); void set_time_factor( double f ); double get_time_factor() const; void reset(); void next( double t ); bool is_finished() const; private: double get_scaled_duration( std::size_t i ) const; private: /** \brief The duration of the frames. */ std::vector m_duration; /** \brief Time spent on the current frame. */ double m_time; /** \brief A factor applied to the duration of the frames. */ double m_time_factor; }; // class animation } // namespace visual } // namespace bear #endif // __VISUAL_ANIMATION_HPP__ plee-the-bear-20251226/bear-engine/core/src/visual/base_capture.hpp000066400000000000000000000012421512343254000247330ustar00rootroot00000000000000#pragma once #include "visual/class_export.hpp" #include #include #include namespace bear { namespace visual { class VISUAL_EXPORT base_capture { public: typedef boost::function< void( const claw::graphic::image& ) > capture_ready; typedef boost::function< void( double ) > capture_progress; public: base_capture() {} virtual base_capture* clone() const = 0; virtual ~base_capture() {} virtual boost::signals2::connection render ( const capture_ready& ready, const capture_progress& progress ) = 0; }; } } plee-the-bear-20251226/bear-engine/core/src/visual/base_image.hpp000066400000000000000000000024041512343254000243530ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Base class for all image implementation. * \author Julien Jorge */ #ifndef __VISUAL_BASE_IMAGE_HPP__ #define __VISUAL_BASE_IMAGE_HPP__ #include #include #include #include "visual/class_export.hpp" namespace bear { namespace visual { /** * \brief Base class for all image implementation. * \author Julien Jorge */ class VISUAL_EXPORT base_image: public claw::pattern::non_copyable { public: virtual ~base_image() {} unsigned int width() const { return size().x; } unsigned int height() const { return size().y; } virtual claw::math::coordinate_2d size() const = 0; virtual bool has_transparency() const = 0; virtual void draw ( const claw::graphic::image& data, claw::math::coordinate_2d pos ) = 0; virtual claw::graphic::image read() const = 0; }; // class base_image } // namespace visual } // namespace bear #endif // __VISUAL_BASE_IMAGE_HPP__ plee-the-bear-20251226/bear-engine/core/src/visual/base_scene_element.hpp000066400000000000000000000053261512343254000261050ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief The base class for scene elements. * \author Julien Jorge */ #ifndef __VISUAL_BASE_SCENE_ELEMENT_HPP__ #define __VISUAL_BASE_SCENE_ELEMENT_HPP__ #include "visual/bitmap_rendering_attributes.hpp" #include "visual/types.hpp" #include "visual/class_export.hpp" #include namespace bear { namespace visual { class base_screen; class scene_element; /** * \brief The base class for scene elements. * \author Julien Jorge */ class VISUAL_EXPORT base_scene_element { public: /** \brief A list of elements of the scene. */ typedef std::list scene_element_list; /** \brief A list of rectangles. */ typedef std::list rectangle_list; public: base_scene_element( coordinate_type x = 0, coordinate_type y = 0 ); virtual ~base_scene_element(); virtual base_scene_element* clone() const; virtual rectangle_type get_opaque_box() const; virtual rectangle_type get_bounding_box() const; virtual void burst ( const rectangle_list& boxes, scene_element_list& output ) const; virtual void render( base_screen& scr ) const; const position_type& get_position() const; void set_position( coordinate_type x, coordinate_type y ); void set_position( position_type ); const position_type& get_shadow() const; void set_shadow( coordinate_type x, coordinate_type y ); double get_shadow_opacity() const; void set_shadow_opacity( double o ); void set_scale_factor( double x, double y ); double get_scale_factor_x() const; double get_scale_factor_y() const; void set_rendering_attributes( const bitmap_rendering_attributes& a ); const bitmap_rendering_attributes& get_rendering_attributes() const; bitmap_rendering_attributes& get_rendering_attributes(); virtual bool always_displayed() const; private: /** \brief The position of the element on the screen. */ position_type m_position; /** \brief Scale factor on both axis. */ size_box_type m_scale_factor; /** \brief The distance of the projection of the shadow. */ position_type m_shadow; /** \brief The opacity of the shadow. */ double m_shadow_opacity; /** \brief The attributes applied to the element when rendering. */ bitmap_rendering_attributes m_rendering_attributes; }; // class base_scene_element } // namespace visual } // namespace bear #endif // __VISUAL_BASE_SCENE_ELEMENT_HPP__ plee-the-bear-20251226/bear-engine/core/src/visual/base_screen.hpp000066400000000000000000000040031512343254000245450ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Base class for all screen implementation. * \author Julien Jorge */ #ifndef __VISUAL_BASE_SCREEN_HPP__ #define __VISUAL_BASE_SCREEN_HPP__ #include "visual/capture.hpp" #include "visual/class_export.hpp" #include "visual/types.hpp" #include #include #include namespace bear { namespace visual { class sprite; class shader_program; /** * \brief Base class for all screen implementation. * \author Julien Jorge */ class VISUAL_EXPORT base_screen { public: virtual ~base_screen() {} virtual void pause() = 0; virtual void unpause() = 0; virtual void fullscreen( bool b ) = 0; virtual claw::math::coordinate_2d get_size() const = 0; virtual claw::math::coordinate_2d get_viewport_size() const = 0; virtual claw::math::coordinate_2d get_container_size() const = 0; virtual void set_background_color( const color_type& c ) = 0; virtual color_type get_background_color() const = 0; virtual void begin_render() {} virtual void render( const position_type& pos, const sprite& s ) = 0; virtual void end_render() { } virtual void draw_line ( const color_type& color, const std::vector& p, double w, bool close = false ) = 0; virtual void draw_polygon ( const color_type& color, const std::vector& p ) = 0; virtual void push_shader( const shader_program& p ) = 0; virtual void pop_shader() = 0; virtual void shot( claw::graphic::image& img ) const = 0; virtual capture capture_scene() const = 0; }; // class base_screen } // namespace visual } // namespace bear #endif // __VISUAL_BASE_SCREEN_HPP__ plee-the-bear-20251226/bear-engine/core/src/visual/base_shader_program.hpp000066400000000000000000000015631512343254000262730ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Base class for all shader program implementations. * \author Julien Jorge */ #ifndef __VISUAL_BASE_SHADER_PROGRAM_HPP__ #define __VISUAL_BASE_SHADER_PROGRAM_HPP__ #include #include "visual/class_export.hpp" namespace bear { namespace visual { /** * \brief Base class for all shader program implementations. * \author Julien Jorge */ class VISUAL_EXPORT base_shader_program: public claw::pattern::non_copyable { public: virtual ~base_shader_program() {} }; // class base_shader_program } // namespace visual } // namespace bear #endif // __VISUAL_BASE_SHADER_PROGRAM_HPP__ plee-the-bear-20251226/bear-engine/core/src/visual/bitmap_rendering_attributes.hpp000066400000000000000000000053111512343254000300560ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A class to represent rendering attributes for bitmaps (sprite, * animation). * \author Julien Jorge */ #ifndef __VISUAL_BITMAP_RENDERING_ATTRIBUTES_HPP__ #define __VISUAL_BITMAP_RENDERING_ATTRIBUTES_HPP__ #include #include "visual/types.hpp" #include "visual/class_export.hpp" namespace bear { namespace visual { /** * \brief A class to represent the rendering attributes of a picture. * \author Julien Jorge */ class VISUAL_EXPORT bitmap_rendering_attributes { public: bitmap_rendering_attributes(); explicit bitmap_rendering_attributes( const size_box_type& s ); double get_opacity() const; void set_opacity( double opacity ); double get_red_intensity() const; double get_green_intensity() const; double get_blue_intensity() const; void set_intensity( double r, double g, double b ); void set_red_intensity( double i ); void set_green_intensity( double i ); void set_blue_intensity( double i ); void colorize( color_type c ); void set_color(const color_type& c); color_type get_color() const; const size_box_type& get_size() const; void set_size( const size_box_type& s ); void set_size( size_type w, size_type h ); void set_width( size_type w ); void set_height( size_type h ); size_type width() const; size_type height() const; void set_angle( double angle ); double get_angle() const; void flip( bool b ); void mirror( bool b ); bool is_flipped() const; bool is_mirrored() const; void combine( const bitmap_rendering_attributes& that ); color_type convert_color( const color_type& c ) const; private: /** \brief The size of the bitmap on the screen. */ size_box_type m_size; /** \brief Is the picture reversed vertically? */ bool m_flip; /** \brief Is the picture reversed horizontally? */ bool m_mirror; /** \brief Pixel intensity. */ double m_opacity; /** \brief Intensity of the red channel. */ double m_red_intensity; /** \brief Intensity of the green channel. */ double m_green_intensity; /** \brief Intensity of the blue channel. */ double m_blue_intensity; /** \brief The angle on the screen. */ double m_angle; }; // class bitmap_rendering_attributes } // namespace visual } // namespace bear #endif // __VISUAL_BITMAP_RENDERING_ATTRIBUTES_HPP__ plee-the-bear-20251226/bear-engine/core/src/visual/bitmap_writing.hpp000066400000000000000000000054051512343254000253220ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A text written with some bitmap font. * \author Julien Jorge */ #ifndef __VISUAL_BITMAP_WRITING_HPP__ #define __VISUAL_BITMAP_WRITING_HPP__ #include "visual/class_export.hpp" #include "visual/placed_sprite.hpp" #include "visual/sequence_effect.hpp" #include "visual/text_align.hpp" #include #include namespace bear { namespace visual { class font; class base_screen; class scene_writing; /** * \brief A text written with some bitmap font. * \author Julien Jorge */ class VISUAL_EXPORT bitmap_writing: public bitmap_rendering_attributes { private: typedef std::vector sprite_list; private: /** * \brief The class passed to text_layout to compute the position of the * sprites of the text. */ class arrange_sprite_list { public: arrange_sprite_list ( const font& f, const std::string& str, sprite_list& list ); void operator() ( position_type p, std::size_t first, std::size_t last ); coordinate_type get_bottom() const; private: // Not implemented arrange_sprite_list( const arrange_sprite_list& ); // Not implemented arrange_sprite_list& operator=( const arrange_sprite_list& ); private: /** \brief The text to arrange. */ std::string const& m_text; /** \brief The font used to display the text. */ font const& m_font; /** \brief The sprites of the text. */ sprite_list& m_sprites; /** \brief The bottom of the text on the screen. */ coordinate_type m_bottom; }; // class arrange_sprite_list public: typedef sprite_list::const_iterator const_iterator; public: std::size_t get_sprites_count() const; placed_sprite get_sprite( std::size_t i ) const; void set_effect( sequence_effect e ); void update( double t ); void create ( const font& f, const std::string& str, const size_box_type& s, text_align::horizontal_align h, text_align::vertical_align v ); void call_render( const scene_writing& s, base_screen& scr ) const; private: void shift_vertically( coordinate_type offset ); private: /** \brief The sprites that make the text. */ sprite_list m_sprites; /** \brief The effect to apply to the sprites. */ sequence_effect m_effect; }; // class bitmap_writing } // namespace visual } // namespace bear #endif // __VISUAL_BITMAP_WRITING_HPP__ plee-the-bear-20251226/bear-engine/core/src/visual/capture.hpp000066400000000000000000000015331512343254000237440ustar00rootroot00000000000000#pragma once #include "visual/class_export.hpp" #include #include #include namespace bear { namespace visual { class base_capture; class VISUAL_EXPORT capture { public: typedef boost::function< void( const claw::graphic::image& ) > capture_ready; typedef boost::function< void( double ) > capture_progress; public: capture(); capture( const base_capture& c ); capture( const capture& that ); capture( capture&& that ); ~capture(); capture& operator=( const capture& that ); capture& operator=( capture&& that ); boost::signals2::connection render ( const capture_ready& ready, const capture_progress& progress ); private: base_capture* m_impl; }; } } plee-the-bear-20251226/bear-engine/core/src/visual/class_export.hpp000066400000000000000000000014341512343254000250070ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Definition of the VISUAL_EXPORT macro according to the fact that we * create the library or link to it. * \author Julien Jorge */ #ifndef __VISUAL_CLASS_EXPORT_HPP__ #define __VISUAL_CLASS_EXPORT_HPP__ #ifndef VISUAL_EXPORT # ifdef _WIN32 # ifdef bear_visual_EXPORTS # define VISUAL_EXPORT __declspec(dllexport) # else # define VISUAL_EXPORT __declspec(dllimport) # endif // def bear_visual_EXPORTS # else // def _WIN32 # define VISUAL_EXPORT # endif // def _WIN32 #endif // ndef VISUAL_EXPORT #endif // __VISUAL_CLASS_EXPORT_HPP__ plee-the-bear-20251226/bear-engine/core/src/visual/code/000077500000000000000000000000001512343254000225005ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/core/src/visual/code/animation.cpp000066400000000000000000000072171512343254000251720ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::visual::animation class. * \author Julien Jorge */ #include "visual/animation.hpp" #include /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ bear::visual::animation::animation() : m_time(0), m_time_factor(1) { } // animation::animation() /*----------------------------------------------------------------------------*/ /** * \brief Constructor. Create an animation with a single frame from a sprite. * \param spr The single frame of the animation. */ bear::visual::animation::animation( const sprite& spr ) : sprite_sequence(spr), m_duration(0), m_time(0), m_time_factor(1) { } // animation::animation() /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param images The frames of the animation. * \param d The duration of the frames. * \pre images.size() > 0 * \pre images.size() == d.size() * \post loops == 0, loop_back == false */ bear::visual::animation::animation ( const std::vector& images, const std::vector& d ) : sprite_sequence(images), m_duration(d), m_time(0), m_time_factor(1) { CLAW_PRECOND( images.size() == d.size() ); } // animation::animation() /*----------------------------------------------------------------------------*/ /** * \brief Set the coefficient applied to the durations of the frames. * \param f The time factor. */ void bear::visual::animation::set_time_factor( double f ) { if ( f < 0 ) f = 0; m_time_factor = f; } // animation::set_time_factor() /*----------------------------------------------------------------------------*/ /** * \brief Get the coefficient applied to the durations of the frames. */ double bear::visual::animation::get_time_factor() const { return m_time_factor; } // animation::get_time_factor() /*----------------------------------------------------------------------------*/ /** * \brief Come back to first frame. */ void bear::visual::animation::reset() { sprite_sequence::reset(); m_time = 0; } // animation::reset() /*----------------------------------------------------------------------------*/ /** * \brief Go forward in the animation. * \param t Go this dutation forward. * \pre t >= 0 */ void bear::visual::animation::next( double t ) { CLAW_PRECOND( t >= 0 ); if ( !is_finished() ) { m_time += m_time_factor * t; while ( ( m_time >= get_scaled_duration(get_current_index()) ) && !sprite_sequence::is_finished() ) { m_time -= get_scaled_duration(get_current_index()); sprite_sequence::next(); } } } // animation::next() /*----------------------------------------------------------------------------*/ /** * \brief Tell if we have reached the last frame and if it is completely played. */ bool bear::visual::animation::is_finished() const { if ( m_duration.empty() ) return true; else return sprite_sequence::is_finished() && ( m_time >= get_scaled_duration(get_current_index()) ); } // animation::is_finished() /*----------------------------------------------------------------------------*/ /** * \brief Get the duration of a frame, according to the current time_factor. * \param i The index of the frame. */ double bear::visual::animation::get_scaled_duration( std::size_t i ) const { CLAW_PRECOND( i < m_duration.size() ); return m_duration[i]; } // animation::get_scaled_duration() plee-the-bear-20251226/bear-engine/core/src/visual/code/base_scene_element.cpp000066400000000000000000000166111512343254000270110ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::visual::base_scene_element class. * \author Julien Jorge */ #include "visual/base_scene_element.hpp" #include "visual/scene_element.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param x X-position of the element on the screen. * \param y Y-position of the element on the screen. */ bear::visual::base_scene_element::base_scene_element ( coordinate_type x, coordinate_type y ) : m_position(x, y), m_scale_factor(1, 1), m_shadow(0, 0), m_shadow_opacity(1) { } // base_scene_element::base_scene_element() /*----------------------------------------------------------------------------*/ /** * \brief Destructor. */ bear::visual::base_scene_element::~base_scene_element() { // nothing to do } // base_scene_element::~base_scene_element() /*----------------------------------------------------------------------------*/ /** * \brief Create a copy on the element. */ bear::visual::base_scene_element* bear::visual::base_scene_element::clone() const { return new base_scene_element(*this); } // base_scene_element::clone() /*----------------------------------------------------------------------------*/ /** * \brief Get a box where the element is fully opaque. */ bear::visual::rectangle_type bear::visual::base_scene_element::get_opaque_box() const { return rectangle_type(0, 0, 0, 0); } // base_scene_element::get_opaque_box() /*----------------------------------------------------------------------------*/ /** * \brief Get the bounding box of the element. */ bear::visual::rectangle_type bear::visual::base_scene_element::get_bounding_box() const { return rectangle_type ( m_position.x, m_position.y, m_position.x + m_rendering_attributes.width() * get_scale_factor_x(), m_position.y + m_rendering_attributes.height() * get_scale_factor_y() ); } // base_scene_element::get_bounding_box() /*----------------------------------------------------------------------------*/ /** * \brief Split the element into subelements. * \param boxes The boxes describing how to split the element. * \param output The resulting elements. */ void bear::visual::base_scene_element::burst ( const rectangle_list& boxes, scene_element_list& output ) const { output.push_back( scene_element(*this) ); } // base_scene_element::burst() /*----------------------------------------------------------------------------*/ /** * \brief Render the sprite on a screen. * \param scr The screen on which we render the sprite. */ void bear::visual::base_scene_element::render( base_screen& scr ) const { // nothing to do } // base_scene_element::render() /*----------------------------------------------------------------------------*/ /** * \brief Get the position on the element on the screen. */ const bear::visual::position_type& bear::visual::base_scene_element::get_position() const { return m_position; } // base_scene_element::get_position() /*----------------------------------------------------------------------------*/ /** * \brief Set the position on the element on the screen. * \param x The new x-position. * \param y The new y-position. */ void bear::visual::base_scene_element::set_position ( coordinate_type x, coordinate_type y ) { m_position.set(x, y); } // base_scene_element::set_position() /*----------------------------------------------------------------------------*/ /** * \brief Set the position on the element on the screen. * \param p The new position. */ void bear::visual::base_scene_element::set_position( position_type p ) { set_position( p.x, p.y ); } // base_scene_element::set_position() /*----------------------------------------------------------------------------*/ /** * \brief Get the distance of the projection of the shadow. */ const bear::visual::position_type& bear::visual::base_scene_element::get_shadow() const { return m_shadow; } // base_scene_element::get_shadow() /*----------------------------------------------------------------------------*/ /** * \brief Set the distance of the projection of the shadow. * \param x The distance on the x axis. * \param y The distance on the y axis. */ void bear::visual::base_scene_element::set_shadow ( coordinate_type x, coordinate_type y ) { m_shadow.set(x, y); } // base_scene_element::set_shadow() /*----------------------------------------------------------------------------*/ /** * \brief Get the opacity of the shadow. */ double bear::visual::base_scene_element::get_shadow_opacity() const { return m_shadow_opacity; } // base_scene_element::get_shadow_opacity() /*----------------------------------------------------------------------------*/ /** * \brief Set the opacity of the shadow. * \param o The new opacity. */ void bear::visual::base_scene_element::set_shadow_opacity( double o ) { m_shadow_opacity = std::max( 0.0, std::min( 1.0, o ) ); } // base_scene_element::set_shadow_opacity() /*----------------------------------------------------------------------------*/ /** * \brief Set the factor applied to the element when rendered. * \param x The factor on the x-axis. * \param y The factor on the y-axis. */ void bear::visual::base_scene_element::set_scale_factor( double x, double y ) { m_scale_factor.x = x; m_scale_factor.y = y; } // base_scene_element::set_scale_factor() /*----------------------------------------------------------------------------*/ /** * \brief Get the factor applied on the x-axis to the element when rendered. */ double bear::visual::base_scene_element::get_scale_factor_x() const { return m_scale_factor.x; } // base_scene_element::get_scale_factor_x() /*----------------------------------------------------------------------------*/ /** * \brief Get the factor applied on the y-axis to the element when rendered. */ double bear::visual::base_scene_element::get_scale_factor_y() const { return m_scale_factor.y; } // base_scene_element::get_scale_factor_y() /*----------------------------------------------------------------------------*/ /** * \brief Set the attributes applied to the element when rendering. * \param a The attributes. */ void bear::visual::base_scene_element::set_rendering_attributes ( const bitmap_rendering_attributes& a ) { m_rendering_attributes = a; } // base_scene_element::get_rendering_attributes() /*----------------------------------------------------------------------------*/ /** * \brief Get the attributes applied to the element when rendering. */ const bear::visual::bitmap_rendering_attributes& bear::visual::base_scene_element::get_rendering_attributes() const { return m_rendering_attributes; } // base_scene_element::get_rendering_attributes() /*----------------------------------------------------------------------------*/ /** * \brief Get the attributes applied to the element when rendering. */ bear::visual::bitmap_rendering_attributes& bear::visual::base_scene_element::get_rendering_attributes() { return m_rendering_attributes; } // base_scene_element::get_rendering_attributes() /*----------------------------------------------------------------------------*/ /** * \brief Tells if the element must always be displayed. */ bool bear::visual::base_scene_element::always_displayed() const { return false; } // base_scene_element::always_displayed() plee-the-bear-20251226/bear-engine/core/src/visual/code/bitmap_rendering_attributes.cpp000066400000000000000000000266221512343254000307730ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bitmap_rendering_attributes class. * \author Julien Jorge */ #include "visual/bitmap_rendering_attributes.hpp" #include #include /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ bear::visual::bitmap_rendering_attributes::bitmap_rendering_attributes() : m_size(0, 0), m_flip(false), m_mirror(false), m_opacity(1), m_red_intensity(1), m_green_intensity(1), m_blue_intensity(1), m_angle(0) { } // bitmap_rendering_attributes::bitmap_rendering_attributes() /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param s The size. */ bear::visual::bitmap_rendering_attributes::bitmap_rendering_attributes ( const size_box_type& s ) : m_size(s), m_flip(false), m_mirror(false), m_opacity(1), m_red_intensity(1), m_green_intensity(1), m_blue_intensity(1), m_angle(0) { } // bitmap_rendering_attributes::bitmap_rendering_attributes() /*----------------------------------------------------------------------------*/ /** * \brief Get the opacity translucy. */ double bear::visual::bitmap_rendering_attributes::get_opacity() const { return m_opacity; } // bitmap_rendering_attributes::get_opacity() /*----------------------------------------------------------------------------*/ /** * \brief Set the opacity. */ void bear::visual::bitmap_rendering_attributes::set_opacity( double opacity ) { if ( opacity > 1 ) m_opacity = 1; else if ( opacity < 0 ) m_opacity = 0; else m_opacity = opacity; } // bitmap_rendering_attributes::set_opacity() /*----------------------------------------------------------------------------*/ /** * \brief Get the intensity of the red channel. */ double bear::visual::bitmap_rendering_attributes::get_red_intensity() const { return m_red_intensity; } // bitmap_rendering_attributes::get_red_intensity() /*----------------------------------------------------------------------------*/ /** * \brief Get the intensity of the green channel. */ double bear::visual::bitmap_rendering_attributes::get_green_intensity() const { return m_green_intensity; } // bitmap_rendering_attributes::get_green_intensity() /*----------------------------------------------------------------------------*/ /** * \brief Get the intensity of the blue channel. */ double bear::visual::bitmap_rendering_attributes::get_blue_intensity() const { return m_blue_intensity; } // bitmap_rendering_attributes::get_blue_intensity() /*----------------------------------------------------------------------------*/ /** * \brief Set the intensity of the channels. * \param r Value on the r component. * \param g Value on the r component. * \param b Value on the r component. */ void bear::visual::bitmap_rendering_attributes::set_intensity ( double r, double g, double b ) { if (r > 1) m_red_intensity = 1; else if (r < 0) m_red_intensity = 0; else m_red_intensity = r; if (g > 1) m_green_intensity = 1; else if (g < 0) m_green_intensity = 0; else m_green_intensity = g; if (b > 1) m_blue_intensity = 1; else if (b < 0) m_blue_intensity = 0; else m_blue_intensity = b; } // bitmap_rendering_attributes::set_intensity() /*----------------------------------------------------------------------------*/ /** * \brief Set the intensity of the red channel. * \param i The intensity. */ void bear::visual::bitmap_rendering_attributes::set_red_intensity( double i ) { if (i > 1) m_red_intensity = 1; else if (i < 0) m_red_intensity = 0; else m_red_intensity = i; } // bitmap_rendering_attributes::set_red_color() /*----------------------------------------------------------------------------*/ /** * \brief Set the intensity of the green channel. * \param i The intensity. */ void bear::visual::bitmap_rendering_attributes::set_green_intensity( double i ) { if (i > 1) m_green_intensity = 1; else if (i < 0) m_green_intensity = 0; else m_green_intensity = i; } // bitmap_rendering_attributes::set_green_color() /*----------------------------------------------------------------------------*/ /** * \brief Set the intensity of the blue channel. * \param i The intensity. */ void bear::visual::bitmap_rendering_attributes::set_blue_intensity( double i ) { if (i > 1) m_blue_intensity = 1; else if (i < 0) m_blue_intensity = 0; else m_blue_intensity = i; } // bitmap_rendering_attributes::set_blue_color() /*----------------------------------------------------------------------------*/ /** * \brief Merges the intensity of the color channels and the opacity of the * element with a given color. * \param c The color. */ void bear::visual::bitmap_rendering_attributes::colorize( color_type c ) { const color_type::component_type component_max ( std::numeric_limits::max() ); set_intensity ( get_red_intensity() * (double)c.components.red / component_max, get_green_intensity() * (double)c.components.green / component_max, get_blue_intensity() * (double)c.components.blue / component_max ); set_opacity( get_opacity() * (double)c.components.alpha / component_max ); } // bitmap_rendering_attributes::colorize() /*----------------------------------------------------------------------------*/ /** * \brief Set the color. * \param c The color. */ void bear::visual::bitmap_rendering_attributes::set_color(const color_type& c) { set_intensity ( c.get_red_intensity(), c.get_green_intensity(), c.get_blue_intensity()); set_opacity( c.get_opacity() ); } // bitmap_rendering_attributes::set_color() /*----------------------------------------------------------------------------*/ /** * \brief Gets the intensity of the color channels and the opacity of this * element, represented by a color instance. */ bear::visual::color_type bear::visual::bitmap_rendering_attributes::get_color() const { color_type result; result.set_red_intensity( get_red_intensity() ); result.set_green_intensity( get_green_intensity() ); result.set_blue_intensity( get_blue_intensity() ); result.set_opacity( get_opacity() ); return result; } // bitmap_rendering_attributes::get_color() /*----------------------------------------------------------------------------*/ /** * \brief Get the size. */ const bear::visual::size_box_type& bear::visual::bitmap_rendering_attributes::get_size() const { return m_size; } // bitmap_rendering_attributes::get_size() /*----------------------------------------------------------------------------*/ /** * \brief Set the size. * \param s The new size. */ void bear::visual::bitmap_rendering_attributes::set_size( const size_box_type& s ) { m_size = s; } // bitmap_rendering_attributes::set_size() /*----------------------------------------------------------------------------*/ /** * \brief Set the size. * \param w The new width. * \param h The new height. */ void bear::visual::bitmap_rendering_attributes::set_size ( size_type w, size_type h ) { m_size.set(w, h); } // bitmap_rendering_attributes::set_size() /*----------------------------------------------------------------------------*/ /** * \brief Set the width. * \param w The new width. */ void bear::visual::bitmap_rendering_attributes::set_width( size_type w ) { m_size.x = w; } // bitmap_rendering_attributes::set_width() /*----------------------------------------------------------------------------*/ /** * \brief Set the height. * \param h The new height. */ void bear::visual::bitmap_rendering_attributes::set_height( size_type h ) { m_size.y = h; } // bitmap_rendering_attributes::set_height() /*----------------------------------------------------------------------------*/ /** * \brief Get the width. */ bear::visual::size_type bear::visual::bitmap_rendering_attributes::width() const { return m_size.x; } // bitmap_rendering_attributes::width() /*----------------------------------------------------------------------------*/ /** * \brief Get the height. */ bear::visual::size_type bear::visual::bitmap_rendering_attributes::height() const { return m_size.y; } // bitmap_rendering_attributes::height() /*----------------------------------------------------------------------------*/ /** * \brief Set the angle. * \param a a Rotate the sprite with this angle (in radians and in trigonometric * direction). The center of the rotation is the center of the sprite. */ void bear::visual::bitmap_rendering_attributes::set_angle( double a ) { m_angle = a; } // bitmap_rendering_attributes::set_angle() /*----------------------------------------------------------------------------*/ /** * \brief Get the angle. */ double bear::visual::bitmap_rendering_attributes::get_angle() const { return m_angle; } // bitmap_rendering_attributes::get_angle() /*----------------------------------------------------------------------------*/ /** * \brief Set vertical inversion. * \param b The new value for the inversion. */ void bear::visual::bitmap_rendering_attributes::flip( bool b ) { m_flip = b; } // bitmap_rendering_attributes::flip() /*----------------------------------------------------------------------------*/ /** * \brief Set horizontal inversion. * \param b The new value for the inversion. */ void bear::visual::bitmap_rendering_attributes::mirror( bool b ) { m_mirror = b; } // bitmap_rendering_attributes::mirror() /*----------------------------------------------------------------------------*/ /** * \brief Get vertical inversion. */ bool bear::visual::bitmap_rendering_attributes::is_flipped() const { return m_flip; } // bitmap_rendering_attributes::is_flipped() /*----------------------------------------------------------------------------*/ /** * \brief Get horizontal inversion. */ bool bear::visual::bitmap_rendering_attributes::is_mirrored() const { return m_mirror; } // bitmap_rendering_attributes::is_mirrored() /*----------------------------------------------------------------------------*/ /** * \brief Combine with an other set of attributes. * \param that The attributes to combine with. * * The attributes changed by this method are : is_flipped(), is_mirrored(), the * intensities, the opacity and the angle. The size is not changed. */ void bear::visual::bitmap_rendering_attributes::combine ( const bitmap_rendering_attributes& that ) { flip( that.is_flipped() ^ is_flipped() ); mirror( that.is_mirrored() ^ is_mirrored() ); set_intensity ( that.get_red_intensity() * get_red_intensity(), that.get_green_intensity() * get_green_intensity(), that.get_blue_intensity() * get_blue_intensity() ); set_opacity( that.get_opacity() * get_opacity() ); set_angle( that.get_angle() + get_angle() ); } // bitmap_rendering_attributes::combine() /*----------------------------------------------------------------------------*/ /** * \brief Apply the intensity and the opacities to a given color. * \param c The color. */ bear::visual::color_type bear::visual::bitmap_rendering_attributes::convert_color ( const color_type& c ) const { return color_type ( c.components.red * get_red_intensity(), c.components.green * get_green_intensity(), c.components.blue * get_blue_intensity(), c.components.alpha * get_opacity() ); } // bitmap_rendering_attributes::convert_color() plee-the-bear-20251226/bear-engine/core/src/visual/code/bitmap_writing.cpp000066400000000000000000000130401512343254000262210ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ #include "visual/bitmap_writing.hpp" #include "visual/scene_writing.hpp" #include "visual/font/font.hpp" #include "visual/text_layout.hpp" #include #include /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param f The font used to display the text. * \param str The text to arrange. * \param list (out) The sprites of the text. * * The instance keep the references on each parameter. So they must live longer * than \a this. */ bear::visual::bitmap_writing::arrange_sprite_list::arrange_sprite_list ( const font& f, const std::string& str, sprite_list& list ) : m_text(str), m_font(f), m_sprites(list), m_bottom( std::numeric_limits< coordinate_type >::max() ) { } // bitmap_writing::arrange_sprite_list::arrange_sprite_list() /*----------------------------------------------------------------------------*/ /** * \brief Draw a word on the screen. * \param p The position where the word starts. * \param first The first character of the word to display. * \param last The character just past the last character to display. */ void bear::visual::bitmap_writing::arrange_sprite_list::operator() ( position_type p, std::size_t first, std::size_t last ) { position_type baseline_position( p ); for (; first!=last; ++first) { const glyph_metrics m( m_font.get_metrics( m_text[first] ) ); const sprite s( m_font.get_sprite( m_text[first] ) ); const position_type sprite_position ( baseline_position + m.get_bearing() ); m_sprites.push_back( placed_sprite( sprite_position, s) ); baseline_position.x += m.get_advance().x; m_bottom = std::min( m_bottom, sprite_position.y ); } } // bitmap_writing::arrange_sprite_list::operator()() /*----------------------------------------------------------------------------*/ /** * \brief Returns the y-position of the bottom line of the text. */ bear::visual::coordinate_type bear::visual::bitmap_writing::arrange_sprite_list::get_bottom() const { return m_bottom; } // bitmap_writing::arrange_sprite_list::get_bottom() /*----------------------------------------------------------------------------*/ /** * \brief Get the number of sprites in the writing. */ std::size_t bear::visual::bitmap_writing::get_sprites_count() const { return m_sprites.size(); } // bitmap_writing::get_sprites_count() /*----------------------------------------------------------------------------*/ /** * \brief Get a sprite from the writing. * \param i The index of the sprite to get. */ bear::visual::placed_sprite bear::visual::bitmap_writing::get_sprite( std::size_t i ) const { placed_sprite result; result = m_sprites[i]; result.get_sprite().combine(*this); result.get_sprite().colorize( m_effect.get_color(i) ); result.set_position( result.get_position() + m_effect.get_delta(i) ); return result; } // bitmap_writing::get_sprite() /*----------------------------------------------------------------------------*/ /** * \brief Set the effect to apply to the sprites of the text. * \param e The effect. */ void bear::visual::bitmap_writing::set_effect( sequence_effect e ) { m_effect = e; } // bitmap_writing::set_effect() /*----------------------------------------------------------------------------*/ /** * \brief Update the rendering of the writing and its effects. * \param t The elapsed type since the last call. */ void bear::visual::bitmap_writing::update( double t ) { m_effect.update(t); } // bitmap_writing::update() /*----------------------------------------------------------------------------*/ /** * \brief Initialize the rendering of the writing. * \param f The font used to render the text. * \param str The text to render. * \param s The maximum size of the bitmap_writing. * \param h The horizontal alignment of the lines of text. * \param v The vertical alignment of the lines of text. */ void bear::visual::bitmap_writing::create ( const font& f, const std::string& str, const size_box_type& s, text_align::horizontal_align h, text_align::vertical_align v ) { set_size(s); m_sprites.clear(); m_sprites.reserve( str.length() ); arrange_sprite_list func( f, str, m_sprites ); text_layout layout(f, str, s, h ); layout.arrange_text( func ); if ( v == text_align::align_bottom ) shift_vertically( - func.get_bottom() ); else if ( v == text_align::align_middle ) shift_vertically( - func.get_bottom() / 2 ); } // bitmap_writing::create() /*----------------------------------------------------------------------------*/ /** * \brief Call the render method of a scene_writing (double dispach) . * \param s The scene_writing on which we call the method. * \param scr The screen to pass to \a s. */ void bear::visual::bitmap_writing::call_render ( const scene_writing& s, base_screen& scr ) const { s.render(*this, scr); } // bitmap_writing::call_render() /*----------------------------------------------------------------------------*/ /** * \brief Applies an offset on the y-position of all the sprites in m_sprites. * \param offset The offset to apply. */ void bear::visual::bitmap_writing::shift_vertically( coordinate_type offset ) { for ( sprite_list::iterator it=m_sprites.begin(); it!=m_sprites.end(); ++it ) it->set_position ( position_type(it->get_position().x, it->get_position().y + offset) ); } // bitmap_writing::shift_vertically() plee-the-bear-20251226/bear-engine/core/src/visual/code/capture.cpp000066400000000000000000000020511512343254000246450ustar00rootroot00000000000000#include "visual/capture.hpp" #include "visual/base_capture.hpp" bear::visual::capture::capture() : m_impl( nullptr ) { } bear::visual::capture::capture( const base_capture& c ) : m_impl( c.clone() ) { } bear::visual::capture::capture( const capture& that ) : m_impl( that.m_impl->clone() ) { } bear::visual::capture::capture( capture&& that ) : m_impl( that.m_impl ) { that.m_impl = nullptr; } bear::visual::capture::~capture() { delete m_impl; } bear::visual::capture& bear::visual::capture::operator=( const capture& that ) { if ( this == &that ) return *this; delete m_impl; if ( that.m_impl == nullptr ) m_impl = nullptr; else m_impl = that.m_impl->clone(); return *this; } bear::visual::capture& bear::visual::capture::operator=( capture&& that ) { std::swap( m_impl, that.m_impl ); return *this; } boost::signals2::connection bear::visual::capture::render ( const capture_ready& ready, const capture_progress& progress ) { assert( m_impl != nullptr ); return m_impl->render( ready, progress ); } plee-the-bear-20251226/bear-engine/core/src/visual/code/color.cpp000066400000000000000000000141231512343254000243230ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::visual::color class. * \author Julien Jorge */ #include "visual/color.hpp" #include /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ bear::visual::color::color() { // nothing to do } // color::color() /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param c A color from libclaw. */ bear::visual::color::color( const claw::graphic::rgba_pixel& c ) : claw::graphic::rgba_pixel(c) { } // color::color() /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param c A color. */ bear::visual::color::color( const color& c ) { set_red_intensity( c.get_red_intensity() ); set_green_intensity( c.get_green_intensity() ); set_blue_intensity( c.get_blue_intensity() ); set_opacity( c.get_opacity() ); } // color::color() /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param c The name of the color. */ bear::visual::color::color( const std::string& c ) : claw::graphic::rgba_pixel(c) { } // color::color() /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param r Intensity of the red component. * \param g Intensity of the green component. * \param b Intensity of the blue component. */ bear::visual::color::color ( component_type r, component_type g, component_type b ) : claw::graphic::rgba_pixel (r, g, b, std::numeric_limits::max()) { } // color::color() /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param r Intensity of the red component. * \param g Intensity of the green component. * \param b Intensity of the blue component. * \param o opacity. */ bear::visual::color::color ( component_type r, component_type g, component_type b, component_type o ) : claw::graphic::rgba_pixel(r, g, b, o) { } // color::color() /*----------------------------------------------------------------------------*/ /** * \brief Set the color. * \param red The red intensity of the component. * \param green The green intensity of the component. * \param blue The blue intensity of the component. * \param opacity The opacity of the component. */ void bear::visual::color::set ( double red, double green, double blue, double opacity ) { set_red_intensity(red); set_green_intensity(green); set_blue_intensity(blue); set_opacity(opacity); } // color::set() /*----------------------------------------------------------------------------*/ /** * \brief Set the intensity of the red component. * \param i The intensity of the component. */ void bear::visual::color::set_red_intensity( double i ) { const component_type max_comp = std::numeric_limits::max(); if ( i < 0 ) components.red = 0; else if ( i > 1 ) components.red = max_comp; else components.red = max_comp * i; } // color::set_red_intensity() /*----------------------------------------------------------------------------*/ /** * \brief Set the intensity of the green component. * \param i The intensity of the component. */ void bear::visual::color::set_green_intensity( double i ) { const component_type max_comp = std::numeric_limits::max(); if ( i < 0 ) components.green = 0; else if ( i > 1 ) components.green = max_comp; else components.green = max_comp * i; } // color::set_green_intensity() /*----------------------------------------------------------------------------*/ /** * \brief Set the intensity of the blue component. * \param i The intensity of the component. */ void bear::visual::color::set_blue_intensity( double i ) { const component_type max_comp = std::numeric_limits::max(); if ( i < 0 ) components.blue = 0; else if ( i > 1 ) components.blue = max_comp; else components.blue = max_comp * i; } // color::set_blue_intensity() /*----------------------------------------------------------------------------*/ /** * \brief Set the intensity of the transparency. * \param i The intensity. */ void bear::visual::color::set_opacity( double o ) { const component_type max_comp = std::numeric_limits::max(); if ( o < 0 ) components.alpha = 0; else if ( o > 1 ) components.alpha = max_comp; else components.alpha = max_comp * o; } // color::set_opacity() /*----------------------------------------------------------------------------*/ /** * \brief Get the intensity of the red component. */ double bear::visual::color::get_red_intensity() const { const component_type max_comp = std::numeric_limits::max(); return (double)components.red / (double)max_comp; } // color::get_red_intensity() /*----------------------------------------------------------------------------*/ /** * \brief Get the intensity of the green component. */ double bear::visual::color::get_green_intensity() const { const component_type max_comp = std::numeric_limits::max(); return (double)components.green / (double)max_comp; } // color::get_green_intensity() /*----------------------------------------------------------------------------*/ /** * \brief Get the intensity of the blue component. */ double bear::visual::color::get_blue_intensity() const { const component_type max_comp = std::numeric_limits::max(); return (double)components.blue / (double)max_comp; } // color::get_blue_intensity() /*----------------------------------------------------------------------------*/ /** * \brief Get the intensity of the transparency. */ double bear::visual::color::get_opacity() const { const component_type max_comp = std::numeric_limits::max(); return (double)components.alpha / (double)max_comp; } // color::get_opacity() plee-the-bear-20251226/bear-engine/core/src/visual/code/gl_capture.cpp000066400000000000000000000007541512343254000253370ustar00rootroot00000000000000#include "visual/gl_capture.hpp" #include "visual/gl_renderer.hpp" bear::visual::gl_capture::gl_capture( const std::vector< gl_state >& states ) : m_states( states ) { } bear::visual::gl_capture* bear::visual::gl_capture::clone() const { return new gl_capture( *this ); } boost::signals2::connection bear::visual::gl_capture::render ( const capture_ready& ready, const capture_progress& progress ) { return gl_renderer::get_instance().queue_capture( m_states, ready, progress ); } plee-the-bear-20251226/bear-engine/core/src/visual/code/gl_capture_queue.cpp000066400000000000000000000141561512343254000265440ustar00rootroot00000000000000#include "visual/gl_capture_queue.hpp" #include "visual/gl_draw.hpp" #include "visual/gl_error.hpp" #include bear::visual::gl_capture_queue::entry::entry( const state_list& s ) : states( s ) { } bool bear::visual::gl_capture_queue::entry::connected() const { return !ready_signal.empty(); } bear::visual::gl_capture_queue::gl_capture_queue ( const claw::math::coordinate_2d< unsigned int >& window_size, const claw::math::coordinate_2d< unsigned int >& viewport_size ) : m_window_size( window_size ), m_viewport_size( viewport_size ), m_ongoing_screenshot( false ) { std::fill( m_lines_per_duration.begin(), m_lines_per_duration.end(), 0 ); m_screenshot_buffer.resize( viewport_size.x * viewport_size.y ); m_image.set_size( viewport_size.x, viewport_size.y ); setup_render_buffer(); setup_frame_buffer(); } boost::signals2::connection bear::visual::gl_capture_queue::enqueue ( const state_list& states, const boost::function< void( const claw::graphic::image& ) >& ready, const boost::function< void( double ) >& progress ) { m_pending_captures.emplace_back( states ); m_pending_captures.back().progress_signal.connect( progress ); return m_pending_captures.back().ready_signal.connect( ready ); } void bear::visual::gl_capture_queue::draw( gl_draw& output ) { if ( m_ongoing_screenshot || m_pending_captures.empty() ) return; m_ongoing_screenshot = true; m_line_index = 0; glBindFramebuffer( GL_FRAMEBUFFER, m_frame_buffer ); VISUAL_GL_ERROR_THROW(); glBindRenderbuffer( GL_RENDERBUFFER, m_render_buffer ); VISUAL_GL_ERROR_THROW(); output.draw( m_pending_captures.front().states ); glBindRenderbuffer( GL_RENDERBUFFER, 0 ); VISUAL_GL_ERROR_THROW(); glBindFramebuffer( GL_FRAMEBUFFER, 0 ); VISUAL_GL_ERROR_THROW(); } void bear::visual::gl_capture_queue::update ( systime::milliseconds_type allocated_time ) { if ( remove_obsolete_captures() ) { m_ongoing_screenshot = false; return; } if ( !m_ongoing_screenshot ) return; allocated_time = std::min< systime::milliseconds_type > ( m_lines_per_duration.size() - 1, allocated_time ); const std::size_t line_count( m_lines_per_duration[ allocated_time ] + 1 ); const systime::milliseconds_type start( systime::get_date_ms() ); read_pixels( line_count * 2 ); const systime::milliseconds_type end( systime::get_date_ms() ); const std::size_t index ( std::min( std::size_t( end - start ), m_lines_per_duration.size() - 1 ) ); for ( std::size_t i( index ); ( i != m_lines_per_duration.size() ) && ( m_lines_per_duration[ i ] < line_count ); ++i ) m_lines_per_duration[ i ] = line_count; m_pending_captures.front().progress_signal ( double( m_line_index ) / m_viewport_size.y ); if ( m_line_index == m_viewport_size.y ) dispatch_screenshot(); } void bear::visual::gl_capture_queue::setup_render_buffer() { glGenRenderbuffers( 1, &m_render_buffer ); VISUAL_GL_ERROR_THROW(); glBindRenderbuffer( GL_RENDERBUFFER, m_render_buffer ); VISUAL_GL_ERROR_THROW(); glRenderbufferStorage ( GL_RENDERBUFFER, GL_RGB565, m_window_size.x, m_window_size.y ); VISUAL_GL_ERROR_THROW(); glBindRenderbuffer( GL_RENDERBUFFER, 0 ); } void bear::visual::gl_capture_queue::setup_frame_buffer() { glGenFramebuffers( 1, &m_frame_buffer ); VISUAL_GL_ERROR_THROW(); glBindFramebuffer( GL_FRAMEBUFFER, m_frame_buffer ); VISUAL_GL_ERROR_THROW(); glFramebufferRenderbuffer ( GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, m_render_buffer ); VISUAL_GL_ERROR_THROW(); const GLenum status( glCheckFramebufferStatus( GL_FRAMEBUFFER ) ); VISUAL_GL_ERROR_THROW(); switch( status ) { case GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT: claw::logger << claw::log_error << "Framebuffer incomplete attachement.\n"; assert( false ); break; case GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS: claw::logger << claw::log_error << "Framebuffer incomplete dimensions.\n"; assert( false ); break; case GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT: claw::logger << claw::log_error << "Framebuffer incomplete missing attachement.\n"; assert( false ); break; case GL_FRAMEBUFFER_UNSUPPORTED: claw::logger << claw::log_error << "Framebuffer unsupported.\n"; assert( false ); break; case GL_FRAMEBUFFER_COMPLETE: break; } VISUAL_GL_ERROR_THROW(); glBindFramebuffer( GL_FRAMEBUFFER, 0 ); VISUAL_GL_ERROR_THROW(); } bool bear::visual::gl_capture_queue::remove_obsolete_captures() { if ( !m_pending_captures.empty() && m_pending_captures.front().connected() ) return false; while ( !m_pending_captures.empty() && !m_pending_captures.front().connected() ) m_pending_captures.pop_front(); return true; } void bear::visual::gl_capture_queue::read_pixels( std::size_t line_count ) { glBindFramebuffer( GL_FRAMEBUFFER, m_frame_buffer ); VISUAL_GL_ERROR_THROW(); const std::size_t height ( std::min( m_viewport_size.y - m_line_index, line_count ) ); claw::graphic::rgba_pixel_8* const output ( m_screenshot_buffer.data() + m_viewport_size.x * m_line_index ); glReadPixels ( ( m_window_size.x - m_viewport_size.x ) / 2, m_line_index + ( m_window_size.y - m_viewport_size.y ) / 2, m_viewport_size.x, height, GL_RGBA, GL_UNSIGNED_BYTE, output ); VISUAL_GL_ERROR_THROW(); glBindFramebuffer( GL_FRAMEBUFFER, 0 ); VISUAL_GL_ERROR_THROW(); m_line_index += height; } void bear::visual::gl_capture_queue::dispatch_screenshot() { m_ongoing_screenshot = false; auto begin( m_screenshot_buffer.begin() ); auto end( begin + m_viewport_size.x ); for ( unsigned int y( 0 ); y != m_viewport_size.y; ++y ) { std::copy( begin, end, m_image[ m_viewport_size.y - y - 1 ].begin() ); begin += m_viewport_size.x; end += m_viewport_size.x; } boost::signals2::signal< void( const claw::graphic::image& ) > signal; signal.swap( m_pending_captures.front().ready_signal ); m_pending_captures.pop_front(); signal( m_image ); } plee-the-bear-20251226/bear-engine/core/src/visual/code/gl_draw.cpp000066400000000000000000000142711512343254000246300ustar00rootroot00000000000000#include "visual/gl_draw.hpp" #include "visual/gl_error.hpp" #include "visual/gl_state.hpp" #include "visual/detail/gl_vertex_attribute_index.hpp" #include #include #include #include namespace bear { namespace visual { namespace detail { static constexpr int vertex_index = 0; static constexpr int color_index = 1; static constexpr int texture_coordinate_index = 2; static constexpr int elements_index = 3; static constexpr int vertex_size = 2; static constexpr int color_size = 4; static constexpr int texture_coordinate_size = 2; } } } bear::visual::gl_draw::gl_draw ( GLuint white, GLuint shader, const claw::math::coordinate_2d< unsigned int >& size ) : m_white( white ), m_shader( shader ), m_background_color{ 0, 0, 0, 0 }, m_vertex_count( 0 ), m_color_count( 0 ), m_texture_coordinate_count( 0 ) { glGenBuffers( 4, m_buffers ); VISUAL_GL_ERROR_THROW(); set_viewport( size ); } void bear::visual::gl_draw::set_background_color( const color_type& c ) { static constexpr const GLfloat max ( std::numeric_limits< color_type::component_type >::max() ); m_background_color[ 0 ] = ( GLfloat )c.components.red / max; m_background_color[ 1 ] = ( GLfloat )c.components.green / max; m_background_color[ 2 ] = ( GLfloat )c.components.blue / max; m_background_color[ 3 ] = ( GLfloat )c.components.alpha / max; } void bear::visual::gl_draw::draw( const std::vector< gl_state >& states ) { glClearColor ( m_background_color[ 0 ], m_background_color[ 1 ], m_background_color[ 2 ], m_background_color[ 3 ] ); VISUAL_GL_ERROR_THROW(); glClear( GL_COLOR_BUFFER_BIT ); VISUAL_GL_ERROR_THROW(); for ( const gl_state& state : states ) { prepare(); glUseProgram( m_shader ); VISUAL_GL_ERROR_THROW(); state.draw( *this ); VISUAL_GL_ERROR_THROW(); finalize(); } } void bear::visual::gl_draw::set_vertices ( const std::vector< GLfloat >& vertices ) { assert( vertices.size() % detail::vertex_size == 0 ); glBindBuffer( GL_ARRAY_BUFFER, m_buffers[ detail::vertex_index ] ); VISUAL_GL_ERROR_THROW(); glBufferData ( GL_ARRAY_BUFFER, vertices.size() * sizeof( GLfloat ), vertices.data(), GL_DYNAMIC_DRAW ); VISUAL_GL_ERROR_THROW(); glVertexAttribPointer ( detail::position_attribute, detail::vertex_size, GL_FLOAT, GL_FALSE, 0, nullptr ); VISUAL_GL_ERROR_THROW(); glEnableVertexAttribArray( detail::position_attribute ); VISUAL_GL_ERROR_THROW(); m_vertex_count = vertices.size() / detail::vertex_size; } void bear::visual::gl_draw::set_colors ( const std::vector< GLfloat >& colors ) { assert( colors.size() % detail::color_size == 0 ); glBindBuffer( GL_ARRAY_BUFFER, m_buffers[ detail::color_index ] ); VISUAL_GL_ERROR_THROW(); glBufferData ( GL_ARRAY_BUFFER, colors.size() * sizeof( GLfloat ), colors.data(), GL_DYNAMIC_DRAW ); VISUAL_GL_ERROR_THROW(); glVertexAttribPointer ( detail::color_attribute, detail::color_size, GL_FLOAT, GL_FALSE, 0, nullptr ); VISUAL_GL_ERROR_THROW(); glEnableVertexAttribArray( detail::color_attribute ); VISUAL_GL_ERROR_THROW(); m_color_count = colors.size() / detail::color_size; } void bear::visual::gl_draw::set_texture_coordinates ( const std::vector< GLfloat >& coordinates ) { assert( coordinates.size() % detail::texture_coordinate_size == 0 ); glBindBuffer ( GL_ARRAY_BUFFER, m_buffers[ detail::texture_coordinate_index ] ); VISUAL_GL_ERROR_THROW(); glBufferData ( GL_ARRAY_BUFFER, coordinates.size() * sizeof( GLfloat ), coordinates.data(), GL_DYNAMIC_DRAW ); VISUAL_GL_ERROR_THROW(); glVertexAttribPointer ( detail::texture_coordinate_attribute, detail::texture_coordinate_size, GL_FLOAT, GL_FALSE, 0, nullptr ); VISUAL_GL_ERROR_THROW(); glEnableVertexAttribArray( detail::texture_coordinate_attribute ); VISUAL_GL_ERROR_THROW(); m_texture_coordinate_count = coordinates.size() / detail::texture_coordinate_size; } void bear::visual::gl_draw::draw( GLenum mode, GLuint first, GLuint count ) { assert( first + count <= m_vertex_count ); assert( m_vertex_count != 0 ); if ( m_texture_coordinate_count == 0 ) glBindTexture( GL_TEXTURE_2D, m_white ); generate_indices(); glDrawElements ( mode, count, GL_UNSIGNED_SHORT, reinterpret_cast< GLvoid* >( first * sizeof( GLushort ) ) ); VISUAL_GL_ERROR_THROW(); } void bear::visual::gl_draw::set_viewport ( const claw::math::coordinate_2d< unsigned int >& size ) { const GLfloat m00( GLfloat( 2 ) / size.x ); const GLfloat m11( GLfloat( 2 ) / size.y ); const std::array< float, 16 > transform = { m00, 0, 0, 0, 0, m11, 0, 0, 0, 0, -2, 0, -1, -1, 1, 1 }; glUseProgram( m_shader ); VISUAL_GL_ERROR_THROW(); glUniformMatrix4fv ( glGetUniformLocation( m_shader, "transform" ), 1, GL_FALSE, transform.data() ); VISUAL_GL_ERROR_THROW(); } void bear::visual::gl_draw::prepare() { m_vertex_count = 0; m_color_count = 0; m_texture_coordinate_count = 0; } void bear::visual::gl_draw::finalize() { glDisableVertexAttribArray( detail::texture_coordinate_attribute ); glDisableVertexAttribArray( detail::color_attribute ); glDisableVertexAttribArray( detail::position_attribute ); glBindBuffer( GL_ARRAY_BUFFER, 0 ); glBindBuffer( GL_ELEMENT_ARRAY_BUFFER, 0 ); } void bear::visual::gl_draw::generate_indices() { assert( ( m_vertex_count == m_color_count ) || ( m_color_count == 0 ) ); assert ( ( m_vertex_count == m_texture_coordinate_count ) || ( m_texture_coordinate_count == 0 ) ); const std::size_t count( m_vertex_count ); assert( count <= std::numeric_limits< GLushort >::max() ); if ( count > m_indices.size() ) { const std::size_t old_count( m_indices.size() ); m_indices.resize( count ); std::iota( m_indices.begin() + old_count, m_indices.end(), old_count ); } glBindBuffer( GL_ELEMENT_ARRAY_BUFFER, m_buffers[ detail::elements_index ] ); VISUAL_GL_ERROR_THROW(); glBufferData ( GL_ELEMENT_ARRAY_BUFFER, count * sizeof( GLushort ), m_indices.data(), GL_STATIC_DRAW ); VISUAL_GL_ERROR_THROW(); } plee-the-bear-20251226/bear-engine/core/src/visual/code/gl_error.cpp000066400000000000000000000042621512343254000250230ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::visual::gl_error class. * \author Julien Jorge */ #include "visual/gl_error.hpp" #include #include #include #include "visual/gl.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Throws an exception if there is a problem with OpenGL. * \param line The line where the error occurred. * \param file The file where the error occurred. */ void bear::visual::gl_error::throw_on_error ( std::size_t line, const std::string& file ) { const GLenum err = glGetError(); if ( err != GL_NO_ERROR ) { std::ostringstream err_string; err_string << file << ':' << line << ": "; switch (err) { case GL_NO_ERROR: err_string << "no error (?)."; break; case GL_INVALID_ENUM: err_string << "unacceptable value is specified for an enumerated argument."; break; case GL_INVALID_VALUE: err_string << "numeric argument is out of range."; break; case GL_INVALID_OPERATION: err_string << "operation is not allowed in the current state."; break; case GL_OUT_OF_MEMORY: err_string << "not enough memory to execute the command."; break; #ifdef GL_STACK_OVERFLOW case GL_STACK_OVERFLOW: err_string << "stack overflow."; break; #endif #ifdef GL_STACK_UNDERFLOW case GL_STACK_UNDERFLOW: err_string << "stack underflow."; break; #endif #ifdef GL_TABLE_TOO_LARGE case GL_TABLE_TOO_LARGE: err_string << "table exceeds the implementation's maximum supported table size."; break; #endif default: err_string << "unknow error code " << err << '.'; } claw::logger << claw::log_error << err_string.str() << std::endl; throw claw::exception( err_string.str() ); } } // gl_error::throw_on_error() plee-the-bear-20251226/bear-engine/core/src/visual/code/gl_fragment_shader.cpp000066400000000000000000000025451512343254000270250ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::visual::gl_fragment_shader class. * \author Julien Jorge */ #include "visual/gl_fragment_shader.hpp" #include "visual/gl_renderer.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Creates a new fragment shader from a given source. * \param p The stream from which is read the shader. */ bear::visual::gl_fragment_shader::gl_fragment_shader( const std::string& p ) { m_fragment_shader = gl_renderer::get_instance().create_fragment_shader( p ); } // gl_fragment_shader::gl_fragment_shader() /*----------------------------------------------------------------------------*/ /** * \brief Destructor. Cleans up the GL variables. */ bear::visual::gl_fragment_shader::~gl_fragment_shader() { gl_renderer::get_instance().delete_shader( m_fragment_shader ); } // gl_fragment_shader::~gl_fragment_shader() /*----------------------------------------------------------------------------*/ /** * \brief Gets the OpenGL identifier of the shader. */ GLuint bear::visual::gl_fragment_shader::shader_id() const { return m_fragment_shader; } // gl_fragment_shader::shader_id() plee-the-bear-20251226/bear-engine/core/src/visual/code/gl_image.cpp000066400000000000000000000073231512343254000247550ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::visual::image class. * \author Julien Jorge */ #include "visual/gl_image.hpp" #include "visual/gl_renderer.hpp" #include #include #include #include #include /*----------------------------------------------------------------------------*/ /** * \brief Constructs an image of a given size. * \param width The width of the image. * \param height The height of the image. */ bear::visual::gl_image::gl_image( unsigned int width, unsigned int height ) : m_texture_id(0), m_size(width, height), m_has_transparency(false) { create_texture(); } // gl_image::gl_image() /*----------------------------------------------------------------------------*/ /** * \brief Constructor with a claw::graphic::gl_image object. * \param data The image to copy. */ bear::visual::gl_image::gl_image(const claw::graphic::image& data) : m_texture_id(0), m_size(data.width(), data.height()), m_has_transparency(false) { create_texture(); copy_scanlines(data); } // gl_image::gl_image() [claw::graphic::gl_image] /*----------------------------------------------------------------------------*/ /** * \brief Destructor. */ bear::visual::gl_image::~gl_image() { gl_renderer::get_instance().delete_texture( m_texture_id ); } // gl_image::~gl_image() /*----------------------------------------------------------------------------*/ /** * \brief Get OpenGL texture identifier. */ GLuint bear::visual::gl_image::texture_id() const { return m_texture_id; } // gl_image::texture_id() /*----------------------------------------------------------------------------*/ /** * \brief Get image's size. */ claw::math::coordinate_2d bear::visual::gl_image::size() const { return m_size; } // gl_image::size() /*----------------------------------------------------------------------------*/ /** * \brief Tell if the image has transparent pixels. */ bool bear::visual::gl_image::has_transparency() const { return m_has_transparency; } // gl_image::has_transparency() /*----------------------------------------------------------------------------*/ /** * \brief Replaces a portion of this image with a given data. * \param data The pixels to copy in the image. * \param pos The position in the image where data must be copied. */ void bear::visual::gl_image::draw ( const claw::graphic::image& data, claw::math::coordinate_2d pos ) { m_has_transparency = gl_renderer::get_instance().draw_texture( m_texture_id, data, pos ); } // gl_image::draw() /*----------------------------------------------------------------------------*/ /** * \brief Reads the pixel colors of the textures. * \return An image of the texture. */ claw::graphic::image bear::visual::gl_image::read() const { return gl_renderer::get_instance().read_texture( m_texture_id, m_size ); } // gl_image::read() /*----------------------------------------------------------------------------*/ /** * \brief Create an empty OpenGL texture. */ void bear::visual::gl_image::create_texture() { m_texture_id = gl_renderer::get_instance().create_texture( m_size ); } // gl_image::create_texture() /*----------------------------------------------------------------------------*/ /** * \brief Copy the content of an image to the texture. * \param data The image to copy. */ void bear::visual::gl_image::copy_scanlines( const claw::graphic::image& data ) { draw( data, claw::math::coordinate_2d( 0, 0 ) ); } // gl_image::copy_scanlines() plee-the-bear-20251226/bear-engine/core/src/visual/code/gl_renderer.cpp000066400000000000000000000726421512343254000255070ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::visual::gl_renderer class. * \author Julien Jorge */ #include "visual/gl_renderer.hpp" #include "visual/gl_capture_queue.hpp" #include "visual/gl_draw.hpp" #include "visual/gl_fragment_shader.hpp" #include "visual/gl_error.hpp" #include "visual/gl_vertex_shader.hpp" #include "visual/sdl_error.hpp" #include "visual/detail/get_default_fragment_shader_code.hpp" #include "visual/detail/get_default_vertex_shader_code.hpp" #include "visual/detail/gl_vertex_attribute_index.hpp" #include "time/time.hpp" #include namespace bear { namespace visual { namespace detail { static GLuint create_shader( GLenum type, const std::string& source ); static void log_shader_errors( GLuint shader_id ); static GLuint create_program( GLuint f, GLuint v ); static void log_program_errors ( const std::string& step, GLuint program_id ); } } } /*----------------------------------------------------------------------------*/ bear::visual::gl_renderer::renderer_pointer bear::visual::gl_renderer::s_instance( (gl_renderer*)nullptr ); /*----------------------------------------------------------------------------*/ /** * \brief Gets the single instance of this class and starts the rendering * process if it has not been started yet. */ bear::visual::gl_renderer& bear::visual::gl_renderer::get_instance() { if ( s_instance == nullptr ) s_instance = renderer_pointer( new gl_renderer() ); return *s_instance; } // gl_renderer::get_instance() /*----------------------------------------------------------------------------*/ /** * \brief Terminates the rendering process. */ void bear::visual::gl_renderer::terminate() { if ( s_instance != nullptr ) { s_instance->stop(); delete s_instance; s_instance = nullptr; } } // gl_renderer::terminate() /*----------------------------------------------------------------------------*/ /** * \brief Creates a new texture. * \param size The size of the texture. */ GLuint bear::visual::gl_renderer::create_texture( screen_size_type& size ) { boost::mutex::scoped_lock lock( m_mutex.gl_access ); GLuint texture_id; make_current(); glGenTextures(1, &texture_id); glBindTexture(GL_TEXTURE_2D, texture_id); VISUAL_GL_ERROR_THROW(); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, size.x, size.y, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr ); VISUAL_GL_ERROR_THROW(); release_context(); return texture_id; } // gl_renderer::create_texture() /*----------------------------------------------------------------------------*/ /** * \brief Replaces a portion of a texture with a given data. * \param texture_id The identifier of the texture in which we write the pixels. * \param data The pixels to copy in the image. * \param pos The position in the image where data must be copied. * \return true If there is a transparent pixel in the copied data. */ bool bear::visual::gl_renderer::draw_texture ( GLuint texture_id, const claw::graphic::image& data, const screen_position_type& pos ) { const claw::graphic::rgba_pixel_8::component_type opaque = std::numeric_limits::max(); const std::size_t pixels_count( data.width() * data.height() ); claw::graphic::rgba_pixel_8* const pixels = new claw::graphic::rgba_pixel_8[ pixels_count ]; std::copy( data.begin(), data.end(), pixels ); copy_texture_pixels ( texture_id, pixels, pos.x, pos.y, data.width(), data.height() ); bool has_transparency( false ); for ( claw::graphic::rgba_pixel_8* p = pixels; (p != pixels + pixels_count) && !has_transparency; ++p ) has_transparency = p->components.alpha != opaque; delete[] pixels; return has_transparency; } // gl_renderer::draw_texture() /*----------------------------------------------------------------------------*/ /** * \brief Reads the content of a texture in an image. * \param texture_id The identifier of the texture to read. * \param size The size of the texture. On systems where the texture's size * cannot be retrieved from the texture itself (i.e. when using GLES), * this value is used to allocate the buffer receiving the * image. Otherwise it is ignored. * \return An image made from the texture's data. */ claw::graphic::image bear::visual::gl_renderer::read_texture ( GLuint texture_id, const screen_size_type& size ) { #ifdef GL_TEXTURE_WIDTH boost::mutex::scoped_lock lock( m_mutex.gl_access ); make_current(); glBindTexture( GL_TEXTURE_2D, texture_id ); VISUAL_GL_ERROR_THROW(); GLint width(size.x); GLint height(size.y); glGetTexLevelParameteriv( GL_TEXTURE_2D, 0, GL_TEXTURE_WIDTH, &width ); VISUAL_GL_ERROR_THROW(); glGetTexLevelParameteriv( GL_TEXTURE_2D, 0, GL_TEXTURE_HEIGHT, &height ); VISUAL_GL_ERROR_THROW(); const std::size_t pixels_count( width * height ); claw::graphic::rgba_pixel_8* const pixels = new claw::graphic::rgba_pixel_8[ pixels_count ]; glGetTexImage( GL_TEXTURE_2D, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels ); release_context(); claw::graphic::image result( width, height ); std::copy( pixels, pixels + pixels_count, result.begin() ); delete[] pixels; return result; #else return claw::graphic::image( size.x, size.y ); #endif } // gl_renderer::read_texture() /*----------------------------------------------------------------------------*/ /** * \brief Deletes a texture. * \param texture_id The identifier of the texture to delete. */ void bear::visual::gl_renderer::delete_texture( GLuint texture_id ) { boost::mutex::scoped_lock lock( m_mutex.gl_access ); make_current(); if ( glIsTexture( texture_id ) ) glDeleteTextures(1, &texture_id); release_context(); } // gl_renderer::delete_texture() /*----------------------------------------------------------------------------*/ /** * \brief Creates a new fragment shader. * \param p The stream from which we read the shader's code. */ GLuint bear::visual::gl_renderer::create_fragment_shader( const std::string& p ) { return create_shader( GL_FRAGMENT_SHADER, p ); } GLuint bear::visual::gl_renderer::create_vertex_shader( const std::string& p ) { return create_shader( GL_VERTEX_SHADER, p ); } /*----------------------------------------------------------------------------*/ /** * \brief Deletes a fragment shader previously created with * create_fragment_shader(). * \param shader_id The identifier of the shader to delete. */ void bear::visual::gl_renderer::delete_shader( GLuint shader_id ) { boost::mutex::scoped_lock lock( m_mutex.gl_access ); make_current(); if ( glIsShader( shader_id ) ) glDeleteShader( shader_id ); release_context(); } // gl_renderer::delete_fragment_shader() /*----------------------------------------------------------------------------*/ /** * \brief Creates a new shader program from an existing fragment shader. * \param shader The shader to link in the program. */ GLuint bear::visual::gl_renderer::create_shader_program ( const gl_fragment_shader& fragment, const gl_vertex_shader& vertex ) { boost::mutex::scoped_lock lock( m_mutex.gl_access ); make_current(); const GLuint result ( detail::create_program( fragment.shader_id(), vertex.shader_id() ) ); release_context(); return result; } // gl_renderer::create_shader_program() /*----------------------------------------------------------------------------*/ /** * \brief Deletes a shader program previously created with * create_shader_program(). * \param program_id The identifier of the program to delete. */ void bear::visual::gl_renderer::delete_shader_program( GLuint program_id ) { boost::mutex::scoped_lock lock( m_mutex.gl_access ); make_current(); if ( glIsProgram( program_id ) ) { GLint shader_count; glGetProgramiv( program_id, GL_ATTACHED_SHADERS, &shader_count ); if ( shader_count != 0 ) { GLuint* shaders = new GLuint[ shader_count ]; glGetAttachedShaders( program_id, shader_count, nullptr, shaders ); for ( GLint i(0); i != shader_count; ++i ) glDetachShader( program_id, shaders[i] ); delete[] shaders; } } glDeleteProgram( program_id ); release_context(); } // gl_renderer::delete_shader_program() /*----------------------------------------------------------------------------*/ /** * \brief Does a screen shot. * \param img The image in which we save the content of the gl_renderer. */ void bear::visual::gl_renderer::shot( claw::graphic::image& img ) { boost::mutex::scoped_lock lock( m_mutex.gl_access ); make_current(); GLint p[4]; glGetIntegerv( GL_VIEWPORT, p ); const unsigned int w = p[2]; const unsigned int h = p[3]; img.set_size( w, h ); glReadPixels ( 0, 0, w, h, GL_RGBA, GL_UNSIGNED_BYTE, m_screenshot_buffer.data() ); VISUAL_GL_ERROR_THROW(); for ( claw::graphic::rgba_pixel_8& p : m_screenshot_buffer ) p.components.alpha = 255; auto begin( m_screenshot_buffer.begin() ); auto end( begin + w ); for ( unsigned int y( 0 ); y != h; ++y ) { std::copy( begin, end, img[ h - y - 1 ].begin() ); begin += w; end += w; } release_context(); } // gl_renderer::shot() bear::visual::gl_capture bear::visual::gl_renderer::capture_scene() { return gl_capture( m_previous_states ); } boost::signals2::connection bear::visual::gl_renderer::queue_capture ( const state_list& states, const boost::function< void( const claw::graphic::image& ) >& ready, const boost::function< void( double ) >& progress ) { boost::mutex::scoped_lock gl_lock( m_mutex.gl_access ); return m_capture_queue->enqueue( states, ready, progress ); } /*----------------------------------------------------------------------------*/ /** * \brief Gets the size of the view on the rendered elements. */ bear::visual::gl_renderer::screen_size_type bear::visual::gl_renderer::get_size() { boost::mutex::scoped_lock lock( m_mutex.window ); return m_view_size; } //gl_renderer::get_size() bear::visual::gl_renderer::screen_size_type bear::visual::gl_renderer::get_viewport_size() { boost::mutex::scoped_lock lock( m_mutex.window ); return m_viewport_size; } /*----------------------------------------------------------------------------*/ /** * \brief Gets the size of the window in which we render. */ bear::visual::gl_renderer::screen_size_type bear::visual::gl_renderer::get_container_size() { boost::mutex::scoped_lock lock( m_mutex.window ); if ( m_window == nullptr ) return m_window_size; int w, h; SDL_GetWindowSize( m_window, &w, &h ); return screen_size_type( w, h ); } //gl_renderer::get_container_size() /*----------------------------------------------------------------------------*/ /** * \brief Sets the title of the window. * \param title The new title of the window. */ void bear::visual::gl_renderer::set_title( const std::string& title ) { boost::mutex::scoped_lock lock( m_mutex.window ); m_title = title; if ( m_window != nullptr ) SDL_SetWindowTitle( m_window, m_title.c_str() ); } // gl_renderer::set_title() /*----------------------------------------------------------------------------*/ /** * \brief Sets the size of the screen. * \param w The width of the screen. * \param h The height of the screen. * \param f Tell if we want a fullscreen mode. */ void bear::visual::gl_renderer::set_video_mode ( const screen_size_type& size, bool f ) { { boost::mutex::scoped_lock lock( m_mutex.window ); m_view_size = size; m_window_size = size; m_fullscreen = f; const std::size_t buffer_size( m_view_size.x * m_view_size.y ); m_screenshot_buffer.resize( buffer_size ); m_video_mode_is_set = true; } if ( m_render_thread == nullptr ) ensure_window_exists(); } // gl_renderer::set_video_mode() /*----------------------------------------------------------------------------*/ /** * \brief Turns the fullscreen mode on or off. * \param f Tell if we want a fullscreen mode. */ void bear::visual::gl_renderer::set_fullscreen( bool f ) { boost::mutex::scoped_lock lock( m_mutex.window ); if ( m_fullscreen == f ) return; m_fullscreen = f; if ( m_window != nullptr ) { make_current(); if ( f ) SDL_SetWindowFullscreen( m_window, SDL_WINDOW_FULLSCREEN ); else SDL_SetWindowFullscreen( m_window, 0 ); int w; int h; SDL_GetWindowSize( m_window, &w, &h ); m_window_size.set( w, h ); boost::mutex::scoped_lock gl_lock( m_mutex.gl_access ); resize_view(); release_context(); } } // gl_renderer::set_fullscreen() /*----------------------------------------------------------------------------*/ /** * \brief Sets the elements to render. * \param states States to render. The function steals the states and leaves * this parameter empty when returning. */ void bear::visual::gl_renderer::set_gl_states( state_list& states ) { { boost::mutex::scoped_lock lock( m_mutex.gl_set_states ); m_states.clear(); m_states.swap( states ); m_render_ready = true; } if ( m_render_thread == nullptr ) render_states(); else m_render_condition.notify_one(); } // gl_renderer::set_gl_states() /*----------------------------------------------------------------------------*/ /** * \brief Gets the color of the background. */ bear::visual::color_type bear::visual::gl_renderer::get_background_color() { return m_background_color; } // gl_renderer::get_background_color() /*----------------------------------------------------------------------------*/ /** * \brief Sets the color of the background, used to clear the screen. * \param c The color. */ void bear::visual::gl_renderer::set_background_color( const color_type& c ) { m_background_color = c; boost::mutex::scoped_lock lock( m_mutex.gl_access ); m_draw->set_background_color( c ); } // gl_renderer::set_background_color() void bear::visual::gl_renderer::pause() { m_mutex.gl_access.lock(); } void bear::visual::gl_renderer::unpause() { m_mutex.gl_access.unlock(); } /*----------------------------------------------------------------------------*/ /** * \brief Tells to stop the rendering process. */ void bear::visual::gl_renderer::stop() { { boost::mutex::scoped_lock lock( m_mutex.loop_state ); m_stop = true; } { boost::mutex::scoped_lock lock( m_mutex.gl_set_states ); m_render_ready = true; m_render_condition.notify_one(); } delete m_draw; if ( m_render_thread != nullptr ) { m_render_thread->join(); delete m_render_thread; } SDL_GL_DeleteContext( m_gl_context ); SDL_DestroyWindow( m_window ); } // gl_renderer::stop() void bear::visual::gl_renderer::loop() { if ( !initialization_loop() ) return; render_loop(); } bool bear::visual::gl_renderer::initialization_loop() { while ( true ) { { // lock m_stop to ensure that stop() will block if called during the // loop. boost::mutex::scoped_lock states_lock( m_mutex.loop_state ); if ( m_stop ) return false; if ( ensure_window_exists() ) return true; } systime::sleep( systime::milliseconds_type( 100 ) ); } } /*----------------------------------------------------------------------------*/ /** * \brief Executes the rendering process. The function returns when m_stop * becomes true. Otherwise it renders the states from m_states. */ void bear::visual::gl_renderer::render_loop() { while ( true ) { { boost::mutex::scoped_lock states_lock( m_mutex.gl_set_states ); while( !m_render_ready ) m_render_condition.wait( states_lock ); } // lock m_stop to ensure that stop() will block if called during the loop. m_mutex.loop_state.lock(); if ( m_stop ) { m_mutex.loop_state.unlock(); break; } const systime::milliseconds_type start( systime::get_date_ms() ); render_states(); const systime::milliseconds_type end( systime::get_date_ms() ); update_screenshot( end - start ); // Release the mutex while we sleep so other threads can request to stop // the loop. m_mutex.loop_state.unlock(); } } // gl_renderer::render_loop() /*----------------------------------------------------------------------------*/ /** * \brief Renders the elements of m_states then removes them. */ void bear::visual::gl_renderer::render_states() { boost::mutex::scoped_lock states_lock( m_mutex.gl_set_states ); m_render_ready = false; assert ( m_gl_context != nullptr ); draw_scene(); // The destruction of the states may call a delete_something() which will need // the gl_access mutex. Thus we have to ensure it is unlocked here. m_previous_states.swap( m_states ); m_states.clear(); } // gl_renderer::render_states() /*----------------------------------------------------------------------------*/ /** * \brief Clears the view and calls draw() on each state of m_states. */ void bear::visual::gl_renderer::draw_scene() { boost::mutex::scoped_lock gl_lock( m_mutex.gl_access ); make_current(); m_draw->draw( m_states ); m_capture_queue->draw( *m_draw ); SDL_GL_SwapWindow( m_window ); VISUAL_GL_ERROR_THROW(); release_context(); } void bear::visual::gl_renderer::update_screenshot ( systime::milliseconds_type render_time ) { boost::mutex::scoped_lock gl_lock( m_mutex.gl_access ); make_current(); const systime::milliseconds_type allocated_time ( render_time >= 15 ? 0 : 15 - render_time ); m_capture_queue->update( allocated_time ); release_context(); } void bear::visual::gl_renderer::resize_view() { const float scale ( std::min ( float( m_window_size.x ) / m_view_size.x, float( m_window_size.y ) / m_view_size.y ) ); const float w( m_view_size.x * scale ); const float h( m_view_size.y * scale ); m_viewport_size.set( w, h ); glViewport( ( m_window_size.x - w ) / 2, ( m_window_size.y - h ) / 2, w, h ); VISUAL_GL_ERROR_THROW(); } /*----------------------------------------------------------------------------*/ /** * \brief Makes m_gl_context the current context of the thread. */ void bear::visual::gl_renderer::make_current() { if ( SDL_GL_MakeCurrent( m_window, m_gl_context ) != 0 ) claw::logger << claw::log_error << SDL_GetError() << std::endl; } // gl_renderer::make_current() /*----------------------------------------------------------------------------*/ /** * \brief Releases the context associated with this thread, in order to let it * available for other threads. */ void bear::visual::gl_renderer::release_context() { if ( SDL_GL_MakeCurrent( m_window, nullptr ) != 0 ) claw::logger << claw::log_error << SDL_GetError() << std::endl; } // gl_renderer::release_context() /*----------------------------------------------------------------------------*/ /** * \brief Sets the pixel of a part of an existing texture. * \param texture_id The identifier of the texture. * \param pixels The pixels to copy into the texture. * \param x The x-coordinate of the top-left region where the pixels are copied * in the texture. * \param y The y-coordinate of the top-left region where the pixels are copied * in the texture. * \param w The width of the region where the pixels are copied in the texture. * \param h The height of the region where the pixels are copied in the texture. */ void bear::visual::gl_renderer::copy_texture_pixels ( GLuint texture_id, claw::graphic::rgba_pixel_8* pixels, std::size_t x, std::size_t y, std::size_t w, std::size_t h ) { boost::mutex::scoped_lock lock( m_mutex.gl_access ); make_current(); glBindTexture(GL_TEXTURE_2D, texture_id); glTexSubImage2D ( GL_TEXTURE_2D, 0, x, y, w, h, GL_RGBA, GL_UNSIGNED_BYTE, pixels ); release_context(); } // gl_renderer::copy_texture_pixels() /*----------------------------------------------------------------------------*/ /** * \brief Creates the window and the GL context if it has not been created yet. */ bool bear::visual::gl_renderer::ensure_window_exists() { boost::mutex::scoped_lock lock( m_mutex.window ); if ( !m_video_mode_is_set || (m_gl_context != nullptr) ) return false; #ifdef __ANDROID__ SDL_GL_SetAttribute( SDL_GL_CONTEXT_MAJOR_VERSION, 2 ); SDL_GL_SetAttribute( SDL_GL_CONTEXT_MINOR_VERSION, 0 ); SDL_GL_SetAttribute( SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_ES ); #endif Uint32 flags = SDL_WINDOW_OPENGL; m_window_size = get_best_screen_size(); if ( m_fullscreen ) flags |= SDL_WINDOW_FULLSCREEN; claw::logger << claw::log_verbose << "Setting video mode to " << m_window_size.x << 'x' << m_window_size.y << ' ' << (m_fullscreen ? "fullscreen" : "windowed") << std::endl; m_window = SDL_CreateWindow ( m_title.c_str(), SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, m_window_size.x, m_window_size.y, flags ); if ( m_window == nullptr ) VISUAL_SDL_ERROR_THROW(); m_gl_context = SDL_GL_CreateContext( m_window ); if ( m_gl_context == nullptr ) VISUAL_SDL_ERROR_THROW(); claw::logger << claw::log_verbose << "OpenGL version is " << glGetString( GL_VERSION ) << ", vendor is " << glGetString(GL_VENDOR) << std::endl; SDL_ShowCursor(0); #ifdef _WIN32 const GLenum err = glewInit(); if ( err != GLEW_OK ) claw::logger << claw::log_error << "Failed to initialize Glew: " << glewGetErrorString(err) << std::endl; #endif glEnable(GL_BLEND); VISUAL_GL_ERROR_THROW(); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); VISUAL_GL_ERROR_THROW(); resize_view(); create_drawing_helper(); create_capture_queue(); release_context(); m_mutex.gl_access.unlock(); return true; } // gl_renderer::ensure_window_exists() void bear::visual::gl_renderer::create_drawing_helper() { GLuint texture; glGenTextures( 1, &texture ); VISUAL_GL_ERROR_THROW(); glBindTexture( GL_TEXTURE_2D, texture ); VISUAL_GL_ERROR_THROW(); glTexImage2D ( GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, &claw::graphic::white_pixel ); VISUAL_GL_ERROR_THROW(); const GLuint shader ( detail::create_program ( detail::create_shader ( GL_FRAGMENT_SHADER, detail::get_default_fragment_shader_code() ), detail::create_shader ( GL_VERTEX_SHADER, detail::get_default_vertex_shader_code() ) ) ); m_draw = new gl_draw( texture, shader, m_view_size ); } void bear::visual::gl_renderer::create_capture_queue() { m_capture_queue = new gl_capture_queue( m_window_size, m_viewport_size ); } /*----------------------------------------------------------------------------*/ /** * \brief Finds a screen resolution that has is the nearest of a given size. * \param w The width of the screen. * \param h The height of the screen. * \param f Tell if we want a fullscreen mode. */ bear::visual::gl_renderer::screen_size_type bear::visual::gl_renderer::get_best_screen_size() const { screen_size_type result( m_view_size ); claw::logger << claw::log_verbose << "Requested screen resolution is " << result.x << 'x' << result.y << '.' << std::endl; #ifdef __ANDROID__ const bool use_fullscreen(true); #else const bool use_fullscreen(m_fullscreen); #endif if ( use_fullscreen ) { claw::logger << claw::log_verbose << "Available screen resolutions:" << std::endl; const std::vector modes( get_sdl_display_modes() ); for ( std::size_t i(0); i != modes.size(); ++i ) claw::logger << claw::log_verbose << modes[i].w << 'x' << modes[i].h << std::endl; result = get_best_screen_size( modes ); } else { claw::logger << claw::log_verbose << "Setting resolution in windowed mode." << std::endl; SDL_DisplayMode m; SDL_GetDesktopDisplayMode(0, &m); const double r_x = (double)m.w / m_view_size.x; const double r_y = (double)m.h / m_view_size.y; double resize_ratio = std::min( r_x, r_y ); if ( resize_ratio < 1 ) result = screen_size_type ( resize_ratio * m_view_size.x, resize_ratio * m_view_size.y ); } claw::logger << claw::log_verbose << "Selected screen resolution is " << result.x << 'x' << result.y << '.' << std::endl; return result; } // gl_renderer::get_best_screen_size() /*----------------------------------------------------------------------------*/ /** * \brief Gets the display modes as returned by SDL. */ std::vector bear::visual::gl_renderer::get_sdl_display_modes() const { const int count( SDL_GetNumDisplayModes(0) ); if ( count < 1 ) VISUAL_SDL_ERROR_THROW(); std::vector result( count ); for ( int i(0); i!=count; ++i ) SDL_GetDisplayMode( 0, i, &result[i] ); return result; } // gl_renderer::get_sdl_display_modes() /*----------------------------------------------------------------------------*/ /** * \brief Finds a screen resolution that has is the nearest of a given size. * \param modes The available resolutions. */ bear::visual::gl_renderer::screen_size_type bear::visual::gl_renderer::get_best_screen_size ( const std::vector& modes ) const { SDL_DisplayMode m; SDL_GetDesktopDisplayMode(0, &m); const double requested_ratio( (double)m_view_size.x / m_view_size.y ); screen_size_type result( m.w, m.h ); double display_ratio( (double)result.x / result.y ); double best_scale_factor_distance; if ( (display_ratio >= 1) && (requested_ratio >= 1) ) best_scale_factor_distance = std::abs( (double)m.w / m_view_size.x - 1 ); else best_scale_factor_distance = std::abs( (double)m.h / m_view_size.y - 1 ); for ( std::size_t i(0); i!=modes.size(); ++i ) { const unsigned int width( modes[i].w ); const unsigned int height( modes[i].h ); const double scale_factor ( std::min ( (double)height / m_view_size.y, (double)width / m_view_size.x ) ); const double scale_factor_distance( std::abs( scale_factor - 1 ) ); if ( scale_factor_distance < best_scale_factor_distance ) { best_scale_factor_distance = scale_factor_distance; result = screen_size_type( width, height ); } } return result; } // gl_renderer::get_best_screen_size() GLuint bear::visual::gl_renderer::create_shader( GLenum type, const std::string& p ) { boost::mutex::scoped_lock lock( m_mutex.gl_access ); make_current(); const GLuint result( detail::create_shader( type, p ) ); release_context(); return result; } /*----------------------------------------------------------------------------*/ /** * Constructs a gl_renderer instance with no rendering informations. */ bear::visual::gl_renderer::gl_renderer() : m_stop( false ), m_window( nullptr ), m_gl_context( nullptr ), m_background_color(0, 0, 0), m_window_size( 640, 480 ), m_view_size( m_window_size ), m_viewport_size( m_view_size ), m_fullscreen( false ), m_video_mode_is_set( false ), m_render_ready( false ), m_draw( nullptr ), m_capture_queue( nullptr ) { m_mutex.gl_access.lock(); #ifdef WIN32 m_render_thread = nullptr; #else m_render_thread = new boost::thread( boost::bind(&gl_renderer::loop, this) ); #endif } // gl_renderer::gl_renderer() GLuint bear::visual::detail::create_shader( GLenum type, const std::string& source ) { const GLuint result( glCreateShader( type ) ); VISUAL_GL_ERROR_THROW(); const char *fragmentText = source.c_str(); glShaderSource( result, 1, &fragmentText, 0 ); VISUAL_GL_ERROR_THROW(); glCompileShader( result ); log_shader_errors( result ); return result; } void bear::visual::detail::log_shader_errors( GLuint shader_id ) { GLint buffer_size; glGetShaderiv( shader_id, GL_INFO_LOG_LENGTH, &buffer_size ); if ( buffer_size <= 1 ) return; char* const buffer = new char[ buffer_size ]; glGetShaderInfoLog( shader_id, buffer_size, nullptr, buffer ); claw::logger << claw::log_error << "Shader " << shader_id << " compile error: " << buffer << std::endl; delete[] buffer; } GLuint bear::visual::detail::create_program( GLuint f, GLuint v ) { const GLuint result( glCreateProgram() ); VISUAL_GL_ERROR_THROW(); glBindAttribLocation( result, detail::position_attribute, "in_position"); VISUAL_GL_ERROR_THROW(); glBindAttribLocation( result, detail::color_attribute, "in_color"); VISUAL_GL_ERROR_THROW(); glBindAttribLocation ( result, detail::texture_coordinate_attribute, "in_texture_coordinates"); VISUAL_GL_ERROR_THROW(); glAttachShader( result, f ); VISUAL_GL_ERROR_THROW(); glAttachShader( result, v ); VISUAL_GL_ERROR_THROW(); glLinkProgram( result ); log_program_errors( "link", result ); glValidateProgram( result ); log_program_errors( "validation", result ); return result; } void bear::visual::detail::log_program_errors ( const std::string& step, GLuint program_id ) { GLint buffer_size; glGetProgramiv( program_id, GL_INFO_LOG_LENGTH, &buffer_size ); if ( buffer_size <= 1 ) return; char* const buffer = new char[ buffer_size ]; glGetProgramInfoLog( program_id, buffer_size, nullptr, buffer ); claw::logger << claw::log_error << "Program " << program_id << ' ' << step << " errors: " << buffer << std::endl; delete[] buffer; } plee-the-bear-20251226/bear-engine/core/src/visual/code/gl_screen.cpp000066400000000000000000000364741512343254000251630ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::visual::gl_screen class. * \author Julien Jorge */ #include "visual/gl_screen.hpp" #include "visual/gl_image.hpp" #include "visual/gl_renderer.hpp" #include "visual/gl_shader_program.hpp" #include "visual/sdl_error.hpp" #include "visual/shader_program.hpp" #include "visual/sprite.hpp" #include #include #include #include "visual/gl.hpp" #include #include #include /*----------------------------------------------------------------------------*/ /** * \brief Global initializations common to all gl_screens. Must be called at the * begining of your program. */ void bear::visual::gl_screen::initialize() { if ( SDL_Init(0) != 0 ) VISUAL_SDL_ERROR_THROW(); if ( !SDL_WasInit(SDL_INIT_VIDEO) ) if ( SDL_InitSubSystem(SDL_INIT_VIDEO) != 0 ) VISUAL_SDL_ERROR_THROW(); if ( SDL_GL_SetAttribute( SDL_GL_DOUBLEBUFFER, 1 ) != 0 ) { SDL_QuitSubSystem(SDL_INIT_VIDEO); VISUAL_SDL_ERROR_THROW(); } for (unsigned int i=0; i!=SDL_USEREVENT; ++i) SDL_EventState( i, SDL_DISABLE ); SDL_EventState( SDL_QUIT, SDL_ENABLE ); } // gl_screen::initialize() /*----------------------------------------------------------------------------*/ /** * \brief Global uninitializations common to all gl_screens. Must be called at * the end of your program. */ void bear::visual::gl_screen::release() { gl_renderer::terminate(); SDL_QuitSubSystem(SDL_INIT_VIDEO); } // gl_screen::release() /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param size Size of the gl_screen. * \param title The title of the window created. * \param full Tell if the window is full gl_screen or not. */ bear::visual::gl_screen::gl_screen ( const claw::math::coordinate_2d& size, const std::string& title, bool full ) { gl_renderer::get_instance().set_video_mode( size, full ); gl_renderer::get_instance().set_title( title ); } // gl_screen::gl_screen() [constructor] void bear::visual::gl_screen::pause() { gl_renderer::get_instance().pause(); } void bear::visual::gl_screen::unpause() { gl_renderer::get_instance().unpause(); } /*----------------------------------------------------------------------------*/ /** * \brief Turn fullscreen mode on/off. * \param b Tell if we want a fullscreen mode. */ void bear::visual::gl_screen::fullscreen( bool b ) { gl_renderer::get_instance().set_fullscreen(b); } // gl_screen::fullscreen() /*----------------------------------------------------------------------------*/ /** * \brief Get the size of the gl_screen. */ claw::math::coordinate_2d bear::visual::gl_screen::get_size() const { return gl_renderer::get_instance().get_size(); } // gl_screen::get_size() claw::math::coordinate_2d bear::visual::gl_screen::get_viewport_size() const { return gl_renderer::get_instance().get_viewport_size(); } /*----------------------------------------------------------------------------*/ /** * \brief Get the size of the container of the screen. */ claw::math::coordinate_2d bear::visual::gl_screen::get_container_size() const { return gl_renderer::get_instance().get_container_size(); } // gl_screen::get_container_size() /*----------------------------------------------------------------------------*/ /** * \brief Set the color of the background, used to clear the screen. * \param c The color. */ void bear::visual::gl_screen::set_background_color( const color_type& c ) { gl_renderer::get_instance().set_background_color( c ); } // gl_screen::set_background_color() /*----------------------------------------------------------------------------*/ /** * \brief Get the color of the background, used to clear the screen. */ bear::visual::color_type bear::visual::gl_screen::get_background_color() const { return gl_renderer::get_instance().get_background_color(); } // gl_screen::get_background_color() /*----------------------------------------------------------------------------*/ /** * \brief Initialize the rendering process. */ void bear::visual::gl_screen::begin_render() { while ( !m_shader.empty() ) pop_shader(); } // gl_screen::begin_render() /*----------------------------------------------------------------------------*/ /** * \brief Draw a sprite on the gl_screen. * \param pos On gl_screen position of the sprite. * \param s The sprite to draw. */ void bear::visual::gl_screen::render ( const position_type& pos, const sprite& s ) { render_sprite( pos, s ); } // gl_screen::render() /*----------------------------------------------------------------------------*/ /** * \brief Stop the rendering process. * \return false if this screen has been closed by the user. */ void bear::visual::gl_screen::end_render() { gl_renderer::get_instance().set_gl_states( m_gl_state ); } // gl_screen::end_render() /*----------------------------------------------------------------------------*/ /** * \brief Draw a line. * \param color The color of the line. * \param p The points of the line. * \param w The width of the line. * \param close Tell if the line come back to the first coordinate. */ void bear::visual::gl_screen::draw_line ( const color_type& color, const std::vector& p, double w, bool close ) { if ( (w <= 0) || p.empty() ) return; std::vector vertices( p ); if ( close ) vertices.push_back( vertices.front() ); push_state( gl_state( get_current_shader(), vertices, color, w ) ); } // gl_screen::draw_line() /*----------------------------------------------------------------------------*/ /** * \brief Draw a filled polygon. * \param color The color of the polygon. * \param p The points of the polygon. */ void bear::visual::gl_screen::draw_polygon ( const color_type& color, const std::vector& p ) { push_state ( gl_state( get_current_shader(), p, color ) ); } // gl_screen::draw_polygon() /*----------------------------------------------------------------------------*/ /** * \brief Sets the shader program to apply for the next render commands. * \param p The program to apply. */ void bear::visual::gl_screen::push_shader( const shader_program& p ) { m_shader.push_back( p ); } // gl_screen::push_shader() /*----------------------------------------------------------------------------*/ /** * \brief Removes the last shader program passed to push_shader. */ void bear::visual::gl_screen::pop_shader() { if ( m_shader.empty() ) { claw::logger << claw::log_warning << "There is no shader to pop." << std::endl; return; } m_shader.pop_back(); } // gl_screen::pop_shader() /*----------------------------------------------------------------------------*/ /** * \brief Do a screen shot. * \param img The image in which we save the content of the gl_screen. */ void bear::visual::gl_screen::shot( claw::graphic::image& img ) const { gl_renderer::get_instance().shot( img ); } // gl_screen::shot() bear::visual::capture bear::visual::gl_screen::capture_scene() const { return gl_renderer::get_instance().capture_scene(); } /*----------------------------------------------------------------------------*/ /** * \brief Render a sprite with transformation (flip or mirror). * \param pos On screen position of the sprite. * \param s The sprite to draw. */ void bear::visual::gl_screen::render_sprite ( const position_type& pos, const sprite& s ) { if ( (s.clip_rectangle().width == 0) || (s.clip_rectangle().height == 0 ) ) return; const claw::math::box_2d clip_vertices = get_texture_clip(s); std::vector render_coord(4); get_render_coord( pos, s, render_coord ); color_type color; color.set ( s.get_red_intensity(), s.get_green_intensity(), s.get_blue_intensity(), s.get_opacity() ); const gl_image* impl = static_cast(s.get_image().get_impl()); GLuint texture_id( impl->texture_id() ); render_image( texture_id, render_coord, clip_vertices, color ); } // gl_screen::render_sprite() /*----------------------------------------------------------------------------*/ /** * \brief Get the coordinates of the corners of a sprite after transformation * (mirror, flip, rotation, etc.). * \param pos On screen position of the sprite. * \param s The sprite of which we want the corners. * \param result An array of 4 entries that will receive the coordinates of the * corners, clockwise, starting from the top left corner. */ void bear::visual::gl_screen::get_render_coord ( const position_type& pos, const sprite& s, std::vector& result ) const { typedef position_type coord_double; GLfloat bottom( pos.y ); GLfloat top( bottom + s.height() ); GLfloat left( pos.x ); GLfloat right( left + s.width() ); if ( s.is_mirrored() ) std::swap(left, right); if ( s.is_flipped() ) std::swap(top, bottom); const coord_double center = pos + s.get_size() / 2; const double a = s.get_angle(); result[0] = rotate( coord_double(left, top), a, center ); result[1] = rotate( coord_double(right, top), a, center ); result[2] = rotate( coord_double(right, bottom), a, center ); result[3] = rotate( coord_double(left, bottom), a, center ); for ( std::size_t i(0); i!=result.size(); ++i ) { result[i].x = (int)( result[i].x + 0.5 ); result[i].y = (int)( result[i].y + 0.5 ); } } // gl_screen::get_render_coord() /*----------------------------------------------------------------------------*/ /** * \brief Get the clip rectangle of a sprite in the coordinates of the OpenGL * texture. * \param s The sprite from which we take the clip rectangle. */ claw::math::box_2d bear::visual::gl_screen::get_texture_clip( const sprite& s ) const { const claw::math::box_2d empty_clip( 0, 0, 0, 0 ); const claw::math::rectangle clip_rectangle(s.clip_rectangle()); if ( (clip_rectangle.width == 0) || (clip_rectangle.height == 0) ) return empty_clip; const claw::math::coordinate_2d tex_size(s.get_image().size()); claw::math::box_2d result; #ifdef BEAR_SPRITE_CLIP_SUBPIXEL const GLfloat min_distance_to_pixel_border( 1.0 / 1000 ); GLfloat horizontal_shift; GLfloat vertical_shift; if ( clip_rectangle.width == s.width() ) horizontal_shift = min_distance_to_pixel_border; else horizontal_shift = 1.0 / tex_size.x / 2; if ( clip_rectangle.height == s.height() ) vertical_shift = min_distance_to_pixel_border; else vertical_shift = 1.0 / tex_size.y / 2; result.first_point.x = clip_rectangle.position.x / tex_size.x + horizontal_shift; result.second_point.x = clip_rectangle.right() / tex_size.x - horizontal_shift; result.first_point.y = clip_rectangle.position.y / tex_size.y + vertical_shift; result.second_point.y = clip_rectangle.bottom() / tex_size.y - vertical_shift; if ( result.second_point.x < result.first_point.x ) result.second_point.x = result.first_point.x; if ( result.second_point.y < result.first_point.y ) result.second_point.y = result.first_point.y; CLAW_POSTCOND( result.first_point.x > 0 ); CLAW_POSTCOND( result.first_point.x < 1 ); CLAW_POSTCOND( result.first_point.y > 0 ); CLAW_POSTCOND( result.first_point.y < 1 ); CLAW_POSTCOND( result.second_point.x > 0 ); CLAW_POSTCOND( result.second_point.x < 1 ); CLAW_POSTCOND( result.second_point.y > 0 ); CLAW_POSTCOND( result.second_point.y < 1 ); #else result.first_point.x = clip_rectangle.position.x / tex_size.x; result.first_point.y = clip_rectangle.position.y / tex_size.y; result.second_point.x = result.first_point.x + clip_rectangle.width / tex_size.x; result.second_point.y = result.first_point.y + clip_rectangle.height / tex_size.y; CLAW_POSTCOND( result.first_point.x >= 0 ); CLAW_POSTCOND( result.first_point.x <= 1 ); CLAW_POSTCOND( result.first_point.y >= 0 ); CLAW_POSTCOND( result.first_point.y <= 1 ); CLAW_POSTCOND( result.second_point.x >= 0 ); CLAW_POSTCOND( result.second_point.x <= 1 ); CLAW_POSTCOND( result.second_point.y >= 0 ); CLAW_POSTCOND( result.second_point.y <= 1 ); #endif return result; } // gl_screen::get_texture_clip() /*----------------------------------------------------------------------------*/ /** * \brief Draw a textured polygon. * \param texture_id The identifier of the texture use. * \param render_coord The coordinates of the vertices to draw. * \param clip Part of the texture to draw. * \param color The color of the vertices. */ void bear::visual::gl_screen::render_image ( GLuint texture_id, const std::vector& render_coord, const claw::math::box_2d& clip, const color_type& color ) { push_state ( gl_state ( texture_id, get_current_shader(), get_texture_coordinates(clip), render_coord, color ) ); } // gl_screen::render_image() /*----------------------------------------------------------------------------*/ /** * \brief Computes the result of the rotation at a given angle of a point around * a given center. * \param pos The point to rotate. * \param a The angle of the rotation. * \param center The center of the rotation. */ bear::visual::position_type bear::visual::gl_screen::rotate ( const position_type& pos, GLfloat a, const position_type& center ) const { position_type result(pos); result.rotate(center, a); return result; } // gl_screen::rotate() /*----------------------------------------------------------------------------*/ /** * \brief Returns a vector of the texture coordinates represented * by a given clip rectangle. * \param clip The rectangle from which we computes the coordinates. */ std::vector bear::visual::gl_screen::get_texture_coordinates ( const claw::math::box_2d& clip ) const { std::vector result(4); // Top-left corner result[0].x = clip.first_point.x; result[0].y = clip.first_point.y; // Top-right corner result[1].x = clip.second_point.x; result[1].y = clip.first_point.y; // Bottom-right corner result[2].x = clip.second_point.x; result[2].y = clip.second_point.y; // Bottom-left corner result[3].x = clip.first_point.x; result[3].y = clip.second_point.y; return result; } // gl_screen::get_texture_coordinates() /*----------------------------------------------------------------------------*/ /** * \brief Pushes a new rendering command. * \param state The rendering command. */ void bear::visual::gl_screen::push_state( const gl_state& state ) { if ( m_gl_state.empty() || !m_gl_state.back().is_compatible_with(state) ) m_gl_state.push_back( state ); else m_gl_state.back().merge( state ); } // gl_screen::push_state() /*----------------------------------------------------------------------------*/ /** * \brief Returns the current shader program to apply. */ bear::visual::shader_program bear::visual::gl_screen::get_current_shader() const { typedef std::vector::const_reverse_iterator iterator_type; for ( iterator_type it = m_shader.rbegin(); it != m_shader.rend(); ++it ) if ( it->is_valid() ) return *it; return shader_program(); } // gl_screen::get_current_shader() plee-the-bear-20251226/bear-engine/core/src/visual/code/gl_shader_program.cpp000066400000000000000000000024151512343254000266650ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::visual::gl_shader_program class. * \author Julien Jorge */ #include "visual/gl_shader_program.hpp" #include "visual/gl_renderer.hpp" bear::visual::gl_shader_program::gl_shader_program ( const std::string& fragment_code, const std::string& vertex_code ) : m_fragment_shader( fragment_code ), m_vertex_shader( vertex_code ) { m_program_id = gl_renderer::get_instance().create_shader_program ( m_fragment_shader, m_vertex_shader ); } /*----------------------------------------------------------------------------*/ /** * \brief Cleans up the program and destroys the GL variables. */ bear::visual::gl_shader_program::~gl_shader_program() { gl_renderer::get_instance().delete_shader_program( m_program_id ); } // gl_shader_program::~gl_shader_program() /*----------------------------------------------------------------------------*/ /** * \brief Gets the OpenGL identifier of the program. */ GLuint bear::visual::gl_shader_program::program_id() const { return m_program_id; } // gl_shader_program::program_id() plee-the-bear-20251226/bear-engine/core/src/visual/code/gl_state.cpp000066400000000000000000000320361512343254000250120ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::visual::gl_state class. * \author Julien Jorge */ #include "visual/gl_state.hpp" #include "visual/gl_draw.hpp" #include "visual/gl_error.hpp" #include "visual/gl_shader_program.hpp" #include "visual/detail/apply_shader.hpp" #include #include /*----------------------------------------------------------------------------*/ /** * \brief Tests if the visited variables exists with the same value in a given * var map. * \param result The result of the visit. * \param vars The variable_map to compare to. */ bear::visual::gl_state::variables_are_included::variables_are_included ( bool& result, const shader_program::input_variable_map& vars ) : m_result( result ), m_variables( vars ) { } // gl_state::variables_are_included::variables_are_included() /*----------------------------------------------------------------------------*/ /** * \brief Sets the value of an integer uniform. * \param name The name of the uniform. * \param value The value to assign to the uniform. */ template void bear::visual::gl_state::variables_are_included::operator() ( const std::string& name, const T& value ) const { if ( !m_result ) return; if ( !m_variables.exists( name ) ) m_result = false; else m_result = ( value == m_variables.get( name ) ); } // gl_state::variables_are_included::operator()() /*----------------------------------------------------------------------------*/ /** * \brief Constructs the range of elements for a given texture. * \param t The texture to use when rendering the vertices. * \param i The index of the first vertex to render. * \param c The count of vertices to render. */ bear::visual::gl_state::element_range::element_range ( GLuint t, std::size_t i, std::size_t c ) : texture_id(t), vertex_index(i), count(c) { } // gl_state::element_range::element_range() /*----------------------------------------------------------------------------*/ const std::size_t bear::visual::gl_state::gl_state::s_vertex_size(2); /*----------------------------------------------------------------------------*/ /** * \brief Constructs a state to render a filled polygon. * \param shader The shader to use when drawing. * \param vertices The vertices to draw. * \param c The color of the vertices. */ bear::visual::gl_state::gl_state ( const shader_program& shader, const position_vector& vertices, const color_type& c ) : m_mode( render_triangles ), m_shader( shader ), m_line_width( 0 ) { const position_vector v( polygon_to_triangles( vertices ) ); push_vertices( v ); push_colors( c, v.size() ); } // gl_state::gl_state() /*----------------------------------------------------------------------------*/ /** * \brief Constructs a state to render a line. * \param shader The shader to use when drawing. * \param vertices The vertices to draw. * \param c The color of the vertices. * \param line_width The width of the line. */ bear::visual::gl_state::gl_state ( const shader_program& shader, const position_vector& vertices, const color_type& c, double line_width ) : m_mode( render_lines ), m_shader( shader ), m_line_width( line_width ) { push_vertices( vertices ); push_colors( c, vertices.size() ); } // gl_state::gl_state() /*----------------------------------------------------------------------------*/ /** * \brief Constructs a state to render a given texture in a given mode. * \param texture_id The identifier of the texture to use when drawing. * \param shader The shader to use when drawing. * \param vertices The vertices to draw. * \param texture_coordinates The coordinates of the vertices in the texture. * \param c The color of the vertices. */ bear::visual::gl_state::gl_state ( GLuint texture_id, const shader_program& shader, const position_vector& texture_coordinates, const position_vector& vertices, const color_type& c ) : m_mode( render_triangles ), m_shader( shader ), m_line_width( 0 ) { const position_vector v( polygon_to_triangles( vertices ) ); push_vertices( v ); push_texture_coordinates( polygon_to_triangles(texture_coordinates) ); push_colors( c, v.size() ); m_elements.push_back( element_range( texture_id, 0, get_vertex_count() ) ); } // gl_state::gl_state() /*----------------------------------------------------------------------------*/ /** * \brief Tells if this state is compatible with another state. * \param state The other state. */ bool bear::visual::gl_state::is_compatible_with( const gl_state& state ) const { if ( (m_mode == render_triangles) && ( m_mode == state.m_mode ) && ( m_elements.empty() == state.m_elements.empty() ) ) { if ( m_shader.is_valid() != state.m_shader.is_valid() ) return false; if ( !m_shader.is_valid() && !state.m_shader.is_valid() ) return true; const gl_shader_program* const this_shader ( static_cast( m_shader.get_impl() ) ); const gl_shader_program* const that_shader ( static_cast( state.m_shader.get_impl() ) ); if ( this_shader->program_id() != that_shader->program_id() ) return false; shader_program::variable_visitor_type visitor; shader_program::input_variable_map this_shader_vars ( m_shader.get_variables() ); shader_program::input_variable_map that_shader_vars ( state.m_shader.get_variables() ); bool equal_variables( true ); visitor.run ( this_shader_vars, variables_are_included( equal_variables, that_shader_vars ) ); visitor.run ( that_shader_vars, variables_are_included( equal_variables, this_shader_vars ) ); return equal_variables; } return false; } // gl_state::is_compatible_with() /*----------------------------------------------------------------------------*/ /** * \brief Inserts in this state the content of another compatible state. * \param state The other state. */ void bear::visual::gl_state::merge( const gl_state& state ) { CLAW_PRECOND( is_compatible_with( state ) ); const std::size_t index( get_vertex_count() ); for ( element_range_list::const_iterator it( state.m_elements.begin() ); it != state.m_elements.end(); ++it ) { element_range& back( m_elements.back() ); if ( it->texture_id == back.texture_id ) back.count += it->count; else m_elements.push_back ( element_range ( it->texture_id, it->vertex_index + index, it->count ) ); } m_vertices.insert ( m_vertices.end(), state.m_vertices.begin(), state.m_vertices.end() ); m_colors.insert ( m_colors.end(), state.m_colors.begin(), state.m_colors.end() ); m_texture_coordinates.insert ( m_texture_coordinates.end(), state.m_texture_coordinates.begin(), state.m_texture_coordinates.end() ); } // gl_state::merge() /*----------------------------------------------------------------------------*/ /** * \brief Asks OpenGL to draw the vertices of the state. */ void bear::visual::gl_state::draw( gl_draw& output ) const { if ( m_elements.empty() ) draw_shape( output ); else draw_textured( output ); } // gl_state::draw() /*----------------------------------------------------------------------------*/ /** * \brief Draws the vertices in the case where there is no texture. */ void bear::visual::gl_state::draw_shape( gl_draw& output ) const { if ( m_vertices.empty() ) return; if ( m_shader.is_valid() ) detail::apply_shader( m_shader ); if ( m_line_width > 0 ) { glLineWidth( m_line_width ); VISUAL_GL_ERROR_THROW(); } set_colors( output ); set_vertices( output ); output.draw( get_gl_render_mode(), 0, get_vertex_count() ); } // gl_state::draw_shape() /*----------------------------------------------------------------------------*/ /** * \brief Draws the vertices in the case where there are textures. */ void bear::visual::gl_state::draw_textured( gl_draw& output ) const { if ( m_vertices.empty() ) return; if ( m_shader.is_valid() ) detail::apply_shader( m_shader ); set_colors( output ); set_vertices( output ); set_texture_coordinates( output ); const GLenum mode( get_gl_render_mode() ); for ( element_range_list::const_iterator it(m_elements.begin()); it!=m_elements.end(); ++it ) { glBindTexture( GL_TEXTURE_2D, it->texture_id ); VISUAL_GL_ERROR_THROW(); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); VISUAL_GL_ERROR_THROW(); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); VISUAL_GL_ERROR_THROW(); output.draw( mode, it->vertex_index, it->count ); } } // gl_state::draw_textured() /*----------------------------------------------------------------------------*/ /** * \brief Passes the color pointer to OpenGL. */ void bear::visual::gl_state::set_colors( gl_draw& output ) const { output.set_colors( m_colors ); } // gl_state::set_colors() /*----------------------------------------------------------------------------*/ /** * \brief Passes the vertex pointer to OpenGL. */ void bear::visual::gl_state::set_vertices( gl_draw& output ) const { output.set_vertices( m_vertices ); } // gl_state::set_vertices() /*----------------------------------------------------------------------------*/ /** * \brief Passes the pointer on the texture coordinates to OpenGL. */ void bear::visual::gl_state::set_texture_coordinates( gl_draw& output ) const { output.set_texture_coordinates( m_texture_coordinates ); } // gl_state::set_texture_coordinates() /*----------------------------------------------------------------------------*/ /** * \brief Returns the number of vertices in the drawing. */ std::size_t bear::visual::gl_state::get_vertex_count() const { return m_vertices.size() / s_vertex_size; } // gl_state::get_vertex_count() /*----------------------------------------------------------------------------*/ /** * \brief Returns the OpenGL equivalent to the render mode. */ GLenum bear::visual::gl_state::get_gl_render_mode() const { switch( m_mode ) { case render_lines: return GL_LINE_STRIP; case render_triangles: return GL_TRIANGLES; } throw new claw::exception( "Unknown render mode." ); } // gl_state::get_gl_render_mode() /*----------------------------------------------------------------------------*/ /** * \brief Adds some vertices at the end of m_vertices. * \param v The coordinates of the vertices to add. */ void bear::visual::gl_state::push_vertices( const position_vector& v ) { for ( std::size_t i(0); i!=v.size(); ++i ) { m_vertices.push_back( v[i].x ); m_vertices.push_back( v[i].y ); } } // gl_state::push_vertices() /*----------------------------------------------------------------------------*/ /** * \brief Adds some texture coordinates at the end of m_texture_coordinates. * \param v The coordinates to add. */ void bear::visual::gl_state::push_texture_coordinates ( const position_vector& v ) { for ( std::size_t i(0); i!=v.size(); ++i ) { m_texture_coordinates.push_back( v[i].x ); m_texture_coordinates.push_back( v[i].y ); } } // gl_state::push_texture_coordinates() /*----------------------------------------------------------------------------*/ /** * \brief Adds some vertex colors at the end of m_colors. * \param c The color to add. * \param count The number of times the color must be added. */ void bear::visual::gl_state::push_colors ( const color_type& c, std::size_t count ) { const GLfloat max( std::numeric_limits::max() ); const GLfloat r( (GLfloat)c.components.red / max ); const GLfloat g( (GLfloat)c.components.green / max ); const GLfloat b( (GLfloat)c.components.blue / max ); const GLfloat a( (GLfloat)c.components.alpha / max ); for ( std::size_t i(0); i != count; ++i ) { m_colors.push_back(r); m_colors.push_back(g); m_colors.push_back(b); m_colors.push_back(a); } } // gl_state::push_colors() /*----------------------------------------------------------------------------*/ /** * \brief Builds a collection of vertices representing a given polygon as a * collection of triangles. * \param v The vertices of the polygon to convert. */ bear::visual::gl_state::position_vector bear::visual::gl_state::polygon_to_triangles( const position_vector& v ) const { CLAW_PRECOND( v.size() >= 3 ); position_vector result; result.reserve( 3 * (v.size() - 2) ); const position_vector::const_iterator root_vertex( v.begin() ); position_vector::const_iterator first_vertex( root_vertex + 1 ); position_vector::const_iterator second_vertex( root_vertex + 2 ); do { result.push_back( *root_vertex ); result.push_back( *first_vertex ); result.push_back( *second_vertex ); ++first_vertex; ++second_vertex; } while ( second_vertex != v.end() ); return result; } // gl_state::polygon_to_triangles() plee-the-bear-20251226/bear-engine/core/src/visual/code/gl_vertex_shader.cpp000066400000000000000000000025031512343254000265310ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::visual::gl_vertex_shader class. * \author Julien Jorge */ #include "visual/gl_vertex_shader.hpp" #include "visual/gl_renderer.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Creates a new vertex shader from a given source. * \param p The stream from which is read the shader. */ bear::visual::gl_vertex_shader::gl_vertex_shader( const std::string& p ) { m_vertex_shader = gl_renderer::get_instance().create_vertex_shader( p ); } // gl_vertex_shader::gl_vertex_shader() /*----------------------------------------------------------------------------*/ /** * \brief Destructor. Cleans up the GL variables. */ bear::visual::gl_vertex_shader::~gl_vertex_shader() { gl_renderer::get_instance().delete_shader( m_vertex_shader ); } // gl_vertex_shader::~gl_vertex_shader() /*----------------------------------------------------------------------------*/ /** * \brief Gets the OpenGL identifier of the shader. */ GLuint bear::visual::gl_vertex_shader::shader_id() const { return m_vertex_shader; } // gl_vertex_shader::shader_id() plee-the-bear-20251226/bear-engine/core/src/visual/code/image.cpp000066400000000000000000000114131512343254000242660ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::visual::image class. * \author Julien Jorge */ #include "visual/image.hpp" #include "visual/screen.hpp" #include "visual/gl_image.hpp" #include /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ bear::visual::image::image() : m_impl(NULL) { } // image::image() /*----------------------------------------------------------------------------*/ /** * \brief Constructs an image of a given size. * \param width The width of the image. * \param height The height of the image. */ bear::visual::image::image( unsigned int width, unsigned int height ) : m_impl(new base_image_ptr(NULL)) { switch ( screen::get_sub_system() ) { case screen::screen_gl: *m_impl = new gl_image( width, height ); break; case screen::screen_undef: claw::exception("screen sub system has not been set."); } } // image::image() /*----------------------------------------------------------------------------*/ /** * \brief Constructor with a claw::graphic::image object. * \param data The image to copy. */ bear::visual::image::image(const claw::graphic::image& data) : m_impl(new base_image_ptr(NULL)) { restore(data); } // image::image() [claw::graphic::image] /*----------------------------------------------------------------------------*/ /** * \brief Delete the data ofthe image. */ void bear::visual::image::clear() { if ( m_impl != NULL ) *m_impl = NULL; } // image::clear() /*----------------------------------------------------------------------------*/ /** * \brief Restore the image. * \param data The image to restore from. */ void bear::visual::image::restore( const claw::graphic::image& data ) { if ( m_impl == NULL ) m_impl = new base_image_ptr(NULL); else if (*m_impl != NULL) { assert( data.width() == width() ); assert( data.height() == height() ); } switch ( screen::get_sub_system() ) { case screen::screen_gl: *m_impl = new gl_image(data); break; case screen::screen_undef: claw::exception("screen sub system has not been set."); } } // image::restore() /*----------------------------------------------------------------------------*/ /** * \brief Get image's width. */ unsigned int bear::visual::image::width() const { CLAW_PRECOND( is_valid() ); return (*m_impl)->width(); } // image::width() /*----------------------------------------------------------------------------*/ /** * \brief Get image's height. */ unsigned int bear::visual::image::height() const { CLAW_PRECOND( is_valid() ); return (*m_impl)->height(); } // image::height() /*----------------------------------------------------------------------------*/ /** * \brief Get image's size. */ claw::math::coordinate_2d bear::visual::image::size() const { CLAW_PRECOND( is_valid() ); return (*m_impl)->size(); } // image::size() /*----------------------------------------------------------------------------*/ /** * \brief Tell if the image has transparent pixels. */ bool bear::visual::image::has_transparency() const { if( is_valid() ) return (*m_impl)->has_transparency(); else return false; } // image::has_transparency() /*----------------------------------------------------------------------------*/ /** * \brief Tell if the image is initialized. */ bool bear::visual::image::is_valid() const { bool result = false; if ( m_impl != NULL ) result = ( *m_impl != NULL ); return result; } // image::is_valid() /*----------------------------------------------------------------------------*/ /** * \brief Replaces a portion of this image with a given data. * \param data The pixels to copy in the image. * \param pos The position in the image where data must be copied. */ void bear::visual::image::draw ( const claw::graphic::image& data, claw::math::coordinate_2d pos ) { if ( is_valid() ) (*m_impl)->draw( data, pos ); } // image::draw() /*----------------------------------------------------------------------------*/ /** * \brief Reads the pixel colors of the textures. * \return An image of the texture. */ claw::graphic::image bear::visual::image::read() const { if ( is_valid() ) return (*m_impl)->read(); else return claw::graphic::image(); } // image::read() /*----------------------------------------------------------------------------*/ /** * \brief Assigment operator. */ const bear::visual::base_image* bear::visual::image::get_impl() const { CLAW_PRECOND( is_valid() ); return &(**m_impl); } // image::get_impl() plee-the-bear-20251226/bear-engine/core/src/visual/code/image_manager.cpp000066400000000000000000000154501512343254000257650ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the image_manager class. * \author Julien Jorge */ #include #include "visual/image_manager.hpp" #include #include #include /*---------------------------------------------------------------------------*/ /** * \brief Deletes all images. * \post m_images.empty == true. */ void bear::visual::image_manager::clear() { m_images.clear(); m_shader_program.clear(); } // image_manager::clear() /*---------------------------------------------------------------------------*/ /** * \brief Adds an image to the cache. * \param name The name of the loaded image. * \param file A stream containing the file to load. * \pre name is not used by another image. * \post get_image(name) is the image in file_name. */ void bear::visual::image_manager::load_image ( const std::string& name, std::istream& file ) { CLAW_PRECOND( !exists(name) ); claw::graphic::png img(file); add_image( name, image(img) ); } // image_manager::load_image() /*---------------------------------------------------------------------------*/ /** * \brief Adds an existing image to the cache. * \param name The name of the loaded image. * \param img The image to add. * \pre name is not used by another image. * \post get_image(name) is the image in file_name. */ void bear::visual::image_manager::add_image ( const std::string& name, const image& img ) { CLAW_PRECOND( !exists(name) ); m_images[name] = img; } // image_manager::add_image() /*---------------------------------------------------------------------------*/ /** * \brief Clear all images. * * The images are not deleted. */ void bear::visual::image_manager::clear_images() { image_map_type::iterator it; for (it=m_images.begin(); it!=m_images.end(); ++it) it->second.clear(); } // image_manager::clear_images() /*---------------------------------------------------------------------------*/ /** * \brief Restore an image. * \param name The name of the loaded image. * \param file A stream containing the file to load. * \pre There is an image called \a name. * * This method is useful when the screen goes dirty, to re-initialize the * images whithout losing references to them. */ void bear::visual::image_manager::restore_image ( const std::string& name, std::istream& file ) { CLAW_PRECOND( exists(name) ); claw::graphic::png img(file); m_images[name].restore(img); } // image_manager::restore_image() /*---------------------------------------------------------------------------*/ /** * \brief Get an image from the cache. * \param name The name of the image to get. * \pre There is an image called "name". */ bear::visual::image bear::visual::image_manager::get_image( const std::string& name ) const { CLAW_PRECOND( exists(name) ); return m_images.find(name)->second; } // image_manager::get_image() /*---------------------------------------------------------------------------*/ /** * \brief Get the names of the images. * \param names (out) The names of the images. */ void bear::visual::image_manager::get_image_names ( std::vector& names ) const { names.resize( m_images.size() ); std::transform( m_images.begin(), m_images.end(), names.begin(), claw::const_first() ); } // image_manager::get_image_names() /*---------------------------------------------------------------------------*/ /** * \brief Tell if an image exists. * \param name The name of the image to find. */ bool bear::visual::image_manager::exists( const std::string& name ) const { return m_images.find(name) != m_images.end(); } // image_manager::exists() /*---------------------------------------------------------------------------*/ /** * \brief Creates a shader program. * \param name The name of the program. * \param file A stream containing the fragment shader code. * \pre name is not used by another shader. * \post get_fragment_shader(name) is the fragment_shader load from \a file */ void bear::visual::image_manager::load_shader_program ( const std::string& name, std::istream& file ) { CLAW_PRECOND( !has_shader_program(name) ); m_shader_program[ name ] = shader_program( file ); } // image_manager::load_shader_program() /*---------------------------------------------------------------------------*/ /** * \brief Clear all shader programs. * * The programs are not deleted. */ void bear::visual::image_manager::clear_shader_programs() { std::unordered_map::iterator it; for (it=m_shader_program.begin(); it!=m_shader_program.end(); ++it) it->second.clear(); } // image_manager::clear_shader_programs() /*---------------------------------------------------------------------------*/ /** * \brief Restores a shader program. * \param name The name of the loaded program. * \param file A stream containing the shader code. * \pre There is a shader program called \a name. * * This method is useful when the screen goes dirty, to re-initialize the * shaders whithout losing references to them. */ void bear::visual::image_manager::restore_shader_program ( const std::string& name, std::istream& file ) { CLAW_PRECOND( has_shader_program(name) ); m_shader_program[ name ].restore( file ); } // image_manager::restore_shader_program() /*---------------------------------------------------------------------------*/ /** * \brief Gets an existing shader program. * \param name The name of the program to get. * \pre There is an image called "name". */ bear::visual::shader_program bear::visual::image_manager::get_shader_program( const std::string& name ) const { CLAW_PRECOND( has_shader_program(name) ); return m_shader_program.find( name )->second; } // image_manager::get_shader_program() /*---------------------------------------------------------------------------*/ /** * \brief Gets the names of the shader programs. * \param names (out) The names of the programs. */ void bear::visual::image_manager::get_shader_program_names ( std::vector& names ) const { names.resize( m_shader_program.size() ); std::transform ( m_shader_program.begin(), m_shader_program.end(), names.begin(), claw::const_first() ); } // image_manager::get_shader_program_names() /*---------------------------------------------------------------------------*/ /** * \brief Tells if there is a shader program with a given name. * \param name The name of the program to find. */ bool bear::visual::image_manager::has_shader_program ( const std::string& name ) const { return m_shader_program.find(name) != m_shader_program.end(); } // image_manager::has_shader_program() plee-the-bear-20251226/bear-engine/core/src/visual/code/placed_sprite.cpp000066400000000000000000000053731512343254000260320ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::visual::placed_sprite class. * \author Julien Jorge */ #include "visual/placed_sprite.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Default constructor. */ bear::visual::placed_sprite::placed_sprite() { } // placed_sprite::placed_sprite() /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param x The x-positon of the sprite. * \param y The y-position of the sprite. * \param s The sprite. */ bear::visual::placed_sprite::placed_sprite ( coordinate_type x, coordinate_type y, const sprite& s ) : m_sprite(s), m_position(x, y) { } // placed_sprite::placed_sprite() /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param p The positon of the sprite. * \param s The sprite. */ bear::visual::placed_sprite::placed_sprite ( const position_type& p, const sprite& s ) : m_sprite(s), m_position(p) { } // placed_sprite::placed_sprite() /*----------------------------------------------------------------------------*/ /** * \brief Get the sprite. */ const bear::visual::sprite& bear::visual::placed_sprite::get_sprite() const { return m_sprite; } // placed_sprite::get_sprite() /*----------------------------------------------------------------------------*/ /** * \brief Get the sprite. */ bear::visual::sprite& bear::visual::placed_sprite::get_sprite() { return m_sprite; } // placed_sprite::get_sprite() /*----------------------------------------------------------------------------*/ /** * \brief Set the sprite. * \param spr The new sprite. */ void bear::visual::placed_sprite::set_sprite( const sprite& spr ) { m_sprite = spr; } // placed_sprite::set_sprite() /*----------------------------------------------------------------------------*/ /** * \brief Get the position. */ const bear::visual::position_type& bear::visual::placed_sprite::get_position() const { return m_position; } // placed_sprite::get_position() /*----------------------------------------------------------------------------*/ /** * \brief Get the position. */ bear::visual::position_type& bear::visual::placed_sprite::get_position() { return m_position; } // placed_sprite::get_position() /*----------------------------------------------------------------------------*/ /** * \brief Set the position. * \param p The new position. */ void bear::visual::placed_sprite::set_position( const position_type& p ) { m_position = p; } // placed_sprite::set_position() plee-the-bear-20251226/bear-engine/core/src/visual/code/scene_element.cpp000066400000000000000000000233331512343254000260160ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the visual::scene_element. * \author Julien Jorge */ #include "visual/scene_element.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param e The effective element of the scene. */ bear::visual::scene_element::scene_element( const base_scene_element& e ) : m_elem(e.clone()) { } // scene_element::scene_element() /*----------------------------------------------------------------------------*/ /** * \brief Copy constructor. * \param that The instance to copy from. */ bear::visual::scene_element::scene_element( const scene_element& that ) : m_elem(that.m_elem->clone()) { } // scene_element::scene_element() /*----------------------------------------------------------------------------*/ /** * \brief Destructor. */ bear::visual::scene_element::~scene_element() { delete m_elem; } // scene_element::~scene_element() /*----------------------------------------------------------------------------*/ /** * \brief Assignment * \param that The instance to copy from. */ bear::visual::scene_element& bear::visual::scene_element::operator=( const scene_element& that ) { base_scene_element* tmp( that.m_elem->clone() ); delete m_elem; m_elem = tmp; return *this; } // scene_element::operator=() /*----------------------------------------------------------------------------*/ /** * \brief Get a rectangle where the element is fully opaque. */ bear::visual::rectangle_type bear::visual::scene_element::get_opaque_box() const { return m_elem->get_opaque_box(); } // scene_element::get_opaque_box() /*----------------------------------------------------------------------------*/ /** * \brief Get a rectangle bounding the element. */ bear::visual::rectangle_type bear::visual::scene_element::get_bounding_box() const { return m_elem->get_bounding_box(); } // scene_element::get_bounding_box() /*----------------------------------------------------------------------------*/ /** * \brief Split the element in sub elements * \param boxes The boxes describing how to split the element. * \param output The resulting elements (they are inserted to the front. */ void bear::visual::scene_element::burst ( const rectangle_list& boxes, scene_element_list& output ) const { m_elem->burst(boxes, output); } // scene_element::burst() /*----------------------------------------------------------------------------*/ /** * \brief Render the element on a screen. * \param scr The screen on which we render the element. */ void bear::visual::scene_element::render( base_screen& scr ) const { m_elem->render(scr); } // scene_element::render() /*----------------------------------------------------------------------------*/ /** * \brief Get the position on the element on the screen. */ const bear::visual::position_type& bear::visual::scene_element::get_position() const { return m_elem->get_position(); } // scene_element::get_position() /*----------------------------------------------------------------------------*/ /** * \brief Set the position on the element on the screen. * \param p The new position. */ void bear::visual::scene_element::set_position( const position_type& p ) { m_elem->set_position(p.x, p.y); } // scene_element::set_position() /*----------------------------------------------------------------------------*/ /** * \brief Set the position on the element on the screen. * \param x The new x-position. * \param y The new y-position. */ void bear::visual::scene_element::set_position ( coordinate_type x, coordinate_type y ) { m_elem->set_position(x, y); } // scene_element::set_position() /*----------------------------------------------------------------------------*/ /** * \brief Tell if the element must be displayed with a shadow. */ bool bear::visual::scene_element::has_shadow() const { return ( (get_shadow().x != 0) || (get_shadow().y != 0) ) && (get_shadow_opacity() != 0); } // scene_element::has_shadow() /*----------------------------------------------------------------------------*/ /** * \brief Get the distance of the projection of the shadow. */ const bear::visual::position_type& bear::visual::scene_element::get_shadow() const { return m_elem->get_shadow(); } // scene_element::get_shadow() /*----------------------------------------------------------------------------*/ /** * \brief Set the distance of the projection of the shadow. * \param p The distance on both axis. */ void bear::visual::scene_element::set_shadow( const position_type& p ) { m_elem->set_shadow(p.x, p.y); } // scene_element::set_shadow() /*----------------------------------------------------------------------------*/ /** * \brief Set the distance of the projection of the shadow. * \param x The distance on the x axis. * \param y The distance on the y axis. */ void bear::visual::scene_element::set_shadow ( coordinate_type x, coordinate_type y ) { m_elem->set_shadow(x, y); } // scene_element::set_shadow() /*----------------------------------------------------------------------------*/ /** * \brief Get the opacity of the shadow. */ double bear::visual::scene_element::get_shadow_opacity() const { return m_elem->get_shadow_opacity(); } // scene_element::get_shadow_opacity() /*----------------------------------------------------------------------------*/ /** * \brief Set the opacity of the shadow. * \param o The new opacity. */ void bear::visual::scene_element::set_shadow_opacity( double o ) { m_elem->set_shadow_opacity(o); } // scene_element::set_shadow_opacity() /*----------------------------------------------------------------------------*/ /** * \brief Set the factor applied to the element when rendered. * \param x The factor on the x-axis. * \param y The factor on the y-axis. */ void bear::visual::scene_element::set_scale_factor( double x, double y ) { m_elem->set_scale_factor(x, y); } // scene_element::set_scale_factor() /*----------------------------------------------------------------------------*/ /** * \brief Set the factor applied to the element when rendered. * \param r The factor on both axis. */ void bear::visual::scene_element::set_scale_factor( double r ) { m_elem->set_scale_factor(r, r); } // scene_element::set_scale_factor() /*----------------------------------------------------------------------------*/ /** * \brief Get the factor applied on the x-axis to the element when rendered. */ double bear::visual::scene_element::get_scale_factor_x() const { return m_elem->get_scale_factor_x(); } // scene_element::get_scale_factor_x() /*----------------------------------------------------------------------------*/ /** * \brief Get the factor applied on the y-axis to the element when rendered. */ double bear::visual::scene_element::get_scale_factor_y() const { return m_elem->get_scale_factor_y(); } // scene_element::get_scale_factor_y() /*----------------------------------------------------------------------------*/ /** * \brief Get the width of the element (before the scaling factor). */ bear::visual::size_type bear::visual::scene_element::get_element_width() const { if ( get_scale_factor_x() == 0 ) return get_bounding_box().width(); else return get_bounding_box().width() / get_scale_factor_x(); } // scene_element::get_element_width() /*----------------------------------------------------------------------------*/ /** * \brief Get the height of the element (before the scaling factor). */ bear::visual::size_type bear::visual::scene_element::get_element_height() const { if ( get_scale_factor_y() == 0 ) return get_bounding_box().height(); else return get_bounding_box().height() / get_scale_factor_y(); } // scene_element::get_element_height() /*----------------------------------------------------------------------------*/ /** * \brief Get the width of the element (with the scaling factor). */ bear::visual::size_type bear::visual::scene_element::get_width() const { return get_bounding_box().width(); } // scene_element::get_width() /*----------------------------------------------------------------------------*/ /** * \brief Get the height of the element (with the scaling factor). */ bear::visual::size_type bear::visual::scene_element::get_height() const { return get_bounding_box().height(); } // scene_element::get_height() /*----------------------------------------------------------------------------*/ /** * \brief Set the attributes applied to the element when rendering. * \param a The attributes. */ void bear::visual::scene_element::set_rendering_attributes ( const bitmap_rendering_attributes& a ) { m_elem->set_rendering_attributes(a); } // scene_element::get_rendering_attributes() /*----------------------------------------------------------------------------*/ /** * \brief Get the attributes applied to the element when rendering. */ const bear::visual::bitmap_rendering_attributes& bear::visual::scene_element::get_rendering_attributes() const { return m_elem->get_rendering_attributes(); } // scene_element::get_rendering_attributes() /*----------------------------------------------------------------------------*/ /** * \brief Get the attributes applied to the element when rendering. */ bear::visual::bitmap_rendering_attributes& bear::visual::scene_element::get_rendering_attributes() { return m_elem->get_rendering_attributes(); } // scene_element::get_rendering_attributes() /*----------------------------------------------------------------------------*/ /** * \brief Tells if the element must always be displayed. */ bool bear::visual::scene_element::always_displayed() const { return m_elem->always_displayed(); } // scene_element::always_displayed() plee-the-bear-20251226/bear-engine/core/src/visual/code/scene_element_sequence.cpp000066400000000000000000000143451512343254000277110ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the visual::scene_element_sequence. * \author Julien Jorge */ #include "visual/scene_element_sequence.hpp" #include "visual/base_screen.hpp" #include "visual/scene_element.hpp" #include /*----------------------------------------------------------------------------*/ /** * \brief Default constructor. The screen coordinates of this element are set to * zero. */ bear::visual::scene_element_sequence::scene_element_sequence() : base_scene_element(0, 0) { } // scene_element_sequence::scene_element_sequence() /*----------------------------------------------------------------------------*/ /** * \brief Allocate a copy of this instance. */ bear::visual::base_scene_element* bear::visual::scene_element_sequence::clone() const { return new scene_element_sequence(*this); } // scene_element_sequence::clone() /*----------------------------------------------------------------------------*/ /** * \brief Insert an element at the end of the sequence. * \param e The element to insert. */ void bear::visual::scene_element_sequence::push_back( const scene_element& e ) { m_element.push_back(e); } // scene_element_sequence::push_back() /*----------------------------------------------------------------------------*/ /** * \brief Insert an element at the beginning of the sequence. * \param e The element to insert. */ void bear::visual::scene_element_sequence::push_front( const scene_element& e ) { m_element.push_front(e); } // scene_element_sequence::push_front() /*----------------------------------------------------------------------------*/ /** * \brief Get a rectangle where the element is completely opaque. */ bear::visual::rectangle_type bear::visual::scene_element_sequence::get_opaque_box() const { if ( m_element.empty() || (get_rendering_attributes().get_opacity() != 1) ) return rectangle_type(0, 0, 0, 0); else { sequence_type::const_iterator it( m_element.begin() ); rectangle_type result( it->get_opaque_box() ); ++it; for ( ; it!=m_element.end(); ++it ) { const rectangle_type b(it->get_opaque_box()); if ( b.area() > result.area() ) result = b; } coordinate_type left ( get_position().x + result.left() * get_scale_factor_x() ); coordinate_type bottom ( get_position().y + result.bottom() * get_scale_factor_y()); coordinate_type w( result.width() * get_scale_factor_x() ); coordinate_type h( result.height() * get_scale_factor_y() ); result.set(left, bottom, left + w, bottom + h); return result; } } // scene_element_sequence::get_opaque_box() /*----------------------------------------------------------------------------*/ /** * \brief Get a rectangle bounding the elements. */ bear::visual::rectangle_type bear::visual::scene_element_sequence::get_bounding_box() const { rectangle_type result(0, 0, 0, 0); sequence_type::const_iterator it( m_element.begin() ); bool initialised(false); while ( !initialised && (it!=m_element.end()) ) { const rectangle_type b(it->get_bounding_box()); if ( (b.width() > 0) && (b.height() > 0) ) { result = b; initialised = true; } ++it; } while ( it!=m_element.end() ) { const rectangle_type b(it->get_bounding_box()); if ( (b.width() > 0) && (b.height() > 0) ) result = result.join(b); ++it; } if (initialised) { coordinate_type left ( get_position().x + result.left() * get_scale_factor_x() ); coordinate_type bottom ( get_position().y + result.bottom() * get_scale_factor_y() ); coordinate_type w( result.width() * get_scale_factor_x() ); coordinate_type h( result.height() * get_scale_factor_y() ); result.set(left, bottom, left + w, bottom + h); } return result; } // scene_element_sequence::get_bounding_box() /*----------------------------------------------------------------------------*/ /** * \brief Split the sequence in sub sequences. * \param boxes The boxes describing how to split the sequence. * \param output The resulting element (they are inserted to the back). */ void bear::visual::scene_element_sequence::burst ( const rectangle_list& boxes, scene_element_list& output ) const { output.push_back( scene_element(*this) ); } // scene_element_sequence::burst() /*----------------------------------------------------------------------------*/ /** * \brief Render the element_sequence on a screen. * \param scr The screen on which we render the element_sequence. */ void bear::visual::scene_element_sequence::render( base_screen& scr ) const { sequence_type::const_iterator it; for ( it=m_element.begin(); it!=m_element.end(); ++it ) { const double sx( get_scale_factor_x() ); const double sy( get_scale_factor_y() ); scene_element e(*it); e.get_rendering_attributes().combine(get_rendering_attributes()); e.set_scale_factor ( e.get_scale_factor_x() * sx, e.get_scale_factor_y() * sy ); e.set_position ( get_position().x + e.get_position().x * sx, get_position().y + e.get_position().y * sy ); if ( e.has_shadow() ) { scene_element shadow( e ); shadow.get_rendering_attributes().set_intensity(0, 0, 0); shadow.get_rendering_attributes().set_opacity ( e.get_rendering_attributes().get_opacity() * e.get_shadow_opacity() ); shadow.set_position( e.get_position() + e.get_shadow() ); shadow.render( scr ); } e.render( scr ); } } // scene_element_sequence::render() /*----------------------------------------------------------------------------*/ /** * \brief Tells if the element must always be displayed. */ bool bear::visual::scene_element_sequence::always_displayed() const { sequence_type::const_iterator it; for ( it=m_element.begin(); it!=m_element.end(); ++it ) if ( it->always_displayed() ) return true; return false; } // scene_element_sequence::always_displayed() plee-the-bear-20251226/bear-engine/core/src/visual/code/scene_line.cpp000066400000000000000000000100661512343254000253130ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the visual::scene_line. * \author Julien Jorge */ #include "visual/scene_line.hpp" #include "visual/base_screen.hpp" #include "visual/scene_element.hpp" #include /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param x X-position of the origin of the line on the screen. * \param y Y-position of the origin of the line on the screen. * \param color The color of the line. * \param p The points of the line. * \param w The width of the line. */ bear::visual::scene_line::scene_line ( coordinate_type x, coordinate_type y, const color_type& color, const std::vector& p, double w ) : base_scene_element(x, y), m_color(color), m_points(p), m_width(w) { } // scene_line::scene_line() /*----------------------------------------------------------------------------*/ /** * \brief Allocate a copy of this instance. */ bear::visual::base_scene_element* bear::visual::scene_line::clone() const { return new scene_line(*this); } // scene_line::clone() /*----------------------------------------------------------------------------*/ /** * \brief Get a rectangle where the line is completely opaque. */ bear::visual::rectangle_type bear::visual::scene_line::get_opaque_box() const { return rectangle_type(0, 0, 0, 0); } // scene_line::get_opaque_box() /*----------------------------------------------------------------------------*/ /** * \brief Get a rectangle bounding the line. */ bear::visual::rectangle_type bear::visual::scene_line::get_bounding_box() const { if ( m_points.empty() ) return rectangle_type(0, 0, 0, 0); coordinate_type min_x = m_points[0].x - m_width / 2; coordinate_type min_y = m_points[0].y - m_width / 2; coordinate_type max_x = m_points[0].x + m_width / 2; coordinate_type max_y = m_points[0].y + m_width / 2; for (unsigned int i=0; i!=m_points.size(); ++i) { if ( m_points[i].x - m_width / 2 < min_x ) min_x = m_points[i].x - m_width / 2; if ( m_points[i].y - m_width / 2 < min_y ) min_y = m_points[i].y - m_width / 2; if ( m_points[i].x + m_width / 2 > max_x ) max_x = m_points[i].x + m_width / 2; if ( m_points[i].y + m_width / 2 > max_y ) max_y = m_points[i].y + m_width / 2; } min_x = get_position().x + min_x * get_scale_factor_x(); min_y = get_position().y + min_y * get_scale_factor_y(); max_x = get_position().x + max_x * get_scale_factor_x(); max_y = get_position().y + max_y * get_scale_factor_y(); return rectangle_type(min_x, min_y, max_x, max_y); } // scene_line::get_bounding_box() /*----------------------------------------------------------------------------*/ /** * \brief Split the line in sub lines. * \param boxes The boxes describing how to split the line. * \param output The resulting lines (they are inserted to the back). */ void bear::visual::scene_line::burst ( const rectangle_list& boxes, scene_element_list& output ) const { output.push_back( scene_element(*this) ); } // scene_line::burst() /*----------------------------------------------------------------------------*/ /** * \brief Render the line on a screen. * \param scr The screen on which we render the line. */ void bear::visual::scene_line::render( base_screen& scr ) const { std::vector p(m_points); for ( std::size_t i=0; i!=p.size(); ++i ) { p[i].x = get_position().x + p[i].x * get_scale_factor_x(); p[i].y = get_position().y + p[i].y * get_scale_factor_y(); } color_type c( m_color ); c.components.red *= get_rendering_attributes().get_red_intensity(); c.components.green *= get_rendering_attributes().get_green_intensity(); c.components.blue *= get_rendering_attributes().get_blue_intensity(); c.components.alpha *= get_rendering_attributes().get_opacity(); scr.draw_line(c, p, m_width); } // scene_line::render() plee-the-bear-20251226/bear-engine/core/src/visual/code/scene_polygon.cpp000066400000000000000000000076041512343254000260570ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the visual::scene_polygon. * \author Julien Jorge */ #include "visual/scene_polygon.hpp" #include "visual/base_screen.hpp" #include "visual/scene_element.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param x X-position of the origin of the polygon on the screen. * \param y Y-position of the origin of the polygon on the screen. * \param color The color of the polygon. * \param p The points of the polygon. */ bear::visual::scene_polygon::scene_polygon ( coordinate_type x, coordinate_type y, const color_type& color, const std::vector& p ) : base_scene_element(x, y), m_color(color), m_points(p) { } // scene_polygon::scene_polygon() /*----------------------------------------------------------------------------*/ /** * \brief Allocate a copy of this instance. */ bear::visual::base_scene_element* bear::visual::scene_polygon::clone() const { return new scene_polygon(*this); } // scene_polygon::clone() /*----------------------------------------------------------------------------*/ /** * \brief Get a rectangle where the polygon is completely opaque. */ bear::visual::rectangle_type bear::visual::scene_polygon::get_opaque_box() const { return rectangle_type(0, 0, 0, 0); } // scene_polygon::get_opaque_box() /*----------------------------------------------------------------------------*/ /** * \brief Get a rectangle bounding the polygon. */ bear::visual::rectangle_type bear::visual::scene_polygon::get_bounding_box() const { if ( m_points.empty() ) return rectangle_type(0, 0, 0, 0); coordinate_type min_x = m_points[0].x; coordinate_type min_y = m_points[0].y; coordinate_type max_x = min_x; coordinate_type max_y = min_y; for (unsigned int i=0; i!=m_points.size(); ++i) { if ( m_points[i].x < min_x ) min_x = m_points[i].x; if ( m_points[i].y < min_y ) min_y = m_points[i].y; if ( m_points[i].x > max_x ) max_x = m_points[i].x; if ( m_points[i].y > max_y ) max_y = m_points[i].y; } min_x = get_position().x + min_x * get_scale_factor_x(); min_y = get_position().y + min_y * get_scale_factor_y(); max_x = get_position().x + max_x * get_scale_factor_x(); max_y = get_position().y + max_y * get_scale_factor_y(); return rectangle_type(min_x, min_y, max_x, max_y); } // scene_polygon::get_bounding_box() /*----------------------------------------------------------------------------*/ /** * \brief Split the polygon in sub polygons. * \param boxes The boxes describing how to split the polygon. * \param output The resulting polygons (they are inserted to the front). */ void bear::visual::scene_polygon::burst ( const rectangle_list& boxes, scene_element_list& output ) const { output.push_back( scene_element(*this) ); } // scene_polygon::burst() /*----------------------------------------------------------------------------*/ /** * \brief Render the polygon on a screen. * \param scr The screen on which we render the polygon. */ void bear::visual::scene_polygon::render( base_screen& scr ) const { std::vector p(m_points); for ( std::size_t i=0; i!=p.size(); ++i ) { p[i].x = get_position().x + p[i].x * get_scale_factor_x(); p[i].y = get_position().y + p[i].y * get_scale_factor_y(); } color_type c( m_color ); c.components.red *= get_rendering_attributes().get_red_intensity(); c.components.green *= get_rendering_attributes().get_green_intensity(); c.components.blue *= get_rendering_attributes().get_blue_intensity(); c.components.alpha *= get_rendering_attributes().get_opacity(); scr.draw_polygon(c, p); } // scene_polygon::render() plee-the-bear-20251226/bear-engine/core/src/visual/code/scene_rectangle.cpp000066400000000000000000000105441512343254000263310ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the visual::scene_rectangle. * \author Julien Jorge */ #include "visual/scene_rectangle.hpp" #include "visual/base_screen.hpp" #include "visual/scene_element.hpp" #include /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param x X-position of the origin of the rectangle on the screen. * \param y Y-position of the origin of the rectangle on the screen. * \param color The color of the rectangle. * \param r The rectangle. * \param fill Tell if the rectangle is filled or not. * \param border_weight The width of the border for a not filled rectangle. */ bear::visual::scene_rectangle::scene_rectangle ( coordinate_type x, coordinate_type y, const color_type& color, const rectangle_type& r, bool fill, size_type border_weight ) : base_scene_element(x, y), m_color(color), m_rectangle(r), m_fill(fill), m_border_weight(border_weight) { } // scene_rectangle::scene_rectangle() /*----------------------------------------------------------------------------*/ /** * \brief Allocate a copy of this instance. */ bear::visual::base_scene_element* bear::visual::scene_rectangle::clone() const { return new scene_rectangle(*this); } // scene_rectangle::clone() /*----------------------------------------------------------------------------*/ /** * \brief Get a rectangle where the rectangle is completely opaque. */ bear::visual::rectangle_type bear::visual::scene_rectangle::get_opaque_box() const { rectangle_type result(0, 0, 0, 0); if ( m_fill && (get_rendering_attributes().get_opacity() == 1) && ( m_color.components.alpha == std::numeric_limits::max() ) ) result = get_bounding_box(); return result; } // scene_rectangle::get_opaque_box() /*----------------------------------------------------------------------------*/ /** * \brief Get a rectangle bounding the rectangle. */ bear::visual::rectangle_type bear::visual::scene_rectangle::get_bounding_box() const { position_type p( get_position() + m_rectangle.bottom_left() ); return rectangle_type ( p.x, p.y, p.x + m_rectangle.width() * get_scale_factor_x(), p.y + m_rectangle.height() * get_scale_factor_y() ); } // scene_rectangle::get_bounding_box() /*----------------------------------------------------------------------------*/ /** * \brief Split the rectangle in sub rectangles. * \param boxes The boxes describing how to split the rectangle. * \param output The resulting rectangles (they are inserted to the back). */ void bear::visual::scene_rectangle::burst ( const rectangle_list& boxes, scene_element_list& output ) const { if ( !m_fill ) { output.push_back( *this ); return; } rectangle_type my_rect(get_bounding_box()); for (rectangle_list::const_iterator it=boxes.begin(); it!=boxes.end(); ++it) if ( my_rect.intersects(*it) ) { rectangle_type r( my_rect.intersection(*it) ); if ( !r.empty() ) { scene_rectangle n(0, 0, m_color, r, m_fill); n.set_rendering_attributes(get_rendering_attributes()); n.set_scale_factor(1, 1); output.push_back( n ); } } } // scene_rectangle::burst() /*----------------------------------------------------------------------------*/ /** * \brief Render the rectangle on a screen. * \param scr The screen on which we render the rectangle. */ void bear::visual::scene_rectangle::render( base_screen& scr ) const { rectangle_type my_rect(get_bounding_box()); std::vector p(4); p[0] = my_rect.bottom_left(); p[1] = my_rect.top_left(); p[2] = my_rect.top_right(); p[3] = my_rect.bottom_right(); color_type c( m_color ); c.components.red *= get_rendering_attributes().get_red_intensity(); c.components.green *= get_rendering_attributes().get_green_intensity(); c.components.blue *= get_rendering_attributes().get_blue_intensity(); c.components.alpha *= get_rendering_attributes().get_opacity(); if (m_fill) scr.draw_polygon(c, p); else { p.push_back(p[0]); scr.draw_line(c, p, m_border_weight); } } // scene_rectangle::render() plee-the-bear-20251226/bear-engine/core/src/visual/code/scene_shader_pop.cpp000066400000000000000000000050601512343254000265060ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the visual::scene_shader_pop class. * \author Julien Jorge */ #include "visual/scene_shader_pop.hpp" #include "visual/base_screen.hpp" #include "visual/scene_element.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ bear::visual::scene_shader_pop::scene_shader_pop() : base_scene_element(0, 0) { } // scene_shader_pop::scene_shader_pop() /*----------------------------------------------------------------------------*/ /** * \brief Allocates a copy of this instance. */ bear::visual::base_scene_element* bear::visual::scene_shader_pop::clone() const { return new scene_shader_pop(*this); } // scene_shader_pop::clone() /*----------------------------------------------------------------------------*/ /** * \brief Gets a rectangle where the element is completely opaque. */ bear::visual::rectangle_type bear::visual::scene_shader_pop::get_opaque_box() const { return rectangle_type(0, 0, 0, 0); } // scene_shader_pop::get_opaque_box() /*----------------------------------------------------------------------------*/ /** * \brief Gets a rectangle bounding the element. */ bear::visual::rectangle_type bear::visual::scene_shader_pop::get_bounding_box() const { return rectangle_type(0, 0, 0, 0); } // scene_shader_pop::get_bounding_box() /*----------------------------------------------------------------------------*/ /** * \brief Splits the element in sub elements. * \param boxes The boxes describing how to split the element. * \param output The resulting elements (they are inserted to the back). */ void bear::visual::scene_shader_pop::burst ( const rectangle_list& boxes, scene_element_list& output ) const { output.push_back( scene_element(*this) ); } // scene_shader_pop::burst() /*----------------------------------------------------------------------------*/ /** * \brief Render the element on a screen. * \param scr The screen on which we render the element. */ void bear::visual::scene_shader_pop::render( base_screen& scr ) const { scr.pop_shader(); } // scene_shader_pop::render() /*----------------------------------------------------------------------------*/ /** * \brief Tells if the element must always be displayed. */ bool bear::visual::scene_shader_pop::always_displayed() const { return true; } // scene_shader_pop::always_displayed() plee-the-bear-20251226/bear-engine/core/src/visual/code/scene_shader_push.cpp000066400000000000000000000052601512343254000266710ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the visual::scene_shader_push class. * \author Julien Jorge */ #include "visual/scene_shader_push.hpp" #include "visual/base_screen.hpp" #include "visual/scene_element.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param p The shader program to use for the next render calls. */ bear::visual::scene_shader_push::scene_shader_push( shader_program p ) : base_scene_element(0, 0), m_shader(p) { } // scene_shader_push::scene_shader_push() /*----------------------------------------------------------------------------*/ /** * \brief Allocates a copy of this instance. */ bear::visual::base_scene_element* bear::visual::scene_shader_push::clone() const { return new scene_shader_push(*this); } // scene_shader_push::clone() /*----------------------------------------------------------------------------*/ /** * \brief Gets a rectangle where the element is completely opaque. */ bear::visual::rectangle_type bear::visual::scene_shader_push::get_opaque_box() const { return rectangle_type(0, 0, 0, 0); } // scene_shader_push::get_opaque_box() /*----------------------------------------------------------------------------*/ /** * \brief Gets a rectangle bounding the element. */ bear::visual::rectangle_type bear::visual::scene_shader_push::get_bounding_box() const { return rectangle_type( 0, 0, 0, 0 ); } // scene_shader_push::get_bounding_box() /*----------------------------------------------------------------------------*/ /** * \brief Splits the element in sub elements. * \param boxes The boxes describing how to split the element. * \param output The resulting elements (they are inserted to the back). */ void bear::visual::scene_shader_push::burst ( const rectangle_list& boxes, scene_element_list& output ) const { output.push_back( scene_element(*this) ); } // scene_shader_push::burst() /*----------------------------------------------------------------------------*/ /** * \brief Render the element on a screen. * \param scr The screen on which we render the element. */ void bear::visual::scene_shader_push::render( base_screen& scr ) const { scr.push_shader( m_shader ); } // scene_shader_push::render() /*----------------------------------------------------------------------------*/ /** * \brief Tells if the element must always be displayed. */ bool bear::visual::scene_shader_push::always_displayed() const { return true; } // scene_shader_push::always_displayed() plee-the-bear-20251226/bear-engine/core/src/visual/code/scene_sprite.cpp000066400000000000000000000321651512343254000256760ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the visual::scene_sprite. * \author Julien Jorge */ #include "visual/scene_sprite.hpp" #include "visual/base_screen.hpp" #include "visual/scene_element.hpp" #include #include /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param x X-position of the sprite on the screen. * \param y Y-position of the sprite on the screen. * \param s The sprite to draw. */ bear::visual::scene_sprite::scene_sprite ( coordinate_type x, coordinate_type y, const sprite& s ) : base_scene_element(x, y), m_sprite(s) { } // scene_sprite::scene_sprite() /*----------------------------------------------------------------------------*/ /** * \brief Allocate a copy of this instance. */ bear::visual::base_scene_element* bear::visual::scene_sprite::clone() const { return new scene_sprite(*this); } // scene_sprite::clone() /*----------------------------------------------------------------------------*/ /** * \brief Get a rectangle where the sprite is completely opaque. */ bear::visual::rectangle_type bear::visual::scene_sprite::get_opaque_box() const { bitmap_rendering_attributes attr(get_rendering_attributes()); attr.combine(m_sprite); if ( ( attr.get_opacity() != 1) || (attr.get_angle() != 0) ) return rectangle_type(0, 0, 0, 0); else return scale_rectangle( m_sprite.get_opaque_rectangle() ); } // scene_sprite::get_opaque_box() /*----------------------------------------------------------------------------*/ /** * \brief Get a rectangle bounding the sprite. */ bear::visual::rectangle_type bear::visual::scene_sprite::get_bounding_box() const { rectangle_type result; sprite s(m_sprite); s.combine( get_rendering_attributes() ); const coordinate_type w( s.width() * get_scale_factor_x() ); const coordinate_type h( s.height() * get_scale_factor_y() ); if ( s.get_angle() != 0 ) { position_type left_bottom( std::numeric_limits::max(), std::numeric_limits::max() ); position_type right_top( 0, 0 ); position_type center ( get_position().x + w / 2, get_position().y + h / 2 ); update_side_box( position_type(get_position().x, get_position().y), center, left_bottom, right_top ); update_side_box( position_type(get_position().x + w, get_position().y), center, left_bottom, right_top ); update_side_box( position_type(get_position().x, get_position().y + h), center, left_bottom, right_top ); update_side_box ( position_type(get_position().x + w, get_position().y + h), center, left_bottom, right_top ); result = rectangle_type( left_bottom, right_top ); } else result = rectangle_type ( get_position().x, get_position().y, get_position().x + w, get_position().y + h ); CLAW_POSTCOND( get_opaque_box().empty() || result.includes( get_opaque_box() ) ); return result; } // scene_sprite::get_bounding_box() /*----------------------------------------------------------------------------*/ /** * \brief Split the sprite in sub sprites. * \param boxes The boxes describing how to split the sprite. * \param output The resulting sprites (they are inserted to the back). */ void bear::visual::scene_sprite::burst ( const rectangle_list& boxes, scene_element_list& output ) const { bitmap_rendering_attributes attr(get_rendering_attributes()); attr.combine(m_sprite); if ( (attr.get_angle() != 0) || attr.is_mirrored() || attr.is_flipped() ) output.push_back( scene_element(*this) ); else { rectangle_list::const_iterator it; const rectangle_type clip_box ( scale_rectangle ( rectangle_type ( 0, 0, m_sprite.clip_rectangle().width, m_sprite.clip_rectangle().height ) ) ); for (it=boxes.begin(); it!=boxes.end(); ++it) if ( clip_box.intersects(*it) ) { const rectangle_type clip_inter = clip_box.intersection(*it); if( !clip_inter.empty() ) output.push_back( burst( *it, clip_inter ) ); } } } // scene_sprite::burst() /*----------------------------------------------------------------------------*/ /** * \brief Render the sprite on a screen. * \param scr The screen on which we render the sprite. */ void bear::visual::scene_sprite::render( base_screen& scr ) const { if ( !m_sprite.is_valid() ) return; sprite s(m_sprite); s.combine( get_rendering_attributes() ); s.set_size ( s.width() * get_scale_factor_x(), s.height() * get_scale_factor_y() ); scr.render(get_position(), s); } // scene_sprite::render() /*----------------------------------------------------------------------------*/ /** * \brief Change the sprite of the visual. * \param spr The new sprite. */ void bear::visual::scene_sprite::set_sprite( const sprite& spr ) { m_sprite = spr; } // scene_sprite::set_sprite() /*----------------------------------------------------------------------------*/ /** * \brief Update sides of bounding box when we apply a rotation. * * \param pos The point to rotate. * \param center The center of the rotation. * \param left_bottom (out) The left_bottom position of the bounding box. * \param right_top (out) The right_top position of the bounding box. */ void bear::visual::scene_sprite::update_side_box ( const position_type& pos, const position_type& center, position_type& left_bottom, position_type& right_top ) const { sprite s( m_sprite ); s.combine( get_rendering_attributes() ); const double a = s.get_angle(); claw::math::coordinate_2d result(pos); result.rotate(center, a); if ( result.x < left_bottom.x ) left_bottom.x = result.x; if ( result.y < left_bottom.y ) left_bottom.y = result.y; if ( result.x > right_top.x ) right_top.x = result.x; if ( result.y > right_top.y ) right_top.y = result.y; } // scene_sprite::update_side_box() /*----------------------------------------------------------------------------*/ /** * \brief Swap two values for which the direction of the axis has been changed. * \param a The first value. * \param b The second value. * \param z The new zero. */ void bear::visual::scene_sprite::flip_values_on_axis ( coordinate_type& a, coordinate_type& b, coordinate_type z ) const { const coordinate_type tmp(a); a = z - b; b = z - tmp; } // scene_sprite::flip_values_on_axis() /*----------------------------------------------------------------------------*/ /** * \brief Convert a rectangle in the coordinates of the sprite's clip rectangle * into the equivalent rectangle for the scene sprite. The size of the * rectangle is adapted, the flip and mirror flags too. * \param r The rectangle to convert. */ bear::visual::rectangle_type bear::visual::scene_sprite::scale_rectangle( const rectangle_type& r ) const { const double fx = ( m_sprite.clip_rectangle().width == 0 ) ? 0 : ( m_sprite.width() / m_sprite.clip_rectangle().width * get_scale_factor_x() ); const double fy = ( m_sprite.clip_rectangle().height == 0 ) ? 0 : ( m_sprite.height() / m_sprite.clip_rectangle().height * get_scale_factor_y() ); coordinate_type left = r.left() * fx; coordinate_type bottom = r.bottom() * fy; coordinate_type right = r.right() * fx; coordinate_type top = r.top() * fy; bitmap_rendering_attributes attr( get_rendering_attributes() ); attr.combine(m_sprite); if ( attr.is_mirrored() ) flip_values_on_axis ( left, right, m_sprite.width() * get_scale_factor_x() ); if ( attr.is_flipped() ) flip_values_on_axis ( bottom, top, m_sprite.height() * get_scale_factor_y() ); left += get_position().x; right += get_position().x; top += get_position().y; bottom += get_position().y; return rectangle_type( left, bottom, right, top ); } // scene_sprite::scale_rectangle() /*----------------------------------------------------------------------------*/ /** * \brief Convert a rectangle in the coordinates of the scene element into the * equivalent rectangle in the sprite's clip rectangle. The size of the * rectangle is adapted, the flip and mirror flags too. * \param r The rectangle to convert. */ bear::visual::rectangle_type bear::visual::scene_sprite::unscale_rectangle( const rectangle_type& r ) const { const double fx = m_sprite.width() / m_sprite.clip_rectangle().width * get_scale_factor_x(); const double fy = m_sprite.height() / m_sprite.clip_rectangle().height * get_scale_factor_y(); coordinate_type left = r.left() - get_position().x; coordinate_type bottom = r.bottom() - get_position().y; coordinate_type right = r.right() - get_position().x; coordinate_type top = r.top() - get_position().y; left /= fx; right /= fx; top /= fy; bottom /= fy; bitmap_rendering_attributes attr( get_rendering_attributes() ); attr.combine(m_sprite); if ( attr.is_mirrored() ) flip_values_on_axis ( left, right, m_sprite.clip_rectangle().width ); if ( attr.is_flipped() ) flip_values_on_axis ( bottom, top, m_sprite.clip_rectangle().height ); return rectangle_type( left, bottom, right, top ); } // scene_sprite::unscale_rectangle() /*----------------------------------------------------------------------------*/ /** * \brief Split the sprite in a sub sprite. * \param box The box describing how to split the sprite. * \param clip_inter The intersection of box and clip_box in the global * coordinates. */ bear::visual::scene_sprite bear::visual::scene_sprite::burst ( const rectangle_type& box, const rectangle_type& clip_inter ) const { // Get the sub rectangle of the clip rectangle of the resulting sprite, // relatively to the clip rectangle of m_sprite. const rectangle_type unscaled_clip = unscale_rectangle( clip_inter ); sprite spr(m_sprite); // Find the part of the sprite to render in the result. spr.set_clip_rectangle( get_burst_clip( unscaled_clip ) ); spr.set_opaque_rectangle( get_burst_opaque_box( box, unscaled_clip ) ); // Adjust the size of the rendered sprite. spr.set_size( clip_inter.width(), clip_inter.height() ); scene_sprite result(*this); result.set_sprite( spr ); result.set_scale_factor( 1, 1 ); coordinate_type x = clip_inter.left(); coordinate_type y = clip_inter.bottom(); if ( x - get_position().x < 0.1 ) x = get_position().x; if ( y - get_position().y < 0.1 ) y = get_position().y; result.set_position( x, y ); return result; } // scene_sprite::burst() /*----------------------------------------------------------------------------*/ /** * \brief Get the opaque box of the sprite after being burst. * \param box The box describing how to split the sprite. * \param unscaled_clip The intersection of box and the clip rectangle of the * sprites in the coordinates of the sprite's source image. */ bear::visual::rectangle_type bear::visual::scene_sprite::get_burst_opaque_box ( const rectangle_type& box, const rectangle_type& unscaled_clip ) const { rectangle_type opaque; if ( get_opaque_box().intersects( box ) ) { const rectangle_type unscaled_opaque = unscale_rectangle( get_opaque_box().intersection( box ) ); const coordinate_type x = unscaled_opaque.left() - unscaled_clip.left(); const coordinate_type y = unscaled_opaque.bottom() - unscaled_clip.bottom(); opaque = rectangle_type ( x, y, x + unscaled_opaque.width(), y + unscaled_opaque.height() ); } else opaque = rectangle_type(0, 0, 0, 0); return opaque; } // scene_sprite::get_burst_opaque_box() /*----------------------------------------------------------------------------*/ /** * \brief Get the clip rectangle of the sprite after being burst. * \param unscaled_clip The sub area of the clip rectangle of m_sprite, * relatively to this clip rectangle. */ claw::math::rectangle bear::visual::scene_sprite::get_burst_clip ( const rectangle_type& unscaled_clip ) const { claw::math::rectangle clip ( m_sprite.clip_rectangle().position.x + unscaled_clip.left(), m_sprite.clip_rectangle().position.y + m_sprite.clip_rectangle().height - unscaled_clip.top(), unscaled_clip.width() + 1, unscaled_clip.height() + 1 ); if ( clip.position.x < m_sprite.clip_rectangle().position.x ) clip.position.x = m_sprite.clip_rectangle().position.x; if ( clip.position.y < m_sprite.clip_rectangle().position.y ) clip.position.y = m_sprite.clip_rectangle().position.y; const coordinate_type w = m_sprite.clip_rectangle().width - (clip.position.x - m_sprite.clip_rectangle().position.x); if ( clip.width > w ) clip.width = w; const coordinate_type h = m_sprite.clip_rectangle().height - (clip.position.y - m_sprite.clip_rectangle().position.y); if ( clip.height > h ) clip.height = h; return clip; } // scene_sprite::get_burst_clip() plee-the-bear-20251226/bear-engine/core/src/visual/code/scene_star.cpp000066400000000000000000000133561512343254000253420ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::scene_star class. * \author Julien Jorge */ #include "visual/scene_star.hpp" #include "visual/base_screen.hpp" #include /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param x X-position of the element on the screen. * \param y Y-position of the element on the screen. * \param color The color of the border of the star. * \param s The star to display. * \param border_width The width of the border of the star. * \param fill_color The color of the inside of the star. */ bear::visual::scene_star::scene_star ( coordinate_type x, coordinate_type y, const color_type& color, const star& s, double border_width, const color_type& fill_color ) : base_scene_element(x, y), m_color(color), m_border_width(border_width), m_fill_color(fill_color), m_star(s) { } // scene_star::scene_star() /*----------------------------------------------------------------------------*/ /** * \brief Allocate a copy of this element. */ bear::visual::base_scene_element* bear::visual::scene_star::clone() const { return new scene_star(*this); } // scene_star::clone() /*----------------------------------------------------------------------------*/ /** * \brief Get a box where the element is fully opaque. */ bear::visual::rectangle_type bear::visual::scene_star::get_opaque_box() const { if ( (m_fill_color.components.alpha != std::numeric_limits::max()) || ( get_rendering_attributes().get_opacity() != 1 ) ) return rectangle_type(0, 0, 0, 0); else { const position_type c = get_center(); const size_type aw = m_star.get_ratio() * std::cos(3.14159/4); const size_type ah = m_star.get_ratio() * std::sin(3.14159/4); const size_type w = get_rendering_attributes().width() * aw / 2 * get_scale_factor_x(); const size_type h = get_rendering_attributes().height() * ah / 2 * get_scale_factor_y(); return rectangle_type( c.x - w, c.y - h, c.x + w, c.y + h ); } } // base_scene_element::get_opaque_box() /*----------------------------------------------------------------------------*/ /** * \brief Render the element on the screen. * \param scr The screen on which the star is rendered. */ void bear::visual::scene_star::render( base_screen& scr ) const { std::vector coordinates; compute_coordinates( coordinates ); render_inside( scr, coordinates ); render_border( scr, coordinates ); } // scene_star::render() /*----------------------------------------------------------------------------*/ /** * \brief Get the position of the center of the star. */ bear::visual::position_type bear::visual::scene_star::get_center() const { const size_type w = get_rendering_attributes().width() * get_scale_factor_x(); const size_type h = get_rendering_attributes().height() * get_scale_factor_y(); return get_position() + position_type(w, h) / 2; } // scene_star::get_center() /*----------------------------------------------------------------------------*/ /** * \brief Render the inside of the star on the screen. * \param scr The screen on which the star is rendered. * \param coordinates The coordinates of the vertices of the star. */ void bear::visual::scene_star::render_inside ( base_screen& scr, const std::vector& coordinates ) const { if ( m_fill_color.components.alpha == 0 ) return; const color_type c = get_rendering_attributes().convert_color(m_fill_color); std::vector branch(4); branch[0] = get_center(); branch[1] = coordinates[1]; branch[2] = coordinates[0]; branch[3] = coordinates.back(); scr.draw_polygon( c, branch ); for ( std::size_t i=2; i& coordinates ) const { scr.draw_line ( get_rendering_attributes().convert_color(m_color), coordinates, m_border_width, true ); } // scene_star::render_border() /*----------------------------------------------------------------------------*/ /** * \brief Compute the coordinates of the vertices. * \param coordinates (out) The coordinates. */ void bear::visual::scene_star::compute_coordinates ( std::vector& coordinates ) const { const position_type c = get_center(); const size_type w = (get_rendering_attributes().width() * get_scale_factor_x()) / 2; const size_type h = (get_rendering_attributes().height() * get_scale_factor_y()) / 2; const double a = get_rendering_attributes().get_angle(); const double dir_x = get_rendering_attributes().is_mirrored() ? -1 : 1; const double dir_y = get_rendering_attributes().is_flipped() ? -1 : 1; coordinates = m_star.get_coordinates(); for ( std::size_t i=0; i!=coordinates.size(); ++i ) { const coordinate_type x = coordinates[i].x * dir_x; const coordinate_type y = coordinates[i].y * dir_y; coordinates[i].x = c.x + (x * std::cos(a) - y * std::sin(a)) * w; coordinates[i].y = c.y + (x * std::sin(a) + y * std::cos(a)) * h; } } // scene_star::compute_coordinates() plee-the-bear-20251226/bear-engine/core/src/visual/code/scene_writing.cpp000066400000000000000000000107421512343254000260500ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the visual::scene_writing. * \author Julien Jorge */ #include "visual/scene_writing.hpp" #include "visual/base_screen.hpp" #include "visual/scene_element.hpp" #include "visual/scene_sprite.hpp" #include "visual/bitmap_writing.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param x X-position of the writing on the screen. * \param y Y-position of the writing on the screen. * \param s The writing to draw. */ bear::visual::scene_writing::scene_writing ( coordinate_type x, coordinate_type y, const writing& s ) : base_scene_element(x, y), m_writing(s) { get_rendering_attributes().set_size( m_writing.get_size() ); } // scene_writing::scene_writing() /*----------------------------------------------------------------------------*/ /** * \brief Allocate a copy of this instance. */ bear::visual::base_scene_element* bear::visual::scene_writing::clone() const { return new scene_writing(*this); } // scene_writing::clone() /*----------------------------------------------------------------------------*/ /** * \brief Get a rectangle where the writing is completely opaque. */ bear::visual::rectangle_type bear::visual::scene_writing::get_opaque_box() const { return rectangle_type(0, 0, 0, 0); } // scene_writing::get_opaque_box() /*----------------------------------------------------------------------------*/ /** * \brief Get a rectangle bounding the writing. */ bear::visual::rectangle_type bear::visual::scene_writing::get_bounding_box() const { return rectangle_type ( get_position().x, get_position().y, get_position().x + m_writing.get_width() * get_scale_factor_x(), get_position().y + m_writing.get_height() * get_scale_factor_y() ); } // scene_writing::get_bounding_box() /*----------------------------------------------------------------------------*/ /** * \brief Split the writing in sub writings. * \param boxes The boxes describing how to split the writing. * \param output The resulting writings (they are inserted to the front). */ void bear::visual::scene_writing::burst ( const rectangle_list& boxes, scene_element_list& output ) const { output.push_back( scene_element(*this) ); } // scene_writing::burst() /*----------------------------------------------------------------------------*/ /** * \brief Render the writing on a screen. * \param scr The screen on which we render the writing. */ void bear::visual::scene_writing::render( base_screen& scr ) const { // double dispach m_writing.call_render(*this, scr); } // scene_writing::render() /*----------------------------------------------------------------------------*/ /** * \brief Render a bitmap writing on a screen. * \param w The writing to render. * \param scr The screen on which we render the writing. */ void bear::visual::scene_writing::render ( const bitmap_writing& w, base_screen& scr ) const { const double r_x ( get_scale_factor_x() * get_rendering_attributes().width() / w.width() ); const double r_y ( get_scale_factor_y() * get_rendering_attributes().height() / w.height() ); for ( std::size_t i=0; i!=w.get_sprites_count(); ++i ) { placed_sprite s( w.get_sprite(i) ); position_type p(get_position()); s.get_sprite().combine( get_rendering_attributes() ); if ( s.get_sprite().is_mirrored() ) p.x += ( s.get_sprite().width() - s.get_position().x - s.get_sprite().width() ) * r_x; else p.x += s.get_position().x * r_x; if ( s.get_sprite().is_flipped() ) p.y += ( s.get_sprite().height() - s.get_position().y - s.get_sprite().height() ) * r_y; else p.y += s.get_position().y * r_y; s.get_sprite().set_size ( s.get_sprite().width() * r_x, s.get_sprite().height() * r_y ); const double a = get_rendering_attributes().get_angle(); position_type pos(p); p.x += s.get_sprite().width() * r_x / 2.0; p.y += s.get_sprite().height() * r_y / 2.0; position_type center = get_position() + get_bounding_box().size() / 2; pos.rotate(center, a); p.x -= s.get_sprite().width() * r_x / 2.0; p.y -= s.get_sprite().height() * r_y / 2.0; scr.render(pos, s.get_sprite()); } } // scene_writing::render() plee-the-bear-20251226/bear-engine/core/src/visual/code/screen.cpp000066400000000000000000000316621512343254000244730ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::visual::screen class. * \author Julien Jorge */ #include "visual/screen.hpp" #include "visual/gl_screen.hpp" #include #include #include #include "time/time.hpp" /*----------------------------------------------------------------------------*/ bear::visual::screen::sub_system bear::visual::screen::s_sub_system(screen_undef); /*----------------------------------------------------------------------------*/ /** * \brief Global initializations common to all screens. Must be called at the * begining of your program. */ void bear::visual::screen::initialize( sub_system sub_sys ) { if ( s_sub_system != screen_undef ) release(); s_sub_system = sub_sys; switch( s_sub_system ) { case screen_gl: gl_screen::initialize(); break; case screen_undef: { // nothing to do } } } // screen::initialize() /*----------------------------------------------------------------------------*/ /** * \brief Global uninitializations common to all screens. Must be called at the * end of your program. */ void bear::visual::screen::release() { switch( s_sub_system ) { case screen_gl: gl_screen::release(); break; case screen_undef: { // nothing to do } } s_sub_system = screen_undef; } // screen::release() /*----------------------------------------------------------------------------*/ /** * \brief Get the type of the sub system. */ bear::visual::screen::sub_system bear::visual::screen::get_sub_system() { return s_sub_system; } // screen::get_sub_system() /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param size Size of the screen. * \param title The title of the window created. * \param full Tell if the window is full screen or not. */ bear::visual::screen::screen ( const claw::math::coordinate_2d& size, const std::string& title, bool full ) : m_mode(SCREEN_IDLE), m_render_opaque_box(false), m_dumb_rendering(false) { switch( s_sub_system ) { case screen_gl: m_impl = new gl_screen(size, title, full); break; case screen_undef: claw::exception("screen sub system has not been set."); } } // screen::screen() /*----------------------------------------------------------------------------*/ /** * \brief Destructor. */ bear::visual::screen::~screen() { delete m_impl; } // screen::~screen() void bear::visual::screen::pause() { m_impl->pause(); } void bear::visual::screen::unpause() { m_impl->unpause(); } /*----------------------------------------------------------------------------*/ /** * \brief Turn fullscreen mode on/off. * \param b Tell if we want a fullscreen mode. */ void bear::visual::screen::fullscreen( bool b ) { m_impl->fullscreen(b); } // screen::fullscreen() /*----------------------------------------------------------------------------*/ /** * \brief Get the size of the screen. */ claw::math::coordinate_2d bear::visual::screen::get_size() const { return m_impl->get_size(); } // screen::get_size() claw::math::coordinate_2d bear::visual::screen::get_viewport_size() const { return m_impl->get_viewport_size(); } /*----------------------------------------------------------------------------*/ /** * \brief Get the size of the container of the screen. */ claw::math::coordinate_2d bear::visual::screen::get_container_size() const { return m_impl->get_container_size(); } // screen::get_container_size() /*----------------------------------------------------------------------------*/ /** * \brief Turn on or off the rendering of the opaque boxes * \param b The new value of the flag. */ void bear::visual::screen::set_opaque_box_visible( bool b ) { m_render_opaque_box = b; } // screen::set_opaque_box_visible() /*----------------------------------------------------------------------------*/ /** * \brief Turn on or off the simple rendering procedure. * \param b The new value of the flag. */ void bear::visual::screen::set_dumb_rendering( bool b ) { m_dumb_rendering = b; } // screen::set_dumb_rendering() /*----------------------------------------------------------------------------*/ /** * \brief Tells if the simple rendering procedure is active. */ bool bear::visual::screen::get_dumb_rendering() const { return m_dumb_rendering; } // screen::get_dumb_rendering() /*----------------------------------------------------------------------------*/ /** * \brief Set the color of the background. * \param c The color. */ void bear::visual::screen::set_background_color( const color_type& c ) { m_impl->set_background_color(c); } // screen::set_background_color() /*----------------------------------------------------------------------------*/ /** * \brief Get the color of the background. */ bear::visual::color_type bear::visual::screen::get_background_color() const { return m_impl->get_background_color(); } // screen::get_background_color() /*----------------------------------------------------------------------------*/ /** * \brief Initialize the rendering process. */ void bear::visual::screen::begin_render() { CLAW_PRECOND(m_mode == SCREEN_IDLE); m_mode = SCREEN_RENDER; m_impl->begin_render(); } // screen::begin_render() /*----------------------------------------------------------------------------*/ /** * \brief Draw something on the screen. * \param e Something. */ void bear::visual::screen::render( const scene_element& e ) { CLAW_PRECOND(m_mode == SCREEN_RENDER); if ( !e.always_displayed() && e.get_bounding_box().empty() ) return; if ( e.has_shadow() ) { scene_element shadow( e ); shadow.set_shadow( 0, 0 ); shadow.set_shadow_opacity( 0 ); shadow.get_rendering_attributes().set_intensity(0, 0, 0); shadow.get_rendering_attributes().set_opacity ( e.get_rendering_attributes().get_opacity() * e.get_shadow_opacity() ); shadow.set_position( e.get_position() + e.get_shadow() ); m_scene_element.push_back( shadow ); } m_scene_element.push_back(e); } // screen::render() /*----------------------------------------------------------------------------*/ /** * \brief Stop the rendering process. * \return false if this screen has been closed by the user. */ void bear::visual::screen::end_render() { CLAW_PRECOND(m_mode == SCREEN_RENDER); render_elements(); m_impl->end_render(); m_mode = SCREEN_IDLE; } // screen::end_render() /*----------------------------------------------------------------------------*/ /** * \brief Do a screen shot. * \param bitmap_name The name of the bitmap file where we'll dump image. */ void bear::visual::screen::shot( const std::string& bitmap_name ) const { std::ofstream f(bitmap_name.c_str()); if (!f) claw::logger << claw::log_warning << "bear::visual::screen::shot: Can't open file '" << bitmap_name << "'" << std::endl; else { claw::graphic::bitmap bmp( get_size().x, get_size().y ); shot(bmp); bmp.save(f); f.close(); } } // screen::shot() /*----------------------------------------------------------------------------*/ /** * \brief Do a screen shot. * \param img The image in which we save the content of the screen. */ void bear::visual::screen::shot( claw::graphic::image& img ) const { m_impl->shot(img); } // screen::shot() bear::visual::capture bear::visual::screen::capture_scene() const { return m_impl->capture_scene(); } /*----------------------------------------------------------------------------*/ /** * \brief Render the opaque box of an element. * \param e The element whose opaque box is rendered. */ void bear::visual::screen::render_opaque_box( const scene_element& e ) const { const rectangle_type box = e.get_opaque_box(); std::vector border(4); border[0] = box.top_left(); border[1] = box.top_right(); border[2] = box.bottom_right(); border[3] = box.bottom_left(); m_impl->draw_polygon( color("#80C0C0C0"), border ); m_impl->draw_line( color("#F0F0F0"), border, 2, true ); } // screen::render_opaque_box() /*----------------------------------------------------------------------------*/ /** * \brief Render an element. * \param e The element to render */ void bear::visual::screen::render_element( const scene_element& e ) const { if ( !e.always_displayed() && e.get_bounding_box().empty() ) return; e.render(*m_impl); if ( m_render_opaque_box ) render_opaque_box( e ); } // screen::render_element() /*----------------------------------------------------------------------------*/ /** * \brief Render the elements of the scene. */ void bear::visual::screen::render_elements() { if ( m_dumb_rendering ) { for ( scene_element_list::const_iterator it( m_scene_element.begin() ); it != m_scene_element.end(); ++it ) render_element( *it ); m_scene_element.clear(); } else { scene_element_list final_elements; // Elements to render, finally. rectangle_list boxes; // Empty parts of the screen. boxes.push_front( rectangle_type(0, 0, get_size().x, get_size().y) ); // Elements are ordered from the background to the foreground. We split // the screen in reverse order so we won't display hidden elements. for ( ; !m_scene_element.empty(); m_scene_element.pop_back() ) { const scene_element& e( m_scene_element.back() ); if ( e.always_displayed() || intersects_any( e.get_bounding_box(), boxes ) ) split( e, final_elements, boxes ); } // split() push the elements at the end of the list, so they are now // ordered from the foreground to the background for ( ; !final_elements.empty(); final_elements.pop_back() ) render_element( final_elements.back() ); } } // screen::render_elements() /*----------------------------------------------------------------------------*/ /** * \brief Tell if a rectangle intersects a rectangle from a list. * \param r The rectangle to check. * \param boxes The boxes to compare to. */ bool bear::visual::screen::intersects_any ( const rectangle_type& r, const rectangle_list& boxes ) const { bool result=false; rectangle_list::const_iterator it; for (it=boxes.begin(); !result && (it!=boxes.end()); ++it) if ( r.intersects(*it) ) { const rectangle_type inter = r.intersection(*it); result = (inter.width() > 0) && (inter.height() > 0); } return result; } // screen::intersects_any() /*----------------------------------------------------------------------------*/ /** * \brief Split a scene element to only keep its visible parts and update the * screen cover. * \param e The element that will be rendered. * \param output The parts of \a e to render. * \param boxes The cover of the screen. */ void bear::visual::screen::split ( const scene_element& e, scene_element_list& output, rectangle_list& boxes ) const { e.burst(boxes, output); const rectangle_type r( e.get_opaque_box() ); const double opaque_box_min_size(0); if ( (r.width() > opaque_box_min_size) && (r.height() > opaque_box_min_size) ) { rectangle_list input_boxes; rectangle_list::const_iterator it; std::swap( input_boxes, boxes ); for ( it=input_boxes.begin(); it!=input_boxes.end(); ++it ) subtract( *it, r, boxes ); } } // screen::split() /*----------------------------------------------------------------------------*/ /** * \brief Subtract a rectangle \a b from a rectangle \a a. * \param a The target. * \param b The rectangle to remove in \a a. * \param boxes The subparts of \a a after the subtraction. */ void bear::visual::screen::subtract ( const rectangle_type& a, const rectangle_type& b, rectangle_list& result ) const { if ( !a.intersects(b) ) result.push_front(a); else { const rectangle_type inter = a.intersection(b); if ( (inter.width() <= 8) || (inter.height() <= 8) ) result.push_front(a); else { if ( a.left() != inter.left() ) result.push_front ( rectangle_type( a.left(), a.bottom(), inter.left(), a.top() ) ); if ( a.top() != inter.top() ) result.push_front ( rectangle_type ( inter.left(), inter.top(), inter.right(), a.top() ) ); if ( a.right() != inter.right() ) result.push_front ( rectangle_type ( inter.right(), a.bottom(), a.right(), a.top() ) ); if ( a.bottom() != inter.bottom() ) result.push_front ( rectangle_type ( inter.left(), a.bottom(), inter.right(), inter.bottom() ) ); } } } // screen::subtract() plee-the-bear-20251226/bear-engine/core/src/visual/code/sdl_error.cpp000066400000000000000000000020521512343254000251760ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::visual::sdl_error class. * \author Julien Jorge */ #include "visual/sdl_error.hpp" #include #include #include #include /*----------------------------------------------------------------------------*/ /** * \brief Throws an exception if there is a problem with SDL. * \param function The name of the function in which the error occured. * \param line The line at which the error is detected. */ void bear::visual::sdl_error::throw_on_error ( const std::string& function, unsigned int line ) { std::ostringstream err_string; err_string << function << ":" << line << ": " << SDL_GetError(); claw::logger << claw::log_error << err_string.str() << std::endl; throw claw::exception( err_string.str() ); } // sdl_error::throw_on_error() plee-the-bear-20251226/bear-engine/core/src/visual/code/sequence_effect.cpp000066400000000000000000000074041512343254000263350ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ #include "visual/sequence_effect.hpp" #include /*----------------------------------------------------------------------------*/ /** * \brief Builds an effect that does nothing. */ bear::visual::sequence_effect::sequence_effect() : m_time(0), m_decrease_coefficient(0), m_wave_length(0), m_wave_height(0), m_wave_speed(0) { } // sequence_effect::sequence_effect() /*----------------------------------------------------------------------------*/ /** * \brief Add a color that can be applied in the effect. * \param c The color. */ void bear::visual::sequence_effect::add_color( color_type c ) { m_colors.push_back(c); } // sequence_effect::add_color() /*----------------------------------------------------------------------------*/ /** * \brief Get a color from the effect. * \param i The index of the element in the sequence. */ bear::visual::color_type bear::visual::sequence_effect::get_color( std::size_t i ) const { if ( m_colors.empty() ) return claw::graphic::white_pixel; else return m_colors[ i % m_colors.size() ]; } // sequence_effect::get_color() /*----------------------------------------------------------------------------*/ /** * \brief Set the length of the wave applied to the sequence, in term of * elements in the sequence. * \param length The length of the wave. */ void bear::visual::sequence_effect::set_wave_length( std::size_t length ) { m_wave_length = length; } // sequence_effect::set_wave_length() /*----------------------------------------------------------------------------*/ /** * \brief Set the height of the wave applied to the sequence. * \param h The height of the wave. */ void bear::visual::sequence_effect::set_wave_height( size_type h ) { m_wave_height = h; } // sequence_effect::set_wave_height() /*----------------------------------------------------------------------------*/ /** * \brief Set the speed of the wave applied to the sequence. * \param s The speed of the wave. */ void bear::visual::sequence_effect::set_wave_speed( size_type s ) { m_wave_speed = s; } // sequence_effect::set_wave_speed() /*----------------------------------------------------------------------------*/ /** * \brief Set the height to decrease per second. * \param coefficient The height to decrease per second. */ void bear::visual::sequence_effect::set_decrease_coefficient ( size_type coefficient ) { m_decrease_coefficient = coefficient; } // sequence_effect::set_decrease_coefficient() /*----------------------------------------------------------------------------*/ /** * \brief Get the delta to apply to an element of the sequence. * \param i The index of the element in the sequence. */ bear::visual::position_type bear::visual::sequence_effect::get_delta( std::size_t i ) const { if ( m_wave_length == 0 ) return position_type(0, 0); else { const coordinate_type y = (m_wave_height / 2) * std::sin ( ( (m_time * m_wave_speed) + (double)(i % m_wave_length) / m_wave_length ) * (2 * boost::math::constants::pi()) ); return position_type( 0, y ); } } // sequence_effect::get_delta() /*----------------------------------------------------------------------------*/ /** * \brief Update the effect. * \param t The elapsed time since the last update. */ void bear::visual::sequence_effect::update( double t ) { m_time += t; size_type height = (double)m_decrease_coefficient * t; if ( m_wave_height <= height ) m_wave_height = 0; else m_wave_height -= height; } // sequence_effect::update() plee-the-bear-20251226/bear-engine/core/src/visual/code/shader_program.cpp000066400000000000000000000062001512343254000261770ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::visual::shader_program class. * \author Julien Jorge */ #include "visual/shader_program.hpp" #include "visual/screen.hpp" #include "visual/gl_shader_program.hpp" #include "visual/detail/get_default_fragment_shader_code.hpp" #include "visual/detail/get_default_vertex_shader_code.hpp" #include /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ bear::visual::shader_program::shader_program() : m_impl(NULL) { } // shader_program::shader_program() bear::visual::shader_program::shader_program( std::istream& fragment ) : m_impl(new base_shader_program_ptr(NULL)) { restore( fragment ); } /*----------------------------------------------------------------------------*/ /** * \brief Constructs a shader_program with a given code. * \param program code The code of the program. */ bear::visual::shader_program::shader_program ( const std::string& fragment, const std::string& vertex ) : m_impl(new base_shader_program_ptr(NULL)) { restore( fragment, vertex ); } // shader_program::shader_program() /*----------------------------------------------------------------------------*/ /** * \brief Delete the data of the shader program. */ void bear::visual::shader_program::clear() { if ( m_impl != NULL ) *m_impl = NULL; } // shader_program::clear() void bear::visual::shader_program::restore( std::istream& fragment ) { std::ostringstream oss; oss << fragment.rdbuf(); restore( oss.str(), detail::get_default_vertex_shader_code() ); } void bear::visual::shader_program::restore ( const std::string& fragment, const std::string& vertex ) { if ( m_impl == NULL ) m_impl = new base_shader_program_ptr(NULL); switch ( screen::get_sub_system() ) { case screen::screen_gl: *m_impl = new gl_shader_program( fragment, vertex ); break; case screen::screen_undef: claw::exception("screen sub system has not been set."); } } // shader_program::restore() /*----------------------------------------------------------------------------*/ /** * \brief Tell if the shader program is initialized. */ bool bear::visual::shader_program::is_valid() const { bool result = false; if ( m_impl != NULL ) result = ( *m_impl != NULL ); return result; } // shader_program::is_valid() /*----------------------------------------------------------------------------*/ /** * \brief Assigment operator. */ const bear::visual::base_shader_program* bear::visual::shader_program::get_impl() const { CLAW_PRECOND( is_valid() ); return &(**m_impl); } // shader_program::get_impl() /*----------------------------------------------------------------------------*/ /** * \brief Gets the values of th variables of the program. */ const bear::visual::shader_program::input_variable_map& bear::visual::shader_program::get_variables() const { return m_input_variable; } // shader_program::get_variables() plee-the-bear-20251226/bear-engine/core/src/visual/code/sprite.cpp000066400000000000000000000117501512343254000245160ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the sprite class. * \author Julien Jorge */ #include "visual/sprite.hpp" #include /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ bear::visual::sprite::sprite() : m_clip_rectangle(0, 0, 0, 0), m_opaque_rectangle( 0, 0, 0, 0 ) { } // sprite::sprite() /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param img The image for the sprite. * \param clip_rectangle Area of "image" for the sprite. * \pre clip_rectangle is valid (in the image). */ bear::visual::sprite::sprite ( const image& img, const clip_rectangle_type& clip_rectangle ) : bitmap_rendering_attributes( clip_rectangle.size() ), m_image(img), m_clip_rectangle(clip_rectangle), m_opaque_rectangle(0, 0, 0, 0) { CLAW_PRECOND( m_clip_rectangle.position.x + m_clip_rectangle.width <= m_image.width() ); CLAW_PRECOND( m_clip_rectangle.position.y + m_clip_rectangle.height <= m_image.height() ); } // sprite::sprite() /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param img The image for the sprite. * \param clip_rectangle Area of "image" for the sprite. * \param opaque_rectangle An area in the sprite where all pixels are opaques. * \pre clip_rectangle is valid (in the image). */ bear::visual::sprite::sprite ( const image& img, const clip_rectangle_type& clip_rectangle, const rectangle_type& opaque_rectangle ) : bitmap_rendering_attributes( clip_rectangle.size() ), m_image(img), m_clip_rectangle(clip_rectangle), m_opaque_rectangle( opaque_rectangle ) { CLAW_PRECOND( m_clip_rectangle.position.x + m_clip_rectangle.width <= m_image.width() ); CLAW_PRECOND( m_clip_rectangle.position.y + m_clip_rectangle.height <= m_image.height() ); CLAW_PRECOND( m_opaque_rectangle.width() <= m_clip_rectangle.width ); CLAW_PRECOND( m_opaque_rectangle.height() <= m_clip_rectangle.height ); CLAW_PRECOND( m_opaque_rectangle.width() >= 0 ); CLAW_PRECOND( m_opaque_rectangle.height() >= 0 ); } // sprite::sprite() /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param img The image for the sprite. */ bear::visual::sprite::sprite( const image& img ) : bitmap_rendering_attributes(img.size()), m_image(img), m_clip_rectangle(0, 0, img.width(), img.height()), m_opaque_rectangle( 0, 0, 0, 0 ) { } // sprite::sprite() /*----------------------------------------------------------------------------*/ /** * \brief Tell if the sprite has a transparency. */ bool bear::visual::sprite::has_transparency() const { return (get_opacity() != 1) || m_image.has_transparency(); } // sprite::has_transparency() /*----------------------------------------------------------------------------*/ /** * \brief Get the rectangular region of the picture used by this sprite. */ const bear::visual::sprite::clip_rectangle_type& bear::visual::sprite::clip_rectangle() const { return m_clip_rectangle; } // sprite::clip_rectangle() /*----------------------------------------------------------------------------*/ /** * \brief Set the rectangular region of the picture used by this sprite. */ void bear::visual::sprite::set_clip_rectangle ( const clip_rectangle_type& clip ) { CLAW_PRECOND( clip.position.x + clip.width <= m_image.width() ); CLAW_PRECOND( clip.position.y + clip.height <= m_image.height() ); m_clip_rectangle = clip; } // sprite::set_clip_rectangle() /*----------------------------------------------------------------------------*/ /** * \brief Get the part of the sprite that is fully opaque. */ const bear::visual::rectangle_type& bear::visual::sprite::get_opaque_rectangle() const { return m_opaque_rectangle; } // sprite::get_opaque_rectangle() /*----------------------------------------------------------------------------*/ /** * \brief Get the part of the sprite that is fully opaque. * \param r A fully opaque part of the sprite. */ void bear::visual::sprite::set_opaque_rectangle( const rectangle_type& r ) { CLAW_PRECOND( r.width() >= 0 ); CLAW_PRECOND( r.height() >= 0 ); m_opaque_rectangle = r; } // sprite::set_opaque_rectangle() /*----------------------------------------------------------------------------*/ /** * \brief Get the picture used by this sprite. */ const bear::visual::image& bear::visual::sprite::get_image() const { return m_image; } // sprite::get_image() /*----------------------------------------------------------------------------*/ /** * \brief Tell if the sprite is made with a valid image. */ bool bear::visual::sprite::is_valid() const { return m_image.is_valid() && (width() >= 0) && (height() >= 0); } // sprite::is_valid() plee-the-bear-20251226/bear-engine/core/src/visual/code/sprite_sequence.cpp000066400000000000000000000216461512343254000264130ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::visual::sprite_sequence class. * \author Julien Jorge */ #include "visual/sprite_sequence.hpp" #include /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ bear::visual::sprite_sequence::sprite_sequence() : m_index(0), m_loops(1), m_loop_back(false), m_forward(true), m_play_count(1), m_first_index(0), m_last_index(0) { } // sprite_sequence::sprite_sequence() /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param images The sprites in the sequence. * \pre images.size() > 0 * \post loops == 0, loop_back == false */ bear::visual::sprite_sequence::sprite_sequence ( const std::vector& images ) : m_sprites(images), m_index(0), m_loops(0), m_loop_back(false), m_forward(true), m_play_count(0), m_first_index(0), m_last_index(m_sprites.size()-1) { CLAW_PRECOND(images.size() > 0); set_size(get_max_size()); } // sprite_sequence::sprite_sequence() /*----------------------------------------------------------------------------*/ /** * \brief Come back to first frame. */ void bear::visual::sprite_sequence::reset() { m_index = 0; m_forward = true; m_play_count = 0; } // sprite_sequence::reset() /*----------------------------------------------------------------------------*/ /** * \brief Go to the next frame. */ void bear::visual::sprite_sequence::next() { if ( !is_finished() ) { if (m_forward) next_forward(); else next_backward(); } } // sprite_sequence::next() /*----------------------------------------------------------------------------*/ /** * \brief Tell if the sequence is empty. */ bool bear::visual::sprite_sequence::empty() const { return m_sprites.empty(); } // sprite_sequence::empty() /*----------------------------------------------------------------------------*/ /** * \brief Get the current frame. */ bear::visual::sprite bear::visual::sprite_sequence::get_sprite() const { sprite result; if ( m_index < m_sprites.size() ) { result = m_sprites[m_index]; result.combine(*this); result.set_size( result.width() * width() / get_max_size().x, result.height() * height() / get_max_size().y ); } return result; } // sprite_sequence::get_sprite() /*----------------------------------------------------------------------------*/ /** * \brief Get the biggest size of the frames. */ bear::visual::size_box_type bear::visual::sprite_sequence::get_max_size() const { claw::math::coordinate_2d result(0, 0); for (unsigned int i=0; i!=m_sprites.size(); ++i) { if ( m_sprites[i].get_size().x > result.x ) result.x = m_sprites[i].get_size().x; if ( m_sprites[i].get_size().y > result.y ) result.y = m_sprites[i].get_size().y; } return result; } // sprite_sequence::get_max_size() /*----------------------------------------------------------------------------*/ /** * \brief Get the highest index. */ unsigned int bear::visual::sprite_sequence::get_max_index() const { return m_sprites.size() - 1; } // sprite_sequence::get_max_index() /*----------------------------------------------------------------------------*/ /** * \brief Set the current index. * \param index The new index. */ void bear::visual::sprite_sequence::set_current_index( unsigned int index ) { m_index = std::min(index, get_max_index()); } // sprite_sequence::set_current_index() /*----------------------------------------------------------------------------*/ /** * \brief Set loop back mode. */ void bear::visual::sprite_sequence::set_loop_back( bool loop_back ) { m_loop_back = loop_back; } // sprite_sequence::set_loop_back() /*----------------------------------------------------------------------------*/ /** * \brief Set the number of times the sprite_sequence should be read. */ void bear::visual::sprite_sequence::set_loops( unsigned int loops ) { m_play_count = 0; m_loops = loops; } // sprite_sequence::set_loops() /*----------------------------------------------------------------------------*/ /** * \brief Gets the index of the first frame of the loops. */ unsigned int bear::visual::sprite_sequence::get_first_index() const { return m_first_index; } // sprite_sequence::get_first_index() /*----------------------------------------------------------------------------*/ /** * \brief Sets the index of the first frame of the loops. * \param index The index. */ void bear::visual::sprite_sequence::set_first_index( unsigned int index ) { m_first_index = index; if (m_last_index < m_first_index) m_last_index = m_first_index; } // sprite_sequence::set_first_index() /*----------------------------------------------------------------------------*/ /** * \brief Set the index of the last frame of the loops. * \param index The index. */ void bear::visual::sprite_sequence::set_last_index( unsigned int index ) { if ( index >= m_sprites.size() ) m_last_index = m_sprites.size() - 1; else { m_last_index = index; if (m_last_index < m_first_index) m_first_index = m_last_index; } } // sprite_sequence::set_last_index() /*----------------------------------------------------------------------------*/ /** * \brief Tell if we have reached the last frame. */ bool bear::visual::sprite_sequence::is_finished() const { bool result = (m_play_count == m_loops) && m_loops; if ( result ) { if ( m_loop_back ) { if ( m_last_index + 1 == m_sprites.size() ) result = (m_index == m_first_index); else result = (m_index + 1 == m_sprites.size()); } else result = (m_index + 1 == m_sprites.size()); } return result || m_sprites.empty(); } // sprite_sequence::is_finished() /*----------------------------------------------------------------------------*/ /** * \brief Tell if the sequence will end. */ bool bear::visual::sprite_sequence::is_finite() const { return m_loops != 0; } // sprite_sequence::is_finite() /*----------------------------------------------------------------------------*/ /** * \brief Tell if the animation is made with valid sprites. */ bool bear::visual::sprite_sequence::is_valid() const { bool result = !m_sprites.empty(); for (unsigned int i=0; result && (i!=m_sprites.size()); ++i) result = m_sprites[i].is_valid(); return result; } // sprite_sequence::is_valid() /*----------------------------------------------------------------------------*/ /** * \brief Constructor. Create a sequence with a single sprite. * \param spr The single sprite. * \post loops == 0, loop_back == false */ bear::visual::sprite_sequence::sprite_sequence( const sprite& spr ) : m_index(0), m_loops(1), m_loop_back(false), m_forward(true), m_play_count(1), m_first_index(0), m_last_index(0) { m_sprites.push_back(spr); set_size(get_max_size()); } // sprite_sequence::sprite_sequence() /*----------------------------------------------------------------------------*/ /** * \brief Get the index of the current frame. */ unsigned int bear::visual::sprite_sequence::get_current_index() const { return m_index; } // sprite_sequence::get_current_index() /*----------------------------------------------------------------------------*/ /** * \brief Go to the next frame, forward playing. */ void bear::visual::sprite_sequence::next_forward() { CLAW_PRECOND( !is_finished() ); if ( m_index == m_last_index ) // we're on the last frame of the loop interval { if ( m_loop_back ) // should we play reverse ? { m_forward = false; if (m_index > 0) --m_index; } else // come back directly to the first frame of the interval { ++m_play_count; // the last time we play the sequence, we'll go after the interval if ( m_play_count != m_loops ) m_index = m_first_index; else if ( m_last_index + 1 != m_sprites.size() ) m_index = m_last_index + 1; } } else ++m_index; } // sprite_sequence::next_forward() /*----------------------------------------------------------------------------*/ /** * \brief Go to the next frame, backward playing. */ void bear::visual::sprite_sequence::next_backward() { if ( m_index == m_first_index ) // we're at the begining { ++m_play_count; if ( m_sprites.size() > 1 ) { m_forward = true; if ( m_play_count != m_loops ) { if (m_first_index != m_last_index) ++m_index; } else if ( m_last_index + 1 != m_sprites.size() ) m_index = m_last_index + 1; } } else --m_index; } // sprite_sequence::next_backward() plee-the-bear-20251226/bear-engine/core/src/visual/code/star.cpp000066400000000000000000000071441512343254000241630ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::visual::star class. * \author Julien Jorge */ #include "visual/star.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param branches The number of branches in the star. * \param inside_ratio The ratio of the distance to the center of the inner * vertices relatively to the distance of the outer ones. */ bear::visual::star::star( std::size_t branches, double inner_ratio ) { branches = std::max( (std::size_t)3, branches ); inner_ratio = std::min( (double)1, std::max((double)0, inner_ratio) ); compute_coordinates( branches, inner_ratio ); } // star::star() /*----------------------------------------------------------------------------*/ /** * \brief Get the ratio of the distance to the center of the inner vertices * relatively to the distance of the outer ones. */ double bear::visual::star::get_ratio() const { CLAW_PRECOND( m_coordinates.size() > 2 ); return m_coordinates[1].distance( position_type(0, 0) ); } // star::get_ratio() /*----------------------------------------------------------------------------*/ /** * \brief Set the ratio of the distance to the center of the inner vertices * relatively to the distance of the outer ones. * \param r The ratio. */ void bear::visual::star::set_ratio( double r ) { compute_coordinates( get_branches(), std::max(0., std::min(1., r)) ); } // star::set_ratio() /*----------------------------------------------------------------------------*/ /** * \brief Get the number of branches. */ std::size_t bear::visual::star::get_branches() const { CLAW_PRECOND( m_coordinates.size() > 2 ); CLAW_PRECOND( m_coordinates.size() % 2 == 0 ); return m_coordinates.size() / 2; } // star::get_branches() /*----------------------------------------------------------------------------*/ /** * \brief Set the number of branches. * \param b The number of branches. */ void bear::visual::star::set_branches( std::size_t b ) { CLAW_PRECOND( b > 2 ); compute_coordinates( b, get_ratio() ); } // star::set_branches() /*----------------------------------------------------------------------------*/ /** * \brief Get the vertices. */ const std::vector& bear::visual::star::get_coordinates() const { return m_coordinates; } // star::get_coordinates() /*----------------------------------------------------------------------------*/ /** * \brief Compute the coordinates of the branches. * \param branches The number of branches in the star. * \param inside_ratio The ratio of the distance to the center of the inner * vertices relatively to the distance of the outer ones. */ void bear::visual::star::compute_coordinates ( std::size_t branches, double inside_ratio ) { CLAW_PRECOND( branches > 0 ); const std::size_t count( 2 * branches ); double a = 3.14159 / 2; const double a_step = 2 * 3.14159 / count; m_coordinates.resize( count ); // outer vertices for ( std::size_t i=0; i!=branches; ++i ) { const double angle = a + 2 * i * a_step; m_coordinates[2*i] = position_type( std::cos(angle), std::sin(angle) ); } // inner vertices for ( std::size_t i=0; i!=branches; ++i ) { const double angle = (a + (2 * i + 1) * a_step); m_coordinates[2*i+1] = inside_ratio * position_type( std::cos(angle), std::sin(angle) ); } } // star::compute_coordinates() plee-the-bear-20251226/bear-engine/core/src/visual/code/text_align.cpp000066400000000000000000000032201512343254000253370ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the visual::text_align class. * \author Julien Jorge */ #include "visual/text_align.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Interprets a string to extract a value of the horizontal_align enum. * \param s The string to interpret. * \param default_value The value to return if s could not be understood. */ bear::visual::text_align::horizontal_align bear::visual::text_align::horizontal_align_from_string ( std::string s, horizontal_align default_value ) { if ( s == "align_left" ) return align_left; else if ( s == "align_center" ) return align_center; else if ( s == "align_right" ) return align_right; else return default_value; } // text_align::horizontal_align_from_string() /*----------------------------------------------------------------------------*/ /** * \brief Interprets a string to extract a value of the vertical_align enum. * \param s The string to interpret. * \param default_value The value to return if s could not be understood. */ bear::visual::text_align::vertical_align bear::visual::text_align::vertical_align_from_string ( std::string s, vertical_align default_value ) { if ( s == "align_top" ) return align_top; else if ( s == "align_middle" ) return align_middle; else if ( s == "align_bottom" ) return align_bottom; else return default_value; } // text_align::vertical_align_from_string() plee-the-bear-20251226/bear-engine/core/src/visual/code/text_layout.cpp000066400000000000000000000122031512343254000255630ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the template methods of bear::visual::text_layout. * \author Julien Jorge */ #include "visual/text_layout.hpp" #include /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param f The font used to display the text. * \param str The text to arrange. * \param s The size of the box around the text. * \param h The horizontal alignment of the lines. * * The instance keep the references on each parameter. So they must live longer * than \a this. */ bear::visual::text_layout::text_layout ( const font& f, const std::string& str, const size_box_type& s, text_align::horizontal_align h ) : m_size(s), m_text(str), m_font(f), m_horizontal_align(h) { } // text_layout::text_layout() /*----------------------------------------------------------------------------*/ /** * \brief Compute the left origin of a line of text. * \param first The index in m_text of the first character of the text on the * line. */ bear::visual::coordinate_type bear::visual::text_layout::compute_line_left( std::size_t first ) const { if ( m_horizontal_align == text_align::align_left ) return 0; const size_type line_width( compute_line_width(first) ); // The remaining space on the line. coordinate_type result( m_size.x - line_width ); if ( m_horizontal_align == text_align::align_center ) result /= 2; return result; } // text_layout::compute_line_left() /*----------------------------------------------------------------------------*/ /** * \brief Computes the width of the text that can be displayed on the line. * * The method sums the width of the characters starting from the provided index, * minus the spaces that would be at the end or the beginning of the line. * * \param first The index in m_text of the first character of the text on the * line. */ bear::visual::size_type bear::visual::text_layout::compute_line_width( std::size_t first ) const { const std::string::size_type text_length( m_text.length() ); // The line begins on the first non space character. first = m_text.find_first_not_of( ' ', first ); if ( first == std::string::npos ) first = text_length; std::string::size_type last(first); size_type result(0); size_type candidate_length(0); // The line ends on the last space character such that the next word would not // fit on the line. std::string::size_type last_space_sequence( std::string::npos ); bool line_full(false); while ( (last != text_length) && (m_text[last] != '\n') && !line_full ) if ( candidate_length > m_size.x ) line_full = true; else { if ( m_text[last] == ' ' ) { if ( last_space_sequence == std::string::npos ) { last_space_sequence = last; result = candidate_length; } } else last_space_sequence = std::string::npos; candidate_length += m_font.get_metrics( m_text[last] ).get_advance().x; ++last; } // if we stopped in the middle of a word or at the end of the line, then we // must adjust the result from the candidate length. if ( last_space_sequence == std::string::npos ) { if ( (candidate_length <= m_size.x) && ( (last == text_length) || !line_full ) ) result = candidate_length; else if ( (result == 0) && (candidate_length > 0) ) { result = candidate_length - m_font.get_metrics( m_text[ last ] ).get_advance().x; } } CLAW_POSTCOND( result >= 0 ); CLAW_POSTCOND( result <= m_size.x ); return result; } // text_layout::compute_line_width() /*----------------------------------------------------------------------------*/ /** * \brief Computes the height of the part above the baseline of a line of text. * \param first The index in m_text of the first character of the text on the * line. */ bear::visual::size_type bear::visual::text_layout::compute_line_height_above_baseline ( std::size_t first ) const { const std::string::size_type text_length( m_text.length() ); // The line begins on the first non space character. first = m_text.find_first_not_of( ' ', first ); if ( first == std::string::npos ) first = text_length; size_type result(0); size_type line_width(0); bool stop(false); while ( !stop ) if ( (first == m_text.length()) || (m_text[first] == '\n') ) stop = true; else { const glyph_metrics m( m_font.get_metrics( m_text[first] ) ); line_width += m.get_advance().x; if ( line_width > m_size.x ) stop = true; else { result = std::max ( result, m_font.get_sprite( m_text[first] ).height() + m.get_bearing().y ); ++first; } } return result; } // text_layout::compute_line_height_above_baseline() plee-the-bear-20251226/bear-engine/core/src/visual/code/text_layout_display_size.cpp000066400000000000000000000050051512343254000303440ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::visual::text_layout_display_size class. * \author Julien Jorge */ #include "visual/text_layout_display_size.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param text The text to arrange. * \param f The font used to display the text. * \param top The top position of the box where the text is displayed. */ bear::visual::text_layout_display_size::text_layout_display_size ( std::string text, visual::font f, coordinate_type top ) : m_text(text), m_font(f), m_bounding_box(0, top, 0, top), m_bounding_box_initialized(false) { } // text_layout_display_size::text_layout_display_size() /*----------------------------------------------------------------------------*/ /** * \brief Compute the maximum size. * \param p The position where the word starts. * \param first The first character of the word to display. * \param last The character just past the last character to display. */ void bear::visual::text_layout_display_size::operator() ( position_type p, std::size_t first, std::size_t last ) { if ( !m_bounding_box_initialized ) { m_bounding_box = rectangle_type( p.x, m_bounding_box.top(), p.x, m_bounding_box.top() ); m_bounding_box_initialized = true; } m_bounding_box = m_bounding_box.join( rectangle_type(p, p) ); position_type baseline_position(p); for ( ; first!=last; ++first ) { const glyph_metrics m( m_font.get_metrics( m_text[first] ) ); const sprite spr( m_font.get_sprite( m_text[first] ) ); const rectangle_type glyph_box ( baseline_position.x, baseline_position.y + m.get_bearing().y, baseline_position.x + std::max( m.get_advance().x, spr.width() ), baseline_position.y + m.get_bearing().y + spr.height() ); m_bounding_box = m_bounding_box.join( glyph_box ); baseline_position.x += m.get_advance().x; } } // text_layout_display_size::operator()() /*----------------------------------------------------------------------------*/ /** * \brief Returns the computed bottom right position of the displayed text. */ bear::visual::rectangle_type bear::visual::text_layout_display_size::get_bounding_box() const { return m_bounding_box; } // text_layout_display_size::get_bounding_box() plee-the-bear-20251226/bear-engine/core/src/visual/code/text_metric.cpp000066400000000000000000000032671512343254000255430ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::visual::text_metric class. * \author Julien Jorge */ #include "visual/text_metric.hpp" #include "visual/text_align.hpp" #include "visual/text_layout.hpp" #include "visual/text_layout_display_size.hpp" #include /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param text The text to measure. * \param f The font used to print the text. */ bear::visual::text_metric::text_metric( const std::string& text, const font& f ) : m_pixel_size(0, 0) { const size_type height( text.length() * f.get_line_spacing() ); const size_type max_size( std::numeric_limits::max() ); text_layout_display_size func( text, f, height ); text_layout layout ( f, text, size_box_type( max_size, height ), text_align::align_left ); layout.arrange_text( func ); m_pixel_size = func.get_bounding_box().size(); } // text_metric::text_metric() /*----------------------------------------------------------------------------*/ /** * \brief Get the width of the text, in pixels. */ bear::visual::size_type bear::visual::text_metric::width() const { return m_pixel_size.x; } // text_metric::width() /*----------------------------------------------------------------------------*/ /** * \brief Get the height of the text, in pixels. */ bear::visual::size_type bear::visual::text_metric::height() const { return m_pixel_size.y; } // text_metric::height() plee-the-bear-20251226/bear-engine/core/src/visual/code/writing.cpp000066400000000000000000000170471512343254000247000ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ #include "visual/writing.hpp" #include "visual/bitmap_writing.hpp" #include "visual/scene_writing.hpp" #include "visual/text_metric.hpp" #include /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ bear::visual::writing::writing() : m_writing( new writing_type ), m_counter(new std::size_t(0)) { } // writing::writing() /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param f The font used to render the text. * \param str The text to render. * \param h The horizontal alignment of the text. * \param v The vertical alignment of the text. */ bear::visual::writing::writing ( const font& f, const std::string& str, text_align::horizontal_align h, text_align::vertical_align v ) : m_writing( new writing_type ), m_counter(new std::size_t(0)) { create( f, str, h, v ); } // writing::writing() /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param f The font used to render the text. * \param str The text to render. * \param s The maximum size of the writing. * \param h The horizontal alignment of the text. * \param v The vertical alignment of the text. */ bear::visual::writing::writing ( const font& f, const std::string& str, const size_box_type& s, text_align::horizontal_align h, text_align::vertical_align v ) : m_writing( new writing_type ), m_counter(new std::size_t(0)) { create( f, str, s, h, v ); } // writing::writing() /*----------------------------------------------------------------------------*/ /** * \brief Copy constructor. * \param that The instance to copy from. */ bear::visual::writing::writing( const writing& that ) : m_writing(that.m_writing), m_counter(that.m_counter) { ++*m_counter; } // writing::writing() /*----------------------------------------------------------------------------*/ /** * \brief Destructor. */ bear::visual::writing::~writing() { if ( *m_counter > 0 ) --*m_counter; else { delete m_counter; delete m_writing; } } // writing::writing() /*----------------------------------------------------------------------------*/ /** * \brief Assignment. * \param that The instance to copy from. */ bear::visual::writing& bear::visual::writing::operator=( const writing& that ) { writing tmp(that); swap(tmp); return *this; } // writing::operator=() /*----------------------------------------------------------------------------*/ /** * \brief Swap two instances. * \param that The instance to swap with. */ void bear::visual::writing::swap( writing& that ) { std::swap( m_writing, that.m_writing ); std::swap( m_counter, that.m_counter ); } // writing::swap() /*----------------------------------------------------------------------------*/ /** * \brief Set the effect to apply to the sprites of the text. * \param e The effect. */ void bear::visual::writing::set_effect( sequence_effect e ) { m_writing->set_effect(e); } // writing::set_effect() /*----------------------------------------------------------------------------*/ /** * \brief Update the rendering of the writing and its effects. * \param t The elapsed type since the last call. */ void bear::visual::writing::update( double t ) { m_writing->update(t); } // writing::update() /*----------------------------------------------------------------------------*/ /** * \brief Get the width of the writing. */ bear::visual::coordinate_type bear::visual::writing::get_width() const { return m_writing->get_size().x; } // writing::get_width() /*----------------------------------------------------------------------------*/ /** * \brief Get the height of the writing. */ bear::visual::coordinate_type bear::visual::writing::get_height() const { return m_writing->get_size().y; } // writing::get_height() /*----------------------------------------------------------------------------*/ /** * \brief Get the size of the writing. */ const bear::visual::size_box_type& bear::visual::writing::get_size() const { return m_writing->get_size(); } // writing::get_size() /*----------------------------------------------------------------------------*/ /** * \brief Get the implemented writing. */ bear::visual::writing::writing_reference bear::visual::writing::operator*() { return *m_writing; } // writing::operator*() /*----------------------------------------------------------------------------*/ /** * \brief Get the implemented writing. */ bear::visual::writing::const_writing_reference bear::visual::writing::operator*() const { return *m_writing; } // writing::operator*() /*----------------------------------------------------------------------------*/ /** * \brief Get the pointer on the implemented writing. */ bear::visual::writing::writing_pointer bear::visual::writing::operator->() { return m_writing; } // writing::operator->() /*----------------------------------------------------------------------------*/ /** * \brief Get the pointer on the implemented writing. */ bear::visual::writing::const_writing_pointer bear::visual::writing::operator->() const { return m_writing; } // writing::operator->() /*----------------------------------------------------------------------------*/ /** * \brief Get the pointer on the implemented writing. */ bear::visual::writing::const_writing_pointer bear::visual::writing::get_impl() const { return m_writing; } // writing::get_impl() /*----------------------------------------------------------------------------*/ /** * \brief Place the characters of the text. * \param f The font used to render the text. * \param str The text to render. * \param h The horizontal alignment of the text. * \param v The vertical alignment of the text. */ void bear::visual::writing::create ( const font& f, const std::string& str, text_align::horizontal_align h, text_align::vertical_align v ) { text_metric tm( str, f ); create( f, str, size_box_type(tm.width(), tm.height()), h, v ); } // writing::create() /*----------------------------------------------------------------------------*/ /** * \brief Place the characters of the text. * \param f The font used to render the text. * \param str The text to render. * \param s The maximum size of the writing. * \param h The horizontal alignment of the text. * \param v The vertical alignment of the text. */ void bear::visual::writing::create ( const font& f, const std::string& str, const size_box_type& s, text_align::horizontal_align h, text_align::vertical_align v ) { if ( *m_counter > 0 ) { --*m_counter; m_writing = new writing_type(*m_writing); m_counter = new std::size_t(0); } m_writing->create( f, str, s, h, v ); } // writing::create() /*----------------------------------------------------------------------------*/ /** * \brief Call the render method of a scene_writing (double dispach) . * \param s The scene_writing on which we call the method. * \param scr The screen to pass to \a s. */ void bear::visual::writing::call_render ( const scene_writing& s, base_screen& scr ) const { m_writing->call_render(s, scr); } // writing::call_render() /*----------------------------------------------------------------------------*/ /** * \brief Swap two writings. * \param a The first writing. * \param b The second writing. */ void std::swap( bear::visual::writing& a, bear::visual::writing& b ) { a.swap(b); } // swap() plee-the-bear-20251226/bear-engine/core/src/visual/color.hpp000066400000000000000000000026731512343254000234250ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A class representing a color with transparency. * \author Julien Jorge */ #ifndef __VISUAL_COLOR_HPP__ #define __VISUAL_COLOR_HPP__ #include "visual/class_export.hpp" #include namespace bear { namespace visual { /** * \brief A class representing a color with transparency. * \author Julien Jorge */ class VISUAL_EXPORT color: public claw::graphic::rgba_pixel { public: color(); color( const claw::graphic::rgba_pixel& c ); color( const color& c ); explicit color( const std::string& c ); color( component_type r, component_type g, component_type b ); color ( component_type r, component_type g, component_type b, component_type o ); void set_red_intensity( double i ); void set_green_intensity( double i ); void set_blue_intensity( double i ); void set_opacity( double o ); void set(double red, double green, double blue, double opacity); double get_red_intensity() const; double get_green_intensity() const; double get_blue_intensity() const; double get_opacity() const; }; // class color } // namespace visual } // namespace bear #endif // __VISUAL_COLOR_HPP__ plee-the-bear-20251226/bear-engine/core/src/visual/detail/000077500000000000000000000000001512343254000230305ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/core/src/visual/detail/apply_shader.hpp000066400000000000000000000002651512343254000262170ustar00rootroot00000000000000#pragma once namespace bear { namespace visual { class shader_program; namespace detail { void apply_shader( const shader_program& shader ); } } } plee-the-bear-20251226/bear-engine/core/src/visual/detail/code/000077500000000000000000000000001512343254000237425ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/core/src/visual/detail/code/apply_shader.cpp000066400000000000000000000042121512343254000271200ustar00rootroot00000000000000#include "visual/detail/apply_shader.hpp" #include "visual/gl_error.hpp" #include "visual/gl_shader_program.hpp" #include "visual/shader_program.hpp" namespace bear { namespace visual { namespace detail { class uniform_setter { public: explicit uniform_setter( GLuint program ); void operator()( const std::string& name, int value ) const; void operator()( const std::string& name, float value ) const; void operator()( const std::string& name, bool value ) const; void operator() ( const std::string& name, const std::array< float, 16 >& value ) const; private: const GLuint m_program; }; } } } bear::visual::detail::uniform_setter::uniform_setter( GLuint program ) : m_program( program ) { } void bear::visual::detail::uniform_setter::operator() ( const std::string& name, int value ) const { glUniform1i( glGetUniformLocation( m_program, name.c_str() ), value); VISUAL_GL_ERROR_THROW(); } void bear::visual::detail::uniform_setter::operator() ( const std::string& name, float value ) const { glUniform1f( glGetUniformLocation( m_program, name.c_str() ), value); VISUAL_GL_ERROR_THROW(); } void bear::visual::detail::uniform_setter::operator() ( const std::string& name, bool value ) const { glUniform1i( glGetUniformLocation( m_program, name.c_str() ), value); VISUAL_GL_ERROR_THROW(); } void bear::visual::detail::uniform_setter::operator() ( const std::string& name, const std::array< float, 16 >& value ) const { glUniformMatrix4fv ( glGetUniformLocation( m_program, name.c_str() ), 1, GL_FALSE, value.data() ); VISUAL_GL_ERROR_THROW(); } void bear::visual::detail::apply_shader( const shader_program& shader ) { assert ( shader.is_valid() ); const gl_shader_program* const s ( static_cast( shader.get_impl() ) ); assert( s->program_id() != 0 ); glUseProgram( s->program_id() ); VISUAL_GL_ERROR_THROW(); shader_program::variable_visitor_type visitor; shader_program::input_variable_map vars( shader.get_variables() ); visitor.run( vars, uniform_setter( s->program_id() ) ); } plee-the-bear-20251226/bear-engine/core/src/visual/detail/code/get_default_fragment_shader_code.cpp000066400000000000000000000007161512343254000331400ustar00rootroot00000000000000#include "visual/detail/get_default_fragment_shader_code.hpp" const std::string& bear::visual::detail::get_default_fragment_shader_code() { static const std::string result = R"( #version 100 precision lowp float; uniform sampler2D texture; varying lowp vec4 g_fragment_color; varying mediump vec2 g_texture_coordinates; void main() { gl_FragColor = g_fragment_color * texture2D( texture, g_texture_coordinates ); } )"; return result; } plee-the-bear-20251226/bear-engine/core/src/visual/detail/code/get_default_vertex_shader_code.cpp000066400000000000000000000010621512343254000326450ustar00rootroot00000000000000#include "visual/detail/get_default_vertex_shader_code.hpp" const std::string& bear::visual::detail::get_default_vertex_shader_code() { static const std::string result = R"( #version 100 uniform mat4 transform; attribute vec4 in_position; attribute vec2 in_texture_coordinates; attribute vec4 in_color; varying lowp vec4 g_fragment_color; varying mediump vec2 g_texture_coordinates; void main() { gl_Position = transform * in_position; g_fragment_color = in_color; g_texture_coordinates = in_texture_coordinates; } )"; return result; } plee-the-bear-20251226/bear-engine/core/src/visual/detail/get_default_fragment_shader_code.hpp000066400000000000000000000002551512343254000322310ustar00rootroot00000000000000#pragma once #include namespace bear { namespace visual { namespace detail { const std::string& get_default_fragment_shader_code(); } } } plee-the-bear-20251226/bear-engine/core/src/visual/detail/get_default_vertex_shader_code.hpp000066400000000000000000000002531512343254000317410ustar00rootroot00000000000000#pragma once #include namespace bear { namespace visual { namespace detail { const std::string& get_default_vertex_shader_code(); } } } plee-the-bear-20251226/bear-engine/core/src/visual/detail/gl_vertex_attribute_index.hpp000066400000000000000000000003751512343254000310170ustar00rootroot00000000000000#pragma once namespace bear { namespace visual { namespace detail { static constexpr int position_attribute = 0; static constexpr int color_attribute = 1; static constexpr int texture_coordinate_attribute = 2; } } } plee-the-bear-20251226/bear-engine/core/src/visual/font/000077500000000000000000000000001512343254000225345ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/core/src/visual/font/base_font.hpp000066400000000000000000000021221512343254000252020ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief The common interface to the classes representing the fonts. * \author Julien Jorge */ #ifndef __VISUAL_BASE_FONT_HPP__ #define __VISUAL_BASE_FONT_HPP__ #include "charset/def.hpp" #include "visual/sprite.hpp" #include "visual/font/glyph_metrics.hpp" #include "visual/class_export.hpp" namespace bear { namespace visual { /** * \brief The common interface to the classes representing the fonts. * \author Julien Jorge */ class VISUAL_EXPORT base_font { public: virtual ~base_font(); virtual size_type get_size() const = 0; virtual glyph_metrics get_metrics( charset::char_type c ) = 0; virtual sprite get_sprite( charset::char_type character ) = 0; virtual void clear(); virtual void restore(); }; // class base_font } // namespace visual } // namespace bear #endif // __VISUAL_BASE_FONT_HPP__ plee-the-bear-20251226/bear-engine/core/src/visual/font/bitmap_charmap.hpp000066400000000000000000000036251512343254000262220ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief The bitmap_charmap maps the positions of a set of characters into * the region representing their glyphs in a collection of images. * \author Julien Jorge */ #ifndef __VISUAL_BITMAP_CHARMAP_HPP__ #define __VISUAL_BITMAP_CHARMAP_HPP__ #include "visual/image.hpp" #include "charset/def.hpp" #include "visual/class_export.hpp" #include #include #include namespace bear { namespace visual { /** * \brief The bitmap_charmap maps the positions of a set of characters into * the region representing their glyphs in a collection of images. * \author Julien Jorge */ class VISUAL_EXPORT bitmap_charmap { public: /** \brief The position of a character. */ struct char_position { public: /** \brief The index of the image. */ unsigned int image_index; /** \brief The position of the character in the image. */ claw::math::coordinate_2d position; }; // struct char_position /** \brief The type of the map in which the descriptions of the characters are stored. */ typedef std::map character_map; public: bitmap_charmap(); public: /** \brief The size of the characters. */ claw::math::coordinate_2d size; /** \brief The images in which we take the images of the characters. */ std::vector font_images; /** \brief The position of the characters in the image. */ character_map characters; }; // class bitmap_charmap } // namespace visual } // namespace bear #endif // __VISUAL_BITMAP_CHARMAP_HPP__ plee-the-bear-20251226/bear-engine/core/src/visual/font/bitmap_font.hpp000066400000000000000000000027141512343254000255530ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A class representing a bitmap font. * \author Sebastien Angibaud */ #ifndef __VISUAL_BITMAP_FONT_HPP__ #define __VISUAL_BITMAP_FONT_HPP__ #include "visual/font/base_font.hpp" #include "visual/class_export.hpp" #include #include namespace bear { namespace visual { class bitmap_charmap; /** * \brief A class representing a bitmap font. * \author Sebastien Angibaud */ class VISUAL_EXPORT bitmap_font: public base_font { public: explicit bitmap_font( const bitmap_charmap& characters ); bitmap_font( const bitmap_charmap& characters, size_type size ); size_type get_size() const; sprite get_sprite( charset::char_type character ); glyph_metrics get_metrics( charset::char_type c ); private: void make_sprites( const bitmap_charmap& characters, double size ); void make_missing( const bitmap_charmap& characters, double size ); private: /** \brief The characters in the font. */ std::map m_characters; /** \brief Sprite returned for a missing character. */ sprite m_missing; }; // class bitmap_font } // namespace visual } // namespace bear #endif // __VISUAL_BITMAP_FONT_HPP__ plee-the-bear-20251226/bear-engine/core/src/visual/font/code/000077500000000000000000000000001512343254000234465ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/core/src/visual/font/code/base_font.cpp000066400000000000000000000017471512343254000261230ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::visual::base_font class. * \author Julien Jorge */ #include "visual/font/base_font.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Destructor. */ bear::visual::base_font::~base_font() { // nothing to do } // base_font::~base_font() /*----------------------------------------------------------------------------*/ /** * \brief Removes the data of the font for future restoration. */ void bear::visual::base_font::clear() { // nothing to do } // base_font::clear() /*----------------------------------------------------------------------------*/ /** * \brief Restores the data of the font. */ void bear::visual::base_font::restore() { // nothing to do } // base_font::restore() plee-the-bear-20251226/bear-engine/core/src/visual/font/code/bitmap_charmap.cpp000066400000000000000000000011431512343254000271200ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::visual::bitmap_charmap class. * \author Julien Jorge */ #include "visual/font/bitmap_charmap.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Build a symbol table with the default configuration. */ bear::visual::bitmap_charmap::bitmap_charmap() : size(0, 0) { } // bitmap_charmap::bitmap_charmap() plee-the-bear-20251226/bear-engine/core/src/visual/font/code/bitmap_font.cpp000066400000000000000000000116521512343254000264610ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::visual::bitmap_font class. * \author Sebastien Angibaud */ #include "visual/font/bitmap_font.hpp" #include "visual/font/bitmap_charmap.hpp" #include #include /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param characters The description of the characters in the font. The size of * the font will be set to characters.size.y. */ bear::visual::bitmap_font::bitmap_font( const bitmap_charmap& characters ) { CLAW_PRECOND( !characters.characters.empty() ); make_sprites( characters, characters.size.y ); make_missing( characters, characters.size.y ); } // bitmap_font::bitmap_font() /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param characters The description of the characters in the font. * \param size The size of the font. */ bear::visual::bitmap_font::bitmap_font ( const bitmap_charmap& characters, size_type size ) { CLAW_PRECOND( !characters.characters.empty() ); make_sprites( characters, size ); make_missing( characters, size ); } // bitmap_font::bitmap_font() /*----------------------------------------------------------------------------*/ /** * \brief Returns the size of the font. */ bear::visual::size_type bear::visual::bitmap_font::get_size() const { return m_missing.height(); } // bitmap_font::get_size() /*----------------------------------------------------------------------------*/ /** * \brief Get the sprite of a character. * \param character The character to get. */ bear::visual::sprite bear::visual::bitmap_font::get_sprite( charset::char_type character ) { const std::map::const_iterator it = m_characters.find(character); sprite result; if ( it == m_characters.end() ) { result = m_missing; if ( (character == ' ') || (character == ' ') /* non breakable space */ ) result.set_opacity(0); else { claw::logger << claw::log_warning << "Character not found '" << character << "' (" << (int)character << ")." << std::endl; #ifdef NDEBUG result.set_opacity(0); #endif } } else result = it->second; return result; } // bitmap_font::get_sprite() /*----------------------------------------------------------------------------*/ /** * \brief Gets the metrics of the glyph of a character. * \param character The character to get. */ bear::visual::glyph_metrics bear::visual::bitmap_font::get_metrics( charset::char_type character ) { return glyph_metrics ( get_sprite(character).get_size(), size_box_type(0, 0) ); } // bitmap_font::get_metrics() /*----------------------------------------------------------------------------*/ /** * \brief Creates the sprites for the characters. * \param characters The description of the characters in the font. * \param size The size of the font. */ void bear::visual::bitmap_font::make_sprites ( const bitmap_charmap& characters, double size ) { std::map ::const_iterator it; for (it=characters.characters.begin(); it!=characters.characters.end(); ++it) if ( it->second.image_index < characters.font_images.size() ) if ( it->second.position.x + characters.size.x < characters.font_images[it->second.image_index].width() ) if ( it->second.position.y + characters.size.y < characters.font_images[it->second.image_index].height() ) { const claw::math::rectangle clip ( it->second.position, characters.size ); sprite s( characters.font_images[it->second.image_index], clip ); s.set_size( s.width() * size / s.height(), size ); m_characters[it->first] = s; } } // bitmap_font::make_sprites() /*----------------------------------------------------------------------------*/ /** * \brief Creates the sprite for a missing character. * \param characters The description of the characters in the font. * \param size The size of the font. */ void bear::visual::bitmap_font::make_missing ( const bitmap_charmap& characters, double size ) { CLAW_PRECOND( !characters.characters.empty() ); claw::math::rectangle clip ( 0, 0, characters.font_images[0].width(), characters.font_images[0].height() ); m_missing = sprite(characters.font_images[0], clip ); size_box_type ref_size; if ( m_characters.empty() ) ref_size = size_box_type( size, size ); else ref_size = m_characters.begin()->second.get_size(); m_missing.set_size( ref_size.x * size / ref_size.y, ref_size.y ); } // bitmap_font::make_missing() plee-the-bear-20251226/bear-engine/core/src/visual/font/code/font.cpp000066400000000000000000000047471512343254000251340ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::visual::font class. * \author Julien Jorge */ #include "visual/font/font.hpp" #include "visual/font/base_font.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Constructs a font with no implementation. This instance won't have any * visual. */ bear::visual::font::font() : m_impl(NULL), m_size(0) { } // font::font() /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param f The implementation of this instance. This implementation will be * shared with the copies of this instance. None of them will ever delete * the implementation. * \param s The size of the text displayed with this font. */ bear::visual::font::font( base_font_pointer f, size_type size ) : m_impl( f ), m_size( size ) { } // font::font() /*----------------------------------------------------------------------------*/ /** * \brief Returns the metrics of a glyph. * \param c The glyph for which we want the size. */ bear::visual::glyph_metrics bear::visual::font::get_metrics( charset::char_type c ) const { glyph_metrics result; if ( m_impl != NULL ) result = m_impl->get_metrics( c ); return result; } // font::get_metrics() /*----------------------------------------------------------------------------*/ /** * \brief Returns the spacing between two lines of text displayed with this * font. */ bear::visual::size_type bear::visual::font::get_line_spacing() const { return get_size() * 1.2; } // font::get_line_spacing() /*----------------------------------------------------------------------------*/ /** * \brief Returns the size of the characters in the font. */ bear::visual::size_type bear::visual::font::get_size() const { if ( m_impl == NULL ) return 0; else return m_impl->get_size(); } // font::get_size() /*----------------------------------------------------------------------------*/ /** * \brief Gets the sprite of a character. * \param character The character to get. */ bear::visual::sprite bear::visual::font::get_sprite( charset::char_type character ) const { sprite result; if ( m_impl != NULL ) result = m_impl->get_sprite( character ); return result; } // font::get_sprite() plee-the-bear-20251226/bear-engine/core/src/visual/font/code/font_manager.cpp000066400000000000000000000101051512343254000266070ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the visual::font_manager class. * \author Julien Jorge */ #include "visual/font/font_manager.hpp" #include "visual/font/base_font.hpp" #include "visual/font/bitmap_font.hpp" #include "visual/font/true_type_font.hpp" #include "visual/font/true_type_memory_file.hpp" #include /*----------------------------------------------------------------------------*/ /** * \brief Destructor. */ bear::visual::font_manager::~font_manager() { clear(); } // font_manager::~font_manager() /*----------------------------------------------------------------------------*/ /** * \brief Deletes all the fonts. */ void bear::visual::font_manager::clear() { for ( font_map_type::iterator it = m_font.begin(); it != m_font.end(); ++it ) delete it->second; m_font.clear(); m_memory_file.clear(); m_bitmap_charmap.clear(); } // font_manager::clear() /*----------------------------------------------------------------------------*/ /** * \brief Adds the mapping of the characters for a bitmap font. * \param name The identifier of the font. * \param m The character mapping to associate with name. * \pre !exists( name ) */ void bear::visual::font_manager::load_font ( std::string name, const bitmap_charmap& m ) { CLAW_PRECOND( !exists(name) ); m_bitmap_charmap[ name ] = m; } // font_manager::load_font() /*----------------------------------------------------------------------------*/ /** * \brief Adds the data of a true type font file. * \param name The identifier of the font. * \param file The content of the file. * \pre !exists( name ) */ void bear::visual::font_manager::load_font ( std::string name, std::istream& file ) { CLAW_PRECOND( !exists(name) ); m_memory_file.insert( std::make_pair( name, true_type_memory_file( file ) ) ); } // font_manager::load_font() /*----------------------------------------------------------------------------*/ /** * \brief Clears the fonts for future restoration. The fonts are not deleted. */ void bear::visual::font_manager::clear_fonts() { for ( font_map_type::iterator it = m_font.begin(); it != m_font.end(); ++it ) it->second->clear(); } // font_manager::clear_fonts() /*----------------------------------------------------------------------------*/ /** * \brief Restore all the fonts. */ void bear::visual::font_manager::restore_fonts() { for ( font_map_type::iterator it = m_font.begin(); it != m_font.end(); ++it ) it->second->restore(); } // font_manager::restore_fonts() /*----------------------------------------------------------------------------*/ /** * \brief Returns a font of a given size from an existing font. * \param name The name of the font to find. * \param size The size of the font. */ bear::visual::font bear::visual::font_manager::get_font( std::string name, double size ) const { CLAW_PRECOND( exists(name) ); const font_id_type font_id( boost::make_tuple( name, size ) ); const font_map_type::iterator it( m_font.find( font_id ) ); if ( it != m_font.end() ) return font( it->second, size ); else { const id_to_charmap_type::const_iterator charmap_it ( m_bitmap_charmap.find( name ) ); if ( charmap_it != m_bitmap_charmap.end() ) m_font[ font_id ] = new bitmap_font( charmap_it->second, size ); else m_font[ font_id ] = new true_type_font( m_memory_file.find( name )->second, size ); return font( m_font[ font_id ], size ); } } // font_manager::get_font() /*----------------------------------------------------------------------------*/ /** * \brief Tells if there is a font with a given name. * \param name The name of the font to search. */ bool bear::visual::font_manager::exists( const std::string& name ) const { return ( m_bitmap_charmap.find( name ) != m_bitmap_charmap.end() ) || ( m_memory_file.find( name ) != m_memory_file.end() ); } // font_manager::exists() plee-the-bear-20251226/bear-engine/core/src/visual/font/code/freetype_face.cpp000066400000000000000000000153711512343254000267620ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::visual::freetype_face class. * \author Julien Jorge */ #include "visual/font/freetype_face.hpp" #include "visual/font/true_type_memory_file.hpp" #include #include #include /*----------------------------------------------------------------------------*/ FT_Library bear::visual::freetype_face::s_library; bool bear::visual::freetype_face::s_library_is_initialized(false); /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param f The font file to load. * \param size The size of the font. */ bear::visual::freetype_face::freetype_face ( const true_type_memory_file& f, size_type size ) : m_face(NULL), m_loaded_char(0), m_size(size) { initialize_freetype(); if ( !init_face( f ) ) throw claw::exception( "Could not load the font." ); } // freetype_face::freetype_face() /*----------------------------------------------------------------------------*/ /** * \brief Destroys the font. */ bear::visual::freetype_face::~freetype_face() { const FT_Error error = FT_Done_Face( m_face ); if ( error ) claw::logger << claw::log_error << "Error when releasing the font. Error is " << error << "." << std::endl; } // freetype_face::~freetype_face() /*----------------------------------------------------------------------------*/ /** * \brief Returns the size of the font face. */ bear::visual::size_type bear::visual::freetype_face::get_size() const { return m_size; } // freetype_face::get_size() /*----------------------------------------------------------------------------*/ /** * \brief Computes the size of a glyph. * \param c The glyph from which we take the size. */ claw::math::coordinate_2d bear::visual::freetype_face::get_glyph_size( charset::char_type c ) const { load_char( c ); return claw::math::coordinate_2d ( m_face->glyph->bitmap.width, m_face->glyph->bitmap.rows ); } // freetype_face::get_glyph_size() /*----------------------------------------------------------------------------*/ /** * \brief Computes the metrics of a glyph. * \param c The glyph from which we take the metrics. */ bear::visual::glyph_metrics bear::visual::freetype_face::get_glyph_metrics( charset::char_type c ) const { const size_type glyph_height( get_glyph_size(c).y ); const size_type advance_units_per_pixel(64); const size_box_type advance ( size_box_type( m_face->glyph->advance.x, m_face->glyph->advance.y ) / advance_units_per_pixel ); const size_box_type bearing ( m_face->glyph->bitmap_left, m_face->glyph->bitmap_top - glyph_height ); return glyph_metrics( advance, bearing ); } // freetype_face::get_glyph_metrics() /*----------------------------------------------------------------------------*/ /** * \brief Returns the bitmap of a glyph. * \param c The character from which we want the glyph. */ claw::graphic::image bear::visual::freetype_face::get_glyph( charset::char_type c ) const { const claw::math::coordinate_2d glyph_size( get_glyph_size(c) ); claw::graphic::image img( glyph_size.x, glyph_size.y ); FT_GlyphSlot glyph = m_face->glyph; unsigned char* buffer = glyph->bitmap.buffer; for ( unsigned int py=0; py != img.height(); ++py ) for ( unsigned int px=0; px != img.width(); ++px ) { img[py][px] = claw::graphic::white_pixel; img[py][px].components.alpha = *buffer; ++buffer; } return img; } // freetype_face::get_glyph() /*----------------------------------------------------------------------------*/ /** * \brief Loads the glyph of a given character. * \param c The character to draw. */ void bear::visual::freetype_face::load_char( charset::char_type c ) const { if ( c == m_loaded_char ) return; const FT_Error error = FT_Load_Char( m_face, (unsigned char)c, FT_LOAD_RENDER ); if ( error ) { claw::logger << claw::log_error << "Error loading glyph '" << c << "'. Error is " << error << "." << std::endl; const_cast(this)->m_loaded_char = 0; } else const_cast(this)->m_loaded_char = c; } // freetype_face::load_char() /*----------------------------------------------------------------------------*/ /** * \brief Initializes the font face with a given file and size. * \param f The font file to load. * \return true on success, false otherwise. */ bool bear::visual::freetype_face::init_face( const true_type_memory_file& f ) { const FT_Error error = FT_New_Memory_Face( s_library, f.begin(), f.end() - f.begin(), 0, &m_face ); if ( error ) { claw::logger << claw::log_error << "Could not load the font. Error is " << error << "." << std::endl; return false; } else return set_face_size() && set_charmap(); } // freetype_face::init_face() /*----------------------------------------------------------------------------*/ /** * \brief Initializes the charmap of the font. * \return true on success, false otherwise. */ bool bear::visual::freetype_face::set_charmap() const { const FT_Error error = FT_Select_Charmap( m_face, FT_ENCODING_UNICODE ); if ( error ) { claw::logger << claw::log_error << "Could not set the charmap. Error is " << error << "." << std::endl; return false; } else return true; } // freetype_face::set_charmap() /*----------------------------------------------------------------------------*/ /** * \brief Sets the size of the font. * \return true on success, false otherwise. */ bool bear::visual::freetype_face::set_face_size() const { const FT_Error error = FT_Set_Pixel_Sizes( m_face, 0, (unsigned int)m_size ); if ( error ) { claw::logger << claw::log_error << "Could not set the font's size. Error is " << error << "." << std::endl; return false; } else return true; } // freetype_face::set_face_size() /*----------------------------------------------------------------------------*/ /** * \brief Initializes the FreeType library. */ void bear::visual::freetype_face::initialize_freetype() { if ( s_library_is_initialized ) return; const FT_Error error = FT_Init_FreeType( &s_library ); if ( error ) claw::logger << claw::log_error << "Could not initialize FreeType. Error is " << error << "." << std::endl; else s_library_is_initialized = true; } // freetype_face::initialize_freetype() plee-the-bear-20251226/bear-engine/core/src/visual/font/code/glyph_metrics.cpp000066400000000000000000000035551512343254000270330ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::visual::glyph_metrics class. * \author Julien Jorge */ #include "visual/font/glyph_metrics.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Constructs the metrics with no dimension. The advance and bearing will * both be equal to zero. */ bear::visual::glyph_metrics::glyph_metrics() : m_advance( 0, 0 ), m_bearing( 0, 0 ) { } // glyph_metrics::glyph_metrics() /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param advance How far to move the cursor when the glyph is displayed, for * the horizontal and vertical layouts. * \param bearing The distance between the origin on the baseline and the bottom * left corner of the glyph. */ bear::visual::glyph_metrics::glyph_metrics ( size_box_type advance, size_box_type bearing ) : m_advance( advance ), m_bearing( bearing ) { } // glyph_metrics::glyph_metrics() /*----------------------------------------------------------------------------*/ /** * \brief How far to move the cursor when the glyph is displayed. * \return The distance for the horizontal and vertical layouts. */ bear::visual::size_box_type bear::visual::glyph_metrics::get_advance() const { return m_advance; } // glyph_metrics::get_advance() /*----------------------------------------------------------------------------*/ /** * \brief The distance between the origin on the baseline and the bottom * left corner of the glyph. */ bear::visual::size_box_type bear::visual::glyph_metrics::get_bearing() const { return m_bearing; } // glyph_metrics::get_bearing() plee-the-bear-20251226/bear-engine/core/src/visual/font/code/true_type_font.cpp000066400000000000000000000213061512343254000272220ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::visual::true_type_font class. * \author Sebastien Angibaud */ #include "visual/font/true_type_font.hpp" #include #include #include /*----------------------------------------------------------------------------*/ const bear::visual::size_box_type bear::visual::true_type_font::glyph_sheet::s_margin(1, 1); /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ bear::visual::true_type_font::glyph_sheet::glyph_sheet() : m_image_size( 512, 512 ), m_image( m_image_size.x, m_image_size.y ), m_next_position( 0, 0 ), m_current_line_height(0) { claw::graphic::image img( m_image_size.x, m_image_size.y ); std::fill( img.begin(), img.end(), claw::graphic::transparent_pixel ); m_image.draw( img, position_type(0, 0) ); } // true_type_font::glyph_sheet::glyph_sheet() /*----------------------------------------------------------------------------*/ /** * \brief Tells if a given glyph can be added to the sheet. * \param c The character to draw. * \param face The font face from which we take the glyph. */ bool bear::visual::true_type_font::glyph_sheet::can_draw ( charset::char_type c, const freetype_face& face ) const { const size_box_type glyph_size( face.get_glyph_size(c) ); if ( m_next_position.x + glyph_size.x + 2 * s_margin.x < m_image.width() ) return m_next_position.y + glyph_size.y + 2 * s_margin.y < m_image.height(); else return m_next_position.y + m_current_line_height < m_image.height(); } // true_type_font::glyph_sheet::can_draw() /*----------------------------------------------------------------------------*/ /** * \brief Draws a new glyph on this sheet. * \param c The character to draw. * \param face The font face from which we take the glyph. */ void bear::visual::true_type_font::glyph_sheet::draw_character ( charset::char_type c, const freetype_face& face ) { CLAW_PRECOND( can_draw( c, face ) ); const size_box_type glyph_size( face.get_glyph_size(c) ); if ( m_next_position.x + glyph_size.x + 2 * s_margin.x >= m_image.width() ) { m_next_position.x = 0; m_next_position.y += m_current_line_height; m_current_line_height = 0; } m_image.draw( face.get_glyph( c ), m_next_position + s_margin ); character_placement placement; placement.clip = clip_rectangle( m_next_position, glyph_size + 2 * s_margin ); placement.metrics = face.get_glyph_metrics( c ); placement.metrics = glyph_metrics ( placement.metrics.get_advance() - s_margin, placement.metrics.get_bearing() - s_margin ); m_placement[ c ] = placement; m_next_position.x += glyph_size.x + 2 * s_margin.x; m_current_line_height = std::max ( m_current_line_height, (unsigned int)( glyph_size.y + 2 * s_margin.y ) ); } // true_type_font::glyph_sheet::draw_character() /*----------------------------------------------------------------------------*/ /** * \brief Gets the sprite of a character. * \param character The character to get. */ bear::visual::sprite bear::visual::true_type_font::glyph_sheet::get_sprite ( charset::char_type character ) const { const character_to_placement::const_iterator it ( m_placement.find( character ) ); if ( it == m_placement.end() ) return sprite(); else return sprite( m_image, it->second.clip ); } // true_type_font::glyph_sheet::get_sprite() /*----------------------------------------------------------------------------*/ /** * \brief Gets the metrics of the glyph of a character. * \param character The character to get. */ bear::visual::glyph_metrics bear::visual::true_type_font::glyph_sheet::get_metrics ( charset::char_type character ) const { const character_to_placement::const_iterator it ( m_placement.find( character ) ); if ( it == m_placement.end() ) return glyph_metrics(); else return it->second.metrics; } // true_type_font::glyph_sheet::get_metrics() /*----------------------------------------------------------------------------*/ /** * \brief Destroys all the images. */ void bear::visual::true_type_font::glyph_sheet::invalidate() { m_image.clear(); } // true_type_font::glyph_sheet::invalidate() /*----------------------------------------------------------------------------*/ /** * \brief Builds the images of the glyphes again. * \param face The font_face from which we take the glyphs. */ void bear::visual::true_type_font::glyph_sheet::restore( const freetype_face& face ) { claw::graphic::image all_glyphs( m_image_size.x, m_image_size.y ); for ( character_to_placement::const_iterator it = m_placement.begin(); it != m_placement.end(); ++it ) all_glyphs.partial_copy ( face.get_glyph( it->first ), it->second.clip.position ); m_image.restore( all_glyphs ); } // true_type_font::glyph_sheet::restore() /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param f The font file to load. * \param size The size of the font. */ bear::visual::true_type_font::true_type_font ( const true_type_memory_file& f, double size ) : m_font_face( f, size ) { } // true_type_font::true_type_font() /*----------------------------------------------------------------------------*/ /** * \brief Returns the size of the font. */ bear::visual::size_type bear::visual::true_type_font::get_size() const { return m_font_face.get_size(); } // true_type_font::get_size() /*----------------------------------------------------------------------------*/ /** * \brief Gets the sprite of a character. * \param character The character to get. */ bear::visual::sprite bear::visual::true_type_font::get_sprite( charset::char_type character ) { const glyph_sheet_iterator sheet( get_glyph_or_draw( character ) ); if ( sheet == m_sheet.end() ) return sprite(); else return sheet->get_sprite( character ); } // true_type_font::get_sprite() /*----------------------------------------------------------------------------*/ /** * \brief Gets the metrics of the glyph of a character. * \param character The character to get. */ bear::visual::glyph_metrics bear::visual::true_type_font::get_metrics( charset::char_type character ) { const glyph_sheet_iterator sheet( get_glyph_or_draw( character ) ); if ( sheet == m_sheet.end() ) return glyph_metrics(); else return sheet->get_metrics( character ); } // true_type_font::get_metrics() /*----------------------------------------------------------------------------*/ /** * \brief Destroys all the images. */ void bear::visual::true_type_font::clear() { for ( glyph_sheet_collection::iterator it = m_sheet.begin(); it != m_sheet.end(); ++it ) it->invalidate(); } // true_type_font::clear() /*----------------------------------------------------------------------------*/ /** * \brief Builds the images of the glyphes again. */ void bear::visual::true_type_font::restore() { for ( glyph_sheet_collection::iterator it = m_sheet.begin(); it != m_sheet.end(); ++it ) it->restore( m_font_face ); } // true_type_font::restore() /*----------------------------------------------------------------------------*/ /** * \brief Adds a glyph for a given character. * \param c The character to draw. * \return The glyph_sheet on which c has been drawn. */ bear::visual::true_type_font::glyph_sheet_iterator bear::visual::true_type_font::draw_glyph( charset::char_type c ) { CLAW_PRECOND( m_sheet_from_character.find( c ) == m_sheet_from_character.end() ); if ( m_sheet.empty() || !m_sheet.back().can_draw( c, m_font_face ) ) m_sheet.push_back( glyph_sheet() ); glyph_sheet_iterator result( m_sheet.end() ); --result; result->draw_character( c, m_font_face ); m_sheet_from_character[c] = result; return result; } // true_type_font::draw_glyph() /*----------------------------------------------------------------------------*/ /** * \brief Gets an iterator on the glyph_sheet containing the glyph of a given * character. If the character has never been drawn, draw_glyph() is * first. * \param character The character for which we want the sheet. */ bear::visual::true_type_font::glyph_sheet_iterator bear::visual::true_type_font::get_glyph_or_draw( charset::char_type character ) { glyph_sheet_iterator sheet; const character_to_glyph_sheet::const_iterator it = m_sheet_from_character.find(character); if ( it == m_sheet_from_character.end() ) sheet = draw_glyph( character ); else sheet = it->second; return sheet; } // true_type_font::get_glyph_or_draw() plee-the-bear-20251226/bear-engine/core/src/visual/font/code/true_type_memory_file.cpp000066400000000000000000000027441512343254000305700ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::visual::true_type_memory_file class. * \author Julien Jorge */ #include "visual/font/true_type_memory_file.hpp" #include /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param is The stream from which the file's content is read. */ bear::visual::true_type_memory_file::true_type_memory_file( std::istream& is ) { is.seekg( 0, std::ios_base::end ); m_size = is.tellg(); unsigned char* buffer = new unsigned char[ m_size ]; is.seekg( 0, std::ios_base::beg ); is.read( reinterpret_cast(buffer), m_size ); m_content = content_pointer_type( buffer ); } // true_type_memory_file::true_type_memory_file() /*----------------------------------------------------------------------------*/ /** * \brief Returns a pointer to the first byte of data. */ const unsigned char* bear::visual::true_type_memory_file::begin() const { return m_content.get(); } // true_type_memory_file::begin() /*----------------------------------------------------------------------------*/ /** * \brief Returns a pointer to the end of the data. */ const unsigned char* bear::visual::true_type_memory_file::end() const { return begin() + m_size; } // true_type_memory_file::end() plee-the-bear-20251226/bear-engine/core/src/visual/font/font.hpp000066400000000000000000000030301512343254000242070ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief An interface to the instances of base_font. * \author Julien Jorge */ #ifndef __VISUAL_FONT_HPP__ #define __VISUAL_FONT_HPP__ #include "charset/def.hpp" #include "visual/sprite.hpp" #include "visual/font/glyph_metrics.hpp" #include "visual/class_export.hpp" namespace bear { namespace visual { class base_font; /** * \brief An interface to the instances of base_font. * * The instances of font share a base_font with their copies. None of them * will ever delete the base_font. * * \author Julien Jorge */ class VISUAL_EXPORT font { public: /** \brief The type of the pointer to the base_font passed to the font. */ typedef base_font* base_font_pointer; public: font(); explicit font( base_font_pointer f, size_type size ); glyph_metrics get_metrics( charset::char_type c ) const; size_type get_line_spacing() const; size_type get_size() const; sprite get_sprite( charset::char_type character ) const; private: /** \brief The base_font from which we take the glyphs. */ base_font_pointer m_impl; /** \brief The size of the text displayed with this font. */ size_type m_size; }; // class font } // namespace visual } // namespace bear #endif // __VISUAL_FONT_HPP__ plee-the-bear-20251226/bear-engine/core/src/visual/font/font_manager.hpp000066400000000000000000000044321512343254000257100ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A class to manage font resources. * \author Julien Jorge */ #ifndef __VISUAL_FONT_MANAGER_HPP__ #define __VISUAL_FONT_MANAGER_HPP__ #include "visual/font/font.hpp" #include "visual/font/bitmap_charmap.hpp" #include "visual/font/true_type_memory_file.hpp" #include #include #include #include #include "visual/class_export.hpp" namespace bear { namespace visual { /** * \brief A class to manage font resources. * \author Julien Jorge */ class VISUAL_EXPORT font_manager { private: /** \brief The type of the container associating the character mapping of a bitmap font with the identifier of the bitmap font. */ typedef std::map id_to_charmap_type; /** \brief The type of the container associating a true type memory file with the identifier of the true type font. */ typedef std::map id_to_memory_file_type; /** \brief The structure describing a font in the manager. */ typedef boost::tuple font_id_type; /** \brief The type of the container associating a font with its identifier. */ typedef std::map font_map_type; public: ~font_manager(); void clear(); void load_font( std::string name, const bitmap_charmap& m ); void load_font( std::string name, std::istream& file ); void clear_fonts(); void restore_fonts(); font get_font( std::string name, double size ) const; bool exists( const std::string& name ) const; private: /** \brief The character mapping of each bitmap font. */ id_to_charmap_type m_bitmap_charmap; /** \brief The file data of each true type font. */ id_to_memory_file_type m_memory_file; /** \brief All the fonts built by this manager. */ mutable font_map_type m_font; }; // class font_manager } // namespace visual } // namespace bear #endif // __VISUAL_FONT_MANAGER_HPP__ plee-the-bear-20251226/bear-engine/core/src/visual/font/freetype_face.hpp000066400000000000000000000041731512343254000260530ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief The freetype_face class provides an access to font faces of the * FreeType library. * \author Julien Jorge */ #ifndef __VISUAL_FREETYPE_FACE_HPP__ #define __VISUAL_FREETYPE_FACE_HPP__ #include "charset/def.hpp" #include "visual/types.hpp" #include "visual/font/glyph_metrics.hpp" #include "visual/class_export.hpp" #include #include #include #include #include FT_FREETYPE_H namespace bear { namespace visual { class true_type_memory_file; /** * \brief The freetype_face class provides an access to font faces of the * FreeType library. * \author Julien Jorge */ class VISUAL_EXPORT freetype_face: private claw::pattern::non_copyable { public: freetype_face( const true_type_memory_file& f, double size ); ~freetype_face(); double get_size() const; claw::math::coordinate_2d get_glyph_size( charset::char_type c ) const; glyph_metrics get_glyph_metrics( charset::char_type c ) const; claw::graphic::image get_glyph( charset::char_type c ) const; private: void load_char( charset::char_type c ) const; bool init_face( const true_type_memory_file& f ); bool set_charmap() const; bool set_face_size() const; static void initialize_freetype(); private: /** \brief The instance of the FreeType library. */ static FT_Library s_library; /** \brief Tells if the FreeType library has been initialized. */ static bool s_library_is_initialized; /** \brief The face of the font. */ FT_Face m_face; /** \brief The last character loaded in m_face. */ charset::char_type m_loaded_char; /** \brief The size of the font. */ size_type m_size; }; // class freetype_face } // namespace visual } // namespace bear #endif // __VISUAL_FREETYPE_FACE_HPP__ plee-the-bear-20251226/bear-engine/core/src/visual/font/glyph_metrics.hpp000066400000000000000000000025521512343254000261220ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief The glyph metrics class describes how a glyph must be placed when * displayed. * \author Julien Jorge */ #ifndef __VISUAL_GLYPH_METRICS_HPP__ #define __VISUAL_GLYPH_METRICS_HPP__ #include "visual/types.hpp" #include "visual/class_export.hpp" namespace bear { namespace visual { /** * \brief The glyph metrics class describes how a glyph must be placed when * displayed. * \author Julien Jorge */ class VISUAL_EXPORT glyph_metrics { public: glyph_metrics(); glyph_metrics( size_box_type advance, size_box_type bearing ); size_box_type get_advance() const; size_box_type get_bearing() const; private: /** \brief How far to move the cursor when the glyph is displayed. The variable contains the distance for the horizontal and vertical layouts. */ size_box_type m_advance; /** \brief The distance between the origin on the baseline and the bottom left corner of the glyph. */ size_box_type m_bearing; }; // class glyph_metrics } // namespace visual } // namespace bear #endif // __VISUAL_GLYPH_METRICS_HPP__ plee-the-bear-20251226/bear-engine/core/src/visual/font/true_type_font.hpp000066400000000000000000000113611512343254000263150ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A class representing a true type font. * \author Julien Jorge */ #ifndef __VISUAL_TRUE_TYPE_FONT_HPP__ #define __VISUAL_TRUE_TYPE_FONT_HPP__ #include "visual/font/base_font.hpp" #include "visual/font/freetype_face.hpp" #include "visual/class_export.hpp" #include #include namespace bear { namespace visual { class true_type_memory_file; /** * \brief A class representing a true type font. * \author Julien Jorge */ class VISUAL_EXPORT true_type_font: public base_font { private: /** * \brief A glyph sheet is an image representing some glyphs. New glyphs * can be drawn on the sheets. */ class glyph_sheet { private: /** \brief The type of the positions in the image. */ typedef claw::math::coordinate_2d position_type; /** \brief The type of the size of a box. */ typedef claw::math::coordinate_2d size_box_type; /** \brief The type of a region containing a glyph in the image. */ typedef claw::math::rectangle clip_rectangle; /** * \brief The character_placement structures describes the informations * related to the glyph of a character. */ struct character_placement { /** \brief The region containing the glyph in the image. */ clip_rectangle clip; /** \brief The metrics of the glyph. */ glyph_metrics metrics; }; // struct character_placement /** \brief The type of the map associating a character, as the key, with its placement, as the value. */ typedef std::unordered_map character_to_placement; public: glyph_sheet(); bool can_draw( charset::char_type c, const freetype_face& face ) const; void draw_character ( charset::char_type c, const freetype_face& face ); sprite get_sprite( charset::char_type character ) const; glyph_metrics get_metrics( charset::char_type character ) const; void invalidate(); void restore( const freetype_face& face ); private: /** * \brief The size of the created image. * * Since the image becomes invalid after a call to invalidate(), we * cannot compute its size in restore(). */ const size_box_type m_image_size; /** \brief The image where the glyphs are drawn. */ image m_image; /** \brief The position where the next glyph will be drawn. */ position_type m_next_position; /** \brief The height of the current line of glyphs. */ unsigned int m_current_line_height; /** \brief The placement of each character. */ character_to_placement m_placement; /** \brief The margin around the glyphes in the texture. The value is applied on each side, vertically and horizontally. */ static const bear::visual::size_box_type s_margin; }; // class glyph_sheet /** \brief The type of the collection in which the glyph_sheets are stored. */ typedef std::vector glyph_sheet_collection; /** \brief The type of an iterator in a glyph_sheet_collection. */ typedef glyph_sheet_collection::iterator glyph_sheet_iterator; /** \brief The type of the map associating a character with the glyph sheet in which its glyph was created. */ typedef std::unordered_map character_to_glyph_sheet; public: true_type_font( const true_type_memory_file& f, double size ); size_type get_size() const; sprite get_sprite( charset::char_type character ); glyph_metrics get_metrics( charset::char_type c ); void clear(); void restore(); private: glyph_sheet_iterator draw_glyph( charset::char_type c ); glyph_sheet_iterator get_glyph_or_draw( charset::char_type c ); private: /** \brief The interface to the true type library. */ freetype_face m_font_face; /** \brief The glyph sheets on which the glyphs are drawn. */ glyph_sheet_collection m_sheet; /** \brief This map provides for each draw character, the glyph sheet on which it was drawn. */ character_to_glyph_sheet m_sheet_from_character; }; // class true_type_font } // namespace visual } // namespace bear #endif // __VISUAL_TRUE_TYPE_FONT_HPP__ plee-the-bear-20251226/bear-engine/core/src/visual/font/true_type_memory_file.hpp000066400000000000000000000026721512343254000276630ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief The true_type_memory_file maps a true type font file into the memory. * \author Julien Jorge */ #ifndef __VISUAL_TRUE_TYPE_MEMORY_FILE_HPP__ #define __VISUAL_TRUE_TYPE_MEMORY_FILE_HPP__ #include "visual/class_export.hpp" #include #include namespace bear { namespace visual { /** * \brief The true_type_memory_file maps a true type font file into the * memory. * \author Julien Jorge */ class VISUAL_EXPORT true_type_memory_file { private: /** \brief The type of the pointer to the file's content. The data is shared among the copies of the instance and will be deleted with the last instance. */ typedef boost::shared_array content_pointer_type; public: true_type_memory_file( std::istream& is ); const unsigned char* begin() const; const unsigned char* end() const; private: /** \brief The content of the file. */ content_pointer_type m_content; /** \brief The number of bytes in the file. */ std::size_t m_size; }; // class true_type_memory_file } // namespace visual } // namespace bear #endif // __VISUAL_TRUE_TYPE_MEMORY_FILE_HPP__ plee-the-bear-20251226/bear-engine/core/src/visual/gl.hpp000066400000000000000000000007771512343254000227140ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Includes the OpenGL headers with the right configuration. * \author Julien Jorge */ #ifndef __VISUAL_GL_HPP__ #define __VISUAL_GL_HPP__ #define GL_GLEXT_PROTOTYPES 1 #if defined( _WIN32 ) #include "glew/glew.h" #else #include #endif #endif // __VISUAL_GL_HPP__ plee-the-bear-20251226/bear-engine/core/src/visual/gl_capture.hpp000066400000000000000000000010321512343254000244200ustar00rootroot00000000000000#pragma once #include "visual/base_capture.hpp" #include "visual/gl_state.hpp" #include namespace bear { namespace visual { class VISUAL_EXPORT gl_capture: public base_capture { public: explicit gl_capture( const std::vector< gl_state >& states ); gl_capture* clone() const override; boost::signals2::connection render ( const capture_ready& ready, const capture_progress& progress ) override; private: const std::vector< gl_state > m_states; }; } } plee-the-bear-20251226/bear-engine/core/src/visual/gl_capture_queue.hpp000066400000000000000000000035701512343254000256350ustar00rootroot00000000000000#pragma once #include "visual/gl_state.hpp" #include "time/time.hpp" #include #include #include #include namespace bear { namespace visual { class gl_draw; class gl_capture_queue { public: typedef std::vector< gl_state > state_list; public: explicit gl_capture_queue ( const claw::math::coordinate_2d< unsigned int >& window_size, const claw::math::coordinate_2d< unsigned int >& viewport_size ); boost::signals2::connection enqueue ( const state_list& states, const boost::function< void( const claw::graphic::image& ) >& ready, const boost::function< void( double ) >& progress ); void draw( gl_draw& output ); void update( systime::milliseconds_type allocated_time ); private: struct entry { public: explicit entry( const state_list& s ); bool connected() const; public: state_list states; boost::signals2::signal< void( double ) > progress_signal; boost::signals2::signal< void( const claw::graphic::image& ) > ready_signal; }; private: void setup_render_buffer(); void setup_frame_buffer(); bool remove_obsolete_captures(); void read_pixels( std::size_t line_count ); void dispatch_screenshot(); private: claw::math::coordinate_2d< unsigned int > m_window_size; claw::math::coordinate_2d< unsigned int > m_viewport_size; std::deque< entry > m_pending_captures; std::vector< claw::graphic::rgba_pixel_8 > m_screenshot_buffer; claw::graphic::image m_image; GLuint m_frame_buffer; GLuint m_render_buffer; std::size_t m_line_index; bool m_ongoing_screenshot; std::array< std::size_t, 16 > m_lines_per_duration; }; } } plee-the-bear-20251226/bear-engine/core/src/visual/gl_draw.hpp000066400000000000000000000023331512343254000237170ustar00rootroot00000000000000#pragma once #include "visual/gl.hpp" #include "visual/shader_program.hpp" #include "visual/types.hpp" #include namespace bear { namespace visual { class gl_state; class gl_draw { public: gl_draw ( GLuint white, GLuint shader, const claw::math::coordinate_2d< unsigned int >& size ); void set_background_color( const color_type& c ); void draw( const std::vector< gl_state >& states ); void set_vertices( const std::vector< GLfloat >& vertices ); void set_colors( const std::vector< GLfloat >& colors ); void set_texture_coordinates( const std::vector< GLfloat >& coordinates ); void draw( GLenum mode, GLuint first, GLuint count ); private: void set_viewport ( const claw::math::coordinate_2d< unsigned int >& size ); void prepare(); void finalize(); void generate_indices(); private: const GLuint m_white; const GLuint m_shader; GLfloat m_background_color[ 4 ]; GLuint m_buffers[ 4 ]; std::vector< GLushort > m_indices; std::size_t m_vertex_count; std::size_t m_color_count; std::size_t m_texture_coordinate_count; }; } } plee-the-bear-20251226/bear-engine/core/src/visual/gl_error.hpp000066400000000000000000000016771512343254000241250ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Error management for OpenGL. * \author Julien Jorge */ #ifndef __VISUAL_GL_ERROR_HPP__ #define __VISUAL_GL_ERROR_HPP__ #include "visual/class_export.hpp" #include #define VISUAL_GL_ERROR_THROW() \ bear::visual::gl_error::throw_on_error \ ( __LINE__, std::string(__FILE__) + ':' + __FUNCTION__ ) namespace bear { namespace visual { /** * \brief Error management for OpenGL. * \author Julien Jorge */ class VISUAL_EXPORT gl_error { public: static void throw_on_error( std::size_t line, const std::string& file ); }; // class gl_error } // namespace visual } // namespace bear #endif // __VISUAL_GL_ERROR_HPP__ plee-the-bear-20251226/bear-engine/core/src/visual/gl_fragment_shader.hpp000066400000000000000000000020041512343254000261060ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A class to use OpenGL fragment shaders. * \author Julien Jorge */ #ifndef __VISUAL_GL_FRAGMENT_SHADER_HPP__ #define __VISUAL_GL_FRAGMENT_SHADER_HPP__ #include "visual/gl.hpp" #include "visual/class_export.hpp" #include namespace bear { namespace visual { /** * \brief A fragment shader finalizes the rendering of the pixels. * \author Julien Jorge */ class VISUAL_EXPORT gl_fragment_shader { public: gl_fragment_shader( const std::string& p ); ~gl_fragment_shader(); GLuint shader_id() const; private: /** \brief The OpenGL identifier of the fragment shader. */ GLuint m_fragment_shader; }; // gl_fragment_shader } // namespace visual } // namespace bear #endif // __VISUAL_GL_FRAGMENT_SHADER_HPP__ plee-the-bear-20251226/bear-engine/core/src/visual/gl_image.hpp000066400000000000000000000030051512343254000240410ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief OpenGL implementation of an image. * \author Julien Jorge */ #ifndef __VISUAL_GL_IMAGE_HPP__ #define __VISUAL_GL_IMAGE_HPP__ #include "visual/base_image.hpp" #include "visual/gl.hpp" namespace bear { namespace visual { /** * \brief OpenGL implementation of an image. * \author Julien Jorge */ class VISUAL_EXPORT gl_image: public base_image { public: gl_image( unsigned int width, unsigned int height ); explicit gl_image( const claw::graphic::image& data ); ~gl_image(); GLuint texture_id() const; claw::math::coordinate_2d size() const; bool has_transparency() const; void draw ( const claw::graphic::image& data, claw::math::coordinate_2d pos ); claw::graphic::image read() const; private: void create_texture(); void copy_scanlines( const claw::graphic::image& pixels ); private: /** \brief OpenGL texture identifier. */ GLuint m_texture_id; /** \brief Image's size. */ claw::math::coordinate_2d m_size; /** \brief Is there any transparent pixel in the image ? */ bool m_has_transparency; }; // class gl_image } // namespace visual } // namespace bear #endif // __VISUAL_GL_IMAGE_HPP__ plee-the-bear-20251226/bear-engine/core/src/visual/gl_renderer.hpp000066400000000000000000000145211512343254000245720ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief The gl_renderer class manages the process of rendering with OpenGL. * \author Julien Jorge */ #ifndef __VISUAL_GL_RENDERER_HPP__ #define __VISUAL_GL_RENDERER_HPP__ #include "visual/gl_capture.hpp" #include "visual/gl_state.hpp" #include "visual/types.hpp" #include "time/time.hpp" #include #include #include #include #include #include namespace bear { namespace visual { class gl_capture_queue; class gl_draw; class gl_fragment_shader; class gl_vertex_shader; /** * \brief The gl_renderer class manages the process of rendering with * OpenGL. * \author Julien Jorge */ class gl_renderer { public: /** \brief The type of a position on the screen, at pixel precision. */ typedef claw::math::coordinate_2d screen_position_type; /** \brief The type of a 2D size on the screen, at pixel level. */ typedef claw::math::coordinate_2d screen_size_type; /** \brief The type of the container in which the states to render are stored. */ typedef std::vector state_list; private: typedef gl_renderer* renderer_pointer; public: static gl_renderer& get_instance(); static void terminate(); GLuint create_texture( screen_size_type& size ); bool draw_texture ( GLuint texture_id, const claw::graphic::image& data, const screen_position_type& pos ); claw::graphic::image read_texture( GLuint texture_id, const screen_size_type& size ); void delete_texture( GLuint texture_id ); GLuint create_fragment_shader( const std::string& p ); GLuint create_vertex_shader( const std::string& p ); void delete_shader( GLuint shader_id ); GLuint create_shader_program ( const gl_fragment_shader& fragment, const gl_vertex_shader& vertex ); void delete_shader_program( GLuint program_id ); void shot( claw::graphic::image& img ); gl_capture capture_scene(); boost::signals2::connection queue_capture ( const state_list& states, const boost::function< void( const claw::graphic::image& ) >& ready, const boost::function< void( double ) >& progress ); screen_size_type get_size(); screen_size_type get_viewport_size(); screen_size_type get_container_size(); void set_title( const std::string& title ); void set_video_mode( const screen_size_type& size, bool f ); void set_fullscreen( bool f ); void set_gl_states( state_list& states ); color_type get_background_color(); void set_background_color( const color_type& c ); void pause(); void unpause(); private: void stop(); void loop(); bool initialization_loop(); void render_loop(); void render_states(); void draw_scene(); void update_screenshot( systime::milliseconds_type render_time ); void resize_view(); void make_current(); void release_context(); void copy_texture_pixels ( GLuint texture_id, claw::graphic::rgba_pixel_8* pixels, std::size_t x, std::size_t y, std::size_t w, std::size_t h ); bool ensure_window_exists(); void create_drawing_helper(); void create_capture_queue(); screen_size_type get_best_screen_size() const; std::vector get_sdl_display_modes() const; screen_size_type get_best_screen_size ( const std::vector& modes ) const; GLuint create_shader( GLenum type, const std::string& p ); private: gl_renderer(); gl_renderer( const gl_renderer& that ) = delete; private: /** \brief The single instance of this class. */ static renderer_pointer s_instance; /** \brief Tells if we must stop the rendering process. */ bool m_stop; /** \brief The window created by SDL. */ SDL_Window* m_window; /** \brief The OpenGL context used for rendering. */ SDL_GLContext m_gl_context; /** \brief The color of the background of the screen. */ color_type m_background_color; /** \brief The size of the window in which we render. */ screen_size_type m_window_size; /** \brief The size of the view on the rendered elements. */ screen_size_type m_view_size; screen_size_type m_viewport_size; /** \brief The title of the window. */ std::string m_title; /** \brief Tells if we are displaying a fullscreen window.*/ bool m_fullscreen; /** \brief Tells if the window has been initialized. */ bool m_video_mode_is_set; /** \brief The next elements to render. */ state_list m_states; state_list m_previous_states; bool m_render_ready; boost::condition_variable m_render_condition; /** \brief A buffer in which we do the screenshots, to avoid an allocation at each call. */ std::vector< claw::graphic::rgba_pixel_8 > m_screenshot_buffer; gl_draw* m_draw; gl_capture_queue* m_capture_queue; /** \brief The various mutexes used to avoid simultaneous access to the fields of the class, and to the GL state. */ struct { /** \brief This mutex is locked when a function calls OpenGL functions. */ boost::mutex gl_access; /** \brief This mutex is locked when a function accesses m_states. */ boost::mutex gl_set_states; /** \brief This mutex is locked when a function accesses the property of the window, m_window or m_gl_context. */ boost::mutex window; /** \brief This mutex is locked when the variables modifying the execution of the rendering loop is accessed. */ boost::mutex loop_state; } m_mutex; /** \brief The thread running the render loop of this instance. */ boost::thread* m_render_thread; }; // class gl_renderer } // namespace visual } // namespace bear #endif // __VISUAL_GL_RENDERER_HPP__ plee-the-bear-20251226/bear-engine/core/src/visual/gl_screen.hpp000066400000000000000000000064071512343254000242470ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief OpenGL implementation of the screen. * \author Julien Jorge */ #ifndef __VISUAL_GL_SCREEN_HPP__ #define __VISUAL_GL_SCREEN_HPP__ #include "visual/base_screen.hpp" #include "visual/gl.hpp" #include "visual/gl_state.hpp" #include "visual/shader_program.hpp" #include namespace bear { namespace visual { /** * \brief OpenGL implementation of the screen. * \author Julien Jorge */ class VISUAL_EXPORT gl_screen: public base_screen { private: /** \brief The type used to represent the size of a screen. */ typedef claw::math::coordinate_2d screen_size_type; public: static void initialize(); static void release(); gl_screen( const claw::math::coordinate_2d& size, const std::string& title="", bool full=false ); void pause() override; void unpause() override; void fullscreen( bool b ) override; claw::math::coordinate_2d get_size() const override; claw::math::coordinate_2d get_viewport_size() const override; claw::math::coordinate_2d get_container_size() const override; void set_background_color( const color_type& c ) override; color_type get_background_color() const override; void begin_render() override; void render( const position_type& pos, const sprite& s ) override; void end_render() override; void draw_line ( const color_type& color, const std::vector& p, double w = 1.0, bool close=false ) override; void draw_polygon ( const color_type& color, const std::vector& p ) override; void push_shader( const shader_program& p ) override; void pop_shader() override; void shot( claw::graphic::image& img ) const override; capture capture_scene() const override; private: void render_sprite( const position_type& pos, const sprite& s ); void get_render_coord ( const position_type& pos, const sprite& s, std::vector& result ) const; claw::math::box_2d get_texture_clip( const sprite& s ) const; void render_image ( GLuint texture_id, const std::vector& render_coord, const claw::math::box_2d& clip, const color_type& color ); position_type rotate( const position_type& pos, GLfloat a, const position_type& center ) const; std::vector get_texture_coordinates ( const claw::math::box_2d& clip ) const; void push_state( const gl_state& state ); shader_program get_current_shader() const; private: /** \brief The shaders to apply to the next rendering commands. */ std::vector m_shader; /** \brief The OpenGL drawing commands. */ std::vector m_gl_state; }; // class gl_screen } // namespace visual } // namespace bear #endif // __VISUAL_GL_SCREEN_HPP__ plee-the-bear-20251226/bear-engine/core/src/visual/gl_shader_program.hpp000066400000000000000000000026271512343254000257650ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A class to use OpenGL shader programs. * \author Julien Jorge */ #ifndef __VISUAL_GL_SHADER_PROGRAM_HPP__ #define __VISUAL_GL_SHADER_PROGRAM_HPP__ #include "visual/base_shader_program.hpp" #include "visual/gl_fragment_shader.hpp" #include "visual/gl_vertex_shader.hpp" #include namespace bear { namespace visual { /** * \brief A class to use OpenGL shader programs. The implementation supports * the fragment shaders only. * \author Julien Jorge */ class VISUAL_EXPORT gl_shader_program: public base_shader_program { public: gl_shader_program ( const std::string& fragment_code, const std::string& vertex_code ); ~gl_shader_program(); GLuint program_id() const; private: void log_errors( std::string step ) const; private: /** \brief The OpenGL identifier of the shader program. */ GLuint m_program_id; /** \brief The fragment shader linked to this program. */ gl_fragment_shader m_fragment_shader; gl_vertex_shader m_vertex_shader; }; // gl_shader_program } // namespace visual } // namespace bear #endif // __VISUAL_GL_SHADER_PROGRAM_HPP__ plee-the-bear-20251226/bear-engine/core/src/visual/gl_state.hpp000066400000000000000000000104711512343254000241040ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief The description of an element in the OpenGL scene. * \author Julien Jorge */ #ifndef __VISUAL_GL_STATE_HPP__ #define __VISUAL_GL_STATE_HPP__ #include "visual/gl.hpp" #include "visual/shader_program.hpp" #include "visual/types.hpp" #include namespace bear { namespace visual { class gl_draw; /** * \brief The description of an element in the OpenGL scene. * \author Julien Jorge */ class VISUAL_EXPORT gl_state { public: typedef std::vector position_vector; private: /** \brief The various ways to render the vertices. */ enum render_mode { render_lines, render_triangles }; // enum render_mode /** * \brief The visitor that checks if a variable exists in another * variable_map with the same value. */ class variables_are_included { public: variables_are_included ( bool& result, const shader_program::input_variable_map& vars ); template void operator()( const std::string& name, const T& value ) const; private: /** \brief The updated result of the tests. */ bool& m_result; /** \brief The variable_map to which the visited variabled are compared. */ const shader_program::input_variable_map& m_variables; }; // class variables_are_included /** * \brief The element_range class describes how to render a given range * of vertices from the state. */ struct element_range { element_range( GLuint t, std::size_t i, std::size_t c ); /** \brief The texture to use when rendering the vertices. */ GLuint texture_id; /** \brief The index of the first vertex to render. */ std::size_t vertex_index; /** \brief The count of vertices to render. */ std::size_t count; }; // struct element_range typedef std::vector element_range_list; public: gl_state ( const shader_program& shader, const position_vector& vertices, const color_type& c ); gl_state ( const shader_program& shader, const position_vector& vertices, const color_type& c, double line_width ); gl_state ( GLuint texture_id, const shader_program& shader, const position_vector& texture_coordinates, const position_vector& vertices, const color_type& c ); bool is_compatible_with( const gl_state& state ) const; void merge( const gl_state& state ); void draw( gl_draw& output ) const; private: void draw_shape( gl_draw& output ) const; void draw_textured( gl_draw& output ) const; void set_colors( gl_draw& output ) const; void set_vertices( gl_draw& output ) const; void set_texture_coordinates( gl_draw& output ) const; std::size_t get_vertex_count() const; GLenum get_gl_render_mode() const; void push_vertices( const position_vector& v ); void push_texture_coordinates( const position_vector& v ); void push_colors( const color_type& c, std::size_t count ); position_vector polygon_to_triangles( const position_vector& v ) const; private: /** \brief The number of coordinates in a vertex. */ static const std::size_t s_vertex_size; /** \brief Tells how to render the vertices. */ render_mode m_mode; /** \brief The identifier of the shader in use. */ shader_program m_shader; /** \brief The vertices of the shape to render. */ std::vector m_vertices; /** \brief The coordinates of the vertices in the texture. */ std::vector m_texture_coordinates; /** \brief The colors of the vertices. */ std::vector m_colors; /** \brief The width of the line to draw. */ double m_line_width; /** \brief How to render the vertices in the state. */ element_range_list m_elements; }; // class gl_state } // namespace visual } // namespace bear #endif // __VISUAL_GL_STATE_HPP__ plee-the-bear-20251226/bear-engine/core/src/visual/gl_vertex_shader.hpp000066400000000000000000000017561512343254000256350ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A class to use OpenGL vertex shaders. * \author Julien Jorge */ #ifndef __VISUAL_GL_VERTEX_SHADER_HPP__ #define __VISUAL_GL_VERTEX_SHADER_HPP__ #include "visual/gl.hpp" #include "visual/class_export.hpp" #include namespace bear { namespace visual { /** * \brief A vertex shader finalizes the rendering of the pixels. * \author Julien Jorge */ class VISUAL_EXPORT gl_vertex_shader { public: gl_vertex_shader( const std::string& p ); ~gl_vertex_shader(); GLuint shader_id() const; private: /** \brief The OpenGL identifier of the vertex shader. */ GLuint m_vertex_shader; }; // gl_vertex_shader } // namespace visual } // namespace bear #endif // __VISUAL_GL_VERTEX_SHADER_HPP__ plee-the-bear-20251226/bear-engine/core/src/visual/glew/000077500000000000000000000000001512343254000225245ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/core/src/visual/glew/code/000077500000000000000000000000001512343254000234365ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/core/src/visual/glew/code/glew.cpp000066400000000000000000032040361512343254000251100ustar00rootroot00000000000000/* ** The OpenGL Extension Wrangler Library ** Copyright (C) 2002-2008, Milan Ikits ** Copyright (C) 2002-2008, Marcelo E. Magallon ** Copyright (C) 2002, Lev Povalahev ** All rights reserved. ** ** Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are met: ** ** * Redistributions of source code must retain the above copyright notice, ** this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright notice, ** this list of conditions and the following disclaimer in the documentation ** and/or other materials provided with the distribution. ** * The name of the author may be used to endorse or promote products ** derived from this software without specific prior written permission. ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" ** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ** ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE ** LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR ** CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF ** SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS ** INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN ** CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ** ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF ** THE POSSIBILITY OF SUCH DAMAGE. */ #include "visual/glew/glew.h" #if 1 #if defined(_WIN32) # include "visual/glew/wglew.h" #elif !defined(__ANDROID__) && (!defined(__APPLE__) || defined(GLEW_APPLE_GLX)) # include "visual/glew/glxew.h" #endif #endif /* * Define glewGetContext and related helper macros. */ #ifdef GLEW_MX # define glewGetContext() ctx # ifdef _WIN32 # define GLEW_CONTEXT_ARG_DEF_INIT GLEWContext* ctx # define GLEW_CONTEXT_ARG_VAR_INIT ctx # define wglewGetContext() ctx # define WGLEW_CONTEXT_ARG_DEF_INIT WGLEWContext* ctx # define WGLEW_CONTEXT_ARG_DEF_LIST WGLEWContext* ctx # else /* _WIN32 */ # define GLEW_CONTEXT_ARG_DEF_INIT void # define GLEW_CONTEXT_ARG_VAR_INIT # define glxewGetContext() ctx # define GLXEW_CONTEXT_ARG_DEF_INIT void # define GLXEW_CONTEXT_ARG_DEF_LIST GLXEWContext* ctx # endif /* _WIN32 */ # define GLEW_CONTEXT_ARG_DEF_LIST GLEWContext* ctx #else /* GLEW_MX */ # define GLEW_CONTEXT_ARG_DEF_INIT void # define GLEW_CONTEXT_ARG_VAR_INIT # define GLEW_CONTEXT_ARG_DEF_LIST void # define WGLEW_CONTEXT_ARG_DEF_INIT void # define WGLEW_CONTEXT_ARG_DEF_LIST void # define GLXEW_CONTEXT_ARG_DEF_INIT void # define GLXEW_CONTEXT_ARG_DEF_LIST void #endif /* GLEW_MX */ #if defined(__sgi) || defined (__sun) || defined(GLEW_APPLE_GLX) #include #include #include void* dlGetProcAddress (const GLubyte* name) { static void* h = NULL; static void* gpa; if (h == NULL) { if ((h = dlopen(NULL, RTLD_LAZY | RTLD_LOCAL)) == NULL) return NULL; gpa = dlsym(h, "glXGetProcAddress"); } if (gpa != NULL) return ((void*(*)(const GLubyte*))gpa)(name); else return dlsym(h, (const char*)name); } #endif /* __sgi || __sun || GLEW_APPLE_GLX */ #if defined(__APPLE__) #include #include #include #ifdef MAC_OS_X_VERSION_10_3 #include void* NSGLGetProcAddress (const GLubyte *name) { static void* image = NULL; void* addr; if (NULL == image) { #ifdef GLEW_REGAL image = dlopen("libRegal.dylib", RTLD_LAZY); #else image = dlopen("/System/Library/Frameworks/OpenGL.framework/Versions/Current/OpenGL", RTLD_LAZY); #endif } if( !image ) return NULL; addr = dlsym(image, (const char*)name); if( addr ) return addr; #ifdef GLEW_APPLE_GLX return dlGetProcAddress( name ); // try next for glx symbols #else return NULL; #endif } #else #include void* NSGLGetProcAddress (const GLubyte *name) { static const struct mach_header* image = NULL; NSSymbol symbol; char* symbolName; if (NULL == image) { #ifdef GLEW_REGAL image = NSAddImage("libRegal.dylib", NSADDIMAGE_OPTION_RETURN_ON_ERROR); #else image = NSAddImage("/System/Library/Frameworks/OpenGL.framework/Versions/Current/OpenGL", NSADDIMAGE_OPTION_RETURN_ON_ERROR); #endif } /* prepend a '_' for the Unix C symbol mangling convention */ symbolName = malloc(strlen((const char*)name) + 2); strcpy(symbolName+1, (const char*)name); symbolName[0] = '_'; symbol = NULL; /* if (NSIsSymbolNameDefined(symbolName)) symbol = NSLookupAndBindSymbol(symbolName); */ symbol = image ? NSLookupSymbolInImage(image, symbolName, NSLOOKUPSYMBOLINIMAGE_OPTION_BIND | NSLOOKUPSYMBOLINIMAGE_OPTION_RETURN_ON_ERROR) : NULL; free(symbolName); if( symbol ) return NSAddressOfSymbol(symbol); #ifdef GLEW_APPLE_GLX return dlGetProcAddress( name ); // try next for glx symbols #else return NULL; #endif } #endif /* MAC_OS_X_VERSION_10_3 */ #endif /* __APPLE__ */ /* * Define glewGetProcAddress. */ #if defined(_WIN32) # define glewGetProcAddress(name) wglGetProcAddress((LPCSTR)name) #elif defined(__APPLE__) && !defined(GLEW_APPLE_GLX) # define glewGetProcAddress(name) NSGLGetProcAddress(name) #elif defined(__sgi) || defined(__sun) # define glewGetProcAddress(name) dlGetProcAddress(name) #elif defined(__ANDROID__) # define glewGetProcAddress(name) NULL /* TODO */ #else /* __linux */ # define glewGetProcAddress(name) (*glXGetProcAddressARB)(name) #endif /* * Define GLboolean const cast. */ #define CONST_CAST(x) (*(GLboolean*)&x) /* * GLEW, just like OpenGL or GLU, does not rely on the standard C library. * These functions implement the functionality required in this file. */ static GLuint _glewStrLen (const GLubyte* s) { GLuint i=0; if (s == NULL) return 0; while (s[i] != '\0') i++; return i; } static GLuint _glewStrCLen (const GLubyte* s, GLubyte c) { GLuint i=0; if (s == NULL) return 0; while (s[i] != '\0' && s[i] != c) i++; return (s[i] == '\0' || s[i] == c) ? i : 0; } static GLboolean _glewStrSame (const GLubyte* a, const GLubyte* b, GLuint n) { GLuint i=0; if(a == NULL || b == NULL) return (a == NULL && b == NULL && n == 0) ? GL_TRUE : GL_FALSE; while (i < n && a[i] != '\0' && b[i] != '\0' && a[i] == b[i]) i++; return i == n ? GL_TRUE : GL_FALSE; } static GLboolean _glewStrSame1 (GLubyte** a, GLuint* na, const GLubyte* b, GLuint nb) { while (*na > 0 && (**a == ' ' || **a == '\n' || **a == '\r' || **a == '\t')) { (*a)++; (*na)--; } if(*na >= nb) { GLuint i=0; while (i < nb && (*a)+i != NULL && b+i != NULL && (*a)[i] == b[i]) i++; if(i == nb) { *a = *a + nb; *na = *na - nb; return GL_TRUE; } } return GL_FALSE; } static GLboolean _glewStrSame2 (GLubyte** a, GLuint* na, const GLubyte* b, GLuint nb) { if(*na >= nb) { GLuint i=0; while (i < nb && (*a)+i != NULL && b+i != NULL && (*a)[i] == b[i]) i++; if(i == nb) { *a = *a + nb; *na = *na - nb; return GL_TRUE; } } return GL_FALSE; } static GLboolean _glewStrSame3 (GLubyte** a, GLuint* na, const GLubyte* b, GLuint nb) { if(*na >= nb) { GLuint i=0; while (i < nb && (*a)+i != NULL && b+i != NULL && (*a)[i] == b[i]) i++; if (i == nb && (*na == nb || (*a)[i] == ' ' || (*a)[i] == '\n' || (*a)[i] == '\r' || (*a)[i] == '\t')) { *a = *a + nb; *na = *na - nb; return GL_TRUE; } } return GL_FALSE; } /* * Search for name in the extensions string. Use of strstr() * is not sufficient because extension names can be prefixes of * other extension names. Could use strtok() but the constant * string returned by glGetString might be in read-only memory. */ static GLboolean _glewSearchExtension (const char* name, const GLubyte *start, const GLubyte *end) { const GLubyte* p; GLuint len = _glewStrLen((const GLubyte*)name); p = start; while (p < end) { GLuint n = _glewStrCLen(p, ' '); if (len == n && _glewStrSame((const GLubyte*)name, p, n)) return GL_TRUE; p += n+1; } return GL_FALSE; } #if !defined(_WIN32) || !defined(GLEW_MX) PFNGLCOPYTEXSUBIMAGE3DPROC __glewCopyTexSubImage3D = NULL; PFNGLDRAWRANGEELEMENTSPROC __glewDrawRangeElements = NULL; PFNGLTEXIMAGE3DPROC __glewTexImage3D = NULL; PFNGLTEXSUBIMAGE3DPROC __glewTexSubImage3D = NULL; PFNGLACTIVETEXTUREPROC __glewActiveTexture = NULL; PFNGLCLIENTACTIVETEXTUREPROC __glewClientActiveTexture = NULL; PFNGLCOMPRESSEDTEXIMAGE1DPROC __glewCompressedTexImage1D = NULL; PFNGLCOMPRESSEDTEXIMAGE2DPROC __glewCompressedTexImage2D = NULL; PFNGLCOMPRESSEDTEXIMAGE3DPROC __glewCompressedTexImage3D = NULL; PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC __glewCompressedTexSubImage1D = NULL; PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC __glewCompressedTexSubImage2D = NULL; PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC __glewCompressedTexSubImage3D = NULL; PFNGLGETCOMPRESSEDTEXIMAGEPROC __glewGetCompressedTexImage = NULL; PFNGLLOADTRANSPOSEMATRIXDPROC __glewLoadTransposeMatrixd = NULL; PFNGLLOADTRANSPOSEMATRIXFPROC __glewLoadTransposeMatrixf = NULL; PFNGLMULTTRANSPOSEMATRIXDPROC __glewMultTransposeMatrixd = NULL; PFNGLMULTTRANSPOSEMATRIXFPROC __glewMultTransposeMatrixf = NULL; PFNGLMULTITEXCOORD1DPROC __glewMultiTexCoord1d = NULL; PFNGLMULTITEXCOORD1DVPROC __glewMultiTexCoord1dv = NULL; PFNGLMULTITEXCOORD1FPROC __glewMultiTexCoord1f = NULL; PFNGLMULTITEXCOORD1FVPROC __glewMultiTexCoord1fv = NULL; PFNGLMULTITEXCOORD1IPROC __glewMultiTexCoord1i = NULL; PFNGLMULTITEXCOORD1IVPROC __glewMultiTexCoord1iv = NULL; PFNGLMULTITEXCOORD1SPROC __glewMultiTexCoord1s = NULL; PFNGLMULTITEXCOORD1SVPROC __glewMultiTexCoord1sv = NULL; PFNGLMULTITEXCOORD2DPROC __glewMultiTexCoord2d = NULL; PFNGLMULTITEXCOORD2DVPROC __glewMultiTexCoord2dv = NULL; PFNGLMULTITEXCOORD2FPROC __glewMultiTexCoord2f = NULL; PFNGLMULTITEXCOORD2FVPROC __glewMultiTexCoord2fv = NULL; PFNGLMULTITEXCOORD2IPROC __glewMultiTexCoord2i = NULL; PFNGLMULTITEXCOORD2IVPROC __glewMultiTexCoord2iv = NULL; PFNGLMULTITEXCOORD2SPROC __glewMultiTexCoord2s = NULL; PFNGLMULTITEXCOORD2SVPROC __glewMultiTexCoord2sv = NULL; PFNGLMULTITEXCOORD3DPROC __glewMultiTexCoord3d = NULL; PFNGLMULTITEXCOORD3DVPROC __glewMultiTexCoord3dv = NULL; PFNGLMULTITEXCOORD3FPROC __glewMultiTexCoord3f = NULL; PFNGLMULTITEXCOORD3FVPROC __glewMultiTexCoord3fv = NULL; PFNGLMULTITEXCOORD3IPROC __glewMultiTexCoord3i = NULL; PFNGLMULTITEXCOORD3IVPROC __glewMultiTexCoord3iv = NULL; PFNGLMULTITEXCOORD3SPROC __glewMultiTexCoord3s = NULL; PFNGLMULTITEXCOORD3SVPROC __glewMultiTexCoord3sv = NULL; PFNGLMULTITEXCOORD4DPROC __glewMultiTexCoord4d = NULL; PFNGLMULTITEXCOORD4DVPROC __glewMultiTexCoord4dv = NULL; PFNGLMULTITEXCOORD4FPROC __glewMultiTexCoord4f = NULL; PFNGLMULTITEXCOORD4FVPROC __glewMultiTexCoord4fv = NULL; PFNGLMULTITEXCOORD4IPROC __glewMultiTexCoord4i = NULL; PFNGLMULTITEXCOORD4IVPROC __glewMultiTexCoord4iv = NULL; PFNGLMULTITEXCOORD4SPROC __glewMultiTexCoord4s = NULL; PFNGLMULTITEXCOORD4SVPROC __glewMultiTexCoord4sv = NULL; PFNGLSAMPLECOVERAGEPROC __glewSampleCoverage = NULL; PFNGLBLENDCOLORPROC __glewBlendColor = NULL; PFNGLBLENDEQUATIONPROC __glewBlendEquation = NULL; PFNGLBLENDFUNCSEPARATEPROC __glewBlendFuncSeparate = NULL; PFNGLFOGCOORDPOINTERPROC __glewFogCoordPointer = NULL; PFNGLFOGCOORDDPROC __glewFogCoordd = NULL; PFNGLFOGCOORDDVPROC __glewFogCoorddv = NULL; PFNGLFOGCOORDFPROC __glewFogCoordf = NULL; PFNGLFOGCOORDFVPROC __glewFogCoordfv = NULL; PFNGLMULTIDRAWARRAYSPROC __glewMultiDrawArrays = NULL; PFNGLMULTIDRAWELEMENTSPROC __glewMultiDrawElements = NULL; PFNGLPOINTPARAMETERFPROC __glewPointParameterf = NULL; PFNGLPOINTPARAMETERFVPROC __glewPointParameterfv = NULL; PFNGLPOINTPARAMETERIPROC __glewPointParameteri = NULL; PFNGLPOINTPARAMETERIVPROC __glewPointParameteriv = NULL; PFNGLSECONDARYCOLOR3BPROC __glewSecondaryColor3b = NULL; PFNGLSECONDARYCOLOR3BVPROC __glewSecondaryColor3bv = NULL; PFNGLSECONDARYCOLOR3DPROC __glewSecondaryColor3d = NULL; PFNGLSECONDARYCOLOR3DVPROC __glewSecondaryColor3dv = NULL; PFNGLSECONDARYCOLOR3FPROC __glewSecondaryColor3f = NULL; PFNGLSECONDARYCOLOR3FVPROC __glewSecondaryColor3fv = NULL; PFNGLSECONDARYCOLOR3IPROC __glewSecondaryColor3i = NULL; PFNGLSECONDARYCOLOR3IVPROC __glewSecondaryColor3iv = NULL; PFNGLSECONDARYCOLOR3SPROC __glewSecondaryColor3s = NULL; PFNGLSECONDARYCOLOR3SVPROC __glewSecondaryColor3sv = NULL; PFNGLSECONDARYCOLOR3UBPROC __glewSecondaryColor3ub = NULL; PFNGLSECONDARYCOLOR3UBVPROC __glewSecondaryColor3ubv = NULL; PFNGLSECONDARYCOLOR3UIPROC __glewSecondaryColor3ui = NULL; PFNGLSECONDARYCOLOR3UIVPROC __glewSecondaryColor3uiv = NULL; PFNGLSECONDARYCOLOR3USPROC __glewSecondaryColor3us = NULL; PFNGLSECONDARYCOLOR3USVPROC __glewSecondaryColor3usv = NULL; PFNGLSECONDARYCOLORPOINTERPROC __glewSecondaryColorPointer = NULL; PFNGLWINDOWPOS2DPROC __glewWindowPos2d = NULL; PFNGLWINDOWPOS2DVPROC __glewWindowPos2dv = NULL; PFNGLWINDOWPOS2FPROC __glewWindowPos2f = NULL; PFNGLWINDOWPOS2FVPROC __glewWindowPos2fv = NULL; PFNGLWINDOWPOS2IPROC __glewWindowPos2i = NULL; PFNGLWINDOWPOS2IVPROC __glewWindowPos2iv = NULL; PFNGLWINDOWPOS2SPROC __glewWindowPos2s = NULL; PFNGLWINDOWPOS2SVPROC __glewWindowPos2sv = NULL; PFNGLWINDOWPOS3DPROC __glewWindowPos3d = NULL; PFNGLWINDOWPOS3DVPROC __glewWindowPos3dv = NULL; PFNGLWINDOWPOS3FPROC __glewWindowPos3f = NULL; PFNGLWINDOWPOS3FVPROC __glewWindowPos3fv = NULL; PFNGLWINDOWPOS3IPROC __glewWindowPos3i = NULL; PFNGLWINDOWPOS3IVPROC __glewWindowPos3iv = NULL; PFNGLWINDOWPOS3SPROC __glewWindowPos3s = NULL; PFNGLWINDOWPOS3SVPROC __glewWindowPos3sv = NULL; PFNGLBEGINQUERYPROC __glewBeginQuery = NULL; PFNGLBINDBUFFERPROC __glewBindBuffer = NULL; PFNGLBUFFERDATAPROC __glewBufferData = NULL; PFNGLBUFFERSUBDATAPROC __glewBufferSubData = NULL; PFNGLDELETEBUFFERSPROC __glewDeleteBuffers = NULL; PFNGLDELETEQUERIESPROC __glewDeleteQueries = NULL; PFNGLENDQUERYPROC __glewEndQuery = NULL; PFNGLGENBUFFERSPROC __glewGenBuffers = NULL; PFNGLGENQUERIESPROC __glewGenQueries = NULL; PFNGLGETBUFFERPARAMETERIVPROC __glewGetBufferParameteriv = NULL; PFNGLGETBUFFERPOINTERVPROC __glewGetBufferPointerv = NULL; PFNGLGETBUFFERSUBDATAPROC __glewGetBufferSubData = NULL; PFNGLGETQUERYOBJECTIVPROC __glewGetQueryObjectiv = NULL; PFNGLGETQUERYOBJECTUIVPROC __glewGetQueryObjectuiv = NULL; PFNGLGETQUERYIVPROC __glewGetQueryiv = NULL; PFNGLISBUFFERPROC __glewIsBuffer = NULL; PFNGLISQUERYPROC __glewIsQuery = NULL; PFNGLMAPBUFFERPROC __glewMapBuffer = NULL; PFNGLUNMAPBUFFERPROC __glewUnmapBuffer = NULL; PFNGLATTACHSHADERPROC __glewAttachShader = NULL; PFNGLBINDATTRIBLOCATIONPROC __glewBindAttribLocation = NULL; PFNGLBLENDEQUATIONSEPARATEPROC __glewBlendEquationSeparate = NULL; PFNGLCOMPILESHADERPROC __glewCompileShader = NULL; PFNGLCREATEPROGRAMPROC __glewCreateProgram = NULL; PFNGLCREATESHADERPROC __glewCreateShader = NULL; PFNGLDELETEPROGRAMPROC __glewDeleteProgram = NULL; PFNGLDELETESHADERPROC __glewDeleteShader = NULL; PFNGLDETACHSHADERPROC __glewDetachShader = NULL; PFNGLDISABLEVERTEXATTRIBARRAYPROC __glewDisableVertexAttribArray = NULL; PFNGLDRAWBUFFERSPROC __glewDrawBuffers = NULL; PFNGLENABLEVERTEXATTRIBARRAYPROC __glewEnableVertexAttribArray = NULL; PFNGLGETACTIVEATTRIBPROC __glewGetActiveAttrib = NULL; PFNGLGETACTIVEUNIFORMPROC __glewGetActiveUniform = NULL; PFNGLGETATTACHEDSHADERSPROC __glewGetAttachedShaders = NULL; PFNGLGETATTRIBLOCATIONPROC __glewGetAttribLocation = NULL; PFNGLGETPROGRAMINFOLOGPROC __glewGetProgramInfoLog = NULL; PFNGLGETPROGRAMIVPROC __glewGetProgramiv = NULL; PFNGLGETSHADERINFOLOGPROC __glewGetShaderInfoLog = NULL; PFNGLGETSHADERSOURCEPROC __glewGetShaderSource = NULL; PFNGLGETSHADERIVPROC __glewGetShaderiv = NULL; PFNGLGETUNIFORMLOCATIONPROC __glewGetUniformLocation = NULL; PFNGLGETUNIFORMFVPROC __glewGetUniformfv = NULL; PFNGLGETUNIFORMIVPROC __glewGetUniformiv = NULL; PFNGLGETVERTEXATTRIBPOINTERVPROC __glewGetVertexAttribPointerv = NULL; PFNGLGETVERTEXATTRIBDVPROC __glewGetVertexAttribdv = NULL; PFNGLGETVERTEXATTRIBFVPROC __glewGetVertexAttribfv = NULL; PFNGLGETVERTEXATTRIBIVPROC __glewGetVertexAttribiv = NULL; PFNGLISPROGRAMPROC __glewIsProgram = NULL; PFNGLISSHADERPROC __glewIsShader = NULL; PFNGLLINKPROGRAMPROC __glewLinkProgram = NULL; PFNGLSHADERSOURCEPROC __glewShaderSource = NULL; PFNGLSTENCILFUNCSEPARATEPROC __glewStencilFuncSeparate = NULL; PFNGLSTENCILMASKSEPARATEPROC __glewStencilMaskSeparate = NULL; PFNGLSTENCILOPSEPARATEPROC __glewStencilOpSeparate = NULL; PFNGLUNIFORM1FPROC __glewUniform1f = NULL; PFNGLUNIFORM1FVPROC __glewUniform1fv = NULL; PFNGLUNIFORM1IPROC __glewUniform1i = NULL; PFNGLUNIFORM1IVPROC __glewUniform1iv = NULL; PFNGLUNIFORM2FPROC __glewUniform2f = NULL; PFNGLUNIFORM2FVPROC __glewUniform2fv = NULL; PFNGLUNIFORM2IPROC __glewUniform2i = NULL; PFNGLUNIFORM2IVPROC __glewUniform2iv = NULL; PFNGLUNIFORM3FPROC __glewUniform3f = NULL; PFNGLUNIFORM3FVPROC __glewUniform3fv = NULL; PFNGLUNIFORM3IPROC __glewUniform3i = NULL; PFNGLUNIFORM3IVPROC __glewUniform3iv = NULL; PFNGLUNIFORM4FPROC __glewUniform4f = NULL; PFNGLUNIFORM4FVPROC __glewUniform4fv = NULL; PFNGLUNIFORM4IPROC __glewUniform4i = NULL; PFNGLUNIFORM4IVPROC __glewUniform4iv = NULL; PFNGLUNIFORMMATRIX2FVPROC __glewUniformMatrix2fv = NULL; PFNGLUNIFORMMATRIX3FVPROC __glewUniformMatrix3fv = NULL; PFNGLUNIFORMMATRIX4FVPROC __glewUniformMatrix4fv = NULL; PFNGLUSEPROGRAMPROC __glewUseProgram = NULL; PFNGLVALIDATEPROGRAMPROC __glewValidateProgram = NULL; PFNGLVERTEXATTRIB1DPROC __glewVertexAttrib1d = NULL; PFNGLVERTEXATTRIB1DVPROC __glewVertexAttrib1dv = NULL; PFNGLVERTEXATTRIB1FPROC __glewVertexAttrib1f = NULL; PFNGLVERTEXATTRIB1FVPROC __glewVertexAttrib1fv = NULL; PFNGLVERTEXATTRIB1SPROC __glewVertexAttrib1s = NULL; PFNGLVERTEXATTRIB1SVPROC __glewVertexAttrib1sv = NULL; PFNGLVERTEXATTRIB2DPROC __glewVertexAttrib2d = NULL; PFNGLVERTEXATTRIB2DVPROC __glewVertexAttrib2dv = NULL; PFNGLVERTEXATTRIB2FPROC __glewVertexAttrib2f = NULL; PFNGLVERTEXATTRIB2FVPROC __glewVertexAttrib2fv = NULL; PFNGLVERTEXATTRIB2SPROC __glewVertexAttrib2s = NULL; PFNGLVERTEXATTRIB2SVPROC __glewVertexAttrib2sv = NULL; PFNGLVERTEXATTRIB3DPROC __glewVertexAttrib3d = NULL; PFNGLVERTEXATTRIB3DVPROC __glewVertexAttrib3dv = NULL; PFNGLVERTEXATTRIB3FPROC __glewVertexAttrib3f = NULL; PFNGLVERTEXATTRIB3FVPROC __glewVertexAttrib3fv = NULL; PFNGLVERTEXATTRIB3SPROC __glewVertexAttrib3s = NULL; PFNGLVERTEXATTRIB3SVPROC __glewVertexAttrib3sv = NULL; PFNGLVERTEXATTRIB4NBVPROC __glewVertexAttrib4Nbv = NULL; PFNGLVERTEXATTRIB4NIVPROC __glewVertexAttrib4Niv = NULL; PFNGLVERTEXATTRIB4NSVPROC __glewVertexAttrib4Nsv = NULL; PFNGLVERTEXATTRIB4NUBPROC __glewVertexAttrib4Nub = NULL; PFNGLVERTEXATTRIB4NUBVPROC __glewVertexAttrib4Nubv = NULL; PFNGLVERTEXATTRIB4NUIVPROC __glewVertexAttrib4Nuiv = NULL; PFNGLVERTEXATTRIB4NUSVPROC __glewVertexAttrib4Nusv = NULL; PFNGLVERTEXATTRIB4BVPROC __glewVertexAttrib4bv = NULL; PFNGLVERTEXATTRIB4DPROC __glewVertexAttrib4d = NULL; PFNGLVERTEXATTRIB4DVPROC __glewVertexAttrib4dv = NULL; PFNGLVERTEXATTRIB4FPROC __glewVertexAttrib4f = NULL; PFNGLVERTEXATTRIB4FVPROC __glewVertexAttrib4fv = NULL; PFNGLVERTEXATTRIB4IVPROC __glewVertexAttrib4iv = NULL; PFNGLVERTEXATTRIB4SPROC __glewVertexAttrib4s = NULL; PFNGLVERTEXATTRIB4SVPROC __glewVertexAttrib4sv = NULL; PFNGLVERTEXATTRIB4UBVPROC __glewVertexAttrib4ubv = NULL; PFNGLVERTEXATTRIB4UIVPROC __glewVertexAttrib4uiv = NULL; PFNGLVERTEXATTRIB4USVPROC __glewVertexAttrib4usv = NULL; PFNGLVERTEXATTRIBPOINTERPROC __glewVertexAttribPointer = NULL; PFNGLUNIFORMMATRIX2X3FVPROC __glewUniformMatrix2x3fv = NULL; PFNGLUNIFORMMATRIX2X4FVPROC __glewUniformMatrix2x4fv = NULL; PFNGLUNIFORMMATRIX3X2FVPROC __glewUniformMatrix3x2fv = NULL; PFNGLUNIFORMMATRIX3X4FVPROC __glewUniformMatrix3x4fv = NULL; PFNGLUNIFORMMATRIX4X2FVPROC __glewUniformMatrix4x2fv = NULL; PFNGLUNIFORMMATRIX4X3FVPROC __glewUniformMatrix4x3fv = NULL; PFNGLBEGINCONDITIONALRENDERPROC __glewBeginConditionalRender = NULL; PFNGLBEGINTRANSFORMFEEDBACKPROC __glewBeginTransformFeedback = NULL; PFNGLBINDFRAGDATALOCATIONPROC __glewBindFragDataLocation = NULL; PFNGLCLAMPCOLORPROC __glewClampColor = NULL; PFNGLCLEARBUFFERFIPROC __glewClearBufferfi = NULL; PFNGLCLEARBUFFERFVPROC __glewClearBufferfv = NULL; PFNGLCLEARBUFFERIVPROC __glewClearBufferiv = NULL; PFNGLCLEARBUFFERUIVPROC __glewClearBufferuiv = NULL; PFNGLCOLORMASKIPROC __glewColorMaski = NULL; PFNGLDISABLEIPROC __glewDisablei = NULL; PFNGLENABLEIPROC __glewEnablei = NULL; PFNGLENDCONDITIONALRENDERPROC __glewEndConditionalRender = NULL; PFNGLENDTRANSFORMFEEDBACKPROC __glewEndTransformFeedback = NULL; PFNGLGETBOOLEANI_VPROC __glewGetBooleani_v = NULL; PFNGLGETFRAGDATALOCATIONPROC __glewGetFragDataLocation = NULL; PFNGLGETSTRINGIPROC __glewGetStringi = NULL; PFNGLGETTEXPARAMETERIIVPROC __glewGetTexParameterIiv = NULL; PFNGLGETTEXPARAMETERIUIVPROC __glewGetTexParameterIuiv = NULL; PFNGLGETTRANSFORMFEEDBACKVARYINGPROC __glewGetTransformFeedbackVarying = NULL; PFNGLGETUNIFORMUIVPROC __glewGetUniformuiv = NULL; PFNGLGETVERTEXATTRIBIIVPROC __glewGetVertexAttribIiv = NULL; PFNGLGETVERTEXATTRIBIUIVPROC __glewGetVertexAttribIuiv = NULL; PFNGLISENABLEDIPROC __glewIsEnabledi = NULL; PFNGLTEXPARAMETERIIVPROC __glewTexParameterIiv = NULL; PFNGLTEXPARAMETERIUIVPROC __glewTexParameterIuiv = NULL; PFNGLTRANSFORMFEEDBACKVARYINGSPROC __glewTransformFeedbackVaryings = NULL; PFNGLUNIFORM1UIPROC __glewUniform1ui = NULL; PFNGLUNIFORM1UIVPROC __glewUniform1uiv = NULL; PFNGLUNIFORM2UIPROC __glewUniform2ui = NULL; PFNGLUNIFORM2UIVPROC __glewUniform2uiv = NULL; PFNGLUNIFORM3UIPROC __glewUniform3ui = NULL; PFNGLUNIFORM3UIVPROC __glewUniform3uiv = NULL; PFNGLUNIFORM4UIPROC __glewUniform4ui = NULL; PFNGLUNIFORM4UIVPROC __glewUniform4uiv = NULL; PFNGLVERTEXATTRIBI1IPROC __glewVertexAttribI1i = NULL; PFNGLVERTEXATTRIBI1IVPROC __glewVertexAttribI1iv = NULL; PFNGLVERTEXATTRIBI1UIPROC __glewVertexAttribI1ui = NULL; PFNGLVERTEXATTRIBI1UIVPROC __glewVertexAttribI1uiv = NULL; PFNGLVERTEXATTRIBI2IPROC __glewVertexAttribI2i = NULL; PFNGLVERTEXATTRIBI2IVPROC __glewVertexAttribI2iv = NULL; PFNGLVERTEXATTRIBI2UIPROC __glewVertexAttribI2ui = NULL; PFNGLVERTEXATTRIBI2UIVPROC __glewVertexAttribI2uiv = NULL; PFNGLVERTEXATTRIBI3IPROC __glewVertexAttribI3i = NULL; PFNGLVERTEXATTRIBI3IVPROC __glewVertexAttribI3iv = NULL; PFNGLVERTEXATTRIBI3UIPROC __glewVertexAttribI3ui = NULL; PFNGLVERTEXATTRIBI3UIVPROC __glewVertexAttribI3uiv = NULL; PFNGLVERTEXATTRIBI4BVPROC __glewVertexAttribI4bv = NULL; PFNGLVERTEXATTRIBI4IPROC __glewVertexAttribI4i = NULL; PFNGLVERTEXATTRIBI4IVPROC __glewVertexAttribI4iv = NULL; PFNGLVERTEXATTRIBI4SVPROC __glewVertexAttribI4sv = NULL; PFNGLVERTEXATTRIBI4UBVPROC __glewVertexAttribI4ubv = NULL; PFNGLVERTEXATTRIBI4UIPROC __glewVertexAttribI4ui = NULL; PFNGLVERTEXATTRIBI4UIVPROC __glewVertexAttribI4uiv = NULL; PFNGLVERTEXATTRIBI4USVPROC __glewVertexAttribI4usv = NULL; PFNGLVERTEXATTRIBIPOINTERPROC __glewVertexAttribIPointer = NULL; PFNGLDRAWARRAYSINSTANCEDPROC __glewDrawArraysInstanced = NULL; PFNGLDRAWELEMENTSINSTANCEDPROC __glewDrawElementsInstanced = NULL; PFNGLPRIMITIVERESTARTINDEXPROC __glewPrimitiveRestartIndex = NULL; PFNGLTEXBUFFERPROC __glewTexBuffer = NULL; PFNGLFRAMEBUFFERTEXTUREPROC __glewFramebufferTexture = NULL; PFNGLGETBUFFERPARAMETERI64VPROC __glewGetBufferParameteri64v = NULL; PFNGLGETINTEGER64I_VPROC __glewGetInteger64i_v = NULL; PFNGLVERTEXATTRIBDIVISORPROC __glewVertexAttribDivisor = NULL; PFNGLBLENDEQUATIONSEPARATEIPROC __glewBlendEquationSeparatei = NULL; PFNGLBLENDEQUATIONIPROC __glewBlendEquationi = NULL; PFNGLBLENDFUNCSEPARATEIPROC __glewBlendFuncSeparatei = NULL; PFNGLBLENDFUNCIPROC __glewBlendFunci = NULL; PFNGLMINSAMPLESHADINGPROC __glewMinSampleShading = NULL; PFNGLTBUFFERMASK3DFXPROC __glewTbufferMask3DFX = NULL; PFNGLDEBUGMESSAGECALLBACKAMDPROC __glewDebugMessageCallbackAMD = NULL; PFNGLDEBUGMESSAGEENABLEAMDPROC __glewDebugMessageEnableAMD = NULL; PFNGLDEBUGMESSAGEINSERTAMDPROC __glewDebugMessageInsertAMD = NULL; PFNGLGETDEBUGMESSAGELOGAMDPROC __glewGetDebugMessageLogAMD = NULL; PFNGLBLENDEQUATIONINDEXEDAMDPROC __glewBlendEquationIndexedAMD = NULL; PFNGLBLENDEQUATIONSEPARATEINDEXEDAMDPROC __glewBlendEquationSeparateIndexedAMD = NULL; PFNGLBLENDFUNCINDEXEDAMDPROC __glewBlendFuncIndexedAMD = NULL; PFNGLBLENDFUNCSEPARATEINDEXEDAMDPROC __glewBlendFuncSeparateIndexedAMD = NULL; PFNGLMULTIDRAWARRAYSINDIRECTAMDPROC __glewMultiDrawArraysIndirectAMD = NULL; PFNGLMULTIDRAWELEMENTSINDIRECTAMDPROC __glewMultiDrawElementsIndirectAMD = NULL; PFNGLDELETENAMESAMDPROC __glewDeleteNamesAMD = NULL; PFNGLGENNAMESAMDPROC __glewGenNamesAMD = NULL; PFNGLISNAMEAMDPROC __glewIsNameAMD = NULL; PFNGLBEGINPERFMONITORAMDPROC __glewBeginPerfMonitorAMD = NULL; PFNGLDELETEPERFMONITORSAMDPROC __glewDeletePerfMonitorsAMD = NULL; PFNGLENDPERFMONITORAMDPROC __glewEndPerfMonitorAMD = NULL; PFNGLGENPERFMONITORSAMDPROC __glewGenPerfMonitorsAMD = NULL; PFNGLGETPERFMONITORCOUNTERDATAAMDPROC __glewGetPerfMonitorCounterDataAMD = NULL; PFNGLGETPERFMONITORCOUNTERINFOAMDPROC __glewGetPerfMonitorCounterInfoAMD = NULL; PFNGLGETPERFMONITORCOUNTERSTRINGAMDPROC __glewGetPerfMonitorCounterStringAMD = NULL; PFNGLGETPERFMONITORCOUNTERSAMDPROC __glewGetPerfMonitorCountersAMD = NULL; PFNGLGETPERFMONITORGROUPSTRINGAMDPROC __glewGetPerfMonitorGroupStringAMD = NULL; PFNGLGETPERFMONITORGROUPSAMDPROC __glewGetPerfMonitorGroupsAMD = NULL; PFNGLSELECTPERFMONITORCOUNTERSAMDPROC __glewSelectPerfMonitorCountersAMD = NULL; PFNGLSETMULTISAMPLEFVAMDPROC __glewSetMultisamplefvAMD = NULL; PFNGLSTENCILOPVALUEAMDPROC __glewStencilOpValueAMD = NULL; PFNGLTESSELLATIONFACTORAMDPROC __glewTessellationFactorAMD = NULL; PFNGLTESSELLATIONMODEAMDPROC __glewTessellationModeAMD = NULL; PFNGLDRAWELEMENTARRAYAPPLEPROC __glewDrawElementArrayAPPLE = NULL; PFNGLDRAWRANGEELEMENTARRAYAPPLEPROC __glewDrawRangeElementArrayAPPLE = NULL; PFNGLELEMENTPOINTERAPPLEPROC __glewElementPointerAPPLE = NULL; PFNGLMULTIDRAWELEMENTARRAYAPPLEPROC __glewMultiDrawElementArrayAPPLE = NULL; PFNGLMULTIDRAWRANGEELEMENTARRAYAPPLEPROC __glewMultiDrawRangeElementArrayAPPLE = NULL; PFNGLDELETEFENCESAPPLEPROC __glewDeleteFencesAPPLE = NULL; PFNGLFINISHFENCEAPPLEPROC __glewFinishFenceAPPLE = NULL; PFNGLFINISHOBJECTAPPLEPROC __glewFinishObjectAPPLE = NULL; PFNGLGENFENCESAPPLEPROC __glewGenFencesAPPLE = NULL; PFNGLISFENCEAPPLEPROC __glewIsFenceAPPLE = NULL; PFNGLSETFENCEAPPLEPROC __glewSetFenceAPPLE = NULL; PFNGLTESTFENCEAPPLEPROC __glewTestFenceAPPLE = NULL; PFNGLTESTOBJECTAPPLEPROC __glewTestObjectAPPLE = NULL; PFNGLBUFFERPARAMETERIAPPLEPROC __glewBufferParameteriAPPLE = NULL; PFNGLFLUSHMAPPEDBUFFERRANGEAPPLEPROC __glewFlushMappedBufferRangeAPPLE = NULL; PFNGLGETOBJECTPARAMETERIVAPPLEPROC __glewGetObjectParameterivAPPLE = NULL; PFNGLOBJECTPURGEABLEAPPLEPROC __glewObjectPurgeableAPPLE = NULL; PFNGLOBJECTUNPURGEABLEAPPLEPROC __glewObjectUnpurgeableAPPLE = NULL; PFNGLGETTEXPARAMETERPOINTERVAPPLEPROC __glewGetTexParameterPointervAPPLE = NULL; PFNGLTEXTURERANGEAPPLEPROC __glewTextureRangeAPPLE = NULL; PFNGLBINDVERTEXARRAYAPPLEPROC __glewBindVertexArrayAPPLE = NULL; PFNGLDELETEVERTEXARRAYSAPPLEPROC __glewDeleteVertexArraysAPPLE = NULL; PFNGLGENVERTEXARRAYSAPPLEPROC __glewGenVertexArraysAPPLE = NULL; PFNGLISVERTEXARRAYAPPLEPROC __glewIsVertexArrayAPPLE = NULL; PFNGLFLUSHVERTEXARRAYRANGEAPPLEPROC __glewFlushVertexArrayRangeAPPLE = NULL; PFNGLVERTEXARRAYPARAMETERIAPPLEPROC __glewVertexArrayParameteriAPPLE = NULL; PFNGLVERTEXARRAYRANGEAPPLEPROC __glewVertexArrayRangeAPPLE = NULL; PFNGLDISABLEVERTEXATTRIBAPPLEPROC __glewDisableVertexAttribAPPLE = NULL; PFNGLENABLEVERTEXATTRIBAPPLEPROC __glewEnableVertexAttribAPPLE = NULL; PFNGLISVERTEXATTRIBENABLEDAPPLEPROC __glewIsVertexAttribEnabledAPPLE = NULL; PFNGLMAPVERTEXATTRIB1DAPPLEPROC __glewMapVertexAttrib1dAPPLE = NULL; PFNGLMAPVERTEXATTRIB1FAPPLEPROC __glewMapVertexAttrib1fAPPLE = NULL; PFNGLMAPVERTEXATTRIB2DAPPLEPROC __glewMapVertexAttrib2dAPPLE = NULL; PFNGLMAPVERTEXATTRIB2FAPPLEPROC __glewMapVertexAttrib2fAPPLE = NULL; PFNGLCLEARDEPTHFPROC __glewClearDepthf = NULL; PFNGLDEPTHRANGEFPROC __glewDepthRangef = NULL; PFNGLGETSHADERPRECISIONFORMATPROC __glewGetShaderPrecisionFormat = NULL; PFNGLRELEASESHADERCOMPILERPROC __glewReleaseShaderCompiler = NULL; PFNGLSHADERBINARYPROC __glewShaderBinary = NULL; PFNGLDRAWARRAYSINSTANCEDBASEINSTANCEPROC __glewDrawArraysInstancedBaseInstance = NULL; PFNGLDRAWELEMENTSINSTANCEDBASEINSTANCEPROC __glewDrawElementsInstancedBaseInstance = NULL; PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEPROC __glewDrawElementsInstancedBaseVertexBaseInstance = NULL; PFNGLBINDFRAGDATALOCATIONINDEXEDPROC __glewBindFragDataLocationIndexed = NULL; PFNGLGETFRAGDATAINDEXPROC __glewGetFragDataIndex = NULL; PFNGLCREATESYNCFROMCLEVENTARBPROC __glewCreateSyncFromCLeventARB = NULL; PFNGLCLEARBUFFERDATAPROC __glewClearBufferData = NULL; PFNGLCLEARBUFFERSUBDATAPROC __glewClearBufferSubData = NULL; PFNGLCLEARNAMEDBUFFERDATAEXTPROC __glewClearNamedBufferDataEXT = NULL; PFNGLCLEARNAMEDBUFFERSUBDATAEXTPROC __glewClearNamedBufferSubDataEXT = NULL; PFNGLCLAMPCOLORARBPROC __glewClampColorARB = NULL; PFNGLDISPATCHCOMPUTEPROC __glewDispatchCompute = NULL; PFNGLDISPATCHCOMPUTEINDIRECTPROC __glewDispatchComputeIndirect = NULL; PFNGLCOPYBUFFERSUBDATAPROC __glewCopyBufferSubData = NULL; PFNGLCOPYIMAGESUBDATAPROC __glewCopyImageSubData = NULL; PFNGLDEBUGMESSAGECALLBACKARBPROC __glewDebugMessageCallbackARB = NULL; PFNGLDEBUGMESSAGECONTROLARBPROC __glewDebugMessageControlARB = NULL; PFNGLDEBUGMESSAGEINSERTARBPROC __glewDebugMessageInsertARB = NULL; PFNGLGETDEBUGMESSAGELOGARBPROC __glewGetDebugMessageLogARB = NULL; PFNGLDRAWBUFFERSARBPROC __glewDrawBuffersARB = NULL; PFNGLBLENDEQUATIONSEPARATEIARBPROC __glewBlendEquationSeparateiARB = NULL; PFNGLBLENDEQUATIONIARBPROC __glewBlendEquationiARB = NULL; PFNGLBLENDFUNCSEPARATEIARBPROC __glewBlendFuncSeparateiARB = NULL; PFNGLBLENDFUNCIARBPROC __glewBlendFunciARB = NULL; PFNGLDRAWELEMENTSBASEVERTEXPROC __glewDrawElementsBaseVertex = NULL; PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC __glewDrawElementsInstancedBaseVertex = NULL; PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC __glewDrawRangeElementsBaseVertex = NULL; PFNGLMULTIDRAWELEMENTSBASEVERTEXPROC __glewMultiDrawElementsBaseVertex = NULL; PFNGLDRAWARRAYSINDIRECTPROC __glewDrawArraysIndirect = NULL; PFNGLDRAWELEMENTSINDIRECTPROC __glewDrawElementsIndirect = NULL; PFNGLFRAMEBUFFERPARAMETERIPROC __glewFramebufferParameteri = NULL; PFNGLGETFRAMEBUFFERPARAMETERIVPROC __glewGetFramebufferParameteriv = NULL; PFNGLGETNAMEDFRAMEBUFFERPARAMETERIVEXTPROC __glewGetNamedFramebufferParameterivEXT = NULL; PFNGLNAMEDFRAMEBUFFERPARAMETERIEXTPROC __glewNamedFramebufferParameteriEXT = NULL; PFNGLBINDFRAMEBUFFERPROC __glewBindFramebuffer = NULL; PFNGLBINDRENDERBUFFERPROC __glewBindRenderbuffer = NULL; PFNGLBLITFRAMEBUFFERPROC __glewBlitFramebuffer = NULL; PFNGLCHECKFRAMEBUFFERSTATUSPROC __glewCheckFramebufferStatus = NULL; PFNGLDELETEFRAMEBUFFERSPROC __glewDeleteFramebuffers = NULL; PFNGLDELETERENDERBUFFERSPROC __glewDeleteRenderbuffers = NULL; PFNGLFRAMEBUFFERRENDERBUFFERPROC __glewFramebufferRenderbuffer = NULL; PFNGLFRAMEBUFFERTEXTURE1DPROC __glewFramebufferTexture1D = NULL; PFNGLFRAMEBUFFERTEXTURE2DPROC __glewFramebufferTexture2D = NULL; PFNGLFRAMEBUFFERTEXTURE3DPROC __glewFramebufferTexture3D = NULL; PFNGLFRAMEBUFFERTEXTURELAYERPROC __glewFramebufferTextureLayer = NULL; PFNGLGENFRAMEBUFFERSPROC __glewGenFramebuffers = NULL; PFNGLGENRENDERBUFFERSPROC __glewGenRenderbuffers = NULL; PFNGLGENERATEMIPMAPPROC __glewGenerateMipmap = NULL; PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC __glewGetFramebufferAttachmentParameteriv = NULL; PFNGLGETRENDERBUFFERPARAMETERIVPROC __glewGetRenderbufferParameteriv = NULL; PFNGLISFRAMEBUFFERPROC __glewIsFramebuffer = NULL; PFNGLISRENDERBUFFERPROC __glewIsRenderbuffer = NULL; PFNGLRENDERBUFFERSTORAGEPROC __glewRenderbufferStorage = NULL; PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC __glewRenderbufferStorageMultisample = NULL; PFNGLFRAMEBUFFERTEXTUREARBPROC __glewFramebufferTextureARB = NULL; PFNGLFRAMEBUFFERTEXTUREFACEARBPROC __glewFramebufferTextureFaceARB = NULL; PFNGLFRAMEBUFFERTEXTURELAYERARBPROC __glewFramebufferTextureLayerARB = NULL; PFNGLPROGRAMPARAMETERIARBPROC __glewProgramParameteriARB = NULL; PFNGLGETPROGRAMBINARYPROC __glewGetProgramBinary = NULL; PFNGLPROGRAMBINARYPROC __glewProgramBinary = NULL; PFNGLPROGRAMPARAMETERIPROC __glewProgramParameteri = NULL; PFNGLGETUNIFORMDVPROC __glewGetUniformdv = NULL; PFNGLUNIFORM1DPROC __glewUniform1d = NULL; PFNGLUNIFORM1DVPROC __glewUniform1dv = NULL; PFNGLUNIFORM2DPROC __glewUniform2d = NULL; PFNGLUNIFORM2DVPROC __glewUniform2dv = NULL; PFNGLUNIFORM3DPROC __glewUniform3d = NULL; PFNGLUNIFORM3DVPROC __glewUniform3dv = NULL; PFNGLUNIFORM4DPROC __glewUniform4d = NULL; PFNGLUNIFORM4DVPROC __glewUniform4dv = NULL; PFNGLUNIFORMMATRIX2DVPROC __glewUniformMatrix2dv = NULL; PFNGLUNIFORMMATRIX2X3DVPROC __glewUniformMatrix2x3dv = NULL; PFNGLUNIFORMMATRIX2X4DVPROC __glewUniformMatrix2x4dv = NULL; PFNGLUNIFORMMATRIX3DVPROC __glewUniformMatrix3dv = NULL; PFNGLUNIFORMMATRIX3X2DVPROC __glewUniformMatrix3x2dv = NULL; PFNGLUNIFORMMATRIX3X4DVPROC __glewUniformMatrix3x4dv = NULL; PFNGLUNIFORMMATRIX4DVPROC __glewUniformMatrix4dv = NULL; PFNGLUNIFORMMATRIX4X2DVPROC __glewUniformMatrix4x2dv = NULL; PFNGLUNIFORMMATRIX4X3DVPROC __glewUniformMatrix4x3dv = NULL; PFNGLCOLORSUBTABLEPROC __glewColorSubTable = NULL; PFNGLCOLORTABLEPROC __glewColorTable = NULL; PFNGLCOLORTABLEPARAMETERFVPROC __glewColorTableParameterfv = NULL; PFNGLCOLORTABLEPARAMETERIVPROC __glewColorTableParameteriv = NULL; PFNGLCONVOLUTIONFILTER1DPROC __glewConvolutionFilter1D = NULL; PFNGLCONVOLUTIONFILTER2DPROC __glewConvolutionFilter2D = NULL; PFNGLCONVOLUTIONPARAMETERFPROC __glewConvolutionParameterf = NULL; PFNGLCONVOLUTIONPARAMETERFVPROC __glewConvolutionParameterfv = NULL; PFNGLCONVOLUTIONPARAMETERIPROC __glewConvolutionParameteri = NULL; PFNGLCONVOLUTIONPARAMETERIVPROC __glewConvolutionParameteriv = NULL; PFNGLCOPYCOLORSUBTABLEPROC __glewCopyColorSubTable = NULL; PFNGLCOPYCOLORTABLEPROC __glewCopyColorTable = NULL; PFNGLCOPYCONVOLUTIONFILTER1DPROC __glewCopyConvolutionFilter1D = NULL; PFNGLCOPYCONVOLUTIONFILTER2DPROC __glewCopyConvolutionFilter2D = NULL; PFNGLGETCOLORTABLEPROC __glewGetColorTable = NULL; PFNGLGETCOLORTABLEPARAMETERFVPROC __glewGetColorTableParameterfv = NULL; PFNGLGETCOLORTABLEPARAMETERIVPROC __glewGetColorTableParameteriv = NULL; PFNGLGETCONVOLUTIONFILTERPROC __glewGetConvolutionFilter = NULL; PFNGLGETCONVOLUTIONPARAMETERFVPROC __glewGetConvolutionParameterfv = NULL; PFNGLGETCONVOLUTIONPARAMETERIVPROC __glewGetConvolutionParameteriv = NULL; PFNGLGETHISTOGRAMPROC __glewGetHistogram = NULL; PFNGLGETHISTOGRAMPARAMETERFVPROC __glewGetHistogramParameterfv = NULL; PFNGLGETHISTOGRAMPARAMETERIVPROC __glewGetHistogramParameteriv = NULL; PFNGLGETMINMAXPROC __glewGetMinmax = NULL; PFNGLGETMINMAXPARAMETERFVPROC __glewGetMinmaxParameterfv = NULL; PFNGLGETMINMAXPARAMETERIVPROC __glewGetMinmaxParameteriv = NULL; PFNGLGETSEPARABLEFILTERPROC __glewGetSeparableFilter = NULL; PFNGLHISTOGRAMPROC __glewHistogram = NULL; PFNGLMINMAXPROC __glewMinmax = NULL; PFNGLRESETHISTOGRAMPROC __glewResetHistogram = NULL; PFNGLRESETMINMAXPROC __glewResetMinmax = NULL; PFNGLSEPARABLEFILTER2DPROC __glewSeparableFilter2D = NULL; PFNGLDRAWARRAYSINSTANCEDARBPROC __glewDrawArraysInstancedARB = NULL; PFNGLDRAWELEMENTSINSTANCEDARBPROC __glewDrawElementsInstancedARB = NULL; PFNGLVERTEXATTRIBDIVISORARBPROC __glewVertexAttribDivisorARB = NULL; PFNGLGETINTERNALFORMATIVPROC __glewGetInternalformativ = NULL; PFNGLGETINTERNALFORMATI64VPROC __glewGetInternalformati64v = NULL; PFNGLINVALIDATEBUFFERDATAPROC __glewInvalidateBufferData = NULL; PFNGLINVALIDATEBUFFERSUBDATAPROC __glewInvalidateBufferSubData = NULL; PFNGLINVALIDATEFRAMEBUFFERPROC __glewInvalidateFramebuffer = NULL; PFNGLINVALIDATESUBFRAMEBUFFERPROC __glewInvalidateSubFramebuffer = NULL; PFNGLINVALIDATETEXIMAGEPROC __glewInvalidateTexImage = NULL; PFNGLINVALIDATETEXSUBIMAGEPROC __glewInvalidateTexSubImage = NULL; PFNGLFLUSHMAPPEDBUFFERRANGEPROC __glewFlushMappedBufferRange = NULL; PFNGLMAPBUFFERRANGEPROC __glewMapBufferRange = NULL; PFNGLCURRENTPALETTEMATRIXARBPROC __glewCurrentPaletteMatrixARB = NULL; PFNGLMATRIXINDEXPOINTERARBPROC __glewMatrixIndexPointerARB = NULL; PFNGLMATRIXINDEXUBVARBPROC __glewMatrixIndexubvARB = NULL; PFNGLMATRIXINDEXUIVARBPROC __glewMatrixIndexuivARB = NULL; PFNGLMATRIXINDEXUSVARBPROC __glewMatrixIndexusvARB = NULL; PFNGLMULTIDRAWARRAYSINDIRECTPROC __glewMultiDrawArraysIndirect = NULL; PFNGLMULTIDRAWELEMENTSINDIRECTPROC __glewMultiDrawElementsIndirect = NULL; PFNGLSAMPLECOVERAGEARBPROC __glewSampleCoverageARB = NULL; PFNGLACTIVETEXTUREARBPROC __glewActiveTextureARB = NULL; PFNGLCLIENTACTIVETEXTUREARBPROC __glewClientActiveTextureARB = NULL; PFNGLMULTITEXCOORD1DARBPROC __glewMultiTexCoord1dARB = NULL; PFNGLMULTITEXCOORD1DVARBPROC __glewMultiTexCoord1dvARB = NULL; PFNGLMULTITEXCOORD1FARBPROC __glewMultiTexCoord1fARB = NULL; PFNGLMULTITEXCOORD1FVARBPROC __glewMultiTexCoord1fvARB = NULL; PFNGLMULTITEXCOORD1IARBPROC __glewMultiTexCoord1iARB = NULL; PFNGLMULTITEXCOORD1IVARBPROC __glewMultiTexCoord1ivARB = NULL; PFNGLMULTITEXCOORD1SARBPROC __glewMultiTexCoord1sARB = NULL; PFNGLMULTITEXCOORD1SVARBPROC __glewMultiTexCoord1svARB = NULL; PFNGLMULTITEXCOORD2DARBPROC __glewMultiTexCoord2dARB = NULL; PFNGLMULTITEXCOORD2DVARBPROC __glewMultiTexCoord2dvARB = NULL; PFNGLMULTITEXCOORD2FARBPROC __glewMultiTexCoord2fARB = NULL; PFNGLMULTITEXCOORD2FVARBPROC __glewMultiTexCoord2fvARB = NULL; PFNGLMULTITEXCOORD2IARBPROC __glewMultiTexCoord2iARB = NULL; PFNGLMULTITEXCOORD2IVARBPROC __glewMultiTexCoord2ivARB = NULL; PFNGLMULTITEXCOORD2SARBPROC __glewMultiTexCoord2sARB = NULL; PFNGLMULTITEXCOORD2SVARBPROC __glewMultiTexCoord2svARB = NULL; PFNGLMULTITEXCOORD3DARBPROC __glewMultiTexCoord3dARB = NULL; PFNGLMULTITEXCOORD3DVARBPROC __glewMultiTexCoord3dvARB = NULL; PFNGLMULTITEXCOORD3FARBPROC __glewMultiTexCoord3fARB = NULL; PFNGLMULTITEXCOORD3FVARBPROC __glewMultiTexCoord3fvARB = NULL; PFNGLMULTITEXCOORD3IARBPROC __glewMultiTexCoord3iARB = NULL; PFNGLMULTITEXCOORD3IVARBPROC __glewMultiTexCoord3ivARB = NULL; PFNGLMULTITEXCOORD3SARBPROC __glewMultiTexCoord3sARB = NULL; PFNGLMULTITEXCOORD3SVARBPROC __glewMultiTexCoord3svARB = NULL; PFNGLMULTITEXCOORD4DARBPROC __glewMultiTexCoord4dARB = NULL; PFNGLMULTITEXCOORD4DVARBPROC __glewMultiTexCoord4dvARB = NULL; PFNGLMULTITEXCOORD4FARBPROC __glewMultiTexCoord4fARB = NULL; PFNGLMULTITEXCOORD4FVARBPROC __glewMultiTexCoord4fvARB = NULL; PFNGLMULTITEXCOORD4IARBPROC __glewMultiTexCoord4iARB = NULL; PFNGLMULTITEXCOORD4IVARBPROC __glewMultiTexCoord4ivARB = NULL; PFNGLMULTITEXCOORD4SARBPROC __glewMultiTexCoord4sARB = NULL; PFNGLMULTITEXCOORD4SVARBPROC __glewMultiTexCoord4svARB = NULL; PFNGLBEGINQUERYARBPROC __glewBeginQueryARB = NULL; PFNGLDELETEQUERIESARBPROC __glewDeleteQueriesARB = NULL; PFNGLENDQUERYARBPROC __glewEndQueryARB = NULL; PFNGLGENQUERIESARBPROC __glewGenQueriesARB = NULL; PFNGLGETQUERYOBJECTIVARBPROC __glewGetQueryObjectivARB = NULL; PFNGLGETQUERYOBJECTUIVARBPROC __glewGetQueryObjectuivARB = NULL; PFNGLGETQUERYIVARBPROC __glewGetQueryivARB = NULL; PFNGLISQUERYARBPROC __glewIsQueryARB = NULL; PFNGLPOINTPARAMETERFARBPROC __glewPointParameterfARB = NULL; PFNGLPOINTPARAMETERFVARBPROC __glewPointParameterfvARB = NULL; PFNGLGETPROGRAMINTERFACEIVPROC __glewGetProgramInterfaceiv = NULL; PFNGLGETPROGRAMRESOURCEINDEXPROC __glewGetProgramResourceIndex = NULL; PFNGLGETPROGRAMRESOURCELOCATIONPROC __glewGetProgramResourceLocation = NULL; PFNGLGETPROGRAMRESOURCELOCATIONINDEXPROC __glewGetProgramResourceLocationIndex = NULL; PFNGLGETPROGRAMRESOURCENAMEPROC __glewGetProgramResourceName = NULL; PFNGLGETPROGRAMRESOURCEIVPROC __glewGetProgramResourceiv = NULL; PFNGLPROVOKINGVERTEXPROC __glewProvokingVertex = NULL; PFNGLGETGRAPHICSRESETSTATUSARBPROC __glewGetGraphicsResetStatusARB = NULL; PFNGLGETNCOLORTABLEARBPROC __glewGetnColorTableARB = NULL; PFNGLGETNCOMPRESSEDTEXIMAGEARBPROC __glewGetnCompressedTexImageARB = NULL; PFNGLGETNCONVOLUTIONFILTERARBPROC __glewGetnConvolutionFilterARB = NULL; PFNGLGETNHISTOGRAMARBPROC __glewGetnHistogramARB = NULL; PFNGLGETNMAPDVARBPROC __glewGetnMapdvARB = NULL; PFNGLGETNMAPFVARBPROC __glewGetnMapfvARB = NULL; PFNGLGETNMAPIVARBPROC __glewGetnMapivARB = NULL; PFNGLGETNMINMAXARBPROC __glewGetnMinmaxARB = NULL; PFNGLGETNPIXELMAPFVARBPROC __glewGetnPixelMapfvARB = NULL; PFNGLGETNPIXELMAPUIVARBPROC __glewGetnPixelMapuivARB = NULL; PFNGLGETNPIXELMAPUSVARBPROC __glewGetnPixelMapusvARB = NULL; PFNGLGETNPOLYGONSTIPPLEARBPROC __glewGetnPolygonStippleARB = NULL; PFNGLGETNSEPARABLEFILTERARBPROC __glewGetnSeparableFilterARB = NULL; PFNGLGETNTEXIMAGEARBPROC __glewGetnTexImageARB = NULL; PFNGLGETNUNIFORMDVARBPROC __glewGetnUniformdvARB = NULL; PFNGLGETNUNIFORMFVARBPROC __glewGetnUniformfvARB = NULL; PFNGLGETNUNIFORMIVARBPROC __glewGetnUniformivARB = NULL; PFNGLGETNUNIFORMUIVARBPROC __glewGetnUniformuivARB = NULL; PFNGLREADNPIXELSARBPROC __glewReadnPixelsARB = NULL; PFNGLMINSAMPLESHADINGARBPROC __glewMinSampleShadingARB = NULL; PFNGLBINDSAMPLERPROC __glewBindSampler = NULL; PFNGLDELETESAMPLERSPROC __glewDeleteSamplers = NULL; PFNGLGENSAMPLERSPROC __glewGenSamplers = NULL; PFNGLGETSAMPLERPARAMETERIIVPROC __glewGetSamplerParameterIiv = NULL; PFNGLGETSAMPLERPARAMETERIUIVPROC __glewGetSamplerParameterIuiv = NULL; PFNGLGETSAMPLERPARAMETERFVPROC __glewGetSamplerParameterfv = NULL; PFNGLGETSAMPLERPARAMETERIVPROC __glewGetSamplerParameteriv = NULL; PFNGLISSAMPLERPROC __glewIsSampler = NULL; PFNGLSAMPLERPARAMETERIIVPROC __glewSamplerParameterIiv = NULL; PFNGLSAMPLERPARAMETERIUIVPROC __glewSamplerParameterIuiv = NULL; PFNGLSAMPLERPARAMETERFPROC __glewSamplerParameterf = NULL; PFNGLSAMPLERPARAMETERFVPROC __glewSamplerParameterfv = NULL; PFNGLSAMPLERPARAMETERIPROC __glewSamplerParameteri = NULL; PFNGLSAMPLERPARAMETERIVPROC __glewSamplerParameteriv = NULL; PFNGLACTIVESHADERPROGRAMPROC __glewActiveShaderProgram = NULL; PFNGLBINDPROGRAMPIPELINEPROC __glewBindProgramPipeline = NULL; PFNGLCREATESHADERPROGRAMVPROC __glewCreateShaderProgramv = NULL; PFNGLDELETEPROGRAMPIPELINESPROC __glewDeleteProgramPipelines = NULL; PFNGLGENPROGRAMPIPELINESPROC __glewGenProgramPipelines = NULL; PFNGLGETPROGRAMPIPELINEINFOLOGPROC __glewGetProgramPipelineInfoLog = NULL; PFNGLGETPROGRAMPIPELINEIVPROC __glewGetProgramPipelineiv = NULL; PFNGLISPROGRAMPIPELINEPROC __glewIsProgramPipeline = NULL; PFNGLPROGRAMUNIFORM1DPROC __glewProgramUniform1d = NULL; PFNGLPROGRAMUNIFORM1DVPROC __glewProgramUniform1dv = NULL; PFNGLPROGRAMUNIFORM1FPROC __glewProgramUniform1f = NULL; PFNGLPROGRAMUNIFORM1FVPROC __glewProgramUniform1fv = NULL; PFNGLPROGRAMUNIFORM1IPROC __glewProgramUniform1i = NULL; PFNGLPROGRAMUNIFORM1IVPROC __glewProgramUniform1iv = NULL; PFNGLPROGRAMUNIFORM1UIPROC __glewProgramUniform1ui = NULL; PFNGLPROGRAMUNIFORM1UIVPROC __glewProgramUniform1uiv = NULL; PFNGLPROGRAMUNIFORM2DPROC __glewProgramUniform2d = NULL; PFNGLPROGRAMUNIFORM2DVPROC __glewProgramUniform2dv = NULL; PFNGLPROGRAMUNIFORM2FPROC __glewProgramUniform2f = NULL; PFNGLPROGRAMUNIFORM2FVPROC __glewProgramUniform2fv = NULL; PFNGLPROGRAMUNIFORM2IPROC __glewProgramUniform2i = NULL; PFNGLPROGRAMUNIFORM2IVPROC __glewProgramUniform2iv = NULL; PFNGLPROGRAMUNIFORM2UIPROC __glewProgramUniform2ui = NULL; PFNGLPROGRAMUNIFORM2UIVPROC __glewProgramUniform2uiv = NULL; PFNGLPROGRAMUNIFORM3DPROC __glewProgramUniform3d = NULL; PFNGLPROGRAMUNIFORM3DVPROC __glewProgramUniform3dv = NULL; PFNGLPROGRAMUNIFORM3FPROC __glewProgramUniform3f = NULL; PFNGLPROGRAMUNIFORM3FVPROC __glewProgramUniform3fv = NULL; PFNGLPROGRAMUNIFORM3IPROC __glewProgramUniform3i = NULL; PFNGLPROGRAMUNIFORM3IVPROC __glewProgramUniform3iv = NULL; PFNGLPROGRAMUNIFORM3UIPROC __glewProgramUniform3ui = NULL; PFNGLPROGRAMUNIFORM3UIVPROC __glewProgramUniform3uiv = NULL; PFNGLPROGRAMUNIFORM4DPROC __glewProgramUniform4d = NULL; PFNGLPROGRAMUNIFORM4DVPROC __glewProgramUniform4dv = NULL; PFNGLPROGRAMUNIFORM4FPROC __glewProgramUniform4f = NULL; PFNGLPROGRAMUNIFORM4FVPROC __glewProgramUniform4fv = NULL; PFNGLPROGRAMUNIFORM4IPROC __glewProgramUniform4i = NULL; PFNGLPROGRAMUNIFORM4IVPROC __glewProgramUniform4iv = NULL; PFNGLPROGRAMUNIFORM4UIPROC __glewProgramUniform4ui = NULL; PFNGLPROGRAMUNIFORM4UIVPROC __glewProgramUniform4uiv = NULL; PFNGLPROGRAMUNIFORMMATRIX2DVPROC __glewProgramUniformMatrix2dv = NULL; PFNGLPROGRAMUNIFORMMATRIX2FVPROC __glewProgramUniformMatrix2fv = NULL; PFNGLPROGRAMUNIFORMMATRIX2X3DVPROC __glewProgramUniformMatrix2x3dv = NULL; PFNGLPROGRAMUNIFORMMATRIX2X3FVPROC __glewProgramUniformMatrix2x3fv = NULL; PFNGLPROGRAMUNIFORMMATRIX2X4DVPROC __glewProgramUniformMatrix2x4dv = NULL; PFNGLPROGRAMUNIFORMMATRIX2X4FVPROC __glewProgramUniformMatrix2x4fv = NULL; PFNGLPROGRAMUNIFORMMATRIX3DVPROC __glewProgramUniformMatrix3dv = NULL; PFNGLPROGRAMUNIFORMMATRIX3FVPROC __glewProgramUniformMatrix3fv = NULL; PFNGLPROGRAMUNIFORMMATRIX3X2DVPROC __glewProgramUniformMatrix3x2dv = NULL; PFNGLPROGRAMUNIFORMMATRIX3X2FVPROC __glewProgramUniformMatrix3x2fv = NULL; PFNGLPROGRAMUNIFORMMATRIX3X4DVPROC __glewProgramUniformMatrix3x4dv = NULL; PFNGLPROGRAMUNIFORMMATRIX3X4FVPROC __glewProgramUniformMatrix3x4fv = NULL; PFNGLPROGRAMUNIFORMMATRIX4DVPROC __glewProgramUniformMatrix4dv = NULL; PFNGLPROGRAMUNIFORMMATRIX4FVPROC __glewProgramUniformMatrix4fv = NULL; PFNGLPROGRAMUNIFORMMATRIX4X2DVPROC __glewProgramUniformMatrix4x2dv = NULL; PFNGLPROGRAMUNIFORMMATRIX4X2FVPROC __glewProgramUniformMatrix4x2fv = NULL; PFNGLPROGRAMUNIFORMMATRIX4X3DVPROC __glewProgramUniformMatrix4x3dv = NULL; PFNGLPROGRAMUNIFORMMATRIX4X3FVPROC __glewProgramUniformMatrix4x3fv = NULL; PFNGLUSEPROGRAMSTAGESPROC __glewUseProgramStages = NULL; PFNGLVALIDATEPROGRAMPIPELINEPROC __glewValidateProgramPipeline = NULL; PFNGLGETACTIVEATOMICCOUNTERBUFFERIVPROC __glewGetActiveAtomicCounterBufferiv = NULL; PFNGLBINDIMAGETEXTUREPROC __glewBindImageTexture = NULL; PFNGLMEMORYBARRIERPROC __glewMemoryBarrier = NULL; PFNGLATTACHOBJECTARBPROC __glewAttachObjectARB = NULL; PFNGLCOMPILESHADERARBPROC __glewCompileShaderARB = NULL; PFNGLCREATEPROGRAMOBJECTARBPROC __glewCreateProgramObjectARB = NULL; PFNGLCREATESHADEROBJECTARBPROC __glewCreateShaderObjectARB = NULL; PFNGLDELETEOBJECTARBPROC __glewDeleteObjectARB = NULL; PFNGLDETACHOBJECTARBPROC __glewDetachObjectARB = NULL; PFNGLGETACTIVEUNIFORMARBPROC __glewGetActiveUniformARB = NULL; PFNGLGETATTACHEDOBJECTSARBPROC __glewGetAttachedObjectsARB = NULL; PFNGLGETHANDLEARBPROC __glewGetHandleARB = NULL; PFNGLGETINFOLOGARBPROC __glewGetInfoLogARB = NULL; PFNGLGETOBJECTPARAMETERFVARBPROC __glewGetObjectParameterfvARB = NULL; PFNGLGETOBJECTPARAMETERIVARBPROC __glewGetObjectParameterivARB = NULL; PFNGLGETSHADERSOURCEARBPROC __glewGetShaderSourceARB = NULL; PFNGLGETUNIFORMLOCATIONARBPROC __glewGetUniformLocationARB = NULL; PFNGLGETUNIFORMFVARBPROC __glewGetUniformfvARB = NULL; PFNGLGETUNIFORMIVARBPROC __glewGetUniformivARB = NULL; PFNGLLINKPROGRAMARBPROC __glewLinkProgramARB = NULL; PFNGLSHADERSOURCEARBPROC __glewShaderSourceARB = NULL; PFNGLUNIFORM1FARBPROC __glewUniform1fARB = NULL; PFNGLUNIFORM1FVARBPROC __glewUniform1fvARB = NULL; PFNGLUNIFORM1IARBPROC __glewUniform1iARB = NULL; PFNGLUNIFORM1IVARBPROC __glewUniform1ivARB = NULL; PFNGLUNIFORM2FARBPROC __glewUniform2fARB = NULL; PFNGLUNIFORM2FVARBPROC __glewUniform2fvARB = NULL; PFNGLUNIFORM2IARBPROC __glewUniform2iARB = NULL; PFNGLUNIFORM2IVARBPROC __glewUniform2ivARB = NULL; PFNGLUNIFORM3FARBPROC __glewUniform3fARB = NULL; PFNGLUNIFORM3FVARBPROC __glewUniform3fvARB = NULL; PFNGLUNIFORM3IARBPROC __glewUniform3iARB = NULL; PFNGLUNIFORM3IVARBPROC __glewUniform3ivARB = NULL; PFNGLUNIFORM4FARBPROC __glewUniform4fARB = NULL; PFNGLUNIFORM4FVARBPROC __glewUniform4fvARB = NULL; PFNGLUNIFORM4IARBPROC __glewUniform4iARB = NULL; PFNGLUNIFORM4IVARBPROC __glewUniform4ivARB = NULL; PFNGLUNIFORMMATRIX2FVARBPROC __glewUniformMatrix2fvARB = NULL; PFNGLUNIFORMMATRIX3FVARBPROC __glewUniformMatrix3fvARB = NULL; PFNGLUNIFORMMATRIX4FVARBPROC __glewUniformMatrix4fvARB = NULL; PFNGLUSEPROGRAMOBJECTARBPROC __glewUseProgramObjectARB = NULL; PFNGLVALIDATEPROGRAMARBPROC __glewValidateProgramARB = NULL; PFNGLSHADERSTORAGEBLOCKBINDINGPROC __glewShaderStorageBlockBinding = NULL; PFNGLGETACTIVESUBROUTINENAMEPROC __glewGetActiveSubroutineName = NULL; PFNGLGETACTIVESUBROUTINEUNIFORMNAMEPROC __glewGetActiveSubroutineUniformName = NULL; PFNGLGETACTIVESUBROUTINEUNIFORMIVPROC __glewGetActiveSubroutineUniformiv = NULL; PFNGLGETPROGRAMSTAGEIVPROC __glewGetProgramStageiv = NULL; PFNGLGETSUBROUTINEINDEXPROC __glewGetSubroutineIndex = NULL; PFNGLGETSUBROUTINEUNIFORMLOCATIONPROC __glewGetSubroutineUniformLocation = NULL; PFNGLGETUNIFORMSUBROUTINEUIVPROC __glewGetUniformSubroutineuiv = NULL; PFNGLUNIFORMSUBROUTINESUIVPROC __glewUniformSubroutinesuiv = NULL; PFNGLCOMPILESHADERINCLUDEARBPROC __glewCompileShaderIncludeARB = NULL; PFNGLDELETENAMEDSTRINGARBPROC __glewDeleteNamedStringARB = NULL; PFNGLGETNAMEDSTRINGARBPROC __glewGetNamedStringARB = NULL; PFNGLGETNAMEDSTRINGIVARBPROC __glewGetNamedStringivARB = NULL; PFNGLISNAMEDSTRINGARBPROC __glewIsNamedStringARB = NULL; PFNGLNAMEDSTRINGARBPROC __glewNamedStringARB = NULL; PFNGLCLIENTWAITSYNCPROC __glewClientWaitSync = NULL; PFNGLDELETESYNCPROC __glewDeleteSync = NULL; PFNGLFENCESYNCPROC __glewFenceSync = NULL; PFNGLGETINTEGER64VPROC __glewGetInteger64v = NULL; PFNGLGETSYNCIVPROC __glewGetSynciv = NULL; PFNGLISSYNCPROC __glewIsSync = NULL; PFNGLWAITSYNCPROC __glewWaitSync = NULL; PFNGLPATCHPARAMETERFVPROC __glewPatchParameterfv = NULL; PFNGLPATCHPARAMETERIPROC __glewPatchParameteri = NULL; PFNGLTEXBUFFERARBPROC __glewTexBufferARB = NULL; PFNGLTEXBUFFERRANGEPROC __glewTexBufferRange = NULL; PFNGLTEXTUREBUFFERRANGEEXTPROC __glewTextureBufferRangeEXT = NULL; PFNGLCOMPRESSEDTEXIMAGE1DARBPROC __glewCompressedTexImage1DARB = NULL; PFNGLCOMPRESSEDTEXIMAGE2DARBPROC __glewCompressedTexImage2DARB = NULL; PFNGLCOMPRESSEDTEXIMAGE3DARBPROC __glewCompressedTexImage3DARB = NULL; PFNGLCOMPRESSEDTEXSUBIMAGE1DARBPROC __glewCompressedTexSubImage1DARB = NULL; PFNGLCOMPRESSEDTEXSUBIMAGE2DARBPROC __glewCompressedTexSubImage2DARB = NULL; PFNGLCOMPRESSEDTEXSUBIMAGE3DARBPROC __glewCompressedTexSubImage3DARB = NULL; PFNGLGETCOMPRESSEDTEXIMAGEARBPROC __glewGetCompressedTexImageARB = NULL; PFNGLGETMULTISAMPLEFVPROC __glewGetMultisamplefv = NULL; PFNGLSAMPLEMASKIPROC __glewSampleMaski = NULL; PFNGLTEXIMAGE2DMULTISAMPLEPROC __glewTexImage2DMultisample = NULL; PFNGLTEXIMAGE3DMULTISAMPLEPROC __glewTexImage3DMultisample = NULL; PFNGLTEXSTORAGE1DPROC __glewTexStorage1D = NULL; PFNGLTEXSTORAGE2DPROC __glewTexStorage2D = NULL; PFNGLTEXSTORAGE3DPROC __glewTexStorage3D = NULL; PFNGLTEXTURESTORAGE1DEXTPROC __glewTextureStorage1DEXT = NULL; PFNGLTEXTURESTORAGE2DEXTPROC __glewTextureStorage2DEXT = NULL; PFNGLTEXTURESTORAGE3DEXTPROC __glewTextureStorage3DEXT = NULL; PFNGLTEXSTORAGE2DMULTISAMPLEPROC __glewTexStorage2DMultisample = NULL; PFNGLTEXSTORAGE3DMULTISAMPLEPROC __glewTexStorage3DMultisample = NULL; PFNGLTEXTURESTORAGE2DMULTISAMPLEEXTPROC __glewTextureStorage2DMultisampleEXT = NULL; PFNGLTEXTURESTORAGE3DMULTISAMPLEEXTPROC __glewTextureStorage3DMultisampleEXT = NULL; PFNGLTEXTUREVIEWPROC __glewTextureView = NULL; PFNGLGETQUERYOBJECTI64VPROC __glewGetQueryObjecti64v = NULL; PFNGLGETQUERYOBJECTUI64VPROC __glewGetQueryObjectui64v = NULL; PFNGLQUERYCOUNTERPROC __glewQueryCounter = NULL; PFNGLBINDTRANSFORMFEEDBACKPROC __glewBindTransformFeedback = NULL; PFNGLDELETETRANSFORMFEEDBACKSPROC __glewDeleteTransformFeedbacks = NULL; PFNGLDRAWTRANSFORMFEEDBACKPROC __glewDrawTransformFeedback = NULL; PFNGLGENTRANSFORMFEEDBACKSPROC __glewGenTransformFeedbacks = NULL; PFNGLISTRANSFORMFEEDBACKPROC __glewIsTransformFeedback = NULL; PFNGLPAUSETRANSFORMFEEDBACKPROC __glewPauseTransformFeedback = NULL; PFNGLRESUMETRANSFORMFEEDBACKPROC __glewResumeTransformFeedback = NULL; PFNGLBEGINQUERYINDEXEDPROC __glewBeginQueryIndexed = NULL; PFNGLDRAWTRANSFORMFEEDBACKSTREAMPROC __glewDrawTransformFeedbackStream = NULL; PFNGLENDQUERYINDEXEDPROC __glewEndQueryIndexed = NULL; PFNGLGETQUERYINDEXEDIVPROC __glewGetQueryIndexediv = NULL; PFNGLDRAWTRANSFORMFEEDBACKINSTANCEDPROC __glewDrawTransformFeedbackInstanced = NULL; PFNGLDRAWTRANSFORMFEEDBACKSTREAMINSTANCEDPROC __glewDrawTransformFeedbackStreamInstanced = NULL; PFNGLLOADTRANSPOSEMATRIXDARBPROC __glewLoadTransposeMatrixdARB = NULL; PFNGLLOADTRANSPOSEMATRIXFARBPROC __glewLoadTransposeMatrixfARB = NULL; PFNGLMULTTRANSPOSEMATRIXDARBPROC __glewMultTransposeMatrixdARB = NULL; PFNGLMULTTRANSPOSEMATRIXFARBPROC __glewMultTransposeMatrixfARB = NULL; PFNGLBINDBUFFERBASEPROC __glewBindBufferBase = NULL; PFNGLBINDBUFFERRANGEPROC __glewBindBufferRange = NULL; PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC __glewGetActiveUniformBlockName = NULL; PFNGLGETACTIVEUNIFORMBLOCKIVPROC __glewGetActiveUniformBlockiv = NULL; PFNGLGETACTIVEUNIFORMNAMEPROC __glewGetActiveUniformName = NULL; PFNGLGETACTIVEUNIFORMSIVPROC __glewGetActiveUniformsiv = NULL; PFNGLGETINTEGERI_VPROC __glewGetIntegeri_v = NULL; PFNGLGETUNIFORMBLOCKINDEXPROC __glewGetUniformBlockIndex = NULL; PFNGLGETUNIFORMINDICESPROC __glewGetUniformIndices = NULL; PFNGLUNIFORMBLOCKBINDINGPROC __glewUniformBlockBinding = NULL; PFNGLBINDVERTEXARRAYPROC __glewBindVertexArray = NULL; PFNGLDELETEVERTEXARRAYSPROC __glewDeleteVertexArrays = NULL; PFNGLGENVERTEXARRAYSPROC __glewGenVertexArrays = NULL; PFNGLISVERTEXARRAYPROC __glewIsVertexArray = NULL; PFNGLGETVERTEXATTRIBLDVPROC __glewGetVertexAttribLdv = NULL; PFNGLVERTEXATTRIBL1DPROC __glewVertexAttribL1d = NULL; PFNGLVERTEXATTRIBL1DVPROC __glewVertexAttribL1dv = NULL; PFNGLVERTEXATTRIBL2DPROC __glewVertexAttribL2d = NULL; PFNGLVERTEXATTRIBL2DVPROC __glewVertexAttribL2dv = NULL; PFNGLVERTEXATTRIBL3DPROC __glewVertexAttribL3d = NULL; PFNGLVERTEXATTRIBL3DVPROC __glewVertexAttribL3dv = NULL; PFNGLVERTEXATTRIBL4DPROC __glewVertexAttribL4d = NULL; PFNGLVERTEXATTRIBL4DVPROC __glewVertexAttribL4dv = NULL; PFNGLVERTEXATTRIBLPOINTERPROC __glewVertexAttribLPointer = NULL; PFNGLBINDVERTEXBUFFERPROC __glewBindVertexBuffer = NULL; PFNGLVERTEXATTRIBBINDINGPROC __glewVertexAttribBinding = NULL; PFNGLVERTEXATTRIBFORMATPROC __glewVertexAttribFormat = NULL; PFNGLVERTEXATTRIBIFORMATPROC __glewVertexAttribIFormat = NULL; PFNGLVERTEXATTRIBLFORMATPROC __glewVertexAttribLFormat = NULL; PFNGLVERTEXBINDINGDIVISORPROC __glewVertexBindingDivisor = NULL; PFNGLVERTEXBLENDARBPROC __glewVertexBlendARB = NULL; PFNGLWEIGHTPOINTERARBPROC __glewWeightPointerARB = NULL; PFNGLWEIGHTBVARBPROC __glewWeightbvARB = NULL; PFNGLWEIGHTDVARBPROC __glewWeightdvARB = NULL; PFNGLWEIGHTFVARBPROC __glewWeightfvARB = NULL; PFNGLWEIGHTIVARBPROC __glewWeightivARB = NULL; PFNGLWEIGHTSVARBPROC __glewWeightsvARB = NULL; PFNGLWEIGHTUBVARBPROC __glewWeightubvARB = NULL; PFNGLWEIGHTUIVARBPROC __glewWeightuivARB = NULL; PFNGLWEIGHTUSVARBPROC __glewWeightusvARB = NULL; PFNGLBINDBUFFERARBPROC __glewBindBufferARB = NULL; PFNGLBUFFERDATAARBPROC __glewBufferDataARB = NULL; PFNGLBUFFERSUBDATAARBPROC __glewBufferSubDataARB = NULL; PFNGLDELETEBUFFERSARBPROC __glewDeleteBuffersARB = NULL; PFNGLGENBUFFERSARBPROC __glewGenBuffersARB = NULL; PFNGLGETBUFFERPARAMETERIVARBPROC __glewGetBufferParameterivARB = NULL; PFNGLGETBUFFERPOINTERVARBPROC __glewGetBufferPointervARB = NULL; PFNGLGETBUFFERSUBDATAARBPROC __glewGetBufferSubDataARB = NULL; PFNGLISBUFFERARBPROC __glewIsBufferARB = NULL; PFNGLMAPBUFFERARBPROC __glewMapBufferARB = NULL; PFNGLUNMAPBUFFERARBPROC __glewUnmapBufferARB = NULL; PFNGLBINDPROGRAMARBPROC __glewBindProgramARB = NULL; PFNGLDELETEPROGRAMSARBPROC __glewDeleteProgramsARB = NULL; PFNGLDISABLEVERTEXATTRIBARRAYARBPROC __glewDisableVertexAttribArrayARB = NULL; PFNGLENABLEVERTEXATTRIBARRAYARBPROC __glewEnableVertexAttribArrayARB = NULL; PFNGLGENPROGRAMSARBPROC __glewGenProgramsARB = NULL; PFNGLGETPROGRAMENVPARAMETERDVARBPROC __glewGetProgramEnvParameterdvARB = NULL; PFNGLGETPROGRAMENVPARAMETERFVARBPROC __glewGetProgramEnvParameterfvARB = NULL; PFNGLGETPROGRAMLOCALPARAMETERDVARBPROC __glewGetProgramLocalParameterdvARB = NULL; PFNGLGETPROGRAMLOCALPARAMETERFVARBPROC __glewGetProgramLocalParameterfvARB = NULL; PFNGLGETPROGRAMSTRINGARBPROC __glewGetProgramStringARB = NULL; PFNGLGETPROGRAMIVARBPROC __glewGetProgramivARB = NULL; PFNGLGETVERTEXATTRIBPOINTERVARBPROC __glewGetVertexAttribPointervARB = NULL; PFNGLGETVERTEXATTRIBDVARBPROC __glewGetVertexAttribdvARB = NULL; PFNGLGETVERTEXATTRIBFVARBPROC __glewGetVertexAttribfvARB = NULL; PFNGLGETVERTEXATTRIBIVARBPROC __glewGetVertexAttribivARB = NULL; PFNGLISPROGRAMARBPROC __glewIsProgramARB = NULL; PFNGLPROGRAMENVPARAMETER4DARBPROC __glewProgramEnvParameter4dARB = NULL; PFNGLPROGRAMENVPARAMETER4DVARBPROC __glewProgramEnvParameter4dvARB = NULL; PFNGLPROGRAMENVPARAMETER4FARBPROC __glewProgramEnvParameter4fARB = NULL; PFNGLPROGRAMENVPARAMETER4FVARBPROC __glewProgramEnvParameter4fvARB = NULL; PFNGLPROGRAMLOCALPARAMETER4DARBPROC __glewProgramLocalParameter4dARB = NULL; PFNGLPROGRAMLOCALPARAMETER4DVARBPROC __glewProgramLocalParameter4dvARB = NULL; PFNGLPROGRAMLOCALPARAMETER4FARBPROC __glewProgramLocalParameter4fARB = NULL; PFNGLPROGRAMLOCALPARAMETER4FVARBPROC __glewProgramLocalParameter4fvARB = NULL; PFNGLPROGRAMSTRINGARBPROC __glewProgramStringARB = NULL; PFNGLVERTEXATTRIB1DARBPROC __glewVertexAttrib1dARB = NULL; PFNGLVERTEXATTRIB1DVARBPROC __glewVertexAttrib1dvARB = NULL; PFNGLVERTEXATTRIB1FARBPROC __glewVertexAttrib1fARB = NULL; PFNGLVERTEXATTRIB1FVARBPROC __glewVertexAttrib1fvARB = NULL; PFNGLVERTEXATTRIB1SARBPROC __glewVertexAttrib1sARB = NULL; PFNGLVERTEXATTRIB1SVARBPROC __glewVertexAttrib1svARB = NULL; PFNGLVERTEXATTRIB2DARBPROC __glewVertexAttrib2dARB = NULL; PFNGLVERTEXATTRIB2DVARBPROC __glewVertexAttrib2dvARB = NULL; PFNGLVERTEXATTRIB2FARBPROC __glewVertexAttrib2fARB = NULL; PFNGLVERTEXATTRIB2FVARBPROC __glewVertexAttrib2fvARB = NULL; PFNGLVERTEXATTRIB2SARBPROC __glewVertexAttrib2sARB = NULL; PFNGLVERTEXATTRIB2SVARBPROC __glewVertexAttrib2svARB = NULL; PFNGLVERTEXATTRIB3DARBPROC __glewVertexAttrib3dARB = NULL; PFNGLVERTEXATTRIB3DVARBPROC __glewVertexAttrib3dvARB = NULL; PFNGLVERTEXATTRIB3FARBPROC __glewVertexAttrib3fARB = NULL; PFNGLVERTEXATTRIB3FVARBPROC __glewVertexAttrib3fvARB = NULL; PFNGLVERTEXATTRIB3SARBPROC __glewVertexAttrib3sARB = NULL; PFNGLVERTEXATTRIB3SVARBPROC __glewVertexAttrib3svARB = NULL; PFNGLVERTEXATTRIB4NBVARBPROC __glewVertexAttrib4NbvARB = NULL; PFNGLVERTEXATTRIB4NIVARBPROC __glewVertexAttrib4NivARB = NULL; PFNGLVERTEXATTRIB4NSVARBPROC __glewVertexAttrib4NsvARB = NULL; PFNGLVERTEXATTRIB4NUBARBPROC __glewVertexAttrib4NubARB = NULL; PFNGLVERTEXATTRIB4NUBVARBPROC __glewVertexAttrib4NubvARB = NULL; PFNGLVERTEXATTRIB4NUIVARBPROC __glewVertexAttrib4NuivARB = NULL; PFNGLVERTEXATTRIB4NUSVARBPROC __glewVertexAttrib4NusvARB = NULL; PFNGLVERTEXATTRIB4BVARBPROC __glewVertexAttrib4bvARB = NULL; PFNGLVERTEXATTRIB4DARBPROC __glewVertexAttrib4dARB = NULL; PFNGLVERTEXATTRIB4DVARBPROC __glewVertexAttrib4dvARB = NULL; PFNGLVERTEXATTRIB4FARBPROC __glewVertexAttrib4fARB = NULL; PFNGLVERTEXATTRIB4FVARBPROC __glewVertexAttrib4fvARB = NULL; PFNGLVERTEXATTRIB4IVARBPROC __glewVertexAttrib4ivARB = NULL; PFNGLVERTEXATTRIB4SARBPROC __glewVertexAttrib4sARB = NULL; PFNGLVERTEXATTRIB4SVARBPROC __glewVertexAttrib4svARB = NULL; PFNGLVERTEXATTRIB4UBVARBPROC __glewVertexAttrib4ubvARB = NULL; PFNGLVERTEXATTRIB4UIVARBPROC __glewVertexAttrib4uivARB = NULL; PFNGLVERTEXATTRIB4USVARBPROC __glewVertexAttrib4usvARB = NULL; PFNGLVERTEXATTRIBPOINTERARBPROC __glewVertexAttribPointerARB = NULL; PFNGLBINDATTRIBLOCATIONARBPROC __glewBindAttribLocationARB = NULL; PFNGLGETACTIVEATTRIBARBPROC __glewGetActiveAttribARB = NULL; PFNGLGETATTRIBLOCATIONARBPROC __glewGetAttribLocationARB = NULL; PFNGLCOLORP3UIPROC __glewColorP3ui = NULL; PFNGLCOLORP3UIVPROC __glewColorP3uiv = NULL; PFNGLCOLORP4UIPROC __glewColorP4ui = NULL; PFNGLCOLORP4UIVPROC __glewColorP4uiv = NULL; PFNGLMULTITEXCOORDP1UIPROC __glewMultiTexCoordP1ui = NULL; PFNGLMULTITEXCOORDP1UIVPROC __glewMultiTexCoordP1uiv = NULL; PFNGLMULTITEXCOORDP2UIPROC __glewMultiTexCoordP2ui = NULL; PFNGLMULTITEXCOORDP2UIVPROC __glewMultiTexCoordP2uiv = NULL; PFNGLMULTITEXCOORDP3UIPROC __glewMultiTexCoordP3ui = NULL; PFNGLMULTITEXCOORDP3UIVPROC __glewMultiTexCoordP3uiv = NULL; PFNGLMULTITEXCOORDP4UIPROC __glewMultiTexCoordP4ui = NULL; PFNGLMULTITEXCOORDP4UIVPROC __glewMultiTexCoordP4uiv = NULL; PFNGLNORMALP3UIPROC __glewNormalP3ui = NULL; PFNGLNORMALP3UIVPROC __glewNormalP3uiv = NULL; PFNGLSECONDARYCOLORP3UIPROC __glewSecondaryColorP3ui = NULL; PFNGLSECONDARYCOLORP3UIVPROC __glewSecondaryColorP3uiv = NULL; PFNGLTEXCOORDP1UIPROC __glewTexCoordP1ui = NULL; PFNGLTEXCOORDP1UIVPROC __glewTexCoordP1uiv = NULL; PFNGLTEXCOORDP2UIPROC __glewTexCoordP2ui = NULL; PFNGLTEXCOORDP2UIVPROC __glewTexCoordP2uiv = NULL; PFNGLTEXCOORDP3UIPROC __glewTexCoordP3ui = NULL; PFNGLTEXCOORDP3UIVPROC __glewTexCoordP3uiv = NULL; PFNGLTEXCOORDP4UIPROC __glewTexCoordP4ui = NULL; PFNGLTEXCOORDP4UIVPROC __glewTexCoordP4uiv = NULL; PFNGLVERTEXATTRIBP1UIPROC __glewVertexAttribP1ui = NULL; PFNGLVERTEXATTRIBP1UIVPROC __glewVertexAttribP1uiv = NULL; PFNGLVERTEXATTRIBP2UIPROC __glewVertexAttribP2ui = NULL; PFNGLVERTEXATTRIBP2UIVPROC __glewVertexAttribP2uiv = NULL; PFNGLVERTEXATTRIBP3UIPROC __glewVertexAttribP3ui = NULL; PFNGLVERTEXATTRIBP3UIVPROC __glewVertexAttribP3uiv = NULL; PFNGLVERTEXATTRIBP4UIPROC __glewVertexAttribP4ui = NULL; PFNGLVERTEXATTRIBP4UIVPROC __glewVertexAttribP4uiv = NULL; PFNGLVERTEXP2UIPROC __glewVertexP2ui = NULL; PFNGLVERTEXP2UIVPROC __glewVertexP2uiv = NULL; PFNGLVERTEXP3UIPROC __glewVertexP3ui = NULL; PFNGLVERTEXP3UIVPROC __glewVertexP3uiv = NULL; PFNGLVERTEXP4UIPROC __glewVertexP4ui = NULL; PFNGLVERTEXP4UIVPROC __glewVertexP4uiv = NULL; PFNGLDEPTHRANGEARRAYVPROC __glewDepthRangeArrayv = NULL; PFNGLDEPTHRANGEINDEXEDPROC __glewDepthRangeIndexed = NULL; PFNGLGETDOUBLEI_VPROC __glewGetDoublei_v = NULL; PFNGLGETFLOATI_VPROC __glewGetFloati_v = NULL; PFNGLSCISSORARRAYVPROC __glewScissorArrayv = NULL; PFNGLSCISSORINDEXEDPROC __glewScissorIndexed = NULL; PFNGLSCISSORINDEXEDVPROC __glewScissorIndexedv = NULL; PFNGLVIEWPORTARRAYVPROC __glewViewportArrayv = NULL; PFNGLVIEWPORTINDEXEDFPROC __glewViewportIndexedf = NULL; PFNGLVIEWPORTINDEXEDFVPROC __glewViewportIndexedfv = NULL; PFNGLWINDOWPOS2DARBPROC __glewWindowPos2dARB = NULL; PFNGLWINDOWPOS2DVARBPROC __glewWindowPos2dvARB = NULL; PFNGLWINDOWPOS2FARBPROC __glewWindowPos2fARB = NULL; PFNGLWINDOWPOS2FVARBPROC __glewWindowPos2fvARB = NULL; PFNGLWINDOWPOS2IARBPROC __glewWindowPos2iARB = NULL; PFNGLWINDOWPOS2IVARBPROC __glewWindowPos2ivARB = NULL; PFNGLWINDOWPOS2SARBPROC __glewWindowPos2sARB = NULL; PFNGLWINDOWPOS2SVARBPROC __glewWindowPos2svARB = NULL; PFNGLWINDOWPOS3DARBPROC __glewWindowPos3dARB = NULL; PFNGLWINDOWPOS3DVARBPROC __glewWindowPos3dvARB = NULL; PFNGLWINDOWPOS3FARBPROC __glewWindowPos3fARB = NULL; PFNGLWINDOWPOS3FVARBPROC __glewWindowPos3fvARB = NULL; PFNGLWINDOWPOS3IARBPROC __glewWindowPos3iARB = NULL; PFNGLWINDOWPOS3IVARBPROC __glewWindowPos3ivARB = NULL; PFNGLWINDOWPOS3SARBPROC __glewWindowPos3sARB = NULL; PFNGLWINDOWPOS3SVARBPROC __glewWindowPos3svARB = NULL; PFNGLDRAWBUFFERSATIPROC __glewDrawBuffersATI = NULL; PFNGLDRAWELEMENTARRAYATIPROC __glewDrawElementArrayATI = NULL; PFNGLDRAWRANGEELEMENTARRAYATIPROC __glewDrawRangeElementArrayATI = NULL; PFNGLELEMENTPOINTERATIPROC __glewElementPointerATI = NULL; PFNGLGETTEXBUMPPARAMETERFVATIPROC __glewGetTexBumpParameterfvATI = NULL; PFNGLGETTEXBUMPPARAMETERIVATIPROC __glewGetTexBumpParameterivATI = NULL; PFNGLTEXBUMPPARAMETERFVATIPROC __glewTexBumpParameterfvATI = NULL; PFNGLTEXBUMPPARAMETERIVATIPROC __glewTexBumpParameterivATI = NULL; PFNGLALPHAFRAGMENTOP1ATIPROC __glewAlphaFragmentOp1ATI = NULL; PFNGLALPHAFRAGMENTOP2ATIPROC __glewAlphaFragmentOp2ATI = NULL; PFNGLALPHAFRAGMENTOP3ATIPROC __glewAlphaFragmentOp3ATI = NULL; PFNGLBEGINFRAGMENTSHADERATIPROC __glewBeginFragmentShaderATI = NULL; PFNGLBINDFRAGMENTSHADERATIPROC __glewBindFragmentShaderATI = NULL; PFNGLCOLORFRAGMENTOP1ATIPROC __glewColorFragmentOp1ATI = NULL; PFNGLCOLORFRAGMENTOP2ATIPROC __glewColorFragmentOp2ATI = NULL; PFNGLCOLORFRAGMENTOP3ATIPROC __glewColorFragmentOp3ATI = NULL; PFNGLDELETEFRAGMENTSHADERATIPROC __glewDeleteFragmentShaderATI = NULL; PFNGLENDFRAGMENTSHADERATIPROC __glewEndFragmentShaderATI = NULL; PFNGLGENFRAGMENTSHADERSATIPROC __glewGenFragmentShadersATI = NULL; PFNGLPASSTEXCOORDATIPROC __glewPassTexCoordATI = NULL; PFNGLSAMPLEMAPATIPROC __glewSampleMapATI = NULL; PFNGLSETFRAGMENTSHADERCONSTANTATIPROC __glewSetFragmentShaderConstantATI = NULL; PFNGLMAPOBJECTBUFFERATIPROC __glewMapObjectBufferATI = NULL; PFNGLUNMAPOBJECTBUFFERATIPROC __glewUnmapObjectBufferATI = NULL; PFNGLPNTRIANGLESFATIPROC __glewPNTrianglesfATI = NULL; PFNGLPNTRIANGLESIATIPROC __glewPNTrianglesiATI = NULL; PFNGLSTENCILFUNCSEPARATEATIPROC __glewStencilFuncSeparateATI = NULL; PFNGLSTENCILOPSEPARATEATIPROC __glewStencilOpSeparateATI = NULL; PFNGLARRAYOBJECTATIPROC __glewArrayObjectATI = NULL; PFNGLFREEOBJECTBUFFERATIPROC __glewFreeObjectBufferATI = NULL; PFNGLGETARRAYOBJECTFVATIPROC __glewGetArrayObjectfvATI = NULL; PFNGLGETARRAYOBJECTIVATIPROC __glewGetArrayObjectivATI = NULL; PFNGLGETOBJECTBUFFERFVATIPROC __glewGetObjectBufferfvATI = NULL; PFNGLGETOBJECTBUFFERIVATIPROC __glewGetObjectBufferivATI = NULL; PFNGLGETVARIANTARRAYOBJECTFVATIPROC __glewGetVariantArrayObjectfvATI = NULL; PFNGLGETVARIANTARRAYOBJECTIVATIPROC __glewGetVariantArrayObjectivATI = NULL; PFNGLISOBJECTBUFFERATIPROC __glewIsObjectBufferATI = NULL; PFNGLNEWOBJECTBUFFERATIPROC __glewNewObjectBufferATI = NULL; PFNGLUPDATEOBJECTBUFFERATIPROC __glewUpdateObjectBufferATI = NULL; PFNGLVARIANTARRAYOBJECTATIPROC __glewVariantArrayObjectATI = NULL; PFNGLGETVERTEXATTRIBARRAYOBJECTFVATIPROC __glewGetVertexAttribArrayObjectfvATI = NULL; PFNGLGETVERTEXATTRIBARRAYOBJECTIVATIPROC __glewGetVertexAttribArrayObjectivATI = NULL; PFNGLVERTEXATTRIBARRAYOBJECTATIPROC __glewVertexAttribArrayObjectATI = NULL; PFNGLCLIENTACTIVEVERTEXSTREAMATIPROC __glewClientActiveVertexStreamATI = NULL; PFNGLNORMALSTREAM3BATIPROC __glewNormalStream3bATI = NULL; PFNGLNORMALSTREAM3BVATIPROC __glewNormalStream3bvATI = NULL; PFNGLNORMALSTREAM3DATIPROC __glewNormalStream3dATI = NULL; PFNGLNORMALSTREAM3DVATIPROC __glewNormalStream3dvATI = NULL; PFNGLNORMALSTREAM3FATIPROC __glewNormalStream3fATI = NULL; PFNGLNORMALSTREAM3FVATIPROC __glewNormalStream3fvATI = NULL; PFNGLNORMALSTREAM3IATIPROC __glewNormalStream3iATI = NULL; PFNGLNORMALSTREAM3IVATIPROC __glewNormalStream3ivATI = NULL; PFNGLNORMALSTREAM3SATIPROC __glewNormalStream3sATI = NULL; PFNGLNORMALSTREAM3SVATIPROC __glewNormalStream3svATI = NULL; PFNGLVERTEXBLENDENVFATIPROC __glewVertexBlendEnvfATI = NULL; PFNGLVERTEXBLENDENVIATIPROC __glewVertexBlendEnviATI = NULL; PFNGLVERTEXSTREAM1DATIPROC __glewVertexStream1dATI = NULL; PFNGLVERTEXSTREAM1DVATIPROC __glewVertexStream1dvATI = NULL; PFNGLVERTEXSTREAM1FATIPROC __glewVertexStream1fATI = NULL; PFNGLVERTEXSTREAM1FVATIPROC __glewVertexStream1fvATI = NULL; PFNGLVERTEXSTREAM1IATIPROC __glewVertexStream1iATI = NULL; PFNGLVERTEXSTREAM1IVATIPROC __glewVertexStream1ivATI = NULL; PFNGLVERTEXSTREAM1SATIPROC __glewVertexStream1sATI = NULL; PFNGLVERTEXSTREAM1SVATIPROC __glewVertexStream1svATI = NULL; PFNGLVERTEXSTREAM2DATIPROC __glewVertexStream2dATI = NULL; PFNGLVERTEXSTREAM2DVATIPROC __glewVertexStream2dvATI = NULL; PFNGLVERTEXSTREAM2FATIPROC __glewVertexStream2fATI = NULL; PFNGLVERTEXSTREAM2FVATIPROC __glewVertexStream2fvATI = NULL; PFNGLVERTEXSTREAM2IATIPROC __glewVertexStream2iATI = NULL; PFNGLVERTEXSTREAM2IVATIPROC __glewVertexStream2ivATI = NULL; PFNGLVERTEXSTREAM2SATIPROC __glewVertexStream2sATI = NULL; PFNGLVERTEXSTREAM2SVATIPROC __glewVertexStream2svATI = NULL; PFNGLVERTEXSTREAM3DATIPROC __glewVertexStream3dATI = NULL; PFNGLVERTEXSTREAM3DVATIPROC __glewVertexStream3dvATI = NULL; PFNGLVERTEXSTREAM3FATIPROC __glewVertexStream3fATI = NULL; PFNGLVERTEXSTREAM3FVATIPROC __glewVertexStream3fvATI = NULL; PFNGLVERTEXSTREAM3IATIPROC __glewVertexStream3iATI = NULL; PFNGLVERTEXSTREAM3IVATIPROC __glewVertexStream3ivATI = NULL; PFNGLVERTEXSTREAM3SATIPROC __glewVertexStream3sATI = NULL; PFNGLVERTEXSTREAM3SVATIPROC __glewVertexStream3svATI = NULL; PFNGLVERTEXSTREAM4DATIPROC __glewVertexStream4dATI = NULL; PFNGLVERTEXSTREAM4DVATIPROC __glewVertexStream4dvATI = NULL; PFNGLVERTEXSTREAM4FATIPROC __glewVertexStream4fATI = NULL; PFNGLVERTEXSTREAM4FVATIPROC __glewVertexStream4fvATI = NULL; PFNGLVERTEXSTREAM4IATIPROC __glewVertexStream4iATI = NULL; PFNGLVERTEXSTREAM4IVATIPROC __glewVertexStream4ivATI = NULL; PFNGLVERTEXSTREAM4SATIPROC __glewVertexStream4sATI = NULL; PFNGLVERTEXSTREAM4SVATIPROC __glewVertexStream4svATI = NULL; PFNGLGETUNIFORMBUFFERSIZEEXTPROC __glewGetUniformBufferSizeEXT = NULL; PFNGLGETUNIFORMOFFSETEXTPROC __glewGetUniformOffsetEXT = NULL; PFNGLUNIFORMBUFFEREXTPROC __glewUniformBufferEXT = NULL; PFNGLBLENDCOLOREXTPROC __glewBlendColorEXT = NULL; PFNGLBLENDEQUATIONSEPARATEEXTPROC __glewBlendEquationSeparateEXT = NULL; PFNGLBLENDFUNCSEPARATEEXTPROC __glewBlendFuncSeparateEXT = NULL; PFNGLBLENDEQUATIONEXTPROC __glewBlendEquationEXT = NULL; PFNGLCOLORSUBTABLEEXTPROC __glewColorSubTableEXT = NULL; PFNGLCOPYCOLORSUBTABLEEXTPROC __glewCopyColorSubTableEXT = NULL; PFNGLLOCKARRAYSEXTPROC __glewLockArraysEXT = NULL; PFNGLUNLOCKARRAYSEXTPROC __glewUnlockArraysEXT = NULL; PFNGLCONVOLUTIONFILTER1DEXTPROC __glewConvolutionFilter1DEXT = NULL; PFNGLCONVOLUTIONFILTER2DEXTPROC __glewConvolutionFilter2DEXT = NULL; PFNGLCONVOLUTIONPARAMETERFEXTPROC __glewConvolutionParameterfEXT = NULL; PFNGLCONVOLUTIONPARAMETERFVEXTPROC __glewConvolutionParameterfvEXT = NULL; PFNGLCONVOLUTIONPARAMETERIEXTPROC __glewConvolutionParameteriEXT = NULL; PFNGLCONVOLUTIONPARAMETERIVEXTPROC __glewConvolutionParameterivEXT = NULL; PFNGLCOPYCONVOLUTIONFILTER1DEXTPROC __glewCopyConvolutionFilter1DEXT = NULL; PFNGLCOPYCONVOLUTIONFILTER2DEXTPROC __glewCopyConvolutionFilter2DEXT = NULL; PFNGLGETCONVOLUTIONFILTEREXTPROC __glewGetConvolutionFilterEXT = NULL; PFNGLGETCONVOLUTIONPARAMETERFVEXTPROC __glewGetConvolutionParameterfvEXT = NULL; PFNGLGETCONVOLUTIONPARAMETERIVEXTPROC __glewGetConvolutionParameterivEXT = NULL; PFNGLGETSEPARABLEFILTEREXTPROC __glewGetSeparableFilterEXT = NULL; PFNGLSEPARABLEFILTER2DEXTPROC __glewSeparableFilter2DEXT = NULL; PFNGLBINORMALPOINTEREXTPROC __glewBinormalPointerEXT = NULL; PFNGLTANGENTPOINTEREXTPROC __glewTangentPointerEXT = NULL; PFNGLCOPYTEXIMAGE1DEXTPROC __glewCopyTexImage1DEXT = NULL; PFNGLCOPYTEXIMAGE2DEXTPROC __glewCopyTexImage2DEXT = NULL; PFNGLCOPYTEXSUBIMAGE1DEXTPROC __glewCopyTexSubImage1DEXT = NULL; PFNGLCOPYTEXSUBIMAGE2DEXTPROC __glewCopyTexSubImage2DEXT = NULL; PFNGLCOPYTEXSUBIMAGE3DEXTPROC __glewCopyTexSubImage3DEXT = NULL; PFNGLCULLPARAMETERDVEXTPROC __glewCullParameterdvEXT = NULL; PFNGLCULLPARAMETERFVEXTPROC __glewCullParameterfvEXT = NULL; PFNGLINSERTEVENTMARKEREXTPROC __glewInsertEventMarkerEXT = NULL; PFNGLPOPGROUPMARKEREXTPROC __glewPopGroupMarkerEXT = NULL; PFNGLPUSHGROUPMARKEREXTPROC __glewPushGroupMarkerEXT = NULL; PFNGLDEPTHBOUNDSEXTPROC __glewDepthBoundsEXT = NULL; PFNGLBINDMULTITEXTUREEXTPROC __glewBindMultiTextureEXT = NULL; PFNGLCHECKNAMEDFRAMEBUFFERSTATUSEXTPROC __glewCheckNamedFramebufferStatusEXT = NULL; PFNGLCLIENTATTRIBDEFAULTEXTPROC __glewClientAttribDefaultEXT = NULL; PFNGLCOMPRESSEDMULTITEXIMAGE1DEXTPROC __glewCompressedMultiTexImage1DEXT = NULL; PFNGLCOMPRESSEDMULTITEXIMAGE2DEXTPROC __glewCompressedMultiTexImage2DEXT = NULL; PFNGLCOMPRESSEDMULTITEXIMAGE3DEXTPROC __glewCompressedMultiTexImage3DEXT = NULL; PFNGLCOMPRESSEDMULTITEXSUBIMAGE1DEXTPROC __glewCompressedMultiTexSubImage1DEXT = NULL; PFNGLCOMPRESSEDMULTITEXSUBIMAGE2DEXTPROC __glewCompressedMultiTexSubImage2DEXT = NULL; PFNGLCOMPRESSEDMULTITEXSUBIMAGE3DEXTPROC __glewCompressedMultiTexSubImage3DEXT = NULL; PFNGLCOMPRESSEDTEXTUREIMAGE1DEXTPROC __glewCompressedTextureImage1DEXT = NULL; PFNGLCOMPRESSEDTEXTUREIMAGE2DEXTPROC __glewCompressedTextureImage2DEXT = NULL; PFNGLCOMPRESSEDTEXTUREIMAGE3DEXTPROC __glewCompressedTextureImage3DEXT = NULL; PFNGLCOMPRESSEDTEXTURESUBIMAGE1DEXTPROC __glewCompressedTextureSubImage1DEXT = NULL; PFNGLCOMPRESSEDTEXTURESUBIMAGE2DEXTPROC __glewCompressedTextureSubImage2DEXT = NULL; PFNGLCOMPRESSEDTEXTURESUBIMAGE3DEXTPROC __glewCompressedTextureSubImage3DEXT = NULL; PFNGLCOPYMULTITEXIMAGE1DEXTPROC __glewCopyMultiTexImage1DEXT = NULL; PFNGLCOPYMULTITEXIMAGE2DEXTPROC __glewCopyMultiTexImage2DEXT = NULL; PFNGLCOPYMULTITEXSUBIMAGE1DEXTPROC __glewCopyMultiTexSubImage1DEXT = NULL; PFNGLCOPYMULTITEXSUBIMAGE2DEXTPROC __glewCopyMultiTexSubImage2DEXT = NULL; PFNGLCOPYMULTITEXSUBIMAGE3DEXTPROC __glewCopyMultiTexSubImage3DEXT = NULL; PFNGLCOPYTEXTUREIMAGE1DEXTPROC __glewCopyTextureImage1DEXT = NULL; PFNGLCOPYTEXTUREIMAGE2DEXTPROC __glewCopyTextureImage2DEXT = NULL; PFNGLCOPYTEXTURESUBIMAGE1DEXTPROC __glewCopyTextureSubImage1DEXT = NULL; PFNGLCOPYTEXTURESUBIMAGE2DEXTPROC __glewCopyTextureSubImage2DEXT = NULL; PFNGLCOPYTEXTURESUBIMAGE3DEXTPROC __glewCopyTextureSubImage3DEXT = NULL; PFNGLDISABLECLIENTSTATEINDEXEDEXTPROC __glewDisableClientStateIndexedEXT = NULL; PFNGLDISABLECLIENTSTATEIEXTPROC __glewDisableClientStateiEXT = NULL; PFNGLDISABLEVERTEXARRAYATTRIBEXTPROC __glewDisableVertexArrayAttribEXT = NULL; PFNGLDISABLEVERTEXARRAYEXTPROC __glewDisableVertexArrayEXT = NULL; PFNGLENABLECLIENTSTATEINDEXEDEXTPROC __glewEnableClientStateIndexedEXT = NULL; PFNGLENABLECLIENTSTATEIEXTPROC __glewEnableClientStateiEXT = NULL; PFNGLENABLEVERTEXARRAYATTRIBEXTPROC __glewEnableVertexArrayAttribEXT = NULL; PFNGLENABLEVERTEXARRAYEXTPROC __glewEnableVertexArrayEXT = NULL; PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEEXTPROC __glewFlushMappedNamedBufferRangeEXT = NULL; PFNGLFRAMEBUFFERDRAWBUFFEREXTPROC __glewFramebufferDrawBufferEXT = NULL; PFNGLFRAMEBUFFERDRAWBUFFERSEXTPROC __glewFramebufferDrawBuffersEXT = NULL; PFNGLFRAMEBUFFERREADBUFFEREXTPROC __glewFramebufferReadBufferEXT = NULL; PFNGLGENERATEMULTITEXMIPMAPEXTPROC __glewGenerateMultiTexMipmapEXT = NULL; PFNGLGENERATETEXTUREMIPMAPEXTPROC __glewGenerateTextureMipmapEXT = NULL; PFNGLGETCOMPRESSEDMULTITEXIMAGEEXTPROC __glewGetCompressedMultiTexImageEXT = NULL; PFNGLGETCOMPRESSEDTEXTUREIMAGEEXTPROC __glewGetCompressedTextureImageEXT = NULL; PFNGLGETDOUBLEINDEXEDVEXTPROC __glewGetDoubleIndexedvEXT = NULL; PFNGLGETDOUBLEI_VEXTPROC __glewGetDoublei_vEXT = NULL; PFNGLGETFLOATINDEXEDVEXTPROC __glewGetFloatIndexedvEXT = NULL; PFNGLGETFLOATI_VEXTPROC __glewGetFloati_vEXT = NULL; PFNGLGETFRAMEBUFFERPARAMETERIVEXTPROC __glewGetFramebufferParameterivEXT = NULL; PFNGLGETMULTITEXENVFVEXTPROC __glewGetMultiTexEnvfvEXT = NULL; PFNGLGETMULTITEXENVIVEXTPROC __glewGetMultiTexEnvivEXT = NULL; PFNGLGETMULTITEXGENDVEXTPROC __glewGetMultiTexGendvEXT = NULL; PFNGLGETMULTITEXGENFVEXTPROC __glewGetMultiTexGenfvEXT = NULL; PFNGLGETMULTITEXGENIVEXTPROC __glewGetMultiTexGenivEXT = NULL; PFNGLGETMULTITEXIMAGEEXTPROC __glewGetMultiTexImageEXT = NULL; PFNGLGETMULTITEXLEVELPARAMETERFVEXTPROC __glewGetMultiTexLevelParameterfvEXT = NULL; PFNGLGETMULTITEXLEVELPARAMETERIVEXTPROC __glewGetMultiTexLevelParameterivEXT = NULL; PFNGLGETMULTITEXPARAMETERIIVEXTPROC __glewGetMultiTexParameterIivEXT = NULL; PFNGLGETMULTITEXPARAMETERIUIVEXTPROC __glewGetMultiTexParameterIuivEXT = NULL; PFNGLGETMULTITEXPARAMETERFVEXTPROC __glewGetMultiTexParameterfvEXT = NULL; PFNGLGETMULTITEXPARAMETERIVEXTPROC __glewGetMultiTexParameterivEXT = NULL; PFNGLGETNAMEDBUFFERPARAMETERIVEXTPROC __glewGetNamedBufferParameterivEXT = NULL; PFNGLGETNAMEDBUFFERPOINTERVEXTPROC __glewGetNamedBufferPointervEXT = NULL; PFNGLGETNAMEDBUFFERSUBDATAEXTPROC __glewGetNamedBufferSubDataEXT = NULL; PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC __glewGetNamedFramebufferAttachmentParameterivEXT = NULL; PFNGLGETNAMEDPROGRAMLOCALPARAMETERIIVEXTPROC __glewGetNamedProgramLocalParameterIivEXT = NULL; PFNGLGETNAMEDPROGRAMLOCALPARAMETERIUIVEXTPROC __glewGetNamedProgramLocalParameterIuivEXT = NULL; PFNGLGETNAMEDPROGRAMLOCALPARAMETERDVEXTPROC __glewGetNamedProgramLocalParameterdvEXT = NULL; PFNGLGETNAMEDPROGRAMLOCALPARAMETERFVEXTPROC __glewGetNamedProgramLocalParameterfvEXT = NULL; PFNGLGETNAMEDPROGRAMSTRINGEXTPROC __glewGetNamedProgramStringEXT = NULL; PFNGLGETNAMEDPROGRAMIVEXTPROC __glewGetNamedProgramivEXT = NULL; PFNGLGETNAMEDRENDERBUFFERPARAMETERIVEXTPROC __glewGetNamedRenderbufferParameterivEXT = NULL; PFNGLGETPOINTERINDEXEDVEXTPROC __glewGetPointerIndexedvEXT = NULL; PFNGLGETPOINTERI_VEXTPROC __glewGetPointeri_vEXT = NULL; PFNGLGETTEXTUREIMAGEEXTPROC __glewGetTextureImageEXT = NULL; PFNGLGETTEXTURELEVELPARAMETERFVEXTPROC __glewGetTextureLevelParameterfvEXT = NULL; PFNGLGETTEXTURELEVELPARAMETERIVEXTPROC __glewGetTextureLevelParameterivEXT = NULL; PFNGLGETTEXTUREPARAMETERIIVEXTPROC __glewGetTextureParameterIivEXT = NULL; PFNGLGETTEXTUREPARAMETERIUIVEXTPROC __glewGetTextureParameterIuivEXT = NULL; PFNGLGETTEXTUREPARAMETERFVEXTPROC __glewGetTextureParameterfvEXT = NULL; PFNGLGETTEXTUREPARAMETERIVEXTPROC __glewGetTextureParameterivEXT = NULL; PFNGLGETVERTEXARRAYINTEGERI_VEXTPROC __glewGetVertexArrayIntegeri_vEXT = NULL; PFNGLGETVERTEXARRAYINTEGERVEXTPROC __glewGetVertexArrayIntegervEXT = NULL; PFNGLGETVERTEXARRAYPOINTERI_VEXTPROC __glewGetVertexArrayPointeri_vEXT = NULL; PFNGLGETVERTEXARRAYPOINTERVEXTPROC __glewGetVertexArrayPointervEXT = NULL; PFNGLMAPNAMEDBUFFEREXTPROC __glewMapNamedBufferEXT = NULL; PFNGLMAPNAMEDBUFFERRANGEEXTPROC __glewMapNamedBufferRangeEXT = NULL; PFNGLMATRIXFRUSTUMEXTPROC __glewMatrixFrustumEXT = NULL; PFNGLMATRIXLOADIDENTITYEXTPROC __glewMatrixLoadIdentityEXT = NULL; PFNGLMATRIXLOADTRANSPOSEDEXTPROC __glewMatrixLoadTransposedEXT = NULL; PFNGLMATRIXLOADTRANSPOSEFEXTPROC __glewMatrixLoadTransposefEXT = NULL; PFNGLMATRIXLOADDEXTPROC __glewMatrixLoaddEXT = NULL; PFNGLMATRIXLOADFEXTPROC __glewMatrixLoadfEXT = NULL; PFNGLMATRIXMULTTRANSPOSEDEXTPROC __glewMatrixMultTransposedEXT = NULL; PFNGLMATRIXMULTTRANSPOSEFEXTPROC __glewMatrixMultTransposefEXT = NULL; PFNGLMATRIXMULTDEXTPROC __glewMatrixMultdEXT = NULL; PFNGLMATRIXMULTFEXTPROC __glewMatrixMultfEXT = NULL; PFNGLMATRIXORTHOEXTPROC __glewMatrixOrthoEXT = NULL; PFNGLMATRIXPOPEXTPROC __glewMatrixPopEXT = NULL; PFNGLMATRIXPUSHEXTPROC __glewMatrixPushEXT = NULL; PFNGLMATRIXROTATEDEXTPROC __glewMatrixRotatedEXT = NULL; PFNGLMATRIXROTATEFEXTPROC __glewMatrixRotatefEXT = NULL; PFNGLMATRIXSCALEDEXTPROC __glewMatrixScaledEXT = NULL; PFNGLMATRIXSCALEFEXTPROC __glewMatrixScalefEXT = NULL; PFNGLMATRIXTRANSLATEDEXTPROC __glewMatrixTranslatedEXT = NULL; PFNGLMATRIXTRANSLATEFEXTPROC __glewMatrixTranslatefEXT = NULL; PFNGLMULTITEXBUFFEREXTPROC __glewMultiTexBufferEXT = NULL; PFNGLMULTITEXCOORDPOINTEREXTPROC __glewMultiTexCoordPointerEXT = NULL; PFNGLMULTITEXENVFEXTPROC __glewMultiTexEnvfEXT = NULL; PFNGLMULTITEXENVFVEXTPROC __glewMultiTexEnvfvEXT = NULL; PFNGLMULTITEXENVIEXTPROC __glewMultiTexEnviEXT = NULL; PFNGLMULTITEXENVIVEXTPROC __glewMultiTexEnvivEXT = NULL; PFNGLMULTITEXGENDEXTPROC __glewMultiTexGendEXT = NULL; PFNGLMULTITEXGENDVEXTPROC __glewMultiTexGendvEXT = NULL; PFNGLMULTITEXGENFEXTPROC __glewMultiTexGenfEXT = NULL; PFNGLMULTITEXGENFVEXTPROC __glewMultiTexGenfvEXT = NULL; PFNGLMULTITEXGENIEXTPROC __glewMultiTexGeniEXT = NULL; PFNGLMULTITEXGENIVEXTPROC __glewMultiTexGenivEXT = NULL; PFNGLMULTITEXIMAGE1DEXTPROC __glewMultiTexImage1DEXT = NULL; PFNGLMULTITEXIMAGE2DEXTPROC __glewMultiTexImage2DEXT = NULL; PFNGLMULTITEXIMAGE3DEXTPROC __glewMultiTexImage3DEXT = NULL; PFNGLMULTITEXPARAMETERIIVEXTPROC __glewMultiTexParameterIivEXT = NULL; PFNGLMULTITEXPARAMETERIUIVEXTPROC __glewMultiTexParameterIuivEXT = NULL; PFNGLMULTITEXPARAMETERFEXTPROC __glewMultiTexParameterfEXT = NULL; PFNGLMULTITEXPARAMETERFVEXTPROC __glewMultiTexParameterfvEXT = NULL; PFNGLMULTITEXPARAMETERIEXTPROC __glewMultiTexParameteriEXT = NULL; PFNGLMULTITEXPARAMETERIVEXTPROC __glewMultiTexParameterivEXT = NULL; PFNGLMULTITEXRENDERBUFFEREXTPROC __glewMultiTexRenderbufferEXT = NULL; PFNGLMULTITEXSUBIMAGE1DEXTPROC __glewMultiTexSubImage1DEXT = NULL; PFNGLMULTITEXSUBIMAGE2DEXTPROC __glewMultiTexSubImage2DEXT = NULL; PFNGLMULTITEXSUBIMAGE3DEXTPROC __glewMultiTexSubImage3DEXT = NULL; PFNGLNAMEDBUFFERDATAEXTPROC __glewNamedBufferDataEXT = NULL; PFNGLNAMEDBUFFERSUBDATAEXTPROC __glewNamedBufferSubDataEXT = NULL; PFNGLNAMEDCOPYBUFFERSUBDATAEXTPROC __glewNamedCopyBufferSubDataEXT = NULL; PFNGLNAMEDFRAMEBUFFERRENDERBUFFEREXTPROC __glewNamedFramebufferRenderbufferEXT = NULL; PFNGLNAMEDFRAMEBUFFERTEXTURE1DEXTPROC __glewNamedFramebufferTexture1DEXT = NULL; PFNGLNAMEDFRAMEBUFFERTEXTURE2DEXTPROC __glewNamedFramebufferTexture2DEXT = NULL; PFNGLNAMEDFRAMEBUFFERTEXTURE3DEXTPROC __glewNamedFramebufferTexture3DEXT = NULL; PFNGLNAMEDFRAMEBUFFERTEXTUREEXTPROC __glewNamedFramebufferTextureEXT = NULL; PFNGLNAMEDFRAMEBUFFERTEXTUREFACEEXTPROC __glewNamedFramebufferTextureFaceEXT = NULL; PFNGLNAMEDFRAMEBUFFERTEXTURELAYEREXTPROC __glewNamedFramebufferTextureLayerEXT = NULL; PFNGLNAMEDPROGRAMLOCALPARAMETER4DEXTPROC __glewNamedProgramLocalParameter4dEXT = NULL; PFNGLNAMEDPROGRAMLOCALPARAMETER4DVEXTPROC __glewNamedProgramLocalParameter4dvEXT = NULL; PFNGLNAMEDPROGRAMLOCALPARAMETER4FEXTPROC __glewNamedProgramLocalParameter4fEXT = NULL; PFNGLNAMEDPROGRAMLOCALPARAMETER4FVEXTPROC __glewNamedProgramLocalParameter4fvEXT = NULL; PFNGLNAMEDPROGRAMLOCALPARAMETERI4IEXTPROC __glewNamedProgramLocalParameterI4iEXT = NULL; PFNGLNAMEDPROGRAMLOCALPARAMETERI4IVEXTPROC __glewNamedProgramLocalParameterI4ivEXT = NULL; PFNGLNAMEDPROGRAMLOCALPARAMETERI4UIEXTPROC __glewNamedProgramLocalParameterI4uiEXT = NULL; PFNGLNAMEDPROGRAMLOCALPARAMETERI4UIVEXTPROC __glewNamedProgramLocalParameterI4uivEXT = NULL; PFNGLNAMEDPROGRAMLOCALPARAMETERS4FVEXTPROC __glewNamedProgramLocalParameters4fvEXT = NULL; PFNGLNAMEDPROGRAMLOCALPARAMETERSI4IVEXTPROC __glewNamedProgramLocalParametersI4ivEXT = NULL; PFNGLNAMEDPROGRAMLOCALPARAMETERSI4UIVEXTPROC __glewNamedProgramLocalParametersI4uivEXT = NULL; PFNGLNAMEDPROGRAMSTRINGEXTPROC __glewNamedProgramStringEXT = NULL; PFNGLNAMEDRENDERBUFFERSTORAGEEXTPROC __glewNamedRenderbufferStorageEXT = NULL; PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLECOVERAGEEXTPROC __glewNamedRenderbufferStorageMultisampleCoverageEXT = NULL; PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC __glewNamedRenderbufferStorageMultisampleEXT = NULL; PFNGLPROGRAMUNIFORM1DEXTPROC __glewProgramUniform1dEXT = NULL; PFNGLPROGRAMUNIFORM1DVEXTPROC __glewProgramUniform1dvEXT = NULL; PFNGLPROGRAMUNIFORM1FEXTPROC __glewProgramUniform1fEXT = NULL; PFNGLPROGRAMUNIFORM1FVEXTPROC __glewProgramUniform1fvEXT = NULL; PFNGLPROGRAMUNIFORM1IEXTPROC __glewProgramUniform1iEXT = NULL; PFNGLPROGRAMUNIFORM1IVEXTPROC __glewProgramUniform1ivEXT = NULL; PFNGLPROGRAMUNIFORM1UIEXTPROC __glewProgramUniform1uiEXT = NULL; PFNGLPROGRAMUNIFORM1UIVEXTPROC __glewProgramUniform1uivEXT = NULL; PFNGLPROGRAMUNIFORM2DEXTPROC __glewProgramUniform2dEXT = NULL; PFNGLPROGRAMUNIFORM2DVEXTPROC __glewProgramUniform2dvEXT = NULL; PFNGLPROGRAMUNIFORM2FEXTPROC __glewProgramUniform2fEXT = NULL; PFNGLPROGRAMUNIFORM2FVEXTPROC __glewProgramUniform2fvEXT = NULL; PFNGLPROGRAMUNIFORM2IEXTPROC __glewProgramUniform2iEXT = NULL; PFNGLPROGRAMUNIFORM2IVEXTPROC __glewProgramUniform2ivEXT = NULL; PFNGLPROGRAMUNIFORM2UIEXTPROC __glewProgramUniform2uiEXT = NULL; PFNGLPROGRAMUNIFORM2UIVEXTPROC __glewProgramUniform2uivEXT = NULL; PFNGLPROGRAMUNIFORM3DEXTPROC __glewProgramUniform3dEXT = NULL; PFNGLPROGRAMUNIFORM3DVEXTPROC __glewProgramUniform3dvEXT = NULL; PFNGLPROGRAMUNIFORM3FEXTPROC __glewProgramUniform3fEXT = NULL; PFNGLPROGRAMUNIFORM3FVEXTPROC __glewProgramUniform3fvEXT = NULL; PFNGLPROGRAMUNIFORM3IEXTPROC __glewProgramUniform3iEXT = NULL; PFNGLPROGRAMUNIFORM3IVEXTPROC __glewProgramUniform3ivEXT = NULL; PFNGLPROGRAMUNIFORM3UIEXTPROC __glewProgramUniform3uiEXT = NULL; PFNGLPROGRAMUNIFORM3UIVEXTPROC __glewProgramUniform3uivEXT = NULL; PFNGLPROGRAMUNIFORM4DEXTPROC __glewProgramUniform4dEXT = NULL; PFNGLPROGRAMUNIFORM4DVEXTPROC __glewProgramUniform4dvEXT = NULL; PFNGLPROGRAMUNIFORM4FEXTPROC __glewProgramUniform4fEXT = NULL; PFNGLPROGRAMUNIFORM4FVEXTPROC __glewProgramUniform4fvEXT = NULL; PFNGLPROGRAMUNIFORM4IEXTPROC __glewProgramUniform4iEXT = NULL; PFNGLPROGRAMUNIFORM4IVEXTPROC __glewProgramUniform4ivEXT = NULL; PFNGLPROGRAMUNIFORM4UIEXTPROC __glewProgramUniform4uiEXT = NULL; PFNGLPROGRAMUNIFORM4UIVEXTPROC __glewProgramUniform4uivEXT = NULL; PFNGLPROGRAMUNIFORMMATRIX2DVEXTPROC __glewProgramUniformMatrix2dvEXT = NULL; PFNGLPROGRAMUNIFORMMATRIX2FVEXTPROC __glewProgramUniformMatrix2fvEXT = NULL; PFNGLPROGRAMUNIFORMMATRIX2X3DVEXTPROC __glewProgramUniformMatrix2x3dvEXT = NULL; PFNGLPROGRAMUNIFORMMATRIX2X3FVEXTPROC __glewProgramUniformMatrix2x3fvEXT = NULL; PFNGLPROGRAMUNIFORMMATRIX2X4DVEXTPROC __glewProgramUniformMatrix2x4dvEXT = NULL; PFNGLPROGRAMUNIFORMMATRIX2X4FVEXTPROC __glewProgramUniformMatrix2x4fvEXT = NULL; PFNGLPROGRAMUNIFORMMATRIX3DVEXTPROC __glewProgramUniformMatrix3dvEXT = NULL; PFNGLPROGRAMUNIFORMMATRIX3FVEXTPROC __glewProgramUniformMatrix3fvEXT = NULL; PFNGLPROGRAMUNIFORMMATRIX3X2DVEXTPROC __glewProgramUniformMatrix3x2dvEXT = NULL; PFNGLPROGRAMUNIFORMMATRIX3X2FVEXTPROC __glewProgramUniformMatrix3x2fvEXT = NULL; PFNGLPROGRAMUNIFORMMATRIX3X4DVEXTPROC __glewProgramUniformMatrix3x4dvEXT = NULL; PFNGLPROGRAMUNIFORMMATRIX3X4FVEXTPROC __glewProgramUniformMatrix3x4fvEXT = NULL; PFNGLPROGRAMUNIFORMMATRIX4DVEXTPROC __glewProgramUniformMatrix4dvEXT = NULL; PFNGLPROGRAMUNIFORMMATRIX4FVEXTPROC __glewProgramUniformMatrix4fvEXT = NULL; PFNGLPROGRAMUNIFORMMATRIX4X2DVEXTPROC __glewProgramUniformMatrix4x2dvEXT = NULL; PFNGLPROGRAMUNIFORMMATRIX4X2FVEXTPROC __glewProgramUniformMatrix4x2fvEXT = NULL; PFNGLPROGRAMUNIFORMMATRIX4X3DVEXTPROC __glewProgramUniformMatrix4x3dvEXT = NULL; PFNGLPROGRAMUNIFORMMATRIX4X3FVEXTPROC __glewProgramUniformMatrix4x3fvEXT = NULL; PFNGLPUSHCLIENTATTRIBDEFAULTEXTPROC __glewPushClientAttribDefaultEXT = NULL; PFNGLTEXTUREBUFFEREXTPROC __glewTextureBufferEXT = NULL; PFNGLTEXTUREIMAGE1DEXTPROC __glewTextureImage1DEXT = NULL; PFNGLTEXTUREIMAGE2DEXTPROC __glewTextureImage2DEXT = NULL; PFNGLTEXTUREIMAGE3DEXTPROC __glewTextureImage3DEXT = NULL; PFNGLTEXTUREPARAMETERIIVEXTPROC __glewTextureParameterIivEXT = NULL; PFNGLTEXTUREPARAMETERIUIVEXTPROC __glewTextureParameterIuivEXT = NULL; PFNGLTEXTUREPARAMETERFEXTPROC __glewTextureParameterfEXT = NULL; PFNGLTEXTUREPARAMETERFVEXTPROC __glewTextureParameterfvEXT = NULL; PFNGLTEXTUREPARAMETERIEXTPROC __glewTextureParameteriEXT = NULL; PFNGLTEXTUREPARAMETERIVEXTPROC __glewTextureParameterivEXT = NULL; PFNGLTEXTURERENDERBUFFEREXTPROC __glewTextureRenderbufferEXT = NULL; PFNGLTEXTURESUBIMAGE1DEXTPROC __glewTextureSubImage1DEXT = NULL; PFNGLTEXTURESUBIMAGE2DEXTPROC __glewTextureSubImage2DEXT = NULL; PFNGLTEXTURESUBIMAGE3DEXTPROC __glewTextureSubImage3DEXT = NULL; PFNGLUNMAPNAMEDBUFFEREXTPROC __glewUnmapNamedBufferEXT = NULL; PFNGLVERTEXARRAYCOLOROFFSETEXTPROC __glewVertexArrayColorOffsetEXT = NULL; PFNGLVERTEXARRAYEDGEFLAGOFFSETEXTPROC __glewVertexArrayEdgeFlagOffsetEXT = NULL; PFNGLVERTEXARRAYFOGCOORDOFFSETEXTPROC __glewVertexArrayFogCoordOffsetEXT = NULL; PFNGLVERTEXARRAYINDEXOFFSETEXTPROC __glewVertexArrayIndexOffsetEXT = NULL; PFNGLVERTEXARRAYMULTITEXCOORDOFFSETEXTPROC __glewVertexArrayMultiTexCoordOffsetEXT = NULL; PFNGLVERTEXARRAYNORMALOFFSETEXTPROC __glewVertexArrayNormalOffsetEXT = NULL; PFNGLVERTEXARRAYSECONDARYCOLOROFFSETEXTPROC __glewVertexArraySecondaryColorOffsetEXT = NULL; PFNGLVERTEXARRAYTEXCOORDOFFSETEXTPROC __glewVertexArrayTexCoordOffsetEXT = NULL; PFNGLVERTEXARRAYVERTEXATTRIBIOFFSETEXTPROC __glewVertexArrayVertexAttribIOffsetEXT = NULL; PFNGLVERTEXARRAYVERTEXATTRIBOFFSETEXTPROC __glewVertexArrayVertexAttribOffsetEXT = NULL; PFNGLVERTEXARRAYVERTEXOFFSETEXTPROC __glewVertexArrayVertexOffsetEXT = NULL; PFNGLCOLORMASKINDEXEDEXTPROC __glewColorMaskIndexedEXT = NULL; PFNGLDISABLEINDEXEDEXTPROC __glewDisableIndexedEXT = NULL; PFNGLENABLEINDEXEDEXTPROC __glewEnableIndexedEXT = NULL; PFNGLGETBOOLEANINDEXEDVEXTPROC __glewGetBooleanIndexedvEXT = NULL; PFNGLGETINTEGERINDEXEDVEXTPROC __glewGetIntegerIndexedvEXT = NULL; PFNGLISENABLEDINDEXEDEXTPROC __glewIsEnabledIndexedEXT = NULL; PFNGLDRAWARRAYSINSTANCEDEXTPROC __glewDrawArraysInstancedEXT = NULL; PFNGLDRAWELEMENTSINSTANCEDEXTPROC __glewDrawElementsInstancedEXT = NULL; PFNGLDRAWRANGEELEMENTSEXTPROC __glewDrawRangeElementsEXT = NULL; PFNGLFOGCOORDPOINTEREXTPROC __glewFogCoordPointerEXT = NULL; PFNGLFOGCOORDDEXTPROC __glewFogCoorddEXT = NULL; PFNGLFOGCOORDDVEXTPROC __glewFogCoorddvEXT = NULL; PFNGLFOGCOORDFEXTPROC __glewFogCoordfEXT = NULL; PFNGLFOGCOORDFVEXTPROC __glewFogCoordfvEXT = NULL; PFNGLFRAGMENTCOLORMATERIALEXTPROC __glewFragmentColorMaterialEXT = NULL; PFNGLFRAGMENTLIGHTMODELFEXTPROC __glewFragmentLightModelfEXT = NULL; PFNGLFRAGMENTLIGHTMODELFVEXTPROC __glewFragmentLightModelfvEXT = NULL; PFNGLFRAGMENTLIGHTMODELIEXTPROC __glewFragmentLightModeliEXT = NULL; PFNGLFRAGMENTLIGHTMODELIVEXTPROC __glewFragmentLightModelivEXT = NULL; PFNGLFRAGMENTLIGHTFEXTPROC __glewFragmentLightfEXT = NULL; PFNGLFRAGMENTLIGHTFVEXTPROC __glewFragmentLightfvEXT = NULL; PFNGLFRAGMENTLIGHTIEXTPROC __glewFragmentLightiEXT = NULL; PFNGLFRAGMENTLIGHTIVEXTPROC __glewFragmentLightivEXT = NULL; PFNGLFRAGMENTMATERIALFEXTPROC __glewFragmentMaterialfEXT = NULL; PFNGLFRAGMENTMATERIALFVEXTPROC __glewFragmentMaterialfvEXT = NULL; PFNGLFRAGMENTMATERIALIEXTPROC __glewFragmentMaterialiEXT = NULL; PFNGLFRAGMENTMATERIALIVEXTPROC __glewFragmentMaterialivEXT = NULL; PFNGLGETFRAGMENTLIGHTFVEXTPROC __glewGetFragmentLightfvEXT = NULL; PFNGLGETFRAGMENTLIGHTIVEXTPROC __glewGetFragmentLightivEXT = NULL; PFNGLGETFRAGMENTMATERIALFVEXTPROC __glewGetFragmentMaterialfvEXT = NULL; PFNGLGETFRAGMENTMATERIALIVEXTPROC __glewGetFragmentMaterialivEXT = NULL; PFNGLLIGHTENVIEXTPROC __glewLightEnviEXT = NULL; PFNGLBLITFRAMEBUFFEREXTPROC __glewBlitFramebufferEXT = NULL; PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC __glewRenderbufferStorageMultisampleEXT = NULL; PFNGLBINDFRAMEBUFFEREXTPROC __glewBindFramebufferEXT = NULL; PFNGLBINDRENDERBUFFEREXTPROC __glewBindRenderbufferEXT = NULL; PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC __glewCheckFramebufferStatusEXT = NULL; PFNGLDELETEFRAMEBUFFERSEXTPROC __glewDeleteFramebuffersEXT = NULL; PFNGLDELETERENDERBUFFERSEXTPROC __glewDeleteRenderbuffersEXT = NULL; PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC __glewFramebufferRenderbufferEXT = NULL; PFNGLFRAMEBUFFERTEXTURE1DEXTPROC __glewFramebufferTexture1DEXT = NULL; PFNGLFRAMEBUFFERTEXTURE2DEXTPROC __glewFramebufferTexture2DEXT = NULL; PFNGLFRAMEBUFFERTEXTURE3DEXTPROC __glewFramebufferTexture3DEXT = NULL; PFNGLGENFRAMEBUFFERSEXTPROC __glewGenFramebuffersEXT = NULL; PFNGLGENRENDERBUFFERSEXTPROC __glewGenRenderbuffersEXT = NULL; PFNGLGENERATEMIPMAPEXTPROC __glewGenerateMipmapEXT = NULL; PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC __glewGetFramebufferAttachmentParameterivEXT = NULL; PFNGLGETRENDERBUFFERPARAMETERIVEXTPROC __glewGetRenderbufferParameterivEXT = NULL; PFNGLISFRAMEBUFFEREXTPROC __glewIsFramebufferEXT = NULL; PFNGLISRENDERBUFFEREXTPROC __glewIsRenderbufferEXT = NULL; PFNGLRENDERBUFFERSTORAGEEXTPROC __glewRenderbufferStorageEXT = NULL; PFNGLFRAMEBUFFERTEXTUREEXTPROC __glewFramebufferTextureEXT = NULL; PFNGLFRAMEBUFFERTEXTUREFACEEXTPROC __glewFramebufferTextureFaceEXT = NULL; PFNGLPROGRAMPARAMETERIEXTPROC __glewProgramParameteriEXT = NULL; PFNGLPROGRAMENVPARAMETERS4FVEXTPROC __glewProgramEnvParameters4fvEXT = NULL; PFNGLPROGRAMLOCALPARAMETERS4FVEXTPROC __glewProgramLocalParameters4fvEXT = NULL; PFNGLBINDFRAGDATALOCATIONEXTPROC __glewBindFragDataLocationEXT = NULL; PFNGLGETFRAGDATALOCATIONEXTPROC __glewGetFragDataLocationEXT = NULL; PFNGLGETUNIFORMUIVEXTPROC __glewGetUniformuivEXT = NULL; PFNGLGETVERTEXATTRIBIIVEXTPROC __glewGetVertexAttribIivEXT = NULL; PFNGLGETVERTEXATTRIBIUIVEXTPROC __glewGetVertexAttribIuivEXT = NULL; PFNGLUNIFORM1UIEXTPROC __glewUniform1uiEXT = NULL; PFNGLUNIFORM1UIVEXTPROC __glewUniform1uivEXT = NULL; PFNGLUNIFORM2UIEXTPROC __glewUniform2uiEXT = NULL; PFNGLUNIFORM2UIVEXTPROC __glewUniform2uivEXT = NULL; PFNGLUNIFORM3UIEXTPROC __glewUniform3uiEXT = NULL; PFNGLUNIFORM3UIVEXTPROC __glewUniform3uivEXT = NULL; PFNGLUNIFORM4UIEXTPROC __glewUniform4uiEXT = NULL; PFNGLUNIFORM4UIVEXTPROC __glewUniform4uivEXT = NULL; PFNGLVERTEXATTRIBI1IEXTPROC __glewVertexAttribI1iEXT = NULL; PFNGLVERTEXATTRIBI1IVEXTPROC __glewVertexAttribI1ivEXT = NULL; PFNGLVERTEXATTRIBI1UIEXTPROC __glewVertexAttribI1uiEXT = NULL; PFNGLVERTEXATTRIBI1UIVEXTPROC __glewVertexAttribI1uivEXT = NULL; PFNGLVERTEXATTRIBI2IEXTPROC __glewVertexAttribI2iEXT = NULL; PFNGLVERTEXATTRIBI2IVEXTPROC __glewVertexAttribI2ivEXT = NULL; PFNGLVERTEXATTRIBI2UIEXTPROC __glewVertexAttribI2uiEXT = NULL; PFNGLVERTEXATTRIBI2UIVEXTPROC __glewVertexAttribI2uivEXT = NULL; PFNGLVERTEXATTRIBI3IEXTPROC __glewVertexAttribI3iEXT = NULL; PFNGLVERTEXATTRIBI3IVEXTPROC __glewVertexAttribI3ivEXT = NULL; PFNGLVERTEXATTRIBI3UIEXTPROC __glewVertexAttribI3uiEXT = NULL; PFNGLVERTEXATTRIBI3UIVEXTPROC __glewVertexAttribI3uivEXT = NULL; PFNGLVERTEXATTRIBI4BVEXTPROC __glewVertexAttribI4bvEXT = NULL; PFNGLVERTEXATTRIBI4IEXTPROC __glewVertexAttribI4iEXT = NULL; PFNGLVERTEXATTRIBI4IVEXTPROC __glewVertexAttribI4ivEXT = NULL; PFNGLVERTEXATTRIBI4SVEXTPROC __glewVertexAttribI4svEXT = NULL; PFNGLVERTEXATTRIBI4UBVEXTPROC __glewVertexAttribI4ubvEXT = NULL; PFNGLVERTEXATTRIBI4UIEXTPROC __glewVertexAttribI4uiEXT = NULL; PFNGLVERTEXATTRIBI4UIVEXTPROC __glewVertexAttribI4uivEXT = NULL; PFNGLVERTEXATTRIBI4USVEXTPROC __glewVertexAttribI4usvEXT = NULL; PFNGLVERTEXATTRIBIPOINTEREXTPROC __glewVertexAttribIPointerEXT = NULL; PFNGLGETHISTOGRAMEXTPROC __glewGetHistogramEXT = NULL; PFNGLGETHISTOGRAMPARAMETERFVEXTPROC __glewGetHistogramParameterfvEXT = NULL; PFNGLGETHISTOGRAMPARAMETERIVEXTPROC __glewGetHistogramParameterivEXT = NULL; PFNGLGETMINMAXEXTPROC __glewGetMinmaxEXT = NULL; PFNGLGETMINMAXPARAMETERFVEXTPROC __glewGetMinmaxParameterfvEXT = NULL; PFNGLGETMINMAXPARAMETERIVEXTPROC __glewGetMinmaxParameterivEXT = NULL; PFNGLHISTOGRAMEXTPROC __glewHistogramEXT = NULL; PFNGLMINMAXEXTPROC __glewMinmaxEXT = NULL; PFNGLRESETHISTOGRAMEXTPROC __glewResetHistogramEXT = NULL; PFNGLRESETMINMAXEXTPROC __glewResetMinmaxEXT = NULL; PFNGLINDEXFUNCEXTPROC __glewIndexFuncEXT = NULL; PFNGLINDEXMATERIALEXTPROC __glewIndexMaterialEXT = NULL; PFNGLAPPLYTEXTUREEXTPROC __glewApplyTextureEXT = NULL; PFNGLTEXTURELIGHTEXTPROC __glewTextureLightEXT = NULL; PFNGLTEXTUREMATERIALEXTPROC __glewTextureMaterialEXT = NULL; PFNGLMULTIDRAWARRAYSEXTPROC __glewMultiDrawArraysEXT = NULL; PFNGLMULTIDRAWELEMENTSEXTPROC __glewMultiDrawElementsEXT = NULL; PFNGLSAMPLEMASKEXTPROC __glewSampleMaskEXT = NULL; PFNGLSAMPLEPATTERNEXTPROC __glewSamplePatternEXT = NULL; PFNGLCOLORTABLEEXTPROC __glewColorTableEXT = NULL; PFNGLGETCOLORTABLEEXTPROC __glewGetColorTableEXT = NULL; PFNGLGETCOLORTABLEPARAMETERFVEXTPROC __glewGetColorTableParameterfvEXT = NULL; PFNGLGETCOLORTABLEPARAMETERIVEXTPROC __glewGetColorTableParameterivEXT = NULL; PFNGLGETPIXELTRANSFORMPARAMETERFVEXTPROC __glewGetPixelTransformParameterfvEXT = NULL; PFNGLGETPIXELTRANSFORMPARAMETERIVEXTPROC __glewGetPixelTransformParameterivEXT = NULL; PFNGLPIXELTRANSFORMPARAMETERFEXTPROC __glewPixelTransformParameterfEXT = NULL; PFNGLPIXELTRANSFORMPARAMETERFVEXTPROC __glewPixelTransformParameterfvEXT = NULL; PFNGLPIXELTRANSFORMPARAMETERIEXTPROC __glewPixelTransformParameteriEXT = NULL; PFNGLPIXELTRANSFORMPARAMETERIVEXTPROC __glewPixelTransformParameterivEXT = NULL; PFNGLPOINTPARAMETERFEXTPROC __glewPointParameterfEXT = NULL; PFNGLPOINTPARAMETERFVEXTPROC __glewPointParameterfvEXT = NULL; PFNGLPOLYGONOFFSETEXTPROC __glewPolygonOffsetEXT = NULL; PFNGLPROVOKINGVERTEXEXTPROC __glewProvokingVertexEXT = NULL; PFNGLBEGINSCENEEXTPROC __glewBeginSceneEXT = NULL; PFNGLENDSCENEEXTPROC __glewEndSceneEXT = NULL; PFNGLSECONDARYCOLOR3BEXTPROC __glewSecondaryColor3bEXT = NULL; PFNGLSECONDARYCOLOR3BVEXTPROC __glewSecondaryColor3bvEXT = NULL; PFNGLSECONDARYCOLOR3DEXTPROC __glewSecondaryColor3dEXT = NULL; PFNGLSECONDARYCOLOR3DVEXTPROC __glewSecondaryColor3dvEXT = NULL; PFNGLSECONDARYCOLOR3FEXTPROC __glewSecondaryColor3fEXT = NULL; PFNGLSECONDARYCOLOR3FVEXTPROC __glewSecondaryColor3fvEXT = NULL; PFNGLSECONDARYCOLOR3IEXTPROC __glewSecondaryColor3iEXT = NULL; PFNGLSECONDARYCOLOR3IVEXTPROC __glewSecondaryColor3ivEXT = NULL; PFNGLSECONDARYCOLOR3SEXTPROC __glewSecondaryColor3sEXT = NULL; PFNGLSECONDARYCOLOR3SVEXTPROC __glewSecondaryColor3svEXT = NULL; PFNGLSECONDARYCOLOR3UBEXTPROC __glewSecondaryColor3ubEXT = NULL; PFNGLSECONDARYCOLOR3UBVEXTPROC __glewSecondaryColor3ubvEXT = NULL; PFNGLSECONDARYCOLOR3UIEXTPROC __glewSecondaryColor3uiEXT = NULL; PFNGLSECONDARYCOLOR3UIVEXTPROC __glewSecondaryColor3uivEXT = NULL; PFNGLSECONDARYCOLOR3USEXTPROC __glewSecondaryColor3usEXT = NULL; PFNGLSECONDARYCOLOR3USVEXTPROC __glewSecondaryColor3usvEXT = NULL; PFNGLSECONDARYCOLORPOINTEREXTPROC __glewSecondaryColorPointerEXT = NULL; PFNGLACTIVEPROGRAMEXTPROC __glewActiveProgramEXT = NULL; PFNGLCREATESHADERPROGRAMEXTPROC __glewCreateShaderProgramEXT = NULL; PFNGLUSESHADERPROGRAMEXTPROC __glewUseShaderProgramEXT = NULL; PFNGLBINDIMAGETEXTUREEXTPROC __glewBindImageTextureEXT = NULL; PFNGLMEMORYBARRIEREXTPROC __glewMemoryBarrierEXT = NULL; PFNGLACTIVESTENCILFACEEXTPROC __glewActiveStencilFaceEXT = NULL; PFNGLTEXSUBIMAGE1DEXTPROC __glewTexSubImage1DEXT = NULL; PFNGLTEXSUBIMAGE2DEXTPROC __glewTexSubImage2DEXT = NULL; PFNGLTEXSUBIMAGE3DEXTPROC __glewTexSubImage3DEXT = NULL; PFNGLTEXIMAGE3DEXTPROC __glewTexImage3DEXT = NULL; PFNGLFRAMEBUFFERTEXTURELAYEREXTPROC __glewFramebufferTextureLayerEXT = NULL; PFNGLTEXBUFFEREXTPROC __glewTexBufferEXT = NULL; PFNGLCLEARCOLORIIEXTPROC __glewClearColorIiEXT = NULL; PFNGLCLEARCOLORIUIEXTPROC __glewClearColorIuiEXT = NULL; PFNGLGETTEXPARAMETERIIVEXTPROC __glewGetTexParameterIivEXT = NULL; PFNGLGETTEXPARAMETERIUIVEXTPROC __glewGetTexParameterIuivEXT = NULL; PFNGLTEXPARAMETERIIVEXTPROC __glewTexParameterIivEXT = NULL; PFNGLTEXPARAMETERIUIVEXTPROC __glewTexParameterIuivEXT = NULL; PFNGLARETEXTURESRESIDENTEXTPROC __glewAreTexturesResidentEXT = NULL; PFNGLBINDTEXTUREEXTPROC __glewBindTextureEXT = NULL; PFNGLDELETETEXTURESEXTPROC __glewDeleteTexturesEXT = NULL; PFNGLGENTEXTURESEXTPROC __glewGenTexturesEXT = NULL; PFNGLISTEXTUREEXTPROC __glewIsTextureEXT = NULL; PFNGLPRIORITIZETEXTURESEXTPROC __glewPrioritizeTexturesEXT = NULL; PFNGLTEXTURENORMALEXTPROC __glewTextureNormalEXT = NULL; PFNGLGETQUERYOBJECTI64VEXTPROC __glewGetQueryObjecti64vEXT = NULL; PFNGLGETQUERYOBJECTUI64VEXTPROC __glewGetQueryObjectui64vEXT = NULL; PFNGLBEGINTRANSFORMFEEDBACKEXTPROC __glewBeginTransformFeedbackEXT = NULL; PFNGLBINDBUFFERBASEEXTPROC __glewBindBufferBaseEXT = NULL; PFNGLBINDBUFFEROFFSETEXTPROC __glewBindBufferOffsetEXT = NULL; PFNGLBINDBUFFERRANGEEXTPROC __glewBindBufferRangeEXT = NULL; PFNGLENDTRANSFORMFEEDBACKEXTPROC __glewEndTransformFeedbackEXT = NULL; PFNGLGETTRANSFORMFEEDBACKVARYINGEXTPROC __glewGetTransformFeedbackVaryingEXT = NULL; PFNGLTRANSFORMFEEDBACKVARYINGSEXTPROC __glewTransformFeedbackVaryingsEXT = NULL; PFNGLARRAYELEMENTEXTPROC __glewArrayElementEXT = NULL; PFNGLCOLORPOINTEREXTPROC __glewColorPointerEXT = NULL; PFNGLDRAWARRAYSEXTPROC __glewDrawArraysEXT = NULL; PFNGLEDGEFLAGPOINTEREXTPROC __glewEdgeFlagPointerEXT = NULL; PFNGLINDEXPOINTEREXTPROC __glewIndexPointerEXT = NULL; PFNGLNORMALPOINTEREXTPROC __glewNormalPointerEXT = NULL; PFNGLTEXCOORDPOINTEREXTPROC __glewTexCoordPointerEXT = NULL; PFNGLVERTEXPOINTEREXTPROC __glewVertexPointerEXT = NULL; PFNGLGETVERTEXATTRIBLDVEXTPROC __glewGetVertexAttribLdvEXT = NULL; PFNGLVERTEXARRAYVERTEXATTRIBLOFFSETEXTPROC __glewVertexArrayVertexAttribLOffsetEXT = NULL; PFNGLVERTEXATTRIBL1DEXTPROC __glewVertexAttribL1dEXT = NULL; PFNGLVERTEXATTRIBL1DVEXTPROC __glewVertexAttribL1dvEXT = NULL; PFNGLVERTEXATTRIBL2DEXTPROC __glewVertexAttribL2dEXT = NULL; PFNGLVERTEXATTRIBL2DVEXTPROC __glewVertexAttribL2dvEXT = NULL; PFNGLVERTEXATTRIBL3DEXTPROC __glewVertexAttribL3dEXT = NULL; PFNGLVERTEXATTRIBL3DVEXTPROC __glewVertexAttribL3dvEXT = NULL; PFNGLVERTEXATTRIBL4DEXTPROC __glewVertexAttribL4dEXT = NULL; PFNGLVERTEXATTRIBL4DVEXTPROC __glewVertexAttribL4dvEXT = NULL; PFNGLVERTEXATTRIBLPOINTEREXTPROC __glewVertexAttribLPointerEXT = NULL; PFNGLBEGINVERTEXSHADEREXTPROC __glewBeginVertexShaderEXT = NULL; PFNGLBINDLIGHTPARAMETEREXTPROC __glewBindLightParameterEXT = NULL; PFNGLBINDMATERIALPARAMETEREXTPROC __glewBindMaterialParameterEXT = NULL; PFNGLBINDPARAMETEREXTPROC __glewBindParameterEXT = NULL; PFNGLBINDTEXGENPARAMETEREXTPROC __glewBindTexGenParameterEXT = NULL; PFNGLBINDTEXTUREUNITPARAMETEREXTPROC __glewBindTextureUnitParameterEXT = NULL; PFNGLBINDVERTEXSHADEREXTPROC __glewBindVertexShaderEXT = NULL; PFNGLDELETEVERTEXSHADEREXTPROC __glewDeleteVertexShaderEXT = NULL; PFNGLDISABLEVARIANTCLIENTSTATEEXTPROC __glewDisableVariantClientStateEXT = NULL; PFNGLENABLEVARIANTCLIENTSTATEEXTPROC __glewEnableVariantClientStateEXT = NULL; PFNGLENDVERTEXSHADEREXTPROC __glewEndVertexShaderEXT = NULL; PFNGLEXTRACTCOMPONENTEXTPROC __glewExtractComponentEXT = NULL; PFNGLGENSYMBOLSEXTPROC __glewGenSymbolsEXT = NULL; PFNGLGENVERTEXSHADERSEXTPROC __glewGenVertexShadersEXT = NULL; PFNGLGETINVARIANTBOOLEANVEXTPROC __glewGetInvariantBooleanvEXT = NULL; PFNGLGETINVARIANTFLOATVEXTPROC __glewGetInvariantFloatvEXT = NULL; PFNGLGETINVARIANTINTEGERVEXTPROC __glewGetInvariantIntegervEXT = NULL; PFNGLGETLOCALCONSTANTBOOLEANVEXTPROC __glewGetLocalConstantBooleanvEXT = NULL; PFNGLGETLOCALCONSTANTFLOATVEXTPROC __glewGetLocalConstantFloatvEXT = NULL; PFNGLGETLOCALCONSTANTINTEGERVEXTPROC __glewGetLocalConstantIntegervEXT = NULL; PFNGLGETVARIANTBOOLEANVEXTPROC __glewGetVariantBooleanvEXT = NULL; PFNGLGETVARIANTFLOATVEXTPROC __glewGetVariantFloatvEXT = NULL; PFNGLGETVARIANTINTEGERVEXTPROC __glewGetVariantIntegervEXT = NULL; PFNGLGETVARIANTPOINTERVEXTPROC __glewGetVariantPointervEXT = NULL; PFNGLINSERTCOMPONENTEXTPROC __glewInsertComponentEXT = NULL; PFNGLISVARIANTENABLEDEXTPROC __glewIsVariantEnabledEXT = NULL; PFNGLSETINVARIANTEXTPROC __glewSetInvariantEXT = NULL; PFNGLSETLOCALCONSTANTEXTPROC __glewSetLocalConstantEXT = NULL; PFNGLSHADEROP1EXTPROC __glewShaderOp1EXT = NULL; PFNGLSHADEROP2EXTPROC __glewShaderOp2EXT = NULL; PFNGLSHADEROP3EXTPROC __glewShaderOp3EXT = NULL; PFNGLSWIZZLEEXTPROC __glewSwizzleEXT = NULL; PFNGLVARIANTPOINTEREXTPROC __glewVariantPointerEXT = NULL; PFNGLVARIANTBVEXTPROC __glewVariantbvEXT = NULL; PFNGLVARIANTDVEXTPROC __glewVariantdvEXT = NULL; PFNGLVARIANTFVEXTPROC __glewVariantfvEXT = NULL; PFNGLVARIANTIVEXTPROC __glewVariantivEXT = NULL; PFNGLVARIANTSVEXTPROC __glewVariantsvEXT = NULL; PFNGLVARIANTUBVEXTPROC __glewVariantubvEXT = NULL; PFNGLVARIANTUIVEXTPROC __glewVariantuivEXT = NULL; PFNGLVARIANTUSVEXTPROC __glewVariantusvEXT = NULL; PFNGLWRITEMASKEXTPROC __glewWriteMaskEXT = NULL; PFNGLVERTEXWEIGHTPOINTEREXTPROC __glewVertexWeightPointerEXT = NULL; PFNGLVERTEXWEIGHTFEXTPROC __glewVertexWeightfEXT = NULL; PFNGLVERTEXWEIGHTFVEXTPROC __glewVertexWeightfvEXT = NULL; PFNGLIMPORTSYNCEXTPROC __glewImportSyncEXT = NULL; PFNGLFRAMETERMINATORGREMEDYPROC __glewFrameTerminatorGREMEDY = NULL; PFNGLSTRINGMARKERGREMEDYPROC __glewStringMarkerGREMEDY = NULL; PFNGLGETIMAGETRANSFORMPARAMETERFVHPPROC __glewGetImageTransformParameterfvHP = NULL; PFNGLGETIMAGETRANSFORMPARAMETERIVHPPROC __glewGetImageTransformParameterivHP = NULL; PFNGLIMAGETRANSFORMPARAMETERFHPPROC __glewImageTransformParameterfHP = NULL; PFNGLIMAGETRANSFORMPARAMETERFVHPPROC __glewImageTransformParameterfvHP = NULL; PFNGLIMAGETRANSFORMPARAMETERIHPPROC __glewImageTransformParameteriHP = NULL; PFNGLIMAGETRANSFORMPARAMETERIVHPPROC __glewImageTransformParameterivHP = NULL; PFNGLMULTIMODEDRAWARRAYSIBMPROC __glewMultiModeDrawArraysIBM = NULL; PFNGLMULTIMODEDRAWELEMENTSIBMPROC __glewMultiModeDrawElementsIBM = NULL; PFNGLCOLORPOINTERLISTIBMPROC __glewColorPointerListIBM = NULL; PFNGLEDGEFLAGPOINTERLISTIBMPROC __glewEdgeFlagPointerListIBM = NULL; PFNGLFOGCOORDPOINTERLISTIBMPROC __glewFogCoordPointerListIBM = NULL; PFNGLINDEXPOINTERLISTIBMPROC __glewIndexPointerListIBM = NULL; PFNGLNORMALPOINTERLISTIBMPROC __glewNormalPointerListIBM = NULL; PFNGLSECONDARYCOLORPOINTERLISTIBMPROC __glewSecondaryColorPointerListIBM = NULL; PFNGLTEXCOORDPOINTERLISTIBMPROC __glewTexCoordPointerListIBM = NULL; PFNGLVERTEXPOINTERLISTIBMPROC __glewVertexPointerListIBM = NULL; PFNGLCOLORPOINTERVINTELPROC __glewColorPointervINTEL = NULL; PFNGLNORMALPOINTERVINTELPROC __glewNormalPointervINTEL = NULL; PFNGLTEXCOORDPOINTERVINTELPROC __glewTexCoordPointervINTEL = NULL; PFNGLVERTEXPOINTERVINTELPROC __glewVertexPointervINTEL = NULL; PFNGLTEXSCISSORFUNCINTELPROC __glewTexScissorFuncINTEL = NULL; PFNGLTEXSCISSORINTELPROC __glewTexScissorINTEL = NULL; PFNGLDEBUGMESSAGECALLBACKPROC __glewDebugMessageCallback = NULL; PFNGLDEBUGMESSAGECONTROLPROC __glewDebugMessageControl = NULL; PFNGLDEBUGMESSAGEINSERTPROC __glewDebugMessageInsert = NULL; PFNGLGETDEBUGMESSAGELOGPROC __glewGetDebugMessageLog = NULL; PFNGLGETOBJECTLABELPROC __glewGetObjectLabel = NULL; PFNGLGETOBJECTPTRLABELPROC __glewGetObjectPtrLabel = NULL; PFNGLGETPOINTERVPROC __glewGetPointerv = NULL; PFNGLOBJECTLABELPROC __glewObjectLabel = NULL; PFNGLOBJECTPTRLABELPROC __glewObjectPtrLabel = NULL; PFNGLPUSHDEBUGGROUPPROC __glewPushDebugGroup = NULL; PFNGLBUFFERREGIONENABLEDPROC __glewBufferRegionEnabled = NULL; PFNGLDELETEBUFFERREGIONPROC __glewDeleteBufferRegion = NULL; PFNGLDRAWBUFFERREGIONPROC __glewDrawBufferRegion = NULL; PFNGLNEWBUFFERREGIONPROC __glewNewBufferRegion = NULL; PFNGLREADBUFFERREGIONPROC __glewReadBufferRegion = NULL; PFNGLRESIZEBUFFERSMESAPROC __glewResizeBuffersMESA = NULL; PFNGLWINDOWPOS2DMESAPROC __glewWindowPos2dMESA = NULL; PFNGLWINDOWPOS2DVMESAPROC __glewWindowPos2dvMESA = NULL; PFNGLWINDOWPOS2FMESAPROC __glewWindowPos2fMESA = NULL; PFNGLWINDOWPOS2FVMESAPROC __glewWindowPos2fvMESA = NULL; PFNGLWINDOWPOS2IMESAPROC __glewWindowPos2iMESA = NULL; PFNGLWINDOWPOS2IVMESAPROC __glewWindowPos2ivMESA = NULL; PFNGLWINDOWPOS2SMESAPROC __glewWindowPos2sMESA = NULL; PFNGLWINDOWPOS2SVMESAPROC __glewWindowPos2svMESA = NULL; PFNGLWINDOWPOS3DMESAPROC __glewWindowPos3dMESA = NULL; PFNGLWINDOWPOS3DVMESAPROC __glewWindowPos3dvMESA = NULL; PFNGLWINDOWPOS3FMESAPROC __glewWindowPos3fMESA = NULL; PFNGLWINDOWPOS3FVMESAPROC __glewWindowPos3fvMESA = NULL; PFNGLWINDOWPOS3IMESAPROC __glewWindowPos3iMESA = NULL; PFNGLWINDOWPOS3IVMESAPROC __glewWindowPos3ivMESA = NULL; PFNGLWINDOWPOS3SMESAPROC __glewWindowPos3sMESA = NULL; PFNGLWINDOWPOS3SVMESAPROC __glewWindowPos3svMESA = NULL; PFNGLWINDOWPOS4DMESAPROC __glewWindowPos4dMESA = NULL; PFNGLWINDOWPOS4DVMESAPROC __glewWindowPos4dvMESA = NULL; PFNGLWINDOWPOS4FMESAPROC __glewWindowPos4fMESA = NULL; PFNGLWINDOWPOS4FVMESAPROC __glewWindowPos4fvMESA = NULL; PFNGLWINDOWPOS4IMESAPROC __glewWindowPos4iMESA = NULL; PFNGLWINDOWPOS4IVMESAPROC __glewWindowPos4ivMESA = NULL; PFNGLWINDOWPOS4SMESAPROC __glewWindowPos4sMESA = NULL; PFNGLWINDOWPOS4SVMESAPROC __glewWindowPos4svMESA = NULL; PFNGLGETIMAGEHANDLENVPROC __glewGetImageHandleNV = NULL; PFNGLGETTEXTUREHANDLENVPROC __glewGetTextureHandleNV = NULL; PFNGLGETTEXTURESAMPLERHANDLENVPROC __glewGetTextureSamplerHandleNV = NULL; PFNGLISIMAGEHANDLERESIDENTNVPROC __glewIsImageHandleResidentNV = NULL; PFNGLISTEXTUREHANDLERESIDENTNVPROC __glewIsTextureHandleResidentNV = NULL; PFNGLMAKEIMAGEHANDLENONRESIDENTNVPROC __glewMakeImageHandleNonResidentNV = NULL; PFNGLMAKEIMAGEHANDLERESIDENTNVPROC __glewMakeImageHandleResidentNV = NULL; PFNGLMAKETEXTUREHANDLENONRESIDENTNVPROC __glewMakeTextureHandleNonResidentNV = NULL; PFNGLMAKETEXTUREHANDLERESIDENTNVPROC __glewMakeTextureHandleResidentNV = NULL; PFNGLPROGRAMUNIFORMHANDLEUI64NVPROC __glewProgramUniformHandleui64NV = NULL; PFNGLPROGRAMUNIFORMHANDLEUI64VNVPROC __glewProgramUniformHandleui64vNV = NULL; PFNGLUNIFORMHANDLEUI64NVPROC __glewUniformHandleui64NV = NULL; PFNGLUNIFORMHANDLEUI64VNVPROC __glewUniformHandleui64vNV = NULL; PFNGLBEGINCONDITIONALRENDERNVPROC __glewBeginConditionalRenderNV = NULL; PFNGLENDCONDITIONALRENDERNVPROC __glewEndConditionalRenderNV = NULL; PFNGLCOPYIMAGESUBDATANVPROC __glewCopyImageSubDataNV = NULL; PFNGLCLEARDEPTHDNVPROC __glewClearDepthdNV = NULL; PFNGLDEPTHBOUNDSDNVPROC __glewDepthBoundsdNV = NULL; PFNGLDEPTHRANGEDNVPROC __glewDepthRangedNV = NULL; PFNGLEVALMAPSNVPROC __glewEvalMapsNV = NULL; PFNGLGETMAPATTRIBPARAMETERFVNVPROC __glewGetMapAttribParameterfvNV = NULL; PFNGLGETMAPATTRIBPARAMETERIVNVPROC __glewGetMapAttribParameterivNV = NULL; PFNGLGETMAPCONTROLPOINTSNVPROC __glewGetMapControlPointsNV = NULL; PFNGLGETMAPPARAMETERFVNVPROC __glewGetMapParameterfvNV = NULL; PFNGLGETMAPPARAMETERIVNVPROC __glewGetMapParameterivNV = NULL; PFNGLMAPCONTROLPOINTSNVPROC __glewMapControlPointsNV = NULL; PFNGLMAPPARAMETERFVNVPROC __glewMapParameterfvNV = NULL; PFNGLMAPPARAMETERIVNVPROC __glewMapParameterivNV = NULL; PFNGLGETMULTISAMPLEFVNVPROC __glewGetMultisamplefvNV = NULL; PFNGLSAMPLEMASKINDEXEDNVPROC __glewSampleMaskIndexedNV = NULL; PFNGLTEXRENDERBUFFERNVPROC __glewTexRenderbufferNV = NULL; PFNGLDELETEFENCESNVPROC __glewDeleteFencesNV = NULL; PFNGLFINISHFENCENVPROC __glewFinishFenceNV = NULL; PFNGLGENFENCESNVPROC __glewGenFencesNV = NULL; PFNGLGETFENCEIVNVPROC __glewGetFenceivNV = NULL; PFNGLISFENCENVPROC __glewIsFenceNV = NULL; PFNGLSETFENCENVPROC __glewSetFenceNV = NULL; PFNGLTESTFENCENVPROC __glewTestFenceNV = NULL; PFNGLGETPROGRAMNAMEDPARAMETERDVNVPROC __glewGetProgramNamedParameterdvNV = NULL; PFNGLGETPROGRAMNAMEDPARAMETERFVNVPROC __glewGetProgramNamedParameterfvNV = NULL; PFNGLPROGRAMNAMEDPARAMETER4DNVPROC __glewProgramNamedParameter4dNV = NULL; PFNGLPROGRAMNAMEDPARAMETER4DVNVPROC __glewProgramNamedParameter4dvNV = NULL; PFNGLPROGRAMNAMEDPARAMETER4FNVPROC __glewProgramNamedParameter4fNV = NULL; PFNGLPROGRAMNAMEDPARAMETER4FVNVPROC __glewProgramNamedParameter4fvNV = NULL; PFNGLRENDERBUFFERSTORAGEMULTISAMPLECOVERAGENVPROC __glewRenderbufferStorageMultisampleCoverageNV = NULL; PFNGLPROGRAMVERTEXLIMITNVPROC __glewProgramVertexLimitNV = NULL; PFNGLPROGRAMENVPARAMETERI4INVPROC __glewProgramEnvParameterI4iNV = NULL; PFNGLPROGRAMENVPARAMETERI4IVNVPROC __glewProgramEnvParameterI4ivNV = NULL; PFNGLPROGRAMENVPARAMETERI4UINVPROC __glewProgramEnvParameterI4uiNV = NULL; PFNGLPROGRAMENVPARAMETERI4UIVNVPROC __glewProgramEnvParameterI4uivNV = NULL; PFNGLPROGRAMENVPARAMETERSI4IVNVPROC __glewProgramEnvParametersI4ivNV = NULL; PFNGLPROGRAMENVPARAMETERSI4UIVNVPROC __glewProgramEnvParametersI4uivNV = NULL; PFNGLPROGRAMLOCALPARAMETERI4INVPROC __glewProgramLocalParameterI4iNV = NULL; PFNGLPROGRAMLOCALPARAMETERI4IVNVPROC __glewProgramLocalParameterI4ivNV = NULL; PFNGLPROGRAMLOCALPARAMETERI4UINVPROC __glewProgramLocalParameterI4uiNV = NULL; PFNGLPROGRAMLOCALPARAMETERI4UIVNVPROC __glewProgramLocalParameterI4uivNV = NULL; PFNGLPROGRAMLOCALPARAMETERSI4IVNVPROC __glewProgramLocalParametersI4ivNV = NULL; PFNGLPROGRAMLOCALPARAMETERSI4UIVNVPROC __glewProgramLocalParametersI4uivNV = NULL; PFNGLGETUNIFORMI64VNVPROC __glewGetUniformi64vNV = NULL; PFNGLGETUNIFORMUI64VNVPROC __glewGetUniformui64vNV = NULL; PFNGLPROGRAMUNIFORM1I64NVPROC __glewProgramUniform1i64NV = NULL; PFNGLPROGRAMUNIFORM1I64VNVPROC __glewProgramUniform1i64vNV = NULL; PFNGLPROGRAMUNIFORM1UI64NVPROC __glewProgramUniform1ui64NV = NULL; PFNGLPROGRAMUNIFORM1UI64VNVPROC __glewProgramUniform1ui64vNV = NULL; PFNGLPROGRAMUNIFORM2I64NVPROC __glewProgramUniform2i64NV = NULL; PFNGLPROGRAMUNIFORM2I64VNVPROC __glewProgramUniform2i64vNV = NULL; PFNGLPROGRAMUNIFORM2UI64NVPROC __glewProgramUniform2ui64NV = NULL; PFNGLPROGRAMUNIFORM2UI64VNVPROC __glewProgramUniform2ui64vNV = NULL; PFNGLPROGRAMUNIFORM3I64NVPROC __glewProgramUniform3i64NV = NULL; PFNGLPROGRAMUNIFORM3I64VNVPROC __glewProgramUniform3i64vNV = NULL; PFNGLPROGRAMUNIFORM3UI64NVPROC __glewProgramUniform3ui64NV = NULL; PFNGLPROGRAMUNIFORM3UI64VNVPROC __glewProgramUniform3ui64vNV = NULL; PFNGLPROGRAMUNIFORM4I64NVPROC __glewProgramUniform4i64NV = NULL; PFNGLPROGRAMUNIFORM4I64VNVPROC __glewProgramUniform4i64vNV = NULL; PFNGLPROGRAMUNIFORM4UI64NVPROC __glewProgramUniform4ui64NV = NULL; PFNGLPROGRAMUNIFORM4UI64VNVPROC __glewProgramUniform4ui64vNV = NULL; PFNGLUNIFORM1I64NVPROC __glewUniform1i64NV = NULL; PFNGLUNIFORM1I64VNVPROC __glewUniform1i64vNV = NULL; PFNGLUNIFORM1UI64NVPROC __glewUniform1ui64NV = NULL; PFNGLUNIFORM1UI64VNVPROC __glewUniform1ui64vNV = NULL; PFNGLUNIFORM2I64NVPROC __glewUniform2i64NV = NULL; PFNGLUNIFORM2I64VNVPROC __glewUniform2i64vNV = NULL; PFNGLUNIFORM2UI64NVPROC __glewUniform2ui64NV = NULL; PFNGLUNIFORM2UI64VNVPROC __glewUniform2ui64vNV = NULL; PFNGLUNIFORM3I64NVPROC __glewUniform3i64NV = NULL; PFNGLUNIFORM3I64VNVPROC __glewUniform3i64vNV = NULL; PFNGLUNIFORM3UI64NVPROC __glewUniform3ui64NV = NULL; PFNGLUNIFORM3UI64VNVPROC __glewUniform3ui64vNV = NULL; PFNGLUNIFORM4I64NVPROC __glewUniform4i64NV = NULL; PFNGLUNIFORM4I64VNVPROC __glewUniform4i64vNV = NULL; PFNGLUNIFORM4UI64NVPROC __glewUniform4ui64NV = NULL; PFNGLUNIFORM4UI64VNVPROC __glewUniform4ui64vNV = NULL; PFNGLCOLOR3HNVPROC __glewColor3hNV = NULL; PFNGLCOLOR3HVNVPROC __glewColor3hvNV = NULL; PFNGLCOLOR4HNVPROC __glewColor4hNV = NULL; PFNGLCOLOR4HVNVPROC __glewColor4hvNV = NULL; PFNGLFOGCOORDHNVPROC __glewFogCoordhNV = NULL; PFNGLFOGCOORDHVNVPROC __glewFogCoordhvNV = NULL; PFNGLMULTITEXCOORD1HNVPROC __glewMultiTexCoord1hNV = NULL; PFNGLMULTITEXCOORD1HVNVPROC __glewMultiTexCoord1hvNV = NULL; PFNGLMULTITEXCOORD2HNVPROC __glewMultiTexCoord2hNV = NULL; PFNGLMULTITEXCOORD2HVNVPROC __glewMultiTexCoord2hvNV = NULL; PFNGLMULTITEXCOORD3HNVPROC __glewMultiTexCoord3hNV = NULL; PFNGLMULTITEXCOORD3HVNVPROC __glewMultiTexCoord3hvNV = NULL; PFNGLMULTITEXCOORD4HNVPROC __glewMultiTexCoord4hNV = NULL; PFNGLMULTITEXCOORD4HVNVPROC __glewMultiTexCoord4hvNV = NULL; PFNGLNORMAL3HNVPROC __glewNormal3hNV = NULL; PFNGLNORMAL3HVNVPROC __glewNormal3hvNV = NULL; PFNGLSECONDARYCOLOR3HNVPROC __glewSecondaryColor3hNV = NULL; PFNGLSECONDARYCOLOR3HVNVPROC __glewSecondaryColor3hvNV = NULL; PFNGLTEXCOORD1HNVPROC __glewTexCoord1hNV = NULL; PFNGLTEXCOORD1HVNVPROC __glewTexCoord1hvNV = NULL; PFNGLTEXCOORD2HNVPROC __glewTexCoord2hNV = NULL; PFNGLTEXCOORD2HVNVPROC __glewTexCoord2hvNV = NULL; PFNGLTEXCOORD3HNVPROC __glewTexCoord3hNV = NULL; PFNGLTEXCOORD3HVNVPROC __glewTexCoord3hvNV = NULL; PFNGLTEXCOORD4HNVPROC __glewTexCoord4hNV = NULL; PFNGLTEXCOORD4HVNVPROC __glewTexCoord4hvNV = NULL; PFNGLVERTEX2HNVPROC __glewVertex2hNV = NULL; PFNGLVERTEX2HVNVPROC __glewVertex2hvNV = NULL; PFNGLVERTEX3HNVPROC __glewVertex3hNV = NULL; PFNGLVERTEX3HVNVPROC __glewVertex3hvNV = NULL; PFNGLVERTEX4HNVPROC __glewVertex4hNV = NULL; PFNGLVERTEX4HVNVPROC __glewVertex4hvNV = NULL; PFNGLVERTEXATTRIB1HNVPROC __glewVertexAttrib1hNV = NULL; PFNGLVERTEXATTRIB1HVNVPROC __glewVertexAttrib1hvNV = NULL; PFNGLVERTEXATTRIB2HNVPROC __glewVertexAttrib2hNV = NULL; PFNGLVERTEXATTRIB2HVNVPROC __glewVertexAttrib2hvNV = NULL; PFNGLVERTEXATTRIB3HNVPROC __glewVertexAttrib3hNV = NULL; PFNGLVERTEXATTRIB3HVNVPROC __glewVertexAttrib3hvNV = NULL; PFNGLVERTEXATTRIB4HNVPROC __glewVertexAttrib4hNV = NULL; PFNGLVERTEXATTRIB4HVNVPROC __glewVertexAttrib4hvNV = NULL; PFNGLVERTEXATTRIBS1HVNVPROC __glewVertexAttribs1hvNV = NULL; PFNGLVERTEXATTRIBS2HVNVPROC __glewVertexAttribs2hvNV = NULL; PFNGLVERTEXATTRIBS3HVNVPROC __glewVertexAttribs3hvNV = NULL; PFNGLVERTEXATTRIBS4HVNVPROC __glewVertexAttribs4hvNV = NULL; PFNGLVERTEXWEIGHTHNVPROC __glewVertexWeighthNV = NULL; PFNGLVERTEXWEIGHTHVNVPROC __glewVertexWeighthvNV = NULL; PFNGLBEGINOCCLUSIONQUERYNVPROC __glewBeginOcclusionQueryNV = NULL; PFNGLDELETEOCCLUSIONQUERIESNVPROC __glewDeleteOcclusionQueriesNV = NULL; PFNGLENDOCCLUSIONQUERYNVPROC __glewEndOcclusionQueryNV = NULL; PFNGLGENOCCLUSIONQUERIESNVPROC __glewGenOcclusionQueriesNV = NULL; PFNGLGETOCCLUSIONQUERYIVNVPROC __glewGetOcclusionQueryivNV = NULL; PFNGLGETOCCLUSIONQUERYUIVNVPROC __glewGetOcclusionQueryuivNV = NULL; PFNGLISOCCLUSIONQUERYNVPROC __glewIsOcclusionQueryNV = NULL; PFNGLPROGRAMBUFFERPARAMETERSIIVNVPROC __glewProgramBufferParametersIivNV = NULL; PFNGLPROGRAMBUFFERPARAMETERSIUIVNVPROC __glewProgramBufferParametersIuivNV = NULL; PFNGLPROGRAMBUFFERPARAMETERSFVNVPROC __glewProgramBufferParametersfvNV = NULL; PFNGLCOPYPATHNVPROC __glewCopyPathNV = NULL; PFNGLCOVERFILLPATHINSTANCEDNVPROC __glewCoverFillPathInstancedNV = NULL; PFNGLCOVERFILLPATHNVPROC __glewCoverFillPathNV = NULL; PFNGLCOVERSTROKEPATHINSTANCEDNVPROC __glewCoverStrokePathInstancedNV = NULL; PFNGLCOVERSTROKEPATHNVPROC __glewCoverStrokePathNV = NULL; PFNGLDELETEPATHSNVPROC __glewDeletePathsNV = NULL; PFNGLGENPATHSNVPROC __glewGenPathsNV = NULL; PFNGLGETPATHCOLORGENFVNVPROC __glewGetPathColorGenfvNV = NULL; PFNGLGETPATHCOLORGENIVNVPROC __glewGetPathColorGenivNV = NULL; PFNGLGETPATHCOMMANDSNVPROC __glewGetPathCommandsNV = NULL; PFNGLGETPATHCOORDSNVPROC __glewGetPathCoordsNV = NULL; PFNGLGETPATHDASHARRAYNVPROC __glewGetPathDashArrayNV = NULL; PFNGLGETPATHLENGTHNVPROC __glewGetPathLengthNV = NULL; PFNGLGETPATHMETRICRANGENVPROC __glewGetPathMetricRangeNV = NULL; PFNGLGETPATHMETRICSNVPROC __glewGetPathMetricsNV = NULL; PFNGLGETPATHPARAMETERFVNVPROC __glewGetPathParameterfvNV = NULL; PFNGLGETPATHPARAMETERIVNVPROC __glewGetPathParameterivNV = NULL; PFNGLGETPATHSPACINGNVPROC __glewGetPathSpacingNV = NULL; PFNGLGETPATHTEXGENFVNVPROC __glewGetPathTexGenfvNV = NULL; PFNGLGETPATHTEXGENIVNVPROC __glewGetPathTexGenivNV = NULL; PFNGLINTERPOLATEPATHSNVPROC __glewInterpolatePathsNV = NULL; PFNGLISPATHNVPROC __glewIsPathNV = NULL; PFNGLISPOINTINFILLPATHNVPROC __glewIsPointInFillPathNV = NULL; PFNGLISPOINTINSTROKEPATHNVPROC __glewIsPointInStrokePathNV = NULL; PFNGLPATHCOLORGENNVPROC __glewPathColorGenNV = NULL; PFNGLPATHCOMMANDSNVPROC __glewPathCommandsNV = NULL; PFNGLPATHCOORDSNVPROC __glewPathCoordsNV = NULL; PFNGLPATHCOVERDEPTHFUNCNVPROC __glewPathCoverDepthFuncNV = NULL; PFNGLPATHDASHARRAYNVPROC __glewPathDashArrayNV = NULL; PFNGLPATHFOGGENNVPROC __glewPathFogGenNV = NULL; PFNGLPATHGLYPHRANGENVPROC __glewPathGlyphRangeNV = NULL; PFNGLPATHGLYPHSNVPROC __glewPathGlyphsNV = NULL; PFNGLPATHPARAMETERFNVPROC __glewPathParameterfNV = NULL; PFNGLPATHPARAMETERFVNVPROC __glewPathParameterfvNV = NULL; PFNGLPATHPARAMETERINVPROC __glewPathParameteriNV = NULL; PFNGLPATHPARAMETERIVNVPROC __glewPathParameterivNV = NULL; PFNGLPATHSTENCILDEPTHOFFSETNVPROC __glewPathStencilDepthOffsetNV = NULL; PFNGLPATHSTENCILFUNCNVPROC __glewPathStencilFuncNV = NULL; PFNGLPATHSTRINGNVPROC __glewPathStringNV = NULL; PFNGLPATHSUBCOMMANDSNVPROC __glewPathSubCommandsNV = NULL; PFNGLPATHSUBCOORDSNVPROC __glewPathSubCoordsNV = NULL; PFNGLPATHTEXGENNVPROC __glewPathTexGenNV = NULL; PFNGLPOINTALONGPATHNVPROC __glewPointAlongPathNV = NULL; PFNGLSTENCILFILLPATHINSTANCEDNVPROC __glewStencilFillPathInstancedNV = NULL; PFNGLSTENCILFILLPATHNVPROC __glewStencilFillPathNV = NULL; PFNGLSTENCILSTROKEPATHINSTANCEDNVPROC __glewStencilStrokePathInstancedNV = NULL; PFNGLSTENCILSTROKEPATHNVPROC __glewStencilStrokePathNV = NULL; PFNGLTRANSFORMPATHNVPROC __glewTransformPathNV = NULL; PFNGLWEIGHTPATHSNVPROC __glewWeightPathsNV = NULL; PFNGLFLUSHPIXELDATARANGENVPROC __glewFlushPixelDataRangeNV = NULL; PFNGLPIXELDATARANGENVPROC __glewPixelDataRangeNV = NULL; PFNGLPOINTPARAMETERINVPROC __glewPointParameteriNV = NULL; PFNGLPOINTPARAMETERIVNVPROC __glewPointParameterivNV = NULL; PFNGLGETVIDEOI64VNVPROC __glewGetVideoi64vNV = NULL; PFNGLGETVIDEOIVNVPROC __glewGetVideoivNV = NULL; PFNGLGETVIDEOUI64VNVPROC __glewGetVideoui64vNV = NULL; PFNGLGETVIDEOUIVNVPROC __glewGetVideouivNV = NULL; PFNGLPRESENTFRAMEDUALFILLNVPROC __glewPresentFrameDualFillNV = NULL; PFNGLPRESENTFRAMEKEYEDNVPROC __glewPresentFrameKeyedNV = NULL; PFNGLPRIMITIVERESTARTINDEXNVPROC __glewPrimitiveRestartIndexNV = NULL; PFNGLPRIMITIVERESTARTNVPROC __glewPrimitiveRestartNV = NULL; PFNGLCOMBINERINPUTNVPROC __glewCombinerInputNV = NULL; PFNGLCOMBINEROUTPUTNVPROC __glewCombinerOutputNV = NULL; PFNGLCOMBINERPARAMETERFNVPROC __glewCombinerParameterfNV = NULL; PFNGLCOMBINERPARAMETERFVNVPROC __glewCombinerParameterfvNV = NULL; PFNGLCOMBINERPARAMETERINVPROC __glewCombinerParameteriNV = NULL; PFNGLCOMBINERPARAMETERIVNVPROC __glewCombinerParameterivNV = NULL; PFNGLFINALCOMBINERINPUTNVPROC __glewFinalCombinerInputNV = NULL; PFNGLGETCOMBINERINPUTPARAMETERFVNVPROC __glewGetCombinerInputParameterfvNV = NULL; PFNGLGETCOMBINERINPUTPARAMETERIVNVPROC __glewGetCombinerInputParameterivNV = NULL; PFNGLGETCOMBINEROUTPUTPARAMETERFVNVPROC __glewGetCombinerOutputParameterfvNV = NULL; PFNGLGETCOMBINEROUTPUTPARAMETERIVNVPROC __glewGetCombinerOutputParameterivNV = NULL; PFNGLGETFINALCOMBINERINPUTPARAMETERFVNVPROC __glewGetFinalCombinerInputParameterfvNV = NULL; PFNGLGETFINALCOMBINERINPUTPARAMETERIVNVPROC __glewGetFinalCombinerInputParameterivNV = NULL; PFNGLCOMBINERSTAGEPARAMETERFVNVPROC __glewCombinerStageParameterfvNV = NULL; PFNGLGETCOMBINERSTAGEPARAMETERFVNVPROC __glewGetCombinerStageParameterfvNV = NULL; PFNGLGETBUFFERPARAMETERUI64VNVPROC __glewGetBufferParameterui64vNV = NULL; PFNGLGETINTEGERUI64VNVPROC __glewGetIntegerui64vNV = NULL; PFNGLGETNAMEDBUFFERPARAMETERUI64VNVPROC __glewGetNamedBufferParameterui64vNV = NULL; PFNGLISBUFFERRESIDENTNVPROC __glewIsBufferResidentNV = NULL; PFNGLISNAMEDBUFFERRESIDENTNVPROC __glewIsNamedBufferResidentNV = NULL; PFNGLMAKEBUFFERNONRESIDENTNVPROC __glewMakeBufferNonResidentNV = NULL; PFNGLMAKEBUFFERRESIDENTNVPROC __glewMakeBufferResidentNV = NULL; PFNGLMAKENAMEDBUFFERNONRESIDENTNVPROC __glewMakeNamedBufferNonResidentNV = NULL; PFNGLMAKENAMEDBUFFERRESIDENTNVPROC __glewMakeNamedBufferResidentNV = NULL; PFNGLPROGRAMUNIFORMUI64NVPROC __glewProgramUniformui64NV = NULL; PFNGLPROGRAMUNIFORMUI64VNVPROC __glewProgramUniformui64vNV = NULL; PFNGLUNIFORMUI64NVPROC __glewUniformui64NV = NULL; PFNGLUNIFORMUI64VNVPROC __glewUniformui64vNV = NULL; PFNGLTEXTUREBARRIERNVPROC __glewTextureBarrierNV = NULL; PFNGLTEXIMAGE2DMULTISAMPLECOVERAGENVPROC __glewTexImage2DMultisampleCoverageNV = NULL; PFNGLTEXIMAGE3DMULTISAMPLECOVERAGENVPROC __glewTexImage3DMultisampleCoverageNV = NULL; PFNGLTEXTUREIMAGE2DMULTISAMPLECOVERAGENVPROC __glewTextureImage2DMultisampleCoverageNV = NULL; PFNGLTEXTUREIMAGE2DMULTISAMPLENVPROC __glewTextureImage2DMultisampleNV = NULL; PFNGLTEXTUREIMAGE3DMULTISAMPLECOVERAGENVPROC __glewTextureImage3DMultisampleCoverageNV = NULL; PFNGLTEXTUREIMAGE3DMULTISAMPLENVPROC __glewTextureImage3DMultisampleNV = NULL; PFNGLACTIVEVARYINGNVPROC __glewActiveVaryingNV = NULL; PFNGLBEGINTRANSFORMFEEDBACKNVPROC __glewBeginTransformFeedbackNV = NULL; PFNGLBINDBUFFERBASENVPROC __glewBindBufferBaseNV = NULL; PFNGLBINDBUFFEROFFSETNVPROC __glewBindBufferOffsetNV = NULL; PFNGLBINDBUFFERRANGENVPROC __glewBindBufferRangeNV = NULL; PFNGLENDTRANSFORMFEEDBACKNVPROC __glewEndTransformFeedbackNV = NULL; PFNGLGETACTIVEVARYINGNVPROC __glewGetActiveVaryingNV = NULL; PFNGLGETTRANSFORMFEEDBACKVARYINGNVPROC __glewGetTransformFeedbackVaryingNV = NULL; PFNGLGETVARYINGLOCATIONNVPROC __glewGetVaryingLocationNV = NULL; PFNGLTRANSFORMFEEDBACKATTRIBSNVPROC __glewTransformFeedbackAttribsNV = NULL; PFNGLTRANSFORMFEEDBACKVARYINGSNVPROC __glewTransformFeedbackVaryingsNV = NULL; PFNGLBINDTRANSFORMFEEDBACKNVPROC __glewBindTransformFeedbackNV = NULL; PFNGLDELETETRANSFORMFEEDBACKSNVPROC __glewDeleteTransformFeedbacksNV = NULL; PFNGLDRAWTRANSFORMFEEDBACKNVPROC __glewDrawTransformFeedbackNV = NULL; PFNGLGENTRANSFORMFEEDBACKSNVPROC __glewGenTransformFeedbacksNV = NULL; PFNGLISTRANSFORMFEEDBACKNVPROC __glewIsTransformFeedbackNV = NULL; PFNGLPAUSETRANSFORMFEEDBACKNVPROC __glewPauseTransformFeedbackNV = NULL; PFNGLRESUMETRANSFORMFEEDBACKNVPROC __glewResumeTransformFeedbackNV = NULL; PFNGLVDPAUFININVPROC __glewVDPAUFiniNV = NULL; PFNGLVDPAUGETSURFACEIVNVPROC __glewVDPAUGetSurfaceivNV = NULL; PFNGLVDPAUINITNVPROC __glewVDPAUInitNV = NULL; PFNGLVDPAUISSURFACENVPROC __glewVDPAUIsSurfaceNV = NULL; PFNGLVDPAUMAPSURFACESNVPROC __glewVDPAUMapSurfacesNV = NULL; PFNGLVDPAUREGISTEROUTPUTSURFACENVPROC __glewVDPAURegisterOutputSurfaceNV = NULL; PFNGLVDPAUREGISTERVIDEOSURFACENVPROC __glewVDPAURegisterVideoSurfaceNV = NULL; PFNGLVDPAUSURFACEACCESSNVPROC __glewVDPAUSurfaceAccessNV = NULL; PFNGLVDPAUUNMAPSURFACESNVPROC __glewVDPAUUnmapSurfacesNV = NULL; PFNGLVDPAUUNREGISTERSURFACENVPROC __glewVDPAUUnregisterSurfaceNV = NULL; PFNGLFLUSHVERTEXARRAYRANGENVPROC __glewFlushVertexArrayRangeNV = NULL; PFNGLVERTEXARRAYRANGENVPROC __glewVertexArrayRangeNV = NULL; PFNGLGETVERTEXATTRIBLI64VNVPROC __glewGetVertexAttribLi64vNV = NULL; PFNGLGETVERTEXATTRIBLUI64VNVPROC __glewGetVertexAttribLui64vNV = NULL; PFNGLVERTEXATTRIBL1I64NVPROC __glewVertexAttribL1i64NV = NULL; PFNGLVERTEXATTRIBL1I64VNVPROC __glewVertexAttribL1i64vNV = NULL; PFNGLVERTEXATTRIBL1UI64NVPROC __glewVertexAttribL1ui64NV = NULL; PFNGLVERTEXATTRIBL1UI64VNVPROC __glewVertexAttribL1ui64vNV = NULL; PFNGLVERTEXATTRIBL2I64NVPROC __glewVertexAttribL2i64NV = NULL; PFNGLVERTEXATTRIBL2I64VNVPROC __glewVertexAttribL2i64vNV = NULL; PFNGLVERTEXATTRIBL2UI64NVPROC __glewVertexAttribL2ui64NV = NULL; PFNGLVERTEXATTRIBL2UI64VNVPROC __glewVertexAttribL2ui64vNV = NULL; PFNGLVERTEXATTRIBL3I64NVPROC __glewVertexAttribL3i64NV = NULL; PFNGLVERTEXATTRIBL3I64VNVPROC __glewVertexAttribL3i64vNV = NULL; PFNGLVERTEXATTRIBL3UI64NVPROC __glewVertexAttribL3ui64NV = NULL; PFNGLVERTEXATTRIBL3UI64VNVPROC __glewVertexAttribL3ui64vNV = NULL; PFNGLVERTEXATTRIBL4I64NVPROC __glewVertexAttribL4i64NV = NULL; PFNGLVERTEXATTRIBL4I64VNVPROC __glewVertexAttribL4i64vNV = NULL; PFNGLVERTEXATTRIBL4UI64NVPROC __glewVertexAttribL4ui64NV = NULL; PFNGLVERTEXATTRIBL4UI64VNVPROC __glewVertexAttribL4ui64vNV = NULL; PFNGLVERTEXATTRIBLFORMATNVPROC __glewVertexAttribLFormatNV = NULL; PFNGLBUFFERADDRESSRANGENVPROC __glewBufferAddressRangeNV = NULL; PFNGLCOLORFORMATNVPROC __glewColorFormatNV = NULL; PFNGLEDGEFLAGFORMATNVPROC __glewEdgeFlagFormatNV = NULL; PFNGLFOGCOORDFORMATNVPROC __glewFogCoordFormatNV = NULL; PFNGLGETINTEGERUI64I_VNVPROC __glewGetIntegerui64i_vNV = NULL; PFNGLINDEXFORMATNVPROC __glewIndexFormatNV = NULL; PFNGLNORMALFORMATNVPROC __glewNormalFormatNV = NULL; PFNGLSECONDARYCOLORFORMATNVPROC __glewSecondaryColorFormatNV = NULL; PFNGLTEXCOORDFORMATNVPROC __glewTexCoordFormatNV = NULL; PFNGLVERTEXATTRIBFORMATNVPROC __glewVertexAttribFormatNV = NULL; PFNGLVERTEXATTRIBIFORMATNVPROC __glewVertexAttribIFormatNV = NULL; PFNGLVERTEXFORMATNVPROC __glewVertexFormatNV = NULL; PFNGLAREPROGRAMSRESIDENTNVPROC __glewAreProgramsResidentNV = NULL; PFNGLBINDPROGRAMNVPROC __glewBindProgramNV = NULL; PFNGLDELETEPROGRAMSNVPROC __glewDeleteProgramsNV = NULL; PFNGLEXECUTEPROGRAMNVPROC __glewExecuteProgramNV = NULL; PFNGLGENPROGRAMSNVPROC __glewGenProgramsNV = NULL; PFNGLGETPROGRAMPARAMETERDVNVPROC __glewGetProgramParameterdvNV = NULL; PFNGLGETPROGRAMPARAMETERFVNVPROC __glewGetProgramParameterfvNV = NULL; PFNGLGETPROGRAMSTRINGNVPROC __glewGetProgramStringNV = NULL; PFNGLGETPROGRAMIVNVPROC __glewGetProgramivNV = NULL; PFNGLGETTRACKMATRIXIVNVPROC __glewGetTrackMatrixivNV = NULL; PFNGLGETVERTEXATTRIBPOINTERVNVPROC __glewGetVertexAttribPointervNV = NULL; PFNGLGETVERTEXATTRIBDVNVPROC __glewGetVertexAttribdvNV = NULL; PFNGLGETVERTEXATTRIBFVNVPROC __glewGetVertexAttribfvNV = NULL; PFNGLGETVERTEXATTRIBIVNVPROC __glewGetVertexAttribivNV = NULL; PFNGLISPROGRAMNVPROC __glewIsProgramNV = NULL; PFNGLLOADPROGRAMNVPROC __glewLoadProgramNV = NULL; PFNGLPROGRAMPARAMETER4DNVPROC __glewProgramParameter4dNV = NULL; PFNGLPROGRAMPARAMETER4DVNVPROC __glewProgramParameter4dvNV = NULL; PFNGLPROGRAMPARAMETER4FNVPROC __glewProgramParameter4fNV = NULL; PFNGLPROGRAMPARAMETER4FVNVPROC __glewProgramParameter4fvNV = NULL; PFNGLPROGRAMPARAMETERS4DVNVPROC __glewProgramParameters4dvNV = NULL; PFNGLPROGRAMPARAMETERS4FVNVPROC __glewProgramParameters4fvNV = NULL; PFNGLREQUESTRESIDENTPROGRAMSNVPROC __glewRequestResidentProgramsNV = NULL; PFNGLTRACKMATRIXNVPROC __glewTrackMatrixNV = NULL; PFNGLVERTEXATTRIB1DNVPROC __glewVertexAttrib1dNV = NULL; PFNGLVERTEXATTRIB1DVNVPROC __glewVertexAttrib1dvNV = NULL; PFNGLVERTEXATTRIB1FNVPROC __glewVertexAttrib1fNV = NULL; PFNGLVERTEXATTRIB1FVNVPROC __glewVertexAttrib1fvNV = NULL; PFNGLVERTEXATTRIB1SNVPROC __glewVertexAttrib1sNV = NULL; PFNGLVERTEXATTRIB1SVNVPROC __glewVertexAttrib1svNV = NULL; PFNGLVERTEXATTRIB2DNVPROC __glewVertexAttrib2dNV = NULL; PFNGLVERTEXATTRIB2DVNVPROC __glewVertexAttrib2dvNV = NULL; PFNGLVERTEXATTRIB2FNVPROC __glewVertexAttrib2fNV = NULL; PFNGLVERTEXATTRIB2FVNVPROC __glewVertexAttrib2fvNV = NULL; PFNGLVERTEXATTRIB2SNVPROC __glewVertexAttrib2sNV = NULL; PFNGLVERTEXATTRIB2SVNVPROC __glewVertexAttrib2svNV = NULL; PFNGLVERTEXATTRIB3DNVPROC __glewVertexAttrib3dNV = NULL; PFNGLVERTEXATTRIB3DVNVPROC __glewVertexAttrib3dvNV = NULL; PFNGLVERTEXATTRIB3FNVPROC __glewVertexAttrib3fNV = NULL; PFNGLVERTEXATTRIB3FVNVPROC __glewVertexAttrib3fvNV = NULL; PFNGLVERTEXATTRIB3SNVPROC __glewVertexAttrib3sNV = NULL; PFNGLVERTEXATTRIB3SVNVPROC __glewVertexAttrib3svNV = NULL; PFNGLVERTEXATTRIB4DNVPROC __glewVertexAttrib4dNV = NULL; PFNGLVERTEXATTRIB4DVNVPROC __glewVertexAttrib4dvNV = NULL; PFNGLVERTEXATTRIB4FNVPROC __glewVertexAttrib4fNV = NULL; PFNGLVERTEXATTRIB4FVNVPROC __glewVertexAttrib4fvNV = NULL; PFNGLVERTEXATTRIB4SNVPROC __glewVertexAttrib4sNV = NULL; PFNGLVERTEXATTRIB4SVNVPROC __glewVertexAttrib4svNV = NULL; PFNGLVERTEXATTRIB4UBNVPROC __glewVertexAttrib4ubNV = NULL; PFNGLVERTEXATTRIB4UBVNVPROC __glewVertexAttrib4ubvNV = NULL; PFNGLVERTEXATTRIBPOINTERNVPROC __glewVertexAttribPointerNV = NULL; PFNGLVERTEXATTRIBS1DVNVPROC __glewVertexAttribs1dvNV = NULL; PFNGLVERTEXATTRIBS1FVNVPROC __glewVertexAttribs1fvNV = NULL; PFNGLVERTEXATTRIBS1SVNVPROC __glewVertexAttribs1svNV = NULL; PFNGLVERTEXATTRIBS2DVNVPROC __glewVertexAttribs2dvNV = NULL; PFNGLVERTEXATTRIBS2FVNVPROC __glewVertexAttribs2fvNV = NULL; PFNGLVERTEXATTRIBS2SVNVPROC __glewVertexAttribs2svNV = NULL; PFNGLVERTEXATTRIBS3DVNVPROC __glewVertexAttribs3dvNV = NULL; PFNGLVERTEXATTRIBS3FVNVPROC __glewVertexAttribs3fvNV = NULL; PFNGLVERTEXATTRIBS3SVNVPROC __glewVertexAttribs3svNV = NULL; PFNGLVERTEXATTRIBS4DVNVPROC __glewVertexAttribs4dvNV = NULL; PFNGLVERTEXATTRIBS4FVNVPROC __glewVertexAttribs4fvNV = NULL; PFNGLVERTEXATTRIBS4SVNVPROC __glewVertexAttribs4svNV = NULL; PFNGLVERTEXATTRIBS4UBVNVPROC __glewVertexAttribs4ubvNV = NULL; PFNGLBEGINVIDEOCAPTURENVPROC __glewBeginVideoCaptureNV = NULL; PFNGLBINDVIDEOCAPTURESTREAMBUFFERNVPROC __glewBindVideoCaptureStreamBufferNV = NULL; PFNGLBINDVIDEOCAPTURESTREAMTEXTURENVPROC __glewBindVideoCaptureStreamTextureNV = NULL; PFNGLENDVIDEOCAPTURENVPROC __glewEndVideoCaptureNV = NULL; PFNGLGETVIDEOCAPTURESTREAMDVNVPROC __glewGetVideoCaptureStreamdvNV = NULL; PFNGLGETVIDEOCAPTURESTREAMFVNVPROC __glewGetVideoCaptureStreamfvNV = NULL; PFNGLGETVIDEOCAPTURESTREAMIVNVPROC __glewGetVideoCaptureStreamivNV = NULL; PFNGLGETVIDEOCAPTUREIVNVPROC __glewGetVideoCaptureivNV = NULL; PFNGLVIDEOCAPTURENVPROC __glewVideoCaptureNV = NULL; PFNGLVIDEOCAPTURESTREAMPARAMETERDVNVPROC __glewVideoCaptureStreamParameterdvNV = NULL; PFNGLVIDEOCAPTURESTREAMPARAMETERFVNVPROC __glewVideoCaptureStreamParameterfvNV = NULL; PFNGLVIDEOCAPTURESTREAMPARAMETERIVNVPROC __glewVideoCaptureStreamParameterivNV = NULL; PFNGLCLEARDEPTHFOESPROC __glewClearDepthfOES = NULL; PFNGLCLIPPLANEFOESPROC __glewClipPlanefOES = NULL; PFNGLDEPTHRANGEFOESPROC __glewDepthRangefOES = NULL; PFNGLFRUSTUMFOESPROC __glewFrustumfOES = NULL; PFNGLGETCLIPPLANEFOESPROC __glewGetClipPlanefOES = NULL; PFNGLORTHOFOESPROC __glewOrthofOES = NULL; PFNGLERRORSTRINGREGALPROC __glewErrorStringREGAL = NULL; PFNGLGETEXTENSIONREGALPROC __glewGetExtensionREGAL = NULL; PFNGLISSUPPORTEDREGALPROC __glewIsSupportedREGAL = NULL; PFNGLDETAILTEXFUNCSGISPROC __glewDetailTexFuncSGIS = NULL; PFNGLGETDETAILTEXFUNCSGISPROC __glewGetDetailTexFuncSGIS = NULL; PFNGLFOGFUNCSGISPROC __glewFogFuncSGIS = NULL; PFNGLGETFOGFUNCSGISPROC __glewGetFogFuncSGIS = NULL; PFNGLSAMPLEMASKSGISPROC __glewSampleMaskSGIS = NULL; PFNGLSAMPLEPATTERNSGISPROC __glewSamplePatternSGIS = NULL; PFNGLGETSHARPENTEXFUNCSGISPROC __glewGetSharpenTexFuncSGIS = NULL; PFNGLSHARPENTEXFUNCSGISPROC __glewSharpenTexFuncSGIS = NULL; PFNGLTEXIMAGE4DSGISPROC __glewTexImage4DSGIS = NULL; PFNGLTEXSUBIMAGE4DSGISPROC __glewTexSubImage4DSGIS = NULL; PFNGLGETTEXFILTERFUNCSGISPROC __glewGetTexFilterFuncSGIS = NULL; PFNGLTEXFILTERFUNCSGISPROC __glewTexFilterFuncSGIS = NULL; PFNGLASYNCMARKERSGIXPROC __glewAsyncMarkerSGIX = NULL; PFNGLDELETEASYNCMARKERSSGIXPROC __glewDeleteAsyncMarkersSGIX = NULL; PFNGLFINISHASYNCSGIXPROC __glewFinishAsyncSGIX = NULL; PFNGLGENASYNCMARKERSSGIXPROC __glewGenAsyncMarkersSGIX = NULL; PFNGLISASYNCMARKERSGIXPROC __glewIsAsyncMarkerSGIX = NULL; PFNGLPOLLASYNCSGIXPROC __glewPollAsyncSGIX = NULL; PFNGLFLUSHRASTERSGIXPROC __glewFlushRasterSGIX = NULL; PFNGLTEXTUREFOGSGIXPROC __glewTextureFogSGIX = NULL; PFNGLFRAGMENTCOLORMATERIALSGIXPROC __glewFragmentColorMaterialSGIX = NULL; PFNGLFRAGMENTLIGHTMODELFSGIXPROC __glewFragmentLightModelfSGIX = NULL; PFNGLFRAGMENTLIGHTMODELFVSGIXPROC __glewFragmentLightModelfvSGIX = NULL; PFNGLFRAGMENTLIGHTMODELISGIXPROC __glewFragmentLightModeliSGIX = NULL; PFNGLFRAGMENTLIGHTMODELIVSGIXPROC __glewFragmentLightModelivSGIX = NULL; PFNGLFRAGMENTLIGHTFSGIXPROC __glewFragmentLightfSGIX = NULL; PFNGLFRAGMENTLIGHTFVSGIXPROC __glewFragmentLightfvSGIX = NULL; PFNGLFRAGMENTLIGHTISGIXPROC __glewFragmentLightiSGIX = NULL; PFNGLFRAGMENTLIGHTIVSGIXPROC __glewFragmentLightivSGIX = NULL; PFNGLFRAGMENTMATERIALFSGIXPROC __glewFragmentMaterialfSGIX = NULL; PFNGLFRAGMENTMATERIALFVSGIXPROC __glewFragmentMaterialfvSGIX = NULL; PFNGLFRAGMENTMATERIALISGIXPROC __glewFragmentMaterialiSGIX = NULL; PFNGLFRAGMENTMATERIALIVSGIXPROC __glewFragmentMaterialivSGIX = NULL; PFNGLGETFRAGMENTLIGHTFVSGIXPROC __glewGetFragmentLightfvSGIX = NULL; PFNGLGETFRAGMENTLIGHTIVSGIXPROC __glewGetFragmentLightivSGIX = NULL; PFNGLGETFRAGMENTMATERIALFVSGIXPROC __glewGetFragmentMaterialfvSGIX = NULL; PFNGLGETFRAGMENTMATERIALIVSGIXPROC __glewGetFragmentMaterialivSGIX = NULL; PFNGLFRAMEZOOMSGIXPROC __glewFrameZoomSGIX = NULL; PFNGLPIXELTEXGENSGIXPROC __glewPixelTexGenSGIX = NULL; PFNGLREFERENCEPLANESGIXPROC __glewReferencePlaneSGIX = NULL; PFNGLSPRITEPARAMETERFSGIXPROC __glewSpriteParameterfSGIX = NULL; PFNGLSPRITEPARAMETERFVSGIXPROC __glewSpriteParameterfvSGIX = NULL; PFNGLSPRITEPARAMETERISGIXPROC __glewSpriteParameteriSGIX = NULL; PFNGLSPRITEPARAMETERIVSGIXPROC __glewSpriteParameterivSGIX = NULL; PFNGLTAGSAMPLEBUFFERSGIXPROC __glewTagSampleBufferSGIX = NULL; PFNGLCOLORTABLEPARAMETERFVSGIPROC __glewColorTableParameterfvSGI = NULL; PFNGLCOLORTABLEPARAMETERIVSGIPROC __glewColorTableParameterivSGI = NULL; PFNGLCOLORTABLESGIPROC __glewColorTableSGI = NULL; PFNGLCOPYCOLORTABLESGIPROC __glewCopyColorTableSGI = NULL; PFNGLGETCOLORTABLEPARAMETERFVSGIPROC __glewGetColorTableParameterfvSGI = NULL; PFNGLGETCOLORTABLEPARAMETERIVSGIPROC __glewGetColorTableParameterivSGI = NULL; PFNGLGETCOLORTABLESGIPROC __glewGetColorTableSGI = NULL; PFNGLFINISHTEXTURESUNXPROC __glewFinishTextureSUNX = NULL; PFNGLGLOBALALPHAFACTORBSUNPROC __glewGlobalAlphaFactorbSUN = NULL; PFNGLGLOBALALPHAFACTORDSUNPROC __glewGlobalAlphaFactordSUN = NULL; PFNGLGLOBALALPHAFACTORFSUNPROC __glewGlobalAlphaFactorfSUN = NULL; PFNGLGLOBALALPHAFACTORISUNPROC __glewGlobalAlphaFactoriSUN = NULL; PFNGLGLOBALALPHAFACTORSSUNPROC __glewGlobalAlphaFactorsSUN = NULL; PFNGLGLOBALALPHAFACTORUBSUNPROC __glewGlobalAlphaFactorubSUN = NULL; PFNGLGLOBALALPHAFACTORUISUNPROC __glewGlobalAlphaFactoruiSUN = NULL; PFNGLGLOBALALPHAFACTORUSSUNPROC __glewGlobalAlphaFactorusSUN = NULL; PFNGLREADVIDEOPIXELSSUNPROC __glewReadVideoPixelsSUN = NULL; PFNGLREPLACEMENTCODEPOINTERSUNPROC __glewReplacementCodePointerSUN = NULL; PFNGLREPLACEMENTCODEUBSUNPROC __glewReplacementCodeubSUN = NULL; PFNGLREPLACEMENTCODEUBVSUNPROC __glewReplacementCodeubvSUN = NULL; PFNGLREPLACEMENTCODEUISUNPROC __glewReplacementCodeuiSUN = NULL; PFNGLREPLACEMENTCODEUIVSUNPROC __glewReplacementCodeuivSUN = NULL; PFNGLREPLACEMENTCODEUSSUNPROC __glewReplacementCodeusSUN = NULL; PFNGLREPLACEMENTCODEUSVSUNPROC __glewReplacementCodeusvSUN = NULL; PFNGLCOLOR3FVERTEX3FSUNPROC __glewColor3fVertex3fSUN = NULL; PFNGLCOLOR3FVERTEX3FVSUNPROC __glewColor3fVertex3fvSUN = NULL; PFNGLCOLOR4FNORMAL3FVERTEX3FSUNPROC __glewColor4fNormal3fVertex3fSUN = NULL; PFNGLCOLOR4FNORMAL3FVERTEX3FVSUNPROC __glewColor4fNormal3fVertex3fvSUN = NULL; PFNGLCOLOR4UBVERTEX2FSUNPROC __glewColor4ubVertex2fSUN = NULL; PFNGLCOLOR4UBVERTEX2FVSUNPROC __glewColor4ubVertex2fvSUN = NULL; PFNGLCOLOR4UBVERTEX3FSUNPROC __glewColor4ubVertex3fSUN = NULL; PFNGLCOLOR4UBVERTEX3FVSUNPROC __glewColor4ubVertex3fvSUN = NULL; PFNGLNORMAL3FVERTEX3FSUNPROC __glewNormal3fVertex3fSUN = NULL; PFNGLNORMAL3FVERTEX3FVSUNPROC __glewNormal3fVertex3fvSUN = NULL; PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FSUNPROC __glewReplacementCodeuiColor3fVertex3fSUN = NULL; PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FVSUNPROC __glewReplacementCodeuiColor3fVertex3fvSUN = NULL; PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FSUNPROC __glewReplacementCodeuiColor4fNormal3fVertex3fSUN = NULL; PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FVSUNPROC __glewReplacementCodeuiColor4fNormal3fVertex3fvSUN = NULL; PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FSUNPROC __glewReplacementCodeuiColor4ubVertex3fSUN = NULL; PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FVSUNPROC __glewReplacementCodeuiColor4ubVertex3fvSUN = NULL; PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FSUNPROC __glewReplacementCodeuiNormal3fVertex3fSUN = NULL; PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FVSUNPROC __glewReplacementCodeuiNormal3fVertex3fvSUN = NULL; PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC __glewReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN = NULL; PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC __glewReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN = NULL; PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FSUNPROC __glewReplacementCodeuiTexCoord2fNormal3fVertex3fSUN = NULL; PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FVSUNPROC __glewReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN = NULL; PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FSUNPROC __glewReplacementCodeuiTexCoord2fVertex3fSUN = NULL; PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FVSUNPROC __glewReplacementCodeuiTexCoord2fVertex3fvSUN = NULL; PFNGLREPLACEMENTCODEUIVERTEX3FSUNPROC __glewReplacementCodeuiVertex3fSUN = NULL; PFNGLREPLACEMENTCODEUIVERTEX3FVSUNPROC __glewReplacementCodeuiVertex3fvSUN = NULL; PFNGLTEXCOORD2FCOLOR3FVERTEX3FSUNPROC __glewTexCoord2fColor3fVertex3fSUN = NULL; PFNGLTEXCOORD2FCOLOR3FVERTEX3FVSUNPROC __glewTexCoord2fColor3fVertex3fvSUN = NULL; PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC __glewTexCoord2fColor4fNormal3fVertex3fSUN = NULL; PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC __glewTexCoord2fColor4fNormal3fVertex3fvSUN = NULL; PFNGLTEXCOORD2FCOLOR4UBVERTEX3FSUNPROC __glewTexCoord2fColor4ubVertex3fSUN = NULL; PFNGLTEXCOORD2FCOLOR4UBVERTEX3FVSUNPROC __glewTexCoord2fColor4ubVertex3fvSUN = NULL; PFNGLTEXCOORD2FNORMAL3FVERTEX3FSUNPROC __glewTexCoord2fNormal3fVertex3fSUN = NULL; PFNGLTEXCOORD2FNORMAL3FVERTEX3FVSUNPROC __glewTexCoord2fNormal3fVertex3fvSUN = NULL; PFNGLTEXCOORD2FVERTEX3FSUNPROC __glewTexCoord2fVertex3fSUN = NULL; PFNGLTEXCOORD2FVERTEX3FVSUNPROC __glewTexCoord2fVertex3fvSUN = NULL; PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FSUNPROC __glewTexCoord4fColor4fNormal3fVertex4fSUN = NULL; PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FVSUNPROC __glewTexCoord4fColor4fNormal3fVertex4fvSUN = NULL; PFNGLTEXCOORD4FVERTEX4FSUNPROC __glewTexCoord4fVertex4fSUN = NULL; PFNGLTEXCOORD4FVERTEX4FVSUNPROC __glewTexCoord4fVertex4fvSUN = NULL; PFNGLADDSWAPHINTRECTWINPROC __glewAddSwapHintRectWIN = NULL; #endif /* !WIN32 || !GLEW_MX */ #if !defined(GLEW_MX) GLboolean __GLEW_VERSION_1_1 = GL_FALSE; GLboolean __GLEW_VERSION_1_2 = GL_FALSE; GLboolean __GLEW_VERSION_1_2_1 = GL_FALSE; GLboolean __GLEW_VERSION_1_3 = GL_FALSE; GLboolean __GLEW_VERSION_1_4 = GL_FALSE; GLboolean __GLEW_VERSION_1_5 = GL_FALSE; GLboolean __GLEW_VERSION_2_0 = GL_FALSE; GLboolean __GLEW_VERSION_2_1 = GL_FALSE; GLboolean __GLEW_VERSION_3_0 = GL_FALSE; GLboolean __GLEW_VERSION_3_1 = GL_FALSE; GLboolean __GLEW_VERSION_3_2 = GL_FALSE; GLboolean __GLEW_VERSION_3_3 = GL_FALSE; GLboolean __GLEW_VERSION_4_0 = GL_FALSE; GLboolean __GLEW_VERSION_4_1 = GL_FALSE; GLboolean __GLEW_VERSION_4_2 = GL_FALSE; GLboolean __GLEW_VERSION_4_3 = GL_FALSE; GLboolean __GLEW_3DFX_multisample = GL_FALSE; GLboolean __GLEW_3DFX_tbuffer = GL_FALSE; GLboolean __GLEW_3DFX_texture_compression_FXT1 = GL_FALSE; GLboolean __GLEW_AMD_blend_minmax_factor = GL_FALSE; GLboolean __GLEW_AMD_conservative_depth = GL_FALSE; GLboolean __GLEW_AMD_debug_output = GL_FALSE; GLboolean __GLEW_AMD_depth_clamp_separate = GL_FALSE; GLboolean __GLEW_AMD_draw_buffers_blend = GL_FALSE; GLboolean __GLEW_AMD_multi_draw_indirect = GL_FALSE; GLboolean __GLEW_AMD_name_gen_delete = GL_FALSE; GLboolean __GLEW_AMD_performance_monitor = GL_FALSE; GLboolean __GLEW_AMD_pinned_memory = GL_FALSE; GLboolean __GLEW_AMD_query_buffer_object = GL_FALSE; GLboolean __GLEW_AMD_sample_positions = GL_FALSE; GLboolean __GLEW_AMD_seamless_cubemap_per_texture = GL_FALSE; GLboolean __GLEW_AMD_shader_stencil_export = GL_FALSE; GLboolean __GLEW_AMD_stencil_operation_extended = GL_FALSE; GLboolean __GLEW_AMD_texture_texture4 = GL_FALSE; GLboolean __GLEW_AMD_transform_feedback3_lines_triangles = GL_FALSE; GLboolean __GLEW_AMD_vertex_shader_layer = GL_FALSE; GLboolean __GLEW_AMD_vertex_shader_tessellator = GL_FALSE; GLboolean __GLEW_AMD_vertex_shader_viewport_index = GL_FALSE; GLboolean __GLEW_APPLE_aux_depth_stencil = GL_FALSE; GLboolean __GLEW_APPLE_client_storage = GL_FALSE; GLboolean __GLEW_APPLE_element_array = GL_FALSE; GLboolean __GLEW_APPLE_fence = GL_FALSE; GLboolean __GLEW_APPLE_float_pixels = GL_FALSE; GLboolean __GLEW_APPLE_flush_buffer_range = GL_FALSE; GLboolean __GLEW_APPLE_object_purgeable = GL_FALSE; GLboolean __GLEW_APPLE_pixel_buffer = GL_FALSE; GLboolean __GLEW_APPLE_rgb_422 = GL_FALSE; GLboolean __GLEW_APPLE_row_bytes = GL_FALSE; GLboolean __GLEW_APPLE_specular_vector = GL_FALSE; GLboolean __GLEW_APPLE_texture_range = GL_FALSE; GLboolean __GLEW_APPLE_transform_hint = GL_FALSE; GLboolean __GLEW_APPLE_vertex_array_object = GL_FALSE; GLboolean __GLEW_APPLE_vertex_array_range = GL_FALSE; GLboolean __GLEW_APPLE_vertex_program_evaluators = GL_FALSE; GLboolean __GLEW_APPLE_ycbcr_422 = GL_FALSE; GLboolean __GLEW_ARB_ES2_compatibility = GL_FALSE; GLboolean __GLEW_ARB_ES3_compatibility = GL_FALSE; GLboolean __GLEW_ARB_arrays_of_arrays = GL_FALSE; GLboolean __GLEW_ARB_base_instance = GL_FALSE; GLboolean __GLEW_ARB_blend_func_extended = GL_FALSE; GLboolean __GLEW_ARB_cl_event = GL_FALSE; GLboolean __GLEW_ARB_clear_buffer_object = GL_FALSE; GLboolean __GLEW_ARB_color_buffer_float = GL_FALSE; GLboolean __GLEW_ARB_compatibility = GL_FALSE; GLboolean __GLEW_ARB_compressed_texture_pixel_storage = GL_FALSE; GLboolean __GLEW_ARB_compute_shader = GL_FALSE; GLboolean __GLEW_ARB_conservative_depth = GL_FALSE; GLboolean __GLEW_ARB_copy_buffer = GL_FALSE; GLboolean __GLEW_ARB_copy_image = GL_FALSE; GLboolean __GLEW_ARB_debug_output = GL_FALSE; GLboolean __GLEW_ARB_depth_buffer_float = GL_FALSE; GLboolean __GLEW_ARB_depth_clamp = GL_FALSE; GLboolean __GLEW_ARB_depth_texture = GL_FALSE; GLboolean __GLEW_ARB_draw_buffers = GL_FALSE; GLboolean __GLEW_ARB_draw_buffers_blend = GL_FALSE; GLboolean __GLEW_ARB_draw_elements_base_vertex = GL_FALSE; GLboolean __GLEW_ARB_draw_indirect = GL_FALSE; GLboolean __GLEW_ARB_draw_instanced = GL_FALSE; GLboolean __GLEW_ARB_explicit_attrib_location = GL_FALSE; GLboolean __GLEW_ARB_explicit_uniform_location = GL_FALSE; GLboolean __GLEW_ARB_fragment_coord_conventions = GL_FALSE; GLboolean __GLEW_ARB_fragment_layer_viewport = GL_FALSE; GLboolean __GLEW_ARB_fragment_program = GL_FALSE; GLboolean __GLEW_ARB_fragment_program_shadow = GL_FALSE; GLboolean __GLEW_ARB_fragment_shader = GL_FALSE; GLboolean __GLEW_ARB_framebuffer_no_attachments = GL_FALSE; GLboolean __GLEW_ARB_framebuffer_object = GL_FALSE; GLboolean __GLEW_ARB_framebuffer_sRGB = GL_FALSE; GLboolean __GLEW_ARB_geometry_shader4 = GL_FALSE; GLboolean __GLEW_ARB_get_program_binary = GL_FALSE; GLboolean __GLEW_ARB_gpu_shader5 = GL_FALSE; GLboolean __GLEW_ARB_gpu_shader_fp64 = GL_FALSE; GLboolean __GLEW_ARB_half_float_pixel = GL_FALSE; GLboolean __GLEW_ARB_half_float_vertex = GL_FALSE; GLboolean __GLEW_ARB_imaging = GL_FALSE; GLboolean __GLEW_ARB_instanced_arrays = GL_FALSE; GLboolean __GLEW_ARB_internalformat_query = GL_FALSE; GLboolean __GLEW_ARB_internalformat_query2 = GL_FALSE; GLboolean __GLEW_ARB_invalidate_subdata = GL_FALSE; GLboolean __GLEW_ARB_map_buffer_alignment = GL_FALSE; GLboolean __GLEW_ARB_map_buffer_range = GL_FALSE; GLboolean __GLEW_ARB_matrix_palette = GL_FALSE; GLboolean __GLEW_ARB_multi_draw_indirect = GL_FALSE; GLboolean __GLEW_ARB_multisample = GL_FALSE; GLboolean __GLEW_ARB_multitexture = GL_FALSE; GLboolean __GLEW_ARB_occlusion_query = GL_FALSE; GLboolean __GLEW_ARB_occlusion_query2 = GL_FALSE; GLboolean __GLEW_ARB_pixel_buffer_object = GL_FALSE; GLboolean __GLEW_ARB_point_parameters = GL_FALSE; GLboolean __GLEW_ARB_point_sprite = GL_FALSE; GLboolean __GLEW_ARB_program_interface_query = GL_FALSE; GLboolean __GLEW_ARB_provoking_vertex = GL_FALSE; GLboolean __GLEW_ARB_robust_buffer_access_behavior = GL_FALSE; GLboolean __GLEW_ARB_robustness = GL_FALSE; GLboolean __GLEW_ARB_robustness_application_isolation = GL_FALSE; GLboolean __GLEW_ARB_robustness_share_group_isolation = GL_FALSE; GLboolean __GLEW_ARB_sample_shading = GL_FALSE; GLboolean __GLEW_ARB_sampler_objects = GL_FALSE; GLboolean __GLEW_ARB_seamless_cube_map = GL_FALSE; GLboolean __GLEW_ARB_separate_shader_objects = GL_FALSE; GLboolean __GLEW_ARB_shader_atomic_counters = GL_FALSE; GLboolean __GLEW_ARB_shader_bit_encoding = GL_FALSE; GLboolean __GLEW_ARB_shader_image_load_store = GL_FALSE; GLboolean __GLEW_ARB_shader_image_size = GL_FALSE; GLboolean __GLEW_ARB_shader_objects = GL_FALSE; GLboolean __GLEW_ARB_shader_precision = GL_FALSE; GLboolean __GLEW_ARB_shader_stencil_export = GL_FALSE; GLboolean __GLEW_ARB_shader_storage_buffer_object = GL_FALSE; GLboolean __GLEW_ARB_shader_subroutine = GL_FALSE; GLboolean __GLEW_ARB_shader_texture_lod = GL_FALSE; GLboolean __GLEW_ARB_shading_language_100 = GL_FALSE; GLboolean __GLEW_ARB_shading_language_420pack = GL_FALSE; GLboolean __GLEW_ARB_shading_language_include = GL_FALSE; GLboolean __GLEW_ARB_shading_language_packing = GL_FALSE; GLboolean __GLEW_ARB_shadow = GL_FALSE; GLboolean __GLEW_ARB_shadow_ambient = GL_FALSE; GLboolean __GLEW_ARB_stencil_texturing = GL_FALSE; GLboolean __GLEW_ARB_sync = GL_FALSE; GLboolean __GLEW_ARB_tessellation_shader = GL_FALSE; GLboolean __GLEW_ARB_texture_border_clamp = GL_FALSE; GLboolean __GLEW_ARB_texture_buffer_object = GL_FALSE; GLboolean __GLEW_ARB_texture_buffer_object_rgb32 = GL_FALSE; GLboolean __GLEW_ARB_texture_buffer_range = GL_FALSE; GLboolean __GLEW_ARB_texture_compression = GL_FALSE; GLboolean __GLEW_ARB_texture_compression_bptc = GL_FALSE; GLboolean __GLEW_ARB_texture_compression_rgtc = GL_FALSE; GLboolean __GLEW_ARB_texture_cube_map = GL_FALSE; GLboolean __GLEW_ARB_texture_cube_map_array = GL_FALSE; GLboolean __GLEW_ARB_texture_env_add = GL_FALSE; GLboolean __GLEW_ARB_texture_env_combine = GL_FALSE; GLboolean __GLEW_ARB_texture_env_crossbar = GL_FALSE; GLboolean __GLEW_ARB_texture_env_dot3 = GL_FALSE; GLboolean __GLEW_ARB_texture_float = GL_FALSE; GLboolean __GLEW_ARB_texture_gather = GL_FALSE; GLboolean __GLEW_ARB_texture_mirrored_repeat = GL_FALSE; GLboolean __GLEW_ARB_texture_multisample = GL_FALSE; GLboolean __GLEW_ARB_texture_non_power_of_two = GL_FALSE; GLboolean __GLEW_ARB_texture_query_levels = GL_FALSE; GLboolean __GLEW_ARB_texture_query_lod = GL_FALSE; GLboolean __GLEW_ARB_texture_rectangle = GL_FALSE; GLboolean __GLEW_ARB_texture_rg = GL_FALSE; GLboolean __GLEW_ARB_texture_rgb10_a2ui = GL_FALSE; GLboolean __GLEW_ARB_texture_storage = GL_FALSE; GLboolean __GLEW_ARB_texture_storage_multisample = GL_FALSE; GLboolean __GLEW_ARB_texture_swizzle = GL_FALSE; GLboolean __GLEW_ARB_texture_view = GL_FALSE; GLboolean __GLEW_ARB_timer_query = GL_FALSE; GLboolean __GLEW_ARB_transform_feedback2 = GL_FALSE; GLboolean __GLEW_ARB_transform_feedback3 = GL_FALSE; GLboolean __GLEW_ARB_transform_feedback_instanced = GL_FALSE; GLboolean __GLEW_ARB_transpose_matrix = GL_FALSE; GLboolean __GLEW_ARB_uniform_buffer_object = GL_FALSE; GLboolean __GLEW_ARB_vertex_array_bgra = GL_FALSE; GLboolean __GLEW_ARB_vertex_array_object = GL_FALSE; GLboolean __GLEW_ARB_vertex_attrib_64bit = GL_FALSE; GLboolean __GLEW_ARB_vertex_attrib_binding = GL_FALSE; GLboolean __GLEW_ARB_vertex_blend = GL_FALSE; GLboolean __GLEW_ARB_vertex_buffer_object = GL_FALSE; GLboolean __GLEW_ARB_vertex_program = GL_FALSE; GLboolean __GLEW_ARB_vertex_shader = GL_FALSE; GLboolean __GLEW_ARB_vertex_type_2_10_10_10_rev = GL_FALSE; GLboolean __GLEW_ARB_viewport_array = GL_FALSE; GLboolean __GLEW_ARB_window_pos = GL_FALSE; GLboolean __GLEW_ATIX_point_sprites = GL_FALSE; GLboolean __GLEW_ATIX_texture_env_combine3 = GL_FALSE; GLboolean __GLEW_ATIX_texture_env_route = GL_FALSE; GLboolean __GLEW_ATIX_vertex_shader_output_point_size = GL_FALSE; GLboolean __GLEW_ATI_draw_buffers = GL_FALSE; GLboolean __GLEW_ATI_element_array = GL_FALSE; GLboolean __GLEW_ATI_envmap_bumpmap = GL_FALSE; GLboolean __GLEW_ATI_fragment_shader = GL_FALSE; GLboolean __GLEW_ATI_map_object_buffer = GL_FALSE; GLboolean __GLEW_ATI_meminfo = GL_FALSE; GLboolean __GLEW_ATI_pn_triangles = GL_FALSE; GLboolean __GLEW_ATI_separate_stencil = GL_FALSE; GLboolean __GLEW_ATI_shader_texture_lod = GL_FALSE; GLboolean __GLEW_ATI_text_fragment_shader = GL_FALSE; GLboolean __GLEW_ATI_texture_compression_3dc = GL_FALSE; GLboolean __GLEW_ATI_texture_env_combine3 = GL_FALSE; GLboolean __GLEW_ATI_texture_float = GL_FALSE; GLboolean __GLEW_ATI_texture_mirror_once = GL_FALSE; GLboolean __GLEW_ATI_vertex_array_object = GL_FALSE; GLboolean __GLEW_ATI_vertex_attrib_array_object = GL_FALSE; GLboolean __GLEW_ATI_vertex_streams = GL_FALSE; GLboolean __GLEW_EXT_422_pixels = GL_FALSE; GLboolean __GLEW_EXT_Cg_shader = GL_FALSE; GLboolean __GLEW_EXT_abgr = GL_FALSE; GLboolean __GLEW_EXT_bgra = GL_FALSE; GLboolean __GLEW_EXT_bindable_uniform = GL_FALSE; GLboolean __GLEW_EXT_blend_color = GL_FALSE; GLboolean __GLEW_EXT_blend_equation_separate = GL_FALSE; GLboolean __GLEW_EXT_blend_func_separate = GL_FALSE; GLboolean __GLEW_EXT_blend_logic_op = GL_FALSE; GLboolean __GLEW_EXT_blend_minmax = GL_FALSE; GLboolean __GLEW_EXT_blend_subtract = GL_FALSE; GLboolean __GLEW_EXT_clip_volume_hint = GL_FALSE; GLboolean __GLEW_EXT_cmyka = GL_FALSE; GLboolean __GLEW_EXT_color_subtable = GL_FALSE; GLboolean __GLEW_EXT_compiled_vertex_array = GL_FALSE; GLboolean __GLEW_EXT_convolution = GL_FALSE; GLboolean __GLEW_EXT_coordinate_frame = GL_FALSE; GLboolean __GLEW_EXT_copy_texture = GL_FALSE; GLboolean __GLEW_EXT_cull_vertex = GL_FALSE; GLboolean __GLEW_EXT_debug_marker = GL_FALSE; GLboolean __GLEW_EXT_depth_bounds_test = GL_FALSE; GLboolean __GLEW_EXT_direct_state_access = GL_FALSE; GLboolean __GLEW_EXT_draw_buffers2 = GL_FALSE; GLboolean __GLEW_EXT_draw_instanced = GL_FALSE; GLboolean __GLEW_EXT_draw_range_elements = GL_FALSE; GLboolean __GLEW_EXT_fog_coord = GL_FALSE; GLboolean __GLEW_EXT_fragment_lighting = GL_FALSE; GLboolean __GLEW_EXT_framebuffer_blit = GL_FALSE; GLboolean __GLEW_EXT_framebuffer_multisample = GL_FALSE; GLboolean __GLEW_EXT_framebuffer_multisample_blit_scaled = GL_FALSE; GLboolean __GLEW_EXT_framebuffer_object = GL_FALSE; GLboolean __GLEW_EXT_framebuffer_sRGB = GL_FALSE; GLboolean __GLEW_EXT_geometry_shader4 = GL_FALSE; GLboolean __GLEW_EXT_gpu_program_parameters = GL_FALSE; GLboolean __GLEW_EXT_gpu_shader4 = GL_FALSE; GLboolean __GLEW_EXT_histogram = GL_FALSE; GLboolean __GLEW_EXT_index_array_formats = GL_FALSE; GLboolean __GLEW_EXT_index_func = GL_FALSE; GLboolean __GLEW_EXT_index_material = GL_FALSE; GLboolean __GLEW_EXT_index_texture = GL_FALSE; GLboolean __GLEW_EXT_light_texture = GL_FALSE; GLboolean __GLEW_EXT_misc_attribute = GL_FALSE; GLboolean __GLEW_EXT_multi_draw_arrays = GL_FALSE; GLboolean __GLEW_EXT_multisample = GL_FALSE; GLboolean __GLEW_EXT_packed_depth_stencil = GL_FALSE; GLboolean __GLEW_EXT_packed_float = GL_FALSE; GLboolean __GLEW_EXT_packed_pixels = GL_FALSE; GLboolean __GLEW_EXT_paletted_texture = GL_FALSE; GLboolean __GLEW_EXT_pixel_buffer_object = GL_FALSE; GLboolean __GLEW_EXT_pixel_transform = GL_FALSE; GLboolean __GLEW_EXT_pixel_transform_color_table = GL_FALSE; GLboolean __GLEW_EXT_point_parameters = GL_FALSE; GLboolean __GLEW_EXT_polygon_offset = GL_FALSE; GLboolean __GLEW_EXT_provoking_vertex = GL_FALSE; GLboolean __GLEW_EXT_rescale_normal = GL_FALSE; GLboolean __GLEW_EXT_scene_marker = GL_FALSE; GLboolean __GLEW_EXT_secondary_color = GL_FALSE; GLboolean __GLEW_EXT_separate_shader_objects = GL_FALSE; GLboolean __GLEW_EXT_separate_specular_color = GL_FALSE; GLboolean __GLEW_EXT_shader_image_load_store = GL_FALSE; GLboolean __GLEW_EXT_shadow_funcs = GL_FALSE; GLboolean __GLEW_EXT_shared_texture_palette = GL_FALSE; GLboolean __GLEW_EXT_stencil_clear_tag = GL_FALSE; GLboolean __GLEW_EXT_stencil_two_side = GL_FALSE; GLboolean __GLEW_EXT_stencil_wrap = GL_FALSE; GLboolean __GLEW_EXT_subtexture = GL_FALSE; GLboolean __GLEW_EXT_texture = GL_FALSE; GLboolean __GLEW_EXT_texture3D = GL_FALSE; GLboolean __GLEW_EXT_texture_array = GL_FALSE; GLboolean __GLEW_EXT_texture_buffer_object = GL_FALSE; GLboolean __GLEW_EXT_texture_compression_dxt1 = GL_FALSE; GLboolean __GLEW_EXT_texture_compression_latc = GL_FALSE; GLboolean __GLEW_EXT_texture_compression_rgtc = GL_FALSE; GLboolean __GLEW_EXT_texture_compression_s3tc = GL_FALSE; GLboolean __GLEW_EXT_texture_cube_map = GL_FALSE; GLboolean __GLEW_EXT_texture_edge_clamp = GL_FALSE; GLboolean __GLEW_EXT_texture_env = GL_FALSE; GLboolean __GLEW_EXT_texture_env_add = GL_FALSE; GLboolean __GLEW_EXT_texture_env_combine = GL_FALSE; GLboolean __GLEW_EXT_texture_env_dot3 = GL_FALSE; GLboolean __GLEW_EXT_texture_filter_anisotropic = GL_FALSE; GLboolean __GLEW_EXT_texture_integer = GL_FALSE; GLboolean __GLEW_EXT_texture_lod_bias = GL_FALSE; GLboolean __GLEW_EXT_texture_mirror_clamp = GL_FALSE; GLboolean __GLEW_EXT_texture_object = GL_FALSE; GLboolean __GLEW_EXT_texture_perturb_normal = GL_FALSE; GLboolean __GLEW_EXT_texture_rectangle = GL_FALSE; GLboolean __GLEW_EXT_texture_sRGB = GL_FALSE; GLboolean __GLEW_EXT_texture_sRGB_decode = GL_FALSE; GLboolean __GLEW_EXT_texture_shared_exponent = GL_FALSE; GLboolean __GLEW_EXT_texture_snorm = GL_FALSE; GLboolean __GLEW_EXT_texture_swizzle = GL_FALSE; GLboolean __GLEW_EXT_timer_query = GL_FALSE; GLboolean __GLEW_EXT_transform_feedback = GL_FALSE; GLboolean __GLEW_EXT_vertex_array = GL_FALSE; GLboolean __GLEW_EXT_vertex_array_bgra = GL_FALSE; GLboolean __GLEW_EXT_vertex_attrib_64bit = GL_FALSE; GLboolean __GLEW_EXT_vertex_shader = GL_FALSE; GLboolean __GLEW_EXT_vertex_weighting = GL_FALSE; GLboolean __GLEW_EXT_x11_sync_object = GL_FALSE; GLboolean __GLEW_GREMEDY_frame_terminator = GL_FALSE; GLboolean __GLEW_GREMEDY_string_marker = GL_FALSE; GLboolean __GLEW_HP_convolution_border_modes = GL_FALSE; GLboolean __GLEW_HP_image_transform = GL_FALSE; GLboolean __GLEW_HP_occlusion_test = GL_FALSE; GLboolean __GLEW_HP_texture_lighting = GL_FALSE; GLboolean __GLEW_IBM_cull_vertex = GL_FALSE; GLboolean __GLEW_IBM_multimode_draw_arrays = GL_FALSE; GLboolean __GLEW_IBM_rasterpos_clip = GL_FALSE; GLboolean __GLEW_IBM_static_data = GL_FALSE; GLboolean __GLEW_IBM_texture_mirrored_repeat = GL_FALSE; GLboolean __GLEW_IBM_vertex_array_lists = GL_FALSE; GLboolean __GLEW_INGR_color_clamp = GL_FALSE; GLboolean __GLEW_INGR_interlace_read = GL_FALSE; GLboolean __GLEW_INTEL_parallel_arrays = GL_FALSE; GLboolean __GLEW_INTEL_texture_scissor = GL_FALSE; GLboolean __GLEW_KHR_debug = GL_FALSE; GLboolean __GLEW_KHR_texture_compression_astc_ldr = GL_FALSE; GLboolean __GLEW_KTX_buffer_region = GL_FALSE; GLboolean __GLEW_MESAX_texture_stack = GL_FALSE; GLboolean __GLEW_MESA_pack_invert = GL_FALSE; GLboolean __GLEW_MESA_resize_buffers = GL_FALSE; GLboolean __GLEW_MESA_window_pos = GL_FALSE; GLboolean __GLEW_MESA_ycbcr_texture = GL_FALSE; GLboolean __GLEW_NVX_gpu_memory_info = GL_FALSE; GLboolean __GLEW_NV_bindless_texture = GL_FALSE; GLboolean __GLEW_NV_blend_square = GL_FALSE; GLboolean __GLEW_NV_conditional_render = GL_FALSE; GLboolean __GLEW_NV_copy_depth_to_color = GL_FALSE; GLboolean __GLEW_NV_copy_image = GL_FALSE; GLboolean __GLEW_NV_depth_buffer_float = GL_FALSE; GLboolean __GLEW_NV_depth_clamp = GL_FALSE; GLboolean __GLEW_NV_depth_range_unclamped = GL_FALSE; GLboolean __GLEW_NV_evaluators = GL_FALSE; GLboolean __GLEW_NV_explicit_multisample = GL_FALSE; GLboolean __GLEW_NV_fence = GL_FALSE; GLboolean __GLEW_NV_float_buffer = GL_FALSE; GLboolean __GLEW_NV_fog_distance = GL_FALSE; GLboolean __GLEW_NV_fragment_program = GL_FALSE; GLboolean __GLEW_NV_fragment_program2 = GL_FALSE; GLboolean __GLEW_NV_fragment_program4 = GL_FALSE; GLboolean __GLEW_NV_fragment_program_option = GL_FALSE; GLboolean __GLEW_NV_framebuffer_multisample_coverage = GL_FALSE; GLboolean __GLEW_NV_geometry_program4 = GL_FALSE; GLboolean __GLEW_NV_geometry_shader4 = GL_FALSE; GLboolean __GLEW_NV_gpu_program4 = GL_FALSE; GLboolean __GLEW_NV_gpu_program5 = GL_FALSE; GLboolean __GLEW_NV_gpu_program_fp64 = GL_FALSE; GLboolean __GLEW_NV_gpu_shader5 = GL_FALSE; GLboolean __GLEW_NV_half_float = GL_FALSE; GLboolean __GLEW_NV_light_max_exponent = GL_FALSE; GLboolean __GLEW_NV_multisample_coverage = GL_FALSE; GLboolean __GLEW_NV_multisample_filter_hint = GL_FALSE; GLboolean __GLEW_NV_occlusion_query = GL_FALSE; GLboolean __GLEW_NV_packed_depth_stencil = GL_FALSE; GLboolean __GLEW_NV_parameter_buffer_object = GL_FALSE; GLboolean __GLEW_NV_parameter_buffer_object2 = GL_FALSE; GLboolean __GLEW_NV_path_rendering = GL_FALSE; GLboolean __GLEW_NV_pixel_data_range = GL_FALSE; GLboolean __GLEW_NV_point_sprite = GL_FALSE; GLboolean __GLEW_NV_present_video = GL_FALSE; GLboolean __GLEW_NV_primitive_restart = GL_FALSE; GLboolean __GLEW_NV_register_combiners = GL_FALSE; GLboolean __GLEW_NV_register_combiners2 = GL_FALSE; GLboolean __GLEW_NV_shader_atomic_float = GL_FALSE; GLboolean __GLEW_NV_shader_buffer_load = GL_FALSE; GLboolean __GLEW_NV_tessellation_program5 = GL_FALSE; GLboolean __GLEW_NV_texgen_emboss = GL_FALSE; GLboolean __GLEW_NV_texgen_reflection = GL_FALSE; GLboolean __GLEW_NV_texture_barrier = GL_FALSE; GLboolean __GLEW_NV_texture_compression_vtc = GL_FALSE; GLboolean __GLEW_NV_texture_env_combine4 = GL_FALSE; GLboolean __GLEW_NV_texture_expand_normal = GL_FALSE; GLboolean __GLEW_NV_texture_multisample = GL_FALSE; GLboolean __GLEW_NV_texture_rectangle = GL_FALSE; GLboolean __GLEW_NV_texture_shader = GL_FALSE; GLboolean __GLEW_NV_texture_shader2 = GL_FALSE; GLboolean __GLEW_NV_texture_shader3 = GL_FALSE; GLboolean __GLEW_NV_transform_feedback = GL_FALSE; GLboolean __GLEW_NV_transform_feedback2 = GL_FALSE; GLboolean __GLEW_NV_vdpau_interop = GL_FALSE; GLboolean __GLEW_NV_vertex_array_range = GL_FALSE; GLboolean __GLEW_NV_vertex_array_range2 = GL_FALSE; GLboolean __GLEW_NV_vertex_attrib_integer_64bit = GL_FALSE; GLboolean __GLEW_NV_vertex_buffer_unified_memory = GL_FALSE; GLboolean __GLEW_NV_vertex_program = GL_FALSE; GLboolean __GLEW_NV_vertex_program1_1 = GL_FALSE; GLboolean __GLEW_NV_vertex_program2 = GL_FALSE; GLboolean __GLEW_NV_vertex_program2_option = GL_FALSE; GLboolean __GLEW_NV_vertex_program3 = GL_FALSE; GLboolean __GLEW_NV_vertex_program4 = GL_FALSE; GLboolean __GLEW_NV_video_capture = GL_FALSE; GLboolean __GLEW_OES_byte_coordinates = GL_FALSE; GLboolean __GLEW_OES_compressed_paletted_texture = GL_FALSE; GLboolean __GLEW_OES_read_format = GL_FALSE; GLboolean __GLEW_OES_single_precision = GL_FALSE; GLboolean __GLEW_OML_interlace = GL_FALSE; GLboolean __GLEW_OML_resample = GL_FALSE; GLboolean __GLEW_OML_subsample = GL_FALSE; GLboolean __GLEW_PGI_misc_hints = GL_FALSE; GLboolean __GLEW_PGI_vertex_hints = GL_FALSE; GLboolean __GLEW_REGAL_error_string = GL_FALSE; GLboolean __GLEW_REGAL_extension_query = GL_FALSE; GLboolean __GLEW_REGAL_log = GL_FALSE; GLboolean __GLEW_REND_screen_coordinates = GL_FALSE; GLboolean __GLEW_S3_s3tc = GL_FALSE; GLboolean __GLEW_SGIS_color_range = GL_FALSE; GLboolean __GLEW_SGIS_detail_texture = GL_FALSE; GLboolean __GLEW_SGIS_fog_function = GL_FALSE; GLboolean __GLEW_SGIS_generate_mipmap = GL_FALSE; GLboolean __GLEW_SGIS_multisample = GL_FALSE; GLboolean __GLEW_SGIS_pixel_texture = GL_FALSE; GLboolean __GLEW_SGIS_point_line_texgen = GL_FALSE; GLboolean __GLEW_SGIS_sharpen_texture = GL_FALSE; GLboolean __GLEW_SGIS_texture4D = GL_FALSE; GLboolean __GLEW_SGIS_texture_border_clamp = GL_FALSE; GLboolean __GLEW_SGIS_texture_edge_clamp = GL_FALSE; GLboolean __GLEW_SGIS_texture_filter4 = GL_FALSE; GLboolean __GLEW_SGIS_texture_lod = GL_FALSE; GLboolean __GLEW_SGIS_texture_select = GL_FALSE; GLboolean __GLEW_SGIX_async = GL_FALSE; GLboolean __GLEW_SGIX_async_histogram = GL_FALSE; GLboolean __GLEW_SGIX_async_pixel = GL_FALSE; GLboolean __GLEW_SGIX_blend_alpha_minmax = GL_FALSE; GLboolean __GLEW_SGIX_clipmap = GL_FALSE; GLboolean __GLEW_SGIX_convolution_accuracy = GL_FALSE; GLboolean __GLEW_SGIX_depth_texture = GL_FALSE; GLboolean __GLEW_SGIX_flush_raster = GL_FALSE; GLboolean __GLEW_SGIX_fog_offset = GL_FALSE; GLboolean __GLEW_SGIX_fog_texture = GL_FALSE; GLboolean __GLEW_SGIX_fragment_specular_lighting = GL_FALSE; GLboolean __GLEW_SGIX_framezoom = GL_FALSE; GLboolean __GLEW_SGIX_interlace = GL_FALSE; GLboolean __GLEW_SGIX_ir_instrument1 = GL_FALSE; GLboolean __GLEW_SGIX_list_priority = GL_FALSE; GLboolean __GLEW_SGIX_pixel_texture = GL_FALSE; GLboolean __GLEW_SGIX_pixel_texture_bits = GL_FALSE; GLboolean __GLEW_SGIX_reference_plane = GL_FALSE; GLboolean __GLEW_SGIX_resample = GL_FALSE; GLboolean __GLEW_SGIX_shadow = GL_FALSE; GLboolean __GLEW_SGIX_shadow_ambient = GL_FALSE; GLboolean __GLEW_SGIX_sprite = GL_FALSE; GLboolean __GLEW_SGIX_tag_sample_buffer = GL_FALSE; GLboolean __GLEW_SGIX_texture_add_env = GL_FALSE; GLboolean __GLEW_SGIX_texture_coordinate_clamp = GL_FALSE; GLboolean __GLEW_SGIX_texture_lod_bias = GL_FALSE; GLboolean __GLEW_SGIX_texture_multi_buffer = GL_FALSE; GLboolean __GLEW_SGIX_texture_range = GL_FALSE; GLboolean __GLEW_SGIX_texture_scale_bias = GL_FALSE; GLboolean __GLEW_SGIX_vertex_preclip = GL_FALSE; GLboolean __GLEW_SGIX_vertex_preclip_hint = GL_FALSE; GLboolean __GLEW_SGIX_ycrcb = GL_FALSE; GLboolean __GLEW_SGI_color_matrix = GL_FALSE; GLboolean __GLEW_SGI_color_table = GL_FALSE; GLboolean __GLEW_SGI_texture_color_table = GL_FALSE; GLboolean __GLEW_SUNX_constant_data = GL_FALSE; GLboolean __GLEW_SUN_convolution_border_modes = GL_FALSE; GLboolean __GLEW_SUN_global_alpha = GL_FALSE; GLboolean __GLEW_SUN_mesh_array = GL_FALSE; GLboolean __GLEW_SUN_read_video_pixels = GL_FALSE; GLboolean __GLEW_SUN_slice_accum = GL_FALSE; GLboolean __GLEW_SUN_triangle_list = GL_FALSE; GLboolean __GLEW_SUN_vertex = GL_FALSE; GLboolean __GLEW_WIN_phong_shading = GL_FALSE; GLboolean __GLEW_WIN_specular_fog = GL_FALSE; GLboolean __GLEW_WIN_swap_hint = GL_FALSE; #endif /* !GLEW_MX */ #ifdef GL_VERSION_1_2 static GLboolean _glewInit_GL_VERSION_1_2 (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glCopyTexSubImage3D = (PFNGLCOPYTEXSUBIMAGE3DPROC)glewGetProcAddress((const GLubyte*)"glCopyTexSubImage3D")) == NULL) || r; r = ((glDrawRangeElements = (PFNGLDRAWRANGEELEMENTSPROC)glewGetProcAddress((const GLubyte*)"glDrawRangeElements")) == NULL) || r; r = ((glTexImage3D = (PFNGLTEXIMAGE3DPROC)glewGetProcAddress((const GLubyte*)"glTexImage3D")) == NULL) || r; r = ((glTexSubImage3D = (PFNGLTEXSUBIMAGE3DPROC)glewGetProcAddress((const GLubyte*)"glTexSubImage3D")) == NULL) || r; return r; } #endif /* GL_VERSION_1_2 */ #ifdef GL_VERSION_1_2_1 #endif /* GL_VERSION_1_2_1 */ #ifdef GL_VERSION_1_3 static GLboolean _glewInit_GL_VERSION_1_3 (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glActiveTexture = (PFNGLACTIVETEXTUREPROC)glewGetProcAddress((const GLubyte*)"glActiveTexture")) == NULL) || r; r = ((glClientActiveTexture = (PFNGLCLIENTACTIVETEXTUREPROC)glewGetProcAddress((const GLubyte*)"glClientActiveTexture")) == NULL) || r; r = ((glCompressedTexImage1D = (PFNGLCOMPRESSEDTEXIMAGE1DPROC)glewGetProcAddress((const GLubyte*)"glCompressedTexImage1D")) == NULL) || r; r = ((glCompressedTexImage2D = (PFNGLCOMPRESSEDTEXIMAGE2DPROC)glewGetProcAddress((const GLubyte*)"glCompressedTexImage2D")) == NULL) || r; r = ((glCompressedTexImage3D = (PFNGLCOMPRESSEDTEXIMAGE3DPROC)glewGetProcAddress((const GLubyte*)"glCompressedTexImage3D")) == NULL) || r; r = ((glCompressedTexSubImage1D = (PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC)glewGetProcAddress((const GLubyte*)"glCompressedTexSubImage1D")) == NULL) || r; r = ((glCompressedTexSubImage2D = (PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC)glewGetProcAddress((const GLubyte*)"glCompressedTexSubImage2D")) == NULL) || r; r = ((glCompressedTexSubImage3D = (PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC)glewGetProcAddress((const GLubyte*)"glCompressedTexSubImage3D")) == NULL) || r; r = ((glGetCompressedTexImage = (PFNGLGETCOMPRESSEDTEXIMAGEPROC)glewGetProcAddress((const GLubyte*)"glGetCompressedTexImage")) == NULL) || r; r = ((glLoadTransposeMatrixd = (PFNGLLOADTRANSPOSEMATRIXDPROC)glewGetProcAddress((const GLubyte*)"glLoadTransposeMatrixd")) == NULL) || r; r = ((glLoadTransposeMatrixf = (PFNGLLOADTRANSPOSEMATRIXFPROC)glewGetProcAddress((const GLubyte*)"glLoadTransposeMatrixf")) == NULL) || r; r = ((glMultTransposeMatrixd = (PFNGLMULTTRANSPOSEMATRIXDPROC)glewGetProcAddress((const GLubyte*)"glMultTransposeMatrixd")) == NULL) || r; r = ((glMultTransposeMatrixf = (PFNGLMULTTRANSPOSEMATRIXFPROC)glewGetProcAddress((const GLubyte*)"glMultTransposeMatrixf")) == NULL) || r; r = ((glMultiTexCoord1d = (PFNGLMULTITEXCOORD1DPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1d")) == NULL) || r; r = ((glMultiTexCoord1dv = (PFNGLMULTITEXCOORD1DVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1dv")) == NULL) || r; r = ((glMultiTexCoord1f = (PFNGLMULTITEXCOORD1FPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1f")) == NULL) || r; r = ((glMultiTexCoord1fv = (PFNGLMULTITEXCOORD1FVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1fv")) == NULL) || r; r = ((glMultiTexCoord1i = (PFNGLMULTITEXCOORD1IPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1i")) == NULL) || r; r = ((glMultiTexCoord1iv = (PFNGLMULTITEXCOORD1IVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1iv")) == NULL) || r; r = ((glMultiTexCoord1s = (PFNGLMULTITEXCOORD1SPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1s")) == NULL) || r; r = ((glMultiTexCoord1sv = (PFNGLMULTITEXCOORD1SVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1sv")) == NULL) || r; r = ((glMultiTexCoord2d = (PFNGLMULTITEXCOORD2DPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2d")) == NULL) || r; r = ((glMultiTexCoord2dv = (PFNGLMULTITEXCOORD2DVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2dv")) == NULL) || r; r = ((glMultiTexCoord2f = (PFNGLMULTITEXCOORD2FPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2f")) == NULL) || r; r = ((glMultiTexCoord2fv = (PFNGLMULTITEXCOORD2FVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2fv")) == NULL) || r; r = ((glMultiTexCoord2i = (PFNGLMULTITEXCOORD2IPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2i")) == NULL) || r; r = ((glMultiTexCoord2iv = (PFNGLMULTITEXCOORD2IVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2iv")) == NULL) || r; r = ((glMultiTexCoord2s = (PFNGLMULTITEXCOORD2SPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2s")) == NULL) || r; r = ((glMultiTexCoord2sv = (PFNGLMULTITEXCOORD2SVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2sv")) == NULL) || r; r = ((glMultiTexCoord3d = (PFNGLMULTITEXCOORD3DPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3d")) == NULL) || r; r = ((glMultiTexCoord3dv = (PFNGLMULTITEXCOORD3DVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3dv")) == NULL) || r; r = ((glMultiTexCoord3f = (PFNGLMULTITEXCOORD3FPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3f")) == NULL) || r; r = ((glMultiTexCoord3fv = (PFNGLMULTITEXCOORD3FVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3fv")) == NULL) || r; r = ((glMultiTexCoord3i = (PFNGLMULTITEXCOORD3IPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3i")) == NULL) || r; r = ((glMultiTexCoord3iv = (PFNGLMULTITEXCOORD3IVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3iv")) == NULL) || r; r = ((glMultiTexCoord3s = (PFNGLMULTITEXCOORD3SPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3s")) == NULL) || r; r = ((glMultiTexCoord3sv = (PFNGLMULTITEXCOORD3SVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3sv")) == NULL) || r; r = ((glMultiTexCoord4d = (PFNGLMULTITEXCOORD4DPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4d")) == NULL) || r; r = ((glMultiTexCoord4dv = (PFNGLMULTITEXCOORD4DVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4dv")) == NULL) || r; r = ((glMultiTexCoord4f = (PFNGLMULTITEXCOORD4FPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4f")) == NULL) || r; r = ((glMultiTexCoord4fv = (PFNGLMULTITEXCOORD4FVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4fv")) == NULL) || r; r = ((glMultiTexCoord4i = (PFNGLMULTITEXCOORD4IPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4i")) == NULL) || r; r = ((glMultiTexCoord4iv = (PFNGLMULTITEXCOORD4IVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4iv")) == NULL) || r; r = ((glMultiTexCoord4s = (PFNGLMULTITEXCOORD4SPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4s")) == NULL) || r; r = ((glMultiTexCoord4sv = (PFNGLMULTITEXCOORD4SVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4sv")) == NULL) || r; r = ((glSampleCoverage = (PFNGLSAMPLECOVERAGEPROC)glewGetProcAddress((const GLubyte*)"glSampleCoverage")) == NULL) || r; return r; } #endif /* GL_VERSION_1_3 */ #ifdef GL_VERSION_1_4 static GLboolean _glewInit_GL_VERSION_1_4 (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glBlendColor = (PFNGLBLENDCOLORPROC)glewGetProcAddress((const GLubyte*)"glBlendColor")) == NULL) || r; r = ((glBlendEquation = (PFNGLBLENDEQUATIONPROC)glewGetProcAddress((const GLubyte*)"glBlendEquation")) == NULL) || r; r = ((glBlendFuncSeparate = (PFNGLBLENDFUNCSEPARATEPROC)glewGetProcAddress((const GLubyte*)"glBlendFuncSeparate")) == NULL) || r; r = ((glFogCoordPointer = (PFNGLFOGCOORDPOINTERPROC)glewGetProcAddress((const GLubyte*)"glFogCoordPointer")) == NULL) || r; r = ((glFogCoordd = (PFNGLFOGCOORDDPROC)glewGetProcAddress((const GLubyte*)"glFogCoordd")) == NULL) || r; r = ((glFogCoorddv = (PFNGLFOGCOORDDVPROC)glewGetProcAddress((const GLubyte*)"glFogCoorddv")) == NULL) || r; r = ((glFogCoordf = (PFNGLFOGCOORDFPROC)glewGetProcAddress((const GLubyte*)"glFogCoordf")) == NULL) || r; r = ((glFogCoordfv = (PFNGLFOGCOORDFVPROC)glewGetProcAddress((const GLubyte*)"glFogCoordfv")) == NULL) || r; r = ((glMultiDrawArrays = (PFNGLMULTIDRAWARRAYSPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawArrays")) == NULL) || r; r = ((glMultiDrawElements = (PFNGLMULTIDRAWELEMENTSPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawElements")) == NULL) || r; r = ((glPointParameterf = (PFNGLPOINTPARAMETERFPROC)glewGetProcAddress((const GLubyte*)"glPointParameterf")) == NULL) || r; r = ((glPointParameterfv = (PFNGLPOINTPARAMETERFVPROC)glewGetProcAddress((const GLubyte*)"glPointParameterfv")) == NULL) || r; r = ((glPointParameteri = (PFNGLPOINTPARAMETERIPROC)glewGetProcAddress((const GLubyte*)"glPointParameteri")) == NULL) || r; r = ((glPointParameteriv = (PFNGLPOINTPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glPointParameteriv")) == NULL) || r; r = ((glSecondaryColor3b = (PFNGLSECONDARYCOLOR3BPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3b")) == NULL) || r; r = ((glSecondaryColor3bv = (PFNGLSECONDARYCOLOR3BVPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3bv")) == NULL) || r; r = ((glSecondaryColor3d = (PFNGLSECONDARYCOLOR3DPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3d")) == NULL) || r; r = ((glSecondaryColor3dv = (PFNGLSECONDARYCOLOR3DVPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3dv")) == NULL) || r; r = ((glSecondaryColor3f = (PFNGLSECONDARYCOLOR3FPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3f")) == NULL) || r; r = ((glSecondaryColor3fv = (PFNGLSECONDARYCOLOR3FVPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3fv")) == NULL) || r; r = ((glSecondaryColor3i = (PFNGLSECONDARYCOLOR3IPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3i")) == NULL) || r; r = ((glSecondaryColor3iv = (PFNGLSECONDARYCOLOR3IVPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3iv")) == NULL) || r; r = ((glSecondaryColor3s = (PFNGLSECONDARYCOLOR3SPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3s")) == NULL) || r; r = ((glSecondaryColor3sv = (PFNGLSECONDARYCOLOR3SVPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3sv")) == NULL) || r; r = ((glSecondaryColor3ub = (PFNGLSECONDARYCOLOR3UBPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3ub")) == NULL) || r; r = ((glSecondaryColor3ubv = (PFNGLSECONDARYCOLOR3UBVPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3ubv")) == NULL) || r; r = ((glSecondaryColor3ui = (PFNGLSECONDARYCOLOR3UIPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3ui")) == NULL) || r; r = ((glSecondaryColor3uiv = (PFNGLSECONDARYCOLOR3UIVPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3uiv")) == NULL) || r; r = ((glSecondaryColor3us = (PFNGLSECONDARYCOLOR3USPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3us")) == NULL) || r; r = ((glSecondaryColor3usv = (PFNGLSECONDARYCOLOR3USVPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3usv")) == NULL) || r; r = ((glSecondaryColorPointer = (PFNGLSECONDARYCOLORPOINTERPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColorPointer")) == NULL) || r; r = ((glWindowPos2d = (PFNGLWINDOWPOS2DPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2d")) == NULL) || r; r = ((glWindowPos2dv = (PFNGLWINDOWPOS2DVPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2dv")) == NULL) || r; r = ((glWindowPos2f = (PFNGLWINDOWPOS2FPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2f")) == NULL) || r; r = ((glWindowPos2fv = (PFNGLWINDOWPOS2FVPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2fv")) == NULL) || r; r = ((glWindowPos2i = (PFNGLWINDOWPOS2IPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2i")) == NULL) || r; r = ((glWindowPos2iv = (PFNGLWINDOWPOS2IVPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2iv")) == NULL) || r; r = ((glWindowPos2s = (PFNGLWINDOWPOS2SPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2s")) == NULL) || r; r = ((glWindowPos2sv = (PFNGLWINDOWPOS2SVPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2sv")) == NULL) || r; r = ((glWindowPos3d = (PFNGLWINDOWPOS3DPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3d")) == NULL) || r; r = ((glWindowPos3dv = (PFNGLWINDOWPOS3DVPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3dv")) == NULL) || r; r = ((glWindowPos3f = (PFNGLWINDOWPOS3FPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3f")) == NULL) || r; r = ((glWindowPos3fv = (PFNGLWINDOWPOS3FVPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3fv")) == NULL) || r; r = ((glWindowPos3i = (PFNGLWINDOWPOS3IPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3i")) == NULL) || r; r = ((glWindowPos3iv = (PFNGLWINDOWPOS3IVPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3iv")) == NULL) || r; r = ((glWindowPos3s = (PFNGLWINDOWPOS3SPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3s")) == NULL) || r; r = ((glWindowPos3sv = (PFNGLWINDOWPOS3SVPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3sv")) == NULL) || r; return r; } #endif /* GL_VERSION_1_4 */ #ifdef GL_VERSION_1_5 static GLboolean _glewInit_GL_VERSION_1_5 (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glBeginQuery = (PFNGLBEGINQUERYPROC)glewGetProcAddress((const GLubyte*)"glBeginQuery")) == NULL) || r; r = ((glBindBuffer = (PFNGLBINDBUFFERPROC)glewGetProcAddress((const GLubyte*)"glBindBuffer")) == NULL) || r; r = ((glBufferData = (PFNGLBUFFERDATAPROC)glewGetProcAddress((const GLubyte*)"glBufferData")) == NULL) || r; r = ((glBufferSubData = (PFNGLBUFFERSUBDATAPROC)glewGetProcAddress((const GLubyte*)"glBufferSubData")) == NULL) || r; r = ((glDeleteBuffers = (PFNGLDELETEBUFFERSPROC)glewGetProcAddress((const GLubyte*)"glDeleteBuffers")) == NULL) || r; r = ((glDeleteQueries = (PFNGLDELETEQUERIESPROC)glewGetProcAddress((const GLubyte*)"glDeleteQueries")) == NULL) || r; r = ((glEndQuery = (PFNGLENDQUERYPROC)glewGetProcAddress((const GLubyte*)"glEndQuery")) == NULL) || r; r = ((glGenBuffers = (PFNGLGENBUFFERSPROC)glewGetProcAddress((const GLubyte*)"glGenBuffers")) == NULL) || r; r = ((glGenQueries = (PFNGLGENQUERIESPROC)glewGetProcAddress((const GLubyte*)"glGenQueries")) == NULL) || r; r = ((glGetBufferParameteriv = (PFNGLGETBUFFERPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glGetBufferParameteriv")) == NULL) || r; r = ((glGetBufferPointerv = (PFNGLGETBUFFERPOINTERVPROC)glewGetProcAddress((const GLubyte*)"glGetBufferPointerv")) == NULL) || r; r = ((glGetBufferSubData = (PFNGLGETBUFFERSUBDATAPROC)glewGetProcAddress((const GLubyte*)"glGetBufferSubData")) == NULL) || r; r = ((glGetQueryObjectiv = (PFNGLGETQUERYOBJECTIVPROC)glewGetProcAddress((const GLubyte*)"glGetQueryObjectiv")) == NULL) || r; r = ((glGetQueryObjectuiv = (PFNGLGETQUERYOBJECTUIVPROC)glewGetProcAddress((const GLubyte*)"glGetQueryObjectuiv")) == NULL) || r; r = ((glGetQueryiv = (PFNGLGETQUERYIVPROC)glewGetProcAddress((const GLubyte*)"glGetQueryiv")) == NULL) || r; r = ((glIsBuffer = (PFNGLISBUFFERPROC)glewGetProcAddress((const GLubyte*)"glIsBuffer")) == NULL) || r; r = ((glIsQuery = (PFNGLISQUERYPROC)glewGetProcAddress((const GLubyte*)"glIsQuery")) == NULL) || r; r = ((glMapBuffer = (PFNGLMAPBUFFERPROC)glewGetProcAddress((const GLubyte*)"glMapBuffer")) == NULL) || r; r = ((glUnmapBuffer = (PFNGLUNMAPBUFFERPROC)glewGetProcAddress((const GLubyte*)"glUnmapBuffer")) == NULL) || r; return r; } #endif /* GL_VERSION_1_5 */ #ifdef GL_VERSION_2_0 static GLboolean _glewInit_GL_VERSION_2_0 (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glAttachShader = (PFNGLATTACHSHADERPROC)glewGetProcAddress((const GLubyte*)"glAttachShader")) == NULL) || r; r = ((glBindAttribLocation = (PFNGLBINDATTRIBLOCATIONPROC)glewGetProcAddress((const GLubyte*)"glBindAttribLocation")) == NULL) || r; r = ((glBlendEquationSeparate = (PFNGLBLENDEQUATIONSEPARATEPROC)glewGetProcAddress((const GLubyte*)"glBlendEquationSeparate")) == NULL) || r; r = ((glCompileShader = (PFNGLCOMPILESHADERPROC)glewGetProcAddress((const GLubyte*)"glCompileShader")) == NULL) || r; r = ((glCreateProgram = (PFNGLCREATEPROGRAMPROC)glewGetProcAddress((const GLubyte*)"glCreateProgram")) == NULL) || r; r = ((glCreateShader = (PFNGLCREATESHADERPROC)glewGetProcAddress((const GLubyte*)"glCreateShader")) == NULL) || r; r = ((glDeleteProgram = (PFNGLDELETEPROGRAMPROC)glewGetProcAddress((const GLubyte*)"glDeleteProgram")) == NULL) || r; r = ((glDeleteShader = (PFNGLDELETESHADERPROC)glewGetProcAddress((const GLubyte*)"glDeleteShader")) == NULL) || r; r = ((glDetachShader = (PFNGLDETACHSHADERPROC)glewGetProcAddress((const GLubyte*)"glDetachShader")) == NULL) || r; r = ((glDisableVertexAttribArray = (PFNGLDISABLEVERTEXATTRIBARRAYPROC)glewGetProcAddress((const GLubyte*)"glDisableVertexAttribArray")) == NULL) || r; r = ((glDrawBuffers = (PFNGLDRAWBUFFERSPROC)glewGetProcAddress((const GLubyte*)"glDrawBuffers")) == NULL) || r; r = ((glEnableVertexAttribArray = (PFNGLENABLEVERTEXATTRIBARRAYPROC)glewGetProcAddress((const GLubyte*)"glEnableVertexAttribArray")) == NULL) || r; r = ((glGetActiveAttrib = (PFNGLGETACTIVEATTRIBPROC)glewGetProcAddress((const GLubyte*)"glGetActiveAttrib")) == NULL) || r; r = ((glGetActiveUniform = (PFNGLGETACTIVEUNIFORMPROC)glewGetProcAddress((const GLubyte*)"glGetActiveUniform")) == NULL) || r; r = ((glGetAttachedShaders = (PFNGLGETATTACHEDSHADERSPROC)glewGetProcAddress((const GLubyte*)"glGetAttachedShaders")) == NULL) || r; r = ((glGetAttribLocation = (PFNGLGETATTRIBLOCATIONPROC)glewGetProcAddress((const GLubyte*)"glGetAttribLocation")) == NULL) || r; r = ((glGetProgramInfoLog = (PFNGLGETPROGRAMINFOLOGPROC)glewGetProcAddress((const GLubyte*)"glGetProgramInfoLog")) == NULL) || r; r = ((glGetProgramiv = (PFNGLGETPROGRAMIVPROC)glewGetProcAddress((const GLubyte*)"glGetProgramiv")) == NULL) || r; r = ((glGetShaderInfoLog = (PFNGLGETSHADERINFOLOGPROC)glewGetProcAddress((const GLubyte*)"glGetShaderInfoLog")) == NULL) || r; r = ((glGetShaderSource = (PFNGLGETSHADERSOURCEPROC)glewGetProcAddress((const GLubyte*)"glGetShaderSource")) == NULL) || r; r = ((glGetShaderiv = (PFNGLGETSHADERIVPROC)glewGetProcAddress((const GLubyte*)"glGetShaderiv")) == NULL) || r; r = ((glGetUniformLocation = (PFNGLGETUNIFORMLOCATIONPROC)glewGetProcAddress((const GLubyte*)"glGetUniformLocation")) == NULL) || r; r = ((glGetUniformfv = (PFNGLGETUNIFORMFVPROC)glewGetProcAddress((const GLubyte*)"glGetUniformfv")) == NULL) || r; r = ((glGetUniformiv = (PFNGLGETUNIFORMIVPROC)glewGetProcAddress((const GLubyte*)"glGetUniformiv")) == NULL) || r; r = ((glGetVertexAttribPointerv = (PFNGLGETVERTEXATTRIBPOINTERVPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribPointerv")) == NULL) || r; r = ((glGetVertexAttribdv = (PFNGLGETVERTEXATTRIBDVPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribdv")) == NULL) || r; r = ((glGetVertexAttribfv = (PFNGLGETVERTEXATTRIBFVPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribfv")) == NULL) || r; r = ((glGetVertexAttribiv = (PFNGLGETVERTEXATTRIBIVPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribiv")) == NULL) || r; r = ((glIsProgram = (PFNGLISPROGRAMPROC)glewGetProcAddress((const GLubyte*)"glIsProgram")) == NULL) || r; r = ((glIsShader = (PFNGLISSHADERPROC)glewGetProcAddress((const GLubyte*)"glIsShader")) == NULL) || r; r = ((glLinkProgram = (PFNGLLINKPROGRAMPROC)glewGetProcAddress((const GLubyte*)"glLinkProgram")) == NULL) || r; r = ((glShaderSource = (PFNGLSHADERSOURCEPROC)glewGetProcAddress((const GLubyte*)"glShaderSource")) == NULL) || r; r = ((glStencilFuncSeparate = (PFNGLSTENCILFUNCSEPARATEPROC)glewGetProcAddress((const GLubyte*)"glStencilFuncSeparate")) == NULL) || r; r = ((glStencilMaskSeparate = (PFNGLSTENCILMASKSEPARATEPROC)glewGetProcAddress((const GLubyte*)"glStencilMaskSeparate")) == NULL) || r; r = ((glStencilOpSeparate = (PFNGLSTENCILOPSEPARATEPROC)glewGetProcAddress((const GLubyte*)"glStencilOpSeparate")) == NULL) || r; r = ((glUniform1f = (PFNGLUNIFORM1FPROC)glewGetProcAddress((const GLubyte*)"glUniform1f")) == NULL) || r; r = ((glUniform1fv = (PFNGLUNIFORM1FVPROC)glewGetProcAddress((const GLubyte*)"glUniform1fv")) == NULL) || r; r = ((glUniform1i = (PFNGLUNIFORM1IPROC)glewGetProcAddress((const GLubyte*)"glUniform1i")) == NULL) || r; r = ((glUniform1iv = (PFNGLUNIFORM1IVPROC)glewGetProcAddress((const GLubyte*)"glUniform1iv")) == NULL) || r; r = ((glUniform2f = (PFNGLUNIFORM2FPROC)glewGetProcAddress((const GLubyte*)"glUniform2f")) == NULL) || r; r = ((glUniform2fv = (PFNGLUNIFORM2FVPROC)glewGetProcAddress((const GLubyte*)"glUniform2fv")) == NULL) || r; r = ((glUniform2i = (PFNGLUNIFORM2IPROC)glewGetProcAddress((const GLubyte*)"glUniform2i")) == NULL) || r; r = ((glUniform2iv = (PFNGLUNIFORM2IVPROC)glewGetProcAddress((const GLubyte*)"glUniform2iv")) == NULL) || r; r = ((glUniform3f = (PFNGLUNIFORM3FPROC)glewGetProcAddress((const GLubyte*)"glUniform3f")) == NULL) || r; r = ((glUniform3fv = (PFNGLUNIFORM3FVPROC)glewGetProcAddress((const GLubyte*)"glUniform3fv")) == NULL) || r; r = ((glUniform3i = (PFNGLUNIFORM3IPROC)glewGetProcAddress((const GLubyte*)"glUniform3i")) == NULL) || r; r = ((glUniform3iv = (PFNGLUNIFORM3IVPROC)glewGetProcAddress((const GLubyte*)"glUniform3iv")) == NULL) || r; r = ((glUniform4f = (PFNGLUNIFORM4FPROC)glewGetProcAddress((const GLubyte*)"glUniform4f")) == NULL) || r; r = ((glUniform4fv = (PFNGLUNIFORM4FVPROC)glewGetProcAddress((const GLubyte*)"glUniform4fv")) == NULL) || r; r = ((glUniform4i = (PFNGLUNIFORM4IPROC)glewGetProcAddress((const GLubyte*)"glUniform4i")) == NULL) || r; r = ((glUniform4iv = (PFNGLUNIFORM4IVPROC)glewGetProcAddress((const GLubyte*)"glUniform4iv")) == NULL) || r; r = ((glUniformMatrix2fv = (PFNGLUNIFORMMATRIX2FVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix2fv")) == NULL) || r; r = ((glUniformMatrix3fv = (PFNGLUNIFORMMATRIX3FVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix3fv")) == NULL) || r; r = ((glUniformMatrix4fv = (PFNGLUNIFORMMATRIX4FVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix4fv")) == NULL) || r; r = ((glUseProgram = (PFNGLUSEPROGRAMPROC)glewGetProcAddress((const GLubyte*)"glUseProgram")) == NULL) || r; r = ((glValidateProgram = (PFNGLVALIDATEPROGRAMPROC)glewGetProcAddress((const GLubyte*)"glValidateProgram")) == NULL) || r; r = ((glVertexAttrib1d = (PFNGLVERTEXATTRIB1DPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1d")) == NULL) || r; r = ((glVertexAttrib1dv = (PFNGLVERTEXATTRIB1DVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1dv")) == NULL) || r; r = ((glVertexAttrib1f = (PFNGLVERTEXATTRIB1FPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1f")) == NULL) || r; r = ((glVertexAttrib1fv = (PFNGLVERTEXATTRIB1FVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1fv")) == NULL) || r; r = ((glVertexAttrib1s = (PFNGLVERTEXATTRIB1SPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1s")) == NULL) || r; r = ((glVertexAttrib1sv = (PFNGLVERTEXATTRIB1SVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1sv")) == NULL) || r; r = ((glVertexAttrib2d = (PFNGLVERTEXATTRIB2DPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2d")) == NULL) || r; r = ((glVertexAttrib2dv = (PFNGLVERTEXATTRIB2DVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2dv")) == NULL) || r; r = ((glVertexAttrib2f = (PFNGLVERTEXATTRIB2FPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2f")) == NULL) || r; r = ((glVertexAttrib2fv = (PFNGLVERTEXATTRIB2FVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2fv")) == NULL) || r; r = ((glVertexAttrib2s = (PFNGLVERTEXATTRIB2SPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2s")) == NULL) || r; r = ((glVertexAttrib2sv = (PFNGLVERTEXATTRIB2SVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2sv")) == NULL) || r; r = ((glVertexAttrib3d = (PFNGLVERTEXATTRIB3DPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3d")) == NULL) || r; r = ((glVertexAttrib3dv = (PFNGLVERTEXATTRIB3DVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3dv")) == NULL) || r; r = ((glVertexAttrib3f = (PFNGLVERTEXATTRIB3FPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3f")) == NULL) || r; r = ((glVertexAttrib3fv = (PFNGLVERTEXATTRIB3FVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3fv")) == NULL) || r; r = ((glVertexAttrib3s = (PFNGLVERTEXATTRIB3SPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3s")) == NULL) || r; r = ((glVertexAttrib3sv = (PFNGLVERTEXATTRIB3SVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3sv")) == NULL) || r; r = ((glVertexAttrib4Nbv = (PFNGLVERTEXATTRIB4NBVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4Nbv")) == NULL) || r; r = ((glVertexAttrib4Niv = (PFNGLVERTEXATTRIB4NIVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4Niv")) == NULL) || r; r = ((glVertexAttrib4Nsv = (PFNGLVERTEXATTRIB4NSVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4Nsv")) == NULL) || r; r = ((glVertexAttrib4Nub = (PFNGLVERTEXATTRIB4NUBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4Nub")) == NULL) || r; r = ((glVertexAttrib4Nubv = (PFNGLVERTEXATTRIB4NUBVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4Nubv")) == NULL) || r; r = ((glVertexAttrib4Nuiv = (PFNGLVERTEXATTRIB4NUIVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4Nuiv")) == NULL) || r; r = ((glVertexAttrib4Nusv = (PFNGLVERTEXATTRIB4NUSVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4Nusv")) == NULL) || r; r = ((glVertexAttrib4bv = (PFNGLVERTEXATTRIB4BVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4bv")) == NULL) || r; r = ((glVertexAttrib4d = (PFNGLVERTEXATTRIB4DPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4d")) == NULL) || r; r = ((glVertexAttrib4dv = (PFNGLVERTEXATTRIB4DVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4dv")) == NULL) || r; r = ((glVertexAttrib4f = (PFNGLVERTEXATTRIB4FPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4f")) == NULL) || r; r = ((glVertexAttrib4fv = (PFNGLVERTEXATTRIB4FVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4fv")) == NULL) || r; r = ((glVertexAttrib4iv = (PFNGLVERTEXATTRIB4IVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4iv")) == NULL) || r; r = ((glVertexAttrib4s = (PFNGLVERTEXATTRIB4SPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4s")) == NULL) || r; r = ((glVertexAttrib4sv = (PFNGLVERTEXATTRIB4SVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4sv")) == NULL) || r; r = ((glVertexAttrib4ubv = (PFNGLVERTEXATTRIB4UBVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4ubv")) == NULL) || r; r = ((glVertexAttrib4uiv = (PFNGLVERTEXATTRIB4UIVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4uiv")) == NULL) || r; r = ((glVertexAttrib4usv = (PFNGLVERTEXATTRIB4USVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4usv")) == NULL) || r; r = ((glVertexAttribPointer = (PFNGLVERTEXATTRIBPOINTERPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribPointer")) == NULL) || r; return r; } #endif /* GL_VERSION_2_0 */ #ifdef GL_VERSION_2_1 static GLboolean _glewInit_GL_VERSION_2_1 (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glUniformMatrix2x3fv = (PFNGLUNIFORMMATRIX2X3FVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix2x3fv")) == NULL) || r; r = ((glUniformMatrix2x4fv = (PFNGLUNIFORMMATRIX2X4FVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix2x4fv")) == NULL) || r; r = ((glUniformMatrix3x2fv = (PFNGLUNIFORMMATRIX3X2FVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix3x2fv")) == NULL) || r; r = ((glUniformMatrix3x4fv = (PFNGLUNIFORMMATRIX3X4FVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix3x4fv")) == NULL) || r; r = ((glUniformMatrix4x2fv = (PFNGLUNIFORMMATRIX4X2FVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix4x2fv")) == NULL) || r; r = ((glUniformMatrix4x3fv = (PFNGLUNIFORMMATRIX4X3FVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix4x3fv")) == NULL) || r; return r; } #endif /* GL_VERSION_2_1 */ #ifdef GL_VERSION_3_0 static GLboolean _glewInit_GL_VERSION_3_0 (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glBeginConditionalRender = (PFNGLBEGINCONDITIONALRENDERPROC)glewGetProcAddress((const GLubyte*)"glBeginConditionalRender")) == NULL) || r; r = ((glBeginTransformFeedback = (PFNGLBEGINTRANSFORMFEEDBACKPROC)glewGetProcAddress((const GLubyte*)"glBeginTransformFeedback")) == NULL) || r; r = ((glBindFragDataLocation = (PFNGLBINDFRAGDATALOCATIONPROC)glewGetProcAddress((const GLubyte*)"glBindFragDataLocation")) == NULL) || r; r = ((glClampColor = (PFNGLCLAMPCOLORPROC)glewGetProcAddress((const GLubyte*)"glClampColor")) == NULL) || r; r = ((glClearBufferfi = (PFNGLCLEARBUFFERFIPROC)glewGetProcAddress((const GLubyte*)"glClearBufferfi")) == NULL) || r; r = ((glClearBufferfv = (PFNGLCLEARBUFFERFVPROC)glewGetProcAddress((const GLubyte*)"glClearBufferfv")) == NULL) || r; r = ((glClearBufferiv = (PFNGLCLEARBUFFERIVPROC)glewGetProcAddress((const GLubyte*)"glClearBufferiv")) == NULL) || r; r = ((glClearBufferuiv = (PFNGLCLEARBUFFERUIVPROC)glewGetProcAddress((const GLubyte*)"glClearBufferuiv")) == NULL) || r; r = ((glColorMaski = (PFNGLCOLORMASKIPROC)glewGetProcAddress((const GLubyte*)"glColorMaski")) == NULL) || r; r = ((glDisablei = (PFNGLDISABLEIPROC)glewGetProcAddress((const GLubyte*)"glDisablei")) == NULL) || r; r = ((glEnablei = (PFNGLENABLEIPROC)glewGetProcAddress((const GLubyte*)"glEnablei")) == NULL) || r; r = ((glEndConditionalRender = (PFNGLENDCONDITIONALRENDERPROC)glewGetProcAddress((const GLubyte*)"glEndConditionalRender")) == NULL) || r; r = ((glEndTransformFeedback = (PFNGLENDTRANSFORMFEEDBACKPROC)glewGetProcAddress((const GLubyte*)"glEndTransformFeedback")) == NULL) || r; r = ((glGetBooleani_v = (PFNGLGETBOOLEANI_VPROC)glewGetProcAddress((const GLubyte*)"glGetBooleani_v")) == NULL) || r; r = ((glGetFragDataLocation = (PFNGLGETFRAGDATALOCATIONPROC)glewGetProcAddress((const GLubyte*)"glGetFragDataLocation")) == NULL) || r; r = ((glGetStringi = (PFNGLGETSTRINGIPROC)glewGetProcAddress((const GLubyte*)"glGetStringi")) == NULL) || r; r = ((glGetTexParameterIiv = (PFNGLGETTEXPARAMETERIIVPROC)glewGetProcAddress((const GLubyte*)"glGetTexParameterIiv")) == NULL) || r; r = ((glGetTexParameterIuiv = (PFNGLGETTEXPARAMETERIUIVPROC)glewGetProcAddress((const GLubyte*)"glGetTexParameterIuiv")) == NULL) || r; r = ((glGetTransformFeedbackVarying = (PFNGLGETTRANSFORMFEEDBACKVARYINGPROC)glewGetProcAddress((const GLubyte*)"glGetTransformFeedbackVarying")) == NULL) || r; r = ((glGetUniformuiv = (PFNGLGETUNIFORMUIVPROC)glewGetProcAddress((const GLubyte*)"glGetUniformuiv")) == NULL) || r; r = ((glGetVertexAttribIiv = (PFNGLGETVERTEXATTRIBIIVPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribIiv")) == NULL) || r; r = ((glGetVertexAttribIuiv = (PFNGLGETVERTEXATTRIBIUIVPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribIuiv")) == NULL) || r; r = ((glIsEnabledi = (PFNGLISENABLEDIPROC)glewGetProcAddress((const GLubyte*)"glIsEnabledi")) == NULL) || r; r = ((glTexParameterIiv = (PFNGLTEXPARAMETERIIVPROC)glewGetProcAddress((const GLubyte*)"glTexParameterIiv")) == NULL) || r; r = ((glTexParameterIuiv = (PFNGLTEXPARAMETERIUIVPROC)glewGetProcAddress((const GLubyte*)"glTexParameterIuiv")) == NULL) || r; r = ((glTransformFeedbackVaryings = (PFNGLTRANSFORMFEEDBACKVARYINGSPROC)glewGetProcAddress((const GLubyte*)"glTransformFeedbackVaryings")) == NULL) || r; r = ((glUniform1ui = (PFNGLUNIFORM1UIPROC)glewGetProcAddress((const GLubyte*)"glUniform1ui")) == NULL) || r; r = ((glUniform1uiv = (PFNGLUNIFORM1UIVPROC)glewGetProcAddress((const GLubyte*)"glUniform1uiv")) == NULL) || r; r = ((glUniform2ui = (PFNGLUNIFORM2UIPROC)glewGetProcAddress((const GLubyte*)"glUniform2ui")) == NULL) || r; r = ((glUniform2uiv = (PFNGLUNIFORM2UIVPROC)glewGetProcAddress((const GLubyte*)"glUniform2uiv")) == NULL) || r; r = ((glUniform3ui = (PFNGLUNIFORM3UIPROC)glewGetProcAddress((const GLubyte*)"glUniform3ui")) == NULL) || r; r = ((glUniform3uiv = (PFNGLUNIFORM3UIVPROC)glewGetProcAddress((const GLubyte*)"glUniform3uiv")) == NULL) || r; r = ((glUniform4ui = (PFNGLUNIFORM4UIPROC)glewGetProcAddress((const GLubyte*)"glUniform4ui")) == NULL) || r; r = ((glUniform4uiv = (PFNGLUNIFORM4UIVPROC)glewGetProcAddress((const GLubyte*)"glUniform4uiv")) == NULL) || r; r = ((glVertexAttribI1i = (PFNGLVERTEXATTRIBI1IPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI1i")) == NULL) || r; r = ((glVertexAttribI1iv = (PFNGLVERTEXATTRIBI1IVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI1iv")) == NULL) || r; r = ((glVertexAttribI1ui = (PFNGLVERTEXATTRIBI1UIPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI1ui")) == NULL) || r; r = ((glVertexAttribI1uiv = (PFNGLVERTEXATTRIBI1UIVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI1uiv")) == NULL) || r; r = ((glVertexAttribI2i = (PFNGLVERTEXATTRIBI2IPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI2i")) == NULL) || r; r = ((glVertexAttribI2iv = (PFNGLVERTEXATTRIBI2IVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI2iv")) == NULL) || r; r = ((glVertexAttribI2ui = (PFNGLVERTEXATTRIBI2UIPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI2ui")) == NULL) || r; r = ((glVertexAttribI2uiv = (PFNGLVERTEXATTRIBI2UIVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI2uiv")) == NULL) || r; r = ((glVertexAttribI3i = (PFNGLVERTEXATTRIBI3IPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI3i")) == NULL) || r; r = ((glVertexAttribI3iv = (PFNGLVERTEXATTRIBI3IVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI3iv")) == NULL) || r; r = ((glVertexAttribI3ui = (PFNGLVERTEXATTRIBI3UIPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI3ui")) == NULL) || r; r = ((glVertexAttribI3uiv = (PFNGLVERTEXATTRIBI3UIVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI3uiv")) == NULL) || r; r = ((glVertexAttribI4bv = (PFNGLVERTEXATTRIBI4BVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI4bv")) == NULL) || r; r = ((glVertexAttribI4i = (PFNGLVERTEXATTRIBI4IPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI4i")) == NULL) || r; r = ((glVertexAttribI4iv = (PFNGLVERTEXATTRIBI4IVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI4iv")) == NULL) || r; r = ((glVertexAttribI4sv = (PFNGLVERTEXATTRIBI4SVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI4sv")) == NULL) || r; r = ((glVertexAttribI4ubv = (PFNGLVERTEXATTRIBI4UBVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI4ubv")) == NULL) || r; r = ((glVertexAttribI4ui = (PFNGLVERTEXATTRIBI4UIPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI4ui")) == NULL) || r; r = ((glVertexAttribI4uiv = (PFNGLVERTEXATTRIBI4UIVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI4uiv")) == NULL) || r; r = ((glVertexAttribI4usv = (PFNGLVERTEXATTRIBI4USVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI4usv")) == NULL) || r; r = ((glVertexAttribIPointer = (PFNGLVERTEXATTRIBIPOINTERPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribIPointer")) == NULL) || r; return r; } #endif /* GL_VERSION_3_0 */ #ifdef GL_VERSION_3_1 static GLboolean _glewInit_GL_VERSION_3_1 (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glDrawArraysInstanced = (PFNGLDRAWARRAYSINSTANCEDPROC)glewGetProcAddress((const GLubyte*)"glDrawArraysInstanced")) == NULL) || r; r = ((glDrawElementsInstanced = (PFNGLDRAWELEMENTSINSTANCEDPROC)glewGetProcAddress((const GLubyte*)"glDrawElementsInstanced")) == NULL) || r; r = ((glPrimitiveRestartIndex = (PFNGLPRIMITIVERESTARTINDEXPROC)glewGetProcAddress((const GLubyte*)"glPrimitiveRestartIndex")) == NULL) || r; r = ((glTexBuffer = (PFNGLTEXBUFFERPROC)glewGetProcAddress((const GLubyte*)"glTexBuffer")) == NULL) || r; return r; } #endif /* GL_VERSION_3_1 */ #ifdef GL_VERSION_3_2 static GLboolean _glewInit_GL_VERSION_3_2 (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glFramebufferTexture = (PFNGLFRAMEBUFFERTEXTUREPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTexture")) == NULL) || r; r = ((glGetBufferParameteri64v = (PFNGLGETBUFFERPARAMETERI64VPROC)glewGetProcAddress((const GLubyte*)"glGetBufferParameteri64v")) == NULL) || r; r = ((glGetInteger64i_v = (PFNGLGETINTEGER64I_VPROC)glewGetProcAddress((const GLubyte*)"glGetInteger64i_v")) == NULL) || r; return r; } #endif /* GL_VERSION_3_2 */ #ifdef GL_VERSION_3_3 static GLboolean _glewInit_GL_VERSION_3_3 (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glVertexAttribDivisor = (PFNGLVERTEXATTRIBDIVISORPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribDivisor")) == NULL) || r; return r; } #endif /* GL_VERSION_3_3 */ #ifdef GL_VERSION_4_0 static GLboolean _glewInit_GL_VERSION_4_0 (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glBlendEquationSeparatei = (PFNGLBLENDEQUATIONSEPARATEIPROC)glewGetProcAddress((const GLubyte*)"glBlendEquationSeparatei")) == NULL) || r; r = ((glBlendEquationi = (PFNGLBLENDEQUATIONIPROC)glewGetProcAddress((const GLubyte*)"glBlendEquationi")) == NULL) || r; r = ((glBlendFuncSeparatei = (PFNGLBLENDFUNCSEPARATEIPROC)glewGetProcAddress((const GLubyte*)"glBlendFuncSeparatei")) == NULL) || r; r = ((glBlendFunci = (PFNGLBLENDFUNCIPROC)glewGetProcAddress((const GLubyte*)"glBlendFunci")) == NULL) || r; r = ((glMinSampleShading = (PFNGLMINSAMPLESHADINGPROC)glewGetProcAddress((const GLubyte*)"glMinSampleShading")) == NULL) || r; return r; } #endif /* GL_VERSION_4_0 */ #ifdef GL_VERSION_4_1 #endif /* GL_VERSION_4_1 */ #ifdef GL_VERSION_4_2 #endif /* GL_VERSION_4_2 */ #ifdef GL_VERSION_4_3 #endif /* GL_VERSION_4_3 */ #ifdef GL_3DFX_multisample #endif /* GL_3DFX_multisample */ #ifdef GL_3DFX_tbuffer static GLboolean _glewInit_GL_3DFX_tbuffer (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glTbufferMask3DFX = (PFNGLTBUFFERMASK3DFXPROC)glewGetProcAddress((const GLubyte*)"glTbufferMask3DFX")) == NULL) || r; return r; } #endif /* GL_3DFX_tbuffer */ #ifdef GL_3DFX_texture_compression_FXT1 #endif /* GL_3DFX_texture_compression_FXT1 */ #ifdef GL_AMD_blend_minmax_factor #endif /* GL_AMD_blend_minmax_factor */ #ifdef GL_AMD_conservative_depth #endif /* GL_AMD_conservative_depth */ #ifdef GL_AMD_debug_output static GLboolean _glewInit_GL_AMD_debug_output (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glDebugMessageCallbackAMD = (PFNGLDEBUGMESSAGECALLBACKAMDPROC)glewGetProcAddress((const GLubyte*)"glDebugMessageCallbackAMD")) == NULL) || r; r = ((glDebugMessageEnableAMD = (PFNGLDEBUGMESSAGEENABLEAMDPROC)glewGetProcAddress((const GLubyte*)"glDebugMessageEnableAMD")) == NULL) || r; r = ((glDebugMessageInsertAMD = (PFNGLDEBUGMESSAGEINSERTAMDPROC)glewGetProcAddress((const GLubyte*)"glDebugMessageInsertAMD")) == NULL) || r; r = ((glGetDebugMessageLogAMD = (PFNGLGETDEBUGMESSAGELOGAMDPROC)glewGetProcAddress((const GLubyte*)"glGetDebugMessageLogAMD")) == NULL) || r; return r; } #endif /* GL_AMD_debug_output */ #ifdef GL_AMD_depth_clamp_separate #endif /* GL_AMD_depth_clamp_separate */ #ifdef GL_AMD_draw_buffers_blend static GLboolean _glewInit_GL_AMD_draw_buffers_blend (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glBlendEquationIndexedAMD = (PFNGLBLENDEQUATIONINDEXEDAMDPROC)glewGetProcAddress((const GLubyte*)"glBlendEquationIndexedAMD")) == NULL) || r; r = ((glBlendEquationSeparateIndexedAMD = (PFNGLBLENDEQUATIONSEPARATEINDEXEDAMDPROC)glewGetProcAddress((const GLubyte*)"glBlendEquationSeparateIndexedAMD")) == NULL) || r; r = ((glBlendFuncIndexedAMD = (PFNGLBLENDFUNCINDEXEDAMDPROC)glewGetProcAddress((const GLubyte*)"glBlendFuncIndexedAMD")) == NULL) || r; r = ((glBlendFuncSeparateIndexedAMD = (PFNGLBLENDFUNCSEPARATEINDEXEDAMDPROC)glewGetProcAddress((const GLubyte*)"glBlendFuncSeparateIndexedAMD")) == NULL) || r; return r; } #endif /* GL_AMD_draw_buffers_blend */ #ifdef GL_AMD_multi_draw_indirect static GLboolean _glewInit_GL_AMD_multi_draw_indirect (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glMultiDrawArraysIndirectAMD = (PFNGLMULTIDRAWARRAYSINDIRECTAMDPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawArraysIndirectAMD")) == NULL) || r; r = ((glMultiDrawElementsIndirectAMD = (PFNGLMULTIDRAWELEMENTSINDIRECTAMDPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawElementsIndirectAMD")) == NULL) || r; return r; } #endif /* GL_AMD_multi_draw_indirect */ #ifdef GL_AMD_name_gen_delete static GLboolean _glewInit_GL_AMD_name_gen_delete (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glDeleteNamesAMD = (PFNGLDELETENAMESAMDPROC)glewGetProcAddress((const GLubyte*)"glDeleteNamesAMD")) == NULL) || r; r = ((glGenNamesAMD = (PFNGLGENNAMESAMDPROC)glewGetProcAddress((const GLubyte*)"glGenNamesAMD")) == NULL) || r; r = ((glIsNameAMD = (PFNGLISNAMEAMDPROC)glewGetProcAddress((const GLubyte*)"glIsNameAMD")) == NULL) || r; return r; } #endif /* GL_AMD_name_gen_delete */ #ifdef GL_AMD_performance_monitor static GLboolean _glewInit_GL_AMD_performance_monitor (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glBeginPerfMonitorAMD = (PFNGLBEGINPERFMONITORAMDPROC)glewGetProcAddress((const GLubyte*)"glBeginPerfMonitorAMD")) == NULL) || r; r = ((glDeletePerfMonitorsAMD = (PFNGLDELETEPERFMONITORSAMDPROC)glewGetProcAddress((const GLubyte*)"glDeletePerfMonitorsAMD")) == NULL) || r; r = ((glEndPerfMonitorAMD = (PFNGLENDPERFMONITORAMDPROC)glewGetProcAddress((const GLubyte*)"glEndPerfMonitorAMD")) == NULL) || r; r = ((glGenPerfMonitorsAMD = (PFNGLGENPERFMONITORSAMDPROC)glewGetProcAddress((const GLubyte*)"glGenPerfMonitorsAMD")) == NULL) || r; r = ((glGetPerfMonitorCounterDataAMD = (PFNGLGETPERFMONITORCOUNTERDATAAMDPROC)glewGetProcAddress((const GLubyte*)"glGetPerfMonitorCounterDataAMD")) == NULL) || r; r = ((glGetPerfMonitorCounterInfoAMD = (PFNGLGETPERFMONITORCOUNTERINFOAMDPROC)glewGetProcAddress((const GLubyte*)"glGetPerfMonitorCounterInfoAMD")) == NULL) || r; r = ((glGetPerfMonitorCounterStringAMD = (PFNGLGETPERFMONITORCOUNTERSTRINGAMDPROC)glewGetProcAddress((const GLubyte*)"glGetPerfMonitorCounterStringAMD")) == NULL) || r; r = ((glGetPerfMonitorCountersAMD = (PFNGLGETPERFMONITORCOUNTERSAMDPROC)glewGetProcAddress((const GLubyte*)"glGetPerfMonitorCountersAMD")) == NULL) || r; r = ((glGetPerfMonitorGroupStringAMD = (PFNGLGETPERFMONITORGROUPSTRINGAMDPROC)glewGetProcAddress((const GLubyte*)"glGetPerfMonitorGroupStringAMD")) == NULL) || r; r = ((glGetPerfMonitorGroupsAMD = (PFNGLGETPERFMONITORGROUPSAMDPROC)glewGetProcAddress((const GLubyte*)"glGetPerfMonitorGroupsAMD")) == NULL) || r; r = ((glSelectPerfMonitorCountersAMD = (PFNGLSELECTPERFMONITORCOUNTERSAMDPROC)glewGetProcAddress((const GLubyte*)"glSelectPerfMonitorCountersAMD")) == NULL) || r; return r; } #endif /* GL_AMD_performance_monitor */ #ifdef GL_AMD_pinned_memory #endif /* GL_AMD_pinned_memory */ #ifdef GL_AMD_query_buffer_object #endif /* GL_AMD_query_buffer_object */ #ifdef GL_AMD_sample_positions static GLboolean _glewInit_GL_AMD_sample_positions (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glSetMultisamplefvAMD = (PFNGLSETMULTISAMPLEFVAMDPROC)glewGetProcAddress((const GLubyte*)"glSetMultisamplefvAMD")) == NULL) || r; return r; } #endif /* GL_AMD_sample_positions */ #ifdef GL_AMD_seamless_cubemap_per_texture #endif /* GL_AMD_seamless_cubemap_per_texture */ #ifdef GL_AMD_shader_stencil_export #endif /* GL_AMD_shader_stencil_export */ #ifdef GL_AMD_stencil_operation_extended static GLboolean _glewInit_GL_AMD_stencil_operation_extended (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glStencilOpValueAMD = (PFNGLSTENCILOPVALUEAMDPROC)glewGetProcAddress((const GLubyte*)"glStencilOpValueAMD")) == NULL) || r; return r; } #endif /* GL_AMD_stencil_operation_extended */ #ifdef GL_AMD_texture_texture4 #endif /* GL_AMD_texture_texture4 */ #ifdef GL_AMD_transform_feedback3_lines_triangles #endif /* GL_AMD_transform_feedback3_lines_triangles */ #ifdef GL_AMD_vertex_shader_layer #endif /* GL_AMD_vertex_shader_layer */ #ifdef GL_AMD_vertex_shader_tessellator static GLboolean _glewInit_GL_AMD_vertex_shader_tessellator (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glTessellationFactorAMD = (PFNGLTESSELLATIONFACTORAMDPROC)glewGetProcAddress((const GLubyte*)"glTessellationFactorAMD")) == NULL) || r; r = ((glTessellationModeAMD = (PFNGLTESSELLATIONMODEAMDPROC)glewGetProcAddress((const GLubyte*)"glTessellationModeAMD")) == NULL) || r; return r; } #endif /* GL_AMD_vertex_shader_tessellator */ #ifdef GL_AMD_vertex_shader_viewport_index #endif /* GL_AMD_vertex_shader_viewport_index */ #ifdef GL_APPLE_aux_depth_stencil #endif /* GL_APPLE_aux_depth_stencil */ #ifdef GL_APPLE_client_storage #endif /* GL_APPLE_client_storage */ #ifdef GL_APPLE_element_array static GLboolean _glewInit_GL_APPLE_element_array (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glDrawElementArrayAPPLE = (PFNGLDRAWELEMENTARRAYAPPLEPROC)glewGetProcAddress((const GLubyte*)"glDrawElementArrayAPPLE")) == NULL) || r; r = ((glDrawRangeElementArrayAPPLE = (PFNGLDRAWRANGEELEMENTARRAYAPPLEPROC)glewGetProcAddress((const GLubyte*)"glDrawRangeElementArrayAPPLE")) == NULL) || r; r = ((glElementPointerAPPLE = (PFNGLELEMENTPOINTERAPPLEPROC)glewGetProcAddress((const GLubyte*)"glElementPointerAPPLE")) == NULL) || r; r = ((glMultiDrawElementArrayAPPLE = (PFNGLMULTIDRAWELEMENTARRAYAPPLEPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawElementArrayAPPLE")) == NULL) || r; r = ((glMultiDrawRangeElementArrayAPPLE = (PFNGLMULTIDRAWRANGEELEMENTARRAYAPPLEPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawRangeElementArrayAPPLE")) == NULL) || r; return r; } #endif /* GL_APPLE_element_array */ #ifdef GL_APPLE_fence static GLboolean _glewInit_GL_APPLE_fence (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glDeleteFencesAPPLE = (PFNGLDELETEFENCESAPPLEPROC)glewGetProcAddress((const GLubyte*)"glDeleteFencesAPPLE")) == NULL) || r; r = ((glFinishFenceAPPLE = (PFNGLFINISHFENCEAPPLEPROC)glewGetProcAddress((const GLubyte*)"glFinishFenceAPPLE")) == NULL) || r; r = ((glFinishObjectAPPLE = (PFNGLFINISHOBJECTAPPLEPROC)glewGetProcAddress((const GLubyte*)"glFinishObjectAPPLE")) == NULL) || r; r = ((glGenFencesAPPLE = (PFNGLGENFENCESAPPLEPROC)glewGetProcAddress((const GLubyte*)"glGenFencesAPPLE")) == NULL) || r; r = ((glIsFenceAPPLE = (PFNGLISFENCEAPPLEPROC)glewGetProcAddress((const GLubyte*)"glIsFenceAPPLE")) == NULL) || r; r = ((glSetFenceAPPLE = (PFNGLSETFENCEAPPLEPROC)glewGetProcAddress((const GLubyte*)"glSetFenceAPPLE")) == NULL) || r; r = ((glTestFenceAPPLE = (PFNGLTESTFENCEAPPLEPROC)glewGetProcAddress((const GLubyte*)"glTestFenceAPPLE")) == NULL) || r; r = ((glTestObjectAPPLE = (PFNGLTESTOBJECTAPPLEPROC)glewGetProcAddress((const GLubyte*)"glTestObjectAPPLE")) == NULL) || r; return r; } #endif /* GL_APPLE_fence */ #ifdef GL_APPLE_float_pixels #endif /* GL_APPLE_float_pixels */ #ifdef GL_APPLE_flush_buffer_range static GLboolean _glewInit_GL_APPLE_flush_buffer_range (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glBufferParameteriAPPLE = (PFNGLBUFFERPARAMETERIAPPLEPROC)glewGetProcAddress((const GLubyte*)"glBufferParameteriAPPLE")) == NULL) || r; r = ((glFlushMappedBufferRangeAPPLE = (PFNGLFLUSHMAPPEDBUFFERRANGEAPPLEPROC)glewGetProcAddress((const GLubyte*)"glFlushMappedBufferRangeAPPLE")) == NULL) || r; return r; } #endif /* GL_APPLE_flush_buffer_range */ #ifdef GL_APPLE_object_purgeable static GLboolean _glewInit_GL_APPLE_object_purgeable (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glGetObjectParameterivAPPLE = (PFNGLGETOBJECTPARAMETERIVAPPLEPROC)glewGetProcAddress((const GLubyte*)"glGetObjectParameterivAPPLE")) == NULL) || r; r = ((glObjectPurgeableAPPLE = (PFNGLOBJECTPURGEABLEAPPLEPROC)glewGetProcAddress((const GLubyte*)"glObjectPurgeableAPPLE")) == NULL) || r; r = ((glObjectUnpurgeableAPPLE = (PFNGLOBJECTUNPURGEABLEAPPLEPROC)glewGetProcAddress((const GLubyte*)"glObjectUnpurgeableAPPLE")) == NULL) || r; return r; } #endif /* GL_APPLE_object_purgeable */ #ifdef GL_APPLE_pixel_buffer #endif /* GL_APPLE_pixel_buffer */ #ifdef GL_APPLE_rgb_422 #endif /* GL_APPLE_rgb_422 */ #ifdef GL_APPLE_row_bytes #endif /* GL_APPLE_row_bytes */ #ifdef GL_APPLE_specular_vector #endif /* GL_APPLE_specular_vector */ #ifdef GL_APPLE_texture_range static GLboolean _glewInit_GL_APPLE_texture_range (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glGetTexParameterPointervAPPLE = (PFNGLGETTEXPARAMETERPOINTERVAPPLEPROC)glewGetProcAddress((const GLubyte*)"glGetTexParameterPointervAPPLE")) == NULL) || r; r = ((glTextureRangeAPPLE = (PFNGLTEXTURERANGEAPPLEPROC)glewGetProcAddress((const GLubyte*)"glTextureRangeAPPLE")) == NULL) || r; return r; } #endif /* GL_APPLE_texture_range */ #ifdef GL_APPLE_transform_hint #endif /* GL_APPLE_transform_hint */ #ifdef GL_APPLE_vertex_array_object static GLboolean _glewInit_GL_APPLE_vertex_array_object (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glBindVertexArrayAPPLE = (PFNGLBINDVERTEXARRAYAPPLEPROC)glewGetProcAddress((const GLubyte*)"glBindVertexArrayAPPLE")) == NULL) || r; r = ((glDeleteVertexArraysAPPLE = (PFNGLDELETEVERTEXARRAYSAPPLEPROC)glewGetProcAddress((const GLubyte*)"glDeleteVertexArraysAPPLE")) == NULL) || r; r = ((glGenVertexArraysAPPLE = (PFNGLGENVERTEXARRAYSAPPLEPROC)glewGetProcAddress((const GLubyte*)"glGenVertexArraysAPPLE")) == NULL) || r; r = ((glIsVertexArrayAPPLE = (PFNGLISVERTEXARRAYAPPLEPROC)glewGetProcAddress((const GLubyte*)"glIsVertexArrayAPPLE")) == NULL) || r; return r; } #endif /* GL_APPLE_vertex_array_object */ #ifdef GL_APPLE_vertex_array_range static GLboolean _glewInit_GL_APPLE_vertex_array_range (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glFlushVertexArrayRangeAPPLE = (PFNGLFLUSHVERTEXARRAYRANGEAPPLEPROC)glewGetProcAddress((const GLubyte*)"glFlushVertexArrayRangeAPPLE")) == NULL) || r; r = ((glVertexArrayParameteriAPPLE = (PFNGLVERTEXARRAYPARAMETERIAPPLEPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayParameteriAPPLE")) == NULL) || r; r = ((glVertexArrayRangeAPPLE = (PFNGLVERTEXARRAYRANGEAPPLEPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayRangeAPPLE")) == NULL) || r; return r; } #endif /* GL_APPLE_vertex_array_range */ #ifdef GL_APPLE_vertex_program_evaluators static GLboolean _glewInit_GL_APPLE_vertex_program_evaluators (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glDisableVertexAttribAPPLE = (PFNGLDISABLEVERTEXATTRIBAPPLEPROC)glewGetProcAddress((const GLubyte*)"glDisableVertexAttribAPPLE")) == NULL) || r; r = ((glEnableVertexAttribAPPLE = (PFNGLENABLEVERTEXATTRIBAPPLEPROC)glewGetProcAddress((const GLubyte*)"glEnableVertexAttribAPPLE")) == NULL) || r; r = ((glIsVertexAttribEnabledAPPLE = (PFNGLISVERTEXATTRIBENABLEDAPPLEPROC)glewGetProcAddress((const GLubyte*)"glIsVertexAttribEnabledAPPLE")) == NULL) || r; r = ((glMapVertexAttrib1dAPPLE = (PFNGLMAPVERTEXATTRIB1DAPPLEPROC)glewGetProcAddress((const GLubyte*)"glMapVertexAttrib1dAPPLE")) == NULL) || r; r = ((glMapVertexAttrib1fAPPLE = (PFNGLMAPVERTEXATTRIB1FAPPLEPROC)glewGetProcAddress((const GLubyte*)"glMapVertexAttrib1fAPPLE")) == NULL) || r; r = ((glMapVertexAttrib2dAPPLE = (PFNGLMAPVERTEXATTRIB2DAPPLEPROC)glewGetProcAddress((const GLubyte*)"glMapVertexAttrib2dAPPLE")) == NULL) || r; r = ((glMapVertexAttrib2fAPPLE = (PFNGLMAPVERTEXATTRIB2FAPPLEPROC)glewGetProcAddress((const GLubyte*)"glMapVertexAttrib2fAPPLE")) == NULL) || r; return r; } #endif /* GL_APPLE_vertex_program_evaluators */ #ifdef GL_APPLE_ycbcr_422 #endif /* GL_APPLE_ycbcr_422 */ #ifdef GL_ARB_ES2_compatibility static GLboolean _glewInit_GL_ARB_ES2_compatibility (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glClearDepthf = (PFNGLCLEARDEPTHFPROC)glewGetProcAddress((const GLubyte*)"glClearDepthf")) == NULL) || r; r = ((glDepthRangef = (PFNGLDEPTHRANGEFPROC)glewGetProcAddress((const GLubyte*)"glDepthRangef")) == NULL) || r; r = ((glGetShaderPrecisionFormat = (PFNGLGETSHADERPRECISIONFORMATPROC)glewGetProcAddress((const GLubyte*)"glGetShaderPrecisionFormat")) == NULL) || r; r = ((glReleaseShaderCompiler = (PFNGLRELEASESHADERCOMPILERPROC)glewGetProcAddress((const GLubyte*)"glReleaseShaderCompiler")) == NULL) || r; r = ((glShaderBinary = (PFNGLSHADERBINARYPROC)glewGetProcAddress((const GLubyte*)"glShaderBinary")) == NULL) || r; return r; } #endif /* GL_ARB_ES2_compatibility */ #ifdef GL_ARB_ES3_compatibility #endif /* GL_ARB_ES3_compatibility */ #ifdef GL_ARB_arrays_of_arrays #endif /* GL_ARB_arrays_of_arrays */ #ifdef GL_ARB_base_instance static GLboolean _glewInit_GL_ARB_base_instance (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glDrawArraysInstancedBaseInstance = (PFNGLDRAWARRAYSINSTANCEDBASEINSTANCEPROC)glewGetProcAddress((const GLubyte*)"glDrawArraysInstancedBaseInstance")) == NULL) || r; r = ((glDrawElementsInstancedBaseInstance = (PFNGLDRAWELEMENTSINSTANCEDBASEINSTANCEPROC)glewGetProcAddress((const GLubyte*)"glDrawElementsInstancedBaseInstance")) == NULL) || r; r = ((glDrawElementsInstancedBaseVertexBaseInstance = (PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEPROC)glewGetProcAddress((const GLubyte*)"glDrawElementsInstancedBaseVertexBaseInstance")) == NULL) || r; return r; } #endif /* GL_ARB_base_instance */ #ifdef GL_ARB_blend_func_extended static GLboolean _glewInit_GL_ARB_blend_func_extended (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glBindFragDataLocationIndexed = (PFNGLBINDFRAGDATALOCATIONINDEXEDPROC)glewGetProcAddress((const GLubyte*)"glBindFragDataLocationIndexed")) == NULL) || r; r = ((glGetFragDataIndex = (PFNGLGETFRAGDATAINDEXPROC)glewGetProcAddress((const GLubyte*)"glGetFragDataIndex")) == NULL) || r; return r; } #endif /* GL_ARB_blend_func_extended */ #ifdef GL_ARB_cl_event static GLboolean _glewInit_GL_ARB_cl_event (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glCreateSyncFromCLeventARB = (PFNGLCREATESYNCFROMCLEVENTARBPROC)glewGetProcAddress((const GLubyte*)"glCreateSyncFromCLeventARB")) == NULL) || r; return r; } #endif /* GL_ARB_cl_event */ #ifdef GL_ARB_clear_buffer_object static GLboolean _glewInit_GL_ARB_clear_buffer_object (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glClearBufferData = (PFNGLCLEARBUFFERDATAPROC)glewGetProcAddress((const GLubyte*)"glClearBufferData")) == NULL) || r; r = ((glClearBufferSubData = (PFNGLCLEARBUFFERSUBDATAPROC)glewGetProcAddress((const GLubyte*)"glClearBufferSubData")) == NULL) || r; r = ((glClearNamedBufferDataEXT = (PFNGLCLEARNAMEDBUFFERDATAEXTPROC)glewGetProcAddress((const GLubyte*)"glClearNamedBufferDataEXT")) == NULL) || r; r = ((glClearNamedBufferSubDataEXT = (PFNGLCLEARNAMEDBUFFERSUBDATAEXTPROC)glewGetProcAddress((const GLubyte*)"glClearNamedBufferSubDataEXT")) == NULL) || r; return r; } #endif /* GL_ARB_clear_buffer_object */ #ifdef GL_ARB_color_buffer_float static GLboolean _glewInit_GL_ARB_color_buffer_float (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glClampColorARB = (PFNGLCLAMPCOLORARBPROC)glewGetProcAddress((const GLubyte*)"glClampColorARB")) == NULL) || r; return r; } #endif /* GL_ARB_color_buffer_float */ #ifdef GL_ARB_compatibility #endif /* GL_ARB_compatibility */ #ifdef GL_ARB_compressed_texture_pixel_storage #endif /* GL_ARB_compressed_texture_pixel_storage */ #ifdef GL_ARB_compute_shader static GLboolean _glewInit_GL_ARB_compute_shader (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glDispatchCompute = (PFNGLDISPATCHCOMPUTEPROC)glewGetProcAddress((const GLubyte*)"glDispatchCompute")) == NULL) || r; r = ((glDispatchComputeIndirect = (PFNGLDISPATCHCOMPUTEINDIRECTPROC)glewGetProcAddress((const GLubyte*)"glDispatchComputeIndirect")) == NULL) || r; return r; } #endif /* GL_ARB_compute_shader */ #ifdef GL_ARB_conservative_depth #endif /* GL_ARB_conservative_depth */ #ifdef GL_ARB_copy_buffer static GLboolean _glewInit_GL_ARB_copy_buffer (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glCopyBufferSubData = (PFNGLCOPYBUFFERSUBDATAPROC)glewGetProcAddress((const GLubyte*)"glCopyBufferSubData")) == NULL) || r; return r; } #endif /* GL_ARB_copy_buffer */ #ifdef GL_ARB_copy_image static GLboolean _glewInit_GL_ARB_copy_image (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glCopyImageSubData = (PFNGLCOPYIMAGESUBDATAPROC)glewGetProcAddress((const GLubyte*)"glCopyImageSubData")) == NULL) || r; return r; } #endif /* GL_ARB_copy_image */ #ifdef GL_ARB_debug_output static GLboolean _glewInit_GL_ARB_debug_output (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glDebugMessageCallbackARB = (PFNGLDEBUGMESSAGECALLBACKARBPROC)glewGetProcAddress((const GLubyte*)"glDebugMessageCallbackARB")) == NULL) || r; r = ((glDebugMessageControlARB = (PFNGLDEBUGMESSAGECONTROLARBPROC)glewGetProcAddress((const GLubyte*)"glDebugMessageControlARB")) == NULL) || r; r = ((glDebugMessageInsertARB = (PFNGLDEBUGMESSAGEINSERTARBPROC)glewGetProcAddress((const GLubyte*)"glDebugMessageInsertARB")) == NULL) || r; r = ((glGetDebugMessageLogARB = (PFNGLGETDEBUGMESSAGELOGARBPROC)glewGetProcAddress((const GLubyte*)"glGetDebugMessageLogARB")) == NULL) || r; return r; } #endif /* GL_ARB_debug_output */ #ifdef GL_ARB_depth_buffer_float #endif /* GL_ARB_depth_buffer_float */ #ifdef GL_ARB_depth_clamp #endif /* GL_ARB_depth_clamp */ #ifdef GL_ARB_depth_texture #endif /* GL_ARB_depth_texture */ #ifdef GL_ARB_draw_buffers static GLboolean _glewInit_GL_ARB_draw_buffers (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glDrawBuffersARB = (PFNGLDRAWBUFFERSARBPROC)glewGetProcAddress((const GLubyte*)"glDrawBuffersARB")) == NULL) || r; return r; } #endif /* GL_ARB_draw_buffers */ #ifdef GL_ARB_draw_buffers_blend static GLboolean _glewInit_GL_ARB_draw_buffers_blend (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glBlendEquationSeparateiARB = (PFNGLBLENDEQUATIONSEPARATEIARBPROC)glewGetProcAddress((const GLubyte*)"glBlendEquationSeparateiARB")) == NULL) || r; r = ((glBlendEquationiARB = (PFNGLBLENDEQUATIONIARBPROC)glewGetProcAddress((const GLubyte*)"glBlendEquationiARB")) == NULL) || r; r = ((glBlendFuncSeparateiARB = (PFNGLBLENDFUNCSEPARATEIARBPROC)glewGetProcAddress((const GLubyte*)"glBlendFuncSeparateiARB")) == NULL) || r; r = ((glBlendFunciARB = (PFNGLBLENDFUNCIARBPROC)glewGetProcAddress((const GLubyte*)"glBlendFunciARB")) == NULL) || r; return r; } #endif /* GL_ARB_draw_buffers_blend */ #ifdef GL_ARB_draw_elements_base_vertex static GLboolean _glewInit_GL_ARB_draw_elements_base_vertex (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glDrawElementsBaseVertex = (PFNGLDRAWELEMENTSBASEVERTEXPROC)glewGetProcAddress((const GLubyte*)"glDrawElementsBaseVertex")) == NULL) || r; r = ((glDrawElementsInstancedBaseVertex = (PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC)glewGetProcAddress((const GLubyte*)"glDrawElementsInstancedBaseVertex")) == NULL) || r; r = ((glDrawRangeElementsBaseVertex = (PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC)glewGetProcAddress((const GLubyte*)"glDrawRangeElementsBaseVertex")) == NULL) || r; r = ((glMultiDrawElementsBaseVertex = (PFNGLMULTIDRAWELEMENTSBASEVERTEXPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawElementsBaseVertex")) == NULL) || r; return r; } #endif /* GL_ARB_draw_elements_base_vertex */ #ifdef GL_ARB_draw_indirect static GLboolean _glewInit_GL_ARB_draw_indirect (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glDrawArraysIndirect = (PFNGLDRAWARRAYSINDIRECTPROC)glewGetProcAddress((const GLubyte*)"glDrawArraysIndirect")) == NULL) || r; r = ((glDrawElementsIndirect = (PFNGLDRAWELEMENTSINDIRECTPROC)glewGetProcAddress((const GLubyte*)"glDrawElementsIndirect")) == NULL) || r; return r; } #endif /* GL_ARB_draw_indirect */ #ifdef GL_ARB_draw_instanced #endif /* GL_ARB_draw_instanced */ #ifdef GL_ARB_explicit_attrib_location #endif /* GL_ARB_explicit_attrib_location */ #ifdef GL_ARB_explicit_uniform_location #endif /* GL_ARB_explicit_uniform_location */ #ifdef GL_ARB_fragment_coord_conventions #endif /* GL_ARB_fragment_coord_conventions */ #ifdef GL_ARB_fragment_layer_viewport #endif /* GL_ARB_fragment_layer_viewport */ #ifdef GL_ARB_fragment_program #endif /* GL_ARB_fragment_program */ #ifdef GL_ARB_fragment_program_shadow #endif /* GL_ARB_fragment_program_shadow */ #ifdef GL_ARB_fragment_shader #endif /* GL_ARB_fragment_shader */ #ifdef GL_ARB_framebuffer_no_attachments static GLboolean _glewInit_GL_ARB_framebuffer_no_attachments (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glFramebufferParameteri = (PFNGLFRAMEBUFFERPARAMETERIPROC)glewGetProcAddress((const GLubyte*)"glFramebufferParameteri")) == NULL) || r; r = ((glGetFramebufferParameteriv = (PFNGLGETFRAMEBUFFERPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glGetFramebufferParameteriv")) == NULL) || r; r = ((glGetNamedFramebufferParameterivEXT = (PFNGLGETNAMEDFRAMEBUFFERPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetNamedFramebufferParameterivEXT")) == NULL) || r; r = ((glNamedFramebufferParameteriEXT = (PFNGLNAMEDFRAMEBUFFERPARAMETERIEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedFramebufferParameteriEXT")) == NULL) || r; return r; } #endif /* GL_ARB_framebuffer_no_attachments */ #ifdef GL_ARB_framebuffer_object static GLboolean _glewInit_GL_ARB_framebuffer_object (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glBindFramebuffer = (PFNGLBINDFRAMEBUFFERPROC)glewGetProcAddress((const GLubyte*)"glBindFramebuffer")) == NULL) || r; r = ((glBindRenderbuffer = (PFNGLBINDRENDERBUFFERPROC)glewGetProcAddress((const GLubyte*)"glBindRenderbuffer")) == NULL) || r; r = ((glBlitFramebuffer = (PFNGLBLITFRAMEBUFFERPROC)glewGetProcAddress((const GLubyte*)"glBlitFramebuffer")) == NULL) || r; r = ((glCheckFramebufferStatus = (PFNGLCHECKFRAMEBUFFERSTATUSPROC)glewGetProcAddress((const GLubyte*)"glCheckFramebufferStatus")) == NULL) || r; r = ((glDeleteFramebuffers = (PFNGLDELETEFRAMEBUFFERSPROC)glewGetProcAddress((const GLubyte*)"glDeleteFramebuffers")) == NULL) || r; r = ((glDeleteRenderbuffers = (PFNGLDELETERENDERBUFFERSPROC)glewGetProcAddress((const GLubyte*)"glDeleteRenderbuffers")) == NULL) || r; r = ((glFramebufferRenderbuffer = (PFNGLFRAMEBUFFERRENDERBUFFERPROC)glewGetProcAddress((const GLubyte*)"glFramebufferRenderbuffer")) == NULL) || r; r = ((glFramebufferTexture1D = (PFNGLFRAMEBUFFERTEXTURE1DPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTexture1D")) == NULL) || r; r = ((glFramebufferTexture2D = (PFNGLFRAMEBUFFERTEXTURE2DPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTexture2D")) == NULL) || r; r = ((glFramebufferTexture3D = (PFNGLFRAMEBUFFERTEXTURE3DPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTexture3D")) == NULL) || r; r = ((glFramebufferTextureLayer = (PFNGLFRAMEBUFFERTEXTURELAYERPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTextureLayer")) == NULL) || r; r = ((glGenFramebuffers = (PFNGLGENFRAMEBUFFERSPROC)glewGetProcAddress((const GLubyte*)"glGenFramebuffers")) == NULL) || r; r = ((glGenRenderbuffers = (PFNGLGENRENDERBUFFERSPROC)glewGetProcAddress((const GLubyte*)"glGenRenderbuffers")) == NULL) || r; r = ((glGenerateMipmap = (PFNGLGENERATEMIPMAPPROC)glewGetProcAddress((const GLubyte*)"glGenerateMipmap")) == NULL) || r; r = ((glGetFramebufferAttachmentParameteriv = (PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glGetFramebufferAttachmentParameteriv")) == NULL) || r; r = ((glGetRenderbufferParameteriv = (PFNGLGETRENDERBUFFERPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glGetRenderbufferParameteriv")) == NULL) || r; r = ((glIsFramebuffer = (PFNGLISFRAMEBUFFERPROC)glewGetProcAddress((const GLubyte*)"glIsFramebuffer")) == NULL) || r; r = ((glIsRenderbuffer = (PFNGLISRENDERBUFFERPROC)glewGetProcAddress((const GLubyte*)"glIsRenderbuffer")) == NULL) || r; r = ((glRenderbufferStorage = (PFNGLRENDERBUFFERSTORAGEPROC)glewGetProcAddress((const GLubyte*)"glRenderbufferStorage")) == NULL) || r; r = ((glRenderbufferStorageMultisample = (PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC)glewGetProcAddress((const GLubyte*)"glRenderbufferStorageMultisample")) == NULL) || r; return r; } #endif /* GL_ARB_framebuffer_object */ #ifdef GL_ARB_framebuffer_sRGB #endif /* GL_ARB_framebuffer_sRGB */ #ifdef GL_ARB_geometry_shader4 static GLboolean _glewInit_GL_ARB_geometry_shader4 (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glFramebufferTextureARB = (PFNGLFRAMEBUFFERTEXTUREARBPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTextureARB")) == NULL) || r; r = ((glFramebufferTextureFaceARB = (PFNGLFRAMEBUFFERTEXTUREFACEARBPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTextureFaceARB")) == NULL) || r; r = ((glFramebufferTextureLayerARB = (PFNGLFRAMEBUFFERTEXTURELAYERARBPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTextureLayerARB")) == NULL) || r; r = ((glProgramParameteriARB = (PFNGLPROGRAMPARAMETERIARBPROC)glewGetProcAddress((const GLubyte*)"glProgramParameteriARB")) == NULL) || r; return r; } #endif /* GL_ARB_geometry_shader4 */ #ifdef GL_ARB_get_program_binary static GLboolean _glewInit_GL_ARB_get_program_binary (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glGetProgramBinary = (PFNGLGETPROGRAMBINARYPROC)glewGetProcAddress((const GLubyte*)"glGetProgramBinary")) == NULL) || r; r = ((glProgramBinary = (PFNGLPROGRAMBINARYPROC)glewGetProcAddress((const GLubyte*)"glProgramBinary")) == NULL) || r; r = ((glProgramParameteri = (PFNGLPROGRAMPARAMETERIPROC)glewGetProcAddress((const GLubyte*)"glProgramParameteri")) == NULL) || r; return r; } #endif /* GL_ARB_get_program_binary */ #ifdef GL_ARB_gpu_shader5 #endif /* GL_ARB_gpu_shader5 */ #ifdef GL_ARB_gpu_shader_fp64 static GLboolean _glewInit_GL_ARB_gpu_shader_fp64 (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glGetUniformdv = (PFNGLGETUNIFORMDVPROC)glewGetProcAddress((const GLubyte*)"glGetUniformdv")) == NULL) || r; r = ((glUniform1d = (PFNGLUNIFORM1DPROC)glewGetProcAddress((const GLubyte*)"glUniform1d")) == NULL) || r; r = ((glUniform1dv = (PFNGLUNIFORM1DVPROC)glewGetProcAddress((const GLubyte*)"glUniform1dv")) == NULL) || r; r = ((glUniform2d = (PFNGLUNIFORM2DPROC)glewGetProcAddress((const GLubyte*)"glUniform2d")) == NULL) || r; r = ((glUniform2dv = (PFNGLUNIFORM2DVPROC)glewGetProcAddress((const GLubyte*)"glUniform2dv")) == NULL) || r; r = ((glUniform3d = (PFNGLUNIFORM3DPROC)glewGetProcAddress((const GLubyte*)"glUniform3d")) == NULL) || r; r = ((glUniform3dv = (PFNGLUNIFORM3DVPROC)glewGetProcAddress((const GLubyte*)"glUniform3dv")) == NULL) || r; r = ((glUniform4d = (PFNGLUNIFORM4DPROC)glewGetProcAddress((const GLubyte*)"glUniform4d")) == NULL) || r; r = ((glUniform4dv = (PFNGLUNIFORM4DVPROC)glewGetProcAddress((const GLubyte*)"glUniform4dv")) == NULL) || r; r = ((glUniformMatrix2dv = (PFNGLUNIFORMMATRIX2DVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix2dv")) == NULL) || r; r = ((glUniformMatrix2x3dv = (PFNGLUNIFORMMATRIX2X3DVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix2x3dv")) == NULL) || r; r = ((glUniformMatrix2x4dv = (PFNGLUNIFORMMATRIX2X4DVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix2x4dv")) == NULL) || r; r = ((glUniformMatrix3dv = (PFNGLUNIFORMMATRIX3DVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix3dv")) == NULL) || r; r = ((glUniformMatrix3x2dv = (PFNGLUNIFORMMATRIX3X2DVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix3x2dv")) == NULL) || r; r = ((glUniformMatrix3x4dv = (PFNGLUNIFORMMATRIX3X4DVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix3x4dv")) == NULL) || r; r = ((glUniformMatrix4dv = (PFNGLUNIFORMMATRIX4DVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix4dv")) == NULL) || r; r = ((glUniformMatrix4x2dv = (PFNGLUNIFORMMATRIX4X2DVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix4x2dv")) == NULL) || r; r = ((glUniformMatrix4x3dv = (PFNGLUNIFORMMATRIX4X3DVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix4x3dv")) == NULL) || r; return r; } #endif /* GL_ARB_gpu_shader_fp64 */ #ifdef GL_ARB_half_float_pixel #endif /* GL_ARB_half_float_pixel */ #ifdef GL_ARB_half_float_vertex #endif /* GL_ARB_half_float_vertex */ #ifdef GL_ARB_imaging static GLboolean _glewInit_GL_ARB_imaging (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glBlendEquation = (PFNGLBLENDEQUATIONPROC)glewGetProcAddress((const GLubyte*)"glBlendEquation")) == NULL) || r; r = ((glColorSubTable = (PFNGLCOLORSUBTABLEPROC)glewGetProcAddress((const GLubyte*)"glColorSubTable")) == NULL) || r; r = ((glColorTable = (PFNGLCOLORTABLEPROC)glewGetProcAddress((const GLubyte*)"glColorTable")) == NULL) || r; r = ((glColorTableParameterfv = (PFNGLCOLORTABLEPARAMETERFVPROC)glewGetProcAddress((const GLubyte*)"glColorTableParameterfv")) == NULL) || r; r = ((glColorTableParameteriv = (PFNGLCOLORTABLEPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glColorTableParameteriv")) == NULL) || r; r = ((glConvolutionFilter1D = (PFNGLCONVOLUTIONFILTER1DPROC)glewGetProcAddress((const GLubyte*)"glConvolutionFilter1D")) == NULL) || r; r = ((glConvolutionFilter2D = (PFNGLCONVOLUTIONFILTER2DPROC)glewGetProcAddress((const GLubyte*)"glConvolutionFilter2D")) == NULL) || r; r = ((glConvolutionParameterf = (PFNGLCONVOLUTIONPARAMETERFPROC)glewGetProcAddress((const GLubyte*)"glConvolutionParameterf")) == NULL) || r; r = ((glConvolutionParameterfv = (PFNGLCONVOLUTIONPARAMETERFVPROC)glewGetProcAddress((const GLubyte*)"glConvolutionParameterfv")) == NULL) || r; r = ((glConvolutionParameteri = (PFNGLCONVOLUTIONPARAMETERIPROC)glewGetProcAddress((const GLubyte*)"glConvolutionParameteri")) == NULL) || r; r = ((glConvolutionParameteriv = (PFNGLCONVOLUTIONPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glConvolutionParameteriv")) == NULL) || r; r = ((glCopyColorSubTable = (PFNGLCOPYCOLORSUBTABLEPROC)glewGetProcAddress((const GLubyte*)"glCopyColorSubTable")) == NULL) || r; r = ((glCopyColorTable = (PFNGLCOPYCOLORTABLEPROC)glewGetProcAddress((const GLubyte*)"glCopyColorTable")) == NULL) || r; r = ((glCopyConvolutionFilter1D = (PFNGLCOPYCONVOLUTIONFILTER1DPROC)glewGetProcAddress((const GLubyte*)"glCopyConvolutionFilter1D")) == NULL) || r; r = ((glCopyConvolutionFilter2D = (PFNGLCOPYCONVOLUTIONFILTER2DPROC)glewGetProcAddress((const GLubyte*)"glCopyConvolutionFilter2D")) == NULL) || r; r = ((glGetColorTable = (PFNGLGETCOLORTABLEPROC)glewGetProcAddress((const GLubyte*)"glGetColorTable")) == NULL) || r; r = ((glGetColorTableParameterfv = (PFNGLGETCOLORTABLEPARAMETERFVPROC)glewGetProcAddress((const GLubyte*)"glGetColorTableParameterfv")) == NULL) || r; r = ((glGetColorTableParameteriv = (PFNGLGETCOLORTABLEPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glGetColorTableParameteriv")) == NULL) || r; r = ((glGetConvolutionFilter = (PFNGLGETCONVOLUTIONFILTERPROC)glewGetProcAddress((const GLubyte*)"glGetConvolutionFilter")) == NULL) || r; r = ((glGetConvolutionParameterfv = (PFNGLGETCONVOLUTIONPARAMETERFVPROC)glewGetProcAddress((const GLubyte*)"glGetConvolutionParameterfv")) == NULL) || r; r = ((glGetConvolutionParameteriv = (PFNGLGETCONVOLUTIONPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glGetConvolutionParameteriv")) == NULL) || r; r = ((glGetHistogram = (PFNGLGETHISTOGRAMPROC)glewGetProcAddress((const GLubyte*)"glGetHistogram")) == NULL) || r; r = ((glGetHistogramParameterfv = (PFNGLGETHISTOGRAMPARAMETERFVPROC)glewGetProcAddress((const GLubyte*)"glGetHistogramParameterfv")) == NULL) || r; r = ((glGetHistogramParameteriv = (PFNGLGETHISTOGRAMPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glGetHistogramParameteriv")) == NULL) || r; r = ((glGetMinmax = (PFNGLGETMINMAXPROC)glewGetProcAddress((const GLubyte*)"glGetMinmax")) == NULL) || r; r = ((glGetMinmaxParameterfv = (PFNGLGETMINMAXPARAMETERFVPROC)glewGetProcAddress((const GLubyte*)"glGetMinmaxParameterfv")) == NULL) || r; r = ((glGetMinmaxParameteriv = (PFNGLGETMINMAXPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glGetMinmaxParameteriv")) == NULL) || r; r = ((glGetSeparableFilter = (PFNGLGETSEPARABLEFILTERPROC)glewGetProcAddress((const GLubyte*)"glGetSeparableFilter")) == NULL) || r; r = ((glHistogram = (PFNGLHISTOGRAMPROC)glewGetProcAddress((const GLubyte*)"glHistogram")) == NULL) || r; r = ((glMinmax = (PFNGLMINMAXPROC)glewGetProcAddress((const GLubyte*)"glMinmax")) == NULL) || r; r = ((glResetHistogram = (PFNGLRESETHISTOGRAMPROC)glewGetProcAddress((const GLubyte*)"glResetHistogram")) == NULL) || r; r = ((glResetMinmax = (PFNGLRESETMINMAXPROC)glewGetProcAddress((const GLubyte*)"glResetMinmax")) == NULL) || r; r = ((glSeparableFilter2D = (PFNGLSEPARABLEFILTER2DPROC)glewGetProcAddress((const GLubyte*)"glSeparableFilter2D")) == NULL) || r; return r; } #endif /* GL_ARB_imaging */ #ifdef GL_ARB_instanced_arrays static GLboolean _glewInit_GL_ARB_instanced_arrays (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glDrawArraysInstancedARB = (PFNGLDRAWARRAYSINSTANCEDARBPROC)glewGetProcAddress((const GLubyte*)"glDrawArraysInstancedARB")) == NULL) || r; r = ((glDrawElementsInstancedARB = (PFNGLDRAWELEMENTSINSTANCEDARBPROC)glewGetProcAddress((const GLubyte*)"glDrawElementsInstancedARB")) == NULL) || r; r = ((glVertexAttribDivisorARB = (PFNGLVERTEXATTRIBDIVISORARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribDivisorARB")) == NULL) || r; return r; } #endif /* GL_ARB_instanced_arrays */ #ifdef GL_ARB_internalformat_query static GLboolean _glewInit_GL_ARB_internalformat_query (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glGetInternalformativ = (PFNGLGETINTERNALFORMATIVPROC)glewGetProcAddress((const GLubyte*)"glGetInternalformativ")) == NULL) || r; return r; } #endif /* GL_ARB_internalformat_query */ #ifdef GL_ARB_internalformat_query2 static GLboolean _glewInit_GL_ARB_internalformat_query2 (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glGetInternalformati64v = (PFNGLGETINTERNALFORMATI64VPROC)glewGetProcAddress((const GLubyte*)"glGetInternalformati64v")) == NULL) || r; return r; } #endif /* GL_ARB_internalformat_query2 */ #ifdef GL_ARB_invalidate_subdata static GLboolean _glewInit_GL_ARB_invalidate_subdata (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glInvalidateBufferData = (PFNGLINVALIDATEBUFFERDATAPROC)glewGetProcAddress((const GLubyte*)"glInvalidateBufferData")) == NULL) || r; r = ((glInvalidateBufferSubData = (PFNGLINVALIDATEBUFFERSUBDATAPROC)glewGetProcAddress((const GLubyte*)"glInvalidateBufferSubData")) == NULL) || r; r = ((glInvalidateFramebuffer = (PFNGLINVALIDATEFRAMEBUFFERPROC)glewGetProcAddress((const GLubyte*)"glInvalidateFramebuffer")) == NULL) || r; r = ((glInvalidateSubFramebuffer = (PFNGLINVALIDATESUBFRAMEBUFFERPROC)glewGetProcAddress((const GLubyte*)"glInvalidateSubFramebuffer")) == NULL) || r; r = ((glInvalidateTexImage = (PFNGLINVALIDATETEXIMAGEPROC)glewGetProcAddress((const GLubyte*)"glInvalidateTexImage")) == NULL) || r; r = ((glInvalidateTexSubImage = (PFNGLINVALIDATETEXSUBIMAGEPROC)glewGetProcAddress((const GLubyte*)"glInvalidateTexSubImage")) == NULL) || r; return r; } #endif /* GL_ARB_invalidate_subdata */ #ifdef GL_ARB_map_buffer_alignment #endif /* GL_ARB_map_buffer_alignment */ #ifdef GL_ARB_map_buffer_range static GLboolean _glewInit_GL_ARB_map_buffer_range (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glFlushMappedBufferRange = (PFNGLFLUSHMAPPEDBUFFERRANGEPROC)glewGetProcAddress((const GLubyte*)"glFlushMappedBufferRange")) == NULL) || r; r = ((glMapBufferRange = (PFNGLMAPBUFFERRANGEPROC)glewGetProcAddress((const GLubyte*)"glMapBufferRange")) == NULL) || r; return r; } #endif /* GL_ARB_map_buffer_range */ #ifdef GL_ARB_matrix_palette static GLboolean _glewInit_GL_ARB_matrix_palette (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glCurrentPaletteMatrixARB = (PFNGLCURRENTPALETTEMATRIXARBPROC)glewGetProcAddress((const GLubyte*)"glCurrentPaletteMatrixARB")) == NULL) || r; r = ((glMatrixIndexPointerARB = (PFNGLMATRIXINDEXPOINTERARBPROC)glewGetProcAddress((const GLubyte*)"glMatrixIndexPointerARB")) == NULL) || r; r = ((glMatrixIndexubvARB = (PFNGLMATRIXINDEXUBVARBPROC)glewGetProcAddress((const GLubyte*)"glMatrixIndexubvARB")) == NULL) || r; r = ((glMatrixIndexuivARB = (PFNGLMATRIXINDEXUIVARBPROC)glewGetProcAddress((const GLubyte*)"glMatrixIndexuivARB")) == NULL) || r; r = ((glMatrixIndexusvARB = (PFNGLMATRIXINDEXUSVARBPROC)glewGetProcAddress((const GLubyte*)"glMatrixIndexusvARB")) == NULL) || r; return r; } #endif /* GL_ARB_matrix_palette */ #ifdef GL_ARB_multi_draw_indirect static GLboolean _glewInit_GL_ARB_multi_draw_indirect (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glMultiDrawArraysIndirect = (PFNGLMULTIDRAWARRAYSINDIRECTPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawArraysIndirect")) == NULL) || r; r = ((glMultiDrawElementsIndirect = (PFNGLMULTIDRAWELEMENTSINDIRECTPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawElementsIndirect")) == NULL) || r; return r; } #endif /* GL_ARB_multi_draw_indirect */ #ifdef GL_ARB_multisample static GLboolean _glewInit_GL_ARB_multisample (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glSampleCoverageARB = (PFNGLSAMPLECOVERAGEARBPROC)glewGetProcAddress((const GLubyte*)"glSampleCoverageARB")) == NULL) || r; return r; } #endif /* GL_ARB_multisample */ #ifdef GL_ARB_multitexture static GLboolean _glewInit_GL_ARB_multitexture (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glActiveTextureARB = (PFNGLACTIVETEXTUREARBPROC)glewGetProcAddress((const GLubyte*)"glActiveTextureARB")) == NULL) || r; r = ((glClientActiveTextureARB = (PFNGLCLIENTACTIVETEXTUREARBPROC)glewGetProcAddress((const GLubyte*)"glClientActiveTextureARB")) == NULL) || r; r = ((glMultiTexCoord1dARB = (PFNGLMULTITEXCOORD1DARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1dARB")) == NULL) || r; r = ((glMultiTexCoord1dvARB = (PFNGLMULTITEXCOORD1DVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1dvARB")) == NULL) || r; r = ((glMultiTexCoord1fARB = (PFNGLMULTITEXCOORD1FARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1fARB")) == NULL) || r; r = ((glMultiTexCoord1fvARB = (PFNGLMULTITEXCOORD1FVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1fvARB")) == NULL) || r; r = ((glMultiTexCoord1iARB = (PFNGLMULTITEXCOORD1IARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1iARB")) == NULL) || r; r = ((glMultiTexCoord1ivARB = (PFNGLMULTITEXCOORD1IVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1ivARB")) == NULL) || r; r = ((glMultiTexCoord1sARB = (PFNGLMULTITEXCOORD1SARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1sARB")) == NULL) || r; r = ((glMultiTexCoord1svARB = (PFNGLMULTITEXCOORD1SVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1svARB")) == NULL) || r; r = ((glMultiTexCoord2dARB = (PFNGLMULTITEXCOORD2DARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2dARB")) == NULL) || r; r = ((glMultiTexCoord2dvARB = (PFNGLMULTITEXCOORD2DVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2dvARB")) == NULL) || r; r = ((glMultiTexCoord2fARB = (PFNGLMULTITEXCOORD2FARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2fARB")) == NULL) || r; r = ((glMultiTexCoord2fvARB = (PFNGLMULTITEXCOORD2FVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2fvARB")) == NULL) || r; r = ((glMultiTexCoord2iARB = (PFNGLMULTITEXCOORD2IARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2iARB")) == NULL) || r; r = ((glMultiTexCoord2ivARB = (PFNGLMULTITEXCOORD2IVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2ivARB")) == NULL) || r; r = ((glMultiTexCoord2sARB = (PFNGLMULTITEXCOORD2SARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2sARB")) == NULL) || r; r = ((glMultiTexCoord2svARB = (PFNGLMULTITEXCOORD2SVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2svARB")) == NULL) || r; r = ((glMultiTexCoord3dARB = (PFNGLMULTITEXCOORD3DARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3dARB")) == NULL) || r; r = ((glMultiTexCoord3dvARB = (PFNGLMULTITEXCOORD3DVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3dvARB")) == NULL) || r; r = ((glMultiTexCoord3fARB = (PFNGLMULTITEXCOORD3FARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3fARB")) == NULL) || r; r = ((glMultiTexCoord3fvARB = (PFNGLMULTITEXCOORD3FVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3fvARB")) == NULL) || r; r = ((glMultiTexCoord3iARB = (PFNGLMULTITEXCOORD3IARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3iARB")) == NULL) || r; r = ((glMultiTexCoord3ivARB = (PFNGLMULTITEXCOORD3IVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3ivARB")) == NULL) || r; r = ((glMultiTexCoord3sARB = (PFNGLMULTITEXCOORD3SARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3sARB")) == NULL) || r; r = ((glMultiTexCoord3svARB = (PFNGLMULTITEXCOORD3SVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3svARB")) == NULL) || r; r = ((glMultiTexCoord4dARB = (PFNGLMULTITEXCOORD4DARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4dARB")) == NULL) || r; r = ((glMultiTexCoord4dvARB = (PFNGLMULTITEXCOORD4DVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4dvARB")) == NULL) || r; r = ((glMultiTexCoord4fARB = (PFNGLMULTITEXCOORD4FARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4fARB")) == NULL) || r; r = ((glMultiTexCoord4fvARB = (PFNGLMULTITEXCOORD4FVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4fvARB")) == NULL) || r; r = ((glMultiTexCoord4iARB = (PFNGLMULTITEXCOORD4IARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4iARB")) == NULL) || r; r = ((glMultiTexCoord4ivARB = (PFNGLMULTITEXCOORD4IVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4ivARB")) == NULL) || r; r = ((glMultiTexCoord4sARB = (PFNGLMULTITEXCOORD4SARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4sARB")) == NULL) || r; r = ((glMultiTexCoord4svARB = (PFNGLMULTITEXCOORD4SVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4svARB")) == NULL) || r; return r; } #endif /* GL_ARB_multitexture */ #ifdef GL_ARB_occlusion_query static GLboolean _glewInit_GL_ARB_occlusion_query (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glBeginQueryARB = (PFNGLBEGINQUERYARBPROC)glewGetProcAddress((const GLubyte*)"glBeginQueryARB")) == NULL) || r; r = ((glDeleteQueriesARB = (PFNGLDELETEQUERIESARBPROC)glewGetProcAddress((const GLubyte*)"glDeleteQueriesARB")) == NULL) || r; r = ((glEndQueryARB = (PFNGLENDQUERYARBPROC)glewGetProcAddress((const GLubyte*)"glEndQueryARB")) == NULL) || r; r = ((glGenQueriesARB = (PFNGLGENQUERIESARBPROC)glewGetProcAddress((const GLubyte*)"glGenQueriesARB")) == NULL) || r; r = ((glGetQueryObjectivARB = (PFNGLGETQUERYOBJECTIVARBPROC)glewGetProcAddress((const GLubyte*)"glGetQueryObjectivARB")) == NULL) || r; r = ((glGetQueryObjectuivARB = (PFNGLGETQUERYOBJECTUIVARBPROC)glewGetProcAddress((const GLubyte*)"glGetQueryObjectuivARB")) == NULL) || r; r = ((glGetQueryivARB = (PFNGLGETQUERYIVARBPROC)glewGetProcAddress((const GLubyte*)"glGetQueryivARB")) == NULL) || r; r = ((glIsQueryARB = (PFNGLISQUERYARBPROC)glewGetProcAddress((const GLubyte*)"glIsQueryARB")) == NULL) || r; return r; } #endif /* GL_ARB_occlusion_query */ #ifdef GL_ARB_occlusion_query2 #endif /* GL_ARB_occlusion_query2 */ #ifdef GL_ARB_pixel_buffer_object #endif /* GL_ARB_pixel_buffer_object */ #ifdef GL_ARB_point_parameters static GLboolean _glewInit_GL_ARB_point_parameters (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glPointParameterfARB = (PFNGLPOINTPARAMETERFARBPROC)glewGetProcAddress((const GLubyte*)"glPointParameterfARB")) == NULL) || r; r = ((glPointParameterfvARB = (PFNGLPOINTPARAMETERFVARBPROC)glewGetProcAddress((const GLubyte*)"glPointParameterfvARB")) == NULL) || r; return r; } #endif /* GL_ARB_point_parameters */ #ifdef GL_ARB_point_sprite #endif /* GL_ARB_point_sprite */ #ifdef GL_ARB_program_interface_query static GLboolean _glewInit_GL_ARB_program_interface_query (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glGetProgramInterfaceiv = (PFNGLGETPROGRAMINTERFACEIVPROC)glewGetProcAddress((const GLubyte*)"glGetProgramInterfaceiv")) == NULL) || r; r = ((glGetProgramResourceIndex = (PFNGLGETPROGRAMRESOURCEINDEXPROC)glewGetProcAddress((const GLubyte*)"glGetProgramResourceIndex")) == NULL) || r; r = ((glGetProgramResourceLocation = (PFNGLGETPROGRAMRESOURCELOCATIONPROC)glewGetProcAddress((const GLubyte*)"glGetProgramResourceLocation")) == NULL) || r; r = ((glGetProgramResourceLocationIndex = (PFNGLGETPROGRAMRESOURCELOCATIONINDEXPROC)glewGetProcAddress((const GLubyte*)"glGetProgramResourceLocationIndex")) == NULL) || r; r = ((glGetProgramResourceName = (PFNGLGETPROGRAMRESOURCENAMEPROC)glewGetProcAddress((const GLubyte*)"glGetProgramResourceName")) == NULL) || r; r = ((glGetProgramResourceiv = (PFNGLGETPROGRAMRESOURCEIVPROC)glewGetProcAddress((const GLubyte*)"glGetProgramResourceiv")) == NULL) || r; return r; } #endif /* GL_ARB_program_interface_query */ #ifdef GL_ARB_provoking_vertex static GLboolean _glewInit_GL_ARB_provoking_vertex (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glProvokingVertex = (PFNGLPROVOKINGVERTEXPROC)glewGetProcAddress((const GLubyte*)"glProvokingVertex")) == NULL) || r; return r; } #endif /* GL_ARB_provoking_vertex */ #ifdef GL_ARB_robust_buffer_access_behavior #endif /* GL_ARB_robust_buffer_access_behavior */ #ifdef GL_ARB_robustness static GLboolean _glewInit_GL_ARB_robustness (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glGetGraphicsResetStatusARB = (PFNGLGETGRAPHICSRESETSTATUSARBPROC)glewGetProcAddress((const GLubyte*)"glGetGraphicsResetStatusARB")) == NULL) || r; r = ((glGetnColorTableARB = (PFNGLGETNCOLORTABLEARBPROC)glewGetProcAddress((const GLubyte*)"glGetnColorTableARB")) == NULL) || r; r = ((glGetnCompressedTexImageARB = (PFNGLGETNCOMPRESSEDTEXIMAGEARBPROC)glewGetProcAddress((const GLubyte*)"glGetnCompressedTexImageARB")) == NULL) || r; r = ((glGetnConvolutionFilterARB = (PFNGLGETNCONVOLUTIONFILTERARBPROC)glewGetProcAddress((const GLubyte*)"glGetnConvolutionFilterARB")) == NULL) || r; r = ((glGetnHistogramARB = (PFNGLGETNHISTOGRAMARBPROC)glewGetProcAddress((const GLubyte*)"glGetnHistogramARB")) == NULL) || r; r = ((glGetnMapdvARB = (PFNGLGETNMAPDVARBPROC)glewGetProcAddress((const GLubyte*)"glGetnMapdvARB")) == NULL) || r; r = ((glGetnMapfvARB = (PFNGLGETNMAPFVARBPROC)glewGetProcAddress((const GLubyte*)"glGetnMapfvARB")) == NULL) || r; r = ((glGetnMapivARB = (PFNGLGETNMAPIVARBPROC)glewGetProcAddress((const GLubyte*)"glGetnMapivARB")) == NULL) || r; r = ((glGetnMinmaxARB = (PFNGLGETNMINMAXARBPROC)glewGetProcAddress((const GLubyte*)"glGetnMinmaxARB")) == NULL) || r; r = ((glGetnPixelMapfvARB = (PFNGLGETNPIXELMAPFVARBPROC)glewGetProcAddress((const GLubyte*)"glGetnPixelMapfvARB")) == NULL) || r; r = ((glGetnPixelMapuivARB = (PFNGLGETNPIXELMAPUIVARBPROC)glewGetProcAddress((const GLubyte*)"glGetnPixelMapuivARB")) == NULL) || r; r = ((glGetnPixelMapusvARB = (PFNGLGETNPIXELMAPUSVARBPROC)glewGetProcAddress((const GLubyte*)"glGetnPixelMapusvARB")) == NULL) || r; r = ((glGetnPolygonStippleARB = (PFNGLGETNPOLYGONSTIPPLEARBPROC)glewGetProcAddress((const GLubyte*)"glGetnPolygonStippleARB")) == NULL) || r; r = ((glGetnSeparableFilterARB = (PFNGLGETNSEPARABLEFILTERARBPROC)glewGetProcAddress((const GLubyte*)"glGetnSeparableFilterARB")) == NULL) || r; r = ((glGetnTexImageARB = (PFNGLGETNTEXIMAGEARBPROC)glewGetProcAddress((const GLubyte*)"glGetnTexImageARB")) == NULL) || r; r = ((glGetnUniformdvARB = (PFNGLGETNUNIFORMDVARBPROC)glewGetProcAddress((const GLubyte*)"glGetnUniformdvARB")) == NULL) || r; r = ((glGetnUniformfvARB = (PFNGLGETNUNIFORMFVARBPROC)glewGetProcAddress((const GLubyte*)"glGetnUniformfvARB")) == NULL) || r; r = ((glGetnUniformivARB = (PFNGLGETNUNIFORMIVARBPROC)glewGetProcAddress((const GLubyte*)"glGetnUniformivARB")) == NULL) || r; r = ((glGetnUniformuivARB = (PFNGLGETNUNIFORMUIVARBPROC)glewGetProcAddress((const GLubyte*)"glGetnUniformuivARB")) == NULL) || r; r = ((glReadnPixelsARB = (PFNGLREADNPIXELSARBPROC)glewGetProcAddress((const GLubyte*)"glReadnPixelsARB")) == NULL) || r; return r; } #endif /* GL_ARB_robustness */ #ifdef GL_ARB_robustness_application_isolation #endif /* GL_ARB_robustness_application_isolation */ #ifdef GL_ARB_robustness_share_group_isolation #endif /* GL_ARB_robustness_share_group_isolation */ #ifdef GL_ARB_sample_shading static GLboolean _glewInit_GL_ARB_sample_shading (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glMinSampleShadingARB = (PFNGLMINSAMPLESHADINGARBPROC)glewGetProcAddress((const GLubyte*)"glMinSampleShadingARB")) == NULL) || r; return r; } #endif /* GL_ARB_sample_shading */ #ifdef GL_ARB_sampler_objects static GLboolean _glewInit_GL_ARB_sampler_objects (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glBindSampler = (PFNGLBINDSAMPLERPROC)glewGetProcAddress((const GLubyte*)"glBindSampler")) == NULL) || r; r = ((glDeleteSamplers = (PFNGLDELETESAMPLERSPROC)glewGetProcAddress((const GLubyte*)"glDeleteSamplers")) == NULL) || r; r = ((glGenSamplers = (PFNGLGENSAMPLERSPROC)glewGetProcAddress((const GLubyte*)"glGenSamplers")) == NULL) || r; r = ((glGetSamplerParameterIiv = (PFNGLGETSAMPLERPARAMETERIIVPROC)glewGetProcAddress((const GLubyte*)"glGetSamplerParameterIiv")) == NULL) || r; r = ((glGetSamplerParameterIuiv = (PFNGLGETSAMPLERPARAMETERIUIVPROC)glewGetProcAddress((const GLubyte*)"glGetSamplerParameterIuiv")) == NULL) || r; r = ((glGetSamplerParameterfv = (PFNGLGETSAMPLERPARAMETERFVPROC)glewGetProcAddress((const GLubyte*)"glGetSamplerParameterfv")) == NULL) || r; r = ((glGetSamplerParameteriv = (PFNGLGETSAMPLERPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glGetSamplerParameteriv")) == NULL) || r; r = ((glIsSampler = (PFNGLISSAMPLERPROC)glewGetProcAddress((const GLubyte*)"glIsSampler")) == NULL) || r; r = ((glSamplerParameterIiv = (PFNGLSAMPLERPARAMETERIIVPROC)glewGetProcAddress((const GLubyte*)"glSamplerParameterIiv")) == NULL) || r; r = ((glSamplerParameterIuiv = (PFNGLSAMPLERPARAMETERIUIVPROC)glewGetProcAddress((const GLubyte*)"glSamplerParameterIuiv")) == NULL) || r; r = ((glSamplerParameterf = (PFNGLSAMPLERPARAMETERFPROC)glewGetProcAddress((const GLubyte*)"glSamplerParameterf")) == NULL) || r; r = ((glSamplerParameterfv = (PFNGLSAMPLERPARAMETERFVPROC)glewGetProcAddress((const GLubyte*)"glSamplerParameterfv")) == NULL) || r; r = ((glSamplerParameteri = (PFNGLSAMPLERPARAMETERIPROC)glewGetProcAddress((const GLubyte*)"glSamplerParameteri")) == NULL) || r; r = ((glSamplerParameteriv = (PFNGLSAMPLERPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glSamplerParameteriv")) == NULL) || r; return r; } #endif /* GL_ARB_sampler_objects */ #ifdef GL_ARB_seamless_cube_map #endif /* GL_ARB_seamless_cube_map */ #ifdef GL_ARB_separate_shader_objects static GLboolean _glewInit_GL_ARB_separate_shader_objects (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glActiveShaderProgram = (PFNGLACTIVESHADERPROGRAMPROC)glewGetProcAddress((const GLubyte*)"glActiveShaderProgram")) == NULL) || r; r = ((glBindProgramPipeline = (PFNGLBINDPROGRAMPIPELINEPROC)glewGetProcAddress((const GLubyte*)"glBindProgramPipeline")) == NULL) || r; r = ((glCreateShaderProgramv = (PFNGLCREATESHADERPROGRAMVPROC)glewGetProcAddress((const GLubyte*)"glCreateShaderProgramv")) == NULL) || r; r = ((glDeleteProgramPipelines = (PFNGLDELETEPROGRAMPIPELINESPROC)glewGetProcAddress((const GLubyte*)"glDeleteProgramPipelines")) == NULL) || r; r = ((glGenProgramPipelines = (PFNGLGENPROGRAMPIPELINESPROC)glewGetProcAddress((const GLubyte*)"glGenProgramPipelines")) == NULL) || r; r = ((glGetProgramPipelineInfoLog = (PFNGLGETPROGRAMPIPELINEINFOLOGPROC)glewGetProcAddress((const GLubyte*)"glGetProgramPipelineInfoLog")) == NULL) || r; r = ((glGetProgramPipelineiv = (PFNGLGETPROGRAMPIPELINEIVPROC)glewGetProcAddress((const GLubyte*)"glGetProgramPipelineiv")) == NULL) || r; r = ((glIsProgramPipeline = (PFNGLISPROGRAMPIPELINEPROC)glewGetProcAddress((const GLubyte*)"glIsProgramPipeline")) == NULL) || r; r = ((glProgramUniform1d = (PFNGLPROGRAMUNIFORM1DPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1d")) == NULL) || r; r = ((glProgramUniform1dv = (PFNGLPROGRAMUNIFORM1DVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1dv")) == NULL) || r; r = ((glProgramUniform1f = (PFNGLPROGRAMUNIFORM1FPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1f")) == NULL) || r; r = ((glProgramUniform1fv = (PFNGLPROGRAMUNIFORM1FVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1fv")) == NULL) || r; r = ((glProgramUniform1i = (PFNGLPROGRAMUNIFORM1IPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1i")) == NULL) || r; r = ((glProgramUniform1iv = (PFNGLPROGRAMUNIFORM1IVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1iv")) == NULL) || r; r = ((glProgramUniform1ui = (PFNGLPROGRAMUNIFORM1UIPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1ui")) == NULL) || r; r = ((glProgramUniform1uiv = (PFNGLPROGRAMUNIFORM1UIVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1uiv")) == NULL) || r; r = ((glProgramUniform2d = (PFNGLPROGRAMUNIFORM2DPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2d")) == NULL) || r; r = ((glProgramUniform2dv = (PFNGLPROGRAMUNIFORM2DVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2dv")) == NULL) || r; r = ((glProgramUniform2f = (PFNGLPROGRAMUNIFORM2FPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2f")) == NULL) || r; r = ((glProgramUniform2fv = (PFNGLPROGRAMUNIFORM2FVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2fv")) == NULL) || r; r = ((glProgramUniform2i = (PFNGLPROGRAMUNIFORM2IPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2i")) == NULL) || r; r = ((glProgramUniform2iv = (PFNGLPROGRAMUNIFORM2IVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2iv")) == NULL) || r; r = ((glProgramUniform2ui = (PFNGLPROGRAMUNIFORM2UIPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2ui")) == NULL) || r; r = ((glProgramUniform2uiv = (PFNGLPROGRAMUNIFORM2UIVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2uiv")) == NULL) || r; r = ((glProgramUniform3d = (PFNGLPROGRAMUNIFORM3DPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3d")) == NULL) || r; r = ((glProgramUniform3dv = (PFNGLPROGRAMUNIFORM3DVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3dv")) == NULL) || r; r = ((glProgramUniform3f = (PFNGLPROGRAMUNIFORM3FPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3f")) == NULL) || r; r = ((glProgramUniform3fv = (PFNGLPROGRAMUNIFORM3FVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3fv")) == NULL) || r; r = ((glProgramUniform3i = (PFNGLPROGRAMUNIFORM3IPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3i")) == NULL) || r; r = ((glProgramUniform3iv = (PFNGLPROGRAMUNIFORM3IVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3iv")) == NULL) || r; r = ((glProgramUniform3ui = (PFNGLPROGRAMUNIFORM3UIPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3ui")) == NULL) || r; r = ((glProgramUniform3uiv = (PFNGLPROGRAMUNIFORM3UIVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3uiv")) == NULL) || r; r = ((glProgramUniform4d = (PFNGLPROGRAMUNIFORM4DPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4d")) == NULL) || r; r = ((glProgramUniform4dv = (PFNGLPROGRAMUNIFORM4DVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4dv")) == NULL) || r; r = ((glProgramUniform4f = (PFNGLPROGRAMUNIFORM4FPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4f")) == NULL) || r; r = ((glProgramUniform4fv = (PFNGLPROGRAMUNIFORM4FVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4fv")) == NULL) || r; r = ((glProgramUniform4i = (PFNGLPROGRAMUNIFORM4IPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4i")) == NULL) || r; r = ((glProgramUniform4iv = (PFNGLPROGRAMUNIFORM4IVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4iv")) == NULL) || r; r = ((glProgramUniform4ui = (PFNGLPROGRAMUNIFORM4UIPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4ui")) == NULL) || r; r = ((glProgramUniform4uiv = (PFNGLPROGRAMUNIFORM4UIVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4uiv")) == NULL) || r; r = ((glProgramUniformMatrix2dv = (PFNGLPROGRAMUNIFORMMATRIX2DVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix2dv")) == NULL) || r; r = ((glProgramUniformMatrix2fv = (PFNGLPROGRAMUNIFORMMATRIX2FVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix2fv")) == NULL) || r; r = ((glProgramUniformMatrix2x3dv = (PFNGLPROGRAMUNIFORMMATRIX2X3DVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix2x3dv")) == NULL) || r; r = ((glProgramUniformMatrix2x3fv = (PFNGLPROGRAMUNIFORMMATRIX2X3FVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix2x3fv")) == NULL) || r; r = ((glProgramUniformMatrix2x4dv = (PFNGLPROGRAMUNIFORMMATRIX2X4DVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix2x4dv")) == NULL) || r; r = ((glProgramUniformMatrix2x4fv = (PFNGLPROGRAMUNIFORMMATRIX2X4FVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix2x4fv")) == NULL) || r; r = ((glProgramUniformMatrix3dv = (PFNGLPROGRAMUNIFORMMATRIX3DVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix3dv")) == NULL) || r; r = ((glProgramUniformMatrix3fv = (PFNGLPROGRAMUNIFORMMATRIX3FVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix3fv")) == NULL) || r; r = ((glProgramUniformMatrix3x2dv = (PFNGLPROGRAMUNIFORMMATRIX3X2DVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix3x2dv")) == NULL) || r; r = ((glProgramUniformMatrix3x2fv = (PFNGLPROGRAMUNIFORMMATRIX3X2FVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix3x2fv")) == NULL) || r; r = ((glProgramUniformMatrix3x4dv = (PFNGLPROGRAMUNIFORMMATRIX3X4DVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix3x4dv")) == NULL) || r; r = ((glProgramUniformMatrix3x4fv = (PFNGLPROGRAMUNIFORMMATRIX3X4FVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix3x4fv")) == NULL) || r; r = ((glProgramUniformMatrix4dv = (PFNGLPROGRAMUNIFORMMATRIX4DVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix4dv")) == NULL) || r; r = ((glProgramUniformMatrix4fv = (PFNGLPROGRAMUNIFORMMATRIX4FVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix4fv")) == NULL) || r; r = ((glProgramUniformMatrix4x2dv = (PFNGLPROGRAMUNIFORMMATRIX4X2DVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix4x2dv")) == NULL) || r; r = ((glProgramUniformMatrix4x2fv = (PFNGLPROGRAMUNIFORMMATRIX4X2FVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix4x2fv")) == NULL) || r; r = ((glProgramUniformMatrix4x3dv = (PFNGLPROGRAMUNIFORMMATRIX4X3DVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix4x3dv")) == NULL) || r; r = ((glProgramUniformMatrix4x3fv = (PFNGLPROGRAMUNIFORMMATRIX4X3FVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix4x3fv")) == NULL) || r; r = ((glUseProgramStages = (PFNGLUSEPROGRAMSTAGESPROC)glewGetProcAddress((const GLubyte*)"glUseProgramStages")) == NULL) || r; r = ((glValidateProgramPipeline = (PFNGLVALIDATEPROGRAMPIPELINEPROC)glewGetProcAddress((const GLubyte*)"glValidateProgramPipeline")) == NULL) || r; return r; } #endif /* GL_ARB_separate_shader_objects */ #ifdef GL_ARB_shader_atomic_counters static GLboolean _glewInit_GL_ARB_shader_atomic_counters (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glGetActiveAtomicCounterBufferiv = (PFNGLGETACTIVEATOMICCOUNTERBUFFERIVPROC)glewGetProcAddress((const GLubyte*)"glGetActiveAtomicCounterBufferiv")) == NULL) || r; return r; } #endif /* GL_ARB_shader_atomic_counters */ #ifdef GL_ARB_shader_bit_encoding #endif /* GL_ARB_shader_bit_encoding */ #ifdef GL_ARB_shader_image_load_store static GLboolean _glewInit_GL_ARB_shader_image_load_store (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glBindImageTexture = (PFNGLBINDIMAGETEXTUREPROC)glewGetProcAddress((const GLubyte*)"glBindImageTexture")) == NULL) || r; r = ((glMemoryBarrier = (PFNGLMEMORYBARRIERPROC)glewGetProcAddress((const GLubyte*)"glMemoryBarrier")) == NULL) || r; return r; } #endif /* GL_ARB_shader_image_load_store */ #ifdef GL_ARB_shader_image_size #endif /* GL_ARB_shader_image_size */ #ifdef GL_ARB_shader_objects static GLboolean _glewInit_GL_ARB_shader_objects (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glAttachObjectARB = (PFNGLATTACHOBJECTARBPROC)glewGetProcAddress((const GLubyte*)"glAttachObjectARB")) == NULL) || r; r = ((glCompileShaderARB = (PFNGLCOMPILESHADERARBPROC)glewGetProcAddress((const GLubyte*)"glCompileShaderARB")) == NULL) || r; r = ((glCreateProgramObjectARB = (PFNGLCREATEPROGRAMOBJECTARBPROC)glewGetProcAddress((const GLubyte*)"glCreateProgramObjectARB")) == NULL) || r; r = ((glCreateShaderObjectARB = (PFNGLCREATESHADEROBJECTARBPROC)glewGetProcAddress((const GLubyte*)"glCreateShaderObjectARB")) == NULL) || r; r = ((glDeleteObjectARB = (PFNGLDELETEOBJECTARBPROC)glewGetProcAddress((const GLubyte*)"glDeleteObjectARB")) == NULL) || r; r = ((glDetachObjectARB = (PFNGLDETACHOBJECTARBPROC)glewGetProcAddress((const GLubyte*)"glDetachObjectARB")) == NULL) || r; r = ((glGetActiveUniformARB = (PFNGLGETACTIVEUNIFORMARBPROC)glewGetProcAddress((const GLubyte*)"glGetActiveUniformARB")) == NULL) || r; r = ((glGetAttachedObjectsARB = (PFNGLGETATTACHEDOBJECTSARBPROC)glewGetProcAddress((const GLubyte*)"glGetAttachedObjectsARB")) == NULL) || r; r = ((glGetHandleARB = (PFNGLGETHANDLEARBPROC)glewGetProcAddress((const GLubyte*)"glGetHandleARB")) == NULL) || r; r = ((glGetInfoLogARB = (PFNGLGETINFOLOGARBPROC)glewGetProcAddress((const GLubyte*)"glGetInfoLogARB")) == NULL) || r; r = ((glGetObjectParameterfvARB = (PFNGLGETOBJECTPARAMETERFVARBPROC)glewGetProcAddress((const GLubyte*)"glGetObjectParameterfvARB")) == NULL) || r; r = ((glGetObjectParameterivARB = (PFNGLGETOBJECTPARAMETERIVARBPROC)glewGetProcAddress((const GLubyte*)"glGetObjectParameterivARB")) == NULL) || r; r = ((glGetShaderSourceARB = (PFNGLGETSHADERSOURCEARBPROC)glewGetProcAddress((const GLubyte*)"glGetShaderSourceARB")) == NULL) || r; r = ((glGetUniformLocationARB = (PFNGLGETUNIFORMLOCATIONARBPROC)glewGetProcAddress((const GLubyte*)"glGetUniformLocationARB")) == NULL) || r; r = ((glGetUniformfvARB = (PFNGLGETUNIFORMFVARBPROC)glewGetProcAddress((const GLubyte*)"glGetUniformfvARB")) == NULL) || r; r = ((glGetUniformivARB = (PFNGLGETUNIFORMIVARBPROC)glewGetProcAddress((const GLubyte*)"glGetUniformivARB")) == NULL) || r; r = ((glLinkProgramARB = (PFNGLLINKPROGRAMARBPROC)glewGetProcAddress((const GLubyte*)"glLinkProgramARB")) == NULL) || r; r = ((glShaderSourceARB = (PFNGLSHADERSOURCEARBPROC)glewGetProcAddress((const GLubyte*)"glShaderSourceARB")) == NULL) || r; r = ((glUniform1fARB = (PFNGLUNIFORM1FARBPROC)glewGetProcAddress((const GLubyte*)"glUniform1fARB")) == NULL) || r; r = ((glUniform1fvARB = (PFNGLUNIFORM1FVARBPROC)glewGetProcAddress((const GLubyte*)"glUniform1fvARB")) == NULL) || r; r = ((glUniform1iARB = (PFNGLUNIFORM1IARBPROC)glewGetProcAddress((const GLubyte*)"glUniform1iARB")) == NULL) || r; r = ((glUniform1ivARB = (PFNGLUNIFORM1IVARBPROC)glewGetProcAddress((const GLubyte*)"glUniform1ivARB")) == NULL) || r; r = ((glUniform2fARB = (PFNGLUNIFORM2FARBPROC)glewGetProcAddress((const GLubyte*)"glUniform2fARB")) == NULL) || r; r = ((glUniform2fvARB = (PFNGLUNIFORM2FVARBPROC)glewGetProcAddress((const GLubyte*)"glUniform2fvARB")) == NULL) || r; r = ((glUniform2iARB = (PFNGLUNIFORM2IARBPROC)glewGetProcAddress((const GLubyte*)"glUniform2iARB")) == NULL) || r; r = ((glUniform2ivARB = (PFNGLUNIFORM2IVARBPROC)glewGetProcAddress((const GLubyte*)"glUniform2ivARB")) == NULL) || r; r = ((glUniform3fARB = (PFNGLUNIFORM3FARBPROC)glewGetProcAddress((const GLubyte*)"glUniform3fARB")) == NULL) || r; r = ((glUniform3fvARB = (PFNGLUNIFORM3FVARBPROC)glewGetProcAddress((const GLubyte*)"glUniform3fvARB")) == NULL) || r; r = ((glUniform3iARB = (PFNGLUNIFORM3IARBPROC)glewGetProcAddress((const GLubyte*)"glUniform3iARB")) == NULL) || r; r = ((glUniform3ivARB = (PFNGLUNIFORM3IVARBPROC)glewGetProcAddress((const GLubyte*)"glUniform3ivARB")) == NULL) || r; r = ((glUniform4fARB = (PFNGLUNIFORM4FARBPROC)glewGetProcAddress((const GLubyte*)"glUniform4fARB")) == NULL) || r; r = ((glUniform4fvARB = (PFNGLUNIFORM4FVARBPROC)glewGetProcAddress((const GLubyte*)"glUniform4fvARB")) == NULL) || r; r = ((glUniform4iARB = (PFNGLUNIFORM4IARBPROC)glewGetProcAddress((const GLubyte*)"glUniform4iARB")) == NULL) || r; r = ((glUniform4ivARB = (PFNGLUNIFORM4IVARBPROC)glewGetProcAddress((const GLubyte*)"glUniform4ivARB")) == NULL) || r; r = ((glUniformMatrix2fvARB = (PFNGLUNIFORMMATRIX2FVARBPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix2fvARB")) == NULL) || r; r = ((glUniformMatrix3fvARB = (PFNGLUNIFORMMATRIX3FVARBPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix3fvARB")) == NULL) || r; r = ((glUniformMatrix4fvARB = (PFNGLUNIFORMMATRIX4FVARBPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix4fvARB")) == NULL) || r; r = ((glUseProgramObjectARB = (PFNGLUSEPROGRAMOBJECTARBPROC)glewGetProcAddress((const GLubyte*)"glUseProgramObjectARB")) == NULL) || r; r = ((glValidateProgramARB = (PFNGLVALIDATEPROGRAMARBPROC)glewGetProcAddress((const GLubyte*)"glValidateProgramARB")) == NULL) || r; return r; } #endif /* GL_ARB_shader_objects */ #ifdef GL_ARB_shader_precision #endif /* GL_ARB_shader_precision */ #ifdef GL_ARB_shader_stencil_export #endif /* GL_ARB_shader_stencil_export */ #ifdef GL_ARB_shader_storage_buffer_object static GLboolean _glewInit_GL_ARB_shader_storage_buffer_object (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glShaderStorageBlockBinding = (PFNGLSHADERSTORAGEBLOCKBINDINGPROC)glewGetProcAddress((const GLubyte*)"glShaderStorageBlockBinding")) == NULL) || r; return r; } #endif /* GL_ARB_shader_storage_buffer_object */ #ifdef GL_ARB_shader_subroutine static GLboolean _glewInit_GL_ARB_shader_subroutine (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glGetActiveSubroutineName = (PFNGLGETACTIVESUBROUTINENAMEPROC)glewGetProcAddress((const GLubyte*)"glGetActiveSubroutineName")) == NULL) || r; r = ((glGetActiveSubroutineUniformName = (PFNGLGETACTIVESUBROUTINEUNIFORMNAMEPROC)glewGetProcAddress((const GLubyte*)"glGetActiveSubroutineUniformName")) == NULL) || r; r = ((glGetActiveSubroutineUniformiv = (PFNGLGETACTIVESUBROUTINEUNIFORMIVPROC)glewGetProcAddress((const GLubyte*)"glGetActiveSubroutineUniformiv")) == NULL) || r; r = ((glGetProgramStageiv = (PFNGLGETPROGRAMSTAGEIVPROC)glewGetProcAddress((const GLubyte*)"glGetProgramStageiv")) == NULL) || r; r = ((glGetSubroutineIndex = (PFNGLGETSUBROUTINEINDEXPROC)glewGetProcAddress((const GLubyte*)"glGetSubroutineIndex")) == NULL) || r; r = ((glGetSubroutineUniformLocation = (PFNGLGETSUBROUTINEUNIFORMLOCATIONPROC)glewGetProcAddress((const GLubyte*)"glGetSubroutineUniformLocation")) == NULL) || r; r = ((glGetUniformSubroutineuiv = (PFNGLGETUNIFORMSUBROUTINEUIVPROC)glewGetProcAddress((const GLubyte*)"glGetUniformSubroutineuiv")) == NULL) || r; r = ((glUniformSubroutinesuiv = (PFNGLUNIFORMSUBROUTINESUIVPROC)glewGetProcAddress((const GLubyte*)"glUniformSubroutinesuiv")) == NULL) || r; return r; } #endif /* GL_ARB_shader_subroutine */ #ifdef GL_ARB_shader_texture_lod #endif /* GL_ARB_shader_texture_lod */ #ifdef GL_ARB_shading_language_100 #endif /* GL_ARB_shading_language_100 */ #ifdef GL_ARB_shading_language_420pack #endif /* GL_ARB_shading_language_420pack */ #ifdef GL_ARB_shading_language_include static GLboolean _glewInit_GL_ARB_shading_language_include (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glCompileShaderIncludeARB = (PFNGLCOMPILESHADERINCLUDEARBPROC)glewGetProcAddress((const GLubyte*)"glCompileShaderIncludeARB")) == NULL) || r; r = ((glDeleteNamedStringARB = (PFNGLDELETENAMEDSTRINGARBPROC)glewGetProcAddress((const GLubyte*)"glDeleteNamedStringARB")) == NULL) || r; r = ((glGetNamedStringARB = (PFNGLGETNAMEDSTRINGARBPROC)glewGetProcAddress((const GLubyte*)"glGetNamedStringARB")) == NULL) || r; r = ((glGetNamedStringivARB = (PFNGLGETNAMEDSTRINGIVARBPROC)glewGetProcAddress((const GLubyte*)"glGetNamedStringivARB")) == NULL) || r; r = ((glIsNamedStringARB = (PFNGLISNAMEDSTRINGARBPROC)glewGetProcAddress((const GLubyte*)"glIsNamedStringARB")) == NULL) || r; r = ((glNamedStringARB = (PFNGLNAMEDSTRINGARBPROC)glewGetProcAddress((const GLubyte*)"glNamedStringARB")) == NULL) || r; return r; } #endif /* GL_ARB_shading_language_include */ #ifdef GL_ARB_shading_language_packing #endif /* GL_ARB_shading_language_packing */ #ifdef GL_ARB_shadow #endif /* GL_ARB_shadow */ #ifdef GL_ARB_shadow_ambient #endif /* GL_ARB_shadow_ambient */ #ifdef GL_ARB_stencil_texturing #endif /* GL_ARB_stencil_texturing */ #ifdef GL_ARB_sync static GLboolean _glewInit_GL_ARB_sync (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glClientWaitSync = (PFNGLCLIENTWAITSYNCPROC)glewGetProcAddress((const GLubyte*)"glClientWaitSync")) == NULL) || r; r = ((glDeleteSync = (PFNGLDELETESYNCPROC)glewGetProcAddress((const GLubyte*)"glDeleteSync")) == NULL) || r; r = ((glFenceSync = (PFNGLFENCESYNCPROC)glewGetProcAddress((const GLubyte*)"glFenceSync")) == NULL) || r; r = ((glGetInteger64v = (PFNGLGETINTEGER64VPROC)glewGetProcAddress((const GLubyte*)"glGetInteger64v")) == NULL) || r; r = ((glGetSynciv = (PFNGLGETSYNCIVPROC)glewGetProcAddress((const GLubyte*)"glGetSynciv")) == NULL) || r; r = ((glIsSync = (PFNGLISSYNCPROC)glewGetProcAddress((const GLubyte*)"glIsSync")) == NULL) || r; r = ((glWaitSync = (PFNGLWAITSYNCPROC)glewGetProcAddress((const GLubyte*)"glWaitSync")) == NULL) || r; return r; } #endif /* GL_ARB_sync */ #ifdef GL_ARB_tessellation_shader static GLboolean _glewInit_GL_ARB_tessellation_shader (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glPatchParameterfv = (PFNGLPATCHPARAMETERFVPROC)glewGetProcAddress((const GLubyte*)"glPatchParameterfv")) == NULL) || r; r = ((glPatchParameteri = (PFNGLPATCHPARAMETERIPROC)glewGetProcAddress((const GLubyte*)"glPatchParameteri")) == NULL) || r; return r; } #endif /* GL_ARB_tessellation_shader */ #ifdef GL_ARB_texture_border_clamp #endif /* GL_ARB_texture_border_clamp */ #ifdef GL_ARB_texture_buffer_object static GLboolean _glewInit_GL_ARB_texture_buffer_object (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glTexBufferARB = (PFNGLTEXBUFFERARBPROC)glewGetProcAddress((const GLubyte*)"glTexBufferARB")) == NULL) || r; return r; } #endif /* GL_ARB_texture_buffer_object */ #ifdef GL_ARB_texture_buffer_object_rgb32 #endif /* GL_ARB_texture_buffer_object_rgb32 */ #ifdef GL_ARB_texture_buffer_range static GLboolean _glewInit_GL_ARB_texture_buffer_range (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glTexBufferRange = (PFNGLTEXBUFFERRANGEPROC)glewGetProcAddress((const GLubyte*)"glTexBufferRange")) == NULL) || r; r = ((glTextureBufferRangeEXT = (PFNGLTEXTUREBUFFERRANGEEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureBufferRangeEXT")) == NULL) || r; return r; } #endif /* GL_ARB_texture_buffer_range */ #ifdef GL_ARB_texture_compression static GLboolean _glewInit_GL_ARB_texture_compression (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glCompressedTexImage1DARB = (PFNGLCOMPRESSEDTEXIMAGE1DARBPROC)glewGetProcAddress((const GLubyte*)"glCompressedTexImage1DARB")) == NULL) || r; r = ((glCompressedTexImage2DARB = (PFNGLCOMPRESSEDTEXIMAGE2DARBPROC)glewGetProcAddress((const GLubyte*)"glCompressedTexImage2DARB")) == NULL) || r; r = ((glCompressedTexImage3DARB = (PFNGLCOMPRESSEDTEXIMAGE3DARBPROC)glewGetProcAddress((const GLubyte*)"glCompressedTexImage3DARB")) == NULL) || r; r = ((glCompressedTexSubImage1DARB = (PFNGLCOMPRESSEDTEXSUBIMAGE1DARBPROC)glewGetProcAddress((const GLubyte*)"glCompressedTexSubImage1DARB")) == NULL) || r; r = ((glCompressedTexSubImage2DARB = (PFNGLCOMPRESSEDTEXSUBIMAGE2DARBPROC)glewGetProcAddress((const GLubyte*)"glCompressedTexSubImage2DARB")) == NULL) || r; r = ((glCompressedTexSubImage3DARB = (PFNGLCOMPRESSEDTEXSUBIMAGE3DARBPROC)glewGetProcAddress((const GLubyte*)"glCompressedTexSubImage3DARB")) == NULL) || r; r = ((glGetCompressedTexImageARB = (PFNGLGETCOMPRESSEDTEXIMAGEARBPROC)glewGetProcAddress((const GLubyte*)"glGetCompressedTexImageARB")) == NULL) || r; return r; } #endif /* GL_ARB_texture_compression */ #ifdef GL_ARB_texture_compression_bptc #endif /* GL_ARB_texture_compression_bptc */ #ifdef GL_ARB_texture_compression_rgtc #endif /* GL_ARB_texture_compression_rgtc */ #ifdef GL_ARB_texture_cube_map #endif /* GL_ARB_texture_cube_map */ #ifdef GL_ARB_texture_cube_map_array #endif /* GL_ARB_texture_cube_map_array */ #ifdef GL_ARB_texture_env_add #endif /* GL_ARB_texture_env_add */ #ifdef GL_ARB_texture_env_combine #endif /* GL_ARB_texture_env_combine */ #ifdef GL_ARB_texture_env_crossbar #endif /* GL_ARB_texture_env_crossbar */ #ifdef GL_ARB_texture_env_dot3 #endif /* GL_ARB_texture_env_dot3 */ #ifdef GL_ARB_texture_float #endif /* GL_ARB_texture_float */ #ifdef GL_ARB_texture_gather #endif /* GL_ARB_texture_gather */ #ifdef GL_ARB_texture_mirrored_repeat #endif /* GL_ARB_texture_mirrored_repeat */ #ifdef GL_ARB_texture_multisample static GLboolean _glewInit_GL_ARB_texture_multisample (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glGetMultisamplefv = (PFNGLGETMULTISAMPLEFVPROC)glewGetProcAddress((const GLubyte*)"glGetMultisamplefv")) == NULL) || r; r = ((glSampleMaski = (PFNGLSAMPLEMASKIPROC)glewGetProcAddress((const GLubyte*)"glSampleMaski")) == NULL) || r; r = ((glTexImage2DMultisample = (PFNGLTEXIMAGE2DMULTISAMPLEPROC)glewGetProcAddress((const GLubyte*)"glTexImage2DMultisample")) == NULL) || r; r = ((glTexImage3DMultisample = (PFNGLTEXIMAGE3DMULTISAMPLEPROC)glewGetProcAddress((const GLubyte*)"glTexImage3DMultisample")) == NULL) || r; return r; } #endif /* GL_ARB_texture_multisample */ #ifdef GL_ARB_texture_non_power_of_two #endif /* GL_ARB_texture_non_power_of_two */ #ifdef GL_ARB_texture_query_levels #endif /* GL_ARB_texture_query_levels */ #ifdef GL_ARB_texture_query_lod #endif /* GL_ARB_texture_query_lod */ #ifdef GL_ARB_texture_rectangle #endif /* GL_ARB_texture_rectangle */ #ifdef GL_ARB_texture_rg #endif /* GL_ARB_texture_rg */ #ifdef GL_ARB_texture_rgb10_a2ui #endif /* GL_ARB_texture_rgb10_a2ui */ #ifdef GL_ARB_texture_storage static GLboolean _glewInit_GL_ARB_texture_storage (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glTexStorage1D = (PFNGLTEXSTORAGE1DPROC)glewGetProcAddress((const GLubyte*)"glTexStorage1D")) == NULL) || r; r = ((glTexStorage2D = (PFNGLTEXSTORAGE2DPROC)glewGetProcAddress((const GLubyte*)"glTexStorage2D")) == NULL) || r; r = ((glTexStorage3D = (PFNGLTEXSTORAGE3DPROC)glewGetProcAddress((const GLubyte*)"glTexStorage3D")) == NULL) || r; r = ((glTextureStorage1DEXT = (PFNGLTEXTURESTORAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureStorage1DEXT")) == NULL) || r; r = ((glTextureStorage2DEXT = (PFNGLTEXTURESTORAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureStorage2DEXT")) == NULL) || r; r = ((glTextureStorage3DEXT = (PFNGLTEXTURESTORAGE3DEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureStorage3DEXT")) == NULL) || r; return r; } #endif /* GL_ARB_texture_storage */ #ifdef GL_ARB_texture_storage_multisample static GLboolean _glewInit_GL_ARB_texture_storage_multisample (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glTexStorage2DMultisample = (PFNGLTEXSTORAGE2DMULTISAMPLEPROC)glewGetProcAddress((const GLubyte*)"glTexStorage2DMultisample")) == NULL) || r; r = ((glTexStorage3DMultisample = (PFNGLTEXSTORAGE3DMULTISAMPLEPROC)glewGetProcAddress((const GLubyte*)"glTexStorage3DMultisample")) == NULL) || r; r = ((glTextureStorage2DMultisampleEXT = (PFNGLTEXTURESTORAGE2DMULTISAMPLEEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureStorage2DMultisampleEXT")) == NULL) || r; r = ((glTextureStorage3DMultisampleEXT = (PFNGLTEXTURESTORAGE3DMULTISAMPLEEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureStorage3DMultisampleEXT")) == NULL) || r; return r; } #endif /* GL_ARB_texture_storage_multisample */ #ifdef GL_ARB_texture_swizzle #endif /* GL_ARB_texture_swizzle */ #ifdef GL_ARB_texture_view static GLboolean _glewInit_GL_ARB_texture_view (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glTextureView = (PFNGLTEXTUREVIEWPROC)glewGetProcAddress((const GLubyte*)"glTextureView")) == NULL) || r; return r; } #endif /* GL_ARB_texture_view */ #ifdef GL_ARB_timer_query static GLboolean _glewInit_GL_ARB_timer_query (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glGetQueryObjecti64v = (PFNGLGETQUERYOBJECTI64VPROC)glewGetProcAddress((const GLubyte*)"glGetQueryObjecti64v")) == NULL) || r; r = ((glGetQueryObjectui64v = (PFNGLGETQUERYOBJECTUI64VPROC)glewGetProcAddress((const GLubyte*)"glGetQueryObjectui64v")) == NULL) || r; r = ((glQueryCounter = (PFNGLQUERYCOUNTERPROC)glewGetProcAddress((const GLubyte*)"glQueryCounter")) == NULL) || r; return r; } #endif /* GL_ARB_timer_query */ #ifdef GL_ARB_transform_feedback2 static GLboolean _glewInit_GL_ARB_transform_feedback2 (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glBindTransformFeedback = (PFNGLBINDTRANSFORMFEEDBACKPROC)glewGetProcAddress((const GLubyte*)"glBindTransformFeedback")) == NULL) || r; r = ((glDeleteTransformFeedbacks = (PFNGLDELETETRANSFORMFEEDBACKSPROC)glewGetProcAddress((const GLubyte*)"glDeleteTransformFeedbacks")) == NULL) || r; r = ((glDrawTransformFeedback = (PFNGLDRAWTRANSFORMFEEDBACKPROC)glewGetProcAddress((const GLubyte*)"glDrawTransformFeedback")) == NULL) || r; r = ((glGenTransformFeedbacks = (PFNGLGENTRANSFORMFEEDBACKSPROC)glewGetProcAddress((const GLubyte*)"glGenTransformFeedbacks")) == NULL) || r; r = ((glIsTransformFeedback = (PFNGLISTRANSFORMFEEDBACKPROC)glewGetProcAddress((const GLubyte*)"glIsTransformFeedback")) == NULL) || r; r = ((glPauseTransformFeedback = (PFNGLPAUSETRANSFORMFEEDBACKPROC)glewGetProcAddress((const GLubyte*)"glPauseTransformFeedback")) == NULL) || r; r = ((glResumeTransformFeedback = (PFNGLRESUMETRANSFORMFEEDBACKPROC)glewGetProcAddress((const GLubyte*)"glResumeTransformFeedback")) == NULL) || r; return r; } #endif /* GL_ARB_transform_feedback2 */ #ifdef GL_ARB_transform_feedback3 static GLboolean _glewInit_GL_ARB_transform_feedback3 (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glBeginQueryIndexed = (PFNGLBEGINQUERYINDEXEDPROC)glewGetProcAddress((const GLubyte*)"glBeginQueryIndexed")) == NULL) || r; r = ((glDrawTransformFeedbackStream = (PFNGLDRAWTRANSFORMFEEDBACKSTREAMPROC)glewGetProcAddress((const GLubyte*)"glDrawTransformFeedbackStream")) == NULL) || r; r = ((glEndQueryIndexed = (PFNGLENDQUERYINDEXEDPROC)glewGetProcAddress((const GLubyte*)"glEndQueryIndexed")) == NULL) || r; r = ((glGetQueryIndexediv = (PFNGLGETQUERYINDEXEDIVPROC)glewGetProcAddress((const GLubyte*)"glGetQueryIndexediv")) == NULL) || r; return r; } #endif /* GL_ARB_transform_feedback3 */ #ifdef GL_ARB_transform_feedback_instanced static GLboolean _glewInit_GL_ARB_transform_feedback_instanced (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glDrawTransformFeedbackInstanced = (PFNGLDRAWTRANSFORMFEEDBACKINSTANCEDPROC)glewGetProcAddress((const GLubyte*)"glDrawTransformFeedbackInstanced")) == NULL) || r; r = ((glDrawTransformFeedbackStreamInstanced = (PFNGLDRAWTRANSFORMFEEDBACKSTREAMINSTANCEDPROC)glewGetProcAddress((const GLubyte*)"glDrawTransformFeedbackStreamInstanced")) == NULL) || r; return r; } #endif /* GL_ARB_transform_feedback_instanced */ #ifdef GL_ARB_transpose_matrix static GLboolean _glewInit_GL_ARB_transpose_matrix (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glLoadTransposeMatrixdARB = (PFNGLLOADTRANSPOSEMATRIXDARBPROC)glewGetProcAddress((const GLubyte*)"glLoadTransposeMatrixdARB")) == NULL) || r; r = ((glLoadTransposeMatrixfARB = (PFNGLLOADTRANSPOSEMATRIXFARBPROC)glewGetProcAddress((const GLubyte*)"glLoadTransposeMatrixfARB")) == NULL) || r; r = ((glMultTransposeMatrixdARB = (PFNGLMULTTRANSPOSEMATRIXDARBPROC)glewGetProcAddress((const GLubyte*)"glMultTransposeMatrixdARB")) == NULL) || r; r = ((glMultTransposeMatrixfARB = (PFNGLMULTTRANSPOSEMATRIXFARBPROC)glewGetProcAddress((const GLubyte*)"glMultTransposeMatrixfARB")) == NULL) || r; return r; } #endif /* GL_ARB_transpose_matrix */ #ifdef GL_ARB_uniform_buffer_object static GLboolean _glewInit_GL_ARB_uniform_buffer_object (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glBindBufferBase = (PFNGLBINDBUFFERBASEPROC)glewGetProcAddress((const GLubyte*)"glBindBufferBase")) == NULL) || r; r = ((glBindBufferRange = (PFNGLBINDBUFFERRANGEPROC)glewGetProcAddress((const GLubyte*)"glBindBufferRange")) == NULL) || r; r = ((glGetActiveUniformBlockName = (PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC)glewGetProcAddress((const GLubyte*)"glGetActiveUniformBlockName")) == NULL) || r; r = ((glGetActiveUniformBlockiv = (PFNGLGETACTIVEUNIFORMBLOCKIVPROC)glewGetProcAddress((const GLubyte*)"glGetActiveUniformBlockiv")) == NULL) || r; r = ((glGetActiveUniformName = (PFNGLGETACTIVEUNIFORMNAMEPROC)glewGetProcAddress((const GLubyte*)"glGetActiveUniformName")) == NULL) || r; r = ((glGetActiveUniformsiv = (PFNGLGETACTIVEUNIFORMSIVPROC)glewGetProcAddress((const GLubyte*)"glGetActiveUniformsiv")) == NULL) || r; r = ((glGetIntegeri_v = (PFNGLGETINTEGERI_VPROC)glewGetProcAddress((const GLubyte*)"glGetIntegeri_v")) == NULL) || r; r = ((glGetUniformBlockIndex = (PFNGLGETUNIFORMBLOCKINDEXPROC)glewGetProcAddress((const GLubyte*)"glGetUniformBlockIndex")) == NULL) || r; r = ((glGetUniformIndices = (PFNGLGETUNIFORMINDICESPROC)glewGetProcAddress((const GLubyte*)"glGetUniformIndices")) == NULL) || r; r = ((glUniformBlockBinding = (PFNGLUNIFORMBLOCKBINDINGPROC)glewGetProcAddress((const GLubyte*)"glUniformBlockBinding")) == NULL) || r; return r; } #endif /* GL_ARB_uniform_buffer_object */ #ifdef GL_ARB_vertex_array_bgra #endif /* GL_ARB_vertex_array_bgra */ #ifdef GL_ARB_vertex_array_object static GLboolean _glewInit_GL_ARB_vertex_array_object (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glBindVertexArray = (PFNGLBINDVERTEXARRAYPROC)glewGetProcAddress((const GLubyte*)"glBindVertexArray")) == NULL) || r; r = ((glDeleteVertexArrays = (PFNGLDELETEVERTEXARRAYSPROC)glewGetProcAddress((const GLubyte*)"glDeleteVertexArrays")) == NULL) || r; r = ((glGenVertexArrays = (PFNGLGENVERTEXARRAYSPROC)glewGetProcAddress((const GLubyte*)"glGenVertexArrays")) == NULL) || r; r = ((glIsVertexArray = (PFNGLISVERTEXARRAYPROC)glewGetProcAddress((const GLubyte*)"glIsVertexArray")) == NULL) || r; return r; } #endif /* GL_ARB_vertex_array_object */ #ifdef GL_ARB_vertex_attrib_64bit static GLboolean _glewInit_GL_ARB_vertex_attrib_64bit (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glGetVertexAttribLdv = (PFNGLGETVERTEXATTRIBLDVPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribLdv")) == NULL) || r; r = ((glVertexAttribL1d = (PFNGLVERTEXATTRIBL1DPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL1d")) == NULL) || r; r = ((glVertexAttribL1dv = (PFNGLVERTEXATTRIBL1DVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL1dv")) == NULL) || r; r = ((glVertexAttribL2d = (PFNGLVERTEXATTRIBL2DPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL2d")) == NULL) || r; r = ((glVertexAttribL2dv = (PFNGLVERTEXATTRIBL2DVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL2dv")) == NULL) || r; r = ((glVertexAttribL3d = (PFNGLVERTEXATTRIBL3DPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL3d")) == NULL) || r; r = ((glVertexAttribL3dv = (PFNGLVERTEXATTRIBL3DVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL3dv")) == NULL) || r; r = ((glVertexAttribL4d = (PFNGLVERTEXATTRIBL4DPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL4d")) == NULL) || r; r = ((glVertexAttribL4dv = (PFNGLVERTEXATTRIBL4DVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL4dv")) == NULL) || r; r = ((glVertexAttribLPointer = (PFNGLVERTEXATTRIBLPOINTERPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribLPointer")) == NULL) || r; return r; } #endif /* GL_ARB_vertex_attrib_64bit */ #ifdef GL_ARB_vertex_attrib_binding static GLboolean _glewInit_GL_ARB_vertex_attrib_binding (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glBindVertexBuffer = (PFNGLBINDVERTEXBUFFERPROC)glewGetProcAddress((const GLubyte*)"glBindVertexBuffer")) == NULL) || r; r = ((glVertexAttribBinding = (PFNGLVERTEXATTRIBBINDINGPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribBinding")) == NULL) || r; r = ((glVertexAttribFormat = (PFNGLVERTEXATTRIBFORMATPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribFormat")) == NULL) || r; r = ((glVertexAttribIFormat = (PFNGLVERTEXATTRIBIFORMATPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribIFormat")) == NULL) || r; r = ((glVertexAttribLFormat = (PFNGLVERTEXATTRIBLFORMATPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribLFormat")) == NULL) || r; r = ((glVertexBindingDivisor = (PFNGLVERTEXBINDINGDIVISORPROC)glewGetProcAddress((const GLubyte*)"glVertexBindingDivisor")) == NULL) || r; return r; } #endif /* GL_ARB_vertex_attrib_binding */ #ifdef GL_ARB_vertex_blend static GLboolean _glewInit_GL_ARB_vertex_blend (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glVertexBlendARB = (PFNGLVERTEXBLENDARBPROC)glewGetProcAddress((const GLubyte*)"glVertexBlendARB")) == NULL) || r; r = ((glWeightPointerARB = (PFNGLWEIGHTPOINTERARBPROC)glewGetProcAddress((const GLubyte*)"glWeightPointerARB")) == NULL) || r; r = ((glWeightbvARB = (PFNGLWEIGHTBVARBPROC)glewGetProcAddress((const GLubyte*)"glWeightbvARB")) == NULL) || r; r = ((glWeightdvARB = (PFNGLWEIGHTDVARBPROC)glewGetProcAddress((const GLubyte*)"glWeightdvARB")) == NULL) || r; r = ((glWeightfvARB = (PFNGLWEIGHTFVARBPROC)glewGetProcAddress((const GLubyte*)"glWeightfvARB")) == NULL) || r; r = ((glWeightivARB = (PFNGLWEIGHTIVARBPROC)glewGetProcAddress((const GLubyte*)"glWeightivARB")) == NULL) || r; r = ((glWeightsvARB = (PFNGLWEIGHTSVARBPROC)glewGetProcAddress((const GLubyte*)"glWeightsvARB")) == NULL) || r; r = ((glWeightubvARB = (PFNGLWEIGHTUBVARBPROC)glewGetProcAddress((const GLubyte*)"glWeightubvARB")) == NULL) || r; r = ((glWeightuivARB = (PFNGLWEIGHTUIVARBPROC)glewGetProcAddress((const GLubyte*)"glWeightuivARB")) == NULL) || r; r = ((glWeightusvARB = (PFNGLWEIGHTUSVARBPROC)glewGetProcAddress((const GLubyte*)"glWeightusvARB")) == NULL) || r; return r; } #endif /* GL_ARB_vertex_blend */ #ifdef GL_ARB_vertex_buffer_object static GLboolean _glewInit_GL_ARB_vertex_buffer_object (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glBindBufferARB = (PFNGLBINDBUFFERARBPROC)glewGetProcAddress((const GLubyte*)"glBindBufferARB")) == NULL) || r; r = ((glBufferDataARB = (PFNGLBUFFERDATAARBPROC)glewGetProcAddress((const GLubyte*)"glBufferDataARB")) == NULL) || r; r = ((glBufferSubDataARB = (PFNGLBUFFERSUBDATAARBPROC)glewGetProcAddress((const GLubyte*)"glBufferSubDataARB")) == NULL) || r; r = ((glDeleteBuffersARB = (PFNGLDELETEBUFFERSARBPROC)glewGetProcAddress((const GLubyte*)"glDeleteBuffersARB")) == NULL) || r; r = ((glGenBuffersARB = (PFNGLGENBUFFERSARBPROC)glewGetProcAddress((const GLubyte*)"glGenBuffersARB")) == NULL) || r; r = ((glGetBufferParameterivARB = (PFNGLGETBUFFERPARAMETERIVARBPROC)glewGetProcAddress((const GLubyte*)"glGetBufferParameterivARB")) == NULL) || r; r = ((glGetBufferPointervARB = (PFNGLGETBUFFERPOINTERVARBPROC)glewGetProcAddress((const GLubyte*)"glGetBufferPointervARB")) == NULL) || r; r = ((glGetBufferSubDataARB = (PFNGLGETBUFFERSUBDATAARBPROC)glewGetProcAddress((const GLubyte*)"glGetBufferSubDataARB")) == NULL) || r; r = ((glIsBufferARB = (PFNGLISBUFFERARBPROC)glewGetProcAddress((const GLubyte*)"glIsBufferARB")) == NULL) || r; r = ((glMapBufferARB = (PFNGLMAPBUFFERARBPROC)glewGetProcAddress((const GLubyte*)"glMapBufferARB")) == NULL) || r; r = ((glUnmapBufferARB = (PFNGLUNMAPBUFFERARBPROC)glewGetProcAddress((const GLubyte*)"glUnmapBufferARB")) == NULL) || r; return r; } #endif /* GL_ARB_vertex_buffer_object */ #ifdef GL_ARB_vertex_program static GLboolean _glewInit_GL_ARB_vertex_program (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glBindProgramARB = (PFNGLBINDPROGRAMARBPROC)glewGetProcAddress((const GLubyte*)"glBindProgramARB")) == NULL) || r; r = ((glDeleteProgramsARB = (PFNGLDELETEPROGRAMSARBPROC)glewGetProcAddress((const GLubyte*)"glDeleteProgramsARB")) == NULL) || r; r = ((glDisableVertexAttribArrayARB = (PFNGLDISABLEVERTEXATTRIBARRAYARBPROC)glewGetProcAddress((const GLubyte*)"glDisableVertexAttribArrayARB")) == NULL) || r; r = ((glEnableVertexAttribArrayARB = (PFNGLENABLEVERTEXATTRIBARRAYARBPROC)glewGetProcAddress((const GLubyte*)"glEnableVertexAttribArrayARB")) == NULL) || r; r = ((glGenProgramsARB = (PFNGLGENPROGRAMSARBPROC)glewGetProcAddress((const GLubyte*)"glGenProgramsARB")) == NULL) || r; r = ((glGetProgramEnvParameterdvARB = (PFNGLGETPROGRAMENVPARAMETERDVARBPROC)glewGetProcAddress((const GLubyte*)"glGetProgramEnvParameterdvARB")) == NULL) || r; r = ((glGetProgramEnvParameterfvARB = (PFNGLGETPROGRAMENVPARAMETERFVARBPROC)glewGetProcAddress((const GLubyte*)"glGetProgramEnvParameterfvARB")) == NULL) || r; r = ((glGetProgramLocalParameterdvARB = (PFNGLGETPROGRAMLOCALPARAMETERDVARBPROC)glewGetProcAddress((const GLubyte*)"glGetProgramLocalParameterdvARB")) == NULL) || r; r = ((glGetProgramLocalParameterfvARB = (PFNGLGETPROGRAMLOCALPARAMETERFVARBPROC)glewGetProcAddress((const GLubyte*)"glGetProgramLocalParameterfvARB")) == NULL) || r; r = ((glGetProgramStringARB = (PFNGLGETPROGRAMSTRINGARBPROC)glewGetProcAddress((const GLubyte*)"glGetProgramStringARB")) == NULL) || r; r = ((glGetProgramivARB = (PFNGLGETPROGRAMIVARBPROC)glewGetProcAddress((const GLubyte*)"glGetProgramivARB")) == NULL) || r; r = ((glGetVertexAttribPointervARB = (PFNGLGETVERTEXATTRIBPOINTERVARBPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribPointervARB")) == NULL) || r; r = ((glGetVertexAttribdvARB = (PFNGLGETVERTEXATTRIBDVARBPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribdvARB")) == NULL) || r; r = ((glGetVertexAttribfvARB = (PFNGLGETVERTEXATTRIBFVARBPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribfvARB")) == NULL) || r; r = ((glGetVertexAttribivARB = (PFNGLGETVERTEXATTRIBIVARBPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribivARB")) == NULL) || r; r = ((glIsProgramARB = (PFNGLISPROGRAMARBPROC)glewGetProcAddress((const GLubyte*)"glIsProgramARB")) == NULL) || r; r = ((glProgramEnvParameter4dARB = (PFNGLPROGRAMENVPARAMETER4DARBPROC)glewGetProcAddress((const GLubyte*)"glProgramEnvParameter4dARB")) == NULL) || r; r = ((glProgramEnvParameter4dvARB = (PFNGLPROGRAMENVPARAMETER4DVARBPROC)glewGetProcAddress((const GLubyte*)"glProgramEnvParameter4dvARB")) == NULL) || r; r = ((glProgramEnvParameter4fARB = (PFNGLPROGRAMENVPARAMETER4FARBPROC)glewGetProcAddress((const GLubyte*)"glProgramEnvParameter4fARB")) == NULL) || r; r = ((glProgramEnvParameter4fvARB = (PFNGLPROGRAMENVPARAMETER4FVARBPROC)glewGetProcAddress((const GLubyte*)"glProgramEnvParameter4fvARB")) == NULL) || r; r = ((glProgramLocalParameter4dARB = (PFNGLPROGRAMLOCALPARAMETER4DARBPROC)glewGetProcAddress((const GLubyte*)"glProgramLocalParameter4dARB")) == NULL) || r; r = ((glProgramLocalParameter4dvARB = (PFNGLPROGRAMLOCALPARAMETER4DVARBPROC)glewGetProcAddress((const GLubyte*)"glProgramLocalParameter4dvARB")) == NULL) || r; r = ((glProgramLocalParameter4fARB = (PFNGLPROGRAMLOCALPARAMETER4FARBPROC)glewGetProcAddress((const GLubyte*)"glProgramLocalParameter4fARB")) == NULL) || r; r = ((glProgramLocalParameter4fvARB = (PFNGLPROGRAMLOCALPARAMETER4FVARBPROC)glewGetProcAddress((const GLubyte*)"glProgramLocalParameter4fvARB")) == NULL) || r; r = ((glProgramStringARB = (PFNGLPROGRAMSTRINGARBPROC)glewGetProcAddress((const GLubyte*)"glProgramStringARB")) == NULL) || r; r = ((glVertexAttrib1dARB = (PFNGLVERTEXATTRIB1DARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1dARB")) == NULL) || r; r = ((glVertexAttrib1dvARB = (PFNGLVERTEXATTRIB1DVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1dvARB")) == NULL) || r; r = ((glVertexAttrib1fARB = (PFNGLVERTEXATTRIB1FARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1fARB")) == NULL) || r; r = ((glVertexAttrib1fvARB = (PFNGLVERTEXATTRIB1FVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1fvARB")) == NULL) || r; r = ((glVertexAttrib1sARB = (PFNGLVERTEXATTRIB1SARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1sARB")) == NULL) || r; r = ((glVertexAttrib1svARB = (PFNGLVERTEXATTRIB1SVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1svARB")) == NULL) || r; r = ((glVertexAttrib2dARB = (PFNGLVERTEXATTRIB2DARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2dARB")) == NULL) || r; r = ((glVertexAttrib2dvARB = (PFNGLVERTEXATTRIB2DVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2dvARB")) == NULL) || r; r = ((glVertexAttrib2fARB = (PFNGLVERTEXATTRIB2FARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2fARB")) == NULL) || r; r = ((glVertexAttrib2fvARB = (PFNGLVERTEXATTRIB2FVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2fvARB")) == NULL) || r; r = ((glVertexAttrib2sARB = (PFNGLVERTEXATTRIB2SARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2sARB")) == NULL) || r; r = ((glVertexAttrib2svARB = (PFNGLVERTEXATTRIB2SVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2svARB")) == NULL) || r; r = ((glVertexAttrib3dARB = (PFNGLVERTEXATTRIB3DARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3dARB")) == NULL) || r; r = ((glVertexAttrib3dvARB = (PFNGLVERTEXATTRIB3DVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3dvARB")) == NULL) || r; r = ((glVertexAttrib3fARB = (PFNGLVERTEXATTRIB3FARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3fARB")) == NULL) || r; r = ((glVertexAttrib3fvARB = (PFNGLVERTEXATTRIB3FVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3fvARB")) == NULL) || r; r = ((glVertexAttrib3sARB = (PFNGLVERTEXATTRIB3SARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3sARB")) == NULL) || r; r = ((glVertexAttrib3svARB = (PFNGLVERTEXATTRIB3SVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3svARB")) == NULL) || r; r = ((glVertexAttrib4NbvARB = (PFNGLVERTEXATTRIB4NBVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4NbvARB")) == NULL) || r; r = ((glVertexAttrib4NivARB = (PFNGLVERTEXATTRIB4NIVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4NivARB")) == NULL) || r; r = ((glVertexAttrib4NsvARB = (PFNGLVERTEXATTRIB4NSVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4NsvARB")) == NULL) || r; r = ((glVertexAttrib4NubARB = (PFNGLVERTEXATTRIB4NUBARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4NubARB")) == NULL) || r; r = ((glVertexAttrib4NubvARB = (PFNGLVERTEXATTRIB4NUBVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4NubvARB")) == NULL) || r; r = ((glVertexAttrib4NuivARB = (PFNGLVERTEXATTRIB4NUIVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4NuivARB")) == NULL) || r; r = ((glVertexAttrib4NusvARB = (PFNGLVERTEXATTRIB4NUSVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4NusvARB")) == NULL) || r; r = ((glVertexAttrib4bvARB = (PFNGLVERTEXATTRIB4BVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4bvARB")) == NULL) || r; r = ((glVertexAttrib4dARB = (PFNGLVERTEXATTRIB4DARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4dARB")) == NULL) || r; r = ((glVertexAttrib4dvARB = (PFNGLVERTEXATTRIB4DVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4dvARB")) == NULL) || r; r = ((glVertexAttrib4fARB = (PFNGLVERTEXATTRIB4FARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4fARB")) == NULL) || r; r = ((glVertexAttrib4fvARB = (PFNGLVERTEXATTRIB4FVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4fvARB")) == NULL) || r; r = ((glVertexAttrib4ivARB = (PFNGLVERTEXATTRIB4IVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4ivARB")) == NULL) || r; r = ((glVertexAttrib4sARB = (PFNGLVERTEXATTRIB4SARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4sARB")) == NULL) || r; r = ((glVertexAttrib4svARB = (PFNGLVERTEXATTRIB4SVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4svARB")) == NULL) || r; r = ((glVertexAttrib4ubvARB = (PFNGLVERTEXATTRIB4UBVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4ubvARB")) == NULL) || r; r = ((glVertexAttrib4uivARB = (PFNGLVERTEXATTRIB4UIVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4uivARB")) == NULL) || r; r = ((glVertexAttrib4usvARB = (PFNGLVERTEXATTRIB4USVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4usvARB")) == NULL) || r; r = ((glVertexAttribPointerARB = (PFNGLVERTEXATTRIBPOINTERARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribPointerARB")) == NULL) || r; return r; } #endif /* GL_ARB_vertex_program */ #ifdef GL_ARB_vertex_shader static GLboolean _glewInit_GL_ARB_vertex_shader (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glBindAttribLocationARB = (PFNGLBINDATTRIBLOCATIONARBPROC)glewGetProcAddress((const GLubyte*)"glBindAttribLocationARB")) == NULL) || r; r = ((glGetActiveAttribARB = (PFNGLGETACTIVEATTRIBARBPROC)glewGetProcAddress((const GLubyte*)"glGetActiveAttribARB")) == NULL) || r; r = ((glGetAttribLocationARB = (PFNGLGETATTRIBLOCATIONARBPROC)glewGetProcAddress((const GLubyte*)"glGetAttribLocationARB")) == NULL) || r; return r; } #endif /* GL_ARB_vertex_shader */ #ifdef GL_ARB_vertex_type_2_10_10_10_rev static GLboolean _glewInit_GL_ARB_vertex_type_2_10_10_10_rev (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glColorP3ui = (PFNGLCOLORP3UIPROC)glewGetProcAddress((const GLubyte*)"glColorP3ui")) == NULL) || r; r = ((glColorP3uiv = (PFNGLCOLORP3UIVPROC)glewGetProcAddress((const GLubyte*)"glColorP3uiv")) == NULL) || r; r = ((glColorP4ui = (PFNGLCOLORP4UIPROC)glewGetProcAddress((const GLubyte*)"glColorP4ui")) == NULL) || r; r = ((glColorP4uiv = (PFNGLCOLORP4UIVPROC)glewGetProcAddress((const GLubyte*)"glColorP4uiv")) == NULL) || r; r = ((glMultiTexCoordP1ui = (PFNGLMULTITEXCOORDP1UIPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoordP1ui")) == NULL) || r; r = ((glMultiTexCoordP1uiv = (PFNGLMULTITEXCOORDP1UIVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoordP1uiv")) == NULL) || r; r = ((glMultiTexCoordP2ui = (PFNGLMULTITEXCOORDP2UIPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoordP2ui")) == NULL) || r; r = ((glMultiTexCoordP2uiv = (PFNGLMULTITEXCOORDP2UIVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoordP2uiv")) == NULL) || r; r = ((glMultiTexCoordP3ui = (PFNGLMULTITEXCOORDP3UIPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoordP3ui")) == NULL) || r; r = ((glMultiTexCoordP3uiv = (PFNGLMULTITEXCOORDP3UIVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoordP3uiv")) == NULL) || r; r = ((glMultiTexCoordP4ui = (PFNGLMULTITEXCOORDP4UIPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoordP4ui")) == NULL) || r; r = ((glMultiTexCoordP4uiv = (PFNGLMULTITEXCOORDP4UIVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoordP4uiv")) == NULL) || r; r = ((glNormalP3ui = (PFNGLNORMALP3UIPROC)glewGetProcAddress((const GLubyte*)"glNormalP3ui")) == NULL) || r; r = ((glNormalP3uiv = (PFNGLNORMALP3UIVPROC)glewGetProcAddress((const GLubyte*)"glNormalP3uiv")) == NULL) || r; r = ((glSecondaryColorP3ui = (PFNGLSECONDARYCOLORP3UIPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColorP3ui")) == NULL) || r; r = ((glSecondaryColorP3uiv = (PFNGLSECONDARYCOLORP3UIVPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColorP3uiv")) == NULL) || r; r = ((glTexCoordP1ui = (PFNGLTEXCOORDP1UIPROC)glewGetProcAddress((const GLubyte*)"glTexCoordP1ui")) == NULL) || r; r = ((glTexCoordP1uiv = (PFNGLTEXCOORDP1UIVPROC)glewGetProcAddress((const GLubyte*)"glTexCoordP1uiv")) == NULL) || r; r = ((glTexCoordP2ui = (PFNGLTEXCOORDP2UIPROC)glewGetProcAddress((const GLubyte*)"glTexCoordP2ui")) == NULL) || r; r = ((glTexCoordP2uiv = (PFNGLTEXCOORDP2UIVPROC)glewGetProcAddress((const GLubyte*)"glTexCoordP2uiv")) == NULL) || r; r = ((glTexCoordP3ui = (PFNGLTEXCOORDP3UIPROC)glewGetProcAddress((const GLubyte*)"glTexCoordP3ui")) == NULL) || r; r = ((glTexCoordP3uiv = (PFNGLTEXCOORDP3UIVPROC)glewGetProcAddress((const GLubyte*)"glTexCoordP3uiv")) == NULL) || r; r = ((glTexCoordP4ui = (PFNGLTEXCOORDP4UIPROC)glewGetProcAddress((const GLubyte*)"glTexCoordP4ui")) == NULL) || r; r = ((glTexCoordP4uiv = (PFNGLTEXCOORDP4UIVPROC)glewGetProcAddress((const GLubyte*)"glTexCoordP4uiv")) == NULL) || r; r = ((glVertexAttribP1ui = (PFNGLVERTEXATTRIBP1UIPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribP1ui")) == NULL) || r; r = ((glVertexAttribP1uiv = (PFNGLVERTEXATTRIBP1UIVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribP1uiv")) == NULL) || r; r = ((glVertexAttribP2ui = (PFNGLVERTEXATTRIBP2UIPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribP2ui")) == NULL) || r; r = ((glVertexAttribP2uiv = (PFNGLVERTEXATTRIBP2UIVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribP2uiv")) == NULL) || r; r = ((glVertexAttribP3ui = (PFNGLVERTEXATTRIBP3UIPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribP3ui")) == NULL) || r; r = ((glVertexAttribP3uiv = (PFNGLVERTEXATTRIBP3UIVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribP3uiv")) == NULL) || r; r = ((glVertexAttribP4ui = (PFNGLVERTEXATTRIBP4UIPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribP4ui")) == NULL) || r; r = ((glVertexAttribP4uiv = (PFNGLVERTEXATTRIBP4UIVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribP4uiv")) == NULL) || r; r = ((glVertexP2ui = (PFNGLVERTEXP2UIPROC)glewGetProcAddress((const GLubyte*)"glVertexP2ui")) == NULL) || r; r = ((glVertexP2uiv = (PFNGLVERTEXP2UIVPROC)glewGetProcAddress((const GLubyte*)"glVertexP2uiv")) == NULL) || r; r = ((glVertexP3ui = (PFNGLVERTEXP3UIPROC)glewGetProcAddress((const GLubyte*)"glVertexP3ui")) == NULL) || r; r = ((glVertexP3uiv = (PFNGLVERTEXP3UIVPROC)glewGetProcAddress((const GLubyte*)"glVertexP3uiv")) == NULL) || r; r = ((glVertexP4ui = (PFNGLVERTEXP4UIPROC)glewGetProcAddress((const GLubyte*)"glVertexP4ui")) == NULL) || r; r = ((glVertexP4uiv = (PFNGLVERTEXP4UIVPROC)glewGetProcAddress((const GLubyte*)"glVertexP4uiv")) == NULL) || r; return r; } #endif /* GL_ARB_vertex_type_2_10_10_10_rev */ #ifdef GL_ARB_viewport_array static GLboolean _glewInit_GL_ARB_viewport_array (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glDepthRangeArrayv = (PFNGLDEPTHRANGEARRAYVPROC)glewGetProcAddress((const GLubyte*)"glDepthRangeArrayv")) == NULL) || r; r = ((glDepthRangeIndexed = (PFNGLDEPTHRANGEINDEXEDPROC)glewGetProcAddress((const GLubyte*)"glDepthRangeIndexed")) == NULL) || r; r = ((glGetDoublei_v = (PFNGLGETDOUBLEI_VPROC)glewGetProcAddress((const GLubyte*)"glGetDoublei_v")) == NULL) || r; r = ((glGetFloati_v = (PFNGLGETFLOATI_VPROC)glewGetProcAddress((const GLubyte*)"glGetFloati_v")) == NULL) || r; r = ((glScissorArrayv = (PFNGLSCISSORARRAYVPROC)glewGetProcAddress((const GLubyte*)"glScissorArrayv")) == NULL) || r; r = ((glScissorIndexed = (PFNGLSCISSORINDEXEDPROC)glewGetProcAddress((const GLubyte*)"glScissorIndexed")) == NULL) || r; r = ((glScissorIndexedv = (PFNGLSCISSORINDEXEDVPROC)glewGetProcAddress((const GLubyte*)"glScissorIndexedv")) == NULL) || r; r = ((glViewportArrayv = (PFNGLVIEWPORTARRAYVPROC)glewGetProcAddress((const GLubyte*)"glViewportArrayv")) == NULL) || r; r = ((glViewportIndexedf = (PFNGLVIEWPORTINDEXEDFPROC)glewGetProcAddress((const GLubyte*)"glViewportIndexedf")) == NULL) || r; r = ((glViewportIndexedfv = (PFNGLVIEWPORTINDEXEDFVPROC)glewGetProcAddress((const GLubyte*)"glViewportIndexedfv")) == NULL) || r; return r; } #endif /* GL_ARB_viewport_array */ #ifdef GL_ARB_window_pos static GLboolean _glewInit_GL_ARB_window_pos (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glWindowPos2dARB = (PFNGLWINDOWPOS2DARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2dARB")) == NULL) || r; r = ((glWindowPos2dvARB = (PFNGLWINDOWPOS2DVARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2dvARB")) == NULL) || r; r = ((glWindowPos2fARB = (PFNGLWINDOWPOS2FARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2fARB")) == NULL) || r; r = ((glWindowPos2fvARB = (PFNGLWINDOWPOS2FVARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2fvARB")) == NULL) || r; r = ((glWindowPos2iARB = (PFNGLWINDOWPOS2IARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2iARB")) == NULL) || r; r = ((glWindowPos2ivARB = (PFNGLWINDOWPOS2IVARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2ivARB")) == NULL) || r; r = ((glWindowPos2sARB = (PFNGLWINDOWPOS2SARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2sARB")) == NULL) || r; r = ((glWindowPos2svARB = (PFNGLWINDOWPOS2SVARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2svARB")) == NULL) || r; r = ((glWindowPos3dARB = (PFNGLWINDOWPOS3DARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3dARB")) == NULL) || r; r = ((glWindowPos3dvARB = (PFNGLWINDOWPOS3DVARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3dvARB")) == NULL) || r; r = ((glWindowPos3fARB = (PFNGLWINDOWPOS3FARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3fARB")) == NULL) || r; r = ((glWindowPos3fvARB = (PFNGLWINDOWPOS3FVARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3fvARB")) == NULL) || r; r = ((glWindowPos3iARB = (PFNGLWINDOWPOS3IARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3iARB")) == NULL) || r; r = ((glWindowPos3ivARB = (PFNGLWINDOWPOS3IVARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3ivARB")) == NULL) || r; r = ((glWindowPos3sARB = (PFNGLWINDOWPOS3SARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3sARB")) == NULL) || r; r = ((glWindowPos3svARB = (PFNGLWINDOWPOS3SVARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3svARB")) == NULL) || r; return r; } #endif /* GL_ARB_window_pos */ #ifdef GL_ATIX_point_sprites #endif /* GL_ATIX_point_sprites */ #ifdef GL_ATIX_texture_env_combine3 #endif /* GL_ATIX_texture_env_combine3 */ #ifdef GL_ATIX_texture_env_route #endif /* GL_ATIX_texture_env_route */ #ifdef GL_ATIX_vertex_shader_output_point_size #endif /* GL_ATIX_vertex_shader_output_point_size */ #ifdef GL_ATI_draw_buffers static GLboolean _glewInit_GL_ATI_draw_buffers (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glDrawBuffersATI = (PFNGLDRAWBUFFERSATIPROC)glewGetProcAddress((const GLubyte*)"glDrawBuffersATI")) == NULL) || r; return r; } #endif /* GL_ATI_draw_buffers */ #ifdef GL_ATI_element_array static GLboolean _glewInit_GL_ATI_element_array (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glDrawElementArrayATI = (PFNGLDRAWELEMENTARRAYATIPROC)glewGetProcAddress((const GLubyte*)"glDrawElementArrayATI")) == NULL) || r; r = ((glDrawRangeElementArrayATI = (PFNGLDRAWRANGEELEMENTARRAYATIPROC)glewGetProcAddress((const GLubyte*)"glDrawRangeElementArrayATI")) == NULL) || r; r = ((glElementPointerATI = (PFNGLELEMENTPOINTERATIPROC)glewGetProcAddress((const GLubyte*)"glElementPointerATI")) == NULL) || r; return r; } #endif /* GL_ATI_element_array */ #ifdef GL_ATI_envmap_bumpmap static GLboolean _glewInit_GL_ATI_envmap_bumpmap (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glGetTexBumpParameterfvATI = (PFNGLGETTEXBUMPPARAMETERFVATIPROC)glewGetProcAddress((const GLubyte*)"glGetTexBumpParameterfvATI")) == NULL) || r; r = ((glGetTexBumpParameterivATI = (PFNGLGETTEXBUMPPARAMETERIVATIPROC)glewGetProcAddress((const GLubyte*)"glGetTexBumpParameterivATI")) == NULL) || r; r = ((glTexBumpParameterfvATI = (PFNGLTEXBUMPPARAMETERFVATIPROC)glewGetProcAddress((const GLubyte*)"glTexBumpParameterfvATI")) == NULL) || r; r = ((glTexBumpParameterivATI = (PFNGLTEXBUMPPARAMETERIVATIPROC)glewGetProcAddress((const GLubyte*)"glTexBumpParameterivATI")) == NULL) || r; return r; } #endif /* GL_ATI_envmap_bumpmap */ #ifdef GL_ATI_fragment_shader static GLboolean _glewInit_GL_ATI_fragment_shader (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glAlphaFragmentOp1ATI = (PFNGLALPHAFRAGMENTOP1ATIPROC)glewGetProcAddress((const GLubyte*)"glAlphaFragmentOp1ATI")) == NULL) || r; r = ((glAlphaFragmentOp2ATI = (PFNGLALPHAFRAGMENTOP2ATIPROC)glewGetProcAddress((const GLubyte*)"glAlphaFragmentOp2ATI")) == NULL) || r; r = ((glAlphaFragmentOp3ATI = (PFNGLALPHAFRAGMENTOP3ATIPROC)glewGetProcAddress((const GLubyte*)"glAlphaFragmentOp3ATI")) == NULL) || r; r = ((glBeginFragmentShaderATI = (PFNGLBEGINFRAGMENTSHADERATIPROC)glewGetProcAddress((const GLubyte*)"glBeginFragmentShaderATI")) == NULL) || r; r = ((glBindFragmentShaderATI = (PFNGLBINDFRAGMENTSHADERATIPROC)glewGetProcAddress((const GLubyte*)"glBindFragmentShaderATI")) == NULL) || r; r = ((glColorFragmentOp1ATI = (PFNGLCOLORFRAGMENTOP1ATIPROC)glewGetProcAddress((const GLubyte*)"glColorFragmentOp1ATI")) == NULL) || r; r = ((glColorFragmentOp2ATI = (PFNGLCOLORFRAGMENTOP2ATIPROC)glewGetProcAddress((const GLubyte*)"glColorFragmentOp2ATI")) == NULL) || r; r = ((glColorFragmentOp3ATI = (PFNGLCOLORFRAGMENTOP3ATIPROC)glewGetProcAddress((const GLubyte*)"glColorFragmentOp3ATI")) == NULL) || r; r = ((glDeleteFragmentShaderATI = (PFNGLDELETEFRAGMENTSHADERATIPROC)glewGetProcAddress((const GLubyte*)"glDeleteFragmentShaderATI")) == NULL) || r; r = ((glEndFragmentShaderATI = (PFNGLENDFRAGMENTSHADERATIPROC)glewGetProcAddress((const GLubyte*)"glEndFragmentShaderATI")) == NULL) || r; r = ((glGenFragmentShadersATI = (PFNGLGENFRAGMENTSHADERSATIPROC)glewGetProcAddress((const GLubyte*)"glGenFragmentShadersATI")) == NULL) || r; r = ((glPassTexCoordATI = (PFNGLPASSTEXCOORDATIPROC)glewGetProcAddress((const GLubyte*)"glPassTexCoordATI")) == NULL) || r; r = ((glSampleMapATI = (PFNGLSAMPLEMAPATIPROC)glewGetProcAddress((const GLubyte*)"glSampleMapATI")) == NULL) || r; r = ((glSetFragmentShaderConstantATI = (PFNGLSETFRAGMENTSHADERCONSTANTATIPROC)glewGetProcAddress((const GLubyte*)"glSetFragmentShaderConstantATI")) == NULL) || r; return r; } #endif /* GL_ATI_fragment_shader */ #ifdef GL_ATI_map_object_buffer static GLboolean _glewInit_GL_ATI_map_object_buffer (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glMapObjectBufferATI = (PFNGLMAPOBJECTBUFFERATIPROC)glewGetProcAddress((const GLubyte*)"glMapObjectBufferATI")) == NULL) || r; r = ((glUnmapObjectBufferATI = (PFNGLUNMAPOBJECTBUFFERATIPROC)glewGetProcAddress((const GLubyte*)"glUnmapObjectBufferATI")) == NULL) || r; return r; } #endif /* GL_ATI_map_object_buffer */ #ifdef GL_ATI_meminfo #endif /* GL_ATI_meminfo */ #ifdef GL_ATI_pn_triangles static GLboolean _glewInit_GL_ATI_pn_triangles (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glPNTrianglesfATI = (PFNGLPNTRIANGLESFATIPROC)glewGetProcAddress((const GLubyte*)"glPNTrianglesfATI")) == NULL) || r; r = ((glPNTrianglesiATI = (PFNGLPNTRIANGLESIATIPROC)glewGetProcAddress((const GLubyte*)"glPNTrianglesiATI")) == NULL) || r; return r; } #endif /* GL_ATI_pn_triangles */ #ifdef GL_ATI_separate_stencil static GLboolean _glewInit_GL_ATI_separate_stencil (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glStencilFuncSeparateATI = (PFNGLSTENCILFUNCSEPARATEATIPROC)glewGetProcAddress((const GLubyte*)"glStencilFuncSeparateATI")) == NULL) || r; r = ((glStencilOpSeparateATI = (PFNGLSTENCILOPSEPARATEATIPROC)glewGetProcAddress((const GLubyte*)"glStencilOpSeparateATI")) == NULL) || r; return r; } #endif /* GL_ATI_separate_stencil */ #ifdef GL_ATI_shader_texture_lod #endif /* GL_ATI_shader_texture_lod */ #ifdef GL_ATI_text_fragment_shader #endif /* GL_ATI_text_fragment_shader */ #ifdef GL_ATI_texture_compression_3dc #endif /* GL_ATI_texture_compression_3dc */ #ifdef GL_ATI_texture_env_combine3 #endif /* GL_ATI_texture_env_combine3 */ #ifdef GL_ATI_texture_float #endif /* GL_ATI_texture_float */ #ifdef GL_ATI_texture_mirror_once #endif /* GL_ATI_texture_mirror_once */ #ifdef GL_ATI_vertex_array_object static GLboolean _glewInit_GL_ATI_vertex_array_object (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glArrayObjectATI = (PFNGLARRAYOBJECTATIPROC)glewGetProcAddress((const GLubyte*)"glArrayObjectATI")) == NULL) || r; r = ((glFreeObjectBufferATI = (PFNGLFREEOBJECTBUFFERATIPROC)glewGetProcAddress((const GLubyte*)"glFreeObjectBufferATI")) == NULL) || r; r = ((glGetArrayObjectfvATI = (PFNGLGETARRAYOBJECTFVATIPROC)glewGetProcAddress((const GLubyte*)"glGetArrayObjectfvATI")) == NULL) || r; r = ((glGetArrayObjectivATI = (PFNGLGETARRAYOBJECTIVATIPROC)glewGetProcAddress((const GLubyte*)"glGetArrayObjectivATI")) == NULL) || r; r = ((glGetObjectBufferfvATI = (PFNGLGETOBJECTBUFFERFVATIPROC)glewGetProcAddress((const GLubyte*)"glGetObjectBufferfvATI")) == NULL) || r; r = ((glGetObjectBufferivATI = (PFNGLGETOBJECTBUFFERIVATIPROC)glewGetProcAddress((const GLubyte*)"glGetObjectBufferivATI")) == NULL) || r; r = ((glGetVariantArrayObjectfvATI = (PFNGLGETVARIANTARRAYOBJECTFVATIPROC)glewGetProcAddress((const GLubyte*)"glGetVariantArrayObjectfvATI")) == NULL) || r; r = ((glGetVariantArrayObjectivATI = (PFNGLGETVARIANTARRAYOBJECTIVATIPROC)glewGetProcAddress((const GLubyte*)"glGetVariantArrayObjectivATI")) == NULL) || r; r = ((glIsObjectBufferATI = (PFNGLISOBJECTBUFFERATIPROC)glewGetProcAddress((const GLubyte*)"glIsObjectBufferATI")) == NULL) || r; r = ((glNewObjectBufferATI = (PFNGLNEWOBJECTBUFFERATIPROC)glewGetProcAddress((const GLubyte*)"glNewObjectBufferATI")) == NULL) || r; r = ((glUpdateObjectBufferATI = (PFNGLUPDATEOBJECTBUFFERATIPROC)glewGetProcAddress((const GLubyte*)"glUpdateObjectBufferATI")) == NULL) || r; r = ((glVariantArrayObjectATI = (PFNGLVARIANTARRAYOBJECTATIPROC)glewGetProcAddress((const GLubyte*)"glVariantArrayObjectATI")) == NULL) || r; return r; } #endif /* GL_ATI_vertex_array_object */ #ifdef GL_ATI_vertex_attrib_array_object static GLboolean _glewInit_GL_ATI_vertex_attrib_array_object (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glGetVertexAttribArrayObjectfvATI = (PFNGLGETVERTEXATTRIBARRAYOBJECTFVATIPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribArrayObjectfvATI")) == NULL) || r; r = ((glGetVertexAttribArrayObjectivATI = (PFNGLGETVERTEXATTRIBARRAYOBJECTIVATIPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribArrayObjectivATI")) == NULL) || r; r = ((glVertexAttribArrayObjectATI = (PFNGLVERTEXATTRIBARRAYOBJECTATIPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribArrayObjectATI")) == NULL) || r; return r; } #endif /* GL_ATI_vertex_attrib_array_object */ #ifdef GL_ATI_vertex_streams static GLboolean _glewInit_GL_ATI_vertex_streams (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glClientActiveVertexStreamATI = (PFNGLCLIENTACTIVEVERTEXSTREAMATIPROC)glewGetProcAddress((const GLubyte*)"glClientActiveVertexStreamATI")) == NULL) || r; r = ((glNormalStream3bATI = (PFNGLNORMALSTREAM3BATIPROC)glewGetProcAddress((const GLubyte*)"glNormalStream3bATI")) == NULL) || r; r = ((glNormalStream3bvATI = (PFNGLNORMALSTREAM3BVATIPROC)glewGetProcAddress((const GLubyte*)"glNormalStream3bvATI")) == NULL) || r; r = ((glNormalStream3dATI = (PFNGLNORMALSTREAM3DATIPROC)glewGetProcAddress((const GLubyte*)"glNormalStream3dATI")) == NULL) || r; r = ((glNormalStream3dvATI = (PFNGLNORMALSTREAM3DVATIPROC)glewGetProcAddress((const GLubyte*)"glNormalStream3dvATI")) == NULL) || r; r = ((glNormalStream3fATI = (PFNGLNORMALSTREAM3FATIPROC)glewGetProcAddress((const GLubyte*)"glNormalStream3fATI")) == NULL) || r; r = ((glNormalStream3fvATI = (PFNGLNORMALSTREAM3FVATIPROC)glewGetProcAddress((const GLubyte*)"glNormalStream3fvATI")) == NULL) || r; r = ((glNormalStream3iATI = (PFNGLNORMALSTREAM3IATIPROC)glewGetProcAddress((const GLubyte*)"glNormalStream3iATI")) == NULL) || r; r = ((glNormalStream3ivATI = (PFNGLNORMALSTREAM3IVATIPROC)glewGetProcAddress((const GLubyte*)"glNormalStream3ivATI")) == NULL) || r; r = ((glNormalStream3sATI = (PFNGLNORMALSTREAM3SATIPROC)glewGetProcAddress((const GLubyte*)"glNormalStream3sATI")) == NULL) || r; r = ((glNormalStream3svATI = (PFNGLNORMALSTREAM3SVATIPROC)glewGetProcAddress((const GLubyte*)"glNormalStream3svATI")) == NULL) || r; r = ((glVertexBlendEnvfATI = (PFNGLVERTEXBLENDENVFATIPROC)glewGetProcAddress((const GLubyte*)"glVertexBlendEnvfATI")) == NULL) || r; r = ((glVertexBlendEnviATI = (PFNGLVERTEXBLENDENVIATIPROC)glewGetProcAddress((const GLubyte*)"glVertexBlendEnviATI")) == NULL) || r; r = ((glVertexStream1dATI = (PFNGLVERTEXSTREAM1DATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream1dATI")) == NULL) || r; r = ((glVertexStream1dvATI = (PFNGLVERTEXSTREAM1DVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream1dvATI")) == NULL) || r; r = ((glVertexStream1fATI = (PFNGLVERTEXSTREAM1FATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream1fATI")) == NULL) || r; r = ((glVertexStream1fvATI = (PFNGLVERTEXSTREAM1FVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream1fvATI")) == NULL) || r; r = ((glVertexStream1iATI = (PFNGLVERTEXSTREAM1IATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream1iATI")) == NULL) || r; r = ((glVertexStream1ivATI = (PFNGLVERTEXSTREAM1IVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream1ivATI")) == NULL) || r; r = ((glVertexStream1sATI = (PFNGLVERTEXSTREAM1SATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream1sATI")) == NULL) || r; r = ((glVertexStream1svATI = (PFNGLVERTEXSTREAM1SVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream1svATI")) == NULL) || r; r = ((glVertexStream2dATI = (PFNGLVERTEXSTREAM2DATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream2dATI")) == NULL) || r; r = ((glVertexStream2dvATI = (PFNGLVERTEXSTREAM2DVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream2dvATI")) == NULL) || r; r = ((glVertexStream2fATI = (PFNGLVERTEXSTREAM2FATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream2fATI")) == NULL) || r; r = ((glVertexStream2fvATI = (PFNGLVERTEXSTREAM2FVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream2fvATI")) == NULL) || r; r = ((glVertexStream2iATI = (PFNGLVERTEXSTREAM2IATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream2iATI")) == NULL) || r; r = ((glVertexStream2ivATI = (PFNGLVERTEXSTREAM2IVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream2ivATI")) == NULL) || r; r = ((glVertexStream2sATI = (PFNGLVERTEXSTREAM2SATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream2sATI")) == NULL) || r; r = ((glVertexStream2svATI = (PFNGLVERTEXSTREAM2SVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream2svATI")) == NULL) || r; r = ((glVertexStream3dATI = (PFNGLVERTEXSTREAM3DATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream3dATI")) == NULL) || r; r = ((glVertexStream3dvATI = (PFNGLVERTEXSTREAM3DVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream3dvATI")) == NULL) || r; r = ((glVertexStream3fATI = (PFNGLVERTEXSTREAM3FATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream3fATI")) == NULL) || r; r = ((glVertexStream3fvATI = (PFNGLVERTEXSTREAM3FVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream3fvATI")) == NULL) || r; r = ((glVertexStream3iATI = (PFNGLVERTEXSTREAM3IATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream3iATI")) == NULL) || r; r = ((glVertexStream3ivATI = (PFNGLVERTEXSTREAM3IVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream3ivATI")) == NULL) || r; r = ((glVertexStream3sATI = (PFNGLVERTEXSTREAM3SATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream3sATI")) == NULL) || r; r = ((glVertexStream3svATI = (PFNGLVERTEXSTREAM3SVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream3svATI")) == NULL) || r; r = ((glVertexStream4dATI = (PFNGLVERTEXSTREAM4DATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream4dATI")) == NULL) || r; r = ((glVertexStream4dvATI = (PFNGLVERTEXSTREAM4DVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream4dvATI")) == NULL) || r; r = ((glVertexStream4fATI = (PFNGLVERTEXSTREAM4FATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream4fATI")) == NULL) || r; r = ((glVertexStream4fvATI = (PFNGLVERTEXSTREAM4FVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream4fvATI")) == NULL) || r; r = ((glVertexStream4iATI = (PFNGLVERTEXSTREAM4IATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream4iATI")) == NULL) || r; r = ((glVertexStream4ivATI = (PFNGLVERTEXSTREAM4IVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream4ivATI")) == NULL) || r; r = ((glVertexStream4sATI = (PFNGLVERTEXSTREAM4SATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream4sATI")) == NULL) || r; r = ((glVertexStream4svATI = (PFNGLVERTEXSTREAM4SVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream4svATI")) == NULL) || r; return r; } #endif /* GL_ATI_vertex_streams */ #ifdef GL_EXT_422_pixels #endif /* GL_EXT_422_pixels */ #ifdef GL_EXT_Cg_shader #endif /* GL_EXT_Cg_shader */ #ifdef GL_EXT_abgr #endif /* GL_EXT_abgr */ #ifdef GL_EXT_bgra #endif /* GL_EXT_bgra */ #ifdef GL_EXT_bindable_uniform static GLboolean _glewInit_GL_EXT_bindable_uniform (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glGetUniformBufferSizeEXT = (PFNGLGETUNIFORMBUFFERSIZEEXTPROC)glewGetProcAddress((const GLubyte*)"glGetUniformBufferSizeEXT")) == NULL) || r; r = ((glGetUniformOffsetEXT = (PFNGLGETUNIFORMOFFSETEXTPROC)glewGetProcAddress((const GLubyte*)"glGetUniformOffsetEXT")) == NULL) || r; r = ((glUniformBufferEXT = (PFNGLUNIFORMBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glUniformBufferEXT")) == NULL) || r; return r; } #endif /* GL_EXT_bindable_uniform */ #ifdef GL_EXT_blend_color static GLboolean _glewInit_GL_EXT_blend_color (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glBlendColorEXT = (PFNGLBLENDCOLOREXTPROC)glewGetProcAddress((const GLubyte*)"glBlendColorEXT")) == NULL) || r; return r; } #endif /* GL_EXT_blend_color */ #ifdef GL_EXT_blend_equation_separate static GLboolean _glewInit_GL_EXT_blend_equation_separate (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glBlendEquationSeparateEXT = (PFNGLBLENDEQUATIONSEPARATEEXTPROC)glewGetProcAddress((const GLubyte*)"glBlendEquationSeparateEXT")) == NULL) || r; return r; } #endif /* GL_EXT_blend_equation_separate */ #ifdef GL_EXT_blend_func_separate static GLboolean _glewInit_GL_EXT_blend_func_separate (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glBlendFuncSeparateEXT = (PFNGLBLENDFUNCSEPARATEEXTPROC)glewGetProcAddress((const GLubyte*)"glBlendFuncSeparateEXT")) == NULL) || r; return r; } #endif /* GL_EXT_blend_func_separate */ #ifdef GL_EXT_blend_logic_op #endif /* GL_EXT_blend_logic_op */ #ifdef GL_EXT_blend_minmax static GLboolean _glewInit_GL_EXT_blend_minmax (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glBlendEquationEXT = (PFNGLBLENDEQUATIONEXTPROC)glewGetProcAddress((const GLubyte*)"glBlendEquationEXT")) == NULL) || r; return r; } #endif /* GL_EXT_blend_minmax */ #ifdef GL_EXT_blend_subtract #endif /* GL_EXT_blend_subtract */ #ifdef GL_EXT_clip_volume_hint #endif /* GL_EXT_clip_volume_hint */ #ifdef GL_EXT_cmyka #endif /* GL_EXT_cmyka */ #ifdef GL_EXT_color_subtable static GLboolean _glewInit_GL_EXT_color_subtable (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glColorSubTableEXT = (PFNGLCOLORSUBTABLEEXTPROC)glewGetProcAddress((const GLubyte*)"glColorSubTableEXT")) == NULL) || r; r = ((glCopyColorSubTableEXT = (PFNGLCOPYCOLORSUBTABLEEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyColorSubTableEXT")) == NULL) || r; return r; } #endif /* GL_EXT_color_subtable */ #ifdef GL_EXT_compiled_vertex_array static GLboolean _glewInit_GL_EXT_compiled_vertex_array (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glLockArraysEXT = (PFNGLLOCKARRAYSEXTPROC)glewGetProcAddress((const GLubyte*)"glLockArraysEXT")) == NULL) || r; r = ((glUnlockArraysEXT = (PFNGLUNLOCKARRAYSEXTPROC)glewGetProcAddress((const GLubyte*)"glUnlockArraysEXT")) == NULL) || r; return r; } #endif /* GL_EXT_compiled_vertex_array */ #ifdef GL_EXT_convolution static GLboolean _glewInit_GL_EXT_convolution (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glConvolutionFilter1DEXT = (PFNGLCONVOLUTIONFILTER1DEXTPROC)glewGetProcAddress((const GLubyte*)"glConvolutionFilter1DEXT")) == NULL) || r; r = ((glConvolutionFilter2DEXT = (PFNGLCONVOLUTIONFILTER2DEXTPROC)glewGetProcAddress((const GLubyte*)"glConvolutionFilter2DEXT")) == NULL) || r; r = ((glConvolutionParameterfEXT = (PFNGLCONVOLUTIONPARAMETERFEXTPROC)glewGetProcAddress((const GLubyte*)"glConvolutionParameterfEXT")) == NULL) || r; r = ((glConvolutionParameterfvEXT = (PFNGLCONVOLUTIONPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glConvolutionParameterfvEXT")) == NULL) || r; r = ((glConvolutionParameteriEXT = (PFNGLCONVOLUTIONPARAMETERIEXTPROC)glewGetProcAddress((const GLubyte*)"glConvolutionParameteriEXT")) == NULL) || r; r = ((glConvolutionParameterivEXT = (PFNGLCONVOLUTIONPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glConvolutionParameterivEXT")) == NULL) || r; r = ((glCopyConvolutionFilter1DEXT = (PFNGLCOPYCONVOLUTIONFILTER1DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyConvolutionFilter1DEXT")) == NULL) || r; r = ((glCopyConvolutionFilter2DEXT = (PFNGLCOPYCONVOLUTIONFILTER2DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyConvolutionFilter2DEXT")) == NULL) || r; r = ((glGetConvolutionFilterEXT = (PFNGLGETCONVOLUTIONFILTEREXTPROC)glewGetProcAddress((const GLubyte*)"glGetConvolutionFilterEXT")) == NULL) || r; r = ((glGetConvolutionParameterfvEXT = (PFNGLGETCONVOLUTIONPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetConvolutionParameterfvEXT")) == NULL) || r; r = ((glGetConvolutionParameterivEXT = (PFNGLGETCONVOLUTIONPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetConvolutionParameterivEXT")) == NULL) || r; r = ((glGetSeparableFilterEXT = (PFNGLGETSEPARABLEFILTEREXTPROC)glewGetProcAddress((const GLubyte*)"glGetSeparableFilterEXT")) == NULL) || r; r = ((glSeparableFilter2DEXT = (PFNGLSEPARABLEFILTER2DEXTPROC)glewGetProcAddress((const GLubyte*)"glSeparableFilter2DEXT")) == NULL) || r; return r; } #endif /* GL_EXT_convolution */ #ifdef GL_EXT_coordinate_frame static GLboolean _glewInit_GL_EXT_coordinate_frame (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glBinormalPointerEXT = (PFNGLBINORMALPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glBinormalPointerEXT")) == NULL) || r; r = ((glTangentPointerEXT = (PFNGLTANGENTPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glTangentPointerEXT")) == NULL) || r; return r; } #endif /* GL_EXT_coordinate_frame */ #ifdef GL_EXT_copy_texture static GLboolean _glewInit_GL_EXT_copy_texture (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glCopyTexImage1DEXT = (PFNGLCOPYTEXIMAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyTexImage1DEXT")) == NULL) || r; r = ((glCopyTexImage2DEXT = (PFNGLCOPYTEXIMAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyTexImage2DEXT")) == NULL) || r; r = ((glCopyTexSubImage1DEXT = (PFNGLCOPYTEXSUBIMAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyTexSubImage1DEXT")) == NULL) || r; r = ((glCopyTexSubImage2DEXT = (PFNGLCOPYTEXSUBIMAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyTexSubImage2DEXT")) == NULL) || r; r = ((glCopyTexSubImage3DEXT = (PFNGLCOPYTEXSUBIMAGE3DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyTexSubImage3DEXT")) == NULL) || r; return r; } #endif /* GL_EXT_copy_texture */ #ifdef GL_EXT_cull_vertex static GLboolean _glewInit_GL_EXT_cull_vertex (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glCullParameterdvEXT = (PFNGLCULLPARAMETERDVEXTPROC)glewGetProcAddress((const GLubyte*)"glCullParameterdvEXT")) == NULL) || r; r = ((glCullParameterfvEXT = (PFNGLCULLPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glCullParameterfvEXT")) == NULL) || r; return r; } #endif /* GL_EXT_cull_vertex */ #ifdef GL_EXT_debug_marker static GLboolean _glewInit_GL_EXT_debug_marker (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glInsertEventMarkerEXT = (PFNGLINSERTEVENTMARKEREXTPROC)glewGetProcAddress((const GLubyte*)"glInsertEventMarkerEXT")) == NULL) || r; r = ((glPopGroupMarkerEXT = (PFNGLPOPGROUPMARKEREXTPROC)glewGetProcAddress((const GLubyte*)"glPopGroupMarkerEXT")) == NULL) || r; r = ((glPushGroupMarkerEXT = (PFNGLPUSHGROUPMARKEREXTPROC)glewGetProcAddress((const GLubyte*)"glPushGroupMarkerEXT")) == NULL) || r; return r; } #endif /* GL_EXT_debug_marker */ #ifdef GL_EXT_depth_bounds_test static GLboolean _glewInit_GL_EXT_depth_bounds_test (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glDepthBoundsEXT = (PFNGLDEPTHBOUNDSEXTPROC)glewGetProcAddress((const GLubyte*)"glDepthBoundsEXT")) == NULL) || r; return r; } #endif /* GL_EXT_depth_bounds_test */ #ifdef GL_EXT_direct_state_access static GLboolean _glewInit_GL_EXT_direct_state_access (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glBindMultiTextureEXT = (PFNGLBINDMULTITEXTUREEXTPROC)glewGetProcAddress((const GLubyte*)"glBindMultiTextureEXT")) == NULL) || r; r = ((glCheckNamedFramebufferStatusEXT = (PFNGLCHECKNAMEDFRAMEBUFFERSTATUSEXTPROC)glewGetProcAddress((const GLubyte*)"glCheckNamedFramebufferStatusEXT")) == NULL) || r; r = ((glClientAttribDefaultEXT = (PFNGLCLIENTATTRIBDEFAULTEXTPROC)glewGetProcAddress((const GLubyte*)"glClientAttribDefaultEXT")) == NULL) || r; r = ((glCompressedMultiTexImage1DEXT = (PFNGLCOMPRESSEDMULTITEXIMAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glCompressedMultiTexImage1DEXT")) == NULL) || r; r = ((glCompressedMultiTexImage2DEXT = (PFNGLCOMPRESSEDMULTITEXIMAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glCompressedMultiTexImage2DEXT")) == NULL) || r; r = ((glCompressedMultiTexImage3DEXT = (PFNGLCOMPRESSEDMULTITEXIMAGE3DEXTPROC)glewGetProcAddress((const GLubyte*)"glCompressedMultiTexImage3DEXT")) == NULL) || r; r = ((glCompressedMultiTexSubImage1DEXT = (PFNGLCOMPRESSEDMULTITEXSUBIMAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glCompressedMultiTexSubImage1DEXT")) == NULL) || r; r = ((glCompressedMultiTexSubImage2DEXT = (PFNGLCOMPRESSEDMULTITEXSUBIMAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glCompressedMultiTexSubImage2DEXT")) == NULL) || r; r = ((glCompressedMultiTexSubImage3DEXT = (PFNGLCOMPRESSEDMULTITEXSUBIMAGE3DEXTPROC)glewGetProcAddress((const GLubyte*)"glCompressedMultiTexSubImage3DEXT")) == NULL) || r; r = ((glCompressedTextureImage1DEXT = (PFNGLCOMPRESSEDTEXTUREIMAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glCompressedTextureImage1DEXT")) == NULL) || r; r = ((glCompressedTextureImage2DEXT = (PFNGLCOMPRESSEDTEXTUREIMAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glCompressedTextureImage2DEXT")) == NULL) || r; r = ((glCompressedTextureImage3DEXT = (PFNGLCOMPRESSEDTEXTUREIMAGE3DEXTPROC)glewGetProcAddress((const GLubyte*)"glCompressedTextureImage3DEXT")) == NULL) || r; r = ((glCompressedTextureSubImage1DEXT = (PFNGLCOMPRESSEDTEXTURESUBIMAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glCompressedTextureSubImage1DEXT")) == NULL) || r; r = ((glCompressedTextureSubImage2DEXT = (PFNGLCOMPRESSEDTEXTURESUBIMAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glCompressedTextureSubImage2DEXT")) == NULL) || r; r = ((glCompressedTextureSubImage3DEXT = (PFNGLCOMPRESSEDTEXTURESUBIMAGE3DEXTPROC)glewGetProcAddress((const GLubyte*)"glCompressedTextureSubImage3DEXT")) == NULL) || r; r = ((glCopyMultiTexImage1DEXT = (PFNGLCOPYMULTITEXIMAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyMultiTexImage1DEXT")) == NULL) || r; r = ((glCopyMultiTexImage2DEXT = (PFNGLCOPYMULTITEXIMAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyMultiTexImage2DEXT")) == NULL) || r; r = ((glCopyMultiTexSubImage1DEXT = (PFNGLCOPYMULTITEXSUBIMAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyMultiTexSubImage1DEXT")) == NULL) || r; r = ((glCopyMultiTexSubImage2DEXT = (PFNGLCOPYMULTITEXSUBIMAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyMultiTexSubImage2DEXT")) == NULL) || r; r = ((glCopyMultiTexSubImage3DEXT = (PFNGLCOPYMULTITEXSUBIMAGE3DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyMultiTexSubImage3DEXT")) == NULL) || r; r = ((glCopyTextureImage1DEXT = (PFNGLCOPYTEXTUREIMAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyTextureImage1DEXT")) == NULL) || r; r = ((glCopyTextureImage2DEXT = (PFNGLCOPYTEXTUREIMAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyTextureImage2DEXT")) == NULL) || r; r = ((glCopyTextureSubImage1DEXT = (PFNGLCOPYTEXTURESUBIMAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyTextureSubImage1DEXT")) == NULL) || r; r = ((glCopyTextureSubImage2DEXT = (PFNGLCOPYTEXTURESUBIMAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyTextureSubImage2DEXT")) == NULL) || r; r = ((glCopyTextureSubImage3DEXT = (PFNGLCOPYTEXTURESUBIMAGE3DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyTextureSubImage3DEXT")) == NULL) || r; r = ((glDisableClientStateIndexedEXT = (PFNGLDISABLECLIENTSTATEINDEXEDEXTPROC)glewGetProcAddress((const GLubyte*)"glDisableClientStateIndexedEXT")) == NULL) || r; r = ((glDisableClientStateiEXT = (PFNGLDISABLECLIENTSTATEIEXTPROC)glewGetProcAddress((const GLubyte*)"glDisableClientStateiEXT")) == NULL) || r; r = ((glDisableVertexArrayAttribEXT = (PFNGLDISABLEVERTEXARRAYATTRIBEXTPROC)glewGetProcAddress((const GLubyte*)"glDisableVertexArrayAttribEXT")) == NULL) || r; r = ((glDisableVertexArrayEXT = (PFNGLDISABLEVERTEXARRAYEXTPROC)glewGetProcAddress((const GLubyte*)"glDisableVertexArrayEXT")) == NULL) || r; r = ((glEnableClientStateIndexedEXT = (PFNGLENABLECLIENTSTATEINDEXEDEXTPROC)glewGetProcAddress((const GLubyte*)"glEnableClientStateIndexedEXT")) == NULL) || r; r = ((glEnableClientStateiEXT = (PFNGLENABLECLIENTSTATEIEXTPROC)glewGetProcAddress((const GLubyte*)"glEnableClientStateiEXT")) == NULL) || r; r = ((glEnableVertexArrayAttribEXT = (PFNGLENABLEVERTEXARRAYATTRIBEXTPROC)glewGetProcAddress((const GLubyte*)"glEnableVertexArrayAttribEXT")) == NULL) || r; r = ((glEnableVertexArrayEXT = (PFNGLENABLEVERTEXARRAYEXTPROC)glewGetProcAddress((const GLubyte*)"glEnableVertexArrayEXT")) == NULL) || r; r = ((glFlushMappedNamedBufferRangeEXT = (PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEEXTPROC)glewGetProcAddress((const GLubyte*)"glFlushMappedNamedBufferRangeEXT")) == NULL) || r; r = ((glFramebufferDrawBufferEXT = (PFNGLFRAMEBUFFERDRAWBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glFramebufferDrawBufferEXT")) == NULL) || r; r = ((glFramebufferDrawBuffersEXT = (PFNGLFRAMEBUFFERDRAWBUFFERSEXTPROC)glewGetProcAddress((const GLubyte*)"glFramebufferDrawBuffersEXT")) == NULL) || r; r = ((glFramebufferReadBufferEXT = (PFNGLFRAMEBUFFERREADBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glFramebufferReadBufferEXT")) == NULL) || r; r = ((glGenerateMultiTexMipmapEXT = (PFNGLGENERATEMULTITEXMIPMAPEXTPROC)glewGetProcAddress((const GLubyte*)"glGenerateMultiTexMipmapEXT")) == NULL) || r; r = ((glGenerateTextureMipmapEXT = (PFNGLGENERATETEXTUREMIPMAPEXTPROC)glewGetProcAddress((const GLubyte*)"glGenerateTextureMipmapEXT")) == NULL) || r; r = ((glGetCompressedMultiTexImageEXT = (PFNGLGETCOMPRESSEDMULTITEXIMAGEEXTPROC)glewGetProcAddress((const GLubyte*)"glGetCompressedMultiTexImageEXT")) == NULL) || r; r = ((glGetCompressedTextureImageEXT = (PFNGLGETCOMPRESSEDTEXTUREIMAGEEXTPROC)glewGetProcAddress((const GLubyte*)"glGetCompressedTextureImageEXT")) == NULL) || r; r = ((glGetDoubleIndexedvEXT = (PFNGLGETDOUBLEINDEXEDVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetDoubleIndexedvEXT")) == NULL) || r; r = ((glGetDoublei_vEXT = (PFNGLGETDOUBLEI_VEXTPROC)glewGetProcAddress((const GLubyte*)"glGetDoublei_vEXT")) == NULL) || r; r = ((glGetFloatIndexedvEXT = (PFNGLGETFLOATINDEXEDVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetFloatIndexedvEXT")) == NULL) || r; r = ((glGetFloati_vEXT = (PFNGLGETFLOATI_VEXTPROC)glewGetProcAddress((const GLubyte*)"glGetFloati_vEXT")) == NULL) || r; r = ((glGetFramebufferParameterivEXT = (PFNGLGETFRAMEBUFFERPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetFramebufferParameterivEXT")) == NULL) || r; r = ((glGetMultiTexEnvfvEXT = (PFNGLGETMULTITEXENVFVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetMultiTexEnvfvEXT")) == NULL) || r; r = ((glGetMultiTexEnvivEXT = (PFNGLGETMULTITEXENVIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetMultiTexEnvivEXT")) == NULL) || r; r = ((glGetMultiTexGendvEXT = (PFNGLGETMULTITEXGENDVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetMultiTexGendvEXT")) == NULL) || r; r = ((glGetMultiTexGenfvEXT = (PFNGLGETMULTITEXGENFVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetMultiTexGenfvEXT")) == NULL) || r; r = ((glGetMultiTexGenivEXT = (PFNGLGETMULTITEXGENIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetMultiTexGenivEXT")) == NULL) || r; r = ((glGetMultiTexImageEXT = (PFNGLGETMULTITEXIMAGEEXTPROC)glewGetProcAddress((const GLubyte*)"glGetMultiTexImageEXT")) == NULL) || r; r = ((glGetMultiTexLevelParameterfvEXT = (PFNGLGETMULTITEXLEVELPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetMultiTexLevelParameterfvEXT")) == NULL) || r; r = ((glGetMultiTexLevelParameterivEXT = (PFNGLGETMULTITEXLEVELPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetMultiTexLevelParameterivEXT")) == NULL) || r; r = ((glGetMultiTexParameterIivEXT = (PFNGLGETMULTITEXPARAMETERIIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetMultiTexParameterIivEXT")) == NULL) || r; r = ((glGetMultiTexParameterIuivEXT = (PFNGLGETMULTITEXPARAMETERIUIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetMultiTexParameterIuivEXT")) == NULL) || r; r = ((glGetMultiTexParameterfvEXT = (PFNGLGETMULTITEXPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetMultiTexParameterfvEXT")) == NULL) || r; r = ((glGetMultiTexParameterivEXT = (PFNGLGETMULTITEXPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetMultiTexParameterivEXT")) == NULL) || r; r = ((glGetNamedBufferParameterivEXT = (PFNGLGETNAMEDBUFFERPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetNamedBufferParameterivEXT")) == NULL) || r; r = ((glGetNamedBufferPointervEXT = (PFNGLGETNAMEDBUFFERPOINTERVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetNamedBufferPointervEXT")) == NULL) || r; r = ((glGetNamedBufferSubDataEXT = (PFNGLGETNAMEDBUFFERSUBDATAEXTPROC)glewGetProcAddress((const GLubyte*)"glGetNamedBufferSubDataEXT")) == NULL) || r; r = ((glGetNamedFramebufferAttachmentParameterivEXT = (PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetNamedFramebufferAttachmentParameterivEXT")) == NULL) || r; r = ((glGetNamedProgramLocalParameterIivEXT = (PFNGLGETNAMEDPROGRAMLOCALPARAMETERIIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetNamedProgramLocalParameterIivEXT")) == NULL) || r; r = ((glGetNamedProgramLocalParameterIuivEXT = (PFNGLGETNAMEDPROGRAMLOCALPARAMETERIUIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetNamedProgramLocalParameterIuivEXT")) == NULL) || r; r = ((glGetNamedProgramLocalParameterdvEXT = (PFNGLGETNAMEDPROGRAMLOCALPARAMETERDVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetNamedProgramLocalParameterdvEXT")) == NULL) || r; r = ((glGetNamedProgramLocalParameterfvEXT = (PFNGLGETNAMEDPROGRAMLOCALPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetNamedProgramLocalParameterfvEXT")) == NULL) || r; r = ((glGetNamedProgramStringEXT = (PFNGLGETNAMEDPROGRAMSTRINGEXTPROC)glewGetProcAddress((const GLubyte*)"glGetNamedProgramStringEXT")) == NULL) || r; r = ((glGetNamedProgramivEXT = (PFNGLGETNAMEDPROGRAMIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetNamedProgramivEXT")) == NULL) || r; r = ((glGetNamedRenderbufferParameterivEXT = (PFNGLGETNAMEDRENDERBUFFERPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetNamedRenderbufferParameterivEXT")) == NULL) || r; r = ((glGetPointerIndexedvEXT = (PFNGLGETPOINTERINDEXEDVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetPointerIndexedvEXT")) == NULL) || r; r = ((glGetPointeri_vEXT = (PFNGLGETPOINTERI_VEXTPROC)glewGetProcAddress((const GLubyte*)"glGetPointeri_vEXT")) == NULL) || r; r = ((glGetTextureImageEXT = (PFNGLGETTEXTUREIMAGEEXTPROC)glewGetProcAddress((const GLubyte*)"glGetTextureImageEXT")) == NULL) || r; r = ((glGetTextureLevelParameterfvEXT = (PFNGLGETTEXTURELEVELPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetTextureLevelParameterfvEXT")) == NULL) || r; r = ((glGetTextureLevelParameterivEXT = (PFNGLGETTEXTURELEVELPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetTextureLevelParameterivEXT")) == NULL) || r; r = ((glGetTextureParameterIivEXT = (PFNGLGETTEXTUREPARAMETERIIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetTextureParameterIivEXT")) == NULL) || r; r = ((glGetTextureParameterIuivEXT = (PFNGLGETTEXTUREPARAMETERIUIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetTextureParameterIuivEXT")) == NULL) || r; r = ((glGetTextureParameterfvEXT = (PFNGLGETTEXTUREPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetTextureParameterfvEXT")) == NULL) || r; r = ((glGetTextureParameterivEXT = (PFNGLGETTEXTUREPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetTextureParameterivEXT")) == NULL) || r; r = ((glGetVertexArrayIntegeri_vEXT = (PFNGLGETVERTEXARRAYINTEGERI_VEXTPROC)glewGetProcAddress((const GLubyte*)"glGetVertexArrayIntegeri_vEXT")) == NULL) || r; r = ((glGetVertexArrayIntegervEXT = (PFNGLGETVERTEXARRAYINTEGERVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetVertexArrayIntegervEXT")) == NULL) || r; r = ((glGetVertexArrayPointeri_vEXT = (PFNGLGETVERTEXARRAYPOINTERI_VEXTPROC)glewGetProcAddress((const GLubyte*)"glGetVertexArrayPointeri_vEXT")) == NULL) || r; r = ((glGetVertexArrayPointervEXT = (PFNGLGETVERTEXARRAYPOINTERVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetVertexArrayPointervEXT")) == NULL) || r; r = ((glMapNamedBufferEXT = (PFNGLMAPNAMEDBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glMapNamedBufferEXT")) == NULL) || r; r = ((glMapNamedBufferRangeEXT = (PFNGLMAPNAMEDBUFFERRANGEEXTPROC)glewGetProcAddress((const GLubyte*)"glMapNamedBufferRangeEXT")) == NULL) || r; r = ((glMatrixFrustumEXT = (PFNGLMATRIXFRUSTUMEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixFrustumEXT")) == NULL) || r; r = ((glMatrixLoadIdentityEXT = (PFNGLMATRIXLOADIDENTITYEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixLoadIdentityEXT")) == NULL) || r; r = ((glMatrixLoadTransposedEXT = (PFNGLMATRIXLOADTRANSPOSEDEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixLoadTransposedEXT")) == NULL) || r; r = ((glMatrixLoadTransposefEXT = (PFNGLMATRIXLOADTRANSPOSEFEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixLoadTransposefEXT")) == NULL) || r; r = ((glMatrixLoaddEXT = (PFNGLMATRIXLOADDEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixLoaddEXT")) == NULL) || r; r = ((glMatrixLoadfEXT = (PFNGLMATRIXLOADFEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixLoadfEXT")) == NULL) || r; r = ((glMatrixMultTransposedEXT = (PFNGLMATRIXMULTTRANSPOSEDEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixMultTransposedEXT")) == NULL) || r; r = ((glMatrixMultTransposefEXT = (PFNGLMATRIXMULTTRANSPOSEFEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixMultTransposefEXT")) == NULL) || r; r = ((glMatrixMultdEXT = (PFNGLMATRIXMULTDEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixMultdEXT")) == NULL) || r; r = ((glMatrixMultfEXT = (PFNGLMATRIXMULTFEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixMultfEXT")) == NULL) || r; r = ((glMatrixOrthoEXT = (PFNGLMATRIXORTHOEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixOrthoEXT")) == NULL) || r; r = ((glMatrixPopEXT = (PFNGLMATRIXPOPEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixPopEXT")) == NULL) || r; r = ((glMatrixPushEXT = (PFNGLMATRIXPUSHEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixPushEXT")) == NULL) || r; r = ((glMatrixRotatedEXT = (PFNGLMATRIXROTATEDEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixRotatedEXT")) == NULL) || r; r = ((glMatrixRotatefEXT = (PFNGLMATRIXROTATEFEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixRotatefEXT")) == NULL) || r; r = ((glMatrixScaledEXT = (PFNGLMATRIXSCALEDEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixScaledEXT")) == NULL) || r; r = ((glMatrixScalefEXT = (PFNGLMATRIXSCALEFEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixScalefEXT")) == NULL) || r; r = ((glMatrixTranslatedEXT = (PFNGLMATRIXTRANSLATEDEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixTranslatedEXT")) == NULL) || r; r = ((glMatrixTranslatefEXT = (PFNGLMATRIXTRANSLATEFEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixTranslatefEXT")) == NULL) || r; r = ((glMultiTexBufferEXT = (PFNGLMULTITEXBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexBufferEXT")) == NULL) || r; r = ((glMultiTexCoordPointerEXT = (PFNGLMULTITEXCOORDPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoordPointerEXT")) == NULL) || r; r = ((glMultiTexEnvfEXT = (PFNGLMULTITEXENVFEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexEnvfEXT")) == NULL) || r; r = ((glMultiTexEnvfvEXT = (PFNGLMULTITEXENVFVEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexEnvfvEXT")) == NULL) || r; r = ((glMultiTexEnviEXT = (PFNGLMULTITEXENVIEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexEnviEXT")) == NULL) || r; r = ((glMultiTexEnvivEXT = (PFNGLMULTITEXENVIVEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexEnvivEXT")) == NULL) || r; r = ((glMultiTexGendEXT = (PFNGLMULTITEXGENDEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexGendEXT")) == NULL) || r; r = ((glMultiTexGendvEXT = (PFNGLMULTITEXGENDVEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexGendvEXT")) == NULL) || r; r = ((glMultiTexGenfEXT = (PFNGLMULTITEXGENFEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexGenfEXT")) == NULL) || r; r = ((glMultiTexGenfvEXT = (PFNGLMULTITEXGENFVEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexGenfvEXT")) == NULL) || r; r = ((glMultiTexGeniEXT = (PFNGLMULTITEXGENIEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexGeniEXT")) == NULL) || r; r = ((glMultiTexGenivEXT = (PFNGLMULTITEXGENIVEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexGenivEXT")) == NULL) || r; r = ((glMultiTexImage1DEXT = (PFNGLMULTITEXIMAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexImage1DEXT")) == NULL) || r; r = ((glMultiTexImage2DEXT = (PFNGLMULTITEXIMAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexImage2DEXT")) == NULL) || r; r = ((glMultiTexImage3DEXT = (PFNGLMULTITEXIMAGE3DEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexImage3DEXT")) == NULL) || r; r = ((glMultiTexParameterIivEXT = (PFNGLMULTITEXPARAMETERIIVEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexParameterIivEXT")) == NULL) || r; r = ((glMultiTexParameterIuivEXT = (PFNGLMULTITEXPARAMETERIUIVEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexParameterIuivEXT")) == NULL) || r; r = ((glMultiTexParameterfEXT = (PFNGLMULTITEXPARAMETERFEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexParameterfEXT")) == NULL) || r; r = ((glMultiTexParameterfvEXT = (PFNGLMULTITEXPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexParameterfvEXT")) == NULL) || r; r = ((glMultiTexParameteriEXT = (PFNGLMULTITEXPARAMETERIEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexParameteriEXT")) == NULL) || r; r = ((glMultiTexParameterivEXT = (PFNGLMULTITEXPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexParameterivEXT")) == NULL) || r; r = ((glMultiTexRenderbufferEXT = (PFNGLMULTITEXRENDERBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexRenderbufferEXT")) == NULL) || r; r = ((glMultiTexSubImage1DEXT = (PFNGLMULTITEXSUBIMAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexSubImage1DEXT")) == NULL) || r; r = ((glMultiTexSubImage2DEXT = (PFNGLMULTITEXSUBIMAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexSubImage2DEXT")) == NULL) || r; r = ((glMultiTexSubImage3DEXT = (PFNGLMULTITEXSUBIMAGE3DEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexSubImage3DEXT")) == NULL) || r; r = ((glNamedBufferDataEXT = (PFNGLNAMEDBUFFERDATAEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedBufferDataEXT")) == NULL) || r; r = ((glNamedBufferSubDataEXT = (PFNGLNAMEDBUFFERSUBDATAEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedBufferSubDataEXT")) == NULL) || r; r = ((glNamedCopyBufferSubDataEXT = (PFNGLNAMEDCOPYBUFFERSUBDATAEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedCopyBufferSubDataEXT")) == NULL) || r; r = ((glNamedFramebufferRenderbufferEXT = (PFNGLNAMEDFRAMEBUFFERRENDERBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glNamedFramebufferRenderbufferEXT")) == NULL) || r; r = ((glNamedFramebufferTexture1DEXT = (PFNGLNAMEDFRAMEBUFFERTEXTURE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedFramebufferTexture1DEXT")) == NULL) || r; r = ((glNamedFramebufferTexture2DEXT = (PFNGLNAMEDFRAMEBUFFERTEXTURE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedFramebufferTexture2DEXT")) == NULL) || r; r = ((glNamedFramebufferTexture3DEXT = (PFNGLNAMEDFRAMEBUFFERTEXTURE3DEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedFramebufferTexture3DEXT")) == NULL) || r; r = ((glNamedFramebufferTextureEXT = (PFNGLNAMEDFRAMEBUFFERTEXTUREEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedFramebufferTextureEXT")) == NULL) || r; r = ((glNamedFramebufferTextureFaceEXT = (PFNGLNAMEDFRAMEBUFFERTEXTUREFACEEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedFramebufferTextureFaceEXT")) == NULL) || r; r = ((glNamedFramebufferTextureLayerEXT = (PFNGLNAMEDFRAMEBUFFERTEXTURELAYEREXTPROC)glewGetProcAddress((const GLubyte*)"glNamedFramebufferTextureLayerEXT")) == NULL) || r; r = ((glNamedProgramLocalParameter4dEXT = (PFNGLNAMEDPROGRAMLOCALPARAMETER4DEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedProgramLocalParameter4dEXT")) == NULL) || r; r = ((glNamedProgramLocalParameter4dvEXT = (PFNGLNAMEDPROGRAMLOCALPARAMETER4DVEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedProgramLocalParameter4dvEXT")) == NULL) || r; r = ((glNamedProgramLocalParameter4fEXT = (PFNGLNAMEDPROGRAMLOCALPARAMETER4FEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedProgramLocalParameter4fEXT")) == NULL) || r; r = ((glNamedProgramLocalParameter4fvEXT = (PFNGLNAMEDPROGRAMLOCALPARAMETER4FVEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedProgramLocalParameter4fvEXT")) == NULL) || r; r = ((glNamedProgramLocalParameterI4iEXT = (PFNGLNAMEDPROGRAMLOCALPARAMETERI4IEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedProgramLocalParameterI4iEXT")) == NULL) || r; r = ((glNamedProgramLocalParameterI4ivEXT = (PFNGLNAMEDPROGRAMLOCALPARAMETERI4IVEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedProgramLocalParameterI4ivEXT")) == NULL) || r; r = ((glNamedProgramLocalParameterI4uiEXT = (PFNGLNAMEDPROGRAMLOCALPARAMETERI4UIEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedProgramLocalParameterI4uiEXT")) == NULL) || r; r = ((glNamedProgramLocalParameterI4uivEXT = (PFNGLNAMEDPROGRAMLOCALPARAMETERI4UIVEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedProgramLocalParameterI4uivEXT")) == NULL) || r; r = ((glNamedProgramLocalParameters4fvEXT = (PFNGLNAMEDPROGRAMLOCALPARAMETERS4FVEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedProgramLocalParameters4fvEXT")) == NULL) || r; r = ((glNamedProgramLocalParametersI4ivEXT = (PFNGLNAMEDPROGRAMLOCALPARAMETERSI4IVEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedProgramLocalParametersI4ivEXT")) == NULL) || r; r = ((glNamedProgramLocalParametersI4uivEXT = (PFNGLNAMEDPROGRAMLOCALPARAMETERSI4UIVEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedProgramLocalParametersI4uivEXT")) == NULL) || r; r = ((glNamedProgramStringEXT = (PFNGLNAMEDPROGRAMSTRINGEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedProgramStringEXT")) == NULL) || r; r = ((glNamedRenderbufferStorageEXT = (PFNGLNAMEDRENDERBUFFERSTORAGEEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedRenderbufferStorageEXT")) == NULL) || r; r = ((glNamedRenderbufferStorageMultisampleCoverageEXT = (PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLECOVERAGEEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedRenderbufferStorageMultisampleCoverageEXT")) == NULL) || r; r = ((glNamedRenderbufferStorageMultisampleEXT = (PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedRenderbufferStorageMultisampleEXT")) == NULL) || r; r = ((glProgramUniform1dEXT = (PFNGLPROGRAMUNIFORM1DEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1dEXT")) == NULL) || r; r = ((glProgramUniform1dvEXT = (PFNGLPROGRAMUNIFORM1DVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1dvEXT")) == NULL) || r; r = ((glProgramUniform1fEXT = (PFNGLPROGRAMUNIFORM1FEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1fEXT")) == NULL) || r; r = ((glProgramUniform1fvEXT = (PFNGLPROGRAMUNIFORM1FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1fvEXT")) == NULL) || r; r = ((glProgramUniform1iEXT = (PFNGLPROGRAMUNIFORM1IEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1iEXT")) == NULL) || r; r = ((glProgramUniform1ivEXT = (PFNGLPROGRAMUNIFORM1IVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1ivEXT")) == NULL) || r; r = ((glProgramUniform1uiEXT = (PFNGLPROGRAMUNIFORM1UIEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1uiEXT")) == NULL) || r; r = ((glProgramUniform1uivEXT = (PFNGLPROGRAMUNIFORM1UIVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1uivEXT")) == NULL) || r; r = ((glProgramUniform2dEXT = (PFNGLPROGRAMUNIFORM2DEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2dEXT")) == NULL) || r; r = ((glProgramUniform2dvEXT = (PFNGLPROGRAMUNIFORM2DVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2dvEXT")) == NULL) || r; r = ((glProgramUniform2fEXT = (PFNGLPROGRAMUNIFORM2FEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2fEXT")) == NULL) || r; r = ((glProgramUniform2fvEXT = (PFNGLPROGRAMUNIFORM2FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2fvEXT")) == NULL) || r; r = ((glProgramUniform2iEXT = (PFNGLPROGRAMUNIFORM2IEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2iEXT")) == NULL) || r; r = ((glProgramUniform2ivEXT = (PFNGLPROGRAMUNIFORM2IVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2ivEXT")) == NULL) || r; r = ((glProgramUniform2uiEXT = (PFNGLPROGRAMUNIFORM2UIEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2uiEXT")) == NULL) || r; r = ((glProgramUniform2uivEXT = (PFNGLPROGRAMUNIFORM2UIVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2uivEXT")) == NULL) || r; r = ((glProgramUniform3dEXT = (PFNGLPROGRAMUNIFORM3DEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3dEXT")) == NULL) || r; r = ((glProgramUniform3dvEXT = (PFNGLPROGRAMUNIFORM3DVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3dvEXT")) == NULL) || r; r = ((glProgramUniform3fEXT = (PFNGLPROGRAMUNIFORM3FEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3fEXT")) == NULL) || r; r = ((glProgramUniform3fvEXT = (PFNGLPROGRAMUNIFORM3FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3fvEXT")) == NULL) || r; r = ((glProgramUniform3iEXT = (PFNGLPROGRAMUNIFORM3IEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3iEXT")) == NULL) || r; r = ((glProgramUniform3ivEXT = (PFNGLPROGRAMUNIFORM3IVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3ivEXT")) == NULL) || r; r = ((glProgramUniform3uiEXT = (PFNGLPROGRAMUNIFORM3UIEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3uiEXT")) == NULL) || r; r = ((glProgramUniform3uivEXT = (PFNGLPROGRAMUNIFORM3UIVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3uivEXT")) == NULL) || r; r = ((glProgramUniform4dEXT = (PFNGLPROGRAMUNIFORM4DEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4dEXT")) == NULL) || r; r = ((glProgramUniform4dvEXT = (PFNGLPROGRAMUNIFORM4DVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4dvEXT")) == NULL) || r; r = ((glProgramUniform4fEXT = (PFNGLPROGRAMUNIFORM4FEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4fEXT")) == NULL) || r; r = ((glProgramUniform4fvEXT = (PFNGLPROGRAMUNIFORM4FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4fvEXT")) == NULL) || r; r = ((glProgramUniform4iEXT = (PFNGLPROGRAMUNIFORM4IEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4iEXT")) == NULL) || r; r = ((glProgramUniform4ivEXT = (PFNGLPROGRAMUNIFORM4IVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4ivEXT")) == NULL) || r; r = ((glProgramUniform4uiEXT = (PFNGLPROGRAMUNIFORM4UIEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4uiEXT")) == NULL) || r; r = ((glProgramUniform4uivEXT = (PFNGLPROGRAMUNIFORM4UIVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4uivEXT")) == NULL) || r; r = ((glProgramUniformMatrix2dvEXT = (PFNGLPROGRAMUNIFORMMATRIX2DVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix2dvEXT")) == NULL) || r; r = ((glProgramUniformMatrix2fvEXT = (PFNGLPROGRAMUNIFORMMATRIX2FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix2fvEXT")) == NULL) || r; r = ((glProgramUniformMatrix2x3dvEXT = (PFNGLPROGRAMUNIFORMMATRIX2X3DVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix2x3dvEXT")) == NULL) || r; r = ((glProgramUniformMatrix2x3fvEXT = (PFNGLPROGRAMUNIFORMMATRIX2X3FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix2x3fvEXT")) == NULL) || r; r = ((glProgramUniformMatrix2x4dvEXT = (PFNGLPROGRAMUNIFORMMATRIX2X4DVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix2x4dvEXT")) == NULL) || r; r = ((glProgramUniformMatrix2x4fvEXT = (PFNGLPROGRAMUNIFORMMATRIX2X4FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix2x4fvEXT")) == NULL) || r; r = ((glProgramUniformMatrix3dvEXT = (PFNGLPROGRAMUNIFORMMATRIX3DVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix3dvEXT")) == NULL) || r; r = ((glProgramUniformMatrix3fvEXT = (PFNGLPROGRAMUNIFORMMATRIX3FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix3fvEXT")) == NULL) || r; r = ((glProgramUniformMatrix3x2dvEXT = (PFNGLPROGRAMUNIFORMMATRIX3X2DVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix3x2dvEXT")) == NULL) || r; r = ((glProgramUniformMatrix3x2fvEXT = (PFNGLPROGRAMUNIFORMMATRIX3X2FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix3x2fvEXT")) == NULL) || r; r = ((glProgramUniformMatrix3x4dvEXT = (PFNGLPROGRAMUNIFORMMATRIX3X4DVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix3x4dvEXT")) == NULL) || r; r = ((glProgramUniformMatrix3x4fvEXT = (PFNGLPROGRAMUNIFORMMATRIX3X4FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix3x4fvEXT")) == NULL) || r; r = ((glProgramUniformMatrix4dvEXT = (PFNGLPROGRAMUNIFORMMATRIX4DVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix4dvEXT")) == NULL) || r; r = ((glProgramUniformMatrix4fvEXT = (PFNGLPROGRAMUNIFORMMATRIX4FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix4fvEXT")) == NULL) || r; r = ((glProgramUniformMatrix4x2dvEXT = (PFNGLPROGRAMUNIFORMMATRIX4X2DVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix4x2dvEXT")) == NULL) || r; r = ((glProgramUniformMatrix4x2fvEXT = (PFNGLPROGRAMUNIFORMMATRIX4X2FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix4x2fvEXT")) == NULL) || r; r = ((glProgramUniformMatrix4x3dvEXT = (PFNGLPROGRAMUNIFORMMATRIX4X3DVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix4x3dvEXT")) == NULL) || r; r = ((glProgramUniformMatrix4x3fvEXT = (PFNGLPROGRAMUNIFORMMATRIX4X3FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix4x3fvEXT")) == NULL) || r; r = ((glPushClientAttribDefaultEXT = (PFNGLPUSHCLIENTATTRIBDEFAULTEXTPROC)glewGetProcAddress((const GLubyte*)"glPushClientAttribDefaultEXT")) == NULL) || r; r = ((glTextureBufferEXT = (PFNGLTEXTUREBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glTextureBufferEXT")) == NULL) || r; r = ((glTextureImage1DEXT = (PFNGLTEXTUREIMAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureImage1DEXT")) == NULL) || r; r = ((glTextureImage2DEXT = (PFNGLTEXTUREIMAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureImage2DEXT")) == NULL) || r; r = ((glTextureImage3DEXT = (PFNGLTEXTUREIMAGE3DEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureImage3DEXT")) == NULL) || r; r = ((glTextureParameterIivEXT = (PFNGLTEXTUREPARAMETERIIVEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureParameterIivEXT")) == NULL) || r; r = ((glTextureParameterIuivEXT = (PFNGLTEXTUREPARAMETERIUIVEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureParameterIuivEXT")) == NULL) || r; r = ((glTextureParameterfEXT = (PFNGLTEXTUREPARAMETERFEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureParameterfEXT")) == NULL) || r; r = ((glTextureParameterfvEXT = (PFNGLTEXTUREPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureParameterfvEXT")) == NULL) || r; r = ((glTextureParameteriEXT = (PFNGLTEXTUREPARAMETERIEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureParameteriEXT")) == NULL) || r; r = ((glTextureParameterivEXT = (PFNGLTEXTUREPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureParameterivEXT")) == NULL) || r; r = ((glTextureRenderbufferEXT = (PFNGLTEXTURERENDERBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glTextureRenderbufferEXT")) == NULL) || r; r = ((glTextureSubImage1DEXT = (PFNGLTEXTURESUBIMAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureSubImage1DEXT")) == NULL) || r; r = ((glTextureSubImage2DEXT = (PFNGLTEXTURESUBIMAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureSubImage2DEXT")) == NULL) || r; r = ((glTextureSubImage3DEXT = (PFNGLTEXTURESUBIMAGE3DEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureSubImage3DEXT")) == NULL) || r; r = ((glUnmapNamedBufferEXT = (PFNGLUNMAPNAMEDBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glUnmapNamedBufferEXT")) == NULL) || r; r = ((glVertexArrayColorOffsetEXT = (PFNGLVERTEXARRAYCOLOROFFSETEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayColorOffsetEXT")) == NULL) || r; r = ((glVertexArrayEdgeFlagOffsetEXT = (PFNGLVERTEXARRAYEDGEFLAGOFFSETEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayEdgeFlagOffsetEXT")) == NULL) || r; r = ((glVertexArrayFogCoordOffsetEXT = (PFNGLVERTEXARRAYFOGCOORDOFFSETEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayFogCoordOffsetEXT")) == NULL) || r; r = ((glVertexArrayIndexOffsetEXT = (PFNGLVERTEXARRAYINDEXOFFSETEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayIndexOffsetEXT")) == NULL) || r; r = ((glVertexArrayMultiTexCoordOffsetEXT = (PFNGLVERTEXARRAYMULTITEXCOORDOFFSETEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayMultiTexCoordOffsetEXT")) == NULL) || r; r = ((glVertexArrayNormalOffsetEXT = (PFNGLVERTEXARRAYNORMALOFFSETEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayNormalOffsetEXT")) == NULL) || r; r = ((glVertexArraySecondaryColorOffsetEXT = (PFNGLVERTEXARRAYSECONDARYCOLOROFFSETEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArraySecondaryColorOffsetEXT")) == NULL) || r; r = ((glVertexArrayTexCoordOffsetEXT = (PFNGLVERTEXARRAYTEXCOORDOFFSETEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayTexCoordOffsetEXT")) == NULL) || r; r = ((glVertexArrayVertexAttribIOffsetEXT = (PFNGLVERTEXARRAYVERTEXATTRIBIOFFSETEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayVertexAttribIOffsetEXT")) == NULL) || r; r = ((glVertexArrayVertexAttribOffsetEXT = (PFNGLVERTEXARRAYVERTEXATTRIBOFFSETEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayVertexAttribOffsetEXT")) == NULL) || r; r = ((glVertexArrayVertexOffsetEXT = (PFNGLVERTEXARRAYVERTEXOFFSETEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayVertexOffsetEXT")) == NULL) || r; return r; } #endif /* GL_EXT_direct_state_access */ #ifdef GL_EXT_draw_buffers2 static GLboolean _glewInit_GL_EXT_draw_buffers2 (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glColorMaskIndexedEXT = (PFNGLCOLORMASKINDEXEDEXTPROC)glewGetProcAddress((const GLubyte*)"glColorMaskIndexedEXT")) == NULL) || r; r = ((glDisableIndexedEXT = (PFNGLDISABLEINDEXEDEXTPROC)glewGetProcAddress((const GLubyte*)"glDisableIndexedEXT")) == NULL) || r; r = ((glEnableIndexedEXT = (PFNGLENABLEINDEXEDEXTPROC)glewGetProcAddress((const GLubyte*)"glEnableIndexedEXT")) == NULL) || r; r = ((glGetBooleanIndexedvEXT = (PFNGLGETBOOLEANINDEXEDVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetBooleanIndexedvEXT")) == NULL) || r; r = ((glGetIntegerIndexedvEXT = (PFNGLGETINTEGERINDEXEDVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetIntegerIndexedvEXT")) == NULL) || r; r = ((glIsEnabledIndexedEXT = (PFNGLISENABLEDINDEXEDEXTPROC)glewGetProcAddress((const GLubyte*)"glIsEnabledIndexedEXT")) == NULL) || r; return r; } #endif /* GL_EXT_draw_buffers2 */ #ifdef GL_EXT_draw_instanced static GLboolean _glewInit_GL_EXT_draw_instanced (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glDrawArraysInstancedEXT = (PFNGLDRAWARRAYSINSTANCEDEXTPROC)glewGetProcAddress((const GLubyte*)"glDrawArraysInstancedEXT")) == NULL) || r; r = ((glDrawElementsInstancedEXT = (PFNGLDRAWELEMENTSINSTANCEDEXTPROC)glewGetProcAddress((const GLubyte*)"glDrawElementsInstancedEXT")) == NULL) || r; return r; } #endif /* GL_EXT_draw_instanced */ #ifdef GL_EXT_draw_range_elements static GLboolean _glewInit_GL_EXT_draw_range_elements (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glDrawRangeElementsEXT = (PFNGLDRAWRANGEELEMENTSEXTPROC)glewGetProcAddress((const GLubyte*)"glDrawRangeElementsEXT")) == NULL) || r; return r; } #endif /* GL_EXT_draw_range_elements */ #ifdef GL_EXT_fog_coord static GLboolean _glewInit_GL_EXT_fog_coord (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glFogCoordPointerEXT = (PFNGLFOGCOORDPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glFogCoordPointerEXT")) == NULL) || r; r = ((glFogCoorddEXT = (PFNGLFOGCOORDDEXTPROC)glewGetProcAddress((const GLubyte*)"glFogCoorddEXT")) == NULL) || r; r = ((glFogCoorddvEXT = (PFNGLFOGCOORDDVEXTPROC)glewGetProcAddress((const GLubyte*)"glFogCoorddvEXT")) == NULL) || r; r = ((glFogCoordfEXT = (PFNGLFOGCOORDFEXTPROC)glewGetProcAddress((const GLubyte*)"glFogCoordfEXT")) == NULL) || r; r = ((glFogCoordfvEXT = (PFNGLFOGCOORDFVEXTPROC)glewGetProcAddress((const GLubyte*)"glFogCoordfvEXT")) == NULL) || r; return r; } #endif /* GL_EXT_fog_coord */ #ifdef GL_EXT_fragment_lighting static GLboolean _glewInit_GL_EXT_fragment_lighting (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glFragmentColorMaterialEXT = (PFNGLFRAGMENTCOLORMATERIALEXTPROC)glewGetProcAddress((const GLubyte*)"glFragmentColorMaterialEXT")) == NULL) || r; r = ((glFragmentLightModelfEXT = (PFNGLFRAGMENTLIGHTMODELFEXTPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightModelfEXT")) == NULL) || r; r = ((glFragmentLightModelfvEXT = (PFNGLFRAGMENTLIGHTMODELFVEXTPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightModelfvEXT")) == NULL) || r; r = ((glFragmentLightModeliEXT = (PFNGLFRAGMENTLIGHTMODELIEXTPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightModeliEXT")) == NULL) || r; r = ((glFragmentLightModelivEXT = (PFNGLFRAGMENTLIGHTMODELIVEXTPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightModelivEXT")) == NULL) || r; r = ((glFragmentLightfEXT = (PFNGLFRAGMENTLIGHTFEXTPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightfEXT")) == NULL) || r; r = ((glFragmentLightfvEXT = (PFNGLFRAGMENTLIGHTFVEXTPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightfvEXT")) == NULL) || r; r = ((glFragmentLightiEXT = (PFNGLFRAGMENTLIGHTIEXTPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightiEXT")) == NULL) || r; r = ((glFragmentLightivEXT = (PFNGLFRAGMENTLIGHTIVEXTPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightivEXT")) == NULL) || r; r = ((glFragmentMaterialfEXT = (PFNGLFRAGMENTMATERIALFEXTPROC)glewGetProcAddress((const GLubyte*)"glFragmentMaterialfEXT")) == NULL) || r; r = ((glFragmentMaterialfvEXT = (PFNGLFRAGMENTMATERIALFVEXTPROC)glewGetProcAddress((const GLubyte*)"glFragmentMaterialfvEXT")) == NULL) || r; r = ((glFragmentMaterialiEXT = (PFNGLFRAGMENTMATERIALIEXTPROC)glewGetProcAddress((const GLubyte*)"glFragmentMaterialiEXT")) == NULL) || r; r = ((glFragmentMaterialivEXT = (PFNGLFRAGMENTMATERIALIVEXTPROC)glewGetProcAddress((const GLubyte*)"glFragmentMaterialivEXT")) == NULL) || r; r = ((glGetFragmentLightfvEXT = (PFNGLGETFRAGMENTLIGHTFVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetFragmentLightfvEXT")) == NULL) || r; r = ((glGetFragmentLightivEXT = (PFNGLGETFRAGMENTLIGHTIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetFragmentLightivEXT")) == NULL) || r; r = ((glGetFragmentMaterialfvEXT = (PFNGLGETFRAGMENTMATERIALFVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetFragmentMaterialfvEXT")) == NULL) || r; r = ((glGetFragmentMaterialivEXT = (PFNGLGETFRAGMENTMATERIALIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetFragmentMaterialivEXT")) == NULL) || r; r = ((glLightEnviEXT = (PFNGLLIGHTENVIEXTPROC)glewGetProcAddress((const GLubyte*)"glLightEnviEXT")) == NULL) || r; return r; } #endif /* GL_EXT_fragment_lighting */ #ifdef GL_EXT_framebuffer_blit static GLboolean _glewInit_GL_EXT_framebuffer_blit (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glBlitFramebufferEXT = (PFNGLBLITFRAMEBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glBlitFramebufferEXT")) == NULL) || r; return r; } #endif /* GL_EXT_framebuffer_blit */ #ifdef GL_EXT_framebuffer_multisample static GLboolean _glewInit_GL_EXT_framebuffer_multisample (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glRenderbufferStorageMultisampleEXT = (PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC)glewGetProcAddress((const GLubyte*)"glRenderbufferStorageMultisampleEXT")) == NULL) || r; return r; } #endif /* GL_EXT_framebuffer_multisample */ #ifdef GL_EXT_framebuffer_multisample_blit_scaled #endif /* GL_EXT_framebuffer_multisample_blit_scaled */ #ifdef GL_EXT_framebuffer_object static GLboolean _glewInit_GL_EXT_framebuffer_object (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glBindFramebufferEXT = (PFNGLBINDFRAMEBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glBindFramebufferEXT")) == NULL) || r; r = ((glBindRenderbufferEXT = (PFNGLBINDRENDERBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glBindRenderbufferEXT")) == NULL) || r; r = ((glCheckFramebufferStatusEXT = (PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC)glewGetProcAddress((const GLubyte*)"glCheckFramebufferStatusEXT")) == NULL) || r; r = ((glDeleteFramebuffersEXT = (PFNGLDELETEFRAMEBUFFERSEXTPROC)glewGetProcAddress((const GLubyte*)"glDeleteFramebuffersEXT")) == NULL) || r; r = ((glDeleteRenderbuffersEXT = (PFNGLDELETERENDERBUFFERSEXTPROC)glewGetProcAddress((const GLubyte*)"glDeleteRenderbuffersEXT")) == NULL) || r; r = ((glFramebufferRenderbufferEXT = (PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glFramebufferRenderbufferEXT")) == NULL) || r; r = ((glFramebufferTexture1DEXT = (PFNGLFRAMEBUFFERTEXTURE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTexture1DEXT")) == NULL) || r; r = ((glFramebufferTexture2DEXT = (PFNGLFRAMEBUFFERTEXTURE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTexture2DEXT")) == NULL) || r; r = ((glFramebufferTexture3DEXT = (PFNGLFRAMEBUFFERTEXTURE3DEXTPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTexture3DEXT")) == NULL) || r; r = ((glGenFramebuffersEXT = (PFNGLGENFRAMEBUFFERSEXTPROC)glewGetProcAddress((const GLubyte*)"glGenFramebuffersEXT")) == NULL) || r; r = ((glGenRenderbuffersEXT = (PFNGLGENRENDERBUFFERSEXTPROC)glewGetProcAddress((const GLubyte*)"glGenRenderbuffersEXT")) == NULL) || r; r = ((glGenerateMipmapEXT = (PFNGLGENERATEMIPMAPEXTPROC)glewGetProcAddress((const GLubyte*)"glGenerateMipmapEXT")) == NULL) || r; r = ((glGetFramebufferAttachmentParameterivEXT = (PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetFramebufferAttachmentParameterivEXT")) == NULL) || r; r = ((glGetRenderbufferParameterivEXT = (PFNGLGETRENDERBUFFERPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetRenderbufferParameterivEXT")) == NULL) || r; r = ((glIsFramebufferEXT = (PFNGLISFRAMEBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glIsFramebufferEXT")) == NULL) || r; r = ((glIsRenderbufferEXT = (PFNGLISRENDERBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glIsRenderbufferEXT")) == NULL) || r; r = ((glRenderbufferStorageEXT = (PFNGLRENDERBUFFERSTORAGEEXTPROC)glewGetProcAddress((const GLubyte*)"glRenderbufferStorageEXT")) == NULL) || r; return r; } #endif /* GL_EXT_framebuffer_object */ #ifdef GL_EXT_framebuffer_sRGB #endif /* GL_EXT_framebuffer_sRGB */ #ifdef GL_EXT_geometry_shader4 static GLboolean _glewInit_GL_EXT_geometry_shader4 (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glFramebufferTextureEXT = (PFNGLFRAMEBUFFERTEXTUREEXTPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTextureEXT")) == NULL) || r; r = ((glFramebufferTextureFaceEXT = (PFNGLFRAMEBUFFERTEXTUREFACEEXTPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTextureFaceEXT")) == NULL) || r; r = ((glProgramParameteriEXT = (PFNGLPROGRAMPARAMETERIEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramParameteriEXT")) == NULL) || r; return r; } #endif /* GL_EXT_geometry_shader4 */ #ifdef GL_EXT_gpu_program_parameters static GLboolean _glewInit_GL_EXT_gpu_program_parameters (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glProgramEnvParameters4fvEXT = (PFNGLPROGRAMENVPARAMETERS4FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramEnvParameters4fvEXT")) == NULL) || r; r = ((glProgramLocalParameters4fvEXT = (PFNGLPROGRAMLOCALPARAMETERS4FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramLocalParameters4fvEXT")) == NULL) || r; return r; } #endif /* GL_EXT_gpu_program_parameters */ #ifdef GL_EXT_gpu_shader4 static GLboolean _glewInit_GL_EXT_gpu_shader4 (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glBindFragDataLocationEXT = (PFNGLBINDFRAGDATALOCATIONEXTPROC)glewGetProcAddress((const GLubyte*)"glBindFragDataLocationEXT")) == NULL) || r; r = ((glGetFragDataLocationEXT = (PFNGLGETFRAGDATALOCATIONEXTPROC)glewGetProcAddress((const GLubyte*)"glGetFragDataLocationEXT")) == NULL) || r; r = ((glGetUniformuivEXT = (PFNGLGETUNIFORMUIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetUniformuivEXT")) == NULL) || r; r = ((glGetVertexAttribIivEXT = (PFNGLGETVERTEXATTRIBIIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribIivEXT")) == NULL) || r; r = ((glGetVertexAttribIuivEXT = (PFNGLGETVERTEXATTRIBIUIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribIuivEXT")) == NULL) || r; r = ((glUniform1uiEXT = (PFNGLUNIFORM1UIEXTPROC)glewGetProcAddress((const GLubyte*)"glUniform1uiEXT")) == NULL) || r; r = ((glUniform1uivEXT = (PFNGLUNIFORM1UIVEXTPROC)glewGetProcAddress((const GLubyte*)"glUniform1uivEXT")) == NULL) || r; r = ((glUniform2uiEXT = (PFNGLUNIFORM2UIEXTPROC)glewGetProcAddress((const GLubyte*)"glUniform2uiEXT")) == NULL) || r; r = ((glUniform2uivEXT = (PFNGLUNIFORM2UIVEXTPROC)glewGetProcAddress((const GLubyte*)"glUniform2uivEXT")) == NULL) || r; r = ((glUniform3uiEXT = (PFNGLUNIFORM3UIEXTPROC)glewGetProcAddress((const GLubyte*)"glUniform3uiEXT")) == NULL) || r; r = ((glUniform3uivEXT = (PFNGLUNIFORM3UIVEXTPROC)glewGetProcAddress((const GLubyte*)"glUniform3uivEXT")) == NULL) || r; r = ((glUniform4uiEXT = (PFNGLUNIFORM4UIEXTPROC)glewGetProcAddress((const GLubyte*)"glUniform4uiEXT")) == NULL) || r; r = ((glUniform4uivEXT = (PFNGLUNIFORM4UIVEXTPROC)glewGetProcAddress((const GLubyte*)"glUniform4uivEXT")) == NULL) || r; r = ((glVertexAttribI1iEXT = (PFNGLVERTEXATTRIBI1IEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI1iEXT")) == NULL) || r; r = ((glVertexAttribI1ivEXT = (PFNGLVERTEXATTRIBI1IVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI1ivEXT")) == NULL) || r; r = ((glVertexAttribI1uiEXT = (PFNGLVERTEXATTRIBI1UIEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI1uiEXT")) == NULL) || r; r = ((glVertexAttribI1uivEXT = (PFNGLVERTEXATTRIBI1UIVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI1uivEXT")) == NULL) || r; r = ((glVertexAttribI2iEXT = (PFNGLVERTEXATTRIBI2IEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI2iEXT")) == NULL) || r; r = ((glVertexAttribI2ivEXT = (PFNGLVERTEXATTRIBI2IVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI2ivEXT")) == NULL) || r; r = ((glVertexAttribI2uiEXT = (PFNGLVERTEXATTRIBI2UIEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI2uiEXT")) == NULL) || r; r = ((glVertexAttribI2uivEXT = (PFNGLVERTEXATTRIBI2UIVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI2uivEXT")) == NULL) || r; r = ((glVertexAttribI3iEXT = (PFNGLVERTEXATTRIBI3IEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI3iEXT")) == NULL) || r; r = ((glVertexAttribI3ivEXT = (PFNGLVERTEXATTRIBI3IVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI3ivEXT")) == NULL) || r; r = ((glVertexAttribI3uiEXT = (PFNGLVERTEXATTRIBI3UIEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI3uiEXT")) == NULL) || r; r = ((glVertexAttribI3uivEXT = (PFNGLVERTEXATTRIBI3UIVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI3uivEXT")) == NULL) || r; r = ((glVertexAttribI4bvEXT = (PFNGLVERTEXATTRIBI4BVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI4bvEXT")) == NULL) || r; r = ((glVertexAttribI4iEXT = (PFNGLVERTEXATTRIBI4IEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI4iEXT")) == NULL) || r; r = ((glVertexAttribI4ivEXT = (PFNGLVERTEXATTRIBI4IVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI4ivEXT")) == NULL) || r; r = ((glVertexAttribI4svEXT = (PFNGLVERTEXATTRIBI4SVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI4svEXT")) == NULL) || r; r = ((glVertexAttribI4ubvEXT = (PFNGLVERTEXATTRIBI4UBVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI4ubvEXT")) == NULL) || r; r = ((glVertexAttribI4uiEXT = (PFNGLVERTEXATTRIBI4UIEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI4uiEXT")) == NULL) || r; r = ((glVertexAttribI4uivEXT = (PFNGLVERTEXATTRIBI4UIVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI4uivEXT")) == NULL) || r; r = ((glVertexAttribI4usvEXT = (PFNGLVERTEXATTRIBI4USVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI4usvEXT")) == NULL) || r; r = ((glVertexAttribIPointerEXT = (PFNGLVERTEXATTRIBIPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribIPointerEXT")) == NULL) || r; return r; } #endif /* GL_EXT_gpu_shader4 */ #ifdef GL_EXT_histogram static GLboolean _glewInit_GL_EXT_histogram (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glGetHistogramEXT = (PFNGLGETHISTOGRAMEXTPROC)glewGetProcAddress((const GLubyte*)"glGetHistogramEXT")) == NULL) || r; r = ((glGetHistogramParameterfvEXT = (PFNGLGETHISTOGRAMPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetHistogramParameterfvEXT")) == NULL) || r; r = ((glGetHistogramParameterivEXT = (PFNGLGETHISTOGRAMPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetHistogramParameterivEXT")) == NULL) || r; r = ((glGetMinmaxEXT = (PFNGLGETMINMAXEXTPROC)glewGetProcAddress((const GLubyte*)"glGetMinmaxEXT")) == NULL) || r; r = ((glGetMinmaxParameterfvEXT = (PFNGLGETMINMAXPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetMinmaxParameterfvEXT")) == NULL) || r; r = ((glGetMinmaxParameterivEXT = (PFNGLGETMINMAXPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetMinmaxParameterivEXT")) == NULL) || r; r = ((glHistogramEXT = (PFNGLHISTOGRAMEXTPROC)glewGetProcAddress((const GLubyte*)"glHistogramEXT")) == NULL) || r; r = ((glMinmaxEXT = (PFNGLMINMAXEXTPROC)glewGetProcAddress((const GLubyte*)"glMinmaxEXT")) == NULL) || r; r = ((glResetHistogramEXT = (PFNGLRESETHISTOGRAMEXTPROC)glewGetProcAddress((const GLubyte*)"glResetHistogramEXT")) == NULL) || r; r = ((glResetMinmaxEXT = (PFNGLRESETMINMAXEXTPROC)glewGetProcAddress((const GLubyte*)"glResetMinmaxEXT")) == NULL) || r; return r; } #endif /* GL_EXT_histogram */ #ifdef GL_EXT_index_array_formats #endif /* GL_EXT_index_array_formats */ #ifdef GL_EXT_index_func static GLboolean _glewInit_GL_EXT_index_func (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glIndexFuncEXT = (PFNGLINDEXFUNCEXTPROC)glewGetProcAddress((const GLubyte*)"glIndexFuncEXT")) == NULL) || r; return r; } #endif /* GL_EXT_index_func */ #ifdef GL_EXT_index_material static GLboolean _glewInit_GL_EXT_index_material (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glIndexMaterialEXT = (PFNGLINDEXMATERIALEXTPROC)glewGetProcAddress((const GLubyte*)"glIndexMaterialEXT")) == NULL) || r; return r; } #endif /* GL_EXT_index_material */ #ifdef GL_EXT_index_texture #endif /* GL_EXT_index_texture */ #ifdef GL_EXT_light_texture static GLboolean _glewInit_GL_EXT_light_texture (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glApplyTextureEXT = (PFNGLAPPLYTEXTUREEXTPROC)glewGetProcAddress((const GLubyte*)"glApplyTextureEXT")) == NULL) || r; r = ((glTextureLightEXT = (PFNGLTEXTURELIGHTEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureLightEXT")) == NULL) || r; r = ((glTextureMaterialEXT = (PFNGLTEXTUREMATERIALEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureMaterialEXT")) == NULL) || r; return r; } #endif /* GL_EXT_light_texture */ #ifdef GL_EXT_misc_attribute #endif /* GL_EXT_misc_attribute */ #ifdef GL_EXT_multi_draw_arrays static GLboolean _glewInit_GL_EXT_multi_draw_arrays (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glMultiDrawArraysEXT = (PFNGLMULTIDRAWARRAYSEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawArraysEXT")) == NULL) || r; r = ((glMultiDrawElementsEXT = (PFNGLMULTIDRAWELEMENTSEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawElementsEXT")) == NULL) || r; return r; } #endif /* GL_EXT_multi_draw_arrays */ #ifdef GL_EXT_multisample static GLboolean _glewInit_GL_EXT_multisample (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glSampleMaskEXT = (PFNGLSAMPLEMASKEXTPROC)glewGetProcAddress((const GLubyte*)"glSampleMaskEXT")) == NULL) || r; r = ((glSamplePatternEXT = (PFNGLSAMPLEPATTERNEXTPROC)glewGetProcAddress((const GLubyte*)"glSamplePatternEXT")) == NULL) || r; return r; } #endif /* GL_EXT_multisample */ #ifdef GL_EXT_packed_depth_stencil #endif /* GL_EXT_packed_depth_stencil */ #ifdef GL_EXT_packed_float #endif /* GL_EXT_packed_float */ #ifdef GL_EXT_packed_pixels #endif /* GL_EXT_packed_pixels */ #ifdef GL_EXT_paletted_texture static GLboolean _glewInit_GL_EXT_paletted_texture (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glColorTableEXT = (PFNGLCOLORTABLEEXTPROC)glewGetProcAddress((const GLubyte*)"glColorTableEXT")) == NULL) || r; r = ((glGetColorTableEXT = (PFNGLGETCOLORTABLEEXTPROC)glewGetProcAddress((const GLubyte*)"glGetColorTableEXT")) == NULL) || r; r = ((glGetColorTableParameterfvEXT = (PFNGLGETCOLORTABLEPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetColorTableParameterfvEXT")) == NULL) || r; r = ((glGetColorTableParameterivEXT = (PFNGLGETCOLORTABLEPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetColorTableParameterivEXT")) == NULL) || r; return r; } #endif /* GL_EXT_paletted_texture */ #ifdef GL_EXT_pixel_buffer_object #endif /* GL_EXT_pixel_buffer_object */ #ifdef GL_EXT_pixel_transform static GLboolean _glewInit_GL_EXT_pixel_transform (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glGetPixelTransformParameterfvEXT = (PFNGLGETPIXELTRANSFORMPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetPixelTransformParameterfvEXT")) == NULL) || r; r = ((glGetPixelTransformParameterivEXT = (PFNGLGETPIXELTRANSFORMPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetPixelTransformParameterivEXT")) == NULL) || r; r = ((glPixelTransformParameterfEXT = (PFNGLPIXELTRANSFORMPARAMETERFEXTPROC)glewGetProcAddress((const GLubyte*)"glPixelTransformParameterfEXT")) == NULL) || r; r = ((glPixelTransformParameterfvEXT = (PFNGLPIXELTRANSFORMPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glPixelTransformParameterfvEXT")) == NULL) || r; r = ((glPixelTransformParameteriEXT = (PFNGLPIXELTRANSFORMPARAMETERIEXTPROC)glewGetProcAddress((const GLubyte*)"glPixelTransformParameteriEXT")) == NULL) || r; r = ((glPixelTransformParameterivEXT = (PFNGLPIXELTRANSFORMPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glPixelTransformParameterivEXT")) == NULL) || r; return r; } #endif /* GL_EXT_pixel_transform */ #ifdef GL_EXT_pixel_transform_color_table #endif /* GL_EXT_pixel_transform_color_table */ #ifdef GL_EXT_point_parameters static GLboolean _glewInit_GL_EXT_point_parameters (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glPointParameterfEXT = (PFNGLPOINTPARAMETERFEXTPROC)glewGetProcAddress((const GLubyte*)"glPointParameterfEXT")) == NULL) || r; r = ((glPointParameterfvEXT = (PFNGLPOINTPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glPointParameterfvEXT")) == NULL) || r; return r; } #endif /* GL_EXT_point_parameters */ #ifdef GL_EXT_polygon_offset static GLboolean _glewInit_GL_EXT_polygon_offset (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glPolygonOffsetEXT = (PFNGLPOLYGONOFFSETEXTPROC)glewGetProcAddress((const GLubyte*)"glPolygonOffsetEXT")) == NULL) || r; return r; } #endif /* GL_EXT_polygon_offset */ #ifdef GL_EXT_provoking_vertex static GLboolean _glewInit_GL_EXT_provoking_vertex (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glProvokingVertexEXT = (PFNGLPROVOKINGVERTEXEXTPROC)glewGetProcAddress((const GLubyte*)"glProvokingVertexEXT")) == NULL) || r; return r; } #endif /* GL_EXT_provoking_vertex */ #ifdef GL_EXT_rescale_normal #endif /* GL_EXT_rescale_normal */ #ifdef GL_EXT_scene_marker static GLboolean _glewInit_GL_EXT_scene_marker (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glBeginSceneEXT = (PFNGLBEGINSCENEEXTPROC)glewGetProcAddress((const GLubyte*)"glBeginSceneEXT")) == NULL) || r; r = ((glEndSceneEXT = (PFNGLENDSCENEEXTPROC)glewGetProcAddress((const GLubyte*)"glEndSceneEXT")) == NULL) || r; return r; } #endif /* GL_EXT_scene_marker */ #ifdef GL_EXT_secondary_color static GLboolean _glewInit_GL_EXT_secondary_color (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glSecondaryColor3bEXT = (PFNGLSECONDARYCOLOR3BEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3bEXT")) == NULL) || r; r = ((glSecondaryColor3bvEXT = (PFNGLSECONDARYCOLOR3BVEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3bvEXT")) == NULL) || r; r = ((glSecondaryColor3dEXT = (PFNGLSECONDARYCOLOR3DEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3dEXT")) == NULL) || r; r = ((glSecondaryColor3dvEXT = (PFNGLSECONDARYCOLOR3DVEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3dvEXT")) == NULL) || r; r = ((glSecondaryColor3fEXT = (PFNGLSECONDARYCOLOR3FEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3fEXT")) == NULL) || r; r = ((glSecondaryColor3fvEXT = (PFNGLSECONDARYCOLOR3FVEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3fvEXT")) == NULL) || r; r = ((glSecondaryColor3iEXT = (PFNGLSECONDARYCOLOR3IEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3iEXT")) == NULL) || r; r = ((glSecondaryColor3ivEXT = (PFNGLSECONDARYCOLOR3IVEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3ivEXT")) == NULL) || r; r = ((glSecondaryColor3sEXT = (PFNGLSECONDARYCOLOR3SEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3sEXT")) == NULL) || r; r = ((glSecondaryColor3svEXT = (PFNGLSECONDARYCOLOR3SVEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3svEXT")) == NULL) || r; r = ((glSecondaryColor3ubEXT = (PFNGLSECONDARYCOLOR3UBEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3ubEXT")) == NULL) || r; r = ((glSecondaryColor3ubvEXT = (PFNGLSECONDARYCOLOR3UBVEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3ubvEXT")) == NULL) || r; r = ((glSecondaryColor3uiEXT = (PFNGLSECONDARYCOLOR3UIEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3uiEXT")) == NULL) || r; r = ((glSecondaryColor3uivEXT = (PFNGLSECONDARYCOLOR3UIVEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3uivEXT")) == NULL) || r; r = ((glSecondaryColor3usEXT = (PFNGLSECONDARYCOLOR3USEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3usEXT")) == NULL) || r; r = ((glSecondaryColor3usvEXT = (PFNGLSECONDARYCOLOR3USVEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3usvEXT")) == NULL) || r; r = ((glSecondaryColorPointerEXT = (PFNGLSECONDARYCOLORPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColorPointerEXT")) == NULL) || r; return r; } #endif /* GL_EXT_secondary_color */ #ifdef GL_EXT_separate_shader_objects static GLboolean _glewInit_GL_EXT_separate_shader_objects (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glActiveProgramEXT = (PFNGLACTIVEPROGRAMEXTPROC)glewGetProcAddress((const GLubyte*)"glActiveProgramEXT")) == NULL) || r; r = ((glCreateShaderProgramEXT = (PFNGLCREATESHADERPROGRAMEXTPROC)glewGetProcAddress((const GLubyte*)"glCreateShaderProgramEXT")) == NULL) || r; r = ((glUseShaderProgramEXT = (PFNGLUSESHADERPROGRAMEXTPROC)glewGetProcAddress((const GLubyte*)"glUseShaderProgramEXT")) == NULL) || r; return r; } #endif /* GL_EXT_separate_shader_objects */ #ifdef GL_EXT_separate_specular_color #endif /* GL_EXT_separate_specular_color */ #ifdef GL_EXT_shader_image_load_store static GLboolean _glewInit_GL_EXT_shader_image_load_store (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glBindImageTextureEXT = (PFNGLBINDIMAGETEXTUREEXTPROC)glewGetProcAddress((const GLubyte*)"glBindImageTextureEXT")) == NULL) || r; r = ((glMemoryBarrierEXT = (PFNGLMEMORYBARRIEREXTPROC)glewGetProcAddress((const GLubyte*)"glMemoryBarrierEXT")) == NULL) || r; return r; } #endif /* GL_EXT_shader_image_load_store */ #ifdef GL_EXT_shadow_funcs #endif /* GL_EXT_shadow_funcs */ #ifdef GL_EXT_shared_texture_palette #endif /* GL_EXT_shared_texture_palette */ #ifdef GL_EXT_stencil_clear_tag #endif /* GL_EXT_stencil_clear_tag */ #ifdef GL_EXT_stencil_two_side static GLboolean _glewInit_GL_EXT_stencil_two_side (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glActiveStencilFaceEXT = (PFNGLACTIVESTENCILFACEEXTPROC)glewGetProcAddress((const GLubyte*)"glActiveStencilFaceEXT")) == NULL) || r; return r; } #endif /* GL_EXT_stencil_two_side */ #ifdef GL_EXT_stencil_wrap #endif /* GL_EXT_stencil_wrap */ #ifdef GL_EXT_subtexture static GLboolean _glewInit_GL_EXT_subtexture (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glTexSubImage1DEXT = (PFNGLTEXSUBIMAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glTexSubImage1DEXT")) == NULL) || r; r = ((glTexSubImage2DEXT = (PFNGLTEXSUBIMAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glTexSubImage2DEXT")) == NULL) || r; r = ((glTexSubImage3DEXT = (PFNGLTEXSUBIMAGE3DEXTPROC)glewGetProcAddress((const GLubyte*)"glTexSubImage3DEXT")) == NULL) || r; return r; } #endif /* GL_EXT_subtexture */ #ifdef GL_EXT_texture #endif /* GL_EXT_texture */ #ifdef GL_EXT_texture3D static GLboolean _glewInit_GL_EXT_texture3D (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glTexImage3DEXT = (PFNGLTEXIMAGE3DEXTPROC)glewGetProcAddress((const GLubyte*)"glTexImage3DEXT")) == NULL) || r; return r; } #endif /* GL_EXT_texture3D */ #ifdef GL_EXT_texture_array static GLboolean _glewInit_GL_EXT_texture_array (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glFramebufferTextureLayerEXT = (PFNGLFRAMEBUFFERTEXTURELAYEREXTPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTextureLayerEXT")) == NULL) || r; return r; } #endif /* GL_EXT_texture_array */ #ifdef GL_EXT_texture_buffer_object static GLboolean _glewInit_GL_EXT_texture_buffer_object (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glTexBufferEXT = (PFNGLTEXBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glTexBufferEXT")) == NULL) || r; return r; } #endif /* GL_EXT_texture_buffer_object */ #ifdef GL_EXT_texture_compression_dxt1 #endif /* GL_EXT_texture_compression_dxt1 */ #ifdef GL_EXT_texture_compression_latc #endif /* GL_EXT_texture_compression_latc */ #ifdef GL_EXT_texture_compression_rgtc #endif /* GL_EXT_texture_compression_rgtc */ #ifdef GL_EXT_texture_compression_s3tc #endif /* GL_EXT_texture_compression_s3tc */ #ifdef GL_EXT_texture_cube_map #endif /* GL_EXT_texture_cube_map */ #ifdef GL_EXT_texture_edge_clamp #endif /* GL_EXT_texture_edge_clamp */ #ifdef GL_EXT_texture_env #endif /* GL_EXT_texture_env */ #ifdef GL_EXT_texture_env_add #endif /* GL_EXT_texture_env_add */ #ifdef GL_EXT_texture_env_combine #endif /* GL_EXT_texture_env_combine */ #ifdef GL_EXT_texture_env_dot3 #endif /* GL_EXT_texture_env_dot3 */ #ifdef GL_EXT_texture_filter_anisotropic #endif /* GL_EXT_texture_filter_anisotropic */ #ifdef GL_EXT_texture_integer static GLboolean _glewInit_GL_EXT_texture_integer (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glClearColorIiEXT = (PFNGLCLEARCOLORIIEXTPROC)glewGetProcAddress((const GLubyte*)"glClearColorIiEXT")) == NULL) || r; r = ((glClearColorIuiEXT = (PFNGLCLEARCOLORIUIEXTPROC)glewGetProcAddress((const GLubyte*)"glClearColorIuiEXT")) == NULL) || r; r = ((glGetTexParameterIivEXT = (PFNGLGETTEXPARAMETERIIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetTexParameterIivEXT")) == NULL) || r; r = ((glGetTexParameterIuivEXT = (PFNGLGETTEXPARAMETERIUIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetTexParameterIuivEXT")) == NULL) || r; r = ((glTexParameterIivEXT = (PFNGLTEXPARAMETERIIVEXTPROC)glewGetProcAddress((const GLubyte*)"glTexParameterIivEXT")) == NULL) || r; r = ((glTexParameterIuivEXT = (PFNGLTEXPARAMETERIUIVEXTPROC)glewGetProcAddress((const GLubyte*)"glTexParameterIuivEXT")) == NULL) || r; return r; } #endif /* GL_EXT_texture_integer */ #ifdef GL_EXT_texture_lod_bias #endif /* GL_EXT_texture_lod_bias */ #ifdef GL_EXT_texture_mirror_clamp #endif /* GL_EXT_texture_mirror_clamp */ #ifdef GL_EXT_texture_object static GLboolean _glewInit_GL_EXT_texture_object (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glAreTexturesResidentEXT = (PFNGLARETEXTURESRESIDENTEXTPROC)glewGetProcAddress((const GLubyte*)"glAreTexturesResidentEXT")) == NULL) || r; r = ((glBindTextureEXT = (PFNGLBINDTEXTUREEXTPROC)glewGetProcAddress((const GLubyte*)"glBindTextureEXT")) == NULL) || r; r = ((glDeleteTexturesEXT = (PFNGLDELETETEXTURESEXTPROC)glewGetProcAddress((const GLubyte*)"glDeleteTexturesEXT")) == NULL) || r; r = ((glGenTexturesEXT = (PFNGLGENTEXTURESEXTPROC)glewGetProcAddress((const GLubyte*)"glGenTexturesEXT")) == NULL) || r; r = ((glIsTextureEXT = (PFNGLISTEXTUREEXTPROC)glewGetProcAddress((const GLubyte*)"glIsTextureEXT")) == NULL) || r; r = ((glPrioritizeTexturesEXT = (PFNGLPRIORITIZETEXTURESEXTPROC)glewGetProcAddress((const GLubyte*)"glPrioritizeTexturesEXT")) == NULL) || r; return r; } #endif /* GL_EXT_texture_object */ #ifdef GL_EXT_texture_perturb_normal static GLboolean _glewInit_GL_EXT_texture_perturb_normal (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glTextureNormalEXT = (PFNGLTEXTURENORMALEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureNormalEXT")) == NULL) || r; return r; } #endif /* GL_EXT_texture_perturb_normal */ #ifdef GL_EXT_texture_rectangle #endif /* GL_EXT_texture_rectangle */ #ifdef GL_EXT_texture_sRGB #endif /* GL_EXT_texture_sRGB */ #ifdef GL_EXT_texture_sRGB_decode #endif /* GL_EXT_texture_sRGB_decode */ #ifdef GL_EXT_texture_shared_exponent #endif /* GL_EXT_texture_shared_exponent */ #ifdef GL_EXT_texture_snorm #endif /* GL_EXT_texture_snorm */ #ifdef GL_EXT_texture_swizzle #endif /* GL_EXT_texture_swizzle */ #ifdef GL_EXT_timer_query static GLboolean _glewInit_GL_EXT_timer_query (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glGetQueryObjecti64vEXT = (PFNGLGETQUERYOBJECTI64VEXTPROC)glewGetProcAddress((const GLubyte*)"glGetQueryObjecti64vEXT")) == NULL) || r; r = ((glGetQueryObjectui64vEXT = (PFNGLGETQUERYOBJECTUI64VEXTPROC)glewGetProcAddress((const GLubyte*)"glGetQueryObjectui64vEXT")) == NULL) || r; return r; } #endif /* GL_EXT_timer_query */ #ifdef GL_EXT_transform_feedback static GLboolean _glewInit_GL_EXT_transform_feedback (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glBeginTransformFeedbackEXT = (PFNGLBEGINTRANSFORMFEEDBACKEXTPROC)glewGetProcAddress((const GLubyte*)"glBeginTransformFeedbackEXT")) == NULL) || r; r = ((glBindBufferBaseEXT = (PFNGLBINDBUFFERBASEEXTPROC)glewGetProcAddress((const GLubyte*)"glBindBufferBaseEXT")) == NULL) || r; r = ((glBindBufferOffsetEXT = (PFNGLBINDBUFFEROFFSETEXTPROC)glewGetProcAddress((const GLubyte*)"glBindBufferOffsetEXT")) == NULL) || r; r = ((glBindBufferRangeEXT = (PFNGLBINDBUFFERRANGEEXTPROC)glewGetProcAddress((const GLubyte*)"glBindBufferRangeEXT")) == NULL) || r; r = ((glEndTransformFeedbackEXT = (PFNGLENDTRANSFORMFEEDBACKEXTPROC)glewGetProcAddress((const GLubyte*)"glEndTransformFeedbackEXT")) == NULL) || r; r = ((glGetTransformFeedbackVaryingEXT = (PFNGLGETTRANSFORMFEEDBACKVARYINGEXTPROC)glewGetProcAddress((const GLubyte*)"glGetTransformFeedbackVaryingEXT")) == NULL) || r; r = ((glTransformFeedbackVaryingsEXT = (PFNGLTRANSFORMFEEDBACKVARYINGSEXTPROC)glewGetProcAddress((const GLubyte*)"glTransformFeedbackVaryingsEXT")) == NULL) || r; return r; } #endif /* GL_EXT_transform_feedback */ #ifdef GL_EXT_vertex_array static GLboolean _glewInit_GL_EXT_vertex_array (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glArrayElementEXT = (PFNGLARRAYELEMENTEXTPROC)glewGetProcAddress((const GLubyte*)"glArrayElementEXT")) == NULL) || r; r = ((glColorPointerEXT = (PFNGLCOLORPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glColorPointerEXT")) == NULL) || r; r = ((glDrawArraysEXT = (PFNGLDRAWARRAYSEXTPROC)glewGetProcAddress((const GLubyte*)"glDrawArraysEXT")) == NULL) || r; r = ((glEdgeFlagPointerEXT = (PFNGLEDGEFLAGPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glEdgeFlagPointerEXT")) == NULL) || r; r = ((glIndexPointerEXT = (PFNGLINDEXPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glIndexPointerEXT")) == NULL) || r; r = ((glNormalPointerEXT = (PFNGLNORMALPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glNormalPointerEXT")) == NULL) || r; r = ((glTexCoordPointerEXT = (PFNGLTEXCOORDPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glTexCoordPointerEXT")) == NULL) || r; r = ((glVertexPointerEXT = (PFNGLVERTEXPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glVertexPointerEXT")) == NULL) || r; return r; } #endif /* GL_EXT_vertex_array */ #ifdef GL_EXT_vertex_array_bgra #endif /* GL_EXT_vertex_array_bgra */ #ifdef GL_EXT_vertex_attrib_64bit static GLboolean _glewInit_GL_EXT_vertex_attrib_64bit (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glGetVertexAttribLdvEXT = (PFNGLGETVERTEXATTRIBLDVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribLdvEXT")) == NULL) || r; r = ((glVertexArrayVertexAttribLOffsetEXT = (PFNGLVERTEXARRAYVERTEXATTRIBLOFFSETEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayVertexAttribLOffsetEXT")) == NULL) || r; r = ((glVertexAttribL1dEXT = (PFNGLVERTEXATTRIBL1DEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL1dEXT")) == NULL) || r; r = ((glVertexAttribL1dvEXT = (PFNGLVERTEXATTRIBL1DVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL1dvEXT")) == NULL) || r; r = ((glVertexAttribL2dEXT = (PFNGLVERTEXATTRIBL2DEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL2dEXT")) == NULL) || r; r = ((glVertexAttribL2dvEXT = (PFNGLVERTEXATTRIBL2DVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL2dvEXT")) == NULL) || r; r = ((glVertexAttribL3dEXT = (PFNGLVERTEXATTRIBL3DEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL3dEXT")) == NULL) || r; r = ((glVertexAttribL3dvEXT = (PFNGLVERTEXATTRIBL3DVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL3dvEXT")) == NULL) || r; r = ((glVertexAttribL4dEXT = (PFNGLVERTEXATTRIBL4DEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL4dEXT")) == NULL) || r; r = ((glVertexAttribL4dvEXT = (PFNGLVERTEXATTRIBL4DVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL4dvEXT")) == NULL) || r; r = ((glVertexAttribLPointerEXT = (PFNGLVERTEXATTRIBLPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribLPointerEXT")) == NULL) || r; return r; } #endif /* GL_EXT_vertex_attrib_64bit */ #ifdef GL_EXT_vertex_shader static GLboolean _glewInit_GL_EXT_vertex_shader (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glBeginVertexShaderEXT = (PFNGLBEGINVERTEXSHADEREXTPROC)glewGetProcAddress((const GLubyte*)"glBeginVertexShaderEXT")) == NULL) || r; r = ((glBindLightParameterEXT = (PFNGLBINDLIGHTPARAMETEREXTPROC)glewGetProcAddress((const GLubyte*)"glBindLightParameterEXT")) == NULL) || r; r = ((glBindMaterialParameterEXT = (PFNGLBINDMATERIALPARAMETEREXTPROC)glewGetProcAddress((const GLubyte*)"glBindMaterialParameterEXT")) == NULL) || r; r = ((glBindParameterEXT = (PFNGLBINDPARAMETEREXTPROC)glewGetProcAddress((const GLubyte*)"glBindParameterEXT")) == NULL) || r; r = ((glBindTexGenParameterEXT = (PFNGLBINDTEXGENPARAMETEREXTPROC)glewGetProcAddress((const GLubyte*)"glBindTexGenParameterEXT")) == NULL) || r; r = ((glBindTextureUnitParameterEXT = (PFNGLBINDTEXTUREUNITPARAMETEREXTPROC)glewGetProcAddress((const GLubyte*)"glBindTextureUnitParameterEXT")) == NULL) || r; r = ((glBindVertexShaderEXT = (PFNGLBINDVERTEXSHADEREXTPROC)glewGetProcAddress((const GLubyte*)"glBindVertexShaderEXT")) == NULL) || r; r = ((glDeleteVertexShaderEXT = (PFNGLDELETEVERTEXSHADEREXTPROC)glewGetProcAddress((const GLubyte*)"glDeleteVertexShaderEXT")) == NULL) || r; r = ((glDisableVariantClientStateEXT = (PFNGLDISABLEVARIANTCLIENTSTATEEXTPROC)glewGetProcAddress((const GLubyte*)"glDisableVariantClientStateEXT")) == NULL) || r; r = ((glEnableVariantClientStateEXT = (PFNGLENABLEVARIANTCLIENTSTATEEXTPROC)glewGetProcAddress((const GLubyte*)"glEnableVariantClientStateEXT")) == NULL) || r; r = ((glEndVertexShaderEXT = (PFNGLENDVERTEXSHADEREXTPROC)glewGetProcAddress((const GLubyte*)"glEndVertexShaderEXT")) == NULL) || r; r = ((glExtractComponentEXT = (PFNGLEXTRACTCOMPONENTEXTPROC)glewGetProcAddress((const GLubyte*)"glExtractComponentEXT")) == NULL) || r; r = ((glGenSymbolsEXT = (PFNGLGENSYMBOLSEXTPROC)glewGetProcAddress((const GLubyte*)"glGenSymbolsEXT")) == NULL) || r; r = ((glGenVertexShadersEXT = (PFNGLGENVERTEXSHADERSEXTPROC)glewGetProcAddress((const GLubyte*)"glGenVertexShadersEXT")) == NULL) || r; r = ((glGetInvariantBooleanvEXT = (PFNGLGETINVARIANTBOOLEANVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetInvariantBooleanvEXT")) == NULL) || r; r = ((glGetInvariantFloatvEXT = (PFNGLGETINVARIANTFLOATVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetInvariantFloatvEXT")) == NULL) || r; r = ((glGetInvariantIntegervEXT = (PFNGLGETINVARIANTINTEGERVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetInvariantIntegervEXT")) == NULL) || r; r = ((glGetLocalConstantBooleanvEXT = (PFNGLGETLOCALCONSTANTBOOLEANVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetLocalConstantBooleanvEXT")) == NULL) || r; r = ((glGetLocalConstantFloatvEXT = (PFNGLGETLOCALCONSTANTFLOATVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetLocalConstantFloatvEXT")) == NULL) || r; r = ((glGetLocalConstantIntegervEXT = (PFNGLGETLOCALCONSTANTINTEGERVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetLocalConstantIntegervEXT")) == NULL) || r; r = ((glGetVariantBooleanvEXT = (PFNGLGETVARIANTBOOLEANVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetVariantBooleanvEXT")) == NULL) || r; r = ((glGetVariantFloatvEXT = (PFNGLGETVARIANTFLOATVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetVariantFloatvEXT")) == NULL) || r; r = ((glGetVariantIntegervEXT = (PFNGLGETVARIANTINTEGERVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetVariantIntegervEXT")) == NULL) || r; r = ((glGetVariantPointervEXT = (PFNGLGETVARIANTPOINTERVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetVariantPointervEXT")) == NULL) || r; r = ((glInsertComponentEXT = (PFNGLINSERTCOMPONENTEXTPROC)glewGetProcAddress((const GLubyte*)"glInsertComponentEXT")) == NULL) || r; r = ((glIsVariantEnabledEXT = (PFNGLISVARIANTENABLEDEXTPROC)glewGetProcAddress((const GLubyte*)"glIsVariantEnabledEXT")) == NULL) || r; r = ((glSetInvariantEXT = (PFNGLSETINVARIANTEXTPROC)glewGetProcAddress((const GLubyte*)"glSetInvariantEXT")) == NULL) || r; r = ((glSetLocalConstantEXT = (PFNGLSETLOCALCONSTANTEXTPROC)glewGetProcAddress((const GLubyte*)"glSetLocalConstantEXT")) == NULL) || r; r = ((glShaderOp1EXT = (PFNGLSHADEROP1EXTPROC)glewGetProcAddress((const GLubyte*)"glShaderOp1EXT")) == NULL) || r; r = ((glShaderOp2EXT = (PFNGLSHADEROP2EXTPROC)glewGetProcAddress((const GLubyte*)"glShaderOp2EXT")) == NULL) || r; r = ((glShaderOp3EXT = (PFNGLSHADEROP3EXTPROC)glewGetProcAddress((const GLubyte*)"glShaderOp3EXT")) == NULL) || r; r = ((glSwizzleEXT = (PFNGLSWIZZLEEXTPROC)glewGetProcAddress((const GLubyte*)"glSwizzleEXT")) == NULL) || r; r = ((glVariantPointerEXT = (PFNGLVARIANTPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glVariantPointerEXT")) == NULL) || r; r = ((glVariantbvEXT = (PFNGLVARIANTBVEXTPROC)glewGetProcAddress((const GLubyte*)"glVariantbvEXT")) == NULL) || r; r = ((glVariantdvEXT = (PFNGLVARIANTDVEXTPROC)glewGetProcAddress((const GLubyte*)"glVariantdvEXT")) == NULL) || r; r = ((glVariantfvEXT = (PFNGLVARIANTFVEXTPROC)glewGetProcAddress((const GLubyte*)"glVariantfvEXT")) == NULL) || r; r = ((glVariantivEXT = (PFNGLVARIANTIVEXTPROC)glewGetProcAddress((const GLubyte*)"glVariantivEXT")) == NULL) || r; r = ((glVariantsvEXT = (PFNGLVARIANTSVEXTPROC)glewGetProcAddress((const GLubyte*)"glVariantsvEXT")) == NULL) || r; r = ((glVariantubvEXT = (PFNGLVARIANTUBVEXTPROC)glewGetProcAddress((const GLubyte*)"glVariantubvEXT")) == NULL) || r; r = ((glVariantuivEXT = (PFNGLVARIANTUIVEXTPROC)glewGetProcAddress((const GLubyte*)"glVariantuivEXT")) == NULL) || r; r = ((glVariantusvEXT = (PFNGLVARIANTUSVEXTPROC)glewGetProcAddress((const GLubyte*)"glVariantusvEXT")) == NULL) || r; r = ((glWriteMaskEXT = (PFNGLWRITEMASKEXTPROC)glewGetProcAddress((const GLubyte*)"glWriteMaskEXT")) == NULL) || r; return r; } #endif /* GL_EXT_vertex_shader */ #ifdef GL_EXT_vertex_weighting static GLboolean _glewInit_GL_EXT_vertex_weighting (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glVertexWeightPointerEXT = (PFNGLVERTEXWEIGHTPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glVertexWeightPointerEXT")) == NULL) || r; r = ((glVertexWeightfEXT = (PFNGLVERTEXWEIGHTFEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexWeightfEXT")) == NULL) || r; r = ((glVertexWeightfvEXT = (PFNGLVERTEXWEIGHTFVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexWeightfvEXT")) == NULL) || r; return r; } #endif /* GL_EXT_vertex_weighting */ #ifdef GL_EXT_x11_sync_object static GLboolean _glewInit_GL_EXT_x11_sync_object (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glImportSyncEXT = (PFNGLIMPORTSYNCEXTPROC)glewGetProcAddress((const GLubyte*)"glImportSyncEXT")) == NULL) || r; return r; } #endif /* GL_EXT_x11_sync_object */ #ifdef GL_GREMEDY_frame_terminator static GLboolean _glewInit_GL_GREMEDY_frame_terminator (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glFrameTerminatorGREMEDY = (PFNGLFRAMETERMINATORGREMEDYPROC)glewGetProcAddress((const GLubyte*)"glFrameTerminatorGREMEDY")) == NULL) || r; return r; } #endif /* GL_GREMEDY_frame_terminator */ #ifdef GL_GREMEDY_string_marker static GLboolean _glewInit_GL_GREMEDY_string_marker (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glStringMarkerGREMEDY = (PFNGLSTRINGMARKERGREMEDYPROC)glewGetProcAddress((const GLubyte*)"glStringMarkerGREMEDY")) == NULL) || r; return r; } #endif /* GL_GREMEDY_string_marker */ #ifdef GL_HP_convolution_border_modes #endif /* GL_HP_convolution_border_modes */ #ifdef GL_HP_image_transform static GLboolean _glewInit_GL_HP_image_transform (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glGetImageTransformParameterfvHP = (PFNGLGETIMAGETRANSFORMPARAMETERFVHPPROC)glewGetProcAddress((const GLubyte*)"glGetImageTransformParameterfvHP")) == NULL) || r; r = ((glGetImageTransformParameterivHP = (PFNGLGETIMAGETRANSFORMPARAMETERIVHPPROC)glewGetProcAddress((const GLubyte*)"glGetImageTransformParameterivHP")) == NULL) || r; r = ((glImageTransformParameterfHP = (PFNGLIMAGETRANSFORMPARAMETERFHPPROC)glewGetProcAddress((const GLubyte*)"glImageTransformParameterfHP")) == NULL) || r; r = ((glImageTransformParameterfvHP = (PFNGLIMAGETRANSFORMPARAMETERFVHPPROC)glewGetProcAddress((const GLubyte*)"glImageTransformParameterfvHP")) == NULL) || r; r = ((glImageTransformParameteriHP = (PFNGLIMAGETRANSFORMPARAMETERIHPPROC)glewGetProcAddress((const GLubyte*)"glImageTransformParameteriHP")) == NULL) || r; r = ((glImageTransformParameterivHP = (PFNGLIMAGETRANSFORMPARAMETERIVHPPROC)glewGetProcAddress((const GLubyte*)"glImageTransformParameterivHP")) == NULL) || r; return r; } #endif /* GL_HP_image_transform */ #ifdef GL_HP_occlusion_test #endif /* GL_HP_occlusion_test */ #ifdef GL_HP_texture_lighting #endif /* GL_HP_texture_lighting */ #ifdef GL_IBM_cull_vertex #endif /* GL_IBM_cull_vertex */ #ifdef GL_IBM_multimode_draw_arrays static GLboolean _glewInit_GL_IBM_multimode_draw_arrays (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glMultiModeDrawArraysIBM = (PFNGLMULTIMODEDRAWARRAYSIBMPROC)glewGetProcAddress((const GLubyte*)"glMultiModeDrawArraysIBM")) == NULL) || r; r = ((glMultiModeDrawElementsIBM = (PFNGLMULTIMODEDRAWELEMENTSIBMPROC)glewGetProcAddress((const GLubyte*)"glMultiModeDrawElementsIBM")) == NULL) || r; return r; } #endif /* GL_IBM_multimode_draw_arrays */ #ifdef GL_IBM_rasterpos_clip #endif /* GL_IBM_rasterpos_clip */ #ifdef GL_IBM_static_data #endif /* GL_IBM_static_data */ #ifdef GL_IBM_texture_mirrored_repeat #endif /* GL_IBM_texture_mirrored_repeat */ #ifdef GL_IBM_vertex_array_lists static GLboolean _glewInit_GL_IBM_vertex_array_lists (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glColorPointerListIBM = (PFNGLCOLORPOINTERLISTIBMPROC)glewGetProcAddress((const GLubyte*)"glColorPointerListIBM")) == NULL) || r; r = ((glEdgeFlagPointerListIBM = (PFNGLEDGEFLAGPOINTERLISTIBMPROC)glewGetProcAddress((const GLubyte*)"glEdgeFlagPointerListIBM")) == NULL) || r; r = ((glFogCoordPointerListIBM = (PFNGLFOGCOORDPOINTERLISTIBMPROC)glewGetProcAddress((const GLubyte*)"glFogCoordPointerListIBM")) == NULL) || r; r = ((glIndexPointerListIBM = (PFNGLINDEXPOINTERLISTIBMPROC)glewGetProcAddress((const GLubyte*)"glIndexPointerListIBM")) == NULL) || r; r = ((glNormalPointerListIBM = (PFNGLNORMALPOINTERLISTIBMPROC)glewGetProcAddress((const GLubyte*)"glNormalPointerListIBM")) == NULL) || r; r = ((glSecondaryColorPointerListIBM = (PFNGLSECONDARYCOLORPOINTERLISTIBMPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColorPointerListIBM")) == NULL) || r; r = ((glTexCoordPointerListIBM = (PFNGLTEXCOORDPOINTERLISTIBMPROC)glewGetProcAddress((const GLubyte*)"glTexCoordPointerListIBM")) == NULL) || r; r = ((glVertexPointerListIBM = (PFNGLVERTEXPOINTERLISTIBMPROC)glewGetProcAddress((const GLubyte*)"glVertexPointerListIBM")) == NULL) || r; return r; } #endif /* GL_IBM_vertex_array_lists */ #ifdef GL_INGR_color_clamp #endif /* GL_INGR_color_clamp */ #ifdef GL_INGR_interlace_read #endif /* GL_INGR_interlace_read */ #ifdef GL_INTEL_parallel_arrays static GLboolean _glewInit_GL_INTEL_parallel_arrays (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glColorPointervINTEL = (PFNGLCOLORPOINTERVINTELPROC)glewGetProcAddress((const GLubyte*)"glColorPointervINTEL")) == NULL) || r; r = ((glNormalPointervINTEL = (PFNGLNORMALPOINTERVINTELPROC)glewGetProcAddress((const GLubyte*)"glNormalPointervINTEL")) == NULL) || r; r = ((glTexCoordPointervINTEL = (PFNGLTEXCOORDPOINTERVINTELPROC)glewGetProcAddress((const GLubyte*)"glTexCoordPointervINTEL")) == NULL) || r; r = ((glVertexPointervINTEL = (PFNGLVERTEXPOINTERVINTELPROC)glewGetProcAddress((const GLubyte*)"glVertexPointervINTEL")) == NULL) || r; return r; } #endif /* GL_INTEL_parallel_arrays */ #ifdef GL_INTEL_texture_scissor static GLboolean _glewInit_GL_INTEL_texture_scissor (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glTexScissorFuncINTEL = (PFNGLTEXSCISSORFUNCINTELPROC)glewGetProcAddress((const GLubyte*)"glTexScissorFuncINTEL")) == NULL) || r; r = ((glTexScissorINTEL = (PFNGLTEXSCISSORINTELPROC)glewGetProcAddress((const GLubyte*)"glTexScissorINTEL")) == NULL) || r; return r; } #endif /* GL_INTEL_texture_scissor */ #ifdef GL_KHR_debug static GLboolean _glewInit_GL_KHR_debug (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glDebugMessageCallback = (PFNGLDEBUGMESSAGECALLBACKPROC)glewGetProcAddress((const GLubyte*)"glDebugMessageCallback")) == NULL) || r; r = ((glDebugMessageControl = (PFNGLDEBUGMESSAGECONTROLPROC)glewGetProcAddress((const GLubyte*)"glDebugMessageControl")) == NULL) || r; r = ((glDebugMessageInsert = (PFNGLDEBUGMESSAGEINSERTPROC)glewGetProcAddress((const GLubyte*)"glDebugMessageInsert")) == NULL) || r; r = ((glGetDebugMessageLog = (PFNGLGETDEBUGMESSAGELOGPROC)glewGetProcAddress((const GLubyte*)"glGetDebugMessageLog")) == NULL) || r; r = ((glGetObjectLabel = (PFNGLGETOBJECTLABELPROC)glewGetProcAddress((const GLubyte*)"glGetObjectLabel")) == NULL) || r; r = ((glGetObjectPtrLabel = (PFNGLGETOBJECTPTRLABELPROC)glewGetProcAddress((const GLubyte*)"glGetObjectPtrLabel")) == NULL) || r; r = ((glGetPointerv = (PFNGLGETPOINTERVPROC)glewGetProcAddress((const GLubyte*)"glGetPointerv")) == NULL) || r; r = ((glObjectLabel = (PFNGLOBJECTLABELPROC)glewGetProcAddress((const GLubyte*)"glObjectLabel")) == NULL) || r; r = ((glObjectPtrLabel = (PFNGLOBJECTPTRLABELPROC)glewGetProcAddress((const GLubyte*)"glObjectPtrLabel")) == NULL) || r; r = ((glPushDebugGroup = (PFNGLPUSHDEBUGGROUPPROC)glewGetProcAddress((const GLubyte*)"glPushDebugGroup")) == NULL) || r; return r; } #endif /* GL_KHR_debug */ #ifdef GL_KHR_texture_compression_astc_ldr #endif /* GL_KHR_texture_compression_astc_ldr */ #ifdef GL_KTX_buffer_region static GLboolean _glewInit_GL_KTX_buffer_region (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glBufferRegionEnabled = (PFNGLBUFFERREGIONENABLEDPROC)glewGetProcAddress((const GLubyte*)"glBufferRegionEnabled")) == NULL) || r; r = ((glDeleteBufferRegion = (PFNGLDELETEBUFFERREGIONPROC)glewGetProcAddress((const GLubyte*)"glDeleteBufferRegion")) == NULL) || r; r = ((glDrawBufferRegion = (PFNGLDRAWBUFFERREGIONPROC)glewGetProcAddress((const GLubyte*)"glDrawBufferRegion")) == NULL) || r; r = ((glNewBufferRegion = (PFNGLNEWBUFFERREGIONPROC)glewGetProcAddress((const GLubyte*)"glNewBufferRegion")) == NULL) || r; r = ((glReadBufferRegion = (PFNGLREADBUFFERREGIONPROC)glewGetProcAddress((const GLubyte*)"glReadBufferRegion")) == NULL) || r; return r; } #endif /* GL_KTX_buffer_region */ #ifdef GL_MESAX_texture_stack #endif /* GL_MESAX_texture_stack */ #ifdef GL_MESA_pack_invert #endif /* GL_MESA_pack_invert */ #ifdef GL_MESA_resize_buffers static GLboolean _glewInit_GL_MESA_resize_buffers (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glResizeBuffersMESA = (PFNGLRESIZEBUFFERSMESAPROC)glewGetProcAddress((const GLubyte*)"glResizeBuffersMESA")) == NULL) || r; return r; } #endif /* GL_MESA_resize_buffers */ #ifdef GL_MESA_window_pos static GLboolean _glewInit_GL_MESA_window_pos (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glWindowPos2dMESA = (PFNGLWINDOWPOS2DMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2dMESA")) == NULL) || r; r = ((glWindowPos2dvMESA = (PFNGLWINDOWPOS2DVMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2dvMESA")) == NULL) || r; r = ((glWindowPos2fMESA = (PFNGLWINDOWPOS2FMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2fMESA")) == NULL) || r; r = ((glWindowPos2fvMESA = (PFNGLWINDOWPOS2FVMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2fvMESA")) == NULL) || r; r = ((glWindowPos2iMESA = (PFNGLWINDOWPOS2IMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2iMESA")) == NULL) || r; r = ((glWindowPos2ivMESA = (PFNGLWINDOWPOS2IVMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2ivMESA")) == NULL) || r; r = ((glWindowPos2sMESA = (PFNGLWINDOWPOS2SMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2sMESA")) == NULL) || r; r = ((glWindowPos2svMESA = (PFNGLWINDOWPOS2SVMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2svMESA")) == NULL) || r; r = ((glWindowPos3dMESA = (PFNGLWINDOWPOS3DMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3dMESA")) == NULL) || r; r = ((glWindowPos3dvMESA = (PFNGLWINDOWPOS3DVMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3dvMESA")) == NULL) || r; r = ((glWindowPos3fMESA = (PFNGLWINDOWPOS3FMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3fMESA")) == NULL) || r; r = ((glWindowPos3fvMESA = (PFNGLWINDOWPOS3FVMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3fvMESA")) == NULL) || r; r = ((glWindowPos3iMESA = (PFNGLWINDOWPOS3IMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3iMESA")) == NULL) || r; r = ((glWindowPos3ivMESA = (PFNGLWINDOWPOS3IVMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3ivMESA")) == NULL) || r; r = ((glWindowPos3sMESA = (PFNGLWINDOWPOS3SMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3sMESA")) == NULL) || r; r = ((glWindowPos3svMESA = (PFNGLWINDOWPOS3SVMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3svMESA")) == NULL) || r; r = ((glWindowPos4dMESA = (PFNGLWINDOWPOS4DMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos4dMESA")) == NULL) || r; r = ((glWindowPos4dvMESA = (PFNGLWINDOWPOS4DVMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos4dvMESA")) == NULL) || r; r = ((glWindowPos4fMESA = (PFNGLWINDOWPOS4FMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos4fMESA")) == NULL) || r; r = ((glWindowPos4fvMESA = (PFNGLWINDOWPOS4FVMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos4fvMESA")) == NULL) || r; r = ((glWindowPos4iMESA = (PFNGLWINDOWPOS4IMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos4iMESA")) == NULL) || r; r = ((glWindowPos4ivMESA = (PFNGLWINDOWPOS4IVMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos4ivMESA")) == NULL) || r; r = ((glWindowPos4sMESA = (PFNGLWINDOWPOS4SMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos4sMESA")) == NULL) || r; r = ((glWindowPos4svMESA = (PFNGLWINDOWPOS4SVMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos4svMESA")) == NULL) || r; return r; } #endif /* GL_MESA_window_pos */ #ifdef GL_MESA_ycbcr_texture #endif /* GL_MESA_ycbcr_texture */ #ifdef GL_NVX_gpu_memory_info #endif /* GL_NVX_gpu_memory_info */ #ifdef GL_NV_bindless_texture static GLboolean _glewInit_GL_NV_bindless_texture (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glGetImageHandleNV = (PFNGLGETIMAGEHANDLENVPROC)glewGetProcAddress((const GLubyte*)"glGetImageHandleNV")) == NULL) || r; r = ((glGetTextureHandleNV = (PFNGLGETTEXTUREHANDLENVPROC)glewGetProcAddress((const GLubyte*)"glGetTextureHandleNV")) == NULL) || r; r = ((glGetTextureSamplerHandleNV = (PFNGLGETTEXTURESAMPLERHANDLENVPROC)glewGetProcAddress((const GLubyte*)"glGetTextureSamplerHandleNV")) == NULL) || r; r = ((glIsImageHandleResidentNV = (PFNGLISIMAGEHANDLERESIDENTNVPROC)glewGetProcAddress((const GLubyte*)"glIsImageHandleResidentNV")) == NULL) || r; r = ((glIsTextureHandleResidentNV = (PFNGLISTEXTUREHANDLERESIDENTNVPROC)glewGetProcAddress((const GLubyte*)"glIsTextureHandleResidentNV")) == NULL) || r; r = ((glMakeImageHandleNonResidentNV = (PFNGLMAKEIMAGEHANDLENONRESIDENTNVPROC)glewGetProcAddress((const GLubyte*)"glMakeImageHandleNonResidentNV")) == NULL) || r; r = ((glMakeImageHandleResidentNV = (PFNGLMAKEIMAGEHANDLERESIDENTNVPROC)glewGetProcAddress((const GLubyte*)"glMakeImageHandleResidentNV")) == NULL) || r; r = ((glMakeTextureHandleNonResidentNV = (PFNGLMAKETEXTUREHANDLENONRESIDENTNVPROC)glewGetProcAddress((const GLubyte*)"glMakeTextureHandleNonResidentNV")) == NULL) || r; r = ((glMakeTextureHandleResidentNV = (PFNGLMAKETEXTUREHANDLERESIDENTNVPROC)glewGetProcAddress((const GLubyte*)"glMakeTextureHandleResidentNV")) == NULL) || r; r = ((glProgramUniformHandleui64NV = (PFNGLPROGRAMUNIFORMHANDLEUI64NVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformHandleui64NV")) == NULL) || r; r = ((glProgramUniformHandleui64vNV = (PFNGLPROGRAMUNIFORMHANDLEUI64VNVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformHandleui64vNV")) == NULL) || r; r = ((glUniformHandleui64NV = (PFNGLUNIFORMHANDLEUI64NVPROC)glewGetProcAddress((const GLubyte*)"glUniformHandleui64NV")) == NULL) || r; r = ((glUniformHandleui64vNV = (PFNGLUNIFORMHANDLEUI64VNVPROC)glewGetProcAddress((const GLubyte*)"glUniformHandleui64vNV")) == NULL) || r; return r; } #endif /* GL_NV_bindless_texture */ #ifdef GL_NV_blend_square #endif /* GL_NV_blend_square */ #ifdef GL_NV_conditional_render static GLboolean _glewInit_GL_NV_conditional_render (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glBeginConditionalRenderNV = (PFNGLBEGINCONDITIONALRENDERNVPROC)glewGetProcAddress((const GLubyte*)"glBeginConditionalRenderNV")) == NULL) || r; r = ((glEndConditionalRenderNV = (PFNGLENDCONDITIONALRENDERNVPROC)glewGetProcAddress((const GLubyte*)"glEndConditionalRenderNV")) == NULL) || r; return r; } #endif /* GL_NV_conditional_render */ #ifdef GL_NV_copy_depth_to_color #endif /* GL_NV_copy_depth_to_color */ #ifdef GL_NV_copy_image static GLboolean _glewInit_GL_NV_copy_image (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glCopyImageSubDataNV = (PFNGLCOPYIMAGESUBDATANVPROC)glewGetProcAddress((const GLubyte*)"glCopyImageSubDataNV")) == NULL) || r; return r; } #endif /* GL_NV_copy_image */ #ifdef GL_NV_depth_buffer_float static GLboolean _glewInit_GL_NV_depth_buffer_float (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glClearDepthdNV = (PFNGLCLEARDEPTHDNVPROC)glewGetProcAddress((const GLubyte*)"glClearDepthdNV")) == NULL) || r; r = ((glDepthBoundsdNV = (PFNGLDEPTHBOUNDSDNVPROC)glewGetProcAddress((const GLubyte*)"glDepthBoundsdNV")) == NULL) || r; r = ((glDepthRangedNV = (PFNGLDEPTHRANGEDNVPROC)glewGetProcAddress((const GLubyte*)"glDepthRangedNV")) == NULL) || r; return r; } #endif /* GL_NV_depth_buffer_float */ #ifdef GL_NV_depth_clamp #endif /* GL_NV_depth_clamp */ #ifdef GL_NV_depth_range_unclamped #endif /* GL_NV_depth_range_unclamped */ #ifdef GL_NV_evaluators static GLboolean _glewInit_GL_NV_evaluators (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glEvalMapsNV = (PFNGLEVALMAPSNVPROC)glewGetProcAddress((const GLubyte*)"glEvalMapsNV")) == NULL) || r; r = ((glGetMapAttribParameterfvNV = (PFNGLGETMAPATTRIBPARAMETERFVNVPROC)glewGetProcAddress((const GLubyte*)"glGetMapAttribParameterfvNV")) == NULL) || r; r = ((glGetMapAttribParameterivNV = (PFNGLGETMAPATTRIBPARAMETERIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetMapAttribParameterivNV")) == NULL) || r; r = ((glGetMapControlPointsNV = (PFNGLGETMAPCONTROLPOINTSNVPROC)glewGetProcAddress((const GLubyte*)"glGetMapControlPointsNV")) == NULL) || r; r = ((glGetMapParameterfvNV = (PFNGLGETMAPPARAMETERFVNVPROC)glewGetProcAddress((const GLubyte*)"glGetMapParameterfvNV")) == NULL) || r; r = ((glGetMapParameterivNV = (PFNGLGETMAPPARAMETERIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetMapParameterivNV")) == NULL) || r; r = ((glMapControlPointsNV = (PFNGLMAPCONTROLPOINTSNVPROC)glewGetProcAddress((const GLubyte*)"glMapControlPointsNV")) == NULL) || r; r = ((glMapParameterfvNV = (PFNGLMAPPARAMETERFVNVPROC)glewGetProcAddress((const GLubyte*)"glMapParameterfvNV")) == NULL) || r; r = ((glMapParameterivNV = (PFNGLMAPPARAMETERIVNVPROC)glewGetProcAddress((const GLubyte*)"glMapParameterivNV")) == NULL) || r; return r; } #endif /* GL_NV_evaluators */ #ifdef GL_NV_explicit_multisample static GLboolean _glewInit_GL_NV_explicit_multisample (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glGetMultisamplefvNV = (PFNGLGETMULTISAMPLEFVNVPROC)glewGetProcAddress((const GLubyte*)"glGetMultisamplefvNV")) == NULL) || r; r = ((glSampleMaskIndexedNV = (PFNGLSAMPLEMASKINDEXEDNVPROC)glewGetProcAddress((const GLubyte*)"glSampleMaskIndexedNV")) == NULL) || r; r = ((glTexRenderbufferNV = (PFNGLTEXRENDERBUFFERNVPROC)glewGetProcAddress((const GLubyte*)"glTexRenderbufferNV")) == NULL) || r; return r; } #endif /* GL_NV_explicit_multisample */ #ifdef GL_NV_fence static GLboolean _glewInit_GL_NV_fence (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glDeleteFencesNV = (PFNGLDELETEFENCESNVPROC)glewGetProcAddress((const GLubyte*)"glDeleteFencesNV")) == NULL) || r; r = ((glFinishFenceNV = (PFNGLFINISHFENCENVPROC)glewGetProcAddress((const GLubyte*)"glFinishFenceNV")) == NULL) || r; r = ((glGenFencesNV = (PFNGLGENFENCESNVPROC)glewGetProcAddress((const GLubyte*)"glGenFencesNV")) == NULL) || r; r = ((glGetFenceivNV = (PFNGLGETFENCEIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetFenceivNV")) == NULL) || r; r = ((glIsFenceNV = (PFNGLISFENCENVPROC)glewGetProcAddress((const GLubyte*)"glIsFenceNV")) == NULL) || r; r = ((glSetFenceNV = (PFNGLSETFENCENVPROC)glewGetProcAddress((const GLubyte*)"glSetFenceNV")) == NULL) || r; r = ((glTestFenceNV = (PFNGLTESTFENCENVPROC)glewGetProcAddress((const GLubyte*)"glTestFenceNV")) == NULL) || r; return r; } #endif /* GL_NV_fence */ #ifdef GL_NV_float_buffer #endif /* GL_NV_float_buffer */ #ifdef GL_NV_fog_distance #endif /* GL_NV_fog_distance */ #ifdef GL_NV_fragment_program static GLboolean _glewInit_GL_NV_fragment_program (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glGetProgramNamedParameterdvNV = (PFNGLGETPROGRAMNAMEDPARAMETERDVNVPROC)glewGetProcAddress((const GLubyte*)"glGetProgramNamedParameterdvNV")) == NULL) || r; r = ((glGetProgramNamedParameterfvNV = (PFNGLGETPROGRAMNAMEDPARAMETERFVNVPROC)glewGetProcAddress((const GLubyte*)"glGetProgramNamedParameterfvNV")) == NULL) || r; r = ((glProgramNamedParameter4dNV = (PFNGLPROGRAMNAMEDPARAMETER4DNVPROC)glewGetProcAddress((const GLubyte*)"glProgramNamedParameter4dNV")) == NULL) || r; r = ((glProgramNamedParameter4dvNV = (PFNGLPROGRAMNAMEDPARAMETER4DVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramNamedParameter4dvNV")) == NULL) || r; r = ((glProgramNamedParameter4fNV = (PFNGLPROGRAMNAMEDPARAMETER4FNVPROC)glewGetProcAddress((const GLubyte*)"glProgramNamedParameter4fNV")) == NULL) || r; r = ((glProgramNamedParameter4fvNV = (PFNGLPROGRAMNAMEDPARAMETER4FVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramNamedParameter4fvNV")) == NULL) || r; return r; } #endif /* GL_NV_fragment_program */ #ifdef GL_NV_fragment_program2 #endif /* GL_NV_fragment_program2 */ #ifdef GL_NV_fragment_program4 #endif /* GL_NV_fragment_program4 */ #ifdef GL_NV_fragment_program_option #endif /* GL_NV_fragment_program_option */ #ifdef GL_NV_framebuffer_multisample_coverage static GLboolean _glewInit_GL_NV_framebuffer_multisample_coverage (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glRenderbufferStorageMultisampleCoverageNV = (PFNGLRENDERBUFFERSTORAGEMULTISAMPLECOVERAGENVPROC)glewGetProcAddress((const GLubyte*)"glRenderbufferStorageMultisampleCoverageNV")) == NULL) || r; return r; } #endif /* GL_NV_framebuffer_multisample_coverage */ #ifdef GL_NV_geometry_program4 static GLboolean _glewInit_GL_NV_geometry_program4 (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glProgramVertexLimitNV = (PFNGLPROGRAMVERTEXLIMITNVPROC)glewGetProcAddress((const GLubyte*)"glProgramVertexLimitNV")) == NULL) || r; return r; } #endif /* GL_NV_geometry_program4 */ #ifdef GL_NV_geometry_shader4 #endif /* GL_NV_geometry_shader4 */ #ifdef GL_NV_gpu_program4 static GLboolean _glewInit_GL_NV_gpu_program4 (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glProgramEnvParameterI4iNV = (PFNGLPROGRAMENVPARAMETERI4INVPROC)glewGetProcAddress((const GLubyte*)"glProgramEnvParameterI4iNV")) == NULL) || r; r = ((glProgramEnvParameterI4ivNV = (PFNGLPROGRAMENVPARAMETERI4IVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramEnvParameterI4ivNV")) == NULL) || r; r = ((glProgramEnvParameterI4uiNV = (PFNGLPROGRAMENVPARAMETERI4UINVPROC)glewGetProcAddress((const GLubyte*)"glProgramEnvParameterI4uiNV")) == NULL) || r; r = ((glProgramEnvParameterI4uivNV = (PFNGLPROGRAMENVPARAMETERI4UIVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramEnvParameterI4uivNV")) == NULL) || r; r = ((glProgramEnvParametersI4ivNV = (PFNGLPROGRAMENVPARAMETERSI4IVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramEnvParametersI4ivNV")) == NULL) || r; r = ((glProgramEnvParametersI4uivNV = (PFNGLPROGRAMENVPARAMETERSI4UIVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramEnvParametersI4uivNV")) == NULL) || r; r = ((glProgramLocalParameterI4iNV = (PFNGLPROGRAMLOCALPARAMETERI4INVPROC)glewGetProcAddress((const GLubyte*)"glProgramLocalParameterI4iNV")) == NULL) || r; r = ((glProgramLocalParameterI4ivNV = (PFNGLPROGRAMLOCALPARAMETERI4IVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramLocalParameterI4ivNV")) == NULL) || r; r = ((glProgramLocalParameterI4uiNV = (PFNGLPROGRAMLOCALPARAMETERI4UINVPROC)glewGetProcAddress((const GLubyte*)"glProgramLocalParameterI4uiNV")) == NULL) || r; r = ((glProgramLocalParameterI4uivNV = (PFNGLPROGRAMLOCALPARAMETERI4UIVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramLocalParameterI4uivNV")) == NULL) || r; r = ((glProgramLocalParametersI4ivNV = (PFNGLPROGRAMLOCALPARAMETERSI4IVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramLocalParametersI4ivNV")) == NULL) || r; r = ((glProgramLocalParametersI4uivNV = (PFNGLPROGRAMLOCALPARAMETERSI4UIVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramLocalParametersI4uivNV")) == NULL) || r; return r; } #endif /* GL_NV_gpu_program4 */ #ifdef GL_NV_gpu_program5 #endif /* GL_NV_gpu_program5 */ #ifdef GL_NV_gpu_program_fp64 #endif /* GL_NV_gpu_program_fp64 */ #ifdef GL_NV_gpu_shader5 static GLboolean _glewInit_GL_NV_gpu_shader5 (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glGetUniformi64vNV = (PFNGLGETUNIFORMI64VNVPROC)glewGetProcAddress((const GLubyte*)"glGetUniformi64vNV")) == NULL) || r; r = ((glGetUniformui64vNV = (PFNGLGETUNIFORMUI64VNVPROC)glewGetProcAddress((const GLubyte*)"glGetUniformui64vNV")) == NULL) || r; r = ((glProgramUniform1i64NV = (PFNGLPROGRAMUNIFORM1I64NVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1i64NV")) == NULL) || r; r = ((glProgramUniform1i64vNV = (PFNGLPROGRAMUNIFORM1I64VNVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1i64vNV")) == NULL) || r; r = ((glProgramUniform1ui64NV = (PFNGLPROGRAMUNIFORM1UI64NVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1ui64NV")) == NULL) || r; r = ((glProgramUniform1ui64vNV = (PFNGLPROGRAMUNIFORM1UI64VNVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1ui64vNV")) == NULL) || r; r = ((glProgramUniform2i64NV = (PFNGLPROGRAMUNIFORM2I64NVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2i64NV")) == NULL) || r; r = ((glProgramUniform2i64vNV = (PFNGLPROGRAMUNIFORM2I64VNVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2i64vNV")) == NULL) || r; r = ((glProgramUniform2ui64NV = (PFNGLPROGRAMUNIFORM2UI64NVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2ui64NV")) == NULL) || r; r = ((glProgramUniform2ui64vNV = (PFNGLPROGRAMUNIFORM2UI64VNVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2ui64vNV")) == NULL) || r; r = ((glProgramUniform3i64NV = (PFNGLPROGRAMUNIFORM3I64NVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3i64NV")) == NULL) || r; r = ((glProgramUniform3i64vNV = (PFNGLPROGRAMUNIFORM3I64VNVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3i64vNV")) == NULL) || r; r = ((glProgramUniform3ui64NV = (PFNGLPROGRAMUNIFORM3UI64NVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3ui64NV")) == NULL) || r; r = ((glProgramUniform3ui64vNV = (PFNGLPROGRAMUNIFORM3UI64VNVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3ui64vNV")) == NULL) || r; r = ((glProgramUniform4i64NV = (PFNGLPROGRAMUNIFORM4I64NVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4i64NV")) == NULL) || r; r = ((glProgramUniform4i64vNV = (PFNGLPROGRAMUNIFORM4I64VNVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4i64vNV")) == NULL) || r; r = ((glProgramUniform4ui64NV = (PFNGLPROGRAMUNIFORM4UI64NVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4ui64NV")) == NULL) || r; r = ((glProgramUniform4ui64vNV = (PFNGLPROGRAMUNIFORM4UI64VNVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4ui64vNV")) == NULL) || r; r = ((glUniform1i64NV = (PFNGLUNIFORM1I64NVPROC)glewGetProcAddress((const GLubyte*)"glUniform1i64NV")) == NULL) || r; r = ((glUniform1i64vNV = (PFNGLUNIFORM1I64VNVPROC)glewGetProcAddress((const GLubyte*)"glUniform1i64vNV")) == NULL) || r; r = ((glUniform1ui64NV = (PFNGLUNIFORM1UI64NVPROC)glewGetProcAddress((const GLubyte*)"glUniform1ui64NV")) == NULL) || r; r = ((glUniform1ui64vNV = (PFNGLUNIFORM1UI64VNVPROC)glewGetProcAddress((const GLubyte*)"glUniform1ui64vNV")) == NULL) || r; r = ((glUniform2i64NV = (PFNGLUNIFORM2I64NVPROC)glewGetProcAddress((const GLubyte*)"glUniform2i64NV")) == NULL) || r; r = ((glUniform2i64vNV = (PFNGLUNIFORM2I64VNVPROC)glewGetProcAddress((const GLubyte*)"glUniform2i64vNV")) == NULL) || r; r = ((glUniform2ui64NV = (PFNGLUNIFORM2UI64NVPROC)glewGetProcAddress((const GLubyte*)"glUniform2ui64NV")) == NULL) || r; r = ((glUniform2ui64vNV = (PFNGLUNIFORM2UI64VNVPROC)glewGetProcAddress((const GLubyte*)"glUniform2ui64vNV")) == NULL) || r; r = ((glUniform3i64NV = (PFNGLUNIFORM3I64NVPROC)glewGetProcAddress((const GLubyte*)"glUniform3i64NV")) == NULL) || r; r = ((glUniform3i64vNV = (PFNGLUNIFORM3I64VNVPROC)glewGetProcAddress((const GLubyte*)"glUniform3i64vNV")) == NULL) || r; r = ((glUniform3ui64NV = (PFNGLUNIFORM3UI64NVPROC)glewGetProcAddress((const GLubyte*)"glUniform3ui64NV")) == NULL) || r; r = ((glUniform3ui64vNV = (PFNGLUNIFORM3UI64VNVPROC)glewGetProcAddress((const GLubyte*)"glUniform3ui64vNV")) == NULL) || r; r = ((glUniform4i64NV = (PFNGLUNIFORM4I64NVPROC)glewGetProcAddress((const GLubyte*)"glUniform4i64NV")) == NULL) || r; r = ((glUniform4i64vNV = (PFNGLUNIFORM4I64VNVPROC)glewGetProcAddress((const GLubyte*)"glUniform4i64vNV")) == NULL) || r; r = ((glUniform4ui64NV = (PFNGLUNIFORM4UI64NVPROC)glewGetProcAddress((const GLubyte*)"glUniform4ui64NV")) == NULL) || r; r = ((glUniform4ui64vNV = (PFNGLUNIFORM4UI64VNVPROC)glewGetProcAddress((const GLubyte*)"glUniform4ui64vNV")) == NULL) || r; return r; } #endif /* GL_NV_gpu_shader5 */ #ifdef GL_NV_half_float static GLboolean _glewInit_GL_NV_half_float (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glColor3hNV = (PFNGLCOLOR3HNVPROC)glewGetProcAddress((const GLubyte*)"glColor3hNV")) == NULL) || r; r = ((glColor3hvNV = (PFNGLCOLOR3HVNVPROC)glewGetProcAddress((const GLubyte*)"glColor3hvNV")) == NULL) || r; r = ((glColor4hNV = (PFNGLCOLOR4HNVPROC)glewGetProcAddress((const GLubyte*)"glColor4hNV")) == NULL) || r; r = ((glColor4hvNV = (PFNGLCOLOR4HVNVPROC)glewGetProcAddress((const GLubyte*)"glColor4hvNV")) == NULL) || r; r = ((glFogCoordhNV = (PFNGLFOGCOORDHNVPROC)glewGetProcAddress((const GLubyte*)"glFogCoordhNV")) == NULL) || r; r = ((glFogCoordhvNV = (PFNGLFOGCOORDHVNVPROC)glewGetProcAddress((const GLubyte*)"glFogCoordhvNV")) == NULL) || r; r = ((glMultiTexCoord1hNV = (PFNGLMULTITEXCOORD1HNVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1hNV")) == NULL) || r; r = ((glMultiTexCoord1hvNV = (PFNGLMULTITEXCOORD1HVNVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1hvNV")) == NULL) || r; r = ((glMultiTexCoord2hNV = (PFNGLMULTITEXCOORD2HNVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2hNV")) == NULL) || r; r = ((glMultiTexCoord2hvNV = (PFNGLMULTITEXCOORD2HVNVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2hvNV")) == NULL) || r; r = ((glMultiTexCoord3hNV = (PFNGLMULTITEXCOORD3HNVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3hNV")) == NULL) || r; r = ((glMultiTexCoord3hvNV = (PFNGLMULTITEXCOORD3HVNVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3hvNV")) == NULL) || r; r = ((glMultiTexCoord4hNV = (PFNGLMULTITEXCOORD4HNVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4hNV")) == NULL) || r; r = ((glMultiTexCoord4hvNV = (PFNGLMULTITEXCOORD4HVNVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4hvNV")) == NULL) || r; r = ((glNormal3hNV = (PFNGLNORMAL3HNVPROC)glewGetProcAddress((const GLubyte*)"glNormal3hNV")) == NULL) || r; r = ((glNormal3hvNV = (PFNGLNORMAL3HVNVPROC)glewGetProcAddress((const GLubyte*)"glNormal3hvNV")) == NULL) || r; r = ((glSecondaryColor3hNV = (PFNGLSECONDARYCOLOR3HNVPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3hNV")) == NULL) || r; r = ((glSecondaryColor3hvNV = (PFNGLSECONDARYCOLOR3HVNVPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3hvNV")) == NULL) || r; r = ((glTexCoord1hNV = (PFNGLTEXCOORD1HNVPROC)glewGetProcAddress((const GLubyte*)"glTexCoord1hNV")) == NULL) || r; r = ((glTexCoord1hvNV = (PFNGLTEXCOORD1HVNVPROC)glewGetProcAddress((const GLubyte*)"glTexCoord1hvNV")) == NULL) || r; r = ((glTexCoord2hNV = (PFNGLTEXCOORD2HNVPROC)glewGetProcAddress((const GLubyte*)"glTexCoord2hNV")) == NULL) || r; r = ((glTexCoord2hvNV = (PFNGLTEXCOORD2HVNVPROC)glewGetProcAddress((const GLubyte*)"glTexCoord2hvNV")) == NULL) || r; r = ((glTexCoord3hNV = (PFNGLTEXCOORD3HNVPROC)glewGetProcAddress((const GLubyte*)"glTexCoord3hNV")) == NULL) || r; r = ((glTexCoord3hvNV = (PFNGLTEXCOORD3HVNVPROC)glewGetProcAddress((const GLubyte*)"glTexCoord3hvNV")) == NULL) || r; r = ((glTexCoord4hNV = (PFNGLTEXCOORD4HNVPROC)glewGetProcAddress((const GLubyte*)"glTexCoord4hNV")) == NULL) || r; r = ((glTexCoord4hvNV = (PFNGLTEXCOORD4HVNVPROC)glewGetProcAddress((const GLubyte*)"glTexCoord4hvNV")) == NULL) || r; r = ((glVertex2hNV = (PFNGLVERTEX2HNVPROC)glewGetProcAddress((const GLubyte*)"glVertex2hNV")) == NULL) || r; r = ((glVertex2hvNV = (PFNGLVERTEX2HVNVPROC)glewGetProcAddress((const GLubyte*)"glVertex2hvNV")) == NULL) || r; r = ((glVertex3hNV = (PFNGLVERTEX3HNVPROC)glewGetProcAddress((const GLubyte*)"glVertex3hNV")) == NULL) || r; r = ((glVertex3hvNV = (PFNGLVERTEX3HVNVPROC)glewGetProcAddress((const GLubyte*)"glVertex3hvNV")) == NULL) || r; r = ((glVertex4hNV = (PFNGLVERTEX4HNVPROC)glewGetProcAddress((const GLubyte*)"glVertex4hNV")) == NULL) || r; r = ((glVertex4hvNV = (PFNGLVERTEX4HVNVPROC)glewGetProcAddress((const GLubyte*)"glVertex4hvNV")) == NULL) || r; r = ((glVertexAttrib1hNV = (PFNGLVERTEXATTRIB1HNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1hNV")) == NULL) || r; r = ((glVertexAttrib1hvNV = (PFNGLVERTEXATTRIB1HVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1hvNV")) == NULL) || r; r = ((glVertexAttrib2hNV = (PFNGLVERTEXATTRIB2HNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2hNV")) == NULL) || r; r = ((glVertexAttrib2hvNV = (PFNGLVERTEXATTRIB2HVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2hvNV")) == NULL) || r; r = ((glVertexAttrib3hNV = (PFNGLVERTEXATTRIB3HNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3hNV")) == NULL) || r; r = ((glVertexAttrib3hvNV = (PFNGLVERTEXATTRIB3HVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3hvNV")) == NULL) || r; r = ((glVertexAttrib4hNV = (PFNGLVERTEXATTRIB4HNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4hNV")) == NULL) || r; r = ((glVertexAttrib4hvNV = (PFNGLVERTEXATTRIB4HVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4hvNV")) == NULL) || r; r = ((glVertexAttribs1hvNV = (PFNGLVERTEXATTRIBS1HVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs1hvNV")) == NULL) || r; r = ((glVertexAttribs2hvNV = (PFNGLVERTEXATTRIBS2HVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs2hvNV")) == NULL) || r; r = ((glVertexAttribs3hvNV = (PFNGLVERTEXATTRIBS3HVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs3hvNV")) == NULL) || r; r = ((glVertexAttribs4hvNV = (PFNGLVERTEXATTRIBS4HVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs4hvNV")) == NULL) || r; r = ((glVertexWeighthNV = (PFNGLVERTEXWEIGHTHNVPROC)glewGetProcAddress((const GLubyte*)"glVertexWeighthNV")) == NULL) || r; r = ((glVertexWeighthvNV = (PFNGLVERTEXWEIGHTHVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexWeighthvNV")) == NULL) || r; return r; } #endif /* GL_NV_half_float */ #ifdef GL_NV_light_max_exponent #endif /* GL_NV_light_max_exponent */ #ifdef GL_NV_multisample_coverage #endif /* GL_NV_multisample_coverage */ #ifdef GL_NV_multisample_filter_hint #endif /* GL_NV_multisample_filter_hint */ #ifdef GL_NV_occlusion_query static GLboolean _glewInit_GL_NV_occlusion_query (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glBeginOcclusionQueryNV = (PFNGLBEGINOCCLUSIONQUERYNVPROC)glewGetProcAddress((const GLubyte*)"glBeginOcclusionQueryNV")) == NULL) || r; r = ((glDeleteOcclusionQueriesNV = (PFNGLDELETEOCCLUSIONQUERIESNVPROC)glewGetProcAddress((const GLubyte*)"glDeleteOcclusionQueriesNV")) == NULL) || r; r = ((glEndOcclusionQueryNV = (PFNGLENDOCCLUSIONQUERYNVPROC)glewGetProcAddress((const GLubyte*)"glEndOcclusionQueryNV")) == NULL) || r; r = ((glGenOcclusionQueriesNV = (PFNGLGENOCCLUSIONQUERIESNVPROC)glewGetProcAddress((const GLubyte*)"glGenOcclusionQueriesNV")) == NULL) || r; r = ((glGetOcclusionQueryivNV = (PFNGLGETOCCLUSIONQUERYIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetOcclusionQueryivNV")) == NULL) || r; r = ((glGetOcclusionQueryuivNV = (PFNGLGETOCCLUSIONQUERYUIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetOcclusionQueryuivNV")) == NULL) || r; r = ((glIsOcclusionQueryNV = (PFNGLISOCCLUSIONQUERYNVPROC)glewGetProcAddress((const GLubyte*)"glIsOcclusionQueryNV")) == NULL) || r; return r; } #endif /* GL_NV_occlusion_query */ #ifdef GL_NV_packed_depth_stencil #endif /* GL_NV_packed_depth_stencil */ #ifdef GL_NV_parameter_buffer_object static GLboolean _glewInit_GL_NV_parameter_buffer_object (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glProgramBufferParametersIivNV = (PFNGLPROGRAMBUFFERPARAMETERSIIVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramBufferParametersIivNV")) == NULL) || r; r = ((glProgramBufferParametersIuivNV = (PFNGLPROGRAMBUFFERPARAMETERSIUIVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramBufferParametersIuivNV")) == NULL) || r; r = ((glProgramBufferParametersfvNV = (PFNGLPROGRAMBUFFERPARAMETERSFVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramBufferParametersfvNV")) == NULL) || r; return r; } #endif /* GL_NV_parameter_buffer_object */ #ifdef GL_NV_parameter_buffer_object2 #endif /* GL_NV_parameter_buffer_object2 */ #ifdef GL_NV_path_rendering static GLboolean _glewInit_GL_NV_path_rendering (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glCopyPathNV = (PFNGLCOPYPATHNVPROC)glewGetProcAddress((const GLubyte*)"glCopyPathNV")) == NULL) || r; r = ((glCoverFillPathInstancedNV = (PFNGLCOVERFILLPATHINSTANCEDNVPROC)glewGetProcAddress((const GLubyte*)"glCoverFillPathInstancedNV")) == NULL) || r; r = ((glCoverFillPathNV = (PFNGLCOVERFILLPATHNVPROC)glewGetProcAddress((const GLubyte*)"glCoverFillPathNV")) == NULL) || r; r = ((glCoverStrokePathInstancedNV = (PFNGLCOVERSTROKEPATHINSTANCEDNVPROC)glewGetProcAddress((const GLubyte*)"glCoverStrokePathInstancedNV")) == NULL) || r; r = ((glCoverStrokePathNV = (PFNGLCOVERSTROKEPATHNVPROC)glewGetProcAddress((const GLubyte*)"glCoverStrokePathNV")) == NULL) || r; r = ((glDeletePathsNV = (PFNGLDELETEPATHSNVPROC)glewGetProcAddress((const GLubyte*)"glDeletePathsNV")) == NULL) || r; r = ((glGenPathsNV = (PFNGLGENPATHSNVPROC)glewGetProcAddress((const GLubyte*)"glGenPathsNV")) == NULL) || r; r = ((glGetPathColorGenfvNV = (PFNGLGETPATHCOLORGENFVNVPROC)glewGetProcAddress((const GLubyte*)"glGetPathColorGenfvNV")) == NULL) || r; r = ((glGetPathColorGenivNV = (PFNGLGETPATHCOLORGENIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetPathColorGenivNV")) == NULL) || r; r = ((glGetPathCommandsNV = (PFNGLGETPATHCOMMANDSNVPROC)glewGetProcAddress((const GLubyte*)"glGetPathCommandsNV")) == NULL) || r; r = ((glGetPathCoordsNV = (PFNGLGETPATHCOORDSNVPROC)glewGetProcAddress((const GLubyte*)"glGetPathCoordsNV")) == NULL) || r; r = ((glGetPathDashArrayNV = (PFNGLGETPATHDASHARRAYNVPROC)glewGetProcAddress((const GLubyte*)"glGetPathDashArrayNV")) == NULL) || r; r = ((glGetPathLengthNV = (PFNGLGETPATHLENGTHNVPROC)glewGetProcAddress((const GLubyte*)"glGetPathLengthNV")) == NULL) || r; r = ((glGetPathMetricRangeNV = (PFNGLGETPATHMETRICRANGENVPROC)glewGetProcAddress((const GLubyte*)"glGetPathMetricRangeNV")) == NULL) || r; r = ((glGetPathMetricsNV = (PFNGLGETPATHMETRICSNVPROC)glewGetProcAddress((const GLubyte*)"glGetPathMetricsNV")) == NULL) || r; r = ((glGetPathParameterfvNV = (PFNGLGETPATHPARAMETERFVNVPROC)glewGetProcAddress((const GLubyte*)"glGetPathParameterfvNV")) == NULL) || r; r = ((glGetPathParameterivNV = (PFNGLGETPATHPARAMETERIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetPathParameterivNV")) == NULL) || r; r = ((glGetPathSpacingNV = (PFNGLGETPATHSPACINGNVPROC)glewGetProcAddress((const GLubyte*)"glGetPathSpacingNV")) == NULL) || r; r = ((glGetPathTexGenfvNV = (PFNGLGETPATHTEXGENFVNVPROC)glewGetProcAddress((const GLubyte*)"glGetPathTexGenfvNV")) == NULL) || r; r = ((glGetPathTexGenivNV = (PFNGLGETPATHTEXGENIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetPathTexGenivNV")) == NULL) || r; r = ((glInterpolatePathsNV = (PFNGLINTERPOLATEPATHSNVPROC)glewGetProcAddress((const GLubyte*)"glInterpolatePathsNV")) == NULL) || r; r = ((glIsPathNV = (PFNGLISPATHNVPROC)glewGetProcAddress((const GLubyte*)"glIsPathNV")) == NULL) || r; r = ((glIsPointInFillPathNV = (PFNGLISPOINTINFILLPATHNVPROC)glewGetProcAddress((const GLubyte*)"glIsPointInFillPathNV")) == NULL) || r; r = ((glIsPointInStrokePathNV = (PFNGLISPOINTINSTROKEPATHNVPROC)glewGetProcAddress((const GLubyte*)"glIsPointInStrokePathNV")) == NULL) || r; r = ((glPathColorGenNV = (PFNGLPATHCOLORGENNVPROC)glewGetProcAddress((const GLubyte*)"glPathColorGenNV")) == NULL) || r; r = ((glPathCommandsNV = (PFNGLPATHCOMMANDSNVPROC)glewGetProcAddress((const GLubyte*)"glPathCommandsNV")) == NULL) || r; r = ((glPathCoordsNV = (PFNGLPATHCOORDSNVPROC)glewGetProcAddress((const GLubyte*)"glPathCoordsNV")) == NULL) || r; r = ((glPathCoverDepthFuncNV = (PFNGLPATHCOVERDEPTHFUNCNVPROC)glewGetProcAddress((const GLubyte*)"glPathCoverDepthFuncNV")) == NULL) || r; r = ((glPathDashArrayNV = (PFNGLPATHDASHARRAYNVPROC)glewGetProcAddress((const GLubyte*)"glPathDashArrayNV")) == NULL) || r; r = ((glPathFogGenNV = (PFNGLPATHFOGGENNVPROC)glewGetProcAddress((const GLubyte*)"glPathFogGenNV")) == NULL) || r; r = ((glPathGlyphRangeNV = (PFNGLPATHGLYPHRANGENVPROC)glewGetProcAddress((const GLubyte*)"glPathGlyphRangeNV")) == NULL) || r; r = ((glPathGlyphsNV = (PFNGLPATHGLYPHSNVPROC)glewGetProcAddress((const GLubyte*)"glPathGlyphsNV")) == NULL) || r; r = ((glPathParameterfNV = (PFNGLPATHPARAMETERFNVPROC)glewGetProcAddress((const GLubyte*)"glPathParameterfNV")) == NULL) || r; r = ((glPathParameterfvNV = (PFNGLPATHPARAMETERFVNVPROC)glewGetProcAddress((const GLubyte*)"glPathParameterfvNV")) == NULL) || r; r = ((glPathParameteriNV = (PFNGLPATHPARAMETERINVPROC)glewGetProcAddress((const GLubyte*)"glPathParameteriNV")) == NULL) || r; r = ((glPathParameterivNV = (PFNGLPATHPARAMETERIVNVPROC)glewGetProcAddress((const GLubyte*)"glPathParameterivNV")) == NULL) || r; r = ((glPathStencilDepthOffsetNV = (PFNGLPATHSTENCILDEPTHOFFSETNVPROC)glewGetProcAddress((const GLubyte*)"glPathStencilDepthOffsetNV")) == NULL) || r; r = ((glPathStencilFuncNV = (PFNGLPATHSTENCILFUNCNVPROC)glewGetProcAddress((const GLubyte*)"glPathStencilFuncNV")) == NULL) || r; r = ((glPathStringNV = (PFNGLPATHSTRINGNVPROC)glewGetProcAddress((const GLubyte*)"glPathStringNV")) == NULL) || r; r = ((glPathSubCommandsNV = (PFNGLPATHSUBCOMMANDSNVPROC)glewGetProcAddress((const GLubyte*)"glPathSubCommandsNV")) == NULL) || r; r = ((glPathSubCoordsNV = (PFNGLPATHSUBCOORDSNVPROC)glewGetProcAddress((const GLubyte*)"glPathSubCoordsNV")) == NULL) || r; r = ((glPathTexGenNV = (PFNGLPATHTEXGENNVPROC)glewGetProcAddress((const GLubyte*)"glPathTexGenNV")) == NULL) || r; r = ((glPointAlongPathNV = (PFNGLPOINTALONGPATHNVPROC)glewGetProcAddress((const GLubyte*)"glPointAlongPathNV")) == NULL) || r; r = ((glStencilFillPathInstancedNV = (PFNGLSTENCILFILLPATHINSTANCEDNVPROC)glewGetProcAddress((const GLubyte*)"glStencilFillPathInstancedNV")) == NULL) || r; r = ((glStencilFillPathNV = (PFNGLSTENCILFILLPATHNVPROC)glewGetProcAddress((const GLubyte*)"glStencilFillPathNV")) == NULL) || r; r = ((glStencilStrokePathInstancedNV = (PFNGLSTENCILSTROKEPATHINSTANCEDNVPROC)glewGetProcAddress((const GLubyte*)"glStencilStrokePathInstancedNV")) == NULL) || r; r = ((glStencilStrokePathNV = (PFNGLSTENCILSTROKEPATHNVPROC)glewGetProcAddress((const GLubyte*)"glStencilStrokePathNV")) == NULL) || r; r = ((glTransformPathNV = (PFNGLTRANSFORMPATHNVPROC)glewGetProcAddress((const GLubyte*)"glTransformPathNV")) == NULL) || r; r = ((glWeightPathsNV = (PFNGLWEIGHTPATHSNVPROC)glewGetProcAddress((const GLubyte*)"glWeightPathsNV")) == NULL) || r; return r; } #endif /* GL_NV_path_rendering */ #ifdef GL_NV_pixel_data_range static GLboolean _glewInit_GL_NV_pixel_data_range (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glFlushPixelDataRangeNV = (PFNGLFLUSHPIXELDATARANGENVPROC)glewGetProcAddress((const GLubyte*)"glFlushPixelDataRangeNV")) == NULL) || r; r = ((glPixelDataRangeNV = (PFNGLPIXELDATARANGENVPROC)glewGetProcAddress((const GLubyte*)"glPixelDataRangeNV")) == NULL) || r; return r; } #endif /* GL_NV_pixel_data_range */ #ifdef GL_NV_point_sprite static GLboolean _glewInit_GL_NV_point_sprite (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glPointParameteriNV = (PFNGLPOINTPARAMETERINVPROC)glewGetProcAddress((const GLubyte*)"glPointParameteriNV")) == NULL) || r; r = ((glPointParameterivNV = (PFNGLPOINTPARAMETERIVNVPROC)glewGetProcAddress((const GLubyte*)"glPointParameterivNV")) == NULL) || r; return r; } #endif /* GL_NV_point_sprite */ #ifdef GL_NV_present_video static GLboolean _glewInit_GL_NV_present_video (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glGetVideoi64vNV = (PFNGLGETVIDEOI64VNVPROC)glewGetProcAddress((const GLubyte*)"glGetVideoi64vNV")) == NULL) || r; r = ((glGetVideoivNV = (PFNGLGETVIDEOIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetVideoivNV")) == NULL) || r; r = ((glGetVideoui64vNV = (PFNGLGETVIDEOUI64VNVPROC)glewGetProcAddress((const GLubyte*)"glGetVideoui64vNV")) == NULL) || r; r = ((glGetVideouivNV = (PFNGLGETVIDEOUIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetVideouivNV")) == NULL) || r; r = ((glPresentFrameDualFillNV = (PFNGLPRESENTFRAMEDUALFILLNVPROC)glewGetProcAddress((const GLubyte*)"glPresentFrameDualFillNV")) == NULL) || r; r = ((glPresentFrameKeyedNV = (PFNGLPRESENTFRAMEKEYEDNVPROC)glewGetProcAddress((const GLubyte*)"glPresentFrameKeyedNV")) == NULL) || r; return r; } #endif /* GL_NV_present_video */ #ifdef GL_NV_primitive_restart static GLboolean _glewInit_GL_NV_primitive_restart (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glPrimitiveRestartIndexNV = (PFNGLPRIMITIVERESTARTINDEXNVPROC)glewGetProcAddress((const GLubyte*)"glPrimitiveRestartIndexNV")) == NULL) || r; r = ((glPrimitiveRestartNV = (PFNGLPRIMITIVERESTARTNVPROC)glewGetProcAddress((const GLubyte*)"glPrimitiveRestartNV")) == NULL) || r; return r; } #endif /* GL_NV_primitive_restart */ #ifdef GL_NV_register_combiners static GLboolean _glewInit_GL_NV_register_combiners (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glCombinerInputNV = (PFNGLCOMBINERINPUTNVPROC)glewGetProcAddress((const GLubyte*)"glCombinerInputNV")) == NULL) || r; r = ((glCombinerOutputNV = (PFNGLCOMBINEROUTPUTNVPROC)glewGetProcAddress((const GLubyte*)"glCombinerOutputNV")) == NULL) || r; r = ((glCombinerParameterfNV = (PFNGLCOMBINERPARAMETERFNVPROC)glewGetProcAddress((const GLubyte*)"glCombinerParameterfNV")) == NULL) || r; r = ((glCombinerParameterfvNV = (PFNGLCOMBINERPARAMETERFVNVPROC)glewGetProcAddress((const GLubyte*)"glCombinerParameterfvNV")) == NULL) || r; r = ((glCombinerParameteriNV = (PFNGLCOMBINERPARAMETERINVPROC)glewGetProcAddress((const GLubyte*)"glCombinerParameteriNV")) == NULL) || r; r = ((glCombinerParameterivNV = (PFNGLCOMBINERPARAMETERIVNVPROC)glewGetProcAddress((const GLubyte*)"glCombinerParameterivNV")) == NULL) || r; r = ((glFinalCombinerInputNV = (PFNGLFINALCOMBINERINPUTNVPROC)glewGetProcAddress((const GLubyte*)"glFinalCombinerInputNV")) == NULL) || r; r = ((glGetCombinerInputParameterfvNV = (PFNGLGETCOMBINERINPUTPARAMETERFVNVPROC)glewGetProcAddress((const GLubyte*)"glGetCombinerInputParameterfvNV")) == NULL) || r; r = ((glGetCombinerInputParameterivNV = (PFNGLGETCOMBINERINPUTPARAMETERIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetCombinerInputParameterivNV")) == NULL) || r; r = ((glGetCombinerOutputParameterfvNV = (PFNGLGETCOMBINEROUTPUTPARAMETERFVNVPROC)glewGetProcAddress((const GLubyte*)"glGetCombinerOutputParameterfvNV")) == NULL) || r; r = ((glGetCombinerOutputParameterivNV = (PFNGLGETCOMBINEROUTPUTPARAMETERIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetCombinerOutputParameterivNV")) == NULL) || r; r = ((glGetFinalCombinerInputParameterfvNV = (PFNGLGETFINALCOMBINERINPUTPARAMETERFVNVPROC)glewGetProcAddress((const GLubyte*)"glGetFinalCombinerInputParameterfvNV")) == NULL) || r; r = ((glGetFinalCombinerInputParameterivNV = (PFNGLGETFINALCOMBINERINPUTPARAMETERIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetFinalCombinerInputParameterivNV")) == NULL) || r; return r; } #endif /* GL_NV_register_combiners */ #ifdef GL_NV_register_combiners2 static GLboolean _glewInit_GL_NV_register_combiners2 (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glCombinerStageParameterfvNV = (PFNGLCOMBINERSTAGEPARAMETERFVNVPROC)glewGetProcAddress((const GLubyte*)"glCombinerStageParameterfvNV")) == NULL) || r; r = ((glGetCombinerStageParameterfvNV = (PFNGLGETCOMBINERSTAGEPARAMETERFVNVPROC)glewGetProcAddress((const GLubyte*)"glGetCombinerStageParameterfvNV")) == NULL) || r; return r; } #endif /* GL_NV_register_combiners2 */ #ifdef GL_NV_shader_atomic_float #endif /* GL_NV_shader_atomic_float */ #ifdef GL_NV_shader_buffer_load static GLboolean _glewInit_GL_NV_shader_buffer_load (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glGetBufferParameterui64vNV = (PFNGLGETBUFFERPARAMETERUI64VNVPROC)glewGetProcAddress((const GLubyte*)"glGetBufferParameterui64vNV")) == NULL) || r; r = ((glGetIntegerui64vNV = (PFNGLGETINTEGERUI64VNVPROC)glewGetProcAddress((const GLubyte*)"glGetIntegerui64vNV")) == NULL) || r; r = ((glGetNamedBufferParameterui64vNV = (PFNGLGETNAMEDBUFFERPARAMETERUI64VNVPROC)glewGetProcAddress((const GLubyte*)"glGetNamedBufferParameterui64vNV")) == NULL) || r; r = ((glIsBufferResidentNV = (PFNGLISBUFFERRESIDENTNVPROC)glewGetProcAddress((const GLubyte*)"glIsBufferResidentNV")) == NULL) || r; r = ((glIsNamedBufferResidentNV = (PFNGLISNAMEDBUFFERRESIDENTNVPROC)glewGetProcAddress((const GLubyte*)"glIsNamedBufferResidentNV")) == NULL) || r; r = ((glMakeBufferNonResidentNV = (PFNGLMAKEBUFFERNONRESIDENTNVPROC)glewGetProcAddress((const GLubyte*)"glMakeBufferNonResidentNV")) == NULL) || r; r = ((glMakeBufferResidentNV = (PFNGLMAKEBUFFERRESIDENTNVPROC)glewGetProcAddress((const GLubyte*)"glMakeBufferResidentNV")) == NULL) || r; r = ((glMakeNamedBufferNonResidentNV = (PFNGLMAKENAMEDBUFFERNONRESIDENTNVPROC)glewGetProcAddress((const GLubyte*)"glMakeNamedBufferNonResidentNV")) == NULL) || r; r = ((glMakeNamedBufferResidentNV = (PFNGLMAKENAMEDBUFFERRESIDENTNVPROC)glewGetProcAddress((const GLubyte*)"glMakeNamedBufferResidentNV")) == NULL) || r; r = ((glProgramUniformui64NV = (PFNGLPROGRAMUNIFORMUI64NVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformui64NV")) == NULL) || r; r = ((glProgramUniformui64vNV = (PFNGLPROGRAMUNIFORMUI64VNVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformui64vNV")) == NULL) || r; r = ((glUniformui64NV = (PFNGLUNIFORMUI64NVPROC)glewGetProcAddress((const GLubyte*)"glUniformui64NV")) == NULL) || r; r = ((glUniformui64vNV = (PFNGLUNIFORMUI64VNVPROC)glewGetProcAddress((const GLubyte*)"glUniformui64vNV")) == NULL) || r; return r; } #endif /* GL_NV_shader_buffer_load */ #ifdef GL_NV_tessellation_program5 #endif /* GL_NV_tessellation_program5 */ #ifdef GL_NV_texgen_emboss #endif /* GL_NV_texgen_emboss */ #ifdef GL_NV_texgen_reflection #endif /* GL_NV_texgen_reflection */ #ifdef GL_NV_texture_barrier static GLboolean _glewInit_GL_NV_texture_barrier (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glTextureBarrierNV = (PFNGLTEXTUREBARRIERNVPROC)glewGetProcAddress((const GLubyte*)"glTextureBarrierNV")) == NULL) || r; return r; } #endif /* GL_NV_texture_barrier */ #ifdef GL_NV_texture_compression_vtc #endif /* GL_NV_texture_compression_vtc */ #ifdef GL_NV_texture_env_combine4 #endif /* GL_NV_texture_env_combine4 */ #ifdef GL_NV_texture_expand_normal #endif /* GL_NV_texture_expand_normal */ #ifdef GL_NV_texture_multisample static GLboolean _glewInit_GL_NV_texture_multisample (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glTexImage2DMultisampleCoverageNV = (PFNGLTEXIMAGE2DMULTISAMPLECOVERAGENVPROC)glewGetProcAddress((const GLubyte*)"glTexImage2DMultisampleCoverageNV")) == NULL) || r; r = ((glTexImage3DMultisampleCoverageNV = (PFNGLTEXIMAGE3DMULTISAMPLECOVERAGENVPROC)glewGetProcAddress((const GLubyte*)"glTexImage3DMultisampleCoverageNV")) == NULL) || r; r = ((glTextureImage2DMultisampleCoverageNV = (PFNGLTEXTUREIMAGE2DMULTISAMPLECOVERAGENVPROC)glewGetProcAddress((const GLubyte*)"glTextureImage2DMultisampleCoverageNV")) == NULL) || r; r = ((glTextureImage2DMultisampleNV = (PFNGLTEXTUREIMAGE2DMULTISAMPLENVPROC)glewGetProcAddress((const GLubyte*)"glTextureImage2DMultisampleNV")) == NULL) || r; r = ((glTextureImage3DMultisampleCoverageNV = (PFNGLTEXTUREIMAGE3DMULTISAMPLECOVERAGENVPROC)glewGetProcAddress((const GLubyte*)"glTextureImage3DMultisampleCoverageNV")) == NULL) || r; r = ((glTextureImage3DMultisampleNV = (PFNGLTEXTUREIMAGE3DMULTISAMPLENVPROC)glewGetProcAddress((const GLubyte*)"glTextureImage3DMultisampleNV")) == NULL) || r; return r; } #endif /* GL_NV_texture_multisample */ #ifdef GL_NV_texture_rectangle #endif /* GL_NV_texture_rectangle */ #ifdef GL_NV_texture_shader #endif /* GL_NV_texture_shader */ #ifdef GL_NV_texture_shader2 #endif /* GL_NV_texture_shader2 */ #ifdef GL_NV_texture_shader3 #endif /* GL_NV_texture_shader3 */ #ifdef GL_NV_transform_feedback static GLboolean _glewInit_GL_NV_transform_feedback (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glActiveVaryingNV = (PFNGLACTIVEVARYINGNVPROC)glewGetProcAddress((const GLubyte*)"glActiveVaryingNV")) == NULL) || r; r = ((glBeginTransformFeedbackNV = (PFNGLBEGINTRANSFORMFEEDBACKNVPROC)glewGetProcAddress((const GLubyte*)"glBeginTransformFeedbackNV")) == NULL) || r; r = ((glBindBufferBaseNV = (PFNGLBINDBUFFERBASENVPROC)glewGetProcAddress((const GLubyte*)"glBindBufferBaseNV")) == NULL) || r; r = ((glBindBufferOffsetNV = (PFNGLBINDBUFFEROFFSETNVPROC)glewGetProcAddress((const GLubyte*)"glBindBufferOffsetNV")) == NULL) || r; r = ((glBindBufferRangeNV = (PFNGLBINDBUFFERRANGENVPROC)glewGetProcAddress((const GLubyte*)"glBindBufferRangeNV")) == NULL) || r; r = ((glEndTransformFeedbackNV = (PFNGLENDTRANSFORMFEEDBACKNVPROC)glewGetProcAddress((const GLubyte*)"glEndTransformFeedbackNV")) == NULL) || r; r = ((glGetActiveVaryingNV = (PFNGLGETACTIVEVARYINGNVPROC)glewGetProcAddress((const GLubyte*)"glGetActiveVaryingNV")) == NULL) || r; r = ((glGetTransformFeedbackVaryingNV = (PFNGLGETTRANSFORMFEEDBACKVARYINGNVPROC)glewGetProcAddress((const GLubyte*)"glGetTransformFeedbackVaryingNV")) == NULL) || r; r = ((glGetVaryingLocationNV = (PFNGLGETVARYINGLOCATIONNVPROC)glewGetProcAddress((const GLubyte*)"glGetVaryingLocationNV")) == NULL) || r; r = ((glTransformFeedbackAttribsNV = (PFNGLTRANSFORMFEEDBACKATTRIBSNVPROC)glewGetProcAddress((const GLubyte*)"glTransformFeedbackAttribsNV")) == NULL) || r; r = ((glTransformFeedbackVaryingsNV = (PFNGLTRANSFORMFEEDBACKVARYINGSNVPROC)glewGetProcAddress((const GLubyte*)"glTransformFeedbackVaryingsNV")) == NULL) || r; return r; } #endif /* GL_NV_transform_feedback */ #ifdef GL_NV_transform_feedback2 static GLboolean _glewInit_GL_NV_transform_feedback2 (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glBindTransformFeedbackNV = (PFNGLBINDTRANSFORMFEEDBACKNVPROC)glewGetProcAddress((const GLubyte*)"glBindTransformFeedbackNV")) == NULL) || r; r = ((glDeleteTransformFeedbacksNV = (PFNGLDELETETRANSFORMFEEDBACKSNVPROC)glewGetProcAddress((const GLubyte*)"glDeleteTransformFeedbacksNV")) == NULL) || r; r = ((glDrawTransformFeedbackNV = (PFNGLDRAWTRANSFORMFEEDBACKNVPROC)glewGetProcAddress((const GLubyte*)"glDrawTransformFeedbackNV")) == NULL) || r; r = ((glGenTransformFeedbacksNV = (PFNGLGENTRANSFORMFEEDBACKSNVPROC)glewGetProcAddress((const GLubyte*)"glGenTransformFeedbacksNV")) == NULL) || r; r = ((glIsTransformFeedbackNV = (PFNGLISTRANSFORMFEEDBACKNVPROC)glewGetProcAddress((const GLubyte*)"glIsTransformFeedbackNV")) == NULL) || r; r = ((glPauseTransformFeedbackNV = (PFNGLPAUSETRANSFORMFEEDBACKNVPROC)glewGetProcAddress((const GLubyte*)"glPauseTransformFeedbackNV")) == NULL) || r; r = ((glResumeTransformFeedbackNV = (PFNGLRESUMETRANSFORMFEEDBACKNVPROC)glewGetProcAddress((const GLubyte*)"glResumeTransformFeedbackNV")) == NULL) || r; return r; } #endif /* GL_NV_transform_feedback2 */ #ifdef GL_NV_vdpau_interop static GLboolean _glewInit_GL_NV_vdpau_interop (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glVDPAUFiniNV = (PFNGLVDPAUFININVPROC)glewGetProcAddress((const GLubyte*)"glVDPAUFiniNV")) == NULL) || r; r = ((glVDPAUGetSurfaceivNV = (PFNGLVDPAUGETSURFACEIVNVPROC)glewGetProcAddress((const GLubyte*)"glVDPAUGetSurfaceivNV")) == NULL) || r; r = ((glVDPAUInitNV = (PFNGLVDPAUINITNVPROC)glewGetProcAddress((const GLubyte*)"glVDPAUInitNV")) == NULL) || r; r = ((glVDPAUIsSurfaceNV = (PFNGLVDPAUISSURFACENVPROC)glewGetProcAddress((const GLubyte*)"glVDPAUIsSurfaceNV")) == NULL) || r; r = ((glVDPAUMapSurfacesNV = (PFNGLVDPAUMAPSURFACESNVPROC)glewGetProcAddress((const GLubyte*)"glVDPAUMapSurfacesNV")) == NULL) || r; r = ((glVDPAURegisterOutputSurfaceNV = (PFNGLVDPAUREGISTEROUTPUTSURFACENVPROC)glewGetProcAddress((const GLubyte*)"glVDPAURegisterOutputSurfaceNV")) == NULL) || r; r = ((glVDPAURegisterVideoSurfaceNV = (PFNGLVDPAUREGISTERVIDEOSURFACENVPROC)glewGetProcAddress((const GLubyte*)"glVDPAURegisterVideoSurfaceNV")) == NULL) || r; r = ((glVDPAUSurfaceAccessNV = (PFNGLVDPAUSURFACEACCESSNVPROC)glewGetProcAddress((const GLubyte*)"glVDPAUSurfaceAccessNV")) == NULL) || r; r = ((glVDPAUUnmapSurfacesNV = (PFNGLVDPAUUNMAPSURFACESNVPROC)glewGetProcAddress((const GLubyte*)"glVDPAUUnmapSurfacesNV")) == NULL) || r; r = ((glVDPAUUnregisterSurfaceNV = (PFNGLVDPAUUNREGISTERSURFACENVPROC)glewGetProcAddress((const GLubyte*)"glVDPAUUnregisterSurfaceNV")) == NULL) || r; return r; } #endif /* GL_NV_vdpau_interop */ #ifdef GL_NV_vertex_array_range static GLboolean _glewInit_GL_NV_vertex_array_range (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glFlushVertexArrayRangeNV = (PFNGLFLUSHVERTEXARRAYRANGENVPROC)glewGetProcAddress((const GLubyte*)"glFlushVertexArrayRangeNV")) == NULL) || r; r = ((glVertexArrayRangeNV = (PFNGLVERTEXARRAYRANGENVPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayRangeNV")) == NULL) || r; return r; } #endif /* GL_NV_vertex_array_range */ #ifdef GL_NV_vertex_array_range2 #endif /* GL_NV_vertex_array_range2 */ #ifdef GL_NV_vertex_attrib_integer_64bit static GLboolean _glewInit_GL_NV_vertex_attrib_integer_64bit (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glGetVertexAttribLi64vNV = (PFNGLGETVERTEXATTRIBLI64VNVPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribLi64vNV")) == NULL) || r; r = ((glGetVertexAttribLui64vNV = (PFNGLGETVERTEXATTRIBLUI64VNVPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribLui64vNV")) == NULL) || r; r = ((glVertexAttribL1i64NV = (PFNGLVERTEXATTRIBL1I64NVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL1i64NV")) == NULL) || r; r = ((glVertexAttribL1i64vNV = (PFNGLVERTEXATTRIBL1I64VNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL1i64vNV")) == NULL) || r; r = ((glVertexAttribL1ui64NV = (PFNGLVERTEXATTRIBL1UI64NVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL1ui64NV")) == NULL) || r; r = ((glVertexAttribL1ui64vNV = (PFNGLVERTEXATTRIBL1UI64VNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL1ui64vNV")) == NULL) || r; r = ((glVertexAttribL2i64NV = (PFNGLVERTEXATTRIBL2I64NVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL2i64NV")) == NULL) || r; r = ((glVertexAttribL2i64vNV = (PFNGLVERTEXATTRIBL2I64VNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL2i64vNV")) == NULL) || r; r = ((glVertexAttribL2ui64NV = (PFNGLVERTEXATTRIBL2UI64NVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL2ui64NV")) == NULL) || r; r = ((glVertexAttribL2ui64vNV = (PFNGLVERTEXATTRIBL2UI64VNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL2ui64vNV")) == NULL) || r; r = ((glVertexAttribL3i64NV = (PFNGLVERTEXATTRIBL3I64NVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL3i64NV")) == NULL) || r; r = ((glVertexAttribL3i64vNV = (PFNGLVERTEXATTRIBL3I64VNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL3i64vNV")) == NULL) || r; r = ((glVertexAttribL3ui64NV = (PFNGLVERTEXATTRIBL3UI64NVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL3ui64NV")) == NULL) || r; r = ((glVertexAttribL3ui64vNV = (PFNGLVERTEXATTRIBL3UI64VNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL3ui64vNV")) == NULL) || r; r = ((glVertexAttribL4i64NV = (PFNGLVERTEXATTRIBL4I64NVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL4i64NV")) == NULL) || r; r = ((glVertexAttribL4i64vNV = (PFNGLVERTEXATTRIBL4I64VNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL4i64vNV")) == NULL) || r; r = ((glVertexAttribL4ui64NV = (PFNGLVERTEXATTRIBL4UI64NVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL4ui64NV")) == NULL) || r; r = ((glVertexAttribL4ui64vNV = (PFNGLVERTEXATTRIBL4UI64VNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL4ui64vNV")) == NULL) || r; r = ((glVertexAttribLFormatNV = (PFNGLVERTEXATTRIBLFORMATNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribLFormatNV")) == NULL) || r; return r; } #endif /* GL_NV_vertex_attrib_integer_64bit */ #ifdef GL_NV_vertex_buffer_unified_memory static GLboolean _glewInit_GL_NV_vertex_buffer_unified_memory (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glBufferAddressRangeNV = (PFNGLBUFFERADDRESSRANGENVPROC)glewGetProcAddress((const GLubyte*)"glBufferAddressRangeNV")) == NULL) || r; r = ((glColorFormatNV = (PFNGLCOLORFORMATNVPROC)glewGetProcAddress((const GLubyte*)"glColorFormatNV")) == NULL) || r; r = ((glEdgeFlagFormatNV = (PFNGLEDGEFLAGFORMATNVPROC)glewGetProcAddress((const GLubyte*)"glEdgeFlagFormatNV")) == NULL) || r; r = ((glFogCoordFormatNV = (PFNGLFOGCOORDFORMATNVPROC)glewGetProcAddress((const GLubyte*)"glFogCoordFormatNV")) == NULL) || r; r = ((glGetIntegerui64i_vNV = (PFNGLGETINTEGERUI64I_VNVPROC)glewGetProcAddress((const GLubyte*)"glGetIntegerui64i_vNV")) == NULL) || r; r = ((glIndexFormatNV = (PFNGLINDEXFORMATNVPROC)glewGetProcAddress((const GLubyte*)"glIndexFormatNV")) == NULL) || r; r = ((glNormalFormatNV = (PFNGLNORMALFORMATNVPROC)glewGetProcAddress((const GLubyte*)"glNormalFormatNV")) == NULL) || r; r = ((glSecondaryColorFormatNV = (PFNGLSECONDARYCOLORFORMATNVPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColorFormatNV")) == NULL) || r; r = ((glTexCoordFormatNV = (PFNGLTEXCOORDFORMATNVPROC)glewGetProcAddress((const GLubyte*)"glTexCoordFormatNV")) == NULL) || r; r = ((glVertexAttribFormatNV = (PFNGLVERTEXATTRIBFORMATNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribFormatNV")) == NULL) || r; r = ((glVertexAttribIFormatNV = (PFNGLVERTEXATTRIBIFORMATNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribIFormatNV")) == NULL) || r; r = ((glVertexFormatNV = (PFNGLVERTEXFORMATNVPROC)glewGetProcAddress((const GLubyte*)"glVertexFormatNV")) == NULL) || r; return r; } #endif /* GL_NV_vertex_buffer_unified_memory */ #ifdef GL_NV_vertex_program static GLboolean _glewInit_GL_NV_vertex_program (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glAreProgramsResidentNV = (PFNGLAREPROGRAMSRESIDENTNVPROC)glewGetProcAddress((const GLubyte*)"glAreProgramsResidentNV")) == NULL) || r; r = ((glBindProgramNV = (PFNGLBINDPROGRAMNVPROC)glewGetProcAddress((const GLubyte*)"glBindProgramNV")) == NULL) || r; r = ((glDeleteProgramsNV = (PFNGLDELETEPROGRAMSNVPROC)glewGetProcAddress((const GLubyte*)"glDeleteProgramsNV")) == NULL) || r; r = ((glExecuteProgramNV = (PFNGLEXECUTEPROGRAMNVPROC)glewGetProcAddress((const GLubyte*)"glExecuteProgramNV")) == NULL) || r; r = ((glGenProgramsNV = (PFNGLGENPROGRAMSNVPROC)glewGetProcAddress((const GLubyte*)"glGenProgramsNV")) == NULL) || r; r = ((glGetProgramParameterdvNV = (PFNGLGETPROGRAMPARAMETERDVNVPROC)glewGetProcAddress((const GLubyte*)"glGetProgramParameterdvNV")) == NULL) || r; r = ((glGetProgramParameterfvNV = (PFNGLGETPROGRAMPARAMETERFVNVPROC)glewGetProcAddress((const GLubyte*)"glGetProgramParameterfvNV")) == NULL) || r; r = ((glGetProgramStringNV = (PFNGLGETPROGRAMSTRINGNVPROC)glewGetProcAddress((const GLubyte*)"glGetProgramStringNV")) == NULL) || r; r = ((glGetProgramivNV = (PFNGLGETPROGRAMIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetProgramivNV")) == NULL) || r; r = ((glGetTrackMatrixivNV = (PFNGLGETTRACKMATRIXIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetTrackMatrixivNV")) == NULL) || r; r = ((glGetVertexAttribPointervNV = (PFNGLGETVERTEXATTRIBPOINTERVNVPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribPointervNV")) == NULL) || r; r = ((glGetVertexAttribdvNV = (PFNGLGETVERTEXATTRIBDVNVPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribdvNV")) == NULL) || r; r = ((glGetVertexAttribfvNV = (PFNGLGETVERTEXATTRIBFVNVPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribfvNV")) == NULL) || r; r = ((glGetVertexAttribivNV = (PFNGLGETVERTEXATTRIBIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribivNV")) == NULL) || r; r = ((glIsProgramNV = (PFNGLISPROGRAMNVPROC)glewGetProcAddress((const GLubyte*)"glIsProgramNV")) == NULL) || r; r = ((glLoadProgramNV = (PFNGLLOADPROGRAMNVPROC)glewGetProcAddress((const GLubyte*)"glLoadProgramNV")) == NULL) || r; r = ((glProgramParameter4dNV = (PFNGLPROGRAMPARAMETER4DNVPROC)glewGetProcAddress((const GLubyte*)"glProgramParameter4dNV")) == NULL) || r; r = ((glProgramParameter4dvNV = (PFNGLPROGRAMPARAMETER4DVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramParameter4dvNV")) == NULL) || r; r = ((glProgramParameter4fNV = (PFNGLPROGRAMPARAMETER4FNVPROC)glewGetProcAddress((const GLubyte*)"glProgramParameter4fNV")) == NULL) || r; r = ((glProgramParameter4fvNV = (PFNGLPROGRAMPARAMETER4FVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramParameter4fvNV")) == NULL) || r; r = ((glProgramParameters4dvNV = (PFNGLPROGRAMPARAMETERS4DVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramParameters4dvNV")) == NULL) || r; r = ((glProgramParameters4fvNV = (PFNGLPROGRAMPARAMETERS4FVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramParameters4fvNV")) == NULL) || r; r = ((glRequestResidentProgramsNV = (PFNGLREQUESTRESIDENTPROGRAMSNVPROC)glewGetProcAddress((const GLubyte*)"glRequestResidentProgramsNV")) == NULL) || r; r = ((glTrackMatrixNV = (PFNGLTRACKMATRIXNVPROC)glewGetProcAddress((const GLubyte*)"glTrackMatrixNV")) == NULL) || r; r = ((glVertexAttrib1dNV = (PFNGLVERTEXATTRIB1DNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1dNV")) == NULL) || r; r = ((glVertexAttrib1dvNV = (PFNGLVERTEXATTRIB1DVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1dvNV")) == NULL) || r; r = ((glVertexAttrib1fNV = (PFNGLVERTEXATTRIB1FNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1fNV")) == NULL) || r; r = ((glVertexAttrib1fvNV = (PFNGLVERTEXATTRIB1FVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1fvNV")) == NULL) || r; r = ((glVertexAttrib1sNV = (PFNGLVERTEXATTRIB1SNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1sNV")) == NULL) || r; r = ((glVertexAttrib1svNV = (PFNGLVERTEXATTRIB1SVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1svNV")) == NULL) || r; r = ((glVertexAttrib2dNV = (PFNGLVERTEXATTRIB2DNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2dNV")) == NULL) || r; r = ((glVertexAttrib2dvNV = (PFNGLVERTEXATTRIB2DVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2dvNV")) == NULL) || r; r = ((glVertexAttrib2fNV = (PFNGLVERTEXATTRIB2FNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2fNV")) == NULL) || r; r = ((glVertexAttrib2fvNV = (PFNGLVERTEXATTRIB2FVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2fvNV")) == NULL) || r; r = ((glVertexAttrib2sNV = (PFNGLVERTEXATTRIB2SNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2sNV")) == NULL) || r; r = ((glVertexAttrib2svNV = (PFNGLVERTEXATTRIB2SVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2svNV")) == NULL) || r; r = ((glVertexAttrib3dNV = (PFNGLVERTEXATTRIB3DNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3dNV")) == NULL) || r; r = ((glVertexAttrib3dvNV = (PFNGLVERTEXATTRIB3DVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3dvNV")) == NULL) || r; r = ((glVertexAttrib3fNV = (PFNGLVERTEXATTRIB3FNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3fNV")) == NULL) || r; r = ((glVertexAttrib3fvNV = (PFNGLVERTEXATTRIB3FVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3fvNV")) == NULL) || r; r = ((glVertexAttrib3sNV = (PFNGLVERTEXATTRIB3SNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3sNV")) == NULL) || r; r = ((glVertexAttrib3svNV = (PFNGLVERTEXATTRIB3SVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3svNV")) == NULL) || r; r = ((glVertexAttrib4dNV = (PFNGLVERTEXATTRIB4DNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4dNV")) == NULL) || r; r = ((glVertexAttrib4dvNV = (PFNGLVERTEXATTRIB4DVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4dvNV")) == NULL) || r; r = ((glVertexAttrib4fNV = (PFNGLVERTEXATTRIB4FNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4fNV")) == NULL) || r; r = ((glVertexAttrib4fvNV = (PFNGLVERTEXATTRIB4FVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4fvNV")) == NULL) || r; r = ((glVertexAttrib4sNV = (PFNGLVERTEXATTRIB4SNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4sNV")) == NULL) || r; r = ((glVertexAttrib4svNV = (PFNGLVERTEXATTRIB4SVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4svNV")) == NULL) || r; r = ((glVertexAttrib4ubNV = (PFNGLVERTEXATTRIB4UBNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4ubNV")) == NULL) || r; r = ((glVertexAttrib4ubvNV = (PFNGLVERTEXATTRIB4UBVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4ubvNV")) == NULL) || r; r = ((glVertexAttribPointerNV = (PFNGLVERTEXATTRIBPOINTERNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribPointerNV")) == NULL) || r; r = ((glVertexAttribs1dvNV = (PFNGLVERTEXATTRIBS1DVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs1dvNV")) == NULL) || r; r = ((glVertexAttribs1fvNV = (PFNGLVERTEXATTRIBS1FVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs1fvNV")) == NULL) || r; r = ((glVertexAttribs1svNV = (PFNGLVERTEXATTRIBS1SVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs1svNV")) == NULL) || r; r = ((glVertexAttribs2dvNV = (PFNGLVERTEXATTRIBS2DVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs2dvNV")) == NULL) || r; r = ((glVertexAttribs2fvNV = (PFNGLVERTEXATTRIBS2FVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs2fvNV")) == NULL) || r; r = ((glVertexAttribs2svNV = (PFNGLVERTEXATTRIBS2SVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs2svNV")) == NULL) || r; r = ((glVertexAttribs3dvNV = (PFNGLVERTEXATTRIBS3DVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs3dvNV")) == NULL) || r; r = ((glVertexAttribs3fvNV = (PFNGLVERTEXATTRIBS3FVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs3fvNV")) == NULL) || r; r = ((glVertexAttribs3svNV = (PFNGLVERTEXATTRIBS3SVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs3svNV")) == NULL) || r; r = ((glVertexAttribs4dvNV = (PFNGLVERTEXATTRIBS4DVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs4dvNV")) == NULL) || r; r = ((glVertexAttribs4fvNV = (PFNGLVERTEXATTRIBS4FVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs4fvNV")) == NULL) || r; r = ((glVertexAttribs4svNV = (PFNGLVERTEXATTRIBS4SVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs4svNV")) == NULL) || r; r = ((glVertexAttribs4ubvNV = (PFNGLVERTEXATTRIBS4UBVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs4ubvNV")) == NULL) || r; return r; } #endif /* GL_NV_vertex_program */ #ifdef GL_NV_vertex_program1_1 #endif /* GL_NV_vertex_program1_1 */ #ifdef GL_NV_vertex_program2 #endif /* GL_NV_vertex_program2 */ #ifdef GL_NV_vertex_program2_option #endif /* GL_NV_vertex_program2_option */ #ifdef GL_NV_vertex_program3 #endif /* GL_NV_vertex_program3 */ #ifdef GL_NV_vertex_program4 #endif /* GL_NV_vertex_program4 */ #ifdef GL_NV_video_capture static GLboolean _glewInit_GL_NV_video_capture (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glBeginVideoCaptureNV = (PFNGLBEGINVIDEOCAPTURENVPROC)glewGetProcAddress((const GLubyte*)"glBeginVideoCaptureNV")) == NULL) || r; r = ((glBindVideoCaptureStreamBufferNV = (PFNGLBINDVIDEOCAPTURESTREAMBUFFERNVPROC)glewGetProcAddress((const GLubyte*)"glBindVideoCaptureStreamBufferNV")) == NULL) || r; r = ((glBindVideoCaptureStreamTextureNV = (PFNGLBINDVIDEOCAPTURESTREAMTEXTURENVPROC)glewGetProcAddress((const GLubyte*)"glBindVideoCaptureStreamTextureNV")) == NULL) || r; r = ((glEndVideoCaptureNV = (PFNGLENDVIDEOCAPTURENVPROC)glewGetProcAddress((const GLubyte*)"glEndVideoCaptureNV")) == NULL) || r; r = ((glGetVideoCaptureStreamdvNV = (PFNGLGETVIDEOCAPTURESTREAMDVNVPROC)glewGetProcAddress((const GLubyte*)"glGetVideoCaptureStreamdvNV")) == NULL) || r; r = ((glGetVideoCaptureStreamfvNV = (PFNGLGETVIDEOCAPTURESTREAMFVNVPROC)glewGetProcAddress((const GLubyte*)"glGetVideoCaptureStreamfvNV")) == NULL) || r; r = ((glGetVideoCaptureStreamivNV = (PFNGLGETVIDEOCAPTURESTREAMIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetVideoCaptureStreamivNV")) == NULL) || r; r = ((glGetVideoCaptureivNV = (PFNGLGETVIDEOCAPTUREIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetVideoCaptureivNV")) == NULL) || r; r = ((glVideoCaptureNV = (PFNGLVIDEOCAPTURENVPROC)glewGetProcAddress((const GLubyte*)"glVideoCaptureNV")) == NULL) || r; r = ((glVideoCaptureStreamParameterdvNV = (PFNGLVIDEOCAPTURESTREAMPARAMETERDVNVPROC)glewGetProcAddress((const GLubyte*)"glVideoCaptureStreamParameterdvNV")) == NULL) || r; r = ((glVideoCaptureStreamParameterfvNV = (PFNGLVIDEOCAPTURESTREAMPARAMETERFVNVPROC)glewGetProcAddress((const GLubyte*)"glVideoCaptureStreamParameterfvNV")) == NULL) || r; r = ((glVideoCaptureStreamParameterivNV = (PFNGLVIDEOCAPTURESTREAMPARAMETERIVNVPROC)glewGetProcAddress((const GLubyte*)"glVideoCaptureStreamParameterivNV")) == NULL) || r; return r; } #endif /* GL_NV_video_capture */ #ifdef GL_OES_byte_coordinates #endif /* GL_OES_byte_coordinates */ #ifdef GL_OES_compressed_paletted_texture #endif /* GL_OES_compressed_paletted_texture */ #ifdef GL_OES_read_format #endif /* GL_OES_read_format */ #ifdef GL_OES_single_precision static GLboolean _glewInit_GL_OES_single_precision (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glClearDepthfOES = (PFNGLCLEARDEPTHFOESPROC)glewGetProcAddress((const GLubyte*)"glClearDepthfOES")) == NULL) || r; r = ((glClipPlanefOES = (PFNGLCLIPPLANEFOESPROC)glewGetProcAddress((const GLubyte*)"glClipPlanefOES")) == NULL) || r; r = ((glDepthRangefOES = (PFNGLDEPTHRANGEFOESPROC)glewGetProcAddress((const GLubyte*)"glDepthRangefOES")) == NULL) || r; r = ((glFrustumfOES = (PFNGLFRUSTUMFOESPROC)glewGetProcAddress((const GLubyte*)"glFrustumfOES")) == NULL) || r; r = ((glGetClipPlanefOES = (PFNGLGETCLIPPLANEFOESPROC)glewGetProcAddress((const GLubyte*)"glGetClipPlanefOES")) == NULL) || r; r = ((glOrthofOES = (PFNGLORTHOFOESPROC)glewGetProcAddress((const GLubyte*)"glOrthofOES")) == NULL) || r; return r; } #endif /* GL_OES_single_precision */ #ifdef GL_OML_interlace #endif /* GL_OML_interlace */ #ifdef GL_OML_resample #endif /* GL_OML_resample */ #ifdef GL_OML_subsample #endif /* GL_OML_subsample */ #ifdef GL_PGI_misc_hints #endif /* GL_PGI_misc_hints */ #ifdef GL_PGI_vertex_hints #endif /* GL_PGI_vertex_hints */ #ifdef GL_REGAL_error_string static GLboolean _glewInit_GL_REGAL_error_string (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glErrorStringREGAL = (PFNGLERRORSTRINGREGALPROC)glewGetProcAddress((const GLubyte*)"glErrorStringREGAL")) == NULL) || r; return r; } #endif /* GL_REGAL_error_string */ #ifdef GL_REGAL_extension_query static GLboolean _glewInit_GL_REGAL_extension_query (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glGetExtensionREGAL = (PFNGLGETEXTENSIONREGALPROC)glewGetProcAddress((const GLubyte*)"glGetExtensionREGAL")) == NULL) || r; r = ((glIsSupportedREGAL = (PFNGLISSUPPORTEDREGALPROC)glewGetProcAddress((const GLubyte*)"glIsSupportedREGAL")) == NULL) || r; return r; } #endif /* GL_REGAL_extension_query */ #ifdef GL_REGAL_log #endif /* GL_REGAL_log */ #ifdef GL_REND_screen_coordinates #endif /* GL_REND_screen_coordinates */ #ifdef GL_S3_s3tc #endif /* GL_S3_s3tc */ #ifdef GL_SGIS_color_range #endif /* GL_SGIS_color_range */ #ifdef GL_SGIS_detail_texture static GLboolean _glewInit_GL_SGIS_detail_texture (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glDetailTexFuncSGIS = (PFNGLDETAILTEXFUNCSGISPROC)glewGetProcAddress((const GLubyte*)"glDetailTexFuncSGIS")) == NULL) || r; r = ((glGetDetailTexFuncSGIS = (PFNGLGETDETAILTEXFUNCSGISPROC)glewGetProcAddress((const GLubyte*)"glGetDetailTexFuncSGIS")) == NULL) || r; return r; } #endif /* GL_SGIS_detail_texture */ #ifdef GL_SGIS_fog_function static GLboolean _glewInit_GL_SGIS_fog_function (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glFogFuncSGIS = (PFNGLFOGFUNCSGISPROC)glewGetProcAddress((const GLubyte*)"glFogFuncSGIS")) == NULL) || r; r = ((glGetFogFuncSGIS = (PFNGLGETFOGFUNCSGISPROC)glewGetProcAddress((const GLubyte*)"glGetFogFuncSGIS")) == NULL) || r; return r; } #endif /* GL_SGIS_fog_function */ #ifdef GL_SGIS_generate_mipmap #endif /* GL_SGIS_generate_mipmap */ #ifdef GL_SGIS_multisample static GLboolean _glewInit_GL_SGIS_multisample (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glSampleMaskSGIS = (PFNGLSAMPLEMASKSGISPROC)glewGetProcAddress((const GLubyte*)"glSampleMaskSGIS")) == NULL) || r; r = ((glSamplePatternSGIS = (PFNGLSAMPLEPATTERNSGISPROC)glewGetProcAddress((const GLubyte*)"glSamplePatternSGIS")) == NULL) || r; return r; } #endif /* GL_SGIS_multisample */ #ifdef GL_SGIS_pixel_texture #endif /* GL_SGIS_pixel_texture */ #ifdef GL_SGIS_point_line_texgen #endif /* GL_SGIS_point_line_texgen */ #ifdef GL_SGIS_sharpen_texture static GLboolean _glewInit_GL_SGIS_sharpen_texture (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glGetSharpenTexFuncSGIS = (PFNGLGETSHARPENTEXFUNCSGISPROC)glewGetProcAddress((const GLubyte*)"glGetSharpenTexFuncSGIS")) == NULL) || r; r = ((glSharpenTexFuncSGIS = (PFNGLSHARPENTEXFUNCSGISPROC)glewGetProcAddress((const GLubyte*)"glSharpenTexFuncSGIS")) == NULL) || r; return r; } #endif /* GL_SGIS_sharpen_texture */ #ifdef GL_SGIS_texture4D static GLboolean _glewInit_GL_SGIS_texture4D (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glTexImage4DSGIS = (PFNGLTEXIMAGE4DSGISPROC)glewGetProcAddress((const GLubyte*)"glTexImage4DSGIS")) == NULL) || r; r = ((glTexSubImage4DSGIS = (PFNGLTEXSUBIMAGE4DSGISPROC)glewGetProcAddress((const GLubyte*)"glTexSubImage4DSGIS")) == NULL) || r; return r; } #endif /* GL_SGIS_texture4D */ #ifdef GL_SGIS_texture_border_clamp #endif /* GL_SGIS_texture_border_clamp */ #ifdef GL_SGIS_texture_edge_clamp #endif /* GL_SGIS_texture_edge_clamp */ #ifdef GL_SGIS_texture_filter4 static GLboolean _glewInit_GL_SGIS_texture_filter4 (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glGetTexFilterFuncSGIS = (PFNGLGETTEXFILTERFUNCSGISPROC)glewGetProcAddress((const GLubyte*)"glGetTexFilterFuncSGIS")) == NULL) || r; r = ((glTexFilterFuncSGIS = (PFNGLTEXFILTERFUNCSGISPROC)glewGetProcAddress((const GLubyte*)"glTexFilterFuncSGIS")) == NULL) || r; return r; } #endif /* GL_SGIS_texture_filter4 */ #ifdef GL_SGIS_texture_lod #endif /* GL_SGIS_texture_lod */ #ifdef GL_SGIS_texture_select #endif /* GL_SGIS_texture_select */ #ifdef GL_SGIX_async static GLboolean _glewInit_GL_SGIX_async (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glAsyncMarkerSGIX = (PFNGLASYNCMARKERSGIXPROC)glewGetProcAddress((const GLubyte*)"glAsyncMarkerSGIX")) == NULL) || r; r = ((glDeleteAsyncMarkersSGIX = (PFNGLDELETEASYNCMARKERSSGIXPROC)glewGetProcAddress((const GLubyte*)"glDeleteAsyncMarkersSGIX")) == NULL) || r; r = ((glFinishAsyncSGIX = (PFNGLFINISHASYNCSGIXPROC)glewGetProcAddress((const GLubyte*)"glFinishAsyncSGIX")) == NULL) || r; r = ((glGenAsyncMarkersSGIX = (PFNGLGENASYNCMARKERSSGIXPROC)glewGetProcAddress((const GLubyte*)"glGenAsyncMarkersSGIX")) == NULL) || r; r = ((glIsAsyncMarkerSGIX = (PFNGLISASYNCMARKERSGIXPROC)glewGetProcAddress((const GLubyte*)"glIsAsyncMarkerSGIX")) == NULL) || r; r = ((glPollAsyncSGIX = (PFNGLPOLLASYNCSGIXPROC)glewGetProcAddress((const GLubyte*)"glPollAsyncSGIX")) == NULL) || r; return r; } #endif /* GL_SGIX_async */ #ifdef GL_SGIX_async_histogram #endif /* GL_SGIX_async_histogram */ #ifdef GL_SGIX_async_pixel #endif /* GL_SGIX_async_pixel */ #ifdef GL_SGIX_blend_alpha_minmax #endif /* GL_SGIX_blend_alpha_minmax */ #ifdef GL_SGIX_clipmap #endif /* GL_SGIX_clipmap */ #ifdef GL_SGIX_convolution_accuracy #endif /* GL_SGIX_convolution_accuracy */ #ifdef GL_SGIX_depth_texture #endif /* GL_SGIX_depth_texture */ #ifdef GL_SGIX_flush_raster static GLboolean _glewInit_GL_SGIX_flush_raster (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glFlushRasterSGIX = (PFNGLFLUSHRASTERSGIXPROC)glewGetProcAddress((const GLubyte*)"glFlushRasterSGIX")) == NULL) || r; return r; } #endif /* GL_SGIX_flush_raster */ #ifdef GL_SGIX_fog_offset #endif /* GL_SGIX_fog_offset */ #ifdef GL_SGIX_fog_texture static GLboolean _glewInit_GL_SGIX_fog_texture (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glTextureFogSGIX = (PFNGLTEXTUREFOGSGIXPROC)glewGetProcAddress((const GLubyte*)"glTextureFogSGIX")) == NULL) || r; return r; } #endif /* GL_SGIX_fog_texture */ #ifdef GL_SGIX_fragment_specular_lighting static GLboolean _glewInit_GL_SGIX_fragment_specular_lighting (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glFragmentColorMaterialSGIX = (PFNGLFRAGMENTCOLORMATERIALSGIXPROC)glewGetProcAddress((const GLubyte*)"glFragmentColorMaterialSGIX")) == NULL) || r; r = ((glFragmentLightModelfSGIX = (PFNGLFRAGMENTLIGHTMODELFSGIXPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightModelfSGIX")) == NULL) || r; r = ((glFragmentLightModelfvSGIX = (PFNGLFRAGMENTLIGHTMODELFVSGIXPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightModelfvSGIX")) == NULL) || r; r = ((glFragmentLightModeliSGIX = (PFNGLFRAGMENTLIGHTMODELISGIXPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightModeliSGIX")) == NULL) || r; r = ((glFragmentLightModelivSGIX = (PFNGLFRAGMENTLIGHTMODELIVSGIXPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightModelivSGIX")) == NULL) || r; r = ((glFragmentLightfSGIX = (PFNGLFRAGMENTLIGHTFSGIXPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightfSGIX")) == NULL) || r; r = ((glFragmentLightfvSGIX = (PFNGLFRAGMENTLIGHTFVSGIXPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightfvSGIX")) == NULL) || r; r = ((glFragmentLightiSGIX = (PFNGLFRAGMENTLIGHTISGIXPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightiSGIX")) == NULL) || r; r = ((glFragmentLightivSGIX = (PFNGLFRAGMENTLIGHTIVSGIXPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightivSGIX")) == NULL) || r; r = ((glFragmentMaterialfSGIX = (PFNGLFRAGMENTMATERIALFSGIXPROC)glewGetProcAddress((const GLubyte*)"glFragmentMaterialfSGIX")) == NULL) || r; r = ((glFragmentMaterialfvSGIX = (PFNGLFRAGMENTMATERIALFVSGIXPROC)glewGetProcAddress((const GLubyte*)"glFragmentMaterialfvSGIX")) == NULL) || r; r = ((glFragmentMaterialiSGIX = (PFNGLFRAGMENTMATERIALISGIXPROC)glewGetProcAddress((const GLubyte*)"glFragmentMaterialiSGIX")) == NULL) || r; r = ((glFragmentMaterialivSGIX = (PFNGLFRAGMENTMATERIALIVSGIXPROC)glewGetProcAddress((const GLubyte*)"glFragmentMaterialivSGIX")) == NULL) || r; r = ((glGetFragmentLightfvSGIX = (PFNGLGETFRAGMENTLIGHTFVSGIXPROC)glewGetProcAddress((const GLubyte*)"glGetFragmentLightfvSGIX")) == NULL) || r; r = ((glGetFragmentLightivSGIX = (PFNGLGETFRAGMENTLIGHTIVSGIXPROC)glewGetProcAddress((const GLubyte*)"glGetFragmentLightivSGIX")) == NULL) || r; r = ((glGetFragmentMaterialfvSGIX = (PFNGLGETFRAGMENTMATERIALFVSGIXPROC)glewGetProcAddress((const GLubyte*)"glGetFragmentMaterialfvSGIX")) == NULL) || r; r = ((glGetFragmentMaterialivSGIX = (PFNGLGETFRAGMENTMATERIALIVSGIXPROC)glewGetProcAddress((const GLubyte*)"glGetFragmentMaterialivSGIX")) == NULL) || r; return r; } #endif /* GL_SGIX_fragment_specular_lighting */ #ifdef GL_SGIX_framezoom static GLboolean _glewInit_GL_SGIX_framezoom (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glFrameZoomSGIX = (PFNGLFRAMEZOOMSGIXPROC)glewGetProcAddress((const GLubyte*)"glFrameZoomSGIX")) == NULL) || r; return r; } #endif /* GL_SGIX_framezoom */ #ifdef GL_SGIX_interlace #endif /* GL_SGIX_interlace */ #ifdef GL_SGIX_ir_instrument1 #endif /* GL_SGIX_ir_instrument1 */ #ifdef GL_SGIX_list_priority #endif /* GL_SGIX_list_priority */ #ifdef GL_SGIX_pixel_texture static GLboolean _glewInit_GL_SGIX_pixel_texture (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glPixelTexGenSGIX = (PFNGLPIXELTEXGENSGIXPROC)glewGetProcAddress((const GLubyte*)"glPixelTexGenSGIX")) == NULL) || r; return r; } #endif /* GL_SGIX_pixel_texture */ #ifdef GL_SGIX_pixel_texture_bits #endif /* GL_SGIX_pixel_texture_bits */ #ifdef GL_SGIX_reference_plane static GLboolean _glewInit_GL_SGIX_reference_plane (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glReferencePlaneSGIX = (PFNGLREFERENCEPLANESGIXPROC)glewGetProcAddress((const GLubyte*)"glReferencePlaneSGIX")) == NULL) || r; return r; } #endif /* GL_SGIX_reference_plane */ #ifdef GL_SGIX_resample #endif /* GL_SGIX_resample */ #ifdef GL_SGIX_shadow #endif /* GL_SGIX_shadow */ #ifdef GL_SGIX_shadow_ambient #endif /* GL_SGIX_shadow_ambient */ #ifdef GL_SGIX_sprite static GLboolean _glewInit_GL_SGIX_sprite (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glSpriteParameterfSGIX = (PFNGLSPRITEPARAMETERFSGIXPROC)glewGetProcAddress((const GLubyte*)"glSpriteParameterfSGIX")) == NULL) || r; r = ((glSpriteParameterfvSGIX = (PFNGLSPRITEPARAMETERFVSGIXPROC)glewGetProcAddress((const GLubyte*)"glSpriteParameterfvSGIX")) == NULL) || r; r = ((glSpriteParameteriSGIX = (PFNGLSPRITEPARAMETERISGIXPROC)glewGetProcAddress((const GLubyte*)"glSpriteParameteriSGIX")) == NULL) || r; r = ((glSpriteParameterivSGIX = (PFNGLSPRITEPARAMETERIVSGIXPROC)glewGetProcAddress((const GLubyte*)"glSpriteParameterivSGIX")) == NULL) || r; return r; } #endif /* GL_SGIX_sprite */ #ifdef GL_SGIX_tag_sample_buffer static GLboolean _glewInit_GL_SGIX_tag_sample_buffer (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glTagSampleBufferSGIX = (PFNGLTAGSAMPLEBUFFERSGIXPROC)glewGetProcAddress((const GLubyte*)"glTagSampleBufferSGIX")) == NULL) || r; return r; } #endif /* GL_SGIX_tag_sample_buffer */ #ifdef GL_SGIX_texture_add_env #endif /* GL_SGIX_texture_add_env */ #ifdef GL_SGIX_texture_coordinate_clamp #endif /* GL_SGIX_texture_coordinate_clamp */ #ifdef GL_SGIX_texture_lod_bias #endif /* GL_SGIX_texture_lod_bias */ #ifdef GL_SGIX_texture_multi_buffer #endif /* GL_SGIX_texture_multi_buffer */ #ifdef GL_SGIX_texture_range #endif /* GL_SGIX_texture_range */ #ifdef GL_SGIX_texture_scale_bias #endif /* GL_SGIX_texture_scale_bias */ #ifdef GL_SGIX_vertex_preclip #endif /* GL_SGIX_vertex_preclip */ #ifdef GL_SGIX_vertex_preclip_hint #endif /* GL_SGIX_vertex_preclip_hint */ #ifdef GL_SGIX_ycrcb #endif /* GL_SGIX_ycrcb */ #ifdef GL_SGI_color_matrix #endif /* GL_SGI_color_matrix */ #ifdef GL_SGI_color_table static GLboolean _glewInit_GL_SGI_color_table (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glColorTableParameterfvSGI = (PFNGLCOLORTABLEPARAMETERFVSGIPROC)glewGetProcAddress((const GLubyte*)"glColorTableParameterfvSGI")) == NULL) || r; r = ((glColorTableParameterivSGI = (PFNGLCOLORTABLEPARAMETERIVSGIPROC)glewGetProcAddress((const GLubyte*)"glColorTableParameterivSGI")) == NULL) || r; r = ((glColorTableSGI = (PFNGLCOLORTABLESGIPROC)glewGetProcAddress((const GLubyte*)"glColorTableSGI")) == NULL) || r; r = ((glCopyColorTableSGI = (PFNGLCOPYCOLORTABLESGIPROC)glewGetProcAddress((const GLubyte*)"glCopyColorTableSGI")) == NULL) || r; r = ((glGetColorTableParameterfvSGI = (PFNGLGETCOLORTABLEPARAMETERFVSGIPROC)glewGetProcAddress((const GLubyte*)"glGetColorTableParameterfvSGI")) == NULL) || r; r = ((glGetColorTableParameterivSGI = (PFNGLGETCOLORTABLEPARAMETERIVSGIPROC)glewGetProcAddress((const GLubyte*)"glGetColorTableParameterivSGI")) == NULL) || r; r = ((glGetColorTableSGI = (PFNGLGETCOLORTABLESGIPROC)glewGetProcAddress((const GLubyte*)"glGetColorTableSGI")) == NULL) || r; return r; } #endif /* GL_SGI_color_table */ #ifdef GL_SGI_texture_color_table #endif /* GL_SGI_texture_color_table */ #ifdef GL_SUNX_constant_data static GLboolean _glewInit_GL_SUNX_constant_data (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glFinishTextureSUNX = (PFNGLFINISHTEXTURESUNXPROC)glewGetProcAddress((const GLubyte*)"glFinishTextureSUNX")) == NULL) || r; return r; } #endif /* GL_SUNX_constant_data */ #ifdef GL_SUN_convolution_border_modes #endif /* GL_SUN_convolution_border_modes */ #ifdef GL_SUN_global_alpha static GLboolean _glewInit_GL_SUN_global_alpha (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glGlobalAlphaFactorbSUN = (PFNGLGLOBALALPHAFACTORBSUNPROC)glewGetProcAddress((const GLubyte*)"glGlobalAlphaFactorbSUN")) == NULL) || r; r = ((glGlobalAlphaFactordSUN = (PFNGLGLOBALALPHAFACTORDSUNPROC)glewGetProcAddress((const GLubyte*)"glGlobalAlphaFactordSUN")) == NULL) || r; r = ((glGlobalAlphaFactorfSUN = (PFNGLGLOBALALPHAFACTORFSUNPROC)glewGetProcAddress((const GLubyte*)"glGlobalAlphaFactorfSUN")) == NULL) || r; r = ((glGlobalAlphaFactoriSUN = (PFNGLGLOBALALPHAFACTORISUNPROC)glewGetProcAddress((const GLubyte*)"glGlobalAlphaFactoriSUN")) == NULL) || r; r = ((glGlobalAlphaFactorsSUN = (PFNGLGLOBALALPHAFACTORSSUNPROC)glewGetProcAddress((const GLubyte*)"glGlobalAlphaFactorsSUN")) == NULL) || r; r = ((glGlobalAlphaFactorubSUN = (PFNGLGLOBALALPHAFACTORUBSUNPROC)glewGetProcAddress((const GLubyte*)"glGlobalAlphaFactorubSUN")) == NULL) || r; r = ((glGlobalAlphaFactoruiSUN = (PFNGLGLOBALALPHAFACTORUISUNPROC)glewGetProcAddress((const GLubyte*)"glGlobalAlphaFactoruiSUN")) == NULL) || r; r = ((glGlobalAlphaFactorusSUN = (PFNGLGLOBALALPHAFACTORUSSUNPROC)glewGetProcAddress((const GLubyte*)"glGlobalAlphaFactorusSUN")) == NULL) || r; return r; } #endif /* GL_SUN_global_alpha */ #ifdef GL_SUN_mesh_array #endif /* GL_SUN_mesh_array */ #ifdef GL_SUN_read_video_pixels static GLboolean _glewInit_GL_SUN_read_video_pixels (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glReadVideoPixelsSUN = (PFNGLREADVIDEOPIXELSSUNPROC)glewGetProcAddress((const GLubyte*)"glReadVideoPixelsSUN")) == NULL) || r; return r; } #endif /* GL_SUN_read_video_pixels */ #ifdef GL_SUN_slice_accum #endif /* GL_SUN_slice_accum */ #ifdef GL_SUN_triangle_list static GLboolean _glewInit_GL_SUN_triangle_list (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glReplacementCodePointerSUN = (PFNGLREPLACEMENTCODEPOINTERSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodePointerSUN")) == NULL) || r; r = ((glReplacementCodeubSUN = (PFNGLREPLACEMENTCODEUBSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeubSUN")) == NULL) || r; r = ((glReplacementCodeubvSUN = (PFNGLREPLACEMENTCODEUBVSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeubvSUN")) == NULL) || r; r = ((glReplacementCodeuiSUN = (PFNGLREPLACEMENTCODEUISUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiSUN")) == NULL) || r; r = ((glReplacementCodeuivSUN = (PFNGLREPLACEMENTCODEUIVSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuivSUN")) == NULL) || r; r = ((glReplacementCodeusSUN = (PFNGLREPLACEMENTCODEUSSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeusSUN")) == NULL) || r; r = ((glReplacementCodeusvSUN = (PFNGLREPLACEMENTCODEUSVSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeusvSUN")) == NULL) || r; return r; } #endif /* GL_SUN_triangle_list */ #ifdef GL_SUN_vertex static GLboolean _glewInit_GL_SUN_vertex (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glColor3fVertex3fSUN = (PFNGLCOLOR3FVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glColor3fVertex3fSUN")) == NULL) || r; r = ((glColor3fVertex3fvSUN = (PFNGLCOLOR3FVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glColor3fVertex3fvSUN")) == NULL) || r; r = ((glColor4fNormal3fVertex3fSUN = (PFNGLCOLOR4FNORMAL3FVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glColor4fNormal3fVertex3fSUN")) == NULL) || r; r = ((glColor4fNormal3fVertex3fvSUN = (PFNGLCOLOR4FNORMAL3FVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glColor4fNormal3fVertex3fvSUN")) == NULL) || r; r = ((glColor4ubVertex2fSUN = (PFNGLCOLOR4UBVERTEX2FSUNPROC)glewGetProcAddress((const GLubyte*)"glColor4ubVertex2fSUN")) == NULL) || r; r = ((glColor4ubVertex2fvSUN = (PFNGLCOLOR4UBVERTEX2FVSUNPROC)glewGetProcAddress((const GLubyte*)"glColor4ubVertex2fvSUN")) == NULL) || r; r = ((glColor4ubVertex3fSUN = (PFNGLCOLOR4UBVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glColor4ubVertex3fSUN")) == NULL) || r; r = ((glColor4ubVertex3fvSUN = (PFNGLCOLOR4UBVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glColor4ubVertex3fvSUN")) == NULL) || r; r = ((glNormal3fVertex3fSUN = (PFNGLNORMAL3FVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glNormal3fVertex3fSUN")) == NULL) || r; r = ((glNormal3fVertex3fvSUN = (PFNGLNORMAL3FVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glNormal3fVertex3fvSUN")) == NULL) || r; r = ((glReplacementCodeuiColor3fVertex3fSUN = (PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiColor3fVertex3fSUN")) == NULL) || r; r = ((glReplacementCodeuiColor3fVertex3fvSUN = (PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiColor3fVertex3fvSUN")) == NULL) || r; r = ((glReplacementCodeuiColor4fNormal3fVertex3fSUN = (PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiColor4fNormal3fVertex3fSUN")) == NULL) || r; r = ((glReplacementCodeuiColor4fNormal3fVertex3fvSUN = (PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiColor4fNormal3fVertex3fvSUN")) == NULL) || r; r = ((glReplacementCodeuiColor4ubVertex3fSUN = (PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiColor4ubVertex3fSUN")) == NULL) || r; r = ((glReplacementCodeuiColor4ubVertex3fvSUN = (PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiColor4ubVertex3fvSUN")) == NULL) || r; r = ((glReplacementCodeuiNormal3fVertex3fSUN = (PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiNormal3fVertex3fSUN")) == NULL) || r; r = ((glReplacementCodeuiNormal3fVertex3fvSUN = (PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiNormal3fVertex3fvSUN")) == NULL) || r; r = ((glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN = (PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN")) == NULL) || r; r = ((glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN = (PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN")) == NULL) || r; r = ((glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN = (PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN")) == NULL) || r; r = ((glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN = (PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN")) == NULL) || r; r = ((glReplacementCodeuiTexCoord2fVertex3fSUN = (PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiTexCoord2fVertex3fSUN")) == NULL) || r; r = ((glReplacementCodeuiTexCoord2fVertex3fvSUN = (PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiTexCoord2fVertex3fvSUN")) == NULL) || r; r = ((glReplacementCodeuiVertex3fSUN = (PFNGLREPLACEMENTCODEUIVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiVertex3fSUN")) == NULL) || r; r = ((glReplacementCodeuiVertex3fvSUN = (PFNGLREPLACEMENTCODEUIVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiVertex3fvSUN")) == NULL) || r; r = ((glTexCoord2fColor3fVertex3fSUN = (PFNGLTEXCOORD2FCOLOR3FVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glTexCoord2fColor3fVertex3fSUN")) == NULL) || r; r = ((glTexCoord2fColor3fVertex3fvSUN = (PFNGLTEXCOORD2FCOLOR3FVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glTexCoord2fColor3fVertex3fvSUN")) == NULL) || r; r = ((glTexCoord2fColor4fNormal3fVertex3fSUN = (PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glTexCoord2fColor4fNormal3fVertex3fSUN")) == NULL) || r; r = ((glTexCoord2fColor4fNormal3fVertex3fvSUN = (PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glTexCoord2fColor4fNormal3fVertex3fvSUN")) == NULL) || r; r = ((glTexCoord2fColor4ubVertex3fSUN = (PFNGLTEXCOORD2FCOLOR4UBVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glTexCoord2fColor4ubVertex3fSUN")) == NULL) || r; r = ((glTexCoord2fColor4ubVertex3fvSUN = (PFNGLTEXCOORD2FCOLOR4UBVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glTexCoord2fColor4ubVertex3fvSUN")) == NULL) || r; r = ((glTexCoord2fNormal3fVertex3fSUN = (PFNGLTEXCOORD2FNORMAL3FVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glTexCoord2fNormal3fVertex3fSUN")) == NULL) || r; r = ((glTexCoord2fNormal3fVertex3fvSUN = (PFNGLTEXCOORD2FNORMAL3FVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glTexCoord2fNormal3fVertex3fvSUN")) == NULL) || r; r = ((glTexCoord2fVertex3fSUN = (PFNGLTEXCOORD2FVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glTexCoord2fVertex3fSUN")) == NULL) || r; r = ((glTexCoord2fVertex3fvSUN = (PFNGLTEXCOORD2FVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glTexCoord2fVertex3fvSUN")) == NULL) || r; r = ((glTexCoord4fColor4fNormal3fVertex4fSUN = (PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FSUNPROC)glewGetProcAddress((const GLubyte*)"glTexCoord4fColor4fNormal3fVertex4fSUN")) == NULL) || r; r = ((glTexCoord4fColor4fNormal3fVertex4fvSUN = (PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FVSUNPROC)glewGetProcAddress((const GLubyte*)"glTexCoord4fColor4fNormal3fVertex4fvSUN")) == NULL) || r; r = ((glTexCoord4fVertex4fSUN = (PFNGLTEXCOORD4FVERTEX4FSUNPROC)glewGetProcAddress((const GLubyte*)"glTexCoord4fVertex4fSUN")) == NULL) || r; r = ((glTexCoord4fVertex4fvSUN = (PFNGLTEXCOORD4FVERTEX4FVSUNPROC)glewGetProcAddress((const GLubyte*)"glTexCoord4fVertex4fvSUN")) == NULL) || r; return r; } #endif /* GL_SUN_vertex */ #ifdef GL_WIN_phong_shading #endif /* GL_WIN_phong_shading */ #ifdef GL_WIN_specular_fog #endif /* GL_WIN_specular_fog */ #ifdef GL_WIN_swap_hint static GLboolean _glewInit_GL_WIN_swap_hint (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glAddSwapHintRectWIN = (PFNGLADDSWAPHINTRECTWINPROC)glewGetProcAddress((const GLubyte*)"glAddSwapHintRectWIN")) == NULL) || r; return r; } #endif /* GL_WIN_swap_hint */ /* ------------------------------------------------------------------------- */ GLboolean GLEWAPIENTRY glewGetExtension (const char* name) { const GLubyte* start; const GLubyte* end; start = (const GLubyte*)glGetString(GL_EXTENSIONS); if (start == 0) return GL_FALSE; end = start + _glewStrLen(start); return _glewSearchExtension(name, start, end); } /* ------------------------------------------------------------------------- */ #ifndef GLEW_MX static #endif GLenum GLEWAPIENTRY glewContextInit (GLEW_CONTEXT_ARG_DEF_LIST) { const GLubyte* s; GLuint dot; GLint major, minor; const GLubyte* extStart; const GLubyte* extEnd; /* query opengl version */ s = glGetString(GL_VERSION); dot = _glewStrCLen(s, '.'); if (dot == 0) return GLEW_ERROR_NO_GL_VERSION; major = s[dot-1]-'0'; minor = s[dot+1]-'0'; if (minor < 0 || minor > 9) minor = 0; if (major<0 || major>9) return GLEW_ERROR_NO_GL_VERSION; if (major == 1 && minor == 0) { return GLEW_ERROR_GL_VERSION_10_ONLY; } else { CONST_CAST(GLEW_VERSION_4_3) = ( major > 4 ) || ( major == 4 && minor >= 3 ) ? GL_TRUE : GL_FALSE; CONST_CAST(GLEW_VERSION_4_2) = GLEW_VERSION_4_3 == GL_TRUE || ( major == 4 && minor >= 2 ) ? GL_TRUE : GL_FALSE; CONST_CAST(GLEW_VERSION_4_1) = GLEW_VERSION_4_2 == GL_TRUE || ( major == 4 && minor >= 1 ) ? GL_TRUE : GL_FALSE; CONST_CAST(GLEW_VERSION_4_0) = GLEW_VERSION_4_1 == GL_TRUE || ( major == 4 ) ? GL_TRUE : GL_FALSE; CONST_CAST(GLEW_VERSION_3_3) = GLEW_VERSION_4_0 == GL_TRUE || ( major == 3 && minor >= 3 ) ? GL_TRUE : GL_FALSE; CONST_CAST(GLEW_VERSION_3_2) = GLEW_VERSION_3_3 == GL_TRUE || ( major == 3 && minor >= 2 ) ? GL_TRUE : GL_FALSE; CONST_CAST(GLEW_VERSION_3_1) = GLEW_VERSION_3_2 == GL_TRUE || ( major == 3 && minor >= 1 ) ? GL_TRUE : GL_FALSE; CONST_CAST(GLEW_VERSION_3_0) = GLEW_VERSION_3_1 == GL_TRUE || ( major == 3 ) ? GL_TRUE : GL_FALSE; CONST_CAST(GLEW_VERSION_2_1) = GLEW_VERSION_3_0 == GL_TRUE || ( major == 2 && minor >= 1 ) ? GL_TRUE : GL_FALSE; CONST_CAST(GLEW_VERSION_2_0) = GLEW_VERSION_2_1 == GL_TRUE || ( major == 2 ) ? GL_TRUE : GL_FALSE; CONST_CAST(GLEW_VERSION_1_5) = GLEW_VERSION_2_0 == GL_TRUE || ( major == 1 && minor >= 5 ) ? GL_TRUE : GL_FALSE; CONST_CAST(GLEW_VERSION_1_4) = GLEW_VERSION_1_5 == GL_TRUE || ( major == 1 && minor >= 4 ) ? GL_TRUE : GL_FALSE; CONST_CAST(GLEW_VERSION_1_3) = GLEW_VERSION_1_4 == GL_TRUE || ( major == 1 && minor >= 3 ) ? GL_TRUE : GL_FALSE; CONST_CAST(GLEW_VERSION_1_2_1) = GLEW_VERSION_1_3 == GL_TRUE ? GL_TRUE : GL_FALSE; CONST_CAST(GLEW_VERSION_1_2) = GLEW_VERSION_1_2_1 == GL_TRUE || ( major == 1 && minor >= 2 ) ? GL_TRUE : GL_FALSE; CONST_CAST(GLEW_VERSION_1_1) = GLEW_VERSION_1_2 == GL_TRUE || ( major == 1 && minor >= 1 ) ? GL_TRUE : GL_FALSE; } /* query opengl extensions string */ extStart = glGetString(GL_EXTENSIONS); if (extStart == 0) extStart = (const GLubyte*)""; extEnd = extStart + _glewStrLen(extStart); /* initialize extensions */ #ifdef GL_VERSION_1_2 if (glewExperimental || GLEW_VERSION_1_2) CONST_CAST(GLEW_VERSION_1_2) = !_glewInit_GL_VERSION_1_2(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_VERSION_1_2 */ #ifdef GL_VERSION_1_2_1 #endif /* GL_VERSION_1_2_1 */ #ifdef GL_VERSION_1_3 if (glewExperimental || GLEW_VERSION_1_3) CONST_CAST(GLEW_VERSION_1_3) = !_glewInit_GL_VERSION_1_3(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_VERSION_1_3 */ #ifdef GL_VERSION_1_4 if (glewExperimental || GLEW_VERSION_1_4) CONST_CAST(GLEW_VERSION_1_4) = !_glewInit_GL_VERSION_1_4(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_VERSION_1_4 */ #ifdef GL_VERSION_1_5 if (glewExperimental || GLEW_VERSION_1_5) CONST_CAST(GLEW_VERSION_1_5) = !_glewInit_GL_VERSION_1_5(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_VERSION_1_5 */ #ifdef GL_VERSION_2_0 if (glewExperimental || GLEW_VERSION_2_0) CONST_CAST(GLEW_VERSION_2_0) = !_glewInit_GL_VERSION_2_0(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_VERSION_2_0 */ #ifdef GL_VERSION_2_1 if (glewExperimental || GLEW_VERSION_2_1) CONST_CAST(GLEW_VERSION_2_1) = !_glewInit_GL_VERSION_2_1(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_VERSION_2_1 */ #ifdef GL_VERSION_3_0 if (glewExperimental || GLEW_VERSION_3_0) CONST_CAST(GLEW_VERSION_3_0) = !_glewInit_GL_VERSION_3_0(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_VERSION_3_0 */ #ifdef GL_VERSION_3_1 if (glewExperimental || GLEW_VERSION_3_1) CONST_CAST(GLEW_VERSION_3_1) = !_glewInit_GL_VERSION_3_1(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_VERSION_3_1 */ #ifdef GL_VERSION_3_2 if (glewExperimental || GLEW_VERSION_3_2) CONST_CAST(GLEW_VERSION_3_2) = !_glewInit_GL_VERSION_3_2(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_VERSION_3_2 */ #ifdef GL_VERSION_3_3 if (glewExperimental || GLEW_VERSION_3_3) CONST_CAST(GLEW_VERSION_3_3) = !_glewInit_GL_VERSION_3_3(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_VERSION_3_3 */ #ifdef GL_VERSION_4_0 if (glewExperimental || GLEW_VERSION_4_0) CONST_CAST(GLEW_VERSION_4_0) = !_glewInit_GL_VERSION_4_0(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_VERSION_4_0 */ #ifdef GL_VERSION_4_1 #endif /* GL_VERSION_4_1 */ #ifdef GL_VERSION_4_2 #endif /* GL_VERSION_4_2 */ #ifdef GL_VERSION_4_3 #endif /* GL_VERSION_4_3 */ #ifdef GL_3DFX_multisample CONST_CAST(GLEW_3DFX_multisample) = _glewSearchExtension("GL_3DFX_multisample", extStart, extEnd); #endif /* GL_3DFX_multisample */ #ifdef GL_3DFX_tbuffer CONST_CAST(GLEW_3DFX_tbuffer) = _glewSearchExtension("GL_3DFX_tbuffer", extStart, extEnd); if (glewExperimental || GLEW_3DFX_tbuffer) CONST_CAST(GLEW_3DFX_tbuffer) = !_glewInit_GL_3DFX_tbuffer(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_3DFX_tbuffer */ #ifdef GL_3DFX_texture_compression_FXT1 CONST_CAST(GLEW_3DFX_texture_compression_FXT1) = _glewSearchExtension("GL_3DFX_texture_compression_FXT1", extStart, extEnd); #endif /* GL_3DFX_texture_compression_FXT1 */ #ifdef GL_AMD_blend_minmax_factor CONST_CAST(GLEW_AMD_blend_minmax_factor) = _glewSearchExtension("GL_AMD_blend_minmax_factor", extStart, extEnd); #endif /* GL_AMD_blend_minmax_factor */ #ifdef GL_AMD_conservative_depth CONST_CAST(GLEW_AMD_conservative_depth) = _glewSearchExtension("GL_AMD_conservative_depth", extStart, extEnd); #endif /* GL_AMD_conservative_depth */ #ifdef GL_AMD_debug_output CONST_CAST(GLEW_AMD_debug_output) = _glewSearchExtension("GL_AMD_debug_output", extStart, extEnd); if (glewExperimental || GLEW_AMD_debug_output) CONST_CAST(GLEW_AMD_debug_output) = !_glewInit_GL_AMD_debug_output(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_AMD_debug_output */ #ifdef GL_AMD_depth_clamp_separate CONST_CAST(GLEW_AMD_depth_clamp_separate) = _glewSearchExtension("GL_AMD_depth_clamp_separate", extStart, extEnd); #endif /* GL_AMD_depth_clamp_separate */ #ifdef GL_AMD_draw_buffers_blend CONST_CAST(GLEW_AMD_draw_buffers_blend) = _glewSearchExtension("GL_AMD_draw_buffers_blend", extStart, extEnd); if (glewExperimental || GLEW_AMD_draw_buffers_blend) CONST_CAST(GLEW_AMD_draw_buffers_blend) = !_glewInit_GL_AMD_draw_buffers_blend(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_AMD_draw_buffers_blend */ #ifdef GL_AMD_multi_draw_indirect CONST_CAST(GLEW_AMD_multi_draw_indirect) = _glewSearchExtension("GL_AMD_multi_draw_indirect", extStart, extEnd); if (glewExperimental || GLEW_AMD_multi_draw_indirect) CONST_CAST(GLEW_AMD_multi_draw_indirect) = !_glewInit_GL_AMD_multi_draw_indirect(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_AMD_multi_draw_indirect */ #ifdef GL_AMD_name_gen_delete CONST_CAST(GLEW_AMD_name_gen_delete) = _glewSearchExtension("GL_AMD_name_gen_delete", extStart, extEnd); if (glewExperimental || GLEW_AMD_name_gen_delete) CONST_CAST(GLEW_AMD_name_gen_delete) = !_glewInit_GL_AMD_name_gen_delete(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_AMD_name_gen_delete */ #ifdef GL_AMD_performance_monitor CONST_CAST(GLEW_AMD_performance_monitor) = _glewSearchExtension("GL_AMD_performance_monitor", extStart, extEnd); if (glewExperimental || GLEW_AMD_performance_monitor) CONST_CAST(GLEW_AMD_performance_monitor) = !_glewInit_GL_AMD_performance_monitor(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_AMD_performance_monitor */ #ifdef GL_AMD_pinned_memory CONST_CAST(GLEW_AMD_pinned_memory) = _glewSearchExtension("GL_AMD_pinned_memory", extStart, extEnd); #endif /* GL_AMD_pinned_memory */ #ifdef GL_AMD_query_buffer_object CONST_CAST(GLEW_AMD_query_buffer_object) = _glewSearchExtension("GL_AMD_query_buffer_object", extStart, extEnd); #endif /* GL_AMD_query_buffer_object */ #ifdef GL_AMD_sample_positions CONST_CAST(GLEW_AMD_sample_positions) = _glewSearchExtension("GL_AMD_sample_positions", extStart, extEnd); if (glewExperimental || GLEW_AMD_sample_positions) CONST_CAST(GLEW_AMD_sample_positions) = !_glewInit_GL_AMD_sample_positions(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_AMD_sample_positions */ #ifdef GL_AMD_seamless_cubemap_per_texture CONST_CAST(GLEW_AMD_seamless_cubemap_per_texture) = _glewSearchExtension("GL_AMD_seamless_cubemap_per_texture", extStart, extEnd); #endif /* GL_AMD_seamless_cubemap_per_texture */ #ifdef GL_AMD_shader_stencil_export CONST_CAST(GLEW_AMD_shader_stencil_export) = _glewSearchExtension("GL_AMD_shader_stencil_export", extStart, extEnd); #endif /* GL_AMD_shader_stencil_export */ #ifdef GL_AMD_stencil_operation_extended CONST_CAST(GLEW_AMD_stencil_operation_extended) = _glewSearchExtension("GL_AMD_stencil_operation_extended", extStart, extEnd); if (glewExperimental || GLEW_AMD_stencil_operation_extended) CONST_CAST(GLEW_AMD_stencil_operation_extended) = !_glewInit_GL_AMD_stencil_operation_extended(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_AMD_stencil_operation_extended */ #ifdef GL_AMD_texture_texture4 CONST_CAST(GLEW_AMD_texture_texture4) = _glewSearchExtension("GL_AMD_texture_texture4", extStart, extEnd); #endif /* GL_AMD_texture_texture4 */ #ifdef GL_AMD_transform_feedback3_lines_triangles CONST_CAST(GLEW_AMD_transform_feedback3_lines_triangles) = _glewSearchExtension("GL_AMD_transform_feedback3_lines_triangles", extStart, extEnd); #endif /* GL_AMD_transform_feedback3_lines_triangles */ #ifdef GL_AMD_vertex_shader_layer CONST_CAST(GLEW_AMD_vertex_shader_layer) = _glewSearchExtension("GL_AMD_vertex_shader_layer", extStart, extEnd); #endif /* GL_AMD_vertex_shader_layer */ #ifdef GL_AMD_vertex_shader_tessellator CONST_CAST(GLEW_AMD_vertex_shader_tessellator) = _glewSearchExtension("GL_AMD_vertex_shader_tessellator", extStart, extEnd); if (glewExperimental || GLEW_AMD_vertex_shader_tessellator) CONST_CAST(GLEW_AMD_vertex_shader_tessellator) = !_glewInit_GL_AMD_vertex_shader_tessellator(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_AMD_vertex_shader_tessellator */ #ifdef GL_AMD_vertex_shader_viewport_index CONST_CAST(GLEW_AMD_vertex_shader_viewport_index) = _glewSearchExtension("GL_AMD_vertex_shader_viewport_index", extStart, extEnd); #endif /* GL_AMD_vertex_shader_viewport_index */ #ifdef GL_APPLE_aux_depth_stencil CONST_CAST(GLEW_APPLE_aux_depth_stencil) = _glewSearchExtension("GL_APPLE_aux_depth_stencil", extStart, extEnd); #endif /* GL_APPLE_aux_depth_stencil */ #ifdef GL_APPLE_client_storage CONST_CAST(GLEW_APPLE_client_storage) = _glewSearchExtension("GL_APPLE_client_storage", extStart, extEnd); #endif /* GL_APPLE_client_storage */ #ifdef GL_APPLE_element_array CONST_CAST(GLEW_APPLE_element_array) = _glewSearchExtension("GL_APPLE_element_array", extStart, extEnd); if (glewExperimental || GLEW_APPLE_element_array) CONST_CAST(GLEW_APPLE_element_array) = !_glewInit_GL_APPLE_element_array(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_APPLE_element_array */ #ifdef GL_APPLE_fence CONST_CAST(GLEW_APPLE_fence) = _glewSearchExtension("GL_APPLE_fence", extStart, extEnd); if (glewExperimental || GLEW_APPLE_fence) CONST_CAST(GLEW_APPLE_fence) = !_glewInit_GL_APPLE_fence(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_APPLE_fence */ #ifdef GL_APPLE_float_pixels CONST_CAST(GLEW_APPLE_float_pixels) = _glewSearchExtension("GL_APPLE_float_pixels", extStart, extEnd); #endif /* GL_APPLE_float_pixels */ #ifdef GL_APPLE_flush_buffer_range CONST_CAST(GLEW_APPLE_flush_buffer_range) = _glewSearchExtension("GL_APPLE_flush_buffer_range", extStart, extEnd); if (glewExperimental || GLEW_APPLE_flush_buffer_range) CONST_CAST(GLEW_APPLE_flush_buffer_range) = !_glewInit_GL_APPLE_flush_buffer_range(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_APPLE_flush_buffer_range */ #ifdef GL_APPLE_object_purgeable CONST_CAST(GLEW_APPLE_object_purgeable) = _glewSearchExtension("GL_APPLE_object_purgeable", extStart, extEnd); if (glewExperimental || GLEW_APPLE_object_purgeable) CONST_CAST(GLEW_APPLE_object_purgeable) = !_glewInit_GL_APPLE_object_purgeable(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_APPLE_object_purgeable */ #ifdef GL_APPLE_pixel_buffer CONST_CAST(GLEW_APPLE_pixel_buffer) = _glewSearchExtension("GL_APPLE_pixel_buffer", extStart, extEnd); #endif /* GL_APPLE_pixel_buffer */ #ifdef GL_APPLE_rgb_422 CONST_CAST(GLEW_APPLE_rgb_422) = _glewSearchExtension("GL_APPLE_rgb_422", extStart, extEnd); #endif /* GL_APPLE_rgb_422 */ #ifdef GL_APPLE_row_bytes CONST_CAST(GLEW_APPLE_row_bytes) = _glewSearchExtension("GL_APPLE_row_bytes", extStart, extEnd); #endif /* GL_APPLE_row_bytes */ #ifdef GL_APPLE_specular_vector CONST_CAST(GLEW_APPLE_specular_vector) = _glewSearchExtension("GL_APPLE_specular_vector", extStart, extEnd); #endif /* GL_APPLE_specular_vector */ #ifdef GL_APPLE_texture_range CONST_CAST(GLEW_APPLE_texture_range) = _glewSearchExtension("GL_APPLE_texture_range", extStart, extEnd); if (glewExperimental || GLEW_APPLE_texture_range) CONST_CAST(GLEW_APPLE_texture_range) = !_glewInit_GL_APPLE_texture_range(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_APPLE_texture_range */ #ifdef GL_APPLE_transform_hint CONST_CAST(GLEW_APPLE_transform_hint) = _glewSearchExtension("GL_APPLE_transform_hint", extStart, extEnd); #endif /* GL_APPLE_transform_hint */ #ifdef GL_APPLE_vertex_array_object CONST_CAST(GLEW_APPLE_vertex_array_object) = _glewSearchExtension("GL_APPLE_vertex_array_object", extStart, extEnd); if (glewExperimental || GLEW_APPLE_vertex_array_object) CONST_CAST(GLEW_APPLE_vertex_array_object) = !_glewInit_GL_APPLE_vertex_array_object(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_APPLE_vertex_array_object */ #ifdef GL_APPLE_vertex_array_range CONST_CAST(GLEW_APPLE_vertex_array_range) = _glewSearchExtension("GL_APPLE_vertex_array_range", extStart, extEnd); if (glewExperimental || GLEW_APPLE_vertex_array_range) CONST_CAST(GLEW_APPLE_vertex_array_range) = !_glewInit_GL_APPLE_vertex_array_range(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_APPLE_vertex_array_range */ #ifdef GL_APPLE_vertex_program_evaluators CONST_CAST(GLEW_APPLE_vertex_program_evaluators) = _glewSearchExtension("GL_APPLE_vertex_program_evaluators", extStart, extEnd); if (glewExperimental || GLEW_APPLE_vertex_program_evaluators) CONST_CAST(GLEW_APPLE_vertex_program_evaluators) = !_glewInit_GL_APPLE_vertex_program_evaluators(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_APPLE_vertex_program_evaluators */ #ifdef GL_APPLE_ycbcr_422 CONST_CAST(GLEW_APPLE_ycbcr_422) = _glewSearchExtension("GL_APPLE_ycbcr_422", extStart, extEnd); #endif /* GL_APPLE_ycbcr_422 */ #ifdef GL_ARB_ES2_compatibility CONST_CAST(GLEW_ARB_ES2_compatibility) = _glewSearchExtension("GL_ARB_ES2_compatibility", extStart, extEnd); if (glewExperimental || GLEW_ARB_ES2_compatibility) CONST_CAST(GLEW_ARB_ES2_compatibility) = !_glewInit_GL_ARB_ES2_compatibility(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_ES2_compatibility */ #ifdef GL_ARB_ES3_compatibility CONST_CAST(GLEW_ARB_ES3_compatibility) = _glewSearchExtension("GL_ARB_ES3_compatibility", extStart, extEnd); #endif /* GL_ARB_ES3_compatibility */ #ifdef GL_ARB_arrays_of_arrays CONST_CAST(GLEW_ARB_arrays_of_arrays) = _glewSearchExtension("GL_ARB_arrays_of_arrays", extStart, extEnd); #endif /* GL_ARB_arrays_of_arrays */ #ifdef GL_ARB_base_instance CONST_CAST(GLEW_ARB_base_instance) = _glewSearchExtension("GL_ARB_base_instance", extStart, extEnd); if (glewExperimental || GLEW_ARB_base_instance) CONST_CAST(GLEW_ARB_base_instance) = !_glewInit_GL_ARB_base_instance(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_base_instance */ #ifdef GL_ARB_blend_func_extended CONST_CAST(GLEW_ARB_blend_func_extended) = _glewSearchExtension("GL_ARB_blend_func_extended", extStart, extEnd); if (glewExperimental || GLEW_ARB_blend_func_extended) CONST_CAST(GLEW_ARB_blend_func_extended) = !_glewInit_GL_ARB_blend_func_extended(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_blend_func_extended */ #ifdef GL_ARB_cl_event CONST_CAST(GLEW_ARB_cl_event) = _glewSearchExtension("GL_ARB_cl_event", extStart, extEnd); if (glewExperimental || GLEW_ARB_cl_event) CONST_CAST(GLEW_ARB_cl_event) = !_glewInit_GL_ARB_cl_event(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_cl_event */ #ifdef GL_ARB_clear_buffer_object CONST_CAST(GLEW_ARB_clear_buffer_object) = _glewSearchExtension("GL_ARB_clear_buffer_object", extStart, extEnd); if (glewExperimental || GLEW_ARB_clear_buffer_object) CONST_CAST(GLEW_ARB_clear_buffer_object) = !_glewInit_GL_ARB_clear_buffer_object(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_clear_buffer_object */ #ifdef GL_ARB_color_buffer_float CONST_CAST(GLEW_ARB_color_buffer_float) = _glewSearchExtension("GL_ARB_color_buffer_float", extStart, extEnd); if (glewExperimental || GLEW_ARB_color_buffer_float) CONST_CAST(GLEW_ARB_color_buffer_float) = !_glewInit_GL_ARB_color_buffer_float(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_color_buffer_float */ #ifdef GL_ARB_compatibility CONST_CAST(GLEW_ARB_compatibility) = _glewSearchExtension("GL_ARB_compatibility", extStart, extEnd); #endif /* GL_ARB_compatibility */ #ifdef GL_ARB_compressed_texture_pixel_storage CONST_CAST(GLEW_ARB_compressed_texture_pixel_storage) = _glewSearchExtension("GL_ARB_compressed_texture_pixel_storage", extStart, extEnd); #endif /* GL_ARB_compressed_texture_pixel_storage */ #ifdef GL_ARB_compute_shader CONST_CAST(GLEW_ARB_compute_shader) = _glewSearchExtension("GL_ARB_compute_shader", extStart, extEnd); if (glewExperimental || GLEW_ARB_compute_shader) CONST_CAST(GLEW_ARB_compute_shader) = !_glewInit_GL_ARB_compute_shader(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_compute_shader */ #ifdef GL_ARB_conservative_depth CONST_CAST(GLEW_ARB_conservative_depth) = _glewSearchExtension("GL_ARB_conservative_depth", extStart, extEnd); #endif /* GL_ARB_conservative_depth */ #ifdef GL_ARB_copy_buffer CONST_CAST(GLEW_ARB_copy_buffer) = _glewSearchExtension("GL_ARB_copy_buffer", extStart, extEnd); if (glewExperimental || GLEW_ARB_copy_buffer) CONST_CAST(GLEW_ARB_copy_buffer) = !_glewInit_GL_ARB_copy_buffer(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_copy_buffer */ #ifdef GL_ARB_copy_image CONST_CAST(GLEW_ARB_copy_image) = _glewSearchExtension("GL_ARB_copy_image", extStart, extEnd); if (glewExperimental || GLEW_ARB_copy_image) CONST_CAST(GLEW_ARB_copy_image) = !_glewInit_GL_ARB_copy_image(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_copy_image */ #ifdef GL_ARB_debug_output CONST_CAST(GLEW_ARB_debug_output) = _glewSearchExtension("GL_ARB_debug_output", extStart, extEnd); if (glewExperimental || GLEW_ARB_debug_output) CONST_CAST(GLEW_ARB_debug_output) = !_glewInit_GL_ARB_debug_output(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_debug_output */ #ifdef GL_ARB_depth_buffer_float CONST_CAST(GLEW_ARB_depth_buffer_float) = _glewSearchExtension("GL_ARB_depth_buffer_float", extStart, extEnd); #endif /* GL_ARB_depth_buffer_float */ #ifdef GL_ARB_depth_clamp CONST_CAST(GLEW_ARB_depth_clamp) = _glewSearchExtension("GL_ARB_depth_clamp", extStart, extEnd); #endif /* GL_ARB_depth_clamp */ #ifdef GL_ARB_depth_texture CONST_CAST(GLEW_ARB_depth_texture) = _glewSearchExtension("GL_ARB_depth_texture", extStart, extEnd); #endif /* GL_ARB_depth_texture */ #ifdef GL_ARB_draw_buffers CONST_CAST(GLEW_ARB_draw_buffers) = _glewSearchExtension("GL_ARB_draw_buffers", extStart, extEnd); if (glewExperimental || GLEW_ARB_draw_buffers) CONST_CAST(GLEW_ARB_draw_buffers) = !_glewInit_GL_ARB_draw_buffers(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_draw_buffers */ #ifdef GL_ARB_draw_buffers_blend CONST_CAST(GLEW_ARB_draw_buffers_blend) = _glewSearchExtension("GL_ARB_draw_buffers_blend", extStart, extEnd); if (glewExperimental || GLEW_ARB_draw_buffers_blend) CONST_CAST(GLEW_ARB_draw_buffers_blend) = !_glewInit_GL_ARB_draw_buffers_blend(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_draw_buffers_blend */ #ifdef GL_ARB_draw_elements_base_vertex CONST_CAST(GLEW_ARB_draw_elements_base_vertex) = _glewSearchExtension("GL_ARB_draw_elements_base_vertex", extStart, extEnd); if (glewExperimental || GLEW_ARB_draw_elements_base_vertex) CONST_CAST(GLEW_ARB_draw_elements_base_vertex) = !_glewInit_GL_ARB_draw_elements_base_vertex(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_draw_elements_base_vertex */ #ifdef GL_ARB_draw_indirect CONST_CAST(GLEW_ARB_draw_indirect) = _glewSearchExtension("GL_ARB_draw_indirect", extStart, extEnd); if (glewExperimental || GLEW_ARB_draw_indirect) CONST_CAST(GLEW_ARB_draw_indirect) = !_glewInit_GL_ARB_draw_indirect(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_draw_indirect */ #ifdef GL_ARB_draw_instanced CONST_CAST(GLEW_ARB_draw_instanced) = _glewSearchExtension("GL_ARB_draw_instanced", extStart, extEnd); #endif /* GL_ARB_draw_instanced */ #ifdef GL_ARB_explicit_attrib_location CONST_CAST(GLEW_ARB_explicit_attrib_location) = _glewSearchExtension("GL_ARB_explicit_attrib_location", extStart, extEnd); #endif /* GL_ARB_explicit_attrib_location */ #ifdef GL_ARB_explicit_uniform_location CONST_CAST(GLEW_ARB_explicit_uniform_location) = _glewSearchExtension("GL_ARB_explicit_uniform_location", extStart, extEnd); #endif /* GL_ARB_explicit_uniform_location */ #ifdef GL_ARB_fragment_coord_conventions CONST_CAST(GLEW_ARB_fragment_coord_conventions) = _glewSearchExtension("GL_ARB_fragment_coord_conventions", extStart, extEnd); #endif /* GL_ARB_fragment_coord_conventions */ #ifdef GL_ARB_fragment_layer_viewport CONST_CAST(GLEW_ARB_fragment_layer_viewport) = _glewSearchExtension("GL_ARB_fragment_layer_viewport", extStart, extEnd); #endif /* GL_ARB_fragment_layer_viewport */ #ifdef GL_ARB_fragment_program CONST_CAST(GLEW_ARB_fragment_program) = _glewSearchExtension("GL_ARB_fragment_program", extStart, extEnd); #endif /* GL_ARB_fragment_program */ #ifdef GL_ARB_fragment_program_shadow CONST_CAST(GLEW_ARB_fragment_program_shadow) = _glewSearchExtension("GL_ARB_fragment_program_shadow", extStart, extEnd); #endif /* GL_ARB_fragment_program_shadow */ #ifdef GL_ARB_fragment_shader CONST_CAST(GLEW_ARB_fragment_shader) = _glewSearchExtension("GL_ARB_fragment_shader", extStart, extEnd); #endif /* GL_ARB_fragment_shader */ #ifdef GL_ARB_framebuffer_no_attachments CONST_CAST(GLEW_ARB_framebuffer_no_attachments) = _glewSearchExtension("GL_ARB_framebuffer_no_attachments", extStart, extEnd); if (glewExperimental || GLEW_ARB_framebuffer_no_attachments) CONST_CAST(GLEW_ARB_framebuffer_no_attachments) = !_glewInit_GL_ARB_framebuffer_no_attachments(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_framebuffer_no_attachments */ #ifdef GL_ARB_framebuffer_object CONST_CAST(GLEW_ARB_framebuffer_object) = _glewSearchExtension("GL_ARB_framebuffer_object", extStart, extEnd); if (glewExperimental || GLEW_ARB_framebuffer_object) CONST_CAST(GLEW_ARB_framebuffer_object) = !_glewInit_GL_ARB_framebuffer_object(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_framebuffer_object */ #ifdef GL_ARB_framebuffer_sRGB CONST_CAST(GLEW_ARB_framebuffer_sRGB) = _glewSearchExtension("GL_ARB_framebuffer_sRGB", extStart, extEnd); #endif /* GL_ARB_framebuffer_sRGB */ #ifdef GL_ARB_geometry_shader4 CONST_CAST(GLEW_ARB_geometry_shader4) = _glewSearchExtension("GL_ARB_geometry_shader4", extStart, extEnd); if (glewExperimental || GLEW_ARB_geometry_shader4) CONST_CAST(GLEW_ARB_geometry_shader4) = !_glewInit_GL_ARB_geometry_shader4(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_geometry_shader4 */ #ifdef GL_ARB_get_program_binary CONST_CAST(GLEW_ARB_get_program_binary) = _glewSearchExtension("GL_ARB_get_program_binary", extStart, extEnd); if (glewExperimental || GLEW_ARB_get_program_binary) CONST_CAST(GLEW_ARB_get_program_binary) = !_glewInit_GL_ARB_get_program_binary(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_get_program_binary */ #ifdef GL_ARB_gpu_shader5 CONST_CAST(GLEW_ARB_gpu_shader5) = _glewSearchExtension("GL_ARB_gpu_shader5", extStart, extEnd); #endif /* GL_ARB_gpu_shader5 */ #ifdef GL_ARB_gpu_shader_fp64 CONST_CAST(GLEW_ARB_gpu_shader_fp64) = _glewSearchExtension("GL_ARB_gpu_shader_fp64", extStart, extEnd); if (glewExperimental || GLEW_ARB_gpu_shader_fp64) CONST_CAST(GLEW_ARB_gpu_shader_fp64) = !_glewInit_GL_ARB_gpu_shader_fp64(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_gpu_shader_fp64 */ #ifdef GL_ARB_half_float_pixel CONST_CAST(GLEW_ARB_half_float_pixel) = _glewSearchExtension("GL_ARB_half_float_pixel", extStart, extEnd); #endif /* GL_ARB_half_float_pixel */ #ifdef GL_ARB_half_float_vertex CONST_CAST(GLEW_ARB_half_float_vertex) = _glewSearchExtension("GL_ARB_half_float_vertex", extStart, extEnd); #endif /* GL_ARB_half_float_vertex */ #ifdef GL_ARB_imaging CONST_CAST(GLEW_ARB_imaging) = _glewSearchExtension("GL_ARB_imaging", extStart, extEnd); if (glewExperimental || GLEW_ARB_imaging) CONST_CAST(GLEW_ARB_imaging) = !_glewInit_GL_ARB_imaging(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_imaging */ #ifdef GL_ARB_instanced_arrays CONST_CAST(GLEW_ARB_instanced_arrays) = _glewSearchExtension("GL_ARB_instanced_arrays", extStart, extEnd); if (glewExperimental || GLEW_ARB_instanced_arrays) CONST_CAST(GLEW_ARB_instanced_arrays) = !_glewInit_GL_ARB_instanced_arrays(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_instanced_arrays */ #ifdef GL_ARB_internalformat_query CONST_CAST(GLEW_ARB_internalformat_query) = _glewSearchExtension("GL_ARB_internalformat_query", extStart, extEnd); if (glewExperimental || GLEW_ARB_internalformat_query) CONST_CAST(GLEW_ARB_internalformat_query) = !_glewInit_GL_ARB_internalformat_query(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_internalformat_query */ #ifdef GL_ARB_internalformat_query2 CONST_CAST(GLEW_ARB_internalformat_query2) = _glewSearchExtension("GL_ARB_internalformat_query2", extStart, extEnd); if (glewExperimental || GLEW_ARB_internalformat_query2) CONST_CAST(GLEW_ARB_internalformat_query2) = !_glewInit_GL_ARB_internalformat_query2(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_internalformat_query2 */ #ifdef GL_ARB_invalidate_subdata CONST_CAST(GLEW_ARB_invalidate_subdata) = _glewSearchExtension("GL_ARB_invalidate_subdata", extStart, extEnd); if (glewExperimental || GLEW_ARB_invalidate_subdata) CONST_CAST(GLEW_ARB_invalidate_subdata) = !_glewInit_GL_ARB_invalidate_subdata(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_invalidate_subdata */ #ifdef GL_ARB_map_buffer_alignment CONST_CAST(GLEW_ARB_map_buffer_alignment) = _glewSearchExtension("GL_ARB_map_buffer_alignment", extStart, extEnd); #endif /* GL_ARB_map_buffer_alignment */ #ifdef GL_ARB_map_buffer_range CONST_CAST(GLEW_ARB_map_buffer_range) = _glewSearchExtension("GL_ARB_map_buffer_range", extStart, extEnd); if (glewExperimental || GLEW_ARB_map_buffer_range) CONST_CAST(GLEW_ARB_map_buffer_range) = !_glewInit_GL_ARB_map_buffer_range(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_map_buffer_range */ #ifdef GL_ARB_matrix_palette CONST_CAST(GLEW_ARB_matrix_palette) = _glewSearchExtension("GL_ARB_matrix_palette", extStart, extEnd); if (glewExperimental || GLEW_ARB_matrix_palette) CONST_CAST(GLEW_ARB_matrix_palette) = !_glewInit_GL_ARB_matrix_palette(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_matrix_palette */ #ifdef GL_ARB_multi_draw_indirect CONST_CAST(GLEW_ARB_multi_draw_indirect) = _glewSearchExtension("GL_ARB_multi_draw_indirect", extStart, extEnd); if (glewExperimental || GLEW_ARB_multi_draw_indirect) CONST_CAST(GLEW_ARB_multi_draw_indirect) = !_glewInit_GL_ARB_multi_draw_indirect(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_multi_draw_indirect */ #ifdef GL_ARB_multisample CONST_CAST(GLEW_ARB_multisample) = _glewSearchExtension("GL_ARB_multisample", extStart, extEnd); if (glewExperimental || GLEW_ARB_multisample) CONST_CAST(GLEW_ARB_multisample) = !_glewInit_GL_ARB_multisample(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_multisample */ #ifdef GL_ARB_multitexture CONST_CAST(GLEW_ARB_multitexture) = _glewSearchExtension("GL_ARB_multitexture", extStart, extEnd); if (glewExperimental || GLEW_ARB_multitexture) CONST_CAST(GLEW_ARB_multitexture) = !_glewInit_GL_ARB_multitexture(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_multitexture */ #ifdef GL_ARB_occlusion_query CONST_CAST(GLEW_ARB_occlusion_query) = _glewSearchExtension("GL_ARB_occlusion_query", extStart, extEnd); if (glewExperimental || GLEW_ARB_occlusion_query) CONST_CAST(GLEW_ARB_occlusion_query) = !_glewInit_GL_ARB_occlusion_query(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_occlusion_query */ #ifdef GL_ARB_occlusion_query2 CONST_CAST(GLEW_ARB_occlusion_query2) = _glewSearchExtension("GL_ARB_occlusion_query2", extStart, extEnd); #endif /* GL_ARB_occlusion_query2 */ #ifdef GL_ARB_pixel_buffer_object CONST_CAST(GLEW_ARB_pixel_buffer_object) = _glewSearchExtension("GL_ARB_pixel_buffer_object", extStart, extEnd); #endif /* GL_ARB_pixel_buffer_object */ #ifdef GL_ARB_point_parameters CONST_CAST(GLEW_ARB_point_parameters) = _glewSearchExtension("GL_ARB_point_parameters", extStart, extEnd); if (glewExperimental || GLEW_ARB_point_parameters) CONST_CAST(GLEW_ARB_point_parameters) = !_glewInit_GL_ARB_point_parameters(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_point_parameters */ #ifdef GL_ARB_point_sprite CONST_CAST(GLEW_ARB_point_sprite) = _glewSearchExtension("GL_ARB_point_sprite", extStart, extEnd); #endif /* GL_ARB_point_sprite */ #ifdef GL_ARB_program_interface_query CONST_CAST(GLEW_ARB_program_interface_query) = _glewSearchExtension("GL_ARB_program_interface_query", extStart, extEnd); if (glewExperimental || GLEW_ARB_program_interface_query) CONST_CAST(GLEW_ARB_program_interface_query) = !_glewInit_GL_ARB_program_interface_query(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_program_interface_query */ #ifdef GL_ARB_provoking_vertex CONST_CAST(GLEW_ARB_provoking_vertex) = _glewSearchExtension("GL_ARB_provoking_vertex", extStart, extEnd); if (glewExperimental || GLEW_ARB_provoking_vertex) CONST_CAST(GLEW_ARB_provoking_vertex) = !_glewInit_GL_ARB_provoking_vertex(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_provoking_vertex */ #ifdef GL_ARB_robust_buffer_access_behavior CONST_CAST(GLEW_ARB_robust_buffer_access_behavior) = _glewSearchExtension("GL_ARB_robust_buffer_access_behavior", extStart, extEnd); #endif /* GL_ARB_robust_buffer_access_behavior */ #ifdef GL_ARB_robustness CONST_CAST(GLEW_ARB_robustness) = _glewSearchExtension("GL_ARB_robustness", extStart, extEnd); if (glewExperimental || GLEW_ARB_robustness) CONST_CAST(GLEW_ARB_robustness) = !_glewInit_GL_ARB_robustness(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_robustness */ #ifdef GL_ARB_robustness_application_isolation CONST_CAST(GLEW_ARB_robustness_application_isolation) = _glewSearchExtension("GL_ARB_robustness_application_isolation", extStart, extEnd); #endif /* GL_ARB_robustness_application_isolation */ #ifdef GL_ARB_robustness_share_group_isolation CONST_CAST(GLEW_ARB_robustness_share_group_isolation) = _glewSearchExtension("GL_ARB_robustness_share_group_isolation", extStart, extEnd); #endif /* GL_ARB_robustness_share_group_isolation */ #ifdef GL_ARB_sample_shading CONST_CAST(GLEW_ARB_sample_shading) = _glewSearchExtension("GL_ARB_sample_shading", extStart, extEnd); if (glewExperimental || GLEW_ARB_sample_shading) CONST_CAST(GLEW_ARB_sample_shading) = !_glewInit_GL_ARB_sample_shading(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_sample_shading */ #ifdef GL_ARB_sampler_objects CONST_CAST(GLEW_ARB_sampler_objects) = _glewSearchExtension("GL_ARB_sampler_objects", extStart, extEnd); if (glewExperimental || GLEW_ARB_sampler_objects) CONST_CAST(GLEW_ARB_sampler_objects) = !_glewInit_GL_ARB_sampler_objects(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_sampler_objects */ #ifdef GL_ARB_seamless_cube_map CONST_CAST(GLEW_ARB_seamless_cube_map) = _glewSearchExtension("GL_ARB_seamless_cube_map", extStart, extEnd); #endif /* GL_ARB_seamless_cube_map */ #ifdef GL_ARB_separate_shader_objects CONST_CAST(GLEW_ARB_separate_shader_objects) = _glewSearchExtension("GL_ARB_separate_shader_objects", extStart, extEnd); if (glewExperimental || GLEW_ARB_separate_shader_objects) CONST_CAST(GLEW_ARB_separate_shader_objects) = !_glewInit_GL_ARB_separate_shader_objects(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_separate_shader_objects */ #ifdef GL_ARB_shader_atomic_counters CONST_CAST(GLEW_ARB_shader_atomic_counters) = _glewSearchExtension("GL_ARB_shader_atomic_counters", extStart, extEnd); if (glewExperimental || GLEW_ARB_shader_atomic_counters) CONST_CAST(GLEW_ARB_shader_atomic_counters) = !_glewInit_GL_ARB_shader_atomic_counters(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_shader_atomic_counters */ #ifdef GL_ARB_shader_bit_encoding CONST_CAST(GLEW_ARB_shader_bit_encoding) = _glewSearchExtension("GL_ARB_shader_bit_encoding", extStart, extEnd); #endif /* GL_ARB_shader_bit_encoding */ #ifdef GL_ARB_shader_image_load_store CONST_CAST(GLEW_ARB_shader_image_load_store) = _glewSearchExtension("GL_ARB_shader_image_load_store", extStart, extEnd); if (glewExperimental || GLEW_ARB_shader_image_load_store) CONST_CAST(GLEW_ARB_shader_image_load_store) = !_glewInit_GL_ARB_shader_image_load_store(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_shader_image_load_store */ #ifdef GL_ARB_shader_image_size CONST_CAST(GLEW_ARB_shader_image_size) = _glewSearchExtension("GL_ARB_shader_image_size", extStart, extEnd); #endif /* GL_ARB_shader_image_size */ #ifdef GL_ARB_shader_objects CONST_CAST(GLEW_ARB_shader_objects) = _glewSearchExtension("GL_ARB_shader_objects", extStart, extEnd); if (glewExperimental || GLEW_ARB_shader_objects) CONST_CAST(GLEW_ARB_shader_objects) = !_glewInit_GL_ARB_shader_objects(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_shader_objects */ #ifdef GL_ARB_shader_precision CONST_CAST(GLEW_ARB_shader_precision) = _glewSearchExtension("GL_ARB_shader_precision", extStart, extEnd); #endif /* GL_ARB_shader_precision */ #ifdef GL_ARB_shader_stencil_export CONST_CAST(GLEW_ARB_shader_stencil_export) = _glewSearchExtension("GL_ARB_shader_stencil_export", extStart, extEnd); #endif /* GL_ARB_shader_stencil_export */ #ifdef GL_ARB_shader_storage_buffer_object CONST_CAST(GLEW_ARB_shader_storage_buffer_object) = _glewSearchExtension("GL_ARB_shader_storage_buffer_object", extStart, extEnd); if (glewExperimental || GLEW_ARB_shader_storage_buffer_object) CONST_CAST(GLEW_ARB_shader_storage_buffer_object) = !_glewInit_GL_ARB_shader_storage_buffer_object(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_shader_storage_buffer_object */ #ifdef GL_ARB_shader_subroutine CONST_CAST(GLEW_ARB_shader_subroutine) = _glewSearchExtension("GL_ARB_shader_subroutine", extStart, extEnd); if (glewExperimental || GLEW_ARB_shader_subroutine) CONST_CAST(GLEW_ARB_shader_subroutine) = !_glewInit_GL_ARB_shader_subroutine(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_shader_subroutine */ #ifdef GL_ARB_shader_texture_lod CONST_CAST(GLEW_ARB_shader_texture_lod) = _glewSearchExtension("GL_ARB_shader_texture_lod", extStart, extEnd); #endif /* GL_ARB_shader_texture_lod */ #ifdef GL_ARB_shading_language_100 CONST_CAST(GLEW_ARB_shading_language_100) = _glewSearchExtension("GL_ARB_shading_language_100", extStart, extEnd); #endif /* GL_ARB_shading_language_100 */ #ifdef GL_ARB_shading_language_420pack CONST_CAST(GLEW_ARB_shading_language_420pack) = _glewSearchExtension("GL_ARB_shading_language_420pack", extStart, extEnd); #endif /* GL_ARB_shading_language_420pack */ #ifdef GL_ARB_shading_language_include CONST_CAST(GLEW_ARB_shading_language_include) = _glewSearchExtension("GL_ARB_shading_language_include", extStart, extEnd); if (glewExperimental || GLEW_ARB_shading_language_include) CONST_CAST(GLEW_ARB_shading_language_include) = !_glewInit_GL_ARB_shading_language_include(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_shading_language_include */ #ifdef GL_ARB_shading_language_packing CONST_CAST(GLEW_ARB_shading_language_packing) = _glewSearchExtension("GL_ARB_shading_language_packing", extStart, extEnd); #endif /* GL_ARB_shading_language_packing */ #ifdef GL_ARB_shadow CONST_CAST(GLEW_ARB_shadow) = _glewSearchExtension("GL_ARB_shadow", extStart, extEnd); #endif /* GL_ARB_shadow */ #ifdef GL_ARB_shadow_ambient CONST_CAST(GLEW_ARB_shadow_ambient) = _glewSearchExtension("GL_ARB_shadow_ambient", extStart, extEnd); #endif /* GL_ARB_shadow_ambient */ #ifdef GL_ARB_stencil_texturing CONST_CAST(GLEW_ARB_stencil_texturing) = _glewSearchExtension("GL_ARB_stencil_texturing", extStart, extEnd); #endif /* GL_ARB_stencil_texturing */ #ifdef GL_ARB_sync CONST_CAST(GLEW_ARB_sync) = _glewSearchExtension("GL_ARB_sync", extStart, extEnd); if (glewExperimental || GLEW_ARB_sync) CONST_CAST(GLEW_ARB_sync) = !_glewInit_GL_ARB_sync(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_sync */ #ifdef GL_ARB_tessellation_shader CONST_CAST(GLEW_ARB_tessellation_shader) = _glewSearchExtension("GL_ARB_tessellation_shader", extStart, extEnd); if (glewExperimental || GLEW_ARB_tessellation_shader) CONST_CAST(GLEW_ARB_tessellation_shader) = !_glewInit_GL_ARB_tessellation_shader(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_tessellation_shader */ #ifdef GL_ARB_texture_border_clamp CONST_CAST(GLEW_ARB_texture_border_clamp) = _glewSearchExtension("GL_ARB_texture_border_clamp", extStart, extEnd); #endif /* GL_ARB_texture_border_clamp */ #ifdef GL_ARB_texture_buffer_object CONST_CAST(GLEW_ARB_texture_buffer_object) = _glewSearchExtension("GL_ARB_texture_buffer_object", extStart, extEnd); if (glewExperimental || GLEW_ARB_texture_buffer_object) CONST_CAST(GLEW_ARB_texture_buffer_object) = !_glewInit_GL_ARB_texture_buffer_object(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_texture_buffer_object */ #ifdef GL_ARB_texture_buffer_object_rgb32 CONST_CAST(GLEW_ARB_texture_buffer_object_rgb32) = _glewSearchExtension("GL_ARB_texture_buffer_object_rgb32", extStart, extEnd); #endif /* GL_ARB_texture_buffer_object_rgb32 */ #ifdef GL_ARB_texture_buffer_range CONST_CAST(GLEW_ARB_texture_buffer_range) = _glewSearchExtension("GL_ARB_texture_buffer_range", extStart, extEnd); if (glewExperimental || GLEW_ARB_texture_buffer_range) CONST_CAST(GLEW_ARB_texture_buffer_range) = !_glewInit_GL_ARB_texture_buffer_range(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_texture_buffer_range */ #ifdef GL_ARB_texture_compression CONST_CAST(GLEW_ARB_texture_compression) = _glewSearchExtension("GL_ARB_texture_compression", extStart, extEnd); if (glewExperimental || GLEW_ARB_texture_compression) CONST_CAST(GLEW_ARB_texture_compression) = !_glewInit_GL_ARB_texture_compression(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_texture_compression */ #ifdef GL_ARB_texture_compression_bptc CONST_CAST(GLEW_ARB_texture_compression_bptc) = _glewSearchExtension("GL_ARB_texture_compression_bptc", extStart, extEnd); #endif /* GL_ARB_texture_compression_bptc */ #ifdef GL_ARB_texture_compression_rgtc CONST_CAST(GLEW_ARB_texture_compression_rgtc) = _glewSearchExtension("GL_ARB_texture_compression_rgtc", extStart, extEnd); #endif /* GL_ARB_texture_compression_rgtc */ #ifdef GL_ARB_texture_cube_map CONST_CAST(GLEW_ARB_texture_cube_map) = _glewSearchExtension("GL_ARB_texture_cube_map", extStart, extEnd); #endif /* GL_ARB_texture_cube_map */ #ifdef GL_ARB_texture_cube_map_array CONST_CAST(GLEW_ARB_texture_cube_map_array) = _glewSearchExtension("GL_ARB_texture_cube_map_array", extStart, extEnd); #endif /* GL_ARB_texture_cube_map_array */ #ifdef GL_ARB_texture_env_add CONST_CAST(GLEW_ARB_texture_env_add) = _glewSearchExtension("GL_ARB_texture_env_add", extStart, extEnd); #endif /* GL_ARB_texture_env_add */ #ifdef GL_ARB_texture_env_combine CONST_CAST(GLEW_ARB_texture_env_combine) = _glewSearchExtension("GL_ARB_texture_env_combine", extStart, extEnd); #endif /* GL_ARB_texture_env_combine */ #ifdef GL_ARB_texture_env_crossbar CONST_CAST(GLEW_ARB_texture_env_crossbar) = _glewSearchExtension("GL_ARB_texture_env_crossbar", extStart, extEnd); #endif /* GL_ARB_texture_env_crossbar */ #ifdef GL_ARB_texture_env_dot3 CONST_CAST(GLEW_ARB_texture_env_dot3) = _glewSearchExtension("GL_ARB_texture_env_dot3", extStart, extEnd); #endif /* GL_ARB_texture_env_dot3 */ #ifdef GL_ARB_texture_float CONST_CAST(GLEW_ARB_texture_float) = _glewSearchExtension("GL_ARB_texture_float", extStart, extEnd); #endif /* GL_ARB_texture_float */ #ifdef GL_ARB_texture_gather CONST_CAST(GLEW_ARB_texture_gather) = _glewSearchExtension("GL_ARB_texture_gather", extStart, extEnd); #endif /* GL_ARB_texture_gather */ #ifdef GL_ARB_texture_mirrored_repeat CONST_CAST(GLEW_ARB_texture_mirrored_repeat) = _glewSearchExtension("GL_ARB_texture_mirrored_repeat", extStart, extEnd); #endif /* GL_ARB_texture_mirrored_repeat */ #ifdef GL_ARB_texture_multisample CONST_CAST(GLEW_ARB_texture_multisample) = _glewSearchExtension("GL_ARB_texture_multisample", extStart, extEnd); if (glewExperimental || GLEW_ARB_texture_multisample) CONST_CAST(GLEW_ARB_texture_multisample) = !_glewInit_GL_ARB_texture_multisample(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_texture_multisample */ #ifdef GL_ARB_texture_non_power_of_two CONST_CAST(GLEW_ARB_texture_non_power_of_two) = _glewSearchExtension("GL_ARB_texture_non_power_of_two", extStart, extEnd); #endif /* GL_ARB_texture_non_power_of_two */ #ifdef GL_ARB_texture_query_levels CONST_CAST(GLEW_ARB_texture_query_levels) = _glewSearchExtension("GL_ARB_texture_query_levels", extStart, extEnd); #endif /* GL_ARB_texture_query_levels */ #ifdef GL_ARB_texture_query_lod CONST_CAST(GLEW_ARB_texture_query_lod) = _glewSearchExtension("GL_ARB_texture_query_lod", extStart, extEnd); #endif /* GL_ARB_texture_query_lod */ #ifdef GL_ARB_texture_rectangle CONST_CAST(GLEW_ARB_texture_rectangle) = _glewSearchExtension("GL_ARB_texture_rectangle", extStart, extEnd); #endif /* GL_ARB_texture_rectangle */ #ifdef GL_ARB_texture_rg CONST_CAST(GLEW_ARB_texture_rg) = _glewSearchExtension("GL_ARB_texture_rg", extStart, extEnd); #endif /* GL_ARB_texture_rg */ #ifdef GL_ARB_texture_rgb10_a2ui CONST_CAST(GLEW_ARB_texture_rgb10_a2ui) = _glewSearchExtension("GL_ARB_texture_rgb10_a2ui", extStart, extEnd); #endif /* GL_ARB_texture_rgb10_a2ui */ #ifdef GL_ARB_texture_storage CONST_CAST(GLEW_ARB_texture_storage) = _glewSearchExtension("GL_ARB_texture_storage", extStart, extEnd); if (glewExperimental || GLEW_ARB_texture_storage) CONST_CAST(GLEW_ARB_texture_storage) = !_glewInit_GL_ARB_texture_storage(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_texture_storage */ #ifdef GL_ARB_texture_storage_multisample CONST_CAST(GLEW_ARB_texture_storage_multisample) = _glewSearchExtension("GL_ARB_texture_storage_multisample", extStart, extEnd); if (glewExperimental || GLEW_ARB_texture_storage_multisample) CONST_CAST(GLEW_ARB_texture_storage_multisample) = !_glewInit_GL_ARB_texture_storage_multisample(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_texture_storage_multisample */ #ifdef GL_ARB_texture_swizzle CONST_CAST(GLEW_ARB_texture_swizzle) = _glewSearchExtension("GL_ARB_texture_swizzle", extStart, extEnd); #endif /* GL_ARB_texture_swizzle */ #ifdef GL_ARB_texture_view CONST_CAST(GLEW_ARB_texture_view) = _glewSearchExtension("GL_ARB_texture_view", extStart, extEnd); if (glewExperimental || GLEW_ARB_texture_view) CONST_CAST(GLEW_ARB_texture_view) = !_glewInit_GL_ARB_texture_view(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_texture_view */ #ifdef GL_ARB_timer_query CONST_CAST(GLEW_ARB_timer_query) = _glewSearchExtension("GL_ARB_timer_query", extStart, extEnd); if (glewExperimental || GLEW_ARB_timer_query) CONST_CAST(GLEW_ARB_timer_query) = !_glewInit_GL_ARB_timer_query(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_timer_query */ #ifdef GL_ARB_transform_feedback2 CONST_CAST(GLEW_ARB_transform_feedback2) = _glewSearchExtension("GL_ARB_transform_feedback2", extStart, extEnd); if (glewExperimental || GLEW_ARB_transform_feedback2) CONST_CAST(GLEW_ARB_transform_feedback2) = !_glewInit_GL_ARB_transform_feedback2(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_transform_feedback2 */ #ifdef GL_ARB_transform_feedback3 CONST_CAST(GLEW_ARB_transform_feedback3) = _glewSearchExtension("GL_ARB_transform_feedback3", extStart, extEnd); if (glewExperimental || GLEW_ARB_transform_feedback3) CONST_CAST(GLEW_ARB_transform_feedback3) = !_glewInit_GL_ARB_transform_feedback3(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_transform_feedback3 */ #ifdef GL_ARB_transform_feedback_instanced CONST_CAST(GLEW_ARB_transform_feedback_instanced) = _glewSearchExtension("GL_ARB_transform_feedback_instanced", extStart, extEnd); if (glewExperimental || GLEW_ARB_transform_feedback_instanced) CONST_CAST(GLEW_ARB_transform_feedback_instanced) = !_glewInit_GL_ARB_transform_feedback_instanced(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_transform_feedback_instanced */ #ifdef GL_ARB_transpose_matrix CONST_CAST(GLEW_ARB_transpose_matrix) = _glewSearchExtension("GL_ARB_transpose_matrix", extStart, extEnd); if (glewExperimental || GLEW_ARB_transpose_matrix) CONST_CAST(GLEW_ARB_transpose_matrix) = !_glewInit_GL_ARB_transpose_matrix(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_transpose_matrix */ #ifdef GL_ARB_uniform_buffer_object CONST_CAST(GLEW_ARB_uniform_buffer_object) = _glewSearchExtension("GL_ARB_uniform_buffer_object", extStart, extEnd); if (glewExperimental || GLEW_ARB_uniform_buffer_object) CONST_CAST(GLEW_ARB_uniform_buffer_object) = !_glewInit_GL_ARB_uniform_buffer_object(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_uniform_buffer_object */ #ifdef GL_ARB_vertex_array_bgra CONST_CAST(GLEW_ARB_vertex_array_bgra) = _glewSearchExtension("GL_ARB_vertex_array_bgra", extStart, extEnd); #endif /* GL_ARB_vertex_array_bgra */ #ifdef GL_ARB_vertex_array_object CONST_CAST(GLEW_ARB_vertex_array_object) = _glewSearchExtension("GL_ARB_vertex_array_object", extStart, extEnd); if (glewExperimental || GLEW_ARB_vertex_array_object) CONST_CAST(GLEW_ARB_vertex_array_object) = !_glewInit_GL_ARB_vertex_array_object(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_vertex_array_object */ #ifdef GL_ARB_vertex_attrib_64bit CONST_CAST(GLEW_ARB_vertex_attrib_64bit) = _glewSearchExtension("GL_ARB_vertex_attrib_64bit", extStart, extEnd); if (glewExperimental || GLEW_ARB_vertex_attrib_64bit) CONST_CAST(GLEW_ARB_vertex_attrib_64bit) = !_glewInit_GL_ARB_vertex_attrib_64bit(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_vertex_attrib_64bit */ #ifdef GL_ARB_vertex_attrib_binding CONST_CAST(GLEW_ARB_vertex_attrib_binding) = _glewSearchExtension("GL_ARB_vertex_attrib_binding", extStart, extEnd); if (glewExperimental || GLEW_ARB_vertex_attrib_binding) CONST_CAST(GLEW_ARB_vertex_attrib_binding) = !_glewInit_GL_ARB_vertex_attrib_binding(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_vertex_attrib_binding */ #ifdef GL_ARB_vertex_blend CONST_CAST(GLEW_ARB_vertex_blend) = _glewSearchExtension("GL_ARB_vertex_blend", extStart, extEnd); if (glewExperimental || GLEW_ARB_vertex_blend) CONST_CAST(GLEW_ARB_vertex_blend) = !_glewInit_GL_ARB_vertex_blend(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_vertex_blend */ #ifdef GL_ARB_vertex_buffer_object CONST_CAST(GLEW_ARB_vertex_buffer_object) = _glewSearchExtension("GL_ARB_vertex_buffer_object", extStart, extEnd); if (glewExperimental || GLEW_ARB_vertex_buffer_object) CONST_CAST(GLEW_ARB_vertex_buffer_object) = !_glewInit_GL_ARB_vertex_buffer_object(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_vertex_buffer_object */ #ifdef GL_ARB_vertex_program CONST_CAST(GLEW_ARB_vertex_program) = _glewSearchExtension("GL_ARB_vertex_program", extStart, extEnd); if (glewExperimental || GLEW_ARB_vertex_program) CONST_CAST(GLEW_ARB_vertex_program) = !_glewInit_GL_ARB_vertex_program(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_vertex_program */ #ifdef GL_ARB_vertex_shader CONST_CAST(GLEW_ARB_vertex_shader) = _glewSearchExtension("GL_ARB_vertex_shader", extStart, extEnd); if (glewExperimental || GLEW_ARB_vertex_shader) CONST_CAST(GLEW_ARB_vertex_shader) = !_glewInit_GL_ARB_vertex_shader(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_vertex_shader */ #ifdef GL_ARB_vertex_type_2_10_10_10_rev CONST_CAST(GLEW_ARB_vertex_type_2_10_10_10_rev) = _glewSearchExtension("GL_ARB_vertex_type_2_10_10_10_rev", extStart, extEnd); if (glewExperimental || GLEW_ARB_vertex_type_2_10_10_10_rev) CONST_CAST(GLEW_ARB_vertex_type_2_10_10_10_rev) = !_glewInit_GL_ARB_vertex_type_2_10_10_10_rev(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_vertex_type_2_10_10_10_rev */ #ifdef GL_ARB_viewport_array CONST_CAST(GLEW_ARB_viewport_array) = _glewSearchExtension("GL_ARB_viewport_array", extStart, extEnd); if (glewExperimental || GLEW_ARB_viewport_array) CONST_CAST(GLEW_ARB_viewport_array) = !_glewInit_GL_ARB_viewport_array(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_viewport_array */ #ifdef GL_ARB_window_pos CONST_CAST(GLEW_ARB_window_pos) = _glewSearchExtension("GL_ARB_window_pos", extStart, extEnd); if (glewExperimental || GLEW_ARB_window_pos) CONST_CAST(GLEW_ARB_window_pos) = !_glewInit_GL_ARB_window_pos(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_window_pos */ #ifdef GL_ATIX_point_sprites CONST_CAST(GLEW_ATIX_point_sprites) = _glewSearchExtension("GL_ATIX_point_sprites", extStart, extEnd); #endif /* GL_ATIX_point_sprites */ #ifdef GL_ATIX_texture_env_combine3 CONST_CAST(GLEW_ATIX_texture_env_combine3) = _glewSearchExtension("GL_ATIX_texture_env_combine3", extStart, extEnd); #endif /* GL_ATIX_texture_env_combine3 */ #ifdef GL_ATIX_texture_env_route CONST_CAST(GLEW_ATIX_texture_env_route) = _glewSearchExtension("GL_ATIX_texture_env_route", extStart, extEnd); #endif /* GL_ATIX_texture_env_route */ #ifdef GL_ATIX_vertex_shader_output_point_size CONST_CAST(GLEW_ATIX_vertex_shader_output_point_size) = _glewSearchExtension("GL_ATIX_vertex_shader_output_point_size", extStart, extEnd); #endif /* GL_ATIX_vertex_shader_output_point_size */ #ifdef GL_ATI_draw_buffers CONST_CAST(GLEW_ATI_draw_buffers) = _glewSearchExtension("GL_ATI_draw_buffers", extStart, extEnd); if (glewExperimental || GLEW_ATI_draw_buffers) CONST_CAST(GLEW_ATI_draw_buffers) = !_glewInit_GL_ATI_draw_buffers(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ATI_draw_buffers */ #ifdef GL_ATI_element_array CONST_CAST(GLEW_ATI_element_array) = _glewSearchExtension("GL_ATI_element_array", extStart, extEnd); if (glewExperimental || GLEW_ATI_element_array) CONST_CAST(GLEW_ATI_element_array) = !_glewInit_GL_ATI_element_array(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ATI_element_array */ #ifdef GL_ATI_envmap_bumpmap CONST_CAST(GLEW_ATI_envmap_bumpmap) = _glewSearchExtension("GL_ATI_envmap_bumpmap", extStart, extEnd); if (glewExperimental || GLEW_ATI_envmap_bumpmap) CONST_CAST(GLEW_ATI_envmap_bumpmap) = !_glewInit_GL_ATI_envmap_bumpmap(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ATI_envmap_bumpmap */ #ifdef GL_ATI_fragment_shader CONST_CAST(GLEW_ATI_fragment_shader) = _glewSearchExtension("GL_ATI_fragment_shader", extStart, extEnd); if (glewExperimental || GLEW_ATI_fragment_shader) CONST_CAST(GLEW_ATI_fragment_shader) = !_glewInit_GL_ATI_fragment_shader(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ATI_fragment_shader */ #ifdef GL_ATI_map_object_buffer CONST_CAST(GLEW_ATI_map_object_buffer) = _glewSearchExtension("GL_ATI_map_object_buffer", extStart, extEnd); if (glewExperimental || GLEW_ATI_map_object_buffer) CONST_CAST(GLEW_ATI_map_object_buffer) = !_glewInit_GL_ATI_map_object_buffer(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ATI_map_object_buffer */ #ifdef GL_ATI_meminfo CONST_CAST(GLEW_ATI_meminfo) = _glewSearchExtension("GL_ATI_meminfo", extStart, extEnd); #endif /* GL_ATI_meminfo */ #ifdef GL_ATI_pn_triangles CONST_CAST(GLEW_ATI_pn_triangles) = _glewSearchExtension("GL_ATI_pn_triangles", extStart, extEnd); if (glewExperimental || GLEW_ATI_pn_triangles) CONST_CAST(GLEW_ATI_pn_triangles) = !_glewInit_GL_ATI_pn_triangles(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ATI_pn_triangles */ #ifdef GL_ATI_separate_stencil CONST_CAST(GLEW_ATI_separate_stencil) = _glewSearchExtension("GL_ATI_separate_stencil", extStart, extEnd); if (glewExperimental || GLEW_ATI_separate_stencil) CONST_CAST(GLEW_ATI_separate_stencil) = !_glewInit_GL_ATI_separate_stencil(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ATI_separate_stencil */ #ifdef GL_ATI_shader_texture_lod CONST_CAST(GLEW_ATI_shader_texture_lod) = _glewSearchExtension("GL_ATI_shader_texture_lod", extStart, extEnd); #endif /* GL_ATI_shader_texture_lod */ #ifdef GL_ATI_text_fragment_shader CONST_CAST(GLEW_ATI_text_fragment_shader) = _glewSearchExtension("GL_ATI_text_fragment_shader", extStart, extEnd); #endif /* GL_ATI_text_fragment_shader */ #ifdef GL_ATI_texture_compression_3dc CONST_CAST(GLEW_ATI_texture_compression_3dc) = _glewSearchExtension("GL_ATI_texture_compression_3dc", extStart, extEnd); #endif /* GL_ATI_texture_compression_3dc */ #ifdef GL_ATI_texture_env_combine3 CONST_CAST(GLEW_ATI_texture_env_combine3) = _glewSearchExtension("GL_ATI_texture_env_combine3", extStart, extEnd); #endif /* GL_ATI_texture_env_combine3 */ #ifdef GL_ATI_texture_float CONST_CAST(GLEW_ATI_texture_float) = _glewSearchExtension("GL_ATI_texture_float", extStart, extEnd); #endif /* GL_ATI_texture_float */ #ifdef GL_ATI_texture_mirror_once CONST_CAST(GLEW_ATI_texture_mirror_once) = _glewSearchExtension("GL_ATI_texture_mirror_once", extStart, extEnd); #endif /* GL_ATI_texture_mirror_once */ #ifdef GL_ATI_vertex_array_object CONST_CAST(GLEW_ATI_vertex_array_object) = _glewSearchExtension("GL_ATI_vertex_array_object", extStart, extEnd); if (glewExperimental || GLEW_ATI_vertex_array_object) CONST_CAST(GLEW_ATI_vertex_array_object) = !_glewInit_GL_ATI_vertex_array_object(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ATI_vertex_array_object */ #ifdef GL_ATI_vertex_attrib_array_object CONST_CAST(GLEW_ATI_vertex_attrib_array_object) = _glewSearchExtension("GL_ATI_vertex_attrib_array_object", extStart, extEnd); if (glewExperimental || GLEW_ATI_vertex_attrib_array_object) CONST_CAST(GLEW_ATI_vertex_attrib_array_object) = !_glewInit_GL_ATI_vertex_attrib_array_object(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ATI_vertex_attrib_array_object */ #ifdef GL_ATI_vertex_streams CONST_CAST(GLEW_ATI_vertex_streams) = _glewSearchExtension("GL_ATI_vertex_streams", extStart, extEnd); if (glewExperimental || GLEW_ATI_vertex_streams) CONST_CAST(GLEW_ATI_vertex_streams) = !_glewInit_GL_ATI_vertex_streams(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ATI_vertex_streams */ #ifdef GL_EXT_422_pixels CONST_CAST(GLEW_EXT_422_pixels) = _glewSearchExtension("GL_EXT_422_pixels", extStart, extEnd); #endif /* GL_EXT_422_pixels */ #ifdef GL_EXT_Cg_shader CONST_CAST(GLEW_EXT_Cg_shader) = _glewSearchExtension("GL_EXT_Cg_shader", extStart, extEnd); #endif /* GL_EXT_Cg_shader */ #ifdef GL_EXT_abgr CONST_CAST(GLEW_EXT_abgr) = _glewSearchExtension("GL_EXT_abgr", extStart, extEnd); #endif /* GL_EXT_abgr */ #ifdef GL_EXT_bgra CONST_CAST(GLEW_EXT_bgra) = _glewSearchExtension("GL_EXT_bgra", extStart, extEnd); #endif /* GL_EXT_bgra */ #ifdef GL_EXT_bindable_uniform CONST_CAST(GLEW_EXT_bindable_uniform) = _glewSearchExtension("GL_EXT_bindable_uniform", extStart, extEnd); if (glewExperimental || GLEW_EXT_bindable_uniform) CONST_CAST(GLEW_EXT_bindable_uniform) = !_glewInit_GL_EXT_bindable_uniform(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_EXT_bindable_uniform */ #ifdef GL_EXT_blend_color CONST_CAST(GLEW_EXT_blend_color) = _glewSearchExtension("GL_EXT_blend_color", extStart, extEnd); if (glewExperimental || GLEW_EXT_blend_color) CONST_CAST(GLEW_EXT_blend_color) = !_glewInit_GL_EXT_blend_color(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_EXT_blend_color */ #ifdef GL_EXT_blend_equation_separate CONST_CAST(GLEW_EXT_blend_equation_separate) = _glewSearchExtension("GL_EXT_blend_equation_separate", extStart, extEnd); if (glewExperimental || GLEW_EXT_blend_equation_separate) CONST_CAST(GLEW_EXT_blend_equation_separate) = !_glewInit_GL_EXT_blend_equation_separate(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_EXT_blend_equation_separate */ #ifdef GL_EXT_blend_func_separate CONST_CAST(GLEW_EXT_blend_func_separate) = _glewSearchExtension("GL_EXT_blend_func_separate", extStart, extEnd); if (glewExperimental || GLEW_EXT_blend_func_separate) CONST_CAST(GLEW_EXT_blend_func_separate) = !_glewInit_GL_EXT_blend_func_separate(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_EXT_blend_func_separate */ #ifdef GL_EXT_blend_logic_op CONST_CAST(GLEW_EXT_blend_logic_op) = _glewSearchExtension("GL_EXT_blend_logic_op", extStart, extEnd); #endif /* GL_EXT_blend_logic_op */ #ifdef GL_EXT_blend_minmax CONST_CAST(GLEW_EXT_blend_minmax) = _glewSearchExtension("GL_EXT_blend_minmax", extStart, extEnd); if (glewExperimental || GLEW_EXT_blend_minmax) CONST_CAST(GLEW_EXT_blend_minmax) = !_glewInit_GL_EXT_blend_minmax(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_EXT_blend_minmax */ #ifdef GL_EXT_blend_subtract CONST_CAST(GLEW_EXT_blend_subtract) = _glewSearchExtension("GL_EXT_blend_subtract", extStart, extEnd); #endif /* GL_EXT_blend_subtract */ #ifdef GL_EXT_clip_volume_hint CONST_CAST(GLEW_EXT_clip_volume_hint) = _glewSearchExtension("GL_EXT_clip_volume_hint", extStart, extEnd); #endif /* GL_EXT_clip_volume_hint */ #ifdef GL_EXT_cmyka CONST_CAST(GLEW_EXT_cmyka) = _glewSearchExtension("GL_EXT_cmyka", extStart, extEnd); #endif /* GL_EXT_cmyka */ #ifdef GL_EXT_color_subtable CONST_CAST(GLEW_EXT_color_subtable) = _glewSearchExtension("GL_EXT_color_subtable", extStart, extEnd); if (glewExperimental || GLEW_EXT_color_subtable) CONST_CAST(GLEW_EXT_color_subtable) = !_glewInit_GL_EXT_color_subtable(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_EXT_color_subtable */ #ifdef GL_EXT_compiled_vertex_array CONST_CAST(GLEW_EXT_compiled_vertex_array) = _glewSearchExtension("GL_EXT_compiled_vertex_array", extStart, extEnd); if (glewExperimental || GLEW_EXT_compiled_vertex_array) CONST_CAST(GLEW_EXT_compiled_vertex_array) = !_glewInit_GL_EXT_compiled_vertex_array(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_EXT_compiled_vertex_array */ #ifdef GL_EXT_convolution CONST_CAST(GLEW_EXT_convolution) = _glewSearchExtension("GL_EXT_convolution", extStart, extEnd); if (glewExperimental || GLEW_EXT_convolution) CONST_CAST(GLEW_EXT_convolution) = !_glewInit_GL_EXT_convolution(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_EXT_convolution */ #ifdef GL_EXT_coordinate_frame CONST_CAST(GLEW_EXT_coordinate_frame) = _glewSearchExtension("GL_EXT_coordinate_frame", extStart, extEnd); if (glewExperimental || GLEW_EXT_coordinate_frame) CONST_CAST(GLEW_EXT_coordinate_frame) = !_glewInit_GL_EXT_coordinate_frame(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_EXT_coordinate_frame */ #ifdef GL_EXT_copy_texture CONST_CAST(GLEW_EXT_copy_texture) = _glewSearchExtension("GL_EXT_copy_texture", extStart, extEnd); if (glewExperimental || GLEW_EXT_copy_texture) CONST_CAST(GLEW_EXT_copy_texture) = !_glewInit_GL_EXT_copy_texture(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_EXT_copy_texture */ #ifdef GL_EXT_cull_vertex CONST_CAST(GLEW_EXT_cull_vertex) = _glewSearchExtension("GL_EXT_cull_vertex", extStart, extEnd); if (glewExperimental || GLEW_EXT_cull_vertex) CONST_CAST(GLEW_EXT_cull_vertex) = !_glewInit_GL_EXT_cull_vertex(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_EXT_cull_vertex */ #ifdef GL_EXT_debug_marker CONST_CAST(GLEW_EXT_debug_marker) = _glewSearchExtension("GL_EXT_debug_marker", extStart, extEnd); if (glewExperimental || GLEW_EXT_debug_marker) CONST_CAST(GLEW_EXT_debug_marker) = !_glewInit_GL_EXT_debug_marker(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_EXT_debug_marker */ #ifdef GL_EXT_depth_bounds_test CONST_CAST(GLEW_EXT_depth_bounds_test) = _glewSearchExtension("GL_EXT_depth_bounds_test", extStart, extEnd); if (glewExperimental || GLEW_EXT_depth_bounds_test) CONST_CAST(GLEW_EXT_depth_bounds_test) = !_glewInit_GL_EXT_depth_bounds_test(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_EXT_depth_bounds_test */ #ifdef GL_EXT_direct_state_access CONST_CAST(GLEW_EXT_direct_state_access) = _glewSearchExtension("GL_EXT_direct_state_access", extStart, extEnd); if (glewExperimental || GLEW_EXT_direct_state_access) CONST_CAST(GLEW_EXT_direct_state_access) = !_glewInit_GL_EXT_direct_state_access(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_EXT_direct_state_access */ #ifdef GL_EXT_draw_buffers2 CONST_CAST(GLEW_EXT_draw_buffers2) = _glewSearchExtension("GL_EXT_draw_buffers2", extStart, extEnd); if (glewExperimental || GLEW_EXT_draw_buffers2) CONST_CAST(GLEW_EXT_draw_buffers2) = !_glewInit_GL_EXT_draw_buffers2(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_EXT_draw_buffers2 */ #ifdef GL_EXT_draw_instanced CONST_CAST(GLEW_EXT_draw_instanced) = _glewSearchExtension("GL_EXT_draw_instanced", extStart, extEnd); if (glewExperimental || GLEW_EXT_draw_instanced) CONST_CAST(GLEW_EXT_draw_instanced) = !_glewInit_GL_EXT_draw_instanced(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_EXT_draw_instanced */ #ifdef GL_EXT_draw_range_elements CONST_CAST(GLEW_EXT_draw_range_elements) = _glewSearchExtension("GL_EXT_draw_range_elements", extStart, extEnd); if (glewExperimental || GLEW_EXT_draw_range_elements) CONST_CAST(GLEW_EXT_draw_range_elements) = !_glewInit_GL_EXT_draw_range_elements(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_EXT_draw_range_elements */ #ifdef GL_EXT_fog_coord CONST_CAST(GLEW_EXT_fog_coord) = _glewSearchExtension("GL_EXT_fog_coord", extStart, extEnd); if (glewExperimental || GLEW_EXT_fog_coord) CONST_CAST(GLEW_EXT_fog_coord) = !_glewInit_GL_EXT_fog_coord(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_EXT_fog_coord */ #ifdef GL_EXT_fragment_lighting CONST_CAST(GLEW_EXT_fragment_lighting) = _glewSearchExtension("GL_EXT_fragment_lighting", extStart, extEnd); if (glewExperimental || GLEW_EXT_fragment_lighting) CONST_CAST(GLEW_EXT_fragment_lighting) = !_glewInit_GL_EXT_fragment_lighting(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_EXT_fragment_lighting */ #ifdef GL_EXT_framebuffer_blit CONST_CAST(GLEW_EXT_framebuffer_blit) = _glewSearchExtension("GL_EXT_framebuffer_blit", extStart, extEnd); if (glewExperimental || GLEW_EXT_framebuffer_blit) CONST_CAST(GLEW_EXT_framebuffer_blit) = !_glewInit_GL_EXT_framebuffer_blit(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_EXT_framebuffer_blit */ #ifdef GL_EXT_framebuffer_multisample CONST_CAST(GLEW_EXT_framebuffer_multisample) = _glewSearchExtension("GL_EXT_framebuffer_multisample", extStart, extEnd); if (glewExperimental || GLEW_EXT_framebuffer_multisample) CONST_CAST(GLEW_EXT_framebuffer_multisample) = !_glewInit_GL_EXT_framebuffer_multisample(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_EXT_framebuffer_multisample */ #ifdef GL_EXT_framebuffer_multisample_blit_scaled CONST_CAST(GLEW_EXT_framebuffer_multisample_blit_scaled) = _glewSearchExtension("GL_EXT_framebuffer_multisample_blit_scaled", extStart, extEnd); #endif /* GL_EXT_framebuffer_multisample_blit_scaled */ #ifdef GL_EXT_framebuffer_object CONST_CAST(GLEW_EXT_framebuffer_object) = _glewSearchExtension("GL_EXT_framebuffer_object", extStart, extEnd); if (glewExperimental || GLEW_EXT_framebuffer_object) CONST_CAST(GLEW_EXT_framebuffer_object) = !_glewInit_GL_EXT_framebuffer_object(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_EXT_framebuffer_object */ #ifdef GL_EXT_framebuffer_sRGB CONST_CAST(GLEW_EXT_framebuffer_sRGB) = _glewSearchExtension("GL_EXT_framebuffer_sRGB", extStart, extEnd); #endif /* GL_EXT_framebuffer_sRGB */ #ifdef GL_EXT_geometry_shader4 CONST_CAST(GLEW_EXT_geometry_shader4) = _glewSearchExtension("GL_EXT_geometry_shader4", extStart, extEnd); if (glewExperimental || GLEW_EXT_geometry_shader4) CONST_CAST(GLEW_EXT_geometry_shader4) = !_glewInit_GL_EXT_geometry_shader4(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_EXT_geometry_shader4 */ #ifdef GL_EXT_gpu_program_parameters CONST_CAST(GLEW_EXT_gpu_program_parameters) = _glewSearchExtension("GL_EXT_gpu_program_parameters", extStart, extEnd); if (glewExperimental || GLEW_EXT_gpu_program_parameters) CONST_CAST(GLEW_EXT_gpu_program_parameters) = !_glewInit_GL_EXT_gpu_program_parameters(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_EXT_gpu_program_parameters */ #ifdef GL_EXT_gpu_shader4 CONST_CAST(GLEW_EXT_gpu_shader4) = _glewSearchExtension("GL_EXT_gpu_shader4", extStart, extEnd); if (glewExperimental || GLEW_EXT_gpu_shader4) CONST_CAST(GLEW_EXT_gpu_shader4) = !_glewInit_GL_EXT_gpu_shader4(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_EXT_gpu_shader4 */ #ifdef GL_EXT_histogram CONST_CAST(GLEW_EXT_histogram) = _glewSearchExtension("GL_EXT_histogram", extStart, extEnd); if (glewExperimental || GLEW_EXT_histogram) CONST_CAST(GLEW_EXT_histogram) = !_glewInit_GL_EXT_histogram(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_EXT_histogram */ #ifdef GL_EXT_index_array_formats CONST_CAST(GLEW_EXT_index_array_formats) = _glewSearchExtension("GL_EXT_index_array_formats", extStart, extEnd); #endif /* GL_EXT_index_array_formats */ #ifdef GL_EXT_index_func CONST_CAST(GLEW_EXT_index_func) = _glewSearchExtension("GL_EXT_index_func", extStart, extEnd); if (glewExperimental || GLEW_EXT_index_func) CONST_CAST(GLEW_EXT_index_func) = !_glewInit_GL_EXT_index_func(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_EXT_index_func */ #ifdef GL_EXT_index_material CONST_CAST(GLEW_EXT_index_material) = _glewSearchExtension("GL_EXT_index_material", extStart, extEnd); if (glewExperimental || GLEW_EXT_index_material) CONST_CAST(GLEW_EXT_index_material) = !_glewInit_GL_EXT_index_material(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_EXT_index_material */ #ifdef GL_EXT_index_texture CONST_CAST(GLEW_EXT_index_texture) = _glewSearchExtension("GL_EXT_index_texture", extStart, extEnd); #endif /* GL_EXT_index_texture */ #ifdef GL_EXT_light_texture CONST_CAST(GLEW_EXT_light_texture) = _glewSearchExtension("GL_EXT_light_texture", extStart, extEnd); if (glewExperimental || GLEW_EXT_light_texture) CONST_CAST(GLEW_EXT_light_texture) = !_glewInit_GL_EXT_light_texture(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_EXT_light_texture */ #ifdef GL_EXT_misc_attribute CONST_CAST(GLEW_EXT_misc_attribute) = _glewSearchExtension("GL_EXT_misc_attribute", extStart, extEnd); #endif /* GL_EXT_misc_attribute */ #ifdef GL_EXT_multi_draw_arrays CONST_CAST(GLEW_EXT_multi_draw_arrays) = _glewSearchExtension("GL_EXT_multi_draw_arrays", extStart, extEnd); if (glewExperimental || GLEW_EXT_multi_draw_arrays) CONST_CAST(GLEW_EXT_multi_draw_arrays) = !_glewInit_GL_EXT_multi_draw_arrays(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_EXT_multi_draw_arrays */ #ifdef GL_EXT_multisample CONST_CAST(GLEW_EXT_multisample) = _glewSearchExtension("GL_EXT_multisample", extStart, extEnd); if (glewExperimental || GLEW_EXT_multisample) CONST_CAST(GLEW_EXT_multisample) = !_glewInit_GL_EXT_multisample(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_EXT_multisample */ #ifdef GL_EXT_packed_depth_stencil CONST_CAST(GLEW_EXT_packed_depth_stencil) = _glewSearchExtension("GL_EXT_packed_depth_stencil", extStart, extEnd); #endif /* GL_EXT_packed_depth_stencil */ #ifdef GL_EXT_packed_float CONST_CAST(GLEW_EXT_packed_float) = _glewSearchExtension("GL_EXT_packed_float", extStart, extEnd); #endif /* GL_EXT_packed_float */ #ifdef GL_EXT_packed_pixels CONST_CAST(GLEW_EXT_packed_pixels) = _glewSearchExtension("GL_EXT_packed_pixels", extStart, extEnd); #endif /* GL_EXT_packed_pixels */ #ifdef GL_EXT_paletted_texture CONST_CAST(GLEW_EXT_paletted_texture) = _glewSearchExtension("GL_EXT_paletted_texture", extStart, extEnd); if (glewExperimental || GLEW_EXT_paletted_texture) CONST_CAST(GLEW_EXT_paletted_texture) = !_glewInit_GL_EXT_paletted_texture(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_EXT_paletted_texture */ #ifdef GL_EXT_pixel_buffer_object CONST_CAST(GLEW_EXT_pixel_buffer_object) = _glewSearchExtension("GL_EXT_pixel_buffer_object", extStart, extEnd); #endif /* GL_EXT_pixel_buffer_object */ #ifdef GL_EXT_pixel_transform CONST_CAST(GLEW_EXT_pixel_transform) = _glewSearchExtension("GL_EXT_pixel_transform", extStart, extEnd); if (glewExperimental || GLEW_EXT_pixel_transform) CONST_CAST(GLEW_EXT_pixel_transform) = !_glewInit_GL_EXT_pixel_transform(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_EXT_pixel_transform */ #ifdef GL_EXT_pixel_transform_color_table CONST_CAST(GLEW_EXT_pixel_transform_color_table) = _glewSearchExtension("GL_EXT_pixel_transform_color_table", extStart, extEnd); #endif /* GL_EXT_pixel_transform_color_table */ #ifdef GL_EXT_point_parameters CONST_CAST(GLEW_EXT_point_parameters) = _glewSearchExtension("GL_EXT_point_parameters", extStart, extEnd); if (glewExperimental || GLEW_EXT_point_parameters) CONST_CAST(GLEW_EXT_point_parameters) = !_glewInit_GL_EXT_point_parameters(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_EXT_point_parameters */ #ifdef GL_EXT_polygon_offset CONST_CAST(GLEW_EXT_polygon_offset) = _glewSearchExtension("GL_EXT_polygon_offset", extStart, extEnd); if (glewExperimental || GLEW_EXT_polygon_offset) CONST_CAST(GLEW_EXT_polygon_offset) = !_glewInit_GL_EXT_polygon_offset(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_EXT_polygon_offset */ #ifdef GL_EXT_provoking_vertex CONST_CAST(GLEW_EXT_provoking_vertex) = _glewSearchExtension("GL_EXT_provoking_vertex", extStart, extEnd); if (glewExperimental || GLEW_EXT_provoking_vertex) CONST_CAST(GLEW_EXT_provoking_vertex) = !_glewInit_GL_EXT_provoking_vertex(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_EXT_provoking_vertex */ #ifdef GL_EXT_rescale_normal CONST_CAST(GLEW_EXT_rescale_normal) = _glewSearchExtension("GL_EXT_rescale_normal", extStart, extEnd); #endif /* GL_EXT_rescale_normal */ #ifdef GL_EXT_scene_marker CONST_CAST(GLEW_EXT_scene_marker) = _glewSearchExtension("GL_EXT_scene_marker", extStart, extEnd); if (glewExperimental || GLEW_EXT_scene_marker) CONST_CAST(GLEW_EXT_scene_marker) = !_glewInit_GL_EXT_scene_marker(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_EXT_scene_marker */ #ifdef GL_EXT_secondary_color CONST_CAST(GLEW_EXT_secondary_color) = _glewSearchExtension("GL_EXT_secondary_color", extStart, extEnd); if (glewExperimental || GLEW_EXT_secondary_color) CONST_CAST(GLEW_EXT_secondary_color) = !_glewInit_GL_EXT_secondary_color(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_EXT_secondary_color */ #ifdef GL_EXT_separate_shader_objects CONST_CAST(GLEW_EXT_separate_shader_objects) = _glewSearchExtension("GL_EXT_separate_shader_objects", extStart, extEnd); if (glewExperimental || GLEW_EXT_separate_shader_objects) CONST_CAST(GLEW_EXT_separate_shader_objects) = !_glewInit_GL_EXT_separate_shader_objects(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_EXT_separate_shader_objects */ #ifdef GL_EXT_separate_specular_color CONST_CAST(GLEW_EXT_separate_specular_color) = _glewSearchExtension("GL_EXT_separate_specular_color", extStart, extEnd); #endif /* GL_EXT_separate_specular_color */ #ifdef GL_EXT_shader_image_load_store CONST_CAST(GLEW_EXT_shader_image_load_store) = _glewSearchExtension("GL_EXT_shader_image_load_store", extStart, extEnd); if (glewExperimental || GLEW_EXT_shader_image_load_store) CONST_CAST(GLEW_EXT_shader_image_load_store) = !_glewInit_GL_EXT_shader_image_load_store(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_EXT_shader_image_load_store */ #ifdef GL_EXT_shadow_funcs CONST_CAST(GLEW_EXT_shadow_funcs) = _glewSearchExtension("GL_EXT_shadow_funcs", extStart, extEnd); #endif /* GL_EXT_shadow_funcs */ #ifdef GL_EXT_shared_texture_palette CONST_CAST(GLEW_EXT_shared_texture_palette) = _glewSearchExtension("GL_EXT_shared_texture_palette", extStart, extEnd); #endif /* GL_EXT_shared_texture_palette */ #ifdef GL_EXT_stencil_clear_tag CONST_CAST(GLEW_EXT_stencil_clear_tag) = _glewSearchExtension("GL_EXT_stencil_clear_tag", extStart, extEnd); #endif /* GL_EXT_stencil_clear_tag */ #ifdef GL_EXT_stencil_two_side CONST_CAST(GLEW_EXT_stencil_two_side) = _glewSearchExtension("GL_EXT_stencil_two_side", extStart, extEnd); if (glewExperimental || GLEW_EXT_stencil_two_side) CONST_CAST(GLEW_EXT_stencil_two_side) = !_glewInit_GL_EXT_stencil_two_side(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_EXT_stencil_two_side */ #ifdef GL_EXT_stencil_wrap CONST_CAST(GLEW_EXT_stencil_wrap) = _glewSearchExtension("GL_EXT_stencil_wrap", extStart, extEnd); #endif /* GL_EXT_stencil_wrap */ #ifdef GL_EXT_subtexture CONST_CAST(GLEW_EXT_subtexture) = _glewSearchExtension("GL_EXT_subtexture", extStart, extEnd); if (glewExperimental || GLEW_EXT_subtexture) CONST_CAST(GLEW_EXT_subtexture) = !_glewInit_GL_EXT_subtexture(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_EXT_subtexture */ #ifdef GL_EXT_texture CONST_CAST(GLEW_EXT_texture) = _glewSearchExtension("GL_EXT_texture", extStart, extEnd); #endif /* GL_EXT_texture */ #ifdef GL_EXT_texture3D CONST_CAST(GLEW_EXT_texture3D) = _glewSearchExtension("GL_EXT_texture3D", extStart, extEnd); if (glewExperimental || GLEW_EXT_texture3D) CONST_CAST(GLEW_EXT_texture3D) = !_glewInit_GL_EXT_texture3D(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_EXT_texture3D */ #ifdef GL_EXT_texture_array CONST_CAST(GLEW_EXT_texture_array) = _glewSearchExtension("GL_EXT_texture_array", extStart, extEnd); if (glewExperimental || GLEW_EXT_texture_array) CONST_CAST(GLEW_EXT_texture_array) = !_glewInit_GL_EXT_texture_array(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_EXT_texture_array */ #ifdef GL_EXT_texture_buffer_object CONST_CAST(GLEW_EXT_texture_buffer_object) = _glewSearchExtension("GL_EXT_texture_buffer_object", extStart, extEnd); if (glewExperimental || GLEW_EXT_texture_buffer_object) CONST_CAST(GLEW_EXT_texture_buffer_object) = !_glewInit_GL_EXT_texture_buffer_object(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_EXT_texture_buffer_object */ #ifdef GL_EXT_texture_compression_dxt1 CONST_CAST(GLEW_EXT_texture_compression_dxt1) = _glewSearchExtension("GL_EXT_texture_compression_dxt1", extStart, extEnd); #endif /* GL_EXT_texture_compression_dxt1 */ #ifdef GL_EXT_texture_compression_latc CONST_CAST(GLEW_EXT_texture_compression_latc) = _glewSearchExtension("GL_EXT_texture_compression_latc", extStart, extEnd); #endif /* GL_EXT_texture_compression_latc */ #ifdef GL_EXT_texture_compression_rgtc CONST_CAST(GLEW_EXT_texture_compression_rgtc) = _glewSearchExtension("GL_EXT_texture_compression_rgtc", extStart, extEnd); #endif /* GL_EXT_texture_compression_rgtc */ #ifdef GL_EXT_texture_compression_s3tc CONST_CAST(GLEW_EXT_texture_compression_s3tc) = _glewSearchExtension("GL_EXT_texture_compression_s3tc", extStart, extEnd); #endif /* GL_EXT_texture_compression_s3tc */ #ifdef GL_EXT_texture_cube_map CONST_CAST(GLEW_EXT_texture_cube_map) = _glewSearchExtension("GL_EXT_texture_cube_map", extStart, extEnd); #endif /* GL_EXT_texture_cube_map */ #ifdef GL_EXT_texture_edge_clamp CONST_CAST(GLEW_EXT_texture_edge_clamp) = _glewSearchExtension("GL_EXT_texture_edge_clamp", extStart, extEnd); #endif /* GL_EXT_texture_edge_clamp */ #ifdef GL_EXT_texture_env CONST_CAST(GLEW_EXT_texture_env) = _glewSearchExtension("GL_EXT_texture_env", extStart, extEnd); #endif /* GL_EXT_texture_env */ #ifdef GL_EXT_texture_env_add CONST_CAST(GLEW_EXT_texture_env_add) = _glewSearchExtension("GL_EXT_texture_env_add", extStart, extEnd); #endif /* GL_EXT_texture_env_add */ #ifdef GL_EXT_texture_env_combine CONST_CAST(GLEW_EXT_texture_env_combine) = _glewSearchExtension("GL_EXT_texture_env_combine", extStart, extEnd); #endif /* GL_EXT_texture_env_combine */ #ifdef GL_EXT_texture_env_dot3 CONST_CAST(GLEW_EXT_texture_env_dot3) = _glewSearchExtension("GL_EXT_texture_env_dot3", extStart, extEnd); #endif /* GL_EXT_texture_env_dot3 */ #ifdef GL_EXT_texture_filter_anisotropic CONST_CAST(GLEW_EXT_texture_filter_anisotropic) = _glewSearchExtension("GL_EXT_texture_filter_anisotropic", extStart, extEnd); #endif /* GL_EXT_texture_filter_anisotropic */ #ifdef GL_EXT_texture_integer CONST_CAST(GLEW_EXT_texture_integer) = _glewSearchExtension("GL_EXT_texture_integer", extStart, extEnd); if (glewExperimental || GLEW_EXT_texture_integer) CONST_CAST(GLEW_EXT_texture_integer) = !_glewInit_GL_EXT_texture_integer(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_EXT_texture_integer */ #ifdef GL_EXT_texture_lod_bias CONST_CAST(GLEW_EXT_texture_lod_bias) = _glewSearchExtension("GL_EXT_texture_lod_bias", extStart, extEnd); #endif /* GL_EXT_texture_lod_bias */ #ifdef GL_EXT_texture_mirror_clamp CONST_CAST(GLEW_EXT_texture_mirror_clamp) = _glewSearchExtension("GL_EXT_texture_mirror_clamp", extStart, extEnd); #endif /* GL_EXT_texture_mirror_clamp */ #ifdef GL_EXT_texture_object CONST_CAST(GLEW_EXT_texture_object) = _glewSearchExtension("GL_EXT_texture_object", extStart, extEnd); if (glewExperimental || GLEW_EXT_texture_object) CONST_CAST(GLEW_EXT_texture_object) = !_glewInit_GL_EXT_texture_object(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_EXT_texture_object */ #ifdef GL_EXT_texture_perturb_normal CONST_CAST(GLEW_EXT_texture_perturb_normal) = _glewSearchExtension("GL_EXT_texture_perturb_normal", extStart, extEnd); if (glewExperimental || GLEW_EXT_texture_perturb_normal) CONST_CAST(GLEW_EXT_texture_perturb_normal) = !_glewInit_GL_EXT_texture_perturb_normal(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_EXT_texture_perturb_normal */ #ifdef GL_EXT_texture_rectangle CONST_CAST(GLEW_EXT_texture_rectangle) = _glewSearchExtension("GL_EXT_texture_rectangle", extStart, extEnd); #endif /* GL_EXT_texture_rectangle */ #ifdef GL_EXT_texture_sRGB CONST_CAST(GLEW_EXT_texture_sRGB) = _glewSearchExtension("GL_EXT_texture_sRGB", extStart, extEnd); #endif /* GL_EXT_texture_sRGB */ #ifdef GL_EXT_texture_sRGB_decode CONST_CAST(GLEW_EXT_texture_sRGB_decode) = _glewSearchExtension("GL_EXT_texture_sRGB_decode", extStart, extEnd); #endif /* GL_EXT_texture_sRGB_decode */ #ifdef GL_EXT_texture_shared_exponent CONST_CAST(GLEW_EXT_texture_shared_exponent) = _glewSearchExtension("GL_EXT_texture_shared_exponent", extStart, extEnd); #endif /* GL_EXT_texture_shared_exponent */ #ifdef GL_EXT_texture_snorm CONST_CAST(GLEW_EXT_texture_snorm) = _glewSearchExtension("GL_EXT_texture_snorm", extStart, extEnd); #endif /* GL_EXT_texture_snorm */ #ifdef GL_EXT_texture_swizzle CONST_CAST(GLEW_EXT_texture_swizzle) = _glewSearchExtension("GL_EXT_texture_swizzle", extStart, extEnd); #endif /* GL_EXT_texture_swizzle */ #ifdef GL_EXT_timer_query CONST_CAST(GLEW_EXT_timer_query) = _glewSearchExtension("GL_EXT_timer_query", extStart, extEnd); if (glewExperimental || GLEW_EXT_timer_query) CONST_CAST(GLEW_EXT_timer_query) = !_glewInit_GL_EXT_timer_query(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_EXT_timer_query */ #ifdef GL_EXT_transform_feedback CONST_CAST(GLEW_EXT_transform_feedback) = _glewSearchExtension("GL_EXT_transform_feedback", extStart, extEnd); if (glewExperimental || GLEW_EXT_transform_feedback) CONST_CAST(GLEW_EXT_transform_feedback) = !_glewInit_GL_EXT_transform_feedback(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_EXT_transform_feedback */ #ifdef GL_EXT_vertex_array CONST_CAST(GLEW_EXT_vertex_array) = _glewSearchExtension("GL_EXT_vertex_array", extStart, extEnd); if (glewExperimental || GLEW_EXT_vertex_array) CONST_CAST(GLEW_EXT_vertex_array) = !_glewInit_GL_EXT_vertex_array(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_EXT_vertex_array */ #ifdef GL_EXT_vertex_array_bgra CONST_CAST(GLEW_EXT_vertex_array_bgra) = _glewSearchExtension("GL_EXT_vertex_array_bgra", extStart, extEnd); #endif /* GL_EXT_vertex_array_bgra */ #ifdef GL_EXT_vertex_attrib_64bit CONST_CAST(GLEW_EXT_vertex_attrib_64bit) = _glewSearchExtension("GL_EXT_vertex_attrib_64bit", extStart, extEnd); if (glewExperimental || GLEW_EXT_vertex_attrib_64bit) CONST_CAST(GLEW_EXT_vertex_attrib_64bit) = !_glewInit_GL_EXT_vertex_attrib_64bit(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_EXT_vertex_attrib_64bit */ #ifdef GL_EXT_vertex_shader CONST_CAST(GLEW_EXT_vertex_shader) = _glewSearchExtension("GL_EXT_vertex_shader", extStart, extEnd); if (glewExperimental || GLEW_EXT_vertex_shader) CONST_CAST(GLEW_EXT_vertex_shader) = !_glewInit_GL_EXT_vertex_shader(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_EXT_vertex_shader */ #ifdef GL_EXT_vertex_weighting CONST_CAST(GLEW_EXT_vertex_weighting) = _glewSearchExtension("GL_EXT_vertex_weighting", extStart, extEnd); if (glewExperimental || GLEW_EXT_vertex_weighting) CONST_CAST(GLEW_EXT_vertex_weighting) = !_glewInit_GL_EXT_vertex_weighting(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_EXT_vertex_weighting */ #ifdef GL_EXT_x11_sync_object CONST_CAST(GLEW_EXT_x11_sync_object) = _glewSearchExtension("GL_EXT_x11_sync_object", extStart, extEnd); if (glewExperimental || GLEW_EXT_x11_sync_object) CONST_CAST(GLEW_EXT_x11_sync_object) = !_glewInit_GL_EXT_x11_sync_object(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_EXT_x11_sync_object */ #ifdef GL_GREMEDY_frame_terminator CONST_CAST(GLEW_GREMEDY_frame_terminator) = _glewSearchExtension("GL_GREMEDY_frame_terminator", extStart, extEnd); if (glewExperimental || GLEW_GREMEDY_frame_terminator) CONST_CAST(GLEW_GREMEDY_frame_terminator) = !_glewInit_GL_GREMEDY_frame_terminator(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_GREMEDY_frame_terminator */ #ifdef GL_GREMEDY_string_marker CONST_CAST(GLEW_GREMEDY_string_marker) = _glewSearchExtension("GL_GREMEDY_string_marker", extStart, extEnd); if (glewExperimental || GLEW_GREMEDY_string_marker) CONST_CAST(GLEW_GREMEDY_string_marker) = !_glewInit_GL_GREMEDY_string_marker(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_GREMEDY_string_marker */ #ifdef GL_HP_convolution_border_modes CONST_CAST(GLEW_HP_convolution_border_modes) = _glewSearchExtension("GL_HP_convolution_border_modes", extStart, extEnd); #endif /* GL_HP_convolution_border_modes */ #ifdef GL_HP_image_transform CONST_CAST(GLEW_HP_image_transform) = _glewSearchExtension("GL_HP_image_transform", extStart, extEnd); if (glewExperimental || GLEW_HP_image_transform) CONST_CAST(GLEW_HP_image_transform) = !_glewInit_GL_HP_image_transform(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_HP_image_transform */ #ifdef GL_HP_occlusion_test CONST_CAST(GLEW_HP_occlusion_test) = _glewSearchExtension("GL_HP_occlusion_test", extStart, extEnd); #endif /* GL_HP_occlusion_test */ #ifdef GL_HP_texture_lighting CONST_CAST(GLEW_HP_texture_lighting) = _glewSearchExtension("GL_HP_texture_lighting", extStart, extEnd); #endif /* GL_HP_texture_lighting */ #ifdef GL_IBM_cull_vertex CONST_CAST(GLEW_IBM_cull_vertex) = _glewSearchExtension("GL_IBM_cull_vertex", extStart, extEnd); #endif /* GL_IBM_cull_vertex */ #ifdef GL_IBM_multimode_draw_arrays CONST_CAST(GLEW_IBM_multimode_draw_arrays) = _glewSearchExtension("GL_IBM_multimode_draw_arrays", extStart, extEnd); if (glewExperimental || GLEW_IBM_multimode_draw_arrays) CONST_CAST(GLEW_IBM_multimode_draw_arrays) = !_glewInit_GL_IBM_multimode_draw_arrays(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_IBM_multimode_draw_arrays */ #ifdef GL_IBM_rasterpos_clip CONST_CAST(GLEW_IBM_rasterpos_clip) = _glewSearchExtension("GL_IBM_rasterpos_clip", extStart, extEnd); #endif /* GL_IBM_rasterpos_clip */ #ifdef GL_IBM_static_data CONST_CAST(GLEW_IBM_static_data) = _glewSearchExtension("GL_IBM_static_data", extStart, extEnd); #endif /* GL_IBM_static_data */ #ifdef GL_IBM_texture_mirrored_repeat CONST_CAST(GLEW_IBM_texture_mirrored_repeat) = _glewSearchExtension("GL_IBM_texture_mirrored_repeat", extStart, extEnd); #endif /* GL_IBM_texture_mirrored_repeat */ #ifdef GL_IBM_vertex_array_lists CONST_CAST(GLEW_IBM_vertex_array_lists) = _glewSearchExtension("GL_IBM_vertex_array_lists", extStart, extEnd); if (glewExperimental || GLEW_IBM_vertex_array_lists) CONST_CAST(GLEW_IBM_vertex_array_lists) = !_glewInit_GL_IBM_vertex_array_lists(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_IBM_vertex_array_lists */ #ifdef GL_INGR_color_clamp CONST_CAST(GLEW_INGR_color_clamp) = _glewSearchExtension("GL_INGR_color_clamp", extStart, extEnd); #endif /* GL_INGR_color_clamp */ #ifdef GL_INGR_interlace_read CONST_CAST(GLEW_INGR_interlace_read) = _glewSearchExtension("GL_INGR_interlace_read", extStart, extEnd); #endif /* GL_INGR_interlace_read */ #ifdef GL_INTEL_parallel_arrays CONST_CAST(GLEW_INTEL_parallel_arrays) = _glewSearchExtension("GL_INTEL_parallel_arrays", extStart, extEnd); if (glewExperimental || GLEW_INTEL_parallel_arrays) CONST_CAST(GLEW_INTEL_parallel_arrays) = !_glewInit_GL_INTEL_parallel_arrays(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_INTEL_parallel_arrays */ #ifdef GL_INTEL_texture_scissor CONST_CAST(GLEW_INTEL_texture_scissor) = _glewSearchExtension("GL_INTEL_texture_scissor", extStart, extEnd); if (glewExperimental || GLEW_INTEL_texture_scissor) CONST_CAST(GLEW_INTEL_texture_scissor) = !_glewInit_GL_INTEL_texture_scissor(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_INTEL_texture_scissor */ #ifdef GL_KHR_debug CONST_CAST(GLEW_KHR_debug) = _glewSearchExtension("GL_KHR_debug", extStart, extEnd); if (glewExperimental || GLEW_KHR_debug) CONST_CAST(GLEW_KHR_debug) = !_glewInit_GL_KHR_debug(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_KHR_debug */ #ifdef GL_KHR_texture_compression_astc_ldr CONST_CAST(GLEW_KHR_texture_compression_astc_ldr) = _glewSearchExtension("GL_KHR_texture_compression_astc_ldr", extStart, extEnd); #endif /* GL_KHR_texture_compression_astc_ldr */ #ifdef GL_KTX_buffer_region CONST_CAST(GLEW_KTX_buffer_region) = _glewSearchExtension("GL_KTX_buffer_region", extStart, extEnd); if (glewExperimental || GLEW_KTX_buffer_region) CONST_CAST(GLEW_KTX_buffer_region) = !_glewInit_GL_KTX_buffer_region(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_KTX_buffer_region */ #ifdef GL_MESAX_texture_stack CONST_CAST(GLEW_MESAX_texture_stack) = _glewSearchExtension("GL_MESAX_texture_stack", extStart, extEnd); #endif /* GL_MESAX_texture_stack */ #ifdef GL_MESA_pack_invert CONST_CAST(GLEW_MESA_pack_invert) = _glewSearchExtension("GL_MESA_pack_invert", extStart, extEnd); #endif /* GL_MESA_pack_invert */ #ifdef GL_MESA_resize_buffers CONST_CAST(GLEW_MESA_resize_buffers) = _glewSearchExtension("GL_MESA_resize_buffers", extStart, extEnd); if (glewExperimental || GLEW_MESA_resize_buffers) CONST_CAST(GLEW_MESA_resize_buffers) = !_glewInit_GL_MESA_resize_buffers(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_MESA_resize_buffers */ #ifdef GL_MESA_window_pos CONST_CAST(GLEW_MESA_window_pos) = _glewSearchExtension("GL_MESA_window_pos", extStart, extEnd); if (glewExperimental || GLEW_MESA_window_pos) CONST_CAST(GLEW_MESA_window_pos) = !_glewInit_GL_MESA_window_pos(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_MESA_window_pos */ #ifdef GL_MESA_ycbcr_texture CONST_CAST(GLEW_MESA_ycbcr_texture) = _glewSearchExtension("GL_MESA_ycbcr_texture", extStart, extEnd); #endif /* GL_MESA_ycbcr_texture */ #ifdef GL_NVX_gpu_memory_info CONST_CAST(GLEW_NVX_gpu_memory_info) = _glewSearchExtension("GL_NVX_gpu_memory_info", extStart, extEnd); #endif /* GL_NVX_gpu_memory_info */ #ifdef GL_NV_bindless_texture CONST_CAST(GLEW_NV_bindless_texture) = _glewSearchExtension("GL_NV_bindless_texture", extStart, extEnd); if (glewExperimental || GLEW_NV_bindless_texture) CONST_CAST(GLEW_NV_bindless_texture) = !_glewInit_GL_NV_bindless_texture(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_NV_bindless_texture */ #ifdef GL_NV_blend_square CONST_CAST(GLEW_NV_blend_square) = _glewSearchExtension("GL_NV_blend_square", extStart, extEnd); #endif /* GL_NV_blend_square */ #ifdef GL_NV_conditional_render CONST_CAST(GLEW_NV_conditional_render) = _glewSearchExtension("GL_NV_conditional_render", extStart, extEnd); if (glewExperimental || GLEW_NV_conditional_render) CONST_CAST(GLEW_NV_conditional_render) = !_glewInit_GL_NV_conditional_render(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_NV_conditional_render */ #ifdef GL_NV_copy_depth_to_color CONST_CAST(GLEW_NV_copy_depth_to_color) = _glewSearchExtension("GL_NV_copy_depth_to_color", extStart, extEnd); #endif /* GL_NV_copy_depth_to_color */ #ifdef GL_NV_copy_image CONST_CAST(GLEW_NV_copy_image) = _glewSearchExtension("GL_NV_copy_image", extStart, extEnd); if (glewExperimental || GLEW_NV_copy_image) CONST_CAST(GLEW_NV_copy_image) = !_glewInit_GL_NV_copy_image(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_NV_copy_image */ #ifdef GL_NV_depth_buffer_float CONST_CAST(GLEW_NV_depth_buffer_float) = _glewSearchExtension("GL_NV_depth_buffer_float", extStart, extEnd); if (glewExperimental || GLEW_NV_depth_buffer_float) CONST_CAST(GLEW_NV_depth_buffer_float) = !_glewInit_GL_NV_depth_buffer_float(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_NV_depth_buffer_float */ #ifdef GL_NV_depth_clamp CONST_CAST(GLEW_NV_depth_clamp) = _glewSearchExtension("GL_NV_depth_clamp", extStart, extEnd); #endif /* GL_NV_depth_clamp */ #ifdef GL_NV_depth_range_unclamped CONST_CAST(GLEW_NV_depth_range_unclamped) = _glewSearchExtension("GL_NV_depth_range_unclamped", extStart, extEnd); #endif /* GL_NV_depth_range_unclamped */ #ifdef GL_NV_evaluators CONST_CAST(GLEW_NV_evaluators) = _glewSearchExtension("GL_NV_evaluators", extStart, extEnd); if (glewExperimental || GLEW_NV_evaluators) CONST_CAST(GLEW_NV_evaluators) = !_glewInit_GL_NV_evaluators(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_NV_evaluators */ #ifdef GL_NV_explicit_multisample CONST_CAST(GLEW_NV_explicit_multisample) = _glewSearchExtension("GL_NV_explicit_multisample", extStart, extEnd); if (glewExperimental || GLEW_NV_explicit_multisample) CONST_CAST(GLEW_NV_explicit_multisample) = !_glewInit_GL_NV_explicit_multisample(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_NV_explicit_multisample */ #ifdef GL_NV_fence CONST_CAST(GLEW_NV_fence) = _glewSearchExtension("GL_NV_fence", extStart, extEnd); if (glewExperimental || GLEW_NV_fence) CONST_CAST(GLEW_NV_fence) = !_glewInit_GL_NV_fence(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_NV_fence */ #ifdef GL_NV_float_buffer CONST_CAST(GLEW_NV_float_buffer) = _glewSearchExtension("GL_NV_float_buffer", extStart, extEnd); #endif /* GL_NV_float_buffer */ #ifdef GL_NV_fog_distance CONST_CAST(GLEW_NV_fog_distance) = _glewSearchExtension("GL_NV_fog_distance", extStart, extEnd); #endif /* GL_NV_fog_distance */ #ifdef GL_NV_fragment_program CONST_CAST(GLEW_NV_fragment_program) = _glewSearchExtension("GL_NV_fragment_program", extStart, extEnd); if (glewExperimental || GLEW_NV_fragment_program) CONST_CAST(GLEW_NV_fragment_program) = !_glewInit_GL_NV_fragment_program(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_NV_fragment_program */ #ifdef GL_NV_fragment_program2 CONST_CAST(GLEW_NV_fragment_program2) = _glewSearchExtension("GL_NV_fragment_program2", extStart, extEnd); #endif /* GL_NV_fragment_program2 */ #ifdef GL_NV_fragment_program4 CONST_CAST(GLEW_NV_fragment_program4) = _glewSearchExtension("GL_NV_gpu_program4", extStart, extEnd); #endif /* GL_NV_fragment_program4 */ #ifdef GL_NV_fragment_program_option CONST_CAST(GLEW_NV_fragment_program_option) = _glewSearchExtension("GL_NV_fragment_program_option", extStart, extEnd); #endif /* GL_NV_fragment_program_option */ #ifdef GL_NV_framebuffer_multisample_coverage CONST_CAST(GLEW_NV_framebuffer_multisample_coverage) = _glewSearchExtension("GL_NV_framebuffer_multisample_coverage", extStart, extEnd); if (glewExperimental || GLEW_NV_framebuffer_multisample_coverage) CONST_CAST(GLEW_NV_framebuffer_multisample_coverage) = !_glewInit_GL_NV_framebuffer_multisample_coverage(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_NV_framebuffer_multisample_coverage */ #ifdef GL_NV_geometry_program4 CONST_CAST(GLEW_NV_geometry_program4) = _glewSearchExtension("GL_NV_gpu_program4", extStart, extEnd); if (glewExperimental || GLEW_NV_geometry_program4) CONST_CAST(GLEW_NV_geometry_program4) = !_glewInit_GL_NV_geometry_program4(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_NV_geometry_program4 */ #ifdef GL_NV_geometry_shader4 CONST_CAST(GLEW_NV_geometry_shader4) = _glewSearchExtension("GL_NV_geometry_shader4", extStart, extEnd); #endif /* GL_NV_geometry_shader4 */ #ifdef GL_NV_gpu_program4 CONST_CAST(GLEW_NV_gpu_program4) = _glewSearchExtension("GL_NV_gpu_program4", extStart, extEnd); if (glewExperimental || GLEW_NV_gpu_program4) CONST_CAST(GLEW_NV_gpu_program4) = !_glewInit_GL_NV_gpu_program4(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_NV_gpu_program4 */ #ifdef GL_NV_gpu_program5 CONST_CAST(GLEW_NV_gpu_program5) = _glewSearchExtension("GL_NV_gpu_program5", extStart, extEnd); #endif /* GL_NV_gpu_program5 */ #ifdef GL_NV_gpu_program_fp64 CONST_CAST(GLEW_NV_gpu_program_fp64) = _glewSearchExtension("GL_NV_gpu_program_fp64", extStart, extEnd); #endif /* GL_NV_gpu_program_fp64 */ #ifdef GL_NV_gpu_shader5 CONST_CAST(GLEW_NV_gpu_shader5) = _glewSearchExtension("GL_NV_gpu_shader5", extStart, extEnd); if (glewExperimental || GLEW_NV_gpu_shader5) CONST_CAST(GLEW_NV_gpu_shader5) = !_glewInit_GL_NV_gpu_shader5(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_NV_gpu_shader5 */ #ifdef GL_NV_half_float CONST_CAST(GLEW_NV_half_float) = _glewSearchExtension("GL_NV_half_float", extStart, extEnd); if (glewExperimental || GLEW_NV_half_float) CONST_CAST(GLEW_NV_half_float) = !_glewInit_GL_NV_half_float(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_NV_half_float */ #ifdef GL_NV_light_max_exponent CONST_CAST(GLEW_NV_light_max_exponent) = _glewSearchExtension("GL_NV_light_max_exponent", extStart, extEnd); #endif /* GL_NV_light_max_exponent */ #ifdef GL_NV_multisample_coverage CONST_CAST(GLEW_NV_multisample_coverage) = _glewSearchExtension("GL_NV_multisample_coverage", extStart, extEnd); #endif /* GL_NV_multisample_coverage */ #ifdef GL_NV_multisample_filter_hint CONST_CAST(GLEW_NV_multisample_filter_hint) = _glewSearchExtension("GL_NV_multisample_filter_hint", extStart, extEnd); #endif /* GL_NV_multisample_filter_hint */ #ifdef GL_NV_occlusion_query CONST_CAST(GLEW_NV_occlusion_query) = _glewSearchExtension("GL_NV_occlusion_query", extStart, extEnd); if (glewExperimental || GLEW_NV_occlusion_query) CONST_CAST(GLEW_NV_occlusion_query) = !_glewInit_GL_NV_occlusion_query(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_NV_occlusion_query */ #ifdef GL_NV_packed_depth_stencil CONST_CAST(GLEW_NV_packed_depth_stencil) = _glewSearchExtension("GL_NV_packed_depth_stencil", extStart, extEnd); #endif /* GL_NV_packed_depth_stencil */ #ifdef GL_NV_parameter_buffer_object CONST_CAST(GLEW_NV_parameter_buffer_object) = _glewSearchExtension("GL_NV_parameter_buffer_object", extStart, extEnd); if (glewExperimental || GLEW_NV_parameter_buffer_object) CONST_CAST(GLEW_NV_parameter_buffer_object) = !_glewInit_GL_NV_parameter_buffer_object(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_NV_parameter_buffer_object */ #ifdef GL_NV_parameter_buffer_object2 CONST_CAST(GLEW_NV_parameter_buffer_object2) = _glewSearchExtension("GL_NV_parameter_buffer_object2", extStart, extEnd); #endif /* GL_NV_parameter_buffer_object2 */ #ifdef GL_NV_path_rendering CONST_CAST(GLEW_NV_path_rendering) = _glewSearchExtension("GL_NV_path_rendering", extStart, extEnd); if (glewExperimental || GLEW_NV_path_rendering) CONST_CAST(GLEW_NV_path_rendering) = !_glewInit_GL_NV_path_rendering(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_NV_path_rendering */ #ifdef GL_NV_pixel_data_range CONST_CAST(GLEW_NV_pixel_data_range) = _glewSearchExtension("GL_NV_pixel_data_range", extStart, extEnd); if (glewExperimental || GLEW_NV_pixel_data_range) CONST_CAST(GLEW_NV_pixel_data_range) = !_glewInit_GL_NV_pixel_data_range(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_NV_pixel_data_range */ #ifdef GL_NV_point_sprite CONST_CAST(GLEW_NV_point_sprite) = _glewSearchExtension("GL_NV_point_sprite", extStart, extEnd); if (glewExperimental || GLEW_NV_point_sprite) CONST_CAST(GLEW_NV_point_sprite) = !_glewInit_GL_NV_point_sprite(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_NV_point_sprite */ #ifdef GL_NV_present_video CONST_CAST(GLEW_NV_present_video) = _glewSearchExtension("GL_NV_present_video", extStart, extEnd); if (glewExperimental || GLEW_NV_present_video) CONST_CAST(GLEW_NV_present_video) = !_glewInit_GL_NV_present_video(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_NV_present_video */ #ifdef GL_NV_primitive_restart CONST_CAST(GLEW_NV_primitive_restart) = _glewSearchExtension("GL_NV_primitive_restart", extStart, extEnd); if (glewExperimental || GLEW_NV_primitive_restart) CONST_CAST(GLEW_NV_primitive_restart) = !_glewInit_GL_NV_primitive_restart(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_NV_primitive_restart */ #ifdef GL_NV_register_combiners CONST_CAST(GLEW_NV_register_combiners) = _glewSearchExtension("GL_NV_register_combiners", extStart, extEnd); if (glewExperimental || GLEW_NV_register_combiners) CONST_CAST(GLEW_NV_register_combiners) = !_glewInit_GL_NV_register_combiners(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_NV_register_combiners */ #ifdef GL_NV_register_combiners2 CONST_CAST(GLEW_NV_register_combiners2) = _glewSearchExtension("GL_NV_register_combiners2", extStart, extEnd); if (glewExperimental || GLEW_NV_register_combiners2) CONST_CAST(GLEW_NV_register_combiners2) = !_glewInit_GL_NV_register_combiners2(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_NV_register_combiners2 */ #ifdef GL_NV_shader_atomic_float CONST_CAST(GLEW_NV_shader_atomic_float) = _glewSearchExtension("GL_NV_shader_atomic_float", extStart, extEnd); #endif /* GL_NV_shader_atomic_float */ #ifdef GL_NV_shader_buffer_load CONST_CAST(GLEW_NV_shader_buffer_load) = _glewSearchExtension("GL_NV_shader_buffer_load", extStart, extEnd); if (glewExperimental || GLEW_NV_shader_buffer_load) CONST_CAST(GLEW_NV_shader_buffer_load) = !_glewInit_GL_NV_shader_buffer_load(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_NV_shader_buffer_load */ #ifdef GL_NV_tessellation_program5 CONST_CAST(GLEW_NV_tessellation_program5) = _glewSearchExtension("GL_NV_gpu_program5", extStart, extEnd); #endif /* GL_NV_tessellation_program5 */ #ifdef GL_NV_texgen_emboss CONST_CAST(GLEW_NV_texgen_emboss) = _glewSearchExtension("GL_NV_texgen_emboss", extStart, extEnd); #endif /* GL_NV_texgen_emboss */ #ifdef GL_NV_texgen_reflection CONST_CAST(GLEW_NV_texgen_reflection) = _glewSearchExtension("GL_NV_texgen_reflection", extStart, extEnd); #endif /* GL_NV_texgen_reflection */ #ifdef GL_NV_texture_barrier CONST_CAST(GLEW_NV_texture_barrier) = _glewSearchExtension("GL_NV_texture_barrier", extStart, extEnd); if (glewExperimental || GLEW_NV_texture_barrier) CONST_CAST(GLEW_NV_texture_barrier) = !_glewInit_GL_NV_texture_barrier(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_NV_texture_barrier */ #ifdef GL_NV_texture_compression_vtc CONST_CAST(GLEW_NV_texture_compression_vtc) = _glewSearchExtension("GL_NV_texture_compression_vtc", extStart, extEnd); #endif /* GL_NV_texture_compression_vtc */ #ifdef GL_NV_texture_env_combine4 CONST_CAST(GLEW_NV_texture_env_combine4) = _glewSearchExtension("GL_NV_texture_env_combine4", extStart, extEnd); #endif /* GL_NV_texture_env_combine4 */ #ifdef GL_NV_texture_expand_normal CONST_CAST(GLEW_NV_texture_expand_normal) = _glewSearchExtension("GL_NV_texture_expand_normal", extStart, extEnd); #endif /* GL_NV_texture_expand_normal */ #ifdef GL_NV_texture_multisample CONST_CAST(GLEW_NV_texture_multisample) = _glewSearchExtension("GL_NV_texture_multisample", extStart, extEnd); if (glewExperimental || GLEW_NV_texture_multisample) CONST_CAST(GLEW_NV_texture_multisample) = !_glewInit_GL_NV_texture_multisample(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_NV_texture_multisample */ #ifdef GL_NV_texture_rectangle CONST_CAST(GLEW_NV_texture_rectangle) = _glewSearchExtension("GL_NV_texture_rectangle", extStart, extEnd); #endif /* GL_NV_texture_rectangle */ #ifdef GL_NV_texture_shader CONST_CAST(GLEW_NV_texture_shader) = _glewSearchExtension("GL_NV_texture_shader", extStart, extEnd); #endif /* GL_NV_texture_shader */ #ifdef GL_NV_texture_shader2 CONST_CAST(GLEW_NV_texture_shader2) = _glewSearchExtension("GL_NV_texture_shader2", extStart, extEnd); #endif /* GL_NV_texture_shader2 */ #ifdef GL_NV_texture_shader3 CONST_CAST(GLEW_NV_texture_shader3) = _glewSearchExtension("GL_NV_texture_shader3", extStart, extEnd); #endif /* GL_NV_texture_shader3 */ #ifdef GL_NV_transform_feedback CONST_CAST(GLEW_NV_transform_feedback) = _glewSearchExtension("GL_NV_transform_feedback", extStart, extEnd); if (glewExperimental || GLEW_NV_transform_feedback) CONST_CAST(GLEW_NV_transform_feedback) = !_glewInit_GL_NV_transform_feedback(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_NV_transform_feedback */ #ifdef GL_NV_transform_feedback2 CONST_CAST(GLEW_NV_transform_feedback2) = _glewSearchExtension("GL_NV_transform_feedback2", extStart, extEnd); if (glewExperimental || GLEW_NV_transform_feedback2) CONST_CAST(GLEW_NV_transform_feedback2) = !_glewInit_GL_NV_transform_feedback2(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_NV_transform_feedback2 */ #ifdef GL_NV_vdpau_interop CONST_CAST(GLEW_NV_vdpau_interop) = _glewSearchExtension("GL_NV_vdpau_interop", extStart, extEnd); if (glewExperimental || GLEW_NV_vdpau_interop) CONST_CAST(GLEW_NV_vdpau_interop) = !_glewInit_GL_NV_vdpau_interop(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_NV_vdpau_interop */ #ifdef GL_NV_vertex_array_range CONST_CAST(GLEW_NV_vertex_array_range) = _glewSearchExtension("GL_NV_vertex_array_range", extStart, extEnd); if (glewExperimental || GLEW_NV_vertex_array_range) CONST_CAST(GLEW_NV_vertex_array_range) = !_glewInit_GL_NV_vertex_array_range(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_NV_vertex_array_range */ #ifdef GL_NV_vertex_array_range2 CONST_CAST(GLEW_NV_vertex_array_range2) = _glewSearchExtension("GL_NV_vertex_array_range2", extStart, extEnd); #endif /* GL_NV_vertex_array_range2 */ #ifdef GL_NV_vertex_attrib_integer_64bit CONST_CAST(GLEW_NV_vertex_attrib_integer_64bit) = _glewSearchExtension("GL_NV_vertex_attrib_integer_64bit", extStart, extEnd); if (glewExperimental || GLEW_NV_vertex_attrib_integer_64bit) CONST_CAST(GLEW_NV_vertex_attrib_integer_64bit) = !_glewInit_GL_NV_vertex_attrib_integer_64bit(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_NV_vertex_attrib_integer_64bit */ #ifdef GL_NV_vertex_buffer_unified_memory CONST_CAST(GLEW_NV_vertex_buffer_unified_memory) = _glewSearchExtension("GL_NV_vertex_buffer_unified_memory", extStart, extEnd); if (glewExperimental || GLEW_NV_vertex_buffer_unified_memory) CONST_CAST(GLEW_NV_vertex_buffer_unified_memory) = !_glewInit_GL_NV_vertex_buffer_unified_memory(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_NV_vertex_buffer_unified_memory */ #ifdef GL_NV_vertex_program CONST_CAST(GLEW_NV_vertex_program) = _glewSearchExtension("GL_NV_vertex_program", extStart, extEnd); if (glewExperimental || GLEW_NV_vertex_program) CONST_CAST(GLEW_NV_vertex_program) = !_glewInit_GL_NV_vertex_program(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_NV_vertex_program */ #ifdef GL_NV_vertex_program1_1 CONST_CAST(GLEW_NV_vertex_program1_1) = _glewSearchExtension("GL_NV_vertex_program1_1", extStart, extEnd); #endif /* GL_NV_vertex_program1_1 */ #ifdef GL_NV_vertex_program2 CONST_CAST(GLEW_NV_vertex_program2) = _glewSearchExtension("GL_NV_vertex_program2", extStart, extEnd); #endif /* GL_NV_vertex_program2 */ #ifdef GL_NV_vertex_program2_option CONST_CAST(GLEW_NV_vertex_program2_option) = _glewSearchExtension("GL_NV_vertex_program2_option", extStart, extEnd); #endif /* GL_NV_vertex_program2_option */ #ifdef GL_NV_vertex_program3 CONST_CAST(GLEW_NV_vertex_program3) = _glewSearchExtension("GL_NV_vertex_program3", extStart, extEnd); #endif /* GL_NV_vertex_program3 */ #ifdef GL_NV_vertex_program4 CONST_CAST(GLEW_NV_vertex_program4) = _glewSearchExtension("GL_NV_gpu_program4", extStart, extEnd); #endif /* GL_NV_vertex_program4 */ #ifdef GL_NV_video_capture CONST_CAST(GLEW_NV_video_capture) = _glewSearchExtension("GL_NV_video_capture", extStart, extEnd); if (glewExperimental || GLEW_NV_video_capture) CONST_CAST(GLEW_NV_video_capture) = !_glewInit_GL_NV_video_capture(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_NV_video_capture */ #ifdef GL_OES_byte_coordinates CONST_CAST(GLEW_OES_byte_coordinates) = _glewSearchExtension("GL_OES_byte_coordinates", extStart, extEnd); #endif /* GL_OES_byte_coordinates */ #ifdef GL_OES_compressed_paletted_texture CONST_CAST(GLEW_OES_compressed_paletted_texture) = _glewSearchExtension("GL_OES_compressed_paletted_texture", extStart, extEnd); #endif /* GL_OES_compressed_paletted_texture */ #ifdef GL_OES_read_format CONST_CAST(GLEW_OES_read_format) = _glewSearchExtension("GL_OES_read_format", extStart, extEnd); #endif /* GL_OES_read_format */ #ifdef GL_OES_single_precision CONST_CAST(GLEW_OES_single_precision) = _glewSearchExtension("GL_OES_single_precision", extStart, extEnd); if (glewExperimental || GLEW_OES_single_precision) CONST_CAST(GLEW_OES_single_precision) = !_glewInit_GL_OES_single_precision(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_OES_single_precision */ #ifdef GL_OML_interlace CONST_CAST(GLEW_OML_interlace) = _glewSearchExtension("GL_OML_interlace", extStart, extEnd); #endif /* GL_OML_interlace */ #ifdef GL_OML_resample CONST_CAST(GLEW_OML_resample) = _glewSearchExtension("GL_OML_resample", extStart, extEnd); #endif /* GL_OML_resample */ #ifdef GL_OML_subsample CONST_CAST(GLEW_OML_subsample) = _glewSearchExtension("GL_OML_subsample", extStart, extEnd); #endif /* GL_OML_subsample */ #ifdef GL_PGI_misc_hints CONST_CAST(GLEW_PGI_misc_hints) = _glewSearchExtension("GL_PGI_misc_hints", extStart, extEnd); #endif /* GL_PGI_misc_hints */ #ifdef GL_PGI_vertex_hints CONST_CAST(GLEW_PGI_vertex_hints) = _glewSearchExtension("GL_PGI_vertex_hints", extStart, extEnd); #endif /* GL_PGI_vertex_hints */ #ifdef GL_REGAL_error_string CONST_CAST(GLEW_REGAL_error_string) = _glewSearchExtension("GL_REGAL_error_string", extStart, extEnd); if (glewExperimental || GLEW_REGAL_error_string) CONST_CAST(GLEW_REGAL_error_string) = !_glewInit_GL_REGAL_error_string(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_REGAL_error_string */ #ifdef GL_REGAL_extension_query CONST_CAST(GLEW_REGAL_extension_query) = _glewSearchExtension("GL_REGAL_extension_query", extStart, extEnd); if (glewExperimental || GLEW_REGAL_extension_query) CONST_CAST(GLEW_REGAL_extension_query) = !_glewInit_GL_REGAL_extension_query(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_REGAL_extension_query */ #ifdef GL_REGAL_log CONST_CAST(GLEW_REGAL_log) = _glewSearchExtension("GL_REGAL_log", extStart, extEnd); #endif /* GL_REGAL_log */ #ifdef GL_REND_screen_coordinates CONST_CAST(GLEW_REND_screen_coordinates) = _glewSearchExtension("GL_REND_screen_coordinates", extStart, extEnd); #endif /* GL_REND_screen_coordinates */ #ifdef GL_S3_s3tc CONST_CAST(GLEW_S3_s3tc) = _glewSearchExtension("GL_S3_s3tc", extStart, extEnd); #endif /* GL_S3_s3tc */ #ifdef GL_SGIS_color_range CONST_CAST(GLEW_SGIS_color_range) = _glewSearchExtension("GL_SGIS_color_range", extStart, extEnd); #endif /* GL_SGIS_color_range */ #ifdef GL_SGIS_detail_texture CONST_CAST(GLEW_SGIS_detail_texture) = _glewSearchExtension("GL_SGIS_detail_texture", extStart, extEnd); if (glewExperimental || GLEW_SGIS_detail_texture) CONST_CAST(GLEW_SGIS_detail_texture) = !_glewInit_GL_SGIS_detail_texture(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_SGIS_detail_texture */ #ifdef GL_SGIS_fog_function CONST_CAST(GLEW_SGIS_fog_function) = _glewSearchExtension("GL_SGIS_fog_function", extStart, extEnd); if (glewExperimental || GLEW_SGIS_fog_function) CONST_CAST(GLEW_SGIS_fog_function) = !_glewInit_GL_SGIS_fog_function(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_SGIS_fog_function */ #ifdef GL_SGIS_generate_mipmap CONST_CAST(GLEW_SGIS_generate_mipmap) = _glewSearchExtension("GL_SGIS_generate_mipmap", extStart, extEnd); #endif /* GL_SGIS_generate_mipmap */ #ifdef GL_SGIS_multisample CONST_CAST(GLEW_SGIS_multisample) = _glewSearchExtension("GL_SGIS_multisample", extStart, extEnd); if (glewExperimental || GLEW_SGIS_multisample) CONST_CAST(GLEW_SGIS_multisample) = !_glewInit_GL_SGIS_multisample(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_SGIS_multisample */ #ifdef GL_SGIS_pixel_texture CONST_CAST(GLEW_SGIS_pixel_texture) = _glewSearchExtension("GL_SGIS_pixel_texture", extStart, extEnd); #endif /* GL_SGIS_pixel_texture */ #ifdef GL_SGIS_point_line_texgen CONST_CAST(GLEW_SGIS_point_line_texgen) = _glewSearchExtension("GL_SGIS_point_line_texgen", extStart, extEnd); #endif /* GL_SGIS_point_line_texgen */ #ifdef GL_SGIS_sharpen_texture CONST_CAST(GLEW_SGIS_sharpen_texture) = _glewSearchExtension("GL_SGIS_sharpen_texture", extStart, extEnd); if (glewExperimental || GLEW_SGIS_sharpen_texture) CONST_CAST(GLEW_SGIS_sharpen_texture) = !_glewInit_GL_SGIS_sharpen_texture(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_SGIS_sharpen_texture */ #ifdef GL_SGIS_texture4D CONST_CAST(GLEW_SGIS_texture4D) = _glewSearchExtension("GL_SGIS_texture4D", extStart, extEnd); if (glewExperimental || GLEW_SGIS_texture4D) CONST_CAST(GLEW_SGIS_texture4D) = !_glewInit_GL_SGIS_texture4D(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_SGIS_texture4D */ #ifdef GL_SGIS_texture_border_clamp CONST_CAST(GLEW_SGIS_texture_border_clamp) = _glewSearchExtension("GL_SGIS_texture_border_clamp", extStart, extEnd); #endif /* GL_SGIS_texture_border_clamp */ #ifdef GL_SGIS_texture_edge_clamp CONST_CAST(GLEW_SGIS_texture_edge_clamp) = _glewSearchExtension("GL_SGIS_texture_edge_clamp", extStart, extEnd); #endif /* GL_SGIS_texture_edge_clamp */ #ifdef GL_SGIS_texture_filter4 CONST_CAST(GLEW_SGIS_texture_filter4) = _glewSearchExtension("GL_SGIS_texture_filter4", extStart, extEnd); if (glewExperimental || GLEW_SGIS_texture_filter4) CONST_CAST(GLEW_SGIS_texture_filter4) = !_glewInit_GL_SGIS_texture_filter4(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_SGIS_texture_filter4 */ #ifdef GL_SGIS_texture_lod CONST_CAST(GLEW_SGIS_texture_lod) = _glewSearchExtension("GL_SGIS_texture_lod", extStart, extEnd); #endif /* GL_SGIS_texture_lod */ #ifdef GL_SGIS_texture_select CONST_CAST(GLEW_SGIS_texture_select) = _glewSearchExtension("GL_SGIS_texture_select", extStart, extEnd); #endif /* GL_SGIS_texture_select */ #ifdef GL_SGIX_async CONST_CAST(GLEW_SGIX_async) = _glewSearchExtension("GL_SGIX_async", extStart, extEnd); if (glewExperimental || GLEW_SGIX_async) CONST_CAST(GLEW_SGIX_async) = !_glewInit_GL_SGIX_async(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_SGIX_async */ #ifdef GL_SGIX_async_histogram CONST_CAST(GLEW_SGIX_async_histogram) = _glewSearchExtension("GL_SGIX_async_histogram", extStart, extEnd); #endif /* GL_SGIX_async_histogram */ #ifdef GL_SGIX_async_pixel CONST_CAST(GLEW_SGIX_async_pixel) = _glewSearchExtension("GL_SGIX_async_pixel", extStart, extEnd); #endif /* GL_SGIX_async_pixel */ #ifdef GL_SGIX_blend_alpha_minmax CONST_CAST(GLEW_SGIX_blend_alpha_minmax) = _glewSearchExtension("GL_SGIX_blend_alpha_minmax", extStart, extEnd); #endif /* GL_SGIX_blend_alpha_minmax */ #ifdef GL_SGIX_clipmap CONST_CAST(GLEW_SGIX_clipmap) = _glewSearchExtension("GL_SGIX_clipmap", extStart, extEnd); #endif /* GL_SGIX_clipmap */ #ifdef GL_SGIX_convolution_accuracy CONST_CAST(GLEW_SGIX_convolution_accuracy) = _glewSearchExtension("GL_SGIX_convolution_accuracy", extStart, extEnd); #endif /* GL_SGIX_convolution_accuracy */ #ifdef GL_SGIX_depth_texture CONST_CAST(GLEW_SGIX_depth_texture) = _glewSearchExtension("GL_SGIX_depth_texture", extStart, extEnd); #endif /* GL_SGIX_depth_texture */ #ifdef GL_SGIX_flush_raster CONST_CAST(GLEW_SGIX_flush_raster) = _glewSearchExtension("GL_SGIX_flush_raster", extStart, extEnd); if (glewExperimental || GLEW_SGIX_flush_raster) CONST_CAST(GLEW_SGIX_flush_raster) = !_glewInit_GL_SGIX_flush_raster(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_SGIX_flush_raster */ #ifdef GL_SGIX_fog_offset CONST_CAST(GLEW_SGIX_fog_offset) = _glewSearchExtension("GL_SGIX_fog_offset", extStart, extEnd); #endif /* GL_SGIX_fog_offset */ #ifdef GL_SGIX_fog_texture CONST_CAST(GLEW_SGIX_fog_texture) = _glewSearchExtension("GL_SGIX_fog_texture", extStart, extEnd); if (glewExperimental || GLEW_SGIX_fog_texture) CONST_CAST(GLEW_SGIX_fog_texture) = !_glewInit_GL_SGIX_fog_texture(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_SGIX_fog_texture */ #ifdef GL_SGIX_fragment_specular_lighting CONST_CAST(GLEW_SGIX_fragment_specular_lighting) = _glewSearchExtension("GL_SGIX_fragment_specular_lighting", extStart, extEnd); if (glewExperimental || GLEW_SGIX_fragment_specular_lighting) CONST_CAST(GLEW_SGIX_fragment_specular_lighting) = !_glewInit_GL_SGIX_fragment_specular_lighting(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_SGIX_fragment_specular_lighting */ #ifdef GL_SGIX_framezoom CONST_CAST(GLEW_SGIX_framezoom) = _glewSearchExtension("GL_SGIX_framezoom", extStart, extEnd); if (glewExperimental || GLEW_SGIX_framezoom) CONST_CAST(GLEW_SGIX_framezoom) = !_glewInit_GL_SGIX_framezoom(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_SGIX_framezoom */ #ifdef GL_SGIX_interlace CONST_CAST(GLEW_SGIX_interlace) = _glewSearchExtension("GL_SGIX_interlace", extStart, extEnd); #endif /* GL_SGIX_interlace */ #ifdef GL_SGIX_ir_instrument1 CONST_CAST(GLEW_SGIX_ir_instrument1) = _glewSearchExtension("GL_SGIX_ir_instrument1", extStart, extEnd); #endif /* GL_SGIX_ir_instrument1 */ #ifdef GL_SGIX_list_priority CONST_CAST(GLEW_SGIX_list_priority) = _glewSearchExtension("GL_SGIX_list_priority", extStart, extEnd); #endif /* GL_SGIX_list_priority */ #ifdef GL_SGIX_pixel_texture CONST_CAST(GLEW_SGIX_pixel_texture) = _glewSearchExtension("GL_SGIX_pixel_texture", extStart, extEnd); if (glewExperimental || GLEW_SGIX_pixel_texture) CONST_CAST(GLEW_SGIX_pixel_texture) = !_glewInit_GL_SGIX_pixel_texture(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_SGIX_pixel_texture */ #ifdef GL_SGIX_pixel_texture_bits CONST_CAST(GLEW_SGIX_pixel_texture_bits) = _glewSearchExtension("GL_SGIX_pixel_texture_bits", extStart, extEnd); #endif /* GL_SGIX_pixel_texture_bits */ #ifdef GL_SGIX_reference_plane CONST_CAST(GLEW_SGIX_reference_plane) = _glewSearchExtension("GL_SGIX_reference_plane", extStart, extEnd); if (glewExperimental || GLEW_SGIX_reference_plane) CONST_CAST(GLEW_SGIX_reference_plane) = !_glewInit_GL_SGIX_reference_plane(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_SGIX_reference_plane */ #ifdef GL_SGIX_resample CONST_CAST(GLEW_SGIX_resample) = _glewSearchExtension("GL_SGIX_resample", extStart, extEnd); #endif /* GL_SGIX_resample */ #ifdef GL_SGIX_shadow CONST_CAST(GLEW_SGIX_shadow) = _glewSearchExtension("GL_SGIX_shadow", extStart, extEnd); #endif /* GL_SGIX_shadow */ #ifdef GL_SGIX_shadow_ambient CONST_CAST(GLEW_SGIX_shadow_ambient) = _glewSearchExtension("GL_SGIX_shadow_ambient", extStart, extEnd); #endif /* GL_SGIX_shadow_ambient */ #ifdef GL_SGIX_sprite CONST_CAST(GLEW_SGIX_sprite) = _glewSearchExtension("GL_SGIX_sprite", extStart, extEnd); if (glewExperimental || GLEW_SGIX_sprite) CONST_CAST(GLEW_SGIX_sprite) = !_glewInit_GL_SGIX_sprite(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_SGIX_sprite */ #ifdef GL_SGIX_tag_sample_buffer CONST_CAST(GLEW_SGIX_tag_sample_buffer) = _glewSearchExtension("GL_SGIX_tag_sample_buffer", extStart, extEnd); if (glewExperimental || GLEW_SGIX_tag_sample_buffer) CONST_CAST(GLEW_SGIX_tag_sample_buffer) = !_glewInit_GL_SGIX_tag_sample_buffer(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_SGIX_tag_sample_buffer */ #ifdef GL_SGIX_texture_add_env CONST_CAST(GLEW_SGIX_texture_add_env) = _glewSearchExtension("GL_SGIX_texture_add_env", extStart, extEnd); #endif /* GL_SGIX_texture_add_env */ #ifdef GL_SGIX_texture_coordinate_clamp CONST_CAST(GLEW_SGIX_texture_coordinate_clamp) = _glewSearchExtension("GL_SGIX_texture_coordinate_clamp", extStart, extEnd); #endif /* GL_SGIX_texture_coordinate_clamp */ #ifdef GL_SGIX_texture_lod_bias CONST_CAST(GLEW_SGIX_texture_lod_bias) = _glewSearchExtension("GL_SGIX_texture_lod_bias", extStart, extEnd); #endif /* GL_SGIX_texture_lod_bias */ #ifdef GL_SGIX_texture_multi_buffer CONST_CAST(GLEW_SGIX_texture_multi_buffer) = _glewSearchExtension("GL_SGIX_texture_multi_buffer", extStart, extEnd); #endif /* GL_SGIX_texture_multi_buffer */ #ifdef GL_SGIX_texture_range CONST_CAST(GLEW_SGIX_texture_range) = _glewSearchExtension("GL_SGIX_texture_range", extStart, extEnd); #endif /* GL_SGIX_texture_range */ #ifdef GL_SGIX_texture_scale_bias CONST_CAST(GLEW_SGIX_texture_scale_bias) = _glewSearchExtension("GL_SGIX_texture_scale_bias", extStart, extEnd); #endif /* GL_SGIX_texture_scale_bias */ #ifdef GL_SGIX_vertex_preclip CONST_CAST(GLEW_SGIX_vertex_preclip) = _glewSearchExtension("GL_SGIX_vertex_preclip", extStart, extEnd); #endif /* GL_SGIX_vertex_preclip */ #ifdef GL_SGIX_vertex_preclip_hint CONST_CAST(GLEW_SGIX_vertex_preclip_hint) = _glewSearchExtension("GL_SGIX_vertex_preclip_hint", extStart, extEnd); #endif /* GL_SGIX_vertex_preclip_hint */ #ifdef GL_SGIX_ycrcb CONST_CAST(GLEW_SGIX_ycrcb) = _glewSearchExtension("GL_SGIX_ycrcb", extStart, extEnd); #endif /* GL_SGIX_ycrcb */ #ifdef GL_SGI_color_matrix CONST_CAST(GLEW_SGI_color_matrix) = _glewSearchExtension("GL_SGI_color_matrix", extStart, extEnd); #endif /* GL_SGI_color_matrix */ #ifdef GL_SGI_color_table CONST_CAST(GLEW_SGI_color_table) = _glewSearchExtension("GL_SGI_color_table", extStart, extEnd); if (glewExperimental || GLEW_SGI_color_table) CONST_CAST(GLEW_SGI_color_table) = !_glewInit_GL_SGI_color_table(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_SGI_color_table */ #ifdef GL_SGI_texture_color_table CONST_CAST(GLEW_SGI_texture_color_table) = _glewSearchExtension("GL_SGI_texture_color_table", extStart, extEnd); #endif /* GL_SGI_texture_color_table */ #ifdef GL_SUNX_constant_data CONST_CAST(GLEW_SUNX_constant_data) = _glewSearchExtension("GL_SUNX_constant_data", extStart, extEnd); if (glewExperimental || GLEW_SUNX_constant_data) CONST_CAST(GLEW_SUNX_constant_data) = !_glewInit_GL_SUNX_constant_data(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_SUNX_constant_data */ #ifdef GL_SUN_convolution_border_modes CONST_CAST(GLEW_SUN_convolution_border_modes) = _glewSearchExtension("GL_SUN_convolution_border_modes", extStart, extEnd); #endif /* GL_SUN_convolution_border_modes */ #ifdef GL_SUN_global_alpha CONST_CAST(GLEW_SUN_global_alpha) = _glewSearchExtension("GL_SUN_global_alpha", extStart, extEnd); if (glewExperimental || GLEW_SUN_global_alpha) CONST_CAST(GLEW_SUN_global_alpha) = !_glewInit_GL_SUN_global_alpha(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_SUN_global_alpha */ #ifdef GL_SUN_mesh_array CONST_CAST(GLEW_SUN_mesh_array) = _glewSearchExtension("GL_SUN_mesh_array", extStart, extEnd); #endif /* GL_SUN_mesh_array */ #ifdef GL_SUN_read_video_pixels CONST_CAST(GLEW_SUN_read_video_pixels) = _glewSearchExtension("GL_SUN_read_video_pixels", extStart, extEnd); if (glewExperimental || GLEW_SUN_read_video_pixels) CONST_CAST(GLEW_SUN_read_video_pixels) = !_glewInit_GL_SUN_read_video_pixels(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_SUN_read_video_pixels */ #ifdef GL_SUN_slice_accum CONST_CAST(GLEW_SUN_slice_accum) = _glewSearchExtension("GL_SUN_slice_accum", extStart, extEnd); #endif /* GL_SUN_slice_accum */ #ifdef GL_SUN_triangle_list CONST_CAST(GLEW_SUN_triangle_list) = _glewSearchExtension("GL_SUN_triangle_list", extStart, extEnd); if (glewExperimental || GLEW_SUN_triangle_list) CONST_CAST(GLEW_SUN_triangle_list) = !_glewInit_GL_SUN_triangle_list(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_SUN_triangle_list */ #ifdef GL_SUN_vertex CONST_CAST(GLEW_SUN_vertex) = _glewSearchExtension("GL_SUN_vertex", extStart, extEnd); if (glewExperimental || GLEW_SUN_vertex) CONST_CAST(GLEW_SUN_vertex) = !_glewInit_GL_SUN_vertex(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_SUN_vertex */ #ifdef GL_WIN_phong_shading CONST_CAST(GLEW_WIN_phong_shading) = _glewSearchExtension("GL_WIN_phong_shading", extStart, extEnd); #endif /* GL_WIN_phong_shading */ #ifdef GL_WIN_specular_fog CONST_CAST(GLEW_WIN_specular_fog) = _glewSearchExtension("GL_WIN_specular_fog", extStart, extEnd); #endif /* GL_WIN_specular_fog */ #ifdef GL_WIN_swap_hint CONST_CAST(GLEW_WIN_swap_hint) = _glewSearchExtension("GL_WIN_swap_hint", extStart, extEnd); if (glewExperimental || GLEW_WIN_swap_hint) CONST_CAST(GLEW_WIN_swap_hint) = !_glewInit_GL_WIN_swap_hint(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_WIN_swap_hint */ return GLEW_OK; } #if defined(_WIN32) #if !defined(GLEW_MX) PFNWGLSETSTEREOEMITTERSTATE3DLPROC __wglewSetStereoEmitterState3DL = NULL; PFNWGLBLITCONTEXTFRAMEBUFFERAMDPROC __wglewBlitContextFramebufferAMD = NULL; PFNWGLCREATEASSOCIATEDCONTEXTAMDPROC __wglewCreateAssociatedContextAMD = NULL; PFNWGLCREATEASSOCIATEDCONTEXTATTRIBSAMDPROC __wglewCreateAssociatedContextAttribsAMD = NULL; PFNWGLDELETEASSOCIATEDCONTEXTAMDPROC __wglewDeleteAssociatedContextAMD = NULL; PFNWGLGETCONTEXTGPUIDAMDPROC __wglewGetContextGPUIDAMD = NULL; PFNWGLGETCURRENTASSOCIATEDCONTEXTAMDPROC __wglewGetCurrentAssociatedContextAMD = NULL; PFNWGLGETGPUIDSAMDPROC __wglewGetGPUIDsAMD = NULL; PFNWGLGETGPUINFOAMDPROC __wglewGetGPUInfoAMD = NULL; PFNWGLMAKEASSOCIATEDCONTEXTCURRENTAMDPROC __wglewMakeAssociatedContextCurrentAMD = NULL; PFNWGLCREATEBUFFERREGIONARBPROC __wglewCreateBufferRegionARB = NULL; PFNWGLDELETEBUFFERREGIONARBPROC __wglewDeleteBufferRegionARB = NULL; PFNWGLRESTOREBUFFERREGIONARBPROC __wglewRestoreBufferRegionARB = NULL; PFNWGLSAVEBUFFERREGIONARBPROC __wglewSaveBufferRegionARB = NULL; PFNWGLCREATECONTEXTATTRIBSARBPROC __wglewCreateContextAttribsARB = NULL; PFNWGLGETEXTENSIONSSTRINGARBPROC __wglewGetExtensionsStringARB = NULL; PFNWGLGETCURRENTREADDCARBPROC __wglewGetCurrentReadDCARB = NULL; PFNWGLMAKECONTEXTCURRENTARBPROC __wglewMakeContextCurrentARB = NULL; PFNWGLCREATEPBUFFERARBPROC __wglewCreatePbufferARB = NULL; PFNWGLDESTROYPBUFFERARBPROC __wglewDestroyPbufferARB = NULL; PFNWGLGETPBUFFERDCARBPROC __wglewGetPbufferDCARB = NULL; PFNWGLQUERYPBUFFERARBPROC __wglewQueryPbufferARB = NULL; PFNWGLRELEASEPBUFFERDCARBPROC __wglewReleasePbufferDCARB = NULL; PFNWGLCHOOSEPIXELFORMATARBPROC __wglewChoosePixelFormatARB = NULL; PFNWGLGETPIXELFORMATATTRIBFVARBPROC __wglewGetPixelFormatAttribfvARB = NULL; PFNWGLGETPIXELFORMATATTRIBIVARBPROC __wglewGetPixelFormatAttribivARB = NULL; PFNWGLBINDTEXIMAGEARBPROC __wglewBindTexImageARB = NULL; PFNWGLRELEASETEXIMAGEARBPROC __wglewReleaseTexImageARB = NULL; PFNWGLSETPBUFFERATTRIBARBPROC __wglewSetPbufferAttribARB = NULL; PFNWGLBINDDISPLAYCOLORTABLEEXTPROC __wglewBindDisplayColorTableEXT = NULL; PFNWGLCREATEDISPLAYCOLORTABLEEXTPROC __wglewCreateDisplayColorTableEXT = NULL; PFNWGLDESTROYDISPLAYCOLORTABLEEXTPROC __wglewDestroyDisplayColorTableEXT = NULL; PFNWGLLOADDISPLAYCOLORTABLEEXTPROC __wglewLoadDisplayColorTableEXT = NULL; PFNWGLGETEXTENSIONSSTRINGEXTPROC __wglewGetExtensionsStringEXT = NULL; PFNWGLGETCURRENTREADDCEXTPROC __wglewGetCurrentReadDCEXT = NULL; PFNWGLMAKECONTEXTCURRENTEXTPROC __wglewMakeContextCurrentEXT = NULL; PFNWGLCREATEPBUFFEREXTPROC __wglewCreatePbufferEXT = NULL; PFNWGLDESTROYPBUFFEREXTPROC __wglewDestroyPbufferEXT = NULL; PFNWGLGETPBUFFERDCEXTPROC __wglewGetPbufferDCEXT = NULL; PFNWGLQUERYPBUFFEREXTPROC __wglewQueryPbufferEXT = NULL; PFNWGLRELEASEPBUFFERDCEXTPROC __wglewReleasePbufferDCEXT = NULL; PFNWGLCHOOSEPIXELFORMATEXTPROC __wglewChoosePixelFormatEXT = NULL; PFNWGLGETPIXELFORMATATTRIBFVEXTPROC __wglewGetPixelFormatAttribfvEXT = NULL; PFNWGLGETPIXELFORMATATTRIBIVEXTPROC __wglewGetPixelFormatAttribivEXT = NULL; PFNWGLGETSWAPINTERVALEXTPROC __wglewGetSwapIntervalEXT = NULL; PFNWGLSWAPINTERVALEXTPROC __wglewSwapIntervalEXT = NULL; PFNWGLGETDIGITALVIDEOPARAMETERSI3DPROC __wglewGetDigitalVideoParametersI3D = NULL; PFNWGLSETDIGITALVIDEOPARAMETERSI3DPROC __wglewSetDigitalVideoParametersI3D = NULL; PFNWGLGETGAMMATABLEI3DPROC __wglewGetGammaTableI3D = NULL; PFNWGLGETGAMMATABLEPARAMETERSI3DPROC __wglewGetGammaTableParametersI3D = NULL; PFNWGLSETGAMMATABLEI3DPROC __wglewSetGammaTableI3D = NULL; PFNWGLSETGAMMATABLEPARAMETERSI3DPROC __wglewSetGammaTableParametersI3D = NULL; PFNWGLDISABLEGENLOCKI3DPROC __wglewDisableGenlockI3D = NULL; PFNWGLENABLEGENLOCKI3DPROC __wglewEnableGenlockI3D = NULL; PFNWGLGENLOCKSAMPLERATEI3DPROC __wglewGenlockSampleRateI3D = NULL; PFNWGLGENLOCKSOURCEDELAYI3DPROC __wglewGenlockSourceDelayI3D = NULL; PFNWGLGENLOCKSOURCEEDGEI3DPROC __wglewGenlockSourceEdgeI3D = NULL; PFNWGLGENLOCKSOURCEI3DPROC __wglewGenlockSourceI3D = NULL; PFNWGLGETGENLOCKSAMPLERATEI3DPROC __wglewGetGenlockSampleRateI3D = NULL; PFNWGLGETGENLOCKSOURCEDELAYI3DPROC __wglewGetGenlockSourceDelayI3D = NULL; PFNWGLGETGENLOCKSOURCEEDGEI3DPROC __wglewGetGenlockSourceEdgeI3D = NULL; PFNWGLGETGENLOCKSOURCEI3DPROC __wglewGetGenlockSourceI3D = NULL; PFNWGLISENABLEDGENLOCKI3DPROC __wglewIsEnabledGenlockI3D = NULL; PFNWGLQUERYGENLOCKMAXSOURCEDELAYI3DPROC __wglewQueryGenlockMaxSourceDelayI3D = NULL; PFNWGLASSOCIATEIMAGEBUFFEREVENTSI3DPROC __wglewAssociateImageBufferEventsI3D = NULL; PFNWGLCREATEIMAGEBUFFERI3DPROC __wglewCreateImageBufferI3D = NULL; PFNWGLDESTROYIMAGEBUFFERI3DPROC __wglewDestroyImageBufferI3D = NULL; PFNWGLRELEASEIMAGEBUFFEREVENTSI3DPROC __wglewReleaseImageBufferEventsI3D = NULL; PFNWGLDISABLEFRAMELOCKI3DPROC __wglewDisableFrameLockI3D = NULL; PFNWGLENABLEFRAMELOCKI3DPROC __wglewEnableFrameLockI3D = NULL; PFNWGLISENABLEDFRAMELOCKI3DPROC __wglewIsEnabledFrameLockI3D = NULL; PFNWGLQUERYFRAMELOCKMASTERI3DPROC __wglewQueryFrameLockMasterI3D = NULL; PFNWGLBEGINFRAMETRACKINGI3DPROC __wglewBeginFrameTrackingI3D = NULL; PFNWGLENDFRAMETRACKINGI3DPROC __wglewEndFrameTrackingI3D = NULL; PFNWGLGETFRAMEUSAGEI3DPROC __wglewGetFrameUsageI3D = NULL; PFNWGLQUERYFRAMETRACKINGI3DPROC __wglewQueryFrameTrackingI3D = NULL; PFNWGLDXCLOSEDEVICENVPROC __wglewDXCloseDeviceNV = NULL; PFNWGLDXLOCKOBJECTSNVPROC __wglewDXLockObjectsNV = NULL; PFNWGLDXOBJECTACCESSNVPROC __wglewDXObjectAccessNV = NULL; PFNWGLDXOPENDEVICENVPROC __wglewDXOpenDeviceNV = NULL; PFNWGLDXREGISTEROBJECTNVPROC __wglewDXRegisterObjectNV = NULL; PFNWGLDXSETRESOURCESHAREHANDLENVPROC __wglewDXSetResourceShareHandleNV = NULL; PFNWGLDXUNLOCKOBJECTSNVPROC __wglewDXUnlockObjectsNV = NULL; PFNWGLDXUNREGISTEROBJECTNVPROC __wglewDXUnregisterObjectNV = NULL; PFNWGLCOPYIMAGESUBDATANVPROC __wglewCopyImageSubDataNV = NULL; PFNWGLCREATEAFFINITYDCNVPROC __wglewCreateAffinityDCNV = NULL; PFNWGLDELETEDCNVPROC __wglewDeleteDCNV = NULL; PFNWGLENUMGPUDEVICESNVPROC __wglewEnumGpuDevicesNV = NULL; PFNWGLENUMGPUSFROMAFFINITYDCNVPROC __wglewEnumGpusFromAffinityDCNV = NULL; PFNWGLENUMGPUSNVPROC __wglewEnumGpusNV = NULL; PFNWGLBINDVIDEODEVICENVPROC __wglewBindVideoDeviceNV = NULL; PFNWGLENUMERATEVIDEODEVICESNVPROC __wglewEnumerateVideoDevicesNV = NULL; PFNWGLQUERYCURRENTCONTEXTNVPROC __wglewQueryCurrentContextNV = NULL; PFNWGLBINDSWAPBARRIERNVPROC __wglewBindSwapBarrierNV = NULL; PFNWGLJOINSWAPGROUPNVPROC __wglewJoinSwapGroupNV = NULL; PFNWGLQUERYFRAMECOUNTNVPROC __wglewQueryFrameCountNV = NULL; PFNWGLQUERYMAXSWAPGROUPSNVPROC __wglewQueryMaxSwapGroupsNV = NULL; PFNWGLQUERYSWAPGROUPNVPROC __wglewQuerySwapGroupNV = NULL; PFNWGLRESETFRAMECOUNTNVPROC __wglewResetFrameCountNV = NULL; PFNWGLALLOCATEMEMORYNVPROC __wglewAllocateMemoryNV = NULL; PFNWGLFREEMEMORYNVPROC __wglewFreeMemoryNV = NULL; PFNWGLBINDVIDEOCAPTUREDEVICENVPROC __wglewBindVideoCaptureDeviceNV = NULL; PFNWGLENUMERATEVIDEOCAPTUREDEVICESNVPROC __wglewEnumerateVideoCaptureDevicesNV = NULL; PFNWGLLOCKVIDEOCAPTUREDEVICENVPROC __wglewLockVideoCaptureDeviceNV = NULL; PFNWGLQUERYVIDEOCAPTUREDEVICENVPROC __wglewQueryVideoCaptureDeviceNV = NULL; PFNWGLRELEASEVIDEOCAPTUREDEVICENVPROC __wglewReleaseVideoCaptureDeviceNV = NULL; PFNWGLBINDVIDEOIMAGENVPROC __wglewBindVideoImageNV = NULL; PFNWGLGETVIDEODEVICENVPROC __wglewGetVideoDeviceNV = NULL; PFNWGLGETVIDEOINFONVPROC __wglewGetVideoInfoNV = NULL; PFNWGLRELEASEVIDEODEVICENVPROC __wglewReleaseVideoDeviceNV = NULL; PFNWGLRELEASEVIDEOIMAGENVPROC __wglewReleaseVideoImageNV = NULL; PFNWGLSENDPBUFFERTOVIDEONVPROC __wglewSendPbufferToVideoNV = NULL; PFNWGLGETMSCRATEOMLPROC __wglewGetMscRateOML = NULL; PFNWGLGETSYNCVALUESOMLPROC __wglewGetSyncValuesOML = NULL; PFNWGLSWAPBUFFERSMSCOMLPROC __wglewSwapBuffersMscOML = NULL; PFNWGLSWAPLAYERBUFFERSMSCOMLPROC __wglewSwapLayerBuffersMscOML = NULL; PFNWGLWAITFORMSCOMLPROC __wglewWaitForMscOML = NULL; PFNWGLWAITFORSBCOMLPROC __wglewWaitForSbcOML = NULL; GLboolean __WGLEW_3DFX_multisample = GL_FALSE; GLboolean __WGLEW_3DL_stereo_control = GL_FALSE; GLboolean __WGLEW_AMD_gpu_association = GL_FALSE; GLboolean __WGLEW_ARB_buffer_region = GL_FALSE; GLboolean __WGLEW_ARB_create_context = GL_FALSE; GLboolean __WGLEW_ARB_create_context_profile = GL_FALSE; GLboolean __WGLEW_ARB_create_context_robustness = GL_FALSE; GLboolean __WGLEW_ARB_extensions_string = GL_FALSE; GLboolean __WGLEW_ARB_framebuffer_sRGB = GL_FALSE; GLboolean __WGLEW_ARB_make_current_read = GL_FALSE; GLboolean __WGLEW_ARB_multisample = GL_FALSE; GLboolean __WGLEW_ARB_pbuffer = GL_FALSE; GLboolean __WGLEW_ARB_pixel_format = GL_FALSE; GLboolean __WGLEW_ARB_pixel_format_float = GL_FALSE; GLboolean __WGLEW_ARB_render_texture = GL_FALSE; GLboolean __WGLEW_ATI_pixel_format_float = GL_FALSE; GLboolean __WGLEW_ATI_render_texture_rectangle = GL_FALSE; GLboolean __WGLEW_EXT_create_context_es2_profile = GL_FALSE; GLboolean __WGLEW_EXT_create_context_es_profile = GL_FALSE; GLboolean __WGLEW_EXT_depth_float = GL_FALSE; GLboolean __WGLEW_EXT_display_color_table = GL_FALSE; GLboolean __WGLEW_EXT_extensions_string = GL_FALSE; GLboolean __WGLEW_EXT_framebuffer_sRGB = GL_FALSE; GLboolean __WGLEW_EXT_make_current_read = GL_FALSE; GLboolean __WGLEW_EXT_multisample = GL_FALSE; GLboolean __WGLEW_EXT_pbuffer = GL_FALSE; GLboolean __WGLEW_EXT_pixel_format = GL_FALSE; GLboolean __WGLEW_EXT_pixel_format_packed_float = GL_FALSE; GLboolean __WGLEW_EXT_swap_control = GL_FALSE; GLboolean __WGLEW_EXT_swap_control_tear = GL_FALSE; GLboolean __WGLEW_I3D_digital_video_control = GL_FALSE; GLboolean __WGLEW_I3D_gamma = GL_FALSE; GLboolean __WGLEW_I3D_genlock = GL_FALSE; GLboolean __WGLEW_I3D_image_buffer = GL_FALSE; GLboolean __WGLEW_I3D_swap_frame_lock = GL_FALSE; GLboolean __WGLEW_I3D_swap_frame_usage = GL_FALSE; GLboolean __WGLEW_NV_DX_interop = GL_FALSE; GLboolean __WGLEW_NV_DX_interop2 = GL_FALSE; GLboolean __WGLEW_NV_copy_image = GL_FALSE; GLboolean __WGLEW_NV_float_buffer = GL_FALSE; GLboolean __WGLEW_NV_gpu_affinity = GL_FALSE; GLboolean __WGLEW_NV_multisample_coverage = GL_FALSE; GLboolean __WGLEW_NV_present_video = GL_FALSE; GLboolean __WGLEW_NV_render_depth_texture = GL_FALSE; GLboolean __WGLEW_NV_render_texture_rectangle = GL_FALSE; GLboolean __WGLEW_NV_swap_group = GL_FALSE; GLboolean __WGLEW_NV_vertex_array_range = GL_FALSE; GLboolean __WGLEW_NV_video_capture = GL_FALSE; GLboolean __WGLEW_NV_video_output = GL_FALSE; GLboolean __WGLEW_OML_sync_control = GL_FALSE; #endif /* !GLEW_MX */ #ifdef WGL_3DFX_multisample #endif /* WGL_3DFX_multisample */ #ifdef WGL_3DL_stereo_control static GLboolean _glewInit_WGL_3DL_stereo_control (WGLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((wglSetStereoEmitterState3DL = (PFNWGLSETSTEREOEMITTERSTATE3DLPROC)glewGetProcAddress((const GLubyte*)"wglSetStereoEmitterState3DL")) == NULL) || r; return r; } #endif /* WGL_3DL_stereo_control */ #ifdef WGL_AMD_gpu_association static GLboolean _glewInit_WGL_AMD_gpu_association (WGLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((wglBlitContextFramebufferAMD = (PFNWGLBLITCONTEXTFRAMEBUFFERAMDPROC)glewGetProcAddress((const GLubyte*)"wglBlitContextFramebufferAMD")) == NULL) || r; r = ((wglCreateAssociatedContextAMD = (PFNWGLCREATEASSOCIATEDCONTEXTAMDPROC)glewGetProcAddress((const GLubyte*)"wglCreateAssociatedContextAMD")) == NULL) || r; r = ((wglCreateAssociatedContextAttribsAMD = (PFNWGLCREATEASSOCIATEDCONTEXTATTRIBSAMDPROC)glewGetProcAddress((const GLubyte*)"wglCreateAssociatedContextAttribsAMD")) == NULL) || r; r = ((wglDeleteAssociatedContextAMD = (PFNWGLDELETEASSOCIATEDCONTEXTAMDPROC)glewGetProcAddress((const GLubyte*)"wglDeleteAssociatedContextAMD")) == NULL) || r; r = ((wglGetContextGPUIDAMD = (PFNWGLGETCONTEXTGPUIDAMDPROC)glewGetProcAddress((const GLubyte*)"wglGetContextGPUIDAMD")) == NULL) || r; r = ((wglGetCurrentAssociatedContextAMD = (PFNWGLGETCURRENTASSOCIATEDCONTEXTAMDPROC)glewGetProcAddress((const GLubyte*)"wglGetCurrentAssociatedContextAMD")) == NULL) || r; r = ((wglGetGPUIDsAMD = (PFNWGLGETGPUIDSAMDPROC)glewGetProcAddress((const GLubyte*)"wglGetGPUIDsAMD")) == NULL) || r; r = ((wglGetGPUInfoAMD = (PFNWGLGETGPUINFOAMDPROC)glewGetProcAddress((const GLubyte*)"wglGetGPUInfoAMD")) == NULL) || r; r = ((wglMakeAssociatedContextCurrentAMD = (PFNWGLMAKEASSOCIATEDCONTEXTCURRENTAMDPROC)glewGetProcAddress((const GLubyte*)"wglMakeAssociatedContextCurrentAMD")) == NULL) || r; return r; } #endif /* WGL_AMD_gpu_association */ #ifdef WGL_ARB_buffer_region static GLboolean _glewInit_WGL_ARB_buffer_region (WGLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((wglCreateBufferRegionARB = (PFNWGLCREATEBUFFERREGIONARBPROC)glewGetProcAddress((const GLubyte*)"wglCreateBufferRegionARB")) == NULL) || r; r = ((wglDeleteBufferRegionARB = (PFNWGLDELETEBUFFERREGIONARBPROC)glewGetProcAddress((const GLubyte*)"wglDeleteBufferRegionARB")) == NULL) || r; r = ((wglRestoreBufferRegionARB = (PFNWGLRESTOREBUFFERREGIONARBPROC)glewGetProcAddress((const GLubyte*)"wglRestoreBufferRegionARB")) == NULL) || r; r = ((wglSaveBufferRegionARB = (PFNWGLSAVEBUFFERREGIONARBPROC)glewGetProcAddress((const GLubyte*)"wglSaveBufferRegionARB")) == NULL) || r; return r; } #endif /* WGL_ARB_buffer_region */ #ifdef WGL_ARB_create_context static GLboolean _glewInit_WGL_ARB_create_context (WGLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((wglCreateContextAttribsARB = (PFNWGLCREATECONTEXTATTRIBSARBPROC)glewGetProcAddress((const GLubyte*)"wglCreateContextAttribsARB")) == NULL) || r; return r; } #endif /* WGL_ARB_create_context */ #ifdef WGL_ARB_create_context_profile #endif /* WGL_ARB_create_context_profile */ #ifdef WGL_ARB_create_context_robustness #endif /* WGL_ARB_create_context_robustness */ #ifdef WGL_ARB_extensions_string static GLboolean _glewInit_WGL_ARB_extensions_string (WGLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((wglGetExtensionsStringARB = (PFNWGLGETEXTENSIONSSTRINGARBPROC)glewGetProcAddress((const GLubyte*)"wglGetExtensionsStringARB")) == NULL) || r; return r; } #endif /* WGL_ARB_extensions_string */ #ifdef WGL_ARB_framebuffer_sRGB #endif /* WGL_ARB_framebuffer_sRGB */ #ifdef WGL_ARB_make_current_read static GLboolean _glewInit_WGL_ARB_make_current_read (WGLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((wglGetCurrentReadDCARB = (PFNWGLGETCURRENTREADDCARBPROC)glewGetProcAddress((const GLubyte*)"wglGetCurrentReadDCARB")) == NULL) || r; r = ((wglMakeContextCurrentARB = (PFNWGLMAKECONTEXTCURRENTARBPROC)glewGetProcAddress((const GLubyte*)"wglMakeContextCurrentARB")) == NULL) || r; return r; } #endif /* WGL_ARB_make_current_read */ #ifdef WGL_ARB_multisample #endif /* WGL_ARB_multisample */ #ifdef WGL_ARB_pbuffer static GLboolean _glewInit_WGL_ARB_pbuffer (WGLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((wglCreatePbufferARB = (PFNWGLCREATEPBUFFERARBPROC)glewGetProcAddress((const GLubyte*)"wglCreatePbufferARB")) == NULL) || r; r = ((wglDestroyPbufferARB = (PFNWGLDESTROYPBUFFERARBPROC)glewGetProcAddress((const GLubyte*)"wglDestroyPbufferARB")) == NULL) || r; r = ((wglGetPbufferDCARB = (PFNWGLGETPBUFFERDCARBPROC)glewGetProcAddress((const GLubyte*)"wglGetPbufferDCARB")) == NULL) || r; r = ((wglQueryPbufferARB = (PFNWGLQUERYPBUFFERARBPROC)glewGetProcAddress((const GLubyte*)"wglQueryPbufferARB")) == NULL) || r; r = ((wglReleasePbufferDCARB = (PFNWGLRELEASEPBUFFERDCARBPROC)glewGetProcAddress((const GLubyte*)"wglReleasePbufferDCARB")) == NULL) || r; return r; } #endif /* WGL_ARB_pbuffer */ #ifdef WGL_ARB_pixel_format static GLboolean _glewInit_WGL_ARB_pixel_format (WGLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((wglChoosePixelFormatARB = (PFNWGLCHOOSEPIXELFORMATARBPROC)glewGetProcAddress((const GLubyte*)"wglChoosePixelFormatARB")) == NULL) || r; r = ((wglGetPixelFormatAttribfvARB = (PFNWGLGETPIXELFORMATATTRIBFVARBPROC)glewGetProcAddress((const GLubyte*)"wglGetPixelFormatAttribfvARB")) == NULL) || r; r = ((wglGetPixelFormatAttribivARB = (PFNWGLGETPIXELFORMATATTRIBIVARBPROC)glewGetProcAddress((const GLubyte*)"wglGetPixelFormatAttribivARB")) == NULL) || r; return r; } #endif /* WGL_ARB_pixel_format */ #ifdef WGL_ARB_pixel_format_float #endif /* WGL_ARB_pixel_format_float */ #ifdef WGL_ARB_render_texture static GLboolean _glewInit_WGL_ARB_render_texture (WGLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((wglBindTexImageARB = (PFNWGLBINDTEXIMAGEARBPROC)glewGetProcAddress((const GLubyte*)"wglBindTexImageARB")) == NULL) || r; r = ((wglReleaseTexImageARB = (PFNWGLRELEASETEXIMAGEARBPROC)glewGetProcAddress((const GLubyte*)"wglReleaseTexImageARB")) == NULL) || r; r = ((wglSetPbufferAttribARB = (PFNWGLSETPBUFFERATTRIBARBPROC)glewGetProcAddress((const GLubyte*)"wglSetPbufferAttribARB")) == NULL) || r; return r; } #endif /* WGL_ARB_render_texture */ #ifdef WGL_ATI_pixel_format_float #endif /* WGL_ATI_pixel_format_float */ #ifdef WGL_ATI_render_texture_rectangle #endif /* WGL_ATI_render_texture_rectangle */ #ifdef WGL_EXT_create_context_es2_profile #endif /* WGL_EXT_create_context_es2_profile */ #ifdef WGL_EXT_create_context_es_profile #endif /* WGL_EXT_create_context_es_profile */ #ifdef WGL_EXT_depth_float #endif /* WGL_EXT_depth_float */ #ifdef WGL_EXT_display_color_table static GLboolean _glewInit_WGL_EXT_display_color_table (WGLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((wglBindDisplayColorTableEXT = (PFNWGLBINDDISPLAYCOLORTABLEEXTPROC)glewGetProcAddress((const GLubyte*)"wglBindDisplayColorTableEXT")) == NULL) || r; r = ((wglCreateDisplayColorTableEXT = (PFNWGLCREATEDISPLAYCOLORTABLEEXTPROC)glewGetProcAddress((const GLubyte*)"wglCreateDisplayColorTableEXT")) == NULL) || r; r = ((wglDestroyDisplayColorTableEXT = (PFNWGLDESTROYDISPLAYCOLORTABLEEXTPROC)glewGetProcAddress((const GLubyte*)"wglDestroyDisplayColorTableEXT")) == NULL) || r; r = ((wglLoadDisplayColorTableEXT = (PFNWGLLOADDISPLAYCOLORTABLEEXTPROC)glewGetProcAddress((const GLubyte*)"wglLoadDisplayColorTableEXT")) == NULL) || r; return r; } #endif /* WGL_EXT_display_color_table */ #ifdef WGL_EXT_extensions_string static GLboolean _glewInit_WGL_EXT_extensions_string (WGLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((wglGetExtensionsStringEXT = (PFNWGLGETEXTENSIONSSTRINGEXTPROC)glewGetProcAddress((const GLubyte*)"wglGetExtensionsStringEXT")) == NULL) || r; return r; } #endif /* WGL_EXT_extensions_string */ #ifdef WGL_EXT_framebuffer_sRGB #endif /* WGL_EXT_framebuffer_sRGB */ #ifdef WGL_EXT_make_current_read static GLboolean _glewInit_WGL_EXT_make_current_read (WGLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((wglGetCurrentReadDCEXT = (PFNWGLGETCURRENTREADDCEXTPROC)glewGetProcAddress((const GLubyte*)"wglGetCurrentReadDCEXT")) == NULL) || r; r = ((wglMakeContextCurrentEXT = (PFNWGLMAKECONTEXTCURRENTEXTPROC)glewGetProcAddress((const GLubyte*)"wglMakeContextCurrentEXT")) == NULL) || r; return r; } #endif /* WGL_EXT_make_current_read */ #ifdef WGL_EXT_multisample #endif /* WGL_EXT_multisample */ #ifdef WGL_EXT_pbuffer static GLboolean _glewInit_WGL_EXT_pbuffer (WGLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((wglCreatePbufferEXT = (PFNWGLCREATEPBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"wglCreatePbufferEXT")) == NULL) || r; r = ((wglDestroyPbufferEXT = (PFNWGLDESTROYPBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"wglDestroyPbufferEXT")) == NULL) || r; r = ((wglGetPbufferDCEXT = (PFNWGLGETPBUFFERDCEXTPROC)glewGetProcAddress((const GLubyte*)"wglGetPbufferDCEXT")) == NULL) || r; r = ((wglQueryPbufferEXT = (PFNWGLQUERYPBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"wglQueryPbufferEXT")) == NULL) || r; r = ((wglReleasePbufferDCEXT = (PFNWGLRELEASEPBUFFERDCEXTPROC)glewGetProcAddress((const GLubyte*)"wglReleasePbufferDCEXT")) == NULL) || r; return r; } #endif /* WGL_EXT_pbuffer */ #ifdef WGL_EXT_pixel_format static GLboolean _glewInit_WGL_EXT_pixel_format (WGLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((wglChoosePixelFormatEXT = (PFNWGLCHOOSEPIXELFORMATEXTPROC)glewGetProcAddress((const GLubyte*)"wglChoosePixelFormatEXT")) == NULL) || r; r = ((wglGetPixelFormatAttribfvEXT = (PFNWGLGETPIXELFORMATATTRIBFVEXTPROC)glewGetProcAddress((const GLubyte*)"wglGetPixelFormatAttribfvEXT")) == NULL) || r; r = ((wglGetPixelFormatAttribivEXT = (PFNWGLGETPIXELFORMATATTRIBIVEXTPROC)glewGetProcAddress((const GLubyte*)"wglGetPixelFormatAttribivEXT")) == NULL) || r; return r; } #endif /* WGL_EXT_pixel_format */ #ifdef WGL_EXT_pixel_format_packed_float #endif /* WGL_EXT_pixel_format_packed_float */ #ifdef WGL_EXT_swap_control static GLboolean _glewInit_WGL_EXT_swap_control (WGLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((wglGetSwapIntervalEXT = (PFNWGLGETSWAPINTERVALEXTPROC)glewGetProcAddress((const GLubyte*)"wglGetSwapIntervalEXT")) == NULL) || r; r = ((wglSwapIntervalEXT = (PFNWGLSWAPINTERVALEXTPROC)glewGetProcAddress((const GLubyte*)"wglSwapIntervalEXT")) == NULL) || r; return r; } #endif /* WGL_EXT_swap_control */ #ifdef WGL_EXT_swap_control_tear #endif /* WGL_EXT_swap_control_tear */ #ifdef WGL_I3D_digital_video_control static GLboolean _glewInit_WGL_I3D_digital_video_control (WGLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((wglGetDigitalVideoParametersI3D = (PFNWGLGETDIGITALVIDEOPARAMETERSI3DPROC)glewGetProcAddress((const GLubyte*)"wglGetDigitalVideoParametersI3D")) == NULL) || r; r = ((wglSetDigitalVideoParametersI3D = (PFNWGLSETDIGITALVIDEOPARAMETERSI3DPROC)glewGetProcAddress((const GLubyte*)"wglSetDigitalVideoParametersI3D")) == NULL) || r; return r; } #endif /* WGL_I3D_digital_video_control */ #ifdef WGL_I3D_gamma static GLboolean _glewInit_WGL_I3D_gamma (WGLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((wglGetGammaTableI3D = (PFNWGLGETGAMMATABLEI3DPROC)glewGetProcAddress((const GLubyte*)"wglGetGammaTableI3D")) == NULL) || r; r = ((wglGetGammaTableParametersI3D = (PFNWGLGETGAMMATABLEPARAMETERSI3DPROC)glewGetProcAddress((const GLubyte*)"wglGetGammaTableParametersI3D")) == NULL) || r; r = ((wglSetGammaTableI3D = (PFNWGLSETGAMMATABLEI3DPROC)glewGetProcAddress((const GLubyte*)"wglSetGammaTableI3D")) == NULL) || r; r = ((wglSetGammaTableParametersI3D = (PFNWGLSETGAMMATABLEPARAMETERSI3DPROC)glewGetProcAddress((const GLubyte*)"wglSetGammaTableParametersI3D")) == NULL) || r; return r; } #endif /* WGL_I3D_gamma */ #ifdef WGL_I3D_genlock static GLboolean _glewInit_WGL_I3D_genlock (WGLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((wglDisableGenlockI3D = (PFNWGLDISABLEGENLOCKI3DPROC)glewGetProcAddress((const GLubyte*)"wglDisableGenlockI3D")) == NULL) || r; r = ((wglEnableGenlockI3D = (PFNWGLENABLEGENLOCKI3DPROC)glewGetProcAddress((const GLubyte*)"wglEnableGenlockI3D")) == NULL) || r; r = ((wglGenlockSampleRateI3D = (PFNWGLGENLOCKSAMPLERATEI3DPROC)glewGetProcAddress((const GLubyte*)"wglGenlockSampleRateI3D")) == NULL) || r; r = ((wglGenlockSourceDelayI3D = (PFNWGLGENLOCKSOURCEDELAYI3DPROC)glewGetProcAddress((const GLubyte*)"wglGenlockSourceDelayI3D")) == NULL) || r; r = ((wglGenlockSourceEdgeI3D = (PFNWGLGENLOCKSOURCEEDGEI3DPROC)glewGetProcAddress((const GLubyte*)"wglGenlockSourceEdgeI3D")) == NULL) || r; r = ((wglGenlockSourceI3D = (PFNWGLGENLOCKSOURCEI3DPROC)glewGetProcAddress((const GLubyte*)"wglGenlockSourceI3D")) == NULL) || r; r = ((wglGetGenlockSampleRateI3D = (PFNWGLGETGENLOCKSAMPLERATEI3DPROC)glewGetProcAddress((const GLubyte*)"wglGetGenlockSampleRateI3D")) == NULL) || r; r = ((wglGetGenlockSourceDelayI3D = (PFNWGLGETGENLOCKSOURCEDELAYI3DPROC)glewGetProcAddress((const GLubyte*)"wglGetGenlockSourceDelayI3D")) == NULL) || r; r = ((wglGetGenlockSourceEdgeI3D = (PFNWGLGETGENLOCKSOURCEEDGEI3DPROC)glewGetProcAddress((const GLubyte*)"wglGetGenlockSourceEdgeI3D")) == NULL) || r; r = ((wglGetGenlockSourceI3D = (PFNWGLGETGENLOCKSOURCEI3DPROC)glewGetProcAddress((const GLubyte*)"wglGetGenlockSourceI3D")) == NULL) || r; r = ((wglIsEnabledGenlockI3D = (PFNWGLISENABLEDGENLOCKI3DPROC)glewGetProcAddress((const GLubyte*)"wglIsEnabledGenlockI3D")) == NULL) || r; r = ((wglQueryGenlockMaxSourceDelayI3D = (PFNWGLQUERYGENLOCKMAXSOURCEDELAYI3DPROC)glewGetProcAddress((const GLubyte*)"wglQueryGenlockMaxSourceDelayI3D")) == NULL) || r; return r; } #endif /* WGL_I3D_genlock */ #ifdef WGL_I3D_image_buffer static GLboolean _glewInit_WGL_I3D_image_buffer (WGLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((wglAssociateImageBufferEventsI3D = (PFNWGLASSOCIATEIMAGEBUFFEREVENTSI3DPROC)glewGetProcAddress((const GLubyte*)"wglAssociateImageBufferEventsI3D")) == NULL) || r; r = ((wglCreateImageBufferI3D = (PFNWGLCREATEIMAGEBUFFERI3DPROC)glewGetProcAddress((const GLubyte*)"wglCreateImageBufferI3D")) == NULL) || r; r = ((wglDestroyImageBufferI3D = (PFNWGLDESTROYIMAGEBUFFERI3DPROC)glewGetProcAddress((const GLubyte*)"wglDestroyImageBufferI3D")) == NULL) || r; r = ((wglReleaseImageBufferEventsI3D = (PFNWGLRELEASEIMAGEBUFFEREVENTSI3DPROC)glewGetProcAddress((const GLubyte*)"wglReleaseImageBufferEventsI3D")) == NULL) || r; return r; } #endif /* WGL_I3D_image_buffer */ #ifdef WGL_I3D_swap_frame_lock static GLboolean _glewInit_WGL_I3D_swap_frame_lock (WGLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((wglDisableFrameLockI3D = (PFNWGLDISABLEFRAMELOCKI3DPROC)glewGetProcAddress((const GLubyte*)"wglDisableFrameLockI3D")) == NULL) || r; r = ((wglEnableFrameLockI3D = (PFNWGLENABLEFRAMELOCKI3DPROC)glewGetProcAddress((const GLubyte*)"wglEnableFrameLockI3D")) == NULL) || r; r = ((wglIsEnabledFrameLockI3D = (PFNWGLISENABLEDFRAMELOCKI3DPROC)glewGetProcAddress((const GLubyte*)"wglIsEnabledFrameLockI3D")) == NULL) || r; r = ((wglQueryFrameLockMasterI3D = (PFNWGLQUERYFRAMELOCKMASTERI3DPROC)glewGetProcAddress((const GLubyte*)"wglQueryFrameLockMasterI3D")) == NULL) || r; return r; } #endif /* WGL_I3D_swap_frame_lock */ #ifdef WGL_I3D_swap_frame_usage static GLboolean _glewInit_WGL_I3D_swap_frame_usage (WGLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((wglBeginFrameTrackingI3D = (PFNWGLBEGINFRAMETRACKINGI3DPROC)glewGetProcAddress((const GLubyte*)"wglBeginFrameTrackingI3D")) == NULL) || r; r = ((wglEndFrameTrackingI3D = (PFNWGLENDFRAMETRACKINGI3DPROC)glewGetProcAddress((const GLubyte*)"wglEndFrameTrackingI3D")) == NULL) || r; r = ((wglGetFrameUsageI3D = (PFNWGLGETFRAMEUSAGEI3DPROC)glewGetProcAddress((const GLubyte*)"wglGetFrameUsageI3D")) == NULL) || r; r = ((wglQueryFrameTrackingI3D = (PFNWGLQUERYFRAMETRACKINGI3DPROC)glewGetProcAddress((const GLubyte*)"wglQueryFrameTrackingI3D")) == NULL) || r; return r; } #endif /* WGL_I3D_swap_frame_usage */ #ifdef WGL_NV_DX_interop static GLboolean _glewInit_WGL_NV_DX_interop (WGLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((wglDXCloseDeviceNV = (PFNWGLDXCLOSEDEVICENVPROC)glewGetProcAddress((const GLubyte*)"wglDXCloseDeviceNV")) == NULL) || r; r = ((wglDXLockObjectsNV = (PFNWGLDXLOCKOBJECTSNVPROC)glewGetProcAddress((const GLubyte*)"wglDXLockObjectsNV")) == NULL) || r; r = ((wglDXObjectAccessNV = (PFNWGLDXOBJECTACCESSNVPROC)glewGetProcAddress((const GLubyte*)"wglDXObjectAccessNV")) == NULL) || r; r = ((wglDXOpenDeviceNV = (PFNWGLDXOPENDEVICENVPROC)glewGetProcAddress((const GLubyte*)"wglDXOpenDeviceNV")) == NULL) || r; r = ((wglDXRegisterObjectNV = (PFNWGLDXREGISTEROBJECTNVPROC)glewGetProcAddress((const GLubyte*)"wglDXRegisterObjectNV")) == NULL) || r; r = ((wglDXSetResourceShareHandleNV = (PFNWGLDXSETRESOURCESHAREHANDLENVPROC)glewGetProcAddress((const GLubyte*)"wglDXSetResourceShareHandleNV")) == NULL) || r; r = ((wglDXUnlockObjectsNV = (PFNWGLDXUNLOCKOBJECTSNVPROC)glewGetProcAddress((const GLubyte*)"wglDXUnlockObjectsNV")) == NULL) || r; r = ((wglDXUnregisterObjectNV = (PFNWGLDXUNREGISTEROBJECTNVPROC)glewGetProcAddress((const GLubyte*)"wglDXUnregisterObjectNV")) == NULL) || r; return r; } #endif /* WGL_NV_DX_interop */ #ifdef WGL_NV_DX_interop2 #endif /* WGL_NV_DX_interop2 */ #ifdef WGL_NV_copy_image static GLboolean _glewInit_WGL_NV_copy_image (WGLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((wglCopyImageSubDataNV = (PFNWGLCOPYIMAGESUBDATANVPROC)glewGetProcAddress((const GLubyte*)"wglCopyImageSubDataNV")) == NULL) || r; return r; } #endif /* WGL_NV_copy_image */ #ifdef WGL_NV_float_buffer #endif /* WGL_NV_float_buffer */ #ifdef WGL_NV_gpu_affinity static GLboolean _glewInit_WGL_NV_gpu_affinity (WGLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((wglCreateAffinityDCNV = (PFNWGLCREATEAFFINITYDCNVPROC)glewGetProcAddress((const GLubyte*)"wglCreateAffinityDCNV")) == NULL) || r; r = ((wglDeleteDCNV = (PFNWGLDELETEDCNVPROC)glewGetProcAddress((const GLubyte*)"wglDeleteDCNV")) == NULL) || r; r = ((wglEnumGpuDevicesNV = (PFNWGLENUMGPUDEVICESNVPROC)glewGetProcAddress((const GLubyte*)"wglEnumGpuDevicesNV")) == NULL) || r; r = ((wglEnumGpusFromAffinityDCNV = (PFNWGLENUMGPUSFROMAFFINITYDCNVPROC)glewGetProcAddress((const GLubyte*)"wglEnumGpusFromAffinityDCNV")) == NULL) || r; r = ((wglEnumGpusNV = (PFNWGLENUMGPUSNVPROC)glewGetProcAddress((const GLubyte*)"wglEnumGpusNV")) == NULL) || r; return r; } #endif /* WGL_NV_gpu_affinity */ #ifdef WGL_NV_multisample_coverage #endif /* WGL_NV_multisample_coverage */ #ifdef WGL_NV_present_video static GLboolean _glewInit_WGL_NV_present_video (WGLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((wglBindVideoDeviceNV = (PFNWGLBINDVIDEODEVICENVPROC)glewGetProcAddress((const GLubyte*)"wglBindVideoDeviceNV")) == NULL) || r; r = ((wglEnumerateVideoDevicesNV = (PFNWGLENUMERATEVIDEODEVICESNVPROC)glewGetProcAddress((const GLubyte*)"wglEnumerateVideoDevicesNV")) == NULL) || r; r = ((wglQueryCurrentContextNV = (PFNWGLQUERYCURRENTCONTEXTNVPROC)glewGetProcAddress((const GLubyte*)"wglQueryCurrentContextNV")) == NULL) || r; return r; } #endif /* WGL_NV_present_video */ #ifdef WGL_NV_render_depth_texture #endif /* WGL_NV_render_depth_texture */ #ifdef WGL_NV_render_texture_rectangle #endif /* WGL_NV_render_texture_rectangle */ #ifdef WGL_NV_swap_group static GLboolean _glewInit_WGL_NV_swap_group (WGLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((wglBindSwapBarrierNV = (PFNWGLBINDSWAPBARRIERNVPROC)glewGetProcAddress((const GLubyte*)"wglBindSwapBarrierNV")) == NULL) || r; r = ((wglJoinSwapGroupNV = (PFNWGLJOINSWAPGROUPNVPROC)glewGetProcAddress((const GLubyte*)"wglJoinSwapGroupNV")) == NULL) || r; r = ((wglQueryFrameCountNV = (PFNWGLQUERYFRAMECOUNTNVPROC)glewGetProcAddress((const GLubyte*)"wglQueryFrameCountNV")) == NULL) || r; r = ((wglQueryMaxSwapGroupsNV = (PFNWGLQUERYMAXSWAPGROUPSNVPROC)glewGetProcAddress((const GLubyte*)"wglQueryMaxSwapGroupsNV")) == NULL) || r; r = ((wglQuerySwapGroupNV = (PFNWGLQUERYSWAPGROUPNVPROC)glewGetProcAddress((const GLubyte*)"wglQuerySwapGroupNV")) == NULL) || r; r = ((wglResetFrameCountNV = (PFNWGLRESETFRAMECOUNTNVPROC)glewGetProcAddress((const GLubyte*)"wglResetFrameCountNV")) == NULL) || r; return r; } #endif /* WGL_NV_swap_group */ #ifdef WGL_NV_vertex_array_range static GLboolean _glewInit_WGL_NV_vertex_array_range (WGLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((wglAllocateMemoryNV = (PFNWGLALLOCATEMEMORYNVPROC)glewGetProcAddress((const GLubyte*)"wglAllocateMemoryNV")) == NULL) || r; r = ((wglFreeMemoryNV = (PFNWGLFREEMEMORYNVPROC)glewGetProcAddress((const GLubyte*)"wglFreeMemoryNV")) == NULL) || r; return r; } #endif /* WGL_NV_vertex_array_range */ #ifdef WGL_NV_video_capture static GLboolean _glewInit_WGL_NV_video_capture (WGLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((wglBindVideoCaptureDeviceNV = (PFNWGLBINDVIDEOCAPTUREDEVICENVPROC)glewGetProcAddress((const GLubyte*)"wglBindVideoCaptureDeviceNV")) == NULL) || r; r = ((wglEnumerateVideoCaptureDevicesNV = (PFNWGLENUMERATEVIDEOCAPTUREDEVICESNVPROC)glewGetProcAddress((const GLubyte*)"wglEnumerateVideoCaptureDevicesNV")) == NULL) || r; r = ((wglLockVideoCaptureDeviceNV = (PFNWGLLOCKVIDEOCAPTUREDEVICENVPROC)glewGetProcAddress((const GLubyte*)"wglLockVideoCaptureDeviceNV")) == NULL) || r; r = ((wglQueryVideoCaptureDeviceNV = (PFNWGLQUERYVIDEOCAPTUREDEVICENVPROC)glewGetProcAddress((const GLubyte*)"wglQueryVideoCaptureDeviceNV")) == NULL) || r; r = ((wglReleaseVideoCaptureDeviceNV = (PFNWGLRELEASEVIDEOCAPTUREDEVICENVPROC)glewGetProcAddress((const GLubyte*)"wglReleaseVideoCaptureDeviceNV")) == NULL) || r; return r; } #endif /* WGL_NV_video_capture */ #ifdef WGL_NV_video_output static GLboolean _glewInit_WGL_NV_video_output (WGLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((wglBindVideoImageNV = (PFNWGLBINDVIDEOIMAGENVPROC)glewGetProcAddress((const GLubyte*)"wglBindVideoImageNV")) == NULL) || r; r = ((wglGetVideoDeviceNV = (PFNWGLGETVIDEODEVICENVPROC)glewGetProcAddress((const GLubyte*)"wglGetVideoDeviceNV")) == NULL) || r; r = ((wglGetVideoInfoNV = (PFNWGLGETVIDEOINFONVPROC)glewGetProcAddress((const GLubyte*)"wglGetVideoInfoNV")) == NULL) || r; r = ((wglReleaseVideoDeviceNV = (PFNWGLRELEASEVIDEODEVICENVPROC)glewGetProcAddress((const GLubyte*)"wglReleaseVideoDeviceNV")) == NULL) || r; r = ((wglReleaseVideoImageNV = (PFNWGLRELEASEVIDEOIMAGENVPROC)glewGetProcAddress((const GLubyte*)"wglReleaseVideoImageNV")) == NULL) || r; r = ((wglSendPbufferToVideoNV = (PFNWGLSENDPBUFFERTOVIDEONVPROC)glewGetProcAddress((const GLubyte*)"wglSendPbufferToVideoNV")) == NULL) || r; return r; } #endif /* WGL_NV_video_output */ #ifdef WGL_OML_sync_control static GLboolean _glewInit_WGL_OML_sync_control (WGLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((wglGetMscRateOML = (PFNWGLGETMSCRATEOMLPROC)glewGetProcAddress((const GLubyte*)"wglGetMscRateOML")) == NULL) || r; r = ((wglGetSyncValuesOML = (PFNWGLGETSYNCVALUESOMLPROC)glewGetProcAddress((const GLubyte*)"wglGetSyncValuesOML")) == NULL) || r; r = ((wglSwapBuffersMscOML = (PFNWGLSWAPBUFFERSMSCOMLPROC)glewGetProcAddress((const GLubyte*)"wglSwapBuffersMscOML")) == NULL) || r; r = ((wglSwapLayerBuffersMscOML = (PFNWGLSWAPLAYERBUFFERSMSCOMLPROC)glewGetProcAddress((const GLubyte*)"wglSwapLayerBuffersMscOML")) == NULL) || r; r = ((wglWaitForMscOML = (PFNWGLWAITFORMSCOMLPROC)glewGetProcAddress((const GLubyte*)"wglWaitForMscOML")) == NULL) || r; r = ((wglWaitForSbcOML = (PFNWGLWAITFORSBCOMLPROC)glewGetProcAddress((const GLubyte*)"wglWaitForSbcOML")) == NULL) || r; return r; } #endif /* WGL_OML_sync_control */ /* ------------------------------------------------------------------------- */ static PFNWGLGETEXTENSIONSSTRINGARBPROC _wglewGetExtensionsStringARB = NULL; static PFNWGLGETEXTENSIONSSTRINGEXTPROC _wglewGetExtensionsStringEXT = NULL; GLboolean GLEWAPIENTRY wglewGetExtension (const char* name) { const GLubyte* start; const GLubyte* end; if (_wglewGetExtensionsStringARB == NULL) if (_wglewGetExtensionsStringEXT == NULL) return GL_FALSE; else start = (const GLubyte*)_wglewGetExtensionsStringEXT(); else start = (const GLubyte*)_wglewGetExtensionsStringARB(wglGetCurrentDC()); if (start == 0) return GL_FALSE; end = start + _glewStrLen(start); return _glewSearchExtension(name, start, end); } GLenum GLEWAPIENTRY wglewContextInit (WGLEW_CONTEXT_ARG_DEF_LIST) { GLboolean crippled; const GLubyte* extStart; const GLubyte* extEnd; /* find wgl extension string query functions */ _wglewGetExtensionsStringARB = (PFNWGLGETEXTENSIONSSTRINGARBPROC)glewGetProcAddress((const GLubyte*)"wglGetExtensionsStringARB"); _wglewGetExtensionsStringEXT = (PFNWGLGETEXTENSIONSSTRINGEXTPROC)glewGetProcAddress((const GLubyte*)"wglGetExtensionsStringEXT"); /* query wgl extension string */ if (_wglewGetExtensionsStringARB == NULL) if (_wglewGetExtensionsStringEXT == NULL) extStart = (const GLubyte*)""; else extStart = (const GLubyte*)_wglewGetExtensionsStringEXT(); else extStart = (const GLubyte*)_wglewGetExtensionsStringARB(wglGetCurrentDC()); extEnd = extStart + _glewStrLen(extStart); /* initialize extensions */ crippled = _wglewGetExtensionsStringARB == NULL && _wglewGetExtensionsStringEXT == NULL; #ifdef WGL_3DFX_multisample CONST_CAST(WGLEW_3DFX_multisample) = _glewSearchExtension("WGL_3DFX_multisample", extStart, extEnd); #endif /* WGL_3DFX_multisample */ #ifdef WGL_3DL_stereo_control CONST_CAST(WGLEW_3DL_stereo_control) = _glewSearchExtension("WGL_3DL_stereo_control", extStart, extEnd); if (glewExperimental || WGLEW_3DL_stereo_control|| crippled) CONST_CAST(WGLEW_3DL_stereo_control)= !_glewInit_WGL_3DL_stereo_control(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* WGL_3DL_stereo_control */ #ifdef WGL_AMD_gpu_association CONST_CAST(WGLEW_AMD_gpu_association) = _glewSearchExtension("WGL_AMD_gpu_association", extStart, extEnd); if (glewExperimental || WGLEW_AMD_gpu_association|| crippled) CONST_CAST(WGLEW_AMD_gpu_association)= !_glewInit_WGL_AMD_gpu_association(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* WGL_AMD_gpu_association */ #ifdef WGL_ARB_buffer_region CONST_CAST(WGLEW_ARB_buffer_region) = _glewSearchExtension("WGL_ARB_buffer_region", extStart, extEnd); if (glewExperimental || WGLEW_ARB_buffer_region|| crippled) CONST_CAST(WGLEW_ARB_buffer_region)= !_glewInit_WGL_ARB_buffer_region(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* WGL_ARB_buffer_region */ #ifdef WGL_ARB_create_context CONST_CAST(WGLEW_ARB_create_context) = _glewSearchExtension("WGL_ARB_create_context", extStart, extEnd); if (glewExperimental || WGLEW_ARB_create_context|| crippled) CONST_CAST(WGLEW_ARB_create_context)= !_glewInit_WGL_ARB_create_context(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* WGL_ARB_create_context */ #ifdef WGL_ARB_create_context_profile CONST_CAST(WGLEW_ARB_create_context_profile) = _glewSearchExtension("WGL_ARB_create_context_profile", extStart, extEnd); #endif /* WGL_ARB_create_context_profile */ #ifdef WGL_ARB_create_context_robustness CONST_CAST(WGLEW_ARB_create_context_robustness) = _glewSearchExtension("WGL_ARB_create_context_robustness", extStart, extEnd); #endif /* WGL_ARB_create_context_robustness */ #ifdef WGL_ARB_extensions_string CONST_CAST(WGLEW_ARB_extensions_string) = _glewSearchExtension("WGL_ARB_extensions_string", extStart, extEnd); if (glewExperimental || WGLEW_ARB_extensions_string|| crippled) CONST_CAST(WGLEW_ARB_extensions_string)= !_glewInit_WGL_ARB_extensions_string(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* WGL_ARB_extensions_string */ #ifdef WGL_ARB_framebuffer_sRGB CONST_CAST(WGLEW_ARB_framebuffer_sRGB) = _glewSearchExtension("WGL_ARB_framebuffer_sRGB", extStart, extEnd); #endif /* WGL_ARB_framebuffer_sRGB */ #ifdef WGL_ARB_make_current_read CONST_CAST(WGLEW_ARB_make_current_read) = _glewSearchExtension("WGL_ARB_make_current_read", extStart, extEnd); if (glewExperimental || WGLEW_ARB_make_current_read|| crippled) CONST_CAST(WGLEW_ARB_make_current_read)= !_glewInit_WGL_ARB_make_current_read(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* WGL_ARB_make_current_read */ #ifdef WGL_ARB_multisample CONST_CAST(WGLEW_ARB_multisample) = _glewSearchExtension("WGL_ARB_multisample", extStart, extEnd); #endif /* WGL_ARB_multisample */ #ifdef WGL_ARB_pbuffer CONST_CAST(WGLEW_ARB_pbuffer) = _glewSearchExtension("WGL_ARB_pbuffer", extStart, extEnd); if (glewExperimental || WGLEW_ARB_pbuffer|| crippled) CONST_CAST(WGLEW_ARB_pbuffer)= !_glewInit_WGL_ARB_pbuffer(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* WGL_ARB_pbuffer */ #ifdef WGL_ARB_pixel_format CONST_CAST(WGLEW_ARB_pixel_format) = _glewSearchExtension("WGL_ARB_pixel_format", extStart, extEnd); if (glewExperimental || WGLEW_ARB_pixel_format|| crippled) CONST_CAST(WGLEW_ARB_pixel_format)= !_glewInit_WGL_ARB_pixel_format(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* WGL_ARB_pixel_format */ #ifdef WGL_ARB_pixel_format_float CONST_CAST(WGLEW_ARB_pixel_format_float) = _glewSearchExtension("WGL_ARB_pixel_format_float", extStart, extEnd); #endif /* WGL_ARB_pixel_format_float */ #ifdef WGL_ARB_render_texture CONST_CAST(WGLEW_ARB_render_texture) = _glewSearchExtension("WGL_ARB_render_texture", extStart, extEnd); if (glewExperimental || WGLEW_ARB_render_texture|| crippled) CONST_CAST(WGLEW_ARB_render_texture)= !_glewInit_WGL_ARB_render_texture(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* WGL_ARB_render_texture */ #ifdef WGL_ATI_pixel_format_float CONST_CAST(WGLEW_ATI_pixel_format_float) = _glewSearchExtension("WGL_ATI_pixel_format_float", extStart, extEnd); #endif /* WGL_ATI_pixel_format_float */ #ifdef WGL_ATI_render_texture_rectangle CONST_CAST(WGLEW_ATI_render_texture_rectangle) = _glewSearchExtension("WGL_ATI_render_texture_rectangle", extStart, extEnd); #endif /* WGL_ATI_render_texture_rectangle */ #ifdef WGL_EXT_create_context_es2_profile CONST_CAST(WGLEW_EXT_create_context_es2_profile) = _glewSearchExtension("WGL_EXT_create_context_es2_profile", extStart, extEnd); #endif /* WGL_EXT_create_context_es2_profile */ #ifdef WGL_EXT_create_context_es_profile CONST_CAST(WGLEW_EXT_create_context_es_profile) = _glewSearchExtension("WGL_EXT_create_context_es_profile", extStart, extEnd); #endif /* WGL_EXT_create_context_es_profile */ #ifdef WGL_EXT_depth_float CONST_CAST(WGLEW_EXT_depth_float) = _glewSearchExtension("WGL_EXT_depth_float", extStart, extEnd); #endif /* WGL_EXT_depth_float */ #ifdef WGL_EXT_display_color_table CONST_CAST(WGLEW_EXT_display_color_table) = _glewSearchExtension("WGL_EXT_display_color_table", extStart, extEnd); if (glewExperimental || WGLEW_EXT_display_color_table|| crippled) CONST_CAST(WGLEW_EXT_display_color_table)= !_glewInit_WGL_EXT_display_color_table(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* WGL_EXT_display_color_table */ #ifdef WGL_EXT_extensions_string CONST_CAST(WGLEW_EXT_extensions_string) = _glewSearchExtension("WGL_EXT_extensions_string", extStart, extEnd); if (glewExperimental || WGLEW_EXT_extensions_string|| crippled) CONST_CAST(WGLEW_EXT_extensions_string)= !_glewInit_WGL_EXT_extensions_string(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* WGL_EXT_extensions_string */ #ifdef WGL_EXT_framebuffer_sRGB CONST_CAST(WGLEW_EXT_framebuffer_sRGB) = _glewSearchExtension("WGL_EXT_framebuffer_sRGB", extStart, extEnd); #endif /* WGL_EXT_framebuffer_sRGB */ #ifdef WGL_EXT_make_current_read CONST_CAST(WGLEW_EXT_make_current_read) = _glewSearchExtension("WGL_EXT_make_current_read", extStart, extEnd); if (glewExperimental || WGLEW_EXT_make_current_read|| crippled) CONST_CAST(WGLEW_EXT_make_current_read)= !_glewInit_WGL_EXT_make_current_read(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* WGL_EXT_make_current_read */ #ifdef WGL_EXT_multisample CONST_CAST(WGLEW_EXT_multisample) = _glewSearchExtension("WGL_EXT_multisample", extStart, extEnd); #endif /* WGL_EXT_multisample */ #ifdef WGL_EXT_pbuffer CONST_CAST(WGLEW_EXT_pbuffer) = _glewSearchExtension("WGL_EXT_pbuffer", extStart, extEnd); if (glewExperimental || WGLEW_EXT_pbuffer|| crippled) CONST_CAST(WGLEW_EXT_pbuffer)= !_glewInit_WGL_EXT_pbuffer(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* WGL_EXT_pbuffer */ #ifdef WGL_EXT_pixel_format CONST_CAST(WGLEW_EXT_pixel_format) = _glewSearchExtension("WGL_EXT_pixel_format", extStart, extEnd); if (glewExperimental || WGLEW_EXT_pixel_format|| crippled) CONST_CAST(WGLEW_EXT_pixel_format)= !_glewInit_WGL_EXT_pixel_format(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* WGL_EXT_pixel_format */ #ifdef WGL_EXT_pixel_format_packed_float CONST_CAST(WGLEW_EXT_pixel_format_packed_float) = _glewSearchExtension("WGL_EXT_pixel_format_packed_float", extStart, extEnd); #endif /* WGL_EXT_pixel_format_packed_float */ #ifdef WGL_EXT_swap_control CONST_CAST(WGLEW_EXT_swap_control) = _glewSearchExtension("WGL_EXT_swap_control", extStart, extEnd); if (glewExperimental || WGLEW_EXT_swap_control|| crippled) CONST_CAST(WGLEW_EXT_swap_control)= !_glewInit_WGL_EXT_swap_control(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* WGL_EXT_swap_control */ #ifdef WGL_EXT_swap_control_tear CONST_CAST(WGLEW_EXT_swap_control_tear) = _glewSearchExtension("WGL_EXT_swap_control_tear", extStart, extEnd); #endif /* WGL_EXT_swap_control_tear */ #ifdef WGL_I3D_digital_video_control CONST_CAST(WGLEW_I3D_digital_video_control) = _glewSearchExtension("WGL_I3D_digital_video_control", extStart, extEnd); if (glewExperimental || WGLEW_I3D_digital_video_control|| crippled) CONST_CAST(WGLEW_I3D_digital_video_control)= !_glewInit_WGL_I3D_digital_video_control(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* WGL_I3D_digital_video_control */ #ifdef WGL_I3D_gamma CONST_CAST(WGLEW_I3D_gamma) = _glewSearchExtension("WGL_I3D_gamma", extStart, extEnd); if (glewExperimental || WGLEW_I3D_gamma|| crippled) CONST_CAST(WGLEW_I3D_gamma)= !_glewInit_WGL_I3D_gamma(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* WGL_I3D_gamma */ #ifdef WGL_I3D_genlock CONST_CAST(WGLEW_I3D_genlock) = _glewSearchExtension("WGL_I3D_genlock", extStart, extEnd); if (glewExperimental || WGLEW_I3D_genlock|| crippled) CONST_CAST(WGLEW_I3D_genlock)= !_glewInit_WGL_I3D_genlock(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* WGL_I3D_genlock */ #ifdef WGL_I3D_image_buffer CONST_CAST(WGLEW_I3D_image_buffer) = _glewSearchExtension("WGL_I3D_image_buffer", extStart, extEnd); if (glewExperimental || WGLEW_I3D_image_buffer|| crippled) CONST_CAST(WGLEW_I3D_image_buffer)= !_glewInit_WGL_I3D_image_buffer(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* WGL_I3D_image_buffer */ #ifdef WGL_I3D_swap_frame_lock CONST_CAST(WGLEW_I3D_swap_frame_lock) = _glewSearchExtension("WGL_I3D_swap_frame_lock", extStart, extEnd); if (glewExperimental || WGLEW_I3D_swap_frame_lock|| crippled) CONST_CAST(WGLEW_I3D_swap_frame_lock)= !_glewInit_WGL_I3D_swap_frame_lock(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* WGL_I3D_swap_frame_lock */ #ifdef WGL_I3D_swap_frame_usage CONST_CAST(WGLEW_I3D_swap_frame_usage) = _glewSearchExtension("WGL_I3D_swap_frame_usage", extStart, extEnd); if (glewExperimental || WGLEW_I3D_swap_frame_usage|| crippled) CONST_CAST(WGLEW_I3D_swap_frame_usage)= !_glewInit_WGL_I3D_swap_frame_usage(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* WGL_I3D_swap_frame_usage */ #ifdef WGL_NV_DX_interop CONST_CAST(WGLEW_NV_DX_interop) = _glewSearchExtension("WGL_NV_DX_interop", extStart, extEnd); if (glewExperimental || WGLEW_NV_DX_interop|| crippled) CONST_CAST(WGLEW_NV_DX_interop)= !_glewInit_WGL_NV_DX_interop(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* WGL_NV_DX_interop */ #ifdef WGL_NV_DX_interop2 CONST_CAST(WGLEW_NV_DX_interop2) = _glewSearchExtension("WGL_NV_DX_interop2", extStart, extEnd); #endif /* WGL_NV_DX_interop2 */ #ifdef WGL_NV_copy_image CONST_CAST(WGLEW_NV_copy_image) = _glewSearchExtension("WGL_NV_copy_image", extStart, extEnd); if (glewExperimental || WGLEW_NV_copy_image|| crippled) CONST_CAST(WGLEW_NV_copy_image)= !_glewInit_WGL_NV_copy_image(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* WGL_NV_copy_image */ #ifdef WGL_NV_float_buffer CONST_CAST(WGLEW_NV_float_buffer) = _glewSearchExtension("WGL_NV_float_buffer", extStart, extEnd); #endif /* WGL_NV_float_buffer */ #ifdef WGL_NV_gpu_affinity CONST_CAST(WGLEW_NV_gpu_affinity) = _glewSearchExtension("WGL_NV_gpu_affinity", extStart, extEnd); if (glewExperimental || WGLEW_NV_gpu_affinity|| crippled) CONST_CAST(WGLEW_NV_gpu_affinity)= !_glewInit_WGL_NV_gpu_affinity(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* WGL_NV_gpu_affinity */ #ifdef WGL_NV_multisample_coverage CONST_CAST(WGLEW_NV_multisample_coverage) = _glewSearchExtension("WGL_NV_multisample_coverage", extStart, extEnd); #endif /* WGL_NV_multisample_coverage */ #ifdef WGL_NV_present_video CONST_CAST(WGLEW_NV_present_video) = _glewSearchExtension("WGL_NV_present_video", extStart, extEnd); if (glewExperimental || WGLEW_NV_present_video|| crippled) CONST_CAST(WGLEW_NV_present_video)= !_glewInit_WGL_NV_present_video(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* WGL_NV_present_video */ #ifdef WGL_NV_render_depth_texture CONST_CAST(WGLEW_NV_render_depth_texture) = _glewSearchExtension("WGL_NV_render_depth_texture", extStart, extEnd); #endif /* WGL_NV_render_depth_texture */ #ifdef WGL_NV_render_texture_rectangle CONST_CAST(WGLEW_NV_render_texture_rectangle) = _glewSearchExtension("WGL_NV_render_texture_rectangle", extStart, extEnd); #endif /* WGL_NV_render_texture_rectangle */ #ifdef WGL_NV_swap_group CONST_CAST(WGLEW_NV_swap_group) = _glewSearchExtension("WGL_NV_swap_group", extStart, extEnd); if (glewExperimental || WGLEW_NV_swap_group|| crippled) CONST_CAST(WGLEW_NV_swap_group)= !_glewInit_WGL_NV_swap_group(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* WGL_NV_swap_group */ #ifdef WGL_NV_vertex_array_range CONST_CAST(WGLEW_NV_vertex_array_range) = _glewSearchExtension("WGL_NV_vertex_array_range", extStart, extEnd); if (glewExperimental || WGLEW_NV_vertex_array_range|| crippled) CONST_CAST(WGLEW_NV_vertex_array_range)= !_glewInit_WGL_NV_vertex_array_range(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* WGL_NV_vertex_array_range */ #ifdef WGL_NV_video_capture CONST_CAST(WGLEW_NV_video_capture) = _glewSearchExtension("WGL_NV_video_capture", extStart, extEnd); if (glewExperimental || WGLEW_NV_video_capture|| crippled) CONST_CAST(WGLEW_NV_video_capture)= !_glewInit_WGL_NV_video_capture(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* WGL_NV_video_capture */ #ifdef WGL_NV_video_output CONST_CAST(WGLEW_NV_video_output) = _glewSearchExtension("WGL_NV_video_output", extStart, extEnd); if (glewExperimental || WGLEW_NV_video_output|| crippled) CONST_CAST(WGLEW_NV_video_output)= !_glewInit_WGL_NV_video_output(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* WGL_NV_video_output */ #ifdef WGL_OML_sync_control CONST_CAST(WGLEW_OML_sync_control) = _glewSearchExtension("WGL_OML_sync_control", extStart, extEnd); if (glewExperimental || WGLEW_OML_sync_control|| crippled) CONST_CAST(WGLEW_OML_sync_control)= !_glewInit_WGL_OML_sync_control(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* WGL_OML_sync_control */ return GLEW_OK; } #elif !defined(__ANDROID__) && (!defined(__APPLE__) || defined(GLEW_APPLE_GLX)) PFNGLXGETCURRENTDISPLAYPROC __glewXGetCurrentDisplay = NULL; PFNGLXCHOOSEFBCONFIGPROC __glewXChooseFBConfig = NULL; PFNGLXCREATENEWCONTEXTPROC __glewXCreateNewContext = NULL; PFNGLXCREATEPBUFFERPROC __glewXCreatePbuffer = NULL; PFNGLXCREATEPIXMAPPROC __glewXCreatePixmap = NULL; PFNGLXCREATEWINDOWPROC __glewXCreateWindow = NULL; PFNGLXDESTROYPBUFFERPROC __glewXDestroyPbuffer = NULL; PFNGLXDESTROYPIXMAPPROC __glewXDestroyPixmap = NULL; PFNGLXDESTROYWINDOWPROC __glewXDestroyWindow = NULL; PFNGLXGETCURRENTREADDRAWABLEPROC __glewXGetCurrentReadDrawable = NULL; PFNGLXGETFBCONFIGATTRIBPROC __glewXGetFBConfigAttrib = NULL; PFNGLXGETFBCONFIGSPROC __glewXGetFBConfigs = NULL; PFNGLXGETSELECTEDEVENTPROC __glewXGetSelectedEvent = NULL; PFNGLXGETVISUALFROMFBCONFIGPROC __glewXGetVisualFromFBConfig = NULL; PFNGLXMAKECONTEXTCURRENTPROC __glewXMakeContextCurrent = NULL; PFNGLXQUERYCONTEXTPROC __glewXQueryContext = NULL; PFNGLXQUERYDRAWABLEPROC __glewXQueryDrawable = NULL; PFNGLXSELECTEVENTPROC __glewXSelectEvent = NULL; PFNGLXCREATECONTEXTATTRIBSARBPROC __glewXCreateContextAttribsARB = NULL; PFNGLXBINDTEXIMAGEATIPROC __glewXBindTexImageATI = NULL; PFNGLXDRAWABLEATTRIBATIPROC __glewXDrawableAttribATI = NULL; PFNGLXRELEASETEXIMAGEATIPROC __glewXReleaseTexImageATI = NULL; PFNGLXFREECONTEXTEXTPROC __glewXFreeContextEXT = NULL; PFNGLXGETCONTEXTIDEXTPROC __glewXGetContextIDEXT = NULL; PFNGLXIMPORTCONTEXTEXTPROC __glewXImportContextEXT = NULL; PFNGLXQUERYCONTEXTINFOEXTPROC __glewXQueryContextInfoEXT = NULL; PFNGLXSWAPINTERVALEXTPROC __glewXSwapIntervalEXT = NULL; PFNGLXBINDTEXIMAGEEXTPROC __glewXBindTexImageEXT = NULL; PFNGLXRELEASETEXIMAGEEXTPROC __glewXReleaseTexImageEXT = NULL; PFNGLXGETAGPOFFSETMESAPROC __glewXGetAGPOffsetMESA = NULL; PFNGLXCOPYSUBBUFFERMESAPROC __glewXCopySubBufferMESA = NULL; PFNGLXCREATEGLXPIXMAPMESAPROC __glewXCreateGLXPixmapMESA = NULL; PFNGLXRELEASEBUFFERSMESAPROC __glewXReleaseBuffersMESA = NULL; PFNGLXSET3DFXMODEMESAPROC __glewXSet3DfxModeMESA = NULL; PFNGLXGETSWAPINTERVALMESAPROC __glewXGetSwapIntervalMESA = NULL; PFNGLXSWAPINTERVALMESAPROC __glewXSwapIntervalMESA = NULL; PFNGLXCOPYIMAGESUBDATANVPROC __glewXCopyImageSubDataNV = NULL; PFNGLXBINDVIDEODEVICENVPROC __glewXBindVideoDeviceNV = NULL; PFNGLXENUMERATEVIDEODEVICESNVPROC __glewXEnumerateVideoDevicesNV = NULL; PFNGLXBINDSWAPBARRIERNVPROC __glewXBindSwapBarrierNV = NULL; PFNGLXJOINSWAPGROUPNVPROC __glewXJoinSwapGroupNV = NULL; PFNGLXQUERYFRAMECOUNTNVPROC __glewXQueryFrameCountNV = NULL; PFNGLXQUERYMAXSWAPGROUPSNVPROC __glewXQueryMaxSwapGroupsNV = NULL; PFNGLXQUERYSWAPGROUPNVPROC __glewXQuerySwapGroupNV = NULL; PFNGLXRESETFRAMECOUNTNVPROC __glewXResetFrameCountNV = NULL; PFNGLXALLOCATEMEMORYNVPROC __glewXAllocateMemoryNV = NULL; PFNGLXFREEMEMORYNVPROC __glewXFreeMemoryNV = NULL; PFNGLXBINDVIDEOCAPTUREDEVICENVPROC __glewXBindVideoCaptureDeviceNV = NULL; PFNGLXENUMERATEVIDEOCAPTUREDEVICESNVPROC __glewXEnumerateVideoCaptureDevicesNV = NULL; PFNGLXLOCKVIDEOCAPTUREDEVICENVPROC __glewXLockVideoCaptureDeviceNV = NULL; PFNGLXQUERYVIDEOCAPTUREDEVICENVPROC __glewXQueryVideoCaptureDeviceNV = NULL; PFNGLXRELEASEVIDEOCAPTUREDEVICENVPROC __glewXReleaseVideoCaptureDeviceNV = NULL; PFNGLXBINDVIDEOIMAGENVPROC __glewXBindVideoImageNV = NULL; PFNGLXGETVIDEODEVICENVPROC __glewXGetVideoDeviceNV = NULL; PFNGLXGETVIDEOINFONVPROC __glewXGetVideoInfoNV = NULL; PFNGLXRELEASEVIDEODEVICENVPROC __glewXReleaseVideoDeviceNV = NULL; PFNGLXRELEASEVIDEOIMAGENVPROC __glewXReleaseVideoImageNV = NULL; PFNGLXSENDPBUFFERTOVIDEONVPROC __glewXSendPbufferToVideoNV = NULL; PFNGLXGETMSCRATEOMLPROC __glewXGetMscRateOML = NULL; PFNGLXGETSYNCVALUESOMLPROC __glewXGetSyncValuesOML = NULL; PFNGLXSWAPBUFFERSMSCOMLPROC __glewXSwapBuffersMscOML = NULL; PFNGLXWAITFORMSCOMLPROC __glewXWaitForMscOML = NULL; PFNGLXWAITFORSBCOMLPROC __glewXWaitForSbcOML = NULL; PFNGLXCHOOSEFBCONFIGSGIXPROC __glewXChooseFBConfigSGIX = NULL; PFNGLXCREATECONTEXTWITHCONFIGSGIXPROC __glewXCreateContextWithConfigSGIX = NULL; PFNGLXCREATEGLXPIXMAPWITHCONFIGSGIXPROC __glewXCreateGLXPixmapWithConfigSGIX = NULL; PFNGLXGETFBCONFIGATTRIBSGIXPROC __glewXGetFBConfigAttribSGIX = NULL; PFNGLXGETFBCONFIGFROMVISUALSGIXPROC __glewXGetFBConfigFromVisualSGIX = NULL; PFNGLXGETVISUALFROMFBCONFIGSGIXPROC __glewXGetVisualFromFBConfigSGIX = NULL; PFNGLXBINDHYPERPIPESGIXPROC __glewXBindHyperpipeSGIX = NULL; PFNGLXDESTROYHYPERPIPECONFIGSGIXPROC __glewXDestroyHyperpipeConfigSGIX = NULL; PFNGLXHYPERPIPEATTRIBSGIXPROC __glewXHyperpipeAttribSGIX = NULL; PFNGLXHYPERPIPECONFIGSGIXPROC __glewXHyperpipeConfigSGIX = NULL; PFNGLXQUERYHYPERPIPEATTRIBSGIXPROC __glewXQueryHyperpipeAttribSGIX = NULL; PFNGLXQUERYHYPERPIPEBESTATTRIBSGIXPROC __glewXQueryHyperpipeBestAttribSGIX = NULL; PFNGLXQUERYHYPERPIPECONFIGSGIXPROC __glewXQueryHyperpipeConfigSGIX = NULL; PFNGLXQUERYHYPERPIPENETWORKSGIXPROC __glewXQueryHyperpipeNetworkSGIX = NULL; PFNGLXCREATEGLXPBUFFERSGIXPROC __glewXCreateGLXPbufferSGIX = NULL; PFNGLXDESTROYGLXPBUFFERSGIXPROC __glewXDestroyGLXPbufferSGIX = NULL; PFNGLXGETSELECTEDEVENTSGIXPROC __glewXGetSelectedEventSGIX = NULL; PFNGLXQUERYGLXPBUFFERSGIXPROC __glewXQueryGLXPbufferSGIX = NULL; PFNGLXSELECTEVENTSGIXPROC __glewXSelectEventSGIX = NULL; PFNGLXBINDSWAPBARRIERSGIXPROC __glewXBindSwapBarrierSGIX = NULL; PFNGLXQUERYMAXSWAPBARRIERSSGIXPROC __glewXQueryMaxSwapBarriersSGIX = NULL; PFNGLXJOINSWAPGROUPSGIXPROC __glewXJoinSwapGroupSGIX = NULL; PFNGLXBINDCHANNELTOWINDOWSGIXPROC __glewXBindChannelToWindowSGIX = NULL; PFNGLXCHANNELRECTSGIXPROC __glewXChannelRectSGIX = NULL; PFNGLXCHANNELRECTSYNCSGIXPROC __glewXChannelRectSyncSGIX = NULL; PFNGLXQUERYCHANNELDELTASSGIXPROC __glewXQueryChannelDeltasSGIX = NULL; PFNGLXQUERYCHANNELRECTSGIXPROC __glewXQueryChannelRectSGIX = NULL; PFNGLXCUSHIONSGIPROC __glewXCushionSGI = NULL; PFNGLXGETCURRENTREADDRAWABLESGIPROC __glewXGetCurrentReadDrawableSGI = NULL; PFNGLXMAKECURRENTREADSGIPROC __glewXMakeCurrentReadSGI = NULL; PFNGLXSWAPINTERVALSGIPROC __glewXSwapIntervalSGI = NULL; PFNGLXGETVIDEOSYNCSGIPROC __glewXGetVideoSyncSGI = NULL; PFNGLXWAITVIDEOSYNCSGIPROC __glewXWaitVideoSyncSGI = NULL; PFNGLXGETTRANSPARENTINDEXSUNPROC __glewXGetTransparentIndexSUN = NULL; PFNGLXGETVIDEORESIZESUNPROC __glewXGetVideoResizeSUN = NULL; PFNGLXVIDEORESIZESUNPROC __glewXVideoResizeSUN = NULL; #if !defined(GLEW_MX) GLboolean __GLXEW_VERSION_1_0 = GL_FALSE; GLboolean __GLXEW_VERSION_1_1 = GL_FALSE; GLboolean __GLXEW_VERSION_1_2 = GL_FALSE; GLboolean __GLXEW_VERSION_1_3 = GL_FALSE; GLboolean __GLXEW_VERSION_1_4 = GL_FALSE; GLboolean __GLXEW_3DFX_multisample = GL_FALSE; GLboolean __GLXEW_AMD_gpu_association = GL_FALSE; GLboolean __GLXEW_ARB_create_context = GL_FALSE; GLboolean __GLXEW_ARB_create_context_profile = GL_FALSE; GLboolean __GLXEW_ARB_create_context_robustness = GL_FALSE; GLboolean __GLXEW_ARB_fbconfig_float = GL_FALSE; GLboolean __GLXEW_ARB_framebuffer_sRGB = GL_FALSE; GLboolean __GLXEW_ARB_get_proc_address = GL_FALSE; GLboolean __GLXEW_ARB_multisample = GL_FALSE; GLboolean __GLXEW_ARB_robustness_application_isolation = GL_FALSE; GLboolean __GLXEW_ARB_robustness_share_group_isolation = GL_FALSE; GLboolean __GLXEW_ARB_vertex_buffer_object = GL_FALSE; GLboolean __GLXEW_ATI_pixel_format_float = GL_FALSE; GLboolean __GLXEW_ATI_render_texture = GL_FALSE; GLboolean __GLXEW_EXT_create_context_es2_profile = GL_FALSE; GLboolean __GLXEW_EXT_create_context_es_profile = GL_FALSE; GLboolean __GLXEW_EXT_fbconfig_packed_float = GL_FALSE; GLboolean __GLXEW_EXT_framebuffer_sRGB = GL_FALSE; GLboolean __GLXEW_EXT_import_context = GL_FALSE; GLboolean __GLXEW_EXT_scene_marker = GL_FALSE; GLboolean __GLXEW_EXT_swap_control = GL_FALSE; GLboolean __GLXEW_EXT_swap_control_tear = GL_FALSE; GLboolean __GLXEW_EXT_texture_from_pixmap = GL_FALSE; GLboolean __GLXEW_EXT_visual_info = GL_FALSE; GLboolean __GLXEW_EXT_visual_rating = GL_FALSE; GLboolean __GLXEW_INTEL_swap_event = GL_FALSE; GLboolean __GLXEW_MESA_agp_offset = GL_FALSE; GLboolean __GLXEW_MESA_copy_sub_buffer = GL_FALSE; GLboolean __GLXEW_MESA_pixmap_colormap = GL_FALSE; GLboolean __GLXEW_MESA_release_buffers = GL_FALSE; GLboolean __GLXEW_MESA_set_3dfx_mode = GL_FALSE; GLboolean __GLXEW_MESA_swap_control = GL_FALSE; GLboolean __GLXEW_NV_copy_image = GL_FALSE; GLboolean __GLXEW_NV_float_buffer = GL_FALSE; GLboolean __GLXEW_NV_multisample_coverage = GL_FALSE; GLboolean __GLXEW_NV_present_video = GL_FALSE; GLboolean __GLXEW_NV_swap_group = GL_FALSE; GLboolean __GLXEW_NV_vertex_array_range = GL_FALSE; GLboolean __GLXEW_NV_video_capture = GL_FALSE; GLboolean __GLXEW_NV_video_out = GL_FALSE; GLboolean __GLXEW_OML_swap_method = GL_FALSE; GLboolean __GLXEW_OML_sync_control = GL_FALSE; GLboolean __GLXEW_SGIS_blended_overlay = GL_FALSE; GLboolean __GLXEW_SGIS_color_range = GL_FALSE; GLboolean __GLXEW_SGIS_multisample = GL_FALSE; GLboolean __GLXEW_SGIS_shared_multisample = GL_FALSE; GLboolean __GLXEW_SGIX_fbconfig = GL_FALSE; GLboolean __GLXEW_SGIX_hyperpipe = GL_FALSE; GLboolean __GLXEW_SGIX_pbuffer = GL_FALSE; GLboolean __GLXEW_SGIX_swap_barrier = GL_FALSE; GLboolean __GLXEW_SGIX_swap_group = GL_FALSE; GLboolean __GLXEW_SGIX_video_resize = GL_FALSE; GLboolean __GLXEW_SGIX_visual_select_group = GL_FALSE; GLboolean __GLXEW_SGI_cushion = GL_FALSE; GLboolean __GLXEW_SGI_make_current_read = GL_FALSE; GLboolean __GLXEW_SGI_swap_control = GL_FALSE; GLboolean __GLXEW_SGI_video_sync = GL_FALSE; GLboolean __GLXEW_SUN_get_transparent_index = GL_FALSE; GLboolean __GLXEW_SUN_video_resize = GL_FALSE; #endif /* !GLEW_MX */ #ifdef GLX_VERSION_1_2 static GLboolean _glewInit_GLX_VERSION_1_2 (GLXEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glXGetCurrentDisplay = (PFNGLXGETCURRENTDISPLAYPROC)glewGetProcAddress((const GLubyte*)"glXGetCurrentDisplay")) == NULL) || r; return r; } #endif /* GLX_VERSION_1_2 */ #ifdef GLX_VERSION_1_3 static GLboolean _glewInit_GLX_VERSION_1_3 (GLXEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glXChooseFBConfig = (PFNGLXCHOOSEFBCONFIGPROC)glewGetProcAddress((const GLubyte*)"glXChooseFBConfig")) == NULL) || r; r = ((glXCreateNewContext = (PFNGLXCREATENEWCONTEXTPROC)glewGetProcAddress((const GLubyte*)"glXCreateNewContext")) == NULL) || r; r = ((glXCreatePbuffer = (PFNGLXCREATEPBUFFERPROC)glewGetProcAddress((const GLubyte*)"glXCreatePbuffer")) == NULL) || r; r = ((glXCreatePixmap = (PFNGLXCREATEPIXMAPPROC)glewGetProcAddress((const GLubyte*)"glXCreatePixmap")) == NULL) || r; r = ((glXCreateWindow = (PFNGLXCREATEWINDOWPROC)glewGetProcAddress((const GLubyte*)"glXCreateWindow")) == NULL) || r; r = ((glXDestroyPbuffer = (PFNGLXDESTROYPBUFFERPROC)glewGetProcAddress((const GLubyte*)"glXDestroyPbuffer")) == NULL) || r; r = ((glXDestroyPixmap = (PFNGLXDESTROYPIXMAPPROC)glewGetProcAddress((const GLubyte*)"glXDestroyPixmap")) == NULL) || r; r = ((glXDestroyWindow = (PFNGLXDESTROYWINDOWPROC)glewGetProcAddress((const GLubyte*)"glXDestroyWindow")) == NULL) || r; r = ((glXGetCurrentReadDrawable = (PFNGLXGETCURRENTREADDRAWABLEPROC)glewGetProcAddress((const GLubyte*)"glXGetCurrentReadDrawable")) == NULL) || r; r = ((glXGetFBConfigAttrib = (PFNGLXGETFBCONFIGATTRIBPROC)glewGetProcAddress((const GLubyte*)"glXGetFBConfigAttrib")) == NULL) || r; r = ((glXGetFBConfigs = (PFNGLXGETFBCONFIGSPROC)glewGetProcAddress((const GLubyte*)"glXGetFBConfigs")) == NULL) || r; r = ((glXGetSelectedEvent = (PFNGLXGETSELECTEDEVENTPROC)glewGetProcAddress((const GLubyte*)"glXGetSelectedEvent")) == NULL) || r; r = ((glXGetVisualFromFBConfig = (PFNGLXGETVISUALFROMFBCONFIGPROC)glewGetProcAddress((const GLubyte*)"glXGetVisualFromFBConfig")) == NULL) || r; r = ((glXMakeContextCurrent = (PFNGLXMAKECONTEXTCURRENTPROC)glewGetProcAddress((const GLubyte*)"glXMakeContextCurrent")) == NULL) || r; r = ((glXQueryContext = (PFNGLXQUERYCONTEXTPROC)glewGetProcAddress((const GLubyte*)"glXQueryContext")) == NULL) || r; r = ((glXQueryDrawable = (PFNGLXQUERYDRAWABLEPROC)glewGetProcAddress((const GLubyte*)"glXQueryDrawable")) == NULL) || r; r = ((glXSelectEvent = (PFNGLXSELECTEVENTPROC)glewGetProcAddress((const GLubyte*)"glXSelectEvent")) == NULL) || r; return r; } #endif /* GLX_VERSION_1_3 */ #ifdef GLX_VERSION_1_4 #endif /* GLX_VERSION_1_4 */ #ifdef GLX_3DFX_multisample #endif /* GLX_3DFX_multisample */ #ifdef GLX_AMD_gpu_association #endif /* GLX_AMD_gpu_association */ #ifdef GLX_ARB_create_context static GLboolean _glewInit_GLX_ARB_create_context (GLXEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glXCreateContextAttribsARB = (PFNGLXCREATECONTEXTATTRIBSARBPROC)glewGetProcAddress((const GLubyte*)"glXCreateContextAttribsARB")) == NULL) || r; return r; } #endif /* GLX_ARB_create_context */ #ifdef GLX_ARB_create_context_profile #endif /* GLX_ARB_create_context_profile */ #ifdef GLX_ARB_create_context_robustness #endif /* GLX_ARB_create_context_robustness */ #ifdef GLX_ARB_fbconfig_float #endif /* GLX_ARB_fbconfig_float */ #ifdef GLX_ARB_framebuffer_sRGB #endif /* GLX_ARB_framebuffer_sRGB */ #ifdef GLX_ARB_get_proc_address #endif /* GLX_ARB_get_proc_address */ #ifdef GLX_ARB_multisample #endif /* GLX_ARB_multisample */ #ifdef GLX_ARB_robustness_application_isolation #endif /* GLX_ARB_robustness_application_isolation */ #ifdef GLX_ARB_robustness_share_group_isolation #endif /* GLX_ARB_robustness_share_group_isolation */ #ifdef GLX_ARB_vertex_buffer_object #endif /* GLX_ARB_vertex_buffer_object */ #ifdef GLX_ATI_pixel_format_float #endif /* GLX_ATI_pixel_format_float */ #ifdef GLX_ATI_render_texture static GLboolean _glewInit_GLX_ATI_render_texture (GLXEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glXBindTexImageATI = (PFNGLXBINDTEXIMAGEATIPROC)glewGetProcAddress((const GLubyte*)"glXBindTexImageATI")) == NULL) || r; r = ((glXDrawableAttribATI = (PFNGLXDRAWABLEATTRIBATIPROC)glewGetProcAddress((const GLubyte*)"glXDrawableAttribATI")) == NULL) || r; r = ((glXReleaseTexImageATI = (PFNGLXRELEASETEXIMAGEATIPROC)glewGetProcAddress((const GLubyte*)"glXReleaseTexImageATI")) == NULL) || r; return r; } #endif /* GLX_ATI_render_texture */ #ifdef GLX_EXT_create_context_es2_profile #endif /* GLX_EXT_create_context_es2_profile */ #ifdef GLX_EXT_create_context_es_profile #endif /* GLX_EXT_create_context_es_profile */ #ifdef GLX_EXT_fbconfig_packed_float #endif /* GLX_EXT_fbconfig_packed_float */ #ifdef GLX_EXT_framebuffer_sRGB #endif /* GLX_EXT_framebuffer_sRGB */ #ifdef GLX_EXT_import_context static GLboolean _glewInit_GLX_EXT_import_context (GLXEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glXFreeContextEXT = (PFNGLXFREECONTEXTEXTPROC)glewGetProcAddress((const GLubyte*)"glXFreeContextEXT")) == NULL) || r; r = ((glXGetContextIDEXT = (PFNGLXGETCONTEXTIDEXTPROC)glewGetProcAddress((const GLubyte*)"glXGetContextIDEXT")) == NULL) || r; r = ((glXImportContextEXT = (PFNGLXIMPORTCONTEXTEXTPROC)glewGetProcAddress((const GLubyte*)"glXImportContextEXT")) == NULL) || r; r = ((glXQueryContextInfoEXT = (PFNGLXQUERYCONTEXTINFOEXTPROC)glewGetProcAddress((const GLubyte*)"glXQueryContextInfoEXT")) == NULL) || r; return r; } #endif /* GLX_EXT_import_context */ #ifdef GLX_EXT_scene_marker #endif /* GLX_EXT_scene_marker */ #ifdef GLX_EXT_swap_control static GLboolean _glewInit_GLX_EXT_swap_control (GLXEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glXSwapIntervalEXT = (PFNGLXSWAPINTERVALEXTPROC)glewGetProcAddress((const GLubyte*)"glXSwapIntervalEXT")) == NULL) || r; return r; } #endif /* GLX_EXT_swap_control */ #ifdef GLX_EXT_swap_control_tear #endif /* GLX_EXT_swap_control_tear */ #ifdef GLX_EXT_texture_from_pixmap static GLboolean _glewInit_GLX_EXT_texture_from_pixmap (GLXEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glXBindTexImageEXT = (PFNGLXBINDTEXIMAGEEXTPROC)glewGetProcAddress((const GLubyte*)"glXBindTexImageEXT")) == NULL) || r; r = ((glXReleaseTexImageEXT = (PFNGLXRELEASETEXIMAGEEXTPROC)glewGetProcAddress((const GLubyte*)"glXReleaseTexImageEXT")) == NULL) || r; return r; } #endif /* GLX_EXT_texture_from_pixmap */ #ifdef GLX_EXT_visual_info #endif /* GLX_EXT_visual_info */ #ifdef GLX_EXT_visual_rating #endif /* GLX_EXT_visual_rating */ #ifdef GLX_INTEL_swap_event #endif /* GLX_INTEL_swap_event */ #ifdef GLX_MESA_agp_offset static GLboolean _glewInit_GLX_MESA_agp_offset (GLXEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glXGetAGPOffsetMESA = (PFNGLXGETAGPOFFSETMESAPROC)glewGetProcAddress((const GLubyte*)"glXGetAGPOffsetMESA")) == NULL) || r; return r; } #endif /* GLX_MESA_agp_offset */ #ifdef GLX_MESA_copy_sub_buffer static GLboolean _glewInit_GLX_MESA_copy_sub_buffer (GLXEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glXCopySubBufferMESA = (PFNGLXCOPYSUBBUFFERMESAPROC)glewGetProcAddress((const GLubyte*)"glXCopySubBufferMESA")) == NULL) || r; return r; } #endif /* GLX_MESA_copy_sub_buffer */ #ifdef GLX_MESA_pixmap_colormap static GLboolean _glewInit_GLX_MESA_pixmap_colormap (GLXEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glXCreateGLXPixmapMESA = (PFNGLXCREATEGLXPIXMAPMESAPROC)glewGetProcAddress((const GLubyte*)"glXCreateGLXPixmapMESA")) == NULL) || r; return r; } #endif /* GLX_MESA_pixmap_colormap */ #ifdef GLX_MESA_release_buffers static GLboolean _glewInit_GLX_MESA_release_buffers (GLXEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glXReleaseBuffersMESA = (PFNGLXRELEASEBUFFERSMESAPROC)glewGetProcAddress((const GLubyte*)"glXReleaseBuffersMESA")) == NULL) || r; return r; } #endif /* GLX_MESA_release_buffers */ #ifdef GLX_MESA_set_3dfx_mode static GLboolean _glewInit_GLX_MESA_set_3dfx_mode (GLXEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glXSet3DfxModeMESA = (PFNGLXSET3DFXMODEMESAPROC)glewGetProcAddress((const GLubyte*)"glXSet3DfxModeMESA")) == NULL) || r; return r; } #endif /* GLX_MESA_set_3dfx_mode */ #ifdef GLX_MESA_swap_control static GLboolean _glewInit_GLX_MESA_swap_control (GLXEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glXGetSwapIntervalMESA = (PFNGLXGETSWAPINTERVALMESAPROC)glewGetProcAddress((const GLubyte*)"glXGetSwapIntervalMESA")) == NULL) || r; r = ((glXSwapIntervalMESA = (PFNGLXSWAPINTERVALMESAPROC)glewGetProcAddress((const GLubyte*)"glXSwapIntervalMESA")) == NULL) || r; return r; } #endif /* GLX_MESA_swap_control */ #ifdef GLX_NV_copy_image static GLboolean _glewInit_GLX_NV_copy_image (GLXEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glXCopyImageSubDataNV = (PFNGLXCOPYIMAGESUBDATANVPROC)glewGetProcAddress((const GLubyte*)"glXCopyImageSubDataNV")) == NULL) || r; return r; } #endif /* GLX_NV_copy_image */ #ifdef GLX_NV_float_buffer #endif /* GLX_NV_float_buffer */ #ifdef GLX_NV_multisample_coverage #endif /* GLX_NV_multisample_coverage */ #ifdef GLX_NV_present_video static GLboolean _glewInit_GLX_NV_present_video (GLXEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glXBindVideoDeviceNV = (PFNGLXBINDVIDEODEVICENVPROC)glewGetProcAddress((const GLubyte*)"glXBindVideoDeviceNV")) == NULL) || r; r = ((glXEnumerateVideoDevicesNV = (PFNGLXENUMERATEVIDEODEVICESNVPROC)glewGetProcAddress((const GLubyte*)"glXEnumerateVideoDevicesNV")) == NULL) || r; return r; } #endif /* GLX_NV_present_video */ #ifdef GLX_NV_swap_group static GLboolean _glewInit_GLX_NV_swap_group (GLXEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glXBindSwapBarrierNV = (PFNGLXBINDSWAPBARRIERNVPROC)glewGetProcAddress((const GLubyte*)"glXBindSwapBarrierNV")) == NULL) || r; r = ((glXJoinSwapGroupNV = (PFNGLXJOINSWAPGROUPNVPROC)glewGetProcAddress((const GLubyte*)"glXJoinSwapGroupNV")) == NULL) || r; r = ((glXQueryFrameCountNV = (PFNGLXQUERYFRAMECOUNTNVPROC)glewGetProcAddress((const GLubyte*)"glXQueryFrameCountNV")) == NULL) || r; r = ((glXQueryMaxSwapGroupsNV = (PFNGLXQUERYMAXSWAPGROUPSNVPROC)glewGetProcAddress((const GLubyte*)"glXQueryMaxSwapGroupsNV")) == NULL) || r; r = ((glXQuerySwapGroupNV = (PFNGLXQUERYSWAPGROUPNVPROC)glewGetProcAddress((const GLubyte*)"glXQuerySwapGroupNV")) == NULL) || r; r = ((glXResetFrameCountNV = (PFNGLXRESETFRAMECOUNTNVPROC)glewGetProcAddress((const GLubyte*)"glXResetFrameCountNV")) == NULL) || r; return r; } #endif /* GLX_NV_swap_group */ #ifdef GLX_NV_vertex_array_range static GLboolean _glewInit_GLX_NV_vertex_array_range (GLXEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glXAllocateMemoryNV = (PFNGLXALLOCATEMEMORYNVPROC)glewGetProcAddress((const GLubyte*)"glXAllocateMemoryNV")) == NULL) || r; r = ((glXFreeMemoryNV = (PFNGLXFREEMEMORYNVPROC)glewGetProcAddress((const GLubyte*)"glXFreeMemoryNV")) == NULL) || r; return r; } #endif /* GLX_NV_vertex_array_range */ #ifdef GLX_NV_video_capture static GLboolean _glewInit_GLX_NV_video_capture (GLXEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glXBindVideoCaptureDeviceNV = (PFNGLXBINDVIDEOCAPTUREDEVICENVPROC)glewGetProcAddress((const GLubyte*)"glXBindVideoCaptureDeviceNV")) == NULL) || r; r = ((glXEnumerateVideoCaptureDevicesNV = (PFNGLXENUMERATEVIDEOCAPTUREDEVICESNVPROC)glewGetProcAddress((const GLubyte*)"glXEnumerateVideoCaptureDevicesNV")) == NULL) || r; r = ((glXLockVideoCaptureDeviceNV = (PFNGLXLOCKVIDEOCAPTUREDEVICENVPROC)glewGetProcAddress((const GLubyte*)"glXLockVideoCaptureDeviceNV")) == NULL) || r; r = ((glXQueryVideoCaptureDeviceNV = (PFNGLXQUERYVIDEOCAPTUREDEVICENVPROC)glewGetProcAddress((const GLubyte*)"glXQueryVideoCaptureDeviceNV")) == NULL) || r; r = ((glXReleaseVideoCaptureDeviceNV = (PFNGLXRELEASEVIDEOCAPTUREDEVICENVPROC)glewGetProcAddress((const GLubyte*)"glXReleaseVideoCaptureDeviceNV")) == NULL) || r; return r; } #endif /* GLX_NV_video_capture */ #ifdef GLX_NV_video_out static GLboolean _glewInit_GLX_NV_video_out (GLXEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glXBindVideoImageNV = (PFNGLXBINDVIDEOIMAGENVPROC)glewGetProcAddress((const GLubyte*)"glXBindVideoImageNV")) == NULL) || r; r = ((glXGetVideoDeviceNV = (PFNGLXGETVIDEODEVICENVPROC)glewGetProcAddress((const GLubyte*)"glXGetVideoDeviceNV")) == NULL) || r; r = ((glXGetVideoInfoNV = (PFNGLXGETVIDEOINFONVPROC)glewGetProcAddress((const GLubyte*)"glXGetVideoInfoNV")) == NULL) || r; r = ((glXReleaseVideoDeviceNV = (PFNGLXRELEASEVIDEODEVICENVPROC)glewGetProcAddress((const GLubyte*)"glXReleaseVideoDeviceNV")) == NULL) || r; r = ((glXReleaseVideoImageNV = (PFNGLXRELEASEVIDEOIMAGENVPROC)glewGetProcAddress((const GLubyte*)"glXReleaseVideoImageNV")) == NULL) || r; r = ((glXSendPbufferToVideoNV = (PFNGLXSENDPBUFFERTOVIDEONVPROC)glewGetProcAddress((const GLubyte*)"glXSendPbufferToVideoNV")) == NULL) || r; return r; } #endif /* GLX_NV_video_out */ #ifdef GLX_OML_swap_method #endif /* GLX_OML_swap_method */ #ifdef GLX_OML_sync_control static GLboolean _glewInit_GLX_OML_sync_control (GLXEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glXGetMscRateOML = (PFNGLXGETMSCRATEOMLPROC)glewGetProcAddress((const GLubyte*)"glXGetMscRateOML")) == NULL) || r; r = ((glXGetSyncValuesOML = (PFNGLXGETSYNCVALUESOMLPROC)glewGetProcAddress((const GLubyte*)"glXGetSyncValuesOML")) == NULL) || r; r = ((glXSwapBuffersMscOML = (PFNGLXSWAPBUFFERSMSCOMLPROC)glewGetProcAddress((const GLubyte*)"glXSwapBuffersMscOML")) == NULL) || r; r = ((glXWaitForMscOML = (PFNGLXWAITFORMSCOMLPROC)glewGetProcAddress((const GLubyte*)"glXWaitForMscOML")) == NULL) || r; r = ((glXWaitForSbcOML = (PFNGLXWAITFORSBCOMLPROC)glewGetProcAddress((const GLubyte*)"glXWaitForSbcOML")) == NULL) || r; return r; } #endif /* GLX_OML_sync_control */ #ifdef GLX_SGIS_blended_overlay #endif /* GLX_SGIS_blended_overlay */ #ifdef GLX_SGIS_color_range #endif /* GLX_SGIS_color_range */ #ifdef GLX_SGIS_multisample #endif /* GLX_SGIS_multisample */ #ifdef GLX_SGIS_shared_multisample #endif /* GLX_SGIS_shared_multisample */ #ifdef GLX_SGIX_fbconfig static GLboolean _glewInit_GLX_SGIX_fbconfig (GLXEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glXChooseFBConfigSGIX = (PFNGLXCHOOSEFBCONFIGSGIXPROC)glewGetProcAddress((const GLubyte*)"glXChooseFBConfigSGIX")) == NULL) || r; r = ((glXCreateContextWithConfigSGIX = (PFNGLXCREATECONTEXTWITHCONFIGSGIXPROC)glewGetProcAddress((const GLubyte*)"glXCreateContextWithConfigSGIX")) == NULL) || r; r = ((glXCreateGLXPixmapWithConfigSGIX = (PFNGLXCREATEGLXPIXMAPWITHCONFIGSGIXPROC)glewGetProcAddress((const GLubyte*)"glXCreateGLXPixmapWithConfigSGIX")) == NULL) || r; r = ((glXGetFBConfigAttribSGIX = (PFNGLXGETFBCONFIGATTRIBSGIXPROC)glewGetProcAddress((const GLubyte*)"glXGetFBConfigAttribSGIX")) == NULL) || r; r = ((glXGetFBConfigFromVisualSGIX = (PFNGLXGETFBCONFIGFROMVISUALSGIXPROC)glewGetProcAddress((const GLubyte*)"glXGetFBConfigFromVisualSGIX")) == NULL) || r; r = ((glXGetVisualFromFBConfigSGIX = (PFNGLXGETVISUALFROMFBCONFIGSGIXPROC)glewGetProcAddress((const GLubyte*)"glXGetVisualFromFBConfigSGIX")) == NULL) || r; return r; } #endif /* GLX_SGIX_fbconfig */ #ifdef GLX_SGIX_hyperpipe static GLboolean _glewInit_GLX_SGIX_hyperpipe (GLXEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glXBindHyperpipeSGIX = (PFNGLXBINDHYPERPIPESGIXPROC)glewGetProcAddress((const GLubyte*)"glXBindHyperpipeSGIX")) == NULL) || r; r = ((glXDestroyHyperpipeConfigSGIX = (PFNGLXDESTROYHYPERPIPECONFIGSGIXPROC)glewGetProcAddress((const GLubyte*)"glXDestroyHyperpipeConfigSGIX")) == NULL) || r; r = ((glXHyperpipeAttribSGIX = (PFNGLXHYPERPIPEATTRIBSGIXPROC)glewGetProcAddress((const GLubyte*)"glXHyperpipeAttribSGIX")) == NULL) || r; r = ((glXHyperpipeConfigSGIX = (PFNGLXHYPERPIPECONFIGSGIXPROC)glewGetProcAddress((const GLubyte*)"glXHyperpipeConfigSGIX")) == NULL) || r; r = ((glXQueryHyperpipeAttribSGIX = (PFNGLXQUERYHYPERPIPEATTRIBSGIXPROC)glewGetProcAddress((const GLubyte*)"glXQueryHyperpipeAttribSGIX")) == NULL) || r; r = ((glXQueryHyperpipeBestAttribSGIX = (PFNGLXQUERYHYPERPIPEBESTATTRIBSGIXPROC)glewGetProcAddress((const GLubyte*)"glXQueryHyperpipeBestAttribSGIX")) == NULL) || r; r = ((glXQueryHyperpipeConfigSGIX = (PFNGLXQUERYHYPERPIPECONFIGSGIXPROC)glewGetProcAddress((const GLubyte*)"glXQueryHyperpipeConfigSGIX")) == NULL) || r; r = ((glXQueryHyperpipeNetworkSGIX = (PFNGLXQUERYHYPERPIPENETWORKSGIXPROC)glewGetProcAddress((const GLubyte*)"glXQueryHyperpipeNetworkSGIX")) == NULL) || r; return r; } #endif /* GLX_SGIX_hyperpipe */ #ifdef GLX_SGIX_pbuffer static GLboolean _glewInit_GLX_SGIX_pbuffer (GLXEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glXCreateGLXPbufferSGIX = (PFNGLXCREATEGLXPBUFFERSGIXPROC)glewGetProcAddress((const GLubyte*)"glXCreateGLXPbufferSGIX")) == NULL) || r; r = ((glXDestroyGLXPbufferSGIX = (PFNGLXDESTROYGLXPBUFFERSGIXPROC)glewGetProcAddress((const GLubyte*)"glXDestroyGLXPbufferSGIX")) == NULL) || r; r = ((glXGetSelectedEventSGIX = (PFNGLXGETSELECTEDEVENTSGIXPROC)glewGetProcAddress((const GLubyte*)"glXGetSelectedEventSGIX")) == NULL) || r; r = ((glXQueryGLXPbufferSGIX = (PFNGLXQUERYGLXPBUFFERSGIXPROC)glewGetProcAddress((const GLubyte*)"glXQueryGLXPbufferSGIX")) == NULL) || r; r = ((glXSelectEventSGIX = (PFNGLXSELECTEVENTSGIXPROC)glewGetProcAddress((const GLubyte*)"glXSelectEventSGIX")) == NULL) || r; return r; } #endif /* GLX_SGIX_pbuffer */ #ifdef GLX_SGIX_swap_barrier static GLboolean _glewInit_GLX_SGIX_swap_barrier (GLXEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glXBindSwapBarrierSGIX = (PFNGLXBINDSWAPBARRIERSGIXPROC)glewGetProcAddress((const GLubyte*)"glXBindSwapBarrierSGIX")) == NULL) || r; r = ((glXQueryMaxSwapBarriersSGIX = (PFNGLXQUERYMAXSWAPBARRIERSSGIXPROC)glewGetProcAddress((const GLubyte*)"glXQueryMaxSwapBarriersSGIX")) == NULL) || r; return r; } #endif /* GLX_SGIX_swap_barrier */ #ifdef GLX_SGIX_swap_group static GLboolean _glewInit_GLX_SGIX_swap_group (GLXEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glXJoinSwapGroupSGIX = (PFNGLXJOINSWAPGROUPSGIXPROC)glewGetProcAddress((const GLubyte*)"glXJoinSwapGroupSGIX")) == NULL) || r; return r; } #endif /* GLX_SGIX_swap_group */ #ifdef GLX_SGIX_video_resize static GLboolean _glewInit_GLX_SGIX_video_resize (GLXEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glXBindChannelToWindowSGIX = (PFNGLXBINDCHANNELTOWINDOWSGIXPROC)glewGetProcAddress((const GLubyte*)"glXBindChannelToWindowSGIX")) == NULL) || r; r = ((glXChannelRectSGIX = (PFNGLXCHANNELRECTSGIXPROC)glewGetProcAddress((const GLubyte*)"glXChannelRectSGIX")) == NULL) || r; r = ((glXChannelRectSyncSGIX = (PFNGLXCHANNELRECTSYNCSGIXPROC)glewGetProcAddress((const GLubyte*)"glXChannelRectSyncSGIX")) == NULL) || r; r = ((glXQueryChannelDeltasSGIX = (PFNGLXQUERYCHANNELDELTASSGIXPROC)glewGetProcAddress((const GLubyte*)"glXQueryChannelDeltasSGIX")) == NULL) || r; r = ((glXQueryChannelRectSGIX = (PFNGLXQUERYCHANNELRECTSGIXPROC)glewGetProcAddress((const GLubyte*)"glXQueryChannelRectSGIX")) == NULL) || r; return r; } #endif /* GLX_SGIX_video_resize */ #ifdef GLX_SGIX_visual_select_group #endif /* GLX_SGIX_visual_select_group */ #ifdef GLX_SGI_cushion static GLboolean _glewInit_GLX_SGI_cushion (GLXEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glXCushionSGI = (PFNGLXCUSHIONSGIPROC)glewGetProcAddress((const GLubyte*)"glXCushionSGI")) == NULL) || r; return r; } #endif /* GLX_SGI_cushion */ #ifdef GLX_SGI_make_current_read static GLboolean _glewInit_GLX_SGI_make_current_read (GLXEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glXGetCurrentReadDrawableSGI = (PFNGLXGETCURRENTREADDRAWABLESGIPROC)glewGetProcAddress((const GLubyte*)"glXGetCurrentReadDrawableSGI")) == NULL) || r; r = ((glXMakeCurrentReadSGI = (PFNGLXMAKECURRENTREADSGIPROC)glewGetProcAddress((const GLubyte*)"glXMakeCurrentReadSGI")) == NULL) || r; return r; } #endif /* GLX_SGI_make_current_read */ #ifdef GLX_SGI_swap_control static GLboolean _glewInit_GLX_SGI_swap_control (GLXEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glXSwapIntervalSGI = (PFNGLXSWAPINTERVALSGIPROC)glewGetProcAddress((const GLubyte*)"glXSwapIntervalSGI")) == NULL) || r; return r; } #endif /* GLX_SGI_swap_control */ #ifdef GLX_SGI_video_sync static GLboolean _glewInit_GLX_SGI_video_sync (GLXEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glXGetVideoSyncSGI = (PFNGLXGETVIDEOSYNCSGIPROC)glewGetProcAddress((const GLubyte*)"glXGetVideoSyncSGI")) == NULL) || r; r = ((glXWaitVideoSyncSGI = (PFNGLXWAITVIDEOSYNCSGIPROC)glewGetProcAddress((const GLubyte*)"glXWaitVideoSyncSGI")) == NULL) || r; return r; } #endif /* GLX_SGI_video_sync */ #ifdef GLX_SUN_get_transparent_index static GLboolean _glewInit_GLX_SUN_get_transparent_index (GLXEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glXGetTransparentIndexSUN = (PFNGLXGETTRANSPARENTINDEXSUNPROC)glewGetProcAddress((const GLubyte*)"glXGetTransparentIndexSUN")) == NULL) || r; return r; } #endif /* GLX_SUN_get_transparent_index */ #ifdef GLX_SUN_video_resize static GLboolean _glewInit_GLX_SUN_video_resize (GLXEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glXGetVideoResizeSUN = (PFNGLXGETVIDEORESIZESUNPROC)glewGetProcAddress((const GLubyte*)"glXGetVideoResizeSUN")) == NULL) || r; r = ((glXVideoResizeSUN = (PFNGLXVIDEORESIZESUNPROC)glewGetProcAddress((const GLubyte*)"glXVideoResizeSUN")) == NULL) || r; return r; } #endif /* GLX_SUN_video_resize */ /* ------------------------------------------------------------------------ */ GLboolean glxewGetExtension (const char* name) { const GLubyte* start; const GLubyte* end; if (glXGetCurrentDisplay == NULL) return GL_FALSE; start = (const GLubyte*)glXGetClientString(glXGetCurrentDisplay(), GLX_EXTENSIONS); if (0 == start) return GL_FALSE; end = start + _glewStrLen(start); return _glewSearchExtension(name, start, end); } GLenum glxewContextInit (GLXEW_CONTEXT_ARG_DEF_LIST) { int major, minor; const GLubyte* extStart; const GLubyte* extEnd; /* initialize core GLX 1.2 */ if (_glewInit_GLX_VERSION_1_2(GLEW_CONTEXT_ARG_VAR_INIT)) return GLEW_ERROR_GLX_VERSION_11_ONLY; /* initialize flags */ CONST_CAST(GLXEW_VERSION_1_0) = GL_TRUE; CONST_CAST(GLXEW_VERSION_1_1) = GL_TRUE; CONST_CAST(GLXEW_VERSION_1_2) = GL_TRUE; CONST_CAST(GLXEW_VERSION_1_3) = GL_TRUE; CONST_CAST(GLXEW_VERSION_1_4) = GL_TRUE; /* query GLX version */ glXQueryVersion(glXGetCurrentDisplay(), &major, &minor); if (major == 1 && minor <= 3) { switch (minor) { case 3: CONST_CAST(GLXEW_VERSION_1_4) = GL_FALSE; break; case 2: CONST_CAST(GLXEW_VERSION_1_4) = GL_FALSE; CONST_CAST(GLXEW_VERSION_1_3) = GL_FALSE; break; default: return GLEW_ERROR_GLX_VERSION_11_ONLY; break; } } /* query GLX extension string */ extStart = 0; if (glXGetCurrentDisplay != NULL) extStart = (const GLubyte*)glXGetClientString(glXGetCurrentDisplay(), GLX_EXTENSIONS); if (extStart == 0) extStart = (const GLubyte *)""; extEnd = extStart + _glewStrLen(extStart); /* initialize extensions */ #ifdef GLX_VERSION_1_3 if (glewExperimental || GLXEW_VERSION_1_3) CONST_CAST(GLXEW_VERSION_1_3) = !_glewInit_GLX_VERSION_1_3(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GLX_VERSION_1_3 */ #ifdef GLX_3DFX_multisample CONST_CAST(GLXEW_3DFX_multisample) = _glewSearchExtension("GLX_3DFX_multisample", extStart, extEnd); #endif /* GLX_3DFX_multisample */ #ifdef GLX_AMD_gpu_association CONST_CAST(GLXEW_AMD_gpu_association) = _glewSearchExtension("GLX_AMD_gpu_association", extStart, extEnd); #endif /* GLX_AMD_gpu_association */ #ifdef GLX_ARB_create_context CONST_CAST(GLXEW_ARB_create_context) = _glewSearchExtension("GLX_ARB_create_context", extStart, extEnd); if (glewExperimental || GLXEW_ARB_create_context) CONST_CAST(GLXEW_ARB_create_context) = !_glewInit_GLX_ARB_create_context(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GLX_ARB_create_context */ #ifdef GLX_ARB_create_context_profile CONST_CAST(GLXEW_ARB_create_context_profile) = _glewSearchExtension("GLX_ARB_create_context_profile", extStart, extEnd); #endif /* GLX_ARB_create_context_profile */ #ifdef GLX_ARB_create_context_robustness CONST_CAST(GLXEW_ARB_create_context_robustness) = _glewSearchExtension("GLX_ARB_create_context_robustness", extStart, extEnd); #endif /* GLX_ARB_create_context_robustness */ #ifdef GLX_ARB_fbconfig_float CONST_CAST(GLXEW_ARB_fbconfig_float) = _glewSearchExtension("GLX_ARB_fbconfig_float", extStart, extEnd); #endif /* GLX_ARB_fbconfig_float */ #ifdef GLX_ARB_framebuffer_sRGB CONST_CAST(GLXEW_ARB_framebuffer_sRGB) = _glewSearchExtension("GLX_ARB_framebuffer_sRGB", extStart, extEnd); #endif /* GLX_ARB_framebuffer_sRGB */ #ifdef GLX_ARB_get_proc_address CONST_CAST(GLXEW_ARB_get_proc_address) = _glewSearchExtension("GLX_ARB_get_proc_address", extStart, extEnd); #endif /* GLX_ARB_get_proc_address */ #ifdef GLX_ARB_multisample CONST_CAST(GLXEW_ARB_multisample) = _glewSearchExtension("GLX_ARB_multisample", extStart, extEnd); #endif /* GLX_ARB_multisample */ #ifdef GLX_ARB_robustness_application_isolation CONST_CAST(GLXEW_ARB_robustness_application_isolation) = _glewSearchExtension("GLX_ARB_robustness_application_isolation", extStart, extEnd); #endif /* GLX_ARB_robustness_application_isolation */ #ifdef GLX_ARB_robustness_share_group_isolation CONST_CAST(GLXEW_ARB_robustness_share_group_isolation) = _glewSearchExtension("GLX_ARB_robustness_share_group_isolation", extStart, extEnd); #endif /* GLX_ARB_robustness_share_group_isolation */ #ifdef GLX_ARB_vertex_buffer_object CONST_CAST(GLXEW_ARB_vertex_buffer_object) = _glewSearchExtension("GLX_ARB_vertex_buffer_object", extStart, extEnd); #endif /* GLX_ARB_vertex_buffer_object */ #ifdef GLX_ATI_pixel_format_float CONST_CAST(GLXEW_ATI_pixel_format_float) = _glewSearchExtension("GLX_ATI_pixel_format_float", extStart, extEnd); #endif /* GLX_ATI_pixel_format_float */ #ifdef GLX_ATI_render_texture CONST_CAST(GLXEW_ATI_render_texture) = _glewSearchExtension("GLX_ATI_render_texture", extStart, extEnd); if (glewExperimental || GLXEW_ATI_render_texture) CONST_CAST(GLXEW_ATI_render_texture) = !_glewInit_GLX_ATI_render_texture(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GLX_ATI_render_texture */ #ifdef GLX_EXT_create_context_es2_profile CONST_CAST(GLXEW_EXT_create_context_es2_profile) = _glewSearchExtension("GLX_EXT_create_context_es2_profile", extStart, extEnd); #endif /* GLX_EXT_create_context_es2_profile */ #ifdef GLX_EXT_create_context_es_profile CONST_CAST(GLXEW_EXT_create_context_es_profile) = _glewSearchExtension("GLX_EXT_create_context_es_profile", extStart, extEnd); #endif /* GLX_EXT_create_context_es_profile */ #ifdef GLX_EXT_fbconfig_packed_float CONST_CAST(GLXEW_EXT_fbconfig_packed_float) = _glewSearchExtension("GLX_EXT_fbconfig_packed_float", extStart, extEnd); #endif /* GLX_EXT_fbconfig_packed_float */ #ifdef GLX_EXT_framebuffer_sRGB CONST_CAST(GLXEW_EXT_framebuffer_sRGB) = _glewSearchExtension("GLX_EXT_framebuffer_sRGB", extStart, extEnd); #endif /* GLX_EXT_framebuffer_sRGB */ #ifdef GLX_EXT_import_context CONST_CAST(GLXEW_EXT_import_context) = _glewSearchExtension("GLX_EXT_import_context", extStart, extEnd); if (glewExperimental || GLXEW_EXT_import_context) CONST_CAST(GLXEW_EXT_import_context) = !_glewInit_GLX_EXT_import_context(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GLX_EXT_import_context */ #ifdef GLX_EXT_scene_marker CONST_CAST(GLXEW_EXT_scene_marker) = _glewSearchExtension("GLX_EXT_scene_marker", extStart, extEnd); #endif /* GLX_EXT_scene_marker */ #ifdef GLX_EXT_swap_control CONST_CAST(GLXEW_EXT_swap_control) = _glewSearchExtension("GLX_EXT_swap_control", extStart, extEnd); if (glewExperimental || GLXEW_EXT_swap_control) CONST_CAST(GLXEW_EXT_swap_control) = !_glewInit_GLX_EXT_swap_control(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GLX_EXT_swap_control */ #ifdef GLX_EXT_swap_control_tear CONST_CAST(GLXEW_EXT_swap_control_tear) = _glewSearchExtension("GLX_EXT_swap_control_tear", extStart, extEnd); #endif /* GLX_EXT_swap_control_tear */ #ifdef GLX_EXT_texture_from_pixmap CONST_CAST(GLXEW_EXT_texture_from_pixmap) = _glewSearchExtension("GLX_EXT_texture_from_pixmap", extStart, extEnd); if (glewExperimental || GLXEW_EXT_texture_from_pixmap) CONST_CAST(GLXEW_EXT_texture_from_pixmap) = !_glewInit_GLX_EXT_texture_from_pixmap(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GLX_EXT_texture_from_pixmap */ #ifdef GLX_EXT_visual_info CONST_CAST(GLXEW_EXT_visual_info) = _glewSearchExtension("GLX_EXT_visual_info", extStart, extEnd); #endif /* GLX_EXT_visual_info */ #ifdef GLX_EXT_visual_rating CONST_CAST(GLXEW_EXT_visual_rating) = _glewSearchExtension("GLX_EXT_visual_rating", extStart, extEnd); #endif /* GLX_EXT_visual_rating */ #ifdef GLX_INTEL_swap_event CONST_CAST(GLXEW_INTEL_swap_event) = _glewSearchExtension("GLX_INTEL_swap_event", extStart, extEnd); #endif /* GLX_INTEL_swap_event */ #ifdef GLX_MESA_agp_offset CONST_CAST(GLXEW_MESA_agp_offset) = _glewSearchExtension("GLX_MESA_agp_offset", extStart, extEnd); if (glewExperimental || GLXEW_MESA_agp_offset) CONST_CAST(GLXEW_MESA_agp_offset) = !_glewInit_GLX_MESA_agp_offset(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GLX_MESA_agp_offset */ #ifdef GLX_MESA_copy_sub_buffer CONST_CAST(GLXEW_MESA_copy_sub_buffer) = _glewSearchExtension("GLX_MESA_copy_sub_buffer", extStart, extEnd); if (glewExperimental || GLXEW_MESA_copy_sub_buffer) CONST_CAST(GLXEW_MESA_copy_sub_buffer) = !_glewInit_GLX_MESA_copy_sub_buffer(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GLX_MESA_copy_sub_buffer */ #ifdef GLX_MESA_pixmap_colormap CONST_CAST(GLXEW_MESA_pixmap_colormap) = _glewSearchExtension("GLX_MESA_pixmap_colormap", extStart, extEnd); if (glewExperimental || GLXEW_MESA_pixmap_colormap) CONST_CAST(GLXEW_MESA_pixmap_colormap) = !_glewInit_GLX_MESA_pixmap_colormap(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GLX_MESA_pixmap_colormap */ #ifdef GLX_MESA_release_buffers CONST_CAST(GLXEW_MESA_release_buffers) = _glewSearchExtension("GLX_MESA_release_buffers", extStart, extEnd); if (glewExperimental || GLXEW_MESA_release_buffers) CONST_CAST(GLXEW_MESA_release_buffers) = !_glewInit_GLX_MESA_release_buffers(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GLX_MESA_release_buffers */ #ifdef GLX_MESA_set_3dfx_mode CONST_CAST(GLXEW_MESA_set_3dfx_mode) = _glewSearchExtension("GLX_MESA_set_3dfx_mode", extStart, extEnd); if (glewExperimental || GLXEW_MESA_set_3dfx_mode) CONST_CAST(GLXEW_MESA_set_3dfx_mode) = !_glewInit_GLX_MESA_set_3dfx_mode(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GLX_MESA_set_3dfx_mode */ #ifdef GLX_MESA_swap_control CONST_CAST(GLXEW_MESA_swap_control) = _glewSearchExtension("GLX_MESA_swap_control", extStart, extEnd); if (glewExperimental || GLXEW_MESA_swap_control) CONST_CAST(GLXEW_MESA_swap_control) = !_glewInit_GLX_MESA_swap_control(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GLX_MESA_swap_control */ #ifdef GLX_NV_copy_image CONST_CAST(GLXEW_NV_copy_image) = _glewSearchExtension("GLX_NV_copy_image", extStart, extEnd); if (glewExperimental || GLXEW_NV_copy_image) CONST_CAST(GLXEW_NV_copy_image) = !_glewInit_GLX_NV_copy_image(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GLX_NV_copy_image */ #ifdef GLX_NV_float_buffer CONST_CAST(GLXEW_NV_float_buffer) = _glewSearchExtension("GLX_NV_float_buffer", extStart, extEnd); #endif /* GLX_NV_float_buffer */ #ifdef GLX_NV_multisample_coverage CONST_CAST(GLXEW_NV_multisample_coverage) = _glewSearchExtension("GLX_NV_multisample_coverage", extStart, extEnd); #endif /* GLX_NV_multisample_coverage */ #ifdef GLX_NV_present_video CONST_CAST(GLXEW_NV_present_video) = _glewSearchExtension("GLX_NV_present_video", extStart, extEnd); if (glewExperimental || GLXEW_NV_present_video) CONST_CAST(GLXEW_NV_present_video) = !_glewInit_GLX_NV_present_video(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GLX_NV_present_video */ #ifdef GLX_NV_swap_group CONST_CAST(GLXEW_NV_swap_group) = _glewSearchExtension("GLX_NV_swap_group", extStart, extEnd); if (glewExperimental || GLXEW_NV_swap_group) CONST_CAST(GLXEW_NV_swap_group) = !_glewInit_GLX_NV_swap_group(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GLX_NV_swap_group */ #ifdef GLX_NV_vertex_array_range CONST_CAST(GLXEW_NV_vertex_array_range) = _glewSearchExtension("GLX_NV_vertex_array_range", extStart, extEnd); if (glewExperimental || GLXEW_NV_vertex_array_range) CONST_CAST(GLXEW_NV_vertex_array_range) = !_glewInit_GLX_NV_vertex_array_range(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GLX_NV_vertex_array_range */ #ifdef GLX_NV_video_capture CONST_CAST(GLXEW_NV_video_capture) = _glewSearchExtension("GLX_NV_video_capture", extStart, extEnd); if (glewExperimental || GLXEW_NV_video_capture) CONST_CAST(GLXEW_NV_video_capture) = !_glewInit_GLX_NV_video_capture(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GLX_NV_video_capture */ #ifdef GLX_NV_video_out CONST_CAST(GLXEW_NV_video_out) = _glewSearchExtension("GLX_NV_video_out", extStart, extEnd); if (glewExperimental || GLXEW_NV_video_out) CONST_CAST(GLXEW_NV_video_out) = !_glewInit_GLX_NV_video_out(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GLX_NV_video_out */ #ifdef GLX_OML_swap_method CONST_CAST(GLXEW_OML_swap_method) = _glewSearchExtension("GLX_OML_swap_method", extStart, extEnd); #endif /* GLX_OML_swap_method */ #ifdef GLX_OML_sync_control CONST_CAST(GLXEW_OML_sync_control) = _glewSearchExtension("GLX_OML_sync_control", extStart, extEnd); if (glewExperimental || GLXEW_OML_sync_control) CONST_CAST(GLXEW_OML_sync_control) = !_glewInit_GLX_OML_sync_control(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GLX_OML_sync_control */ #ifdef GLX_SGIS_blended_overlay CONST_CAST(GLXEW_SGIS_blended_overlay) = _glewSearchExtension("GLX_SGIS_blended_overlay", extStart, extEnd); #endif /* GLX_SGIS_blended_overlay */ #ifdef GLX_SGIS_color_range CONST_CAST(GLXEW_SGIS_color_range) = _glewSearchExtension("GLX_SGIS_color_range", extStart, extEnd); #endif /* GLX_SGIS_color_range */ #ifdef GLX_SGIS_multisample CONST_CAST(GLXEW_SGIS_multisample) = _glewSearchExtension("GLX_SGIS_multisample", extStart, extEnd); #endif /* GLX_SGIS_multisample */ #ifdef GLX_SGIS_shared_multisample CONST_CAST(GLXEW_SGIS_shared_multisample) = _glewSearchExtension("GLX_SGIS_shared_multisample", extStart, extEnd); #endif /* GLX_SGIS_shared_multisample */ #ifdef GLX_SGIX_fbconfig CONST_CAST(GLXEW_SGIX_fbconfig) = _glewSearchExtension("GLX_SGIX_fbconfig", extStart, extEnd); if (glewExperimental || GLXEW_SGIX_fbconfig) CONST_CAST(GLXEW_SGIX_fbconfig) = !_glewInit_GLX_SGIX_fbconfig(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GLX_SGIX_fbconfig */ #ifdef GLX_SGIX_hyperpipe CONST_CAST(GLXEW_SGIX_hyperpipe) = _glewSearchExtension("GLX_SGIX_hyperpipe", extStart, extEnd); if (glewExperimental || GLXEW_SGIX_hyperpipe) CONST_CAST(GLXEW_SGIX_hyperpipe) = !_glewInit_GLX_SGIX_hyperpipe(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GLX_SGIX_hyperpipe */ #ifdef GLX_SGIX_pbuffer CONST_CAST(GLXEW_SGIX_pbuffer) = _glewSearchExtension("GLX_SGIX_pbuffer", extStart, extEnd); if (glewExperimental || GLXEW_SGIX_pbuffer) CONST_CAST(GLXEW_SGIX_pbuffer) = !_glewInit_GLX_SGIX_pbuffer(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GLX_SGIX_pbuffer */ #ifdef GLX_SGIX_swap_barrier CONST_CAST(GLXEW_SGIX_swap_barrier) = _glewSearchExtension("GLX_SGIX_swap_barrier", extStart, extEnd); if (glewExperimental || GLXEW_SGIX_swap_barrier) CONST_CAST(GLXEW_SGIX_swap_barrier) = !_glewInit_GLX_SGIX_swap_barrier(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GLX_SGIX_swap_barrier */ #ifdef GLX_SGIX_swap_group CONST_CAST(GLXEW_SGIX_swap_group) = _glewSearchExtension("GLX_SGIX_swap_group", extStart, extEnd); if (glewExperimental || GLXEW_SGIX_swap_group) CONST_CAST(GLXEW_SGIX_swap_group) = !_glewInit_GLX_SGIX_swap_group(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GLX_SGIX_swap_group */ #ifdef GLX_SGIX_video_resize CONST_CAST(GLXEW_SGIX_video_resize) = _glewSearchExtension("GLX_SGIX_video_resize", extStart, extEnd); if (glewExperimental || GLXEW_SGIX_video_resize) CONST_CAST(GLXEW_SGIX_video_resize) = !_glewInit_GLX_SGIX_video_resize(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GLX_SGIX_video_resize */ #ifdef GLX_SGIX_visual_select_group CONST_CAST(GLXEW_SGIX_visual_select_group) = _glewSearchExtension("GLX_SGIX_visual_select_group", extStart, extEnd); #endif /* GLX_SGIX_visual_select_group */ #ifdef GLX_SGI_cushion CONST_CAST(GLXEW_SGI_cushion) = _glewSearchExtension("GLX_SGI_cushion", extStart, extEnd); if (glewExperimental || GLXEW_SGI_cushion) CONST_CAST(GLXEW_SGI_cushion) = !_glewInit_GLX_SGI_cushion(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GLX_SGI_cushion */ #ifdef GLX_SGI_make_current_read CONST_CAST(GLXEW_SGI_make_current_read) = _glewSearchExtension("GLX_SGI_make_current_read", extStart, extEnd); if (glewExperimental || GLXEW_SGI_make_current_read) CONST_CAST(GLXEW_SGI_make_current_read) = !_glewInit_GLX_SGI_make_current_read(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GLX_SGI_make_current_read */ #ifdef GLX_SGI_swap_control CONST_CAST(GLXEW_SGI_swap_control) = _glewSearchExtension("GLX_SGI_swap_control", extStart, extEnd); if (glewExperimental || GLXEW_SGI_swap_control) CONST_CAST(GLXEW_SGI_swap_control) = !_glewInit_GLX_SGI_swap_control(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GLX_SGI_swap_control */ #ifdef GLX_SGI_video_sync CONST_CAST(GLXEW_SGI_video_sync) = _glewSearchExtension("GLX_SGI_video_sync", extStart, extEnd); if (glewExperimental || GLXEW_SGI_video_sync) CONST_CAST(GLXEW_SGI_video_sync) = !_glewInit_GLX_SGI_video_sync(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GLX_SGI_video_sync */ #ifdef GLX_SUN_get_transparent_index CONST_CAST(GLXEW_SUN_get_transparent_index) = _glewSearchExtension("GLX_SUN_get_transparent_index", extStart, extEnd); if (glewExperimental || GLXEW_SUN_get_transparent_index) CONST_CAST(GLXEW_SUN_get_transparent_index) = !_glewInit_GLX_SUN_get_transparent_index(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GLX_SUN_get_transparent_index */ #ifdef GLX_SUN_video_resize CONST_CAST(GLXEW_SUN_video_resize) = _glewSearchExtension("GLX_SUN_video_resize", extStart, extEnd); if (glewExperimental || GLXEW_SUN_video_resize) CONST_CAST(GLXEW_SUN_video_resize) = !_glewInit_GLX_SUN_video_resize(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GLX_SUN_video_resize */ return GLEW_OK; } #endif /* !defined(__ANDROID__) && (!defined(__APPLE__) || defined(GLEW_APPLE_GLX)) */ /* ------------------------------------------------------------------------ */ const GLubyte * GLEWAPIENTRY glewGetErrorString (GLenum error) { static const GLubyte* _glewErrorString[] = { (const GLubyte*)"No error", (const GLubyte*)"Missing GL version", (const GLubyte*)"GL 1.1 and up are not supported", (const GLubyte*)"GLX 1.2 and up are not supported", (const GLubyte*)"Unknown error" }; const int max_error = sizeof(_glewErrorString)/sizeof(*_glewErrorString) - 1; return _glewErrorString[(int)error > max_error ? max_error : (int)error]; } const GLubyte * GLEWAPIENTRY glewGetString (GLenum name) { static const GLubyte* _glewString[] = { (const GLubyte*)NULL, (const GLubyte*)"1.9.0", (const GLubyte*)"1", (const GLubyte*)"9", (const GLubyte*)"0" }; const int max_string = sizeof(_glewString)/sizeof(*_glewString) - 1; return _glewString[(int)name > max_string ? 0 : (int)name]; } /* ------------------------------------------------------------------------ */ GLboolean glewExperimental = GL_FALSE; #if !defined(GLEW_MX) #if defined(_WIN32) extern GLenum GLEWAPIENTRY wglewContextInit (void); #elif !defined(__ANDROID__) && (!defined(__APPLE__) || defined(GLEW_APPLE_GLX)) extern GLenum GLEWAPIENTRY glxewContextInit (void); #endif /* _WIN32 */ GLenum GLEWAPIENTRY glewInit (void) { GLenum r; r = glewContextInit(); if ( r != 0 ) return r; #if defined(_WIN32) return wglewContextInit(); #elif !defined(__ANDROID__) && (!defined(__APPLE__) || defined(GLEW_APPLE_GLX)) /* _UNIX */ return glxewContextInit(); #else return r; #endif /* _WIN32 */ } #endif /* !GLEW_MX */ #ifdef GLEW_MX GLboolean GLEWAPIENTRY glewContextIsSupported (const GLEWContext* ctx, const char* name) #else GLboolean GLEWAPIENTRY glewIsSupported (const char* name) #endif { GLubyte* pos = (GLubyte*)name; GLuint len = _glewStrLen(pos); GLboolean ret = GL_TRUE; while (ret && len > 0) { if (_glewStrSame1(&pos, &len, (const GLubyte*)"GL_", 3)) { if (_glewStrSame2(&pos, &len, (const GLubyte*)"VERSION_", 8)) { #ifdef GL_VERSION_1_2 if (_glewStrSame3(&pos, &len, (const GLubyte*)"1_2", 3)) { ret = GLEW_VERSION_1_2; continue; } #endif #ifdef GL_VERSION_1_2_1 if (_glewStrSame3(&pos, &len, (const GLubyte*)"1_2_1", 5)) { ret = GLEW_VERSION_1_2_1; continue; } #endif #ifdef GL_VERSION_1_3 if (_glewStrSame3(&pos, &len, (const GLubyte*)"1_3", 3)) { ret = GLEW_VERSION_1_3; continue; } #endif #ifdef GL_VERSION_1_4 if (_glewStrSame3(&pos, &len, (const GLubyte*)"1_4", 3)) { ret = GLEW_VERSION_1_4; continue; } #endif #ifdef GL_VERSION_1_5 if (_glewStrSame3(&pos, &len, (const GLubyte*)"1_5", 3)) { ret = GLEW_VERSION_1_5; continue; } #endif #ifdef GL_VERSION_2_0 if (_glewStrSame3(&pos, &len, (const GLubyte*)"2_0", 3)) { ret = GLEW_VERSION_2_0; continue; } #endif #ifdef GL_VERSION_2_1 if (_glewStrSame3(&pos, &len, (const GLubyte*)"2_1", 3)) { ret = GLEW_VERSION_2_1; continue; } #endif #ifdef GL_VERSION_3_0 if (_glewStrSame3(&pos, &len, (const GLubyte*)"3_0", 3)) { ret = GLEW_VERSION_3_0; continue; } #endif #ifdef GL_VERSION_3_1 if (_glewStrSame3(&pos, &len, (const GLubyte*)"3_1", 3)) { ret = GLEW_VERSION_3_1; continue; } #endif #ifdef GL_VERSION_3_2 if (_glewStrSame3(&pos, &len, (const GLubyte*)"3_2", 3)) { ret = GLEW_VERSION_3_2; continue; } #endif #ifdef GL_VERSION_3_3 if (_glewStrSame3(&pos, &len, (const GLubyte*)"3_3", 3)) { ret = GLEW_VERSION_3_3; continue; } #endif #ifdef GL_VERSION_4_0 if (_glewStrSame3(&pos, &len, (const GLubyte*)"4_0", 3)) { ret = GLEW_VERSION_4_0; continue; } #endif #ifdef GL_VERSION_4_1 if (_glewStrSame3(&pos, &len, (const GLubyte*)"4_1", 3)) { ret = GLEW_VERSION_4_1; continue; } #endif #ifdef GL_VERSION_4_2 if (_glewStrSame3(&pos, &len, (const GLubyte*)"4_2", 3)) { ret = GLEW_VERSION_4_2; continue; } #endif #ifdef GL_VERSION_4_3 if (_glewStrSame3(&pos, &len, (const GLubyte*)"4_3", 3)) { ret = GLEW_VERSION_4_3; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"3DFX_", 5)) { #ifdef GL_3DFX_multisample if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisample", 11)) { ret = GLEW_3DFX_multisample; continue; } #endif #ifdef GL_3DFX_tbuffer if (_glewStrSame3(&pos, &len, (const GLubyte*)"tbuffer", 7)) { ret = GLEW_3DFX_tbuffer; continue; } #endif #ifdef GL_3DFX_texture_compression_FXT1 if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_FXT1", 24)) { ret = GLEW_3DFX_texture_compression_FXT1; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"AMD_", 4)) { #ifdef GL_AMD_blend_minmax_factor if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_minmax_factor", 19)) { ret = GLEW_AMD_blend_minmax_factor; continue; } #endif #ifdef GL_AMD_conservative_depth if (_glewStrSame3(&pos, &len, (const GLubyte*)"conservative_depth", 18)) { ret = GLEW_AMD_conservative_depth; continue; } #endif #ifdef GL_AMD_debug_output if (_glewStrSame3(&pos, &len, (const GLubyte*)"debug_output", 12)) { ret = GLEW_AMD_debug_output; continue; } #endif #ifdef GL_AMD_depth_clamp_separate if (_glewStrSame3(&pos, &len, (const GLubyte*)"depth_clamp_separate", 20)) { ret = GLEW_AMD_depth_clamp_separate; continue; } #endif #ifdef GL_AMD_draw_buffers_blend if (_glewStrSame3(&pos, &len, (const GLubyte*)"draw_buffers_blend", 18)) { ret = GLEW_AMD_draw_buffers_blend; continue; } #endif #ifdef GL_AMD_multi_draw_indirect if (_glewStrSame3(&pos, &len, (const GLubyte*)"multi_draw_indirect", 19)) { ret = GLEW_AMD_multi_draw_indirect; continue; } #endif #ifdef GL_AMD_name_gen_delete if (_glewStrSame3(&pos, &len, (const GLubyte*)"name_gen_delete", 15)) { ret = GLEW_AMD_name_gen_delete; continue; } #endif #ifdef GL_AMD_performance_monitor if (_glewStrSame3(&pos, &len, (const GLubyte*)"performance_monitor", 19)) { ret = GLEW_AMD_performance_monitor; continue; } #endif #ifdef GL_AMD_pinned_memory if (_glewStrSame3(&pos, &len, (const GLubyte*)"pinned_memory", 13)) { ret = GLEW_AMD_pinned_memory; continue; } #endif #ifdef GL_AMD_query_buffer_object if (_glewStrSame3(&pos, &len, (const GLubyte*)"query_buffer_object", 19)) { ret = GLEW_AMD_query_buffer_object; continue; } #endif #ifdef GL_AMD_sample_positions if (_glewStrSame3(&pos, &len, (const GLubyte*)"sample_positions", 16)) { ret = GLEW_AMD_sample_positions; continue; } #endif #ifdef GL_AMD_seamless_cubemap_per_texture if (_glewStrSame3(&pos, &len, (const GLubyte*)"seamless_cubemap_per_texture", 28)) { ret = GLEW_AMD_seamless_cubemap_per_texture; continue; } #endif #ifdef GL_AMD_shader_stencil_export if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_stencil_export", 21)) { ret = GLEW_AMD_shader_stencil_export; continue; } #endif #ifdef GL_AMD_stencil_operation_extended if (_glewStrSame3(&pos, &len, (const GLubyte*)"stencil_operation_extended", 26)) { ret = GLEW_AMD_stencil_operation_extended; continue; } #endif #ifdef GL_AMD_texture_texture4 if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_texture4", 16)) { ret = GLEW_AMD_texture_texture4; continue; } #endif #ifdef GL_AMD_transform_feedback3_lines_triangles if (_glewStrSame3(&pos, &len, (const GLubyte*)"transform_feedback3_lines_triangles", 35)) { ret = GLEW_AMD_transform_feedback3_lines_triangles; continue; } #endif #ifdef GL_AMD_vertex_shader_layer if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_shader_layer", 19)) { ret = GLEW_AMD_vertex_shader_layer; continue; } #endif #ifdef GL_AMD_vertex_shader_tessellator if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_shader_tessellator", 25)) { ret = GLEW_AMD_vertex_shader_tessellator; continue; } #endif #ifdef GL_AMD_vertex_shader_viewport_index if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_shader_viewport_index", 28)) { ret = GLEW_AMD_vertex_shader_viewport_index; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"APPLE_", 6)) { #ifdef GL_APPLE_aux_depth_stencil if (_glewStrSame3(&pos, &len, (const GLubyte*)"aux_depth_stencil", 17)) { ret = GLEW_APPLE_aux_depth_stencil; continue; } #endif #ifdef GL_APPLE_client_storage if (_glewStrSame3(&pos, &len, (const GLubyte*)"client_storage", 14)) { ret = GLEW_APPLE_client_storage; continue; } #endif #ifdef GL_APPLE_element_array if (_glewStrSame3(&pos, &len, (const GLubyte*)"element_array", 13)) { ret = GLEW_APPLE_element_array; continue; } #endif #ifdef GL_APPLE_fence if (_glewStrSame3(&pos, &len, (const GLubyte*)"fence", 5)) { ret = GLEW_APPLE_fence; continue; } #endif #ifdef GL_APPLE_float_pixels if (_glewStrSame3(&pos, &len, (const GLubyte*)"float_pixels", 12)) { ret = GLEW_APPLE_float_pixels; continue; } #endif #ifdef GL_APPLE_flush_buffer_range if (_glewStrSame3(&pos, &len, (const GLubyte*)"flush_buffer_range", 18)) { ret = GLEW_APPLE_flush_buffer_range; continue; } #endif #ifdef GL_APPLE_object_purgeable if (_glewStrSame3(&pos, &len, (const GLubyte*)"object_purgeable", 16)) { ret = GLEW_APPLE_object_purgeable; continue; } #endif #ifdef GL_APPLE_pixel_buffer if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_buffer", 12)) { ret = GLEW_APPLE_pixel_buffer; continue; } #endif #ifdef GL_APPLE_rgb_422 if (_glewStrSame3(&pos, &len, (const GLubyte*)"rgb_422", 7)) { ret = GLEW_APPLE_rgb_422; continue; } #endif #ifdef GL_APPLE_row_bytes if (_glewStrSame3(&pos, &len, (const GLubyte*)"row_bytes", 9)) { ret = GLEW_APPLE_row_bytes; continue; } #endif #ifdef GL_APPLE_specular_vector if (_glewStrSame3(&pos, &len, (const GLubyte*)"specular_vector", 15)) { ret = GLEW_APPLE_specular_vector; continue; } #endif #ifdef GL_APPLE_texture_range if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_range", 13)) { ret = GLEW_APPLE_texture_range; continue; } #endif #ifdef GL_APPLE_transform_hint if (_glewStrSame3(&pos, &len, (const GLubyte*)"transform_hint", 14)) { ret = GLEW_APPLE_transform_hint; continue; } #endif #ifdef GL_APPLE_vertex_array_object if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_array_object", 19)) { ret = GLEW_APPLE_vertex_array_object; continue; } #endif #ifdef GL_APPLE_vertex_array_range if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_array_range", 18)) { ret = GLEW_APPLE_vertex_array_range; continue; } #endif #ifdef GL_APPLE_vertex_program_evaluators if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_program_evaluators", 25)) { ret = GLEW_APPLE_vertex_program_evaluators; continue; } #endif #ifdef GL_APPLE_ycbcr_422 if (_glewStrSame3(&pos, &len, (const GLubyte*)"ycbcr_422", 9)) { ret = GLEW_APPLE_ycbcr_422; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"ARB_", 4)) { #ifdef GL_ARB_ES2_compatibility if (_glewStrSame3(&pos, &len, (const GLubyte*)"ES2_compatibility", 17)) { ret = GLEW_ARB_ES2_compatibility; continue; } #endif #ifdef GL_ARB_ES3_compatibility if (_glewStrSame3(&pos, &len, (const GLubyte*)"ES3_compatibility", 17)) { ret = GLEW_ARB_ES3_compatibility; continue; } #endif #ifdef GL_ARB_arrays_of_arrays if (_glewStrSame3(&pos, &len, (const GLubyte*)"arrays_of_arrays", 16)) { ret = GLEW_ARB_arrays_of_arrays; continue; } #endif #ifdef GL_ARB_base_instance if (_glewStrSame3(&pos, &len, (const GLubyte*)"base_instance", 13)) { ret = GLEW_ARB_base_instance; continue; } #endif #ifdef GL_ARB_blend_func_extended if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_func_extended", 19)) { ret = GLEW_ARB_blend_func_extended; continue; } #endif #ifdef GL_ARB_cl_event if (_glewStrSame3(&pos, &len, (const GLubyte*)"cl_event", 8)) { ret = GLEW_ARB_cl_event; continue; } #endif #ifdef GL_ARB_clear_buffer_object if (_glewStrSame3(&pos, &len, (const GLubyte*)"clear_buffer_object", 19)) { ret = GLEW_ARB_clear_buffer_object; continue; } #endif #ifdef GL_ARB_color_buffer_float if (_glewStrSame3(&pos, &len, (const GLubyte*)"color_buffer_float", 18)) { ret = GLEW_ARB_color_buffer_float; continue; } #endif #ifdef GL_ARB_compatibility if (_glewStrSame3(&pos, &len, (const GLubyte*)"compatibility", 13)) { ret = GLEW_ARB_compatibility; continue; } #endif #ifdef GL_ARB_compressed_texture_pixel_storage if (_glewStrSame3(&pos, &len, (const GLubyte*)"compressed_texture_pixel_storage", 32)) { ret = GLEW_ARB_compressed_texture_pixel_storage; continue; } #endif #ifdef GL_ARB_compute_shader if (_glewStrSame3(&pos, &len, (const GLubyte*)"compute_shader", 14)) { ret = GLEW_ARB_compute_shader; continue; } #endif #ifdef GL_ARB_conservative_depth if (_glewStrSame3(&pos, &len, (const GLubyte*)"conservative_depth", 18)) { ret = GLEW_ARB_conservative_depth; continue; } #endif #ifdef GL_ARB_copy_buffer if (_glewStrSame3(&pos, &len, (const GLubyte*)"copy_buffer", 11)) { ret = GLEW_ARB_copy_buffer; continue; } #endif #ifdef GL_ARB_copy_image if (_glewStrSame3(&pos, &len, (const GLubyte*)"copy_image", 10)) { ret = GLEW_ARB_copy_image; continue; } #endif #ifdef GL_ARB_debug_output if (_glewStrSame3(&pos, &len, (const GLubyte*)"debug_output", 12)) { ret = GLEW_ARB_debug_output; continue; } #endif #ifdef GL_ARB_depth_buffer_float if (_glewStrSame3(&pos, &len, (const GLubyte*)"depth_buffer_float", 18)) { ret = GLEW_ARB_depth_buffer_float; continue; } #endif #ifdef GL_ARB_depth_clamp if (_glewStrSame3(&pos, &len, (const GLubyte*)"depth_clamp", 11)) { ret = GLEW_ARB_depth_clamp; continue; } #endif #ifdef GL_ARB_depth_texture if (_glewStrSame3(&pos, &len, (const GLubyte*)"depth_texture", 13)) { ret = GLEW_ARB_depth_texture; continue; } #endif #ifdef GL_ARB_draw_buffers if (_glewStrSame3(&pos, &len, (const GLubyte*)"draw_buffers", 12)) { ret = GLEW_ARB_draw_buffers; continue; } #endif #ifdef GL_ARB_draw_buffers_blend if (_glewStrSame3(&pos, &len, (const GLubyte*)"draw_buffers_blend", 18)) { ret = GLEW_ARB_draw_buffers_blend; continue; } #endif #ifdef GL_ARB_draw_elements_base_vertex if (_glewStrSame3(&pos, &len, (const GLubyte*)"draw_elements_base_vertex", 25)) { ret = GLEW_ARB_draw_elements_base_vertex; continue; } #endif #ifdef GL_ARB_draw_indirect if (_glewStrSame3(&pos, &len, (const GLubyte*)"draw_indirect", 13)) { ret = GLEW_ARB_draw_indirect; continue; } #endif #ifdef GL_ARB_draw_instanced if (_glewStrSame3(&pos, &len, (const GLubyte*)"draw_instanced", 14)) { ret = GLEW_ARB_draw_instanced; continue; } #endif #ifdef GL_ARB_explicit_attrib_location if (_glewStrSame3(&pos, &len, (const GLubyte*)"explicit_attrib_location", 24)) { ret = GLEW_ARB_explicit_attrib_location; continue; } #endif #ifdef GL_ARB_explicit_uniform_location if (_glewStrSame3(&pos, &len, (const GLubyte*)"explicit_uniform_location", 25)) { ret = GLEW_ARB_explicit_uniform_location; continue; } #endif #ifdef GL_ARB_fragment_coord_conventions if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_coord_conventions", 26)) { ret = GLEW_ARB_fragment_coord_conventions; continue; } #endif #ifdef GL_ARB_fragment_layer_viewport if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_layer_viewport", 23)) { ret = GLEW_ARB_fragment_layer_viewport; continue; } #endif #ifdef GL_ARB_fragment_program if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_program", 16)) { ret = GLEW_ARB_fragment_program; continue; } #endif #ifdef GL_ARB_fragment_program_shadow if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_program_shadow", 23)) { ret = GLEW_ARB_fragment_program_shadow; continue; } #endif #ifdef GL_ARB_fragment_shader if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_shader", 15)) { ret = GLEW_ARB_fragment_shader; continue; } #endif #ifdef GL_ARB_framebuffer_no_attachments if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_no_attachments", 26)) { ret = GLEW_ARB_framebuffer_no_attachments; continue; } #endif #ifdef GL_ARB_framebuffer_object if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_object", 18)) { ret = GLEW_ARB_framebuffer_object; continue; } #endif #ifdef GL_ARB_framebuffer_sRGB if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_sRGB", 16)) { ret = GLEW_ARB_framebuffer_sRGB; continue; } #endif #ifdef GL_ARB_geometry_shader4 if (_glewStrSame3(&pos, &len, (const GLubyte*)"geometry_shader4", 16)) { ret = GLEW_ARB_geometry_shader4; continue; } #endif #ifdef GL_ARB_get_program_binary if (_glewStrSame3(&pos, &len, (const GLubyte*)"get_program_binary", 18)) { ret = GLEW_ARB_get_program_binary; continue; } #endif #ifdef GL_ARB_gpu_shader5 if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_shader5", 11)) { ret = GLEW_ARB_gpu_shader5; continue; } #endif #ifdef GL_ARB_gpu_shader_fp64 if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_shader_fp64", 15)) { ret = GLEW_ARB_gpu_shader_fp64; continue; } #endif #ifdef GL_ARB_half_float_pixel if (_glewStrSame3(&pos, &len, (const GLubyte*)"half_float_pixel", 16)) { ret = GLEW_ARB_half_float_pixel; continue; } #endif #ifdef GL_ARB_half_float_vertex if (_glewStrSame3(&pos, &len, (const GLubyte*)"half_float_vertex", 17)) { ret = GLEW_ARB_half_float_vertex; continue; } #endif #ifdef GL_ARB_imaging if (_glewStrSame3(&pos, &len, (const GLubyte*)"imaging", 7)) { ret = GLEW_ARB_imaging; continue; } #endif #ifdef GL_ARB_instanced_arrays if (_glewStrSame3(&pos, &len, (const GLubyte*)"instanced_arrays", 16)) { ret = GLEW_ARB_instanced_arrays; continue; } #endif #ifdef GL_ARB_internalformat_query if (_glewStrSame3(&pos, &len, (const GLubyte*)"internalformat_query", 20)) { ret = GLEW_ARB_internalformat_query; continue; } #endif #ifdef GL_ARB_internalformat_query2 if (_glewStrSame3(&pos, &len, (const GLubyte*)"internalformat_query2", 21)) { ret = GLEW_ARB_internalformat_query2; continue; } #endif #ifdef GL_ARB_invalidate_subdata if (_glewStrSame3(&pos, &len, (const GLubyte*)"invalidate_subdata", 18)) { ret = GLEW_ARB_invalidate_subdata; continue; } #endif #ifdef GL_ARB_map_buffer_alignment if (_glewStrSame3(&pos, &len, (const GLubyte*)"map_buffer_alignment", 20)) { ret = GLEW_ARB_map_buffer_alignment; continue; } #endif #ifdef GL_ARB_map_buffer_range if (_glewStrSame3(&pos, &len, (const GLubyte*)"map_buffer_range", 16)) { ret = GLEW_ARB_map_buffer_range; continue; } #endif #ifdef GL_ARB_matrix_palette if (_glewStrSame3(&pos, &len, (const GLubyte*)"matrix_palette", 14)) { ret = GLEW_ARB_matrix_palette; continue; } #endif #ifdef GL_ARB_multi_draw_indirect if (_glewStrSame3(&pos, &len, (const GLubyte*)"multi_draw_indirect", 19)) { ret = GLEW_ARB_multi_draw_indirect; continue; } #endif #ifdef GL_ARB_multisample if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisample", 11)) { ret = GLEW_ARB_multisample; continue; } #endif #ifdef GL_ARB_multitexture if (_glewStrSame3(&pos, &len, (const GLubyte*)"multitexture", 12)) { ret = GLEW_ARB_multitexture; continue; } #endif #ifdef GL_ARB_occlusion_query if (_glewStrSame3(&pos, &len, (const GLubyte*)"occlusion_query", 15)) { ret = GLEW_ARB_occlusion_query; continue; } #endif #ifdef GL_ARB_occlusion_query2 if (_glewStrSame3(&pos, &len, (const GLubyte*)"occlusion_query2", 16)) { ret = GLEW_ARB_occlusion_query2; continue; } #endif #ifdef GL_ARB_pixel_buffer_object if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_buffer_object", 19)) { ret = GLEW_ARB_pixel_buffer_object; continue; } #endif #ifdef GL_ARB_point_parameters if (_glewStrSame3(&pos, &len, (const GLubyte*)"point_parameters", 16)) { ret = GLEW_ARB_point_parameters; continue; } #endif #ifdef GL_ARB_point_sprite if (_glewStrSame3(&pos, &len, (const GLubyte*)"point_sprite", 12)) { ret = GLEW_ARB_point_sprite; continue; } #endif #ifdef GL_ARB_program_interface_query if (_glewStrSame3(&pos, &len, (const GLubyte*)"program_interface_query", 23)) { ret = GLEW_ARB_program_interface_query; continue; } #endif #ifdef GL_ARB_provoking_vertex if (_glewStrSame3(&pos, &len, (const GLubyte*)"provoking_vertex", 16)) { ret = GLEW_ARB_provoking_vertex; continue; } #endif #ifdef GL_ARB_robust_buffer_access_behavior if (_glewStrSame3(&pos, &len, (const GLubyte*)"robust_buffer_access_behavior", 29)) { ret = GLEW_ARB_robust_buffer_access_behavior; continue; } #endif #ifdef GL_ARB_robustness if (_glewStrSame3(&pos, &len, (const GLubyte*)"robustness", 10)) { ret = GLEW_ARB_robustness; continue; } #endif #ifdef GL_ARB_robustness_application_isolation if (_glewStrSame3(&pos, &len, (const GLubyte*)"robustness_application_isolation", 32)) { ret = GLEW_ARB_robustness_application_isolation; continue; } #endif #ifdef GL_ARB_robustness_share_group_isolation if (_glewStrSame3(&pos, &len, (const GLubyte*)"robustness_share_group_isolation", 32)) { ret = GLEW_ARB_robustness_share_group_isolation; continue; } #endif #ifdef GL_ARB_sample_shading if (_glewStrSame3(&pos, &len, (const GLubyte*)"sample_shading", 14)) { ret = GLEW_ARB_sample_shading; continue; } #endif #ifdef GL_ARB_sampler_objects if (_glewStrSame3(&pos, &len, (const GLubyte*)"sampler_objects", 15)) { ret = GLEW_ARB_sampler_objects; continue; } #endif #ifdef GL_ARB_seamless_cube_map if (_glewStrSame3(&pos, &len, (const GLubyte*)"seamless_cube_map", 17)) { ret = GLEW_ARB_seamless_cube_map; continue; } #endif #ifdef GL_ARB_separate_shader_objects if (_glewStrSame3(&pos, &len, (const GLubyte*)"separate_shader_objects", 23)) { ret = GLEW_ARB_separate_shader_objects; continue; } #endif #ifdef GL_ARB_shader_atomic_counters if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_atomic_counters", 22)) { ret = GLEW_ARB_shader_atomic_counters; continue; } #endif #ifdef GL_ARB_shader_bit_encoding if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_bit_encoding", 19)) { ret = GLEW_ARB_shader_bit_encoding; continue; } #endif #ifdef GL_ARB_shader_image_load_store if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_image_load_store", 23)) { ret = GLEW_ARB_shader_image_load_store; continue; } #endif #ifdef GL_ARB_shader_image_size if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_image_size", 17)) { ret = GLEW_ARB_shader_image_size; continue; } #endif #ifdef GL_ARB_shader_objects if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_objects", 14)) { ret = GLEW_ARB_shader_objects; continue; } #endif #ifdef GL_ARB_shader_precision if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_precision", 16)) { ret = GLEW_ARB_shader_precision; continue; } #endif #ifdef GL_ARB_shader_stencil_export if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_stencil_export", 21)) { ret = GLEW_ARB_shader_stencil_export; continue; } #endif #ifdef GL_ARB_shader_storage_buffer_object if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_storage_buffer_object", 28)) { ret = GLEW_ARB_shader_storage_buffer_object; continue; } #endif #ifdef GL_ARB_shader_subroutine if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_subroutine", 17)) { ret = GLEW_ARB_shader_subroutine; continue; } #endif #ifdef GL_ARB_shader_texture_lod if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_texture_lod", 18)) { ret = GLEW_ARB_shader_texture_lod; continue; } #endif #ifdef GL_ARB_shading_language_100 if (_glewStrSame3(&pos, &len, (const GLubyte*)"shading_language_100", 20)) { ret = GLEW_ARB_shading_language_100; continue; } #endif #ifdef GL_ARB_shading_language_420pack if (_glewStrSame3(&pos, &len, (const GLubyte*)"shading_language_420pack", 24)) { ret = GLEW_ARB_shading_language_420pack; continue; } #endif #ifdef GL_ARB_shading_language_include if (_glewStrSame3(&pos, &len, (const GLubyte*)"shading_language_include", 24)) { ret = GLEW_ARB_shading_language_include; continue; } #endif #ifdef GL_ARB_shading_language_packing if (_glewStrSame3(&pos, &len, (const GLubyte*)"shading_language_packing", 24)) { ret = GLEW_ARB_shading_language_packing; continue; } #endif #ifdef GL_ARB_shadow if (_glewStrSame3(&pos, &len, (const GLubyte*)"shadow", 6)) { ret = GLEW_ARB_shadow; continue; } #endif #ifdef GL_ARB_shadow_ambient if (_glewStrSame3(&pos, &len, (const GLubyte*)"shadow_ambient", 14)) { ret = GLEW_ARB_shadow_ambient; continue; } #endif #ifdef GL_ARB_stencil_texturing if (_glewStrSame3(&pos, &len, (const GLubyte*)"stencil_texturing", 17)) { ret = GLEW_ARB_stencil_texturing; continue; } #endif #ifdef GL_ARB_sync if (_glewStrSame3(&pos, &len, (const GLubyte*)"sync", 4)) { ret = GLEW_ARB_sync; continue; } #endif #ifdef GL_ARB_tessellation_shader if (_glewStrSame3(&pos, &len, (const GLubyte*)"tessellation_shader", 19)) { ret = GLEW_ARB_tessellation_shader; continue; } #endif #ifdef GL_ARB_texture_border_clamp if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_border_clamp", 20)) { ret = GLEW_ARB_texture_border_clamp; continue; } #endif #ifdef GL_ARB_texture_buffer_object if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_buffer_object", 21)) { ret = GLEW_ARB_texture_buffer_object; continue; } #endif #ifdef GL_ARB_texture_buffer_object_rgb32 if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_buffer_object_rgb32", 27)) { ret = GLEW_ARB_texture_buffer_object_rgb32; continue; } #endif #ifdef GL_ARB_texture_buffer_range if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_buffer_range", 20)) { ret = GLEW_ARB_texture_buffer_range; continue; } #endif #ifdef GL_ARB_texture_compression if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression", 19)) { ret = GLEW_ARB_texture_compression; continue; } #endif #ifdef GL_ARB_texture_compression_bptc if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_bptc", 24)) { ret = GLEW_ARB_texture_compression_bptc; continue; } #endif #ifdef GL_ARB_texture_compression_rgtc if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_rgtc", 24)) { ret = GLEW_ARB_texture_compression_rgtc; continue; } #endif #ifdef GL_ARB_texture_cube_map if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_cube_map", 16)) { ret = GLEW_ARB_texture_cube_map; continue; } #endif #ifdef GL_ARB_texture_cube_map_array if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_cube_map_array", 22)) { ret = GLEW_ARB_texture_cube_map_array; continue; } #endif #ifdef GL_ARB_texture_env_add if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_env_add", 15)) { ret = GLEW_ARB_texture_env_add; continue; } #endif #ifdef GL_ARB_texture_env_combine if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_env_combine", 19)) { ret = GLEW_ARB_texture_env_combine; continue; } #endif #ifdef GL_ARB_texture_env_crossbar if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_env_crossbar", 20)) { ret = GLEW_ARB_texture_env_crossbar; continue; } #endif #ifdef GL_ARB_texture_env_dot3 if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_env_dot3", 16)) { ret = GLEW_ARB_texture_env_dot3; continue; } #endif #ifdef GL_ARB_texture_float if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_float", 13)) { ret = GLEW_ARB_texture_float; continue; } #endif #ifdef GL_ARB_texture_gather if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_gather", 14)) { ret = GLEW_ARB_texture_gather; continue; } #endif #ifdef GL_ARB_texture_mirrored_repeat if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_mirrored_repeat", 23)) { ret = GLEW_ARB_texture_mirrored_repeat; continue; } #endif #ifdef GL_ARB_texture_multisample if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_multisample", 19)) { ret = GLEW_ARB_texture_multisample; continue; } #endif #ifdef GL_ARB_texture_non_power_of_two if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_non_power_of_two", 24)) { ret = GLEW_ARB_texture_non_power_of_two; continue; } #endif #ifdef GL_ARB_texture_query_levels if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_query_levels", 20)) { ret = GLEW_ARB_texture_query_levels; continue; } #endif #ifdef GL_ARB_texture_query_lod if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_query_lod", 17)) { ret = GLEW_ARB_texture_query_lod; continue; } #endif #ifdef GL_ARB_texture_rectangle if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_rectangle", 17)) { ret = GLEW_ARB_texture_rectangle; continue; } #endif #ifdef GL_ARB_texture_rg if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_rg", 10)) { ret = GLEW_ARB_texture_rg; continue; } #endif #ifdef GL_ARB_texture_rgb10_a2ui if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_rgb10_a2ui", 18)) { ret = GLEW_ARB_texture_rgb10_a2ui; continue; } #endif #ifdef GL_ARB_texture_storage if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_storage", 15)) { ret = GLEW_ARB_texture_storage; continue; } #endif #ifdef GL_ARB_texture_storage_multisample if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_storage_multisample", 27)) { ret = GLEW_ARB_texture_storage_multisample; continue; } #endif #ifdef GL_ARB_texture_swizzle if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_swizzle", 15)) { ret = GLEW_ARB_texture_swizzle; continue; } #endif #ifdef GL_ARB_texture_view if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_view", 12)) { ret = GLEW_ARB_texture_view; continue; } #endif #ifdef GL_ARB_timer_query if (_glewStrSame3(&pos, &len, (const GLubyte*)"timer_query", 11)) { ret = GLEW_ARB_timer_query; continue; } #endif #ifdef GL_ARB_transform_feedback2 if (_glewStrSame3(&pos, &len, (const GLubyte*)"transform_feedback2", 19)) { ret = GLEW_ARB_transform_feedback2; continue; } #endif #ifdef GL_ARB_transform_feedback3 if (_glewStrSame3(&pos, &len, (const GLubyte*)"transform_feedback3", 19)) { ret = GLEW_ARB_transform_feedback3; continue; } #endif #ifdef GL_ARB_transform_feedback_instanced if (_glewStrSame3(&pos, &len, (const GLubyte*)"transform_feedback_instanced", 28)) { ret = GLEW_ARB_transform_feedback_instanced; continue; } #endif #ifdef GL_ARB_transpose_matrix if (_glewStrSame3(&pos, &len, (const GLubyte*)"transpose_matrix", 16)) { ret = GLEW_ARB_transpose_matrix; continue; } #endif #ifdef GL_ARB_uniform_buffer_object if (_glewStrSame3(&pos, &len, (const GLubyte*)"uniform_buffer_object", 21)) { ret = GLEW_ARB_uniform_buffer_object; continue; } #endif #ifdef GL_ARB_vertex_array_bgra if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_array_bgra", 17)) { ret = GLEW_ARB_vertex_array_bgra; continue; } #endif #ifdef GL_ARB_vertex_array_object if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_array_object", 19)) { ret = GLEW_ARB_vertex_array_object; continue; } #endif #ifdef GL_ARB_vertex_attrib_64bit if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_attrib_64bit", 19)) { ret = GLEW_ARB_vertex_attrib_64bit; continue; } #endif #ifdef GL_ARB_vertex_attrib_binding if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_attrib_binding", 21)) { ret = GLEW_ARB_vertex_attrib_binding; continue; } #endif #ifdef GL_ARB_vertex_blend if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_blend", 12)) { ret = GLEW_ARB_vertex_blend; continue; } #endif #ifdef GL_ARB_vertex_buffer_object if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_buffer_object", 20)) { ret = GLEW_ARB_vertex_buffer_object; continue; } #endif #ifdef GL_ARB_vertex_program if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_program", 14)) { ret = GLEW_ARB_vertex_program; continue; } #endif #ifdef GL_ARB_vertex_shader if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_shader", 13)) { ret = GLEW_ARB_vertex_shader; continue; } #endif #ifdef GL_ARB_vertex_type_2_10_10_10_rev if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_type_2_10_10_10_rev", 26)) { ret = GLEW_ARB_vertex_type_2_10_10_10_rev; continue; } #endif #ifdef GL_ARB_viewport_array if (_glewStrSame3(&pos, &len, (const GLubyte*)"viewport_array", 14)) { ret = GLEW_ARB_viewport_array; continue; } #endif #ifdef GL_ARB_window_pos if (_glewStrSame3(&pos, &len, (const GLubyte*)"window_pos", 10)) { ret = GLEW_ARB_window_pos; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"ATIX_", 5)) { #ifdef GL_ATIX_point_sprites if (_glewStrSame3(&pos, &len, (const GLubyte*)"point_sprites", 13)) { ret = GLEW_ATIX_point_sprites; continue; } #endif #ifdef GL_ATIX_texture_env_combine3 if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_env_combine3", 20)) { ret = GLEW_ATIX_texture_env_combine3; continue; } #endif #ifdef GL_ATIX_texture_env_route if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_env_route", 17)) { ret = GLEW_ATIX_texture_env_route; continue; } #endif #ifdef GL_ATIX_vertex_shader_output_point_size if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_shader_output_point_size", 31)) { ret = GLEW_ATIX_vertex_shader_output_point_size; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"ATI_", 4)) { #ifdef GL_ATI_draw_buffers if (_glewStrSame3(&pos, &len, (const GLubyte*)"draw_buffers", 12)) { ret = GLEW_ATI_draw_buffers; continue; } #endif #ifdef GL_ATI_element_array if (_glewStrSame3(&pos, &len, (const GLubyte*)"element_array", 13)) { ret = GLEW_ATI_element_array; continue; } #endif #ifdef GL_ATI_envmap_bumpmap if (_glewStrSame3(&pos, &len, (const GLubyte*)"envmap_bumpmap", 14)) { ret = GLEW_ATI_envmap_bumpmap; continue; } #endif #ifdef GL_ATI_fragment_shader if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_shader", 15)) { ret = GLEW_ATI_fragment_shader; continue; } #endif #ifdef GL_ATI_map_object_buffer if (_glewStrSame3(&pos, &len, (const GLubyte*)"map_object_buffer", 17)) { ret = GLEW_ATI_map_object_buffer; continue; } #endif #ifdef GL_ATI_meminfo if (_glewStrSame3(&pos, &len, (const GLubyte*)"meminfo", 7)) { ret = GLEW_ATI_meminfo; continue; } #endif #ifdef GL_ATI_pn_triangles if (_glewStrSame3(&pos, &len, (const GLubyte*)"pn_triangles", 12)) { ret = GLEW_ATI_pn_triangles; continue; } #endif #ifdef GL_ATI_separate_stencil if (_glewStrSame3(&pos, &len, (const GLubyte*)"separate_stencil", 16)) { ret = GLEW_ATI_separate_stencil; continue; } #endif #ifdef GL_ATI_shader_texture_lod if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_texture_lod", 18)) { ret = GLEW_ATI_shader_texture_lod; continue; } #endif #ifdef GL_ATI_text_fragment_shader if (_glewStrSame3(&pos, &len, (const GLubyte*)"text_fragment_shader", 20)) { ret = GLEW_ATI_text_fragment_shader; continue; } #endif #ifdef GL_ATI_texture_compression_3dc if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_3dc", 23)) { ret = GLEW_ATI_texture_compression_3dc; continue; } #endif #ifdef GL_ATI_texture_env_combine3 if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_env_combine3", 20)) { ret = GLEW_ATI_texture_env_combine3; continue; } #endif #ifdef GL_ATI_texture_float if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_float", 13)) { ret = GLEW_ATI_texture_float; continue; } #endif #ifdef GL_ATI_texture_mirror_once if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_mirror_once", 19)) { ret = GLEW_ATI_texture_mirror_once; continue; } #endif #ifdef GL_ATI_vertex_array_object if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_array_object", 19)) { ret = GLEW_ATI_vertex_array_object; continue; } #endif #ifdef GL_ATI_vertex_attrib_array_object if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_attrib_array_object", 26)) { ret = GLEW_ATI_vertex_attrib_array_object; continue; } #endif #ifdef GL_ATI_vertex_streams if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_streams", 14)) { ret = GLEW_ATI_vertex_streams; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"EXT_", 4)) { #ifdef GL_EXT_422_pixels if (_glewStrSame3(&pos, &len, (const GLubyte*)"422_pixels", 10)) { ret = GLEW_EXT_422_pixels; continue; } #endif #ifdef GL_EXT_Cg_shader if (_glewStrSame3(&pos, &len, (const GLubyte*)"Cg_shader", 9)) { ret = GLEW_EXT_Cg_shader; continue; } #endif #ifdef GL_EXT_abgr if (_glewStrSame3(&pos, &len, (const GLubyte*)"abgr", 4)) { ret = GLEW_EXT_abgr; continue; } #endif #ifdef GL_EXT_bgra if (_glewStrSame3(&pos, &len, (const GLubyte*)"bgra", 4)) { ret = GLEW_EXT_bgra; continue; } #endif #ifdef GL_EXT_bindable_uniform if (_glewStrSame3(&pos, &len, (const GLubyte*)"bindable_uniform", 16)) { ret = GLEW_EXT_bindable_uniform; continue; } #endif #ifdef GL_EXT_blend_color if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_color", 11)) { ret = GLEW_EXT_blend_color; continue; } #endif #ifdef GL_EXT_blend_equation_separate if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_equation_separate", 23)) { ret = GLEW_EXT_blend_equation_separate; continue; } #endif #ifdef GL_EXT_blend_func_separate if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_func_separate", 19)) { ret = GLEW_EXT_blend_func_separate; continue; } #endif #ifdef GL_EXT_blend_logic_op if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_logic_op", 14)) { ret = GLEW_EXT_blend_logic_op; continue; } #endif #ifdef GL_EXT_blend_minmax if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_minmax", 12)) { ret = GLEW_EXT_blend_minmax; continue; } #endif #ifdef GL_EXT_blend_subtract if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_subtract", 14)) { ret = GLEW_EXT_blend_subtract; continue; } #endif #ifdef GL_EXT_clip_volume_hint if (_glewStrSame3(&pos, &len, (const GLubyte*)"clip_volume_hint", 16)) { ret = GLEW_EXT_clip_volume_hint; continue; } #endif #ifdef GL_EXT_cmyka if (_glewStrSame3(&pos, &len, (const GLubyte*)"cmyka", 5)) { ret = GLEW_EXT_cmyka; continue; } #endif #ifdef GL_EXT_color_subtable if (_glewStrSame3(&pos, &len, (const GLubyte*)"color_subtable", 14)) { ret = GLEW_EXT_color_subtable; continue; } #endif #ifdef GL_EXT_compiled_vertex_array if (_glewStrSame3(&pos, &len, (const GLubyte*)"compiled_vertex_array", 21)) { ret = GLEW_EXT_compiled_vertex_array; continue; } #endif #ifdef GL_EXT_convolution if (_glewStrSame3(&pos, &len, (const GLubyte*)"convolution", 11)) { ret = GLEW_EXT_convolution; continue; } #endif #ifdef GL_EXT_coordinate_frame if (_glewStrSame3(&pos, &len, (const GLubyte*)"coordinate_frame", 16)) { ret = GLEW_EXT_coordinate_frame; continue; } #endif #ifdef GL_EXT_copy_texture if (_glewStrSame3(&pos, &len, (const GLubyte*)"copy_texture", 12)) { ret = GLEW_EXT_copy_texture; continue; } #endif #ifdef GL_EXT_cull_vertex if (_glewStrSame3(&pos, &len, (const GLubyte*)"cull_vertex", 11)) { ret = GLEW_EXT_cull_vertex; continue; } #endif #ifdef GL_EXT_debug_marker if (_glewStrSame3(&pos, &len, (const GLubyte*)"debug_marker", 12)) { ret = GLEW_EXT_debug_marker; continue; } #endif #ifdef GL_EXT_depth_bounds_test if (_glewStrSame3(&pos, &len, (const GLubyte*)"depth_bounds_test", 17)) { ret = GLEW_EXT_depth_bounds_test; continue; } #endif #ifdef GL_EXT_direct_state_access if (_glewStrSame3(&pos, &len, (const GLubyte*)"direct_state_access", 19)) { ret = GLEW_EXT_direct_state_access; continue; } #endif #ifdef GL_EXT_draw_buffers2 if (_glewStrSame3(&pos, &len, (const GLubyte*)"draw_buffers2", 13)) { ret = GLEW_EXT_draw_buffers2; continue; } #endif #ifdef GL_EXT_draw_instanced if (_glewStrSame3(&pos, &len, (const GLubyte*)"draw_instanced", 14)) { ret = GLEW_EXT_draw_instanced; continue; } #endif #ifdef GL_EXT_draw_range_elements if (_glewStrSame3(&pos, &len, (const GLubyte*)"draw_range_elements", 19)) { ret = GLEW_EXT_draw_range_elements; continue; } #endif #ifdef GL_EXT_fog_coord if (_glewStrSame3(&pos, &len, (const GLubyte*)"fog_coord", 9)) { ret = GLEW_EXT_fog_coord; continue; } #endif #ifdef GL_EXT_fragment_lighting if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_lighting", 17)) { ret = GLEW_EXT_fragment_lighting; continue; } #endif #ifdef GL_EXT_framebuffer_blit if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_blit", 16)) { ret = GLEW_EXT_framebuffer_blit; continue; } #endif #ifdef GL_EXT_framebuffer_multisample if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_multisample", 23)) { ret = GLEW_EXT_framebuffer_multisample; continue; } #endif #ifdef GL_EXT_framebuffer_multisample_blit_scaled if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_multisample_blit_scaled", 35)) { ret = GLEW_EXT_framebuffer_multisample_blit_scaled; continue; } #endif #ifdef GL_EXT_framebuffer_object if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_object", 18)) { ret = GLEW_EXT_framebuffer_object; continue; } #endif #ifdef GL_EXT_framebuffer_sRGB if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_sRGB", 16)) { ret = GLEW_EXT_framebuffer_sRGB; continue; } #endif #ifdef GL_EXT_geometry_shader4 if (_glewStrSame3(&pos, &len, (const GLubyte*)"geometry_shader4", 16)) { ret = GLEW_EXT_geometry_shader4; continue; } #endif #ifdef GL_EXT_gpu_program_parameters if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_program_parameters", 22)) { ret = GLEW_EXT_gpu_program_parameters; continue; } #endif #ifdef GL_EXT_gpu_shader4 if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_shader4", 11)) { ret = GLEW_EXT_gpu_shader4; continue; } #endif #ifdef GL_EXT_histogram if (_glewStrSame3(&pos, &len, (const GLubyte*)"histogram", 9)) { ret = GLEW_EXT_histogram; continue; } #endif #ifdef GL_EXT_index_array_formats if (_glewStrSame3(&pos, &len, (const GLubyte*)"index_array_formats", 19)) { ret = GLEW_EXT_index_array_formats; continue; } #endif #ifdef GL_EXT_index_func if (_glewStrSame3(&pos, &len, (const GLubyte*)"index_func", 10)) { ret = GLEW_EXT_index_func; continue; } #endif #ifdef GL_EXT_index_material if (_glewStrSame3(&pos, &len, (const GLubyte*)"index_material", 14)) { ret = GLEW_EXT_index_material; continue; } #endif #ifdef GL_EXT_index_texture if (_glewStrSame3(&pos, &len, (const GLubyte*)"index_texture", 13)) { ret = GLEW_EXT_index_texture; continue; } #endif #ifdef GL_EXT_light_texture if (_glewStrSame3(&pos, &len, (const GLubyte*)"light_texture", 13)) { ret = GLEW_EXT_light_texture; continue; } #endif #ifdef GL_EXT_misc_attribute if (_glewStrSame3(&pos, &len, (const GLubyte*)"misc_attribute", 14)) { ret = GLEW_EXT_misc_attribute; continue; } #endif #ifdef GL_EXT_multi_draw_arrays if (_glewStrSame3(&pos, &len, (const GLubyte*)"multi_draw_arrays", 17)) { ret = GLEW_EXT_multi_draw_arrays; continue; } #endif #ifdef GL_EXT_multisample if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisample", 11)) { ret = GLEW_EXT_multisample; continue; } #endif #ifdef GL_EXT_packed_depth_stencil if (_glewStrSame3(&pos, &len, (const GLubyte*)"packed_depth_stencil", 20)) { ret = GLEW_EXT_packed_depth_stencil; continue; } #endif #ifdef GL_EXT_packed_float if (_glewStrSame3(&pos, &len, (const GLubyte*)"packed_float", 12)) { ret = GLEW_EXT_packed_float; continue; } #endif #ifdef GL_EXT_packed_pixels if (_glewStrSame3(&pos, &len, (const GLubyte*)"packed_pixels", 13)) { ret = GLEW_EXT_packed_pixels; continue; } #endif #ifdef GL_EXT_paletted_texture if (_glewStrSame3(&pos, &len, (const GLubyte*)"paletted_texture", 16)) { ret = GLEW_EXT_paletted_texture; continue; } #endif #ifdef GL_EXT_pixel_buffer_object if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_buffer_object", 19)) { ret = GLEW_EXT_pixel_buffer_object; continue; } #endif #ifdef GL_EXT_pixel_transform if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_transform", 15)) { ret = GLEW_EXT_pixel_transform; continue; } #endif #ifdef GL_EXT_pixel_transform_color_table if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_transform_color_table", 27)) { ret = GLEW_EXT_pixel_transform_color_table; continue; } #endif #ifdef GL_EXT_point_parameters if (_glewStrSame3(&pos, &len, (const GLubyte*)"point_parameters", 16)) { ret = GLEW_EXT_point_parameters; continue; } #endif #ifdef GL_EXT_polygon_offset if (_glewStrSame3(&pos, &len, (const GLubyte*)"polygon_offset", 14)) { ret = GLEW_EXT_polygon_offset; continue; } #endif #ifdef GL_EXT_provoking_vertex if (_glewStrSame3(&pos, &len, (const GLubyte*)"provoking_vertex", 16)) { ret = GLEW_EXT_provoking_vertex; continue; } #endif #ifdef GL_EXT_rescale_normal if (_glewStrSame3(&pos, &len, (const GLubyte*)"rescale_normal", 14)) { ret = GLEW_EXT_rescale_normal; continue; } #endif #ifdef GL_EXT_scene_marker if (_glewStrSame3(&pos, &len, (const GLubyte*)"scene_marker", 12)) { ret = GLEW_EXT_scene_marker; continue; } #endif #ifdef GL_EXT_secondary_color if (_glewStrSame3(&pos, &len, (const GLubyte*)"secondary_color", 15)) { ret = GLEW_EXT_secondary_color; continue; } #endif #ifdef GL_EXT_separate_shader_objects if (_glewStrSame3(&pos, &len, (const GLubyte*)"separate_shader_objects", 23)) { ret = GLEW_EXT_separate_shader_objects; continue; } #endif #ifdef GL_EXT_separate_specular_color if (_glewStrSame3(&pos, &len, (const GLubyte*)"separate_specular_color", 23)) { ret = GLEW_EXT_separate_specular_color; continue; } #endif #ifdef GL_EXT_shader_image_load_store if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_image_load_store", 23)) { ret = GLEW_EXT_shader_image_load_store; continue; } #endif #ifdef GL_EXT_shadow_funcs if (_glewStrSame3(&pos, &len, (const GLubyte*)"shadow_funcs", 12)) { ret = GLEW_EXT_shadow_funcs; continue; } #endif #ifdef GL_EXT_shared_texture_palette if (_glewStrSame3(&pos, &len, (const GLubyte*)"shared_texture_palette", 22)) { ret = GLEW_EXT_shared_texture_palette; continue; } #endif #ifdef GL_EXT_stencil_clear_tag if (_glewStrSame3(&pos, &len, (const GLubyte*)"stencil_clear_tag", 17)) { ret = GLEW_EXT_stencil_clear_tag; continue; } #endif #ifdef GL_EXT_stencil_two_side if (_glewStrSame3(&pos, &len, (const GLubyte*)"stencil_two_side", 16)) { ret = GLEW_EXT_stencil_two_side; continue; } #endif #ifdef GL_EXT_stencil_wrap if (_glewStrSame3(&pos, &len, (const GLubyte*)"stencil_wrap", 12)) { ret = GLEW_EXT_stencil_wrap; continue; } #endif #ifdef GL_EXT_subtexture if (_glewStrSame3(&pos, &len, (const GLubyte*)"subtexture", 10)) { ret = GLEW_EXT_subtexture; continue; } #endif #ifdef GL_EXT_texture if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture", 7)) { ret = GLEW_EXT_texture; continue; } #endif #ifdef GL_EXT_texture3D if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture3D", 9)) { ret = GLEW_EXT_texture3D; continue; } #endif #ifdef GL_EXT_texture_array if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_array", 13)) { ret = GLEW_EXT_texture_array; continue; } #endif #ifdef GL_EXT_texture_buffer_object if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_buffer_object", 21)) { ret = GLEW_EXT_texture_buffer_object; continue; } #endif #ifdef GL_EXT_texture_compression_dxt1 if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_dxt1", 24)) { ret = GLEW_EXT_texture_compression_dxt1; continue; } #endif #ifdef GL_EXT_texture_compression_latc if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_latc", 24)) { ret = GLEW_EXT_texture_compression_latc; continue; } #endif #ifdef GL_EXT_texture_compression_rgtc if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_rgtc", 24)) { ret = GLEW_EXT_texture_compression_rgtc; continue; } #endif #ifdef GL_EXT_texture_compression_s3tc if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_s3tc", 24)) { ret = GLEW_EXT_texture_compression_s3tc; continue; } #endif #ifdef GL_EXT_texture_cube_map if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_cube_map", 16)) { ret = GLEW_EXT_texture_cube_map; continue; } #endif #ifdef GL_EXT_texture_edge_clamp if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_edge_clamp", 18)) { ret = GLEW_EXT_texture_edge_clamp; continue; } #endif #ifdef GL_EXT_texture_env if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_env", 11)) { ret = GLEW_EXT_texture_env; continue; } #endif #ifdef GL_EXT_texture_env_add if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_env_add", 15)) { ret = GLEW_EXT_texture_env_add; continue; } #endif #ifdef GL_EXT_texture_env_combine if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_env_combine", 19)) { ret = GLEW_EXT_texture_env_combine; continue; } #endif #ifdef GL_EXT_texture_env_dot3 if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_env_dot3", 16)) { ret = GLEW_EXT_texture_env_dot3; continue; } #endif #ifdef GL_EXT_texture_filter_anisotropic if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_filter_anisotropic", 26)) { ret = GLEW_EXT_texture_filter_anisotropic; continue; } #endif #ifdef GL_EXT_texture_integer if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_integer", 15)) { ret = GLEW_EXT_texture_integer; continue; } #endif #ifdef GL_EXT_texture_lod_bias if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_lod_bias", 16)) { ret = GLEW_EXT_texture_lod_bias; continue; } #endif #ifdef GL_EXT_texture_mirror_clamp if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_mirror_clamp", 20)) { ret = GLEW_EXT_texture_mirror_clamp; continue; } #endif #ifdef GL_EXT_texture_object if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_object", 14)) { ret = GLEW_EXT_texture_object; continue; } #endif #ifdef GL_EXT_texture_perturb_normal if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_perturb_normal", 22)) { ret = GLEW_EXT_texture_perturb_normal; continue; } #endif #ifdef GL_EXT_texture_rectangle if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_rectangle", 17)) { ret = GLEW_EXT_texture_rectangle; continue; } #endif #ifdef GL_EXT_texture_sRGB if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_sRGB", 12)) { ret = GLEW_EXT_texture_sRGB; continue; } #endif #ifdef GL_EXT_texture_sRGB_decode if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_sRGB_decode", 19)) { ret = GLEW_EXT_texture_sRGB_decode; continue; } #endif #ifdef GL_EXT_texture_shared_exponent if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_shared_exponent", 23)) { ret = GLEW_EXT_texture_shared_exponent; continue; } #endif #ifdef GL_EXT_texture_snorm if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_snorm", 13)) { ret = GLEW_EXT_texture_snorm; continue; } #endif #ifdef GL_EXT_texture_swizzle if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_swizzle", 15)) { ret = GLEW_EXT_texture_swizzle; continue; } #endif #ifdef GL_EXT_timer_query if (_glewStrSame3(&pos, &len, (const GLubyte*)"timer_query", 11)) { ret = GLEW_EXT_timer_query; continue; } #endif #ifdef GL_EXT_transform_feedback if (_glewStrSame3(&pos, &len, (const GLubyte*)"transform_feedback", 18)) { ret = GLEW_EXT_transform_feedback; continue; } #endif #ifdef GL_EXT_vertex_array if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_array", 12)) { ret = GLEW_EXT_vertex_array; continue; } #endif #ifdef GL_EXT_vertex_array_bgra if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_array_bgra", 17)) { ret = GLEW_EXT_vertex_array_bgra; continue; } #endif #ifdef GL_EXT_vertex_attrib_64bit if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_attrib_64bit", 19)) { ret = GLEW_EXT_vertex_attrib_64bit; continue; } #endif #ifdef GL_EXT_vertex_shader if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_shader", 13)) { ret = GLEW_EXT_vertex_shader; continue; } #endif #ifdef GL_EXT_vertex_weighting if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_weighting", 16)) { ret = GLEW_EXT_vertex_weighting; continue; } #endif #ifdef GL_EXT_x11_sync_object if (_glewStrSame3(&pos, &len, (const GLubyte*)"x11_sync_object", 15)) { ret = GLEW_EXT_x11_sync_object; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"GREMEDY_", 8)) { #ifdef GL_GREMEDY_frame_terminator if (_glewStrSame3(&pos, &len, (const GLubyte*)"frame_terminator", 16)) { ret = GLEW_GREMEDY_frame_terminator; continue; } #endif #ifdef GL_GREMEDY_string_marker if (_glewStrSame3(&pos, &len, (const GLubyte*)"string_marker", 13)) { ret = GLEW_GREMEDY_string_marker; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"HP_", 3)) { #ifdef GL_HP_convolution_border_modes if (_glewStrSame3(&pos, &len, (const GLubyte*)"convolution_border_modes", 24)) { ret = GLEW_HP_convolution_border_modes; continue; } #endif #ifdef GL_HP_image_transform if (_glewStrSame3(&pos, &len, (const GLubyte*)"image_transform", 15)) { ret = GLEW_HP_image_transform; continue; } #endif #ifdef GL_HP_occlusion_test if (_glewStrSame3(&pos, &len, (const GLubyte*)"occlusion_test", 14)) { ret = GLEW_HP_occlusion_test; continue; } #endif #ifdef GL_HP_texture_lighting if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_lighting", 16)) { ret = GLEW_HP_texture_lighting; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"IBM_", 4)) { #ifdef GL_IBM_cull_vertex if (_glewStrSame3(&pos, &len, (const GLubyte*)"cull_vertex", 11)) { ret = GLEW_IBM_cull_vertex; continue; } #endif #ifdef GL_IBM_multimode_draw_arrays if (_glewStrSame3(&pos, &len, (const GLubyte*)"multimode_draw_arrays", 21)) { ret = GLEW_IBM_multimode_draw_arrays; continue; } #endif #ifdef GL_IBM_rasterpos_clip if (_glewStrSame3(&pos, &len, (const GLubyte*)"rasterpos_clip", 14)) { ret = GLEW_IBM_rasterpos_clip; continue; } #endif #ifdef GL_IBM_static_data if (_glewStrSame3(&pos, &len, (const GLubyte*)"static_data", 11)) { ret = GLEW_IBM_static_data; continue; } #endif #ifdef GL_IBM_texture_mirrored_repeat if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_mirrored_repeat", 23)) { ret = GLEW_IBM_texture_mirrored_repeat; continue; } #endif #ifdef GL_IBM_vertex_array_lists if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_array_lists", 18)) { ret = GLEW_IBM_vertex_array_lists; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"INGR_", 5)) { #ifdef GL_INGR_color_clamp if (_glewStrSame3(&pos, &len, (const GLubyte*)"color_clamp", 11)) { ret = GLEW_INGR_color_clamp; continue; } #endif #ifdef GL_INGR_interlace_read if (_glewStrSame3(&pos, &len, (const GLubyte*)"interlace_read", 14)) { ret = GLEW_INGR_interlace_read; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"INTEL_", 6)) { #ifdef GL_INTEL_parallel_arrays if (_glewStrSame3(&pos, &len, (const GLubyte*)"parallel_arrays", 15)) { ret = GLEW_INTEL_parallel_arrays; continue; } #endif #ifdef GL_INTEL_texture_scissor if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_scissor", 15)) { ret = GLEW_INTEL_texture_scissor; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"KHR_", 4)) { #ifdef GL_KHR_debug if (_glewStrSame3(&pos, &len, (const GLubyte*)"debug", 5)) { ret = GLEW_KHR_debug; continue; } #endif #ifdef GL_KHR_texture_compression_astc_ldr if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_astc_ldr", 28)) { ret = GLEW_KHR_texture_compression_astc_ldr; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"KTX_", 4)) { #ifdef GL_KTX_buffer_region if (_glewStrSame3(&pos, &len, (const GLubyte*)"buffer_region", 13)) { ret = GLEW_KTX_buffer_region; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"MESAX_", 6)) { #ifdef GL_MESAX_texture_stack if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_stack", 13)) { ret = GLEW_MESAX_texture_stack; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"MESA_", 5)) { #ifdef GL_MESA_pack_invert if (_glewStrSame3(&pos, &len, (const GLubyte*)"pack_invert", 11)) { ret = GLEW_MESA_pack_invert; continue; } #endif #ifdef GL_MESA_resize_buffers if (_glewStrSame3(&pos, &len, (const GLubyte*)"resize_buffers", 14)) { ret = GLEW_MESA_resize_buffers; continue; } #endif #ifdef GL_MESA_window_pos if (_glewStrSame3(&pos, &len, (const GLubyte*)"window_pos", 10)) { ret = GLEW_MESA_window_pos; continue; } #endif #ifdef GL_MESA_ycbcr_texture if (_glewStrSame3(&pos, &len, (const GLubyte*)"ycbcr_texture", 13)) { ret = GLEW_MESA_ycbcr_texture; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"NVX_", 4)) { #ifdef GL_NVX_gpu_memory_info if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_memory_info", 15)) { ret = GLEW_NVX_gpu_memory_info; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"NV_", 3)) { #ifdef GL_NV_bindless_texture if (_glewStrSame3(&pos, &len, (const GLubyte*)"bindless_texture", 16)) { ret = GLEW_NV_bindless_texture; continue; } #endif #ifdef GL_NV_blend_square if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_square", 12)) { ret = GLEW_NV_blend_square; continue; } #endif #ifdef GL_NV_conditional_render if (_glewStrSame3(&pos, &len, (const GLubyte*)"conditional_render", 18)) { ret = GLEW_NV_conditional_render; continue; } #endif #ifdef GL_NV_copy_depth_to_color if (_glewStrSame3(&pos, &len, (const GLubyte*)"copy_depth_to_color", 19)) { ret = GLEW_NV_copy_depth_to_color; continue; } #endif #ifdef GL_NV_copy_image if (_glewStrSame3(&pos, &len, (const GLubyte*)"copy_image", 10)) { ret = GLEW_NV_copy_image; continue; } #endif #ifdef GL_NV_depth_buffer_float if (_glewStrSame3(&pos, &len, (const GLubyte*)"depth_buffer_float", 18)) { ret = GLEW_NV_depth_buffer_float; continue; } #endif #ifdef GL_NV_depth_clamp if (_glewStrSame3(&pos, &len, (const GLubyte*)"depth_clamp", 11)) { ret = GLEW_NV_depth_clamp; continue; } #endif #ifdef GL_NV_depth_range_unclamped if (_glewStrSame3(&pos, &len, (const GLubyte*)"depth_range_unclamped", 21)) { ret = GLEW_NV_depth_range_unclamped; continue; } #endif #ifdef GL_NV_evaluators if (_glewStrSame3(&pos, &len, (const GLubyte*)"evaluators", 10)) { ret = GLEW_NV_evaluators; continue; } #endif #ifdef GL_NV_explicit_multisample if (_glewStrSame3(&pos, &len, (const GLubyte*)"explicit_multisample", 20)) { ret = GLEW_NV_explicit_multisample; continue; } #endif #ifdef GL_NV_fence if (_glewStrSame3(&pos, &len, (const GLubyte*)"fence", 5)) { ret = GLEW_NV_fence; continue; } #endif #ifdef GL_NV_float_buffer if (_glewStrSame3(&pos, &len, (const GLubyte*)"float_buffer", 12)) { ret = GLEW_NV_float_buffer; continue; } #endif #ifdef GL_NV_fog_distance if (_glewStrSame3(&pos, &len, (const GLubyte*)"fog_distance", 12)) { ret = GLEW_NV_fog_distance; continue; } #endif #ifdef GL_NV_fragment_program if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_program", 16)) { ret = GLEW_NV_fragment_program; continue; } #endif #ifdef GL_NV_fragment_program2 if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_program2", 17)) { ret = GLEW_NV_fragment_program2; continue; } #endif #ifdef GL_NV_fragment_program4 if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_program4", 17)) { ret = GLEW_NV_fragment_program4; continue; } #endif #ifdef GL_NV_fragment_program_option if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_program_option", 23)) { ret = GLEW_NV_fragment_program_option; continue; } #endif #ifdef GL_NV_framebuffer_multisample_coverage if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_multisample_coverage", 32)) { ret = GLEW_NV_framebuffer_multisample_coverage; continue; } #endif #ifdef GL_NV_geometry_program4 if (_glewStrSame3(&pos, &len, (const GLubyte*)"geometry_program4", 17)) { ret = GLEW_NV_geometry_program4; continue; } #endif #ifdef GL_NV_geometry_shader4 if (_glewStrSame3(&pos, &len, (const GLubyte*)"geometry_shader4", 16)) { ret = GLEW_NV_geometry_shader4; continue; } #endif #ifdef GL_NV_gpu_program4 if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_program4", 12)) { ret = GLEW_NV_gpu_program4; continue; } #endif #ifdef GL_NV_gpu_program5 if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_program5", 12)) { ret = GLEW_NV_gpu_program5; continue; } #endif #ifdef GL_NV_gpu_program_fp64 if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_program_fp64", 16)) { ret = GLEW_NV_gpu_program_fp64; continue; } #endif #ifdef GL_NV_gpu_shader5 if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_shader5", 11)) { ret = GLEW_NV_gpu_shader5; continue; } #endif #ifdef GL_NV_half_float if (_glewStrSame3(&pos, &len, (const GLubyte*)"half_float", 10)) { ret = GLEW_NV_half_float; continue; } #endif #ifdef GL_NV_light_max_exponent if (_glewStrSame3(&pos, &len, (const GLubyte*)"light_max_exponent", 18)) { ret = GLEW_NV_light_max_exponent; continue; } #endif #ifdef GL_NV_multisample_coverage if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisample_coverage", 20)) { ret = GLEW_NV_multisample_coverage; continue; } #endif #ifdef GL_NV_multisample_filter_hint if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisample_filter_hint", 23)) { ret = GLEW_NV_multisample_filter_hint; continue; } #endif #ifdef GL_NV_occlusion_query if (_glewStrSame3(&pos, &len, (const GLubyte*)"occlusion_query", 15)) { ret = GLEW_NV_occlusion_query; continue; } #endif #ifdef GL_NV_packed_depth_stencil if (_glewStrSame3(&pos, &len, (const GLubyte*)"packed_depth_stencil", 20)) { ret = GLEW_NV_packed_depth_stencil; continue; } #endif #ifdef GL_NV_parameter_buffer_object if (_glewStrSame3(&pos, &len, (const GLubyte*)"parameter_buffer_object", 23)) { ret = GLEW_NV_parameter_buffer_object; continue; } #endif #ifdef GL_NV_parameter_buffer_object2 if (_glewStrSame3(&pos, &len, (const GLubyte*)"parameter_buffer_object2", 24)) { ret = GLEW_NV_parameter_buffer_object2; continue; } #endif #ifdef GL_NV_path_rendering if (_glewStrSame3(&pos, &len, (const GLubyte*)"path_rendering", 14)) { ret = GLEW_NV_path_rendering; continue; } #endif #ifdef GL_NV_pixel_data_range if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_data_range", 16)) { ret = GLEW_NV_pixel_data_range; continue; } #endif #ifdef GL_NV_point_sprite if (_glewStrSame3(&pos, &len, (const GLubyte*)"point_sprite", 12)) { ret = GLEW_NV_point_sprite; continue; } #endif #ifdef GL_NV_present_video if (_glewStrSame3(&pos, &len, (const GLubyte*)"present_video", 13)) { ret = GLEW_NV_present_video; continue; } #endif #ifdef GL_NV_primitive_restart if (_glewStrSame3(&pos, &len, (const GLubyte*)"primitive_restart", 17)) { ret = GLEW_NV_primitive_restart; continue; } #endif #ifdef GL_NV_register_combiners if (_glewStrSame3(&pos, &len, (const GLubyte*)"register_combiners", 18)) { ret = GLEW_NV_register_combiners; continue; } #endif #ifdef GL_NV_register_combiners2 if (_glewStrSame3(&pos, &len, (const GLubyte*)"register_combiners2", 19)) { ret = GLEW_NV_register_combiners2; continue; } #endif #ifdef GL_NV_shader_atomic_float if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_atomic_float", 19)) { ret = GLEW_NV_shader_atomic_float; continue; } #endif #ifdef GL_NV_shader_buffer_load if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_buffer_load", 18)) { ret = GLEW_NV_shader_buffer_load; continue; } #endif #ifdef GL_NV_tessellation_program5 if (_glewStrSame3(&pos, &len, (const GLubyte*)"tessellation_program5", 21)) { ret = GLEW_NV_tessellation_program5; continue; } #endif #ifdef GL_NV_texgen_emboss if (_glewStrSame3(&pos, &len, (const GLubyte*)"texgen_emboss", 13)) { ret = GLEW_NV_texgen_emboss; continue; } #endif #ifdef GL_NV_texgen_reflection if (_glewStrSame3(&pos, &len, (const GLubyte*)"texgen_reflection", 17)) { ret = GLEW_NV_texgen_reflection; continue; } #endif #ifdef GL_NV_texture_barrier if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_barrier", 15)) { ret = GLEW_NV_texture_barrier; continue; } #endif #ifdef GL_NV_texture_compression_vtc if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_vtc", 23)) { ret = GLEW_NV_texture_compression_vtc; continue; } #endif #ifdef GL_NV_texture_env_combine4 if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_env_combine4", 20)) { ret = GLEW_NV_texture_env_combine4; continue; } #endif #ifdef GL_NV_texture_expand_normal if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_expand_normal", 21)) { ret = GLEW_NV_texture_expand_normal; continue; } #endif #ifdef GL_NV_texture_multisample if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_multisample", 19)) { ret = GLEW_NV_texture_multisample; continue; } #endif #ifdef GL_NV_texture_rectangle if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_rectangle", 17)) { ret = GLEW_NV_texture_rectangle; continue; } #endif #ifdef GL_NV_texture_shader if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_shader", 14)) { ret = GLEW_NV_texture_shader; continue; } #endif #ifdef GL_NV_texture_shader2 if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_shader2", 15)) { ret = GLEW_NV_texture_shader2; continue; } #endif #ifdef GL_NV_texture_shader3 if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_shader3", 15)) { ret = GLEW_NV_texture_shader3; continue; } #endif #ifdef GL_NV_transform_feedback if (_glewStrSame3(&pos, &len, (const GLubyte*)"transform_feedback", 18)) { ret = GLEW_NV_transform_feedback; continue; } #endif #ifdef GL_NV_transform_feedback2 if (_glewStrSame3(&pos, &len, (const GLubyte*)"transform_feedback2", 19)) { ret = GLEW_NV_transform_feedback2; continue; } #endif #ifdef GL_NV_vdpau_interop if (_glewStrSame3(&pos, &len, (const GLubyte*)"vdpau_interop", 13)) { ret = GLEW_NV_vdpau_interop; continue; } #endif #ifdef GL_NV_vertex_array_range if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_array_range", 18)) { ret = GLEW_NV_vertex_array_range; continue; } #endif #ifdef GL_NV_vertex_array_range2 if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_array_range2", 19)) { ret = GLEW_NV_vertex_array_range2; continue; } #endif #ifdef GL_NV_vertex_attrib_integer_64bit if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_attrib_integer_64bit", 27)) { ret = GLEW_NV_vertex_attrib_integer_64bit; continue; } #endif #ifdef GL_NV_vertex_buffer_unified_memory if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_buffer_unified_memory", 28)) { ret = GLEW_NV_vertex_buffer_unified_memory; continue; } #endif #ifdef GL_NV_vertex_program if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_program", 14)) { ret = GLEW_NV_vertex_program; continue; } #endif #ifdef GL_NV_vertex_program1_1 if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_program1_1", 17)) { ret = GLEW_NV_vertex_program1_1; continue; } #endif #ifdef GL_NV_vertex_program2 if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_program2", 15)) { ret = GLEW_NV_vertex_program2; continue; } #endif #ifdef GL_NV_vertex_program2_option if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_program2_option", 22)) { ret = GLEW_NV_vertex_program2_option; continue; } #endif #ifdef GL_NV_vertex_program3 if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_program3", 15)) { ret = GLEW_NV_vertex_program3; continue; } #endif #ifdef GL_NV_vertex_program4 if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_program4", 15)) { ret = GLEW_NV_vertex_program4; continue; } #endif #ifdef GL_NV_video_capture if (_glewStrSame3(&pos, &len, (const GLubyte*)"video_capture", 13)) { ret = GLEW_NV_video_capture; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"OES_", 4)) { #ifdef GL_OES_byte_coordinates if (_glewStrSame3(&pos, &len, (const GLubyte*)"byte_coordinates", 16)) { ret = GLEW_OES_byte_coordinates; continue; } #endif #ifdef GL_OES_compressed_paletted_texture if (_glewStrSame3(&pos, &len, (const GLubyte*)"compressed_paletted_texture", 27)) { ret = GLEW_OES_compressed_paletted_texture; continue; } #endif #ifdef GL_OES_read_format if (_glewStrSame3(&pos, &len, (const GLubyte*)"read_format", 11)) { ret = GLEW_OES_read_format; continue; } #endif #ifdef GL_OES_single_precision if (_glewStrSame3(&pos, &len, (const GLubyte*)"single_precision", 16)) { ret = GLEW_OES_single_precision; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"OML_", 4)) { #ifdef GL_OML_interlace if (_glewStrSame3(&pos, &len, (const GLubyte*)"interlace", 9)) { ret = GLEW_OML_interlace; continue; } #endif #ifdef GL_OML_resample if (_glewStrSame3(&pos, &len, (const GLubyte*)"resample", 8)) { ret = GLEW_OML_resample; continue; } #endif #ifdef GL_OML_subsample if (_glewStrSame3(&pos, &len, (const GLubyte*)"subsample", 9)) { ret = GLEW_OML_subsample; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"PGI_", 4)) { #ifdef GL_PGI_misc_hints if (_glewStrSame3(&pos, &len, (const GLubyte*)"misc_hints", 10)) { ret = GLEW_PGI_misc_hints; continue; } #endif #ifdef GL_PGI_vertex_hints if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_hints", 12)) { ret = GLEW_PGI_vertex_hints; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"REGAL_", 6)) { #ifdef GL_REGAL_error_string if (_glewStrSame3(&pos, &len, (const GLubyte*)"error_string", 12)) { ret = GLEW_REGAL_error_string; continue; } #endif #ifdef GL_REGAL_extension_query if (_glewStrSame3(&pos, &len, (const GLubyte*)"extension_query", 15)) { ret = GLEW_REGAL_extension_query; continue; } #endif #ifdef GL_REGAL_log if (_glewStrSame3(&pos, &len, (const GLubyte*)"log", 3)) { ret = GLEW_REGAL_log; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"REND_", 5)) { #ifdef GL_REND_screen_coordinates if (_glewStrSame3(&pos, &len, (const GLubyte*)"screen_coordinates", 18)) { ret = GLEW_REND_screen_coordinates; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"S3_", 3)) { #ifdef GL_S3_s3tc if (_glewStrSame3(&pos, &len, (const GLubyte*)"s3tc", 4)) { ret = GLEW_S3_s3tc; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"SGIS_", 5)) { #ifdef GL_SGIS_color_range if (_glewStrSame3(&pos, &len, (const GLubyte*)"color_range", 11)) { ret = GLEW_SGIS_color_range; continue; } #endif #ifdef GL_SGIS_detail_texture if (_glewStrSame3(&pos, &len, (const GLubyte*)"detail_texture", 14)) { ret = GLEW_SGIS_detail_texture; continue; } #endif #ifdef GL_SGIS_fog_function if (_glewStrSame3(&pos, &len, (const GLubyte*)"fog_function", 12)) { ret = GLEW_SGIS_fog_function; continue; } #endif #ifdef GL_SGIS_generate_mipmap if (_glewStrSame3(&pos, &len, (const GLubyte*)"generate_mipmap", 15)) { ret = GLEW_SGIS_generate_mipmap; continue; } #endif #ifdef GL_SGIS_multisample if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisample", 11)) { ret = GLEW_SGIS_multisample; continue; } #endif #ifdef GL_SGIS_pixel_texture if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_texture", 13)) { ret = GLEW_SGIS_pixel_texture; continue; } #endif #ifdef GL_SGIS_point_line_texgen if (_glewStrSame3(&pos, &len, (const GLubyte*)"point_line_texgen", 17)) { ret = GLEW_SGIS_point_line_texgen; continue; } #endif #ifdef GL_SGIS_sharpen_texture if (_glewStrSame3(&pos, &len, (const GLubyte*)"sharpen_texture", 15)) { ret = GLEW_SGIS_sharpen_texture; continue; } #endif #ifdef GL_SGIS_texture4D if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture4D", 9)) { ret = GLEW_SGIS_texture4D; continue; } #endif #ifdef GL_SGIS_texture_border_clamp if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_border_clamp", 20)) { ret = GLEW_SGIS_texture_border_clamp; continue; } #endif #ifdef GL_SGIS_texture_edge_clamp if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_edge_clamp", 18)) { ret = GLEW_SGIS_texture_edge_clamp; continue; } #endif #ifdef GL_SGIS_texture_filter4 if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_filter4", 15)) { ret = GLEW_SGIS_texture_filter4; continue; } #endif #ifdef GL_SGIS_texture_lod if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_lod", 11)) { ret = GLEW_SGIS_texture_lod; continue; } #endif #ifdef GL_SGIS_texture_select if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_select", 14)) { ret = GLEW_SGIS_texture_select; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"SGIX_", 5)) { #ifdef GL_SGIX_async if (_glewStrSame3(&pos, &len, (const GLubyte*)"async", 5)) { ret = GLEW_SGIX_async; continue; } #endif #ifdef GL_SGIX_async_histogram if (_glewStrSame3(&pos, &len, (const GLubyte*)"async_histogram", 15)) { ret = GLEW_SGIX_async_histogram; continue; } #endif #ifdef GL_SGIX_async_pixel if (_glewStrSame3(&pos, &len, (const GLubyte*)"async_pixel", 11)) { ret = GLEW_SGIX_async_pixel; continue; } #endif #ifdef GL_SGIX_blend_alpha_minmax if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_alpha_minmax", 18)) { ret = GLEW_SGIX_blend_alpha_minmax; continue; } #endif #ifdef GL_SGIX_clipmap if (_glewStrSame3(&pos, &len, (const GLubyte*)"clipmap", 7)) { ret = GLEW_SGIX_clipmap; continue; } #endif #ifdef GL_SGIX_convolution_accuracy if (_glewStrSame3(&pos, &len, (const GLubyte*)"convolution_accuracy", 20)) { ret = GLEW_SGIX_convolution_accuracy; continue; } #endif #ifdef GL_SGIX_depth_texture if (_glewStrSame3(&pos, &len, (const GLubyte*)"depth_texture", 13)) { ret = GLEW_SGIX_depth_texture; continue; } #endif #ifdef GL_SGIX_flush_raster if (_glewStrSame3(&pos, &len, (const GLubyte*)"flush_raster", 12)) { ret = GLEW_SGIX_flush_raster; continue; } #endif #ifdef GL_SGIX_fog_offset if (_glewStrSame3(&pos, &len, (const GLubyte*)"fog_offset", 10)) { ret = GLEW_SGIX_fog_offset; continue; } #endif #ifdef GL_SGIX_fog_texture if (_glewStrSame3(&pos, &len, (const GLubyte*)"fog_texture", 11)) { ret = GLEW_SGIX_fog_texture; continue; } #endif #ifdef GL_SGIX_fragment_specular_lighting if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_specular_lighting", 26)) { ret = GLEW_SGIX_fragment_specular_lighting; continue; } #endif #ifdef GL_SGIX_framezoom if (_glewStrSame3(&pos, &len, (const GLubyte*)"framezoom", 9)) { ret = GLEW_SGIX_framezoom; continue; } #endif #ifdef GL_SGIX_interlace if (_glewStrSame3(&pos, &len, (const GLubyte*)"interlace", 9)) { ret = GLEW_SGIX_interlace; continue; } #endif #ifdef GL_SGIX_ir_instrument1 if (_glewStrSame3(&pos, &len, (const GLubyte*)"ir_instrument1", 14)) { ret = GLEW_SGIX_ir_instrument1; continue; } #endif #ifdef GL_SGIX_list_priority if (_glewStrSame3(&pos, &len, (const GLubyte*)"list_priority", 13)) { ret = GLEW_SGIX_list_priority; continue; } #endif #ifdef GL_SGIX_pixel_texture if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_texture", 13)) { ret = GLEW_SGIX_pixel_texture; continue; } #endif #ifdef GL_SGIX_pixel_texture_bits if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_texture_bits", 18)) { ret = GLEW_SGIX_pixel_texture_bits; continue; } #endif #ifdef GL_SGIX_reference_plane if (_glewStrSame3(&pos, &len, (const GLubyte*)"reference_plane", 15)) { ret = GLEW_SGIX_reference_plane; continue; } #endif #ifdef GL_SGIX_resample if (_glewStrSame3(&pos, &len, (const GLubyte*)"resample", 8)) { ret = GLEW_SGIX_resample; continue; } #endif #ifdef GL_SGIX_shadow if (_glewStrSame3(&pos, &len, (const GLubyte*)"shadow", 6)) { ret = GLEW_SGIX_shadow; continue; } #endif #ifdef GL_SGIX_shadow_ambient if (_glewStrSame3(&pos, &len, (const GLubyte*)"shadow_ambient", 14)) { ret = GLEW_SGIX_shadow_ambient; continue; } #endif #ifdef GL_SGIX_sprite if (_glewStrSame3(&pos, &len, (const GLubyte*)"sprite", 6)) { ret = GLEW_SGIX_sprite; continue; } #endif #ifdef GL_SGIX_tag_sample_buffer if (_glewStrSame3(&pos, &len, (const GLubyte*)"tag_sample_buffer", 17)) { ret = GLEW_SGIX_tag_sample_buffer; continue; } #endif #ifdef GL_SGIX_texture_add_env if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_add_env", 15)) { ret = GLEW_SGIX_texture_add_env; continue; } #endif #ifdef GL_SGIX_texture_coordinate_clamp if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_coordinate_clamp", 24)) { ret = GLEW_SGIX_texture_coordinate_clamp; continue; } #endif #ifdef GL_SGIX_texture_lod_bias if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_lod_bias", 16)) { ret = GLEW_SGIX_texture_lod_bias; continue; } #endif #ifdef GL_SGIX_texture_multi_buffer if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_multi_buffer", 20)) { ret = GLEW_SGIX_texture_multi_buffer; continue; } #endif #ifdef GL_SGIX_texture_range if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_range", 13)) { ret = GLEW_SGIX_texture_range; continue; } #endif #ifdef GL_SGIX_texture_scale_bias if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_scale_bias", 18)) { ret = GLEW_SGIX_texture_scale_bias; continue; } #endif #ifdef GL_SGIX_vertex_preclip if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_preclip", 14)) { ret = GLEW_SGIX_vertex_preclip; continue; } #endif #ifdef GL_SGIX_vertex_preclip_hint if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_preclip_hint", 19)) { ret = GLEW_SGIX_vertex_preclip_hint; continue; } #endif #ifdef GL_SGIX_ycrcb if (_glewStrSame3(&pos, &len, (const GLubyte*)"ycrcb", 5)) { ret = GLEW_SGIX_ycrcb; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"SGI_", 4)) { #ifdef GL_SGI_color_matrix if (_glewStrSame3(&pos, &len, (const GLubyte*)"color_matrix", 12)) { ret = GLEW_SGI_color_matrix; continue; } #endif #ifdef GL_SGI_color_table if (_glewStrSame3(&pos, &len, (const GLubyte*)"color_table", 11)) { ret = GLEW_SGI_color_table; continue; } #endif #ifdef GL_SGI_texture_color_table if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_color_table", 19)) { ret = GLEW_SGI_texture_color_table; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"SUNX_", 5)) { #ifdef GL_SUNX_constant_data if (_glewStrSame3(&pos, &len, (const GLubyte*)"constant_data", 13)) { ret = GLEW_SUNX_constant_data; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"SUN_", 4)) { #ifdef GL_SUN_convolution_border_modes if (_glewStrSame3(&pos, &len, (const GLubyte*)"convolution_border_modes", 24)) { ret = GLEW_SUN_convolution_border_modes; continue; } #endif #ifdef GL_SUN_global_alpha if (_glewStrSame3(&pos, &len, (const GLubyte*)"global_alpha", 12)) { ret = GLEW_SUN_global_alpha; continue; } #endif #ifdef GL_SUN_mesh_array if (_glewStrSame3(&pos, &len, (const GLubyte*)"mesh_array", 10)) { ret = GLEW_SUN_mesh_array; continue; } #endif #ifdef GL_SUN_read_video_pixels if (_glewStrSame3(&pos, &len, (const GLubyte*)"read_video_pixels", 17)) { ret = GLEW_SUN_read_video_pixels; continue; } #endif #ifdef GL_SUN_slice_accum if (_glewStrSame3(&pos, &len, (const GLubyte*)"slice_accum", 11)) { ret = GLEW_SUN_slice_accum; continue; } #endif #ifdef GL_SUN_triangle_list if (_glewStrSame3(&pos, &len, (const GLubyte*)"triangle_list", 13)) { ret = GLEW_SUN_triangle_list; continue; } #endif #ifdef GL_SUN_vertex if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex", 6)) { ret = GLEW_SUN_vertex; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"WIN_", 4)) { #ifdef GL_WIN_phong_shading if (_glewStrSame3(&pos, &len, (const GLubyte*)"phong_shading", 13)) { ret = GLEW_WIN_phong_shading; continue; } #endif #ifdef GL_WIN_specular_fog if (_glewStrSame3(&pos, &len, (const GLubyte*)"specular_fog", 12)) { ret = GLEW_WIN_specular_fog; continue; } #endif #ifdef GL_WIN_swap_hint if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_hint", 9)) { ret = GLEW_WIN_swap_hint; continue; } #endif } } ret = (len == 0); } return ret; } #if defined(_WIN32) #if defined(GLEW_MX) GLboolean GLEWAPIENTRY wglewContextIsSupported (const WGLEWContext* ctx, const char* name) #else GLboolean GLEWAPIENTRY wglewIsSupported (const char* name) #endif { GLubyte* pos = (GLubyte*)name; GLuint len = _glewStrLen(pos); GLboolean ret = GL_TRUE; while (ret && len > 0) { if (_glewStrSame1(&pos, &len, (const GLubyte*)"WGL_", 4)) { if (_glewStrSame2(&pos, &len, (const GLubyte*)"3DFX_", 5)) { #ifdef WGL_3DFX_multisample if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisample", 11)) { ret = WGLEW_3DFX_multisample; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"3DL_", 4)) { #ifdef WGL_3DL_stereo_control if (_glewStrSame3(&pos, &len, (const GLubyte*)"stereo_control", 14)) { ret = WGLEW_3DL_stereo_control; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"AMD_", 4)) { #ifdef WGL_AMD_gpu_association if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_association", 15)) { ret = WGLEW_AMD_gpu_association; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"ARB_", 4)) { #ifdef WGL_ARB_buffer_region if (_glewStrSame3(&pos, &len, (const GLubyte*)"buffer_region", 13)) { ret = WGLEW_ARB_buffer_region; continue; } #endif #ifdef WGL_ARB_create_context if (_glewStrSame3(&pos, &len, (const GLubyte*)"create_context", 14)) { ret = WGLEW_ARB_create_context; continue; } #endif #ifdef WGL_ARB_create_context_profile if (_glewStrSame3(&pos, &len, (const GLubyte*)"create_context_profile", 22)) { ret = WGLEW_ARB_create_context_profile; continue; } #endif #ifdef WGL_ARB_create_context_robustness if (_glewStrSame3(&pos, &len, (const GLubyte*)"create_context_robustness", 25)) { ret = WGLEW_ARB_create_context_robustness; continue; } #endif #ifdef WGL_ARB_extensions_string if (_glewStrSame3(&pos, &len, (const GLubyte*)"extensions_string", 17)) { ret = WGLEW_ARB_extensions_string; continue; } #endif #ifdef WGL_ARB_framebuffer_sRGB if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_sRGB", 16)) { ret = WGLEW_ARB_framebuffer_sRGB; continue; } #endif #ifdef WGL_ARB_make_current_read if (_glewStrSame3(&pos, &len, (const GLubyte*)"make_current_read", 17)) { ret = WGLEW_ARB_make_current_read; continue; } #endif #ifdef WGL_ARB_multisample if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisample", 11)) { ret = WGLEW_ARB_multisample; continue; } #endif #ifdef WGL_ARB_pbuffer if (_glewStrSame3(&pos, &len, (const GLubyte*)"pbuffer", 7)) { ret = WGLEW_ARB_pbuffer; continue; } #endif #ifdef WGL_ARB_pixel_format if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_format", 12)) { ret = WGLEW_ARB_pixel_format; continue; } #endif #ifdef WGL_ARB_pixel_format_float if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_format_float", 18)) { ret = WGLEW_ARB_pixel_format_float; continue; } #endif #ifdef WGL_ARB_render_texture if (_glewStrSame3(&pos, &len, (const GLubyte*)"render_texture", 14)) { ret = WGLEW_ARB_render_texture; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"ATI_", 4)) { #ifdef WGL_ATI_pixel_format_float if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_format_float", 18)) { ret = WGLEW_ATI_pixel_format_float; continue; } #endif #ifdef WGL_ATI_render_texture_rectangle if (_glewStrSame3(&pos, &len, (const GLubyte*)"render_texture_rectangle", 24)) { ret = WGLEW_ATI_render_texture_rectangle; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"EXT_", 4)) { #ifdef WGL_EXT_create_context_es2_profile if (_glewStrSame3(&pos, &len, (const GLubyte*)"create_context_es2_profile", 26)) { ret = WGLEW_EXT_create_context_es2_profile; continue; } #endif #ifdef WGL_EXT_create_context_es_profile if (_glewStrSame3(&pos, &len, (const GLubyte*)"create_context_es_profile", 25)) { ret = WGLEW_EXT_create_context_es_profile; continue; } #endif #ifdef WGL_EXT_depth_float if (_glewStrSame3(&pos, &len, (const GLubyte*)"depth_float", 11)) { ret = WGLEW_EXT_depth_float; continue; } #endif #ifdef WGL_EXT_display_color_table if (_glewStrSame3(&pos, &len, (const GLubyte*)"display_color_table", 19)) { ret = WGLEW_EXT_display_color_table; continue; } #endif #ifdef WGL_EXT_extensions_string if (_glewStrSame3(&pos, &len, (const GLubyte*)"extensions_string", 17)) { ret = WGLEW_EXT_extensions_string; continue; } #endif #ifdef WGL_EXT_framebuffer_sRGB if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_sRGB", 16)) { ret = WGLEW_EXT_framebuffer_sRGB; continue; } #endif #ifdef WGL_EXT_make_current_read if (_glewStrSame3(&pos, &len, (const GLubyte*)"make_current_read", 17)) { ret = WGLEW_EXT_make_current_read; continue; } #endif #ifdef WGL_EXT_multisample if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisample", 11)) { ret = WGLEW_EXT_multisample; continue; } #endif #ifdef WGL_EXT_pbuffer if (_glewStrSame3(&pos, &len, (const GLubyte*)"pbuffer", 7)) { ret = WGLEW_EXT_pbuffer; continue; } #endif #ifdef WGL_EXT_pixel_format if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_format", 12)) { ret = WGLEW_EXT_pixel_format; continue; } #endif #ifdef WGL_EXT_pixel_format_packed_float if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_format_packed_float", 25)) { ret = WGLEW_EXT_pixel_format_packed_float; continue; } #endif #ifdef WGL_EXT_swap_control if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_control", 12)) { ret = WGLEW_EXT_swap_control; continue; } #endif #ifdef WGL_EXT_swap_control_tear if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_control_tear", 17)) { ret = WGLEW_EXT_swap_control_tear; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"I3D_", 4)) { #ifdef WGL_I3D_digital_video_control if (_glewStrSame3(&pos, &len, (const GLubyte*)"digital_video_control", 21)) { ret = WGLEW_I3D_digital_video_control; continue; } #endif #ifdef WGL_I3D_gamma if (_glewStrSame3(&pos, &len, (const GLubyte*)"gamma", 5)) { ret = WGLEW_I3D_gamma; continue; } #endif #ifdef WGL_I3D_genlock if (_glewStrSame3(&pos, &len, (const GLubyte*)"genlock", 7)) { ret = WGLEW_I3D_genlock; continue; } #endif #ifdef WGL_I3D_image_buffer if (_glewStrSame3(&pos, &len, (const GLubyte*)"image_buffer", 12)) { ret = WGLEW_I3D_image_buffer; continue; } #endif #ifdef WGL_I3D_swap_frame_lock if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_frame_lock", 15)) { ret = WGLEW_I3D_swap_frame_lock; continue; } #endif #ifdef WGL_I3D_swap_frame_usage if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_frame_usage", 16)) { ret = WGLEW_I3D_swap_frame_usage; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"NV_", 3)) { #ifdef WGL_NV_DX_interop if (_glewStrSame3(&pos, &len, (const GLubyte*)"DX_interop", 10)) { ret = WGLEW_NV_DX_interop; continue; } #endif #ifdef WGL_NV_DX_interop2 if (_glewStrSame3(&pos, &len, (const GLubyte*)"DX_interop2", 11)) { ret = WGLEW_NV_DX_interop2; continue; } #endif #ifdef WGL_NV_copy_image if (_glewStrSame3(&pos, &len, (const GLubyte*)"copy_image", 10)) { ret = WGLEW_NV_copy_image; continue; } #endif #ifdef WGL_NV_float_buffer if (_glewStrSame3(&pos, &len, (const GLubyte*)"float_buffer", 12)) { ret = WGLEW_NV_float_buffer; continue; } #endif #ifdef WGL_NV_gpu_affinity if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_affinity", 12)) { ret = WGLEW_NV_gpu_affinity; continue; } #endif #ifdef WGL_NV_multisample_coverage if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisample_coverage", 20)) { ret = WGLEW_NV_multisample_coverage; continue; } #endif #ifdef WGL_NV_present_video if (_glewStrSame3(&pos, &len, (const GLubyte*)"present_video", 13)) { ret = WGLEW_NV_present_video; continue; } #endif #ifdef WGL_NV_render_depth_texture if (_glewStrSame3(&pos, &len, (const GLubyte*)"render_depth_texture", 20)) { ret = WGLEW_NV_render_depth_texture; continue; } #endif #ifdef WGL_NV_render_texture_rectangle if (_glewStrSame3(&pos, &len, (const GLubyte*)"render_texture_rectangle", 24)) { ret = WGLEW_NV_render_texture_rectangle; continue; } #endif #ifdef WGL_NV_swap_group if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_group", 10)) { ret = WGLEW_NV_swap_group; continue; } #endif #ifdef WGL_NV_vertex_array_range if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_array_range", 18)) { ret = WGLEW_NV_vertex_array_range; continue; } #endif #ifdef WGL_NV_video_capture if (_glewStrSame3(&pos, &len, (const GLubyte*)"video_capture", 13)) { ret = WGLEW_NV_video_capture; continue; } #endif #ifdef WGL_NV_video_output if (_glewStrSame3(&pos, &len, (const GLubyte*)"video_output", 12)) { ret = WGLEW_NV_video_output; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"OML_", 4)) { #ifdef WGL_OML_sync_control if (_glewStrSame3(&pos, &len, (const GLubyte*)"sync_control", 12)) { ret = WGLEW_OML_sync_control; continue; } #endif } } ret = (len == 0); } return ret; } #elif !defined(__ANDROID__) && !defined(__APPLE__) || defined(GLEW_APPLE_GLX) #if defined(GLEW_MX) GLboolean glxewContextIsSupported (const GLXEWContext* ctx, const char* name) #else GLboolean glxewIsSupported (const char* name) #endif { GLubyte* pos = (GLubyte*)name; GLuint len = _glewStrLen(pos); GLboolean ret = GL_TRUE; while (ret && len > 0) { if(_glewStrSame1(&pos, &len, (const GLubyte*)"GLX_", 4)) { if (_glewStrSame2(&pos, &len, (const GLubyte*)"VERSION_", 8)) { #ifdef GLX_VERSION_1_2 if (_glewStrSame3(&pos, &len, (const GLubyte*)"1_2", 3)) { ret = GLXEW_VERSION_1_2; continue; } #endif #ifdef GLX_VERSION_1_3 if (_glewStrSame3(&pos, &len, (const GLubyte*)"1_3", 3)) { ret = GLXEW_VERSION_1_3; continue; } #endif #ifdef GLX_VERSION_1_4 if (_glewStrSame3(&pos, &len, (const GLubyte*)"1_4", 3)) { ret = GLXEW_VERSION_1_4; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"3DFX_", 5)) { #ifdef GLX_3DFX_multisample if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisample", 11)) { ret = GLXEW_3DFX_multisample; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"AMD_", 4)) { #ifdef GLX_AMD_gpu_association if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_association", 15)) { ret = GLXEW_AMD_gpu_association; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"ARB_", 4)) { #ifdef GLX_ARB_create_context if (_glewStrSame3(&pos, &len, (const GLubyte*)"create_context", 14)) { ret = GLXEW_ARB_create_context; continue; } #endif #ifdef GLX_ARB_create_context_profile if (_glewStrSame3(&pos, &len, (const GLubyte*)"create_context_profile", 22)) { ret = GLXEW_ARB_create_context_profile; continue; } #endif #ifdef GLX_ARB_create_context_robustness if (_glewStrSame3(&pos, &len, (const GLubyte*)"create_context_robustness", 25)) { ret = GLXEW_ARB_create_context_robustness; continue; } #endif #ifdef GLX_ARB_fbconfig_float if (_glewStrSame3(&pos, &len, (const GLubyte*)"fbconfig_float", 14)) { ret = GLXEW_ARB_fbconfig_float; continue; } #endif #ifdef GLX_ARB_framebuffer_sRGB if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_sRGB", 16)) { ret = GLXEW_ARB_framebuffer_sRGB; continue; } #endif #ifdef GLX_ARB_get_proc_address if (_glewStrSame3(&pos, &len, (const GLubyte*)"get_proc_address", 16)) { ret = GLXEW_ARB_get_proc_address; continue; } #endif #ifdef GLX_ARB_multisample if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisample", 11)) { ret = GLXEW_ARB_multisample; continue; } #endif #ifdef GLX_ARB_robustness_application_isolation if (_glewStrSame3(&pos, &len, (const GLubyte*)"robustness_application_isolation", 32)) { ret = GLXEW_ARB_robustness_application_isolation; continue; } #endif #ifdef GLX_ARB_robustness_share_group_isolation if (_glewStrSame3(&pos, &len, (const GLubyte*)"robustness_share_group_isolation", 32)) { ret = GLXEW_ARB_robustness_share_group_isolation; continue; } #endif #ifdef GLX_ARB_vertex_buffer_object if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_buffer_object", 20)) { ret = GLXEW_ARB_vertex_buffer_object; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"ATI_", 4)) { #ifdef GLX_ATI_pixel_format_float if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_format_float", 18)) { ret = GLXEW_ATI_pixel_format_float; continue; } #endif #ifdef GLX_ATI_render_texture if (_glewStrSame3(&pos, &len, (const GLubyte*)"render_texture", 14)) { ret = GLXEW_ATI_render_texture; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"EXT_", 4)) { #ifdef GLX_EXT_create_context_es2_profile if (_glewStrSame3(&pos, &len, (const GLubyte*)"create_context_es2_profile", 26)) { ret = GLXEW_EXT_create_context_es2_profile; continue; } #endif #ifdef GLX_EXT_create_context_es_profile if (_glewStrSame3(&pos, &len, (const GLubyte*)"create_context_es_profile", 25)) { ret = GLXEW_EXT_create_context_es_profile; continue; } #endif #ifdef GLX_EXT_fbconfig_packed_float if (_glewStrSame3(&pos, &len, (const GLubyte*)"fbconfig_packed_float", 21)) { ret = GLXEW_EXT_fbconfig_packed_float; continue; } #endif #ifdef GLX_EXT_framebuffer_sRGB if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_sRGB", 16)) { ret = GLXEW_EXT_framebuffer_sRGB; continue; } #endif #ifdef GLX_EXT_import_context if (_glewStrSame3(&pos, &len, (const GLubyte*)"import_context", 14)) { ret = GLXEW_EXT_import_context; continue; } #endif #ifdef GLX_EXT_scene_marker if (_glewStrSame3(&pos, &len, (const GLubyte*)"scene_marker", 12)) { ret = GLXEW_EXT_scene_marker; continue; } #endif #ifdef GLX_EXT_swap_control if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_control", 12)) { ret = GLXEW_EXT_swap_control; continue; } #endif #ifdef GLX_EXT_swap_control_tear if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_control_tear", 17)) { ret = GLXEW_EXT_swap_control_tear; continue; } #endif #ifdef GLX_EXT_texture_from_pixmap if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_from_pixmap", 19)) { ret = GLXEW_EXT_texture_from_pixmap; continue; } #endif #ifdef GLX_EXT_visual_info if (_glewStrSame3(&pos, &len, (const GLubyte*)"visual_info", 11)) { ret = GLXEW_EXT_visual_info; continue; } #endif #ifdef GLX_EXT_visual_rating if (_glewStrSame3(&pos, &len, (const GLubyte*)"visual_rating", 13)) { ret = GLXEW_EXT_visual_rating; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"INTEL_", 6)) { #ifdef GLX_INTEL_swap_event if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_event", 10)) { ret = GLXEW_INTEL_swap_event; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"MESA_", 5)) { #ifdef GLX_MESA_agp_offset if (_glewStrSame3(&pos, &len, (const GLubyte*)"agp_offset", 10)) { ret = GLXEW_MESA_agp_offset; continue; } #endif #ifdef GLX_MESA_copy_sub_buffer if (_glewStrSame3(&pos, &len, (const GLubyte*)"copy_sub_buffer", 15)) { ret = GLXEW_MESA_copy_sub_buffer; continue; } #endif #ifdef GLX_MESA_pixmap_colormap if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixmap_colormap", 15)) { ret = GLXEW_MESA_pixmap_colormap; continue; } #endif #ifdef GLX_MESA_release_buffers if (_glewStrSame3(&pos, &len, (const GLubyte*)"release_buffers", 15)) { ret = GLXEW_MESA_release_buffers; continue; } #endif #ifdef GLX_MESA_set_3dfx_mode if (_glewStrSame3(&pos, &len, (const GLubyte*)"set_3dfx_mode", 13)) { ret = GLXEW_MESA_set_3dfx_mode; continue; } #endif #ifdef GLX_MESA_swap_control if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_control", 12)) { ret = GLXEW_MESA_swap_control; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"NV_", 3)) { #ifdef GLX_NV_copy_image if (_glewStrSame3(&pos, &len, (const GLubyte*)"copy_image", 10)) { ret = GLXEW_NV_copy_image; continue; } #endif #ifdef GLX_NV_float_buffer if (_glewStrSame3(&pos, &len, (const GLubyte*)"float_buffer", 12)) { ret = GLXEW_NV_float_buffer; continue; } #endif #ifdef GLX_NV_multisample_coverage if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisample_coverage", 20)) { ret = GLXEW_NV_multisample_coverage; continue; } #endif #ifdef GLX_NV_present_video if (_glewStrSame3(&pos, &len, (const GLubyte*)"present_video", 13)) { ret = GLXEW_NV_present_video; continue; } #endif #ifdef GLX_NV_swap_group if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_group", 10)) { ret = GLXEW_NV_swap_group; continue; } #endif #ifdef GLX_NV_vertex_array_range if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_array_range", 18)) { ret = GLXEW_NV_vertex_array_range; continue; } #endif #ifdef GLX_NV_video_capture if (_glewStrSame3(&pos, &len, (const GLubyte*)"video_capture", 13)) { ret = GLXEW_NV_video_capture; continue; } #endif #ifdef GLX_NV_video_out if (_glewStrSame3(&pos, &len, (const GLubyte*)"video_out", 9)) { ret = GLXEW_NV_video_out; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"OML_", 4)) { #ifdef GLX_OML_swap_method if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_method", 11)) { ret = GLXEW_OML_swap_method; continue; } #endif #ifdef GLX_OML_sync_control if (_glewStrSame3(&pos, &len, (const GLubyte*)"sync_control", 12)) { ret = GLXEW_OML_sync_control; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"SGIS_", 5)) { #ifdef GLX_SGIS_blended_overlay if (_glewStrSame3(&pos, &len, (const GLubyte*)"blended_overlay", 15)) { ret = GLXEW_SGIS_blended_overlay; continue; } #endif #ifdef GLX_SGIS_color_range if (_glewStrSame3(&pos, &len, (const GLubyte*)"color_range", 11)) { ret = GLXEW_SGIS_color_range; continue; } #endif #ifdef GLX_SGIS_multisample if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisample", 11)) { ret = GLXEW_SGIS_multisample; continue; } #endif #ifdef GLX_SGIS_shared_multisample if (_glewStrSame3(&pos, &len, (const GLubyte*)"shared_multisample", 18)) { ret = GLXEW_SGIS_shared_multisample; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"SGIX_", 5)) { #ifdef GLX_SGIX_fbconfig if (_glewStrSame3(&pos, &len, (const GLubyte*)"fbconfig", 8)) { ret = GLXEW_SGIX_fbconfig; continue; } #endif #ifdef GLX_SGIX_hyperpipe if (_glewStrSame3(&pos, &len, (const GLubyte*)"hyperpipe", 9)) { ret = GLXEW_SGIX_hyperpipe; continue; } #endif #ifdef GLX_SGIX_pbuffer if (_glewStrSame3(&pos, &len, (const GLubyte*)"pbuffer", 7)) { ret = GLXEW_SGIX_pbuffer; continue; } #endif #ifdef GLX_SGIX_swap_barrier if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_barrier", 12)) { ret = GLXEW_SGIX_swap_barrier; continue; } #endif #ifdef GLX_SGIX_swap_group if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_group", 10)) { ret = GLXEW_SGIX_swap_group; continue; } #endif #ifdef GLX_SGIX_video_resize if (_glewStrSame3(&pos, &len, (const GLubyte*)"video_resize", 12)) { ret = GLXEW_SGIX_video_resize; continue; } #endif #ifdef GLX_SGIX_visual_select_group if (_glewStrSame3(&pos, &len, (const GLubyte*)"visual_select_group", 19)) { ret = GLXEW_SGIX_visual_select_group; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"SGI_", 4)) { #ifdef GLX_SGI_cushion if (_glewStrSame3(&pos, &len, (const GLubyte*)"cushion", 7)) { ret = GLXEW_SGI_cushion; continue; } #endif #ifdef GLX_SGI_make_current_read if (_glewStrSame3(&pos, &len, (const GLubyte*)"make_current_read", 17)) { ret = GLXEW_SGI_make_current_read; continue; } #endif #ifdef GLX_SGI_swap_control if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_control", 12)) { ret = GLXEW_SGI_swap_control; continue; } #endif #ifdef GLX_SGI_video_sync if (_glewStrSame3(&pos, &len, (const GLubyte*)"video_sync", 10)) { ret = GLXEW_SGI_video_sync; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"SUN_", 4)) { #ifdef GLX_SUN_get_transparent_index if (_glewStrSame3(&pos, &len, (const GLubyte*)"get_transparent_index", 21)) { ret = GLXEW_SUN_get_transparent_index; continue; } #endif #ifdef GLX_SUN_video_resize if (_glewStrSame3(&pos, &len, (const GLubyte*)"video_resize", 12)) { ret = GLXEW_SUN_video_resize; continue; } #endif } } ret = (len == 0); } return ret; } #endif /* _WIN32 */ plee-the-bear-20251226/bear-engine/core/src/visual/glew/glew.h000066400000000000000000032774671512343254000236650ustar00rootroot00000000000000/* ** The OpenGL Extension Wrangler Library ** Copyright (C) 2002-2008, Milan Ikits ** Copyright (C) 2002-2008, Marcelo E. Magallon ** Copyright (C) 2002, Lev Povalahev ** All rights reserved. ** ** Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are met: ** ** * Redistributions of source code must retain the above copyright notice, ** this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright notice, ** this list of conditions and the following disclaimer in the documentation ** and/or other materials provided with the distribution. ** * The name of the author may be used to endorse or promote products ** derived from this software without specific prior written permission. ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" ** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ** ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE ** LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR ** CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF ** SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS ** INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN ** CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ** ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF ** THE POSSIBILITY OF SUCH DAMAGE. */ /* * Mesa 3-D graphics library * Version: 7.0 * * Copyright (C) 1999-2007 Brian Paul All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included * in all copies or substantial portions of the Software. * * 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 AND NONINFRINGEMENT. IN NO EVENT SHALL * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /* ** Copyright (c) 2007 The Khronos Group Inc. ** ** Permission is hereby granted, free of charge, to any person obtaining a ** copy of this software and/or associated documentation files (the ** "Materials"), to deal in the Materials without restriction, including ** without limitation the rights to use, copy, modify, merge, publish, ** distribute, sublicense, and/or sell copies of the Materials, and to ** permit persons to whom the Materials are furnished to do so, subject to ** the following conditions: ** ** The above copyright notice and this permission notice shall be included ** in all copies or substantial portions of the Materials. ** ** THE MATERIALS ARE 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 AND NONINFRINGEMENT. ** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY ** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, ** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE ** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS. */ #ifndef __glew_h__ #define __glew_h__ #define __GLEW_H__ #define GLEW_STATIC #if defined(__gl_h_) || defined(__GL_H__) || defined(__X_GL_H) #error gl.h included before glew.h #endif #if defined(__REGAL_H__) #error Regal.h included before glew.h #endif #if defined(__glext_h_) || defined(__GLEXT_H_) #error glext.h included before glew.h #endif #if defined(__gl_ATI_h_) #error glATI.h included before glew.h #endif #define __gl_h_ #define __GL_H__ #define __REGAL_H__ #define __X_GL_H #define __glext_h_ #define __GLEXT_H_ #define __gl_ATI_h_ #if defined(_WIN32) /* * GLEW does not include to avoid name space pollution. * GL needs GLAPI and GLAPIENTRY, GLU needs APIENTRY, CALLBACK, and wchar_t * defined properly. */ /* */ #ifndef APIENTRY #define GLEW_APIENTRY_DEFINED # if defined(__MINGW32__) || defined(__CYGWIN__) # define APIENTRY __stdcall # elif (_MSC_VER >= 800) || defined(_STDCALL_SUPPORTED) || defined(__BORLANDC__) # define APIENTRY __stdcall # else # define APIENTRY # endif #endif #ifndef GLAPI # if defined(__MINGW32__) || defined(__CYGWIN__) # define GLAPI extern # endif #endif /* */ #ifndef CALLBACK #define GLEW_CALLBACK_DEFINED # if defined(__MINGW32__) || defined(__CYGWIN__) # define CALLBACK __attribute__ ((__stdcall__)) # elif (defined(_M_MRX000) || defined(_M_IX86) || defined(_M_ALPHA) || defined(_M_PPC)) && !defined(MIDL_PASS) # define CALLBACK __stdcall # else # define CALLBACK # endif #endif /* and */ #ifndef WINGDIAPI #define GLEW_WINGDIAPI_DEFINED #define WINGDIAPI __declspec(dllimport) #endif /* */ #if (defined(_MSC_VER) || defined(__BORLANDC__)) && !defined(_WCHAR_T_DEFINED) typedef unsigned short wchar_t; # define _WCHAR_T_DEFINED #endif /* */ #if !defined(_W64) # if !defined(__midl) && (defined(_X86_) || defined(_M_IX86)) && defined(_MSC_VER) && _MSC_VER >= 1300 # define _W64 __w64 # else # define _W64 # endif #endif #if !defined(_PTRDIFF_T_DEFINED) && !defined(_PTRDIFF_T_) && !defined(__MINGW64__) # ifdef _WIN64 typedef __int64 ptrdiff_t; # else typedef _W64 int ptrdiff_t; # endif # define _PTRDIFF_T_DEFINED # define _PTRDIFF_T_ #endif #ifndef GLAPI # if defined(__MINGW32__) || defined(__CYGWIN__) # define GLAPI extern # else # define GLAPI WINGDIAPI # endif #endif #ifndef GLAPIENTRY #define GLAPIENTRY APIENTRY #endif #ifndef GLEWAPIENTRY #define GLEWAPIENTRY APIENTRY #endif /* * GLEW_STATIC is defined for static library. * GLEW_BUILD is defined for building the DLL library. */ #ifdef GLEW_STATIC # define GLEWAPI extern #else # ifdef GLEW_BUILD # define GLEWAPI extern __declspec(dllexport) # else # define GLEWAPI extern __declspec(dllimport) # endif #endif #else /* _UNIX */ /* * Needed for ptrdiff_t in turn needed by VBO. This is defined by ISO * C. On my system, this amounts to _3 lines_ of included code, all of * them pretty much harmless. If you know of a way of detecting 32 vs * 64 _targets_ at compile time you are free to replace this with * something that's portable. For now, _this_ is the portable solution. * (mem, 2004-01-04) */ #include /* SGI MIPSPro doesn't like stdint.h in C++ mode */ /* ID: 3376260 Solaris 9 has inttypes.h, but not stdint.h */ #if (defined(__sgi) || defined(__sun)) && !defined(__GNUC__) #include #else #include #endif #define GLEW_APIENTRY_DEFINED #define APIENTRY /* * GLEW_STATIC is defined for static library. */ #ifdef GLEW_STATIC # define GLEWAPI extern #else # if defined(__GNUC__) && __GNUC__>=4 # define GLEWAPI extern __attribute__ ((visibility("default"))) # elif defined(__SUNPRO_C) || defined(__SUNPRO_CC) # define GLEWAPI extern __global # else # define GLEWAPI extern # endif #endif /* */ #ifndef GLAPI #define GLAPI extern #endif #ifndef GLAPIENTRY #define GLAPIENTRY #endif #ifndef GLEWAPIENTRY #define GLEWAPIENTRY #endif #endif /* _WIN32 */ #ifdef __cplusplus extern "C" { #endif /* ----------------------------- GL_VERSION_1_1 ---------------------------- */ #ifndef GL_VERSION_1_1 #define GL_VERSION_1_1 1 typedef unsigned int GLenum; typedef unsigned int GLbitfield; typedef unsigned int GLuint; typedef int GLint; typedef int GLsizei; typedef unsigned char GLboolean; typedef signed char GLbyte; typedef short GLshort; typedef unsigned char GLubyte; typedef unsigned short GLushort; typedef unsigned long GLulong; typedef float GLfloat; typedef float GLclampf; typedef double GLdouble; typedef double GLclampd; typedef void GLvoid; #if defined(_MSC_VER) && _MSC_VER < 1400 typedef __int64 GLint64EXT; typedef unsigned __int64 GLuint64EXT; #elif defined(_MSC_VER) || defined(__BORLANDC__) typedef signed long long GLint64EXT; typedef unsigned long long GLuint64EXT; #else # if defined(__MINGW32__) || defined(__CYGWIN__) #include # endif typedef int64_t GLint64EXT; typedef uint64_t GLuint64EXT; #endif typedef GLint64EXT GLint64; typedef GLuint64EXT GLuint64; typedef struct __GLsync *GLsync; typedef char GLchar; #define GL_ZERO 0 #define GL_FALSE 0 #define GL_LOGIC_OP 0x0BF1 #define GL_NONE 0 #define GL_TEXTURE_COMPONENTS 0x1003 #define GL_NO_ERROR 0 #define GL_POINTS 0x0000 #define GL_CURRENT_BIT 0x00000001 #define GL_TRUE 1 #define GL_ONE 1 #define GL_CLIENT_PIXEL_STORE_BIT 0x00000001 #define GL_LINES 0x0001 #define GL_LINE_LOOP 0x0002 #define GL_POINT_BIT 0x00000002 #define GL_CLIENT_VERTEX_ARRAY_BIT 0x00000002 #define GL_LINE_STRIP 0x0003 #define GL_LINE_BIT 0x00000004 #define GL_TRIANGLES 0x0004 #define GL_TRIANGLE_STRIP 0x0005 #define GL_TRIANGLE_FAN 0x0006 #define GL_QUADS 0x0007 #define GL_QUAD_STRIP 0x0008 #define GL_POLYGON_BIT 0x00000008 #define GL_POLYGON 0x0009 #define GL_POLYGON_STIPPLE_BIT 0x00000010 #define GL_PIXEL_MODE_BIT 0x00000020 #define GL_LIGHTING_BIT 0x00000040 #define GL_FOG_BIT 0x00000080 #define GL_DEPTH_BUFFER_BIT 0x00000100 #define GL_ACCUM 0x0100 #define GL_LOAD 0x0101 #define GL_RETURN 0x0102 #define GL_MULT 0x0103 #define GL_ADD 0x0104 #define GL_NEVER 0x0200 #define GL_ACCUM_BUFFER_BIT 0x00000200 #define GL_LESS 0x0201 #define GL_EQUAL 0x0202 #define GL_LEQUAL 0x0203 #define GL_GREATER 0x0204 #define GL_NOTEQUAL 0x0205 #define GL_GEQUAL 0x0206 #define GL_ALWAYS 0x0207 #define GL_SRC_COLOR 0x0300 #define GL_ONE_MINUS_SRC_COLOR 0x0301 #define GL_SRC_ALPHA 0x0302 #define GL_ONE_MINUS_SRC_ALPHA 0x0303 #define GL_DST_ALPHA 0x0304 #define GL_ONE_MINUS_DST_ALPHA 0x0305 #define GL_DST_COLOR 0x0306 #define GL_ONE_MINUS_DST_COLOR 0x0307 #define GL_SRC_ALPHA_SATURATE 0x0308 #define GL_STENCIL_BUFFER_BIT 0x00000400 #define GL_FRONT_LEFT 0x0400 #define GL_FRONT_RIGHT 0x0401 #define GL_BACK_LEFT 0x0402 #define GL_BACK_RIGHT 0x0403 #define GL_FRONT 0x0404 #define GL_BACK 0x0405 #define GL_LEFT 0x0406 #define GL_RIGHT 0x0407 #define GL_FRONT_AND_BACK 0x0408 #define GL_AUX0 0x0409 #define GL_AUX1 0x040A #define GL_AUX2 0x040B #define GL_AUX3 0x040C #define GL_INVALID_ENUM 0x0500 #define GL_INVALID_VALUE 0x0501 #define GL_INVALID_OPERATION 0x0502 #define GL_STACK_OVERFLOW 0x0503 #define GL_STACK_UNDERFLOW 0x0504 #define GL_OUT_OF_MEMORY 0x0505 #define GL_2D 0x0600 #define GL_3D 0x0601 #define GL_3D_COLOR 0x0602 #define GL_3D_COLOR_TEXTURE 0x0603 #define GL_4D_COLOR_TEXTURE 0x0604 #define GL_PASS_THROUGH_TOKEN 0x0700 #define GL_POINT_TOKEN 0x0701 #define GL_LINE_TOKEN 0x0702 #define GL_POLYGON_TOKEN 0x0703 #define GL_BITMAP_TOKEN 0x0704 #define GL_DRAW_PIXEL_TOKEN 0x0705 #define GL_COPY_PIXEL_TOKEN 0x0706 #define GL_LINE_RESET_TOKEN 0x0707 #define GL_EXP 0x0800 #define GL_VIEWPORT_BIT 0x00000800 #define GL_EXP2 0x0801 #define GL_CW 0x0900 #define GL_CCW 0x0901 #define GL_COEFF 0x0A00 #define GL_ORDER 0x0A01 #define GL_DOMAIN 0x0A02 #define GL_CURRENT_COLOR 0x0B00 #define GL_CURRENT_INDEX 0x0B01 #define GL_CURRENT_NORMAL 0x0B02 #define GL_CURRENT_TEXTURE_COORDS 0x0B03 #define GL_CURRENT_RASTER_COLOR 0x0B04 #define GL_CURRENT_RASTER_INDEX 0x0B05 #define GL_CURRENT_RASTER_TEXTURE_COORDS 0x0B06 #define GL_CURRENT_RASTER_POSITION 0x0B07 #define GL_CURRENT_RASTER_POSITION_VALID 0x0B08 #define GL_CURRENT_RASTER_DISTANCE 0x0B09 #define GL_POINT_SMOOTH 0x0B10 #define GL_POINT_SIZE 0x0B11 #define GL_POINT_SIZE_RANGE 0x0B12 #define GL_POINT_SIZE_GRANULARITY 0x0B13 #define GL_LINE_SMOOTH 0x0B20 #define GL_LINE_WIDTH 0x0B21 #define GL_LINE_WIDTH_RANGE 0x0B22 #define GL_LINE_WIDTH_GRANULARITY 0x0B23 #define GL_LINE_STIPPLE 0x0B24 #define GL_LINE_STIPPLE_PATTERN 0x0B25 #define GL_LINE_STIPPLE_REPEAT 0x0B26 #define GL_LIST_MODE 0x0B30 #define GL_MAX_LIST_NESTING 0x0B31 #define GL_LIST_BASE 0x0B32 #define GL_LIST_INDEX 0x0B33 #define GL_POLYGON_MODE 0x0B40 #define GL_POLYGON_SMOOTH 0x0B41 #define GL_POLYGON_STIPPLE 0x0B42 #define GL_EDGE_FLAG 0x0B43 #define GL_CULL_FACE 0x0B44 #define GL_CULL_FACE_MODE 0x0B45 #define GL_FRONT_FACE 0x0B46 #define GL_LIGHTING 0x0B50 #define GL_LIGHT_MODEL_LOCAL_VIEWER 0x0B51 #define GL_LIGHT_MODEL_TWO_SIDE 0x0B52 #define GL_LIGHT_MODEL_AMBIENT 0x0B53 #define GL_SHADE_MODEL 0x0B54 #define GL_COLOR_MATERIAL_FACE 0x0B55 #define GL_COLOR_MATERIAL_PARAMETER 0x0B56 #define GL_COLOR_MATERIAL 0x0B57 #define GL_FOG 0x0B60 #define GL_FOG_INDEX 0x0B61 #define GL_FOG_DENSITY 0x0B62 #define GL_FOG_START 0x0B63 #define GL_FOG_END 0x0B64 #define GL_FOG_MODE 0x0B65 #define GL_FOG_COLOR 0x0B66 #define GL_DEPTH_RANGE 0x0B70 #define GL_DEPTH_TEST 0x0B71 #define GL_DEPTH_WRITEMASK 0x0B72 #define GL_DEPTH_CLEAR_VALUE 0x0B73 #define GL_DEPTH_FUNC 0x0B74 #define GL_ACCUM_CLEAR_VALUE 0x0B80 #define GL_STENCIL_TEST 0x0B90 #define GL_STENCIL_CLEAR_VALUE 0x0B91 #define GL_STENCIL_FUNC 0x0B92 #define GL_STENCIL_VALUE_MASK 0x0B93 #define GL_STENCIL_FAIL 0x0B94 #define GL_STENCIL_PASS_DEPTH_FAIL 0x0B95 #define GL_STENCIL_PASS_DEPTH_PASS 0x0B96 #define GL_STENCIL_REF 0x0B97 #define GL_STENCIL_WRITEMASK 0x0B98 #define GL_MATRIX_MODE 0x0BA0 #define GL_NORMALIZE 0x0BA1 #define GL_VIEWPORT 0x0BA2 #define GL_MODELVIEW_STACK_DEPTH 0x0BA3 #define GL_PROJECTION_STACK_DEPTH 0x0BA4 #define GL_TEXTURE_STACK_DEPTH 0x0BA5 #define GL_MODELVIEW_MATRIX 0x0BA6 #define GL_PROJECTION_MATRIX 0x0BA7 #define GL_TEXTURE_MATRIX 0x0BA8 #define GL_ATTRIB_STACK_DEPTH 0x0BB0 #define GL_CLIENT_ATTRIB_STACK_DEPTH 0x0BB1 #define GL_ALPHA_TEST 0x0BC0 #define GL_ALPHA_TEST_FUNC 0x0BC1 #define GL_ALPHA_TEST_REF 0x0BC2 #define GL_DITHER 0x0BD0 #define GL_BLEND_DST 0x0BE0 #define GL_BLEND_SRC 0x0BE1 #define GL_BLEND 0x0BE2 #define GL_LOGIC_OP_MODE 0x0BF0 #define GL_INDEX_LOGIC_OP 0x0BF1 #define GL_COLOR_LOGIC_OP 0x0BF2 #define GL_AUX_BUFFERS 0x0C00 #define GL_DRAW_BUFFER 0x0C01 #define GL_READ_BUFFER 0x0C02 #define GL_SCISSOR_BOX 0x0C10 #define GL_SCISSOR_TEST 0x0C11 #define GL_INDEX_CLEAR_VALUE 0x0C20 #define GL_INDEX_WRITEMASK 0x0C21 #define GL_COLOR_CLEAR_VALUE 0x0C22 #define GL_COLOR_WRITEMASK 0x0C23 #define GL_INDEX_MODE 0x0C30 #define GL_RGBA_MODE 0x0C31 #define GL_DOUBLEBUFFER 0x0C32 #define GL_STEREO 0x0C33 #define GL_RENDER_MODE 0x0C40 #define GL_PERSPECTIVE_CORRECTION_HINT 0x0C50 #define GL_POINT_SMOOTH_HINT 0x0C51 #define GL_LINE_SMOOTH_HINT 0x0C52 #define GL_POLYGON_SMOOTH_HINT 0x0C53 #define GL_FOG_HINT 0x0C54 #define GL_TEXTURE_GEN_S 0x0C60 #define GL_TEXTURE_GEN_T 0x0C61 #define GL_TEXTURE_GEN_R 0x0C62 #define GL_TEXTURE_GEN_Q 0x0C63 #define GL_PIXEL_MAP_I_TO_I 0x0C70 #define GL_PIXEL_MAP_S_TO_S 0x0C71 #define GL_PIXEL_MAP_I_TO_R 0x0C72 #define GL_PIXEL_MAP_I_TO_G 0x0C73 #define GL_PIXEL_MAP_I_TO_B 0x0C74 #define GL_PIXEL_MAP_I_TO_A 0x0C75 #define GL_PIXEL_MAP_R_TO_R 0x0C76 #define GL_PIXEL_MAP_G_TO_G 0x0C77 #define GL_PIXEL_MAP_B_TO_B 0x0C78 #define GL_PIXEL_MAP_A_TO_A 0x0C79 #define GL_PIXEL_MAP_I_TO_I_SIZE 0x0CB0 #define GL_PIXEL_MAP_S_TO_S_SIZE 0x0CB1 #define GL_PIXEL_MAP_I_TO_R_SIZE 0x0CB2 #define GL_PIXEL_MAP_I_TO_G_SIZE 0x0CB3 #define GL_PIXEL_MAP_I_TO_B_SIZE 0x0CB4 #define GL_PIXEL_MAP_I_TO_A_SIZE 0x0CB5 #define GL_PIXEL_MAP_R_TO_R_SIZE 0x0CB6 #define GL_PIXEL_MAP_G_TO_G_SIZE 0x0CB7 #define GL_PIXEL_MAP_B_TO_B_SIZE 0x0CB8 #define GL_PIXEL_MAP_A_TO_A_SIZE 0x0CB9 #define GL_UNPACK_SWAP_BYTES 0x0CF0 #define GL_UNPACK_LSB_FIRST 0x0CF1 #define GL_UNPACK_ROW_LENGTH 0x0CF2 #define GL_UNPACK_SKIP_ROWS 0x0CF3 #define GL_UNPACK_SKIP_PIXELS 0x0CF4 #define GL_UNPACK_ALIGNMENT 0x0CF5 #define GL_PACK_SWAP_BYTES 0x0D00 #define GL_PACK_LSB_FIRST 0x0D01 #define GL_PACK_ROW_LENGTH 0x0D02 #define GL_PACK_SKIP_ROWS 0x0D03 #define GL_PACK_SKIP_PIXELS 0x0D04 #define GL_PACK_ALIGNMENT 0x0D05 #define GL_MAP_COLOR 0x0D10 #define GL_MAP_STENCIL 0x0D11 #define GL_INDEX_SHIFT 0x0D12 #define GL_INDEX_OFFSET 0x0D13 #define GL_RED_SCALE 0x0D14 #define GL_RED_BIAS 0x0D15 #define GL_ZOOM_X 0x0D16 #define GL_ZOOM_Y 0x0D17 #define GL_GREEN_SCALE 0x0D18 #define GL_GREEN_BIAS 0x0D19 #define GL_BLUE_SCALE 0x0D1A #define GL_BLUE_BIAS 0x0D1B #define GL_ALPHA_SCALE 0x0D1C #define GL_ALPHA_BIAS 0x0D1D #define GL_DEPTH_SCALE 0x0D1E #define GL_DEPTH_BIAS 0x0D1F #define GL_MAX_EVAL_ORDER 0x0D30 #define GL_MAX_LIGHTS 0x0D31 #define GL_MAX_CLIP_PLANES 0x0D32 #define GL_MAX_TEXTURE_SIZE 0x0D33 #define GL_MAX_PIXEL_MAP_TABLE 0x0D34 #define GL_MAX_ATTRIB_STACK_DEPTH 0x0D35 #define GL_MAX_MODELVIEW_STACK_DEPTH 0x0D36 #define GL_MAX_NAME_STACK_DEPTH 0x0D37 #define GL_MAX_PROJECTION_STACK_DEPTH 0x0D38 #define GL_MAX_TEXTURE_STACK_DEPTH 0x0D39 #define GL_MAX_VIEWPORT_DIMS 0x0D3A #define GL_MAX_CLIENT_ATTRIB_STACK_DEPTH 0x0D3B #define GL_SUBPIXEL_BITS 0x0D50 #define GL_INDEX_BITS 0x0D51 #define GL_RED_BITS 0x0D52 #define GL_GREEN_BITS 0x0D53 #define GL_BLUE_BITS 0x0D54 #define GL_ALPHA_BITS 0x0D55 #define GL_DEPTH_BITS 0x0D56 #define GL_STENCIL_BITS 0x0D57 #define GL_ACCUM_RED_BITS 0x0D58 #define GL_ACCUM_GREEN_BITS 0x0D59 #define GL_ACCUM_BLUE_BITS 0x0D5A #define GL_ACCUM_ALPHA_BITS 0x0D5B #define GL_NAME_STACK_DEPTH 0x0D70 #define GL_AUTO_NORMAL 0x0D80 #define GL_MAP1_COLOR_4 0x0D90 #define GL_MAP1_INDEX 0x0D91 #define GL_MAP1_NORMAL 0x0D92 #define GL_MAP1_TEXTURE_COORD_1 0x0D93 #define GL_MAP1_TEXTURE_COORD_2 0x0D94 #define GL_MAP1_TEXTURE_COORD_3 0x0D95 #define GL_MAP1_TEXTURE_COORD_4 0x0D96 #define GL_MAP1_VERTEX_3 0x0D97 #define GL_MAP1_VERTEX_4 0x0D98 #define GL_MAP2_COLOR_4 0x0DB0 #define GL_MAP2_INDEX 0x0DB1 #define GL_MAP2_NORMAL 0x0DB2 #define GL_MAP2_TEXTURE_COORD_1 0x0DB3 #define GL_MAP2_TEXTURE_COORD_2 0x0DB4 #define GL_MAP2_TEXTURE_COORD_3 0x0DB5 #define GL_MAP2_TEXTURE_COORD_4 0x0DB6 #define GL_MAP2_VERTEX_3 0x0DB7 #define GL_MAP2_VERTEX_4 0x0DB8 #define GL_MAP1_GRID_DOMAIN 0x0DD0 #define GL_MAP1_GRID_SEGMENTS 0x0DD1 #define GL_MAP2_GRID_DOMAIN 0x0DD2 #define GL_MAP2_GRID_SEGMENTS 0x0DD3 #define GL_TEXTURE_1D 0x0DE0 #define GL_TEXTURE_2D 0x0DE1 #define GL_FEEDBACK_BUFFER_POINTER 0x0DF0 #define GL_FEEDBACK_BUFFER_SIZE 0x0DF1 #define GL_FEEDBACK_BUFFER_TYPE 0x0DF2 #define GL_SELECTION_BUFFER_POINTER 0x0DF3 #define GL_SELECTION_BUFFER_SIZE 0x0DF4 #define GL_TEXTURE_WIDTH 0x1000 #define GL_TRANSFORM_BIT 0x00001000 #define GL_TEXTURE_HEIGHT 0x1001 #define GL_TEXTURE_INTERNAL_FORMAT 0x1003 #define GL_TEXTURE_BORDER_COLOR 0x1004 #define GL_TEXTURE_BORDER 0x1005 #define GL_DONT_CARE 0x1100 #define GL_FASTEST 0x1101 #define GL_NICEST 0x1102 #define GL_AMBIENT 0x1200 #define GL_DIFFUSE 0x1201 #define GL_SPECULAR 0x1202 #define GL_POSITION 0x1203 #define GL_SPOT_DIRECTION 0x1204 #define GL_SPOT_EXPONENT 0x1205 #define GL_SPOT_CUTOFF 0x1206 #define GL_CONSTANT_ATTENUATION 0x1207 #define GL_LINEAR_ATTENUATION 0x1208 #define GL_QUADRATIC_ATTENUATION 0x1209 #define GL_COMPILE 0x1300 #define GL_COMPILE_AND_EXECUTE 0x1301 #define GL_BYTE 0x1400 #define GL_UNSIGNED_BYTE 0x1401 #define GL_SHORT 0x1402 #define GL_UNSIGNED_SHORT 0x1403 #define GL_INT 0x1404 #define GL_UNSIGNED_INT 0x1405 #define GL_FLOAT 0x1406 #define GL_2_BYTES 0x1407 #define GL_3_BYTES 0x1408 #define GL_4_BYTES 0x1409 #define GL_DOUBLE 0x140A #define GL_CLEAR 0x1500 #define GL_AND 0x1501 #define GL_AND_REVERSE 0x1502 #define GL_COPY 0x1503 #define GL_AND_INVERTED 0x1504 #define GL_NOOP 0x1505 #define GL_XOR 0x1506 #define GL_OR 0x1507 #define GL_NOR 0x1508 #define GL_EQUIV 0x1509 #define GL_INVERT 0x150A #define GL_OR_REVERSE 0x150B #define GL_COPY_INVERTED 0x150C #define GL_OR_INVERTED 0x150D #define GL_NAND 0x150E #define GL_SET 0x150F #define GL_EMISSION 0x1600 #define GL_SHININESS 0x1601 #define GL_AMBIENT_AND_DIFFUSE 0x1602 #define GL_COLOR_INDEXES 0x1603 #define GL_MODELVIEW 0x1700 #define GL_PROJECTION 0x1701 #define GL_TEXTURE 0x1702 #define GL_COLOR 0x1800 #define GL_DEPTH 0x1801 #define GL_STENCIL 0x1802 #define GL_COLOR_INDEX 0x1900 #define GL_STENCIL_INDEX 0x1901 #define GL_DEPTH_COMPONENT 0x1902 #define GL_RED 0x1903 #define GL_GREEN 0x1904 #define GL_BLUE 0x1905 #define GL_ALPHA 0x1906 #define GL_RGB 0x1907 #define GL_RGBA 0x1908 #define GL_LUMINANCE 0x1909 #define GL_LUMINANCE_ALPHA 0x190A #define GL_BITMAP 0x1A00 #define GL_POINT 0x1B00 #define GL_LINE 0x1B01 #define GL_FILL 0x1B02 #define GL_RENDER 0x1C00 #define GL_FEEDBACK 0x1C01 #define GL_SELECT 0x1C02 #define GL_FLAT 0x1D00 #define GL_SMOOTH 0x1D01 #define GL_KEEP 0x1E00 #define GL_REPLACE 0x1E01 #define GL_INCR 0x1E02 #define GL_DECR 0x1E03 #define GL_VENDOR 0x1F00 #define GL_RENDERER 0x1F01 #define GL_VERSION 0x1F02 #define GL_EXTENSIONS 0x1F03 #define GL_S 0x2000 #define GL_ENABLE_BIT 0x00002000 #define GL_T 0x2001 #define GL_R 0x2002 #define GL_Q 0x2003 #define GL_MODULATE 0x2100 #define GL_DECAL 0x2101 #define GL_TEXTURE_ENV_MODE 0x2200 #define GL_TEXTURE_ENV_COLOR 0x2201 #define GL_TEXTURE_ENV 0x2300 #define GL_EYE_LINEAR 0x2400 #define GL_OBJECT_LINEAR 0x2401 #define GL_SPHERE_MAP 0x2402 #define GL_TEXTURE_GEN_MODE 0x2500 #define GL_OBJECT_PLANE 0x2501 #define GL_EYE_PLANE 0x2502 #define GL_NEAREST 0x2600 #define GL_LINEAR 0x2601 #define GL_NEAREST_MIPMAP_NEAREST 0x2700 #define GL_LINEAR_MIPMAP_NEAREST 0x2701 #define GL_NEAREST_MIPMAP_LINEAR 0x2702 #define GL_LINEAR_MIPMAP_LINEAR 0x2703 #define GL_TEXTURE_MAG_FILTER 0x2800 #define GL_TEXTURE_MIN_FILTER 0x2801 #define GL_TEXTURE_WRAP_S 0x2802 #define GL_TEXTURE_WRAP_T 0x2803 #define GL_CLAMP 0x2900 #define GL_REPEAT 0x2901 #define GL_POLYGON_OFFSET_UNITS 0x2A00 #define GL_POLYGON_OFFSET_POINT 0x2A01 #define GL_POLYGON_OFFSET_LINE 0x2A02 #define GL_R3_G3_B2 0x2A10 #define GL_V2F 0x2A20 #define GL_V3F 0x2A21 #define GL_C4UB_V2F 0x2A22 #define GL_C4UB_V3F 0x2A23 #define GL_C3F_V3F 0x2A24 #define GL_N3F_V3F 0x2A25 #define GL_C4F_N3F_V3F 0x2A26 #define GL_T2F_V3F 0x2A27 #define GL_T4F_V4F 0x2A28 #define GL_T2F_C4UB_V3F 0x2A29 #define GL_T2F_C3F_V3F 0x2A2A #define GL_T2F_N3F_V3F 0x2A2B #define GL_T2F_C4F_N3F_V3F 0x2A2C #define GL_T4F_C4F_N3F_V4F 0x2A2D #define GL_CLIP_PLANE0 0x3000 #define GL_CLIP_PLANE1 0x3001 #define GL_CLIP_PLANE2 0x3002 #define GL_CLIP_PLANE3 0x3003 #define GL_CLIP_PLANE4 0x3004 #define GL_CLIP_PLANE5 0x3005 #define GL_LIGHT0 0x4000 #define GL_COLOR_BUFFER_BIT 0x00004000 #define GL_LIGHT1 0x4001 #define GL_LIGHT2 0x4002 #define GL_LIGHT3 0x4003 #define GL_LIGHT4 0x4004 #define GL_LIGHT5 0x4005 #define GL_LIGHT6 0x4006 #define GL_LIGHT7 0x4007 #define GL_HINT_BIT 0x00008000 #define GL_POLYGON_OFFSET_FILL 0x8037 #define GL_POLYGON_OFFSET_FACTOR 0x8038 #define GL_ALPHA4 0x803B #define GL_ALPHA8 0x803C #define GL_ALPHA12 0x803D #define GL_ALPHA16 0x803E #define GL_LUMINANCE4 0x803F #define GL_LUMINANCE8 0x8040 #define GL_LUMINANCE12 0x8041 #define GL_LUMINANCE16 0x8042 #define GL_LUMINANCE4_ALPHA4 0x8043 #define GL_LUMINANCE6_ALPHA2 0x8044 #define GL_LUMINANCE8_ALPHA8 0x8045 #define GL_LUMINANCE12_ALPHA4 0x8046 #define GL_LUMINANCE12_ALPHA12 0x8047 #define GL_LUMINANCE16_ALPHA16 0x8048 #define GL_INTENSITY 0x8049 #define GL_INTENSITY4 0x804A #define GL_INTENSITY8 0x804B #define GL_INTENSITY12 0x804C #define GL_INTENSITY16 0x804D #define GL_RGB4 0x804F #define GL_RGB5 0x8050 #define GL_RGB8 0x8051 #define GL_RGB10 0x8052 #define GL_RGB12 0x8053 #define GL_RGB16 0x8054 #define GL_RGBA2 0x8055 #define GL_RGBA4 0x8056 #define GL_RGB5_A1 0x8057 #define GL_RGBA8 0x8058 #define GL_RGB10_A2 0x8059 #define GL_RGBA12 0x805A #define GL_RGBA16 0x805B #define GL_TEXTURE_RED_SIZE 0x805C #define GL_TEXTURE_GREEN_SIZE 0x805D #define GL_TEXTURE_BLUE_SIZE 0x805E #define GL_TEXTURE_ALPHA_SIZE 0x805F #define GL_TEXTURE_LUMINANCE_SIZE 0x8060 #define GL_TEXTURE_INTENSITY_SIZE 0x8061 #define GL_PROXY_TEXTURE_1D 0x8063 #define GL_PROXY_TEXTURE_2D 0x8064 #define GL_TEXTURE_PRIORITY 0x8066 #define GL_TEXTURE_RESIDENT 0x8067 #define GL_TEXTURE_BINDING_1D 0x8068 #define GL_TEXTURE_BINDING_2D 0x8069 #define GL_VERTEX_ARRAY 0x8074 #define GL_NORMAL_ARRAY 0x8075 #define GL_COLOR_ARRAY 0x8076 #define GL_INDEX_ARRAY 0x8077 #define GL_TEXTURE_COORD_ARRAY 0x8078 #define GL_EDGE_FLAG_ARRAY 0x8079 #define GL_VERTEX_ARRAY_SIZE 0x807A #define GL_VERTEX_ARRAY_TYPE 0x807B #define GL_VERTEX_ARRAY_STRIDE 0x807C #define GL_NORMAL_ARRAY_TYPE 0x807E #define GL_NORMAL_ARRAY_STRIDE 0x807F #define GL_COLOR_ARRAY_SIZE 0x8081 #define GL_COLOR_ARRAY_TYPE 0x8082 #define GL_COLOR_ARRAY_STRIDE 0x8083 #define GL_INDEX_ARRAY_TYPE 0x8085 #define GL_INDEX_ARRAY_STRIDE 0x8086 #define GL_TEXTURE_COORD_ARRAY_SIZE 0x8088 #define GL_TEXTURE_COORD_ARRAY_TYPE 0x8089 #define GL_TEXTURE_COORD_ARRAY_STRIDE 0x808A #define GL_EDGE_FLAG_ARRAY_STRIDE 0x808C #define GL_VERTEX_ARRAY_POINTER 0x808E #define GL_NORMAL_ARRAY_POINTER 0x808F #define GL_COLOR_ARRAY_POINTER 0x8090 #define GL_INDEX_ARRAY_POINTER 0x8091 #define GL_TEXTURE_COORD_ARRAY_POINTER 0x8092 #define GL_EDGE_FLAG_ARRAY_POINTER 0x8093 #define GL_COLOR_INDEX1_EXT 0x80E2 #define GL_COLOR_INDEX2_EXT 0x80E3 #define GL_COLOR_INDEX4_EXT 0x80E4 #define GL_COLOR_INDEX8_EXT 0x80E5 #define GL_COLOR_INDEX12_EXT 0x80E6 #define GL_COLOR_INDEX16_EXT 0x80E7 #define GL_EVAL_BIT 0x00010000 #define GL_LIST_BIT 0x00020000 #define GL_TEXTURE_BIT 0x00040000 #define GL_SCISSOR_BIT 0x00080000 #define GL_ALL_ATTRIB_BITS 0x000fffff #define GL_CLIENT_ALL_ATTRIB_BITS 0xffffffff GLAPI void GLAPIENTRY glAccum (GLenum op, GLfloat value); GLAPI void GLAPIENTRY glAlphaFunc (GLenum func, GLclampf ref); GLAPI GLboolean GLAPIENTRY glAreTexturesResident (GLsizei n, const GLuint *textures, GLboolean *residences); GLAPI void GLAPIENTRY glArrayElement (GLint i); GLAPI void GLAPIENTRY glBegin (GLenum mode); GLAPI void GLAPIENTRY glBindTexture (GLenum target, GLuint texture); GLAPI void GLAPIENTRY glBitmap (GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, const GLubyte *bitmap); GLAPI void GLAPIENTRY glBlendFunc (GLenum sfactor, GLenum dfactor); GLAPI void GLAPIENTRY glCallList (GLuint list); GLAPI void GLAPIENTRY glCallLists (GLsizei n, GLenum type, const GLvoid *lists); GLAPI void GLAPIENTRY glClear (GLbitfield mask); GLAPI void GLAPIENTRY glClearAccum (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); GLAPI void GLAPIENTRY glClearColor (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); GLAPI void GLAPIENTRY glClearDepth (GLclampd depth); GLAPI void GLAPIENTRY glClearIndex (GLfloat c); GLAPI void GLAPIENTRY glClearStencil (GLint s); GLAPI void GLAPIENTRY glClipPlane (GLenum plane, const GLdouble *equation); GLAPI void GLAPIENTRY glColor3b (GLbyte red, GLbyte green, GLbyte blue); GLAPI void GLAPIENTRY glColor3bv (const GLbyte *v); GLAPI void GLAPIENTRY glColor3d (GLdouble red, GLdouble green, GLdouble blue); GLAPI void GLAPIENTRY glColor3dv (const GLdouble *v); GLAPI void GLAPIENTRY glColor3f (GLfloat red, GLfloat green, GLfloat blue); GLAPI void GLAPIENTRY glColor3fv (const GLfloat *v); GLAPI void GLAPIENTRY glColor3i (GLint red, GLint green, GLint blue); GLAPI void GLAPIENTRY glColor3iv (const GLint *v); GLAPI void GLAPIENTRY glColor3s (GLshort red, GLshort green, GLshort blue); GLAPI void GLAPIENTRY glColor3sv (const GLshort *v); GLAPI void GLAPIENTRY glColor3ub (GLubyte red, GLubyte green, GLubyte blue); GLAPI void GLAPIENTRY glColor3ubv (const GLubyte *v); GLAPI void GLAPIENTRY glColor3ui (GLuint red, GLuint green, GLuint blue); GLAPI void GLAPIENTRY glColor3uiv (const GLuint *v); GLAPI void GLAPIENTRY glColor3us (GLushort red, GLushort green, GLushort blue); GLAPI void GLAPIENTRY glColor3usv (const GLushort *v); GLAPI void GLAPIENTRY glColor4b (GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha); GLAPI void GLAPIENTRY glColor4bv (const GLbyte *v); GLAPI void GLAPIENTRY glColor4d (GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha); GLAPI void GLAPIENTRY glColor4dv (const GLdouble *v); GLAPI void GLAPIENTRY glColor4f (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); GLAPI void GLAPIENTRY glColor4fv (const GLfloat *v); GLAPI void GLAPIENTRY glColor4i (GLint red, GLint green, GLint blue, GLint alpha); GLAPI void GLAPIENTRY glColor4iv (const GLint *v); GLAPI void GLAPIENTRY glColor4s (GLshort red, GLshort green, GLshort blue, GLshort alpha); GLAPI void GLAPIENTRY glColor4sv (const GLshort *v); GLAPI void GLAPIENTRY glColor4ub (GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha); GLAPI void GLAPIENTRY glColor4ubv (const GLubyte *v); GLAPI void GLAPIENTRY glColor4ui (GLuint red, GLuint green, GLuint blue, GLuint alpha); GLAPI void GLAPIENTRY glColor4uiv (const GLuint *v); GLAPI void GLAPIENTRY glColor4us (GLushort red, GLushort green, GLushort blue, GLushort alpha); GLAPI void GLAPIENTRY glColor4usv (const GLushort *v); GLAPI void GLAPIENTRY glColorMask (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha); GLAPI void GLAPIENTRY glColorMaterial (GLenum face, GLenum mode); GLAPI void GLAPIENTRY glColorPointer (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); GLAPI void GLAPIENTRY glCopyPixels (GLint x, GLint y, GLsizei width, GLsizei height, GLenum type); GLAPI void GLAPIENTRY glCopyTexImage1D (GLenum target, GLint level, GLenum internalFormat, GLint x, GLint y, GLsizei width, GLint border); GLAPI void GLAPIENTRY glCopyTexImage2D (GLenum target, GLint level, GLenum internalFormat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); GLAPI void GLAPIENTRY glCopyTexSubImage1D (GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); GLAPI void GLAPIENTRY glCopyTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); GLAPI void GLAPIENTRY glCullFace (GLenum mode); GLAPI void GLAPIENTRY glDeleteLists (GLuint list, GLsizei range); GLAPI void GLAPIENTRY glDeleteTextures (GLsizei n, const GLuint *textures); GLAPI void GLAPIENTRY glDepthFunc (GLenum func); GLAPI void GLAPIENTRY glDepthMask (GLboolean flag); GLAPI void GLAPIENTRY glDepthRange (GLclampd zNear, GLclampd zFar); GLAPI void GLAPIENTRY glDisable (GLenum cap); GLAPI void GLAPIENTRY glDisableClientState (GLenum array); GLAPI void GLAPIENTRY glDrawArrays (GLenum mode, GLint first, GLsizei count); GLAPI void GLAPIENTRY glDrawBuffer (GLenum mode); GLAPI void GLAPIENTRY glDrawElements (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices); GLAPI void GLAPIENTRY glDrawPixels (GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels); GLAPI void GLAPIENTRY glEdgeFlag (GLboolean flag); GLAPI void GLAPIENTRY glEdgeFlagPointer (GLsizei stride, const GLvoid *pointer); GLAPI void GLAPIENTRY glEdgeFlagv (const GLboolean *flag); GLAPI void GLAPIENTRY glEnable (GLenum cap); GLAPI void GLAPIENTRY glEnableClientState (GLenum array); GLAPI void GLAPIENTRY glEnd (void); GLAPI void GLAPIENTRY glEndList (void); GLAPI void GLAPIENTRY glEvalCoord1d (GLdouble u); GLAPI void GLAPIENTRY glEvalCoord1dv (const GLdouble *u); GLAPI void GLAPIENTRY glEvalCoord1f (GLfloat u); GLAPI void GLAPIENTRY glEvalCoord1fv (const GLfloat *u); GLAPI void GLAPIENTRY glEvalCoord2d (GLdouble u, GLdouble v); GLAPI void GLAPIENTRY glEvalCoord2dv (const GLdouble *u); GLAPI void GLAPIENTRY glEvalCoord2f (GLfloat u, GLfloat v); GLAPI void GLAPIENTRY glEvalCoord2fv (const GLfloat *u); GLAPI void GLAPIENTRY glEvalMesh1 (GLenum mode, GLint i1, GLint i2); GLAPI void GLAPIENTRY glEvalMesh2 (GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2); GLAPI void GLAPIENTRY glEvalPoint1 (GLint i); GLAPI void GLAPIENTRY glEvalPoint2 (GLint i, GLint j); GLAPI void GLAPIENTRY glFeedbackBuffer (GLsizei size, GLenum type, GLfloat *buffer); GLAPI void GLAPIENTRY glFinish (void); GLAPI void GLAPIENTRY glFlush (void); GLAPI void GLAPIENTRY glFogf (GLenum pname, GLfloat param); GLAPI void GLAPIENTRY glFogfv (GLenum pname, const GLfloat *params); GLAPI void GLAPIENTRY glFogi (GLenum pname, GLint param); GLAPI void GLAPIENTRY glFogiv (GLenum pname, const GLint *params); GLAPI void GLAPIENTRY glFrontFace (GLenum mode); GLAPI void GLAPIENTRY glFrustum (GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); GLAPI GLuint GLAPIENTRY glGenLists (GLsizei range); GLAPI void GLAPIENTRY glGenTextures (GLsizei n, GLuint *textures); GLAPI void GLAPIENTRY glGetBooleanv (GLenum pname, GLboolean *params); GLAPI void GLAPIENTRY glGetClipPlane (GLenum plane, GLdouble *equation); GLAPI void GLAPIENTRY glGetDoublev (GLenum pname, GLdouble *params); GLAPI GLenum GLAPIENTRY glGetError (void); GLAPI void GLAPIENTRY glGetFloatv (GLenum pname, GLfloat *params); GLAPI void GLAPIENTRY glGetIntegerv (GLenum pname, GLint *params); GLAPI void GLAPIENTRY glGetLightfv (GLenum light, GLenum pname, GLfloat *params); GLAPI void GLAPIENTRY glGetLightiv (GLenum light, GLenum pname, GLint *params); GLAPI void GLAPIENTRY glGetMapdv (GLenum target, GLenum query, GLdouble *v); GLAPI void GLAPIENTRY glGetMapfv (GLenum target, GLenum query, GLfloat *v); GLAPI void GLAPIENTRY glGetMapiv (GLenum target, GLenum query, GLint *v); GLAPI void GLAPIENTRY glGetMaterialfv (GLenum face, GLenum pname, GLfloat *params); GLAPI void GLAPIENTRY glGetMaterialiv (GLenum face, GLenum pname, GLint *params); GLAPI void GLAPIENTRY glGetPixelMapfv (GLenum map, GLfloat *values); GLAPI void GLAPIENTRY glGetPixelMapuiv (GLenum map, GLuint *values); GLAPI void GLAPIENTRY glGetPixelMapusv (GLenum map, GLushort *values); GLAPI void GLAPIENTRY glGetPointerv (GLenum pname, GLvoid* *params); GLAPI void GLAPIENTRY glGetPolygonStipple (GLubyte *mask); GLAPI const GLubyte * GLAPIENTRY glGetString (GLenum name); GLAPI void GLAPIENTRY glGetTexEnvfv (GLenum target, GLenum pname, GLfloat *params); GLAPI void GLAPIENTRY glGetTexEnviv (GLenum target, GLenum pname, GLint *params); GLAPI void GLAPIENTRY glGetTexGendv (GLenum coord, GLenum pname, GLdouble *params); GLAPI void GLAPIENTRY glGetTexGenfv (GLenum coord, GLenum pname, GLfloat *params); GLAPI void GLAPIENTRY glGetTexGeniv (GLenum coord, GLenum pname, GLint *params); GLAPI void GLAPIENTRY glGetTexImage (GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels); GLAPI void GLAPIENTRY glGetTexLevelParameterfv (GLenum target, GLint level, GLenum pname, GLfloat *params); GLAPI void GLAPIENTRY glGetTexLevelParameteriv (GLenum target, GLint level, GLenum pname, GLint *params); GLAPI void GLAPIENTRY glGetTexParameterfv (GLenum target, GLenum pname, GLfloat *params); GLAPI void GLAPIENTRY glGetTexParameteriv (GLenum target, GLenum pname, GLint *params); GLAPI void GLAPIENTRY glHint (GLenum target, GLenum mode); GLAPI void GLAPIENTRY glIndexMask (GLuint mask); GLAPI void GLAPIENTRY glIndexPointer (GLenum type, GLsizei stride, const GLvoid *pointer); GLAPI void GLAPIENTRY glIndexd (GLdouble c); GLAPI void GLAPIENTRY glIndexdv (const GLdouble *c); GLAPI void GLAPIENTRY glIndexf (GLfloat c); GLAPI void GLAPIENTRY glIndexfv (const GLfloat *c); GLAPI void GLAPIENTRY glIndexi (GLint c); GLAPI void GLAPIENTRY glIndexiv (const GLint *c); GLAPI void GLAPIENTRY glIndexs (GLshort c); GLAPI void GLAPIENTRY glIndexsv (const GLshort *c); GLAPI void GLAPIENTRY glIndexub (GLubyte c); GLAPI void GLAPIENTRY glIndexubv (const GLubyte *c); GLAPI void GLAPIENTRY glInitNames (void); GLAPI void GLAPIENTRY glInterleavedArrays (GLenum format, GLsizei stride, const GLvoid *pointer); GLAPI GLboolean GLAPIENTRY glIsEnabled (GLenum cap); GLAPI GLboolean GLAPIENTRY glIsList (GLuint list); GLAPI GLboolean GLAPIENTRY glIsTexture (GLuint texture); GLAPI void GLAPIENTRY glLightModelf (GLenum pname, GLfloat param); GLAPI void GLAPIENTRY glLightModelfv (GLenum pname, const GLfloat *params); GLAPI void GLAPIENTRY glLightModeli (GLenum pname, GLint param); GLAPI void GLAPIENTRY glLightModeliv (GLenum pname, const GLint *params); GLAPI void GLAPIENTRY glLightf (GLenum light, GLenum pname, GLfloat param); GLAPI void GLAPIENTRY glLightfv (GLenum light, GLenum pname, const GLfloat *params); GLAPI void GLAPIENTRY glLighti (GLenum light, GLenum pname, GLint param); GLAPI void GLAPIENTRY glLightiv (GLenum light, GLenum pname, const GLint *params); GLAPI void GLAPIENTRY glLineStipple (GLint factor, GLushort pattern); GLAPI void GLAPIENTRY glLineWidth (GLfloat width); GLAPI void GLAPIENTRY glListBase (GLuint base); GLAPI void GLAPIENTRY glLoadIdentity (void); GLAPI void GLAPIENTRY glLoadMatrixd (const GLdouble *m); GLAPI void GLAPIENTRY glLoadMatrixf (const GLfloat *m); GLAPI void GLAPIENTRY glLoadName (GLuint name); GLAPI void GLAPIENTRY glLogicOp (GLenum opcode); GLAPI void GLAPIENTRY glMap1d (GLenum target, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points); GLAPI void GLAPIENTRY glMap1f (GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points); GLAPI void GLAPIENTRY glMap2d (GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points); GLAPI void GLAPIENTRY glMap2f (GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points); GLAPI void GLAPIENTRY glMapGrid1d (GLint un, GLdouble u1, GLdouble u2); GLAPI void GLAPIENTRY glMapGrid1f (GLint un, GLfloat u1, GLfloat u2); GLAPI void GLAPIENTRY glMapGrid2d (GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2); GLAPI void GLAPIENTRY glMapGrid2f (GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2); GLAPI void GLAPIENTRY glMaterialf (GLenum face, GLenum pname, GLfloat param); GLAPI void GLAPIENTRY glMaterialfv (GLenum face, GLenum pname, const GLfloat *params); GLAPI void GLAPIENTRY glMateriali (GLenum face, GLenum pname, GLint param); GLAPI void GLAPIENTRY glMaterialiv (GLenum face, GLenum pname, const GLint *params); GLAPI void GLAPIENTRY glMatrixMode (GLenum mode); GLAPI void GLAPIENTRY glMultMatrixd (const GLdouble *m); GLAPI void GLAPIENTRY glMultMatrixf (const GLfloat *m); GLAPI void GLAPIENTRY glNewList (GLuint list, GLenum mode); GLAPI void GLAPIENTRY glNormal3b (GLbyte nx, GLbyte ny, GLbyte nz); GLAPI void GLAPIENTRY glNormal3bv (const GLbyte *v); GLAPI void GLAPIENTRY glNormal3d (GLdouble nx, GLdouble ny, GLdouble nz); GLAPI void GLAPIENTRY glNormal3dv (const GLdouble *v); GLAPI void GLAPIENTRY glNormal3f (GLfloat nx, GLfloat ny, GLfloat nz); GLAPI void GLAPIENTRY glNormal3fv (const GLfloat *v); GLAPI void GLAPIENTRY glNormal3i (GLint nx, GLint ny, GLint nz); GLAPI void GLAPIENTRY glNormal3iv (const GLint *v); GLAPI void GLAPIENTRY glNormal3s (GLshort nx, GLshort ny, GLshort nz); GLAPI void GLAPIENTRY glNormal3sv (const GLshort *v); GLAPI void GLAPIENTRY glNormalPointer (GLenum type, GLsizei stride, const GLvoid *pointer); GLAPI void GLAPIENTRY glOrtho (GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); GLAPI void GLAPIENTRY glPassThrough (GLfloat token); GLAPI void GLAPIENTRY glPixelMapfv (GLenum map, GLsizei mapsize, const GLfloat *values); GLAPI void GLAPIENTRY glPixelMapuiv (GLenum map, GLsizei mapsize, const GLuint *values); GLAPI void GLAPIENTRY glPixelMapusv (GLenum map, GLsizei mapsize, const GLushort *values); GLAPI void GLAPIENTRY glPixelStoref (GLenum pname, GLfloat param); GLAPI void GLAPIENTRY glPixelStorei (GLenum pname, GLint param); GLAPI void GLAPIENTRY glPixelTransferf (GLenum pname, GLfloat param); GLAPI void GLAPIENTRY glPixelTransferi (GLenum pname, GLint param); GLAPI void GLAPIENTRY glPixelZoom (GLfloat xfactor, GLfloat yfactor); GLAPI void GLAPIENTRY glPointSize (GLfloat size); GLAPI void GLAPIENTRY glPolygonMode (GLenum face, GLenum mode); GLAPI void GLAPIENTRY glPolygonOffset (GLfloat factor, GLfloat units); GLAPI void GLAPIENTRY glPolygonStipple (const GLubyte *mask); GLAPI void GLAPIENTRY glPopAttrib (void); GLAPI void GLAPIENTRY glPopClientAttrib (void); GLAPI void GLAPIENTRY glPopMatrix (void); GLAPI void GLAPIENTRY glPopName (void); GLAPI void GLAPIENTRY glPrioritizeTextures (GLsizei n, const GLuint *textures, const GLclampf *priorities); GLAPI void GLAPIENTRY glPushAttrib (GLbitfield mask); GLAPI void GLAPIENTRY glPushClientAttrib (GLbitfield mask); GLAPI void GLAPIENTRY glPushMatrix (void); GLAPI void GLAPIENTRY glPushName (GLuint name); GLAPI void GLAPIENTRY glRasterPos2d (GLdouble x, GLdouble y); GLAPI void GLAPIENTRY glRasterPos2dv (const GLdouble *v); GLAPI void GLAPIENTRY glRasterPos2f (GLfloat x, GLfloat y); GLAPI void GLAPIENTRY glRasterPos2fv (const GLfloat *v); GLAPI void GLAPIENTRY glRasterPos2i (GLint x, GLint y); GLAPI void GLAPIENTRY glRasterPos2iv (const GLint *v); GLAPI void GLAPIENTRY glRasterPos2s (GLshort x, GLshort y); GLAPI void GLAPIENTRY glRasterPos2sv (const GLshort *v); GLAPI void GLAPIENTRY glRasterPos3d (GLdouble x, GLdouble y, GLdouble z); GLAPI void GLAPIENTRY glRasterPos3dv (const GLdouble *v); GLAPI void GLAPIENTRY glRasterPos3f (GLfloat x, GLfloat y, GLfloat z); GLAPI void GLAPIENTRY glRasterPos3fv (const GLfloat *v); GLAPI void GLAPIENTRY glRasterPos3i (GLint x, GLint y, GLint z); GLAPI void GLAPIENTRY glRasterPos3iv (const GLint *v); GLAPI void GLAPIENTRY glRasterPos3s (GLshort x, GLshort y, GLshort z); GLAPI void GLAPIENTRY glRasterPos3sv (const GLshort *v); GLAPI void GLAPIENTRY glRasterPos4d (GLdouble x, GLdouble y, GLdouble z, GLdouble w); GLAPI void GLAPIENTRY glRasterPos4dv (const GLdouble *v); GLAPI void GLAPIENTRY glRasterPos4f (GLfloat x, GLfloat y, GLfloat z, GLfloat w); GLAPI void GLAPIENTRY glRasterPos4fv (const GLfloat *v); GLAPI void GLAPIENTRY glRasterPos4i (GLint x, GLint y, GLint z, GLint w); GLAPI void GLAPIENTRY glRasterPos4iv (const GLint *v); GLAPI void GLAPIENTRY glRasterPos4s (GLshort x, GLshort y, GLshort z, GLshort w); GLAPI void GLAPIENTRY glRasterPos4sv (const GLshort *v); GLAPI void GLAPIENTRY glReadBuffer (GLenum mode); GLAPI void GLAPIENTRY glReadPixels (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels); GLAPI void GLAPIENTRY glRectd (GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2); GLAPI void GLAPIENTRY glRectdv (const GLdouble *v1, const GLdouble *v2); GLAPI void GLAPIENTRY glRectf (GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2); GLAPI void GLAPIENTRY glRectfv (const GLfloat *v1, const GLfloat *v2); GLAPI void GLAPIENTRY glRecti (GLint x1, GLint y1, GLint x2, GLint y2); GLAPI void GLAPIENTRY glRectiv (const GLint *v1, const GLint *v2); GLAPI void GLAPIENTRY glRects (GLshort x1, GLshort y1, GLshort x2, GLshort y2); GLAPI void GLAPIENTRY glRectsv (const GLshort *v1, const GLshort *v2); GLAPI GLint GLAPIENTRY glRenderMode (GLenum mode); GLAPI void GLAPIENTRY glRotated (GLdouble angle, GLdouble x, GLdouble y, GLdouble z); GLAPI void GLAPIENTRY glRotatef (GLfloat angle, GLfloat x, GLfloat y, GLfloat z); GLAPI void GLAPIENTRY glScaled (GLdouble x, GLdouble y, GLdouble z); GLAPI void GLAPIENTRY glScalef (GLfloat x, GLfloat y, GLfloat z); GLAPI void GLAPIENTRY glScissor (GLint x, GLint y, GLsizei width, GLsizei height); GLAPI void GLAPIENTRY glSelectBuffer (GLsizei size, GLuint *buffer); GLAPI void GLAPIENTRY glShadeModel (GLenum mode); GLAPI void GLAPIENTRY glStencilFunc (GLenum func, GLint ref, GLuint mask); GLAPI void GLAPIENTRY glStencilMask (GLuint mask); GLAPI void GLAPIENTRY glStencilOp (GLenum fail, GLenum zfail, GLenum zpass); GLAPI void GLAPIENTRY glTexCoord1d (GLdouble s); GLAPI void GLAPIENTRY glTexCoord1dv (const GLdouble *v); GLAPI void GLAPIENTRY glTexCoord1f (GLfloat s); GLAPI void GLAPIENTRY glTexCoord1fv (const GLfloat *v); GLAPI void GLAPIENTRY glTexCoord1i (GLint s); GLAPI void GLAPIENTRY glTexCoord1iv (const GLint *v); GLAPI void GLAPIENTRY glTexCoord1s (GLshort s); GLAPI void GLAPIENTRY glTexCoord1sv (const GLshort *v); GLAPI void GLAPIENTRY glTexCoord2d (GLdouble s, GLdouble t); GLAPI void GLAPIENTRY glTexCoord2dv (const GLdouble *v); GLAPI void GLAPIENTRY glTexCoord2f (GLfloat s, GLfloat t); GLAPI void GLAPIENTRY glTexCoord2fv (const GLfloat *v); GLAPI void GLAPIENTRY glTexCoord2i (GLint s, GLint t); GLAPI void GLAPIENTRY glTexCoord2iv (const GLint *v); GLAPI void GLAPIENTRY glTexCoord2s (GLshort s, GLshort t); GLAPI void GLAPIENTRY glTexCoord2sv (const GLshort *v); GLAPI void GLAPIENTRY glTexCoord3d (GLdouble s, GLdouble t, GLdouble r); GLAPI void GLAPIENTRY glTexCoord3dv (const GLdouble *v); GLAPI void GLAPIENTRY glTexCoord3f (GLfloat s, GLfloat t, GLfloat r); GLAPI void GLAPIENTRY glTexCoord3fv (const GLfloat *v); GLAPI void GLAPIENTRY glTexCoord3i (GLint s, GLint t, GLint r); GLAPI void GLAPIENTRY glTexCoord3iv (const GLint *v); GLAPI void GLAPIENTRY glTexCoord3s (GLshort s, GLshort t, GLshort r); GLAPI void GLAPIENTRY glTexCoord3sv (const GLshort *v); GLAPI void GLAPIENTRY glTexCoord4d (GLdouble s, GLdouble t, GLdouble r, GLdouble q); GLAPI void GLAPIENTRY glTexCoord4dv (const GLdouble *v); GLAPI void GLAPIENTRY glTexCoord4f (GLfloat s, GLfloat t, GLfloat r, GLfloat q); GLAPI void GLAPIENTRY glTexCoord4fv (const GLfloat *v); GLAPI void GLAPIENTRY glTexCoord4i (GLint s, GLint t, GLint r, GLint q); GLAPI void GLAPIENTRY glTexCoord4iv (const GLint *v); GLAPI void GLAPIENTRY glTexCoord4s (GLshort s, GLshort t, GLshort r, GLshort q); GLAPI void GLAPIENTRY glTexCoord4sv (const GLshort *v); GLAPI void GLAPIENTRY glTexCoordPointer (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); GLAPI void GLAPIENTRY glTexEnvf (GLenum target, GLenum pname, GLfloat param); GLAPI void GLAPIENTRY glTexEnvfv (GLenum target, GLenum pname, const GLfloat *params); GLAPI void GLAPIENTRY glTexEnvi (GLenum target, GLenum pname, GLint param); GLAPI void GLAPIENTRY glTexEnviv (GLenum target, GLenum pname, const GLint *params); GLAPI void GLAPIENTRY glTexGend (GLenum coord, GLenum pname, GLdouble param); GLAPI void GLAPIENTRY glTexGendv (GLenum coord, GLenum pname, const GLdouble *params); GLAPI void GLAPIENTRY glTexGenf (GLenum coord, GLenum pname, GLfloat param); GLAPI void GLAPIENTRY glTexGenfv (GLenum coord, GLenum pname, const GLfloat *params); GLAPI void GLAPIENTRY glTexGeni (GLenum coord, GLenum pname, GLint param); GLAPI void GLAPIENTRY glTexGeniv (GLenum coord, GLenum pname, const GLint *params); GLAPI void GLAPIENTRY glTexImage1D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels); GLAPI void GLAPIENTRY glTexImage2D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels); GLAPI void GLAPIENTRY glTexParameterf (GLenum target, GLenum pname, GLfloat param); GLAPI void GLAPIENTRY glTexParameterfv (GLenum target, GLenum pname, const GLfloat *params); GLAPI void GLAPIENTRY glTexParameteri (GLenum target, GLenum pname, GLint param); GLAPI void GLAPIENTRY glTexParameteriv (GLenum target, GLenum pname, const GLint *params); GLAPI void GLAPIENTRY glTexSubImage1D (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels); GLAPI void GLAPIENTRY glTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels); GLAPI void GLAPIENTRY glTranslated (GLdouble x, GLdouble y, GLdouble z); GLAPI void GLAPIENTRY glTranslatef (GLfloat x, GLfloat y, GLfloat z); GLAPI void GLAPIENTRY glVertex2d (GLdouble x, GLdouble y); GLAPI void GLAPIENTRY glVertex2dv (const GLdouble *v); GLAPI void GLAPIENTRY glVertex2f (GLfloat x, GLfloat y); GLAPI void GLAPIENTRY glVertex2fv (const GLfloat *v); GLAPI void GLAPIENTRY glVertex2i (GLint x, GLint y); GLAPI void GLAPIENTRY glVertex2iv (const GLint *v); GLAPI void GLAPIENTRY glVertex2s (GLshort x, GLshort y); GLAPI void GLAPIENTRY glVertex2sv (const GLshort *v); GLAPI void GLAPIENTRY glVertex3d (GLdouble x, GLdouble y, GLdouble z); GLAPI void GLAPIENTRY glVertex3dv (const GLdouble *v); GLAPI void GLAPIENTRY glVertex3f (GLfloat x, GLfloat y, GLfloat z); GLAPI void GLAPIENTRY glVertex3fv (const GLfloat *v); GLAPI void GLAPIENTRY glVertex3i (GLint x, GLint y, GLint z); GLAPI void GLAPIENTRY glVertex3iv (const GLint *v); GLAPI void GLAPIENTRY glVertex3s (GLshort x, GLshort y, GLshort z); GLAPI void GLAPIENTRY glVertex3sv (const GLshort *v); GLAPI void GLAPIENTRY glVertex4d (GLdouble x, GLdouble y, GLdouble z, GLdouble w); GLAPI void GLAPIENTRY glVertex4dv (const GLdouble *v); GLAPI void GLAPIENTRY glVertex4f (GLfloat x, GLfloat y, GLfloat z, GLfloat w); GLAPI void GLAPIENTRY glVertex4fv (const GLfloat *v); GLAPI void GLAPIENTRY glVertex4i (GLint x, GLint y, GLint z, GLint w); GLAPI void GLAPIENTRY glVertex4iv (const GLint *v); GLAPI void GLAPIENTRY glVertex4s (GLshort x, GLshort y, GLshort z, GLshort w); GLAPI void GLAPIENTRY glVertex4sv (const GLshort *v); GLAPI void GLAPIENTRY glVertexPointer (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); GLAPI void GLAPIENTRY glViewport (GLint x, GLint y, GLsizei width, GLsizei height); #define GLEW_VERSION_1_1 GLEW_GET_VAR(__GLEW_VERSION_1_1) #endif /* GL_VERSION_1_1 */ /* ---------------------------------- GLU ---------------------------------- */ #ifndef GLEW_NO_GLU /* this is where we can safely include GLU */ # if defined(__APPLE__) && defined(__MACH__) # include # else # include # endif #endif /* ----------------------------- GL_VERSION_1_2 ---------------------------- */ #ifndef GL_VERSION_1_2 #define GL_VERSION_1_2 1 #define GL_SMOOTH_POINT_SIZE_RANGE 0x0B12 #define GL_SMOOTH_POINT_SIZE_GRANULARITY 0x0B13 #define GL_SMOOTH_LINE_WIDTH_RANGE 0x0B22 #define GL_SMOOTH_LINE_WIDTH_GRANULARITY 0x0B23 #define GL_UNSIGNED_BYTE_3_3_2 0x8032 #define GL_UNSIGNED_SHORT_4_4_4_4 0x8033 #define GL_UNSIGNED_SHORT_5_5_5_1 0x8034 #define GL_UNSIGNED_INT_8_8_8_8 0x8035 #define GL_UNSIGNED_INT_10_10_10_2 0x8036 #define GL_RESCALE_NORMAL 0x803A #define GL_TEXTURE_BINDING_3D 0x806A #define GL_PACK_SKIP_IMAGES 0x806B #define GL_PACK_IMAGE_HEIGHT 0x806C #define GL_UNPACK_SKIP_IMAGES 0x806D #define GL_UNPACK_IMAGE_HEIGHT 0x806E #define GL_TEXTURE_3D 0x806F #define GL_PROXY_TEXTURE_3D 0x8070 #define GL_TEXTURE_DEPTH 0x8071 #define GL_TEXTURE_WRAP_R 0x8072 #define GL_MAX_3D_TEXTURE_SIZE 0x8073 #define GL_BGR 0x80E0 #define GL_BGRA 0x80E1 #define GL_MAX_ELEMENTS_VERTICES 0x80E8 #define GL_MAX_ELEMENTS_INDICES 0x80E9 #define GL_CLAMP_TO_EDGE 0x812F #define GL_TEXTURE_MIN_LOD 0x813A #define GL_TEXTURE_MAX_LOD 0x813B #define GL_TEXTURE_BASE_LEVEL 0x813C #define GL_TEXTURE_MAX_LEVEL 0x813D #define GL_LIGHT_MODEL_COLOR_CONTROL 0x81F8 #define GL_SINGLE_COLOR 0x81F9 #define GL_SEPARATE_SPECULAR_COLOR 0x81FA #define GL_UNSIGNED_BYTE_2_3_3_REV 0x8362 #define GL_UNSIGNED_SHORT_5_6_5 0x8363 #define GL_UNSIGNED_SHORT_5_6_5_REV 0x8364 #define GL_UNSIGNED_SHORT_4_4_4_4_REV 0x8365 #define GL_UNSIGNED_SHORT_1_5_5_5_REV 0x8366 #define GL_UNSIGNED_INT_8_8_8_8_REV 0x8367 #define GL_UNSIGNED_INT_2_10_10_10_REV 0x8368 #define GL_ALIASED_POINT_SIZE_RANGE 0x846D #define GL_ALIASED_LINE_WIDTH_RANGE 0x846E typedef void (GLAPIENTRY * PFNGLCOPYTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); typedef void (GLAPIENTRY * PFNGLDRAWRANGEELEMENTSPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices); typedef void (GLAPIENTRY * PFNGLTEXIMAGE3DPROC) (GLenum target, GLint level, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels); typedef void (GLAPIENTRY * PFNGLTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels); #define glCopyTexSubImage3D GLEW_GET_FUN(__glewCopyTexSubImage3D) #define glDrawRangeElements GLEW_GET_FUN(__glewDrawRangeElements) #define glTexImage3D GLEW_GET_FUN(__glewTexImage3D) #define glTexSubImage3D GLEW_GET_FUN(__glewTexSubImage3D) #define GLEW_VERSION_1_2 GLEW_GET_VAR(__GLEW_VERSION_1_2) #endif /* GL_VERSION_1_2 */ /* ---------------------------- GL_VERSION_1_2_1 --------------------------- */ #ifndef GL_VERSION_1_2_1 #define GL_VERSION_1_2_1 1 #define GLEW_VERSION_1_2_1 GLEW_GET_VAR(__GLEW_VERSION_1_2_1) #endif /* GL_VERSION_1_2_1 */ /* ----------------------------- GL_VERSION_1_3 ---------------------------- */ #ifndef GL_VERSION_1_3 #define GL_VERSION_1_3 1 #define GL_MULTISAMPLE 0x809D #define GL_SAMPLE_ALPHA_TO_COVERAGE 0x809E #define GL_SAMPLE_ALPHA_TO_ONE 0x809F #define GL_SAMPLE_COVERAGE 0x80A0 #define GL_SAMPLE_BUFFERS 0x80A8 #define GL_SAMPLES 0x80A9 #define GL_SAMPLE_COVERAGE_VALUE 0x80AA #define GL_SAMPLE_COVERAGE_INVERT 0x80AB #define GL_CLAMP_TO_BORDER 0x812D #define GL_TEXTURE0 0x84C0 #define GL_TEXTURE1 0x84C1 #define GL_TEXTURE2 0x84C2 #define GL_TEXTURE3 0x84C3 #define GL_TEXTURE4 0x84C4 #define GL_TEXTURE5 0x84C5 #define GL_TEXTURE6 0x84C6 #define GL_TEXTURE7 0x84C7 #define GL_TEXTURE8 0x84C8 #define GL_TEXTURE9 0x84C9 #define GL_TEXTURE10 0x84CA #define GL_TEXTURE11 0x84CB #define GL_TEXTURE12 0x84CC #define GL_TEXTURE13 0x84CD #define GL_TEXTURE14 0x84CE #define GL_TEXTURE15 0x84CF #define GL_TEXTURE16 0x84D0 #define GL_TEXTURE17 0x84D1 #define GL_TEXTURE18 0x84D2 #define GL_TEXTURE19 0x84D3 #define GL_TEXTURE20 0x84D4 #define GL_TEXTURE21 0x84D5 #define GL_TEXTURE22 0x84D6 #define GL_TEXTURE23 0x84D7 #define GL_TEXTURE24 0x84D8 #define GL_TEXTURE25 0x84D9 #define GL_TEXTURE26 0x84DA #define GL_TEXTURE27 0x84DB #define GL_TEXTURE28 0x84DC #define GL_TEXTURE29 0x84DD #define GL_TEXTURE30 0x84DE #define GL_TEXTURE31 0x84DF #define GL_ACTIVE_TEXTURE 0x84E0 #define GL_CLIENT_ACTIVE_TEXTURE 0x84E1 #define GL_MAX_TEXTURE_UNITS 0x84E2 #define GL_TRANSPOSE_MODELVIEW_MATRIX 0x84E3 #define GL_TRANSPOSE_PROJECTION_MATRIX 0x84E4 #define GL_TRANSPOSE_TEXTURE_MATRIX 0x84E5 #define GL_TRANSPOSE_COLOR_MATRIX 0x84E6 #define GL_SUBTRACT 0x84E7 #define GL_COMPRESSED_ALPHA 0x84E9 #define GL_COMPRESSED_LUMINANCE 0x84EA #define GL_COMPRESSED_LUMINANCE_ALPHA 0x84EB #define GL_COMPRESSED_INTENSITY 0x84EC #define GL_COMPRESSED_RGB 0x84ED #define GL_COMPRESSED_RGBA 0x84EE #define GL_TEXTURE_COMPRESSION_HINT 0x84EF #define GL_NORMAL_MAP 0x8511 #define GL_REFLECTION_MAP 0x8512 #define GL_TEXTURE_CUBE_MAP 0x8513 #define GL_TEXTURE_BINDING_CUBE_MAP 0x8514 #define GL_TEXTURE_CUBE_MAP_POSITIVE_X 0x8515 #define GL_TEXTURE_CUBE_MAP_NEGATIVE_X 0x8516 #define GL_TEXTURE_CUBE_MAP_POSITIVE_Y 0x8517 #define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y 0x8518 #define GL_TEXTURE_CUBE_MAP_POSITIVE_Z 0x8519 #define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z 0x851A #define GL_PROXY_TEXTURE_CUBE_MAP 0x851B #define GL_MAX_CUBE_MAP_TEXTURE_SIZE 0x851C #define GL_COMBINE 0x8570 #define GL_COMBINE_RGB 0x8571 #define GL_COMBINE_ALPHA 0x8572 #define GL_RGB_SCALE 0x8573 #define GL_ADD_SIGNED 0x8574 #define GL_INTERPOLATE 0x8575 #define GL_CONSTANT 0x8576 #define GL_PRIMARY_COLOR 0x8577 #define GL_PREVIOUS 0x8578 #define GL_SOURCE0_RGB 0x8580 #define GL_SOURCE1_RGB 0x8581 #define GL_SOURCE2_RGB 0x8582 #define GL_SOURCE0_ALPHA 0x8588 #define GL_SOURCE1_ALPHA 0x8589 #define GL_SOURCE2_ALPHA 0x858A #define GL_OPERAND0_RGB 0x8590 #define GL_OPERAND1_RGB 0x8591 #define GL_OPERAND2_RGB 0x8592 #define GL_OPERAND0_ALPHA 0x8598 #define GL_OPERAND1_ALPHA 0x8599 #define GL_OPERAND2_ALPHA 0x859A #define GL_TEXTURE_COMPRESSED_IMAGE_SIZE 0x86A0 #define GL_TEXTURE_COMPRESSED 0x86A1 #define GL_NUM_COMPRESSED_TEXTURE_FORMATS 0x86A2 #define GL_COMPRESSED_TEXTURE_FORMATS 0x86A3 #define GL_DOT3_RGB 0x86AE #define GL_DOT3_RGBA 0x86AF #define GL_MULTISAMPLE_BIT 0x20000000 typedef void (GLAPIENTRY * PFNGLACTIVETEXTUREPROC) (GLenum texture); typedef void (GLAPIENTRY * PFNGLCLIENTACTIVETEXTUREPROC) (GLenum texture); typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXIMAGE1DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data); typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXIMAGE2DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data); typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXIMAGE3DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data); typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data); typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data); typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data); typedef void (GLAPIENTRY * PFNGLGETCOMPRESSEDTEXIMAGEPROC) (GLenum target, GLint lod, GLvoid *img); typedef void (GLAPIENTRY * PFNGLLOADTRANSPOSEMATRIXDPROC) (const GLdouble m[16]); typedef void (GLAPIENTRY * PFNGLLOADTRANSPOSEMATRIXFPROC) (const GLfloat m[16]); typedef void (GLAPIENTRY * PFNGLMULTTRANSPOSEMATRIXDPROC) (const GLdouble m[16]); typedef void (GLAPIENTRY * PFNGLMULTTRANSPOSEMATRIXFPROC) (const GLfloat m[16]); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1DPROC) (GLenum target, GLdouble s); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1DVPROC) (GLenum target, const GLdouble *v); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1FPROC) (GLenum target, GLfloat s); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1FVPROC) (GLenum target, const GLfloat *v); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1IPROC) (GLenum target, GLint s); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1IVPROC) (GLenum target, const GLint *v); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1SPROC) (GLenum target, GLshort s); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1SVPROC) (GLenum target, const GLshort *v); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2DPROC) (GLenum target, GLdouble s, GLdouble t); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2DVPROC) (GLenum target, const GLdouble *v); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2FPROC) (GLenum target, GLfloat s, GLfloat t); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2FVPROC) (GLenum target, const GLfloat *v); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2IPROC) (GLenum target, GLint s, GLint t); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2IVPROC) (GLenum target, const GLint *v); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2SPROC) (GLenum target, GLshort s, GLshort t); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2SVPROC) (GLenum target, const GLshort *v); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3DPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3DVPROC) (GLenum target, const GLdouble *v); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3FPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3FVPROC) (GLenum target, const GLfloat *v); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3IPROC) (GLenum target, GLint s, GLint t, GLint r); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3IVPROC) (GLenum target, const GLint *v); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3SPROC) (GLenum target, GLshort s, GLshort t, GLshort r); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3SVPROC) (GLenum target, const GLshort *v); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4DPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4DVPROC) (GLenum target, const GLdouble *v); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4FPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4FVPROC) (GLenum target, const GLfloat *v); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4IPROC) (GLenum target, GLint s, GLint t, GLint r, GLint q); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4IVPROC) (GLenum target, const GLint *v); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4SPROC) (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4SVPROC) (GLenum target, const GLshort *v); typedef void (GLAPIENTRY * PFNGLSAMPLECOVERAGEPROC) (GLclampf value, GLboolean invert); #define glActiveTexture GLEW_GET_FUN(__glewActiveTexture) #define glClientActiveTexture GLEW_GET_FUN(__glewClientActiveTexture) #define glCompressedTexImage1D GLEW_GET_FUN(__glewCompressedTexImage1D) #define glCompressedTexImage2D GLEW_GET_FUN(__glewCompressedTexImage2D) #define glCompressedTexImage3D GLEW_GET_FUN(__glewCompressedTexImage3D) #define glCompressedTexSubImage1D GLEW_GET_FUN(__glewCompressedTexSubImage1D) #define glCompressedTexSubImage2D GLEW_GET_FUN(__glewCompressedTexSubImage2D) #define glCompressedTexSubImage3D GLEW_GET_FUN(__glewCompressedTexSubImage3D) #define glGetCompressedTexImage GLEW_GET_FUN(__glewGetCompressedTexImage) #define glLoadTransposeMatrixd GLEW_GET_FUN(__glewLoadTransposeMatrixd) #define glLoadTransposeMatrixf GLEW_GET_FUN(__glewLoadTransposeMatrixf) #define glMultTransposeMatrixd GLEW_GET_FUN(__glewMultTransposeMatrixd) #define glMultTransposeMatrixf GLEW_GET_FUN(__glewMultTransposeMatrixf) #define glMultiTexCoord1d GLEW_GET_FUN(__glewMultiTexCoord1d) #define glMultiTexCoord1dv GLEW_GET_FUN(__glewMultiTexCoord1dv) #define glMultiTexCoord1f GLEW_GET_FUN(__glewMultiTexCoord1f) #define glMultiTexCoord1fv GLEW_GET_FUN(__glewMultiTexCoord1fv) #define glMultiTexCoord1i GLEW_GET_FUN(__glewMultiTexCoord1i) #define glMultiTexCoord1iv GLEW_GET_FUN(__glewMultiTexCoord1iv) #define glMultiTexCoord1s GLEW_GET_FUN(__glewMultiTexCoord1s) #define glMultiTexCoord1sv GLEW_GET_FUN(__glewMultiTexCoord1sv) #define glMultiTexCoord2d GLEW_GET_FUN(__glewMultiTexCoord2d) #define glMultiTexCoord2dv GLEW_GET_FUN(__glewMultiTexCoord2dv) #define glMultiTexCoord2f GLEW_GET_FUN(__glewMultiTexCoord2f) #define glMultiTexCoord2fv GLEW_GET_FUN(__glewMultiTexCoord2fv) #define glMultiTexCoord2i GLEW_GET_FUN(__glewMultiTexCoord2i) #define glMultiTexCoord2iv GLEW_GET_FUN(__glewMultiTexCoord2iv) #define glMultiTexCoord2s GLEW_GET_FUN(__glewMultiTexCoord2s) #define glMultiTexCoord2sv GLEW_GET_FUN(__glewMultiTexCoord2sv) #define glMultiTexCoord3d GLEW_GET_FUN(__glewMultiTexCoord3d) #define glMultiTexCoord3dv GLEW_GET_FUN(__glewMultiTexCoord3dv) #define glMultiTexCoord3f GLEW_GET_FUN(__glewMultiTexCoord3f) #define glMultiTexCoord3fv GLEW_GET_FUN(__glewMultiTexCoord3fv) #define glMultiTexCoord3i GLEW_GET_FUN(__glewMultiTexCoord3i) #define glMultiTexCoord3iv GLEW_GET_FUN(__glewMultiTexCoord3iv) #define glMultiTexCoord3s GLEW_GET_FUN(__glewMultiTexCoord3s) #define glMultiTexCoord3sv GLEW_GET_FUN(__glewMultiTexCoord3sv) #define glMultiTexCoord4d GLEW_GET_FUN(__glewMultiTexCoord4d) #define glMultiTexCoord4dv GLEW_GET_FUN(__glewMultiTexCoord4dv) #define glMultiTexCoord4f GLEW_GET_FUN(__glewMultiTexCoord4f) #define glMultiTexCoord4fv GLEW_GET_FUN(__glewMultiTexCoord4fv) #define glMultiTexCoord4i GLEW_GET_FUN(__glewMultiTexCoord4i) #define glMultiTexCoord4iv GLEW_GET_FUN(__glewMultiTexCoord4iv) #define glMultiTexCoord4s GLEW_GET_FUN(__glewMultiTexCoord4s) #define glMultiTexCoord4sv GLEW_GET_FUN(__glewMultiTexCoord4sv) #define glSampleCoverage GLEW_GET_FUN(__glewSampleCoverage) #define GLEW_VERSION_1_3 GLEW_GET_VAR(__GLEW_VERSION_1_3) #endif /* GL_VERSION_1_3 */ /* ----------------------------- GL_VERSION_1_4 ---------------------------- */ #ifndef GL_VERSION_1_4 #define GL_VERSION_1_4 1 #define GL_BLEND_DST_RGB 0x80C8 #define GL_BLEND_SRC_RGB 0x80C9 #define GL_BLEND_DST_ALPHA 0x80CA #define GL_BLEND_SRC_ALPHA 0x80CB #define GL_POINT_SIZE_MIN 0x8126 #define GL_POINT_SIZE_MAX 0x8127 #define GL_POINT_FADE_THRESHOLD_SIZE 0x8128 #define GL_POINT_DISTANCE_ATTENUATION 0x8129 #define GL_GENERATE_MIPMAP 0x8191 #define GL_GENERATE_MIPMAP_HINT 0x8192 #define GL_DEPTH_COMPONENT16 0x81A5 #define GL_DEPTH_COMPONENT24 0x81A6 #define GL_DEPTH_COMPONENT32 0x81A7 #define GL_MIRRORED_REPEAT 0x8370 #define GL_FOG_COORDINATE_SOURCE 0x8450 #define GL_FOG_COORDINATE 0x8451 #define GL_FRAGMENT_DEPTH 0x8452 #define GL_CURRENT_FOG_COORDINATE 0x8453 #define GL_FOG_COORDINATE_ARRAY_TYPE 0x8454 #define GL_FOG_COORDINATE_ARRAY_STRIDE 0x8455 #define GL_FOG_COORDINATE_ARRAY_POINTER 0x8456 #define GL_FOG_COORDINATE_ARRAY 0x8457 #define GL_COLOR_SUM 0x8458 #define GL_CURRENT_SECONDARY_COLOR 0x8459 #define GL_SECONDARY_COLOR_ARRAY_SIZE 0x845A #define GL_SECONDARY_COLOR_ARRAY_TYPE 0x845B #define GL_SECONDARY_COLOR_ARRAY_STRIDE 0x845C #define GL_SECONDARY_COLOR_ARRAY_POINTER 0x845D #define GL_SECONDARY_COLOR_ARRAY 0x845E #define GL_MAX_TEXTURE_LOD_BIAS 0x84FD #define GL_TEXTURE_FILTER_CONTROL 0x8500 #define GL_TEXTURE_LOD_BIAS 0x8501 #define GL_INCR_WRAP 0x8507 #define GL_DECR_WRAP 0x8508 #define GL_TEXTURE_DEPTH_SIZE 0x884A #define GL_DEPTH_TEXTURE_MODE 0x884B #define GL_TEXTURE_COMPARE_MODE 0x884C #define GL_TEXTURE_COMPARE_FUNC 0x884D #define GL_COMPARE_R_TO_TEXTURE 0x884E typedef void (GLAPIENTRY * PFNGLBLENDCOLORPROC) (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONPROC) (GLenum mode); typedef void (GLAPIENTRY * PFNGLBLENDFUNCSEPARATEPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); typedef void (GLAPIENTRY * PFNGLFOGCOORDPOINTERPROC) (GLenum type, GLsizei stride, const GLvoid *pointer); typedef void (GLAPIENTRY * PFNGLFOGCOORDDPROC) (GLdouble coord); typedef void (GLAPIENTRY * PFNGLFOGCOORDDVPROC) (const GLdouble *coord); typedef void (GLAPIENTRY * PFNGLFOGCOORDFPROC) (GLfloat coord); typedef void (GLAPIENTRY * PFNGLFOGCOORDFVPROC) (const GLfloat *coord); typedef void (GLAPIENTRY * PFNGLMULTIDRAWARRAYSPROC) (GLenum mode, const GLint *first, const GLsizei *count, GLsizei drawcount); typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTSPROC) (GLenum mode, const GLsizei *count, GLenum type, const GLvoid **indices, GLsizei drawcount); typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERFPROC) (GLenum pname, GLfloat param); typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERFVPROC) (GLenum pname, const GLfloat *params); typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERIPROC) (GLenum pname, GLint param); typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERIVPROC) (GLenum pname, const GLint *params); typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3BPROC) (GLbyte red, GLbyte green, GLbyte blue); typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3BVPROC) (const GLbyte *v); typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3DPROC) (GLdouble red, GLdouble green, GLdouble blue); typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3DVPROC) (const GLdouble *v); typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3FPROC) (GLfloat red, GLfloat green, GLfloat blue); typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3FVPROC) (const GLfloat *v); typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3IPROC) (GLint red, GLint green, GLint blue); typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3IVPROC) (const GLint *v); typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3SPROC) (GLshort red, GLshort green, GLshort blue); typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3SVPROC) (const GLshort *v); typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3UBPROC) (GLubyte red, GLubyte green, GLubyte blue); typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3UBVPROC) (const GLubyte *v); typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3UIPROC) (GLuint red, GLuint green, GLuint blue); typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3UIVPROC) (const GLuint *v); typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3USPROC) (GLushort red, GLushort green, GLushort blue); typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3USVPROC) (const GLushort *v); typedef void (GLAPIENTRY * PFNGLSECONDARYCOLORPOINTERPROC) (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); typedef void (GLAPIENTRY * PFNGLWINDOWPOS2DPROC) (GLdouble x, GLdouble y); typedef void (GLAPIENTRY * PFNGLWINDOWPOS2DVPROC) (const GLdouble *p); typedef void (GLAPIENTRY * PFNGLWINDOWPOS2FPROC) (GLfloat x, GLfloat y); typedef void (GLAPIENTRY * PFNGLWINDOWPOS2FVPROC) (const GLfloat *p); typedef void (GLAPIENTRY * PFNGLWINDOWPOS2IPROC) (GLint x, GLint y); typedef void (GLAPIENTRY * PFNGLWINDOWPOS2IVPROC) (const GLint *p); typedef void (GLAPIENTRY * PFNGLWINDOWPOS2SPROC) (GLshort x, GLshort y); typedef void (GLAPIENTRY * PFNGLWINDOWPOS2SVPROC) (const GLshort *p); typedef void (GLAPIENTRY * PFNGLWINDOWPOS3DPROC) (GLdouble x, GLdouble y, GLdouble z); typedef void (GLAPIENTRY * PFNGLWINDOWPOS3DVPROC) (const GLdouble *p); typedef void (GLAPIENTRY * PFNGLWINDOWPOS3FPROC) (GLfloat x, GLfloat y, GLfloat z); typedef void (GLAPIENTRY * PFNGLWINDOWPOS3FVPROC) (const GLfloat *p); typedef void (GLAPIENTRY * PFNGLWINDOWPOS3IPROC) (GLint x, GLint y, GLint z); typedef void (GLAPIENTRY * PFNGLWINDOWPOS3IVPROC) (const GLint *p); typedef void (GLAPIENTRY * PFNGLWINDOWPOS3SPROC) (GLshort x, GLshort y, GLshort z); typedef void (GLAPIENTRY * PFNGLWINDOWPOS3SVPROC) (const GLshort *p); #define glBlendColor GLEW_GET_FUN(__glewBlendColor) #define glBlendEquation GLEW_GET_FUN(__glewBlendEquation) #define glBlendFuncSeparate GLEW_GET_FUN(__glewBlendFuncSeparate) #define glFogCoordPointer GLEW_GET_FUN(__glewFogCoordPointer) #define glFogCoordd GLEW_GET_FUN(__glewFogCoordd) #define glFogCoorddv GLEW_GET_FUN(__glewFogCoorddv) #define glFogCoordf GLEW_GET_FUN(__glewFogCoordf) #define glFogCoordfv GLEW_GET_FUN(__glewFogCoordfv) #define glMultiDrawArrays GLEW_GET_FUN(__glewMultiDrawArrays) #define glMultiDrawElements GLEW_GET_FUN(__glewMultiDrawElements) #define glPointParameterf GLEW_GET_FUN(__glewPointParameterf) #define glPointParameterfv GLEW_GET_FUN(__glewPointParameterfv) #define glPointParameteri GLEW_GET_FUN(__glewPointParameteri) #define glPointParameteriv GLEW_GET_FUN(__glewPointParameteriv) #define glSecondaryColor3b GLEW_GET_FUN(__glewSecondaryColor3b) #define glSecondaryColor3bv GLEW_GET_FUN(__glewSecondaryColor3bv) #define glSecondaryColor3d GLEW_GET_FUN(__glewSecondaryColor3d) #define glSecondaryColor3dv GLEW_GET_FUN(__glewSecondaryColor3dv) #define glSecondaryColor3f GLEW_GET_FUN(__glewSecondaryColor3f) #define glSecondaryColor3fv GLEW_GET_FUN(__glewSecondaryColor3fv) #define glSecondaryColor3i GLEW_GET_FUN(__glewSecondaryColor3i) #define glSecondaryColor3iv GLEW_GET_FUN(__glewSecondaryColor3iv) #define glSecondaryColor3s GLEW_GET_FUN(__glewSecondaryColor3s) #define glSecondaryColor3sv GLEW_GET_FUN(__glewSecondaryColor3sv) #define glSecondaryColor3ub GLEW_GET_FUN(__glewSecondaryColor3ub) #define glSecondaryColor3ubv GLEW_GET_FUN(__glewSecondaryColor3ubv) #define glSecondaryColor3ui GLEW_GET_FUN(__glewSecondaryColor3ui) #define glSecondaryColor3uiv GLEW_GET_FUN(__glewSecondaryColor3uiv) #define glSecondaryColor3us GLEW_GET_FUN(__glewSecondaryColor3us) #define glSecondaryColor3usv GLEW_GET_FUN(__glewSecondaryColor3usv) #define glSecondaryColorPointer GLEW_GET_FUN(__glewSecondaryColorPointer) #define glWindowPos2d GLEW_GET_FUN(__glewWindowPos2d) #define glWindowPos2dv GLEW_GET_FUN(__glewWindowPos2dv) #define glWindowPos2f GLEW_GET_FUN(__glewWindowPos2f) #define glWindowPos2fv GLEW_GET_FUN(__glewWindowPos2fv) #define glWindowPos2i GLEW_GET_FUN(__glewWindowPos2i) #define glWindowPos2iv GLEW_GET_FUN(__glewWindowPos2iv) #define glWindowPos2s GLEW_GET_FUN(__glewWindowPos2s) #define glWindowPos2sv GLEW_GET_FUN(__glewWindowPos2sv) #define glWindowPos3d GLEW_GET_FUN(__glewWindowPos3d) #define glWindowPos3dv GLEW_GET_FUN(__glewWindowPos3dv) #define glWindowPos3f GLEW_GET_FUN(__glewWindowPos3f) #define glWindowPos3fv GLEW_GET_FUN(__glewWindowPos3fv) #define glWindowPos3i GLEW_GET_FUN(__glewWindowPos3i) #define glWindowPos3iv GLEW_GET_FUN(__glewWindowPos3iv) #define glWindowPos3s GLEW_GET_FUN(__glewWindowPos3s) #define glWindowPos3sv GLEW_GET_FUN(__glewWindowPos3sv) #define GLEW_VERSION_1_4 GLEW_GET_VAR(__GLEW_VERSION_1_4) #endif /* GL_VERSION_1_4 */ /* ----------------------------- GL_VERSION_1_5 ---------------------------- */ #ifndef GL_VERSION_1_5 #define GL_VERSION_1_5 1 #define GL_FOG_COORD_SRC GL_FOG_COORDINATE_SOURCE #define GL_FOG_COORD GL_FOG_COORDINATE #define GL_FOG_COORD_ARRAY GL_FOG_COORDINATE_ARRAY #define GL_SRC0_RGB GL_SOURCE0_RGB #define GL_FOG_COORD_ARRAY_POINTER GL_FOG_COORDINATE_ARRAY_POINTER #define GL_FOG_COORD_ARRAY_TYPE GL_FOG_COORDINATE_ARRAY_TYPE #define GL_SRC1_ALPHA GL_SOURCE1_ALPHA #define GL_CURRENT_FOG_COORD GL_CURRENT_FOG_COORDINATE #define GL_FOG_COORD_ARRAY_STRIDE GL_FOG_COORDINATE_ARRAY_STRIDE #define GL_SRC0_ALPHA GL_SOURCE0_ALPHA #define GL_SRC1_RGB GL_SOURCE1_RGB #define GL_FOG_COORD_ARRAY_BUFFER_BINDING GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING #define GL_SRC2_ALPHA GL_SOURCE2_ALPHA #define GL_SRC2_RGB GL_SOURCE2_RGB #define GL_BUFFER_SIZE 0x8764 #define GL_BUFFER_USAGE 0x8765 #define GL_QUERY_COUNTER_BITS 0x8864 #define GL_CURRENT_QUERY 0x8865 #define GL_QUERY_RESULT 0x8866 #define GL_QUERY_RESULT_AVAILABLE 0x8867 #define GL_ARRAY_BUFFER 0x8892 #define GL_ELEMENT_ARRAY_BUFFER 0x8893 #define GL_ARRAY_BUFFER_BINDING 0x8894 #define GL_ELEMENT_ARRAY_BUFFER_BINDING 0x8895 #define GL_VERTEX_ARRAY_BUFFER_BINDING 0x8896 #define GL_NORMAL_ARRAY_BUFFER_BINDING 0x8897 #define GL_COLOR_ARRAY_BUFFER_BINDING 0x8898 #define GL_INDEX_ARRAY_BUFFER_BINDING 0x8899 #define GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING 0x889A #define GL_EDGE_FLAG_ARRAY_BUFFER_BINDING 0x889B #define GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING 0x889C #define GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING 0x889D #define GL_WEIGHT_ARRAY_BUFFER_BINDING 0x889E #define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING 0x889F #define GL_READ_ONLY 0x88B8 #define GL_WRITE_ONLY 0x88B9 #define GL_READ_WRITE 0x88BA #define GL_BUFFER_ACCESS 0x88BB #define GL_BUFFER_MAPPED 0x88BC #define GL_BUFFER_MAP_POINTER 0x88BD #define GL_STREAM_DRAW 0x88E0 #define GL_STREAM_READ 0x88E1 #define GL_STREAM_COPY 0x88E2 #define GL_STATIC_DRAW 0x88E4 #define GL_STATIC_READ 0x88E5 #define GL_STATIC_COPY 0x88E6 #define GL_DYNAMIC_DRAW 0x88E8 #define GL_DYNAMIC_READ 0x88E9 #define GL_DYNAMIC_COPY 0x88EA #define GL_SAMPLES_PASSED 0x8914 typedef ptrdiff_t GLintptr; typedef ptrdiff_t GLsizeiptr; typedef void (GLAPIENTRY * PFNGLBEGINQUERYPROC) (GLenum target, GLuint id); typedef void (GLAPIENTRY * PFNGLBINDBUFFERPROC) (GLenum target, GLuint buffer); typedef void (GLAPIENTRY * PFNGLBUFFERDATAPROC) (GLenum target, GLsizeiptr size, const GLvoid* data, GLenum usage); typedef void (GLAPIENTRY * PFNGLBUFFERSUBDATAPROC) (GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid* data); typedef void (GLAPIENTRY * PFNGLDELETEBUFFERSPROC) (GLsizei n, const GLuint* buffers); typedef void (GLAPIENTRY * PFNGLDELETEQUERIESPROC) (GLsizei n, const GLuint* ids); typedef void (GLAPIENTRY * PFNGLENDQUERYPROC) (GLenum target); typedef void (GLAPIENTRY * PFNGLGENBUFFERSPROC) (GLsizei n, GLuint* buffers); typedef void (GLAPIENTRY * PFNGLGENQUERIESPROC) (GLsizei n, GLuint* ids); typedef void (GLAPIENTRY * PFNGLGETBUFFERPARAMETERIVPROC) (GLenum target, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLGETBUFFERPOINTERVPROC) (GLenum target, GLenum pname, GLvoid** params); typedef void (GLAPIENTRY * PFNGLGETBUFFERSUBDATAPROC) (GLenum target, GLintptr offset, GLsizeiptr size, GLvoid* data); typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTIVPROC) (GLuint id, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTUIVPROC) (GLuint id, GLenum pname, GLuint* params); typedef void (GLAPIENTRY * PFNGLGETQUERYIVPROC) (GLenum target, GLenum pname, GLint* params); typedef GLboolean (GLAPIENTRY * PFNGLISBUFFERPROC) (GLuint buffer); typedef GLboolean (GLAPIENTRY * PFNGLISQUERYPROC) (GLuint id); typedef GLvoid* (GLAPIENTRY * PFNGLMAPBUFFERPROC) (GLenum target, GLenum access); typedef GLboolean (GLAPIENTRY * PFNGLUNMAPBUFFERPROC) (GLenum target); #define glBeginQuery GLEW_GET_FUN(__glewBeginQuery) #define glBindBuffer GLEW_GET_FUN(__glewBindBuffer) #define glBufferData GLEW_GET_FUN(__glewBufferData) #define glBufferSubData GLEW_GET_FUN(__glewBufferSubData) #define glDeleteBuffers GLEW_GET_FUN(__glewDeleteBuffers) #define glDeleteQueries GLEW_GET_FUN(__glewDeleteQueries) #define glEndQuery GLEW_GET_FUN(__glewEndQuery) #define glGenBuffers GLEW_GET_FUN(__glewGenBuffers) #define glGenQueries GLEW_GET_FUN(__glewGenQueries) #define glGetBufferParameteriv GLEW_GET_FUN(__glewGetBufferParameteriv) #define glGetBufferPointerv GLEW_GET_FUN(__glewGetBufferPointerv) #define glGetBufferSubData GLEW_GET_FUN(__glewGetBufferSubData) #define glGetQueryObjectiv GLEW_GET_FUN(__glewGetQueryObjectiv) #define glGetQueryObjectuiv GLEW_GET_FUN(__glewGetQueryObjectuiv) #define glGetQueryiv GLEW_GET_FUN(__glewGetQueryiv) #define glIsBuffer GLEW_GET_FUN(__glewIsBuffer) #define glIsQuery GLEW_GET_FUN(__glewIsQuery) #define glMapBuffer GLEW_GET_FUN(__glewMapBuffer) #define glUnmapBuffer GLEW_GET_FUN(__glewUnmapBuffer) #define GLEW_VERSION_1_5 GLEW_GET_VAR(__GLEW_VERSION_1_5) #endif /* GL_VERSION_1_5 */ /* ----------------------------- GL_VERSION_2_0 ---------------------------- */ #ifndef GL_VERSION_2_0 #define GL_VERSION_2_0 1 #define GL_BLEND_EQUATION_RGB GL_BLEND_EQUATION #define GL_VERTEX_ATTRIB_ARRAY_ENABLED 0x8622 #define GL_VERTEX_ATTRIB_ARRAY_SIZE 0x8623 #define GL_VERTEX_ATTRIB_ARRAY_STRIDE 0x8624 #define GL_VERTEX_ATTRIB_ARRAY_TYPE 0x8625 #define GL_CURRENT_VERTEX_ATTRIB 0x8626 #define GL_VERTEX_PROGRAM_POINT_SIZE 0x8642 #define GL_VERTEX_PROGRAM_TWO_SIDE 0x8643 #define GL_VERTEX_ATTRIB_ARRAY_POINTER 0x8645 #define GL_STENCIL_BACK_FUNC 0x8800 #define GL_STENCIL_BACK_FAIL 0x8801 #define GL_STENCIL_BACK_PASS_DEPTH_FAIL 0x8802 #define GL_STENCIL_BACK_PASS_DEPTH_PASS 0x8803 #define GL_MAX_DRAW_BUFFERS 0x8824 #define GL_DRAW_BUFFER0 0x8825 #define GL_DRAW_BUFFER1 0x8826 #define GL_DRAW_BUFFER2 0x8827 #define GL_DRAW_BUFFER3 0x8828 #define GL_DRAW_BUFFER4 0x8829 #define GL_DRAW_BUFFER5 0x882A #define GL_DRAW_BUFFER6 0x882B #define GL_DRAW_BUFFER7 0x882C #define GL_DRAW_BUFFER8 0x882D #define GL_DRAW_BUFFER9 0x882E #define GL_DRAW_BUFFER10 0x882F #define GL_DRAW_BUFFER11 0x8830 #define GL_DRAW_BUFFER12 0x8831 #define GL_DRAW_BUFFER13 0x8832 #define GL_DRAW_BUFFER14 0x8833 #define GL_DRAW_BUFFER15 0x8834 #define GL_BLEND_EQUATION_ALPHA 0x883D #define GL_POINT_SPRITE 0x8861 #define GL_COORD_REPLACE 0x8862 #define GL_MAX_VERTEX_ATTRIBS 0x8869 #define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED 0x886A #define GL_MAX_TEXTURE_COORDS 0x8871 #define GL_MAX_TEXTURE_IMAGE_UNITS 0x8872 #define GL_FRAGMENT_SHADER 0x8B30 #define GL_VERTEX_SHADER 0x8B31 #define GL_MAX_FRAGMENT_UNIFORM_COMPONENTS 0x8B49 #define GL_MAX_VERTEX_UNIFORM_COMPONENTS 0x8B4A #define GL_MAX_VARYING_FLOATS 0x8B4B #define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS 0x8B4C #define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS 0x8B4D #define GL_SHADER_TYPE 0x8B4F #define GL_FLOAT_VEC2 0x8B50 #define GL_FLOAT_VEC3 0x8B51 #define GL_FLOAT_VEC4 0x8B52 #define GL_INT_VEC2 0x8B53 #define GL_INT_VEC3 0x8B54 #define GL_INT_VEC4 0x8B55 #define GL_BOOL 0x8B56 #define GL_BOOL_VEC2 0x8B57 #define GL_BOOL_VEC3 0x8B58 #define GL_BOOL_VEC4 0x8B59 #define GL_FLOAT_MAT2 0x8B5A #define GL_FLOAT_MAT3 0x8B5B #define GL_FLOAT_MAT4 0x8B5C #define GL_SAMPLER_1D 0x8B5D #define GL_SAMPLER_2D 0x8B5E #define GL_SAMPLER_3D 0x8B5F #define GL_SAMPLER_CUBE 0x8B60 #define GL_SAMPLER_1D_SHADOW 0x8B61 #define GL_SAMPLER_2D_SHADOW 0x8B62 #define GL_DELETE_STATUS 0x8B80 #define GL_COMPILE_STATUS 0x8B81 #define GL_LINK_STATUS 0x8B82 #define GL_VALIDATE_STATUS 0x8B83 #define GL_INFO_LOG_LENGTH 0x8B84 #define GL_ATTACHED_SHADERS 0x8B85 #define GL_ACTIVE_UNIFORMS 0x8B86 #define GL_ACTIVE_UNIFORM_MAX_LENGTH 0x8B87 #define GL_SHADER_SOURCE_LENGTH 0x8B88 #define GL_ACTIVE_ATTRIBUTES 0x8B89 #define GL_ACTIVE_ATTRIBUTE_MAX_LENGTH 0x8B8A #define GL_FRAGMENT_SHADER_DERIVATIVE_HINT 0x8B8B #define GL_SHADING_LANGUAGE_VERSION 0x8B8C #define GL_CURRENT_PROGRAM 0x8B8D #define GL_POINT_SPRITE_COORD_ORIGIN 0x8CA0 #define GL_LOWER_LEFT 0x8CA1 #define GL_UPPER_LEFT 0x8CA2 #define GL_STENCIL_BACK_REF 0x8CA3 #define GL_STENCIL_BACK_VALUE_MASK 0x8CA4 #define GL_STENCIL_BACK_WRITEMASK 0x8CA5 typedef void (GLAPIENTRY * PFNGLATTACHSHADERPROC) (GLuint program, GLuint shader); typedef void (GLAPIENTRY * PFNGLBINDATTRIBLOCATIONPROC) (GLuint program, GLuint index, const GLchar* name); typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONSEPARATEPROC) (GLenum, GLenum); typedef void (GLAPIENTRY * PFNGLCOMPILESHADERPROC) (GLuint shader); typedef GLuint (GLAPIENTRY * PFNGLCREATEPROGRAMPROC) (void); typedef GLuint (GLAPIENTRY * PFNGLCREATESHADERPROC) (GLenum type); typedef void (GLAPIENTRY * PFNGLDELETEPROGRAMPROC) (GLuint program); typedef void (GLAPIENTRY * PFNGLDELETESHADERPROC) (GLuint shader); typedef void (GLAPIENTRY * PFNGLDETACHSHADERPROC) (GLuint program, GLuint shader); typedef void (GLAPIENTRY * PFNGLDISABLEVERTEXATTRIBARRAYPROC) (GLuint); typedef void (GLAPIENTRY * PFNGLDRAWBUFFERSPROC) (GLsizei n, const GLenum* bufs); typedef void (GLAPIENTRY * PFNGLENABLEVERTEXATTRIBARRAYPROC) (GLuint); typedef void (GLAPIENTRY * PFNGLGETACTIVEATTRIBPROC) (GLuint program, GLuint index, GLsizei maxLength, GLsizei* length, GLint* size, GLenum* type, GLchar* name); typedef void (GLAPIENTRY * PFNGLGETACTIVEUNIFORMPROC) (GLuint program, GLuint index, GLsizei maxLength, GLsizei* length, GLint* size, GLenum* type, GLchar* name); typedef void (GLAPIENTRY * PFNGLGETATTACHEDSHADERSPROC) (GLuint program, GLsizei maxCount, GLsizei* count, GLuint* shaders); typedef GLint (GLAPIENTRY * PFNGLGETATTRIBLOCATIONPROC) (GLuint program, const GLchar* name); typedef void (GLAPIENTRY * PFNGLGETPROGRAMINFOLOGPROC) (GLuint program, GLsizei bufSize, GLsizei* length, GLchar* infoLog); typedef void (GLAPIENTRY * PFNGLGETPROGRAMIVPROC) (GLuint program, GLenum pname, GLint* param); typedef void (GLAPIENTRY * PFNGLGETSHADERINFOLOGPROC) (GLuint shader, GLsizei bufSize, GLsizei* length, GLchar* infoLog); typedef void (GLAPIENTRY * PFNGLGETSHADERSOURCEPROC) (GLuint obj, GLsizei maxLength, GLsizei* length, GLchar* source); typedef void (GLAPIENTRY * PFNGLGETSHADERIVPROC) (GLuint shader, GLenum pname, GLint* param); typedef GLint (GLAPIENTRY * PFNGLGETUNIFORMLOCATIONPROC) (GLuint program, const GLchar* name); typedef void (GLAPIENTRY * PFNGLGETUNIFORMFVPROC) (GLuint program, GLint location, GLfloat* params); typedef void (GLAPIENTRY * PFNGLGETUNIFORMIVPROC) (GLuint program, GLint location, GLint* params); typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBPOINTERVPROC) (GLuint, GLenum, GLvoid**); typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBDVPROC) (GLuint, GLenum, GLdouble*); typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBFVPROC) (GLuint, GLenum, GLfloat*); typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBIVPROC) (GLuint, GLenum, GLint*); typedef GLboolean (GLAPIENTRY * PFNGLISPROGRAMPROC) (GLuint program); typedef GLboolean (GLAPIENTRY * PFNGLISSHADERPROC) (GLuint shader); typedef void (GLAPIENTRY * PFNGLLINKPROGRAMPROC) (GLuint program); typedef void (GLAPIENTRY * PFNGLSHADERSOURCEPROC) (GLuint shader, GLsizei count, const GLchar** strings, const GLint* lengths); typedef void (GLAPIENTRY * PFNGLSTENCILFUNCSEPARATEPROC) (GLenum frontfunc, GLenum backfunc, GLint ref, GLuint mask); typedef void (GLAPIENTRY * PFNGLSTENCILMASKSEPARATEPROC) (GLenum, GLuint); typedef void (GLAPIENTRY * PFNGLSTENCILOPSEPARATEPROC) (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass); typedef void (GLAPIENTRY * PFNGLUNIFORM1FPROC) (GLint location, GLfloat v0); typedef void (GLAPIENTRY * PFNGLUNIFORM1FVPROC) (GLint location, GLsizei count, const GLfloat* value); typedef void (GLAPIENTRY * PFNGLUNIFORM1IPROC) (GLint location, GLint v0); typedef void (GLAPIENTRY * PFNGLUNIFORM1IVPROC) (GLint location, GLsizei count, const GLint* value); typedef void (GLAPIENTRY * PFNGLUNIFORM2FPROC) (GLint location, GLfloat v0, GLfloat v1); typedef void (GLAPIENTRY * PFNGLUNIFORM2FVPROC) (GLint location, GLsizei count, const GLfloat* value); typedef void (GLAPIENTRY * PFNGLUNIFORM2IPROC) (GLint location, GLint v0, GLint v1); typedef void (GLAPIENTRY * PFNGLUNIFORM2IVPROC) (GLint location, GLsizei count, const GLint* value); typedef void (GLAPIENTRY * PFNGLUNIFORM3FPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2); typedef void (GLAPIENTRY * PFNGLUNIFORM3FVPROC) (GLint location, GLsizei count, const GLfloat* value); typedef void (GLAPIENTRY * PFNGLUNIFORM3IPROC) (GLint location, GLint v0, GLint v1, GLint v2); typedef void (GLAPIENTRY * PFNGLUNIFORM3IVPROC) (GLint location, GLsizei count, const GLint* value); typedef void (GLAPIENTRY * PFNGLUNIFORM4FPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); typedef void (GLAPIENTRY * PFNGLUNIFORM4FVPROC) (GLint location, GLsizei count, const GLfloat* value); typedef void (GLAPIENTRY * PFNGLUNIFORM4IPROC) (GLint location, GLint v0, GLint v1, GLint v2, GLint v3); typedef void (GLAPIENTRY * PFNGLUNIFORM4IVPROC) (GLint location, GLsizei count, const GLint* value); typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); typedef void (GLAPIENTRY * PFNGLUSEPROGRAMPROC) (GLuint program); typedef void (GLAPIENTRY * PFNGLVALIDATEPROGRAMPROC) (GLuint program); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1DPROC) (GLuint index, GLdouble x); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1DVPROC) (GLuint index, const GLdouble* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1FPROC) (GLuint index, GLfloat x); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1FVPROC) (GLuint index, const GLfloat* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1SPROC) (GLuint index, GLshort x); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1SVPROC) (GLuint index, const GLshort* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2DPROC) (GLuint index, GLdouble x, GLdouble y); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2DVPROC) (GLuint index, const GLdouble* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2FPROC) (GLuint index, GLfloat x, GLfloat y); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2FVPROC) (GLuint index, const GLfloat* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2SPROC) (GLuint index, GLshort x, GLshort y); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2SVPROC) (GLuint index, const GLshort* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3DVPROC) (GLuint index, const GLdouble* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3FPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3FVPROC) (GLuint index, const GLfloat* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3SPROC) (GLuint index, GLshort x, GLshort y, GLshort z); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3SVPROC) (GLuint index, const GLshort* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NBVPROC) (GLuint index, const GLbyte* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NIVPROC) (GLuint index, const GLint* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NSVPROC) (GLuint index, const GLshort* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NUBPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NUBVPROC) (GLuint index, const GLubyte* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NUIVPROC) (GLuint index, const GLuint* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NUSVPROC) (GLuint index, const GLushort* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4BVPROC) (GLuint index, const GLbyte* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4DVPROC) (GLuint index, const GLdouble* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4FPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4FVPROC) (GLuint index, const GLfloat* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4IVPROC) (GLuint index, const GLint* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4SPROC) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4SVPROC) (GLuint index, const GLshort* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4UBVPROC) (GLuint index, const GLubyte* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4UIVPROC) (GLuint index, const GLuint* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4USVPROC) (GLuint index, const GLushort* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBPOINTERPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid* pointer); #define glAttachShader GLEW_GET_FUN(__glewAttachShader) #define glBindAttribLocation GLEW_GET_FUN(__glewBindAttribLocation) #define glBlendEquationSeparate GLEW_GET_FUN(__glewBlendEquationSeparate) #define glCompileShader GLEW_GET_FUN(__glewCompileShader) #define glCreateProgram GLEW_GET_FUN(__glewCreateProgram) #define glCreateShader GLEW_GET_FUN(__glewCreateShader) #define glDeleteProgram GLEW_GET_FUN(__glewDeleteProgram) #define glDeleteShader GLEW_GET_FUN(__glewDeleteShader) #define glDetachShader GLEW_GET_FUN(__glewDetachShader) #define glDisableVertexAttribArray GLEW_GET_FUN(__glewDisableVertexAttribArray) #define glDrawBuffers GLEW_GET_FUN(__glewDrawBuffers) #define glEnableVertexAttribArray GLEW_GET_FUN(__glewEnableVertexAttribArray) #define glGetActiveAttrib GLEW_GET_FUN(__glewGetActiveAttrib) #define glGetActiveUniform GLEW_GET_FUN(__glewGetActiveUniform) #define glGetAttachedShaders GLEW_GET_FUN(__glewGetAttachedShaders) #define glGetAttribLocation GLEW_GET_FUN(__glewGetAttribLocation) #define glGetProgramInfoLog GLEW_GET_FUN(__glewGetProgramInfoLog) #define glGetProgramiv GLEW_GET_FUN(__glewGetProgramiv) #define glGetShaderInfoLog GLEW_GET_FUN(__glewGetShaderInfoLog) #define glGetShaderSource GLEW_GET_FUN(__glewGetShaderSource) #define glGetShaderiv GLEW_GET_FUN(__glewGetShaderiv) #define glGetUniformLocation GLEW_GET_FUN(__glewGetUniformLocation) #define glGetUniformfv GLEW_GET_FUN(__glewGetUniformfv) #define glGetUniformiv GLEW_GET_FUN(__glewGetUniformiv) #define glGetVertexAttribPointerv GLEW_GET_FUN(__glewGetVertexAttribPointerv) #define glGetVertexAttribdv GLEW_GET_FUN(__glewGetVertexAttribdv) #define glGetVertexAttribfv GLEW_GET_FUN(__glewGetVertexAttribfv) #define glGetVertexAttribiv GLEW_GET_FUN(__glewGetVertexAttribiv) #define glIsProgram GLEW_GET_FUN(__glewIsProgram) #define glIsShader GLEW_GET_FUN(__glewIsShader) #define glLinkProgram GLEW_GET_FUN(__glewLinkProgram) #define glShaderSource GLEW_GET_FUN(__glewShaderSource) #define glStencilFuncSeparate GLEW_GET_FUN(__glewStencilFuncSeparate) #define glStencilMaskSeparate GLEW_GET_FUN(__glewStencilMaskSeparate) #define glStencilOpSeparate GLEW_GET_FUN(__glewStencilOpSeparate) #define glUniform1f GLEW_GET_FUN(__glewUniform1f) #define glUniform1fv GLEW_GET_FUN(__glewUniform1fv) #define glUniform1i GLEW_GET_FUN(__glewUniform1i) #define glUniform1iv GLEW_GET_FUN(__glewUniform1iv) #define glUniform2f GLEW_GET_FUN(__glewUniform2f) #define glUniform2fv GLEW_GET_FUN(__glewUniform2fv) #define glUniform2i GLEW_GET_FUN(__glewUniform2i) #define glUniform2iv GLEW_GET_FUN(__glewUniform2iv) #define glUniform3f GLEW_GET_FUN(__glewUniform3f) #define glUniform3fv GLEW_GET_FUN(__glewUniform3fv) #define glUniform3i GLEW_GET_FUN(__glewUniform3i) #define glUniform3iv GLEW_GET_FUN(__glewUniform3iv) #define glUniform4f GLEW_GET_FUN(__glewUniform4f) #define glUniform4fv GLEW_GET_FUN(__glewUniform4fv) #define glUniform4i GLEW_GET_FUN(__glewUniform4i) #define glUniform4iv GLEW_GET_FUN(__glewUniform4iv) #define glUniformMatrix2fv GLEW_GET_FUN(__glewUniformMatrix2fv) #define glUniformMatrix3fv GLEW_GET_FUN(__glewUniformMatrix3fv) #define glUniformMatrix4fv GLEW_GET_FUN(__glewUniformMatrix4fv) #define glUseProgram GLEW_GET_FUN(__glewUseProgram) #define glValidateProgram GLEW_GET_FUN(__glewValidateProgram) #define glVertexAttrib1d GLEW_GET_FUN(__glewVertexAttrib1d) #define glVertexAttrib1dv GLEW_GET_FUN(__glewVertexAttrib1dv) #define glVertexAttrib1f GLEW_GET_FUN(__glewVertexAttrib1f) #define glVertexAttrib1fv GLEW_GET_FUN(__glewVertexAttrib1fv) #define glVertexAttrib1s GLEW_GET_FUN(__glewVertexAttrib1s) #define glVertexAttrib1sv GLEW_GET_FUN(__glewVertexAttrib1sv) #define glVertexAttrib2d GLEW_GET_FUN(__glewVertexAttrib2d) #define glVertexAttrib2dv GLEW_GET_FUN(__glewVertexAttrib2dv) #define glVertexAttrib2f GLEW_GET_FUN(__glewVertexAttrib2f) #define glVertexAttrib2fv GLEW_GET_FUN(__glewVertexAttrib2fv) #define glVertexAttrib2s GLEW_GET_FUN(__glewVertexAttrib2s) #define glVertexAttrib2sv GLEW_GET_FUN(__glewVertexAttrib2sv) #define glVertexAttrib3d GLEW_GET_FUN(__glewVertexAttrib3d) #define glVertexAttrib3dv GLEW_GET_FUN(__glewVertexAttrib3dv) #define glVertexAttrib3f GLEW_GET_FUN(__glewVertexAttrib3f) #define glVertexAttrib3fv GLEW_GET_FUN(__glewVertexAttrib3fv) #define glVertexAttrib3s GLEW_GET_FUN(__glewVertexAttrib3s) #define glVertexAttrib3sv GLEW_GET_FUN(__glewVertexAttrib3sv) #define glVertexAttrib4Nbv GLEW_GET_FUN(__glewVertexAttrib4Nbv) #define glVertexAttrib4Niv GLEW_GET_FUN(__glewVertexAttrib4Niv) #define glVertexAttrib4Nsv GLEW_GET_FUN(__glewVertexAttrib4Nsv) #define glVertexAttrib4Nub GLEW_GET_FUN(__glewVertexAttrib4Nub) #define glVertexAttrib4Nubv GLEW_GET_FUN(__glewVertexAttrib4Nubv) #define glVertexAttrib4Nuiv GLEW_GET_FUN(__glewVertexAttrib4Nuiv) #define glVertexAttrib4Nusv GLEW_GET_FUN(__glewVertexAttrib4Nusv) #define glVertexAttrib4bv GLEW_GET_FUN(__glewVertexAttrib4bv) #define glVertexAttrib4d GLEW_GET_FUN(__glewVertexAttrib4d) #define glVertexAttrib4dv GLEW_GET_FUN(__glewVertexAttrib4dv) #define glVertexAttrib4f GLEW_GET_FUN(__glewVertexAttrib4f) #define glVertexAttrib4fv GLEW_GET_FUN(__glewVertexAttrib4fv) #define glVertexAttrib4iv GLEW_GET_FUN(__glewVertexAttrib4iv) #define glVertexAttrib4s GLEW_GET_FUN(__glewVertexAttrib4s) #define glVertexAttrib4sv GLEW_GET_FUN(__glewVertexAttrib4sv) #define glVertexAttrib4ubv GLEW_GET_FUN(__glewVertexAttrib4ubv) #define glVertexAttrib4uiv GLEW_GET_FUN(__glewVertexAttrib4uiv) #define glVertexAttrib4usv GLEW_GET_FUN(__glewVertexAttrib4usv) #define glVertexAttribPointer GLEW_GET_FUN(__glewVertexAttribPointer) #define GLEW_VERSION_2_0 GLEW_GET_VAR(__GLEW_VERSION_2_0) #endif /* GL_VERSION_2_0 */ /* ----------------------------- GL_VERSION_2_1 ---------------------------- */ #ifndef GL_VERSION_2_1 #define GL_VERSION_2_1 1 #define GL_CURRENT_RASTER_SECONDARY_COLOR 0x845F #define GL_PIXEL_PACK_BUFFER 0x88EB #define GL_PIXEL_UNPACK_BUFFER 0x88EC #define GL_PIXEL_PACK_BUFFER_BINDING 0x88ED #define GL_PIXEL_UNPACK_BUFFER_BINDING 0x88EF #define GL_FLOAT_MAT2x3 0x8B65 #define GL_FLOAT_MAT2x4 0x8B66 #define GL_FLOAT_MAT3x2 0x8B67 #define GL_FLOAT_MAT3x4 0x8B68 #define GL_FLOAT_MAT4x2 0x8B69 #define GL_FLOAT_MAT4x3 0x8B6A #define GL_SRGB 0x8C40 #define GL_SRGB8 0x8C41 #define GL_SRGB_ALPHA 0x8C42 #define GL_SRGB8_ALPHA8 0x8C43 #define GL_SLUMINANCE_ALPHA 0x8C44 #define GL_SLUMINANCE8_ALPHA8 0x8C45 #define GL_SLUMINANCE 0x8C46 #define GL_SLUMINANCE8 0x8C47 #define GL_COMPRESSED_SRGB 0x8C48 #define GL_COMPRESSED_SRGB_ALPHA 0x8C49 #define GL_COMPRESSED_SLUMINANCE 0x8C4A #define GL_COMPRESSED_SLUMINANCE_ALPHA 0x8C4B typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX2X3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX2X4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX3X2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX3X4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX4X2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX4X3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); #define glUniformMatrix2x3fv GLEW_GET_FUN(__glewUniformMatrix2x3fv) #define glUniformMatrix2x4fv GLEW_GET_FUN(__glewUniformMatrix2x4fv) #define glUniformMatrix3x2fv GLEW_GET_FUN(__glewUniformMatrix3x2fv) #define glUniformMatrix3x4fv GLEW_GET_FUN(__glewUniformMatrix3x4fv) #define glUniformMatrix4x2fv GLEW_GET_FUN(__glewUniformMatrix4x2fv) #define glUniformMatrix4x3fv GLEW_GET_FUN(__glewUniformMatrix4x3fv) #define GLEW_VERSION_2_1 GLEW_GET_VAR(__GLEW_VERSION_2_1) #endif /* GL_VERSION_2_1 */ /* ----------------------------- GL_VERSION_3_0 ---------------------------- */ #ifndef GL_VERSION_3_0 #define GL_VERSION_3_0 1 #define GL_MAX_CLIP_DISTANCES GL_MAX_CLIP_PLANES #define GL_CLIP_DISTANCE5 GL_CLIP_PLANE5 #define GL_CLIP_DISTANCE1 GL_CLIP_PLANE1 #define GL_CLIP_DISTANCE3 GL_CLIP_PLANE3 #define GL_COMPARE_REF_TO_TEXTURE GL_COMPARE_R_TO_TEXTURE_ARB #define GL_CLIP_DISTANCE0 GL_CLIP_PLANE0 #define GL_CLIP_DISTANCE4 GL_CLIP_PLANE4 #define GL_CLIP_DISTANCE2 GL_CLIP_PLANE2 #define GL_MAX_VARYING_COMPONENTS GL_MAX_VARYING_FLOATS #define GL_CONTEXT_FLAG_FORWARD_COMPATIBLE_BIT 0x0001 #define GL_MAJOR_VERSION 0x821B #define GL_MINOR_VERSION 0x821C #define GL_NUM_EXTENSIONS 0x821D #define GL_CONTEXT_FLAGS 0x821E #define GL_DEPTH_BUFFER 0x8223 #define GL_STENCIL_BUFFER 0x8224 #define GL_COMPRESSED_RED 0x8225 #define GL_COMPRESSED_RG 0x8226 #define GL_RGBA32F 0x8814 #define GL_RGB32F 0x8815 #define GL_RGBA16F 0x881A #define GL_RGB16F 0x881B #define GL_VERTEX_ATTRIB_ARRAY_INTEGER 0x88FD #define GL_MAX_ARRAY_TEXTURE_LAYERS 0x88FF #define GL_MIN_PROGRAM_TEXEL_OFFSET 0x8904 #define GL_MAX_PROGRAM_TEXEL_OFFSET 0x8905 #define GL_CLAMP_VERTEX_COLOR 0x891A #define GL_CLAMP_FRAGMENT_COLOR 0x891B #define GL_CLAMP_READ_COLOR 0x891C #define GL_FIXED_ONLY 0x891D #define GL_TEXTURE_RED_TYPE 0x8C10 #define GL_TEXTURE_GREEN_TYPE 0x8C11 #define GL_TEXTURE_BLUE_TYPE 0x8C12 #define GL_TEXTURE_ALPHA_TYPE 0x8C13 #define GL_TEXTURE_LUMINANCE_TYPE 0x8C14 #define GL_TEXTURE_INTENSITY_TYPE 0x8C15 #define GL_TEXTURE_DEPTH_TYPE 0x8C16 #define GL_TEXTURE_1D_ARRAY 0x8C18 #define GL_PROXY_TEXTURE_1D_ARRAY 0x8C19 #define GL_TEXTURE_2D_ARRAY 0x8C1A #define GL_PROXY_TEXTURE_2D_ARRAY 0x8C1B #define GL_TEXTURE_BINDING_1D_ARRAY 0x8C1C #define GL_TEXTURE_BINDING_2D_ARRAY 0x8C1D #define GL_R11F_G11F_B10F 0x8C3A #define GL_UNSIGNED_INT_10F_11F_11F_REV 0x8C3B #define GL_RGB9_E5 0x8C3D #define GL_UNSIGNED_INT_5_9_9_9_REV 0x8C3E #define GL_TEXTURE_SHARED_SIZE 0x8C3F #define GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH 0x8C76 #define GL_TRANSFORM_FEEDBACK_BUFFER_MODE 0x8C7F #define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS 0x8C80 #define GL_TRANSFORM_FEEDBACK_VARYINGS 0x8C83 #define GL_TRANSFORM_FEEDBACK_BUFFER_START 0x8C84 #define GL_TRANSFORM_FEEDBACK_BUFFER_SIZE 0x8C85 #define GL_PRIMITIVES_GENERATED 0x8C87 #define GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN 0x8C88 #define GL_RASTERIZER_DISCARD 0x8C89 #define GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS 0x8C8A #define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS 0x8C8B #define GL_INTERLEAVED_ATTRIBS 0x8C8C #define GL_SEPARATE_ATTRIBS 0x8C8D #define GL_TRANSFORM_FEEDBACK_BUFFER 0x8C8E #define GL_TRANSFORM_FEEDBACK_BUFFER_BINDING 0x8C8F #define GL_RGBA32UI 0x8D70 #define GL_RGB32UI 0x8D71 #define GL_RGBA16UI 0x8D76 #define GL_RGB16UI 0x8D77 #define GL_RGBA8UI 0x8D7C #define GL_RGB8UI 0x8D7D #define GL_RGBA32I 0x8D82 #define GL_RGB32I 0x8D83 #define GL_RGBA16I 0x8D88 #define GL_RGB16I 0x8D89 #define GL_RGBA8I 0x8D8E #define GL_RGB8I 0x8D8F #define GL_RED_INTEGER 0x8D94 #define GL_GREEN_INTEGER 0x8D95 #define GL_BLUE_INTEGER 0x8D96 #define GL_ALPHA_INTEGER 0x8D97 #define GL_RGB_INTEGER 0x8D98 #define GL_RGBA_INTEGER 0x8D99 #define GL_BGR_INTEGER 0x8D9A #define GL_BGRA_INTEGER 0x8D9B #define GL_SAMPLER_1D_ARRAY 0x8DC0 #define GL_SAMPLER_2D_ARRAY 0x8DC1 #define GL_SAMPLER_1D_ARRAY_SHADOW 0x8DC3 #define GL_SAMPLER_2D_ARRAY_SHADOW 0x8DC4 #define GL_SAMPLER_CUBE_SHADOW 0x8DC5 #define GL_UNSIGNED_INT_VEC2 0x8DC6 #define GL_UNSIGNED_INT_VEC3 0x8DC7 #define GL_UNSIGNED_INT_VEC4 0x8DC8 #define GL_INT_SAMPLER_1D 0x8DC9 #define GL_INT_SAMPLER_2D 0x8DCA #define GL_INT_SAMPLER_3D 0x8DCB #define GL_INT_SAMPLER_CUBE 0x8DCC #define GL_INT_SAMPLER_1D_ARRAY 0x8DCE #define GL_INT_SAMPLER_2D_ARRAY 0x8DCF #define GL_UNSIGNED_INT_SAMPLER_1D 0x8DD1 #define GL_UNSIGNED_INT_SAMPLER_2D 0x8DD2 #define GL_UNSIGNED_INT_SAMPLER_3D 0x8DD3 #define GL_UNSIGNED_INT_SAMPLER_CUBE 0x8DD4 #define GL_UNSIGNED_INT_SAMPLER_1D_ARRAY 0x8DD6 #define GL_UNSIGNED_INT_SAMPLER_2D_ARRAY 0x8DD7 #define GL_QUERY_WAIT 0x8E13 #define GL_QUERY_NO_WAIT 0x8E14 #define GL_QUERY_BY_REGION_WAIT 0x8E15 #define GL_QUERY_BY_REGION_NO_WAIT 0x8E16 typedef void (GLAPIENTRY * PFNGLBEGINCONDITIONALRENDERPROC) (GLuint, GLenum); typedef void (GLAPIENTRY * PFNGLBEGINTRANSFORMFEEDBACKPROC) (GLenum); typedef void (GLAPIENTRY * PFNGLBINDFRAGDATALOCATIONPROC) (GLuint, GLuint, const GLchar*); typedef void (GLAPIENTRY * PFNGLCLAMPCOLORPROC) (GLenum, GLenum); typedef void (GLAPIENTRY * PFNGLCLEARBUFFERFIPROC) (GLenum, GLint, GLfloat, GLint); typedef void (GLAPIENTRY * PFNGLCLEARBUFFERFVPROC) (GLenum, GLint, const GLfloat*); typedef void (GLAPIENTRY * PFNGLCLEARBUFFERIVPROC) (GLenum, GLint, const GLint*); typedef void (GLAPIENTRY * PFNGLCLEARBUFFERUIVPROC) (GLenum, GLint, const GLuint*); typedef void (GLAPIENTRY * PFNGLCOLORMASKIPROC) (GLuint, GLboolean, GLboolean, GLboolean, GLboolean); typedef void (GLAPIENTRY * PFNGLDISABLEIPROC) (GLenum, GLuint); typedef void (GLAPIENTRY * PFNGLENABLEIPROC) (GLenum, GLuint); typedef void (GLAPIENTRY * PFNGLENDCONDITIONALRENDERPROC) (void); typedef void (GLAPIENTRY * PFNGLENDTRANSFORMFEEDBACKPROC) (void); typedef void (GLAPIENTRY * PFNGLGETBOOLEANI_VPROC) (GLenum, GLuint, GLboolean*); typedef GLint (GLAPIENTRY * PFNGLGETFRAGDATALOCATIONPROC) (GLuint, const GLchar*); typedef const GLubyte* (GLAPIENTRY * PFNGLGETSTRINGIPROC) (GLenum, GLuint); typedef void (GLAPIENTRY * PFNGLGETTEXPARAMETERIIVPROC) (GLenum, GLenum, GLint*); typedef void (GLAPIENTRY * PFNGLGETTEXPARAMETERIUIVPROC) (GLenum, GLenum, GLuint*); typedef void (GLAPIENTRY * PFNGLGETTRANSFORMFEEDBACKVARYINGPROC) (GLuint, GLuint, GLsizei, GLsizei *, GLsizei *, GLenum *, GLchar *); typedef void (GLAPIENTRY * PFNGLGETUNIFORMUIVPROC) (GLuint, GLint, GLuint*); typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBIIVPROC) (GLuint, GLenum, GLint*); typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBIUIVPROC) (GLuint, GLenum, GLuint*); typedef GLboolean (GLAPIENTRY * PFNGLISENABLEDIPROC) (GLenum, GLuint); typedef void (GLAPIENTRY * PFNGLTEXPARAMETERIIVPROC) (GLenum, GLenum, const GLint*); typedef void (GLAPIENTRY * PFNGLTEXPARAMETERIUIVPROC) (GLenum, GLenum, const GLuint*); typedef void (GLAPIENTRY * PFNGLTRANSFORMFEEDBACKVARYINGSPROC) (GLuint, GLsizei, const GLchar **, GLenum); typedef void (GLAPIENTRY * PFNGLUNIFORM1UIPROC) (GLint, GLuint); typedef void (GLAPIENTRY * PFNGLUNIFORM1UIVPROC) (GLint, GLsizei, const GLuint*); typedef void (GLAPIENTRY * PFNGLUNIFORM2UIPROC) (GLint, GLuint, GLuint); typedef void (GLAPIENTRY * PFNGLUNIFORM2UIVPROC) (GLint, GLsizei, const GLuint*); typedef void (GLAPIENTRY * PFNGLUNIFORM3UIPROC) (GLint, GLuint, GLuint, GLuint); typedef void (GLAPIENTRY * PFNGLUNIFORM3UIVPROC) (GLint, GLsizei, const GLuint*); typedef void (GLAPIENTRY * PFNGLUNIFORM4UIPROC) (GLint, GLuint, GLuint, GLuint, GLuint); typedef void (GLAPIENTRY * PFNGLUNIFORM4UIVPROC) (GLint, GLsizei, const GLuint*); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI1IPROC) (GLuint, GLint); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI1IVPROC) (GLuint, const GLint*); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI1UIPROC) (GLuint, GLuint); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI1UIVPROC) (GLuint, const GLuint*); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI2IPROC) (GLuint, GLint, GLint); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI2IVPROC) (GLuint, const GLint*); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI2UIPROC) (GLuint, GLuint, GLuint); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI2UIVPROC) (GLuint, const GLuint*); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI3IPROC) (GLuint, GLint, GLint, GLint); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI3IVPROC) (GLuint, const GLint*); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI3UIPROC) (GLuint, GLuint, GLuint, GLuint); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI3UIVPROC) (GLuint, const GLuint*); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4BVPROC) (GLuint, const GLbyte*); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4IPROC) (GLuint, GLint, GLint, GLint, GLint); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4IVPROC) (GLuint, const GLint*); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4SVPROC) (GLuint, const GLshort*); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4UBVPROC) (GLuint, const GLubyte*); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4UIPROC) (GLuint, GLuint, GLuint, GLuint, GLuint); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4UIVPROC) (GLuint, const GLuint*); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4USVPROC) (GLuint, const GLushort*); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBIPOINTERPROC) (GLuint, GLint, GLenum, GLsizei, const GLvoid*); #define glBeginConditionalRender GLEW_GET_FUN(__glewBeginConditionalRender) #define glBeginTransformFeedback GLEW_GET_FUN(__glewBeginTransformFeedback) #define glBindFragDataLocation GLEW_GET_FUN(__glewBindFragDataLocation) #define glClampColor GLEW_GET_FUN(__glewClampColor) #define glClearBufferfi GLEW_GET_FUN(__glewClearBufferfi) #define glClearBufferfv GLEW_GET_FUN(__glewClearBufferfv) #define glClearBufferiv GLEW_GET_FUN(__glewClearBufferiv) #define glClearBufferuiv GLEW_GET_FUN(__glewClearBufferuiv) #define glColorMaski GLEW_GET_FUN(__glewColorMaski) #define glDisablei GLEW_GET_FUN(__glewDisablei) #define glEnablei GLEW_GET_FUN(__glewEnablei) #define glEndConditionalRender GLEW_GET_FUN(__glewEndConditionalRender) #define glEndTransformFeedback GLEW_GET_FUN(__glewEndTransformFeedback) #define glGetBooleani_v GLEW_GET_FUN(__glewGetBooleani_v) #define glGetFragDataLocation GLEW_GET_FUN(__glewGetFragDataLocation) #define glGetStringi GLEW_GET_FUN(__glewGetStringi) #define glGetTexParameterIiv GLEW_GET_FUN(__glewGetTexParameterIiv) #define glGetTexParameterIuiv GLEW_GET_FUN(__glewGetTexParameterIuiv) #define glGetTransformFeedbackVarying GLEW_GET_FUN(__glewGetTransformFeedbackVarying) #define glGetUniformuiv GLEW_GET_FUN(__glewGetUniformuiv) #define glGetVertexAttribIiv GLEW_GET_FUN(__glewGetVertexAttribIiv) #define glGetVertexAttribIuiv GLEW_GET_FUN(__glewGetVertexAttribIuiv) #define glIsEnabledi GLEW_GET_FUN(__glewIsEnabledi) #define glTexParameterIiv GLEW_GET_FUN(__glewTexParameterIiv) #define glTexParameterIuiv GLEW_GET_FUN(__glewTexParameterIuiv) #define glTransformFeedbackVaryings GLEW_GET_FUN(__glewTransformFeedbackVaryings) #define glUniform1ui GLEW_GET_FUN(__glewUniform1ui) #define glUniform1uiv GLEW_GET_FUN(__glewUniform1uiv) #define glUniform2ui GLEW_GET_FUN(__glewUniform2ui) #define glUniform2uiv GLEW_GET_FUN(__glewUniform2uiv) #define glUniform3ui GLEW_GET_FUN(__glewUniform3ui) #define glUniform3uiv GLEW_GET_FUN(__glewUniform3uiv) #define glUniform4ui GLEW_GET_FUN(__glewUniform4ui) #define glUniform4uiv GLEW_GET_FUN(__glewUniform4uiv) #define glVertexAttribI1i GLEW_GET_FUN(__glewVertexAttribI1i) #define glVertexAttribI1iv GLEW_GET_FUN(__glewVertexAttribI1iv) #define glVertexAttribI1ui GLEW_GET_FUN(__glewVertexAttribI1ui) #define glVertexAttribI1uiv GLEW_GET_FUN(__glewVertexAttribI1uiv) #define glVertexAttribI2i GLEW_GET_FUN(__glewVertexAttribI2i) #define glVertexAttribI2iv GLEW_GET_FUN(__glewVertexAttribI2iv) #define glVertexAttribI2ui GLEW_GET_FUN(__glewVertexAttribI2ui) #define glVertexAttribI2uiv GLEW_GET_FUN(__glewVertexAttribI2uiv) #define glVertexAttribI3i GLEW_GET_FUN(__glewVertexAttribI3i) #define glVertexAttribI3iv GLEW_GET_FUN(__glewVertexAttribI3iv) #define glVertexAttribI3ui GLEW_GET_FUN(__glewVertexAttribI3ui) #define glVertexAttribI3uiv GLEW_GET_FUN(__glewVertexAttribI3uiv) #define glVertexAttribI4bv GLEW_GET_FUN(__glewVertexAttribI4bv) #define glVertexAttribI4i GLEW_GET_FUN(__glewVertexAttribI4i) #define glVertexAttribI4iv GLEW_GET_FUN(__glewVertexAttribI4iv) #define glVertexAttribI4sv GLEW_GET_FUN(__glewVertexAttribI4sv) #define glVertexAttribI4ubv GLEW_GET_FUN(__glewVertexAttribI4ubv) #define glVertexAttribI4ui GLEW_GET_FUN(__glewVertexAttribI4ui) #define glVertexAttribI4uiv GLEW_GET_FUN(__glewVertexAttribI4uiv) #define glVertexAttribI4usv GLEW_GET_FUN(__glewVertexAttribI4usv) #define glVertexAttribIPointer GLEW_GET_FUN(__glewVertexAttribIPointer) #define GLEW_VERSION_3_0 GLEW_GET_VAR(__GLEW_VERSION_3_0) #endif /* GL_VERSION_3_0 */ /* ----------------------------- GL_VERSION_3_1 ---------------------------- */ #ifndef GL_VERSION_3_1 #define GL_VERSION_3_1 1 #define GL_TEXTURE_RECTANGLE 0x84F5 #define GL_TEXTURE_BINDING_RECTANGLE 0x84F6 #define GL_PROXY_TEXTURE_RECTANGLE 0x84F7 #define GL_MAX_RECTANGLE_TEXTURE_SIZE 0x84F8 #define GL_SAMPLER_2D_RECT 0x8B63 #define GL_SAMPLER_2D_RECT_SHADOW 0x8B64 #define GL_TEXTURE_BUFFER 0x8C2A #define GL_MAX_TEXTURE_BUFFER_SIZE 0x8C2B #define GL_TEXTURE_BINDING_BUFFER 0x8C2C #define GL_TEXTURE_BUFFER_DATA_STORE_BINDING 0x8C2D #define GL_TEXTURE_BUFFER_FORMAT 0x8C2E #define GL_SAMPLER_BUFFER 0x8DC2 #define GL_INT_SAMPLER_2D_RECT 0x8DCD #define GL_INT_SAMPLER_BUFFER 0x8DD0 #define GL_UNSIGNED_INT_SAMPLER_2D_RECT 0x8DD5 #define GL_UNSIGNED_INT_SAMPLER_BUFFER 0x8DD8 #define GL_RED_SNORM 0x8F90 #define GL_RG_SNORM 0x8F91 #define GL_RGB_SNORM 0x8F92 #define GL_RGBA_SNORM 0x8F93 #define GL_R8_SNORM 0x8F94 #define GL_RG8_SNORM 0x8F95 #define GL_RGB8_SNORM 0x8F96 #define GL_RGBA8_SNORM 0x8F97 #define GL_R16_SNORM 0x8F98 #define GL_RG16_SNORM 0x8F99 #define GL_RGB16_SNORM 0x8F9A #define GL_RGBA16_SNORM 0x8F9B #define GL_SIGNED_NORMALIZED 0x8F9C #define GL_PRIMITIVE_RESTART 0x8F9D #define GL_PRIMITIVE_RESTART_INDEX 0x8F9E #define GL_BUFFER_ACCESS_FLAGS 0x911F #define GL_BUFFER_MAP_LENGTH 0x9120 #define GL_BUFFER_MAP_OFFSET 0x9121 typedef void (GLAPIENTRY * PFNGLDRAWARRAYSINSTANCEDPROC) (GLenum, GLint, GLsizei, GLsizei); typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSINSTANCEDPROC) (GLenum, GLsizei, GLenum, const GLvoid*, GLsizei); typedef void (GLAPIENTRY * PFNGLPRIMITIVERESTARTINDEXPROC) (GLuint); typedef void (GLAPIENTRY * PFNGLTEXBUFFERPROC) (GLenum, GLenum, GLuint); #define glDrawArraysInstanced GLEW_GET_FUN(__glewDrawArraysInstanced) #define glDrawElementsInstanced GLEW_GET_FUN(__glewDrawElementsInstanced) #define glPrimitiveRestartIndex GLEW_GET_FUN(__glewPrimitiveRestartIndex) #define glTexBuffer GLEW_GET_FUN(__glewTexBuffer) #define GLEW_VERSION_3_1 GLEW_GET_VAR(__GLEW_VERSION_3_1) #endif /* GL_VERSION_3_1 */ /* ----------------------------- GL_VERSION_3_2 ---------------------------- */ #ifndef GL_VERSION_3_2 #define GL_VERSION_3_2 1 #define GL_CONTEXT_CORE_PROFILE_BIT 0x00000001 #define GL_CONTEXT_COMPATIBILITY_PROFILE_BIT 0x00000002 #define GL_LINES_ADJACENCY 0x000A #define GL_LINE_STRIP_ADJACENCY 0x000B #define GL_TRIANGLES_ADJACENCY 0x000C #define GL_TRIANGLE_STRIP_ADJACENCY 0x000D #define GL_PROGRAM_POINT_SIZE 0x8642 #define GL_GEOMETRY_VERTICES_OUT 0x8916 #define GL_GEOMETRY_INPUT_TYPE 0x8917 #define GL_GEOMETRY_OUTPUT_TYPE 0x8918 #define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS 0x8C29 #define GL_FRAMEBUFFER_ATTACHMENT_LAYERED 0x8DA7 #define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS 0x8DA8 #define GL_GEOMETRY_SHADER 0x8DD9 #define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS 0x8DDF #define GL_MAX_GEOMETRY_OUTPUT_VERTICES 0x8DE0 #define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS 0x8DE1 #define GL_MAX_VERTEX_OUTPUT_COMPONENTS 0x9122 #define GL_MAX_GEOMETRY_INPUT_COMPONENTS 0x9123 #define GL_MAX_GEOMETRY_OUTPUT_COMPONENTS 0x9124 #define GL_MAX_FRAGMENT_INPUT_COMPONENTS 0x9125 #define GL_CONTEXT_PROFILE_MASK 0x9126 typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTUREPROC) (GLenum, GLenum, GLuint, GLint); typedef void (GLAPIENTRY * PFNGLGETBUFFERPARAMETERI64VPROC) (GLenum, GLenum, GLint64 *); typedef void (GLAPIENTRY * PFNGLGETINTEGER64I_VPROC) (GLenum, GLuint, GLint64 *); #define glFramebufferTexture GLEW_GET_FUN(__glewFramebufferTexture) #define glGetBufferParameteri64v GLEW_GET_FUN(__glewGetBufferParameteri64v) #define glGetInteger64i_v GLEW_GET_FUN(__glewGetInteger64i_v) #define GLEW_VERSION_3_2 GLEW_GET_VAR(__GLEW_VERSION_3_2) #endif /* GL_VERSION_3_2 */ /* ----------------------------- GL_VERSION_3_3 ---------------------------- */ #ifndef GL_VERSION_3_3 #define GL_VERSION_3_3 1 #define GL_VERTEX_ATTRIB_ARRAY_DIVISOR 0x88FE #define GL_TEXTURE_SWIZZLE_R 0x8E42 #define GL_TEXTURE_SWIZZLE_G 0x8E43 #define GL_TEXTURE_SWIZZLE_B 0x8E44 #define GL_TEXTURE_SWIZZLE_A 0x8E45 #define GL_TEXTURE_SWIZZLE_RGBA 0x8E46 #define GL_RGB10_A2UI 0x906F typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBDIVISORPROC) (GLuint index, GLuint divisor); #define glVertexAttribDivisor GLEW_GET_FUN(__glewVertexAttribDivisor) #define GLEW_VERSION_3_3 GLEW_GET_VAR(__GLEW_VERSION_3_3) #endif /* GL_VERSION_3_3 */ /* ----------------------------- GL_VERSION_4_0 ---------------------------- */ #ifndef GL_VERSION_4_0 #define GL_VERSION_4_0 1 #define GL_GEOMETRY_SHADER_INVOCATIONS 0x887F #define GL_SAMPLE_SHADING 0x8C36 #define GL_MIN_SAMPLE_SHADING_VALUE 0x8C37 #define GL_MAX_GEOMETRY_SHADER_INVOCATIONS 0x8E5A #define GL_MIN_FRAGMENT_INTERPOLATION_OFFSET 0x8E5B #define GL_MAX_FRAGMENT_INTERPOLATION_OFFSET 0x8E5C #define GL_FRAGMENT_INTERPOLATION_OFFSET_BITS 0x8E5D #define GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET 0x8E5E #define GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET 0x8E5F #define GL_MAX_PROGRAM_TEXTURE_GATHER_COMPONENTS 0x8F9F #define GL_TEXTURE_CUBE_MAP_ARRAY 0x9009 #define GL_TEXTURE_BINDING_CUBE_MAP_ARRAY 0x900A #define GL_PROXY_TEXTURE_CUBE_MAP_ARRAY 0x900B #define GL_SAMPLER_CUBE_MAP_ARRAY 0x900C #define GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW 0x900D #define GL_INT_SAMPLER_CUBE_MAP_ARRAY 0x900E #define GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY 0x900F typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONSEPARATEIPROC) (GLuint buf, GLenum modeRGB, GLenum modeAlpha); typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONIPROC) (GLuint buf, GLenum mode); typedef void (GLAPIENTRY * PFNGLBLENDFUNCSEPARATEIPROC) (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); typedef void (GLAPIENTRY * PFNGLBLENDFUNCIPROC) (GLuint buf, GLenum src, GLenum dst); typedef void (GLAPIENTRY * PFNGLMINSAMPLESHADINGPROC) (GLclampf value); #define glBlendEquationSeparatei GLEW_GET_FUN(__glewBlendEquationSeparatei) #define glBlendEquationi GLEW_GET_FUN(__glewBlendEquationi) #define glBlendFuncSeparatei GLEW_GET_FUN(__glewBlendFuncSeparatei) #define glBlendFunci GLEW_GET_FUN(__glewBlendFunci) #define glMinSampleShading GLEW_GET_FUN(__glewMinSampleShading) #define GLEW_VERSION_4_0 GLEW_GET_VAR(__GLEW_VERSION_4_0) #endif /* GL_VERSION_4_0 */ /* ----------------------------- GL_VERSION_4_1 ---------------------------- */ #ifndef GL_VERSION_4_1 #define GL_VERSION_4_1 1 #define GLEW_VERSION_4_1 GLEW_GET_VAR(__GLEW_VERSION_4_1) #endif /* GL_VERSION_4_1 */ /* ----------------------------- GL_VERSION_4_2 ---------------------------- */ #ifndef GL_VERSION_4_2 #define GL_VERSION_4_2 1 #define GL_COMPRESSED_RGBA_BPTC_UNORM 0x8E8C #define GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM 0x8E8D #define GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT 0x8E8E #define GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT 0x8E8F #define GLEW_VERSION_4_2 GLEW_GET_VAR(__GLEW_VERSION_4_2) #endif /* GL_VERSION_4_2 */ /* ----------------------------- GL_VERSION_4_3 ---------------------------- */ #ifndef GL_VERSION_4_3 #define GL_VERSION_4_3 1 #define GL_NUM_SHADING_LANGUAGE_VERSIONS 0x82E9 #define GL_VERTEX_ATTRIB_ARRAY_LONG 0x874E #define GLEW_VERSION_4_3 GLEW_GET_VAR(__GLEW_VERSION_4_3) #endif /* GL_VERSION_4_3 */ /* -------------------------- GL_3DFX_multisample -------------------------- */ #ifndef GL_3DFX_multisample #define GL_3DFX_multisample 1 #define GL_MULTISAMPLE_3DFX 0x86B2 #define GL_SAMPLE_BUFFERS_3DFX 0x86B3 #define GL_SAMPLES_3DFX 0x86B4 #define GL_MULTISAMPLE_BIT_3DFX 0x20000000 #define GLEW_3DFX_multisample GLEW_GET_VAR(__GLEW_3DFX_multisample) #endif /* GL_3DFX_multisample */ /* ---------------------------- GL_3DFX_tbuffer ---------------------------- */ #ifndef GL_3DFX_tbuffer #define GL_3DFX_tbuffer 1 typedef void (GLAPIENTRY * PFNGLTBUFFERMASK3DFXPROC) (GLuint mask); #define glTbufferMask3DFX GLEW_GET_FUN(__glewTbufferMask3DFX) #define GLEW_3DFX_tbuffer GLEW_GET_VAR(__GLEW_3DFX_tbuffer) #endif /* GL_3DFX_tbuffer */ /* -------------------- GL_3DFX_texture_compression_FXT1 ------------------- */ #ifndef GL_3DFX_texture_compression_FXT1 #define GL_3DFX_texture_compression_FXT1 1 #define GL_COMPRESSED_RGB_FXT1_3DFX 0x86B0 #define GL_COMPRESSED_RGBA_FXT1_3DFX 0x86B1 #define GLEW_3DFX_texture_compression_FXT1 GLEW_GET_VAR(__GLEW_3DFX_texture_compression_FXT1) #endif /* GL_3DFX_texture_compression_FXT1 */ /* ----------------------- GL_AMD_blend_minmax_factor ---------------------- */ #ifndef GL_AMD_blend_minmax_factor #define GL_AMD_blend_minmax_factor 1 #define GL_FACTOR_MIN_AMD 0x901C #define GL_FACTOR_MAX_AMD 0x901D #define GLEW_AMD_blend_minmax_factor GLEW_GET_VAR(__GLEW_AMD_blend_minmax_factor) #endif /* GL_AMD_blend_minmax_factor */ /* ----------------------- GL_AMD_conservative_depth ----------------------- */ #ifndef GL_AMD_conservative_depth #define GL_AMD_conservative_depth 1 #define GLEW_AMD_conservative_depth GLEW_GET_VAR(__GLEW_AMD_conservative_depth) #endif /* GL_AMD_conservative_depth */ /* -------------------------- GL_AMD_debug_output -------------------------- */ #ifndef GL_AMD_debug_output #define GL_AMD_debug_output 1 #define GL_MAX_DEBUG_MESSAGE_LENGTH_AMD 0x9143 #define GL_MAX_DEBUG_LOGGED_MESSAGES_AMD 0x9144 #define GL_DEBUG_LOGGED_MESSAGES_AMD 0x9145 #define GL_DEBUG_SEVERITY_HIGH_AMD 0x9146 #define GL_DEBUG_SEVERITY_MEDIUM_AMD 0x9147 #define GL_DEBUG_SEVERITY_LOW_AMD 0x9148 #define GL_DEBUG_CATEGORY_API_ERROR_AMD 0x9149 #define GL_DEBUG_CATEGORY_WINDOW_SYSTEM_AMD 0x914A #define GL_DEBUG_CATEGORY_DEPRECATION_AMD 0x914B #define GL_DEBUG_CATEGORY_UNDEFINED_BEHAVIOR_AMD 0x914C #define GL_DEBUG_CATEGORY_PERFORMANCE_AMD 0x914D #define GL_DEBUG_CATEGORY_SHADER_COMPILER_AMD 0x914E #define GL_DEBUG_CATEGORY_APPLICATION_AMD 0x914F #define GL_DEBUG_CATEGORY_OTHER_AMD 0x9150 typedef void (APIENTRY *GLDEBUGPROCAMD)(GLuint id, GLenum category, GLenum severity, GLsizei length, const GLchar* message, GLvoid* userParam); typedef void (GLAPIENTRY * PFNGLDEBUGMESSAGECALLBACKAMDPROC) (GLDEBUGPROCAMD callback, void* userParam); typedef void (GLAPIENTRY * PFNGLDEBUGMESSAGEENABLEAMDPROC) (GLenum category, GLenum severity, GLsizei count, const GLuint* ids, GLboolean enabled); typedef void (GLAPIENTRY * PFNGLDEBUGMESSAGEINSERTAMDPROC) (GLenum category, GLenum severity, GLuint id, GLsizei length, const GLchar* buf); typedef GLuint (GLAPIENTRY * PFNGLGETDEBUGMESSAGELOGAMDPROC) (GLuint count, GLsizei bufsize, GLenum* categories, GLuint* severities, GLuint* ids, GLsizei* lengths, GLchar* message); #define glDebugMessageCallbackAMD GLEW_GET_FUN(__glewDebugMessageCallbackAMD) #define glDebugMessageEnableAMD GLEW_GET_FUN(__glewDebugMessageEnableAMD) #define glDebugMessageInsertAMD GLEW_GET_FUN(__glewDebugMessageInsertAMD) #define glGetDebugMessageLogAMD GLEW_GET_FUN(__glewGetDebugMessageLogAMD) #define GLEW_AMD_debug_output GLEW_GET_VAR(__GLEW_AMD_debug_output) #endif /* GL_AMD_debug_output */ /* ---------------------- GL_AMD_depth_clamp_separate ---------------------- */ #ifndef GL_AMD_depth_clamp_separate #define GL_AMD_depth_clamp_separate 1 #define GL_DEPTH_CLAMP_NEAR_AMD 0x901E #define GL_DEPTH_CLAMP_FAR_AMD 0x901F #define GLEW_AMD_depth_clamp_separate GLEW_GET_VAR(__GLEW_AMD_depth_clamp_separate) #endif /* GL_AMD_depth_clamp_separate */ /* ----------------------- GL_AMD_draw_buffers_blend ----------------------- */ #ifndef GL_AMD_draw_buffers_blend #define GL_AMD_draw_buffers_blend 1 typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONINDEXEDAMDPROC) (GLuint buf, GLenum mode); typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONSEPARATEINDEXEDAMDPROC) (GLuint buf, GLenum modeRGB, GLenum modeAlpha); typedef void (GLAPIENTRY * PFNGLBLENDFUNCINDEXEDAMDPROC) (GLuint buf, GLenum src, GLenum dst); typedef void (GLAPIENTRY * PFNGLBLENDFUNCSEPARATEINDEXEDAMDPROC) (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); #define glBlendEquationIndexedAMD GLEW_GET_FUN(__glewBlendEquationIndexedAMD) #define glBlendEquationSeparateIndexedAMD GLEW_GET_FUN(__glewBlendEquationSeparateIndexedAMD) #define glBlendFuncIndexedAMD GLEW_GET_FUN(__glewBlendFuncIndexedAMD) #define glBlendFuncSeparateIndexedAMD GLEW_GET_FUN(__glewBlendFuncSeparateIndexedAMD) #define GLEW_AMD_draw_buffers_blend GLEW_GET_VAR(__GLEW_AMD_draw_buffers_blend) #endif /* GL_AMD_draw_buffers_blend */ /* ----------------------- GL_AMD_multi_draw_indirect ---------------------- */ #ifndef GL_AMD_multi_draw_indirect #define GL_AMD_multi_draw_indirect 1 typedef void (GLAPIENTRY * PFNGLMULTIDRAWARRAYSINDIRECTAMDPROC) (GLenum mode, const void* indirect, GLsizei primcount, GLsizei stride); typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTSINDIRECTAMDPROC) (GLenum mode, GLenum type, const void* indirect, GLsizei primcount, GLsizei stride); #define glMultiDrawArraysIndirectAMD GLEW_GET_FUN(__glewMultiDrawArraysIndirectAMD) #define glMultiDrawElementsIndirectAMD GLEW_GET_FUN(__glewMultiDrawElementsIndirectAMD) #define GLEW_AMD_multi_draw_indirect GLEW_GET_VAR(__GLEW_AMD_multi_draw_indirect) #endif /* GL_AMD_multi_draw_indirect */ /* ------------------------- GL_AMD_name_gen_delete ------------------------ */ #ifndef GL_AMD_name_gen_delete #define GL_AMD_name_gen_delete 1 #define GL_DATA_BUFFER_AMD 0x9151 #define GL_PERFORMANCE_MONITOR_AMD 0x9152 #define GL_QUERY_OBJECT_AMD 0x9153 #define GL_VERTEX_ARRAY_OBJECT_AMD 0x9154 #define GL_SAMPLER_OBJECT_AMD 0x9155 typedef void (GLAPIENTRY * PFNGLDELETENAMESAMDPROC) (GLenum identifier, GLuint num, const GLuint* names); typedef void (GLAPIENTRY * PFNGLGENNAMESAMDPROC) (GLenum identifier, GLuint num, GLuint* names); typedef GLboolean (GLAPIENTRY * PFNGLISNAMEAMDPROC) (GLenum identifier, GLuint name); #define glDeleteNamesAMD GLEW_GET_FUN(__glewDeleteNamesAMD) #define glGenNamesAMD GLEW_GET_FUN(__glewGenNamesAMD) #define glIsNameAMD GLEW_GET_FUN(__glewIsNameAMD) #define GLEW_AMD_name_gen_delete GLEW_GET_VAR(__GLEW_AMD_name_gen_delete) #endif /* GL_AMD_name_gen_delete */ /* ----------------------- GL_AMD_performance_monitor ---------------------- */ #ifndef GL_AMD_performance_monitor #define GL_AMD_performance_monitor 1 #define GL_COUNTER_TYPE_AMD 0x8BC0 #define GL_COUNTER_RANGE_AMD 0x8BC1 #define GL_UNSIGNED_INT64_AMD 0x8BC2 #define GL_PERCENTAGE_AMD 0x8BC3 #define GL_PERFMON_RESULT_AVAILABLE_AMD 0x8BC4 #define GL_PERFMON_RESULT_SIZE_AMD 0x8BC5 #define GL_PERFMON_RESULT_AMD 0x8BC6 typedef void (GLAPIENTRY * PFNGLBEGINPERFMONITORAMDPROC) (GLuint monitor); typedef void (GLAPIENTRY * PFNGLDELETEPERFMONITORSAMDPROC) (GLsizei n, GLuint* monitors); typedef void (GLAPIENTRY * PFNGLENDPERFMONITORAMDPROC) (GLuint monitor); typedef void (GLAPIENTRY * PFNGLGENPERFMONITORSAMDPROC) (GLsizei n, GLuint* monitors); typedef void (GLAPIENTRY * PFNGLGETPERFMONITORCOUNTERDATAAMDPROC) (GLuint monitor, GLenum pname, GLsizei dataSize, GLuint* data, GLint *bytesWritten); typedef void (GLAPIENTRY * PFNGLGETPERFMONITORCOUNTERINFOAMDPROC) (GLuint group, GLuint counter, GLenum pname, void* data); typedef void (GLAPIENTRY * PFNGLGETPERFMONITORCOUNTERSTRINGAMDPROC) (GLuint group, GLuint counter, GLsizei bufSize, GLsizei* length, GLchar *counterString); typedef void (GLAPIENTRY * PFNGLGETPERFMONITORCOUNTERSAMDPROC) (GLuint group, GLint* numCounters, GLint *maxActiveCounters, GLsizei countersSize, GLuint *counters); typedef void (GLAPIENTRY * PFNGLGETPERFMONITORGROUPSTRINGAMDPROC) (GLuint group, GLsizei bufSize, GLsizei* length, GLchar *groupString); typedef void (GLAPIENTRY * PFNGLGETPERFMONITORGROUPSAMDPROC) (GLint* numGroups, GLsizei groupsSize, GLuint *groups); typedef void (GLAPIENTRY * PFNGLSELECTPERFMONITORCOUNTERSAMDPROC) (GLuint monitor, GLboolean enable, GLuint group, GLint numCounters, GLuint* counterList); #define glBeginPerfMonitorAMD GLEW_GET_FUN(__glewBeginPerfMonitorAMD) #define glDeletePerfMonitorsAMD GLEW_GET_FUN(__glewDeletePerfMonitorsAMD) #define glEndPerfMonitorAMD GLEW_GET_FUN(__glewEndPerfMonitorAMD) #define glGenPerfMonitorsAMD GLEW_GET_FUN(__glewGenPerfMonitorsAMD) #define glGetPerfMonitorCounterDataAMD GLEW_GET_FUN(__glewGetPerfMonitorCounterDataAMD) #define glGetPerfMonitorCounterInfoAMD GLEW_GET_FUN(__glewGetPerfMonitorCounterInfoAMD) #define glGetPerfMonitorCounterStringAMD GLEW_GET_FUN(__glewGetPerfMonitorCounterStringAMD) #define glGetPerfMonitorCountersAMD GLEW_GET_FUN(__glewGetPerfMonitorCountersAMD) #define glGetPerfMonitorGroupStringAMD GLEW_GET_FUN(__glewGetPerfMonitorGroupStringAMD) #define glGetPerfMonitorGroupsAMD GLEW_GET_FUN(__glewGetPerfMonitorGroupsAMD) #define glSelectPerfMonitorCountersAMD GLEW_GET_FUN(__glewSelectPerfMonitorCountersAMD) #define GLEW_AMD_performance_monitor GLEW_GET_VAR(__GLEW_AMD_performance_monitor) #endif /* GL_AMD_performance_monitor */ /* -------------------------- GL_AMD_pinned_memory ------------------------- */ #ifndef GL_AMD_pinned_memory #define GL_AMD_pinned_memory 1 #define GL_EXTERNAL_VIRTUAL_MEMORY_BUFFER_AMD 0x9160 #define GLEW_AMD_pinned_memory GLEW_GET_VAR(__GLEW_AMD_pinned_memory) #endif /* GL_AMD_pinned_memory */ /* ----------------------- GL_AMD_query_buffer_object ---------------------- */ #ifndef GL_AMD_query_buffer_object #define GL_AMD_query_buffer_object 1 #define GL_QUERY_BUFFER_AMD 0x9192 #define GL_QUERY_BUFFER_BINDING_AMD 0x9193 #define GL_QUERY_RESULT_NO_WAIT_AMD 0x9194 #define GLEW_AMD_query_buffer_object GLEW_GET_VAR(__GLEW_AMD_query_buffer_object) #endif /* GL_AMD_query_buffer_object */ /* ------------------------ GL_AMD_sample_positions ------------------------ */ #ifndef GL_AMD_sample_positions #define GL_AMD_sample_positions 1 #define GL_SUBSAMPLE_DISTANCE_AMD 0x883F typedef void (GLAPIENTRY * PFNGLSETMULTISAMPLEFVAMDPROC) (GLenum pname, GLuint index, const GLfloat* val); #define glSetMultisamplefvAMD GLEW_GET_FUN(__glewSetMultisamplefvAMD) #define GLEW_AMD_sample_positions GLEW_GET_VAR(__GLEW_AMD_sample_positions) #endif /* GL_AMD_sample_positions */ /* ------------------ GL_AMD_seamless_cubemap_per_texture ------------------ */ #ifndef GL_AMD_seamless_cubemap_per_texture #define GL_AMD_seamless_cubemap_per_texture 1 #define GL_TEXTURE_CUBE_MAP_SEAMLESS_ARB 0x884F #define GLEW_AMD_seamless_cubemap_per_texture GLEW_GET_VAR(__GLEW_AMD_seamless_cubemap_per_texture) #endif /* GL_AMD_seamless_cubemap_per_texture */ /* ---------------------- GL_AMD_shader_stencil_export --------------------- */ #ifndef GL_AMD_shader_stencil_export #define GL_AMD_shader_stencil_export 1 #define GLEW_AMD_shader_stencil_export GLEW_GET_VAR(__GLEW_AMD_shader_stencil_export) #endif /* GL_AMD_shader_stencil_export */ /* ------------------- GL_AMD_stencil_operation_extended ------------------- */ #ifndef GL_AMD_stencil_operation_extended #define GL_AMD_stencil_operation_extended 1 #define GL_SET_AMD 0x874A #define GL_REPLACE_VALUE_AMD 0x874B #define GL_STENCIL_OP_VALUE_AMD 0x874C #define GL_STENCIL_BACK_OP_VALUE_AMD 0x874D typedef void (GLAPIENTRY * PFNGLSTENCILOPVALUEAMDPROC) (GLenum face, GLuint value); #define glStencilOpValueAMD GLEW_GET_FUN(__glewStencilOpValueAMD) #define GLEW_AMD_stencil_operation_extended GLEW_GET_VAR(__GLEW_AMD_stencil_operation_extended) #endif /* GL_AMD_stencil_operation_extended */ /* ------------------------ GL_AMD_texture_texture4 ------------------------ */ #ifndef GL_AMD_texture_texture4 #define GL_AMD_texture_texture4 1 #define GLEW_AMD_texture_texture4 GLEW_GET_VAR(__GLEW_AMD_texture_texture4) #endif /* GL_AMD_texture_texture4 */ /* --------------- GL_AMD_transform_feedback3_lines_triangles -------------- */ #ifndef GL_AMD_transform_feedback3_lines_triangles #define GL_AMD_transform_feedback3_lines_triangles 1 #define GLEW_AMD_transform_feedback3_lines_triangles GLEW_GET_VAR(__GLEW_AMD_transform_feedback3_lines_triangles) #endif /* GL_AMD_transform_feedback3_lines_triangles */ /* ----------------------- GL_AMD_vertex_shader_layer ---------------------- */ #ifndef GL_AMD_vertex_shader_layer #define GL_AMD_vertex_shader_layer 1 #define GLEW_AMD_vertex_shader_layer GLEW_GET_VAR(__GLEW_AMD_vertex_shader_layer) #endif /* GL_AMD_vertex_shader_layer */ /* -------------------- GL_AMD_vertex_shader_tessellator ------------------- */ #ifndef GL_AMD_vertex_shader_tessellator #define GL_AMD_vertex_shader_tessellator 1 #define GL_SAMPLER_BUFFER_AMD 0x9001 #define GL_INT_SAMPLER_BUFFER_AMD 0x9002 #define GL_UNSIGNED_INT_SAMPLER_BUFFER_AMD 0x9003 #define GL_TESSELLATION_MODE_AMD 0x9004 #define GL_TESSELLATION_FACTOR_AMD 0x9005 #define GL_DISCRETE_AMD 0x9006 #define GL_CONTINUOUS_AMD 0x9007 typedef void (GLAPIENTRY * PFNGLTESSELLATIONFACTORAMDPROC) (GLfloat factor); typedef void (GLAPIENTRY * PFNGLTESSELLATIONMODEAMDPROC) (GLenum mode); #define glTessellationFactorAMD GLEW_GET_FUN(__glewTessellationFactorAMD) #define glTessellationModeAMD GLEW_GET_FUN(__glewTessellationModeAMD) #define GLEW_AMD_vertex_shader_tessellator GLEW_GET_VAR(__GLEW_AMD_vertex_shader_tessellator) #endif /* GL_AMD_vertex_shader_tessellator */ /* ------------------ GL_AMD_vertex_shader_viewport_index ------------------ */ #ifndef GL_AMD_vertex_shader_viewport_index #define GL_AMD_vertex_shader_viewport_index 1 #define GLEW_AMD_vertex_shader_viewport_index GLEW_GET_VAR(__GLEW_AMD_vertex_shader_viewport_index) #endif /* GL_AMD_vertex_shader_viewport_index */ /* ----------------------- GL_APPLE_aux_depth_stencil ---------------------- */ #ifndef GL_APPLE_aux_depth_stencil #define GL_APPLE_aux_depth_stencil 1 #define GL_AUX_DEPTH_STENCIL_APPLE 0x8A14 #define GLEW_APPLE_aux_depth_stencil GLEW_GET_VAR(__GLEW_APPLE_aux_depth_stencil) #endif /* GL_APPLE_aux_depth_stencil */ /* ------------------------ GL_APPLE_client_storage ------------------------ */ #ifndef GL_APPLE_client_storage #define GL_APPLE_client_storage 1 #define GL_UNPACK_CLIENT_STORAGE_APPLE 0x85B2 #define GLEW_APPLE_client_storage GLEW_GET_VAR(__GLEW_APPLE_client_storage) #endif /* GL_APPLE_client_storage */ /* ------------------------- GL_APPLE_element_array ------------------------ */ #ifndef GL_APPLE_element_array #define GL_APPLE_element_array 1 #define GL_ELEMENT_ARRAY_APPLE 0x8A0C #define GL_ELEMENT_ARRAY_TYPE_APPLE 0x8A0D #define GL_ELEMENT_ARRAY_POINTER_APPLE 0x8A0E typedef void (GLAPIENTRY * PFNGLDRAWELEMENTARRAYAPPLEPROC) (GLenum mode, GLint first, GLsizei count); typedef void (GLAPIENTRY * PFNGLDRAWRANGEELEMENTARRAYAPPLEPROC) (GLenum mode, GLuint start, GLuint end, GLint first, GLsizei count); typedef void (GLAPIENTRY * PFNGLELEMENTPOINTERAPPLEPROC) (GLenum type, const void* pointer); typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTARRAYAPPLEPROC) (GLenum mode, const GLint* first, const GLsizei *count, GLsizei primcount); typedef void (GLAPIENTRY * PFNGLMULTIDRAWRANGEELEMENTARRAYAPPLEPROC) (GLenum mode, GLuint start, GLuint end, const GLint* first, const GLsizei *count, GLsizei primcount); #define glDrawElementArrayAPPLE GLEW_GET_FUN(__glewDrawElementArrayAPPLE) #define glDrawRangeElementArrayAPPLE GLEW_GET_FUN(__glewDrawRangeElementArrayAPPLE) #define glElementPointerAPPLE GLEW_GET_FUN(__glewElementPointerAPPLE) #define glMultiDrawElementArrayAPPLE GLEW_GET_FUN(__glewMultiDrawElementArrayAPPLE) #define glMultiDrawRangeElementArrayAPPLE GLEW_GET_FUN(__glewMultiDrawRangeElementArrayAPPLE) #define GLEW_APPLE_element_array GLEW_GET_VAR(__GLEW_APPLE_element_array) #endif /* GL_APPLE_element_array */ /* ----------------------------- GL_APPLE_fence ---------------------------- */ #ifndef GL_APPLE_fence #define GL_APPLE_fence 1 #define GL_DRAW_PIXELS_APPLE 0x8A0A #define GL_FENCE_APPLE 0x8A0B typedef void (GLAPIENTRY * PFNGLDELETEFENCESAPPLEPROC) (GLsizei n, const GLuint* fences); typedef void (GLAPIENTRY * PFNGLFINISHFENCEAPPLEPROC) (GLuint fence); typedef void (GLAPIENTRY * PFNGLFINISHOBJECTAPPLEPROC) (GLenum object, GLint name); typedef void (GLAPIENTRY * PFNGLGENFENCESAPPLEPROC) (GLsizei n, GLuint* fences); typedef GLboolean (GLAPIENTRY * PFNGLISFENCEAPPLEPROC) (GLuint fence); typedef void (GLAPIENTRY * PFNGLSETFENCEAPPLEPROC) (GLuint fence); typedef GLboolean (GLAPIENTRY * PFNGLTESTFENCEAPPLEPROC) (GLuint fence); typedef GLboolean (GLAPIENTRY * PFNGLTESTOBJECTAPPLEPROC) (GLenum object, GLuint name); #define glDeleteFencesAPPLE GLEW_GET_FUN(__glewDeleteFencesAPPLE) #define glFinishFenceAPPLE GLEW_GET_FUN(__glewFinishFenceAPPLE) #define glFinishObjectAPPLE GLEW_GET_FUN(__glewFinishObjectAPPLE) #define glGenFencesAPPLE GLEW_GET_FUN(__glewGenFencesAPPLE) #define glIsFenceAPPLE GLEW_GET_FUN(__glewIsFenceAPPLE) #define glSetFenceAPPLE GLEW_GET_FUN(__glewSetFenceAPPLE) #define glTestFenceAPPLE GLEW_GET_FUN(__glewTestFenceAPPLE) #define glTestObjectAPPLE GLEW_GET_FUN(__glewTestObjectAPPLE) #define GLEW_APPLE_fence GLEW_GET_VAR(__GLEW_APPLE_fence) #endif /* GL_APPLE_fence */ /* ------------------------- GL_APPLE_float_pixels ------------------------- */ #ifndef GL_APPLE_float_pixels #define GL_APPLE_float_pixels 1 #define GL_HALF_APPLE 0x140B #define GL_RGBA_FLOAT32_APPLE 0x8814 #define GL_RGB_FLOAT32_APPLE 0x8815 #define GL_ALPHA_FLOAT32_APPLE 0x8816 #define GL_INTENSITY_FLOAT32_APPLE 0x8817 #define GL_LUMINANCE_FLOAT32_APPLE 0x8818 #define GL_LUMINANCE_ALPHA_FLOAT32_APPLE 0x8819 #define GL_RGBA_FLOAT16_APPLE 0x881A #define GL_RGB_FLOAT16_APPLE 0x881B #define GL_ALPHA_FLOAT16_APPLE 0x881C #define GL_INTENSITY_FLOAT16_APPLE 0x881D #define GL_LUMINANCE_FLOAT16_APPLE 0x881E #define GL_LUMINANCE_ALPHA_FLOAT16_APPLE 0x881F #define GL_COLOR_FLOAT_APPLE 0x8A0F #define GLEW_APPLE_float_pixels GLEW_GET_VAR(__GLEW_APPLE_float_pixels) #endif /* GL_APPLE_float_pixels */ /* ---------------------- GL_APPLE_flush_buffer_range ---------------------- */ #ifndef GL_APPLE_flush_buffer_range #define GL_APPLE_flush_buffer_range 1 #define GL_BUFFER_SERIALIZED_MODIFY_APPLE 0x8A12 #define GL_BUFFER_FLUSHING_UNMAP_APPLE 0x8A13 typedef void (GLAPIENTRY * PFNGLBUFFERPARAMETERIAPPLEPROC) (GLenum target, GLenum pname, GLint param); typedef void (GLAPIENTRY * PFNGLFLUSHMAPPEDBUFFERRANGEAPPLEPROC) (GLenum target, GLintptr offset, GLsizeiptr size); #define glBufferParameteriAPPLE GLEW_GET_FUN(__glewBufferParameteriAPPLE) #define glFlushMappedBufferRangeAPPLE GLEW_GET_FUN(__glewFlushMappedBufferRangeAPPLE) #define GLEW_APPLE_flush_buffer_range GLEW_GET_VAR(__GLEW_APPLE_flush_buffer_range) #endif /* GL_APPLE_flush_buffer_range */ /* ----------------------- GL_APPLE_object_purgeable ----------------------- */ #ifndef GL_APPLE_object_purgeable #define GL_APPLE_object_purgeable 1 #define GL_BUFFER_OBJECT_APPLE 0x85B3 #define GL_RELEASED_APPLE 0x8A19 #define GL_VOLATILE_APPLE 0x8A1A #define GL_RETAINED_APPLE 0x8A1B #define GL_UNDEFINED_APPLE 0x8A1C #define GL_PURGEABLE_APPLE 0x8A1D typedef void (GLAPIENTRY * PFNGLGETOBJECTPARAMETERIVAPPLEPROC) (GLenum objectType, GLuint name, GLenum pname, GLint* params); typedef GLenum (GLAPIENTRY * PFNGLOBJECTPURGEABLEAPPLEPROC) (GLenum objectType, GLuint name, GLenum option); typedef GLenum (GLAPIENTRY * PFNGLOBJECTUNPURGEABLEAPPLEPROC) (GLenum objectType, GLuint name, GLenum option); #define glGetObjectParameterivAPPLE GLEW_GET_FUN(__glewGetObjectParameterivAPPLE) #define glObjectPurgeableAPPLE GLEW_GET_FUN(__glewObjectPurgeableAPPLE) #define glObjectUnpurgeableAPPLE GLEW_GET_FUN(__glewObjectUnpurgeableAPPLE) #define GLEW_APPLE_object_purgeable GLEW_GET_VAR(__GLEW_APPLE_object_purgeable) #endif /* GL_APPLE_object_purgeable */ /* ------------------------- GL_APPLE_pixel_buffer ------------------------- */ #ifndef GL_APPLE_pixel_buffer #define GL_APPLE_pixel_buffer 1 #define GL_MIN_PBUFFER_VIEWPORT_DIMS_APPLE 0x8A10 #define GLEW_APPLE_pixel_buffer GLEW_GET_VAR(__GLEW_APPLE_pixel_buffer) #endif /* GL_APPLE_pixel_buffer */ /* ---------------------------- GL_APPLE_rgb_422 --------------------------- */ #ifndef GL_APPLE_rgb_422 #define GL_APPLE_rgb_422 1 #define GL_UNSIGNED_SHORT_8_8_APPLE 0x85BA #define GL_UNSIGNED_SHORT_8_8_REV_APPLE 0x85BB #define GL_RGB_422_APPLE 0x8A1F #define GLEW_APPLE_rgb_422 GLEW_GET_VAR(__GLEW_APPLE_rgb_422) #endif /* GL_APPLE_rgb_422 */ /* --------------------------- GL_APPLE_row_bytes -------------------------- */ #ifndef GL_APPLE_row_bytes #define GL_APPLE_row_bytes 1 #define GL_PACK_ROW_BYTES_APPLE 0x8A15 #define GL_UNPACK_ROW_BYTES_APPLE 0x8A16 #define GLEW_APPLE_row_bytes GLEW_GET_VAR(__GLEW_APPLE_row_bytes) #endif /* GL_APPLE_row_bytes */ /* ------------------------ GL_APPLE_specular_vector ----------------------- */ #ifndef GL_APPLE_specular_vector #define GL_APPLE_specular_vector 1 #define GL_LIGHT_MODEL_SPECULAR_VECTOR_APPLE 0x85B0 #define GLEW_APPLE_specular_vector GLEW_GET_VAR(__GLEW_APPLE_specular_vector) #endif /* GL_APPLE_specular_vector */ /* ------------------------- GL_APPLE_texture_range ------------------------ */ #ifndef GL_APPLE_texture_range #define GL_APPLE_texture_range 1 #define GL_TEXTURE_RANGE_LENGTH_APPLE 0x85B7 #define GL_TEXTURE_RANGE_POINTER_APPLE 0x85B8 #define GL_TEXTURE_STORAGE_HINT_APPLE 0x85BC #define GL_STORAGE_PRIVATE_APPLE 0x85BD #define GL_STORAGE_CACHED_APPLE 0x85BE #define GL_STORAGE_SHARED_APPLE 0x85BF typedef void (GLAPIENTRY * PFNGLGETTEXPARAMETERPOINTERVAPPLEPROC) (GLenum target, GLenum pname, GLvoid **params); typedef void (GLAPIENTRY * PFNGLTEXTURERANGEAPPLEPROC) (GLenum target, GLsizei length, GLvoid *pointer); #define glGetTexParameterPointervAPPLE GLEW_GET_FUN(__glewGetTexParameterPointervAPPLE) #define glTextureRangeAPPLE GLEW_GET_FUN(__glewTextureRangeAPPLE) #define GLEW_APPLE_texture_range GLEW_GET_VAR(__GLEW_APPLE_texture_range) #endif /* GL_APPLE_texture_range */ /* ------------------------ GL_APPLE_transform_hint ------------------------ */ #ifndef GL_APPLE_transform_hint #define GL_APPLE_transform_hint 1 #define GL_TRANSFORM_HINT_APPLE 0x85B1 #define GLEW_APPLE_transform_hint GLEW_GET_VAR(__GLEW_APPLE_transform_hint) #endif /* GL_APPLE_transform_hint */ /* ---------------------- GL_APPLE_vertex_array_object --------------------- */ #ifndef GL_APPLE_vertex_array_object #define GL_APPLE_vertex_array_object 1 #define GL_VERTEX_ARRAY_BINDING_APPLE 0x85B5 typedef void (GLAPIENTRY * PFNGLBINDVERTEXARRAYAPPLEPROC) (GLuint array); typedef void (GLAPIENTRY * PFNGLDELETEVERTEXARRAYSAPPLEPROC) (GLsizei n, const GLuint* arrays); typedef void (GLAPIENTRY * PFNGLGENVERTEXARRAYSAPPLEPROC) (GLsizei n, const GLuint* arrays); typedef GLboolean (GLAPIENTRY * PFNGLISVERTEXARRAYAPPLEPROC) (GLuint array); #define glBindVertexArrayAPPLE GLEW_GET_FUN(__glewBindVertexArrayAPPLE) #define glDeleteVertexArraysAPPLE GLEW_GET_FUN(__glewDeleteVertexArraysAPPLE) #define glGenVertexArraysAPPLE GLEW_GET_FUN(__glewGenVertexArraysAPPLE) #define glIsVertexArrayAPPLE GLEW_GET_FUN(__glewIsVertexArrayAPPLE) #define GLEW_APPLE_vertex_array_object GLEW_GET_VAR(__GLEW_APPLE_vertex_array_object) #endif /* GL_APPLE_vertex_array_object */ /* ---------------------- GL_APPLE_vertex_array_range ---------------------- */ #ifndef GL_APPLE_vertex_array_range #define GL_APPLE_vertex_array_range 1 #define GL_VERTEX_ARRAY_RANGE_APPLE 0x851D #define GL_VERTEX_ARRAY_RANGE_LENGTH_APPLE 0x851E #define GL_VERTEX_ARRAY_STORAGE_HINT_APPLE 0x851F #define GL_MAX_VERTEX_ARRAY_RANGE_ELEMENT_APPLE 0x8520 #define GL_VERTEX_ARRAY_RANGE_POINTER_APPLE 0x8521 #define GL_STORAGE_CLIENT_APPLE 0x85B4 #define GL_STORAGE_CACHED_APPLE 0x85BE #define GL_STORAGE_SHARED_APPLE 0x85BF typedef void (GLAPIENTRY * PFNGLFLUSHVERTEXARRAYRANGEAPPLEPROC) (GLsizei length, void* pointer); typedef void (GLAPIENTRY * PFNGLVERTEXARRAYPARAMETERIAPPLEPROC) (GLenum pname, GLint param); typedef void (GLAPIENTRY * PFNGLVERTEXARRAYRANGEAPPLEPROC) (GLsizei length, void* pointer); #define glFlushVertexArrayRangeAPPLE GLEW_GET_FUN(__glewFlushVertexArrayRangeAPPLE) #define glVertexArrayParameteriAPPLE GLEW_GET_FUN(__glewVertexArrayParameteriAPPLE) #define glVertexArrayRangeAPPLE GLEW_GET_FUN(__glewVertexArrayRangeAPPLE) #define GLEW_APPLE_vertex_array_range GLEW_GET_VAR(__GLEW_APPLE_vertex_array_range) #endif /* GL_APPLE_vertex_array_range */ /* ------------------- GL_APPLE_vertex_program_evaluators ------------------ */ #ifndef GL_APPLE_vertex_program_evaluators #define GL_APPLE_vertex_program_evaluators 1 #define GL_VERTEX_ATTRIB_MAP1_APPLE 0x8A00 #define GL_VERTEX_ATTRIB_MAP2_APPLE 0x8A01 #define GL_VERTEX_ATTRIB_MAP1_SIZE_APPLE 0x8A02 #define GL_VERTEX_ATTRIB_MAP1_COEFF_APPLE 0x8A03 #define GL_VERTEX_ATTRIB_MAP1_ORDER_APPLE 0x8A04 #define GL_VERTEX_ATTRIB_MAP1_DOMAIN_APPLE 0x8A05 #define GL_VERTEX_ATTRIB_MAP2_SIZE_APPLE 0x8A06 #define GL_VERTEX_ATTRIB_MAP2_COEFF_APPLE 0x8A07 #define GL_VERTEX_ATTRIB_MAP2_ORDER_APPLE 0x8A08 #define GL_VERTEX_ATTRIB_MAP2_DOMAIN_APPLE 0x8A09 typedef void (GLAPIENTRY * PFNGLDISABLEVERTEXATTRIBAPPLEPROC) (GLuint index, GLenum pname); typedef void (GLAPIENTRY * PFNGLENABLEVERTEXATTRIBAPPLEPROC) (GLuint index, GLenum pname); typedef GLboolean (GLAPIENTRY * PFNGLISVERTEXATTRIBENABLEDAPPLEPROC) (GLuint index, GLenum pname); typedef void (GLAPIENTRY * PFNGLMAPVERTEXATTRIB1DAPPLEPROC) (GLuint index, GLuint size, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble* points); typedef void (GLAPIENTRY * PFNGLMAPVERTEXATTRIB1FAPPLEPROC) (GLuint index, GLuint size, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat* points); typedef void (GLAPIENTRY * PFNGLMAPVERTEXATTRIB2DAPPLEPROC) (GLuint index, GLuint size, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble* points); typedef void (GLAPIENTRY * PFNGLMAPVERTEXATTRIB2FAPPLEPROC) (GLuint index, GLuint size, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat* points); #define glDisableVertexAttribAPPLE GLEW_GET_FUN(__glewDisableVertexAttribAPPLE) #define glEnableVertexAttribAPPLE GLEW_GET_FUN(__glewEnableVertexAttribAPPLE) #define glIsVertexAttribEnabledAPPLE GLEW_GET_FUN(__glewIsVertexAttribEnabledAPPLE) #define glMapVertexAttrib1dAPPLE GLEW_GET_FUN(__glewMapVertexAttrib1dAPPLE) #define glMapVertexAttrib1fAPPLE GLEW_GET_FUN(__glewMapVertexAttrib1fAPPLE) #define glMapVertexAttrib2dAPPLE GLEW_GET_FUN(__glewMapVertexAttrib2dAPPLE) #define glMapVertexAttrib2fAPPLE GLEW_GET_FUN(__glewMapVertexAttrib2fAPPLE) #define GLEW_APPLE_vertex_program_evaluators GLEW_GET_VAR(__GLEW_APPLE_vertex_program_evaluators) #endif /* GL_APPLE_vertex_program_evaluators */ /* --------------------------- GL_APPLE_ycbcr_422 -------------------------- */ #ifndef GL_APPLE_ycbcr_422 #define GL_APPLE_ycbcr_422 1 #define GL_YCBCR_422_APPLE 0x85B9 #define GLEW_APPLE_ycbcr_422 GLEW_GET_VAR(__GLEW_APPLE_ycbcr_422) #endif /* GL_APPLE_ycbcr_422 */ /* ------------------------ GL_ARB_ES2_compatibility ----------------------- */ #ifndef GL_ARB_ES2_compatibility #define GL_ARB_ES2_compatibility 1 #define GL_FIXED 0x140C #define GL_IMPLEMENTATION_COLOR_READ_TYPE 0x8B9A #define GL_IMPLEMENTATION_COLOR_READ_FORMAT 0x8B9B #define GL_RGB565 0x8D62 #define GL_LOW_FLOAT 0x8DF0 #define GL_MEDIUM_FLOAT 0x8DF1 #define GL_HIGH_FLOAT 0x8DF2 #define GL_LOW_INT 0x8DF3 #define GL_MEDIUM_INT 0x8DF4 #define GL_HIGH_INT 0x8DF5 #define GL_SHADER_BINARY_FORMATS 0x8DF8 #define GL_NUM_SHADER_BINARY_FORMATS 0x8DF9 #define GL_SHADER_COMPILER 0x8DFA #define GL_MAX_VERTEX_UNIFORM_VECTORS 0x8DFB #define GL_MAX_VARYING_VECTORS 0x8DFC #define GL_MAX_FRAGMENT_UNIFORM_VECTORS 0x8DFD typedef void (GLAPIENTRY * PFNGLCLEARDEPTHFPROC) (GLclampf d); typedef void (GLAPIENTRY * PFNGLDEPTHRANGEFPROC) (GLclampf n, GLclampf f); typedef void (GLAPIENTRY * PFNGLGETSHADERPRECISIONFORMATPROC) (GLenum shadertype, GLenum precisiontype, GLint* range, GLint *precision); typedef void (GLAPIENTRY * PFNGLRELEASESHADERCOMPILERPROC) (void); typedef void (GLAPIENTRY * PFNGLSHADERBINARYPROC) (GLsizei count, const GLuint* shaders, GLenum binaryformat, const GLvoid*binary, GLsizei length); #define glClearDepthf GLEW_GET_FUN(__glewClearDepthf) #define glDepthRangef GLEW_GET_FUN(__glewDepthRangef) #define glGetShaderPrecisionFormat GLEW_GET_FUN(__glewGetShaderPrecisionFormat) #define glReleaseShaderCompiler GLEW_GET_FUN(__glewReleaseShaderCompiler) #define glShaderBinary GLEW_GET_FUN(__glewShaderBinary) #define GLEW_ARB_ES2_compatibility GLEW_GET_VAR(__GLEW_ARB_ES2_compatibility) #endif /* GL_ARB_ES2_compatibility */ /* ------------------------ GL_ARB_ES3_compatibility ----------------------- */ #ifndef GL_ARB_ES3_compatibility #define GL_ARB_ES3_compatibility 1 #define GL_PRIMITIVE_RESTART_FIXED_INDEX 0x8D69 #define GL_ANY_SAMPLES_PASSED_CONSERVATIVE 0x8D6A #define GL_MAX_ELEMENT_INDEX 0x8D6B #define GL_COMPRESSED_R11_EAC 0x9270 #define GL_COMPRESSED_SIGNED_R11_EAC 0x9271 #define GL_COMPRESSED_RG11_EAC 0x9272 #define GL_COMPRESSED_SIGNED_RG11_EAC 0x9273 #define GL_COMPRESSED_RGB8_ETC2 0x9274 #define GL_COMPRESSED_SRGB8_ETC2 0x9275 #define GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 0x9276 #define GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 0x9277 #define GL_COMPRESSED_RGBA8_ETC2_EAC 0x9278 #define GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC 0x9279 #define GLEW_ARB_ES3_compatibility GLEW_GET_VAR(__GLEW_ARB_ES3_compatibility) #endif /* GL_ARB_ES3_compatibility */ /* ------------------------ GL_ARB_arrays_of_arrays ------------------------ */ #ifndef GL_ARB_arrays_of_arrays #define GL_ARB_arrays_of_arrays 1 #define GLEW_ARB_arrays_of_arrays GLEW_GET_VAR(__GLEW_ARB_arrays_of_arrays) #endif /* GL_ARB_arrays_of_arrays */ /* -------------------------- GL_ARB_base_instance ------------------------- */ #ifndef GL_ARB_base_instance #define GL_ARB_base_instance 1 typedef void (GLAPIENTRY * PFNGLDRAWARRAYSINSTANCEDBASEINSTANCEPROC) (GLenum mode, GLint first, GLsizei count, GLsizei primcount, GLuint baseinstance); typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSINSTANCEDBASEINSTANCEPROC) (GLenum mode, GLsizei count, GLenum type, const void* indices, GLsizei primcount, GLuint baseinstance); typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEPROC) (GLenum mode, GLsizei count, GLenum type, const void* indices, GLsizei primcount, GLint basevertex, GLuint baseinstance); #define glDrawArraysInstancedBaseInstance GLEW_GET_FUN(__glewDrawArraysInstancedBaseInstance) #define glDrawElementsInstancedBaseInstance GLEW_GET_FUN(__glewDrawElementsInstancedBaseInstance) #define glDrawElementsInstancedBaseVertexBaseInstance GLEW_GET_FUN(__glewDrawElementsInstancedBaseVertexBaseInstance) #define GLEW_ARB_base_instance GLEW_GET_VAR(__GLEW_ARB_base_instance) #endif /* GL_ARB_base_instance */ /* ----------------------- GL_ARB_blend_func_extended ---------------------- */ #ifndef GL_ARB_blend_func_extended #define GL_ARB_blend_func_extended 1 #define GL_SRC1_COLOR 0x88F9 #define GL_ONE_MINUS_SRC1_COLOR 0x88FA #define GL_ONE_MINUS_SRC1_ALPHA 0x88FB #define GL_MAX_DUAL_SOURCE_DRAW_BUFFERS 0x88FC typedef void (GLAPIENTRY * PFNGLBINDFRAGDATALOCATIONINDEXEDPROC) (GLuint program, GLuint colorNumber, GLuint index, const GLchar * name); typedef GLint (GLAPIENTRY * PFNGLGETFRAGDATAINDEXPROC) (GLuint program, const GLchar * name); #define glBindFragDataLocationIndexed GLEW_GET_FUN(__glewBindFragDataLocationIndexed) #define glGetFragDataIndex GLEW_GET_FUN(__glewGetFragDataIndex) #define GLEW_ARB_blend_func_extended GLEW_GET_VAR(__GLEW_ARB_blend_func_extended) #endif /* GL_ARB_blend_func_extended */ /* ---------------------------- GL_ARB_cl_event ---------------------------- */ #ifndef GL_ARB_cl_event #define GL_ARB_cl_event 1 #define GL_SYNC_CL_EVENT_ARB 0x8240 #define GL_SYNC_CL_EVENT_COMPLETE_ARB 0x8241 typedef struct _cl_context *cl_context; typedef struct _cl_event *cl_event; typedef GLsync (GLAPIENTRY * PFNGLCREATESYNCFROMCLEVENTARBPROC) (cl_context context, cl_event event, GLbitfield flags); #define glCreateSyncFromCLeventARB GLEW_GET_FUN(__glewCreateSyncFromCLeventARB) #define GLEW_ARB_cl_event GLEW_GET_VAR(__GLEW_ARB_cl_event) #endif /* GL_ARB_cl_event */ /* ----------------------- GL_ARB_clear_buffer_object ---------------------- */ #ifndef GL_ARB_clear_buffer_object #define GL_ARB_clear_buffer_object 1 typedef void (GLAPIENTRY * PFNGLCLEARBUFFERDATAPROC) (GLenum target, GLenum internalformat, GLenum format, GLenum type, const GLvoid* data); typedef void (GLAPIENTRY * PFNGLCLEARBUFFERSUBDATAPROC) (GLenum target, GLenum internalformat, GLintptr offset, GLsizeiptr size, GLenum format, GLenum type, const GLvoid* data); typedef void (GLAPIENTRY * PFNGLCLEARNAMEDBUFFERDATAEXTPROC) (GLuint buffer, GLenum internalformat, GLenum format, GLenum type, const GLvoid* data); typedef void (GLAPIENTRY * PFNGLCLEARNAMEDBUFFERSUBDATAEXTPROC) (GLuint buffer, GLenum internalformat, GLintptr offset, GLsizeiptr size, GLenum format, GLenum type, const GLvoid* data); #define glClearBufferData GLEW_GET_FUN(__glewClearBufferData) #define glClearBufferSubData GLEW_GET_FUN(__glewClearBufferSubData) #define glClearNamedBufferDataEXT GLEW_GET_FUN(__glewClearNamedBufferDataEXT) #define glClearNamedBufferSubDataEXT GLEW_GET_FUN(__glewClearNamedBufferSubDataEXT) #define GLEW_ARB_clear_buffer_object GLEW_GET_VAR(__GLEW_ARB_clear_buffer_object) #endif /* GL_ARB_clear_buffer_object */ /* ----------------------- GL_ARB_color_buffer_float ----------------------- */ #ifndef GL_ARB_color_buffer_float #define GL_ARB_color_buffer_float 1 #define GL_RGBA_FLOAT_MODE_ARB 0x8820 #define GL_CLAMP_VERTEX_COLOR_ARB 0x891A #define GL_CLAMP_FRAGMENT_COLOR_ARB 0x891B #define GL_CLAMP_READ_COLOR_ARB 0x891C #define GL_FIXED_ONLY_ARB 0x891D typedef void (GLAPIENTRY * PFNGLCLAMPCOLORARBPROC) (GLenum target, GLenum clamp); #define glClampColorARB GLEW_GET_FUN(__glewClampColorARB) #define GLEW_ARB_color_buffer_float GLEW_GET_VAR(__GLEW_ARB_color_buffer_float) #endif /* GL_ARB_color_buffer_float */ /* -------------------------- GL_ARB_compatibility ------------------------- */ #ifndef GL_ARB_compatibility #define GL_ARB_compatibility 1 #define GLEW_ARB_compatibility GLEW_GET_VAR(__GLEW_ARB_compatibility) #endif /* GL_ARB_compatibility */ /* ---------------- GL_ARB_compressed_texture_pixel_storage ---------------- */ #ifndef GL_ARB_compressed_texture_pixel_storage #define GL_ARB_compressed_texture_pixel_storage 1 #define GL_UNPACK_COMPRESSED_BLOCK_WIDTH 0x9127 #define GL_UNPACK_COMPRESSED_BLOCK_HEIGHT 0x9128 #define GL_UNPACK_COMPRESSED_BLOCK_DEPTH 0x9129 #define GL_UNPACK_COMPRESSED_BLOCK_SIZE 0x912A #define GL_PACK_COMPRESSED_BLOCK_WIDTH 0x912B #define GL_PACK_COMPRESSED_BLOCK_HEIGHT 0x912C #define GL_PACK_COMPRESSED_BLOCK_DEPTH 0x912D #define GL_PACK_COMPRESSED_BLOCK_SIZE 0x912E #define GLEW_ARB_compressed_texture_pixel_storage GLEW_GET_VAR(__GLEW_ARB_compressed_texture_pixel_storage) #endif /* GL_ARB_compressed_texture_pixel_storage */ /* ------------------------- GL_ARB_compute_shader ------------------------- */ #ifndef GL_ARB_compute_shader #define GL_ARB_compute_shader 1 #define GL_COMPUTE_SHADER_BIT 0x00000020 #define GL_MAX_COMPUTE_SHARED_MEMORY_SIZE 0x8262 #define GL_MAX_COMPUTE_UNIFORM_COMPONENTS 0x8263 #define GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS 0x8264 #define GL_MAX_COMPUTE_ATOMIC_COUNTERS 0x8265 #define GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS 0x8266 #define GL_COMPUTE_WORK_GROUP_SIZE 0x8267 #define GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS 0x90EB #define GL_UNIFORM_BLOCK_REFERENCED_BY_COMPUTE_SHADER 0x90EC #define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_COMPUTE_SHADER 0x90ED #define GL_DISPATCH_INDIRECT_BUFFER 0x90EE #define GL_DISPATCH_INDIRECT_BUFFER_BINDING 0x90EF #define GL_COMPUTE_SHADER 0x91B9 #define GL_MAX_COMPUTE_UNIFORM_BLOCKS 0x91BB #define GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS 0x91BC #define GL_MAX_COMPUTE_IMAGE_UNIFORMS 0x91BD #define GL_MAX_COMPUTE_WORK_GROUP_COUNT 0x91BE #define GL_MAX_COMPUTE_WORK_GROUP_SIZE 0x91BF typedef void (GLAPIENTRY * PFNGLDISPATCHCOMPUTEPROC) (GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z); typedef void (GLAPIENTRY * PFNGLDISPATCHCOMPUTEINDIRECTPROC) (GLintptr indirect); #define glDispatchCompute GLEW_GET_FUN(__glewDispatchCompute) #define glDispatchComputeIndirect GLEW_GET_FUN(__glewDispatchComputeIndirect) #define GLEW_ARB_compute_shader GLEW_GET_VAR(__GLEW_ARB_compute_shader) #endif /* GL_ARB_compute_shader */ /* ----------------------- GL_ARB_conservative_depth ----------------------- */ #ifndef GL_ARB_conservative_depth #define GL_ARB_conservative_depth 1 #define GLEW_ARB_conservative_depth GLEW_GET_VAR(__GLEW_ARB_conservative_depth) #endif /* GL_ARB_conservative_depth */ /* --------------------------- GL_ARB_copy_buffer -------------------------- */ #ifndef GL_ARB_copy_buffer #define GL_ARB_copy_buffer 1 #define GL_COPY_READ_BUFFER 0x8F36 #define GL_COPY_WRITE_BUFFER 0x8F37 typedef void (GLAPIENTRY * PFNGLCOPYBUFFERSUBDATAPROC) (GLenum readtarget, GLenum writetarget, GLintptr readoffset, GLintptr writeoffset, GLsizeiptr size); #define glCopyBufferSubData GLEW_GET_FUN(__glewCopyBufferSubData) #define GLEW_ARB_copy_buffer GLEW_GET_VAR(__GLEW_ARB_copy_buffer) #endif /* GL_ARB_copy_buffer */ /* --------------------------- GL_ARB_copy_image --------------------------- */ #ifndef GL_ARB_copy_image #define GL_ARB_copy_image 1 typedef void (GLAPIENTRY * PFNGLCOPYIMAGESUBDATAPROC) (GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei srcWidth, GLsizei srcHeight, GLsizei srcDepth); #define glCopyImageSubData GLEW_GET_FUN(__glewCopyImageSubData) #define GLEW_ARB_copy_image GLEW_GET_VAR(__GLEW_ARB_copy_image) #endif /* GL_ARB_copy_image */ /* -------------------------- GL_ARB_debug_output -------------------------- */ #ifndef GL_ARB_debug_output #define GL_ARB_debug_output 1 #define GL_DEBUG_OUTPUT_SYNCHRONOUS_ARB 0x8242 #define GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH_ARB 0x8243 #define GL_DEBUG_CALLBACK_FUNCTION_ARB 0x8244 #define GL_DEBUG_CALLBACK_USER_PARAM_ARB 0x8245 #define GL_DEBUG_SOURCE_API_ARB 0x8246 #define GL_DEBUG_SOURCE_WINDOW_SYSTEM_ARB 0x8247 #define GL_DEBUG_SOURCE_SHADER_COMPILER_ARB 0x8248 #define GL_DEBUG_SOURCE_THIRD_PARTY_ARB 0x8249 #define GL_DEBUG_SOURCE_APPLICATION_ARB 0x824A #define GL_DEBUG_SOURCE_OTHER_ARB 0x824B #define GL_DEBUG_TYPE_ERROR_ARB 0x824C #define GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR_ARB 0x824D #define GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR_ARB 0x824E #define GL_DEBUG_TYPE_PORTABILITY_ARB 0x824F #define GL_DEBUG_TYPE_PERFORMANCE_ARB 0x8250 #define GL_DEBUG_TYPE_OTHER_ARB 0x8251 #define GL_MAX_DEBUG_MESSAGE_LENGTH_ARB 0x9143 #define GL_MAX_DEBUG_LOGGED_MESSAGES_ARB 0x9144 #define GL_DEBUG_LOGGED_MESSAGES_ARB 0x9145 #define GL_DEBUG_SEVERITY_HIGH_ARB 0x9146 #define GL_DEBUG_SEVERITY_MEDIUM_ARB 0x9147 #define GL_DEBUG_SEVERITY_LOW_ARB 0x9148 typedef void (APIENTRY *GLDEBUGPROCARB)(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar* message, GLvoid* userParam); typedef void (GLAPIENTRY * PFNGLDEBUGMESSAGECALLBACKARBPROC) (GLDEBUGPROCARB callback, void* userParam); typedef void (GLAPIENTRY * PFNGLDEBUGMESSAGECONTROLARBPROC) (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint* ids, GLboolean enabled); typedef void (GLAPIENTRY * PFNGLDEBUGMESSAGEINSERTARBPROC) (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar* buf); typedef GLuint (GLAPIENTRY * PFNGLGETDEBUGMESSAGELOGARBPROC) (GLuint count, GLsizei bufsize, GLenum* sources, GLenum* types, GLuint* ids, GLenum* severities, GLsizei* lengths, GLchar* messageLog); #define glDebugMessageCallbackARB GLEW_GET_FUN(__glewDebugMessageCallbackARB) #define glDebugMessageControlARB GLEW_GET_FUN(__glewDebugMessageControlARB) #define glDebugMessageInsertARB GLEW_GET_FUN(__glewDebugMessageInsertARB) #define glGetDebugMessageLogARB GLEW_GET_FUN(__glewGetDebugMessageLogARB) #define GLEW_ARB_debug_output GLEW_GET_VAR(__GLEW_ARB_debug_output) #endif /* GL_ARB_debug_output */ /* ----------------------- GL_ARB_depth_buffer_float ----------------------- */ #ifndef GL_ARB_depth_buffer_float #define GL_ARB_depth_buffer_float 1 #define GL_DEPTH_COMPONENT32F 0x8CAC #define GL_DEPTH32F_STENCIL8 0x8CAD #define GL_FLOAT_32_UNSIGNED_INT_24_8_REV 0x8DAD #define GLEW_ARB_depth_buffer_float GLEW_GET_VAR(__GLEW_ARB_depth_buffer_float) #endif /* GL_ARB_depth_buffer_float */ /* --------------------------- GL_ARB_depth_clamp -------------------------- */ #ifndef GL_ARB_depth_clamp #define GL_ARB_depth_clamp 1 #define GL_DEPTH_CLAMP 0x864F #define GLEW_ARB_depth_clamp GLEW_GET_VAR(__GLEW_ARB_depth_clamp) #endif /* GL_ARB_depth_clamp */ /* -------------------------- GL_ARB_depth_texture ------------------------- */ #ifndef GL_ARB_depth_texture #define GL_ARB_depth_texture 1 #define GL_DEPTH_COMPONENT16_ARB 0x81A5 #define GL_DEPTH_COMPONENT24_ARB 0x81A6 #define GL_DEPTH_COMPONENT32_ARB 0x81A7 #define GL_TEXTURE_DEPTH_SIZE_ARB 0x884A #define GL_DEPTH_TEXTURE_MODE_ARB 0x884B #define GLEW_ARB_depth_texture GLEW_GET_VAR(__GLEW_ARB_depth_texture) #endif /* GL_ARB_depth_texture */ /* -------------------------- GL_ARB_draw_buffers -------------------------- */ #ifndef GL_ARB_draw_buffers #define GL_ARB_draw_buffers 1 #define GL_MAX_DRAW_BUFFERS_ARB 0x8824 #define GL_DRAW_BUFFER0_ARB 0x8825 #define GL_DRAW_BUFFER1_ARB 0x8826 #define GL_DRAW_BUFFER2_ARB 0x8827 #define GL_DRAW_BUFFER3_ARB 0x8828 #define GL_DRAW_BUFFER4_ARB 0x8829 #define GL_DRAW_BUFFER5_ARB 0x882A #define GL_DRAW_BUFFER6_ARB 0x882B #define GL_DRAW_BUFFER7_ARB 0x882C #define GL_DRAW_BUFFER8_ARB 0x882D #define GL_DRAW_BUFFER9_ARB 0x882E #define GL_DRAW_BUFFER10_ARB 0x882F #define GL_DRAW_BUFFER11_ARB 0x8830 #define GL_DRAW_BUFFER12_ARB 0x8831 #define GL_DRAW_BUFFER13_ARB 0x8832 #define GL_DRAW_BUFFER14_ARB 0x8833 #define GL_DRAW_BUFFER15_ARB 0x8834 typedef void (GLAPIENTRY * PFNGLDRAWBUFFERSARBPROC) (GLsizei n, const GLenum* bufs); #define glDrawBuffersARB GLEW_GET_FUN(__glewDrawBuffersARB) #define GLEW_ARB_draw_buffers GLEW_GET_VAR(__GLEW_ARB_draw_buffers) #endif /* GL_ARB_draw_buffers */ /* ----------------------- GL_ARB_draw_buffers_blend ----------------------- */ #ifndef GL_ARB_draw_buffers_blend #define GL_ARB_draw_buffers_blend 1 typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONSEPARATEIARBPROC) (GLuint buf, GLenum modeRGB, GLenum modeAlpha); typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONIARBPROC) (GLuint buf, GLenum mode); typedef void (GLAPIENTRY * PFNGLBLENDFUNCSEPARATEIARBPROC) (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); typedef void (GLAPIENTRY * PFNGLBLENDFUNCIARBPROC) (GLuint buf, GLenum src, GLenum dst); #define glBlendEquationSeparateiARB GLEW_GET_FUN(__glewBlendEquationSeparateiARB) #define glBlendEquationiARB GLEW_GET_FUN(__glewBlendEquationiARB) #define glBlendFuncSeparateiARB GLEW_GET_FUN(__glewBlendFuncSeparateiARB) #define glBlendFunciARB GLEW_GET_FUN(__glewBlendFunciARB) #define GLEW_ARB_draw_buffers_blend GLEW_GET_VAR(__GLEW_ARB_draw_buffers_blend) #endif /* GL_ARB_draw_buffers_blend */ /* -------------------- GL_ARB_draw_elements_base_vertex ------------------- */ #ifndef GL_ARB_draw_elements_base_vertex #define GL_ARB_draw_elements_base_vertex 1 typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSBASEVERTEXPROC) (GLenum mode, GLsizei count, GLenum type, void* indices, GLint basevertex); typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC) (GLenum mode, GLsizei count, GLenum type, const void* indices, GLsizei primcount, GLint basevertex); typedef void (GLAPIENTRY * PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, void* indices, GLint basevertex); typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTSBASEVERTEXPROC) (GLenum mode, GLsizei* count, GLenum type, GLvoid**indices, GLsizei primcount, GLint *basevertex); #define glDrawElementsBaseVertex GLEW_GET_FUN(__glewDrawElementsBaseVertex) #define glDrawElementsInstancedBaseVertex GLEW_GET_FUN(__glewDrawElementsInstancedBaseVertex) #define glDrawRangeElementsBaseVertex GLEW_GET_FUN(__glewDrawRangeElementsBaseVertex) #define glMultiDrawElementsBaseVertex GLEW_GET_FUN(__glewMultiDrawElementsBaseVertex) #define GLEW_ARB_draw_elements_base_vertex GLEW_GET_VAR(__GLEW_ARB_draw_elements_base_vertex) #endif /* GL_ARB_draw_elements_base_vertex */ /* -------------------------- GL_ARB_draw_indirect ------------------------- */ #ifndef GL_ARB_draw_indirect #define GL_ARB_draw_indirect 1 #define GL_DRAW_INDIRECT_BUFFER 0x8F3F #define GL_DRAW_INDIRECT_BUFFER_BINDING 0x8F43 typedef void (GLAPIENTRY * PFNGLDRAWARRAYSINDIRECTPROC) (GLenum mode, const void* indirect); typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSINDIRECTPROC) (GLenum mode, GLenum type, const void* indirect); #define glDrawArraysIndirect GLEW_GET_FUN(__glewDrawArraysIndirect) #define glDrawElementsIndirect GLEW_GET_FUN(__glewDrawElementsIndirect) #define GLEW_ARB_draw_indirect GLEW_GET_VAR(__GLEW_ARB_draw_indirect) #endif /* GL_ARB_draw_indirect */ /* ------------------------- GL_ARB_draw_instanced ------------------------- */ #ifndef GL_ARB_draw_instanced #define GL_ARB_draw_instanced 1 #define GLEW_ARB_draw_instanced GLEW_GET_VAR(__GLEW_ARB_draw_instanced) #endif /* GL_ARB_draw_instanced */ /* -------------------- GL_ARB_explicit_attrib_location -------------------- */ #ifndef GL_ARB_explicit_attrib_location #define GL_ARB_explicit_attrib_location 1 #define GLEW_ARB_explicit_attrib_location GLEW_GET_VAR(__GLEW_ARB_explicit_attrib_location) #endif /* GL_ARB_explicit_attrib_location */ /* -------------------- GL_ARB_explicit_uniform_location ------------------- */ #ifndef GL_ARB_explicit_uniform_location #define GL_ARB_explicit_uniform_location 1 #define GL_MAX_UNIFORM_LOCATIONS 0x826E #define GLEW_ARB_explicit_uniform_location GLEW_GET_VAR(__GLEW_ARB_explicit_uniform_location) #endif /* GL_ARB_explicit_uniform_location */ /* ------------------- GL_ARB_fragment_coord_conventions ------------------- */ #ifndef GL_ARB_fragment_coord_conventions #define GL_ARB_fragment_coord_conventions 1 #define GLEW_ARB_fragment_coord_conventions GLEW_GET_VAR(__GLEW_ARB_fragment_coord_conventions) #endif /* GL_ARB_fragment_coord_conventions */ /* --------------------- GL_ARB_fragment_layer_viewport -------------------- */ #ifndef GL_ARB_fragment_layer_viewport #define GL_ARB_fragment_layer_viewport 1 #define GLEW_ARB_fragment_layer_viewport GLEW_GET_VAR(__GLEW_ARB_fragment_layer_viewport) #endif /* GL_ARB_fragment_layer_viewport */ /* ------------------------ GL_ARB_fragment_program ------------------------ */ #ifndef GL_ARB_fragment_program #define GL_ARB_fragment_program 1 #define GL_FRAGMENT_PROGRAM_ARB 0x8804 #define GL_PROGRAM_ALU_INSTRUCTIONS_ARB 0x8805 #define GL_PROGRAM_TEX_INSTRUCTIONS_ARB 0x8806 #define GL_PROGRAM_TEX_INDIRECTIONS_ARB 0x8807 #define GL_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB 0x8808 #define GL_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB 0x8809 #define GL_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB 0x880A #define GL_MAX_PROGRAM_ALU_INSTRUCTIONS_ARB 0x880B #define GL_MAX_PROGRAM_TEX_INSTRUCTIONS_ARB 0x880C #define GL_MAX_PROGRAM_TEX_INDIRECTIONS_ARB 0x880D #define GL_MAX_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB 0x880E #define GL_MAX_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB 0x880F #define GL_MAX_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB 0x8810 #define GL_MAX_TEXTURE_COORDS_ARB 0x8871 #define GL_MAX_TEXTURE_IMAGE_UNITS_ARB 0x8872 #define GLEW_ARB_fragment_program GLEW_GET_VAR(__GLEW_ARB_fragment_program) #endif /* GL_ARB_fragment_program */ /* --------------------- GL_ARB_fragment_program_shadow -------------------- */ #ifndef GL_ARB_fragment_program_shadow #define GL_ARB_fragment_program_shadow 1 #define GLEW_ARB_fragment_program_shadow GLEW_GET_VAR(__GLEW_ARB_fragment_program_shadow) #endif /* GL_ARB_fragment_program_shadow */ /* ------------------------- GL_ARB_fragment_shader ------------------------ */ #ifndef GL_ARB_fragment_shader #define GL_ARB_fragment_shader 1 #define GL_FRAGMENT_SHADER_ARB 0x8B30 #define GL_MAX_FRAGMENT_UNIFORM_COMPONENTS_ARB 0x8B49 #define GL_FRAGMENT_SHADER_DERIVATIVE_HINT_ARB 0x8B8B #define GLEW_ARB_fragment_shader GLEW_GET_VAR(__GLEW_ARB_fragment_shader) #endif /* GL_ARB_fragment_shader */ /* ------------------- GL_ARB_framebuffer_no_attachments ------------------- */ #ifndef GL_ARB_framebuffer_no_attachments #define GL_ARB_framebuffer_no_attachments 1 #define GL_FRAMEBUFFER_DEFAULT_WIDTH 0x9310 #define GL_FRAMEBUFFER_DEFAULT_HEIGHT 0x9311 #define GL_FRAMEBUFFER_DEFAULT_LAYERS 0x9312 #define GL_FRAMEBUFFER_DEFAULT_SAMPLES 0x9313 #define GL_FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS 0x9314 #define GL_MAX_FRAMEBUFFER_WIDTH 0x9315 #define GL_MAX_FRAMEBUFFER_HEIGHT 0x9316 #define GL_MAX_FRAMEBUFFER_LAYERS 0x9317 #define GL_MAX_FRAMEBUFFER_SAMPLES 0x9318 typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERPARAMETERIPROC) (GLenum target, GLenum pname, GLint param); typedef void (GLAPIENTRY * PFNGLGETFRAMEBUFFERPARAMETERIVPROC) (GLenum target, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLGETNAMEDFRAMEBUFFERPARAMETERIVEXTPROC) (GLuint framebuffer, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERPARAMETERIEXTPROC) (GLuint framebuffer, GLenum pname, GLint param); #define glFramebufferParameteri GLEW_GET_FUN(__glewFramebufferParameteri) #define glGetFramebufferParameteriv GLEW_GET_FUN(__glewGetFramebufferParameteriv) #define glGetNamedFramebufferParameterivEXT GLEW_GET_FUN(__glewGetNamedFramebufferParameterivEXT) #define glNamedFramebufferParameteriEXT GLEW_GET_FUN(__glewNamedFramebufferParameteriEXT) #define GLEW_ARB_framebuffer_no_attachments GLEW_GET_VAR(__GLEW_ARB_framebuffer_no_attachments) #endif /* GL_ARB_framebuffer_no_attachments */ /* ----------------------- GL_ARB_framebuffer_object ----------------------- */ #ifndef GL_ARB_framebuffer_object #define GL_ARB_framebuffer_object 1 #define GL_INVALID_FRAMEBUFFER_OPERATION 0x0506 #define GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING 0x8210 #define GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE 0x8211 #define GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE 0x8212 #define GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE 0x8213 #define GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE 0x8214 #define GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE 0x8215 #define GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE 0x8216 #define GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE 0x8217 #define GL_FRAMEBUFFER_DEFAULT 0x8218 #define GL_FRAMEBUFFER_UNDEFINED 0x8219 #define GL_DEPTH_STENCIL_ATTACHMENT 0x821A #define GL_INDEX 0x8222 #define GL_MAX_RENDERBUFFER_SIZE 0x84E8 #define GL_DEPTH_STENCIL 0x84F9 #define GL_UNSIGNED_INT_24_8 0x84FA #define GL_DEPTH24_STENCIL8 0x88F0 #define GL_TEXTURE_STENCIL_SIZE 0x88F1 #define GL_UNSIGNED_NORMALIZED 0x8C17 #define GL_SRGB 0x8C40 #define GL_DRAW_FRAMEBUFFER_BINDING 0x8CA6 #define GL_FRAMEBUFFER_BINDING 0x8CA6 #define GL_RENDERBUFFER_BINDING 0x8CA7 #define GL_READ_FRAMEBUFFER 0x8CA8 #define GL_DRAW_FRAMEBUFFER 0x8CA9 #define GL_READ_FRAMEBUFFER_BINDING 0x8CAA #define GL_RENDERBUFFER_SAMPLES 0x8CAB #define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE 0x8CD0 #define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME 0x8CD1 #define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL 0x8CD2 #define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE 0x8CD3 #define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER 0x8CD4 #define GL_FRAMEBUFFER_COMPLETE 0x8CD5 #define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT 0x8CD6 #define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT 0x8CD7 #define GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER 0x8CDB #define GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER 0x8CDC #define GL_FRAMEBUFFER_UNSUPPORTED 0x8CDD #define GL_MAX_COLOR_ATTACHMENTS 0x8CDF #define GL_COLOR_ATTACHMENT0 0x8CE0 #define GL_COLOR_ATTACHMENT1 0x8CE1 #define GL_COLOR_ATTACHMENT2 0x8CE2 #define GL_COLOR_ATTACHMENT3 0x8CE3 #define GL_COLOR_ATTACHMENT4 0x8CE4 #define GL_COLOR_ATTACHMENT5 0x8CE5 #define GL_COLOR_ATTACHMENT6 0x8CE6 #define GL_COLOR_ATTACHMENT7 0x8CE7 #define GL_COLOR_ATTACHMENT8 0x8CE8 #define GL_COLOR_ATTACHMENT9 0x8CE9 #define GL_COLOR_ATTACHMENT10 0x8CEA #define GL_COLOR_ATTACHMENT11 0x8CEB #define GL_COLOR_ATTACHMENT12 0x8CEC #define GL_COLOR_ATTACHMENT13 0x8CED #define GL_COLOR_ATTACHMENT14 0x8CEE #define GL_COLOR_ATTACHMENT15 0x8CEF #define GL_DEPTH_ATTACHMENT 0x8D00 #define GL_STENCIL_ATTACHMENT 0x8D20 #define GL_FRAMEBUFFER 0x8D40 #define GL_RENDERBUFFER 0x8D41 #define GL_RENDERBUFFER_WIDTH 0x8D42 #define GL_RENDERBUFFER_HEIGHT 0x8D43 #define GL_RENDERBUFFER_INTERNAL_FORMAT 0x8D44 #define GL_STENCIL_INDEX1 0x8D46 #define GL_STENCIL_INDEX4 0x8D47 #define GL_STENCIL_INDEX8 0x8D48 #define GL_STENCIL_INDEX16 0x8D49 #define GL_RENDERBUFFER_RED_SIZE 0x8D50 #define GL_RENDERBUFFER_GREEN_SIZE 0x8D51 #define GL_RENDERBUFFER_BLUE_SIZE 0x8D52 #define GL_RENDERBUFFER_ALPHA_SIZE 0x8D53 #define GL_RENDERBUFFER_DEPTH_SIZE 0x8D54 #define GL_RENDERBUFFER_STENCIL_SIZE 0x8D55 #define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE 0x8D56 #define GL_MAX_SAMPLES 0x8D57 typedef void (GLAPIENTRY * PFNGLBINDFRAMEBUFFERPROC) (GLenum target, GLuint framebuffer); typedef void (GLAPIENTRY * PFNGLBINDRENDERBUFFERPROC) (GLenum target, GLuint renderbuffer); typedef void (GLAPIENTRY * PFNGLBLITFRAMEBUFFERPROC) (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); typedef GLenum (GLAPIENTRY * PFNGLCHECKFRAMEBUFFERSTATUSPROC) (GLenum target); typedef void (GLAPIENTRY * PFNGLDELETEFRAMEBUFFERSPROC) (GLsizei n, const GLuint* framebuffers); typedef void (GLAPIENTRY * PFNGLDELETERENDERBUFFERSPROC) (GLsizei n, const GLuint* renderbuffers); typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERRENDERBUFFERPROC) (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURE1DPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURE2DPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURE3DPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint layer); typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURELAYERPROC) (GLenum target,GLenum attachment, GLuint texture,GLint level,GLint layer); typedef void (GLAPIENTRY * PFNGLGENFRAMEBUFFERSPROC) (GLsizei n, GLuint* framebuffers); typedef void (GLAPIENTRY * PFNGLGENRENDERBUFFERSPROC) (GLsizei n, GLuint* renderbuffers); typedef void (GLAPIENTRY * PFNGLGENERATEMIPMAPPROC) (GLenum target); typedef void (GLAPIENTRY * PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC) (GLenum target, GLenum attachment, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLGETRENDERBUFFERPARAMETERIVPROC) (GLenum target, GLenum pname, GLint* params); typedef GLboolean (GLAPIENTRY * PFNGLISFRAMEBUFFERPROC) (GLuint framebuffer); typedef GLboolean (GLAPIENTRY * PFNGLISRENDERBUFFERPROC) (GLuint renderbuffer); typedef void (GLAPIENTRY * PFNGLRENDERBUFFERSTORAGEPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height); typedef void (GLAPIENTRY * PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); #define glBindFramebuffer GLEW_GET_FUN(__glewBindFramebuffer) #define glBindRenderbuffer GLEW_GET_FUN(__glewBindRenderbuffer) #define glBlitFramebuffer GLEW_GET_FUN(__glewBlitFramebuffer) #define glCheckFramebufferStatus GLEW_GET_FUN(__glewCheckFramebufferStatus) #define glDeleteFramebuffers GLEW_GET_FUN(__glewDeleteFramebuffers) #define glDeleteRenderbuffers GLEW_GET_FUN(__glewDeleteRenderbuffers) #define glFramebufferRenderbuffer GLEW_GET_FUN(__glewFramebufferRenderbuffer) #define glFramebufferTexture1D GLEW_GET_FUN(__glewFramebufferTexture1D) #define glFramebufferTexture2D GLEW_GET_FUN(__glewFramebufferTexture2D) #define glFramebufferTexture3D GLEW_GET_FUN(__glewFramebufferTexture3D) #define glFramebufferTextureLayer GLEW_GET_FUN(__glewFramebufferTextureLayer) #define glGenFramebuffers GLEW_GET_FUN(__glewGenFramebuffers) #define glGenRenderbuffers GLEW_GET_FUN(__glewGenRenderbuffers) #define glGenerateMipmap GLEW_GET_FUN(__glewGenerateMipmap) #define glGetFramebufferAttachmentParameteriv GLEW_GET_FUN(__glewGetFramebufferAttachmentParameteriv) #define glGetRenderbufferParameteriv GLEW_GET_FUN(__glewGetRenderbufferParameteriv) #define glIsFramebuffer GLEW_GET_FUN(__glewIsFramebuffer) #define glIsRenderbuffer GLEW_GET_FUN(__glewIsRenderbuffer) #define glRenderbufferStorage GLEW_GET_FUN(__glewRenderbufferStorage) #define glRenderbufferStorageMultisample GLEW_GET_FUN(__glewRenderbufferStorageMultisample) #define GLEW_ARB_framebuffer_object GLEW_GET_VAR(__GLEW_ARB_framebuffer_object) #endif /* GL_ARB_framebuffer_object */ /* ------------------------ GL_ARB_framebuffer_sRGB ------------------------ */ #ifndef GL_ARB_framebuffer_sRGB #define GL_ARB_framebuffer_sRGB 1 #define GL_FRAMEBUFFER_SRGB 0x8DB9 #define GLEW_ARB_framebuffer_sRGB GLEW_GET_VAR(__GLEW_ARB_framebuffer_sRGB) #endif /* GL_ARB_framebuffer_sRGB */ /* ------------------------ GL_ARB_geometry_shader4 ------------------------ */ #ifndef GL_ARB_geometry_shader4 #define GL_ARB_geometry_shader4 1 #define GL_LINES_ADJACENCY_ARB 0xA #define GL_LINE_STRIP_ADJACENCY_ARB 0xB #define GL_TRIANGLES_ADJACENCY_ARB 0xC #define GL_TRIANGLE_STRIP_ADJACENCY_ARB 0xD #define GL_PROGRAM_POINT_SIZE_ARB 0x8642 #define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_ARB 0x8C29 #define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER 0x8CD4 #define GL_FRAMEBUFFER_ATTACHMENT_LAYERED_ARB 0x8DA7 #define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_ARB 0x8DA8 #define GL_FRAMEBUFFER_INCOMPLETE_LAYER_COUNT_ARB 0x8DA9 #define GL_GEOMETRY_SHADER_ARB 0x8DD9 #define GL_GEOMETRY_VERTICES_OUT_ARB 0x8DDA #define GL_GEOMETRY_INPUT_TYPE_ARB 0x8DDB #define GL_GEOMETRY_OUTPUT_TYPE_ARB 0x8DDC #define GL_MAX_GEOMETRY_VARYING_COMPONENTS_ARB 0x8DDD #define GL_MAX_VERTEX_VARYING_COMPONENTS_ARB 0x8DDE #define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_ARB 0x8DDF #define GL_MAX_GEOMETRY_OUTPUT_VERTICES_ARB 0x8DE0 #define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_ARB 0x8DE1 typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTUREARBPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level); typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTUREFACEARBPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLenum face); typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURELAYERARBPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); typedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETERIARBPROC) (GLuint program, GLenum pname, GLint value); #define glFramebufferTextureARB GLEW_GET_FUN(__glewFramebufferTextureARB) #define glFramebufferTextureFaceARB GLEW_GET_FUN(__glewFramebufferTextureFaceARB) #define glFramebufferTextureLayerARB GLEW_GET_FUN(__glewFramebufferTextureLayerARB) #define glProgramParameteriARB GLEW_GET_FUN(__glewProgramParameteriARB) #define GLEW_ARB_geometry_shader4 GLEW_GET_VAR(__GLEW_ARB_geometry_shader4) #endif /* GL_ARB_geometry_shader4 */ /* ----------------------- GL_ARB_get_program_binary ----------------------- */ #ifndef GL_ARB_get_program_binary #define GL_ARB_get_program_binary 1 #define GL_PROGRAM_BINARY_RETRIEVABLE_HINT 0x8257 #define GL_PROGRAM_BINARY_LENGTH 0x8741 #define GL_NUM_PROGRAM_BINARY_FORMATS 0x87FE #define GL_PROGRAM_BINARY_FORMATS 0x87FF typedef void (GLAPIENTRY * PFNGLGETPROGRAMBINARYPROC) (GLuint program, GLsizei bufSize, GLsizei* length, GLenum *binaryFormat, GLvoid*binary); typedef void (GLAPIENTRY * PFNGLPROGRAMBINARYPROC) (GLuint program, GLenum binaryFormat, const void* binary, GLsizei length); typedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETERIPROC) (GLuint program, GLenum pname, GLint value); #define glGetProgramBinary GLEW_GET_FUN(__glewGetProgramBinary) #define glProgramBinary GLEW_GET_FUN(__glewProgramBinary) #define glProgramParameteri GLEW_GET_FUN(__glewProgramParameteri) #define GLEW_ARB_get_program_binary GLEW_GET_VAR(__GLEW_ARB_get_program_binary) #endif /* GL_ARB_get_program_binary */ /* --------------------------- GL_ARB_gpu_shader5 -------------------------- */ #ifndef GL_ARB_gpu_shader5 #define GL_ARB_gpu_shader5 1 #define GL_GEOMETRY_SHADER_INVOCATIONS 0x887F #define GL_MAX_GEOMETRY_SHADER_INVOCATIONS 0x8E5A #define GL_MIN_FRAGMENT_INTERPOLATION_OFFSET 0x8E5B #define GL_MAX_FRAGMENT_INTERPOLATION_OFFSET 0x8E5C #define GL_FRAGMENT_INTERPOLATION_OFFSET_BITS 0x8E5D #define GL_MAX_VERTEX_STREAMS 0x8E71 #define GLEW_ARB_gpu_shader5 GLEW_GET_VAR(__GLEW_ARB_gpu_shader5) #endif /* GL_ARB_gpu_shader5 */ /* ------------------------- GL_ARB_gpu_shader_fp64 ------------------------ */ #ifndef GL_ARB_gpu_shader_fp64 #define GL_ARB_gpu_shader_fp64 1 #define GL_DOUBLE_MAT2 0x8F46 #define GL_DOUBLE_MAT3 0x8F47 #define GL_DOUBLE_MAT4 0x8F48 #define GL_DOUBLE_MAT2x3 0x8F49 #define GL_DOUBLE_MAT2x4 0x8F4A #define GL_DOUBLE_MAT3x2 0x8F4B #define GL_DOUBLE_MAT3x4 0x8F4C #define GL_DOUBLE_MAT4x2 0x8F4D #define GL_DOUBLE_MAT4x3 0x8F4E #define GL_DOUBLE_VEC2 0x8FFC #define GL_DOUBLE_VEC3 0x8FFD #define GL_DOUBLE_VEC4 0x8FFE typedef void (GLAPIENTRY * PFNGLGETUNIFORMDVPROC) (GLuint program, GLint location, GLdouble* params); typedef void (GLAPIENTRY * PFNGLUNIFORM1DPROC) (GLint location, GLdouble x); typedef void (GLAPIENTRY * PFNGLUNIFORM1DVPROC) (GLint location, GLsizei count, const GLdouble* value); typedef void (GLAPIENTRY * PFNGLUNIFORM2DPROC) (GLint location, GLdouble x, GLdouble y); typedef void (GLAPIENTRY * PFNGLUNIFORM2DVPROC) (GLint location, GLsizei count, const GLdouble* value); typedef void (GLAPIENTRY * PFNGLUNIFORM3DPROC) (GLint location, GLdouble x, GLdouble y, GLdouble z); typedef void (GLAPIENTRY * PFNGLUNIFORM3DVPROC) (GLint location, GLsizei count, const GLdouble* value); typedef void (GLAPIENTRY * PFNGLUNIFORM4DPROC) (GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w); typedef void (GLAPIENTRY * PFNGLUNIFORM4DVPROC) (GLint location, GLsizei count, const GLdouble* value); typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX2DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX2X3DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX2X4DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX3DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX3X2DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX3X4DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX4DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX4X2DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX4X3DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); #define glGetUniformdv GLEW_GET_FUN(__glewGetUniformdv) #define glUniform1d GLEW_GET_FUN(__glewUniform1d) #define glUniform1dv GLEW_GET_FUN(__glewUniform1dv) #define glUniform2d GLEW_GET_FUN(__glewUniform2d) #define glUniform2dv GLEW_GET_FUN(__glewUniform2dv) #define glUniform3d GLEW_GET_FUN(__glewUniform3d) #define glUniform3dv GLEW_GET_FUN(__glewUniform3dv) #define glUniform4d GLEW_GET_FUN(__glewUniform4d) #define glUniform4dv GLEW_GET_FUN(__glewUniform4dv) #define glUniformMatrix2dv GLEW_GET_FUN(__glewUniformMatrix2dv) #define glUniformMatrix2x3dv GLEW_GET_FUN(__glewUniformMatrix2x3dv) #define glUniformMatrix2x4dv GLEW_GET_FUN(__glewUniformMatrix2x4dv) #define glUniformMatrix3dv GLEW_GET_FUN(__glewUniformMatrix3dv) #define glUniformMatrix3x2dv GLEW_GET_FUN(__glewUniformMatrix3x2dv) #define glUniformMatrix3x4dv GLEW_GET_FUN(__glewUniformMatrix3x4dv) #define glUniformMatrix4dv GLEW_GET_FUN(__glewUniformMatrix4dv) #define glUniformMatrix4x2dv GLEW_GET_FUN(__glewUniformMatrix4x2dv) #define glUniformMatrix4x3dv GLEW_GET_FUN(__glewUniformMatrix4x3dv) #define GLEW_ARB_gpu_shader_fp64 GLEW_GET_VAR(__GLEW_ARB_gpu_shader_fp64) #endif /* GL_ARB_gpu_shader_fp64 */ /* ------------------------ GL_ARB_half_float_pixel ------------------------ */ #ifndef GL_ARB_half_float_pixel #define GL_ARB_half_float_pixel 1 #define GL_HALF_FLOAT_ARB 0x140B #define GLEW_ARB_half_float_pixel GLEW_GET_VAR(__GLEW_ARB_half_float_pixel) #endif /* GL_ARB_half_float_pixel */ /* ------------------------ GL_ARB_half_float_vertex ----------------------- */ #ifndef GL_ARB_half_float_vertex #define GL_ARB_half_float_vertex 1 #define GL_HALF_FLOAT 0x140B #define GLEW_ARB_half_float_vertex GLEW_GET_VAR(__GLEW_ARB_half_float_vertex) #endif /* GL_ARB_half_float_vertex */ /* ----------------------------- GL_ARB_imaging ---------------------------- */ #ifndef GL_ARB_imaging #define GL_ARB_imaging 1 #define GL_CONSTANT_COLOR 0x8001 #define GL_ONE_MINUS_CONSTANT_COLOR 0x8002 #define GL_CONSTANT_ALPHA 0x8003 #define GL_ONE_MINUS_CONSTANT_ALPHA 0x8004 #define GL_BLEND_COLOR 0x8005 #define GL_FUNC_ADD 0x8006 #define GL_MIN 0x8007 #define GL_MAX 0x8008 #define GL_BLEND_EQUATION 0x8009 #define GL_FUNC_SUBTRACT 0x800A #define GL_FUNC_REVERSE_SUBTRACT 0x800B #define GL_CONVOLUTION_1D 0x8010 #define GL_CONVOLUTION_2D 0x8011 #define GL_SEPARABLE_2D 0x8012 #define GL_CONVOLUTION_BORDER_MODE 0x8013 #define GL_CONVOLUTION_FILTER_SCALE 0x8014 #define GL_CONVOLUTION_FILTER_BIAS 0x8015 #define GL_REDUCE 0x8016 #define GL_CONVOLUTION_FORMAT 0x8017 #define GL_CONVOLUTION_WIDTH 0x8018 #define GL_CONVOLUTION_HEIGHT 0x8019 #define GL_MAX_CONVOLUTION_WIDTH 0x801A #define GL_MAX_CONVOLUTION_HEIGHT 0x801B #define GL_POST_CONVOLUTION_RED_SCALE 0x801C #define GL_POST_CONVOLUTION_GREEN_SCALE 0x801D #define GL_POST_CONVOLUTION_BLUE_SCALE 0x801E #define GL_POST_CONVOLUTION_ALPHA_SCALE 0x801F #define GL_POST_CONVOLUTION_RED_BIAS 0x8020 #define GL_POST_CONVOLUTION_GREEN_BIAS 0x8021 #define GL_POST_CONVOLUTION_BLUE_BIAS 0x8022 #define GL_POST_CONVOLUTION_ALPHA_BIAS 0x8023 #define GL_HISTOGRAM 0x8024 #define GL_PROXY_HISTOGRAM 0x8025 #define GL_HISTOGRAM_WIDTH 0x8026 #define GL_HISTOGRAM_FORMAT 0x8027 #define GL_HISTOGRAM_RED_SIZE 0x8028 #define GL_HISTOGRAM_GREEN_SIZE 0x8029 #define GL_HISTOGRAM_BLUE_SIZE 0x802A #define GL_HISTOGRAM_ALPHA_SIZE 0x802B #define GL_HISTOGRAM_LUMINANCE_SIZE 0x802C #define GL_HISTOGRAM_SINK 0x802D #define GL_MINMAX 0x802E #define GL_MINMAX_FORMAT 0x802F #define GL_MINMAX_SINK 0x8030 #define GL_TABLE_TOO_LARGE 0x8031 #define GL_COLOR_MATRIX 0x80B1 #define GL_COLOR_MATRIX_STACK_DEPTH 0x80B2 #define GL_MAX_COLOR_MATRIX_STACK_DEPTH 0x80B3 #define GL_POST_COLOR_MATRIX_RED_SCALE 0x80B4 #define GL_POST_COLOR_MATRIX_GREEN_SCALE 0x80B5 #define GL_POST_COLOR_MATRIX_BLUE_SCALE 0x80B6 #define GL_POST_COLOR_MATRIX_ALPHA_SCALE 0x80B7 #define GL_POST_COLOR_MATRIX_RED_BIAS 0x80B8 #define GL_POST_COLOR_MATRIX_GREEN_BIAS 0x80B9 #define GL_POST_COLOR_MATRIX_BLUE_BIAS 0x80BA #define GL_POST_COLOR_MATRIX_ALPHA_BIAS 0x80BB #define GL_COLOR_TABLE 0x80D0 #define GL_POST_CONVOLUTION_COLOR_TABLE 0x80D1 #define GL_POST_COLOR_MATRIX_COLOR_TABLE 0x80D2 #define GL_PROXY_COLOR_TABLE 0x80D3 #define GL_PROXY_POST_CONVOLUTION_COLOR_TABLE 0x80D4 #define GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE 0x80D5 #define GL_COLOR_TABLE_SCALE 0x80D6 #define GL_COLOR_TABLE_BIAS 0x80D7 #define GL_COLOR_TABLE_FORMAT 0x80D8 #define GL_COLOR_TABLE_WIDTH 0x80D9 #define GL_COLOR_TABLE_RED_SIZE 0x80DA #define GL_COLOR_TABLE_GREEN_SIZE 0x80DB #define GL_COLOR_TABLE_BLUE_SIZE 0x80DC #define GL_COLOR_TABLE_ALPHA_SIZE 0x80DD #define GL_COLOR_TABLE_LUMINANCE_SIZE 0x80DE #define GL_COLOR_TABLE_INTENSITY_SIZE 0x80DF #define GL_IGNORE_BORDER 0x8150 #define GL_CONSTANT_BORDER 0x8151 #define GL_WRAP_BORDER 0x8152 #define GL_REPLICATE_BORDER 0x8153 #define GL_CONVOLUTION_BORDER_COLOR 0x8154 typedef void (GLAPIENTRY * PFNGLCOLORSUBTABLEPROC) (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid *data); typedef void (GLAPIENTRY * PFNGLCOLORTABLEPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *table); typedef void (GLAPIENTRY * PFNGLCOLORTABLEPARAMETERFVPROC) (GLenum target, GLenum pname, const GLfloat *params); typedef void (GLAPIENTRY * PFNGLCOLORTABLEPARAMETERIVPROC) (GLenum target, GLenum pname, const GLint *params); typedef void (GLAPIENTRY * PFNGLCONVOLUTIONFILTER1DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *image); typedef void (GLAPIENTRY * PFNGLCONVOLUTIONFILTER2DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *image); typedef void (GLAPIENTRY * PFNGLCONVOLUTIONPARAMETERFPROC) (GLenum target, GLenum pname, GLfloat params); typedef void (GLAPIENTRY * PFNGLCONVOLUTIONPARAMETERFVPROC) (GLenum target, GLenum pname, const GLfloat *params); typedef void (GLAPIENTRY * PFNGLCONVOLUTIONPARAMETERIPROC) (GLenum target, GLenum pname, GLint params); typedef void (GLAPIENTRY * PFNGLCONVOLUTIONPARAMETERIVPROC) (GLenum target, GLenum pname, const GLint *params); typedef void (GLAPIENTRY * PFNGLCOPYCOLORSUBTABLEPROC) (GLenum target, GLsizei start, GLint x, GLint y, GLsizei width); typedef void (GLAPIENTRY * PFNGLCOPYCOLORTABLEPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); typedef void (GLAPIENTRY * PFNGLCOPYCONVOLUTIONFILTER1DPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); typedef void (GLAPIENTRY * PFNGLCOPYCONVOLUTIONFILTER2DPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height); typedef void (GLAPIENTRY * PFNGLGETCOLORTABLEPROC) (GLenum target, GLenum format, GLenum type, GLvoid *table); typedef void (GLAPIENTRY * PFNGLGETCOLORTABLEPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); typedef void (GLAPIENTRY * PFNGLGETCOLORTABLEPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); typedef void (GLAPIENTRY * PFNGLGETCONVOLUTIONFILTERPROC) (GLenum target, GLenum format, GLenum type, GLvoid *image); typedef void (GLAPIENTRY * PFNGLGETCONVOLUTIONPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); typedef void (GLAPIENTRY * PFNGLGETCONVOLUTIONPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); typedef void (GLAPIENTRY * PFNGLGETHISTOGRAMPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values); typedef void (GLAPIENTRY * PFNGLGETHISTOGRAMPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); typedef void (GLAPIENTRY * PFNGLGETHISTOGRAMPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); typedef void (GLAPIENTRY * PFNGLGETMINMAXPROC) (GLenum target, GLboolean reset, GLenum format, GLenum types, GLvoid *values); typedef void (GLAPIENTRY * PFNGLGETMINMAXPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); typedef void (GLAPIENTRY * PFNGLGETMINMAXPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); typedef void (GLAPIENTRY * PFNGLGETSEPARABLEFILTERPROC) (GLenum target, GLenum format, GLenum type, GLvoid *row, GLvoid *column, GLvoid *span); typedef void (GLAPIENTRY * PFNGLHISTOGRAMPROC) (GLenum target, GLsizei width, GLenum internalformat, GLboolean sink); typedef void (GLAPIENTRY * PFNGLMINMAXPROC) (GLenum target, GLenum internalformat, GLboolean sink); typedef void (GLAPIENTRY * PFNGLRESETHISTOGRAMPROC) (GLenum target); typedef void (GLAPIENTRY * PFNGLRESETMINMAXPROC) (GLenum target); typedef void (GLAPIENTRY * PFNGLSEPARABLEFILTER2DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *row, const GLvoid *column); #define glColorSubTable GLEW_GET_FUN(__glewColorSubTable) #define glColorTable GLEW_GET_FUN(__glewColorTable) #define glColorTableParameterfv GLEW_GET_FUN(__glewColorTableParameterfv) #define glColorTableParameteriv GLEW_GET_FUN(__glewColorTableParameteriv) #define glConvolutionFilter1D GLEW_GET_FUN(__glewConvolutionFilter1D) #define glConvolutionFilter2D GLEW_GET_FUN(__glewConvolutionFilter2D) #define glConvolutionParameterf GLEW_GET_FUN(__glewConvolutionParameterf) #define glConvolutionParameterfv GLEW_GET_FUN(__glewConvolutionParameterfv) #define glConvolutionParameteri GLEW_GET_FUN(__glewConvolutionParameteri) #define glConvolutionParameteriv GLEW_GET_FUN(__glewConvolutionParameteriv) #define glCopyColorSubTable GLEW_GET_FUN(__glewCopyColorSubTable) #define glCopyColorTable GLEW_GET_FUN(__glewCopyColorTable) #define glCopyConvolutionFilter1D GLEW_GET_FUN(__glewCopyConvolutionFilter1D) #define glCopyConvolutionFilter2D GLEW_GET_FUN(__glewCopyConvolutionFilter2D) #define glGetColorTable GLEW_GET_FUN(__glewGetColorTable) #define glGetColorTableParameterfv GLEW_GET_FUN(__glewGetColorTableParameterfv) #define glGetColorTableParameteriv GLEW_GET_FUN(__glewGetColorTableParameteriv) #define glGetConvolutionFilter GLEW_GET_FUN(__glewGetConvolutionFilter) #define glGetConvolutionParameterfv GLEW_GET_FUN(__glewGetConvolutionParameterfv) #define glGetConvolutionParameteriv GLEW_GET_FUN(__glewGetConvolutionParameteriv) #define glGetHistogram GLEW_GET_FUN(__glewGetHistogram) #define glGetHistogramParameterfv GLEW_GET_FUN(__glewGetHistogramParameterfv) #define glGetHistogramParameteriv GLEW_GET_FUN(__glewGetHistogramParameteriv) #define glGetMinmax GLEW_GET_FUN(__glewGetMinmax) #define glGetMinmaxParameterfv GLEW_GET_FUN(__glewGetMinmaxParameterfv) #define glGetMinmaxParameteriv GLEW_GET_FUN(__glewGetMinmaxParameteriv) #define glGetSeparableFilter GLEW_GET_FUN(__glewGetSeparableFilter) #define glHistogram GLEW_GET_FUN(__glewHistogram) #define glMinmax GLEW_GET_FUN(__glewMinmax) #define glResetHistogram GLEW_GET_FUN(__glewResetHistogram) #define glResetMinmax GLEW_GET_FUN(__glewResetMinmax) #define glSeparableFilter2D GLEW_GET_FUN(__glewSeparableFilter2D) #define GLEW_ARB_imaging GLEW_GET_VAR(__GLEW_ARB_imaging) #endif /* GL_ARB_imaging */ /* ------------------------ GL_ARB_instanced_arrays ------------------------ */ #ifndef GL_ARB_instanced_arrays #define GL_ARB_instanced_arrays 1 #define GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ARB 0x88FE typedef void (GLAPIENTRY * PFNGLDRAWARRAYSINSTANCEDARBPROC) (GLenum mode, GLint first, GLsizei count, GLsizei primcount); typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSINSTANCEDARBPROC) (GLenum mode, GLsizei count, GLenum type, const void* indices, GLsizei primcount); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBDIVISORARBPROC) (GLuint index, GLuint divisor); #define glDrawArraysInstancedARB GLEW_GET_FUN(__glewDrawArraysInstancedARB) #define glDrawElementsInstancedARB GLEW_GET_FUN(__glewDrawElementsInstancedARB) #define glVertexAttribDivisorARB GLEW_GET_FUN(__glewVertexAttribDivisorARB) #define GLEW_ARB_instanced_arrays GLEW_GET_VAR(__GLEW_ARB_instanced_arrays) #endif /* GL_ARB_instanced_arrays */ /* ---------------------- GL_ARB_internalformat_query ---------------------- */ #ifndef GL_ARB_internalformat_query #define GL_ARB_internalformat_query 1 #define GL_NUM_SAMPLE_COUNTS 0x9380 typedef void (GLAPIENTRY * PFNGLGETINTERNALFORMATIVPROC) (GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint* params); #define glGetInternalformativ GLEW_GET_FUN(__glewGetInternalformativ) #define GLEW_ARB_internalformat_query GLEW_GET_VAR(__GLEW_ARB_internalformat_query) #endif /* GL_ARB_internalformat_query */ /* ---------------------- GL_ARB_internalformat_query2 --------------------- */ #ifndef GL_ARB_internalformat_query2 #define GL_ARB_internalformat_query2 1 #define GL_TEXTURE_1D 0x0DE0 #define GL_TEXTURE_2D 0x0DE1 #define GL_TEXTURE_3D 0x806F #define GL_SAMPLES 0x80A9 #define GL_INTERNALFORMAT_SUPPORTED 0x826F #define GL_INTERNALFORMAT_PREFERRED 0x8270 #define GL_INTERNALFORMAT_RED_SIZE 0x8271 #define GL_INTERNALFORMAT_GREEN_SIZE 0x8272 #define GL_INTERNALFORMAT_BLUE_SIZE 0x8273 #define GL_INTERNALFORMAT_ALPHA_SIZE 0x8274 #define GL_INTERNALFORMAT_DEPTH_SIZE 0x8275 #define GL_INTERNALFORMAT_STENCIL_SIZE 0x8276 #define GL_INTERNALFORMAT_SHARED_SIZE 0x8277 #define GL_INTERNALFORMAT_RED_TYPE 0x8278 #define GL_INTERNALFORMAT_GREEN_TYPE 0x8279 #define GL_INTERNALFORMAT_BLUE_TYPE 0x827A #define GL_INTERNALFORMAT_ALPHA_TYPE 0x827B #define GL_INTERNALFORMAT_DEPTH_TYPE 0x827C #define GL_INTERNALFORMAT_STENCIL_TYPE 0x827D #define GL_MAX_WIDTH 0x827E #define GL_MAX_HEIGHT 0x827F #define GL_MAX_DEPTH 0x8280 #define GL_MAX_LAYERS 0x8281 #define GL_MAX_COMBINED_DIMENSIONS 0x8282 #define GL_COLOR_COMPONENTS 0x8283 #define GL_DEPTH_COMPONENTS 0x8284 #define GL_STENCIL_COMPONENTS 0x8285 #define GL_COLOR_RENDERABLE 0x8286 #define GL_DEPTH_RENDERABLE 0x8287 #define GL_STENCIL_RENDERABLE 0x8288 #define GL_FRAMEBUFFER_RENDERABLE 0x8289 #define GL_FRAMEBUFFER_RENDERABLE_LAYERED 0x828A #define GL_FRAMEBUFFER_BLEND 0x828B #define GL_READ_PIXELS 0x828C #define GL_READ_PIXELS_FORMAT 0x828D #define GL_READ_PIXELS_TYPE 0x828E #define GL_TEXTURE_IMAGE_FORMAT 0x828F #define GL_TEXTURE_IMAGE_TYPE 0x8290 #define GL_GET_TEXTURE_IMAGE_FORMAT 0x8291 #define GL_GET_TEXTURE_IMAGE_TYPE 0x8292 #define GL_MIPMAP 0x8293 #define GL_MANUAL_GENERATE_MIPMAP 0x8294 #define GL_AUTO_GENERATE_MIPMAP 0x8295 #define GL_COLOR_ENCODING 0x8296 #define GL_SRGB_READ 0x8297 #define GL_SRGB_WRITE 0x8298 #define GL_SRGB_DECODE_ARB 0x8299 #define GL_FILTER 0x829A #define GL_VERTEX_TEXTURE 0x829B #define GL_TESS_CONTROL_TEXTURE 0x829C #define GL_TESS_EVALUATION_TEXTURE 0x829D #define GL_GEOMETRY_TEXTURE 0x829E #define GL_FRAGMENT_TEXTURE 0x829F #define GL_COMPUTE_TEXTURE 0x82A0 #define GL_TEXTURE_SHADOW 0x82A1 #define GL_TEXTURE_GATHER 0x82A2 #define GL_TEXTURE_GATHER_SHADOW 0x82A3 #define GL_SHADER_IMAGE_LOAD 0x82A4 #define GL_SHADER_IMAGE_STORE 0x82A5 #define GL_SHADER_IMAGE_ATOMIC 0x82A6 #define GL_IMAGE_TEXEL_SIZE 0x82A7 #define GL_IMAGE_COMPATIBILITY_CLASS 0x82A8 #define GL_IMAGE_PIXEL_FORMAT 0x82A9 #define GL_IMAGE_PIXEL_TYPE 0x82AA #define GL_SIMULTANEOUS_TEXTURE_AND_DEPTH_TEST 0x82AC #define GL_SIMULTANEOUS_TEXTURE_AND_STENCIL_TEST 0x82AD #define GL_SIMULTANEOUS_TEXTURE_AND_DEPTH_WRITE 0x82AE #define GL_SIMULTANEOUS_TEXTURE_AND_STENCIL_WRITE 0x82AF #define GL_TEXTURE_COMPRESSED_BLOCK_WIDTH 0x82B1 #define GL_TEXTURE_COMPRESSED_BLOCK_HEIGHT 0x82B2 #define GL_TEXTURE_COMPRESSED_BLOCK_SIZE 0x82B3 #define GL_CLEAR_BUFFER 0x82B4 #define GL_TEXTURE_VIEW 0x82B5 #define GL_VIEW_COMPATIBILITY_CLASS 0x82B6 #define GL_FULL_SUPPORT 0x82B7 #define GL_CAVEAT_SUPPORT 0x82B8 #define GL_IMAGE_CLASS_4_X_32 0x82B9 #define GL_IMAGE_CLASS_2_X_32 0x82BA #define GL_IMAGE_CLASS_1_X_32 0x82BB #define GL_IMAGE_CLASS_4_X_16 0x82BC #define GL_IMAGE_CLASS_2_X_16 0x82BD #define GL_IMAGE_CLASS_1_X_16 0x82BE #define GL_IMAGE_CLASS_4_X_8 0x82BF #define GL_IMAGE_CLASS_2_X_8 0x82C0 #define GL_IMAGE_CLASS_1_X_8 0x82C1 #define GL_IMAGE_CLASS_11_11_10 0x82C2 #define GL_IMAGE_CLASS_10_10_10_2 0x82C3 #define GL_VIEW_CLASS_128_BITS 0x82C4 #define GL_VIEW_CLASS_96_BITS 0x82C5 #define GL_VIEW_CLASS_64_BITS 0x82C6 #define GL_VIEW_CLASS_48_BITS 0x82C7 #define GL_VIEW_CLASS_32_BITS 0x82C8 #define GL_VIEW_CLASS_24_BITS 0x82C9 #define GL_VIEW_CLASS_16_BITS 0x82CA #define GL_VIEW_CLASS_8_BITS 0x82CB #define GL_VIEW_CLASS_S3TC_DXT1_RGB 0x82CC #define GL_VIEW_CLASS_S3TC_DXT1_RGBA 0x82CD #define GL_VIEW_CLASS_S3TC_DXT3_RGBA 0x82CE #define GL_VIEW_CLASS_S3TC_DXT5_RGBA 0x82CF #define GL_VIEW_CLASS_RGTC1_RED 0x82D0 #define GL_VIEW_CLASS_RGTC2_RG 0x82D1 #define GL_VIEW_CLASS_BPTC_UNORM 0x82D2 #define GL_VIEW_CLASS_BPTC_FLOAT 0x82D3 #define GL_TEXTURE_RECTANGLE 0x84F5 #define GL_TEXTURE_1D_ARRAY 0x8C18 #define GL_TEXTURE_2D_ARRAY 0x8C1A #define GL_TEXTURE_BUFFER 0x8C2A #define GL_RENDERBUFFER 0x8D41 #define GL_TEXTURE_CUBE_MAP_ARRAY 0x9009 #define GL_TEXTURE_2D_MULTISAMPLE 0x9100 #define GL_TEXTURE_2D_MULTISAMPLE_ARRAY 0x9102 #define GL_NUM_SAMPLE_COUNTS 0x9380 typedef void (GLAPIENTRY * PFNGLGETINTERNALFORMATI64VPROC) (GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint64* params); #define glGetInternalformati64v GLEW_GET_FUN(__glewGetInternalformati64v) #define GLEW_ARB_internalformat_query2 GLEW_GET_VAR(__GLEW_ARB_internalformat_query2) #endif /* GL_ARB_internalformat_query2 */ /* ----------------------- GL_ARB_invalidate_subdata ----------------------- */ #ifndef GL_ARB_invalidate_subdata #define GL_ARB_invalidate_subdata 1 typedef void (GLAPIENTRY * PFNGLINVALIDATEBUFFERDATAPROC) (GLuint buffer); typedef void (GLAPIENTRY * PFNGLINVALIDATEBUFFERSUBDATAPROC) (GLuint buffer, GLintptr offset, GLsizeiptr length); typedef void (GLAPIENTRY * PFNGLINVALIDATEFRAMEBUFFERPROC) (GLenum target, GLsizei numAttachments, const GLenum* attachments); typedef void (GLAPIENTRY * PFNGLINVALIDATESUBFRAMEBUFFERPROC) (GLenum target, GLsizei numAttachments, const GLenum* attachments, GLint x, GLint y, GLsizei width, GLsizei height); typedef void (GLAPIENTRY * PFNGLINVALIDATETEXIMAGEPROC) (GLuint texture, GLint level); typedef void (GLAPIENTRY * PFNGLINVALIDATETEXSUBIMAGEPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth); #define glInvalidateBufferData GLEW_GET_FUN(__glewInvalidateBufferData) #define glInvalidateBufferSubData GLEW_GET_FUN(__glewInvalidateBufferSubData) #define glInvalidateFramebuffer GLEW_GET_FUN(__glewInvalidateFramebuffer) #define glInvalidateSubFramebuffer GLEW_GET_FUN(__glewInvalidateSubFramebuffer) #define glInvalidateTexImage GLEW_GET_FUN(__glewInvalidateTexImage) #define glInvalidateTexSubImage GLEW_GET_FUN(__glewInvalidateTexSubImage) #define GLEW_ARB_invalidate_subdata GLEW_GET_VAR(__GLEW_ARB_invalidate_subdata) #endif /* GL_ARB_invalidate_subdata */ /* ---------------------- GL_ARB_map_buffer_alignment ---------------------- */ #ifndef GL_ARB_map_buffer_alignment #define GL_ARB_map_buffer_alignment 1 #define GL_MIN_MAP_BUFFER_ALIGNMENT 0x90BC #define GLEW_ARB_map_buffer_alignment GLEW_GET_VAR(__GLEW_ARB_map_buffer_alignment) #endif /* GL_ARB_map_buffer_alignment */ /* ------------------------ GL_ARB_map_buffer_range ------------------------ */ #ifndef GL_ARB_map_buffer_range #define GL_ARB_map_buffer_range 1 #define GL_MAP_READ_BIT 0x0001 #define GL_MAP_WRITE_BIT 0x0002 #define GL_MAP_INVALIDATE_RANGE_BIT 0x0004 #define GL_MAP_INVALIDATE_BUFFER_BIT 0x0008 #define GL_MAP_FLUSH_EXPLICIT_BIT 0x0010 #define GL_MAP_UNSYNCHRONIZED_BIT 0x0020 typedef void (GLAPIENTRY * PFNGLFLUSHMAPPEDBUFFERRANGEPROC) (GLenum target, GLintptr offset, GLsizeiptr length); typedef GLvoid * (GLAPIENTRY * PFNGLMAPBUFFERRANGEPROC) (GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access); #define glFlushMappedBufferRange GLEW_GET_FUN(__glewFlushMappedBufferRange) #define glMapBufferRange GLEW_GET_FUN(__glewMapBufferRange) #define GLEW_ARB_map_buffer_range GLEW_GET_VAR(__GLEW_ARB_map_buffer_range) #endif /* GL_ARB_map_buffer_range */ /* ------------------------- GL_ARB_matrix_palette ------------------------- */ #ifndef GL_ARB_matrix_palette #define GL_ARB_matrix_palette 1 #define GL_MATRIX_PALETTE_ARB 0x8840 #define GL_MAX_MATRIX_PALETTE_STACK_DEPTH_ARB 0x8841 #define GL_MAX_PALETTE_MATRICES_ARB 0x8842 #define GL_CURRENT_PALETTE_MATRIX_ARB 0x8843 #define GL_MATRIX_INDEX_ARRAY_ARB 0x8844 #define GL_CURRENT_MATRIX_INDEX_ARB 0x8845 #define GL_MATRIX_INDEX_ARRAY_SIZE_ARB 0x8846 #define GL_MATRIX_INDEX_ARRAY_TYPE_ARB 0x8847 #define GL_MATRIX_INDEX_ARRAY_STRIDE_ARB 0x8848 #define GL_MATRIX_INDEX_ARRAY_POINTER_ARB 0x8849 typedef void (GLAPIENTRY * PFNGLCURRENTPALETTEMATRIXARBPROC) (GLint index); typedef void (GLAPIENTRY * PFNGLMATRIXINDEXPOINTERARBPROC) (GLint size, GLenum type, GLsizei stride, GLvoid *pointer); typedef void (GLAPIENTRY * PFNGLMATRIXINDEXUBVARBPROC) (GLint size, GLubyte *indices); typedef void (GLAPIENTRY * PFNGLMATRIXINDEXUIVARBPROC) (GLint size, GLuint *indices); typedef void (GLAPIENTRY * PFNGLMATRIXINDEXUSVARBPROC) (GLint size, GLushort *indices); #define glCurrentPaletteMatrixARB GLEW_GET_FUN(__glewCurrentPaletteMatrixARB) #define glMatrixIndexPointerARB GLEW_GET_FUN(__glewMatrixIndexPointerARB) #define glMatrixIndexubvARB GLEW_GET_FUN(__glewMatrixIndexubvARB) #define glMatrixIndexuivARB GLEW_GET_FUN(__glewMatrixIndexuivARB) #define glMatrixIndexusvARB GLEW_GET_FUN(__glewMatrixIndexusvARB) #define GLEW_ARB_matrix_palette GLEW_GET_VAR(__GLEW_ARB_matrix_palette) #endif /* GL_ARB_matrix_palette */ /* ----------------------- GL_ARB_multi_draw_indirect ---------------------- */ #ifndef GL_ARB_multi_draw_indirect #define GL_ARB_multi_draw_indirect 1 typedef void (GLAPIENTRY * PFNGLMULTIDRAWARRAYSINDIRECTPROC) (GLenum mode, const void* indirect, GLsizei primcount, GLsizei stride); typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTSINDIRECTPROC) (GLenum mode, GLenum type, const void* indirect, GLsizei primcount, GLsizei stride); #define glMultiDrawArraysIndirect GLEW_GET_FUN(__glewMultiDrawArraysIndirect) #define glMultiDrawElementsIndirect GLEW_GET_FUN(__glewMultiDrawElementsIndirect) #define GLEW_ARB_multi_draw_indirect GLEW_GET_VAR(__GLEW_ARB_multi_draw_indirect) #endif /* GL_ARB_multi_draw_indirect */ /* --------------------------- GL_ARB_multisample -------------------------- */ #ifndef GL_ARB_multisample #define GL_ARB_multisample 1 #define GL_MULTISAMPLE_ARB 0x809D #define GL_SAMPLE_ALPHA_TO_COVERAGE_ARB 0x809E #define GL_SAMPLE_ALPHA_TO_ONE_ARB 0x809F #define GL_SAMPLE_COVERAGE_ARB 0x80A0 #define GL_SAMPLE_BUFFERS_ARB 0x80A8 #define GL_SAMPLES_ARB 0x80A9 #define GL_SAMPLE_COVERAGE_VALUE_ARB 0x80AA #define GL_SAMPLE_COVERAGE_INVERT_ARB 0x80AB #define GL_MULTISAMPLE_BIT_ARB 0x20000000 typedef void (GLAPIENTRY * PFNGLSAMPLECOVERAGEARBPROC) (GLclampf value, GLboolean invert); #define glSampleCoverageARB GLEW_GET_FUN(__glewSampleCoverageARB) #define GLEW_ARB_multisample GLEW_GET_VAR(__GLEW_ARB_multisample) #endif /* GL_ARB_multisample */ /* -------------------------- GL_ARB_multitexture -------------------------- */ #ifndef GL_ARB_multitexture #define GL_ARB_multitexture 1 #define GL_TEXTURE0_ARB 0x84C0 #define GL_TEXTURE1_ARB 0x84C1 #define GL_TEXTURE2_ARB 0x84C2 #define GL_TEXTURE3_ARB 0x84C3 #define GL_TEXTURE4_ARB 0x84C4 #define GL_TEXTURE5_ARB 0x84C5 #define GL_TEXTURE6_ARB 0x84C6 #define GL_TEXTURE7_ARB 0x84C7 #define GL_TEXTURE8_ARB 0x84C8 #define GL_TEXTURE9_ARB 0x84C9 #define GL_TEXTURE10_ARB 0x84CA #define GL_TEXTURE11_ARB 0x84CB #define GL_TEXTURE12_ARB 0x84CC #define GL_TEXTURE13_ARB 0x84CD #define GL_TEXTURE14_ARB 0x84CE #define GL_TEXTURE15_ARB 0x84CF #define GL_TEXTURE16_ARB 0x84D0 #define GL_TEXTURE17_ARB 0x84D1 #define GL_TEXTURE18_ARB 0x84D2 #define GL_TEXTURE19_ARB 0x84D3 #define GL_TEXTURE20_ARB 0x84D4 #define GL_TEXTURE21_ARB 0x84D5 #define GL_TEXTURE22_ARB 0x84D6 #define GL_TEXTURE23_ARB 0x84D7 #define GL_TEXTURE24_ARB 0x84D8 #define GL_TEXTURE25_ARB 0x84D9 #define GL_TEXTURE26_ARB 0x84DA #define GL_TEXTURE27_ARB 0x84DB #define GL_TEXTURE28_ARB 0x84DC #define GL_TEXTURE29_ARB 0x84DD #define GL_TEXTURE30_ARB 0x84DE #define GL_TEXTURE31_ARB 0x84DF #define GL_ACTIVE_TEXTURE_ARB 0x84E0 #define GL_CLIENT_ACTIVE_TEXTURE_ARB 0x84E1 #define GL_MAX_TEXTURE_UNITS_ARB 0x84E2 typedef void (GLAPIENTRY * PFNGLACTIVETEXTUREARBPROC) (GLenum texture); typedef void (GLAPIENTRY * PFNGLCLIENTACTIVETEXTUREARBPROC) (GLenum texture); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1DARBPROC) (GLenum target, GLdouble s); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1DVARBPROC) (GLenum target, const GLdouble *v); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1FARBPROC) (GLenum target, GLfloat s); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1FVARBPROC) (GLenum target, const GLfloat *v); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1IARBPROC) (GLenum target, GLint s); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1IVARBPROC) (GLenum target, const GLint *v); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1SARBPROC) (GLenum target, GLshort s); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1SVARBPROC) (GLenum target, const GLshort *v); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2DARBPROC) (GLenum target, GLdouble s, GLdouble t); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2DVARBPROC) (GLenum target, const GLdouble *v); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2FARBPROC) (GLenum target, GLfloat s, GLfloat t); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2FVARBPROC) (GLenum target, const GLfloat *v); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2IARBPROC) (GLenum target, GLint s, GLint t); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2IVARBPROC) (GLenum target, const GLint *v); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2SARBPROC) (GLenum target, GLshort s, GLshort t); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2SVARBPROC) (GLenum target, const GLshort *v); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3DARBPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3DVARBPROC) (GLenum target, const GLdouble *v); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3FARBPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3FVARBPROC) (GLenum target, const GLfloat *v); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3IARBPROC) (GLenum target, GLint s, GLint t, GLint r); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3IVARBPROC) (GLenum target, const GLint *v); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3SARBPROC) (GLenum target, GLshort s, GLshort t, GLshort r); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3SVARBPROC) (GLenum target, const GLshort *v); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4DARBPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4DVARBPROC) (GLenum target, const GLdouble *v); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4FARBPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4FVARBPROC) (GLenum target, const GLfloat *v); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4IARBPROC) (GLenum target, GLint s, GLint t, GLint r, GLint q); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4IVARBPROC) (GLenum target, const GLint *v); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4SARBPROC) (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4SVARBPROC) (GLenum target, const GLshort *v); #define glActiveTextureARB GLEW_GET_FUN(__glewActiveTextureARB) #define glClientActiveTextureARB GLEW_GET_FUN(__glewClientActiveTextureARB) #define glMultiTexCoord1dARB GLEW_GET_FUN(__glewMultiTexCoord1dARB) #define glMultiTexCoord1dvARB GLEW_GET_FUN(__glewMultiTexCoord1dvARB) #define glMultiTexCoord1fARB GLEW_GET_FUN(__glewMultiTexCoord1fARB) #define glMultiTexCoord1fvARB GLEW_GET_FUN(__glewMultiTexCoord1fvARB) #define glMultiTexCoord1iARB GLEW_GET_FUN(__glewMultiTexCoord1iARB) #define glMultiTexCoord1ivARB GLEW_GET_FUN(__glewMultiTexCoord1ivARB) #define glMultiTexCoord1sARB GLEW_GET_FUN(__glewMultiTexCoord1sARB) #define glMultiTexCoord1svARB GLEW_GET_FUN(__glewMultiTexCoord1svARB) #define glMultiTexCoord2dARB GLEW_GET_FUN(__glewMultiTexCoord2dARB) #define glMultiTexCoord2dvARB GLEW_GET_FUN(__glewMultiTexCoord2dvARB) #define glMultiTexCoord2fARB GLEW_GET_FUN(__glewMultiTexCoord2fARB) #define glMultiTexCoord2fvARB GLEW_GET_FUN(__glewMultiTexCoord2fvARB) #define glMultiTexCoord2iARB GLEW_GET_FUN(__glewMultiTexCoord2iARB) #define glMultiTexCoord2ivARB GLEW_GET_FUN(__glewMultiTexCoord2ivARB) #define glMultiTexCoord2sARB GLEW_GET_FUN(__glewMultiTexCoord2sARB) #define glMultiTexCoord2svARB GLEW_GET_FUN(__glewMultiTexCoord2svARB) #define glMultiTexCoord3dARB GLEW_GET_FUN(__glewMultiTexCoord3dARB) #define glMultiTexCoord3dvARB GLEW_GET_FUN(__glewMultiTexCoord3dvARB) #define glMultiTexCoord3fARB GLEW_GET_FUN(__glewMultiTexCoord3fARB) #define glMultiTexCoord3fvARB GLEW_GET_FUN(__glewMultiTexCoord3fvARB) #define glMultiTexCoord3iARB GLEW_GET_FUN(__glewMultiTexCoord3iARB) #define glMultiTexCoord3ivARB GLEW_GET_FUN(__glewMultiTexCoord3ivARB) #define glMultiTexCoord3sARB GLEW_GET_FUN(__glewMultiTexCoord3sARB) #define glMultiTexCoord3svARB GLEW_GET_FUN(__glewMultiTexCoord3svARB) #define glMultiTexCoord4dARB GLEW_GET_FUN(__glewMultiTexCoord4dARB) #define glMultiTexCoord4dvARB GLEW_GET_FUN(__glewMultiTexCoord4dvARB) #define glMultiTexCoord4fARB GLEW_GET_FUN(__glewMultiTexCoord4fARB) #define glMultiTexCoord4fvARB GLEW_GET_FUN(__glewMultiTexCoord4fvARB) #define glMultiTexCoord4iARB GLEW_GET_FUN(__glewMultiTexCoord4iARB) #define glMultiTexCoord4ivARB GLEW_GET_FUN(__glewMultiTexCoord4ivARB) #define glMultiTexCoord4sARB GLEW_GET_FUN(__glewMultiTexCoord4sARB) #define glMultiTexCoord4svARB GLEW_GET_FUN(__glewMultiTexCoord4svARB) #define GLEW_ARB_multitexture GLEW_GET_VAR(__GLEW_ARB_multitexture) #endif /* GL_ARB_multitexture */ /* ------------------------- GL_ARB_occlusion_query ------------------------ */ #ifndef GL_ARB_occlusion_query #define GL_ARB_occlusion_query 1 #define GL_QUERY_COUNTER_BITS_ARB 0x8864 #define GL_CURRENT_QUERY_ARB 0x8865 #define GL_QUERY_RESULT_ARB 0x8866 #define GL_QUERY_RESULT_AVAILABLE_ARB 0x8867 #define GL_SAMPLES_PASSED_ARB 0x8914 typedef void (GLAPIENTRY * PFNGLBEGINQUERYARBPROC) (GLenum target, GLuint id); typedef void (GLAPIENTRY * PFNGLDELETEQUERIESARBPROC) (GLsizei n, const GLuint* ids); typedef void (GLAPIENTRY * PFNGLENDQUERYARBPROC) (GLenum target); typedef void (GLAPIENTRY * PFNGLGENQUERIESARBPROC) (GLsizei n, GLuint* ids); typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTIVARBPROC) (GLuint id, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTUIVARBPROC) (GLuint id, GLenum pname, GLuint* params); typedef void (GLAPIENTRY * PFNGLGETQUERYIVARBPROC) (GLenum target, GLenum pname, GLint* params); typedef GLboolean (GLAPIENTRY * PFNGLISQUERYARBPROC) (GLuint id); #define glBeginQueryARB GLEW_GET_FUN(__glewBeginQueryARB) #define glDeleteQueriesARB GLEW_GET_FUN(__glewDeleteQueriesARB) #define glEndQueryARB GLEW_GET_FUN(__glewEndQueryARB) #define glGenQueriesARB GLEW_GET_FUN(__glewGenQueriesARB) #define glGetQueryObjectivARB GLEW_GET_FUN(__glewGetQueryObjectivARB) #define glGetQueryObjectuivARB GLEW_GET_FUN(__glewGetQueryObjectuivARB) #define glGetQueryivARB GLEW_GET_FUN(__glewGetQueryivARB) #define glIsQueryARB GLEW_GET_FUN(__glewIsQueryARB) #define GLEW_ARB_occlusion_query GLEW_GET_VAR(__GLEW_ARB_occlusion_query) #endif /* GL_ARB_occlusion_query */ /* ------------------------ GL_ARB_occlusion_query2 ------------------------ */ #ifndef GL_ARB_occlusion_query2 #define GL_ARB_occlusion_query2 1 #define GL_ANY_SAMPLES_PASSED 0x8C2F #define GLEW_ARB_occlusion_query2 GLEW_GET_VAR(__GLEW_ARB_occlusion_query2) #endif /* GL_ARB_occlusion_query2 */ /* ----------------------- GL_ARB_pixel_buffer_object ---------------------- */ #ifndef GL_ARB_pixel_buffer_object #define GL_ARB_pixel_buffer_object 1 #define GL_PIXEL_PACK_BUFFER_ARB 0x88EB #define GL_PIXEL_UNPACK_BUFFER_ARB 0x88EC #define GL_PIXEL_PACK_BUFFER_BINDING_ARB 0x88ED #define GL_PIXEL_UNPACK_BUFFER_BINDING_ARB 0x88EF #define GLEW_ARB_pixel_buffer_object GLEW_GET_VAR(__GLEW_ARB_pixel_buffer_object) #endif /* GL_ARB_pixel_buffer_object */ /* ------------------------ GL_ARB_point_parameters ------------------------ */ #ifndef GL_ARB_point_parameters #define GL_ARB_point_parameters 1 #define GL_POINT_SIZE_MIN_ARB 0x8126 #define GL_POINT_SIZE_MAX_ARB 0x8127 #define GL_POINT_FADE_THRESHOLD_SIZE_ARB 0x8128 #define GL_POINT_DISTANCE_ATTENUATION_ARB 0x8129 typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERFARBPROC) (GLenum pname, GLfloat param); typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERFVARBPROC) (GLenum pname, const GLfloat* params); #define glPointParameterfARB GLEW_GET_FUN(__glewPointParameterfARB) #define glPointParameterfvARB GLEW_GET_FUN(__glewPointParameterfvARB) #define GLEW_ARB_point_parameters GLEW_GET_VAR(__GLEW_ARB_point_parameters) #endif /* GL_ARB_point_parameters */ /* -------------------------- GL_ARB_point_sprite -------------------------- */ #ifndef GL_ARB_point_sprite #define GL_ARB_point_sprite 1 #define GL_POINT_SPRITE_ARB 0x8861 #define GL_COORD_REPLACE_ARB 0x8862 #define GLEW_ARB_point_sprite GLEW_GET_VAR(__GLEW_ARB_point_sprite) #endif /* GL_ARB_point_sprite */ /* --------------------- GL_ARB_program_interface_query -------------------- */ #ifndef GL_ARB_program_interface_query #define GL_ARB_program_interface_query 1 #define GL_UNIFORM 0x92E1 #define GL_UNIFORM_BLOCK 0x92E2 #define GL_PROGRAM_INPUT 0x92E3 #define GL_PROGRAM_OUTPUT 0x92E4 #define GL_BUFFER_VARIABLE 0x92E5 #define GL_SHADER_STORAGE_BLOCK 0x92E6 #define GL_IS_PER_PATCH 0x92E7 #define GL_VERTEX_SUBROUTINE 0x92E8 #define GL_TESS_CONTROL_SUBROUTINE 0x92E9 #define GL_TESS_EVALUATION_SUBROUTINE 0x92EA #define GL_GEOMETRY_SUBROUTINE 0x92EB #define GL_FRAGMENT_SUBROUTINE 0x92EC #define GL_COMPUTE_SUBROUTINE 0x92ED #define GL_VERTEX_SUBROUTINE_UNIFORM 0x92EE #define GL_TESS_CONTROL_SUBROUTINE_UNIFORM 0x92EF #define GL_TESS_EVALUATION_SUBROUTINE_UNIFORM 0x92F0 #define GL_GEOMETRY_SUBROUTINE_UNIFORM 0x92F1 #define GL_FRAGMENT_SUBROUTINE_UNIFORM 0x92F2 #define GL_COMPUTE_SUBROUTINE_UNIFORM 0x92F3 #define GL_TRANSFORM_FEEDBACK_VARYING 0x92F4 #define GL_ACTIVE_RESOURCES 0x92F5 #define GL_MAX_NAME_LENGTH 0x92F6 #define GL_MAX_NUM_ACTIVE_VARIABLES 0x92F7 #define GL_MAX_NUM_COMPATIBLE_SUBROUTINES 0x92F8 #define GL_NAME_LENGTH 0x92F9 #define GL_TYPE 0x92FA #define GL_ARRAY_SIZE 0x92FB #define GL_OFFSET 0x92FC #define GL_BLOCK_INDEX 0x92FD #define GL_ARRAY_STRIDE 0x92FE #define GL_MATRIX_STRIDE 0x92FF #define GL_IS_ROW_MAJOR 0x9300 #define GL_ATOMIC_COUNTER_BUFFER_INDEX 0x9301 #define GL_BUFFER_BINDING 0x9302 #define GL_BUFFER_DATA_SIZE 0x9303 #define GL_NUM_ACTIVE_VARIABLES 0x9304 #define GL_ACTIVE_VARIABLES 0x9305 #define GL_REFERENCED_BY_VERTEX_SHADER 0x9306 #define GL_REFERENCED_BY_TESS_CONTROL_SHADER 0x9307 #define GL_REFERENCED_BY_TESS_EVALUATION_SHADER 0x9308 #define GL_REFERENCED_BY_GEOMETRY_SHADER 0x9309 #define GL_REFERENCED_BY_FRAGMENT_SHADER 0x930A #define GL_REFERENCED_BY_COMPUTE_SHADER 0x930B #define GL_TOP_LEVEL_ARRAY_SIZE 0x930C #define GL_TOP_LEVEL_ARRAY_STRIDE 0x930D #define GL_LOCATION 0x930E #define GL_LOCATION_INDEX 0x930F typedef void (GLAPIENTRY * PFNGLGETPROGRAMINTERFACEIVPROC) (GLuint program, GLenum programInterface, GLenum pname, GLint* params); typedef GLuint (GLAPIENTRY * PFNGLGETPROGRAMRESOURCEINDEXPROC) (GLuint program, GLenum programInterface, const GLchar* name); typedef GLint (GLAPIENTRY * PFNGLGETPROGRAMRESOURCELOCATIONPROC) (GLuint program, GLenum programInterface, const GLchar* name); typedef GLint (GLAPIENTRY * PFNGLGETPROGRAMRESOURCELOCATIONINDEXPROC) (GLuint program, GLenum programInterface, const GLchar* name); typedef void (GLAPIENTRY * PFNGLGETPROGRAMRESOURCENAMEPROC) (GLuint program, GLenum programInterface, GLuint index, GLsizei bufSize, GLsizei* length, GLchar *name); typedef void (GLAPIENTRY * PFNGLGETPROGRAMRESOURCEIVPROC) (GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum* props, GLsizei bufSize, GLsizei *length, GLint *params); #define glGetProgramInterfaceiv GLEW_GET_FUN(__glewGetProgramInterfaceiv) #define glGetProgramResourceIndex GLEW_GET_FUN(__glewGetProgramResourceIndex) #define glGetProgramResourceLocation GLEW_GET_FUN(__glewGetProgramResourceLocation) #define glGetProgramResourceLocationIndex GLEW_GET_FUN(__glewGetProgramResourceLocationIndex) #define glGetProgramResourceName GLEW_GET_FUN(__glewGetProgramResourceName) #define glGetProgramResourceiv GLEW_GET_FUN(__glewGetProgramResourceiv) #define GLEW_ARB_program_interface_query GLEW_GET_VAR(__GLEW_ARB_program_interface_query) #endif /* GL_ARB_program_interface_query */ /* ------------------------ GL_ARB_provoking_vertex ------------------------ */ #ifndef GL_ARB_provoking_vertex #define GL_ARB_provoking_vertex 1 #define GL_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION 0x8E4C #define GL_FIRST_VERTEX_CONVENTION 0x8E4D #define GL_LAST_VERTEX_CONVENTION 0x8E4E #define GL_PROVOKING_VERTEX 0x8E4F typedef void (GLAPIENTRY * PFNGLPROVOKINGVERTEXPROC) (GLenum mode); #define glProvokingVertex GLEW_GET_FUN(__glewProvokingVertex) #define GLEW_ARB_provoking_vertex GLEW_GET_VAR(__GLEW_ARB_provoking_vertex) #endif /* GL_ARB_provoking_vertex */ /* ------------------ GL_ARB_robust_buffer_access_behavior ----------------- */ #ifndef GL_ARB_robust_buffer_access_behavior #define GL_ARB_robust_buffer_access_behavior 1 #define GLEW_ARB_robust_buffer_access_behavior GLEW_GET_VAR(__GLEW_ARB_robust_buffer_access_behavior) #endif /* GL_ARB_robust_buffer_access_behavior */ /* --------------------------- GL_ARB_robustness --------------------------- */ #ifndef GL_ARB_robustness #define GL_ARB_robustness 1 #define GL_CONTEXT_FLAG_ROBUST_ACCESS_BIT_ARB 0x00000004 #define GL_LOSE_CONTEXT_ON_RESET_ARB 0x8252 #define GL_GUILTY_CONTEXT_RESET_ARB 0x8253 #define GL_INNOCENT_CONTEXT_RESET_ARB 0x8254 #define GL_UNKNOWN_CONTEXT_RESET_ARB 0x8255 #define GL_RESET_NOTIFICATION_STRATEGY_ARB 0x8256 #define GL_NO_RESET_NOTIFICATION_ARB 0x8261 typedef GLenum (GLAPIENTRY * PFNGLGETGRAPHICSRESETSTATUSARBPROC) (void); typedef void (GLAPIENTRY * PFNGLGETNCOLORTABLEARBPROC) (GLenum target, GLenum format, GLenum type, GLsizei bufSize, void* table); typedef void (GLAPIENTRY * PFNGLGETNCOMPRESSEDTEXIMAGEARBPROC) (GLenum target, GLint lod, GLsizei bufSize, void* img); typedef void (GLAPIENTRY * PFNGLGETNCONVOLUTIONFILTERARBPROC) (GLenum target, GLenum format, GLenum type, GLsizei bufSize, void* image); typedef void (GLAPIENTRY * PFNGLGETNHISTOGRAMARBPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, void* values); typedef void (GLAPIENTRY * PFNGLGETNMAPDVARBPROC) (GLenum target, GLenum query, GLsizei bufSize, GLdouble* v); typedef void (GLAPIENTRY * PFNGLGETNMAPFVARBPROC) (GLenum target, GLenum query, GLsizei bufSize, GLfloat* v); typedef void (GLAPIENTRY * PFNGLGETNMAPIVARBPROC) (GLenum target, GLenum query, GLsizei bufSize, GLint* v); typedef void (GLAPIENTRY * PFNGLGETNMINMAXARBPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, void* values); typedef void (GLAPIENTRY * PFNGLGETNPIXELMAPFVARBPROC) (GLenum map, GLsizei bufSize, GLfloat* values); typedef void (GLAPIENTRY * PFNGLGETNPIXELMAPUIVARBPROC) (GLenum map, GLsizei bufSize, GLuint* values); typedef void (GLAPIENTRY * PFNGLGETNPIXELMAPUSVARBPROC) (GLenum map, GLsizei bufSize, GLushort* values); typedef void (GLAPIENTRY * PFNGLGETNPOLYGONSTIPPLEARBPROC) (GLsizei bufSize, GLubyte* pattern); typedef void (GLAPIENTRY * PFNGLGETNSEPARABLEFILTERARBPROC) (GLenum target, GLenum format, GLenum type, GLsizei rowBufSize, void* row, GLsizei columnBufSize, GLvoid*column, GLvoid*span); typedef void (GLAPIENTRY * PFNGLGETNTEXIMAGEARBPROC) (GLenum target, GLint level, GLenum format, GLenum type, GLsizei bufSize, void* img); typedef void (GLAPIENTRY * PFNGLGETNUNIFORMDVARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLdouble* params); typedef void (GLAPIENTRY * PFNGLGETNUNIFORMFVARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLfloat* params); typedef void (GLAPIENTRY * PFNGLGETNUNIFORMIVARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLint* params); typedef void (GLAPIENTRY * PFNGLGETNUNIFORMUIVARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLuint* params); typedef void (GLAPIENTRY * PFNGLREADNPIXELSARBPROC) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void* data); #define glGetGraphicsResetStatusARB GLEW_GET_FUN(__glewGetGraphicsResetStatusARB) #define glGetnColorTableARB GLEW_GET_FUN(__glewGetnColorTableARB) #define glGetnCompressedTexImageARB GLEW_GET_FUN(__glewGetnCompressedTexImageARB) #define glGetnConvolutionFilterARB GLEW_GET_FUN(__glewGetnConvolutionFilterARB) #define glGetnHistogramARB GLEW_GET_FUN(__glewGetnHistogramARB) #define glGetnMapdvARB GLEW_GET_FUN(__glewGetnMapdvARB) #define glGetnMapfvARB GLEW_GET_FUN(__glewGetnMapfvARB) #define glGetnMapivARB GLEW_GET_FUN(__glewGetnMapivARB) #define glGetnMinmaxARB GLEW_GET_FUN(__glewGetnMinmaxARB) #define glGetnPixelMapfvARB GLEW_GET_FUN(__glewGetnPixelMapfvARB) #define glGetnPixelMapuivARB GLEW_GET_FUN(__glewGetnPixelMapuivARB) #define glGetnPixelMapusvARB GLEW_GET_FUN(__glewGetnPixelMapusvARB) #define glGetnPolygonStippleARB GLEW_GET_FUN(__glewGetnPolygonStippleARB) #define glGetnSeparableFilterARB GLEW_GET_FUN(__glewGetnSeparableFilterARB) #define glGetnTexImageARB GLEW_GET_FUN(__glewGetnTexImageARB) #define glGetnUniformdvARB GLEW_GET_FUN(__glewGetnUniformdvARB) #define glGetnUniformfvARB GLEW_GET_FUN(__glewGetnUniformfvARB) #define glGetnUniformivARB GLEW_GET_FUN(__glewGetnUniformivARB) #define glGetnUniformuivARB GLEW_GET_FUN(__glewGetnUniformuivARB) #define glReadnPixelsARB GLEW_GET_FUN(__glewReadnPixelsARB) #define GLEW_ARB_robustness GLEW_GET_VAR(__GLEW_ARB_robustness) #endif /* GL_ARB_robustness */ /* ---------------- GL_ARB_robustness_application_isolation ---------------- */ #ifndef GL_ARB_robustness_application_isolation #define GL_ARB_robustness_application_isolation 1 #define GLEW_ARB_robustness_application_isolation GLEW_GET_VAR(__GLEW_ARB_robustness_application_isolation) #endif /* GL_ARB_robustness_application_isolation */ /* ---------------- GL_ARB_robustness_share_group_isolation ---------------- */ #ifndef GL_ARB_robustness_share_group_isolation #define GL_ARB_robustness_share_group_isolation 1 #define GLEW_ARB_robustness_share_group_isolation GLEW_GET_VAR(__GLEW_ARB_robustness_share_group_isolation) #endif /* GL_ARB_robustness_share_group_isolation */ /* ------------------------- GL_ARB_sample_shading ------------------------- */ #ifndef GL_ARB_sample_shading #define GL_ARB_sample_shading 1 #define GL_SAMPLE_SHADING_ARB 0x8C36 #define GL_MIN_SAMPLE_SHADING_VALUE_ARB 0x8C37 typedef void (GLAPIENTRY * PFNGLMINSAMPLESHADINGARBPROC) (GLclampf value); #define glMinSampleShadingARB GLEW_GET_FUN(__glewMinSampleShadingARB) #define GLEW_ARB_sample_shading GLEW_GET_VAR(__GLEW_ARB_sample_shading) #endif /* GL_ARB_sample_shading */ /* ------------------------- GL_ARB_sampler_objects ------------------------ */ #ifndef GL_ARB_sampler_objects #define GL_ARB_sampler_objects 1 #define GL_SAMPLER_BINDING 0x8919 typedef void (GLAPIENTRY * PFNGLBINDSAMPLERPROC) (GLuint unit, GLuint sampler); typedef void (GLAPIENTRY * PFNGLDELETESAMPLERSPROC) (GLsizei count, const GLuint * samplers); typedef void (GLAPIENTRY * PFNGLGENSAMPLERSPROC) (GLsizei count, GLuint* samplers); typedef void (GLAPIENTRY * PFNGLGETSAMPLERPARAMETERIIVPROC) (GLuint sampler, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLGETSAMPLERPARAMETERIUIVPROC) (GLuint sampler, GLenum pname, GLuint* params); typedef void (GLAPIENTRY * PFNGLGETSAMPLERPARAMETERFVPROC) (GLuint sampler, GLenum pname, GLfloat* params); typedef void (GLAPIENTRY * PFNGLGETSAMPLERPARAMETERIVPROC) (GLuint sampler, GLenum pname, GLint* params); typedef GLboolean (GLAPIENTRY * PFNGLISSAMPLERPROC) (GLuint sampler); typedef void (GLAPIENTRY * PFNGLSAMPLERPARAMETERIIVPROC) (GLuint sampler, GLenum pname, const GLint* params); typedef void (GLAPIENTRY * PFNGLSAMPLERPARAMETERIUIVPROC) (GLuint sampler, GLenum pname, const GLuint* params); typedef void (GLAPIENTRY * PFNGLSAMPLERPARAMETERFPROC) (GLuint sampler, GLenum pname, GLfloat param); typedef void (GLAPIENTRY * PFNGLSAMPLERPARAMETERFVPROC) (GLuint sampler, GLenum pname, const GLfloat* params); typedef void (GLAPIENTRY * PFNGLSAMPLERPARAMETERIPROC) (GLuint sampler, GLenum pname, GLint param); typedef void (GLAPIENTRY * PFNGLSAMPLERPARAMETERIVPROC) (GLuint sampler, GLenum pname, const GLint* params); #define glBindSampler GLEW_GET_FUN(__glewBindSampler) #define glDeleteSamplers GLEW_GET_FUN(__glewDeleteSamplers) #define glGenSamplers GLEW_GET_FUN(__glewGenSamplers) #define glGetSamplerParameterIiv GLEW_GET_FUN(__glewGetSamplerParameterIiv) #define glGetSamplerParameterIuiv GLEW_GET_FUN(__glewGetSamplerParameterIuiv) #define glGetSamplerParameterfv GLEW_GET_FUN(__glewGetSamplerParameterfv) #define glGetSamplerParameteriv GLEW_GET_FUN(__glewGetSamplerParameteriv) #define glIsSampler GLEW_GET_FUN(__glewIsSampler) #define glSamplerParameterIiv GLEW_GET_FUN(__glewSamplerParameterIiv) #define glSamplerParameterIuiv GLEW_GET_FUN(__glewSamplerParameterIuiv) #define glSamplerParameterf GLEW_GET_FUN(__glewSamplerParameterf) #define glSamplerParameterfv GLEW_GET_FUN(__glewSamplerParameterfv) #define glSamplerParameteri GLEW_GET_FUN(__glewSamplerParameteri) #define glSamplerParameteriv GLEW_GET_FUN(__glewSamplerParameteriv) #define GLEW_ARB_sampler_objects GLEW_GET_VAR(__GLEW_ARB_sampler_objects) #endif /* GL_ARB_sampler_objects */ /* ------------------------ GL_ARB_seamless_cube_map ----------------------- */ #ifndef GL_ARB_seamless_cube_map #define GL_ARB_seamless_cube_map 1 #define GL_TEXTURE_CUBE_MAP_SEAMLESS 0x884F #define GLEW_ARB_seamless_cube_map GLEW_GET_VAR(__GLEW_ARB_seamless_cube_map) #endif /* GL_ARB_seamless_cube_map */ /* --------------------- GL_ARB_separate_shader_objects -------------------- */ #ifndef GL_ARB_separate_shader_objects #define GL_ARB_separate_shader_objects 1 #define GL_VERTEX_SHADER_BIT 0x00000001 #define GL_FRAGMENT_SHADER_BIT 0x00000002 #define GL_GEOMETRY_SHADER_BIT 0x00000004 #define GL_TESS_CONTROL_SHADER_BIT 0x00000008 #define GL_TESS_EVALUATION_SHADER_BIT 0x00000010 #define GL_PROGRAM_SEPARABLE 0x8258 #define GL_ACTIVE_PROGRAM 0x8259 #define GL_PROGRAM_PIPELINE_BINDING 0x825A #define GL_ALL_SHADER_BITS 0xFFFFFFFF typedef void (GLAPIENTRY * PFNGLACTIVESHADERPROGRAMPROC) (GLuint pipeline, GLuint program); typedef void (GLAPIENTRY * PFNGLBINDPROGRAMPIPELINEPROC) (GLuint pipeline); typedef GLuint (GLAPIENTRY * PFNGLCREATESHADERPROGRAMVPROC) (GLenum type, GLsizei count, const GLchar ** strings); typedef void (GLAPIENTRY * PFNGLDELETEPROGRAMPIPELINESPROC) (GLsizei n, const GLuint* pipelines); typedef void (GLAPIENTRY * PFNGLGENPROGRAMPIPELINESPROC) (GLsizei n, GLuint* pipelines); typedef void (GLAPIENTRY * PFNGLGETPROGRAMPIPELINEINFOLOGPROC) (GLuint pipeline, GLsizei bufSize, GLsizei* length, GLchar *infoLog); typedef void (GLAPIENTRY * PFNGLGETPROGRAMPIPELINEIVPROC) (GLuint pipeline, GLenum pname, GLint* params); typedef GLboolean (GLAPIENTRY * PFNGLISPROGRAMPIPELINEPROC) (GLuint pipeline); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1DPROC) (GLuint program, GLint location, GLdouble x); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1DVPROC) (GLuint program, GLint location, GLsizei count, const GLdouble* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1FPROC) (GLuint program, GLint location, GLfloat x); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1IPROC) (GLuint program, GLint location, GLint x); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1IVPROC) (GLuint program, GLint location, GLsizei count, const GLint* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1UIPROC) (GLuint program, GLint location, GLuint x); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2DPROC) (GLuint program, GLint location, GLdouble x, GLdouble y); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2DVPROC) (GLuint program, GLint location, GLsizei count, const GLdouble* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2FPROC) (GLuint program, GLint location, GLfloat x, GLfloat y); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2IPROC) (GLuint program, GLint location, GLint x, GLint y); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2IVPROC) (GLuint program, GLint location, GLsizei count, const GLint* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2UIPROC) (GLuint program, GLint location, GLuint x, GLuint y); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3DPROC) (GLuint program, GLint location, GLdouble x, GLdouble y, GLdouble z); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3DVPROC) (GLuint program, GLint location, GLsizei count, const GLdouble* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3FPROC) (GLuint program, GLint location, GLfloat x, GLfloat y, GLfloat z); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3IPROC) (GLuint program, GLint location, GLint x, GLint y, GLint z); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3IVPROC) (GLuint program, GLint location, GLsizei count, const GLint* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3UIPROC) (GLuint program, GLint location, GLuint x, GLuint y, GLuint z); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4DPROC) (GLuint program, GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4DVPROC) (GLuint program, GLint location, GLsizei count, const GLdouble* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4FPROC) (GLuint program, GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4IPROC) (GLuint program, GLint location, GLint x, GLint y, GLint z, GLint w); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4IVPROC) (GLuint program, GLint location, GLsizei count, const GLint* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4UIPROC) (GLuint program, GLint location, GLuint x, GLuint y, GLuint z, GLuint w); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX2DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX2FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX2X3DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX2X3FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX2X4DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX2X4FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX3DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX3FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX3X2DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX3X2FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX3X4DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX3X4FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX4DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX4FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX4X2DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX4X2FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX4X3DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX4X3FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); typedef void (GLAPIENTRY * PFNGLUSEPROGRAMSTAGESPROC) (GLuint pipeline, GLbitfield stages, GLuint program); typedef void (GLAPIENTRY * PFNGLVALIDATEPROGRAMPIPELINEPROC) (GLuint pipeline); #define glActiveShaderProgram GLEW_GET_FUN(__glewActiveShaderProgram) #define glBindProgramPipeline GLEW_GET_FUN(__glewBindProgramPipeline) #define glCreateShaderProgramv GLEW_GET_FUN(__glewCreateShaderProgramv) #define glDeleteProgramPipelines GLEW_GET_FUN(__glewDeleteProgramPipelines) #define glGenProgramPipelines GLEW_GET_FUN(__glewGenProgramPipelines) #define glGetProgramPipelineInfoLog GLEW_GET_FUN(__glewGetProgramPipelineInfoLog) #define glGetProgramPipelineiv GLEW_GET_FUN(__glewGetProgramPipelineiv) #define glIsProgramPipeline GLEW_GET_FUN(__glewIsProgramPipeline) #define glProgramUniform1d GLEW_GET_FUN(__glewProgramUniform1d) #define glProgramUniform1dv GLEW_GET_FUN(__glewProgramUniform1dv) #define glProgramUniform1f GLEW_GET_FUN(__glewProgramUniform1f) #define glProgramUniform1fv GLEW_GET_FUN(__glewProgramUniform1fv) #define glProgramUniform1i GLEW_GET_FUN(__glewProgramUniform1i) #define glProgramUniform1iv GLEW_GET_FUN(__glewProgramUniform1iv) #define glProgramUniform1ui GLEW_GET_FUN(__glewProgramUniform1ui) #define glProgramUniform1uiv GLEW_GET_FUN(__glewProgramUniform1uiv) #define glProgramUniform2d GLEW_GET_FUN(__glewProgramUniform2d) #define glProgramUniform2dv GLEW_GET_FUN(__glewProgramUniform2dv) #define glProgramUniform2f GLEW_GET_FUN(__glewProgramUniform2f) #define glProgramUniform2fv GLEW_GET_FUN(__glewProgramUniform2fv) #define glProgramUniform2i GLEW_GET_FUN(__glewProgramUniform2i) #define glProgramUniform2iv GLEW_GET_FUN(__glewProgramUniform2iv) #define glProgramUniform2ui GLEW_GET_FUN(__glewProgramUniform2ui) #define glProgramUniform2uiv GLEW_GET_FUN(__glewProgramUniform2uiv) #define glProgramUniform3d GLEW_GET_FUN(__glewProgramUniform3d) #define glProgramUniform3dv GLEW_GET_FUN(__glewProgramUniform3dv) #define glProgramUniform3f GLEW_GET_FUN(__glewProgramUniform3f) #define glProgramUniform3fv GLEW_GET_FUN(__glewProgramUniform3fv) #define glProgramUniform3i GLEW_GET_FUN(__glewProgramUniform3i) #define glProgramUniform3iv GLEW_GET_FUN(__glewProgramUniform3iv) #define glProgramUniform3ui GLEW_GET_FUN(__glewProgramUniform3ui) #define glProgramUniform3uiv GLEW_GET_FUN(__glewProgramUniform3uiv) #define glProgramUniform4d GLEW_GET_FUN(__glewProgramUniform4d) #define glProgramUniform4dv GLEW_GET_FUN(__glewProgramUniform4dv) #define glProgramUniform4f GLEW_GET_FUN(__glewProgramUniform4f) #define glProgramUniform4fv GLEW_GET_FUN(__glewProgramUniform4fv) #define glProgramUniform4i GLEW_GET_FUN(__glewProgramUniform4i) #define glProgramUniform4iv GLEW_GET_FUN(__glewProgramUniform4iv) #define glProgramUniform4ui GLEW_GET_FUN(__glewProgramUniform4ui) #define glProgramUniform4uiv GLEW_GET_FUN(__glewProgramUniform4uiv) #define glProgramUniformMatrix2dv GLEW_GET_FUN(__glewProgramUniformMatrix2dv) #define glProgramUniformMatrix2fv GLEW_GET_FUN(__glewProgramUniformMatrix2fv) #define glProgramUniformMatrix2x3dv GLEW_GET_FUN(__glewProgramUniformMatrix2x3dv) #define glProgramUniformMatrix2x3fv GLEW_GET_FUN(__glewProgramUniformMatrix2x3fv) #define glProgramUniformMatrix2x4dv GLEW_GET_FUN(__glewProgramUniformMatrix2x4dv) #define glProgramUniformMatrix2x4fv GLEW_GET_FUN(__glewProgramUniformMatrix2x4fv) #define glProgramUniformMatrix3dv GLEW_GET_FUN(__glewProgramUniformMatrix3dv) #define glProgramUniformMatrix3fv GLEW_GET_FUN(__glewProgramUniformMatrix3fv) #define glProgramUniformMatrix3x2dv GLEW_GET_FUN(__glewProgramUniformMatrix3x2dv) #define glProgramUniformMatrix3x2fv GLEW_GET_FUN(__glewProgramUniformMatrix3x2fv) #define glProgramUniformMatrix3x4dv GLEW_GET_FUN(__glewProgramUniformMatrix3x4dv) #define glProgramUniformMatrix3x4fv GLEW_GET_FUN(__glewProgramUniformMatrix3x4fv) #define glProgramUniformMatrix4dv GLEW_GET_FUN(__glewProgramUniformMatrix4dv) #define glProgramUniformMatrix4fv GLEW_GET_FUN(__glewProgramUniformMatrix4fv) #define glProgramUniformMatrix4x2dv GLEW_GET_FUN(__glewProgramUniformMatrix4x2dv) #define glProgramUniformMatrix4x2fv GLEW_GET_FUN(__glewProgramUniformMatrix4x2fv) #define glProgramUniformMatrix4x3dv GLEW_GET_FUN(__glewProgramUniformMatrix4x3dv) #define glProgramUniformMatrix4x3fv GLEW_GET_FUN(__glewProgramUniformMatrix4x3fv) #define glUseProgramStages GLEW_GET_FUN(__glewUseProgramStages) #define glValidateProgramPipeline GLEW_GET_FUN(__glewValidateProgramPipeline) #define GLEW_ARB_separate_shader_objects GLEW_GET_VAR(__GLEW_ARB_separate_shader_objects) #endif /* GL_ARB_separate_shader_objects */ /* --------------------- GL_ARB_shader_atomic_counters --------------------- */ #ifndef GL_ARB_shader_atomic_counters #define GL_ARB_shader_atomic_counters 1 #define GL_ATOMIC_COUNTER_BUFFER 0x92C0 #define GL_ATOMIC_COUNTER_BUFFER_BINDING 0x92C1 #define GL_ATOMIC_COUNTER_BUFFER_START 0x92C2 #define GL_ATOMIC_COUNTER_BUFFER_SIZE 0x92C3 #define GL_ATOMIC_COUNTER_BUFFER_DATA_SIZE 0x92C4 #define GL_ATOMIC_COUNTER_BUFFER_ACTIVE_ATOMIC_COUNTERS 0x92C5 #define GL_ATOMIC_COUNTER_BUFFER_ACTIVE_ATOMIC_COUNTER_INDICES 0x92C6 #define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_VERTEX_SHADER 0x92C7 #define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TESS_CONTROL_SHADER 0x92C8 #define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TESS_EVALUATION_SHADER 0x92C9 #define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_GEOMETRY_SHADER 0x92CA #define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_FRAGMENT_SHADER 0x92CB #define GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS 0x92CC #define GL_MAX_TESS_CONTROL_ATOMIC_COUNTER_BUFFERS 0x92CD #define GL_MAX_TESS_EVALUATION_ATOMIC_COUNTER_BUFFERS 0x92CE #define GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS 0x92CF #define GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS 0x92D0 #define GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS 0x92D1 #define GL_MAX_VERTEX_ATOMIC_COUNTERS 0x92D2 #define GL_MAX_TESS_CONTROL_ATOMIC_COUNTERS 0x92D3 #define GL_MAX_TESS_EVALUATION_ATOMIC_COUNTERS 0x92D4 #define GL_MAX_GEOMETRY_ATOMIC_COUNTERS 0x92D5 #define GL_MAX_FRAGMENT_ATOMIC_COUNTERS 0x92D6 #define GL_MAX_COMBINED_ATOMIC_COUNTERS 0x92D7 #define GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE 0x92D8 #define GL_ACTIVE_ATOMIC_COUNTER_BUFFERS 0x92D9 #define GL_UNIFORM_ATOMIC_COUNTER_BUFFER_INDEX 0x92DA #define GL_UNSIGNED_INT_ATOMIC_COUNTER 0x92DB #define GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS 0x92DC typedef void (GLAPIENTRY * PFNGLGETACTIVEATOMICCOUNTERBUFFERIVPROC) (GLuint program, GLuint bufferIndex, GLenum pname, GLint* params); #define glGetActiveAtomicCounterBufferiv GLEW_GET_FUN(__glewGetActiveAtomicCounterBufferiv) #define GLEW_ARB_shader_atomic_counters GLEW_GET_VAR(__GLEW_ARB_shader_atomic_counters) #endif /* GL_ARB_shader_atomic_counters */ /* ----------------------- GL_ARB_shader_bit_encoding ---------------------- */ #ifndef GL_ARB_shader_bit_encoding #define GL_ARB_shader_bit_encoding 1 #define GLEW_ARB_shader_bit_encoding GLEW_GET_VAR(__GLEW_ARB_shader_bit_encoding) #endif /* GL_ARB_shader_bit_encoding */ /* --------------------- GL_ARB_shader_image_load_store -------------------- */ #ifndef GL_ARB_shader_image_load_store #define GL_ARB_shader_image_load_store 1 #define GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT 0x00000001 #define GL_ELEMENT_ARRAY_BARRIER_BIT 0x00000002 #define GL_UNIFORM_BARRIER_BIT 0x00000004 #define GL_TEXTURE_FETCH_BARRIER_BIT 0x00000008 #define GL_SHADER_IMAGE_ACCESS_BARRIER_BIT 0x00000020 #define GL_COMMAND_BARRIER_BIT 0x00000040 #define GL_PIXEL_BUFFER_BARRIER_BIT 0x00000080 #define GL_TEXTURE_UPDATE_BARRIER_BIT 0x00000100 #define GL_BUFFER_UPDATE_BARRIER_BIT 0x00000200 #define GL_FRAMEBUFFER_BARRIER_BIT 0x00000400 #define GL_TRANSFORM_FEEDBACK_BARRIER_BIT 0x00000800 #define GL_ATOMIC_COUNTER_BARRIER_BIT 0x00001000 #define GL_MAX_IMAGE_UNITS 0x8F38 #define GL_MAX_COMBINED_IMAGE_UNITS_AND_FRAGMENT_OUTPUTS 0x8F39 #define GL_IMAGE_BINDING_NAME 0x8F3A #define GL_IMAGE_BINDING_LEVEL 0x8F3B #define GL_IMAGE_BINDING_LAYERED 0x8F3C #define GL_IMAGE_BINDING_LAYER 0x8F3D #define GL_IMAGE_BINDING_ACCESS 0x8F3E #define GL_IMAGE_1D 0x904C #define GL_IMAGE_2D 0x904D #define GL_IMAGE_3D 0x904E #define GL_IMAGE_2D_RECT 0x904F #define GL_IMAGE_CUBE 0x9050 #define GL_IMAGE_BUFFER 0x9051 #define GL_IMAGE_1D_ARRAY 0x9052 #define GL_IMAGE_2D_ARRAY 0x9053 #define GL_IMAGE_CUBE_MAP_ARRAY 0x9054 #define GL_IMAGE_2D_MULTISAMPLE 0x9055 #define GL_IMAGE_2D_MULTISAMPLE_ARRAY 0x9056 #define GL_INT_IMAGE_1D 0x9057 #define GL_INT_IMAGE_2D 0x9058 #define GL_INT_IMAGE_3D 0x9059 #define GL_INT_IMAGE_2D_RECT 0x905A #define GL_INT_IMAGE_CUBE 0x905B #define GL_INT_IMAGE_BUFFER 0x905C #define GL_INT_IMAGE_1D_ARRAY 0x905D #define GL_INT_IMAGE_2D_ARRAY 0x905E #define GL_INT_IMAGE_CUBE_MAP_ARRAY 0x905F #define GL_INT_IMAGE_2D_MULTISAMPLE 0x9060 #define GL_INT_IMAGE_2D_MULTISAMPLE_ARRAY 0x9061 #define GL_UNSIGNED_INT_IMAGE_1D 0x9062 #define GL_UNSIGNED_INT_IMAGE_2D 0x9063 #define GL_UNSIGNED_INT_IMAGE_3D 0x9064 #define GL_UNSIGNED_INT_IMAGE_2D_RECT 0x9065 #define GL_UNSIGNED_INT_IMAGE_CUBE 0x9066 #define GL_UNSIGNED_INT_IMAGE_BUFFER 0x9067 #define GL_UNSIGNED_INT_IMAGE_1D_ARRAY 0x9068 #define GL_UNSIGNED_INT_IMAGE_2D_ARRAY 0x9069 #define GL_UNSIGNED_INT_IMAGE_CUBE_MAP_ARRAY 0x906A #define GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE 0x906B #define GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE_ARRAY 0x906C #define GL_MAX_IMAGE_SAMPLES 0x906D #define GL_IMAGE_BINDING_FORMAT 0x906E #define GL_IMAGE_FORMAT_COMPATIBILITY_TYPE 0x90C7 #define GL_IMAGE_FORMAT_COMPATIBILITY_BY_SIZE 0x90C8 #define GL_IMAGE_FORMAT_COMPATIBILITY_BY_CLASS 0x90C9 #define GL_MAX_VERTEX_IMAGE_UNIFORMS 0x90CA #define GL_MAX_TESS_CONTROL_IMAGE_UNIFORMS 0x90CB #define GL_MAX_TESS_EVALUATION_IMAGE_UNIFORMS 0x90CC #define GL_MAX_GEOMETRY_IMAGE_UNIFORMS 0x90CD #define GL_MAX_FRAGMENT_IMAGE_UNIFORMS 0x90CE #define GL_MAX_COMBINED_IMAGE_UNIFORMS 0x90CF #define GL_ALL_BARRIER_BITS 0xFFFFFFFF typedef void (GLAPIENTRY * PFNGLBINDIMAGETEXTUREPROC) (GLuint unit, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLenum format); typedef void (GLAPIENTRY * PFNGLMEMORYBARRIERPROC) (GLbitfield barriers); #define glBindImageTexture GLEW_GET_FUN(__glewBindImageTexture) #define glMemoryBarrier GLEW_GET_FUN(__glewMemoryBarrier) #define GLEW_ARB_shader_image_load_store GLEW_GET_VAR(__GLEW_ARB_shader_image_load_store) #endif /* GL_ARB_shader_image_load_store */ /* ------------------------ GL_ARB_shader_image_size ----------------------- */ #ifndef GL_ARB_shader_image_size #define GL_ARB_shader_image_size 1 #define GLEW_ARB_shader_image_size GLEW_GET_VAR(__GLEW_ARB_shader_image_size) #endif /* GL_ARB_shader_image_size */ /* ------------------------- GL_ARB_shader_objects ------------------------- */ #ifndef GL_ARB_shader_objects #define GL_ARB_shader_objects 1 #define GL_PROGRAM_OBJECT_ARB 0x8B40 #define GL_SHADER_OBJECT_ARB 0x8B48 #define GL_OBJECT_TYPE_ARB 0x8B4E #define GL_OBJECT_SUBTYPE_ARB 0x8B4F #define GL_FLOAT_VEC2_ARB 0x8B50 #define GL_FLOAT_VEC3_ARB 0x8B51 #define GL_FLOAT_VEC4_ARB 0x8B52 #define GL_INT_VEC2_ARB 0x8B53 #define GL_INT_VEC3_ARB 0x8B54 #define GL_INT_VEC4_ARB 0x8B55 #define GL_BOOL_ARB 0x8B56 #define GL_BOOL_VEC2_ARB 0x8B57 #define GL_BOOL_VEC3_ARB 0x8B58 #define GL_BOOL_VEC4_ARB 0x8B59 #define GL_FLOAT_MAT2_ARB 0x8B5A #define GL_FLOAT_MAT3_ARB 0x8B5B #define GL_FLOAT_MAT4_ARB 0x8B5C #define GL_SAMPLER_1D_ARB 0x8B5D #define GL_SAMPLER_2D_ARB 0x8B5E #define GL_SAMPLER_3D_ARB 0x8B5F #define GL_SAMPLER_CUBE_ARB 0x8B60 #define GL_SAMPLER_1D_SHADOW_ARB 0x8B61 #define GL_SAMPLER_2D_SHADOW_ARB 0x8B62 #define GL_SAMPLER_2D_RECT_ARB 0x8B63 #define GL_SAMPLER_2D_RECT_SHADOW_ARB 0x8B64 #define GL_OBJECT_DELETE_STATUS_ARB 0x8B80 #define GL_OBJECT_COMPILE_STATUS_ARB 0x8B81 #define GL_OBJECT_LINK_STATUS_ARB 0x8B82 #define GL_OBJECT_VALIDATE_STATUS_ARB 0x8B83 #define GL_OBJECT_INFO_LOG_LENGTH_ARB 0x8B84 #define GL_OBJECT_ATTACHED_OBJECTS_ARB 0x8B85 #define GL_OBJECT_ACTIVE_UNIFORMS_ARB 0x8B86 #define GL_OBJECT_ACTIVE_UNIFORM_MAX_LENGTH_ARB 0x8B87 #define GL_OBJECT_SHADER_SOURCE_LENGTH_ARB 0x8B88 typedef char GLcharARB; typedef unsigned int GLhandleARB; typedef void (GLAPIENTRY * PFNGLATTACHOBJECTARBPROC) (GLhandleARB containerObj, GLhandleARB obj); typedef void (GLAPIENTRY * PFNGLCOMPILESHADERARBPROC) (GLhandleARB shaderObj); typedef GLhandleARB (GLAPIENTRY * PFNGLCREATEPROGRAMOBJECTARBPROC) (void); typedef GLhandleARB (GLAPIENTRY * PFNGLCREATESHADEROBJECTARBPROC) (GLenum shaderType); typedef void (GLAPIENTRY * PFNGLDELETEOBJECTARBPROC) (GLhandleARB obj); typedef void (GLAPIENTRY * PFNGLDETACHOBJECTARBPROC) (GLhandleARB containerObj, GLhandleARB attachedObj); typedef void (GLAPIENTRY * PFNGLGETACTIVEUNIFORMARBPROC) (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei* length, GLint *size, GLenum *type, GLcharARB *name); typedef void (GLAPIENTRY * PFNGLGETATTACHEDOBJECTSARBPROC) (GLhandleARB containerObj, GLsizei maxCount, GLsizei* count, GLhandleARB *obj); typedef GLhandleARB (GLAPIENTRY * PFNGLGETHANDLEARBPROC) (GLenum pname); typedef void (GLAPIENTRY * PFNGLGETINFOLOGARBPROC) (GLhandleARB obj, GLsizei maxLength, GLsizei* length, GLcharARB *infoLog); typedef void (GLAPIENTRY * PFNGLGETOBJECTPARAMETERFVARBPROC) (GLhandleARB obj, GLenum pname, GLfloat* params); typedef void (GLAPIENTRY * PFNGLGETOBJECTPARAMETERIVARBPROC) (GLhandleARB obj, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLGETSHADERSOURCEARBPROC) (GLhandleARB obj, GLsizei maxLength, GLsizei* length, GLcharARB *source); typedef GLint (GLAPIENTRY * PFNGLGETUNIFORMLOCATIONARBPROC) (GLhandleARB programObj, const GLcharARB* name); typedef void (GLAPIENTRY * PFNGLGETUNIFORMFVARBPROC) (GLhandleARB programObj, GLint location, GLfloat* params); typedef void (GLAPIENTRY * PFNGLGETUNIFORMIVARBPROC) (GLhandleARB programObj, GLint location, GLint* params); typedef void (GLAPIENTRY * PFNGLLINKPROGRAMARBPROC) (GLhandleARB programObj); typedef void (GLAPIENTRY * PFNGLSHADERSOURCEARBPROC) (GLhandleARB shaderObj, GLsizei count, const GLcharARB ** string, const GLint *length); typedef void (GLAPIENTRY * PFNGLUNIFORM1FARBPROC) (GLint location, GLfloat v0); typedef void (GLAPIENTRY * PFNGLUNIFORM1FVARBPROC) (GLint location, GLsizei count, const GLfloat* value); typedef void (GLAPIENTRY * PFNGLUNIFORM1IARBPROC) (GLint location, GLint v0); typedef void (GLAPIENTRY * PFNGLUNIFORM1IVARBPROC) (GLint location, GLsizei count, const GLint* value); typedef void (GLAPIENTRY * PFNGLUNIFORM2FARBPROC) (GLint location, GLfloat v0, GLfloat v1); typedef void (GLAPIENTRY * PFNGLUNIFORM2FVARBPROC) (GLint location, GLsizei count, const GLfloat* value); typedef void (GLAPIENTRY * PFNGLUNIFORM2IARBPROC) (GLint location, GLint v0, GLint v1); typedef void (GLAPIENTRY * PFNGLUNIFORM2IVARBPROC) (GLint location, GLsizei count, const GLint* value); typedef void (GLAPIENTRY * PFNGLUNIFORM3FARBPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2); typedef void (GLAPIENTRY * PFNGLUNIFORM3FVARBPROC) (GLint location, GLsizei count, const GLfloat* value); typedef void (GLAPIENTRY * PFNGLUNIFORM3IARBPROC) (GLint location, GLint v0, GLint v1, GLint v2); typedef void (GLAPIENTRY * PFNGLUNIFORM3IVARBPROC) (GLint location, GLsizei count, const GLint* value); typedef void (GLAPIENTRY * PFNGLUNIFORM4FARBPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); typedef void (GLAPIENTRY * PFNGLUNIFORM4FVARBPROC) (GLint location, GLsizei count, const GLfloat* value); typedef void (GLAPIENTRY * PFNGLUNIFORM4IARBPROC) (GLint location, GLint v0, GLint v1, GLint v2, GLint v3); typedef void (GLAPIENTRY * PFNGLUNIFORM4IVARBPROC) (GLint location, GLsizei count, const GLint* value); typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX2FVARBPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX3FVARBPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX4FVARBPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); typedef void (GLAPIENTRY * PFNGLUSEPROGRAMOBJECTARBPROC) (GLhandleARB programObj); typedef void (GLAPIENTRY * PFNGLVALIDATEPROGRAMARBPROC) (GLhandleARB programObj); #define glAttachObjectARB GLEW_GET_FUN(__glewAttachObjectARB) #define glCompileShaderARB GLEW_GET_FUN(__glewCompileShaderARB) #define glCreateProgramObjectARB GLEW_GET_FUN(__glewCreateProgramObjectARB) #define glCreateShaderObjectARB GLEW_GET_FUN(__glewCreateShaderObjectARB) #define glDeleteObjectARB GLEW_GET_FUN(__glewDeleteObjectARB) #define glDetachObjectARB GLEW_GET_FUN(__glewDetachObjectARB) #define glGetActiveUniformARB GLEW_GET_FUN(__glewGetActiveUniformARB) #define glGetAttachedObjectsARB GLEW_GET_FUN(__glewGetAttachedObjectsARB) #define glGetHandleARB GLEW_GET_FUN(__glewGetHandleARB) #define glGetInfoLogARB GLEW_GET_FUN(__glewGetInfoLogARB) #define glGetObjectParameterfvARB GLEW_GET_FUN(__glewGetObjectParameterfvARB) #define glGetObjectParameterivARB GLEW_GET_FUN(__glewGetObjectParameterivARB) #define glGetShaderSourceARB GLEW_GET_FUN(__glewGetShaderSourceARB) #define glGetUniformLocationARB GLEW_GET_FUN(__glewGetUniformLocationARB) #define glGetUniformfvARB GLEW_GET_FUN(__glewGetUniformfvARB) #define glGetUniformivARB GLEW_GET_FUN(__glewGetUniformivARB) #define glLinkProgramARB GLEW_GET_FUN(__glewLinkProgramARB) #define glShaderSourceARB GLEW_GET_FUN(__glewShaderSourceARB) #define glUniform1fARB GLEW_GET_FUN(__glewUniform1fARB) #define glUniform1fvARB GLEW_GET_FUN(__glewUniform1fvARB) #define glUniform1iARB GLEW_GET_FUN(__glewUniform1iARB) #define glUniform1ivARB GLEW_GET_FUN(__glewUniform1ivARB) #define glUniform2fARB GLEW_GET_FUN(__glewUniform2fARB) #define glUniform2fvARB GLEW_GET_FUN(__glewUniform2fvARB) #define glUniform2iARB GLEW_GET_FUN(__glewUniform2iARB) #define glUniform2ivARB GLEW_GET_FUN(__glewUniform2ivARB) #define glUniform3fARB GLEW_GET_FUN(__glewUniform3fARB) #define glUniform3fvARB GLEW_GET_FUN(__glewUniform3fvARB) #define glUniform3iARB GLEW_GET_FUN(__glewUniform3iARB) #define glUniform3ivARB GLEW_GET_FUN(__glewUniform3ivARB) #define glUniform4fARB GLEW_GET_FUN(__glewUniform4fARB) #define glUniform4fvARB GLEW_GET_FUN(__glewUniform4fvARB) #define glUniform4iARB GLEW_GET_FUN(__glewUniform4iARB) #define glUniform4ivARB GLEW_GET_FUN(__glewUniform4ivARB) #define glUniformMatrix2fvARB GLEW_GET_FUN(__glewUniformMatrix2fvARB) #define glUniformMatrix3fvARB GLEW_GET_FUN(__glewUniformMatrix3fvARB) #define glUniformMatrix4fvARB GLEW_GET_FUN(__glewUniformMatrix4fvARB) #define glUseProgramObjectARB GLEW_GET_FUN(__glewUseProgramObjectARB) #define glValidateProgramARB GLEW_GET_FUN(__glewValidateProgramARB) #define GLEW_ARB_shader_objects GLEW_GET_VAR(__GLEW_ARB_shader_objects) #endif /* GL_ARB_shader_objects */ /* ------------------------ GL_ARB_shader_precision ------------------------ */ #ifndef GL_ARB_shader_precision #define GL_ARB_shader_precision 1 #define GLEW_ARB_shader_precision GLEW_GET_VAR(__GLEW_ARB_shader_precision) #endif /* GL_ARB_shader_precision */ /* ---------------------- GL_ARB_shader_stencil_export --------------------- */ #ifndef GL_ARB_shader_stencil_export #define GL_ARB_shader_stencil_export 1 #define GLEW_ARB_shader_stencil_export GLEW_GET_VAR(__GLEW_ARB_shader_stencil_export) #endif /* GL_ARB_shader_stencil_export */ /* ------------------ GL_ARB_shader_storage_buffer_object ------------------ */ #ifndef GL_ARB_shader_storage_buffer_object #define GL_ARB_shader_storage_buffer_object 1 #define GL_SHADER_STORAGE_BARRIER_BIT 0x2000 #define GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES 0x8F39 #define GL_SHADER_STORAGE_BUFFER 0x90D2 #define GL_SHADER_STORAGE_BUFFER_BINDING 0x90D3 #define GL_SHADER_STORAGE_BUFFER_START 0x90D4 #define GL_SHADER_STORAGE_BUFFER_SIZE 0x90D5 #define GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS 0x90D6 #define GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS 0x90D7 #define GL_MAX_TESS_CONTROL_SHADER_STORAGE_BLOCKS 0x90D8 #define GL_MAX_TESS_EVALUATION_SHADER_STORAGE_BLOCKS 0x90D9 #define GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS 0x90DA #define GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS 0x90DB #define GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS 0x90DC #define GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS 0x90DD #define GL_MAX_SHADER_STORAGE_BLOCK_SIZE 0x90DE #define GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT 0x90DF typedef void (GLAPIENTRY * PFNGLSHADERSTORAGEBLOCKBINDINGPROC) (GLuint program, GLuint storageBlockIndex, GLuint storageBlockBinding); #define glShaderStorageBlockBinding GLEW_GET_FUN(__glewShaderStorageBlockBinding) #define GLEW_ARB_shader_storage_buffer_object GLEW_GET_VAR(__GLEW_ARB_shader_storage_buffer_object) #endif /* GL_ARB_shader_storage_buffer_object */ /* ------------------------ GL_ARB_shader_subroutine ----------------------- */ #ifndef GL_ARB_shader_subroutine #define GL_ARB_shader_subroutine 1 #define GL_ACTIVE_SUBROUTINES 0x8DE5 #define GL_ACTIVE_SUBROUTINE_UNIFORMS 0x8DE6 #define GL_MAX_SUBROUTINES 0x8DE7 #define GL_MAX_SUBROUTINE_UNIFORM_LOCATIONS 0x8DE8 #define GL_ACTIVE_SUBROUTINE_UNIFORM_LOCATIONS 0x8E47 #define GL_ACTIVE_SUBROUTINE_MAX_LENGTH 0x8E48 #define GL_ACTIVE_SUBROUTINE_UNIFORM_MAX_LENGTH 0x8E49 #define GL_NUM_COMPATIBLE_SUBROUTINES 0x8E4A #define GL_COMPATIBLE_SUBROUTINES 0x8E4B typedef void (GLAPIENTRY * PFNGLGETACTIVESUBROUTINENAMEPROC) (GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei* length, GLchar *name); typedef void (GLAPIENTRY * PFNGLGETACTIVESUBROUTINEUNIFORMNAMEPROC) (GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei* length, GLchar *name); typedef void (GLAPIENTRY * PFNGLGETACTIVESUBROUTINEUNIFORMIVPROC) (GLuint program, GLenum shadertype, GLuint index, GLenum pname, GLint* values); typedef void (GLAPIENTRY * PFNGLGETPROGRAMSTAGEIVPROC) (GLuint program, GLenum shadertype, GLenum pname, GLint* values); typedef GLuint (GLAPIENTRY * PFNGLGETSUBROUTINEINDEXPROC) (GLuint program, GLenum shadertype, const GLchar* name); typedef GLint (GLAPIENTRY * PFNGLGETSUBROUTINEUNIFORMLOCATIONPROC) (GLuint program, GLenum shadertype, const GLchar* name); typedef void (GLAPIENTRY * PFNGLGETUNIFORMSUBROUTINEUIVPROC) (GLenum shadertype, GLint location, GLuint* params); typedef void (GLAPIENTRY * PFNGLUNIFORMSUBROUTINESUIVPROC) (GLenum shadertype, GLsizei count, const GLuint* indices); #define glGetActiveSubroutineName GLEW_GET_FUN(__glewGetActiveSubroutineName) #define glGetActiveSubroutineUniformName GLEW_GET_FUN(__glewGetActiveSubroutineUniformName) #define glGetActiveSubroutineUniformiv GLEW_GET_FUN(__glewGetActiveSubroutineUniformiv) #define glGetProgramStageiv GLEW_GET_FUN(__glewGetProgramStageiv) #define glGetSubroutineIndex GLEW_GET_FUN(__glewGetSubroutineIndex) #define glGetSubroutineUniformLocation GLEW_GET_FUN(__glewGetSubroutineUniformLocation) #define glGetUniformSubroutineuiv GLEW_GET_FUN(__glewGetUniformSubroutineuiv) #define glUniformSubroutinesuiv GLEW_GET_FUN(__glewUniformSubroutinesuiv) #define GLEW_ARB_shader_subroutine GLEW_GET_VAR(__GLEW_ARB_shader_subroutine) #endif /* GL_ARB_shader_subroutine */ /* ----------------------- GL_ARB_shader_texture_lod ----------------------- */ #ifndef GL_ARB_shader_texture_lod #define GL_ARB_shader_texture_lod 1 #define GLEW_ARB_shader_texture_lod GLEW_GET_VAR(__GLEW_ARB_shader_texture_lod) #endif /* GL_ARB_shader_texture_lod */ /* ---------------------- GL_ARB_shading_language_100 ---------------------- */ #ifndef GL_ARB_shading_language_100 #define GL_ARB_shading_language_100 1 #define GL_SHADING_LANGUAGE_VERSION_ARB 0x8B8C #define GLEW_ARB_shading_language_100 GLEW_GET_VAR(__GLEW_ARB_shading_language_100) #endif /* GL_ARB_shading_language_100 */ /* -------------------- GL_ARB_shading_language_420pack -------------------- */ #ifndef GL_ARB_shading_language_420pack #define GL_ARB_shading_language_420pack 1 #define GLEW_ARB_shading_language_420pack GLEW_GET_VAR(__GLEW_ARB_shading_language_420pack) #endif /* GL_ARB_shading_language_420pack */ /* -------------------- GL_ARB_shading_language_include -------------------- */ #ifndef GL_ARB_shading_language_include #define GL_ARB_shading_language_include 1 #define GL_SHADER_INCLUDE_ARB 0x8DAE #define GL_NAMED_STRING_LENGTH_ARB 0x8DE9 #define GL_NAMED_STRING_TYPE_ARB 0x8DEA typedef void (GLAPIENTRY * PFNGLCOMPILESHADERINCLUDEARBPROC) (GLuint shader, GLsizei count, const GLchar ** path, const GLint *length); typedef void (GLAPIENTRY * PFNGLDELETENAMEDSTRINGARBPROC) (GLint namelen, const GLchar* name); typedef void (GLAPIENTRY * PFNGLGETNAMEDSTRINGARBPROC) (GLint namelen, const GLchar* name, GLsizei bufSize, GLint *stringlen, GLchar *string); typedef void (GLAPIENTRY * PFNGLGETNAMEDSTRINGIVARBPROC) (GLint namelen, const GLchar* name, GLenum pname, GLint *params); typedef GLboolean (GLAPIENTRY * PFNGLISNAMEDSTRINGARBPROC) (GLint namelen, const GLchar* name); typedef void (GLAPIENTRY * PFNGLNAMEDSTRINGARBPROC) (GLenum type, GLint namelen, const GLchar* name, GLint stringlen, const GLchar *string); #define glCompileShaderIncludeARB GLEW_GET_FUN(__glewCompileShaderIncludeARB) #define glDeleteNamedStringARB GLEW_GET_FUN(__glewDeleteNamedStringARB) #define glGetNamedStringARB GLEW_GET_FUN(__glewGetNamedStringARB) #define glGetNamedStringivARB GLEW_GET_FUN(__glewGetNamedStringivARB) #define glIsNamedStringARB GLEW_GET_FUN(__glewIsNamedStringARB) #define glNamedStringARB GLEW_GET_FUN(__glewNamedStringARB) #define GLEW_ARB_shading_language_include GLEW_GET_VAR(__GLEW_ARB_shading_language_include) #endif /* GL_ARB_shading_language_include */ /* -------------------- GL_ARB_shading_language_packing -------------------- */ #ifndef GL_ARB_shading_language_packing #define GL_ARB_shading_language_packing 1 #define GLEW_ARB_shading_language_packing GLEW_GET_VAR(__GLEW_ARB_shading_language_packing) #endif /* GL_ARB_shading_language_packing */ /* ----------------------------- GL_ARB_shadow ----------------------------- */ #ifndef GL_ARB_shadow #define GL_ARB_shadow 1 #define GL_TEXTURE_COMPARE_MODE_ARB 0x884C #define GL_TEXTURE_COMPARE_FUNC_ARB 0x884D #define GL_COMPARE_R_TO_TEXTURE_ARB 0x884E #define GLEW_ARB_shadow GLEW_GET_VAR(__GLEW_ARB_shadow) #endif /* GL_ARB_shadow */ /* ------------------------- GL_ARB_shadow_ambient ------------------------- */ #ifndef GL_ARB_shadow_ambient #define GL_ARB_shadow_ambient 1 #define GL_TEXTURE_COMPARE_FAIL_VALUE_ARB 0x80BF #define GLEW_ARB_shadow_ambient GLEW_GET_VAR(__GLEW_ARB_shadow_ambient) #endif /* GL_ARB_shadow_ambient */ /* ------------------------ GL_ARB_stencil_texturing ----------------------- */ #ifndef GL_ARB_stencil_texturing #define GL_ARB_stencil_texturing 1 #define GL_DEPTH_STENCIL_TEXTURE_MODE 0x90EA #define GLEW_ARB_stencil_texturing GLEW_GET_VAR(__GLEW_ARB_stencil_texturing) #endif /* GL_ARB_stencil_texturing */ /* ------------------------------ GL_ARB_sync ------------------------------ */ #ifndef GL_ARB_sync #define GL_ARB_sync 1 #define GL_SYNC_FLUSH_COMMANDS_BIT 0x00000001 #define GL_MAX_SERVER_WAIT_TIMEOUT 0x9111 #define GL_OBJECT_TYPE 0x9112 #define GL_SYNC_CONDITION 0x9113 #define GL_SYNC_STATUS 0x9114 #define GL_SYNC_FLAGS 0x9115 #define GL_SYNC_FENCE 0x9116 #define GL_SYNC_GPU_COMMANDS_COMPLETE 0x9117 #define GL_UNSIGNALED 0x9118 #define GL_SIGNALED 0x9119 #define GL_ALREADY_SIGNALED 0x911A #define GL_TIMEOUT_EXPIRED 0x911B #define GL_CONDITION_SATISFIED 0x911C #define GL_WAIT_FAILED 0x911D #define GL_TIMEOUT_IGNORED 0xFFFFFFFFFFFFFFFF typedef GLenum (GLAPIENTRY * PFNGLCLIENTWAITSYNCPROC) (GLsync GLsync,GLbitfield flags,GLuint64 timeout); typedef void (GLAPIENTRY * PFNGLDELETESYNCPROC) (GLsync GLsync); typedef GLsync (GLAPIENTRY * PFNGLFENCESYNCPROC) (GLenum condition,GLbitfield flags); typedef void (GLAPIENTRY * PFNGLGETINTEGER64VPROC) (GLenum pname, GLint64* params); typedef void (GLAPIENTRY * PFNGLGETSYNCIVPROC) (GLsync GLsync,GLenum pname,GLsizei bufSize,GLsizei* length, GLint *values); typedef GLboolean (GLAPIENTRY * PFNGLISSYNCPROC) (GLsync GLsync); typedef void (GLAPIENTRY * PFNGLWAITSYNCPROC) (GLsync GLsync,GLbitfield flags,GLuint64 timeout); #define glClientWaitSync GLEW_GET_FUN(__glewClientWaitSync) #define glDeleteSync GLEW_GET_FUN(__glewDeleteSync) #define glFenceSync GLEW_GET_FUN(__glewFenceSync) #define glGetInteger64v GLEW_GET_FUN(__glewGetInteger64v) #define glGetSynciv GLEW_GET_FUN(__glewGetSynciv) #define glIsSync GLEW_GET_FUN(__glewIsSync) #define glWaitSync GLEW_GET_FUN(__glewWaitSync) #define GLEW_ARB_sync GLEW_GET_VAR(__GLEW_ARB_sync) #endif /* GL_ARB_sync */ /* ----------------------- GL_ARB_tessellation_shader ---------------------- */ #ifndef GL_ARB_tessellation_shader #define GL_ARB_tessellation_shader 1 #define GL_PATCHES 0xE #define GL_UNIFORM_BLOCK_REFERENCED_BY_TESS_CONTROL_SHADER 0x84F0 #define GL_UNIFORM_BLOCK_REFERENCED_BY_TESS_EVALUATION_SHADER 0x84F1 #define GL_MAX_TESS_CONTROL_INPUT_COMPONENTS 0x886C #define GL_MAX_TESS_EVALUATION_INPUT_COMPONENTS 0x886D #define GL_MAX_COMBINED_TESS_CONTROL_UNIFORM_COMPONENTS 0x8E1E #define GL_MAX_COMBINED_TESS_EVALUATION_UNIFORM_COMPONENTS 0x8E1F #define GL_PATCH_VERTICES 0x8E72 #define GL_PATCH_DEFAULT_INNER_LEVEL 0x8E73 #define GL_PATCH_DEFAULT_OUTER_LEVEL 0x8E74 #define GL_TESS_CONTROL_OUTPUT_VERTICES 0x8E75 #define GL_TESS_GEN_MODE 0x8E76 #define GL_TESS_GEN_SPACING 0x8E77 #define GL_TESS_GEN_VERTEX_ORDER 0x8E78 #define GL_TESS_GEN_POINT_MODE 0x8E79 #define GL_ISOLINES 0x8E7A #define GL_FRACTIONAL_ODD 0x8E7B #define GL_FRACTIONAL_EVEN 0x8E7C #define GL_MAX_PATCH_VERTICES 0x8E7D #define GL_MAX_TESS_GEN_LEVEL 0x8E7E #define GL_MAX_TESS_CONTROL_UNIFORM_COMPONENTS 0x8E7F #define GL_MAX_TESS_EVALUATION_UNIFORM_COMPONENTS 0x8E80 #define GL_MAX_TESS_CONTROL_TEXTURE_IMAGE_UNITS 0x8E81 #define GL_MAX_TESS_EVALUATION_TEXTURE_IMAGE_UNITS 0x8E82 #define GL_MAX_TESS_CONTROL_OUTPUT_COMPONENTS 0x8E83 #define GL_MAX_TESS_PATCH_COMPONENTS 0x8E84 #define GL_MAX_TESS_CONTROL_TOTAL_OUTPUT_COMPONENTS 0x8E85 #define GL_MAX_TESS_EVALUATION_OUTPUT_COMPONENTS 0x8E86 #define GL_TESS_EVALUATION_SHADER 0x8E87 #define GL_TESS_CONTROL_SHADER 0x8E88 #define GL_MAX_TESS_CONTROL_UNIFORM_BLOCKS 0x8E89 #define GL_MAX_TESS_EVALUATION_UNIFORM_BLOCKS 0x8E8A typedef void (GLAPIENTRY * PFNGLPATCHPARAMETERFVPROC) (GLenum pname, const GLfloat* values); typedef void (GLAPIENTRY * PFNGLPATCHPARAMETERIPROC) (GLenum pname, GLint value); #define glPatchParameterfv GLEW_GET_FUN(__glewPatchParameterfv) #define glPatchParameteri GLEW_GET_FUN(__glewPatchParameteri) #define GLEW_ARB_tessellation_shader GLEW_GET_VAR(__GLEW_ARB_tessellation_shader) #endif /* GL_ARB_tessellation_shader */ /* ---------------------- GL_ARB_texture_border_clamp ---------------------- */ #ifndef GL_ARB_texture_border_clamp #define GL_ARB_texture_border_clamp 1 #define GL_CLAMP_TO_BORDER_ARB 0x812D #define GLEW_ARB_texture_border_clamp GLEW_GET_VAR(__GLEW_ARB_texture_border_clamp) #endif /* GL_ARB_texture_border_clamp */ /* ---------------------- GL_ARB_texture_buffer_object --------------------- */ #ifndef GL_ARB_texture_buffer_object #define GL_ARB_texture_buffer_object 1 #define GL_TEXTURE_BUFFER_ARB 0x8C2A #define GL_MAX_TEXTURE_BUFFER_SIZE_ARB 0x8C2B #define GL_TEXTURE_BINDING_BUFFER_ARB 0x8C2C #define GL_TEXTURE_BUFFER_DATA_STORE_BINDING_ARB 0x8C2D #define GL_TEXTURE_BUFFER_FORMAT_ARB 0x8C2E typedef void (GLAPIENTRY * PFNGLTEXBUFFERARBPROC) (GLenum target, GLenum internalformat, GLuint buffer); #define glTexBufferARB GLEW_GET_FUN(__glewTexBufferARB) #define GLEW_ARB_texture_buffer_object GLEW_GET_VAR(__GLEW_ARB_texture_buffer_object) #endif /* GL_ARB_texture_buffer_object */ /* ------------------- GL_ARB_texture_buffer_object_rgb32 ------------------ */ #ifndef GL_ARB_texture_buffer_object_rgb32 #define GL_ARB_texture_buffer_object_rgb32 1 #define GLEW_ARB_texture_buffer_object_rgb32 GLEW_GET_VAR(__GLEW_ARB_texture_buffer_object_rgb32) #endif /* GL_ARB_texture_buffer_object_rgb32 */ /* ---------------------- GL_ARB_texture_buffer_range ---------------------- */ #ifndef GL_ARB_texture_buffer_range #define GL_ARB_texture_buffer_range 1 #define GL_TEXTURE_BUFFER_OFFSET 0x919D #define GL_TEXTURE_BUFFER_SIZE 0x919E #define GL_TEXTURE_BUFFER_OFFSET_ALIGNMENT 0x919F typedef void (GLAPIENTRY * PFNGLTEXBUFFERRANGEPROC) (GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size); typedef void (GLAPIENTRY * PFNGLTEXTUREBUFFERRANGEEXTPROC) (GLuint texture, GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size); #define glTexBufferRange GLEW_GET_FUN(__glewTexBufferRange) #define glTextureBufferRangeEXT GLEW_GET_FUN(__glewTextureBufferRangeEXT) #define GLEW_ARB_texture_buffer_range GLEW_GET_VAR(__GLEW_ARB_texture_buffer_range) #endif /* GL_ARB_texture_buffer_range */ /* ----------------------- GL_ARB_texture_compression ---------------------- */ #ifndef GL_ARB_texture_compression #define GL_ARB_texture_compression 1 #define GL_COMPRESSED_ALPHA_ARB 0x84E9 #define GL_COMPRESSED_LUMINANCE_ARB 0x84EA #define GL_COMPRESSED_LUMINANCE_ALPHA_ARB 0x84EB #define GL_COMPRESSED_INTENSITY_ARB 0x84EC #define GL_COMPRESSED_RGB_ARB 0x84ED #define GL_COMPRESSED_RGBA_ARB 0x84EE #define GL_TEXTURE_COMPRESSION_HINT_ARB 0x84EF #define GL_TEXTURE_COMPRESSED_IMAGE_SIZE_ARB 0x86A0 #define GL_TEXTURE_COMPRESSED_ARB 0x86A1 #define GL_NUM_COMPRESSED_TEXTURE_FORMATS_ARB 0x86A2 #define GL_COMPRESSED_TEXTURE_FORMATS_ARB 0x86A3 typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXIMAGE1DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void* data); typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXIMAGE2DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void* data); typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXIMAGE3DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void* data); typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXSUBIMAGE1DARBPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void* data); typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXSUBIMAGE2DARBPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void* data); typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXSUBIMAGE3DARBPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void* data); typedef void (GLAPIENTRY * PFNGLGETCOMPRESSEDTEXIMAGEARBPROC) (GLenum target, GLint lod, void* img); #define glCompressedTexImage1DARB GLEW_GET_FUN(__glewCompressedTexImage1DARB) #define glCompressedTexImage2DARB GLEW_GET_FUN(__glewCompressedTexImage2DARB) #define glCompressedTexImage3DARB GLEW_GET_FUN(__glewCompressedTexImage3DARB) #define glCompressedTexSubImage1DARB GLEW_GET_FUN(__glewCompressedTexSubImage1DARB) #define glCompressedTexSubImage2DARB GLEW_GET_FUN(__glewCompressedTexSubImage2DARB) #define glCompressedTexSubImage3DARB GLEW_GET_FUN(__glewCompressedTexSubImage3DARB) #define glGetCompressedTexImageARB GLEW_GET_FUN(__glewGetCompressedTexImageARB) #define GLEW_ARB_texture_compression GLEW_GET_VAR(__GLEW_ARB_texture_compression) #endif /* GL_ARB_texture_compression */ /* -------------------- GL_ARB_texture_compression_bptc -------------------- */ #ifndef GL_ARB_texture_compression_bptc #define GL_ARB_texture_compression_bptc 1 #define GL_COMPRESSED_RGBA_BPTC_UNORM_ARB 0x8E8C #define GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM_ARB 0x8E8D #define GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT_ARB 0x8E8E #define GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_ARB 0x8E8F #define GLEW_ARB_texture_compression_bptc GLEW_GET_VAR(__GLEW_ARB_texture_compression_bptc) #endif /* GL_ARB_texture_compression_bptc */ /* -------------------- GL_ARB_texture_compression_rgtc -------------------- */ #ifndef GL_ARB_texture_compression_rgtc #define GL_ARB_texture_compression_rgtc 1 #define GL_COMPRESSED_RED_RGTC1 0x8DBB #define GL_COMPRESSED_SIGNED_RED_RGTC1 0x8DBC #define GL_COMPRESSED_RG_RGTC2 0x8DBD #define GL_COMPRESSED_SIGNED_RG_RGTC2 0x8DBE #define GLEW_ARB_texture_compression_rgtc GLEW_GET_VAR(__GLEW_ARB_texture_compression_rgtc) #endif /* GL_ARB_texture_compression_rgtc */ /* ------------------------ GL_ARB_texture_cube_map ------------------------ */ #ifndef GL_ARB_texture_cube_map #define GL_ARB_texture_cube_map 1 #define GL_NORMAL_MAP_ARB 0x8511 #define GL_REFLECTION_MAP_ARB 0x8512 #define GL_TEXTURE_CUBE_MAP_ARB 0x8513 #define GL_TEXTURE_BINDING_CUBE_MAP_ARB 0x8514 #define GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB 0x8515 #define GL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB 0x8516 #define GL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB 0x8517 #define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB 0x8518 #define GL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB 0x8519 #define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB 0x851A #define GL_PROXY_TEXTURE_CUBE_MAP_ARB 0x851B #define GL_MAX_CUBE_MAP_TEXTURE_SIZE_ARB 0x851C #define GLEW_ARB_texture_cube_map GLEW_GET_VAR(__GLEW_ARB_texture_cube_map) #endif /* GL_ARB_texture_cube_map */ /* --------------------- GL_ARB_texture_cube_map_array --------------------- */ #ifndef GL_ARB_texture_cube_map_array #define GL_ARB_texture_cube_map_array 1 #define GL_TEXTURE_CUBE_MAP_ARRAY_ARB 0x9009 #define GL_TEXTURE_BINDING_CUBE_MAP_ARRAY_ARB 0x900A #define GL_PROXY_TEXTURE_CUBE_MAP_ARRAY_ARB 0x900B #define GL_SAMPLER_CUBE_MAP_ARRAY_ARB 0x900C #define GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW_ARB 0x900D #define GL_INT_SAMPLER_CUBE_MAP_ARRAY_ARB 0x900E #define GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY_ARB 0x900F #define GLEW_ARB_texture_cube_map_array GLEW_GET_VAR(__GLEW_ARB_texture_cube_map_array) #endif /* GL_ARB_texture_cube_map_array */ /* ------------------------- GL_ARB_texture_env_add ------------------------ */ #ifndef GL_ARB_texture_env_add #define GL_ARB_texture_env_add 1 #define GLEW_ARB_texture_env_add GLEW_GET_VAR(__GLEW_ARB_texture_env_add) #endif /* GL_ARB_texture_env_add */ /* ----------------------- GL_ARB_texture_env_combine ---------------------- */ #ifndef GL_ARB_texture_env_combine #define GL_ARB_texture_env_combine 1 #define GL_SUBTRACT_ARB 0x84E7 #define GL_COMBINE_ARB 0x8570 #define GL_COMBINE_RGB_ARB 0x8571 #define GL_COMBINE_ALPHA_ARB 0x8572 #define GL_RGB_SCALE_ARB 0x8573 #define GL_ADD_SIGNED_ARB 0x8574 #define GL_INTERPOLATE_ARB 0x8575 #define GL_CONSTANT_ARB 0x8576 #define GL_PRIMARY_COLOR_ARB 0x8577 #define GL_PREVIOUS_ARB 0x8578 #define GL_SOURCE0_RGB_ARB 0x8580 #define GL_SOURCE1_RGB_ARB 0x8581 #define GL_SOURCE2_RGB_ARB 0x8582 #define GL_SOURCE0_ALPHA_ARB 0x8588 #define GL_SOURCE1_ALPHA_ARB 0x8589 #define GL_SOURCE2_ALPHA_ARB 0x858A #define GL_OPERAND0_RGB_ARB 0x8590 #define GL_OPERAND1_RGB_ARB 0x8591 #define GL_OPERAND2_RGB_ARB 0x8592 #define GL_OPERAND0_ALPHA_ARB 0x8598 #define GL_OPERAND1_ALPHA_ARB 0x8599 #define GL_OPERAND2_ALPHA_ARB 0x859A #define GLEW_ARB_texture_env_combine GLEW_GET_VAR(__GLEW_ARB_texture_env_combine) #endif /* GL_ARB_texture_env_combine */ /* ---------------------- GL_ARB_texture_env_crossbar ---------------------- */ #ifndef GL_ARB_texture_env_crossbar #define GL_ARB_texture_env_crossbar 1 #define GLEW_ARB_texture_env_crossbar GLEW_GET_VAR(__GLEW_ARB_texture_env_crossbar) #endif /* GL_ARB_texture_env_crossbar */ /* ------------------------ GL_ARB_texture_env_dot3 ------------------------ */ #ifndef GL_ARB_texture_env_dot3 #define GL_ARB_texture_env_dot3 1 #define GL_DOT3_RGB_ARB 0x86AE #define GL_DOT3_RGBA_ARB 0x86AF #define GLEW_ARB_texture_env_dot3 GLEW_GET_VAR(__GLEW_ARB_texture_env_dot3) #endif /* GL_ARB_texture_env_dot3 */ /* -------------------------- GL_ARB_texture_float ------------------------- */ #ifndef GL_ARB_texture_float #define GL_ARB_texture_float 1 #define GL_RGBA32F_ARB 0x8814 #define GL_RGB32F_ARB 0x8815 #define GL_ALPHA32F_ARB 0x8816 #define GL_INTENSITY32F_ARB 0x8817 #define GL_LUMINANCE32F_ARB 0x8818 #define GL_LUMINANCE_ALPHA32F_ARB 0x8819 #define GL_RGBA16F_ARB 0x881A #define GL_RGB16F_ARB 0x881B #define GL_ALPHA16F_ARB 0x881C #define GL_INTENSITY16F_ARB 0x881D #define GL_LUMINANCE16F_ARB 0x881E #define GL_LUMINANCE_ALPHA16F_ARB 0x881F #define GL_TEXTURE_RED_TYPE_ARB 0x8C10 #define GL_TEXTURE_GREEN_TYPE_ARB 0x8C11 #define GL_TEXTURE_BLUE_TYPE_ARB 0x8C12 #define GL_TEXTURE_ALPHA_TYPE_ARB 0x8C13 #define GL_TEXTURE_LUMINANCE_TYPE_ARB 0x8C14 #define GL_TEXTURE_INTENSITY_TYPE_ARB 0x8C15 #define GL_TEXTURE_DEPTH_TYPE_ARB 0x8C16 #define GL_UNSIGNED_NORMALIZED_ARB 0x8C17 #define GLEW_ARB_texture_float GLEW_GET_VAR(__GLEW_ARB_texture_float) #endif /* GL_ARB_texture_float */ /* ------------------------- GL_ARB_texture_gather ------------------------- */ #ifndef GL_ARB_texture_gather #define GL_ARB_texture_gather 1 #define GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET_ARB 0x8E5E #define GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET_ARB 0x8E5F #define GL_MAX_PROGRAM_TEXTURE_GATHER_COMPONENTS_ARB 0x8F9F #define GLEW_ARB_texture_gather GLEW_GET_VAR(__GLEW_ARB_texture_gather) #endif /* GL_ARB_texture_gather */ /* --------------------- GL_ARB_texture_mirrored_repeat -------------------- */ #ifndef GL_ARB_texture_mirrored_repeat #define GL_ARB_texture_mirrored_repeat 1 #define GL_MIRRORED_REPEAT_ARB 0x8370 #define GLEW_ARB_texture_mirrored_repeat GLEW_GET_VAR(__GLEW_ARB_texture_mirrored_repeat) #endif /* GL_ARB_texture_mirrored_repeat */ /* ----------------------- GL_ARB_texture_multisample ---------------------- */ #ifndef GL_ARB_texture_multisample #define GL_ARB_texture_multisample 1 #define GL_SAMPLE_POSITION 0x8E50 #define GL_SAMPLE_MASK 0x8E51 #define GL_SAMPLE_MASK_VALUE 0x8E52 #define GL_MAX_SAMPLE_MASK_WORDS 0x8E59 #define GL_TEXTURE_2D_MULTISAMPLE 0x9100 #define GL_PROXY_TEXTURE_2D_MULTISAMPLE 0x9101 #define GL_TEXTURE_2D_MULTISAMPLE_ARRAY 0x9102 #define GL_PROXY_TEXTURE_2D_MULTISAMPLE_ARRAY 0x9103 #define GL_TEXTURE_BINDING_2D_MULTISAMPLE 0x9104 #define GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY 0x9105 #define GL_TEXTURE_SAMPLES 0x9106 #define GL_TEXTURE_FIXED_SAMPLE_LOCATIONS 0x9107 #define GL_SAMPLER_2D_MULTISAMPLE 0x9108 #define GL_INT_SAMPLER_2D_MULTISAMPLE 0x9109 #define GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE 0x910A #define GL_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910B #define GL_INT_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910C #define GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910D #define GL_MAX_COLOR_TEXTURE_SAMPLES 0x910E #define GL_MAX_DEPTH_TEXTURE_SAMPLES 0x910F #define GL_MAX_INTEGER_SAMPLES 0x9110 typedef void (GLAPIENTRY * PFNGLGETMULTISAMPLEFVPROC) (GLenum pname, GLuint index, GLfloat* val); typedef void (GLAPIENTRY * PFNGLSAMPLEMASKIPROC) (GLuint index, GLbitfield mask); typedef void (GLAPIENTRY * PFNGLTEXIMAGE2DMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLint internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); typedef void (GLAPIENTRY * PFNGLTEXIMAGE3DMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); #define glGetMultisamplefv GLEW_GET_FUN(__glewGetMultisamplefv) #define glSampleMaski GLEW_GET_FUN(__glewSampleMaski) #define glTexImage2DMultisample GLEW_GET_FUN(__glewTexImage2DMultisample) #define glTexImage3DMultisample GLEW_GET_FUN(__glewTexImage3DMultisample) #define GLEW_ARB_texture_multisample GLEW_GET_VAR(__GLEW_ARB_texture_multisample) #endif /* GL_ARB_texture_multisample */ /* -------------------- GL_ARB_texture_non_power_of_two -------------------- */ #ifndef GL_ARB_texture_non_power_of_two #define GL_ARB_texture_non_power_of_two 1 #define GLEW_ARB_texture_non_power_of_two GLEW_GET_VAR(__GLEW_ARB_texture_non_power_of_two) #endif /* GL_ARB_texture_non_power_of_two */ /* ---------------------- GL_ARB_texture_query_levels ---------------------- */ #ifndef GL_ARB_texture_query_levels #define GL_ARB_texture_query_levels 1 #define GLEW_ARB_texture_query_levels GLEW_GET_VAR(__GLEW_ARB_texture_query_levels) #endif /* GL_ARB_texture_query_levels */ /* ------------------------ GL_ARB_texture_query_lod ----------------------- */ #ifndef GL_ARB_texture_query_lod #define GL_ARB_texture_query_lod 1 #define GLEW_ARB_texture_query_lod GLEW_GET_VAR(__GLEW_ARB_texture_query_lod) #endif /* GL_ARB_texture_query_lod */ /* ------------------------ GL_ARB_texture_rectangle ----------------------- */ #ifndef GL_ARB_texture_rectangle #define GL_ARB_texture_rectangle 1 #define GL_TEXTURE_RECTANGLE_ARB 0x84F5 #define GL_TEXTURE_BINDING_RECTANGLE_ARB 0x84F6 #define GL_PROXY_TEXTURE_RECTANGLE_ARB 0x84F7 #define GL_MAX_RECTANGLE_TEXTURE_SIZE_ARB 0x84F8 #define GL_SAMPLER_2D_RECT_ARB 0x8B63 #define GL_SAMPLER_2D_RECT_SHADOW_ARB 0x8B64 #define GLEW_ARB_texture_rectangle GLEW_GET_VAR(__GLEW_ARB_texture_rectangle) #endif /* GL_ARB_texture_rectangle */ /* --------------------------- GL_ARB_texture_rg --------------------------- */ #ifndef GL_ARB_texture_rg #define GL_ARB_texture_rg 1 #define GL_COMPRESSED_RED 0x8225 #define GL_COMPRESSED_RG 0x8226 #define GL_RG 0x8227 #define GL_RG_INTEGER 0x8228 #define GL_R8 0x8229 #define GL_R16 0x822A #define GL_RG8 0x822B #define GL_RG16 0x822C #define GL_R16F 0x822D #define GL_R32F 0x822E #define GL_RG16F 0x822F #define GL_RG32F 0x8230 #define GL_R8I 0x8231 #define GL_R8UI 0x8232 #define GL_R16I 0x8233 #define GL_R16UI 0x8234 #define GL_R32I 0x8235 #define GL_R32UI 0x8236 #define GL_RG8I 0x8237 #define GL_RG8UI 0x8238 #define GL_RG16I 0x8239 #define GL_RG16UI 0x823A #define GL_RG32I 0x823B #define GL_RG32UI 0x823C #define GLEW_ARB_texture_rg GLEW_GET_VAR(__GLEW_ARB_texture_rg) #endif /* GL_ARB_texture_rg */ /* ----------------------- GL_ARB_texture_rgb10_a2ui ----------------------- */ #ifndef GL_ARB_texture_rgb10_a2ui #define GL_ARB_texture_rgb10_a2ui 1 #define GL_RGB10_A2UI 0x906F #define GLEW_ARB_texture_rgb10_a2ui GLEW_GET_VAR(__GLEW_ARB_texture_rgb10_a2ui) #endif /* GL_ARB_texture_rgb10_a2ui */ /* ------------------------- GL_ARB_texture_storage ------------------------ */ #ifndef GL_ARB_texture_storage #define GL_ARB_texture_storage 1 #define GL_TEXTURE_IMMUTABLE_FORMAT 0x912F typedef void (GLAPIENTRY * PFNGLTEXSTORAGE1DPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width); typedef void (GLAPIENTRY * PFNGLTEXSTORAGE2DPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); typedef void (GLAPIENTRY * PFNGLTEXSTORAGE3DPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); typedef void (GLAPIENTRY * PFNGLTEXTURESTORAGE1DEXTPROC) (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width); typedef void (GLAPIENTRY * PFNGLTEXTURESTORAGE2DEXTPROC) (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); typedef void (GLAPIENTRY * PFNGLTEXTURESTORAGE3DEXTPROC) (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); #define glTexStorage1D GLEW_GET_FUN(__glewTexStorage1D) #define glTexStorage2D GLEW_GET_FUN(__glewTexStorage2D) #define glTexStorage3D GLEW_GET_FUN(__glewTexStorage3D) #define glTextureStorage1DEXT GLEW_GET_FUN(__glewTextureStorage1DEXT) #define glTextureStorage2DEXT GLEW_GET_FUN(__glewTextureStorage2DEXT) #define glTextureStorage3DEXT GLEW_GET_FUN(__glewTextureStorage3DEXT) #define GLEW_ARB_texture_storage GLEW_GET_VAR(__GLEW_ARB_texture_storage) #endif /* GL_ARB_texture_storage */ /* ------------------- GL_ARB_texture_storage_multisample ------------------ */ #ifndef GL_ARB_texture_storage_multisample #define GL_ARB_texture_storage_multisample 1 typedef void (GLAPIENTRY * PFNGLTEXSTORAGE2DMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); typedef void (GLAPIENTRY * PFNGLTEXSTORAGE3DMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); typedef void (GLAPIENTRY * PFNGLTEXTURESTORAGE2DMULTISAMPLEEXTPROC) (GLuint texture, GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); typedef void (GLAPIENTRY * PFNGLTEXTURESTORAGE3DMULTISAMPLEEXTPROC) (GLuint texture, GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); #define glTexStorage2DMultisample GLEW_GET_FUN(__glewTexStorage2DMultisample) #define glTexStorage3DMultisample GLEW_GET_FUN(__glewTexStorage3DMultisample) #define glTextureStorage2DMultisampleEXT GLEW_GET_FUN(__glewTextureStorage2DMultisampleEXT) #define glTextureStorage3DMultisampleEXT GLEW_GET_FUN(__glewTextureStorage3DMultisampleEXT) #define GLEW_ARB_texture_storage_multisample GLEW_GET_VAR(__GLEW_ARB_texture_storage_multisample) #endif /* GL_ARB_texture_storage_multisample */ /* ------------------------- GL_ARB_texture_swizzle ------------------------ */ #ifndef GL_ARB_texture_swizzle #define GL_ARB_texture_swizzle 1 #define GL_TEXTURE_SWIZZLE_R 0x8E42 #define GL_TEXTURE_SWIZZLE_G 0x8E43 #define GL_TEXTURE_SWIZZLE_B 0x8E44 #define GL_TEXTURE_SWIZZLE_A 0x8E45 #define GL_TEXTURE_SWIZZLE_RGBA 0x8E46 #define GLEW_ARB_texture_swizzle GLEW_GET_VAR(__GLEW_ARB_texture_swizzle) #endif /* GL_ARB_texture_swizzle */ /* -------------------------- GL_ARB_texture_view -------------------------- */ #ifndef GL_ARB_texture_view #define GL_ARB_texture_view 1 #define GL_TEXTURE_VIEW_MIN_LEVEL 0x82DB #define GL_TEXTURE_VIEW_NUM_LEVELS 0x82DC #define GL_TEXTURE_VIEW_MIN_LAYER 0x82DD #define GL_TEXTURE_VIEW_NUM_LAYERS 0x82DE #define GL_TEXTURE_IMMUTABLE_LEVELS 0x82DF typedef void (GLAPIENTRY * PFNGLTEXTUREVIEWPROC) (GLuint texture, GLenum target, GLuint origtexture, GLenum internalformat, GLuint minlevel, GLuint numlevels, GLuint minlayer, GLuint numlayers); #define glTextureView GLEW_GET_FUN(__glewTextureView) #define GLEW_ARB_texture_view GLEW_GET_VAR(__GLEW_ARB_texture_view) #endif /* GL_ARB_texture_view */ /* --------------------------- GL_ARB_timer_query -------------------------- */ #ifndef GL_ARB_timer_query #define GL_ARB_timer_query 1 #define GL_TIME_ELAPSED 0x88BF #define GL_TIMESTAMP 0x8E28 typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTI64VPROC) (GLuint id, GLenum pname, GLint64* params); typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTUI64VPROC) (GLuint id, GLenum pname, GLuint64* params); typedef void (GLAPIENTRY * PFNGLQUERYCOUNTERPROC) (GLuint id, GLenum target); #define glGetQueryObjecti64v GLEW_GET_FUN(__glewGetQueryObjecti64v) #define glGetQueryObjectui64v GLEW_GET_FUN(__glewGetQueryObjectui64v) #define glQueryCounter GLEW_GET_FUN(__glewQueryCounter) #define GLEW_ARB_timer_query GLEW_GET_VAR(__GLEW_ARB_timer_query) #endif /* GL_ARB_timer_query */ /* ----------------------- GL_ARB_transform_feedback2 ---------------------- */ #ifndef GL_ARB_transform_feedback2 #define GL_ARB_transform_feedback2 1 #define GL_TRANSFORM_FEEDBACK 0x8E22 #define GL_TRANSFORM_FEEDBACK_BUFFER_PAUSED 0x8E23 #define GL_TRANSFORM_FEEDBACK_BUFFER_ACTIVE 0x8E24 #define GL_TRANSFORM_FEEDBACK_BINDING 0x8E25 typedef void (GLAPIENTRY * PFNGLBINDTRANSFORMFEEDBACKPROC) (GLenum target, GLuint id); typedef void (GLAPIENTRY * PFNGLDELETETRANSFORMFEEDBACKSPROC) (GLsizei n, const GLuint* ids); typedef void (GLAPIENTRY * PFNGLDRAWTRANSFORMFEEDBACKPROC) (GLenum mode, GLuint id); typedef void (GLAPIENTRY * PFNGLGENTRANSFORMFEEDBACKSPROC) (GLsizei n, GLuint* ids); typedef GLboolean (GLAPIENTRY * PFNGLISTRANSFORMFEEDBACKPROC) (GLuint id); typedef void (GLAPIENTRY * PFNGLPAUSETRANSFORMFEEDBACKPROC) (void); typedef void (GLAPIENTRY * PFNGLRESUMETRANSFORMFEEDBACKPROC) (void); #define glBindTransformFeedback GLEW_GET_FUN(__glewBindTransformFeedback) #define glDeleteTransformFeedbacks GLEW_GET_FUN(__glewDeleteTransformFeedbacks) #define glDrawTransformFeedback GLEW_GET_FUN(__glewDrawTransformFeedback) #define glGenTransformFeedbacks GLEW_GET_FUN(__glewGenTransformFeedbacks) #define glIsTransformFeedback GLEW_GET_FUN(__glewIsTransformFeedback) #define glPauseTransformFeedback GLEW_GET_FUN(__glewPauseTransformFeedback) #define glResumeTransformFeedback GLEW_GET_FUN(__glewResumeTransformFeedback) #define GLEW_ARB_transform_feedback2 GLEW_GET_VAR(__GLEW_ARB_transform_feedback2) #endif /* GL_ARB_transform_feedback2 */ /* ----------------------- GL_ARB_transform_feedback3 ---------------------- */ #ifndef GL_ARB_transform_feedback3 #define GL_ARB_transform_feedback3 1 #define GL_MAX_TRANSFORM_FEEDBACK_BUFFERS 0x8E70 #define GL_MAX_VERTEX_STREAMS 0x8E71 typedef void (GLAPIENTRY * PFNGLBEGINQUERYINDEXEDPROC) (GLenum target, GLuint index, GLuint id); typedef void (GLAPIENTRY * PFNGLDRAWTRANSFORMFEEDBACKSTREAMPROC) (GLenum mode, GLuint id, GLuint stream); typedef void (GLAPIENTRY * PFNGLENDQUERYINDEXEDPROC) (GLenum target, GLuint index); typedef void (GLAPIENTRY * PFNGLGETQUERYINDEXEDIVPROC) (GLenum target, GLuint index, GLenum pname, GLint* params); #define glBeginQueryIndexed GLEW_GET_FUN(__glewBeginQueryIndexed) #define glDrawTransformFeedbackStream GLEW_GET_FUN(__glewDrawTransformFeedbackStream) #define glEndQueryIndexed GLEW_GET_FUN(__glewEndQueryIndexed) #define glGetQueryIndexediv GLEW_GET_FUN(__glewGetQueryIndexediv) #define GLEW_ARB_transform_feedback3 GLEW_GET_VAR(__GLEW_ARB_transform_feedback3) #endif /* GL_ARB_transform_feedback3 */ /* ------------------ GL_ARB_transform_feedback_instanced ------------------ */ #ifndef GL_ARB_transform_feedback_instanced #define GL_ARB_transform_feedback_instanced 1 typedef void (GLAPIENTRY * PFNGLDRAWTRANSFORMFEEDBACKINSTANCEDPROC) (GLenum mode, GLuint id, GLsizei primcount); typedef void (GLAPIENTRY * PFNGLDRAWTRANSFORMFEEDBACKSTREAMINSTANCEDPROC) (GLenum mode, GLuint id, GLuint stream, GLsizei primcount); #define glDrawTransformFeedbackInstanced GLEW_GET_FUN(__glewDrawTransformFeedbackInstanced) #define glDrawTransformFeedbackStreamInstanced GLEW_GET_FUN(__glewDrawTransformFeedbackStreamInstanced) #define GLEW_ARB_transform_feedback_instanced GLEW_GET_VAR(__GLEW_ARB_transform_feedback_instanced) #endif /* GL_ARB_transform_feedback_instanced */ /* ------------------------ GL_ARB_transpose_matrix ------------------------ */ #ifndef GL_ARB_transpose_matrix #define GL_ARB_transpose_matrix 1 #define GL_TRANSPOSE_MODELVIEW_MATRIX_ARB 0x84E3 #define GL_TRANSPOSE_PROJECTION_MATRIX_ARB 0x84E4 #define GL_TRANSPOSE_TEXTURE_MATRIX_ARB 0x84E5 #define GL_TRANSPOSE_COLOR_MATRIX_ARB 0x84E6 typedef void (GLAPIENTRY * PFNGLLOADTRANSPOSEMATRIXDARBPROC) (GLdouble m[16]); typedef void (GLAPIENTRY * PFNGLLOADTRANSPOSEMATRIXFARBPROC) (GLfloat m[16]); typedef void (GLAPIENTRY * PFNGLMULTTRANSPOSEMATRIXDARBPROC) (GLdouble m[16]); typedef void (GLAPIENTRY * PFNGLMULTTRANSPOSEMATRIXFARBPROC) (GLfloat m[16]); #define glLoadTransposeMatrixdARB GLEW_GET_FUN(__glewLoadTransposeMatrixdARB) #define glLoadTransposeMatrixfARB GLEW_GET_FUN(__glewLoadTransposeMatrixfARB) #define glMultTransposeMatrixdARB GLEW_GET_FUN(__glewMultTransposeMatrixdARB) #define glMultTransposeMatrixfARB GLEW_GET_FUN(__glewMultTransposeMatrixfARB) #define GLEW_ARB_transpose_matrix GLEW_GET_VAR(__GLEW_ARB_transpose_matrix) #endif /* GL_ARB_transpose_matrix */ /* ---------------------- GL_ARB_uniform_buffer_object --------------------- */ #ifndef GL_ARB_uniform_buffer_object #define GL_ARB_uniform_buffer_object 1 #define GL_UNIFORM_BUFFER 0x8A11 #define GL_UNIFORM_BUFFER_BINDING 0x8A28 #define GL_UNIFORM_BUFFER_START 0x8A29 #define GL_UNIFORM_BUFFER_SIZE 0x8A2A #define GL_MAX_VERTEX_UNIFORM_BLOCKS 0x8A2B #define GL_MAX_GEOMETRY_UNIFORM_BLOCKS 0x8A2C #define GL_MAX_FRAGMENT_UNIFORM_BLOCKS 0x8A2D #define GL_MAX_COMBINED_UNIFORM_BLOCKS 0x8A2E #define GL_MAX_UNIFORM_BUFFER_BINDINGS 0x8A2F #define GL_MAX_UNIFORM_BLOCK_SIZE 0x8A30 #define GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS 0x8A31 #define GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS 0x8A32 #define GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS 0x8A33 #define GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT 0x8A34 #define GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH 0x8A35 #define GL_ACTIVE_UNIFORM_BLOCKS 0x8A36 #define GL_UNIFORM_TYPE 0x8A37 #define GL_UNIFORM_SIZE 0x8A38 #define GL_UNIFORM_NAME_LENGTH 0x8A39 #define GL_UNIFORM_BLOCK_INDEX 0x8A3A #define GL_UNIFORM_OFFSET 0x8A3B #define GL_UNIFORM_ARRAY_STRIDE 0x8A3C #define GL_UNIFORM_MATRIX_STRIDE 0x8A3D #define GL_UNIFORM_IS_ROW_MAJOR 0x8A3E #define GL_UNIFORM_BLOCK_BINDING 0x8A3F #define GL_UNIFORM_BLOCK_DATA_SIZE 0x8A40 #define GL_UNIFORM_BLOCK_NAME_LENGTH 0x8A41 #define GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS 0x8A42 #define GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES 0x8A43 #define GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER 0x8A44 #define GL_UNIFORM_BLOCK_REFERENCED_BY_GEOMETRY_SHADER 0x8A45 #define GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER 0x8A46 #define GL_INVALID_INDEX 0xFFFFFFFF typedef void (GLAPIENTRY * PFNGLBINDBUFFERBASEPROC) (GLenum target, GLuint index, GLuint buffer); typedef void (GLAPIENTRY * PFNGLBINDBUFFERRANGEPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); typedef void (GLAPIENTRY * PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC) (GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei* length, GLchar* uniformBlockName); typedef void (GLAPIENTRY * PFNGLGETACTIVEUNIFORMBLOCKIVPROC) (GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLGETACTIVEUNIFORMNAMEPROC) (GLuint program, GLuint uniformIndex, GLsizei bufSize, GLsizei* length, GLchar* uniformName); typedef void (GLAPIENTRY * PFNGLGETACTIVEUNIFORMSIVPROC) (GLuint program, GLsizei uniformCount, const GLuint* uniformIndices, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLGETINTEGERI_VPROC) (GLenum target, GLuint index, GLint* data); typedef GLuint (GLAPIENTRY * PFNGLGETUNIFORMBLOCKINDEXPROC) (GLuint program, const GLchar* uniformBlockName); typedef void (GLAPIENTRY * PFNGLGETUNIFORMINDICESPROC) (GLuint program, GLsizei uniformCount, const GLchar** uniformNames, GLuint* uniformIndices); typedef void (GLAPIENTRY * PFNGLUNIFORMBLOCKBINDINGPROC) (GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding); #define glBindBufferBase GLEW_GET_FUN(__glewBindBufferBase) #define glBindBufferRange GLEW_GET_FUN(__glewBindBufferRange) #define glGetActiveUniformBlockName GLEW_GET_FUN(__glewGetActiveUniformBlockName) #define glGetActiveUniformBlockiv GLEW_GET_FUN(__glewGetActiveUniformBlockiv) #define glGetActiveUniformName GLEW_GET_FUN(__glewGetActiveUniformName) #define glGetActiveUniformsiv GLEW_GET_FUN(__glewGetActiveUniformsiv) #define glGetIntegeri_v GLEW_GET_FUN(__glewGetIntegeri_v) #define glGetUniformBlockIndex GLEW_GET_FUN(__glewGetUniformBlockIndex) #define glGetUniformIndices GLEW_GET_FUN(__glewGetUniformIndices) #define glUniformBlockBinding GLEW_GET_FUN(__glewUniformBlockBinding) #define GLEW_ARB_uniform_buffer_object GLEW_GET_VAR(__GLEW_ARB_uniform_buffer_object) #endif /* GL_ARB_uniform_buffer_object */ /* ------------------------ GL_ARB_vertex_array_bgra ----------------------- */ #ifndef GL_ARB_vertex_array_bgra #define GL_ARB_vertex_array_bgra 1 #define GL_BGRA 0x80E1 #define GLEW_ARB_vertex_array_bgra GLEW_GET_VAR(__GLEW_ARB_vertex_array_bgra) #endif /* GL_ARB_vertex_array_bgra */ /* ----------------------- GL_ARB_vertex_array_object ---------------------- */ #ifndef GL_ARB_vertex_array_object #define GL_ARB_vertex_array_object 1 #define GL_VERTEX_ARRAY_BINDING 0x85B5 typedef void (GLAPIENTRY * PFNGLBINDVERTEXARRAYPROC) (GLuint array); typedef void (GLAPIENTRY * PFNGLDELETEVERTEXARRAYSPROC) (GLsizei n, const GLuint* arrays); typedef void (GLAPIENTRY * PFNGLGENVERTEXARRAYSPROC) (GLsizei n, GLuint* arrays); typedef GLboolean (GLAPIENTRY * PFNGLISVERTEXARRAYPROC) (GLuint array); #define glBindVertexArray GLEW_GET_FUN(__glewBindVertexArray) #define glDeleteVertexArrays GLEW_GET_FUN(__glewDeleteVertexArrays) #define glGenVertexArrays GLEW_GET_FUN(__glewGenVertexArrays) #define glIsVertexArray GLEW_GET_FUN(__glewIsVertexArray) #define GLEW_ARB_vertex_array_object GLEW_GET_VAR(__GLEW_ARB_vertex_array_object) #endif /* GL_ARB_vertex_array_object */ /* ----------------------- GL_ARB_vertex_attrib_64bit ---------------------- */ #ifndef GL_ARB_vertex_attrib_64bit #define GL_ARB_vertex_attrib_64bit 1 #define GL_DOUBLE_MAT2 0x8F46 #define GL_DOUBLE_MAT3 0x8F47 #define GL_DOUBLE_MAT4 0x8F48 #define GL_DOUBLE_VEC2 0x8FFC #define GL_DOUBLE_VEC3 0x8FFD #define GL_DOUBLE_VEC4 0x8FFE typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBLDVPROC) (GLuint index, GLenum pname, GLdouble* params); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL1DPROC) (GLuint index, GLdouble x); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL1DVPROC) (GLuint index, const GLdouble* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL2DPROC) (GLuint index, GLdouble x, GLdouble y); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL2DVPROC) (GLuint index, const GLdouble* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL3DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL3DVPROC) (GLuint index, const GLdouble* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL4DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL4DVPROC) (GLuint index, const GLdouble* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBLPOINTERPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const void* pointer); #define glGetVertexAttribLdv GLEW_GET_FUN(__glewGetVertexAttribLdv) #define glVertexAttribL1d GLEW_GET_FUN(__glewVertexAttribL1d) #define glVertexAttribL1dv GLEW_GET_FUN(__glewVertexAttribL1dv) #define glVertexAttribL2d GLEW_GET_FUN(__glewVertexAttribL2d) #define glVertexAttribL2dv GLEW_GET_FUN(__glewVertexAttribL2dv) #define glVertexAttribL3d GLEW_GET_FUN(__glewVertexAttribL3d) #define glVertexAttribL3dv GLEW_GET_FUN(__glewVertexAttribL3dv) #define glVertexAttribL4d GLEW_GET_FUN(__glewVertexAttribL4d) #define glVertexAttribL4dv GLEW_GET_FUN(__glewVertexAttribL4dv) #define glVertexAttribLPointer GLEW_GET_FUN(__glewVertexAttribLPointer) #define GLEW_ARB_vertex_attrib_64bit GLEW_GET_VAR(__GLEW_ARB_vertex_attrib_64bit) #endif /* GL_ARB_vertex_attrib_64bit */ /* ---------------------- GL_ARB_vertex_attrib_binding --------------------- */ #ifndef GL_ARB_vertex_attrib_binding #define GL_ARB_vertex_attrib_binding 1 #define GL_VERTEX_ATTRIB_BINDING 0x82D4 #define GL_VERTEX_ATTRIB_RELATIVE_OFFSET 0x82D5 #define GL_VERTEX_BINDING_DIVISOR 0x82D6 #define GL_VERTEX_BINDING_OFFSET 0x82D7 #define GL_VERTEX_BINDING_STRIDE 0x82D8 #define GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET 0x82D9 #define GL_MAX_VERTEX_ATTRIB_BINDINGS 0x82DA typedef void (GLAPIENTRY * PFNGLBINDVERTEXBUFFERPROC) (GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBBINDINGPROC) (GLuint attribindex, GLuint bindingindex); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBFORMATPROC) (GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBIFORMATPROC) (GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBLFORMATPROC) (GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); typedef void (GLAPIENTRY * PFNGLVERTEXBINDINGDIVISORPROC) (GLuint bindingindex, GLuint divisor); #define glBindVertexBuffer GLEW_GET_FUN(__glewBindVertexBuffer) #define glVertexAttribBinding GLEW_GET_FUN(__glewVertexAttribBinding) #define glVertexAttribFormat GLEW_GET_FUN(__glewVertexAttribFormat) #define glVertexAttribIFormat GLEW_GET_FUN(__glewVertexAttribIFormat) #define glVertexAttribLFormat GLEW_GET_FUN(__glewVertexAttribLFormat) #define glVertexBindingDivisor GLEW_GET_FUN(__glewVertexBindingDivisor) #define GLEW_ARB_vertex_attrib_binding GLEW_GET_VAR(__GLEW_ARB_vertex_attrib_binding) #endif /* GL_ARB_vertex_attrib_binding */ /* -------------------------- GL_ARB_vertex_blend -------------------------- */ #ifndef GL_ARB_vertex_blend #define GL_ARB_vertex_blend 1 #define GL_MODELVIEW0_ARB 0x1700 #define GL_MODELVIEW1_ARB 0x850A #define GL_MAX_VERTEX_UNITS_ARB 0x86A4 #define GL_ACTIVE_VERTEX_UNITS_ARB 0x86A5 #define GL_WEIGHT_SUM_UNITY_ARB 0x86A6 #define GL_VERTEX_BLEND_ARB 0x86A7 #define GL_CURRENT_WEIGHT_ARB 0x86A8 #define GL_WEIGHT_ARRAY_TYPE_ARB 0x86A9 #define GL_WEIGHT_ARRAY_STRIDE_ARB 0x86AA #define GL_WEIGHT_ARRAY_SIZE_ARB 0x86AB #define GL_WEIGHT_ARRAY_POINTER_ARB 0x86AC #define GL_WEIGHT_ARRAY_ARB 0x86AD #define GL_MODELVIEW2_ARB 0x8722 #define GL_MODELVIEW3_ARB 0x8723 #define GL_MODELVIEW4_ARB 0x8724 #define GL_MODELVIEW5_ARB 0x8725 #define GL_MODELVIEW6_ARB 0x8726 #define GL_MODELVIEW7_ARB 0x8727 #define GL_MODELVIEW8_ARB 0x8728 #define GL_MODELVIEW9_ARB 0x8729 #define GL_MODELVIEW10_ARB 0x872A #define GL_MODELVIEW11_ARB 0x872B #define GL_MODELVIEW12_ARB 0x872C #define GL_MODELVIEW13_ARB 0x872D #define GL_MODELVIEW14_ARB 0x872E #define GL_MODELVIEW15_ARB 0x872F #define GL_MODELVIEW16_ARB 0x8730 #define GL_MODELVIEW17_ARB 0x8731 #define GL_MODELVIEW18_ARB 0x8732 #define GL_MODELVIEW19_ARB 0x8733 #define GL_MODELVIEW20_ARB 0x8734 #define GL_MODELVIEW21_ARB 0x8735 #define GL_MODELVIEW22_ARB 0x8736 #define GL_MODELVIEW23_ARB 0x8737 #define GL_MODELVIEW24_ARB 0x8738 #define GL_MODELVIEW25_ARB 0x8739 #define GL_MODELVIEW26_ARB 0x873A #define GL_MODELVIEW27_ARB 0x873B #define GL_MODELVIEW28_ARB 0x873C #define GL_MODELVIEW29_ARB 0x873D #define GL_MODELVIEW30_ARB 0x873E #define GL_MODELVIEW31_ARB 0x873F typedef void (GLAPIENTRY * PFNGLVERTEXBLENDARBPROC) (GLint count); typedef void (GLAPIENTRY * PFNGLWEIGHTPOINTERARBPROC) (GLint size, GLenum type, GLsizei stride, GLvoid *pointer); typedef void (GLAPIENTRY * PFNGLWEIGHTBVARBPROC) (GLint size, GLbyte *weights); typedef void (GLAPIENTRY * PFNGLWEIGHTDVARBPROC) (GLint size, GLdouble *weights); typedef void (GLAPIENTRY * PFNGLWEIGHTFVARBPROC) (GLint size, GLfloat *weights); typedef void (GLAPIENTRY * PFNGLWEIGHTIVARBPROC) (GLint size, GLint *weights); typedef void (GLAPIENTRY * PFNGLWEIGHTSVARBPROC) (GLint size, GLshort *weights); typedef void (GLAPIENTRY * PFNGLWEIGHTUBVARBPROC) (GLint size, GLubyte *weights); typedef void (GLAPIENTRY * PFNGLWEIGHTUIVARBPROC) (GLint size, GLuint *weights); typedef void (GLAPIENTRY * PFNGLWEIGHTUSVARBPROC) (GLint size, GLushort *weights); #define glVertexBlendARB GLEW_GET_FUN(__glewVertexBlendARB) #define glWeightPointerARB GLEW_GET_FUN(__glewWeightPointerARB) #define glWeightbvARB GLEW_GET_FUN(__glewWeightbvARB) #define glWeightdvARB GLEW_GET_FUN(__glewWeightdvARB) #define glWeightfvARB GLEW_GET_FUN(__glewWeightfvARB) #define glWeightivARB GLEW_GET_FUN(__glewWeightivARB) #define glWeightsvARB GLEW_GET_FUN(__glewWeightsvARB) #define glWeightubvARB GLEW_GET_FUN(__glewWeightubvARB) #define glWeightuivARB GLEW_GET_FUN(__glewWeightuivARB) #define glWeightusvARB GLEW_GET_FUN(__glewWeightusvARB) #define GLEW_ARB_vertex_blend GLEW_GET_VAR(__GLEW_ARB_vertex_blend) #endif /* GL_ARB_vertex_blend */ /* ---------------------- GL_ARB_vertex_buffer_object ---------------------- */ #ifndef GL_ARB_vertex_buffer_object #define GL_ARB_vertex_buffer_object 1 #define GL_BUFFER_SIZE_ARB 0x8764 #define GL_BUFFER_USAGE_ARB 0x8765 #define GL_ARRAY_BUFFER_ARB 0x8892 #define GL_ELEMENT_ARRAY_BUFFER_ARB 0x8893 #define GL_ARRAY_BUFFER_BINDING_ARB 0x8894 #define GL_ELEMENT_ARRAY_BUFFER_BINDING_ARB 0x8895 #define GL_VERTEX_ARRAY_BUFFER_BINDING_ARB 0x8896 #define GL_NORMAL_ARRAY_BUFFER_BINDING_ARB 0x8897 #define GL_COLOR_ARRAY_BUFFER_BINDING_ARB 0x8898 #define GL_INDEX_ARRAY_BUFFER_BINDING_ARB 0x8899 #define GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING_ARB 0x889A #define GL_EDGE_FLAG_ARRAY_BUFFER_BINDING_ARB 0x889B #define GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING_ARB 0x889C #define GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING_ARB 0x889D #define GL_WEIGHT_ARRAY_BUFFER_BINDING_ARB 0x889E #define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING_ARB 0x889F #define GL_READ_ONLY_ARB 0x88B8 #define GL_WRITE_ONLY_ARB 0x88B9 #define GL_READ_WRITE_ARB 0x88BA #define GL_BUFFER_ACCESS_ARB 0x88BB #define GL_BUFFER_MAPPED_ARB 0x88BC #define GL_BUFFER_MAP_POINTER_ARB 0x88BD #define GL_STREAM_DRAW_ARB 0x88E0 #define GL_STREAM_READ_ARB 0x88E1 #define GL_STREAM_COPY_ARB 0x88E2 #define GL_STATIC_DRAW_ARB 0x88E4 #define GL_STATIC_READ_ARB 0x88E5 #define GL_STATIC_COPY_ARB 0x88E6 #define GL_DYNAMIC_DRAW_ARB 0x88E8 #define GL_DYNAMIC_READ_ARB 0x88E9 #define GL_DYNAMIC_COPY_ARB 0x88EA typedef ptrdiff_t GLintptrARB; typedef ptrdiff_t GLsizeiptrARB; typedef void (GLAPIENTRY * PFNGLBINDBUFFERARBPROC) (GLenum target, GLuint buffer); typedef void (GLAPIENTRY * PFNGLBUFFERDATAARBPROC) (GLenum target, GLsizeiptrARB size, const GLvoid* data, GLenum usage); typedef void (GLAPIENTRY * PFNGLBUFFERSUBDATAARBPROC) (GLenum target, GLintptrARB offset, GLsizeiptrARB size, const GLvoid* data); typedef void (GLAPIENTRY * PFNGLDELETEBUFFERSARBPROC) (GLsizei n, const GLuint* buffers); typedef void (GLAPIENTRY * PFNGLGENBUFFERSARBPROC) (GLsizei n, GLuint* buffers); typedef void (GLAPIENTRY * PFNGLGETBUFFERPARAMETERIVARBPROC) (GLenum target, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLGETBUFFERPOINTERVARBPROC) (GLenum target, GLenum pname, GLvoid** params); typedef void (GLAPIENTRY * PFNGLGETBUFFERSUBDATAARBPROC) (GLenum target, GLintptrARB offset, GLsizeiptrARB size, GLvoid* data); typedef GLboolean (GLAPIENTRY * PFNGLISBUFFERARBPROC) (GLuint buffer); typedef GLvoid * (GLAPIENTRY * PFNGLMAPBUFFERARBPROC) (GLenum target, GLenum access); typedef GLboolean (GLAPIENTRY * PFNGLUNMAPBUFFERARBPROC) (GLenum target); #define glBindBufferARB GLEW_GET_FUN(__glewBindBufferARB) #define glBufferDataARB GLEW_GET_FUN(__glewBufferDataARB) #define glBufferSubDataARB GLEW_GET_FUN(__glewBufferSubDataARB) #define glDeleteBuffersARB GLEW_GET_FUN(__glewDeleteBuffersARB) #define glGenBuffersARB GLEW_GET_FUN(__glewGenBuffersARB) #define glGetBufferParameterivARB GLEW_GET_FUN(__glewGetBufferParameterivARB) #define glGetBufferPointervARB GLEW_GET_FUN(__glewGetBufferPointervARB) #define glGetBufferSubDataARB GLEW_GET_FUN(__glewGetBufferSubDataARB) #define glIsBufferARB GLEW_GET_FUN(__glewIsBufferARB) #define glMapBufferARB GLEW_GET_FUN(__glewMapBufferARB) #define glUnmapBufferARB GLEW_GET_FUN(__glewUnmapBufferARB) #define GLEW_ARB_vertex_buffer_object GLEW_GET_VAR(__GLEW_ARB_vertex_buffer_object) #endif /* GL_ARB_vertex_buffer_object */ /* ------------------------- GL_ARB_vertex_program ------------------------- */ #ifndef GL_ARB_vertex_program #define GL_ARB_vertex_program 1 #define GL_COLOR_SUM_ARB 0x8458 #define GL_VERTEX_PROGRAM_ARB 0x8620 #define GL_VERTEX_ATTRIB_ARRAY_ENABLED_ARB 0x8622 #define GL_VERTEX_ATTRIB_ARRAY_SIZE_ARB 0x8623 #define GL_VERTEX_ATTRIB_ARRAY_STRIDE_ARB 0x8624 #define GL_VERTEX_ATTRIB_ARRAY_TYPE_ARB 0x8625 #define GL_CURRENT_VERTEX_ATTRIB_ARB 0x8626 #define GL_PROGRAM_LENGTH_ARB 0x8627 #define GL_PROGRAM_STRING_ARB 0x8628 #define GL_MAX_PROGRAM_MATRIX_STACK_DEPTH_ARB 0x862E #define GL_MAX_PROGRAM_MATRICES_ARB 0x862F #define GL_CURRENT_MATRIX_STACK_DEPTH_ARB 0x8640 #define GL_CURRENT_MATRIX_ARB 0x8641 #define GL_VERTEX_PROGRAM_POINT_SIZE_ARB 0x8642 #define GL_VERTEX_PROGRAM_TWO_SIDE_ARB 0x8643 #define GL_VERTEX_ATTRIB_ARRAY_POINTER_ARB 0x8645 #define GL_PROGRAM_ERROR_POSITION_ARB 0x864B #define GL_PROGRAM_BINDING_ARB 0x8677 #define GL_MAX_VERTEX_ATTRIBS_ARB 0x8869 #define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED_ARB 0x886A #define GL_PROGRAM_ERROR_STRING_ARB 0x8874 #define GL_PROGRAM_FORMAT_ASCII_ARB 0x8875 #define GL_PROGRAM_FORMAT_ARB 0x8876 #define GL_PROGRAM_INSTRUCTIONS_ARB 0x88A0 #define GL_MAX_PROGRAM_INSTRUCTIONS_ARB 0x88A1 #define GL_PROGRAM_NATIVE_INSTRUCTIONS_ARB 0x88A2 #define GL_MAX_PROGRAM_NATIVE_INSTRUCTIONS_ARB 0x88A3 #define GL_PROGRAM_TEMPORARIES_ARB 0x88A4 #define GL_MAX_PROGRAM_TEMPORARIES_ARB 0x88A5 #define GL_PROGRAM_NATIVE_TEMPORARIES_ARB 0x88A6 #define GL_MAX_PROGRAM_NATIVE_TEMPORARIES_ARB 0x88A7 #define GL_PROGRAM_PARAMETERS_ARB 0x88A8 #define GL_MAX_PROGRAM_PARAMETERS_ARB 0x88A9 #define GL_PROGRAM_NATIVE_PARAMETERS_ARB 0x88AA #define GL_MAX_PROGRAM_NATIVE_PARAMETERS_ARB 0x88AB #define GL_PROGRAM_ATTRIBS_ARB 0x88AC #define GL_MAX_PROGRAM_ATTRIBS_ARB 0x88AD #define GL_PROGRAM_NATIVE_ATTRIBS_ARB 0x88AE #define GL_MAX_PROGRAM_NATIVE_ATTRIBS_ARB 0x88AF #define GL_PROGRAM_ADDRESS_REGISTERS_ARB 0x88B0 #define GL_MAX_PROGRAM_ADDRESS_REGISTERS_ARB 0x88B1 #define GL_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB 0x88B2 #define GL_MAX_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB 0x88B3 #define GL_MAX_PROGRAM_LOCAL_PARAMETERS_ARB 0x88B4 #define GL_MAX_PROGRAM_ENV_PARAMETERS_ARB 0x88B5 #define GL_PROGRAM_UNDER_NATIVE_LIMITS_ARB 0x88B6 #define GL_TRANSPOSE_CURRENT_MATRIX_ARB 0x88B7 #define GL_MATRIX0_ARB 0x88C0 #define GL_MATRIX1_ARB 0x88C1 #define GL_MATRIX2_ARB 0x88C2 #define GL_MATRIX3_ARB 0x88C3 #define GL_MATRIX4_ARB 0x88C4 #define GL_MATRIX5_ARB 0x88C5 #define GL_MATRIX6_ARB 0x88C6 #define GL_MATRIX7_ARB 0x88C7 #define GL_MATRIX8_ARB 0x88C8 #define GL_MATRIX9_ARB 0x88C9 #define GL_MATRIX10_ARB 0x88CA #define GL_MATRIX11_ARB 0x88CB #define GL_MATRIX12_ARB 0x88CC #define GL_MATRIX13_ARB 0x88CD #define GL_MATRIX14_ARB 0x88CE #define GL_MATRIX15_ARB 0x88CF #define GL_MATRIX16_ARB 0x88D0 #define GL_MATRIX17_ARB 0x88D1 #define GL_MATRIX18_ARB 0x88D2 #define GL_MATRIX19_ARB 0x88D3 #define GL_MATRIX20_ARB 0x88D4 #define GL_MATRIX21_ARB 0x88D5 #define GL_MATRIX22_ARB 0x88D6 #define GL_MATRIX23_ARB 0x88D7 #define GL_MATRIX24_ARB 0x88D8 #define GL_MATRIX25_ARB 0x88D9 #define GL_MATRIX26_ARB 0x88DA #define GL_MATRIX27_ARB 0x88DB #define GL_MATRIX28_ARB 0x88DC #define GL_MATRIX29_ARB 0x88DD #define GL_MATRIX30_ARB 0x88DE #define GL_MATRIX31_ARB 0x88DF typedef void (GLAPIENTRY * PFNGLBINDPROGRAMARBPROC) (GLenum target, GLuint program); typedef void (GLAPIENTRY * PFNGLDELETEPROGRAMSARBPROC) (GLsizei n, const GLuint* programs); typedef void (GLAPIENTRY * PFNGLDISABLEVERTEXATTRIBARRAYARBPROC) (GLuint index); typedef void (GLAPIENTRY * PFNGLENABLEVERTEXATTRIBARRAYARBPROC) (GLuint index); typedef void (GLAPIENTRY * PFNGLGENPROGRAMSARBPROC) (GLsizei n, GLuint* programs); typedef void (GLAPIENTRY * PFNGLGETPROGRAMENVPARAMETERDVARBPROC) (GLenum target, GLuint index, GLdouble* params); typedef void (GLAPIENTRY * PFNGLGETPROGRAMENVPARAMETERFVARBPROC) (GLenum target, GLuint index, GLfloat* params); typedef void (GLAPIENTRY * PFNGLGETPROGRAMLOCALPARAMETERDVARBPROC) (GLenum target, GLuint index, GLdouble* params); typedef void (GLAPIENTRY * PFNGLGETPROGRAMLOCALPARAMETERFVARBPROC) (GLenum target, GLuint index, GLfloat* params); typedef void (GLAPIENTRY * PFNGLGETPROGRAMSTRINGARBPROC) (GLenum target, GLenum pname, void* string); typedef void (GLAPIENTRY * PFNGLGETPROGRAMIVARBPROC) (GLenum target, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBPOINTERVARBPROC) (GLuint index, GLenum pname, GLvoid** pointer); typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBDVARBPROC) (GLuint index, GLenum pname, GLdouble* params); typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBFVARBPROC) (GLuint index, GLenum pname, GLfloat* params); typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBIVARBPROC) (GLuint index, GLenum pname, GLint* params); typedef GLboolean (GLAPIENTRY * PFNGLISPROGRAMARBPROC) (GLuint program); typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETER4DARBPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETER4DVARBPROC) (GLenum target, GLuint index, const GLdouble* params); typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETER4FARBPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETER4FVARBPROC) (GLenum target, GLuint index, const GLfloat* params); typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETER4DARBPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETER4DVARBPROC) (GLenum target, GLuint index, const GLdouble* params); typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETER4FARBPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETER4FVARBPROC) (GLenum target, GLuint index, const GLfloat* params); typedef void (GLAPIENTRY * PFNGLPROGRAMSTRINGARBPROC) (GLenum target, GLenum format, GLsizei len, const void* string); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1DARBPROC) (GLuint index, GLdouble x); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1DVARBPROC) (GLuint index, const GLdouble* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1FARBPROC) (GLuint index, GLfloat x); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1FVARBPROC) (GLuint index, const GLfloat* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1SARBPROC) (GLuint index, GLshort x); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1SVARBPROC) (GLuint index, const GLshort* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2DARBPROC) (GLuint index, GLdouble x, GLdouble y); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2DVARBPROC) (GLuint index, const GLdouble* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2FARBPROC) (GLuint index, GLfloat x, GLfloat y); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2FVARBPROC) (GLuint index, const GLfloat* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2SARBPROC) (GLuint index, GLshort x, GLshort y); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2SVARBPROC) (GLuint index, const GLshort* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3DARBPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3DVARBPROC) (GLuint index, const GLdouble* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3FARBPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3FVARBPROC) (GLuint index, const GLfloat* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3SARBPROC) (GLuint index, GLshort x, GLshort y, GLshort z); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3SVARBPROC) (GLuint index, const GLshort* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NBVARBPROC) (GLuint index, const GLbyte* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NIVARBPROC) (GLuint index, const GLint* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NSVARBPROC) (GLuint index, const GLshort* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NUBARBPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NUBVARBPROC) (GLuint index, const GLubyte* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NUIVARBPROC) (GLuint index, const GLuint* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NUSVARBPROC) (GLuint index, const GLushort* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4BVARBPROC) (GLuint index, const GLbyte* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4DARBPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4DVARBPROC) (GLuint index, const GLdouble* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4FARBPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4FVARBPROC) (GLuint index, const GLfloat* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4IVARBPROC) (GLuint index, const GLint* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4SARBPROC) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4SVARBPROC) (GLuint index, const GLshort* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4UBVARBPROC) (GLuint index, const GLubyte* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4UIVARBPROC) (GLuint index, const GLuint* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4USVARBPROC) (GLuint index, const GLushort* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBPOINTERARBPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void* pointer); #define glBindProgramARB GLEW_GET_FUN(__glewBindProgramARB) #define glDeleteProgramsARB GLEW_GET_FUN(__glewDeleteProgramsARB) #define glDisableVertexAttribArrayARB GLEW_GET_FUN(__glewDisableVertexAttribArrayARB) #define glEnableVertexAttribArrayARB GLEW_GET_FUN(__glewEnableVertexAttribArrayARB) #define glGenProgramsARB GLEW_GET_FUN(__glewGenProgramsARB) #define glGetProgramEnvParameterdvARB GLEW_GET_FUN(__glewGetProgramEnvParameterdvARB) #define glGetProgramEnvParameterfvARB GLEW_GET_FUN(__glewGetProgramEnvParameterfvARB) #define glGetProgramLocalParameterdvARB GLEW_GET_FUN(__glewGetProgramLocalParameterdvARB) #define glGetProgramLocalParameterfvARB GLEW_GET_FUN(__glewGetProgramLocalParameterfvARB) #define glGetProgramStringARB GLEW_GET_FUN(__glewGetProgramStringARB) #define glGetProgramivARB GLEW_GET_FUN(__glewGetProgramivARB) #define glGetVertexAttribPointervARB GLEW_GET_FUN(__glewGetVertexAttribPointervARB) #define glGetVertexAttribdvARB GLEW_GET_FUN(__glewGetVertexAttribdvARB) #define glGetVertexAttribfvARB GLEW_GET_FUN(__glewGetVertexAttribfvARB) #define glGetVertexAttribivARB GLEW_GET_FUN(__glewGetVertexAttribivARB) #define glIsProgramARB GLEW_GET_FUN(__glewIsProgramARB) #define glProgramEnvParameter4dARB GLEW_GET_FUN(__glewProgramEnvParameter4dARB) #define glProgramEnvParameter4dvARB GLEW_GET_FUN(__glewProgramEnvParameter4dvARB) #define glProgramEnvParameter4fARB GLEW_GET_FUN(__glewProgramEnvParameter4fARB) #define glProgramEnvParameter4fvARB GLEW_GET_FUN(__glewProgramEnvParameter4fvARB) #define glProgramLocalParameter4dARB GLEW_GET_FUN(__glewProgramLocalParameter4dARB) #define glProgramLocalParameter4dvARB GLEW_GET_FUN(__glewProgramLocalParameter4dvARB) #define glProgramLocalParameter4fARB GLEW_GET_FUN(__glewProgramLocalParameter4fARB) #define glProgramLocalParameter4fvARB GLEW_GET_FUN(__glewProgramLocalParameter4fvARB) #define glProgramStringARB GLEW_GET_FUN(__glewProgramStringARB) #define glVertexAttrib1dARB GLEW_GET_FUN(__glewVertexAttrib1dARB) #define glVertexAttrib1dvARB GLEW_GET_FUN(__glewVertexAttrib1dvARB) #define glVertexAttrib1fARB GLEW_GET_FUN(__glewVertexAttrib1fARB) #define glVertexAttrib1fvARB GLEW_GET_FUN(__glewVertexAttrib1fvARB) #define glVertexAttrib1sARB GLEW_GET_FUN(__glewVertexAttrib1sARB) #define glVertexAttrib1svARB GLEW_GET_FUN(__glewVertexAttrib1svARB) #define glVertexAttrib2dARB GLEW_GET_FUN(__glewVertexAttrib2dARB) #define glVertexAttrib2dvARB GLEW_GET_FUN(__glewVertexAttrib2dvARB) #define glVertexAttrib2fARB GLEW_GET_FUN(__glewVertexAttrib2fARB) #define glVertexAttrib2fvARB GLEW_GET_FUN(__glewVertexAttrib2fvARB) #define glVertexAttrib2sARB GLEW_GET_FUN(__glewVertexAttrib2sARB) #define glVertexAttrib2svARB GLEW_GET_FUN(__glewVertexAttrib2svARB) #define glVertexAttrib3dARB GLEW_GET_FUN(__glewVertexAttrib3dARB) #define glVertexAttrib3dvARB GLEW_GET_FUN(__glewVertexAttrib3dvARB) #define glVertexAttrib3fARB GLEW_GET_FUN(__glewVertexAttrib3fARB) #define glVertexAttrib3fvARB GLEW_GET_FUN(__glewVertexAttrib3fvARB) #define glVertexAttrib3sARB GLEW_GET_FUN(__glewVertexAttrib3sARB) #define glVertexAttrib3svARB GLEW_GET_FUN(__glewVertexAttrib3svARB) #define glVertexAttrib4NbvARB GLEW_GET_FUN(__glewVertexAttrib4NbvARB) #define glVertexAttrib4NivARB GLEW_GET_FUN(__glewVertexAttrib4NivARB) #define glVertexAttrib4NsvARB GLEW_GET_FUN(__glewVertexAttrib4NsvARB) #define glVertexAttrib4NubARB GLEW_GET_FUN(__glewVertexAttrib4NubARB) #define glVertexAttrib4NubvARB GLEW_GET_FUN(__glewVertexAttrib4NubvARB) #define glVertexAttrib4NuivARB GLEW_GET_FUN(__glewVertexAttrib4NuivARB) #define glVertexAttrib4NusvARB GLEW_GET_FUN(__glewVertexAttrib4NusvARB) #define glVertexAttrib4bvARB GLEW_GET_FUN(__glewVertexAttrib4bvARB) #define glVertexAttrib4dARB GLEW_GET_FUN(__glewVertexAttrib4dARB) #define glVertexAttrib4dvARB GLEW_GET_FUN(__glewVertexAttrib4dvARB) #define glVertexAttrib4fARB GLEW_GET_FUN(__glewVertexAttrib4fARB) #define glVertexAttrib4fvARB GLEW_GET_FUN(__glewVertexAttrib4fvARB) #define glVertexAttrib4ivARB GLEW_GET_FUN(__glewVertexAttrib4ivARB) #define glVertexAttrib4sARB GLEW_GET_FUN(__glewVertexAttrib4sARB) #define glVertexAttrib4svARB GLEW_GET_FUN(__glewVertexAttrib4svARB) #define glVertexAttrib4ubvARB GLEW_GET_FUN(__glewVertexAttrib4ubvARB) #define glVertexAttrib4uivARB GLEW_GET_FUN(__glewVertexAttrib4uivARB) #define glVertexAttrib4usvARB GLEW_GET_FUN(__glewVertexAttrib4usvARB) #define glVertexAttribPointerARB GLEW_GET_FUN(__glewVertexAttribPointerARB) #define GLEW_ARB_vertex_program GLEW_GET_VAR(__GLEW_ARB_vertex_program) #endif /* GL_ARB_vertex_program */ /* -------------------------- GL_ARB_vertex_shader ------------------------- */ #ifndef GL_ARB_vertex_shader #define GL_ARB_vertex_shader 1 #define GL_VERTEX_SHADER_ARB 0x8B31 #define GL_MAX_VERTEX_UNIFORM_COMPONENTS_ARB 0x8B4A #define GL_MAX_VARYING_FLOATS_ARB 0x8B4B #define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS_ARB 0x8B4C #define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS_ARB 0x8B4D #define GL_OBJECT_ACTIVE_ATTRIBUTES_ARB 0x8B89 #define GL_OBJECT_ACTIVE_ATTRIBUTE_MAX_LENGTH_ARB 0x8B8A typedef void (GLAPIENTRY * PFNGLBINDATTRIBLOCATIONARBPROC) (GLhandleARB programObj, GLuint index, const GLcharARB* name); typedef void (GLAPIENTRY * PFNGLGETACTIVEATTRIBARBPROC) (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei* length, GLint *size, GLenum *type, GLcharARB *name); typedef GLint (GLAPIENTRY * PFNGLGETATTRIBLOCATIONARBPROC) (GLhandleARB programObj, const GLcharARB* name); #define glBindAttribLocationARB GLEW_GET_FUN(__glewBindAttribLocationARB) #define glGetActiveAttribARB GLEW_GET_FUN(__glewGetActiveAttribARB) #define glGetAttribLocationARB GLEW_GET_FUN(__glewGetAttribLocationARB) #define GLEW_ARB_vertex_shader GLEW_GET_VAR(__GLEW_ARB_vertex_shader) #endif /* GL_ARB_vertex_shader */ /* ------------------- GL_ARB_vertex_type_2_10_10_10_rev ------------------- */ #ifndef GL_ARB_vertex_type_2_10_10_10_rev #define GL_ARB_vertex_type_2_10_10_10_rev 1 #define GL_UNSIGNED_INT_2_10_10_10_REV 0x8368 #define GL_INT_2_10_10_10_REV 0x8D9F typedef void (GLAPIENTRY * PFNGLCOLORP3UIPROC) (GLenum type, GLuint color); typedef void (GLAPIENTRY * PFNGLCOLORP3UIVPROC) (GLenum type, const GLuint* color); typedef void (GLAPIENTRY * PFNGLCOLORP4UIPROC) (GLenum type, GLuint color); typedef void (GLAPIENTRY * PFNGLCOLORP4UIVPROC) (GLenum type, const GLuint* color); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORDP1UIPROC) (GLenum texture, GLenum type, GLuint coords); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORDP1UIVPROC) (GLenum texture, GLenum type, const GLuint* coords); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORDP2UIPROC) (GLenum texture, GLenum type, GLuint coords); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORDP2UIVPROC) (GLenum texture, GLenum type, const GLuint* coords); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORDP3UIPROC) (GLenum texture, GLenum type, GLuint coords); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORDP3UIVPROC) (GLenum texture, GLenum type, const GLuint* coords); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORDP4UIPROC) (GLenum texture, GLenum type, GLuint coords); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORDP4UIVPROC) (GLenum texture, GLenum type, const GLuint* coords); typedef void (GLAPIENTRY * PFNGLNORMALP3UIPROC) (GLenum type, GLuint coords); typedef void (GLAPIENTRY * PFNGLNORMALP3UIVPROC) (GLenum type, const GLuint* coords); typedef void (GLAPIENTRY * PFNGLSECONDARYCOLORP3UIPROC) (GLenum type, GLuint color); typedef void (GLAPIENTRY * PFNGLSECONDARYCOLORP3UIVPROC) (GLenum type, const GLuint* color); typedef void (GLAPIENTRY * PFNGLTEXCOORDP1UIPROC) (GLenum type, GLuint coords); typedef void (GLAPIENTRY * PFNGLTEXCOORDP1UIVPROC) (GLenum type, const GLuint* coords); typedef void (GLAPIENTRY * PFNGLTEXCOORDP2UIPROC) (GLenum type, GLuint coords); typedef void (GLAPIENTRY * PFNGLTEXCOORDP2UIVPROC) (GLenum type, const GLuint* coords); typedef void (GLAPIENTRY * PFNGLTEXCOORDP3UIPROC) (GLenum type, GLuint coords); typedef void (GLAPIENTRY * PFNGLTEXCOORDP3UIVPROC) (GLenum type, const GLuint* coords); typedef void (GLAPIENTRY * PFNGLTEXCOORDP4UIPROC) (GLenum type, GLuint coords); typedef void (GLAPIENTRY * PFNGLTEXCOORDP4UIVPROC) (GLenum type, const GLuint* coords); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBP1UIPROC) (GLuint index, GLenum type, GLboolean normalized, GLuint value); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBP1UIVPROC) (GLuint index, GLenum type, GLboolean normalized, const GLuint* value); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBP2UIPROC) (GLuint index, GLenum type, GLboolean normalized, GLuint value); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBP2UIVPROC) (GLuint index, GLenum type, GLboolean normalized, const GLuint* value); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBP3UIPROC) (GLuint index, GLenum type, GLboolean normalized, GLuint value); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBP3UIVPROC) (GLuint index, GLenum type, GLboolean normalized, const GLuint* value); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBP4UIPROC) (GLuint index, GLenum type, GLboolean normalized, GLuint value); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBP4UIVPROC) (GLuint index, GLenum type, GLboolean normalized, const GLuint* value); typedef void (GLAPIENTRY * PFNGLVERTEXP2UIPROC) (GLenum type, GLuint value); typedef void (GLAPIENTRY * PFNGLVERTEXP2UIVPROC) (GLenum type, const GLuint* value); typedef void (GLAPIENTRY * PFNGLVERTEXP3UIPROC) (GLenum type, GLuint value); typedef void (GLAPIENTRY * PFNGLVERTEXP3UIVPROC) (GLenum type, const GLuint* value); typedef void (GLAPIENTRY * PFNGLVERTEXP4UIPROC) (GLenum type, GLuint value); typedef void (GLAPIENTRY * PFNGLVERTEXP4UIVPROC) (GLenum type, const GLuint* value); #define glColorP3ui GLEW_GET_FUN(__glewColorP3ui) #define glColorP3uiv GLEW_GET_FUN(__glewColorP3uiv) #define glColorP4ui GLEW_GET_FUN(__glewColorP4ui) #define glColorP4uiv GLEW_GET_FUN(__glewColorP4uiv) #define glMultiTexCoordP1ui GLEW_GET_FUN(__glewMultiTexCoordP1ui) #define glMultiTexCoordP1uiv GLEW_GET_FUN(__glewMultiTexCoordP1uiv) #define glMultiTexCoordP2ui GLEW_GET_FUN(__glewMultiTexCoordP2ui) #define glMultiTexCoordP2uiv GLEW_GET_FUN(__glewMultiTexCoordP2uiv) #define glMultiTexCoordP3ui GLEW_GET_FUN(__glewMultiTexCoordP3ui) #define glMultiTexCoordP3uiv GLEW_GET_FUN(__glewMultiTexCoordP3uiv) #define glMultiTexCoordP4ui GLEW_GET_FUN(__glewMultiTexCoordP4ui) #define glMultiTexCoordP4uiv GLEW_GET_FUN(__glewMultiTexCoordP4uiv) #define glNormalP3ui GLEW_GET_FUN(__glewNormalP3ui) #define glNormalP3uiv GLEW_GET_FUN(__glewNormalP3uiv) #define glSecondaryColorP3ui GLEW_GET_FUN(__glewSecondaryColorP3ui) #define glSecondaryColorP3uiv GLEW_GET_FUN(__glewSecondaryColorP3uiv) #define glTexCoordP1ui GLEW_GET_FUN(__glewTexCoordP1ui) #define glTexCoordP1uiv GLEW_GET_FUN(__glewTexCoordP1uiv) #define glTexCoordP2ui GLEW_GET_FUN(__glewTexCoordP2ui) #define glTexCoordP2uiv GLEW_GET_FUN(__glewTexCoordP2uiv) #define glTexCoordP3ui GLEW_GET_FUN(__glewTexCoordP3ui) #define glTexCoordP3uiv GLEW_GET_FUN(__glewTexCoordP3uiv) #define glTexCoordP4ui GLEW_GET_FUN(__glewTexCoordP4ui) #define glTexCoordP4uiv GLEW_GET_FUN(__glewTexCoordP4uiv) #define glVertexAttribP1ui GLEW_GET_FUN(__glewVertexAttribP1ui) #define glVertexAttribP1uiv GLEW_GET_FUN(__glewVertexAttribP1uiv) #define glVertexAttribP2ui GLEW_GET_FUN(__glewVertexAttribP2ui) #define glVertexAttribP2uiv GLEW_GET_FUN(__glewVertexAttribP2uiv) #define glVertexAttribP3ui GLEW_GET_FUN(__glewVertexAttribP3ui) #define glVertexAttribP3uiv GLEW_GET_FUN(__glewVertexAttribP3uiv) #define glVertexAttribP4ui GLEW_GET_FUN(__glewVertexAttribP4ui) #define glVertexAttribP4uiv GLEW_GET_FUN(__glewVertexAttribP4uiv) #define glVertexP2ui GLEW_GET_FUN(__glewVertexP2ui) #define glVertexP2uiv GLEW_GET_FUN(__glewVertexP2uiv) #define glVertexP3ui GLEW_GET_FUN(__glewVertexP3ui) #define glVertexP3uiv GLEW_GET_FUN(__glewVertexP3uiv) #define glVertexP4ui GLEW_GET_FUN(__glewVertexP4ui) #define glVertexP4uiv GLEW_GET_FUN(__glewVertexP4uiv) #define GLEW_ARB_vertex_type_2_10_10_10_rev GLEW_GET_VAR(__GLEW_ARB_vertex_type_2_10_10_10_rev) #endif /* GL_ARB_vertex_type_2_10_10_10_rev */ /* ------------------------- GL_ARB_viewport_array ------------------------- */ #ifndef GL_ARB_viewport_array #define GL_ARB_viewport_array 1 #define GL_DEPTH_RANGE 0x0B70 #define GL_VIEWPORT 0x0BA2 #define GL_SCISSOR_BOX 0x0C10 #define GL_SCISSOR_TEST 0x0C11 #define GL_MAX_VIEWPORTS 0x825B #define GL_VIEWPORT_SUBPIXEL_BITS 0x825C #define GL_VIEWPORT_BOUNDS_RANGE 0x825D #define GL_LAYER_PROVOKING_VERTEX 0x825E #define GL_VIEWPORT_INDEX_PROVOKING_VERTEX 0x825F #define GL_UNDEFINED_VERTEX 0x8260 #define GL_FIRST_VERTEX_CONVENTION 0x8E4D #define GL_LAST_VERTEX_CONVENTION 0x8E4E #define GL_PROVOKING_VERTEX 0x8E4F typedef void (GLAPIENTRY * PFNGLDEPTHRANGEARRAYVPROC) (GLuint first, GLsizei count, const GLclampd * v); typedef void (GLAPIENTRY * PFNGLDEPTHRANGEINDEXEDPROC) (GLuint index, GLclampd n, GLclampd f); typedef void (GLAPIENTRY * PFNGLGETDOUBLEI_VPROC) (GLenum target, GLuint index, GLdouble* data); typedef void (GLAPIENTRY * PFNGLGETFLOATI_VPROC) (GLenum target, GLuint index, GLfloat* data); typedef void (GLAPIENTRY * PFNGLSCISSORARRAYVPROC) (GLuint first, GLsizei count, const GLint * v); typedef void (GLAPIENTRY * PFNGLSCISSORINDEXEDPROC) (GLuint index, GLint left, GLint bottom, GLsizei width, GLsizei height); typedef void (GLAPIENTRY * PFNGLSCISSORINDEXEDVPROC) (GLuint index, const GLint * v); typedef void (GLAPIENTRY * PFNGLVIEWPORTARRAYVPROC) (GLuint first, GLsizei count, const GLfloat * v); typedef void (GLAPIENTRY * PFNGLVIEWPORTINDEXEDFPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat w, GLfloat h); typedef void (GLAPIENTRY * PFNGLVIEWPORTINDEXEDFVPROC) (GLuint index, const GLfloat * v); #define glDepthRangeArrayv GLEW_GET_FUN(__glewDepthRangeArrayv) #define glDepthRangeIndexed GLEW_GET_FUN(__glewDepthRangeIndexed) #define glGetDoublei_v GLEW_GET_FUN(__glewGetDoublei_v) #define glGetFloati_v GLEW_GET_FUN(__glewGetFloati_v) #define glScissorArrayv GLEW_GET_FUN(__glewScissorArrayv) #define glScissorIndexed GLEW_GET_FUN(__glewScissorIndexed) #define glScissorIndexedv GLEW_GET_FUN(__glewScissorIndexedv) #define glViewportArrayv GLEW_GET_FUN(__glewViewportArrayv) #define glViewportIndexedf GLEW_GET_FUN(__glewViewportIndexedf) #define glViewportIndexedfv GLEW_GET_FUN(__glewViewportIndexedfv) #define GLEW_ARB_viewport_array GLEW_GET_VAR(__GLEW_ARB_viewport_array) #endif /* GL_ARB_viewport_array */ /* --------------------------- GL_ARB_window_pos --------------------------- */ #ifndef GL_ARB_window_pos #define GL_ARB_window_pos 1 typedef void (GLAPIENTRY * PFNGLWINDOWPOS2DARBPROC) (GLdouble x, GLdouble y); typedef void (GLAPIENTRY * PFNGLWINDOWPOS2DVARBPROC) (const GLdouble* p); typedef void (GLAPIENTRY * PFNGLWINDOWPOS2FARBPROC) (GLfloat x, GLfloat y); typedef void (GLAPIENTRY * PFNGLWINDOWPOS2FVARBPROC) (const GLfloat* p); typedef void (GLAPIENTRY * PFNGLWINDOWPOS2IARBPROC) (GLint x, GLint y); typedef void (GLAPIENTRY * PFNGLWINDOWPOS2IVARBPROC) (const GLint* p); typedef void (GLAPIENTRY * PFNGLWINDOWPOS2SARBPROC) (GLshort x, GLshort y); typedef void (GLAPIENTRY * PFNGLWINDOWPOS2SVARBPROC) (const GLshort* p); typedef void (GLAPIENTRY * PFNGLWINDOWPOS3DARBPROC) (GLdouble x, GLdouble y, GLdouble z); typedef void (GLAPIENTRY * PFNGLWINDOWPOS3DVARBPROC) (const GLdouble* p); typedef void (GLAPIENTRY * PFNGLWINDOWPOS3FARBPROC) (GLfloat x, GLfloat y, GLfloat z); typedef void (GLAPIENTRY * PFNGLWINDOWPOS3FVARBPROC) (const GLfloat* p); typedef void (GLAPIENTRY * PFNGLWINDOWPOS3IARBPROC) (GLint x, GLint y, GLint z); typedef void (GLAPIENTRY * PFNGLWINDOWPOS3IVARBPROC) (const GLint* p); typedef void (GLAPIENTRY * PFNGLWINDOWPOS3SARBPROC) (GLshort x, GLshort y, GLshort z); typedef void (GLAPIENTRY * PFNGLWINDOWPOS3SVARBPROC) (const GLshort* p); #define glWindowPos2dARB GLEW_GET_FUN(__glewWindowPos2dARB) #define glWindowPos2dvARB GLEW_GET_FUN(__glewWindowPos2dvARB) #define glWindowPos2fARB GLEW_GET_FUN(__glewWindowPos2fARB) #define glWindowPos2fvARB GLEW_GET_FUN(__glewWindowPos2fvARB) #define glWindowPos2iARB GLEW_GET_FUN(__glewWindowPos2iARB) #define glWindowPos2ivARB GLEW_GET_FUN(__glewWindowPos2ivARB) #define glWindowPos2sARB GLEW_GET_FUN(__glewWindowPos2sARB) #define glWindowPos2svARB GLEW_GET_FUN(__glewWindowPos2svARB) #define glWindowPos3dARB GLEW_GET_FUN(__glewWindowPos3dARB) #define glWindowPos3dvARB GLEW_GET_FUN(__glewWindowPos3dvARB) #define glWindowPos3fARB GLEW_GET_FUN(__glewWindowPos3fARB) #define glWindowPos3fvARB GLEW_GET_FUN(__glewWindowPos3fvARB) #define glWindowPos3iARB GLEW_GET_FUN(__glewWindowPos3iARB) #define glWindowPos3ivARB GLEW_GET_FUN(__glewWindowPos3ivARB) #define glWindowPos3sARB GLEW_GET_FUN(__glewWindowPos3sARB) #define glWindowPos3svARB GLEW_GET_FUN(__glewWindowPos3svARB) #define GLEW_ARB_window_pos GLEW_GET_VAR(__GLEW_ARB_window_pos) #endif /* GL_ARB_window_pos */ /* ------------------------- GL_ATIX_point_sprites ------------------------- */ #ifndef GL_ATIX_point_sprites #define GL_ATIX_point_sprites 1 #define GL_TEXTURE_POINT_MODE_ATIX 0x60B0 #define GL_TEXTURE_POINT_ONE_COORD_ATIX 0x60B1 #define GL_TEXTURE_POINT_SPRITE_ATIX 0x60B2 #define GL_POINT_SPRITE_CULL_MODE_ATIX 0x60B3 #define GL_POINT_SPRITE_CULL_CENTER_ATIX 0x60B4 #define GL_POINT_SPRITE_CULL_CLIP_ATIX 0x60B5 #define GLEW_ATIX_point_sprites GLEW_GET_VAR(__GLEW_ATIX_point_sprites) #endif /* GL_ATIX_point_sprites */ /* ---------------------- GL_ATIX_texture_env_combine3 --------------------- */ #ifndef GL_ATIX_texture_env_combine3 #define GL_ATIX_texture_env_combine3 1 #define GL_MODULATE_ADD_ATIX 0x8744 #define GL_MODULATE_SIGNED_ADD_ATIX 0x8745 #define GL_MODULATE_SUBTRACT_ATIX 0x8746 #define GLEW_ATIX_texture_env_combine3 GLEW_GET_VAR(__GLEW_ATIX_texture_env_combine3) #endif /* GL_ATIX_texture_env_combine3 */ /* ----------------------- GL_ATIX_texture_env_route ----------------------- */ #ifndef GL_ATIX_texture_env_route #define GL_ATIX_texture_env_route 1 #define GL_SECONDARY_COLOR_ATIX 0x8747 #define GL_TEXTURE_OUTPUT_RGB_ATIX 0x8748 #define GL_TEXTURE_OUTPUT_ALPHA_ATIX 0x8749 #define GLEW_ATIX_texture_env_route GLEW_GET_VAR(__GLEW_ATIX_texture_env_route) #endif /* GL_ATIX_texture_env_route */ /* ---------------- GL_ATIX_vertex_shader_output_point_size ---------------- */ #ifndef GL_ATIX_vertex_shader_output_point_size #define GL_ATIX_vertex_shader_output_point_size 1 #define GL_OUTPUT_POINT_SIZE_ATIX 0x610E #define GLEW_ATIX_vertex_shader_output_point_size GLEW_GET_VAR(__GLEW_ATIX_vertex_shader_output_point_size) #endif /* GL_ATIX_vertex_shader_output_point_size */ /* -------------------------- GL_ATI_draw_buffers -------------------------- */ #ifndef GL_ATI_draw_buffers #define GL_ATI_draw_buffers 1 #define GL_MAX_DRAW_BUFFERS_ATI 0x8824 #define GL_DRAW_BUFFER0_ATI 0x8825 #define GL_DRAW_BUFFER1_ATI 0x8826 #define GL_DRAW_BUFFER2_ATI 0x8827 #define GL_DRAW_BUFFER3_ATI 0x8828 #define GL_DRAW_BUFFER4_ATI 0x8829 #define GL_DRAW_BUFFER5_ATI 0x882A #define GL_DRAW_BUFFER6_ATI 0x882B #define GL_DRAW_BUFFER7_ATI 0x882C #define GL_DRAW_BUFFER8_ATI 0x882D #define GL_DRAW_BUFFER9_ATI 0x882E #define GL_DRAW_BUFFER10_ATI 0x882F #define GL_DRAW_BUFFER11_ATI 0x8830 #define GL_DRAW_BUFFER12_ATI 0x8831 #define GL_DRAW_BUFFER13_ATI 0x8832 #define GL_DRAW_BUFFER14_ATI 0x8833 #define GL_DRAW_BUFFER15_ATI 0x8834 typedef void (GLAPIENTRY * PFNGLDRAWBUFFERSATIPROC) (GLsizei n, const GLenum* bufs); #define glDrawBuffersATI GLEW_GET_FUN(__glewDrawBuffersATI) #define GLEW_ATI_draw_buffers GLEW_GET_VAR(__GLEW_ATI_draw_buffers) #endif /* GL_ATI_draw_buffers */ /* -------------------------- GL_ATI_element_array ------------------------- */ #ifndef GL_ATI_element_array #define GL_ATI_element_array 1 #define GL_ELEMENT_ARRAY_ATI 0x8768 #define GL_ELEMENT_ARRAY_TYPE_ATI 0x8769 #define GL_ELEMENT_ARRAY_POINTER_ATI 0x876A typedef void (GLAPIENTRY * PFNGLDRAWELEMENTARRAYATIPROC) (GLenum mode, GLsizei count); typedef void (GLAPIENTRY * PFNGLDRAWRANGEELEMENTARRAYATIPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count); typedef void (GLAPIENTRY * PFNGLELEMENTPOINTERATIPROC) (GLenum type, const void* pointer); #define glDrawElementArrayATI GLEW_GET_FUN(__glewDrawElementArrayATI) #define glDrawRangeElementArrayATI GLEW_GET_FUN(__glewDrawRangeElementArrayATI) #define glElementPointerATI GLEW_GET_FUN(__glewElementPointerATI) #define GLEW_ATI_element_array GLEW_GET_VAR(__GLEW_ATI_element_array) #endif /* GL_ATI_element_array */ /* ------------------------- GL_ATI_envmap_bumpmap ------------------------- */ #ifndef GL_ATI_envmap_bumpmap #define GL_ATI_envmap_bumpmap 1 #define GL_BUMP_ROT_MATRIX_ATI 0x8775 #define GL_BUMP_ROT_MATRIX_SIZE_ATI 0x8776 #define GL_BUMP_NUM_TEX_UNITS_ATI 0x8777 #define GL_BUMP_TEX_UNITS_ATI 0x8778 #define GL_DUDV_ATI 0x8779 #define GL_DU8DV8_ATI 0x877A #define GL_BUMP_ENVMAP_ATI 0x877B #define GL_BUMP_TARGET_ATI 0x877C typedef void (GLAPIENTRY * PFNGLGETTEXBUMPPARAMETERFVATIPROC) (GLenum pname, GLfloat *param); typedef void (GLAPIENTRY * PFNGLGETTEXBUMPPARAMETERIVATIPROC) (GLenum pname, GLint *param); typedef void (GLAPIENTRY * PFNGLTEXBUMPPARAMETERFVATIPROC) (GLenum pname, GLfloat *param); typedef void (GLAPIENTRY * PFNGLTEXBUMPPARAMETERIVATIPROC) (GLenum pname, GLint *param); #define glGetTexBumpParameterfvATI GLEW_GET_FUN(__glewGetTexBumpParameterfvATI) #define glGetTexBumpParameterivATI GLEW_GET_FUN(__glewGetTexBumpParameterivATI) #define glTexBumpParameterfvATI GLEW_GET_FUN(__glewTexBumpParameterfvATI) #define glTexBumpParameterivATI GLEW_GET_FUN(__glewTexBumpParameterivATI) #define GLEW_ATI_envmap_bumpmap GLEW_GET_VAR(__GLEW_ATI_envmap_bumpmap) #endif /* GL_ATI_envmap_bumpmap */ /* ------------------------- GL_ATI_fragment_shader ------------------------ */ #ifndef GL_ATI_fragment_shader #define GL_ATI_fragment_shader 1 #define GL_RED_BIT_ATI 0x00000001 #define GL_2X_BIT_ATI 0x00000001 #define GL_4X_BIT_ATI 0x00000002 #define GL_GREEN_BIT_ATI 0x00000002 #define GL_COMP_BIT_ATI 0x00000002 #define GL_BLUE_BIT_ATI 0x00000004 #define GL_8X_BIT_ATI 0x00000004 #define GL_NEGATE_BIT_ATI 0x00000004 #define GL_BIAS_BIT_ATI 0x00000008 #define GL_HALF_BIT_ATI 0x00000008 #define GL_QUARTER_BIT_ATI 0x00000010 #define GL_EIGHTH_BIT_ATI 0x00000020 #define GL_SATURATE_BIT_ATI 0x00000040 #define GL_FRAGMENT_SHADER_ATI 0x8920 #define GL_REG_0_ATI 0x8921 #define GL_REG_1_ATI 0x8922 #define GL_REG_2_ATI 0x8923 #define GL_REG_3_ATI 0x8924 #define GL_REG_4_ATI 0x8925 #define GL_REG_5_ATI 0x8926 #define GL_CON_0_ATI 0x8941 #define GL_CON_1_ATI 0x8942 #define GL_CON_2_ATI 0x8943 #define GL_CON_3_ATI 0x8944 #define GL_CON_4_ATI 0x8945 #define GL_CON_5_ATI 0x8946 #define GL_CON_6_ATI 0x8947 #define GL_CON_7_ATI 0x8948 #define GL_MOV_ATI 0x8961 #define GL_ADD_ATI 0x8963 #define GL_MUL_ATI 0x8964 #define GL_SUB_ATI 0x8965 #define GL_DOT3_ATI 0x8966 #define GL_DOT4_ATI 0x8967 #define GL_MAD_ATI 0x8968 #define GL_LERP_ATI 0x8969 #define GL_CND_ATI 0x896A #define GL_CND0_ATI 0x896B #define GL_DOT2_ADD_ATI 0x896C #define GL_SECONDARY_INTERPOLATOR_ATI 0x896D #define GL_NUM_FRAGMENT_REGISTERS_ATI 0x896E #define GL_NUM_FRAGMENT_CONSTANTS_ATI 0x896F #define GL_NUM_PASSES_ATI 0x8970 #define GL_NUM_INSTRUCTIONS_PER_PASS_ATI 0x8971 #define GL_NUM_INSTRUCTIONS_TOTAL_ATI 0x8972 #define GL_NUM_INPUT_INTERPOLATOR_COMPONENTS_ATI 0x8973 #define GL_NUM_LOOPBACK_COMPONENTS_ATI 0x8974 #define GL_COLOR_ALPHA_PAIRING_ATI 0x8975 #define GL_SWIZZLE_STR_ATI 0x8976 #define GL_SWIZZLE_STQ_ATI 0x8977 #define GL_SWIZZLE_STR_DR_ATI 0x8978 #define GL_SWIZZLE_STQ_DQ_ATI 0x8979 #define GL_SWIZZLE_STRQ_ATI 0x897A #define GL_SWIZZLE_STRQ_DQ_ATI 0x897B typedef void (GLAPIENTRY * PFNGLALPHAFRAGMENTOP1ATIPROC) (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod); typedef void (GLAPIENTRY * PFNGLALPHAFRAGMENTOP2ATIPROC) (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod); typedef void (GLAPIENTRY * PFNGLALPHAFRAGMENTOP3ATIPROC) (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod, GLuint arg3, GLuint arg3Rep, GLuint arg3Mod); typedef void (GLAPIENTRY * PFNGLBEGINFRAGMENTSHADERATIPROC) (void); typedef void (GLAPIENTRY * PFNGLBINDFRAGMENTSHADERATIPROC) (GLuint id); typedef void (GLAPIENTRY * PFNGLCOLORFRAGMENTOP1ATIPROC) (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod); typedef void (GLAPIENTRY * PFNGLCOLORFRAGMENTOP2ATIPROC) (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod); typedef void (GLAPIENTRY * PFNGLCOLORFRAGMENTOP3ATIPROC) (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod, GLuint arg3, GLuint arg3Rep, GLuint arg3Mod); typedef void (GLAPIENTRY * PFNGLDELETEFRAGMENTSHADERATIPROC) (GLuint id); typedef void (GLAPIENTRY * PFNGLENDFRAGMENTSHADERATIPROC) (void); typedef GLuint (GLAPIENTRY * PFNGLGENFRAGMENTSHADERSATIPROC) (GLuint range); typedef void (GLAPIENTRY * PFNGLPASSTEXCOORDATIPROC) (GLuint dst, GLuint coord, GLenum swizzle); typedef void (GLAPIENTRY * PFNGLSAMPLEMAPATIPROC) (GLuint dst, GLuint interp, GLenum swizzle); typedef void (GLAPIENTRY * PFNGLSETFRAGMENTSHADERCONSTANTATIPROC) (GLuint dst, const GLfloat* value); #define glAlphaFragmentOp1ATI GLEW_GET_FUN(__glewAlphaFragmentOp1ATI) #define glAlphaFragmentOp2ATI GLEW_GET_FUN(__glewAlphaFragmentOp2ATI) #define glAlphaFragmentOp3ATI GLEW_GET_FUN(__glewAlphaFragmentOp3ATI) #define glBeginFragmentShaderATI GLEW_GET_FUN(__glewBeginFragmentShaderATI) #define glBindFragmentShaderATI GLEW_GET_FUN(__glewBindFragmentShaderATI) #define glColorFragmentOp1ATI GLEW_GET_FUN(__glewColorFragmentOp1ATI) #define glColorFragmentOp2ATI GLEW_GET_FUN(__glewColorFragmentOp2ATI) #define glColorFragmentOp3ATI GLEW_GET_FUN(__glewColorFragmentOp3ATI) #define glDeleteFragmentShaderATI GLEW_GET_FUN(__glewDeleteFragmentShaderATI) #define glEndFragmentShaderATI GLEW_GET_FUN(__glewEndFragmentShaderATI) #define glGenFragmentShadersATI GLEW_GET_FUN(__glewGenFragmentShadersATI) #define glPassTexCoordATI GLEW_GET_FUN(__glewPassTexCoordATI) #define glSampleMapATI GLEW_GET_FUN(__glewSampleMapATI) #define glSetFragmentShaderConstantATI GLEW_GET_FUN(__glewSetFragmentShaderConstantATI) #define GLEW_ATI_fragment_shader GLEW_GET_VAR(__GLEW_ATI_fragment_shader) #endif /* GL_ATI_fragment_shader */ /* ------------------------ GL_ATI_map_object_buffer ----------------------- */ #ifndef GL_ATI_map_object_buffer #define GL_ATI_map_object_buffer 1 typedef GLvoid * (GLAPIENTRY * PFNGLMAPOBJECTBUFFERATIPROC) (GLuint buffer); typedef void (GLAPIENTRY * PFNGLUNMAPOBJECTBUFFERATIPROC) (GLuint buffer); #define glMapObjectBufferATI GLEW_GET_FUN(__glewMapObjectBufferATI) #define glUnmapObjectBufferATI GLEW_GET_FUN(__glewUnmapObjectBufferATI) #define GLEW_ATI_map_object_buffer GLEW_GET_VAR(__GLEW_ATI_map_object_buffer) #endif /* GL_ATI_map_object_buffer */ /* ----------------------------- GL_ATI_meminfo ---------------------------- */ #ifndef GL_ATI_meminfo #define GL_ATI_meminfo 1 #define GL_VBO_FREE_MEMORY_ATI 0x87FB #define GL_TEXTURE_FREE_MEMORY_ATI 0x87FC #define GL_RENDERBUFFER_FREE_MEMORY_ATI 0x87FD #define GLEW_ATI_meminfo GLEW_GET_VAR(__GLEW_ATI_meminfo) #endif /* GL_ATI_meminfo */ /* -------------------------- GL_ATI_pn_triangles -------------------------- */ #ifndef GL_ATI_pn_triangles #define GL_ATI_pn_triangles 1 #define GL_PN_TRIANGLES_ATI 0x87F0 #define GL_MAX_PN_TRIANGLES_TESSELATION_LEVEL_ATI 0x87F1 #define GL_PN_TRIANGLES_POINT_MODE_ATI 0x87F2 #define GL_PN_TRIANGLES_NORMAL_MODE_ATI 0x87F3 #define GL_PN_TRIANGLES_TESSELATION_LEVEL_ATI 0x87F4 #define GL_PN_TRIANGLES_POINT_MODE_LINEAR_ATI 0x87F5 #define GL_PN_TRIANGLES_POINT_MODE_CUBIC_ATI 0x87F6 #define GL_PN_TRIANGLES_NORMAL_MODE_LINEAR_ATI 0x87F7 #define GL_PN_TRIANGLES_NORMAL_MODE_QUADRATIC_ATI 0x87F8 typedef void (GLAPIENTRY * PFNGLPNTRIANGLESFATIPROC) (GLenum pname, GLfloat param); typedef void (GLAPIENTRY * PFNGLPNTRIANGLESIATIPROC) (GLenum pname, GLint param); #define glPNTrianglesfATI GLEW_GET_FUN(__glewPNTrianglesfATI) #define glPNTrianglesiATI GLEW_GET_FUN(__glewPNTrianglesiATI) #define GLEW_ATI_pn_triangles GLEW_GET_VAR(__GLEW_ATI_pn_triangles) #endif /* GL_ATI_pn_triangles */ /* ------------------------ GL_ATI_separate_stencil ------------------------ */ #ifndef GL_ATI_separate_stencil #define GL_ATI_separate_stencil 1 #define GL_STENCIL_BACK_FUNC_ATI 0x8800 #define GL_STENCIL_BACK_FAIL_ATI 0x8801 #define GL_STENCIL_BACK_PASS_DEPTH_FAIL_ATI 0x8802 #define GL_STENCIL_BACK_PASS_DEPTH_PASS_ATI 0x8803 typedef void (GLAPIENTRY * PFNGLSTENCILFUNCSEPARATEATIPROC) (GLenum frontfunc, GLenum backfunc, GLint ref, GLuint mask); typedef void (GLAPIENTRY * PFNGLSTENCILOPSEPARATEATIPROC) (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass); #define glStencilFuncSeparateATI GLEW_GET_FUN(__glewStencilFuncSeparateATI) #define glStencilOpSeparateATI GLEW_GET_FUN(__glewStencilOpSeparateATI) #define GLEW_ATI_separate_stencil GLEW_GET_VAR(__GLEW_ATI_separate_stencil) #endif /* GL_ATI_separate_stencil */ /* ----------------------- GL_ATI_shader_texture_lod ----------------------- */ #ifndef GL_ATI_shader_texture_lod #define GL_ATI_shader_texture_lod 1 #define GLEW_ATI_shader_texture_lod GLEW_GET_VAR(__GLEW_ATI_shader_texture_lod) #endif /* GL_ATI_shader_texture_lod */ /* ---------------------- GL_ATI_text_fragment_shader ---------------------- */ #ifndef GL_ATI_text_fragment_shader #define GL_ATI_text_fragment_shader 1 #define GL_TEXT_FRAGMENT_SHADER_ATI 0x8200 #define GLEW_ATI_text_fragment_shader GLEW_GET_VAR(__GLEW_ATI_text_fragment_shader) #endif /* GL_ATI_text_fragment_shader */ /* --------------------- GL_ATI_texture_compression_3dc -------------------- */ #ifndef GL_ATI_texture_compression_3dc #define GL_ATI_texture_compression_3dc 1 #define GL_COMPRESSED_LUMINANCE_ALPHA_3DC_ATI 0x8837 #define GLEW_ATI_texture_compression_3dc GLEW_GET_VAR(__GLEW_ATI_texture_compression_3dc) #endif /* GL_ATI_texture_compression_3dc */ /* ---------------------- GL_ATI_texture_env_combine3 ---------------------- */ #ifndef GL_ATI_texture_env_combine3 #define GL_ATI_texture_env_combine3 1 #define GL_MODULATE_ADD_ATI 0x8744 #define GL_MODULATE_SIGNED_ADD_ATI 0x8745 #define GL_MODULATE_SUBTRACT_ATI 0x8746 #define GLEW_ATI_texture_env_combine3 GLEW_GET_VAR(__GLEW_ATI_texture_env_combine3) #endif /* GL_ATI_texture_env_combine3 */ /* -------------------------- GL_ATI_texture_float ------------------------- */ #ifndef GL_ATI_texture_float #define GL_ATI_texture_float 1 #define GL_RGBA_FLOAT32_ATI 0x8814 #define GL_RGB_FLOAT32_ATI 0x8815 #define GL_ALPHA_FLOAT32_ATI 0x8816 #define GL_INTENSITY_FLOAT32_ATI 0x8817 #define GL_LUMINANCE_FLOAT32_ATI 0x8818 #define GL_LUMINANCE_ALPHA_FLOAT32_ATI 0x8819 #define GL_RGBA_FLOAT16_ATI 0x881A #define GL_RGB_FLOAT16_ATI 0x881B #define GL_ALPHA_FLOAT16_ATI 0x881C #define GL_INTENSITY_FLOAT16_ATI 0x881D #define GL_LUMINANCE_FLOAT16_ATI 0x881E #define GL_LUMINANCE_ALPHA_FLOAT16_ATI 0x881F #define GLEW_ATI_texture_float GLEW_GET_VAR(__GLEW_ATI_texture_float) #endif /* GL_ATI_texture_float */ /* ----------------------- GL_ATI_texture_mirror_once ---------------------- */ #ifndef GL_ATI_texture_mirror_once #define GL_ATI_texture_mirror_once 1 #define GL_MIRROR_CLAMP_ATI 0x8742 #define GL_MIRROR_CLAMP_TO_EDGE_ATI 0x8743 #define GLEW_ATI_texture_mirror_once GLEW_GET_VAR(__GLEW_ATI_texture_mirror_once) #endif /* GL_ATI_texture_mirror_once */ /* ----------------------- GL_ATI_vertex_array_object ---------------------- */ #ifndef GL_ATI_vertex_array_object #define GL_ATI_vertex_array_object 1 #define GL_STATIC_ATI 0x8760 #define GL_DYNAMIC_ATI 0x8761 #define GL_PRESERVE_ATI 0x8762 #define GL_DISCARD_ATI 0x8763 #define GL_OBJECT_BUFFER_SIZE_ATI 0x8764 #define GL_OBJECT_BUFFER_USAGE_ATI 0x8765 #define GL_ARRAY_OBJECT_BUFFER_ATI 0x8766 #define GL_ARRAY_OBJECT_OFFSET_ATI 0x8767 typedef void (GLAPIENTRY * PFNGLARRAYOBJECTATIPROC) (GLenum array, GLint size, GLenum type, GLsizei stride, GLuint buffer, GLuint offset); typedef void (GLAPIENTRY * PFNGLFREEOBJECTBUFFERATIPROC) (GLuint buffer); typedef void (GLAPIENTRY * PFNGLGETARRAYOBJECTFVATIPROC) (GLenum array, GLenum pname, GLfloat* params); typedef void (GLAPIENTRY * PFNGLGETARRAYOBJECTIVATIPROC) (GLenum array, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLGETOBJECTBUFFERFVATIPROC) (GLuint buffer, GLenum pname, GLfloat* params); typedef void (GLAPIENTRY * PFNGLGETOBJECTBUFFERIVATIPROC) (GLuint buffer, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLGETVARIANTARRAYOBJECTFVATIPROC) (GLuint id, GLenum pname, GLfloat* params); typedef void (GLAPIENTRY * PFNGLGETVARIANTARRAYOBJECTIVATIPROC) (GLuint id, GLenum pname, GLint* params); typedef GLboolean (GLAPIENTRY * PFNGLISOBJECTBUFFERATIPROC) (GLuint buffer); typedef GLuint (GLAPIENTRY * PFNGLNEWOBJECTBUFFERATIPROC) (GLsizei size, const void* pointer, GLenum usage); typedef void (GLAPIENTRY * PFNGLUPDATEOBJECTBUFFERATIPROC) (GLuint buffer, GLuint offset, GLsizei size, const void* pointer, GLenum preserve); typedef void (GLAPIENTRY * PFNGLVARIANTARRAYOBJECTATIPROC) (GLuint id, GLenum type, GLsizei stride, GLuint buffer, GLuint offset); #define glArrayObjectATI GLEW_GET_FUN(__glewArrayObjectATI) #define glFreeObjectBufferATI GLEW_GET_FUN(__glewFreeObjectBufferATI) #define glGetArrayObjectfvATI GLEW_GET_FUN(__glewGetArrayObjectfvATI) #define glGetArrayObjectivATI GLEW_GET_FUN(__glewGetArrayObjectivATI) #define glGetObjectBufferfvATI GLEW_GET_FUN(__glewGetObjectBufferfvATI) #define glGetObjectBufferivATI GLEW_GET_FUN(__glewGetObjectBufferivATI) #define glGetVariantArrayObjectfvATI GLEW_GET_FUN(__glewGetVariantArrayObjectfvATI) #define glGetVariantArrayObjectivATI GLEW_GET_FUN(__glewGetVariantArrayObjectivATI) #define glIsObjectBufferATI GLEW_GET_FUN(__glewIsObjectBufferATI) #define glNewObjectBufferATI GLEW_GET_FUN(__glewNewObjectBufferATI) #define glUpdateObjectBufferATI GLEW_GET_FUN(__glewUpdateObjectBufferATI) #define glVariantArrayObjectATI GLEW_GET_FUN(__glewVariantArrayObjectATI) #define GLEW_ATI_vertex_array_object GLEW_GET_VAR(__GLEW_ATI_vertex_array_object) #endif /* GL_ATI_vertex_array_object */ /* ------------------- GL_ATI_vertex_attrib_array_object ------------------- */ #ifndef GL_ATI_vertex_attrib_array_object #define GL_ATI_vertex_attrib_array_object 1 typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBARRAYOBJECTFVATIPROC) (GLuint index, GLenum pname, GLfloat* params); typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBARRAYOBJECTIVATIPROC) (GLuint index, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBARRAYOBJECTATIPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, GLuint buffer, GLuint offset); #define glGetVertexAttribArrayObjectfvATI GLEW_GET_FUN(__glewGetVertexAttribArrayObjectfvATI) #define glGetVertexAttribArrayObjectivATI GLEW_GET_FUN(__glewGetVertexAttribArrayObjectivATI) #define glVertexAttribArrayObjectATI GLEW_GET_FUN(__glewVertexAttribArrayObjectATI) #define GLEW_ATI_vertex_attrib_array_object GLEW_GET_VAR(__GLEW_ATI_vertex_attrib_array_object) #endif /* GL_ATI_vertex_attrib_array_object */ /* ------------------------- GL_ATI_vertex_streams ------------------------- */ #ifndef GL_ATI_vertex_streams #define GL_ATI_vertex_streams 1 #define GL_MAX_VERTEX_STREAMS_ATI 0x876B #define GL_VERTEX_SOURCE_ATI 0x876C #define GL_VERTEX_STREAM0_ATI 0x876D #define GL_VERTEX_STREAM1_ATI 0x876E #define GL_VERTEX_STREAM2_ATI 0x876F #define GL_VERTEX_STREAM3_ATI 0x8770 #define GL_VERTEX_STREAM4_ATI 0x8771 #define GL_VERTEX_STREAM5_ATI 0x8772 #define GL_VERTEX_STREAM6_ATI 0x8773 #define GL_VERTEX_STREAM7_ATI 0x8774 typedef void (GLAPIENTRY * PFNGLCLIENTACTIVEVERTEXSTREAMATIPROC) (GLenum stream); typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3BATIPROC) (GLenum stream, GLbyte x, GLbyte y, GLbyte z); typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3BVATIPROC) (GLenum stream, const GLbyte *coords); typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3DATIPROC) (GLenum stream, GLdouble x, GLdouble y, GLdouble z); typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3DVATIPROC) (GLenum stream, const GLdouble *coords); typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3FATIPROC) (GLenum stream, GLfloat x, GLfloat y, GLfloat z); typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3FVATIPROC) (GLenum stream, const GLfloat *coords); typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3IATIPROC) (GLenum stream, GLint x, GLint y, GLint z); typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3IVATIPROC) (GLenum stream, const GLint *coords); typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3SATIPROC) (GLenum stream, GLshort x, GLshort y, GLshort z); typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3SVATIPROC) (GLenum stream, const GLshort *coords); typedef void (GLAPIENTRY * PFNGLVERTEXBLENDENVFATIPROC) (GLenum pname, GLfloat param); typedef void (GLAPIENTRY * PFNGLVERTEXBLENDENVIATIPROC) (GLenum pname, GLint param); typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM1DATIPROC) (GLenum stream, GLdouble x); typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM1DVATIPROC) (GLenum stream, const GLdouble *coords); typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM1FATIPROC) (GLenum stream, GLfloat x); typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM1FVATIPROC) (GLenum stream, const GLfloat *coords); typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM1IATIPROC) (GLenum stream, GLint x); typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM1IVATIPROC) (GLenum stream, const GLint *coords); typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM1SATIPROC) (GLenum stream, GLshort x); typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM1SVATIPROC) (GLenum stream, const GLshort *coords); typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM2DATIPROC) (GLenum stream, GLdouble x, GLdouble y); typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM2DVATIPROC) (GLenum stream, const GLdouble *coords); typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM2FATIPROC) (GLenum stream, GLfloat x, GLfloat y); typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM2FVATIPROC) (GLenum stream, const GLfloat *coords); typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM2IATIPROC) (GLenum stream, GLint x, GLint y); typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM2IVATIPROC) (GLenum stream, const GLint *coords); typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM2SATIPROC) (GLenum stream, GLshort x, GLshort y); typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM2SVATIPROC) (GLenum stream, const GLshort *coords); typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM3DATIPROC) (GLenum stream, GLdouble x, GLdouble y, GLdouble z); typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM3DVATIPROC) (GLenum stream, const GLdouble *coords); typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM3FATIPROC) (GLenum stream, GLfloat x, GLfloat y, GLfloat z); typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM3FVATIPROC) (GLenum stream, const GLfloat *coords); typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM3IATIPROC) (GLenum stream, GLint x, GLint y, GLint z); typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM3IVATIPROC) (GLenum stream, const GLint *coords); typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM3SATIPROC) (GLenum stream, GLshort x, GLshort y, GLshort z); typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM3SVATIPROC) (GLenum stream, const GLshort *coords); typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM4DATIPROC) (GLenum stream, GLdouble x, GLdouble y, GLdouble z, GLdouble w); typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM4DVATIPROC) (GLenum stream, const GLdouble *coords); typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM4FATIPROC) (GLenum stream, GLfloat x, GLfloat y, GLfloat z, GLfloat w); typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM4FVATIPROC) (GLenum stream, const GLfloat *coords); typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM4IATIPROC) (GLenum stream, GLint x, GLint y, GLint z, GLint w); typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM4IVATIPROC) (GLenum stream, const GLint *coords); typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM4SATIPROC) (GLenum stream, GLshort x, GLshort y, GLshort z, GLshort w); typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM4SVATIPROC) (GLenum stream, const GLshort *coords); #define glClientActiveVertexStreamATI GLEW_GET_FUN(__glewClientActiveVertexStreamATI) #define glNormalStream3bATI GLEW_GET_FUN(__glewNormalStream3bATI) #define glNormalStream3bvATI GLEW_GET_FUN(__glewNormalStream3bvATI) #define glNormalStream3dATI GLEW_GET_FUN(__glewNormalStream3dATI) #define glNormalStream3dvATI GLEW_GET_FUN(__glewNormalStream3dvATI) #define glNormalStream3fATI GLEW_GET_FUN(__glewNormalStream3fATI) #define glNormalStream3fvATI GLEW_GET_FUN(__glewNormalStream3fvATI) #define glNormalStream3iATI GLEW_GET_FUN(__glewNormalStream3iATI) #define glNormalStream3ivATI GLEW_GET_FUN(__glewNormalStream3ivATI) #define glNormalStream3sATI GLEW_GET_FUN(__glewNormalStream3sATI) #define glNormalStream3svATI GLEW_GET_FUN(__glewNormalStream3svATI) #define glVertexBlendEnvfATI GLEW_GET_FUN(__glewVertexBlendEnvfATI) #define glVertexBlendEnviATI GLEW_GET_FUN(__glewVertexBlendEnviATI) #define glVertexStream1dATI GLEW_GET_FUN(__glewVertexStream1dATI) #define glVertexStream1dvATI GLEW_GET_FUN(__glewVertexStream1dvATI) #define glVertexStream1fATI GLEW_GET_FUN(__glewVertexStream1fATI) #define glVertexStream1fvATI GLEW_GET_FUN(__glewVertexStream1fvATI) #define glVertexStream1iATI GLEW_GET_FUN(__glewVertexStream1iATI) #define glVertexStream1ivATI GLEW_GET_FUN(__glewVertexStream1ivATI) #define glVertexStream1sATI GLEW_GET_FUN(__glewVertexStream1sATI) #define glVertexStream1svATI GLEW_GET_FUN(__glewVertexStream1svATI) #define glVertexStream2dATI GLEW_GET_FUN(__glewVertexStream2dATI) #define glVertexStream2dvATI GLEW_GET_FUN(__glewVertexStream2dvATI) #define glVertexStream2fATI GLEW_GET_FUN(__glewVertexStream2fATI) #define glVertexStream2fvATI GLEW_GET_FUN(__glewVertexStream2fvATI) #define glVertexStream2iATI GLEW_GET_FUN(__glewVertexStream2iATI) #define glVertexStream2ivATI GLEW_GET_FUN(__glewVertexStream2ivATI) #define glVertexStream2sATI GLEW_GET_FUN(__glewVertexStream2sATI) #define glVertexStream2svATI GLEW_GET_FUN(__glewVertexStream2svATI) #define glVertexStream3dATI GLEW_GET_FUN(__glewVertexStream3dATI) #define glVertexStream3dvATI GLEW_GET_FUN(__glewVertexStream3dvATI) #define glVertexStream3fATI GLEW_GET_FUN(__glewVertexStream3fATI) #define glVertexStream3fvATI GLEW_GET_FUN(__glewVertexStream3fvATI) #define glVertexStream3iATI GLEW_GET_FUN(__glewVertexStream3iATI) #define glVertexStream3ivATI GLEW_GET_FUN(__glewVertexStream3ivATI) #define glVertexStream3sATI GLEW_GET_FUN(__glewVertexStream3sATI) #define glVertexStream3svATI GLEW_GET_FUN(__glewVertexStream3svATI) #define glVertexStream4dATI GLEW_GET_FUN(__glewVertexStream4dATI) #define glVertexStream4dvATI GLEW_GET_FUN(__glewVertexStream4dvATI) #define glVertexStream4fATI GLEW_GET_FUN(__glewVertexStream4fATI) #define glVertexStream4fvATI GLEW_GET_FUN(__glewVertexStream4fvATI) #define glVertexStream4iATI GLEW_GET_FUN(__glewVertexStream4iATI) #define glVertexStream4ivATI GLEW_GET_FUN(__glewVertexStream4ivATI) #define glVertexStream4sATI GLEW_GET_FUN(__glewVertexStream4sATI) #define glVertexStream4svATI GLEW_GET_FUN(__glewVertexStream4svATI) #define GLEW_ATI_vertex_streams GLEW_GET_VAR(__GLEW_ATI_vertex_streams) #endif /* GL_ATI_vertex_streams */ /* --------------------------- GL_EXT_422_pixels --------------------------- */ #ifndef GL_EXT_422_pixels #define GL_EXT_422_pixels 1 #define GL_422_EXT 0x80CC #define GL_422_REV_EXT 0x80CD #define GL_422_AVERAGE_EXT 0x80CE #define GL_422_REV_AVERAGE_EXT 0x80CF #define GLEW_EXT_422_pixels GLEW_GET_VAR(__GLEW_EXT_422_pixels) #endif /* GL_EXT_422_pixels */ /* ---------------------------- GL_EXT_Cg_shader --------------------------- */ #ifndef GL_EXT_Cg_shader #define GL_EXT_Cg_shader 1 #define GL_CG_VERTEX_SHADER_EXT 0x890E #define GL_CG_FRAGMENT_SHADER_EXT 0x890F #define GLEW_EXT_Cg_shader GLEW_GET_VAR(__GLEW_EXT_Cg_shader) #endif /* GL_EXT_Cg_shader */ /* ------------------------------ GL_EXT_abgr ------------------------------ */ #ifndef GL_EXT_abgr #define GL_EXT_abgr 1 #define GL_ABGR_EXT 0x8000 #define GLEW_EXT_abgr GLEW_GET_VAR(__GLEW_EXT_abgr) #endif /* GL_EXT_abgr */ /* ------------------------------ GL_EXT_bgra ------------------------------ */ #ifndef GL_EXT_bgra #define GL_EXT_bgra 1 #define GL_BGR_EXT 0x80E0 #define GL_BGRA_EXT 0x80E1 #define GLEW_EXT_bgra GLEW_GET_VAR(__GLEW_EXT_bgra) #endif /* GL_EXT_bgra */ /* ------------------------ GL_EXT_bindable_uniform ------------------------ */ #ifndef GL_EXT_bindable_uniform #define GL_EXT_bindable_uniform 1 #define GL_MAX_VERTEX_BINDABLE_UNIFORMS_EXT 0x8DE2 #define GL_MAX_FRAGMENT_BINDABLE_UNIFORMS_EXT 0x8DE3 #define GL_MAX_GEOMETRY_BINDABLE_UNIFORMS_EXT 0x8DE4 #define GL_MAX_BINDABLE_UNIFORM_SIZE_EXT 0x8DED #define GL_UNIFORM_BUFFER_EXT 0x8DEE #define GL_UNIFORM_BUFFER_BINDING_EXT 0x8DEF typedef GLint (GLAPIENTRY * PFNGLGETUNIFORMBUFFERSIZEEXTPROC) (GLuint program, GLint location); typedef GLintptr (GLAPIENTRY * PFNGLGETUNIFORMOFFSETEXTPROC) (GLuint program, GLint location); typedef void (GLAPIENTRY * PFNGLUNIFORMBUFFEREXTPROC) (GLuint program, GLint location, GLuint buffer); #define glGetUniformBufferSizeEXT GLEW_GET_FUN(__glewGetUniformBufferSizeEXT) #define glGetUniformOffsetEXT GLEW_GET_FUN(__glewGetUniformOffsetEXT) #define glUniformBufferEXT GLEW_GET_FUN(__glewUniformBufferEXT) #define GLEW_EXT_bindable_uniform GLEW_GET_VAR(__GLEW_EXT_bindable_uniform) #endif /* GL_EXT_bindable_uniform */ /* --------------------------- GL_EXT_blend_color -------------------------- */ #ifndef GL_EXT_blend_color #define GL_EXT_blend_color 1 #define GL_CONSTANT_COLOR_EXT 0x8001 #define GL_ONE_MINUS_CONSTANT_COLOR_EXT 0x8002 #define GL_CONSTANT_ALPHA_EXT 0x8003 #define GL_ONE_MINUS_CONSTANT_ALPHA_EXT 0x8004 #define GL_BLEND_COLOR_EXT 0x8005 typedef void (GLAPIENTRY * PFNGLBLENDCOLOREXTPROC) (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); #define glBlendColorEXT GLEW_GET_FUN(__glewBlendColorEXT) #define GLEW_EXT_blend_color GLEW_GET_VAR(__GLEW_EXT_blend_color) #endif /* GL_EXT_blend_color */ /* --------------------- GL_EXT_blend_equation_separate -------------------- */ #ifndef GL_EXT_blend_equation_separate #define GL_EXT_blend_equation_separate 1 #define GL_BLEND_EQUATION_RGB_EXT 0x8009 #define GL_BLEND_EQUATION_ALPHA_EXT 0x883D typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONSEPARATEEXTPROC) (GLenum modeRGB, GLenum modeAlpha); #define glBlendEquationSeparateEXT GLEW_GET_FUN(__glewBlendEquationSeparateEXT) #define GLEW_EXT_blend_equation_separate GLEW_GET_VAR(__GLEW_EXT_blend_equation_separate) #endif /* GL_EXT_blend_equation_separate */ /* ----------------------- GL_EXT_blend_func_separate ---------------------- */ #ifndef GL_EXT_blend_func_separate #define GL_EXT_blend_func_separate 1 #define GL_BLEND_DST_RGB_EXT 0x80C8 #define GL_BLEND_SRC_RGB_EXT 0x80C9 #define GL_BLEND_DST_ALPHA_EXT 0x80CA #define GL_BLEND_SRC_ALPHA_EXT 0x80CB typedef void (GLAPIENTRY * PFNGLBLENDFUNCSEPARATEEXTPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); #define glBlendFuncSeparateEXT GLEW_GET_FUN(__glewBlendFuncSeparateEXT) #define GLEW_EXT_blend_func_separate GLEW_GET_VAR(__GLEW_EXT_blend_func_separate) #endif /* GL_EXT_blend_func_separate */ /* ------------------------- GL_EXT_blend_logic_op ------------------------- */ #ifndef GL_EXT_blend_logic_op #define GL_EXT_blend_logic_op 1 #define GLEW_EXT_blend_logic_op GLEW_GET_VAR(__GLEW_EXT_blend_logic_op) #endif /* GL_EXT_blend_logic_op */ /* -------------------------- GL_EXT_blend_minmax -------------------------- */ #ifndef GL_EXT_blend_minmax #define GL_EXT_blend_minmax 1 #define GL_FUNC_ADD_EXT 0x8006 #define GL_MIN_EXT 0x8007 #define GL_MAX_EXT 0x8008 #define GL_BLEND_EQUATION_EXT 0x8009 typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONEXTPROC) (GLenum mode); #define glBlendEquationEXT GLEW_GET_FUN(__glewBlendEquationEXT) #define GLEW_EXT_blend_minmax GLEW_GET_VAR(__GLEW_EXT_blend_minmax) #endif /* GL_EXT_blend_minmax */ /* ------------------------- GL_EXT_blend_subtract ------------------------- */ #ifndef GL_EXT_blend_subtract #define GL_EXT_blend_subtract 1 #define GL_FUNC_SUBTRACT_EXT 0x800A #define GL_FUNC_REVERSE_SUBTRACT_EXT 0x800B #define GLEW_EXT_blend_subtract GLEW_GET_VAR(__GLEW_EXT_blend_subtract) #endif /* GL_EXT_blend_subtract */ /* ------------------------ GL_EXT_clip_volume_hint ------------------------ */ #ifndef GL_EXT_clip_volume_hint #define GL_EXT_clip_volume_hint 1 #define GL_CLIP_VOLUME_CLIPPING_HINT_EXT 0x80F0 #define GLEW_EXT_clip_volume_hint GLEW_GET_VAR(__GLEW_EXT_clip_volume_hint) #endif /* GL_EXT_clip_volume_hint */ /* ------------------------------ GL_EXT_cmyka ----------------------------- */ #ifndef GL_EXT_cmyka #define GL_EXT_cmyka 1 #define GL_CMYK_EXT 0x800C #define GL_CMYKA_EXT 0x800D #define GL_PACK_CMYK_HINT_EXT 0x800E #define GL_UNPACK_CMYK_HINT_EXT 0x800F #define GLEW_EXT_cmyka GLEW_GET_VAR(__GLEW_EXT_cmyka) #endif /* GL_EXT_cmyka */ /* ------------------------- GL_EXT_color_subtable ------------------------- */ #ifndef GL_EXT_color_subtable #define GL_EXT_color_subtable 1 typedef void (GLAPIENTRY * PFNGLCOLORSUBTABLEEXTPROC) (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const void* data); typedef void (GLAPIENTRY * PFNGLCOPYCOLORSUBTABLEEXTPROC) (GLenum target, GLsizei start, GLint x, GLint y, GLsizei width); #define glColorSubTableEXT GLEW_GET_FUN(__glewColorSubTableEXT) #define glCopyColorSubTableEXT GLEW_GET_FUN(__glewCopyColorSubTableEXT) #define GLEW_EXT_color_subtable GLEW_GET_VAR(__GLEW_EXT_color_subtable) #endif /* GL_EXT_color_subtable */ /* ---------------------- GL_EXT_compiled_vertex_array --------------------- */ #ifndef GL_EXT_compiled_vertex_array #define GL_EXT_compiled_vertex_array 1 #define GL_ARRAY_ELEMENT_LOCK_FIRST_EXT 0x81A8 #define GL_ARRAY_ELEMENT_LOCK_COUNT_EXT 0x81A9 typedef void (GLAPIENTRY * PFNGLLOCKARRAYSEXTPROC) (GLint first, GLsizei count); typedef void (GLAPIENTRY * PFNGLUNLOCKARRAYSEXTPROC) (void); #define glLockArraysEXT GLEW_GET_FUN(__glewLockArraysEXT) #define glUnlockArraysEXT GLEW_GET_FUN(__glewUnlockArraysEXT) #define GLEW_EXT_compiled_vertex_array GLEW_GET_VAR(__GLEW_EXT_compiled_vertex_array) #endif /* GL_EXT_compiled_vertex_array */ /* --------------------------- GL_EXT_convolution -------------------------- */ #ifndef GL_EXT_convolution #define GL_EXT_convolution 1 #define GL_CONVOLUTION_1D_EXT 0x8010 #define GL_CONVOLUTION_2D_EXT 0x8011 #define GL_SEPARABLE_2D_EXT 0x8012 #define GL_CONVOLUTION_BORDER_MODE_EXT 0x8013 #define GL_CONVOLUTION_FILTER_SCALE_EXT 0x8014 #define GL_CONVOLUTION_FILTER_BIAS_EXT 0x8015 #define GL_REDUCE_EXT 0x8016 #define GL_CONVOLUTION_FORMAT_EXT 0x8017 #define GL_CONVOLUTION_WIDTH_EXT 0x8018 #define GL_CONVOLUTION_HEIGHT_EXT 0x8019 #define GL_MAX_CONVOLUTION_WIDTH_EXT 0x801A #define GL_MAX_CONVOLUTION_HEIGHT_EXT 0x801B #define GL_POST_CONVOLUTION_RED_SCALE_EXT 0x801C #define GL_POST_CONVOLUTION_GREEN_SCALE_EXT 0x801D #define GL_POST_CONVOLUTION_BLUE_SCALE_EXT 0x801E #define GL_POST_CONVOLUTION_ALPHA_SCALE_EXT 0x801F #define GL_POST_CONVOLUTION_RED_BIAS_EXT 0x8020 #define GL_POST_CONVOLUTION_GREEN_BIAS_EXT 0x8021 #define GL_POST_CONVOLUTION_BLUE_BIAS_EXT 0x8022 #define GL_POST_CONVOLUTION_ALPHA_BIAS_EXT 0x8023 typedef void (GLAPIENTRY * PFNGLCONVOLUTIONFILTER1DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void* image); typedef void (GLAPIENTRY * PFNGLCONVOLUTIONFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void* image); typedef void (GLAPIENTRY * PFNGLCONVOLUTIONPARAMETERFEXTPROC) (GLenum target, GLenum pname, GLfloat param); typedef void (GLAPIENTRY * PFNGLCONVOLUTIONPARAMETERFVEXTPROC) (GLenum target, GLenum pname, const GLfloat* params); typedef void (GLAPIENTRY * PFNGLCONVOLUTIONPARAMETERIEXTPROC) (GLenum target, GLenum pname, GLint param); typedef void (GLAPIENTRY * PFNGLCONVOLUTIONPARAMETERIVEXTPROC) (GLenum target, GLenum pname, const GLint* params); typedef void (GLAPIENTRY * PFNGLCOPYCONVOLUTIONFILTER1DEXTPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); typedef void (GLAPIENTRY * PFNGLCOPYCONVOLUTIONFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height); typedef void (GLAPIENTRY * PFNGLGETCONVOLUTIONFILTEREXTPROC) (GLenum target, GLenum format, GLenum type, void* image); typedef void (GLAPIENTRY * PFNGLGETCONVOLUTIONPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat* params); typedef void (GLAPIENTRY * PFNGLGETCONVOLUTIONPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLGETSEPARABLEFILTEREXTPROC) (GLenum target, GLenum format, GLenum type, void* row, void* column, void* span); typedef void (GLAPIENTRY * PFNGLSEPARABLEFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void* row, const void* column); #define glConvolutionFilter1DEXT GLEW_GET_FUN(__glewConvolutionFilter1DEXT) #define glConvolutionFilter2DEXT GLEW_GET_FUN(__glewConvolutionFilter2DEXT) #define glConvolutionParameterfEXT GLEW_GET_FUN(__glewConvolutionParameterfEXT) #define glConvolutionParameterfvEXT GLEW_GET_FUN(__glewConvolutionParameterfvEXT) #define glConvolutionParameteriEXT GLEW_GET_FUN(__glewConvolutionParameteriEXT) #define glConvolutionParameterivEXT GLEW_GET_FUN(__glewConvolutionParameterivEXT) #define glCopyConvolutionFilter1DEXT GLEW_GET_FUN(__glewCopyConvolutionFilter1DEXT) #define glCopyConvolutionFilter2DEXT GLEW_GET_FUN(__glewCopyConvolutionFilter2DEXT) #define glGetConvolutionFilterEXT GLEW_GET_FUN(__glewGetConvolutionFilterEXT) #define glGetConvolutionParameterfvEXT GLEW_GET_FUN(__glewGetConvolutionParameterfvEXT) #define glGetConvolutionParameterivEXT GLEW_GET_FUN(__glewGetConvolutionParameterivEXT) #define glGetSeparableFilterEXT GLEW_GET_FUN(__glewGetSeparableFilterEXT) #define glSeparableFilter2DEXT GLEW_GET_FUN(__glewSeparableFilter2DEXT) #define GLEW_EXT_convolution GLEW_GET_VAR(__GLEW_EXT_convolution) #endif /* GL_EXT_convolution */ /* ------------------------ GL_EXT_coordinate_frame ------------------------ */ #ifndef GL_EXT_coordinate_frame #define GL_EXT_coordinate_frame 1 #define GL_TANGENT_ARRAY_EXT 0x8439 #define GL_BINORMAL_ARRAY_EXT 0x843A #define GL_CURRENT_TANGENT_EXT 0x843B #define GL_CURRENT_BINORMAL_EXT 0x843C #define GL_TANGENT_ARRAY_TYPE_EXT 0x843E #define GL_TANGENT_ARRAY_STRIDE_EXT 0x843F #define GL_BINORMAL_ARRAY_TYPE_EXT 0x8440 #define GL_BINORMAL_ARRAY_STRIDE_EXT 0x8441 #define GL_TANGENT_ARRAY_POINTER_EXT 0x8442 #define GL_BINORMAL_ARRAY_POINTER_EXT 0x8443 #define GL_MAP1_TANGENT_EXT 0x8444 #define GL_MAP2_TANGENT_EXT 0x8445 #define GL_MAP1_BINORMAL_EXT 0x8446 #define GL_MAP2_BINORMAL_EXT 0x8447 typedef void (GLAPIENTRY * PFNGLBINORMALPOINTEREXTPROC) (GLenum type, GLsizei stride, void* pointer); typedef void (GLAPIENTRY * PFNGLTANGENTPOINTEREXTPROC) (GLenum type, GLsizei stride, void* pointer); #define glBinormalPointerEXT GLEW_GET_FUN(__glewBinormalPointerEXT) #define glTangentPointerEXT GLEW_GET_FUN(__glewTangentPointerEXT) #define GLEW_EXT_coordinate_frame GLEW_GET_VAR(__GLEW_EXT_coordinate_frame) #endif /* GL_EXT_coordinate_frame */ /* -------------------------- GL_EXT_copy_texture -------------------------- */ #ifndef GL_EXT_copy_texture #define GL_EXT_copy_texture 1 typedef void (GLAPIENTRY * PFNGLCOPYTEXIMAGE1DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); typedef void (GLAPIENTRY * PFNGLCOPYTEXIMAGE2DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); typedef void (GLAPIENTRY * PFNGLCOPYTEXSUBIMAGE1DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); typedef void (GLAPIENTRY * PFNGLCOPYTEXSUBIMAGE2DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); typedef void (GLAPIENTRY * PFNGLCOPYTEXSUBIMAGE3DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); #define glCopyTexImage1DEXT GLEW_GET_FUN(__glewCopyTexImage1DEXT) #define glCopyTexImage2DEXT GLEW_GET_FUN(__glewCopyTexImage2DEXT) #define glCopyTexSubImage1DEXT GLEW_GET_FUN(__glewCopyTexSubImage1DEXT) #define glCopyTexSubImage2DEXT GLEW_GET_FUN(__glewCopyTexSubImage2DEXT) #define glCopyTexSubImage3DEXT GLEW_GET_FUN(__glewCopyTexSubImage3DEXT) #define GLEW_EXT_copy_texture GLEW_GET_VAR(__GLEW_EXT_copy_texture) #endif /* GL_EXT_copy_texture */ /* --------------------------- GL_EXT_cull_vertex -------------------------- */ #ifndef GL_EXT_cull_vertex #define GL_EXT_cull_vertex 1 #define GL_CULL_VERTEX_EXT 0x81AA #define GL_CULL_VERTEX_EYE_POSITION_EXT 0x81AB #define GL_CULL_VERTEX_OBJECT_POSITION_EXT 0x81AC typedef void (GLAPIENTRY * PFNGLCULLPARAMETERDVEXTPROC) (GLenum pname, GLdouble* params); typedef void (GLAPIENTRY * PFNGLCULLPARAMETERFVEXTPROC) (GLenum pname, GLfloat* params); #define glCullParameterdvEXT GLEW_GET_FUN(__glewCullParameterdvEXT) #define glCullParameterfvEXT GLEW_GET_FUN(__glewCullParameterfvEXT) #define GLEW_EXT_cull_vertex GLEW_GET_VAR(__GLEW_EXT_cull_vertex) #endif /* GL_EXT_cull_vertex */ /* -------------------------- GL_EXT_debug_marker -------------------------- */ #ifndef GL_EXT_debug_marker #define GL_EXT_debug_marker 1 typedef void (GLAPIENTRY * PFNGLINSERTEVENTMARKEREXTPROC) (GLsizei length, const GLchar* marker); typedef void (GLAPIENTRY * PFNGLPOPGROUPMARKEREXTPROC) (void); typedef void (GLAPIENTRY * PFNGLPUSHGROUPMARKEREXTPROC) (GLsizei length, const GLchar* marker); #define glInsertEventMarkerEXT GLEW_GET_FUN(__glewInsertEventMarkerEXT) #define glPopGroupMarkerEXT GLEW_GET_FUN(__glewPopGroupMarkerEXT) #define glPushGroupMarkerEXT GLEW_GET_FUN(__glewPushGroupMarkerEXT) #define GLEW_EXT_debug_marker GLEW_GET_VAR(__GLEW_EXT_debug_marker) #endif /* GL_EXT_debug_marker */ /* ------------------------ GL_EXT_depth_bounds_test ----------------------- */ #ifndef GL_EXT_depth_bounds_test #define GL_EXT_depth_bounds_test 1 #define GL_DEPTH_BOUNDS_TEST_EXT 0x8890 #define GL_DEPTH_BOUNDS_EXT 0x8891 typedef void (GLAPIENTRY * PFNGLDEPTHBOUNDSEXTPROC) (GLclampd zmin, GLclampd zmax); #define glDepthBoundsEXT GLEW_GET_FUN(__glewDepthBoundsEXT) #define GLEW_EXT_depth_bounds_test GLEW_GET_VAR(__GLEW_EXT_depth_bounds_test) #endif /* GL_EXT_depth_bounds_test */ /* ----------------------- GL_EXT_direct_state_access ---------------------- */ #ifndef GL_EXT_direct_state_access #define GL_EXT_direct_state_access 1 #define GL_PROGRAM_MATRIX_EXT 0x8E2D #define GL_TRANSPOSE_PROGRAM_MATRIX_EXT 0x8E2E #define GL_PROGRAM_MATRIX_STACK_DEPTH_EXT 0x8E2F typedef void (GLAPIENTRY * PFNGLBINDMULTITEXTUREEXTPROC) (GLenum texunit, GLenum target, GLuint texture); typedef GLenum (GLAPIENTRY * PFNGLCHECKNAMEDFRAMEBUFFERSTATUSEXTPROC) (GLuint framebuffer, GLenum target); typedef void (GLAPIENTRY * PFNGLCLIENTATTRIBDEFAULTEXTPROC) (GLbitfield mask); typedef void (GLAPIENTRY * PFNGLCOMPRESSEDMULTITEXIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void* data); typedef void (GLAPIENTRY * PFNGLCOMPRESSEDMULTITEXIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void* data); typedef void (GLAPIENTRY * PFNGLCOMPRESSEDMULTITEXIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void* data); typedef void (GLAPIENTRY * PFNGLCOMPRESSEDMULTITEXSUBIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void* data); typedef void (GLAPIENTRY * PFNGLCOMPRESSEDMULTITEXSUBIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void* data); typedef void (GLAPIENTRY * PFNGLCOMPRESSEDMULTITEXSUBIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void* data); typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXTUREIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void* data); typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXTUREIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void* data); typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXTUREIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void* data); typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXTURESUBIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void* data); typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXTURESUBIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void* data); typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXTURESUBIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void* data); typedef void (GLAPIENTRY * PFNGLCOPYMULTITEXIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); typedef void (GLAPIENTRY * PFNGLCOPYMULTITEXIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); typedef void (GLAPIENTRY * PFNGLCOPYMULTITEXSUBIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); typedef void (GLAPIENTRY * PFNGLCOPYMULTITEXSUBIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); typedef void (GLAPIENTRY * PFNGLCOPYMULTITEXSUBIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); typedef void (GLAPIENTRY * PFNGLCOPYTEXTUREIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); typedef void (GLAPIENTRY * PFNGLCOPYTEXTUREIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); typedef void (GLAPIENTRY * PFNGLCOPYTEXTURESUBIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); typedef void (GLAPIENTRY * PFNGLCOPYTEXTURESUBIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); typedef void (GLAPIENTRY * PFNGLCOPYTEXTURESUBIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); typedef void (GLAPIENTRY * PFNGLDISABLECLIENTSTATEINDEXEDEXTPROC) (GLenum array, GLuint index); typedef void (GLAPIENTRY * PFNGLDISABLECLIENTSTATEIEXTPROC) (GLenum array, GLuint index); typedef void (GLAPIENTRY * PFNGLDISABLEVERTEXARRAYATTRIBEXTPROC) (GLuint vaobj, GLuint index); typedef void (GLAPIENTRY * PFNGLDISABLEVERTEXARRAYEXTPROC) (GLuint vaobj, GLenum array); typedef void (GLAPIENTRY * PFNGLENABLECLIENTSTATEINDEXEDEXTPROC) (GLenum array, GLuint index); typedef void (GLAPIENTRY * PFNGLENABLECLIENTSTATEIEXTPROC) (GLenum array, GLuint index); typedef void (GLAPIENTRY * PFNGLENABLEVERTEXARRAYATTRIBEXTPROC) (GLuint vaobj, GLuint index); typedef void (GLAPIENTRY * PFNGLENABLEVERTEXARRAYEXTPROC) (GLuint vaobj, GLenum array); typedef void (GLAPIENTRY * PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEEXTPROC) (GLuint buffer, GLintptr offset, GLsizeiptr length); typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERDRAWBUFFEREXTPROC) (GLuint framebuffer, GLenum mode); typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERDRAWBUFFERSEXTPROC) (GLuint framebuffer, GLsizei n, const GLenum* bufs); typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERREADBUFFEREXTPROC) (GLuint framebuffer, GLenum mode); typedef void (GLAPIENTRY * PFNGLGENERATEMULTITEXMIPMAPEXTPROC) (GLenum texunit, GLenum target); typedef void (GLAPIENTRY * PFNGLGENERATETEXTUREMIPMAPEXTPROC) (GLuint texture, GLenum target); typedef void (GLAPIENTRY * PFNGLGETCOMPRESSEDMULTITEXIMAGEEXTPROC) (GLenum texunit, GLenum target, GLint level, void* img); typedef void (GLAPIENTRY * PFNGLGETCOMPRESSEDTEXTUREIMAGEEXTPROC) (GLuint texture, GLenum target, GLint level, void* img); typedef void (GLAPIENTRY * PFNGLGETDOUBLEINDEXEDVEXTPROC) (GLenum target, GLuint index, GLdouble* params); typedef void (GLAPIENTRY * PFNGLGETDOUBLEI_VEXTPROC) (GLenum pname, GLuint index, GLdouble* params); typedef void (GLAPIENTRY * PFNGLGETFLOATINDEXEDVEXTPROC) (GLenum target, GLuint index, GLfloat* params); typedef void (GLAPIENTRY * PFNGLGETFLOATI_VEXTPROC) (GLenum pname, GLuint index, GLfloat* params); typedef void (GLAPIENTRY * PFNGLGETFRAMEBUFFERPARAMETERIVEXTPROC) (GLuint framebuffer, GLenum pname, GLint* param); typedef void (GLAPIENTRY * PFNGLGETMULTITEXENVFVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLfloat* params); typedef void (GLAPIENTRY * PFNGLGETMULTITEXENVIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLGETMULTITEXGENDVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLdouble* params); typedef void (GLAPIENTRY * PFNGLGETMULTITEXGENFVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLfloat* params); typedef void (GLAPIENTRY * PFNGLGETMULTITEXGENIVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLGETMULTITEXIMAGEEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum format, GLenum type, void* pixels); typedef void (GLAPIENTRY * PFNGLGETMULTITEXLEVELPARAMETERFVEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum pname, GLfloat* params); typedef void (GLAPIENTRY * PFNGLGETMULTITEXLEVELPARAMETERIVEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLGETMULTITEXPARAMETERIIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLGETMULTITEXPARAMETERIUIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLuint* params); typedef void (GLAPIENTRY * PFNGLGETMULTITEXPARAMETERFVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLfloat* params); typedef void (GLAPIENTRY * PFNGLGETMULTITEXPARAMETERIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLGETNAMEDBUFFERPARAMETERIVEXTPROC) (GLuint buffer, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLGETNAMEDBUFFERPOINTERVEXTPROC) (GLuint buffer, GLenum pname, void** params); typedef void (GLAPIENTRY * PFNGLGETNAMEDBUFFERSUBDATAEXTPROC) (GLuint buffer, GLintptr offset, GLsizeiptr size, void* data); typedef void (GLAPIENTRY * PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC) (GLuint framebuffer, GLenum attachment, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLGETNAMEDPROGRAMLOCALPARAMETERIIVEXTPROC) (GLuint program, GLenum target, GLuint index, GLint* params); typedef void (GLAPIENTRY * PFNGLGETNAMEDPROGRAMLOCALPARAMETERIUIVEXTPROC) (GLuint program, GLenum target, GLuint index, GLuint* params); typedef void (GLAPIENTRY * PFNGLGETNAMEDPROGRAMLOCALPARAMETERDVEXTPROC) (GLuint program, GLenum target, GLuint index, GLdouble* params); typedef void (GLAPIENTRY * PFNGLGETNAMEDPROGRAMLOCALPARAMETERFVEXTPROC) (GLuint program, GLenum target, GLuint index, GLfloat* params); typedef void (GLAPIENTRY * PFNGLGETNAMEDPROGRAMSTRINGEXTPROC) (GLuint program, GLenum target, GLenum pname, void* string); typedef void (GLAPIENTRY * PFNGLGETNAMEDPROGRAMIVEXTPROC) (GLuint program, GLenum target, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLGETNAMEDRENDERBUFFERPARAMETERIVEXTPROC) (GLuint renderbuffer, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLGETPOINTERINDEXEDVEXTPROC) (GLenum target, GLuint index, GLvoid** params); typedef void (GLAPIENTRY * PFNGLGETPOINTERI_VEXTPROC) (GLenum pname, GLuint index, GLvoid** params); typedef void (GLAPIENTRY * PFNGLGETTEXTUREIMAGEEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum format, GLenum type, void* pixels); typedef void (GLAPIENTRY * PFNGLGETTEXTURELEVELPARAMETERFVEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum pname, GLfloat* params); typedef void (GLAPIENTRY * PFNGLGETTEXTURELEVELPARAMETERIVEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLGETTEXTUREPARAMETERIIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLGETTEXTUREPARAMETERIUIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLuint* params); typedef void (GLAPIENTRY * PFNGLGETTEXTUREPARAMETERFVEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLfloat* params); typedef void (GLAPIENTRY * PFNGLGETTEXTUREPARAMETERIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLGETVERTEXARRAYINTEGERI_VEXTPROC) (GLuint vaobj, GLuint index, GLenum pname, GLint* param); typedef void (GLAPIENTRY * PFNGLGETVERTEXARRAYINTEGERVEXTPROC) (GLuint vaobj, GLenum pname, GLint* param); typedef void (GLAPIENTRY * PFNGLGETVERTEXARRAYPOINTERI_VEXTPROC) (GLuint vaobj, GLuint index, GLenum pname, GLvoid** param); typedef void (GLAPIENTRY * PFNGLGETVERTEXARRAYPOINTERVEXTPROC) (GLuint vaobj, GLenum pname, GLvoid** param); typedef GLvoid * (GLAPIENTRY * PFNGLMAPNAMEDBUFFEREXTPROC) (GLuint buffer, GLenum access); typedef GLvoid * (GLAPIENTRY * PFNGLMAPNAMEDBUFFERRANGEEXTPROC) (GLuint buffer, GLintptr offset, GLsizeiptr length, GLbitfield access); typedef void (GLAPIENTRY * PFNGLMATRIXFRUSTUMEXTPROC) (GLenum matrixMode, GLdouble l, GLdouble r, GLdouble b, GLdouble t, GLdouble n, GLdouble f); typedef void (GLAPIENTRY * PFNGLMATRIXLOADIDENTITYEXTPROC) (GLenum matrixMode); typedef void (GLAPIENTRY * PFNGLMATRIXLOADTRANSPOSEDEXTPROC) (GLenum matrixMode, const GLdouble* m); typedef void (GLAPIENTRY * PFNGLMATRIXLOADTRANSPOSEFEXTPROC) (GLenum matrixMode, const GLfloat* m); typedef void (GLAPIENTRY * PFNGLMATRIXLOADDEXTPROC) (GLenum matrixMode, const GLdouble* m); typedef void (GLAPIENTRY * PFNGLMATRIXLOADFEXTPROC) (GLenum matrixMode, const GLfloat* m); typedef void (GLAPIENTRY * PFNGLMATRIXMULTTRANSPOSEDEXTPROC) (GLenum matrixMode, const GLdouble* m); typedef void (GLAPIENTRY * PFNGLMATRIXMULTTRANSPOSEFEXTPROC) (GLenum matrixMode, const GLfloat* m); typedef void (GLAPIENTRY * PFNGLMATRIXMULTDEXTPROC) (GLenum matrixMode, const GLdouble* m); typedef void (GLAPIENTRY * PFNGLMATRIXMULTFEXTPROC) (GLenum matrixMode, const GLfloat* m); typedef void (GLAPIENTRY * PFNGLMATRIXORTHOEXTPROC) (GLenum matrixMode, GLdouble l, GLdouble r, GLdouble b, GLdouble t, GLdouble n, GLdouble f); typedef void (GLAPIENTRY * PFNGLMATRIXPOPEXTPROC) (GLenum matrixMode); typedef void (GLAPIENTRY * PFNGLMATRIXPUSHEXTPROC) (GLenum matrixMode); typedef void (GLAPIENTRY * PFNGLMATRIXROTATEDEXTPROC) (GLenum matrixMode, GLdouble angle, GLdouble x, GLdouble y, GLdouble z); typedef void (GLAPIENTRY * PFNGLMATRIXROTATEFEXTPROC) (GLenum matrixMode, GLfloat angle, GLfloat x, GLfloat y, GLfloat z); typedef void (GLAPIENTRY * PFNGLMATRIXSCALEDEXTPROC) (GLenum matrixMode, GLdouble x, GLdouble y, GLdouble z); typedef void (GLAPIENTRY * PFNGLMATRIXSCALEFEXTPROC) (GLenum matrixMode, GLfloat x, GLfloat y, GLfloat z); typedef void (GLAPIENTRY * PFNGLMATRIXTRANSLATEDEXTPROC) (GLenum matrixMode, GLdouble x, GLdouble y, GLdouble z); typedef void (GLAPIENTRY * PFNGLMATRIXTRANSLATEFEXTPROC) (GLenum matrixMode, GLfloat x, GLfloat y, GLfloat z); typedef void (GLAPIENTRY * PFNGLMULTITEXBUFFEREXTPROC) (GLenum texunit, GLenum target, GLenum internalformat, GLuint buffer); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORDPOINTEREXTPROC) (GLenum texunit, GLint size, GLenum type, GLsizei stride, const void* pointer); typedef void (GLAPIENTRY * PFNGLMULTITEXENVFEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLfloat param); typedef void (GLAPIENTRY * PFNGLMULTITEXENVFVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLfloat* params); typedef void (GLAPIENTRY * PFNGLMULTITEXENVIEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint param); typedef void (GLAPIENTRY * PFNGLMULTITEXENVIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLint* params); typedef void (GLAPIENTRY * PFNGLMULTITEXGENDEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLdouble param); typedef void (GLAPIENTRY * PFNGLMULTITEXGENDVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, const GLdouble* params); typedef void (GLAPIENTRY * PFNGLMULTITEXGENFEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLfloat param); typedef void (GLAPIENTRY * PFNGLMULTITEXGENFVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, const GLfloat* params); typedef void (GLAPIENTRY * PFNGLMULTITEXGENIEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLint param); typedef void (GLAPIENTRY * PFNGLMULTITEXGENIVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, const GLint* params); typedef void (GLAPIENTRY * PFNGLMULTITEXIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const void* pixels); typedef void (GLAPIENTRY * PFNGLMULTITEXIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void* pixels); typedef void (GLAPIENTRY * PFNGLMULTITEXIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void* pixels); typedef void (GLAPIENTRY * PFNGLMULTITEXPARAMETERIIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLint* params); typedef void (GLAPIENTRY * PFNGLMULTITEXPARAMETERIUIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLuint* params); typedef void (GLAPIENTRY * PFNGLMULTITEXPARAMETERFEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLfloat param); typedef void (GLAPIENTRY * PFNGLMULTITEXPARAMETERFVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLfloat* param); typedef void (GLAPIENTRY * PFNGLMULTITEXPARAMETERIEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint param); typedef void (GLAPIENTRY * PFNGLMULTITEXPARAMETERIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLint* param); typedef void (GLAPIENTRY * PFNGLMULTITEXRENDERBUFFEREXTPROC) (GLenum texunit, GLenum target, GLuint renderbuffer); typedef void (GLAPIENTRY * PFNGLMULTITEXSUBIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void* pixels); typedef void (GLAPIENTRY * PFNGLMULTITEXSUBIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void* pixels); typedef void (GLAPIENTRY * PFNGLMULTITEXSUBIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void* pixels); typedef void (GLAPIENTRY * PFNGLNAMEDBUFFERDATAEXTPROC) (GLuint buffer, GLsizeiptr size, const void* data, GLenum usage); typedef void (GLAPIENTRY * PFNGLNAMEDBUFFERSUBDATAEXTPROC) (GLuint buffer, GLintptr offset, GLsizeiptr size, const void* data); typedef void (GLAPIENTRY * PFNGLNAMEDCOPYBUFFERSUBDATAEXTPROC) (GLuint readBuffer, GLuint writeBuffer, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERRENDERBUFFEREXTPROC) (GLuint framebuffer, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERTEXTURE1DEXTPROC) (GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level); typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERTEXTURE2DEXTPROC) (GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level); typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERTEXTURE3DEXTPROC) (GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERTEXTUREEXTPROC) (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level); typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERTEXTUREFACEEXTPROC) (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLenum face); typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERTEXTURELAYEREXTPROC) (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLint layer); typedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMLOCALPARAMETER4DEXTPROC) (GLuint program, GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); typedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMLOCALPARAMETER4DVEXTPROC) (GLuint program, GLenum target, GLuint index, const GLdouble* params); typedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMLOCALPARAMETER4FEXTPROC) (GLuint program, GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); typedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMLOCALPARAMETER4FVEXTPROC) (GLuint program, GLenum target, GLuint index, const GLfloat* params); typedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMLOCALPARAMETERI4IEXTPROC) (GLuint program, GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w); typedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMLOCALPARAMETERI4IVEXTPROC) (GLuint program, GLenum target, GLuint index, const GLint* params); typedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMLOCALPARAMETERI4UIEXTPROC) (GLuint program, GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); typedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMLOCALPARAMETERI4UIVEXTPROC) (GLuint program, GLenum target, GLuint index, const GLuint* params); typedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMLOCALPARAMETERS4FVEXTPROC) (GLuint program, GLenum target, GLuint index, GLsizei count, const GLfloat* params); typedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMLOCALPARAMETERSI4IVEXTPROC) (GLuint program, GLenum target, GLuint index, GLsizei count, const GLint* params); typedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMLOCALPARAMETERSI4UIVEXTPROC) (GLuint program, GLenum target, GLuint index, GLsizei count, const GLuint* params); typedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMSTRINGEXTPROC) (GLuint program, GLenum target, GLenum format, GLsizei len, const void* string); typedef void (GLAPIENTRY * PFNGLNAMEDRENDERBUFFERSTORAGEEXTPROC) (GLuint renderbuffer, GLenum internalformat, GLsizei width, GLsizei height); typedef void (GLAPIENTRY * PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLECOVERAGEEXTPROC) (GLuint renderbuffer, GLsizei coverageSamples, GLsizei colorSamples, GLenum internalformat, GLsizei width, GLsizei height); typedef void (GLAPIENTRY * PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC) (GLuint renderbuffer, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1DEXTPROC) (GLuint program, GLint location, GLdouble x); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1DVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLdouble *value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1FEXTPROC) (GLuint program, GLint location, GLfloat v0); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1IEXTPROC) (GLuint program, GLint location, GLint v0); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1UIEXTPROC) (GLuint program, GLint location, GLuint v0); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2DEXTPROC) (GLuint program, GLint location, GLdouble x, GLdouble y); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2DVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLdouble *value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2FEXTPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2IEXTPROC) (GLuint program, GLint location, GLint v0, GLint v1); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2UIEXTPROC) (GLuint program, GLint location, GLuint v0, GLuint v1); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3DEXTPROC) (GLuint program, GLint location, GLdouble x, GLdouble y, GLdouble z); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3DVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLdouble *value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3FEXTPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3IEXTPROC) (GLuint program, GLint location, GLint v0, GLint v1, GLint v2); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3UIEXTPROC) (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4DEXTPROC) (GLuint program, GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4DVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLdouble *value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4FEXTPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4IEXTPROC) (GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4UIEXTPROC) (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX2DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX2FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX2X3DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX2X3FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX2X4DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX2X4FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX3DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX3FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX3X2DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX3X2FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX3X4DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX3X4FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX4DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX4FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX4X2DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX4X2FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX4X3DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX4X3FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); typedef void (GLAPIENTRY * PFNGLPUSHCLIENTATTRIBDEFAULTEXTPROC) (GLbitfield mask); typedef void (GLAPIENTRY * PFNGLTEXTUREBUFFEREXTPROC) (GLuint texture, GLenum target, GLenum internalformat, GLuint buffer); typedef void (GLAPIENTRY * PFNGLTEXTUREIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const void* pixels); typedef void (GLAPIENTRY * PFNGLTEXTUREIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void* pixels); typedef void (GLAPIENTRY * PFNGLTEXTUREIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void* pixels); typedef void (GLAPIENTRY * PFNGLTEXTUREPARAMETERIIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, const GLint* params); typedef void (GLAPIENTRY * PFNGLTEXTUREPARAMETERIUIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, const GLuint* params); typedef void (GLAPIENTRY * PFNGLTEXTUREPARAMETERFEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLfloat param); typedef void (GLAPIENTRY * PFNGLTEXTUREPARAMETERFVEXTPROC) (GLuint texture, GLenum target, GLenum pname, const GLfloat* param); typedef void (GLAPIENTRY * PFNGLTEXTUREPARAMETERIEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLint param); typedef void (GLAPIENTRY * PFNGLTEXTUREPARAMETERIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, const GLint* param); typedef void (GLAPIENTRY * PFNGLTEXTURERENDERBUFFEREXTPROC) (GLuint texture, GLenum target, GLuint renderbuffer); typedef void (GLAPIENTRY * PFNGLTEXTURESUBIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void* pixels); typedef void (GLAPIENTRY * PFNGLTEXTURESUBIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void* pixels); typedef void (GLAPIENTRY * PFNGLTEXTURESUBIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void* pixels); typedef GLboolean (GLAPIENTRY * PFNGLUNMAPNAMEDBUFFEREXTPROC) (GLuint buffer); typedef void (GLAPIENTRY * PFNGLVERTEXARRAYCOLOROFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset); typedef void (GLAPIENTRY * PFNGLVERTEXARRAYEDGEFLAGOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLsizei stride, GLintptr offset); typedef void (GLAPIENTRY * PFNGLVERTEXARRAYFOGCOORDOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLenum type, GLsizei stride, GLintptr offset); typedef void (GLAPIENTRY * PFNGLVERTEXARRAYINDEXOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLenum type, GLsizei stride, GLintptr offset); typedef void (GLAPIENTRY * PFNGLVERTEXARRAYMULTITEXCOORDOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLenum texunit, GLint size, GLenum type, GLsizei stride, GLintptr offset); typedef void (GLAPIENTRY * PFNGLVERTEXARRAYNORMALOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLenum type, GLsizei stride, GLintptr offset); typedef void (GLAPIENTRY * PFNGLVERTEXARRAYSECONDARYCOLOROFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset); typedef void (GLAPIENTRY * PFNGLVERTEXARRAYTEXCOORDOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset); typedef void (GLAPIENTRY * PFNGLVERTEXARRAYVERTEXATTRIBIOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLuint index, GLint size, GLenum type, GLsizei stride, GLintptr offset); typedef void (GLAPIENTRY * PFNGLVERTEXARRAYVERTEXATTRIBOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, GLintptr offset); typedef void (GLAPIENTRY * PFNGLVERTEXARRAYVERTEXOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset); #define glBindMultiTextureEXT GLEW_GET_FUN(__glewBindMultiTextureEXT) #define glCheckNamedFramebufferStatusEXT GLEW_GET_FUN(__glewCheckNamedFramebufferStatusEXT) #define glClientAttribDefaultEXT GLEW_GET_FUN(__glewClientAttribDefaultEXT) #define glCompressedMultiTexImage1DEXT GLEW_GET_FUN(__glewCompressedMultiTexImage1DEXT) #define glCompressedMultiTexImage2DEXT GLEW_GET_FUN(__glewCompressedMultiTexImage2DEXT) #define glCompressedMultiTexImage3DEXT GLEW_GET_FUN(__glewCompressedMultiTexImage3DEXT) #define glCompressedMultiTexSubImage1DEXT GLEW_GET_FUN(__glewCompressedMultiTexSubImage1DEXT) #define glCompressedMultiTexSubImage2DEXT GLEW_GET_FUN(__glewCompressedMultiTexSubImage2DEXT) #define glCompressedMultiTexSubImage3DEXT GLEW_GET_FUN(__glewCompressedMultiTexSubImage3DEXT) #define glCompressedTextureImage1DEXT GLEW_GET_FUN(__glewCompressedTextureImage1DEXT) #define glCompressedTextureImage2DEXT GLEW_GET_FUN(__glewCompressedTextureImage2DEXT) #define glCompressedTextureImage3DEXT GLEW_GET_FUN(__glewCompressedTextureImage3DEXT) #define glCompressedTextureSubImage1DEXT GLEW_GET_FUN(__glewCompressedTextureSubImage1DEXT) #define glCompressedTextureSubImage2DEXT GLEW_GET_FUN(__glewCompressedTextureSubImage2DEXT) #define glCompressedTextureSubImage3DEXT GLEW_GET_FUN(__glewCompressedTextureSubImage3DEXT) #define glCopyMultiTexImage1DEXT GLEW_GET_FUN(__glewCopyMultiTexImage1DEXT) #define glCopyMultiTexImage2DEXT GLEW_GET_FUN(__glewCopyMultiTexImage2DEXT) #define glCopyMultiTexSubImage1DEXT GLEW_GET_FUN(__glewCopyMultiTexSubImage1DEXT) #define glCopyMultiTexSubImage2DEXT GLEW_GET_FUN(__glewCopyMultiTexSubImage2DEXT) #define glCopyMultiTexSubImage3DEXT GLEW_GET_FUN(__glewCopyMultiTexSubImage3DEXT) #define glCopyTextureImage1DEXT GLEW_GET_FUN(__glewCopyTextureImage1DEXT) #define glCopyTextureImage2DEXT GLEW_GET_FUN(__glewCopyTextureImage2DEXT) #define glCopyTextureSubImage1DEXT GLEW_GET_FUN(__glewCopyTextureSubImage1DEXT) #define glCopyTextureSubImage2DEXT GLEW_GET_FUN(__glewCopyTextureSubImage2DEXT) #define glCopyTextureSubImage3DEXT GLEW_GET_FUN(__glewCopyTextureSubImage3DEXT) #define glDisableClientStateIndexedEXT GLEW_GET_FUN(__glewDisableClientStateIndexedEXT) #define glDisableClientStateiEXT GLEW_GET_FUN(__glewDisableClientStateiEXT) #define glDisableVertexArrayAttribEXT GLEW_GET_FUN(__glewDisableVertexArrayAttribEXT) #define glDisableVertexArrayEXT GLEW_GET_FUN(__glewDisableVertexArrayEXT) #define glEnableClientStateIndexedEXT GLEW_GET_FUN(__glewEnableClientStateIndexedEXT) #define glEnableClientStateiEXT GLEW_GET_FUN(__glewEnableClientStateiEXT) #define glEnableVertexArrayAttribEXT GLEW_GET_FUN(__glewEnableVertexArrayAttribEXT) #define glEnableVertexArrayEXT GLEW_GET_FUN(__glewEnableVertexArrayEXT) #define glFlushMappedNamedBufferRangeEXT GLEW_GET_FUN(__glewFlushMappedNamedBufferRangeEXT) #define glFramebufferDrawBufferEXT GLEW_GET_FUN(__glewFramebufferDrawBufferEXT) #define glFramebufferDrawBuffersEXT GLEW_GET_FUN(__glewFramebufferDrawBuffersEXT) #define glFramebufferReadBufferEXT GLEW_GET_FUN(__glewFramebufferReadBufferEXT) #define glGenerateMultiTexMipmapEXT GLEW_GET_FUN(__glewGenerateMultiTexMipmapEXT) #define glGenerateTextureMipmapEXT GLEW_GET_FUN(__glewGenerateTextureMipmapEXT) #define glGetCompressedMultiTexImageEXT GLEW_GET_FUN(__glewGetCompressedMultiTexImageEXT) #define glGetCompressedTextureImageEXT GLEW_GET_FUN(__glewGetCompressedTextureImageEXT) #define glGetDoubleIndexedvEXT GLEW_GET_FUN(__glewGetDoubleIndexedvEXT) #define glGetDoublei_vEXT GLEW_GET_FUN(__glewGetDoublei_vEXT) #define glGetFloatIndexedvEXT GLEW_GET_FUN(__glewGetFloatIndexedvEXT) #define glGetFloati_vEXT GLEW_GET_FUN(__glewGetFloati_vEXT) #define glGetFramebufferParameterivEXT GLEW_GET_FUN(__glewGetFramebufferParameterivEXT) #define glGetMultiTexEnvfvEXT GLEW_GET_FUN(__glewGetMultiTexEnvfvEXT) #define glGetMultiTexEnvivEXT GLEW_GET_FUN(__glewGetMultiTexEnvivEXT) #define glGetMultiTexGendvEXT GLEW_GET_FUN(__glewGetMultiTexGendvEXT) #define glGetMultiTexGenfvEXT GLEW_GET_FUN(__glewGetMultiTexGenfvEXT) #define glGetMultiTexGenivEXT GLEW_GET_FUN(__glewGetMultiTexGenivEXT) #define glGetMultiTexImageEXT GLEW_GET_FUN(__glewGetMultiTexImageEXT) #define glGetMultiTexLevelParameterfvEXT GLEW_GET_FUN(__glewGetMultiTexLevelParameterfvEXT) #define glGetMultiTexLevelParameterivEXT GLEW_GET_FUN(__glewGetMultiTexLevelParameterivEXT) #define glGetMultiTexParameterIivEXT GLEW_GET_FUN(__glewGetMultiTexParameterIivEXT) #define glGetMultiTexParameterIuivEXT GLEW_GET_FUN(__glewGetMultiTexParameterIuivEXT) #define glGetMultiTexParameterfvEXT GLEW_GET_FUN(__glewGetMultiTexParameterfvEXT) #define glGetMultiTexParameterivEXT GLEW_GET_FUN(__glewGetMultiTexParameterivEXT) #define glGetNamedBufferParameterivEXT GLEW_GET_FUN(__glewGetNamedBufferParameterivEXT) #define glGetNamedBufferPointervEXT GLEW_GET_FUN(__glewGetNamedBufferPointervEXT) #define glGetNamedBufferSubDataEXT GLEW_GET_FUN(__glewGetNamedBufferSubDataEXT) #define glGetNamedFramebufferAttachmentParameterivEXT GLEW_GET_FUN(__glewGetNamedFramebufferAttachmentParameterivEXT) #define glGetNamedProgramLocalParameterIivEXT GLEW_GET_FUN(__glewGetNamedProgramLocalParameterIivEXT) #define glGetNamedProgramLocalParameterIuivEXT GLEW_GET_FUN(__glewGetNamedProgramLocalParameterIuivEXT) #define glGetNamedProgramLocalParameterdvEXT GLEW_GET_FUN(__glewGetNamedProgramLocalParameterdvEXT) #define glGetNamedProgramLocalParameterfvEXT GLEW_GET_FUN(__glewGetNamedProgramLocalParameterfvEXT) #define glGetNamedProgramStringEXT GLEW_GET_FUN(__glewGetNamedProgramStringEXT) #define glGetNamedProgramivEXT GLEW_GET_FUN(__glewGetNamedProgramivEXT) #define glGetNamedRenderbufferParameterivEXT GLEW_GET_FUN(__glewGetNamedRenderbufferParameterivEXT) #define glGetPointerIndexedvEXT GLEW_GET_FUN(__glewGetPointerIndexedvEXT) #define glGetPointeri_vEXT GLEW_GET_FUN(__glewGetPointeri_vEXT) #define glGetTextureImageEXT GLEW_GET_FUN(__glewGetTextureImageEXT) #define glGetTextureLevelParameterfvEXT GLEW_GET_FUN(__glewGetTextureLevelParameterfvEXT) #define glGetTextureLevelParameterivEXT GLEW_GET_FUN(__glewGetTextureLevelParameterivEXT) #define glGetTextureParameterIivEXT GLEW_GET_FUN(__glewGetTextureParameterIivEXT) #define glGetTextureParameterIuivEXT GLEW_GET_FUN(__glewGetTextureParameterIuivEXT) #define glGetTextureParameterfvEXT GLEW_GET_FUN(__glewGetTextureParameterfvEXT) #define glGetTextureParameterivEXT GLEW_GET_FUN(__glewGetTextureParameterivEXT) #define glGetVertexArrayIntegeri_vEXT GLEW_GET_FUN(__glewGetVertexArrayIntegeri_vEXT) #define glGetVertexArrayIntegervEXT GLEW_GET_FUN(__glewGetVertexArrayIntegervEXT) #define glGetVertexArrayPointeri_vEXT GLEW_GET_FUN(__glewGetVertexArrayPointeri_vEXT) #define glGetVertexArrayPointervEXT GLEW_GET_FUN(__glewGetVertexArrayPointervEXT) #define glMapNamedBufferEXT GLEW_GET_FUN(__glewMapNamedBufferEXT) #define glMapNamedBufferRangeEXT GLEW_GET_FUN(__glewMapNamedBufferRangeEXT) #define glMatrixFrustumEXT GLEW_GET_FUN(__glewMatrixFrustumEXT) #define glMatrixLoadIdentityEXT GLEW_GET_FUN(__glewMatrixLoadIdentityEXT) #define glMatrixLoadTransposedEXT GLEW_GET_FUN(__glewMatrixLoadTransposedEXT) #define glMatrixLoadTransposefEXT GLEW_GET_FUN(__glewMatrixLoadTransposefEXT) #define glMatrixLoaddEXT GLEW_GET_FUN(__glewMatrixLoaddEXT) #define glMatrixLoadfEXT GLEW_GET_FUN(__glewMatrixLoadfEXT) #define glMatrixMultTransposedEXT GLEW_GET_FUN(__glewMatrixMultTransposedEXT) #define glMatrixMultTransposefEXT GLEW_GET_FUN(__glewMatrixMultTransposefEXT) #define glMatrixMultdEXT GLEW_GET_FUN(__glewMatrixMultdEXT) #define glMatrixMultfEXT GLEW_GET_FUN(__glewMatrixMultfEXT) #define glMatrixOrthoEXT GLEW_GET_FUN(__glewMatrixOrthoEXT) #define glMatrixPopEXT GLEW_GET_FUN(__glewMatrixPopEXT) #define glMatrixPushEXT GLEW_GET_FUN(__glewMatrixPushEXT) #define glMatrixRotatedEXT GLEW_GET_FUN(__glewMatrixRotatedEXT) #define glMatrixRotatefEXT GLEW_GET_FUN(__glewMatrixRotatefEXT) #define glMatrixScaledEXT GLEW_GET_FUN(__glewMatrixScaledEXT) #define glMatrixScalefEXT GLEW_GET_FUN(__glewMatrixScalefEXT) #define glMatrixTranslatedEXT GLEW_GET_FUN(__glewMatrixTranslatedEXT) #define glMatrixTranslatefEXT GLEW_GET_FUN(__glewMatrixTranslatefEXT) #define glMultiTexBufferEXT GLEW_GET_FUN(__glewMultiTexBufferEXT) #define glMultiTexCoordPointerEXT GLEW_GET_FUN(__glewMultiTexCoordPointerEXT) #define glMultiTexEnvfEXT GLEW_GET_FUN(__glewMultiTexEnvfEXT) #define glMultiTexEnvfvEXT GLEW_GET_FUN(__glewMultiTexEnvfvEXT) #define glMultiTexEnviEXT GLEW_GET_FUN(__glewMultiTexEnviEXT) #define glMultiTexEnvivEXT GLEW_GET_FUN(__glewMultiTexEnvivEXT) #define glMultiTexGendEXT GLEW_GET_FUN(__glewMultiTexGendEXT) #define glMultiTexGendvEXT GLEW_GET_FUN(__glewMultiTexGendvEXT) #define glMultiTexGenfEXT GLEW_GET_FUN(__glewMultiTexGenfEXT) #define glMultiTexGenfvEXT GLEW_GET_FUN(__glewMultiTexGenfvEXT) #define glMultiTexGeniEXT GLEW_GET_FUN(__glewMultiTexGeniEXT) #define glMultiTexGenivEXT GLEW_GET_FUN(__glewMultiTexGenivEXT) #define glMultiTexImage1DEXT GLEW_GET_FUN(__glewMultiTexImage1DEXT) #define glMultiTexImage2DEXT GLEW_GET_FUN(__glewMultiTexImage2DEXT) #define glMultiTexImage3DEXT GLEW_GET_FUN(__glewMultiTexImage3DEXT) #define glMultiTexParameterIivEXT GLEW_GET_FUN(__glewMultiTexParameterIivEXT) #define glMultiTexParameterIuivEXT GLEW_GET_FUN(__glewMultiTexParameterIuivEXT) #define glMultiTexParameterfEXT GLEW_GET_FUN(__glewMultiTexParameterfEXT) #define glMultiTexParameterfvEXT GLEW_GET_FUN(__glewMultiTexParameterfvEXT) #define glMultiTexParameteriEXT GLEW_GET_FUN(__glewMultiTexParameteriEXT) #define glMultiTexParameterivEXT GLEW_GET_FUN(__glewMultiTexParameterivEXT) #define glMultiTexRenderbufferEXT GLEW_GET_FUN(__glewMultiTexRenderbufferEXT) #define glMultiTexSubImage1DEXT GLEW_GET_FUN(__glewMultiTexSubImage1DEXT) #define glMultiTexSubImage2DEXT GLEW_GET_FUN(__glewMultiTexSubImage2DEXT) #define glMultiTexSubImage3DEXT GLEW_GET_FUN(__glewMultiTexSubImage3DEXT) #define glNamedBufferDataEXT GLEW_GET_FUN(__glewNamedBufferDataEXT) #define glNamedBufferSubDataEXT GLEW_GET_FUN(__glewNamedBufferSubDataEXT) #define glNamedCopyBufferSubDataEXT GLEW_GET_FUN(__glewNamedCopyBufferSubDataEXT) #define glNamedFramebufferRenderbufferEXT GLEW_GET_FUN(__glewNamedFramebufferRenderbufferEXT) #define glNamedFramebufferTexture1DEXT GLEW_GET_FUN(__glewNamedFramebufferTexture1DEXT) #define glNamedFramebufferTexture2DEXT GLEW_GET_FUN(__glewNamedFramebufferTexture2DEXT) #define glNamedFramebufferTexture3DEXT GLEW_GET_FUN(__glewNamedFramebufferTexture3DEXT) #define glNamedFramebufferTextureEXT GLEW_GET_FUN(__glewNamedFramebufferTextureEXT) #define glNamedFramebufferTextureFaceEXT GLEW_GET_FUN(__glewNamedFramebufferTextureFaceEXT) #define glNamedFramebufferTextureLayerEXT GLEW_GET_FUN(__glewNamedFramebufferTextureLayerEXT) #define glNamedProgramLocalParameter4dEXT GLEW_GET_FUN(__glewNamedProgramLocalParameter4dEXT) #define glNamedProgramLocalParameter4dvEXT GLEW_GET_FUN(__glewNamedProgramLocalParameter4dvEXT) #define glNamedProgramLocalParameter4fEXT GLEW_GET_FUN(__glewNamedProgramLocalParameter4fEXT) #define glNamedProgramLocalParameter4fvEXT GLEW_GET_FUN(__glewNamedProgramLocalParameter4fvEXT) #define glNamedProgramLocalParameterI4iEXT GLEW_GET_FUN(__glewNamedProgramLocalParameterI4iEXT) #define glNamedProgramLocalParameterI4ivEXT GLEW_GET_FUN(__glewNamedProgramLocalParameterI4ivEXT) #define glNamedProgramLocalParameterI4uiEXT GLEW_GET_FUN(__glewNamedProgramLocalParameterI4uiEXT) #define glNamedProgramLocalParameterI4uivEXT GLEW_GET_FUN(__glewNamedProgramLocalParameterI4uivEXT) #define glNamedProgramLocalParameters4fvEXT GLEW_GET_FUN(__glewNamedProgramLocalParameters4fvEXT) #define glNamedProgramLocalParametersI4ivEXT GLEW_GET_FUN(__glewNamedProgramLocalParametersI4ivEXT) #define glNamedProgramLocalParametersI4uivEXT GLEW_GET_FUN(__glewNamedProgramLocalParametersI4uivEXT) #define glNamedProgramStringEXT GLEW_GET_FUN(__glewNamedProgramStringEXT) #define glNamedRenderbufferStorageEXT GLEW_GET_FUN(__glewNamedRenderbufferStorageEXT) #define glNamedRenderbufferStorageMultisampleCoverageEXT GLEW_GET_FUN(__glewNamedRenderbufferStorageMultisampleCoverageEXT) #define glNamedRenderbufferStorageMultisampleEXT GLEW_GET_FUN(__glewNamedRenderbufferStorageMultisampleEXT) #define glProgramUniform1dEXT GLEW_GET_FUN(__glewProgramUniform1dEXT) #define glProgramUniform1dvEXT GLEW_GET_FUN(__glewProgramUniform1dvEXT) #define glProgramUniform1fEXT GLEW_GET_FUN(__glewProgramUniform1fEXT) #define glProgramUniform1fvEXT GLEW_GET_FUN(__glewProgramUniform1fvEXT) #define glProgramUniform1iEXT GLEW_GET_FUN(__glewProgramUniform1iEXT) #define glProgramUniform1ivEXT GLEW_GET_FUN(__glewProgramUniform1ivEXT) #define glProgramUniform1uiEXT GLEW_GET_FUN(__glewProgramUniform1uiEXT) #define glProgramUniform1uivEXT GLEW_GET_FUN(__glewProgramUniform1uivEXT) #define glProgramUniform2dEXT GLEW_GET_FUN(__glewProgramUniform2dEXT) #define glProgramUniform2dvEXT GLEW_GET_FUN(__glewProgramUniform2dvEXT) #define glProgramUniform2fEXT GLEW_GET_FUN(__glewProgramUniform2fEXT) #define glProgramUniform2fvEXT GLEW_GET_FUN(__glewProgramUniform2fvEXT) #define glProgramUniform2iEXT GLEW_GET_FUN(__glewProgramUniform2iEXT) #define glProgramUniform2ivEXT GLEW_GET_FUN(__glewProgramUniform2ivEXT) #define glProgramUniform2uiEXT GLEW_GET_FUN(__glewProgramUniform2uiEXT) #define glProgramUniform2uivEXT GLEW_GET_FUN(__glewProgramUniform2uivEXT) #define glProgramUniform3dEXT GLEW_GET_FUN(__glewProgramUniform3dEXT) #define glProgramUniform3dvEXT GLEW_GET_FUN(__glewProgramUniform3dvEXT) #define glProgramUniform3fEXT GLEW_GET_FUN(__glewProgramUniform3fEXT) #define glProgramUniform3fvEXT GLEW_GET_FUN(__glewProgramUniform3fvEXT) #define glProgramUniform3iEXT GLEW_GET_FUN(__glewProgramUniform3iEXT) #define glProgramUniform3ivEXT GLEW_GET_FUN(__glewProgramUniform3ivEXT) #define glProgramUniform3uiEXT GLEW_GET_FUN(__glewProgramUniform3uiEXT) #define glProgramUniform3uivEXT GLEW_GET_FUN(__glewProgramUniform3uivEXT) #define glProgramUniform4dEXT GLEW_GET_FUN(__glewProgramUniform4dEXT) #define glProgramUniform4dvEXT GLEW_GET_FUN(__glewProgramUniform4dvEXT) #define glProgramUniform4fEXT GLEW_GET_FUN(__glewProgramUniform4fEXT) #define glProgramUniform4fvEXT GLEW_GET_FUN(__glewProgramUniform4fvEXT) #define glProgramUniform4iEXT GLEW_GET_FUN(__glewProgramUniform4iEXT) #define glProgramUniform4ivEXT GLEW_GET_FUN(__glewProgramUniform4ivEXT) #define glProgramUniform4uiEXT GLEW_GET_FUN(__glewProgramUniform4uiEXT) #define glProgramUniform4uivEXT GLEW_GET_FUN(__glewProgramUniform4uivEXT) #define glProgramUniformMatrix2dvEXT GLEW_GET_FUN(__glewProgramUniformMatrix2dvEXT) #define glProgramUniformMatrix2fvEXT GLEW_GET_FUN(__glewProgramUniformMatrix2fvEXT) #define glProgramUniformMatrix2x3dvEXT GLEW_GET_FUN(__glewProgramUniformMatrix2x3dvEXT) #define glProgramUniformMatrix2x3fvEXT GLEW_GET_FUN(__glewProgramUniformMatrix2x3fvEXT) #define glProgramUniformMatrix2x4dvEXT GLEW_GET_FUN(__glewProgramUniformMatrix2x4dvEXT) #define glProgramUniformMatrix2x4fvEXT GLEW_GET_FUN(__glewProgramUniformMatrix2x4fvEXT) #define glProgramUniformMatrix3dvEXT GLEW_GET_FUN(__glewProgramUniformMatrix3dvEXT) #define glProgramUniformMatrix3fvEXT GLEW_GET_FUN(__glewProgramUniformMatrix3fvEXT) #define glProgramUniformMatrix3x2dvEXT GLEW_GET_FUN(__glewProgramUniformMatrix3x2dvEXT) #define glProgramUniformMatrix3x2fvEXT GLEW_GET_FUN(__glewProgramUniformMatrix3x2fvEXT) #define glProgramUniformMatrix3x4dvEXT GLEW_GET_FUN(__glewProgramUniformMatrix3x4dvEXT) #define glProgramUniformMatrix3x4fvEXT GLEW_GET_FUN(__glewProgramUniformMatrix3x4fvEXT) #define glProgramUniformMatrix4dvEXT GLEW_GET_FUN(__glewProgramUniformMatrix4dvEXT) #define glProgramUniformMatrix4fvEXT GLEW_GET_FUN(__glewProgramUniformMatrix4fvEXT) #define glProgramUniformMatrix4x2dvEXT GLEW_GET_FUN(__glewProgramUniformMatrix4x2dvEXT) #define glProgramUniformMatrix4x2fvEXT GLEW_GET_FUN(__glewProgramUniformMatrix4x2fvEXT) #define glProgramUniformMatrix4x3dvEXT GLEW_GET_FUN(__glewProgramUniformMatrix4x3dvEXT) #define glProgramUniformMatrix4x3fvEXT GLEW_GET_FUN(__glewProgramUniformMatrix4x3fvEXT) #define glPushClientAttribDefaultEXT GLEW_GET_FUN(__glewPushClientAttribDefaultEXT) #define glTextureBufferEXT GLEW_GET_FUN(__glewTextureBufferEXT) #define glTextureImage1DEXT GLEW_GET_FUN(__glewTextureImage1DEXT) #define glTextureImage2DEXT GLEW_GET_FUN(__glewTextureImage2DEXT) #define glTextureImage3DEXT GLEW_GET_FUN(__glewTextureImage3DEXT) #define glTextureParameterIivEXT GLEW_GET_FUN(__glewTextureParameterIivEXT) #define glTextureParameterIuivEXT GLEW_GET_FUN(__glewTextureParameterIuivEXT) #define glTextureParameterfEXT GLEW_GET_FUN(__glewTextureParameterfEXT) #define glTextureParameterfvEXT GLEW_GET_FUN(__glewTextureParameterfvEXT) #define glTextureParameteriEXT GLEW_GET_FUN(__glewTextureParameteriEXT) #define glTextureParameterivEXT GLEW_GET_FUN(__glewTextureParameterivEXT) #define glTextureRenderbufferEXT GLEW_GET_FUN(__glewTextureRenderbufferEXT) #define glTextureSubImage1DEXT GLEW_GET_FUN(__glewTextureSubImage1DEXT) #define glTextureSubImage2DEXT GLEW_GET_FUN(__glewTextureSubImage2DEXT) #define glTextureSubImage3DEXT GLEW_GET_FUN(__glewTextureSubImage3DEXT) #define glUnmapNamedBufferEXT GLEW_GET_FUN(__glewUnmapNamedBufferEXT) #define glVertexArrayColorOffsetEXT GLEW_GET_FUN(__glewVertexArrayColorOffsetEXT) #define glVertexArrayEdgeFlagOffsetEXT GLEW_GET_FUN(__glewVertexArrayEdgeFlagOffsetEXT) #define glVertexArrayFogCoordOffsetEXT GLEW_GET_FUN(__glewVertexArrayFogCoordOffsetEXT) #define glVertexArrayIndexOffsetEXT GLEW_GET_FUN(__glewVertexArrayIndexOffsetEXT) #define glVertexArrayMultiTexCoordOffsetEXT GLEW_GET_FUN(__glewVertexArrayMultiTexCoordOffsetEXT) #define glVertexArrayNormalOffsetEXT GLEW_GET_FUN(__glewVertexArrayNormalOffsetEXT) #define glVertexArraySecondaryColorOffsetEXT GLEW_GET_FUN(__glewVertexArraySecondaryColorOffsetEXT) #define glVertexArrayTexCoordOffsetEXT GLEW_GET_FUN(__glewVertexArrayTexCoordOffsetEXT) #define glVertexArrayVertexAttribIOffsetEXT GLEW_GET_FUN(__glewVertexArrayVertexAttribIOffsetEXT) #define glVertexArrayVertexAttribOffsetEXT GLEW_GET_FUN(__glewVertexArrayVertexAttribOffsetEXT) #define glVertexArrayVertexOffsetEXT GLEW_GET_FUN(__glewVertexArrayVertexOffsetEXT) #define GLEW_EXT_direct_state_access GLEW_GET_VAR(__GLEW_EXT_direct_state_access) #endif /* GL_EXT_direct_state_access */ /* -------------------------- GL_EXT_draw_buffers2 ------------------------- */ #ifndef GL_EXT_draw_buffers2 #define GL_EXT_draw_buffers2 1 typedef void (GLAPIENTRY * PFNGLCOLORMASKINDEXEDEXTPROC) (GLuint buf, GLboolean r, GLboolean g, GLboolean b, GLboolean a); typedef void (GLAPIENTRY * PFNGLDISABLEINDEXEDEXTPROC) (GLenum target, GLuint index); typedef void (GLAPIENTRY * PFNGLENABLEINDEXEDEXTPROC) (GLenum target, GLuint index); typedef void (GLAPIENTRY * PFNGLGETBOOLEANINDEXEDVEXTPROC) (GLenum value, GLuint index, GLboolean* data); typedef void (GLAPIENTRY * PFNGLGETINTEGERINDEXEDVEXTPROC) (GLenum value, GLuint index, GLint* data); typedef GLboolean (GLAPIENTRY * PFNGLISENABLEDINDEXEDEXTPROC) (GLenum target, GLuint index); #define glColorMaskIndexedEXT GLEW_GET_FUN(__glewColorMaskIndexedEXT) #define glDisableIndexedEXT GLEW_GET_FUN(__glewDisableIndexedEXT) #define glEnableIndexedEXT GLEW_GET_FUN(__glewEnableIndexedEXT) #define glGetBooleanIndexedvEXT GLEW_GET_FUN(__glewGetBooleanIndexedvEXT) #define glGetIntegerIndexedvEXT GLEW_GET_FUN(__glewGetIntegerIndexedvEXT) #define glIsEnabledIndexedEXT GLEW_GET_FUN(__glewIsEnabledIndexedEXT) #define GLEW_EXT_draw_buffers2 GLEW_GET_VAR(__GLEW_EXT_draw_buffers2) #endif /* GL_EXT_draw_buffers2 */ /* ------------------------- GL_EXT_draw_instanced ------------------------- */ #ifndef GL_EXT_draw_instanced #define GL_EXT_draw_instanced 1 typedef void (GLAPIENTRY * PFNGLDRAWARRAYSINSTANCEDEXTPROC) (GLenum mode, GLint start, GLsizei count, GLsizei primcount); typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSINSTANCEDEXTPROC) (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei primcount); #define glDrawArraysInstancedEXT GLEW_GET_FUN(__glewDrawArraysInstancedEXT) #define glDrawElementsInstancedEXT GLEW_GET_FUN(__glewDrawElementsInstancedEXT) #define GLEW_EXT_draw_instanced GLEW_GET_VAR(__GLEW_EXT_draw_instanced) #endif /* GL_EXT_draw_instanced */ /* ----------------------- GL_EXT_draw_range_elements ---------------------- */ #ifndef GL_EXT_draw_range_elements #define GL_EXT_draw_range_elements 1 #define GL_MAX_ELEMENTS_VERTICES_EXT 0x80E8 #define GL_MAX_ELEMENTS_INDICES_EXT 0x80E9 typedef void (GLAPIENTRY * PFNGLDRAWRANGEELEMENTSEXTPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices); #define glDrawRangeElementsEXT GLEW_GET_FUN(__glewDrawRangeElementsEXT) #define GLEW_EXT_draw_range_elements GLEW_GET_VAR(__GLEW_EXT_draw_range_elements) #endif /* GL_EXT_draw_range_elements */ /* ---------------------------- GL_EXT_fog_coord --------------------------- */ #ifndef GL_EXT_fog_coord #define GL_EXT_fog_coord 1 #define GL_FOG_COORDINATE_SOURCE_EXT 0x8450 #define GL_FOG_COORDINATE_EXT 0x8451 #define GL_FRAGMENT_DEPTH_EXT 0x8452 #define GL_CURRENT_FOG_COORDINATE_EXT 0x8453 #define GL_FOG_COORDINATE_ARRAY_TYPE_EXT 0x8454 #define GL_FOG_COORDINATE_ARRAY_STRIDE_EXT 0x8455 #define GL_FOG_COORDINATE_ARRAY_POINTER_EXT 0x8456 #define GL_FOG_COORDINATE_ARRAY_EXT 0x8457 typedef void (GLAPIENTRY * PFNGLFOGCOORDPOINTEREXTPROC) (GLenum type, GLsizei stride, const GLvoid *pointer); typedef void (GLAPIENTRY * PFNGLFOGCOORDDEXTPROC) (GLdouble coord); typedef void (GLAPIENTRY * PFNGLFOGCOORDDVEXTPROC) (const GLdouble *coord); typedef void (GLAPIENTRY * PFNGLFOGCOORDFEXTPROC) (GLfloat coord); typedef void (GLAPIENTRY * PFNGLFOGCOORDFVEXTPROC) (const GLfloat *coord); #define glFogCoordPointerEXT GLEW_GET_FUN(__glewFogCoordPointerEXT) #define glFogCoorddEXT GLEW_GET_FUN(__glewFogCoorddEXT) #define glFogCoorddvEXT GLEW_GET_FUN(__glewFogCoorddvEXT) #define glFogCoordfEXT GLEW_GET_FUN(__glewFogCoordfEXT) #define glFogCoordfvEXT GLEW_GET_FUN(__glewFogCoordfvEXT) #define GLEW_EXT_fog_coord GLEW_GET_VAR(__GLEW_EXT_fog_coord) #endif /* GL_EXT_fog_coord */ /* ------------------------ GL_EXT_fragment_lighting ----------------------- */ #ifndef GL_EXT_fragment_lighting #define GL_EXT_fragment_lighting 1 #define GL_FRAGMENT_LIGHTING_EXT 0x8400 #define GL_FRAGMENT_COLOR_MATERIAL_EXT 0x8401 #define GL_FRAGMENT_COLOR_MATERIAL_FACE_EXT 0x8402 #define GL_FRAGMENT_COLOR_MATERIAL_PARAMETER_EXT 0x8403 #define GL_MAX_FRAGMENT_LIGHTS_EXT 0x8404 #define GL_MAX_ACTIVE_LIGHTS_EXT 0x8405 #define GL_CURRENT_RASTER_NORMAL_EXT 0x8406 #define GL_LIGHT_ENV_MODE_EXT 0x8407 #define GL_FRAGMENT_LIGHT_MODEL_LOCAL_VIEWER_EXT 0x8408 #define GL_FRAGMENT_LIGHT_MODEL_TWO_SIDE_EXT 0x8409 #define GL_FRAGMENT_LIGHT_MODEL_AMBIENT_EXT 0x840A #define GL_FRAGMENT_LIGHT_MODEL_NORMAL_INTERPOLATION_EXT 0x840B #define GL_FRAGMENT_LIGHT0_EXT 0x840C #define GL_FRAGMENT_LIGHT7_EXT 0x8413 typedef void (GLAPIENTRY * PFNGLFRAGMENTCOLORMATERIALEXTPROC) (GLenum face, GLenum mode); typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTMODELFEXTPROC) (GLenum pname, GLfloat param); typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTMODELFVEXTPROC) (GLenum pname, GLfloat* params); typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTMODELIEXTPROC) (GLenum pname, GLint param); typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTMODELIVEXTPROC) (GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTFEXTPROC) (GLenum light, GLenum pname, GLfloat param); typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTFVEXTPROC) (GLenum light, GLenum pname, GLfloat* params); typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTIEXTPROC) (GLenum light, GLenum pname, GLint param); typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTIVEXTPROC) (GLenum light, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLFRAGMENTMATERIALFEXTPROC) (GLenum face, GLenum pname, const GLfloat param); typedef void (GLAPIENTRY * PFNGLFRAGMENTMATERIALFVEXTPROC) (GLenum face, GLenum pname, const GLfloat* params); typedef void (GLAPIENTRY * PFNGLFRAGMENTMATERIALIEXTPROC) (GLenum face, GLenum pname, const GLint param); typedef void (GLAPIENTRY * PFNGLFRAGMENTMATERIALIVEXTPROC) (GLenum face, GLenum pname, const GLint* params); typedef void (GLAPIENTRY * PFNGLGETFRAGMENTLIGHTFVEXTPROC) (GLenum light, GLenum pname, GLfloat* params); typedef void (GLAPIENTRY * PFNGLGETFRAGMENTLIGHTIVEXTPROC) (GLenum light, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLGETFRAGMENTMATERIALFVEXTPROC) (GLenum face, GLenum pname, const GLfloat* params); typedef void (GLAPIENTRY * PFNGLGETFRAGMENTMATERIALIVEXTPROC) (GLenum face, GLenum pname, const GLint* params); typedef void (GLAPIENTRY * PFNGLLIGHTENVIEXTPROC) (GLenum pname, GLint param); #define glFragmentColorMaterialEXT GLEW_GET_FUN(__glewFragmentColorMaterialEXT) #define glFragmentLightModelfEXT GLEW_GET_FUN(__glewFragmentLightModelfEXT) #define glFragmentLightModelfvEXT GLEW_GET_FUN(__glewFragmentLightModelfvEXT) #define glFragmentLightModeliEXT GLEW_GET_FUN(__glewFragmentLightModeliEXT) #define glFragmentLightModelivEXT GLEW_GET_FUN(__glewFragmentLightModelivEXT) #define glFragmentLightfEXT GLEW_GET_FUN(__glewFragmentLightfEXT) #define glFragmentLightfvEXT GLEW_GET_FUN(__glewFragmentLightfvEXT) #define glFragmentLightiEXT GLEW_GET_FUN(__glewFragmentLightiEXT) #define glFragmentLightivEXT GLEW_GET_FUN(__glewFragmentLightivEXT) #define glFragmentMaterialfEXT GLEW_GET_FUN(__glewFragmentMaterialfEXT) #define glFragmentMaterialfvEXT GLEW_GET_FUN(__glewFragmentMaterialfvEXT) #define glFragmentMaterialiEXT GLEW_GET_FUN(__glewFragmentMaterialiEXT) #define glFragmentMaterialivEXT GLEW_GET_FUN(__glewFragmentMaterialivEXT) #define glGetFragmentLightfvEXT GLEW_GET_FUN(__glewGetFragmentLightfvEXT) #define glGetFragmentLightivEXT GLEW_GET_FUN(__glewGetFragmentLightivEXT) #define glGetFragmentMaterialfvEXT GLEW_GET_FUN(__glewGetFragmentMaterialfvEXT) #define glGetFragmentMaterialivEXT GLEW_GET_FUN(__glewGetFragmentMaterialivEXT) #define glLightEnviEXT GLEW_GET_FUN(__glewLightEnviEXT) #define GLEW_EXT_fragment_lighting GLEW_GET_VAR(__GLEW_EXT_fragment_lighting) #endif /* GL_EXT_fragment_lighting */ /* ------------------------ GL_EXT_framebuffer_blit ------------------------ */ #ifndef GL_EXT_framebuffer_blit #define GL_EXT_framebuffer_blit 1 #define GL_DRAW_FRAMEBUFFER_BINDING_EXT 0x8CA6 #define GL_READ_FRAMEBUFFER_EXT 0x8CA8 #define GL_DRAW_FRAMEBUFFER_EXT 0x8CA9 #define GL_READ_FRAMEBUFFER_BINDING_EXT 0x8CAA typedef void (GLAPIENTRY * PFNGLBLITFRAMEBUFFEREXTPROC) (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); #define glBlitFramebufferEXT GLEW_GET_FUN(__glewBlitFramebufferEXT) #define GLEW_EXT_framebuffer_blit GLEW_GET_VAR(__GLEW_EXT_framebuffer_blit) #endif /* GL_EXT_framebuffer_blit */ /* --------------------- GL_EXT_framebuffer_multisample -------------------- */ #ifndef GL_EXT_framebuffer_multisample #define GL_EXT_framebuffer_multisample 1 #define GL_RENDERBUFFER_SAMPLES_EXT 0x8CAB #define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_EXT 0x8D56 #define GL_MAX_SAMPLES_EXT 0x8D57 typedef void (GLAPIENTRY * PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); #define glRenderbufferStorageMultisampleEXT GLEW_GET_FUN(__glewRenderbufferStorageMultisampleEXT) #define GLEW_EXT_framebuffer_multisample GLEW_GET_VAR(__GLEW_EXT_framebuffer_multisample) #endif /* GL_EXT_framebuffer_multisample */ /* --------------- GL_EXT_framebuffer_multisample_blit_scaled -------------- */ #ifndef GL_EXT_framebuffer_multisample_blit_scaled #define GL_EXT_framebuffer_multisample_blit_scaled 1 #define GL_SCALED_RESOLVE_FASTEST_EXT 0x90BA #define GL_SCALED_RESOLVE_NICEST_EXT 0x90BB #define GLEW_EXT_framebuffer_multisample_blit_scaled GLEW_GET_VAR(__GLEW_EXT_framebuffer_multisample_blit_scaled) #endif /* GL_EXT_framebuffer_multisample_blit_scaled */ /* ----------------------- GL_EXT_framebuffer_object ----------------------- */ #ifndef GL_EXT_framebuffer_object #define GL_EXT_framebuffer_object 1 #define GL_INVALID_FRAMEBUFFER_OPERATION_EXT 0x0506 #define GL_MAX_RENDERBUFFER_SIZE_EXT 0x84E8 #define GL_FRAMEBUFFER_BINDING_EXT 0x8CA6 #define GL_RENDERBUFFER_BINDING_EXT 0x8CA7 #define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_EXT 0x8CD0 #define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME_EXT 0x8CD1 #define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL_EXT 0x8CD2 #define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE_EXT 0x8CD3 #define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_3D_ZOFFSET_EXT 0x8CD4 #define GL_FRAMEBUFFER_COMPLETE_EXT 0x8CD5 #define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT 0x8CD6 #define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT 0x8CD7 #define GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT 0x8CD9 #define GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT 0x8CDA #define GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT 0x8CDB #define GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT 0x8CDC #define GL_FRAMEBUFFER_UNSUPPORTED_EXT 0x8CDD #define GL_MAX_COLOR_ATTACHMENTS_EXT 0x8CDF #define GL_COLOR_ATTACHMENT0_EXT 0x8CE0 #define GL_COLOR_ATTACHMENT1_EXT 0x8CE1 #define GL_COLOR_ATTACHMENT2_EXT 0x8CE2 #define GL_COLOR_ATTACHMENT3_EXT 0x8CE3 #define GL_COLOR_ATTACHMENT4_EXT 0x8CE4 #define GL_COLOR_ATTACHMENT5_EXT 0x8CE5 #define GL_COLOR_ATTACHMENT6_EXT 0x8CE6 #define GL_COLOR_ATTACHMENT7_EXT 0x8CE7 #define GL_COLOR_ATTACHMENT8_EXT 0x8CE8 #define GL_COLOR_ATTACHMENT9_EXT 0x8CE9 #define GL_COLOR_ATTACHMENT10_EXT 0x8CEA #define GL_COLOR_ATTACHMENT11_EXT 0x8CEB #define GL_COLOR_ATTACHMENT12_EXT 0x8CEC #define GL_COLOR_ATTACHMENT13_EXT 0x8CED #define GL_COLOR_ATTACHMENT14_EXT 0x8CEE #define GL_COLOR_ATTACHMENT15_EXT 0x8CEF #define GL_DEPTH_ATTACHMENT_EXT 0x8D00 #define GL_STENCIL_ATTACHMENT_EXT 0x8D20 #define GL_FRAMEBUFFER_EXT 0x8D40 #define GL_RENDERBUFFER_EXT 0x8D41 #define GL_RENDERBUFFER_WIDTH_EXT 0x8D42 #define GL_RENDERBUFFER_HEIGHT_EXT 0x8D43 #define GL_RENDERBUFFER_INTERNAL_FORMAT_EXT 0x8D44 #define GL_STENCIL_INDEX1_EXT 0x8D46 #define GL_STENCIL_INDEX4_EXT 0x8D47 #define GL_STENCIL_INDEX8_EXT 0x8D48 #define GL_STENCIL_INDEX16_EXT 0x8D49 #define GL_RENDERBUFFER_RED_SIZE_EXT 0x8D50 #define GL_RENDERBUFFER_GREEN_SIZE_EXT 0x8D51 #define GL_RENDERBUFFER_BLUE_SIZE_EXT 0x8D52 #define GL_RENDERBUFFER_ALPHA_SIZE_EXT 0x8D53 #define GL_RENDERBUFFER_DEPTH_SIZE_EXT 0x8D54 #define GL_RENDERBUFFER_STENCIL_SIZE_EXT 0x8D55 typedef void (GLAPIENTRY * PFNGLBINDFRAMEBUFFEREXTPROC) (GLenum target, GLuint framebuffer); typedef void (GLAPIENTRY * PFNGLBINDRENDERBUFFEREXTPROC) (GLenum target, GLuint renderbuffer); typedef GLenum (GLAPIENTRY * PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC) (GLenum target); typedef void (GLAPIENTRY * PFNGLDELETEFRAMEBUFFERSEXTPROC) (GLsizei n, const GLuint* framebuffers); typedef void (GLAPIENTRY * PFNGLDELETERENDERBUFFERSEXTPROC) (GLsizei n, const GLuint* renderbuffers); typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC) (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURE1DEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURE2DEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURE3DEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); typedef void (GLAPIENTRY * PFNGLGENFRAMEBUFFERSEXTPROC) (GLsizei n, GLuint* framebuffers); typedef void (GLAPIENTRY * PFNGLGENRENDERBUFFERSEXTPROC) (GLsizei n, GLuint* renderbuffers); typedef void (GLAPIENTRY * PFNGLGENERATEMIPMAPEXTPROC) (GLenum target); typedef void (GLAPIENTRY * PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC) (GLenum target, GLenum attachment, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLGETRENDERBUFFERPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint* params); typedef GLboolean (GLAPIENTRY * PFNGLISFRAMEBUFFEREXTPROC) (GLuint framebuffer); typedef GLboolean (GLAPIENTRY * PFNGLISRENDERBUFFEREXTPROC) (GLuint renderbuffer); typedef void (GLAPIENTRY * PFNGLRENDERBUFFERSTORAGEEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height); #define glBindFramebufferEXT GLEW_GET_FUN(__glewBindFramebufferEXT) #define glBindRenderbufferEXT GLEW_GET_FUN(__glewBindRenderbufferEXT) #define glCheckFramebufferStatusEXT GLEW_GET_FUN(__glewCheckFramebufferStatusEXT) #define glDeleteFramebuffersEXT GLEW_GET_FUN(__glewDeleteFramebuffersEXT) #define glDeleteRenderbuffersEXT GLEW_GET_FUN(__glewDeleteRenderbuffersEXT) #define glFramebufferRenderbufferEXT GLEW_GET_FUN(__glewFramebufferRenderbufferEXT) #define glFramebufferTexture1DEXT GLEW_GET_FUN(__glewFramebufferTexture1DEXT) #define glFramebufferTexture2DEXT GLEW_GET_FUN(__glewFramebufferTexture2DEXT) #define glFramebufferTexture3DEXT GLEW_GET_FUN(__glewFramebufferTexture3DEXT) #define glGenFramebuffersEXT GLEW_GET_FUN(__glewGenFramebuffersEXT) #define glGenRenderbuffersEXT GLEW_GET_FUN(__glewGenRenderbuffersEXT) #define glGenerateMipmapEXT GLEW_GET_FUN(__glewGenerateMipmapEXT) #define glGetFramebufferAttachmentParameterivEXT GLEW_GET_FUN(__glewGetFramebufferAttachmentParameterivEXT) #define glGetRenderbufferParameterivEXT GLEW_GET_FUN(__glewGetRenderbufferParameterivEXT) #define glIsFramebufferEXT GLEW_GET_FUN(__glewIsFramebufferEXT) #define glIsRenderbufferEXT GLEW_GET_FUN(__glewIsRenderbufferEXT) #define glRenderbufferStorageEXT GLEW_GET_FUN(__glewRenderbufferStorageEXT) #define GLEW_EXT_framebuffer_object GLEW_GET_VAR(__GLEW_EXT_framebuffer_object) #endif /* GL_EXT_framebuffer_object */ /* ------------------------ GL_EXT_framebuffer_sRGB ------------------------ */ #ifndef GL_EXT_framebuffer_sRGB #define GL_EXT_framebuffer_sRGB 1 #define GL_FRAMEBUFFER_SRGB_EXT 0x8DB9 #define GL_FRAMEBUFFER_SRGB_CAPABLE_EXT 0x8DBA #define GLEW_EXT_framebuffer_sRGB GLEW_GET_VAR(__GLEW_EXT_framebuffer_sRGB) #endif /* GL_EXT_framebuffer_sRGB */ /* ------------------------ GL_EXT_geometry_shader4 ------------------------ */ #ifndef GL_EXT_geometry_shader4 #define GL_EXT_geometry_shader4 1 #define GL_LINES_ADJACENCY_EXT 0xA #define GL_LINE_STRIP_ADJACENCY_EXT 0xB #define GL_TRIANGLES_ADJACENCY_EXT 0xC #define GL_TRIANGLE_STRIP_ADJACENCY_EXT 0xD #define GL_PROGRAM_POINT_SIZE_EXT 0x8642 #define GL_MAX_VARYING_COMPONENTS_EXT 0x8B4B #define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT 0x8C29 #define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER_EXT 0x8CD4 #define GL_FRAMEBUFFER_ATTACHMENT_LAYERED_EXT 0x8DA7 #define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_EXT 0x8DA8 #define GL_FRAMEBUFFER_INCOMPLETE_LAYER_COUNT_EXT 0x8DA9 #define GL_GEOMETRY_SHADER_EXT 0x8DD9 #define GL_GEOMETRY_VERTICES_OUT_EXT 0x8DDA #define GL_GEOMETRY_INPUT_TYPE_EXT 0x8DDB #define GL_GEOMETRY_OUTPUT_TYPE_EXT 0x8DDC #define GL_MAX_GEOMETRY_VARYING_COMPONENTS_EXT 0x8DDD #define GL_MAX_VERTEX_VARYING_COMPONENTS_EXT 0x8DDE #define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT 0x8DDF #define GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT 0x8DE0 #define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT 0x8DE1 typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTUREEXTPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level); typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTUREFACEEXTPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLenum face); typedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETERIEXTPROC) (GLuint program, GLenum pname, GLint value); #define glFramebufferTextureEXT GLEW_GET_FUN(__glewFramebufferTextureEXT) #define glFramebufferTextureFaceEXT GLEW_GET_FUN(__glewFramebufferTextureFaceEXT) #define glProgramParameteriEXT GLEW_GET_FUN(__glewProgramParameteriEXT) #define GLEW_EXT_geometry_shader4 GLEW_GET_VAR(__GLEW_EXT_geometry_shader4) #endif /* GL_EXT_geometry_shader4 */ /* --------------------- GL_EXT_gpu_program_parameters --------------------- */ #ifndef GL_EXT_gpu_program_parameters #define GL_EXT_gpu_program_parameters 1 typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETERS4FVEXTPROC) (GLenum target, GLuint index, GLsizei count, const GLfloat* params); typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETERS4FVEXTPROC) (GLenum target, GLuint index, GLsizei count, const GLfloat* params); #define glProgramEnvParameters4fvEXT GLEW_GET_FUN(__glewProgramEnvParameters4fvEXT) #define glProgramLocalParameters4fvEXT GLEW_GET_FUN(__glewProgramLocalParameters4fvEXT) #define GLEW_EXT_gpu_program_parameters GLEW_GET_VAR(__GLEW_EXT_gpu_program_parameters) #endif /* GL_EXT_gpu_program_parameters */ /* --------------------------- GL_EXT_gpu_shader4 -------------------------- */ #ifndef GL_EXT_gpu_shader4 #define GL_EXT_gpu_shader4 1 #define GL_VERTEX_ATTRIB_ARRAY_INTEGER_EXT 0x88FD #define GL_SAMPLER_1D_ARRAY_EXT 0x8DC0 #define GL_SAMPLER_2D_ARRAY_EXT 0x8DC1 #define GL_SAMPLER_BUFFER_EXT 0x8DC2 #define GL_SAMPLER_1D_ARRAY_SHADOW_EXT 0x8DC3 #define GL_SAMPLER_2D_ARRAY_SHADOW_EXT 0x8DC4 #define GL_SAMPLER_CUBE_SHADOW_EXT 0x8DC5 #define GL_UNSIGNED_INT_VEC2_EXT 0x8DC6 #define GL_UNSIGNED_INT_VEC3_EXT 0x8DC7 #define GL_UNSIGNED_INT_VEC4_EXT 0x8DC8 #define GL_INT_SAMPLER_1D_EXT 0x8DC9 #define GL_INT_SAMPLER_2D_EXT 0x8DCA #define GL_INT_SAMPLER_3D_EXT 0x8DCB #define GL_INT_SAMPLER_CUBE_EXT 0x8DCC #define GL_INT_SAMPLER_2D_RECT_EXT 0x8DCD #define GL_INT_SAMPLER_1D_ARRAY_EXT 0x8DCE #define GL_INT_SAMPLER_2D_ARRAY_EXT 0x8DCF #define GL_INT_SAMPLER_BUFFER_EXT 0x8DD0 #define GL_UNSIGNED_INT_SAMPLER_1D_EXT 0x8DD1 #define GL_UNSIGNED_INT_SAMPLER_2D_EXT 0x8DD2 #define GL_UNSIGNED_INT_SAMPLER_3D_EXT 0x8DD3 #define GL_UNSIGNED_INT_SAMPLER_CUBE_EXT 0x8DD4 #define GL_UNSIGNED_INT_SAMPLER_2D_RECT_EXT 0x8DD5 #define GL_UNSIGNED_INT_SAMPLER_1D_ARRAY_EXT 0x8DD6 #define GL_UNSIGNED_INT_SAMPLER_2D_ARRAY_EXT 0x8DD7 #define GL_UNSIGNED_INT_SAMPLER_BUFFER_EXT 0x8DD8 typedef void (GLAPIENTRY * PFNGLBINDFRAGDATALOCATIONEXTPROC) (GLuint program, GLuint color, const GLchar *name); typedef GLint (GLAPIENTRY * PFNGLGETFRAGDATALOCATIONEXTPROC) (GLuint program, const GLchar *name); typedef void (GLAPIENTRY * PFNGLGETUNIFORMUIVEXTPROC) (GLuint program, GLint location, GLuint *params); typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBIIVEXTPROC) (GLuint index, GLenum pname, GLint *params); typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBIUIVEXTPROC) (GLuint index, GLenum pname, GLuint *params); typedef void (GLAPIENTRY * PFNGLUNIFORM1UIEXTPROC) (GLint location, GLuint v0); typedef void (GLAPIENTRY * PFNGLUNIFORM1UIVEXTPROC) (GLint location, GLsizei count, const GLuint *value); typedef void (GLAPIENTRY * PFNGLUNIFORM2UIEXTPROC) (GLint location, GLuint v0, GLuint v1); typedef void (GLAPIENTRY * PFNGLUNIFORM2UIVEXTPROC) (GLint location, GLsizei count, const GLuint *value); typedef void (GLAPIENTRY * PFNGLUNIFORM3UIEXTPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2); typedef void (GLAPIENTRY * PFNGLUNIFORM3UIVEXTPROC) (GLint location, GLsizei count, const GLuint *value); typedef void (GLAPIENTRY * PFNGLUNIFORM4UIEXTPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); typedef void (GLAPIENTRY * PFNGLUNIFORM4UIVEXTPROC) (GLint location, GLsizei count, const GLuint *value); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI1IEXTPROC) (GLuint index, GLint x); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI1IVEXTPROC) (GLuint index, const GLint *v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI1UIEXTPROC) (GLuint index, GLuint x); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI1UIVEXTPROC) (GLuint index, const GLuint *v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI2IEXTPROC) (GLuint index, GLint x, GLint y); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI2IVEXTPROC) (GLuint index, const GLint *v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI2UIEXTPROC) (GLuint index, GLuint x, GLuint y); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI2UIVEXTPROC) (GLuint index, const GLuint *v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI3IEXTPROC) (GLuint index, GLint x, GLint y, GLint z); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI3IVEXTPROC) (GLuint index, const GLint *v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI3UIEXTPROC) (GLuint index, GLuint x, GLuint y, GLuint z); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI3UIVEXTPROC) (GLuint index, const GLuint *v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4BVEXTPROC) (GLuint index, const GLbyte *v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4IEXTPROC) (GLuint index, GLint x, GLint y, GLint z, GLint w); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4IVEXTPROC) (GLuint index, const GLint *v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4SVEXTPROC) (GLuint index, const GLshort *v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4UBVEXTPROC) (GLuint index, const GLubyte *v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4UIEXTPROC) (GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4UIVEXTPROC) (GLuint index, const GLuint *v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4USVEXTPROC) (GLuint index, const GLushort *v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBIPOINTEREXTPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); #define glBindFragDataLocationEXT GLEW_GET_FUN(__glewBindFragDataLocationEXT) #define glGetFragDataLocationEXT GLEW_GET_FUN(__glewGetFragDataLocationEXT) #define glGetUniformuivEXT GLEW_GET_FUN(__glewGetUniformuivEXT) #define glGetVertexAttribIivEXT GLEW_GET_FUN(__glewGetVertexAttribIivEXT) #define glGetVertexAttribIuivEXT GLEW_GET_FUN(__glewGetVertexAttribIuivEXT) #define glUniform1uiEXT GLEW_GET_FUN(__glewUniform1uiEXT) #define glUniform1uivEXT GLEW_GET_FUN(__glewUniform1uivEXT) #define glUniform2uiEXT GLEW_GET_FUN(__glewUniform2uiEXT) #define glUniform2uivEXT GLEW_GET_FUN(__glewUniform2uivEXT) #define glUniform3uiEXT GLEW_GET_FUN(__glewUniform3uiEXT) #define glUniform3uivEXT GLEW_GET_FUN(__glewUniform3uivEXT) #define glUniform4uiEXT GLEW_GET_FUN(__glewUniform4uiEXT) #define glUniform4uivEXT GLEW_GET_FUN(__glewUniform4uivEXT) #define glVertexAttribI1iEXT GLEW_GET_FUN(__glewVertexAttribI1iEXT) #define glVertexAttribI1ivEXT GLEW_GET_FUN(__glewVertexAttribI1ivEXT) #define glVertexAttribI1uiEXT GLEW_GET_FUN(__glewVertexAttribI1uiEXT) #define glVertexAttribI1uivEXT GLEW_GET_FUN(__glewVertexAttribI1uivEXT) #define glVertexAttribI2iEXT GLEW_GET_FUN(__glewVertexAttribI2iEXT) #define glVertexAttribI2ivEXT GLEW_GET_FUN(__glewVertexAttribI2ivEXT) #define glVertexAttribI2uiEXT GLEW_GET_FUN(__glewVertexAttribI2uiEXT) #define glVertexAttribI2uivEXT GLEW_GET_FUN(__glewVertexAttribI2uivEXT) #define glVertexAttribI3iEXT GLEW_GET_FUN(__glewVertexAttribI3iEXT) #define glVertexAttribI3ivEXT GLEW_GET_FUN(__glewVertexAttribI3ivEXT) #define glVertexAttribI3uiEXT GLEW_GET_FUN(__glewVertexAttribI3uiEXT) #define glVertexAttribI3uivEXT GLEW_GET_FUN(__glewVertexAttribI3uivEXT) #define glVertexAttribI4bvEXT GLEW_GET_FUN(__glewVertexAttribI4bvEXT) #define glVertexAttribI4iEXT GLEW_GET_FUN(__glewVertexAttribI4iEXT) #define glVertexAttribI4ivEXT GLEW_GET_FUN(__glewVertexAttribI4ivEXT) #define glVertexAttribI4svEXT GLEW_GET_FUN(__glewVertexAttribI4svEXT) #define glVertexAttribI4ubvEXT GLEW_GET_FUN(__glewVertexAttribI4ubvEXT) #define glVertexAttribI4uiEXT GLEW_GET_FUN(__glewVertexAttribI4uiEXT) #define glVertexAttribI4uivEXT GLEW_GET_FUN(__glewVertexAttribI4uivEXT) #define glVertexAttribI4usvEXT GLEW_GET_FUN(__glewVertexAttribI4usvEXT) #define glVertexAttribIPointerEXT GLEW_GET_FUN(__glewVertexAttribIPointerEXT) #define GLEW_EXT_gpu_shader4 GLEW_GET_VAR(__GLEW_EXT_gpu_shader4) #endif /* GL_EXT_gpu_shader4 */ /* ---------------------------- GL_EXT_histogram --------------------------- */ #ifndef GL_EXT_histogram #define GL_EXT_histogram 1 #define GL_HISTOGRAM_EXT 0x8024 #define GL_PROXY_HISTOGRAM_EXT 0x8025 #define GL_HISTOGRAM_WIDTH_EXT 0x8026 #define GL_HISTOGRAM_FORMAT_EXT 0x8027 #define GL_HISTOGRAM_RED_SIZE_EXT 0x8028 #define GL_HISTOGRAM_GREEN_SIZE_EXT 0x8029 #define GL_HISTOGRAM_BLUE_SIZE_EXT 0x802A #define GL_HISTOGRAM_ALPHA_SIZE_EXT 0x802B #define GL_HISTOGRAM_LUMINANCE_SIZE_EXT 0x802C #define GL_HISTOGRAM_SINK_EXT 0x802D #define GL_MINMAX_EXT 0x802E #define GL_MINMAX_FORMAT_EXT 0x802F #define GL_MINMAX_SINK_EXT 0x8030 typedef void (GLAPIENTRY * PFNGLGETHISTOGRAMEXTPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, void* values); typedef void (GLAPIENTRY * PFNGLGETHISTOGRAMPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat* params); typedef void (GLAPIENTRY * PFNGLGETHISTOGRAMPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLGETMINMAXEXTPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, void* values); typedef void (GLAPIENTRY * PFNGLGETMINMAXPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat* params); typedef void (GLAPIENTRY * PFNGLGETMINMAXPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLHISTOGRAMEXTPROC) (GLenum target, GLsizei width, GLenum internalformat, GLboolean sink); typedef void (GLAPIENTRY * PFNGLMINMAXEXTPROC) (GLenum target, GLenum internalformat, GLboolean sink); typedef void (GLAPIENTRY * PFNGLRESETHISTOGRAMEXTPROC) (GLenum target); typedef void (GLAPIENTRY * PFNGLRESETMINMAXEXTPROC) (GLenum target); #define glGetHistogramEXT GLEW_GET_FUN(__glewGetHistogramEXT) #define glGetHistogramParameterfvEXT GLEW_GET_FUN(__glewGetHistogramParameterfvEXT) #define glGetHistogramParameterivEXT GLEW_GET_FUN(__glewGetHistogramParameterivEXT) #define glGetMinmaxEXT GLEW_GET_FUN(__glewGetMinmaxEXT) #define glGetMinmaxParameterfvEXT GLEW_GET_FUN(__glewGetMinmaxParameterfvEXT) #define glGetMinmaxParameterivEXT GLEW_GET_FUN(__glewGetMinmaxParameterivEXT) #define glHistogramEXT GLEW_GET_FUN(__glewHistogramEXT) #define glMinmaxEXT GLEW_GET_FUN(__glewMinmaxEXT) #define glResetHistogramEXT GLEW_GET_FUN(__glewResetHistogramEXT) #define glResetMinmaxEXT GLEW_GET_FUN(__glewResetMinmaxEXT) #define GLEW_EXT_histogram GLEW_GET_VAR(__GLEW_EXT_histogram) #endif /* GL_EXT_histogram */ /* ----------------------- GL_EXT_index_array_formats ---------------------- */ #ifndef GL_EXT_index_array_formats #define GL_EXT_index_array_formats 1 #define GLEW_EXT_index_array_formats GLEW_GET_VAR(__GLEW_EXT_index_array_formats) #endif /* GL_EXT_index_array_formats */ /* --------------------------- GL_EXT_index_func --------------------------- */ #ifndef GL_EXT_index_func #define GL_EXT_index_func 1 typedef void (GLAPIENTRY * PFNGLINDEXFUNCEXTPROC) (GLenum func, GLfloat ref); #define glIndexFuncEXT GLEW_GET_FUN(__glewIndexFuncEXT) #define GLEW_EXT_index_func GLEW_GET_VAR(__GLEW_EXT_index_func) #endif /* GL_EXT_index_func */ /* ------------------------- GL_EXT_index_material ------------------------- */ #ifndef GL_EXT_index_material #define GL_EXT_index_material 1 typedef void (GLAPIENTRY * PFNGLINDEXMATERIALEXTPROC) (GLenum face, GLenum mode); #define glIndexMaterialEXT GLEW_GET_FUN(__glewIndexMaterialEXT) #define GLEW_EXT_index_material GLEW_GET_VAR(__GLEW_EXT_index_material) #endif /* GL_EXT_index_material */ /* -------------------------- GL_EXT_index_texture ------------------------- */ #ifndef GL_EXT_index_texture #define GL_EXT_index_texture 1 #define GLEW_EXT_index_texture GLEW_GET_VAR(__GLEW_EXT_index_texture) #endif /* GL_EXT_index_texture */ /* -------------------------- GL_EXT_light_texture ------------------------- */ #ifndef GL_EXT_light_texture #define GL_EXT_light_texture 1 #define GL_FRAGMENT_MATERIAL_EXT 0x8349 #define GL_FRAGMENT_NORMAL_EXT 0x834A #define GL_FRAGMENT_COLOR_EXT 0x834C #define GL_ATTENUATION_EXT 0x834D #define GL_SHADOW_ATTENUATION_EXT 0x834E #define GL_TEXTURE_APPLICATION_MODE_EXT 0x834F #define GL_TEXTURE_LIGHT_EXT 0x8350 #define GL_TEXTURE_MATERIAL_FACE_EXT 0x8351 #define GL_TEXTURE_MATERIAL_PARAMETER_EXT 0x8352 typedef void (GLAPIENTRY * PFNGLAPPLYTEXTUREEXTPROC) (GLenum mode); typedef void (GLAPIENTRY * PFNGLTEXTURELIGHTEXTPROC) (GLenum pname); typedef void (GLAPIENTRY * PFNGLTEXTUREMATERIALEXTPROC) (GLenum face, GLenum mode); #define glApplyTextureEXT GLEW_GET_FUN(__glewApplyTextureEXT) #define glTextureLightEXT GLEW_GET_FUN(__glewTextureLightEXT) #define glTextureMaterialEXT GLEW_GET_FUN(__glewTextureMaterialEXT) #define GLEW_EXT_light_texture GLEW_GET_VAR(__GLEW_EXT_light_texture) #endif /* GL_EXT_light_texture */ /* ------------------------- GL_EXT_misc_attribute ------------------------- */ #ifndef GL_EXT_misc_attribute #define GL_EXT_misc_attribute 1 #define GLEW_EXT_misc_attribute GLEW_GET_VAR(__GLEW_EXT_misc_attribute) #endif /* GL_EXT_misc_attribute */ /* ------------------------ GL_EXT_multi_draw_arrays ----------------------- */ #ifndef GL_EXT_multi_draw_arrays #define GL_EXT_multi_draw_arrays 1 typedef void (GLAPIENTRY * PFNGLMULTIDRAWARRAYSEXTPROC) (GLenum mode, const GLint* first, const GLsizei *count, GLsizei primcount); typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTSEXTPROC) (GLenum mode, GLsizei* count, GLenum type, const GLvoid **indices, GLsizei primcount); #define glMultiDrawArraysEXT GLEW_GET_FUN(__glewMultiDrawArraysEXT) #define glMultiDrawElementsEXT GLEW_GET_FUN(__glewMultiDrawElementsEXT) #define GLEW_EXT_multi_draw_arrays GLEW_GET_VAR(__GLEW_EXT_multi_draw_arrays) #endif /* GL_EXT_multi_draw_arrays */ /* --------------------------- GL_EXT_multisample -------------------------- */ #ifndef GL_EXT_multisample #define GL_EXT_multisample 1 #define GL_MULTISAMPLE_EXT 0x809D #define GL_SAMPLE_ALPHA_TO_MASK_EXT 0x809E #define GL_SAMPLE_ALPHA_TO_ONE_EXT 0x809F #define GL_SAMPLE_MASK_EXT 0x80A0 #define GL_1PASS_EXT 0x80A1 #define GL_2PASS_0_EXT 0x80A2 #define GL_2PASS_1_EXT 0x80A3 #define GL_4PASS_0_EXT 0x80A4 #define GL_4PASS_1_EXT 0x80A5 #define GL_4PASS_2_EXT 0x80A6 #define GL_4PASS_3_EXT 0x80A7 #define GL_SAMPLE_BUFFERS_EXT 0x80A8 #define GL_SAMPLES_EXT 0x80A9 #define GL_SAMPLE_MASK_VALUE_EXT 0x80AA #define GL_SAMPLE_MASK_INVERT_EXT 0x80AB #define GL_SAMPLE_PATTERN_EXT 0x80AC #define GL_MULTISAMPLE_BIT_EXT 0x20000000 typedef void (GLAPIENTRY * PFNGLSAMPLEMASKEXTPROC) (GLclampf value, GLboolean invert); typedef void (GLAPIENTRY * PFNGLSAMPLEPATTERNEXTPROC) (GLenum pattern); #define glSampleMaskEXT GLEW_GET_FUN(__glewSampleMaskEXT) #define glSamplePatternEXT GLEW_GET_FUN(__glewSamplePatternEXT) #define GLEW_EXT_multisample GLEW_GET_VAR(__GLEW_EXT_multisample) #endif /* GL_EXT_multisample */ /* ---------------------- GL_EXT_packed_depth_stencil ---------------------- */ #ifndef GL_EXT_packed_depth_stencil #define GL_EXT_packed_depth_stencil 1 #define GL_DEPTH_STENCIL_EXT 0x84F9 #define GL_UNSIGNED_INT_24_8_EXT 0x84FA #define GL_DEPTH24_STENCIL8_EXT 0x88F0 #define GL_TEXTURE_STENCIL_SIZE_EXT 0x88F1 #define GLEW_EXT_packed_depth_stencil GLEW_GET_VAR(__GLEW_EXT_packed_depth_stencil) #endif /* GL_EXT_packed_depth_stencil */ /* -------------------------- GL_EXT_packed_float -------------------------- */ #ifndef GL_EXT_packed_float #define GL_EXT_packed_float 1 #define GL_R11F_G11F_B10F_EXT 0x8C3A #define GL_UNSIGNED_INT_10F_11F_11F_REV_EXT 0x8C3B #define GL_RGBA_SIGNED_COMPONENTS_EXT 0x8C3C #define GLEW_EXT_packed_float GLEW_GET_VAR(__GLEW_EXT_packed_float) #endif /* GL_EXT_packed_float */ /* -------------------------- GL_EXT_packed_pixels ------------------------- */ #ifndef GL_EXT_packed_pixels #define GL_EXT_packed_pixels 1 #define GL_UNSIGNED_BYTE_3_3_2_EXT 0x8032 #define GL_UNSIGNED_SHORT_4_4_4_4_EXT 0x8033 #define GL_UNSIGNED_SHORT_5_5_5_1_EXT 0x8034 #define GL_UNSIGNED_INT_8_8_8_8_EXT 0x8035 #define GL_UNSIGNED_INT_10_10_10_2_EXT 0x8036 #define GLEW_EXT_packed_pixels GLEW_GET_VAR(__GLEW_EXT_packed_pixels) #endif /* GL_EXT_packed_pixels */ /* ------------------------ GL_EXT_paletted_texture ------------------------ */ #ifndef GL_EXT_paletted_texture #define GL_EXT_paletted_texture 1 #define GL_TEXTURE_1D 0x0DE0 #define GL_TEXTURE_2D 0x0DE1 #define GL_PROXY_TEXTURE_1D 0x8063 #define GL_PROXY_TEXTURE_2D 0x8064 #define GL_COLOR_TABLE_FORMAT_EXT 0x80D8 #define GL_COLOR_TABLE_WIDTH_EXT 0x80D9 #define GL_COLOR_TABLE_RED_SIZE_EXT 0x80DA #define GL_COLOR_TABLE_GREEN_SIZE_EXT 0x80DB #define GL_COLOR_TABLE_BLUE_SIZE_EXT 0x80DC #define GL_COLOR_TABLE_ALPHA_SIZE_EXT 0x80DD #define GL_COLOR_TABLE_LUMINANCE_SIZE_EXT 0x80DE #define GL_COLOR_TABLE_INTENSITY_SIZE_EXT 0x80DF #define GL_COLOR_INDEX1_EXT 0x80E2 #define GL_COLOR_INDEX2_EXT 0x80E3 #define GL_COLOR_INDEX4_EXT 0x80E4 #define GL_COLOR_INDEX8_EXT 0x80E5 #define GL_COLOR_INDEX12_EXT 0x80E6 #define GL_COLOR_INDEX16_EXT 0x80E7 #define GL_TEXTURE_INDEX_SIZE_EXT 0x80ED #define GL_TEXTURE_CUBE_MAP_ARB 0x8513 #define GL_PROXY_TEXTURE_CUBE_MAP_ARB 0x851B typedef void (GLAPIENTRY * PFNGLCOLORTABLEEXTPROC) (GLenum target, GLenum internalFormat, GLsizei width, GLenum format, GLenum type, const void* data); typedef void (GLAPIENTRY * PFNGLGETCOLORTABLEEXTPROC) (GLenum target, GLenum format, GLenum type, void* data); typedef void (GLAPIENTRY * PFNGLGETCOLORTABLEPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat* params); typedef void (GLAPIENTRY * PFNGLGETCOLORTABLEPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint* params); #define glColorTableEXT GLEW_GET_FUN(__glewColorTableEXT) #define glGetColorTableEXT GLEW_GET_FUN(__glewGetColorTableEXT) #define glGetColorTableParameterfvEXT GLEW_GET_FUN(__glewGetColorTableParameterfvEXT) #define glGetColorTableParameterivEXT GLEW_GET_FUN(__glewGetColorTableParameterivEXT) #define GLEW_EXT_paletted_texture GLEW_GET_VAR(__GLEW_EXT_paletted_texture) #endif /* GL_EXT_paletted_texture */ /* ----------------------- GL_EXT_pixel_buffer_object ---------------------- */ #ifndef GL_EXT_pixel_buffer_object #define GL_EXT_pixel_buffer_object 1 #define GL_PIXEL_PACK_BUFFER_EXT 0x88EB #define GL_PIXEL_UNPACK_BUFFER_EXT 0x88EC #define GL_PIXEL_PACK_BUFFER_BINDING_EXT 0x88ED #define GL_PIXEL_UNPACK_BUFFER_BINDING_EXT 0x88EF #define GLEW_EXT_pixel_buffer_object GLEW_GET_VAR(__GLEW_EXT_pixel_buffer_object) #endif /* GL_EXT_pixel_buffer_object */ /* ------------------------- GL_EXT_pixel_transform ------------------------ */ #ifndef GL_EXT_pixel_transform #define GL_EXT_pixel_transform 1 #define GL_PIXEL_TRANSFORM_2D_EXT 0x8330 #define GL_PIXEL_MAG_FILTER_EXT 0x8331 #define GL_PIXEL_MIN_FILTER_EXT 0x8332 #define GL_PIXEL_CUBIC_WEIGHT_EXT 0x8333 #define GL_CUBIC_EXT 0x8334 #define GL_AVERAGE_EXT 0x8335 #define GL_PIXEL_TRANSFORM_2D_STACK_DEPTH_EXT 0x8336 #define GL_MAX_PIXEL_TRANSFORM_2D_STACK_DEPTH_EXT 0x8337 #define GL_PIXEL_TRANSFORM_2D_MATRIX_EXT 0x8338 typedef void (GLAPIENTRY * PFNGLGETPIXELTRANSFORMPARAMETERFVEXTPROC) (GLenum target, GLenum pname, const GLfloat* params); typedef void (GLAPIENTRY * PFNGLGETPIXELTRANSFORMPARAMETERIVEXTPROC) (GLenum target, GLenum pname, const GLint* params); typedef void (GLAPIENTRY * PFNGLPIXELTRANSFORMPARAMETERFEXTPROC) (GLenum target, GLenum pname, const GLfloat param); typedef void (GLAPIENTRY * PFNGLPIXELTRANSFORMPARAMETERFVEXTPROC) (GLenum target, GLenum pname, const GLfloat* params); typedef void (GLAPIENTRY * PFNGLPIXELTRANSFORMPARAMETERIEXTPROC) (GLenum target, GLenum pname, const GLint param); typedef void (GLAPIENTRY * PFNGLPIXELTRANSFORMPARAMETERIVEXTPROC) (GLenum target, GLenum pname, const GLint* params); #define glGetPixelTransformParameterfvEXT GLEW_GET_FUN(__glewGetPixelTransformParameterfvEXT) #define glGetPixelTransformParameterivEXT GLEW_GET_FUN(__glewGetPixelTransformParameterivEXT) #define glPixelTransformParameterfEXT GLEW_GET_FUN(__glewPixelTransformParameterfEXT) #define glPixelTransformParameterfvEXT GLEW_GET_FUN(__glewPixelTransformParameterfvEXT) #define glPixelTransformParameteriEXT GLEW_GET_FUN(__glewPixelTransformParameteriEXT) #define glPixelTransformParameterivEXT GLEW_GET_FUN(__glewPixelTransformParameterivEXT) #define GLEW_EXT_pixel_transform GLEW_GET_VAR(__GLEW_EXT_pixel_transform) #endif /* GL_EXT_pixel_transform */ /* ------------------- GL_EXT_pixel_transform_color_table ------------------ */ #ifndef GL_EXT_pixel_transform_color_table #define GL_EXT_pixel_transform_color_table 1 #define GLEW_EXT_pixel_transform_color_table GLEW_GET_VAR(__GLEW_EXT_pixel_transform_color_table) #endif /* GL_EXT_pixel_transform_color_table */ /* ------------------------ GL_EXT_point_parameters ------------------------ */ #ifndef GL_EXT_point_parameters #define GL_EXT_point_parameters 1 #define GL_POINT_SIZE_MIN_EXT 0x8126 #define GL_POINT_SIZE_MAX_EXT 0x8127 #define GL_POINT_FADE_THRESHOLD_SIZE_EXT 0x8128 #define GL_DISTANCE_ATTENUATION_EXT 0x8129 typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERFEXTPROC) (GLenum pname, GLfloat param); typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERFVEXTPROC) (GLenum pname, const GLfloat* params); #define glPointParameterfEXT GLEW_GET_FUN(__glewPointParameterfEXT) #define glPointParameterfvEXT GLEW_GET_FUN(__glewPointParameterfvEXT) #define GLEW_EXT_point_parameters GLEW_GET_VAR(__GLEW_EXT_point_parameters) #endif /* GL_EXT_point_parameters */ /* ------------------------- GL_EXT_polygon_offset ------------------------- */ #ifndef GL_EXT_polygon_offset #define GL_EXT_polygon_offset 1 #define GL_POLYGON_OFFSET_EXT 0x8037 #define GL_POLYGON_OFFSET_FACTOR_EXT 0x8038 #define GL_POLYGON_OFFSET_BIAS_EXT 0x8039 typedef void (GLAPIENTRY * PFNGLPOLYGONOFFSETEXTPROC) (GLfloat factor, GLfloat bias); #define glPolygonOffsetEXT GLEW_GET_FUN(__glewPolygonOffsetEXT) #define GLEW_EXT_polygon_offset GLEW_GET_VAR(__GLEW_EXT_polygon_offset) #endif /* GL_EXT_polygon_offset */ /* ------------------------ GL_EXT_provoking_vertex ------------------------ */ #ifndef GL_EXT_provoking_vertex #define GL_EXT_provoking_vertex 1 #define GL_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION_EXT 0x8E4C #define GL_FIRST_VERTEX_CONVENTION_EXT 0x8E4D #define GL_LAST_VERTEX_CONVENTION_EXT 0x8E4E #define GL_PROVOKING_VERTEX_EXT 0x8E4F typedef void (GLAPIENTRY * PFNGLPROVOKINGVERTEXEXTPROC) (GLenum mode); #define glProvokingVertexEXT GLEW_GET_FUN(__glewProvokingVertexEXT) #define GLEW_EXT_provoking_vertex GLEW_GET_VAR(__GLEW_EXT_provoking_vertex) #endif /* GL_EXT_provoking_vertex */ /* ------------------------- GL_EXT_rescale_normal ------------------------- */ #ifndef GL_EXT_rescale_normal #define GL_EXT_rescale_normal 1 #define GL_RESCALE_NORMAL_EXT 0x803A #define GLEW_EXT_rescale_normal GLEW_GET_VAR(__GLEW_EXT_rescale_normal) #endif /* GL_EXT_rescale_normal */ /* -------------------------- GL_EXT_scene_marker -------------------------- */ #ifndef GL_EXT_scene_marker #define GL_EXT_scene_marker 1 typedef void (GLAPIENTRY * PFNGLBEGINSCENEEXTPROC) (void); typedef void (GLAPIENTRY * PFNGLENDSCENEEXTPROC) (void); #define glBeginSceneEXT GLEW_GET_FUN(__glewBeginSceneEXT) #define glEndSceneEXT GLEW_GET_FUN(__glewEndSceneEXT) #define GLEW_EXT_scene_marker GLEW_GET_VAR(__GLEW_EXT_scene_marker) #endif /* GL_EXT_scene_marker */ /* ------------------------- GL_EXT_secondary_color ------------------------ */ #ifndef GL_EXT_secondary_color #define GL_EXT_secondary_color 1 #define GL_COLOR_SUM_EXT 0x8458 #define GL_CURRENT_SECONDARY_COLOR_EXT 0x8459 #define GL_SECONDARY_COLOR_ARRAY_SIZE_EXT 0x845A #define GL_SECONDARY_COLOR_ARRAY_TYPE_EXT 0x845B #define GL_SECONDARY_COLOR_ARRAY_STRIDE_EXT 0x845C #define GL_SECONDARY_COLOR_ARRAY_POINTER_EXT 0x845D #define GL_SECONDARY_COLOR_ARRAY_EXT 0x845E typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3BEXTPROC) (GLbyte red, GLbyte green, GLbyte blue); typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3BVEXTPROC) (const GLbyte *v); typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3DEXTPROC) (GLdouble red, GLdouble green, GLdouble blue); typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3DVEXTPROC) (const GLdouble *v); typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3FEXTPROC) (GLfloat red, GLfloat green, GLfloat blue); typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3FVEXTPROC) (const GLfloat *v); typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3IEXTPROC) (GLint red, GLint green, GLint blue); typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3IVEXTPROC) (const GLint *v); typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3SEXTPROC) (GLshort red, GLshort green, GLshort blue); typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3SVEXTPROC) (const GLshort *v); typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3UBEXTPROC) (GLubyte red, GLubyte green, GLubyte blue); typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3UBVEXTPROC) (const GLubyte *v); typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3UIEXTPROC) (GLuint red, GLuint green, GLuint blue); typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3UIVEXTPROC) (const GLuint *v); typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3USEXTPROC) (GLushort red, GLushort green, GLushort blue); typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3USVEXTPROC) (const GLushort *v); typedef void (GLAPIENTRY * PFNGLSECONDARYCOLORPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); #define glSecondaryColor3bEXT GLEW_GET_FUN(__glewSecondaryColor3bEXT) #define glSecondaryColor3bvEXT GLEW_GET_FUN(__glewSecondaryColor3bvEXT) #define glSecondaryColor3dEXT GLEW_GET_FUN(__glewSecondaryColor3dEXT) #define glSecondaryColor3dvEXT GLEW_GET_FUN(__glewSecondaryColor3dvEXT) #define glSecondaryColor3fEXT GLEW_GET_FUN(__glewSecondaryColor3fEXT) #define glSecondaryColor3fvEXT GLEW_GET_FUN(__glewSecondaryColor3fvEXT) #define glSecondaryColor3iEXT GLEW_GET_FUN(__glewSecondaryColor3iEXT) #define glSecondaryColor3ivEXT GLEW_GET_FUN(__glewSecondaryColor3ivEXT) #define glSecondaryColor3sEXT GLEW_GET_FUN(__glewSecondaryColor3sEXT) #define glSecondaryColor3svEXT GLEW_GET_FUN(__glewSecondaryColor3svEXT) #define glSecondaryColor3ubEXT GLEW_GET_FUN(__glewSecondaryColor3ubEXT) #define glSecondaryColor3ubvEXT GLEW_GET_FUN(__glewSecondaryColor3ubvEXT) #define glSecondaryColor3uiEXT GLEW_GET_FUN(__glewSecondaryColor3uiEXT) #define glSecondaryColor3uivEXT GLEW_GET_FUN(__glewSecondaryColor3uivEXT) #define glSecondaryColor3usEXT GLEW_GET_FUN(__glewSecondaryColor3usEXT) #define glSecondaryColor3usvEXT GLEW_GET_FUN(__glewSecondaryColor3usvEXT) #define glSecondaryColorPointerEXT GLEW_GET_FUN(__glewSecondaryColorPointerEXT) #define GLEW_EXT_secondary_color GLEW_GET_VAR(__GLEW_EXT_secondary_color) #endif /* GL_EXT_secondary_color */ /* --------------------- GL_EXT_separate_shader_objects -------------------- */ #ifndef GL_EXT_separate_shader_objects #define GL_EXT_separate_shader_objects 1 #define GL_ACTIVE_PROGRAM_EXT 0x8B8D typedef void (GLAPIENTRY * PFNGLACTIVEPROGRAMEXTPROC) (GLuint program); typedef GLuint (GLAPIENTRY * PFNGLCREATESHADERPROGRAMEXTPROC) (GLenum type, const GLchar* string); typedef void (GLAPIENTRY * PFNGLUSESHADERPROGRAMEXTPROC) (GLenum type, GLuint program); #define glActiveProgramEXT GLEW_GET_FUN(__glewActiveProgramEXT) #define glCreateShaderProgramEXT GLEW_GET_FUN(__glewCreateShaderProgramEXT) #define glUseShaderProgramEXT GLEW_GET_FUN(__glewUseShaderProgramEXT) #define GLEW_EXT_separate_shader_objects GLEW_GET_VAR(__GLEW_EXT_separate_shader_objects) #endif /* GL_EXT_separate_shader_objects */ /* --------------------- GL_EXT_separate_specular_color -------------------- */ #ifndef GL_EXT_separate_specular_color #define GL_EXT_separate_specular_color 1 #define GL_LIGHT_MODEL_COLOR_CONTROL_EXT 0x81F8 #define GL_SINGLE_COLOR_EXT 0x81F9 #define GL_SEPARATE_SPECULAR_COLOR_EXT 0x81FA #define GLEW_EXT_separate_specular_color GLEW_GET_VAR(__GLEW_EXT_separate_specular_color) #endif /* GL_EXT_separate_specular_color */ /* --------------------- GL_EXT_shader_image_load_store -------------------- */ #ifndef GL_EXT_shader_image_load_store #define GL_EXT_shader_image_load_store 1 #define GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT_EXT 0x00000001 #define GL_ELEMENT_ARRAY_BARRIER_BIT_EXT 0x00000002 #define GL_UNIFORM_BARRIER_BIT_EXT 0x00000004 #define GL_TEXTURE_FETCH_BARRIER_BIT_EXT 0x00000008 #define GL_SHADER_IMAGE_ACCESS_BARRIER_BIT_EXT 0x00000020 #define GL_COMMAND_BARRIER_BIT_EXT 0x00000040 #define GL_PIXEL_BUFFER_BARRIER_BIT_EXT 0x00000080 #define GL_TEXTURE_UPDATE_BARRIER_BIT_EXT 0x00000100 #define GL_BUFFER_UPDATE_BARRIER_BIT_EXT 0x00000200 #define GL_FRAMEBUFFER_BARRIER_BIT_EXT 0x00000400 #define GL_TRANSFORM_FEEDBACK_BARRIER_BIT_EXT 0x00000800 #define GL_ATOMIC_COUNTER_BARRIER_BIT_EXT 0x00001000 #define GL_MAX_IMAGE_UNITS_EXT 0x8F38 #define GL_MAX_COMBINED_IMAGE_UNITS_AND_FRAGMENT_OUTPUTS_EXT 0x8F39 #define GL_IMAGE_BINDING_NAME_EXT 0x8F3A #define GL_IMAGE_BINDING_LEVEL_EXT 0x8F3B #define GL_IMAGE_BINDING_LAYERED_EXT 0x8F3C #define GL_IMAGE_BINDING_LAYER_EXT 0x8F3D #define GL_IMAGE_BINDING_ACCESS_EXT 0x8F3E #define GL_IMAGE_1D_EXT 0x904C #define GL_IMAGE_2D_EXT 0x904D #define GL_IMAGE_3D_EXT 0x904E #define GL_IMAGE_2D_RECT_EXT 0x904F #define GL_IMAGE_CUBE_EXT 0x9050 #define GL_IMAGE_BUFFER_EXT 0x9051 #define GL_IMAGE_1D_ARRAY_EXT 0x9052 #define GL_IMAGE_2D_ARRAY_EXT 0x9053 #define GL_IMAGE_CUBE_MAP_ARRAY_EXT 0x9054 #define GL_IMAGE_2D_MULTISAMPLE_EXT 0x9055 #define GL_IMAGE_2D_MULTISAMPLE_ARRAY_EXT 0x9056 #define GL_INT_IMAGE_1D_EXT 0x9057 #define GL_INT_IMAGE_2D_EXT 0x9058 #define GL_INT_IMAGE_3D_EXT 0x9059 #define GL_INT_IMAGE_2D_RECT_EXT 0x905A #define GL_INT_IMAGE_CUBE_EXT 0x905B #define GL_INT_IMAGE_BUFFER_EXT 0x905C #define GL_INT_IMAGE_1D_ARRAY_EXT 0x905D #define GL_INT_IMAGE_2D_ARRAY_EXT 0x905E #define GL_INT_IMAGE_CUBE_MAP_ARRAY_EXT 0x905F #define GL_INT_IMAGE_2D_MULTISAMPLE_EXT 0x9060 #define GL_INT_IMAGE_2D_MULTISAMPLE_ARRAY_EXT 0x9061 #define GL_UNSIGNED_INT_IMAGE_1D_EXT 0x9062 #define GL_UNSIGNED_INT_IMAGE_2D_EXT 0x9063 #define GL_UNSIGNED_INT_IMAGE_3D_EXT 0x9064 #define GL_UNSIGNED_INT_IMAGE_2D_RECT_EXT 0x9065 #define GL_UNSIGNED_INT_IMAGE_CUBE_EXT 0x9066 #define GL_UNSIGNED_INT_IMAGE_BUFFER_EXT 0x9067 #define GL_UNSIGNED_INT_IMAGE_1D_ARRAY_EXT 0x9068 #define GL_UNSIGNED_INT_IMAGE_2D_ARRAY_EXT 0x9069 #define GL_UNSIGNED_INT_IMAGE_CUBE_MAP_ARRAY_EXT 0x906A #define GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE_EXT 0x906B #define GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE_ARRAY_EXT 0x906C #define GL_MAX_IMAGE_SAMPLES_EXT 0x906D #define GL_IMAGE_BINDING_FORMAT_EXT 0x906E #define GL_ALL_BARRIER_BITS_EXT 0xFFFFFFFF typedef void (GLAPIENTRY * PFNGLBINDIMAGETEXTUREEXTPROC) (GLuint index, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLint format); typedef void (GLAPIENTRY * PFNGLMEMORYBARRIEREXTPROC) (GLbitfield barriers); #define glBindImageTextureEXT GLEW_GET_FUN(__glewBindImageTextureEXT) #define glMemoryBarrierEXT GLEW_GET_FUN(__glewMemoryBarrierEXT) #define GLEW_EXT_shader_image_load_store GLEW_GET_VAR(__GLEW_EXT_shader_image_load_store) #endif /* GL_EXT_shader_image_load_store */ /* -------------------------- GL_EXT_shadow_funcs -------------------------- */ #ifndef GL_EXT_shadow_funcs #define GL_EXT_shadow_funcs 1 #define GLEW_EXT_shadow_funcs GLEW_GET_VAR(__GLEW_EXT_shadow_funcs) #endif /* GL_EXT_shadow_funcs */ /* --------------------- GL_EXT_shared_texture_palette --------------------- */ #ifndef GL_EXT_shared_texture_palette #define GL_EXT_shared_texture_palette 1 #define GL_SHARED_TEXTURE_PALETTE_EXT 0x81FB #define GLEW_EXT_shared_texture_palette GLEW_GET_VAR(__GLEW_EXT_shared_texture_palette) #endif /* GL_EXT_shared_texture_palette */ /* ------------------------ GL_EXT_stencil_clear_tag ----------------------- */ #ifndef GL_EXT_stencil_clear_tag #define GL_EXT_stencil_clear_tag 1 #define GL_STENCIL_TAG_BITS_EXT 0x88F2 #define GL_STENCIL_CLEAR_TAG_VALUE_EXT 0x88F3 #define GLEW_EXT_stencil_clear_tag GLEW_GET_VAR(__GLEW_EXT_stencil_clear_tag) #endif /* GL_EXT_stencil_clear_tag */ /* ------------------------ GL_EXT_stencil_two_side ------------------------ */ #ifndef GL_EXT_stencil_two_side #define GL_EXT_stencil_two_side 1 #define GL_STENCIL_TEST_TWO_SIDE_EXT 0x8910 #define GL_ACTIVE_STENCIL_FACE_EXT 0x8911 typedef void (GLAPIENTRY * PFNGLACTIVESTENCILFACEEXTPROC) (GLenum face); #define glActiveStencilFaceEXT GLEW_GET_FUN(__glewActiveStencilFaceEXT) #define GLEW_EXT_stencil_two_side GLEW_GET_VAR(__GLEW_EXT_stencil_two_side) #endif /* GL_EXT_stencil_two_side */ /* -------------------------- GL_EXT_stencil_wrap -------------------------- */ #ifndef GL_EXT_stencil_wrap #define GL_EXT_stencil_wrap 1 #define GL_INCR_WRAP_EXT 0x8507 #define GL_DECR_WRAP_EXT 0x8508 #define GLEW_EXT_stencil_wrap GLEW_GET_VAR(__GLEW_EXT_stencil_wrap) #endif /* GL_EXT_stencil_wrap */ /* --------------------------- GL_EXT_subtexture --------------------------- */ #ifndef GL_EXT_subtexture #define GL_EXT_subtexture 1 typedef void (GLAPIENTRY * PFNGLTEXSUBIMAGE1DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void* pixels); typedef void (GLAPIENTRY * PFNGLTEXSUBIMAGE2DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void* pixels); typedef void (GLAPIENTRY * PFNGLTEXSUBIMAGE3DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void* pixels); #define glTexSubImage1DEXT GLEW_GET_FUN(__glewTexSubImage1DEXT) #define glTexSubImage2DEXT GLEW_GET_FUN(__glewTexSubImage2DEXT) #define glTexSubImage3DEXT GLEW_GET_FUN(__glewTexSubImage3DEXT) #define GLEW_EXT_subtexture GLEW_GET_VAR(__GLEW_EXT_subtexture) #endif /* GL_EXT_subtexture */ /* ----------------------------- GL_EXT_texture ---------------------------- */ #ifndef GL_EXT_texture #define GL_EXT_texture 1 #define GL_ALPHA4_EXT 0x803B #define GL_ALPHA8_EXT 0x803C #define GL_ALPHA12_EXT 0x803D #define GL_ALPHA16_EXT 0x803E #define GL_LUMINANCE4_EXT 0x803F #define GL_LUMINANCE8_EXT 0x8040 #define GL_LUMINANCE12_EXT 0x8041 #define GL_LUMINANCE16_EXT 0x8042 #define GL_LUMINANCE4_ALPHA4_EXT 0x8043 #define GL_LUMINANCE6_ALPHA2_EXT 0x8044 #define GL_LUMINANCE8_ALPHA8_EXT 0x8045 #define GL_LUMINANCE12_ALPHA4_EXT 0x8046 #define GL_LUMINANCE12_ALPHA12_EXT 0x8047 #define GL_LUMINANCE16_ALPHA16_EXT 0x8048 #define GL_INTENSITY_EXT 0x8049 #define GL_INTENSITY4_EXT 0x804A #define GL_INTENSITY8_EXT 0x804B #define GL_INTENSITY12_EXT 0x804C #define GL_INTENSITY16_EXT 0x804D #define GL_RGB2_EXT 0x804E #define GL_RGB4_EXT 0x804F #define GL_RGB5_EXT 0x8050 #define GL_RGB8_EXT 0x8051 #define GL_RGB10_EXT 0x8052 #define GL_RGB12_EXT 0x8053 #define GL_RGB16_EXT 0x8054 #define GL_RGBA2_EXT 0x8055 #define GL_RGBA4_EXT 0x8056 #define GL_RGB5_A1_EXT 0x8057 #define GL_RGBA8_EXT 0x8058 #define GL_RGB10_A2_EXT 0x8059 #define GL_RGBA12_EXT 0x805A #define GL_RGBA16_EXT 0x805B #define GL_TEXTURE_RED_SIZE_EXT 0x805C #define GL_TEXTURE_GREEN_SIZE_EXT 0x805D #define GL_TEXTURE_BLUE_SIZE_EXT 0x805E #define GL_TEXTURE_ALPHA_SIZE_EXT 0x805F #define GL_TEXTURE_LUMINANCE_SIZE_EXT 0x8060 #define GL_TEXTURE_INTENSITY_SIZE_EXT 0x8061 #define GL_REPLACE_EXT 0x8062 #define GL_PROXY_TEXTURE_1D_EXT 0x8063 #define GL_PROXY_TEXTURE_2D_EXT 0x8064 #define GLEW_EXT_texture GLEW_GET_VAR(__GLEW_EXT_texture) #endif /* GL_EXT_texture */ /* ---------------------------- GL_EXT_texture3D --------------------------- */ #ifndef GL_EXT_texture3D #define GL_EXT_texture3D 1 #define GL_PACK_SKIP_IMAGES_EXT 0x806B #define GL_PACK_IMAGE_HEIGHT_EXT 0x806C #define GL_UNPACK_SKIP_IMAGES_EXT 0x806D #define GL_UNPACK_IMAGE_HEIGHT_EXT 0x806E #define GL_TEXTURE_3D_EXT 0x806F #define GL_PROXY_TEXTURE_3D_EXT 0x8070 #define GL_TEXTURE_DEPTH_EXT 0x8071 #define GL_TEXTURE_WRAP_R_EXT 0x8072 #define GL_MAX_3D_TEXTURE_SIZE_EXT 0x8073 typedef void (GLAPIENTRY * PFNGLTEXIMAGE3DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void* pixels); #define glTexImage3DEXT GLEW_GET_FUN(__glewTexImage3DEXT) #define GLEW_EXT_texture3D GLEW_GET_VAR(__GLEW_EXT_texture3D) #endif /* GL_EXT_texture3D */ /* -------------------------- GL_EXT_texture_array ------------------------- */ #ifndef GL_EXT_texture_array #define GL_EXT_texture_array 1 #define GL_COMPARE_REF_DEPTH_TO_TEXTURE_EXT 0x884E #define GL_MAX_ARRAY_TEXTURE_LAYERS_EXT 0x88FF #define GL_TEXTURE_1D_ARRAY_EXT 0x8C18 #define GL_PROXY_TEXTURE_1D_ARRAY_EXT 0x8C19 #define GL_TEXTURE_2D_ARRAY_EXT 0x8C1A #define GL_PROXY_TEXTURE_2D_ARRAY_EXT 0x8C1B #define GL_TEXTURE_BINDING_1D_ARRAY_EXT 0x8C1C #define GL_TEXTURE_BINDING_2D_ARRAY_EXT 0x8C1D typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURELAYEREXTPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); #define glFramebufferTextureLayerEXT GLEW_GET_FUN(__glewFramebufferTextureLayerEXT) #define GLEW_EXT_texture_array GLEW_GET_VAR(__GLEW_EXT_texture_array) #endif /* GL_EXT_texture_array */ /* ---------------------- GL_EXT_texture_buffer_object --------------------- */ #ifndef GL_EXT_texture_buffer_object #define GL_EXT_texture_buffer_object 1 #define GL_TEXTURE_BUFFER_EXT 0x8C2A #define GL_MAX_TEXTURE_BUFFER_SIZE_EXT 0x8C2B #define GL_TEXTURE_BINDING_BUFFER_EXT 0x8C2C #define GL_TEXTURE_BUFFER_DATA_STORE_BINDING_EXT 0x8C2D #define GL_TEXTURE_BUFFER_FORMAT_EXT 0x8C2E typedef void (GLAPIENTRY * PFNGLTEXBUFFEREXTPROC) (GLenum target, GLenum internalformat, GLuint buffer); #define glTexBufferEXT GLEW_GET_FUN(__glewTexBufferEXT) #define GLEW_EXT_texture_buffer_object GLEW_GET_VAR(__GLEW_EXT_texture_buffer_object) #endif /* GL_EXT_texture_buffer_object */ /* -------------------- GL_EXT_texture_compression_dxt1 -------------------- */ #ifndef GL_EXT_texture_compression_dxt1 #define GL_EXT_texture_compression_dxt1 1 #define GLEW_EXT_texture_compression_dxt1 GLEW_GET_VAR(__GLEW_EXT_texture_compression_dxt1) #endif /* GL_EXT_texture_compression_dxt1 */ /* -------------------- GL_EXT_texture_compression_latc -------------------- */ #ifndef GL_EXT_texture_compression_latc #define GL_EXT_texture_compression_latc 1 #define GL_COMPRESSED_LUMINANCE_LATC1_EXT 0x8C70 #define GL_COMPRESSED_SIGNED_LUMINANCE_LATC1_EXT 0x8C71 #define GL_COMPRESSED_LUMINANCE_ALPHA_LATC2_EXT 0x8C72 #define GL_COMPRESSED_SIGNED_LUMINANCE_ALPHA_LATC2_EXT 0x8C73 #define GLEW_EXT_texture_compression_latc GLEW_GET_VAR(__GLEW_EXT_texture_compression_latc) #endif /* GL_EXT_texture_compression_latc */ /* -------------------- GL_EXT_texture_compression_rgtc -------------------- */ #ifndef GL_EXT_texture_compression_rgtc #define GL_EXT_texture_compression_rgtc 1 #define GL_COMPRESSED_RED_RGTC1_EXT 0x8DBB #define GL_COMPRESSED_SIGNED_RED_RGTC1_EXT 0x8DBC #define GL_COMPRESSED_RED_GREEN_RGTC2_EXT 0x8DBD #define GL_COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT 0x8DBE #define GLEW_EXT_texture_compression_rgtc GLEW_GET_VAR(__GLEW_EXT_texture_compression_rgtc) #endif /* GL_EXT_texture_compression_rgtc */ /* -------------------- GL_EXT_texture_compression_s3tc -------------------- */ #ifndef GL_EXT_texture_compression_s3tc #define GL_EXT_texture_compression_s3tc 1 #define GL_COMPRESSED_RGB_S3TC_DXT1_EXT 0x83F0 #define GL_COMPRESSED_RGBA_S3TC_DXT1_EXT 0x83F1 #define GL_COMPRESSED_RGBA_S3TC_DXT3_EXT 0x83F2 #define GL_COMPRESSED_RGBA_S3TC_DXT5_EXT 0x83F3 #define GLEW_EXT_texture_compression_s3tc GLEW_GET_VAR(__GLEW_EXT_texture_compression_s3tc) #endif /* GL_EXT_texture_compression_s3tc */ /* ------------------------ GL_EXT_texture_cube_map ------------------------ */ #ifndef GL_EXT_texture_cube_map #define GL_EXT_texture_cube_map 1 #define GL_NORMAL_MAP_EXT 0x8511 #define GL_REFLECTION_MAP_EXT 0x8512 #define GL_TEXTURE_CUBE_MAP_EXT 0x8513 #define GL_TEXTURE_BINDING_CUBE_MAP_EXT 0x8514 #define GL_TEXTURE_CUBE_MAP_POSITIVE_X_EXT 0x8515 #define GL_TEXTURE_CUBE_MAP_NEGATIVE_X_EXT 0x8516 #define GL_TEXTURE_CUBE_MAP_POSITIVE_Y_EXT 0x8517 #define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_EXT 0x8518 #define GL_TEXTURE_CUBE_MAP_POSITIVE_Z_EXT 0x8519 #define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_EXT 0x851A #define GL_PROXY_TEXTURE_CUBE_MAP_EXT 0x851B #define GL_MAX_CUBE_MAP_TEXTURE_SIZE_EXT 0x851C #define GLEW_EXT_texture_cube_map GLEW_GET_VAR(__GLEW_EXT_texture_cube_map) #endif /* GL_EXT_texture_cube_map */ /* ----------------------- GL_EXT_texture_edge_clamp ----------------------- */ #ifndef GL_EXT_texture_edge_clamp #define GL_EXT_texture_edge_clamp 1 #define GL_CLAMP_TO_EDGE_EXT 0x812F #define GLEW_EXT_texture_edge_clamp GLEW_GET_VAR(__GLEW_EXT_texture_edge_clamp) #endif /* GL_EXT_texture_edge_clamp */ /* --------------------------- GL_EXT_texture_env -------------------------- */ #ifndef GL_EXT_texture_env #define GL_EXT_texture_env 1 #define GL_TEXTURE_ENV0_EXT 0 #define GL_ENV_BLEND_EXT 0 #define GL_TEXTURE_ENV_SHIFT_EXT 0 #define GL_ENV_REPLACE_EXT 0 #define GL_ENV_ADD_EXT 0 #define GL_ENV_SUBTRACT_EXT 0 #define GL_TEXTURE_ENV_MODE_ALPHA_EXT 0 #define GL_ENV_REVERSE_SUBTRACT_EXT 0 #define GL_ENV_REVERSE_BLEND_EXT 0 #define GL_ENV_COPY_EXT 0 #define GL_ENV_MODULATE_EXT 0 #define GLEW_EXT_texture_env GLEW_GET_VAR(__GLEW_EXT_texture_env) #endif /* GL_EXT_texture_env */ /* ------------------------- GL_EXT_texture_env_add ------------------------ */ #ifndef GL_EXT_texture_env_add #define GL_EXT_texture_env_add 1 #define GLEW_EXT_texture_env_add GLEW_GET_VAR(__GLEW_EXT_texture_env_add) #endif /* GL_EXT_texture_env_add */ /* ----------------------- GL_EXT_texture_env_combine ---------------------- */ #ifndef GL_EXT_texture_env_combine #define GL_EXT_texture_env_combine 1 #define GL_COMBINE_EXT 0x8570 #define GL_COMBINE_RGB_EXT 0x8571 #define GL_COMBINE_ALPHA_EXT 0x8572 #define GL_RGB_SCALE_EXT 0x8573 #define GL_ADD_SIGNED_EXT 0x8574 #define GL_INTERPOLATE_EXT 0x8575 #define GL_CONSTANT_EXT 0x8576 #define GL_PRIMARY_COLOR_EXT 0x8577 #define GL_PREVIOUS_EXT 0x8578 #define GL_SOURCE0_RGB_EXT 0x8580 #define GL_SOURCE1_RGB_EXT 0x8581 #define GL_SOURCE2_RGB_EXT 0x8582 #define GL_SOURCE0_ALPHA_EXT 0x8588 #define GL_SOURCE1_ALPHA_EXT 0x8589 #define GL_SOURCE2_ALPHA_EXT 0x858A #define GL_OPERAND0_RGB_EXT 0x8590 #define GL_OPERAND1_RGB_EXT 0x8591 #define GL_OPERAND2_RGB_EXT 0x8592 #define GL_OPERAND0_ALPHA_EXT 0x8598 #define GL_OPERAND1_ALPHA_EXT 0x8599 #define GL_OPERAND2_ALPHA_EXT 0x859A #define GLEW_EXT_texture_env_combine GLEW_GET_VAR(__GLEW_EXT_texture_env_combine) #endif /* GL_EXT_texture_env_combine */ /* ------------------------ GL_EXT_texture_env_dot3 ------------------------ */ #ifndef GL_EXT_texture_env_dot3 #define GL_EXT_texture_env_dot3 1 #define GL_DOT3_RGB_EXT 0x8740 #define GL_DOT3_RGBA_EXT 0x8741 #define GLEW_EXT_texture_env_dot3 GLEW_GET_VAR(__GLEW_EXT_texture_env_dot3) #endif /* GL_EXT_texture_env_dot3 */ /* ------------------- GL_EXT_texture_filter_anisotropic ------------------- */ #ifndef GL_EXT_texture_filter_anisotropic #define GL_EXT_texture_filter_anisotropic 1 #define GL_TEXTURE_MAX_ANISOTROPY_EXT 0x84FE #define GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT 0x84FF #define GLEW_EXT_texture_filter_anisotropic GLEW_GET_VAR(__GLEW_EXT_texture_filter_anisotropic) #endif /* GL_EXT_texture_filter_anisotropic */ /* ------------------------- GL_EXT_texture_integer ------------------------ */ #ifndef GL_EXT_texture_integer #define GL_EXT_texture_integer 1 #define GL_RGBA32UI_EXT 0x8D70 #define GL_RGB32UI_EXT 0x8D71 #define GL_ALPHA32UI_EXT 0x8D72 #define GL_INTENSITY32UI_EXT 0x8D73 #define GL_LUMINANCE32UI_EXT 0x8D74 #define GL_LUMINANCE_ALPHA32UI_EXT 0x8D75 #define GL_RGBA16UI_EXT 0x8D76 #define GL_RGB16UI_EXT 0x8D77 #define GL_ALPHA16UI_EXT 0x8D78 #define GL_INTENSITY16UI_EXT 0x8D79 #define GL_LUMINANCE16UI_EXT 0x8D7A #define GL_LUMINANCE_ALPHA16UI_EXT 0x8D7B #define GL_RGBA8UI_EXT 0x8D7C #define GL_RGB8UI_EXT 0x8D7D #define GL_ALPHA8UI_EXT 0x8D7E #define GL_INTENSITY8UI_EXT 0x8D7F #define GL_LUMINANCE8UI_EXT 0x8D80 #define GL_LUMINANCE_ALPHA8UI_EXT 0x8D81 #define GL_RGBA32I_EXT 0x8D82 #define GL_RGB32I_EXT 0x8D83 #define GL_ALPHA32I_EXT 0x8D84 #define GL_INTENSITY32I_EXT 0x8D85 #define GL_LUMINANCE32I_EXT 0x8D86 #define GL_LUMINANCE_ALPHA32I_EXT 0x8D87 #define GL_RGBA16I_EXT 0x8D88 #define GL_RGB16I_EXT 0x8D89 #define GL_ALPHA16I_EXT 0x8D8A #define GL_INTENSITY16I_EXT 0x8D8B #define GL_LUMINANCE16I_EXT 0x8D8C #define GL_LUMINANCE_ALPHA16I_EXT 0x8D8D #define GL_RGBA8I_EXT 0x8D8E #define GL_RGB8I_EXT 0x8D8F #define GL_ALPHA8I_EXT 0x8D90 #define GL_INTENSITY8I_EXT 0x8D91 #define GL_LUMINANCE8I_EXT 0x8D92 #define GL_LUMINANCE_ALPHA8I_EXT 0x8D93 #define GL_RED_INTEGER_EXT 0x8D94 #define GL_GREEN_INTEGER_EXT 0x8D95 #define GL_BLUE_INTEGER_EXT 0x8D96 #define GL_ALPHA_INTEGER_EXT 0x8D97 #define GL_RGB_INTEGER_EXT 0x8D98 #define GL_RGBA_INTEGER_EXT 0x8D99 #define GL_BGR_INTEGER_EXT 0x8D9A #define GL_BGRA_INTEGER_EXT 0x8D9B #define GL_LUMINANCE_INTEGER_EXT 0x8D9C #define GL_LUMINANCE_ALPHA_INTEGER_EXT 0x8D9D #define GL_RGBA_INTEGER_MODE_EXT 0x8D9E typedef void (GLAPIENTRY * PFNGLCLEARCOLORIIEXTPROC) (GLint red, GLint green, GLint blue, GLint alpha); typedef void (GLAPIENTRY * PFNGLCLEARCOLORIUIEXTPROC) (GLuint red, GLuint green, GLuint blue, GLuint alpha); typedef void (GLAPIENTRY * PFNGLGETTEXPARAMETERIIVEXTPROC) (GLenum target, GLenum pname, GLint *params); typedef void (GLAPIENTRY * PFNGLGETTEXPARAMETERIUIVEXTPROC) (GLenum target, GLenum pname, GLuint *params); typedef void (GLAPIENTRY * PFNGLTEXPARAMETERIIVEXTPROC) (GLenum target, GLenum pname, const GLint *params); typedef void (GLAPIENTRY * PFNGLTEXPARAMETERIUIVEXTPROC) (GLenum target, GLenum pname, const GLuint *params); #define glClearColorIiEXT GLEW_GET_FUN(__glewClearColorIiEXT) #define glClearColorIuiEXT GLEW_GET_FUN(__glewClearColorIuiEXT) #define glGetTexParameterIivEXT GLEW_GET_FUN(__glewGetTexParameterIivEXT) #define glGetTexParameterIuivEXT GLEW_GET_FUN(__glewGetTexParameterIuivEXT) #define glTexParameterIivEXT GLEW_GET_FUN(__glewTexParameterIivEXT) #define glTexParameterIuivEXT GLEW_GET_FUN(__glewTexParameterIuivEXT) #define GLEW_EXT_texture_integer GLEW_GET_VAR(__GLEW_EXT_texture_integer) #endif /* GL_EXT_texture_integer */ /* ------------------------ GL_EXT_texture_lod_bias ------------------------ */ #ifndef GL_EXT_texture_lod_bias #define GL_EXT_texture_lod_bias 1 #define GL_MAX_TEXTURE_LOD_BIAS_EXT 0x84FD #define GL_TEXTURE_FILTER_CONTROL_EXT 0x8500 #define GL_TEXTURE_LOD_BIAS_EXT 0x8501 #define GLEW_EXT_texture_lod_bias GLEW_GET_VAR(__GLEW_EXT_texture_lod_bias) #endif /* GL_EXT_texture_lod_bias */ /* ---------------------- GL_EXT_texture_mirror_clamp ---------------------- */ #ifndef GL_EXT_texture_mirror_clamp #define GL_EXT_texture_mirror_clamp 1 #define GL_MIRROR_CLAMP_EXT 0x8742 #define GL_MIRROR_CLAMP_TO_EDGE_EXT 0x8743 #define GL_MIRROR_CLAMP_TO_BORDER_EXT 0x8912 #define GLEW_EXT_texture_mirror_clamp GLEW_GET_VAR(__GLEW_EXT_texture_mirror_clamp) #endif /* GL_EXT_texture_mirror_clamp */ /* ------------------------- GL_EXT_texture_object ------------------------- */ #ifndef GL_EXT_texture_object #define GL_EXT_texture_object 1 #define GL_TEXTURE_PRIORITY_EXT 0x8066 #define GL_TEXTURE_RESIDENT_EXT 0x8067 #define GL_TEXTURE_1D_BINDING_EXT 0x8068 #define GL_TEXTURE_2D_BINDING_EXT 0x8069 #define GL_TEXTURE_3D_BINDING_EXT 0x806A typedef GLboolean (GLAPIENTRY * PFNGLARETEXTURESRESIDENTEXTPROC) (GLsizei n, const GLuint* textures, GLboolean* residences); typedef void (GLAPIENTRY * PFNGLBINDTEXTUREEXTPROC) (GLenum target, GLuint texture); typedef void (GLAPIENTRY * PFNGLDELETETEXTURESEXTPROC) (GLsizei n, const GLuint* textures); typedef void (GLAPIENTRY * PFNGLGENTEXTURESEXTPROC) (GLsizei n, GLuint* textures); typedef GLboolean (GLAPIENTRY * PFNGLISTEXTUREEXTPROC) (GLuint texture); typedef void (GLAPIENTRY * PFNGLPRIORITIZETEXTURESEXTPROC) (GLsizei n, const GLuint* textures, const GLclampf* priorities); #define glAreTexturesResidentEXT GLEW_GET_FUN(__glewAreTexturesResidentEXT) #define glBindTextureEXT GLEW_GET_FUN(__glewBindTextureEXT) #define glDeleteTexturesEXT GLEW_GET_FUN(__glewDeleteTexturesEXT) #define glGenTexturesEXT GLEW_GET_FUN(__glewGenTexturesEXT) #define glIsTextureEXT GLEW_GET_FUN(__glewIsTextureEXT) #define glPrioritizeTexturesEXT GLEW_GET_FUN(__glewPrioritizeTexturesEXT) #define GLEW_EXT_texture_object GLEW_GET_VAR(__GLEW_EXT_texture_object) #endif /* GL_EXT_texture_object */ /* --------------------- GL_EXT_texture_perturb_normal --------------------- */ #ifndef GL_EXT_texture_perturb_normal #define GL_EXT_texture_perturb_normal 1 #define GL_PERTURB_EXT 0x85AE #define GL_TEXTURE_NORMAL_EXT 0x85AF typedef void (GLAPIENTRY * PFNGLTEXTURENORMALEXTPROC) (GLenum mode); #define glTextureNormalEXT GLEW_GET_FUN(__glewTextureNormalEXT) #define GLEW_EXT_texture_perturb_normal GLEW_GET_VAR(__GLEW_EXT_texture_perturb_normal) #endif /* GL_EXT_texture_perturb_normal */ /* ------------------------ GL_EXT_texture_rectangle ----------------------- */ #ifndef GL_EXT_texture_rectangle #define GL_EXT_texture_rectangle 1 #define GL_TEXTURE_RECTANGLE_EXT 0x84F5 #define GL_TEXTURE_BINDING_RECTANGLE_EXT 0x84F6 #define GL_PROXY_TEXTURE_RECTANGLE_EXT 0x84F7 #define GL_MAX_RECTANGLE_TEXTURE_SIZE_EXT 0x84F8 #define GLEW_EXT_texture_rectangle GLEW_GET_VAR(__GLEW_EXT_texture_rectangle) #endif /* GL_EXT_texture_rectangle */ /* -------------------------- GL_EXT_texture_sRGB -------------------------- */ #ifndef GL_EXT_texture_sRGB #define GL_EXT_texture_sRGB 1 #define GL_SRGB_EXT 0x8C40 #define GL_SRGB8_EXT 0x8C41 #define GL_SRGB_ALPHA_EXT 0x8C42 #define GL_SRGB8_ALPHA8_EXT 0x8C43 #define GL_SLUMINANCE_ALPHA_EXT 0x8C44 #define GL_SLUMINANCE8_ALPHA8_EXT 0x8C45 #define GL_SLUMINANCE_EXT 0x8C46 #define GL_SLUMINANCE8_EXT 0x8C47 #define GL_COMPRESSED_SRGB_EXT 0x8C48 #define GL_COMPRESSED_SRGB_ALPHA_EXT 0x8C49 #define GL_COMPRESSED_SLUMINANCE_EXT 0x8C4A #define GL_COMPRESSED_SLUMINANCE_ALPHA_EXT 0x8C4B #define GL_COMPRESSED_SRGB_S3TC_DXT1_EXT 0x8C4C #define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT 0x8C4D #define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT 0x8C4E #define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT 0x8C4F #define GLEW_EXT_texture_sRGB GLEW_GET_VAR(__GLEW_EXT_texture_sRGB) #endif /* GL_EXT_texture_sRGB */ /* ----------------------- GL_EXT_texture_sRGB_decode ---------------------- */ #ifndef GL_EXT_texture_sRGB_decode #define GL_EXT_texture_sRGB_decode 1 #define GL_TEXTURE_SRGB_DECODE_EXT 0x8A48 #define GL_DECODE_EXT 0x8A49 #define GL_SKIP_DECODE_EXT 0x8A4A #define GLEW_EXT_texture_sRGB_decode GLEW_GET_VAR(__GLEW_EXT_texture_sRGB_decode) #endif /* GL_EXT_texture_sRGB_decode */ /* --------------------- GL_EXT_texture_shared_exponent -------------------- */ #ifndef GL_EXT_texture_shared_exponent #define GL_EXT_texture_shared_exponent 1 #define GL_RGB9_E5_EXT 0x8C3D #define GL_UNSIGNED_INT_5_9_9_9_REV_EXT 0x8C3E #define GL_TEXTURE_SHARED_SIZE_EXT 0x8C3F #define GLEW_EXT_texture_shared_exponent GLEW_GET_VAR(__GLEW_EXT_texture_shared_exponent) #endif /* GL_EXT_texture_shared_exponent */ /* -------------------------- GL_EXT_texture_snorm ------------------------- */ #ifndef GL_EXT_texture_snorm #define GL_EXT_texture_snorm 1 #define GL_RED_SNORM 0x8F90 #define GL_RG_SNORM 0x8F91 #define GL_RGB_SNORM 0x8F92 #define GL_RGBA_SNORM 0x8F93 #define GL_R8_SNORM 0x8F94 #define GL_RG8_SNORM 0x8F95 #define GL_RGB8_SNORM 0x8F96 #define GL_RGBA8_SNORM 0x8F97 #define GL_R16_SNORM 0x8F98 #define GL_RG16_SNORM 0x8F99 #define GL_RGB16_SNORM 0x8F9A #define GL_RGBA16_SNORM 0x8F9B #define GL_SIGNED_NORMALIZED 0x8F9C #define GL_ALPHA_SNORM 0x9010 #define GL_LUMINANCE_SNORM 0x9011 #define GL_LUMINANCE_ALPHA_SNORM 0x9012 #define GL_INTENSITY_SNORM 0x9013 #define GL_ALPHA8_SNORM 0x9014 #define GL_LUMINANCE8_SNORM 0x9015 #define GL_LUMINANCE8_ALPHA8_SNORM 0x9016 #define GL_INTENSITY8_SNORM 0x9017 #define GL_ALPHA16_SNORM 0x9018 #define GL_LUMINANCE16_SNORM 0x9019 #define GL_LUMINANCE16_ALPHA16_SNORM 0x901A #define GL_INTENSITY16_SNORM 0x901B #define GLEW_EXT_texture_snorm GLEW_GET_VAR(__GLEW_EXT_texture_snorm) #endif /* GL_EXT_texture_snorm */ /* ------------------------- GL_EXT_texture_swizzle ------------------------ */ #ifndef GL_EXT_texture_swizzle #define GL_EXT_texture_swizzle 1 #define GL_TEXTURE_SWIZZLE_R_EXT 0x8E42 #define GL_TEXTURE_SWIZZLE_G_EXT 0x8E43 #define GL_TEXTURE_SWIZZLE_B_EXT 0x8E44 #define GL_TEXTURE_SWIZZLE_A_EXT 0x8E45 #define GL_TEXTURE_SWIZZLE_RGBA_EXT 0x8E46 #define GLEW_EXT_texture_swizzle GLEW_GET_VAR(__GLEW_EXT_texture_swizzle) #endif /* GL_EXT_texture_swizzle */ /* --------------------------- GL_EXT_timer_query -------------------------- */ #ifndef GL_EXT_timer_query #define GL_EXT_timer_query 1 #define GL_TIME_ELAPSED_EXT 0x88BF typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTI64VEXTPROC) (GLuint id, GLenum pname, GLint64EXT *params); typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTUI64VEXTPROC) (GLuint id, GLenum pname, GLuint64EXT *params); #define glGetQueryObjecti64vEXT GLEW_GET_FUN(__glewGetQueryObjecti64vEXT) #define glGetQueryObjectui64vEXT GLEW_GET_FUN(__glewGetQueryObjectui64vEXT) #define GLEW_EXT_timer_query GLEW_GET_VAR(__GLEW_EXT_timer_query) #endif /* GL_EXT_timer_query */ /* ----------------------- GL_EXT_transform_feedback ----------------------- */ #ifndef GL_EXT_transform_feedback #define GL_EXT_transform_feedback 1 #define GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH_EXT 0x8C76 #define GL_TRANSFORM_FEEDBACK_BUFFER_MODE_EXT 0x8C7F #define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS_EXT 0x8C80 #define GL_TRANSFORM_FEEDBACK_VARYINGS_EXT 0x8C83 #define GL_TRANSFORM_FEEDBACK_BUFFER_START_EXT 0x8C84 #define GL_TRANSFORM_FEEDBACK_BUFFER_SIZE_EXT 0x8C85 #define GL_PRIMITIVES_GENERATED_EXT 0x8C87 #define GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN_EXT 0x8C88 #define GL_RASTERIZER_DISCARD_EXT 0x8C89 #define GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS_EXT 0x8C8A #define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS_EXT 0x8C8B #define GL_INTERLEAVED_ATTRIBS_EXT 0x8C8C #define GL_SEPARATE_ATTRIBS_EXT 0x8C8D #define GL_TRANSFORM_FEEDBACK_BUFFER_EXT 0x8C8E #define GL_TRANSFORM_FEEDBACK_BUFFER_BINDING_EXT 0x8C8F typedef void (GLAPIENTRY * PFNGLBEGINTRANSFORMFEEDBACKEXTPROC) (GLenum primitiveMode); typedef void (GLAPIENTRY * PFNGLBINDBUFFERBASEEXTPROC) (GLenum target, GLuint index, GLuint buffer); typedef void (GLAPIENTRY * PFNGLBINDBUFFEROFFSETEXTPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset); typedef void (GLAPIENTRY * PFNGLBINDBUFFERRANGEEXTPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); typedef void (GLAPIENTRY * PFNGLENDTRANSFORMFEEDBACKEXTPROC) (void); typedef void (GLAPIENTRY * PFNGLGETTRANSFORMFEEDBACKVARYINGEXTPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei* length, GLsizei *size, GLenum *type, GLchar *name); typedef void (GLAPIENTRY * PFNGLTRANSFORMFEEDBACKVARYINGSEXTPROC) (GLuint program, GLsizei count, const GLchar ** varyings, GLenum bufferMode); #define glBeginTransformFeedbackEXT GLEW_GET_FUN(__glewBeginTransformFeedbackEXT) #define glBindBufferBaseEXT GLEW_GET_FUN(__glewBindBufferBaseEXT) #define glBindBufferOffsetEXT GLEW_GET_FUN(__glewBindBufferOffsetEXT) #define glBindBufferRangeEXT GLEW_GET_FUN(__glewBindBufferRangeEXT) #define glEndTransformFeedbackEXT GLEW_GET_FUN(__glewEndTransformFeedbackEXT) #define glGetTransformFeedbackVaryingEXT GLEW_GET_FUN(__glewGetTransformFeedbackVaryingEXT) #define glTransformFeedbackVaryingsEXT GLEW_GET_FUN(__glewTransformFeedbackVaryingsEXT) #define GLEW_EXT_transform_feedback GLEW_GET_VAR(__GLEW_EXT_transform_feedback) #endif /* GL_EXT_transform_feedback */ /* -------------------------- GL_EXT_vertex_array -------------------------- */ #ifndef GL_EXT_vertex_array #define GL_EXT_vertex_array 1 #define GL_DOUBLE_EXT 0x140A #define GL_VERTEX_ARRAY_EXT 0x8074 #define GL_NORMAL_ARRAY_EXT 0x8075 #define GL_COLOR_ARRAY_EXT 0x8076 #define GL_INDEX_ARRAY_EXT 0x8077 #define GL_TEXTURE_COORD_ARRAY_EXT 0x8078 #define GL_EDGE_FLAG_ARRAY_EXT 0x8079 #define GL_VERTEX_ARRAY_SIZE_EXT 0x807A #define GL_VERTEX_ARRAY_TYPE_EXT 0x807B #define GL_VERTEX_ARRAY_STRIDE_EXT 0x807C #define GL_VERTEX_ARRAY_COUNT_EXT 0x807D #define GL_NORMAL_ARRAY_TYPE_EXT 0x807E #define GL_NORMAL_ARRAY_STRIDE_EXT 0x807F #define GL_NORMAL_ARRAY_COUNT_EXT 0x8080 #define GL_COLOR_ARRAY_SIZE_EXT 0x8081 #define GL_COLOR_ARRAY_TYPE_EXT 0x8082 #define GL_COLOR_ARRAY_STRIDE_EXT 0x8083 #define GL_COLOR_ARRAY_COUNT_EXT 0x8084 #define GL_INDEX_ARRAY_TYPE_EXT 0x8085 #define GL_INDEX_ARRAY_STRIDE_EXT 0x8086 #define GL_INDEX_ARRAY_COUNT_EXT 0x8087 #define GL_TEXTURE_COORD_ARRAY_SIZE_EXT 0x8088 #define GL_TEXTURE_COORD_ARRAY_TYPE_EXT 0x8089 #define GL_TEXTURE_COORD_ARRAY_STRIDE_EXT 0x808A #define GL_TEXTURE_COORD_ARRAY_COUNT_EXT 0x808B #define GL_EDGE_FLAG_ARRAY_STRIDE_EXT 0x808C #define GL_EDGE_FLAG_ARRAY_COUNT_EXT 0x808D #define GL_VERTEX_ARRAY_POINTER_EXT 0x808E #define GL_NORMAL_ARRAY_POINTER_EXT 0x808F #define GL_COLOR_ARRAY_POINTER_EXT 0x8090 #define GL_INDEX_ARRAY_POINTER_EXT 0x8091 #define GL_TEXTURE_COORD_ARRAY_POINTER_EXT 0x8092 #define GL_EDGE_FLAG_ARRAY_POINTER_EXT 0x8093 typedef void (GLAPIENTRY * PFNGLARRAYELEMENTEXTPROC) (GLint i); typedef void (GLAPIENTRY * PFNGLCOLORPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const void* pointer); typedef void (GLAPIENTRY * PFNGLDRAWARRAYSEXTPROC) (GLenum mode, GLint first, GLsizei count); typedef void (GLAPIENTRY * PFNGLEDGEFLAGPOINTEREXTPROC) (GLsizei stride, GLsizei count, const GLboolean* pointer); typedef void (GLAPIENTRY * PFNGLINDEXPOINTEREXTPROC) (GLenum type, GLsizei stride, GLsizei count, const void* pointer); typedef void (GLAPIENTRY * PFNGLNORMALPOINTEREXTPROC) (GLenum type, GLsizei stride, GLsizei count, const void* pointer); typedef void (GLAPIENTRY * PFNGLTEXCOORDPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const void* pointer); typedef void (GLAPIENTRY * PFNGLVERTEXPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const void* pointer); #define glArrayElementEXT GLEW_GET_FUN(__glewArrayElementEXT) #define glColorPointerEXT GLEW_GET_FUN(__glewColorPointerEXT) #define glDrawArraysEXT GLEW_GET_FUN(__glewDrawArraysEXT) #define glEdgeFlagPointerEXT GLEW_GET_FUN(__glewEdgeFlagPointerEXT) #define glIndexPointerEXT GLEW_GET_FUN(__glewIndexPointerEXT) #define glNormalPointerEXT GLEW_GET_FUN(__glewNormalPointerEXT) #define glTexCoordPointerEXT GLEW_GET_FUN(__glewTexCoordPointerEXT) #define glVertexPointerEXT GLEW_GET_FUN(__glewVertexPointerEXT) #define GLEW_EXT_vertex_array GLEW_GET_VAR(__GLEW_EXT_vertex_array) #endif /* GL_EXT_vertex_array */ /* ------------------------ GL_EXT_vertex_array_bgra ----------------------- */ #ifndef GL_EXT_vertex_array_bgra #define GL_EXT_vertex_array_bgra 1 #define GL_BGRA 0x80E1 #define GLEW_EXT_vertex_array_bgra GLEW_GET_VAR(__GLEW_EXT_vertex_array_bgra) #endif /* GL_EXT_vertex_array_bgra */ /* ----------------------- GL_EXT_vertex_attrib_64bit ---------------------- */ #ifndef GL_EXT_vertex_attrib_64bit #define GL_EXT_vertex_attrib_64bit 1 #define GL_DOUBLE_MAT2_EXT 0x8F46 #define GL_DOUBLE_MAT3_EXT 0x8F47 #define GL_DOUBLE_MAT4_EXT 0x8F48 #define GL_DOUBLE_MAT2x3_EXT 0x8F49 #define GL_DOUBLE_MAT2x4_EXT 0x8F4A #define GL_DOUBLE_MAT3x2_EXT 0x8F4B #define GL_DOUBLE_MAT3x4_EXT 0x8F4C #define GL_DOUBLE_MAT4x2_EXT 0x8F4D #define GL_DOUBLE_MAT4x3_EXT 0x8F4E #define GL_DOUBLE_VEC2_EXT 0x8FFC #define GL_DOUBLE_VEC3_EXT 0x8FFD #define GL_DOUBLE_VEC4_EXT 0x8FFE typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBLDVEXTPROC) (GLuint index, GLenum pname, GLdouble* params); typedef void (GLAPIENTRY * PFNGLVERTEXARRAYVERTEXATTRIBLOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLuint index, GLint size, GLenum type, GLsizei stride, GLintptr offset); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL1DEXTPROC) (GLuint index, GLdouble x); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL1DVEXTPROC) (GLuint index, const GLdouble* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL2DEXTPROC) (GLuint index, GLdouble x, GLdouble y); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL2DVEXTPROC) (GLuint index, const GLdouble* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL3DEXTPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL3DVEXTPROC) (GLuint index, const GLdouble* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL4DEXTPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL4DVEXTPROC) (GLuint index, const GLdouble* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBLPOINTEREXTPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const void* pointer); #define glGetVertexAttribLdvEXT GLEW_GET_FUN(__glewGetVertexAttribLdvEXT) #define glVertexArrayVertexAttribLOffsetEXT GLEW_GET_FUN(__glewVertexArrayVertexAttribLOffsetEXT) #define glVertexAttribL1dEXT GLEW_GET_FUN(__glewVertexAttribL1dEXT) #define glVertexAttribL1dvEXT GLEW_GET_FUN(__glewVertexAttribL1dvEXT) #define glVertexAttribL2dEXT GLEW_GET_FUN(__glewVertexAttribL2dEXT) #define glVertexAttribL2dvEXT GLEW_GET_FUN(__glewVertexAttribL2dvEXT) #define glVertexAttribL3dEXT GLEW_GET_FUN(__glewVertexAttribL3dEXT) #define glVertexAttribL3dvEXT GLEW_GET_FUN(__glewVertexAttribL3dvEXT) #define glVertexAttribL4dEXT GLEW_GET_FUN(__glewVertexAttribL4dEXT) #define glVertexAttribL4dvEXT GLEW_GET_FUN(__glewVertexAttribL4dvEXT) #define glVertexAttribLPointerEXT GLEW_GET_FUN(__glewVertexAttribLPointerEXT) #define GLEW_EXT_vertex_attrib_64bit GLEW_GET_VAR(__GLEW_EXT_vertex_attrib_64bit) #endif /* GL_EXT_vertex_attrib_64bit */ /* -------------------------- GL_EXT_vertex_shader ------------------------- */ #ifndef GL_EXT_vertex_shader #define GL_EXT_vertex_shader 1 #define GL_VERTEX_SHADER_EXT 0x8780 #define GL_VERTEX_SHADER_BINDING_EXT 0x8781 #define GL_OP_INDEX_EXT 0x8782 #define GL_OP_NEGATE_EXT 0x8783 #define GL_OP_DOT3_EXT 0x8784 #define GL_OP_DOT4_EXT 0x8785 #define GL_OP_MUL_EXT 0x8786 #define GL_OP_ADD_EXT 0x8787 #define GL_OP_MADD_EXT 0x8788 #define GL_OP_FRAC_EXT 0x8789 #define GL_OP_MAX_EXT 0x878A #define GL_OP_MIN_EXT 0x878B #define GL_OP_SET_GE_EXT 0x878C #define GL_OP_SET_LT_EXT 0x878D #define GL_OP_CLAMP_EXT 0x878E #define GL_OP_FLOOR_EXT 0x878F #define GL_OP_ROUND_EXT 0x8790 #define GL_OP_EXP_BASE_2_EXT 0x8791 #define GL_OP_LOG_BASE_2_EXT 0x8792 #define GL_OP_POWER_EXT 0x8793 #define GL_OP_RECIP_EXT 0x8794 #define GL_OP_RECIP_SQRT_EXT 0x8795 #define GL_OP_SUB_EXT 0x8796 #define GL_OP_CROSS_PRODUCT_EXT 0x8797 #define GL_OP_MULTIPLY_MATRIX_EXT 0x8798 #define GL_OP_MOV_EXT 0x8799 #define GL_OUTPUT_VERTEX_EXT 0x879A #define GL_OUTPUT_COLOR0_EXT 0x879B #define GL_OUTPUT_COLOR1_EXT 0x879C #define GL_OUTPUT_TEXTURE_COORD0_EXT 0x879D #define GL_OUTPUT_TEXTURE_COORD1_EXT 0x879E #define GL_OUTPUT_TEXTURE_COORD2_EXT 0x879F #define GL_OUTPUT_TEXTURE_COORD3_EXT 0x87A0 #define GL_OUTPUT_TEXTURE_COORD4_EXT 0x87A1 #define GL_OUTPUT_TEXTURE_COORD5_EXT 0x87A2 #define GL_OUTPUT_TEXTURE_COORD6_EXT 0x87A3 #define GL_OUTPUT_TEXTURE_COORD7_EXT 0x87A4 #define GL_OUTPUT_TEXTURE_COORD8_EXT 0x87A5 #define GL_OUTPUT_TEXTURE_COORD9_EXT 0x87A6 #define GL_OUTPUT_TEXTURE_COORD10_EXT 0x87A7 #define GL_OUTPUT_TEXTURE_COORD11_EXT 0x87A8 #define GL_OUTPUT_TEXTURE_COORD12_EXT 0x87A9 #define GL_OUTPUT_TEXTURE_COORD13_EXT 0x87AA #define GL_OUTPUT_TEXTURE_COORD14_EXT 0x87AB #define GL_OUTPUT_TEXTURE_COORD15_EXT 0x87AC #define GL_OUTPUT_TEXTURE_COORD16_EXT 0x87AD #define GL_OUTPUT_TEXTURE_COORD17_EXT 0x87AE #define GL_OUTPUT_TEXTURE_COORD18_EXT 0x87AF #define GL_OUTPUT_TEXTURE_COORD19_EXT 0x87B0 #define GL_OUTPUT_TEXTURE_COORD20_EXT 0x87B1 #define GL_OUTPUT_TEXTURE_COORD21_EXT 0x87B2 #define GL_OUTPUT_TEXTURE_COORD22_EXT 0x87B3 #define GL_OUTPUT_TEXTURE_COORD23_EXT 0x87B4 #define GL_OUTPUT_TEXTURE_COORD24_EXT 0x87B5 #define GL_OUTPUT_TEXTURE_COORD25_EXT 0x87B6 #define GL_OUTPUT_TEXTURE_COORD26_EXT 0x87B7 #define GL_OUTPUT_TEXTURE_COORD27_EXT 0x87B8 #define GL_OUTPUT_TEXTURE_COORD28_EXT 0x87B9 #define GL_OUTPUT_TEXTURE_COORD29_EXT 0x87BA #define GL_OUTPUT_TEXTURE_COORD30_EXT 0x87BB #define GL_OUTPUT_TEXTURE_COORD31_EXT 0x87BC #define GL_OUTPUT_FOG_EXT 0x87BD #define GL_SCALAR_EXT 0x87BE #define GL_VECTOR_EXT 0x87BF #define GL_MATRIX_EXT 0x87C0 #define GL_VARIANT_EXT 0x87C1 #define GL_INVARIANT_EXT 0x87C2 #define GL_LOCAL_CONSTANT_EXT 0x87C3 #define GL_LOCAL_EXT 0x87C4 #define GL_MAX_VERTEX_SHADER_INSTRUCTIONS_EXT 0x87C5 #define GL_MAX_VERTEX_SHADER_VARIANTS_EXT 0x87C6 #define GL_MAX_VERTEX_SHADER_INVARIANTS_EXT 0x87C7 #define GL_MAX_VERTEX_SHADER_LOCAL_CONSTANTS_EXT 0x87C8 #define GL_MAX_VERTEX_SHADER_LOCALS_EXT 0x87C9 #define GL_MAX_OPTIMIZED_VERTEX_SHADER_INSTRUCTIONS_EXT 0x87CA #define GL_MAX_OPTIMIZED_VERTEX_SHADER_VARIANTS_EXT 0x87CB #define GL_MAX_OPTIMIZED_VERTEX_SHADER_INVARIANTS_EXT 0x87CC #define GL_MAX_OPTIMIZED_VERTEX_SHADER_LOCAL_CONSTANTS_EXT 0x87CD #define GL_MAX_OPTIMIZED_VERTEX_SHADER_LOCALS_EXT 0x87CE #define GL_VERTEX_SHADER_INSTRUCTIONS_EXT 0x87CF #define GL_VERTEX_SHADER_VARIANTS_EXT 0x87D0 #define GL_VERTEX_SHADER_INVARIANTS_EXT 0x87D1 #define GL_VERTEX_SHADER_LOCAL_CONSTANTS_EXT 0x87D2 #define GL_VERTEX_SHADER_LOCALS_EXT 0x87D3 #define GL_VERTEX_SHADER_OPTIMIZED_EXT 0x87D4 #define GL_X_EXT 0x87D5 #define GL_Y_EXT 0x87D6 #define GL_Z_EXT 0x87D7 #define GL_W_EXT 0x87D8 #define GL_NEGATIVE_X_EXT 0x87D9 #define GL_NEGATIVE_Y_EXT 0x87DA #define GL_NEGATIVE_Z_EXT 0x87DB #define GL_NEGATIVE_W_EXT 0x87DC #define GL_ZERO_EXT 0x87DD #define GL_ONE_EXT 0x87DE #define GL_NEGATIVE_ONE_EXT 0x87DF #define GL_NORMALIZED_RANGE_EXT 0x87E0 #define GL_FULL_RANGE_EXT 0x87E1 #define GL_CURRENT_VERTEX_EXT 0x87E2 #define GL_MVP_MATRIX_EXT 0x87E3 #define GL_VARIANT_VALUE_EXT 0x87E4 #define GL_VARIANT_DATATYPE_EXT 0x87E5 #define GL_VARIANT_ARRAY_STRIDE_EXT 0x87E6 #define GL_VARIANT_ARRAY_TYPE_EXT 0x87E7 #define GL_VARIANT_ARRAY_EXT 0x87E8 #define GL_VARIANT_ARRAY_POINTER_EXT 0x87E9 #define GL_INVARIANT_VALUE_EXT 0x87EA #define GL_INVARIANT_DATATYPE_EXT 0x87EB #define GL_LOCAL_CONSTANT_VALUE_EXT 0x87EC #define GL_LOCAL_CONSTANT_DATATYPE_EXT 0x87ED typedef void (GLAPIENTRY * PFNGLBEGINVERTEXSHADEREXTPROC) (void); typedef GLuint (GLAPIENTRY * PFNGLBINDLIGHTPARAMETEREXTPROC) (GLenum light, GLenum value); typedef GLuint (GLAPIENTRY * PFNGLBINDMATERIALPARAMETEREXTPROC) (GLenum face, GLenum value); typedef GLuint (GLAPIENTRY * PFNGLBINDPARAMETEREXTPROC) (GLenum value); typedef GLuint (GLAPIENTRY * PFNGLBINDTEXGENPARAMETEREXTPROC) (GLenum unit, GLenum coord, GLenum value); typedef GLuint (GLAPIENTRY * PFNGLBINDTEXTUREUNITPARAMETEREXTPROC) (GLenum unit, GLenum value); typedef void (GLAPIENTRY * PFNGLBINDVERTEXSHADEREXTPROC) (GLuint id); typedef void (GLAPIENTRY * PFNGLDELETEVERTEXSHADEREXTPROC) (GLuint id); typedef void (GLAPIENTRY * PFNGLDISABLEVARIANTCLIENTSTATEEXTPROC) (GLuint id); typedef void (GLAPIENTRY * PFNGLENABLEVARIANTCLIENTSTATEEXTPROC) (GLuint id); typedef void (GLAPIENTRY * PFNGLENDVERTEXSHADEREXTPROC) (void); typedef void (GLAPIENTRY * PFNGLEXTRACTCOMPONENTEXTPROC) (GLuint res, GLuint src, GLuint num); typedef GLuint (GLAPIENTRY * PFNGLGENSYMBOLSEXTPROC) (GLenum dataType, GLenum storageType, GLenum range, GLuint components); typedef GLuint (GLAPIENTRY * PFNGLGENVERTEXSHADERSEXTPROC) (GLuint range); typedef void (GLAPIENTRY * PFNGLGETINVARIANTBOOLEANVEXTPROC) (GLuint id, GLenum value, GLboolean *data); typedef void (GLAPIENTRY * PFNGLGETINVARIANTFLOATVEXTPROC) (GLuint id, GLenum value, GLfloat *data); typedef void (GLAPIENTRY * PFNGLGETINVARIANTINTEGERVEXTPROC) (GLuint id, GLenum value, GLint *data); typedef void (GLAPIENTRY * PFNGLGETLOCALCONSTANTBOOLEANVEXTPROC) (GLuint id, GLenum value, GLboolean *data); typedef void (GLAPIENTRY * PFNGLGETLOCALCONSTANTFLOATVEXTPROC) (GLuint id, GLenum value, GLfloat *data); typedef void (GLAPIENTRY * PFNGLGETLOCALCONSTANTINTEGERVEXTPROC) (GLuint id, GLenum value, GLint *data); typedef void (GLAPIENTRY * PFNGLGETVARIANTBOOLEANVEXTPROC) (GLuint id, GLenum value, GLboolean *data); typedef void (GLAPIENTRY * PFNGLGETVARIANTFLOATVEXTPROC) (GLuint id, GLenum value, GLfloat *data); typedef void (GLAPIENTRY * PFNGLGETVARIANTINTEGERVEXTPROC) (GLuint id, GLenum value, GLint *data); typedef void (GLAPIENTRY * PFNGLGETVARIANTPOINTERVEXTPROC) (GLuint id, GLenum value, GLvoid **data); typedef void (GLAPIENTRY * PFNGLINSERTCOMPONENTEXTPROC) (GLuint res, GLuint src, GLuint num); typedef GLboolean (GLAPIENTRY * PFNGLISVARIANTENABLEDEXTPROC) (GLuint id, GLenum cap); typedef void (GLAPIENTRY * PFNGLSETINVARIANTEXTPROC) (GLuint id, GLenum type, GLvoid *addr); typedef void (GLAPIENTRY * PFNGLSETLOCALCONSTANTEXTPROC) (GLuint id, GLenum type, GLvoid *addr); typedef void (GLAPIENTRY * PFNGLSHADEROP1EXTPROC) (GLenum op, GLuint res, GLuint arg1); typedef void (GLAPIENTRY * PFNGLSHADEROP2EXTPROC) (GLenum op, GLuint res, GLuint arg1, GLuint arg2); typedef void (GLAPIENTRY * PFNGLSHADEROP3EXTPROC) (GLenum op, GLuint res, GLuint arg1, GLuint arg2, GLuint arg3); typedef void (GLAPIENTRY * PFNGLSWIZZLEEXTPROC) (GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum outZ, GLenum outW); typedef void (GLAPIENTRY * PFNGLVARIANTPOINTEREXTPROC) (GLuint id, GLenum type, GLuint stride, GLvoid *addr); typedef void (GLAPIENTRY * PFNGLVARIANTBVEXTPROC) (GLuint id, GLbyte *addr); typedef void (GLAPIENTRY * PFNGLVARIANTDVEXTPROC) (GLuint id, GLdouble *addr); typedef void (GLAPIENTRY * PFNGLVARIANTFVEXTPROC) (GLuint id, GLfloat *addr); typedef void (GLAPIENTRY * PFNGLVARIANTIVEXTPROC) (GLuint id, GLint *addr); typedef void (GLAPIENTRY * PFNGLVARIANTSVEXTPROC) (GLuint id, GLshort *addr); typedef void (GLAPIENTRY * PFNGLVARIANTUBVEXTPROC) (GLuint id, GLubyte *addr); typedef void (GLAPIENTRY * PFNGLVARIANTUIVEXTPROC) (GLuint id, GLuint *addr); typedef void (GLAPIENTRY * PFNGLVARIANTUSVEXTPROC) (GLuint id, GLushort *addr); typedef void (GLAPIENTRY * PFNGLWRITEMASKEXTPROC) (GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum outZ, GLenum outW); #define glBeginVertexShaderEXT GLEW_GET_FUN(__glewBeginVertexShaderEXT) #define glBindLightParameterEXT GLEW_GET_FUN(__glewBindLightParameterEXT) #define glBindMaterialParameterEXT GLEW_GET_FUN(__glewBindMaterialParameterEXT) #define glBindParameterEXT GLEW_GET_FUN(__glewBindParameterEXT) #define glBindTexGenParameterEXT GLEW_GET_FUN(__glewBindTexGenParameterEXT) #define glBindTextureUnitParameterEXT GLEW_GET_FUN(__glewBindTextureUnitParameterEXT) #define glBindVertexShaderEXT GLEW_GET_FUN(__glewBindVertexShaderEXT) #define glDeleteVertexShaderEXT GLEW_GET_FUN(__glewDeleteVertexShaderEXT) #define glDisableVariantClientStateEXT GLEW_GET_FUN(__glewDisableVariantClientStateEXT) #define glEnableVariantClientStateEXT GLEW_GET_FUN(__glewEnableVariantClientStateEXT) #define glEndVertexShaderEXT GLEW_GET_FUN(__glewEndVertexShaderEXT) #define glExtractComponentEXT GLEW_GET_FUN(__glewExtractComponentEXT) #define glGenSymbolsEXT GLEW_GET_FUN(__glewGenSymbolsEXT) #define glGenVertexShadersEXT GLEW_GET_FUN(__glewGenVertexShadersEXT) #define glGetInvariantBooleanvEXT GLEW_GET_FUN(__glewGetInvariantBooleanvEXT) #define glGetInvariantFloatvEXT GLEW_GET_FUN(__glewGetInvariantFloatvEXT) #define glGetInvariantIntegervEXT GLEW_GET_FUN(__glewGetInvariantIntegervEXT) #define glGetLocalConstantBooleanvEXT GLEW_GET_FUN(__glewGetLocalConstantBooleanvEXT) #define glGetLocalConstantFloatvEXT GLEW_GET_FUN(__glewGetLocalConstantFloatvEXT) #define glGetLocalConstantIntegervEXT GLEW_GET_FUN(__glewGetLocalConstantIntegervEXT) #define glGetVariantBooleanvEXT GLEW_GET_FUN(__glewGetVariantBooleanvEXT) #define glGetVariantFloatvEXT GLEW_GET_FUN(__glewGetVariantFloatvEXT) #define glGetVariantIntegervEXT GLEW_GET_FUN(__glewGetVariantIntegervEXT) #define glGetVariantPointervEXT GLEW_GET_FUN(__glewGetVariantPointervEXT) #define glInsertComponentEXT GLEW_GET_FUN(__glewInsertComponentEXT) #define glIsVariantEnabledEXT GLEW_GET_FUN(__glewIsVariantEnabledEXT) #define glSetInvariantEXT GLEW_GET_FUN(__glewSetInvariantEXT) #define glSetLocalConstantEXT GLEW_GET_FUN(__glewSetLocalConstantEXT) #define glShaderOp1EXT GLEW_GET_FUN(__glewShaderOp1EXT) #define glShaderOp2EXT GLEW_GET_FUN(__glewShaderOp2EXT) #define glShaderOp3EXT GLEW_GET_FUN(__glewShaderOp3EXT) #define glSwizzleEXT GLEW_GET_FUN(__glewSwizzleEXT) #define glVariantPointerEXT GLEW_GET_FUN(__glewVariantPointerEXT) #define glVariantbvEXT GLEW_GET_FUN(__glewVariantbvEXT) #define glVariantdvEXT GLEW_GET_FUN(__glewVariantdvEXT) #define glVariantfvEXT GLEW_GET_FUN(__glewVariantfvEXT) #define glVariantivEXT GLEW_GET_FUN(__glewVariantivEXT) #define glVariantsvEXT GLEW_GET_FUN(__glewVariantsvEXT) #define glVariantubvEXT GLEW_GET_FUN(__glewVariantubvEXT) #define glVariantuivEXT GLEW_GET_FUN(__glewVariantuivEXT) #define glVariantusvEXT GLEW_GET_FUN(__glewVariantusvEXT) #define glWriteMaskEXT GLEW_GET_FUN(__glewWriteMaskEXT) #define GLEW_EXT_vertex_shader GLEW_GET_VAR(__GLEW_EXT_vertex_shader) #endif /* GL_EXT_vertex_shader */ /* ------------------------ GL_EXT_vertex_weighting ------------------------ */ #ifndef GL_EXT_vertex_weighting #define GL_EXT_vertex_weighting 1 #define GL_MODELVIEW0_STACK_DEPTH_EXT 0x0BA3 #define GL_MODELVIEW0_MATRIX_EXT 0x0BA6 #define GL_MODELVIEW0_EXT 0x1700 #define GL_MODELVIEW1_STACK_DEPTH_EXT 0x8502 #define GL_MODELVIEW1_MATRIX_EXT 0x8506 #define GL_VERTEX_WEIGHTING_EXT 0x8509 #define GL_MODELVIEW1_EXT 0x850A #define GL_CURRENT_VERTEX_WEIGHT_EXT 0x850B #define GL_VERTEX_WEIGHT_ARRAY_EXT 0x850C #define GL_VERTEX_WEIGHT_ARRAY_SIZE_EXT 0x850D #define GL_VERTEX_WEIGHT_ARRAY_TYPE_EXT 0x850E #define GL_VERTEX_WEIGHT_ARRAY_STRIDE_EXT 0x850F #define GL_VERTEX_WEIGHT_ARRAY_POINTER_EXT 0x8510 typedef void (GLAPIENTRY * PFNGLVERTEXWEIGHTPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, void* pointer); typedef void (GLAPIENTRY * PFNGLVERTEXWEIGHTFEXTPROC) (GLfloat weight); typedef void (GLAPIENTRY * PFNGLVERTEXWEIGHTFVEXTPROC) (GLfloat* weight); #define glVertexWeightPointerEXT GLEW_GET_FUN(__glewVertexWeightPointerEXT) #define glVertexWeightfEXT GLEW_GET_FUN(__glewVertexWeightfEXT) #define glVertexWeightfvEXT GLEW_GET_FUN(__glewVertexWeightfvEXT) #define GLEW_EXT_vertex_weighting GLEW_GET_VAR(__GLEW_EXT_vertex_weighting) #endif /* GL_EXT_vertex_weighting */ /* ------------------------- GL_EXT_x11_sync_object ------------------------ */ #ifndef GL_EXT_x11_sync_object #define GL_EXT_x11_sync_object 1 #define GL_SYNC_X11_FENCE_EXT 0x90E1 typedef GLsync (GLAPIENTRY * PFNGLIMPORTSYNCEXTPROC) (GLenum external_sync_type, GLintptr external_sync, GLbitfield flags); #define glImportSyncEXT GLEW_GET_FUN(__glewImportSyncEXT) #define GLEW_EXT_x11_sync_object GLEW_GET_VAR(__GLEW_EXT_x11_sync_object) #endif /* GL_EXT_x11_sync_object */ /* ---------------------- GL_GREMEDY_frame_terminator ---------------------- */ #ifndef GL_GREMEDY_frame_terminator #define GL_GREMEDY_frame_terminator 1 typedef void (GLAPIENTRY * PFNGLFRAMETERMINATORGREMEDYPROC) (void); #define glFrameTerminatorGREMEDY GLEW_GET_FUN(__glewFrameTerminatorGREMEDY) #define GLEW_GREMEDY_frame_terminator GLEW_GET_VAR(__GLEW_GREMEDY_frame_terminator) #endif /* GL_GREMEDY_frame_terminator */ /* ------------------------ GL_GREMEDY_string_marker ----------------------- */ #ifndef GL_GREMEDY_string_marker #define GL_GREMEDY_string_marker 1 typedef void (GLAPIENTRY * PFNGLSTRINGMARKERGREMEDYPROC) (GLsizei len, const void* string); #define glStringMarkerGREMEDY GLEW_GET_FUN(__glewStringMarkerGREMEDY) #define GLEW_GREMEDY_string_marker GLEW_GET_VAR(__GLEW_GREMEDY_string_marker) #endif /* GL_GREMEDY_string_marker */ /* --------------------- GL_HP_convolution_border_modes -------------------- */ #ifndef GL_HP_convolution_border_modes #define GL_HP_convolution_border_modes 1 #define GLEW_HP_convolution_border_modes GLEW_GET_VAR(__GLEW_HP_convolution_border_modes) #endif /* GL_HP_convolution_border_modes */ /* ------------------------- GL_HP_image_transform ------------------------- */ #ifndef GL_HP_image_transform #define GL_HP_image_transform 1 typedef void (GLAPIENTRY * PFNGLGETIMAGETRANSFORMPARAMETERFVHPPROC) (GLenum target, GLenum pname, const GLfloat* params); typedef void (GLAPIENTRY * PFNGLGETIMAGETRANSFORMPARAMETERIVHPPROC) (GLenum target, GLenum pname, const GLint* params); typedef void (GLAPIENTRY * PFNGLIMAGETRANSFORMPARAMETERFHPPROC) (GLenum target, GLenum pname, const GLfloat param); typedef void (GLAPIENTRY * PFNGLIMAGETRANSFORMPARAMETERFVHPPROC) (GLenum target, GLenum pname, const GLfloat* params); typedef void (GLAPIENTRY * PFNGLIMAGETRANSFORMPARAMETERIHPPROC) (GLenum target, GLenum pname, const GLint param); typedef void (GLAPIENTRY * PFNGLIMAGETRANSFORMPARAMETERIVHPPROC) (GLenum target, GLenum pname, const GLint* params); #define glGetImageTransformParameterfvHP GLEW_GET_FUN(__glewGetImageTransformParameterfvHP) #define glGetImageTransformParameterivHP GLEW_GET_FUN(__glewGetImageTransformParameterivHP) #define glImageTransformParameterfHP GLEW_GET_FUN(__glewImageTransformParameterfHP) #define glImageTransformParameterfvHP GLEW_GET_FUN(__glewImageTransformParameterfvHP) #define glImageTransformParameteriHP GLEW_GET_FUN(__glewImageTransformParameteriHP) #define glImageTransformParameterivHP GLEW_GET_FUN(__glewImageTransformParameterivHP) #define GLEW_HP_image_transform GLEW_GET_VAR(__GLEW_HP_image_transform) #endif /* GL_HP_image_transform */ /* -------------------------- GL_HP_occlusion_test ------------------------- */ #ifndef GL_HP_occlusion_test #define GL_HP_occlusion_test 1 #define GL_OCCLUSION_TEST_HP 0x8165 #define GL_OCCLUSION_TEST_RESULT_HP 0x8166 #define GLEW_HP_occlusion_test GLEW_GET_VAR(__GLEW_HP_occlusion_test) #endif /* GL_HP_occlusion_test */ /* ------------------------- GL_HP_texture_lighting ------------------------ */ #ifndef GL_HP_texture_lighting #define GL_HP_texture_lighting 1 #define GLEW_HP_texture_lighting GLEW_GET_VAR(__GLEW_HP_texture_lighting) #endif /* GL_HP_texture_lighting */ /* --------------------------- GL_IBM_cull_vertex -------------------------- */ #ifndef GL_IBM_cull_vertex #define GL_IBM_cull_vertex 1 #define GL_CULL_VERTEX_IBM 103050 #define GLEW_IBM_cull_vertex GLEW_GET_VAR(__GLEW_IBM_cull_vertex) #endif /* GL_IBM_cull_vertex */ /* ---------------------- GL_IBM_multimode_draw_arrays --------------------- */ #ifndef GL_IBM_multimode_draw_arrays #define GL_IBM_multimode_draw_arrays 1 typedef void (GLAPIENTRY * PFNGLMULTIMODEDRAWARRAYSIBMPROC) (const GLenum* mode, const GLint *first, const GLsizei *count, GLsizei primcount, GLint modestride); typedef void (GLAPIENTRY * PFNGLMULTIMODEDRAWELEMENTSIBMPROC) (const GLenum* mode, const GLsizei *count, GLenum type, const GLvoid * const *indices, GLsizei primcount, GLint modestride); #define glMultiModeDrawArraysIBM GLEW_GET_FUN(__glewMultiModeDrawArraysIBM) #define glMultiModeDrawElementsIBM GLEW_GET_FUN(__glewMultiModeDrawElementsIBM) #define GLEW_IBM_multimode_draw_arrays GLEW_GET_VAR(__GLEW_IBM_multimode_draw_arrays) #endif /* GL_IBM_multimode_draw_arrays */ /* ------------------------- GL_IBM_rasterpos_clip ------------------------- */ #ifndef GL_IBM_rasterpos_clip #define GL_IBM_rasterpos_clip 1 #define GL_RASTER_POSITION_UNCLIPPED_IBM 103010 #define GLEW_IBM_rasterpos_clip GLEW_GET_VAR(__GLEW_IBM_rasterpos_clip) #endif /* GL_IBM_rasterpos_clip */ /* --------------------------- GL_IBM_static_data -------------------------- */ #ifndef GL_IBM_static_data #define GL_IBM_static_data 1 #define GL_ALL_STATIC_DATA_IBM 103060 #define GL_STATIC_VERTEX_ARRAY_IBM 103061 #define GLEW_IBM_static_data GLEW_GET_VAR(__GLEW_IBM_static_data) #endif /* GL_IBM_static_data */ /* --------------------- GL_IBM_texture_mirrored_repeat -------------------- */ #ifndef GL_IBM_texture_mirrored_repeat #define GL_IBM_texture_mirrored_repeat 1 #define GL_MIRRORED_REPEAT_IBM 0x8370 #define GLEW_IBM_texture_mirrored_repeat GLEW_GET_VAR(__GLEW_IBM_texture_mirrored_repeat) #endif /* GL_IBM_texture_mirrored_repeat */ /* ----------------------- GL_IBM_vertex_array_lists ----------------------- */ #ifndef GL_IBM_vertex_array_lists #define GL_IBM_vertex_array_lists 1 #define GL_VERTEX_ARRAY_LIST_IBM 103070 #define GL_NORMAL_ARRAY_LIST_IBM 103071 #define GL_COLOR_ARRAY_LIST_IBM 103072 #define GL_INDEX_ARRAY_LIST_IBM 103073 #define GL_TEXTURE_COORD_ARRAY_LIST_IBM 103074 #define GL_EDGE_FLAG_ARRAY_LIST_IBM 103075 #define GL_FOG_COORDINATE_ARRAY_LIST_IBM 103076 #define GL_SECONDARY_COLOR_ARRAY_LIST_IBM 103077 #define GL_VERTEX_ARRAY_LIST_STRIDE_IBM 103080 #define GL_NORMAL_ARRAY_LIST_STRIDE_IBM 103081 #define GL_COLOR_ARRAY_LIST_STRIDE_IBM 103082 #define GL_INDEX_ARRAY_LIST_STRIDE_IBM 103083 #define GL_TEXTURE_COORD_ARRAY_LIST_STRIDE_IBM 103084 #define GL_EDGE_FLAG_ARRAY_LIST_STRIDE_IBM 103085 #define GL_FOG_COORDINATE_ARRAY_LIST_STRIDE_IBM 103086 #define GL_SECONDARY_COLOR_ARRAY_LIST_STRIDE_IBM 103087 typedef void (GLAPIENTRY * PFNGLCOLORPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const GLvoid ** pointer, GLint ptrstride); typedef void (GLAPIENTRY * PFNGLEDGEFLAGPOINTERLISTIBMPROC) (GLint stride, const GLboolean ** pointer, GLint ptrstride); typedef void (GLAPIENTRY * PFNGLFOGCOORDPOINTERLISTIBMPROC) (GLenum type, GLint stride, const GLvoid ** pointer, GLint ptrstride); typedef void (GLAPIENTRY * PFNGLINDEXPOINTERLISTIBMPROC) (GLenum type, GLint stride, const GLvoid ** pointer, GLint ptrstride); typedef void (GLAPIENTRY * PFNGLNORMALPOINTERLISTIBMPROC) (GLenum type, GLint stride, const GLvoid ** pointer, GLint ptrstride); typedef void (GLAPIENTRY * PFNGLSECONDARYCOLORPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const GLvoid ** pointer, GLint ptrstride); typedef void (GLAPIENTRY * PFNGLTEXCOORDPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const GLvoid ** pointer, GLint ptrstride); typedef void (GLAPIENTRY * PFNGLVERTEXPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const GLvoid ** pointer, GLint ptrstride); #define glColorPointerListIBM GLEW_GET_FUN(__glewColorPointerListIBM) #define glEdgeFlagPointerListIBM GLEW_GET_FUN(__glewEdgeFlagPointerListIBM) #define glFogCoordPointerListIBM GLEW_GET_FUN(__glewFogCoordPointerListIBM) #define glIndexPointerListIBM GLEW_GET_FUN(__glewIndexPointerListIBM) #define glNormalPointerListIBM GLEW_GET_FUN(__glewNormalPointerListIBM) #define glSecondaryColorPointerListIBM GLEW_GET_FUN(__glewSecondaryColorPointerListIBM) #define glTexCoordPointerListIBM GLEW_GET_FUN(__glewTexCoordPointerListIBM) #define glVertexPointerListIBM GLEW_GET_FUN(__glewVertexPointerListIBM) #define GLEW_IBM_vertex_array_lists GLEW_GET_VAR(__GLEW_IBM_vertex_array_lists) #endif /* GL_IBM_vertex_array_lists */ /* -------------------------- GL_INGR_color_clamp -------------------------- */ #ifndef GL_INGR_color_clamp #define GL_INGR_color_clamp 1 #define GL_RED_MIN_CLAMP_INGR 0x8560 #define GL_GREEN_MIN_CLAMP_INGR 0x8561 #define GL_BLUE_MIN_CLAMP_INGR 0x8562 #define GL_ALPHA_MIN_CLAMP_INGR 0x8563 #define GL_RED_MAX_CLAMP_INGR 0x8564 #define GL_GREEN_MAX_CLAMP_INGR 0x8565 #define GL_BLUE_MAX_CLAMP_INGR 0x8566 #define GL_ALPHA_MAX_CLAMP_INGR 0x8567 #define GLEW_INGR_color_clamp GLEW_GET_VAR(__GLEW_INGR_color_clamp) #endif /* GL_INGR_color_clamp */ /* ------------------------- GL_INGR_interlace_read ------------------------ */ #ifndef GL_INGR_interlace_read #define GL_INGR_interlace_read 1 #define GL_INTERLACE_READ_INGR 0x8568 #define GLEW_INGR_interlace_read GLEW_GET_VAR(__GLEW_INGR_interlace_read) #endif /* GL_INGR_interlace_read */ /* ------------------------ GL_INTEL_parallel_arrays ----------------------- */ #ifndef GL_INTEL_parallel_arrays #define GL_INTEL_parallel_arrays 1 #define GL_PARALLEL_ARRAYS_INTEL 0x83F4 #define GL_VERTEX_ARRAY_PARALLEL_POINTERS_INTEL 0x83F5 #define GL_NORMAL_ARRAY_PARALLEL_POINTERS_INTEL 0x83F6 #define GL_COLOR_ARRAY_PARALLEL_POINTERS_INTEL 0x83F7 #define GL_TEXTURE_COORD_ARRAY_PARALLEL_POINTERS_INTEL 0x83F8 typedef void (GLAPIENTRY * PFNGLCOLORPOINTERVINTELPROC) (GLint size, GLenum type, const void** pointer); typedef void (GLAPIENTRY * PFNGLNORMALPOINTERVINTELPROC) (GLenum type, const void** pointer); typedef void (GLAPIENTRY * PFNGLTEXCOORDPOINTERVINTELPROC) (GLint size, GLenum type, const void** pointer); typedef void (GLAPIENTRY * PFNGLVERTEXPOINTERVINTELPROC) (GLint size, GLenum type, const void** pointer); #define glColorPointervINTEL GLEW_GET_FUN(__glewColorPointervINTEL) #define glNormalPointervINTEL GLEW_GET_FUN(__glewNormalPointervINTEL) #define glTexCoordPointervINTEL GLEW_GET_FUN(__glewTexCoordPointervINTEL) #define glVertexPointervINTEL GLEW_GET_FUN(__glewVertexPointervINTEL) #define GLEW_INTEL_parallel_arrays GLEW_GET_VAR(__GLEW_INTEL_parallel_arrays) #endif /* GL_INTEL_parallel_arrays */ /* ------------------------ GL_INTEL_texture_scissor ----------------------- */ #ifndef GL_INTEL_texture_scissor #define GL_INTEL_texture_scissor 1 typedef void (GLAPIENTRY * PFNGLTEXSCISSORFUNCINTELPROC) (GLenum target, GLenum lfunc, GLenum hfunc); typedef void (GLAPIENTRY * PFNGLTEXSCISSORINTELPROC) (GLenum target, GLclampf tlow, GLclampf thigh); #define glTexScissorFuncINTEL GLEW_GET_FUN(__glewTexScissorFuncINTEL) #define glTexScissorINTEL GLEW_GET_FUN(__glewTexScissorINTEL) #define GLEW_INTEL_texture_scissor GLEW_GET_VAR(__GLEW_INTEL_texture_scissor) #endif /* GL_INTEL_texture_scissor */ /* ------------------------------ GL_KHR_debug ----------------------------- */ #ifndef GL_KHR_debug #define GL_KHR_debug 1 #define GL_CONTEXT_FLAG_DEBUG_BIT 0x00000002 #define GL_STACK_OVERFLOW 0x0503 #define GL_STACK_UNDERFLOW 0x0504 #define GL_DEBUG_OUTPUT_SYNCHRONOUS 0x8242 #define GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH 0x8243 #define GL_DEBUG_CALLBACK_FUNCTION 0x8244 #define GL_DEBUG_CALLBACK_USER_PARAM 0x8245 #define GL_DEBUG_SOURCE_API 0x8246 #define GL_DEBUG_SOURCE_WINDOW_SYSTEM 0x8247 #define GL_DEBUG_SOURCE_SHADER_COMPILER 0x8248 #define GL_DEBUG_SOURCE_THIRD_PARTY 0x8249 #define GL_DEBUG_SOURCE_APPLICATION 0x824A #define GL_DEBUG_SOURCE_OTHER 0x824B #define GL_DEBUG_TYPE_ERROR 0x824C #define GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR 0x824D #define GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR 0x824E #define GL_DEBUG_TYPE_PORTABILITY 0x824F #define GL_DEBUG_TYPE_PERFORMANCE 0x8250 #define GL_DEBUG_TYPE_OTHER 0x8251 #define GL_DEBUG_TYPE_MARKER 0x8268 #define GL_DEBUG_TYPE_PUSH_GROUP 0x8269 #define GL_DEBUG_TYPE_POP_GROUP 0x826A #define GL_DEBUG_SEVERITY_NOTIFICATION 0x826B #define GL_MAX_DEBUG_GROUP_STACK_DEPTH 0x826C #define GL_DEBUG_GROUP_STACK_DEPTH 0x826D #define GL_BUFFER 0x82E0 #define GL_SHADER 0x82E1 #define GL_PROGRAM 0x82E2 #define GL_QUERY 0x82E3 #define GL_PROGRAM_PIPELINE 0x82E4 #define GL_SAMPLER 0x82E6 #define GL_DISPLAY_LIST 0x82E7 #define GL_MAX_LABEL_LENGTH 0x82E8 #define GL_MAX_DEBUG_MESSAGE_LENGTH 0x9143 #define GL_MAX_DEBUG_LOGGED_MESSAGES 0x9144 #define GL_DEBUG_LOGGED_MESSAGES 0x9145 #define GL_DEBUG_SEVERITY_HIGH 0x9146 #define GL_DEBUG_SEVERITY_MEDIUM 0x9147 #define GL_DEBUG_SEVERITY_LOW 0x9148 #define GL_DEBUG_OUTPUT 0x92E0 typedef void (APIENTRY *GLDEBUGPROC)(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar* message, GLvoid* userParam); typedef void (GLAPIENTRY * PFNGLDEBUGMESSAGECALLBACKPROC) (GLDEBUGPROC callback, void* userParam); typedef void (GLAPIENTRY * PFNGLDEBUGMESSAGECONTROLPROC) (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint* ids, GLboolean enabled); typedef void (GLAPIENTRY * PFNGLDEBUGMESSAGEINSERTPROC) (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar* buf); typedef GLuint (GLAPIENTRY * PFNGLGETDEBUGMESSAGELOGPROC) (GLuint count, GLsizei bufsize, GLenum* sources, GLenum* types, GLuint* ids, GLenum* severities, GLsizei* lengths, GLchar* messageLog); typedef void (GLAPIENTRY * PFNGLGETOBJECTLABELPROC) (GLenum identifier, GLuint name, GLsizei bufSize, GLsizei* length, GLchar *label); typedef void (GLAPIENTRY * PFNGLGETOBJECTPTRLABELPROC) (void* ptr, GLsizei bufSize, GLsizei* length, GLchar *label); typedef void (GLAPIENTRY * PFNGLGETPOINTERVPROC) (GLenum pname, void** params); typedef void (GLAPIENTRY * PFNGLOBJECTLABELPROC) (GLenum identifier, GLuint name, GLsizei length, const GLchar* label); typedef void (GLAPIENTRY * PFNGLOBJECTPTRLABELPROC) (void* ptr, GLsizei length, const GLchar* label); typedef void (GLAPIENTRY * PFNGLPUSHDEBUGGROUPPROC) (GLenum source, GLuint id, GLsizei length, const GLchar * message); #define glDebugMessageCallback GLEW_GET_FUN(__glewDebugMessageCallback) #define glDebugMessageControl GLEW_GET_FUN(__glewDebugMessageControl) #define glDebugMessageInsert GLEW_GET_FUN(__glewDebugMessageInsert) #define glGetDebugMessageLog GLEW_GET_FUN(__glewGetDebugMessageLog) #define glGetObjectLabel GLEW_GET_FUN(__glewGetObjectLabel) #define glGetObjectPtrLabel GLEW_GET_FUN(__glewGetObjectPtrLabel) #define glGetPointerv GLEW_GET_FUN(__glewGetPointerv) #define glObjectLabel GLEW_GET_FUN(__glewObjectLabel) #define glObjectPtrLabel GLEW_GET_FUN(__glewObjectPtrLabel) #define glPushDebugGroup GLEW_GET_FUN(__glewPushDebugGroup) #define GLEW_KHR_debug GLEW_GET_VAR(__GLEW_KHR_debug) #endif /* GL_KHR_debug */ /* ------------------ GL_KHR_texture_compression_astc_ldr ------------------ */ #ifndef GL_KHR_texture_compression_astc_ldr #define GL_KHR_texture_compression_astc_ldr 1 #define GL_COMPRESSED_RGBA_ASTC_4x4_KHR 0x93B0 #define GL_COMPRESSED_RGBA_ASTC_5x4_KHR 0x93B1 #define GL_COMPRESSED_RGBA_ASTC_5x5_KHR 0x93B2 #define GL_COMPRESSED_RGBA_ASTC_6x5_KHR 0x93B3 #define GL_COMPRESSED_RGBA_ASTC_6x6_KHR 0x93B4 #define GL_COMPRESSED_RGBA_ASTC_8x5_KHR 0x93B5 #define GL_COMPRESSED_RGBA_ASTC_8x6_KHR 0x93B6 #define GL_COMPRESSED_RGBA_ASTC_8x8_KHR 0x93B7 #define GL_COMPRESSED_RGBA_ASTC_10x5_KHR 0x93B8 #define GL_COMPRESSED_RGBA_ASTC_10x6_KHR 0x93B9 #define GL_COMPRESSED_RGBA_ASTC_10x8_KHR 0x93BA #define GL_COMPRESSED_RGBA_ASTC_10x10_KHR 0x93BB #define GL_COMPRESSED_RGBA_ASTC_12x10_KHR 0x93BC #define GL_COMPRESSED_RGBA_ASTC_12x12_KHR 0x93BD #define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR 0x93D0 #define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR 0x93D1 #define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR 0x93D2 #define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR 0x93D3 #define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR 0x93D4 #define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR 0x93D5 #define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR 0x93D6 #define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR 0x93D7 #define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR 0x93D8 #define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR 0x93D9 #define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR 0x93DA #define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR 0x93DB #define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR 0x93DC #define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR 0x93DD #define GLEW_KHR_texture_compression_astc_ldr GLEW_GET_VAR(__GLEW_KHR_texture_compression_astc_ldr) #endif /* GL_KHR_texture_compression_astc_ldr */ /* -------------------------- GL_KTX_buffer_region ------------------------- */ #ifndef GL_KTX_buffer_region #define GL_KTX_buffer_region 1 #define GL_KTX_FRONT_REGION 0x0 #define GL_KTX_BACK_REGION 0x1 #define GL_KTX_Z_REGION 0x2 #define GL_KTX_STENCIL_REGION 0x3 typedef GLuint (GLAPIENTRY * PFNGLBUFFERREGIONENABLEDPROC) (void); typedef void (GLAPIENTRY * PFNGLDELETEBUFFERREGIONPROC) (GLenum region); typedef void (GLAPIENTRY * PFNGLDRAWBUFFERREGIONPROC) (GLuint region, GLint x, GLint y, GLsizei width, GLsizei height, GLint xDest, GLint yDest); typedef GLuint (GLAPIENTRY * PFNGLNEWBUFFERREGIONPROC) (GLenum region); typedef void (GLAPIENTRY * PFNGLREADBUFFERREGIONPROC) (GLuint region, GLint x, GLint y, GLsizei width, GLsizei height); #define glBufferRegionEnabled GLEW_GET_FUN(__glewBufferRegionEnabled) #define glDeleteBufferRegion GLEW_GET_FUN(__glewDeleteBufferRegion) #define glDrawBufferRegion GLEW_GET_FUN(__glewDrawBufferRegion) #define glNewBufferRegion GLEW_GET_FUN(__glewNewBufferRegion) #define glReadBufferRegion GLEW_GET_FUN(__glewReadBufferRegion) #define GLEW_KTX_buffer_region GLEW_GET_VAR(__GLEW_KTX_buffer_region) #endif /* GL_KTX_buffer_region */ /* ------------------------- GL_MESAX_texture_stack ------------------------ */ #ifndef GL_MESAX_texture_stack #define GL_MESAX_texture_stack 1 #define GL_TEXTURE_1D_STACK_MESAX 0x8759 #define GL_TEXTURE_2D_STACK_MESAX 0x875A #define GL_PROXY_TEXTURE_1D_STACK_MESAX 0x875B #define GL_PROXY_TEXTURE_2D_STACK_MESAX 0x875C #define GL_TEXTURE_1D_STACK_BINDING_MESAX 0x875D #define GL_TEXTURE_2D_STACK_BINDING_MESAX 0x875E #define GLEW_MESAX_texture_stack GLEW_GET_VAR(__GLEW_MESAX_texture_stack) #endif /* GL_MESAX_texture_stack */ /* -------------------------- GL_MESA_pack_invert -------------------------- */ #ifndef GL_MESA_pack_invert #define GL_MESA_pack_invert 1 #define GL_PACK_INVERT_MESA 0x8758 #define GLEW_MESA_pack_invert GLEW_GET_VAR(__GLEW_MESA_pack_invert) #endif /* GL_MESA_pack_invert */ /* ------------------------- GL_MESA_resize_buffers ------------------------ */ #ifndef GL_MESA_resize_buffers #define GL_MESA_resize_buffers 1 typedef void (GLAPIENTRY * PFNGLRESIZEBUFFERSMESAPROC) (void); #define glResizeBuffersMESA GLEW_GET_FUN(__glewResizeBuffersMESA) #define GLEW_MESA_resize_buffers GLEW_GET_VAR(__GLEW_MESA_resize_buffers) #endif /* GL_MESA_resize_buffers */ /* --------------------------- GL_MESA_window_pos -------------------------- */ #ifndef GL_MESA_window_pos #define GL_MESA_window_pos 1 typedef void (GLAPIENTRY * PFNGLWINDOWPOS2DMESAPROC) (GLdouble x, GLdouble y); typedef void (GLAPIENTRY * PFNGLWINDOWPOS2DVMESAPROC) (const GLdouble* p); typedef void (GLAPIENTRY * PFNGLWINDOWPOS2FMESAPROC) (GLfloat x, GLfloat y); typedef void (GLAPIENTRY * PFNGLWINDOWPOS2FVMESAPROC) (const GLfloat* p); typedef void (GLAPIENTRY * PFNGLWINDOWPOS2IMESAPROC) (GLint x, GLint y); typedef void (GLAPIENTRY * PFNGLWINDOWPOS2IVMESAPROC) (const GLint* p); typedef void (GLAPIENTRY * PFNGLWINDOWPOS2SMESAPROC) (GLshort x, GLshort y); typedef void (GLAPIENTRY * PFNGLWINDOWPOS2SVMESAPROC) (const GLshort* p); typedef void (GLAPIENTRY * PFNGLWINDOWPOS3DMESAPROC) (GLdouble x, GLdouble y, GLdouble z); typedef void (GLAPIENTRY * PFNGLWINDOWPOS3DVMESAPROC) (const GLdouble* p); typedef void (GLAPIENTRY * PFNGLWINDOWPOS3FMESAPROC) (GLfloat x, GLfloat y, GLfloat z); typedef void (GLAPIENTRY * PFNGLWINDOWPOS3FVMESAPROC) (const GLfloat* p); typedef void (GLAPIENTRY * PFNGLWINDOWPOS3IMESAPROC) (GLint x, GLint y, GLint z); typedef void (GLAPIENTRY * PFNGLWINDOWPOS3IVMESAPROC) (const GLint* p); typedef void (GLAPIENTRY * PFNGLWINDOWPOS3SMESAPROC) (GLshort x, GLshort y, GLshort z); typedef void (GLAPIENTRY * PFNGLWINDOWPOS3SVMESAPROC) (const GLshort* p); typedef void (GLAPIENTRY * PFNGLWINDOWPOS4DMESAPROC) (GLdouble x, GLdouble y, GLdouble z, GLdouble); typedef void (GLAPIENTRY * PFNGLWINDOWPOS4DVMESAPROC) (const GLdouble* p); typedef void (GLAPIENTRY * PFNGLWINDOWPOS4FMESAPROC) (GLfloat x, GLfloat y, GLfloat z, GLfloat w); typedef void (GLAPIENTRY * PFNGLWINDOWPOS4FVMESAPROC) (const GLfloat* p); typedef void (GLAPIENTRY * PFNGLWINDOWPOS4IMESAPROC) (GLint x, GLint y, GLint z, GLint w); typedef void (GLAPIENTRY * PFNGLWINDOWPOS4IVMESAPROC) (const GLint* p); typedef void (GLAPIENTRY * PFNGLWINDOWPOS4SMESAPROC) (GLshort x, GLshort y, GLshort z, GLshort w); typedef void (GLAPIENTRY * PFNGLWINDOWPOS4SVMESAPROC) (const GLshort* p); #define glWindowPos2dMESA GLEW_GET_FUN(__glewWindowPos2dMESA) #define glWindowPos2dvMESA GLEW_GET_FUN(__glewWindowPos2dvMESA) #define glWindowPos2fMESA GLEW_GET_FUN(__glewWindowPos2fMESA) #define glWindowPos2fvMESA GLEW_GET_FUN(__glewWindowPos2fvMESA) #define glWindowPos2iMESA GLEW_GET_FUN(__glewWindowPos2iMESA) #define glWindowPos2ivMESA GLEW_GET_FUN(__glewWindowPos2ivMESA) #define glWindowPos2sMESA GLEW_GET_FUN(__glewWindowPos2sMESA) #define glWindowPos2svMESA GLEW_GET_FUN(__glewWindowPos2svMESA) #define glWindowPos3dMESA GLEW_GET_FUN(__glewWindowPos3dMESA) #define glWindowPos3dvMESA GLEW_GET_FUN(__glewWindowPos3dvMESA) #define glWindowPos3fMESA GLEW_GET_FUN(__glewWindowPos3fMESA) #define glWindowPos3fvMESA GLEW_GET_FUN(__glewWindowPos3fvMESA) #define glWindowPos3iMESA GLEW_GET_FUN(__glewWindowPos3iMESA) #define glWindowPos3ivMESA GLEW_GET_FUN(__glewWindowPos3ivMESA) #define glWindowPos3sMESA GLEW_GET_FUN(__glewWindowPos3sMESA) #define glWindowPos3svMESA GLEW_GET_FUN(__glewWindowPos3svMESA) #define glWindowPos4dMESA GLEW_GET_FUN(__glewWindowPos4dMESA) #define glWindowPos4dvMESA GLEW_GET_FUN(__glewWindowPos4dvMESA) #define glWindowPos4fMESA GLEW_GET_FUN(__glewWindowPos4fMESA) #define glWindowPos4fvMESA GLEW_GET_FUN(__glewWindowPos4fvMESA) #define glWindowPos4iMESA GLEW_GET_FUN(__glewWindowPos4iMESA) #define glWindowPos4ivMESA GLEW_GET_FUN(__glewWindowPos4ivMESA) #define glWindowPos4sMESA GLEW_GET_FUN(__glewWindowPos4sMESA) #define glWindowPos4svMESA GLEW_GET_FUN(__glewWindowPos4svMESA) #define GLEW_MESA_window_pos GLEW_GET_VAR(__GLEW_MESA_window_pos) #endif /* GL_MESA_window_pos */ /* ------------------------- GL_MESA_ycbcr_texture ------------------------- */ #ifndef GL_MESA_ycbcr_texture #define GL_MESA_ycbcr_texture 1 #define GL_UNSIGNED_SHORT_8_8_MESA 0x85BA #define GL_UNSIGNED_SHORT_8_8_REV_MESA 0x85BB #define GL_YCBCR_MESA 0x8757 #define GLEW_MESA_ycbcr_texture GLEW_GET_VAR(__GLEW_MESA_ycbcr_texture) #endif /* GL_MESA_ycbcr_texture */ /* ------------------------- GL_NVX_gpu_memory_info ------------------------ */ #ifndef GL_NVX_gpu_memory_info #define GL_NVX_gpu_memory_info 1 #define GL_GPU_MEMORY_INFO_DEDICATED_VIDMEM_NVX 0x9047 #define GL_GPU_MEMORY_INFO_TOTAL_AVAILABLE_MEMORY_NVX 0x9048 #define GL_GPU_MEMORY_INFO_CURRENT_AVAILABLE_VIDMEM_NVX 0x9049 #define GL_GPU_MEMORY_INFO_EVICTION_COUNT_NVX 0x904A #define GL_GPU_MEMORY_INFO_EVICTED_MEMORY_NVX 0x904B #define GLEW_NVX_gpu_memory_info GLEW_GET_VAR(__GLEW_NVX_gpu_memory_info) #endif /* GL_NVX_gpu_memory_info */ /* ------------------------- GL_NV_bindless_texture ------------------------ */ #ifndef GL_NV_bindless_texture #define GL_NV_bindless_texture 1 typedef GLuint64 (GLAPIENTRY * PFNGLGETIMAGEHANDLENVPROC) (GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum format); typedef GLuint64 (GLAPIENTRY * PFNGLGETTEXTUREHANDLENVPROC) (GLuint texture); typedef GLuint64 (GLAPIENTRY * PFNGLGETTEXTURESAMPLERHANDLENVPROC) (GLuint texture, GLuint sampler); typedef GLboolean (GLAPIENTRY * PFNGLISIMAGEHANDLERESIDENTNVPROC) (GLuint64 handle); typedef GLboolean (GLAPIENTRY * PFNGLISTEXTUREHANDLERESIDENTNVPROC) (GLuint64 handle); typedef void (GLAPIENTRY * PFNGLMAKEIMAGEHANDLENONRESIDENTNVPROC) (GLuint64 handle); typedef void (GLAPIENTRY * PFNGLMAKEIMAGEHANDLERESIDENTNVPROC) (GLuint64 handle, GLenum access); typedef void (GLAPIENTRY * PFNGLMAKETEXTUREHANDLENONRESIDENTNVPROC) (GLuint64 handle); typedef void (GLAPIENTRY * PFNGLMAKETEXTUREHANDLERESIDENTNVPROC) (GLuint64 handle); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMHANDLEUI64NVPROC) (GLuint program, GLint location, GLuint64 value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMHANDLEUI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64* values); typedef void (GLAPIENTRY * PFNGLUNIFORMHANDLEUI64NVPROC) (GLint location, GLuint64 value); typedef void (GLAPIENTRY * PFNGLUNIFORMHANDLEUI64VNVPROC) (GLint location, GLsizei count, const GLuint64* value); #define glGetImageHandleNV GLEW_GET_FUN(__glewGetImageHandleNV) #define glGetTextureHandleNV GLEW_GET_FUN(__glewGetTextureHandleNV) #define glGetTextureSamplerHandleNV GLEW_GET_FUN(__glewGetTextureSamplerHandleNV) #define glIsImageHandleResidentNV GLEW_GET_FUN(__glewIsImageHandleResidentNV) #define glIsTextureHandleResidentNV GLEW_GET_FUN(__glewIsTextureHandleResidentNV) #define glMakeImageHandleNonResidentNV GLEW_GET_FUN(__glewMakeImageHandleNonResidentNV) #define glMakeImageHandleResidentNV GLEW_GET_FUN(__glewMakeImageHandleResidentNV) #define glMakeTextureHandleNonResidentNV GLEW_GET_FUN(__glewMakeTextureHandleNonResidentNV) #define glMakeTextureHandleResidentNV GLEW_GET_FUN(__glewMakeTextureHandleResidentNV) #define glProgramUniformHandleui64NV GLEW_GET_FUN(__glewProgramUniformHandleui64NV) #define glProgramUniformHandleui64vNV GLEW_GET_FUN(__glewProgramUniformHandleui64vNV) #define glUniformHandleui64NV GLEW_GET_FUN(__glewUniformHandleui64NV) #define glUniformHandleui64vNV GLEW_GET_FUN(__glewUniformHandleui64vNV) #define GLEW_NV_bindless_texture GLEW_GET_VAR(__GLEW_NV_bindless_texture) #endif /* GL_NV_bindless_texture */ /* --------------------------- GL_NV_blend_square -------------------------- */ #ifndef GL_NV_blend_square #define GL_NV_blend_square 1 #define GLEW_NV_blend_square GLEW_GET_VAR(__GLEW_NV_blend_square) #endif /* GL_NV_blend_square */ /* ------------------------ GL_NV_conditional_render ----------------------- */ #ifndef GL_NV_conditional_render #define GL_NV_conditional_render 1 #define GL_QUERY_WAIT_NV 0x8E13 #define GL_QUERY_NO_WAIT_NV 0x8E14 #define GL_QUERY_BY_REGION_WAIT_NV 0x8E15 #define GL_QUERY_BY_REGION_NO_WAIT_NV 0x8E16 typedef void (GLAPIENTRY * PFNGLBEGINCONDITIONALRENDERNVPROC) (GLuint id, GLenum mode); typedef void (GLAPIENTRY * PFNGLENDCONDITIONALRENDERNVPROC) (void); #define glBeginConditionalRenderNV GLEW_GET_FUN(__glewBeginConditionalRenderNV) #define glEndConditionalRenderNV GLEW_GET_FUN(__glewEndConditionalRenderNV) #define GLEW_NV_conditional_render GLEW_GET_VAR(__GLEW_NV_conditional_render) #endif /* GL_NV_conditional_render */ /* ----------------------- GL_NV_copy_depth_to_color ----------------------- */ #ifndef GL_NV_copy_depth_to_color #define GL_NV_copy_depth_to_color 1 #define GL_DEPTH_STENCIL_TO_RGBA_NV 0x886E #define GL_DEPTH_STENCIL_TO_BGRA_NV 0x886F #define GLEW_NV_copy_depth_to_color GLEW_GET_VAR(__GLEW_NV_copy_depth_to_color) #endif /* GL_NV_copy_depth_to_color */ /* ---------------------------- GL_NV_copy_image --------------------------- */ #ifndef GL_NV_copy_image #define GL_NV_copy_image 1 typedef void (GLAPIENTRY * PFNGLCOPYIMAGESUBDATANVPROC) (GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei width, GLsizei height, GLsizei depth); #define glCopyImageSubDataNV GLEW_GET_FUN(__glewCopyImageSubDataNV) #define GLEW_NV_copy_image GLEW_GET_VAR(__GLEW_NV_copy_image) #endif /* GL_NV_copy_image */ /* ------------------------ GL_NV_depth_buffer_float ----------------------- */ #ifndef GL_NV_depth_buffer_float #define GL_NV_depth_buffer_float 1 #define GL_DEPTH_COMPONENT32F_NV 0x8DAB #define GL_DEPTH32F_STENCIL8_NV 0x8DAC #define GL_FLOAT_32_UNSIGNED_INT_24_8_REV_NV 0x8DAD #define GL_DEPTH_BUFFER_FLOAT_MODE_NV 0x8DAF typedef void (GLAPIENTRY * PFNGLCLEARDEPTHDNVPROC) (GLdouble depth); typedef void (GLAPIENTRY * PFNGLDEPTHBOUNDSDNVPROC) (GLdouble zmin, GLdouble zmax); typedef void (GLAPIENTRY * PFNGLDEPTHRANGEDNVPROC) (GLdouble zNear, GLdouble zFar); #define glClearDepthdNV GLEW_GET_FUN(__glewClearDepthdNV) #define glDepthBoundsdNV GLEW_GET_FUN(__glewDepthBoundsdNV) #define glDepthRangedNV GLEW_GET_FUN(__glewDepthRangedNV) #define GLEW_NV_depth_buffer_float GLEW_GET_VAR(__GLEW_NV_depth_buffer_float) #endif /* GL_NV_depth_buffer_float */ /* --------------------------- GL_NV_depth_clamp --------------------------- */ #ifndef GL_NV_depth_clamp #define GL_NV_depth_clamp 1 #define GL_DEPTH_CLAMP_NV 0x864F #define GLEW_NV_depth_clamp GLEW_GET_VAR(__GLEW_NV_depth_clamp) #endif /* GL_NV_depth_clamp */ /* ---------------------- GL_NV_depth_range_unclamped ---------------------- */ #ifndef GL_NV_depth_range_unclamped #define GL_NV_depth_range_unclamped 1 #define GL_SAMPLE_COUNT_BITS_NV 0x8864 #define GL_CURRENT_SAMPLE_COUNT_QUERY_NV 0x8865 #define GL_QUERY_RESULT_NV 0x8866 #define GL_QUERY_RESULT_AVAILABLE_NV 0x8867 #define GL_SAMPLE_COUNT_NV 0x8914 #define GLEW_NV_depth_range_unclamped GLEW_GET_VAR(__GLEW_NV_depth_range_unclamped) #endif /* GL_NV_depth_range_unclamped */ /* ---------------------------- GL_NV_evaluators --------------------------- */ #ifndef GL_NV_evaluators #define GL_NV_evaluators 1 #define GL_EVAL_2D_NV 0x86C0 #define GL_EVAL_TRIANGULAR_2D_NV 0x86C1 #define GL_MAP_TESSELLATION_NV 0x86C2 #define GL_MAP_ATTRIB_U_ORDER_NV 0x86C3 #define GL_MAP_ATTRIB_V_ORDER_NV 0x86C4 #define GL_EVAL_FRACTIONAL_TESSELLATION_NV 0x86C5 #define GL_EVAL_VERTEX_ATTRIB0_NV 0x86C6 #define GL_EVAL_VERTEX_ATTRIB1_NV 0x86C7 #define GL_EVAL_VERTEX_ATTRIB2_NV 0x86C8 #define GL_EVAL_VERTEX_ATTRIB3_NV 0x86C9 #define GL_EVAL_VERTEX_ATTRIB4_NV 0x86CA #define GL_EVAL_VERTEX_ATTRIB5_NV 0x86CB #define GL_EVAL_VERTEX_ATTRIB6_NV 0x86CC #define GL_EVAL_VERTEX_ATTRIB7_NV 0x86CD #define GL_EVAL_VERTEX_ATTRIB8_NV 0x86CE #define GL_EVAL_VERTEX_ATTRIB9_NV 0x86CF #define GL_EVAL_VERTEX_ATTRIB10_NV 0x86D0 #define GL_EVAL_VERTEX_ATTRIB11_NV 0x86D1 #define GL_EVAL_VERTEX_ATTRIB12_NV 0x86D2 #define GL_EVAL_VERTEX_ATTRIB13_NV 0x86D3 #define GL_EVAL_VERTEX_ATTRIB14_NV 0x86D4 #define GL_EVAL_VERTEX_ATTRIB15_NV 0x86D5 #define GL_MAX_MAP_TESSELLATION_NV 0x86D6 #define GL_MAX_RATIONAL_EVAL_ORDER_NV 0x86D7 typedef void (GLAPIENTRY * PFNGLEVALMAPSNVPROC) (GLenum target, GLenum mode); typedef void (GLAPIENTRY * PFNGLGETMAPATTRIBPARAMETERFVNVPROC) (GLenum target, GLuint index, GLenum pname, GLfloat* params); typedef void (GLAPIENTRY * PFNGLGETMAPATTRIBPARAMETERIVNVPROC) (GLenum target, GLuint index, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLGETMAPCONTROLPOINTSNVPROC) (GLenum target, GLuint index, GLenum type, GLsizei ustride, GLsizei vstride, GLboolean packed, void* points); typedef void (GLAPIENTRY * PFNGLGETMAPPARAMETERFVNVPROC) (GLenum target, GLenum pname, GLfloat* params); typedef void (GLAPIENTRY * PFNGLGETMAPPARAMETERIVNVPROC) (GLenum target, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLMAPCONTROLPOINTSNVPROC) (GLenum target, GLuint index, GLenum type, GLsizei ustride, GLsizei vstride, GLint uorder, GLint vorder, GLboolean packed, const void* points); typedef void (GLAPIENTRY * PFNGLMAPPARAMETERFVNVPROC) (GLenum target, GLenum pname, const GLfloat* params); typedef void (GLAPIENTRY * PFNGLMAPPARAMETERIVNVPROC) (GLenum target, GLenum pname, const GLint* params); #define glEvalMapsNV GLEW_GET_FUN(__glewEvalMapsNV) #define glGetMapAttribParameterfvNV GLEW_GET_FUN(__glewGetMapAttribParameterfvNV) #define glGetMapAttribParameterivNV GLEW_GET_FUN(__glewGetMapAttribParameterivNV) #define glGetMapControlPointsNV GLEW_GET_FUN(__glewGetMapControlPointsNV) #define glGetMapParameterfvNV GLEW_GET_FUN(__glewGetMapParameterfvNV) #define glGetMapParameterivNV GLEW_GET_FUN(__glewGetMapParameterivNV) #define glMapControlPointsNV GLEW_GET_FUN(__glewMapControlPointsNV) #define glMapParameterfvNV GLEW_GET_FUN(__glewMapParameterfvNV) #define glMapParameterivNV GLEW_GET_FUN(__glewMapParameterivNV) #define GLEW_NV_evaluators GLEW_GET_VAR(__GLEW_NV_evaluators) #endif /* GL_NV_evaluators */ /* ----------------------- GL_NV_explicit_multisample ---------------------- */ #ifndef GL_NV_explicit_multisample #define GL_NV_explicit_multisample 1 #define GL_SAMPLE_POSITION_NV 0x8E50 #define GL_SAMPLE_MASK_NV 0x8E51 #define GL_SAMPLE_MASK_VALUE_NV 0x8E52 #define GL_TEXTURE_BINDING_RENDERBUFFER_NV 0x8E53 #define GL_TEXTURE_RENDERBUFFER_DATA_STORE_BINDING_NV 0x8E54 #define GL_TEXTURE_RENDERBUFFER_NV 0x8E55 #define GL_SAMPLER_RENDERBUFFER_NV 0x8E56 #define GL_INT_SAMPLER_RENDERBUFFER_NV 0x8E57 #define GL_UNSIGNED_INT_SAMPLER_RENDERBUFFER_NV 0x8E58 #define GL_MAX_SAMPLE_MASK_WORDS_NV 0x8E59 typedef void (GLAPIENTRY * PFNGLGETMULTISAMPLEFVNVPROC) (GLenum pname, GLuint index, GLfloat* val); typedef void (GLAPIENTRY * PFNGLSAMPLEMASKINDEXEDNVPROC) (GLuint index, GLbitfield mask); typedef void (GLAPIENTRY * PFNGLTEXRENDERBUFFERNVPROC) (GLenum target, GLuint renderbuffer); #define glGetMultisamplefvNV GLEW_GET_FUN(__glewGetMultisamplefvNV) #define glSampleMaskIndexedNV GLEW_GET_FUN(__glewSampleMaskIndexedNV) #define glTexRenderbufferNV GLEW_GET_FUN(__glewTexRenderbufferNV) #define GLEW_NV_explicit_multisample GLEW_GET_VAR(__GLEW_NV_explicit_multisample) #endif /* GL_NV_explicit_multisample */ /* ------------------------------ GL_NV_fence ------------------------------ */ #ifndef GL_NV_fence #define GL_NV_fence 1 #define GL_ALL_COMPLETED_NV 0x84F2 #define GL_FENCE_STATUS_NV 0x84F3 #define GL_FENCE_CONDITION_NV 0x84F4 typedef void (GLAPIENTRY * PFNGLDELETEFENCESNVPROC) (GLsizei n, const GLuint* fences); typedef void (GLAPIENTRY * PFNGLFINISHFENCENVPROC) (GLuint fence); typedef void (GLAPIENTRY * PFNGLGENFENCESNVPROC) (GLsizei n, GLuint* fences); typedef void (GLAPIENTRY * PFNGLGETFENCEIVNVPROC) (GLuint fence, GLenum pname, GLint* params); typedef GLboolean (GLAPIENTRY * PFNGLISFENCENVPROC) (GLuint fence); typedef void (GLAPIENTRY * PFNGLSETFENCENVPROC) (GLuint fence, GLenum condition); typedef GLboolean (GLAPIENTRY * PFNGLTESTFENCENVPROC) (GLuint fence); #define glDeleteFencesNV GLEW_GET_FUN(__glewDeleteFencesNV) #define glFinishFenceNV GLEW_GET_FUN(__glewFinishFenceNV) #define glGenFencesNV GLEW_GET_FUN(__glewGenFencesNV) #define glGetFenceivNV GLEW_GET_FUN(__glewGetFenceivNV) #define glIsFenceNV GLEW_GET_FUN(__glewIsFenceNV) #define glSetFenceNV GLEW_GET_FUN(__glewSetFenceNV) #define glTestFenceNV GLEW_GET_FUN(__glewTestFenceNV) #define GLEW_NV_fence GLEW_GET_VAR(__GLEW_NV_fence) #endif /* GL_NV_fence */ /* --------------------------- GL_NV_float_buffer -------------------------- */ #ifndef GL_NV_float_buffer #define GL_NV_float_buffer 1 #define GL_FLOAT_R_NV 0x8880 #define GL_FLOAT_RG_NV 0x8881 #define GL_FLOAT_RGB_NV 0x8882 #define GL_FLOAT_RGBA_NV 0x8883 #define GL_FLOAT_R16_NV 0x8884 #define GL_FLOAT_R32_NV 0x8885 #define GL_FLOAT_RG16_NV 0x8886 #define GL_FLOAT_RG32_NV 0x8887 #define GL_FLOAT_RGB16_NV 0x8888 #define GL_FLOAT_RGB32_NV 0x8889 #define GL_FLOAT_RGBA16_NV 0x888A #define GL_FLOAT_RGBA32_NV 0x888B #define GL_TEXTURE_FLOAT_COMPONENTS_NV 0x888C #define GL_FLOAT_CLEAR_COLOR_VALUE_NV 0x888D #define GL_FLOAT_RGBA_MODE_NV 0x888E #define GLEW_NV_float_buffer GLEW_GET_VAR(__GLEW_NV_float_buffer) #endif /* GL_NV_float_buffer */ /* --------------------------- GL_NV_fog_distance -------------------------- */ #ifndef GL_NV_fog_distance #define GL_NV_fog_distance 1 #define GL_FOG_DISTANCE_MODE_NV 0x855A #define GL_EYE_RADIAL_NV 0x855B #define GL_EYE_PLANE_ABSOLUTE_NV 0x855C #define GLEW_NV_fog_distance GLEW_GET_VAR(__GLEW_NV_fog_distance) #endif /* GL_NV_fog_distance */ /* ------------------------- GL_NV_fragment_program ------------------------ */ #ifndef GL_NV_fragment_program #define GL_NV_fragment_program 1 #define GL_MAX_FRAGMENT_PROGRAM_LOCAL_PARAMETERS_NV 0x8868 #define GL_FRAGMENT_PROGRAM_NV 0x8870 #define GL_MAX_TEXTURE_COORDS_NV 0x8871 #define GL_MAX_TEXTURE_IMAGE_UNITS_NV 0x8872 #define GL_FRAGMENT_PROGRAM_BINDING_NV 0x8873 #define GL_PROGRAM_ERROR_STRING_NV 0x8874 typedef void (GLAPIENTRY * PFNGLGETPROGRAMNAMEDPARAMETERDVNVPROC) (GLuint id, GLsizei len, const GLubyte* name, GLdouble *params); typedef void (GLAPIENTRY * PFNGLGETPROGRAMNAMEDPARAMETERFVNVPROC) (GLuint id, GLsizei len, const GLubyte* name, GLfloat *params); typedef void (GLAPIENTRY * PFNGLPROGRAMNAMEDPARAMETER4DNVPROC) (GLuint id, GLsizei len, const GLubyte* name, GLdouble x, GLdouble y, GLdouble z, GLdouble w); typedef void (GLAPIENTRY * PFNGLPROGRAMNAMEDPARAMETER4DVNVPROC) (GLuint id, GLsizei len, const GLubyte* name, const GLdouble v[]); typedef void (GLAPIENTRY * PFNGLPROGRAMNAMEDPARAMETER4FNVPROC) (GLuint id, GLsizei len, const GLubyte* name, GLfloat x, GLfloat y, GLfloat z, GLfloat w); typedef void (GLAPIENTRY * PFNGLPROGRAMNAMEDPARAMETER4FVNVPROC) (GLuint id, GLsizei len, const GLubyte* name, const GLfloat v[]); #define glGetProgramNamedParameterdvNV GLEW_GET_FUN(__glewGetProgramNamedParameterdvNV) #define glGetProgramNamedParameterfvNV GLEW_GET_FUN(__glewGetProgramNamedParameterfvNV) #define glProgramNamedParameter4dNV GLEW_GET_FUN(__glewProgramNamedParameter4dNV) #define glProgramNamedParameter4dvNV GLEW_GET_FUN(__glewProgramNamedParameter4dvNV) #define glProgramNamedParameter4fNV GLEW_GET_FUN(__glewProgramNamedParameter4fNV) #define glProgramNamedParameter4fvNV GLEW_GET_FUN(__glewProgramNamedParameter4fvNV) #define GLEW_NV_fragment_program GLEW_GET_VAR(__GLEW_NV_fragment_program) #endif /* GL_NV_fragment_program */ /* ------------------------ GL_NV_fragment_program2 ------------------------ */ #ifndef GL_NV_fragment_program2 #define GL_NV_fragment_program2 1 #define GL_MAX_PROGRAM_EXEC_INSTRUCTIONS_NV 0x88F4 #define GL_MAX_PROGRAM_CALL_DEPTH_NV 0x88F5 #define GL_MAX_PROGRAM_IF_DEPTH_NV 0x88F6 #define GL_MAX_PROGRAM_LOOP_DEPTH_NV 0x88F7 #define GL_MAX_PROGRAM_LOOP_COUNT_NV 0x88F8 #define GLEW_NV_fragment_program2 GLEW_GET_VAR(__GLEW_NV_fragment_program2) #endif /* GL_NV_fragment_program2 */ /* ------------------------ GL_NV_fragment_program4 ------------------------ */ #ifndef GL_NV_fragment_program4 #define GL_NV_fragment_program4 1 #define GLEW_NV_fragment_program4 GLEW_GET_VAR(__GLEW_NV_fragment_program4) #endif /* GL_NV_fragment_program4 */ /* --------------------- GL_NV_fragment_program_option --------------------- */ #ifndef GL_NV_fragment_program_option #define GL_NV_fragment_program_option 1 #define GLEW_NV_fragment_program_option GLEW_GET_VAR(__GLEW_NV_fragment_program_option) #endif /* GL_NV_fragment_program_option */ /* ----------------- GL_NV_framebuffer_multisample_coverage ---------------- */ #ifndef GL_NV_framebuffer_multisample_coverage #define GL_NV_framebuffer_multisample_coverage 1 #define GL_RENDERBUFFER_COVERAGE_SAMPLES_NV 0x8CAB #define GL_RENDERBUFFER_COLOR_SAMPLES_NV 0x8E10 #define GL_MAX_MULTISAMPLE_COVERAGE_MODES_NV 0x8E11 #define GL_MULTISAMPLE_COVERAGE_MODES_NV 0x8E12 typedef void (GLAPIENTRY * PFNGLRENDERBUFFERSTORAGEMULTISAMPLECOVERAGENVPROC) (GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLenum internalformat, GLsizei width, GLsizei height); #define glRenderbufferStorageMultisampleCoverageNV GLEW_GET_FUN(__glewRenderbufferStorageMultisampleCoverageNV) #define GLEW_NV_framebuffer_multisample_coverage GLEW_GET_VAR(__GLEW_NV_framebuffer_multisample_coverage) #endif /* GL_NV_framebuffer_multisample_coverage */ /* ------------------------ GL_NV_geometry_program4 ------------------------ */ #ifndef GL_NV_geometry_program4 #define GL_NV_geometry_program4 1 #define GL_GEOMETRY_PROGRAM_NV 0x8C26 #define GL_MAX_PROGRAM_OUTPUT_VERTICES_NV 0x8C27 #define GL_MAX_PROGRAM_TOTAL_OUTPUT_COMPONENTS_NV 0x8C28 typedef void (GLAPIENTRY * PFNGLPROGRAMVERTEXLIMITNVPROC) (GLenum target, GLint limit); #define glProgramVertexLimitNV GLEW_GET_FUN(__glewProgramVertexLimitNV) #define GLEW_NV_geometry_program4 GLEW_GET_VAR(__GLEW_NV_geometry_program4) #endif /* GL_NV_geometry_program4 */ /* ------------------------- GL_NV_geometry_shader4 ------------------------ */ #ifndef GL_NV_geometry_shader4 #define GL_NV_geometry_shader4 1 #define GLEW_NV_geometry_shader4 GLEW_GET_VAR(__GLEW_NV_geometry_shader4) #endif /* GL_NV_geometry_shader4 */ /* --------------------------- GL_NV_gpu_program4 -------------------------- */ #ifndef GL_NV_gpu_program4 #define GL_NV_gpu_program4 1 #define GL_MIN_PROGRAM_TEXEL_OFFSET_NV 0x8904 #define GL_MAX_PROGRAM_TEXEL_OFFSET_NV 0x8905 #define GL_PROGRAM_ATTRIB_COMPONENTS_NV 0x8906 #define GL_PROGRAM_RESULT_COMPONENTS_NV 0x8907 #define GL_MAX_PROGRAM_ATTRIB_COMPONENTS_NV 0x8908 #define GL_MAX_PROGRAM_RESULT_COMPONENTS_NV 0x8909 #define GL_MAX_PROGRAM_GENERIC_ATTRIBS_NV 0x8DA5 #define GL_MAX_PROGRAM_GENERIC_RESULTS_NV 0x8DA6 typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETERI4INVPROC) (GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w); typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETERI4IVNVPROC) (GLenum target, GLuint index, const GLint *params); typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETERI4UINVPROC) (GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETERI4UIVNVPROC) (GLenum target, GLuint index, const GLuint *params); typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETERSI4IVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLint *params); typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETERSI4UIVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLuint *params); typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETERI4INVPROC) (GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w); typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETERI4IVNVPROC) (GLenum target, GLuint index, const GLint *params); typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETERI4UINVPROC) (GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETERI4UIVNVPROC) (GLenum target, GLuint index, const GLuint *params); typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETERSI4IVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLint *params); typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETERSI4UIVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLuint *params); #define glProgramEnvParameterI4iNV GLEW_GET_FUN(__glewProgramEnvParameterI4iNV) #define glProgramEnvParameterI4ivNV GLEW_GET_FUN(__glewProgramEnvParameterI4ivNV) #define glProgramEnvParameterI4uiNV GLEW_GET_FUN(__glewProgramEnvParameterI4uiNV) #define glProgramEnvParameterI4uivNV GLEW_GET_FUN(__glewProgramEnvParameterI4uivNV) #define glProgramEnvParametersI4ivNV GLEW_GET_FUN(__glewProgramEnvParametersI4ivNV) #define glProgramEnvParametersI4uivNV GLEW_GET_FUN(__glewProgramEnvParametersI4uivNV) #define glProgramLocalParameterI4iNV GLEW_GET_FUN(__glewProgramLocalParameterI4iNV) #define glProgramLocalParameterI4ivNV GLEW_GET_FUN(__glewProgramLocalParameterI4ivNV) #define glProgramLocalParameterI4uiNV GLEW_GET_FUN(__glewProgramLocalParameterI4uiNV) #define glProgramLocalParameterI4uivNV GLEW_GET_FUN(__glewProgramLocalParameterI4uivNV) #define glProgramLocalParametersI4ivNV GLEW_GET_FUN(__glewProgramLocalParametersI4ivNV) #define glProgramLocalParametersI4uivNV GLEW_GET_FUN(__glewProgramLocalParametersI4uivNV) #define GLEW_NV_gpu_program4 GLEW_GET_VAR(__GLEW_NV_gpu_program4) #endif /* GL_NV_gpu_program4 */ /* --------------------------- GL_NV_gpu_program5 -------------------------- */ #ifndef GL_NV_gpu_program5 #define GL_NV_gpu_program5 1 #define GL_MAX_GEOMETRY_PROGRAM_INVOCATIONS_NV 0x8E5A #define GL_MIN_FRAGMENT_INTERPOLATION_OFFSET_NV 0x8E5B #define GL_MAX_FRAGMENT_INTERPOLATION_OFFSET_NV 0x8E5C #define GL_FRAGMENT_PROGRAM_INTERPOLATION_OFFSET_BITS_NV 0x8E5D #define GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET_NV 0x8E5E #define GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET_NV 0x8E5F #define GLEW_NV_gpu_program5 GLEW_GET_VAR(__GLEW_NV_gpu_program5) #endif /* GL_NV_gpu_program5 */ /* ------------------------- GL_NV_gpu_program_fp64 ------------------------ */ #ifndef GL_NV_gpu_program_fp64 #define GL_NV_gpu_program_fp64 1 #define GLEW_NV_gpu_program_fp64 GLEW_GET_VAR(__GLEW_NV_gpu_program_fp64) #endif /* GL_NV_gpu_program_fp64 */ /* --------------------------- GL_NV_gpu_shader5 --------------------------- */ #ifndef GL_NV_gpu_shader5 #define GL_NV_gpu_shader5 1 #define GL_INT64_NV 0x140E #define GL_UNSIGNED_INT64_NV 0x140F #define GL_INT8_NV 0x8FE0 #define GL_INT8_VEC2_NV 0x8FE1 #define GL_INT8_VEC3_NV 0x8FE2 #define GL_INT8_VEC4_NV 0x8FE3 #define GL_INT16_NV 0x8FE4 #define GL_INT16_VEC2_NV 0x8FE5 #define GL_INT16_VEC3_NV 0x8FE6 #define GL_INT16_VEC4_NV 0x8FE7 #define GL_INT64_VEC2_NV 0x8FE9 #define GL_INT64_VEC3_NV 0x8FEA #define GL_INT64_VEC4_NV 0x8FEB #define GL_UNSIGNED_INT8_NV 0x8FEC #define GL_UNSIGNED_INT8_VEC2_NV 0x8FED #define GL_UNSIGNED_INT8_VEC3_NV 0x8FEE #define GL_UNSIGNED_INT8_VEC4_NV 0x8FEF #define GL_UNSIGNED_INT16_NV 0x8FF0 #define GL_UNSIGNED_INT16_VEC2_NV 0x8FF1 #define GL_UNSIGNED_INT16_VEC3_NV 0x8FF2 #define GL_UNSIGNED_INT16_VEC4_NV 0x8FF3 #define GL_UNSIGNED_INT64_VEC2_NV 0x8FF5 #define GL_UNSIGNED_INT64_VEC3_NV 0x8FF6 #define GL_UNSIGNED_INT64_VEC4_NV 0x8FF7 #define GL_FLOAT16_NV 0x8FF8 #define GL_FLOAT16_VEC2_NV 0x8FF9 #define GL_FLOAT16_VEC3_NV 0x8FFA #define GL_FLOAT16_VEC4_NV 0x8FFB typedef void (GLAPIENTRY * PFNGLGETUNIFORMI64VNVPROC) (GLuint program, GLint location, GLint64EXT* params); typedef void (GLAPIENTRY * PFNGLGETUNIFORMUI64VNVPROC) (GLuint program, GLint location, GLuint64EXT* params); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1I64NVPROC) (GLuint program, GLint location, GLint64EXT x); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1I64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLint64EXT* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1UI64NVPROC) (GLuint program, GLint location, GLuint64EXT x); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1UI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2I64NVPROC) (GLuint program, GLint location, GLint64EXT x, GLint64EXT y); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2I64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLint64EXT* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2UI64NVPROC) (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2UI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3I64NVPROC) (GLuint program, GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3I64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLint64EXT* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3UI64NVPROC) (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3UI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4I64NVPROC) (GLuint program, GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4I64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLint64EXT* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4UI64NVPROC) (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4UI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT* value); typedef void (GLAPIENTRY * PFNGLUNIFORM1I64NVPROC) (GLint location, GLint64EXT x); typedef void (GLAPIENTRY * PFNGLUNIFORM1I64VNVPROC) (GLint location, GLsizei count, const GLint64EXT* value); typedef void (GLAPIENTRY * PFNGLUNIFORM1UI64NVPROC) (GLint location, GLuint64EXT x); typedef void (GLAPIENTRY * PFNGLUNIFORM1UI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT* value); typedef void (GLAPIENTRY * PFNGLUNIFORM2I64NVPROC) (GLint location, GLint64EXT x, GLint64EXT y); typedef void (GLAPIENTRY * PFNGLUNIFORM2I64VNVPROC) (GLint location, GLsizei count, const GLint64EXT* value); typedef void (GLAPIENTRY * PFNGLUNIFORM2UI64NVPROC) (GLint location, GLuint64EXT x, GLuint64EXT y); typedef void (GLAPIENTRY * PFNGLUNIFORM2UI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT* value); typedef void (GLAPIENTRY * PFNGLUNIFORM3I64NVPROC) (GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z); typedef void (GLAPIENTRY * PFNGLUNIFORM3I64VNVPROC) (GLint location, GLsizei count, const GLint64EXT* value); typedef void (GLAPIENTRY * PFNGLUNIFORM3UI64NVPROC) (GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z); typedef void (GLAPIENTRY * PFNGLUNIFORM3UI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT* value); typedef void (GLAPIENTRY * PFNGLUNIFORM4I64NVPROC) (GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w); typedef void (GLAPIENTRY * PFNGLUNIFORM4I64VNVPROC) (GLint location, GLsizei count, const GLint64EXT* value); typedef void (GLAPIENTRY * PFNGLUNIFORM4UI64NVPROC) (GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w); typedef void (GLAPIENTRY * PFNGLUNIFORM4UI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT* value); #define glGetUniformi64vNV GLEW_GET_FUN(__glewGetUniformi64vNV) #define glGetUniformui64vNV GLEW_GET_FUN(__glewGetUniformui64vNV) #define glProgramUniform1i64NV GLEW_GET_FUN(__glewProgramUniform1i64NV) #define glProgramUniform1i64vNV GLEW_GET_FUN(__glewProgramUniform1i64vNV) #define glProgramUniform1ui64NV GLEW_GET_FUN(__glewProgramUniform1ui64NV) #define glProgramUniform1ui64vNV GLEW_GET_FUN(__glewProgramUniform1ui64vNV) #define glProgramUniform2i64NV GLEW_GET_FUN(__glewProgramUniform2i64NV) #define glProgramUniform2i64vNV GLEW_GET_FUN(__glewProgramUniform2i64vNV) #define glProgramUniform2ui64NV GLEW_GET_FUN(__glewProgramUniform2ui64NV) #define glProgramUniform2ui64vNV GLEW_GET_FUN(__glewProgramUniform2ui64vNV) #define glProgramUniform3i64NV GLEW_GET_FUN(__glewProgramUniform3i64NV) #define glProgramUniform3i64vNV GLEW_GET_FUN(__glewProgramUniform3i64vNV) #define glProgramUniform3ui64NV GLEW_GET_FUN(__glewProgramUniform3ui64NV) #define glProgramUniform3ui64vNV GLEW_GET_FUN(__glewProgramUniform3ui64vNV) #define glProgramUniform4i64NV GLEW_GET_FUN(__glewProgramUniform4i64NV) #define glProgramUniform4i64vNV GLEW_GET_FUN(__glewProgramUniform4i64vNV) #define glProgramUniform4ui64NV GLEW_GET_FUN(__glewProgramUniform4ui64NV) #define glProgramUniform4ui64vNV GLEW_GET_FUN(__glewProgramUniform4ui64vNV) #define glUniform1i64NV GLEW_GET_FUN(__glewUniform1i64NV) #define glUniform1i64vNV GLEW_GET_FUN(__glewUniform1i64vNV) #define glUniform1ui64NV GLEW_GET_FUN(__glewUniform1ui64NV) #define glUniform1ui64vNV GLEW_GET_FUN(__glewUniform1ui64vNV) #define glUniform2i64NV GLEW_GET_FUN(__glewUniform2i64NV) #define glUniform2i64vNV GLEW_GET_FUN(__glewUniform2i64vNV) #define glUniform2ui64NV GLEW_GET_FUN(__glewUniform2ui64NV) #define glUniform2ui64vNV GLEW_GET_FUN(__glewUniform2ui64vNV) #define glUniform3i64NV GLEW_GET_FUN(__glewUniform3i64NV) #define glUniform3i64vNV GLEW_GET_FUN(__glewUniform3i64vNV) #define glUniform3ui64NV GLEW_GET_FUN(__glewUniform3ui64NV) #define glUniform3ui64vNV GLEW_GET_FUN(__glewUniform3ui64vNV) #define glUniform4i64NV GLEW_GET_FUN(__glewUniform4i64NV) #define glUniform4i64vNV GLEW_GET_FUN(__glewUniform4i64vNV) #define glUniform4ui64NV GLEW_GET_FUN(__glewUniform4ui64NV) #define glUniform4ui64vNV GLEW_GET_FUN(__glewUniform4ui64vNV) #define GLEW_NV_gpu_shader5 GLEW_GET_VAR(__GLEW_NV_gpu_shader5) #endif /* GL_NV_gpu_shader5 */ /* ---------------------------- GL_NV_half_float --------------------------- */ #ifndef GL_NV_half_float #define GL_NV_half_float 1 #define GL_HALF_FLOAT_NV 0x140B typedef unsigned short GLhalf; typedef void (GLAPIENTRY * PFNGLCOLOR3HNVPROC) (GLhalf red, GLhalf green, GLhalf blue); typedef void (GLAPIENTRY * PFNGLCOLOR3HVNVPROC) (const GLhalf* v); typedef void (GLAPIENTRY * PFNGLCOLOR4HNVPROC) (GLhalf red, GLhalf green, GLhalf blue, GLhalf alpha); typedef void (GLAPIENTRY * PFNGLCOLOR4HVNVPROC) (const GLhalf* v); typedef void (GLAPIENTRY * PFNGLFOGCOORDHNVPROC) (GLhalf fog); typedef void (GLAPIENTRY * PFNGLFOGCOORDHVNVPROC) (const GLhalf* fog); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1HNVPROC) (GLenum target, GLhalf s); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1HVNVPROC) (GLenum target, const GLhalf* v); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2HNVPROC) (GLenum target, GLhalf s, GLhalf t); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2HVNVPROC) (GLenum target, const GLhalf* v); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3HNVPROC) (GLenum target, GLhalf s, GLhalf t, GLhalf r); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3HVNVPROC) (GLenum target, const GLhalf* v); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4HNVPROC) (GLenum target, GLhalf s, GLhalf t, GLhalf r, GLhalf q); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4HVNVPROC) (GLenum target, const GLhalf* v); typedef void (GLAPIENTRY * PFNGLNORMAL3HNVPROC) (GLhalf nx, GLhalf ny, GLhalf nz); typedef void (GLAPIENTRY * PFNGLNORMAL3HVNVPROC) (const GLhalf* v); typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3HNVPROC) (GLhalf red, GLhalf green, GLhalf blue); typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3HVNVPROC) (const GLhalf* v); typedef void (GLAPIENTRY * PFNGLTEXCOORD1HNVPROC) (GLhalf s); typedef void (GLAPIENTRY * PFNGLTEXCOORD1HVNVPROC) (const GLhalf* v); typedef void (GLAPIENTRY * PFNGLTEXCOORD2HNVPROC) (GLhalf s, GLhalf t); typedef void (GLAPIENTRY * PFNGLTEXCOORD2HVNVPROC) (const GLhalf* v); typedef void (GLAPIENTRY * PFNGLTEXCOORD3HNVPROC) (GLhalf s, GLhalf t, GLhalf r); typedef void (GLAPIENTRY * PFNGLTEXCOORD3HVNVPROC) (const GLhalf* v); typedef void (GLAPIENTRY * PFNGLTEXCOORD4HNVPROC) (GLhalf s, GLhalf t, GLhalf r, GLhalf q); typedef void (GLAPIENTRY * PFNGLTEXCOORD4HVNVPROC) (const GLhalf* v); typedef void (GLAPIENTRY * PFNGLVERTEX2HNVPROC) (GLhalf x, GLhalf y); typedef void (GLAPIENTRY * PFNGLVERTEX2HVNVPROC) (const GLhalf* v); typedef void (GLAPIENTRY * PFNGLVERTEX3HNVPROC) (GLhalf x, GLhalf y, GLhalf z); typedef void (GLAPIENTRY * PFNGLVERTEX3HVNVPROC) (const GLhalf* v); typedef void (GLAPIENTRY * PFNGLVERTEX4HNVPROC) (GLhalf x, GLhalf y, GLhalf z, GLhalf w); typedef void (GLAPIENTRY * PFNGLVERTEX4HVNVPROC) (const GLhalf* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1HNVPROC) (GLuint index, GLhalf x); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1HVNVPROC) (GLuint index, const GLhalf* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2HNVPROC) (GLuint index, GLhalf x, GLhalf y); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2HVNVPROC) (GLuint index, const GLhalf* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3HNVPROC) (GLuint index, GLhalf x, GLhalf y, GLhalf z); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3HVNVPROC) (GLuint index, const GLhalf* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4HNVPROC) (GLuint index, GLhalf x, GLhalf y, GLhalf z, GLhalf w); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4HVNVPROC) (GLuint index, const GLhalf* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS1HVNVPROC) (GLuint index, GLsizei n, const GLhalf* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS2HVNVPROC) (GLuint index, GLsizei n, const GLhalf* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS3HVNVPROC) (GLuint index, GLsizei n, const GLhalf* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS4HVNVPROC) (GLuint index, GLsizei n, const GLhalf* v); typedef void (GLAPIENTRY * PFNGLVERTEXWEIGHTHNVPROC) (GLhalf weight); typedef void (GLAPIENTRY * PFNGLVERTEXWEIGHTHVNVPROC) (const GLhalf* weight); #define glColor3hNV GLEW_GET_FUN(__glewColor3hNV) #define glColor3hvNV GLEW_GET_FUN(__glewColor3hvNV) #define glColor4hNV GLEW_GET_FUN(__glewColor4hNV) #define glColor4hvNV GLEW_GET_FUN(__glewColor4hvNV) #define glFogCoordhNV GLEW_GET_FUN(__glewFogCoordhNV) #define glFogCoordhvNV GLEW_GET_FUN(__glewFogCoordhvNV) #define glMultiTexCoord1hNV GLEW_GET_FUN(__glewMultiTexCoord1hNV) #define glMultiTexCoord1hvNV GLEW_GET_FUN(__glewMultiTexCoord1hvNV) #define glMultiTexCoord2hNV GLEW_GET_FUN(__glewMultiTexCoord2hNV) #define glMultiTexCoord2hvNV GLEW_GET_FUN(__glewMultiTexCoord2hvNV) #define glMultiTexCoord3hNV GLEW_GET_FUN(__glewMultiTexCoord3hNV) #define glMultiTexCoord3hvNV GLEW_GET_FUN(__glewMultiTexCoord3hvNV) #define glMultiTexCoord4hNV GLEW_GET_FUN(__glewMultiTexCoord4hNV) #define glMultiTexCoord4hvNV GLEW_GET_FUN(__glewMultiTexCoord4hvNV) #define glNormal3hNV GLEW_GET_FUN(__glewNormal3hNV) #define glNormal3hvNV GLEW_GET_FUN(__glewNormal3hvNV) #define glSecondaryColor3hNV GLEW_GET_FUN(__glewSecondaryColor3hNV) #define glSecondaryColor3hvNV GLEW_GET_FUN(__glewSecondaryColor3hvNV) #define glTexCoord1hNV GLEW_GET_FUN(__glewTexCoord1hNV) #define glTexCoord1hvNV GLEW_GET_FUN(__glewTexCoord1hvNV) #define glTexCoord2hNV GLEW_GET_FUN(__glewTexCoord2hNV) #define glTexCoord2hvNV GLEW_GET_FUN(__glewTexCoord2hvNV) #define glTexCoord3hNV GLEW_GET_FUN(__glewTexCoord3hNV) #define glTexCoord3hvNV GLEW_GET_FUN(__glewTexCoord3hvNV) #define glTexCoord4hNV GLEW_GET_FUN(__glewTexCoord4hNV) #define glTexCoord4hvNV GLEW_GET_FUN(__glewTexCoord4hvNV) #define glVertex2hNV GLEW_GET_FUN(__glewVertex2hNV) #define glVertex2hvNV GLEW_GET_FUN(__glewVertex2hvNV) #define glVertex3hNV GLEW_GET_FUN(__glewVertex3hNV) #define glVertex3hvNV GLEW_GET_FUN(__glewVertex3hvNV) #define glVertex4hNV GLEW_GET_FUN(__glewVertex4hNV) #define glVertex4hvNV GLEW_GET_FUN(__glewVertex4hvNV) #define glVertexAttrib1hNV GLEW_GET_FUN(__glewVertexAttrib1hNV) #define glVertexAttrib1hvNV GLEW_GET_FUN(__glewVertexAttrib1hvNV) #define glVertexAttrib2hNV GLEW_GET_FUN(__glewVertexAttrib2hNV) #define glVertexAttrib2hvNV GLEW_GET_FUN(__glewVertexAttrib2hvNV) #define glVertexAttrib3hNV GLEW_GET_FUN(__glewVertexAttrib3hNV) #define glVertexAttrib3hvNV GLEW_GET_FUN(__glewVertexAttrib3hvNV) #define glVertexAttrib4hNV GLEW_GET_FUN(__glewVertexAttrib4hNV) #define glVertexAttrib4hvNV GLEW_GET_FUN(__glewVertexAttrib4hvNV) #define glVertexAttribs1hvNV GLEW_GET_FUN(__glewVertexAttribs1hvNV) #define glVertexAttribs2hvNV GLEW_GET_FUN(__glewVertexAttribs2hvNV) #define glVertexAttribs3hvNV GLEW_GET_FUN(__glewVertexAttribs3hvNV) #define glVertexAttribs4hvNV GLEW_GET_FUN(__glewVertexAttribs4hvNV) #define glVertexWeighthNV GLEW_GET_FUN(__glewVertexWeighthNV) #define glVertexWeighthvNV GLEW_GET_FUN(__glewVertexWeighthvNV) #define GLEW_NV_half_float GLEW_GET_VAR(__GLEW_NV_half_float) #endif /* GL_NV_half_float */ /* ------------------------ GL_NV_light_max_exponent ----------------------- */ #ifndef GL_NV_light_max_exponent #define GL_NV_light_max_exponent 1 #define GL_MAX_SHININESS_NV 0x8504 #define GL_MAX_SPOT_EXPONENT_NV 0x8505 #define GLEW_NV_light_max_exponent GLEW_GET_VAR(__GLEW_NV_light_max_exponent) #endif /* GL_NV_light_max_exponent */ /* ----------------------- GL_NV_multisample_coverage ---------------------- */ #ifndef GL_NV_multisample_coverage #define GL_NV_multisample_coverage 1 #define GL_COVERAGE_SAMPLES_NV 0x80A9 #define GL_COLOR_SAMPLES_NV 0x8E20 #define GLEW_NV_multisample_coverage GLEW_GET_VAR(__GLEW_NV_multisample_coverage) #endif /* GL_NV_multisample_coverage */ /* --------------------- GL_NV_multisample_filter_hint --------------------- */ #ifndef GL_NV_multisample_filter_hint #define GL_NV_multisample_filter_hint 1 #define GL_MULTISAMPLE_FILTER_HINT_NV 0x8534 #define GLEW_NV_multisample_filter_hint GLEW_GET_VAR(__GLEW_NV_multisample_filter_hint) #endif /* GL_NV_multisample_filter_hint */ /* ------------------------- GL_NV_occlusion_query ------------------------- */ #ifndef GL_NV_occlusion_query #define GL_NV_occlusion_query 1 #define GL_PIXEL_COUNTER_BITS_NV 0x8864 #define GL_CURRENT_OCCLUSION_QUERY_ID_NV 0x8865 #define GL_PIXEL_COUNT_NV 0x8866 #define GL_PIXEL_COUNT_AVAILABLE_NV 0x8867 typedef void (GLAPIENTRY * PFNGLBEGINOCCLUSIONQUERYNVPROC) (GLuint id); typedef void (GLAPIENTRY * PFNGLDELETEOCCLUSIONQUERIESNVPROC) (GLsizei n, const GLuint* ids); typedef void (GLAPIENTRY * PFNGLENDOCCLUSIONQUERYNVPROC) (void); typedef void (GLAPIENTRY * PFNGLGENOCCLUSIONQUERIESNVPROC) (GLsizei n, GLuint* ids); typedef void (GLAPIENTRY * PFNGLGETOCCLUSIONQUERYIVNVPROC) (GLuint id, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLGETOCCLUSIONQUERYUIVNVPROC) (GLuint id, GLenum pname, GLuint* params); typedef GLboolean (GLAPIENTRY * PFNGLISOCCLUSIONQUERYNVPROC) (GLuint id); #define glBeginOcclusionQueryNV GLEW_GET_FUN(__glewBeginOcclusionQueryNV) #define glDeleteOcclusionQueriesNV GLEW_GET_FUN(__glewDeleteOcclusionQueriesNV) #define glEndOcclusionQueryNV GLEW_GET_FUN(__glewEndOcclusionQueryNV) #define glGenOcclusionQueriesNV GLEW_GET_FUN(__glewGenOcclusionQueriesNV) #define glGetOcclusionQueryivNV GLEW_GET_FUN(__glewGetOcclusionQueryivNV) #define glGetOcclusionQueryuivNV GLEW_GET_FUN(__glewGetOcclusionQueryuivNV) #define glIsOcclusionQueryNV GLEW_GET_FUN(__glewIsOcclusionQueryNV) #define GLEW_NV_occlusion_query GLEW_GET_VAR(__GLEW_NV_occlusion_query) #endif /* GL_NV_occlusion_query */ /* ----------------------- GL_NV_packed_depth_stencil ---------------------- */ #ifndef GL_NV_packed_depth_stencil #define GL_NV_packed_depth_stencil 1 #define GL_DEPTH_STENCIL_NV 0x84F9 #define GL_UNSIGNED_INT_24_8_NV 0x84FA #define GLEW_NV_packed_depth_stencil GLEW_GET_VAR(__GLEW_NV_packed_depth_stencil) #endif /* GL_NV_packed_depth_stencil */ /* --------------------- GL_NV_parameter_buffer_object --------------------- */ #ifndef GL_NV_parameter_buffer_object #define GL_NV_parameter_buffer_object 1 #define GL_MAX_PROGRAM_PARAMETER_BUFFER_BINDINGS_NV 0x8DA0 #define GL_MAX_PROGRAM_PARAMETER_BUFFER_SIZE_NV 0x8DA1 #define GL_VERTEX_PROGRAM_PARAMETER_BUFFER_NV 0x8DA2 #define GL_GEOMETRY_PROGRAM_PARAMETER_BUFFER_NV 0x8DA3 #define GL_FRAGMENT_PROGRAM_PARAMETER_BUFFER_NV 0x8DA4 typedef void (GLAPIENTRY * PFNGLPROGRAMBUFFERPARAMETERSIIVNVPROC) (GLenum target, GLuint buffer, GLuint index, GLsizei count, const GLint *params); typedef void (GLAPIENTRY * PFNGLPROGRAMBUFFERPARAMETERSIUIVNVPROC) (GLenum target, GLuint buffer, GLuint index, GLsizei count, const GLuint *params); typedef void (GLAPIENTRY * PFNGLPROGRAMBUFFERPARAMETERSFVNVPROC) (GLenum target, GLuint buffer, GLuint index, GLsizei count, const GLfloat *params); #define glProgramBufferParametersIivNV GLEW_GET_FUN(__glewProgramBufferParametersIivNV) #define glProgramBufferParametersIuivNV GLEW_GET_FUN(__glewProgramBufferParametersIuivNV) #define glProgramBufferParametersfvNV GLEW_GET_FUN(__glewProgramBufferParametersfvNV) #define GLEW_NV_parameter_buffer_object GLEW_GET_VAR(__GLEW_NV_parameter_buffer_object) #endif /* GL_NV_parameter_buffer_object */ /* --------------------- GL_NV_parameter_buffer_object2 -------------------- */ #ifndef GL_NV_parameter_buffer_object2 #define GL_NV_parameter_buffer_object2 1 #define GLEW_NV_parameter_buffer_object2 GLEW_GET_VAR(__GLEW_NV_parameter_buffer_object2) #endif /* GL_NV_parameter_buffer_object2 */ /* -------------------------- GL_NV_path_rendering ------------------------- */ #ifndef GL_NV_path_rendering #define GL_NV_path_rendering 1 #define GL_CLOSE_PATH_NV 0x00 #define GL_BOLD_BIT_NV 0x01 #define GL_GLYPH_WIDTH_BIT_NV 0x01 #define GL_GLYPH_HEIGHT_BIT_NV 0x02 #define GL_ITALIC_BIT_NV 0x02 #define GL_MOVE_TO_NV 0x02 #define GL_RELATIVE_MOVE_TO_NV 0x03 #define GL_LINE_TO_NV 0x04 #define GL_GLYPH_HORIZONTAL_BEARING_X_BIT_NV 0x04 #define GL_RELATIVE_LINE_TO_NV 0x05 #define GL_HORIZONTAL_LINE_TO_NV 0x06 #define GL_RELATIVE_HORIZONTAL_LINE_TO_NV 0x07 #define GL_GLYPH_HORIZONTAL_BEARING_Y_BIT_NV 0x08 #define GL_VERTICAL_LINE_TO_NV 0x08 #define GL_RELATIVE_VERTICAL_LINE_TO_NV 0x09 #define GL_QUADRATIC_CURVE_TO_NV 0x0A #define GL_RELATIVE_QUADRATIC_CURVE_TO_NV 0x0B #define GL_CUBIC_CURVE_TO_NV 0x0C #define GL_RELATIVE_CUBIC_CURVE_TO_NV 0x0D #define GL_SMOOTH_QUADRATIC_CURVE_TO_NV 0x0E #define GL_RELATIVE_SMOOTH_QUADRATIC_CURVE_TO_NV 0x0F #define GL_GLYPH_HORIZONTAL_BEARING_ADVANCE_BIT_NV 0x10 #define GL_SMOOTH_CUBIC_CURVE_TO_NV 0x10 #define GL_RELATIVE_SMOOTH_CUBIC_CURVE_TO_NV 0x11 #define GL_SMALL_CCW_ARC_TO_NV 0x12 #define GL_RELATIVE_SMALL_CCW_ARC_TO_NV 0x13 #define GL_SMALL_CW_ARC_TO_NV 0x14 #define GL_RELATIVE_SMALL_CW_ARC_TO_NV 0x15 #define GL_LARGE_CCW_ARC_TO_NV 0x16 #define GL_RELATIVE_LARGE_CCW_ARC_TO_NV 0x17 #define GL_LARGE_CW_ARC_TO_NV 0x18 #define GL_RELATIVE_LARGE_CW_ARC_TO_NV 0x19 #define GL_GLYPH_VERTICAL_BEARING_X_BIT_NV 0x20 #define GL_GLYPH_VERTICAL_BEARING_Y_BIT_NV 0x40 #define GL_GLYPH_VERTICAL_BEARING_ADVANCE_BIT_NV 0x80 #define GL_RESTART_PATH_NV 0xF0 #define GL_DUP_FIRST_CUBIC_CURVE_TO_NV 0xF2 #define GL_DUP_LAST_CUBIC_CURVE_TO_NV 0xF4 #define GL_RECT_NV 0xF6 #define GL_CIRCULAR_CCW_ARC_TO_NV 0xF8 #define GL_CIRCULAR_CW_ARC_TO_NV 0xFA #define GL_CIRCULAR_TANGENT_ARC_TO_NV 0xFC #define GL_ARC_TO_NV 0xFE #define GL_RELATIVE_ARC_TO_NV 0xFF #define GL_GLYPH_HAS_KERNING_BIT_NV 0x100 #define GL_PRIMARY_COLOR_NV 0x852C #define GL_SECONDARY_COLOR_NV 0x852D #define GL_PRIMARY_COLOR 0x8577 #define GL_PATH_FORMAT_SVG_NV 0x9070 #define GL_PATH_FORMAT_PS_NV 0x9071 #define GL_STANDARD_FONT_NAME_NV 0x9072 #define GL_SYSTEM_FONT_NAME_NV 0x9073 #define GL_FILE_NAME_NV 0x9074 #define GL_PATH_STROKE_WIDTH_NV 0x9075 #define GL_PATH_END_CAPS_NV 0x9076 #define GL_PATH_INITIAL_END_CAP_NV 0x9077 #define GL_PATH_TERMINAL_END_CAP_NV 0x9078 #define GL_PATH_JOIN_STYLE_NV 0x9079 #define GL_PATH_MITER_LIMIT_NV 0x907A #define GL_PATH_DASH_CAPS_NV 0x907B #define GL_PATH_INITIAL_DASH_CAP_NV 0x907C #define GL_PATH_TERMINAL_DASH_CAP_NV 0x907D #define GL_PATH_DASH_OFFSET_NV 0x907E #define GL_PATH_CLIENT_LENGTH_NV 0x907F #define GL_PATH_FILL_MODE_NV 0x9080 #define GL_PATH_FILL_MASK_NV 0x9081 #define GL_PATH_FILL_COVER_MODE_NV 0x9082 #define GL_PATH_STROKE_COVER_MODE_NV 0x9083 #define GL_PATH_STROKE_MASK_NV 0x9084 #define GL_COUNT_UP_NV 0x9088 #define GL_COUNT_DOWN_NV 0x9089 #define GL_PATH_OBJECT_BOUNDING_BOX_NV 0x908A #define GL_CONVEX_HULL_NV 0x908B #define GL_BOUNDING_BOX_NV 0x908D #define GL_TRANSLATE_X_NV 0x908E #define GL_TRANSLATE_Y_NV 0x908F #define GL_TRANSLATE_2D_NV 0x9090 #define GL_TRANSLATE_3D_NV 0x9091 #define GL_AFFINE_2D_NV 0x9092 #define GL_AFFINE_3D_NV 0x9094 #define GL_TRANSPOSE_AFFINE_2D_NV 0x9096 #define GL_TRANSPOSE_AFFINE_3D_NV 0x9098 #define GL_UTF8_NV 0x909A #define GL_UTF16_NV 0x909B #define GL_BOUNDING_BOX_OF_BOUNDING_BOXES_NV 0x909C #define GL_PATH_COMMAND_COUNT_NV 0x909D #define GL_PATH_COORD_COUNT_NV 0x909E #define GL_PATH_DASH_ARRAY_COUNT_NV 0x909F #define GL_PATH_COMPUTED_LENGTH_NV 0x90A0 #define GL_PATH_FILL_BOUNDING_BOX_NV 0x90A1 #define GL_PATH_STROKE_BOUNDING_BOX_NV 0x90A2 #define GL_SQUARE_NV 0x90A3 #define GL_ROUND_NV 0x90A4 #define GL_TRIANGULAR_NV 0x90A5 #define GL_BEVEL_NV 0x90A6 #define GL_MITER_REVERT_NV 0x90A7 #define GL_MITER_TRUNCATE_NV 0x90A8 #define GL_SKIP_MISSING_GLYPH_NV 0x90A9 #define GL_USE_MISSING_GLYPH_NV 0x90AA #define GL_PATH_ERROR_POSITION_NV 0x90AB #define GL_PATH_FOG_GEN_MODE_NV 0x90AC #define GL_ACCUM_ADJACENT_PAIRS_NV 0x90AD #define GL_ADJACENT_PAIRS_NV 0x90AE #define GL_FIRST_TO_REST_NV 0x90AF #define GL_PATH_GEN_MODE_NV 0x90B0 #define GL_PATH_GEN_COEFF_NV 0x90B1 #define GL_PATH_GEN_COLOR_FORMAT_NV 0x90B2 #define GL_PATH_GEN_COMPONENTS_NV 0x90B3 #define GL_PATH_DASH_OFFSET_RESET_NV 0x90B4 #define GL_MOVE_TO_RESETS_NV 0x90B5 #define GL_MOVE_TO_CONTINUES_NV 0x90B6 #define GL_PATH_STENCIL_FUNC_NV 0x90B7 #define GL_PATH_STENCIL_REF_NV 0x90B8 #define GL_PATH_STENCIL_VALUE_MASK_NV 0x90B9 #define GL_PATH_STENCIL_DEPTH_OFFSET_FACTOR_NV 0x90BD #define GL_PATH_STENCIL_DEPTH_OFFSET_UNITS_NV 0x90BE #define GL_PATH_COVER_DEPTH_FUNC_NV 0x90BF #define GL_FONT_X_MIN_BOUNDS_BIT_NV 0x00010000 #define GL_FONT_Y_MIN_BOUNDS_BIT_NV 0x00020000 #define GL_FONT_X_MAX_BOUNDS_BIT_NV 0x00040000 #define GL_FONT_Y_MAX_BOUNDS_BIT_NV 0x00080000 #define GL_FONT_UNITS_PER_EM_BIT_NV 0x00100000 #define GL_FONT_ASCENDER_BIT_NV 0x00200000 #define GL_FONT_DESCENDER_BIT_NV 0x00400000 #define GL_FONT_HEIGHT_BIT_NV 0x00800000 #define GL_FONT_MAX_ADVANCE_WIDTH_BIT_NV 0x01000000 #define GL_FONT_MAX_ADVANCE_HEIGHT_BIT_NV 0x02000000 #define GL_FONT_UNDERLINE_POSITION_BIT_NV 0x04000000 #define GL_FONT_UNDERLINE_THICKNESS_BIT_NV 0x08000000 #define GL_FONT_HAS_KERNING_BIT_NV 0x10000000 typedef void (GLAPIENTRY * PFNGLCOPYPATHNVPROC) (GLuint resultPath, GLuint srcPath); typedef void (GLAPIENTRY * PFNGLCOVERFILLPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void* paths, GLuint pathBase, GLenum coverMode, GLenum transformType, const GLfloat *transformValues); typedef void (GLAPIENTRY * PFNGLCOVERFILLPATHNVPROC) (GLuint path, GLenum coverMode); typedef void (GLAPIENTRY * PFNGLCOVERSTROKEPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void* paths, GLuint pathBase, GLenum coverMode, GLenum transformType, const GLfloat *transformValues); typedef void (GLAPIENTRY * PFNGLCOVERSTROKEPATHNVPROC) (GLuint name, GLenum coverMode); typedef void (GLAPIENTRY * PFNGLDELETEPATHSNVPROC) (GLuint path, GLsizei range); typedef GLuint (GLAPIENTRY * PFNGLGENPATHSNVPROC) (GLsizei range); typedef void (GLAPIENTRY * PFNGLGETPATHCOLORGENFVNVPROC) (GLenum color, GLenum pname, GLfloat* value); typedef void (GLAPIENTRY * PFNGLGETPATHCOLORGENIVNVPROC) (GLenum color, GLenum pname, GLint* value); typedef void (GLAPIENTRY * PFNGLGETPATHCOMMANDSNVPROC) (GLuint name, GLubyte* commands); typedef void (GLAPIENTRY * PFNGLGETPATHCOORDSNVPROC) (GLuint name, GLfloat* coords); typedef void (GLAPIENTRY * PFNGLGETPATHDASHARRAYNVPROC) (GLuint name, GLfloat* dashArray); typedef GLfloat (GLAPIENTRY * PFNGLGETPATHLENGTHNVPROC) (GLuint path, GLsizei startSegment, GLsizei numSegments); typedef void (GLAPIENTRY * PFNGLGETPATHMETRICRANGENVPROC) (GLbitfield metricQueryMask, GLuint fistPathName, GLsizei numPaths, GLsizei stride, GLfloat* metrics); typedef void (GLAPIENTRY * PFNGLGETPATHMETRICSNVPROC) (GLbitfield metricQueryMask, GLsizei numPaths, GLenum pathNameType, const void* paths, GLuint pathBase, GLsizei stride, GLfloat *metrics); typedef void (GLAPIENTRY * PFNGLGETPATHPARAMETERFVNVPROC) (GLuint name, GLenum param, GLfloat* value); typedef void (GLAPIENTRY * PFNGLGETPATHPARAMETERIVNVPROC) (GLuint name, GLenum param, GLint* value); typedef void (GLAPIENTRY * PFNGLGETPATHSPACINGNVPROC) (GLenum pathListMode, GLsizei numPaths, GLenum pathNameType, const void* paths, GLuint pathBase, GLfloat advanceScale, GLfloat kerningScale, GLenum transformType, GLfloat *returnedSpacing); typedef void (GLAPIENTRY * PFNGLGETPATHTEXGENFVNVPROC) (GLenum texCoordSet, GLenum pname, GLfloat* value); typedef void (GLAPIENTRY * PFNGLGETPATHTEXGENIVNVPROC) (GLenum texCoordSet, GLenum pname, GLint* value); typedef void (GLAPIENTRY * PFNGLINTERPOLATEPATHSNVPROC) (GLuint resultPath, GLuint pathA, GLuint pathB, GLfloat weight); typedef GLboolean (GLAPIENTRY * PFNGLISPATHNVPROC) (GLuint path); typedef GLboolean (GLAPIENTRY * PFNGLISPOINTINFILLPATHNVPROC) (GLuint path, GLuint mask, GLfloat x, GLfloat y); typedef GLboolean (GLAPIENTRY * PFNGLISPOINTINSTROKEPATHNVPROC) (GLuint path, GLfloat x, GLfloat y); typedef void (GLAPIENTRY * PFNGLPATHCOLORGENNVPROC) (GLenum color, GLenum genMode, GLenum colorFormat, const GLfloat* coeffs); typedef void (GLAPIENTRY * PFNGLPATHCOMMANDSNVPROC) (GLuint path, GLsizei numCommands, const GLubyte* commands, GLsizei numCoords, GLenum coordType, const GLvoid*coords); typedef void (GLAPIENTRY * PFNGLPATHCOORDSNVPROC) (GLuint path, GLsizei numCoords, GLenum coordType, const void* coords); typedef void (GLAPIENTRY * PFNGLPATHCOVERDEPTHFUNCNVPROC) (GLenum zfunc); typedef void (GLAPIENTRY * PFNGLPATHDASHARRAYNVPROC) (GLuint path, GLsizei dashCount, const GLfloat* dashArray); typedef void (GLAPIENTRY * PFNGLPATHFOGGENNVPROC) (GLenum genMode); typedef void (GLAPIENTRY * PFNGLPATHGLYPHRANGENVPROC) (GLuint firstPathName, GLenum fontTarget, const void* fontName, GLbitfield fontStyle, GLuint firstGlyph, GLsizei numGlyphs, GLenum handleMissingGlyphs, GLuint pathParameterTemplate, GLfloat emScale); typedef void (GLAPIENTRY * PFNGLPATHGLYPHSNVPROC) (GLuint firstPathName, GLenum fontTarget, const void* fontName, GLbitfield fontStyle, GLsizei numGlyphs, GLenum type, const GLvoid*charcodes, GLenum handleMissingGlyphs, GLuint pathParameterTemplate, GLfloat emScale); typedef void (GLAPIENTRY * PFNGLPATHPARAMETERFNVPROC) (GLuint path, GLenum pname, GLfloat value); typedef void (GLAPIENTRY * PFNGLPATHPARAMETERFVNVPROC) (GLuint path, GLenum pname, const GLfloat* value); typedef void (GLAPIENTRY * PFNGLPATHPARAMETERINVPROC) (GLuint path, GLenum pname, GLint value); typedef void (GLAPIENTRY * PFNGLPATHPARAMETERIVNVPROC) (GLuint path, GLenum pname, const GLint* value); typedef void (GLAPIENTRY * PFNGLPATHSTENCILDEPTHOFFSETNVPROC) (GLfloat factor, GLfloat units); typedef void (GLAPIENTRY * PFNGLPATHSTENCILFUNCNVPROC) (GLenum func, GLint ref, GLuint mask); typedef void (GLAPIENTRY * PFNGLPATHSTRINGNVPROC) (GLuint path, GLenum format, GLsizei length, const void* pathString); typedef void (GLAPIENTRY * PFNGLPATHSUBCOMMANDSNVPROC) (GLuint path, GLsizei commandStart, GLsizei commandsToDelete, GLsizei numCommands, const GLubyte* commands, GLsizei numCoords, GLenum coordType, const GLvoid*coords); typedef void (GLAPIENTRY * PFNGLPATHSUBCOORDSNVPROC) (GLuint path, GLsizei coordStart, GLsizei numCoords, GLenum coordType, const void* coords); typedef void (GLAPIENTRY * PFNGLPATHTEXGENNVPROC) (GLenum texCoordSet, GLenum genMode, GLint components, const GLfloat* coeffs); typedef GLboolean (GLAPIENTRY * PFNGLPOINTALONGPATHNVPROC) (GLuint path, GLsizei startSegment, GLsizei numSegments, GLfloat distance, GLfloat* x, GLfloat *y, GLfloat *tangentX, GLfloat *tangentY); typedef void (GLAPIENTRY * PFNGLSTENCILFILLPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void* paths, GLuint pathBase, GLenum fillMode, GLuint mask, GLenum transformType, const GLfloat *transformValues); typedef void (GLAPIENTRY * PFNGLSTENCILFILLPATHNVPROC) (GLuint path, GLenum fillMode, GLuint mask); typedef void (GLAPIENTRY * PFNGLSTENCILSTROKEPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void* paths, GLuint pathBase, GLint reference, GLuint mask, GLenum transformType, const GLfloat *transformValues); typedef void (GLAPIENTRY * PFNGLSTENCILSTROKEPATHNVPROC) (GLuint path, GLint reference, GLuint mask); typedef void (GLAPIENTRY * PFNGLTRANSFORMPATHNVPROC) (GLuint resultPath, GLuint srcPath, GLenum transformType, const GLfloat* transformValues); typedef void (GLAPIENTRY * PFNGLWEIGHTPATHSNVPROC) (GLuint resultPath, GLsizei numPaths, const GLuint paths[], const GLfloat weights[]); #define glCopyPathNV GLEW_GET_FUN(__glewCopyPathNV) #define glCoverFillPathInstancedNV GLEW_GET_FUN(__glewCoverFillPathInstancedNV) #define glCoverFillPathNV GLEW_GET_FUN(__glewCoverFillPathNV) #define glCoverStrokePathInstancedNV GLEW_GET_FUN(__glewCoverStrokePathInstancedNV) #define glCoverStrokePathNV GLEW_GET_FUN(__glewCoverStrokePathNV) #define glDeletePathsNV GLEW_GET_FUN(__glewDeletePathsNV) #define glGenPathsNV GLEW_GET_FUN(__glewGenPathsNV) #define glGetPathColorGenfvNV GLEW_GET_FUN(__glewGetPathColorGenfvNV) #define glGetPathColorGenivNV GLEW_GET_FUN(__glewGetPathColorGenivNV) #define glGetPathCommandsNV GLEW_GET_FUN(__glewGetPathCommandsNV) #define glGetPathCoordsNV GLEW_GET_FUN(__glewGetPathCoordsNV) #define glGetPathDashArrayNV GLEW_GET_FUN(__glewGetPathDashArrayNV) #define glGetPathLengthNV GLEW_GET_FUN(__glewGetPathLengthNV) #define glGetPathMetricRangeNV GLEW_GET_FUN(__glewGetPathMetricRangeNV) #define glGetPathMetricsNV GLEW_GET_FUN(__glewGetPathMetricsNV) #define glGetPathParameterfvNV GLEW_GET_FUN(__glewGetPathParameterfvNV) #define glGetPathParameterivNV GLEW_GET_FUN(__glewGetPathParameterivNV) #define glGetPathSpacingNV GLEW_GET_FUN(__glewGetPathSpacingNV) #define glGetPathTexGenfvNV GLEW_GET_FUN(__glewGetPathTexGenfvNV) #define glGetPathTexGenivNV GLEW_GET_FUN(__glewGetPathTexGenivNV) #define glInterpolatePathsNV GLEW_GET_FUN(__glewInterpolatePathsNV) #define glIsPathNV GLEW_GET_FUN(__glewIsPathNV) #define glIsPointInFillPathNV GLEW_GET_FUN(__glewIsPointInFillPathNV) #define glIsPointInStrokePathNV GLEW_GET_FUN(__glewIsPointInStrokePathNV) #define glPathColorGenNV GLEW_GET_FUN(__glewPathColorGenNV) #define glPathCommandsNV GLEW_GET_FUN(__glewPathCommandsNV) #define glPathCoordsNV GLEW_GET_FUN(__glewPathCoordsNV) #define glPathCoverDepthFuncNV GLEW_GET_FUN(__glewPathCoverDepthFuncNV) #define glPathDashArrayNV GLEW_GET_FUN(__glewPathDashArrayNV) #define glPathFogGenNV GLEW_GET_FUN(__glewPathFogGenNV) #define glPathGlyphRangeNV GLEW_GET_FUN(__glewPathGlyphRangeNV) #define glPathGlyphsNV GLEW_GET_FUN(__glewPathGlyphsNV) #define glPathParameterfNV GLEW_GET_FUN(__glewPathParameterfNV) #define glPathParameterfvNV GLEW_GET_FUN(__glewPathParameterfvNV) #define glPathParameteriNV GLEW_GET_FUN(__glewPathParameteriNV) #define glPathParameterivNV GLEW_GET_FUN(__glewPathParameterivNV) #define glPathStencilDepthOffsetNV GLEW_GET_FUN(__glewPathStencilDepthOffsetNV) #define glPathStencilFuncNV GLEW_GET_FUN(__glewPathStencilFuncNV) #define glPathStringNV GLEW_GET_FUN(__glewPathStringNV) #define glPathSubCommandsNV GLEW_GET_FUN(__glewPathSubCommandsNV) #define glPathSubCoordsNV GLEW_GET_FUN(__glewPathSubCoordsNV) #define glPathTexGenNV GLEW_GET_FUN(__glewPathTexGenNV) #define glPointAlongPathNV GLEW_GET_FUN(__glewPointAlongPathNV) #define glStencilFillPathInstancedNV GLEW_GET_FUN(__glewStencilFillPathInstancedNV) #define glStencilFillPathNV GLEW_GET_FUN(__glewStencilFillPathNV) #define glStencilStrokePathInstancedNV GLEW_GET_FUN(__glewStencilStrokePathInstancedNV) #define glStencilStrokePathNV GLEW_GET_FUN(__glewStencilStrokePathNV) #define glTransformPathNV GLEW_GET_FUN(__glewTransformPathNV) #define glWeightPathsNV GLEW_GET_FUN(__glewWeightPathsNV) #define GLEW_NV_path_rendering GLEW_GET_VAR(__GLEW_NV_path_rendering) #endif /* GL_NV_path_rendering */ /* ------------------------- GL_NV_pixel_data_range ------------------------ */ #ifndef GL_NV_pixel_data_range #define GL_NV_pixel_data_range 1 #define GL_WRITE_PIXEL_DATA_RANGE_NV 0x8878 #define GL_READ_PIXEL_DATA_RANGE_NV 0x8879 #define GL_WRITE_PIXEL_DATA_RANGE_LENGTH_NV 0x887A #define GL_READ_PIXEL_DATA_RANGE_LENGTH_NV 0x887B #define GL_WRITE_PIXEL_DATA_RANGE_POINTER_NV 0x887C #define GL_READ_PIXEL_DATA_RANGE_POINTER_NV 0x887D typedef void (GLAPIENTRY * PFNGLFLUSHPIXELDATARANGENVPROC) (GLenum target); typedef void (GLAPIENTRY * PFNGLPIXELDATARANGENVPROC) (GLenum target, GLsizei length, void* pointer); #define glFlushPixelDataRangeNV GLEW_GET_FUN(__glewFlushPixelDataRangeNV) #define glPixelDataRangeNV GLEW_GET_FUN(__glewPixelDataRangeNV) #define GLEW_NV_pixel_data_range GLEW_GET_VAR(__GLEW_NV_pixel_data_range) #endif /* GL_NV_pixel_data_range */ /* --------------------------- GL_NV_point_sprite -------------------------- */ #ifndef GL_NV_point_sprite #define GL_NV_point_sprite 1 #define GL_POINT_SPRITE_NV 0x8861 #define GL_COORD_REPLACE_NV 0x8862 #define GL_POINT_SPRITE_R_MODE_NV 0x8863 typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERINVPROC) (GLenum pname, GLint param); typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERIVNVPROC) (GLenum pname, const GLint* params); #define glPointParameteriNV GLEW_GET_FUN(__glewPointParameteriNV) #define glPointParameterivNV GLEW_GET_FUN(__glewPointParameterivNV) #define GLEW_NV_point_sprite GLEW_GET_VAR(__GLEW_NV_point_sprite) #endif /* GL_NV_point_sprite */ /* -------------------------- GL_NV_present_video -------------------------- */ #ifndef GL_NV_present_video #define GL_NV_present_video 1 #define GL_FRAME_NV 0x8E26 #define GL_FIELDS_NV 0x8E27 #define GL_CURRENT_TIME_NV 0x8E28 #define GL_NUM_FILL_STREAMS_NV 0x8E29 #define GL_PRESENT_TIME_NV 0x8E2A #define GL_PRESENT_DURATION_NV 0x8E2B typedef void (GLAPIENTRY * PFNGLGETVIDEOI64VNVPROC) (GLuint video_slot, GLenum pname, GLint64EXT* params); typedef void (GLAPIENTRY * PFNGLGETVIDEOIVNVPROC) (GLuint video_slot, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLGETVIDEOUI64VNVPROC) (GLuint video_slot, GLenum pname, GLuint64EXT* params); typedef void (GLAPIENTRY * PFNGLGETVIDEOUIVNVPROC) (GLuint video_slot, GLenum pname, GLuint* params); typedef void (GLAPIENTRY * PFNGLPRESENTFRAMEDUALFILLNVPROC) (GLuint video_slot, GLuint64EXT minPresentTime, GLuint beginPresentTimeId, GLuint presentDurationId, GLenum type, GLenum target0, GLuint fill0, GLenum target1, GLuint fill1, GLenum target2, GLuint fill2, GLenum target3, GLuint fill3); typedef void (GLAPIENTRY * PFNGLPRESENTFRAMEKEYEDNVPROC) (GLuint video_slot, GLuint64EXT minPresentTime, GLuint beginPresentTimeId, GLuint presentDurationId, GLenum type, GLenum target0, GLuint fill0, GLuint key0, GLenum target1, GLuint fill1, GLuint key1); #define glGetVideoi64vNV GLEW_GET_FUN(__glewGetVideoi64vNV) #define glGetVideoivNV GLEW_GET_FUN(__glewGetVideoivNV) #define glGetVideoui64vNV GLEW_GET_FUN(__glewGetVideoui64vNV) #define glGetVideouivNV GLEW_GET_FUN(__glewGetVideouivNV) #define glPresentFrameDualFillNV GLEW_GET_FUN(__glewPresentFrameDualFillNV) #define glPresentFrameKeyedNV GLEW_GET_FUN(__glewPresentFrameKeyedNV) #define GLEW_NV_present_video GLEW_GET_VAR(__GLEW_NV_present_video) #endif /* GL_NV_present_video */ /* ------------------------ GL_NV_primitive_restart ------------------------ */ #ifndef GL_NV_primitive_restart #define GL_NV_primitive_restart 1 #define GL_PRIMITIVE_RESTART_NV 0x8558 #define GL_PRIMITIVE_RESTART_INDEX_NV 0x8559 typedef void (GLAPIENTRY * PFNGLPRIMITIVERESTARTINDEXNVPROC) (GLuint index); typedef void (GLAPIENTRY * PFNGLPRIMITIVERESTARTNVPROC) (void); #define glPrimitiveRestartIndexNV GLEW_GET_FUN(__glewPrimitiveRestartIndexNV) #define glPrimitiveRestartNV GLEW_GET_FUN(__glewPrimitiveRestartNV) #define GLEW_NV_primitive_restart GLEW_GET_VAR(__GLEW_NV_primitive_restart) #endif /* GL_NV_primitive_restart */ /* ------------------------ GL_NV_register_combiners ----------------------- */ #ifndef GL_NV_register_combiners #define GL_NV_register_combiners 1 #define GL_REGISTER_COMBINERS_NV 0x8522 #define GL_VARIABLE_A_NV 0x8523 #define GL_VARIABLE_B_NV 0x8524 #define GL_VARIABLE_C_NV 0x8525 #define GL_VARIABLE_D_NV 0x8526 #define GL_VARIABLE_E_NV 0x8527 #define GL_VARIABLE_F_NV 0x8528 #define GL_VARIABLE_G_NV 0x8529 #define GL_CONSTANT_COLOR0_NV 0x852A #define GL_CONSTANT_COLOR1_NV 0x852B #define GL_PRIMARY_COLOR_NV 0x852C #define GL_SECONDARY_COLOR_NV 0x852D #define GL_SPARE0_NV 0x852E #define GL_SPARE1_NV 0x852F #define GL_DISCARD_NV 0x8530 #define GL_E_TIMES_F_NV 0x8531 #define GL_SPARE0_PLUS_SECONDARY_COLOR_NV 0x8532 #define GL_UNSIGNED_IDENTITY_NV 0x8536 #define GL_UNSIGNED_INVERT_NV 0x8537 #define GL_EXPAND_NORMAL_NV 0x8538 #define GL_EXPAND_NEGATE_NV 0x8539 #define GL_HALF_BIAS_NORMAL_NV 0x853A #define GL_HALF_BIAS_NEGATE_NV 0x853B #define GL_SIGNED_IDENTITY_NV 0x853C #define GL_SIGNED_NEGATE_NV 0x853D #define GL_SCALE_BY_TWO_NV 0x853E #define GL_SCALE_BY_FOUR_NV 0x853F #define GL_SCALE_BY_ONE_HALF_NV 0x8540 #define GL_BIAS_BY_NEGATIVE_ONE_HALF_NV 0x8541 #define GL_COMBINER_INPUT_NV 0x8542 #define GL_COMBINER_MAPPING_NV 0x8543 #define GL_COMBINER_COMPONENT_USAGE_NV 0x8544 #define GL_COMBINER_AB_DOT_PRODUCT_NV 0x8545 #define GL_COMBINER_CD_DOT_PRODUCT_NV 0x8546 #define GL_COMBINER_MUX_SUM_NV 0x8547 #define GL_COMBINER_SCALE_NV 0x8548 #define GL_COMBINER_BIAS_NV 0x8549 #define GL_COMBINER_AB_OUTPUT_NV 0x854A #define GL_COMBINER_CD_OUTPUT_NV 0x854B #define GL_COMBINER_SUM_OUTPUT_NV 0x854C #define GL_MAX_GENERAL_COMBINERS_NV 0x854D #define GL_NUM_GENERAL_COMBINERS_NV 0x854E #define GL_COLOR_SUM_CLAMP_NV 0x854F #define GL_COMBINER0_NV 0x8550 #define GL_COMBINER1_NV 0x8551 #define GL_COMBINER2_NV 0x8552 #define GL_COMBINER3_NV 0x8553 #define GL_COMBINER4_NV 0x8554 #define GL_COMBINER5_NV 0x8555 #define GL_COMBINER6_NV 0x8556 #define GL_COMBINER7_NV 0x8557 typedef void (GLAPIENTRY * PFNGLCOMBINERINPUTNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage); typedef void (GLAPIENTRY * PFNGLCOMBINEROUTPUTNVPROC) (GLenum stage, GLenum portion, GLenum abOutput, GLenum cdOutput, GLenum sumOutput, GLenum scale, GLenum bias, GLboolean abDotProduct, GLboolean cdDotProduct, GLboolean muxSum); typedef void (GLAPIENTRY * PFNGLCOMBINERPARAMETERFNVPROC) (GLenum pname, GLfloat param); typedef void (GLAPIENTRY * PFNGLCOMBINERPARAMETERFVNVPROC) (GLenum pname, const GLfloat* params); typedef void (GLAPIENTRY * PFNGLCOMBINERPARAMETERINVPROC) (GLenum pname, GLint param); typedef void (GLAPIENTRY * PFNGLCOMBINERPARAMETERIVNVPROC) (GLenum pname, const GLint* params); typedef void (GLAPIENTRY * PFNGLFINALCOMBINERINPUTNVPROC) (GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage); typedef void (GLAPIENTRY * PFNGLGETCOMBINERINPUTPARAMETERFVNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLfloat* params); typedef void (GLAPIENTRY * PFNGLGETCOMBINERINPUTPARAMETERIVNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLGETCOMBINEROUTPUTPARAMETERFVNVPROC) (GLenum stage, GLenum portion, GLenum pname, GLfloat* params); typedef void (GLAPIENTRY * PFNGLGETCOMBINEROUTPUTPARAMETERIVNVPROC) (GLenum stage, GLenum portion, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLGETFINALCOMBINERINPUTPARAMETERFVNVPROC) (GLenum variable, GLenum pname, GLfloat* params); typedef void (GLAPIENTRY * PFNGLGETFINALCOMBINERINPUTPARAMETERIVNVPROC) (GLenum variable, GLenum pname, GLint* params); #define glCombinerInputNV GLEW_GET_FUN(__glewCombinerInputNV) #define glCombinerOutputNV GLEW_GET_FUN(__glewCombinerOutputNV) #define glCombinerParameterfNV GLEW_GET_FUN(__glewCombinerParameterfNV) #define glCombinerParameterfvNV GLEW_GET_FUN(__glewCombinerParameterfvNV) #define glCombinerParameteriNV GLEW_GET_FUN(__glewCombinerParameteriNV) #define glCombinerParameterivNV GLEW_GET_FUN(__glewCombinerParameterivNV) #define glFinalCombinerInputNV GLEW_GET_FUN(__glewFinalCombinerInputNV) #define glGetCombinerInputParameterfvNV GLEW_GET_FUN(__glewGetCombinerInputParameterfvNV) #define glGetCombinerInputParameterivNV GLEW_GET_FUN(__glewGetCombinerInputParameterivNV) #define glGetCombinerOutputParameterfvNV GLEW_GET_FUN(__glewGetCombinerOutputParameterfvNV) #define glGetCombinerOutputParameterivNV GLEW_GET_FUN(__glewGetCombinerOutputParameterivNV) #define glGetFinalCombinerInputParameterfvNV GLEW_GET_FUN(__glewGetFinalCombinerInputParameterfvNV) #define glGetFinalCombinerInputParameterivNV GLEW_GET_FUN(__glewGetFinalCombinerInputParameterivNV) #define GLEW_NV_register_combiners GLEW_GET_VAR(__GLEW_NV_register_combiners) #endif /* GL_NV_register_combiners */ /* ----------------------- GL_NV_register_combiners2 ----------------------- */ #ifndef GL_NV_register_combiners2 #define GL_NV_register_combiners2 1 #define GL_PER_STAGE_CONSTANTS_NV 0x8535 typedef void (GLAPIENTRY * PFNGLCOMBINERSTAGEPARAMETERFVNVPROC) (GLenum stage, GLenum pname, const GLfloat* params); typedef void (GLAPIENTRY * PFNGLGETCOMBINERSTAGEPARAMETERFVNVPROC) (GLenum stage, GLenum pname, GLfloat* params); #define glCombinerStageParameterfvNV GLEW_GET_FUN(__glewCombinerStageParameterfvNV) #define glGetCombinerStageParameterfvNV GLEW_GET_FUN(__glewGetCombinerStageParameterfvNV) #define GLEW_NV_register_combiners2 GLEW_GET_VAR(__GLEW_NV_register_combiners2) #endif /* GL_NV_register_combiners2 */ /* ----------------------- GL_NV_shader_atomic_float ----------------------- */ #ifndef GL_NV_shader_atomic_float #define GL_NV_shader_atomic_float 1 #define GLEW_NV_shader_atomic_float GLEW_GET_VAR(__GLEW_NV_shader_atomic_float) #endif /* GL_NV_shader_atomic_float */ /* ------------------------ GL_NV_shader_buffer_load ----------------------- */ #ifndef GL_NV_shader_buffer_load #define GL_NV_shader_buffer_load 1 #define GL_BUFFER_GPU_ADDRESS_NV 0x8F1D #define GL_GPU_ADDRESS_NV 0x8F34 #define GL_MAX_SHADER_BUFFER_ADDRESS_NV 0x8F35 typedef void (GLAPIENTRY * PFNGLGETBUFFERPARAMETERUI64VNVPROC) (GLenum target, GLenum pname, GLuint64EXT* params); typedef void (GLAPIENTRY * PFNGLGETINTEGERUI64VNVPROC) (GLenum value, GLuint64EXT* result); typedef void (GLAPIENTRY * PFNGLGETNAMEDBUFFERPARAMETERUI64VNVPROC) (GLuint buffer, GLenum pname, GLuint64EXT* params); typedef GLboolean (GLAPIENTRY * PFNGLISBUFFERRESIDENTNVPROC) (GLenum target); typedef GLboolean (GLAPIENTRY * PFNGLISNAMEDBUFFERRESIDENTNVPROC) (GLuint buffer); typedef void (GLAPIENTRY * PFNGLMAKEBUFFERNONRESIDENTNVPROC) (GLenum target); typedef void (GLAPIENTRY * PFNGLMAKEBUFFERRESIDENTNVPROC) (GLenum target, GLenum access); typedef void (GLAPIENTRY * PFNGLMAKENAMEDBUFFERNONRESIDENTNVPROC) (GLuint buffer); typedef void (GLAPIENTRY * PFNGLMAKENAMEDBUFFERRESIDENTNVPROC) (GLuint buffer, GLenum access); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMUI64NVPROC) (GLuint program, GLint location, GLuint64EXT value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMUI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT* value); typedef void (GLAPIENTRY * PFNGLUNIFORMUI64NVPROC) (GLint location, GLuint64EXT value); typedef void (GLAPIENTRY * PFNGLUNIFORMUI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT* value); #define glGetBufferParameterui64vNV GLEW_GET_FUN(__glewGetBufferParameterui64vNV) #define glGetIntegerui64vNV GLEW_GET_FUN(__glewGetIntegerui64vNV) #define glGetNamedBufferParameterui64vNV GLEW_GET_FUN(__glewGetNamedBufferParameterui64vNV) #define glIsBufferResidentNV GLEW_GET_FUN(__glewIsBufferResidentNV) #define glIsNamedBufferResidentNV GLEW_GET_FUN(__glewIsNamedBufferResidentNV) #define glMakeBufferNonResidentNV GLEW_GET_FUN(__glewMakeBufferNonResidentNV) #define glMakeBufferResidentNV GLEW_GET_FUN(__glewMakeBufferResidentNV) #define glMakeNamedBufferNonResidentNV GLEW_GET_FUN(__glewMakeNamedBufferNonResidentNV) #define glMakeNamedBufferResidentNV GLEW_GET_FUN(__glewMakeNamedBufferResidentNV) #define glProgramUniformui64NV GLEW_GET_FUN(__glewProgramUniformui64NV) #define glProgramUniformui64vNV GLEW_GET_FUN(__glewProgramUniformui64vNV) #define glUniformui64NV GLEW_GET_FUN(__glewUniformui64NV) #define glUniformui64vNV GLEW_GET_FUN(__glewUniformui64vNV) #define GLEW_NV_shader_buffer_load GLEW_GET_VAR(__GLEW_NV_shader_buffer_load) #endif /* GL_NV_shader_buffer_load */ /* ---------------------- GL_NV_tessellation_program5 ---------------------- */ #ifndef GL_NV_tessellation_program5 #define GL_NV_tessellation_program5 1 #define GL_MAX_PROGRAM_PATCH_ATTRIBS_NV 0x86D8 #define GL_TESS_CONTROL_PROGRAM_NV 0x891E #define GL_TESS_EVALUATION_PROGRAM_NV 0x891F #define GL_TESS_CONTROL_PROGRAM_PARAMETER_BUFFER_NV 0x8C74 #define GL_TESS_EVALUATION_PROGRAM_PARAMETER_BUFFER_NV 0x8C75 #define GLEW_NV_tessellation_program5 GLEW_GET_VAR(__GLEW_NV_tessellation_program5) #endif /* GL_NV_tessellation_program5 */ /* -------------------------- GL_NV_texgen_emboss -------------------------- */ #ifndef GL_NV_texgen_emboss #define GL_NV_texgen_emboss 1 #define GL_EMBOSS_LIGHT_NV 0x855D #define GL_EMBOSS_CONSTANT_NV 0x855E #define GL_EMBOSS_MAP_NV 0x855F #define GLEW_NV_texgen_emboss GLEW_GET_VAR(__GLEW_NV_texgen_emboss) #endif /* GL_NV_texgen_emboss */ /* ------------------------ GL_NV_texgen_reflection ------------------------ */ #ifndef GL_NV_texgen_reflection #define GL_NV_texgen_reflection 1 #define GL_NORMAL_MAP_NV 0x8511 #define GL_REFLECTION_MAP_NV 0x8512 #define GLEW_NV_texgen_reflection GLEW_GET_VAR(__GLEW_NV_texgen_reflection) #endif /* GL_NV_texgen_reflection */ /* ------------------------- GL_NV_texture_barrier ------------------------- */ #ifndef GL_NV_texture_barrier #define GL_NV_texture_barrier 1 typedef void (GLAPIENTRY * PFNGLTEXTUREBARRIERNVPROC) (void); #define glTextureBarrierNV GLEW_GET_FUN(__glewTextureBarrierNV) #define GLEW_NV_texture_barrier GLEW_GET_VAR(__GLEW_NV_texture_barrier) #endif /* GL_NV_texture_barrier */ /* --------------------- GL_NV_texture_compression_vtc --------------------- */ #ifndef GL_NV_texture_compression_vtc #define GL_NV_texture_compression_vtc 1 #define GLEW_NV_texture_compression_vtc GLEW_GET_VAR(__GLEW_NV_texture_compression_vtc) #endif /* GL_NV_texture_compression_vtc */ /* ----------------------- GL_NV_texture_env_combine4 ---------------------- */ #ifndef GL_NV_texture_env_combine4 #define GL_NV_texture_env_combine4 1 #define GL_COMBINE4_NV 0x8503 #define GL_SOURCE3_RGB_NV 0x8583 #define GL_SOURCE3_ALPHA_NV 0x858B #define GL_OPERAND3_RGB_NV 0x8593 #define GL_OPERAND3_ALPHA_NV 0x859B #define GLEW_NV_texture_env_combine4 GLEW_GET_VAR(__GLEW_NV_texture_env_combine4) #endif /* GL_NV_texture_env_combine4 */ /* ---------------------- GL_NV_texture_expand_normal ---------------------- */ #ifndef GL_NV_texture_expand_normal #define GL_NV_texture_expand_normal 1 #define GL_TEXTURE_UNSIGNED_REMAP_MODE_NV 0x888F #define GLEW_NV_texture_expand_normal GLEW_GET_VAR(__GLEW_NV_texture_expand_normal) #endif /* GL_NV_texture_expand_normal */ /* ----------------------- GL_NV_texture_multisample ----------------------- */ #ifndef GL_NV_texture_multisample #define GL_NV_texture_multisample 1 #define GL_TEXTURE_COVERAGE_SAMPLES_NV 0x9045 #define GL_TEXTURE_COLOR_SAMPLES_NV 0x9046 typedef void (GLAPIENTRY * PFNGLTEXIMAGE2DMULTISAMPLECOVERAGENVPROC) (GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLint internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations); typedef void (GLAPIENTRY * PFNGLTEXIMAGE3DMULTISAMPLECOVERAGENVPROC) (GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations); typedef void (GLAPIENTRY * PFNGLTEXTUREIMAGE2DMULTISAMPLECOVERAGENVPROC) (GLuint texture, GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLint internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations); typedef void (GLAPIENTRY * PFNGLTEXTUREIMAGE2DMULTISAMPLENVPROC) (GLuint texture, GLenum target, GLsizei samples, GLint internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations); typedef void (GLAPIENTRY * PFNGLTEXTUREIMAGE3DMULTISAMPLECOVERAGENVPROC) (GLuint texture, GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations); typedef void (GLAPIENTRY * PFNGLTEXTUREIMAGE3DMULTISAMPLENVPROC) (GLuint texture, GLenum target, GLsizei samples, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations); #define glTexImage2DMultisampleCoverageNV GLEW_GET_FUN(__glewTexImage2DMultisampleCoverageNV) #define glTexImage3DMultisampleCoverageNV GLEW_GET_FUN(__glewTexImage3DMultisampleCoverageNV) #define glTextureImage2DMultisampleCoverageNV GLEW_GET_FUN(__glewTextureImage2DMultisampleCoverageNV) #define glTextureImage2DMultisampleNV GLEW_GET_FUN(__glewTextureImage2DMultisampleNV) #define glTextureImage3DMultisampleCoverageNV GLEW_GET_FUN(__glewTextureImage3DMultisampleCoverageNV) #define glTextureImage3DMultisampleNV GLEW_GET_FUN(__glewTextureImage3DMultisampleNV) #define GLEW_NV_texture_multisample GLEW_GET_VAR(__GLEW_NV_texture_multisample) #endif /* GL_NV_texture_multisample */ /* ------------------------ GL_NV_texture_rectangle ------------------------ */ #ifndef GL_NV_texture_rectangle #define GL_NV_texture_rectangle 1 #define GL_TEXTURE_RECTANGLE_NV 0x84F5 #define GL_TEXTURE_BINDING_RECTANGLE_NV 0x84F6 #define GL_PROXY_TEXTURE_RECTANGLE_NV 0x84F7 #define GL_MAX_RECTANGLE_TEXTURE_SIZE_NV 0x84F8 #define GLEW_NV_texture_rectangle GLEW_GET_VAR(__GLEW_NV_texture_rectangle) #endif /* GL_NV_texture_rectangle */ /* -------------------------- GL_NV_texture_shader ------------------------- */ #ifndef GL_NV_texture_shader #define GL_NV_texture_shader 1 #define GL_OFFSET_TEXTURE_RECTANGLE_NV 0x864C #define GL_OFFSET_TEXTURE_RECTANGLE_SCALE_NV 0x864D #define GL_DOT_PRODUCT_TEXTURE_RECTANGLE_NV 0x864E #define GL_RGBA_UNSIGNED_DOT_PRODUCT_MAPPING_NV 0x86D9 #define GL_UNSIGNED_INT_S8_S8_8_8_NV 0x86DA #define GL_UNSIGNED_INT_8_8_S8_S8_REV_NV 0x86DB #define GL_DSDT_MAG_INTENSITY_NV 0x86DC #define GL_SHADER_CONSISTENT_NV 0x86DD #define GL_TEXTURE_SHADER_NV 0x86DE #define GL_SHADER_OPERATION_NV 0x86DF #define GL_CULL_MODES_NV 0x86E0 #define GL_OFFSET_TEXTURE_2D_MATRIX_NV 0x86E1 #define GL_OFFSET_TEXTURE_MATRIX_NV 0x86E1 #define GL_OFFSET_TEXTURE_2D_SCALE_NV 0x86E2 #define GL_OFFSET_TEXTURE_SCALE_NV 0x86E2 #define GL_OFFSET_TEXTURE_BIAS_NV 0x86E3 #define GL_OFFSET_TEXTURE_2D_BIAS_NV 0x86E3 #define GL_PREVIOUS_TEXTURE_INPUT_NV 0x86E4 #define GL_CONST_EYE_NV 0x86E5 #define GL_PASS_THROUGH_NV 0x86E6 #define GL_CULL_FRAGMENT_NV 0x86E7 #define GL_OFFSET_TEXTURE_2D_NV 0x86E8 #define GL_DEPENDENT_AR_TEXTURE_2D_NV 0x86E9 #define GL_DEPENDENT_GB_TEXTURE_2D_NV 0x86EA #define GL_DOT_PRODUCT_NV 0x86EC #define GL_DOT_PRODUCT_DEPTH_REPLACE_NV 0x86ED #define GL_DOT_PRODUCT_TEXTURE_2D_NV 0x86EE #define GL_DOT_PRODUCT_TEXTURE_CUBE_MAP_NV 0x86F0 #define GL_DOT_PRODUCT_DIFFUSE_CUBE_MAP_NV 0x86F1 #define GL_DOT_PRODUCT_REFLECT_CUBE_MAP_NV 0x86F2 #define GL_DOT_PRODUCT_CONST_EYE_REFLECT_CUBE_MAP_NV 0x86F3 #define GL_HILO_NV 0x86F4 #define GL_DSDT_NV 0x86F5 #define GL_DSDT_MAG_NV 0x86F6 #define GL_DSDT_MAG_VIB_NV 0x86F7 #define GL_HILO16_NV 0x86F8 #define GL_SIGNED_HILO_NV 0x86F9 #define GL_SIGNED_HILO16_NV 0x86FA #define GL_SIGNED_RGBA_NV 0x86FB #define GL_SIGNED_RGBA8_NV 0x86FC #define GL_SIGNED_RGB_NV 0x86FE #define GL_SIGNED_RGB8_NV 0x86FF #define GL_SIGNED_LUMINANCE_NV 0x8701 #define GL_SIGNED_LUMINANCE8_NV 0x8702 #define GL_SIGNED_LUMINANCE_ALPHA_NV 0x8703 #define GL_SIGNED_LUMINANCE8_ALPHA8_NV 0x8704 #define GL_SIGNED_ALPHA_NV 0x8705 #define GL_SIGNED_ALPHA8_NV 0x8706 #define GL_SIGNED_INTENSITY_NV 0x8707 #define GL_SIGNED_INTENSITY8_NV 0x8708 #define GL_DSDT8_NV 0x8709 #define GL_DSDT8_MAG8_NV 0x870A #define GL_DSDT8_MAG8_INTENSITY8_NV 0x870B #define GL_SIGNED_RGB_UNSIGNED_ALPHA_NV 0x870C #define GL_SIGNED_RGB8_UNSIGNED_ALPHA8_NV 0x870D #define GL_HI_SCALE_NV 0x870E #define GL_LO_SCALE_NV 0x870F #define GL_DS_SCALE_NV 0x8710 #define GL_DT_SCALE_NV 0x8711 #define GL_MAGNITUDE_SCALE_NV 0x8712 #define GL_VIBRANCE_SCALE_NV 0x8713 #define GL_HI_BIAS_NV 0x8714 #define GL_LO_BIAS_NV 0x8715 #define GL_DS_BIAS_NV 0x8716 #define GL_DT_BIAS_NV 0x8717 #define GL_MAGNITUDE_BIAS_NV 0x8718 #define GL_VIBRANCE_BIAS_NV 0x8719 #define GL_TEXTURE_BORDER_VALUES_NV 0x871A #define GL_TEXTURE_HI_SIZE_NV 0x871B #define GL_TEXTURE_LO_SIZE_NV 0x871C #define GL_TEXTURE_DS_SIZE_NV 0x871D #define GL_TEXTURE_DT_SIZE_NV 0x871E #define GL_TEXTURE_MAG_SIZE_NV 0x871F #define GLEW_NV_texture_shader GLEW_GET_VAR(__GLEW_NV_texture_shader) #endif /* GL_NV_texture_shader */ /* ------------------------- GL_NV_texture_shader2 ------------------------- */ #ifndef GL_NV_texture_shader2 #define GL_NV_texture_shader2 1 #define GL_UNSIGNED_INT_S8_S8_8_8_NV 0x86DA #define GL_UNSIGNED_INT_8_8_S8_S8_REV_NV 0x86DB #define GL_DSDT_MAG_INTENSITY_NV 0x86DC #define GL_DOT_PRODUCT_TEXTURE_3D_NV 0x86EF #define GL_HILO_NV 0x86F4 #define GL_DSDT_NV 0x86F5 #define GL_DSDT_MAG_NV 0x86F6 #define GL_DSDT_MAG_VIB_NV 0x86F7 #define GL_HILO16_NV 0x86F8 #define GL_SIGNED_HILO_NV 0x86F9 #define GL_SIGNED_HILO16_NV 0x86FA #define GL_SIGNED_RGBA_NV 0x86FB #define GL_SIGNED_RGBA8_NV 0x86FC #define GL_SIGNED_RGB_NV 0x86FE #define GL_SIGNED_RGB8_NV 0x86FF #define GL_SIGNED_LUMINANCE_NV 0x8701 #define GL_SIGNED_LUMINANCE8_NV 0x8702 #define GL_SIGNED_LUMINANCE_ALPHA_NV 0x8703 #define GL_SIGNED_LUMINANCE8_ALPHA8_NV 0x8704 #define GL_SIGNED_ALPHA_NV 0x8705 #define GL_SIGNED_ALPHA8_NV 0x8706 #define GL_SIGNED_INTENSITY_NV 0x8707 #define GL_SIGNED_INTENSITY8_NV 0x8708 #define GL_DSDT8_NV 0x8709 #define GL_DSDT8_MAG8_NV 0x870A #define GL_DSDT8_MAG8_INTENSITY8_NV 0x870B #define GL_SIGNED_RGB_UNSIGNED_ALPHA_NV 0x870C #define GL_SIGNED_RGB8_UNSIGNED_ALPHA8_NV 0x870D #define GLEW_NV_texture_shader2 GLEW_GET_VAR(__GLEW_NV_texture_shader2) #endif /* GL_NV_texture_shader2 */ /* ------------------------- GL_NV_texture_shader3 ------------------------- */ #ifndef GL_NV_texture_shader3 #define GL_NV_texture_shader3 1 #define GL_OFFSET_PROJECTIVE_TEXTURE_2D_NV 0x8850 #define GL_OFFSET_PROJECTIVE_TEXTURE_2D_SCALE_NV 0x8851 #define GL_OFFSET_PROJECTIVE_TEXTURE_RECTANGLE_NV 0x8852 #define GL_OFFSET_PROJECTIVE_TEXTURE_RECTANGLE_SCALE_NV 0x8853 #define GL_OFFSET_HILO_TEXTURE_2D_NV 0x8854 #define GL_OFFSET_HILO_TEXTURE_RECTANGLE_NV 0x8855 #define GL_OFFSET_HILO_PROJECTIVE_TEXTURE_2D_NV 0x8856 #define GL_OFFSET_HILO_PROJECTIVE_TEXTURE_RECTANGLE_NV 0x8857 #define GL_DEPENDENT_HILO_TEXTURE_2D_NV 0x8858 #define GL_DEPENDENT_RGB_TEXTURE_3D_NV 0x8859 #define GL_DEPENDENT_RGB_TEXTURE_CUBE_MAP_NV 0x885A #define GL_DOT_PRODUCT_PASS_THROUGH_NV 0x885B #define GL_DOT_PRODUCT_TEXTURE_1D_NV 0x885C #define GL_DOT_PRODUCT_AFFINE_DEPTH_REPLACE_NV 0x885D #define GL_HILO8_NV 0x885E #define GL_SIGNED_HILO8_NV 0x885F #define GL_FORCE_BLUE_TO_ONE_NV 0x8860 #define GLEW_NV_texture_shader3 GLEW_GET_VAR(__GLEW_NV_texture_shader3) #endif /* GL_NV_texture_shader3 */ /* ------------------------ GL_NV_transform_feedback ----------------------- */ #ifndef GL_NV_transform_feedback #define GL_NV_transform_feedback 1 #define GL_BACK_PRIMARY_COLOR_NV 0x8C77 #define GL_BACK_SECONDARY_COLOR_NV 0x8C78 #define GL_TEXTURE_COORD_NV 0x8C79 #define GL_CLIP_DISTANCE_NV 0x8C7A #define GL_VERTEX_ID_NV 0x8C7B #define GL_PRIMITIVE_ID_NV 0x8C7C #define GL_GENERIC_ATTRIB_NV 0x8C7D #define GL_TRANSFORM_FEEDBACK_ATTRIBS_NV 0x8C7E #define GL_TRANSFORM_FEEDBACK_BUFFER_MODE_NV 0x8C7F #define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS_NV 0x8C80 #define GL_ACTIVE_VARYINGS_NV 0x8C81 #define GL_ACTIVE_VARYING_MAX_LENGTH_NV 0x8C82 #define GL_TRANSFORM_FEEDBACK_VARYINGS_NV 0x8C83 #define GL_TRANSFORM_FEEDBACK_BUFFER_START_NV 0x8C84 #define GL_TRANSFORM_FEEDBACK_BUFFER_SIZE_NV 0x8C85 #define GL_TRANSFORM_FEEDBACK_RECORD_NV 0x8C86 #define GL_PRIMITIVES_GENERATED_NV 0x8C87 #define GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN_NV 0x8C88 #define GL_RASTERIZER_DISCARD_NV 0x8C89 #define GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS_NV 0x8C8A #define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS_NV 0x8C8B #define GL_INTERLEAVED_ATTRIBS_NV 0x8C8C #define GL_SEPARATE_ATTRIBS_NV 0x8C8D #define GL_TRANSFORM_FEEDBACK_BUFFER_NV 0x8C8E #define GL_TRANSFORM_FEEDBACK_BUFFER_BINDING_NV 0x8C8F typedef void (GLAPIENTRY * PFNGLACTIVEVARYINGNVPROC) (GLuint program, const GLchar *name); typedef void (GLAPIENTRY * PFNGLBEGINTRANSFORMFEEDBACKNVPROC) (GLenum primitiveMode); typedef void (GLAPIENTRY * PFNGLBINDBUFFERBASENVPROC) (GLenum target, GLuint index, GLuint buffer); typedef void (GLAPIENTRY * PFNGLBINDBUFFEROFFSETNVPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset); typedef void (GLAPIENTRY * PFNGLBINDBUFFERRANGENVPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); typedef void (GLAPIENTRY * PFNGLENDTRANSFORMFEEDBACKNVPROC) (void); typedef void (GLAPIENTRY * PFNGLGETACTIVEVARYINGNVPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name); typedef void (GLAPIENTRY * PFNGLGETTRANSFORMFEEDBACKVARYINGNVPROC) (GLuint program, GLuint index, GLint *location); typedef GLint (GLAPIENTRY * PFNGLGETVARYINGLOCATIONNVPROC) (GLuint program, const GLchar *name); typedef void (GLAPIENTRY * PFNGLTRANSFORMFEEDBACKATTRIBSNVPROC) (GLuint count, const GLint *attribs, GLenum bufferMode); typedef void (GLAPIENTRY * PFNGLTRANSFORMFEEDBACKVARYINGSNVPROC) (GLuint program, GLsizei count, const GLint *locations, GLenum bufferMode); #define glActiveVaryingNV GLEW_GET_FUN(__glewActiveVaryingNV) #define glBeginTransformFeedbackNV GLEW_GET_FUN(__glewBeginTransformFeedbackNV) #define glBindBufferBaseNV GLEW_GET_FUN(__glewBindBufferBaseNV) #define glBindBufferOffsetNV GLEW_GET_FUN(__glewBindBufferOffsetNV) #define glBindBufferRangeNV GLEW_GET_FUN(__glewBindBufferRangeNV) #define glEndTransformFeedbackNV GLEW_GET_FUN(__glewEndTransformFeedbackNV) #define glGetActiveVaryingNV GLEW_GET_FUN(__glewGetActiveVaryingNV) #define glGetTransformFeedbackVaryingNV GLEW_GET_FUN(__glewGetTransformFeedbackVaryingNV) #define glGetVaryingLocationNV GLEW_GET_FUN(__glewGetVaryingLocationNV) #define glTransformFeedbackAttribsNV GLEW_GET_FUN(__glewTransformFeedbackAttribsNV) #define glTransformFeedbackVaryingsNV GLEW_GET_FUN(__glewTransformFeedbackVaryingsNV) #define GLEW_NV_transform_feedback GLEW_GET_VAR(__GLEW_NV_transform_feedback) #endif /* GL_NV_transform_feedback */ /* ----------------------- GL_NV_transform_feedback2 ----------------------- */ #ifndef GL_NV_transform_feedback2 #define GL_NV_transform_feedback2 1 #define GL_TRANSFORM_FEEDBACK_NV 0x8E22 #define GL_TRANSFORM_FEEDBACK_BUFFER_PAUSED_NV 0x8E23 #define GL_TRANSFORM_FEEDBACK_BUFFER_ACTIVE_NV 0x8E24 #define GL_TRANSFORM_FEEDBACK_BINDING_NV 0x8E25 typedef void (GLAPIENTRY * PFNGLBINDTRANSFORMFEEDBACKNVPROC) (GLenum target, GLuint id); typedef void (GLAPIENTRY * PFNGLDELETETRANSFORMFEEDBACKSNVPROC) (GLsizei n, const GLuint* ids); typedef void (GLAPIENTRY * PFNGLDRAWTRANSFORMFEEDBACKNVPROC) (GLenum mode, GLuint id); typedef void (GLAPIENTRY * PFNGLGENTRANSFORMFEEDBACKSNVPROC) (GLsizei n, GLuint* ids); typedef GLboolean (GLAPIENTRY * PFNGLISTRANSFORMFEEDBACKNVPROC) (GLuint id); typedef void (GLAPIENTRY * PFNGLPAUSETRANSFORMFEEDBACKNVPROC) (void); typedef void (GLAPIENTRY * PFNGLRESUMETRANSFORMFEEDBACKNVPROC) (void); #define glBindTransformFeedbackNV GLEW_GET_FUN(__glewBindTransformFeedbackNV) #define glDeleteTransformFeedbacksNV GLEW_GET_FUN(__glewDeleteTransformFeedbacksNV) #define glDrawTransformFeedbackNV GLEW_GET_FUN(__glewDrawTransformFeedbackNV) #define glGenTransformFeedbacksNV GLEW_GET_FUN(__glewGenTransformFeedbacksNV) #define glIsTransformFeedbackNV GLEW_GET_FUN(__glewIsTransformFeedbackNV) #define glPauseTransformFeedbackNV GLEW_GET_FUN(__glewPauseTransformFeedbackNV) #define glResumeTransformFeedbackNV GLEW_GET_FUN(__glewResumeTransformFeedbackNV) #define GLEW_NV_transform_feedback2 GLEW_GET_VAR(__GLEW_NV_transform_feedback2) #endif /* GL_NV_transform_feedback2 */ /* -------------------------- GL_NV_vdpau_interop -------------------------- */ #ifndef GL_NV_vdpau_interop #define GL_NV_vdpau_interop 1 #define GL_SURFACE_STATE_NV 0x86EB #define GL_SURFACE_REGISTERED_NV 0x86FD #define GL_SURFACE_MAPPED_NV 0x8700 #define GL_WRITE_DISCARD_NV 0x88BE typedef GLintptr GLvdpauSurfaceNV; typedef void (GLAPIENTRY * PFNGLVDPAUFININVPROC) (void); typedef void (GLAPIENTRY * PFNGLVDPAUGETSURFACEIVNVPROC) (GLvdpauSurfaceNV surface, GLenum pname, GLsizei bufSize, GLsizei* length, GLint *values); typedef void (GLAPIENTRY * PFNGLVDPAUINITNVPROC) (const void* vdpDevice, const GLvoid*getProcAddress); typedef void (GLAPIENTRY * PFNGLVDPAUISSURFACENVPROC) (GLvdpauSurfaceNV surface); typedef void (GLAPIENTRY * PFNGLVDPAUMAPSURFACESNVPROC) (GLsizei numSurfaces, const GLvdpauSurfaceNV* surfaces); typedef GLvdpauSurfaceNV (GLAPIENTRY * PFNGLVDPAUREGISTEROUTPUTSURFACENVPROC) (const void* vdpSurface, GLenum target, GLsizei numTextureNames, const GLuint *textureNames); typedef GLvdpauSurfaceNV (GLAPIENTRY * PFNGLVDPAUREGISTERVIDEOSURFACENVPROC) (const void* vdpSurface, GLenum target, GLsizei numTextureNames, const GLuint *textureNames); typedef void (GLAPIENTRY * PFNGLVDPAUSURFACEACCESSNVPROC) (GLvdpauSurfaceNV surface, GLenum access); typedef void (GLAPIENTRY * PFNGLVDPAUUNMAPSURFACESNVPROC) (GLsizei numSurface, const GLvdpauSurfaceNV* surfaces); typedef void (GLAPIENTRY * PFNGLVDPAUUNREGISTERSURFACENVPROC) (GLvdpauSurfaceNV surface); #define glVDPAUFiniNV GLEW_GET_FUN(__glewVDPAUFiniNV) #define glVDPAUGetSurfaceivNV GLEW_GET_FUN(__glewVDPAUGetSurfaceivNV) #define glVDPAUInitNV GLEW_GET_FUN(__glewVDPAUInitNV) #define glVDPAUIsSurfaceNV GLEW_GET_FUN(__glewVDPAUIsSurfaceNV) #define glVDPAUMapSurfacesNV GLEW_GET_FUN(__glewVDPAUMapSurfacesNV) #define glVDPAURegisterOutputSurfaceNV GLEW_GET_FUN(__glewVDPAURegisterOutputSurfaceNV) #define glVDPAURegisterVideoSurfaceNV GLEW_GET_FUN(__glewVDPAURegisterVideoSurfaceNV) #define glVDPAUSurfaceAccessNV GLEW_GET_FUN(__glewVDPAUSurfaceAccessNV) #define glVDPAUUnmapSurfacesNV GLEW_GET_FUN(__glewVDPAUUnmapSurfacesNV) #define glVDPAUUnregisterSurfaceNV GLEW_GET_FUN(__glewVDPAUUnregisterSurfaceNV) #define GLEW_NV_vdpau_interop GLEW_GET_VAR(__GLEW_NV_vdpau_interop) #endif /* GL_NV_vdpau_interop */ /* ------------------------ GL_NV_vertex_array_range ----------------------- */ #ifndef GL_NV_vertex_array_range #define GL_NV_vertex_array_range 1 #define GL_VERTEX_ARRAY_RANGE_NV 0x851D #define GL_VERTEX_ARRAY_RANGE_LENGTH_NV 0x851E #define GL_VERTEX_ARRAY_RANGE_VALID_NV 0x851F #define GL_MAX_VERTEX_ARRAY_RANGE_ELEMENT_NV 0x8520 #define GL_VERTEX_ARRAY_RANGE_POINTER_NV 0x8521 typedef void (GLAPIENTRY * PFNGLFLUSHVERTEXARRAYRANGENVPROC) (void); typedef void (GLAPIENTRY * PFNGLVERTEXARRAYRANGENVPROC) (GLsizei length, void* pointer); #define glFlushVertexArrayRangeNV GLEW_GET_FUN(__glewFlushVertexArrayRangeNV) #define glVertexArrayRangeNV GLEW_GET_FUN(__glewVertexArrayRangeNV) #define GLEW_NV_vertex_array_range GLEW_GET_VAR(__GLEW_NV_vertex_array_range) #endif /* GL_NV_vertex_array_range */ /* ----------------------- GL_NV_vertex_array_range2 ----------------------- */ #ifndef GL_NV_vertex_array_range2 #define GL_NV_vertex_array_range2 1 #define GL_VERTEX_ARRAY_RANGE_WITHOUT_FLUSH_NV 0x8533 #define GLEW_NV_vertex_array_range2 GLEW_GET_VAR(__GLEW_NV_vertex_array_range2) #endif /* GL_NV_vertex_array_range2 */ /* ------------------- GL_NV_vertex_attrib_integer_64bit ------------------- */ #ifndef GL_NV_vertex_attrib_integer_64bit #define GL_NV_vertex_attrib_integer_64bit 1 #define GL_INT64_NV 0x140E #define GL_UNSIGNED_INT64_NV 0x140F typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBLI64VNVPROC) (GLuint index, GLenum pname, GLint64EXT* params); typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBLUI64VNVPROC) (GLuint index, GLenum pname, GLuint64EXT* params); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL1I64NVPROC) (GLuint index, GLint64EXT x); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL1I64VNVPROC) (GLuint index, const GLint64EXT* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL1UI64NVPROC) (GLuint index, GLuint64EXT x); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL1UI64VNVPROC) (GLuint index, const GLuint64EXT* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL2I64NVPROC) (GLuint index, GLint64EXT x, GLint64EXT y); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL2I64VNVPROC) (GLuint index, const GLint64EXT* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL2UI64NVPROC) (GLuint index, GLuint64EXT x, GLuint64EXT y); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL2UI64VNVPROC) (GLuint index, const GLuint64EXT* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL3I64NVPROC) (GLuint index, GLint64EXT x, GLint64EXT y, GLint64EXT z); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL3I64VNVPROC) (GLuint index, const GLint64EXT* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL3UI64NVPROC) (GLuint index, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL3UI64VNVPROC) (GLuint index, const GLuint64EXT* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL4I64NVPROC) (GLuint index, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL4I64VNVPROC) (GLuint index, const GLint64EXT* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL4UI64NVPROC) (GLuint index, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL4UI64VNVPROC) (GLuint index, const GLuint64EXT* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBLFORMATNVPROC) (GLuint index, GLint size, GLenum type, GLsizei stride); #define glGetVertexAttribLi64vNV GLEW_GET_FUN(__glewGetVertexAttribLi64vNV) #define glGetVertexAttribLui64vNV GLEW_GET_FUN(__glewGetVertexAttribLui64vNV) #define glVertexAttribL1i64NV GLEW_GET_FUN(__glewVertexAttribL1i64NV) #define glVertexAttribL1i64vNV GLEW_GET_FUN(__glewVertexAttribL1i64vNV) #define glVertexAttribL1ui64NV GLEW_GET_FUN(__glewVertexAttribL1ui64NV) #define glVertexAttribL1ui64vNV GLEW_GET_FUN(__glewVertexAttribL1ui64vNV) #define glVertexAttribL2i64NV GLEW_GET_FUN(__glewVertexAttribL2i64NV) #define glVertexAttribL2i64vNV GLEW_GET_FUN(__glewVertexAttribL2i64vNV) #define glVertexAttribL2ui64NV GLEW_GET_FUN(__glewVertexAttribL2ui64NV) #define glVertexAttribL2ui64vNV GLEW_GET_FUN(__glewVertexAttribL2ui64vNV) #define glVertexAttribL3i64NV GLEW_GET_FUN(__glewVertexAttribL3i64NV) #define glVertexAttribL3i64vNV GLEW_GET_FUN(__glewVertexAttribL3i64vNV) #define glVertexAttribL3ui64NV GLEW_GET_FUN(__glewVertexAttribL3ui64NV) #define glVertexAttribL3ui64vNV GLEW_GET_FUN(__glewVertexAttribL3ui64vNV) #define glVertexAttribL4i64NV GLEW_GET_FUN(__glewVertexAttribL4i64NV) #define glVertexAttribL4i64vNV GLEW_GET_FUN(__glewVertexAttribL4i64vNV) #define glVertexAttribL4ui64NV GLEW_GET_FUN(__glewVertexAttribL4ui64NV) #define glVertexAttribL4ui64vNV GLEW_GET_FUN(__glewVertexAttribL4ui64vNV) #define glVertexAttribLFormatNV GLEW_GET_FUN(__glewVertexAttribLFormatNV) #define GLEW_NV_vertex_attrib_integer_64bit GLEW_GET_VAR(__GLEW_NV_vertex_attrib_integer_64bit) #endif /* GL_NV_vertex_attrib_integer_64bit */ /* ------------------- GL_NV_vertex_buffer_unified_memory ------------------ */ #ifndef GL_NV_vertex_buffer_unified_memory #define GL_NV_vertex_buffer_unified_memory 1 #define GL_VERTEX_ATTRIB_ARRAY_UNIFIED_NV 0x8F1E #define GL_ELEMENT_ARRAY_UNIFIED_NV 0x8F1F #define GL_VERTEX_ATTRIB_ARRAY_ADDRESS_NV 0x8F20 #define GL_VERTEX_ARRAY_ADDRESS_NV 0x8F21 #define GL_NORMAL_ARRAY_ADDRESS_NV 0x8F22 #define GL_COLOR_ARRAY_ADDRESS_NV 0x8F23 #define GL_INDEX_ARRAY_ADDRESS_NV 0x8F24 #define GL_TEXTURE_COORD_ARRAY_ADDRESS_NV 0x8F25 #define GL_EDGE_FLAG_ARRAY_ADDRESS_NV 0x8F26 #define GL_SECONDARY_COLOR_ARRAY_ADDRESS_NV 0x8F27 #define GL_FOG_COORD_ARRAY_ADDRESS_NV 0x8F28 #define GL_ELEMENT_ARRAY_ADDRESS_NV 0x8F29 #define GL_VERTEX_ATTRIB_ARRAY_LENGTH_NV 0x8F2A #define GL_VERTEX_ARRAY_LENGTH_NV 0x8F2B #define GL_NORMAL_ARRAY_LENGTH_NV 0x8F2C #define GL_COLOR_ARRAY_LENGTH_NV 0x8F2D #define GL_INDEX_ARRAY_LENGTH_NV 0x8F2E #define GL_TEXTURE_COORD_ARRAY_LENGTH_NV 0x8F2F #define GL_EDGE_FLAG_ARRAY_LENGTH_NV 0x8F30 #define GL_SECONDARY_COLOR_ARRAY_LENGTH_NV 0x8F31 #define GL_FOG_COORD_ARRAY_LENGTH_NV 0x8F32 #define GL_ELEMENT_ARRAY_LENGTH_NV 0x8F33 #define GL_DRAW_INDIRECT_UNIFIED_NV 0x8F40 #define GL_DRAW_INDIRECT_ADDRESS_NV 0x8F41 #define GL_DRAW_INDIRECT_LENGTH_NV 0x8F42 typedef void (GLAPIENTRY * PFNGLBUFFERADDRESSRANGENVPROC) (GLenum pname, GLuint index, GLuint64EXT address, GLsizeiptr length); typedef void (GLAPIENTRY * PFNGLCOLORFORMATNVPROC) (GLint size, GLenum type, GLsizei stride); typedef void (GLAPIENTRY * PFNGLEDGEFLAGFORMATNVPROC) (GLsizei stride); typedef void (GLAPIENTRY * PFNGLFOGCOORDFORMATNVPROC) (GLenum type, GLsizei stride); typedef void (GLAPIENTRY * PFNGLGETINTEGERUI64I_VNVPROC) (GLenum value, GLuint index, GLuint64EXT result[]); typedef void (GLAPIENTRY * PFNGLINDEXFORMATNVPROC) (GLenum type, GLsizei stride); typedef void (GLAPIENTRY * PFNGLNORMALFORMATNVPROC) (GLenum type, GLsizei stride); typedef void (GLAPIENTRY * PFNGLSECONDARYCOLORFORMATNVPROC) (GLint size, GLenum type, GLsizei stride); typedef void (GLAPIENTRY * PFNGLTEXCOORDFORMATNVPROC) (GLint size, GLenum type, GLsizei stride); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBFORMATNVPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBIFORMATNVPROC) (GLuint index, GLint size, GLenum type, GLsizei stride); typedef void (GLAPIENTRY * PFNGLVERTEXFORMATNVPROC) (GLint size, GLenum type, GLsizei stride); #define glBufferAddressRangeNV GLEW_GET_FUN(__glewBufferAddressRangeNV) #define glColorFormatNV GLEW_GET_FUN(__glewColorFormatNV) #define glEdgeFlagFormatNV GLEW_GET_FUN(__glewEdgeFlagFormatNV) #define glFogCoordFormatNV GLEW_GET_FUN(__glewFogCoordFormatNV) #define glGetIntegerui64i_vNV GLEW_GET_FUN(__glewGetIntegerui64i_vNV) #define glIndexFormatNV GLEW_GET_FUN(__glewIndexFormatNV) #define glNormalFormatNV GLEW_GET_FUN(__glewNormalFormatNV) #define glSecondaryColorFormatNV GLEW_GET_FUN(__glewSecondaryColorFormatNV) #define glTexCoordFormatNV GLEW_GET_FUN(__glewTexCoordFormatNV) #define glVertexAttribFormatNV GLEW_GET_FUN(__glewVertexAttribFormatNV) #define glVertexAttribIFormatNV GLEW_GET_FUN(__glewVertexAttribIFormatNV) #define glVertexFormatNV GLEW_GET_FUN(__glewVertexFormatNV) #define GLEW_NV_vertex_buffer_unified_memory GLEW_GET_VAR(__GLEW_NV_vertex_buffer_unified_memory) #endif /* GL_NV_vertex_buffer_unified_memory */ /* -------------------------- GL_NV_vertex_program ------------------------- */ #ifndef GL_NV_vertex_program #define GL_NV_vertex_program 1 #define GL_VERTEX_PROGRAM_NV 0x8620 #define GL_VERTEX_STATE_PROGRAM_NV 0x8621 #define GL_ATTRIB_ARRAY_SIZE_NV 0x8623 #define GL_ATTRIB_ARRAY_STRIDE_NV 0x8624 #define GL_ATTRIB_ARRAY_TYPE_NV 0x8625 #define GL_CURRENT_ATTRIB_NV 0x8626 #define GL_PROGRAM_LENGTH_NV 0x8627 #define GL_PROGRAM_STRING_NV 0x8628 #define GL_MODELVIEW_PROJECTION_NV 0x8629 #define GL_IDENTITY_NV 0x862A #define GL_INVERSE_NV 0x862B #define GL_TRANSPOSE_NV 0x862C #define GL_INVERSE_TRANSPOSE_NV 0x862D #define GL_MAX_TRACK_MATRIX_STACK_DEPTH_NV 0x862E #define GL_MAX_TRACK_MATRICES_NV 0x862F #define GL_MATRIX0_NV 0x8630 #define GL_MATRIX1_NV 0x8631 #define GL_MATRIX2_NV 0x8632 #define GL_MATRIX3_NV 0x8633 #define GL_MATRIX4_NV 0x8634 #define GL_MATRIX5_NV 0x8635 #define GL_MATRIX6_NV 0x8636 #define GL_MATRIX7_NV 0x8637 #define GL_CURRENT_MATRIX_STACK_DEPTH_NV 0x8640 #define GL_CURRENT_MATRIX_NV 0x8641 #define GL_VERTEX_PROGRAM_POINT_SIZE_NV 0x8642 #define GL_VERTEX_PROGRAM_TWO_SIDE_NV 0x8643 #define GL_PROGRAM_PARAMETER_NV 0x8644 #define GL_ATTRIB_ARRAY_POINTER_NV 0x8645 #define GL_PROGRAM_TARGET_NV 0x8646 #define GL_PROGRAM_RESIDENT_NV 0x8647 #define GL_TRACK_MATRIX_NV 0x8648 #define GL_TRACK_MATRIX_TRANSFORM_NV 0x8649 #define GL_VERTEX_PROGRAM_BINDING_NV 0x864A #define GL_PROGRAM_ERROR_POSITION_NV 0x864B #define GL_VERTEX_ATTRIB_ARRAY0_NV 0x8650 #define GL_VERTEX_ATTRIB_ARRAY1_NV 0x8651 #define GL_VERTEX_ATTRIB_ARRAY2_NV 0x8652 #define GL_VERTEX_ATTRIB_ARRAY3_NV 0x8653 #define GL_VERTEX_ATTRIB_ARRAY4_NV 0x8654 #define GL_VERTEX_ATTRIB_ARRAY5_NV 0x8655 #define GL_VERTEX_ATTRIB_ARRAY6_NV 0x8656 #define GL_VERTEX_ATTRIB_ARRAY7_NV 0x8657 #define GL_VERTEX_ATTRIB_ARRAY8_NV 0x8658 #define GL_VERTEX_ATTRIB_ARRAY9_NV 0x8659 #define GL_VERTEX_ATTRIB_ARRAY10_NV 0x865A #define GL_VERTEX_ATTRIB_ARRAY11_NV 0x865B #define GL_VERTEX_ATTRIB_ARRAY12_NV 0x865C #define GL_VERTEX_ATTRIB_ARRAY13_NV 0x865D #define GL_VERTEX_ATTRIB_ARRAY14_NV 0x865E #define GL_VERTEX_ATTRIB_ARRAY15_NV 0x865F #define GL_MAP1_VERTEX_ATTRIB0_4_NV 0x8660 #define GL_MAP1_VERTEX_ATTRIB1_4_NV 0x8661 #define GL_MAP1_VERTEX_ATTRIB2_4_NV 0x8662 #define GL_MAP1_VERTEX_ATTRIB3_4_NV 0x8663 #define GL_MAP1_VERTEX_ATTRIB4_4_NV 0x8664 #define GL_MAP1_VERTEX_ATTRIB5_4_NV 0x8665 #define GL_MAP1_VERTEX_ATTRIB6_4_NV 0x8666 #define GL_MAP1_VERTEX_ATTRIB7_4_NV 0x8667 #define GL_MAP1_VERTEX_ATTRIB8_4_NV 0x8668 #define GL_MAP1_VERTEX_ATTRIB9_4_NV 0x8669 #define GL_MAP1_VERTEX_ATTRIB10_4_NV 0x866A #define GL_MAP1_VERTEX_ATTRIB11_4_NV 0x866B #define GL_MAP1_VERTEX_ATTRIB12_4_NV 0x866C #define GL_MAP1_VERTEX_ATTRIB13_4_NV 0x866D #define GL_MAP1_VERTEX_ATTRIB14_4_NV 0x866E #define GL_MAP1_VERTEX_ATTRIB15_4_NV 0x866F #define GL_MAP2_VERTEX_ATTRIB0_4_NV 0x8670 #define GL_MAP2_VERTEX_ATTRIB1_4_NV 0x8671 #define GL_MAP2_VERTEX_ATTRIB2_4_NV 0x8672 #define GL_MAP2_VERTEX_ATTRIB3_4_NV 0x8673 #define GL_MAP2_VERTEX_ATTRIB4_4_NV 0x8674 #define GL_MAP2_VERTEX_ATTRIB5_4_NV 0x8675 #define GL_MAP2_VERTEX_ATTRIB6_4_NV 0x8676 #define GL_MAP2_VERTEX_ATTRIB7_4_NV 0x8677 #define GL_MAP2_VERTEX_ATTRIB8_4_NV 0x8678 #define GL_MAP2_VERTEX_ATTRIB9_4_NV 0x8679 #define GL_MAP2_VERTEX_ATTRIB10_4_NV 0x867A #define GL_MAP2_VERTEX_ATTRIB11_4_NV 0x867B #define GL_MAP2_VERTEX_ATTRIB12_4_NV 0x867C #define GL_MAP2_VERTEX_ATTRIB13_4_NV 0x867D #define GL_MAP2_VERTEX_ATTRIB14_4_NV 0x867E #define GL_MAP2_VERTEX_ATTRIB15_4_NV 0x867F typedef GLboolean (GLAPIENTRY * PFNGLAREPROGRAMSRESIDENTNVPROC) (GLsizei n, const GLuint* ids, GLboolean *residences); typedef void (GLAPIENTRY * PFNGLBINDPROGRAMNVPROC) (GLenum target, GLuint id); typedef void (GLAPIENTRY * PFNGLDELETEPROGRAMSNVPROC) (GLsizei n, const GLuint* ids); typedef void (GLAPIENTRY * PFNGLEXECUTEPROGRAMNVPROC) (GLenum target, GLuint id, const GLfloat* params); typedef void (GLAPIENTRY * PFNGLGENPROGRAMSNVPROC) (GLsizei n, GLuint* ids); typedef void (GLAPIENTRY * PFNGLGETPROGRAMPARAMETERDVNVPROC) (GLenum target, GLuint index, GLenum pname, GLdouble* params); typedef void (GLAPIENTRY * PFNGLGETPROGRAMPARAMETERFVNVPROC) (GLenum target, GLuint index, GLenum pname, GLfloat* params); typedef void (GLAPIENTRY * PFNGLGETPROGRAMSTRINGNVPROC) (GLuint id, GLenum pname, GLubyte* program); typedef void (GLAPIENTRY * PFNGLGETPROGRAMIVNVPROC) (GLuint id, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLGETTRACKMATRIXIVNVPROC) (GLenum target, GLuint address, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBPOINTERVNVPROC) (GLuint index, GLenum pname, GLvoid** pointer); typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBDVNVPROC) (GLuint index, GLenum pname, GLdouble* params); typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBFVNVPROC) (GLuint index, GLenum pname, GLfloat* params); typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBIVNVPROC) (GLuint index, GLenum pname, GLint* params); typedef GLboolean (GLAPIENTRY * PFNGLISPROGRAMNVPROC) (GLuint id); typedef void (GLAPIENTRY * PFNGLLOADPROGRAMNVPROC) (GLenum target, GLuint id, GLsizei len, const GLubyte* program); typedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETER4DNVPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); typedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETER4DVNVPROC) (GLenum target, GLuint index, const GLdouble* params); typedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETER4FNVPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); typedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETER4FVNVPROC) (GLenum target, GLuint index, const GLfloat* params); typedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETERS4DVNVPROC) (GLenum target, GLuint index, GLsizei num, const GLdouble* params); typedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETERS4FVNVPROC) (GLenum target, GLuint index, GLsizei num, const GLfloat* params); typedef void (GLAPIENTRY * PFNGLREQUESTRESIDENTPROGRAMSNVPROC) (GLsizei n, GLuint* ids); typedef void (GLAPIENTRY * PFNGLTRACKMATRIXNVPROC) (GLenum target, GLuint address, GLenum matrix, GLenum transform); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1DNVPROC) (GLuint index, GLdouble x); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1DVNVPROC) (GLuint index, const GLdouble* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1FNVPROC) (GLuint index, GLfloat x); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1FVNVPROC) (GLuint index, const GLfloat* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1SNVPROC) (GLuint index, GLshort x); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1SVNVPROC) (GLuint index, const GLshort* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2DNVPROC) (GLuint index, GLdouble x, GLdouble y); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2DVNVPROC) (GLuint index, const GLdouble* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2FNVPROC) (GLuint index, GLfloat x, GLfloat y); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2FVNVPROC) (GLuint index, const GLfloat* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2SNVPROC) (GLuint index, GLshort x, GLshort y); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2SVNVPROC) (GLuint index, const GLshort* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3DNVPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3DVNVPROC) (GLuint index, const GLdouble* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3FNVPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3FVNVPROC) (GLuint index, const GLfloat* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3SNVPROC) (GLuint index, GLshort x, GLshort y, GLshort z); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3SVNVPROC) (GLuint index, const GLshort* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4DNVPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4DVNVPROC) (GLuint index, const GLdouble* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4FNVPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4FVNVPROC) (GLuint index, const GLfloat* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4SNVPROC) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4SVNVPROC) (GLuint index, const GLshort* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4UBNVPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4UBVNVPROC) (GLuint index, const GLubyte* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBPOINTERNVPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const void* pointer); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS1DVNVPROC) (GLuint index, GLsizei n, const GLdouble* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS1FVNVPROC) (GLuint index, GLsizei n, const GLfloat* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS1SVNVPROC) (GLuint index, GLsizei n, const GLshort* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS2DVNVPROC) (GLuint index, GLsizei n, const GLdouble* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS2FVNVPROC) (GLuint index, GLsizei n, const GLfloat* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS2SVNVPROC) (GLuint index, GLsizei n, const GLshort* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS3DVNVPROC) (GLuint index, GLsizei n, const GLdouble* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS3FVNVPROC) (GLuint index, GLsizei n, const GLfloat* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS3SVNVPROC) (GLuint index, GLsizei n, const GLshort* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS4DVNVPROC) (GLuint index, GLsizei n, const GLdouble* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS4FVNVPROC) (GLuint index, GLsizei n, const GLfloat* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS4SVNVPROC) (GLuint index, GLsizei n, const GLshort* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS4UBVNVPROC) (GLuint index, GLsizei n, const GLubyte* v); #define glAreProgramsResidentNV GLEW_GET_FUN(__glewAreProgramsResidentNV) #define glBindProgramNV GLEW_GET_FUN(__glewBindProgramNV) #define glDeleteProgramsNV GLEW_GET_FUN(__glewDeleteProgramsNV) #define glExecuteProgramNV GLEW_GET_FUN(__glewExecuteProgramNV) #define glGenProgramsNV GLEW_GET_FUN(__glewGenProgramsNV) #define glGetProgramParameterdvNV GLEW_GET_FUN(__glewGetProgramParameterdvNV) #define glGetProgramParameterfvNV GLEW_GET_FUN(__glewGetProgramParameterfvNV) #define glGetProgramStringNV GLEW_GET_FUN(__glewGetProgramStringNV) #define glGetProgramivNV GLEW_GET_FUN(__glewGetProgramivNV) #define glGetTrackMatrixivNV GLEW_GET_FUN(__glewGetTrackMatrixivNV) #define glGetVertexAttribPointervNV GLEW_GET_FUN(__glewGetVertexAttribPointervNV) #define glGetVertexAttribdvNV GLEW_GET_FUN(__glewGetVertexAttribdvNV) #define glGetVertexAttribfvNV GLEW_GET_FUN(__glewGetVertexAttribfvNV) #define glGetVertexAttribivNV GLEW_GET_FUN(__glewGetVertexAttribivNV) #define glIsProgramNV GLEW_GET_FUN(__glewIsProgramNV) #define glLoadProgramNV GLEW_GET_FUN(__glewLoadProgramNV) #define glProgramParameter4dNV GLEW_GET_FUN(__glewProgramParameter4dNV) #define glProgramParameter4dvNV GLEW_GET_FUN(__glewProgramParameter4dvNV) #define glProgramParameter4fNV GLEW_GET_FUN(__glewProgramParameter4fNV) #define glProgramParameter4fvNV GLEW_GET_FUN(__glewProgramParameter4fvNV) #define glProgramParameters4dvNV GLEW_GET_FUN(__glewProgramParameters4dvNV) #define glProgramParameters4fvNV GLEW_GET_FUN(__glewProgramParameters4fvNV) #define glRequestResidentProgramsNV GLEW_GET_FUN(__glewRequestResidentProgramsNV) #define glTrackMatrixNV GLEW_GET_FUN(__glewTrackMatrixNV) #define glVertexAttrib1dNV GLEW_GET_FUN(__glewVertexAttrib1dNV) #define glVertexAttrib1dvNV GLEW_GET_FUN(__glewVertexAttrib1dvNV) #define glVertexAttrib1fNV GLEW_GET_FUN(__glewVertexAttrib1fNV) #define glVertexAttrib1fvNV GLEW_GET_FUN(__glewVertexAttrib1fvNV) #define glVertexAttrib1sNV GLEW_GET_FUN(__glewVertexAttrib1sNV) #define glVertexAttrib1svNV GLEW_GET_FUN(__glewVertexAttrib1svNV) #define glVertexAttrib2dNV GLEW_GET_FUN(__glewVertexAttrib2dNV) #define glVertexAttrib2dvNV GLEW_GET_FUN(__glewVertexAttrib2dvNV) #define glVertexAttrib2fNV GLEW_GET_FUN(__glewVertexAttrib2fNV) #define glVertexAttrib2fvNV GLEW_GET_FUN(__glewVertexAttrib2fvNV) #define glVertexAttrib2sNV GLEW_GET_FUN(__glewVertexAttrib2sNV) #define glVertexAttrib2svNV GLEW_GET_FUN(__glewVertexAttrib2svNV) #define glVertexAttrib3dNV GLEW_GET_FUN(__glewVertexAttrib3dNV) #define glVertexAttrib3dvNV GLEW_GET_FUN(__glewVertexAttrib3dvNV) #define glVertexAttrib3fNV GLEW_GET_FUN(__glewVertexAttrib3fNV) #define glVertexAttrib3fvNV GLEW_GET_FUN(__glewVertexAttrib3fvNV) #define glVertexAttrib3sNV GLEW_GET_FUN(__glewVertexAttrib3sNV) #define glVertexAttrib3svNV GLEW_GET_FUN(__glewVertexAttrib3svNV) #define glVertexAttrib4dNV GLEW_GET_FUN(__glewVertexAttrib4dNV) #define glVertexAttrib4dvNV GLEW_GET_FUN(__glewVertexAttrib4dvNV) #define glVertexAttrib4fNV GLEW_GET_FUN(__glewVertexAttrib4fNV) #define glVertexAttrib4fvNV GLEW_GET_FUN(__glewVertexAttrib4fvNV) #define glVertexAttrib4sNV GLEW_GET_FUN(__glewVertexAttrib4sNV) #define glVertexAttrib4svNV GLEW_GET_FUN(__glewVertexAttrib4svNV) #define glVertexAttrib4ubNV GLEW_GET_FUN(__glewVertexAttrib4ubNV) #define glVertexAttrib4ubvNV GLEW_GET_FUN(__glewVertexAttrib4ubvNV) #define glVertexAttribPointerNV GLEW_GET_FUN(__glewVertexAttribPointerNV) #define glVertexAttribs1dvNV GLEW_GET_FUN(__glewVertexAttribs1dvNV) #define glVertexAttribs1fvNV GLEW_GET_FUN(__glewVertexAttribs1fvNV) #define glVertexAttribs1svNV GLEW_GET_FUN(__glewVertexAttribs1svNV) #define glVertexAttribs2dvNV GLEW_GET_FUN(__glewVertexAttribs2dvNV) #define glVertexAttribs2fvNV GLEW_GET_FUN(__glewVertexAttribs2fvNV) #define glVertexAttribs2svNV GLEW_GET_FUN(__glewVertexAttribs2svNV) #define glVertexAttribs3dvNV GLEW_GET_FUN(__glewVertexAttribs3dvNV) #define glVertexAttribs3fvNV GLEW_GET_FUN(__glewVertexAttribs3fvNV) #define glVertexAttribs3svNV GLEW_GET_FUN(__glewVertexAttribs3svNV) #define glVertexAttribs4dvNV GLEW_GET_FUN(__glewVertexAttribs4dvNV) #define glVertexAttribs4fvNV GLEW_GET_FUN(__glewVertexAttribs4fvNV) #define glVertexAttribs4svNV GLEW_GET_FUN(__glewVertexAttribs4svNV) #define glVertexAttribs4ubvNV GLEW_GET_FUN(__glewVertexAttribs4ubvNV) #define GLEW_NV_vertex_program GLEW_GET_VAR(__GLEW_NV_vertex_program) #endif /* GL_NV_vertex_program */ /* ------------------------ GL_NV_vertex_program1_1 ------------------------ */ #ifndef GL_NV_vertex_program1_1 #define GL_NV_vertex_program1_1 1 #define GLEW_NV_vertex_program1_1 GLEW_GET_VAR(__GLEW_NV_vertex_program1_1) #endif /* GL_NV_vertex_program1_1 */ /* ------------------------- GL_NV_vertex_program2 ------------------------- */ #ifndef GL_NV_vertex_program2 #define GL_NV_vertex_program2 1 #define GLEW_NV_vertex_program2 GLEW_GET_VAR(__GLEW_NV_vertex_program2) #endif /* GL_NV_vertex_program2 */ /* ---------------------- GL_NV_vertex_program2_option --------------------- */ #ifndef GL_NV_vertex_program2_option #define GL_NV_vertex_program2_option 1 #define GL_MAX_PROGRAM_EXEC_INSTRUCTIONS_NV 0x88F4 #define GL_MAX_PROGRAM_CALL_DEPTH_NV 0x88F5 #define GLEW_NV_vertex_program2_option GLEW_GET_VAR(__GLEW_NV_vertex_program2_option) #endif /* GL_NV_vertex_program2_option */ /* ------------------------- GL_NV_vertex_program3 ------------------------- */ #ifndef GL_NV_vertex_program3 #define GL_NV_vertex_program3 1 #define MAX_VERTEX_TEXTURE_IMAGE_UNITS_ARB 0x8B4C #define GLEW_NV_vertex_program3 GLEW_GET_VAR(__GLEW_NV_vertex_program3) #endif /* GL_NV_vertex_program3 */ /* ------------------------- GL_NV_vertex_program4 ------------------------- */ #ifndef GL_NV_vertex_program4 #define GL_NV_vertex_program4 1 #define GL_VERTEX_ATTRIB_ARRAY_INTEGER_NV 0x88FD #define GLEW_NV_vertex_program4 GLEW_GET_VAR(__GLEW_NV_vertex_program4) #endif /* GL_NV_vertex_program4 */ /* -------------------------- GL_NV_video_capture -------------------------- */ #ifndef GL_NV_video_capture #define GL_NV_video_capture 1 #define GL_VIDEO_BUFFER_NV 0x9020 #define GL_VIDEO_BUFFER_BINDING_NV 0x9021 #define GL_FIELD_UPPER_NV 0x9022 #define GL_FIELD_LOWER_NV 0x9023 #define GL_NUM_VIDEO_CAPTURE_STREAMS_NV 0x9024 #define GL_NEXT_VIDEO_CAPTURE_BUFFER_STATUS_NV 0x9025 #define GL_VIDEO_CAPTURE_TO_422_SUPPORTED_NV 0x9026 #define GL_LAST_VIDEO_CAPTURE_STATUS_NV 0x9027 #define GL_VIDEO_BUFFER_PITCH_NV 0x9028 #define GL_VIDEO_COLOR_CONVERSION_MATRIX_NV 0x9029 #define GL_VIDEO_COLOR_CONVERSION_MAX_NV 0x902A #define GL_VIDEO_COLOR_CONVERSION_MIN_NV 0x902B #define GL_VIDEO_COLOR_CONVERSION_OFFSET_NV 0x902C #define GL_VIDEO_BUFFER_INTERNAL_FORMAT_NV 0x902D #define GL_PARTIAL_SUCCESS_NV 0x902E #define GL_SUCCESS_NV 0x902F #define GL_FAILURE_NV 0x9030 #define GL_YCBYCR8_422_NV 0x9031 #define GL_YCBAYCR8A_4224_NV 0x9032 #define GL_Z6Y10Z6CB10Z6Y10Z6CR10_422_NV 0x9033 #define GL_Z6Y10Z6CB10Z6A10Z6Y10Z6CR10Z6A10_4224_NV 0x9034 #define GL_Z4Y12Z4CB12Z4Y12Z4CR12_422_NV 0x9035 #define GL_Z4Y12Z4CB12Z4A12Z4Y12Z4CR12Z4A12_4224_NV 0x9036 #define GL_Z4Y12Z4CB12Z4CR12_444_NV 0x9037 #define GL_VIDEO_CAPTURE_FRAME_WIDTH_NV 0x9038 #define GL_VIDEO_CAPTURE_FRAME_HEIGHT_NV 0x9039 #define GL_VIDEO_CAPTURE_FIELD_UPPER_HEIGHT_NV 0x903A #define GL_VIDEO_CAPTURE_FIELD_LOWER_HEIGHT_NV 0x903B #define GL_VIDEO_CAPTURE_SURFACE_ORIGIN_NV 0x903C typedef void (GLAPIENTRY * PFNGLBEGINVIDEOCAPTURENVPROC) (GLuint video_capture_slot); typedef void (GLAPIENTRY * PFNGLBINDVIDEOCAPTURESTREAMBUFFERNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum frame_region, GLintptrARB offset); typedef void (GLAPIENTRY * PFNGLBINDVIDEOCAPTURESTREAMTEXTURENVPROC) (GLuint video_capture_slot, GLuint stream, GLenum frame_region, GLenum target, GLuint texture); typedef void (GLAPIENTRY * PFNGLENDVIDEOCAPTURENVPROC) (GLuint video_capture_slot); typedef void (GLAPIENTRY * PFNGLGETVIDEOCAPTURESTREAMDVNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, GLdouble* params); typedef void (GLAPIENTRY * PFNGLGETVIDEOCAPTURESTREAMFVNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, GLfloat* params); typedef void (GLAPIENTRY * PFNGLGETVIDEOCAPTURESTREAMIVNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLGETVIDEOCAPTUREIVNVPROC) (GLuint video_capture_slot, GLenum pname, GLint* params); typedef GLenum (GLAPIENTRY * PFNGLVIDEOCAPTURENVPROC) (GLuint video_capture_slot, GLuint* sequence_num, GLuint64EXT *capture_time); typedef void (GLAPIENTRY * PFNGLVIDEOCAPTURESTREAMPARAMETERDVNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, const GLdouble* params); typedef void (GLAPIENTRY * PFNGLVIDEOCAPTURESTREAMPARAMETERFVNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, const GLfloat* params); typedef void (GLAPIENTRY * PFNGLVIDEOCAPTURESTREAMPARAMETERIVNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, const GLint* params); #define glBeginVideoCaptureNV GLEW_GET_FUN(__glewBeginVideoCaptureNV) #define glBindVideoCaptureStreamBufferNV GLEW_GET_FUN(__glewBindVideoCaptureStreamBufferNV) #define glBindVideoCaptureStreamTextureNV GLEW_GET_FUN(__glewBindVideoCaptureStreamTextureNV) #define glEndVideoCaptureNV GLEW_GET_FUN(__glewEndVideoCaptureNV) #define glGetVideoCaptureStreamdvNV GLEW_GET_FUN(__glewGetVideoCaptureStreamdvNV) #define glGetVideoCaptureStreamfvNV GLEW_GET_FUN(__glewGetVideoCaptureStreamfvNV) #define glGetVideoCaptureStreamivNV GLEW_GET_FUN(__glewGetVideoCaptureStreamivNV) #define glGetVideoCaptureivNV GLEW_GET_FUN(__glewGetVideoCaptureivNV) #define glVideoCaptureNV GLEW_GET_FUN(__glewVideoCaptureNV) #define glVideoCaptureStreamParameterdvNV GLEW_GET_FUN(__glewVideoCaptureStreamParameterdvNV) #define glVideoCaptureStreamParameterfvNV GLEW_GET_FUN(__glewVideoCaptureStreamParameterfvNV) #define glVideoCaptureStreamParameterivNV GLEW_GET_FUN(__glewVideoCaptureStreamParameterivNV) #define GLEW_NV_video_capture GLEW_GET_VAR(__GLEW_NV_video_capture) #endif /* GL_NV_video_capture */ /* ------------------------ GL_OES_byte_coordinates ------------------------ */ #ifndef GL_OES_byte_coordinates #define GL_OES_byte_coordinates 1 #define GL_BYTE 0x1400 #define GLEW_OES_byte_coordinates GLEW_GET_VAR(__GLEW_OES_byte_coordinates) #endif /* GL_OES_byte_coordinates */ /* ------------------- GL_OES_compressed_paletted_texture ------------------ */ #ifndef GL_OES_compressed_paletted_texture #define GL_OES_compressed_paletted_texture 1 #define GL_PALETTE4_RGB8_OES 0x8B90 #define GL_PALETTE4_RGBA8_OES 0x8B91 #define GL_PALETTE4_R5_G6_B5_OES 0x8B92 #define GL_PALETTE4_RGBA4_OES 0x8B93 #define GL_PALETTE4_RGB5_A1_OES 0x8B94 #define GL_PALETTE8_RGB8_OES 0x8B95 #define GL_PALETTE8_RGBA8_OES 0x8B96 #define GL_PALETTE8_R5_G6_B5_OES 0x8B97 #define GL_PALETTE8_RGBA4_OES 0x8B98 #define GL_PALETTE8_RGB5_A1_OES 0x8B99 #define GLEW_OES_compressed_paletted_texture GLEW_GET_VAR(__GLEW_OES_compressed_paletted_texture) #endif /* GL_OES_compressed_paletted_texture */ /* --------------------------- GL_OES_read_format -------------------------- */ #ifndef GL_OES_read_format #define GL_OES_read_format 1 #define GL_IMPLEMENTATION_COLOR_READ_TYPE_OES 0x8B9A #define GL_IMPLEMENTATION_COLOR_READ_FORMAT_OES 0x8B9B #define GLEW_OES_read_format GLEW_GET_VAR(__GLEW_OES_read_format) #endif /* GL_OES_read_format */ /* ------------------------ GL_OES_single_precision ------------------------ */ #ifndef GL_OES_single_precision #define GL_OES_single_precision 1 typedef void (GLAPIENTRY * PFNGLCLEARDEPTHFOESPROC) (GLclampd depth); typedef void (GLAPIENTRY * PFNGLCLIPPLANEFOESPROC) (GLenum plane, const GLfloat* equation); typedef void (GLAPIENTRY * PFNGLDEPTHRANGEFOESPROC) (GLclampf n, GLclampf f); typedef void (GLAPIENTRY * PFNGLFRUSTUMFOESPROC) (GLfloat l, GLfloat r, GLfloat b, GLfloat t, GLfloat n, GLfloat f); typedef void (GLAPIENTRY * PFNGLGETCLIPPLANEFOESPROC) (GLenum plane, GLfloat* equation); typedef void (GLAPIENTRY * PFNGLORTHOFOESPROC) (GLfloat l, GLfloat r, GLfloat b, GLfloat t, GLfloat n, GLfloat f); #define glClearDepthfOES GLEW_GET_FUN(__glewClearDepthfOES) #define glClipPlanefOES GLEW_GET_FUN(__glewClipPlanefOES) #define glDepthRangefOES GLEW_GET_FUN(__glewDepthRangefOES) #define glFrustumfOES GLEW_GET_FUN(__glewFrustumfOES) #define glGetClipPlanefOES GLEW_GET_FUN(__glewGetClipPlanefOES) #define glOrthofOES GLEW_GET_FUN(__glewOrthofOES) #define GLEW_OES_single_precision GLEW_GET_VAR(__GLEW_OES_single_precision) #endif /* GL_OES_single_precision */ /* ---------------------------- GL_OML_interlace --------------------------- */ #ifndef GL_OML_interlace #define GL_OML_interlace 1 #define GL_INTERLACE_OML 0x8980 #define GL_INTERLACE_READ_OML 0x8981 #define GLEW_OML_interlace GLEW_GET_VAR(__GLEW_OML_interlace) #endif /* GL_OML_interlace */ /* ---------------------------- GL_OML_resample ---------------------------- */ #ifndef GL_OML_resample #define GL_OML_resample 1 #define GL_PACK_RESAMPLE_OML 0x8984 #define GL_UNPACK_RESAMPLE_OML 0x8985 #define GL_RESAMPLE_REPLICATE_OML 0x8986 #define GL_RESAMPLE_ZERO_FILL_OML 0x8987 #define GL_RESAMPLE_AVERAGE_OML 0x8988 #define GL_RESAMPLE_DECIMATE_OML 0x8989 #define GLEW_OML_resample GLEW_GET_VAR(__GLEW_OML_resample) #endif /* GL_OML_resample */ /* ---------------------------- GL_OML_subsample --------------------------- */ #ifndef GL_OML_subsample #define GL_OML_subsample 1 #define GL_FORMAT_SUBSAMPLE_24_24_OML 0x8982 #define GL_FORMAT_SUBSAMPLE_244_244_OML 0x8983 #define GLEW_OML_subsample GLEW_GET_VAR(__GLEW_OML_subsample) #endif /* GL_OML_subsample */ /* --------------------------- GL_PGI_misc_hints --------------------------- */ #ifndef GL_PGI_misc_hints #define GL_PGI_misc_hints 1 #define GL_PREFER_DOUBLEBUFFER_HINT_PGI 107000 #define GL_CONSERVE_MEMORY_HINT_PGI 107005 #define GL_RECLAIM_MEMORY_HINT_PGI 107006 #define GL_NATIVE_GRAPHICS_HANDLE_PGI 107010 #define GL_NATIVE_GRAPHICS_BEGIN_HINT_PGI 107011 #define GL_NATIVE_GRAPHICS_END_HINT_PGI 107012 #define GL_ALWAYS_FAST_HINT_PGI 107020 #define GL_ALWAYS_SOFT_HINT_PGI 107021 #define GL_ALLOW_DRAW_OBJ_HINT_PGI 107022 #define GL_ALLOW_DRAW_WIN_HINT_PGI 107023 #define GL_ALLOW_DRAW_FRG_HINT_PGI 107024 #define GL_ALLOW_DRAW_MEM_HINT_PGI 107025 #define GL_STRICT_DEPTHFUNC_HINT_PGI 107030 #define GL_STRICT_LIGHTING_HINT_PGI 107031 #define GL_STRICT_SCISSOR_HINT_PGI 107032 #define GL_FULL_STIPPLE_HINT_PGI 107033 #define GL_CLIP_NEAR_HINT_PGI 107040 #define GL_CLIP_FAR_HINT_PGI 107041 #define GL_WIDE_LINE_HINT_PGI 107042 #define GL_BACK_NORMALS_HINT_PGI 107043 #define GLEW_PGI_misc_hints GLEW_GET_VAR(__GLEW_PGI_misc_hints) #endif /* GL_PGI_misc_hints */ /* -------------------------- GL_PGI_vertex_hints -------------------------- */ #ifndef GL_PGI_vertex_hints #define GL_PGI_vertex_hints 1 #define GL_VERTEX23_BIT_PGI 0x00000004 #define GL_VERTEX4_BIT_PGI 0x00000008 #define GL_COLOR3_BIT_PGI 0x00010000 #define GL_COLOR4_BIT_PGI 0x00020000 #define GL_EDGEFLAG_BIT_PGI 0x00040000 #define GL_INDEX_BIT_PGI 0x00080000 #define GL_MAT_AMBIENT_BIT_PGI 0x00100000 #define GL_VERTEX_DATA_HINT_PGI 107050 #define GL_VERTEX_CONSISTENT_HINT_PGI 107051 #define GL_MATERIAL_SIDE_HINT_PGI 107052 #define GL_MAX_VERTEX_HINT_PGI 107053 #define GL_MAT_AMBIENT_AND_DIFFUSE_BIT_PGI 0x00200000 #define GL_MAT_DIFFUSE_BIT_PGI 0x00400000 #define GL_MAT_EMISSION_BIT_PGI 0x00800000 #define GL_MAT_COLOR_INDEXES_BIT_PGI 0x01000000 #define GL_MAT_SHININESS_BIT_PGI 0x02000000 #define GL_MAT_SPECULAR_BIT_PGI 0x04000000 #define GL_NORMAL_BIT_PGI 0x08000000 #define GL_TEXCOORD1_BIT_PGI 0x10000000 #define GL_TEXCOORD2_BIT_PGI 0x20000000 #define GL_TEXCOORD3_BIT_PGI 0x40000000 #define GL_TEXCOORD4_BIT_PGI 0x80000000 #define GLEW_PGI_vertex_hints GLEW_GET_VAR(__GLEW_PGI_vertex_hints) #endif /* GL_PGI_vertex_hints */ /* ------------------------- GL_REGAL_error_string ------------------------- */ #ifndef GL_REGAL_error_string #define GL_REGAL_error_string 1 typedef const GLchar* (GLAPIENTRY * PFNGLERRORSTRINGREGALPROC) (GLenum error); #define glErrorStringREGAL GLEW_GET_FUN(__glewErrorStringREGAL) #define GLEW_REGAL_error_string GLEW_GET_VAR(__GLEW_REGAL_error_string) #endif /* GL_REGAL_error_string */ /* ------------------------ GL_REGAL_extension_query ----------------------- */ #ifndef GL_REGAL_extension_query #define GL_REGAL_extension_query 1 typedef GLboolean (GLAPIENTRY * PFNGLGETEXTENSIONREGALPROC) (const GLchar* ext); typedef GLboolean (GLAPIENTRY * PFNGLISSUPPORTEDREGALPROC) (const GLchar* ext); #define glGetExtensionREGAL GLEW_GET_FUN(__glewGetExtensionREGAL) #define glIsSupportedREGAL GLEW_GET_FUN(__glewIsSupportedREGAL) #define GLEW_REGAL_extension_query GLEW_GET_VAR(__GLEW_REGAL_extension_query) #endif /* GL_REGAL_extension_query */ /* ------------------------------ GL_REGAL_log ----------------------------- */ #ifndef GL_REGAL_log #define GL_REGAL_log 1 #define GL_LOG_ERROR_REGAL 0x9319 #define GL_LOG_WARNING_REGAL 0x931A #define GL_LOG_INFO_REGAL 0x931B #define GL_LOG_APP_REGAL 0x931C #define GL_LOG_DRIVER_REGAL 0x931D #define GL_LOG_INTERNAL_REGAL 0x931E #define GL_LOG_DEBUG_REGAL 0x931F #define GL_LOG_STATUS_REGAL 0x9320 #define GL_LOG_HTTP_REGAL 0x9321 #define GLEW_REGAL_log GLEW_GET_VAR(__GLEW_REGAL_log) #endif /* GL_REGAL_log */ /* ----------------------- GL_REND_screen_coordinates ---------------------- */ #ifndef GL_REND_screen_coordinates #define GL_REND_screen_coordinates 1 #define GL_SCREEN_COORDINATES_REND 0x8490 #define GL_INVERTED_SCREEN_W_REND 0x8491 #define GLEW_REND_screen_coordinates GLEW_GET_VAR(__GLEW_REND_screen_coordinates) #endif /* GL_REND_screen_coordinates */ /* ------------------------------- GL_S3_s3tc ------------------------------ */ #ifndef GL_S3_s3tc #define GL_S3_s3tc 1 #define GL_RGB_S3TC 0x83A0 #define GL_RGB4_S3TC 0x83A1 #define GL_RGBA_S3TC 0x83A2 #define GL_RGBA4_S3TC 0x83A3 #define GL_RGBA_DXT5_S3TC 0x83A4 #define GL_RGBA4_DXT5_S3TC 0x83A5 #define GLEW_S3_s3tc GLEW_GET_VAR(__GLEW_S3_s3tc) #endif /* GL_S3_s3tc */ /* -------------------------- GL_SGIS_color_range -------------------------- */ #ifndef GL_SGIS_color_range #define GL_SGIS_color_range 1 #define GL_EXTENDED_RANGE_SGIS 0x85A5 #define GL_MIN_RED_SGIS 0x85A6 #define GL_MAX_RED_SGIS 0x85A7 #define GL_MIN_GREEN_SGIS 0x85A8 #define GL_MAX_GREEN_SGIS 0x85A9 #define GL_MIN_BLUE_SGIS 0x85AA #define GL_MAX_BLUE_SGIS 0x85AB #define GL_MIN_ALPHA_SGIS 0x85AC #define GL_MAX_ALPHA_SGIS 0x85AD #define GLEW_SGIS_color_range GLEW_GET_VAR(__GLEW_SGIS_color_range) #endif /* GL_SGIS_color_range */ /* ------------------------- GL_SGIS_detail_texture ------------------------ */ #ifndef GL_SGIS_detail_texture #define GL_SGIS_detail_texture 1 typedef void (GLAPIENTRY * PFNGLDETAILTEXFUNCSGISPROC) (GLenum target, GLsizei n, const GLfloat* points); typedef void (GLAPIENTRY * PFNGLGETDETAILTEXFUNCSGISPROC) (GLenum target, GLfloat* points); #define glDetailTexFuncSGIS GLEW_GET_FUN(__glewDetailTexFuncSGIS) #define glGetDetailTexFuncSGIS GLEW_GET_FUN(__glewGetDetailTexFuncSGIS) #define GLEW_SGIS_detail_texture GLEW_GET_VAR(__GLEW_SGIS_detail_texture) #endif /* GL_SGIS_detail_texture */ /* -------------------------- GL_SGIS_fog_function ------------------------- */ #ifndef GL_SGIS_fog_function #define GL_SGIS_fog_function 1 typedef void (GLAPIENTRY * PFNGLFOGFUNCSGISPROC) (GLsizei n, const GLfloat* points); typedef void (GLAPIENTRY * PFNGLGETFOGFUNCSGISPROC) (GLfloat* points); #define glFogFuncSGIS GLEW_GET_FUN(__glewFogFuncSGIS) #define glGetFogFuncSGIS GLEW_GET_FUN(__glewGetFogFuncSGIS) #define GLEW_SGIS_fog_function GLEW_GET_VAR(__GLEW_SGIS_fog_function) #endif /* GL_SGIS_fog_function */ /* ------------------------ GL_SGIS_generate_mipmap ------------------------ */ #ifndef GL_SGIS_generate_mipmap #define GL_SGIS_generate_mipmap 1 #define GL_GENERATE_MIPMAP_SGIS 0x8191 #define GL_GENERATE_MIPMAP_HINT_SGIS 0x8192 #define GLEW_SGIS_generate_mipmap GLEW_GET_VAR(__GLEW_SGIS_generate_mipmap) #endif /* GL_SGIS_generate_mipmap */ /* -------------------------- GL_SGIS_multisample -------------------------- */ #ifndef GL_SGIS_multisample #define GL_SGIS_multisample 1 #define GL_MULTISAMPLE_SGIS 0x809D #define GL_SAMPLE_ALPHA_TO_MASK_SGIS 0x809E #define GL_SAMPLE_ALPHA_TO_ONE_SGIS 0x809F #define GL_SAMPLE_MASK_SGIS 0x80A0 #define GL_1PASS_SGIS 0x80A1 #define GL_2PASS_0_SGIS 0x80A2 #define GL_2PASS_1_SGIS 0x80A3 #define GL_4PASS_0_SGIS 0x80A4 #define GL_4PASS_1_SGIS 0x80A5 #define GL_4PASS_2_SGIS 0x80A6 #define GL_4PASS_3_SGIS 0x80A7 #define GL_SAMPLE_BUFFERS_SGIS 0x80A8 #define GL_SAMPLES_SGIS 0x80A9 #define GL_SAMPLE_MASK_VALUE_SGIS 0x80AA #define GL_SAMPLE_MASK_INVERT_SGIS 0x80AB #define GL_SAMPLE_PATTERN_SGIS 0x80AC typedef void (GLAPIENTRY * PFNGLSAMPLEMASKSGISPROC) (GLclampf value, GLboolean invert); typedef void (GLAPIENTRY * PFNGLSAMPLEPATTERNSGISPROC) (GLenum pattern); #define glSampleMaskSGIS GLEW_GET_FUN(__glewSampleMaskSGIS) #define glSamplePatternSGIS GLEW_GET_FUN(__glewSamplePatternSGIS) #define GLEW_SGIS_multisample GLEW_GET_VAR(__GLEW_SGIS_multisample) #endif /* GL_SGIS_multisample */ /* ------------------------- GL_SGIS_pixel_texture ------------------------- */ #ifndef GL_SGIS_pixel_texture #define GL_SGIS_pixel_texture 1 #define GLEW_SGIS_pixel_texture GLEW_GET_VAR(__GLEW_SGIS_pixel_texture) #endif /* GL_SGIS_pixel_texture */ /* ----------------------- GL_SGIS_point_line_texgen ----------------------- */ #ifndef GL_SGIS_point_line_texgen #define GL_SGIS_point_line_texgen 1 #define GL_EYE_DISTANCE_TO_POINT_SGIS 0x81F0 #define GL_OBJECT_DISTANCE_TO_POINT_SGIS 0x81F1 #define GL_EYE_DISTANCE_TO_LINE_SGIS 0x81F2 #define GL_OBJECT_DISTANCE_TO_LINE_SGIS 0x81F3 #define GL_EYE_POINT_SGIS 0x81F4 #define GL_OBJECT_POINT_SGIS 0x81F5 #define GL_EYE_LINE_SGIS 0x81F6 #define GL_OBJECT_LINE_SGIS 0x81F7 #define GLEW_SGIS_point_line_texgen GLEW_GET_VAR(__GLEW_SGIS_point_line_texgen) #endif /* GL_SGIS_point_line_texgen */ /* ------------------------ GL_SGIS_sharpen_texture ------------------------ */ #ifndef GL_SGIS_sharpen_texture #define GL_SGIS_sharpen_texture 1 typedef void (GLAPIENTRY * PFNGLGETSHARPENTEXFUNCSGISPROC) (GLenum target, GLfloat* points); typedef void (GLAPIENTRY * PFNGLSHARPENTEXFUNCSGISPROC) (GLenum target, GLsizei n, const GLfloat* points); #define glGetSharpenTexFuncSGIS GLEW_GET_FUN(__glewGetSharpenTexFuncSGIS) #define glSharpenTexFuncSGIS GLEW_GET_FUN(__glewSharpenTexFuncSGIS) #define GLEW_SGIS_sharpen_texture GLEW_GET_VAR(__GLEW_SGIS_sharpen_texture) #endif /* GL_SGIS_sharpen_texture */ /* --------------------------- GL_SGIS_texture4D --------------------------- */ #ifndef GL_SGIS_texture4D #define GL_SGIS_texture4D 1 typedef void (GLAPIENTRY * PFNGLTEXIMAGE4DSGISPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLsizei extent, GLint border, GLenum format, GLenum type, const void* pixels); typedef void (GLAPIENTRY * PFNGLTEXSUBIMAGE4DSGISPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint woffset, GLsizei width, GLsizei height, GLsizei depth, GLsizei extent, GLenum format, GLenum type, const void* pixels); #define glTexImage4DSGIS GLEW_GET_FUN(__glewTexImage4DSGIS) #define glTexSubImage4DSGIS GLEW_GET_FUN(__glewTexSubImage4DSGIS) #define GLEW_SGIS_texture4D GLEW_GET_VAR(__GLEW_SGIS_texture4D) #endif /* GL_SGIS_texture4D */ /* ---------------------- GL_SGIS_texture_border_clamp --------------------- */ #ifndef GL_SGIS_texture_border_clamp #define GL_SGIS_texture_border_clamp 1 #define GL_CLAMP_TO_BORDER_SGIS 0x812D #define GLEW_SGIS_texture_border_clamp GLEW_GET_VAR(__GLEW_SGIS_texture_border_clamp) #endif /* GL_SGIS_texture_border_clamp */ /* ----------------------- GL_SGIS_texture_edge_clamp ---------------------- */ #ifndef GL_SGIS_texture_edge_clamp #define GL_SGIS_texture_edge_clamp 1 #define GL_CLAMP_TO_EDGE_SGIS 0x812F #define GLEW_SGIS_texture_edge_clamp GLEW_GET_VAR(__GLEW_SGIS_texture_edge_clamp) #endif /* GL_SGIS_texture_edge_clamp */ /* ------------------------ GL_SGIS_texture_filter4 ------------------------ */ #ifndef GL_SGIS_texture_filter4 #define GL_SGIS_texture_filter4 1 typedef void (GLAPIENTRY * PFNGLGETTEXFILTERFUNCSGISPROC) (GLenum target, GLenum filter, GLfloat* weights); typedef void (GLAPIENTRY * PFNGLTEXFILTERFUNCSGISPROC) (GLenum target, GLenum filter, GLsizei n, const GLfloat* weights); #define glGetTexFilterFuncSGIS GLEW_GET_FUN(__glewGetTexFilterFuncSGIS) #define glTexFilterFuncSGIS GLEW_GET_FUN(__glewTexFilterFuncSGIS) #define GLEW_SGIS_texture_filter4 GLEW_GET_VAR(__GLEW_SGIS_texture_filter4) #endif /* GL_SGIS_texture_filter4 */ /* -------------------------- GL_SGIS_texture_lod -------------------------- */ #ifndef GL_SGIS_texture_lod #define GL_SGIS_texture_lod 1 #define GL_TEXTURE_MIN_LOD_SGIS 0x813A #define GL_TEXTURE_MAX_LOD_SGIS 0x813B #define GL_TEXTURE_BASE_LEVEL_SGIS 0x813C #define GL_TEXTURE_MAX_LEVEL_SGIS 0x813D #define GLEW_SGIS_texture_lod GLEW_GET_VAR(__GLEW_SGIS_texture_lod) #endif /* GL_SGIS_texture_lod */ /* ------------------------- GL_SGIS_texture_select ------------------------ */ #ifndef GL_SGIS_texture_select #define GL_SGIS_texture_select 1 #define GLEW_SGIS_texture_select GLEW_GET_VAR(__GLEW_SGIS_texture_select) #endif /* GL_SGIS_texture_select */ /* ----------------------------- GL_SGIX_async ----------------------------- */ #ifndef GL_SGIX_async #define GL_SGIX_async 1 #define GL_ASYNC_MARKER_SGIX 0x8329 typedef void (GLAPIENTRY * PFNGLASYNCMARKERSGIXPROC) (GLuint marker); typedef void (GLAPIENTRY * PFNGLDELETEASYNCMARKERSSGIXPROC) (GLuint marker, GLsizei range); typedef GLint (GLAPIENTRY * PFNGLFINISHASYNCSGIXPROC) (GLuint* markerp); typedef GLuint (GLAPIENTRY * PFNGLGENASYNCMARKERSSGIXPROC) (GLsizei range); typedef GLboolean (GLAPIENTRY * PFNGLISASYNCMARKERSGIXPROC) (GLuint marker); typedef GLint (GLAPIENTRY * PFNGLPOLLASYNCSGIXPROC) (GLuint* markerp); #define glAsyncMarkerSGIX GLEW_GET_FUN(__glewAsyncMarkerSGIX) #define glDeleteAsyncMarkersSGIX GLEW_GET_FUN(__glewDeleteAsyncMarkersSGIX) #define glFinishAsyncSGIX GLEW_GET_FUN(__glewFinishAsyncSGIX) #define glGenAsyncMarkersSGIX GLEW_GET_FUN(__glewGenAsyncMarkersSGIX) #define glIsAsyncMarkerSGIX GLEW_GET_FUN(__glewIsAsyncMarkerSGIX) #define glPollAsyncSGIX GLEW_GET_FUN(__glewPollAsyncSGIX) #define GLEW_SGIX_async GLEW_GET_VAR(__GLEW_SGIX_async) #endif /* GL_SGIX_async */ /* ------------------------ GL_SGIX_async_histogram ------------------------ */ #ifndef GL_SGIX_async_histogram #define GL_SGIX_async_histogram 1 #define GL_ASYNC_HISTOGRAM_SGIX 0x832C #define GL_MAX_ASYNC_HISTOGRAM_SGIX 0x832D #define GLEW_SGIX_async_histogram GLEW_GET_VAR(__GLEW_SGIX_async_histogram) #endif /* GL_SGIX_async_histogram */ /* -------------------------- GL_SGIX_async_pixel -------------------------- */ #ifndef GL_SGIX_async_pixel #define GL_SGIX_async_pixel 1 #define GL_ASYNC_TEX_IMAGE_SGIX 0x835C #define GL_ASYNC_DRAW_PIXELS_SGIX 0x835D #define GL_ASYNC_READ_PIXELS_SGIX 0x835E #define GL_MAX_ASYNC_TEX_IMAGE_SGIX 0x835F #define GL_MAX_ASYNC_DRAW_PIXELS_SGIX 0x8360 #define GL_MAX_ASYNC_READ_PIXELS_SGIX 0x8361 #define GLEW_SGIX_async_pixel GLEW_GET_VAR(__GLEW_SGIX_async_pixel) #endif /* GL_SGIX_async_pixel */ /* ----------------------- GL_SGIX_blend_alpha_minmax ---------------------- */ #ifndef GL_SGIX_blend_alpha_minmax #define GL_SGIX_blend_alpha_minmax 1 #define GL_ALPHA_MIN_SGIX 0x8320 #define GL_ALPHA_MAX_SGIX 0x8321 #define GLEW_SGIX_blend_alpha_minmax GLEW_GET_VAR(__GLEW_SGIX_blend_alpha_minmax) #endif /* GL_SGIX_blend_alpha_minmax */ /* ---------------------------- GL_SGIX_clipmap ---------------------------- */ #ifndef GL_SGIX_clipmap #define GL_SGIX_clipmap 1 #define GLEW_SGIX_clipmap GLEW_GET_VAR(__GLEW_SGIX_clipmap) #endif /* GL_SGIX_clipmap */ /* ---------------------- GL_SGIX_convolution_accuracy --------------------- */ #ifndef GL_SGIX_convolution_accuracy #define GL_SGIX_convolution_accuracy 1 #define GL_CONVOLUTION_HINT_SGIX 0x8316 #define GLEW_SGIX_convolution_accuracy GLEW_GET_VAR(__GLEW_SGIX_convolution_accuracy) #endif /* GL_SGIX_convolution_accuracy */ /* ------------------------- GL_SGIX_depth_texture ------------------------- */ #ifndef GL_SGIX_depth_texture #define GL_SGIX_depth_texture 1 #define GL_DEPTH_COMPONENT16_SGIX 0x81A5 #define GL_DEPTH_COMPONENT24_SGIX 0x81A6 #define GL_DEPTH_COMPONENT32_SGIX 0x81A7 #define GLEW_SGIX_depth_texture GLEW_GET_VAR(__GLEW_SGIX_depth_texture) #endif /* GL_SGIX_depth_texture */ /* -------------------------- GL_SGIX_flush_raster ------------------------- */ #ifndef GL_SGIX_flush_raster #define GL_SGIX_flush_raster 1 typedef void (GLAPIENTRY * PFNGLFLUSHRASTERSGIXPROC) (void); #define glFlushRasterSGIX GLEW_GET_FUN(__glewFlushRasterSGIX) #define GLEW_SGIX_flush_raster GLEW_GET_VAR(__GLEW_SGIX_flush_raster) #endif /* GL_SGIX_flush_raster */ /* --------------------------- GL_SGIX_fog_offset -------------------------- */ #ifndef GL_SGIX_fog_offset #define GL_SGIX_fog_offset 1 #define GL_FOG_OFFSET_SGIX 0x8198 #define GL_FOG_OFFSET_VALUE_SGIX 0x8199 #define GLEW_SGIX_fog_offset GLEW_GET_VAR(__GLEW_SGIX_fog_offset) #endif /* GL_SGIX_fog_offset */ /* -------------------------- GL_SGIX_fog_texture -------------------------- */ #ifndef GL_SGIX_fog_texture #define GL_SGIX_fog_texture 1 #define GL_TEXTURE_FOG_SGIX 0 #define GL_FOG_PATCHY_FACTOR_SGIX 0 #define GL_FRAGMENT_FOG_SGIX 0 typedef void (GLAPIENTRY * PFNGLTEXTUREFOGSGIXPROC) (GLenum pname); #define glTextureFogSGIX GLEW_GET_FUN(__glewTextureFogSGIX) #define GLEW_SGIX_fog_texture GLEW_GET_VAR(__GLEW_SGIX_fog_texture) #endif /* GL_SGIX_fog_texture */ /* ------------------- GL_SGIX_fragment_specular_lighting ------------------ */ #ifndef GL_SGIX_fragment_specular_lighting #define GL_SGIX_fragment_specular_lighting 1 typedef void (GLAPIENTRY * PFNGLFRAGMENTCOLORMATERIALSGIXPROC) (GLenum face, GLenum mode); typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTMODELFSGIXPROC) (GLenum pname, GLfloat param); typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTMODELFVSGIXPROC) (GLenum pname, GLfloat* params); typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTMODELISGIXPROC) (GLenum pname, GLint param); typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTMODELIVSGIXPROC) (GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTFSGIXPROC) (GLenum light, GLenum pname, GLfloat param); typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTFVSGIXPROC) (GLenum light, GLenum pname, GLfloat* params); typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTISGIXPROC) (GLenum light, GLenum pname, GLint param); typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTIVSGIXPROC) (GLenum light, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLFRAGMENTMATERIALFSGIXPROC) (GLenum face, GLenum pname, const GLfloat param); typedef void (GLAPIENTRY * PFNGLFRAGMENTMATERIALFVSGIXPROC) (GLenum face, GLenum pname, const GLfloat* params); typedef void (GLAPIENTRY * PFNGLFRAGMENTMATERIALISGIXPROC) (GLenum face, GLenum pname, const GLint param); typedef void (GLAPIENTRY * PFNGLFRAGMENTMATERIALIVSGIXPROC) (GLenum face, GLenum pname, const GLint* params); typedef void (GLAPIENTRY * PFNGLGETFRAGMENTLIGHTFVSGIXPROC) (GLenum light, GLenum value, GLfloat* data); typedef void (GLAPIENTRY * PFNGLGETFRAGMENTLIGHTIVSGIXPROC) (GLenum light, GLenum value, GLint* data); typedef void (GLAPIENTRY * PFNGLGETFRAGMENTMATERIALFVSGIXPROC) (GLenum face, GLenum pname, const GLfloat* data); typedef void (GLAPIENTRY * PFNGLGETFRAGMENTMATERIALIVSGIXPROC) (GLenum face, GLenum pname, const GLint* data); #define glFragmentColorMaterialSGIX GLEW_GET_FUN(__glewFragmentColorMaterialSGIX) #define glFragmentLightModelfSGIX GLEW_GET_FUN(__glewFragmentLightModelfSGIX) #define glFragmentLightModelfvSGIX GLEW_GET_FUN(__glewFragmentLightModelfvSGIX) #define glFragmentLightModeliSGIX GLEW_GET_FUN(__glewFragmentLightModeliSGIX) #define glFragmentLightModelivSGIX GLEW_GET_FUN(__glewFragmentLightModelivSGIX) #define glFragmentLightfSGIX GLEW_GET_FUN(__glewFragmentLightfSGIX) #define glFragmentLightfvSGIX GLEW_GET_FUN(__glewFragmentLightfvSGIX) #define glFragmentLightiSGIX GLEW_GET_FUN(__glewFragmentLightiSGIX) #define glFragmentLightivSGIX GLEW_GET_FUN(__glewFragmentLightivSGIX) #define glFragmentMaterialfSGIX GLEW_GET_FUN(__glewFragmentMaterialfSGIX) #define glFragmentMaterialfvSGIX GLEW_GET_FUN(__glewFragmentMaterialfvSGIX) #define glFragmentMaterialiSGIX GLEW_GET_FUN(__glewFragmentMaterialiSGIX) #define glFragmentMaterialivSGIX GLEW_GET_FUN(__glewFragmentMaterialivSGIX) #define glGetFragmentLightfvSGIX GLEW_GET_FUN(__glewGetFragmentLightfvSGIX) #define glGetFragmentLightivSGIX GLEW_GET_FUN(__glewGetFragmentLightivSGIX) #define glGetFragmentMaterialfvSGIX GLEW_GET_FUN(__glewGetFragmentMaterialfvSGIX) #define glGetFragmentMaterialivSGIX GLEW_GET_FUN(__glewGetFragmentMaterialivSGIX) #define GLEW_SGIX_fragment_specular_lighting GLEW_GET_VAR(__GLEW_SGIX_fragment_specular_lighting) #endif /* GL_SGIX_fragment_specular_lighting */ /* --------------------------- GL_SGIX_framezoom --------------------------- */ #ifndef GL_SGIX_framezoom #define GL_SGIX_framezoom 1 typedef void (GLAPIENTRY * PFNGLFRAMEZOOMSGIXPROC) (GLint factor); #define glFrameZoomSGIX GLEW_GET_FUN(__glewFrameZoomSGIX) #define GLEW_SGIX_framezoom GLEW_GET_VAR(__GLEW_SGIX_framezoom) #endif /* GL_SGIX_framezoom */ /* --------------------------- GL_SGIX_interlace --------------------------- */ #ifndef GL_SGIX_interlace #define GL_SGIX_interlace 1 #define GL_INTERLACE_SGIX 0x8094 #define GLEW_SGIX_interlace GLEW_GET_VAR(__GLEW_SGIX_interlace) #endif /* GL_SGIX_interlace */ /* ------------------------- GL_SGIX_ir_instrument1 ------------------------ */ #ifndef GL_SGIX_ir_instrument1 #define GL_SGIX_ir_instrument1 1 #define GLEW_SGIX_ir_instrument1 GLEW_GET_VAR(__GLEW_SGIX_ir_instrument1) #endif /* GL_SGIX_ir_instrument1 */ /* ------------------------- GL_SGIX_list_priority ------------------------- */ #ifndef GL_SGIX_list_priority #define GL_SGIX_list_priority 1 #define GLEW_SGIX_list_priority GLEW_GET_VAR(__GLEW_SGIX_list_priority) #endif /* GL_SGIX_list_priority */ /* ------------------------- GL_SGIX_pixel_texture ------------------------- */ #ifndef GL_SGIX_pixel_texture #define GL_SGIX_pixel_texture 1 typedef void (GLAPIENTRY * PFNGLPIXELTEXGENSGIXPROC) (GLenum mode); #define glPixelTexGenSGIX GLEW_GET_FUN(__glewPixelTexGenSGIX) #define GLEW_SGIX_pixel_texture GLEW_GET_VAR(__GLEW_SGIX_pixel_texture) #endif /* GL_SGIX_pixel_texture */ /* ----------------------- GL_SGIX_pixel_texture_bits ---------------------- */ #ifndef GL_SGIX_pixel_texture_bits #define GL_SGIX_pixel_texture_bits 1 #define GLEW_SGIX_pixel_texture_bits GLEW_GET_VAR(__GLEW_SGIX_pixel_texture_bits) #endif /* GL_SGIX_pixel_texture_bits */ /* ------------------------ GL_SGIX_reference_plane ------------------------ */ #ifndef GL_SGIX_reference_plane #define GL_SGIX_reference_plane 1 typedef void (GLAPIENTRY * PFNGLREFERENCEPLANESGIXPROC) (const GLdouble* equation); #define glReferencePlaneSGIX GLEW_GET_FUN(__glewReferencePlaneSGIX) #define GLEW_SGIX_reference_plane GLEW_GET_VAR(__GLEW_SGIX_reference_plane) #endif /* GL_SGIX_reference_plane */ /* ---------------------------- GL_SGIX_resample --------------------------- */ #ifndef GL_SGIX_resample #define GL_SGIX_resample 1 #define GL_PACK_RESAMPLE_SGIX 0x842E #define GL_UNPACK_RESAMPLE_SGIX 0x842F #define GL_RESAMPLE_DECIMATE_SGIX 0x8430 #define GL_RESAMPLE_REPLICATE_SGIX 0x8433 #define GL_RESAMPLE_ZERO_FILL_SGIX 0x8434 #define GLEW_SGIX_resample GLEW_GET_VAR(__GLEW_SGIX_resample) #endif /* GL_SGIX_resample */ /* ----------------------------- GL_SGIX_shadow ---------------------------- */ #ifndef GL_SGIX_shadow #define GL_SGIX_shadow 1 #define GL_TEXTURE_COMPARE_SGIX 0x819A #define GL_TEXTURE_COMPARE_OPERATOR_SGIX 0x819B #define GL_TEXTURE_LEQUAL_R_SGIX 0x819C #define GL_TEXTURE_GEQUAL_R_SGIX 0x819D #define GLEW_SGIX_shadow GLEW_GET_VAR(__GLEW_SGIX_shadow) #endif /* GL_SGIX_shadow */ /* ------------------------- GL_SGIX_shadow_ambient ------------------------ */ #ifndef GL_SGIX_shadow_ambient #define GL_SGIX_shadow_ambient 1 #define GL_SHADOW_AMBIENT_SGIX 0x80BF #define GLEW_SGIX_shadow_ambient GLEW_GET_VAR(__GLEW_SGIX_shadow_ambient) #endif /* GL_SGIX_shadow_ambient */ /* ----------------------------- GL_SGIX_sprite ---------------------------- */ #ifndef GL_SGIX_sprite #define GL_SGIX_sprite 1 typedef void (GLAPIENTRY * PFNGLSPRITEPARAMETERFSGIXPROC) (GLenum pname, GLfloat param); typedef void (GLAPIENTRY * PFNGLSPRITEPARAMETERFVSGIXPROC) (GLenum pname, GLfloat* params); typedef void (GLAPIENTRY * PFNGLSPRITEPARAMETERISGIXPROC) (GLenum pname, GLint param); typedef void (GLAPIENTRY * PFNGLSPRITEPARAMETERIVSGIXPROC) (GLenum pname, GLint* params); #define glSpriteParameterfSGIX GLEW_GET_FUN(__glewSpriteParameterfSGIX) #define glSpriteParameterfvSGIX GLEW_GET_FUN(__glewSpriteParameterfvSGIX) #define glSpriteParameteriSGIX GLEW_GET_FUN(__glewSpriteParameteriSGIX) #define glSpriteParameterivSGIX GLEW_GET_FUN(__glewSpriteParameterivSGIX) #define GLEW_SGIX_sprite GLEW_GET_VAR(__GLEW_SGIX_sprite) #endif /* GL_SGIX_sprite */ /* ----------------------- GL_SGIX_tag_sample_buffer ----------------------- */ #ifndef GL_SGIX_tag_sample_buffer #define GL_SGIX_tag_sample_buffer 1 typedef void (GLAPIENTRY * PFNGLTAGSAMPLEBUFFERSGIXPROC) (void); #define glTagSampleBufferSGIX GLEW_GET_FUN(__glewTagSampleBufferSGIX) #define GLEW_SGIX_tag_sample_buffer GLEW_GET_VAR(__GLEW_SGIX_tag_sample_buffer) #endif /* GL_SGIX_tag_sample_buffer */ /* ------------------------ GL_SGIX_texture_add_env ------------------------ */ #ifndef GL_SGIX_texture_add_env #define GL_SGIX_texture_add_env 1 #define GLEW_SGIX_texture_add_env GLEW_GET_VAR(__GLEW_SGIX_texture_add_env) #endif /* GL_SGIX_texture_add_env */ /* -------------------- GL_SGIX_texture_coordinate_clamp ------------------- */ #ifndef GL_SGIX_texture_coordinate_clamp #define GL_SGIX_texture_coordinate_clamp 1 #define GL_TEXTURE_MAX_CLAMP_S_SGIX 0x8369 #define GL_TEXTURE_MAX_CLAMP_T_SGIX 0x836A #define GL_TEXTURE_MAX_CLAMP_R_SGIX 0x836B #define GLEW_SGIX_texture_coordinate_clamp GLEW_GET_VAR(__GLEW_SGIX_texture_coordinate_clamp) #endif /* GL_SGIX_texture_coordinate_clamp */ /* ------------------------ GL_SGIX_texture_lod_bias ----------------------- */ #ifndef GL_SGIX_texture_lod_bias #define GL_SGIX_texture_lod_bias 1 #define GLEW_SGIX_texture_lod_bias GLEW_GET_VAR(__GLEW_SGIX_texture_lod_bias) #endif /* GL_SGIX_texture_lod_bias */ /* ---------------------- GL_SGIX_texture_multi_buffer --------------------- */ #ifndef GL_SGIX_texture_multi_buffer #define GL_SGIX_texture_multi_buffer 1 #define GL_TEXTURE_MULTI_BUFFER_HINT_SGIX 0x812E #define GLEW_SGIX_texture_multi_buffer GLEW_GET_VAR(__GLEW_SGIX_texture_multi_buffer) #endif /* GL_SGIX_texture_multi_buffer */ /* ------------------------- GL_SGIX_texture_range ------------------------- */ #ifndef GL_SGIX_texture_range #define GL_SGIX_texture_range 1 #define GL_RGB_SIGNED_SGIX 0x85E0 #define GL_RGBA_SIGNED_SGIX 0x85E1 #define GL_ALPHA_SIGNED_SGIX 0x85E2 #define GL_LUMINANCE_SIGNED_SGIX 0x85E3 #define GL_INTENSITY_SIGNED_SGIX 0x85E4 #define GL_LUMINANCE_ALPHA_SIGNED_SGIX 0x85E5 #define GL_RGB16_SIGNED_SGIX 0x85E6 #define GL_RGBA16_SIGNED_SGIX 0x85E7 #define GL_ALPHA16_SIGNED_SGIX 0x85E8 #define GL_LUMINANCE16_SIGNED_SGIX 0x85E9 #define GL_INTENSITY16_SIGNED_SGIX 0x85EA #define GL_LUMINANCE16_ALPHA16_SIGNED_SGIX 0x85EB #define GL_RGB_EXTENDED_RANGE_SGIX 0x85EC #define GL_RGBA_EXTENDED_RANGE_SGIX 0x85ED #define GL_ALPHA_EXTENDED_RANGE_SGIX 0x85EE #define GL_LUMINANCE_EXTENDED_RANGE_SGIX 0x85EF #define GL_INTENSITY_EXTENDED_RANGE_SGIX 0x85F0 #define GL_LUMINANCE_ALPHA_EXTENDED_RANGE_SGIX 0x85F1 #define GL_RGB16_EXTENDED_RANGE_SGIX 0x85F2 #define GL_RGBA16_EXTENDED_RANGE_SGIX 0x85F3 #define GL_ALPHA16_EXTENDED_RANGE_SGIX 0x85F4 #define GL_LUMINANCE16_EXTENDED_RANGE_SGIX 0x85F5 #define GL_INTENSITY16_EXTENDED_RANGE_SGIX 0x85F6 #define GL_LUMINANCE16_ALPHA16_EXTENDED_RANGE_SGIX 0x85F7 #define GL_MIN_LUMINANCE_SGIS 0x85F8 #define GL_MAX_LUMINANCE_SGIS 0x85F9 #define GL_MIN_INTENSITY_SGIS 0x85FA #define GL_MAX_INTENSITY_SGIS 0x85FB #define GLEW_SGIX_texture_range GLEW_GET_VAR(__GLEW_SGIX_texture_range) #endif /* GL_SGIX_texture_range */ /* ----------------------- GL_SGIX_texture_scale_bias ---------------------- */ #ifndef GL_SGIX_texture_scale_bias #define GL_SGIX_texture_scale_bias 1 #define GL_POST_TEXTURE_FILTER_BIAS_SGIX 0x8179 #define GL_POST_TEXTURE_FILTER_SCALE_SGIX 0x817A #define GL_POST_TEXTURE_FILTER_BIAS_RANGE_SGIX 0x817B #define GL_POST_TEXTURE_FILTER_SCALE_RANGE_SGIX 0x817C #define GLEW_SGIX_texture_scale_bias GLEW_GET_VAR(__GLEW_SGIX_texture_scale_bias) #endif /* GL_SGIX_texture_scale_bias */ /* ------------------------- GL_SGIX_vertex_preclip ------------------------ */ #ifndef GL_SGIX_vertex_preclip #define GL_SGIX_vertex_preclip 1 #define GL_VERTEX_PRECLIP_SGIX 0x83EE #define GL_VERTEX_PRECLIP_HINT_SGIX 0x83EF #define GLEW_SGIX_vertex_preclip GLEW_GET_VAR(__GLEW_SGIX_vertex_preclip) #endif /* GL_SGIX_vertex_preclip */ /* ---------------------- GL_SGIX_vertex_preclip_hint ---------------------- */ #ifndef GL_SGIX_vertex_preclip_hint #define GL_SGIX_vertex_preclip_hint 1 #define GL_VERTEX_PRECLIP_SGIX 0x83EE #define GL_VERTEX_PRECLIP_HINT_SGIX 0x83EF #define GLEW_SGIX_vertex_preclip_hint GLEW_GET_VAR(__GLEW_SGIX_vertex_preclip_hint) #endif /* GL_SGIX_vertex_preclip_hint */ /* ----------------------------- GL_SGIX_ycrcb ----------------------------- */ #ifndef GL_SGIX_ycrcb #define GL_SGIX_ycrcb 1 #define GLEW_SGIX_ycrcb GLEW_GET_VAR(__GLEW_SGIX_ycrcb) #endif /* GL_SGIX_ycrcb */ /* -------------------------- GL_SGI_color_matrix -------------------------- */ #ifndef GL_SGI_color_matrix #define GL_SGI_color_matrix 1 #define GL_COLOR_MATRIX_SGI 0x80B1 #define GL_COLOR_MATRIX_STACK_DEPTH_SGI 0x80B2 #define GL_MAX_COLOR_MATRIX_STACK_DEPTH_SGI 0x80B3 #define GL_POST_COLOR_MATRIX_RED_SCALE_SGI 0x80B4 #define GL_POST_COLOR_MATRIX_GREEN_SCALE_SGI 0x80B5 #define GL_POST_COLOR_MATRIX_BLUE_SCALE_SGI 0x80B6 #define GL_POST_COLOR_MATRIX_ALPHA_SCALE_SGI 0x80B7 #define GL_POST_COLOR_MATRIX_RED_BIAS_SGI 0x80B8 #define GL_POST_COLOR_MATRIX_GREEN_BIAS_SGI 0x80B9 #define GL_POST_COLOR_MATRIX_BLUE_BIAS_SGI 0x80BA #define GL_POST_COLOR_MATRIX_ALPHA_BIAS_SGI 0x80BB #define GLEW_SGI_color_matrix GLEW_GET_VAR(__GLEW_SGI_color_matrix) #endif /* GL_SGI_color_matrix */ /* --------------------------- GL_SGI_color_table -------------------------- */ #ifndef GL_SGI_color_table #define GL_SGI_color_table 1 #define GL_COLOR_TABLE_SGI 0x80D0 #define GL_POST_CONVOLUTION_COLOR_TABLE_SGI 0x80D1 #define GL_POST_COLOR_MATRIX_COLOR_TABLE_SGI 0x80D2 #define GL_PROXY_COLOR_TABLE_SGI 0x80D3 #define GL_PROXY_POST_CONVOLUTION_COLOR_TABLE_SGI 0x80D4 #define GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE_SGI 0x80D5 #define GL_COLOR_TABLE_SCALE_SGI 0x80D6 #define GL_COLOR_TABLE_BIAS_SGI 0x80D7 #define GL_COLOR_TABLE_FORMAT_SGI 0x80D8 #define GL_COLOR_TABLE_WIDTH_SGI 0x80D9 #define GL_COLOR_TABLE_RED_SIZE_SGI 0x80DA #define GL_COLOR_TABLE_GREEN_SIZE_SGI 0x80DB #define GL_COLOR_TABLE_BLUE_SIZE_SGI 0x80DC #define GL_COLOR_TABLE_ALPHA_SIZE_SGI 0x80DD #define GL_COLOR_TABLE_LUMINANCE_SIZE_SGI 0x80DE #define GL_COLOR_TABLE_INTENSITY_SIZE_SGI 0x80DF typedef void (GLAPIENTRY * PFNGLCOLORTABLEPARAMETERFVSGIPROC) (GLenum target, GLenum pname, const GLfloat* params); typedef void (GLAPIENTRY * PFNGLCOLORTABLEPARAMETERIVSGIPROC) (GLenum target, GLenum pname, const GLint* params); typedef void (GLAPIENTRY * PFNGLCOLORTABLESGIPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void* table); typedef void (GLAPIENTRY * PFNGLCOPYCOLORTABLESGIPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); typedef void (GLAPIENTRY * PFNGLGETCOLORTABLEPARAMETERFVSGIPROC) (GLenum target, GLenum pname, GLfloat* params); typedef void (GLAPIENTRY * PFNGLGETCOLORTABLEPARAMETERIVSGIPROC) (GLenum target, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLGETCOLORTABLESGIPROC) (GLenum target, GLenum format, GLenum type, void* table); #define glColorTableParameterfvSGI GLEW_GET_FUN(__glewColorTableParameterfvSGI) #define glColorTableParameterivSGI GLEW_GET_FUN(__glewColorTableParameterivSGI) #define glColorTableSGI GLEW_GET_FUN(__glewColorTableSGI) #define glCopyColorTableSGI GLEW_GET_FUN(__glewCopyColorTableSGI) #define glGetColorTableParameterfvSGI GLEW_GET_FUN(__glewGetColorTableParameterfvSGI) #define glGetColorTableParameterivSGI GLEW_GET_FUN(__glewGetColorTableParameterivSGI) #define glGetColorTableSGI GLEW_GET_FUN(__glewGetColorTableSGI) #define GLEW_SGI_color_table GLEW_GET_VAR(__GLEW_SGI_color_table) #endif /* GL_SGI_color_table */ /* ----------------------- GL_SGI_texture_color_table ---------------------- */ #ifndef GL_SGI_texture_color_table #define GL_SGI_texture_color_table 1 #define GL_TEXTURE_COLOR_TABLE_SGI 0x80BC #define GL_PROXY_TEXTURE_COLOR_TABLE_SGI 0x80BD #define GLEW_SGI_texture_color_table GLEW_GET_VAR(__GLEW_SGI_texture_color_table) #endif /* GL_SGI_texture_color_table */ /* ------------------------- GL_SUNX_constant_data ------------------------- */ #ifndef GL_SUNX_constant_data #define GL_SUNX_constant_data 1 #define GL_UNPACK_CONSTANT_DATA_SUNX 0x81D5 #define GL_TEXTURE_CONSTANT_DATA_SUNX 0x81D6 typedef void (GLAPIENTRY * PFNGLFINISHTEXTURESUNXPROC) (void); #define glFinishTextureSUNX GLEW_GET_FUN(__glewFinishTextureSUNX) #define GLEW_SUNX_constant_data GLEW_GET_VAR(__GLEW_SUNX_constant_data) #endif /* GL_SUNX_constant_data */ /* -------------------- GL_SUN_convolution_border_modes -------------------- */ #ifndef GL_SUN_convolution_border_modes #define GL_SUN_convolution_border_modes 1 #define GL_WRAP_BORDER_SUN 0x81D4 #define GLEW_SUN_convolution_border_modes GLEW_GET_VAR(__GLEW_SUN_convolution_border_modes) #endif /* GL_SUN_convolution_border_modes */ /* -------------------------- GL_SUN_global_alpha -------------------------- */ #ifndef GL_SUN_global_alpha #define GL_SUN_global_alpha 1 #define GL_GLOBAL_ALPHA_SUN 0x81D9 #define GL_GLOBAL_ALPHA_FACTOR_SUN 0x81DA typedef void (GLAPIENTRY * PFNGLGLOBALALPHAFACTORBSUNPROC) (GLbyte factor); typedef void (GLAPIENTRY * PFNGLGLOBALALPHAFACTORDSUNPROC) (GLdouble factor); typedef void (GLAPIENTRY * PFNGLGLOBALALPHAFACTORFSUNPROC) (GLfloat factor); typedef void (GLAPIENTRY * PFNGLGLOBALALPHAFACTORISUNPROC) (GLint factor); typedef void (GLAPIENTRY * PFNGLGLOBALALPHAFACTORSSUNPROC) (GLshort factor); typedef void (GLAPIENTRY * PFNGLGLOBALALPHAFACTORUBSUNPROC) (GLubyte factor); typedef void (GLAPIENTRY * PFNGLGLOBALALPHAFACTORUISUNPROC) (GLuint factor); typedef void (GLAPIENTRY * PFNGLGLOBALALPHAFACTORUSSUNPROC) (GLushort factor); #define glGlobalAlphaFactorbSUN GLEW_GET_FUN(__glewGlobalAlphaFactorbSUN) #define glGlobalAlphaFactordSUN GLEW_GET_FUN(__glewGlobalAlphaFactordSUN) #define glGlobalAlphaFactorfSUN GLEW_GET_FUN(__glewGlobalAlphaFactorfSUN) #define glGlobalAlphaFactoriSUN GLEW_GET_FUN(__glewGlobalAlphaFactoriSUN) #define glGlobalAlphaFactorsSUN GLEW_GET_FUN(__glewGlobalAlphaFactorsSUN) #define glGlobalAlphaFactorubSUN GLEW_GET_FUN(__glewGlobalAlphaFactorubSUN) #define glGlobalAlphaFactoruiSUN GLEW_GET_FUN(__glewGlobalAlphaFactoruiSUN) #define glGlobalAlphaFactorusSUN GLEW_GET_FUN(__glewGlobalAlphaFactorusSUN) #define GLEW_SUN_global_alpha GLEW_GET_VAR(__GLEW_SUN_global_alpha) #endif /* GL_SUN_global_alpha */ /* --------------------------- GL_SUN_mesh_array --------------------------- */ #ifndef GL_SUN_mesh_array #define GL_SUN_mesh_array 1 #define GL_QUAD_MESH_SUN 0x8614 #define GL_TRIANGLE_MESH_SUN 0x8615 #define GLEW_SUN_mesh_array GLEW_GET_VAR(__GLEW_SUN_mesh_array) #endif /* GL_SUN_mesh_array */ /* ------------------------ GL_SUN_read_video_pixels ----------------------- */ #ifndef GL_SUN_read_video_pixels #define GL_SUN_read_video_pixels 1 typedef void (GLAPIENTRY * PFNGLREADVIDEOPIXELSSUNPROC) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid* pixels); #define glReadVideoPixelsSUN GLEW_GET_FUN(__glewReadVideoPixelsSUN) #define GLEW_SUN_read_video_pixels GLEW_GET_VAR(__GLEW_SUN_read_video_pixels) #endif /* GL_SUN_read_video_pixels */ /* --------------------------- GL_SUN_slice_accum -------------------------- */ #ifndef GL_SUN_slice_accum #define GL_SUN_slice_accum 1 #define GL_SLICE_ACCUM_SUN 0x85CC #define GLEW_SUN_slice_accum GLEW_GET_VAR(__GLEW_SUN_slice_accum) #endif /* GL_SUN_slice_accum */ /* -------------------------- GL_SUN_triangle_list ------------------------- */ #ifndef GL_SUN_triangle_list #define GL_SUN_triangle_list 1 #define GL_RESTART_SUN 0x01 #define GL_REPLACE_MIDDLE_SUN 0x02 #define GL_REPLACE_OLDEST_SUN 0x03 #define GL_TRIANGLE_LIST_SUN 0x81D7 #define GL_REPLACEMENT_CODE_SUN 0x81D8 #define GL_REPLACEMENT_CODE_ARRAY_SUN 0x85C0 #define GL_REPLACEMENT_CODE_ARRAY_TYPE_SUN 0x85C1 #define GL_REPLACEMENT_CODE_ARRAY_STRIDE_SUN 0x85C2 #define GL_REPLACEMENT_CODE_ARRAY_POINTER_SUN 0x85C3 #define GL_R1UI_V3F_SUN 0x85C4 #define GL_R1UI_C4UB_V3F_SUN 0x85C5 #define GL_R1UI_C3F_V3F_SUN 0x85C6 #define GL_R1UI_N3F_V3F_SUN 0x85C7 #define GL_R1UI_C4F_N3F_V3F_SUN 0x85C8 #define GL_R1UI_T2F_V3F_SUN 0x85C9 #define GL_R1UI_T2F_N3F_V3F_SUN 0x85CA #define GL_R1UI_T2F_C4F_N3F_V3F_SUN 0x85CB typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEPOINTERSUNPROC) (GLenum type, GLsizei stride, const void* pointer); typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUBSUNPROC) (GLubyte code); typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUBVSUNPROC) (const GLubyte* code); typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUISUNPROC) (GLuint code); typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUIVSUNPROC) (const GLuint* code); typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUSSUNPROC) (GLushort code); typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUSVSUNPROC) (const GLushort* code); #define glReplacementCodePointerSUN GLEW_GET_FUN(__glewReplacementCodePointerSUN) #define glReplacementCodeubSUN GLEW_GET_FUN(__glewReplacementCodeubSUN) #define glReplacementCodeubvSUN GLEW_GET_FUN(__glewReplacementCodeubvSUN) #define glReplacementCodeuiSUN GLEW_GET_FUN(__glewReplacementCodeuiSUN) #define glReplacementCodeuivSUN GLEW_GET_FUN(__glewReplacementCodeuivSUN) #define glReplacementCodeusSUN GLEW_GET_FUN(__glewReplacementCodeusSUN) #define glReplacementCodeusvSUN GLEW_GET_FUN(__glewReplacementCodeusvSUN) #define GLEW_SUN_triangle_list GLEW_GET_VAR(__GLEW_SUN_triangle_list) #endif /* GL_SUN_triangle_list */ /* ----------------------------- GL_SUN_vertex ----------------------------- */ #ifndef GL_SUN_vertex #define GL_SUN_vertex 1 typedef void (GLAPIENTRY * PFNGLCOLOR3FVERTEX3FSUNPROC) (GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); typedef void (GLAPIENTRY * PFNGLCOLOR3FVERTEX3FVSUNPROC) (const GLfloat* c, const GLfloat *v); typedef void (GLAPIENTRY * PFNGLCOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); typedef void (GLAPIENTRY * PFNGLCOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLfloat* c, const GLfloat *n, const GLfloat *v); typedef void (GLAPIENTRY * PFNGLCOLOR4UBVERTEX2FSUNPROC) (GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y); typedef void (GLAPIENTRY * PFNGLCOLOR4UBVERTEX2FVSUNPROC) (const GLubyte* c, const GLfloat *v); typedef void (GLAPIENTRY * PFNGLCOLOR4UBVERTEX3FSUNPROC) (GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); typedef void (GLAPIENTRY * PFNGLCOLOR4UBVERTEX3FVSUNPROC) (const GLubyte* c, const GLfloat *v); typedef void (GLAPIENTRY * PFNGLNORMAL3FVERTEX3FSUNPROC) (GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); typedef void (GLAPIENTRY * PFNGLNORMAL3FVERTEX3FVSUNPROC) (const GLfloat* n, const GLfloat *v); typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FSUNPROC) (GLuint rc, GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FVSUNPROC) (const GLuint* rc, const GLfloat *c, const GLfloat *v); typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLuint* rc, const GLfloat *c, const GLfloat *n, const GLfloat *v); typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FSUNPROC) (GLuint rc, GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FVSUNPROC) (const GLuint* rc, const GLubyte *c, const GLfloat *v); typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FVSUNPROC) (const GLuint* rc, const GLfloat *n, const GLfloat *v); typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLuint* rc, const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat s, GLfloat t, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FVSUNPROC) (const GLuint* rc, const GLfloat *tc, const GLfloat *n, const GLfloat *v); typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FSUNPROC) (GLuint rc, GLfloat s, GLfloat t, GLfloat x, GLfloat y, GLfloat z); typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FVSUNPROC) (const GLuint* rc, const GLfloat *tc, const GLfloat *v); typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUIVERTEX3FSUNPROC) (GLuint rc, GLfloat x, GLfloat y, GLfloat z); typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUIVERTEX3FVSUNPROC) (const GLuint* rc, const GLfloat *v); typedef void (GLAPIENTRY * PFNGLTEXCOORD2FCOLOR3FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); typedef void (GLAPIENTRY * PFNGLTEXCOORD2FCOLOR3FVERTEX3FVSUNPROC) (const GLfloat* tc, const GLfloat *c, const GLfloat *v); typedef void (GLAPIENTRY * PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); typedef void (GLAPIENTRY * PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLfloat* tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); typedef void (GLAPIENTRY * PFNGLTEXCOORD2FCOLOR4UBVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); typedef void (GLAPIENTRY * PFNGLTEXCOORD2FCOLOR4UBVERTEX3FVSUNPROC) (const GLfloat* tc, const GLubyte *c, const GLfloat *v); typedef void (GLAPIENTRY * PFNGLTEXCOORD2FNORMAL3FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); typedef void (GLAPIENTRY * PFNGLTEXCOORD2FNORMAL3FVERTEX3FVSUNPROC) (const GLfloat* tc, const GLfloat *n, const GLfloat *v); typedef void (GLAPIENTRY * PFNGLTEXCOORD2FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat x, GLfloat y, GLfloat z); typedef void (GLAPIENTRY * PFNGLTEXCOORD2FVERTEX3FVSUNPROC) (const GLfloat* tc, const GLfloat *v); typedef void (GLAPIENTRY * PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FSUNPROC) (GLfloat s, GLfloat t, GLfloat p, GLfloat q, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z, GLfloat w); typedef void (GLAPIENTRY * PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FVSUNPROC) (const GLfloat* tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); typedef void (GLAPIENTRY * PFNGLTEXCOORD4FVERTEX4FSUNPROC) (GLfloat s, GLfloat t, GLfloat p, GLfloat q, GLfloat x, GLfloat y, GLfloat z, GLfloat w); typedef void (GLAPIENTRY * PFNGLTEXCOORD4FVERTEX4FVSUNPROC) (const GLfloat* tc, const GLfloat *v); #define glColor3fVertex3fSUN GLEW_GET_FUN(__glewColor3fVertex3fSUN) #define glColor3fVertex3fvSUN GLEW_GET_FUN(__glewColor3fVertex3fvSUN) #define glColor4fNormal3fVertex3fSUN GLEW_GET_FUN(__glewColor4fNormal3fVertex3fSUN) #define glColor4fNormal3fVertex3fvSUN GLEW_GET_FUN(__glewColor4fNormal3fVertex3fvSUN) #define glColor4ubVertex2fSUN GLEW_GET_FUN(__glewColor4ubVertex2fSUN) #define glColor4ubVertex2fvSUN GLEW_GET_FUN(__glewColor4ubVertex2fvSUN) #define glColor4ubVertex3fSUN GLEW_GET_FUN(__glewColor4ubVertex3fSUN) #define glColor4ubVertex3fvSUN GLEW_GET_FUN(__glewColor4ubVertex3fvSUN) #define glNormal3fVertex3fSUN GLEW_GET_FUN(__glewNormal3fVertex3fSUN) #define glNormal3fVertex3fvSUN GLEW_GET_FUN(__glewNormal3fVertex3fvSUN) #define glReplacementCodeuiColor3fVertex3fSUN GLEW_GET_FUN(__glewReplacementCodeuiColor3fVertex3fSUN) #define glReplacementCodeuiColor3fVertex3fvSUN GLEW_GET_FUN(__glewReplacementCodeuiColor3fVertex3fvSUN) #define glReplacementCodeuiColor4fNormal3fVertex3fSUN GLEW_GET_FUN(__glewReplacementCodeuiColor4fNormal3fVertex3fSUN) #define glReplacementCodeuiColor4fNormal3fVertex3fvSUN GLEW_GET_FUN(__glewReplacementCodeuiColor4fNormal3fVertex3fvSUN) #define glReplacementCodeuiColor4ubVertex3fSUN GLEW_GET_FUN(__glewReplacementCodeuiColor4ubVertex3fSUN) #define glReplacementCodeuiColor4ubVertex3fvSUN GLEW_GET_FUN(__glewReplacementCodeuiColor4ubVertex3fvSUN) #define glReplacementCodeuiNormal3fVertex3fSUN GLEW_GET_FUN(__glewReplacementCodeuiNormal3fVertex3fSUN) #define glReplacementCodeuiNormal3fVertex3fvSUN GLEW_GET_FUN(__glewReplacementCodeuiNormal3fVertex3fvSUN) #define glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN GLEW_GET_FUN(__glewReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN) #define glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN GLEW_GET_FUN(__glewReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN) #define glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN GLEW_GET_FUN(__glewReplacementCodeuiTexCoord2fNormal3fVertex3fSUN) #define glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN GLEW_GET_FUN(__glewReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN) #define glReplacementCodeuiTexCoord2fVertex3fSUN GLEW_GET_FUN(__glewReplacementCodeuiTexCoord2fVertex3fSUN) #define glReplacementCodeuiTexCoord2fVertex3fvSUN GLEW_GET_FUN(__glewReplacementCodeuiTexCoord2fVertex3fvSUN) #define glReplacementCodeuiVertex3fSUN GLEW_GET_FUN(__glewReplacementCodeuiVertex3fSUN) #define glReplacementCodeuiVertex3fvSUN GLEW_GET_FUN(__glewReplacementCodeuiVertex3fvSUN) #define glTexCoord2fColor3fVertex3fSUN GLEW_GET_FUN(__glewTexCoord2fColor3fVertex3fSUN) #define glTexCoord2fColor3fVertex3fvSUN GLEW_GET_FUN(__glewTexCoord2fColor3fVertex3fvSUN) #define glTexCoord2fColor4fNormal3fVertex3fSUN GLEW_GET_FUN(__glewTexCoord2fColor4fNormal3fVertex3fSUN) #define glTexCoord2fColor4fNormal3fVertex3fvSUN GLEW_GET_FUN(__glewTexCoord2fColor4fNormal3fVertex3fvSUN) #define glTexCoord2fColor4ubVertex3fSUN GLEW_GET_FUN(__glewTexCoord2fColor4ubVertex3fSUN) #define glTexCoord2fColor4ubVertex3fvSUN GLEW_GET_FUN(__glewTexCoord2fColor4ubVertex3fvSUN) #define glTexCoord2fNormal3fVertex3fSUN GLEW_GET_FUN(__glewTexCoord2fNormal3fVertex3fSUN) #define glTexCoord2fNormal3fVertex3fvSUN GLEW_GET_FUN(__glewTexCoord2fNormal3fVertex3fvSUN) #define glTexCoord2fVertex3fSUN GLEW_GET_FUN(__glewTexCoord2fVertex3fSUN) #define glTexCoord2fVertex3fvSUN GLEW_GET_FUN(__glewTexCoord2fVertex3fvSUN) #define glTexCoord4fColor4fNormal3fVertex4fSUN GLEW_GET_FUN(__glewTexCoord4fColor4fNormal3fVertex4fSUN) #define glTexCoord4fColor4fNormal3fVertex4fvSUN GLEW_GET_FUN(__glewTexCoord4fColor4fNormal3fVertex4fvSUN) #define glTexCoord4fVertex4fSUN GLEW_GET_FUN(__glewTexCoord4fVertex4fSUN) #define glTexCoord4fVertex4fvSUN GLEW_GET_FUN(__glewTexCoord4fVertex4fvSUN) #define GLEW_SUN_vertex GLEW_GET_VAR(__GLEW_SUN_vertex) #endif /* GL_SUN_vertex */ /* -------------------------- GL_WIN_phong_shading ------------------------- */ #ifndef GL_WIN_phong_shading #define GL_WIN_phong_shading 1 #define GL_PHONG_WIN 0x80EA #define GL_PHONG_HINT_WIN 0x80EB #define GLEW_WIN_phong_shading GLEW_GET_VAR(__GLEW_WIN_phong_shading) #endif /* GL_WIN_phong_shading */ /* -------------------------- GL_WIN_specular_fog -------------------------- */ #ifndef GL_WIN_specular_fog #define GL_WIN_specular_fog 1 #define GL_FOG_SPECULAR_TEXTURE_WIN 0x80EC #define GLEW_WIN_specular_fog GLEW_GET_VAR(__GLEW_WIN_specular_fog) #endif /* GL_WIN_specular_fog */ /* ---------------------------- GL_WIN_swap_hint --------------------------- */ #ifndef GL_WIN_swap_hint #define GL_WIN_swap_hint 1 typedef void (GLAPIENTRY * PFNGLADDSWAPHINTRECTWINPROC) (GLint x, GLint y, GLsizei width, GLsizei height); #define glAddSwapHintRectWIN GLEW_GET_FUN(__glewAddSwapHintRectWIN) #define GLEW_WIN_swap_hint GLEW_GET_VAR(__GLEW_WIN_swap_hint) #endif /* GL_WIN_swap_hint */ /* ------------------------------------------------------------------------- */ #define GLEW_FUN_EXPORT extern #define GLEW_VAR_EXPORT extern #if defined(GLEW_MX) && defined(_WIN32) struct GLEWContextStruct { #endif /* GLEW_MX */ GLEW_FUN_EXPORT PFNGLCOPYTEXSUBIMAGE3DPROC __glewCopyTexSubImage3D; GLEW_FUN_EXPORT PFNGLDRAWRANGEELEMENTSPROC __glewDrawRangeElements; GLEW_FUN_EXPORT PFNGLTEXIMAGE3DPROC __glewTexImage3D; GLEW_FUN_EXPORT PFNGLTEXSUBIMAGE3DPROC __glewTexSubImage3D; GLEW_FUN_EXPORT PFNGLACTIVETEXTUREPROC __glewActiveTexture; GLEW_FUN_EXPORT PFNGLCLIENTACTIVETEXTUREPROC __glewClientActiveTexture; GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXIMAGE1DPROC __glewCompressedTexImage1D; GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXIMAGE2DPROC __glewCompressedTexImage2D; GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXIMAGE3DPROC __glewCompressedTexImage3D; GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC __glewCompressedTexSubImage1D; GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC __glewCompressedTexSubImage2D; GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC __glewCompressedTexSubImage3D; GLEW_FUN_EXPORT PFNGLGETCOMPRESSEDTEXIMAGEPROC __glewGetCompressedTexImage; GLEW_FUN_EXPORT PFNGLLOADTRANSPOSEMATRIXDPROC __glewLoadTransposeMatrixd; GLEW_FUN_EXPORT PFNGLLOADTRANSPOSEMATRIXFPROC __glewLoadTransposeMatrixf; GLEW_FUN_EXPORT PFNGLMULTTRANSPOSEMATRIXDPROC __glewMultTransposeMatrixd; GLEW_FUN_EXPORT PFNGLMULTTRANSPOSEMATRIXFPROC __glewMultTransposeMatrixf; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1DPROC __glewMultiTexCoord1d; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1DVPROC __glewMultiTexCoord1dv; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1FPROC __glewMultiTexCoord1f; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1FVPROC __glewMultiTexCoord1fv; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1IPROC __glewMultiTexCoord1i; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1IVPROC __glewMultiTexCoord1iv; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1SPROC __glewMultiTexCoord1s; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1SVPROC __glewMultiTexCoord1sv; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2DPROC __glewMultiTexCoord2d; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2DVPROC __glewMultiTexCoord2dv; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2FPROC __glewMultiTexCoord2f; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2FVPROC __glewMultiTexCoord2fv; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2IPROC __glewMultiTexCoord2i; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2IVPROC __glewMultiTexCoord2iv; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2SPROC __glewMultiTexCoord2s; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2SVPROC __glewMultiTexCoord2sv; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3DPROC __glewMultiTexCoord3d; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3DVPROC __glewMultiTexCoord3dv; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3FPROC __glewMultiTexCoord3f; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3FVPROC __glewMultiTexCoord3fv; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3IPROC __glewMultiTexCoord3i; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3IVPROC __glewMultiTexCoord3iv; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3SPROC __glewMultiTexCoord3s; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3SVPROC __glewMultiTexCoord3sv; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4DPROC __glewMultiTexCoord4d; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4DVPROC __glewMultiTexCoord4dv; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4FPROC __glewMultiTexCoord4f; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4FVPROC __glewMultiTexCoord4fv; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4IPROC __glewMultiTexCoord4i; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4IVPROC __glewMultiTexCoord4iv; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4SPROC __glewMultiTexCoord4s; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4SVPROC __glewMultiTexCoord4sv; GLEW_FUN_EXPORT PFNGLSAMPLECOVERAGEPROC __glewSampleCoverage; GLEW_FUN_EXPORT PFNGLBLENDCOLORPROC __glewBlendColor; GLEW_FUN_EXPORT PFNGLBLENDEQUATIONPROC __glewBlendEquation; GLEW_FUN_EXPORT PFNGLBLENDFUNCSEPARATEPROC __glewBlendFuncSeparate; GLEW_FUN_EXPORT PFNGLFOGCOORDPOINTERPROC __glewFogCoordPointer; GLEW_FUN_EXPORT PFNGLFOGCOORDDPROC __glewFogCoordd; GLEW_FUN_EXPORT PFNGLFOGCOORDDVPROC __glewFogCoorddv; GLEW_FUN_EXPORT PFNGLFOGCOORDFPROC __glewFogCoordf; GLEW_FUN_EXPORT PFNGLFOGCOORDFVPROC __glewFogCoordfv; GLEW_FUN_EXPORT PFNGLMULTIDRAWARRAYSPROC __glewMultiDrawArrays; GLEW_FUN_EXPORT PFNGLMULTIDRAWELEMENTSPROC __glewMultiDrawElements; GLEW_FUN_EXPORT PFNGLPOINTPARAMETERFPROC __glewPointParameterf; GLEW_FUN_EXPORT PFNGLPOINTPARAMETERFVPROC __glewPointParameterfv; GLEW_FUN_EXPORT PFNGLPOINTPARAMETERIPROC __glewPointParameteri; GLEW_FUN_EXPORT PFNGLPOINTPARAMETERIVPROC __glewPointParameteriv; GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3BPROC __glewSecondaryColor3b; GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3BVPROC __glewSecondaryColor3bv; GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3DPROC __glewSecondaryColor3d; GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3DVPROC __glewSecondaryColor3dv; GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3FPROC __glewSecondaryColor3f; GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3FVPROC __glewSecondaryColor3fv; GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3IPROC __glewSecondaryColor3i; GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3IVPROC __glewSecondaryColor3iv; GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3SPROC __glewSecondaryColor3s; GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3SVPROC __glewSecondaryColor3sv; GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3UBPROC __glewSecondaryColor3ub; GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3UBVPROC __glewSecondaryColor3ubv; GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3UIPROC __glewSecondaryColor3ui; GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3UIVPROC __glewSecondaryColor3uiv; GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3USPROC __glewSecondaryColor3us; GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3USVPROC __glewSecondaryColor3usv; GLEW_FUN_EXPORT PFNGLSECONDARYCOLORPOINTERPROC __glewSecondaryColorPointer; GLEW_FUN_EXPORT PFNGLWINDOWPOS2DPROC __glewWindowPos2d; GLEW_FUN_EXPORT PFNGLWINDOWPOS2DVPROC __glewWindowPos2dv; GLEW_FUN_EXPORT PFNGLWINDOWPOS2FPROC __glewWindowPos2f; GLEW_FUN_EXPORT PFNGLWINDOWPOS2FVPROC __glewWindowPos2fv; GLEW_FUN_EXPORT PFNGLWINDOWPOS2IPROC __glewWindowPos2i; GLEW_FUN_EXPORT PFNGLWINDOWPOS2IVPROC __glewWindowPos2iv; GLEW_FUN_EXPORT PFNGLWINDOWPOS2SPROC __glewWindowPos2s; GLEW_FUN_EXPORT PFNGLWINDOWPOS2SVPROC __glewWindowPos2sv; GLEW_FUN_EXPORT PFNGLWINDOWPOS3DPROC __glewWindowPos3d; GLEW_FUN_EXPORT PFNGLWINDOWPOS3DVPROC __glewWindowPos3dv; GLEW_FUN_EXPORT PFNGLWINDOWPOS3FPROC __glewWindowPos3f; GLEW_FUN_EXPORT PFNGLWINDOWPOS3FVPROC __glewWindowPos3fv; GLEW_FUN_EXPORT PFNGLWINDOWPOS3IPROC __glewWindowPos3i; GLEW_FUN_EXPORT PFNGLWINDOWPOS3IVPROC __glewWindowPos3iv; GLEW_FUN_EXPORT PFNGLWINDOWPOS3SPROC __glewWindowPos3s; GLEW_FUN_EXPORT PFNGLWINDOWPOS3SVPROC __glewWindowPos3sv; GLEW_FUN_EXPORT PFNGLBEGINQUERYPROC __glewBeginQuery; GLEW_FUN_EXPORT PFNGLBINDBUFFERPROC __glewBindBuffer; GLEW_FUN_EXPORT PFNGLBUFFERDATAPROC __glewBufferData; GLEW_FUN_EXPORT PFNGLBUFFERSUBDATAPROC __glewBufferSubData; GLEW_FUN_EXPORT PFNGLDELETEBUFFERSPROC __glewDeleteBuffers; GLEW_FUN_EXPORT PFNGLDELETEQUERIESPROC __glewDeleteQueries; GLEW_FUN_EXPORT PFNGLENDQUERYPROC __glewEndQuery; GLEW_FUN_EXPORT PFNGLGENBUFFERSPROC __glewGenBuffers; GLEW_FUN_EXPORT PFNGLGENQUERIESPROC __glewGenQueries; GLEW_FUN_EXPORT PFNGLGETBUFFERPARAMETERIVPROC __glewGetBufferParameteriv; GLEW_FUN_EXPORT PFNGLGETBUFFERPOINTERVPROC __glewGetBufferPointerv; GLEW_FUN_EXPORT PFNGLGETBUFFERSUBDATAPROC __glewGetBufferSubData; GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTIVPROC __glewGetQueryObjectiv; GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTUIVPROC __glewGetQueryObjectuiv; GLEW_FUN_EXPORT PFNGLGETQUERYIVPROC __glewGetQueryiv; GLEW_FUN_EXPORT PFNGLISBUFFERPROC __glewIsBuffer; GLEW_FUN_EXPORT PFNGLISQUERYPROC __glewIsQuery; GLEW_FUN_EXPORT PFNGLMAPBUFFERPROC __glewMapBuffer; GLEW_FUN_EXPORT PFNGLUNMAPBUFFERPROC __glewUnmapBuffer; GLEW_FUN_EXPORT PFNGLATTACHSHADERPROC __glewAttachShader; GLEW_FUN_EXPORT PFNGLBINDATTRIBLOCATIONPROC __glewBindAttribLocation; GLEW_FUN_EXPORT PFNGLBLENDEQUATIONSEPARATEPROC __glewBlendEquationSeparate; GLEW_FUN_EXPORT PFNGLCOMPILESHADERPROC __glewCompileShader; GLEW_FUN_EXPORT PFNGLCREATEPROGRAMPROC __glewCreateProgram; GLEW_FUN_EXPORT PFNGLCREATESHADERPROC __glewCreateShader; GLEW_FUN_EXPORT PFNGLDELETEPROGRAMPROC __glewDeleteProgram; GLEW_FUN_EXPORT PFNGLDELETESHADERPROC __glewDeleteShader; GLEW_FUN_EXPORT PFNGLDETACHSHADERPROC __glewDetachShader; GLEW_FUN_EXPORT PFNGLDISABLEVERTEXATTRIBARRAYPROC __glewDisableVertexAttribArray; GLEW_FUN_EXPORT PFNGLDRAWBUFFERSPROC __glewDrawBuffers; GLEW_FUN_EXPORT PFNGLENABLEVERTEXATTRIBARRAYPROC __glewEnableVertexAttribArray; GLEW_FUN_EXPORT PFNGLGETACTIVEATTRIBPROC __glewGetActiveAttrib; GLEW_FUN_EXPORT PFNGLGETACTIVEUNIFORMPROC __glewGetActiveUniform; GLEW_FUN_EXPORT PFNGLGETATTACHEDSHADERSPROC __glewGetAttachedShaders; GLEW_FUN_EXPORT PFNGLGETATTRIBLOCATIONPROC __glewGetAttribLocation; GLEW_FUN_EXPORT PFNGLGETPROGRAMINFOLOGPROC __glewGetProgramInfoLog; GLEW_FUN_EXPORT PFNGLGETPROGRAMIVPROC __glewGetProgramiv; GLEW_FUN_EXPORT PFNGLGETSHADERINFOLOGPROC __glewGetShaderInfoLog; GLEW_FUN_EXPORT PFNGLGETSHADERSOURCEPROC __glewGetShaderSource; GLEW_FUN_EXPORT PFNGLGETSHADERIVPROC __glewGetShaderiv; GLEW_FUN_EXPORT PFNGLGETUNIFORMLOCATIONPROC __glewGetUniformLocation; GLEW_FUN_EXPORT PFNGLGETUNIFORMFVPROC __glewGetUniformfv; GLEW_FUN_EXPORT PFNGLGETUNIFORMIVPROC __glewGetUniformiv; GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBPOINTERVPROC __glewGetVertexAttribPointerv; GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBDVPROC __glewGetVertexAttribdv; GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBFVPROC __glewGetVertexAttribfv; GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBIVPROC __glewGetVertexAttribiv; GLEW_FUN_EXPORT PFNGLISPROGRAMPROC __glewIsProgram; GLEW_FUN_EXPORT PFNGLISSHADERPROC __glewIsShader; GLEW_FUN_EXPORT PFNGLLINKPROGRAMPROC __glewLinkProgram; GLEW_FUN_EXPORT PFNGLSHADERSOURCEPROC __glewShaderSource; GLEW_FUN_EXPORT PFNGLSTENCILFUNCSEPARATEPROC __glewStencilFuncSeparate; GLEW_FUN_EXPORT PFNGLSTENCILMASKSEPARATEPROC __glewStencilMaskSeparate; GLEW_FUN_EXPORT PFNGLSTENCILOPSEPARATEPROC __glewStencilOpSeparate; GLEW_FUN_EXPORT PFNGLUNIFORM1FPROC __glewUniform1f; GLEW_FUN_EXPORT PFNGLUNIFORM1FVPROC __glewUniform1fv; GLEW_FUN_EXPORT PFNGLUNIFORM1IPROC __glewUniform1i; GLEW_FUN_EXPORT PFNGLUNIFORM1IVPROC __glewUniform1iv; GLEW_FUN_EXPORT PFNGLUNIFORM2FPROC __glewUniform2f; GLEW_FUN_EXPORT PFNGLUNIFORM2FVPROC __glewUniform2fv; GLEW_FUN_EXPORT PFNGLUNIFORM2IPROC __glewUniform2i; GLEW_FUN_EXPORT PFNGLUNIFORM2IVPROC __glewUniform2iv; GLEW_FUN_EXPORT PFNGLUNIFORM3FPROC __glewUniform3f; GLEW_FUN_EXPORT PFNGLUNIFORM3FVPROC __glewUniform3fv; GLEW_FUN_EXPORT PFNGLUNIFORM3IPROC __glewUniform3i; GLEW_FUN_EXPORT PFNGLUNIFORM3IVPROC __glewUniform3iv; GLEW_FUN_EXPORT PFNGLUNIFORM4FPROC __glewUniform4f; GLEW_FUN_EXPORT PFNGLUNIFORM4FVPROC __glewUniform4fv; GLEW_FUN_EXPORT PFNGLUNIFORM4IPROC __glewUniform4i; GLEW_FUN_EXPORT PFNGLUNIFORM4IVPROC __glewUniform4iv; GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX2FVPROC __glewUniformMatrix2fv; GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX3FVPROC __glewUniformMatrix3fv; GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX4FVPROC __glewUniformMatrix4fv; GLEW_FUN_EXPORT PFNGLUSEPROGRAMPROC __glewUseProgram; GLEW_FUN_EXPORT PFNGLVALIDATEPROGRAMPROC __glewValidateProgram; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1DPROC __glewVertexAttrib1d; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1DVPROC __glewVertexAttrib1dv; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1FPROC __glewVertexAttrib1f; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1FVPROC __glewVertexAttrib1fv; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1SPROC __glewVertexAttrib1s; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1SVPROC __glewVertexAttrib1sv; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2DPROC __glewVertexAttrib2d; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2DVPROC __glewVertexAttrib2dv; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2FPROC __glewVertexAttrib2f; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2FVPROC __glewVertexAttrib2fv; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2SPROC __glewVertexAttrib2s; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2SVPROC __glewVertexAttrib2sv; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3DPROC __glewVertexAttrib3d; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3DVPROC __glewVertexAttrib3dv; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3FPROC __glewVertexAttrib3f; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3FVPROC __glewVertexAttrib3fv; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3SPROC __glewVertexAttrib3s; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3SVPROC __glewVertexAttrib3sv; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NBVPROC __glewVertexAttrib4Nbv; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NIVPROC __glewVertexAttrib4Niv; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NSVPROC __glewVertexAttrib4Nsv; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NUBPROC __glewVertexAttrib4Nub; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NUBVPROC __glewVertexAttrib4Nubv; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NUIVPROC __glewVertexAttrib4Nuiv; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NUSVPROC __glewVertexAttrib4Nusv; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4BVPROC __glewVertexAttrib4bv; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4DPROC __glewVertexAttrib4d; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4DVPROC __glewVertexAttrib4dv; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4FPROC __glewVertexAttrib4f; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4FVPROC __glewVertexAttrib4fv; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4IVPROC __glewVertexAttrib4iv; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4SPROC __glewVertexAttrib4s; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4SVPROC __glewVertexAttrib4sv; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4UBVPROC __glewVertexAttrib4ubv; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4UIVPROC __glewVertexAttrib4uiv; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4USVPROC __glewVertexAttrib4usv; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBPOINTERPROC __glewVertexAttribPointer; GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX2X3FVPROC __glewUniformMatrix2x3fv; GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX2X4FVPROC __glewUniformMatrix2x4fv; GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX3X2FVPROC __glewUniformMatrix3x2fv; GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX3X4FVPROC __glewUniformMatrix3x4fv; GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX4X2FVPROC __glewUniformMatrix4x2fv; GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX4X3FVPROC __glewUniformMatrix4x3fv; GLEW_FUN_EXPORT PFNGLBEGINCONDITIONALRENDERPROC __glewBeginConditionalRender; GLEW_FUN_EXPORT PFNGLBEGINTRANSFORMFEEDBACKPROC __glewBeginTransformFeedback; GLEW_FUN_EXPORT PFNGLBINDFRAGDATALOCATIONPROC __glewBindFragDataLocation; GLEW_FUN_EXPORT PFNGLCLAMPCOLORPROC __glewClampColor; GLEW_FUN_EXPORT PFNGLCLEARBUFFERFIPROC __glewClearBufferfi; GLEW_FUN_EXPORT PFNGLCLEARBUFFERFVPROC __glewClearBufferfv; GLEW_FUN_EXPORT PFNGLCLEARBUFFERIVPROC __glewClearBufferiv; GLEW_FUN_EXPORT PFNGLCLEARBUFFERUIVPROC __glewClearBufferuiv; GLEW_FUN_EXPORT PFNGLCOLORMASKIPROC __glewColorMaski; GLEW_FUN_EXPORT PFNGLDISABLEIPROC __glewDisablei; GLEW_FUN_EXPORT PFNGLENABLEIPROC __glewEnablei; GLEW_FUN_EXPORT PFNGLENDCONDITIONALRENDERPROC __glewEndConditionalRender; GLEW_FUN_EXPORT PFNGLENDTRANSFORMFEEDBACKPROC __glewEndTransformFeedback; GLEW_FUN_EXPORT PFNGLGETBOOLEANI_VPROC __glewGetBooleani_v; GLEW_FUN_EXPORT PFNGLGETFRAGDATALOCATIONPROC __glewGetFragDataLocation; GLEW_FUN_EXPORT PFNGLGETSTRINGIPROC __glewGetStringi; GLEW_FUN_EXPORT PFNGLGETTEXPARAMETERIIVPROC __glewGetTexParameterIiv; GLEW_FUN_EXPORT PFNGLGETTEXPARAMETERIUIVPROC __glewGetTexParameterIuiv; GLEW_FUN_EXPORT PFNGLGETTRANSFORMFEEDBACKVARYINGPROC __glewGetTransformFeedbackVarying; GLEW_FUN_EXPORT PFNGLGETUNIFORMUIVPROC __glewGetUniformuiv; GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBIIVPROC __glewGetVertexAttribIiv; GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBIUIVPROC __glewGetVertexAttribIuiv; GLEW_FUN_EXPORT PFNGLISENABLEDIPROC __glewIsEnabledi; GLEW_FUN_EXPORT PFNGLTEXPARAMETERIIVPROC __glewTexParameterIiv; GLEW_FUN_EXPORT PFNGLTEXPARAMETERIUIVPROC __glewTexParameterIuiv; GLEW_FUN_EXPORT PFNGLTRANSFORMFEEDBACKVARYINGSPROC __glewTransformFeedbackVaryings; GLEW_FUN_EXPORT PFNGLUNIFORM1UIPROC __glewUniform1ui; GLEW_FUN_EXPORT PFNGLUNIFORM1UIVPROC __glewUniform1uiv; GLEW_FUN_EXPORT PFNGLUNIFORM2UIPROC __glewUniform2ui; GLEW_FUN_EXPORT PFNGLUNIFORM2UIVPROC __glewUniform2uiv; GLEW_FUN_EXPORT PFNGLUNIFORM3UIPROC __glewUniform3ui; GLEW_FUN_EXPORT PFNGLUNIFORM3UIVPROC __glewUniform3uiv; GLEW_FUN_EXPORT PFNGLUNIFORM4UIPROC __glewUniform4ui; GLEW_FUN_EXPORT PFNGLUNIFORM4UIVPROC __glewUniform4uiv; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI1IPROC __glewVertexAttribI1i; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI1IVPROC __glewVertexAttribI1iv; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI1UIPROC __glewVertexAttribI1ui; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI1UIVPROC __glewVertexAttribI1uiv; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI2IPROC __glewVertexAttribI2i; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI2IVPROC __glewVertexAttribI2iv; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI2UIPROC __glewVertexAttribI2ui; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI2UIVPROC __glewVertexAttribI2uiv; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI3IPROC __glewVertexAttribI3i; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI3IVPROC __glewVertexAttribI3iv; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI3UIPROC __glewVertexAttribI3ui; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI3UIVPROC __glewVertexAttribI3uiv; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4BVPROC __glewVertexAttribI4bv; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4IPROC __glewVertexAttribI4i; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4IVPROC __glewVertexAttribI4iv; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4SVPROC __glewVertexAttribI4sv; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4UBVPROC __glewVertexAttribI4ubv; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4UIPROC __glewVertexAttribI4ui; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4UIVPROC __glewVertexAttribI4uiv; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4USVPROC __glewVertexAttribI4usv; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBIPOINTERPROC __glewVertexAttribIPointer; GLEW_FUN_EXPORT PFNGLDRAWARRAYSINSTANCEDPROC __glewDrawArraysInstanced; GLEW_FUN_EXPORT PFNGLDRAWELEMENTSINSTANCEDPROC __glewDrawElementsInstanced; GLEW_FUN_EXPORT PFNGLPRIMITIVERESTARTINDEXPROC __glewPrimitiveRestartIndex; GLEW_FUN_EXPORT PFNGLTEXBUFFERPROC __glewTexBuffer; GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTUREPROC __glewFramebufferTexture; GLEW_FUN_EXPORT PFNGLGETBUFFERPARAMETERI64VPROC __glewGetBufferParameteri64v; GLEW_FUN_EXPORT PFNGLGETINTEGER64I_VPROC __glewGetInteger64i_v; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBDIVISORPROC __glewVertexAttribDivisor; GLEW_FUN_EXPORT PFNGLBLENDEQUATIONSEPARATEIPROC __glewBlendEquationSeparatei; GLEW_FUN_EXPORT PFNGLBLENDEQUATIONIPROC __glewBlendEquationi; GLEW_FUN_EXPORT PFNGLBLENDFUNCSEPARATEIPROC __glewBlendFuncSeparatei; GLEW_FUN_EXPORT PFNGLBLENDFUNCIPROC __glewBlendFunci; GLEW_FUN_EXPORT PFNGLMINSAMPLESHADINGPROC __glewMinSampleShading; GLEW_FUN_EXPORT PFNGLTBUFFERMASK3DFXPROC __glewTbufferMask3DFX; GLEW_FUN_EXPORT PFNGLDEBUGMESSAGECALLBACKAMDPROC __glewDebugMessageCallbackAMD; GLEW_FUN_EXPORT PFNGLDEBUGMESSAGEENABLEAMDPROC __glewDebugMessageEnableAMD; GLEW_FUN_EXPORT PFNGLDEBUGMESSAGEINSERTAMDPROC __glewDebugMessageInsertAMD; GLEW_FUN_EXPORT PFNGLGETDEBUGMESSAGELOGAMDPROC __glewGetDebugMessageLogAMD; GLEW_FUN_EXPORT PFNGLBLENDEQUATIONINDEXEDAMDPROC __glewBlendEquationIndexedAMD; GLEW_FUN_EXPORT PFNGLBLENDEQUATIONSEPARATEINDEXEDAMDPROC __glewBlendEquationSeparateIndexedAMD; GLEW_FUN_EXPORT PFNGLBLENDFUNCINDEXEDAMDPROC __glewBlendFuncIndexedAMD; GLEW_FUN_EXPORT PFNGLBLENDFUNCSEPARATEINDEXEDAMDPROC __glewBlendFuncSeparateIndexedAMD; GLEW_FUN_EXPORT PFNGLMULTIDRAWARRAYSINDIRECTAMDPROC __glewMultiDrawArraysIndirectAMD; GLEW_FUN_EXPORT PFNGLMULTIDRAWELEMENTSINDIRECTAMDPROC __glewMultiDrawElementsIndirectAMD; GLEW_FUN_EXPORT PFNGLDELETENAMESAMDPROC __glewDeleteNamesAMD; GLEW_FUN_EXPORT PFNGLGENNAMESAMDPROC __glewGenNamesAMD; GLEW_FUN_EXPORT PFNGLISNAMEAMDPROC __glewIsNameAMD; GLEW_FUN_EXPORT PFNGLBEGINPERFMONITORAMDPROC __glewBeginPerfMonitorAMD; GLEW_FUN_EXPORT PFNGLDELETEPERFMONITORSAMDPROC __glewDeletePerfMonitorsAMD; GLEW_FUN_EXPORT PFNGLENDPERFMONITORAMDPROC __glewEndPerfMonitorAMD; GLEW_FUN_EXPORT PFNGLGENPERFMONITORSAMDPROC __glewGenPerfMonitorsAMD; GLEW_FUN_EXPORT PFNGLGETPERFMONITORCOUNTERDATAAMDPROC __glewGetPerfMonitorCounterDataAMD; GLEW_FUN_EXPORT PFNGLGETPERFMONITORCOUNTERINFOAMDPROC __glewGetPerfMonitorCounterInfoAMD; GLEW_FUN_EXPORT PFNGLGETPERFMONITORCOUNTERSTRINGAMDPROC __glewGetPerfMonitorCounterStringAMD; GLEW_FUN_EXPORT PFNGLGETPERFMONITORCOUNTERSAMDPROC __glewGetPerfMonitorCountersAMD; GLEW_FUN_EXPORT PFNGLGETPERFMONITORGROUPSTRINGAMDPROC __glewGetPerfMonitorGroupStringAMD; GLEW_FUN_EXPORT PFNGLGETPERFMONITORGROUPSAMDPROC __glewGetPerfMonitorGroupsAMD; GLEW_FUN_EXPORT PFNGLSELECTPERFMONITORCOUNTERSAMDPROC __glewSelectPerfMonitorCountersAMD; GLEW_FUN_EXPORT PFNGLSETMULTISAMPLEFVAMDPROC __glewSetMultisamplefvAMD; GLEW_FUN_EXPORT PFNGLSTENCILOPVALUEAMDPROC __glewStencilOpValueAMD; GLEW_FUN_EXPORT PFNGLTESSELLATIONFACTORAMDPROC __glewTessellationFactorAMD; GLEW_FUN_EXPORT PFNGLTESSELLATIONMODEAMDPROC __glewTessellationModeAMD; GLEW_FUN_EXPORT PFNGLDRAWELEMENTARRAYAPPLEPROC __glewDrawElementArrayAPPLE; GLEW_FUN_EXPORT PFNGLDRAWRANGEELEMENTARRAYAPPLEPROC __glewDrawRangeElementArrayAPPLE; GLEW_FUN_EXPORT PFNGLELEMENTPOINTERAPPLEPROC __glewElementPointerAPPLE; GLEW_FUN_EXPORT PFNGLMULTIDRAWELEMENTARRAYAPPLEPROC __glewMultiDrawElementArrayAPPLE; GLEW_FUN_EXPORT PFNGLMULTIDRAWRANGEELEMENTARRAYAPPLEPROC __glewMultiDrawRangeElementArrayAPPLE; GLEW_FUN_EXPORT PFNGLDELETEFENCESAPPLEPROC __glewDeleteFencesAPPLE; GLEW_FUN_EXPORT PFNGLFINISHFENCEAPPLEPROC __glewFinishFenceAPPLE; GLEW_FUN_EXPORT PFNGLFINISHOBJECTAPPLEPROC __glewFinishObjectAPPLE; GLEW_FUN_EXPORT PFNGLGENFENCESAPPLEPROC __glewGenFencesAPPLE; GLEW_FUN_EXPORT PFNGLISFENCEAPPLEPROC __glewIsFenceAPPLE; GLEW_FUN_EXPORT PFNGLSETFENCEAPPLEPROC __glewSetFenceAPPLE; GLEW_FUN_EXPORT PFNGLTESTFENCEAPPLEPROC __glewTestFenceAPPLE; GLEW_FUN_EXPORT PFNGLTESTOBJECTAPPLEPROC __glewTestObjectAPPLE; GLEW_FUN_EXPORT PFNGLBUFFERPARAMETERIAPPLEPROC __glewBufferParameteriAPPLE; GLEW_FUN_EXPORT PFNGLFLUSHMAPPEDBUFFERRANGEAPPLEPROC __glewFlushMappedBufferRangeAPPLE; GLEW_FUN_EXPORT PFNGLGETOBJECTPARAMETERIVAPPLEPROC __glewGetObjectParameterivAPPLE; GLEW_FUN_EXPORT PFNGLOBJECTPURGEABLEAPPLEPROC __glewObjectPurgeableAPPLE; GLEW_FUN_EXPORT PFNGLOBJECTUNPURGEABLEAPPLEPROC __glewObjectUnpurgeableAPPLE; GLEW_FUN_EXPORT PFNGLGETTEXPARAMETERPOINTERVAPPLEPROC __glewGetTexParameterPointervAPPLE; GLEW_FUN_EXPORT PFNGLTEXTURERANGEAPPLEPROC __glewTextureRangeAPPLE; GLEW_FUN_EXPORT PFNGLBINDVERTEXARRAYAPPLEPROC __glewBindVertexArrayAPPLE; GLEW_FUN_EXPORT PFNGLDELETEVERTEXARRAYSAPPLEPROC __glewDeleteVertexArraysAPPLE; GLEW_FUN_EXPORT PFNGLGENVERTEXARRAYSAPPLEPROC __glewGenVertexArraysAPPLE; GLEW_FUN_EXPORT PFNGLISVERTEXARRAYAPPLEPROC __glewIsVertexArrayAPPLE; GLEW_FUN_EXPORT PFNGLFLUSHVERTEXARRAYRANGEAPPLEPROC __glewFlushVertexArrayRangeAPPLE; GLEW_FUN_EXPORT PFNGLVERTEXARRAYPARAMETERIAPPLEPROC __glewVertexArrayParameteriAPPLE; GLEW_FUN_EXPORT PFNGLVERTEXARRAYRANGEAPPLEPROC __glewVertexArrayRangeAPPLE; GLEW_FUN_EXPORT PFNGLDISABLEVERTEXATTRIBAPPLEPROC __glewDisableVertexAttribAPPLE; GLEW_FUN_EXPORT PFNGLENABLEVERTEXATTRIBAPPLEPROC __glewEnableVertexAttribAPPLE; GLEW_FUN_EXPORT PFNGLISVERTEXATTRIBENABLEDAPPLEPROC __glewIsVertexAttribEnabledAPPLE; GLEW_FUN_EXPORT PFNGLMAPVERTEXATTRIB1DAPPLEPROC __glewMapVertexAttrib1dAPPLE; GLEW_FUN_EXPORT PFNGLMAPVERTEXATTRIB1FAPPLEPROC __glewMapVertexAttrib1fAPPLE; GLEW_FUN_EXPORT PFNGLMAPVERTEXATTRIB2DAPPLEPROC __glewMapVertexAttrib2dAPPLE; GLEW_FUN_EXPORT PFNGLMAPVERTEXATTRIB2FAPPLEPROC __glewMapVertexAttrib2fAPPLE; GLEW_FUN_EXPORT PFNGLCLEARDEPTHFPROC __glewClearDepthf; GLEW_FUN_EXPORT PFNGLDEPTHRANGEFPROC __glewDepthRangef; GLEW_FUN_EXPORT PFNGLGETSHADERPRECISIONFORMATPROC __glewGetShaderPrecisionFormat; GLEW_FUN_EXPORT PFNGLRELEASESHADERCOMPILERPROC __glewReleaseShaderCompiler; GLEW_FUN_EXPORT PFNGLSHADERBINARYPROC __glewShaderBinary; GLEW_FUN_EXPORT PFNGLDRAWARRAYSINSTANCEDBASEINSTANCEPROC __glewDrawArraysInstancedBaseInstance; GLEW_FUN_EXPORT PFNGLDRAWELEMENTSINSTANCEDBASEINSTANCEPROC __glewDrawElementsInstancedBaseInstance; GLEW_FUN_EXPORT PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEPROC __glewDrawElementsInstancedBaseVertexBaseInstance; GLEW_FUN_EXPORT PFNGLBINDFRAGDATALOCATIONINDEXEDPROC __glewBindFragDataLocationIndexed; GLEW_FUN_EXPORT PFNGLGETFRAGDATAINDEXPROC __glewGetFragDataIndex; GLEW_FUN_EXPORT PFNGLCREATESYNCFROMCLEVENTARBPROC __glewCreateSyncFromCLeventARB; GLEW_FUN_EXPORT PFNGLCLEARBUFFERDATAPROC __glewClearBufferData; GLEW_FUN_EXPORT PFNGLCLEARBUFFERSUBDATAPROC __glewClearBufferSubData; GLEW_FUN_EXPORT PFNGLCLEARNAMEDBUFFERDATAEXTPROC __glewClearNamedBufferDataEXT; GLEW_FUN_EXPORT PFNGLCLEARNAMEDBUFFERSUBDATAEXTPROC __glewClearNamedBufferSubDataEXT; GLEW_FUN_EXPORT PFNGLCLAMPCOLORARBPROC __glewClampColorARB; GLEW_FUN_EXPORT PFNGLDISPATCHCOMPUTEPROC __glewDispatchCompute; GLEW_FUN_EXPORT PFNGLDISPATCHCOMPUTEINDIRECTPROC __glewDispatchComputeIndirect; GLEW_FUN_EXPORT PFNGLCOPYBUFFERSUBDATAPROC __glewCopyBufferSubData; GLEW_FUN_EXPORT PFNGLCOPYIMAGESUBDATAPROC __glewCopyImageSubData; GLEW_FUN_EXPORT PFNGLDEBUGMESSAGECALLBACKARBPROC __glewDebugMessageCallbackARB; GLEW_FUN_EXPORT PFNGLDEBUGMESSAGECONTROLARBPROC __glewDebugMessageControlARB; GLEW_FUN_EXPORT PFNGLDEBUGMESSAGEINSERTARBPROC __glewDebugMessageInsertARB; GLEW_FUN_EXPORT PFNGLGETDEBUGMESSAGELOGARBPROC __glewGetDebugMessageLogARB; GLEW_FUN_EXPORT PFNGLDRAWBUFFERSARBPROC __glewDrawBuffersARB; GLEW_FUN_EXPORT PFNGLBLENDEQUATIONSEPARATEIARBPROC __glewBlendEquationSeparateiARB; GLEW_FUN_EXPORT PFNGLBLENDEQUATIONIARBPROC __glewBlendEquationiARB; GLEW_FUN_EXPORT PFNGLBLENDFUNCSEPARATEIARBPROC __glewBlendFuncSeparateiARB; GLEW_FUN_EXPORT PFNGLBLENDFUNCIARBPROC __glewBlendFunciARB; GLEW_FUN_EXPORT PFNGLDRAWELEMENTSBASEVERTEXPROC __glewDrawElementsBaseVertex; GLEW_FUN_EXPORT PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC __glewDrawElementsInstancedBaseVertex; GLEW_FUN_EXPORT PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC __glewDrawRangeElementsBaseVertex; GLEW_FUN_EXPORT PFNGLMULTIDRAWELEMENTSBASEVERTEXPROC __glewMultiDrawElementsBaseVertex; GLEW_FUN_EXPORT PFNGLDRAWARRAYSINDIRECTPROC __glewDrawArraysIndirect; GLEW_FUN_EXPORT PFNGLDRAWELEMENTSINDIRECTPROC __glewDrawElementsIndirect; GLEW_FUN_EXPORT PFNGLFRAMEBUFFERPARAMETERIPROC __glewFramebufferParameteri; GLEW_FUN_EXPORT PFNGLGETFRAMEBUFFERPARAMETERIVPROC __glewGetFramebufferParameteriv; GLEW_FUN_EXPORT PFNGLGETNAMEDFRAMEBUFFERPARAMETERIVEXTPROC __glewGetNamedFramebufferParameterivEXT; GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERPARAMETERIEXTPROC __glewNamedFramebufferParameteriEXT; GLEW_FUN_EXPORT PFNGLBINDFRAMEBUFFERPROC __glewBindFramebuffer; GLEW_FUN_EXPORT PFNGLBINDRENDERBUFFERPROC __glewBindRenderbuffer; GLEW_FUN_EXPORT PFNGLBLITFRAMEBUFFERPROC __glewBlitFramebuffer; GLEW_FUN_EXPORT PFNGLCHECKFRAMEBUFFERSTATUSPROC __glewCheckFramebufferStatus; GLEW_FUN_EXPORT PFNGLDELETEFRAMEBUFFERSPROC __glewDeleteFramebuffers; GLEW_FUN_EXPORT PFNGLDELETERENDERBUFFERSPROC __glewDeleteRenderbuffers; GLEW_FUN_EXPORT PFNGLFRAMEBUFFERRENDERBUFFERPROC __glewFramebufferRenderbuffer; GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURE1DPROC __glewFramebufferTexture1D; GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURE2DPROC __glewFramebufferTexture2D; GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURE3DPROC __glewFramebufferTexture3D; GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURELAYERPROC __glewFramebufferTextureLayer; GLEW_FUN_EXPORT PFNGLGENFRAMEBUFFERSPROC __glewGenFramebuffers; GLEW_FUN_EXPORT PFNGLGENRENDERBUFFERSPROC __glewGenRenderbuffers; GLEW_FUN_EXPORT PFNGLGENERATEMIPMAPPROC __glewGenerateMipmap; GLEW_FUN_EXPORT PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC __glewGetFramebufferAttachmentParameteriv; GLEW_FUN_EXPORT PFNGLGETRENDERBUFFERPARAMETERIVPROC __glewGetRenderbufferParameteriv; GLEW_FUN_EXPORT PFNGLISFRAMEBUFFERPROC __glewIsFramebuffer; GLEW_FUN_EXPORT PFNGLISRENDERBUFFERPROC __glewIsRenderbuffer; GLEW_FUN_EXPORT PFNGLRENDERBUFFERSTORAGEPROC __glewRenderbufferStorage; GLEW_FUN_EXPORT PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC __glewRenderbufferStorageMultisample; GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTUREARBPROC __glewFramebufferTextureARB; GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTUREFACEARBPROC __glewFramebufferTextureFaceARB; GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURELAYERARBPROC __glewFramebufferTextureLayerARB; GLEW_FUN_EXPORT PFNGLPROGRAMPARAMETERIARBPROC __glewProgramParameteriARB; GLEW_FUN_EXPORT PFNGLGETPROGRAMBINARYPROC __glewGetProgramBinary; GLEW_FUN_EXPORT PFNGLPROGRAMBINARYPROC __glewProgramBinary; GLEW_FUN_EXPORT PFNGLPROGRAMPARAMETERIPROC __glewProgramParameteri; GLEW_FUN_EXPORT PFNGLGETUNIFORMDVPROC __glewGetUniformdv; GLEW_FUN_EXPORT PFNGLUNIFORM1DPROC __glewUniform1d; GLEW_FUN_EXPORT PFNGLUNIFORM1DVPROC __glewUniform1dv; GLEW_FUN_EXPORT PFNGLUNIFORM2DPROC __glewUniform2d; GLEW_FUN_EXPORT PFNGLUNIFORM2DVPROC __glewUniform2dv; GLEW_FUN_EXPORT PFNGLUNIFORM3DPROC __glewUniform3d; GLEW_FUN_EXPORT PFNGLUNIFORM3DVPROC __glewUniform3dv; GLEW_FUN_EXPORT PFNGLUNIFORM4DPROC __glewUniform4d; GLEW_FUN_EXPORT PFNGLUNIFORM4DVPROC __glewUniform4dv; GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX2DVPROC __glewUniformMatrix2dv; GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX2X3DVPROC __glewUniformMatrix2x3dv; GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX2X4DVPROC __glewUniformMatrix2x4dv; GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX3DVPROC __glewUniformMatrix3dv; GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX3X2DVPROC __glewUniformMatrix3x2dv; GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX3X4DVPROC __glewUniformMatrix3x4dv; GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX4DVPROC __glewUniformMatrix4dv; GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX4X2DVPROC __glewUniformMatrix4x2dv; GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX4X3DVPROC __glewUniformMatrix4x3dv; GLEW_FUN_EXPORT PFNGLCOLORSUBTABLEPROC __glewColorSubTable; GLEW_FUN_EXPORT PFNGLCOLORTABLEPROC __glewColorTable; GLEW_FUN_EXPORT PFNGLCOLORTABLEPARAMETERFVPROC __glewColorTableParameterfv; GLEW_FUN_EXPORT PFNGLCOLORTABLEPARAMETERIVPROC __glewColorTableParameteriv; GLEW_FUN_EXPORT PFNGLCONVOLUTIONFILTER1DPROC __glewConvolutionFilter1D; GLEW_FUN_EXPORT PFNGLCONVOLUTIONFILTER2DPROC __glewConvolutionFilter2D; GLEW_FUN_EXPORT PFNGLCONVOLUTIONPARAMETERFPROC __glewConvolutionParameterf; GLEW_FUN_EXPORT PFNGLCONVOLUTIONPARAMETERFVPROC __glewConvolutionParameterfv; GLEW_FUN_EXPORT PFNGLCONVOLUTIONPARAMETERIPROC __glewConvolutionParameteri; GLEW_FUN_EXPORT PFNGLCONVOLUTIONPARAMETERIVPROC __glewConvolutionParameteriv; GLEW_FUN_EXPORT PFNGLCOPYCOLORSUBTABLEPROC __glewCopyColorSubTable; GLEW_FUN_EXPORT PFNGLCOPYCOLORTABLEPROC __glewCopyColorTable; GLEW_FUN_EXPORT PFNGLCOPYCONVOLUTIONFILTER1DPROC __glewCopyConvolutionFilter1D; GLEW_FUN_EXPORT PFNGLCOPYCONVOLUTIONFILTER2DPROC __glewCopyConvolutionFilter2D; GLEW_FUN_EXPORT PFNGLGETCOLORTABLEPROC __glewGetColorTable; GLEW_FUN_EXPORT PFNGLGETCOLORTABLEPARAMETERFVPROC __glewGetColorTableParameterfv; GLEW_FUN_EXPORT PFNGLGETCOLORTABLEPARAMETERIVPROC __glewGetColorTableParameteriv; GLEW_FUN_EXPORT PFNGLGETCONVOLUTIONFILTERPROC __glewGetConvolutionFilter; GLEW_FUN_EXPORT PFNGLGETCONVOLUTIONPARAMETERFVPROC __glewGetConvolutionParameterfv; GLEW_FUN_EXPORT PFNGLGETCONVOLUTIONPARAMETERIVPROC __glewGetConvolutionParameteriv; GLEW_FUN_EXPORT PFNGLGETHISTOGRAMPROC __glewGetHistogram; GLEW_FUN_EXPORT PFNGLGETHISTOGRAMPARAMETERFVPROC __glewGetHistogramParameterfv; GLEW_FUN_EXPORT PFNGLGETHISTOGRAMPARAMETERIVPROC __glewGetHistogramParameteriv; GLEW_FUN_EXPORT PFNGLGETMINMAXPROC __glewGetMinmax; GLEW_FUN_EXPORT PFNGLGETMINMAXPARAMETERFVPROC __glewGetMinmaxParameterfv; GLEW_FUN_EXPORT PFNGLGETMINMAXPARAMETERIVPROC __glewGetMinmaxParameteriv; GLEW_FUN_EXPORT PFNGLGETSEPARABLEFILTERPROC __glewGetSeparableFilter; GLEW_FUN_EXPORT PFNGLHISTOGRAMPROC __glewHistogram; GLEW_FUN_EXPORT PFNGLMINMAXPROC __glewMinmax; GLEW_FUN_EXPORT PFNGLRESETHISTOGRAMPROC __glewResetHistogram; GLEW_FUN_EXPORT PFNGLRESETMINMAXPROC __glewResetMinmax; GLEW_FUN_EXPORT PFNGLSEPARABLEFILTER2DPROC __glewSeparableFilter2D; GLEW_FUN_EXPORT PFNGLDRAWARRAYSINSTANCEDARBPROC __glewDrawArraysInstancedARB; GLEW_FUN_EXPORT PFNGLDRAWELEMENTSINSTANCEDARBPROC __glewDrawElementsInstancedARB; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBDIVISORARBPROC __glewVertexAttribDivisorARB; GLEW_FUN_EXPORT PFNGLGETINTERNALFORMATIVPROC __glewGetInternalformativ; GLEW_FUN_EXPORT PFNGLGETINTERNALFORMATI64VPROC __glewGetInternalformati64v; GLEW_FUN_EXPORT PFNGLINVALIDATEBUFFERDATAPROC __glewInvalidateBufferData; GLEW_FUN_EXPORT PFNGLINVALIDATEBUFFERSUBDATAPROC __glewInvalidateBufferSubData; GLEW_FUN_EXPORT PFNGLINVALIDATEFRAMEBUFFERPROC __glewInvalidateFramebuffer; GLEW_FUN_EXPORT PFNGLINVALIDATESUBFRAMEBUFFERPROC __glewInvalidateSubFramebuffer; GLEW_FUN_EXPORT PFNGLINVALIDATETEXIMAGEPROC __glewInvalidateTexImage; GLEW_FUN_EXPORT PFNGLINVALIDATETEXSUBIMAGEPROC __glewInvalidateTexSubImage; GLEW_FUN_EXPORT PFNGLFLUSHMAPPEDBUFFERRANGEPROC __glewFlushMappedBufferRange; GLEW_FUN_EXPORT PFNGLMAPBUFFERRANGEPROC __glewMapBufferRange; GLEW_FUN_EXPORT PFNGLCURRENTPALETTEMATRIXARBPROC __glewCurrentPaletteMatrixARB; GLEW_FUN_EXPORT PFNGLMATRIXINDEXPOINTERARBPROC __glewMatrixIndexPointerARB; GLEW_FUN_EXPORT PFNGLMATRIXINDEXUBVARBPROC __glewMatrixIndexubvARB; GLEW_FUN_EXPORT PFNGLMATRIXINDEXUIVARBPROC __glewMatrixIndexuivARB; GLEW_FUN_EXPORT PFNGLMATRIXINDEXUSVARBPROC __glewMatrixIndexusvARB; GLEW_FUN_EXPORT PFNGLMULTIDRAWARRAYSINDIRECTPROC __glewMultiDrawArraysIndirect; GLEW_FUN_EXPORT PFNGLMULTIDRAWELEMENTSINDIRECTPROC __glewMultiDrawElementsIndirect; GLEW_FUN_EXPORT PFNGLSAMPLECOVERAGEARBPROC __glewSampleCoverageARB; GLEW_FUN_EXPORT PFNGLACTIVETEXTUREARBPROC __glewActiveTextureARB; GLEW_FUN_EXPORT PFNGLCLIENTACTIVETEXTUREARBPROC __glewClientActiveTextureARB; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1DARBPROC __glewMultiTexCoord1dARB; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1DVARBPROC __glewMultiTexCoord1dvARB; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1FARBPROC __glewMultiTexCoord1fARB; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1FVARBPROC __glewMultiTexCoord1fvARB; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1IARBPROC __glewMultiTexCoord1iARB; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1IVARBPROC __glewMultiTexCoord1ivARB; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1SARBPROC __glewMultiTexCoord1sARB; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1SVARBPROC __glewMultiTexCoord1svARB; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2DARBPROC __glewMultiTexCoord2dARB; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2DVARBPROC __glewMultiTexCoord2dvARB; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2FARBPROC __glewMultiTexCoord2fARB; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2FVARBPROC __glewMultiTexCoord2fvARB; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2IARBPROC __glewMultiTexCoord2iARB; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2IVARBPROC __glewMultiTexCoord2ivARB; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2SARBPROC __glewMultiTexCoord2sARB; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2SVARBPROC __glewMultiTexCoord2svARB; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3DARBPROC __glewMultiTexCoord3dARB; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3DVARBPROC __glewMultiTexCoord3dvARB; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3FARBPROC __glewMultiTexCoord3fARB; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3FVARBPROC __glewMultiTexCoord3fvARB; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3IARBPROC __glewMultiTexCoord3iARB; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3IVARBPROC __glewMultiTexCoord3ivARB; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3SARBPROC __glewMultiTexCoord3sARB; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3SVARBPROC __glewMultiTexCoord3svARB; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4DARBPROC __glewMultiTexCoord4dARB; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4DVARBPROC __glewMultiTexCoord4dvARB; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4FARBPROC __glewMultiTexCoord4fARB; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4FVARBPROC __glewMultiTexCoord4fvARB; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4IARBPROC __glewMultiTexCoord4iARB; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4IVARBPROC __glewMultiTexCoord4ivARB; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4SARBPROC __glewMultiTexCoord4sARB; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4SVARBPROC __glewMultiTexCoord4svARB; GLEW_FUN_EXPORT PFNGLBEGINQUERYARBPROC __glewBeginQueryARB; GLEW_FUN_EXPORT PFNGLDELETEQUERIESARBPROC __glewDeleteQueriesARB; GLEW_FUN_EXPORT PFNGLENDQUERYARBPROC __glewEndQueryARB; GLEW_FUN_EXPORT PFNGLGENQUERIESARBPROC __glewGenQueriesARB; GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTIVARBPROC __glewGetQueryObjectivARB; GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTUIVARBPROC __glewGetQueryObjectuivARB; GLEW_FUN_EXPORT PFNGLGETQUERYIVARBPROC __glewGetQueryivARB; GLEW_FUN_EXPORT PFNGLISQUERYARBPROC __glewIsQueryARB; GLEW_FUN_EXPORT PFNGLPOINTPARAMETERFARBPROC __glewPointParameterfARB; GLEW_FUN_EXPORT PFNGLPOINTPARAMETERFVARBPROC __glewPointParameterfvARB; GLEW_FUN_EXPORT PFNGLGETPROGRAMINTERFACEIVPROC __glewGetProgramInterfaceiv; GLEW_FUN_EXPORT PFNGLGETPROGRAMRESOURCEINDEXPROC __glewGetProgramResourceIndex; GLEW_FUN_EXPORT PFNGLGETPROGRAMRESOURCELOCATIONPROC __glewGetProgramResourceLocation; GLEW_FUN_EXPORT PFNGLGETPROGRAMRESOURCELOCATIONINDEXPROC __glewGetProgramResourceLocationIndex; GLEW_FUN_EXPORT PFNGLGETPROGRAMRESOURCENAMEPROC __glewGetProgramResourceName; GLEW_FUN_EXPORT PFNGLGETPROGRAMRESOURCEIVPROC __glewGetProgramResourceiv; GLEW_FUN_EXPORT PFNGLPROVOKINGVERTEXPROC __glewProvokingVertex; GLEW_FUN_EXPORT PFNGLGETGRAPHICSRESETSTATUSARBPROC __glewGetGraphicsResetStatusARB; GLEW_FUN_EXPORT PFNGLGETNCOLORTABLEARBPROC __glewGetnColorTableARB; GLEW_FUN_EXPORT PFNGLGETNCOMPRESSEDTEXIMAGEARBPROC __glewGetnCompressedTexImageARB; GLEW_FUN_EXPORT PFNGLGETNCONVOLUTIONFILTERARBPROC __glewGetnConvolutionFilterARB; GLEW_FUN_EXPORT PFNGLGETNHISTOGRAMARBPROC __glewGetnHistogramARB; GLEW_FUN_EXPORT PFNGLGETNMAPDVARBPROC __glewGetnMapdvARB; GLEW_FUN_EXPORT PFNGLGETNMAPFVARBPROC __glewGetnMapfvARB; GLEW_FUN_EXPORT PFNGLGETNMAPIVARBPROC __glewGetnMapivARB; GLEW_FUN_EXPORT PFNGLGETNMINMAXARBPROC __glewGetnMinmaxARB; GLEW_FUN_EXPORT PFNGLGETNPIXELMAPFVARBPROC __glewGetnPixelMapfvARB; GLEW_FUN_EXPORT PFNGLGETNPIXELMAPUIVARBPROC __glewGetnPixelMapuivARB; GLEW_FUN_EXPORT PFNGLGETNPIXELMAPUSVARBPROC __glewGetnPixelMapusvARB; GLEW_FUN_EXPORT PFNGLGETNPOLYGONSTIPPLEARBPROC __glewGetnPolygonStippleARB; GLEW_FUN_EXPORT PFNGLGETNSEPARABLEFILTERARBPROC __glewGetnSeparableFilterARB; GLEW_FUN_EXPORT PFNGLGETNTEXIMAGEARBPROC __glewGetnTexImageARB; GLEW_FUN_EXPORT PFNGLGETNUNIFORMDVARBPROC __glewGetnUniformdvARB; GLEW_FUN_EXPORT PFNGLGETNUNIFORMFVARBPROC __glewGetnUniformfvARB; GLEW_FUN_EXPORT PFNGLGETNUNIFORMIVARBPROC __glewGetnUniformivARB; GLEW_FUN_EXPORT PFNGLGETNUNIFORMUIVARBPROC __glewGetnUniformuivARB; GLEW_FUN_EXPORT PFNGLREADNPIXELSARBPROC __glewReadnPixelsARB; GLEW_FUN_EXPORT PFNGLMINSAMPLESHADINGARBPROC __glewMinSampleShadingARB; GLEW_FUN_EXPORT PFNGLBINDSAMPLERPROC __glewBindSampler; GLEW_FUN_EXPORT PFNGLDELETESAMPLERSPROC __glewDeleteSamplers; GLEW_FUN_EXPORT PFNGLGENSAMPLERSPROC __glewGenSamplers; GLEW_FUN_EXPORT PFNGLGETSAMPLERPARAMETERIIVPROC __glewGetSamplerParameterIiv; GLEW_FUN_EXPORT PFNGLGETSAMPLERPARAMETERIUIVPROC __glewGetSamplerParameterIuiv; GLEW_FUN_EXPORT PFNGLGETSAMPLERPARAMETERFVPROC __glewGetSamplerParameterfv; GLEW_FUN_EXPORT PFNGLGETSAMPLERPARAMETERIVPROC __glewGetSamplerParameteriv; GLEW_FUN_EXPORT PFNGLISSAMPLERPROC __glewIsSampler; GLEW_FUN_EXPORT PFNGLSAMPLERPARAMETERIIVPROC __glewSamplerParameterIiv; GLEW_FUN_EXPORT PFNGLSAMPLERPARAMETERIUIVPROC __glewSamplerParameterIuiv; GLEW_FUN_EXPORT PFNGLSAMPLERPARAMETERFPROC __glewSamplerParameterf; GLEW_FUN_EXPORT PFNGLSAMPLERPARAMETERFVPROC __glewSamplerParameterfv; GLEW_FUN_EXPORT PFNGLSAMPLERPARAMETERIPROC __glewSamplerParameteri; GLEW_FUN_EXPORT PFNGLSAMPLERPARAMETERIVPROC __glewSamplerParameteriv; GLEW_FUN_EXPORT PFNGLACTIVESHADERPROGRAMPROC __glewActiveShaderProgram; GLEW_FUN_EXPORT PFNGLBINDPROGRAMPIPELINEPROC __glewBindProgramPipeline; GLEW_FUN_EXPORT PFNGLCREATESHADERPROGRAMVPROC __glewCreateShaderProgramv; GLEW_FUN_EXPORT PFNGLDELETEPROGRAMPIPELINESPROC __glewDeleteProgramPipelines; GLEW_FUN_EXPORT PFNGLGENPROGRAMPIPELINESPROC __glewGenProgramPipelines; GLEW_FUN_EXPORT PFNGLGETPROGRAMPIPELINEINFOLOGPROC __glewGetProgramPipelineInfoLog; GLEW_FUN_EXPORT PFNGLGETPROGRAMPIPELINEIVPROC __glewGetProgramPipelineiv; GLEW_FUN_EXPORT PFNGLISPROGRAMPIPELINEPROC __glewIsProgramPipeline; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1DPROC __glewProgramUniform1d; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1DVPROC __glewProgramUniform1dv; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1FPROC __glewProgramUniform1f; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1FVPROC __glewProgramUniform1fv; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1IPROC __glewProgramUniform1i; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1IVPROC __glewProgramUniform1iv; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1UIPROC __glewProgramUniform1ui; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1UIVPROC __glewProgramUniform1uiv; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2DPROC __glewProgramUniform2d; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2DVPROC __glewProgramUniform2dv; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2FPROC __glewProgramUniform2f; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2FVPROC __glewProgramUniform2fv; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2IPROC __glewProgramUniform2i; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2IVPROC __glewProgramUniform2iv; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2UIPROC __glewProgramUniform2ui; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2UIVPROC __glewProgramUniform2uiv; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3DPROC __glewProgramUniform3d; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3DVPROC __glewProgramUniform3dv; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3FPROC __glewProgramUniform3f; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3FVPROC __glewProgramUniform3fv; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3IPROC __glewProgramUniform3i; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3IVPROC __glewProgramUniform3iv; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3UIPROC __glewProgramUniform3ui; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3UIVPROC __glewProgramUniform3uiv; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4DPROC __glewProgramUniform4d; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4DVPROC __glewProgramUniform4dv; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4FPROC __glewProgramUniform4f; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4FVPROC __glewProgramUniform4fv; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4IPROC __glewProgramUniform4i; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4IVPROC __glewProgramUniform4iv; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4UIPROC __glewProgramUniform4ui; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4UIVPROC __glewProgramUniform4uiv; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX2DVPROC __glewProgramUniformMatrix2dv; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX2FVPROC __glewProgramUniformMatrix2fv; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX2X3DVPROC __glewProgramUniformMatrix2x3dv; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX2X3FVPROC __glewProgramUniformMatrix2x3fv; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX2X4DVPROC __glewProgramUniformMatrix2x4dv; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX2X4FVPROC __glewProgramUniformMatrix2x4fv; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX3DVPROC __glewProgramUniformMatrix3dv; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX3FVPROC __glewProgramUniformMatrix3fv; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX3X2DVPROC __glewProgramUniformMatrix3x2dv; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX3X2FVPROC __glewProgramUniformMatrix3x2fv; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX3X4DVPROC __glewProgramUniformMatrix3x4dv; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX3X4FVPROC __glewProgramUniformMatrix3x4fv; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX4DVPROC __glewProgramUniformMatrix4dv; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX4FVPROC __glewProgramUniformMatrix4fv; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX4X2DVPROC __glewProgramUniformMatrix4x2dv; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX4X2FVPROC __glewProgramUniformMatrix4x2fv; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX4X3DVPROC __glewProgramUniformMatrix4x3dv; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX4X3FVPROC __glewProgramUniformMatrix4x3fv; GLEW_FUN_EXPORT PFNGLUSEPROGRAMSTAGESPROC __glewUseProgramStages; GLEW_FUN_EXPORT PFNGLVALIDATEPROGRAMPIPELINEPROC __glewValidateProgramPipeline; GLEW_FUN_EXPORT PFNGLGETACTIVEATOMICCOUNTERBUFFERIVPROC __glewGetActiveAtomicCounterBufferiv; GLEW_FUN_EXPORT PFNGLBINDIMAGETEXTUREPROC __glewBindImageTexture; GLEW_FUN_EXPORT PFNGLMEMORYBARRIERPROC __glewMemoryBarrier; GLEW_FUN_EXPORT PFNGLATTACHOBJECTARBPROC __glewAttachObjectARB; GLEW_FUN_EXPORT PFNGLCOMPILESHADERARBPROC __glewCompileShaderARB; GLEW_FUN_EXPORT PFNGLCREATEPROGRAMOBJECTARBPROC __glewCreateProgramObjectARB; GLEW_FUN_EXPORT PFNGLCREATESHADEROBJECTARBPROC __glewCreateShaderObjectARB; GLEW_FUN_EXPORT PFNGLDELETEOBJECTARBPROC __glewDeleteObjectARB; GLEW_FUN_EXPORT PFNGLDETACHOBJECTARBPROC __glewDetachObjectARB; GLEW_FUN_EXPORT PFNGLGETACTIVEUNIFORMARBPROC __glewGetActiveUniformARB; GLEW_FUN_EXPORT PFNGLGETATTACHEDOBJECTSARBPROC __glewGetAttachedObjectsARB; GLEW_FUN_EXPORT PFNGLGETHANDLEARBPROC __glewGetHandleARB; GLEW_FUN_EXPORT PFNGLGETINFOLOGARBPROC __glewGetInfoLogARB; GLEW_FUN_EXPORT PFNGLGETOBJECTPARAMETERFVARBPROC __glewGetObjectParameterfvARB; GLEW_FUN_EXPORT PFNGLGETOBJECTPARAMETERIVARBPROC __glewGetObjectParameterivARB; GLEW_FUN_EXPORT PFNGLGETSHADERSOURCEARBPROC __glewGetShaderSourceARB; GLEW_FUN_EXPORT PFNGLGETUNIFORMLOCATIONARBPROC __glewGetUniformLocationARB; GLEW_FUN_EXPORT PFNGLGETUNIFORMFVARBPROC __glewGetUniformfvARB; GLEW_FUN_EXPORT PFNGLGETUNIFORMIVARBPROC __glewGetUniformivARB; GLEW_FUN_EXPORT PFNGLLINKPROGRAMARBPROC __glewLinkProgramARB; GLEW_FUN_EXPORT PFNGLSHADERSOURCEARBPROC __glewShaderSourceARB; GLEW_FUN_EXPORT PFNGLUNIFORM1FARBPROC __glewUniform1fARB; GLEW_FUN_EXPORT PFNGLUNIFORM1FVARBPROC __glewUniform1fvARB; GLEW_FUN_EXPORT PFNGLUNIFORM1IARBPROC __glewUniform1iARB; GLEW_FUN_EXPORT PFNGLUNIFORM1IVARBPROC __glewUniform1ivARB; GLEW_FUN_EXPORT PFNGLUNIFORM2FARBPROC __glewUniform2fARB; GLEW_FUN_EXPORT PFNGLUNIFORM2FVARBPROC __glewUniform2fvARB; GLEW_FUN_EXPORT PFNGLUNIFORM2IARBPROC __glewUniform2iARB; GLEW_FUN_EXPORT PFNGLUNIFORM2IVARBPROC __glewUniform2ivARB; GLEW_FUN_EXPORT PFNGLUNIFORM3FARBPROC __glewUniform3fARB; GLEW_FUN_EXPORT PFNGLUNIFORM3FVARBPROC __glewUniform3fvARB; GLEW_FUN_EXPORT PFNGLUNIFORM3IARBPROC __glewUniform3iARB; GLEW_FUN_EXPORT PFNGLUNIFORM3IVARBPROC __glewUniform3ivARB; GLEW_FUN_EXPORT PFNGLUNIFORM4FARBPROC __glewUniform4fARB; GLEW_FUN_EXPORT PFNGLUNIFORM4FVARBPROC __glewUniform4fvARB; GLEW_FUN_EXPORT PFNGLUNIFORM4IARBPROC __glewUniform4iARB; GLEW_FUN_EXPORT PFNGLUNIFORM4IVARBPROC __glewUniform4ivARB; GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX2FVARBPROC __glewUniformMatrix2fvARB; GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX3FVARBPROC __glewUniformMatrix3fvARB; GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX4FVARBPROC __glewUniformMatrix4fvARB; GLEW_FUN_EXPORT PFNGLUSEPROGRAMOBJECTARBPROC __glewUseProgramObjectARB; GLEW_FUN_EXPORT PFNGLVALIDATEPROGRAMARBPROC __glewValidateProgramARB; GLEW_FUN_EXPORT PFNGLSHADERSTORAGEBLOCKBINDINGPROC __glewShaderStorageBlockBinding; GLEW_FUN_EXPORT PFNGLGETACTIVESUBROUTINENAMEPROC __glewGetActiveSubroutineName; GLEW_FUN_EXPORT PFNGLGETACTIVESUBROUTINEUNIFORMNAMEPROC __glewGetActiveSubroutineUniformName; GLEW_FUN_EXPORT PFNGLGETACTIVESUBROUTINEUNIFORMIVPROC __glewGetActiveSubroutineUniformiv; GLEW_FUN_EXPORT PFNGLGETPROGRAMSTAGEIVPROC __glewGetProgramStageiv; GLEW_FUN_EXPORT PFNGLGETSUBROUTINEINDEXPROC __glewGetSubroutineIndex; GLEW_FUN_EXPORT PFNGLGETSUBROUTINEUNIFORMLOCATIONPROC __glewGetSubroutineUniformLocation; GLEW_FUN_EXPORT PFNGLGETUNIFORMSUBROUTINEUIVPROC __glewGetUniformSubroutineuiv; GLEW_FUN_EXPORT PFNGLUNIFORMSUBROUTINESUIVPROC __glewUniformSubroutinesuiv; GLEW_FUN_EXPORT PFNGLCOMPILESHADERINCLUDEARBPROC __glewCompileShaderIncludeARB; GLEW_FUN_EXPORT PFNGLDELETENAMEDSTRINGARBPROC __glewDeleteNamedStringARB; GLEW_FUN_EXPORT PFNGLGETNAMEDSTRINGARBPROC __glewGetNamedStringARB; GLEW_FUN_EXPORT PFNGLGETNAMEDSTRINGIVARBPROC __glewGetNamedStringivARB; GLEW_FUN_EXPORT PFNGLISNAMEDSTRINGARBPROC __glewIsNamedStringARB; GLEW_FUN_EXPORT PFNGLNAMEDSTRINGARBPROC __glewNamedStringARB; GLEW_FUN_EXPORT PFNGLCLIENTWAITSYNCPROC __glewClientWaitSync; GLEW_FUN_EXPORT PFNGLDELETESYNCPROC __glewDeleteSync; GLEW_FUN_EXPORT PFNGLFENCESYNCPROC __glewFenceSync; GLEW_FUN_EXPORT PFNGLGETINTEGER64VPROC __glewGetInteger64v; GLEW_FUN_EXPORT PFNGLGETSYNCIVPROC __glewGetSynciv; GLEW_FUN_EXPORT PFNGLISSYNCPROC __glewIsSync; GLEW_FUN_EXPORT PFNGLWAITSYNCPROC __glewWaitSync; GLEW_FUN_EXPORT PFNGLPATCHPARAMETERFVPROC __glewPatchParameterfv; GLEW_FUN_EXPORT PFNGLPATCHPARAMETERIPROC __glewPatchParameteri; GLEW_FUN_EXPORT PFNGLTEXBUFFERARBPROC __glewTexBufferARB; GLEW_FUN_EXPORT PFNGLTEXBUFFERRANGEPROC __glewTexBufferRange; GLEW_FUN_EXPORT PFNGLTEXTUREBUFFERRANGEEXTPROC __glewTextureBufferRangeEXT; GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXIMAGE1DARBPROC __glewCompressedTexImage1DARB; GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXIMAGE2DARBPROC __glewCompressedTexImage2DARB; GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXIMAGE3DARBPROC __glewCompressedTexImage3DARB; GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXSUBIMAGE1DARBPROC __glewCompressedTexSubImage1DARB; GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXSUBIMAGE2DARBPROC __glewCompressedTexSubImage2DARB; GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXSUBIMAGE3DARBPROC __glewCompressedTexSubImage3DARB; GLEW_FUN_EXPORT PFNGLGETCOMPRESSEDTEXIMAGEARBPROC __glewGetCompressedTexImageARB; GLEW_FUN_EXPORT PFNGLGETMULTISAMPLEFVPROC __glewGetMultisamplefv; GLEW_FUN_EXPORT PFNGLSAMPLEMASKIPROC __glewSampleMaski; GLEW_FUN_EXPORT PFNGLTEXIMAGE2DMULTISAMPLEPROC __glewTexImage2DMultisample; GLEW_FUN_EXPORT PFNGLTEXIMAGE3DMULTISAMPLEPROC __glewTexImage3DMultisample; GLEW_FUN_EXPORT PFNGLTEXSTORAGE1DPROC __glewTexStorage1D; GLEW_FUN_EXPORT PFNGLTEXSTORAGE2DPROC __glewTexStorage2D; GLEW_FUN_EXPORT PFNGLTEXSTORAGE3DPROC __glewTexStorage3D; GLEW_FUN_EXPORT PFNGLTEXTURESTORAGE1DEXTPROC __glewTextureStorage1DEXT; GLEW_FUN_EXPORT PFNGLTEXTURESTORAGE2DEXTPROC __glewTextureStorage2DEXT; GLEW_FUN_EXPORT PFNGLTEXTURESTORAGE3DEXTPROC __glewTextureStorage3DEXT; GLEW_FUN_EXPORT PFNGLTEXSTORAGE2DMULTISAMPLEPROC __glewTexStorage2DMultisample; GLEW_FUN_EXPORT PFNGLTEXSTORAGE3DMULTISAMPLEPROC __glewTexStorage3DMultisample; GLEW_FUN_EXPORT PFNGLTEXTURESTORAGE2DMULTISAMPLEEXTPROC __glewTextureStorage2DMultisampleEXT; GLEW_FUN_EXPORT PFNGLTEXTURESTORAGE3DMULTISAMPLEEXTPROC __glewTextureStorage3DMultisampleEXT; GLEW_FUN_EXPORT PFNGLTEXTUREVIEWPROC __glewTextureView; GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTI64VPROC __glewGetQueryObjecti64v; GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTUI64VPROC __glewGetQueryObjectui64v; GLEW_FUN_EXPORT PFNGLQUERYCOUNTERPROC __glewQueryCounter; GLEW_FUN_EXPORT PFNGLBINDTRANSFORMFEEDBACKPROC __glewBindTransformFeedback; GLEW_FUN_EXPORT PFNGLDELETETRANSFORMFEEDBACKSPROC __glewDeleteTransformFeedbacks; GLEW_FUN_EXPORT PFNGLDRAWTRANSFORMFEEDBACKPROC __glewDrawTransformFeedback; GLEW_FUN_EXPORT PFNGLGENTRANSFORMFEEDBACKSPROC __glewGenTransformFeedbacks; GLEW_FUN_EXPORT PFNGLISTRANSFORMFEEDBACKPROC __glewIsTransformFeedback; GLEW_FUN_EXPORT PFNGLPAUSETRANSFORMFEEDBACKPROC __glewPauseTransformFeedback; GLEW_FUN_EXPORT PFNGLRESUMETRANSFORMFEEDBACKPROC __glewResumeTransformFeedback; GLEW_FUN_EXPORT PFNGLBEGINQUERYINDEXEDPROC __glewBeginQueryIndexed; GLEW_FUN_EXPORT PFNGLDRAWTRANSFORMFEEDBACKSTREAMPROC __glewDrawTransformFeedbackStream; GLEW_FUN_EXPORT PFNGLENDQUERYINDEXEDPROC __glewEndQueryIndexed; GLEW_FUN_EXPORT PFNGLGETQUERYINDEXEDIVPROC __glewGetQueryIndexediv; GLEW_FUN_EXPORT PFNGLDRAWTRANSFORMFEEDBACKINSTANCEDPROC __glewDrawTransformFeedbackInstanced; GLEW_FUN_EXPORT PFNGLDRAWTRANSFORMFEEDBACKSTREAMINSTANCEDPROC __glewDrawTransformFeedbackStreamInstanced; GLEW_FUN_EXPORT PFNGLLOADTRANSPOSEMATRIXDARBPROC __glewLoadTransposeMatrixdARB; GLEW_FUN_EXPORT PFNGLLOADTRANSPOSEMATRIXFARBPROC __glewLoadTransposeMatrixfARB; GLEW_FUN_EXPORT PFNGLMULTTRANSPOSEMATRIXDARBPROC __glewMultTransposeMatrixdARB; GLEW_FUN_EXPORT PFNGLMULTTRANSPOSEMATRIXFARBPROC __glewMultTransposeMatrixfARB; GLEW_FUN_EXPORT PFNGLBINDBUFFERBASEPROC __glewBindBufferBase; GLEW_FUN_EXPORT PFNGLBINDBUFFERRANGEPROC __glewBindBufferRange; GLEW_FUN_EXPORT PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC __glewGetActiveUniformBlockName; GLEW_FUN_EXPORT PFNGLGETACTIVEUNIFORMBLOCKIVPROC __glewGetActiveUniformBlockiv; GLEW_FUN_EXPORT PFNGLGETACTIVEUNIFORMNAMEPROC __glewGetActiveUniformName; GLEW_FUN_EXPORT PFNGLGETACTIVEUNIFORMSIVPROC __glewGetActiveUniformsiv; GLEW_FUN_EXPORT PFNGLGETINTEGERI_VPROC __glewGetIntegeri_v; GLEW_FUN_EXPORT PFNGLGETUNIFORMBLOCKINDEXPROC __glewGetUniformBlockIndex; GLEW_FUN_EXPORT PFNGLGETUNIFORMINDICESPROC __glewGetUniformIndices; GLEW_FUN_EXPORT PFNGLUNIFORMBLOCKBINDINGPROC __glewUniformBlockBinding; GLEW_FUN_EXPORT PFNGLBINDVERTEXARRAYPROC __glewBindVertexArray; GLEW_FUN_EXPORT PFNGLDELETEVERTEXARRAYSPROC __glewDeleteVertexArrays; GLEW_FUN_EXPORT PFNGLGENVERTEXARRAYSPROC __glewGenVertexArrays; GLEW_FUN_EXPORT PFNGLISVERTEXARRAYPROC __glewIsVertexArray; GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBLDVPROC __glewGetVertexAttribLdv; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL1DPROC __glewVertexAttribL1d; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL1DVPROC __glewVertexAttribL1dv; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL2DPROC __glewVertexAttribL2d; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL2DVPROC __glewVertexAttribL2dv; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL3DPROC __glewVertexAttribL3d; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL3DVPROC __glewVertexAttribL3dv; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL4DPROC __glewVertexAttribL4d; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL4DVPROC __glewVertexAttribL4dv; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBLPOINTERPROC __glewVertexAttribLPointer; GLEW_FUN_EXPORT PFNGLBINDVERTEXBUFFERPROC __glewBindVertexBuffer; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBBINDINGPROC __glewVertexAttribBinding; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBFORMATPROC __glewVertexAttribFormat; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBIFORMATPROC __glewVertexAttribIFormat; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBLFORMATPROC __glewVertexAttribLFormat; GLEW_FUN_EXPORT PFNGLVERTEXBINDINGDIVISORPROC __glewVertexBindingDivisor; GLEW_FUN_EXPORT PFNGLVERTEXBLENDARBPROC __glewVertexBlendARB; GLEW_FUN_EXPORT PFNGLWEIGHTPOINTERARBPROC __glewWeightPointerARB; GLEW_FUN_EXPORT PFNGLWEIGHTBVARBPROC __glewWeightbvARB; GLEW_FUN_EXPORT PFNGLWEIGHTDVARBPROC __glewWeightdvARB; GLEW_FUN_EXPORT PFNGLWEIGHTFVARBPROC __glewWeightfvARB; GLEW_FUN_EXPORT PFNGLWEIGHTIVARBPROC __glewWeightivARB; GLEW_FUN_EXPORT PFNGLWEIGHTSVARBPROC __glewWeightsvARB; GLEW_FUN_EXPORT PFNGLWEIGHTUBVARBPROC __glewWeightubvARB; GLEW_FUN_EXPORT PFNGLWEIGHTUIVARBPROC __glewWeightuivARB; GLEW_FUN_EXPORT PFNGLWEIGHTUSVARBPROC __glewWeightusvARB; GLEW_FUN_EXPORT PFNGLBINDBUFFERARBPROC __glewBindBufferARB; GLEW_FUN_EXPORT PFNGLBUFFERDATAARBPROC __glewBufferDataARB; GLEW_FUN_EXPORT PFNGLBUFFERSUBDATAARBPROC __glewBufferSubDataARB; GLEW_FUN_EXPORT PFNGLDELETEBUFFERSARBPROC __glewDeleteBuffersARB; GLEW_FUN_EXPORT PFNGLGENBUFFERSARBPROC __glewGenBuffersARB; GLEW_FUN_EXPORT PFNGLGETBUFFERPARAMETERIVARBPROC __glewGetBufferParameterivARB; GLEW_FUN_EXPORT PFNGLGETBUFFERPOINTERVARBPROC __glewGetBufferPointervARB; GLEW_FUN_EXPORT PFNGLGETBUFFERSUBDATAARBPROC __glewGetBufferSubDataARB; GLEW_FUN_EXPORT PFNGLISBUFFERARBPROC __glewIsBufferARB; GLEW_FUN_EXPORT PFNGLMAPBUFFERARBPROC __glewMapBufferARB; GLEW_FUN_EXPORT PFNGLUNMAPBUFFERARBPROC __glewUnmapBufferARB; GLEW_FUN_EXPORT PFNGLBINDPROGRAMARBPROC __glewBindProgramARB; GLEW_FUN_EXPORT PFNGLDELETEPROGRAMSARBPROC __glewDeleteProgramsARB; GLEW_FUN_EXPORT PFNGLDISABLEVERTEXATTRIBARRAYARBPROC __glewDisableVertexAttribArrayARB; GLEW_FUN_EXPORT PFNGLENABLEVERTEXATTRIBARRAYARBPROC __glewEnableVertexAttribArrayARB; GLEW_FUN_EXPORT PFNGLGENPROGRAMSARBPROC __glewGenProgramsARB; GLEW_FUN_EXPORT PFNGLGETPROGRAMENVPARAMETERDVARBPROC __glewGetProgramEnvParameterdvARB; GLEW_FUN_EXPORT PFNGLGETPROGRAMENVPARAMETERFVARBPROC __glewGetProgramEnvParameterfvARB; GLEW_FUN_EXPORT PFNGLGETPROGRAMLOCALPARAMETERDVARBPROC __glewGetProgramLocalParameterdvARB; GLEW_FUN_EXPORT PFNGLGETPROGRAMLOCALPARAMETERFVARBPROC __glewGetProgramLocalParameterfvARB; GLEW_FUN_EXPORT PFNGLGETPROGRAMSTRINGARBPROC __glewGetProgramStringARB; GLEW_FUN_EXPORT PFNGLGETPROGRAMIVARBPROC __glewGetProgramivARB; GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBPOINTERVARBPROC __glewGetVertexAttribPointervARB; GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBDVARBPROC __glewGetVertexAttribdvARB; GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBFVARBPROC __glewGetVertexAttribfvARB; GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBIVARBPROC __glewGetVertexAttribivARB; GLEW_FUN_EXPORT PFNGLISPROGRAMARBPROC __glewIsProgramARB; GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETER4DARBPROC __glewProgramEnvParameter4dARB; GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETER4DVARBPROC __glewProgramEnvParameter4dvARB; GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETER4FARBPROC __glewProgramEnvParameter4fARB; GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETER4FVARBPROC __glewProgramEnvParameter4fvARB; GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETER4DARBPROC __glewProgramLocalParameter4dARB; GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETER4DVARBPROC __glewProgramLocalParameter4dvARB; GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETER4FARBPROC __glewProgramLocalParameter4fARB; GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETER4FVARBPROC __glewProgramLocalParameter4fvARB; GLEW_FUN_EXPORT PFNGLPROGRAMSTRINGARBPROC __glewProgramStringARB; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1DARBPROC __glewVertexAttrib1dARB; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1DVARBPROC __glewVertexAttrib1dvARB; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1FARBPROC __glewVertexAttrib1fARB; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1FVARBPROC __glewVertexAttrib1fvARB; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1SARBPROC __glewVertexAttrib1sARB; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1SVARBPROC __glewVertexAttrib1svARB; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2DARBPROC __glewVertexAttrib2dARB; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2DVARBPROC __glewVertexAttrib2dvARB; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2FARBPROC __glewVertexAttrib2fARB; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2FVARBPROC __glewVertexAttrib2fvARB; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2SARBPROC __glewVertexAttrib2sARB; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2SVARBPROC __glewVertexAttrib2svARB; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3DARBPROC __glewVertexAttrib3dARB; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3DVARBPROC __glewVertexAttrib3dvARB; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3FARBPROC __glewVertexAttrib3fARB; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3FVARBPROC __glewVertexAttrib3fvARB; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3SARBPROC __glewVertexAttrib3sARB; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3SVARBPROC __glewVertexAttrib3svARB; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NBVARBPROC __glewVertexAttrib4NbvARB; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NIVARBPROC __glewVertexAttrib4NivARB; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NSVARBPROC __glewVertexAttrib4NsvARB; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NUBARBPROC __glewVertexAttrib4NubARB; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NUBVARBPROC __glewVertexAttrib4NubvARB; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NUIVARBPROC __glewVertexAttrib4NuivARB; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NUSVARBPROC __glewVertexAttrib4NusvARB; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4BVARBPROC __glewVertexAttrib4bvARB; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4DARBPROC __glewVertexAttrib4dARB; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4DVARBPROC __glewVertexAttrib4dvARB; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4FARBPROC __glewVertexAttrib4fARB; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4FVARBPROC __glewVertexAttrib4fvARB; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4IVARBPROC __glewVertexAttrib4ivARB; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4SARBPROC __glewVertexAttrib4sARB; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4SVARBPROC __glewVertexAttrib4svARB; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4UBVARBPROC __glewVertexAttrib4ubvARB; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4UIVARBPROC __glewVertexAttrib4uivARB; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4USVARBPROC __glewVertexAttrib4usvARB; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBPOINTERARBPROC __glewVertexAttribPointerARB; GLEW_FUN_EXPORT PFNGLBINDATTRIBLOCATIONARBPROC __glewBindAttribLocationARB; GLEW_FUN_EXPORT PFNGLGETACTIVEATTRIBARBPROC __glewGetActiveAttribARB; GLEW_FUN_EXPORT PFNGLGETATTRIBLOCATIONARBPROC __glewGetAttribLocationARB; GLEW_FUN_EXPORT PFNGLCOLORP3UIPROC __glewColorP3ui; GLEW_FUN_EXPORT PFNGLCOLORP3UIVPROC __glewColorP3uiv; GLEW_FUN_EXPORT PFNGLCOLORP4UIPROC __glewColorP4ui; GLEW_FUN_EXPORT PFNGLCOLORP4UIVPROC __glewColorP4uiv; GLEW_FUN_EXPORT PFNGLMULTITEXCOORDP1UIPROC __glewMultiTexCoordP1ui; GLEW_FUN_EXPORT PFNGLMULTITEXCOORDP1UIVPROC __glewMultiTexCoordP1uiv; GLEW_FUN_EXPORT PFNGLMULTITEXCOORDP2UIPROC __glewMultiTexCoordP2ui; GLEW_FUN_EXPORT PFNGLMULTITEXCOORDP2UIVPROC __glewMultiTexCoordP2uiv; GLEW_FUN_EXPORT PFNGLMULTITEXCOORDP3UIPROC __glewMultiTexCoordP3ui; GLEW_FUN_EXPORT PFNGLMULTITEXCOORDP3UIVPROC __glewMultiTexCoordP3uiv; GLEW_FUN_EXPORT PFNGLMULTITEXCOORDP4UIPROC __glewMultiTexCoordP4ui; GLEW_FUN_EXPORT PFNGLMULTITEXCOORDP4UIVPROC __glewMultiTexCoordP4uiv; GLEW_FUN_EXPORT PFNGLNORMALP3UIPROC __glewNormalP3ui; GLEW_FUN_EXPORT PFNGLNORMALP3UIVPROC __glewNormalP3uiv; GLEW_FUN_EXPORT PFNGLSECONDARYCOLORP3UIPROC __glewSecondaryColorP3ui; GLEW_FUN_EXPORT PFNGLSECONDARYCOLORP3UIVPROC __glewSecondaryColorP3uiv; GLEW_FUN_EXPORT PFNGLTEXCOORDP1UIPROC __glewTexCoordP1ui; GLEW_FUN_EXPORT PFNGLTEXCOORDP1UIVPROC __glewTexCoordP1uiv; GLEW_FUN_EXPORT PFNGLTEXCOORDP2UIPROC __glewTexCoordP2ui; GLEW_FUN_EXPORT PFNGLTEXCOORDP2UIVPROC __glewTexCoordP2uiv; GLEW_FUN_EXPORT PFNGLTEXCOORDP3UIPROC __glewTexCoordP3ui; GLEW_FUN_EXPORT PFNGLTEXCOORDP3UIVPROC __glewTexCoordP3uiv; GLEW_FUN_EXPORT PFNGLTEXCOORDP4UIPROC __glewTexCoordP4ui; GLEW_FUN_EXPORT PFNGLTEXCOORDP4UIVPROC __glewTexCoordP4uiv; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBP1UIPROC __glewVertexAttribP1ui; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBP1UIVPROC __glewVertexAttribP1uiv; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBP2UIPROC __glewVertexAttribP2ui; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBP2UIVPROC __glewVertexAttribP2uiv; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBP3UIPROC __glewVertexAttribP3ui; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBP3UIVPROC __glewVertexAttribP3uiv; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBP4UIPROC __glewVertexAttribP4ui; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBP4UIVPROC __glewVertexAttribP4uiv; GLEW_FUN_EXPORT PFNGLVERTEXP2UIPROC __glewVertexP2ui; GLEW_FUN_EXPORT PFNGLVERTEXP2UIVPROC __glewVertexP2uiv; GLEW_FUN_EXPORT PFNGLVERTEXP3UIPROC __glewVertexP3ui; GLEW_FUN_EXPORT PFNGLVERTEXP3UIVPROC __glewVertexP3uiv; GLEW_FUN_EXPORT PFNGLVERTEXP4UIPROC __glewVertexP4ui; GLEW_FUN_EXPORT PFNGLVERTEXP4UIVPROC __glewVertexP4uiv; GLEW_FUN_EXPORT PFNGLDEPTHRANGEARRAYVPROC __glewDepthRangeArrayv; GLEW_FUN_EXPORT PFNGLDEPTHRANGEINDEXEDPROC __glewDepthRangeIndexed; GLEW_FUN_EXPORT PFNGLGETDOUBLEI_VPROC __glewGetDoublei_v; GLEW_FUN_EXPORT PFNGLGETFLOATI_VPROC __glewGetFloati_v; GLEW_FUN_EXPORT PFNGLSCISSORARRAYVPROC __glewScissorArrayv; GLEW_FUN_EXPORT PFNGLSCISSORINDEXEDPROC __glewScissorIndexed; GLEW_FUN_EXPORT PFNGLSCISSORINDEXEDVPROC __glewScissorIndexedv; GLEW_FUN_EXPORT PFNGLVIEWPORTARRAYVPROC __glewViewportArrayv; GLEW_FUN_EXPORT PFNGLVIEWPORTINDEXEDFPROC __glewViewportIndexedf; GLEW_FUN_EXPORT PFNGLVIEWPORTINDEXEDFVPROC __glewViewportIndexedfv; GLEW_FUN_EXPORT PFNGLWINDOWPOS2DARBPROC __glewWindowPos2dARB; GLEW_FUN_EXPORT PFNGLWINDOWPOS2DVARBPROC __glewWindowPos2dvARB; GLEW_FUN_EXPORT PFNGLWINDOWPOS2FARBPROC __glewWindowPos2fARB; GLEW_FUN_EXPORT PFNGLWINDOWPOS2FVARBPROC __glewWindowPos2fvARB; GLEW_FUN_EXPORT PFNGLWINDOWPOS2IARBPROC __glewWindowPos2iARB; GLEW_FUN_EXPORT PFNGLWINDOWPOS2IVARBPROC __glewWindowPos2ivARB; GLEW_FUN_EXPORT PFNGLWINDOWPOS2SARBPROC __glewWindowPos2sARB; GLEW_FUN_EXPORT PFNGLWINDOWPOS2SVARBPROC __glewWindowPos2svARB; GLEW_FUN_EXPORT PFNGLWINDOWPOS3DARBPROC __glewWindowPos3dARB; GLEW_FUN_EXPORT PFNGLWINDOWPOS3DVARBPROC __glewWindowPos3dvARB; GLEW_FUN_EXPORT PFNGLWINDOWPOS3FARBPROC __glewWindowPos3fARB; GLEW_FUN_EXPORT PFNGLWINDOWPOS3FVARBPROC __glewWindowPos3fvARB; GLEW_FUN_EXPORT PFNGLWINDOWPOS3IARBPROC __glewWindowPos3iARB; GLEW_FUN_EXPORT PFNGLWINDOWPOS3IVARBPROC __glewWindowPos3ivARB; GLEW_FUN_EXPORT PFNGLWINDOWPOS3SARBPROC __glewWindowPos3sARB; GLEW_FUN_EXPORT PFNGLWINDOWPOS3SVARBPROC __glewWindowPos3svARB; GLEW_FUN_EXPORT PFNGLDRAWBUFFERSATIPROC __glewDrawBuffersATI; GLEW_FUN_EXPORT PFNGLDRAWELEMENTARRAYATIPROC __glewDrawElementArrayATI; GLEW_FUN_EXPORT PFNGLDRAWRANGEELEMENTARRAYATIPROC __glewDrawRangeElementArrayATI; GLEW_FUN_EXPORT PFNGLELEMENTPOINTERATIPROC __glewElementPointerATI; GLEW_FUN_EXPORT PFNGLGETTEXBUMPPARAMETERFVATIPROC __glewGetTexBumpParameterfvATI; GLEW_FUN_EXPORT PFNGLGETTEXBUMPPARAMETERIVATIPROC __glewGetTexBumpParameterivATI; GLEW_FUN_EXPORT PFNGLTEXBUMPPARAMETERFVATIPROC __glewTexBumpParameterfvATI; GLEW_FUN_EXPORT PFNGLTEXBUMPPARAMETERIVATIPROC __glewTexBumpParameterivATI; GLEW_FUN_EXPORT PFNGLALPHAFRAGMENTOP1ATIPROC __glewAlphaFragmentOp1ATI; GLEW_FUN_EXPORT PFNGLALPHAFRAGMENTOP2ATIPROC __glewAlphaFragmentOp2ATI; GLEW_FUN_EXPORT PFNGLALPHAFRAGMENTOP3ATIPROC __glewAlphaFragmentOp3ATI; GLEW_FUN_EXPORT PFNGLBEGINFRAGMENTSHADERATIPROC __glewBeginFragmentShaderATI; GLEW_FUN_EXPORT PFNGLBINDFRAGMENTSHADERATIPROC __glewBindFragmentShaderATI; GLEW_FUN_EXPORT PFNGLCOLORFRAGMENTOP1ATIPROC __glewColorFragmentOp1ATI; GLEW_FUN_EXPORT PFNGLCOLORFRAGMENTOP2ATIPROC __glewColorFragmentOp2ATI; GLEW_FUN_EXPORT PFNGLCOLORFRAGMENTOP3ATIPROC __glewColorFragmentOp3ATI; GLEW_FUN_EXPORT PFNGLDELETEFRAGMENTSHADERATIPROC __glewDeleteFragmentShaderATI; GLEW_FUN_EXPORT PFNGLENDFRAGMENTSHADERATIPROC __glewEndFragmentShaderATI; GLEW_FUN_EXPORT PFNGLGENFRAGMENTSHADERSATIPROC __glewGenFragmentShadersATI; GLEW_FUN_EXPORT PFNGLPASSTEXCOORDATIPROC __glewPassTexCoordATI; GLEW_FUN_EXPORT PFNGLSAMPLEMAPATIPROC __glewSampleMapATI; GLEW_FUN_EXPORT PFNGLSETFRAGMENTSHADERCONSTANTATIPROC __glewSetFragmentShaderConstantATI; GLEW_FUN_EXPORT PFNGLMAPOBJECTBUFFERATIPROC __glewMapObjectBufferATI; GLEW_FUN_EXPORT PFNGLUNMAPOBJECTBUFFERATIPROC __glewUnmapObjectBufferATI; GLEW_FUN_EXPORT PFNGLPNTRIANGLESFATIPROC __glewPNTrianglesfATI; GLEW_FUN_EXPORT PFNGLPNTRIANGLESIATIPROC __glewPNTrianglesiATI; GLEW_FUN_EXPORT PFNGLSTENCILFUNCSEPARATEATIPROC __glewStencilFuncSeparateATI; GLEW_FUN_EXPORT PFNGLSTENCILOPSEPARATEATIPROC __glewStencilOpSeparateATI; GLEW_FUN_EXPORT PFNGLARRAYOBJECTATIPROC __glewArrayObjectATI; GLEW_FUN_EXPORT PFNGLFREEOBJECTBUFFERATIPROC __glewFreeObjectBufferATI; GLEW_FUN_EXPORT PFNGLGETARRAYOBJECTFVATIPROC __glewGetArrayObjectfvATI; GLEW_FUN_EXPORT PFNGLGETARRAYOBJECTIVATIPROC __glewGetArrayObjectivATI; GLEW_FUN_EXPORT PFNGLGETOBJECTBUFFERFVATIPROC __glewGetObjectBufferfvATI; GLEW_FUN_EXPORT PFNGLGETOBJECTBUFFERIVATIPROC __glewGetObjectBufferivATI; GLEW_FUN_EXPORT PFNGLGETVARIANTARRAYOBJECTFVATIPROC __glewGetVariantArrayObjectfvATI; GLEW_FUN_EXPORT PFNGLGETVARIANTARRAYOBJECTIVATIPROC __glewGetVariantArrayObjectivATI; GLEW_FUN_EXPORT PFNGLISOBJECTBUFFERATIPROC __glewIsObjectBufferATI; GLEW_FUN_EXPORT PFNGLNEWOBJECTBUFFERATIPROC __glewNewObjectBufferATI; GLEW_FUN_EXPORT PFNGLUPDATEOBJECTBUFFERATIPROC __glewUpdateObjectBufferATI; GLEW_FUN_EXPORT PFNGLVARIANTARRAYOBJECTATIPROC __glewVariantArrayObjectATI; GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBARRAYOBJECTFVATIPROC __glewGetVertexAttribArrayObjectfvATI; GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBARRAYOBJECTIVATIPROC __glewGetVertexAttribArrayObjectivATI; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBARRAYOBJECTATIPROC __glewVertexAttribArrayObjectATI; GLEW_FUN_EXPORT PFNGLCLIENTACTIVEVERTEXSTREAMATIPROC __glewClientActiveVertexStreamATI; GLEW_FUN_EXPORT PFNGLNORMALSTREAM3BATIPROC __glewNormalStream3bATI; GLEW_FUN_EXPORT PFNGLNORMALSTREAM3BVATIPROC __glewNormalStream3bvATI; GLEW_FUN_EXPORT PFNGLNORMALSTREAM3DATIPROC __glewNormalStream3dATI; GLEW_FUN_EXPORT PFNGLNORMALSTREAM3DVATIPROC __glewNormalStream3dvATI; GLEW_FUN_EXPORT PFNGLNORMALSTREAM3FATIPROC __glewNormalStream3fATI; GLEW_FUN_EXPORT PFNGLNORMALSTREAM3FVATIPROC __glewNormalStream3fvATI; GLEW_FUN_EXPORT PFNGLNORMALSTREAM3IATIPROC __glewNormalStream3iATI; GLEW_FUN_EXPORT PFNGLNORMALSTREAM3IVATIPROC __glewNormalStream3ivATI; GLEW_FUN_EXPORT PFNGLNORMALSTREAM3SATIPROC __glewNormalStream3sATI; GLEW_FUN_EXPORT PFNGLNORMALSTREAM3SVATIPROC __glewNormalStream3svATI; GLEW_FUN_EXPORT PFNGLVERTEXBLENDENVFATIPROC __glewVertexBlendEnvfATI; GLEW_FUN_EXPORT PFNGLVERTEXBLENDENVIATIPROC __glewVertexBlendEnviATI; GLEW_FUN_EXPORT PFNGLVERTEXSTREAM1DATIPROC __glewVertexStream1dATI; GLEW_FUN_EXPORT PFNGLVERTEXSTREAM1DVATIPROC __glewVertexStream1dvATI; GLEW_FUN_EXPORT PFNGLVERTEXSTREAM1FATIPROC __glewVertexStream1fATI; GLEW_FUN_EXPORT PFNGLVERTEXSTREAM1FVATIPROC __glewVertexStream1fvATI; GLEW_FUN_EXPORT PFNGLVERTEXSTREAM1IATIPROC __glewVertexStream1iATI; GLEW_FUN_EXPORT PFNGLVERTEXSTREAM1IVATIPROC __glewVertexStream1ivATI; GLEW_FUN_EXPORT PFNGLVERTEXSTREAM1SATIPROC __glewVertexStream1sATI; GLEW_FUN_EXPORT PFNGLVERTEXSTREAM1SVATIPROC __glewVertexStream1svATI; GLEW_FUN_EXPORT PFNGLVERTEXSTREAM2DATIPROC __glewVertexStream2dATI; GLEW_FUN_EXPORT PFNGLVERTEXSTREAM2DVATIPROC __glewVertexStream2dvATI; GLEW_FUN_EXPORT PFNGLVERTEXSTREAM2FATIPROC __glewVertexStream2fATI; GLEW_FUN_EXPORT PFNGLVERTEXSTREAM2FVATIPROC __glewVertexStream2fvATI; GLEW_FUN_EXPORT PFNGLVERTEXSTREAM2IATIPROC __glewVertexStream2iATI; GLEW_FUN_EXPORT PFNGLVERTEXSTREAM2IVATIPROC __glewVertexStream2ivATI; GLEW_FUN_EXPORT PFNGLVERTEXSTREAM2SATIPROC __glewVertexStream2sATI; GLEW_FUN_EXPORT PFNGLVERTEXSTREAM2SVATIPROC __glewVertexStream2svATI; GLEW_FUN_EXPORT PFNGLVERTEXSTREAM3DATIPROC __glewVertexStream3dATI; GLEW_FUN_EXPORT PFNGLVERTEXSTREAM3DVATIPROC __glewVertexStream3dvATI; GLEW_FUN_EXPORT PFNGLVERTEXSTREAM3FATIPROC __glewVertexStream3fATI; GLEW_FUN_EXPORT PFNGLVERTEXSTREAM3FVATIPROC __glewVertexStream3fvATI; GLEW_FUN_EXPORT PFNGLVERTEXSTREAM3IATIPROC __glewVertexStream3iATI; GLEW_FUN_EXPORT PFNGLVERTEXSTREAM3IVATIPROC __glewVertexStream3ivATI; GLEW_FUN_EXPORT PFNGLVERTEXSTREAM3SATIPROC __glewVertexStream3sATI; GLEW_FUN_EXPORT PFNGLVERTEXSTREAM3SVATIPROC __glewVertexStream3svATI; GLEW_FUN_EXPORT PFNGLVERTEXSTREAM4DATIPROC __glewVertexStream4dATI; GLEW_FUN_EXPORT PFNGLVERTEXSTREAM4DVATIPROC __glewVertexStream4dvATI; GLEW_FUN_EXPORT PFNGLVERTEXSTREAM4FATIPROC __glewVertexStream4fATI; GLEW_FUN_EXPORT PFNGLVERTEXSTREAM4FVATIPROC __glewVertexStream4fvATI; GLEW_FUN_EXPORT PFNGLVERTEXSTREAM4IATIPROC __glewVertexStream4iATI; GLEW_FUN_EXPORT PFNGLVERTEXSTREAM4IVATIPROC __glewVertexStream4ivATI; GLEW_FUN_EXPORT PFNGLVERTEXSTREAM4SATIPROC __glewVertexStream4sATI; GLEW_FUN_EXPORT PFNGLVERTEXSTREAM4SVATIPROC __glewVertexStream4svATI; GLEW_FUN_EXPORT PFNGLGETUNIFORMBUFFERSIZEEXTPROC __glewGetUniformBufferSizeEXT; GLEW_FUN_EXPORT PFNGLGETUNIFORMOFFSETEXTPROC __glewGetUniformOffsetEXT; GLEW_FUN_EXPORT PFNGLUNIFORMBUFFEREXTPROC __glewUniformBufferEXT; GLEW_FUN_EXPORT PFNGLBLENDCOLOREXTPROC __glewBlendColorEXT; GLEW_FUN_EXPORT PFNGLBLENDEQUATIONSEPARATEEXTPROC __glewBlendEquationSeparateEXT; GLEW_FUN_EXPORT PFNGLBLENDFUNCSEPARATEEXTPROC __glewBlendFuncSeparateEXT; GLEW_FUN_EXPORT PFNGLBLENDEQUATIONEXTPROC __glewBlendEquationEXT; GLEW_FUN_EXPORT PFNGLCOLORSUBTABLEEXTPROC __glewColorSubTableEXT; GLEW_FUN_EXPORT PFNGLCOPYCOLORSUBTABLEEXTPROC __glewCopyColorSubTableEXT; GLEW_FUN_EXPORT PFNGLLOCKARRAYSEXTPROC __glewLockArraysEXT; GLEW_FUN_EXPORT PFNGLUNLOCKARRAYSEXTPROC __glewUnlockArraysEXT; GLEW_FUN_EXPORT PFNGLCONVOLUTIONFILTER1DEXTPROC __glewConvolutionFilter1DEXT; GLEW_FUN_EXPORT PFNGLCONVOLUTIONFILTER2DEXTPROC __glewConvolutionFilter2DEXT; GLEW_FUN_EXPORT PFNGLCONVOLUTIONPARAMETERFEXTPROC __glewConvolutionParameterfEXT; GLEW_FUN_EXPORT PFNGLCONVOLUTIONPARAMETERFVEXTPROC __glewConvolutionParameterfvEXT; GLEW_FUN_EXPORT PFNGLCONVOLUTIONPARAMETERIEXTPROC __glewConvolutionParameteriEXT; GLEW_FUN_EXPORT PFNGLCONVOLUTIONPARAMETERIVEXTPROC __glewConvolutionParameterivEXT; GLEW_FUN_EXPORT PFNGLCOPYCONVOLUTIONFILTER1DEXTPROC __glewCopyConvolutionFilter1DEXT; GLEW_FUN_EXPORT PFNGLCOPYCONVOLUTIONFILTER2DEXTPROC __glewCopyConvolutionFilter2DEXT; GLEW_FUN_EXPORT PFNGLGETCONVOLUTIONFILTEREXTPROC __glewGetConvolutionFilterEXT; GLEW_FUN_EXPORT PFNGLGETCONVOLUTIONPARAMETERFVEXTPROC __glewGetConvolutionParameterfvEXT; GLEW_FUN_EXPORT PFNGLGETCONVOLUTIONPARAMETERIVEXTPROC __glewGetConvolutionParameterivEXT; GLEW_FUN_EXPORT PFNGLGETSEPARABLEFILTEREXTPROC __glewGetSeparableFilterEXT; GLEW_FUN_EXPORT PFNGLSEPARABLEFILTER2DEXTPROC __glewSeparableFilter2DEXT; GLEW_FUN_EXPORT PFNGLBINORMALPOINTEREXTPROC __glewBinormalPointerEXT; GLEW_FUN_EXPORT PFNGLTANGENTPOINTEREXTPROC __glewTangentPointerEXT; GLEW_FUN_EXPORT PFNGLCOPYTEXIMAGE1DEXTPROC __glewCopyTexImage1DEXT; GLEW_FUN_EXPORT PFNGLCOPYTEXIMAGE2DEXTPROC __glewCopyTexImage2DEXT; GLEW_FUN_EXPORT PFNGLCOPYTEXSUBIMAGE1DEXTPROC __glewCopyTexSubImage1DEXT; GLEW_FUN_EXPORT PFNGLCOPYTEXSUBIMAGE2DEXTPROC __glewCopyTexSubImage2DEXT; GLEW_FUN_EXPORT PFNGLCOPYTEXSUBIMAGE3DEXTPROC __glewCopyTexSubImage3DEXT; GLEW_FUN_EXPORT PFNGLCULLPARAMETERDVEXTPROC __glewCullParameterdvEXT; GLEW_FUN_EXPORT PFNGLCULLPARAMETERFVEXTPROC __glewCullParameterfvEXT; GLEW_FUN_EXPORT PFNGLINSERTEVENTMARKEREXTPROC __glewInsertEventMarkerEXT; GLEW_FUN_EXPORT PFNGLPOPGROUPMARKEREXTPROC __glewPopGroupMarkerEXT; GLEW_FUN_EXPORT PFNGLPUSHGROUPMARKEREXTPROC __glewPushGroupMarkerEXT; GLEW_FUN_EXPORT PFNGLDEPTHBOUNDSEXTPROC __glewDepthBoundsEXT; GLEW_FUN_EXPORT PFNGLBINDMULTITEXTUREEXTPROC __glewBindMultiTextureEXT; GLEW_FUN_EXPORT PFNGLCHECKNAMEDFRAMEBUFFERSTATUSEXTPROC __glewCheckNamedFramebufferStatusEXT; GLEW_FUN_EXPORT PFNGLCLIENTATTRIBDEFAULTEXTPROC __glewClientAttribDefaultEXT; GLEW_FUN_EXPORT PFNGLCOMPRESSEDMULTITEXIMAGE1DEXTPROC __glewCompressedMultiTexImage1DEXT; GLEW_FUN_EXPORT PFNGLCOMPRESSEDMULTITEXIMAGE2DEXTPROC __glewCompressedMultiTexImage2DEXT; GLEW_FUN_EXPORT PFNGLCOMPRESSEDMULTITEXIMAGE3DEXTPROC __glewCompressedMultiTexImage3DEXT; GLEW_FUN_EXPORT PFNGLCOMPRESSEDMULTITEXSUBIMAGE1DEXTPROC __glewCompressedMultiTexSubImage1DEXT; GLEW_FUN_EXPORT PFNGLCOMPRESSEDMULTITEXSUBIMAGE2DEXTPROC __glewCompressedMultiTexSubImage2DEXT; GLEW_FUN_EXPORT PFNGLCOMPRESSEDMULTITEXSUBIMAGE3DEXTPROC __glewCompressedMultiTexSubImage3DEXT; GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXTUREIMAGE1DEXTPROC __glewCompressedTextureImage1DEXT; GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXTUREIMAGE2DEXTPROC __glewCompressedTextureImage2DEXT; GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXTUREIMAGE3DEXTPROC __glewCompressedTextureImage3DEXT; GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXTURESUBIMAGE1DEXTPROC __glewCompressedTextureSubImage1DEXT; GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXTURESUBIMAGE2DEXTPROC __glewCompressedTextureSubImage2DEXT; GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXTURESUBIMAGE3DEXTPROC __glewCompressedTextureSubImage3DEXT; GLEW_FUN_EXPORT PFNGLCOPYMULTITEXIMAGE1DEXTPROC __glewCopyMultiTexImage1DEXT; GLEW_FUN_EXPORT PFNGLCOPYMULTITEXIMAGE2DEXTPROC __glewCopyMultiTexImage2DEXT; GLEW_FUN_EXPORT PFNGLCOPYMULTITEXSUBIMAGE1DEXTPROC __glewCopyMultiTexSubImage1DEXT; GLEW_FUN_EXPORT PFNGLCOPYMULTITEXSUBIMAGE2DEXTPROC __glewCopyMultiTexSubImage2DEXT; GLEW_FUN_EXPORT PFNGLCOPYMULTITEXSUBIMAGE3DEXTPROC __glewCopyMultiTexSubImage3DEXT; GLEW_FUN_EXPORT PFNGLCOPYTEXTUREIMAGE1DEXTPROC __glewCopyTextureImage1DEXT; GLEW_FUN_EXPORT PFNGLCOPYTEXTUREIMAGE2DEXTPROC __glewCopyTextureImage2DEXT; GLEW_FUN_EXPORT PFNGLCOPYTEXTURESUBIMAGE1DEXTPROC __glewCopyTextureSubImage1DEXT; GLEW_FUN_EXPORT PFNGLCOPYTEXTURESUBIMAGE2DEXTPROC __glewCopyTextureSubImage2DEXT; GLEW_FUN_EXPORT PFNGLCOPYTEXTURESUBIMAGE3DEXTPROC __glewCopyTextureSubImage3DEXT; GLEW_FUN_EXPORT PFNGLDISABLECLIENTSTATEINDEXEDEXTPROC __glewDisableClientStateIndexedEXT; GLEW_FUN_EXPORT PFNGLDISABLECLIENTSTATEIEXTPROC __glewDisableClientStateiEXT; GLEW_FUN_EXPORT PFNGLDISABLEVERTEXARRAYATTRIBEXTPROC __glewDisableVertexArrayAttribEXT; GLEW_FUN_EXPORT PFNGLDISABLEVERTEXARRAYEXTPROC __glewDisableVertexArrayEXT; GLEW_FUN_EXPORT PFNGLENABLECLIENTSTATEINDEXEDEXTPROC __glewEnableClientStateIndexedEXT; GLEW_FUN_EXPORT PFNGLENABLECLIENTSTATEIEXTPROC __glewEnableClientStateiEXT; GLEW_FUN_EXPORT PFNGLENABLEVERTEXARRAYATTRIBEXTPROC __glewEnableVertexArrayAttribEXT; GLEW_FUN_EXPORT PFNGLENABLEVERTEXARRAYEXTPROC __glewEnableVertexArrayEXT; GLEW_FUN_EXPORT PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEEXTPROC __glewFlushMappedNamedBufferRangeEXT; GLEW_FUN_EXPORT PFNGLFRAMEBUFFERDRAWBUFFEREXTPROC __glewFramebufferDrawBufferEXT; GLEW_FUN_EXPORT PFNGLFRAMEBUFFERDRAWBUFFERSEXTPROC __glewFramebufferDrawBuffersEXT; GLEW_FUN_EXPORT PFNGLFRAMEBUFFERREADBUFFEREXTPROC __glewFramebufferReadBufferEXT; GLEW_FUN_EXPORT PFNGLGENERATEMULTITEXMIPMAPEXTPROC __glewGenerateMultiTexMipmapEXT; GLEW_FUN_EXPORT PFNGLGENERATETEXTUREMIPMAPEXTPROC __glewGenerateTextureMipmapEXT; GLEW_FUN_EXPORT PFNGLGETCOMPRESSEDMULTITEXIMAGEEXTPROC __glewGetCompressedMultiTexImageEXT; GLEW_FUN_EXPORT PFNGLGETCOMPRESSEDTEXTUREIMAGEEXTPROC __glewGetCompressedTextureImageEXT; GLEW_FUN_EXPORT PFNGLGETDOUBLEINDEXEDVEXTPROC __glewGetDoubleIndexedvEXT; GLEW_FUN_EXPORT PFNGLGETDOUBLEI_VEXTPROC __glewGetDoublei_vEXT; GLEW_FUN_EXPORT PFNGLGETFLOATINDEXEDVEXTPROC __glewGetFloatIndexedvEXT; GLEW_FUN_EXPORT PFNGLGETFLOATI_VEXTPROC __glewGetFloati_vEXT; GLEW_FUN_EXPORT PFNGLGETFRAMEBUFFERPARAMETERIVEXTPROC __glewGetFramebufferParameterivEXT; GLEW_FUN_EXPORT PFNGLGETMULTITEXENVFVEXTPROC __glewGetMultiTexEnvfvEXT; GLEW_FUN_EXPORT PFNGLGETMULTITEXENVIVEXTPROC __glewGetMultiTexEnvivEXT; GLEW_FUN_EXPORT PFNGLGETMULTITEXGENDVEXTPROC __glewGetMultiTexGendvEXT; GLEW_FUN_EXPORT PFNGLGETMULTITEXGENFVEXTPROC __glewGetMultiTexGenfvEXT; GLEW_FUN_EXPORT PFNGLGETMULTITEXGENIVEXTPROC __glewGetMultiTexGenivEXT; GLEW_FUN_EXPORT PFNGLGETMULTITEXIMAGEEXTPROC __glewGetMultiTexImageEXT; GLEW_FUN_EXPORT PFNGLGETMULTITEXLEVELPARAMETERFVEXTPROC __glewGetMultiTexLevelParameterfvEXT; GLEW_FUN_EXPORT PFNGLGETMULTITEXLEVELPARAMETERIVEXTPROC __glewGetMultiTexLevelParameterivEXT; GLEW_FUN_EXPORT PFNGLGETMULTITEXPARAMETERIIVEXTPROC __glewGetMultiTexParameterIivEXT; GLEW_FUN_EXPORT PFNGLGETMULTITEXPARAMETERIUIVEXTPROC __glewGetMultiTexParameterIuivEXT; GLEW_FUN_EXPORT PFNGLGETMULTITEXPARAMETERFVEXTPROC __glewGetMultiTexParameterfvEXT; GLEW_FUN_EXPORT PFNGLGETMULTITEXPARAMETERIVEXTPROC __glewGetMultiTexParameterivEXT; GLEW_FUN_EXPORT PFNGLGETNAMEDBUFFERPARAMETERIVEXTPROC __glewGetNamedBufferParameterivEXT; GLEW_FUN_EXPORT PFNGLGETNAMEDBUFFERPOINTERVEXTPROC __glewGetNamedBufferPointervEXT; GLEW_FUN_EXPORT PFNGLGETNAMEDBUFFERSUBDATAEXTPROC __glewGetNamedBufferSubDataEXT; GLEW_FUN_EXPORT PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC __glewGetNamedFramebufferAttachmentParameterivEXT; GLEW_FUN_EXPORT PFNGLGETNAMEDPROGRAMLOCALPARAMETERIIVEXTPROC __glewGetNamedProgramLocalParameterIivEXT; GLEW_FUN_EXPORT PFNGLGETNAMEDPROGRAMLOCALPARAMETERIUIVEXTPROC __glewGetNamedProgramLocalParameterIuivEXT; GLEW_FUN_EXPORT PFNGLGETNAMEDPROGRAMLOCALPARAMETERDVEXTPROC __glewGetNamedProgramLocalParameterdvEXT; GLEW_FUN_EXPORT PFNGLGETNAMEDPROGRAMLOCALPARAMETERFVEXTPROC __glewGetNamedProgramLocalParameterfvEXT; GLEW_FUN_EXPORT PFNGLGETNAMEDPROGRAMSTRINGEXTPROC __glewGetNamedProgramStringEXT; GLEW_FUN_EXPORT PFNGLGETNAMEDPROGRAMIVEXTPROC __glewGetNamedProgramivEXT; GLEW_FUN_EXPORT PFNGLGETNAMEDRENDERBUFFERPARAMETERIVEXTPROC __glewGetNamedRenderbufferParameterivEXT; GLEW_FUN_EXPORT PFNGLGETPOINTERINDEXEDVEXTPROC __glewGetPointerIndexedvEXT; GLEW_FUN_EXPORT PFNGLGETPOINTERI_VEXTPROC __glewGetPointeri_vEXT; GLEW_FUN_EXPORT PFNGLGETTEXTUREIMAGEEXTPROC __glewGetTextureImageEXT; GLEW_FUN_EXPORT PFNGLGETTEXTURELEVELPARAMETERFVEXTPROC __glewGetTextureLevelParameterfvEXT; GLEW_FUN_EXPORT PFNGLGETTEXTURELEVELPARAMETERIVEXTPROC __glewGetTextureLevelParameterivEXT; GLEW_FUN_EXPORT PFNGLGETTEXTUREPARAMETERIIVEXTPROC __glewGetTextureParameterIivEXT; GLEW_FUN_EXPORT PFNGLGETTEXTUREPARAMETERIUIVEXTPROC __glewGetTextureParameterIuivEXT; GLEW_FUN_EXPORT PFNGLGETTEXTUREPARAMETERFVEXTPROC __glewGetTextureParameterfvEXT; GLEW_FUN_EXPORT PFNGLGETTEXTUREPARAMETERIVEXTPROC __glewGetTextureParameterivEXT; GLEW_FUN_EXPORT PFNGLGETVERTEXARRAYINTEGERI_VEXTPROC __glewGetVertexArrayIntegeri_vEXT; GLEW_FUN_EXPORT PFNGLGETVERTEXARRAYINTEGERVEXTPROC __glewGetVertexArrayIntegervEXT; GLEW_FUN_EXPORT PFNGLGETVERTEXARRAYPOINTERI_VEXTPROC __glewGetVertexArrayPointeri_vEXT; GLEW_FUN_EXPORT PFNGLGETVERTEXARRAYPOINTERVEXTPROC __glewGetVertexArrayPointervEXT; GLEW_FUN_EXPORT PFNGLMAPNAMEDBUFFEREXTPROC __glewMapNamedBufferEXT; GLEW_FUN_EXPORT PFNGLMAPNAMEDBUFFERRANGEEXTPROC __glewMapNamedBufferRangeEXT; GLEW_FUN_EXPORT PFNGLMATRIXFRUSTUMEXTPROC __glewMatrixFrustumEXT; GLEW_FUN_EXPORT PFNGLMATRIXLOADIDENTITYEXTPROC __glewMatrixLoadIdentityEXT; GLEW_FUN_EXPORT PFNGLMATRIXLOADTRANSPOSEDEXTPROC __glewMatrixLoadTransposedEXT; GLEW_FUN_EXPORT PFNGLMATRIXLOADTRANSPOSEFEXTPROC __glewMatrixLoadTransposefEXT; GLEW_FUN_EXPORT PFNGLMATRIXLOADDEXTPROC __glewMatrixLoaddEXT; GLEW_FUN_EXPORT PFNGLMATRIXLOADFEXTPROC __glewMatrixLoadfEXT; GLEW_FUN_EXPORT PFNGLMATRIXMULTTRANSPOSEDEXTPROC __glewMatrixMultTransposedEXT; GLEW_FUN_EXPORT PFNGLMATRIXMULTTRANSPOSEFEXTPROC __glewMatrixMultTransposefEXT; GLEW_FUN_EXPORT PFNGLMATRIXMULTDEXTPROC __glewMatrixMultdEXT; GLEW_FUN_EXPORT PFNGLMATRIXMULTFEXTPROC __glewMatrixMultfEXT; GLEW_FUN_EXPORT PFNGLMATRIXORTHOEXTPROC __glewMatrixOrthoEXT; GLEW_FUN_EXPORT PFNGLMATRIXPOPEXTPROC __glewMatrixPopEXT; GLEW_FUN_EXPORT PFNGLMATRIXPUSHEXTPROC __glewMatrixPushEXT; GLEW_FUN_EXPORT PFNGLMATRIXROTATEDEXTPROC __glewMatrixRotatedEXT; GLEW_FUN_EXPORT PFNGLMATRIXROTATEFEXTPROC __glewMatrixRotatefEXT; GLEW_FUN_EXPORT PFNGLMATRIXSCALEDEXTPROC __glewMatrixScaledEXT; GLEW_FUN_EXPORT PFNGLMATRIXSCALEFEXTPROC __glewMatrixScalefEXT; GLEW_FUN_EXPORT PFNGLMATRIXTRANSLATEDEXTPROC __glewMatrixTranslatedEXT; GLEW_FUN_EXPORT PFNGLMATRIXTRANSLATEFEXTPROC __glewMatrixTranslatefEXT; GLEW_FUN_EXPORT PFNGLMULTITEXBUFFEREXTPROC __glewMultiTexBufferEXT; GLEW_FUN_EXPORT PFNGLMULTITEXCOORDPOINTEREXTPROC __glewMultiTexCoordPointerEXT; GLEW_FUN_EXPORT PFNGLMULTITEXENVFEXTPROC __glewMultiTexEnvfEXT; GLEW_FUN_EXPORT PFNGLMULTITEXENVFVEXTPROC __glewMultiTexEnvfvEXT; GLEW_FUN_EXPORT PFNGLMULTITEXENVIEXTPROC __glewMultiTexEnviEXT; GLEW_FUN_EXPORT PFNGLMULTITEXENVIVEXTPROC __glewMultiTexEnvivEXT; GLEW_FUN_EXPORT PFNGLMULTITEXGENDEXTPROC __glewMultiTexGendEXT; GLEW_FUN_EXPORT PFNGLMULTITEXGENDVEXTPROC __glewMultiTexGendvEXT; GLEW_FUN_EXPORT PFNGLMULTITEXGENFEXTPROC __glewMultiTexGenfEXT; GLEW_FUN_EXPORT PFNGLMULTITEXGENFVEXTPROC __glewMultiTexGenfvEXT; GLEW_FUN_EXPORT PFNGLMULTITEXGENIEXTPROC __glewMultiTexGeniEXT; GLEW_FUN_EXPORT PFNGLMULTITEXGENIVEXTPROC __glewMultiTexGenivEXT; GLEW_FUN_EXPORT PFNGLMULTITEXIMAGE1DEXTPROC __glewMultiTexImage1DEXT; GLEW_FUN_EXPORT PFNGLMULTITEXIMAGE2DEXTPROC __glewMultiTexImage2DEXT; GLEW_FUN_EXPORT PFNGLMULTITEXIMAGE3DEXTPROC __glewMultiTexImage3DEXT; GLEW_FUN_EXPORT PFNGLMULTITEXPARAMETERIIVEXTPROC __glewMultiTexParameterIivEXT; GLEW_FUN_EXPORT PFNGLMULTITEXPARAMETERIUIVEXTPROC __glewMultiTexParameterIuivEXT; GLEW_FUN_EXPORT PFNGLMULTITEXPARAMETERFEXTPROC __glewMultiTexParameterfEXT; GLEW_FUN_EXPORT PFNGLMULTITEXPARAMETERFVEXTPROC __glewMultiTexParameterfvEXT; GLEW_FUN_EXPORT PFNGLMULTITEXPARAMETERIEXTPROC __glewMultiTexParameteriEXT; GLEW_FUN_EXPORT PFNGLMULTITEXPARAMETERIVEXTPROC __glewMultiTexParameterivEXT; GLEW_FUN_EXPORT PFNGLMULTITEXRENDERBUFFEREXTPROC __glewMultiTexRenderbufferEXT; GLEW_FUN_EXPORT PFNGLMULTITEXSUBIMAGE1DEXTPROC __glewMultiTexSubImage1DEXT; GLEW_FUN_EXPORT PFNGLMULTITEXSUBIMAGE2DEXTPROC __glewMultiTexSubImage2DEXT; GLEW_FUN_EXPORT PFNGLMULTITEXSUBIMAGE3DEXTPROC __glewMultiTexSubImage3DEXT; GLEW_FUN_EXPORT PFNGLNAMEDBUFFERDATAEXTPROC __glewNamedBufferDataEXT; GLEW_FUN_EXPORT PFNGLNAMEDBUFFERSUBDATAEXTPROC __glewNamedBufferSubDataEXT; GLEW_FUN_EXPORT PFNGLNAMEDCOPYBUFFERSUBDATAEXTPROC __glewNamedCopyBufferSubDataEXT; GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERRENDERBUFFEREXTPROC __glewNamedFramebufferRenderbufferEXT; GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERTEXTURE1DEXTPROC __glewNamedFramebufferTexture1DEXT; GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERTEXTURE2DEXTPROC __glewNamedFramebufferTexture2DEXT; GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERTEXTURE3DEXTPROC __glewNamedFramebufferTexture3DEXT; GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERTEXTUREEXTPROC __glewNamedFramebufferTextureEXT; GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERTEXTUREFACEEXTPROC __glewNamedFramebufferTextureFaceEXT; GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERTEXTURELAYEREXTPROC __glewNamedFramebufferTextureLayerEXT; GLEW_FUN_EXPORT PFNGLNAMEDPROGRAMLOCALPARAMETER4DEXTPROC __glewNamedProgramLocalParameter4dEXT; GLEW_FUN_EXPORT PFNGLNAMEDPROGRAMLOCALPARAMETER4DVEXTPROC __glewNamedProgramLocalParameter4dvEXT; GLEW_FUN_EXPORT PFNGLNAMEDPROGRAMLOCALPARAMETER4FEXTPROC __glewNamedProgramLocalParameter4fEXT; GLEW_FUN_EXPORT PFNGLNAMEDPROGRAMLOCALPARAMETER4FVEXTPROC __glewNamedProgramLocalParameter4fvEXT; GLEW_FUN_EXPORT PFNGLNAMEDPROGRAMLOCALPARAMETERI4IEXTPROC __glewNamedProgramLocalParameterI4iEXT; GLEW_FUN_EXPORT PFNGLNAMEDPROGRAMLOCALPARAMETERI4IVEXTPROC __glewNamedProgramLocalParameterI4ivEXT; GLEW_FUN_EXPORT PFNGLNAMEDPROGRAMLOCALPARAMETERI4UIEXTPROC __glewNamedProgramLocalParameterI4uiEXT; GLEW_FUN_EXPORT PFNGLNAMEDPROGRAMLOCALPARAMETERI4UIVEXTPROC __glewNamedProgramLocalParameterI4uivEXT; GLEW_FUN_EXPORT PFNGLNAMEDPROGRAMLOCALPARAMETERS4FVEXTPROC __glewNamedProgramLocalParameters4fvEXT; GLEW_FUN_EXPORT PFNGLNAMEDPROGRAMLOCALPARAMETERSI4IVEXTPROC __glewNamedProgramLocalParametersI4ivEXT; GLEW_FUN_EXPORT PFNGLNAMEDPROGRAMLOCALPARAMETERSI4UIVEXTPROC __glewNamedProgramLocalParametersI4uivEXT; GLEW_FUN_EXPORT PFNGLNAMEDPROGRAMSTRINGEXTPROC __glewNamedProgramStringEXT; GLEW_FUN_EXPORT PFNGLNAMEDRENDERBUFFERSTORAGEEXTPROC __glewNamedRenderbufferStorageEXT; GLEW_FUN_EXPORT PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLECOVERAGEEXTPROC __glewNamedRenderbufferStorageMultisampleCoverageEXT; GLEW_FUN_EXPORT PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC __glewNamedRenderbufferStorageMultisampleEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1DEXTPROC __glewProgramUniform1dEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1DVEXTPROC __glewProgramUniform1dvEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1FEXTPROC __glewProgramUniform1fEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1FVEXTPROC __glewProgramUniform1fvEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1IEXTPROC __glewProgramUniform1iEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1IVEXTPROC __glewProgramUniform1ivEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1UIEXTPROC __glewProgramUniform1uiEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1UIVEXTPROC __glewProgramUniform1uivEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2DEXTPROC __glewProgramUniform2dEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2DVEXTPROC __glewProgramUniform2dvEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2FEXTPROC __glewProgramUniform2fEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2FVEXTPROC __glewProgramUniform2fvEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2IEXTPROC __glewProgramUniform2iEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2IVEXTPROC __glewProgramUniform2ivEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2UIEXTPROC __glewProgramUniform2uiEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2UIVEXTPROC __glewProgramUniform2uivEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3DEXTPROC __glewProgramUniform3dEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3DVEXTPROC __glewProgramUniform3dvEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3FEXTPROC __glewProgramUniform3fEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3FVEXTPROC __glewProgramUniform3fvEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3IEXTPROC __glewProgramUniform3iEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3IVEXTPROC __glewProgramUniform3ivEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3UIEXTPROC __glewProgramUniform3uiEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3UIVEXTPROC __glewProgramUniform3uivEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4DEXTPROC __glewProgramUniform4dEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4DVEXTPROC __glewProgramUniform4dvEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4FEXTPROC __glewProgramUniform4fEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4FVEXTPROC __glewProgramUniform4fvEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4IEXTPROC __glewProgramUniform4iEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4IVEXTPROC __glewProgramUniform4ivEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4UIEXTPROC __glewProgramUniform4uiEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4UIVEXTPROC __glewProgramUniform4uivEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX2DVEXTPROC __glewProgramUniformMatrix2dvEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX2FVEXTPROC __glewProgramUniformMatrix2fvEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX2X3DVEXTPROC __glewProgramUniformMatrix2x3dvEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX2X3FVEXTPROC __glewProgramUniformMatrix2x3fvEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX2X4DVEXTPROC __glewProgramUniformMatrix2x4dvEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX2X4FVEXTPROC __glewProgramUniformMatrix2x4fvEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX3DVEXTPROC __glewProgramUniformMatrix3dvEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX3FVEXTPROC __glewProgramUniformMatrix3fvEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX3X2DVEXTPROC __glewProgramUniformMatrix3x2dvEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX3X2FVEXTPROC __glewProgramUniformMatrix3x2fvEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX3X4DVEXTPROC __glewProgramUniformMatrix3x4dvEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX3X4FVEXTPROC __glewProgramUniformMatrix3x4fvEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX4DVEXTPROC __glewProgramUniformMatrix4dvEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX4FVEXTPROC __glewProgramUniformMatrix4fvEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX4X2DVEXTPROC __glewProgramUniformMatrix4x2dvEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX4X2FVEXTPROC __glewProgramUniformMatrix4x2fvEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX4X3DVEXTPROC __glewProgramUniformMatrix4x3dvEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX4X3FVEXTPROC __glewProgramUniformMatrix4x3fvEXT; GLEW_FUN_EXPORT PFNGLPUSHCLIENTATTRIBDEFAULTEXTPROC __glewPushClientAttribDefaultEXT; GLEW_FUN_EXPORT PFNGLTEXTUREBUFFEREXTPROC __glewTextureBufferEXT; GLEW_FUN_EXPORT PFNGLTEXTUREIMAGE1DEXTPROC __glewTextureImage1DEXT; GLEW_FUN_EXPORT PFNGLTEXTUREIMAGE2DEXTPROC __glewTextureImage2DEXT; GLEW_FUN_EXPORT PFNGLTEXTUREIMAGE3DEXTPROC __glewTextureImage3DEXT; GLEW_FUN_EXPORT PFNGLTEXTUREPARAMETERIIVEXTPROC __glewTextureParameterIivEXT; GLEW_FUN_EXPORT PFNGLTEXTUREPARAMETERIUIVEXTPROC __glewTextureParameterIuivEXT; GLEW_FUN_EXPORT PFNGLTEXTUREPARAMETERFEXTPROC __glewTextureParameterfEXT; GLEW_FUN_EXPORT PFNGLTEXTUREPARAMETERFVEXTPROC __glewTextureParameterfvEXT; GLEW_FUN_EXPORT PFNGLTEXTUREPARAMETERIEXTPROC __glewTextureParameteriEXT; GLEW_FUN_EXPORT PFNGLTEXTUREPARAMETERIVEXTPROC __glewTextureParameterivEXT; GLEW_FUN_EXPORT PFNGLTEXTURERENDERBUFFEREXTPROC __glewTextureRenderbufferEXT; GLEW_FUN_EXPORT PFNGLTEXTURESUBIMAGE1DEXTPROC __glewTextureSubImage1DEXT; GLEW_FUN_EXPORT PFNGLTEXTURESUBIMAGE2DEXTPROC __glewTextureSubImage2DEXT; GLEW_FUN_EXPORT PFNGLTEXTURESUBIMAGE3DEXTPROC __glewTextureSubImage3DEXT; GLEW_FUN_EXPORT PFNGLUNMAPNAMEDBUFFEREXTPROC __glewUnmapNamedBufferEXT; GLEW_FUN_EXPORT PFNGLVERTEXARRAYCOLOROFFSETEXTPROC __glewVertexArrayColorOffsetEXT; GLEW_FUN_EXPORT PFNGLVERTEXARRAYEDGEFLAGOFFSETEXTPROC __glewVertexArrayEdgeFlagOffsetEXT; GLEW_FUN_EXPORT PFNGLVERTEXARRAYFOGCOORDOFFSETEXTPROC __glewVertexArrayFogCoordOffsetEXT; GLEW_FUN_EXPORT PFNGLVERTEXARRAYINDEXOFFSETEXTPROC __glewVertexArrayIndexOffsetEXT; GLEW_FUN_EXPORT PFNGLVERTEXARRAYMULTITEXCOORDOFFSETEXTPROC __glewVertexArrayMultiTexCoordOffsetEXT; GLEW_FUN_EXPORT PFNGLVERTEXARRAYNORMALOFFSETEXTPROC __glewVertexArrayNormalOffsetEXT; GLEW_FUN_EXPORT PFNGLVERTEXARRAYSECONDARYCOLOROFFSETEXTPROC __glewVertexArraySecondaryColorOffsetEXT; GLEW_FUN_EXPORT PFNGLVERTEXARRAYTEXCOORDOFFSETEXTPROC __glewVertexArrayTexCoordOffsetEXT; GLEW_FUN_EXPORT PFNGLVERTEXARRAYVERTEXATTRIBIOFFSETEXTPROC __glewVertexArrayVertexAttribIOffsetEXT; GLEW_FUN_EXPORT PFNGLVERTEXARRAYVERTEXATTRIBOFFSETEXTPROC __glewVertexArrayVertexAttribOffsetEXT; GLEW_FUN_EXPORT PFNGLVERTEXARRAYVERTEXOFFSETEXTPROC __glewVertexArrayVertexOffsetEXT; GLEW_FUN_EXPORT PFNGLCOLORMASKINDEXEDEXTPROC __glewColorMaskIndexedEXT; GLEW_FUN_EXPORT PFNGLDISABLEINDEXEDEXTPROC __glewDisableIndexedEXT; GLEW_FUN_EXPORT PFNGLENABLEINDEXEDEXTPROC __glewEnableIndexedEXT; GLEW_FUN_EXPORT PFNGLGETBOOLEANINDEXEDVEXTPROC __glewGetBooleanIndexedvEXT; GLEW_FUN_EXPORT PFNGLGETINTEGERINDEXEDVEXTPROC __glewGetIntegerIndexedvEXT; GLEW_FUN_EXPORT PFNGLISENABLEDINDEXEDEXTPROC __glewIsEnabledIndexedEXT; GLEW_FUN_EXPORT PFNGLDRAWARRAYSINSTANCEDEXTPROC __glewDrawArraysInstancedEXT; GLEW_FUN_EXPORT PFNGLDRAWELEMENTSINSTANCEDEXTPROC __glewDrawElementsInstancedEXT; GLEW_FUN_EXPORT PFNGLDRAWRANGEELEMENTSEXTPROC __glewDrawRangeElementsEXT; GLEW_FUN_EXPORT PFNGLFOGCOORDPOINTEREXTPROC __glewFogCoordPointerEXT; GLEW_FUN_EXPORT PFNGLFOGCOORDDEXTPROC __glewFogCoorddEXT; GLEW_FUN_EXPORT PFNGLFOGCOORDDVEXTPROC __glewFogCoorddvEXT; GLEW_FUN_EXPORT PFNGLFOGCOORDFEXTPROC __glewFogCoordfEXT; GLEW_FUN_EXPORT PFNGLFOGCOORDFVEXTPROC __glewFogCoordfvEXT; GLEW_FUN_EXPORT PFNGLFRAGMENTCOLORMATERIALEXTPROC __glewFragmentColorMaterialEXT; GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTMODELFEXTPROC __glewFragmentLightModelfEXT; GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTMODELFVEXTPROC __glewFragmentLightModelfvEXT; GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTMODELIEXTPROC __glewFragmentLightModeliEXT; GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTMODELIVEXTPROC __glewFragmentLightModelivEXT; GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTFEXTPROC __glewFragmentLightfEXT; GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTFVEXTPROC __glewFragmentLightfvEXT; GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTIEXTPROC __glewFragmentLightiEXT; GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTIVEXTPROC __glewFragmentLightivEXT; GLEW_FUN_EXPORT PFNGLFRAGMENTMATERIALFEXTPROC __glewFragmentMaterialfEXT; GLEW_FUN_EXPORT PFNGLFRAGMENTMATERIALFVEXTPROC __glewFragmentMaterialfvEXT; GLEW_FUN_EXPORT PFNGLFRAGMENTMATERIALIEXTPROC __glewFragmentMaterialiEXT; GLEW_FUN_EXPORT PFNGLFRAGMENTMATERIALIVEXTPROC __glewFragmentMaterialivEXT; GLEW_FUN_EXPORT PFNGLGETFRAGMENTLIGHTFVEXTPROC __glewGetFragmentLightfvEXT; GLEW_FUN_EXPORT PFNGLGETFRAGMENTLIGHTIVEXTPROC __glewGetFragmentLightivEXT; GLEW_FUN_EXPORT PFNGLGETFRAGMENTMATERIALFVEXTPROC __glewGetFragmentMaterialfvEXT; GLEW_FUN_EXPORT PFNGLGETFRAGMENTMATERIALIVEXTPROC __glewGetFragmentMaterialivEXT; GLEW_FUN_EXPORT PFNGLLIGHTENVIEXTPROC __glewLightEnviEXT; GLEW_FUN_EXPORT PFNGLBLITFRAMEBUFFEREXTPROC __glewBlitFramebufferEXT; GLEW_FUN_EXPORT PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC __glewRenderbufferStorageMultisampleEXT; GLEW_FUN_EXPORT PFNGLBINDFRAMEBUFFEREXTPROC __glewBindFramebufferEXT; GLEW_FUN_EXPORT PFNGLBINDRENDERBUFFEREXTPROC __glewBindRenderbufferEXT; GLEW_FUN_EXPORT PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC __glewCheckFramebufferStatusEXT; GLEW_FUN_EXPORT PFNGLDELETEFRAMEBUFFERSEXTPROC __glewDeleteFramebuffersEXT; GLEW_FUN_EXPORT PFNGLDELETERENDERBUFFERSEXTPROC __glewDeleteRenderbuffersEXT; GLEW_FUN_EXPORT PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC __glewFramebufferRenderbufferEXT; GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURE1DEXTPROC __glewFramebufferTexture1DEXT; GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURE2DEXTPROC __glewFramebufferTexture2DEXT; GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURE3DEXTPROC __glewFramebufferTexture3DEXT; GLEW_FUN_EXPORT PFNGLGENFRAMEBUFFERSEXTPROC __glewGenFramebuffersEXT; GLEW_FUN_EXPORT PFNGLGENRENDERBUFFERSEXTPROC __glewGenRenderbuffersEXT; GLEW_FUN_EXPORT PFNGLGENERATEMIPMAPEXTPROC __glewGenerateMipmapEXT; GLEW_FUN_EXPORT PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC __glewGetFramebufferAttachmentParameterivEXT; GLEW_FUN_EXPORT PFNGLGETRENDERBUFFERPARAMETERIVEXTPROC __glewGetRenderbufferParameterivEXT; GLEW_FUN_EXPORT PFNGLISFRAMEBUFFEREXTPROC __glewIsFramebufferEXT; GLEW_FUN_EXPORT PFNGLISRENDERBUFFEREXTPROC __glewIsRenderbufferEXT; GLEW_FUN_EXPORT PFNGLRENDERBUFFERSTORAGEEXTPROC __glewRenderbufferStorageEXT; GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTUREEXTPROC __glewFramebufferTextureEXT; GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTUREFACEEXTPROC __glewFramebufferTextureFaceEXT; GLEW_FUN_EXPORT PFNGLPROGRAMPARAMETERIEXTPROC __glewProgramParameteriEXT; GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETERS4FVEXTPROC __glewProgramEnvParameters4fvEXT; GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETERS4FVEXTPROC __glewProgramLocalParameters4fvEXT; GLEW_FUN_EXPORT PFNGLBINDFRAGDATALOCATIONEXTPROC __glewBindFragDataLocationEXT; GLEW_FUN_EXPORT PFNGLGETFRAGDATALOCATIONEXTPROC __glewGetFragDataLocationEXT; GLEW_FUN_EXPORT PFNGLGETUNIFORMUIVEXTPROC __glewGetUniformuivEXT; GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBIIVEXTPROC __glewGetVertexAttribIivEXT; GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBIUIVEXTPROC __glewGetVertexAttribIuivEXT; GLEW_FUN_EXPORT PFNGLUNIFORM1UIEXTPROC __glewUniform1uiEXT; GLEW_FUN_EXPORT PFNGLUNIFORM1UIVEXTPROC __glewUniform1uivEXT; GLEW_FUN_EXPORT PFNGLUNIFORM2UIEXTPROC __glewUniform2uiEXT; GLEW_FUN_EXPORT PFNGLUNIFORM2UIVEXTPROC __glewUniform2uivEXT; GLEW_FUN_EXPORT PFNGLUNIFORM3UIEXTPROC __glewUniform3uiEXT; GLEW_FUN_EXPORT PFNGLUNIFORM3UIVEXTPROC __glewUniform3uivEXT; GLEW_FUN_EXPORT PFNGLUNIFORM4UIEXTPROC __glewUniform4uiEXT; GLEW_FUN_EXPORT PFNGLUNIFORM4UIVEXTPROC __glewUniform4uivEXT; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI1IEXTPROC __glewVertexAttribI1iEXT; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI1IVEXTPROC __glewVertexAttribI1ivEXT; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI1UIEXTPROC __glewVertexAttribI1uiEXT; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI1UIVEXTPROC __glewVertexAttribI1uivEXT; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI2IEXTPROC __glewVertexAttribI2iEXT; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI2IVEXTPROC __glewVertexAttribI2ivEXT; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI2UIEXTPROC __glewVertexAttribI2uiEXT; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI2UIVEXTPROC __glewVertexAttribI2uivEXT; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI3IEXTPROC __glewVertexAttribI3iEXT; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI3IVEXTPROC __glewVertexAttribI3ivEXT; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI3UIEXTPROC __glewVertexAttribI3uiEXT; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI3UIVEXTPROC __glewVertexAttribI3uivEXT; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4BVEXTPROC __glewVertexAttribI4bvEXT; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4IEXTPROC __glewVertexAttribI4iEXT; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4IVEXTPROC __glewVertexAttribI4ivEXT; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4SVEXTPROC __glewVertexAttribI4svEXT; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4UBVEXTPROC __glewVertexAttribI4ubvEXT; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4UIEXTPROC __glewVertexAttribI4uiEXT; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4UIVEXTPROC __glewVertexAttribI4uivEXT; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4USVEXTPROC __glewVertexAttribI4usvEXT; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBIPOINTEREXTPROC __glewVertexAttribIPointerEXT; GLEW_FUN_EXPORT PFNGLGETHISTOGRAMEXTPROC __glewGetHistogramEXT; GLEW_FUN_EXPORT PFNGLGETHISTOGRAMPARAMETERFVEXTPROC __glewGetHistogramParameterfvEXT; GLEW_FUN_EXPORT PFNGLGETHISTOGRAMPARAMETERIVEXTPROC __glewGetHistogramParameterivEXT; GLEW_FUN_EXPORT PFNGLGETMINMAXEXTPROC __glewGetMinmaxEXT; GLEW_FUN_EXPORT PFNGLGETMINMAXPARAMETERFVEXTPROC __glewGetMinmaxParameterfvEXT; GLEW_FUN_EXPORT PFNGLGETMINMAXPARAMETERIVEXTPROC __glewGetMinmaxParameterivEXT; GLEW_FUN_EXPORT PFNGLHISTOGRAMEXTPROC __glewHistogramEXT; GLEW_FUN_EXPORT PFNGLMINMAXEXTPROC __glewMinmaxEXT; GLEW_FUN_EXPORT PFNGLRESETHISTOGRAMEXTPROC __glewResetHistogramEXT; GLEW_FUN_EXPORT PFNGLRESETMINMAXEXTPROC __glewResetMinmaxEXT; GLEW_FUN_EXPORT PFNGLINDEXFUNCEXTPROC __glewIndexFuncEXT; GLEW_FUN_EXPORT PFNGLINDEXMATERIALEXTPROC __glewIndexMaterialEXT; GLEW_FUN_EXPORT PFNGLAPPLYTEXTUREEXTPROC __glewApplyTextureEXT; GLEW_FUN_EXPORT PFNGLTEXTURELIGHTEXTPROC __glewTextureLightEXT; GLEW_FUN_EXPORT PFNGLTEXTUREMATERIALEXTPROC __glewTextureMaterialEXT; GLEW_FUN_EXPORT PFNGLMULTIDRAWARRAYSEXTPROC __glewMultiDrawArraysEXT; GLEW_FUN_EXPORT PFNGLMULTIDRAWELEMENTSEXTPROC __glewMultiDrawElementsEXT; GLEW_FUN_EXPORT PFNGLSAMPLEMASKEXTPROC __glewSampleMaskEXT; GLEW_FUN_EXPORT PFNGLSAMPLEPATTERNEXTPROC __glewSamplePatternEXT; GLEW_FUN_EXPORT PFNGLCOLORTABLEEXTPROC __glewColorTableEXT; GLEW_FUN_EXPORT PFNGLGETCOLORTABLEEXTPROC __glewGetColorTableEXT; GLEW_FUN_EXPORT PFNGLGETCOLORTABLEPARAMETERFVEXTPROC __glewGetColorTableParameterfvEXT; GLEW_FUN_EXPORT PFNGLGETCOLORTABLEPARAMETERIVEXTPROC __glewGetColorTableParameterivEXT; GLEW_FUN_EXPORT PFNGLGETPIXELTRANSFORMPARAMETERFVEXTPROC __glewGetPixelTransformParameterfvEXT; GLEW_FUN_EXPORT PFNGLGETPIXELTRANSFORMPARAMETERIVEXTPROC __glewGetPixelTransformParameterivEXT; GLEW_FUN_EXPORT PFNGLPIXELTRANSFORMPARAMETERFEXTPROC __glewPixelTransformParameterfEXT; GLEW_FUN_EXPORT PFNGLPIXELTRANSFORMPARAMETERFVEXTPROC __glewPixelTransformParameterfvEXT; GLEW_FUN_EXPORT PFNGLPIXELTRANSFORMPARAMETERIEXTPROC __glewPixelTransformParameteriEXT; GLEW_FUN_EXPORT PFNGLPIXELTRANSFORMPARAMETERIVEXTPROC __glewPixelTransformParameterivEXT; GLEW_FUN_EXPORT PFNGLPOINTPARAMETERFEXTPROC __glewPointParameterfEXT; GLEW_FUN_EXPORT PFNGLPOINTPARAMETERFVEXTPROC __glewPointParameterfvEXT; GLEW_FUN_EXPORT PFNGLPOLYGONOFFSETEXTPROC __glewPolygonOffsetEXT; GLEW_FUN_EXPORT PFNGLPROVOKINGVERTEXEXTPROC __glewProvokingVertexEXT; GLEW_FUN_EXPORT PFNGLBEGINSCENEEXTPROC __glewBeginSceneEXT; GLEW_FUN_EXPORT PFNGLENDSCENEEXTPROC __glewEndSceneEXT; GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3BEXTPROC __glewSecondaryColor3bEXT; GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3BVEXTPROC __glewSecondaryColor3bvEXT; GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3DEXTPROC __glewSecondaryColor3dEXT; GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3DVEXTPROC __glewSecondaryColor3dvEXT; GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3FEXTPROC __glewSecondaryColor3fEXT; GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3FVEXTPROC __glewSecondaryColor3fvEXT; GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3IEXTPROC __glewSecondaryColor3iEXT; GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3IVEXTPROC __glewSecondaryColor3ivEXT; GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3SEXTPROC __glewSecondaryColor3sEXT; GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3SVEXTPROC __glewSecondaryColor3svEXT; GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3UBEXTPROC __glewSecondaryColor3ubEXT; GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3UBVEXTPROC __glewSecondaryColor3ubvEXT; GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3UIEXTPROC __glewSecondaryColor3uiEXT; GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3UIVEXTPROC __glewSecondaryColor3uivEXT; GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3USEXTPROC __glewSecondaryColor3usEXT; GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3USVEXTPROC __glewSecondaryColor3usvEXT; GLEW_FUN_EXPORT PFNGLSECONDARYCOLORPOINTEREXTPROC __glewSecondaryColorPointerEXT; GLEW_FUN_EXPORT PFNGLACTIVEPROGRAMEXTPROC __glewActiveProgramEXT; GLEW_FUN_EXPORT PFNGLCREATESHADERPROGRAMEXTPROC __glewCreateShaderProgramEXT; GLEW_FUN_EXPORT PFNGLUSESHADERPROGRAMEXTPROC __glewUseShaderProgramEXT; GLEW_FUN_EXPORT PFNGLBINDIMAGETEXTUREEXTPROC __glewBindImageTextureEXT; GLEW_FUN_EXPORT PFNGLMEMORYBARRIEREXTPROC __glewMemoryBarrierEXT; GLEW_FUN_EXPORT PFNGLACTIVESTENCILFACEEXTPROC __glewActiveStencilFaceEXT; GLEW_FUN_EXPORT PFNGLTEXSUBIMAGE1DEXTPROC __glewTexSubImage1DEXT; GLEW_FUN_EXPORT PFNGLTEXSUBIMAGE2DEXTPROC __glewTexSubImage2DEXT; GLEW_FUN_EXPORT PFNGLTEXSUBIMAGE3DEXTPROC __glewTexSubImage3DEXT; GLEW_FUN_EXPORT PFNGLTEXIMAGE3DEXTPROC __glewTexImage3DEXT; GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURELAYEREXTPROC __glewFramebufferTextureLayerEXT; GLEW_FUN_EXPORT PFNGLTEXBUFFEREXTPROC __glewTexBufferEXT; GLEW_FUN_EXPORT PFNGLCLEARCOLORIIEXTPROC __glewClearColorIiEXT; GLEW_FUN_EXPORT PFNGLCLEARCOLORIUIEXTPROC __glewClearColorIuiEXT; GLEW_FUN_EXPORT PFNGLGETTEXPARAMETERIIVEXTPROC __glewGetTexParameterIivEXT; GLEW_FUN_EXPORT PFNGLGETTEXPARAMETERIUIVEXTPROC __glewGetTexParameterIuivEXT; GLEW_FUN_EXPORT PFNGLTEXPARAMETERIIVEXTPROC __glewTexParameterIivEXT; GLEW_FUN_EXPORT PFNGLTEXPARAMETERIUIVEXTPROC __glewTexParameterIuivEXT; GLEW_FUN_EXPORT PFNGLARETEXTURESRESIDENTEXTPROC __glewAreTexturesResidentEXT; GLEW_FUN_EXPORT PFNGLBINDTEXTUREEXTPROC __glewBindTextureEXT; GLEW_FUN_EXPORT PFNGLDELETETEXTURESEXTPROC __glewDeleteTexturesEXT; GLEW_FUN_EXPORT PFNGLGENTEXTURESEXTPROC __glewGenTexturesEXT; GLEW_FUN_EXPORT PFNGLISTEXTUREEXTPROC __glewIsTextureEXT; GLEW_FUN_EXPORT PFNGLPRIORITIZETEXTURESEXTPROC __glewPrioritizeTexturesEXT; GLEW_FUN_EXPORT PFNGLTEXTURENORMALEXTPROC __glewTextureNormalEXT; GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTI64VEXTPROC __glewGetQueryObjecti64vEXT; GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTUI64VEXTPROC __glewGetQueryObjectui64vEXT; GLEW_FUN_EXPORT PFNGLBEGINTRANSFORMFEEDBACKEXTPROC __glewBeginTransformFeedbackEXT; GLEW_FUN_EXPORT PFNGLBINDBUFFERBASEEXTPROC __glewBindBufferBaseEXT; GLEW_FUN_EXPORT PFNGLBINDBUFFEROFFSETEXTPROC __glewBindBufferOffsetEXT; GLEW_FUN_EXPORT PFNGLBINDBUFFERRANGEEXTPROC __glewBindBufferRangeEXT; GLEW_FUN_EXPORT PFNGLENDTRANSFORMFEEDBACKEXTPROC __glewEndTransformFeedbackEXT; GLEW_FUN_EXPORT PFNGLGETTRANSFORMFEEDBACKVARYINGEXTPROC __glewGetTransformFeedbackVaryingEXT; GLEW_FUN_EXPORT PFNGLTRANSFORMFEEDBACKVARYINGSEXTPROC __glewTransformFeedbackVaryingsEXT; GLEW_FUN_EXPORT PFNGLARRAYELEMENTEXTPROC __glewArrayElementEXT; GLEW_FUN_EXPORT PFNGLCOLORPOINTEREXTPROC __glewColorPointerEXT; GLEW_FUN_EXPORT PFNGLDRAWARRAYSEXTPROC __glewDrawArraysEXT; GLEW_FUN_EXPORT PFNGLEDGEFLAGPOINTEREXTPROC __glewEdgeFlagPointerEXT; GLEW_FUN_EXPORT PFNGLINDEXPOINTEREXTPROC __glewIndexPointerEXT; GLEW_FUN_EXPORT PFNGLNORMALPOINTEREXTPROC __glewNormalPointerEXT; GLEW_FUN_EXPORT PFNGLTEXCOORDPOINTEREXTPROC __glewTexCoordPointerEXT; GLEW_FUN_EXPORT PFNGLVERTEXPOINTEREXTPROC __glewVertexPointerEXT; GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBLDVEXTPROC __glewGetVertexAttribLdvEXT; GLEW_FUN_EXPORT PFNGLVERTEXARRAYVERTEXATTRIBLOFFSETEXTPROC __glewVertexArrayVertexAttribLOffsetEXT; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL1DEXTPROC __glewVertexAttribL1dEXT; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL1DVEXTPROC __glewVertexAttribL1dvEXT; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL2DEXTPROC __glewVertexAttribL2dEXT; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL2DVEXTPROC __glewVertexAttribL2dvEXT; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL3DEXTPROC __glewVertexAttribL3dEXT; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL3DVEXTPROC __glewVertexAttribL3dvEXT; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL4DEXTPROC __glewVertexAttribL4dEXT; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL4DVEXTPROC __glewVertexAttribL4dvEXT; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBLPOINTEREXTPROC __glewVertexAttribLPointerEXT; GLEW_FUN_EXPORT PFNGLBEGINVERTEXSHADEREXTPROC __glewBeginVertexShaderEXT; GLEW_FUN_EXPORT PFNGLBINDLIGHTPARAMETEREXTPROC __glewBindLightParameterEXT; GLEW_FUN_EXPORT PFNGLBINDMATERIALPARAMETEREXTPROC __glewBindMaterialParameterEXT; GLEW_FUN_EXPORT PFNGLBINDPARAMETEREXTPROC __glewBindParameterEXT; GLEW_FUN_EXPORT PFNGLBINDTEXGENPARAMETEREXTPROC __glewBindTexGenParameterEXT; GLEW_FUN_EXPORT PFNGLBINDTEXTUREUNITPARAMETEREXTPROC __glewBindTextureUnitParameterEXT; GLEW_FUN_EXPORT PFNGLBINDVERTEXSHADEREXTPROC __glewBindVertexShaderEXT; GLEW_FUN_EXPORT PFNGLDELETEVERTEXSHADEREXTPROC __glewDeleteVertexShaderEXT; GLEW_FUN_EXPORT PFNGLDISABLEVARIANTCLIENTSTATEEXTPROC __glewDisableVariantClientStateEXT; GLEW_FUN_EXPORT PFNGLENABLEVARIANTCLIENTSTATEEXTPROC __glewEnableVariantClientStateEXT; GLEW_FUN_EXPORT PFNGLENDVERTEXSHADEREXTPROC __glewEndVertexShaderEXT; GLEW_FUN_EXPORT PFNGLEXTRACTCOMPONENTEXTPROC __glewExtractComponentEXT; GLEW_FUN_EXPORT PFNGLGENSYMBOLSEXTPROC __glewGenSymbolsEXT; GLEW_FUN_EXPORT PFNGLGENVERTEXSHADERSEXTPROC __glewGenVertexShadersEXT; GLEW_FUN_EXPORT PFNGLGETINVARIANTBOOLEANVEXTPROC __glewGetInvariantBooleanvEXT; GLEW_FUN_EXPORT PFNGLGETINVARIANTFLOATVEXTPROC __glewGetInvariantFloatvEXT; GLEW_FUN_EXPORT PFNGLGETINVARIANTINTEGERVEXTPROC __glewGetInvariantIntegervEXT; GLEW_FUN_EXPORT PFNGLGETLOCALCONSTANTBOOLEANVEXTPROC __glewGetLocalConstantBooleanvEXT; GLEW_FUN_EXPORT PFNGLGETLOCALCONSTANTFLOATVEXTPROC __glewGetLocalConstantFloatvEXT; GLEW_FUN_EXPORT PFNGLGETLOCALCONSTANTINTEGERVEXTPROC __glewGetLocalConstantIntegervEXT; GLEW_FUN_EXPORT PFNGLGETVARIANTBOOLEANVEXTPROC __glewGetVariantBooleanvEXT; GLEW_FUN_EXPORT PFNGLGETVARIANTFLOATVEXTPROC __glewGetVariantFloatvEXT; GLEW_FUN_EXPORT PFNGLGETVARIANTINTEGERVEXTPROC __glewGetVariantIntegervEXT; GLEW_FUN_EXPORT PFNGLGETVARIANTPOINTERVEXTPROC __glewGetVariantPointervEXT; GLEW_FUN_EXPORT PFNGLINSERTCOMPONENTEXTPROC __glewInsertComponentEXT; GLEW_FUN_EXPORT PFNGLISVARIANTENABLEDEXTPROC __glewIsVariantEnabledEXT; GLEW_FUN_EXPORT PFNGLSETINVARIANTEXTPROC __glewSetInvariantEXT; GLEW_FUN_EXPORT PFNGLSETLOCALCONSTANTEXTPROC __glewSetLocalConstantEXT; GLEW_FUN_EXPORT PFNGLSHADEROP1EXTPROC __glewShaderOp1EXT; GLEW_FUN_EXPORT PFNGLSHADEROP2EXTPROC __glewShaderOp2EXT; GLEW_FUN_EXPORT PFNGLSHADEROP3EXTPROC __glewShaderOp3EXT; GLEW_FUN_EXPORT PFNGLSWIZZLEEXTPROC __glewSwizzleEXT; GLEW_FUN_EXPORT PFNGLVARIANTPOINTEREXTPROC __glewVariantPointerEXT; GLEW_FUN_EXPORT PFNGLVARIANTBVEXTPROC __glewVariantbvEXT; GLEW_FUN_EXPORT PFNGLVARIANTDVEXTPROC __glewVariantdvEXT; GLEW_FUN_EXPORT PFNGLVARIANTFVEXTPROC __glewVariantfvEXT; GLEW_FUN_EXPORT PFNGLVARIANTIVEXTPROC __glewVariantivEXT; GLEW_FUN_EXPORT PFNGLVARIANTSVEXTPROC __glewVariantsvEXT; GLEW_FUN_EXPORT PFNGLVARIANTUBVEXTPROC __glewVariantubvEXT; GLEW_FUN_EXPORT PFNGLVARIANTUIVEXTPROC __glewVariantuivEXT; GLEW_FUN_EXPORT PFNGLVARIANTUSVEXTPROC __glewVariantusvEXT; GLEW_FUN_EXPORT PFNGLWRITEMASKEXTPROC __glewWriteMaskEXT; GLEW_FUN_EXPORT PFNGLVERTEXWEIGHTPOINTEREXTPROC __glewVertexWeightPointerEXT; GLEW_FUN_EXPORT PFNGLVERTEXWEIGHTFEXTPROC __glewVertexWeightfEXT; GLEW_FUN_EXPORT PFNGLVERTEXWEIGHTFVEXTPROC __glewVertexWeightfvEXT; GLEW_FUN_EXPORT PFNGLIMPORTSYNCEXTPROC __glewImportSyncEXT; GLEW_FUN_EXPORT PFNGLFRAMETERMINATORGREMEDYPROC __glewFrameTerminatorGREMEDY; GLEW_FUN_EXPORT PFNGLSTRINGMARKERGREMEDYPROC __glewStringMarkerGREMEDY; GLEW_FUN_EXPORT PFNGLGETIMAGETRANSFORMPARAMETERFVHPPROC __glewGetImageTransformParameterfvHP; GLEW_FUN_EXPORT PFNGLGETIMAGETRANSFORMPARAMETERIVHPPROC __glewGetImageTransformParameterivHP; GLEW_FUN_EXPORT PFNGLIMAGETRANSFORMPARAMETERFHPPROC __glewImageTransformParameterfHP; GLEW_FUN_EXPORT PFNGLIMAGETRANSFORMPARAMETERFVHPPROC __glewImageTransformParameterfvHP; GLEW_FUN_EXPORT PFNGLIMAGETRANSFORMPARAMETERIHPPROC __glewImageTransformParameteriHP; GLEW_FUN_EXPORT PFNGLIMAGETRANSFORMPARAMETERIVHPPROC __glewImageTransformParameterivHP; GLEW_FUN_EXPORT PFNGLMULTIMODEDRAWARRAYSIBMPROC __glewMultiModeDrawArraysIBM; GLEW_FUN_EXPORT PFNGLMULTIMODEDRAWELEMENTSIBMPROC __glewMultiModeDrawElementsIBM; GLEW_FUN_EXPORT PFNGLCOLORPOINTERLISTIBMPROC __glewColorPointerListIBM; GLEW_FUN_EXPORT PFNGLEDGEFLAGPOINTERLISTIBMPROC __glewEdgeFlagPointerListIBM; GLEW_FUN_EXPORT PFNGLFOGCOORDPOINTERLISTIBMPROC __glewFogCoordPointerListIBM; GLEW_FUN_EXPORT PFNGLINDEXPOINTERLISTIBMPROC __glewIndexPointerListIBM; GLEW_FUN_EXPORT PFNGLNORMALPOINTERLISTIBMPROC __glewNormalPointerListIBM; GLEW_FUN_EXPORT PFNGLSECONDARYCOLORPOINTERLISTIBMPROC __glewSecondaryColorPointerListIBM; GLEW_FUN_EXPORT PFNGLTEXCOORDPOINTERLISTIBMPROC __glewTexCoordPointerListIBM; GLEW_FUN_EXPORT PFNGLVERTEXPOINTERLISTIBMPROC __glewVertexPointerListIBM; GLEW_FUN_EXPORT PFNGLCOLORPOINTERVINTELPROC __glewColorPointervINTEL; GLEW_FUN_EXPORT PFNGLNORMALPOINTERVINTELPROC __glewNormalPointervINTEL; GLEW_FUN_EXPORT PFNGLTEXCOORDPOINTERVINTELPROC __glewTexCoordPointervINTEL; GLEW_FUN_EXPORT PFNGLVERTEXPOINTERVINTELPROC __glewVertexPointervINTEL; GLEW_FUN_EXPORT PFNGLTEXSCISSORFUNCINTELPROC __glewTexScissorFuncINTEL; GLEW_FUN_EXPORT PFNGLTEXSCISSORINTELPROC __glewTexScissorINTEL; GLEW_FUN_EXPORT PFNGLDEBUGMESSAGECALLBACKPROC __glewDebugMessageCallback; GLEW_FUN_EXPORT PFNGLDEBUGMESSAGECONTROLPROC __glewDebugMessageControl; GLEW_FUN_EXPORT PFNGLDEBUGMESSAGEINSERTPROC __glewDebugMessageInsert; GLEW_FUN_EXPORT PFNGLGETDEBUGMESSAGELOGPROC __glewGetDebugMessageLog; GLEW_FUN_EXPORT PFNGLGETOBJECTLABELPROC __glewGetObjectLabel; GLEW_FUN_EXPORT PFNGLGETOBJECTPTRLABELPROC __glewGetObjectPtrLabel; GLEW_FUN_EXPORT PFNGLGETPOINTERVPROC __glewGetPointerv; GLEW_FUN_EXPORT PFNGLOBJECTLABELPROC __glewObjectLabel; GLEW_FUN_EXPORT PFNGLOBJECTPTRLABELPROC __glewObjectPtrLabel; GLEW_FUN_EXPORT PFNGLPUSHDEBUGGROUPPROC __glewPushDebugGroup; GLEW_FUN_EXPORT PFNGLBUFFERREGIONENABLEDPROC __glewBufferRegionEnabled; GLEW_FUN_EXPORT PFNGLDELETEBUFFERREGIONPROC __glewDeleteBufferRegion; GLEW_FUN_EXPORT PFNGLDRAWBUFFERREGIONPROC __glewDrawBufferRegion; GLEW_FUN_EXPORT PFNGLNEWBUFFERREGIONPROC __glewNewBufferRegion; GLEW_FUN_EXPORT PFNGLREADBUFFERREGIONPROC __glewReadBufferRegion; GLEW_FUN_EXPORT PFNGLRESIZEBUFFERSMESAPROC __glewResizeBuffersMESA; GLEW_FUN_EXPORT PFNGLWINDOWPOS2DMESAPROC __glewWindowPos2dMESA; GLEW_FUN_EXPORT PFNGLWINDOWPOS2DVMESAPROC __glewWindowPos2dvMESA; GLEW_FUN_EXPORT PFNGLWINDOWPOS2FMESAPROC __glewWindowPos2fMESA; GLEW_FUN_EXPORT PFNGLWINDOWPOS2FVMESAPROC __glewWindowPos2fvMESA; GLEW_FUN_EXPORT PFNGLWINDOWPOS2IMESAPROC __glewWindowPos2iMESA; GLEW_FUN_EXPORT PFNGLWINDOWPOS2IVMESAPROC __glewWindowPos2ivMESA; GLEW_FUN_EXPORT PFNGLWINDOWPOS2SMESAPROC __glewWindowPos2sMESA; GLEW_FUN_EXPORT PFNGLWINDOWPOS2SVMESAPROC __glewWindowPos2svMESA; GLEW_FUN_EXPORT PFNGLWINDOWPOS3DMESAPROC __glewWindowPos3dMESA; GLEW_FUN_EXPORT PFNGLWINDOWPOS3DVMESAPROC __glewWindowPos3dvMESA; GLEW_FUN_EXPORT PFNGLWINDOWPOS3FMESAPROC __glewWindowPos3fMESA; GLEW_FUN_EXPORT PFNGLWINDOWPOS3FVMESAPROC __glewWindowPos3fvMESA; GLEW_FUN_EXPORT PFNGLWINDOWPOS3IMESAPROC __glewWindowPos3iMESA; GLEW_FUN_EXPORT PFNGLWINDOWPOS3IVMESAPROC __glewWindowPos3ivMESA; GLEW_FUN_EXPORT PFNGLWINDOWPOS3SMESAPROC __glewWindowPos3sMESA; GLEW_FUN_EXPORT PFNGLWINDOWPOS3SVMESAPROC __glewWindowPos3svMESA; GLEW_FUN_EXPORT PFNGLWINDOWPOS4DMESAPROC __glewWindowPos4dMESA; GLEW_FUN_EXPORT PFNGLWINDOWPOS4DVMESAPROC __glewWindowPos4dvMESA; GLEW_FUN_EXPORT PFNGLWINDOWPOS4FMESAPROC __glewWindowPos4fMESA; GLEW_FUN_EXPORT PFNGLWINDOWPOS4FVMESAPROC __glewWindowPos4fvMESA; GLEW_FUN_EXPORT PFNGLWINDOWPOS4IMESAPROC __glewWindowPos4iMESA; GLEW_FUN_EXPORT PFNGLWINDOWPOS4IVMESAPROC __glewWindowPos4ivMESA; GLEW_FUN_EXPORT PFNGLWINDOWPOS4SMESAPROC __glewWindowPos4sMESA; GLEW_FUN_EXPORT PFNGLWINDOWPOS4SVMESAPROC __glewWindowPos4svMESA; GLEW_FUN_EXPORT PFNGLGETIMAGEHANDLENVPROC __glewGetImageHandleNV; GLEW_FUN_EXPORT PFNGLGETTEXTUREHANDLENVPROC __glewGetTextureHandleNV; GLEW_FUN_EXPORT PFNGLGETTEXTURESAMPLERHANDLENVPROC __glewGetTextureSamplerHandleNV; GLEW_FUN_EXPORT PFNGLISIMAGEHANDLERESIDENTNVPROC __glewIsImageHandleResidentNV; GLEW_FUN_EXPORT PFNGLISTEXTUREHANDLERESIDENTNVPROC __glewIsTextureHandleResidentNV; GLEW_FUN_EXPORT PFNGLMAKEIMAGEHANDLENONRESIDENTNVPROC __glewMakeImageHandleNonResidentNV; GLEW_FUN_EXPORT PFNGLMAKEIMAGEHANDLERESIDENTNVPROC __glewMakeImageHandleResidentNV; GLEW_FUN_EXPORT PFNGLMAKETEXTUREHANDLENONRESIDENTNVPROC __glewMakeTextureHandleNonResidentNV; GLEW_FUN_EXPORT PFNGLMAKETEXTUREHANDLERESIDENTNVPROC __glewMakeTextureHandleResidentNV; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMHANDLEUI64NVPROC __glewProgramUniformHandleui64NV; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMHANDLEUI64VNVPROC __glewProgramUniformHandleui64vNV; GLEW_FUN_EXPORT PFNGLUNIFORMHANDLEUI64NVPROC __glewUniformHandleui64NV; GLEW_FUN_EXPORT PFNGLUNIFORMHANDLEUI64VNVPROC __glewUniformHandleui64vNV; GLEW_FUN_EXPORT PFNGLBEGINCONDITIONALRENDERNVPROC __glewBeginConditionalRenderNV; GLEW_FUN_EXPORT PFNGLENDCONDITIONALRENDERNVPROC __glewEndConditionalRenderNV; GLEW_FUN_EXPORT PFNGLCOPYIMAGESUBDATANVPROC __glewCopyImageSubDataNV; GLEW_FUN_EXPORT PFNGLCLEARDEPTHDNVPROC __glewClearDepthdNV; GLEW_FUN_EXPORT PFNGLDEPTHBOUNDSDNVPROC __glewDepthBoundsdNV; GLEW_FUN_EXPORT PFNGLDEPTHRANGEDNVPROC __glewDepthRangedNV; GLEW_FUN_EXPORT PFNGLEVALMAPSNVPROC __glewEvalMapsNV; GLEW_FUN_EXPORT PFNGLGETMAPATTRIBPARAMETERFVNVPROC __glewGetMapAttribParameterfvNV; GLEW_FUN_EXPORT PFNGLGETMAPATTRIBPARAMETERIVNVPROC __glewGetMapAttribParameterivNV; GLEW_FUN_EXPORT PFNGLGETMAPCONTROLPOINTSNVPROC __glewGetMapControlPointsNV; GLEW_FUN_EXPORT PFNGLGETMAPPARAMETERFVNVPROC __glewGetMapParameterfvNV; GLEW_FUN_EXPORT PFNGLGETMAPPARAMETERIVNVPROC __glewGetMapParameterivNV; GLEW_FUN_EXPORT PFNGLMAPCONTROLPOINTSNVPROC __glewMapControlPointsNV; GLEW_FUN_EXPORT PFNGLMAPPARAMETERFVNVPROC __glewMapParameterfvNV; GLEW_FUN_EXPORT PFNGLMAPPARAMETERIVNVPROC __glewMapParameterivNV; GLEW_FUN_EXPORT PFNGLGETMULTISAMPLEFVNVPROC __glewGetMultisamplefvNV; GLEW_FUN_EXPORT PFNGLSAMPLEMASKINDEXEDNVPROC __glewSampleMaskIndexedNV; GLEW_FUN_EXPORT PFNGLTEXRENDERBUFFERNVPROC __glewTexRenderbufferNV; GLEW_FUN_EXPORT PFNGLDELETEFENCESNVPROC __glewDeleteFencesNV; GLEW_FUN_EXPORT PFNGLFINISHFENCENVPROC __glewFinishFenceNV; GLEW_FUN_EXPORT PFNGLGENFENCESNVPROC __glewGenFencesNV; GLEW_FUN_EXPORT PFNGLGETFENCEIVNVPROC __glewGetFenceivNV; GLEW_FUN_EXPORT PFNGLISFENCENVPROC __glewIsFenceNV; GLEW_FUN_EXPORT PFNGLSETFENCENVPROC __glewSetFenceNV; GLEW_FUN_EXPORT PFNGLTESTFENCENVPROC __glewTestFenceNV; GLEW_FUN_EXPORT PFNGLGETPROGRAMNAMEDPARAMETERDVNVPROC __glewGetProgramNamedParameterdvNV; GLEW_FUN_EXPORT PFNGLGETPROGRAMNAMEDPARAMETERFVNVPROC __glewGetProgramNamedParameterfvNV; GLEW_FUN_EXPORT PFNGLPROGRAMNAMEDPARAMETER4DNVPROC __glewProgramNamedParameter4dNV; GLEW_FUN_EXPORT PFNGLPROGRAMNAMEDPARAMETER4DVNVPROC __glewProgramNamedParameter4dvNV; GLEW_FUN_EXPORT PFNGLPROGRAMNAMEDPARAMETER4FNVPROC __glewProgramNamedParameter4fNV; GLEW_FUN_EXPORT PFNGLPROGRAMNAMEDPARAMETER4FVNVPROC __glewProgramNamedParameter4fvNV; GLEW_FUN_EXPORT PFNGLRENDERBUFFERSTORAGEMULTISAMPLECOVERAGENVPROC __glewRenderbufferStorageMultisampleCoverageNV; GLEW_FUN_EXPORT PFNGLPROGRAMVERTEXLIMITNVPROC __glewProgramVertexLimitNV; GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETERI4INVPROC __glewProgramEnvParameterI4iNV; GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETERI4IVNVPROC __glewProgramEnvParameterI4ivNV; GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETERI4UINVPROC __glewProgramEnvParameterI4uiNV; GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETERI4UIVNVPROC __glewProgramEnvParameterI4uivNV; GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETERSI4IVNVPROC __glewProgramEnvParametersI4ivNV; GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETERSI4UIVNVPROC __glewProgramEnvParametersI4uivNV; GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETERI4INVPROC __glewProgramLocalParameterI4iNV; GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETERI4IVNVPROC __glewProgramLocalParameterI4ivNV; GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETERI4UINVPROC __glewProgramLocalParameterI4uiNV; GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETERI4UIVNVPROC __glewProgramLocalParameterI4uivNV; GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETERSI4IVNVPROC __glewProgramLocalParametersI4ivNV; GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETERSI4UIVNVPROC __glewProgramLocalParametersI4uivNV; GLEW_FUN_EXPORT PFNGLGETUNIFORMI64VNVPROC __glewGetUniformi64vNV; GLEW_FUN_EXPORT PFNGLGETUNIFORMUI64VNVPROC __glewGetUniformui64vNV; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1I64NVPROC __glewProgramUniform1i64NV; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1I64VNVPROC __glewProgramUniform1i64vNV; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1UI64NVPROC __glewProgramUniform1ui64NV; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1UI64VNVPROC __glewProgramUniform1ui64vNV; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2I64NVPROC __glewProgramUniform2i64NV; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2I64VNVPROC __glewProgramUniform2i64vNV; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2UI64NVPROC __glewProgramUniform2ui64NV; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2UI64VNVPROC __glewProgramUniform2ui64vNV; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3I64NVPROC __glewProgramUniform3i64NV; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3I64VNVPROC __glewProgramUniform3i64vNV; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3UI64NVPROC __glewProgramUniform3ui64NV; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3UI64VNVPROC __glewProgramUniform3ui64vNV; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4I64NVPROC __glewProgramUniform4i64NV; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4I64VNVPROC __glewProgramUniform4i64vNV; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4UI64NVPROC __glewProgramUniform4ui64NV; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4UI64VNVPROC __glewProgramUniform4ui64vNV; GLEW_FUN_EXPORT PFNGLUNIFORM1I64NVPROC __glewUniform1i64NV; GLEW_FUN_EXPORT PFNGLUNIFORM1I64VNVPROC __glewUniform1i64vNV; GLEW_FUN_EXPORT PFNGLUNIFORM1UI64NVPROC __glewUniform1ui64NV; GLEW_FUN_EXPORT PFNGLUNIFORM1UI64VNVPROC __glewUniform1ui64vNV; GLEW_FUN_EXPORT PFNGLUNIFORM2I64NVPROC __glewUniform2i64NV; GLEW_FUN_EXPORT PFNGLUNIFORM2I64VNVPROC __glewUniform2i64vNV; GLEW_FUN_EXPORT PFNGLUNIFORM2UI64NVPROC __glewUniform2ui64NV; GLEW_FUN_EXPORT PFNGLUNIFORM2UI64VNVPROC __glewUniform2ui64vNV; GLEW_FUN_EXPORT PFNGLUNIFORM3I64NVPROC __glewUniform3i64NV; GLEW_FUN_EXPORT PFNGLUNIFORM3I64VNVPROC __glewUniform3i64vNV; GLEW_FUN_EXPORT PFNGLUNIFORM3UI64NVPROC __glewUniform3ui64NV; GLEW_FUN_EXPORT PFNGLUNIFORM3UI64VNVPROC __glewUniform3ui64vNV; GLEW_FUN_EXPORT PFNGLUNIFORM4I64NVPROC __glewUniform4i64NV; GLEW_FUN_EXPORT PFNGLUNIFORM4I64VNVPROC __glewUniform4i64vNV; GLEW_FUN_EXPORT PFNGLUNIFORM4UI64NVPROC __glewUniform4ui64NV; GLEW_FUN_EXPORT PFNGLUNIFORM4UI64VNVPROC __glewUniform4ui64vNV; GLEW_FUN_EXPORT PFNGLCOLOR3HNVPROC __glewColor3hNV; GLEW_FUN_EXPORT PFNGLCOLOR3HVNVPROC __glewColor3hvNV; GLEW_FUN_EXPORT PFNGLCOLOR4HNVPROC __glewColor4hNV; GLEW_FUN_EXPORT PFNGLCOLOR4HVNVPROC __glewColor4hvNV; GLEW_FUN_EXPORT PFNGLFOGCOORDHNVPROC __glewFogCoordhNV; GLEW_FUN_EXPORT PFNGLFOGCOORDHVNVPROC __glewFogCoordhvNV; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1HNVPROC __glewMultiTexCoord1hNV; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1HVNVPROC __glewMultiTexCoord1hvNV; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2HNVPROC __glewMultiTexCoord2hNV; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2HVNVPROC __glewMultiTexCoord2hvNV; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3HNVPROC __glewMultiTexCoord3hNV; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3HVNVPROC __glewMultiTexCoord3hvNV; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4HNVPROC __glewMultiTexCoord4hNV; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4HVNVPROC __glewMultiTexCoord4hvNV; GLEW_FUN_EXPORT PFNGLNORMAL3HNVPROC __glewNormal3hNV; GLEW_FUN_EXPORT PFNGLNORMAL3HVNVPROC __glewNormal3hvNV; GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3HNVPROC __glewSecondaryColor3hNV; GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3HVNVPROC __glewSecondaryColor3hvNV; GLEW_FUN_EXPORT PFNGLTEXCOORD1HNVPROC __glewTexCoord1hNV; GLEW_FUN_EXPORT PFNGLTEXCOORD1HVNVPROC __glewTexCoord1hvNV; GLEW_FUN_EXPORT PFNGLTEXCOORD2HNVPROC __glewTexCoord2hNV; GLEW_FUN_EXPORT PFNGLTEXCOORD2HVNVPROC __glewTexCoord2hvNV; GLEW_FUN_EXPORT PFNGLTEXCOORD3HNVPROC __glewTexCoord3hNV; GLEW_FUN_EXPORT PFNGLTEXCOORD3HVNVPROC __glewTexCoord3hvNV; GLEW_FUN_EXPORT PFNGLTEXCOORD4HNVPROC __glewTexCoord4hNV; GLEW_FUN_EXPORT PFNGLTEXCOORD4HVNVPROC __glewTexCoord4hvNV; GLEW_FUN_EXPORT PFNGLVERTEX2HNVPROC __glewVertex2hNV; GLEW_FUN_EXPORT PFNGLVERTEX2HVNVPROC __glewVertex2hvNV; GLEW_FUN_EXPORT PFNGLVERTEX3HNVPROC __glewVertex3hNV; GLEW_FUN_EXPORT PFNGLVERTEX3HVNVPROC __glewVertex3hvNV; GLEW_FUN_EXPORT PFNGLVERTEX4HNVPROC __glewVertex4hNV; GLEW_FUN_EXPORT PFNGLVERTEX4HVNVPROC __glewVertex4hvNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1HNVPROC __glewVertexAttrib1hNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1HVNVPROC __glewVertexAttrib1hvNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2HNVPROC __glewVertexAttrib2hNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2HVNVPROC __glewVertexAttrib2hvNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3HNVPROC __glewVertexAttrib3hNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3HVNVPROC __glewVertexAttrib3hvNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4HNVPROC __glewVertexAttrib4hNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4HVNVPROC __glewVertexAttrib4hvNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS1HVNVPROC __glewVertexAttribs1hvNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS2HVNVPROC __glewVertexAttribs2hvNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS3HVNVPROC __glewVertexAttribs3hvNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS4HVNVPROC __glewVertexAttribs4hvNV; GLEW_FUN_EXPORT PFNGLVERTEXWEIGHTHNVPROC __glewVertexWeighthNV; GLEW_FUN_EXPORT PFNGLVERTEXWEIGHTHVNVPROC __glewVertexWeighthvNV; GLEW_FUN_EXPORT PFNGLBEGINOCCLUSIONQUERYNVPROC __glewBeginOcclusionQueryNV; GLEW_FUN_EXPORT PFNGLDELETEOCCLUSIONQUERIESNVPROC __glewDeleteOcclusionQueriesNV; GLEW_FUN_EXPORT PFNGLENDOCCLUSIONQUERYNVPROC __glewEndOcclusionQueryNV; GLEW_FUN_EXPORT PFNGLGENOCCLUSIONQUERIESNVPROC __glewGenOcclusionQueriesNV; GLEW_FUN_EXPORT PFNGLGETOCCLUSIONQUERYIVNVPROC __glewGetOcclusionQueryivNV; GLEW_FUN_EXPORT PFNGLGETOCCLUSIONQUERYUIVNVPROC __glewGetOcclusionQueryuivNV; GLEW_FUN_EXPORT PFNGLISOCCLUSIONQUERYNVPROC __glewIsOcclusionQueryNV; GLEW_FUN_EXPORT PFNGLPROGRAMBUFFERPARAMETERSIIVNVPROC __glewProgramBufferParametersIivNV; GLEW_FUN_EXPORT PFNGLPROGRAMBUFFERPARAMETERSIUIVNVPROC __glewProgramBufferParametersIuivNV; GLEW_FUN_EXPORT PFNGLPROGRAMBUFFERPARAMETERSFVNVPROC __glewProgramBufferParametersfvNV; GLEW_FUN_EXPORT PFNGLCOPYPATHNVPROC __glewCopyPathNV; GLEW_FUN_EXPORT PFNGLCOVERFILLPATHINSTANCEDNVPROC __glewCoverFillPathInstancedNV; GLEW_FUN_EXPORT PFNGLCOVERFILLPATHNVPROC __glewCoverFillPathNV; GLEW_FUN_EXPORT PFNGLCOVERSTROKEPATHINSTANCEDNVPROC __glewCoverStrokePathInstancedNV; GLEW_FUN_EXPORT PFNGLCOVERSTROKEPATHNVPROC __glewCoverStrokePathNV; GLEW_FUN_EXPORT PFNGLDELETEPATHSNVPROC __glewDeletePathsNV; GLEW_FUN_EXPORT PFNGLGENPATHSNVPROC __glewGenPathsNV; GLEW_FUN_EXPORT PFNGLGETPATHCOLORGENFVNVPROC __glewGetPathColorGenfvNV; GLEW_FUN_EXPORT PFNGLGETPATHCOLORGENIVNVPROC __glewGetPathColorGenivNV; GLEW_FUN_EXPORT PFNGLGETPATHCOMMANDSNVPROC __glewGetPathCommandsNV; GLEW_FUN_EXPORT PFNGLGETPATHCOORDSNVPROC __glewGetPathCoordsNV; GLEW_FUN_EXPORT PFNGLGETPATHDASHARRAYNVPROC __glewGetPathDashArrayNV; GLEW_FUN_EXPORT PFNGLGETPATHLENGTHNVPROC __glewGetPathLengthNV; GLEW_FUN_EXPORT PFNGLGETPATHMETRICRANGENVPROC __glewGetPathMetricRangeNV; GLEW_FUN_EXPORT PFNGLGETPATHMETRICSNVPROC __glewGetPathMetricsNV; GLEW_FUN_EXPORT PFNGLGETPATHPARAMETERFVNVPROC __glewGetPathParameterfvNV; GLEW_FUN_EXPORT PFNGLGETPATHPARAMETERIVNVPROC __glewGetPathParameterivNV; GLEW_FUN_EXPORT PFNGLGETPATHSPACINGNVPROC __glewGetPathSpacingNV; GLEW_FUN_EXPORT PFNGLGETPATHTEXGENFVNVPROC __glewGetPathTexGenfvNV; GLEW_FUN_EXPORT PFNGLGETPATHTEXGENIVNVPROC __glewGetPathTexGenivNV; GLEW_FUN_EXPORT PFNGLINTERPOLATEPATHSNVPROC __glewInterpolatePathsNV; GLEW_FUN_EXPORT PFNGLISPATHNVPROC __glewIsPathNV; GLEW_FUN_EXPORT PFNGLISPOINTINFILLPATHNVPROC __glewIsPointInFillPathNV; GLEW_FUN_EXPORT PFNGLISPOINTINSTROKEPATHNVPROC __glewIsPointInStrokePathNV; GLEW_FUN_EXPORT PFNGLPATHCOLORGENNVPROC __glewPathColorGenNV; GLEW_FUN_EXPORT PFNGLPATHCOMMANDSNVPROC __glewPathCommandsNV; GLEW_FUN_EXPORT PFNGLPATHCOORDSNVPROC __glewPathCoordsNV; GLEW_FUN_EXPORT PFNGLPATHCOVERDEPTHFUNCNVPROC __glewPathCoverDepthFuncNV; GLEW_FUN_EXPORT PFNGLPATHDASHARRAYNVPROC __glewPathDashArrayNV; GLEW_FUN_EXPORT PFNGLPATHFOGGENNVPROC __glewPathFogGenNV; GLEW_FUN_EXPORT PFNGLPATHGLYPHRANGENVPROC __glewPathGlyphRangeNV; GLEW_FUN_EXPORT PFNGLPATHGLYPHSNVPROC __glewPathGlyphsNV; GLEW_FUN_EXPORT PFNGLPATHPARAMETERFNVPROC __glewPathParameterfNV; GLEW_FUN_EXPORT PFNGLPATHPARAMETERFVNVPROC __glewPathParameterfvNV; GLEW_FUN_EXPORT PFNGLPATHPARAMETERINVPROC __glewPathParameteriNV; GLEW_FUN_EXPORT PFNGLPATHPARAMETERIVNVPROC __glewPathParameterivNV; GLEW_FUN_EXPORT PFNGLPATHSTENCILDEPTHOFFSETNVPROC __glewPathStencilDepthOffsetNV; GLEW_FUN_EXPORT PFNGLPATHSTENCILFUNCNVPROC __glewPathStencilFuncNV; GLEW_FUN_EXPORT PFNGLPATHSTRINGNVPROC __glewPathStringNV; GLEW_FUN_EXPORT PFNGLPATHSUBCOMMANDSNVPROC __glewPathSubCommandsNV; GLEW_FUN_EXPORT PFNGLPATHSUBCOORDSNVPROC __glewPathSubCoordsNV; GLEW_FUN_EXPORT PFNGLPATHTEXGENNVPROC __glewPathTexGenNV; GLEW_FUN_EXPORT PFNGLPOINTALONGPATHNVPROC __glewPointAlongPathNV; GLEW_FUN_EXPORT PFNGLSTENCILFILLPATHINSTANCEDNVPROC __glewStencilFillPathInstancedNV; GLEW_FUN_EXPORT PFNGLSTENCILFILLPATHNVPROC __glewStencilFillPathNV; GLEW_FUN_EXPORT PFNGLSTENCILSTROKEPATHINSTANCEDNVPROC __glewStencilStrokePathInstancedNV; GLEW_FUN_EXPORT PFNGLSTENCILSTROKEPATHNVPROC __glewStencilStrokePathNV; GLEW_FUN_EXPORT PFNGLTRANSFORMPATHNVPROC __glewTransformPathNV; GLEW_FUN_EXPORT PFNGLWEIGHTPATHSNVPROC __glewWeightPathsNV; GLEW_FUN_EXPORT PFNGLFLUSHPIXELDATARANGENVPROC __glewFlushPixelDataRangeNV; GLEW_FUN_EXPORT PFNGLPIXELDATARANGENVPROC __glewPixelDataRangeNV; GLEW_FUN_EXPORT PFNGLPOINTPARAMETERINVPROC __glewPointParameteriNV; GLEW_FUN_EXPORT PFNGLPOINTPARAMETERIVNVPROC __glewPointParameterivNV; GLEW_FUN_EXPORT PFNGLGETVIDEOI64VNVPROC __glewGetVideoi64vNV; GLEW_FUN_EXPORT PFNGLGETVIDEOIVNVPROC __glewGetVideoivNV; GLEW_FUN_EXPORT PFNGLGETVIDEOUI64VNVPROC __glewGetVideoui64vNV; GLEW_FUN_EXPORT PFNGLGETVIDEOUIVNVPROC __glewGetVideouivNV; GLEW_FUN_EXPORT PFNGLPRESENTFRAMEDUALFILLNVPROC __glewPresentFrameDualFillNV; GLEW_FUN_EXPORT PFNGLPRESENTFRAMEKEYEDNVPROC __glewPresentFrameKeyedNV; GLEW_FUN_EXPORT PFNGLPRIMITIVERESTARTINDEXNVPROC __glewPrimitiveRestartIndexNV; GLEW_FUN_EXPORT PFNGLPRIMITIVERESTARTNVPROC __glewPrimitiveRestartNV; GLEW_FUN_EXPORT PFNGLCOMBINERINPUTNVPROC __glewCombinerInputNV; GLEW_FUN_EXPORT PFNGLCOMBINEROUTPUTNVPROC __glewCombinerOutputNV; GLEW_FUN_EXPORT PFNGLCOMBINERPARAMETERFNVPROC __glewCombinerParameterfNV; GLEW_FUN_EXPORT PFNGLCOMBINERPARAMETERFVNVPROC __glewCombinerParameterfvNV; GLEW_FUN_EXPORT PFNGLCOMBINERPARAMETERINVPROC __glewCombinerParameteriNV; GLEW_FUN_EXPORT PFNGLCOMBINERPARAMETERIVNVPROC __glewCombinerParameterivNV; GLEW_FUN_EXPORT PFNGLFINALCOMBINERINPUTNVPROC __glewFinalCombinerInputNV; GLEW_FUN_EXPORT PFNGLGETCOMBINERINPUTPARAMETERFVNVPROC __glewGetCombinerInputParameterfvNV; GLEW_FUN_EXPORT PFNGLGETCOMBINERINPUTPARAMETERIVNVPROC __glewGetCombinerInputParameterivNV; GLEW_FUN_EXPORT PFNGLGETCOMBINEROUTPUTPARAMETERFVNVPROC __glewGetCombinerOutputParameterfvNV; GLEW_FUN_EXPORT PFNGLGETCOMBINEROUTPUTPARAMETERIVNVPROC __glewGetCombinerOutputParameterivNV; GLEW_FUN_EXPORT PFNGLGETFINALCOMBINERINPUTPARAMETERFVNVPROC __glewGetFinalCombinerInputParameterfvNV; GLEW_FUN_EXPORT PFNGLGETFINALCOMBINERINPUTPARAMETERIVNVPROC __glewGetFinalCombinerInputParameterivNV; GLEW_FUN_EXPORT PFNGLCOMBINERSTAGEPARAMETERFVNVPROC __glewCombinerStageParameterfvNV; GLEW_FUN_EXPORT PFNGLGETCOMBINERSTAGEPARAMETERFVNVPROC __glewGetCombinerStageParameterfvNV; GLEW_FUN_EXPORT PFNGLGETBUFFERPARAMETERUI64VNVPROC __glewGetBufferParameterui64vNV; GLEW_FUN_EXPORT PFNGLGETINTEGERUI64VNVPROC __glewGetIntegerui64vNV; GLEW_FUN_EXPORT PFNGLGETNAMEDBUFFERPARAMETERUI64VNVPROC __glewGetNamedBufferParameterui64vNV; GLEW_FUN_EXPORT PFNGLISBUFFERRESIDENTNVPROC __glewIsBufferResidentNV; GLEW_FUN_EXPORT PFNGLISNAMEDBUFFERRESIDENTNVPROC __glewIsNamedBufferResidentNV; GLEW_FUN_EXPORT PFNGLMAKEBUFFERNONRESIDENTNVPROC __glewMakeBufferNonResidentNV; GLEW_FUN_EXPORT PFNGLMAKEBUFFERRESIDENTNVPROC __glewMakeBufferResidentNV; GLEW_FUN_EXPORT PFNGLMAKENAMEDBUFFERNONRESIDENTNVPROC __glewMakeNamedBufferNonResidentNV; GLEW_FUN_EXPORT PFNGLMAKENAMEDBUFFERRESIDENTNVPROC __glewMakeNamedBufferResidentNV; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMUI64NVPROC __glewProgramUniformui64NV; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMUI64VNVPROC __glewProgramUniformui64vNV; GLEW_FUN_EXPORT PFNGLUNIFORMUI64NVPROC __glewUniformui64NV; GLEW_FUN_EXPORT PFNGLUNIFORMUI64VNVPROC __glewUniformui64vNV; GLEW_FUN_EXPORT PFNGLTEXTUREBARRIERNVPROC __glewTextureBarrierNV; GLEW_FUN_EXPORT PFNGLTEXIMAGE2DMULTISAMPLECOVERAGENVPROC __glewTexImage2DMultisampleCoverageNV; GLEW_FUN_EXPORT PFNGLTEXIMAGE3DMULTISAMPLECOVERAGENVPROC __glewTexImage3DMultisampleCoverageNV; GLEW_FUN_EXPORT PFNGLTEXTUREIMAGE2DMULTISAMPLECOVERAGENVPROC __glewTextureImage2DMultisampleCoverageNV; GLEW_FUN_EXPORT PFNGLTEXTUREIMAGE2DMULTISAMPLENVPROC __glewTextureImage2DMultisampleNV; GLEW_FUN_EXPORT PFNGLTEXTUREIMAGE3DMULTISAMPLECOVERAGENVPROC __glewTextureImage3DMultisampleCoverageNV; GLEW_FUN_EXPORT PFNGLTEXTUREIMAGE3DMULTISAMPLENVPROC __glewTextureImage3DMultisampleNV; GLEW_FUN_EXPORT PFNGLACTIVEVARYINGNVPROC __glewActiveVaryingNV; GLEW_FUN_EXPORT PFNGLBEGINTRANSFORMFEEDBACKNVPROC __glewBeginTransformFeedbackNV; GLEW_FUN_EXPORT PFNGLBINDBUFFERBASENVPROC __glewBindBufferBaseNV; GLEW_FUN_EXPORT PFNGLBINDBUFFEROFFSETNVPROC __glewBindBufferOffsetNV; GLEW_FUN_EXPORT PFNGLBINDBUFFERRANGENVPROC __glewBindBufferRangeNV; GLEW_FUN_EXPORT PFNGLENDTRANSFORMFEEDBACKNVPROC __glewEndTransformFeedbackNV; GLEW_FUN_EXPORT PFNGLGETACTIVEVARYINGNVPROC __glewGetActiveVaryingNV; GLEW_FUN_EXPORT PFNGLGETTRANSFORMFEEDBACKVARYINGNVPROC __glewGetTransformFeedbackVaryingNV; GLEW_FUN_EXPORT PFNGLGETVARYINGLOCATIONNVPROC __glewGetVaryingLocationNV; GLEW_FUN_EXPORT PFNGLTRANSFORMFEEDBACKATTRIBSNVPROC __glewTransformFeedbackAttribsNV; GLEW_FUN_EXPORT PFNGLTRANSFORMFEEDBACKVARYINGSNVPROC __glewTransformFeedbackVaryingsNV; GLEW_FUN_EXPORT PFNGLBINDTRANSFORMFEEDBACKNVPROC __glewBindTransformFeedbackNV; GLEW_FUN_EXPORT PFNGLDELETETRANSFORMFEEDBACKSNVPROC __glewDeleteTransformFeedbacksNV; GLEW_FUN_EXPORT PFNGLDRAWTRANSFORMFEEDBACKNVPROC __glewDrawTransformFeedbackNV; GLEW_FUN_EXPORT PFNGLGENTRANSFORMFEEDBACKSNVPROC __glewGenTransformFeedbacksNV; GLEW_FUN_EXPORT PFNGLISTRANSFORMFEEDBACKNVPROC __glewIsTransformFeedbackNV; GLEW_FUN_EXPORT PFNGLPAUSETRANSFORMFEEDBACKNVPROC __glewPauseTransformFeedbackNV; GLEW_FUN_EXPORT PFNGLRESUMETRANSFORMFEEDBACKNVPROC __glewResumeTransformFeedbackNV; GLEW_FUN_EXPORT PFNGLVDPAUFININVPROC __glewVDPAUFiniNV; GLEW_FUN_EXPORT PFNGLVDPAUGETSURFACEIVNVPROC __glewVDPAUGetSurfaceivNV; GLEW_FUN_EXPORT PFNGLVDPAUINITNVPROC __glewVDPAUInitNV; GLEW_FUN_EXPORT PFNGLVDPAUISSURFACENVPROC __glewVDPAUIsSurfaceNV; GLEW_FUN_EXPORT PFNGLVDPAUMAPSURFACESNVPROC __glewVDPAUMapSurfacesNV; GLEW_FUN_EXPORT PFNGLVDPAUREGISTEROUTPUTSURFACENVPROC __glewVDPAURegisterOutputSurfaceNV; GLEW_FUN_EXPORT PFNGLVDPAUREGISTERVIDEOSURFACENVPROC __glewVDPAURegisterVideoSurfaceNV; GLEW_FUN_EXPORT PFNGLVDPAUSURFACEACCESSNVPROC __glewVDPAUSurfaceAccessNV; GLEW_FUN_EXPORT PFNGLVDPAUUNMAPSURFACESNVPROC __glewVDPAUUnmapSurfacesNV; GLEW_FUN_EXPORT PFNGLVDPAUUNREGISTERSURFACENVPROC __glewVDPAUUnregisterSurfaceNV; GLEW_FUN_EXPORT PFNGLFLUSHVERTEXARRAYRANGENVPROC __glewFlushVertexArrayRangeNV; GLEW_FUN_EXPORT PFNGLVERTEXARRAYRANGENVPROC __glewVertexArrayRangeNV; GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBLI64VNVPROC __glewGetVertexAttribLi64vNV; GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBLUI64VNVPROC __glewGetVertexAttribLui64vNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL1I64NVPROC __glewVertexAttribL1i64NV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL1I64VNVPROC __glewVertexAttribL1i64vNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL1UI64NVPROC __glewVertexAttribL1ui64NV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL1UI64VNVPROC __glewVertexAttribL1ui64vNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL2I64NVPROC __glewVertexAttribL2i64NV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL2I64VNVPROC __glewVertexAttribL2i64vNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL2UI64NVPROC __glewVertexAttribL2ui64NV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL2UI64VNVPROC __glewVertexAttribL2ui64vNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL3I64NVPROC __glewVertexAttribL3i64NV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL3I64VNVPROC __glewVertexAttribL3i64vNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL3UI64NVPROC __glewVertexAttribL3ui64NV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL3UI64VNVPROC __glewVertexAttribL3ui64vNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL4I64NVPROC __glewVertexAttribL4i64NV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL4I64VNVPROC __glewVertexAttribL4i64vNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL4UI64NVPROC __glewVertexAttribL4ui64NV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL4UI64VNVPROC __glewVertexAttribL4ui64vNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBLFORMATNVPROC __glewVertexAttribLFormatNV; GLEW_FUN_EXPORT PFNGLBUFFERADDRESSRANGENVPROC __glewBufferAddressRangeNV; GLEW_FUN_EXPORT PFNGLCOLORFORMATNVPROC __glewColorFormatNV; GLEW_FUN_EXPORT PFNGLEDGEFLAGFORMATNVPROC __glewEdgeFlagFormatNV; GLEW_FUN_EXPORT PFNGLFOGCOORDFORMATNVPROC __glewFogCoordFormatNV; GLEW_FUN_EXPORT PFNGLGETINTEGERUI64I_VNVPROC __glewGetIntegerui64i_vNV; GLEW_FUN_EXPORT PFNGLINDEXFORMATNVPROC __glewIndexFormatNV; GLEW_FUN_EXPORT PFNGLNORMALFORMATNVPROC __glewNormalFormatNV; GLEW_FUN_EXPORT PFNGLSECONDARYCOLORFORMATNVPROC __glewSecondaryColorFormatNV; GLEW_FUN_EXPORT PFNGLTEXCOORDFORMATNVPROC __glewTexCoordFormatNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBFORMATNVPROC __glewVertexAttribFormatNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBIFORMATNVPROC __glewVertexAttribIFormatNV; GLEW_FUN_EXPORT PFNGLVERTEXFORMATNVPROC __glewVertexFormatNV; GLEW_FUN_EXPORT PFNGLAREPROGRAMSRESIDENTNVPROC __glewAreProgramsResidentNV; GLEW_FUN_EXPORT PFNGLBINDPROGRAMNVPROC __glewBindProgramNV; GLEW_FUN_EXPORT PFNGLDELETEPROGRAMSNVPROC __glewDeleteProgramsNV; GLEW_FUN_EXPORT PFNGLEXECUTEPROGRAMNVPROC __glewExecuteProgramNV; GLEW_FUN_EXPORT PFNGLGENPROGRAMSNVPROC __glewGenProgramsNV; GLEW_FUN_EXPORT PFNGLGETPROGRAMPARAMETERDVNVPROC __glewGetProgramParameterdvNV; GLEW_FUN_EXPORT PFNGLGETPROGRAMPARAMETERFVNVPROC __glewGetProgramParameterfvNV; GLEW_FUN_EXPORT PFNGLGETPROGRAMSTRINGNVPROC __glewGetProgramStringNV; GLEW_FUN_EXPORT PFNGLGETPROGRAMIVNVPROC __glewGetProgramivNV; GLEW_FUN_EXPORT PFNGLGETTRACKMATRIXIVNVPROC __glewGetTrackMatrixivNV; GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBPOINTERVNVPROC __glewGetVertexAttribPointervNV; GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBDVNVPROC __glewGetVertexAttribdvNV; GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBFVNVPROC __glewGetVertexAttribfvNV; GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBIVNVPROC __glewGetVertexAttribivNV; GLEW_FUN_EXPORT PFNGLISPROGRAMNVPROC __glewIsProgramNV; GLEW_FUN_EXPORT PFNGLLOADPROGRAMNVPROC __glewLoadProgramNV; GLEW_FUN_EXPORT PFNGLPROGRAMPARAMETER4DNVPROC __glewProgramParameter4dNV; GLEW_FUN_EXPORT PFNGLPROGRAMPARAMETER4DVNVPROC __glewProgramParameter4dvNV; GLEW_FUN_EXPORT PFNGLPROGRAMPARAMETER4FNVPROC __glewProgramParameter4fNV; GLEW_FUN_EXPORT PFNGLPROGRAMPARAMETER4FVNVPROC __glewProgramParameter4fvNV; GLEW_FUN_EXPORT PFNGLPROGRAMPARAMETERS4DVNVPROC __glewProgramParameters4dvNV; GLEW_FUN_EXPORT PFNGLPROGRAMPARAMETERS4FVNVPROC __glewProgramParameters4fvNV; GLEW_FUN_EXPORT PFNGLREQUESTRESIDENTPROGRAMSNVPROC __glewRequestResidentProgramsNV; GLEW_FUN_EXPORT PFNGLTRACKMATRIXNVPROC __glewTrackMatrixNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1DNVPROC __glewVertexAttrib1dNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1DVNVPROC __glewVertexAttrib1dvNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1FNVPROC __glewVertexAttrib1fNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1FVNVPROC __glewVertexAttrib1fvNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1SNVPROC __glewVertexAttrib1sNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1SVNVPROC __glewVertexAttrib1svNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2DNVPROC __glewVertexAttrib2dNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2DVNVPROC __glewVertexAttrib2dvNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2FNVPROC __glewVertexAttrib2fNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2FVNVPROC __glewVertexAttrib2fvNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2SNVPROC __glewVertexAttrib2sNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2SVNVPROC __glewVertexAttrib2svNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3DNVPROC __glewVertexAttrib3dNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3DVNVPROC __glewVertexAttrib3dvNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3FNVPROC __glewVertexAttrib3fNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3FVNVPROC __glewVertexAttrib3fvNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3SNVPROC __glewVertexAttrib3sNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3SVNVPROC __glewVertexAttrib3svNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4DNVPROC __glewVertexAttrib4dNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4DVNVPROC __glewVertexAttrib4dvNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4FNVPROC __glewVertexAttrib4fNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4FVNVPROC __glewVertexAttrib4fvNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4SNVPROC __glewVertexAttrib4sNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4SVNVPROC __glewVertexAttrib4svNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4UBNVPROC __glewVertexAttrib4ubNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4UBVNVPROC __glewVertexAttrib4ubvNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBPOINTERNVPROC __glewVertexAttribPointerNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS1DVNVPROC __glewVertexAttribs1dvNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS1FVNVPROC __glewVertexAttribs1fvNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS1SVNVPROC __glewVertexAttribs1svNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS2DVNVPROC __glewVertexAttribs2dvNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS2FVNVPROC __glewVertexAttribs2fvNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS2SVNVPROC __glewVertexAttribs2svNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS3DVNVPROC __glewVertexAttribs3dvNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS3FVNVPROC __glewVertexAttribs3fvNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS3SVNVPROC __glewVertexAttribs3svNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS4DVNVPROC __glewVertexAttribs4dvNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS4FVNVPROC __glewVertexAttribs4fvNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS4SVNVPROC __glewVertexAttribs4svNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS4UBVNVPROC __glewVertexAttribs4ubvNV; GLEW_FUN_EXPORT PFNGLBEGINVIDEOCAPTURENVPROC __glewBeginVideoCaptureNV; GLEW_FUN_EXPORT PFNGLBINDVIDEOCAPTURESTREAMBUFFERNVPROC __glewBindVideoCaptureStreamBufferNV; GLEW_FUN_EXPORT PFNGLBINDVIDEOCAPTURESTREAMTEXTURENVPROC __glewBindVideoCaptureStreamTextureNV; GLEW_FUN_EXPORT PFNGLENDVIDEOCAPTURENVPROC __glewEndVideoCaptureNV; GLEW_FUN_EXPORT PFNGLGETVIDEOCAPTURESTREAMDVNVPROC __glewGetVideoCaptureStreamdvNV; GLEW_FUN_EXPORT PFNGLGETVIDEOCAPTURESTREAMFVNVPROC __glewGetVideoCaptureStreamfvNV; GLEW_FUN_EXPORT PFNGLGETVIDEOCAPTURESTREAMIVNVPROC __glewGetVideoCaptureStreamivNV; GLEW_FUN_EXPORT PFNGLGETVIDEOCAPTUREIVNVPROC __glewGetVideoCaptureivNV; GLEW_FUN_EXPORT PFNGLVIDEOCAPTURENVPROC __glewVideoCaptureNV; GLEW_FUN_EXPORT PFNGLVIDEOCAPTURESTREAMPARAMETERDVNVPROC __glewVideoCaptureStreamParameterdvNV; GLEW_FUN_EXPORT PFNGLVIDEOCAPTURESTREAMPARAMETERFVNVPROC __glewVideoCaptureStreamParameterfvNV; GLEW_FUN_EXPORT PFNGLVIDEOCAPTURESTREAMPARAMETERIVNVPROC __glewVideoCaptureStreamParameterivNV; GLEW_FUN_EXPORT PFNGLCLEARDEPTHFOESPROC __glewClearDepthfOES; GLEW_FUN_EXPORT PFNGLCLIPPLANEFOESPROC __glewClipPlanefOES; GLEW_FUN_EXPORT PFNGLDEPTHRANGEFOESPROC __glewDepthRangefOES; GLEW_FUN_EXPORT PFNGLFRUSTUMFOESPROC __glewFrustumfOES; GLEW_FUN_EXPORT PFNGLGETCLIPPLANEFOESPROC __glewGetClipPlanefOES; GLEW_FUN_EXPORT PFNGLORTHOFOESPROC __glewOrthofOES; GLEW_FUN_EXPORT PFNGLERRORSTRINGREGALPROC __glewErrorStringREGAL; GLEW_FUN_EXPORT PFNGLGETEXTENSIONREGALPROC __glewGetExtensionREGAL; GLEW_FUN_EXPORT PFNGLISSUPPORTEDREGALPROC __glewIsSupportedREGAL; GLEW_FUN_EXPORT PFNGLDETAILTEXFUNCSGISPROC __glewDetailTexFuncSGIS; GLEW_FUN_EXPORT PFNGLGETDETAILTEXFUNCSGISPROC __glewGetDetailTexFuncSGIS; GLEW_FUN_EXPORT PFNGLFOGFUNCSGISPROC __glewFogFuncSGIS; GLEW_FUN_EXPORT PFNGLGETFOGFUNCSGISPROC __glewGetFogFuncSGIS; GLEW_FUN_EXPORT PFNGLSAMPLEMASKSGISPROC __glewSampleMaskSGIS; GLEW_FUN_EXPORT PFNGLSAMPLEPATTERNSGISPROC __glewSamplePatternSGIS; GLEW_FUN_EXPORT PFNGLGETSHARPENTEXFUNCSGISPROC __glewGetSharpenTexFuncSGIS; GLEW_FUN_EXPORT PFNGLSHARPENTEXFUNCSGISPROC __glewSharpenTexFuncSGIS; GLEW_FUN_EXPORT PFNGLTEXIMAGE4DSGISPROC __glewTexImage4DSGIS; GLEW_FUN_EXPORT PFNGLTEXSUBIMAGE4DSGISPROC __glewTexSubImage4DSGIS; GLEW_FUN_EXPORT PFNGLGETTEXFILTERFUNCSGISPROC __glewGetTexFilterFuncSGIS; GLEW_FUN_EXPORT PFNGLTEXFILTERFUNCSGISPROC __glewTexFilterFuncSGIS; GLEW_FUN_EXPORT PFNGLASYNCMARKERSGIXPROC __glewAsyncMarkerSGIX; GLEW_FUN_EXPORT PFNGLDELETEASYNCMARKERSSGIXPROC __glewDeleteAsyncMarkersSGIX; GLEW_FUN_EXPORT PFNGLFINISHASYNCSGIXPROC __glewFinishAsyncSGIX; GLEW_FUN_EXPORT PFNGLGENASYNCMARKERSSGIXPROC __glewGenAsyncMarkersSGIX; GLEW_FUN_EXPORT PFNGLISASYNCMARKERSGIXPROC __glewIsAsyncMarkerSGIX; GLEW_FUN_EXPORT PFNGLPOLLASYNCSGIXPROC __glewPollAsyncSGIX; GLEW_FUN_EXPORT PFNGLFLUSHRASTERSGIXPROC __glewFlushRasterSGIX; GLEW_FUN_EXPORT PFNGLTEXTUREFOGSGIXPROC __glewTextureFogSGIX; GLEW_FUN_EXPORT PFNGLFRAGMENTCOLORMATERIALSGIXPROC __glewFragmentColorMaterialSGIX; GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTMODELFSGIXPROC __glewFragmentLightModelfSGIX; GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTMODELFVSGIXPROC __glewFragmentLightModelfvSGIX; GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTMODELISGIXPROC __glewFragmentLightModeliSGIX; GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTMODELIVSGIXPROC __glewFragmentLightModelivSGIX; GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTFSGIXPROC __glewFragmentLightfSGIX; GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTFVSGIXPROC __glewFragmentLightfvSGIX; GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTISGIXPROC __glewFragmentLightiSGIX; GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTIVSGIXPROC __glewFragmentLightivSGIX; GLEW_FUN_EXPORT PFNGLFRAGMENTMATERIALFSGIXPROC __glewFragmentMaterialfSGIX; GLEW_FUN_EXPORT PFNGLFRAGMENTMATERIALFVSGIXPROC __glewFragmentMaterialfvSGIX; GLEW_FUN_EXPORT PFNGLFRAGMENTMATERIALISGIXPROC __glewFragmentMaterialiSGIX; GLEW_FUN_EXPORT PFNGLFRAGMENTMATERIALIVSGIXPROC __glewFragmentMaterialivSGIX; GLEW_FUN_EXPORT PFNGLGETFRAGMENTLIGHTFVSGIXPROC __glewGetFragmentLightfvSGIX; GLEW_FUN_EXPORT PFNGLGETFRAGMENTLIGHTIVSGIXPROC __glewGetFragmentLightivSGIX; GLEW_FUN_EXPORT PFNGLGETFRAGMENTMATERIALFVSGIXPROC __glewGetFragmentMaterialfvSGIX; GLEW_FUN_EXPORT PFNGLGETFRAGMENTMATERIALIVSGIXPROC __glewGetFragmentMaterialivSGIX; GLEW_FUN_EXPORT PFNGLFRAMEZOOMSGIXPROC __glewFrameZoomSGIX; GLEW_FUN_EXPORT PFNGLPIXELTEXGENSGIXPROC __glewPixelTexGenSGIX; GLEW_FUN_EXPORT PFNGLREFERENCEPLANESGIXPROC __glewReferencePlaneSGIX; GLEW_FUN_EXPORT PFNGLSPRITEPARAMETERFSGIXPROC __glewSpriteParameterfSGIX; GLEW_FUN_EXPORT PFNGLSPRITEPARAMETERFVSGIXPROC __glewSpriteParameterfvSGIX; GLEW_FUN_EXPORT PFNGLSPRITEPARAMETERISGIXPROC __glewSpriteParameteriSGIX; GLEW_FUN_EXPORT PFNGLSPRITEPARAMETERIVSGIXPROC __glewSpriteParameterivSGIX; GLEW_FUN_EXPORT PFNGLTAGSAMPLEBUFFERSGIXPROC __glewTagSampleBufferSGIX; GLEW_FUN_EXPORT PFNGLCOLORTABLEPARAMETERFVSGIPROC __glewColorTableParameterfvSGI; GLEW_FUN_EXPORT PFNGLCOLORTABLEPARAMETERIVSGIPROC __glewColorTableParameterivSGI; GLEW_FUN_EXPORT PFNGLCOLORTABLESGIPROC __glewColorTableSGI; GLEW_FUN_EXPORT PFNGLCOPYCOLORTABLESGIPROC __glewCopyColorTableSGI; GLEW_FUN_EXPORT PFNGLGETCOLORTABLEPARAMETERFVSGIPROC __glewGetColorTableParameterfvSGI; GLEW_FUN_EXPORT PFNGLGETCOLORTABLEPARAMETERIVSGIPROC __glewGetColorTableParameterivSGI; GLEW_FUN_EXPORT PFNGLGETCOLORTABLESGIPROC __glewGetColorTableSGI; GLEW_FUN_EXPORT PFNGLFINISHTEXTURESUNXPROC __glewFinishTextureSUNX; GLEW_FUN_EXPORT PFNGLGLOBALALPHAFACTORBSUNPROC __glewGlobalAlphaFactorbSUN; GLEW_FUN_EXPORT PFNGLGLOBALALPHAFACTORDSUNPROC __glewGlobalAlphaFactordSUN; GLEW_FUN_EXPORT PFNGLGLOBALALPHAFACTORFSUNPROC __glewGlobalAlphaFactorfSUN; GLEW_FUN_EXPORT PFNGLGLOBALALPHAFACTORISUNPROC __glewGlobalAlphaFactoriSUN; GLEW_FUN_EXPORT PFNGLGLOBALALPHAFACTORSSUNPROC __glewGlobalAlphaFactorsSUN; GLEW_FUN_EXPORT PFNGLGLOBALALPHAFACTORUBSUNPROC __glewGlobalAlphaFactorubSUN; GLEW_FUN_EXPORT PFNGLGLOBALALPHAFACTORUISUNPROC __glewGlobalAlphaFactoruiSUN; GLEW_FUN_EXPORT PFNGLGLOBALALPHAFACTORUSSUNPROC __glewGlobalAlphaFactorusSUN; GLEW_FUN_EXPORT PFNGLREADVIDEOPIXELSSUNPROC __glewReadVideoPixelsSUN; GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEPOINTERSUNPROC __glewReplacementCodePointerSUN; GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUBSUNPROC __glewReplacementCodeubSUN; GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUBVSUNPROC __glewReplacementCodeubvSUN; GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUISUNPROC __glewReplacementCodeuiSUN; GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUIVSUNPROC __glewReplacementCodeuivSUN; GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUSSUNPROC __glewReplacementCodeusSUN; GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUSVSUNPROC __glewReplacementCodeusvSUN; GLEW_FUN_EXPORT PFNGLCOLOR3FVERTEX3FSUNPROC __glewColor3fVertex3fSUN; GLEW_FUN_EXPORT PFNGLCOLOR3FVERTEX3FVSUNPROC __glewColor3fVertex3fvSUN; GLEW_FUN_EXPORT PFNGLCOLOR4FNORMAL3FVERTEX3FSUNPROC __glewColor4fNormal3fVertex3fSUN; GLEW_FUN_EXPORT PFNGLCOLOR4FNORMAL3FVERTEX3FVSUNPROC __glewColor4fNormal3fVertex3fvSUN; GLEW_FUN_EXPORT PFNGLCOLOR4UBVERTEX2FSUNPROC __glewColor4ubVertex2fSUN; GLEW_FUN_EXPORT PFNGLCOLOR4UBVERTEX2FVSUNPROC __glewColor4ubVertex2fvSUN; GLEW_FUN_EXPORT PFNGLCOLOR4UBVERTEX3FSUNPROC __glewColor4ubVertex3fSUN; GLEW_FUN_EXPORT PFNGLCOLOR4UBVERTEX3FVSUNPROC __glewColor4ubVertex3fvSUN; GLEW_FUN_EXPORT PFNGLNORMAL3FVERTEX3FSUNPROC __glewNormal3fVertex3fSUN; GLEW_FUN_EXPORT PFNGLNORMAL3FVERTEX3FVSUNPROC __glewNormal3fVertex3fvSUN; GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FSUNPROC __glewReplacementCodeuiColor3fVertex3fSUN; GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FVSUNPROC __glewReplacementCodeuiColor3fVertex3fvSUN; GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FSUNPROC __glewReplacementCodeuiColor4fNormal3fVertex3fSUN; GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FVSUNPROC __glewReplacementCodeuiColor4fNormal3fVertex3fvSUN; GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FSUNPROC __glewReplacementCodeuiColor4ubVertex3fSUN; GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FVSUNPROC __glewReplacementCodeuiColor4ubVertex3fvSUN; GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FSUNPROC __glewReplacementCodeuiNormal3fVertex3fSUN; GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FVSUNPROC __glewReplacementCodeuiNormal3fVertex3fvSUN; GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC __glewReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN; GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC __glewReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN; GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FSUNPROC __glewReplacementCodeuiTexCoord2fNormal3fVertex3fSUN; GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FVSUNPROC __glewReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN; GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FSUNPROC __glewReplacementCodeuiTexCoord2fVertex3fSUN; GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FVSUNPROC __glewReplacementCodeuiTexCoord2fVertex3fvSUN; GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUIVERTEX3FSUNPROC __glewReplacementCodeuiVertex3fSUN; GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUIVERTEX3FVSUNPROC __glewReplacementCodeuiVertex3fvSUN; GLEW_FUN_EXPORT PFNGLTEXCOORD2FCOLOR3FVERTEX3FSUNPROC __glewTexCoord2fColor3fVertex3fSUN; GLEW_FUN_EXPORT PFNGLTEXCOORD2FCOLOR3FVERTEX3FVSUNPROC __glewTexCoord2fColor3fVertex3fvSUN; GLEW_FUN_EXPORT PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC __glewTexCoord2fColor4fNormal3fVertex3fSUN; GLEW_FUN_EXPORT PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC __glewTexCoord2fColor4fNormal3fVertex3fvSUN; GLEW_FUN_EXPORT PFNGLTEXCOORD2FCOLOR4UBVERTEX3FSUNPROC __glewTexCoord2fColor4ubVertex3fSUN; GLEW_FUN_EXPORT PFNGLTEXCOORD2FCOLOR4UBVERTEX3FVSUNPROC __glewTexCoord2fColor4ubVertex3fvSUN; GLEW_FUN_EXPORT PFNGLTEXCOORD2FNORMAL3FVERTEX3FSUNPROC __glewTexCoord2fNormal3fVertex3fSUN; GLEW_FUN_EXPORT PFNGLTEXCOORD2FNORMAL3FVERTEX3FVSUNPROC __glewTexCoord2fNormal3fVertex3fvSUN; GLEW_FUN_EXPORT PFNGLTEXCOORD2FVERTEX3FSUNPROC __glewTexCoord2fVertex3fSUN; GLEW_FUN_EXPORT PFNGLTEXCOORD2FVERTEX3FVSUNPROC __glewTexCoord2fVertex3fvSUN; GLEW_FUN_EXPORT PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FSUNPROC __glewTexCoord4fColor4fNormal3fVertex4fSUN; GLEW_FUN_EXPORT PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FVSUNPROC __glewTexCoord4fColor4fNormal3fVertex4fvSUN; GLEW_FUN_EXPORT PFNGLTEXCOORD4FVERTEX4FSUNPROC __glewTexCoord4fVertex4fSUN; GLEW_FUN_EXPORT PFNGLTEXCOORD4FVERTEX4FVSUNPROC __glewTexCoord4fVertex4fvSUN; GLEW_FUN_EXPORT PFNGLADDSWAPHINTRECTWINPROC __glewAddSwapHintRectWIN; #if defined(GLEW_MX) && !defined(_WIN32) struct GLEWContextStruct { #endif /* GLEW_MX */ GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_1_1; GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_1_2; GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_1_2_1; GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_1_3; GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_1_4; GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_1_5; GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_2_0; GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_2_1; GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_3_0; GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_3_1; GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_3_2; GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_3_3; GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_4_0; GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_4_1; GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_4_2; GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_4_3; GLEW_VAR_EXPORT GLboolean __GLEW_3DFX_multisample; GLEW_VAR_EXPORT GLboolean __GLEW_3DFX_tbuffer; GLEW_VAR_EXPORT GLboolean __GLEW_3DFX_texture_compression_FXT1; GLEW_VAR_EXPORT GLboolean __GLEW_AMD_blend_minmax_factor; GLEW_VAR_EXPORT GLboolean __GLEW_AMD_conservative_depth; GLEW_VAR_EXPORT GLboolean __GLEW_AMD_debug_output; GLEW_VAR_EXPORT GLboolean __GLEW_AMD_depth_clamp_separate; GLEW_VAR_EXPORT GLboolean __GLEW_AMD_draw_buffers_blend; GLEW_VAR_EXPORT GLboolean __GLEW_AMD_multi_draw_indirect; GLEW_VAR_EXPORT GLboolean __GLEW_AMD_name_gen_delete; GLEW_VAR_EXPORT GLboolean __GLEW_AMD_performance_monitor; GLEW_VAR_EXPORT GLboolean __GLEW_AMD_pinned_memory; GLEW_VAR_EXPORT GLboolean __GLEW_AMD_query_buffer_object; GLEW_VAR_EXPORT GLboolean __GLEW_AMD_sample_positions; GLEW_VAR_EXPORT GLboolean __GLEW_AMD_seamless_cubemap_per_texture; GLEW_VAR_EXPORT GLboolean __GLEW_AMD_shader_stencil_export; GLEW_VAR_EXPORT GLboolean __GLEW_AMD_stencil_operation_extended; GLEW_VAR_EXPORT GLboolean __GLEW_AMD_texture_texture4; GLEW_VAR_EXPORT GLboolean __GLEW_AMD_transform_feedback3_lines_triangles; GLEW_VAR_EXPORT GLboolean __GLEW_AMD_vertex_shader_layer; GLEW_VAR_EXPORT GLboolean __GLEW_AMD_vertex_shader_tessellator; GLEW_VAR_EXPORT GLboolean __GLEW_AMD_vertex_shader_viewport_index; GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_aux_depth_stencil; GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_client_storage; GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_element_array; GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_fence; GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_float_pixels; GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_flush_buffer_range; GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_object_purgeable; GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_pixel_buffer; GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_rgb_422; GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_row_bytes; GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_specular_vector; GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_texture_range; GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_transform_hint; GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_vertex_array_object; GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_vertex_array_range; GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_vertex_program_evaluators; GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_ycbcr_422; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_ES2_compatibility; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_ES3_compatibility; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_arrays_of_arrays; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_base_instance; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_blend_func_extended; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_cl_event; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_clear_buffer_object; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_color_buffer_float; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_compatibility; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_compressed_texture_pixel_storage; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_compute_shader; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_conservative_depth; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_copy_buffer; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_copy_image; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_debug_output; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_depth_buffer_float; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_depth_clamp; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_depth_texture; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_draw_buffers; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_draw_buffers_blend; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_draw_elements_base_vertex; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_draw_indirect; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_draw_instanced; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_explicit_attrib_location; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_explicit_uniform_location; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_fragment_coord_conventions; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_fragment_layer_viewport; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_fragment_program; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_fragment_program_shadow; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_fragment_shader; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_framebuffer_no_attachments; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_framebuffer_object; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_framebuffer_sRGB; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_geometry_shader4; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_get_program_binary; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_gpu_shader5; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_gpu_shader_fp64; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_half_float_pixel; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_half_float_vertex; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_imaging; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_instanced_arrays; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_internalformat_query; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_internalformat_query2; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_invalidate_subdata; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_map_buffer_alignment; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_map_buffer_range; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_matrix_palette; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_multi_draw_indirect; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_multisample; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_multitexture; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_occlusion_query; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_occlusion_query2; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_pixel_buffer_object; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_point_parameters; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_point_sprite; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_program_interface_query; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_provoking_vertex; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_robust_buffer_access_behavior; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_robustness; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_robustness_application_isolation; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_robustness_share_group_isolation; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_sample_shading; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_sampler_objects; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_seamless_cube_map; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_separate_shader_objects; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_atomic_counters; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_bit_encoding; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_image_load_store; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_image_size; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_objects; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_precision; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_stencil_export; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_storage_buffer_object; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_subroutine; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_texture_lod; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shading_language_100; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shading_language_420pack; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shading_language_include; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shading_language_packing; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shadow; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shadow_ambient; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_stencil_texturing; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_sync; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_tessellation_shader; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_border_clamp; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_buffer_object; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_buffer_object_rgb32; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_buffer_range; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_compression; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_compression_bptc; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_compression_rgtc; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_cube_map; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_cube_map_array; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_env_add; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_env_combine; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_env_crossbar; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_env_dot3; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_float; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_gather; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_mirrored_repeat; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_multisample; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_non_power_of_two; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_query_levels; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_query_lod; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_rectangle; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_rg; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_rgb10_a2ui; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_storage; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_storage_multisample; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_swizzle; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_view; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_timer_query; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_transform_feedback2; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_transform_feedback3; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_transform_feedback_instanced; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_transpose_matrix; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_uniform_buffer_object; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_vertex_array_bgra; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_vertex_array_object; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_vertex_attrib_64bit; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_vertex_attrib_binding; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_vertex_blend; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_vertex_buffer_object; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_vertex_program; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_vertex_shader; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_vertex_type_2_10_10_10_rev; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_viewport_array; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_window_pos; GLEW_VAR_EXPORT GLboolean __GLEW_ATIX_point_sprites; GLEW_VAR_EXPORT GLboolean __GLEW_ATIX_texture_env_combine3; GLEW_VAR_EXPORT GLboolean __GLEW_ATIX_texture_env_route; GLEW_VAR_EXPORT GLboolean __GLEW_ATIX_vertex_shader_output_point_size; GLEW_VAR_EXPORT GLboolean __GLEW_ATI_draw_buffers; GLEW_VAR_EXPORT GLboolean __GLEW_ATI_element_array; GLEW_VAR_EXPORT GLboolean __GLEW_ATI_envmap_bumpmap; GLEW_VAR_EXPORT GLboolean __GLEW_ATI_fragment_shader; GLEW_VAR_EXPORT GLboolean __GLEW_ATI_map_object_buffer; GLEW_VAR_EXPORT GLboolean __GLEW_ATI_meminfo; GLEW_VAR_EXPORT GLboolean __GLEW_ATI_pn_triangles; GLEW_VAR_EXPORT GLboolean __GLEW_ATI_separate_stencil; GLEW_VAR_EXPORT GLboolean __GLEW_ATI_shader_texture_lod; GLEW_VAR_EXPORT GLboolean __GLEW_ATI_text_fragment_shader; GLEW_VAR_EXPORT GLboolean __GLEW_ATI_texture_compression_3dc; GLEW_VAR_EXPORT GLboolean __GLEW_ATI_texture_env_combine3; GLEW_VAR_EXPORT GLboolean __GLEW_ATI_texture_float; GLEW_VAR_EXPORT GLboolean __GLEW_ATI_texture_mirror_once; GLEW_VAR_EXPORT GLboolean __GLEW_ATI_vertex_array_object; GLEW_VAR_EXPORT GLboolean __GLEW_ATI_vertex_attrib_array_object; GLEW_VAR_EXPORT GLboolean __GLEW_ATI_vertex_streams; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_422_pixels; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_Cg_shader; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_abgr; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_bgra; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_bindable_uniform; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_blend_color; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_blend_equation_separate; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_blend_func_separate; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_blend_logic_op; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_blend_minmax; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_blend_subtract; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_clip_volume_hint; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_cmyka; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_color_subtable; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_compiled_vertex_array; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_convolution; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_coordinate_frame; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_copy_texture; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_cull_vertex; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_debug_marker; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_depth_bounds_test; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_direct_state_access; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_draw_buffers2; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_draw_instanced; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_draw_range_elements; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_fog_coord; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_fragment_lighting; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_framebuffer_blit; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_framebuffer_multisample; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_framebuffer_multisample_blit_scaled; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_framebuffer_object; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_framebuffer_sRGB; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_geometry_shader4; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_gpu_program_parameters; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_gpu_shader4; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_histogram; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_index_array_formats; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_index_func; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_index_material; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_index_texture; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_light_texture; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_misc_attribute; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_multi_draw_arrays; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_multisample; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_packed_depth_stencil; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_packed_float; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_packed_pixels; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_paletted_texture; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_pixel_buffer_object; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_pixel_transform; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_pixel_transform_color_table; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_point_parameters; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_polygon_offset; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_provoking_vertex; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_rescale_normal; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_scene_marker; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_secondary_color; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_separate_shader_objects; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_separate_specular_color; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_shader_image_load_store; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_shadow_funcs; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_shared_texture_palette; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_stencil_clear_tag; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_stencil_two_side; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_stencil_wrap; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_subtexture; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture3D; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_array; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_buffer_object; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_compression_dxt1; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_compression_latc; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_compression_rgtc; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_compression_s3tc; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_cube_map; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_edge_clamp; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_env; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_env_add; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_env_combine; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_env_dot3; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_filter_anisotropic; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_integer; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_lod_bias; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_mirror_clamp; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_object; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_perturb_normal; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_rectangle; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_sRGB; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_sRGB_decode; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_shared_exponent; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_snorm; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_swizzle; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_timer_query; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_transform_feedback; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_vertex_array; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_vertex_array_bgra; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_vertex_attrib_64bit; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_vertex_shader; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_vertex_weighting; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_x11_sync_object; GLEW_VAR_EXPORT GLboolean __GLEW_GREMEDY_frame_terminator; GLEW_VAR_EXPORT GLboolean __GLEW_GREMEDY_string_marker; GLEW_VAR_EXPORT GLboolean __GLEW_HP_convolution_border_modes; GLEW_VAR_EXPORT GLboolean __GLEW_HP_image_transform; GLEW_VAR_EXPORT GLboolean __GLEW_HP_occlusion_test; GLEW_VAR_EXPORT GLboolean __GLEW_HP_texture_lighting; GLEW_VAR_EXPORT GLboolean __GLEW_IBM_cull_vertex; GLEW_VAR_EXPORT GLboolean __GLEW_IBM_multimode_draw_arrays; GLEW_VAR_EXPORT GLboolean __GLEW_IBM_rasterpos_clip; GLEW_VAR_EXPORT GLboolean __GLEW_IBM_static_data; GLEW_VAR_EXPORT GLboolean __GLEW_IBM_texture_mirrored_repeat; GLEW_VAR_EXPORT GLboolean __GLEW_IBM_vertex_array_lists; GLEW_VAR_EXPORT GLboolean __GLEW_INGR_color_clamp; GLEW_VAR_EXPORT GLboolean __GLEW_INGR_interlace_read; GLEW_VAR_EXPORT GLboolean __GLEW_INTEL_parallel_arrays; GLEW_VAR_EXPORT GLboolean __GLEW_INTEL_texture_scissor; GLEW_VAR_EXPORT GLboolean __GLEW_KHR_debug; GLEW_VAR_EXPORT GLboolean __GLEW_KHR_texture_compression_astc_ldr; GLEW_VAR_EXPORT GLboolean __GLEW_KTX_buffer_region; GLEW_VAR_EXPORT GLboolean __GLEW_MESAX_texture_stack; GLEW_VAR_EXPORT GLboolean __GLEW_MESA_pack_invert; GLEW_VAR_EXPORT GLboolean __GLEW_MESA_resize_buffers; GLEW_VAR_EXPORT GLboolean __GLEW_MESA_window_pos; GLEW_VAR_EXPORT GLboolean __GLEW_MESA_ycbcr_texture; GLEW_VAR_EXPORT GLboolean __GLEW_NVX_gpu_memory_info; GLEW_VAR_EXPORT GLboolean __GLEW_NV_bindless_texture; GLEW_VAR_EXPORT GLboolean __GLEW_NV_blend_square; GLEW_VAR_EXPORT GLboolean __GLEW_NV_conditional_render; GLEW_VAR_EXPORT GLboolean __GLEW_NV_copy_depth_to_color; GLEW_VAR_EXPORT GLboolean __GLEW_NV_copy_image; GLEW_VAR_EXPORT GLboolean __GLEW_NV_depth_buffer_float; GLEW_VAR_EXPORT GLboolean __GLEW_NV_depth_clamp; GLEW_VAR_EXPORT GLboolean __GLEW_NV_depth_range_unclamped; GLEW_VAR_EXPORT GLboolean __GLEW_NV_evaluators; GLEW_VAR_EXPORT GLboolean __GLEW_NV_explicit_multisample; GLEW_VAR_EXPORT GLboolean __GLEW_NV_fence; GLEW_VAR_EXPORT GLboolean __GLEW_NV_float_buffer; GLEW_VAR_EXPORT GLboolean __GLEW_NV_fog_distance; GLEW_VAR_EXPORT GLboolean __GLEW_NV_fragment_program; GLEW_VAR_EXPORT GLboolean __GLEW_NV_fragment_program2; GLEW_VAR_EXPORT GLboolean __GLEW_NV_fragment_program4; GLEW_VAR_EXPORT GLboolean __GLEW_NV_fragment_program_option; GLEW_VAR_EXPORT GLboolean __GLEW_NV_framebuffer_multisample_coverage; GLEW_VAR_EXPORT GLboolean __GLEW_NV_geometry_program4; GLEW_VAR_EXPORT GLboolean __GLEW_NV_geometry_shader4; GLEW_VAR_EXPORT GLboolean __GLEW_NV_gpu_program4; GLEW_VAR_EXPORT GLboolean __GLEW_NV_gpu_program5; GLEW_VAR_EXPORT GLboolean __GLEW_NV_gpu_program_fp64; GLEW_VAR_EXPORT GLboolean __GLEW_NV_gpu_shader5; GLEW_VAR_EXPORT GLboolean __GLEW_NV_half_float; GLEW_VAR_EXPORT GLboolean __GLEW_NV_light_max_exponent; GLEW_VAR_EXPORT GLboolean __GLEW_NV_multisample_coverage; GLEW_VAR_EXPORT GLboolean __GLEW_NV_multisample_filter_hint; GLEW_VAR_EXPORT GLboolean __GLEW_NV_occlusion_query; GLEW_VAR_EXPORT GLboolean __GLEW_NV_packed_depth_stencil; GLEW_VAR_EXPORT GLboolean __GLEW_NV_parameter_buffer_object; GLEW_VAR_EXPORT GLboolean __GLEW_NV_parameter_buffer_object2; GLEW_VAR_EXPORT GLboolean __GLEW_NV_path_rendering; GLEW_VAR_EXPORT GLboolean __GLEW_NV_pixel_data_range; GLEW_VAR_EXPORT GLboolean __GLEW_NV_point_sprite; GLEW_VAR_EXPORT GLboolean __GLEW_NV_present_video; GLEW_VAR_EXPORT GLboolean __GLEW_NV_primitive_restart; GLEW_VAR_EXPORT GLboolean __GLEW_NV_register_combiners; GLEW_VAR_EXPORT GLboolean __GLEW_NV_register_combiners2; GLEW_VAR_EXPORT GLboolean __GLEW_NV_shader_atomic_float; GLEW_VAR_EXPORT GLboolean __GLEW_NV_shader_buffer_load; GLEW_VAR_EXPORT GLboolean __GLEW_NV_tessellation_program5; GLEW_VAR_EXPORT GLboolean __GLEW_NV_texgen_emboss; GLEW_VAR_EXPORT GLboolean __GLEW_NV_texgen_reflection; GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_barrier; GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_compression_vtc; GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_env_combine4; GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_expand_normal; GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_multisample; GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_rectangle; GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_shader; GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_shader2; GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_shader3; GLEW_VAR_EXPORT GLboolean __GLEW_NV_transform_feedback; GLEW_VAR_EXPORT GLboolean __GLEW_NV_transform_feedback2; GLEW_VAR_EXPORT GLboolean __GLEW_NV_vdpau_interop; GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_array_range; GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_array_range2; GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_attrib_integer_64bit; GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_buffer_unified_memory; GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_program; GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_program1_1; GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_program2; GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_program2_option; GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_program3; GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_program4; GLEW_VAR_EXPORT GLboolean __GLEW_NV_video_capture; GLEW_VAR_EXPORT GLboolean __GLEW_OES_byte_coordinates; GLEW_VAR_EXPORT GLboolean __GLEW_OES_compressed_paletted_texture; GLEW_VAR_EXPORT GLboolean __GLEW_OES_read_format; GLEW_VAR_EXPORT GLboolean __GLEW_OES_single_precision; GLEW_VAR_EXPORT GLboolean __GLEW_OML_interlace; GLEW_VAR_EXPORT GLboolean __GLEW_OML_resample; GLEW_VAR_EXPORT GLboolean __GLEW_OML_subsample; GLEW_VAR_EXPORT GLboolean __GLEW_PGI_misc_hints; GLEW_VAR_EXPORT GLboolean __GLEW_PGI_vertex_hints; GLEW_VAR_EXPORT GLboolean __GLEW_REGAL_error_string; GLEW_VAR_EXPORT GLboolean __GLEW_REGAL_extension_query; GLEW_VAR_EXPORT GLboolean __GLEW_REGAL_log; GLEW_VAR_EXPORT GLboolean __GLEW_REND_screen_coordinates; GLEW_VAR_EXPORT GLboolean __GLEW_S3_s3tc; GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_color_range; GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_detail_texture; GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_fog_function; GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_generate_mipmap; GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_multisample; GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_pixel_texture; GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_point_line_texgen; GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_sharpen_texture; GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_texture4D; GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_texture_border_clamp; GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_texture_edge_clamp; GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_texture_filter4; GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_texture_lod; GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_texture_select; GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_async; GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_async_histogram; GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_async_pixel; GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_blend_alpha_minmax; GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_clipmap; GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_convolution_accuracy; GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_depth_texture; GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_flush_raster; GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_fog_offset; GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_fog_texture; GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_fragment_specular_lighting; GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_framezoom; GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_interlace; GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_ir_instrument1; GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_list_priority; GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_pixel_texture; GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_pixel_texture_bits; GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_reference_plane; GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_resample; GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_shadow; GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_shadow_ambient; GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_sprite; GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_tag_sample_buffer; GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_texture_add_env; GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_texture_coordinate_clamp; GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_texture_lod_bias; GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_texture_multi_buffer; GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_texture_range; GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_texture_scale_bias; GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_vertex_preclip; GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_vertex_preclip_hint; GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_ycrcb; GLEW_VAR_EXPORT GLboolean __GLEW_SGI_color_matrix; GLEW_VAR_EXPORT GLboolean __GLEW_SGI_color_table; GLEW_VAR_EXPORT GLboolean __GLEW_SGI_texture_color_table; GLEW_VAR_EXPORT GLboolean __GLEW_SUNX_constant_data; GLEW_VAR_EXPORT GLboolean __GLEW_SUN_convolution_border_modes; GLEW_VAR_EXPORT GLboolean __GLEW_SUN_global_alpha; GLEW_VAR_EXPORT GLboolean __GLEW_SUN_mesh_array; GLEW_VAR_EXPORT GLboolean __GLEW_SUN_read_video_pixels; GLEW_VAR_EXPORT GLboolean __GLEW_SUN_slice_accum; GLEW_VAR_EXPORT GLboolean __GLEW_SUN_triangle_list; GLEW_VAR_EXPORT GLboolean __GLEW_SUN_vertex; GLEW_VAR_EXPORT GLboolean __GLEW_WIN_phong_shading; GLEW_VAR_EXPORT GLboolean __GLEW_WIN_specular_fog; GLEW_VAR_EXPORT GLboolean __GLEW_WIN_swap_hint; #ifdef GLEW_MX }; /* GLEWContextStruct */ #endif /* GLEW_MX */ /* ------------------------------------------------------------------------- */ /* error codes */ #define GLEW_OK 0 #define GLEW_NO_ERROR 0 #define GLEW_ERROR_NO_GL_VERSION 1 /* missing GL version */ #define GLEW_ERROR_GL_VERSION_10_ONLY 2 /* Need at least OpenGL 1.1 */ #define GLEW_ERROR_GLX_VERSION_11_ONLY 3 /* Need at least GLX 1.2 */ /* string codes */ #define GLEW_VERSION 1 #define GLEW_VERSION_MAJOR 2 #define GLEW_VERSION_MINOR 3 #define GLEW_VERSION_MICRO 4 /* API */ #ifdef GLEW_MX typedef struct GLEWContextStruct GLEWContext; GLEWAPI GLenum GLEWAPIENTRY glewContextInit (GLEWContext *ctx); GLEWAPI GLboolean GLEWAPIENTRY glewContextIsSupported (const GLEWContext *ctx, const char *name); #define glewInit() glewContextInit(glewGetContext()) #define glewIsSupported(x) glewContextIsSupported(glewGetContext(), x) #define glewIsExtensionSupported(x) glewIsSupported(x) #define GLEW_GET_VAR(x) (*(const GLboolean*)&(glewGetContext()->x)) #ifdef _WIN32 # define GLEW_GET_FUN(x) glewGetContext()->x #else # define GLEW_GET_FUN(x) x #endif #else /* GLEW_MX */ GLEWAPI GLenum GLEWAPIENTRY glewInit (void); GLEWAPI GLboolean GLEWAPIENTRY glewIsSupported (const char *name); #define glewIsExtensionSupported(x) glewIsSupported(x) #define GLEW_GET_VAR(x) (*(const GLboolean*)&x) #define GLEW_GET_FUN(x) x #endif /* GLEW_MX */ GLEWAPI GLboolean glewExperimental; GLEWAPI GLboolean GLEWAPIENTRY glewGetExtension (const char *name); GLEWAPI const GLubyte * GLEWAPIENTRY glewGetErrorString (GLenum error); GLEWAPI const GLubyte * GLEWAPIENTRY glewGetString (GLenum name); #ifdef __cplusplus } #endif #ifdef GLEW_APIENTRY_DEFINED #undef GLEW_APIENTRY_DEFINED #undef APIENTRY #undef GLAPIENTRY #define GLAPIENTRY #endif #ifdef GLEW_CALLBACK_DEFINED #undef GLEW_CALLBACK_DEFINED #undef CALLBACK #endif #ifdef GLEW_WINGDIAPI_DEFINED #undef GLEW_WINGDIAPI_DEFINED #undef WINGDIAPI #endif #undef GLAPI /* #undef GLEWAPI */ #endif /* __glew_h__ */ plee-the-bear-20251226/bear-engine/core/src/visual/glew/glxew.h000066400000000000000000002005041512343254000240240ustar00rootroot00000000000000/* ** The OpenGL Extension Wrangler Library ** Copyright (C) 2002-2008, Milan Ikits ** Copyright (C) 2002-2008, Marcelo E. Magallon ** Copyright (C) 2002, Lev Povalahev ** All rights reserved. ** ** Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are met: ** ** * Redistributions of source code must retain the above copyright notice, ** this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright notice, ** this list of conditions and the following disclaimer in the documentation ** and/or other materials provided with the distribution. ** * The name of the author may be used to endorse or promote products ** derived from this software without specific prior written permission. ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" ** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ** ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE ** LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR ** CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF ** SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS ** INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN ** CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ** ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF ** THE POSSIBILITY OF SUCH DAMAGE. */ /* * Mesa 3-D graphics library * Version: 7.0 * * Copyright (C) 1999-2007 Brian Paul All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included * in all copies or substantial portions of the Software. * * 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 AND NONINFRINGEMENT. IN NO EVENT SHALL * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /* ** Copyright (c) 2007 The Khronos Group Inc. ** ** Permission is hereby granted, free of charge, to any person obtaining a ** copy of this software and/or associated documentation files (the ** "Materials"), to deal in the Materials without restriction, including ** without limitation the rights to use, copy, modify, merge, publish, ** distribute, sublicense, and/or sell copies of the Materials, and to ** permit persons to whom the Materials are furnished to do so, subject to ** the following conditions: ** ** The above copyright notice and this permission notice shall be included ** in all copies or substantial portions of the Materials. ** ** THE MATERIALS ARE 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 AND NONINFRINGEMENT. ** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY ** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, ** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE ** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS. */ #ifndef __glxew_h__ #define __glxew_h__ #define __GLXEW_H__ #ifdef __glxext_h_ #error glxext.h included before glxew.h #endif #if defined(GLX_H) || defined(__GLX_glx_h__) || defined(__glx_h__) #error glx.h included before glxew.h #endif #define __glxext_h_ #define GLX_H #define __GLX_glx_h__ #define __glx_h__ #include #include #include #include "visual/glew/glew.h" #ifdef __cplusplus extern "C" { #endif /* ---------------------------- GLX_VERSION_1_0 --------------------------- */ #ifndef GLX_VERSION_1_0 #define GLX_VERSION_1_0 1 #define GLX_USE_GL 1 #define GLX_BUFFER_SIZE 2 #define GLX_LEVEL 3 #define GLX_RGBA 4 #define GLX_DOUBLEBUFFER 5 #define GLX_STEREO 6 #define GLX_AUX_BUFFERS 7 #define GLX_RED_SIZE 8 #define GLX_GREEN_SIZE 9 #define GLX_BLUE_SIZE 10 #define GLX_ALPHA_SIZE 11 #define GLX_DEPTH_SIZE 12 #define GLX_STENCIL_SIZE 13 #define GLX_ACCUM_RED_SIZE 14 #define GLX_ACCUM_GREEN_SIZE 15 #define GLX_ACCUM_BLUE_SIZE 16 #define GLX_ACCUM_ALPHA_SIZE 17 #define GLX_BAD_SCREEN 1 #define GLX_BAD_ATTRIBUTE 2 #define GLX_NO_EXTENSION 3 #define GLX_BAD_VISUAL 4 #define GLX_BAD_CONTEXT 5 #define GLX_BAD_VALUE 6 #define GLX_BAD_ENUM 7 typedef XID GLXDrawable; typedef XID GLXPixmap; #ifdef __sun typedef struct __glXContextRec *GLXContext; #else typedef struct __GLXcontextRec *GLXContext; #endif typedef unsigned int GLXVideoDeviceNV; extern Bool glXQueryExtension (Display *dpy, int *errorBase, int *eventBase); extern Bool glXQueryVersion (Display *dpy, int *major, int *minor); extern int glXGetConfig (Display *dpy, XVisualInfo *vis, int attrib, int *value); extern XVisualInfo* glXChooseVisual (Display *dpy, int screen, int *attribList); extern GLXPixmap glXCreateGLXPixmap (Display *dpy, XVisualInfo *vis, Pixmap pixmap); extern void glXDestroyGLXPixmap (Display *dpy, GLXPixmap pix); extern GLXContext glXCreateContext (Display *dpy, XVisualInfo *vis, GLXContext shareList, Bool direct); extern void glXDestroyContext (Display *dpy, GLXContext ctx); extern Bool glXIsDirect (Display *dpy, GLXContext ctx); extern void glXCopyContext (Display *dpy, GLXContext src, GLXContext dst, GLulong mask); extern Bool glXMakeCurrent (Display *dpy, GLXDrawable drawable, GLXContext ctx); extern GLXContext glXGetCurrentContext (void); extern GLXDrawable glXGetCurrentDrawable (void); extern void glXWaitGL (void); extern void glXWaitX (void); extern void glXSwapBuffers (Display *dpy, GLXDrawable drawable); extern void glXUseXFont (Font font, int first, int count, int listBase); #define GLXEW_VERSION_1_0 GLXEW_GET_VAR(__GLXEW_VERSION_1_0) #endif /* GLX_VERSION_1_0 */ /* ---------------------------- GLX_VERSION_1_1 --------------------------- */ #ifndef GLX_VERSION_1_1 #define GLX_VERSION_1_1 #define GLX_VENDOR 0x1 #define GLX_VERSION 0x2 #define GLX_EXTENSIONS 0x3 extern const char* glXQueryExtensionsString (Display *dpy, int screen); extern const char* glXGetClientString (Display *dpy, int name); extern const char* glXQueryServerString (Display *dpy, int screen, int name); #define GLXEW_VERSION_1_1 GLXEW_GET_VAR(__GLXEW_VERSION_1_1) #endif /* GLX_VERSION_1_1 */ /* ---------------------------- GLX_VERSION_1_2 ---------------------------- */ #ifndef GLX_VERSION_1_2 #define GLX_VERSION_1_2 1 typedef Display* ( * PFNGLXGETCURRENTDISPLAYPROC) (void); #define glXGetCurrentDisplay GLXEW_GET_FUN(__glewXGetCurrentDisplay) #define GLXEW_VERSION_1_2 GLXEW_GET_VAR(__GLXEW_VERSION_1_2) #endif /* GLX_VERSION_1_2 */ /* ---------------------------- GLX_VERSION_1_3 ---------------------------- */ #ifndef GLX_VERSION_1_3 #define GLX_VERSION_1_3 1 #define GLX_RGBA_BIT 0x00000001 #define GLX_FRONT_LEFT_BUFFER_BIT 0x00000001 #define GLX_WINDOW_BIT 0x00000001 #define GLX_COLOR_INDEX_BIT 0x00000002 #define GLX_PIXMAP_BIT 0x00000002 #define GLX_FRONT_RIGHT_BUFFER_BIT 0x00000002 #define GLX_BACK_LEFT_BUFFER_BIT 0x00000004 #define GLX_PBUFFER_BIT 0x00000004 #define GLX_BACK_RIGHT_BUFFER_BIT 0x00000008 #define GLX_AUX_BUFFERS_BIT 0x00000010 #define GLX_CONFIG_CAVEAT 0x20 #define GLX_DEPTH_BUFFER_BIT 0x00000020 #define GLX_X_VISUAL_TYPE 0x22 #define GLX_TRANSPARENT_TYPE 0x23 #define GLX_TRANSPARENT_INDEX_VALUE 0x24 #define GLX_TRANSPARENT_RED_VALUE 0x25 #define GLX_TRANSPARENT_GREEN_VALUE 0x26 #define GLX_TRANSPARENT_BLUE_VALUE 0x27 #define GLX_TRANSPARENT_ALPHA_VALUE 0x28 #define GLX_STENCIL_BUFFER_BIT 0x00000040 #define GLX_ACCUM_BUFFER_BIT 0x00000080 #define GLX_NONE 0x8000 #define GLX_SLOW_CONFIG 0x8001 #define GLX_TRUE_COLOR 0x8002 #define GLX_DIRECT_COLOR 0x8003 #define GLX_PSEUDO_COLOR 0x8004 #define GLX_STATIC_COLOR 0x8005 #define GLX_GRAY_SCALE 0x8006 #define GLX_STATIC_GRAY 0x8007 #define GLX_TRANSPARENT_RGB 0x8008 #define GLX_TRANSPARENT_INDEX 0x8009 #define GLX_VISUAL_ID 0x800B #define GLX_SCREEN 0x800C #define GLX_NON_CONFORMANT_CONFIG 0x800D #define GLX_DRAWABLE_TYPE 0x8010 #define GLX_RENDER_TYPE 0x8011 #define GLX_X_RENDERABLE 0x8012 #define GLX_FBCONFIG_ID 0x8013 #define GLX_RGBA_TYPE 0x8014 #define GLX_COLOR_INDEX_TYPE 0x8015 #define GLX_MAX_PBUFFER_WIDTH 0x8016 #define GLX_MAX_PBUFFER_HEIGHT 0x8017 #define GLX_MAX_PBUFFER_PIXELS 0x8018 #define GLX_PRESERVED_CONTENTS 0x801B #define GLX_LARGEST_PBUFFER 0x801C #define GLX_WIDTH 0x801D #define GLX_HEIGHT 0x801E #define GLX_EVENT_MASK 0x801F #define GLX_DAMAGED 0x8020 #define GLX_SAVED 0x8021 #define GLX_WINDOW 0x8022 #define GLX_PBUFFER 0x8023 #define GLX_PBUFFER_HEIGHT 0x8040 #define GLX_PBUFFER_WIDTH 0x8041 #define GLX_PBUFFER_CLOBBER_MASK 0x08000000 #define GLX_DONT_CARE 0xFFFFFFFF typedef XID GLXFBConfigID; typedef XID GLXPbuffer; typedef XID GLXWindow; typedef struct __GLXFBConfigRec *GLXFBConfig; typedef struct { int event_type; int draw_type; unsigned long serial; Bool send_event; Display *display; GLXDrawable drawable; unsigned int buffer_mask; unsigned int aux_buffer; int x, y; int width, height; int count; } GLXPbufferClobberEvent; typedef union __GLXEvent { GLXPbufferClobberEvent glxpbufferclobber; long pad[24]; } GLXEvent; typedef GLXFBConfig* ( * PFNGLXCHOOSEFBCONFIGPROC) (Display *dpy, int screen, const int *attrib_list, int *nelements); typedef GLXContext ( * PFNGLXCREATENEWCONTEXTPROC) (Display *dpy, GLXFBConfig config, int render_type, GLXContext share_list, Bool direct); typedef GLXPbuffer ( * PFNGLXCREATEPBUFFERPROC) (Display *dpy, GLXFBConfig config, const int *attrib_list); typedef GLXPixmap ( * PFNGLXCREATEPIXMAPPROC) (Display *dpy, GLXFBConfig config, Pixmap pixmap, const int *attrib_list); typedef GLXWindow ( * PFNGLXCREATEWINDOWPROC) (Display *dpy, GLXFBConfig config, Window win, const int *attrib_list); typedef void ( * PFNGLXDESTROYPBUFFERPROC) (Display *dpy, GLXPbuffer pbuf); typedef void ( * PFNGLXDESTROYPIXMAPPROC) (Display *dpy, GLXPixmap pixmap); typedef void ( * PFNGLXDESTROYWINDOWPROC) (Display *dpy, GLXWindow win); typedef GLXDrawable ( * PFNGLXGETCURRENTREADDRAWABLEPROC) (void); typedef int ( * PFNGLXGETFBCONFIGATTRIBPROC) (Display *dpy, GLXFBConfig config, int attribute, int *value); typedef GLXFBConfig* ( * PFNGLXGETFBCONFIGSPROC) (Display *dpy, int screen, int *nelements); typedef void ( * PFNGLXGETSELECTEDEVENTPROC) (Display *dpy, GLXDrawable draw, unsigned long *event_mask); typedef XVisualInfo* ( * PFNGLXGETVISUALFROMFBCONFIGPROC) (Display *dpy, GLXFBConfig config); typedef Bool ( * PFNGLXMAKECONTEXTCURRENTPROC) (Display *display, GLXDrawable draw, GLXDrawable read, GLXContext ctx); typedef int ( * PFNGLXQUERYCONTEXTPROC) (Display *dpy, GLXContext ctx, int attribute, int *value); typedef void ( * PFNGLXQUERYDRAWABLEPROC) (Display *dpy, GLXDrawable draw, int attribute, unsigned int *value); typedef void ( * PFNGLXSELECTEVENTPROC) (Display *dpy, GLXDrawable draw, unsigned long event_mask); #define glXChooseFBConfig GLXEW_GET_FUN(__glewXChooseFBConfig) #define glXCreateNewContext GLXEW_GET_FUN(__glewXCreateNewContext) #define glXCreatePbuffer GLXEW_GET_FUN(__glewXCreatePbuffer) #define glXCreatePixmap GLXEW_GET_FUN(__glewXCreatePixmap) #define glXCreateWindow GLXEW_GET_FUN(__glewXCreateWindow) #define glXDestroyPbuffer GLXEW_GET_FUN(__glewXDestroyPbuffer) #define glXDestroyPixmap GLXEW_GET_FUN(__glewXDestroyPixmap) #define glXDestroyWindow GLXEW_GET_FUN(__glewXDestroyWindow) #define glXGetCurrentReadDrawable GLXEW_GET_FUN(__glewXGetCurrentReadDrawable) #define glXGetFBConfigAttrib GLXEW_GET_FUN(__glewXGetFBConfigAttrib) #define glXGetFBConfigs GLXEW_GET_FUN(__glewXGetFBConfigs) #define glXGetSelectedEvent GLXEW_GET_FUN(__glewXGetSelectedEvent) #define glXGetVisualFromFBConfig GLXEW_GET_FUN(__glewXGetVisualFromFBConfig) #define glXMakeContextCurrent GLXEW_GET_FUN(__glewXMakeContextCurrent) #define glXQueryContext GLXEW_GET_FUN(__glewXQueryContext) #define glXQueryDrawable GLXEW_GET_FUN(__glewXQueryDrawable) #define glXSelectEvent GLXEW_GET_FUN(__glewXSelectEvent) #define GLXEW_VERSION_1_3 GLXEW_GET_VAR(__GLXEW_VERSION_1_3) #endif /* GLX_VERSION_1_3 */ /* ---------------------------- GLX_VERSION_1_4 ---------------------------- */ #ifndef GLX_VERSION_1_4 #define GLX_VERSION_1_4 1 #define GLX_SAMPLE_BUFFERS 100000 #define GLX_SAMPLES 100001 extern void ( * glXGetProcAddress (const GLubyte *procName)) (void); #define GLXEW_VERSION_1_4 GLXEW_GET_VAR(__GLXEW_VERSION_1_4) #endif /* GLX_VERSION_1_4 */ /* -------------------------- GLX_3DFX_multisample ------------------------- */ #ifndef GLX_3DFX_multisample #define GLX_3DFX_multisample 1 #define GLX_SAMPLE_BUFFERS_3DFX 0x8050 #define GLX_SAMPLES_3DFX 0x8051 #define GLXEW_3DFX_multisample GLXEW_GET_VAR(__GLXEW_3DFX_multisample) #endif /* GLX_3DFX_multisample */ /* ------------------------ GLX_AMD_gpu_association ------------------------ */ #ifndef GLX_AMD_gpu_association #define GLX_AMD_gpu_association 1 #define GLX_GPU_VENDOR_AMD 0x1F00 #define GLX_GPU_RENDERER_STRING_AMD 0x1F01 #define GLX_GPU_OPENGL_VERSION_STRING_AMD 0x1F02 #define GLX_GPU_FASTEST_TARGET_GPUS_AMD 0x21A2 #define GLX_GPU_RAM_AMD 0x21A3 #define GLX_GPU_CLOCK_AMD 0x21A4 #define GLX_GPU_NUM_PIPES_AMD 0x21A5 #define GLX_GPU_NUM_SIMD_AMD 0x21A6 #define GLX_GPU_NUM_RB_AMD 0x21A7 #define GLX_GPU_NUM_SPI_AMD 0x21A8 #define GLXEW_AMD_gpu_association GLXEW_GET_VAR(__GLXEW_AMD_gpu_association) #endif /* GLX_AMD_gpu_association */ /* ------------------------- GLX_ARB_create_context ------------------------ */ #ifndef GLX_ARB_create_context #define GLX_ARB_create_context 1 #define GLX_CONTEXT_DEBUG_BIT_ARB 0x0001 #define GLX_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB 0x0002 #define GLX_CONTEXT_MAJOR_VERSION_ARB 0x2091 #define GLX_CONTEXT_MINOR_VERSION_ARB 0x2092 #define GLX_CONTEXT_FLAGS_ARB 0x2094 typedef GLXContext ( * PFNGLXCREATECONTEXTATTRIBSARBPROC) (Display* dpy, GLXFBConfig config, GLXContext share_context, Bool direct, const int *attrib_list); #define glXCreateContextAttribsARB GLXEW_GET_FUN(__glewXCreateContextAttribsARB) #define GLXEW_ARB_create_context GLXEW_GET_VAR(__GLXEW_ARB_create_context) #endif /* GLX_ARB_create_context */ /* --------------------- GLX_ARB_create_context_profile -------------------- */ #ifndef GLX_ARB_create_context_profile #define GLX_ARB_create_context_profile 1 #define GLX_CONTEXT_CORE_PROFILE_BIT_ARB 0x00000001 #define GLX_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB 0x00000002 #define GLX_CONTEXT_PROFILE_MASK_ARB 0x9126 #define GLXEW_ARB_create_context_profile GLXEW_GET_VAR(__GLXEW_ARB_create_context_profile) #endif /* GLX_ARB_create_context_profile */ /* ------------------- GLX_ARB_create_context_robustness ------------------- */ #ifndef GLX_ARB_create_context_robustness #define GLX_ARB_create_context_robustness 1 #define GLX_CONTEXT_ROBUST_ACCESS_BIT_ARB 0x00000004 #define GLX_LOSE_CONTEXT_ON_RESET_ARB 0x8252 #define GLX_CONTEXT_RESET_NOTIFICATION_STRATEGY_ARB 0x8256 #define GLX_NO_RESET_NOTIFICATION_ARB 0x8261 #define GLXEW_ARB_create_context_robustness GLXEW_GET_VAR(__GLXEW_ARB_create_context_robustness) #endif /* GLX_ARB_create_context_robustness */ /* ------------------------- GLX_ARB_fbconfig_float ------------------------ */ #ifndef GLX_ARB_fbconfig_float #define GLX_ARB_fbconfig_float 1 #define GLX_RGBA_FLOAT_BIT 0x00000004 #define GLX_RGBA_FLOAT_TYPE 0x20B9 #define GLXEW_ARB_fbconfig_float GLXEW_GET_VAR(__GLXEW_ARB_fbconfig_float) #endif /* GLX_ARB_fbconfig_float */ /* ------------------------ GLX_ARB_framebuffer_sRGB ----------------------- */ #ifndef GLX_ARB_framebuffer_sRGB #define GLX_ARB_framebuffer_sRGB 1 #define GLX_FRAMEBUFFER_SRGB_CAPABLE_ARB 0x20B2 #define GLXEW_ARB_framebuffer_sRGB GLXEW_GET_VAR(__GLXEW_ARB_framebuffer_sRGB) #endif /* GLX_ARB_framebuffer_sRGB */ /* ------------------------ GLX_ARB_get_proc_address ----------------------- */ #ifndef GLX_ARB_get_proc_address #define GLX_ARB_get_proc_address 1 extern void ( * glXGetProcAddressARB (const GLubyte *procName)) (void); #define GLXEW_ARB_get_proc_address GLXEW_GET_VAR(__GLXEW_ARB_get_proc_address) #endif /* GLX_ARB_get_proc_address */ /* -------------------------- GLX_ARB_multisample -------------------------- */ #ifndef GLX_ARB_multisample #define GLX_ARB_multisample 1 #define GLX_SAMPLE_BUFFERS_ARB 100000 #define GLX_SAMPLES_ARB 100001 #define GLXEW_ARB_multisample GLXEW_GET_VAR(__GLXEW_ARB_multisample) #endif /* GLX_ARB_multisample */ /* ---------------- GLX_ARB_robustness_application_isolation --------------- */ #ifndef GLX_ARB_robustness_application_isolation #define GLX_ARB_robustness_application_isolation 1 #define GLX_CONTEXT_RESET_ISOLATION_BIT_ARB 0x00000008 #define GLXEW_ARB_robustness_application_isolation GLXEW_GET_VAR(__GLXEW_ARB_robustness_application_isolation) #endif /* GLX_ARB_robustness_application_isolation */ /* ---------------- GLX_ARB_robustness_share_group_isolation --------------- */ #ifndef GLX_ARB_robustness_share_group_isolation #define GLX_ARB_robustness_share_group_isolation 1 #define GLX_CONTEXT_RESET_ISOLATION_BIT_ARB 0x00000008 #define GLXEW_ARB_robustness_share_group_isolation GLXEW_GET_VAR(__GLXEW_ARB_robustness_share_group_isolation) #endif /* GLX_ARB_robustness_share_group_isolation */ /* ---------------------- GLX_ARB_vertex_buffer_object --------------------- */ #ifndef GLX_ARB_vertex_buffer_object #define GLX_ARB_vertex_buffer_object 1 #define GLX_CONTEXT_ALLOW_BUFFER_BYTE_ORDER_MISMATCH_ARB 0x2095 #define GLXEW_ARB_vertex_buffer_object GLXEW_GET_VAR(__GLXEW_ARB_vertex_buffer_object) #endif /* GLX_ARB_vertex_buffer_object */ /* ----------------------- GLX_ATI_pixel_format_float ---------------------- */ #ifndef GLX_ATI_pixel_format_float #define GLX_ATI_pixel_format_float 1 #define GLX_RGBA_FLOAT_ATI_BIT 0x00000100 #define GLXEW_ATI_pixel_format_float GLXEW_GET_VAR(__GLXEW_ATI_pixel_format_float) #endif /* GLX_ATI_pixel_format_float */ /* ------------------------- GLX_ATI_render_texture ------------------------ */ #ifndef GLX_ATI_render_texture #define GLX_ATI_render_texture 1 #define GLX_BIND_TO_TEXTURE_RGB_ATI 0x9800 #define GLX_BIND_TO_TEXTURE_RGBA_ATI 0x9801 #define GLX_TEXTURE_FORMAT_ATI 0x9802 #define GLX_TEXTURE_TARGET_ATI 0x9803 #define GLX_MIPMAP_TEXTURE_ATI 0x9804 #define GLX_TEXTURE_RGB_ATI 0x9805 #define GLX_TEXTURE_RGBA_ATI 0x9806 #define GLX_NO_TEXTURE_ATI 0x9807 #define GLX_TEXTURE_CUBE_MAP_ATI 0x9808 #define GLX_TEXTURE_1D_ATI 0x9809 #define GLX_TEXTURE_2D_ATI 0x980A #define GLX_MIPMAP_LEVEL_ATI 0x980B #define GLX_CUBE_MAP_FACE_ATI 0x980C #define GLX_TEXTURE_CUBE_MAP_POSITIVE_X_ATI 0x980D #define GLX_TEXTURE_CUBE_MAP_NEGATIVE_X_ATI 0x980E #define GLX_TEXTURE_CUBE_MAP_POSITIVE_Y_ATI 0x980F #define GLX_TEXTURE_CUBE_MAP_NEGATIVE_Y_ATI 0x9810 #define GLX_TEXTURE_CUBE_MAP_POSITIVE_Z_ATI 0x9811 #define GLX_TEXTURE_CUBE_MAP_NEGATIVE_Z_ATI 0x9812 #define GLX_FRONT_LEFT_ATI 0x9813 #define GLX_FRONT_RIGHT_ATI 0x9814 #define GLX_BACK_LEFT_ATI 0x9815 #define GLX_BACK_RIGHT_ATI 0x9816 #define GLX_AUX0_ATI 0x9817 #define GLX_AUX1_ATI 0x9818 #define GLX_AUX2_ATI 0x9819 #define GLX_AUX3_ATI 0x981A #define GLX_AUX4_ATI 0x981B #define GLX_AUX5_ATI 0x981C #define GLX_AUX6_ATI 0x981D #define GLX_AUX7_ATI 0x981E #define GLX_AUX8_ATI 0x981F #define GLX_AUX9_ATI 0x9820 #define GLX_BIND_TO_TEXTURE_LUMINANCE_ATI 0x9821 #define GLX_BIND_TO_TEXTURE_INTENSITY_ATI 0x9822 typedef void ( * PFNGLXBINDTEXIMAGEATIPROC) (Display *dpy, GLXPbuffer pbuf, int buffer); typedef void ( * PFNGLXDRAWABLEATTRIBATIPROC) (Display *dpy, GLXDrawable draw, const int *attrib_list); typedef void ( * PFNGLXRELEASETEXIMAGEATIPROC) (Display *dpy, GLXPbuffer pbuf, int buffer); #define glXBindTexImageATI GLXEW_GET_FUN(__glewXBindTexImageATI) #define glXDrawableAttribATI GLXEW_GET_FUN(__glewXDrawableAttribATI) #define glXReleaseTexImageATI GLXEW_GET_FUN(__glewXReleaseTexImageATI) #define GLXEW_ATI_render_texture GLXEW_GET_VAR(__GLXEW_ATI_render_texture) #endif /* GLX_ATI_render_texture */ /* ------------------- GLX_EXT_create_context_es2_profile ------------------ */ #ifndef GLX_EXT_create_context_es2_profile #define GLX_EXT_create_context_es2_profile 1 #define GLX_CONTEXT_ES2_PROFILE_BIT_EXT 0x00000004 #define GLXEW_EXT_create_context_es2_profile GLXEW_GET_VAR(__GLXEW_EXT_create_context_es2_profile) #endif /* GLX_EXT_create_context_es2_profile */ /* ------------------- GLX_EXT_create_context_es_profile ------------------- */ #ifndef GLX_EXT_create_context_es_profile #define GLX_EXT_create_context_es_profile 1 #define GLX_CONTEXT_ES_PROFILE_BIT_EXT 0x00000004 #define GLXEW_EXT_create_context_es_profile GLXEW_GET_VAR(__GLXEW_EXT_create_context_es_profile) #endif /* GLX_EXT_create_context_es_profile */ /* --------------------- GLX_EXT_fbconfig_packed_float --------------------- */ #ifndef GLX_EXT_fbconfig_packed_float #define GLX_EXT_fbconfig_packed_float 1 #define GLX_RGBA_UNSIGNED_FLOAT_BIT_EXT 0x00000008 #define GLX_RGBA_UNSIGNED_FLOAT_TYPE_EXT 0x20B1 #define GLXEW_EXT_fbconfig_packed_float GLXEW_GET_VAR(__GLXEW_EXT_fbconfig_packed_float) #endif /* GLX_EXT_fbconfig_packed_float */ /* ------------------------ GLX_EXT_framebuffer_sRGB ----------------------- */ #ifndef GLX_EXT_framebuffer_sRGB #define GLX_EXT_framebuffer_sRGB 1 #define GLX_FRAMEBUFFER_SRGB_CAPABLE_EXT 0x20B2 #define GLXEW_EXT_framebuffer_sRGB GLXEW_GET_VAR(__GLXEW_EXT_framebuffer_sRGB) #endif /* GLX_EXT_framebuffer_sRGB */ /* ------------------------- GLX_EXT_import_context ------------------------ */ #ifndef GLX_EXT_import_context #define GLX_EXT_import_context 1 #define GLX_SHARE_CONTEXT_EXT 0x800A #define GLX_VISUAL_ID_EXT 0x800B #define GLX_SCREEN_EXT 0x800C typedef XID GLXContextID; typedef void ( * PFNGLXFREECONTEXTEXTPROC) (Display* dpy, GLXContext context); typedef GLXContextID ( * PFNGLXGETCONTEXTIDEXTPROC) (const GLXContext context); typedef GLXContext ( * PFNGLXIMPORTCONTEXTEXTPROC) (Display* dpy, GLXContextID contextID); typedef int ( * PFNGLXQUERYCONTEXTINFOEXTPROC) (Display* dpy, GLXContext context, int attribute,int *value); #define glXFreeContextEXT GLXEW_GET_FUN(__glewXFreeContextEXT) #define glXGetContextIDEXT GLXEW_GET_FUN(__glewXGetContextIDEXT) #define glXImportContextEXT GLXEW_GET_FUN(__glewXImportContextEXT) #define glXQueryContextInfoEXT GLXEW_GET_FUN(__glewXQueryContextInfoEXT) #define GLXEW_EXT_import_context GLXEW_GET_VAR(__GLXEW_EXT_import_context) #endif /* GLX_EXT_import_context */ /* -------------------------- GLX_EXT_scene_marker ------------------------- */ #ifndef GLX_EXT_scene_marker #define GLX_EXT_scene_marker 1 #define GLXEW_EXT_scene_marker GLXEW_GET_VAR(__GLXEW_EXT_scene_marker) #endif /* GLX_EXT_scene_marker */ /* -------------------------- GLX_EXT_swap_control ------------------------- */ #ifndef GLX_EXT_swap_control #define GLX_EXT_swap_control 1 #define GLX_SWAP_INTERVAL_EXT 0x20F1 #define GLX_MAX_SWAP_INTERVAL_EXT 0x20F2 typedef void ( * PFNGLXSWAPINTERVALEXTPROC) (Display* dpy, GLXDrawable drawable, int interval); #define glXSwapIntervalEXT GLXEW_GET_FUN(__glewXSwapIntervalEXT) #define GLXEW_EXT_swap_control GLXEW_GET_VAR(__GLXEW_EXT_swap_control) #endif /* GLX_EXT_swap_control */ /* ----------------------- GLX_EXT_swap_control_tear ----------------------- */ #ifndef GLX_EXT_swap_control_tear #define GLX_EXT_swap_control_tear 1 #define GLX_LATE_SWAPS_TEAR_EXT 0x20F3 #define GLXEW_EXT_swap_control_tear GLXEW_GET_VAR(__GLXEW_EXT_swap_control_tear) #endif /* GLX_EXT_swap_control_tear */ /* ---------------------- GLX_EXT_texture_from_pixmap ---------------------- */ #ifndef GLX_EXT_texture_from_pixmap #define GLX_EXT_texture_from_pixmap 1 #define GLX_TEXTURE_1D_BIT_EXT 0x00000001 #define GLX_TEXTURE_2D_BIT_EXT 0x00000002 #define GLX_TEXTURE_RECTANGLE_BIT_EXT 0x00000004 #define GLX_BIND_TO_TEXTURE_RGB_EXT 0x20D0 #define GLX_BIND_TO_TEXTURE_RGBA_EXT 0x20D1 #define GLX_BIND_TO_MIPMAP_TEXTURE_EXT 0x20D2 #define GLX_BIND_TO_TEXTURE_TARGETS_EXT 0x20D3 #define GLX_Y_INVERTED_EXT 0x20D4 #define GLX_TEXTURE_FORMAT_EXT 0x20D5 #define GLX_TEXTURE_TARGET_EXT 0x20D6 #define GLX_MIPMAP_TEXTURE_EXT 0x20D7 #define GLX_TEXTURE_FORMAT_NONE_EXT 0x20D8 #define GLX_TEXTURE_FORMAT_RGB_EXT 0x20D9 #define GLX_TEXTURE_FORMAT_RGBA_EXT 0x20DA #define GLX_TEXTURE_1D_EXT 0x20DB #define GLX_TEXTURE_2D_EXT 0x20DC #define GLX_TEXTURE_RECTANGLE_EXT 0x20DD #define GLX_FRONT_LEFT_EXT 0x20DE #define GLX_FRONT_RIGHT_EXT 0x20DF #define GLX_BACK_LEFT_EXT 0x20E0 #define GLX_BACK_RIGHT_EXT 0x20E1 #define GLX_AUX0_EXT 0x20E2 #define GLX_AUX1_EXT 0x20E3 #define GLX_AUX2_EXT 0x20E4 #define GLX_AUX3_EXT 0x20E5 #define GLX_AUX4_EXT 0x20E6 #define GLX_AUX5_EXT 0x20E7 #define GLX_AUX6_EXT 0x20E8 #define GLX_AUX7_EXT 0x20E9 #define GLX_AUX8_EXT 0x20EA #define GLX_AUX9_EXT 0x20EB typedef void ( * PFNGLXBINDTEXIMAGEEXTPROC) (Display* display, GLXDrawable drawable, int buffer, const int *attrib_list); typedef void ( * PFNGLXRELEASETEXIMAGEEXTPROC) (Display* display, GLXDrawable drawable, int buffer); #define glXBindTexImageEXT GLXEW_GET_FUN(__glewXBindTexImageEXT) #define glXReleaseTexImageEXT GLXEW_GET_FUN(__glewXReleaseTexImageEXT) #define GLXEW_EXT_texture_from_pixmap GLXEW_GET_VAR(__GLXEW_EXT_texture_from_pixmap) #endif /* GLX_EXT_texture_from_pixmap */ /* -------------------------- GLX_EXT_visual_info -------------------------- */ #ifndef GLX_EXT_visual_info #define GLX_EXT_visual_info 1 #define GLX_X_VISUAL_TYPE_EXT 0x22 #define GLX_TRANSPARENT_TYPE_EXT 0x23 #define GLX_TRANSPARENT_INDEX_VALUE_EXT 0x24 #define GLX_TRANSPARENT_RED_VALUE_EXT 0x25 #define GLX_TRANSPARENT_GREEN_VALUE_EXT 0x26 #define GLX_TRANSPARENT_BLUE_VALUE_EXT 0x27 #define GLX_TRANSPARENT_ALPHA_VALUE_EXT 0x28 #define GLX_NONE_EXT 0x8000 #define GLX_TRUE_COLOR_EXT 0x8002 #define GLX_DIRECT_COLOR_EXT 0x8003 #define GLX_PSEUDO_COLOR_EXT 0x8004 #define GLX_STATIC_COLOR_EXT 0x8005 #define GLX_GRAY_SCALE_EXT 0x8006 #define GLX_STATIC_GRAY_EXT 0x8007 #define GLX_TRANSPARENT_RGB_EXT 0x8008 #define GLX_TRANSPARENT_INDEX_EXT 0x8009 #define GLXEW_EXT_visual_info GLXEW_GET_VAR(__GLXEW_EXT_visual_info) #endif /* GLX_EXT_visual_info */ /* ------------------------- GLX_EXT_visual_rating ------------------------- */ #ifndef GLX_EXT_visual_rating #define GLX_EXT_visual_rating 1 #define GLX_VISUAL_CAVEAT_EXT 0x20 #define GLX_SLOW_VISUAL_EXT 0x8001 #define GLX_NON_CONFORMANT_VISUAL_EXT 0x800D #define GLXEW_EXT_visual_rating GLXEW_GET_VAR(__GLXEW_EXT_visual_rating) #endif /* GLX_EXT_visual_rating */ /* -------------------------- GLX_INTEL_swap_event ------------------------- */ #ifndef GLX_INTEL_swap_event #define GLX_INTEL_swap_event 1 #define GLX_EXCHANGE_COMPLETE_INTEL 0x8180 #define GLX_COPY_COMPLETE_INTEL 0x8181 #define GLX_FLIP_COMPLETE_INTEL 0x8182 #define GLX_BUFFER_SWAP_COMPLETE_INTEL_MASK 0x04000000 #define GLXEW_INTEL_swap_event GLXEW_GET_VAR(__GLXEW_INTEL_swap_event) #endif /* GLX_INTEL_swap_event */ /* -------------------------- GLX_MESA_agp_offset -------------------------- */ #ifndef GLX_MESA_agp_offset #define GLX_MESA_agp_offset 1 typedef unsigned int ( * PFNGLXGETAGPOFFSETMESAPROC) (const void* pointer); #define glXGetAGPOffsetMESA GLXEW_GET_FUN(__glewXGetAGPOffsetMESA) #define GLXEW_MESA_agp_offset GLXEW_GET_VAR(__GLXEW_MESA_agp_offset) #endif /* GLX_MESA_agp_offset */ /* ------------------------ GLX_MESA_copy_sub_buffer ----------------------- */ #ifndef GLX_MESA_copy_sub_buffer #define GLX_MESA_copy_sub_buffer 1 typedef void ( * PFNGLXCOPYSUBBUFFERMESAPROC) (Display* dpy, GLXDrawable drawable, int x, int y, int width, int height); #define glXCopySubBufferMESA GLXEW_GET_FUN(__glewXCopySubBufferMESA) #define GLXEW_MESA_copy_sub_buffer GLXEW_GET_VAR(__GLXEW_MESA_copy_sub_buffer) #endif /* GLX_MESA_copy_sub_buffer */ /* ------------------------ GLX_MESA_pixmap_colormap ----------------------- */ #ifndef GLX_MESA_pixmap_colormap #define GLX_MESA_pixmap_colormap 1 typedef GLXPixmap ( * PFNGLXCREATEGLXPIXMAPMESAPROC) (Display* dpy, XVisualInfo *visual, Pixmap pixmap, Colormap cmap); #define glXCreateGLXPixmapMESA GLXEW_GET_FUN(__glewXCreateGLXPixmapMESA) #define GLXEW_MESA_pixmap_colormap GLXEW_GET_VAR(__GLXEW_MESA_pixmap_colormap) #endif /* GLX_MESA_pixmap_colormap */ /* ------------------------ GLX_MESA_release_buffers ----------------------- */ #ifndef GLX_MESA_release_buffers #define GLX_MESA_release_buffers 1 typedef Bool ( * PFNGLXRELEASEBUFFERSMESAPROC) (Display* dpy, GLXDrawable d); #define glXReleaseBuffersMESA GLXEW_GET_FUN(__glewXReleaseBuffersMESA) #define GLXEW_MESA_release_buffers GLXEW_GET_VAR(__GLXEW_MESA_release_buffers) #endif /* GLX_MESA_release_buffers */ /* ------------------------- GLX_MESA_set_3dfx_mode ------------------------ */ #ifndef GLX_MESA_set_3dfx_mode #define GLX_MESA_set_3dfx_mode 1 #define GLX_3DFX_WINDOW_MODE_MESA 0x1 #define GLX_3DFX_FULLSCREEN_MODE_MESA 0x2 typedef GLboolean ( * PFNGLXSET3DFXMODEMESAPROC) (GLint mode); #define glXSet3DfxModeMESA GLXEW_GET_FUN(__glewXSet3DfxModeMESA) #define GLXEW_MESA_set_3dfx_mode GLXEW_GET_VAR(__GLXEW_MESA_set_3dfx_mode) #endif /* GLX_MESA_set_3dfx_mode */ /* ------------------------- GLX_MESA_swap_control ------------------------- */ #ifndef GLX_MESA_swap_control #define GLX_MESA_swap_control 1 typedef int ( * PFNGLXGETSWAPINTERVALMESAPROC) (void); typedef int ( * PFNGLXSWAPINTERVALMESAPROC) (unsigned int interval); #define glXGetSwapIntervalMESA GLXEW_GET_FUN(__glewXGetSwapIntervalMESA) #define glXSwapIntervalMESA GLXEW_GET_FUN(__glewXSwapIntervalMESA) #define GLXEW_MESA_swap_control GLXEW_GET_VAR(__GLXEW_MESA_swap_control) #endif /* GLX_MESA_swap_control */ /* --------------------------- GLX_NV_copy_image --------------------------- */ #ifndef GLX_NV_copy_image #define GLX_NV_copy_image 1 typedef void ( * PFNGLXCOPYIMAGESUBDATANVPROC) (Display *dpy, GLXContext srcCtx, GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLXContext dstCtx, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei width, GLsizei height, GLsizei depth); #define glXCopyImageSubDataNV GLXEW_GET_FUN(__glewXCopyImageSubDataNV) #define GLXEW_NV_copy_image GLXEW_GET_VAR(__GLXEW_NV_copy_image) #endif /* GLX_NV_copy_image */ /* -------------------------- GLX_NV_float_buffer -------------------------- */ #ifndef GLX_NV_float_buffer #define GLX_NV_float_buffer 1 #define GLX_FLOAT_COMPONENTS_NV 0x20B0 #define GLXEW_NV_float_buffer GLXEW_GET_VAR(__GLXEW_NV_float_buffer) #endif /* GLX_NV_float_buffer */ /* ---------------------- GLX_NV_multisample_coverage ---------------------- */ #ifndef GLX_NV_multisample_coverage #define GLX_NV_multisample_coverage 1 #define GLX_COLOR_SAMPLES_NV 0x20B3 #define GLX_COVERAGE_SAMPLES_NV 100001 #define GLXEW_NV_multisample_coverage GLXEW_GET_VAR(__GLXEW_NV_multisample_coverage) #endif /* GLX_NV_multisample_coverage */ /* -------------------------- GLX_NV_present_video ------------------------- */ #ifndef GLX_NV_present_video #define GLX_NV_present_video 1 #define GLX_NUM_VIDEO_SLOTS_NV 0x20F0 typedef int ( * PFNGLXBINDVIDEODEVICENVPROC) (Display* dpy, unsigned int video_slot, unsigned int video_device, const int *attrib_list); typedef unsigned int* ( * PFNGLXENUMERATEVIDEODEVICESNVPROC) (Display *dpy, int screen, int *nelements); #define glXBindVideoDeviceNV GLXEW_GET_FUN(__glewXBindVideoDeviceNV) #define glXEnumerateVideoDevicesNV GLXEW_GET_FUN(__glewXEnumerateVideoDevicesNV) #define GLXEW_NV_present_video GLXEW_GET_VAR(__GLXEW_NV_present_video) #endif /* GLX_NV_present_video */ /* --------------------------- GLX_NV_swap_group --------------------------- */ #ifndef GLX_NV_swap_group #define GLX_NV_swap_group 1 typedef Bool ( * PFNGLXBINDSWAPBARRIERNVPROC) (Display* dpy, GLuint group, GLuint barrier); typedef Bool ( * PFNGLXJOINSWAPGROUPNVPROC) (Display* dpy, GLXDrawable drawable, GLuint group); typedef Bool ( * PFNGLXQUERYFRAMECOUNTNVPROC) (Display* dpy, int screen, GLuint *count); typedef Bool ( * PFNGLXQUERYMAXSWAPGROUPSNVPROC) (Display* dpy, int screen, GLuint *maxGroups, GLuint *maxBarriers); typedef Bool ( * PFNGLXQUERYSWAPGROUPNVPROC) (Display* dpy, GLXDrawable drawable, GLuint *group, GLuint *barrier); typedef Bool ( * PFNGLXRESETFRAMECOUNTNVPROC) (Display* dpy, int screen); #define glXBindSwapBarrierNV GLXEW_GET_FUN(__glewXBindSwapBarrierNV) #define glXJoinSwapGroupNV GLXEW_GET_FUN(__glewXJoinSwapGroupNV) #define glXQueryFrameCountNV GLXEW_GET_FUN(__glewXQueryFrameCountNV) #define glXQueryMaxSwapGroupsNV GLXEW_GET_FUN(__glewXQueryMaxSwapGroupsNV) #define glXQuerySwapGroupNV GLXEW_GET_FUN(__glewXQuerySwapGroupNV) #define glXResetFrameCountNV GLXEW_GET_FUN(__glewXResetFrameCountNV) #define GLXEW_NV_swap_group GLXEW_GET_VAR(__GLXEW_NV_swap_group) #endif /* GLX_NV_swap_group */ /* ----------------------- GLX_NV_vertex_array_range ----------------------- */ #ifndef GLX_NV_vertex_array_range #define GLX_NV_vertex_array_range 1 typedef void * ( * PFNGLXALLOCATEMEMORYNVPROC) (GLsizei size, GLfloat readFrequency, GLfloat writeFrequency, GLfloat priority); typedef void ( * PFNGLXFREEMEMORYNVPROC) (void *pointer); #define glXAllocateMemoryNV GLXEW_GET_FUN(__glewXAllocateMemoryNV) #define glXFreeMemoryNV GLXEW_GET_FUN(__glewXFreeMemoryNV) #define GLXEW_NV_vertex_array_range GLXEW_GET_VAR(__GLXEW_NV_vertex_array_range) #endif /* GLX_NV_vertex_array_range */ /* -------------------------- GLX_NV_video_capture ------------------------- */ #ifndef GLX_NV_video_capture #define GLX_NV_video_capture 1 #define GLX_DEVICE_ID_NV 0x20CD #define GLX_UNIQUE_ID_NV 0x20CE #define GLX_NUM_VIDEO_CAPTURE_SLOTS_NV 0x20CF typedef XID GLXVideoCaptureDeviceNV; typedef int ( * PFNGLXBINDVIDEOCAPTUREDEVICENVPROC) (Display* dpy, unsigned int video_capture_slot, GLXVideoCaptureDeviceNV device); typedef GLXVideoCaptureDeviceNV * ( * PFNGLXENUMERATEVIDEOCAPTUREDEVICESNVPROC) (Display* dpy, int screen, int *nelements); typedef void ( * PFNGLXLOCKVIDEOCAPTUREDEVICENVPROC) (Display* dpy, GLXVideoCaptureDeviceNV device); typedef int ( * PFNGLXQUERYVIDEOCAPTUREDEVICENVPROC) (Display* dpy, GLXVideoCaptureDeviceNV device, int attribute, int *value); typedef void ( * PFNGLXRELEASEVIDEOCAPTUREDEVICENVPROC) (Display* dpy, GLXVideoCaptureDeviceNV device); #define glXBindVideoCaptureDeviceNV GLXEW_GET_FUN(__glewXBindVideoCaptureDeviceNV) #define glXEnumerateVideoCaptureDevicesNV GLXEW_GET_FUN(__glewXEnumerateVideoCaptureDevicesNV) #define glXLockVideoCaptureDeviceNV GLXEW_GET_FUN(__glewXLockVideoCaptureDeviceNV) #define glXQueryVideoCaptureDeviceNV GLXEW_GET_FUN(__glewXQueryVideoCaptureDeviceNV) #define glXReleaseVideoCaptureDeviceNV GLXEW_GET_FUN(__glewXReleaseVideoCaptureDeviceNV) #define GLXEW_NV_video_capture GLXEW_GET_VAR(__GLXEW_NV_video_capture) #endif /* GLX_NV_video_capture */ /* ---------------------------- GLX_NV_video_out --------------------------- */ #ifndef GLX_NV_video_out #define GLX_NV_video_out 1 #define GLX_VIDEO_OUT_COLOR_NV 0x20C3 #define GLX_VIDEO_OUT_ALPHA_NV 0x20C4 #define GLX_VIDEO_OUT_DEPTH_NV 0x20C5 #define GLX_VIDEO_OUT_COLOR_AND_ALPHA_NV 0x20C6 #define GLX_VIDEO_OUT_COLOR_AND_DEPTH_NV 0x20C7 #define GLX_VIDEO_OUT_FRAME_NV 0x20C8 #define GLX_VIDEO_OUT_FIELD_1_NV 0x20C9 #define GLX_VIDEO_OUT_FIELD_2_NV 0x20CA #define GLX_VIDEO_OUT_STACKED_FIELDS_1_2_NV 0x20CB #define GLX_VIDEO_OUT_STACKED_FIELDS_2_1_NV 0x20CC typedef int ( * PFNGLXBINDVIDEOIMAGENVPROC) (Display* dpy, GLXVideoDeviceNV VideoDevice, GLXPbuffer pbuf, int iVideoBuffer); typedef int ( * PFNGLXGETVIDEODEVICENVPROC) (Display* dpy, int screen, int numVideoDevices, GLXVideoDeviceNV *pVideoDevice); typedef int ( * PFNGLXGETVIDEOINFONVPROC) (Display* dpy, int screen, GLXVideoDeviceNV VideoDevice, unsigned long *pulCounterOutputPbuffer, unsigned long *pulCounterOutputVideo); typedef int ( * PFNGLXRELEASEVIDEODEVICENVPROC) (Display* dpy, int screen, GLXVideoDeviceNV VideoDevice); typedef int ( * PFNGLXRELEASEVIDEOIMAGENVPROC) (Display* dpy, GLXPbuffer pbuf); typedef int ( * PFNGLXSENDPBUFFERTOVIDEONVPROC) (Display* dpy, GLXPbuffer pbuf, int iBufferType, unsigned long *pulCounterPbuffer, GLboolean bBlock); #define glXBindVideoImageNV GLXEW_GET_FUN(__glewXBindVideoImageNV) #define glXGetVideoDeviceNV GLXEW_GET_FUN(__glewXGetVideoDeviceNV) #define glXGetVideoInfoNV GLXEW_GET_FUN(__glewXGetVideoInfoNV) #define glXReleaseVideoDeviceNV GLXEW_GET_FUN(__glewXReleaseVideoDeviceNV) #define glXReleaseVideoImageNV GLXEW_GET_FUN(__glewXReleaseVideoImageNV) #define glXSendPbufferToVideoNV GLXEW_GET_FUN(__glewXSendPbufferToVideoNV) #define GLXEW_NV_video_out GLXEW_GET_VAR(__GLXEW_NV_video_out) #endif /* GLX_NV_video_out */ /* -------------------------- GLX_OML_swap_method -------------------------- */ #ifndef GLX_OML_swap_method #define GLX_OML_swap_method 1 #define GLX_SWAP_METHOD_OML 0x8060 #define GLX_SWAP_EXCHANGE_OML 0x8061 #define GLX_SWAP_COPY_OML 0x8062 #define GLX_SWAP_UNDEFINED_OML 0x8063 #define GLXEW_OML_swap_method GLXEW_GET_VAR(__GLXEW_OML_swap_method) #endif /* GLX_OML_swap_method */ /* -------------------------- GLX_OML_sync_control ------------------------- */ #ifndef GLX_OML_sync_control #define GLX_OML_sync_control 1 typedef Bool ( * PFNGLXGETMSCRATEOMLPROC) (Display* dpy, GLXDrawable drawable, int32_t* numerator, int32_t* denominator); typedef Bool ( * PFNGLXGETSYNCVALUESOMLPROC) (Display* dpy, GLXDrawable drawable, int64_t* ust, int64_t* msc, int64_t* sbc); typedef int64_t ( * PFNGLXSWAPBUFFERSMSCOMLPROC) (Display* dpy, GLXDrawable drawable, int64_t target_msc, int64_t divisor, int64_t remainder); typedef Bool ( * PFNGLXWAITFORMSCOMLPROC) (Display* dpy, GLXDrawable drawable, int64_t target_msc, int64_t divisor, int64_t remainder, int64_t* ust, int64_t* msc, int64_t* sbc); typedef Bool ( * PFNGLXWAITFORSBCOMLPROC) (Display* dpy, GLXDrawable drawable, int64_t target_sbc, int64_t* ust, int64_t* msc, int64_t* sbc); #define glXGetMscRateOML GLXEW_GET_FUN(__glewXGetMscRateOML) #define glXGetSyncValuesOML GLXEW_GET_FUN(__glewXGetSyncValuesOML) #define glXSwapBuffersMscOML GLXEW_GET_FUN(__glewXSwapBuffersMscOML) #define glXWaitForMscOML GLXEW_GET_FUN(__glewXWaitForMscOML) #define glXWaitForSbcOML GLXEW_GET_FUN(__glewXWaitForSbcOML) #define GLXEW_OML_sync_control GLXEW_GET_VAR(__GLXEW_OML_sync_control) #endif /* GLX_OML_sync_control */ /* ------------------------ GLX_SGIS_blended_overlay ----------------------- */ #ifndef GLX_SGIS_blended_overlay #define GLX_SGIS_blended_overlay 1 #define GLX_BLENDED_RGBA_SGIS 0x8025 #define GLXEW_SGIS_blended_overlay GLXEW_GET_VAR(__GLXEW_SGIS_blended_overlay) #endif /* GLX_SGIS_blended_overlay */ /* -------------------------- GLX_SGIS_color_range ------------------------- */ #ifndef GLX_SGIS_color_range #define GLX_SGIS_color_range 1 #define GLX_MIN_RED_SGIS 0 #define GLX_MAX_GREEN_SGIS 0 #define GLX_MIN_BLUE_SGIS 0 #define GLX_MAX_ALPHA_SGIS 0 #define GLX_MIN_GREEN_SGIS 0 #define GLX_MIN_ALPHA_SGIS 0 #define GLX_MAX_RED_SGIS 0 #define GLX_EXTENDED_RANGE_SGIS 0 #define GLX_MAX_BLUE_SGIS 0 #define GLXEW_SGIS_color_range GLXEW_GET_VAR(__GLXEW_SGIS_color_range) #endif /* GLX_SGIS_color_range */ /* -------------------------- GLX_SGIS_multisample ------------------------- */ #ifndef GLX_SGIS_multisample #define GLX_SGIS_multisample 1 #define GLX_SAMPLE_BUFFERS_SGIS 100000 #define GLX_SAMPLES_SGIS 100001 #define GLXEW_SGIS_multisample GLXEW_GET_VAR(__GLXEW_SGIS_multisample) #endif /* GLX_SGIS_multisample */ /* ---------------------- GLX_SGIS_shared_multisample ---------------------- */ #ifndef GLX_SGIS_shared_multisample #define GLX_SGIS_shared_multisample 1 #define GLX_MULTISAMPLE_SUB_RECT_WIDTH_SGIS 0x8026 #define GLX_MULTISAMPLE_SUB_RECT_HEIGHT_SGIS 0x8027 #define GLXEW_SGIS_shared_multisample GLXEW_GET_VAR(__GLXEW_SGIS_shared_multisample) #endif /* GLX_SGIS_shared_multisample */ /* --------------------------- GLX_SGIX_fbconfig --------------------------- */ #ifndef GLX_SGIX_fbconfig #define GLX_SGIX_fbconfig 1 #define GLX_WINDOW_BIT_SGIX 0x00000001 #define GLX_RGBA_BIT_SGIX 0x00000001 #define GLX_PIXMAP_BIT_SGIX 0x00000002 #define GLX_COLOR_INDEX_BIT_SGIX 0x00000002 #define GLX_SCREEN_EXT 0x800C #define GLX_DRAWABLE_TYPE_SGIX 0x8010 #define GLX_RENDER_TYPE_SGIX 0x8011 #define GLX_X_RENDERABLE_SGIX 0x8012 #define GLX_FBCONFIG_ID_SGIX 0x8013 #define GLX_RGBA_TYPE_SGIX 0x8014 #define GLX_COLOR_INDEX_TYPE_SGIX 0x8015 typedef XID GLXFBConfigIDSGIX; typedef struct __GLXFBConfigRec *GLXFBConfigSGIX; typedef GLXFBConfigSGIX* ( * PFNGLXCHOOSEFBCONFIGSGIXPROC) (Display *dpy, int screen, const int *attrib_list, int *nelements); typedef GLXContext ( * PFNGLXCREATECONTEXTWITHCONFIGSGIXPROC) (Display* dpy, GLXFBConfig config, int render_type, GLXContext share_list, Bool direct); typedef GLXPixmap ( * PFNGLXCREATEGLXPIXMAPWITHCONFIGSGIXPROC) (Display* dpy, GLXFBConfig config, Pixmap pixmap); typedef int ( * PFNGLXGETFBCONFIGATTRIBSGIXPROC) (Display* dpy, GLXFBConfigSGIX config, int attribute, int *value); typedef GLXFBConfigSGIX ( * PFNGLXGETFBCONFIGFROMVISUALSGIXPROC) (Display* dpy, XVisualInfo *vis); typedef XVisualInfo* ( * PFNGLXGETVISUALFROMFBCONFIGSGIXPROC) (Display *dpy, GLXFBConfig config); #define glXChooseFBConfigSGIX GLXEW_GET_FUN(__glewXChooseFBConfigSGIX) #define glXCreateContextWithConfigSGIX GLXEW_GET_FUN(__glewXCreateContextWithConfigSGIX) #define glXCreateGLXPixmapWithConfigSGIX GLXEW_GET_FUN(__glewXCreateGLXPixmapWithConfigSGIX) #define glXGetFBConfigAttribSGIX GLXEW_GET_FUN(__glewXGetFBConfigAttribSGIX) #define glXGetFBConfigFromVisualSGIX GLXEW_GET_FUN(__glewXGetFBConfigFromVisualSGIX) #define glXGetVisualFromFBConfigSGIX GLXEW_GET_FUN(__glewXGetVisualFromFBConfigSGIX) #define GLXEW_SGIX_fbconfig GLXEW_GET_VAR(__GLXEW_SGIX_fbconfig) #endif /* GLX_SGIX_fbconfig */ /* --------------------------- GLX_SGIX_hyperpipe -------------------------- */ #ifndef GLX_SGIX_hyperpipe #define GLX_SGIX_hyperpipe 1 #define GLX_HYPERPIPE_DISPLAY_PIPE_SGIX 0x00000001 #define GLX_PIPE_RECT_SGIX 0x00000001 #define GLX_PIPE_RECT_LIMITS_SGIX 0x00000002 #define GLX_HYPERPIPE_RENDER_PIPE_SGIX 0x00000002 #define GLX_HYPERPIPE_STEREO_SGIX 0x00000003 #define GLX_HYPERPIPE_PIXEL_AVERAGE_SGIX 0x00000004 #define GLX_HYPERPIPE_PIPE_NAME_LENGTH_SGIX 80 #define GLX_BAD_HYPERPIPE_CONFIG_SGIX 91 #define GLX_BAD_HYPERPIPE_SGIX 92 #define GLX_HYPERPIPE_ID_SGIX 0x8030 typedef struct { char pipeName[GLX_HYPERPIPE_PIPE_NAME_LENGTH_SGIX]; int networkId; } GLXHyperpipeNetworkSGIX; typedef struct { char pipeName[GLX_HYPERPIPE_PIPE_NAME_LENGTH_SGIX]; int XOrigin; int YOrigin; int maxHeight; int maxWidth; } GLXPipeRectLimits; typedef struct { char pipeName[GLX_HYPERPIPE_PIPE_NAME_LENGTH_SGIX]; int channel; unsigned int participationType; int timeSlice; } GLXHyperpipeConfigSGIX; typedef struct { char pipeName[GLX_HYPERPIPE_PIPE_NAME_LENGTH_SGIX]; int srcXOrigin; int srcYOrigin; int srcWidth; int srcHeight; int destXOrigin; int destYOrigin; int destWidth; int destHeight; } GLXPipeRect; typedef int ( * PFNGLXBINDHYPERPIPESGIXPROC) (Display *dpy, int hpId); typedef int ( * PFNGLXDESTROYHYPERPIPECONFIGSGIXPROC) (Display *dpy, int hpId); typedef int ( * PFNGLXHYPERPIPEATTRIBSGIXPROC) (Display *dpy, int timeSlice, int attrib, int size, void *attribList); typedef int ( * PFNGLXHYPERPIPECONFIGSGIXPROC) (Display *dpy, int networkId, int npipes, GLXHyperpipeConfigSGIX *cfg, int *hpId); typedef int ( * PFNGLXQUERYHYPERPIPEATTRIBSGIXPROC) (Display *dpy, int timeSlice, int attrib, int size, void *returnAttribList); typedef int ( * PFNGLXQUERYHYPERPIPEBESTATTRIBSGIXPROC) (Display *dpy, int timeSlice, int attrib, int size, void *attribList, void *returnAttribList); typedef GLXHyperpipeConfigSGIX * ( * PFNGLXQUERYHYPERPIPECONFIGSGIXPROC) (Display *dpy, int hpId, int *npipes); typedef GLXHyperpipeNetworkSGIX * ( * PFNGLXQUERYHYPERPIPENETWORKSGIXPROC) (Display *dpy, int *npipes); #define glXBindHyperpipeSGIX GLXEW_GET_FUN(__glewXBindHyperpipeSGIX) #define glXDestroyHyperpipeConfigSGIX GLXEW_GET_FUN(__glewXDestroyHyperpipeConfigSGIX) #define glXHyperpipeAttribSGIX GLXEW_GET_FUN(__glewXHyperpipeAttribSGIX) #define glXHyperpipeConfigSGIX GLXEW_GET_FUN(__glewXHyperpipeConfigSGIX) #define glXQueryHyperpipeAttribSGIX GLXEW_GET_FUN(__glewXQueryHyperpipeAttribSGIX) #define glXQueryHyperpipeBestAttribSGIX GLXEW_GET_FUN(__glewXQueryHyperpipeBestAttribSGIX) #define glXQueryHyperpipeConfigSGIX GLXEW_GET_FUN(__glewXQueryHyperpipeConfigSGIX) #define glXQueryHyperpipeNetworkSGIX GLXEW_GET_FUN(__glewXQueryHyperpipeNetworkSGIX) #define GLXEW_SGIX_hyperpipe GLXEW_GET_VAR(__GLXEW_SGIX_hyperpipe) #endif /* GLX_SGIX_hyperpipe */ /* ---------------------------- GLX_SGIX_pbuffer --------------------------- */ #ifndef GLX_SGIX_pbuffer #define GLX_SGIX_pbuffer 1 #define GLX_FRONT_LEFT_BUFFER_BIT_SGIX 0x00000001 #define GLX_FRONT_RIGHT_BUFFER_BIT_SGIX 0x00000002 #define GLX_PBUFFER_BIT_SGIX 0x00000004 #define GLX_BACK_LEFT_BUFFER_BIT_SGIX 0x00000004 #define GLX_BACK_RIGHT_BUFFER_BIT_SGIX 0x00000008 #define GLX_AUX_BUFFERS_BIT_SGIX 0x00000010 #define GLX_DEPTH_BUFFER_BIT_SGIX 0x00000020 #define GLX_STENCIL_BUFFER_BIT_SGIX 0x00000040 #define GLX_ACCUM_BUFFER_BIT_SGIX 0x00000080 #define GLX_SAMPLE_BUFFERS_BIT_SGIX 0x00000100 #define GLX_MAX_PBUFFER_WIDTH_SGIX 0x8016 #define GLX_MAX_PBUFFER_HEIGHT_SGIX 0x8017 #define GLX_MAX_PBUFFER_PIXELS_SGIX 0x8018 #define GLX_OPTIMAL_PBUFFER_WIDTH_SGIX 0x8019 #define GLX_OPTIMAL_PBUFFER_HEIGHT_SGIX 0x801A #define GLX_PRESERVED_CONTENTS_SGIX 0x801B #define GLX_LARGEST_PBUFFER_SGIX 0x801C #define GLX_WIDTH_SGIX 0x801D #define GLX_HEIGHT_SGIX 0x801E #define GLX_EVENT_MASK_SGIX 0x801F #define GLX_DAMAGED_SGIX 0x8020 #define GLX_SAVED_SGIX 0x8021 #define GLX_WINDOW_SGIX 0x8022 #define GLX_PBUFFER_SGIX 0x8023 #define GLX_BUFFER_CLOBBER_MASK_SGIX 0x08000000 typedef XID GLXPbufferSGIX; typedef struct { int type; unsigned long serial; Bool send_event; Display *display; GLXDrawable drawable; int event_type; int draw_type; unsigned int mask; int x, y; int width, height; int count; } GLXBufferClobberEventSGIX; typedef GLXPbuffer ( * PFNGLXCREATEGLXPBUFFERSGIXPROC) (Display* dpy, GLXFBConfig config, unsigned int width, unsigned int height, int *attrib_list); typedef void ( * PFNGLXDESTROYGLXPBUFFERSGIXPROC) (Display* dpy, GLXPbuffer pbuf); typedef void ( * PFNGLXGETSELECTEDEVENTSGIXPROC) (Display* dpy, GLXDrawable drawable, unsigned long *mask); typedef void ( * PFNGLXQUERYGLXPBUFFERSGIXPROC) (Display* dpy, GLXPbuffer pbuf, int attribute, unsigned int *value); typedef void ( * PFNGLXSELECTEVENTSGIXPROC) (Display* dpy, GLXDrawable drawable, unsigned long mask); #define glXCreateGLXPbufferSGIX GLXEW_GET_FUN(__glewXCreateGLXPbufferSGIX) #define glXDestroyGLXPbufferSGIX GLXEW_GET_FUN(__glewXDestroyGLXPbufferSGIX) #define glXGetSelectedEventSGIX GLXEW_GET_FUN(__glewXGetSelectedEventSGIX) #define glXQueryGLXPbufferSGIX GLXEW_GET_FUN(__glewXQueryGLXPbufferSGIX) #define glXSelectEventSGIX GLXEW_GET_FUN(__glewXSelectEventSGIX) #define GLXEW_SGIX_pbuffer GLXEW_GET_VAR(__GLXEW_SGIX_pbuffer) #endif /* GLX_SGIX_pbuffer */ /* ------------------------- GLX_SGIX_swap_barrier ------------------------- */ #ifndef GLX_SGIX_swap_barrier #define GLX_SGIX_swap_barrier 1 typedef void ( * PFNGLXBINDSWAPBARRIERSGIXPROC) (Display *dpy, GLXDrawable drawable, int barrier); typedef Bool ( * PFNGLXQUERYMAXSWAPBARRIERSSGIXPROC) (Display *dpy, int screen, int *max); #define glXBindSwapBarrierSGIX GLXEW_GET_FUN(__glewXBindSwapBarrierSGIX) #define glXQueryMaxSwapBarriersSGIX GLXEW_GET_FUN(__glewXQueryMaxSwapBarriersSGIX) #define GLXEW_SGIX_swap_barrier GLXEW_GET_VAR(__GLXEW_SGIX_swap_barrier) #endif /* GLX_SGIX_swap_barrier */ /* -------------------------- GLX_SGIX_swap_group -------------------------- */ #ifndef GLX_SGIX_swap_group #define GLX_SGIX_swap_group 1 typedef void ( * PFNGLXJOINSWAPGROUPSGIXPROC) (Display *dpy, GLXDrawable drawable, GLXDrawable member); #define glXJoinSwapGroupSGIX GLXEW_GET_FUN(__glewXJoinSwapGroupSGIX) #define GLXEW_SGIX_swap_group GLXEW_GET_VAR(__GLXEW_SGIX_swap_group) #endif /* GLX_SGIX_swap_group */ /* ------------------------- GLX_SGIX_video_resize ------------------------- */ #ifndef GLX_SGIX_video_resize #define GLX_SGIX_video_resize 1 #define GLX_SYNC_FRAME_SGIX 0x00000000 #define GLX_SYNC_SWAP_SGIX 0x00000001 typedef int ( * PFNGLXBINDCHANNELTOWINDOWSGIXPROC) (Display* display, int screen, int channel, Window window); typedef int ( * PFNGLXCHANNELRECTSGIXPROC) (Display* display, int screen, int channel, int x, int y, int w, int h); typedef int ( * PFNGLXCHANNELRECTSYNCSGIXPROC) (Display* display, int screen, int channel, GLenum synctype); typedef int ( * PFNGLXQUERYCHANNELDELTASSGIXPROC) (Display* display, int screen, int channel, int *x, int *y, int *w, int *h); typedef int ( * PFNGLXQUERYCHANNELRECTSGIXPROC) (Display* display, int screen, int channel, int *dx, int *dy, int *dw, int *dh); #define glXBindChannelToWindowSGIX GLXEW_GET_FUN(__glewXBindChannelToWindowSGIX) #define glXChannelRectSGIX GLXEW_GET_FUN(__glewXChannelRectSGIX) #define glXChannelRectSyncSGIX GLXEW_GET_FUN(__glewXChannelRectSyncSGIX) #define glXQueryChannelDeltasSGIX GLXEW_GET_FUN(__glewXQueryChannelDeltasSGIX) #define glXQueryChannelRectSGIX GLXEW_GET_FUN(__glewXQueryChannelRectSGIX) #define GLXEW_SGIX_video_resize GLXEW_GET_VAR(__GLXEW_SGIX_video_resize) #endif /* GLX_SGIX_video_resize */ /* ---------------------- GLX_SGIX_visual_select_group --------------------- */ #ifndef GLX_SGIX_visual_select_group #define GLX_SGIX_visual_select_group 1 #define GLX_VISUAL_SELECT_GROUP_SGIX 0x8028 #define GLXEW_SGIX_visual_select_group GLXEW_GET_VAR(__GLXEW_SGIX_visual_select_group) #endif /* GLX_SGIX_visual_select_group */ /* ---------------------------- GLX_SGI_cushion ---------------------------- */ #ifndef GLX_SGI_cushion #define GLX_SGI_cushion 1 typedef void ( * PFNGLXCUSHIONSGIPROC) (Display* dpy, Window window, float cushion); #define glXCushionSGI GLXEW_GET_FUN(__glewXCushionSGI) #define GLXEW_SGI_cushion GLXEW_GET_VAR(__GLXEW_SGI_cushion) #endif /* GLX_SGI_cushion */ /* ----------------------- GLX_SGI_make_current_read ----------------------- */ #ifndef GLX_SGI_make_current_read #define GLX_SGI_make_current_read 1 typedef GLXDrawable ( * PFNGLXGETCURRENTREADDRAWABLESGIPROC) (void); typedef Bool ( * PFNGLXMAKECURRENTREADSGIPROC) (Display* dpy, GLXDrawable draw, GLXDrawable read, GLXContext ctx); #define glXGetCurrentReadDrawableSGI GLXEW_GET_FUN(__glewXGetCurrentReadDrawableSGI) #define glXMakeCurrentReadSGI GLXEW_GET_FUN(__glewXMakeCurrentReadSGI) #define GLXEW_SGI_make_current_read GLXEW_GET_VAR(__GLXEW_SGI_make_current_read) #endif /* GLX_SGI_make_current_read */ /* -------------------------- GLX_SGI_swap_control ------------------------- */ #ifndef GLX_SGI_swap_control #define GLX_SGI_swap_control 1 typedef int ( * PFNGLXSWAPINTERVALSGIPROC) (int interval); #define glXSwapIntervalSGI GLXEW_GET_FUN(__glewXSwapIntervalSGI) #define GLXEW_SGI_swap_control GLXEW_GET_VAR(__GLXEW_SGI_swap_control) #endif /* GLX_SGI_swap_control */ /* --------------------------- GLX_SGI_video_sync -------------------------- */ #ifndef GLX_SGI_video_sync #define GLX_SGI_video_sync 1 typedef int ( * PFNGLXGETVIDEOSYNCSGIPROC) (unsigned int* count); typedef int ( * PFNGLXWAITVIDEOSYNCSGIPROC) (int divisor, int remainder, unsigned int* count); #define glXGetVideoSyncSGI GLXEW_GET_FUN(__glewXGetVideoSyncSGI) #define glXWaitVideoSyncSGI GLXEW_GET_FUN(__glewXWaitVideoSyncSGI) #define GLXEW_SGI_video_sync GLXEW_GET_VAR(__GLXEW_SGI_video_sync) #endif /* GLX_SGI_video_sync */ /* --------------------- GLX_SUN_get_transparent_index --------------------- */ #ifndef GLX_SUN_get_transparent_index #define GLX_SUN_get_transparent_index 1 typedef Status ( * PFNGLXGETTRANSPARENTINDEXSUNPROC) (Display* dpy, Window overlay, Window underlay, unsigned long *pTransparentIndex); #define glXGetTransparentIndexSUN GLXEW_GET_FUN(__glewXGetTransparentIndexSUN) #define GLXEW_SUN_get_transparent_index GLXEW_GET_VAR(__GLXEW_SUN_get_transparent_index) #endif /* GLX_SUN_get_transparent_index */ /* -------------------------- GLX_SUN_video_resize ------------------------- */ #ifndef GLX_SUN_video_resize #define GLX_SUN_video_resize 1 #define GLX_VIDEO_RESIZE_SUN 0x8171 #define GL_VIDEO_RESIZE_COMPENSATION_SUN 0x85CD typedef int ( * PFNGLXGETVIDEORESIZESUNPROC) (Display* display, GLXDrawable window, float* factor); typedef int ( * PFNGLXVIDEORESIZESUNPROC) (Display* display, GLXDrawable window, float factor); #define glXGetVideoResizeSUN GLXEW_GET_FUN(__glewXGetVideoResizeSUN) #define glXVideoResizeSUN GLXEW_GET_FUN(__glewXVideoResizeSUN) #define GLXEW_SUN_video_resize GLXEW_GET_VAR(__GLXEW_SUN_video_resize) #endif /* GLX_SUN_video_resize */ /* ------------------------------------------------------------------------- */ #ifdef GLEW_MX #define GLXEW_FUN_EXPORT #define GLXEW_VAR_EXPORT #else #define GLXEW_FUN_EXPORT GLEW_FUN_EXPORT #define GLXEW_VAR_EXPORT GLEW_VAR_EXPORT #endif /* GLEW_MX */ GLXEW_FUN_EXPORT PFNGLXGETCURRENTDISPLAYPROC __glewXGetCurrentDisplay; GLXEW_FUN_EXPORT PFNGLXCHOOSEFBCONFIGPROC __glewXChooseFBConfig; GLXEW_FUN_EXPORT PFNGLXCREATENEWCONTEXTPROC __glewXCreateNewContext; GLXEW_FUN_EXPORT PFNGLXCREATEPBUFFERPROC __glewXCreatePbuffer; GLXEW_FUN_EXPORT PFNGLXCREATEPIXMAPPROC __glewXCreatePixmap; GLXEW_FUN_EXPORT PFNGLXCREATEWINDOWPROC __glewXCreateWindow; GLXEW_FUN_EXPORT PFNGLXDESTROYPBUFFERPROC __glewXDestroyPbuffer; GLXEW_FUN_EXPORT PFNGLXDESTROYPIXMAPPROC __glewXDestroyPixmap; GLXEW_FUN_EXPORT PFNGLXDESTROYWINDOWPROC __glewXDestroyWindow; GLXEW_FUN_EXPORT PFNGLXGETCURRENTREADDRAWABLEPROC __glewXGetCurrentReadDrawable; GLXEW_FUN_EXPORT PFNGLXGETFBCONFIGATTRIBPROC __glewXGetFBConfigAttrib; GLXEW_FUN_EXPORT PFNGLXGETFBCONFIGSPROC __glewXGetFBConfigs; GLXEW_FUN_EXPORT PFNGLXGETSELECTEDEVENTPROC __glewXGetSelectedEvent; GLXEW_FUN_EXPORT PFNGLXGETVISUALFROMFBCONFIGPROC __glewXGetVisualFromFBConfig; GLXEW_FUN_EXPORT PFNGLXMAKECONTEXTCURRENTPROC __glewXMakeContextCurrent; GLXEW_FUN_EXPORT PFNGLXQUERYCONTEXTPROC __glewXQueryContext; GLXEW_FUN_EXPORT PFNGLXQUERYDRAWABLEPROC __glewXQueryDrawable; GLXEW_FUN_EXPORT PFNGLXSELECTEVENTPROC __glewXSelectEvent; GLXEW_FUN_EXPORT PFNGLXCREATECONTEXTATTRIBSARBPROC __glewXCreateContextAttribsARB; GLXEW_FUN_EXPORT PFNGLXBINDTEXIMAGEATIPROC __glewXBindTexImageATI; GLXEW_FUN_EXPORT PFNGLXDRAWABLEATTRIBATIPROC __glewXDrawableAttribATI; GLXEW_FUN_EXPORT PFNGLXRELEASETEXIMAGEATIPROC __glewXReleaseTexImageATI; GLXEW_FUN_EXPORT PFNGLXFREECONTEXTEXTPROC __glewXFreeContextEXT; GLXEW_FUN_EXPORT PFNGLXGETCONTEXTIDEXTPROC __glewXGetContextIDEXT; GLXEW_FUN_EXPORT PFNGLXIMPORTCONTEXTEXTPROC __glewXImportContextEXT; GLXEW_FUN_EXPORT PFNGLXQUERYCONTEXTINFOEXTPROC __glewXQueryContextInfoEXT; GLXEW_FUN_EXPORT PFNGLXSWAPINTERVALEXTPROC __glewXSwapIntervalEXT; GLXEW_FUN_EXPORT PFNGLXBINDTEXIMAGEEXTPROC __glewXBindTexImageEXT; GLXEW_FUN_EXPORT PFNGLXRELEASETEXIMAGEEXTPROC __glewXReleaseTexImageEXT; GLXEW_FUN_EXPORT PFNGLXGETAGPOFFSETMESAPROC __glewXGetAGPOffsetMESA; GLXEW_FUN_EXPORT PFNGLXCOPYSUBBUFFERMESAPROC __glewXCopySubBufferMESA; GLXEW_FUN_EXPORT PFNGLXCREATEGLXPIXMAPMESAPROC __glewXCreateGLXPixmapMESA; GLXEW_FUN_EXPORT PFNGLXRELEASEBUFFERSMESAPROC __glewXReleaseBuffersMESA; GLXEW_FUN_EXPORT PFNGLXSET3DFXMODEMESAPROC __glewXSet3DfxModeMESA; GLXEW_FUN_EXPORT PFNGLXGETSWAPINTERVALMESAPROC __glewXGetSwapIntervalMESA; GLXEW_FUN_EXPORT PFNGLXSWAPINTERVALMESAPROC __glewXSwapIntervalMESA; GLXEW_FUN_EXPORT PFNGLXCOPYIMAGESUBDATANVPROC __glewXCopyImageSubDataNV; GLXEW_FUN_EXPORT PFNGLXBINDVIDEODEVICENVPROC __glewXBindVideoDeviceNV; GLXEW_FUN_EXPORT PFNGLXENUMERATEVIDEODEVICESNVPROC __glewXEnumerateVideoDevicesNV; GLXEW_FUN_EXPORT PFNGLXBINDSWAPBARRIERNVPROC __glewXBindSwapBarrierNV; GLXEW_FUN_EXPORT PFNGLXJOINSWAPGROUPNVPROC __glewXJoinSwapGroupNV; GLXEW_FUN_EXPORT PFNGLXQUERYFRAMECOUNTNVPROC __glewXQueryFrameCountNV; GLXEW_FUN_EXPORT PFNGLXQUERYMAXSWAPGROUPSNVPROC __glewXQueryMaxSwapGroupsNV; GLXEW_FUN_EXPORT PFNGLXQUERYSWAPGROUPNVPROC __glewXQuerySwapGroupNV; GLXEW_FUN_EXPORT PFNGLXRESETFRAMECOUNTNVPROC __glewXResetFrameCountNV; GLXEW_FUN_EXPORT PFNGLXALLOCATEMEMORYNVPROC __glewXAllocateMemoryNV; GLXEW_FUN_EXPORT PFNGLXFREEMEMORYNVPROC __glewXFreeMemoryNV; GLXEW_FUN_EXPORT PFNGLXBINDVIDEOCAPTUREDEVICENVPROC __glewXBindVideoCaptureDeviceNV; GLXEW_FUN_EXPORT PFNGLXENUMERATEVIDEOCAPTUREDEVICESNVPROC __glewXEnumerateVideoCaptureDevicesNV; GLXEW_FUN_EXPORT PFNGLXLOCKVIDEOCAPTUREDEVICENVPROC __glewXLockVideoCaptureDeviceNV; GLXEW_FUN_EXPORT PFNGLXQUERYVIDEOCAPTUREDEVICENVPROC __glewXQueryVideoCaptureDeviceNV; GLXEW_FUN_EXPORT PFNGLXRELEASEVIDEOCAPTUREDEVICENVPROC __glewXReleaseVideoCaptureDeviceNV; GLXEW_FUN_EXPORT PFNGLXBINDVIDEOIMAGENVPROC __glewXBindVideoImageNV; GLXEW_FUN_EXPORT PFNGLXGETVIDEODEVICENVPROC __glewXGetVideoDeviceNV; GLXEW_FUN_EXPORT PFNGLXGETVIDEOINFONVPROC __glewXGetVideoInfoNV; GLXEW_FUN_EXPORT PFNGLXRELEASEVIDEODEVICENVPROC __glewXReleaseVideoDeviceNV; GLXEW_FUN_EXPORT PFNGLXRELEASEVIDEOIMAGENVPROC __glewXReleaseVideoImageNV; GLXEW_FUN_EXPORT PFNGLXSENDPBUFFERTOVIDEONVPROC __glewXSendPbufferToVideoNV; GLXEW_FUN_EXPORT PFNGLXGETMSCRATEOMLPROC __glewXGetMscRateOML; GLXEW_FUN_EXPORT PFNGLXGETSYNCVALUESOMLPROC __glewXGetSyncValuesOML; GLXEW_FUN_EXPORT PFNGLXSWAPBUFFERSMSCOMLPROC __glewXSwapBuffersMscOML; GLXEW_FUN_EXPORT PFNGLXWAITFORMSCOMLPROC __glewXWaitForMscOML; GLXEW_FUN_EXPORT PFNGLXWAITFORSBCOMLPROC __glewXWaitForSbcOML; GLXEW_FUN_EXPORT PFNGLXCHOOSEFBCONFIGSGIXPROC __glewXChooseFBConfigSGIX; GLXEW_FUN_EXPORT PFNGLXCREATECONTEXTWITHCONFIGSGIXPROC __glewXCreateContextWithConfigSGIX; GLXEW_FUN_EXPORT PFNGLXCREATEGLXPIXMAPWITHCONFIGSGIXPROC __glewXCreateGLXPixmapWithConfigSGIX; GLXEW_FUN_EXPORT PFNGLXGETFBCONFIGATTRIBSGIXPROC __glewXGetFBConfigAttribSGIX; GLXEW_FUN_EXPORT PFNGLXGETFBCONFIGFROMVISUALSGIXPROC __glewXGetFBConfigFromVisualSGIX; GLXEW_FUN_EXPORT PFNGLXGETVISUALFROMFBCONFIGSGIXPROC __glewXGetVisualFromFBConfigSGIX; GLXEW_FUN_EXPORT PFNGLXBINDHYPERPIPESGIXPROC __glewXBindHyperpipeSGIX; GLXEW_FUN_EXPORT PFNGLXDESTROYHYPERPIPECONFIGSGIXPROC __glewXDestroyHyperpipeConfigSGIX; GLXEW_FUN_EXPORT PFNGLXHYPERPIPEATTRIBSGIXPROC __glewXHyperpipeAttribSGIX; GLXEW_FUN_EXPORT PFNGLXHYPERPIPECONFIGSGIXPROC __glewXHyperpipeConfigSGIX; GLXEW_FUN_EXPORT PFNGLXQUERYHYPERPIPEATTRIBSGIXPROC __glewXQueryHyperpipeAttribSGIX; GLXEW_FUN_EXPORT PFNGLXQUERYHYPERPIPEBESTATTRIBSGIXPROC __glewXQueryHyperpipeBestAttribSGIX; GLXEW_FUN_EXPORT PFNGLXQUERYHYPERPIPECONFIGSGIXPROC __glewXQueryHyperpipeConfigSGIX; GLXEW_FUN_EXPORT PFNGLXQUERYHYPERPIPENETWORKSGIXPROC __glewXQueryHyperpipeNetworkSGIX; GLXEW_FUN_EXPORT PFNGLXCREATEGLXPBUFFERSGIXPROC __glewXCreateGLXPbufferSGIX; GLXEW_FUN_EXPORT PFNGLXDESTROYGLXPBUFFERSGIXPROC __glewXDestroyGLXPbufferSGIX; GLXEW_FUN_EXPORT PFNGLXGETSELECTEDEVENTSGIXPROC __glewXGetSelectedEventSGIX; GLXEW_FUN_EXPORT PFNGLXQUERYGLXPBUFFERSGIXPROC __glewXQueryGLXPbufferSGIX; GLXEW_FUN_EXPORT PFNGLXSELECTEVENTSGIXPROC __glewXSelectEventSGIX; GLXEW_FUN_EXPORT PFNGLXBINDSWAPBARRIERSGIXPROC __glewXBindSwapBarrierSGIX; GLXEW_FUN_EXPORT PFNGLXQUERYMAXSWAPBARRIERSSGIXPROC __glewXQueryMaxSwapBarriersSGIX; GLXEW_FUN_EXPORT PFNGLXJOINSWAPGROUPSGIXPROC __glewXJoinSwapGroupSGIX; GLXEW_FUN_EXPORT PFNGLXBINDCHANNELTOWINDOWSGIXPROC __glewXBindChannelToWindowSGIX; GLXEW_FUN_EXPORT PFNGLXCHANNELRECTSGIXPROC __glewXChannelRectSGIX; GLXEW_FUN_EXPORT PFNGLXCHANNELRECTSYNCSGIXPROC __glewXChannelRectSyncSGIX; GLXEW_FUN_EXPORT PFNGLXQUERYCHANNELDELTASSGIXPROC __glewXQueryChannelDeltasSGIX; GLXEW_FUN_EXPORT PFNGLXQUERYCHANNELRECTSGIXPROC __glewXQueryChannelRectSGIX; GLXEW_FUN_EXPORT PFNGLXCUSHIONSGIPROC __glewXCushionSGI; GLXEW_FUN_EXPORT PFNGLXGETCURRENTREADDRAWABLESGIPROC __glewXGetCurrentReadDrawableSGI; GLXEW_FUN_EXPORT PFNGLXMAKECURRENTREADSGIPROC __glewXMakeCurrentReadSGI; GLXEW_FUN_EXPORT PFNGLXSWAPINTERVALSGIPROC __glewXSwapIntervalSGI; GLXEW_FUN_EXPORT PFNGLXGETVIDEOSYNCSGIPROC __glewXGetVideoSyncSGI; GLXEW_FUN_EXPORT PFNGLXWAITVIDEOSYNCSGIPROC __glewXWaitVideoSyncSGI; GLXEW_FUN_EXPORT PFNGLXGETTRANSPARENTINDEXSUNPROC __glewXGetTransparentIndexSUN; GLXEW_FUN_EXPORT PFNGLXGETVIDEORESIZESUNPROC __glewXGetVideoResizeSUN; GLXEW_FUN_EXPORT PFNGLXVIDEORESIZESUNPROC __glewXVideoResizeSUN; #if defined(GLEW_MX) struct GLXEWContextStruct { #endif /* GLEW_MX */ GLXEW_VAR_EXPORT GLboolean __GLXEW_VERSION_1_0; GLXEW_VAR_EXPORT GLboolean __GLXEW_VERSION_1_1; GLXEW_VAR_EXPORT GLboolean __GLXEW_VERSION_1_2; GLXEW_VAR_EXPORT GLboolean __GLXEW_VERSION_1_3; GLXEW_VAR_EXPORT GLboolean __GLXEW_VERSION_1_4; GLXEW_VAR_EXPORT GLboolean __GLXEW_3DFX_multisample; GLXEW_VAR_EXPORT GLboolean __GLXEW_AMD_gpu_association; GLXEW_VAR_EXPORT GLboolean __GLXEW_ARB_create_context; GLXEW_VAR_EXPORT GLboolean __GLXEW_ARB_create_context_profile; GLXEW_VAR_EXPORT GLboolean __GLXEW_ARB_create_context_robustness; GLXEW_VAR_EXPORT GLboolean __GLXEW_ARB_fbconfig_float; GLXEW_VAR_EXPORT GLboolean __GLXEW_ARB_framebuffer_sRGB; GLXEW_VAR_EXPORT GLboolean __GLXEW_ARB_get_proc_address; GLXEW_VAR_EXPORT GLboolean __GLXEW_ARB_multisample; GLXEW_VAR_EXPORT GLboolean __GLXEW_ARB_robustness_application_isolation; GLXEW_VAR_EXPORT GLboolean __GLXEW_ARB_robustness_share_group_isolation; GLXEW_VAR_EXPORT GLboolean __GLXEW_ARB_vertex_buffer_object; GLXEW_VAR_EXPORT GLboolean __GLXEW_ATI_pixel_format_float; GLXEW_VAR_EXPORT GLboolean __GLXEW_ATI_render_texture; GLXEW_VAR_EXPORT GLboolean __GLXEW_EXT_create_context_es2_profile; GLXEW_VAR_EXPORT GLboolean __GLXEW_EXT_create_context_es_profile; GLXEW_VAR_EXPORT GLboolean __GLXEW_EXT_fbconfig_packed_float; GLXEW_VAR_EXPORT GLboolean __GLXEW_EXT_framebuffer_sRGB; GLXEW_VAR_EXPORT GLboolean __GLXEW_EXT_import_context; GLXEW_VAR_EXPORT GLboolean __GLXEW_EXT_scene_marker; GLXEW_VAR_EXPORT GLboolean __GLXEW_EXT_swap_control; GLXEW_VAR_EXPORT GLboolean __GLXEW_EXT_swap_control_tear; GLXEW_VAR_EXPORT GLboolean __GLXEW_EXT_texture_from_pixmap; GLXEW_VAR_EXPORT GLboolean __GLXEW_EXT_visual_info; GLXEW_VAR_EXPORT GLboolean __GLXEW_EXT_visual_rating; GLXEW_VAR_EXPORT GLboolean __GLXEW_INTEL_swap_event; GLXEW_VAR_EXPORT GLboolean __GLXEW_MESA_agp_offset; GLXEW_VAR_EXPORT GLboolean __GLXEW_MESA_copy_sub_buffer; GLXEW_VAR_EXPORT GLboolean __GLXEW_MESA_pixmap_colormap; GLXEW_VAR_EXPORT GLboolean __GLXEW_MESA_release_buffers; GLXEW_VAR_EXPORT GLboolean __GLXEW_MESA_set_3dfx_mode; GLXEW_VAR_EXPORT GLboolean __GLXEW_MESA_swap_control; GLXEW_VAR_EXPORT GLboolean __GLXEW_NV_copy_image; GLXEW_VAR_EXPORT GLboolean __GLXEW_NV_float_buffer; GLXEW_VAR_EXPORT GLboolean __GLXEW_NV_multisample_coverage; GLXEW_VAR_EXPORT GLboolean __GLXEW_NV_present_video; GLXEW_VAR_EXPORT GLboolean __GLXEW_NV_swap_group; GLXEW_VAR_EXPORT GLboolean __GLXEW_NV_vertex_array_range; GLXEW_VAR_EXPORT GLboolean __GLXEW_NV_video_capture; GLXEW_VAR_EXPORT GLboolean __GLXEW_NV_video_out; GLXEW_VAR_EXPORT GLboolean __GLXEW_OML_swap_method; GLXEW_VAR_EXPORT GLboolean __GLXEW_OML_sync_control; GLXEW_VAR_EXPORT GLboolean __GLXEW_SGIS_blended_overlay; GLXEW_VAR_EXPORT GLboolean __GLXEW_SGIS_color_range; GLXEW_VAR_EXPORT GLboolean __GLXEW_SGIS_multisample; GLXEW_VAR_EXPORT GLboolean __GLXEW_SGIS_shared_multisample; GLXEW_VAR_EXPORT GLboolean __GLXEW_SGIX_fbconfig; GLXEW_VAR_EXPORT GLboolean __GLXEW_SGIX_hyperpipe; GLXEW_VAR_EXPORT GLboolean __GLXEW_SGIX_pbuffer; GLXEW_VAR_EXPORT GLboolean __GLXEW_SGIX_swap_barrier; GLXEW_VAR_EXPORT GLboolean __GLXEW_SGIX_swap_group; GLXEW_VAR_EXPORT GLboolean __GLXEW_SGIX_video_resize; GLXEW_VAR_EXPORT GLboolean __GLXEW_SGIX_visual_select_group; GLXEW_VAR_EXPORT GLboolean __GLXEW_SGI_cushion; GLXEW_VAR_EXPORT GLboolean __GLXEW_SGI_make_current_read; GLXEW_VAR_EXPORT GLboolean __GLXEW_SGI_swap_control; GLXEW_VAR_EXPORT GLboolean __GLXEW_SGI_video_sync; GLXEW_VAR_EXPORT GLboolean __GLXEW_SUN_get_transparent_index; GLXEW_VAR_EXPORT GLboolean __GLXEW_SUN_video_resize; #ifdef GLEW_MX }; /* GLXEWContextStruct */ #endif /* GLEW_MX */ /* ------------------------------------------------------------------------ */ #ifdef GLEW_MX typedef struct GLXEWContextStruct GLXEWContext; GLEWAPI GLenum GLEWAPIENTRY glxewContextInit (GLXEWContext *ctx); GLEWAPI GLboolean GLEWAPIENTRY glxewContextIsSupported (const GLXEWContext *ctx, const char *name); #define glxewInit() glxewContextInit(glxewGetContext()) #define glxewIsSupported(x) glxewContextIsSupported(glxewGetContext(), x) #define GLXEW_GET_VAR(x) (*(const GLboolean*)&(glxewGetContext()->x)) #define GLXEW_GET_FUN(x) x #else /* GLEW_MX */ #define GLXEW_GET_VAR(x) (*(const GLboolean*)&x) #define GLXEW_GET_FUN(x) x GLEWAPI GLboolean GLEWAPIENTRY glxewIsSupported (const char *name); #endif /* GLEW_MX */ GLEWAPI GLboolean GLEWAPIENTRY glxewGetExtension (const char *name); #ifdef __cplusplus } #endif #endif /* __glxew_h__ */ plee-the-bear-20251226/bear-engine/core/src/visual/glew/wglew.h000066400000000000000000001674221512343254000240360ustar00rootroot00000000000000/* ** The OpenGL Extension Wrangler Library ** Copyright (C) 2002-2008, Milan Ikits ** Copyright (C) 2002-2008, Marcelo E. Magallon ** Copyright (C) 2002, Lev Povalahev ** All rights reserved. ** ** Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are met: ** ** * Redistributions of source code must retain the above copyright notice, ** this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright notice, ** this list of conditions and the following disclaimer in the documentation ** and/or other materials provided with the distribution. ** * The name of the author may be used to endorse or promote products ** derived from this software without specific prior written permission. ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" ** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ** ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE ** LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR ** CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF ** SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS ** INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN ** CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ** ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF ** THE POSSIBILITY OF SUCH DAMAGE. */ /* ** Copyright (c) 2007 The Khronos Group Inc. ** ** Permission is hereby granted, free of charge, to any person obtaining a ** copy of this software and/or associated documentation files (the ** "Materials"), to deal in the Materials without restriction, including ** without limitation the rights to use, copy, modify, merge, publish, ** distribute, sublicense, and/or sell copies of the Materials, and to ** permit persons to whom the Materials are furnished to do so, subject to ** the following conditions: ** ** The above copyright notice and this permission notice shall be included ** in all copies or substantial portions of the Materials. ** ** THE MATERIALS ARE 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 AND NONINFRINGEMENT. ** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY ** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, ** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE ** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS. */ #ifndef __wglew_h__ #define __wglew_h__ #define __WGLEW_H__ #ifdef __wglext_h_ #error wglext.h included before wglew.h #endif #define __wglext_h_ #if !defined(WINAPI) # ifndef WIN32_LEAN_AND_MEAN # define WIN32_LEAN_AND_MEAN 1 # endif #include # undef WIN32_LEAN_AND_MEAN #endif /* * GLEW_STATIC needs to be set when using the static version. * GLEW_BUILD is set when building the DLL version. */ #ifdef GLEW_STATIC # ifdef _WIN32 # define GLEWAPI extern # else # define GLEWAPI extern # endif #else # ifdef GLEW_BUILD # define GLEWAPI extern __declspec(dllexport) # else # define GLEWAPI extern __declspec(dllimport) # endif #endif #ifdef __cplusplus extern "C" { #endif /* -------------------------- WGL_3DFX_multisample ------------------------- */ #ifndef WGL_3DFX_multisample #define WGL_3DFX_multisample 1 #define WGL_SAMPLE_BUFFERS_3DFX 0x2060 #define WGL_SAMPLES_3DFX 0x2061 #define WGLEW_3DFX_multisample WGLEW_GET_VAR(__WGLEW_3DFX_multisample) #endif /* WGL_3DFX_multisample */ /* ------------------------- WGL_3DL_stereo_control ------------------------ */ #ifndef WGL_3DL_stereo_control #define WGL_3DL_stereo_control 1 #define WGL_STEREO_EMITTER_ENABLE_3DL 0x2055 #define WGL_STEREO_EMITTER_DISABLE_3DL 0x2056 #define WGL_STEREO_POLARITY_NORMAL_3DL 0x2057 #define WGL_STEREO_POLARITY_INVERT_3DL 0x2058 typedef BOOL (WINAPI * PFNWGLSETSTEREOEMITTERSTATE3DLPROC) (HDC hDC, UINT uState); #define wglSetStereoEmitterState3DL WGLEW_GET_FUN(__wglewSetStereoEmitterState3DL) #define WGLEW_3DL_stereo_control WGLEW_GET_VAR(__WGLEW_3DL_stereo_control) #endif /* WGL_3DL_stereo_control */ /* ------------------------ WGL_AMD_gpu_association ------------------------ */ #ifndef WGL_AMD_gpu_association #define WGL_AMD_gpu_association 1 #define WGL_GPU_VENDOR_AMD 0x1F00 #define WGL_GPU_RENDERER_STRING_AMD 0x1F01 #define WGL_GPU_OPENGL_VERSION_STRING_AMD 0x1F02 #define WGL_GPU_FASTEST_TARGET_GPUS_AMD 0x21A2 #define WGL_GPU_RAM_AMD 0x21A3 #define WGL_GPU_CLOCK_AMD 0x21A4 #define WGL_GPU_NUM_PIPES_AMD 0x21A5 #define WGL_GPU_NUM_SIMD_AMD 0x21A6 #define WGL_GPU_NUM_RB_AMD 0x21A7 #define WGL_GPU_NUM_SPI_AMD 0x21A8 typedef VOID (WINAPI * PFNWGLBLITCONTEXTFRAMEBUFFERAMDPROC) (HGLRC dstCtx, GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); typedef HGLRC (WINAPI * PFNWGLCREATEASSOCIATEDCONTEXTAMDPROC) (UINT id); typedef HGLRC (WINAPI * PFNWGLCREATEASSOCIATEDCONTEXTATTRIBSAMDPROC) (UINT id, HGLRC hShareContext, const int* attribList); typedef BOOL (WINAPI * PFNWGLDELETEASSOCIATEDCONTEXTAMDPROC) (HGLRC hglrc); typedef UINT (WINAPI * PFNWGLGETCONTEXTGPUIDAMDPROC) (HGLRC hglrc); typedef HGLRC (WINAPI * PFNWGLGETCURRENTASSOCIATEDCONTEXTAMDPROC) (void); typedef UINT (WINAPI * PFNWGLGETGPUIDSAMDPROC) (UINT maxCount, UINT* ids); typedef INT (WINAPI * PFNWGLGETGPUINFOAMDPROC) (UINT id, INT property, GLenum dataType, UINT size, void* data); typedef BOOL (WINAPI * PFNWGLMAKEASSOCIATEDCONTEXTCURRENTAMDPROC) (HGLRC hglrc); #define wglBlitContextFramebufferAMD WGLEW_GET_FUN(__wglewBlitContextFramebufferAMD) #define wglCreateAssociatedContextAMD WGLEW_GET_FUN(__wglewCreateAssociatedContextAMD) #define wglCreateAssociatedContextAttribsAMD WGLEW_GET_FUN(__wglewCreateAssociatedContextAttribsAMD) #define wglDeleteAssociatedContextAMD WGLEW_GET_FUN(__wglewDeleteAssociatedContextAMD) #define wglGetContextGPUIDAMD WGLEW_GET_FUN(__wglewGetContextGPUIDAMD) #define wglGetCurrentAssociatedContextAMD WGLEW_GET_FUN(__wglewGetCurrentAssociatedContextAMD) #define wglGetGPUIDsAMD WGLEW_GET_FUN(__wglewGetGPUIDsAMD) #define wglGetGPUInfoAMD WGLEW_GET_FUN(__wglewGetGPUInfoAMD) #define wglMakeAssociatedContextCurrentAMD WGLEW_GET_FUN(__wglewMakeAssociatedContextCurrentAMD) #define WGLEW_AMD_gpu_association WGLEW_GET_VAR(__WGLEW_AMD_gpu_association) #endif /* WGL_AMD_gpu_association */ /* ------------------------- WGL_ARB_buffer_region ------------------------- */ #ifndef WGL_ARB_buffer_region #define WGL_ARB_buffer_region 1 #define WGL_FRONT_COLOR_BUFFER_BIT_ARB 0x00000001 #define WGL_BACK_COLOR_BUFFER_BIT_ARB 0x00000002 #define WGL_DEPTH_BUFFER_BIT_ARB 0x00000004 #define WGL_STENCIL_BUFFER_BIT_ARB 0x00000008 typedef HANDLE (WINAPI * PFNWGLCREATEBUFFERREGIONARBPROC) (HDC hDC, int iLayerPlane, UINT uType); typedef VOID (WINAPI * PFNWGLDELETEBUFFERREGIONARBPROC) (HANDLE hRegion); typedef BOOL (WINAPI * PFNWGLRESTOREBUFFERREGIONARBPROC) (HANDLE hRegion, int x, int y, int width, int height, int xSrc, int ySrc); typedef BOOL (WINAPI * PFNWGLSAVEBUFFERREGIONARBPROC) (HANDLE hRegion, int x, int y, int width, int height); #define wglCreateBufferRegionARB WGLEW_GET_FUN(__wglewCreateBufferRegionARB) #define wglDeleteBufferRegionARB WGLEW_GET_FUN(__wglewDeleteBufferRegionARB) #define wglRestoreBufferRegionARB WGLEW_GET_FUN(__wglewRestoreBufferRegionARB) #define wglSaveBufferRegionARB WGLEW_GET_FUN(__wglewSaveBufferRegionARB) #define WGLEW_ARB_buffer_region WGLEW_GET_VAR(__WGLEW_ARB_buffer_region) #endif /* WGL_ARB_buffer_region */ /* ------------------------- WGL_ARB_create_context ------------------------ */ #ifndef WGL_ARB_create_context #define WGL_ARB_create_context 1 #define WGL_CONTEXT_DEBUG_BIT_ARB 0x0001 #define WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB 0x0002 #define WGL_CONTEXT_MAJOR_VERSION_ARB 0x2091 #define WGL_CONTEXT_MINOR_VERSION_ARB 0x2092 #define WGL_CONTEXT_LAYER_PLANE_ARB 0x2093 #define WGL_CONTEXT_FLAGS_ARB 0x2094 #define ERROR_INVALID_VERSION_ARB 0x2095 #define ERROR_INVALID_PROFILE_ARB 0x2096 typedef HGLRC (WINAPI * PFNWGLCREATECONTEXTATTRIBSARBPROC) (HDC hDC, HGLRC hShareContext, const int* attribList); #define wglCreateContextAttribsARB WGLEW_GET_FUN(__wglewCreateContextAttribsARB) #define WGLEW_ARB_create_context WGLEW_GET_VAR(__WGLEW_ARB_create_context) #endif /* WGL_ARB_create_context */ /* --------------------- WGL_ARB_create_context_profile -------------------- */ #ifndef WGL_ARB_create_context_profile #define WGL_ARB_create_context_profile 1 #define WGL_CONTEXT_CORE_PROFILE_BIT_ARB 0x00000001 #define WGL_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB 0x00000002 #define WGL_CONTEXT_PROFILE_MASK_ARB 0x9126 #define WGLEW_ARB_create_context_profile WGLEW_GET_VAR(__WGLEW_ARB_create_context_profile) #endif /* WGL_ARB_create_context_profile */ /* ------------------- WGL_ARB_create_context_robustness ------------------- */ #ifndef WGL_ARB_create_context_robustness #define WGL_ARB_create_context_robustness 1 #define WGL_CONTEXT_ROBUST_ACCESS_BIT_ARB 0x00000004 #define WGL_LOSE_CONTEXT_ON_RESET_ARB 0x8252 #define WGL_CONTEXT_RESET_NOTIFICATION_STRATEGY_ARB 0x8256 #define WGL_NO_RESET_NOTIFICATION_ARB 0x8261 #define WGLEW_ARB_create_context_robustness WGLEW_GET_VAR(__WGLEW_ARB_create_context_robustness) #endif /* WGL_ARB_create_context_robustness */ /* ----------------------- WGL_ARB_extensions_string ----------------------- */ #ifndef WGL_ARB_extensions_string #define WGL_ARB_extensions_string 1 typedef const char* (WINAPI * PFNWGLGETEXTENSIONSSTRINGARBPROC) (HDC hdc); #define wglGetExtensionsStringARB WGLEW_GET_FUN(__wglewGetExtensionsStringARB) #define WGLEW_ARB_extensions_string WGLEW_GET_VAR(__WGLEW_ARB_extensions_string) #endif /* WGL_ARB_extensions_string */ /* ------------------------ WGL_ARB_framebuffer_sRGB ----------------------- */ #ifndef WGL_ARB_framebuffer_sRGB #define WGL_ARB_framebuffer_sRGB 1 #define WGL_FRAMEBUFFER_SRGB_CAPABLE_ARB 0x20A9 #define WGLEW_ARB_framebuffer_sRGB WGLEW_GET_VAR(__WGLEW_ARB_framebuffer_sRGB) #endif /* WGL_ARB_framebuffer_sRGB */ /* ----------------------- WGL_ARB_make_current_read ----------------------- */ #ifndef WGL_ARB_make_current_read #define WGL_ARB_make_current_read 1 #define ERROR_INVALID_PIXEL_TYPE_ARB 0x2043 #define ERROR_INCOMPATIBLE_DEVICE_CONTEXTS_ARB 0x2054 typedef HDC (WINAPI * PFNWGLGETCURRENTREADDCARBPROC) (VOID); typedef BOOL (WINAPI * PFNWGLMAKECONTEXTCURRENTARBPROC) (HDC hDrawDC, HDC hReadDC, HGLRC hglrc); #define wglGetCurrentReadDCARB WGLEW_GET_FUN(__wglewGetCurrentReadDCARB) #define wglMakeContextCurrentARB WGLEW_GET_FUN(__wglewMakeContextCurrentARB) #define WGLEW_ARB_make_current_read WGLEW_GET_VAR(__WGLEW_ARB_make_current_read) #endif /* WGL_ARB_make_current_read */ /* -------------------------- WGL_ARB_multisample -------------------------- */ #ifndef WGL_ARB_multisample #define WGL_ARB_multisample 1 #define WGL_SAMPLE_BUFFERS_ARB 0x2041 #define WGL_SAMPLES_ARB 0x2042 #define WGLEW_ARB_multisample WGLEW_GET_VAR(__WGLEW_ARB_multisample) #endif /* WGL_ARB_multisample */ /* ---------------------------- WGL_ARB_pbuffer ---------------------------- */ #ifndef WGL_ARB_pbuffer #define WGL_ARB_pbuffer 1 #define WGL_DRAW_TO_PBUFFER_ARB 0x202D #define WGL_MAX_PBUFFER_PIXELS_ARB 0x202E #define WGL_MAX_PBUFFER_WIDTH_ARB 0x202F #define WGL_MAX_PBUFFER_HEIGHT_ARB 0x2030 #define WGL_PBUFFER_LARGEST_ARB 0x2033 #define WGL_PBUFFER_WIDTH_ARB 0x2034 #define WGL_PBUFFER_HEIGHT_ARB 0x2035 #define WGL_PBUFFER_LOST_ARB 0x2036 DECLARE_HANDLE(HPBUFFERARB); typedef HPBUFFERARB (WINAPI * PFNWGLCREATEPBUFFERARBPROC) (HDC hDC, int iPixelFormat, int iWidth, int iHeight, const int* piAttribList); typedef BOOL (WINAPI * PFNWGLDESTROYPBUFFERARBPROC) (HPBUFFERARB hPbuffer); typedef HDC (WINAPI * PFNWGLGETPBUFFERDCARBPROC) (HPBUFFERARB hPbuffer); typedef BOOL (WINAPI * PFNWGLQUERYPBUFFERARBPROC) (HPBUFFERARB hPbuffer, int iAttribute, int* piValue); typedef int (WINAPI * PFNWGLRELEASEPBUFFERDCARBPROC) (HPBUFFERARB hPbuffer, HDC hDC); #define wglCreatePbufferARB WGLEW_GET_FUN(__wglewCreatePbufferARB) #define wglDestroyPbufferARB WGLEW_GET_FUN(__wglewDestroyPbufferARB) #define wglGetPbufferDCARB WGLEW_GET_FUN(__wglewGetPbufferDCARB) #define wglQueryPbufferARB WGLEW_GET_FUN(__wglewQueryPbufferARB) #define wglReleasePbufferDCARB WGLEW_GET_FUN(__wglewReleasePbufferDCARB) #define WGLEW_ARB_pbuffer WGLEW_GET_VAR(__WGLEW_ARB_pbuffer) #endif /* WGL_ARB_pbuffer */ /* -------------------------- WGL_ARB_pixel_format ------------------------- */ #ifndef WGL_ARB_pixel_format #define WGL_ARB_pixel_format 1 #define WGL_NUMBER_PIXEL_FORMATS_ARB 0x2000 #define WGL_DRAW_TO_WINDOW_ARB 0x2001 #define WGL_DRAW_TO_BITMAP_ARB 0x2002 #define WGL_ACCELERATION_ARB 0x2003 #define WGL_NEED_PALETTE_ARB 0x2004 #define WGL_NEED_SYSTEM_PALETTE_ARB 0x2005 #define WGL_SWAP_LAYER_BUFFERS_ARB 0x2006 #define WGL_SWAP_METHOD_ARB 0x2007 #define WGL_NUMBER_OVERLAYS_ARB 0x2008 #define WGL_NUMBER_UNDERLAYS_ARB 0x2009 #define WGL_TRANSPARENT_ARB 0x200A #define WGL_SHARE_DEPTH_ARB 0x200C #define WGL_SHARE_STENCIL_ARB 0x200D #define WGL_SHARE_ACCUM_ARB 0x200E #define WGL_SUPPORT_GDI_ARB 0x200F #define WGL_SUPPORT_OPENGL_ARB 0x2010 #define WGL_DOUBLE_BUFFER_ARB 0x2011 #define WGL_STEREO_ARB 0x2012 #define WGL_PIXEL_TYPE_ARB 0x2013 #define WGL_COLOR_BITS_ARB 0x2014 #define WGL_RED_BITS_ARB 0x2015 #define WGL_RED_SHIFT_ARB 0x2016 #define WGL_GREEN_BITS_ARB 0x2017 #define WGL_GREEN_SHIFT_ARB 0x2018 #define WGL_BLUE_BITS_ARB 0x2019 #define WGL_BLUE_SHIFT_ARB 0x201A #define WGL_ALPHA_BITS_ARB 0x201B #define WGL_ALPHA_SHIFT_ARB 0x201C #define WGL_ACCUM_BITS_ARB 0x201D #define WGL_ACCUM_RED_BITS_ARB 0x201E #define WGL_ACCUM_GREEN_BITS_ARB 0x201F #define WGL_ACCUM_BLUE_BITS_ARB 0x2020 #define WGL_ACCUM_ALPHA_BITS_ARB 0x2021 #define WGL_DEPTH_BITS_ARB 0x2022 #define WGL_STENCIL_BITS_ARB 0x2023 #define WGL_AUX_BUFFERS_ARB 0x2024 #define WGL_NO_ACCELERATION_ARB 0x2025 #define WGL_GENERIC_ACCELERATION_ARB 0x2026 #define WGL_FULL_ACCELERATION_ARB 0x2027 #define WGL_SWAP_EXCHANGE_ARB 0x2028 #define WGL_SWAP_COPY_ARB 0x2029 #define WGL_SWAP_UNDEFINED_ARB 0x202A #define WGL_TYPE_RGBA_ARB 0x202B #define WGL_TYPE_COLORINDEX_ARB 0x202C #define WGL_TRANSPARENT_RED_VALUE_ARB 0x2037 #define WGL_TRANSPARENT_GREEN_VALUE_ARB 0x2038 #define WGL_TRANSPARENT_BLUE_VALUE_ARB 0x2039 #define WGL_TRANSPARENT_ALPHA_VALUE_ARB 0x203A #define WGL_TRANSPARENT_INDEX_VALUE_ARB 0x203B typedef BOOL (WINAPI * PFNWGLCHOOSEPIXELFORMATARBPROC) (HDC hdc, const int* piAttribIList, const FLOAT *pfAttribFList, UINT nMaxFormats, int *piFormats, UINT *nNumFormats); typedef BOOL (WINAPI * PFNWGLGETPIXELFORMATATTRIBFVARBPROC) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, const int* piAttributes, FLOAT *pfValues); typedef BOOL (WINAPI * PFNWGLGETPIXELFORMATATTRIBIVARBPROC) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, const int* piAttributes, int *piValues); #define wglChoosePixelFormatARB WGLEW_GET_FUN(__wglewChoosePixelFormatARB) #define wglGetPixelFormatAttribfvARB WGLEW_GET_FUN(__wglewGetPixelFormatAttribfvARB) #define wglGetPixelFormatAttribivARB WGLEW_GET_FUN(__wglewGetPixelFormatAttribivARB) #define WGLEW_ARB_pixel_format WGLEW_GET_VAR(__WGLEW_ARB_pixel_format) #endif /* WGL_ARB_pixel_format */ /* ----------------------- WGL_ARB_pixel_format_float ---------------------- */ #ifndef WGL_ARB_pixel_format_float #define WGL_ARB_pixel_format_float 1 #define WGL_TYPE_RGBA_FLOAT_ARB 0x21A0 #define WGLEW_ARB_pixel_format_float WGLEW_GET_VAR(__WGLEW_ARB_pixel_format_float) #endif /* WGL_ARB_pixel_format_float */ /* ------------------------- WGL_ARB_render_texture ------------------------ */ #ifndef WGL_ARB_render_texture #define WGL_ARB_render_texture 1 #define WGL_BIND_TO_TEXTURE_RGB_ARB 0x2070 #define WGL_BIND_TO_TEXTURE_RGBA_ARB 0x2071 #define WGL_TEXTURE_FORMAT_ARB 0x2072 #define WGL_TEXTURE_TARGET_ARB 0x2073 #define WGL_MIPMAP_TEXTURE_ARB 0x2074 #define WGL_TEXTURE_RGB_ARB 0x2075 #define WGL_TEXTURE_RGBA_ARB 0x2076 #define WGL_NO_TEXTURE_ARB 0x2077 #define WGL_TEXTURE_CUBE_MAP_ARB 0x2078 #define WGL_TEXTURE_1D_ARB 0x2079 #define WGL_TEXTURE_2D_ARB 0x207A #define WGL_MIPMAP_LEVEL_ARB 0x207B #define WGL_CUBE_MAP_FACE_ARB 0x207C #define WGL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB 0x207D #define WGL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB 0x207E #define WGL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB 0x207F #define WGL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB 0x2080 #define WGL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB 0x2081 #define WGL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB 0x2082 #define WGL_FRONT_LEFT_ARB 0x2083 #define WGL_FRONT_RIGHT_ARB 0x2084 #define WGL_BACK_LEFT_ARB 0x2085 #define WGL_BACK_RIGHT_ARB 0x2086 #define WGL_AUX0_ARB 0x2087 #define WGL_AUX1_ARB 0x2088 #define WGL_AUX2_ARB 0x2089 #define WGL_AUX3_ARB 0x208A #define WGL_AUX4_ARB 0x208B #define WGL_AUX5_ARB 0x208C #define WGL_AUX6_ARB 0x208D #define WGL_AUX7_ARB 0x208E #define WGL_AUX8_ARB 0x208F #define WGL_AUX9_ARB 0x2090 typedef BOOL (WINAPI * PFNWGLBINDTEXIMAGEARBPROC) (HPBUFFERARB hPbuffer, int iBuffer); typedef BOOL (WINAPI * PFNWGLRELEASETEXIMAGEARBPROC) (HPBUFFERARB hPbuffer, int iBuffer); typedef BOOL (WINAPI * PFNWGLSETPBUFFERATTRIBARBPROC) (HPBUFFERARB hPbuffer, const int* piAttribList); #define wglBindTexImageARB WGLEW_GET_FUN(__wglewBindTexImageARB) #define wglReleaseTexImageARB WGLEW_GET_FUN(__wglewReleaseTexImageARB) #define wglSetPbufferAttribARB WGLEW_GET_FUN(__wglewSetPbufferAttribARB) #define WGLEW_ARB_render_texture WGLEW_GET_VAR(__WGLEW_ARB_render_texture) #endif /* WGL_ARB_render_texture */ /* ----------------------- WGL_ATI_pixel_format_float ---------------------- */ #ifndef WGL_ATI_pixel_format_float #define WGL_ATI_pixel_format_float 1 #define WGL_TYPE_RGBA_FLOAT_ATI 0x21A0 #define GL_RGBA_FLOAT_MODE_ATI 0x8820 #define GL_COLOR_CLEAR_UNCLAMPED_VALUE_ATI 0x8835 #define WGLEW_ATI_pixel_format_float WGLEW_GET_VAR(__WGLEW_ATI_pixel_format_float) #endif /* WGL_ATI_pixel_format_float */ /* -------------------- WGL_ATI_render_texture_rectangle ------------------- */ #ifndef WGL_ATI_render_texture_rectangle #define WGL_ATI_render_texture_rectangle 1 #define WGL_TEXTURE_RECTANGLE_ATI 0x21A5 #define WGLEW_ATI_render_texture_rectangle WGLEW_GET_VAR(__WGLEW_ATI_render_texture_rectangle) #endif /* WGL_ATI_render_texture_rectangle */ /* ------------------- WGL_EXT_create_context_es2_profile ------------------ */ #ifndef WGL_EXT_create_context_es2_profile #define WGL_EXT_create_context_es2_profile 1 #define WGL_CONTEXT_ES2_PROFILE_BIT_EXT 0x00000004 #define WGLEW_EXT_create_context_es2_profile WGLEW_GET_VAR(__WGLEW_EXT_create_context_es2_profile) #endif /* WGL_EXT_create_context_es2_profile */ /* ------------------- WGL_EXT_create_context_es_profile ------------------- */ #ifndef WGL_EXT_create_context_es_profile #define WGL_EXT_create_context_es_profile 1 #define WGL_CONTEXT_ES_PROFILE_BIT_EXT 0x00000004 #define WGLEW_EXT_create_context_es_profile WGLEW_GET_VAR(__WGLEW_EXT_create_context_es_profile) #endif /* WGL_EXT_create_context_es_profile */ /* -------------------------- WGL_EXT_depth_float -------------------------- */ #ifndef WGL_EXT_depth_float #define WGL_EXT_depth_float 1 #define WGL_DEPTH_FLOAT_EXT 0x2040 #define WGLEW_EXT_depth_float WGLEW_GET_VAR(__WGLEW_EXT_depth_float) #endif /* WGL_EXT_depth_float */ /* ---------------------- WGL_EXT_display_color_table ---------------------- */ #ifndef WGL_EXT_display_color_table #define WGL_EXT_display_color_table 1 typedef GLboolean (WINAPI * PFNWGLBINDDISPLAYCOLORTABLEEXTPROC) (GLushort id); typedef GLboolean (WINAPI * PFNWGLCREATEDISPLAYCOLORTABLEEXTPROC) (GLushort id); typedef void (WINAPI * PFNWGLDESTROYDISPLAYCOLORTABLEEXTPROC) (GLushort id); typedef GLboolean (WINAPI * PFNWGLLOADDISPLAYCOLORTABLEEXTPROC) (GLushort* table, GLuint length); #define wglBindDisplayColorTableEXT WGLEW_GET_FUN(__wglewBindDisplayColorTableEXT) #define wglCreateDisplayColorTableEXT WGLEW_GET_FUN(__wglewCreateDisplayColorTableEXT) #define wglDestroyDisplayColorTableEXT WGLEW_GET_FUN(__wglewDestroyDisplayColorTableEXT) #define wglLoadDisplayColorTableEXT WGLEW_GET_FUN(__wglewLoadDisplayColorTableEXT) #define WGLEW_EXT_display_color_table WGLEW_GET_VAR(__WGLEW_EXT_display_color_table) #endif /* WGL_EXT_display_color_table */ /* ----------------------- WGL_EXT_extensions_string ----------------------- */ #ifndef WGL_EXT_extensions_string #define WGL_EXT_extensions_string 1 typedef const char* (WINAPI * PFNWGLGETEXTENSIONSSTRINGEXTPROC) (void); #define wglGetExtensionsStringEXT WGLEW_GET_FUN(__wglewGetExtensionsStringEXT) #define WGLEW_EXT_extensions_string WGLEW_GET_VAR(__WGLEW_EXT_extensions_string) #endif /* WGL_EXT_extensions_string */ /* ------------------------ WGL_EXT_framebuffer_sRGB ----------------------- */ #ifndef WGL_EXT_framebuffer_sRGB #define WGL_EXT_framebuffer_sRGB 1 #define WGL_FRAMEBUFFER_SRGB_CAPABLE_EXT 0x20A9 #define WGLEW_EXT_framebuffer_sRGB WGLEW_GET_VAR(__WGLEW_EXT_framebuffer_sRGB) #endif /* WGL_EXT_framebuffer_sRGB */ /* ----------------------- WGL_EXT_make_current_read ----------------------- */ #ifndef WGL_EXT_make_current_read #define WGL_EXT_make_current_read 1 #define ERROR_INVALID_PIXEL_TYPE_EXT 0x2043 typedef HDC (WINAPI * PFNWGLGETCURRENTREADDCEXTPROC) (VOID); typedef BOOL (WINAPI * PFNWGLMAKECONTEXTCURRENTEXTPROC) (HDC hDrawDC, HDC hReadDC, HGLRC hglrc); #define wglGetCurrentReadDCEXT WGLEW_GET_FUN(__wglewGetCurrentReadDCEXT) #define wglMakeContextCurrentEXT WGLEW_GET_FUN(__wglewMakeContextCurrentEXT) #define WGLEW_EXT_make_current_read WGLEW_GET_VAR(__WGLEW_EXT_make_current_read) #endif /* WGL_EXT_make_current_read */ /* -------------------------- WGL_EXT_multisample -------------------------- */ #ifndef WGL_EXT_multisample #define WGL_EXT_multisample 1 #define WGL_SAMPLE_BUFFERS_EXT 0x2041 #define WGL_SAMPLES_EXT 0x2042 #define WGLEW_EXT_multisample WGLEW_GET_VAR(__WGLEW_EXT_multisample) #endif /* WGL_EXT_multisample */ /* ---------------------------- WGL_EXT_pbuffer ---------------------------- */ #ifndef WGL_EXT_pbuffer #define WGL_EXT_pbuffer 1 #define WGL_DRAW_TO_PBUFFER_EXT 0x202D #define WGL_MAX_PBUFFER_PIXELS_EXT 0x202E #define WGL_MAX_PBUFFER_WIDTH_EXT 0x202F #define WGL_MAX_PBUFFER_HEIGHT_EXT 0x2030 #define WGL_OPTIMAL_PBUFFER_WIDTH_EXT 0x2031 #define WGL_OPTIMAL_PBUFFER_HEIGHT_EXT 0x2032 #define WGL_PBUFFER_LARGEST_EXT 0x2033 #define WGL_PBUFFER_WIDTH_EXT 0x2034 #define WGL_PBUFFER_HEIGHT_EXT 0x2035 DECLARE_HANDLE(HPBUFFEREXT); typedef HPBUFFEREXT (WINAPI * PFNWGLCREATEPBUFFEREXTPROC) (HDC hDC, int iPixelFormat, int iWidth, int iHeight, const int* piAttribList); typedef BOOL (WINAPI * PFNWGLDESTROYPBUFFEREXTPROC) (HPBUFFEREXT hPbuffer); typedef HDC (WINAPI * PFNWGLGETPBUFFERDCEXTPROC) (HPBUFFEREXT hPbuffer); typedef BOOL (WINAPI * PFNWGLQUERYPBUFFEREXTPROC) (HPBUFFEREXT hPbuffer, int iAttribute, int* piValue); typedef int (WINAPI * PFNWGLRELEASEPBUFFERDCEXTPROC) (HPBUFFEREXT hPbuffer, HDC hDC); #define wglCreatePbufferEXT WGLEW_GET_FUN(__wglewCreatePbufferEXT) #define wglDestroyPbufferEXT WGLEW_GET_FUN(__wglewDestroyPbufferEXT) #define wglGetPbufferDCEXT WGLEW_GET_FUN(__wglewGetPbufferDCEXT) #define wglQueryPbufferEXT WGLEW_GET_FUN(__wglewQueryPbufferEXT) #define wglReleasePbufferDCEXT WGLEW_GET_FUN(__wglewReleasePbufferDCEXT) #define WGLEW_EXT_pbuffer WGLEW_GET_VAR(__WGLEW_EXT_pbuffer) #endif /* WGL_EXT_pbuffer */ /* -------------------------- WGL_EXT_pixel_format ------------------------- */ #ifndef WGL_EXT_pixel_format #define WGL_EXT_pixel_format 1 #define WGL_NUMBER_PIXEL_FORMATS_EXT 0x2000 #define WGL_DRAW_TO_WINDOW_EXT 0x2001 #define WGL_DRAW_TO_BITMAP_EXT 0x2002 #define WGL_ACCELERATION_EXT 0x2003 #define WGL_NEED_PALETTE_EXT 0x2004 #define WGL_NEED_SYSTEM_PALETTE_EXT 0x2005 #define WGL_SWAP_LAYER_BUFFERS_EXT 0x2006 #define WGL_SWAP_METHOD_EXT 0x2007 #define WGL_NUMBER_OVERLAYS_EXT 0x2008 #define WGL_NUMBER_UNDERLAYS_EXT 0x2009 #define WGL_TRANSPARENT_EXT 0x200A #define WGL_TRANSPARENT_VALUE_EXT 0x200B #define WGL_SHARE_DEPTH_EXT 0x200C #define WGL_SHARE_STENCIL_EXT 0x200D #define WGL_SHARE_ACCUM_EXT 0x200E #define WGL_SUPPORT_GDI_EXT 0x200F #define WGL_SUPPORT_OPENGL_EXT 0x2010 #define WGL_DOUBLE_BUFFER_EXT 0x2011 #define WGL_STEREO_EXT 0x2012 #define WGL_PIXEL_TYPE_EXT 0x2013 #define WGL_COLOR_BITS_EXT 0x2014 #define WGL_RED_BITS_EXT 0x2015 #define WGL_RED_SHIFT_EXT 0x2016 #define WGL_GREEN_BITS_EXT 0x2017 #define WGL_GREEN_SHIFT_EXT 0x2018 #define WGL_BLUE_BITS_EXT 0x2019 #define WGL_BLUE_SHIFT_EXT 0x201A #define WGL_ALPHA_BITS_EXT 0x201B #define WGL_ALPHA_SHIFT_EXT 0x201C #define WGL_ACCUM_BITS_EXT 0x201D #define WGL_ACCUM_RED_BITS_EXT 0x201E #define WGL_ACCUM_GREEN_BITS_EXT 0x201F #define WGL_ACCUM_BLUE_BITS_EXT 0x2020 #define WGL_ACCUM_ALPHA_BITS_EXT 0x2021 #define WGL_DEPTH_BITS_EXT 0x2022 #define WGL_STENCIL_BITS_EXT 0x2023 #define WGL_AUX_BUFFERS_EXT 0x2024 #define WGL_NO_ACCELERATION_EXT 0x2025 #define WGL_GENERIC_ACCELERATION_EXT 0x2026 #define WGL_FULL_ACCELERATION_EXT 0x2027 #define WGL_SWAP_EXCHANGE_EXT 0x2028 #define WGL_SWAP_COPY_EXT 0x2029 #define WGL_SWAP_UNDEFINED_EXT 0x202A #define WGL_TYPE_RGBA_EXT 0x202B #define WGL_TYPE_COLORINDEX_EXT 0x202C typedef BOOL (WINAPI * PFNWGLCHOOSEPIXELFORMATEXTPROC) (HDC hdc, const int* piAttribIList, const FLOAT *pfAttribFList, UINT nMaxFormats, int *piFormats, UINT *nNumFormats); typedef BOOL (WINAPI * PFNWGLGETPIXELFORMATATTRIBFVEXTPROC) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, int* piAttributes, FLOAT *pfValues); typedef BOOL (WINAPI * PFNWGLGETPIXELFORMATATTRIBIVEXTPROC) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, int* piAttributes, int *piValues); #define wglChoosePixelFormatEXT WGLEW_GET_FUN(__wglewChoosePixelFormatEXT) #define wglGetPixelFormatAttribfvEXT WGLEW_GET_FUN(__wglewGetPixelFormatAttribfvEXT) #define wglGetPixelFormatAttribivEXT WGLEW_GET_FUN(__wglewGetPixelFormatAttribivEXT) #define WGLEW_EXT_pixel_format WGLEW_GET_VAR(__WGLEW_EXT_pixel_format) #endif /* WGL_EXT_pixel_format */ /* ------------------- WGL_EXT_pixel_format_packed_float ------------------- */ #ifndef WGL_EXT_pixel_format_packed_float #define WGL_EXT_pixel_format_packed_float 1 #define WGL_TYPE_RGBA_UNSIGNED_FLOAT_EXT 0x20A8 #define WGLEW_EXT_pixel_format_packed_float WGLEW_GET_VAR(__WGLEW_EXT_pixel_format_packed_float) #endif /* WGL_EXT_pixel_format_packed_float */ /* -------------------------- WGL_EXT_swap_control ------------------------- */ #ifndef WGL_EXT_swap_control #define WGL_EXT_swap_control 1 typedef int (WINAPI * PFNWGLGETSWAPINTERVALEXTPROC) (void); typedef BOOL (WINAPI * PFNWGLSWAPINTERVALEXTPROC) (int interval); #define wglGetSwapIntervalEXT WGLEW_GET_FUN(__wglewGetSwapIntervalEXT) #define wglSwapIntervalEXT WGLEW_GET_FUN(__wglewSwapIntervalEXT) #define WGLEW_EXT_swap_control WGLEW_GET_VAR(__WGLEW_EXT_swap_control) #endif /* WGL_EXT_swap_control */ /* ----------------------- WGL_EXT_swap_control_tear ----------------------- */ #ifndef WGL_EXT_swap_control_tear #define WGL_EXT_swap_control_tear 1 #define WGLEW_EXT_swap_control_tear WGLEW_GET_VAR(__WGLEW_EXT_swap_control_tear) #endif /* WGL_EXT_swap_control_tear */ /* --------------------- WGL_I3D_digital_video_control --------------------- */ #ifndef WGL_I3D_digital_video_control #define WGL_I3D_digital_video_control 1 #define WGL_DIGITAL_VIDEO_CURSOR_ALPHA_FRAMEBUFFER_I3D 0x2050 #define WGL_DIGITAL_VIDEO_CURSOR_ALPHA_VALUE_I3D 0x2051 #define WGL_DIGITAL_VIDEO_CURSOR_INCLUDED_I3D 0x2052 #define WGL_DIGITAL_VIDEO_GAMMA_CORRECTED_I3D 0x2053 typedef BOOL (WINAPI * PFNWGLGETDIGITALVIDEOPARAMETERSI3DPROC) (HDC hDC, int iAttribute, int* piValue); typedef BOOL (WINAPI * PFNWGLSETDIGITALVIDEOPARAMETERSI3DPROC) (HDC hDC, int iAttribute, const int* piValue); #define wglGetDigitalVideoParametersI3D WGLEW_GET_FUN(__wglewGetDigitalVideoParametersI3D) #define wglSetDigitalVideoParametersI3D WGLEW_GET_FUN(__wglewSetDigitalVideoParametersI3D) #define WGLEW_I3D_digital_video_control WGLEW_GET_VAR(__WGLEW_I3D_digital_video_control) #endif /* WGL_I3D_digital_video_control */ /* ----------------------------- WGL_I3D_gamma ----------------------------- */ #ifndef WGL_I3D_gamma #define WGL_I3D_gamma 1 #define WGL_GAMMA_TABLE_SIZE_I3D 0x204E #define WGL_GAMMA_EXCLUDE_DESKTOP_I3D 0x204F typedef BOOL (WINAPI * PFNWGLGETGAMMATABLEI3DPROC) (HDC hDC, int iEntries, USHORT* puRed, USHORT *puGreen, USHORT *puBlue); typedef BOOL (WINAPI * PFNWGLGETGAMMATABLEPARAMETERSI3DPROC) (HDC hDC, int iAttribute, int* piValue); typedef BOOL (WINAPI * PFNWGLSETGAMMATABLEI3DPROC) (HDC hDC, int iEntries, const USHORT* puRed, const USHORT *puGreen, const USHORT *puBlue); typedef BOOL (WINAPI * PFNWGLSETGAMMATABLEPARAMETERSI3DPROC) (HDC hDC, int iAttribute, const int* piValue); #define wglGetGammaTableI3D WGLEW_GET_FUN(__wglewGetGammaTableI3D) #define wglGetGammaTableParametersI3D WGLEW_GET_FUN(__wglewGetGammaTableParametersI3D) #define wglSetGammaTableI3D WGLEW_GET_FUN(__wglewSetGammaTableI3D) #define wglSetGammaTableParametersI3D WGLEW_GET_FUN(__wglewSetGammaTableParametersI3D) #define WGLEW_I3D_gamma WGLEW_GET_VAR(__WGLEW_I3D_gamma) #endif /* WGL_I3D_gamma */ /* ---------------------------- WGL_I3D_genlock ---------------------------- */ #ifndef WGL_I3D_genlock #define WGL_I3D_genlock 1 #define WGL_GENLOCK_SOURCE_MULTIVIEW_I3D 0x2044 #define WGL_GENLOCK_SOURCE_EXTERNAL_SYNC_I3D 0x2045 #define WGL_GENLOCK_SOURCE_EXTERNAL_FIELD_I3D 0x2046 #define WGL_GENLOCK_SOURCE_EXTERNAL_TTL_I3D 0x2047 #define WGL_GENLOCK_SOURCE_DIGITAL_SYNC_I3D 0x2048 #define WGL_GENLOCK_SOURCE_DIGITAL_FIELD_I3D 0x2049 #define WGL_GENLOCK_SOURCE_EDGE_FALLING_I3D 0x204A #define WGL_GENLOCK_SOURCE_EDGE_RISING_I3D 0x204B #define WGL_GENLOCK_SOURCE_EDGE_BOTH_I3D 0x204C typedef BOOL (WINAPI * PFNWGLDISABLEGENLOCKI3DPROC) (HDC hDC); typedef BOOL (WINAPI * PFNWGLENABLEGENLOCKI3DPROC) (HDC hDC); typedef BOOL (WINAPI * PFNWGLGENLOCKSAMPLERATEI3DPROC) (HDC hDC, UINT uRate); typedef BOOL (WINAPI * PFNWGLGENLOCKSOURCEDELAYI3DPROC) (HDC hDC, UINT uDelay); typedef BOOL (WINAPI * PFNWGLGENLOCKSOURCEEDGEI3DPROC) (HDC hDC, UINT uEdge); typedef BOOL (WINAPI * PFNWGLGENLOCKSOURCEI3DPROC) (HDC hDC, UINT uSource); typedef BOOL (WINAPI * PFNWGLGETGENLOCKSAMPLERATEI3DPROC) (HDC hDC, UINT* uRate); typedef BOOL (WINAPI * PFNWGLGETGENLOCKSOURCEDELAYI3DPROC) (HDC hDC, UINT* uDelay); typedef BOOL (WINAPI * PFNWGLGETGENLOCKSOURCEEDGEI3DPROC) (HDC hDC, UINT* uEdge); typedef BOOL (WINAPI * PFNWGLGETGENLOCKSOURCEI3DPROC) (HDC hDC, UINT* uSource); typedef BOOL (WINAPI * PFNWGLISENABLEDGENLOCKI3DPROC) (HDC hDC, BOOL* pFlag); typedef BOOL (WINAPI * PFNWGLQUERYGENLOCKMAXSOURCEDELAYI3DPROC) (HDC hDC, UINT* uMaxLineDelay, UINT *uMaxPixelDelay); #define wglDisableGenlockI3D WGLEW_GET_FUN(__wglewDisableGenlockI3D) #define wglEnableGenlockI3D WGLEW_GET_FUN(__wglewEnableGenlockI3D) #define wglGenlockSampleRateI3D WGLEW_GET_FUN(__wglewGenlockSampleRateI3D) #define wglGenlockSourceDelayI3D WGLEW_GET_FUN(__wglewGenlockSourceDelayI3D) #define wglGenlockSourceEdgeI3D WGLEW_GET_FUN(__wglewGenlockSourceEdgeI3D) #define wglGenlockSourceI3D WGLEW_GET_FUN(__wglewGenlockSourceI3D) #define wglGetGenlockSampleRateI3D WGLEW_GET_FUN(__wglewGetGenlockSampleRateI3D) #define wglGetGenlockSourceDelayI3D WGLEW_GET_FUN(__wglewGetGenlockSourceDelayI3D) #define wglGetGenlockSourceEdgeI3D WGLEW_GET_FUN(__wglewGetGenlockSourceEdgeI3D) #define wglGetGenlockSourceI3D WGLEW_GET_FUN(__wglewGetGenlockSourceI3D) #define wglIsEnabledGenlockI3D WGLEW_GET_FUN(__wglewIsEnabledGenlockI3D) #define wglQueryGenlockMaxSourceDelayI3D WGLEW_GET_FUN(__wglewQueryGenlockMaxSourceDelayI3D) #define WGLEW_I3D_genlock WGLEW_GET_VAR(__WGLEW_I3D_genlock) #endif /* WGL_I3D_genlock */ /* -------------------------- WGL_I3D_image_buffer ------------------------- */ #ifndef WGL_I3D_image_buffer #define WGL_I3D_image_buffer 1 #define WGL_IMAGE_BUFFER_MIN_ACCESS_I3D 0x00000001 #define WGL_IMAGE_BUFFER_LOCK_I3D 0x00000002 typedef BOOL (WINAPI * PFNWGLASSOCIATEIMAGEBUFFEREVENTSI3DPROC) (HDC hdc, HANDLE* pEvent, LPVOID *pAddress, DWORD *pSize, UINT count); typedef LPVOID (WINAPI * PFNWGLCREATEIMAGEBUFFERI3DPROC) (HDC hDC, DWORD dwSize, UINT uFlags); typedef BOOL (WINAPI * PFNWGLDESTROYIMAGEBUFFERI3DPROC) (HDC hDC, LPVOID pAddress); typedef BOOL (WINAPI * PFNWGLRELEASEIMAGEBUFFEREVENTSI3DPROC) (HDC hdc, LPVOID* pAddress, UINT count); #define wglAssociateImageBufferEventsI3D WGLEW_GET_FUN(__wglewAssociateImageBufferEventsI3D) #define wglCreateImageBufferI3D WGLEW_GET_FUN(__wglewCreateImageBufferI3D) #define wglDestroyImageBufferI3D WGLEW_GET_FUN(__wglewDestroyImageBufferI3D) #define wglReleaseImageBufferEventsI3D WGLEW_GET_FUN(__wglewReleaseImageBufferEventsI3D) #define WGLEW_I3D_image_buffer WGLEW_GET_VAR(__WGLEW_I3D_image_buffer) #endif /* WGL_I3D_image_buffer */ /* ------------------------ WGL_I3D_swap_frame_lock ------------------------ */ #ifndef WGL_I3D_swap_frame_lock #define WGL_I3D_swap_frame_lock 1 typedef BOOL (WINAPI * PFNWGLDISABLEFRAMELOCKI3DPROC) (VOID); typedef BOOL (WINAPI * PFNWGLENABLEFRAMELOCKI3DPROC) (VOID); typedef BOOL (WINAPI * PFNWGLISENABLEDFRAMELOCKI3DPROC) (BOOL* pFlag); typedef BOOL (WINAPI * PFNWGLQUERYFRAMELOCKMASTERI3DPROC) (BOOL* pFlag); #define wglDisableFrameLockI3D WGLEW_GET_FUN(__wglewDisableFrameLockI3D) #define wglEnableFrameLockI3D WGLEW_GET_FUN(__wglewEnableFrameLockI3D) #define wglIsEnabledFrameLockI3D WGLEW_GET_FUN(__wglewIsEnabledFrameLockI3D) #define wglQueryFrameLockMasterI3D WGLEW_GET_FUN(__wglewQueryFrameLockMasterI3D) #define WGLEW_I3D_swap_frame_lock WGLEW_GET_VAR(__WGLEW_I3D_swap_frame_lock) #endif /* WGL_I3D_swap_frame_lock */ /* ------------------------ WGL_I3D_swap_frame_usage ----------------------- */ #ifndef WGL_I3D_swap_frame_usage #define WGL_I3D_swap_frame_usage 1 typedef BOOL (WINAPI * PFNWGLBEGINFRAMETRACKINGI3DPROC) (void); typedef BOOL (WINAPI * PFNWGLENDFRAMETRACKINGI3DPROC) (void); typedef BOOL (WINAPI * PFNWGLGETFRAMEUSAGEI3DPROC) (float* pUsage); typedef BOOL (WINAPI * PFNWGLQUERYFRAMETRACKINGI3DPROC) (DWORD* pFrameCount, DWORD *pMissedFrames, float *pLastMissedUsage); #define wglBeginFrameTrackingI3D WGLEW_GET_FUN(__wglewBeginFrameTrackingI3D) #define wglEndFrameTrackingI3D WGLEW_GET_FUN(__wglewEndFrameTrackingI3D) #define wglGetFrameUsageI3D WGLEW_GET_FUN(__wglewGetFrameUsageI3D) #define wglQueryFrameTrackingI3D WGLEW_GET_FUN(__wglewQueryFrameTrackingI3D) #define WGLEW_I3D_swap_frame_usage WGLEW_GET_VAR(__WGLEW_I3D_swap_frame_usage) #endif /* WGL_I3D_swap_frame_usage */ /* --------------------------- WGL_NV_DX_interop --------------------------- */ #ifndef WGL_NV_DX_interop #define WGL_NV_DX_interop 1 #define WGL_ACCESS_READ_ONLY_NV 0x0000 #define WGL_ACCESS_READ_WRITE_NV 0x0001 #define WGL_ACCESS_WRITE_DISCARD_NV 0x0002 typedef BOOL (WINAPI * PFNWGLDXCLOSEDEVICENVPROC) (HANDLE hDevice); typedef BOOL (WINAPI * PFNWGLDXLOCKOBJECTSNVPROC) (HANDLE hDevice, GLint count, HANDLE* hObjects); typedef BOOL (WINAPI * PFNWGLDXOBJECTACCESSNVPROC) (HANDLE hObject, GLenum access); typedef HANDLE (WINAPI * PFNWGLDXOPENDEVICENVPROC) (void* dxDevice); typedef HANDLE (WINAPI * PFNWGLDXREGISTEROBJECTNVPROC) (HANDLE hDevice, void* dxObject, GLuint name, GLenum type, GLenum access); typedef BOOL (WINAPI * PFNWGLDXSETRESOURCESHAREHANDLENVPROC) (void* dxObject, HANDLE shareHandle); typedef BOOL (WINAPI * PFNWGLDXUNLOCKOBJECTSNVPROC) (HANDLE hDevice, GLint count, HANDLE* hObjects); typedef BOOL (WINAPI * PFNWGLDXUNREGISTEROBJECTNVPROC) (HANDLE hDevice, HANDLE hObject); #define wglDXCloseDeviceNV WGLEW_GET_FUN(__wglewDXCloseDeviceNV) #define wglDXLockObjectsNV WGLEW_GET_FUN(__wglewDXLockObjectsNV) #define wglDXObjectAccessNV WGLEW_GET_FUN(__wglewDXObjectAccessNV) #define wglDXOpenDeviceNV WGLEW_GET_FUN(__wglewDXOpenDeviceNV) #define wglDXRegisterObjectNV WGLEW_GET_FUN(__wglewDXRegisterObjectNV) #define wglDXSetResourceShareHandleNV WGLEW_GET_FUN(__wglewDXSetResourceShareHandleNV) #define wglDXUnlockObjectsNV WGLEW_GET_FUN(__wglewDXUnlockObjectsNV) #define wglDXUnregisterObjectNV WGLEW_GET_FUN(__wglewDXUnregisterObjectNV) #define WGLEW_NV_DX_interop WGLEW_GET_VAR(__WGLEW_NV_DX_interop) #endif /* WGL_NV_DX_interop */ /* --------------------------- WGL_NV_DX_interop2 -------------------------- */ #ifndef WGL_NV_DX_interop2 #define WGL_NV_DX_interop2 1 #define WGLEW_NV_DX_interop2 WGLEW_GET_VAR(__WGLEW_NV_DX_interop2) #endif /* WGL_NV_DX_interop2 */ /* --------------------------- WGL_NV_copy_image --------------------------- */ #ifndef WGL_NV_copy_image #define WGL_NV_copy_image 1 typedef BOOL (WINAPI * PFNWGLCOPYIMAGESUBDATANVPROC) (HGLRC hSrcRC, GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, HGLRC hDstRC, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei width, GLsizei height, GLsizei depth); #define wglCopyImageSubDataNV WGLEW_GET_FUN(__wglewCopyImageSubDataNV) #define WGLEW_NV_copy_image WGLEW_GET_VAR(__WGLEW_NV_copy_image) #endif /* WGL_NV_copy_image */ /* -------------------------- WGL_NV_float_buffer -------------------------- */ #ifndef WGL_NV_float_buffer #define WGL_NV_float_buffer 1 #define WGL_FLOAT_COMPONENTS_NV 0x20B0 #define WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_R_NV 0x20B1 #define WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_RG_NV 0x20B2 #define WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_RGB_NV 0x20B3 #define WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_RGBA_NV 0x20B4 #define WGL_TEXTURE_FLOAT_R_NV 0x20B5 #define WGL_TEXTURE_FLOAT_RG_NV 0x20B6 #define WGL_TEXTURE_FLOAT_RGB_NV 0x20B7 #define WGL_TEXTURE_FLOAT_RGBA_NV 0x20B8 #define WGLEW_NV_float_buffer WGLEW_GET_VAR(__WGLEW_NV_float_buffer) #endif /* WGL_NV_float_buffer */ /* -------------------------- WGL_NV_gpu_affinity -------------------------- */ #ifndef WGL_NV_gpu_affinity #define WGL_NV_gpu_affinity 1 #define WGL_ERROR_INCOMPATIBLE_AFFINITY_MASKS_NV 0x20D0 #define WGL_ERROR_MISSING_AFFINITY_MASK_NV 0x20D1 DECLARE_HANDLE(HGPUNV); typedef struct _GPU_DEVICE { DWORD cb; CHAR DeviceName[32]; CHAR DeviceString[128]; DWORD Flags; RECT rcVirtualScreen; } GPU_DEVICE, *PGPU_DEVICE; typedef HDC (WINAPI * PFNWGLCREATEAFFINITYDCNVPROC) (const HGPUNV *phGpuList); typedef BOOL (WINAPI * PFNWGLDELETEDCNVPROC) (HDC hdc); typedef BOOL (WINAPI * PFNWGLENUMGPUDEVICESNVPROC) (HGPUNV hGpu, UINT iDeviceIndex, PGPU_DEVICE lpGpuDevice); typedef BOOL (WINAPI * PFNWGLENUMGPUSFROMAFFINITYDCNVPROC) (HDC hAffinityDC, UINT iGpuIndex, HGPUNV *hGpu); typedef BOOL (WINAPI * PFNWGLENUMGPUSNVPROC) (UINT iGpuIndex, HGPUNV *phGpu); #define wglCreateAffinityDCNV WGLEW_GET_FUN(__wglewCreateAffinityDCNV) #define wglDeleteDCNV WGLEW_GET_FUN(__wglewDeleteDCNV) #define wglEnumGpuDevicesNV WGLEW_GET_FUN(__wglewEnumGpuDevicesNV) #define wglEnumGpusFromAffinityDCNV WGLEW_GET_FUN(__wglewEnumGpusFromAffinityDCNV) #define wglEnumGpusNV WGLEW_GET_FUN(__wglewEnumGpusNV) #define WGLEW_NV_gpu_affinity WGLEW_GET_VAR(__WGLEW_NV_gpu_affinity) #endif /* WGL_NV_gpu_affinity */ /* ---------------------- WGL_NV_multisample_coverage ---------------------- */ #ifndef WGL_NV_multisample_coverage #define WGL_NV_multisample_coverage 1 #define WGL_COVERAGE_SAMPLES_NV 0x2042 #define WGL_COLOR_SAMPLES_NV 0x20B9 #define WGLEW_NV_multisample_coverage WGLEW_GET_VAR(__WGLEW_NV_multisample_coverage) #endif /* WGL_NV_multisample_coverage */ /* -------------------------- WGL_NV_present_video ------------------------- */ #ifndef WGL_NV_present_video #define WGL_NV_present_video 1 #define WGL_NUM_VIDEO_SLOTS_NV 0x20F0 DECLARE_HANDLE(HVIDEOOUTPUTDEVICENV); typedef BOOL (WINAPI * PFNWGLBINDVIDEODEVICENVPROC) (HDC hDc, unsigned int uVideoSlot, HVIDEOOUTPUTDEVICENV hVideoDevice, const int* piAttribList); typedef int (WINAPI * PFNWGLENUMERATEVIDEODEVICESNVPROC) (HDC hDc, HVIDEOOUTPUTDEVICENV* phDeviceList); typedef BOOL (WINAPI * PFNWGLQUERYCURRENTCONTEXTNVPROC) (int iAttribute, int* piValue); #define wglBindVideoDeviceNV WGLEW_GET_FUN(__wglewBindVideoDeviceNV) #define wglEnumerateVideoDevicesNV WGLEW_GET_FUN(__wglewEnumerateVideoDevicesNV) #define wglQueryCurrentContextNV WGLEW_GET_FUN(__wglewQueryCurrentContextNV) #define WGLEW_NV_present_video WGLEW_GET_VAR(__WGLEW_NV_present_video) #endif /* WGL_NV_present_video */ /* ---------------------- WGL_NV_render_depth_texture ---------------------- */ #ifndef WGL_NV_render_depth_texture #define WGL_NV_render_depth_texture 1 #define WGL_NO_TEXTURE_ARB 0x2077 #define WGL_BIND_TO_TEXTURE_DEPTH_NV 0x20A3 #define WGL_BIND_TO_TEXTURE_RECTANGLE_DEPTH_NV 0x20A4 #define WGL_DEPTH_TEXTURE_FORMAT_NV 0x20A5 #define WGL_TEXTURE_DEPTH_COMPONENT_NV 0x20A6 #define WGL_DEPTH_COMPONENT_NV 0x20A7 #define WGLEW_NV_render_depth_texture WGLEW_GET_VAR(__WGLEW_NV_render_depth_texture) #endif /* WGL_NV_render_depth_texture */ /* -------------------- WGL_NV_render_texture_rectangle -------------------- */ #ifndef WGL_NV_render_texture_rectangle #define WGL_NV_render_texture_rectangle 1 #define WGL_BIND_TO_TEXTURE_RECTANGLE_RGB_NV 0x20A0 #define WGL_BIND_TO_TEXTURE_RECTANGLE_RGBA_NV 0x20A1 #define WGL_TEXTURE_RECTANGLE_NV 0x20A2 #define WGLEW_NV_render_texture_rectangle WGLEW_GET_VAR(__WGLEW_NV_render_texture_rectangle) #endif /* WGL_NV_render_texture_rectangle */ /* --------------------------- WGL_NV_swap_group --------------------------- */ #ifndef WGL_NV_swap_group #define WGL_NV_swap_group 1 typedef BOOL (WINAPI * PFNWGLBINDSWAPBARRIERNVPROC) (GLuint group, GLuint barrier); typedef BOOL (WINAPI * PFNWGLJOINSWAPGROUPNVPROC) (HDC hDC, GLuint group); typedef BOOL (WINAPI * PFNWGLQUERYFRAMECOUNTNVPROC) (HDC hDC, GLuint* count); typedef BOOL (WINAPI * PFNWGLQUERYMAXSWAPGROUPSNVPROC) (HDC hDC, GLuint* maxGroups, GLuint *maxBarriers); typedef BOOL (WINAPI * PFNWGLQUERYSWAPGROUPNVPROC) (HDC hDC, GLuint* group, GLuint *barrier); typedef BOOL (WINAPI * PFNWGLRESETFRAMECOUNTNVPROC) (HDC hDC); #define wglBindSwapBarrierNV WGLEW_GET_FUN(__wglewBindSwapBarrierNV) #define wglJoinSwapGroupNV WGLEW_GET_FUN(__wglewJoinSwapGroupNV) #define wglQueryFrameCountNV WGLEW_GET_FUN(__wglewQueryFrameCountNV) #define wglQueryMaxSwapGroupsNV WGLEW_GET_FUN(__wglewQueryMaxSwapGroupsNV) #define wglQuerySwapGroupNV WGLEW_GET_FUN(__wglewQuerySwapGroupNV) #define wglResetFrameCountNV WGLEW_GET_FUN(__wglewResetFrameCountNV) #define WGLEW_NV_swap_group WGLEW_GET_VAR(__WGLEW_NV_swap_group) #endif /* WGL_NV_swap_group */ /* ----------------------- WGL_NV_vertex_array_range ----------------------- */ #ifndef WGL_NV_vertex_array_range #define WGL_NV_vertex_array_range 1 typedef void * (WINAPI * PFNWGLALLOCATEMEMORYNVPROC) (GLsizei size, GLfloat readFrequency, GLfloat writeFrequency, GLfloat priority); typedef void (WINAPI * PFNWGLFREEMEMORYNVPROC) (void *pointer); #define wglAllocateMemoryNV WGLEW_GET_FUN(__wglewAllocateMemoryNV) #define wglFreeMemoryNV WGLEW_GET_FUN(__wglewFreeMemoryNV) #define WGLEW_NV_vertex_array_range WGLEW_GET_VAR(__WGLEW_NV_vertex_array_range) #endif /* WGL_NV_vertex_array_range */ /* -------------------------- WGL_NV_video_capture ------------------------- */ #ifndef WGL_NV_video_capture #define WGL_NV_video_capture 1 #define WGL_UNIQUE_ID_NV 0x20CE #define WGL_NUM_VIDEO_CAPTURE_SLOTS_NV 0x20CF DECLARE_HANDLE(HVIDEOINPUTDEVICENV); typedef BOOL (WINAPI * PFNWGLBINDVIDEOCAPTUREDEVICENVPROC) (UINT uVideoSlot, HVIDEOINPUTDEVICENV hDevice); typedef UINT (WINAPI * PFNWGLENUMERATEVIDEOCAPTUREDEVICESNVPROC) (HDC hDc, HVIDEOINPUTDEVICENV* phDeviceList); typedef BOOL (WINAPI * PFNWGLLOCKVIDEOCAPTUREDEVICENVPROC) (HDC hDc, HVIDEOINPUTDEVICENV hDevice); typedef BOOL (WINAPI * PFNWGLQUERYVIDEOCAPTUREDEVICENVPROC) (HDC hDc, HVIDEOINPUTDEVICENV hDevice, int iAttribute, int* piValue); typedef BOOL (WINAPI * PFNWGLRELEASEVIDEOCAPTUREDEVICENVPROC) (HDC hDc, HVIDEOINPUTDEVICENV hDevice); #define wglBindVideoCaptureDeviceNV WGLEW_GET_FUN(__wglewBindVideoCaptureDeviceNV) #define wglEnumerateVideoCaptureDevicesNV WGLEW_GET_FUN(__wglewEnumerateVideoCaptureDevicesNV) #define wglLockVideoCaptureDeviceNV WGLEW_GET_FUN(__wglewLockVideoCaptureDeviceNV) #define wglQueryVideoCaptureDeviceNV WGLEW_GET_FUN(__wglewQueryVideoCaptureDeviceNV) #define wglReleaseVideoCaptureDeviceNV WGLEW_GET_FUN(__wglewReleaseVideoCaptureDeviceNV) #define WGLEW_NV_video_capture WGLEW_GET_VAR(__WGLEW_NV_video_capture) #endif /* WGL_NV_video_capture */ /* -------------------------- WGL_NV_video_output -------------------------- */ #ifndef WGL_NV_video_output #define WGL_NV_video_output 1 #define WGL_BIND_TO_VIDEO_RGB_NV 0x20C0 #define WGL_BIND_TO_VIDEO_RGBA_NV 0x20C1 #define WGL_BIND_TO_VIDEO_RGB_AND_DEPTH_NV 0x20C2 #define WGL_VIDEO_OUT_COLOR_NV 0x20C3 #define WGL_VIDEO_OUT_ALPHA_NV 0x20C4 #define WGL_VIDEO_OUT_DEPTH_NV 0x20C5 #define WGL_VIDEO_OUT_COLOR_AND_ALPHA_NV 0x20C6 #define WGL_VIDEO_OUT_COLOR_AND_DEPTH_NV 0x20C7 #define WGL_VIDEO_OUT_FRAME 0x20C8 #define WGL_VIDEO_OUT_FIELD_1 0x20C9 #define WGL_VIDEO_OUT_FIELD_2 0x20CA #define WGL_VIDEO_OUT_STACKED_FIELDS_1_2 0x20CB #define WGL_VIDEO_OUT_STACKED_FIELDS_2_1 0x20CC DECLARE_HANDLE(HPVIDEODEV); typedef BOOL (WINAPI * PFNWGLBINDVIDEOIMAGENVPROC) (HPVIDEODEV hVideoDevice, HPBUFFERARB hPbuffer, int iVideoBuffer); typedef BOOL (WINAPI * PFNWGLGETVIDEODEVICENVPROC) (HDC hDC, int numDevices, HPVIDEODEV* hVideoDevice); typedef BOOL (WINAPI * PFNWGLGETVIDEOINFONVPROC) (HPVIDEODEV hpVideoDevice, unsigned long* pulCounterOutputPbuffer, unsigned long *pulCounterOutputVideo); typedef BOOL (WINAPI * PFNWGLRELEASEVIDEODEVICENVPROC) (HPVIDEODEV hVideoDevice); typedef BOOL (WINAPI * PFNWGLRELEASEVIDEOIMAGENVPROC) (HPBUFFERARB hPbuffer, int iVideoBuffer); typedef BOOL (WINAPI * PFNWGLSENDPBUFFERTOVIDEONVPROC) (HPBUFFERARB hPbuffer, int iBufferType, unsigned long* pulCounterPbuffer, BOOL bBlock); #define wglBindVideoImageNV WGLEW_GET_FUN(__wglewBindVideoImageNV) #define wglGetVideoDeviceNV WGLEW_GET_FUN(__wglewGetVideoDeviceNV) #define wglGetVideoInfoNV WGLEW_GET_FUN(__wglewGetVideoInfoNV) #define wglReleaseVideoDeviceNV WGLEW_GET_FUN(__wglewReleaseVideoDeviceNV) #define wglReleaseVideoImageNV WGLEW_GET_FUN(__wglewReleaseVideoImageNV) #define wglSendPbufferToVideoNV WGLEW_GET_FUN(__wglewSendPbufferToVideoNV) #define WGLEW_NV_video_output WGLEW_GET_VAR(__WGLEW_NV_video_output) #endif /* WGL_NV_video_output */ /* -------------------------- WGL_OML_sync_control ------------------------- */ #ifndef WGL_OML_sync_control #define WGL_OML_sync_control 1 typedef BOOL (WINAPI * PFNWGLGETMSCRATEOMLPROC) (HDC hdc, INT32* numerator, INT32 *denominator); typedef BOOL (WINAPI * PFNWGLGETSYNCVALUESOMLPROC) (HDC hdc, INT64* ust, INT64 *msc, INT64 *sbc); typedef INT64 (WINAPI * PFNWGLSWAPBUFFERSMSCOMLPROC) (HDC hdc, INT64 target_msc, INT64 divisor, INT64 remainder); typedef INT64 (WINAPI * PFNWGLSWAPLAYERBUFFERSMSCOMLPROC) (HDC hdc, INT fuPlanes, INT64 target_msc, INT64 divisor, INT64 remainder); typedef BOOL (WINAPI * PFNWGLWAITFORMSCOMLPROC) (HDC hdc, INT64 target_msc, INT64 divisor, INT64 remainder, INT64* ust, INT64 *msc, INT64 *sbc); typedef BOOL (WINAPI * PFNWGLWAITFORSBCOMLPROC) (HDC hdc, INT64 target_sbc, INT64* ust, INT64 *msc, INT64 *sbc); #define wglGetMscRateOML WGLEW_GET_FUN(__wglewGetMscRateOML) #define wglGetSyncValuesOML WGLEW_GET_FUN(__wglewGetSyncValuesOML) #define wglSwapBuffersMscOML WGLEW_GET_FUN(__wglewSwapBuffersMscOML) #define wglSwapLayerBuffersMscOML WGLEW_GET_FUN(__wglewSwapLayerBuffersMscOML) #define wglWaitForMscOML WGLEW_GET_FUN(__wglewWaitForMscOML) #define wglWaitForSbcOML WGLEW_GET_FUN(__wglewWaitForSbcOML) #define WGLEW_OML_sync_control WGLEW_GET_VAR(__WGLEW_OML_sync_control) #endif /* WGL_OML_sync_control */ /* ------------------------------------------------------------------------- */ #define WGLEW_FUN_EXPORT extern #define WGLEW_VAR_EXPORT extern #ifdef GLEW_MX struct WGLEWContextStruct { #endif /* GLEW_MX */ WGLEW_FUN_EXPORT PFNWGLSETSTEREOEMITTERSTATE3DLPROC __wglewSetStereoEmitterState3DL; WGLEW_FUN_EXPORT PFNWGLBLITCONTEXTFRAMEBUFFERAMDPROC __wglewBlitContextFramebufferAMD; WGLEW_FUN_EXPORT PFNWGLCREATEASSOCIATEDCONTEXTAMDPROC __wglewCreateAssociatedContextAMD; WGLEW_FUN_EXPORT PFNWGLCREATEASSOCIATEDCONTEXTATTRIBSAMDPROC __wglewCreateAssociatedContextAttribsAMD; WGLEW_FUN_EXPORT PFNWGLDELETEASSOCIATEDCONTEXTAMDPROC __wglewDeleteAssociatedContextAMD; WGLEW_FUN_EXPORT PFNWGLGETCONTEXTGPUIDAMDPROC __wglewGetContextGPUIDAMD; WGLEW_FUN_EXPORT PFNWGLGETCURRENTASSOCIATEDCONTEXTAMDPROC __wglewGetCurrentAssociatedContextAMD; WGLEW_FUN_EXPORT PFNWGLGETGPUIDSAMDPROC __wglewGetGPUIDsAMD; WGLEW_FUN_EXPORT PFNWGLGETGPUINFOAMDPROC __wglewGetGPUInfoAMD; WGLEW_FUN_EXPORT PFNWGLMAKEASSOCIATEDCONTEXTCURRENTAMDPROC __wglewMakeAssociatedContextCurrentAMD; WGLEW_FUN_EXPORT PFNWGLCREATEBUFFERREGIONARBPROC __wglewCreateBufferRegionARB; WGLEW_FUN_EXPORT PFNWGLDELETEBUFFERREGIONARBPROC __wglewDeleteBufferRegionARB; WGLEW_FUN_EXPORT PFNWGLRESTOREBUFFERREGIONARBPROC __wglewRestoreBufferRegionARB; WGLEW_FUN_EXPORT PFNWGLSAVEBUFFERREGIONARBPROC __wglewSaveBufferRegionARB; WGLEW_FUN_EXPORT PFNWGLCREATECONTEXTATTRIBSARBPROC __wglewCreateContextAttribsARB; WGLEW_FUN_EXPORT PFNWGLGETEXTENSIONSSTRINGARBPROC __wglewGetExtensionsStringARB; WGLEW_FUN_EXPORT PFNWGLGETCURRENTREADDCARBPROC __wglewGetCurrentReadDCARB; WGLEW_FUN_EXPORT PFNWGLMAKECONTEXTCURRENTARBPROC __wglewMakeContextCurrentARB; WGLEW_FUN_EXPORT PFNWGLCREATEPBUFFERARBPROC __wglewCreatePbufferARB; WGLEW_FUN_EXPORT PFNWGLDESTROYPBUFFERARBPROC __wglewDestroyPbufferARB; WGLEW_FUN_EXPORT PFNWGLGETPBUFFERDCARBPROC __wglewGetPbufferDCARB; WGLEW_FUN_EXPORT PFNWGLQUERYPBUFFERARBPROC __wglewQueryPbufferARB; WGLEW_FUN_EXPORT PFNWGLRELEASEPBUFFERDCARBPROC __wglewReleasePbufferDCARB; WGLEW_FUN_EXPORT PFNWGLCHOOSEPIXELFORMATARBPROC __wglewChoosePixelFormatARB; WGLEW_FUN_EXPORT PFNWGLGETPIXELFORMATATTRIBFVARBPROC __wglewGetPixelFormatAttribfvARB; WGLEW_FUN_EXPORT PFNWGLGETPIXELFORMATATTRIBIVARBPROC __wglewGetPixelFormatAttribivARB; WGLEW_FUN_EXPORT PFNWGLBINDTEXIMAGEARBPROC __wglewBindTexImageARB; WGLEW_FUN_EXPORT PFNWGLRELEASETEXIMAGEARBPROC __wglewReleaseTexImageARB; WGLEW_FUN_EXPORT PFNWGLSETPBUFFERATTRIBARBPROC __wglewSetPbufferAttribARB; WGLEW_FUN_EXPORT PFNWGLBINDDISPLAYCOLORTABLEEXTPROC __wglewBindDisplayColorTableEXT; WGLEW_FUN_EXPORT PFNWGLCREATEDISPLAYCOLORTABLEEXTPROC __wglewCreateDisplayColorTableEXT; WGLEW_FUN_EXPORT PFNWGLDESTROYDISPLAYCOLORTABLEEXTPROC __wglewDestroyDisplayColorTableEXT; WGLEW_FUN_EXPORT PFNWGLLOADDISPLAYCOLORTABLEEXTPROC __wglewLoadDisplayColorTableEXT; WGLEW_FUN_EXPORT PFNWGLGETEXTENSIONSSTRINGEXTPROC __wglewGetExtensionsStringEXT; WGLEW_FUN_EXPORT PFNWGLGETCURRENTREADDCEXTPROC __wglewGetCurrentReadDCEXT; WGLEW_FUN_EXPORT PFNWGLMAKECONTEXTCURRENTEXTPROC __wglewMakeContextCurrentEXT; WGLEW_FUN_EXPORT PFNWGLCREATEPBUFFEREXTPROC __wglewCreatePbufferEXT; WGLEW_FUN_EXPORT PFNWGLDESTROYPBUFFEREXTPROC __wglewDestroyPbufferEXT; WGLEW_FUN_EXPORT PFNWGLGETPBUFFERDCEXTPROC __wglewGetPbufferDCEXT; WGLEW_FUN_EXPORT PFNWGLQUERYPBUFFEREXTPROC __wglewQueryPbufferEXT; WGLEW_FUN_EXPORT PFNWGLRELEASEPBUFFERDCEXTPROC __wglewReleasePbufferDCEXT; WGLEW_FUN_EXPORT PFNWGLCHOOSEPIXELFORMATEXTPROC __wglewChoosePixelFormatEXT; WGLEW_FUN_EXPORT PFNWGLGETPIXELFORMATATTRIBFVEXTPROC __wglewGetPixelFormatAttribfvEXT; WGLEW_FUN_EXPORT PFNWGLGETPIXELFORMATATTRIBIVEXTPROC __wglewGetPixelFormatAttribivEXT; WGLEW_FUN_EXPORT PFNWGLGETSWAPINTERVALEXTPROC __wglewGetSwapIntervalEXT; WGLEW_FUN_EXPORT PFNWGLSWAPINTERVALEXTPROC __wglewSwapIntervalEXT; WGLEW_FUN_EXPORT PFNWGLGETDIGITALVIDEOPARAMETERSI3DPROC __wglewGetDigitalVideoParametersI3D; WGLEW_FUN_EXPORT PFNWGLSETDIGITALVIDEOPARAMETERSI3DPROC __wglewSetDigitalVideoParametersI3D; WGLEW_FUN_EXPORT PFNWGLGETGAMMATABLEI3DPROC __wglewGetGammaTableI3D; WGLEW_FUN_EXPORT PFNWGLGETGAMMATABLEPARAMETERSI3DPROC __wglewGetGammaTableParametersI3D; WGLEW_FUN_EXPORT PFNWGLSETGAMMATABLEI3DPROC __wglewSetGammaTableI3D; WGLEW_FUN_EXPORT PFNWGLSETGAMMATABLEPARAMETERSI3DPROC __wglewSetGammaTableParametersI3D; WGLEW_FUN_EXPORT PFNWGLDISABLEGENLOCKI3DPROC __wglewDisableGenlockI3D; WGLEW_FUN_EXPORT PFNWGLENABLEGENLOCKI3DPROC __wglewEnableGenlockI3D; WGLEW_FUN_EXPORT PFNWGLGENLOCKSAMPLERATEI3DPROC __wglewGenlockSampleRateI3D; WGLEW_FUN_EXPORT PFNWGLGENLOCKSOURCEDELAYI3DPROC __wglewGenlockSourceDelayI3D; WGLEW_FUN_EXPORT PFNWGLGENLOCKSOURCEEDGEI3DPROC __wglewGenlockSourceEdgeI3D; WGLEW_FUN_EXPORT PFNWGLGENLOCKSOURCEI3DPROC __wglewGenlockSourceI3D; WGLEW_FUN_EXPORT PFNWGLGETGENLOCKSAMPLERATEI3DPROC __wglewGetGenlockSampleRateI3D; WGLEW_FUN_EXPORT PFNWGLGETGENLOCKSOURCEDELAYI3DPROC __wglewGetGenlockSourceDelayI3D; WGLEW_FUN_EXPORT PFNWGLGETGENLOCKSOURCEEDGEI3DPROC __wglewGetGenlockSourceEdgeI3D; WGLEW_FUN_EXPORT PFNWGLGETGENLOCKSOURCEI3DPROC __wglewGetGenlockSourceI3D; WGLEW_FUN_EXPORT PFNWGLISENABLEDGENLOCKI3DPROC __wglewIsEnabledGenlockI3D; WGLEW_FUN_EXPORT PFNWGLQUERYGENLOCKMAXSOURCEDELAYI3DPROC __wglewQueryGenlockMaxSourceDelayI3D; WGLEW_FUN_EXPORT PFNWGLASSOCIATEIMAGEBUFFEREVENTSI3DPROC __wglewAssociateImageBufferEventsI3D; WGLEW_FUN_EXPORT PFNWGLCREATEIMAGEBUFFERI3DPROC __wglewCreateImageBufferI3D; WGLEW_FUN_EXPORT PFNWGLDESTROYIMAGEBUFFERI3DPROC __wglewDestroyImageBufferI3D; WGLEW_FUN_EXPORT PFNWGLRELEASEIMAGEBUFFEREVENTSI3DPROC __wglewReleaseImageBufferEventsI3D; WGLEW_FUN_EXPORT PFNWGLDISABLEFRAMELOCKI3DPROC __wglewDisableFrameLockI3D; WGLEW_FUN_EXPORT PFNWGLENABLEFRAMELOCKI3DPROC __wglewEnableFrameLockI3D; WGLEW_FUN_EXPORT PFNWGLISENABLEDFRAMELOCKI3DPROC __wglewIsEnabledFrameLockI3D; WGLEW_FUN_EXPORT PFNWGLQUERYFRAMELOCKMASTERI3DPROC __wglewQueryFrameLockMasterI3D; WGLEW_FUN_EXPORT PFNWGLBEGINFRAMETRACKINGI3DPROC __wglewBeginFrameTrackingI3D; WGLEW_FUN_EXPORT PFNWGLENDFRAMETRACKINGI3DPROC __wglewEndFrameTrackingI3D; WGLEW_FUN_EXPORT PFNWGLGETFRAMEUSAGEI3DPROC __wglewGetFrameUsageI3D; WGLEW_FUN_EXPORT PFNWGLQUERYFRAMETRACKINGI3DPROC __wglewQueryFrameTrackingI3D; WGLEW_FUN_EXPORT PFNWGLDXCLOSEDEVICENVPROC __wglewDXCloseDeviceNV; WGLEW_FUN_EXPORT PFNWGLDXLOCKOBJECTSNVPROC __wglewDXLockObjectsNV; WGLEW_FUN_EXPORT PFNWGLDXOBJECTACCESSNVPROC __wglewDXObjectAccessNV; WGLEW_FUN_EXPORT PFNWGLDXOPENDEVICENVPROC __wglewDXOpenDeviceNV; WGLEW_FUN_EXPORT PFNWGLDXREGISTEROBJECTNVPROC __wglewDXRegisterObjectNV; WGLEW_FUN_EXPORT PFNWGLDXSETRESOURCESHAREHANDLENVPROC __wglewDXSetResourceShareHandleNV; WGLEW_FUN_EXPORT PFNWGLDXUNLOCKOBJECTSNVPROC __wglewDXUnlockObjectsNV; WGLEW_FUN_EXPORT PFNWGLDXUNREGISTEROBJECTNVPROC __wglewDXUnregisterObjectNV; WGLEW_FUN_EXPORT PFNWGLCOPYIMAGESUBDATANVPROC __wglewCopyImageSubDataNV; WGLEW_FUN_EXPORT PFNWGLCREATEAFFINITYDCNVPROC __wglewCreateAffinityDCNV; WGLEW_FUN_EXPORT PFNWGLDELETEDCNVPROC __wglewDeleteDCNV; WGLEW_FUN_EXPORT PFNWGLENUMGPUDEVICESNVPROC __wglewEnumGpuDevicesNV; WGLEW_FUN_EXPORT PFNWGLENUMGPUSFROMAFFINITYDCNVPROC __wglewEnumGpusFromAffinityDCNV; WGLEW_FUN_EXPORT PFNWGLENUMGPUSNVPROC __wglewEnumGpusNV; WGLEW_FUN_EXPORT PFNWGLBINDVIDEODEVICENVPROC __wglewBindVideoDeviceNV; WGLEW_FUN_EXPORT PFNWGLENUMERATEVIDEODEVICESNVPROC __wglewEnumerateVideoDevicesNV; WGLEW_FUN_EXPORT PFNWGLQUERYCURRENTCONTEXTNVPROC __wglewQueryCurrentContextNV; WGLEW_FUN_EXPORT PFNWGLBINDSWAPBARRIERNVPROC __wglewBindSwapBarrierNV; WGLEW_FUN_EXPORT PFNWGLJOINSWAPGROUPNVPROC __wglewJoinSwapGroupNV; WGLEW_FUN_EXPORT PFNWGLQUERYFRAMECOUNTNVPROC __wglewQueryFrameCountNV; WGLEW_FUN_EXPORT PFNWGLQUERYMAXSWAPGROUPSNVPROC __wglewQueryMaxSwapGroupsNV; WGLEW_FUN_EXPORT PFNWGLQUERYSWAPGROUPNVPROC __wglewQuerySwapGroupNV; WGLEW_FUN_EXPORT PFNWGLRESETFRAMECOUNTNVPROC __wglewResetFrameCountNV; WGLEW_FUN_EXPORT PFNWGLALLOCATEMEMORYNVPROC __wglewAllocateMemoryNV; WGLEW_FUN_EXPORT PFNWGLFREEMEMORYNVPROC __wglewFreeMemoryNV; WGLEW_FUN_EXPORT PFNWGLBINDVIDEOCAPTUREDEVICENVPROC __wglewBindVideoCaptureDeviceNV; WGLEW_FUN_EXPORT PFNWGLENUMERATEVIDEOCAPTUREDEVICESNVPROC __wglewEnumerateVideoCaptureDevicesNV; WGLEW_FUN_EXPORT PFNWGLLOCKVIDEOCAPTUREDEVICENVPROC __wglewLockVideoCaptureDeviceNV; WGLEW_FUN_EXPORT PFNWGLQUERYVIDEOCAPTUREDEVICENVPROC __wglewQueryVideoCaptureDeviceNV; WGLEW_FUN_EXPORT PFNWGLRELEASEVIDEOCAPTUREDEVICENVPROC __wglewReleaseVideoCaptureDeviceNV; WGLEW_FUN_EXPORT PFNWGLBINDVIDEOIMAGENVPROC __wglewBindVideoImageNV; WGLEW_FUN_EXPORT PFNWGLGETVIDEODEVICENVPROC __wglewGetVideoDeviceNV; WGLEW_FUN_EXPORT PFNWGLGETVIDEOINFONVPROC __wglewGetVideoInfoNV; WGLEW_FUN_EXPORT PFNWGLRELEASEVIDEODEVICENVPROC __wglewReleaseVideoDeviceNV; WGLEW_FUN_EXPORT PFNWGLRELEASEVIDEOIMAGENVPROC __wglewReleaseVideoImageNV; WGLEW_FUN_EXPORT PFNWGLSENDPBUFFERTOVIDEONVPROC __wglewSendPbufferToVideoNV; WGLEW_FUN_EXPORT PFNWGLGETMSCRATEOMLPROC __wglewGetMscRateOML; WGLEW_FUN_EXPORT PFNWGLGETSYNCVALUESOMLPROC __wglewGetSyncValuesOML; WGLEW_FUN_EXPORT PFNWGLSWAPBUFFERSMSCOMLPROC __wglewSwapBuffersMscOML; WGLEW_FUN_EXPORT PFNWGLSWAPLAYERBUFFERSMSCOMLPROC __wglewSwapLayerBuffersMscOML; WGLEW_FUN_EXPORT PFNWGLWAITFORMSCOMLPROC __wglewWaitForMscOML; WGLEW_FUN_EXPORT PFNWGLWAITFORSBCOMLPROC __wglewWaitForSbcOML; WGLEW_VAR_EXPORT GLboolean __WGLEW_3DFX_multisample; WGLEW_VAR_EXPORT GLboolean __WGLEW_3DL_stereo_control; WGLEW_VAR_EXPORT GLboolean __WGLEW_AMD_gpu_association; WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_buffer_region; WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_create_context; WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_create_context_profile; WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_create_context_robustness; WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_extensions_string; WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_framebuffer_sRGB; WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_make_current_read; WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_multisample; WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_pbuffer; WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_pixel_format; WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_pixel_format_float; WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_render_texture; WGLEW_VAR_EXPORT GLboolean __WGLEW_ATI_pixel_format_float; WGLEW_VAR_EXPORT GLboolean __WGLEW_ATI_render_texture_rectangle; WGLEW_VAR_EXPORT GLboolean __WGLEW_EXT_create_context_es2_profile; WGLEW_VAR_EXPORT GLboolean __WGLEW_EXT_create_context_es_profile; WGLEW_VAR_EXPORT GLboolean __WGLEW_EXT_depth_float; WGLEW_VAR_EXPORT GLboolean __WGLEW_EXT_display_color_table; WGLEW_VAR_EXPORT GLboolean __WGLEW_EXT_extensions_string; WGLEW_VAR_EXPORT GLboolean __WGLEW_EXT_framebuffer_sRGB; WGLEW_VAR_EXPORT GLboolean __WGLEW_EXT_make_current_read; WGLEW_VAR_EXPORT GLboolean __WGLEW_EXT_multisample; WGLEW_VAR_EXPORT GLboolean __WGLEW_EXT_pbuffer; WGLEW_VAR_EXPORT GLboolean __WGLEW_EXT_pixel_format; WGLEW_VAR_EXPORT GLboolean __WGLEW_EXT_pixel_format_packed_float; WGLEW_VAR_EXPORT GLboolean __WGLEW_EXT_swap_control; WGLEW_VAR_EXPORT GLboolean __WGLEW_EXT_swap_control_tear; WGLEW_VAR_EXPORT GLboolean __WGLEW_I3D_digital_video_control; WGLEW_VAR_EXPORT GLboolean __WGLEW_I3D_gamma; WGLEW_VAR_EXPORT GLboolean __WGLEW_I3D_genlock; WGLEW_VAR_EXPORT GLboolean __WGLEW_I3D_image_buffer; WGLEW_VAR_EXPORT GLboolean __WGLEW_I3D_swap_frame_lock; WGLEW_VAR_EXPORT GLboolean __WGLEW_I3D_swap_frame_usage; WGLEW_VAR_EXPORT GLboolean __WGLEW_NV_DX_interop; WGLEW_VAR_EXPORT GLboolean __WGLEW_NV_DX_interop2; WGLEW_VAR_EXPORT GLboolean __WGLEW_NV_copy_image; WGLEW_VAR_EXPORT GLboolean __WGLEW_NV_float_buffer; WGLEW_VAR_EXPORT GLboolean __WGLEW_NV_gpu_affinity; WGLEW_VAR_EXPORT GLboolean __WGLEW_NV_multisample_coverage; WGLEW_VAR_EXPORT GLboolean __WGLEW_NV_present_video; WGLEW_VAR_EXPORT GLboolean __WGLEW_NV_render_depth_texture; WGLEW_VAR_EXPORT GLboolean __WGLEW_NV_render_texture_rectangle; WGLEW_VAR_EXPORT GLboolean __WGLEW_NV_swap_group; WGLEW_VAR_EXPORT GLboolean __WGLEW_NV_vertex_array_range; WGLEW_VAR_EXPORT GLboolean __WGLEW_NV_video_capture; WGLEW_VAR_EXPORT GLboolean __WGLEW_NV_video_output; WGLEW_VAR_EXPORT GLboolean __WGLEW_OML_sync_control; #ifdef GLEW_MX }; /* WGLEWContextStruct */ #endif /* GLEW_MX */ /* ------------------------------------------------------------------------- */ #ifdef GLEW_MX typedef struct WGLEWContextStruct WGLEWContext; GLEWAPI GLenum GLEWAPIENTRY wglewContextInit (WGLEWContext *ctx); GLEWAPI GLboolean GLEWAPIENTRY wglewContextIsSupported (const WGLEWContext *ctx, const char *name); #define wglewInit() wglewContextInit(wglewGetContext()) #define wglewIsSupported(x) wglewContextIsSupported(wglewGetContext(), x) #define WGLEW_GET_VAR(x) (*(const GLboolean*)&(wglewGetContext()->x)) #define WGLEW_GET_FUN(x) wglewGetContext()->x #else /* GLEW_MX */ #define WGLEW_GET_VAR(x) (*(const GLboolean*)&x) #define WGLEW_GET_FUN(x) x GLEWAPI GLboolean GLEWAPIENTRY wglewIsSupported (const char *name); #endif /* GLEW_MX */ GLEWAPI GLboolean GLEWAPIENTRY wglewGetExtension (const char *name); #ifdef __cplusplus } #endif #undef GLEWAPI #endif /* __wglew_h__ */ plee-the-bear-20251226/bear-engine/core/src/visual/image.hpp000066400000000000000000000033251512343254000233640ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief An image class, used for sprites. * \author Julien Jorge */ #ifndef __VISUAL_IMAGE_HPP__ #define __VISUAL_IMAGE_HPP__ #include #include #include #include #include "visual/base_image.hpp" namespace bear { namespace visual { /** * \brief An image class, used for sprites. * \author Julien Jorge */ class VISUAL_EXPORT image { private: typedef claw::memory::smart_ptr base_image_ptr; public: image(); image( unsigned int width, unsigned int height ); explicit image( const claw::graphic::image& data ); void clear(); void restore( const claw::graphic::image& data ); unsigned int width() const; unsigned int height() const; claw::math::coordinate_2d size() const; bool has_transparency() const; bool is_valid() const; void draw ( const claw::graphic::image& data, claw::math::coordinate_2d pos ); claw::graphic::image read() const; const base_image* get_impl() const; private: /** * \brief The implementation of the image. * * The implementation is shared among the instances, thus if one of them * is restored or replaced then all instances of image becomes clean. */ claw::memory::smart_ptr m_impl; }; // class image } // namespace visual } // namespace bear #endif // __VISUAL_IMAGE_HPP__ plee-the-bear-20251226/bear-engine/core/src/visual/image_manager.hpp000066400000000000000000000037051512343254000250600ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A class to manage images resources. * \author Julien Jorge */ #ifndef __VISUAL_IMAGE_MANAGER_HPP__ #define __VISUAL_IMAGE_MANAGER_HPP__ #include "visual/image.hpp" #include "visual/shader_program.hpp" #include #include #include #include "visual/class_export.hpp" namespace bear { namespace visual { /** * \brief A class to manage images resources. * \author Julien Jorge */ class VISUAL_EXPORT image_manager { private: typedef std::unordered_map image_map_type; public: void clear(); void load_image( const std::string& name, std::istream& file ); void add_image( const std::string& name, const image& img ); void clear_images(); void restore_image( const std::string& name, std::istream& file ); image get_image( const std::string& name ) const; void get_image_names( std::vector& names ) const; bool exists( const std::string& name ) const; void load_shader_program( const std::string& name, std::istream& file ); void clear_shader_programs(); void restore_shader_program ( const std::string& name, std::istream& file ); shader_program get_shader_program( const std::string& name ) const; void get_shader_program_names( std::vector& names ) const; bool has_shader_program( const std::string& name ) const; private: /** \brief All the images. */ image_map_type m_images; /** \brief All the shader programs. */ std::unordered_map m_shader_program; }; // class image_manager } // namespace visual } // namespace bear #endif // __VISUAL_IMAGE_MANAGER_HPP__ plee-the-bear-20251226/bear-engine/core/src/visual/impl/000077500000000000000000000000001512343254000225275ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/core/src/visual/impl/scene_element_sequence.tpp000066400000000000000000000014241512343254000277530ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the visual::scene_element_sequence. * \author Julien Jorge */ /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param first Iterator of the first element of the sequence. * \param last Iterator just after the last element of the sequence. */ template bear::visual::scene_element_sequence::scene_element_sequence ( Iterator first, Iterator last ) : base_scene_element(0, 0), m_element(first, last) { } // scene_element_sequence::scene_element_sequence() plee-the-bear-20251226/bear-engine/core/src/visual/impl/shader_program.tpp000066400000000000000000000013671512343254000262600ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the template methods of * bear::visual::shader_program. * \author Julien Jorge */ /*----------------------------------------------------------------------------*/ /** * \brief Sets the value of a variable of the program. * \param name The name of the variable. * \param value The value of the variable. */ template void bear::visual::shader_program::set_variable ( const std::string& name, const T& value ) { m_input_variable.set( name, value ); } // shader_program::set_variable() plee-the-bear-20251226/bear-engine/core/src/visual/impl/text_layout.tpp000066400000000000000000000134031512343254000256360ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the template methods of bear::visual::text_layout. * \author Julien Jorge */ /*----------------------------------------------------------------------------*/ /** * \brief A function that arrange a text in a given box. A user-defined function * is called each time a word should be displayed. * * \b Template \b parameters: * - \a Func A function called each time a word should be displayed. * * \param func The function called when a word should be displayed. * * The signature of \a func be void func( position_type p, * std::size_t first, std::size_t last ) . The return * type can be different but will be ignored. The parameters of this function * are * - \a p The position in the box where the word starts. The y-coordinate is the * baseline of the glyphs. * - \a first The first character of the word to display, in the initial string. * - \a last The character just past the last character to display. */ template void bear::visual::text_layout::arrange_text( Func func ) const { std::size_t i=0; // The position on the Y-axis is computed such that the text starts on the // top of the box. cursor_type cursor ( compute_line_left(0), m_size.y - compute_line_height_above_baseline(0) ); const std::size_t text_size( m_text.size() ); // We allow to write outside the box if it is on less than one screen unit. while ( (cursor.y > -1) && (i != text_size) ) if ( m_text[i] == '\n' ) { ++i; cursor.y -= m_font.get_line_spacing(); cursor.x = compute_line_left(i); } else arrange_next_word( func, cursor, i ); } // text_layout::arrange_text() /*----------------------------------------------------------------------------*/ /** * \brief Find the next word and display it. * * \b Template \b parameters: * - \a Func A function called each time a word should be displayed. * * \param func The function called when a word should be displayed. * \param cursor (in/out) The position of the cursor in the component. * \param i (in/out) Index of the first character of the word. (out) Index of * the next character to print. * * The signature of \a func be void func( position_type p, * std::size_t first, std::size_t last ) . The return * type can be different but will be ignored. The parameters of this function * are * - \a p The position in the box where the word starts. The y-coordinate is the * baseline of the glyphs. * - \a first The first character of the word to display, in the initial string. * - \a last The character just past the last character to display. * * \sa arrange_text */ template void bear::visual::text_layout::arrange_next_word ( Func func, cursor_type& cursor, std::size_t& i ) const { // find the first word std::size_t word = m_text.find_first_not_of(' ', i); if (word == std::string::npos) i = m_text.size(); else if (m_text[word] == '\n') i = word; else { // the end of the word std::size_t space = m_text.find_first_of( " \n", word ); if (space == std::string::npos) space = m_text.size(); coordinate_type p( cursor.x ); std::size_t j( i ); bool fit_on_line(true); while ( fit_on_line && (j != space) ) { const size_type w ( m_font.get_metrics( m_text[ j ] ).get_advance().x ); if ( p + w <= m_size.x ) { p += w; ++j; } else fit_on_line = false; } // the word fits on the line if ( fit_on_line ) { const std::size_t word_length = space - i; arrange_word( func, cursor, i, word_length ); cursor.x = p; } else { if ( cursor.x == 0 ) { // the word doesn't fit on the full line const std::size_t line_length( j - word ); arrange_word( func, cursor, i, line_length ); } else { // We will retry at the begining of the line in the next // loop. We remove the spaces at the begining of the line. i = word; } cursor.y -= m_font.get_line_spacing(); cursor.x = compute_line_left(i); } } } // text_layout::arrange_next_word() /*----------------------------------------------------------------------------*/ /** * \brief Find the next word and display it. * * \b Template \b parameters: * - \a Func A function called each time a word should be displayed. * * \param func The function called when a word should be displayed. * \param cursor (in/out) The position of the cursor in the component. * \param i (in/out) Index of the first character of the word. (out) Index of * the next character to print. * \param n Number of characters to print. * * The signature of \a func be void func( position_type p, * std::size_t first, std::size_t last ) . The return * type can be different but will be ignored. The parameters of this function * are * - \a p The position in the box where the word starts. The y-coordinate is the * baseline of the glyphs. * - \a first The first character of the word to display, in the initial string. * - \a last The character just past the last character to display. * * \sa arrange_text * */ template void bear::visual::text_layout::arrange_word ( Func func, cursor_type& cursor, std::size_t& i, const std::size_t n ) const { func( cursor, i, i+n ); i += n; } // text_layout::arrange_word() plee-the-bear-20251226/bear-engine/core/src/visual/placed_sprite.hpp000066400000000000000000000024171512343254000251210ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A sprite and a position. * \author Julien Jorge */ #ifndef __VISUAL_PLACED_SPRITE_HPP__ #define __VISUAL_PLACED_SPRITE_HPP__ #include "visual/sprite.hpp" #include "visual/types.hpp" #include "visual/class_export.hpp" namespace bear { namespace visual { /** * \brief A sprite and a position. * \author Julien Jorge */ class VISUAL_EXPORT placed_sprite { public: placed_sprite(); placed_sprite( coordinate_type x, coordinate_type y, const sprite& s ); placed_sprite( const position_type& p, const sprite& s ); const sprite& get_sprite() const; sprite& get_sprite(); void set_sprite( const sprite& spr ); const position_type& get_position() const; position_type& get_position(); void set_position( const position_type& p ); private: /** \brief The sprite. */ sprite m_sprite; /** \brief The position. */ position_type m_position; }; // class placed_sprite } // namespace visual } // namespace bear #endif // __VISUAL_PLACED_SPRITE_HPP__ plee-the-bear-20251226/bear-engine/core/src/visual/scene_element.hpp000066400000000000000000000050551512343254000251120ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A proxy for all base_scene_element derivated classes. * \author Julien Jorge */ #ifndef __VISUAL_SCENE_ELEMENT_HPP__ #define __VISUAL_SCENE_ELEMENT_HPP__ #include "visual/base_scene_element.hpp" #include "visual/class_export.hpp" #include namespace bear { namespace visual { /** * \brief A proxy for all base_scene_element derivated classes. * \author Julien Jorge */ class VISUAL_EXPORT scene_element { public: /** \brief A list of elements of the scene. */ typedef base_scene_element::scene_element_list scene_element_list; /** \brief A list of rectangles. */ typedef base_scene_element::rectangle_list rectangle_list; public: scene_element( const base_scene_element& e = base_scene_element() ); scene_element( const scene_element& that ); ~scene_element(); scene_element& operator=( const scene_element& that ); rectangle_type get_opaque_box() const; rectangle_type get_bounding_box() const; void burst( const rectangle_list& boxes, scene_element_list& output ) const; void render( base_screen& scr ) const; const position_type& get_position() const; void set_position( const position_type& p ); void set_position( coordinate_type x, coordinate_type y ); bool has_shadow() const; const position_type& get_shadow() const; void set_shadow( const position_type& p ); void set_shadow( coordinate_type x, coordinate_type y ); double get_shadow_opacity() const; void set_shadow_opacity( double o ); void set_scale_factor( double x, double y ); void set_scale_factor( double r ); double get_scale_factor_x() const; double get_scale_factor_y() const; size_type get_element_width() const; size_type get_element_height() const; size_type get_width() const; size_type get_height() const; void set_rendering_attributes( const bitmap_rendering_attributes& a ); const bitmap_rendering_attributes& get_rendering_attributes() const; bitmap_rendering_attributes& get_rendering_attributes(); bool always_displayed() const; private: /** \brief The real visual. */ base_scene_element* m_elem; }; // class scene_element } // namespace visual } // namespace bear #endif // __VISUAL_SCENE_ELEMENT_HPP__ plee-the-bear-20251226/bear-engine/core/src/visual/scene_element_sequence.hpp000066400000000000000000000031511512343254000267750ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A sequence of scene elements. * \author Julien Jorge */ #ifndef __VISUAL_SCENE_ELEMENT_SEQUENCE_HPP__ #define __VISUAL_SCENE_ELEMENT_SEQUENCE_HPP__ #include "visual/base_scene_element.hpp" #include "visual/class_export.hpp" namespace bear { namespace visual { /** * \brief A sequence of scene elements on the screen. * \author Julien Jorge */ class VISUAL_EXPORT scene_element_sequence: public base_scene_element { private: /** \brief The type of the container for the sub elements. */ typedef std::list sequence_type; public: scene_element_sequence(); template scene_element_sequence( Iterator first, Iterator last ); base_scene_element* clone() const; void push_back( const scene_element& e ); void push_front( const scene_element& e ); rectangle_type get_opaque_box() const; rectangle_type get_bounding_box() const; void burst ( const rectangle_list& boxes, scene_element_list& output ) const; void render( base_screen& scr ) const; bool always_displayed() const; private: /** \brief The element_sequence. */ sequence_type m_element; }; // class scene_element_sequence } // namespace visual } // namespace bear #include "visual/impl/scene_element_sequence.tpp" #endif // __VISUAL_SCENE_ELEMENT_SEQUENCE_HPP__ plee-the-bear-20251226/bear-engine/core/src/visual/scene_line.hpp000066400000000000000000000026401512343254000244050ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A line on the screen. * \author Julien Jorge */ #ifndef __VISUAL_SCENE_LINE_HPP__ #define __VISUAL_SCENE_LINE_HPP__ #include "visual/base_scene_element.hpp" #include "visual/class_export.hpp" #include namespace bear { namespace visual { /** * \brief A line on the screen. * \author Julien Jorge */ class VISUAL_EXPORT scene_line: public base_scene_element { public: scene_line ( coordinate_type x, coordinate_type y, const color_type& color, const std::vector& p, double w ); base_scene_element* clone() const; rectangle_type get_opaque_box() const; rectangle_type get_bounding_box() const; void burst ( const rectangle_list& boxes, scene_element_list& output ) const; void render( base_screen& scr ) const; private: /** \brief The color of the line. */ const color_type m_color; /** \brief The vertices of the line. */ const std::vector m_points; /** \brief The width of the line. */ const double m_width; }; // class scene_line } // namespace visual } // namespace bear #endif // __VISUAL_SCENE_LINE_HPP__ plee-the-bear-20251226/bear-engine/core/src/visual/scene_polygon.hpp000066400000000000000000000025631512343254000251510ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A filled polygon on the screen. * \author Julien Jorge */ #ifndef __VISUAL_SCENE_POLYGON_HPP__ #define __VISUAL_SCENE_POLYGON_HPP__ #include "visual/base_scene_element.hpp" #include "visual/class_export.hpp" #include namespace bear { namespace visual { /** * \brief A filled polygon on the screen. * \author Julien Jorge */ class VISUAL_EXPORT scene_polygon: public base_scene_element { public: scene_polygon ( coordinate_type x, coordinate_type y, const color_type& color, const std::vector& p ); base_scene_element* clone() const; rectangle_type get_opaque_box() const; rectangle_type get_bounding_box() const; void burst ( const rectangle_list& boxes, scene_element_list& output ) const; void render( base_screen& scr ) const; private: /** \brief The color of the line. */ const color_type m_color; /** \brief The vertices of the line. */ const std::vector m_points; }; // class scene_polygon } // namespace visual } // namespace bear #endif // __VISUAL_SCENE_POLYGON_HPP__ plee-the-bear-20251226/bear-engine/core/src/visual/scene_rectangle.hpp000066400000000000000000000031501512343254000254170ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A filled rectangle on the screen. * \author Julien Jorge */ #ifndef __VISUAL_SCENE_RECTANGLE_HPP__ #define __VISUAL_SCENE_RECTANGLE_HPP__ #include "visual/base_scene_element.hpp" #include "visual/class_export.hpp" #include namespace bear { namespace visual { /** * \brief A rectangle on the screen, filled or not. * \author Julien Jorge */ class VISUAL_EXPORT scene_rectangle: public base_scene_element { public: scene_rectangle ( coordinate_type x, coordinate_type y, const color_type& color, const rectangle_type& r, bool fill = true, size_type border_weight = 1 ); base_scene_element* clone() const; rectangle_type get_opaque_box() const; rectangle_type get_bounding_box() const; void burst ( const rectangle_list& boxes, scene_element_list& output ) const; void render( base_screen& scr ) const; private: /** \brief The color of the line. */ const color_type m_color; /** \brief The rectangle to draw. */ const rectangle_type m_rectangle; /** \brief Tell if the rectangle is filled or not. */ const bool m_fill; /** \brief The width of the border for a not filled rectangle. */ const size_type m_border_weight; }; // class scene_rectangle } // namespace visual } // namespace bear #endif // __VISUAL_SCENE_RECTANGLE_HPP__ plee-the-bear-20251226/bear-engine/core/src/visual/scene_shader_pop.hpp000066400000000000000000000022221512343254000255760ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Removes the current shader program. * \author Julien Jorge */ #ifndef __VISUAL_SCENE_SHADER_POP_HPP__ #define __VISUAL_SCENE_SHADER_POP_HPP__ #include "visual/base_scene_element.hpp" #include "visual/shader_program.hpp" #include "visual/class_export.hpp" namespace bear { namespace visual { /** * \brief Removes the current shader program. * \author Julien Jorge */ class VISUAL_EXPORT scene_shader_pop: public base_scene_element { public: scene_shader_pop(); base_scene_element* clone() const; rectangle_type get_opaque_box() const; rectangle_type get_bounding_box() const; void burst ( const rectangle_list& boxes, scene_element_list& output ) const; void render( base_screen& scr ) const; bool always_displayed() const; }; // class scene_shader_pop } // namespace visual } // namespace bear #endif // __VISUAL_SCENE_SHADER_POP_HPP__ plee-the-bear-20251226/bear-engine/core/src/visual/scene_shader_push.hpp000066400000000000000000000025111512343254000257600ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Enables a shader program for the next scene elements. * \author Julien Jorge */ #ifndef __VISUAL_SCENE_SHADER_PUSH_HPP__ #define __VISUAL_SCENE_SHADER_PUSH_HPP__ #include "visual/base_scene_element.hpp" #include "visual/shader_program.hpp" #include "visual/class_export.hpp" namespace bear { namespace visual { /** * \brief Enables a shader program for the next scene elements. * \author Julien Jorge */ class VISUAL_EXPORT scene_shader_push: public base_scene_element { public: scene_shader_push( shader_program p ); base_scene_element* clone() const; rectangle_type get_opaque_box() const; rectangle_type get_bounding_box() const; void burst ( const rectangle_list& boxes, scene_element_list& output ) const; void render( base_screen& scr ) const; bool always_displayed() const; private: /** \brief The shader to use when rendering the next elements. */ const shader_program m_shader; }; // class scene_shader_push } // namespace visual } // namespace bear #endif // __VISUAL_SCENE_SHADER_PUSH_HPP__ plee-the-bear-20251226/bear-engine/core/src/visual/scene_sprite.hpp000066400000000000000000000037611512343254000247710ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A sprite on the screen. * \author Julien Jorge */ #ifndef __VISUAL_SCENE_SPRITE_HPP__ #define __VISUAL_SCENE_SPRITE_HPP__ #include "visual/base_scene_element.hpp" #include "visual/sprite.hpp" #include "visual/class_export.hpp" namespace bear { namespace visual { /** * \brief A sprite on the screen. * \author Julien Jorge */ class VISUAL_EXPORT scene_sprite: public base_scene_element { public: scene_sprite( coordinate_type x, coordinate_type y, const sprite& s ); base_scene_element* clone() const; rectangle_type get_opaque_box() const; rectangle_type get_bounding_box() const; void burst ( const rectangle_list& boxes, scene_element_list& output ) const; void render( base_screen& scr ) const; private: void set_sprite( const sprite& spr ); void update_side_box ( const position_type& pos, const position_type& center, position_type& left_bottom, position_type& right_top ) const; void flip_values_on_axis ( coordinate_type& a, coordinate_type& b, coordinate_type z ) const; rectangle_type scale_rectangle( const rectangle_type& r ) const; rectangle_type unscale_rectangle( const rectangle_type& r ) const; scene_sprite burst ( const rectangle_type& box, const rectangle_type& clip_inter ) const; rectangle_type get_burst_opaque_box ( const rectangle_type& box, const rectangle_type& unscaled_clip ) const; claw::math::rectangle get_burst_clip ( const rectangle_type& unscaled_clip ) const; private: /** \brief The sprite. */ sprite m_sprite; }; // class scene_sprite } // namespace visual } // namespace bear #endif // __VISUAL_SCENE_SPRITE_HPP__ plee-the-bear-20251226/bear-engine/core/src/visual/scene_star.hpp000066400000000000000000000034701512343254000244310ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A star on the screen. * \author Julien Jorge */ #ifndef __VISUAL_SCENE_STAR_HPP__ #define __VISUAL_SCENE_STAR_HPP__ #include "visual/base_scene_element.hpp" #include "visual/star.hpp" #include "visual/class_export.hpp" #include namespace bear { namespace visual { /** * \brief A star on the screen, filled or not. * \author Julien Jorge */ class VISUAL_EXPORT scene_star: public base_scene_element { public: scene_star ( coordinate_type x, coordinate_type y, const color_type& color, const star& s, double border_width = 1, const color_type& fill_color = claw::graphic::transparent_pixel ); base_scene_element* clone() const; rectangle_type get_opaque_box() const; void render( base_screen& scr ) const; position_type get_center() const; private: void render_inside ( base_screen& scr, const std::vector& coordinates ) const; void render_border ( base_screen& scr, const std::vector& coordinates ) const; void compute_coordinates( std::vector& coordinates ) const; private: /** \brief The color of the line. */ const color_type m_color; /** \brief The width of the border. */ const double m_border_width; /** \brief The color of the inside of the star. */ const color_type m_fill_color; /** \brief The star to display. */ const star m_star; }; // class scene_star } // namespace visual } // namespace bear #endif // __VISUAL_SCENE_STAR_HPP__ plee-the-bear-20251226/bear-engine/core/src/visual/scene_writing.hpp000066400000000000000000000025631512343254000251450ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A writing on the screen. * \author Julien Jorge */ #ifndef __VISUAL_SCENE_WRITING_HPP__ #define __VISUAL_SCENE_WRITING_HPP__ #include "visual/base_scene_element.hpp" #include "visual/writing.hpp" #include "visual/class_export.hpp" namespace bear { namespace visual { /** * \brief A writing on the screen. * \author Julien Jorge */ class VISUAL_EXPORT scene_writing: public base_scene_element { private: /** \brief The type of the writing to display. */ typedef writing writing_type; public: scene_writing( coordinate_type x, coordinate_type y, const writing& s ); base_scene_element* clone() const; rectangle_type get_opaque_box() const; rectangle_type get_bounding_box() const; void burst ( const rectangle_list& boxes, scene_element_list& output ) const; void render( base_screen& scr ) const; void render( const bitmap_writing& w, base_screen& scr ) const; private: /** \brief The writing. */ const writing m_writing; }; // class scene_writing } // namespace visual } // namespace bear #endif // __VISUAL_SCENE_WRITING_HPP__ plee-the-bear-20251226/bear-engine/core/src/visual/screen.hpp000066400000000000000000000066411512343254000235650ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief The screen surface, where drawing & blitting is done. * \author Julien Jorge */ #ifndef __VISUAL_SCREEN_HPP__ #define __VISUAL_SCREEN_HPP__ #include "visual/capture.hpp" #include "visual/scene_element.hpp" #include "visual/class_export.hpp" #include namespace bear { namespace visual { /** * \brief The screen surface, where drawing & blitting is done. * \author Julien Jorge */ class VISUAL_EXPORT screen { public: /** \brief The subsystem selected for rendering. */ enum sub_system { screen_gl, screen_undef }; // enum_sub_system private: /** \brief A list of elements of the scene. */ typedef std::list scene_element_list; /** \brief A list of rectangles. */ typedef std::list rectangle_list; /** \brief Defined the current screen process. */ enum screen_status { SCREEN_IDLE, SCREEN_RENDER }; // enum screen_status public: static void initialize( sub_system sub_sys ); static void release(); static sub_system get_sub_system(); screen( const claw::math::coordinate_2d& size, const std::string& title="", bool full=false ); ~screen(); void pause(); void unpause(); void fullscreen( bool b ); claw::math::coordinate_2d get_size() const; claw::math::coordinate_2d get_viewport_size() const; claw::math::coordinate_2d get_container_size() const; void set_opaque_box_visible( bool b ); void set_dumb_rendering( bool b ); bool get_dumb_rendering() const; void set_background_color( const color_type& c ); color_type get_background_color() const; void begin_render(); void render( const scene_element& e ); void end_render(); void shot( const std::string& bitmap_name ) const; void shot( claw::graphic::image& img ) const; capture capture_scene() const; private: void render_opaque_box( const scene_element& e ) const; void render_element( const scene_element& e ) const; void render_elements(); bool intersects_any ( const rectangle_type& r, const rectangle_list& boxes ) const; void split ( const scene_element& e, scene_element_list& output, rectangle_list& boxes ) const; void subtract ( const rectangle_type& a, const rectangle_type& b, rectangle_list& result ) const; private: /** \brief True if we are rendering. */ screen_status m_mode; /** \brief The width and height of the screen. */ base_screen* m_impl; /** \brief The elements to render. */ scene_element_list m_scene_element; /** \brief This flag turns on the rendering of the opaque boxes. */ bool m_render_opaque_box; /** \brief This flag turns on the use of the simple rendering procedure. */ bool m_dumb_rendering; /** \brief The subsystem used for rendering. */ static sub_system s_sub_system; }; // class screen } // namespace visual } // namespace bear #endif // __VISUAL_SCREEN_HPP__ plee-the-bear-20251226/bear-engine/core/src/visual/sdl_error.hpp000066400000000000000000000017141512343254000242750ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Error management for SDL. * \author Julien Jorge */ #ifndef __VISUAL_SDL_ERROR_HPP__ #define __VISUAL_SDL_ERROR_HPP__ #include "visual/class_export.hpp" #include #define VISUAL_SDL_ERROR_THROW() \ bear::visual::sdl_error::throw_on_error \ ( std::string(__FILE__) + ':' + __FUNCTION__, __LINE__ ) namespace bear { namespace visual { /** * \brief Error management for SDL. * \author Julien Jorge */ class VISUAL_EXPORT sdl_error { public: static void throw_on_error ( const std::string& function, unsigned int line ); }; // class sdl_error } // namespace visual } // namespace bear #endif // __VISUAL_SDL_ERROR_HPP__ plee-the-bear-20251226/bear-engine/core/src/visual/sequence_effect.hpp000066400000000000000000000033241512343254000254250ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief An effect that can be applied to a sequence of elements. * \author Julien Jorge */ #ifndef __VISUAL_SEQUENCE_EFFECT_HPP__ #define __VISUAL_SEQUENCE_EFFECT_HPP__ #include "visual/types.hpp" #include "visual/class_export.hpp" #include namespace bear { namespace visual { /** * \brief An effect that can be applied to a sequence of elements. * \author Julien Jorge */ class VISUAL_EXPORT sequence_effect { public: sequence_effect(); void add_color( color_type c ); color_type get_color( std::size_t i ) const; void set_wave_length( std::size_t length ); void set_wave_height( size_type h ); void set_wave_speed( size_type s ); void set_decrease_coefficient( size_type coefficient ); position_type get_delta( std::size_t i ) const; void update( double t ); private: /** \brief The current date of the effect. */ double m_time; /** \brief The height to decrease per second. */ size_type m_decrease_coefficient; /** \brief The colors among which we pick. */ std::vector m_colors; /** \brief The length of the wave, in term of elements in the sequence. */ std::size_t m_wave_length; /** \brief The height of the wave. */ size_type m_wave_height; /** \brief The speed of the wave. */ size_type m_wave_speed; }; // class sequence_effect } // namespace visual } // namespace bear #endif // __VISUAL_SEQUENCE_EFFECT_HPP__ plee-the-bear-20251226/bear-engine/core/src/visual/shader_program.hpp000066400000000000000000000052771512343254000253070ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A class that hides the implementation of the shader programs. * \author Julien Jorge */ #ifndef __VISUAL_SHADER_PROGRAM_HPP__ #define __VISUAL_SHADER_PROGRAM_HPP__ #include #include #include #include "visual/base_shader_program.hpp" #include #include #include namespace bear { namespace visual { /** * \brief A class that hides the implementation of the shader programs. * \author Julien Jorge */ class VISUAL_EXPORT shader_program { private: typedef claw::memory::smart_ptr base_shader_program_ptr; public: /** * \brief The types of the variables that can be passed to the program. */ typedef claw::meta::type_list_maker < int, bool, float, std::array< float, 16 > >::result var_types; /** * \brief The type of the map storing the values of the inputs of the * program. */ typedef claw::multi_type_map input_variable_map; /** * \brief The type of the visitor to use to access the variables of the * program. */ typedef claw::multi_type_map_visitor variable_visitor_type; public: shader_program(); explicit shader_program( std::istream& fragment ); shader_program( const std::string& fragment, const std::string& vertex ); void clear(); void restore( std::istream& fragment ); void restore( const std::string& fragment, const std::string& vertex ); bool is_valid() const; const base_shader_program* get_impl() const; template void set_variable( const std::string& name, const T& value ); const input_variable_map& get_variables() const; private: /** * \brief The implementation of the shader_program. * * The implementation is shared among the instances, thus if one of them * is restored or replaced then all instances of program becomes clean. */ claw::memory::smart_ptr m_impl; /** The values of the variables passed to the program. */ input_variable_map m_input_variable; }; // class shader_program } // namespace visual } // namespace bear #include "visual/impl/shader_program.tpp" #endif // __VISUAL_SHADER_PROGRAM_HPP__ plee-the-bear-20251226/bear-engine/core/src/visual/sprite.hpp000066400000000000000000000036501512343254000236110ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A class to represent sprites. * \author Julien Jorge */ #ifndef __VISUAL_SPRITE_HPP__ #define __VISUAL_SPRITE_HPP__ #include "visual/bitmap_rendering_attributes.hpp" #include "visual/image.hpp" #include #include "visual/class_export.hpp" namespace bear { namespace visual { /** * \brief A class to represent sprites. * \author Julien Jorge */ class VISUAL_EXPORT sprite: public bitmap_rendering_attributes { public: /** \brief The type of the clip rectangle describing the part of the source image to use for the sprite.*/ typedef claw::math::rectangle clip_rectangle_type; public: sprite(); sprite( const image& img, const clip_rectangle_type& clip_rectangle ); sprite( const image& img, const clip_rectangle_type& clip_rectangle, const rectangle_type& opaque_rectangle ); sprite( const image& img ); bool has_transparency() const; const clip_rectangle_type& clip_rectangle() const; void set_clip_rectangle( const clip_rectangle_type& clip ); const rectangle_type& get_opaque_rectangle() const; void set_opaque_rectangle( const rectangle_type& r ); const image& get_image() const; bool is_valid() const; private: /** \brief The picture where we take the sprite. */ image m_image; /** \brief The sprite is this part of the image. */ clip_rectangle_type m_clip_rectangle; /** \brief A part of the sprite that is fully opaque. */ rectangle_type m_opaque_rectangle; }; // class sprite } // namespace visual } // namespace bear #endif // __VISUAL_SPRITE_HPP__ plee-the-bear-20251226/bear-engine/core/src/visual/sprite_sequence.hpp000066400000000000000000000046301512343254000255000ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A sequence sprites. * \author Julien Jorge */ #ifndef __VISUAL_SPRITE_SEQUENCE_HPP__ #define __VISUAL_SPRITE_SEQUENCE_HPP__ #include #include #include "visual/sprite.hpp" #include "visual/class_export.hpp" namespace bear { namespace visual { /** * \brief A sequence of sprites. * \author Julien Jorge */ class VISUAL_EXPORT sprite_sequence: public bitmap_rendering_attributes { public: sprite_sequence(); sprite_sequence( const std::vector& images ); void reset(); void next(); bool empty() const; sprite get_sprite() const; size_box_type get_max_size() const; unsigned int get_max_index() const; void set_current_index( unsigned int index ); void set_loop_back( bool loop_back ); void set_loops( unsigned int loops ); unsigned int get_first_index() const; void set_first_index(unsigned int index); void set_last_index(unsigned int index); bool is_finished() const; bool is_finite() const; bool is_valid() const; protected: explicit sprite_sequence( const sprite& s ); unsigned int get_current_index() const; private: void next_forward(); void next_backward(); private: /** \brief Sequence's frames. */ std::vector m_sprites; /** \brief Current frame. */ unsigned int m_index; /** * \brief How many times the sequence should play. * \remark 0 means non stop. */ unsigned int m_loops; /** * \brief Should we loop back (true) or jump (false) to the first frame * when the sprite_sequence ends ? */ bool m_loop_back; /** \brief Are we playing in the normal order ? */ bool m_forward; /** \brief How many full playing have we done ? */ unsigned int m_play_count; /** \brief First index of the loop, included. */ unsigned int m_first_index; /** \brief Last index of the loop, included. */ unsigned int m_last_index; }; // class sprite_sequence } // namespace visual } // namespace bear #endif // __VISUAL_SPRITE_SEQUENCE_HPP__ plee-the-bear-20251226/bear-engine/core/src/visual/star.hpp000066400000000000000000000021541512343254000232520ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A star. * \author Julien Jorge */ #ifndef __VISUAL_STAR_HPP__ #define __VISUAL_STAR_HPP__ #include "visual/types.hpp" #include "visual/class_export.hpp" #include namespace bear { namespace visual { /** * \brief A star. * \author Julien Jorge */ class VISUAL_EXPORT star { public: star( std::size_t branches, double inside_ratio ); double get_ratio() const; void set_ratio( double r ); std::size_t get_branches() const; void set_branches( std::size_t b ); const std::vector& get_coordinates() const; private: void compute_coordinates( std::size_t branches, double inside_ratio ); private: /** \brief The coordinates of the branches. */ std::vector m_coordinates; }; // class star } // namespace visual } // namespace bear #endif // __VISUAL_STAR_HPP__ plee-the-bear-20251226/bear-engine/core/src/visual/text_align.hpp000066400000000000000000000033111512343254000244330ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief The different alignment modes of the text. * \author Julien Jorge */ #ifndef __VISUAL_TEXT_ALIGN_HPP__ #define __VISUAL_TEXT_ALIGN_HPP__ #include #include "visual/class_export.hpp" namespace bear { namespace visual { /** * \brief The different alignment modes of the text. * \author Julien Jorge */ class VISUAL_EXPORT text_align { public: /** * \brief The horizontal alignment modes. */ enum horizontal_align { /** \brief Align the lines of text of the left side. */ align_left, /** \brief Align the center of the lines of text. */ align_center, /** \brief Align the lines of text of the right side. */ align_right }; // enum horizontal /** * \brief The vertical alignment modes. */ enum vertical_align { /** \brief Align the lines of text of the bottom side. */ align_bottom, /** \brief Align the lines of text in the middle. */ align_middle, /** \brief Align the lines of text of the top side. */ align_top }; // enum vertical public: static horizontal_align horizontal_align_from_string ( std::string s, horizontal_align default_value ); static vertical_align vertical_align_from_string ( std::string s, vertical_align default_value ); }; // class text_align } // namespace visual } // namespace bear #endif // __VISUAL_TEXT_ALIGN_HPP__ plee-the-bear-20251226/bear-engine/core/src/visual/text_layout.hpp000066400000000000000000000043031512343254000246600ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A class that arrange a text in a box (like it should be displayed). * \author Julien Jorge */ #ifndef __VISUAL_TEXT_LAYOUT_HPP__ #define __VISUAL_TEXT_LAYOUT_HPP__ #include "visual/font/font.hpp" #include "visual/text_align.hpp" #include "visual/class_export.hpp" #include namespace bear { namespace visual { /** * \brief A class that arrange a text in a box (like it should be * displayed). * * \sa writing * * \author Julien Jorge */ class text_layout { private: /** \brief The type of the cursor representing the position of the next character. */ typedef position_type cursor_type; public: VISUAL_EXPORT text_layout ( const font& f, const std::string& str, const size_box_type& s, text_align::horizontal_align a = text_align::align_left ); template void arrange_text( Func func ) const; private: template void arrange_next_word ( Func func, cursor_type& cursor, std::size_t& i ) const; template void arrange_word ( Func func, cursor_type& cursor, std::size_t& i, const std::size_t n ) const; VISUAL_EXPORT coordinate_type compute_line_left ( std::size_t first ) const; VISUAL_EXPORT size_type compute_line_width( std::size_t first ) const; VISUAL_EXPORT size_type compute_line_height_above_baseline( std::size_t first ) const; private: /** \brief The size of the box around the text. */ const size_box_type& m_size; /** \brief The text to arrange. */ const std::string& m_text; /** \brief The font used to display the text. */ const font& m_font; /** \brief How to align the lines of text. */ text_align::horizontal_align m_horizontal_align; }; // class text_layout } // namespace visual } // namespace bear #include "visual/impl/text_layout.tpp" #endif // __VISUAL_TEXT_LAYOUT_HPP__ plee-the-bear-20251226/bear-engine/core/src/visual/text_layout_display_size.hpp000066400000000000000000000030151512343254000274360ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A class to give informations about the sizes (characters, on screen) * of a text. * \author Julien Jorge */ #ifndef __VISUAL_TEXT_LAYOUT_DISPLAY_SIZE_HPP__ #define __VISUAL_TEXT_LAYOUT_DISPLAY_SIZE_HPP__ #include #include "visual/font/font.hpp" #include "visual/class_export.hpp" namespace bear { namespace visual { /** * \brief The class passed to text_layout to compute the size of the * text when displayed. * \author Julien Jorge */ class VISUAL_EXPORT text_layout_display_size { public: text_layout_display_size ( std::string text, visual::font f, coordinate_type top ); void operator() ( position_type p, std::size_t first, std::size_t last ); rectangle_type get_bounding_box() const; private: /** \brief The text to arrange. */ std::string const m_text; /** \brief The font used to display the text. */ visual::font const m_font; /** \brief The bounding box of the displayed text. */ rectangle_type m_bounding_box; /** \brief Tells if m_bounding_box has already received a value. */ bool m_bounding_box_initialized; }; // class text_layout_display_size } // namespace visual } // namespace bear #endif // __VISUAL_TEXT_LAYOUT_DISPLAY_SIZE_HPP__ plee-the-bear-20251226/bear-engine/core/src/visual/text_metric.hpp000066400000000000000000000021451512343254000246300ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A class to give informations about the sizes (characters, on screen) * of a text. * \author Julien Jorge */ #ifndef __VISUAL_TEXT_METRIC_HPP__ #define __VISUAL_TEXT_METRIC_HPP__ #include "visual/font/font.hpp" #include "visual/class_export.hpp" #include #include namespace bear { namespace visual { /** * \brief A class to give informations about the sizes (characters, on * screen) of a text. * \author Julien Jorge */ class VISUAL_EXPORT text_metric { public: text_metric ( const std::string& text, const font& f ); size_type width() const; size_type height() const; private: /** \brief The size of the text in pixel units. */ size_box_type m_pixel_size; }; // class text_metric } // namespace visual } // namespace bear #endif // __VISUAL_TEXT_METRIC_HPP__ plee-the-bear-20251226/bear-engine/core/src/visual/types.hpp000066400000000000000000000021751512343254000234500ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Data types for the visual:: namespace. * \author Julien Jorge */ #ifndef __VISUAL_TYPES_HPP__ #define __VISUAL_TYPES_HPP__ #include #include #include "visual/color.hpp" namespace bear { namespace visual { /** \brief The type of a coordinate. */ typedef double coordinate_type; /** \brief The type of the vectors used for representing coordinates. */ typedef claw::math::coordinate_2d position_type; /** \brief The type of a size. */ typedef double size_type; /** \brief The type of a box size (width and height). */ typedef claw::math::coordinate_2d size_box_type; /** \brief The type of a rectangle. */ typedef claw::math::box_2d rectangle_type; /** \brief A color. */ typedef color color_type; } // namespace visual } // namespace bear #endif // __VISUAL_TYPES_HPP__ plee-the-bear-20251226/bear-engine/core/src/visual/writing.hpp000066400000000000000000000056131512343254000237670ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A text written with some font. * \author Julien Jorge */ #ifndef __VISUAL_WRITING_HPP__ #define __VISUAL_WRITING_HPP__ #include "visual/class_export.hpp" #include "visual/font/font.hpp" #include "visual/sequence_effect.hpp" #include "visual/text_align.hpp" namespace bear { namespace visual { class base_screen; class bitmap_writing; class scene_writing; /** * \brief A text written with some font. * \author Julien Jorge */ class VISUAL_EXPORT writing { private: typedef bitmap_writing writing_type; public: typedef writing_type& writing_reference; typedef writing_type const& const_writing_reference; typedef writing_type* writing_pointer; typedef writing_type const* const_writing_pointer; public: writing(); writing( const writing& that ); writing ( const font& f, const std::string& str, text_align::horizontal_align h = text_align::align_left, text_align::vertical_align v = text_align::align_top ); writing ( const font& f, const std::string& str, const size_box_type& s, text_align::horizontal_align h = text_align::align_left, text_align::vertical_align v = text_align::align_top ); ~writing(); writing& operator=( const writing& that ); void swap( writing& that ); void set_effect( sequence_effect e ); void update( double t ); coordinate_type get_width() const; coordinate_type get_height() const; const size_box_type& get_size() const; writing_reference operator*(); const_writing_reference operator*() const; writing_pointer operator->(); const_writing_pointer operator->() const; const_writing_pointer get_impl() const; void create ( const font& f, const std::string& str, text_align::horizontal_align h = text_align::align_left, text_align::vertical_align v = text_align::align_top ); void create ( const font& f, const std::string& str, const size_box_type& s, text_align::horizontal_align h = text_align::align_left, text_align::vertical_align v = text_align::align_top ); void call_render( const scene_writing& s, base_screen& scr ) const; private: /** \brief The writing on which we work. */ writing_pointer m_writing; /** \brief Tell how many \b other instances of this class share the same m_writing. */ std::size_t* m_counter; }; // class writing } // namespace visual } // namespace bear namespace std { void swap( bear::visual::writing& a, bear::visual::writing& b ); } // namespace std #endif // __VISUAL_WRITING_HPP__ plee-the-bear-20251226/bear-engine/core/test/000077500000000000000000000000001512343254000204535ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/core/test/CMakeLists.txt000066400000000000000000000000241512343254000232070ustar00rootroot00000000000000subdirs( universe ) plee-the-bear-20251226/bear-engine/core/test/universe/000077500000000000000000000000001512343254000223135ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/core/test/universe/CMakeLists.txt000066400000000000000000000026351512343254000250610ustar00rootroot00000000000000set( UNIVERSE_TEST_INCLUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/include" ) add_library( bear_test_universe STATIC helpers/item_call_tracker.cpp helpers/item_mockup.cpp ) target_include_directories( bear_test_universe PUBLIC "${UNIVERSE_TEST_INCLUDE_DIR}" "${BEAR_ENGINE_INCLUDE_DIRECTORY}" ) include(BoostTestHelpers) add_boost_test( SOURCE test-cases/item_selection.cpp LINK bear_test_universe bear_universe ) add_boost_test( SOURCE test-cases/physical_item.cpp LINK bear_test_universe bear_universe ) add_boost_test( SOURCE test-cases/physical_item_state.cpp LINK bear_test_universe bear_universe ) add_boost_test( SOURCE test-cases/world_active_region.cpp LINK bear_test_universe bear_universe ) add_boost_test( SOURCE test-cases/world_collisions.cpp LINK bear_test_universe bear_universe ) add_boost_test( SOURCE test-cases/world_environment.cpp LINK bear_test_universe bear_universe ) add_boost_test( SOURCE test-cases/world_density.cpp LINK bear_test_universe bear_universe ) add_boost_test( SOURCE test-cases/world_force.cpp LINK bear_test_universe bear_universe ) add_boost_test( SOURCE test-cases/world_friction.cpp LINK bear_test_universe bear_universe ) add_boost_test( SOURCE test-cases/world_items.cpp LINK bear_test_universe bear_universe ) add_boost_test( SOURCE test-cases/world_update.cpp LINK bear_test_universe bear_universe ) plee-the-bear-20251226/bear-engine/core/test/universe/helpers/000077500000000000000000000000001512343254000237555ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/core/test/universe/helpers/item_call_tracker.cpp000066400000000000000000000012611512343254000301250ustar00rootroot00000000000000#include "test/universe/item_call_tracker.hpp" test::universe::item_call_tracker::item_call_tracker ( item_function_call& calls ) : m_calls( calls ) { } void test::universe::item_call_tracker::add_dependent_item ( bear::universe::physical_item& item ) { m_dependent_items.push_back( &item ); } void test::universe::item_call_tracker::time_step( bear::universe::time_type ) { m_calls.time_step.push_back( this ); } void test::universe::item_call_tracker::move( bear::universe::time_type ) { m_calls.move.push_back( this ); } void test::universe::item_call_tracker::get_dependent_items ( bear::universe::physical_item::item_list& d ) const { d = m_dependent_items; } plee-the-bear-20251226/bear-engine/core/test/universe/helpers/item_mockup.cpp000066400000000000000000000006151512343254000267770ustar00rootroot00000000000000#include "test/universe/item_mockup.hpp" test::universe::item_mockup::item_mockup() : time_step_impl( []( bear::universe::time_type ) -> void {} ) { } void test::universe::item_mockup::time_step ( bear::universe::time_type elapsed_time) { time_step_impl( elapsed_time ); } void test::universe::item_mockup::collision ( bear::universe::collision_info& info ) { collision_impl( info ); } plee-the-bear-20251226/bear-engine/core/test/universe/include/000077500000000000000000000000001512343254000237365ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/core/test/universe/include/test/000077500000000000000000000000001512343254000247155ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/core/test/universe/include/test/universe/000077500000000000000000000000001512343254000265555ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/core/test/universe/include/test/universe/item_call_tracker.hpp000066400000000000000000000013471512343254000327370ustar00rootroot00000000000000#pragma once #include "universe/physical_item.hpp" #include "test/universe/item_function_call.hpp" namespace test { namespace universe { class item_call_tracker: public bear::universe::physical_item { public: explicit item_call_tracker( item_function_call& calls ); void add_dependent_item( bear::universe::physical_item& item ); private: void time_step( bear::universe::time_type ) override; void move( bear::universe::time_type ) override; void get_dependent_items ( bear::universe::physical_item::item_list& d ) const override; private: item_function_call& m_calls; bear::universe::physical_item::item_list m_dependent_items; }; } } plee-the-bear-20251226/bear-engine/core/test/universe/include/test/universe/item_function_call.hpp000066400000000000000000000003161512343254000331240ustar00rootroot00000000000000#pragma once #include "test/universe/item_sequence.hpp" namespace test { namespace universe { struct item_function_call { item_sequence time_step; item_sequence move; }; } } plee-the-bear-20251226/bear-engine/core/test/universe/include/test/universe/item_mockup.hpp000066400000000000000000000010651512343254000316040ustar00rootroot00000000000000#pragma once #include "universe/physical_item.hpp" #include namespace test { namespace universe { class item_mockup: public bear::universe::physical_item { public: item_mockup(); private: void time_step( bear::universe::time_type elapsed_time ) override; void collision( bear::universe::collision_info& info ) override; public: std::function< void( bear::universe::time_type ) > time_step_impl; std::function< void( bear::universe::collision_info& ) > collision_impl; }; } } plee-the-bear-20251226/bear-engine/core/test/universe/include/test/universe/item_sequence.hpp000066400000000000000000000002561512343254000321170ustar00rootroot00000000000000#pragma once #include "universe/physical_item.hpp" namespace test { namespace universe { typedef std::vector< bear::universe::physical_item* > item_sequence; } } plee-the-bear-20251226/bear-engine/core/test/universe/test-cases/000077500000000000000000000000001512343254000243665ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/core/test/universe/test-cases/item_selection.cpp000066400000000000000000000020141512343254000300720ustar00rootroot00000000000000#include "universe/physical_item.hpp" #include "universe/internal/item_selection.hpp" #define BOOST_TEST_MODULE bear::universe::internal/item_selection #include BOOST_AUTO_TEST_CASE( initial_state ) { bear::universe::physical_item item; BOOST_CHECK( !item.get_world_progress_structure().is_selected() ); } BOOST_AUTO_TEST_CASE( select_item ) { bear::universe::internal::item_list items; bear::universe::physical_item item; bear::universe::internal::select_item( items, &item ); BOOST_CHECK_EQUAL( items.size(), 1 ); BOOST_CHECK_EQUAL( items.front(), &item ); BOOST_CHECK( item.get_world_progress_structure().is_selected() ); } BOOST_AUTO_TEST_CASE( unselect_item ) { bear::universe::internal::item_list items; bear::universe::physical_item item; bear::universe::internal::select_item( items, &item ); bear::universe::internal::unselect_item( items, items.begin() ); BOOST_CHECK( items.empty() ); BOOST_CHECK( !item.get_world_progress_structure().is_selected() ); } plee-the-bear-20251226/bear-engine/core/test/universe/test-cases/physical_item.cpp000066400000000000000000000046071512343254000277330ustar00rootroot00000000000000#include "universe/physical_item.hpp" #include "universe/world.hpp" #include "universe/forced_movement/forced_rotation.hpp" #include "universe/link/link.hpp" #define BOOST_TEST_MODULE bear::universe::physical_item #include BOOST_AUTO_TEST_CASE( forced_movement ) { bear::universe::physical_item item; BOOST_CHECK( !item.has_forced_movement() ); item.set_forced_movement( bear::universe::forced_rotation() ); BOOST_CHECK( item.has_forced_movement() ); item.clear_forced_movement(); BOOST_CHECK( !item.has_forced_movement() ); } BOOST_AUTO_TEST_CASE( movement_reference ) { bear::universe::physical_item item1; bear::universe::physical_item item2; BOOST_CHECK( item1.get_movement_reference() == nullptr ); item1.set_movement_reference( &item2 ); BOOST_CHECK_EQUAL( item1.get_movement_reference(), &item2 ); item1.set_movement_reference( nullptr ); BOOST_CHECK( item1.get_movement_reference() == nullptr ); bear::universe::forced_rotation rotation; rotation.set_reference_point_on_center( item2 ); item1.set_forced_movement( rotation ); BOOST_CHECK_EQUAL( item1.get_movement_reference(), &item2 ); } BOOST_AUTO_TEST_CASE( age ) { bear::universe::physical_item item; BOOST_CHECK_EQUAL( item.get_age(), 0 ); item.time_step( 1 ); BOOST_CHECK_EQUAL( item.get_age(), 1 ); item.time_step( 0.5 ); BOOST_CHECK_EQUAL( item.get_age(), 1.5 ); } BOOST_AUTO_TEST_CASE( owner ) { bear::universe::physical_item item; BOOST_CHECK( !item.has_owner() ); bear::universe::world world( bear::universe::size_box_type( 1000, 1000 ) ); item.set_owner( world ); BOOST_CHECK( item.has_owner() ); BOOST_CHECK_EQUAL( &item.get_owner(), &world ); item.set_forced_movement( bear::universe::forced_rotation() ); bear::universe::item_handle handle( item ); bear::universe::const_item_handle const_handle( item ); bear::universe::physical_item item2; new bear::universe::link( item, item2, 10, 20, 34 ); item.quit_owner(); BOOST_CHECK( !item.has_owner() ); BOOST_CHECK( !item.has_forced_movement() ); BOOST_CHECK( handle.get() == nullptr ); BOOST_CHECK( const_handle.get() == nullptr ); BOOST_CHECK( item.links_begin() == item.links_end() ); bear::universe::world world2( bear::universe::size_box_type( 1000, 1000 ) ); item.set_owner( world2 ); BOOST_CHECK( item.has_owner() ); BOOST_CHECK_EQUAL( &item.get_owner(), &world2 ); } plee-the-bear-20251226/bear-engine/core/test/universe/test-cases/physical_item_state.cpp000066400000000000000000001227511512343254000311340ustar00rootroot00000000000000#include "universe/physical_item_state.hpp" #include "universe/shape/curved_box.hpp" #include "universe/shape/rectangle.hpp" #include "universe/shape/shape_traits.hpp" #define BOOST_TEST_MODULE bear::universe::physical_item_state #include BOOST_AUTO_TEST_CASE( size ) { bear::universe::physical_item_state item; const bear::universe::rectangle_type bounding_box( 10, 5, 20, 20 ); item.set_bounding_box( bounding_box ); BOOST_CHECK( item.get_bounding_box() == bounding_box ); BOOST_CHECK_EQUAL( item.get_width(), bounding_box.width() ); BOOST_CHECK_EQUAL( item.get_height(), bounding_box.height() ); BOOST_CHECK( item.get_size() == bear::universe::size_box_type ( bounding_box.width(), bounding_box.height() ) ); } BOOST_AUTO_TEST_CASE( acceleration ) { bear::universe::physical_item_state item; item.set_acceleration( bear::universe::force_type( 24, 12 ) ); BOOST_CHECK_EQUAL( item.get_acceleration().x, 24 ); BOOST_CHECK_EQUAL( item.get_acceleration().y, 12 ); } BOOST_AUTO_TEST_CASE( internal_force ) { bear::universe::physical_item_state item; item.set_internal_force( bear::universe::force_type( 24, 12 ) ); BOOST_CHECK_EQUAL( item.get_internal_force().x, 24 ); BOOST_CHECK_EQUAL( item.get_internal_force().y, 12 ); item.add_internal_force( bear::universe::force_type( 2, 3 ) ); BOOST_CHECK_EQUAL( item.get_internal_force().x, 26 ); BOOST_CHECK_EQUAL( item.get_internal_force().y, 15 ); } BOOST_AUTO_TEST_CASE( external_force ) { bear::universe::physical_item_state item; item.set_external_force( bear::universe::force_type( 24, 12 ) ); BOOST_CHECK_EQUAL( item.get_external_force().x, 24 ); BOOST_CHECK_EQUAL( item.get_external_force().y, 12 ); item.add_external_force( bear::universe::force_type( 2, 3 ) ); BOOST_CHECK_EQUAL( item.get_external_force().x, 26 ); BOOST_CHECK_EQUAL( item.get_external_force().y, 15 ); } BOOST_AUTO_TEST_CASE( force ) { bear::universe::physical_item_state item; item.set_external_force( bear::universe::force_type( 24, 12 ) ); item.set_internal_force( bear::universe::force_type( 1, 2 ) ); item.set_system_angle( 3.14159 / 2 ); BOOST_CHECK_CLOSE( item.get_force().x, 22, 0.001 ); BOOST_CHECK_CLOSE( item.get_force().y, 13, 0.001 ); } BOOST_AUTO_TEST_CASE( mass ) { bear::universe::physical_item_state item; item.set_mass( 1 ); BOOST_CHECK_EQUAL( item.get_mass(), 1 ); } BOOST_AUTO_TEST_CASE( density ) { bear::universe::physical_item_state item; item.set_density( 23 ); BOOST_CHECK_EQUAL( item.get_density(), 23 ); } BOOST_AUTO_TEST_CASE( speed ) { bear::universe::physical_item_state item; item.set_speed( 3, 6 ); BOOST_CHECK_EQUAL( item.get_speed().x, 3 ); BOOST_CHECK_EQUAL( item.get_speed().y, 6 ); item.set_speed( bear::universe::speed_type( 34, 16 ) ); BOOST_CHECK_EQUAL( item.get_speed().x, 34 ); BOOST_CHECK_EQUAL( item.get_speed().y, 16 ); } BOOST_AUTO_TEST_CASE( angular_speed ) { bear::universe::physical_item_state item; item.set_angular_speed( 23 ); BOOST_CHECK_EQUAL( item.get_angular_speed(), 23 ); item.add_angular_speed( -5 ); BOOST_CHECK_EQUAL( item.get_angular_speed(), 18 ); } BOOST_AUTO_TEST_CASE( friction ) { bear::universe::physical_item_state item; item.set_friction( 23 ); BOOST_CHECK_EQUAL( item.get_friction(), 23 ); } BOOST_AUTO_TEST_CASE( contact_friction ) { bear::universe::physical_item_state item; item.set_contact_friction( 23 ); BOOST_CHECK_EQUAL( item.get_contact_friction(), 23 ); } BOOST_AUTO_TEST_CASE( elasticity ) { bear::universe::physical_item_state item; item.set_elasticity( 23 ); BOOST_CHECK_EQUAL( item.get_elasticity(), 23 ); } BOOST_AUTO_TEST_CASE( hardness ) { bear::universe::physical_item_state item; item.set_hardness( 23 ); BOOST_CHECK_EQUAL( item.get_hardness(), 23 ); } BOOST_AUTO_TEST_CASE( system_angle ) { bear::universe::physical_item_state item; BOOST_CHECK_EQUAL( item.get_x_axis().x, 1 ); BOOST_CHECK_EQUAL( item.get_x_axis().y, 0 ); item.set_system_angle( -3.14159 / 2 ); BOOST_CHECK( std::abs( item.get_x_axis().x - 0 ) <= 0.001 ); BOOST_CHECK( std::abs( item.get_x_axis().y - -1) <= 0.001 ); BOOST_CHECK( !item.has_free_system() ); item.set_system_angle( 24 ); BOOST_CHECK_EQUAL( item.get_system_angle(), 24 ); item.set_contact_angle( 3 ); BOOST_CHECK_EQUAL( item.get_system_angle(), 3 ); item.set_free_system( true ); item.set_system_angle( 24 ); BOOST_CHECK_EQUAL( item.get_system_angle(), 24 ); item.set_contact_angle( 3 ); BOOST_CHECK_EQUAL( item.get_system_angle(), 24 ); } BOOST_AUTO_TEST_CASE( fix ) { bear::universe::physical_item_state item; BOOST_CHECK( !item.is_fixed() ); item.fix(); BOOST_CHECK( item.is_fixed() ); } BOOST_AUTO_TEST_CASE( can_move_items ) { bear::universe::physical_item_state item; item.set_can_move_items( true ); BOOST_CHECK( item.can_move_items() ); item.set_can_move_items( false ); BOOST_CHECK( !item.can_move_items() ); } BOOST_AUTO_TEST_CASE( global ) { bear::universe::physical_item_state item; item.set_global( true ); BOOST_CHECK( item.is_global() ); item.set_global( false ); BOOST_CHECK( !item.is_global() ); } BOOST_AUTO_TEST_CASE( phantom ) { bear::universe::physical_item_state item; item.set_phantom( true ); BOOST_CHECK( item.is_phantom() ); item.set_phantom( false ); BOOST_CHECK( !item.is_phantom() ); } BOOST_AUTO_TEST_CASE( artificial ) { bear::universe::physical_item_state item; item.set_artificial( true ); BOOST_CHECK( item.is_artificial() ); item.set_artificial( false ); BOOST_CHECK( !item.is_artificial() ); } BOOST_AUTO_TEST_CASE( weak_collisions ) { bear::universe::physical_item_state item; item.set_weak_collisions( true ); BOOST_CHECK( item.has_weak_collisions() ); item.set_weak_collisions( false ); BOOST_CHECK( !item.has_weak_collisions() ); } BOOST_AUTO_TEST_CASE( shape ) { bear::universe::physical_item_state item; { using rectangle_traits = bear::universe::shape_traits< bear::universe::rectangle >; bear::universe::rectangle r; rectangle_traits::set_bounding_box ( r, bear::universe::rectangle_type( 3, 6, 9, 12 ) ); item.set_shape( r ); const bear::universe::rectangle* const r_clone ( dynamic_cast< bear::universe::rectangle* > ( item.get_shape().clone_impl() ) ); BOOST_CHECK( r_clone != nullptr ); BOOST_CHECK( rectangle_traits::get_bounding_box( *r_clone ) == rectangle_traits::get_bounding_box( r ) ); delete r_clone; } { using curved_box_traits = bear::universe::shape_traits< bear::universe::curved_box >; bear::universe::curved_box curved_box; curved_box_traits::set_bounding_box ( curved_box, bear::universe::rectangle_type( 8, 9, 3, 6 ) ); item.set_shape( curved_box ); const bear::universe::curved_box* const box_clone ( dynamic_cast< bear::universe::curved_box* > ( item.get_shape().clone_impl() ) ); BOOST_CHECK( box_clone != nullptr ); BOOST_CHECK( curved_box_traits::get_bounding_box( *box_clone ) == curved_box_traits::get_bounding_box( curved_box ) ); BOOST_CHECK( box_clone->get_steepness() == curved_box.get_steepness() ); BOOST_CHECK( box_clone->get_margin() == curved_box.get_margin() ); BOOST_CHECK( box_clone->get_left_control_point() == curved_box.get_left_control_point() ); BOOST_CHECK( box_clone->get_right_control_point() == curved_box.get_right_control_point() ); delete box_clone; } } BOOST_AUTO_TEST_CASE( bounding_box_applies_to_shape ) { using rectangle_traits = bear::universe::shape_traits< bear::universe::rectangle >; const bear::universe::rectangle_type box1( 3, 6, 9, 12 ); const bear::universe::rectangle_type box2( 6, 3, 4, 9 ); bear::universe::physical_item_state item; bear::universe::rectangle r; rectangle_traits::set_bounding_box( r, box1 ); item.set_shape( r ); BOOST_CHECK( item.get_bounding_box() == box1 ); item.set_bounding_box( box2 ); BOOST_CHECK( bear::universe::shape_traits < bear::universe::shape > ::get_bounding_box( item.get_shape() ) == box2 ); } BOOST_AUTO_TEST_CASE( left_contact ) { bear::universe::physical_item_state item; item.set_bounding_box( bear::universe::rectangle_type( 10, 0, 20, 40 ) ); item.set_left_contact( true ); BOOST_CHECK( item.has_left_contact() ); BOOST_CHECK( item.has_side_contact() ); BOOST_CHECK( !item.has_middle_contact() ); BOOST_CHECK( item.has_contact() ); BOOST_CHECK_EQUAL( item.get_left_contact().get_min(), 0 ); BOOST_CHECK_EQUAL( item.get_left_contact().get_max(), 1 ); item.clear_contacts(); BOOST_CHECK( !item.has_left_contact() ); BOOST_CHECK( !item.has_side_contact() ); BOOST_CHECK( !item.has_middle_contact() ); BOOST_CHECK( !item.has_contact() ); BOOST_CHECK_EQUAL( item.get_left_contact().get_min(), 0 ); BOOST_CHECK_EQUAL( item.get_left_contact().get_max(), 0 ); item.set_left_contact( 10, 20 ); BOOST_CHECK( item.has_left_contact() ); BOOST_CHECK( item.has_side_contact() ); BOOST_CHECK( !item.has_middle_contact() ); BOOST_CHECK( item.has_contact() ); BOOST_CHECK_EQUAL( item.get_left_contact().get_min(), 0.25 ); BOOST_CHECK_EQUAL( item.get_left_contact().get_max(), 0.5 ); item.set_left_contact( -1, 45 ); BOOST_CHECK( item.has_left_contact() ); BOOST_CHECK( item.has_side_contact() ); BOOST_CHECK( !item.has_middle_contact() ); BOOST_CHECK( item.has_contact() ); BOOST_CHECK_EQUAL( item.get_left_contact().get_min(), 0 ); BOOST_CHECK_EQUAL( item.get_left_contact().get_max(), 1 ); } BOOST_AUTO_TEST_CASE( right_contact ) { bear::universe::physical_item_state item; item.set_bounding_box( bear::universe::rectangle_type( 10, 0, 20, 40 ) ); item.set_right_contact( true ); BOOST_CHECK( item.has_right_contact() ); BOOST_CHECK( item.has_side_contact() ); BOOST_CHECK( !item.has_middle_contact() ); BOOST_CHECK( item.has_contact() ); BOOST_CHECK_EQUAL( item.get_right_contact().get_min(), 0 ); BOOST_CHECK_EQUAL( item.get_right_contact().get_max(), 1 ); item.clear_contacts(); BOOST_CHECK( !item.has_right_contact() ); BOOST_CHECK( !item.has_side_contact() ); BOOST_CHECK( !item.has_middle_contact() ); BOOST_CHECK( !item.has_contact() ); BOOST_CHECK_EQUAL( item.get_right_contact().get_min(), 0 ); BOOST_CHECK_EQUAL( item.get_right_contact().get_max(), 0 ); item.set_right_contact( 10, 20 ); BOOST_CHECK( item.has_side_contact() ); BOOST_CHECK( item.has_right_contact() ); BOOST_CHECK( !item.has_middle_contact() ); BOOST_CHECK( item.has_contact() ); BOOST_CHECK_EQUAL( item.get_right_contact().get_min(), 0.25 ); BOOST_CHECK_EQUAL( item.get_right_contact().get_max(), 0.5 ); item.set_right_contact( -1, 45 ); BOOST_CHECK( item.has_side_contact() ); BOOST_CHECK( item.has_right_contact() ); BOOST_CHECK( !item.has_middle_contact() ); BOOST_CHECK( item.has_contact() ); BOOST_CHECK_EQUAL( item.get_right_contact().get_min(), 0 ); BOOST_CHECK_EQUAL( item.get_right_contact().get_max(), 1 ); } BOOST_AUTO_TEST_CASE( bottom_contact ) { bear::universe::physical_item_state item; item.set_bounding_box( bear::universe::rectangle_type( 10, 0, 20, 40 ) ); item.set_bottom_contact( true ); BOOST_CHECK( item.has_bottom_contact() ); BOOST_CHECK( item.has_side_contact() ); BOOST_CHECK( !item.has_middle_contact() ); BOOST_CHECK( item.has_contact() ); BOOST_CHECK_EQUAL( item.get_bottom_contact().get_min(), 0 ); BOOST_CHECK_EQUAL( item.get_bottom_contact().get_max(), 1 ); item.clear_contacts(); BOOST_CHECK( !item.has_bottom_contact() ); BOOST_CHECK( !item.has_side_contact() ); BOOST_CHECK( !item.has_middle_contact() ); BOOST_CHECK( !item.has_contact() ); BOOST_CHECK_EQUAL( item.get_bottom_contact().get_min(), 0 ); BOOST_CHECK_EQUAL( item.get_bottom_contact().get_max(), 0 ); item.set_bottom_contact( 15, 18 ); BOOST_CHECK( item.has_bottom_contact() ); BOOST_CHECK( item.has_side_contact() ); BOOST_CHECK( !item.has_middle_contact() ); BOOST_CHECK( item.has_contact() ); BOOST_CHECK_EQUAL( item.get_bottom_contact().get_min(), 0.5 ); BOOST_CHECK_EQUAL( item.get_bottom_contact().get_max(), 0.8 ); item.set_bottom_contact( 3, 24 ); BOOST_CHECK( item.has_bottom_contact() ); BOOST_CHECK( item.has_side_contact() ); BOOST_CHECK( !item.has_middle_contact() ); BOOST_CHECK( item.has_contact() ); BOOST_CHECK_EQUAL( item.get_bottom_contact().get_min(), 0 ); BOOST_CHECK_EQUAL( item.get_bottom_contact().get_max(), 1 ); } BOOST_AUTO_TEST_CASE( top_contact ) { bear::universe::physical_item_state item; item.set_bounding_box( bear::universe::rectangle_type( 10, 0, 20, 40 ) ); item.set_top_contact( true ); BOOST_CHECK( item.has_top_contact() ); BOOST_CHECK( item.has_side_contact() ); BOOST_CHECK( !item.has_middle_contact() ); BOOST_CHECK( item.has_contact() ); BOOST_CHECK_EQUAL( item.get_top_contact().get_min(), 0 ); BOOST_CHECK_EQUAL( item.get_top_contact().get_max(), 1 ); item.clear_contacts(); BOOST_CHECK( !item.has_top_contact() ); BOOST_CHECK( !item.has_side_contact() ); BOOST_CHECK( !item.has_middle_contact() ); BOOST_CHECK( !item.has_contact() ); BOOST_CHECK_EQUAL( item.get_top_contact().get_min(), 0 ); BOOST_CHECK_EQUAL( item.get_top_contact().get_max(), 0 ); item.set_top_contact( 15, 18 ); BOOST_CHECK( item.has_top_contact() ); BOOST_CHECK( item.has_side_contact() ); BOOST_CHECK( !item.has_middle_contact() ); BOOST_CHECK( item.has_contact() ); BOOST_CHECK_EQUAL( item.get_top_contact().get_min(), 0.5 ); BOOST_CHECK_EQUAL( item.get_top_contact().get_max(), 0.8 ); item.set_top_contact( 3, 24 ); BOOST_CHECK( item.has_top_contact() ); BOOST_CHECK( item.has_side_contact() ); BOOST_CHECK( !item.has_middle_contact() ); BOOST_CHECK( item.has_contact() ); BOOST_CHECK_EQUAL( item.get_top_contact().get_min(), 0 ); BOOST_CHECK_EQUAL( item.get_top_contact().get_max(), 1 ); } BOOST_AUTO_TEST_CASE( middle_contact ) { bear::universe::physical_item_state item; item.set_middle_contact( true ); BOOST_CHECK( item.has_middle_contact() ); BOOST_CHECK( item.has_contact() ); BOOST_CHECK( !item.has_side_contact() ); } static void check_position ( const bear::universe::physical_item_state& item, double left, double right, double bottom, double top ) { BOOST_CHECK_EQUAL( item.get_width(), right - left ); BOOST_CHECK_EQUAL( item.get_height(), top - bottom ); BOOST_CHECK_EQUAL( item.get_left(), left ); BOOST_CHECK_EQUAL( item.get_right(), right ); BOOST_CHECK_EQUAL( item.get_bottom(), bottom ); BOOST_CHECK_EQUAL( item.get_top(), top ); BOOST_CHECK_EQUAL( item.get_horizontal_middle(), ( left + right ) / 2 ); BOOST_CHECK_EQUAL( item.get_vertical_middle(), ( bottom + top ) / 2 ); BOOST_CHECK( item.get_top_left() == bear::universe::position_type ( item.get_left(), item.get_top() ) ); BOOST_CHECK( item.get_bottom_left() == bear::universe::position_type ( item.get_left(), item.get_bottom() ) ); BOOST_CHECK( item.get_top_right() == bear::universe::position_type ( item.get_right(), item.get_top() ) ); BOOST_CHECK( item.get_bottom_right() == bear::universe::position_type ( item.get_right(), item.get_bottom() ) ); BOOST_CHECK( item.get_center_of_mass() == bear::universe::position_type ( item.get_horizontal_middle(), item.get_vertical_middle() ) ); } BOOST_AUTO_TEST_CASE( position ) { const float left( 10 ); const float bottom( 0 ); const float width( 10 ); const float height( 40 ); const bear::universe::rectangle_type box ( left, bottom, left + width, bottom + height ); bear::universe::physical_item_state item; item.set_bounding_box( box ); check_position( item, left, left + width, bottom, bottom + height ); } BOOST_AUTO_TEST_CASE( position_left ) { const float left( 10 ); const float bottom( 0 ); const float width( 10 ); const float height( 40 ); const bear::universe::rectangle_type box ( left, bottom, left + width, bottom + height ); bear::universe::physical_item_state item; item.set_bounding_box( box ); item.set_left( 5 ); check_position( item, 5, 5 + width, bottom, bottom + height ); } BOOST_AUTO_TEST_CASE( position_right ) { const float left( 10 ); const float bottom( 0 ); const float width( 10 ); const float height( 40 ); const bear::universe::rectangle_type box ( left, bottom, left + width, bottom + height ); bear::universe::physical_item_state item; item.set_bounding_box( box ); item.set_right( 5 ); check_position( item, 5 - width, 5, bottom, bottom + height ); } BOOST_AUTO_TEST_CASE( position_bottom ) { const float left( 10 ); const float bottom( 0 ); const float width( 10 ); const float height( 40 ); const bear::universe::rectangle_type box ( left, bottom, left + width, bottom + height ); bear::universe::physical_item_state item; item.set_bounding_box( box ); item.set_bottom( 5 ); check_position( item, left, left + width, 5, 5 + height ); } BOOST_AUTO_TEST_CASE( position_top ) { const float left( 10 ); const float bottom( 0 ); const float width( 10 ); const float height( 40 ); const bear::universe::rectangle_type box ( left, bottom, left + width, bottom + height ); bear::universe::physical_item_state item; item.set_bounding_box( box ); item.set_top( 5 ); check_position( item, left, left + width, 5 - height, 5 ); } BOOST_AUTO_TEST_CASE( position_horizontal_middle ) { const float left( 10 ); const float bottom( 0 ); const float width( 10 ); const float height( 40 ); const bear::universe::rectangle_type box ( left, bottom, left + width, bottom + height ); bear::universe::physical_item_state item; item.set_bounding_box( box ); item.set_horizontal_middle( 5 ); check_position( item, 5 - width / 2, 5 + width / 2, bottom, bottom + height ); } BOOST_AUTO_TEST_CASE( position_vertical_middle ) { const float left( 10 ); const float bottom( 0 ); const float width( 10 ); const float height( 40 ); const bear::universe::rectangle_type box ( left, bottom, left + width, bottom + height ); bear::universe::physical_item_state item; item.set_bounding_box( box ); item.set_vertical_middle( 5 ); check_position( item, left, left + width, 5 - height / 2, 5 + height / 2 ); } BOOST_AUTO_TEST_CASE( position_2_parameters_bottom_left ) { const float left( 10 ); const float bottom( 0 ); const float width( 10 ); const float height( 40 ); const bear::universe::rectangle_type box ( left, bottom, left + width, bottom + height ); bear::universe::physical_item_state item; item.set_bounding_box( box ); item.set_bottom_left( 5, 10 ); check_position( item, 5, 5 + width, 10, 10 + height ); } BOOST_AUTO_TEST_CASE( position_2_parameters_bottom_right ) { const float left( 10 ); const float bottom( 0 ); const float width( 10 ); const float height( 40 ); const bear::universe::rectangle_type box ( left, bottom, left + width, bottom + height ); bear::universe::physical_item_state item; item.set_bounding_box( box ); item.set_bottom_right( 5, 10 ); check_position( item, 5 - width, 5, 10, 10 + height ); } BOOST_AUTO_TEST_CASE( position_2_parameters_top_left ) { const float left( 10 ); const float bottom( 0 ); const float width( 10 ); const float height( 40 ); const bear::universe::rectangle_type box ( left, bottom, left + width, bottom + height ); bear::universe::physical_item_state item; item.set_bounding_box( box ); item.set_top_left( 5, 10 ); check_position( item, 5, 5 + width, 10 - height, 10 ); } BOOST_AUTO_TEST_CASE( position_2_parameters_top_right ) { const float left( 10 ); const float bottom( 0 ); const float width( 10 ); const float height( 40 ); const bear::universe::rectangle_type box ( left, bottom, left + width, bottom + height ); bear::universe::physical_item_state item; item.set_bounding_box( box ); item.set_top_right( 5, 10 ); check_position( item, 5 - width, 5, 10 - height, 10 ); } BOOST_AUTO_TEST_CASE( position_2_parameters_top_middle ) { const float left( 10 ); const float bottom( 0 ); const float width( 10 ); const float height( 40 ); const bear::universe::rectangle_type box ( left, bottom, left + width, bottom + height ); bear::universe::physical_item_state item; item.set_bounding_box( box ); item.set_top_middle( 5, 10 ); check_position( item, 5 - width / 2, 5 + width / 2, 10 - height, 10 ); } BOOST_AUTO_TEST_CASE( position_2_parameters_bottom_middle ) { const float left( 10 ); const float bottom( 0 ); const float width( 10 ); const float height( 40 ); const bear::universe::rectangle_type box ( left, bottom, left + width, bottom + height ); bear::universe::physical_item_state item; item.set_bounding_box( box ); item.set_bottom_middle( 5, 10 ); check_position( item, 5 - width / 2, 5 + width / 2, 10, 10 + height ); } BOOST_AUTO_TEST_CASE( position_2_parameters_left_middle ) { const float left( 10 ); const float bottom( 0 ); const float width( 10 ); const float height( 40 ); const bear::universe::rectangle_type box ( left, bottom, left + width, bottom + height ); bear::universe::physical_item_state item; item.set_bounding_box( box ); item.set_left_middle( 5, 10 ); check_position( item, 5, 5 + width, 10 - height / 2, 10 + height / 2 ); } BOOST_AUTO_TEST_CASE( position_2_parameters_right_middle ) { const float left( 10 ); const float bottom( 0 ); const float width( 10 ); const float height( 40 ); const bear::universe::rectangle_type box ( left, bottom, left + width, bottom + height ); bear::universe::physical_item_state item; item.set_bounding_box( box ); item.set_right_middle( 5, 10 ); check_position( item, 5 - width, 5, 10 - height / 2, 10 + height / 2 ); } BOOST_AUTO_TEST_CASE( position_2_parameters_center ) { const float left( 10 ); const float bottom( 0 ); const float width( 10 ); const float height( 40 ); const bear::universe::rectangle_type box ( left, bottom, left + width, bottom + height ); bear::universe::physical_item_state item; item.set_bounding_box( box ); item.set_center_of_mass( 5, 10 ); check_position ( item, 5 - width / 2, 5 + width / 2, 10 - height / 2, 10 + height / 2 ); } BOOST_AUTO_TEST_CASE( position_1_parameter_bottom_left ) { const float left( 10 ); const float bottom( 0 ); const float width( 10 ); const float height( 40 ); const bear::universe::rectangle_type box ( left, bottom, left + width, bottom + height ); bear::universe::physical_item_state item; item.set_bounding_box( box ); item.set_bottom_left( bear::universe::position_type( 5, 10 ) ); check_position( item, 5, 5 + width, 10, 10 + height ); } BOOST_AUTO_TEST_CASE( position_1_parameter_bottom_right ) { const float left( 10 ); const float bottom( 0 ); const float width( 10 ); const float height( 40 ); const bear::universe::rectangle_type box ( left, bottom, left + width, bottom + height ); bear::universe::physical_item_state item; item.set_bounding_box( box ); item.set_bottom_right( bear::universe::position_type( 5, 10 ) ); check_position( item, 5 - width, 5, 10, 10 + height ); } BOOST_AUTO_TEST_CASE( position_1_parameter_top_left ) { const float left( 10 ); const float bottom( 0 ); const float width( 10 ); const float height( 40 ); const bear::universe::rectangle_type box ( left, bottom, left + width, bottom + height ); bear::universe::physical_item_state item; item.set_bounding_box( box ); item.set_top_left( bear::universe::position_type( 5, 10 ) ); check_position( item, 5, 5 + width, 10 - height, 10 ); } BOOST_AUTO_TEST_CASE( position_1_parameter_top_right ) { const float left( 10 ); const float bottom( 0 ); const float width( 10 ); const float height( 40 ); const bear::universe::rectangle_type box ( left, bottom, left + width, bottom + height ); bear::universe::physical_item_state item; item.set_bounding_box( box ); item.set_top_right( bear::universe::position_type( 5, 10 ) ); check_position( item, 5 - width, 5, 10 - height, 10 ); } BOOST_AUTO_TEST_CASE( position_1_parameter_top_middle ) { const float left( 10 ); const float bottom( 0 ); const float width( 10 ); const float height( 40 ); const bear::universe::rectangle_type box ( left, bottom, left + width, bottom + height ); bear::universe::physical_item_state item; item.set_bounding_box( box ); item.set_top_middle( bear::universe::position_type( 5, 10 ) ); check_position( item, 5 - width / 2, 5 + width / 2, 10 - height, 10 ); } BOOST_AUTO_TEST_CASE( position_1_parameter_bottom_middle ) { const float left( 10 ); const float bottom( 0 ); const float width( 10 ); const float height( 40 ); const bear::universe::rectangle_type box ( left, bottom, left + width, bottom + height ); bear::universe::physical_item_state item; item.set_bounding_box( box ); item.set_bottom_middle( bear::universe::position_type( 5, 10 ) ); check_position( item, 5 - width / 2, 5 + width / 2, 10, 10 + height ); } BOOST_AUTO_TEST_CASE( position_1_parameter_left_middle ) { const float left( 10 ); const float bottom( 0 ); const float width( 10 ); const float height( 40 ); const bear::universe::rectangle_type box ( left, bottom, left + width, bottom + height ); bear::universe::physical_item_state item; item.set_bounding_box( box ); item.set_left_middle( bear::universe::position_type( 5, 10 ) ); check_position( item, 5, 5 + width, 10 - height / 2, 10 + height / 2 ); } BOOST_AUTO_TEST_CASE( position_1_parameter_right_middle ) { const float left( 10 ); const float bottom( 0 ); const float width( 10 ); const float height( 40 ); const bear::universe::rectangle_type box ( left, bottom, left + width, bottom + height ); bear::universe::physical_item_state item; item.set_bounding_box( box ); item.set_right_middle( bear::universe::position_type( 5, 10 ) ); check_position( item, 5 - width, 5, 10 - height / 2, 10 + height / 2 ); } BOOST_AUTO_TEST_CASE( position_1_parameter_center ) { const float left( 10 ); const float bottom( 0 ); const float width( 10 ); const float height( 40 ); const bear::universe::rectangle_type box ( left, bottom, left + width, bottom + height ); bear::universe::physical_item_state item; item.set_bounding_box( box ); item.set_center_of_mass( bear::universe::position_type( 5, 10 ) ); check_position ( item, 5 - width / 2, 5 + width / 2, 10 - height / 2, 10 + height / 2 ); } BOOST_AUTO_TEST_CASE( position_center_on_item ) { bear::universe::physical_item_state item; item.set_bounding_box( bear::universe::rectangle_type( 10, 0, 20, 40 ) ); bear::universe::physical_item_state other; other.set_bounding_box( bear::universe::rectangle_type( 3, 6, 9, 12 ) ); item.set_center_on( other ); BOOST_CHECK( item.get_center_of_mass() == other.get_center_of_mass() ); } static void check_fixed_x( bear::universe::physical_item_state& item ) { const bear::universe::position_type center( item.get_center_of_mass() ); const bear::universe::size_box_type size( item.get_size() ); const bear::universe::speed_type speed( item.get_speed() ); const bear::universe::force_type acceleration( item.get_acceleration() ); const bear::universe::force_type internal_force( item.get_internal_force() ); const bear::universe::force_type external_force( item.get_external_force() ); item.set_center_of_mass( 0, 8 ); BOOST_CHECK_EQUAL( item.get_horizontal_middle(), center.x ); BOOST_CHECK_EQUAL( item.get_vertical_middle(), 8 ); item.set_size( 0, 8 ); BOOST_CHECK_EQUAL( item.get_width(), size.x ); BOOST_CHECK_EQUAL( item.get_height(), 8 ); item.set_acceleration( bear::universe::force_type( 0, 8 ) ); BOOST_CHECK_EQUAL( item.get_acceleration().x, acceleration.x ); BOOST_CHECK_EQUAL( item.get_acceleration().y, 8 ); item.set_internal_force( bear::universe::force_type( 0, 8 ) ); BOOST_CHECK_EQUAL( item.get_internal_force().x, internal_force.x ); BOOST_CHECK_EQUAL( item.get_internal_force().y, 8 ); item.add_internal_force( bear::universe::force_type( 7, 8 ) ); BOOST_CHECK_EQUAL( item.get_internal_force().x, internal_force.x ); BOOST_CHECK_EQUAL( item.get_internal_force().y, 16 ); item.set_external_force( bear::universe::force_type( 0, 8 ) ); BOOST_CHECK_EQUAL( item.get_external_force().x, external_force.x ); BOOST_CHECK_EQUAL( item.get_external_force().y, 8 ); item.add_external_force( bear::universe::force_type( 7, 8 ) ); BOOST_CHECK_EQUAL( item.get_external_force().x, external_force.x ); BOOST_CHECK_EQUAL( item.get_external_force().y, 16 ); item.set_speed( bear::universe::speed_type( 0, 8 ) ); BOOST_CHECK_EQUAL( item.get_speed().x, speed.x ); BOOST_CHECK_EQUAL( item.get_speed().y, 8 ); item.set_speed( 0, 16 ); BOOST_CHECK_EQUAL( item.get_speed().x, speed.x ); BOOST_CHECK_EQUAL( item.get_speed().y, 16 ); using rectangle_traits = bear::universe::shape_traits< bear::universe::rectangle >; bear::universe::rectangle r; rectangle_traits::set_bounding_box ( r, bear::universe::rectangle_type( 6, 3, 4, 9 ) ); item.set_shape( r ); BOOST_CHECK_EQUAL( item.get_horizontal_middle(), center.x ); BOOST_CHECK_EQUAL( item.get_width(), size.x ); BOOST_CHECK_EQUAL( item.get_vertical_middle(), 6 ); BOOST_CHECK_EQUAL( item.get_height(), 6 ); } static void check_not_fixed( bear::universe::physical_item_state& item ) { const bear::universe::position_type center( item.get_center_of_mass() ); const bear::universe::size_box_type size( item.get_size() ); const bear::universe::speed_type speed( item.get_speed() ); const bear::universe::force_type acceleration( item.get_acceleration() ); const bear::universe::force_type internal_force( item.get_internal_force() ); const bear::universe::force_type external_force( item.get_external_force() ); item.set_center_of_mass( 0, 8 ); BOOST_CHECK_EQUAL( item.get_horizontal_middle(), 0 ); BOOST_CHECK_EQUAL( item.get_vertical_middle(), 8 ); item.set_size( 0, 8 ); BOOST_CHECK_EQUAL( item.get_width(), 0 ); BOOST_CHECK_EQUAL( item.get_height(), 8 ); item.set_acceleration( bear::universe::force_type( 0, 8 ) ); BOOST_CHECK_EQUAL( item.get_acceleration().x, 0 ); BOOST_CHECK_EQUAL( item.get_acceleration().y, 8 ); item.set_internal_force( bear::universe::force_type( 0, 8 ) ); BOOST_CHECK_EQUAL( item.get_internal_force().x, 0 ); BOOST_CHECK_EQUAL( item.get_internal_force().y, 8 ); item.add_internal_force( bear::universe::force_type( 7, 8 ) ); BOOST_CHECK_EQUAL( item.get_internal_force().x, 7 ); BOOST_CHECK_EQUAL( item.get_internal_force().y, 16 ); item.set_external_force( bear::universe::force_type( 0, 8 ) ); BOOST_CHECK_EQUAL( item.get_external_force().x, 0 ); BOOST_CHECK_EQUAL( item.get_external_force().y, 8 ); item.add_external_force( bear::universe::force_type( 7, 8 ) ); BOOST_CHECK_EQUAL( item.get_external_force().x, 7 ); BOOST_CHECK_EQUAL( item.get_external_force().y, 16 ); item.set_speed( bear::universe::speed_type( 0, 8 ) ); BOOST_CHECK_EQUAL( item.get_speed().x, 0 ); BOOST_CHECK_EQUAL( item.get_speed().y, 8 ); item.set_speed( 0, 16 ); BOOST_CHECK_EQUAL( item.get_speed().x, 0 ); BOOST_CHECK_EQUAL( item.get_speed().y, 16 ); using rectangle_traits = bear::universe::shape_traits< bear::universe::rectangle >; bear::universe::rectangle r; rectangle_traits::set_bounding_box ( r, bear::universe::rectangle_type( 6, 3, 4, 9 ) ); item.set_shape( r ); BOOST_CHECK_EQUAL( item.get_horizontal_middle(), 5 ); BOOST_CHECK_EQUAL( item.get_width(), 2 ); BOOST_CHECK_EQUAL( item.get_vertical_middle(), 6 ); BOOST_CHECK_EQUAL( item.get_height(), 6 ); } BOOST_AUTO_TEST_CASE( position_constraint_x_cumulative ) { bear::universe::physical_item_state item; item.set_size( 10, 20 ); item.set_center_of_mass( 3, 24 ); item.set_acceleration( bear::universe::force_type( 2, 4 ) ); item.set_internal_force( bear::universe::force_type( 4, 9 ) ); item.set_external_force( bear::universe::force_type( 9, 18 ) ); item.set_speed( bear::universe::speed_type( 1, -9 ) ); item.add_position_constraint_x(); check_fixed_x( item ); item.add_position_constraint_x(); item.remove_position_constraint_x(); check_fixed_x( item ); item.remove_position_constraint_x(); check_not_fixed( item ); } static void check_fixed_y( bear::universe::physical_item_state& item ) { const bear::universe::position_type center( item.get_center_of_mass() ); const bear::universe::size_box_type size( item.get_size() ); const bear::universe::speed_type speed( item.get_speed() ); const bear::universe::force_type acceleration( item.get_acceleration() ); const bear::universe::force_type internal_force( item.get_internal_force() ); const bear::universe::force_type external_force( item.get_external_force() ); item.set_center_of_mass( 0, 8 ); BOOST_CHECK_EQUAL( item.get_horizontal_middle(), 0 ); BOOST_CHECK_EQUAL( item.get_vertical_middle(), center.y ); item.set_size( 0, 8 ); BOOST_CHECK_EQUAL( item.get_width(), 0 ); BOOST_CHECK_EQUAL( item.get_height(), size.y ); item.set_acceleration( bear::universe::force_type( 0, 8 ) ); BOOST_CHECK_EQUAL( item.get_acceleration().x, 0 ); BOOST_CHECK_EQUAL( item.get_acceleration().y, acceleration.y ); item.set_internal_force( bear::universe::force_type( 0, 8 ) ); BOOST_CHECK_EQUAL( item.get_internal_force().x, 0 ); BOOST_CHECK_EQUAL( item.get_internal_force().y, internal_force.y ); item.add_internal_force( bear::universe::force_type( 7, 8 ) ); BOOST_CHECK_EQUAL( item.get_internal_force().x, 7 ); BOOST_CHECK_EQUAL( item.get_internal_force().y, internal_force.y ); item.set_external_force( bear::universe::force_type( 0, 8 ) ); BOOST_CHECK_EQUAL( item.get_external_force().x, 0 ); BOOST_CHECK_EQUAL( item.get_external_force().y, external_force.y ); item.add_external_force( bear::universe::force_type( 7, 8 ) ); BOOST_CHECK_EQUAL( item.get_external_force().x, 7 ); BOOST_CHECK_EQUAL( item.get_external_force().y, external_force.y ); item.set_speed( bear::universe::speed_type( 0, 8 ) ); BOOST_CHECK_EQUAL( item.get_speed().x, 0 ); BOOST_CHECK_EQUAL( item.get_speed().y, speed.y ); item.set_speed( 0, 16 ); BOOST_CHECK_EQUAL( item.get_speed().x, 0 ); BOOST_CHECK_EQUAL( item.get_speed().y, speed.y ); using rectangle_traits = bear::universe::shape_traits< bear::universe::rectangle >; bear::universe::rectangle r; rectangle_traits::set_bounding_box ( r, bear::universe::rectangle_type( 6, 3, 4, 9 ) ); item.set_shape( r ); BOOST_CHECK_EQUAL( item.get_horizontal_middle(), 5 ); BOOST_CHECK_EQUAL( item.get_width(), 2 ); BOOST_CHECK_EQUAL( item.get_vertical_middle(), center.y ); BOOST_CHECK_EQUAL( item.get_height(), size.y ); } BOOST_AUTO_TEST_CASE( position_constraint_y_cumulative ) { bear::universe::physical_item_state item; item.set_size( 10, 20 ); item.set_center_of_mass( 3, 24 ); item.set_acceleration( bear::universe::force_type( 2, 4 ) ); item.set_internal_force( bear::universe::force_type( 4, 9 ) ); item.set_external_force( bear::universe::force_type( 9, 18 ) ); item.set_speed( bear::universe::speed_type( 1, -9 ) ); item.add_position_constraint_y(); check_fixed_y( item ); item.add_position_constraint_y(); item.remove_position_constraint_y(); check_fixed_y( item ); item.remove_position_constraint_y(); check_not_fixed( item ); } static void check_fixed_both( bear::universe::physical_item_state& item ) { const bear::universe::position_type center( item.get_center_of_mass() ); const bear::universe::size_box_type size( item.get_size() ); const bear::universe::speed_type speed( item.get_speed() ); const bear::universe::force_type acceleration( item.get_acceleration() ); const bear::universe::force_type internal_force( item.get_internal_force() ); const bear::universe::force_type external_force( item.get_external_force() ); item.set_center_of_mass( 0, 8 ); BOOST_CHECK_EQUAL( item.get_horizontal_middle(), center.x ); BOOST_CHECK_EQUAL( item.get_vertical_middle(), center.y ); item.set_size( 0, 8 ); BOOST_CHECK_EQUAL( item.get_width(), size.x ); BOOST_CHECK_EQUAL( item.get_height(), size.y ); item.set_acceleration( bear::universe::force_type( 0, 8 ) ); BOOST_CHECK_EQUAL( item.get_acceleration().x, acceleration.x ); BOOST_CHECK_EQUAL( item.get_acceleration().y, acceleration.y ); item.set_internal_force( bear::universe::force_type( 0, 8 ) ); BOOST_CHECK_EQUAL( item.get_internal_force().x, internal_force.x ); BOOST_CHECK_EQUAL( item.get_internal_force().y, internal_force.y ); item.add_internal_force( bear::universe::force_type( 7, 8 ) ); BOOST_CHECK_EQUAL( item.get_internal_force().x, internal_force.x ); BOOST_CHECK_EQUAL( item.get_internal_force().y, internal_force.y ); item.set_external_force( bear::universe::force_type( 0, 8 ) ); BOOST_CHECK_EQUAL( item.get_external_force().x, external_force.x ); BOOST_CHECK_EQUAL( item.get_external_force().y, external_force.y ); item.add_external_force( bear::universe::force_type( 7, 8 ) ); BOOST_CHECK_EQUAL( item.get_external_force().x, external_force.x ); BOOST_CHECK_EQUAL( item.get_external_force().y, external_force.y ); item.set_speed( bear::universe::speed_type( 0, 8 ) ); BOOST_CHECK_EQUAL( item.get_speed().x, speed.x ); BOOST_CHECK_EQUAL( item.get_speed().y, speed.y ); item.set_speed( 0, 16 ); BOOST_CHECK_EQUAL( item.get_speed().x, speed.x ); BOOST_CHECK_EQUAL( item.get_speed().y, speed.y ); using rectangle_traits = bear::universe::shape_traits< bear::universe::rectangle >; bear::universe::rectangle r; rectangle_traits::set_bounding_box ( r, bear::universe::rectangle_type( 6, 3, 4, 9 ) ); item.set_shape( r ); BOOST_CHECK_EQUAL( item.get_horizontal_middle(), center.x ); BOOST_CHECK_EQUAL( item.get_width(), size.x ); BOOST_CHECK_EQUAL( item.get_vertical_middle(), center.y ); BOOST_CHECK_EQUAL( item.get_height(), size.y ); } BOOST_AUTO_TEST_CASE( position_constraint_both ) { bear::universe::physical_item_state item; item.set_size( 10, 20 ); item.set_center_of_mass( 3, 24 ); item.set_acceleration( bear::universe::force_type( 2, 4 ) ); item.set_internal_force( bear::universe::force_type( 4, 9 ) ); item.set_external_force( bear::universe::force_type( 9, 18 ) ); item.set_speed( bear::universe::speed_type( 1, -9 ) ); item.add_position_constraints(); check_fixed_both( item ); item.add_position_constraints(); item.remove_position_constraints(); check_fixed_both( item ); item.remove_position_constraints(); check_not_fixed( item ); } BOOST_AUTO_TEST_CASE( copy ) { bear::universe::physical_item_state item; item.set_size( 10, 20 ); item.set_center_of_mass( 3, 24 ); item.set_acceleration( bear::universe::force_type( 2, 4 ) ); item.set_internal_force( bear::universe::force_type( 4, 9 ) ); item.set_external_force( bear::universe::force_type( 9, 18 ) ); item.set_speed( bear::universe::speed_type( 1, -9 ) ); item.fix(); const bear::universe::physical_item_state other( item ); BOOST_CHECK( other.get_size() == item.get_size() ); BOOST_CHECK( other.get_center_of_mass() == item.get_center_of_mass() ); BOOST_CHECK( other.get_acceleration() == item.get_acceleration() ); BOOST_CHECK( other.get_internal_force() == item.get_internal_force() ); BOOST_CHECK( other.get_external_force() == item.get_external_force() ); BOOST_CHECK( other.get_speed() == item.get_speed() ); BOOST_CHECK( !other.is_fixed() ); } BOOST_AUTO_TEST_CASE( set_physical_state ) { bear::universe::physical_item_state item; item.set_size( 10, 20 ); item.set_center_of_mass( 3, 24 ); item.set_acceleration( bear::universe::force_type( 2, 4 ) ); item.set_internal_force( bear::universe::force_type( 4, 9 ) ); item.set_external_force( bear::universe::force_type( 9, 18 ) ); item.set_speed( bear::universe::speed_type( 1, -9 ) ); bear::universe::physical_item_state other; other.set_physical_state( item ); BOOST_CHECK( other.get_size() == item.get_size() ); BOOST_CHECK( other.get_center_of_mass() == item.get_center_of_mass() ); BOOST_CHECK( other.get_acceleration() == item.get_acceleration() ); BOOST_CHECK( other.get_internal_force() == item.get_internal_force() ); BOOST_CHECK( other.get_external_force() == item.get_external_force() ); BOOST_CHECK( other.get_speed() == item.get_speed() ); } BOOST_AUTO_TEST_CASE( set_physical_state_fixed ) { bear::universe::physical_item_state item; item.set_size( 10, 20 ); item.set_center_of_mass( 3, 24 ); item.set_acceleration( bear::universe::force_type( 2, 4 ) ); item.set_internal_force( bear::universe::force_type( 4, 9 ) ); item.set_external_force( bear::universe::force_type( 9, 18 ) ); item.set_speed( bear::universe::speed_type( 1, -9 ) ); bear::universe::physical_item_state other; other.set_size( 15, 24 ); other.set_center_of_mass( 9, 4 ); other.set_acceleration( bear::universe::force_type( 4, 2 ) ); other.set_internal_force( bear::universe::force_type( 9, 4 ) ); other.set_external_force( bear::universe::force_type( 33, 1 ) ); other.set_speed( bear::universe::speed_type( 93, 1934 ) ); other.fix(); const bear::universe::physical_item_state ref( other ); other.set_physical_state( item ); BOOST_CHECK( other.get_size() == ref.get_size() ); BOOST_CHECK( other.get_center_of_mass() == ref.get_center_of_mass() ); BOOST_CHECK( other.get_acceleration() == ref.get_acceleration() ); BOOST_CHECK( other.get_internal_force() == ref.get_internal_force() ); BOOST_CHECK( other.get_external_force() == ref.get_external_force() ); BOOST_CHECK( other.get_speed() == ref.get_speed() ); } plee-the-bear-20251226/bear-engine/core/test/universe/test-cases/world_active_region.cpp000066400000000000000000000031021512343254000311130ustar00rootroot00000000000000#include "universe/world.hpp" #include "test/universe/item_call_tracker.hpp" #define BOOST_TEST_MODULE bear::universe::world #include namespace test { static const bear::universe::size_box_type g_world_size( 1000, 1000 ); class active_region_item: public bear::universe::physical_item { public: void enters_active_region() override { enters_called = true; } void leaves_active_region() override { leaves_called = true; } public: bool enters_called = false; bool leaves_called = false; }; } BOOST_AUTO_TEST_CASE( enters_active_region ) { test::active_region_item item; bear::universe::world world( test::g_world_size ); item.set_center_of_mass( 10, 10 ); world.register_item( &item ); { bear::universe::world::region_type region; region.push_back( bear::universe::rectangle_type( 200, 200, 100, 100 ) ); world.progress_entities( region, 1 ); BOOST_CHECK( !item.enters_called ); BOOST_CHECK( !item.leaves_called ); } { bear::universe::world::region_type region; region.push_back( bear::universe::rectangle_type( 0, 0, 100, 100 ) ); world.progress_entities( region, 1 ); BOOST_CHECK( item.enters_called ); BOOST_CHECK( !item.leaves_called ); } item.enters_called = false; { bear::universe::world::region_type region; region.push_back( bear::universe::rectangle_type( 0, 0, 100, 100 ) ); world.progress_entities( region, 1 ); BOOST_CHECK( !item.enters_called ); BOOST_CHECK( !item.leaves_called ); } } plee-the-bear-20251226/bear-engine/core/test/universe/test-cases/world_collisions.cpp000066400000000000000000000146471512343254000304730ustar00rootroot00000000000000#include "universe/collision_info.hpp" #include "universe/world.hpp" #include "test/universe/item_mockup.hpp" #define BOOST_TEST_MODULE bear::universe::world #include namespace test { static const bear::universe::size_box_type g_world_size( 1000, 1000 ); static const bear::universe::world::region_type g_update_region = []() -> bear::universe::world::region_type { bear::universe::world::region_type region; region.push_back( bear::universe::rectangle_type( 0, 0, 1000, 1000 ) ); return region; }(); } BOOST_AUTO_TEST_CASE( double_collision ) { bear::universe::world world( test::g_world_size ); world.set_gravity( bear::universe::force_type( 0, 0 ) ); test::universe::item_mockup itemA; itemA.set_size( 10, 10 ); itemA.set_center_of_mass( 100, 100 ); itemA.set_mass( 50 ); world.register_item( &itemA ); test::universe::item_mockup itemB; itemB.set_size( 10, 10 ); itemB.set_center_of_mass( 90, 90 ); itemB.set_mass( 50 ); world.register_item( &itemB ); test::universe::item_mockup itemC; itemC.set_size( 10, 10 ); itemC.set_center_of_mass( 110, 110 ); itemC.set_mass( 50 ); world.register_item( &itemC ); itemB.time_step_impl = [ &itemB ]( bear::universe::time_type ) -> void { itemB.set_center_of_mass( 100, 100 ); }; itemC.time_step_impl = [ &itemC ]( bear::universe::time_type ) -> void { itemC.set_center_of_mass( 100, 100 ); }; itemA.collision_impl = []( bear::universe::collision_info& info ) -> void { info.other_item().set_center_of_mass ( info.other_previous_state().get_center_of_mass() ); }; bool collisionBA( false ); bool collisionBC( false ); bool collisionCA( false ); itemB.collision_impl = [ & ]( bear::universe::collision_info& info ) -> void { if ( &info.other_item() == &itemA ) collisionBA = true; else if ( &info.other_item() == &itemC ) collisionBC = true; }; itemC.collision_impl = [ & ]( bear::universe::collision_info& info ) -> void { if ( &info.other_item() == &itemA ) collisionCA = true; else if ( &info.other_item() == &itemB ) collisionBC = true; }; world.progress_entities( test::g_update_region, 1 ); BOOST_CHECK( collisionBA ); BOOST_CHECK( collisionCA ); BOOST_CHECK( !collisionBC ); } BOOST_AUTO_TEST_CASE( chain_of_four ) { bear::universe::world world( test::g_world_size ); test::universe::item_mockup itemA; itemA.set_size( 10, 10 ); itemA.set_center_of_mass( 100, 50 ); itemA.set_mass( 50 ); world.register_item( &itemA ); test::universe::item_mockup itemB; itemB.set_size( 10, 10 ); itemB.set_center_of_mass( 110, 50 ); itemB.set_mass( 50 ); world.register_item( &itemB ); test::universe::item_mockup itemC; itemC.set_size( 10, 10 ); itemC.set_center_of_mass( 120, 50 ); itemC.set_mass( 50 ); world.register_item( &itemC ); test::universe::item_mockup itemD; itemD.set_size( 10, 10 ); itemD.set_center_of_mass( 130, 50 ); itemD.set_mass( 50 ); world.register_item( &itemD ); itemA.time_step_impl = [ &itemA ]( bear::universe::time_type ) -> void { itemA.set_center_of_mass( 105, 100 ); }; itemB.time_step_impl = [ &itemB ]( bear::universe::time_type ) -> void { itemB.set_center_of_mass( 113, 100 ); }; itemC.time_step_impl = [ &itemC ]( bear::universe::time_type ) -> void { itemC.set_center_of_mass( 121, 100 ); }; itemD.time_step_impl = [ &itemD ]( bear::universe::time_type ) -> void { itemD.set_center_of_mass( 129, 100 ); }; bool collisionAB( false ); bool collisionBC( false ); bool collisionCD( false ); itemA.collision_impl = [ &itemB, &collisionAB ]( bear::universe::collision_info& info ) -> void { info.other_item().set_center_of_mass ( info.other_previous_state().get_center_of_mass() ); if ( &info.other_item() == &itemB ) collisionAB = true; }; itemB.collision_impl = [ &itemC, &collisionBC ]( bear::universe::collision_info& info ) -> void { if ( &info.other_item() == &itemC ) collisionBC = true; }; itemC.collision_impl = [ &itemB, &collisionBC ]( bear::universe::collision_info& info ) -> void { if ( &info.other_item() == &itemB ) collisionBC = true; }; itemD.collision_impl = [ &itemC, &collisionCD ]( bear::universe::collision_info& info ) -> void { info.other_item().set_center_of_mass ( info.other_previous_state().get_center_of_mass() ); if ( &info.other_item() == &itemC ) collisionCD = true; }; world.progress_entities( test::g_update_region, 1 ); BOOST_CHECK( collisionAB ); BOOST_CHECK( collisionCD ); BOOST_CHECK( !collisionBC ); } BOOST_AUTO_TEST_CASE( successive_collisions ) { bear::universe::world world( test::g_world_size ); world.set_gravity( bear::universe::force_type( 0, 0 ) ); test::universe::item_mockup itemA; itemA.set_size( 10, 10 ); itemA.set_center_of_mass( 100, 100 ); itemA.set_mass( 50 ); world.register_item( &itemA ); test::universe::item_mockup itemB; itemB.set_size( 10, 10 ); itemB.set_center_of_mass( 90, 90 ); itemB.set_mass( 50 ); world.register_item( &itemB ); test::universe::item_mockup itemC; itemC.set_size( 10, 10 ); itemC.set_center_of_mass( 110, 110 ); itemC.set_mass( 50 ); world.register_item( &itemC ); itemB.time_step_impl = [ &itemB ]( bear::universe::time_type ) -> void { itemB.set_center_of_mass( 100, 100 ); }; itemA.collision_impl = []( bear::universe::collision_info& info ) -> void { info.other_item().set_center_of_mass( 110, 110 ); }; bool collisionBA( false ); bool collisionBC( false ); bool collisionCA( false ); itemB.collision_impl = [ & ]( bear::universe::collision_info& info ) -> void { if ( &info.other_item() == &itemA ) collisionBA = true; else if ( &info.other_item() == &itemC ) collisionBC = true; }; itemC.collision_impl = [ & ]( bear::universe::collision_info& info ) -> void { if ( &info.other_item() == &itemA ) collisionCA = true; else if ( &info.other_item() == &itemB ) collisionBC = true; }; world.progress_entities( test::g_update_region, 1 ); BOOST_CHECK( collisionBA ); BOOST_CHECK( !collisionCA ); BOOST_CHECK( collisionBC ); } plee-the-bear-20251226/bear-engine/core/test/universe/test-cases/world_density.cpp000066400000000000000000000042661512343254000277700ustar00rootroot00000000000000#include "universe/density_rectangle.hpp" #include "universe/world.hpp" #define BOOST_TEST_MODULE bear::universe::world #include namespace test { static const bear::universe::size_box_type g_world_size( 1000, 1000 ); } BOOST_AUTO_TEST_CASE( default_density ) { bear::universe::world world( test::g_world_size ); world.set_default_density( 16 ); BOOST_CHECK_EQUAL ( world.get_average_density ( bear::universe::rectangle_type( 10, 10, 20, 20 ) ), 16 ); } BOOST_AUTO_TEST_CASE( in_one_density_rectangle ) { bear::universe::world world( test::g_world_size ); world.set_default_density( 1 ); world.add_density_rectangle ( bear::universe::rectangle_type( 10, 10, 20, 20 ), 2 ); BOOST_CHECK_EQUAL ( world.get_average_density ( bear::universe::rectangle_type( 10, 10, 20, 20 ) ), 2 ); } BOOST_AUTO_TEST_CASE( in_two_density_rectangles ) { bear::universe::world world( test::g_world_size ); world.set_default_density( 1 ); world.add_density_rectangle ( bear::universe::rectangle_type( 10, 10, 20, 20 ), 2 ); world.add_density_rectangle ( bear::universe::rectangle_type( 20, 10, 30, 20 ), 4 ); BOOST_CHECK_EQUAL ( world.get_average_density ( bear::universe::rectangle_type( 15, 12, 25, 17 ) ), 3 ); } BOOST_AUTO_TEST_CASE( partially_in_one_density_rectangle ) { bear::universe::world world( test::g_world_size ); world.set_default_density( 1 ); world.add_density_rectangle ( bear::universe::rectangle_type( 10, 10, 20, 20 ), 2 ); BOOST_CHECK_EQUAL ( world.get_average_density ( bear::universe::rectangle_type( 5, 10, 15, 20 ) ), 1.5 ); } BOOST_AUTO_TEST_CASE( changing_density_rectangle ) { bear::universe::world world( test::g_world_size ); world.set_default_density( 1 ); bear::universe::density_rectangle* const r ( world.add_density_rectangle ( bear::universe::rectangle_type( 10, 10, 20, 20 ), 2 ) ); r->rectangle = bear::universe::rectangle_type( 5, 10, 15, 20 ); r->density = 12; BOOST_CHECK_EQUAL ( world.get_average_density ( bear::universe::rectangle_type( 5, 10, 15, 20 ) ), 12 ); } plee-the-bear-20251226/bear-engine/core/test/universe/test-cases/world_environment.cpp000066400000000000000000000121001512343254000306370ustar00rootroot00000000000000#include "universe/environment_rectangle.hpp" #include "universe/world.hpp" #define BOOST_TEST_MODULE bear::universe::world #include namespace test { static const bear::universe::size_box_type g_world_size( 1000, 1000 ); } BOOST_AUTO_TEST_CASE( default_environment ) { bear::universe::world world( test::g_world_size ); world.set_default_environment ( bear::universe::environment_type::ice_environment ); std::set< bear::universe::environment_type > environments; world.get_environments ( bear::universe::rectangle_type( 10, 10, 20, 20 ), environments ); BOOST_CHECK ( environments.find( bear::universe::environment_type::ice_environment ) != environments.end() ); } BOOST_AUTO_TEST_CASE( in_one_environment_rectangle ) { bear::universe::world world( test::g_world_size ); world.set_default_environment ( bear::universe::environment_type::ice_environment ); world.add_environment_rectangle ( bear::universe::rectangle_type( 10, 10, 20, 20 ), bear::universe::environment_type::fire_environment ); std::set< bear::universe::environment_type > environments; world.get_environments ( bear::universe::rectangle_type( 10, 10, 20, 20 ), environments ); BOOST_CHECK ( environments.find( bear::universe::environment_type::fire_environment ) != environments.end() ); BOOST_CHECK ( environments.find( bear::universe::environment_type::ice_environment ) == environments.end() ); } BOOST_AUTO_TEST_CASE( in_two_environment_rectangles ) { bear::universe::world world( test::g_world_size ); world.set_default_environment ( bear::universe::environment_type::ice_environment ); world.add_environment_rectangle ( bear::universe::rectangle_type( 10, 10, 20, 20 ), bear::universe::environment_type::fire_environment ); world.add_environment_rectangle ( bear::universe::rectangle_type( 20, 10, 30, 20 ), bear::universe::environment_type::water_environment ); std::set< bear::universe::environment_type > environments; world.get_environments ( bear::universe::rectangle_type( 15, 12, 25, 17 ), environments ); BOOST_CHECK ( environments.find( bear::universe::environment_type::fire_environment ) != environments.end() ); BOOST_CHECK ( environments.find( bear::universe::environment_type::water_environment ) != environments.end() ); BOOST_CHECK ( environments.find( bear::universe::environment_type::ice_environment ) == environments.end() ); } BOOST_AUTO_TEST_CASE( partially_in_one_environment_rectangle ) { bear::universe::world world( test::g_world_size ); world.set_default_environment ( bear::universe::environment_type::ice_environment ); world.add_environment_rectangle ( bear::universe::rectangle_type( 10, 10, 20, 20 ), bear::universe::environment_type::fire_environment ); std::set< bear::universe::environment_type > environments; world.get_environments ( bear::universe::rectangle_type( 5, 10, 15, 20 ), environments ); BOOST_CHECK ( environments.find( bear::universe::environment_type::fire_environment ) != environments.end() ); BOOST_CHECK ( environments.find( bear::universe::environment_type::ice_environment ) != environments.end() ); } BOOST_AUTO_TEST_CASE( changing_environment_rectangle ) { bear::universe::world world( test::g_world_size ); world.set_default_environment ( bear::universe::environment_type::ice_environment ); bear::universe::environment_rectangle* const r ( world.add_environment_rectangle ( bear::universe::rectangle_type( 10, 10, 20, 20 ), bear::universe::environment_type::fire_environment ) ); r->rectangle = bear::universe::rectangle_type( 5, 10, 15, 20 ); r->environment = bear::universe::environment_type::water_environment; std::set< bear::universe::environment_type > environments; world.get_environments ( bear::universe::rectangle_type( 5, 10, 15, 20 ), environments ); BOOST_CHECK ( environments.find( bear::universe::environment_type::water_environment ) != environments.end() ); BOOST_CHECK_EQUAL( environments.size(), 1 ); } BOOST_AUTO_TEST_CASE( is_in_environment ) { bear::universe::world world( test::g_world_size ); world.set_default_environment ( bear::universe::environment_type::ice_environment ); world.add_environment_rectangle ( bear::universe::rectangle_type( 10, 10, 20, 20 ), bear::universe::environment_type::fire_environment ); world.add_environment_rectangle ( bear::universe::rectangle_type( 0, 0, 40, 40 ), bear::universe::environment_type::water_environment ); BOOST_CHECK ( world.is_in_environment ( bear::universe::position_type( 15, 15 ), bear::universe::environment_type::fire_environment ) ); BOOST_CHECK ( world.is_in_environment ( bear::universe::position_type( 15, 15 ), bear::universe::environment_type::water_environment ) ); BOOST_CHECK ( !world.is_in_environment ( bear::universe::position_type( 15, 15 ), bear::universe::environment_type::ice_environment ) ); } plee-the-bear-20251226/bear-engine/core/test/universe/test-cases/world_force.cpp000066400000000000000000000044101512343254000273760ustar00rootroot00000000000000#include "universe/force_rectangle.hpp" #include "universe/world.hpp" #define BOOST_TEST_MODULE bear::universe::world #include namespace test { static const bear::universe::size_box_type g_world_size( 1000, 1000 ); } BOOST_AUTO_TEST_CASE( in_one_force_rectangle ) { bear::universe::world world( test::g_world_size ); world.add_force_rectangle ( bear::universe::rectangle_type( 10, 10, 20, 20 ), bear::universe::force_type( 3, 2 ) ); const bear::universe::force_type f ( world.get_average_force ( bear::universe::rectangle_type( 10, 10, 20, 20 ) ) ); BOOST_CHECK_EQUAL( f.x, 3 ); BOOST_CHECK_EQUAL( f.y, 2 ); } BOOST_AUTO_TEST_CASE( in_two_force_rectangles ) { bear::universe::world world( test::g_world_size ); world.add_force_rectangle ( bear::universe::rectangle_type( 10, 10, 20, 20 ), bear::universe::force_type( 3, 2 ) ); world.add_force_rectangle ( bear::universe::rectangle_type( 20, 10, 30, 20 ), bear::universe::force_type( 4, 3 ) ); const bear::universe::force_type f ( world.get_average_force ( bear::universe::rectangle_type( 15, 12, 25, 17 ) ) ); BOOST_CHECK_EQUAL( f.x, 3.5 ); BOOST_CHECK_EQUAL( f.y, 2.5 ); } BOOST_AUTO_TEST_CASE( partially_in_one_force_rectangle ) { bear::universe::world world( test::g_world_size ); world.add_force_rectangle ( bear::universe::rectangle_type( 10, 10, 20, 20 ), bear::universe::force_type( 3, 2 ) ); const bear::universe::force_type f ( world.get_average_force ( bear::universe::rectangle_type( 5, 10, 15, 20 ) ) ); BOOST_CHECK_EQUAL( f.x, 1.5 ); BOOST_CHECK_EQUAL( f.y, 1 ); } BOOST_AUTO_TEST_CASE( changing_force_rectangle ) { bear::universe::world world( test::g_world_size ); bear::universe::force_rectangle* const r ( world.add_force_rectangle ( bear::universe::rectangle_type( 10, 10, 20, 20 ), bear::universe::force_type( 3, 2 ) ) ); r->rectangle = bear::universe::rectangle_type( 5, 10, 15, 20 ); r->force = bear::universe::force_type( 6, 8 ); const bear::universe::force_type f ( world.get_average_force ( bear::universe::rectangle_type( 5, 10, 15, 20 ) ) ); BOOST_CHECK_EQUAL( f.x, 6 ); BOOST_CHECK_EQUAL( f.y, 8 ); } plee-the-bear-20251226/bear-engine/core/test/universe/test-cases/world_friction.cpp000066400000000000000000000043151512343254000301210ustar00rootroot00000000000000#include "universe/friction_rectangle.hpp" #include "universe/world.hpp" #define BOOST_TEST_MODULE bear::universe::world #include namespace test { static const bear::universe::size_box_type g_world_size( 1000, 1000 ); } BOOST_AUTO_TEST_CASE( default_friction ) { bear::universe::world world( test::g_world_size ); world.set_default_friction( 16 ); BOOST_CHECK_EQUAL ( world.get_average_friction ( bear::universe::rectangle_type( 10, 10, 20, 20 ) ), 16 ); } BOOST_AUTO_TEST_CASE( in_one_friction_rectangle ) { bear::universe::world world( test::g_world_size ); world.set_default_friction( 1 ); world.add_friction_rectangle ( bear::universe::rectangle_type( 10, 10, 20, 20 ), 2 ); BOOST_CHECK_EQUAL ( world.get_average_friction ( bear::universe::rectangle_type( 10, 10, 20, 20 ) ), 2 ); } BOOST_AUTO_TEST_CASE( in_two_friction_rectangles ) { bear::universe::world world( test::g_world_size ); world.set_default_friction( 1 ); world.add_friction_rectangle ( bear::universe::rectangle_type( 10, 10, 20, 20 ), 2 ); world.add_friction_rectangle ( bear::universe::rectangle_type( 20, 10, 30, 20 ), 4 ); BOOST_CHECK_EQUAL ( world.get_average_friction ( bear::universe::rectangle_type( 15, 12, 25, 17 ) ), 3 ); } BOOST_AUTO_TEST_CASE( partially_in_one_friction_rectangle ) { bear::universe::world world( test::g_world_size ); world.set_default_friction( 1 ); world.add_friction_rectangle ( bear::universe::rectangle_type( 10, 10, 20, 20 ), 2 ); BOOST_CHECK_EQUAL ( world.get_average_friction ( bear::universe::rectangle_type( 5, 10, 15, 20 ) ), 1.5 ); } BOOST_AUTO_TEST_CASE( changing_friction_rectangle ) { bear::universe::world world( test::g_world_size ); world.set_default_friction( 1 ); bear::universe::friction_rectangle* const r ( world.add_friction_rectangle ( bear::universe::rectangle_type( 10, 10, 20, 20 ), 2 ) ); r->rectangle = bear::universe::rectangle_type( 5, 10, 15, 20 ); r->friction = 12; BOOST_CHECK_EQUAL ( world.get_average_friction ( bear::universe::rectangle_type( 5, 10, 15, 20 ) ), 12 ); } plee-the-bear-20251226/bear-engine/core/test/universe/test-cases/world_items.cpp000066400000000000000000000020541512343254000274230ustar00rootroot00000000000000#include "universe/world.hpp" #include "test/universe/item_call_tracker.hpp" #define BOOST_TEST_MODULE bear::universe::world #include namespace test { static const bear::universe::size_box_type g_world_size( 1000, 1000 ); static const bear::universe::world::region_type g_update_region = []() -> bear::universe::world::region_type { bear::universe::world::region_type region; region.push_back( bear::universe::rectangle_type( 0, 0, 1000, 1000 ) ); return region; }(); } BOOST_AUTO_TEST_CASE( insert_static_is_fixed ) { bear::universe::physical_item item; bear::universe::world world( test::g_world_size ); world.add_static( &item ); BOOST_CHECK( item.is_fixed() ); } BOOST_AUTO_TEST_CASE( insert_static_not_moved ) { bear::universe::world world( test::g_world_size ); test::universe::item_function_call result; test::universe::item_call_tracker item( result ); world.add_static( &item ); world.progress_entities( test::g_update_region, 1 ); BOOST_CHECK( result.move.empty() ); } plee-the-bear-20251226/bear-engine/core/test/universe/test-cases/world_update.cpp000066400000000000000000000114401512343254000275630ustar00rootroot00000000000000#include "universe/world.hpp" #include "universe/forced_movement/forced_tracking.hpp" #include "test/universe/item_call_tracker.hpp" #define BOOST_TEST_MODULE bear::universe::world/update #include #include namespace test { static const bear::universe::size_box_type g_world_size( 1000, 1000 ); static const bear::universe::world::region_type g_update_region = []() -> bear::universe::world::region_type { bear::universe::world::region_type region; region.push_back( bear::universe::rectangle_type( 0, 0, 1000, 1000 ) ); return region; }(); } BOOST_AUTO_TEST_CASE( progress_order_movement_reference ) { test::universe::item_function_call result; test::universe::item_call_tracker item1( result ); test::universe::item_call_tracker item2( result ); bear::universe::world world( test::g_world_size ); world.register_item( &item1 ); world.register_item( &item2 ); item1.set_movement_reference( &item2 ); world.progress_entities( test::g_update_region, 1 ); test::universe::item_function_call expected; expected.time_step.push_back( &item2 ); expected.time_step.push_back( &item1 ); expected.move = expected.time_step; BOOST_CHECK_EQUAL_COLLECTIONS ( result.time_step.begin(), result.time_step.end(), expected.time_step.begin(), expected.time_step.end() ); BOOST_CHECK_EQUAL_COLLECTIONS ( result.move.begin(), result.move.end(), expected.move.begin(), expected.move.end() ); } BOOST_AUTO_TEST_CASE( progress_order_dependent_items ) { test::universe::item_function_call result; test::universe::item_call_tracker item1( result ); test::universe::item_call_tracker item2( result ); bear::universe::world world( test::g_world_size ); world.register_item( &item1 ); world.register_item( &item2 ); item2.add_dependent_item( item1 ); world.progress_entities( test::g_update_region, 1 ); test::universe::item_function_call expected; expected.time_step.push_back( &item2 ); expected.time_step.push_back( &item1 ); expected.move = expected.time_step; BOOST_CHECK_EQUAL_COLLECTIONS ( result.time_step.begin(), result.time_step.end(), expected.time_step.begin(), expected.time_step.end() ); BOOST_CHECK_EQUAL_COLLECTIONS ( result.move.begin(), result.move.end(), expected.move.begin(), expected.move.end() ); } BOOST_AUTO_TEST_CASE( progress_order_forced_movement ) { test::universe::item_function_call result; test::universe::item_call_tracker item1( result ); test::universe::item_call_tracker item2( result ); bear::universe::world world( test::g_world_size ); world.register_item( &item1 ); world.register_item( &item2 ); bear::universe::forced_tracking movement; movement.set_reference_point_on_center( item2 ); item1.set_forced_movement( movement ); world.progress_entities( test::g_update_region, 1 ); test::universe::item_function_call expected; expected.time_step.push_back( &item2 ); expected.time_step.push_back( &item1 ); expected.move = expected.time_step; BOOST_CHECK_EQUAL_COLLECTIONS ( result.time_step.begin(), result.time_step.end(), expected.time_step.begin(), expected.time_step.end() ); BOOST_CHECK_EQUAL_COLLECTIONS ( result.move.begin(), result.move.end(), expected.move.begin(), expected.move.end() ); } BOOST_AUTO_TEST_CASE( progress_order ) { test::universe::item_function_call result; std::array< test::universe::item_call_tracker, 5 > items = { test::universe::item_call_tracker( result ), test::universe::item_call_tracker( result ), test::universe::item_call_tracker( result ), test::universe::item_call_tracker( result ), test::universe::item_call_tracker( result ) }; bear::universe::world world( test::g_world_size ); for ( test::universe::item_call_tracker& item : items ) world.register_item( &item ); items[ 3 ].set_movement_reference( &items[ 0 ] ); bear::universe::forced_tracking movement; movement.set_reference_point_on_center( items[ 3 ] ); items[ 1 ].set_forced_movement( movement ); items[ 1 ].add_dependent_item( items[ 2 ] ); items[ 4 ].set_movement_reference( &items[ 2 ] ); world.progress_entities( test::g_update_region, 1 ); test::universe::item_function_call expected; expected.time_step.push_back( &items[ 0 ] ); expected.time_step.push_back( &items[ 3 ] ); expected.time_step.push_back( &items[ 1 ] ); expected.time_step.push_back( &items[ 2 ] ); expected.time_step.push_back( &items[ 4 ] ); expected.move = expected.time_step; BOOST_CHECK_EQUAL_COLLECTIONS ( result.time_step.begin(), result.time_step.end(), expected.time_step.begin(), expected.time_step.end() ); BOOST_CHECK_EQUAL_COLLECTIONS ( result.move.begin(), result.move.end(), expected.move.begin(), expected.move.end() ); } plee-the-bear-20251226/bear-engine/desktop/000077500000000000000000000000001512343254000202155ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/desktop/CMakeLists.txt000066400000000000000000000000341512343254000227520ustar00rootroot00000000000000subdirs( man locale ) plee-the-bear-20251226/bear-engine/desktop/gimp/000077500000000000000000000000001512343254000211515ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/desktop/gimp/plug-ins/000077500000000000000000000000001512343254000227075ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/desktop/gimp/plug-ins/bear-font.py000077500000000000000000000356271512343254000251560ustar00rootroot00000000000000#!/usr/bin/env python # _*_ coding: utf_8 _*_ # # Bear Engine's font script for use with The Gimp # gimp proc from gimpfu import * # i18n import gettext locale_directory = gimp.locale_directory gettext.install( "gimp20-template" , locale_directory, unicode=True ) # usefull import import os MAX_IMAGE_SIZE = 512 class FontBuilder: def __init__(self, image, drawable, directory=os.getcwd() ): self.image = image self.drawable = drawable self.save_directory = directory self.font_image = gimp.Image(image.width, image.height, RGB_IMAGE) self.font_image.disable_undo() # remove all layer (ie. the default background layer) for layer in self.font_image.layers: self.font_image.remove_layer(layer) self.font_layer_list = list() self.complete_glyph_dict = dict() self.fnt_content = "" self.glyph_width = image.width self.glyph_height = image.height self.glyph_per_row = 0 self.glyph_per_column = 0 self.font_image_ajustment = 100 # add glyph layer to font layer list def createFontLayerList(self): for layer in self.image.layers: if len(unicode(layer.name)) == 1: if layer.name == " " or self.hasVisiblePixel(layer) is True: tmp_layer = pdb.gimp_layer_new_from_drawable(layer, self.font_image) tmp_layer.name = layer.name tmp_layer.visible = True self.font_layer_list.append(tmp_layer) # complete glyph list def completeGlyphList(self, uppercase=False, lowercase=False): glyph_list = list() for layer in self.font_image.layers: glyph_list.append(layer.name) for layer in self.font_image.layers: self.complete_glyph_dict[layer.name] = list() if uppercase is True: upper = unicode(layer.name).upper() if upper not in glyph_list: self.complete_glyph_dict[layer.name].append(upper) if lowercase is True: lower = unicode(layer.name).lower() if lower not in glyph_list: self.complete_glyph_dict[layer.name].append(lower) def calculateImageSizes(self, font_image_ajustment=100): glyph_width = int(round(self.font_image.width * (font_image_ajustment / 100))) glyph_heigth = int(round(self.font_image.height * (font_image_ajustment / 100))) total_glyph = len(self.font_layer_list) if total_glyph > 0: glyph_counter = 0 self.glyph_per_row = 1 self.glyph_per_column = 1 while glyph_width * (self.glyph_per_row + 1) < MAX_IMAGE_SIZE and glyph_counter < total_glyph: self.glyph_per_row = self.glyph_per_row + 1 glyph_counter = glyph_counter + 1 while glyph_counter < total_glyph: self.glyph_per_column = self.glyph_per_column + 1 glyph_counter = glyph_counter * 2 # resize the font image (width and height are power of two) def resizeFontImage(self, font_image_ajustment=100): self.font_image_ajustment = font_image_ajustment self.font_image.scale(int( round(self.font_image.width * (font_image_ajustment / 100))), int(round(self.font_image.height * (font_image_ajustment / 100)))) self.glyph_width = self.font_image.width self.glyph_height = self.font_image.height total_glyph = len(self.font_layer_list) if total_glyph > 0: glyph_counter = 0 self.glyph_per_row = 1 self.glyph_per_column = 1 while self.glyph_width * (self.glyph_per_row + 1) < MAX_IMAGE_SIZE and glyph_counter < total_glyph: self.glyph_per_row = self.glyph_per_row + 1 glyph_counter = glyph_counter + 1 while glyph_counter < total_glyph: self.glyph_per_column = self.glyph_per_column + 1 glyph_counter = glyph_counter * 2 # calculate size image (width and height are power of two) # x size x = 1 while ( self.glyph_width * self.glyph_per_row ) > 2**x: x = x + 1 x_offset = 2**x - ( self.glyph_width * self.glyph_per_row ) image_width = (self.glyph_width * self.glyph_per_row) + x_offset # y size y = 1 while ( self.glyph_height * self.glyph_per_column ) > 2**y: y = y + 1 y_offset = 2**y - (self.glyph_height * self.glyph_per_column) image_height = (self.glyph_height * self.glyph_per_column) + y_offset # resize font image self.font_image.resize(image_width, image_height, 0, 0) # add glyph layers to the font image def addFontLayersToFontImage(self): # add all font layer x = 0 y = 0 for layer in self.font_layer_list: if x + 1 > self.glyph_per_row: x = 0 y = y + 1 pdb.gimp_image_add_layer(self.font_image, layer, 0) layer.set_offsets(self.glyph_width * x, self.glyph_height * y) x = x + 1 def getFontImageBaseName(self): filename = "default" pos = self.image.name.find(".") if pos > 0: filename=self.image.name[:pos] return filename # create the fnt file content def createFntContent(self): ressouce_name = self.getFontImageBaseName() + ".png" self.fnt_content = "%d %d\n"%(self.glyph_width, self.glyph_height) self.fnt_content += "1\n" self.fnt_content += "font/%s\n"%(ressouce_name) for layer in self.font_image.layers: if layer.name == " ": # add sp add nbsp self.fnt_content += "%s %d %d 0\n"%(unichr(160), layer.offsets[0], layer.offsets[1]) self.fnt_content += "%s %d %d 0\n"%(unichr(32), layer.offsets[0], layer.offsets[1]) else: self.fnt_content += "%s %d %d 0\n"%(layer.name, layer.offsets[0], layer.offsets[1]) if self.complete_glyph_dict.has_key(layer.name): for complete_glyph in self.complete_glyph_dict[layer.name]: self.fnt_content += "%s %d %d 0\n"%(complete_glyph, layer.offsets[0], layer.offsets[1]) # save fnt file def saveFntFile(self): filename = self.getFontImageBaseName() + ".fnt" fullpath = os.path.join(self.save_directory, filename) file = open(fullpath, "w") file.write(self.fnt_content.encode("iso-8859-1", "ignore")) file.close() # save font image as png file in save directory def saveFontImage(self): # merge all visibles layers self.font_image.merge_visible_layers(EXPAND_AS_NECESSARY) # rename last layer index = 0 for layer in self.font_image.layers: if layer.visible is True: break else: index = index + 1 self.font_image.layers[index].name = self.getFontImageBaseName() self.font_image.layers[index].resize(self.font_image.width, self.font_image.height, 0, 0) # save png filename = self.getFontImageBaseName() + ".png" fullpath = os.path.join(self.save_directory, filename) self.font_image.layers[index].height pdb.file_png_save2( self.font_image, self.font_image.layers[index], fullpath, filename, 0, 9, 1, 1, 1, 1, 1, 0, 1) # display font image def displayFontImage(self): self.font_image.enable_undo() gimp.Display(self.font_image) gimp.displays_flush() # add Glyph layer to font image (ie. space glyph) def addGlyphLayerToFontImage(self, glyph_name): add = True for layer in self.image.layers: if unicode(layer.name) == glyph_name: add = False break if add is True: layer = gimp.Layer(self.font_image, glyph_name, self.glyph_width, self.glyph_height, RGBA_IMAGE, 0, NORMAL_MODE) layer.add_alpha() layer.fill(TRANSPARENT_FILL) layer.visible = True self.font_layer_list.append(layer) # add Glyph layer to image def addGlyphLayerToImage(self, glyph_name): layer = gimp.Layer(self.image, glyph_name, self.glyph_width, self.glyph_height, RGBA_IMAGE, 0, NORMAL_MODE) layer.add_alpha() layer.fill(TRANSPARENT_FILL) layer.visible = True self.image.add_layer(layer, 0) # Tell if drawable (image or layer) has visible pixel def hasVisiblePixel(self, drawable): # TODO OPTIMIZE, very slow for y in range(0,drawable.height): for x in range(0,drawable.width): (channels,pixel) = pdb.gimp_drawable_get_pixel(drawable,x,y) if pixel != (0, 0, 0, 0): return True return False # get iso-8859-15 printable glyph # don't use "string.printable" def getPrintableGlyphsList(self, ignore_lowercase=False, ignore_uppercase=False): listing = list() iso_glyph_codes_tmp = range(161, 256, 1) iso_glyph_codes = range(33, 127, 1) for i in iso_glyph_codes_tmp: iso_glyph_codes.append(i) for glyph in iso_glyph_codes: glyph_str = unichr(glyph) if ignore_lowercase is True and glyph_str.islower() is True: continue if ignore_uppercase is True and glyph_str.isupper() is True: continue listing.append(glyph_str) listing.sort() return listing # Documentation script_glyph_layer_update_help = _("""Add iso-8858-15 glyph layers""") script_glyph_layer_update_description = _("""Add iso-8858-15 glyph layers to the current image""") script_glyph_layer_update_label = _("""Add glyph layers""") def script_glyph_layer_update(image, drawable, ignore_lowercase, ignore_uppercase): pdb.gimp_progress_set_text("Add glyph layers") pdb.gimp_progress_update(0.1) builder = FontBuilder(image=image, drawable=drawable) pdb.gimp_progress_update(0.2) pdb.gimp_progress_set_text("Find glyph layers") listGlyph = builder.getPrintableGlyphsList( ignore_lowercase=ignore_lowercase, ignore_uppercase=ignore_uppercase) up = 0.8 / len(listGlyph) i = 0 for char in listGlyph: add = True for layer in image.layers: if len(unicode(layer.name)) == 1: if unicode(layer.name) == char: add = False i = i + 1 if add: pdb.gimp_progress_set_text("Add glyph layer '%s'"%(char)) pdb.gimp_progress_update(0.2 + up * i ) builder.addGlyphLayerToImage(char) pdb.gimp_progress_end() # Documentation script_build_font_file_help = _("""Create and build font image from layers""") script_build_font_file_description = _("""Create and build font image from layers. The font file (.fnt) can also be built (optional) and a scale factor can also be set (optional)""") script_build_font_file_label = _("""Build font files""") def script_build_font_file(image, drawable, directory, font_image_ajustment, add_space, create_fnt, add_uppercase, add_lowercase): pdb.gimp_progress_set_text("Build font") pdb.gimp_progress_update(0.1) builder = FontBuilder(image=image, drawable=drawable, directory=directory) pdb.gimp_progress_set_text("Create layer list") pdb.gimp_progress_update(0.2) builder.createFontLayerList() if add_space is True: pdb.gimp_progress_set_text("Add space layer to font image") builder.addGlyphLayerToFontImage(" ") pdb.gimp_progress_update(0.35) pdb.gimp_progress_set_text("Calculate font image sizes") pdb.gimp_progress_update(0.4) builder.calculateImageSizes(font_image_ajustment=font_image_ajustment) pdb.gimp_progress_set_text("Add layer to font image") pdb.gimp_progress_update(0.5) builder.addFontLayersToFontImage() pdb.gimp_progress_set_text("Resize font image") pdb.gimp_progress_update(0.6) builder.resizeFontImage(font_image_ajustment=font_image_ajustment) if create_fnt is True: if add_uppercase is True or add_lowercase is True: pdb.gimp_progress_set_text("Complete fnt file") builder.completeGlyphList(uppercase=add_uppercase, lowercase=add_lowercase) pdb.gimp_progress_update(0.65) pdb.gimp_progress_set_text("Create fnt file") pdb.gimp_progress_update(0.7) builder.createFntContent() builder.saveFntFile() pdb.gimp_progress_set_text("Save font image") pdb.gimp_progress_update(0.8) builder.saveFontImage() pdb.gimp_progress_set_text("Display font image") pdb.gimp_progress_update(0.9) builder.displayFontImage() pdb.gimp_progress_end() # Register script_glyph_layer_update script register( proc_name=("bear_script_glyph_layer_update"), blurb=(script_glyph_layer_update_description), help=(script_glyph_layer_update_help), author=("Sébastien Debrard"), copyright=("GPLv2"), date=("2010"), label=(script_glyph_layer_update_label), imagetypes=("*"), params=[ (PF_IMAGE, "image", "Input image", None), (PF_DRAWABLE, "drawable", "Input drawable", None), (PF_BOOL, "ignore_lowercase", _("Ignore lower case glyphs"), False), (PF_BOOL, "ignore_uppercase", _("Ignore upper case glyphs"), False), ], results=[], function=(script_glyph_layer_update), menu=("/Tools/Bear Engine/Font/"), domain=("gimp20-python", gimp.locale_directory) ) # Register script_build_font_file script register( proc_name=("bear_script_build_font_file"), blurb=(script_build_font_file_description), help=(script_build_font_file_help), author=("Sébastien Debrard"), copyright=("GPLv2"), date=("2010"), label=(script_build_font_file_label), imagetypes=("*"), params=[ (PF_IMAGE, "image", "Input image", None), (PF_DRAWABLE, "drawable", "Input drawable", None), (PF_DIRNAME, "directory", _("Save directory"), os.getcwd()), (PF_ADJUSTMENT, "font_image_ajustment", _("Scale ratio (percent)"), 100, (10, 1000, 10, 10, 10, 10)), (PF_BOOL, "create_fnt", _("Create .fnt file"), True), (PF_BOOL, "add_space_glyph", _("Add space glyph if it doesn't exist"), True), (PF_BOOL, "add_uppercase", _("Complete .fnt file with upper case glyphs"), False), (PF_BOOL, "add_uppercase", _("Complete .fnt file with lower case glyphs"), False), ], results=[], function=(script_build_font_file), menu=("/Tools/Bear Engine/Font/"), domain=("gimp20-python", gimp.locale_directory) ) if __name__ == "__main__": main() plee-the-bear-20251226/bear-engine/desktop/gimp/plug-ins/bear-multi-export.py000077500000000000000000000322021512343254000266430ustar00rootroot00000000000000#!/usr/bin/env python # _*_ coding: utf_8 _*_ # # Bear Engine's multi-export 0.1.1 is a script to use with TheGimp # Copyright (C) 2011 by Ferry Jérémie # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. ''' Bear Engine's multi-export 0.1 is a script to use with TheGimp for the free game projet "Plee the Bear" : http://plee-the-bear.sourceforge.net/ Install to /usr/lib/gimp/2.0/plug-ins or ~/gimp-2.6/plug-ins (no testing on older and newest than the 2.6) need actually: * python-yaml (Ubuntu : sudo apt-get install python-yaml) Suggestion if manipulate openRaster (.ora) files : * the plugin "file-ora.py" on http://gimp.foebud.org/files/file-ora.py ''' import os import gimp, gimpplugin, math from gimpenums import * pdb = gimp.pdb import gtk, gimpui, gimpcolor from gimpshelf import shelf # i18n import gettext locale_directory = gimp.locale_directory t = gettext.translation('gimp20-python', gimp.locale_directory, fallback=True) _ = t.ugettext class multi_export: def __init__(self, runmode, img, drawable): self.origMsgHandler = pdb.gimp_message_get_handler() pdb.gimp_message_set_handler(ERROR_CONSOLE) self.img = img self.drawable = drawable if runmode == RUN_INTERACTIVE: self.showDialog() def showDialog(self): self.dialog = gimpui.Dialog("Multi export", "multi_export_dialog") self.table = gtk.Table(2, 4, True) self.table.set_homogeneous(True) self.table.set_row_spacings(5) self.table.set_col_spacings(5) self.table.show() #Config File label = gtk.Label(' '+_('Config File :')+' ') label.set_use_underline(True) label.show() self.table.attach(label, 0, 1, 0, 1) config_chooser_dialog = gtk.FileChooserDialog(title=_("Open a Yaml config file"), action=gtk.FILE_CHOOSER_ACTION_OPEN, buttons=(gtk.STOCK_CANCEL,gtk.RESPONSE_CANCEL,gtk.STOCK_OPEN,gtk.RESPONSE_OK)) config_chooser_dialog.set_default_response(gtk.RESPONSE_OK) filtre = gtk.FileFilter() filtre.set_name(_('Yaml config file')) #TODO : find the real(s) mime-type format filtre.add_mime_type('text/yaml') filtre.add_pattern("*.yaml") filtre.add_pattern("*.yml") config_chooser_dialog.add_filter(filtre) self.config_chooser = gtk.FileChooserButton(config_chooser_dialog) self.yaml_file = os.path.splitext(self.img.filename)[0]+'.yaml' #select yaml file on the same image directory if os.path.exists(self.yaml_file): self.config_chooser.set_filename(self.yaml_file) #else choose the path on image directory else: self.config_chooser.set_filename(os.path.dirname(self.img.filename)+'/*') self.config_chooser.show() self.table.attach(self.config_chooser, 1, 4, 0, 1) #Save Directory label = gtk.Label(' '+_('Save Directory :')+' ') label.set_use_underline(True) label.show() self.table.attach(label, 0, 1, 1, 2) chooser_dialog = gtk.FileChooserDialog(title=_('Open the destination directory'), action=gtk.FILE_CHOOSER_ACTION_SELECT_FOLDER, buttons=(gtk.STOCK_CANCEL,gtk.RESPONSE_CANCEL,gtk.STOCK_OPEN,gtk.RESPONSE_OK)) chooser_dialog.set_default_response(gtk.RESPONSE_OK) self.chooser = gtk.FileChooserButton(chooser_dialog) self.chooser.set_current_folder(os.path.dirname(self.img.filename)) self.chooser.show() self.table.attach(self.chooser, 1, 4, 1, 2) self.bar_progress = gimpui.ProgressBar() self.bar_progress.set_text(_('Processing ...')) self.dialog.vbox.hbox1 = gtk.HBox(False, 5) self.dialog.vbox.hbox1.show() self.dialog.vbox.pack_start(self.dialog.vbox.hbox1, False, False, 5) self.dialog.vbox.hbox1.pack_start(self.table, True, True, 5) self.dialog.vbox.hbox2 = gtk.HBox(False, 5) self.dialog.vbox.hbox2.show() self.dialog.vbox.pack_end(self.dialog.vbox.hbox2, False, False, 5) self.dialog.vbox.hbox2.pack_end(self.bar_progress, True, True, 5) self.bar_progress.show() cancel_button = self.dialog.add_button(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL) ok_button = self.dialog.add_button(gtk.STOCK_OK, gtk.RESPONSE_OK) cancel_button.connect("clicked", self.cancel) ok_button.connect("clicked", self.validate) #progress self.process = gimp.progress_install(self.start_progress, self.end_progress,\ self.text_progress, self.value_progress) self.dialog.show() gtk.main() def cancel(self, widget): gtk.main_quit() def validate(self, widget): #self.bar_progress.set_fraction(0.2) #gtk.main_iteration() #TODO : préciser dépendance python-yaml import yaml if os.path.exists(self.yaml_file): try: serialize = yaml.load(open(self.config_chooser.get_filename())) except: gimp.pdb.gimp_message(_('Your Yaml file is corrrupt. Check it carefully!')) gtk.main_quit() #increment for the progress bar progress_inc = 1/float(len(serialize)) self.progress = 0 self.inc = 0 self.sprite_name = '' for instruction in serialize: #advance the barre progression self.inc = self.inc + 1 self.progress = self.inc*progress_inc self.sprite_name = instruction extension = os.path.splitext(instruction)[1] attr = serialize[instruction] instruction = self.chooser.get_current_folder()+'/'+instruction new_img = pdb.gimp_image_duplicate(self.img) #picture become an composite file if type(attr['layers']) == dict: self._composite_picture(attr, new_img, instruction) continue #remove layers not selected for layer in new_img.layers: if layer.name in attr['layers']: layer.visible = True else: new_img.remove_layer(layer) #merge when the picture is not .xcf or .ora file if extension not in ['.xcf', '.ora']: new_img.merge_visible_layers(CLIP_TO_IMAGE) new_img.active_layer.resize_to_image_size() new_img.crop(attr['crop_width'], attr['crop_height'], attr['x'], attr['y']) new_img.scale(attr['width'] , attr['height']) pdb.gimp_file_save(new_img, new_img.active_layer, instruction, instruction) gimp.delete(new_img) pdb.gimp_progress_uninstall(self.process) else: #TODO : Create good Error Message #gimp.pdb.gimp_message("error message") #gimp.pdb.gimp_message_set_handler( ERROR_CONSOLE ) print 'null' gtk.main_quit() def _composite_picture(self, attr, new_img, instruction): extension = os.path.splitext(instruction)[1] for prop in attr['layers']: new_layers = [] for layer in reversed(new_img.layers): if layer.name in attr['layers'][prop]: new_layer = layer.copy() new_layers.append(new_layer.name) new_img.add_layer(new_layer) #select layers for merging for layer in new_img.layers: if layer.name in new_layers: layer.visible = True else: layer.visible = False sprite = new_img.merge_visible_layers(CLIP_TO_IMAGE) #remove duplicate layer with the same name for layer in new_img.layers: if layer.name == prop: new_img.remove_layer(layer) sprite.name = prop #remove layers not selected for layer in new_img.layers: if layer.name in attr['layers']: #TODO : layer.linked = False ? layer.visible = True #pdb.gimp_image_set_active_layer(new_img, layer) #pdb.plug_in_autocrop_layer(new_img, layer) else: new_img.remove_layer(layer) new_img.crop(attr['crop_width'], attr['crop_height'], attr['x'], attr['y']) new_img.scale(attr['width'] , attr['height']) if extension not in ['.xcf', '.ora']: # resize layers for layer in new_img.layers: layer.resize_to_image_size() #algorithm to determine the good width and height of the picture #and place all the sprites #the generated picture must be a power of 2 pixel size #first, calculate the max width and height size w = new_img.width h = new_img.height max_w = w*len(new_img.layers) max_h = h*len(new_img.layers) pow2_w = pow2_h = max_pow2_w = max_pow2_h = 2 while pow2_w < w: pow2_w = pow2_w*2 while pow2_h < h: pow2_h = pow2_h*2 while max_pow2_w < max_w: max_pow2_w = max_pow2_w*2 while max_pow2_h < max_h: max_pow2_h = max_pow2_h*2 #stock all posibilities possibilities = [] while pow2_h < max_pow2_h or max_pow2_w > pow2_w: possibilities.append([max_pow2_w, pow2_h]) max_pow2_w = max_pow2_w/2 pow2_h = pow2_h*2 #keep the best best_p = possibilities[int(math.floor(len(possibilities)/2))] #resize the final picture new_img.resize(best_p[0], best_p[1]) # place all layers spritepos = '' x_index = y_index = 0 for layer in new_img.layers: index = new_img.layers.index(layer) spritepos += layer.name+': '+str(x_index*w)+' '\ +str(y_index*h)+' '\ +str(layer.width)+' '+str(layer.height)+'\n' new_img.layers[index].translate(x_index*w, y_index*h) if (x_index+2)*pow2_w > best_p[0]: x_index = 0 y_index = y_index + 1 else: x_index = x_index + 1 new_img.merge_visible_layers(CLIP_TO_IMAGE) new_img.active_layer.resize_to_image_size() create_spritepos = True if 'spritepos' in attr: if attr['spritepos'] != True: create_spritepos = False if create_spritepos: head = "# The format of the lines is\n# picture: x y width height\n\n" spritepos_file = open(os.path.splitext(instruction)[0]+'.spritepos', 'w') spritepos_file.write(head+spritepos[:len(spritepos)-2:]) pdb.gimp_file_save(new_img, new_img.active_layer, instruction, instruction) gimp.delete(new_img) def start_progress(self, message, cancelable): self.bar_progress.set_text(_('Processing sprite %s n° %i') % (self.sprite_name, self.inc)) self.bar_progress.set_fraction(self.progress) while gtk.events_pending(): gtk.main_iteration() def end_progress(self): pass def text_progress(self, message): pass def value_progress(self, value): pass class myplugin(gimpplugin.plugin): def start(self): gimp.main(self.init, self.quit, self.query, self._run) def init(self): pass def quit(self): pass def query(self): authorname = "Jérémie Ferry alias " copyrightname = "Jérémie Ferry alias " imgmenupath = "/Tools/Bear Engine/export/" date = "october 2011" script_sprite_create_help = _("""Build sprite files from the current image""") script_sprite_create_description = _("""Build multi-pictures files from a source (.xcf or .ora) file with a config file (yaml). The generated pictures can be resized and reported as an composite file. spritepos correspondent.""") script_sprite_create_label = _("""Build sprite files""") params = [ (PDB_INT32, "run_mode", "Run mode"), (PDB_IMAGE, "image", "Input image"), (PDB_DRAWABLE, "drawable", "Input drawable"), ] gimp.install_procedure("python_multi_export", script_sprite_create_description, script_sprite_create_help, authorname, copyrightname, date, "%s_multi-export..." % (imgmenupath), "RGB*, GRAY*", PLUGIN, params, []) def python_multi_export(self, runmode, img, drawable): multi_export(runmode, img, drawable) if __name__ == "__main__": myplugin().start()plee-the-bear-20251226/bear-engine/desktop/gimp/plug-ins/bear-sprite.py000077500000000000000000000111231512343254000254770ustar00rootroot00000000000000#!/usr/bin/env python # _*_ coding: utf_8 _*_ # # Bear Engine's sprite script to use with TheGimp # gimp proc from gimpfu import * # i18n import gettext locale_directory = gimp.locale_directory gettext.install( "gimp20-template" , locale_directory, unicode=True ) # usefull import import os class SpriteBuilder: def __init__(self, image, drawable, directory=os.getcwd(), adjustment = 50 ): self.image = image self.drawable = drawable self.save_directory = directory self.sprite_image = pdb.gimp_image_duplicate(self.image) self.sprite_image.disable_undo() self.sprite_image.scale(int(round(self.sprite_image.width * (adjustment / 100))), int(round(self.sprite_image.height * (adjustment / 100)))) self.spritepos_content = "" # create the spritepos file content def createSpriteposContent(self): self.spritepos_content += "# The format of the lines is\n" self.spritepos_content += "# picture: x y width height\n" self.spritepos_content += "\n" for layer in self.sprite_image.layers: self.spritepos_content += "%s: %d %d %d %d\n"%(layer.name, layer.offsets[0], layer.offsets[1], layer.width, layer.height) self.spritepos_content += "\n" # save spritepos file def saveSpriteposFile(self): filename = self.getSpriteImageBaseName() + ".spritepos" fullpath = os.path.join(self.save_directory, filename) file = open(fullpath, "w") file.write(self.spritepos_content.encode("iso-8859-1", "ignore")) file.close() # get the srpiet image base name def getSpriteImageBaseName(self): filename = "default" pos = self.image.name.find(".") if pos > 0: filename=self.image.name[:pos] return filename # save sprite image as png file in save directory def saveSpriteImage(self): # merge all visibles layers self.sprite_image.merge_visible_layers(EXPAND_AS_NECESSARY) # rename last layer index = 0 for layer in self.sprite_image.layers: if layer.visible is True: break else: index = index + 1 self.sprite_image.layers[index].name = self.getSpriteImageBaseName() self.sprite_image.layers[index].resize(self.sprite_image.width, self.sprite_image.height, 0, 0) # save png filename = self.getSpriteImageBaseName() + ".png" fullpath = os.path.join(self.save_directory, filename) pdb.file_png_save2( self.sprite_image, self.sprite_image.layers[index], fullpath, filename, 0, 9, 1, 1, 1, 1, 1, 0, 1) # Documentation script_sprite_create_help = _("""Build sprite files from the current image""") script_sprite_create_description = _("""Build sprite files from the current image The sprite file (.spritepos) can also be built (optional) and a scale factor can also be set (optional)""") script_sprite_create_label = _("""Build sprite files""") def script_sprite_create(image, drawable, directory, adjustment, spritepos): pdb.gimp_progress_set_text("Create sprite files") pdb.gimp_progress_update(0.1) builder = SpriteBuilder(image=image, drawable=drawable, directory=directory, adjustment=adjustment) if spritepos is True: pdb.gimp_progress_set_text("Build spritepos file (.spritepos)") pdb.gimp_progress_update(0.3) builder.createSpriteposContent() pdb.gimp_progress_set_text("Save spritepos file (.spritepos)") pdb.gimp_progress_update(0.5) builder.saveSpriteposFile() pdb.gimp_progress_set_text("Save sprite image (.png)") pdb.gimp_progress_update(0.7) builder.saveSpriteImage() pdb.gimp_progress_end() # Register script_sprite_create script register( proc_name=("bear_script_sprite_create"), blurb=(script_sprite_create_description), help=(script_sprite_create_help), author=("Sébastien Debrard"), copyright=("GPLv2"), date=("2011"), label=(script_sprite_create_label), imagetypes=("*"), params=[ (PF_IMAGE, "image", "Input image", None), (PF_DRAWABLE, "drawable", "Input drawable", None), (PF_DIRNAME, "directory", _("Save directory"), os.getcwd()), (PF_ADJUSTMENT, "adjustment", _("Scale ratio (percent)"), 50, (10, 1000, 10, 10, 10, 10)), (PF_BOOL, "spritepos", _("Create .spritepos file"), True), ], results=[], function=(script_sprite_create), menu=("/Tools/Bear Engine/Sprite/"), domain=("gimp20-python", gimp.locale_directory) ) if __name__ == "__main__": main() plee-the-bear-20251226/bear-engine/desktop/gimp/scripts/000077500000000000000000000000001512343254000226405ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/desktop/gimp/scripts/sharp-alpha.scm000066400000000000000000000057441512343254000255560ustar00rootroot00000000000000; ; Bear Engine ; ; Copyright (C) 2005-2012 Julien Jorge, Sebastien Angibaud ; ; This program is free software; you can redistribute it and/or modify it ; under the terms of the GNU General Public License as published by the ; Free Software Foundation; either version 2 of the License, or (at your ; option) any later version. ; ; This program is distributed in the hope that it will be useful, but WITHOUT ; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ; FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for ; more details. ; ; You should have received a copy of the GNU General Public License along ; with this program; if not, write to the Free Software Foundation, Inc., ; 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA ; ; contact: plee-the-bear@gamned.org ; ;------------------------------------------------------------------------------- ; \brief Turn all semi-transparent pixels of a drawable into opaque pixels of a ; given color. ; \param img The image to modify. ; \param drawable The drawable to modify. ; \param color The color to assign to the semi-transparent pixels. (define (script-fu-sharp-alpha img drawable color) (let* ( (w (car (gimp-drawable-width drawable))) (h (car (gimp-drawable-height drawable))) ) (gimp-image-undo-disable img) (let loop_y ((y 0)) (unless (= y h) (gimp-progress-update (/ y h)) (let loop_x ((x 0)) (unless (= x w) (let* ( (p (gimp-drawable-get-pixel drawable x y)) (pixel-color (cadr p)) (alpha (aref pixel-color 3)) ) (if (and (> alpha 0) (< alpha 255)) (let () (aset pixel-color 0 (car color)) (aset pixel-color 1 (cadr color)) (aset pixel-color 2 (caddr color)) (aset pixel-color 3 255) (gimp-drawable-set-pixel drawable x y (car p) pixel-color) ) ) ) (loop_x (+ x 1)) ) ) ; loop_x (loop_y (+ y 1)) ) ) ; loop_y (gimp-image-undo-enable img) (gimp-displays-flush) ) ; let* ) ; define (script-fu-register "script-fu-sharp-alpha" _"Sharp alpha..." _"Replace semi-transparent pixels with opaque pixels of a given color" "Julien Jorge" "Julien Jorge" "2012" "" SF-IMAGE "Image to filter" 0 SF-DRAWABLE "Drawable to filter" 0 SF-COLOR _"Pixel color" '(255 0 0) ) (script-fu-menu-register "script-fu-sharp-alpha" "/Tools/Bear Engine") plee-the-bear-20251226/bear-engine/desktop/locale/000077500000000000000000000000001512343254000214545ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/desktop/locale/CMakeLists.txt000066400000000000000000000001451512343254000242140ustar00rootroot00000000000000include( FindGettext OPTIONAL ) if( GETTEXT_FOUND ) subdirs( bear-engine ) endif( GETTEXT_FOUND ) plee-the-bear-20251226/bear-engine/desktop/locale/bear-engine/000077500000000000000000000000001512343254000236305ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/desktop/locale/bear-engine/CMakeLists.txt000066400000000000000000000001451512343254000263700ustar00rootroot00000000000000gettext_create_translations_custom( bear-engine-translations bear-engine.pot fr.po nn.po ) plee-the-bear-20251226/bear-engine/desktop/locale/bear-engine/bear-engine.pot000066400000000000000000000164731512343254000265430ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2014-03-09 15:44+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../../core/src/engine/code/game_local_client.cpp:1449 msgid "'\n" msgstr "" #: ../../../core/src/engine/code/game_local_client.cpp:1409 msgid "--game-var-assignment: not a character." msgstr "" #: ../../../core/src/engine/code/game_local_client.cpp:1425 msgid "--set-game-var-bool: not a boolean" msgstr "" #: ../../../core/src/engine/code/game_local_client.cpp:1415 msgid "--set-game-var-int: not an integer" msgstr "" #: ../../../core/src/engine/code/game_local_client.cpp:1430 msgid "--set-game-var-real: not a real number" msgstr "" #: ../../../core/src/engine/code/game_local_client.cpp:1420 msgid "--set-game-var-uint: not an unsigned integer" msgstr "" #: ../../../core/src/engine/code/game_local_client.cpp:1576 msgid "Associates an identifier with this game." msgstr "" #: ../../../core/src/engine/code/game_local_client.cpp:1448 msgid "Bad argument value: '" msgstr "" #: ../../../core/src/engine/code/game_local_client.cpp:1564 msgid "" "Changes the delimiter used in --set-game-var- to separate the name and " "the value of the variable." msgstr "" #: ../../../core/src/engine/code/game_local_client.cpp:1526 msgid "Engine's options:" msgstr "" #: ../../../core/src/engine/code/game_description.cpp:125 msgid "Path to a library containing items for the game." msgstr "" #: ../../../core/src/engine/code/game_description.cpp:115 msgid "Path to the directory containing the data of the game." msgstr "" #: ../../../running_bear/code/running_bear.cpp:38 msgid "Print this help screen and exit." msgstr "" #: ../../../core/src/engine/code/game_local_client.cpp:1591 msgid "Prints the version of the engine and exit." msgstr "" #: ../../../core/src/engine/code/game_local_client.cpp:1532 msgid "Run the game in a window." msgstr "" #: ../../../core/src/engine/code/game_local_client.cpp:1531 msgid "Runs the game in fullscreen mode." msgstr "" #: ../../../core/src/engine/code/game_local_client.cpp:1535 msgid "Search the items in the game launcher." msgstr "" #: ../../../core/src/engine/code/game_local_client.cpp:1581 msgid "Sets the limit of the number of frames per second." msgstr "" #: ../../../core/src/engine/code/game_local_client.cpp:1551 msgid "Sets the value of a boolean game variable." msgstr "" #: ../../../core/src/engine/code/game_local_client.cpp:1547 msgid "Sets the value of a non negative integer game variable." msgstr "" #: ../../../core/src/engine/code/game_local_client.cpp:1555 msgid "Sets the value of a real number game variable." msgstr "" #: ../../../core/src/engine/code/game_local_client.cpp:1559 msgid "Sets the value of a string game variable." msgstr "" #: ../../../core/src/engine/code/game_local_client.cpp:1543 msgid "Sets the value of an integer game variable." msgstr "" #: ../../../core/src/engine/code/game_local_client.cpp:1571 msgid "Sets the value of the destination to which game statistics are sent." msgstr "" #: ../../../core/src/engine/code/game_description.cpp:122 msgid "Tells not to use the dumbest rendering procedure." msgstr "" #: ../../../core/src/engine/code/game_local_client.cpp:1587 msgid "Tells to do a rendering of the scene for each progress of the game." msgstr "" #: ../../../core/src/engine/code/game_description.cpp:119 msgid "Tells to use the dumbest rendering procedure." msgstr "" #: ../../../core/src/engine/code/game_local_client.cpp:1538 msgid "" "The delay to apply to the network messages in term of game iterations. " "Default is 1." msgstr "" #: ../../../core/src/engine/code/game_description.cpp:111 msgid "The height of the screen." msgstr "" #: ../../../core/src/engine/code/game_description.cpp:105 msgid "The margin around the camera in which we check for activity." msgstr "" #: ../../../core/src/engine/code/game_description.cpp:100 msgid "The name of the game." msgstr "" #: ../../../core/src/engine/code/game_description.cpp:128 msgid "The path of the first level to run." msgstr "" #: ../../../core/src/engine/code/game_description.cpp:108 msgid "The width of the screen." msgstr "" msgid "back" msgstr "" msgid "backspace" msgstr "" msgid "break" msgstr "" #: ../../../core/src/input/code/joystick.cpp:108 msgid "button" msgstr "" msgid "capslock" msgstr "" #: ../../../core/src/engine/code/game_local_client.cpp:1566 msgid "character" msgstr "" msgid "delete" msgstr "" msgid "down" msgstr "" msgid "down left" msgstr "" msgid "down right" msgstr "" msgid "end" msgstr "" #: ../../../running_bear/code/running_bear.cpp:108 msgid "engine_options" msgstr "" msgid "escape" msgstr "" msgid "home" msgstr "" msgid "insert" msgstr "" #: ../../../core/src/engine/code/game_description.cpp:106 #: ../../../core/src/engine/code/game_description.cpp:109 #: ../../../core/src/engine/code/game_description.cpp:112 msgid "integer" msgstr "" msgid "invalid mouse code" msgstr "" #: ../../../core/src/input/code/joystick_button.cpp:96 msgid "joystick" msgstr "" msgid "keypad *" msgstr "" msgid "keypad +" msgstr "" msgid "keypad -" msgstr "" msgid "keypad ." msgstr "" msgid "keypad /" msgstr "" msgid "keypad 0" msgstr "" msgid "keypad 1" msgstr "" msgid "keypad 2" msgstr "" msgid "keypad 3" msgstr "" msgid "keypad 4" msgstr "" msgid "keypad 5" msgstr "" msgid "keypad 6" msgstr "" msgid "keypad 7" msgstr "" msgid "keypad 8" msgstr "" msgid "keypad 9" msgstr "" msgid "keypad =" msgstr "" msgid "keypad enter" msgstr "" msgid "left" msgstr "" msgid "left alt" msgstr "" msgid "left click" msgstr "" msgid "left control" msgstr "" msgid "left shift" msgstr "" msgid "left super" msgstr "" msgid "menu" msgstr "" msgid "middle click" msgstr "" #: ../../../core/src/engine/code/game_local_client.cpp:1544 #: ../../../core/src/engine/code/game_local_client.cpp:1548 #: ../../../core/src/engine/code/game_local_client.cpp:1552 #: ../../../core/src/engine/code/game_local_client.cpp:1556 #: ../../../core/src/engine/code/game_local_client.cpp:1560 msgid "name=value" msgstr "" msgid "new line" msgstr "" msgid "numlock" msgstr "" msgid "page down" msgstr "" msgid "page up" msgstr "" #: ../../../core/src/engine/code/game_description.cpp:116 #: ../../../core/src/engine/code/game_description.cpp:126 msgid "path" msgstr "" msgid "pause" msgstr "" msgid "print screen" msgstr "" msgid "right" msgstr "" msgid "right alt" msgstr "" msgid "right click" msgstr "" msgid "right control" msgstr "" msgid "right shift" msgstr "" msgid "right super" msgstr "" msgid "scrolllock" msgstr "" msgid "space" msgstr "" #: ../../../core/src/engine/code/game_description.cpp:101 #: ../../../core/src/engine/code/game_description.cpp:129 msgid "string" msgstr "" msgid "system" msgstr "" msgid "tab" msgstr "" msgid "up" msgstr "" msgid "up left" msgstr "" msgid "up right" msgstr "" #: ../../../core/src/engine/code/game_local_client.cpp:1540 msgid "value" msgstr "" msgid "wheel down" msgstr "" msgid "wheel up" msgstr "" plee-the-bear-20251226/bear-engine/desktop/locale/bear-engine/extract-strings.sh000066400000000000000000000022221512343254000273230ustar00rootroot00000000000000#!/bin/sh OUTPUT_FILE=bear-engine.pot if ! which xpath >/dev/null then echo "Can't find xpath command in your paths." exit 1 fi # $1 is the XPath # $2 is the XML file xpath_wrapper() { echo '' | xpath -e "/node" >/dev/null 2>/dev/null if [ $? -eq 0 ] then xpath -q -e "$1" "$2" else xpath "$2" "$1" fi } ( echo "Searching strings in source code." 1>&2 xgettext --output=- --c++ --trigraphs --sort-output --keyword= \ --keyword=bear_gettext \ $(find ../../../ -name "*.[tch]pp") \ | sed 's/charset=CHARSET/charset=UTF-8/' echo "Searching strings Bear Engine's input module." 1>&2 grep 'return "[[:lower:]].\+"' \ ../../../core/src/input/code/mouse.cpp \ ../../../core/src/input/code/keyboard.cpp \ | cut -d'"' -f2 \ | sed 's/^/msgid "/;s/$/"\nmsgstr ""\n/' grep 'result *= "[[:lower:]][[:lower:] ]\+"' \ ../../../core/src/input/code/joystick.cpp \ | cut -d'"' -f2 \ | sed 's/^/msgid "/;s/$/"\nmsgstr ""\n/' ) | iconv --from=iso-8859-15 --to=utf-8 \ | msguniq | msgcat - --sort-output > "$OUTPUT_FILE" for f in *.po do msgmerge --update --previous --backup=none "$f" "$OUTPUT_FILE" done plee-the-bear-20251226/bear-engine/desktop/locale/bear-engine/fr.po000066400000000000000000000255201512343254000246030ustar00rootroot00000000000000# French translations for PACKAGE package # Traductions françaises du paquet PACKAGE. # Copyright (C) 2010 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Julien Jorge , 2010. # msgid "" msgstr "" "Project-Id-Version: 0.5\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2014-03-09 15:44+0100\n" "PO-Revision-Date: 2014-03-09 15:47+0100\n" "Last-Translator: Julien Jorge \n" "Language-Team: French\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" "X-Generator: Poedit 1.5.4\n" #: ../../../core/src/engine/code/game_local_client.cpp:1449 msgid "'\n" msgstr " »\n" #: ../../../core/src/engine/code/game_local_client.cpp:1409 msgid "--game-var-assignment: not a character." msgstr "--game-var-assignment : n'est pas un caractère." #: ../../../core/src/engine/code/game_local_client.cpp:1425 msgid "--set-game-var-bool: not a boolean" msgstr "--set-game-var-bool : n'est pas un booléen" #: ../../../core/src/engine/code/game_local_client.cpp:1415 msgid "--set-game-var-int: not an integer" msgstr "--set-game-var-int : n'est pas un entier" #: ../../../core/src/engine/code/game_local_client.cpp:1430 msgid "--set-game-var-real: not a real number" msgstr "--set-game-var-real : n'est pas un nombre réel" #: ../../../core/src/engine/code/game_local_client.cpp:1420 msgid "--set-game-var-uint: not an unsigned integer" msgstr "--set-game-var-uint : n'est pas un entier non négatif." #: ../../../core/src/engine/code/game_local_client.cpp:1576 msgid "Associates an identifier with this game." msgstr "Associe un identifiant à ce jeu." #: ../../../core/src/engine/code/game_local_client.cpp:1448 msgid "Bad argument value: '" msgstr "Valeur de paramètre incorrecte : «" #: ../../../core/src/engine/code/game_local_client.cpp:1564 #| msgid "" #| "Change the delimiter used in --set-game-var- to separate the name " #| "and the value of the variable." msgid "" "Changes the delimiter used in --set-game-var- to separate the name and " "the value of the variable." msgstr "" "Change le délimiteur utilisé par --set-game-var- pour séparer le nom " "et la valeur de la variable." #: ../../../core/src/engine/code/game_local_client.cpp:1526 msgid "Engine's options:" msgstr "Options du moteur :" #: ../../../core/src/engine/code/game_description.cpp:125 msgid "Path to a library containing items for the game." msgstr "Chemin vers une bibliothèque contenant les objets du jeu." #: ../../../core/src/engine/code/game_description.cpp:115 msgid "Path to the directory containing the data of the game." msgstr "Chemin vers un dossier contenant les données du jeu." #: ../../../running_bear/code/running_bear.cpp:38 msgid "Print this help screen and exit." msgstr "Affiche cet écran d'aide sans lancer le jeu." #: ../../../core/src/engine/code/game_local_client.cpp:1591 #| msgid "Print the version of the engine and exit." msgid "Prints the version of the engine and exit." msgstr "Affiche la version du moteur sans lancer le jeu." #: ../../../core/src/engine/code/game_local_client.cpp:1532 msgid "Run the game in a window." msgstr "Exécute le jeu dans une fenêtre." #: ../../../core/src/engine/code/game_local_client.cpp:1531 #| msgid "Run the game in fullscreen mode." msgid "Runs the game in fullscreen mode." msgstr "Exécute le jeu en plein écran." #: ../../../core/src/engine/code/game_local_client.cpp:1535 msgid "Search the items in the game launcher." msgstr "Récupère les déclarations d'objets dans l'exécutable lançant le jeu." #: ../../../core/src/engine/code/game_local_client.cpp:1581 #| msgid "Set the value of a real number game variable." msgid "Sets the limit of the number of frames per second." msgstr "Donne une limite haute au nombre d'images affichées par secondes." #: ../../../core/src/engine/code/game_local_client.cpp:1551 #| msgid "Set the value of a boolean game variable." msgid "Sets the value of a boolean game variable." msgstr "Affecte une valeur à une variable de jeu booléenne." #: ../../../core/src/engine/code/game_local_client.cpp:1547 #| msgid "Set the value of a non negative integer game variable." msgid "Sets the value of a non negative integer game variable." msgstr "Affecte une valeur à une variable de jeu de type entier non négatif." #: ../../../core/src/engine/code/game_local_client.cpp:1555 #| msgid "Set the value of a real number game variable." msgid "Sets the value of a real number game variable." msgstr "Affecte une valeur à une variable de jeu de type nombre réel." #: ../../../core/src/engine/code/game_local_client.cpp:1559 #| msgid "Set the value of a string game variable." msgid "Sets the value of a string game variable." msgstr "Affecte une valeur à une variable de jeu de type chaîne de caractères." #: ../../../core/src/engine/code/game_local_client.cpp:1543 #| msgid "Set the value of an integer game variable." msgid "Sets the value of an integer game variable." msgstr "Affecte une valeur à une variable de jeu de type entier." #: ../../../core/src/engine/code/game_local_client.cpp:1571 #| msgid "Set the value of the destination to which game statistics are sent." msgid "Sets the value of the destination to which game statistics are sent." msgstr "" "Définit la valeur de la destination à laquelle les statistiques de jeu sont " "envoyées." #: ../../../core/src/engine/code/game_description.cpp:122 msgid "Tells not to use the dumbest rendering procedure." msgstr "Indique de ne pas utiliser la procédure d'affichage basique." #: ../../../core/src/engine/code/game_local_client.cpp:1587 #| msgid "Tell to do a rendering of the scene for each progress of the game." msgid "Tells to do a rendering of the scene for each progress of the game." msgstr "" "Indique de faire un affichage de la scène pour chaque itération du jeu." #: ../../../core/src/engine/code/game_description.cpp:119 msgid "Tells to use the dumbest rendering procedure." msgstr "Indique d'utiliser la procédure d'affichage basique." #: ../../../core/src/engine/code/game_local_client.cpp:1538 msgid "" "The delay to apply to the network messages in term of game iterations. " "Default is 1." msgstr "" "Le délai à appliquer au messages du réseau en terme d'itérations de jeu. La " "valeur par défaut est 1." #: ../../../core/src/engine/code/game_description.cpp:111 msgid "The height of the screen." msgstr "La hauteur de l'écran." #: ../../../core/src/engine/code/game_description.cpp:105 msgid "The margin around the camera in which we check for activity." msgstr "" "La distance dans laquelle les objets sont considérés autour de la caméra." #: ../../../core/src/engine/code/game_description.cpp:100 msgid "The name of the game." msgstr "Le nom du jeu." #: ../../../core/src/engine/code/game_description.cpp:128 msgid "The path of the first level to run." msgstr "Le chemin du premier niveau à lancer." #: ../../../core/src/engine/code/game_description.cpp:108 msgid "The width of the screen." msgstr "La largeur de l'écran." #| msgid "backspace" msgid "back" msgstr "retour" msgid "backspace" msgstr "effacement" msgid "break" msgstr "pause" #: ../../../core/src/input/code/joystick.cpp:108 msgid "button" msgstr "bouton" msgid "capslock" msgstr "Vérouillage majuscule" #: ../../../core/src/engine/code/game_local_client.cpp:1566 msgid "character" msgstr "caractère" msgid "delete" msgstr "supprimer" msgid "down" msgstr "bas" msgid "down left" msgstr "bas-gauche" msgid "down right" msgstr "bas-droite" msgid "end" msgstr "fin" #: ../../../running_bear/code/running_bear.cpp:108 msgid "engine_options" msgstr "options_du_moteur" msgid "escape" msgstr "échapement" msgid "home" msgstr "début" msgid "insert" msgstr "insertion" #: ../../../core/src/engine/code/game_description.cpp:106 #: ../../../core/src/engine/code/game_description.cpp:109 #: ../../../core/src/engine/code/game_description.cpp:112 msgid "integer" msgstr "entier" msgid "invalid mouse code" msgstr "code invalide pour la souris" #: ../../../core/src/input/code/joystick_button.cpp:96 msgid "joystick" msgstr "manette" msgid "keypad *" msgstr "* du pavé numérique" msgid "keypad +" msgstr "+ du pavé numérique" msgid "keypad -" msgstr "- du pavé numérique" msgid "keypad ." msgstr ". du pavé numérique" msgid "keypad /" msgstr "/ du pavé numérique" msgid "keypad 0" msgstr "0 du pavé numérique" msgid "keypad 1" msgstr "1 du pavé numérique" msgid "keypad 2" msgstr "2 du pavé numérique" msgid "keypad 3" msgstr "3 du pavé numérique" msgid "keypad 4" msgstr "4 du pavé numérique" msgid "keypad 5" msgstr "5 du pavé numérique" msgid "keypad 6" msgstr "6 du pavé numérique" msgid "keypad 7" msgstr "7 du pavé numérique" msgid "keypad 8" msgstr "8 du pavé numérique" msgid "keypad 9" msgstr "9 du pavé numérique" msgid "keypad =" msgstr "= du pavé numérique" msgid "keypad enter" msgstr "entrée du pavé numérique" msgid "left" msgstr "gauche" msgid "left alt" msgstr "alt à gauche" msgid "left click" msgstr "clic gauche" msgid "left control" msgstr "contrôle à gauche" msgid "left shift" msgstr "majuscule à gauche" msgid "left super" msgstr "fenêtre à gauche" msgid "menu" msgstr "menu" msgid "middle click" msgstr "clic central" #: ../../../core/src/engine/code/game_local_client.cpp:1544 #: ../../../core/src/engine/code/game_local_client.cpp:1548 #: ../../../core/src/engine/code/game_local_client.cpp:1552 #: ../../../core/src/engine/code/game_local_client.cpp:1556 #: ../../../core/src/engine/code/game_local_client.cpp:1560 msgid "name=value" msgstr "nom=valeur" msgid "new line" msgstr "entrée" msgid "numlock" msgstr "Vérouillage du pavé numérique" msgid "page down" msgstr "page suivante" msgid "page up" msgstr "page précédente" #: ../../../core/src/engine/code/game_description.cpp:116 #: ../../../core/src/engine/code/game_description.cpp:126 msgid "path" msgstr "chemin" msgid "pause" msgstr "pause" msgid "print screen" msgstr "Impr écran" msgid "right" msgstr "droite" msgid "right alt" msgstr "tabulation droite" msgid "right click" msgstr "clic droit" msgid "right control" msgstr "contrôle à gauche" msgid "right shift" msgstr "majuscule à gauche" msgid "right super" msgstr "fenêtre à gauche" msgid "scrolllock" msgstr "arrêt défilement" msgid "space" msgstr "espace" #: ../../../core/src/engine/code/game_description.cpp:101 #: ../../../core/src/engine/code/game_description.cpp:129 msgid "string" msgstr "chaîne de caractères" msgid "system" msgstr "système" msgid "tab" msgstr "tabulation" msgid "up" msgstr "haut" msgid "up left" msgstr "haut-gauche" msgid "up right" msgstr "haut-droit" #: ../../../core/src/engine/code/game_local_client.cpp:1540 msgid "value" msgstr "valeur" msgid "wheel down" msgstr "molette en bas" msgid "wheel up" msgstr "molette en haut" #~ msgid "Undefined" #~ msgstr "Non défini." plee-the-bear-20251226/bear-engine/desktop/locale/bear-engine/nn.po000066400000000000000000000233571512343254000246150ustar00rootroot00000000000000# Norwegian Nynorsk translations for Plee the Bear. # Copyright (C) 2010 Karl Ove Hufthammer # This file is distributed under the Creative Commons by-sa licence. # # Karl Ove Hufthammer , 2008, 2010. msgid "" msgstr "" "Project-Id-Version: Plee the Bear 0.4\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2014-03-09 15:44+0100\n" "PO-Revision-Date: 2010-11-15 22:44+0100\n" "Last-Translator: Karl Ove Hufthammer \n" "Language-Team: Norwegian Nynorsk \n" "Language: nn\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Lokalize 1.1\n" #: ../../../core/src/engine/code/game_local_client.cpp:1449 msgid "'\n" msgstr "»\n" #: ../../../core/src/engine/code/game_local_client.cpp:1409 msgid "--game-var-assignment: not a character." msgstr "--game-var-assignment: ikkje ein teiknstreng" #: ../../../core/src/engine/code/game_local_client.cpp:1425 msgid "--set-game-var-bool: not a boolean" msgstr "--set-game-var-bool: ikkje ein boolsk verdi" #: ../../../core/src/engine/code/game_local_client.cpp:1415 msgid "--set-game-var-int: not an integer" msgstr "--set-game-var-int: ikkje eit heiltal" #: ../../../core/src/engine/code/game_local_client.cpp:1430 msgid "--set-game-var-real: not a real number" msgstr "--set-game-var-real: ikkje eit flyttal" #: ../../../core/src/engine/code/game_local_client.cpp:1420 msgid "--set-game-var-uint: not an unsigned integer" msgstr "--set-game-var-uint: ikkje eit ikkje-negativt heiltal" #: ../../../core/src/engine/code/game_local_client.cpp:1576 msgid "Associates an identifier with this game." msgstr "" #: ../../../core/src/engine/code/game_local_client.cpp:1448 msgid "Bad argument value: '" msgstr "Ugyldig argumentsverdi: «" #: ../../../core/src/engine/code/game_local_client.cpp:1564 #, fuzzy #| msgid "" #| "Change the delimiter used in --set-game-var- to separate the name " #| "and the value of the variable." msgid "" "Changes the delimiter used in --set-game-var- to separate the name and " "the value of the variable." msgstr "" "Endra skiljeteikn brukt i «--set-game-var-» for å skilja namn og verdi " "til variablar." #: ../../../core/src/engine/code/game_local_client.cpp:1526 msgid "Engine's options:" msgstr "Val for spelmotor:" #: ../../../core/src/engine/code/game_description.cpp:125 msgid "Path to a library containing items for the game." msgstr "Adressa til biblioteket som inneheld spelelementa." #: ../../../core/src/engine/code/game_description.cpp:115 msgid "Path to the directory containing the data of the game." msgstr "Adressa til mappa som inneheld speldataa." #: ../../../running_bear/code/running_bear.cpp:38 msgid "Print this help screen and exit." msgstr "Vis denne hjelpeteksten, og så avslutt." #: ../../../core/src/engine/code/game_local_client.cpp:1591 #, fuzzy #| msgid "Print the version of the engine and exit." msgid "Prints the version of the engine and exit." msgstr "Vis spelmotor-versjon, og så avslutt." #: ../../../core/src/engine/code/game_local_client.cpp:1532 msgid "Run the game in a window." msgstr "Køyr spelet i eit vindauge." #: ../../../core/src/engine/code/game_local_client.cpp:1531 #, fuzzy #| msgid "Run the game in fullscreen mode." msgid "Runs the game in fullscreen mode." msgstr "Køyr spelet i fullskjermmodus." #: ../../../core/src/engine/code/game_local_client.cpp:1535 msgid "Search the items in the game launcher." msgstr "" #: ../../../core/src/engine/code/game_local_client.cpp:1581 #, fuzzy #| msgid "Set the value of a real number game variable." msgid "Sets the limit of the number of frames per second." msgstr "Definer verdien av ein flyttalsvariabel." #: ../../../core/src/engine/code/game_local_client.cpp:1551 #, fuzzy #| msgid "Set the value of a boolean game variable." msgid "Sets the value of a boolean game variable." msgstr "Definer verdien av ein boolsk spelvariabel." #: ../../../core/src/engine/code/game_local_client.cpp:1547 #, fuzzy #| msgid "Set the value of a non negative integer game variable." msgid "Sets the value of a non negative integer game variable." msgstr "Definer verdien av ein ikkje-negativ heiltalsvariabel." #: ../../../core/src/engine/code/game_local_client.cpp:1555 #, fuzzy #| msgid "Set the value of a real number game variable." msgid "Sets the value of a real number game variable." msgstr "Definer verdien av ein flyttalsvariabel." #: ../../../core/src/engine/code/game_local_client.cpp:1559 #, fuzzy #| msgid "Set the value of a string game variable." msgid "Sets the value of a string game variable." msgstr "Definer verdien av ein tekstvariabel." #: ../../../core/src/engine/code/game_local_client.cpp:1543 #, fuzzy #| msgid "Set the value of an integer game variable." msgid "Sets the value of an integer game variable." msgstr "Definer verdien av ein heiltalsvariabel." #: ../../../core/src/engine/code/game_local_client.cpp:1571 #, fuzzy #| msgid "Set the value of a string game variable." msgid "Sets the value of the destination to which game statistics are sent." msgstr "Definer verdien av ein tekstvariabel." #: ../../../core/src/engine/code/game_description.cpp:122 msgid "Tells not to use the dumbest rendering procedure." msgstr "" #: ../../../core/src/engine/code/game_local_client.cpp:1587 msgid "Tells to do a rendering of the scene for each progress of the game." msgstr "" #: ../../../core/src/engine/code/game_description.cpp:119 msgid "Tells to use the dumbest rendering procedure." msgstr "" #: ../../../core/src/engine/code/game_local_client.cpp:1538 msgid "" "The delay to apply to the network messages in term of game iterations. " "Default is 1." msgstr "" #: ../../../core/src/engine/code/game_description.cpp:111 msgid "The height of the screen." msgstr "Høgda på skjermbiletet." #: ../../../core/src/engine/code/game_description.cpp:105 msgid "The margin around the camera in which we check for activity." msgstr "Margen rundt kamera der spelet skal sjå etter aktivitet." #: ../../../core/src/engine/code/game_description.cpp:100 msgid "The name of the game." msgstr "Namnet på spelet." #: ../../../core/src/engine/code/game_description.cpp:128 msgid "The path of the first level to run." msgstr "Adressa til det første brettet å køyra." #: ../../../core/src/engine/code/game_description.cpp:108 msgid "The width of the screen." msgstr "Breidda på skjermbiletet." #, fuzzy #| msgid "backspace" msgid "back" msgstr "rettetast" msgid "backspace" msgstr "rettetast" msgid "break" msgstr "break" #: ../../../core/src/input/code/joystick.cpp:108 msgid "button" msgstr "knapp" msgid "capslock" msgstr "caps lock" #: ../../../core/src/engine/code/game_local_client.cpp:1566 msgid "character" msgstr "teikn" msgid "delete" msgstr "delete" msgid "down" msgstr "ned" msgid "down left" msgstr "ned venstre" msgid "down right" msgstr "ned høgre" msgid "end" msgstr "end" #: ../../../running_bear/code/running_bear.cpp:108 msgid "engine_options" msgstr "spelmotorval" msgid "escape" msgstr "escape" msgid "home" msgstr "home" msgid "insert" msgstr "insert" #: ../../../core/src/engine/code/game_description.cpp:106 #: ../../../core/src/engine/code/game_description.cpp:109 #: ../../../core/src/engine/code/game_description.cpp:112 msgid "integer" msgstr "heiltal" msgid "invalid mouse code" msgstr "ugyldig musekode" #: ../../../core/src/input/code/joystick_button.cpp:96 msgid "joystick" msgstr "styrespak" msgid "keypad *" msgstr "*" msgid "keypad +" msgstr "+" msgid "keypad -" msgstr "-" msgid "keypad ." msgstr "." msgid "keypad /" msgstr "/" msgid "keypad 0" msgstr "0" msgid "keypad 1" msgstr "1" msgid "keypad 2" msgstr "2" msgid "keypad 3" msgstr "3" msgid "keypad 4" msgstr "4" msgid "keypad 5" msgstr "5" msgid "keypad 6" msgstr "6" msgid "keypad 7" msgstr "7" msgid "keypad 8" msgstr "8" msgid "keypad 9" msgstr "9" msgid "keypad =" msgstr "=" msgid "keypad enter" msgstr "enter" msgid "left" msgstr "venstre" msgid "left alt" msgstr "venstre alt" msgid "left click" msgstr "venstreklikk" msgid "left control" msgstr "venstre ctrl" msgid "left shift" msgstr "venstre shift" msgid "left super" msgstr "venstre super" msgid "menu" msgstr "meny" msgid "middle click" msgstr "midtklikk" #: ../../../core/src/engine/code/game_local_client.cpp:1544 #: ../../../core/src/engine/code/game_local_client.cpp:1548 #: ../../../core/src/engine/code/game_local_client.cpp:1552 #: ../../../core/src/engine/code/game_local_client.cpp:1556 #: ../../../core/src/engine/code/game_local_client.cpp:1560 msgid "name=value" msgstr "namn=verdi" msgid "new line" msgstr "linjeskift" msgid "numlock" msgstr "num lock" msgid "page down" msgstr "page down" msgid "page up" msgstr "page up" #: ../../../core/src/engine/code/game_description.cpp:116 #: ../../../core/src/engine/code/game_description.cpp:126 msgid "path" msgstr "adresse" msgid "pause" msgstr "pause" msgid "print screen" msgstr "print screen" msgid "right" msgstr "høgre" msgid "right alt" msgstr "høgre alt" msgid "right click" msgstr "høgreklikk" msgid "right control" msgstr "høgre ctrl" msgid "right shift" msgstr "høgre shift" msgid "right super" msgstr "høgre super" msgid "scrolllock" msgstr "scroll lock" msgid "space" msgstr "mellomrom" #: ../../../core/src/engine/code/game_description.cpp:101 #: ../../../core/src/engine/code/game_description.cpp:129 msgid "string" msgstr "streng" msgid "system" msgstr "system" msgid "tab" msgstr "tab" msgid "up" msgstr "opp" # joystick buttons msgid "up left" msgstr "opp venstre" msgid "up right" msgstr "opp høgre" #: ../../../core/src/engine/code/game_local_client.cpp:1540 #, fuzzy #| msgid "name=value" msgid "value" msgstr "namn=verdi" msgid "wheel down" msgstr "hjul ned" msgid "wheel up" msgstr "hjul opp" # keyboard keys #~ msgid "Undefined" #~ msgstr "Ikkje definert" plee-the-bear-20251226/bear-engine/desktop/man/000077500000000000000000000000001512343254000207705ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/desktop/man/CMakeLists.txt000066400000000000000000000006241512343254000235320ustar00rootroot00000000000000if( BEAR_ENGINE_NO_MANPAGES ) message("Ignoring manpages, on user's demand.") else( BEAR_ENGINE_NO_MANPAGES ) if(DOCBOOK_TO_MAN_FOUND) docbook_create_man( engine-man 6 running-bear.sgml ) else(DOCBOOK_TO_MAN_FOUND) message("docbook-to-man was not found on your system. The manpages of the " "engine are not generated.") endif(DOCBOOK_TO_MAN_FOUND) endif( BEAR_ENGINE_NO_MANPAGES ) plee-the-bear-20251226/bear-engine/desktop/man/running-bear.sgml000066400000000000000000000245201512343254000242460ustar00rootroot00000000000000 manpage.1'. You may view the manual page with: `docbook-to-man manpage.sgml | nroff -man | less'. A typical entry in a Makefile or Makefile.am is: manpage.1: manpage.sgml docbook-to-man $< > $@ The docbook-to-man binary is found in the docbook-to-man package. Please remember that if you create the nroff version in one of the debian/rules file targets (such as build), you will need to include docbook-to-man in your Build-Depends control field. --> Julien"> Jorge"> august 21, 2009"> 6"> julien.jorge@gamned.org"> running-bear"> Debian"> GNU"> GPL"> ]>
&dhemail;
&dhfirstname; &dhsurname; 2008 2009 2010 &dhusername; &dhdate;
&dhucpackage; &dhsection; &dhpackage; The launcher for games made with the Bear Engine. &dhpackage; DESCRIPTION This program is a launcher for games made with the Bear Engine. OPTIONS The following options can be passed to the program: The margin around the camera in which we check for activity. Path to the directory containing the data of the game. When a file is required during the game, the paths are explored from the last one on the command line toward the first one. , Enables or disables the use of the dumbest rendering procedure. Run the game in fullscreen mode. The name of the game. Change the delimiter used in --set-game-var-"type" to separate the name and the value of the variable. Show summary of options. Path to a library containing items for the game. Do not display log messages that have recently been displayed. Write log output in "file". Output log messages up to a given level, among "error", "warning" and "verbose". Do not display the same log message successively. The height of the screen The width of the screen. Set the value of a boolean game variable. Set the value of an integer game variable. Set the value of a real number game variable. Set the value of a string game variable. Set the value of a non negative integer game variable. The path to the first level to run, relatively to the data paths. Set the value of the destination to which game statistics are sent. Print the version of the engine and exit. Run the game in a window. AUTHOR This manual page was written by &dhusername; &dhemail;. Permission is granted to copy, distribute and/or modify this document under the terms of the &gnu; General Public License, Version 2 any later version published by the Free Software Foundation. On Debian systems, the complete text of the GNU General Public License can be found in /usr/share/common-licenses/GPL.
plee-the-bear-20251226/bear-engine/doc/000077500000000000000000000000001512343254000173115ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/doc/Doxyfile000066400000000000000000002405241512343254000210260ustar00rootroot00000000000000# Doxyfile 1.8.4 # This file describes the settings to be used by the documentation system # doxygen (www.doxygen.org) for a project. # # All text after a double hash (##) is considered a comment and is placed # in front of the TAG it is preceding . # 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 sequence of words) that should # identify the project. Note that if you do not use Doxywizard you need # to put quotes around the project name if it contains spaces. PROJECT_NAME = "Bear Engine" # 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. PROJECT_NUMBER = # Using the PROJECT_BRIEF tag one can provide an optional one line description # for a project that appears at the top of each page and should give viewer # a quick idea about the purpose of the project. Keep the description short. PROJECT_BRIEF = # With the PROJECT_LOGO tag one can specify an logo or icon that is # included in the documentation. The maximum height of the logo should not # exceed 55 pixels and the maximum width should not exceed 200 pixels. # Doxygen will copy the logo to the output directory. PROJECT_LOGO = # 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 = . # 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, Latvian, Lithuanian, Norwegian, Macedonian, # Persian, Polish, Portuguese, Romanian, Russian, Serbian, Serbian-Cyrillic, # 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. Note that you specify absolute paths here, but also # relative paths, which will be relative from the directory where doxygen is # started. STRIP_FROM_PATH = ../core/src/ ../common/include/ # 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 if your file system # 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 = NO # 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 = 8 # 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 = # This tag can be used to specify a number of word-keyword mappings (TCL only). # A mapping has the form "name=value". For example adding # "class=itcl::class" will allow you to use the command class in the # itcl::class meaning. TCL_SUBST = # 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 MARKDOWN_SUPPORT is enabled (the default) then doxygen pre-processes all # comments according to the Markdown format, which allows for more readable # documentation. See http://daringfireball.net/projects/markdown/ for details. # The output of markdown processing is further processed by doxygen, so you # can mix doxygen, HTML, and XML commands with Markdown formatting. # Disable only in case of backward compatibilities issues. MARKDOWN_SUPPORT = YES # When enabled doxygen tries to link words that correspond to documented # classes, or namespaces to their corresponding documentation. Such a link can # be prevented in individual cases by by putting a % sign in front of the word # or globally by setting AUTOLINK_SUPPORT to NO. AUTOLINK_SUPPORT = YES # 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 makes 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 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 the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and # unions are shown inside the group in which they are included (e.g. using # @ingroup) instead of on a separate page (for HTML and Man pages) or # section (for LaTeX and RTF). INLINE_GROUPED_CLASSES = NO # When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and # unions with only public data fields or simple typedef fields will be shown # inline in the documentation of the scope in which they are defined (i.e. file, # namespace, or group documentation), provided this scope is documented. If set # to NO (the default), structs, classes, and unions are shown on a separate # page (for HTML and Man pages) or section (for LaTeX and RTF). INLINE_SIMPLE_STRUCTS = NO # 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 size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This # cache is used to resolve symbols given their name and scope. Since this can # be an expensive process and often the same symbol appear multiple times in # the code, doxygen keeps a cache of pre-resolved symbols. If the cache is too # small doxygen will become slower. If the cache is too large, memory is wasted. # The cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid # range is 0..9, the default is 0, corresponding to a cache size of 2^16 = 65536 # symbols. LOOKUP_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 respectively 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_PACKAGE tag is set to YES all members with package or internal # scope will be included in the documentation. EXTRACT_PACKAGE = NO # 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 = YES # 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 namespaces 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 = NO # 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 = NO # 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 = YES # 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 # If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to # do proper type resolution of all parameters of a function it will reject a # match between the prototype and the implementation of a member function even # if there is only one candidate or it is obvious which candidate to choose # by doing a simple string match. By disabling STRICT_PROTO_MATCHING doxygen # will still accept a match between prototype and implementation in such cases. STRICT_PROTO_MATCHING = 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 = YES # 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 = YES # 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 section-label ... \endif # and \cond section-label ... \endcond blocks. ENABLED_SECTIONS = # The MAX_INITIALIZER_LINES tag determines the maximum number of lines # the initial value of a variable or macro 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 macros 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 # 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. To 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 = # The CITE_BIB_FILES tag can be used to specify one or more bib files # containing the references data. This must be a list of .bib files. The # .bib extension is automatically appended if omitted. Using this command # requires the bibtex tool to be installed. See also # http://en.wikipedia.org/wiki/BibTeX for more info. For LaTeX the style # of the bibliography can be controlled using LATEX_BIB_STYLE. To use this # feature you need bibtex and perl available in the search path. Do not use # file names with spaces, bibtex cannot handle them. CITE_BIB_FILES = #--------------------------------------------------------------------------- # 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 = YES # 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 # The WARN_NO_PARAMDOC option can be enabled 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 = NO # 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 = #--------------------------------------------------------------------------- # 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 = ../core/src ../common/include ../lib/src/ # 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++ *.d *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh # *.hxx *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.dox *.py # *.f90 *.f *.for *.vhd *.vhdl FILE_PATTERNS = *.c \ *.cc \ *.cxx \ *.cpp \ *.c++ \ *.d \ *.java \ *.ii \ *.ixx \ *.ipp \ *.tpp \ *.i++ \ *.inl \ *.h \ *.hh \ *.hxx \ *.hpp \ *.h++ \ *.idl \ *.odl \ *.cs \ *.php \ *.php3 \ *.inc \ *.m \ *.mm \ *.dox \ *.C \ *.CC \ *.C++ \ *.II \ *.I++ \ *.H \ *.HH \ *.H++ \ *.CS \ *.PHP \ *.PHP3 \ *.M \ *.MM # 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 be # 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. # Note that relative paths are relative to the directory from which doxygen is # run. EXCLUDE = # The EXCLUDE_SYMLINKS tag can be used to select whether or not files or # directories that are symbolic links (a Unix file system 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 = # 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 = NO # 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. # Note that the filter must not add or remove lines; it is applied before the # code is scanned, but not when the output code is generated. If lines are added # or removed, the anchors will not be placed correctly. 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 or if # non of the patterns match the file name, INPUT_FILTER is applied. 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 # The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file # pattern. A pattern will override the setting for FILTER_PATTERN (if any) # and it is also possible to disable source filtering for a specific pattern # using *.ext= (so without naming a filter). This option only has effect when # FILTER_SOURCE_FILES is enabled. FILTER_SOURCE_PATTERNS = # If the USE_MD_FILE_AS_MAINPAGE tag refers to the name of a markdown file that # is part of the input, its contents will be placed on the main page # (index.html). This can be useful if you have a project on for instance GitHub # and want reuse the introduction page also for the doxygen output. USE_MDFILE_AS_MAINPAGE = #--------------------------------------------------------------------------- # 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 = YES # 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, C++ and Fortran 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 = YES # 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. Note that when using a custom header you are responsible # for the proper inclusion of any scripts and style sheets that doxygen # needs, which is dependent on the configuration options used. # It is advised to generate a default header using "doxygen -w html # header.html footer.html stylesheet.css YourConfigFile" and then modify # that header. Note that the header is subject to change so you typically # have to redo this when upgrading to a newer version of doxygen or when # changing the value of configuration settings such as GENERATE_TREEVIEW! 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 left blank doxygen will # generate a default style sheet. Note that it is recommended to use # HTML_EXTRA_STYLESHEET instead of this one, as it is more robust and this # tag will in the future become obsolete. HTML_STYLESHEET = # The HTML_EXTRA_STYLESHEET tag can be used to specify an additional # user-defined cascading style sheet that is included after the standard # style sheets created by doxygen. Using this option one can overrule # certain style aspects. This is preferred over using HTML_STYLESHEET # since it does not replace the standard style sheet and is therefor more # robust against future updates. Doxygen will copy the style sheet file to # the output directory. HTML_EXTRA_STYLESHEET = # The HTML_EXTRA_FILES tag can be used to specify one or more extra images or # other source files which should be copied to the HTML output directory. Note # that these files will be copied to the base HTML output directory. Use the # $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these # files. In the HTML_STYLESHEET file, use the file name only. Also note that # the files will be copied as-is; there are no commands or markers available. HTML_EXTRA_FILES = # The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. # Doxygen will adjust the colors in the style sheet 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_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. HTML_DYNAMIC_SECTIONS = NO # With HTML_INDEX_NUM_ENTRIES one can control the preferred number of # entries shown in the various tree structured indices initially; the user # can expand and collapse entries dynamically later on. Doxygen will expand # the tree to such a level that at most the specified number of entries are # visible (unless a fully collapsed tree already exceeds this amount). # So setting the number of entries 1 will produce a full collapsed tree by # default. 0 is a special value representing an infinite number of entries # and will result in a full expanded tree by default. HTML_INDEX_NUM_ENTRIES = 100 # 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 (tabs) # at top of each HTML page. The value NO (the default) enables the index and # the value YES disables it. Since the tabs have the same information as the # navigation tree you can set this option to NO if you already set # GENERATE_TREEVIEW to YES. DISABLE_INDEX = NO # 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. # Since the tree basically has the same information as the tab index you # could consider to set DISABLE_INDEX to NO when enabling this option. GENERATE_TREEVIEW = NO # The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values # (range [0,1..20]) that doxygen will group on one line in the generated HTML # documentation. Note that a value of 0 will completely suppress the enum # values from appearing in the overview section. ENUM_VALUES_PER_LINE = 4 # 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 # Enable the USE_MATHJAX option to render LaTeX formulas using MathJax # (see http://www.mathjax.org) which uses client side Javascript for the # rendering instead of using prerendered bitmaps. Use this if you do not # have LaTeX installed or if you want to formulas look prettier in the HTML # output. When enabled you may also need to install MathJax separately and # configure the path to it using the MATHJAX_RELPATH option. USE_MATHJAX = NO # When MathJax is enabled you can set the default output format to be used for # the MathJax output. Supported types are HTML-CSS, NativeMML (i.e. MathML) and # SVG. The default value is HTML-CSS, which is slower, but has the best # compatibility. MATHJAX_FORMAT = HTML-CSS # When MathJax is enabled you need to specify the location relative to the # HTML output directory using the MATHJAX_RELPATH option. The destination # directory should contain the MathJax.js script. For instance, if the mathjax # directory is located at the same level as the HTML output directory, then # MATHJAX_RELPATH should be ../mathjax. The default value points to # the MathJax Content Delivery Network so you can quickly see the result without # installing MathJax. # However, it is strongly recommended to install a local # copy of MathJax from http://www.mathjax.org before deployment. MATHJAX_RELPATH = http://www.mathjax.org/mathjax # The MATHJAX_EXTENSIONS tag can be used to specify one or MathJax extension # names that should be enabled during MathJax rendering. MATHJAX_EXTENSIONS = # The MATHJAX_CODEFILE tag can be used to specify a file with javascript # pieces of code that will be used on startup of the MathJax code. MATHJAX_CODEFILE = # 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 web server instead of a web client using Javascript. # There are two flavours of web server based search depending on the # EXTERNAL_SEARCH setting. When disabled, doxygen will generate a PHP script for # searching and an index file used by the script. When EXTERNAL_SEARCH is # enabled the indexing and searching needs to be provided by external tools. # See the manual for details. SERVER_BASED_SEARCH = NO # When EXTERNAL_SEARCH is enabled doxygen will no longer generate the PHP # script for searching. Instead the search results are written to an XML file # which needs to be processed by an external indexer. Doxygen will invoke an # external search engine pointed to by the SEARCHENGINE_URL option to obtain # the search results. Doxygen ships with an example indexer (doxyindexer) and # search engine (doxysearch.cgi) which are based on the open source search # engine library Xapian. See the manual for configuration details. EXTERNAL_SEARCH = NO # The SEARCHENGINE_URL should point to a search engine hosted by a web server # which will returned the search results when EXTERNAL_SEARCH is enabled. # Doxygen ships with an example search engine (doxysearch) which is based on # the open source search engine library Xapian. See the manual for configuration # details. SEARCHENGINE_URL = # When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the unindexed # search data is written to a file for indexing by an external tool. With the # SEARCHDATA_FILE tag the name of this file can be specified. SEARCHDATA_FILE = searchdata.xml # When SERVER_BASED_SEARCH AND EXTERNAL_SEARCH are both enabled the # EXTERNAL_SEARCH_ID tag can be used as an identifier for the project. This is # useful in combination with EXTRA_SEARCH_MAPPINGS to search through multiple # projects and redirect the results back to the right project. EXTERNAL_SEARCH_ID = # The EXTRA_SEARCH_MAPPINGS tag can be used to enable searching through doxygen # projects other than the one defined by this configuration file, but that are # all added to the same external search index. Each project needs to have a # unique id set via EXTERNAL_SEARCH_ID. The search mapping then maps the id # of to a relative location where the documentation can be found. # The format is: EXTRA_SEARCH_MAPPINGS = id1=loc1 id2=loc2 ... EXTRA_SEARCH_MAPPINGS = #--------------------------------------------------------------------------- # 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, letter, legal and # executive. If left blank a4 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 = # The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for # the generated latex document. The footer should contain everything after # the last chapter. If it is left blank doxygen will generate a # standard footer. Notice: only use this tag if you know what you are doing! LATEX_FOOTER = # The LATEX_EXTRA_FILES tag can be used to specify one or more extra images # or other source files which should be copied to the LaTeX output directory. # Note that the files will be copied as-is; there are no commands or markers # available. LATEX_EXTRA_FILES = # 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 # The LATEX_BIB_STYLE tag can be used to specify the style to use for the # bibliography, e.g. plainnat, or ieeetr. The default style is "plain". See # http://en.wikipedia.org/wiki/BibTeX for more info. LATEX_BIB_STYLE = plain #--------------------------------------------------------------------------- # 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 style sheet 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 related to the DOCBOOK output #--------------------------------------------------------------------------- # If the GENERATE_DOCBOOK tag is set to YES Doxygen will generate DOCBOOK files # that can be used to generate PDF. GENERATE_DOCBOOK = NO # The DOCBOOK_OUTPUT tag is used to specify where the DOCBOOK 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 docbook will be used as the default path. DOCBOOK_OUTPUT = docbook #--------------------------------------------------------------------------- # 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 # pointed to by INCLUDE_PATH will be searched when 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 that # overrules the definition found in the source code. EXPAND_AS_DEFINED = # If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then # doxygen's preprocessor will remove all references to function-like macros # that are alone on a line, have an all uppercase name, and do not end with a # semicolon, because these 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. For each # tag file the location of the external documentation should be added. 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. 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 # If the EXTERNAL_PAGES tag is set to YES all external pages will be listed # in the related pages index. If set to NO, only the current project's # pages will be listed. EXTERNAL_PAGES = 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 also works with HAVE_DOT disabled, but 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 use the Helvetica font for all dot files that # doxygen generates. When you want a differently looking font you can specify # the font name using DOT_FONTNAME. You 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 = Helvetica # 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 Helvetica font. # If you specify a different font using DOT_FONTNAME you can use DOT_FONTPATH to # set the path where dot can find it. 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 # 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 = NO # If the UML_LOOK tag is enabled, the fields and methods are shown inside # the class node. If there are many fields or methods and many nodes the # graph may become too big to be useful. The UML_LIMIT_NUM_FIELDS # threshold limits the number of items for each type to make the size more # manageable. Set this to 0 for no limit. Note that the threshold may be # exceeded by 50% before the limit is enforced. UML_LIMIT_NUM_FIELDS = 10 # 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 = NO # If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen # will generate a graphical hierarchy of all classes instead of a textual one. GRAPHICAL_HIERARCHY = YES # If the DIRECTORY_GRAPH 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 svg, png, jpg, or gif. # If left blank png will be used. If you choose svg you need to set # HTML_FILE_EXTENSION to xhtml in order to make the SVG files # visible in IE 9+ (other browsers do not have this requirement). DOT_IMAGE_FORMAT = png # If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to # enable generation of interactive SVG images that allow zooming and panning. # Note that this requires a modern browser other than Internet Explorer. # Tested and working are Firefox, Chrome, Safari, and Opera. For IE 9+ you # need to set HTML_FILE_EXTENSION to xhtml in order to make the SVG files # visible. Older versions of IE do not have SVG support. INTERACTIVE_SVG = NO # 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 MSCFILE_DIRS tag can be used to specify one or more directories that # contain msc files that are included in the documentation (see the # \mscfile command). MSCFILE_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 = 50 # 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 plee-the-bear-20251226/bear-engine/doc/diagram/000077500000000000000000000000001512343254000207155ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/doc/diagram/audio.dia000066400000000000000000000061241512343254000225000ustar00rootroot00000000000000‹í]Ûrã¸}Ÿ¯Pi^m˜à«õlÍnU*Im*Ù}VA",!C‘ HÙÖ>ì÷ä?òc)Z6oâKn»flÉ  ¡»À?=ï¼Ù#å üû9FÊ|Fýuà2s?ÿý·¿ÜÚóŸ¾|úÑeäñoÃÉn&žð£äÕý|ÇáwwOOOÈ;D$8òØEôîOâyäNº›ù4›½­À%1IÞËÞ%qÌÙjÓ™Ovô~¾"ëoì}w~,••[^ÀgÄ»Ÿ~H¿æwY5w¹zÎÔ’ ]qJ¾ÕW­ˆ/ÇéSuHy±Ú]DL‰a©HM=ÉÿoÊd¥"QÈß|ùüUÿ|lRöÆk]U ­ïß0¿,GôwìÙªªŠÎ0ÛQ,ÝÂ/}Ò]ÜjZqÞ´âø´âX´ sÂâ²ÈUx”øG©1ßÓþr¢5ñÄ;§Ö-X í ^ÔFãÛ'këj¹ÎÜó†›+QSËsãíòYRwk?Hªý‘ElåѪÖ3?­úÃ8Õ?Ô{¿>>p4k« ®M jt›=siÔ0ÌòejjÚfÅîšz½X®mÇß*ëT„G”gÕåœýᅵކñç³ì3ΜΛŽVÿ¦ë8Óð÷¿ÿmv;ûÅ#Q4Es0÷~þ«’B¢&áùJý¯ƒÈB–qƒ5dEµËN£NÄjU”À…ÄßxôUJ*d¡šÉo²úI£Ý-×÷˨`L¥R1©)+öâ‚Zª4\P6Þ¤õÜ'¡|mR)äA˜çr½%%ÿyòžºÒ¯þ¬—–Ó¥GýMÙ{Ž&#&›Miú¤*äaMͼWé©Èó¼f ùI{7 1}Žåêàbç-‚²+NÞ›=ó÷ó]àQHÖt>‹âC‚x|9VñK°çŒò~ò_ÜtŸØv¡ ·?žûëÊcÿék_aàv·lÝ«EÅ jÌ:ŒÉ¯ÍM‰ˆp9§Vœ>š¿Rï‘ÆlMÒžø õnŽ]Ýœa}“9‘ŽM)·dP+ÞXO#üSŠð¯/Ø,ŽÑé$çŒu:±ù×(:Îe‰{;€¥©T‹âŠsðýÎ;.§+“µðNÄܱ&e{&ÏQóóò¤'Éš/G*ú}Vêh’Ê3!y²R4Ì<ªÄQ¿Ël÷mž¥»˜ŠÉWË\gîKÌu­ƒêAÒ[\eÞ¨c^¥v:Pa§ÂÃí/ôÈa´!S™ 7B'4‘)LiÝ­Í®¸DÒ]ó·”³˜økº¬ûÈFëCÏøá’}Iíâ)?…}Eåe€’ãÏž<xŽ¢ç¨Vá#NÊ·÷e”_;ú4êbÁýÀ~ßTþöF×Wjµ¡Ë—ûùnÐW Äù‘Ú(¬6|uÇÚ“„¼(Byò äXîè9h¼| ¼ýŽ‚ÿÿþ s„{ü.Ù ö+Xž,+ß,wãìBÄT÷â¥þ(Ï=’"û±$ñ`–¤ƒ˸Q5¤c™4I!FMÅhæB5b$¯td›RÙ’ƒ•kC—Ú¨–î¼ù’H—ÄHsò_è’®·Ê$P&'¤LŽ i:€4 ¤É ¡î&ß—Mš¢&4 ¤I MiòºI“wmÙ]w—:Ûþ§è-ö};áÆÙ„[:áVU”Ì}ÅÔÔ”¹/QˆÑ­LÌB¼0³oÝ.àñv™êÑ]»Áå 3ø¶å:ëˆH[5‰¬s+ÂõÏunÙÇöò å„n÷ÒöÓœÀ§<çï1±|_˜lâ(K=òò—Ù–ønã Ý={ýëýÜ, ¹Šgqö,Î?‹Ë{Á žÔ†:K #«òwqk rÌLÎBN)j!MfvråÚíæ6Œ16X·JOjS¤'®d&!3 ›¹!/ yIØÌ yIÈKB^ò’—„ÍÜSmæÞŸl(Ÿx7÷ØRa;7lç¾ÔíÜ>}:ÇRºžùÈÚÛØæ—´[åÊ©»úÉq[›€»+äX¶õBÞÕld¦¯,¤›’ÓãCÕk“7‘•OXÛÓãº$².dÄ!#~…\]H‰CJ¨º@Õ…”8¤Ä!%)qH‰Ë¢êÂqj#åìN‚„ÝûÈ™wËØ©Sd솧!?üñ2Ìg1Kéùp¼ øæ?&ÎøwWïÏp*ô‹Ày€óçqMÎãJV Ïl=4/HM–î°…T©»i„íEÎB¼Ò²åCÙ»k¡`ãÄš‚°v ^ÕDmÀD]ÞįQ¬Ù"–=§9ÕBGX&ÕBÔ¯eǤáÅI¨,,ÕmVk7 `rÂÛÀîjã %8¼_'q‰RªŸp?šÐ|ìž¡¾[Ÿ'nÄr\ôÝ$ ·÷bzl]3sVÁyð4ø&› §Ë¥Ž=ïk9ׇôn¾ˆ4:²) mÀÙ úg+Xƒ1 ²,Ó°n°ˆÕ:VeΑ¥¦’tä8X]ˆŸºeš7ª‚§¯ä–$Ò1”lC#ÅJïó|Z1G Iç(œ»3È£@…ã€; ÜQ8N¸£Àî(pG; Ç)H8Naä ÚX wÿÀ1 pŒÂÇ(Lb:iÕb1™ñ¼\ª.XXÐå[a4™ùìýˆm|êÎFÝ*öös¡ùlI´$ËÑÃØ;#æ&Ÿ,sœû!w] 9÷<ËÌ|§ŽtÕ4“ÅJK¤%+°ÉЬn˜ l£ãy÷†LžY­~EM„MMëZô,—Wè—P~óÅ.  |5à«_ øjx©“¯fÕrΚùj…{„ì øjÎPtt+"·®ØÖŽU34‰ð(eQr,!j‘ªc1L¤Zš!“°6Ž–­k&2skmXæµå*Â“Ü töˆl ´¡ m@hBڀЄ6 ´¡ m@h“À) „GK æµ¨9CÌè8§v(P¿{êö‘ÀH`@`@@nû䶵ИÃa“ÀgƒÃ&á¨ëμtâž¹Û 8p ïÒTH«p§ åÛ»‹ÒèKÊÔŽÀ¥ºXqy¢žþ]tôoor}¥V›¹|¹ß˜ïÖ ­=Ÿ«QXm›xl>0ïûŒM&~¡dƒs‚Á©78Ç˧Œ|w`2Àd€É“&ƒ°7>&ƒ°a„={ö !gl~§Ùtà2 O@e]P™OŸ–Ù…ÞÕ^g8²v€Í›Á:såä.%ŠÁä8˜ÜÁäÐóÕ£ç(B{ö ìA؃°a½cò™Eq‡íBðû€Áï’ۅرb_ÏØÇ|3â±?(Lù êÁ”OfØdßßJ §B¿œ8p×ä<>ÄýXz³f ÕNîPÐmH<YAzrܲŒää…«ÛÇ«t©TÔèW_ÐAZþæŠ['v„.¥’£_<—KÀåp7\.hÌ„?æåZþ‚Üår §ð¬5âí E8ª*0Çd+Ȩ`!¤Zêø¦Z»úrX4K3Z ›RI@7€n 8ºèæý¡e2ò‘/™løòŸÛÎGn3ä##ùÈÈGF>ò}ç#?^eú ø_pàÕqàµwuç¿Óà¿» ú×ÂK'bE Kx4{C$@ A à†zÛ@u£¶û@u¢1WeQR!‰ZR#®íêcö.Ù$†íê*L²N À%®á~þÑFÑÝÝŸî£ó1Ô(EPA@PA@PAk Hý–'|Ü-±÷ßÿšŸ¢Ááj/ŒlBmj¨¬÷PÈ2ײ²Æ#“ØòJ F5¥ÌÆŽ&Z«ø³C,·/j£#‰ìfûèn jc)^‚ÓN#8à4‚ÓN#8à4‚ÓN#8à4^’Ó(ÌZY0ùGÀ_à†7úky£ÑÍ´‰;ºpë ›)º™^/o`­Í±F±FoŸ* ™âhØ+ œðÛbÈs†|ò8äá÷μ.C9:ÕqV3¬æÚQ|DÐl¡ó ó`37AÀàðøÑ?üÄ{™¤+ñÍr‚CwÕYPˆ¸È©»˜š½Snx¾‘Ž}™ÕY¡C±0±0OW˜R¹8ý8Ÿ†XœpYvt`98.฀㎠U8<»ˆÆ+òž ðÀ¾,?N^d]þà³,Ndɦu4Ôj¡áJyì84àÐÐÑ¡!]Ä(üŠó(Á8.T!p°œ_†ÓdKom׃¶c¨ ¦¨‚˜Ý¾‚˜NLÛpB÷––¢,VˆÒŠæÒ#êCʦ”èV«š^5 ˆu1Ï:õÃL¢ívFuÖÓ Û­¤Àº¯6Q=ì¼êa]ÔôBù0”Cù0”+•€òa(†òa(†òa(†òa{>¥(È/¼ãòpBwà„îÀƒzžšÝ!k¥½Óûú’d.æ—<{;‰üÊ Ûæs@€nNë€5³ÙÕÃbŽi+ Pé+w„(SH´Ç#ªC•Nz«y0"É“5٪Ѯ궅Qf›™ìadM1Œ Q–½UÀ¨nZȦ„Úe׋«v3ÏZ}™(ÑM…¡Tcß­dw¿ƒ¥7ç£"ŒŠ0*¨£V‡ ÛØU×Fme"ŒŠ0*¨£"ŒŠ0jïaTÔ÷G(äë†BPà¿5€,¼t"–P$̰„G³·{““õÁ$@ IkFFšÅ 02U\Uì{™‡´bѸå"²Å^°\…wk5{)Ÿ”‡D¡þ þîÝv¾óòTkË£1(Ñ,‡=Œ˜ä™(dÑHAt#È6ǦCl)Wo.¶¦‹ Ö¢ÏØÄÚ­K Kc£“ÐB%—f²ô"ñ+§œpjÀ©§œpjÀ©§œpjÀ©¹>NÍLhz´î„a,ÁÏÅŽ0öüŽæä~ãàrÌeÚ#¿ï!~«Nžƒ uG Äÿpo‰ÅÙÃâÔ‘ð4« fÌ2˜e0Ë`–AóÁ,ƒY³ì¸³wl’7 »ì^y³0Ë ùnÁ,»nÍ7‘#S¸$ ú ú úªÐ8áifQ~?ø,‹“oa6^¿òmž¡ {P…ìÎU! Ò,EÑhAhAhA¡õ.|¼÷t_Ú6Ý—2Â5F†F¨Âl_!‡ÚïrLY1ß-Äê&Q›îÛÁëdûÊž½eûöQ9?ñˆOäí`A¶/²}‘í‹l_dû¢9²}‘í‹l_dû"ÛÙ¾×—í+ƒ±ñÊûo2_ïÕ½=\à wôº£¯‡Ù1óÈN'€ÀI 8™æIšèt 0^YÖ>~=Á%Uƒ4“ܰ­UzØN>®8ÏVyvÑź®Ä‚Ÿ±£Z‘ÏQ<&L6˜lÕ”ÂYr™H²­‹Îy­wß©Ü÷ÎgdmùŒÌ"ºa¸#j)å3 9Ì}—cŽMJ´µXª˜ÏØÁ¿0ŸQRx@f™dFAfü­K@f™dFAf™dF°à†?dFÀ àp8™‘q@"ã 3"J2#ÈŒ 3‚Ì“ &L6Af™dÆÆdF½-™qĈéè–¥œÍ(YúV9fŒPjé=л˜âæ3¦+¡kÁh£ŒF0ÁhDyF0Áh£ŒF0Áh£$8¥á”£p8œNÀht:£¡r0Áh£ŒF˜l0Ù`²ÑF#`4ŒÆ_¹¿óϤFúNj4ZWh4ˆYt‚f&ÑÓVY¤Q'6Ûˆ¢ºiu‡Øïŵ†¼Æ8É“b>Ífyj¬FL—¹§ÆŠXEÝÉsƶ`ÊÉÆIp„¹Wr.:eS”îì{òò,NÄÁ†+gåÊ ¤mÉ>êDœb^#ktG‘ØÃ20}ðDÞß,¼Èß’²X`’9|¼û4´–Ü‘ÏÒÍg)ÛýðÁš<¸£n`Ô¼!u‰M-Ýø€QñÛ(põfaTLÉZO錱€QÀ(`ô8Œêê`´4¿Æj¡ÄY›EL‡QC¥)ú"±t!j,Àį뼌Ì4¤B"·z¯|A:ñƒ${»Wé¶Ù+~—‡aE[=8Š€pÁQ´í„]¦è)['oœ¼ëª¼)ŸÑm¯¡ô ô`57‚Ò @üÄ{™œè‹‚Apîþ¼ú„ˆ‹¼‹© Ô;ÍÃù»»ó7½QvÆeVg…ÅÂÄÂ<]“Yåâ¬è‚НåY'™{…óÎ 8/à¼P©fQyE%4XÜåçÉ‹¬Ë|–ÅÉ·0¯k‰}›gc,Sœ®0§œ::5¤‹8Ãq^¨‚à`9¿ ±/È–Þ ê®uÇ î î î î î~~B>‘/¶,~CéÝ–Beï›í‡ÉhÛŠ»ºE¨ÝO)ê½O@Ñ£À Ä¡{Љٴân½å“<2Ö!£öYce‡OóÔ@1SÍ3݈ÞèM€ÒòèM€ÞhétÓ½ Œ³zh{½ ŒÞz:1ÖºC5+Š÷Û¦hÞ ±V“j6HÑ•@·5{<¢ïm La3)n‡ybª –k2–,'(>XN°œÐÕé¶,'«´ŸeµåÄ´ÒFšª '½ƒf˜Âb‘M\â¨u4IQLŠÒ͵ÙÄLB‹˜CZ8¹êvÃ,™gGcå¤ „Å‹ ,&XL·e1™-,&JUXLÖ†ï%¾0›þÁ_³cö’ÑÚÑdDz KèqMX1¶£ÒÑôY–Ë4}<¢ÄÑ]×*L×ÑôæÍ¾ªÚ¯ì)e%»šÿ`ÛÿW>Ø0(è<í öº1mÇ•wd:lUÕnßtÒùô5ÖjLÔˆ&å‡Ô[ Í8K»-á>­—ò¶pÀ6 æQ=ª<·TnVm¾Ž Ëì²hh.£½@–eé†%!ËÔYñŠl|kX7YIðCh}`Vÿ˜u°B•a–áË€Y§1kýwè½ñäûOë?Ä¿óÄ[~ÿéÿ~FUÞç¬plee-the-bear-20251226/bear-engine/doc/examples/000077500000000000000000000000001512343254000211275ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/doc/examples/01-screen/000077500000000000000000000000001512343254000226245ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/doc/examples/01-screen/CMakeLists.txt000066400000000000000000000031331512343254000253640ustar00rootroot00000000000000cmake_minimum_required(VERSION 2.8) #------------------------------------------------------------------------------- # Find the root directory of the source of the Bear Engine. This directory # contain the bear-engine and bear-factory project directories. if( NOT DEFINED BEAR_ROOT_DIRECTORY OR NOT IS_DIRECTORY "${BEAR_ROOT_DIRECTORY}/bear-engine" ) message( FATAL_ERROR "I can't find the Bear Engine. Please set BEAR_ROOT_DIRECTORY to the path of the engine's root:\n cmake . -DBEAR_ROOT_DIRECTORY=/home/joe/dev/bear\nCurrent path is \"${BEAR_ROOT_DIRECTORY}\" and it doesn't contain a bear-engine directory." ) endif() # The engine comes with some CMake scripts to ease its configuration and usage. # These scripts are in the directory below and must be assigned to # CMAKE_MODULE_PATH in order to be found by the upcoming include() instructions set( CMAKE_MODULE_PATH "${BEAR_ROOT_DIRECTORY}/cmake-helper" ) # This will sets the variables of the source directories, required by the CMake # package below. include( "bear-config" ) #------------------------------------------------------------------------------- # Include Bear Engine's CMake package to find the libraries, the link paths and # the and include paths required by the engine. find_package( bear ) include_directories( ${BEAR_ENGINE_INCLUDE_DIRECTORY} ) #------------------------------------------------------------------------------- # Now we can describe our project. set( TARGET_NAME ex-screen ) file( GLOB SOURCES *.cpp ) add_executable( ${TARGET_NAME} ${SOURCES} ) target_link_libraries( ${TARGET_NAME} ${BEAR_ENGINE_LIBRARIES} ) plee-the-bear-20251226/bear-engine/doc/examples/01-screen/main.cpp000066400000000000000000000036541512343254000242640ustar00rootroot00000000000000/** * \file * * This example program creates a window and wait for the user to close it. * * In order to make this example minimalistic, it will not use most of the * functionalities of the Bear Engine. Consequently, we will have manage the * exit of the program ourselves. * * The SDL is used for the subsystems of the engine. Thus we can use its event * system to detect when the user wants to quit the program. */ #include "visual/screen.hpp" #include "SDL2/SDL.h" /** * This global variable is observed in the main loop in order to exit the * program as it becomes true. */ bool g_quit(false); /** * This function processes an event of the SDL. If the quit signal has been * sent, then g_quit is set to true. Otherwise the function does nothing. * \param user_data Ignored. * \param event The event to process. */ int event_filter ( void* user_data, SDL_Event* event ) { int result(0); switch ( event->type ) { case SDL_QUIT: g_quit = true; break; default: result = 1; } return result; } /** * Initializes the visual module of the engine and registers the event filter to * the SDL. */ void init() { bear::visual::screen::initialize( bear::visual::screen::screen_gl ); SDL_EventState( SDL_QUIT, SDL_ENABLE ); SDL_SetEventFilter( &event_filter, NULL ); } /** * Creates a window and waits for the quit signal to be received. */ int main( int argc, char* argv[] ) { init(); // Here we create the window; it will be immediately visible. // The engine does not support multiples windows yet, so be careful and be // sure to create only one of them. bear::visual::screen s( claw::math::coordinate_2d(640, 480) ); // And we can wait for the quit signal. The window won't display anything // since we never call the rendering functions. while( !g_quit ) SDL_PumpEvents(); // Turn the subsystems off. bear::visual::screen::release(); return 0; } plee-the-bear-20251226/bear-engine/doc/examples/02-display/000077500000000000000000000000001512343254000230135ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/doc/examples/02-display/CMakeLists.txt000066400000000000000000000031341512343254000255540ustar00rootroot00000000000000cmake_minimum_required(VERSION 2.8) #------------------------------------------------------------------------------- # Find the root directory of the source of the Bear Engine. This directory # contain the bear-engine and bear-factory project directories. if( NOT DEFINED BEAR_ROOT_DIRECTORY OR NOT IS_DIRECTORY "${BEAR_ROOT_DIRECTORY}/bear-engine" ) message( FATAL_ERROR "I can't find the Bear Engine. Please set BEAR_ROOT_DIRECTORY to the path of the engine's root:\n cmake . -DBEAR_ROOT_DIRECTORY=/home/joe/dev/bear\nCurrent path is \"${BEAR_ROOT_DIRECTORY}\" and it doesn't contain a bear-engine directory." ) endif() # The engine comes with some CMake scripts to ease its configuration and usage. # These scripts are in the directory below and must be assigned to # CMAKE_MODULE_PATH in order to be found by the upcoming include() instructions set( CMAKE_MODULE_PATH "${BEAR_ROOT_DIRECTORY}/cmake-helper" ) # This will sets the variables of the source directories, required by the CMake # package below. include( "bear-config" ) #------------------------------------------------------------------------------- # Include Bear Engine's CMake package to find the libraries, the link paths and # the and include paths required by the engine. find_package( bear ) include_directories( ${BEAR_ENGINE_INCLUDE_DIRECTORY} ) #------------------------------------------------------------------------------- # Now we can describe our project. set( TARGET_NAME ex-display ) file( GLOB SOURCES *.cpp ) add_executable( ${TARGET_NAME} ${SOURCES} ) target_link_libraries( ${TARGET_NAME} ${BEAR_ENGINE_LIBRARIES} ) plee-the-bear-20251226/bear-engine/doc/examples/02-display/main.cpp000066400000000000000000000056041512343254000244500ustar00rootroot00000000000000/** * \file * * This example program creates a window and displays a rectangle in the middle * of it. * * In order to make this example minimalistic, it will not use most of the * functionalities of the Bear Engine. Consequently, we will have manage the * exit of the program ourselves. * * The SDL is used for the subsystems of the engine. Thus we can use its event * system to detect when the user wants to quit the program. */ #include "visual/screen.hpp" #include "visual/scene_rectangle.hpp" #include "SDL2/SDL.h" /** * This global variable is observed in the main loop in order to exit the * program as it becomes true. */ bool g_quit(false); /** * This function processes an event of the SDL. If the quit signal has been * sent, then g_quit is set to true. Otherwise the function does nothing. * \param user_data Ignored. * \param event The event to process. */ int event_filter ( void* user_data, SDL_Event* event ) { int result(0); switch ( event->type ) { case SDL_QUIT: g_quit = true; break; default: result = 1; } return result; } /** * Initializes the visual module of the engine and registers the event filter to * the SDL. */ void init() { bear::visual::screen::initialize( bear::visual::screen::screen_gl ); SDL_EventState( SDL_QUIT, SDL_ENABLE ); SDL_SetEventFilter( &event_filter, NULL ); } /** * Creates a window and draws a rectangle in it until the quit signal is * received. */ int main( int argc, char* argv[] ) { init(); // Here we create the window; it will be immediately visible. // The engine does not support multiples windows yet, so be careful and be // sure to create only one of them. // // As soon as the screen is created, a render thread is created bear::visual::screen s( claw::math::coordinate_2d(640, 480) ); // Rendering is done using scene elements, representing something to be drawn // on the screen. The scene_rectangle class represents a rectangle, either // filled or outlined. // // In the coordinate system of the screen, the bottom-left corner is the zero. // The top right corner is equal to the size passed to the constructor. bear::visual::scene_rectangle r ( /* x-origin relatively to which the element is placed in the screen. */ 320, /* y-origin relatively to which the element is placed in the screen. */ 240, /* the color of the rectangle */ bear::visual::color_type( 0, 255, 0, 255 ), /* the coordinates of the rectangle, relatively to the first two arguments. Values are: left, bottom, right, top. */ bear::visual::rectangle_type( -50, -50, 50, 50 ) ); // This simple render loop draws repeatedly the rectangle on the screen, until // the quit signal is received. while( !g_quit ) { s.begin_render(); s.render( r ); s.end_render(); SDL_PumpEvents(); } return 0; } plee-the-bear-20251226/bear-engine/doc/examples/03-sprite/000077500000000000000000000000001512343254000226555ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/doc/examples/03-sprite/CMakeLists.txt000066400000000000000000000031331512343254000254150ustar00rootroot00000000000000cmake_minimum_required(VERSION 2.8) #------------------------------------------------------------------------------- # Find the root directory of the source of the Bear Engine. This directory # contain the bear-engine and bear-factory project directories. if( NOT DEFINED BEAR_ROOT_DIRECTORY OR NOT IS_DIRECTORY "${BEAR_ROOT_DIRECTORY}/bear-engine" ) message( FATAL_ERROR "I can't find the Bear Engine. Please set BEAR_ROOT_DIRECTORY to the path of the engine's root:\n cmake . -DBEAR_ROOT_DIRECTORY=/home/joe/dev/bear\nCurrent path is \"${BEAR_ROOT_DIRECTORY}\" and it doesn't contain a bear-engine directory." ) endif() # The engine comes with some CMake scripts to ease its configuration and usage. # These scripts are in the directory below and must be assigned to # CMAKE_MODULE_PATH in order to be found by the upcoming include() instructions set( CMAKE_MODULE_PATH "${BEAR_ROOT_DIRECTORY}/cmake-helper" ) # This will sets the variables of the source directories, required by the CMake # package below. include( "bear-config" ) #------------------------------------------------------------------------------- # Include Bear Engine's CMake package to find the libraries, the link paths and # the and include paths required by the engine. find_package( bear ) include_directories( ${BEAR_ENGINE_INCLUDE_DIRECTORY} ) #------------------------------------------------------------------------------- # Now we can describe our project. set( TARGET_NAME ex-sprite ) file( GLOB SOURCES *.cpp ) add_executable( ${TARGET_NAME} ${SOURCES} ) target_link_libraries( ${TARGET_NAME} ${BEAR_ENGINE_LIBRARIES} ) plee-the-bear-20251226/bear-engine/doc/examples/03-sprite/hourglass.png000066400000000000000000000150171512343254000253760ustar00rootroot00000000000000‰PNG  IHDR9Aki )bKGDùC» pHYs  šœtIMEÝ 7.v T®tEXtCommentCreated with GIMPWwIDAThÞå›{´¥Euà»ê{sî=羺ûÞ¦º°!m7 ¦ A ‰2š`Bt’8.ÇÄ,åkI_$fåáÒ‘ñ91ŽÉ¨Kd£¸’¨#´ ¤Á~Ýî¾}ßçõ=ªjÏç6i ’Çšúç®SU·¾ý«½wU}õí-w}":«,ܽ#ͯŽÈŒ´ Ä©ÅOY¬ `„àYœCÄYŠ!qj¨dIÄâR‰APKð Æ"¢ Šª¡ôõ‚!'bq¥ÃFe¥c(+OY)E©4UP,>TÀU¼bâçýU¹û¥og'€}Å Ãa#‚1‚1-ÁNAE xCWBU¡àÔàTñ^qz¹’ؘåÅŠ´!aÔÒÏ=E%ôú%Â9ÃÜRElRú}G–%Á<¸ €!E4:øíˆµ”eÀ«ïÀ{%ˆà*E‚ÁE…“^pµ[þޝD±òRiwx'DXk0xld0€Š ( ï@=ˆQ²ØR:‡1† °°ìˆ#è9ƒHDð^p•#Š"æ+âÄRyKî ¯@z^_IcEŒÅ{"8ï0ï eÈ2Á0xJ7°ˆ çÚu ÎCPÄWô"ôKCYB”ò2 ý@šY$@)ˆJ bWøG5âƒ'CšÄfôûÝ^Ÿ$6D±ALD?w¥à/,sëWJŒ€b”ª4 ÈBU0 €B‰‚\E1PBP(< ( êçJY EA¡Zi@@rF€ÎAdÁðA©×,®ô¸ ŒµUÊJ(}ŽÁ0ÜjཧÛ-I!"Ç|;PK"z½’$‹È œ£àQ PVB¥àœ`D)+]ñ?‹¯ÎC¥à¼4(! d÷~²Ó“»‹Rw%âÕP:ð¥*¢‚($‰¡ðk!Š‹HðŠ¥¨¦íKŨAŒE–ÝÅãUÍTõVUÍVªjƘµÇÚs›æçç¯,ËòEÞûKœs;BÏöÞ?Ë97UE Ðét†UµÉ –K/½4ú“?ù“©êƪª.9V/"#‘óôN§s*`^úÒ—N=Fæ)æÇ¾ßÐÐPODÚ@}rrrçŠÌœä}Àï}·ÙlN[ V4íŒ1ËI’تªÒ4M#cL¦ª‰÷ÞŠÈ)"c–£(JOrxx89zôè\’$‘1fÀòòòäW\ñÏdMÓÔxöŠÌ'ù UýÙ$I–Š¢(€¥$I²ãüã‡Î¹™²,}Áöz=±ÖVƉãXT5‹ã؇ú'øÚ×¾Ö9r$ÛºuëÐ=VÉ%— ?ÑÇJQ'ÓÀÏß8QÈeÉ€~’$é›ßüæ´,Ëè8¿<,"ÒjµŠ‚o6›ðUUUÆ¿¸¸¸ Ñh,ä?øÁ$Itá…zàÈJõøË_þò¸Ûíþ3˲l2ÏóË')"¸øU}äºë®›Òã¿[UËn·›WU%eYªªR«ÕðÞ›ÑÑQáé•ôª«®²EQÌ‹HñññáË/¿|uUU?xŒŒQžçeš¦—w®È̉n!þK»ÝþA–e«ßò–·DÙ_¾Ùh4jišæI’ˆ÷>ʲ,íã™ÖS)ªê7nÜ8Ÿ¦éⱺ~ô£ëŒ1:66öÈñ}W¯^=Õjµö¯Z‘•†‘EU}°Õj콟»þúëǶlÙòè2~×]wÝ⦅õÞ HQ’e™8ç’§YÅx³Ù<""à¹Ï}îèÅ_¼ù3ŸùÌ×W| 8räÈáÅÅÅ3Tuˆ,þ¸qåIfvð{ï|ç¯ÌwÞó'~ø«EQI£QgãÆõ¬ZµiÃi§½êN î­^¯¯ÍfMVÌç+' ¹°°ŽŽVÇ~OOϾpjj|·ˆìûð‡_xcU…þöíÏOï»ïoß6>>ÄÖ­/å´Ó.['"Ÿ6ä è~èC¿ý¦¸GwìxŽÜwßß²víÆÆ4›±NM)gœñsôz=jµ5,-í§Ù̘™¹áá&ý¾cddø-N§BÌÑ£3¤iåå6"§Ÿþ,¾öµo°qã©=:Ïèè ³¬_éøáÃÓ/úÞ÷n;err-û÷Õ©©-â\NQ,‘¦£\}õŸ½KD®{2†'…Ìón–¦õ›n¸áŠßJX¿þtÚíDQÎÆkY·n‚$ÙÄ)§lÅ9%Š"D”……/â}9x‹÷µZʾ}3¤i‚1ç`y¹‡11UU’¦5FGÇxøá²~ý¹Üyçn††ÚX3?¿Äڵ率ÚµVã7þôÐÄĦ"R>ƒy²YÖȽw¿{íµÿã¯Cæç÷Ñl®Ç˜Ò´Æ¡C3´ÛqàÀt: ´ÛK8WE£”eÅêÕãt:=z½.ããk0&¢Óé#bH’”ÁÉMÈóЇz‘aœs u©×[,.z¦¦Î%„Š}ûöÐhÔôW~åíû'&6÷TŸä`ó÷·Zk^ùÚ×~ô{")33ÇÂâb‡ååcr&&k»4›-úý>ÎÑnwé÷ûLN®¡Ù<‰,³$I<¸™Ÿ'ŽcŠ¢¤Ù CC-ªªËôô÷Ed„³Ï¾Œ~–üÇ»¨ªRí×þðÈÆç?GD¦Ÿª¯Ë‰­~½á¢è}õÏÿü­ç†°_“i4êlÞ|2Þ· lÞ|N‹µkO¢Ýþ*³³›Ä¹œv» (Öj­gtô4ú YÖ ª3Ï|É×ëõÑ7ý$fù/ùO‹Ó¬dÙø[xàÏßsäÈßamFQ„P¡Q¯¯&„.½^“O¾„-[^ö¶vûÈ4›“úLÈcž‰Akµ ‘kµ)¬ÝÀÂÂ2iZ§ßwÌÍÍÓ릧Q#¬Y³ãË"rã3øŒA>:¸ÑçmÜxËË5”¥26¶‰U«Váœpúé¿À#|óÏx†Ë3 yòÉ¿xO¿_ÇÌa >Ü¥Ýî°¸Ø!8ï¼ß¼ëß5äà€ïÕ{h4†Pµ¬^=ÅÜÜ,EQjÅüK”è™\UG¢(.z½nšç}Ù·o†V+åÌ3O§ßŸ•Ÿ÷ªªF¹·š‘×ÏÌŒ½À9½'„@£Ñ`x¸A§ãPeû¾ðé¯ÇqüÛÏ´&åÒ oæDäfàð'?ùêw8ðýëFFÆõ¼ó®üßçœsåo‰ÔÆ~ðƒ¼bÓ¦MBx·µößþ¢ª¢ª·‹ÈÇÇÇÇý—¾tãeIâ¯k4@!çœsõÛº]ÿ,àð©§žúéûï¿Ñs‹ª^¸2Aÿ6!Uõ"à“À‹>ñ‰O¼ø `gggçî¿WïÀ½dYJšÖøÜç~g³µöˆª¦QÞ²e˯½öÚÿZůÿke¬;EU/RÕ[Þ÷®w½ë‚7¾ñ[—––Î*ŠâGµ›o~ݶ?ýÓ_ÔÛn{ý¶Ç¦œ L¨êUýUý¿:láBUý?ÓÓÓ7]yå•ÛŸóœçl:tèÐyeYN7õ²,/!œúÇ|Ùùÿø¯?¡ÏµZ­ÇÞ뎨ê®À^ø/º…„Ry÷ìììðË^ö²÷\~ùå þð‡7ŽwEäïW>«Å"riasERÅߎŽL 7žpÜ¥¥%·r÷:•¦é¡•»Ô7«êð{ªz%ð6)žQíyï‡Tõö›nºéU;wî<[U_Üét®TÕ©ãú\R–åuÞûß/ËòÚ^¯7v¬íúëÏ}ÏS0ÿÌÍÍýÌãÔ?WUÿZU‡žIó\§ªwlß¾ý’/ùËÏév»/QÕ‰cíwß}wä½užç¯é÷û飯ê÷¼÷šî§>õýÜç~ëÎ']›{¶ª¾Ö9wê〶TõU]÷Sß'CëUõ†3Î8ã»ví²Æ˜™V«õÝã^ !üŽsÎUU5’e™³ÖÞ%"·—ß»¸¸°mh¨!n¸êª¿ºþ‰žÕívëišž¦ªçGQô1ñmﮑý?Èüüe—]ö¦|àk7oÞ¼WDöüÓ»cÿÜ8ŽÕZÛuÎYkmZE?˲w}ñ‹¯ÒÉÉU[™Ý}ðàA&&Fˆ"«ËË9ÿüŸ?ÿ´ÓÞ¸ë L¶^Åkíº8Ž?ù8íMàÓÀ/?}JŸ n¾ùæïlذá¾3Ï<ÓÔjµ8Îÿ~És÷¾ïœ3@ªªÇñ®(Šn¸ýöWh¢è’çCC#TU…sÕõ¿þ럾቞ëœ;ED¶ªj/Š¢¯>Ž\/‘7ÿD‡Uݰ¸¸ø¬k®¹æoÎ>ûìF–e÷×öBçÜŽ²,—ÇqE‘clUU÷ÜqÇkvgY¢U•3>>ÆÚµ“Ôëql‰"óK?þB;Ú !lPÕÓŽ³¬Ñ•sñßëV>J=}ÈÂoßrË-ŸŸžžîE±çXtE»Ý> øï}áœK«ªJʲ´ª_«Õ¹ýö—ïNÓdkU25µ !Š Ýî2¬^½jç­·þ§óŸäù½Â#Þû‹¼÷«Wê–skV&ú¿×>mÈv»=º°°ð³×\sÍ€Žˆt޵Åq|y»ÝöµZMEÄGQ”eY¶EQ7I’{o¿ý?»^O¶ª£ªJ²ÌÐé,dž¥¥Yò¼ƒˆ½ñSŸºzÇÉ`­Ýc­U "rÞŠ†½ˆPUUÃóu`óÊ^zâ>Ùëõ~÷k_ûÚüòòò‡®¸âŠV½^Ÿ]™É¡²,ßÇqT º´4½)Ï|ÍÞ½Ȳefg¿«cc™„`¨×-ƒ×¬!æçHÓ!Ž™!„ÀÒR11Î]ÿú×ñ†'ãÒZ­Öé÷ûÛjµÚ"2«ª=UÝhŒù~á…"òlyÏ Aªj¤ª7?ïyÏ{ëW¾ò•Yý•a³1æEªÁcîÝû­—OOßÿóÝn›õë×03³›z}çºdÙÐ#Ž- ËœtÒóó] ZUU·V«Å­V‹³Î:kι Àð=UÝr¢«ë¹Ÿýìg¿ ø}ûö~|Ã7þê,,ÌnÊó%–—çh·—HÓ„zÝÐëÍ11ÑBD1¦¤VËX^n“$1õzv»Íèh‹¢è366Æøø8Ö¬5ŒOÐëµI¡^ÏäÁïßúÞ÷þò½++ê¼÷þpQ‹££££@røðaœsK¯{Ýë&nºé¦ï‰È¹Or%f4Û³gO¾cÇŽ3ï½÷Þ‰mÛ¶ÜpÃåÛj5¿½ßß/!ä„ÐcxxU!Š"ŽùµZŒ1ãã-:.ƵZA$ŒÐét©Õê¬];E¿ßEÄ04Tã”SÖ‚Òëuh6›ŒOÈÑ£³g½÷½/Ü–ç‹wEQ%Iâ’$y`xx¸øØÇ>6œe™œsÎ9É_üÅ_=Q¼kôÄWýµhÕªUSßüæ7uçΫ¾óï,®^=±ÛûG>LY&McªƹŠññ&EÑÇ{K¯7ðQçÝnZ­NE ³¸xˆùù4 òÜá}LQäyÎêÕˆÎåX »ß÷¾—n{Ã>ÿý•Ø¢UÖZ»iÓ¦‘~¿_lß¾}dnn®þ¤ûäß‚‡ëQ?Š„JYý¤ÿxåÃ÷|ìÿ¶«U›ZuíÔkùBaÖ^Pjzv§½,ëÖO1stŽ,nÑíöHC’DŒŽŽ²´¼HšF¤IÅ¥eÒ$Á%Ž#––;$qF¯—ƒ*yáQ„#G`~a™~?§ÙlÒíö16aq©ÃæIûÞ²,mZ[ÕÜýï1µî”t|¤ÞCÍï?ðíùóá•—í¹÷/oåR.ÀßöŠw³åžO™»Ë•Ȫ2d‘ƃŒœcŽ™³!Ž UYáW"ömdqÎcÄP:%ŽÕá‚ǹA°¾Š¢^^)*%M€ . ^èJ­Q•² ÄQ„óàœ¤fTŠS°&B5à}@$ƽ¾#ŽB&1ƒŒ"Ïù×¼WwEy®çûHˆcC^)¾äS”ê™Á;GP0!€1‚ a>a#ƒ$Õ@ÔŠ2€QG°@’DtÛqbQcqê(1”!`èwÖÒ8¦_ÊÒ#fðe:.Pª#McÒ,ei91h0tûŽ4‰p•G¤iö|èïŠú}È%@SU0ЊC¿€ÁUŠ×€¨`£ÁÌc)«©…ˆ"KYuз³b­!xav¾ ˺½ $ bÉÈ¥ta»UŒŠBé—"–(Jj,&5háèõ*œ:²8¦Ó¯¨‚RKc*_aÄ"ÖÐ-¯šÑrOIbAKOék@Ô+U¥ØÄ" y Ö®t(ðN+÷oÆ ²vBP¢Œ‚÷ˆç…Ø@¿òx§k¨JO’ª* Ç&L-Á{¼Öâ*%‡0Hrq„`ˆ¢ˆ(J ¥c¹SrF"KYUX±D6¢¨*Ô‡d„¼§à±]É®dÍdAð>àüà¯`#ƒ2Èv¤k->(I8–i# ±N /** * This global variable is observed in the main loop in order to exit the * program as it becomes true. */ bool g_quit(false); /** * This function processes an event of the SDL. If the quit signal has been * sent, then g_quit is set to true. Otherwise the function does nothing. * \param user_data Ignored. * \param event The event to process. */ int event_filter ( void* user_data, SDL_Event* event ) { int result(0); switch ( event->type ) { case SDL_QUIT: g_quit = true; break; default: result = 1; } return result; } /** * Initializes the visual module of the engine and registers the event filter to * the SDL. */ void init() { bear::visual::screen::initialize( bear::visual::screen::screen_gl ); SDL_EventState( SDL_QUIT, SDL_ENABLE ); SDL_SetEventFilter( &event_filter, NULL ); } /** * Releases the visual and input modules of the engine. */ void release() { bear::visual::screen::release(); } /** * Creates a sprite given an image file name and a region in this image. * \param file_name The path to the image use for the sprite. * \param clip The part of the image to use for the sprite, relatively to the * top-left corner of the texture. */ bear::visual::sprite load_sprite ( const std::string& file_name, const bear::visual::sprite::clip_rectangle_type& clip ) { // Open the image file. std::ifstream f( file_name.c_str() ); if ( !f ) std::cerr << "Cannot open file \"" << file_name << "\" from current directory.\n"; // the engine uses the graphic module of libclaw to load the images. This // constructor builds a 32 bits color image from files such as PNG, JPEG, TGA, // Bitmap. claw::graphic::image image( f ); // Then we create a texture from the loaded image. bear::visual::image texture( image ); // And we build a sprite from this texture. return bear::visual::sprite ( /* The texture of which the sprite is part of. */ texture, /* The part of the image to use for the sprite. */ clip ); } /** * Creates a window and draws a sprite in it until the quit signal is received. */ void run_example() { // Here we create the window; it will be immediately visible. // The engine does not support multiples windows yet, so be careful and be // sure to create only one of them. // // As soon as the screen is created, a render thread is created bear::visual::screen s( claw::math::coordinate_2d(640, 480) ); const bear::visual::sprite sprite ( load_sprite ( /* The path to the image of which the sprite is a part. */ "hourglass.png", /* The part of the image to use for the sprite, relatively to the top-left corner of the texture. Values are: left, top, width, height. */ bear::visual::sprite::clip_rectangle_type(0, 0, 57, 65) ) ); bear::visual::scene_sprite element ( 320 - sprite.width() / 2, 240 - sprite.height() / 2, sprite ); while ( !g_quit ) { s.begin_render(); s.render( element ); s.end_render(); SDL_PumpEvents(); } } /** * Initializes the engine then runs the example. The engine's modules will be * released before leaving. */ int main( int argc, char* argv[] ) { init(); run_example(); release(); return 0; } plee-the-bear-20251226/bear-engine/doc/examples/04-text/000077500000000000000000000000001512343254000223345ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/doc/examples/04-text/CMakeLists.txt000066400000000000000000000031311512343254000250720ustar00rootroot00000000000000cmake_minimum_required(VERSION 2.8) #------------------------------------------------------------------------------- # Find the root directory of the source of the Bear Engine. This directory # contain the bear-engine and bear-factory project directories. if( NOT DEFINED BEAR_ROOT_DIRECTORY OR NOT IS_DIRECTORY "${BEAR_ROOT_DIRECTORY}/bear-engine" ) message( FATAL_ERROR "I can't find the Bear Engine. Please set BEAR_ROOT_DIRECTORY to the path of the engine's root:\n cmake . -DBEAR_ROOT_DIRECTORY=/home/joe/dev/bear\nCurrent path is \"${BEAR_ROOT_DIRECTORY}\" and it doesn't contain a bear-engine directory." ) endif() # The engine comes with some CMake scripts to ease its configuration and usage. # These scripts are in the directory below and must be assigned to # CMAKE_MODULE_PATH in order to be found by the upcoming include() instructions set( CMAKE_MODULE_PATH "${BEAR_ROOT_DIRECTORY}/cmake-helper" ) # This will sets the variables of the source directories, required by the CMake # package below. include( "bear-config" ) #------------------------------------------------------------------------------- # Include Bear Engine's CMake package to find the libraries, the link paths and # the and include paths required by the engine. find_package( bear ) include_directories( ${BEAR_ENGINE_INCLUDE_DIRECTORY} ) #------------------------------------------------------------------------------- # Now we can describe our project. set( TARGET_NAME ex-text ) file( GLOB SOURCES *.cpp ) add_executable( ${TARGET_NAME} ${SOURCES} ) target_link_libraries( ${TARGET_NAME} ${BEAR_ENGINE_LIBRARIES} ) plee-the-bear-20251226/bear-engine/doc/examples/04-text/FreeSansBold.ttf000066400000000000000000014546001512343254000253740ustar00rootroot000000000000000FFTMY-¤~YdGDEF}@9(⤮GPOSÛP(7(WP´PW(ŸPWP,APèPyA¹ 6(6ÿý,ÿø(f(âPeAâPeAâPeAâPeAâPeAG(¹ 6(¹ 6(í y$(Œ"(d(ØP4A(c#(c#7(2#,ÿø5PÆPW((d(“PñPeA¹ 6(÷ y$f ¹ 6¹ 6(™PG™PG(6ÿŠ,ÿ²6(f((f(ÒPˆÿíÒPˆAâPeAâPeA©(,„RJ#äíP\Acô¹ 6(PG((f((f((f((f(ƒ % 6¯(¯mA.= |(|(G(G(B;P1&4:"<q(i(C(, Ž eA[@\A,A,ÙAèA~AA~AttAqAf(~(P(Ê(…‚–‚A‚AÙAÙ#JAEKaMK9)H ;ƒØ({A  %  'O2#Q#<(<(<(JAf(3AN,h(eA(L!Æ<|(<(<(ì((]('G8gñAœA æ“ § yyÊ' + ‹0l ú(Æ(úDúDúDMtMcM M M M MMMM MMúúdMMNúMMMMM^MWMMMMM#MpMMM-Mÿ÷MÿÔMþZt Ò8kuNÿø99M Mô8MMM M MLú"M2È È È È MMMÿìþÁÿ)þ¸þ­þÆý¾þÖÿ&þÃþäÿþ‡þ¼ÿ.þéþ‡þÖþÖÿÿ>ÿ;þúþûþßþßÿ3ÿhþÄþÕþÕþÚþäÿ7ÿÿ#þÀþóÿþÎþàÿ5þÏþÀþ¼þ±þÖþÓþªþÃþHþ<þ0þYýÚýCýCÿ5þÏþ½þ þ³ÿý¸þÄÿ)þ­ÿ>þ¶ÿ5þÏþ¾þ½þãþ†þ™þƒþþþªÿþ²þ›þ]þmýðÿ.þºþ[ýîþšþ¤þ¨þ­þ­þ˜þ¤þÅþ¨þ–þåþ•þ®þ¸þ©þ¸þlþàþÐþ”þ{8{:M‚M2k]M¹ Mq"n® ¾]Uÿé¹ ¡1zPè P`íP(6PØPÉ ŽPP¬2(PÌP¤’ù( @F(6 x(;(Vd<`<x(X<= n(;((V S(U<7<M e<6 (f(’z<Q(–(-`<(wØ2(U`<f(`<(a'æ•èÊ((‚‚f((f(PP8dPÑ(©(6P6<6\P8ØPñP½ îP¹ ÀPÀPdP„#P4 ©(ñPñPØPÇfPíP(íP¥PÑ(„½ (‹ )PÂF#PsPOÐP¥PÑ(GP½ 6(S(3A¬A§G(;(qAqA/A=¤AeAf(eAmA.(¸% Ì( ŽA=2€AÊA¿AAA8(YAE G(G(w¬A8(+!F,ÿý}‹Au/AqA% fAÚà @FöA(^$®à Úà ÁþzþÖÿÿ!ý´ýüÿ@R£<ªc¥Pd<|R¸<nÁ‡R><H #«*+ ÷R=<ÚR*<á + |¨9R<çRû<QQ<Ã,þ$Ò,.$f¶ ƒ =ƒ [ž$¸â Dg0º<L<¯FLFá*ù á*ù :R4 ¹P<$zñR[<3R—<ÂDL<§RÐ<:R¹ÿÿ6(¹ÿÿ6(ì‚$PG(Ò,GÒ,G4 ©(;(7((#ñPqAñPqA(f((^$(^$Ñ(8(¼ ½¼ÂF=2cR°<ÐPA  "Ù$A(m0¿ ÚR*<ÚFÉFý-ðAÄF!<ðFÉFWF®-×F¤FFI*ÄA”š#ë<º#õFv#ë‹-çA‘-Ø2AðAçA-³$ÉF€(©F2# %#ò#McÞúMÿýM` ji<eAz|AQ<#¡FeA’AÇ#aF>FDFž#eA_Fc#rAkjADeAOAˆi7A#[AXArA·AeAd(\F·AhA^#û#rAú2ŽðA+ˆe~+êÚÆÐÚ?Á)OŠeM2Ê=‹M-/~?ªO)O»?ªOžLIN>SL›>«PÀC)O­IžL<•H”OhŸ= PX?HLô>*O&IIî2Ú2þÊþÊÿA1Bá á  øÿöøÿönÿöLÿöÁÿö©ÿöÙÿöÙÿöÙÿöÙÿö    ÿö4ÿö2ÿövÿöÿö”ÿö¬ÿöçÿöÜÿöÐÿö`ÿö;ÿö‹ÿöBÿöˆÿö\ÿö¼)ÿöy)`ÿö`ÿöÿöÿöÿöj.ÿöTÿöÛÿöÛÿö¸ÿö½ÿö½ÿöÿö®ÿöÿöÃÿöÿöÿ} ÿöþvâ ÿö ÿö ÿ þHþºþÆþÆþÊþ1þuþX ÿÁ ÿ) ÿw ÿ`ÿG½ þäoÿ}ýÖþÿ"þÊþ:þ:ÿö4ÿö2ÿöçÿö‹ÿöBÿöÿöTÿö¬ÿöšÿöþLþK¢_¢Ú?F?]?;?F?:?R?R??n?mmQƒwá á  xá á çÿöTÿö`ÿöçÿögO‹ÿöÿöþÅÿ®9(ÿ÷…ÿ÷¢ÿÊÆÿøúÿ÷úÿ÷Ùÿøˆÿ÷ÿ÷‡ÿ÷Öÿö ÿ÷åÿöÿò¾ÿðÓÿòµÿö°ÿô¡ÿ÷«ÿø®ÿôÇÿò¨ÿûµÿõÙÿ÷³ÿø¶ÿø»ÿöšÿóÿö«ÿ÷²ÿø”ÿú“ÿú´ÿ÷ÿó¡ÿøÛÿù.ÿΗÿ÷Àÿò¾ÿ÷Šÿôÿ83ÿì0ÿô2ÿýßýßý¸ýŒýâýšþ‡þ‡¬ÿò-ÿÂËÿù·ÿøÅÿç¹!v¸²†| ;ª Î Ú þÎþÇÒÿøøÿ÷Vþàh<…<˜<G<s<v<;< P<v<·<^<`PCPv<b$<gP7<ëf<s<H<s<™2bPPV<™P˜<`Pvu<Ï4ÂËÜoÇîÜ~ôôÈí÷È÷ÆžÃ˳Ñìàôì ô°þãÂßöõ4?ÁNÊ<Û<pŒ '<Ž._+\<$Êÿð •<žg#+ÿí<y<ÓÄ{_9ñ(?<6-Ñ ¾(Æ<hB'd%þ'Yÿðs<‰-_*g'¨(˜ 5˜Á-·92   <›3,§<?:‡ÿþŒ) ƒÿôž”ÿþˆ)¦*e:g<ß)„‡<ø'= 8<ô<qÕ)ö''ž*®ÿ÷+˜åzÿîr9Î'»<¹ 6(ÀPmAÀPmAÀPmAÑ(.(ÔPm(ÔPm(ÔPm(ÔPm(ÔPm(™PG(™PG(™PG(™PG(PG(xPW(d(íP\AíP\AíP\Að3\AíP\A6ÿêÿÛ6,ÿüØP4AØP4AØP4AkPAkPÿôkPÿökPÿçfP~AfP~AfP~AñPeAñPeAñPeAñPeA(f((f((f((f(¥PmA¥PmAÒPˆAÒPˆAÒPˆAÒPˆ.©(,©(,©(,©(,©(,„R„R„R„RâPeAâPeAâPeAâPeAâPeA— — ¿ ¿ ¿ ¿ ¿ £%£%ƒ % `û`û`û\AR % +(MåP¹ 6(¹ 6(¹ 6(¹ 6¹ 6(¹ 6(¹ 6(¹ 6(¹ 6(¹ 6(¹ 6(¹ 6(™PG(™PG(™PG(™PG(™#G™PG(™PG(™PG(6PF6PF(f((f((f((f(f((f((f((’((’((’((’((’(âPeAâPeAPšAPšAPšAPšAPšAƒ % ƒ % ƒ % ƒ % x(x(x(x(x(x(x(x(¹ ¹ aQ'Úÿßîÿø;(;(;(;(;(;(öø½¯«±V V V V V V V V KN¥ÿͰÿçU;U<‰‹Ž&ˆ'†”%§§YYUOf(f(f(f(f(f(`a"û`<`<`<`<`<`<`<`<€L[((((((((lo//éÝx(x(;(;(V V UU<b(b(`<`<((x(x(x(x(x(x(x(x( Š /âì˜ÿÖžÿäV V V V V V V V î÷´·®¹HÿÍ[ÿç((((((((2,íìÄÕ¬¨‚(‚(‚(‚(‚(‚(‚(¹ ¹ ¹ÿê¹ ‹ TZ:TbMÿöV V VV V tqŒPìTéTŠihul{ˆ66ǽáQMQMÿö`<`<`<`<z<z<`<`<ùù´Ì6MMMR(((((‘i”~Ü(MuQôèôèMú§,§dMM,ÿ÷,ÿ÷èÿùèÿùµd,ÿêúDúD<úDÂ>Â8Â8ÂB,,23ô¡ô$î$@§è W ú(ª(f(ú(ª(f(ÂMSMPn=špf,’"’"¶ÿ÷Hÿù2§ÿSN`NÆ@°@°p,X$X$…Mq’"…zA8’" %W(Ò%Õ%à%Ò%\9à%à%_È6_____ ____ØÚ‡*_-(_______ _^^^ØØknŠh ccO y<×.ñPPD€$]OdW ýËýËÿ,ÿý’ý™þýZý0ý+ý*ý(ý_ý=þOþþ-ü9ý©ýëýèý¡ý™þб(È$ Õ ê$›(Ñ(—\Aš`qçDpíè.(¬((Z ØP¹ G(d„=-/~?g(—C1k(c ƒ  âe(ee(eeee(ee(eeee(6P8PbP…P—w«ÁP£Ÿ«kPÑ(ÔPfPF,FBF F  ( > F%(A.(m(~AÄ'Ä@Ä*Ä@Ä'Ä@ĞċĊĞÄ'Ä'Ä'ÄBÄ'ÄBÄ'Ä'Ä'ÄÄ'Ä ÄÄ'ÄŒÄ'Ä'ÄŒÄ'ÄŒ¹ Ìl, ›;›7\1ÙÙH7H7I-H7H7IPôZ7i7i&)H2H3H2þÄ(ôô?ôdR%%ÉÉ> ÜF|F``((<(<J<… ‡ú2l2H2 2H2ôôô$H5H2H2ôH2ôH2H2H2H2ó@ó2H2H2H2H2f#H2H2H2H2G2H2H2H2(2H-H(H7H7H7H6H2H2 H`Hèèü=ü=*Hú;èjèjèiÈbÈJÈbÈJH'’;’;ggô \\2ü › r¶Sr¶SM&,7 7 7,`,‚,V­ü ü ü `$h8h8ÐHÐHÐH˜0ð0ð0ÐHÐHT6ºHæH>HæHh8h88HÐH¸<ÐHH4æH6e: 0x<D6 4ÐH,ZD6,8Î?„6h8h8¸<4<€8h8h8ú8¨6ÐHú8ÐHÅ0ÐH<6ÆH<6âHH(M(cM ôôôøø”oo”c@M V2<<´(_?ZPPsÛAÊAÑAÖA¨AI1IVÄ=x?¤OML•>¥PR?î>H2HLHLHLHLÊ=Ê=Ê=‹M-/~?ªO\»žLb)N>SL›>ÀC­IžL•H”OŸ= PX?HLô>)OOM&L8OÊS .„þmþGþ-ÿùþ&þ!þ"þ&þsþþhþ-þWþˆþhþ-Þ´ÿñ2ÿìçèÿ÷$ÿ÷ÙÿöÿòÅÿðÕÿò¸ÿö£ÿ÷²ÿø¯ÿôÊÿò½ÿõÕÿ÷µÿø¸ÿø¿ÿöœÿó¢ÿöªÿ÷“ÿú•ÿúÂÿ÷ÿó£ÿø™ÿ÷ÊÿòŒÿô„ÿ÷ˆÿ÷¡ÿÑ×ÿøýÿ÷ôÿ÷Ñÿø‡ÿ÷ ÿ÷‡ÿ÷yÿ÷þGþGþhþ-þGþmþÑþðýöÒD(.(2(è(Ð(6"(Ý(±0(¹(‡(0(Z'(Z" (Æ %(  þ   (çZ;(P ×  [";(Ý(Q*úúMMôô («Aî8(¤5(7(.:(7(/G(8(,‰ÇÿöÉÿö€ÿöÜ Ÿ—ÿöÿö ÿöEÿöNÿö‹ÿöªÿöûÿöñÿöæÿö‘ÿövÿöÐ(Éÿö(„ÿö6ÿö¤)GÿökÿöÍÿö>ÿö>ÿö@ÿöÅÿö4ÿö ÿö0ÿö®ÿöÿöÈ)âÿöæÿö§ÿö÷Ûÿþ xnþuþQéÛÿö”ÿö—ÿö ÿö²ÿöðÿöÿöâÿöâÿöÊÿöšÿöÕÿö°ÿöÿörÿö£ÿö¬ÿöÿöRÿöRÿö-ÿö’ÿö}ÿö}ÿö$ÿöÿöHÿö8ÿöÿÿTþuþ=<ÿö<ÿö+ÿöwÿökÿöwÿömÿö:ÿö ÿöúÿöƒÿöÿöÆÿö-ÿö¨ÿöÿö4ÿöqÿöÿöàÿö•ÿö¶)ÿöt)ÿöãÿö]ÿöÿö¡ÿöôÿö×ÿöâÿöLÿöýÆþ ‹ÿöBÿö ÿöEÿöNÿöûÿöúÿöæú¡ú}ÿöÜ D(FF~»õ37ouz~ŠŒ¡Î×ñõasùV_‡Š¹Äêô w    ( 0 3 6 9 < B H M Q \ ^ uÀõùüô›žùEMWY[]}´ÄÓÛïôþ d q Ž ” ¦ ¨ ¬ ° µ ¹ Ó × á ð!!! !!!!!!"!'!+!.!2!8!;!D!K!N!!›!¨!Ê" "#"%"-"<"@"C"E"H"K"U"Z"a"g"k"s"‡""½"Ã"Å"ñ# ####*$#%Ì%æ%ï&,&g&o'@*-e-o.....§Œ§ªûûû6û<û>ûAûDûOÿýÿÿ  ¾÷$7Ptz~„ŒŽ£Ñðôp|‚1Ya‰°»Ðð y     * 2 5 8 < > G K Q Y ^ f Ðùû ž  HPY[]_€¶ÆÖÝòö p t £ ¨ ª ° µ ¸ Ð Ö Û å!!!!!!!!! !&!)!.!2!5!:!A!K!M!S!!ž!Ä""#"%"'"4"@"B"E"H"J"P"W"]"d"j"r"‚"•"»"À"Å"î###"#)$#%Ê%æ%ï&,&`&i'@*-0-o....(§ˆ§ªûûûû8û>û@ûCûFÿùÿÿÿãÿÂÿÀÿ¿ÿ»ÿ¸ÿ ÿœÿ˜ÿ•ÿÿÿŽÿÿ‹ÿsÿqÿgÿYÿQÿOÿ9ÿ3ÿ"ÿ ÿÿÿþúþùþîþéûÞûÝû\û[ûWûUûTûSûRûQûOûNûJûHûEû>û=û6õ ôýôúôùòVèKèIèHèBè@è>è<è:è9è8è7è6è4è3è2è0è/è-è,è+è èèèèè è èèçîçìçéçæç×çÖçÕçÑçÏçÎçÍçÉçÆçÃçÂçÀç½ç»çºçµç¯ç®çªçšç˜ç}çHçFçEçDç>ç;ç:ç9ç7ç6ç2ç1ç/ç-ç+ç%çç æíæëæêæÂæ¬æ¨æ—æ’åšãôãÛãÓã—ãdãcâ“ßÔÜ§ÜžÛøÛ÷ÛõÛíb”bw"   b   !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`a†‡‰‹“˜ž£¢¤¦¥§©«ª¬­¯®°±³µ´¶¸·¼»½¾KrdeiMx¡pkèvj ˆš fs ‘ ’gw J Y WM ol|6¨ºcn bT  Nm}Qb‚…—>?GHCD¹ ¾Á:o¹de # $LyEI[„ŒƒŠ‘Ž•–”œ›óf|qxyzz}{g°,°K°*PX°JvY°#?°+X=YK°*PX}Y Ô°.-°, Ú° +-°,KRXE#Y!-°,i °@PX!°@Y-°,°+X!#!zXÝÍYKRXXýíY#!°+X°FvYXÝÍYYY-°, \Z-°,±"ˆPX° ˆ\\°Y-°,±$ˆPX°@ˆ\\°Y-°, 9/-° , }°+XÄÍY °%I# °&J°PXŠeŠa °PX8!!YŠŠa °RX8!!YY-° ,°+X!!Y-° , Ò° +-° , /°+\X G#Faj X db8!!Y!Y-° , 9/ Š GŠFa#Š Š#J°PX#°RX°@8!Y#°PX°@e8!YY-°,°+X=Ö!! ÖŠKRX Š#I °UX8!!Y!!YY-°,# Ö /°+\X# XKS!°YXа&I#Š# ŠIŠ#a8!!!!Y!!!!!Y-°, Ú°+-°, Ò°+-°, /°+\X G#FajŠ G#F#aj` X db8!!Y!!Y-°, РЇ °%Jd#а PX<ÀY-°,³@@BBK¸cK¸c Š ŠUX Š ŠRX#b °#Bb °#BY °@RX² CcB² CcB° c°e!Y!!Y-°,°Cc#°Cc#-¸ÿ…°K°PX±ŽY±F+X!°YK°RX!°€Y°+\X° E°+D° E²L+°+D° Eº ÿ+°+D° E² 4+°+D° E² +°+D° E² +°+D° Eºv+°+D° Eº;+°+D° E°+D° E² ?+±Fv+D° Eº ÿ+±Fv+DY°+ÿ3ÆÙ}jrvv——h@lƒf7\xBJ9‹t‘dQFpa LN0000”ôœÈø0tÀ |ô X ” Ü @ è P  , ¸ „èôLÈDx\äD À8°ül¨(ŒØ˜˜àÔ ð!P!Ì""¼##t#Ð$,$”$ø% %X%œ&'@'Ô(„)<)Ô*Ä+L+¤,,€,¼-„..˜/D/ð0T1p222Ô3€3Ü4X4´5x5´6|7,7<7P7ü9p:h;;`<Ü<ô>8?Ø@ @T@dAìB0BÈBäCœD¨DìE¤F,FlFôGhH$H\I|JÄLˆLœL´LÌLäLüMM,MÔO O$O<OTOlO„OœO´OÌP P¸PÐPèQQQ0QdRLRdR|R”R¬RÄSPT8TPThT€T˜T°TÈVW¸WÐWèXXX0XHX`XxYhY€Y˜Y°YÈYàYøZ\[@[X[p[ˆ[ [¸\h\€\˜\°\È\à]˜^ì___4_L_d_|_”_¬_Ä_Ü_ì`à`øaa(a@aXapb8cDc\ctcŒc¤c¼cÔcìddd8dPdhe,eôf f$f@f\ftfŒgg¸gÐh h¬hÄhÜhôi i$i4iLidi|i”i¬iÄiÜiôjpjØjðkk k8kPkhk€lTlümm,mDm\mtmŒno¼oÔoìppp4pLpdp|p”p¬r0sÌsäsütÌuàuøvv wdw|w”w¬wÄwÜwôx x$x<xTy0z z8zPzhz€z˜z°zÈzàzø{{({ |Œ}œ}¬~p¼Ѐ°t„‚@‚䃨ƒ¼„8„ì…ü†Œ‡@ˆ\‰‰ØŠTŠÌ‹„Œ Œ„<ŽŽ˜Ш‘|’p“X””蕼–à˜˜$˜ø™Àšd› › œDœì žDžØŸXŸØ ˜¡X¢$£D¤¤$¤Ô¤ä¤ü¥¤¥´¥Ì¥ä¥ü¦¦,¦D¦\¦t¦Œ¦¤¦¼¦Ô¦ì§§§4§L§l§„§¤§¼§Ü§ô¨¨,¨@¨`¨x¨˜¨°¨È¨à©è««0«H«`«x¬T­,­D­\­t­Œ­¤­¼­Ô­ì®®®È®à®ø¯¯<¯T¯l¯„¯œ¯´¯Ì¯ä¯ü°°,°D°\°t°Œ°¤°¼°Ô°ì±± ±8±P±l±„±œ±´±Ð±è²²²0²H³(´(´@´X´ôµ˜µ°µÈ¶Ä·Ø·ø¸¸0¸H¸`¸x¸˜¸°¸È¸à¹<¹Pº$º8» » ¼ ¼à½´¾l¾€¿œ¿¬¿¼Á˜ìÄÀÅhÆ4Ç`ÇäÈÉdÉðÊLÊÀË”ÌDÌ Í|ÍÎ\ÏLÐиÑ(Ñ8Ò0Ó8Ô Ô Ô„Õ ÕlÕôÖlÖä׌נØðÙpÚ(Ú¤ÛÛ¤ÜDÝÝøÞ¤Þ¸ÞÌÞàß8ßÔàÄá|âÀã|ä8äLäàäøååðæ¼æÌç¸çÌèèèéäêàëØíî”ðñò|óœôÔõPõlõøö°÷ˆ÷œ÷°÷Ä÷Ø÷ìøøø(ø<øLødøxøäùHùÀùÔúdúôûû¤üüü`ü°üðýýý ý`ýtýˆýœý¸ýðþþþ|þÿ ÿ@ÿ¸  Ô ˜°ÄØìdÈ,Œà4”¨ÀÐäø  4Hd€”¤øXl€à4 ´ÈÜð  @ T h |  0 D X l „ Ì è ü  $ 8 L ` t Ô è 8 œ °  t ð,€Ôèütˆœ° ÀÔèü$8l„˜¬ÀÜø  |$<¤¸ÌÜð(<TlÀxœ¸Ð44H\xŒ ´`tˆìà0ÄØ  Ôè<PdxŒ ´ÈÜð,@„À@Pdäü@Xpˆ ¸ÐèøX¤´ÄÔ ” ¤ ´ ü!ˆ""`"p"Ä#\#Ä$$$„%t%ä&'P'h'€'˜'°'È'à'ø(Ä)Ä*8+,--À.ˆ.ì/L/ü0¸12,2<2à3˜4h585À6<77Ä8X9P9h9€9˜9°9È:È;|;”;¬;¼<¸=|>4?$?4?È?à?ø@Ð@èAÀAÐAàAøBBÐCŒD(D@DXDpDäDôEœE¬EøF F°G8H<H¬HÄI(I°IÀIÐIàJ8JHJXJhJ°K¼KÌLHL¸M$M¼NTNøOxP`Q8QàQðRÔS¨SôT T°U(V V|V”VðWtWðXXXhX¼XÌXÜY<YLZ\ZlZè[\[È\X\ô]œ^$^à_°`T`l`„axabHbXbhb€bcdddàdøee(e fPg gg,gähxh˜h¸hÐhèjØkLk\kxk”külDnôoàpÐqrLssÜt8t”uu v@ww´xTyz¼{H{Ð|\|ä}Œ~,~¨´€H€ÌHô‚ăЄ̅Ƥ‡‡”‡ðˆ@ˆØ‰d‰ÜŠTŠø‹œŒ Œ¤PŽŽpŽÜä‘’<“˜“Ô“ì””¸•\––°—@—Ș`˜ô™t™øšÔ›d›t›Œ›¤›¼›Ôœ|žDž\žtŸŸ(Ÿ@ŸXŸpŸˆŸ Ÿ¸ŸÈŸØŸð    8 H X h x  ¨ À Ø ð¡¡ ¡8¡P¡h¡€¡˜¡ü¢d¢|¢”£¤¤˜¥H¥ì¥ü¦ ¦¦,¦¤§§¸¨P©©¤ª@«p«Ð¬\­P­ð®®Ü¯ˆ°€±±t²”³(³œ´,µ<µÐ¶ð·x¸d¸üº0ºÈ»P¼½|½ü¿8¿”À|ÁPÁôÃÃÃlèÄ(Ä8ÅÅXÆ$ÆÈÇœÈHÈèɬÊ4ÊÈËÌÌ|Í ÍXÎ ÎøÏ„ÐÑÑ ÒÒôÓ\ÓüÔàÕhÖ8× ×ìØœÙ8ÙÐÚœÛÜÜlÝDÞÞÄßÔàpà€àÔá°áÈáôâ â(âlâ„â âÜã<ã„ã¤ãèä$äTähä˜äääøåå卿¨çpçÌèdè˜èôélêêXê°ë,ëÈì<ìàííˆî îÄïdððhðÌñLñ˜òLòÐóóhóÀôôdôxôôÌôèõöd÷ôù@úôûìýLþˆ $< $<Tl„¸¼Äè ` < ´ ¬ ph„¬d0d|È`x$< 4üÜd|\œ´Œ ˜!X"8#t#°#È$$À% %ø&Ð'd'x())|* *X**¨*À*Ø*ð+0+€+˜-¤-ä..˜/ /´00(0@0X0p0ˆ0 0¸0Ð0è2œ4 5ä7|7¸7Ð8`99¸:¨;¼< =°>”? ?à@„@À@Ø@ðAA A8APAxB4BäCìD|D”EFHF”G´HèJ@KÄMLMdM|M”M¬NìOOøPÜQ´RüT UV8WX4YXZ[\$]h^L_<`$a,aôbðcÀd¼e fägÀh°iljtkÄlÌmønèo´pphq qØrrŒräs„ttÄuuHvxwœx°yÜ{L{è|Ü}Ì,€|8‚؃¬„l…̆l†à‡Ì‰ ‹ÈŒ0Œôä ì’“T”L”ð•З(˜™™è›œ(<àŸh ¼¢$£ ¤4¥¦0§8¨`©ª«L«è­¬¯¯Ä°Ä±à³$³ìµ¶L·8·À¸¬º8»0¼(½¾¿TÀˆÁ\ÂàÄ8Å ÆxÇ´ȘÉÄʨËÀÌpÍœÎÌÏxÑLÒ¤ÔLÕ(Õø×h،ؠشØÈÙ@Ú(ÚˆÛäÜÐÝ(Þ@ß$ߨà\à¼á<á´â¨ã\ååpåÀæôç è”é(ê<êüë¼í íÔîDï ï¼ðtñ4òó˜ôôdõ8ö8ö¬÷Äùúû<üxýþ þ´ÿ4p” Ô@¼Øè d ø D ø ø , °¤0ôXð´œøôÀt¬Ô¼dl4Ld|”¬ÄÜô $<Tl„œ´´ ä ü!!4!L!l!„!œ!´!Ì!ä!ü"","D"\"t"Œ"¤"¼"Ô"ì##è$$$0$H$`$€$ $¸$Ð$è%%%0%H%`%x%%¨%À%Ø%ð&& &8&P&h&€&˜&°&È&à&ø''('@'`'€' 'À'à(( (@(X(p(ˆ( (¸(Ð(è)))0)H)`)x))¨)À)à)ø**(*@*X*p*ˆ* *¸*Ð*è+++0+H+`+x++¨+È+è,,(,@,X,p,ˆ, ,¸,Ð,è---0-H-`-x--¨-À-Ø-ð.. .8.P.h.€.˜.°.È.à.ø//(0 080P0h0€0 0¸0Ø0ð11(1H1h1€1˜1¸1Ð1ð22(2H2h2ˆ2 2¸2Ð2è33303H3`3x33¨3È3à44 484P4h4€4˜4°4È4à4ø55(5@5X5p55¨5È5è66606H6`6x66¨6À6Ø6ð77 787P7h7€7˜7°7È7à7ø88(8@8X8p8ˆ8 8¸8Ð8è99909H9`9x99¨9À9Ø9ð:: :8:P:h:€:˜:°:È:à:ø;;(;@;X;p;ˆ; ;¸;Ð;è<<<0>(>@>X>p>ˆ> >¸>Ð>è???0?H?`?x??¨?À?Ø?ð@@ @8@P@h@€@˜@°@È@à@øAA(A@AXApAˆA A¸AÐAèBBB0BHB`BxBB¨BÀBØBðCC C8CPChC€C˜C°CÈCàCøDD(D@DXDpDˆD D¸DÐDèEEE0EHE`ExEE¨EÀEØEðFF F8FPFhF€F˜F°FÈFàFøGG(G@GXGpGˆG G¸GÐGèHHH0HHH`HxHH¨HÀHØHðII I8IPIhIxJJ`JpJˆJ J¸JÐJèKKK0KHK`KxKK¨KÀKØKðLL L8LPLhL€L˜L°LÈLàLøMM(M@MXMpMˆM M¸MÐMèNNN0N°NÀNüOO,ODO\OtOŒO¤O¼OÔOìP0PŒPŒPŒPŒPŒPŒPŒPŒPŒPŒPŒPŒPŒPŒPŒPŒPŒPÈPØPèQQPQ`QxQQ¤Q´QÈR,RDRXRlR„RüS˜SðTDTTTlTŒTœTœTœTœTœTœTœTœTœVTX|X¼XÔXôY4YLYlYŒYÌZ [t[Œ\„\¸]]p]˜]¼^^4^ä__¨_À_Ø`8`¼`Ða`ataôbb(bLbøcTd¤dÄdìeeHedeŒe¼eàffffffff¨f¼gPhTi4iœj¨j¼k8k|k”k¨k¼kÐkäkøl l l4lHl\lpl„l˜l¬lÀlÔlìmmm(m<mPmdno p¨q¤q¼r„sœtœu¨v´w4wèx(xhx xÜy4yHyly˜y¬z z@{{|{œ{œ{ð||t|¼|ì}}},}D}¼€Ô„8„P…Ô‡¼‡Ìˆ ˆ¸ˆÈŠ,‹Œ$ŒLŒhŽè‘$‘4‘H‘\‘l‘|‘Œ‘ ‘°‘À‘Бà‘ü’$’8’L’˜’¬’À”¸”Ì”ì• •,•L•l•Œ•¬•Ì•ì– –,–L–d–t–Œ–¬–Ä–Ô–ì— —4—L—\—t—”—¤—´—Ä—Ô—ä—ü˜˜4˜D˜\˜|˜¤˜¼˜Ì˜ä™™™$™4™D™™¬™À™Üš<šXštšš¬šÈ›0›˜›ðœ œ œ<œ˜œ¬0L`|žž ž<žXžtžž¤ž¸žÌŸx \ Ð¡ ¢¢Ü¢ð£Œ¤|¤ì¥¥ø¦ ¦D¦ ¦´§§P§d§|§§Ä¨ ¨¼¨Ì©L©h©„ªd«X«°«ì¬(¬@¬T¬ˆ­­­ ­¸­Ø­ü®®,®D®\®|®¬®Ì®Ü®ø¯ ¯$¯<¯T¯l¯Œ¯¤¯Ä¯ä°°(°H°`°|°˜°´°ä±±±”±´±Ð±ì²²$²<²P²l²ˆ³³³°´D´\´t´´¬´È´èµµµ4µPµhµ„µœµ´µì¶¶¶¶ä··(·L·p·À¸¸(¸<¸ˆ¸Ì¸à¸ô¹<¹¬ºº ½¾$¾ØÁ|Â,ÃÃpÄ`żÆ4ÆlÈdÈàɘÊxËlÌ4Ì´Íl×È×àØìÙÜÚtÛÛ¸ÜÜ€ÜèÝŒÝÔÞÞ”ßà$àÐá8áÜâDâðãØäœäèåd娿çç çôèTééôêdêÀëë¨ì,ììíìî|ï@ï¼ð\ñtòPóôdôÜõ4öÌ÷ˆ÷Øø4øtù ùèû\ûÈûèüHü\ütüŒü¤ü¼üÔüìýý4ýPý€þhþ|þŒþ þØÿ$ÿäÈŒ<LH`Ìd ¬  $ Œ ¤ < Ø 4 Èlˆø¸4LlŒ¤¼Ôì4Ld|”¬ÄÜô $<Tl„œ´Ìäü,˜˜˜˜Àtð¼DÄhH$¬ø@à4ì¸ "$"Ì$Ä&è(°(È(à(ø))()@)X)p)ˆ) )¸)Ð)è***0*H*`*x**¨*À*Ø*è++,°.ˆ0h0ˆ0¨0È0è11 2À3¸4Ø5d66ü7x7¼8$8X99 :d:t:è;h;Ô<¸=$=`=Ü><>Œ?L?À?Ð@XABBBtBðCCC CxD$D¼DÌE¬F G\GàH@IIÈIàJØKKXK¤KðLL L8LPLhLøMMM(M8MHMXMhMxMˆM˜M°O8P\Q Q¸S(T UtVtW´XÈYôZ„[|\0\ø^\_L_ä`ta`bLctcÔd|elffØg„hŒi¨jHk k ldm`nn”oäpÜqtqÜrès˜t¬uuTv\vtvŒwlxLxðy¨z8{°}ŒØ¬ƒ8„¬†‡ÄˆØЍŒ ÄŽà‘t’˜“ü•Œ—˜¸š¸œŸ4 P h ì¡¡<£¤h¥”¦ð¨Œ©ð«¬P¬Ø­¸®¬°8±(²$³T´Ä¶\· ¸´¹Èº¸¼,½@¾À¿˜ÀÌÁÐÂàÄ ÅÇÈdÉhɄɠɸÉÐÉèÊÊÊ0ÊHÊ\ÊpË|˸#ÿuý #'+ª²++´% +°$/´( +°"/´# #+°/± é² +³@ +°,/°$Ö´( +°(±+±é°±"+±! é³!"+´+°!±+± é° ±)+´' +±-+±±99°!°9°° 9° ° 9±#± 9901>32#54>54&#"#5!%!!š!1D;!n‹2F-|#22#<-/?¹–þÞÚýy4ý̹Ab7" €f?R1 &12K.(4!1BL: þ±’’õ«üUFpÖ 6²+´ #+²+° /°Ö°2± é°2± é± +± °901#5#5*C)––ÖÒþË5Òý¼’’2Ö¨Ù 0²+°3´ +°2° /°Ö±é°± +±é± +01#'5!#'5¼*8(v*8(Ù‚‚‚‚ÿà)¹I°/³$3±é³$2² +³@ +²222°/³$3±é³ $2² +³@ +² 222° /±!+°6º>Îó¯+ °.° .°±ù° ± ùº>Ðóº+ °.°.°±ù°±ù°³ +³ +³ +³  +°³ +°³ +°³+³+³+³+°³+°³ +³ +°³+³+°³ +@ ........................°@01#7#537#53733733#3##7#737#’j(Macw"i"g"i"Zmdw(i(ggg Ìc™c®®®®c™cÌÌc™ÿ‚û!&+ª²+°3±é°(2² +³@! +² +±#é°2² # +³@  +²+°,/° Ö´%+°%° Ö±é°/±é°%±!+² "222´  +²'222° ±*+°2±é±é±-+±%°9±#µ "'$9° °901.=35&546753#54&'#5654ójsƒUÌkaD_n€)%tdqgDQ•T v[ jÕ/¦Th 66p^,7É bR`m i)µL?«ÄLIÿì_Å $-¢²+²+±*é²+° Ö± é´& +±&é´ +±é°./° Ö´ +°±+´ +°±"+´( +°(±,+´ +±/+±³$9±,(³$9±&*±"99± ² 999012#"&46"2654%3#2#"&546"2654ÎMkmKLlloF22F2;LþuMÕMkmKLlloF22F2½kMIkk–kc1"#11"#œý'tkNIkkLKkc1F11"#7ÿé¶Ó!*5—²+² +±( é²+±0é°6/°Ö±%é³%+±3é°%±-+´+°±!+´+±7+±%°9°3²999°-²" (999°´*$9±!±99±(°9°0µ"+$9013#'#"&5467&/&546265327654&#"q${¡.4&'3zdO=5#2– ?1, L’‰#28$8 67Ï*V"°/± é± é°/±+´ +±+01!5*þðV‡‡2È’/²+´ #+²+´ #+°/°Ö± é± é±+017#5È–’’’ÿòÊI²+°3²+°3°/°Ö´ +±+°6º=•î“+ °±ù°±ù±..°@013#ÐCÎCÊý(ÿéÔF²+± é²+± é°/°Ö±é°±+± é± +±²999±± 9901".546324&#"32>XŽb5n†Fa64B5380+#"+9jSµÁ5h„YP}k;‘uq“fs%$sDzÅC²+²+´ +´+°/°Ö±é² +³@ +°´ +°/± +01#5273#!]Œé]ý;Ôb² +±é²+± é² +³@ +°/°Ö±é°±+±é°2² +³@ +± +±³ $9±² 99901!!>7>54&#"#&546323NRL,þEZu@5/05†{npƒó;`A7A"}bs?RO;5=B; p}zÿéÔ+ ²+± é² +³@ +²+±' é²' +³@'+ +´!  +´!+°,/°+Ö±*é°2°*±é°/°*±$+± é²$ +³@$ +°$° Ö±é±-+±$*²999± ° 9± °9°!° 9°'° 9014>32#"&'332654&'퀆&#"#&/@9gz,1<8‡qmˆd.;*#6 |.*7(‚ò7T0 iX1GU>h{}jo? Å T²+²+´  +°3± é°2°/°Ö° 2±é° 2² +³@ +² +³@ +±+± ± 9901##5!53# JŒþ䥌¹tv²þL/þÑÿéŲ +± é² +³@ +²+±é´  +± é² +³@ +°2°/°Ö±é±+°6º?>ö,+ °.°.°±ù°±ù°.³....°@±±99±°901!632#"&'332654&#"#éþÛ9Bb{ŽrgŠ]5==5C~?Å}”+ˆmsŽs]XH>@I6‹ ÿéÔ)g²+±% é²+± é´  +±é³ +°*/°Ö±"é°2°"±(+±é±++±("³ $9°°9± %±99°°901!2#.#">32#".$"32654 $=/+‚'"#/ !@,[sƒj5TI((b<<0/=Qƒ"F0">B2"€ft L“}I;8HJ9;Å 4²+² +± é° /°Ö±é² +³@ +± +± °901#67!5~v orþŸÅn˜þ騼Œ}ÿé Ô +—² +±' é²+± é´!  +´+°,/° Ö±$é°$° Ö´+°/´+°$±)+°2±é´+±-+±$°9±)´ !&'$9°°9±!'± 99°±99°±9901#"&5467.54632"3264"2654&õ1+=7ŒopŒ7=0,cb³^;;/.;k2=>37AÿèÔ",p²+± é²  +³@ +²+±# é´( +± é°-/°Ö±&é°&±*+°2±é±.+±&± 99°*µ  $9±(°9°#±9901#"&'3325#"&54632'"2654&"3HB&\{‡/%u  ^v…j">E3!ý/78`<;r`’T3kR&Ê  ˆno‹/J„šIzGH:>J2È3²+´ #+°/´ #+°/°Ö°2± é°2± é± +017#5#5È–––’’’v’’2ÿRÈ B² +´ #+°/´ #+°/°Ö±22± é° 2± é°´  +° /±+01735>5##52– ?1-)V––’‰#28$8 85’’(ÿöÚ²+°/±+01 %5þ‚~þÚm…ƒo¶y24›°/± é°/± é°/± +01!5!5þäþ›wwðww(ÿöÚ²+°/±+015-5(~þ‚é m…ƒo¶y@,è#|²"+´# #+²+± é² +³@ +°$/°Ö±é°±"+±! é³!"+´+°!±+± é±%+±±99°!°9°° 9° ° 9±#± 9901>32#54>54&#"#5@!1D;!n‹2F-|#22#<-/?¹–áAb7" €f?R1 &12K.(4!1BL: þ±’’ÿv³é8Dɲ+²)+´+°"/´ +´1) +°93´1+°62´?) +´ +°E/°%Ö´+°±+´B+°B±<+´  +° ±+´, +±F+±327332654&#"327#"&54>32#"&'#"&2654&#"5lF)4]N04gÐ…f³ei¢Zs[eˆÎû†â¾ñ0KW(2@ =YD`ºþè/ˆ\r®t´`\–O)N.ç«~߄ձCtJ*) IdŠC/4{M.: ¯Ù ,²+°3²+´  +±é° /± +± ° 901%!#3# åþï1™¦üšY__““Ùý'þãP˜Ùc²+±é²+±é´ +±é° /°Ö± é°2°±+±é° Ö± é±!+± °9±°9°°9°° 901%#!!23254#3254#˜5jIþ¸EDc1.6yþN£jj£³ooÒ$DB(Ù(?</D#G ¥RSþÞ½^_(ÿé©åf²+±é² +³@ +²+± é² +³@ +°/°Ö± é°± +°2± é°2±+± ±99° ± 99±°901&#"32673#"&54632€YdaWFT’¨ˆ˜²´š¥ ⃈yw†LF}“Ͱ±ÎŠyP¬Ù 8² +± é²+±é°/°Ö± é° ±+± é±+± °9013!2#'3254+PTm%YYGŸ‡‡©©‡Ù(,j®°hU}ïðPqÙ J²+±é²+±é´  +± é° /°Ö± é°2² +³@ +³@ +³@ +± +01!!!!!æ‹ýßþ‡]:½}Ù}¥}PPÙ @²+²+±é´ +±é° /°Ö± é°2² +³@ +³@ +± +01#!!!æ–þ–?:þÆÙ}¥}(ÿëÅç {²+²+± é²+± é² +³@ +´ +±é°!/°Ö± é°±+´ +° 2² +³@ +±"+±³$9±°9±±9901&#"32>7#5!#'#"&546328(†_mu[%4,"¦$Z*hJ”ÁÄ„ªòu†vp"='}þv`=8ئªÔ„qPÙ ?²+° 3²+°3´ +±é° /°Ö± é°2°± +°2± é± +01!#3!3#þß–– —–KþµÙþïý'PæÙ!²+²+°/°Ö± é± é±+01#æ–Ùý'ÙÿéìÙ?²+± é² +³@  +²+°/°Ö± é°±+± é±+±°901".=332653)KF*–&+'*–z/[?HF2-,)ýåfoPÓÙ 0²+° 3²+°3° /°Ö± é°2± +±± 99017#33 #æ––±þÝB³ïôôÙþÀ@þÆþaBPCÙ,²+±é²+°/°Ö± é² +³@ +±+01!!æ]þ Ùý¤}ÙPÙ Š²+² 333²+±33° /°Ö± é°2°± +° 2± é±+°6ºÁ£ñž+ ° .°À±ù°Àº>ò5+ ° .° À±ù±°À² ...´ .....°@01#33##æ–à„€â––8ýÈÙý¼Dý'8ýÈP¡Ù B²+°3²+°3° /°Ö± é°±+± é± +±±99±±9901!#33 þÛ–š!–øþÙþðý'(ÿéæå F² +± é²+± é°/°Ö± é°±+± é±+±± 99± ²999016632#""32654&(ÁžÂ¿ ŸŸ[nn[Zom¿PÖÕ®¢×|‹æ‹ŠpvŒP}Ù B²+²+±é´  +±é°/°Ö± é° 2°±+± é±+± °901#!2#'3254&+æ–Bryxd»Œu9<ŒþüÙtno„}m86(ÿÊæå]² +± é²+± é°/°Ö± é°±+± é°2± +±² 999°±99± ² 999°² 999012'#"&6654&#"327'‡ŸÀ+%PLVSjžÁÁôR!m\[nnZ4$M娤J‹-LQQ2×N×þ1NB\t‹‹æ‹IP¥Ù(}² +°3² +±$é´% +±é°)/° Ö± é°$2°±+± é°° Ö± é° /± é² +³@ +±*+± °9°°9± °9°%°9°$°901%4654&+#!2#.4&+326í,1¬–‡8Q){  ¡ 46µµ55}" .)þßÙ&>?"„0 @>=*0µ8%¾&(ÿéå)Ÿ²+± é² +³@ +²$+± é²$ +³@ +°*/°!ֱ鰱+± é° Ö±é±++°6ºðãÁÏ+ °°À± ù° À³ ....³ ....°@±!±99°²$999±± !9901#&#"#"&'332654&/.54632gŒ‘:D:Pre\žŒ›’TLDO>Kfo^‘ƒ&GP:'ûr1)('_Vo}|u;>4.,0ZUku 1WfÙ:²+²+±é°2°/°Ö± é² +³@ +² +³@ +± +01##5!‘–ÝH\ý¤\}}Pÿé’Ù9²+± é²+° 3°/°Ö± é° ± +± é±+± ±9901".53 53™PKO:%––%:O$8];îþ‚‚îþ;]8$ƒÙ!²+²+°3°/±+±°901!#33‰ö—¢Ÿ—ÙýÛ%«Ù u²+±33²+² 333° /±+°6º>¥òæ+ °.°À±ù°ÀºÁlò•+ °.±°À± ù° À² ...¶ .......°@01!# #333á‡zw‡ÎŸqq”vmŸ9ýÇÙýÞ"ýÝ#Ù &²+°3²+° 3° /± +±± 9901#'#373£ê²Œ‹®æÞ²€†®tþŒýýojðð yÙ0²+²+°3° /°Ö± é± +±°9±°901#33’–ò§•‹¨þòËþ¾BBÙ ,²+±é² +±é° /± +±°9°°901!!5!5BþŒtýÜuþ‹Ù}þ!}}ß}Bÿ84Ù7²+±é°/±é°/°Ö´ +°2±é´ +°2± +01#3#4ppòÙfý+f¡ÿôÿò!ÊI²+°3²+°3°/°Ö´ +±+°6ºÃìj+ °±ù°±ù±..°@01#7êCêÊý(Øÿ8Ù@²+±é°/±é°/°Ö°2´ +°±é°/°´ +°/± +0153#53ppòÈfÕfü_= ·# #3 qysp¥},þÔ©ÿêÿ8Bÿˆ°/´ +´ +°/±+01!5Bý¨xPP_Õõ(°/´ +°/°Ö´ +±+±°9013#~FFõ–(ÿé% -r²+²+±+ é²+± é² +³@ +°./°Ö±(é°(±!+±22±é±/+±(°9°!³$9°°9±+±99°²"99901"&54?2>54#"#632#&575326ÌJZŸ8$  Q4*‡ ÚÝ ˜JI(0,$)#5:YI   6 *»¦þÔ%"Mð&  "#BAÿéEÙ]² +²+± é² +²+± é°/° Ö± é± 22° ±+±é±+± ±99± °9°°9°° 9012#"'#36"32654ba‚‚ac2ŒŒ2xhBA54B%¡}z¤N7ÙþýOu]JM^^JK(ÿé%C² +± é² +³@ +²+± é² +³@ +°/°Ö±é±+±°901"32673#"&54632#.&r=5). † bx…†ye}† -´±OZ-4aq”†Š˜pc5-(ÿé,Ù]² +²+± é² +²+± é°/°Ö±é°± +±22± é±+± ±99± ° 9°°9°°901"&546323#5"2654& d‚ab3ŒŒ4B4BBhBA¤yz¥Oý'7NÇ_KJ^\JM_(ÿé%V²+±é² +³@ +²+±é´  +´+° /°Ö± é°2²  +³  +±!+± ±99012!3273#"&546.#""#BE3 þ– -"PŠˆ[s„†ß71\%*AkE -+DP_•‚ˆæ;@{9ÙY²+² +±é´ +°3´+°2°/°Ö°2±é°2² +³@ +² +³@ +±+±° 901###535432&#"9SŒLLŠ)'&]þL´]A‡i*5(ÿ&#%&|²+±! é²+´ +²  +³@  +²+²+± é°'/°Ö±é°±+±$22±é±(+±±99°µ !$9±!°9°°9°°9013#"&'3326=#"&54632"32654&ž…‡zl‚‘R5B'C/dy€`Z27EEýÒ_iSF?=1I,"š~}§\`MI\\IKbAÙG²+°3²+² +± é°/°Ö±é° 2°±+±é±+±° 9± ° 9014#"#3632#V/=ŒŒ:d 97 ŒJd<.þ¼ÙþõW'N5þ–FÒÙ0²+²+±é²+°/°Ö°2±é°2±é± +01#7#5ÒŒŒŒýä½}}ÿ&ÒÙ 8²+± é²+±é² +°/° Ö°2±é°2±+± °901#"'532657#5Ò:A$/ ŒŒý†B:p[½}}A*Ù 2² +°3² +²+° /° Ö±é°2± +± ±990173#'#3ͱŸ¸Å¤8ŒŒJÒÌþ°î=±ÙAÍÙ!²+²+°/°Ö±é±é±+01#ÍŒÙý'ÙA=% h² +± 33²+²+° 3± é°2°!/° Ö±é°2°±+±é°±+± é±"+±°9°°9°° 9±±99013>32632#4&#"#4&#"#A‹#C.j)ŒNWbYþ–Ma:0þ¼(ÿé>% F²+± é²+± é°/° ֱ鰱+±é±+±±99± ² 999012#"&6"32654&2{}ŽŽ}9FF98GE%™‰‚˜™ ™q`š`_LP_Aÿ&E% _²+± é² +² +²+± é°/° Ö±é± 22°±+±é±+±±99±°9°±99° ° 9012#"'#36"32654cf|ad2ŒŒ2yjAA54B%¤ö£XþæöPYu^˜]^IM(ÿ&,% _²+± é² +²+²+± é°/°Ö±é°± +±22± é±+± ±99±° 9°±99°°901"&463253#"32654 d}ad2ŒŒ1jAA54B¢ø£YPý XÈ^˜]\JOAt%1²+²+²+± é°/°Ö± é°2±+± °9013>32&#"#AŒP0 {Œj7<Ž{þáÿé %-²++±é²+ +³@- +²+±é² +³@ +°./°Ö± é° ±+±&é±/+°6ºìùÂå+ ° ° À±#ù°$À³ #$....³ #$....°@± °9°³+$9°&±99±±&9901732654&/".54632#&#"#"'§+<17§   wgm|‡d%,±j1bCù"$4 SaaVI 3i;:#´ÿé4¢^² +±é°/°3´+°2² +³@ +°/° Ö°2±é°2² +³@ +°2²  +³@  +±+± ° 901#327#"5#53534N "/‰EEŒ]þÚ$b L]‘‘Aÿé$G²+²+± é²+°3°/°Ö± é° ±+°2±é±+± °9± °901!#5#"&5332653$Œ:hV_ŒZ3>Œ@WbYxþ¥a:0R !²+²+°3°/±+±°901!#33Z“½”um”þu‹  u²+±33²+² 333° /±+°6º>nñé+ °.°À±ù°ÀºÁfò±+ °.±°À± ù° À² ...¶ .......°@01!# #333j‘QV˜‘VRŒQR‘}þƒþ†zþ†z &²+°3²+° 3° /± +±± 9901#'#373b´¨[\¨´°¨XW¨þ𨨠££ ÿ%+²+±é²+°3°/±+±° 9°°901533#"'5326ÓÉšwpÞ  *%22þw‰ý   i4Ý ,²+± é² +± é° /± +±°9°°901!!5#5Ôþ÷þA ùqþÆqq:q%ÿ8=Ù"d² +±é°/±é°/´+°#/°"Ö°2´+°2²" +³@ +° 2±$+±"°9±±"99°°9°± 990174&#'536=46;#";#"&5v.AE6L%-)88)%L6E–,\>Ó=Oc9Ã7. .7Ã%cO=dÿ8´Ù"²+°/°Ö´ +´ +±+01#´PÙü_¡Hÿ8`Ù"d²+±é° /±é°/´+°#/°Ö°2´ +°2² +³@ +°2±$+± °9±± 99°°9°±"99013#+532=467.=4&+532.AE6L%-)88)%L6E{,\>Ó=Oc9Ã7. .7Ã%cO=Žß:h°/´ +² +³@ +° /´ +²  +³@  +°/°Ö´ +°±+´ +±+±±99±° 9± °901%2673#"/&#"#632\!N v-&9  Nx0#9"Þ#’*#‘*ÿÿÿÿBÿFØ HÀ$ÿ„ zD° /°Ö±é°± +±22´  +±22° ±+°2±é°2±!+±°901>73#5.546753#./"( †zY,hwrm,\y† (OS³þ¨-.Ztef•}• VUu]..þ°S—ÿéË9Ô²+°3±é°° Ö± é²*+±7 é²7* +³@71 +´"#* +°3´"%+°2°:/°Ö± é²  +³@  +³ +±'é°'/±é²' +³@'" +° ±2+±0é±;+±'²!$999°° 9° ³$9°2±*799°0²999±² 999±"² 999±7#°'9013#632327#"&#"'>54'#53.54632#'.#"³ ‹z4@N"P/:)LE##1<7?/Y<"‚l.,??-,?(Àb²+° /°3´  +°2°/°3´ +°2°/°Ö° 2±é°2² +³@ +°2² +³@ +°2±+±°901#3##5#535#53373ñŽŽŽŒ‘‘‘ŠË‹‹†‡À_;5;´´;5;aþþþŸdÿ8´Ù(²+°/°Ö°2´ +°2´ +± +01##´PPPÙþ{…ýäþ{…!ÿ7Ó<H³²&+²/+² +±é°$/±+ é³& +°I/°:Ö´@+° Ö°&3±é±(é°@±F+´+°°" Ö±.é°./±"é±J+±@ ±899°(°>9±.¶ $+7D$9±"F³ $9±+$°"9±&µ!2>D$9°± 9901.54632#&#"#"'332654./&546'654&} v[%>=& D#%5a,2Fxbу$+"* «O' *“.¬  Ka$K5M#F6c2A1ªjÉ ')"   d.V-=QL(P !ÿÿ m?ç&yayÿòÿêïç!-¼²+´( +²+´" +´ +´ +² +³@ +´ +´ +² +³@ +°./° Ö´% +°%±+´ +°± +°2´  +°2° ±++´ +±/+±°9° ´"($9° ² 999±´ %+$901#&#"3273#"&54632$ #"&54%"32654&(ZM5=;4X\fT\mn^Neþ±<àᢛß~}³²{³³¯NPŒNVOZ~jk}Tëàž ß➘¶€¸µ‚€¶IÙ#/² +´ +² +³@ +°/´ +° /´- +°0/° Ö´+ +°2°+´ +°/°+±+±$22´" +²" +³@" +±1+°6º Àù+ °°À±(ù°'ÀºÁª+ ±°°À±('±(ù°'Àº †Àß+ °³+±³+³+µ'(......µ'(......°@± ±99±+° 9°"°9±- °"9°² !%99901!5%#&'#"&54?>54#"#6 '5326Aþä$\ +7,6_"  1N R .#TNNF .6,W pd³f'(XHÔá 757757X§ee.§eeÚr•uYYr’r•uYYr'V x(°/± é² +³@ +°/°Ö´+±+01!#5!'øwþxþÞªÿÿÏ*Vÿòÿêïç#.:â²*+´5 +²%+´/ +´*% +´ +² +³@ +°2´#*% +´ +°;/°-Ö´2 +°2±+´ +°2°±+´ +°° Ö´  +° /°3´ +°2°±8+´' +±<+±°$9°²*/5999± ± %99±8°9±5°9°´ '-28$9°#°901#32#&546=4#'3264&+& #"&54%"32654& `î9@Fg=\g$$gM<àᢛß~}³²{³³9­»@9J" %), 61Q>ñàž ß➘¶€¸µ‚€¶l;»(°/´ +´ +°/±+´ +±+01!5;þÕ»OO—Æ® N°/´ +° /´ +°/° Ö´ +°±+´ +±+±±99± ² 999012#"&46"32654&/>YY@=YY?%44#&44®Y>@XZ|Y?4%#54%$4ÿÿ2ÿð„' ZÿD«†H8Z°/´ +°/´ +°/°Ö´ +°±+´ +°2± +±² 999°°9±³ $9013!>54&"#&54632H(4J»þÊ!08/ :\QKIN²*>"6Q.H'&,"%" EJEsI2"©²+´ +² +³@ +° /´ +² +³@ +°/´ +°#/°Ö´" +°2°"´ +°/°"±+´  +° Ö´ +² +³@ +±$+±"² 999±°9±° 9°°9°°901632#"&'332654'#53254&#"ŽBO4BWHIQ\=#T K!Ÿ“@59 G?KKDB"=>:&$y_=õ(°/´ +°/°Ö´ +±+±°901#7=~FFõ––:ÿ$=c²+°3± é²+± é²+²+°3°/°Ö±é°2°±+±é±+±°9°±99± ±99°° 901732653327#"&'#"'#3ÆT,9Œ  !%#*4#='†ŒÎn<.Rþz,W&ëøÿAÙN²+´  +°2²  +³@ +°2°/° Ö´  +° ´ +°/° ±+´ +±+01463!####.wX/+b?b\tïc‡Hü°Pü°Ê€@©¼$(°/±é±é°/°Ö´+´+±+013#@||${ÿ$&?²+² +´(+°/°Ö´ +±+±°9± ° 9°± 9901;632#"'732654&#"¢+#)C>7SE$!?&!-04 (…ò.P²+´ +² +³@ +² +³@ +°/°Ö´ +² +³@ +°´ +°/± +01#5273#“ku@_¦=KþWWÙj²+´ +°/´ +° /´ +°/° Ö´ +°±+´ +±+± ±99°² 999°±99±± 9901!52"&546"2654NþÓ–LTV”VVlD**D*TNN…\RN[\OP\D9\:9-/XHÎá 57'557'5ÿ§eev§eeOs”uYYr’s”uYYr(ÿìRæ Ʋ+° 3²+²+´  +° 3´ +° 2² +³@ +± À/´ +² +³@ +°/°Ö´ +² +³@ +°´ +°/°±+°2´ +°2² +³@ +² +³@ +±+±° 9±´ $9±°9°°901#5273#3#%##5#53#5“ku@_¾WþYW¨._³¥m_j^=KþWŽý!¼K]]Jþÿ¤¤(ÿìNè *Dz +²+´ +²+²+´(  +´( +± À/´ +² +³@ +°+/°Ö´ +² +³@ +°´ +°/°±%+´  +° ±+´  +°2±,+±° 9±%² 999° °9°³ ($9° °9±³ "%$901#5273#3#3!>54&"#&54632“ku@_¸WþYWª(4J»þÊ!08/ :\QKIN`=KþWŒý!@*>"6Q.H'&,"%" EJEÿìRå"&14*²++°%3²+´ +² +³@ +²#+´-4%# +°'3´- +°(2²4- +³@4/ +´ %# +´  +² +³@ +´%# +´ +°5/°Ö´" +°2°"´ +°/°"±+´  +° Ö´ +² +³@ +° ±++°22´* +°02²*+ +³@*( +²+* +³@+- +±6+±"³ &$9±±%99±+ ²#/4999°*°$9±4-°.9± °39°° 9°°9°°901632#"&'332654'#53254&#"%3#%##5#53#5ŽBO4BWHIQ\=#T K!WþYWˆ._³¥m_jR“@59 H?KKDB"=>:&$yý!¼K]]Jþÿ¤¤ÿÿ4ÿ4  "`Àÿÿ ¯„' ɾ$ÿÿ ¯„' Ê$ÿÿ ¯„' ˾$ÿÿ ¯z#|À$ÿÿ ¯„#j¼$ÿÿ ¯µ#zº³$ ÏÙ^²+°3± é²+±é°2´ +±é´  +±é°/°Ö°2± é°2² +³@  +³@ +³@  +±+01%##!!!!!!#·ß5™ªþ’Sþ­‚ýèCr˜˜Ù}¥}½}Gþ¹(ÿ$©å1¦²+±é² +³@ +²&+²+´(+².+± é². +³@ +°2/°+Ö± é°± +´ +°± +°2± é°12±3+± @ %&.$9°°9± ± 099±°9°±99±°+901&#"32673632#"'732654&#"7.'&54632€YdaWFT’£‰#)C>7SE$!+EK$o´š¥ ⃈yw†LF|‘(&!-04 S !"jıΊyÿÿPq„' ÉÈ(ÿÿPq„' Ê(ÿÿPq„' Ë´(ÿÿPq„#j²(ÿÿì„& Éù,ÿÿ*„& Ê#,ÿÿÿü:„& Ëõ, ÿÿ4„#jÿõ, ½Ùt²+±é²+±é´ +°3´ +°2°/°Ö°2± é°2² +³@ +² +³@ +°±+± é± +±° 9°°9°° 901#53!2#!4&+3#326aMMWl$*./)$mVþãÌZU‡––‡R]SP6'-3”¢“4-(lo¹PÖjÿÿP¡„#|Ê—1ÿÿ(ÿéæ„' ÉÜ2ÿÿ(ÿéæ„' Ê62ÿÿ(ÿéæ„' Ëæ2ÿÿ(ÿéæ„#|æ—2ÿÿ(ÿéæ„#já2Où¼ ''7'7¥T€T€€T€T¼TT€T€€U$ÿÙøí#q²+± é² +± é°$/° Ö±" é°"±+± é±%+±" ²999°³ $9°²999±²999°´ $9° ±9901#"''7&54632732654&#"éÀ ˆWS3VRŸ‰_S4YJ­þÉ2R\nþˆ:7U]ne£ÙK[._n“§×T\-ceþ¨0ŒtKãZ:ŒuSÿÿPÿé’„' ÉÒ8ÿÿPÿé’„' Ê8ÿÿPÿé’„' ËÈ8ÿÿPÿé’„#jÇ8ÿÿ y„' Ê <P}Ù K²+² +´  +±é´  +± é°/°Ö± é± 22°±+± é±+± °9012+#33254&+’ëwe»––Œu9<Œaãp‚ŒÙxþ¨m86Cÿé?Ù'x²+²+± é²#+± é´# +´+°(/°Ö±é°±+±é° Ö±&é±)+±´  #$9±&°9± ± 99°°9°°&901#"'532654춮&#"#4632½#0nb829MI1:4.).Œiƒe€›$G1z‰ iO8>A_.+',*%ýç`sfPfÿÿ(ÿéõ"CsDÿÿ(ÿéõ"v^Dÿÿ(ÿéõ"fsDÿÿ(ÿéí"|hDÿÿ(ÿéç"jjDÿÿ(ÿé"ziDÿèZ%.:>² +° 3±8 é°2²#+°'3± é²# +³@! +´; # +´;+°?/°Ö±5é°5±/+°2±é°;2²/ +³@, +±@+°6º TÀ×+ °°À±4ù°2À°³+³+³+°4³342+² Š Š#9°9°9²3429µ23......µ23......°@±5°!9°/² #999°± %99±8 ° 9°²999°;±,099±#²%>=99901%32673#"'#"&54?>54#"#632632532673&"ïr$; Šˆ[ˆ@YtM[Ÿ8#  U/+ƒáu:>].TO/þ %0P)#69Ø ÄâŽ'P_hiYL‘   5!)»22?{U &  >#A¥{(ÿ$%1š² +± é² +³@ +²#+²+´(+²)+±0 é²0) +³@0- +°2/°&ֱ鰱+´ +±3+±&±99°@  "#)0$9°²-999±°9° ³ "$9±0°&90132673+632#"'732654&#"7.54632#.#"´6+(. †€]$)C>:PC%"+hn†ye}† -+r*G9-4]u(&!-04 UzŠ˜pc5-ÿÿ(ÿéõ#CˆHÿÿ(ÿéõ"vfHÿÿ(ÿéõ"f{Hÿÿ(ÿéç"j|Hÿÿ Òõ"CùóÿÿFõ"vÑóÿÿÿ÷5õ"fïó ÿÿÿü.ç"jïó (ÿé>è&u² +±" é²+°3´ +±é°'/°Ö±é°±$+± é±(+±±99°$· $9° °9±"± 99°°9°´$9017#"&54632&''7&'"2654&Å%9W3Tql~}Ž„k$1(7M*F&4±9EErEDå 4"2M¾|Šš™‡y”@ .%,þ÷]LM]\KO]ÿÿA$í#|†Qÿÿ(ÿé>õ#C”Rÿÿ(ÿé>õ"vrRÿÿ(ÿé>÷#f‹Rÿÿ(ÿé>í#|‰Rÿÿ(ÿé>ç#jˆR2ÿõÚ 3² +±é°/± é°/±é° /° Ö°2´ +°2± +01!573#3#þ´||||#ww·{ï{ ÿÚX-#u²+± é²+²+± é°$/°Ö±"é°"±+±é±%+±"²999°³$9°² 999±±99°³$9°² 999017'7&546327#"326547&#"€H+K2}kKD+H/|tçÉ$27HóÊ'28G#I(MHp…™>F)IIk…™gÌ*`J(tÎ/`K.ÿÿAÿé$õ#C’XÿÿAÿé$õ"vzXÿÿAÿé$õ#f„XÿÿAÿé$ç#j„Xÿÿ ÿ%õ"v^\Aÿ&EÙ]² +± é² +²+²+± é°/° Ö± é±22° ±+±é±+± ± 99± ° 9°°9°°901632#"'#"32654Í2daad2Œ7jAA54BÙþóY£|z£Wþæ³þ×^LK]]IMÿÿ ÿ%ç"jl\ÿÿ ¯o#qÇ´$ÿÿ(ÿé»"qjDÿÿ ¯„#x˜$ÿÿ(ÿéì"xvDÿÍÙ\²+±33²+°/´ (+´ +±é°/°Ö´  +±+± ±99± °9°± 99±°901%!#3327#"&5467# ïþï1™§û4=L$'FNA;KX_`““Ùý'E%5/ 2-,Iþã(ÿ0%.;¯²+±9 é²+²*+²+± é² +³@ +°%/´ (+°54#"#632327#"&467#&575326ÌJZŸ8$  Q4*‡ ÚÝ mL $'FNB:MJI(0,$)#5:YI   6 *»¦þÔ%:G5/ 2XK"Mð&  "#Bÿÿ(ÿé©„' Ê"&ÿÿ(ÿéõ"vfFÿÿ(ÿé©„' ËÖ&ÿÿ(ÿé÷#f„Fÿÿ(ÿé©„#yÓ&ÿÿ(ÿéÛ#y„ÿôFÿÿ(ÿé©„' ÌÐ&ÿÿ(ÿéõ"gzFÿÿP¬„' ̯'ÿÿ(ÿéä' ^MGÿÿ½Ù’(ÿéhÙ ’² +²+± é²+²+± é´ +°3´ +°2°!/°Ö±é°± +²222± é°2² +³@  +² +³@  +±"+±°9° ± 99± ° 9°°9°°901#53533##5"&54632"2654& ……Œ<<Œ4‚‚ab3v4BBhBATCBBCý¬7N¤yz¥O&_KJ^\JM_ÿÿPqo#q³´(ÿÿ(ÿé»"qsHÿÿPq„#x¶˜(ÿÿ(ÿé"x|#HÿÿPq„#y±(ÿÿ(ÿéç"ypHPÿ‰Ùw²+±é²+²+±é° /´(+´ +±é°/°Ö± é°2°±+´ +² +³@ +³@ +³@ +±+± ° 9°± 9901!327#"&547!!!!æ‹mL)!GN}þ)þ‡]:½}:G5/ 2-Q9Ù}¥}(ÿ %'-†²+±%é²+²+±+é° /´(+´-" +´-+°./°Ö±"é°-2°"±+´ +² +³ +±/+±°+9± ° 9°± 99±"%°9°-±9901%327#"&5467#"&54632!327'.#" <8-L'(CM*5/#r…†t.SN/þ–.?O9/]˜*R4H#4/ 4-"7% –‚ˆ?{U EJE§GqTÙý'@C/ 4-L<Ù#ÿèÙY²+±é²+°/´(+°/°Ö°2±é°2° Ö´ +±+±² 999±°9°± 9901327#"&547#3#5}&(>HnMŒSSŒ€/ 4-GAýä:}}ÿÿPæ„#yÿ÷,FÒ!²+²+°/°Ö±é±é±+01#ÒŒýäPÿéÙP²+± é² +³@ +²+°3°/° Ö°2± é°2° ±+± é±+± °9±°901#".=332653æ–ä)KF*–&+'*–zÙþqý/[?HF2-,)ýåfoÿÿFÿ&ÞÙ#M Lÿÿÿéì„& Ëd-ÿÿÿíÿ&+"fåïÿÿPþÔÓÙ'Æ".ÿÿAþÔ*Ù'Æ·NÿÿF/¡ÿÿPC„& ÊP/ÿÿ*„& Ê#OÿÿPþÔCÙ'Æñ/ÿÿAþÔÍÙ'Æ*OÿÿPCä' ^"/ÿÿA¸ä' ^ðOÿÿPCÙ#y~–/ÿÿAŸÙ#yãˆO _Ù G²+±é² +°/°Ö° 2± é°2² +³@ +² +³@ +±+± ± 99017!!573ð¥¥oýûPP–§pXqÑ}8Y8 Ù 9²+² +° /°Ö° 2±é°2² +³@ +² +³@ +± +017#573Î88Œ88Œº(O(þ•&(O(dÿÿP¡„' Ê1ÿÿA$õ"v|QÿÿPþÔ¡Ù'Æ"1ÿÿAþÔ$%'ÆÒQÿÿP¡„' ÌÈ1ÿÿA$õ#g„Qÿÿ!~ì&\ÝQZPÿðÈå)`²+± é²+°3±é²+²+±é°*/°Ö± é°2°± +±% é±++± ²999±± %99°°901".#5232654.#"#3>32·(B3P  (B[–– V@ LRC+0Q]{˜‚.H/! bOþIÙM4%1GnBt±c0Aÿ&$%U²+² +± é²+²+± é°/°Ö±é°2°±+±é±+±± 99°° 9±°9013632#"'532654#"#AŒ:hV_:A$/ Z3>ŒNWbYþ8B:pŒa:0þ¼ÿÿ(ÿéæo#qâ´2ÿÿ(ÿé>»#qˆRÿÿ(ÿéæ„#xÞ˜2ÿÿ(ÿé>#x‡#Rÿÿ(ÿéæ„' Íú2ÿÿ(ÿé>õ#}ÛR(ÿéÖå#–²+±é²+±" é²+±é²+± é´ +±é°$/° Ö± é°±+± é°2² +³@ +±%+±±99°³$9±"°9±°9°± 99°°9±°901!!5#"&546325!!!&#"32|Zþ%C3‚§¨…0C$×þ¹+þ?*LPbbOM:½};.$×§©Õ#4}¥}ˆjI‹srŒ(ÿé©%)/›² +° 3±$ é°2²$ +³@$ +²+°3± é°-2´/  +´/+°0/°Ö±"é°"±'+±é°/2²' +³@ +±1+±'"± 99°± 99±$ ° 9°±"99°/±'99°±!99°°901%32673#"'#"&632632%"32654&.#">o%: ŠˆZqBLw}ŽŽ}zIAs$CE3 ý‹9FF98GEª7/` âŽ&P_KK™ ™LL*AkE Ò`š`_LP_ué°2 Ö±1é±A+°6ºó¯Á2+ °%°$À±: ù°;À³$%:;....³$%:;....°@±7(² 999°@ +4$9°°9± ° 9°± 99±4²(>99901632#"'732654&#"7.'332654&/.54632#&#"\$)C>9QD%!*€’TLDO>Kfo^‘ƒ&GP:'Œ‘:D:Pre\'&!-04 S vn;>4.,0ZUku 1W9r1)('_Ußÿ$ %Dâ²*+±é²A+²3+´8(+²+±é² +³@ +°E/°Ö± é° ±+±&é³0&+´; +°;/´0 +±F+°6ºìùÂå+ ° ° À±#ù°$À³ #$....³ #$....°@± ²56999°;@ *+38@A$9°0±-99°&±99±83°59°*³06>@$9±³&D$901732654&/".54632#&#"+632#"'732654&#"7.'§+<17§   wgm|‡d%,±jza#)B>8SE$!+kc"$4 SaaVI 3iQf(&!-04 T TRÿÿ(ÿé„' Ì 6ÿÿÿé õ"gqVÿ$fÙq² +´(+²+±é°2° /°Ö± é² +³@ +² +³@ +³+´ +±!+±³ $9°°9± ° 9°±9901#632#"'732654&#"7##5!‘#)C>7SE$!6MÝH\ý¤?&!-04 j\}}ÿF¢+—² +±é²"+°/´(+°&/°3´'+°2°,/°$Ö°(2±é°*2²$ +³@ +°2²$ +³@$& +°±+´ +±-+±$´ "$9°° 9°±99±°9° ³!$901#327632#"'732654&#"7&5#5353-N $#)C>7SE$!6oEEŒ]þÚ$b =&!-04 i rL]‘‘ÿÿf„' ÌŒ7ÿÿÿéàä' ^WfÙ]²+²+±é°2´ +° 3±é° 2°/°Ö°2± é°2²  +³@ +³@  +² +³@ +³@ +±+01535#5!#3##ˆsÝHÕnn–0}¯}}¯}þÐ0 ÿé-¢t²+± é°/°3´+°2°/°3´+°2² +³@ +°/°Ö±22±é±22³+°3´ +°2±+±°9°± 9901#3#327#"=#535#5353-NII "/‰JJEEŒ]|]M$b s]|]‘‘ÿÿPÿé’„#|Ê—8ÿÿAÿé$#|„XÿÿPÿé’o#qÈ´8ÿÿAÿé$»#q†XÿÿPÿé’„#xĘ8ÿÿAÿé$#x„#XÿÿPÿé’µ#zƳ8ÿÿAÿé$#z„XÿÿPÿé’„' ÍÜ8ÿÿAÿé.õ#}ÚXPÿ’Ù"v²+± é²+°!3° /´(+°#/°Ö± é°±+´ +°± +± é±$+±°9± ±99°² 999± ° 9°³ $901%327#".467#".53 53’(88(M')"<2/9;25_Z6––ë<`?6=!3/ -H;$6kIîþ‚‚î:ÿ4"‹² +± é²+²+² +°3° /´(+°#/° ֱ鰱+°2±é³+´ +°/´ +±$+±± 99±² 999± °9° ²999°°9014>7#5#"&5332653327#"&T-#@:hV_ŒZ3>ŒoL $'GNŠ2!@WbYxþ¥a:0Rýä8I5/ 2ÿÿ«„' Ë3:ÿÿ #fÚ!Zÿÿ ÿþy„' ˪<þÿÿ ÿ%"fj!\ÿÿ y„#jœ<ÿÿB„' ÊÜ=ÿÿÝõ"vF]ÿÿB„#y=ÿÿÝç"yT]ÿÿB„' ÌŒ=ÿÿÝõ"gS]4ÙE²+²+± é´ +´+°/°Ö°2±é² +³@ +±+±°9013##535432&#"æŒLLŠ)'&´]A‡i*ÿéEÙ !Œ²+²+± é²+² +± é´ +°3´ +°2°"/°Ö°2±é²222² +³@ +² +³@ +°± +±é±#+± ± 99±°9°°9° ° 901"32654'2#"'##53533#6whBA54BWa‚‚ac2Œ<<Œ……2°]JM^^JKÔ¡}z¤N7TCBBC~O(_Ù ,²%+±é²+±é²+´' +´% +°3±é°-/°Ö±)é²) +³@) +°)±%+± é°2°±+±é° Ö±é±.+±°9±°9°°9°'³ ,$9013254#3254#"&5463!2#!#"3­³oo³£jjþ`Wof_Dc1.6y5jIþ¸$K":½^_"¥RSþàrZdm(?</D#Gj$DB(CA'ÿÿ?‡ÙxïPÿéTÙ l²+²+± é²+±é² +± é°/°Ö±é±22² +³@ +°± +±é±+± ± 99±°9°°9° °901"32654'2#"'#!#6†hBA54BWa‚‚ac2Œ{ï2°]JM^^JKÔ¡}z¤N7Ù}†OŽÙ N² +± é²+´ +±é°/° Ö± é°2° ±+± é±+± °9°° 9°° 90132#!'32654#÷»dxyrþ¾a÷Œ<9uÙþü„ontÔKÇÛ68mÿéeÙ e²+²+± é²+² +± é°/°Ö±é±22°± +±é±+± ± 99±°9°°9° ±99°°901"32654'2#"'#'76—hBA54BWa‚‚ac2Œaí2°]JM^^JKÔ¡}z¤N7íQ›þýOÿÿ(ÿé©å &ÑÎÀ(ÿéßì"z²+±é² +³@ +²+± é² +³@" +°° Ö± é°#/°Ö± é°±+° 2±"é° 2±$+±±99°"±99±°9±°901&#"32653#"&54632632&#"€YdaWHY’­Š˜²´šdJS$/ ⃈yw†ND|”Ͱ±Î,3po(ÿéQ."]² +± é² +³@ +²+°3± é°2² +³@ +°° Ö± é°#/°Ö±é±$+±°9±°901"32673#"&54632632&#"#.&r=5). † bx…†yF3I/ † -´±OZ-4aq”†Š˜$pA5-ÿÿ½Ù’(sÙ_²+±é²+±é²+´ +°/° Ö±é² +³@ +°±+± é°±+± é± +±³ $901%3254+"&5463!2#!"3­‡©©‡Î`Wof7 FYYGŸþã$K"}ïðþàrZdmTk­°hUC@'4|ÙQ² +±é² +± é´ +±é°/°Ö±é°±+°2± é² +³@ +±+±°90174>;5!5!!".%#";4 %:d?£þ–þ¸Ij5²³5::5³Þ8E6%}ý')EHœ;0/;(ÿé,Ù l²+²+± é²+±é² +± é°/°Ö±é°±+± 22±é² +³@ +±+±± 99±°9°°9° ° 901"32654'25#5!#5#"&546^hBB45A•c2ï{Œ2ca‚‚°_KJ^^MJÒO†}ý'7N¤z}¡ÿÿÿI#AG À(IÙ J² +± é²+±é´  +±é° /° Ö°2± é²  +³@  +³@  +³@ +± +01!5!5!5!!5!³þ£]þ‡ýß‹:}¥}ý'}(ÿéæåS²+± é²+± é² +³@ +´  +±é°/°Ö°2± é² +³ +±+± ± 99013267"&5473!.#"#>32ÃhMLjÄžÁ–‰gOu6qvCžÂÀ%WefVþÄ×§"[hmWo'Õ®¡Ø(ÿéå'Ÿ²+± é² +³@ +²"+± é²" +³@ +´ " +± é°(/°Ö±é°° Ö±é°/±é² +³@ +°±+±é±)+±°9±²"999°±99± °9°°9°°901#&#";#"32673#"&547&54632tŒ‘:DŠLfGBODLT’›ŒžY?‘ƒ'FQ:&ûr1)gx@1.4>;u|}os1/]ku 1Wÿ&KÙL²+± é²+±é´ +±é°/°Ö± é°2² +³@ +³@ +±+±°901!!#"'53265!!á?þÂ:A$/ þ–·}þhB:p}ÿ&9Ù_²+± é²+±é´ +°3´+°2°/°Ö°2±é°2² +³@ +² +³@ +±+±±9901##"'53265#535432&#"9S:A$/ LLŠ)'&]ýîB:pó]A‡i*5(ÿéþì'¨²+²+± é²+± é² +³@' +°° Ö±# é´  +± é°(/°Ö± é°± +´+°&2²  +³@ +°´ +°/±)+± ³$9°°9°°9±°9± ±99±#°901&#"3265#5!#'#"&54632632&#"8(†_mu[Pi¦$Z*hJ”ÁÄkOR$/ ðu†vph:}þx^=8ئªÔ-4paÿì€ÙQ²+²+°3°/°Ö±é°±+± é±+±±99°±99° ± 99±²99901%32547#"&54733M 8 *TBFPLò§•‹¨ˆ š3j +:7.CzËþ¾BPÿðtÙ#m²+²+± é²+²+² +± é°$/°Ö±é° 2°±#+±é°±+±é±%+±#° 9±°9±±#99°° 9014#"#363232653#".5žV/=ŒŒ:d 97 &;7(ŠmzIb1Jd<.þ¼ÙþõW'N5|H=CH(þ¸i{!BL5AÿÐò@° /±é² +³@ +°/°Ö±é² +³@ +±+±° 9± °901732?#"&53Æ )> IX)/ ³þaBNôÙþÀøX:1-PNR,A*Ù>² +°3² +± é²+°/° Ö±é°2±+± ° 9± ±990173#'#4632&#"ͱŸ¸Å¤8Œ:A$/ JÒÌþ°î=±]B:pÿç„ò L² +°/°3± é°2² +³@ +° /° Ö°2± é°2² +³@  +² +³@  +± +01#5333##||†}}†:uCþ½uþ­ÿóJã$@²+²+±é²+± é°%/±&+±°9° µ $9°± 9901#57.#"76327327#".'&z²‘™)2;HŠn’  #!C(! \Nþ°Ð[Y_" z?9VXEþ{p# ÷Pÿö‚Ù h²+² +°3± é°2² +±33°!/° Ö± é°±+± é°±+°2± é±"+±° 9°°9°°9±±9901!#5#"'#"&533265332653‚•%H1r,AhWa–,%07–,%16–H,&VV_T0ýè#(<5òýè#(<5òÿ&œÙN²+² +± é²+°3°/°Ö± é°±+± é±+±° 9°±99±±990133##"'53265M˜!––þÜ:A$/ Ùþðý'öý¬B:pAÿ7$%D²+²+²+± é°/°Ö±é°2°± +±é±+± °9± °9013632#4#"#AŒ:hV_ŒZ3>ŒNWbYýÍa:0þ¼(ÿéæå#H² +± é²+± é´# +±é°$/°Ö± é°#2² +³@ +±%+±#±99012#".54>32675.#"†HwQ72K€PYŒQ)+RŠlhMLjgONiå,Kem:+\jQ7Dp„FH…oBþ@WefV}[hiZ(ÿéû q²+± é²+± é²+°!/° Ö± é°±+± é°° Ö±é°/±é±"+±±99°°9°°9±³ $9°°901"32654&632654'3#"‡[nn[ZomþEÁ–_Ž=7C¿ Ÿe‹æ‹ŠpvŒþZPÖ`- 0PdŽ¢×(ÿé’I !k²+± é²+± é²+°"/°Ö±é°±+± é³ +±é±#+±±99°°9° ± !99±´ !$9°°901"32654&#"&632654'339FF98GE°!{}ŽŽ|HŽ<7´`š`_LP_@_‚˜™ ™N- 0P(ÿ8äè (}²&+± é²+± é²+± é² +³@ +°)/° Ö± é°±+±# é°#±+± é±*+±±&99°#± 99°±99±² #999±°901"32654&4632>32#4&#"#"&‡[nn[ZomþEÁŠW I/cp–! ÀŸžÁe‹æ‹ŠpvŒþ¨ÖMidýã,)-2B3:¡Ø×(ÿ&&%r²+± é²+²+°3± é°2°&/°Ö±é°±#+± é° ±+±é±'+±#±99° ± 99°±99± ² 999°°901#4&#"#"&632>32%"32654&† {}ŽŽ|ƒG?NQþ%9FF98GE?ýç-$8 >R‚˜™ ™Q"0‚`š`_LP_(DÙ c²+²+±é´ +±é°!/° Ö±é² +³@ +°±+± é°2°±+± é±"+±°9°³  $9013254&+"&5463!2+##"3­Œu9<ŒÎ`WslRryxd»–1."m86þàrZgjtno„þüC#'Aÿ&E° i²+± é²+² +± é°/± é°!/°Ö±é±22°±+± é±"+±°9°² 999±°9°± 99° °901"32654'2#"'#4632&#"6xjAA54BVf|ad2Œ=B/ )2°^˜]^IMÔ¤ö£XþæA;p#PYPÿBsÙ%j² +² +² +±é´ +±é°&/° Ö± é± 22° ±!+± é° Ö±é±'+±!±99± ±"99°°9°°90132654+#332#&=4&#æz)&Oz––—6N'M ¡E,)"Fó»Ù½ 45*J"© *?®)9(ÿéå)©²+± é² +³@ +²+±' é²' +³@' +°*/°Ö±é°°) Ö±é°/±)é°±$+± é±++°6º æÁ+ ° °!À± ù° À³ !....³ !....°@±$)²999° ±99±'± 99014>3232673#"&546?>54&#"B':PG&ƒ‘^ofK>ODLT’›Œž\erP:D:‘û9W1 ukUZ0,.4>;u|}oV_'()1r#ÿé%-´²+±+é²+ +³@+ +²+±é² +³@ +°./°Ö±(é°(±+±é±/+°6º¸Â€+ ° ° À±%ù°$À° ³ +² Š Š#9³ $%....³ $%....°@±(±99°³+$9°°9±+±9901%3#".54?>54&#"#>32#326…‰ùCb1j±,%d‡|mgw   §71<+´#:;i3 IVaaS 4$ÿÿ<¤Ù0$ÿ+¥ä "j²+±é²+± é´  +± é°#/° Ö´+°± +±é°´+°/±$+± ³ $9± °9±± 9901"2654&"&54632327#"&5¸=WW=CQ+QXt·W==7Ž<7@WbYxþ¥a:0R=> 0PÿÿÿÝÏÊ 6÷ÊÀAÿô¡ÛG²+± é²+°3°/°Ö±é°± +±é±+± ±99°°9±°9017332>=4./3# AA$7>,)')§E=® þîóèýð', -O46VZA=' ]³g¸®)ÙR²+²+° 3± é°/°Ö± é°±+± é±+±° 9°±99°°9±³ $9014&#"#37632'•&%‡–ò§•T32&#"#"'532653~S0-%Á #2 !8Éš“º=Pi!3ýÚ 7. f-12BÙB² +±é²+±é´  +°3´  +°2°/±+± ° 9± °9013#!!57#537!5BŸkŸ¡týÜ¡g› þ‹Ù}ÍCÏ}}ÏCÍ}ÔB² +± é²+± é´  +°3´  +°2°/±+± ° 9± °9013#!!57#537#5Ë`3lpþAq5naùqrC…qq…Crq(ÿéÙl²+± é²  +³@ +²+±é°/° Ö± é° ±+±é² +³@ +±+± ±99°²999°±99± ±9901#"&'332654&'9#5!oRN‡qmˆd.;*#6lÿ‘‰i?h{}jo3232654&+57!5!lU 8 R^'&#`0ir4&\%SI9Isþø¹yPQlZq$$ u rP#'$"+m‰{l”_%ä-@²+± é²+± é°./°Ö±é±/+±´$9± ³&'$9012'!!7>7'57654&#"#7>)og<¿$nýõ95,®SA2#0 Š$8\ä‚gtQƒMƒG]A%ƒF/G/=.,)GJ3!ÿÿ(ÿñÙB<ÙÀAÿ&P( P² +² +²+± é°/° Ö± é±22° ±+±é± +± ±99± ±99° °901>54#"#3>32Í+TK.H]SŒŒ/YILf,I:V,# ^þÂMZf.9þöP..iY-XEI0:ÿÿdÿ8´Ù_ÿÿdÿ8@Ù"__Œ-ÿ8Ûl²+° /°3´ +°2²  +³@ +°/°3´ +°2°/° Ö±22´  +±22² +³@  +°2² +³@ +°2±+0133#3###535#53ÿFÖÖÖÖFÒÒÒÒÛþ‹P\PþÎ2P\Pÿÿ>ÔÖÎÿÿPö„#?´'ÿÿP›õ#@¾'ÿÿ(ÿé@õ#@cGÿÿPÿéOÙ#-c/ÿÿPÿ&Ù#M?/ÿÿAÿ&æÙ#MOÿÿPÿé¾Ù#-Ò1ÿÿPÿ&¢Ù#MÐ1ÿÿAÿ&3Ù#MaQÿÿ ¯„' ̾$ÿÿ(ÿé÷"gqDÿÿÿý;„& Ìö,ÿÿÿø6÷"gïó ÿÿ(ÿéæ„' Ìà2ÿÿ(ÿé>÷#g…RÿÿPÿé’„' ÌÈ8ÿÿAÿé$÷#g„XÿÿPÿé’Ý#qÈ"#jÈ8ÿÿAÿé$^#q…£¾ÿÿPÿé’' Ê„#jÇ•8ÿÿAÿé$„' ÊÒ¾ÿÿPÿé’' ÌÈ‚#jÇ“8ÿÿAÿé$„' Ì‚¾ÿÿPÿé’ ' Éȉ#jÇ—8ÿÿAÿé$„' É‚¾ÿÿ(ÿé% HGÀÿÿ ¯Ý#q¼"#j¼$ÿÿ(ÿé^#qj£¦ÿÿ ¯Ý#q¿"&$y¿“ÿÿ(ÿé[#qj âÿÿ Ïp#q¸µˆÿÿÿèZ»#q ¨(ÿéå'•² +²+±% é²+± é² +³@ +´ +°3´ +° 2´ +±é°(/°Ö±" é°"± +´  +±22² +³@ +°2±)+± "´'$9±% °9±±"9901%5367#5!3##'#"&54632#&'&#"327¡Ÿ¦$UUZ*hJ”ÁÄ„ª2O_mu[F5•P}£P—`=8ئªÔ„q1,†vp,"ÿ&x% .­²&+± é²+´+² +³@ +² +²,+± é´ +°3´ +°2°//°)ֱ鰱"+± 22±é²" +³@ +²" +³@" +±0+±)±99°"¶&,$9°°9±&°#9°°)9° °.901"32654&733##"&'3327#536=#"&54632 3?>27EEC…]r9±l‚‘R#4i'C/dy€`Z<°`MI\\IKblýÒChSF?CI,"š~}§\ÿÿ(ÿëÅ„' Ìæ*ÿÿ(ÿ&#÷#g JÿÿPÓ„' ÌÒ.ÿÿA*z#gŽ…N(ÿæå 'c²+± é°/´(+°(/° Ö± é°±"+´ +°±+± é±)+±¶%$9±°9°´ "$901"32654&4632327#"&5467.‡[nn[ZomþEÁžÂM•c9)L'(CM;4‰£e‹æ‹ŠpvŒþ¨ÖÕ®e¥h%4%2/ 3,*FÐ#ÿ9% &b² +± é°/´(+°'/°$Ö±é³$+´ +°±+±é±(+±¶ !$9±°9°´$$901"32654&'2327#"&5467.546.9FF98GE;o9)L'(CM;5gsŽ´`š`_LP_q™‰z– $5%2/ 3,*G•w…™ÿÿ(ÿæ\#qࡪÿÿ#ÿ9œ#qˆÿá«ÿÿ(ÿé„& Ìgyÿÿ#ÿq ÷"g}2ÿÿÿøÿ&6î&ï gïùÿÿPÙ#=Ò'ÿÿP¯Ù#]Ò'ÿÿ(ÿé@Ù#]cGÿÿ(ÿëÅ„' Ê,*ÿÿ(ÿ&#õ#v†JPkç N²+²+²+± é°/°Ö± é±22° ±+± é± +± °9± ±99°°901>54&#"#3>32á1JQ,.#]0‘‘/\FLm#1Q>\*þò!;QZ-(þ%]Ù3&mX/_JP4=ÿÿP¡„' ÉÈ1ÿÿA$÷#C°Qÿÿ ¯„' Ê"#zÄÿîB$@0ÿÿ(ÿé„"ziñ"D ʲÿÿ Ï„' Ê̈ÿÿÿèZõ#v¨ÿÿ$ÿÙø„' Ê6šÿÿ ÿÚXõ#vŽºÿÿ ¯„& ÎV$ÿÿÿéô#¯“ÿÿDÿÿ ¯„#± ˜$ÿÿ(ÿéð#±¿DÿÿPq„& ÎV(ÿÿÿéô#¯ŠÿÿHÿÿPq„#±ü˜(ÿÿ(ÿéð#±ÀHÿÿÿŠ6„& ΃,ÿÿÿ²2ô"ó ¯+ÿÿÿÿ„#±A˜,ÿÿ ð#±/óÿÿ(ÿéæ„& Î]2ÿÿ(ÿé>ô#¯§ÿÿRÿÿ(ÿéæ„+x-áÀ2ÿÿ(ÿé>ð#±ÖRÿÿP¥„& ÎV5ÿÿÿítô#¯fÿÿUÿÿP¥„+x áÀ5ÿÿAtð#±zUÿÿPÿé’„& Îj8ÿÿAÿé$ô#¯ºÿÿXÿÿPÿé’„+xáÀ8ÿÿAÿé$ð#±ÑXÿÿ(þÔå'Æä6ÿÿþÔ %'ƱVÿÿþÔfÙ'Æê7ÿÿþÔ4¢'ÆWW#ÿt"å/Q²+±- é°0/°Ö°2±é°±+± é°* Ö± é±1+±²%999°*²!$999± ° 901#7>32'367654.''767654&#"¯Štq€;P+N@lC:%®JX;Z!ƒ%55/94æ}vfR;;t(H66"*’:+4/% y6%*/1;ÿ{¼'6f²+±4 é²4 +³@4 +°7/°Ö±é°±2+± é° ° Ö±"é°"/± é±8+±µ(),$9°2²%-999± "° 901#54632'7>54&''767>54#"¦ˆqYVo&5&!8%C$#  H[E *E ,:&X[tfO@+,W+#" d( #3 s 8*ÿÿP„' ÌÈ+ÿÿAr#g }Kÿ)BÙM²+±é² +±é²+±é°/°Ö±é°2² +³@ +°2±+±°9°°901!#"'5326=!5!5BþŒt"G2&+þbuþ‹Ù}þ!Î*+v0}ß}ÿ(ÔT²+± é² +±é²+± é°/°Ö±é°2² +³@ +±+±±99±°9°°901!0#"'5326=!5#5Ëþ÷"G2&+þÇ ùqþÆÃ*+v1q:qÿÿ ¯„#yÉ$ÿÿ(ÿéÛ"yrôDPÿ+qÙ#”²+°3±é² +´(+²+± é´! +±!é°$/°Ö± é° 2² +³@ +³@ +³@# +°±+´  +±%+±±99°µ $9° °9± °9°± 9901!#632#"'732654&#"7#!!!æ‹þ#)C>7SE$!2÷þ‡]:½}8&!-04 cÙ}¥}(ÿ%6t²+±é°#/´((+°/´+°7/°4Ö±é°2²4 +³ +°±++´  +±8+±+°9° ±99±(#°%9°² &2999°° 901.#"72!3273632#"'732654&#"7.54671\l#BE3 þ– -"PŠ}T#)C>7SE$!3hw†?;@{æ*AkE -+DK^9&!-04 d“{ˆÿÿ(ÿéæÝ#qá"#já2ÿÿ(ÿé>[#qˆ ¸ÿÿ(ÿéæÝ#qä"#|æ2ÿÿ(ÿé>[#q ·ÿÿ(ÿéæ„&2yßÿÿ(ÿé>Û#y†ÿôRÿÿ(ÿéæÝ#qà"&2yà“ÿÿ(ÿé>[#qˆ êÿÿ yo#q£´<ÿÿ ÿ%»"qj\ÿ&Ò )²+± é² +°/° Ö±é±+± °901#"'53265Ò:A$/ ý†B:p[ÿÿÿé% D6À(ÿé¯% n²+± é²+± é² +²+± é°!/°Ö±é°±+°2± é±"+±±99° °9±±99± ³$9° °901"&5463253327#"'"2654& d‚ab3Š00M-k4M4BBhBA¤yz¥OFþrZ`Ç_KJ^\JM_ÿÿÿ÷‡3 ñ¯ÀAÿéEÙ #i²+²+± é²+± é² +± é°$/°Ö±é±!22°± +±é±%+±°9° ² 999±°9°°9° °"901"32654'2#"'#4632&#"6whBA54BWa‚‚ac2Œ:A$/ 2°]JM^^JKÔ¡}z¤N7]B:phOÿÿÿé% F.À ÿÍ%#,f²+±+ é²+± é² +³@! +´& +±& é°-/°Ö±é±.+±²999±+±99°&²$)999°³ $901">32#"&''7&54632#.&#"325r Pi4&<#1@-1G$ :LP#†ye}† -= L C´±.#5$55Q*  ( Z:C_Š˜pc5-þÊ* (ÿ&nÙ #g² +± é²+± é²+²+± é°$/°Ö±é°±!+±22±é±%+±!± 99°°9± °"9°°9°°901"2654&"&546323327#"&=*4BBhBATd‚ab3Œ /$A:4°_KJ^\JM_þ9¤yz¥Oüèp:B•N(ÿénÙ #g²!+² +± é²+± é²+± é°$/°Ö±é°±+±!22±é±%+±± 99°°9±!°"9°°9°°901"2654&"&5463254632&#"#5*4BBhBATd‚ab3:A$/ Œ4°_KJ^\JM_þ9¤yz¥O‡B:pýÂ7N(ÿé%V²+± é²  +³@ +²+±é´ +´+° /°Ö°2±é² +³ +±!+±±99012#"&'332>7!&54>3&#"%t†„s[ˆŠP"- þ– 3EBH× ]17%ˆ‚•_PD+- EkA*æ{@ÿÿ(ÿé% HGÀÿé ::x²+±é²+±é² +³@ +² +³@ +´ +´+°;/°Ö°2±8é²8 +³ +±<+±³ ,/8$9°´!)56$9°±+99017327".547!.#"#>273>7#".'¨71] l#BE3 j -"PŠˆ¶=Hj'    !/ $ (†Ï;@{æ*AkE -+DP_0E/o?   Ã+S954.#"#>3273>767#".'#"'§+'h25GG43h&05)óA! ïPh65gg5#f#6 ,0,65-¼¡N(5,¡$N^HD]N&ÿ&.V²+± é²+´ +°3± é°2°/° Ö°2±é°2² +³@ +²  +³@  +±+± °9017#"'53265#53533í:A$/ CCŒAÏþÓB:p‡ÆÆ‡(ÿ&c° /Œ²+± é² +²+´+² +³@ +²"+± é²/+°-/±( é°0/°Ö±é°±+± $22± é±1+±°9°µ"$9° °(9±°9°°9°"°$901"32654&#"&53326=#"&5463254632&#"&3?>26EEɇzn‘R5B'C/dy€`Z<:A/ )°`MI\RSWVþ>_iTE?=1I,"š~}§\kB:p#(ÿ&[% -’²+± é² +²+´+² +³@ +²#+± é²'+±, é°./° ֱ鰱+° 2± é±/+± °9°¶#%$9° °'9±°9°,´ *$9±'±%)9901"32654&#"&53326=#"&54632632&#"&3?>27EEȇzlƒ‘R5B'C/dy€`Z<E#7 °`MI\\IKbþT_iSF?=1I,"š~}§\[r(ÿê&R² +²+± é²+± é² +³@ +´  +±é°/°Ö±é±+± ° 9± ±9901"327#53#'#"&54632#.&r=5BXèZ?Nx…†ye}† -µ±OZCiþù3”†Š˜pc5- ÿ%" "_² +´+²+°3°#/°Ö´ +° ±+´+±$+± ±99°± 99°±99±³$9012654.''4>7373#"&"  y"¶›qrš¸; \GD`‚%.#6,Jõõþpm+FYY ÿèƒ&3—²+± é² +° 3± é² +±) é² +³@ +³@. +°4/°$Ö± é³-$+±.é°./±-é°±+±é³+±é±5+±-± '99°± 99°± 99±³$'$9± )° 901%4'3262632#4.#"#".5467&#"#>}92$¸5IM3B~-A$;@!$C@'9/ #,5&Ã"]Of4==={$?8~%6P**R7%€>;+:\4! Aÿ&$G²+± é²+²+°3°/°Ö± é° ±+°2±é±+± °9± °901##"&5332653$Œ:hV_ŒZ3>ŒÚWbYxþ¥a:0R@ÙS²+°3² +± é²+± é°/°Ö±é°2°±+±é±+±° 9°± 99±°9014#"#4632&#"632#ŽV/=Œ:A$/ :d 97 ŒJd<.þ¼]B:ppW'N5þ–Aÿ&Ù'a²+²+±$ é² +± é²+± é°(/°Ö±é°2°±'+±é±)+±° 9°'² !999°°9±°9014#"#4632&#"632#"'53265V/=Œ:A$/ :d 97 :A$/ Jd<.þ¼]B:ppW'N5þ8B:pÙW²+²+±é² +´  +°3± é°2°/°Ö± 22±é±22² +³@ +² +³@ +±+01#5##5#5353ÚŒÐDŒ@@ŒÙ}}þ}‡ÏÏ‡ÆÆAÿé )² +± é²+°/° Ö±é±+± ° 9013327#"&5AŒ %.A:þgp9B E²+± é°2²+± é°2° /°Ö°2´ +°2´ +± +±± 9901!#3!53#DDþð@@‡þò‡‡ÒÙ² +²+´  +´ +² +³@ +´  +´ +²  +³@  +°/°Ö´ +°± +°2± é°2° ±+´ +±+± °9± °9012673#"'#&#"#6323O!N vŒ NxŒ Z#’þóa#‘&þ†ûÙ_²+²+´ +° 3± é° 2´ +±é°/°Ö±é°±+±22± é°2²  +³@ +±+±°901";=33##5#".54>7¿**,Œ„„Œ-7%(O4³66{«þ¤þþ5$45#Aÿ&Ù )² +± é²+°/°Ö±é±+±° 9013327#"&AŒ /$A:^7üèp:AÿqÀÙ|² +± é²  +³@ +²+²+²+²+± é°/°Ö±é°2² +³@ +°± +± é° ±+±é± +± ³$9±²99901#"&'332654&'9!#3!.>T‡qmˆd.;*#6sþÅŒŒæ\Nh{}jo h² +°3± é°2²+² +±33°!/° ֱ鰱+±é°±+°2± é±"+±° 9°°9°°9± ±9901##"'#"&533265332653>Œ#C.j)32632#"'532654&#"#4&#"#A‹#C.j):A$/ NWbYþ–Ma:0þ^B:pAÿ&f%c²+²+± é²+²+± é°/°Ö±é°2°±+±é±+±°9°°9± ±99°±99°°9013632327#"&54#"#AŒ:hV_ /$A:Z3>ŒNWbYþWp:B«a:0þ¼A0 B²+°3²+°3° /°Ö±é°±+±é± +±±99±±9901##30 ÃŒ ÃýäRþ®þ®Rÿÿ(ÿé>%8(ÿéL% “² +±é² +± é²+±é²+± é´  +± é°!/°Ö±é°± +°2± é°2² +³@ +³@ +°2±"+± ± 99°° 9±° 9°°9°°9±°901!3#!!#"&546325!&#"327Hþýááþl7Eƒ‘ƒ?8–þj!U?JJ?S# JˆP~ž…„• ³CWJKYC(ÿ÷(4t²0+°,3± é°2² 0 +³@  +²!+± é°5/°Ö±é°±+± é°±+±&é±6+±± 99°±.99°°!9± 0°.9°±&9901%4&#"32>=332>%4>2#"'#".¡{~x &#”#.& ý‡5S‹´‹S5-<< d;9f0N@#ïcKZT)' ––)&*,OQ:%$:QO-9Y8$DD8e(ÿ7¢Ù n²+°3± é°2² +³@ +²+²+° 3± é°2°/°Ö±é°±+±22±é± 22°± +±é±+±³ $901%>54&'#5.67531::½0;:1u‚…rŒtƒ„sŒ\V]Œ]Oþ© \DH^y—ƒ|–³²˜˜´ÿÿÿøD U…ÀÿøAÙ1²+²+± é² +°/°Ö° 2±é±+± °901!#5#"'53253AŒP0 {Œk7<Ž{Ûÿ'‡=²+± é² +± é²+°/° Ö°2±é±+± ° 9±°9013327#"&=#"'5325¹Œ /$A:P0 {ý¥p:BÈ7<Ž{Aÿ8t%,²+²+± é°/°Ö± é°2±+± °9013>32&#"#AŒP0 {Œj7<Ž{þAÿ&t%=²+± é²+²+± é°/°Ö± é°2±+± °9± °9013>32&#"327#"&5AŒP0 { /$A:j7<Ž{þ¢p:BA¶%?² +²+± é² +³@ +°/° Ö± é° ±+±é±+± °901#4&#"#4632¶ŒŒ_VÀj7*-4þ³jYb#ÿ8˜%@²+± é²  +³@  +³@  +°/°Ö±é°±+±é±+±°901432#4&#"##ÀV_ŒŒj»bYýÎ4-*7A;Y² +°3² +±é´ +±é°/° Ö±é°2°±+±é±+±°9°°9±°9°°901#'##!23264&+!K6›³,Œ#6N'þ¬z,#%*zESÚÏÏ03_BÿÿKE ¶OÀÿ&>%9µ²++±é²+ +³@9 +²0+±5 é²+±é² +³@ +°:/°8Ö±-é°2° Ö± é°-±+±&é±;+°6ºìùÂå+ ° ° À±#ù°$À³ #$....³ #$....°@±8°09± ´*+$9°&±99±±&9901732654&/".54632#&#""'#"'5326=Ü+<17§   wgm|‡d%,±j1b†3:A$/ "$4 SaaVI 3i;:#UB:pÜÿ&4Ù9²+± é²+±é°/° Ö±é±+± ±99± ± 9901#"'53265432&#"æ:A$/ Š)'&Fý\B:p‘‡iÿ&=Ù_²+± é²+±é´ +°3´+°2°/°Ö°2±é°2² +³@ +² +³@ +±+±±9901##"'53265#53432&#"=S:A$/ LLŠ)'&;]þÄB:p]‡i*þõÿ&*07²+± é°/±é°/°Ö± é±+± ±99± ± 99014#"5632327#"&5\&')Š /$A:*i‡þp:Bÿ&'Ù"-e²#+±é² +±) é²+±é°./°Ö±&é°&±+°,2±!é°2±/+±&°9°!± 99±#)²999°²!99901%.'#".54>32432&#""3265&') I 5*El<( (P6#-Š)'&TþË I * q")1&/&13 ö‡i*ýó5- ÿÿ ÿm,& WAÀÿ&-¢^² +±é°/°3´+°2² +³@ +°/° Ö°2±é°2² +³@ +°2²  +³@  +±+± ° 901#327#"5#5353-N "/‰EEŒ]þ$b ]‘‘ÿét}²+²+± é² +°3´  +±33± é±22°/°Ö° 2±é° 2² +³@ +°±+±22±é°2² +³@ +±+±°9±°901!#5#"&=#53533533#!326=1Œ:hV_??ŒËŒCCþ©Z3>@WbY+‡ÆÆÆÆ‡a:0(ÿé°)n² +±é²+°'3±é°2°*/°Ö°2±é°±&+´) +°2°)±$é°$/±++±°9°&±99±³$$9°±&9901#".5467#5!32>54'5!d#)/EvILxD-)#JŽ &C*,E%Ž¢&]-54.'7C324&#"2:Ibuþû ù¤þ÷XS;<  5¨z.``q:qqþÆ4Q#ÿq e² +± é²  +³@ +²+²+± é°/° Ö± é° ±+±é±+± ±99°³$9°±99± °901#"&'332654&'9#5!x>T‡qmˆd.;*#6sù¤\Nh{}jo32#54>54&#"(/OJ+n‹2F-|#22#<-.@áPo4€f?R1 &1ÉÉ;S-%3#1BHI(èa²+²+± é² +³@ +°/°Ö±é°±+´+°±+±é±+±°9±² 999±°901#4&#"#54&'.54632ˆ@.-<#22#|-F2‹n+JO/áIHB1#3%-S;ÉÉ1& 1R?f€4oÿÿ(ÿñÙ 5<ÙÀAÿ7)ã9²+± é² +³@ +° /± é² +³@ +°/°Ö±é±+0132673#"&54632#.#"Í=5). † bx…†ye}† -+"0 ÂþOZ-4aq”†pŠ˜pc5- 87ÿÿ(ÿé>%#y±!RÿÿA ™,ÿö#'w²+± é²+± é´  +±é°(/°!Ö°%2±é° 2²! +³@ +°±+±é±)+±!°$9°±99±°!9° ³$%$9±°&901%2>54&#";#"2#"5467&4605,Zh34GG52tLe46hPï !Arg-56h=6#f#5¼&N]DH^N$¡,5(œS(ÿéZ%&[² +²+± é²+°3± é°2´  +±é°'/°Ö±é±(+± ° 9± ±99°±!#99°°901"327#53#'#"&54632632&#"#.&r=5BXèZO'x…†yM5#>)'-† -´±OZCiþú”†Š˜ i)$5-ÿÿA$¤ÿ&'Ù %)l²+±é²+± é²)+±(é²"+°*/°Ö±é°±!+± (22±$é±&22±++±!°9°$°9±² 999°² !$99901"3265&%.'#".54>323#5¿ I *>) I 5*El<( (P6#-ŒTTŒ- "q")1&/&13 Àþº}}ÿÿ!ÿ@  NKÀ<˜,²+± é²+°/°Ö±é² +³@ +±+01)33˜þ¤ŒÐþU(ÿ&n° !g² +± é²+²+± é°/± é°"/° ֱ鰱+±22±é±#+±± 99°°9± ° 9°± 99°°901"32654"&463254632&#"#_jAA54B—d}ad2:A$/ Œ1°^˜]\JOþ–¢ø£YhB:pýX(è%•²+²+±" é²" +³@" +´ +°3´+°2°&/°Ö±%é°%±+°2´+°2² +³@ +² +³@ +°±+±é±'+±±"99°± 99°° 9±"°9014>323##5#5354>54&#"(/OJ+n‹2F-VV|YY#22#<-.@áPo4€f?R1 &1]ZZ];S-%3#1BHI(è%‘²+²!+± é²! +³@ +´! +°3´+°2°&/°Ö±é°±+°2´+° 2² +³@ +² +³@ +°±+±é±'+±°9±² !999±°901#4&#"3##5#5354&'.54632ˆ@.-<#22#XX|WW-F2‹n+JO/áIHB1#3%-S;]ZZ]1& 1R?f€4o(ÿé×Ù!ˆ²+± é²+± é²+²+± é²+± é°"/° ֱ鰱+±22± é°2²  +³@  +³@  +±#+±±99±°9±´  $9±°901!!5#"&546323"2654&Îþ÷ýÉ4ad‚ab3Œþþ4BBhBAÍ÷qþÆq7N¤yz¥O½l_KJ^\JM_þÞ"(ÿqÝÙ%4©²*+± é² +±! é²+² +²+²+±& é²+± é°5/°Ö±é°±#+± 22±&é°2²&# +³@& +°&±-+±é±6+±#± 99°&° 9°-±99±!*³ '-$9°&µ#2$9±°901#"&'#5#"&546323!%"2654&332654&'9K>T‡qTud4ad‚ab3Œ¤ýZ4BBhBAÍRd.;*#6s\Nh{KD7N¤yz¥O½q_KJ^\JM_þ­o32%"2654&Ë 5tIbuþ4ad‚ab3Œ¤þ÷XS;<ý?4BBhBAÍùw7z.``7N¤yz¥O½qþÆ4Qº_KJ^\JM_þÛ%ÿé¢9ϲ0+±é²+±!é±322²! +³@! +²! +³@7 +°!´5+°2°:/°2Ö°62±é°82²2 +³@ +²2 +³@24 +°±+±$é°$± +±*é±;+°6ºìùÂå+ °° À±'ù°(À³ '(....³ '(....°@± $±99°*±99±!²$*99901#3%2654&/".54632#&#"#!"5#5353-N08§   wgm|‡d%,±j1bCþĉEEŒ]þÚ$4 SaaVI 3i;:#L]‘‘ÿ&8Ù"*޲+±)é²+± é²+±!é´ +°$3´+°2² +³@ +°+/°Ö°2±&é°2²& +³@ +°&± +±#22±é±,+± &°9°±99± °9±!°901#"'5326=#"5#535335432&#"#32ê:A$/ '[‰EEŒŠ)'&Œ4Fý\B:p2 L]‘‘A‡iýæ^þÚ$ÿé¢AÁ² +°3±0é² +± é²;+± é±#+22² ; +³@ ? +° ´%+°)2²% +³@%' +´ ' +± é°B/°"Ö°&2±-é°(2²-" +³@-+ +²"- +³@"$ +°-±8+± é±C+±8-°09° ²56999±0 °9°°29°³56$9°³ 8$901%&#"32">32#"&'#"5#53533#32>7&54632#.Ž L CBr Pi4&<#1@-1G$ b6 ‰EEŒNN #†ye}† -~* Z±.#5$55Q*  L]‘‘]þÚ$C_Š˜pc5-ÿ&&Ù/ ²+°3² +± é²&+±+é²+²+± é± 22°´"+°.2°0/°Ö°#2±é°-2² +³@! +°±+°2±é°2°±+±é±1+±°&9°°(9±± 99°° 9±"°9013632#"'532654#"####535432&#"3CŒ:hV_:A$/ Z3>Œ]ŒLLŠ)'&]NWbYþ8B:pŒa:0þ¼´þL´]A‡i*5AÿéÎÙ2¬²+²0+±é²+²+±"é²" +³@" +°3/°Ö±é°2°±+±%é°%± +±+é±4+°6ºìùÂå+ °°À±(ù°)À³()....³()....°@± %³ 0$9°+±99±°9°"²+999017#332654&/".54632#&#"#"&ÍŒŒE}K17§   wgm|‡d%,±j1bCjf**ÙýÕ3$4 SaaVI 3i;:#AzÙ H²+± é²+²+± é° /°Ö± é°2²  +³@  +³@  +± +± ± 9901!!3qþ÷ýÇŒùqþÆqÙ½qþÛ%ÿÿÿÿÿä.Z )™Z …)™mÒzX° /±é°´ +° 2°/±é°´ +°2°/°Ö°2´ +°2°± +°2´  +°2±+01!#5##!#5##¾död¾dödz¥CCÃ¥CC ÿ&EÙc²+± é²+²+± é²+°/°Ö±é°±+°2±é±+±°9°°9±°9°±99° ±9901##"&54&#"563232653EŒ:hV_ /$A:Z3>ŒÚWbYšp:Bþda:0R þÔ†Ù%k²+± é²"+± é²+°/± é°&/°Ö±é°±+°2±é±'+±°"9°°9°°9±°9°±99°±%9901732653327#"&57#"&54&#"5632îZ3>Œ /$A::hV_ /$A:Áa:0RýSp:BðWbYšp:Bÿÿ†TaKÿõ‡)™ÿÿ†S`ÿõ†)™ÿÿö¢_M„)™ÿÿ'†ðìUÿý†)™ÿÿ éåUåÖfÿÿ øæ†)™ÿÿ0†zæ ¶€åÖfÿÿ…åZ†)™ÿÿ øcæ\‡)™ÿÿ(ÓÏæ]ÿÿ(ÓŸæ&]]ÐÿÿDâ¾Ù\»ÀDâ¾Ù @²+± é°/´,+° /°Ö°2´+´+°´  +° /± +0135>5#DzE5"?Ùg=Q.+'Dã¾Ú :² +± é°/´,+° /° Ö´+´+°2´ +± +01#.=¾?"5EÚp'+.Q=gt=þ@°/´ +°/´+°/° Ö´ +²  +³@ +°2±+± °90132+53264&+t/BB/ B./B^  ÿÿc=í^a[À xDQ°/´ +² +³@ +°/°Ö´ +°± +´  +° ±+´ +±+± ±9901#4632#5254&#"`WHWHT7>Uq#IcB\MA)SwÀ9! xDQ°/´ +² +³@ +°/° Ö´ +°± +´ +°±+´ +±+± ±99014#"3#5.54632íI#qU>7THWHcN!9ÀwS)AM\B !Aw²+´ +°/°Ö°2´ +°2±+°6ºÁÂÏ+ °.°À±ù°ÀºìîÂè+ °.°À±ù±°À´.....²...°@015% 5µµƒ6bE79Eÿÿ  AbL<À/4ý8°/°3´ +°/°Ö´ +±+±³$9±°9013#'#3tIDEIýÍ}}ÿÿ/4þdM-À_Fõ+°/°3´ +°/°Ö´ +±+±°9013#'#tkgNRRLõ–dd _Gõ-°/´ +°2°/°Ö´ +±+±±9901#'373ÛkgNRRL_–aaLÏ'°/´ +°/°Ö´ +´ +±+01#53ÏPPLÅÿÿl;»qÿÿ_Øõv›ÿÿ_ÕõCdþý¬ÿÂ'°/´ +°/°Ö´ +´ +±+01#53¬HHþýÅÿÿÿi<ÿ¸qüýÿÿNÿFÿÜC=üçÿÿÿFØÿÜjüçÿÿMÿ1&qqL1ÀMÿ1 °/´ +°/°Ö´ +±+013N°X1 ÿÿ^ÿéèÊ_KÀÿÿWÿéáÊ_ÿôý¬†MœA°/±é°2² +³@ +°/°Ö´ +² +³@ +² +³@ +± +017533!5udtþ³ê²²ddÿÿ‹M¡tM'ÀcM± U°/°3±é° 2² +³@ +² +³@ +° /°Ö°2´ +°2² +³@ +² +³@ +± +017#5#53533ØdtudtØuuduudØM<°/±é±é°/±+01!5Mþ³3232?YG ?2)$G í :B ÿÔbTõ$°/°3´ "+°2°/± +±°901#7!#7˜~FF:~FFõ““““ÛMI&°/± é² +³@ +°/±+±°9015732>7".'SG,!    ),( JŒiTŒV)­!.G3#FÿÿZMš#G™D0 ÿÿ ùhç‡)™ÿÿ8…”`O†)™ÿÿsYèVƒ)™ÿÿ…bå[†)™ÿÿÿ÷†7j5ÿ݆)™ÿñÕ -²+°/±é°/°Ö´+² +³@ +±+01#!5Õfþª üÑÉfÕ =²+²+±é² +³@ +°/°Ö°2´+² +³@ +± +01#!5!5ÕfþªV üà$f–Õ ;²+°/±é² +³@ +°/°Ö°2´+² +³@ +± +01#!5!ÕfþªV üà_f[Õ ;²+°/±é² +³@ +°/°Ö°2´+² +³@ +± +01#5!5!ÕfþªV üà–f$Õ 5²+±é² +³@ +°/°Ö´+² +³@ +±+01)5!3ÕþDVffº9îg5²+±é² +³@ +°/°Ö´+² +³@ +±+0133!9fOgýÿf9îo;²+°/±é² +³@ +°/°Ö´+°2² +³@ +± +01#3!ŸffOþþoþúgÿÿ ÿHKÿÞgüéÿÿ < &q´qRÿÿ8â€ÙHÿÿÿ(4ÿödM&Àÿÿÿ(/ÿödÿûüùÿÿ ÿBÿûbüßÿÿ þùBÿôcüÙÿÿLÿ8ÿìzÿÿüêÿÿ"‡ækÿ(ÿÿ‡…'kÿ(k°ÿ(ÿÿ…‡'j¯ÿ&jÿ(ÿÿÿkyÿë| üþÿÿ2AÈIA ñ¿ü6°/±é² +³@ +°/°Ö´ +´+´ +±+013## ¶Pfüf¥ ñÁüB°/±é² +³@ +°/°Ö´ +°´+°/°´ +°/±+01#5#5ÁfPüþõ¥fÿÿ ÿ¨¿³šÊ¤Àÿÿ ÿ©¿´™È¥Àÿ:0ÿÃ<°/± é°2± é°2´ +°/°Ö´ +°±+´ +± +01!533530þîNvNƉ;;ÿ8/ÿä6°/´ +² +³@ +°/°Ö´ +² +³@ +±+01!53/þïPxP¬\ÿëÿ\ÿû-² +°/´ +°/±+±±99° ± 9901#.'>7\ý$$Y 2($#Y=+$N ,&!+ÿÿþÁ_ÿ…õCþ°ÿÿÿ)_ÿíõvþ°ÿÿþ¸\ÿöòfþ°ÿýÿÿþ­pð|þ¶ÿÿþÆlÿñ»qþ¶ý¾€Ð ²+´ +²+´ +°/01!5ý¨ÐPPÿÿþÖ]ÿÞìxþ³ÿÿÿ&mÿ”çyþ¶ÿÿþÃmÿõçjþ¶þä4ÿ}õ\² +´.+°/´ +°´,+°/°Ö´ +°±+´ +±² 999± ± 99°° 901#532654&#"'632Û,, %(04F@ 2&$3ÿÿÿNÿ´zþ³ÿÿþ‡bõ}þ³ÿÿþ¼_ÿúõgþ³ÿÿÿ.Lÿ~hþ¯ÿÿþéLÿÊ&­»­Lþ‡bõ °/°3´ "+°2°/±°9013#%3#½~FFþÆ~FFõ“““ÿÿþÖ]ÿÞJ#xþ³yþ³cÿÿþÖ]ÿÞì xIÀÿÿÿ:ÿ‰ø ³þÇ+Àÿÿÿ>3ÿÂñòþêÿÿÿ;3ÿ¿ñ*þêÿÿ)„ç³Âÿöÿÿþúÿ;ÿ¾ÿÑCþéüÜÿÿþûÿ=ÿ¿ÿÓvþ‚üÞþßþÔÿÄÿÔ=°/±é² +³@ +² +³@ +°/°Ö°2´+² +³@ +013#5#53¢ff,ÿMfÿÿþßþÔÿÄÿÔ¸þ£þ¨Àÿ3¡cÑ1²+±é² +³@ +°/°Ö´ +² +³@ +01!#5#Í0dÌÑþÐÌÿh©R  3²+± é²+°/°Ö´+² +³@ +±° 901+532654'7R®5#âzF4$CDl2I.-ÿÿþÎÿ$ÿÙzþ³ÿÿþàÿÿ¿{þ³ÿÿÿ5ÿÿ…ÿÔ­üÃþÏÿ;ÿáÿÄ8°/°3± é± é°´ +°/°Ö´ +°±+´ +01!#5##þÏNvN<‰;;þÀÿ9ÿòÿ³j°/°3´'+°2² +³@ +±22°/° Ö´ +°±+´ +°±+´ +±°9°°9°°9±°901#"'#"&=332=332=7%"#$74%&4%&M"$44$""$$""$$"ÿÿþ¼ÿ8ÿúÿÎgþ³üÙÿÿþ±ÿ8ÿïÿÎ gÿø-ÀÿÿþÖÿ=ÿÞÿÌxþ³üàÿÿþÓÿ8ÿÛÿÇ xÿþ$ÀÿÿþªÿM ÿÍ|þ³üàÿÿþÃÿLÿîÿ›qþ³üàþHÿT~ÿ¤°/´ +´ +°/01!5~ýÊ\PPÿÿþ<þþrÿÉ&Òô%Òôªÿÿþ0Øÿ’X|þ9þkÿÿþYÝÿ„,qþIþqÿÿýÚâ2Òÿ’ŽýCÿóh3#YLýœLhý›ýCÿÃÿóí3#YLýœLíüÖÿÿÿ5ÿÿ¿ÿä¼þƒþØÀÿÿþÏÿ:ÿáÿÃÊþ°þþÀþ½þÔÿÂÿÙ4°/´ +°/´ +°/°Ö´ +°±+´ +01!!75#þ½þû¹m'þûLmmþ ÿRÿÒÿÅZ°/°3´.+°2°/°Ö´ +°±+´ +°± +´  +±°9°°9° °9±°9014632632#4&#"#54&#"þ 3%&'$3,,“%34$ÿÿþ².ÿòG™þw%0 ÿCÿ‹U/°/´*+°/°Ö°2´  +³ +´ +°2015654&547à%&l%%7D0 g9 0 d"ÿÿý¸QÿîÓÿ|SÿÿþÄ`ÿˆöCþ³ÿÿÿ)_ÿíõ¡ÿÿþ­pð|þ¶ÿÿÿ>3ÿÂñ³ÿÿþµX þ¶ÿÿÿ5ÿ8ÿïÿÑþ³ÿÿþÏcÿáìÊ(ÿÿþ¾þîÿêÿ¸&Ñû¢Ñüÿÿþ½ÿ ÿŸÿÎ&ɈúÉúþãÿÿ‘ÿÀ8°/´ +´ +°´+°/°Ö´ +² +³@ +013#5#þã®[S@®Wþ†Dÿè!a²+´ +°2³+´  +°/°Ö´ +°±+´ +±°9°³ $9±±99± °901#7&#"#>32733273#"/Þg??2)% `. ?Y Dh:B 4O0 ÿÿþ™ÿû„#|þ¢&#yþÑyþoÿ°ÿÿþƒEÿåR#|þŒÿØ|þŒeÿÿýÿÿÿ»ÿÒG .ýìþñ $~þ~þÔÿpÿß 2°/´ +° /°Ö´ +±°9±´ $901#5'67'ð3("?9B7"=þÔ¨"7/JI0MJ=-@@-=Jýíÿ ÿ³ÿß%1`°/° 3´ +°&2°#/°,3´ +°2°2/°Ö´ +°±)+´ +±)µ !.$9±#·!).$901>32#".'#"&546323267&#"2654&#"þÐ028;*63+::0 9„"00aC$'BB'#D"I)8)þ™4ÿ¯P(°/´ +°/°Ö´ +±²9990137#7#þÜa$–E_'˜Pe¸_þ£ÿ ^ÿÏ?° /±é² +³@ +°2°/°Ö´ +°±+´ +±± 9901>73"&'.'326Ô*L0M$z|y$M0L*"vvwtHB  BH ÿÿþ§9bûü,þ¬TT³°/´+´+°/01!!þ­¦ýZ³_ÿÿþ¬ÿeTÿÄþýþ—T[`°/±é² +³@ +°/±é² +³@ +°/°Ö´ +°± +´  +± ²999±°9±°901#43232653#"/&#"þàH¹,-·) 6*Q#G0?E™!!0 m¯E&%$5#? ÿÿþ£†^HüUÀþÄþèEÿõ ²+°/´ +° /±°9015!'7'7þÄÎ7>/6FF6/>7¸L2/**32**/1ÿÿþ§9ÿdDþ˜BQÿÿþ•:ÿUHþ†CQÿÿþä?ÿULþÊ?Qÿÿþ”:ÿ`Rþ…CQÿÿþ­:ÿeXþ•CQÿÿþ·;ÿrFþ¨DQÿÿþ¨:ÿmXGþšCQÿÿþ·9ÿlPKþž:Qÿÿþk<ÿŽ PþS<Qÿÿþß<ÿU UþÇ<QÿÿþÏ:ÿ=DWþÇCQÿÿþ“:ÿZYþ:Qÿÿþœ:ÿb[þ—:Q8[I(°/´ +°/°Ö´ +±+±°901#7IÑ@[ºº:ÿFK"²+´ +°/°Ö´ +±+0173:Ñ@[ººº‚ÿ8<ÿÑG° /´6+² +³@ +³@ +°/°Ö´ +°±+´ +±+±° 90132>73#"&=3Ý  ';1'[o  *,A,ÿÿ2ÿRÈÿÿ]_!õ¡4ÿÿXM  P°/± 33±é°2² +³@ +° /°Ö´ +°± +´  +± +± ²999° °901#7#5!#5þBF4XLX ´´Rbbbbÿÿ ¯õ&Äqv(°/´ #+´ #+°/°Ö± é± é±+01#5–’’ÿÿúõ&£#‰ÿÿõ&£%ÿÿ^õ&£'xÿÿÿéøõ&£-ÿÿ¹õ&£2Åÿÿ5í"£Ò6>ÿÿÿèÿï…"éF:ÿÿ ¯Ù$ÿÿ1yÙ%áPfÙ,²+²+± é°/°Ö± é² +³@ +±+01!#!fþ|’Sý­Ù ÞÙ"²+±é²+°/±+±°90133'  ‘*Ï¢˜Ùý'}¨þXÿÿPqÙ(ÿÿBÙ=ÿÿPÙ+(ôÖ#O²+± é°/± é°!/±"é°$/° ֱ鰱+±é±%+±³ !$9±"!³ $9012#".54632>54.#"!5!Ž¢ÄÌš-[cJ1Æ7sb&FD(,;7lk‘þˆxÖÅ¥¤Å2MQªÈþh3cD7X4" ‰›zÿÿPæÙ,ÿÿPÓÙ. ¿Ù!²+°3²+°/±+±°901#3#]Ã~$•ýåÙý'Pÿù>ÕF²+±33²+°3°/°Ö±é°±+±é±+±± 99±² 99901###3673>‘©}¦‘¿ `,,!„¯Çþ9Íþ3Üþüa^IPÿø¶Ô H²+°3²+°3° /°Ö±é°±+±é± +±°9±°9±±9901##33¶‡þ¯Ž‰QŒáþÜþâ2zÙ )² +± é²+± é´  +± é° /± +01!5!!5!!5!jýÈ88þ>ÂHý¸HZþ]þKÿÿ(ÿéæå2Pÿù²Ô/²+°3²+± é°/°Ö±é°±+±é± +01#!#!²þ¾b[ý¥ÛPÿø¤ÔB² +² +± é´ +± é°/° Ö±é°2°±+± é±+±°901+#!22654&+¤ '>mGŸ'*;M4/þÝQ>DMŸ÷ :A.þéÜ.Mš229'Ć٠2²+± é²+± é° /±+±°9° °9°°901!!5'5!!0¸ß­ý˜åÃ2þ†þú€uâq€~Ü:²+²+± é°2°/°Ö±é² +³@ +² +³@ +± +01###5!~îìj\ý¥[€ôÙ0²+²+°3° /°Ö±é± +±°9±°9013#3}ˬþËþÖ¯²'þZþÍ3¦(ÿóíÓ%v²+²+´ +°3± é°2´  +° 3± é°&/°Ö±#é°#±+±22±é±22°±+± é±'+±°9°± 99° ² 999014>753#5.%4&'>(2DX;ƒ¢2CX;…¡8RACPþèARU\Fn=( OO¨xEm;' GG¡~CYþ¤]l\XDKZ ÿùØ&²+°3² +°3°/±+± ± 9901#.'# 3>73µŠ# ²,þ÷¯Š¨þî'µ3ÿ`"¡,'«þ¤FÿöúÜO²+²+±33´  +°3± é°2°/°Ö±é°±+°2±é°2°±+±é±+01##5".5332657ú1JJ/0CO/!Œ8RˆIAŒq:W3 ŽŽ1[?kþ¥A8Õþ+1H[(÷íi² +°3± é²222°/±é°/°Ö±é² +³@ +°±+±é°2±+±° 9°±99°°9± ³$9014&#"!53&54>323!56hye^u®þÃ{vR¡h§Èzxþ¸»}iŽk¼HvzbŸb§iÒœ§^zuKÿÿ3„#jÿô'ÿÿ ù„#jê2ÿÿ(ÿñxû#¢>ÿÿ(ÿöõ' Bÿÿÿ8$õ'ÈD ÿÿ<ÿïKõ"þFÿÿ<ÿð$#™R(ÿñxk²+°3± é°2² +³@ +²+± é°/° ֱ鰱+± é± +±°9°²999±±99°± 99°°9014&#"32%4>3537#"&'#"™6@xvxþ 2EA#]6{"%D,/ =Uû @]¡¡?c<'/)þWr)<ÿB0Ñ(в+± é² +³@ +²+± é´"! +±" é°)/°Ö±é°2°±+± é°& Ö´+²& +³@&! +±*+±&²999±° 9±°9°!± 99°"° 9014>32#"'#"32654&+532654&</[Aju=w~gW1‡ì<)_+AJþÃ:2;07s>(%- ÿ93$.² +± é°/°Ö±é±+±°9± ±9901#5&#"'46323ćŽ & 154^~þñðL6d*<êD(ÿýF×-b²(+±é²+± é°./°Ö± é° ±+±#é±/+± ±99°³($9°#²999±³ #$9°°901%2>54.#"'4>7'5!##"./+; 9)9HŒ!,<'ŸÀÙq2+O_>"@J7$x0/,0T>”Œ;]4& igrL13Q.Om: #7b(ÿö#)s²+±& é²& +³@& +²+± é² +³@ +´! +±!é°*/°Ö° 2±$é°2²$ +³@$ +±++±$° 9±!&°9°° 9°° 901%#"5467&546732#.#";#"32674cHï !A|s E`26Eh34GG52hE6®*89¡,5(NVI:9(!'6#f#5' (ÿ*ìà!¶² +²+± é°"/°Ö±é°± +±é±#+°6ºòŸÁj+ °°À±ù°À³+°³+² Š Š#9²9µ......µ......°@±±99° ± 99°² 999± ±99°°9017'654&#".5467#5!¶"7BB7"1|+/C>6!eX­–HxXï-7 9.=x-Y %3Q2sÍIxb)l£ ÿ8$R²+²+°3± é°2°/°Ö±é°± +± é±+±±99° °9±°9°±9901'632>32'4&#"#4#"!7#=U,n]Š!2qŠ žr<ptýù%Þ76ŒþÔª (ÿð+Ù#W² +± é²+± é´  +± é°$/°Ö±é°2°±#+°2±é±%+±#² 999±±99012#".54>.#"32>7J@H3!8gK=ZG$!3HÛ:7n:7$0Ù1O‰[X€h5$S”j[‰O1þÛg[Âsp\!A<.<ÿïK/²+± é² +°/° Ö±é±+±°9° °9017327#".53Ç00M-0.‹ ,"B.Œ<ÿø- 0²+°3²+° 3° /°Ö±é°2± +±±9901#'#373-¨¡‰‰ª¸áôÖ'©©Ö ÿóCã#=²+²+±é² +± é°$/±%+±°9°´ $9° ° 901#'.#"7632327#".'&zÇ )1!6"! ’  #!C(! \Nþ° 4 z9*# þ{p# ÷<ÿ6[b²+²+± é² +³@ +²+°3°/°Ö±é°2°±+±é±+±°9°°9±² 999°° 901%2653+"'#"'#32(<ˆ $7@0O:/ŠŠ7.547#5!#"ÕlˆBUP:)4:!2x)/>`P+-E/%=ªÁ"0ÿToA1,81#>x,m -T%Rÿîƒ!Z²+°3²+± é± 22°/°Ö± é² +³@ +° ± +±é² +³@ +±+± °9±°901%2>7#"&5###'!#5I@2¸ŽET?_uDH1þH¸vvþÑ<ÿ5R+#N²+± é² +°/± é°$/° Ö± é°2° ±+±é±%+± ±99±°9°°901#"'#4>3232654&#"R$7JE#G8Š2SV.#EJ7$þtK42ON3()Ag>($çàOs:'323!#"32>54&6>a;&3TW0 ""s*~$6 @A'*K %:NH%Pt;~AV}¿!45JZ !E1YLÿôL²+± é²+± é°2°/°Ö± é²  +³@  +² +³@ +±+± °9°°901"&5#5!#327U[=©Î +O TTrrþ÷ }<ÿð$7²+± é² +°3°/° Ö± é° ±+±é±+± °901%#".5332653$4aHMe2Š(CB'ŠÔ8N? AL7HþÒO67T((ÿ<ì!!p²+°3±é°2² +³@ +²+± é°"/°Ö±é°±+°2±é°2°±+±é±#+±± 99±²999°± 9901%2654&#4>7332##5"&ÔAPPAþT#:,Qk[Em‰§"BnE‹‡›pRB@W—8`A$dH[>Z±£{6`M.¶¶›ÿ9c1%@²+³ +±é²+°/±# é°&/±'+±#²999°µ%$901#"/#'."##563273327c*'P5L¢Ÿó‰$:L'k†”Ëz 3´a–ìoêw EÂôþ”ã2ÿ3¦D² +²+°3°/°Ö±é°± +°2± é°2° ±+±é±+± °901%>53#5.533°55Œ„rˆsƒŒ19ˆl9N$þÁlxÁÁwm?þÜJ=Ÿ(ÿñö!&†²+°3± é°2² +³@" +²+°3²+°'/°Ö±é°±!+±$é°$±+± é±(+±°9°!±99°$°9°±99° °9±°9°² 99901%2>54&'7#"'#"&546736=3!( =BD@tc\44\ctBC@@&-K†!e38!ToD)7±BvAAw?º0'BqU9S:ìì%ÿÿÿïKÛ"jóôFÿÿ<ÿð$Û#j…ÿôRÿÿ(ÿé>õ#²Lÿÿ<ÿð$#¤ Rÿÿ(ÿñöâ#ÿíV'ÿÛMó3p°/±$é²$ +³@$ +°)/°3±é°2°/± é°4/°-Ö±é³!-+± é° /±!é°±)+°2±é°2²) +³@ +±5+±)± $9901"3.'23##".'332>7!4>J x &;(CD#5U78U0 ƒ08$!ÿ&3yXW[Xz 53I:)z=`Z<#&8WK1]X-YB1CU9B,+ãé"N²+² +°3± é² +´ #+³ +°#/°Ö± é±$+±°9±°9± ° 90152>32&#"#54. 0N<@&†J.K1V4$"%’ "/JW’*U;W+2i=$DXˆR©©)6cDR3#ÿÿõ&£]­ÿÿã„"]j¬ÿÿ(ÿ7¢Ù(ÿÞö/)…°!/°3±é°2²! +³@ +°(/± 33±) é°*/°$Ö°(2± é° ±+±é°±+±é°2±++± $°'9°° 9°°9°± 99°°9±!°9°(±$9901%32>54'!326=3%##"'#"&5467#5Ò#''Aþ¿@S+ †#./)BG%[54\jm.™).?&rZ[q“(øžxf`Jq<DD s"q3xÿ‚%(M²+²+²$+°3±# é°/±é°)/°Ö± é±*+± °9±°9±#³ $901733#"'5326=&'#76544c{¤‰d%D=)"G2$ œ"w©\Ž_m>\_?‘”¦yF&Ó*+v9no­Y'"€ ?ÿÖ‚4&?²+³ +± é²+³ +±é°'/±(+± °9°µ"#$90127332>7#"&'#765.#"'>Ç;V y¤‰d(YP;4NP¦yF.="T/:MPŒo­Y*25L1>(ÿ->-/g²+± é°° Ö± é° /± é°(/±é°0/°Ö± é°+2° ±#+±é±1+±# ³ $9°±99± ° 9°(°9012#"'3263"#"&54>2654.#"1|‘&8LA"J5 )ND™-O{1QW05L))2M)(-žKr?( % „{=)Pv=þ,O`1H#N_4I"ÿÿ(ÿéæåa(ÿÛ>+I°/± é°/± é°/±é°/°Ö´ +´ +±22±+±±99±°901%#".54>;#"3#3>!qL$IQ>)~ptmÿÿPq„' ɾ|ÿÿPq„#j´|ÿ\üÙ#p²+°3²+±é°!2°/´+´# +±#é°$/°Ö± é°"2² +³@! +² +³@ +°±+± é±%+±°9±° 9012#"#53654&+##5!#"3R- $#3#F5!322654&+/B:!þ¾Þï& »?Z/÷7*03žß6S/ \¾þb‘2y þÚ&@FŠ+21+¹P4Ùd² +° 3±é²+°3´  +±é° Ö±é°/° Ö± é°2° ± +°2± é°2°±+± é±+± ±990132#!!#3!32654#»dxyrþ¾þß–– —Œ<9uÙþü„ont7þÉÙþÛ%þÛ68müÙV²+°3²+±é°2´  +±é°/°Ö± é°2²  +³@  +² +³@ +° ±+± é±+012#4+##5!#"3R- –P¯—¼ ¸ø+5'þ¼=>þ…]||eÿÿPÓ„' Ê"ÿÿP¡„' ÉÈÿÿ ³„#x¼˜ŠPÿjžÙ H²+°3±é² +³@ +²+° 3° /°Ö± é°±+±é°±+± é± +01!#5#3!3¸‚æ–"–––Ùý¤\ý'ÿÿ ¯Ù$P˜ÙQ²+±é²+± é´  +± é°/°Ö± é° 2² +³@ +°±+±é±+±°901%#!!!32%32654&#˜5jIþ¸þ–£?d:% þN³5::5Þ(HE)Ù}%6E8[Õ;/0;ÿÿP˜Ù%PPÙ,²+²+±é°/°Ö± é² +³@ +±+013#!!æ–þ–Ù}#ÿjaÙb² +±é°° Ö°3´ +°2²+±é°/° Ö± é° ±+± é°±+± é³ +±é±+±°9017265!3#5!#%!#‹(3s‚ýÆ‚* ÜlÇš ý“þþ––ß¾¾ÿÿPqÙ( *Ù:²+± 33²+± 33°/°Ö°2± é°2±+±³ $901 # 333 ##Ïþó¸eþǤõ–õ¤þÇe¸þó–þãz_þéþéþ¡þ†þã(ÿéå'•²+± é² +³@ +²+±% é²% +³@% +´ +± é°(/°Ö±'é°'±+± é°" Ö± é²" +³@" +±)+±'±99°"²999± ° 9±° 9°° 9°%° 9014>32#"&'332654&+53254&#"5&:QF'ƒ‘?YžŒ›’TLDOBGfLŠD:‘û9W1 uk]/1so}|u;>4.1@xg)1rP¡Ù F²+°3²+°3° /°Ö± é°±+± é± +±°9°°9±± 99013#33#æ––!š–Ùþðý'øÿÿP¡„&xИPÓÙ 0²+°3²+°3° /°Ö± é°2± +±± 99013#33 #æ––±þ’ÈþÛÙþéþ¡þ†ÿôwÙJ²+° 3²+±é°/° Ö± é²  +³@ +°±+± é±+± °9±° 901##5265!#áÞ"3P33& –\Ì2UdLB#‘«ý'ÿÿPÙ0ÿÿPÙ+ÿÿ(ÿéæå2PÙ/²+°3²+±é°/°Ö± é°±+± é± +01!#!#þß–M–\ý¤Ùý'ÿÿP}Ù3ÿÿ(ÿé©å&ÿÿfÙ7 ³Ù!²+²+°3°/± +±°901!#733C®rý£¬¬®â÷þ§Y(hÙ-<l²+²+²!+°;3± é°2´- +°.3´+±22°=/°Ö±'é°'±+±22± é±.22°±5+±é±>+±!-±9901!50# 4>;5332!#'#";2>54.+}"þÍ%94E-–-E49%þÍ"–';&!4'·!'4!&;'^4T6( [[ (6T4þè^¼`!D.0G%%G0.D!ÿÿ Ù;ôPÿj Ù N²+± é² +³@ +² +°3° /°Ö± é° ±+± é³+±é± +± ±9901%33#5!3–n‚ýÇ–}\ý“þþ–Ùý¤FrÙ9²+²+° 3´  +±é°/°Ö± é°± +°2± é±+01%#"&53;3#ܼY–0 ¯—–ájKCþà {ý'PÓÙ ?²+±é°2²+± 33° /°Ö± é°±+± é°± +± é± +01)33333Óü}–Û–æ–Ùý¤\ý¤\PÿjUÙ^²+±é°2² +³@ +²+± 33°/°Ö± é°±+± é°± +± é³ +±é±+±± 9901)333333#Îü‚–å–æ–x‡Ùý¤\ý¤\ý“þþ'Ù Q²+±é² +± é´  +±é°/°Ö± é°2² +³@ +°±+± é±+± °90132#!#5!32654#»dxyrþ¾æ|Œ<9uÕ„ont\}þÛ68mP€ÙS² +°3±é² +°3´ +±é°/° Ö± é°2°±+± é°±+± é±+±°901#32#!332654#€–ýü»dxyrþ¾–Œ<9uÙý'Ùþü„ontÙþÛ68mP}Ù B²+± é² +´  +±é°/°Ö± é°2° ±+± é±+± °90132#!332654#æ»dxyrþ¾–Œ<9uÕ„ontÙþÛ68m(ÿé©å†² +±é² +³@ +²+± é² +³@ +´  +±é°/° Ö°2± é°2° ±+´ +°± é°/°3± +± ± 99±³ $9±°901>32#"&'33267!5!.#"+ ¨~š´²˜ˆ¨’TFN_ þÜ#bI,>! âyŠÎ±°Í“}FLmc}T]2Pÿéå$j² +²+± é² +²+± é´  +± é°%/° Ö± é° 2° ±"+± é±&+±" ²999±°9° ±"99°°901".'##33>32"32654&Ê@kF4’––•3DwIœº¾—ZeeZYfd%>GP:þÉÙþÛ>^F3ܧŸÚ|ŠèЉqxŠ mÙ [²+° 3² +±é´ +±é°/°Ö± é°± +°2± é±+±°9° ±99±°9°°901#.5463!#=#"3šÝ³ÜG_yrB–Œ<9uþü }cntý'}Û68mÿÿ(ÿé%D(ÿé+ +`²+±' é²+±" é°,/° Ö±$é°$±*+±é±-+±$ ±99°*´$9°²999±"'± 99°°9012#"&57>7>?6"32654Ha‚ˆ|€’ "-9 h+¯&S+“hBA54B%¡}Ÿ®,\  * 3OWu]JM^^JKA #c²+±é²+±é´ +±é°$/°Ö±é°2°±!+±é° Ö± é±%+± !°9±°9°°9°° 901%#!!2%32654&#3264&# 'N6þó 3J$)!+.þÂ^(""(^d*%#,›30/,$B KèaÏqBA,²+²+± é°/°Ö±é² +³@ +±+01##ÐŒqþUÿƒ“h²+± é°° Ö°3´ +°2² +± é°/°Ö´+°± +±é°±+±é³+´+±+± °901%3#5!#53>=!3#ARnþ]n>%(¢þñŠeâ}}â¬r˜þU:3¯ÿÿ(ÿé%H :²+± 33²+± 33°/°Ö°2±é°2±+±³ $901%#'35373#'#A‰³Õ±”„Œ„”±Õ³‰ŒÆÆ(ô½½½½ôþØÆÆ(ÿé%%y²#+±é²# +³@% +²+±é² +³@ +´ # +± é°&/°Ö±é² +³@ +°° Ö±é±'+±°9± °9° °9°°901732654&+53254&#"#>32#"'±+<71#/\^A,%d‡|mgw,;1bCù"$ !nGIVaaS@"%J;:#´A0 B² +°3²+°3° /° ֱ鰱+±é± +±±99± ±990133##AŒÃ ŒÃ þ®RýäRþ®ÿÿA0Ó&ŸxÿçA* 0²+°3² +°3° /°Ö±é°2± +± ±990173#'#3Í¢”Öý¶§ŒŒ_½ôþØÆÆÿöüD²+° 3²+± é°/°Ö±é² +³@ +°±+±é±+±± 9901!###52>45_Œ…er  ýä«=DZ‡ ("6&Ac F²+± 33²+°3° /°Ö±é°± +± é±+± ±99±² 99901!##33#vHaŒ¯bb¯Œ)þ×þ¹Gýä)A$ ?² +°3²+°3´  +± é° /° Ö± é°2° ±+°2±é± +013353#5##AŒËŒŒËŒÜÜýäÏÏÿÿ(ÿé>%RA$/²+°3²+± é°/°Ö±é°±+±é± +01!###AãŒËŒýä«þUÿÿAÿ&E%Sÿÿ(ÿé%F©:²+²+± é°2°/°Ö±é² +³@ +² +³@ +± +01###5©‡Œ‡qþU«qÿÿ ÿ%\(ÿ&¤Ï!+Œ² +°3± é°'2² +²+²+°3± é°"2°,/°Ö±é°± +± 22±é±$22°±*+±é±-+± ± 99±*±99± ± 99°³$9°±99012#"'##"&463236"3264$"32654Âf|ad2Œ2da{gd2Œ2ÿjAB45A7jAA54B%¤ö£XþæX£ö¤YþýYu_MI^]˜^^˜]^IMÿÿ [ûAÿƒz Q²+± é² +³@ +²+°3° /°Ö±é°±+±é³ +´ +± +±±990133333#5AŒËŒVnþU«þIâ}2ü9² +²+°3´  +± é°/°Ö±é°± +°2± é±+013;3#5#".52ŒxŒŒv&@>$Öýä¥!B/A? ?²+± é°2²+± 33° /°Ö±é°±+±é°± +±é± +01)33333?ýŒ«Œ¯ŒþU«þU«Aÿƒ¶W²+± é°2²+± 33°/°Ö±é°±+±é°± +± é° ±+´+±+±± 9901)333333#HüùŒ«Œ®ŒxnþU«þU«þIâ—Q²+±é² +± é´  +± é°/°Ö±é° 2² +³@ +°±+±é±+±°901%#!#5!323254&#—%P9þå«7lkuþ´mT0)¨47!«qµj‹F"#AÓ S²+°3±é²+°3´  +± é°/°Ö±é°2°±+±é°±+±é±+± °901%#!3323254&##%P9þåŒlkuþ´mT0)žŒ¨47!µj‹F"##ýäA B²+±é²+´  +± é°/°Ö±é°2°±+±é±+± °901%#!3323254&#%P9þåŒlkuþ´mT0)¨47!µj‹F"#(ÿé%`²+± é² +³@ +² +± é² +³@ +´ +± é°/°Ö´ +±+± µ $9±° 901.#"#>32#"&'33267#5 11+- †}ey†…xb † .)+: ¯@<8-5cp˜Š†”qa4-=8qAÿé1%v²+²+± é²+² +± é´ +± é°/°Ö±é°2°±+°2±é°±+± é±+±± 99±°9°± 99°°901%##33>32#"&"32654&3fŒŒfl~„‡zm‚ï8==87><ÏÏÜmx—‹ƒ—xS^ž^^MQ^ S² +°3²+±é´   +± é°/°Ö±é°±+°2±é±+±° 9°° 9± ° 9014>3!#5##7.55#"3$'N6#Œ,³›=DTz*%#,30ýäÏÏÚX;AqBÿÿ(ÿéõ"C}œÿÿ(ÿéÛ"jtôœÿS6Ù&‡²+² +²+± é°/´  +´ +°3±é° 2°'/°Ö° 2±é± 22² +³@ +² +³@ +°±#+±é²# +³@# +±(+±#±99±°901"##53533#632#"'5>754&S2;ŒFFŒªª:e :7 F`^1l4¥<.þÅ7h::hrW'M5Þ>wM/>~^Ò8+ÿÿAõ"vMš(ÿé%`² +± é² +³@ +²+± é² +³@ +´  +± é°/°Ö´ +±+±µ $9±°901%#32673#"&54632#.#"3g¯ :+). † bx…†ye}† -+11 ®Ï8=-4aq”†Š˜pc5-8<ÿÿ!ÿé %VÿÿFÒÙLÿÿÿý/ç"jðóÿÿÿ&ÒÙMU#j²+°3±é²+± é´ +±é°$/°Ö± é² +³@ +° ±+±é°2°±!+´+±%+±°9°±99012#!##5>=!#32>54&‚^uQ_þåŸ 'T?.·hhm '?Q<:Y«3JquD‡|™ÝncAcb²+° 3±é² +°3´  +°3± é°2°/° Ö± é°2° ± +°2±é°2°±+´+±+± °9012#!5##3353#32654^uQ_þåËŒŒËŒhhm3$?Q<:YÏÏÜÜÝnc/4Ùu²+°3² +²+± é´ +°3±é° 2°/°Ö° 2±é± 22² +³@ +² +³@ +°±+±é±+±±99±°901"##53533#632#4S2;ŒFFŒªª:e 96 Œ¥=-þÅ7h::hrW'M5þžAdÿÿA*õ"vr¡ÿÿA0õ#C‘Ÿÿÿ ÿ%ð"xjªAÿƒ% K²+°3± é² +³@ +²+° 3° /°Ö±é°±+´+°±+± é± +01!#5#333jn»ŒÌŒ}}þU«ýäÆÙ[²+°3²+°3°/°Ö± é°± +± é° ±+±é±+± ±99° °9°±99±± 9901!#&53533#&']ŽKp’sŒw‰‘)EB&ŽE5:~‚Ùþåþ×6æêþÄ7oß¾@tÙÄ Ö]²+°3²+°3° /°Ö±é°± +± é° ±+±é±!+± ±99° ±99°±99±±9901!#&3>53653#.')Œ“ŒM%"Œ*$FŒICŒ    é4îµZÐG>Ö]ºé…þÞv2DC) ÿÿFÿöúÜ5ÿÿAÿ3µU(ÿéæå b² +± é²+± é´  +´ +°/°Ö± é°2°±+° 2± é±+±± 99±°9°°9°°9016632#".#"!26(ÁžÂ¿ Ÿf iSRk þq k¦l¿PÖÕ®¢×§crsbOcuv$ÿé:% @²+± é²+± é´ +´ +°/±+±°9°°9°° 9012#"&6."#326.{}ŽŽùCbCùùC10D%™‰‚˜™ ™ö>GH=O=IIÿÿÆç&Ç'Ö ÛÕq|ÿÿ Ö/&È'Ö©#Õïÿ´ÿÿÆ„&Ç £Áªÿÿ ÖÙ&È £Fÿÿÿ$«ü©²+°3°/±+°6ºöÀÅ+ ° °À± ù°ÀºöÀÅ+ °°À±ù°Àº=•î“+ °.°À±ù°ÀºõíÀÌ+ °³+±°³+º=•î“+ ³+±° ³ +º=•î“+ °³+±° ³ +º=•î“+ °³ +±° ³ +º=•î“+ °³ +±° ³ +ºõíÀÌ+ °³ +±°³ +ºöÀÅ+ °³+±°³+ºöÀÅ+ °³+±°³+@ ..................@ ....................°@01''#7'57'573«‹8‡™2C5€’8Ž =C@CÆC±¼BÆB×áþzcÿö I°/´ +° Ö´ +° /°Ö´ +°2° ±+°2´+±³ $90153353#5#þzxŒxxŒcœ9œ8ÿÿþÖ]ÿÞì±ÿÿÿPÿÜÔ‡´üëÀ@ÿÿÿ!PÿßÔ‡³@Àý´C )°/± é³ +´+°2°/°Ö´+01"#4>323".þ“+;yFd;Jx>G (N;s•(*C^(!(!_ÿÿýÿ†e&  '  Dÿy'  þºÿy'  Íþ3'  Füî'  üf'  þ»üí  þ3þ3üÿÿSi "/<IT_’²9+´4,+³94+´  +²7+² +²A+´F,+³ AF+´ +²*+°/´0+´LS  +´L*+±UZ22´W^  +´W*+±JO22³$ +°=3°/´0+°`/°OÖ´P +°P±'+´, +³K,'+´S +°S/´K +°,± +±22´ +°± +´ +± 22°±+´ +³U+´_ +°±[+´Z +±'S±7699±,K²4)9999° µ#$*01;$9±µ=>H$9°U²AF999±_±DC99±4 °9±9²6999±L7´!10$9±F$´#.>DI$9° ²',C999±A°)90135>5##546737'654''&5477#"'7327''7632&#"#"&'335532#.#þðp*F&@qp*F&@«O*)&-þ O*)&-"O))#$2"-—O))#$2"-ý#;38 *$8;38 *$<;38 *$8;38 *$ýO))#$2"-–O))#$2"-ýºO*)&-÷O*)&-Úp*F&@rp*F&@Rÿj„ “²+° 3²+°3°/´ +² +³@ +°2°/°Ö± é°±+´ +°±+´ +°± +± é³  +± é±+±°9±±99± °9±³ $9013#333#5#"&=33267è––!šn‚‚LpL8 D!#Ùþðý“þþ–øŒ 8LL9 B#<ÿƒÓ ˜²+°3²+°3² +°3´  +´ +°/°Ö±é³+´ +°±+±é³+´  +° /´ +³+´+±+±°9° ±99°°9± ³$901"&=3327333#5##¸LpL8 D@ þ¼ŒÃ VntàÓ 8LL9 BB·þ®RþIâ}Rþ®‚Ùq²+±é²+´  +± é´ +° 3´ +°2°/°Ö°2± é± 22² +³@ +² +³@ +°±+± é±+±°90132654#3#32#!#5353ëŒ<9uŒOO»dxyrþ¾FF–XÛ68m"OV„ont+O_?i²+±é²+´ +±é´ +°3´ +°2°/°Ö°2±é±22² +³@ +² +³@ +°±+±é±+0173264&##!#53533#32ëz*%#,Ú'N6þÝPPŒOOtmqßqBD30ˆOEEO;]P}Ù Z²+²+±é´ +±é°/°Ö± é°2°±+± é±+±°9±°9°² 999°°901654&+327'7'+#!2Ø9<ŒŒ -8¤/89(5»–Bry¬(86Û-8¤/89þüÙtnp<ÿ&@% s²+± é²+²+²+± é°!/°Ö±é±22°±+±é°2±"+±±99°±99±°9° ³$9°°9°°901%654&"327'72'#"'#36 AjAA578f|<;8<3:d2ŒŒ2£(9M_^˜] 78N¤{vQ;8< XþæöPYRR`7²+²+±é² +³@ +°/°Ö± é°±+± é± +013#53!è–j–þ–Ùˆþü<˜š7²+²+± é² +³@ +°/°Ö±é°±+±é± +01##35˜ÐŒÜšïþU~]Ù T²+² +± é´ +°3±é°2°/°Ö° 2± é°2² +³@ +³@ +² +³@ +±+013###53!!ó¿¿–NNþ–·}þÆ:}"}­ W² +²+± é´  +°3´ +°2°/° Ö°2± é°2² +³@  +³@  +² +³@ +±+015!#3##5#5Q\ÐhhŒBIÓqbZïïZRÿT_ÙW²+²+±é°/±é´ +±é°/°Ö± é°2² +³@ +°±+± é² +³@ +±+013#!!32+5326=4&+è–þ–nŠŠn%.@@.sÙ}d~`è`~}70Ü07<ÿEj² +°3² +± é°/± é´ +± é° /° Ö± é°2² +³@  +° ±+±é² +³@ +±!+± °9±°9012=4&#"#!#>32+4V55,,Œ\Ð@6#>>%!69 2DdO8,2$}qš %O85N' ÿj*ÙY² +±33² +±33°/°Ö°2± é°2°±+±é±+±±99°±99± µ $901%3#5### 333Äf‡,þî–þî³eþǤõ–õ¤þÇlþþ–þãþãz_þéþéþ¡ÿƒ \² +±33² +±33°/°Ö°2±é°2°±+´+±+±±99°±99± µ $901%3#5#'#5#'35373ÀInE‰Œ‰³Õ±”„Œ„”±eâ}ÆÆÆÆ(ô½½½½ô*ÿƒå6¨²+±4 é²4 +³@4 +°/´(+°-/±. é°7/°Ö±6é°6±+´ +°±)+± é°1 Ö± é²1 +³@1- +±8+±6±#$99°µ&4$9°°9± )° 9±°9°-² 999°.° 9°4° 9014>32#"'53254&'.'332654&+53254&#"7&:QF'ƒ‘?YŠ}NMC('L!-r€’TLDOBGfLŠD:‘û9W1 uk]/1sg|.G,3 /2!2 zi;>4.1@xg)1r ÿ %;в5+±/é²/5 +³@/2 +° /´(+°%/±&é°=4&#"#>32 ",=$OMC('L!+͉+<17$\^,%d‡|mgw,; ,C$/G,3 /2!0£"$  n IVaaS@"%RÿjÕÙP²+°3² +° 3°/°Ö± é° 2°±+±é±+±± 99°± 99± ³ $901%3#5##33dq‚FþÛ––±þ’lþþ–þãÙþéþ¡<ÿƒ%S²+°3² +° 3°/°Ö±é° 2°±+´+±+±± 99°± 99± ³ $901%3#5#'#373ÏVnH§ŒŒ¢”Öeâ}ÆÆ½½ôRÕÙF²+°3²+° 3°/°Ö± é°2°±+°2´ +± 22±+±±9901%'#375373#'#,––,O¢±þ­rȪOò+þãÙþé+’EŸþ»4þ ¥A<%F²+°3²+° 3°/°Ö±é°2°±+°2´ +± 22±+±±99017'#375373#'#ì$ŒŒ$O/”Ãê¶4O›+ƽ*~"7Þ,þî> ÜÙa² +°3²+°3± À/°3´ +°2°/° Ö°2± é±22² +³@  +² +³@  +±+± ² 999013#3 ###5353èMM±þ’”ºþÆ–HH–šO‰þ¡þ†þãKO? &a² +°3²+°3± À/°3´ +°2°/° Ö°2± é±22² +³@  +² +³@  +±+± ² 999013#73#'##5353É66¢”Öý¶§Œ33Œõ;[½ôþØÆÆº;'wÙ A² +°3² +°3± é° /° Ö± é°2²  +³@ +±+± ²999013 ###5бþ’ÈþÛ–æÙþéþ¡þ†þã\}£ A² +°3² +°3± é° /° Ö±é°2²  +³@ +±+± ²9990173#'##5F¢”Öý¶§Œ«½½ôþØÆÆ«qRÿjÙ^² +°3² +°3´  +± é² +³@ +°/° Ö± é° 2°±+° 2± é³+±é±+± ±9901%3#5#!#3!3Ÿx‡‡þß–– —lþþ–KþµÙþï<ÿƒua² +°3² +°3´ +± é² +³@ +°/° Ö±é° 2°±+° 2±é³+´+±+± ±9901%3#5#5##3353VntËŒŒËŒeâ}ÏÏÜÜRÖÙ N²+°3² +°3± é´ +±é°/°Ö± é°2°±+° 2± é²  +³@ +±+01!#!#3!!!ž•þß–– ÎþÈKþµÙþï}<å N²+°3² +°3± é´ +± é°/°Ö±é°2°±+° 2±é² +³@ +±+01!#5##335!#ŒËŒŒËRÆÏÏÜÜqQÿTÙZ²+°3²+±é°/±é´ +±é°/°Ö± é°±+± é°2°±+± é² +³@ +±+01!#!#!32+5326=4&+ž–þß–MnŠŠn%.@@.s\ý¤Ùá~`è`~}70Ü07<ÿEm!l²+± 33²+± é°!/± é´ +± é°"/°Ö±é°± +± é°2° ±+±é² +³@! +±#+± °9±°9012=4&#"###!>32+‹V55,,ŒËŒã@6#>>%!69 2DdO8,2$}«þUþõ %O85N',ÿéžå%/…²+°"3±é°2²+± é³ +±+é°0/°Ö± é²  +³@  +° ±+±. é°.±(+± é±1+±.±99°(±$99°±"99±°9°+µ &$901"&54>3";&54>3267#"'7654&#"˜¡Ë-\Ÿg{~ÚM'9G9b{[Mb yhE>HR[ '%<ÅOwG}•mÿ]uItD-¥p™b8X ?¯GƒKLba^$ÿéÝ%(†²+°3± é°2²+± é´$ +± é°)/°Ö± é²  +³@  +° ±+±'é°'±"+±é±*+±'± 99°"±99°±99± °9°$µ  $901"&5463"&5463267#"'7654#"5z—§‹Db*dLOf5HN \W:8:A)&˜ƒx©r[N¬:IkfeO]C.?%A $7['83,ÿ­å'²$+± é²$ +³@ +°/´(+°(/°!Ö± é°±+´ +°± +°2± é°'2±)+±µ$$9°°9± ± &99±°9°²!99901&#"32673#"'53254&'.54632€YdaWFT’“xNMC('L"-”´š¥ ⃈yw†LFt 0F,3 /2!2ÉŸ±ÎŠy$ÿ %'j²!+± é²! +³@% +°/´(+°(/°Ö±é°±+´ +±)+±µ!$9°² %999±°9°²99901"32673#"'53254&'.54632#."r=5). † hSPMC('L"-aj†ye}† -´±OZ-4Wm /H,3 /2!2‘vŠ˜pc5-ÿjWÙ J²+±é° 2² +³@ +° /°Ö± é² +³@ +³+±é² +³@ +± +01%3#5##5!#‚x‡‡ÝHÕlþþ–\}} ÿƒ§ M²+± é° 2² +³@ +° /°Ö±é² +³@ +³+´+² +³@ +± +01%3#5##5!# Vnt‡š‡eâ}«qq yÙ0²+²+°3° /°Ö± é± +±°9±°901#33’–ò§•‹¨þòËþ¾BÿC8#²+°3° /°Ö± é± +±°901%#33o–Ô§wm¨QþòËþ¾B yÙ]²+²+°3´ +° 3±é° 2°/°Ö°2± é° 2² +³@ +² +³@ +±+±°9±°9017#535333##üÈÈò§•‹¨çÈÈ–‘hËþ¾Bþ5h‘ÿCGV²+°3±é° 2²+° 3°/°Ö°2± é° 2² +³@ +² +³@ +±+±° 9±° 901#5#53333~–ÈÈÔ§wm¨ÉȦ¦hËþ¾Bþ5hÿj|Ù:²+°3² +° 3°/°Ö±é±+±±99± ³ $901%3#5#'#3738D‚0Œ‹®æÞ²€†®álþþ–ýýojððþ›ÿƒ =²+°3² +° 3°/°Ö´+±+±±99± ³ $901%3#5#'#373ÉCn:[\¨´°¨XW¨°eâ}¨¨ ££þôÿj‰Ùk²+±é² +³@ +²+°3±é°2°/°Ö± é² +³@ +² +³@ +°±+± é³ +± é±+±± 9901#5!#!33#5!ο ·!–n‚ýÇ\}}þ!\ý“þþ–ÿƒËn²+± é² +³@ +²+°3± é°2°/°Ö±é² +³@ +² +³@ +°±+± é³ +´ +±+±± 9901#5!#333#5!ˆsrsËŒ`nþ+«qqþÆ«þIâ}DÿjÞÙE²+°3°/± é² +³@ +°/°Ö± é° ± +°2± é³ +±é±+01!#5#"&53;33#\‚žnŠ–@.‘—n‚á~`þì07{ý“þþ0ÿƒPH²+°3°/± é² +³@ +°/°Ö± é° ±+° 2±é³+´+±+01!#5#"&=3;33#âtb\€Œ*$dŒVn£Y]ÃÂ##þIâ<hÙi²+²+°3´  +°3± é° 2²  +³@ +² +³@ +°/°Ö± é°± +°2´  +°2° ±+°2± é±+015333#5##5"&53,OV—–WOhˆ–3`WY{ý'áUU€^þì*5<q²+²+° 3´  +°3± é°2² +³@ +²  +³@ +°/°Ö±é°±+°2´ +° 2°±+° 2±é±+± °9017.=35333#5##øQkŒ0O3ŒŒ3O¤ZTÃÂ5 cgýä£SFrÙ9² +°3²+´  +±é°/° Ö± é°2° ±+± é±+0132#4&+#3ÜžnŠ–@.‘—–ø~`þæ07þ…ÙF9²+°3² +´  +± é°/°Ö±é° 2°±+±é±+01!#54&+#332Œ*$dŒŒb\€Â##þø£Y]*ÿé½é0z² +±+ é²+ +³@+ +²$+±é°2²+´+´  +°'3± é°2°1/°Ö´+°± +±( é±2+± ±99°(±!99± ±9901!.#"#"&5"&54632#4&#";>32!32>7ßLTFAXÉ ¨~›³uYJATn%!^¨~Ž©þcZ,>! ÕFLLþÑyŠÎ´YwQ]A>%0/7€Àº|†2 ÿéÕ% 1²"+± é²" +³@ +²+°+3± é²+´  +²  +³@ / +´%" +°3±é°2°2/°(Ö´  +° ±%+±é²% +³@ +±3+±% ±+/99°±.99±± (99013.#"'";>32!32673#"&5"&54632#4&†Ä ,'$ð$!Hae}þ¤<6). † bx…q\I1,FTd+% k=]dpcNQY-4aq•†G\6H:. *ÿ;½é3¥² +°33±*é² * +³@  +²#+±é°2²+´+´  +°&3±é°2°4/°Ö´+°± +±' é°'±+´ +±5+± ±99°'± 99°°9°²#*999± *±/099±±9901!.#"#5.5"&54632#4&#";>32!32>73ßLTFAXÂ\…–uYJATn%!^¨~Ž©þcZ,>!  oÕFLLý ±ʤYwQ]A>%0/7€Àº|†2n‡  ÿ;Õ%)3ɲ +°$3±. é² +´ +² +³@( +°/´ +°/° 3±é°*2°4/°!Ö´ +°±+±é² +³@ +³'+´( +°(/´' +°±+´ +±5+±(°$9±'°9±°*9°² .999±±99°±99±.±!9901";>32!32673#5.5"&54632#43.#"š$!Hae}þ¤<6). †cO\emq\I1,FTÎÄ ,'$Ú=]dpcNQY-4Sm²± ’yG\6H:.v+% RèÙ!²+²+°/°Ö± é± é±+01#è–Ùý'Ùÿÿ *„#xs˜}ÿÿ Ó#xëÿçPÿT´Ùa²+²+°3°/± é´ +±é°/°Ö± é°2°± +± é²  +³@  +±+± °9°°9±°9012+5326=4&+#33~nŠŠn%.@@.Œ––±þ’z~`j`~}70^07ýÙþéþ¡<ÿDþ^²+°3²+°3°/± é°/°Ö±é°2°± +±é²  +³@  +±+± °9°°9±³$9012+52=4+#373;R^^R2VVAŒŒ¢”Ö)aZoZawd/d²½½ô$ÿjõÙe² +²+²+±é² +³@ +°/° Ö± é²  +³@ +°±+± é³+±é±+± °9± ² 99901##5265!3#5#ñÞ"3P34% n‚‚\Ì2UdLB#‘ެý“þþ–ÿƒ[`² +²+²+± é² +³@  +°/°Ö± é² +³@ +° ±+±é³+´+±+± ²99901!3#5###52>45hVnt…er  þIâ}«=DZ‡ ("6&RÿTŸÙN²+²+° 3°/±é´ +±é°/°Ö± é°2°±+°2± é² +³@ +±+01%!#3!3+5326 þß–– —Šn%.@8þµÙþïýY`~}7<ÿEQ²+° 3²+° 3°/± é´ +± é°/°Ö±é°2°±+°2± é² +³@ +±+01%5##3353+52“ËŒŒËŒ^R2V ¯ÏÜÜýäZawRÿj Ù^²+°3²+°3´ +±é² +³@ +°/°Ö± é°2°±+°2± é³ +± é±+±± 9901!#3!33#5# þß–– —n‚‚KþµÙþïý“þþ–<ÿƒua²+° 3²+°3´  +± é²  +³@ +°/°Ö±é°2°± +°2±é³  +´+±+± ±990133533#5#5##<ŒËŒVntËŒÜÜþIâ}ÏÏDÿjpÙA² +°3°/±é°/° Ö± é° ±+°2± é³+±é°/±é±+01!#35#"&53;3î‚nžnŠ–@.‘—–u~`þì07{ý'<ÿƒG² +°3°/± é°/° Ö± é° ±+°2±é³+´+°/´+±+01!#535#"&=3;3’nVb\€Œ*$dŒ}â>Y]ÃÂ##ýäRÿj†Ùž²+² 333²+±33°/°Ö± é°2°± +°2± é³  +± é±+°6ºÁ£ñž+ °.°À±ù°Àº>ò5+ °.°À±ù±°À²...´.....°@±± 9901#333#5##è–à„€ân‚‚–8ýÈÙý¼Dý“þþ–8ýÈ<ÿƒ´U²+±33²+°3°/°Ö±é°±+± é³ +´ +±+±±99±´ $901!##333#5#qHaŒ¯bb¯Vnt)þ×þ¹GþIâ})ÿÿRèÙÿÿÿÿ¤„"$õx·˜ÿÿ(ÿéì"Dxvÿÿÿÿ¤„"$õj»ÿÿ(ÿéç"Dj~ÊÙ^²+°3± é²+±é°2´ +±é´  +±é°/°Ö°2± é°2² +³@  +³@ +³@  +±+01%##!!!!!!#²ß5™ªþ’Sþ­‚ýèCr˜˜Ù}¥}½}Gþ¹$ÿèb%.:>² +° 3±8 é°2²#+°'3± é²# +³@! +´; # +´;+°?/°Ö±5é°5±/+°2±é°;2²/ +³@, +±@+°6º TÀ×+ °°À±4ù°2À°³+³+³+°4³342+² Š Š#9°9°9²3429µ23......µ23......°@±5°!9°/² #999°± %99±8 ° 9°²999°;±,099±#²%>=99901%32673#"'#"&54?>54#"#632632532673&"÷r$; Šˆ[ˆ@YtM[Ÿ8#  U/+ƒáu:>].TO/þ %0P)#69Ø ÄâŽ'P_hiYL‘   5!)»22?{U &  >#A¥{ÿÿPq#x°“|ÿÿ(ÿéÝ"x^ñœ,ÿé­åC²+±é² +± é² +³@ +´ +±é°/°Ö± é±+±° 901%!326>32#"&5!4&#" þ´TFAXþ7 ¨~š´²˜Ž©ëdY,>! ùFLL/yŠÎ±°ÍÀºzˆ2ÿÿÿè$œ= Àÿÿ,ÿé­„#j¿'ÿÿÿèÈ"jmá(ÿÿ *„#ju}ÿÿ È#jèÿáÿÿ(ÿé„#j¦~ÿÿ(ÿéÈ"jsážÿÿ(ÿéÙyÿÿ#ÿq 2ÿÿP¡F#qÇ‹ÿÿA0‰#qˆÿΟÿÿP¡„#jÆÿÿA0È#jˆÿáŸÿÿ(ÿéæ„˜ÿÿ(ÿé>ç¸ÿÿ(ÿéæåËÿÿ$ÿé:%Ìÿÿ(ÿéæ„#já7ÿÿ$ÿé:ú#jˆ8ÿÿ(ÿé©„#j»”ÿÿ(ÿéÈ"joá´ÿÿ­F#q¸‹Šúÿÿ ÿ%‰"qrΪÿÿ®„#j¹Šûÿÿÿ%È"jmáªûÿÿ­„' Í–Šúÿÿÿ%á"}~ìªúÿÿFr„#j¯Žÿÿ2üÈ"j{á®RÿjRÙ <²+± é²  +³@  +° /°Ö± é³+±é² +³@ +± +0173#5#!!èn‚‚þ–lþþ–Ù}<ÿƒ˜ ?² +± é² +³@ +° /°Ö±é³+´+² +³@ +± +01#3#5#˜ÐVntqþºâ}ÿÿP€„#j@’ÿÿAÓÈ#jíÿá² ÿéyå'Ÿ²+± é² +³@ +²"+± é²" +³@ +´ " +± é°(/°Ö±é°° Ö±é°/±é² +³@ +°±+±é±)+±°9±²"999°±99± °9°°9°°901#&#";#"32673#"&547&54632lŒ‘:DŠLfGBODLT’›ŒžY?‘ƒ'FQ:&ûr1)gx@1.4>;u|}os1/]ku 1Wÿé%+y²+±)é²) +³@) +²+±é² +³@ +´  +± é°,/° Ö±é² +³@ +° ° Ö±&é±-+±& ° 9± )°9°° 9°° 901%3#".547&54632#&#";#"326‰ùCb1;,wgm|‡d%,^\$71<+´#:;J%"@SaaVI n  $$ÿ9‡Ù\² +²+±é°/´ ++°/° Ö± é²  +³@ +°±+± é² +³@ +±+± °9± ° 901##5265!+53265ñÞ"3P33& 3X:_Z1\Ì2UdLB#‘«ý'(E9!Ž%ÿXQ²+²+± é°/± é°/°Ö±é² +³@ +°± +±é²  +³@  +±+± °901!+53265##52>45hkaF%D…er  ýäFb… ©=DZ‡ ("6&ÿÿ(ÿÊæå4ÿÿ0ÿ&4%Tÿÿ«Ù:ÿÿ ZRÕÙ0²+°3² +°3°/°Ö± é° 2±+± ± 9901#'##37'373‚o%¦ÈþÛ––ªbo'?±“ù Ÿþ†þãÙþé§U"=<%0²+°3² +°3°/°Ö±é° 2±+± ± 9901#'#'#37'373÷oKý¶§ŒŒYIo ”ZjUþØÆÆ½hA gFÿ~îÙI²+± é²+°3°/°Ö± é°±+± é±+±°9°± 99±± 9901%7653'#".53327™L –)L—E_(KO:%–‹#yQîþX=‡Q$$8];îþ‚FˆðL²+°/± é° /± é²  +³@  +°/°Ö± é° 2°±+± é°2±+±±99012#54 !!#4>@NKO;%–þê¬þT•%;Oð$8];dd‚‚½}´î;]8$-óï "[²+°/° 3´ #+° 2°/± é°#/°Ö± é° ± +°2± é° 2² +³@ ! +±$+± °9± °9014&#";#5#".54>3 3÷PA.B$¢œ‘¿<^7&BzY'nû1<1*À‘ll%=BK-Nu_2þôå‘AððS²+°/±é°/± é°/°Ö± é°±+± é°2² +³@ +±+±± 99±±9901!4 #5476 3#íþê–GRRGmmî‚‚ÜÜx@JJ@xŸ}ÒFˆðT²+± é² +³@ +° /± é² +³@  +°/°Ö± é°2° ±+± é° 2±+± ±9901 ".53!! =3ŽNKO;%–¬þT–%;O$8];în}þý‚‚FF;]8$<ø4£²+°3´ +³+± é°2² +³@ +°+/±( é°"/±/é°5/°Ö±é°2°°( Ö±- é°-/±( é²(- +³@(* +°±+´2+±6+±-°+9±²"/999°2± 99±(+±-99°"°2901%32#54.#!#53327>54.#"3!&5!2H.42…þrŒŒf+W1(@<1J'»þ¶[€´H°"B/ .ä71 )*F)7O'(4"ƒ#tž…gˆFÒê :²+°/± é°/± é° /°Ö± é°2²  +³@  +³@  +± +01%!33#rþÔ’úú…æéýFˆðF²+± é° /± é²  +³@  +°/°Ö± é° ±+± é°2±+± ±99012#54 !!4>@NKO;%–þê¬ý¾%;Oð$8];ÜÜ‚‚þ}î;]8$FÿåHñ 3e²"+³ " +± é°/°/3± é°-2°/±( é°4/°"Ö±!é°!±+±é°± +°2±1é°,2²1 +³@1/ +±5+±°901"326=#".546;54&'#"#4>;23#ç8"'MF:v?\2c…›2I³#*‘3SU,¿r”66‘W*SK*:6‚þŽ /G8%‡z)760%þ A_0g2€‹h-ÿèšç I² +±é²+²+°3±é°2°/°Ö±é°±+°2±é°2±+±° 901%2675#""&=4673533#3>7Œ_6?xŽwvŽc`‘e/AÕu`:6}|jsg}ÀÀ}Üf€FªõS²+°/± é² +³@ +² +³@ +°/°Ö±é° 2°±+±é±+±° 9± ° 901"#3632#54&0A#”FSInE*AÍ4)#þäó½ ";Yc>``o]Få/²+´ #+²+°/°Ö±é² +³@ +±+01733F‘¹ãý­FÿìEìW²+²+± é° /± é°2² +³@ +°/°Ö±é°2°± +± é°±+±é±+±°90153!".=##332>´‘ÿMoD'9‘‘Ë=^'"@èéþ­ 8\fHYþ[êÃèp]*S*ÿã?! +t² +´ +² +± é°"2²&+°/± é°,/°Ö±é°±+±é±-+±±'(99°² "999°² 999± ²999± °9014&#"326!2'.+#"&5467"&=7z~\^‡ƒV[‹þ|Ÿi,p  "Ö”•ÌK=RB‚!72>=4.#""327&Ï‘œ{€]P%v5H:1I$//1c#3B$+ 9M ïSZb™—x3b°?)*6,%---A!+.)‹L &<Hþh !<ëðN² +±é° /± é²  +³@  +°/°Ö± é°± +± é² +³@ +±+± ±990123!4 #54>5PKO:%mþýþê–%:Oð$8];þ}î‚‚ÜÜ;]8$#—ò²+´ #+°/±+01%!5467&'767'.'—ýŒc^0^ILgˆ5È‘)6ƒìp o =8i>"ìþÝy>hR"¶‚FÿéõÙH²+± é²+°3±é°/°Ö± é° ± +± é² +³@ +±+± ±9901".53 5!#PKO:%–m%:O$8];îþ‚‚î}þ;]8$#ÿæNñ/²+±é² +³@ +°/± é°!/±&é²!& +³@!$ +°0/° Ö± é°$ Ö±# é° ±+±é° Ö±+é±1+±$ ±99±#²&999±+°.9±°9°°.9°!°+901%#".5332>54.#!5!254&#"#432N¡x&HK6# 1%%0,$þÿl@3c’öHj6QÖo $8\;(9 5'$.Z,(aÞ(CE$<@7¯ÙP²+± é²  +³@  +² +±é°/°Ö± é² +³@ +° ±+± é±+± ±9901 ".5#5! =3¶PKO:%m–%:O$8];Z}þ)‚‚ÜÜ;]8$-ÿçc$µ²+±é² +³@ +°%/°!Ö± é° ±+± é±&+°6ºòÁ†+ °°À±ù°À°³+³+³+³+³+² Š Š#9°9°9°9°9@ .........@ .........°@01'5.'"32>=3#".=46»ZØ"E'grL?+"’š~?h=*Ng‡l…g~OIQ6#Y_a›(;H;jaA¦ò5²+°3°/± é°/°Ö±é°±+±é±+±°901#4.#"#4>32¦‘ $C51=" C|ZGlD*Ÿþb7F76H9þcžOu^1";Xa-ÿÑdñ° /±é²  +³@  +°/°Ö±é°±+± é± +°6ºð'Áþ+ °°À±ù°À³+³+² Š Š#9°9µ......µ......°@±°901%%5>=4&"#54>32¬Zþ;žu}RxI‘$CnBPx;gn†w‰- xkUM@I32—‘%!“ C|ZY{AŸþbFS" þlš %0CDOt_12`tAÿÿø :²+°3´ +³+± é°2² +³@ +°)/± é°/±2é°;/°Ö±é°2°±+´8+±<+±± )99°´$2$9°8±99±)°$9° ²+999°°8901654.#"32#54.#!#5332654&#.'54>324&AC&/G&`.JS†þrŒŒf>X¼B I. -DqG,UZC+HU;&9R(#:6þèPN .ä7*$%)k&OVA+)?iCgˆAððL²+° 3° /±é°/± é°/°Ö± é°± +± é°2² +³@ +±+± ±990123##4 #4>:PKO:%mm–þê–%:Oð$8];Ÿ}Òî‚‚þî;]8$Aÿë¦å7²+± é²+°3°/°Ö±é°±+±é±+±°9013#".53326‘A|YIlE*A5cE?¦þYKsa4 9Wc@§þZ2>?\-ìò^²+´ #+°/± é²  +³@  +³@  +°/°Ö±é°±+°2±é´ +±+±± 99± °9015332>533#5#".-=,.?#‘Zî<^[}Cêpo&.>"87,ýŸ°2`u$ÿÛñ8ß° /±- é²- +³@-& +°/± é² +³@ +°9/°Ö±é°±0+±é±:+°6ºïWÂ5+ °5°2À±ù°À³+³+°5³352+³452+² Š Š#9°9²4529°39·2345........·2345........°@±±')99°0³ -$9°± 99±-°9014>32#'.#"#".=332654.?N|KMs;#‹JF.*2Oa`O2¨z]ˆF‰'K5?Y'?QUQ?'Fg2+9K.:2"' /V;h‡4VV-+*3-(!-PFˆð?²+° /± é²  +³@  +°/°Ö± é° ±+± é±+± ±99012#54 #4>?PKO:%–þê–%:Oð$8];ÜÜ‚‚þî;]8$(ÿéXñ-9œ² +±é² +³@ +°/±1é°7/±é°:/°)Ö±.é°.° Ö±é°/°!3±é°.±+± é°4 Ö±é±;+±)°%9°.° 9°4³ $9±°9±² !999°1±%99°7±)99012#"&=332>54#"#6767.54>32654&#">Om3=T|~™J>*-‰+8 ™5k)E0/DH,0Dñ'CA&Y/?xjŽ~q 2A 4$m>9'%BB(Ñ&1(/.%.F‹ì8²+°/± é² +³@ +°/°Ö±é°2² +³@ +± +0133##F‘´´‘ìø‚þ#ÿèî'0]²+°/°03± é° 2² +³@ +°1/°Ö±$é°$±+±22±é±(22°±-+±é±2+±³'($9014>753#5.3>54&'#.AZC#DXC/-AXE"#EYA-/%-!PN05RMjGrD1;92EtHGsF4223Et )D*Tb-M2Tdxñ!o² +° /°3± é°2°/± é°/±é°"/° Ö°2± é±22² +³@ +° ±+±é±#+± ±99°°9±°9°°901#"'!!#5#53462!"32654&t‚vL5}þ‚WW’êþþ4BM425G ‘9€__€+g};3.'854.“mªYË¥N‡b8О6?,wd%FF+-=6f­j¹×8d”X¨Ý‰ #8fCs…5kL=_8$ #ÿèÏî&/‚²+± é°-2°,/° 3±é°"2°#/±é°0/°Ö±é°° Ö´+°/´+°± +°"2±-é°2°-±/+±é±1+±/-°9±, °9±#±9901#"&=3".54>;235"4.#25É ‡u@Z*#DM6xQt<þ‰1,#u0'ŠzVM5 635H#Ù+HL+NiŠXaþ¹,;þÍ~ÿÿc=í_È´ì '° /´ +°/°Ö±é±+±± 990153'767$( 1T˜i)1( P '3æç"²+´ +°/°Ö´ +±+0173zj3´´ÿýG7²+´ +° 2°/°Ö´ +±+±°9± ±990132?#0#"'7>t#< )+08M #@Æ)*s5 3u)ÿÿ_ÕõC 7\/$t²+´+² +³@ +°/± é°%/° Ö´ +°± +´ +°±+´ +±&+± ±99°±99°°9± ²999012#"'&'&=3#3032654&#"#54>œvJ<8/ ^ $+*a+/L84@ ,/B7:63ZÞ#²+°/´+°/±+±°901'?3e„R»3CfQZ<ÿç-%m²+² +°3±é°2²+±33°/°Ö±é°±+±é°±+±é± +±° 9°° 9°°9°±99±± 99013#5#"'#"&533253326£Š:Ji.?\Z`Š'fŠ!"25 ýÍ!,EEebwþ¦33€@þœ5'FAÿ&$%`²+´+²+²+²+± é²  +³@ +°/°Ö±é±22°± +±é°2±+± °9± °9013632#54#"!!#AŒ:hV_ŒZ3>Wþ©ŒNWbYfIa:0ç]Úÿ&p% |² +± é°2²+´+²+²+²+± é°/° ֱ鰱+±22±é°2² +³@ +±+±± 99±°9°± 99°°901"32654"&4632533##UjAA54B—d}ad2ŒNNŒ1°^˜]\JOþ–¢ø£YPþA]ÚXAÿ7r%g² +°3´+²  +³@ +²+²+± é°/°Ö±é°2°± +± é°2² +³@ +±+± °9±°90136323##4#"#AŒ:hV_NNŒZ3>ŒNWbYþó]Éa:0þ¼<ÿéÙ^²+²+± é²+² +´ +°/°Ö±é° 2°±+°2±é° 2±+±°9±°9° ±9901!#5#"&53!!326=3Œ:hV_ŒWþ©Z3>Œ@WbY5½]þa:0:#ÿ&u% q² +± é²+´+²+²+± é°/° ֱ鰱+±22±é² +³@ +±+±± 99± °9°± 99°°901"32654"&4632533#ZjAA54B—d}ad2ŒNÚ1°^˜]\JOþ–¢ø£YPýg]XFÿ‡ƒÙ Y²+´ +² +³@ +²+´  +´+° /°Ö± é°2° ±+´ +² +³@ +± +01%/#33#o^ÊŒ±±]ÖwÙÈ]þ©Aÿ&$%S² +²+´+²+²+± é°/°Ö±é°2°± +±é°2±+± °9± °9013632#4#"!!AŒ:hV_ŒZ3>WþNWbYþ–Ma:0þ?]Aÿ8t%$.…²+±,é²+² +± é´&$ +°3±& é°2°//°Ö±é° 2°± +±)é°)±.+°2±é°2². +³@ +±0+±) ± 99°.°9±&,° 9±° 9014&#"#3>323##".546;#"325º1A{ŒŒP0oh::"5"0F#EGF (<&8{þäj7<5Pnx 5L&33E_x3#ÿì©Ù S²+± é²+´  +°3± é°2°!/° ֱ鰱 +° 2±é°2±"+± °9±° 901#"&546;533+"3267"2G;"vŽ‘yfŒŠŠŒf'6 6B@+In<% —q†—ÈÈŒ0,5GLJFÿ8 ÙO²+²+² +± é² +³@ +°/°Ö±é° 2°±+±é±+±° 9± ° 9014#"#3632#”V/=ŒŒ:d 97 ŒJd<.ýô¡þõW'N5þ–Fÿ7 Ù-²+°/´+°/°Ö±é² +³@ +±+013#ÒNÚÙü»]¢Fÿ8Ùl²+²+± é² +³@ +² +²+°3´ +°/° Ö± é° 2° ±+±é°±+°2±é±+±°9±°901!#5#"&5##3332653Œ:hV_NŒŒÚZ3>Œ@WbYýy¡½þ¥a:0R#ÿé€ì 't²+± é°/± é°(/°Ö±é°±+´ +° ±+±é² +³@ +±)+± ´#$9°°$9°°9±³$9°°901"32654&';##"&5467&54>?.9FF98GEUcta{}Žh]&P´`š`_LP_¥ 1v=R‚˜™…q’+,P Aÿ8$ÙO²+± é² +³@ +²+²+°/°Ö± é° ±+°2±é±+± °9± °901##"&5332653$Œ:hV_ŒZ3>ŒÈWbY5ýèa:0RFåI²+° 3²+´ +±é°/°Ö±é°2°±+± é±+±°9±°901#3632#4&#"ЊŠ9I;S+Š)+pþäåâ(#@M2þ·I8-#ÿé9Ù /h²+²+± é²/+°0/°"ֱ鰱+±é°´ +°/±1+±"±$,99°¶%'*/$9±°9°/²"99901"32654&#5#"&54?654/&54?.9FF98GE* > :irZFk}Žfk :(:´`š`_LP_%  >•{þý$;™… MP   1Aÿ8r%Y²+²+²+± é° /´+°/°Ö±é°2°± +±é² +³@ +±+± °9±°90136323#4#"#AŒ:hV_NÚZ3>ŒNWbYþ+]a:0þ¼L² +± é°/±+017!&'7!547&'767± qf½UpýÒ¢)!(5Di_RQŒšsýPê‡FFÂæ †)yGr>Aÿé$Ù%²+²+± é²+´+²+²#+°&/°Ö± é° ±+°2±é°2°´ +°/±'+± °9°° 9°° 9± °9±°9°°901!#5#"&5332654./&546;"$Œ:hV_ŒZ3> .'&¿(@WbYxþ¥a:04  -]  &ÿ%-²+°/± é°/°Ö±é±+± ° 9°° 9013#"/7326yŠDW.  Dý¿ej {Aÿé$ÙU²+²+± é² +±é²+°/°Ö±é°±+°2±é±+±° 9°± 99±°901!#5#"&5432&#"32653$Œ:hV_Š)'&Z3>Œ@WbY®‡i*þ{a:0Rÿ8þ-/[°#/± é°/± é°0/°&ֱ鰱+±é±1+±&² 999°³,$9°°9± ²&999°°9014&#"'7>323!!"&54>7>k03&!j !)7Y3# kÆ! <þœO1>0h$K?%\   $5?1–Ax ŒDM$9'0> 5A0M²+° 3²+³ +±é°/°Ö±é°± +± é±+±±99° °9±°901#3632#4&#"ËŠ:RÊŠ57:þå%%0êþº%MADÿ8t!h²!+°/± é°"/°Ö± é² +³@ +³+± é°/± é² +³@ +±#+±±!99±± 99±°9°!°901;#"&54?654/&54?Irh!^,yå/LvP:x– 6F-Š x2(°, '"¬7ÿ8(%u² +°3±é°2²  +³@  +²+±33°/°Ö±é°±+±é°±+±é°±é°/± +±° 9°° 9°°9± ± 99013#5#"'#"&533253326žŠ:Ji.?\Z`Š'fŠ!"25ýÞ,EEebtþ©33€=þŸ5'F#ÿ82,^°/± é°%/± é°-/°Ö±(é°(±"+±é±.+±(± 99°"³$9°²999±°9°%³$901!"&54?4.54>323'7>54&#"ïþ®-b%66%KmBq;DF2( */I45):Tt+!^4*2T7Jf*‰mO}>@/ Ø (D&JH=/5!4A)%b² +°3´ +²+²+± é°/°Ö±é°2°±+±é±+±± 99°² 999± ±99°°90136323#654&#"#AŒ:hJpY/Úx7'3>ŒNWb; þó]M +:0þ¼Aÿé$R²+²+±é²+°3°/°Ö±é°±+±é±+±° 9°°9°±99±°9013#5#".53326Š€;Q/H* Š 26:ÿ%ýÑ$0+,=&QþÑJDDAÿ8rÙY²+± é²+² +°/´+°/° Ö± é° ±+°2±é² +³@ +±+± °9±°9013##"&5332653$NÚ:hV_ŒZ3>Œk]WbYxþ¥a:0Aÿé{%q²+°3²+± é²+°3²+± é° /°Ö± é° ±+°2±é°2°±+±é±!+± °9±°9± °9±°901!#5#"&5332653632#4#"$Œ:hV_ŒZ3>Œ:hV_ŒZ3>@WbYxþ¥a:0RNWbYþ–Ma:0Aÿ8$%D² +²+²+± é°/°Ö±é°2°± +±é±+± °9± °9013632#4#"#AŒ:hV_ŒZ3>ŒNWbYþ–Ma:0ýô(ÿ8#0#.{²+±*é²+³ +±$é° /±é² +³@ +°//° Ö±'é°'±+°,2±é±0+±' ±99°´ $9±°9°*°9°$° 9°°901253#".'3327#".54>"2654&"H6ƒ5dF*C-"„!2u4BNs87tU,GF^FJ0(þ!/?O0! ## Y$PPN„VzL[cJM]ZPF>/²+´+²+°/°Ö±é² +³@ +±+013#Òløþ@\Aÿ8{Ù{²+²+± é² +³@ +²+²+²+± é° /°Ö± é° ±+°2±é°2°±+±é±!+± °9±°9± °9±°901##"&5332653632#4#"$Œ:hV_ŒZ3>Œ:hV_ŒZ3>ÈWbYxþ¥a:0þõWbYþ–Ma:0Aÿ8E% |²+± é²+² +± é°/´+² +³@ +°/°Ö±é²222² +³@ +°±+± é±+±± 99±°9°± 99°°901"32654'2#"'!!#36xjAA54BVf|ad2Wþ©ŒŒ2°^˜]^IMÔ¤ö£X‚])äPY#ÿÛ;+$>°/±é°/±é°%/°Ö±é°± +±é±&+± °9±±99014>32".%"32654.#2SX/x”"5HGLGI5! '*)(4K)(Ry@ŸFmB++Aið "J53I#Oa1H##ÿ8ØÙ&-в+°3±(é°2²( +³@ +²( +³@( +²%+´% +± é°./° ֱ鰱+±22±é±'22°±*+± é±/+± °9±(± '99°±99°%± 9901##5"&5335.54>;654.:W 7Œ,›wŒ{œˆAJ8T1 6QO!x†67H (  "1V5r‚¹¸l_ 2ï%3.2N)þväY'7AÿérÙ[²+± é²+´+² +²+°/° Ö± é° ±+°2±é² +³@ +±+± °9±°901%3#5#"&5332653$NÚ:hV_ŒZ3>Œ]]@WbY5ýèa:0Rÿÿ2È}*°/±é°/±+±± 9901727#"'7æ#<8'#I*-~M!õE AÎð„²+°/°3´%+°2°/°3´%+°2° /± é° /°Ö± é°±+± 22± é±22² +³@ +°2² +³@ +°2±!+±±99±±9901!#5#535#5354 #5476 3#3#ƒ–RRRRþê–GRRGKKKKÍ6M6h‚‚ÜÜx@JJ@xh6M6ÿÿ+þõ}ÿÄ&®®ƒÿÿˆþõ÷ÿÄ&®z&®zƒ&®ê&®§ƒ®ÿ]ÿÿeþõÔÿÄ&±ŸªWÿÿ~þüôÿÄ&®w&®wв®+ÿr}ÿÄ*°/´ +´ +°/°Ö´ +´ +013#+RRÿ8X %°/± é°/° Ö± é² +³@  +±+014&+532#}Q4ºÅHm7‹m.Js1KGýÂLX1²+± é°/± é°/°Ö± é² +³@ +°2±+014&+532+53265‹N7ºÅ<_8% 7lGź5Pm*Ns#4@5”GK2sN*>SîR²+° /± é² +³@ +°/° ֱ鰱+±é°± +±é±+± ±99± °901%#54>=!3!š‹*/*þv‹Š*/*eek7K!6)B –¼:N!3PeX .²+± é°/± é°/°Ö±é°±+±é±+012!.'#!Z>c8% ýëŠ.#ÿX'7D3þXç"2 þŽCyXe²+±33± é°/±33± é°/°Ö±é² +³@ +±+°6º?Nöš+ °.°.°±ù°±ù³....°@014&+##5!2!53îG8EHŒH[,pšþòƒq1CþåsƒdþsOÿ8ÚX°/°Ö±é±é±+013O‹È üàIgX<²+± é°/± é°/°Ö± é² +³@ +³@ +±+± ° 901.#52!53Ü0 M`Cþâ“m(s,aCþŠsLaX6² +± é°/± é° /°Ö±é°±+±é±!+±° 9017!2#".%4&+>5L/YN/šm(XV8ŠS2z 8''7 âv3[:”mu2\Ç,Lú !+*"<ÿÉCXh°/°Ö±é±+°6ºÀÁ¹+ ° ° À± ù° ÀºÁ”ñà+ °° À±ù°À¶ .......¶ .......°@01%653573Z^‹)U9þØqŽˆ%YRþ¤=H<Lx$óHÿ8NYE°/± é°/± é°/° Ö±é² +³@ +°±+±é± +±°9°°901;#".=!#.#Ó$5A$9$xŽ‹ #-<&—#s?,Ë„]ýÃ7  OUX"C²+± é°/± é°"/± é°#/° Ö°2±é² +³@ +°±+±é±$+01;#".=!2#!532=4&#Ú#5A)5'Ik9<\L"ÿøƒX˜–"s =(Ë)EK+Eb,sw„L+ÿ8 X &°/°Ö±é°± +±é±+±° 901#36753 _C‹Éž˜7 ‹±SZ þ?æ:îMœ=^X$²+± é°/° Ö±é±+± °901!5!3>=3CFE¦ýø þÇžš$‹±0iþþsåî3œPÿ8WX A°/± é°/± é°/°Ö°2± é° ±+±é±+± °9± ± 99015!5!526'#Ìþ„‹o2?å‹Èsþ¼gytBŒýÅ;?X ² +°/± é° /° Ö± é± +014&+532#‡P5Ãχ}‹m3Es~dþŠLþX"Q²+± é°/± é²  +³@  +± !22°#/° Ö± é° ±+±é°± +±é±$+± °901+"&53326=3+;2653þ*KwEO}µ‹D%‹0F9@R-O8n‹)YO3¡hOþë#ÕÕ5L#*3X>O>­X4² +°3± é°/°3± é°/°Ö±é°±+±é±+014&+#'532=#5!2#"N7U!.H6$WB.{‰‹n3Dÿ>Y/tvüsyiþŠOÛX&²+°3°/°Ö±é°±+±é± +013333O‹v‹Xý¨Xý¨I×X#²+°/°Ö±é°±+±é± +0133Ô‹‹x‹M9Dý¨Xý¨IÖX.°/°3´ +°2°/°Ö±é°±+±é± +0133Ô‹‹‹‹M9Dþõ9D2Ö¼Ù#²+´ +°/°Ö±é±é±+01#'5¼*8(Ù‚‚2Ö¨Ù 0²+°3´ +°2° /°Ö±é°± +±é± +01#'5!#'5¼*8(v*8(Ù‚‚‚‚ÿÿþÊ|TßÿÀÿÿþÊ•T˜&# àý ÿAÐÿéx²+´ +°/°Ö´ $+01'kTTTxTTTÿÿB\ê'àþ£àýŒÿÿ ÿìëf&ã$à ÿìëy<º² +°/± é°"/´&+³&"+± é°-/±33±3 é°2°=/°)Ö´6+° Ö´+°6± +°2´ +² +³@  +² +³@  +±>+±6°89°°:9° ± 99± ±99°"± $99°°9°&²8999°-²/0699901275#5!###"'#".'732654&#"'3>754&#"'>32ß+h:`r [U7jG.WpY!5$&",702C4T~CB]&!T ¨qqýäSZA[S4Ì!1(k*&Q>3Q]F8+ÿìªyFͲ+°3°"/±, é°2/´7+³ 72+±é°?/² 333± é°2°G/°<Ö´+°/ Ö´+°±+° 2´+² +³@ +°±+´+² +³@ +±H+±/°9°°9°± 99±,±/99°2±599° °(9°7² )999°?²BC9990123275#5!#####"'#"./732654&#"'32>74&'"'546ùD^& "fÿWo`s [T3jL1V lT!1*& ./3>- T‹y^E7+ ¨qqýäýäSZ74W7&;y/®þÉ dé"#3,:~:KD;R9NZ92+&"8Ê ›;'8qqª; H'Ž6<d%G:76*'",!ÿöÿN˜Cù²5+´: +°/±& é° Ö±) é°#/± é° /° 3± é°2°/±é°D/°Ö´+² +³@ +°³"+´ +°/´" +°"´ +° /²" +³@" +°±A+´,+±E+±²#5:999° µ%'>$9±A±.99°"´)2$9°,±99±:5±.>99±&°,9± #°9±±99°°901%"#"&546;5!5!&54632&#"3##27632.'&'4632>74&W1*;y/®þÉ)B[;-,;Fydé *10,:~#>$D;R9¥99"8Ê ›;'8q\G@<g/°&Ö´+°/ Ö´9+²9/ +³@96 +²/9 +³@/3 +°± +´+±?+±9&²7;=999°±99° ² 999°°9±$°9°*³ $9°+³ ;=$9°3²9999012'7654'#"./7254&+'32654&'!5!!JŠUt [ [*0xN,U@<&#b 35AU9'n0f@5þi`þµ){[Aa† 7}.)6S_)+±;-± 99°4³16$9±±99°#µ $901%2?#"&5467'#5'%&''7>325!5!!674/54632#"!ZNXLU0&vrþûDM&‡F6™'I:þ+ÕþrE0*!(A"JS`N^?0H2õÅ–[—TJW D7;ªqqµ+37'+#v#/ÿöÿu³y@Ѱ)/±" é°>/°53± é²> +³@>: +°/°3± é°A/° Ö´+°±:+´9+³,9:+´+°9±+´+² +³@ +°±2 +´+²2 +³@ +±B+±:± 99°,±99±±0599°²"%)999±")±&99°>µ %,2$9° ³$901'.54632675!5!#32?#"&54>54&#"#54&#"›a+FG{cIJ/5þU½ 7:'77'50>@JLr'77'*'r#! 8{d´ZLm+!=qqCShY8, a -WE+C,)5  $Zi0ÿÿÿöÿeã>&í#Vÿÿÿöÿeãf&í$Öÿöÿeãy'[°/± 33± é°(/°Ö´+² +³@ +°±+´ +²  +³@ +±)+±³$&$9° ±99014'&'%#5!#'>=##'32Fþê4í/m] 8§lV%! 7&(ü,qq¾S(M"®ø^N%-' cÿÿÿöÿeã„&í%Öÿÿÿìª2&ä#ÿøÿÿÿìªf&ä$pÿÿÿ쪄&ä%zÿÿÿ쪒&ä&pÿöÿìy.®²#+°&/± é°/°3±, é°2° /°3± é°//°)Ö´+°±#+° 2´"+°2²"# +³@" +²#" +³@# +°"±+´+±0+±#²&,.999±"²999±&#°9°±$99°µ !)$9°,±.9901&#"3267!5!!632'>54&#"#5#"&54632,,%%Q<þ›)þ­3;AhŠa(R")@q89Hy`T5P)!L qqi/fB\¡G#k& hþø‰!kMG} ÿöÿì>y"=°²:+°#/± é°/± é°/±é°4/± 733±5 é°>/°2Ö´+²2 +³@24 +°±+´+°±:+² 222´9+²9: +³@97 +±?+±±#99°:²999±#°;9± ±99°³ 0$9°²+,999012&#"32705!3267#"&54>".'732=#5!##5%%782'þÒ12jM.v221A](;0o=jI="^åHRq0{èg ,+/³‡*;8S(1OH,A þ!+>XIU 8F yqqýä_'ÿöÿì<yk²+° /± 33± é² +³@  +°/°Ö´+°´ +°/² +³@ +°±+´+² +³@ +±+±°901"&54735#5!##ý23n;(—FQp~ G|(*vqqýåÿöÿì€y(’² +°/± é°/±& é°/± 33± é°)/°Ö´+² +³@ +³@ +°± +°2´ +² +³@ +±*+±²!#999° ²'(999±° 9°°9°&°9°°901.547#5!##5#".=4"3275#;u (?ŠSqeM6E0· &!#Mmþ<Y@VH,qqýä¥8C,2#Gõ 'tÿöÿè y5¢²+±*é°0/± é°3 Ö± é°/± é° /° 3± é°6/°-Ö´+° Ö´+² +³@ +² +³@ +³@ +±7+±-°09°°9°°9±03±-99°±$99±²%999°±9901'%46;5!5!##32632#".'732654&#"#"&œXXXþy?­þ4Úð& ]$3'?D$@|TM f7N]*+2J@ƒ™XXX8-*8qqª!%V'9T+:Ib2E$LY92* ÿöÿìžy‘² +°/± é°/°3± é°/°3± é°/°Ö´+² +³@ +² +³@ +°± +°2´ +² +³@  +² +³@  +±+±°9° °9±° 9°±9901%2675!5!##5"&547#5!#3.\þ¨QqXSG[)Ž‘f*+ÎU6¯qqýä¹GRD:3rr#7ÿöÿä¶y8Ú°/±7 é°//´,+²,/ +³@,. +°/± &33± é°9/°Ö´4+° Ö´)+²) +³@ +°4±#+´+°±+´+² +³@ +³ +´%+°%/´ +±:+±°9°)°9°4°'9°#²,.999°%° 9±/7² 999°,µ#$9°² %99901.547#5!##"&54%"654.5475#327"2€',EÀŠ+0Fjy7^l!$j' Vû$61* 08H \2&qqO=;J€Q.vVBh03-!B-á=M1V+S++)f2-ÿöÿìñy€² +°/± é°/± é°/° 3± é°/°Ö´+² +³@ +³@ +°± +°2´ +² +³@ +±+±°9±±99°±99°°901%4&'5!5!5!####"7326v5!ýÈûQrY25¸gmhPüW#&Mqqýä_%)/E$O/þôÿöÿNæy,;β+²+´$ +°/±3 é° Ö±:é°° Ö±6 é°1/± é° /±.33± é°7475##3263232WZ;y/®þÉðRq q9KB;R9¨9:"9À…é(V/ Ê›;'8qqýäºj0@ \%G:l*'".!Nðª;*ÿöÿìÚy+w²+°/± é°/±é°'/± é°/° 3± é°,/°Ö°2´ +²  +³@ +² +³@ +±-+± °9±²#999°'²)999°°*90123275!5!##5#"'"&'732654.#"'6ü“0ýàäSq (,L15eJK2#&-/%$ ,#LVР ÔqqýäØ/5".9Z.4.!, Y3ÿöÿæjyn²+± é° /± é°/° 3± é°/°Ö´+² +³@ +°±+´ +²  +³@ +±+±±99° °9± ±9901746;5!5!##"327#"&Aq@ƒþt„è,&/%W4hg‡t¦òUyHqqº>"$9 ^@ŽšÿöÿòEy!•²+± é°/± é°/° 3± é°"/°Ö´+² +³@ +°± +´+³! +´+°/´!+²! +³@! +±#+±± 99° °9±!°9± ²999°°901#"32654'7#"&546;5!5!#Ïò "#5-4@[5‡_s”kQzþ—OvB9'<.('):>PYk¨\LqUqqÿöÿè•y1”²+±&é°,/± é°/ Ö± é° /± é°/° 3± é°2/°)Ö´+° Ö´ +²  +³@ +² +³@ +³@ +±3+±)°,9° °9±,/±)99°° 9± °!9°°90146;5!5!##32632#".'732654&#"#"&½?­þ4Ÿcð& ]$3'?D$@|TM f7N]*+2J@ƒy-*8qqª!%V'9T+:Ib2E$LY92* ÿöÿæLy&/£²$+°+/± é°/± é°/° 3± é°0/°Ö´+² +³@ +°±+´.+°.±)+´ +³ )+´+°/´ +²  +³@ +±1+±±$99±).°9±+$³'$9°±990174>;5!5!##"&54632#"&654#"1#I2„þ“Vwì '83J;5!5!###".* 4#þþRpQqÏ~(Q!!!.-/@qqýäj>œU!*%/+)ÿìÆy3§² +° /± é°$/±é°/±33± é°,2°4/°'Ö´+°±+´/+°/± +°2´ +² +³@  +² +³@  +±5+±'°9°³!$,2$9°/± 99± ° 9°$³2$9°°/9°°'901%275#5!##5#".532654&#"327#"&54>32Dd[h+RqZd@oF'@.LC*&- ;K(:0Sj]W%Ðz¾qqýä¼K5PZ(34",aC@'9 qMPfÿöÿÅ-y)¡°$/± é²$ +³@$! +²$ +³@ +° /± é°/° 3± é°*/°Ö´+² +³@ +°±+´ $+³ +´+°/´ +²  +³@ +±++±°$9° ²!999±$°9° ±990146;5!5!#!"4&54632#'&'.*O>«þ”0RþüPS0*1' F–HoA)&Fd8qqª85(/1&3!j$ 0F.=8)ÿìƒy/Ȳ +° /± é°*/±)é°/±!33± é°2² +³@ +°0/°Ö´$+° Ö´-+°$±+´+°± +°2´ +² +³@  +² +³@  +±1+±$°9°-±!99±² '999° ±)*99± ° 9°*°9°)²'999°±$9901%275#5!##5#".547&54632#54#"63"=h`$RrWf2J#+VS;7Nq +1[aF.Äeßqqýä¬F$6,9+GZ8TS033@m"ÿöÿìjyV² +°/± é² +³@ +°/° 3± é°/° Ö°2´ +² +³@ +² +³@ +³@  +±+01463!5!5!####"&*' 6þOtQr¸5rV2eqqýäGD8ÿÿÿöÿÁjy&X6ÿöÿìy e² +°/± é°/±33± é°/°Ö´+² +³@ +°± +°2´ +² +³@  +±+± °9±° 9017"&=#5!##5'275#óTu4Sp*51.³-’bJÊqqýä»r+ÙÆ"ÿöÿìy (£²+°/±$ é°/± é°/±'33± é°)/°Ö´!+²! +³@ +°!±+°&2´+° 2² +³@ +°±+´+±*+±!°9±² 999±±99°$±99°²&999° ° 9017"&=#5!!632'654&#"#5'3275#óTu4þ¯6+Mj:az+Sp+ˆ-'1.³’bJÊqq{(bM%MJMr8Lþóº°"%ßÿöÿìy€²+° /±é°/± é°/°3± é°/° Ö´+°±+°2´+² +³@ +² +³@ +± +±³ $9± °9°³ $9°°901!5!##5#"&54672&#"27'[þ›(Rq46_hdO+!  †m},qqýä• vDLt p [@ M)/ÿìty'¨²+°/± é°2² +³@ +°/± 33±é° 2°(/°%Ö´ +° ±+´+°2² +³@ +°±+°2´+² +³@ +² +³@ +±)+± %°#9°±"99°°9±°9°±"%9901235#5!####"&546;54#"#&546•,-‘h+Rq‘4#i# t Tw 3#œ§qqýäO |",†$/#)9Hÿöÿì8y|² +°/± é°2² +³@ +°/± 33± é°/°Ö´+°2² +³@ +³@ +°± +°2´ +² +³@ +±+±°9±°90146;5#5!####"&%5#$hBRq§3$ig§.§qqýä:5zg§§ÿöÿì^y$r² +° /± é°/±33± é°%/°Ö´ +² +³@ +° ± +°2´+² +³@ +±&+± ³ #$9± ° 9°±99014'#5!##5#"&'326275#¼,šhRr6Dv~   #)^D<ƒ:2À%#qqýä¾!•… #¬DÊ$'0](ÿöÿÖåy>°/°3± é°/°Ö´+² +³@ +² +³@ +±+±°901.'732=!5!#ŒP:lKOVŒt\*A*þÛïYŒ9L—IM\¶ª@> .fqqÿÿÿöÿ¦åy&›ÿöÿèÂy#t²+°3°"/± é°/°3± é°$/° Ö´+°±+°2´+² +³@ +² +³@ +±%+±² 999±"± 99° ±99017".54632675!5!##'47&'›™3&HL>(oTXD8>ý÷ÌQr-C c %_øFh`.?^5Mj?2 VqqýäRc,2.&ÿö&Çy*6¥°/°3±4 é° 2°./°&3± é°/°3± é°7/°Ö´1+°1±#+´+²# +³@ +³ #+´+°/´ +² +³@ +±8+±1µ+$9°#² &999±4°9°.±99°² 99901675!5!##"'#"&5463232654&#".#"326d'4þ7Ñ– .]TW.0XQ^gMQl0!$u*!!!!"&„.GqqL7=-\uCGt]YtÎ!>=*&-$ %2)04-Aÿÿÿöÿ‰Çy&™ÿþÿöÿìy~²+°/± é°/± é° /°3± é°/°Ö´+°±+° 2´+² +³@ +² +³@ +±+±²999±°9°² 999°°901&#"327!5!##5#"&54632"'.##1#64þ±(hq69PqbQ&4^ , )#0qqýä“!vGLu ÿöÿÔ¸y (в'+°/±é°!/² $333±" é°)/°Ö´+² +³@! +°±'+´&+²&' +³@&$ +±*+±² 999°'µ$9±'µ$9°± 99°!°901&#"32677>7#".547#5##41 *odJ¢NþÈH8(X$( B7_ÂWoÕ3@18QˆQS0&%@.&qoýäÿöÿìy q² +°/± é°/±33± é°/°Ö´+² +³@ +°± +°2´ +² +³@  +±+± ²999±° 9°±99017"&=#5!##575#327'óTu4Sp**….,(/›†bKÕqqýä¯õÑ"¤ÿöÿâÍy²+°/± é°/±33± é°/°Ö´+² +³@ +°±+°2´+² +³@ +±+±² 999°° 9±± 99°±99°±9901###'.'732=!5!5#ÍQsš&3ZZQWŽl\*A*þÛ×Ä}ýä}ZJ^¶œ@> $pqÿŽŽÿöÿ¦y3ª°/´+°1/± é°/± é°/°3± é°4/° Ö´+² +³@  +³@  +°±-+´#+° Ö´+² +³@ +±5+± ° 9°³+1$9±-³)*$9±1² #*999°± 99±°9017".547&546;5!5!#!632'674.#"£‘e KgP99C."Úþ£"Uþä5"?@'  M(,3J{-: c-S6;7I?"38qqª A-N2ÿ}zÿÕ*#°/´ +°/°Ö´ +´ +01#5+X*°°ÿÿÿöÿì*&Üþvÿ‹ÿ3°/´ +°/°Ö´ $+01%'þÊTTT3TTTÿÝây"Z°/± é° /± é°#/°Ö´+°±+´+°2±$+±°9°²999°°9± ³ $901#".'732654.5463!!"­`s`oR/`E.R"e( 9?[[?L9 þñß NXv/Ic"/+ K32?#".546;#"‰ 0-G=A*J>k^92°J-=(?#".547&þÆJ>k^9'!$0,H5 1,I*TE>32#"/732654'"#".=73254'&#'32654#"'546bTTTQ'A]uOPu[FþËD[#  ;7N"M\ZLD/2"=&/S/ 79-ZA4T %79==&;!*P2 M{TTTa-1R]_P0.fI=( 2;2~a_8 t'2)‚+532H%5LP7 08I.=) s-"=  8 ^ÿ}zÿÕŽ#°/´ +°/°Ö´ +´ +01#+XŽþìýÖþõÿ<°/´ +´ +°/01!5!ýÆ:þõGþÖÿBŽ1°/° /´+°/° Ö´ +± ± 99°±9901.#"67632¾I  .A'"$ Ý  $T" ' -ÿ"ÖNŽ/°/°/´+°/°Ö´ +±±99°°9012&#"'676'"'A.P.Ž"T$SCþÊVT„^² +´+² +³@ +° 2°/´+°/° Ö´ +°±+´ +± ±99°± 99°±990126753"&'53!!q(?]užv[.,ªtþŒ!(1 SadP !, qZþ:ÿRÿè $²+° 3°/´+°/±± 9901 /726?BþÌJGgDgG®Z44ÿÿþ:þÊÿè&44ÿxÿÿÿöÿy&óûÿöÿÿÿöÿB>y&ô¬ÿ·ÿÿÿöÿì<y&õÁŠÿÿÿöÿ‘ñy&úmÿÿÿöÿ3•y&ÿ³ÿ¨ÿÿÿöÿ3Ly'ÿ¨ÿÿÿöÿ£y'ÿ ÿÿÿöÿ~^y& Eÿóÿöÿ0¶yNß²+°-3± é²$+²+± é°4/±9 é°=/°@3±> é°O/°.Ö°;2´-+°A2²-. +³@-@ +².- +³@.= +°-±E+±K é°' Ö´+°E°# Ö´+±P+±E#°%9°±*+99±Kµ HM$9±°9°±#99°²%0999°4@ '+,/16BM$9°9´7;CEK$9°=°H901%"32>1#"327#".547&5467'#5'%&#"'6325!5!!7&54632&%@     SQR"(#7(9;I%E?&%-'qpÿDÿR&‘DÌ8?_þ5Àþ{S-)"'@Ì&   ]K!$Z;!@*0'+;-H1öÇ“Y”WS\ffœpp¯$ +38&, sÿöþɼyT ²+²!+±' é°6/±. é°R/°I3± é²R +³@RN +°/°3± é°U/°Ö´+°±N+´M+°M± +°>2´+²  +³@  +°° Ö´@+°@/´+°°+ Ö´<+°99±R!µ#@F$9° ² 99901.54632675!5!#327#"32>7#".'47&54>54&#"#54&#"˜—9MaFH03þ^®4= ..!!,;4%.;0&,;."2"10"%)o%nZ]±`Mh* :ppAS6/N1'#Z [ :%3%)?*E/*.Xf$þLþÔ:™8©²+´"+°7/°.3´ +°2²7 +³@73 +°9/°Ö´ +°±3+´2 +³'23+´ +°2±,+´ +±3± 99°'± 99±2²*.999±,³"$9±"± 99°7´'$9° ° 901%.54632632327#".54>4&#"#54&#þªC-->cM65$/0E ## 380+A '.'"^+0NR„L54#"#54&#þ«F,/H[L96$#( 0$?> "'5'*(%+7%$'.'7 ^+“/NQ"}Q0V#1!%[B K&  L 4$% 0$C)+!GR _ÿoʱ°/°Ö´+´+±+01'ÊkCý,nÔÿÿÚÿ}¿'Bÿ{BPFIø H°/± é°/± é°/°Ö´+°±+´+±+±²999± ±9901"&546322654&#"øuÊsvbcwÚ2763.9'hvtjgxyÔ:728:4m]ÿìÓy L²+°/± é°/± é°/° Ö´+°±+°2´+±+±±99±°9012##"&'4632654&#"Uiq)Qiu+*#3*ytYþ@, eNSh·#$!'(*;ÿŸyT° /´ +°/± é° /°Ö´+² +³@ +±!+±°9± ±99°²999°°9012'#".54632>4&'"'>b‰_;}]Ž "-/'=2(DA86aL$~y|^]zÉCä*#(,b\94P 5Fÿnúy+n°!/´& +°/± é° /± é°,/°Ö´+° Ö´+±-+± °9°±99±&!±)99°°9°°9° ±99°°901%4&#'32654&'"'632'&54632>ˆT0d,Ž3)$.$KC_m<>&-UN;Jak|(!E#/Í%7tb>!D.I)5aG^k>R&*)7:ÿð}#.…²+±* é°//° Ö´'+°'° Ö´+°/´+°'±-+´+°° Ö´+°/´+±0+± °9°'° 9°-´ !$9°°9°°"901#"&547.5467>54.'732654^lNLhYOC7"] V%;A!gDæ,&) ñZfSKJYZLJS9P7,H< O&D"1 *SþÈ: +Rÿì2†² +°3° /± é² +³@ +°/°Ö´+°±+´ +±+°6ºÂììá+ ° .° À± ù°À± ..³ ....°@±°9°² 999°°9012#'#"&547327&546Š)]wH'0WsFe98''ö' H-þ׿zci~6Jc>2*%4>Rÿ|þy.²+± é°/± é°,/±' é°//° Ö´ +°$ Ö´+° ±+± é±0+± °"9± ³ ',$9°¶)*$9± °9°² 999°°"9°,±$*99°'°)901;#"327&54632'#"&547&54632&#"ÄJV&v&53) +)&,#:g:ZyEVlIM-GD8Ù?&'&546254&#".I* ^K‹ )#- (¦cZD&)!y(3%Hg í)@/  P#6Ifï?"&9Q¬9’`°/´ +° /´ +°/°Ö´  +° ±+´ +±+± ±99±±99±°9° °9°°9012"&54"32654&•`DD`Dt ’D`BC0/ wà O"°/± é± é°/°Ö± é± é±+01#53 ••ÃŒÿÿ ÿì:&ã#Àÿÿ ÿìë*&ã¨ÿÿÿìª*&ä\ÿÿÿìªf&ä ÿÿ ÿRëy&ã4Nÿÿ þÊëy&ã5Nÿÿÿöÿ\ñy&ú'÷;'jÿÑá7ÿöÿì^y#O² +° /± é°/±!33± é°$/° Ö° 2´+² +³@ +±%+± ° 9°³ $9014'#5!##5#"&'326327'5#¼,šhRr6Dv~  "(V 0@)%¸gl 0> ü.5&MqqþAqq%)YPO,(L]8OÿíyH²+°/± é°/°Ö´+°± +´+±+±°9±±99°°9012#2654&'"'>/b‰wFpRlA86aL$~y|^dŠ® h@.94P 5ÿÿÿöÿ—•y&ÿ0D¢ÿöÿØy"‘°/± é° 2°/±é°/± é°/° 3± é°#/°Ö´+°±+°2´ +²  +³@ +³@  +² +³@ +³@ +±$+±³!$9±°9°³"$9°°901727'!5!#3!5!5#"&54672&#"î},”þ›(RHýì[46_hdO3' †Í M)/;qqþAqq8 vDLt s [þÅÀÿþ¿"R° /´+² +³ +°2°/±é°#/°Ö±+´!+°!±+±°9°!± 99°°9012>32#".54327"&4632Ÿ,5  ,'03 3)-6-N&;! A/P-6-:0&&ÿ®ÂRf $°/´ +´ +° /°Ö± é± é01"&4632"00"$..Â0D00D0(10:y°/´7 +°1/´) +°/´ +°/´  +°;/°$Ö°2´4 +°2°4±+°82´ +°.2±<+±4³ )$9±17±.$99±±9901".54>32'"32654&".54>32'"264&¬ &0! ' 8M 0'#*&0 !0& &0!M8 "4"#v 8&2M8'8 Á*,# ýæ 9&'8 8'8MÁ+#"4"ÿ÷•:²2+°/°/3± é°-2°;/°Ö±+´6 +°6°* Ö´+°/´*+°6±2+°,2´1+²12 +³@1/ +±<+±² "999°²&9999°6°79±2²"*,999°°&901%4>54'#"54>7654+532>76753###"L%+%#eM .-R /F\-A -2U,0,7Bï~qY6(/Vz:*:GC@h_;E  +(pP"0,,62I^!ÊpýïI.44A8ÿ÷‘>ª²6+°/±/333± é°-2² +³@2 +°?/°Ö±+´: +°:°* Ö´+°/´*+°:±6+°,2´5+°5±2+´1+²12 +³@1/ +±@+±² "999°²&=999°:°;9±6²"*,999°°&901%4>54'#"54>7654+532>7675!#####"L%+%#eM .-R /F\-A -2U,0,7Bë„p†qY6(/Vz:*:GC@h_;E  +(pP"0,,62I^!ÊpþéýïI.44A8ÿÊÿù°¥7<ز-+² +±é² +³ +° /±:é°:± é°//²*8333±0 é°2°/±4é²4 +³@7 +°=/°-Ö°12´,+°2²-, +³@-/ +°,±+´7+°7±;+´ +°2² ; +³@  +±>+±,-°29°³&*4$9°7±(899°;² 999° °9± ±&99±: °(901.#"!#&#"32>32#".'67&'###53>32375$>?'|–;^> $‰I"9 'J/ز*+² +±8é²8 +³8= +°0/±é°±. é°/²'+333± é°%2°/±"é²" +³@ +°?/°Ö´.+°2³.+´+°/´+°.±*+°2´)+°%2²)* +³@)' +²*) +³@* +±@+±² 08999±.°;9°*±"99°)°$9±.8±599±0°901375#".'67&'#5!3.#"#46323##+&#"32>32Ó-kl'J/?"m^ygl‚‚og—;^> $‰I"9 xuþ{ -4%(P5^G5spbY0Lov„ pýïæ&#Cÿÿÿ÷ÿ ™"©ÿÿÿ÷þ™™"©õÿÿÿøÿùã¡"¨‘Ìÿÿÿ÷•Æ"`’ÿùÿ÷ÿù´-;“²+±3 é°;/±é°/± 33± é°+2°(/±é°3#.#"!32654&#"ÅnMc,5 þnK8^w]þ•UX/DvK`'7#C@Y a\"Wý¿3O-;2]4„‰)2==+j#E^Shp@]F2&Yspó4@*,1Bÿÿÿ÷•Ï"`”hÿöæ%~²+°/±é°#/±é° /° 3± é°&/°Ö´+°±+´ +²  +³@ +² +³@ +±'+±³ $9° ±99±#²999°°901463267!5!##'#".7327'&#"‡aZAA,ýëðjLD+tFk|4Q. n@0UV<1A0=Zw45_Hpp•p¨~$4@//;w5":ÿ÷²…²+°/± é°/± é° /°3± é°2°/°Ö´+² +³@ +°±+±22´+² +³@ +± +±±99°±99±°9°°9°°9013275%4&+532353##5#"'>Ñ 8hX3$,Øs#a™pýïq>B\@žQp C,2Eo5~^+\WÿðÿðÔ$-ž²+°/±(é°,/±é°/±é° /° 3± é°./° Ö´+²  +³@ +° ° Ö´%+°±+´+² +³@ +±/+±µ(*,$9°±99±(°9°,± 99°²999012654#!5#5!!32#&'#"&54>327&#"ì@V51iþÀOäýÜéVi8,5u&WgPj&K7"/3@5F/).(,4±ppKWG.W0l.0BT@-.“'1ÿò色+± é°/°3± é² +³@ +° /° 3± é°/°Ö´+°2² +³@ +°±+°2´+² +³@ +² +³@ +±+±°9°°9±°9014632!5!5!##"#"&26=! b6:ýûöƒeû%"n1KþèR3K.Žppþ«Th#Ç%,S¤ÿöÿûÄ"'-©² +±-é°#2°(/°'3±é°/± é° /°3± é°./°Ö´+² +³@ +°±-+´#+°#± +´+² +³@ +±/+±±+99°-°9°#± 99± °%9±(-±99°±99°±99017467&54>3!5!5!#!"632!"&%654'# 0& )þÎyþl)fGaW+þÙ“—^„„o@@€Œ",>-"2 Opp¹  7)?, ÿôĈ°/°3± é² +³@ +°2² +³@ +° /° 3± é°/°Ö´+°2² +³@ +°±+°2´+² +³@ +² +³@ +±+±°9±°901463235!5!##5##5#".N;@ûþÐ~pûp" A6A3ªppýïøøø ÿ÷ÿå¯17°!/´' #+° Ö±,é°,´ +°/±5é²5 +³@ +° /±233± é°8/°/Ö°72´+²/ +³@ +±9+±/°9±°9°!°9°,°$9±'±/99°5²99901"#"&547&'#5!##".#"&5463232654&'327N!›4gC&:¸pWcxd +2*<"'*5*S?UÈW,Q,M* "+UppJB7URl'#)#&6-&9Ä%1VÿøÿóÀ(¨²+´+°° Ö´ +° /± é°&/±é° /±#33±! é°)/°Ö´+² +³@ +°±+´$+°2²$ +³@$# +±*+±±99°´ $9°$² 999± °9±& °9°°901;53!#327#".'.547&'#5!#!"âA"yþÏpûc%YP/4B=(vp oÈþ¡.1HÔ!kTR!H1X32"&'>7675!5!##"ƒ$I8%(^¾Ût.J­þËz-„œ\7‡_&&#%[}LDq,Lpp²@\-7ÿòÿóÚ $}²"+± é°/°3± é°%/° Ö´+²  +³@  +°±+´+°± +´+² +³@ +±&+±°9°±"99° °9±² 99901"326544>75!5!!#"&­¢k@1KhXþ1_?þÎèþ¹@`2¬€¬aL=AF0:7*@51 EppE 24@*h€ÿûÿû¹+4‘²)+±/é°3/±é° /±é³ +´ ++°/°3± é°5/°Ö´,+°,±+°2´$+²$ +³@$ +±6+±,°9°µ ")1$9±3/°9°²$999± ±"990174632654&#"#"54632327!5!##"&7327&#"#_MkbPscF1NoCþ$¾c 5(s GŠ^avmM 5?JY<“:F` .6C *Wpp-=k,OJ,T@8ÿõÿêÊ$-¾²+±%é°)/±é°/°!3± é² +³@ +° /° 3± é°./°!Ö´+°2²! +³@! +°±+´+² +³@ +² +³@ +°° Ö´'+°'/´+±/+±!± 99°´%),$9±)%°9°±99±°9014632!5!5!#!632#"'&'#"&254#"^28þÕ€þŽMcHX !G3 u1#«79 +k3G)rppâ!7+VG;,/˜@m#ÿ '!ÿ÷ÿûè/X²+±,é², +³, +°$/´+³$+±é°/°3± é°0/±1+±$,± 99±±99°°901%2#".'>325&'#5!!&'#.#"32>_·E$Sud"?Z3=?Å1®ñþnMÌB:k"+,+4O`—  ] #U=5K-$)J7!5!##".563232654.#"#"54 Š2# þÉeNhwa8~\= $Ä=>2$<< Wb›1(qquD;dWj$0- !B+*+ GBÿøÄ‚ˆ²+°/± é°/± é° /±33± é°/°Ö´+² +³@ +°±+±22´+² +³@ +± +±²999°±99±°9°°9± °901!#5#"'654'#5!#!353275JpVX}v8qÌzþûþð:JC_j'ˆ–l2qq0"gØ ?<1VÿöÿûÊ&™² +±$é²$ +³$ +°!/°3± é²! +³@ +°/°3± é°'/°Ö´!+°2²! +³@ +°!±+´ +²  +³@  +² +³@ +±(+±!°9°± $99° °9±!°901%2#".'#"5463235!5!#!326L YEg:$ Ab1:ýþÔyþ’H`9y‘ $R#4ND*82P.”ppþý[Q/ÿó«s²+°/±é° /±33± é°/° Ö´+²  +³@ +°±+°2´+² +³@ +±+± °9°±99±°9° °901!#5#"&'654'#5!#!3270pRWC„,8e¸{þ˜,D@>^„'O>[!pp "AŠ=0ÿöÿì¯+€²%+°3°/°3± é°,/°Ö´ +² +³@ % +² +³@ +° ±+´ +° ±+´ +²  +³@  +² +³@ +±-+± °9±%°90174675!5!!5>54.#".!yhþô¹þÂk{?()!)=4Jb!%!9 ËM‡\pp\‡N)B()j-#%8 U0#.j+7ÿ÷¹z²+°/±é°/° 3± é° 2°/°Ö´+² +³@ +°±+°2´ +²  +³@ +±+±±99°±99±°9°²999012273##5#"&'>54+5Z=UKHŒ\èxpTWOŽP$ .g —$b32>7!5!##".5463232654'#"&%&#"32'@E%[Mþ.¨eP@3RU,qj–N5EcsL\066U9JR)<;#%!pp\V=R54+53233####"$kjëóƒpõ OhC?f6spÍCpýï)-' ÿó² +°/± é° /± é°/±33± é° /°Ö´+² +³@ +°±+´+°± +°2´ +² +³@  +±!+±±99°±99± ±99±±99017654'#5!####"&32=35A`)‚qjSBPžˆ5OG"ÛÑ­M(ppýïD@Vvu#'[„R@™¢ÿøÿô°m²+± é°/± é° /° 3± é°/°Ö´+² +³@ +°±+°2´+² +³@ +±+±°9°°9±°901".54;5!5!#'2=#"â gªÑþ2¸z-×*D\ g”=upppþžU ;”$DYÿùÿðë(+‡²&+°3±% é°2°/±*33± é°,/°Ö´#+²# +³@#& +²# +³@ +°#±+´ +²  +³@  +² +³@ +±-+±#µ *+$9±%³ )$9017467'#5!#5>54.'#'.%7#XU;ò¢:WU’~0C! * \,Z*¡’RfÊÞI{ZppZ|Hfp'&#5 –– 4$vpƒô£ÿÎÿð;'*4´²%+±+33±$ é°2²%+´1 +°/±)33± é°5/°Ö´"+²" +³@"% +²" +³@ +³3"+±. é°./±3 é°"±+´ +²  +³@  +² +³@ +±6+±"µ  )*$9±$%±.299±1· "($9017467'#5!#5>54.'#'.%7#"&5462gWU;ßB¡.-ÞJzZppZ{Ifp'%$4 ––7/vp‚õ£ýß- !,,B,ÿ÷ÿø§'—²+±é°/±é°/±é°/° 3± é°(/°Ö´+² +³@ +°±+´ +²  +³@ +±)+±°%9°³$$9° ³$9±°9°±#99°±$%99°°9014>;5!5!#!"3!#327#".'.+?3ýþ;°zþ™Epú?0[]2T448.G&8 Hpp² j-[&<2AÿòÔ&´² +° Ö´! +°/± é² +³@ +°/± 33± é°'/°Ö´+² +³@ +°° Ö´ $+°/´ $+°±+±$ é°$± +°2´ +² +³@ +±(+±±99±±99±!°9±°90174654/#5!####"&35"&54>32_ kâpù$@$.³ö#0$" #10iÓ"%(Sppýïÿa+É[G¢ýÿ0#!) 1$#0ÿ÷ϲ +°/± é² +³@ +°/± 33± é°/°Ö´+² +³@ +°° Ö´ $+°/´ $+°± +°2´ +² +³@ +±+±±99±±99± °9±°90174654/#5!####"&35)^ qØzpï$>%.³ëi¾4"&Sppýïÿa+É[G¢ÿôŸo²+± é° /± é°/°3± é° /°Ö´ +² +³@  +° ±+´+² +³@ +² +³@ +±!+± °9± °9014>;#"325!5!##".,!;&JB1vOIþE«€"9:C“i 'p )sF[ppþœ1G%J…ÿ8ÿTÿ¶ÿÔ $°/± é± é° /° Ö´+´+012#"&54›$-"," -"ÿìúLA°/°3± é² +³@ +°/°Ö´+² +³@ +² +³@ +± +017##5!#Èpl`„úppÿô¥r² +° /°3± é°2°/±é² +³@ +°/° Ö°2´ +°2² +³@  +² +³@ +° ±+´+±+± °9°°901.#"3###53>32«$>?'qqowwlgy^ÀN.Lopýïp „upÿI¥r²+° /°3± é°2°/±é² +³@ +°/°Ö´+°±+° 2´+°2² +³@ +² +³@ +±+±°9°°90123###53.#"#46gl‚‚ogg(>?"m^¥„ pýïpbY0Lovýßÿ ÿbÿº °/± é° /±±9901#"'5327žo[\]f\d]¸((r)'ýßþ•ÿbÿÙ 2²+°3° /±é°/±é°/± ± 99±±9901#"'5327#"'5327žm]Z_f\e\l^\]c_d]“''l)(þå((l('ý¸’ÿ`¡° /±é²  +³@  +°/01#"/.'&5432  )*J]v#Jšˆ<¥ )-45‘?ýŒÿjÍ#6²"+°3±é²" +³@" +² +° /°3±é°$/± °90146;2.#"#"54632#"&#"+"ýŒ7( A^J2!Á1 $L@.a±:Ü94Sø '! @_2 „k/ :ýâ£ÿlÐ ° /±é²  +³@  +°!/°Ö01#".'&+"&'&54632;”  \V5  $>108Æ#$  (30#  %4ýšÿ|Ï+B°/´&+²& +³@ +°2°° Ö´)+²) +³@) +°,/±)&°$901#"'67&#"".'&#"#"&547232632„2  /( F`  @.^@K .?&(7 9  3#F<-& Mþ‡þãÿžÿ̰/´ +°/°Ö´ +01.#52bXe>a”þï \;R‚þ‡þãÿžÿ̲+´ +°/°Ö´ +0173"&þ‡Xe>a”@ \;R‚ÿòÿؼ‚+²² +³ +´& +° /± é°/± é°/°3± é°2°,/°!Ö±) é³)!+´+² +³@ +°)± +±22´+² +³@ +±-+±!²&999±)±99° ± 99± ±!)99±&° 9°°9°°90173275##5#"'654+532353#".54>32³7hq§§qýÇ &6&ÿÂÿï< *¦²+´ +²+°3±$é°(/±é°/±33± é°+/°Ö± é³ +´!+² ! +³@  +° ±&+°2´+°±+´+² +³@ +±,+± ±99±&!°9±$± 99±(± !9901"&5463246;5!5!####".73275#"#00#%/0&o\XþrHypažIt8qU1$A@11#%/0$#1N\pppýïþ‘¢So4-^$§ ÿùß' °/´" +°/°3± é² +³@ +°2² +³@ +° /° 3± é°(/°Ö´+°2² +³@ +°±+´% $+°%±+°2´+² +³@ +² +³@ +±)+±°9±°9014632!5!5!##5!#5#".".54>32N;@þæ~pþêp" T$%" %//A6A3ªppýïøøø þÛ * 2#"1ÿøÿðÊ<ˆ²+°$3°/±.é². +³@.* +°6/±<é³<6+±3é°/° 3± é°=/°1Ö´+²1 +³@ +±>+±1² 999±±!99°.±99°6²'1999±3± 999012327!5!##"/#"'#"&5463232654#"#"&5463åR IFþÒkKP+#+ />&9$ |Ge8I\r”A7UC¹ dppBB-Y%A*' *!8-= %#ÿçÿ¾Ù‚&3Ù²+±%é°%³%,+´' +²)+²0+° /´+°/± é° /° 3± é°4/°*Ö±/ é°/° Ö´+°/´+² +³@ +°/±+´+² +³@ +°° Ö´+±5+±*±',99±´ #%$9±%±*/99± ,²#999°°9°±9901".547!5!5!#!">32'4#"32"&4632¡9~kF¬þ ãþ­` =Y@LdlG^P0Tþ>*#%()$!-Mr?OqqÀG &1*M?@O1&%6,88!‚q H° /± é° /± é°/°Ö´+°±+´+±+±² 999± ±99014632"&"32654&!°€}´´ú³0Po .8*Qoo@°´}|³³=qP-H(oPRoÿÉQµ+w°/±) é²) +³@ +°"/± é°,/°Ö´%+°%±+´ +° Ö´+² +³@ +±-+±%³")$9°°9±)°9°"±99014632#"&547#".%4&#"326‘o-PM.5e [=6V1! †;K9W84,iôRo-Y=@•58X+,¢u4I,!/9+$4&, ( .s£/l²!+°'/´- +±é°/± é° Ö°0/°Ö´+² +³ +±1+±°9±'!°9°²*999± -±99±° 901%2>54#"#"54>32#"/&+"&54632 HZ>Ç?ŽCGfO[…D0Z1)}/,HP4J?/&dà&R7’5'0OS-Il= ;$,%)1"*!ÿøp¢@«²+± é³ +´ +²<+°9 Ö±é´1+ +±1 é°A/°#Ö´+²# +³@#. +°#°6 Ö´+²6 +³6> +±B+±6²999±°9± ± 99°+±#99°1³')4$9°<±699±9°>9012#"/.546322654.'&'#"&546323654&#"#"546;ƒ²C!3*m b‹Ž.12'%XY5z ‹V0=O?…~ˆD'ª?¦¢bOD.? %?'$! "0 0&-B!" (2 *1"1ÿúD¢(3¾²+±. é°)/± é°/°3± é°2°4/°Ö´+² +³@ +°°, Ö´+°/´,+°±+´ +² +³@ +°°1 Ö´'+±5+±± 99±1,²999±'±"%99±).±'99°³ "%$9°² 99901"&54>74&'.5473254'5%"32654&œâ‹ $ào¨¥pà0 "EÿM?O=AbO & >%Ÿ/p BggCp/ŸH* $9NPŸ /B!!-" 2j² +°/±é°/± é° 2°/°Ö´+² +³@ +°± +° 2´ +±+±°9° ±99±°9°² 9990123273#5#"&'>54+5L=UKIED^ooXPK˜O;)m;7¦38€ý‹,R4 ¸?p.BKݲ?+±7 é²+´ +²+´+´/)? +±/ é³2)/+±& é´!? +± é²! +³@! +°L/°DÖ°2´5+°$2°5± +´+² +³ +³@ +±M+±5D°G9° ´!&27$9°²)/999±/7±5D99±&2²,GI999±!)±$99°±99°± 99±°9014>32&546;#"&#"#"&#"32632#"&#";2+".54?4.,GG%]MI109:*1*F !1BrR)RH4] ;9XÛ'#,Ý8R* Ê/E#+*:F &%4%3$V&) ",9&!!7:1('< ÿþ‚¢&^² +°/±é² +³ +°'/°#Ö´+°±+´+² +³ +±(+±#° 9°±99± °9012#"547>54&#"#"&54>d~  =-l †23ûÛaE&6 -&Xt¢i3FHF?+!^›f9K( %1R* ›‰f²+± é° /± é² +³@ +°/°Ö´ +°2²  +³@  +² +³@ +±+± ±99± ±99°±99014632!!2#"&'4'. \87Äþ<)Dvš9_'¼ì1+û0^/&p *MW>*#Ô«$  «C«²+± é²+°<3´7 +²5+´17 +°&3±1 é± é²  +³@ . +°D/°#Ö´+°02²# +³@#) +°±4+´+²4 +³@ +³@ +³: +±E+±#°.9±4°29±1±)99°±499°7°:901"3#!32#".=47#"54>323&54632#*./&>'!4$,þž-FrHL:b$bš]>$5$3,8Ñ!XI.U" Å.5 % )NQ=&"6Urn9 8(=0(-0?K$þιÿò§J°/´+°/°Ö´ +² +³ +°± +´ +²  +³ +± ±9901462#"54654&#"#"&þÎP„P9 0%$19)7GF8,D 4!)("-DþǶ¡'°/´ +² +³  +°2°/°Ö±+01".543232>32œ13 5,#0  ,&¶ C0L-6-**Q%9!ÿøÿùã%*l²+±é² +³$ +°/±(é°(± é°/±&33± é°+/°)Ö´+°2²) +³@ +±,+±)°"9±± 99±(° 901%#".'67&'#5!#&#"32>32375d'J/ $‰I"9 þo-kŒ -4%(P5^G5sppæ&#Cfxuÿ÷ÿû™$1«² +±*é°//°%3± é°/±33± é±22°/±é°2/°Ö°2´+°2² +³@ +°±,+´ +° Ö´+² +³@ +±3+±°9°,´  %$9°±$99± ±99±/*° 9° °901&#"#".5#53>323! 7673254&#"H·¾þ)e]u_W„N0KL ¨Ž‹£Mý¬Mþ” 1N2hG+)‘««puBH^Sf>cVp—“…pGB8@ñ%6= E)OÿÏÒ=\fmzt²+±yé²[+°q/°t3±ié°H Ö±b é²Hb +³@H> +°/±5g33± é°32³]+±Mé°"/±é°1 Ö±é²1 +³1 +°*2°{/°KÖ´_+°_±e+´O+°O°R Ö´D+°D/´R+°O±+° 2´g+°32²g +³@ +°g±n+´;+²;n +³@;5 +°;°( Ö´.+°./´(+±|+±D_³HM]b$9°e°F9±O²>V[999±ng³it$9°.±m999°;±*99°(±%699±y±VW99°q²DR;999±iH²9FQ999±b³KO_e$9±1M²(/%999°"°901".5#53>32>3#".'&+"#".'&#!#".547#"&5432"3265427674&#"#32F9\T7!%"*=kDpP&‚AE|P/((EeB^3 Œ•#ö/P[tþ( $/&F3RcÉã þöp*0&K6ã;E-i):&gIu»|o@ZB0M8A6QY%8"HS@% $ 6j¿ojA99$iQÄÎDG.!&  *N 3.%NB=K7?þŸ(P)5;þàþíÿè/²+°/´+°/°Ö´ +±° 9°° 901"5332>7ˆ˜X%-þíûPV @ <Ð$^²+±é²+°%/°Ö± é³ +±é° ±+±é±&+±°9± ± 99°²!999±²99901#"&54733254.5473zxi ‚ 56m/99/‚/:9/{ši&'$$8Q¡3N/'#)A+( $:(&-9[<IÐ"‹²+±!é²+´ +° ±é´  +± é°2°#/°Ö±é°° Ö´+°/´+°± +´+°±+±é±$+± ²!999±!±99° ° 901%#".54675#"&=334&#"32Io6]N.ˆg~)xÆLZ‚I87QM:‚Ýlq/U8bjŽ*U:ò mY7:758:<\ä%1²+±/é²+±é´ ) +± é°2/°Ö±,é°,° Ö´+°/´+°,± +´ +°2° ±&+±é±3+± ³)/$9° °9±&°#9±)/±99° ± #99°³ $901%#".54>?4#"#&546324&#"326\˜qGzV-Q^96"$xmPSa+*‚O>9VQ?=Oçny*eI;Z5[b(" N\XR<(%C<>GD8=B<< ä'2}²+°"3±é°+2°/±0é°3/°Ö±é°±+±.é°.±(+±%é±4+±±99°±99°.° 9°(³"$9°%°9±0µ%(-$9°° 901"&54&#"#&!"5&54632632'4&#"3261d! M Rrx~)' –þæŒERdqdM/EfZyw .,.3.-,4Bƒt!%J)6972/K›v Re~9:vYbqÍ.C=^?<<#ä!p²+±é²+±é°"/°Ö´+°° Ö±é°/± é°±+´+±#+±°9± ° 9°²999±³$901%#"&54733254&#"#&54632#zjp“‹B7t54.?z‰]ààjv~n(%&8J‡5C8-[iþù<&ä*¢²+±é²$+±é²$ +³@ +´$ +±é°+/°!Ö´+°° Ö±é°/± é°±+°2±é°'2² +³@ +±,+±!°9±³ $$9°°)9±²999°°)9°±!'9901%#"&54732654򂂮&#"#&54632&}mpŒAr33:$*=.;7xƒf\“bbòn„{n)!&:KR<:/d5%.9J= er^Wj,"<ÿä)4¶²+±3é²+±!é´- +±-é´'  +´'+°5/°Ö´$+°$±+±0é°0° Ö´+°/´+°0±++±é±6+±$³ !'$9°° 9°0°9±+³-3$9±-3±99°°9°'± 99°!±9901%#"&54>7#"&546326324&#"3264&#"32ÿŽeg‘ .7C[yPJu#EaXqþM'!3* ",1@0/H@20ÐbnsdC$XUBM\YH"€+-z#" ##þƒ`=<.1@PPä-x²+±*é² +°3±$é°2°./°Ö±'é°'±+´+°±+±é±/+±'± 99°° 9°±99°°9±*±99°$°9° ° 901%#"&54632632#6=4&#"54'&#"32765…kmˆ‹jdGKæ`†…lj‡AAw`À‡²£–Ô+41$þÐî313—îBU41<Cä!?²+± é°"/°Ö±é°±+±é±#+±°9°²999°°901#654.#"#&547>32CQxG//GxQ ‰hN}Š©ÍÈ¡ )F-///E)©ÀÓ£>*jˆQG><&ä#}²+±é²+±é´ +±é°$/°Ö± é° ±+°2±é° 2² +³@ +±%+± °9°³ $9°°"9±²999°°"9°° 901%#"&547332654&+532654#52&il”ŒB893&*#(JYs_bòjˆj)!&9LR<-µ²4+±8<33±é±22²4 +³@ +° 2°-/±. é°?/°1ֱ鰱+´+°± +´ +° ±+±é±@+±1±-/99°°49°°69° °89° ± :99°²%<999°²#$999±.-° 9°³1$9°4±6:9901#654#"#54&"#54#"#.+53&54632632632{ ƒ!Bx4x13 [ivm[<–$>=W7(ÿUgZWI,+LK&1\JZ1CJD;]#yy"#ypFo5G!#,/\B#6qP¢Z|????h<ä&„²+±%é²+±é´!  +±!é°'/°Ö±#é°#° Ö´+°/´+°#± +°2±é±(+±#°9± µ !%$9±!%°9° ° 9°±9901%#"&5463254&#"#&546324&"32„j_…€`1?1,02}…Zcw‚8Z<<-,Ûiro^_t%—-A=0/Wbtcþ–Z??Z?P$Ð(w²+±&é² +°3±é° Ö± é´! +±é°)/°Ö±é°#2°±+±é±*+±³ $9°² 999±!&°9°°9±°901%#"&54632327#"&#"6324&#"326$…_bŽSPw7&%3"w>MVq‚=,-:9.-<Í]pq`\OTx%!¡%|T,@>\>>Póä&o²+°#3±é° 2² +³@ +°'/°Ö±é°±+± é° ±+±é±(+±°9°±99° °!9°±#99°°9±°!901#654&#"#54&#"#&54632632ó5x+%&!"ƒ"!&%+x5l_N9:V\efng8(73"¼¼"38'þÈepeŽ`w77z]<&Ð1“²+±é²#+´# +± é°2/°Ö± é³! +´%+° ±+°2±é°-2² +³@ +±3+±!°9±% ° 9°²999°±*/99±² 999°² /999°#°-901%#"&547332654&+5232654&'&5472&‚hm“ŒA92:,$#$0˜x 9?=(^-2Òfl~k)!&:K>2%2x 'm ;,_HÐ/¡²+±é².+´$. +´$ +°0/°Ö± é° Ö´! +° ±'+´ +°±+´+±1+±°9°!°9° °9°'´ $)*$9°³,$9±°.9±±99±.$³$901%#"&54733265#"&547332654'53273zjp“ŠB7<8-0^:>di##gHTàjv~n)")8JI>j,76=:"*,VB<èÐ6²&+°/°3±0é°42°7/°Ö±é°.2°±+´ +° ±+±é±8+±°9°²,0999° ±#299°²&4999°±'99±0±.299°&±#,9901%#654&#"#4654&#"#&54>7673632632èC‚C#%*x 0)+>‚>+>\HX1x3Nd]W($9±/±+99±?³ $9°;±99°6´ +$9°1±)#9901#".547332654'#"&547.54632$4&#"324&"2û\’^K}m>>‚>|e_{f%W<>YS&,]=:f6f‚þê """."".`‚9>rOjgXgcf[]”(,B;DH32632›€pŒUABI.x5#8:x-4$ /J>U ŽŽo9!%5AXWC!'!I:$ )*.M=<ä;D¯²/+±é²+°#3±?é°2´D/ +±Dé° 2°D± é°E/°Ö±Bé°B±4+±9é°9±+°2±,é°&2², +³@ +±F+±94µ6?CD$9°·!#/7<=$9°,°)9± ²,46999±D°)9°?²&999°°!901%2>54&+532654&#"#"&54632632#".54734&#"2õ/B $)/0$**$%'81*-]~VcG=eKl2/5* 5_Z5‚cK3#$23Fd/,,:x:%$,(?DDcZSdGGdJ5QO?}v*R9('";7£F33F3<#Ð"ƒ²+±é²!+´! +´+² +³@ +°#/°Ö± é³ +±é° ± +°2´"+±$+±°9± ± 99° ²999±²999°° 901%#"&54733276=4&#"#&546253#zjp“‹B7I5 %+b6xàjv~n(%&8J.,-¼#1&GT6Ã< ä6²(+°,3± é°2°!/±"é°"±é°7/°%ֱ鰱+´+°±4+±/é±8+±%±!#99°± (99°±*99°4²,2999°/±199±"°9° ´%/1$9°(°*901"#4654.#"#&!#"53&54632632#654&2 #%x &!0(¯V-F.4 –þåtHJ_z`Q@@gTj1‡6-€ ) f* #1(K4Ò -/<›i[£_v@@zUPSdB,<<#Ð#²+±é²+°"3´ +´+°$/°Ö±é° Ö± é°±+°!2´+±%+±°9° °9°° 9°³$9±±99°°9°°901%#"&5473326=#"&547326=3#|ko‘‰A8<83OTc!…$+X4xàkum% %&8JI>×)bT?B6B-<<,y2Iä&.’²+±.é²+°#3±é°2´*  +±*é°//°Ö±,é°,±+´+°± +°'2±&é±0+±,±99±´ !*-$9° ²#).999±*.°9° ° 9°±99°±!9901%#".5463254#"#4654#"56326324&"2IŽuArPœgE<89x5<=6BD)8TRT‚LjLLjÒ^t*`Ccp"¶LU ! PLˆ(22uVþ„f99f9P&ä#0}²+±'é°/±!é²! +³@ +°2°/´, +°1/° Ö´ +±*22° ±+±é°$ Ö±é±2+±$ ´!$9±°9±!°9±',°901%#654&#"#4>32#"'6324&#"32>&@…C:6'ExTh3!<;$/NJ(%]5! >?08d<Ð U²+±é² +´  +± é°/°Ö±é°± +°2´+±+± ± 99±°9° ° 901%#"&5463234&#"32†`]‡‰\58xx;,-<<-,Ñ`qq\[x%UýÔX@?Z?Pgä%-’²+±-é²+°#3± é°2´) +±)é°./°Ö±é°*2°± +´+°±'+±é±/+± ²),999°´!(-$9±'±#99±)-°9°°9° ±99°±!%9901&#"#4654#"632#"&546326324&"2g=<5x98:Gj™›hj™TRV1*HB6“LjLLj4LP ! UL¶"mfcjlfGVu00(ýáf99f9<„Ð%0«²+±é²+´/ +´/ +´) +´ +°1/°Ö± é³ +´,+° ±+±&22´+±"22±2+±°9±, ° 9°³$9±²$999°/²#%999°)²!"999°±99°° 901%#"&5473326=#"&54632537/5&#"32#€dp“‹B7<83N=VTDA;xaaaax4.%-1Í\q~n(%&8JI>—(Eé³'>C+±"é°"/±'é°>±-+±é°± +´+°Q Ö±é±[+±C"°$9±>'µ*034A$9°-°@9°³5;F$9° · JSUV$9°Q°M9°°9±*°"9°S@ $'-5>ACJ$9°;°90132654'7#"&/#"&547332654&#"'?'.#"&546327>54#"732XkÌCjpA,A Bx*4Ml8>\t#3á* $"n6‘O7?.§ %R}9GxU1_Ê "9&%Ak+(Ú7 8*:X);;!:# Yh .&@*>Nx26…M ^$<%ÐD·²+±é²=+´ '= +´  +´2+= +´2 +°E/°Ö±é³;+´>+°±)+°42±é°2° Ö± é±F+±;°9±>°9°·#'+.27$9± )²C999± ² 999°'²999°+°9°2°9°=°901#"&547332654&#"#523254#"#523254.'&5473%& B$8-HL$c“ ‚ <7&>%# JH % F5GX$x_O?"5 E 2 "E(>"oa6:"&P.,P/-& /±Ì O²+´+°!/°Ö´ +³ +´+° ±+´+±"+± ²999°°901%#"&547332654.5473±vXSrn2%)7):9)n+3+±U\\Q%..(#1 #@-!2#">æÐ$”²+´"+²+± é° ´+´  +´ +°%/°Ö´+°± +´+²  +³@  +°±+´+±&+± °9°²"999°°9±"±99° ±9901%#"&54675#"&=3;4&#"326æƒf`jZi$n~ –n<:;;B46@Ïdkq^Zw£$HÈ&¯;GF<4?>þü¤(4а /´2+°/´"+°5/° Ö´/+°/° Ö´+°/´+°/±+´ +°±)+´+±6+±´ ",2$9°°&9±)°9±2µ (,$901%#"&54>=4&#"#&546324&'326)(”dfš(&#KS71'þí9T R>8>Bþü¤¤08¬²+´7+°#/±$é°$´!+° /°33´*+°.2°9/°'Ö´ +° ±+´5+°5±1+´+±:+± '±#$99°³ !%*$9°5³,$9°1².999°°9±$!±99± 7³ '$9°*°,901%#"&547&#"#.#"53&546326324#"32¤b\Xv 0-'"60 3=S2+ ‚&;8M/"8DWqhYJ/9[TdnZVVZß_€oX1#/L2;Y5# )D-- dY£Zz::pf||tþü­¤ i°/´+°/´+°!/°Ö´ +° Ö´+° ±+´+±"+± ±99±´ $9±³$901#"&54733254#"#&54632­c_Xun0+XQ)( n qW¶>_g\U704/*1e,c=+ Va½þü¾¤2ް"/´-+°/´+° /´+°3/°Ö´+°% Ö´*+°±+°2´+°2±4+±*°'9±¶ "(-$9°°9±-²%'999°°9° ²99901%4+532654&#"#&54632#"&547332>OM#%5"*3n|QLw0*4%eg\wn01' HZ7%!&*)NWMI.GS@i{g[0&$*2>6%Qä$0»²+´.+²+´+´( +´+´#  +´# +°1/° Ö´ +° ±+´++³++°3´+°+±%+´+±2+± ° 9°²#999±+°9°%³(.$9±(.±99°°9±# °9°± 9901%#"&547#"&54632632$4&#"324&#"326Qe`]qK1;:EnICbD2JMRþ»  !"ø)1/.0./*ábr]X©"Z;HYNAE˜,sñ>*0!%þÚ4FL2/CE©¤"‡² +´!+°/°3´+°2°#/°Ö´+°±+´ +° ±+´+±$+±± 99° °9°±99°°9±! ±99°³ $9°°901%#654#"#"&546326324#"32©7n7EHd_\qj^U@5LR[þ—X..,1Wîokiditaup\_y;;cluE04GФF°/´+°/°Ö´ +° ±+´+±+± ° 9°² 999°°901%#654&"#&54632Ð0n08f81n1ud^{Ód[gX4CC4`_`Mdsþü¾¤)z°/´$+°/´+° /´ +°*/°Ö´"+°"±+°2´+°2±++±"°9°´  $9°°9±$²999°°9° °901%4+52654.#52#"&547332>5OM6+ "87&ZYch_una *HZ%7 Z 7%b%"…kye]0&$*p+)þü`¤Fϰ/´+°3/°3´ +°2²3 +³@3$ +°-2°3°( Ö´+°G/°Ö´9+°9±1+´* +°*±%+´  +° ±+´+±H+±9±99°1° 9°*° 9°%²?@999° °9°²999°±F99±±?@99°3´*9$9± (± 9901&'&%53&54632632632#654&#"#54&#"#4654#"…þãEe_WA00QI42JGZ%n%#'Cd!!DdG-KE23?\I5þüWZM Z}.::.bHAQF=)6i $\",k +) b&àfzw_[t ™l61h{aZþ¢5KJ62??Öä&†²+´$+²+°3´ +²+± é´ +´+°'/°Ö´!+°2°!±+´+±(+±!³ $9°²999±$°9°°9± °9014327#"&#"632#"&54&#"326°£*7!)q.&8@[w}derJ=537>21;'½ n .0£ t[cs{f6JK52??ª¤&n°/°3´ +°$2°'/°Ö´+°±+´ +°±+´+±(+±°9°± 99°°"9°±$99°°9± °"901%#654&#"#54.#"#&54632632ª3m2&)%d%)&2m3^UX;;XU^ÝFƒ|Q+>)&((&)>+Q|ƒFVq;;qÏÐ.޲+´+² +´ +±é°//°Ö´ +³ +´#+° ±+°2´+°)2±0+±°9±# µ $9°°&9°°,9±²999°°,9° °)901%#"&547332654퀆.5473Ï}_V n 412>:G#^.BB.n-AA-8118½\a]T-"2=,0D(c< +5&" ( =,2D KþüÙ¤,ð/´+°/´" +°'/´( +°-/°Ö´ +³ +´ +°/´ +° ±%+´ +²% +³@%( +°±+´+±.+±°9°°9° ²"999°%± 99°²999±°+9±±99±'"³$9°(±9901#"&5473325"&547332654'53273Ùg_Rwn,,[(:(b|SZ!$((z_gWNA24%.7ez 186A=!!/ L=ªÐ9–²+° /°3´++°/2² + +³@  +°:/°Ö´+°±+´ +°±7+´2+±;+±°9°³'(+$9°²&-999°7³%/5$9°2±499±+ ²()-999°±'9901"#54.#"#&54>53632632#654&í'2d !)&2m37WjkW7t&!>$#0ŒH&%G+:\R^3m2&J7-@+$>+Q|ƒFS‚O<'#-4' ,>;;sTFƒ|Q+>Ùäy² +°/´ +°/°Ö´ +² +³@ +° ±+´+³+´+°/´+±+± ± 99°°9±°9± ²99901%#"&54'332654.5473ÙRizuq-: n**ÅP`jg¹(þ‹3,,(2Hþü¨Y-7B˰/´+°/´A +°;/´6 +°1/´& +°C/° Ö´+°±+°#2´> +°32°>±8+°.2´ +°)2°±+´+±D+± ° 9°° 9°>°!9°8³&$9°±+99±° 9°A²999°;²999°6´ ! ,+$9°1±#)9901%#"&5473327654'#"&547&546324&"264&#"26¨+BXQ*ŠÀ2n2pi„)(XP@>VDCS>AQ2lxø+B*'H()#!+*D*VO}K1§ˆ‘xs{l„YVY—"!AYQ=Q0+H>YVB<)‘!,,!%33È#,.!"11þü€¤8À°/´+°!/±+é²!+ +³@! +°/°3´0+±&522°9/°$Ö´)+°)±+´ +° ±+´ +°±+´+±:+±)$±!&99± ´'+.$9°² 0999°²3999°°59±!±99°+°9°°$9°0²).399901#"&547332654#"#54#"#"&547332>32632€‰uh›f4?!BO/5d %&E)/<"n"!)1+ (S9Gsvcb)*'5".MB)+° Ö±é° /°93´0+°,2°@/°)Ö´<+°<±+´ +° ±+°2´+°32±A+± µ &,9:>$9°· $.078$9°°59± ²999±>°59°°$9° ´#)37<$9°0°.901#".547332654.+532>54#"#"&54632632$4&"32¥m1UQ/f •FK !& >$"iXTtzSTA1XFVaaþ›1R12():hb&J4& '`5C("c"V):XglSRkFF`Gw')‡R;;R;þü­Ð!w² +°/´ +°/´+°"/°Ö´ +° Ö´+° ±+°2´+±#+± ±99±´ $9± ³$9°°901#"&54733254&#"#&546323­ÇRvn3.R<$) n WHD3n9ËVOA24%/6e"#/">GT0wþü•¤6ª°)/±*é°*´'+°/°3´4+°02²4 +³@ +°7/°-Ö´+°±+´ +°±+´+±8+±-±)*99°²'+0999°°29°³ 4$9°±99±')°$9°*°9°³-$9°4°2901%#654&#"#54&#"#.#"53&54632632•l!%$c,S8ETOU+ ‚ $73I-#=MWr^^K55[N]ì?HF6)>'%+82=~Ic3$)N- dNbƒ;9gþü³¤$}°/´+°/´ +² +³@# +°2°%/°Ö´+° Ö´ +°±+°"2´+±&+± ± 99±´ $9±± 99°°901#"&547332=#"&5473326=3³&'~Qyn4/V4COY-n-3- 1n>F?AXO?24%/6eÊ%aPLGII-4( «Îä(4²+´2+²!+°%3´+°2´ ,! +´ +°5/°Ö´/+°/±+´+°±)+° 2´+±6+±/±!99±´ #,2$9°)°%9±,2°9° ° 9°±99°!±#9901%#"&5463254.#"#4654#"56326324&#"326Îuba€w[@8 4j3-4/8A&+RF=n734>;12>Öauu`[u µZ! O6l$;;`Jþ‘5KK52??Âä#z²+´+°/´+°/´" +°$/° Ö´ +±"22° ±+´+° Ö´+±%+± ³$9±°9±°9±"°901%#654&#"#46326324&#"6Â7n731+9nv[Fcþô8SRY˜#33žÞZpca2A>+ÎY^@BZ/r,E4þ÷r¤2‹° /´+°/´+°3/° Ö´+°±&+´++°+±+°!2´+°2² +³@ +±4+± °9°&°9°+² $999±±099±°9°² 99901%#"&5467332654&+53254.5473r9)_VwB–¬83nk('~Ec78-RM8B8n&43#È'9~Da(µ—[»K”ÑLPR=A9"^/+9( 3ÖÐ `²+´+² +´ +´+°/°Ö´+°± +° 2´+±+± ²999±°9°° 901%"&5463234&#"326ÖuÄv\@8nn915=;15;Öauta[u Kþ2DJ62?Fìä&2²+´0+² +°$3´ +°2´* +´+°3/°Ö´-+°2°-± +´+°±'+´+±4+± -° 9°´"*0$9±'±$99±*0°9°°9° ±99° ±"&9901&#"#4654#"632#"&546326324&#"326ì4-3j48@[w€abu=FR+&A8/„=537>21;T6O !Z,$µ u[`uuadJ`;;$þ 6JK52??þü Ð%1¢²+°/´+°/´/+°)/´+°2/°Ö°2´ +´, +° ±+±&22´+±#22±3+±,° 9± µ )/$9±² 999°/³%$9°)±$#99°³ "$9°°!901%'#"&547332=#"&463237'.#"326 _g`Sun4-RC%D]XCM6n___ÍB#-0!@‘í`fUPA21(.7eý )Y†XGqþQ bo%&")ÖÐT²+´+²+°/°Ö´+°2°±+´+±+±² 999°° 9±±9901%#"&53734&#"326Ö`avnwr_Vjn=537=31;Õ_vv`úþµ„dt`6JH43B?þü®¢Qö²+´B+°2³B+´ +°5/´6+° Ö´,+°R/°)Ö´"+°"±+´ +° ±E+´ +°°: Ö´2+°2/´:+²2: +³@25 +±S+±")³'$9°µ &,$9° ±99°2³/=@$9°E²BK999°:±LN99°°O9± °9±B° 9°5@ "')/=L$9°°:901#"/#"'532654&"57'&#"&546327654+53232654.'7®M9Z)Zo+0]@RHN&2 ´N[)b?S'G…7;.¿K  P H9NS¶E A->Am!Xs $3:9=MO‘Z Z&39z 2 0$ àÐ9¿²+´+²++´+ +´+´!+ +´!+°:/°Ö´ +° ±#+´2+°62²#2 +³@# +°2°#° Ö´+±;+± ³ )*+$9°#· &,/$9±2±4899±² 999°² 8999°°69°!°49°+°2901%#"&547332654+52324#"#53254.'.'53à*GL*`{ p t0BO9% NP #R-;[$;n7IH2;??DŸ-A"g^#s&-?ZTZ  3"$ 1-<H="ÅÕDKÙ²$+°3±Jé²@+°/±+é°L/°!Ö´E+°(2°E±H+´& +°&±.+´+². +³@.3 +°.°: Ö´+°° Ö´+°/´+² +³ +°>2±M+±E!°9°H°$9±.&´+8=C$9±:±99±@+@ !(CE$9°J²&H999°$± 99014.5432# 57>3232654.54323254.43232>54#"P1;1 #9L*16 4kJþ³NNjSm¿u€T:5?5% Q#3<3=þm(5<%8%! !O4#!A=!&%22/$d!‡·„“e~q'.!/:%5D8*K('ÿü¤Š|² +°3± é°2°/±é° /°Ö´+² +³@ +°±+´+² +³@ +±!+±° 9°²999°±99± °9°²99901%23"'#527&54>2'4"6A+!pSUnDO#9;<::#nŽGGbc++c+\,B!!A-`YBB:&&þîÁ‚#f°/±é°/± é°$/° Ö´+°±+´+±%+± ² 999°´#$9°±!"99±´ #$9° °"901%2#"&54>73254#"'7#5!2(< riZn!3 5-dZ2wÞk…ˆ%=?!ioaP#0/-2{p0·c2ÈþîØÔ<̲:+± é² : +³  +°/±(é°-/´. +°=/°7Ö´+³&7+´! +°!/´& +°±++°12´+° Ö°+° Ö´ +°+´+±>+±&7°#9°±$599°· (-.4:$9±+ ±399°±99±-(²!#999°.°9° ±79901#"54654&#"#".54732654'53254/.54632«$ "#Rz>WPf%C?%K-l6C‡‰7lK]PEXT "("""* F/H/Jl52lVi!A-^3% +R4-nJb!$JbKOYFõÞ'0:в+±/é°/±7é°1/°3± é°2°#/° 3±+é° 2°;/°Ö°2´4+°(2°4±9+±!,22´+± 22²9 +³@ +° 2±<+±94±99±17±99±/+±99014>323#3##".54>;5#".7;54#""32=(O7¸````¸7O()S;GG75#53#"&5332654&#"¡,,ýu¨uuT^74ú0‚ª_Öa–4yj'JK¹'..'&..&_ss_^s9ScOO_¹…i…‚†1>\†--9'ÿéîå %|²$+± é²+± é²+´ +´!$ +´ +°&/° Ö± é°±+±é² +³@ +±'+±³!$$9±!± 99°°9°² 99901"32654&63232544+#"†[nn[ZomþEÁƒ´@U-2C^,of5 ¼–Ÿe‹æ‹ŠpvŒþZPÖ”9–(B?#dm”¿<ÒÙ0²+²+±é²+°/°Ö°2± é°2± é± +01#7#5Ò–––ýä½}}.ÿçVç.—²++±é²+±é´ + +°#3´  +°!2³++°//°Ö± é² +³@ +°±+±& é°"2±0+±± 99°µ !+$9°&²$999± ²&.999± ° 9°²99901732654.'#53&54!2.#"3##"&'£1k54&'7#".54632%654&#"õA|$NG.]C54#"#4632ÿ––Fh~.<¢˜v€’µ~I RA—40Z‡Œˆ„Žÿíÿèøð1=²+°#3±é°/2°/´= +°7/±é°>/° Ö´+°±&+´-+°-±+°22± é±?+°6º>Øóâ+ °°À±ù°;À³;+º>Þô+ ³;+°³+°³<;+³=;+² Š Š#9²;9°<9¶;<.......@ =;<.........°@± ° 9°&± 99°-²(7999°±#)99±´ &(-$9°=°901!#"&547332>32#"&547332674.#"`þú $/H->Id%&8jH|,JU/=Jm!, 7($ &7QY8%T0#**Hr‹‹rHʲhŸY,J9#**k¦6SL((K;2<õÙ6²+²+´ +±é°/°Ö± é°2² +³@ +± +01!!#Ò#þÝ–ÙþÜ}þÈÙ<RÙ,²+²+± é°/°Ö± é² +³@ +±+01!#!Rþ|’Sý­Ùÿèœæ'2¢² +° 3± é°%2²+±. é´  +´ +°2°3/°Ö±é°±+±1 é°1±*+±! é±4+±°9°°9°1³ $9°*° 9°!³ #%$9± ° 9°´#($9°°9°.´!*1$901%53##"'#"&547327&5462327654."¡û/8kE_YYhn{dM -+(.s²n*&cþÓD ÏOO!GM211XTbNZ)!-{¨§¯¯§®xtRˆXjjXˆÙ u²+±33²+² 333° /±+°6º>¥òæ+ °.°À±ù°ÀºÁlò•+ °.±°À± ù° À² ...¶ .......°@01!# #333Ó‡zw‡ÎŸqq”vmŸ9ýÇÙýÞ"ýÝ#ÿçXç!.q²+±(é²+± é³+°//°Ö±% é°%±+± é° ±++± é±0+± ³ "($9±+³ $9±(´ "$9° ± 99014632#4&#"#".5467&32654.Çq\Rr–'88'‚s5@5.c^c@:E(+=@@gp[&(!8;D\2]Œ&5R3aŠ+— LB5I58!B&9@òL²+° /±é°/±é°/°Ö± é°±+± é² +³@ +±+±°9±° 9013#4632#52654&#"Ï– e(VQ3‹‡K1<10>#Zu6_;T„}3,'DK)(ÿéºå+š² +±$é²+± é² +³@ +´)  +±)é²) +³@)+ +²) +³@ +°,/°Ö± é°±++´* +°2°*±'+±é±-+±*+³ $$9°'°9°±99±)$°9°²999013#".54>32#&#"32654'#pO}~EXLxK2/V…O¥ €Wq *G/`MoOÎCjL-MD()Eaf;JpEŠyƒ¤i(AA,51>=<Ù Š²+² 333²+±33° /°Ö± é°2°± +° 2± é±+°6ºÁ£ñž+ ° .°À±ù°Àº>ò5+ ° .° À±ù±°À² ...´ .....°@01#33##Ò–à„€â––8ýÈÙý¼Dý'8ýÈ-ûð!^²+° /± é³ +± é°/± é² +³@ +°"/°Ö± é°±+°2± é² +³@ +±#+±±99012#5#"&+532;4&#"#54>pz–_SFŒ%%*'+&–*FKðofýå–Qq),-2FH?[/ ÿç¹Ù/9¬²!+±5é²+´ +°2´! +± é´ ! +´ ++² +³@ +°:/°$Ö±2 é°2±8+± é°±+´+±;+±2$°&9°8´!+/$9°²999°´ $9±5µ$&()0$9°³+-$90153#32>32#4#"#"'#"&547'6326732654`ï6.?E0G$w2,(@!G(7D‰[UvDJ-HWËF 5C*$˜AAg33'?B#>#1({FixnieKEN|Ohþ´L<+555K(ÿôð$X² +²+± é² +³ +± é°%/°Ö±" é°"± +°2± é±&+± "²999±´ $901233###"&546264&#"}@kF4––3DwIœº¾—ZeeZYfdð%>GP:7ý'%>^F3ܧŸÚý„ŠèЉqxŠ<‰Ù ?²+° 3²+°3´ +±é° /°Ö± é°2°± +°2± é± +01!#3!3#óþß–– —–KþµÙþïý'ÿç2Ùk²+± é²  +³@  +²+´ +°2°/°Ö± é² +³@ +² +³@ +°± +± é± +±² 999± °901%#"&'332654&#"'675#53#2¦oc™91A@?@Ma_4ú0Vxýzœq\ 0UDF[<\8zOOy‹ÿçÙc²+± é² +°3´ +´ +°2°/°Ö± é² +³@ +² +³@ +±+±° 9±° 9± °901753#32?33#"&=ú4$!ý£¬¬®þÁ@me{âOOA8:÷þ§Yý‹}f_6'ÿéåå b² +± é²+± é´  +´ +°/°Ö± é°2°±+° 2± é±+±± 99±°9°°9°°9016632#".#"!26'ÁžÂ¿ Ÿf iSRk þq k¦l¿PÖÕ®¢×§crsbOcuv%ÿ~,Ùz²+±é² +³@ +²+² +°3± é°2°/´ +°/° Ö° 2± é°2² +³@ +²  +³@ +°±+°2± é² +³@ +±+01%3!535.=#53533#3––þ¨Â”@@–ƒƒGTëþ“P"iuÝs¹¹s¢\B'ÿëÄç {²+²+± é²+± é² +³@ +´ +±é°!/°Ö± é°±+´ +° 2² +³@ +±"+±³$9±°9±±9901&#"32>7#5!#'#"&546327(†_mu[%4,"¦$Z*hJ”ÁÄ„ªòu†vp"='}þv`=8ئªÔ„qÿðÿé$æ(²+°3²+±é²+±$é°)/° Ö´ +±*+°6º?.õÈ+ °°À±ù°'ÀºÂïÉ+ °.° À±ù°Àº? ôð+ °³'+ºÂð+ °³+³+° ³ +²' Š Š#9² Š Š#9°9² 9@  '..........@  '............°@± ° 9±$± 9901#".547327>32#&'&'&#"x6+@ a>>_T,D0&s–`&  ŠþÍn$3#'*9/gyq*IM8þ,Šœ%Ah"<;Ù9²+°3²+´  +± é°/°Ö± é°2° ±+± é±+0132#54&+#Òf‚–ADN–Ùÿ€VþüÒFCþ¥Ù-QÙ ,²+±é² +±é° /± +±°9°°901!!5!5QþŒtýÜuþ‹Ù}þ!}}ß}*$ð#m²+° /±é°/°3´ +°/´ +°2° /± é°$/°Ö°2´ +°2°±+°2± é±%+±´"$9°± 990153#;4&#"3#53>32#5#"&'*ð.!,S*'%'-ð--DG'pz–ŠDdSOO" ),!%OO8Q*ofýå•hV'ÿéCå "’²!+± é²+± é´! +± é°#/° Ö± é°±+´+°±+´+±$+±´!$9°±99°°9±³ $9°²999°³ $9°±9901"32654&6327&'725#"'#"†[nn[ZomþEÁ…·+ npn•A(P ¼™Ÿe‹æ‹ŠpvŒþZPÖš„?# ii½*o˜Æ(pÙ G²+±é°2²+±é° 2° /°Ö± é² +³@ +° 2² +³@ +°2± +01%3!53#5!#—Ùý¸ÙÙHÙ}}}ß}}ÿçfò7²(+°$3±4é° 2°/°/±é°8/°+Ö±1 é°1±+± é°± +± é±9+±1+°-9°³(.4$9°³&6$9° ³$$9±4(°&9°´ +-$901%4673254.#"#4>32#"'#"&547327&F9l‡m&:?78–#6HB!S‡O*;hEZNKIv›f]G5Þ%g =EtòDrD%;0L. S†™L32632#"&'732654&#"#"&547&32>54û–.GL#`S|m_‡eF'VX4>=>DmVTo… uD- j@2En?!DDnY`^/-8"//&n˜ª­ ‹Ä€Šbl®dd`å,l²+²+°3²+±& é´  +± é´* +± é°-/°$Ö´+±.+±±!99± *±"99°&´$(,$9±± 9901!##"&'732653332>32'654#"#"'…µN$Bzh+*#'—¢Ÿ—0 3?]n-+$.B8 6K$30):oC$0(YLýÛ%Y23GD);)e/552ÿçfò=–².+°*3±:é°2° /± é°/°/± é°>/°1Ö±7 é°7±+± é° ±+±% é±?+±71°39°³.4:$9° ³,<$9°³ *$9±:.°,9° ³17$9°³%4$9°°3901%432.#"3254.#"#4>32#"'#"&547327&FWd= ‡m&:?78–#6HB!S‡O*;hEZNKIv›f]G5Þ¿Ml >tòDrD%;0L. S†™L3 #"ªDÎ/fS[gg[D]6–,CR[†€B`2¤Kœ´«Ä  YQ^o¼nA:u¤HDg”h_AEþB§¦oÙ `² +²+´   +°3± é°2°/° Ö°2± é°2² +³@  +² +³@ +±+± °9± ° 9°°901333##5!5CŒŒ––––þÓ¦gþ™}õõ}<iÙ B²+± é² +´  +±é°/°Ö± é°2° ±+± é±+± °90132#!332654#Ò»dxyrþ¾–Œ<9uÕ„ontÙþÛ68mjÙ‡²+² +´  +±é´ +±é² +³@ +°/°Ö´+°±+° 2± é° 2°±+´+±+±°9±°9± ±99±³ $901#"&573273632#4&"#ö, REo6–(REo0.–[d-*eþä[d-)þ²,ÿçâ :D¦²+±é²!+±?é³*!?+±6é°E/°Ö± é° Ö±A é°±+± é°±4+±. é²4. +³@40 +±F+±°9°A°9°´ !=$9°² $%999°4²'*9999±6µ.0$9°?²%;999°*°'901732654'7#"&54>7&54632>32#52654#"'654#"Â#(t ±4UR(R=jy4%$x~>Fs %&:]DÏ ,+'M‚!(® *NÔ-pE$86rU1O@!'€6Z\8 I9¬o-$%r&"<pÙP²+°3²+±é°/°Ö± é°± +± é° Ö± é±+± °9±°9±°901#54&'5254&+#!2ñ–sk.5t9<Œ–Bry?pq8>?o? m86ý¤ÙtnOt:ÿéÙ?²+± é² +³@ +²+°/°Ö± é°± +± é±+± °901"&53326=3$pz–*'+&–*FKofýå),-2FH?[/ÿþ`Ù-²+°3²+² 333°/±+±³ $901!#373733#'sö—¢5{—''—{8Ÿ—ú:ÙýÛ¸m……þ™¾%ý'ª)ÿçQç.™²++±é²+±é´"$+ +´" +´+ +´ +°2°//° Ö± é°±+±& é±"22²& +³@ +±0+± °9°µ!+$9°&±$99±$³&.$9±"° 9°± 9901732654.54!23!53&#"3##"&'ž1k,86S1ºhBOO-8! OAO%DA'`R ÿçÑÙj²+±é²+± é´ +±é³+°/°Ö´  +° ± +± é°±+± é² +³@ +±+±°9±°90152#"&5##5!32654ç[}luy¡P‡W-'}„Ygq|c–>»þ)ž+,dÿôFÙ :²+°3´ +²+° /°Ö°2± é± +±° 9°± 99013##53°––þÚ––&Ùý'Iþ·ï=JaÙ I²+°3´ +²+±é° /°Ö° 2± é² +³@ +±+±° 9°± 99015!##535¤½–þÚ––&\}ý'Iþ·ï=J`ÿþmÙ!²+²+°3°/±+±°901!#33sö—¢Ÿ—ÙýÛ%)ÿçQç&k²#+±é²+±é³#+°'/° Ö± é°±+± é±(+± °9°µ#$9°±99±´&$9°² 99901732654.54!2.#"#"&'ž1k,86S1ºV96&"86*9:X3%DA'`R*ÿç‚æ'4w²+±-é²+°$3± é°2°5/°!Ö±* é°*±0+± é°± +± é±6+±0*±99°³$$9° ´&$9± -µ!($9°°&9012'>54&#"'654&#"#"&54632632654.Äc[…W -9'9x >9F'sƒ{ba‡§•‡9?þe (.( <æ^\f’f d,# e@*+)¯m“¸ ¼ëZZþé7[mlP[#7:%ÿçUæ09BÀ²+°+3±é°62²+±?é°C/°Ö±é°±+± é° °A Ö± é°/±A é° ±.+±3é°< Ö±" é°3±8+±(é±D+±±99°°9°A± 99° °?9°.² :999°<°>9°3±0$99°"°19°8±+699±?@  "(.1:$901732654'%#"&54>767&54632#"&5473254654&"<$`G0vNam(*g+? UƒHIƒU4omaNv0u$<þã60ž:*0.6!GJ]nhQ&G,<CQPVVPRC@"K^Qhn]JG8-2*:7$$''%:-ðL²+±é°/± é² +³@ +°/°Ö± é² +³@ +°±+± é±+±°901!!4632#54&#"Ð]þ zp)KF*–&+'*þb}fo/[?HF2-,</Ù,²+±é²+°/°Ö± é² +³@ +±+01!!Ò]þ Ùý¤}Ù)ÿéªåf²+±é² +³@ +²+± é² +³@ +°/°Ö± é°± +°2± é°2±+± ±99° ± 99±°901&#"32673#"&54632€YdaWFT’¨ˆ˜²´š¥ ⃈yw†LF}“Ͱ±ÎŠyÿçSÙ#+†²+± é²+´ +±$33±é±22´' +±é°,/° Ö±) é°)±+°$2± é°2°±#+°2± é°2²# +³@ +±-+±)°9±#°9±'° 901%#"&=".54632333+3265%54#"ì|pnr.SR1vVck –gg–  +2#þÊ4:,â}~xvF$H3e`e\6Aþ¿}5?CMS•Z:ÿèÞæ)4›²!+±0 é² +° 3±' é°2´! +´ +°2°5/°#Ö±, é°,±3+± é°±+±é±6+±,#³! %'$9°3° 9°³  $9°±99±0µ#,3$9±'´%*$9° ° 901#53>32632'>54&#""&547&#"%2>54û/8kE_YYhoY'-LG(.s²n*&c-D ÿOO!GM211yWO‚ t4"+A{¨§¯¯§®xtRˆXjjXˆ<iÙ B²+²+±é´  +±é°/°Ö± é° 2°±+± é±+± °901#!2#'3254&+Ò–Bryxd»Œu9<ŒþüÙtno„}m86'ÿçÍç)|²%+±é²+±é´ % +´  +° 2°*/°Ö± é°±+°2±" é° 2²" +³@" +²" +³@ +±++±²%999°"°9± ³"$9014>323!53&#"32654&'7#".'7MpAuŸ,þìV‡-/%ÖMlCo… Ù W² +²+°3´ +°2²+´ #+° /°Ö´ +°± +± é² +³@ +±+± °901#5!#3#VL©\&™þ[°†=SþUþý'†<Ùa²+°3²+´ +±é° /°Ö± é°2°±+± é°±+± é±!+±±99° °9±³ $9013#3%632'>54#"#Ò––K$.78#]!=&!–ºÙþ»¿ @,&X p ' þ0zk<¿Ù 0²+° 3²+°3° /°Ö± é°2± +±± 99017#33 #Ò––±þÝB³ïôôÙþÀ@þÆþaBÿç5Ù J²+±é²+´  +± é°/°Ö± é°±+°2± é±+±°9± °9013!"&5!3#"32>5Ÿ–þñ…1$)ÿèæ#T²+²+± é²+± é²!+°$/°Ö± é±%+± ²999°·"$9°!² #99901'.#"32677''#"&5463277“bdmCYddYCmdb“HLaJ`‡š´³›‡`JaLw¯tv7i†yx‡i7vt¯A[tYnα²ÍnYt['ÿžÈç$|²+± é² +³@ +³+± é²+± é² +³@ +°%/°Ö±" é°"±+± é±&+±"²999°±99± ° 9±± 99°°901%2=3327#"&'#"&54632#&#"·–0?,8@GX‚ )y<–ÂÄ„ª(†_muk²1’MTl)QA %ئªÔ„qu†vpÿæßè)4@£²+°&3±é°2²+°3±;é°/2°A/°Ö±é°± +±? é°?±7+± é°±+±2é°2±*+± é±B+±? ² 999°7±(99°°9°±&99±*2±99±°(9°;@   *5$901"&57327&546323267.54632#"'54.#"654.#"üc–‘22xkVZ…Z8/^qjohJÌ0Nhl8d`H 'þd5 f M6 {§«­±§Ÿ{wa$~nG[þÖe¤jG32Ä?Q 0@ó[hLi&"cVs'ÿéåå *{² +± é²+± é´"  +´"+´  +´+°+/°Ö± é°± +± é±,+± ³ !$9±"°9±´ %$9°°9°°9016632#"654&#"323%327#"&/.#'ÁžÂ¿ Ÿbm\j7c2 #&þÃn[l8h#; ¿PÖÕ®¢×9#vŒ[%!g; +s‹a10V *ÿçoæ*3ƒ²+±é²+°%3´ +²+±0é°4/°"Ö±2 é°2±-+±( é°(±+´ +° ±+± é±5+±-2±%99°(±99± °9± · "(+-2$901732>54&#"'4>32#".54632'654&#"÷$i7Jt@ -z)N9J\Fc”X?piL-‹jLu€–€WÕ:7Gqx;8KŒ=]O)ªzCƒ}^:Gj¢f‚¦z`s“GFc1B«:ÿ÷ÿç~å "P²+±!é²+±é°#/°Ö± é°±+± é±$+±±!99°± 99±!´$901654&#".54632#"&'732Þ ' !(9-rŠxoat32#"'#"&547327&547'"iFFFF$h#‡m&:?78–#6HB!S‡O*;hEZNKIv›f]G5/#FxRRRREy*EtòDrD%;0L. S†™L8L:H>7TJ4,>7ì{DWznS"9"j-~…I0‚ 76#851K}+"0-=þ¶ÿîÿçCÙ$}²+²+± é²  +³@  +²+´ +° 2°%/°Ö°2± é°!2² +³@ +² +³@ +°± +± é±&+±°9° °9± ³$901%#"&533254&#"#'7>75#53#CvV[s–68]H3\<0¬Xj1/™X4ú0vŽ×vzs|rq[‘Ll„b#½;h­Ó\OOZ´98ðP²+°3°/± é° /± é²  +³@  +°/°Ö± é°2°±+° 2± é°2±+±°9014632#4&#"32#54&+#9s*QP1–<-,=f‚–ADN–o/[?+268(€VþüÒFCþ¥'ÿëªç&²+²!+± é²+± é²+´! +±é°'/°$Ö± é°±+´ +² +³@ +±(+±³ !$9°²999±°9±±$99° ² 999°²99901277'.#"32>7#5!#'#"&546ˆƒ`JaLH“bdmC_mu[%4,"¦$Z*hJ”ÁÄçnYt[A¯tv7i†vp"='}þv`=8ئªÔ<„Ùc²+±é²+±é´ +±é° /°Ö± é°2°±+±é° Ö± é±!+± °9±°9°°9°° 901%#!!23254#3254#„5jIþ¸EDc1.6yþN£jj£³ooÒ$DB(Ù(?</D#G ¥RSþÞ½^_ÿÿ ÿ&¯Ù'z¶üØ$ÿÿ(ÿ%%#z}ü×DÿÿP˜„#y¾%ÿÿAÿéEð#y¸ EÿÿPÿ3˜Ù#yÂüÆ%ÿÿAÿ3EÙ#y«üÆEÿÿPÿi˜Ù'mÁ%ÿÿAÿiEÙ'm¬Eÿÿ(ÿ$©„' Ê"‰ÿÿ(ÿ$õ"vr©ÿÿP¬„#yÉ'ÿÿ(ÿé,Û"yTôGÿÿPÿ3¬Ù#y²üÆ'ÿÿ(ÿ3,Ù#ywüÆGÿÿPÿi¬Ù'm¬'ÿÿ(ÿi,Ù&mxGPÿ+¬Ù*„²*+°3±é²+´!(+² +±é°+/°Ö± é°±$+´ +°±+± é±,+±±99°$µ!)*$9°°9±!°9°*²$999±° 90173254+!2+632#"&'732654&#"7懩©‡– FYYGŸ#)C>!81E$!2}ïðý¤ÙTk­°hU8&!-0 4 c(ÿ,Ù 1Ÿ²/+²#+²1+²,+²)+± é°/´(+°2/°&ֱ鰱+´ +°±/+±+22±.é±3+±&±99°@   "#)$9°²999±°9°/²999°²&0999°)°+901"2654&632#"&'732654&#"7.546323#5*4BBhBAB#)C? 91E#"2Zp‚ab3ŒŒ/°_KJ^\JM_þ:9&!-0 4 d  qz¥Oý'7GÿÿPÿ6¬Ù'f¨ü×'ÿÿ(ÿ6,Ù'fŒü×GÿÿPq×' ÉÈS#q³(ÿÿ(ÿé„'C®ÕÿÿPqÚ' ÊûV#q³(ÿÿ(ÿé„'v^ÕÿÿPÿ6qÙ'f¨ü×(ÿÿ(ÿ6%'fnü×HÿÿPÿRqÙ'|³üå(ÿÿ(ÿR%'|hüåHÿÿPÿ+q„'xª˜ãÿÿ(ÿé"xyýäÿÿPP„#y¢)ÿÿ9„#y=Iÿÿ(ÿëÅo#qá´*ÿÿ(ÿ&#»'q‚JÿÿP„#yÊ+ÿÿA!#yÏ:KÿÿPÿ3Ù#y¶üÆ+ÿÿAÿ3Ù#yüÆKÿÿP„'jÃ+ÿÿA„'jœK3ÿ8 Ù"{²+±!33²+°3° /´(+´ +±é°#/°Ö± é°2°± +´  +° ±"+°2±! é±$+±² 999° °9± °9°± 9901!#632#"'732654&"7#3!3# þß #)D>7SE#".+]– —–Kþµ+&!-04 VÙþïý'ÿÿAÿ7Ù&z|KÿÿPÿHÙ'xÎüë+ÿÿAÿHÙ'x…üëKÿÿÿêÿRLÙ'|ÿóüå,ÿÿÿÛÿR=Ù'|ÿäüåLÿÿ4' Ê@Œ#jÿõ‘,ÿÿÿü.„"jïì"ó vÿáÿÿPÓ„' Ê.ÿÿA*€#v‹NÿÿPÿ3ÓÙ#y´üÆ.ÿÿAÿ3*Ù#yzüÆNÿÿPÿiÓÙ'mÐ.ÿÿAÿi*Ù'm…NÿÿPÿ3CÙ#y§üÆ/ÿÿAÿ3ÍÙ#yÿÞüÆOÿÿPÿ3Co#qá´ÿÿÿôÿ3o#qÿä´‚ÿÿPÿiCÙ'm£/ÿÿÿöÿi!Ù&måOÿÿPÿ6CÙ'f¨ü×/ÿÿÿçÿ6%Ù'fÿßü×OÿÿP„' ÊJ0ÿÿA=ì'vÿ÷PÿÿP„#y 0ÿÿA=î#y"PÿÿPÿ3Ù#yþüÆ0ÿÿAÿ3=%#yüÆPÿÿP¡„#yÏ1ÿÿA$ï#yœQÿÿPÿ3¡Ù#yÀüÆ1ÿÿAÿ3$%#y„üÆQÿÿPÿi¡Ù'mÄ1ÿÿAÿi$%'m€QÿÿPÿ8¡Ù'fºüÙ1ÿÿAÿ8$%'f†üÙQÿÿ(ÿéæ' ÊJ#|æ–2ÿÿ(ÿé>„'v#|‰ÿìRÿÿ(ÿéæ#|æ—"2jã.ÿÿ(ÿé>„#|‰ÿì"RjŒÿÿ(ÿéæÞ' ÉéZ#qØ”2ÿÿ(ÿé>„#qˆÿö"RC¨ÿÿ(ÿéæÙ' Ê,U#qã2ÿÿ(ÿé>„#qˆÿö"RvÿÿP}„' Êð3ÿÿAÿ&Eõ#v˜SÿÿP}„#y³3ÿÿAÿ&Eî#y¬SÿÿP¥„#yÈ5ÿÿAtí"y6UÿÿPÿ3¥Ù#yÂüÆ5ÿÿAÿ3t%#yÿÞüÆUÿÿPÿ3¥\#qá¥ÿÿAÿ3t«"q1ð¦ÿÿPÿi¥Ù'mÇ5ÿÿ.ÿit%&mUÿÿ(ÿé„#y¦6ÿÿÿé ð"yp Vÿÿ(ÿ3å#y˜üÆ6ÿÿÿ3 %#ygüÆVÿÿ(ÿéÿ' Ê"6yiÿÿÿé ‚#yF›ÿÿ(ÿé#y¢"ÿÿÿé €#yu™#ÿÿ(ÿ3„#y¢­ÿÿÿ3 í"yh®ÿÿf„#yš7ÿÿÿé4g#yÿù€Wÿÿÿ3fÙ#y¡üÆ7ÿÿÿ34¢#y üÆWÿÿÿifÙ'm˜7ÿÿÿi?¢&mWÿÿÿ6fÙ'fšü×7ÿÿÿ6E¢'fÿÿü×WÿÿPÿ3’Ù#jÇüÆ8ÿÿAÿ3$#j‰üÆXÿÿPÿR’Ù'|Çüå8ÿÿAÿR$'|üåXÿÿPÿ8’Ù'fÄüÙ8ÿÿAÿ8$'fŠüÙXÿÿPÿé’' Ê4~&8|ËÿÿAÿé$#|„ÿå"Xv{ŒÿÿPÿé’×#qÃ'jÃð8ÿÿAÿé$g#q†ÿö"Xj„€ÿÿƒ„'|­—9ÿÿ ñ&|pYÿÿÿ3ƒÙ#y§üÆ9ÿÿ ÿ3#ygüÆYÿÿ«„' É,:ÿÿ í'CìÿøZÿÿ«„' ʆ:ÿÿ õ#vÇZÿÿ«„'j3:ÿÿ î'jÝZÿÿ«„#y0:ÿÿ î#yâZÿÿÿ3«Ù#y4üÆ:ÿÿ ÿ3#yÚüÆZÿÿ„#yµ;ÿÿí"yt[ÿÿ„'j¸;ÿÿð&jp [ÿÿ y„#y©<ÿÿ ÿ%ë"yr\ÿÿB„' ËŒ=ÿÿÝõ"fU]ÿÿÿ3BÙ#y—üÆ=ÿÿÿ3Ý#yVüÆ]ÿÿÿiBÙ'm¢=ÿÿÿiÝ&m_]ÿÿAÿiÙ'm…Kÿÿÿé4Q&jójWÿÿ ð'zäÿîZÿÿ ÿ%ð&zsî\ÿÿ(ÿé'#^)Dÿÿ4„#y=APÿé½è%в +²+± é²+± é´% +±é°&/° Ö± é° ±"+±é°° Ö± é°/± é² +³@ +±'+± ´ $9±"°9±%±99°°9°°9012654&#"#462#"'532654&#vT:OB–¥þ£G,B*Pa?M.5=KKgSÇ(*&%„þ ih_q# p0Fc6{)0CQÿÿ ÿ3¯Ù#y¹üÆ$ÿÿ(ÿ3%#yhüÆDÿÿ ¯É"$©NÔÿÿ(ÿé"D©ðÿÿ ¸è' ÊÅd' ËÀ$ÿÿ(ÿé,„#vï¤ÿÿ ¯è' ˾& Éd$ÿÿÿé„'Cÿï¤ÿÿ ¯è' Ë´#© ó$ÿÿ(ÿé„"¤©ÿÿ ¯' Ë·ÿì&$|«ÿÿ(ÿé„#|t—"fvæDÿÿ ÿ3¯„' ËÀèÿÿ(ÿ3÷"fhéÿÿ ¯ó' Ê)o&$x¿–ÿÿ(ÿé„#vjÅÿÿ ¯è' É´d&$x¿–ÿÿ(ÿé„'CjÅÿÿ ¯*#©E5"$xÀ“ÿÿ(ÿé„"xlì"D©ôÿÿ ¯#&$#x¿–|Á6ÿÿ(ÿé„"xlò"D|k—ÿÿ ÿ3¯„#x¾˜èÿÿ(ÿ3ð"xhéÿÿPÿ3qÙ#y«üÆ(ÿÿ(ÿ3%#ypüÆHÿÿPqÐ"(©:Ûÿÿ(ÿé"H©îÿÿPq„'|­—(ÿÿ(ÿéá"|hôHÿÿP›è' ʨdŒÿÿ(ÿé6„#vù¬ÿÿ#qè& ÉdŒÿÿÿé„'Cÿý¬ÿÿPsè' ˪#©öó(ÿÿ(ÿé„"¬©›ÿÿPq' Ë´ÿì"(|Éÿÿ(ÿé„#|t—"fqæHÿÿPÿ3q„' ËÈÿÿ(ÿ3÷"fiÿÿPìÐ#©oÛ,ÿÿFç"ó©jÿÿPÿ3æÙ#yÿ÷üÆ,ÿÿFÿ3ÒÙ#yÿâüÆLÿÿ(ÿ3æå#yàüÆ2ÿÿ(ÿ3>%#y‘üÆRÿÿ(ÿéæÑ"2©YÜÿÿ(ÿé>"R©ÿÿ(ÿéæè' ÊÜd–ÿÿ(ÿéO„#v¶ÿÿ(ÿéæè& É„'C ¶ÿÿ(ÿéæè' Ëà#©*ó2ÿÿ(ÿé>„"¶©²ÿÿ(ÿéæ' Ëãÿì"2|áÿÿ(ÿé>„#|—#f…ÿæRÿÿ(ÿ3æ„' ËÜÿÿ(ÿ3>÷#f†ÿÿ(ÿé„' Ê6bÿÿ(ÿé’õ"v|cÿÿ(ÿé„' ÉÒbÿÿ(ÿé’õ#C™cÿÿ(ÿéÐ"b©gÛÿÿ(ÿé’"c©ÿÿ(ÿé„#|Ü—bÿÿ(ÿé’ #|cÿÿ(ÿ3û#yàüÆbÿÿ(ÿ3’I#y‘üÆcÿÿPÿ3’Ù#yÐüÆ8ÿÿAÿ3$#yŽüÆXÿÿPÿé’Ã"8©JÎÿÿAÿé$ï"X©ÿúÿÿPÿé„' ÊðqÿÿAÿé—õ"v^rÿÿPÿé„' ÉÜqÿÿAÿé—õ#C›rÿÿPÿé­"q©B¸ÿÿAÿé—þ"r© ÿÿPÿé„#|µ—qÿÿAÿé—ê"||ýrÿÿPÿ3€#yÆüÆqÿÿAÿ3—Ã#yŠüÆrÿÿ y„' É <ÿÿ ÿ%õ#C‘\ÿÿ ÿ3yÙ#yüÆ<ÿÿ ÿ%#y+üÆ\ÿÿ yµ"<©2Àÿÿ ÿ%í"\©òÿøÿÿ y„'|œ—<ÿÿ ÿ%ð&|q\ÿÿ(ÿñx#ò’.>ÿÿ(ÿñx#*‹.>ÿÿ(ÿñx "ÿ$.>ÿÿ(ÿñx" 3.>ÿÿ(ÿñx "/.>ÿÿ(ÿñx" .>ÿÿ(ÿñxƒ"iÿ>ÿÿ(ÿñxƒ#ƒ>ÿÿ ¯å"òÂôÿÿ ¯ë"*ºúÿÿ\é"ÿ¬÷­ÿÿLâ" ¯ñÿÿâ"¬ðhÿÿ"ñ& ¯sÿÿÿßÕn"Äê&ÿÿÿøéq"ó:ÿÿ(ÿö#ò€.Bÿÿ(ÿö#*‚.Bÿÿ(ÿö "ÿ.Bÿÿ(ÿö" .Bÿÿ(ÿö ".Bÿÿ(ÿö" .BÿÿÎå"ò¬ô#]ÿÿÐå"*¯ô#_ÿÿŸæ"ÿ¬ô#.ÿÿ‘å" ¯ô# ÿÿâ"¬ð#ÿÿ“å" ¯ô#"ÿÿ ÿ8""òv1Dÿÿ ÿ8""*1Dÿÿ ÿ8 "ÿ2.Dÿÿ ÿ8" .Dÿÿ ÿ8"5+Dÿÿ ÿ8" 9%Dÿÿ ÿ8„"mDÿÿ ÿ8„#¤Dÿÿûå"ò¬ô%^ÿÿþå"*¯ô%aÿÿÁæ"ÿ¬ô%$ÿÿ¸å" ¯ô%ÿÿ³â"¬ð%ÿÿ¿å" ¯ô%"ÿÿÿÍUq"²í%¸ÿÿÿç`n"ñð%Ãÿÿ;ÿïK"òç.Fÿÿ<ÿïK"*ì.Fÿÿÿï… "ÿÂ.F:ÿÿÿï‡" É.F<ÿÿ&ÿïŠ "Ò.F?ÿÿ'ÿï†" Ö.F;ÿÿÿï‚…"øF7ÿÿ%ÿïƒ"/FEÿÿWå"ò¬ô'qÿÿWå"*¯ô'qÿÿ æ"ÿ¬ô'#ÿÿ å" ¯ô'#ÿÿâ"¬ð'ÿÿÿå" ¯ô'ÿÿËm"åé'åÿÿËl" î'åÿÿ(ÿé>#òœ.Lÿÿ(ÿé>#*Ÿ.Lÿÿ(ÿé> "ÿ..Lÿÿ(ÿé>" ).Lÿÿ(ÿé> "C.Lÿÿ(ÿé>" 0.Lÿÿÿé8å"ò¬ô-Rÿÿÿé9å"*¯ô-Sÿÿÿéúæ"ÿ¬ô-ÿÿÿéõå" ¯ô-ÿÿÿéÓå"¬ð-íÿÿÿéÑå" ¯ô-ëÿÿ<ÿð$#ò•.Rÿÿ<ÿð$#*˜.Rÿÿ<ÿð$ "ÿ'.Rÿÿ<ÿð$" ".Rÿÿ<ÿð$ "F.Rÿÿ<ÿð$" =.Rÿÿ<ÿð$…"vRÿÿ<ÿð$ƒ#šRÿÿ{å"*¯ô2‡ÿÿGå" ¯ô2SÿÿVå" ¯ô2bÿÿþl" î2 ÿÿ(ÿñö!#òó0Vÿÿ(ÿñö #*õ/Vÿÿ(ÿñö!#ÿ/Vÿÿ(ÿñö# .Vÿÿ(ÿñö,#Â:Vÿÿ(ÿñö"# ¦1Vÿÿ(ÿñö„#ÅVÿÿ(ÿñö‚#òVÿÿDí"ò¬ô6MÿÿGí"*¯ô6Pÿÿí"ÿ¬ô6ÿÿí" ¯ô6ÿÿßí"¬ð6èÿÿìí" ¯ô6õÿÿÁm"åé6Êÿÿ¾l" î6Çÿÿ(ÿñx"6>ÿÿ(ÿñx#)‹>ÿÿ(ÿö"$Bÿÿ(ÿö")xBÿÿ ÿ8"JDÿÿ ÿ8 #)DÿÿÿïK"®Fÿÿ<ÿïK")ÇFÿÿ(ÿé>"@Lÿÿ(ÿé>#)•Lÿÿ<ÿð$"9Rÿÿ<ÿð$#)ŽRÿÿ(ÿñö#—'Vÿÿ(ÿñö#)îVÿÿ(ÿ9x"lBÿÿ(ÿ9x"lCÿÿ(ÿ9x "lDÿÿ(ÿ9x"lEÿÿ(ÿ9x "lFÿÿ(ÿ9x"lGÿÿ(ÿ9xƒ"lHÿÿ(ÿ9xƒ"lIÿÿ ÿû~å#ñŠÿûJÿÿ ÿû{ë#ñ‡ÿûKÿÿÿû é#ñ,ÿûLÿÿÿûâ#ñÿûMÿÿÿûÓâ#ñßÿûNÿÿÿûÝñ#ñéÿûOÿÿÿÖÿû‰n#ñ•ÿûP÷ÿÿÿäÿûq#ñ›ÿûQìÿÿ ÿ8""É^ÿÿ ÿ8""È_ÿÿ ÿ8 "È`ÿÿ ÿ8"Íaÿÿ ÿ8"Ébÿÿ ÿ8"Êcÿÿ ÿ8„"Ìdÿÿ ÿ8„"Éeÿÿÿûßå#ñëÿûfÿÿÿûèå#ñôÿûgÿÿÿü¥æ#ñ±ÿühÿÿÿû¨å#ñ´ÿûiÿÿÿûŸâ#ñ«ÿûjÿÿÿûªå#ñ¶ÿûkÿÿÿÍÿû9q#ñEÿûlÿÿÿçÿûLn#ñXÿûmÿÿ(ÿ8ö!#×–ÿÿ(ÿ8ö #×—ÿÿ(ÿ8ö!#טÿÿ(ÿ8ö#×™ÿÿ(ÿ8ö,#ךÿÿ(ÿ8ö"#×›ÿÿ(ÿ8ö„#לÿÿ(ÿ8ö‚#×ÿÿÿê#í#ñ/ÿêžÿÿÿêí#ñ)ÿêŸÿÿÿêÞí#ñêÿê ÿÿÿêÝí#ñéÿê¡ÿÿÿêµí#ñÁÿê¢ÿÿÿêÆí#ñÒÿê£ÿÿÿêm#ñ©ÿê¤ÿÿÿê™l#ñ¥ÿê¥ÿÿ(ÿñxð"xm>ÿÿ(ÿñxœ"qoá>ÿÿ(ÿ9x"l¦ÿÿ(ÿ9x"l>ÿÿ(ÿ9xû"l9ÿÿ(ÿñxá"ó~õ>ÿÿ(ÿ9xá"véÿÿ ¯…#xÉ™ÿÿ ¯\#q¶¡ÿÿÿê¯å"˜üÿÿ ¯å")¤óÿÿ ÿû|Ù#ñˆÿûÿÿT3Øñò:ôüA²+´'+² +³@ +³@ +°/°Ö´ +°±+´  +±+01732>73#".=3•   !$[~'"  C?bT3Øñ;°/´++°/´ +° /°Ö°2±é±é°´ +°/± +013565#V‚„B@ñJf/ 2ÿÿlbì| ÿÿÿÿöaX…#óÿö™jôÿÿ ÿ8"˪ÿÿ ÿ8$"ËDÿÿÿ8$õ"Ê;ÿÿ ÿ8"ó}"Dÿÿ ÿ8"Êøÿÿúå"®ü#‰ÿÿ÷å")‹ó#†ÿÿ$å"®ü%‡ÿÿ!å")‹ó%„ÿÿPÿû}Ù#ñ‰ÿû%ÿÿT3°ò#– òÿÿT3«ò")nòÿÿ3}„#ó˜ò/ÿÿÿï_ð"xôFÿÿÿï^œ"qðáFÿÿÿïk"F ÿÿÿïb "Fÿÿÿïqá"óõF&ÿÿÿï~ƒ"ô þF3ÿÿ°#xÿôÄ'ÿÿ1\#qÿö¡'ÿÿwÜ"®ó'‘ÿÿmâ")‹ð'‡ÿÿQ3­ñ#“*ÿÿQ3¯ñ")rþ*ÿÿÿö0X~#óÿö’*ýÿÿ<ÿð$ð#xŽRÿÿ<ÿð$œ#qÿáRÿÿ<ÿð$#…Rÿÿ<ÿð$#…Rÿÿ<ÿ5Rü#ò· Nÿÿ<ÿ5R #*±Nÿÿ<ÿð$á#óÿõRÿÿ<ÿð$ƒ#ô…ÿþRÿÿô…#xÞ™2ÿÿô\#qà¡2ÿÿ¯Ù"®ð2»ÿÿÇß")‹í2Óÿÿÿøô"*¯/jXL  P°/± 33±é°2² +³@ +° /°Ö´ +°± +´  +± +±°9° ²999013#'#5!#5RrFÿ÷Ï-7°/±é±é°/±+01!5-ýÊ7hhÿùÏë7°/±é±é°/±+01!5ëü7hhÿÿÿùÏë7?ÿÿdÿ8VÙ'_¢_ÿÿÿêþÔBÿ¦&BœBÿÿDâ¾Ù\»ÀÿÿDâ¾Ù\ÿÿ<ÿz¶qDÿøý˜Dâ¾Ù :² +± é°/´,+° /°Ö´+´+°2´ +± +01#.=¾>>5EÙpM .Q=gÿÿ>â†Ù'CÈCúÿÿ8â€ÙG¾»Àÿÿ8ÿz€qHý˜ÿÿBâ†Ù'FÈFþÿ> Å L² +°/°3± é°2² +³@ +° /°Ö°2±é° 2² +³@ +² +³@ +± +01###5353 ³†³³†åtýÍ3tààÿ>Åc²+° /°3± é°2² +³@  +°/°3± é°2°/°Ö± 22±é±22² +³@ +°2² +³@ +°2±+01#3##5#535#5353³³³†³³³³†åtßtààtßtàà2ª^Ö .°/´ +´ +° /°Ö´ +´ +± +012"&546ÊXX>?W3¶g !°/´ +° /±+´ +± +01"&5463gýh ‰ ’ÿÿ¡7’oÿÿ$´’&òìÿÿ$®’'æ&òìÿÿ@©¼$y ÿêÞã $/:Eê² +±633´+ +°@2²+°3´  +´% +°03´% +°;2´ +´ +°F/° Ö´ +°±+´ +°±#+´( +°(±-+´ +°±9+´> +°>±C+´3 +±G+± °9°²999±-(² 999°°9±C>±6099±%+µ"#389$9± ² 999012#"&46"2654&%3#2#"&46"2654&%2#"&46"2654& ?WX=>XX=)):*)2Cþ[B‹?WX=>XX=)*:))S?WX=>XX=)*:))ãW?;WWzWP))))Oý 'W? +°>±C+´3 +°3±O+´T +°T±Y+´I +°I± +´ +°±+´ +±]+±$°/9°)².999±C>²,60999°3°-9±YT±LF99±±99±;A@  389INO$9±!'²999012#"&46"2654&2#"&46"2654&%3#2#"&46"2654&%2#"&46"2654&¶?WX=>XX=)*:))ûÌ?WX=>XX=)):*)2Cþ[B‹?WX=>XX=)*:))S?WX=>XX=)*:))W?32#547'57>54&–Ì(:NA"r¬?M |&Ú%’’’OAb7" ƒc;Q6  /$ÚW:" |Yt+1¶,°/±é±é°/±+01!5,ýÕhh"ÿ%q²+± é°/±+±± 99017#"&/5326F+8‹]_Š8+J±NŠ"y7&&7y"="2q°/± é°/±+±± 990157>32'&#"M+8‹]_Š8+J±NŠU#z7&&7z#<ÿöÿÀ-3#'#6x˜ªyllx-ûþì±±ÿÿÿùÿàDÙ' ß' ÿâþJ ßþI2—^K(°/´ +´ +°/±+´ +±+01!5^þÔK´´ÿSÿìQ˲+²+°/±+013#úWþYWËý!`ÿ-ò$G°/± é°/± é°%/° Ö°2±é°2² +³@ +±22±&+± ° 9±° 901;#"&=47.=46;#"ß (G>H:!H>G(!PsSI¶k1M9¶ISs ¦?,m1-ÿÓò#G°/± é° /± é°$/° Ö°2±é°2²  +³@  +± 22±%+± °9± °9017'57>=4&+532+5326=4&! (G>H!:H>G(Èm,?¦sSI¶9M1k¶ISs ¦>-ÿÿ@è#"c"ÿÿ@iè#c"ÿÿpyè#"Mÿô0 2²+°/± é° /°Ö±é² +³@ +± +± °901#67!5{eÃþŸ0n”ÏkïÐ}ÿAÙH² +´  +°2² +³@ +°2°/° Ö´ +°±+´ +´ +±+01####5!2t\b?b+/Xwï`€þ6Pü°PH‡ÿÿ$109xTjÀ$109N°/± é°2°/°3± é°/°Ö´+² +³@ +°2°±+´ +±+±° 901%!53#5!2#3HþÜ99$Jk32l‡<<1r$rKtEDtL–þÜÿÿÿàe" þIqÿR G²+´ #+°/´ +°/´ #+°/° Ö° 2± é°2± é°2´ +±+01%#.=3#VV1? ––’’b8$82#‰v’ÿÿ"ÿõq/'kÿjÐÿÿÿàeå' þI ÿÿA?à'yÿZ'yºoî 8¨T°/° 3±é°° Ö± é°/±+°6ºïÂE+ °°À± ù°À³....³....°@013#"/&#"#7>323267Ú^TG4M#!&^ ZA;6$+¨#?: ! !9= "ÿ qÿè²+± é°/±+±± 990157>32'&#"M+8‹]_Š8+J±NŠÔ#z7&&7z#< ÿÙÖZV²+°F/°3´L +°2°[/°5Ö°2±/ é°2±\+±/5´ ,8Z$9±LF´!CO$9°´ SZ$901&5463276327632#"/#"&/#"&54?#"&546?#"&54632'.5463281!"0J%.!/e} "33" |h/!'I1!"0J'!/e} "33"zh1!%I^"33"|i4-#&I1!"0J'!.e} "33!|i-#'I1!"0J'$,fÿÿ%ÿæÄ1&yå.'y yÿ=ÿÿ(Ó4æ']e']™']Ì]ÿÿ%ÿõ“º'yÝ–'yÝÿL'y×~yå~ÿÿ%ÿè–¾'yßt'yÚš'yÿå—'yÚÿ?yÿåÿ?ÿÿ%ÿé¡ 'yÿåçyÿåÿ@ÿÿ%ÿ8“'y×<&yå<'yÝùyÝþÿÿ9) 'ycä'ycÿ&yü& 3yÿùâÿÿ%ÿë¡ð'yÿåÿB'yÿåÌyÿåˆÿÿ%ÿê¡ñ'yÿåó'yÿåÿA'yÿåÍyårM3L° /´ +°/´ +°/°Ö´ +°±+´ +±+±± 99±±99014632#".74&#"326EX/@! .?"à!"# #$Rix#BL2Þ"@L2\ADXZ?Cÿÿ6†’`L †)™†N/ `°/°3´  +°2² +³@ +²  +³@  +°/°Ö° 2´ +° 2² +³@ +² +³@ +±+± °901##5#53#5N._³¥m_j.K]]Jþÿ¤¤hJ ­²+´ +° /´ +² +³@ +°/´ +² +³@ +°2°/°Ö´ +°±+´ +±+°6º?õ]+ °.°.°±ù°±ù°.³....°@±² 999°±99±°901#632#"&'332654&#"#78½'(@O\IBSY<"('#+Q) KYRAEVE85,%&, írL3'k°/´" +°/´ +° /° /´ +°(/°Ö´ +°2°±%+´ +±)+±%³ $9°° 9±"±99°°9014>32#&#"632#"&7"32654&55"/"S' "&5;IUCVKŸ'&(%JFb./"&&-)%M=EWpt,#"+-"#*wQ 5² +´  +° /°Ö´ +² +³@ +±+± °901#67>7#5QQL[,Aã B\§d|T^K rP3)°/´% +°/´ +°/´ +°*/° Ö´" +°2°"´ +°/°"±'+°2´ +´ +±++±"° 9°'³%$9°°9±%± 99°± 99°±9901#"&547&54632"32654"2654&A;JZGHZJ;S@?St<&'&E '&B'&¿8&G=LL=G&:2BB Š&! %%"&ÿÿpL1 ”_£À¿Kà R² +°/°3´ +°2² +³@ +° /°Ö°2´ +° 2² +³@ +² +³@ +± +01##5#5353KuMuuMsGmmGmm,Ks(°/´ +´ +°/±+´ +±+01!!7þÉsGÿÿäKº&™G™¸ÿÿ(Å„ ª)™ÿÿ(¾„›Ø¬Àÿÿ*†eëQ†)™ÿÿÿ&Mçý´ÿÿ(ÿ8òá{ý³ÿÿÿ8Hêtý²ÿÿÿ+Iêuý¸ÿÿÿ8Ná’ý²ÿÿÿ*Jâ“ýÂÿÿÿ*Lë”ý¸ÿÿÿ8Qá•ýÁÿÿ ÿ*Pë–ý¸ÿÿÿ*Lë—ýºÿÿÿK ˜ýÀÿÿÿìL3™ýÀÿÿÿŸLušý»ÿÿþÔÅ/G›ý¬@?äÿÿþÕ½1›×YÀÿÿÿ)^Dÿ8)™ÿÿÿ+cŸHÿ:)™ÿÿÿ+vŸRÿ:)™ÿÿ ÿ8\—[ÿ8)™ÿÿÿ+aŸùÿ:)™7Ùu²+²+±é´ +°3´ +°2´  +°3´  +°2°/°Ö± 22±é±22² +³@ +°2³@ +² +³@ +°2±+013##5#535#535!!3#çþþ…OOOOÕþ°þþIPùùP?Sþk“S ÿßBòM¾²!+± é° Ö± é°'/°3´( +°2°-/°3´. +°2°F/±5 é²F5 +³@F; +°N/°2Ö±Ié²I2 +³@I +°2²2I +³@2' +°-2°I±<+±;é±O+±I2´#),/&$9°<¶ !5F$9°;²999±!°#9°±$99±' ±99013#3#63232>7#"&#"'67#53.'#53.54632#45.#"誉 € $i  C$>&0„ R)DZo{n> ˜o9W5"‰$5? ‘N 3N  ZUM+N@N&-eŠ3JO0# 8/")<ÿŽ8‹%”²+± 33²+²!+± é° 2²! +³@! +²+°&/°Ö±é°2°±+°2± é° ±+±é±'+±°9°±!99° °#9°±%99°±99±±99°²#%999013#4&'#5#54&#"#3>3267‡sG?FŒ'"cŒ†sù)#-3Œ‹#C.j) &‹i UEþ‚h %þâQÃln &82þ¼C)#P*.¬Ý#˜²+°3²+°3´  +² 333´ +±22´ +²"333±é±22°$/°Ö± 22±é° 2² +³@ +° 2°±+°2±é±22² +³@ +°2±%+±³!$901##'##5#535#53533533##5##3'#¬3…ƒ–€----‚Š‘33]5õe415]××××]WgêêêêgWWWWÿÿPÿé¶Ù&5V­PÓXh²+°3± é² +³@ +°/± é°2² +³@ +°/°Ö±é°±+±é°±+±é°±+±é± +±°901%>73+!32#54#!#É>;‹,>L7 þ‡‹APk‹0þ¿‹s5:qþ7W0 zþùåYIÜÜ/þXÿè+#%ª²+´+° /± é°/± é°/°3´ +°2² +³@ +² +³@ +°&/°Ö°2±é°±#+±22´+±22²# +³@ +²# +³@# +±'+±#± 99°± 99± ° 9°°9°°901%!5##5#"&546325#5353"32654&øþ%6u3Jj||gF2NN}è3=>30:;AYY¹SýÏ+™{—%?S))åVVUGLT$ÿé\ã.s²+±(é²+±é´ +°"3´ +°$2´  +°3´ +°2°//° Ö±! é±0+±! ±99±(°-9°°,9±°9°°901".'#73&47#73!2.#"!#3#32>7§BOB7 M,C0> 7D+-.BZï×´U<"9N %:eAD* D|WHD" DFM•"ÿ8Eð0~²+°-/±. é°/±" é°1/°Ö±é°±+±* é²* +³@- +°° Ö±% é±2+±³$9°±"99±%°'9±.²*999°µ%'$901654#"4''#67.54632#526h MKt7¡£G #iUE^WAFuŒ96Ý93  þ_wðk2‰|$?:N!ViXCh _©cGcs"ÿ‚2û '²+°3± é°!2² +³@ +²+°3±" é° 2²" +³@ +°(/°Ö±% é°%±+±!22´ +± 22°±+°2± é°2±)+±±99±"µ %$9°°90153#&4.'>73#5.546 Dnj  $ ’ksDts€7&&Ä76‚z%!þ$* }Šhi ½ª¨²ý´ÕjmprVÙ K²+² +±é´ +°3±é° /°Ö± é² +³@ +° 2² +³@ +°2± +01##5!5!–ÝHý¸HXþ¨X}}}} ÿÑKÙY²+± é°2°/°3± é°2°/°Ö°2´+°2² +³@ +°2² +³@ +°2±+±°901#&'7326=!5!5!5!#3#ÀWBLT[¨’c):!þÇ9þÇ?‹‹‹’CfoK^´ÒQ2$'&v3vv3výËÿÿ²+´ +° /01!>7ýÌMW@/IdFAYM/YýËÿÿ²+´ +° /01!&'7!ýË€N.AXLýÌd_/MYAÿ,ÿèÿw®²+°/°Ö´ +´ +013ÔKÆý:ÿÿõÿc!#²+²+°/°Ö´ +´ +013íP ,ýÔý‘ °/´ +°/±°901!.'>7þ#=,0I>>I0,=#ïB(M+9L<7n,4.E99:;B.7)þR,4.H879;C.4,ö.J(R;33?N'M,0I'U;02>P(H0ý<ÿÀÿúð #ýiSý—ðüÐ0þOWM2°/´ +² +³@ +°/°Ö´ +² +³@ +01#!5MNþPýÖÜNÿÿþÿ9ÿþÿ´'yÿBþ'yþ‰þyýÒþþ-ô²>°/°3´ +°´ +´ +°/°Ö´ +°±+´ +01#5!#5þ{NÖMdp¾¾pü8 ÿ×, °/´  +° /01!&'67*üï6n,i››i,n6>F8‰-|••|-‰8ý¨ÿšPR###Pþ:OÉGþ:OÉRýH¸ýH¸ÿÿýêþòÿÚ¿ýé÷ÀÿÿýçþõÿݾýæúÀÿÿý þÒÿôGÂýI@0ÿÿý˜þÐ ÿòGÂýž{ÀÐþÏ2ÿœõ=² +°3° /°3´ +°/°Ö´ +±°9± ´ $90137''7'7â/DE-''(&,EDõH,9;;9,(ÿì†ê4@` ²W+°3´P +²PW +³@PT +²+´. +². +³@.2 +²+´> +°J3´> +°A2²> +³@G +°a/°Ö´<+°<±,+°+2´ +° 2³ ,+´+°/°3´+° ±\+´N+°N±G+´D+±b+°6º‹Á­+ °!°&À±9ù°8Àº ÐÀÂ+ ±!&°!°&À±9ù°8Àº?)õ¨+ °.° .°± ù° ±+ùº ëÀÆ+ °!³"!&+³#!&+³$!&+³%!&+º>›ò¶+ °³*++³5++³6++²%!& Š Š#9°"9°#9°$9²5+ Š Š#9°69°*9@ !"5689#$%&*+...............@ !"5689#$%&*............°@±<±299°³1>$9°,².999± ±99±GN²AS999°D±T99±P²DN\999°>°9°.° 9013#2#&547#"&54>?2>54#"#>73262#.#"32673#".54676ÔUý»U’*< .q?=1=8$+ 6$& a_a 1$'6&3ÒCPc%;B(chH-B!*!:Ëý!ýÞ 96+ (" HBõ#%10G5%$?6@L!'JQ..5u'F$ÿì¤ê4@m7²[+°3´e +²e[ +³@eb +²+´. +². +³@.2 +²+´>[ +°D3´ +°O2°n/°Ö´<+°<±,+°+2´ +° 2³ ,+´+°/°3´+° ±A+´R+°R±h+´X+²hX +³h` +°X°G Ö´L+°L/´G+±o+°6º‹Á­+ °!°&À±9ù°8Àº ÐÀÂ+ ±!&°!°&À±9ù°8Àº?)õ¨+ °.° .°± ù° ±+ùº ëÀÆ+ °!³"!&+³#!&+³$!&+³%!&+º>›ò¶+ °³*++³5++³6++²%!& Š Š#9°"9°#9°$9²5+ Š Š#9°69°*9@ !"5689#$%&*+...............@ !"5689#$%&*............°@±<°29°´1>$9°,².999± ±99±RA°l9°h´DOUk$9°L±V99±GX°I9±e¶GALRX`I$9°>°9°.° 9013#2#&547#"&54>?2>54#"#>73264632#654&#"#".547332654&/&àUý»U‚*< .q?=1=8$+ 6$& a_a 1$'6&31kUFPd"$G[p^.D"fL"+#;_Ëý!ýÞ 96+ (" HBõ#%1ÇAV92   AGT$#2  ÿÿÿéáå#&8r‡ ÿìºæ >Ͳ +°3´ +²+´( +²( +³@(% +²+´ +´+°5 Ö´. +².5 +³@.2 +°?/°:Ö´,+°,±%+´"+°"±+´+°±+´+±@+±,:°9°%³15$9°"°29±´ $9±5 ²999±(±",9901%4>32#"&72>54&#"3#2#.#"32673#".54676@zOR_•wP^Â%9 +%6O,Uý»UŸCPc%;B(chH-B!*!:P‡RUK~«V,A8+3nL+2…ý!ùG5%$?6@L!'JQ..5u'F$ÿìÆæ#:8²%+°$3²)+°3´5 +²+´  +²  +³@ +²+´) +³/09:$3´ +² +³@ +°;/°Ö´+°± +´+°±,+°.2´3+°12±<+°6º>™ò®+ °..°/À±1ù°0Àº>™ò«+ °%.°:.°%±$ù°:±9ùº>™ò«+ °%³&%9+³8%9+²&%9 Š Š#9°89³&.18....·$%&/089:........°@±°9° ³$9°°9±5°,9± °9013#2#.#"32673#".54676#7#"&5473326?3½Uý»U›CPc%;B(chH-B!*!:Æg @)1;;g38$6 2gËý!ùG5%$?6@L!'JQ..5u'Fý2# 5-ò 75-ìÿÿ(ÿéåR(ÿé©å{²+±é² +³@ +² +± é² +³@ +´ +±é°/°Ö°2± é°2°±+´ +±+±± 99±µ $9±°9015!.#"#>32#"&'33267ú^H€ ¥š´²˜ˆ¨’TFO_:}S[ƒyŠÎ±°Í“}FLodÿÿ|Ù#),r‡ÿÿAÙKÿš|Ê!>¸²"+±5 é³'"5+±0 é²0' +³@09 +²'0 +³@', +°/± é° Ö± é² +³@ +°?/°9Ö´8+°8± +´+° ֱ鰱,+´-+±@+±89°9° µ"3$9±± %99°±'099°,° 9±0² 99901723254&54673#"&#"#4>232>73#".#"#4>é& *"'aK3 y"4.=Y%( qb:)E'79'y,MQpfJ6&'4Na`‰4 4M&y#)#  Rf#)#Q]3NQ4!ÿõKè&c²+± é²+±!é°'/°Ö± é°±+±é±(+±±99°´ $$9°° 9± ± 99°!µ $$901327#"&54>7'7>324#">Kžƒ/ x!VQOQ *I•0€]VEŽ*$8@`O¡8|:*-:1'E wK©§FR5444632#".53032654&#"#'.—'$8 j.&9& %=BRq5ýkRS_+T?-4#o 9$ % }Q!=2#þ× )>LtsP"" z52FX^†»N;(Ìå%D:!.¡æ)6>²/+±0233²$+´ +²$ +³@ +°/´ +² +³@ +°7/°!Ö´ +°2°´ +°/°±+´  +° Ö´ +° ±.+´- +°,2°-±5+°62´4 +±8+°6ºñ ÁÆ+ °°À± ù° ÀºÁÑðÛ+ °0.°1À±,!ù°+Àº><ñ+ °6.°*À±2!ù±01°1À@ *+,16.........@ *+012.........°@±!°9±²$999±³-.45$9°° 901#&#"#"&'332654&/.54632##33#˜X[%+%2H@:dYWc\40,1'/@F<\R-2%[^U[‰VT‰[RH  <6FOOI%'! 96CJ7þ›]þ£Èþ¢^þ8]ÿÿÙf7ö33@/(¤/\/f/\oÙŲ+±33´ +°2² +³@ +³ $2°/°Ö´ +² +³@ +² +³@ +°± +´  +° 2° ±+°2´ +±+°6ºÁÑðÛ+ ° .° À±!ù°Àº><ñ+ °.°À±!ù±°À² ...´ .....°@01##5!##33#ý_‰m?^U[‰VT‰[‹þ†zNNþ†]þ£Èþ¢^þ8]ÿÿ(÷í6ÿÿ(ÿÇ÷´ 6´Àÿÿ ÿïFU ÀÿÿPÓÙ.ÿÿ ¯µ‡ÿÿ(ÿé%HÿÿÙ)dÙÀÿÿlX¾âÿÿ)X¿Çÿÿ/÷XÀÿÿ?6XÁÿÿ(ÿéD¨‡4ÿÂ@ÀÿÿCxÙf)33@/$/\;”/\ÿÿ1ÿçÎã*öÎÀÿÿ(Ù/kÙÀ Ù,²+±é²+°/°Ö± é² +³@ +±+013!5!}–þ ]Ùý'}ÿÿ yÙ<ƒÙÀÿÿÿë‡Õ ¾¾À ÿìôæ C0²-+°3´:+²+° 3²+²+´+´- +°3´+° 2² +³@ +± 22°D/°2Ö´7+³72+´ +°7±=+´'+°'° Ö´+°/´+±E+°6ºÀyø9+ ° .° .° ± "ù° ± "ùºñ/Á½+ °A°@À±##ù°$À° ³ +³ +´ #$@A.....@  #$@A..........°@± 7°9°=´-:$9±:²'24999°³ $9013###3#/4632#654&#"#".547332654&/.£Uý»U#Ê+ *Ä„À *ÿLÿÿŒÿ-8£ƒ AúÊÀ@ÿÿ'ÿ’># *´ *ÄÀÿÿ'ÿ’># *ÿL *´ÿÿŒÿ-8£ƒ DúÊÀ@ÿÿ'ÿ’> DÄÐÀÿÿŒÿ-8£ EÄÐÀÿÿ ¯Ù$¹ÙÀlÿu`]X°/±é² +³@ +°/± é² +³@ +°/°Ö´+°±+°2´+° 2±+±± 9901%#"&54632#4&#"3265`Šph’’hq‰iKFBNIGHIom“gôh’ŽlELNCþ DLLD ÿéÔ)g²+±% é²+± é´  +± é³+°*/°Ö±"é°"±(+°2±é±++±"°9°(³ $9± %±99° °901#"&54632&'.#"#>3 "326543i?jƒs[,@! 9*"'‚+/=$Æb:=/0<Q®Q18tf€"K06"0F"þ‘F;9JH8;;\Ù C² +± é²+±é´  +±é° /° Ö°2± é²  +³@ +±22± +01!5!5!5!!5!Æþu‹þu!ýß‹:}¥}ý'}7ÿÄ\"u² +°3± é°2² +³@  +²+°3±é°2² +³@ +´  +°3±é°2°/°Ö°2± é² +³@ +± 22±+±±990133!#7#537#537!5!35'35#ÃY"bþPYQW¨áLþÓfeWáQQ"Iý'<<}½}¥}þa½½}¥1ÿç+ë#z² +²+±é²+°3±é°$/°Ö´"+°"±+´+±%+±"± 99°µ $9°°9±± 99°µ $9°±9901#"''7&5463232654' &#"ÏT>FϯuX8T7ZÒ¬ˆ^þ˜:Gy”%þAqBWy—êJDa¤Ù4>J7¹YMM³˜YP[«ÜG7XŒŒnL,Gu[bm£“N˜ž;;]®]ˆ](„T1Ž®\MÿÿPÿÿÓ RIÔÀZ#š°/°Ö´ +´ +±+017!Z@#lý”iÿIÍÜ5²+±é² +³@ +°2°/°Ö± é°±+± é± +01!#!#id–þÈ–ÜümüêÿÿiÿIÍÜ W6%À)ÿ=èÙ 0²+±é°/± é° /± +±° 9°° 9°° 901!! !!5 8£þ!Tþ øýApþŸÙzþ¸þŸy\|]2¬#°/± é± é°/±+01!5þ#wwÿÿ3• sH…Àÿÿ2¢& y£~ÿÿÿìþËo­(ÿìœ ²+²+°/±+01#¯í‡í ýÌ4Bå°/°Ö°2´+°2±+017'7'7537'#5L;ss;sws;rr;sw„gCBgB„„BgBCgB„„?o´ã P°/´+°/´ +°/°Ö´ +°± +´ +±+± ² 999±² 99901#"&546324&#"326´mMOlmNMm]5(&87'*3)NllNMmmM(56''74ÿÿdªÖM2ÿ·:„R²+°/°/°Ö± +°6°&±.ɱ.ɰ6º?õ<+ °°À°°À±..±..°@01'7ïK¤þöa$°¹„ ü?ø/FUþ™ÿÿÿ·:„+uÍ6f bÿÿÿ·:„+’|Î6f b||” 1R°,/°(3´ +°"2°/°3´  +°2°2/°/Ö´ +±3+±,°&9°´ $*/$9° ±99013267&#"72>32&#"327#"'#"&546u""6$>B!32#"'#"&5463267&#"2654&#"±U_ GQOBcYYa:WT""6$>B!¡'9!C”W M=CKWWZ47S!"<$X!$ @>K 8²+´+² +³@ +°/°Ö´ +² +³@ +±+01)3!Kýó]° þPäȲ+´+°/±+01!!äþ àý8È‚þ^Fÿò–¤"²+°/°Ö´ +´ +±+013FP²ýNÿÿFÿò6¤& i i ÿÿBÀ l`ÀÀBÀ²+°/±+0133xššxþîÀþòþ@(ÿÿÜü@²+°3° /´+°/°Ö´ +°± +´ +±+± ±9901#546 #54&#"†^ÌÌ]šcbš´ƒÆÆƒ´¾ZЉ[ÿÿ(ÿõÜò mñÀ<ÿ Ôÿ:°/± é°/±é°/° Ö±é±+± °9°³ $9°°901%#"'73254632&#"C1>9$ S{V%$$-9Z6$ sw@\wn 9Dÿÿ<ÿ öÿ# o" oÿÿ<ÿ ÿ' oD' o" oÿÿ…ÿÒ™©'y…'yEÿ)yÝÿ)ÿÿ‡3›  r ÜÀÿÿ2ÿÆ®å'yÿòÁyÿòÿÿÿ2ÿÆ å& t trÿÿ2¬Ç'y£ Zÿÿ2ÿÆßÇ'y"ÿ'y#£ Zÿÿ2ÿâù'yÿòÕ'yÿòÿ9'yXÿ9'yYÕ Zÿÿÿîßæ'y{ÿE'y| zÿÿŒß8aþÿÿ$ÿêе‡ z\ÿÖ@Àÿÿ5  }JáÀÿÿ2T×' z(Ÿ Z¨ÿÿ2ÿé<' z( µÿÿ.ߦ& zþn z¢ÿÿ2ÿçù' Zÿ; 2Sÿÿÿòßñ' z¹' zÿf zÿÿ24v' ¯» ÿÿ2ÿJ'y§þØ'y§& ÿÿ2ÿ~U'yZþÕ'yÿò1 ÿÿ2ÿ„S'yÿòþÛ'yZ/ ÿÿ@ÿŠÁI'yþá'y% «ÿÿ2ÿˆÁ?'yþß'y ÿÿ27&z}› ÿÿ27…g ¹/8T@ ÿÿ27¥/ kœÅ  ÿÿ27§/ lŒÇ  ÿÿ#7Aå/IÃÁ™/HìÀ™/G¿™ ÿÿ27Ë/PZø ÿÿ272/"—͸ 2ÿÄ!6²+° /°3± é°2²  +³@ +°/°3± é°2°/±+0133#3!#7#537#5!¯YM[ŸEäþØ@Y@c§Eì0!†wywppwywÿÿ2' ZÞ& Z% Zÿlÿÿ2ÿÚc' ‰ Zÿ.ÿÿ2ÿÚ\' Zÿ.! ‚ÿÿ2ÿK¬' Ò ÿÿÿ2ÿI©'! Ï ÿÿÿ(ÿöÐÚ&¿ÿÿ2ÿ÷ÚÛ •ÑÀÿÿ-ÿÄ'¥ zÿ8ÿÿ(ÿÄ' zÿ8!¥7h4²+´+° /´+°/°Ö´ +±+± °901!".546;#";~Es\3³˜”:Y66Y9Œ!FyR˜ž]$=J)*L?%]ÿÿ7i ™IiÀ7ÿÄ£9² +´+°/°Ö°2´ +±+±±99± ± 990133#;#"'#7&546;¹YPÎ9QŒŒnL4YMM³˜ß®E`)£;]þx&](d“N˜žþWK@Y6C6ÿÄ£7°/´+°/°Ö´ +°2±+±±99±±99013+#7#53&+532>54¸YLM³˜ Y PÎ9QŒŒnL ®E`)£‘N˜ž==]ˆ&](—þµ@Y6Bÿÿ2ÿÇÞ& ™v Zÿÿÿ2ÿÈÜ' Zÿ šsÿÿÿäê°/~6f Òÿÿÿäê°/ Z‹~6f Òÿÿÿäê°& Ò™Œ…6fÿÿÿäê°§ Z^&w&wÙˆ&w Òÿÿÿäê°' ¯ðÿç Òÿÿÿäê°& Ò ` j9™ÿÿÿäê°' Àÿ Òÿÿÿäê°/ Á³*= Òÿÿÿäê°& Òá<ÿÿ8_' lÿöŸ ZÿhÿÿBl& k Z Iÿÿ6|& lô ZYÊœ²+°3°/±+01!# #3Êž¶ºžM~þƒ›ÿÿÊœ «èœÀÿÿ=ÿÝ¿ ®üÊÀ=ÿ®¿í;°/±é² +³@ +° 2°/°Ö± é° ±+± é±+± °901%#".5332653¿M–\^˜M•ZS]Q’èLŽ``ŽLý÷PhgQ Hâ» (°/´ +´ +° /° Ö± é± é± +012#"&546” .," ,0»/ !-/2ÿÿ;ÿò·'yÿûä'yÿûÿIyÿû—ÿÿjÅ€@'yu'yÄy*ÿÿjÿó'yÃä'yv—y*ÿJÿÿiÿò'y)ä'yÃÿIyv—b~Ù2²+²+´+°/°Ö´ +² +³@ +±+01!##b¿]Ù]ý„JfÙ2²+²+´+°/°Ö´ +² +³@ +±+01##5f]¿Ùý'|]ÿÿb~Ù µÈÙÀÿÿJfÙ ´ÈÙÀ'V x(°/± é² +³@ +°/°Ö´+±+01!# þwxxª";”XV °/±é° /±+01%"05>32&K·Y9€UV€9YíYW9229WYÿÿ;ŽXP ¹“äÀÿÿÿ:Nê ¼g$Àÿ:Xê&²+°/°Ö°2´ +±+±°9013#YææYâêþ(þ(Ø êÈN²+´ +°2²+´+²+´ +°2°/°Ö´ +°±+´ +± +01%3!53!”Vþ X2ÈÈÈpÿæè ²+²+° /± +±± 9901#6ÏÏWÏÏs žžèþþþŒþäÿÔH L°/´ +°/´ +°/° Ö´ +°± +´ +±+± ±99±± 99012#"&5464&#"326¯½Üß¼»Þâ ¸˜—½»˜—ºã·±é믵åþfž·¾•–Á½ÿÔG #)/5;EPW]ciouP².+°d3°O Ö´I +°I°Y Ö°93´X +°:2°D/´? +°4 Ö°Q3´3 +°S2°v/° Ö°2´  +°2° ° Ö´ +°/°3´ +°2° ±=+°K2´A +°G2°A±+°2´ +°2° Ö° 3´ +° 2±w+± ±t99° ±p99°=@$'03e/>ýD> E ý> E üàED2DEü×E =E =ý >/›=."ýÆ/-Í/*2—^à N°/´ +°/´  +°/°Ö´ +°± +´ +±+± ± 99±²99901"32654'2#"&46æ<,,+J?WY=>XXx- +* !vX@=WX|X ÿ7ò Z²+´ +°/´ +°/° Ö´ +°± +´ +±+± ¶$9±¶  $901  .64."26x憇çþò憇nÂìÃooÂì†çþò熆ççþìÂooÂìÂoo ÿ8Š€›ÿ°œ/°8Ö´@+°@±W+´“ +°“±.+´( +°(±!+°š2±é°ƒ2³!+´# +°#/°H3´ +°y2²# +³@ +°±+´  +° ±‰+´l +°l±|+´+±+±@8°69±“W²53<999±(.@ &2OPR]^Ž˜$9°!°09±#²ab999°°x9°° 9° @ egrs…$9±l‰²999±|°901'#"&547&'#".5475#"&547&'4/&54>75.'67.54>7'>7$54&'&>54.'654°lnMQ'}p- # &p|(QM*eK)-%=/E  3:%&1% .4$!9/ 3;&)4% '.•%!-;)#Ø!()#"f‹Uhrn;0c (?* ;)< ?( c0;ooj6`S,U++R==&) (  7S/'G0*+/*2 !6T1)I1(*  (’Ð.SxC(iD3#<('<#"<'Q:Mÿìc0,²+´ +°2°1/°Ö´! +´! +±2+01%!527>7#"&54>7#"' =ý÷- % -6=W'0:797791(W=6- %99 (!V=(:*'7FuKJuE7'*<(=V! ÿ §Ô6T²+° 3´ +°,2² +³@2 +°7/°Ö´ +°±*+´  +±8+±°9°*³ $9014632>32.7">54#"#".aF4XX4Ec-9A<:==A8,§(2?Q\EA=%X#1!4+Ha9229`C-REFT^‡NQŒ`VDAJˆ:,$la},)^NQV(X++/8/ÿÈKì.'>7'67.K#P…+2wY`y),·ä8€|7#"&54632&5462632#"'Šýô$49'U)Ig^D i’i D^gIYC&?B%99$9$#*kKIh!HeeH hIKkP.A'ÿìcNˆ² +´! +°2² +´ +°,/°B3´ +° 2°O/°/Ö´ +°± +´? +±P+±/± $99° ·*,37BD$9°?²<999±!°$9°,°9°±*D9901%3&32654.'326!527>7#"&54>7#"' <C$/&4 49<=834&Jý÷- % -6=W'0:797791(W=6- h" )0,4% 5+-H+,I,+4 %4Nö99 (!V=(:*'7FuKJuE7'*<(=V! ÿŸ§Ô%²+°3°/°Ö´ +´ +±+012.54632>ÿEc-9A<9==A7-aFm8XÔ`C.QDFT^ˆNSŽ`UB@J)Ham76ÿÈKì .'>7KX¤'+ˆm`y),·ZdáLRº…t¢C9XõÿìùÕ+0AMYû²+´ +°2²+´. +²+´Q+´ : +°E3´  +°%2´4 +°K3´ +°2°Z/°Ö´7 +°7±+´T +°T±N+´ +°±H+´" +±[+±7´ 4:$9°T°9°N@  ,'.1@BQX$9°°9°H´%EK$9± .°,9°:± '99°4¶"17@BH$9°²X999°Q³NT$901%!5>7#"&54632&5462632#"''3&.#"32>76732654&#"74&#"6Šýô$49'U)Ig^D i’i D^gIYC&?BØC;%Z$48 * V ] <2f6,,5 /'b%99$9$#*kKIh!HeeH hIKkP.A';")4,/; %AC;.+8*©9: ;F&¶ L²+´ +° /°Ö´ +°´  +° /°´ +°/±+± °9±° 901%#"&46323L4-BB-3"+S%..J.-7¶X²+´ +°/° Ö´ +° 2°´ +°/°±+´ +± +± °9±°9± ° 901#"&46323#54.'.&L4-BB-6 *1P)*1E Óþ€%..J.-7&%{U88 &/ 7¸Ùв+´ +³+´ +² +°/° Ö´ +°´ +°/°±+´ +°´ +°/±+± °9±°9±±99± ± 99° ²99901#"&54632#"&46324O91DF/:#¯O6/EE/9"Qþ())(&-Æ•þ&--L-K7¸Ù“²+´ +³+´ +²+°/°Ö´ +°2°´ +° /°±+°2´ +°´ +°/± +± °9±°9±±99±² 999°³$9015%#"&54632#"&46325Žþ¦N:1DF/:#¯O6/EE/9"”?~Eyµ())(&-Æ•þ&--L-Ž`ÿÜÉÚ!a² +°/´ +°/´.+°"/°Ö´ +° 2°±+± é±#+±°9°°9±± 99°° 9° °901#"577>324&#"32>ÉIhk&'D  V_”&B >3*E‚T30 þ \TO5=þÙ G€‚ÿ*È M²+²+²+° /°Ö´  +°2° ±+°2´ +± +±´ $9°°9015775D×D×D“Ê ÍY þþWþpèEèVÿ;ÌúT° /°Ö± 22´ +±22² +³@ +° 2°±+±22´ +±22² +³@ +°2±!+01%555755757757775Ì>F€F,,,,F€F>>>„€J •-Ÿ›–ê– ¾¹2¾²™å4æ-ê ÿ8ÿ.5H¢Äæ,Ei¨׺^+²ˆ+²+²6+°c3´Ñv+°Ñ°í Ö´v+°a2°‹/¼Pš+´’ˆ6 +´’v+°#2¼X!ˆ6 +¸'3¼X+¼-È+¼Å<ˆ6 +¸F3¼Å+°Å»=Ń+¼”=+ºƒ” +»@ƒˆ +¼r~ˆ6 +¼r[+°ã Ö´Ö_+±Û6 À/°3´Ýú+±f6 À/´Ío+°/´Id+¸©/°ŽÖ°˜2¼N +¸N± +´  +° ±+´± +»±+´÷ +°÷/¼ +°±¹h+¼ +¸¹Ÿ+¼€ +¸€±»+°Á2´¦ +´£ +°¦¹x+¸2±­+° 2´A +»*A­+¼< +º*< +»@* +°A¹ +´ã +°ã±<+´[ +¸B2´^ +°[±É+´j +¹ª+°6ºú`À?+ °}°{À¹4$ù¸6ÀºÁËðö+ ¸9¹46¸6À±x%ù°zÀºÁô@+ ³yxz+ºùšÀR+ °}³|}{+¸4»546+º546 Š Š#9²|}{9²yxz Š Š#9A z{56xy|}9.........A z{56xy|}9.........°@¹N޲Œíý999° ²’999° ´ž¢ü$9°÷A  OòûIKP^`$9¸ºçab999°±½PQ\d$9¸hºôe999¸¸f9¸ŸA ‡ˆé¶êZ¤$9¸€¼!Xj%¦$9°»¼'op–™$9°¦½S¯¿Ã‚$9°£¹¨r99¸xA+-‚#$'02UVtƒ„’”$9°­¿€ªÓ -ˆŠ$9¸*»?Vå?$9°A±C~99¹ã<¹ÕD99°<´GXÅà/$9°^º>YA999±É[@ 154cfqwÏÙÝß$9°j±h399¹P‹°Š9¸^½% ~‡ŽN$9°’½8ABK\a$9°¸b9¸XA 12w”•Dd$9¸-»tIZe$9¸!¹3299¸”A $*=?Vfh’–$9¸<¼4/œ$9°Å°ò9¸ƒ»ô™$9°ãAq˜5å÷û xz€ŠŸ¤$9¸~°ç9°Ö»àj§$9¸r¸v9°ÝAšªÓÔÙ¶ßéêü opt$9°Û²jÉï999°Í²C¨¹999°í±»¦99±Ñ° 9±6@ Á9901&547.#>7&'32.'>?/4&54654'>32%267>7632327#"&'&/.'&547#"&'>7&'>;&5477654'4?&54?&5472>54'#"&'#"32?632+%>7.#"327'&5465.'&'6324654.'&#"3263232654&"#"'.'&'&'&'32?6=#"'>7>7&5472>7327"&+"27>32&#"54#"+654.'>7v60F\<+/I >0 š%$ =  *Š@i/CCC 2 ýÝ  'YT w` .)*DAcE‚ O(X6A($s Q.g-OM 6$" zt  $ Å tg Q ž<$ -.S+"-I$& ),þÁ8yZX&´O#$^&0 (E,! . %3 4(  kfd  :S” a#*ã$] aL-=5#,&; C  >    á4  B! þo  G+ˆ4,<0 9'2//@ Oý 7?C — {&q* $ F &&& ,/N ’>d& Y !o+4V Fm#%0#(EE 7@ l}E '! 03 $ þn5e5 m"!< "7)`  (@'M‰ ?  )W& ,, 1"'%llf JA/T‰8.:S0$Da* @$4fU< >  „  0)      ÿÿ ÿ7ò' ¯cÿÍ Â ÿ7ò ²+°3´ +°/´ +°2°/° 3± é°2° /° Ö´ +°2°±+°2´+°2°± +°2´ +±!+±±99± ±99±± 99±± 9901  .6!>!!%!.x憇çþò憇þšÅþ5þ—ÇÙiÆÌfĆçþò熆ççþYþ–ÇÚjÈÏeÅ×þ›ŽÄ ÿ9ð!!'a²&+´ +° /´ +°(/° Ö´  +° ±+´ +±)+± @  "$$9±&·#$9012".4>65432%'7&#"™Æ¹‡QQ†¹Æ¹†QP‡lýW«ÿÿsŒþ ÿýX­üýr‹‹!Q‡¹Æ¹‡QQ‡¸Ç¸ˆ£ýÿr‹þ!ÿY®ÿüsŒ‹ÞüýV$ÿö<\²+± é°/± é°/°Ö´ +° ± +´+±+± ±99± ±99± ±99±±99012"&4264&"vtRRtRoRtRRt/8ÿð0è =²+± é²+± é´ +± é°/±+±±99± ±990166  !."!268Þ<ÞÞþÄ_ú޶Žæþ޶ŽÎ<ÞÞþÄÞ¸WqqÏWqq8ÿð0è Q²+²+´  +°3± é°2°/°Ö°2´+° 2±+±³$9± ³ $90166  373.>7#5#8Þ<ÞÞþÄbGiÁxÁiGGiÁxÁiÎ<ÞÞþÄÞyiGÁÁGiþiGÁÁGiHˆØ *²+°3²+± é° /± +± ³ $901!#'#7# Ø@ØØ‘‘ J”llþ”þ”ôôä|HˆØ *²+± é²+°3° /± +± ³ $901!3733°ØýÀØØ‘‘þàJ”lþ”llôôþ|HˆØ +²+± é²+± é° /± +± ³ $901!!37#°ØýÀØØ@þàJ”JJ”lþ”llþ|l|0hâ [²+²+²+° 3´ +°2°/° Ö´ +°±+´+°±+´ +±+± ³ $901!#3$2"&4$2"&4ˆxxþßN77N7³N77N7Ø 7N77N77N77N0ÀØ!²+°3²+°/±+±°901#3#xÈ€ €)ýרý(0ÀØ!²+²+°3°/±+±°901%3#3xÈ€þøþ÷€¯)ý(ØHˆØ F² +± é² +± é´ +± é° /° Ö´+°2² +³@ +±22± +01!!!!!ˆþ8Èþ8ÈýÀØx¸x¸xØHˆØ F²+± é² +± é´ +± é° /°Ö°2´ +² +³@ +±22± +0135!5!5!5!5!HÈþ8Èþ8@x¸x¸xý(6ÿöØ #¥²+± é²+± é´# +±# é´ +± é´  +± é°$/°Ö° 2´+° 2°±!+°2´+°2±%+±³ $9±!³$9±±99±#±99± ± 99±± 9901!!2"&4264&"2"&4264&"6èþºtRRtRo/tRRtRo£x­RtRRt/þ¥RtRRt/HrØm² +°3± é°2²+°3± é°2´   +± é°/° Ö´ +°2° ´ +° /°3° ±+°2´+´ +°2±+013#3###53#533ŠèppèZèppèZØxþx0þÐxèxþÐHžØ 3²+° 3²+± é° /°Ö´+± +±²99901#! £ã~öVþîÿV`þî"þÔØþ²þÊTHÿöâP² +´ +²+´ +´  +´ +°/°Ö°2´ +°2° ±+´ +±+012"&42"&42"&4N77N77N77N7;N77N7â7N77Nþ7N77NO7N77NHžØ 3²+± é² +°3° /°Ö´+± +± ²99901%!£ã~÷Vÿýªxþî4,TþÊþ²Ø8ÿð0è ]²+²+°/°Ö´ +° ±+´+°±+´+±+± ±99±±99±³ $901 &6 >4&RþÄÞÞ<ÞþHWqqÏWqqÞ<ÞÞþÄ_ú޶Žæþ޶Ž8ÿð0è#s²+± é²+± é²+°$/° Ö´"+°"±+´+±%+±" ° 9°µ$9°°9±° 9°µ $9°±9901%2654''7&546327#"'&#"´l˜&þ™?•.U.HÞžze.U.HÞžzdg?Jl˜h˜lJ?þ™&0.U.ezžÞH.U.ezžÞóg&˜lJHÿìðì[² +´ +²+´ +´  +´ +°/´ +° /°Ö²222´ $+²222´ $+±!+012"&42"&462"&462"&4zD22D22D22D22D22D22D22D2ì2D22DýÚ2D22Dú2D22Dú2D22DHˆØ!²+°3²+°/± +±°901%#3#h‘±ØØôôØþ”þ”<|Ø M²+°3²+´  +°3± é° /°Ö´+°±+´+°± +´+± +013#333#!´xäxäxþ°¨0þÐþX0HˆØ<² +° 3²+±33°/°Ö´+±+±° 9± ² 9990135373#'#HUxUØØ‘‘ØØþ”þ”ôôl4,P°/°3´ +°2° /°3´ +°2° /°Ö°2´ +° 2°±+°2´ +°2±!+0162"&42"&42"&42"&4kN77N77N77N7[N77N77N77N7è7N77Nc7N77Nõ7N77Nc7N77NHžØ @²+± é²+± é° /°Ö´+°2² +³@ +± +±± 99013!!#HVþ"ÞûãØýºx`þî6æÊM°/± 33´ +±22´ +°/°Ö´ +°±+´ +° ±+´ +±+012"&4$2"&4$2"&4mN77N71N77N71N77N7Ê7N77N77N77N77N77N:+Ø ²+² +° /±+01 %5-5% þÿ!)þ8þýÈ)þߢj^iq¤k^^i¤pi0pØ=²+± é°2²+°/°Ö´+² +³@ +² +³@ +± +01)5333pýÀäxäx`ý <ÿð<è k²+° 3± é°2²+°3± é°2°/° Ö´+²  +³@  +°2°±+´+² +³@ +°2±+± ³$9012#5264&#"&63"3<žÞÞžl˜˜lžÞÞžl˜˜lèÞþÄÞx˜Ø˜ý€Þ<Þx˜Ø˜6Ø޲ +°3²+°3´  +±33± é±22´  +±33± é±22° /° Ö± 22´+±22²  +³@ +°2°±+±22´+±22² +³@ +°2±!+01#3#5##5#535#53533533#3#ÏZZxxZxÇÇÇÇxZxÇÇÇÇ™ZþÁÇÇÇxZxÇÇÇÇxZx4ØØ D²+°3²+°3° /°Ö´+°2°± +°2´+± +±± 99013#3753#¬xx´xx´Øþ´½ý(q´HˆØ6²+± é²+± é°/°Ö´+² +³@ +°2± +017!!!!ÀÈýÀ@þ8xxØxZÒØ'²+²+°/°Ö´+´+±+013#3ÒxxØ6Øh²+² +´ +°3± é°2´  +°3± é°2°/°Ö± 22´+±22² +³@ +°2² +³@ +° 2±+01!#5!5!5!5!53!!þÐxþÐ0þÐ0x0þÐ?xÇÇxZxÇÇxZ8ÿ ôØ U²+²+° /´ +° /° Ö´ +´ +³ +´+°/´+± +±³ $9013#32"&4ÒxxcN77N7Øüð7N77N?ÿðØf²+± é² +± é°/°Ö´+°±+´+±+±± 99°³ $9°±99± ³$9° °901#"&54?!5!32654&'²ÝŸ‰ˆ “àþ–AþºEG`P]SNCÆ3¹i†j_‘xnÙ.N5'QG+1B 6ÿöNâš²+± é²+± é´ +± é´ +± é° /°Ö°2´ +°2° ± +°2´+°2±!+± ³$9± ³$9± ±99±±99±±99±±99012"&4264&"2"&4264&"ˆtRRtRo/tRRtRoRtRRt/CRtRRt/8ÿð0èP²+± é²+± é°/°Ö´ +° ± +´+±+± ³$9± ³$90166  264&"8Þ<ÞÞþÄf˜Ø˜˜ØÎ<ÞÞþÄÞèØ˜˜Ø˜8ÿð0èa²+²+± é²+± é° /°Ö´+°±+´ +±!+±²999° °9±±99°² 99901%#"&54632/7654&#"32“ez Üá› ÜH=U“³T³'–ni›–nI8Há› Üá›|c=U”³T³=Li›–ni›<|Ø M²+²+°3´  +± é°2° /°Ö´ +° ±+´+°± +´+± +013###3!xäxäxPØþXþÐ0¨þÐ<ÿöøâM² +´ +²+´ +´  +´ +°/°Ö±22´ +±22´ +±+012"&42"&42"&4sN77N77N77N77N77N7â7N77Nþ7N77NO7N77N8ÿöHâ'–² +°$3´ +° 2²+°3´ +°2´  +´ +°(/°Ö°2´ +°2³ +´ +° ±'+°2´# +°2±)+±³ $9±' ³$9±#³ %$9012"&42"&42"&42"&42"&4oN77N77N77N7áN77N7áN77N77N77N7â7N77Nþ7N77NO7N77NO7N77Nþ7N77N8ÿð0膲+± é²+± é´ +´ +°/°Ö´ +° ±+´ +°± +´+±+± ³ $9± ³ $9± ³ $9±³ $90166  264&"2"&48Þ<ÞÞþÄf˜Ø˜˜ØEN77N7Î<ÞÞþÄÞèØ˜˜Ø˜¦7N77N8ÿð0èa²+± é² +² +± é° /°Ö´+°±+´+±!+±² 999°° 9±²999° ± 9901#"&546327'7&#"32654'0Ü ›áÜ ze=U=Hþ®T³@In–›in–'l›áÜ ›áH=U=c¦T³'›in–›iL=8ÿð¶è /9©²+´ "+²+´8 "+²3+± é´ 3 +± é°:/°Ö´(+°(±-+°#2´+°02°±+°52´ +°2±;+±-³%+$9°± 99±°+9°± -99± ±(99±83±#99°°%901$3264&#"72#"&54632#"&547&5463264&#"  ?W7UQ% Üá›%QU7W?>V _†‚c V"  «xW>2I%á› Ü%I2>WW> ‘ea– >W6rØ M²+²+´ +°3± é° 2° /°Ö°2´+°2² +³@ +² +³@ +± +01!##5333#xbbxbb0x0þÐxHˆØ &² +°3²+°3° /± +± ±9901373#'#H‘‘ØØ‘‘ØØôôþ”þ”ôôl8ÿð¶è :DÞ²+´> "+²+´ "+²+± é³( +°,3±3 é°.2²3( +³@31 +²(3 +³@(* +´C  +±C é°E/°1Ö°)2´0+°+2²01 +³@0. +°0±8+°#2´<+°2°<±A+°2´ +°2±F+±<8³%6$9°A± 99±>°69°C±8 99± °9±±#99°°%9013264&#"2#"&54632#"&5473533##5#&5463264&#"  ?W7UQ% Üá›%QU7W?>V P|KxMMxKyR V"  CþàW>2I%á› Ü%I2>WW> lPDDxDDNn >WŠHˆØ²+± é²+± é´ +°3± é° 2² +³@ +² +³@ +°/°Ö´+°2² +³@ +°2°± +°2´ +°2² +³@ +±+01!3533##5#!!ˆþ8|xppx|ÈýÀØx¸bbxbb¸xØ0•Ø"²+± é²+°/±+±°901!!b‡]ý›ìþŒ`ý(ØHˆØ5²+± é²+°3°/°Ö´+°±+´+± +017!3!3ÀPxýÀxx`ý(Øÿéô²+°/± +01 '%ŸEþîþaEÑ#cÀÅþÝcÀ6Ø;’²+±433²+±$33´  +°.3± é°;2´ +°-3± é°2°75.5353>53#4.'Ûxµx -=a;Qx;"x#I3x2H#x .<`;Qw:"x"I2¨”!908) —8AU23%$¨¨$&2 818*!˜8AU22$"H˜Ø(²+²+°/°Ö´+±+±°9013#3#'ÀxdìIØþ”q6ØF½²>+±-533² +±33´7E> +°%3±7 é°42´> +°!3± é°#2´> +° 3± é°2°G/°>Ö° 2´=+° 2°=±6+²E222´5+² $222²56 +³@5# +²65 +³@6 +°5±.+°2´-+°2±H+±E7±&D99±±99015!5.5353>53!!#4.'#5#4>75QQx;"x#I3x1H"x";wQþð;_<. x"I2x1H#x)>kE0x8AU23%#¨¨#&12V@8x!)808!2%#§¨"&1 'E::'H¼šØF²+°3´ +²+´ +°± é°/°Ö´+°±+´+± +01353!3Àbxþ®x4¤þäÿÿ(ÿË™'y¹u'y¹ÿ"!J(v"¿8°/´ +°/°Ö°2´ +°2± +±°9±±9901575"úúú#TXTóTXTÿÿÿéJÑhiÑÀÿÿ Ï?=&jÿVÿÿŽß &azPÿÿÿŽßõ&ay„Ñÿÿÿôß:&ayzÿKÿÿÿ8ÚÙ' « ìÿÿÿ8ÜÙ' ¿ ÿÿp*'y´'yÿÝ'y´ÿZyÿÝÿZÿÿ;[Û‡@@Àÿÿ)[ɇ*îÀ@ÿÿƒ['yÍL'yÍ7'yÍÿ\'yÇLyÕL@,è#~²#+´ #+²+± é² +³@ +°$/°Ö± é° ±#+±" é³"#+´+°/´+°"±+±é±%+± °9±² 999± ±9901#=4&#"#4&'.546323#,ˆ?/-<#22#|-F2‹n!;D1!þÀ––á :LB1!4(.K21& 1R?f€ "7bþp’ÿÿ ÿÆI\fýgÿÿ–Îÿÿ24$›F  @</ư/°Ö±é±é±+01#5Æ*8(‚þ¯Q‚<ÎÆ.°/´ +°/°Ö±é±é³+´ +±+01#'5Æ*8(‚²²‚(dÙr² +°3²+°3´ +´  +±é°/°Ö±é² +³@ +°± +± é°2° ±+°2± é±+± °9°°9° ±9901!3#!##"3"&5463­ —–þß–$K"`WofÙþïý'KþµCA'‚rZdmKÙ#ƒ²+°3²+°3±é°2´  +±33´ +±22°$/°Ö° 2±é°2² +³@ +°±+°2±é°"2² +³@ +±%+±°9°°9°°901#####535432&#"35432&#"KSŒ†ŒLLŠ)'&†Š)'&]þL´þL´]A‡i*5A‡i*5ùÙt² +°3²+°3±é²+±é´  +°3´ +°2°/° Ö°2± é°2² +³@ +° ±+°2±é°2±+± °9°°901#5####535432&#"ùŒŒŒ‡ŒLLŠ)'&Ù}}Èýï´þL´]A‡i*5Ùh²+°3² +°3±é´  +°3´ +°2°/°Ö° 2±é°2² +³@ +°±+°2±é±+±° 9°°901####535432&#"35Œ¢ŒLLŠ)'&¢Ùý'´þL´]A‡i*5È Ù)œ²+± 33²+±!33±é°$2²+±é´ +± 33´+±22°*/°Ö°2± é°2² +³@ +° ± +°2± é°(2° ±+°2±é°2±++± °9° °9° °!9°°#901#5######535432&#"35432&#" ŒŒŒ†Œ†ŒLLŠ)'&†Š)'&Ù}}Èýï´þL´þL´]A‡i*5A‡i*5 Ù'² +±33²+±33±é°"2´  +± 33´+±22°(/° Ö°2± é°2² +³@  +° ±+°2±é°&2°±+°2±é±)+± °9°°9°°9°°!90153######535432&#"35432&#"~ŒŒ†Œ†ŒLLŠ)'&†Š)'&Èý'´þL´þL´]A‡i*5A‡i*5ÿÿÿéZÙ'W&AAÿé•Ù?Dz+°63²+°:3± é°02²  +³@ +²%+´&+²+±,433±é°>2°@/°Ö°2± é´+° ±+°2±é°%2² +³@! +°±=+±.é°.±7+°32±6é±A+± ±99°±),99±7.°:9± ±899±&²999°%°!901!#5#"&=3326=#"5473;./&546;"!32653#5#"&5#$Œ:hV_ŒZ3>Їi*·.'&¿(0)Z3>ŒŒ:hV_Ž@WbY±”a:0å‰ '&-] * þ¥a:0Rýä@WbY Aÿé˜Ù7¸²+°(3²+°,3± é°"2²+´0+²+°3´+²5+°8/°Ö± é° ±+°2±é² +³@ +°±/+± é°2° ±)+°%2±(é°2±9+± °9°°29±) °,9± ±*99°±&'99±0°9°°901!#5#"&5332654./&5463!!!326=3#5#"&5$Œ:hV_ŒZ3> $.'&ÜWþ©Z3>ŒŒ:hV_Ö@WbYxþ¥a:04 -½]þa:0:þü@WbYØ &Aÿ8Ù5´²+°$3²+± é²+´.+²+²+±( é²( +³@(- +²3+°6/°Ö± é° ±+°2±é² +³@ +°±-+±,é°2°,±%+±$é±7+± °9°°09±%,°9± °9±(°9±.°9°°901!#5#"&5332654./&5463!632#4#"#$Œ:hV_ŒZ3> $.'&Ý:d 97 ŒV/=Œ×@WbYxþ¥a:04 -þõW'N5þ–Jd<.ýôD &Aÿ8•Ù.6¹²+²"+°3±* é° 2²*" +³@*' +²+±1é²6+±33±é°2°/´+°7/°%Ö°2±(é´4+°(±+±-/22±é°2² +³@ +°±+± é° ±+°2±é±8+±(°"9± °9±*± 99±16°901"&5463!!32653#5#"&5#3##"&=3326=#"3È;LQ6\Z3>ŒŒ:hV_ŽNÚ:hV_ŒZ3>Ä*´O@CS½þ¥a:0Rýä@WbYýá]WbYгa:0êhU'Aÿ8gÙ9Ų+°&3²+°*3± é° 2² +³@1 +²+´2+²+±$33´/+²7+°:/°Ö± é° ±+°2±é² +³@ +°±1+±0é°2°0±-+±é°±'+°#2±&é±;+± °9°°49±'°*9± ±(99±2°9°°901!#5#"&5332654./&5463!332653#5#"&5##"$Œ:hV_ŒZ3> $.'&ÑÚZ3>ŒŒ:hV_NŒË@WbYxþ¥a:04 -½þ¥a:0Rýä@WbYýyD &ÿÿIˆÔX'®ÿ5Ç”2-+° /±é² +³@ +°2°/°Ö´ +±+01273#"&'3™0d;#@Qdø55OJÿÿIŠÖX&Û±ÿÛVCX^²+± é± 22² +³@ +±22°/° Ö±é±+°6ºÁ–ñØ+ °.° .°± ù° ±ù³ ....°@01%+533>53CšYö{nŽm@‹à]ƒsåþ;1qþ=„X9²+°3° /°Ö± é° ±+±é±!+± °9°³$901##5>7'3>=3g"…ÄÈþš-  ‹ .¿Ão;2‹±¹A·Q$ #.”ž 63"-³þª8M5œ?0X8²+°/°3± é°/°Ö±é² +³@ +² +³@ +± +01!5!##RýíñS‹åssþO^X@²+°3° /± é°/°Ö° 2±é°±+±é±+±°9± °901.'!5!#!3Ó  þ  4‹ý|‹m sP&5%þŠ]þ£LX&1²+± é° /± é°'/°&Ö±é²& +³@& +°2±(+01. '!5!#!5!>7… !þL¿¡3Y-?+þA´&m sP'5$”‹+s >MîR² +°/± é² +³@ +°/°Ö±é°± +±é°±+±é±+±±99± °901#54>76=!3!M@[[?‹ )-'Dý|‹„œ2H)'=*ek*%  /B –P_X .²+± é°/± é°/°Ö±é°±+±é±+012!.'!!T>c8% üñ„.#þ‡ùX'7D3þXç"2 þŽ? X*²+° /± é°/°Ö±é² +³@ +±+01.'!5!#  þCÉ 4‹m sP&5%þŠ>§X(L²+°'3± é°/°3± é°)/°Ö±é°±(+±'é±*+±° 9±°9°± 9901.'!#'532=#5!# &+þ±  UA WB( 10&‹n&" ÿ2* ,tvüs#)9"þŠ2¬ÙA°/± é°2² +³@ +°/°Ö´+² +³@ +² +³@ +± +01!5353þ¶w#ww¶¶ÿÿLþÑ&׺ÿÿLþÑ&×»ÿÿLþÑ&×&ºµÔÿÿÿLþÑ'µÔÿ&×»ÿÿ=ÿrŠX&¾±;ÿÿ=ÿŠX&¾²,ÿÿ=ÿ”ŠX&¾µ&þ‘ÿÿMbX&µõ¿ÿÿ/÷X&µµÀÿÿ?6X&µ£ÁÿÿOdX&µ1Âÿÿ X'µÿÃ3ÿÿsX'µÿÄÿÿLaX&µ5Æÿÿ)X'µÿ'@ÇFÿÿ>ÿ8X&µ«ÈÿÿLX&µÛÉÿÿ>Sî&µÍHÊÿÿCyX&µCÌÿÿIgX'µÿHÎÿÿLaX&µ/ÏÿÿHÿ8NY&µMEÑÿÿOUX&µZFÒÿÿ=^X'µÿtÿÀÔÿÿPÿ8WX&µ)Õÿÿ?X&ÖµÌÿÿLþX&×µÔÿžÿÿ>­X'µ‘ØÿÿOÚæ&ónÿÿMbæ&¿¸0ÿÿLæ&¸ÉÿÿOUæ&¸8ÒSŠî-²+°/°Ö±é°± +±é±+± ±9901#53>753m_˜£þl‹Ë ‹±›BÔ9µ–þã*"œÿÿ.ÿþÛ®/-7T/%:ÏÂ2!²ÂÿÁr  $;°/´ .+²  +³@  +°%/°Ö´ #+±&+±¶ !#$901346323467>54&#"#3 m/)$0((c$8(oX/6'xxAþP°¯·3A5'+"&A*((A3Qg -NþÀuu°¯þQþmþ»ÿëÿì%²+°/´ +°/±´  $901#"&'#"&54>3267n ~ s /-(0*)/ 6>]U(+4*%2 pþGþ}ÿ€ÿìv²+±é°´ +° /´ +°/´ +°/°Ö´ +°±+´ +° 2±² 999°²999±± 99°°9°°901;#327#".'.546;53#"þ“$Á~ 7# B*6 .0LÇ&©C?L#*. %B8|þ-þ‘ÿŒÿçB²+° /´*+°/°Ö´ +² +³ +°±+´ +±°901#"&'4326753t˜<€ e4S1 ]Þ‘g=S  : >»ÿùh² +°/±é°/± é°/° 3± é°/°Ö´+² +³@ +°±+° 2´ +²  +³@ +±+±°9°°901726=35!5!####".'7À ÔþV–|pf X ( q!´œpqýðj$P hGþ&þ„ÿˆÿêq²+²+°3´  +²  +³@ +°/´ +°/°Ö´ +² +³@ +°±+°2´ +±² 999°°9± °901".'#"5462353'32=û/;! .EBNIŒ)(6þ„55/$76753#"þ(8P;.” T9)UN!7,"Yþ·.54&#"#"54323273þâLti#%)D. :>L @QCUþw>,&,0' g;1(K4=þ&þ}ÿ‹ÿë"|²+´ +°/° 3´ +° 2°#/° Ö´ +² +³@ +°±+´ +°± +´ +²  +³@ +±±99±± 99°±990153#5654&"3"&546þ¯T>JD>4CDA   =FVhSSU/?QH3-+  HS=8Mþsþ¨ÿ‡ÿà:°/´  +²  +³  +°/°Ö´ +² +³ +±°90147332>32#".þs 3+%  ?153‚7+- 0E, ' " 7M-Xþþ»ÿ»ÿà °/´ +°/° Ö´ +01#"&'3¹0 +µ.5¥ 2¥€.þhþXÿñÿñ5²+°/´ +° /´ +° /± °9°´ $901#"&'#"&546326735!˜*T t 1,/)7, /a  âiwOT'-="#C A' þÊDDþ-þLÿ­ÿñ^²+°/´ +° /´,+°/°Ö´ +² +³ +°±+´ +±±99°°9± ±9901#"&'43267535!s—<€ e4R0 `þ·i£‘f>R  : ?‹þ[DDþWþXÿÁÿúQ²+°/´ +° /´ +² +³ +°/°Ö´ +² +³ +±°9±°90132>32#"&54735!þÀ3" "4.;T .ij8]M012I]m/*þpDDþˆþXÿñÿâ°/´ +°/01#"&'&'35!¹0 !v5'5Ui‹")K;,>%þ›DDþhþ5ÿæÿþ"&?²+°#/´$%+°/´ &+°/´ +°'/± °9°´ $901#"&'#"&54632675!5!s  &5 s 4%0(03"-¨Lþ°L' H)4> "þÀ55‰66þ-þ4ÿ»k²+°/´*+°/´)+° /´*+°/°Ö´ +² +³ +°±+´ +±³$9°°9± ±9901#"&'43267535!5!s—:‚ e4M!0 `þ¶xþ„xh›c-S  + ?nþ©11u00ÂÀf (°/´ +´ +° /°Ö± é± é± +01"&4632n"00"$..Â0D01B1ÿñþ•ɾ,6@[²&+°3²<+°@3°9/±>é´/4<& +±/é°/°3± é°Y/°I3°P/´D+°\/°Ö´!+²! +³@ +°!±A+´R +²RA +³RU +°R±+´ +° ±M+°2´F +²MF +³MK +°F±+´ +²  +³@  +±]+±!³12;<$9±R²%&C999° ¶/49>OP$9°M°D9± ³-67@$9±>9±7;99±4/±-199°&±2699°°9±PY±FA990174675!5!!5>54&#".#"'5327#"'5327462#"4654&"#"&99°@± 99°U±9±R³$*38$901#"'53273254&#"' 76?&#"%2>32".5432#".=#53>32;+tha]]f]c]þk`ZiH+)‘2F ·¿Ì+5  30603 ´-b^u`$AJ?:)LM ©Ž‹£Gêê¸((r)'hWaE)OñO:832#".54632#".=#53>32;!!#Dia\]c_d]m]Z_f\e\þ‹ 1N2hG+)‘2 F ·¾Ý+5  ,'13 «)e]u_4[eG/KL ¨Ž‹£C ÿ þ¶((l('E''m)(N%6= E)OñGB8=p««-6-+#&;! C0!++>ÿuBH^SfCm¿~p—“…pÿ÷ÿùf´ -Rݲ7+± é° /°3±é°/±.933±P é°;2°*/´+°M/±Bé´"+°2°S/°9Ö°<2´+²9 +³@9: +°9´P+°±+´4+°H2²4 +³@4R +°4±+´ +°± +±T+±P³7M$9°4±199°°.9± ±)*99± °19±M°9°"´ %H$90132654&#"'326767!432327632".# #53>3#.#"!Ø3O-;2]4„#nMc,5 þnp,;` 30613mK8^w]þ•UX/DvK`'7#C@Y a\"}4@*,1Bk)2=€M*/7f*,"/C Cþì+j#E^Shp@]F2&Yspÿÿÿöÿ¼æ'‹ÃhjÿÿÿòÿÄ)&m‹ñpÿÿÿðÿ³Ô'‹Ì_nÿÿÿòÿÛè'‹Ç‡oÿÿÿöÿÄ'‹ÃIpÿÿÿ÷ÿ½¯'‹ÒirÿÿÿøÿóÀ'‹Ô§sÿÿÿôÿÿ'‹Ëotÿÿÿòÿ¼Ú'‹ÄhuÿÿÿõÿêÊ'‹Õ–wÿÿÿ÷ÿÀè'‹ÀlxÿÿÿøÿµÁ‚'‹ËayÿÿÿøÿãÄ‚'‹ÄzÿÿÿöÿÛÊ'‹Å‡{ÿÿÿóÿö«'‹Í¢|ÿÿÿöÿ±¯'‹È]}ÿÿÿ÷ÿõ¹'‹Ä¡~ÿÿÿúÿΤ'‹Äz€ÿÿÿúÿž¢'‹ÆJÿÿÿ÷Í'‹ÐÜ‚ÿÿÿóÿË'‹Òwƒÿÿÿøÿç°'‹Î“„ÿÿÿ÷ÿø§'‹È©‡ÿÿÿòÔˆÿÿÿôÿ¾Ÿ'‹ÊjŠÿÿÿ÷ÿô•'‹V `ÿ÷ÿò” N²F+²+± é°'/±=A33±( é°92²'( +³@'@ +°O/°Ö± +´J +°J°6 Ö´+°/´6+°J±F+°82´E+°E±@+´?+²?@ +³@?= +±P+± ´ $.$9°²2M999°J°K9±F³ KM$9°'´ .68G$9°(°290162#"&5474>54'#"54>7654+532>7675;!##+##"À$-"¹%+%#eM .-R /F\-A -2U,0,7BŽaÿ„p aqY6(/Vr" -"':*:GC@h_;E  +(pP"0,,62I^!ÊpþéýïI.44A8ÿÑÿ“°¥ GL²=+².+±"é²". +³"' +°=° Ö± é²+² +°/±Jé°J± é°?/²8H333±@ é°2°/±Dé²D +³@G +°M/°=Ö°A2´<+°2²=< +³@=? +°<± +´+°± +´G+°G±K+´+°)2²K +³@ +±N+±<=°B9± ³48D$9° ± 99°G±6H99°K²."999°°%9±"±499±J°6901$2#"&54.#";!#&#"32>32#".'67&'+##53>32375$-"$>?'cˆ|–;^> $‰I"9 'J//±é°±< é°!/² 48333±" é°22°(/±/é²(/ +³@(, +°M/° Ö´+°±+´<+°2³+<+´,+°,/´++°<±7+°%2´6+°22²67 +³@64 +²76 +³@7! +±N+± ± 99°,´ CF$9°°>9±<+°I9°7±(/99°6°19±°90162#"&54375#".'67&'#5!;.#"#46323##+&#"32>321$-"Ï-kl'J/?"m^ygl‚‚oW%—;^> $‰I"9 4" -"üxuþ{ -4%(P5^G5spbY0Lov„ pýïæ&#Cÿÿÿ÷ÿ#™'ü&©‹Í~ÿÿÿ÷þ™™'ñ&©‹Î~ÿÿÿøÿÂãž'‘ãÿý&¨‹Înÿÿÿ÷ÿö•Í'’€&`‹\¢ÿÿÿ÷ÿì´'‹Ç˜hÿÿÿ÷ÿé•Ï'”R&`‹V•ÿ÷†fEO˲=+°/±3833± é°-2² +³@7 +°F/´K +°P/°Ö±+´A +°A°* Ö´+°/´*+°A±=+°,2´<+°<±7+´6+²67 +³@63 +°7³7I+±N é±Q+±² "999°²&D999°A°B9±67±FK99±=²"*,999°°&901%4>54'#"54>7654+532>7675;+#+##""&4632L%+%#eM .-R /F\-A -2U,0,7B€^Á00Tp^qY6(/V"00"$..z:*:GC@h_;E  +(pP"0,,62I^!ÊpþéýïI.44A8ˆ0D00D0þGþLÿ·#²+±é°´ +²+´ +²+° /´! +° /´&+°$/°Ö´ +°±+´ +° 2±² !999°² 999°²999±° 9°°9°°901;#327#".'.546;53#"5!þ“$Á~4$ B-8$ .0LÇ&Fjx3267n ~ s /-(0*)/ 6>]U(+4*%2 pþÑ ÿLe$°/´ +´ +°/±+´+01462þÑ&0% ,,þðÿÿ`ÿÄ =°/´0+° /´ +° /°Ö°2´+´+°´  +° /0135>5#þðp*F&@<;38 *$ÿÿç#y­"y#y7"y#óóöýöRQÚu²+± é²+´ +² 222²+± é²+±é°2°/°Ö´  +² +³@ +° ± +´  +° ±+´ +² +³@ +015!##5##5##5ýö[\‹\\KK//==//Dÿ&•ÙV²+² +²+± é²+°3°/°Ö± é°± +°2± é±+± ±99°°9±±9901#"'5326=#3•;A$/ þÛ–š!ÙüÉB:p?øþÙþð( i²+±é²+´+´ +´+°/°Ö±é°2°±+±é° Ö± é±+± ° 9±°9°° 9°° 901%#!!2%3254#32654#agþï_\A$,þ´eOOeq*(Rœ<`]1I&Güy=<Ö‚!Gÿÿ(ÿé%F(@²+´+²+´+°/°Ö±é°± +±é±+±±9901332#'3254+(ò{{|ze[ss[‘ú’]±²(Ð S²+´+²+´+´  +´ +° /°Ö±é°2² +³@ +³@ +³@ +± +017!!!!3µþX›þòùéŒ]]z](¸ F²+²+´+´ +´+° /°Ö±é°2² +³@ +³@ +± +017#!!3µþýãéé]y]"ÿé&ƒ²+²+± é²+± é² +³@ +´ +´+° /°Ö±é°±+´ +² +³@ +±!+±³$9°±99± °9±±9901.#"32>7#53#'#"&54632‚)%=8=7 "RÙMEX}‰}Z€h)#^IX[0$]þÜ3¡‚z iU(ñ B²+° 3²+°3´ +´+° /°Ö±é°2°± +°2± é± +01%##3353#d®ŽŽ­ŽõõÊÊýä(µ!²+²+°/°Ö±é±é±+01#µýäÿé‰?²+± é² +³@  +²+°/°Ö±é°± +±é±+± °901".=33253Ì=9#-Žh%E/54$"?þqMW(& 0²+° 3²+°3° /°Ö±é°2± +±± 99017#373#'µÀ—×ñ’¬µµÙÙßþÃë(¥/²+´+²+°/°Ö±é² +³@ +±+013!¶ïþƒþ@](_ в+² 333²+±33° /°Ö±é°2°± +° 2±é±+°6ºÁ‡ò+ ° .°À±&ù°Àº>|ò*+ ° .° À±'ù±°À² ...´ .....°@01#33##µºb_¼ŽUp‡þyþS­ýä‡þy( H²+°3²+°3° /°Ö±é°±+± é± +±°9± °9±±9901!#33…ÏŽ‡Ìbþžþ¥[ýäÿÿ'ÿé=%Rÿ(ä H²+²+´+´  +´+°/°Ö±é° 2°±+±é±+± °9017#!2#'32654&+¶Ž Mb]GŠJ&0-)JÁÁ^INf]()&+"ÿØ8%V²+± é² +± é°/°Ö±é°±+± é±+±± 99° °9±²999°² 99901%'#"&632"327'7654&39:>U}ŽŽ|:Ñ9FF9-8+E<7&™ ™™‰sJn`š`*<)*6P_(ø%ƒ² +°3² +´!+´" +´+°&/° Ö±é°!2°±+±é°° Ö±é°/±é² +³@ +±'+±°9°°9± °9°"°9°!°901%4654&+#!2#&4&+326[!$k„7ND[Œ'(rr('] "ÖY8b$ .-. [*Œÿÿÿé%V÷ ¼=²+²+´+°2°/°Ö±é² +³@ +² +³@ +± +01##5!-Ž•²¿þA¿]](ÿèý7²+± é²+°3°/°Ö±é°± +±é±+± °901".533253.NF(0-]Ž*GN+P7nþ’-3`nþ’7P+ÿÿYüÿÿZÿÿ [ú ô0²+²+°3° /°Ö±é± +±°9±°901%#5373J³”e]”¼¼¼`ÚÚ ùj²+°3´ +²+´+°2´ +´+´  +´+°/°Ö°2± é°2² +³@  +³@ +³@  +±+01%##!!3#!!=#W¥(€Ãþúòòþ^2Tqq\z]Œ]Îòò(îQ² +² +´  +´ +´ +´+°/° Ö± é± 22° ±+±é±+±°9012+#33254&+?5I#YK”ŽŽTV*,TÄ65S`hXÿQ*'ÿÿÜ]ÿÿã8,#n²+± é²+± é°$/°Ö±é°±"+±é±%+±²999°"³$9°° 9±²999°³$9°² 99901'7&546327#"'"7&32654=&@5Ž|gB5&6>{nF´9F Ä!>É#88G"GIr…™3:";L€‚˜=Ž`M+#Ù"OÝ._L7(ÿé'"² +²+´+²+±é´" +´+°#/° Ö± é° ±+±é°° Ö±é°/±é² +³@ +±$+± ³$9±°9±"±99°°9°°9012654#"#4632#"'52654&#="b5)Ž`aŠ4 1å*1'Z99GR!83/þœ|L_MFT T$½[)#6. . z²+´+² +´+´ +° 3´ +°2°/°Ö° 2±é°2² +³@ +² +³@ +°±+±é±+±°9°°9°°90173254+3#'532+5#5Ó[ss[OOò{{|zò<]±²‰;;æ‘ú’ü; à P²+´+² +°/°Ö° 2±é° 2² +³@ +³@ +² +³@ +±+± ±99013!5573/[ïþƒ<<Ž“A<¹]¹(B'#Æ  /²+°3²+´ +´+° /± +±° 90133#'#73' º“½” ¤8n9ýämmÊÁ"ÿéU6 x²+± é²+± é²+°!/°Ö±é°±+± é° ° Ö´+°/´+±"+±±99°°9° ° 9±² 999°± 9901"32654&7#"&632654'3-9FF98GE 1{}ŽŽ|sE i)´`š`_LP_ Hr‚˜™ ™? ":(ÿè;˜N²+± é²+±33° /°Ö±é°± +±é³ +´+±!+± °9±°901".533253254'33.OE(0-]]j.(*GN+P7nþ’-3`n[ #<þ’7P+ÿÿ(µç& ¬yÌ*ÿé-Ú %ˆ²+± é²+±é² +± é²+²#+°&/°Ö±é°"2°´+°/² +³@ +°± +±é±'+±°9° ± 99±±99° ±$99°±"9901"32654'2#"&547.5463!#"6_hBA54BuuŒˆ|y†VZLú2.°]JM^^JKÔž€Ÿ–‡ˆS0$;Sj) ó„%°/± é°/°Ö´ +±+±°9013#ˆdP„x ó„%°/± é°/°Ö´ +±+±°901#7óœPd„xx E„(°/°3± é°/°Ö´ +±+±°9013#'#skgXHHV„x<< E„*°/± é°2°/°Ö´ +±+±±9901#'373ÙkgXHHV x<<ÿÿ ±„' ʾ Êÿÿ ³„' ÉÀ Éÿÿ(ÿéçç'µcGÿÿAˆç'µOÿÿÿéËç'µGWÿäê°N°/´ +°/´  +°/°Ö´ +°±+´ +±+±± 99±² 99901264&"4632#"&`«ò««òíÏ—˜ÎÈžÉÃò««ò«þÜ–ÐÎþÐÎÎÿÿ(ÿéÔ ÿÿTÅÚÿÿ( Ô ÿÿ(ÿéÔ ÿÿÅÿÿ(ÿéÅ ÿÿ(ÿéÔÿÿÅÿÿ(ÿéÔÿÿ(ÿèÔ ÿÿÿéÔ&y’zÿæ“z5=Û²+°&3°*/± é°/± é° /±833± é±é°>/°/Ö´+°3 Ö´:+°±6+´+°±+° 2´+² +³@ +² +³@ +±?+±3°19±6:µ(*$9°µ#&$9°²!"%999±*°%9°±"#99°³!/$9°²1999° ³ 3<$90123275#5!###"'>32&'#".547&5464#"6ÃEPH=e$Po>GK74(*(6"2c8 # 85!X4Va&!#$nP6.%ZppýâM3*+6P)H#8&G/JB3@=E‚$ÿöÿ¨Ñy5Œ² +°3°0/±é°° Ö±3é°/± é°/° 3± é°6/°.Ö´+°± +°2´ +² +³@ +² +³@ +³@  +±7+±.±99±3 ³ '+$9°0°.9014>3!5!5!##!327632'#"54>3232654"#"&+'" ŠýëÛUqþž"  = *2 80XU‚ ‹! (3; /Au‡&5ppýäwA2.>OF{V" * zÿöÿâÓyv² +°/°3± é°/° 3± é°/°Ö´+² +³@ +³@ +°± +°2´ +² +³@ +±+±°9° ±99± ±990147#5!5!5!###".’ tâýëÝWq°!*S3M]Zs@qqýäj) "…+YQ§ÿöÿíŠy>²+°/°3± é°/°Ö°2´+² +³@ +² +³@ +±+015!##5'%&''>325 ”XoþþDÿJ *$5 >$¯+I;qqýåÇ”Y”N  [H5;¥ÿíæy1=¼²+°3± é°/°3± é°2°±6é°>/°Ö´9+°9±2+´+°" Ö´+°±+°2´+² +³@ +² +³@ +±?+±9±%099°"³(6<$9±2±'99±´ $9±±%99°¶"$&9<$901463273267#5!##5#"&547'7''>7&74.#"6dN GcsH\ 6,  ÿìªy)v²+° /±"33± é°2°*/°Ö´%+°%±+° 2´+² +³@ +² +³@ +±++±%²999°³$9± ´ %($901463275#5!##5'7''67&7.#"6wY2>T9i&NPpþß>Ñ[–I6m0®  ýB:C9D4RÂppýãݘ]oHF\85. ÿí©y/;§²+°/±é°/°3± é°2°±0é°T8K +" %6MPq/*5B.CšI6m0Y3  yC9D33 j$&sppýä4!G0P8G\858B:h   ÿöÿØ¡y1o°/± é°//°3±0 é°2/°-Ö´+²- +³@ +²- +³@-/ +°±+´+±3+±-±!99°µ  $9±³'(+$901!632'654&#".'732=!5!¡þãCi*VX#"%?+" K":D,eZ+=(þâ« < ]B":8LM1 -- R!?[<‘,=; .mpÿöÿè y7Ÿ² +°+/± é°/°3± é°8/°Ö´+² +³@ +² +³@ +°±5+´.+°.±(+´+±9+±± 99±.5³2$9°(²"1999°°!9±+ ±!99°² 999°° 901.'732=!5!!3632'>74&#".547^%<0'#M_|qZ+=(þâþx`"%CgF^ ' //=5#)>,"ToŸ¡=; .bppey]ls= !!,!!@ f ^8 ÿöÿì[y(Ÿ²+° /± é°/°3±& é°2°&°( Ö°3± é°2° /°3± é°)/°#Ö´+°±+° 2´+°2² +³@ +°2² +³@ +±*+±² &999± °9°³ #$9±(°901&#"2675!5!#632&#"#5#"&5463288!$&3>þ£e™/87o69FvfK%:S+:-#þppc+}33þð• oEVhÿö•y4‘°/±/ é° /±é°/± é°$/°'3±% é°5/°"Ö´)+²)" +³@)' +± 122²") +³@"$ +°)±+´+±6+±±/99±/°29± ² ,1999°³ $9°²99901&#"3267#"&54>32 7326=#5!!327N#6%';!AICX'/# »þëX^ áŸþ±E2aNƒz#–€#u8OA$8  þ*‡5Dlpp„5:7Sr#=ÿöÉXyV°/°3± é² +³@ +°/° Ö´+² +³@ +°´ +°/² +³@ +±+± °901##"&54>;5#5!X_,r'“b ø (x%rpÿöYÛy'†°/± é°/±% é°/°3± é°(/°Ö´"+²" +³@ +°° Ö´+² +³@ +° 2±)+±°9°"°9°° 9±° 9°± 99°%°9°°901"3267#"&547.547#5!!;þ'!0‰&,-"/Ds&&#=åþß 5W!'7‚  PM4,Tpp!'tÿöfúy\°/± é°/° 3± é°/± é°/°Ö´+² +³@ +² +³@ +±+±°9±°9°±9901!5!47#5!#327#"&úýüþ’(‹uP 3dm0bG>W pþ82ooJ u€41Tÿö`Kyd°/± é°/± é°/± é°/°Ö´+² +³@ +° 2² +³@ +± +±°9±±99° ± 99°°901!5!254.'5!##".'7Ký«Uþú(%2~#9%,Q:3 kW pþW+H!'p"(*.#-D]Q++þûÿöÿ_Ay=º²4+´: +°/±é°& Ö±!é°° Ö±é°/± é°/°3± é°>/° Ö´ +²  +³@  +°´+°/² +³@ +°#2±?+± µ4:$9°´*1$9±&4²*7999°:±$99±!°9°°#9±° 901%>54#"#"&546;5!5!##32632327#"''&'.54632"8L;u1©þÐK¬å (V/7+0 k#@PdLW.!9g,†F%$6pp¥'$"„h- _ /j64$+!ÿö06y+o°/± é° /±é°&/± é°/± é°,/°#Ö´ +°2²# +³@# +±-+± #±99± °9± ³ #$9°&² (999°°)901!5!2327#"'#".'732654&#"'>6ýÀ@þÆ’00# 0nJ !ILK-16"+"MX p¨  u JU ZO5+'6]ÿö¹›y U°/± é° /±33± é°/°Ö´+² +³@ +°±+´+² +³@ +±+±°901##"&=#5!2=#›,\DG_3¥Ñ6h ¨I_^E­pþ¯Eœ %ÿöÿïÆy?²+° /± é°/± é°/°Ö´+² +³@ +° 2±+± °901!5!4>3!!".Æþ0Ðþc 2##þýy4MP~ pþÅ--o5—)RF³(^ v*u° /± é°/±é°/±# é°+/° Ö´+°±+´&+±,+± °9°³#)$9°&± 99± °9°³)$9°±&99°° 901%270#".'3254&#"327"54632=sp8:"Q‚@>.”3" ¯f?PlbV#Ñ–  Yu6e!/ e>NtLMgÿöÓy*r°&/±!é°/± é°/± é° /° 3± é°+/°Ö´+² +³@ +³@ +±,+±²999±!&°$9°±#99°±99°±9901747&546;5!5!##"632&#"327#".M=?9zþÛÝHÑ )#'+&;leC1I&º%%,=5;,pp› m/p- 35(Sß{,¨°/±' é°!/±é°/°3± é°2² +³@ +°-/° Ö´+° Ö´#+°±+´+°±+± é°*2±.+± ° 9°#°9±²'999±± !99±'°+9°!° 9°² *999°± 9901#53".547&54632#54'"6;"3267ß““ã1I!+UV26Pp**0/ ¥ )6Y54'#5!#&724BkIXfŠ"')˜Å©Á/Z'W…@‚h (pp"ÿöÿðy!?²+°/°3± é°2°/± é°"/°Ö´+±#+±±99°°901!5!.54632>7"'67&#"ýÙ'þ{G0#EG4"mRWA%B63] i)(5 pþˆ:ba0;T/Mi>"pe=./!$#ÿö2Žy)4j°/°3±3 é°2°%/°-3± é°2°/± é°5/°Ö´0+°0±"+´ +±6+±"0µ*$9±3°9°%± 99°°901!5!>32#"'#"&5463232654&#".#"26Žýh˜þÍI$N]%?(V,.WO]cNOj/&s) B& pî"oX39+AFtZQvÈ =:8* #2'/5*@ÿöÿiŽy,7t°/°3±6 é°"2°(/°03± é°2°/± é°8/°Ö´3+°3±%+´+±9+±3°9°%· -$9±6±99°(±99° °901%'!5!>32#"'#"&546232654&#".#"26%fffÏýh˜þÍI$N]%?(V,.WO]bžj/'s) B&5fff:pî"oX39+AFtZRuÈ =&-:( #2'/4+@ÿöbyC° /±é°/± é°/± é°/°Ö´+±+± ° 9°²999°°901!5!2>7#"&54632&#"þfš©%A%L[MsdL:00$#'3 pþWƒCePMon-/ÿöÿãÏy#P°/±" é°/±33± é°$/°Ö´ +² +³@ +±%+± ² 999±"± 99°°9017>7#".547#5!&#"32bHžLþÎF7)Q%#10 ^Ù£. 15O…‰O R/) 7$!pp00ÿö‘„y P°/± é°/°3± é°/°Ö´+² +³@ +° 2² +³@ +±+±° 9°± 99017"&=#5!#'327'îRs3Ž¿¿S~.%'—‘`IÏppÉo%¬%žÿöÿä4y `° /± é°/°3± é°!/°Ö´+² +³@ +°2² +³@ +±"+±² 999± ² 999°± 9901.'7326=!5!#3#T"5"e'H@-MYZ+;þâ>°±Ì,7ƒ%HJ7i(} =; vppy oÿöÿ‰Xy'†°/´+°/± é°/± é°"/°%3±# é°(/°Ö°2´+² +³@" +°± +´&+²& +³@& +°$2±)+±°9° ´$9±°9±°901!!.547.5463!5!5!#£”þ‰4%1%%5"7%$;!6/(þ@b2d!q'"6["/C(D."N(-6pp¥ÿö þy,-°#/± é²# +³# +°/± é°-/±.+± #°901!5!4>32#".54676?.#"#"&þýøþ*;`9<80BÏJK""À &'^ pý%"9K?s. /c5qÿöøcy,° /± é°/± é°/±+± ±99°±9901!5!27#"&'5 cþ“mˆ=K%)0   pþî#v +o  )ÿèl08­²+°"/°3± é°/± é°3/±,é°9/°%Ö´ +² % +³@  +°%°) Ö´5+° ±1+´/+±:+± )°'9±15´ ",$9°/µ$9±"°9°±99°² %999°² '999°3³)/7$901327#"'4632&'"#"&547&54632'4#"6VmAAmH:3 (+*4# d< GbX5Q@BUp'!%#”#t2*+5(' L'0aMLA2A7KDB(,(ÿöÿ¨ y/i°/´ +°+/± é° ° Ö±'é° /± é°/± é°0/°%Ö´+±1+±%±99±²"#999±'+±%99± °901!5!463!!327632'#"54632>54#"#". ýìþ!3#‰þŸ + E*4tXU‚ ‹4 C@% *J+ pñ#(o D/i+PE{W% % -A=ÿöÿîyM²+°/° 3± é°/± é°/°Ö´+² +³@ +° 2² +³@ +±+±°901!5!47#5!#".ýèþ„ tåÀ!*\7B`b pþ¤pp( y/YTÿö ðy°/± é°/±+01!5!'%&''>32ðþúþÑDÿJ™@0§);/5 pþT­Y”PPUN&,5ÿëVu(3n²+± é°-/±é°4/°Ö´/+°/±+´+±5+±/²&'999°³ -2$9°³ )$9±±99°-¶2$9014>327327#.547'7''>7&7.#"6‰3:?S:?W1‚&9c%L5=OŽ=ß)–F8;/®ù.<C9B53)b@11s’,%M< HcsHV "4. 1ÿyH°/±é° /°Ö´+°±+´+±!+±³ $9°±99°±990146327'7''>7&74&#"6eN<=V:iNþ¸>Ñ\bN>l /­ ý9CC9C5R)~­]oH;%c 96,%y+3}°/±é°./±é°4/° Ö´)+³0) +´+°/´0+³,) +´+±5+± °9±,0²999±)³!&$9±°9°.´ 2$901%2>7#".547''>7&54632&#"4#"6€ 88J5=(>!”D-<0O<=U8K.4""&G  nv4"F0V2F]757EC9D33 l$&…$%ÿpÿø„$° /´ +°/°Ö´  +± °9014>32&#"#.ä#5%1(&/1T9(#0 NB5F@þ ÿÿüÿò²+´ +°2°/±°901#'#73zv†|ÞLúìnz[f% ²+´ +² +³@ +°2°° Ö´ +² +³@ +²+°&/° Ö´  +° ±+´ +°° Ö´ +°/´ +°±+´ +±'+± ²999±°9±°"901#4#"#"&=332632#54#"&=332ôS2q'CV'O9QgS)7V&,z)O/9!DE#>-8$% ;'ÿÿþup>„&%ö FÿÿþQp[ˆ&&ùö cñy",T°&/± é°-/°Ö´)+°)±#+´ +° 2²# +³@# +±.+±)°9°#±99° ³ $901&54632''6"&547%4&#"6‰/Y2/.9]fQT`06~*› S ‚48=N 9(C4K8B5$fþ¹B7 |I ×  ÿöy#~°!/± é°2²! +³@! +° /± é°/± é°/± é°$/°Ö´+² +³@ +² +³@ +³@ +³@ +±%+±² 999±!°9±°901%"&5467;5#".546;5#5!#";3#G f! ^%6 S.Gûj¶Íœœr#-*1B7pþê}r;ÿöÿùäy!<²+°/±! é²! +³ +°/± é°"/°Ö´+±#+±°901!5!#"&54?".54>3äþîr}r’,\SEfr 2# p® @1B4<&<2N>§`--ÿö¡ye°/± é°/°3± é°/°Ö´+² +³@ +°2°° Ö± é° /±é²  +³@  +±+±°9±± 9901#".547&=#5#¡ìV1B(6D$.:«ôjtKY&=H'@}qoz ÿöpyP°/±é° /°3± é°/° Ö´+² +³@ +°2²  +³@ +±+± °9± °90127'7"&=#5!#ëS2þî<¶>q3zØ./8Á£[mc; pp%ÿòºyB²² +°3/°3±$é°/±é°C/°Ö´+°± +´=+° Ö´+°=±0+´)+±D+±±99± ´$9°=°9°² 7;999°0¶!$,-69A$9±3 µ ),69A$9°$µ!";$9°´$9014&#"6.547''>7&54632632'>54&#"'67&#"i8Y!3‚9!m/N<>U:W56)< N2>3 +!i ý þŒ:7$<] <669CC9D4 6#,# 9WO#&/#'/0ÿöÿ  y9EQÿ°!/±Fé²!F +³@! +°/±Dé°K Ö±6é°0/°?3±+é° 2°/±33± é°R/°$Ö°(2´O+°32°O±+±H22´+±A22² +³@ +² +³@ +°±+°<2´+° 2±S+±O$°&9°²!+-999±´ :?$9°°9±F!±99°Kµ$HO$9°°M9°6³&BI$9±0D¶ (.3954&#"#5#"&547&54632&#"3267654&#"632275#"'Sþ£þ¶%GBb.-H@Y)I )=o/;Mt0/fQ K(2&*%<í$)-915 þ³>.-:'& pp*R<7A+;2v6FZZÇUbB;;.?>_ d$--UE)ç3])%ÿöÿ%úyYa²+² +±Sé²+´+²#+² +´. +³. +±!é°Y Ö´+°3/±Jé°J°G Ö±6é°E/±<é°?/°B3±@ é°Z/°Ö´+°± +°#2´ +°P2° ±1+´M+°= Ö´C+²C= +³@CB +²=C +³@=9 +³@=? +³M1+´V+±[+±°+9° ³E$9°=².6G999±1 °39°C´ JSY$9±M°9°V±99±°9°!° 9° ±V99±S°Q9°²$P999±36°19°G²*M999±EJ²+999°<±99901'2674#"#5#"&54632&#"3275.'732654#"#"&546;5!5!##32632632#RRRO$!%6o((CV];  &(+V9GO"²J1* 9'=2#¨þ?Óæ% V'/W=$):UfM±RRRþ>.—PU31D W  (j *'C83~ m6!+6ppš#BCYG8CEÿöÿ8y<Wå²M+´J+°/°3±Eé°=/±/é°4/±é°7 Ö±é° /± é°/° 3± é°X/°%Ö´?+²%? +³@% +°?±+±2U22´+±Y+±?%±:B99°@  /7EG$9°³ $9±E°9°M²BGR999°J°#9°=°9°/³& ?V$9°7°29±4²+,999°±99± ±:9901'%35!5!##327632#5#".5732=.'732654#"#"&546"'3&54632"326=«RRRþ͸þ$Íþ"-+?oVgR‹Fi $*GUcR'F <"Hf5#*s('g,Iv TE7j= §þ=öÂö T)2p“RRRë–!)u*40HR…r9 52pp¡"BBþƒÿöÿYìy:L¤²;+±Jé°/±? é°D/±1é°5/± é°8 Ö±é°/± é° /° 3± é°M/°Ö±3A22´+±N+±²999±?°9±J;±"A99±1D´$&BFH$9°8°39°5²(999°³)-$9±±9901'%46;5!5!##2632#5#"&'47&547&'73254#"#"&"3275#"';ŒRRRþ{.+±-:²+999°)±99±)²*3<999°³ 4$9±² 999°²!999°°901%75#"'&'73254&#"'>323275!5!##5#"&'732674'{š³dnJC$U'*-BOAkýáÞPol VAP€CN6Y2PŸ*4 BO[QP3)ZFI ”ppýéc=OdYGHM5ÿöÿ%Áy2Kæ²#+±:é°=/± é²= +³@ +° /± é°/°3± é°L/°+Ö´B+²+B +³@+ +°B±0+°&2´ +´8+° ±+± é³+´+°/´+² +³@ +±M+±80³.@EJ$9± ´#346:$9°°=9°´ !<$9±=:¶&(4!E$9°µ+3@BJ$9° ².09990135!5!##"4632#'#"&547"&5467&546327'.'32>>¦þ¯QÿNQ*,!-' –wjPG5XOBL&H4#PZ Q‹#L  Ó6pp¥73+35!3 ## X6 R:AY% Dbþ’N*% ¤1,($  ÿöÿ•üy5‚°3/±!é²3! +³@3/ +²!3 +³@!' +°/±é°/± é° /° 3± é°6/°Ö´+² +³@ +³@ +±7+±±99±!3±*,99±±99°±9901747&546;5!5!##">;&#"3263>32#&'#"&M=?9zþÛêUÑ  %(.6,$(."*B—'Xcº$&,=6:,pp›l6$)8$*JV&\TÿöÿÄyI°1/± é° /±! é²! +³@!' +°!°= Ö±Cé°/± é°/°3± é°J/°:Ö´E+°E±+´+² +³@ +°°5 Ö´+°±$+±) é³)$+´+°/´+² +³@ +±K+±5E±=A99±±@H99±$³1$9°± 99°´&'+./$9± µ-/57H$9°C´+:AE$9°!°@9°=±$)99°±9901%3267'.546;5!5!##"4&5462#'#".547.54632&#"6P@&3 2T+K…YK@¦ýðÅFþOP.P''O aƒ ;2BzL6,4L\%[Q< Yg 2fBCc6pp¥64'/=34¨¡A2 \B7K103+/!ÿöÿeAy5<´°-/´+°/± é° /°3± é°=/°Ö´+² +³@ +³0+´ +°±+´! $+³!+´ +° /´+² +³@ +±>+±°29°²-8999° °9°´#)+9$9±-±(+99°µ#069$90127'46;5!5!#!"4&54632#&'#"&547."&'&.j%ãO>«þ”&HþüPS0*1'%", –2:PY/: U  ? A#(eFd8qqª85(/1&3!QHQ $e:7-E@¼:( ÿöÿ!™yNå°=/± é²= +³@ +°°8 Ö±% é²%8 +³@% +°/±F é°I/°L3±J é°O/°3Ö´(+°(±C+´+²C +³@CI +°±+± é³M +´G+°G/´M+²MG +³@ML +±P+±(3°+9°C°%9°³ "*8$9°³;$9°G±<=99°M³ $9±=%°<9°8° 9±± C9901"432#'#".547'&#".54>327'.546;5!5!#4ŸU& &aŠ"~ <@*(0 (^ %6,C"<‡Fm@(L?¦þ3‡Kdg^%$ 44§IJ  ))P %9 (< ;dO,<7Cc6pp¥ÿöÿò­y,£² +° /±% é°2² % +³@  +°/±# é°*/± é°/±'33± é°-/°Ö´(+²( +³@ +³@ +³@ +°(± +°&2´+² +³@ +±.+±(²999° ² $999±% °9±*#°90135#5!##5##"&546;5#".546;3##"ªGû·Qou1g! ^&8 L# Íu¶ Ó6ppýéi;o "!1' *I}>¥ÿöÿò¶y-¸²+°/±,é°'/±" é°/± é° /±33± é°./°Ö´)+²) +³@ +³@ +°)± +´+°±+°2´+² +³@ +±/+±)² 999° ±,99°²"$'999±,°9°'±%99°"³ $$9°±9901%"&547&546;5!5!##57##"632&#"32LhB]PBþÞÀPo=f£oà&80P!#SQB+ %OA16ppýéw/+㥠n0ÿöÿu)y(4ư/±2é°,/± é², +³@ +°/± é°#/°&3±$ é°5/°Ö´+² +³@# +³+´/ +°±+± é³'+´!+°!/´'+²'! +³@'& +±6+±/°9°²,2999±'!µ )*$9±2±99°,°9°±99°±9901"&54632#'#"&547&546;5!5!#'&#"326ËNR.()&'dB9DQ‰L>§þœ$QN"/d73'/>3&¼ )a56*5Db6pp¥þ”9 "ÿöÿ%\y/¡²+±é°/±! é°$/± é°/±* é°-/°3±. é°0/°Ö°'2´+´+² +³@- +°±"+°+2´+°2²" +³@ +±1+±"³$$9±°9°±99±$± 99°± '9901##"3267#"3267#"&546;5"&546;5!5!\€ã"' 1OO3%ÙIAU1;&HdrzšlA•fGþŠf ¥E H3›+!%NYaV=[_W>[6pÿöÿ%\y:Dz +²+± é²+± é°/±2 é°-/±$ é°'/°*3±( é°;/°!Ö´0+° Ö´+² +³@' +°0± +´+°% Ö´++²+% +³@+* +±<+±%0´2$9° ± 99°+±:99°² 47999±² 999±2±5:99°-±!49901#"32674'7#".54>;5"&546;5!5!##"327Æí%‘C.h 0MJ%;qT-B5vk«n?þŠf€ã"' MCQ# D" 1(: &V:*> dR@Y6pp¥E=B!ÿöÿ%7yAá² +²+± é² +³@= +²+± é´7 = +±7 é°2/±) é°,/°/3±- é°B/°Ö°$2´+°52² +³@, +°± +°:2´+°?2³A +´+°/°*3´A+°02²A +³@A/ +±C+±³ 7$9° ³ 9<$9±A± =99±² 999±7 °A9°2²$;5#".54>;5!5!##"32674'7Æí%‘C.h 0MJ%;qT-B5v ;qT-B5vþ Aqí%‘C.h OD" 1(: &V:*> "&V:*> 6pp¥D" 1H%ÿöÿZœy8ܰ/± é² +³@ +³@8 +°/±0 é°0°3 Ö±é°./±% é°(/°+3±) é°9/° Ö´ +°±8+°2´7+°7°, Ö´&+°&/´,+²,& +³@,+ +²&, +³@& +³@&( +±:+± ±"99°&´.0$9°8±399±²999°°9°°9°0°9±%.°"901%#"'#"&546;5&'732>54&#"#"&546;5!5!##32632#×>5#*s('g,Iv  ) @7j= §þ=¦rö T-DpV–!)u*40HR…  r9 52pp¡"J5þƒÿöÿ%‡yRß²>+±Gé°L/±6é°P Ö±2é°-/±é° /±'é°'°$ Ö±é°"/±é°/°3± é°S/°JÖ° 2´9+°*2° Ö´ +²  +³@  +² +³@ +°2³@ +±T+±J² 4L999° ±'699±LP°J9°2±9C99°6°D9±-²/999± ° 9°$±*99±"'°9°°901747&'732654#"#"&546;5!5!##32632#"'327632#".'732654#"#"&º UDD#²I1*  =2#¨þ?‘`æ% V(.uW',* <'/,S98f[A)F%²F)2  & ;ƒo7Z@3} m6!+6ppš#CHg  B">;##D>/<3y)# jÿöÿ%‡yEP%²+°M/´+°/´( +°0/´B+°B° Ö´-+°?/±6é°9/°<3±: é°Q/°Ö´ +° ±+´O+°O±++´+°7 Ö´=+°2²=7 +³@=< +²7= +³@73 +³@79 +°° Ö´I+°I/´+±R+± ±?99°7µ(0BD$9°O°.9°+²-FM999°I°9°=°9±M³F$9°± 99±(±99°0°+9±B-±"99±6?±3#99012#"&54632#".543.'732654"#"&546;5!5!##3276>54.#" $/æ'7.R=:ItR=€^ e†'U -De:5&*<‚<¨þ?‘`Ô"B ^7+”021G';J1f@ŽSMD66" U6)$0pp” þ) ÿöÿ².y+4Ȳ++²+´3 +²+´4+3 +± é° /±2 é°0/±" é°%/±(-33±& é°5/°Ö°2´ +² +³@% +° ±#+´.+°.±++°,2´*+²*+ +³@*( +±6+± °9°#´02$9°.³34$9±°9°4² 999°3°9±"0°901%##"&547#".547&5463!5!5!##5#!!g“2h0j78.N1J)::6/(þ@8WpAþ}Y#6x# +#. N(1=,B0@@),6ppýé×@¥oÿöÿ¨ y+9Ú²+²+°/±8é°)/±2 é°0/± é°/±-33± é°:/° Ö´+² +³@  +³@  +°±+´.+°.°6 Ö´$+°$/´6+°.±+°,2´+² +³@ +±;+± ° 9°³ 02$9±.$²8999±8± 99°)´ " 6$9°2± ,99±0°9017.467&546;5!5!##5#"'3654.+"%#!322˜NX#-0T+´3+°3±.+´'+° Ö´+² +³@ +² +³@ +³@ +±K+±>´ B$9°3±@99°²"0999°.°+9°²*89999±89°9°0· '.3*>B$9° ² 999±°9017.5463267&546;5!5!#!632'>54#"3".547'47&#"ls;3&GF+_BG8(2%*Óýk\Wþë0!8R()%A W1H;VP>ti? BW$)Ž7Y ] %:Y6H\6( ((76pp¥/0'7T #7. ].T71X/+%ÿöÿçBy)1‡²+°3°/±/é° 2°'/±+33±( é°2/°%Ö´-+²%- +³@%' +°-±+°*2´+² +³@ +±3+±-%² 999°³ $9±±*99°/³#-$901##5'7&#'67&#".'732=!5!5#632BPoŽIŒF-$-Z;B/FiL>0G#N Z+=(þØL¿õEq ýéšxLuq%%/`|GH;a1p=; $lpþ»Õ9QÿÿÿfCz&àZ¦ öÿT·s‡D° /´ +² +³@ +°2°/°Ö´ +°±+´ +±² 99901'2653#"&53DDDD#*CT<:U@(‡DDDI$;JJ;-ÿÿþup‰„& à ÿ­þ=ÿ¦ÿ„ǰ/´ +°/°Ö´ +01''%|þð7G\¶NÓÿöÿKyM°6/±/ é°(/±# é°H/±é°/± é°/°3± é°N/°Ö´K+²K +³@ +°K±;+´,+²;, +³@;? +°,± +´+² +³@ +²  +³@  +° °D Ö´+±O+±K±99°;²999°,´ =H$9±D ²#B999°²(/6999°°%9±/6±499°(±399°#±&=99°H´%?K$9°±99± °901.547&5463!5!5!#!632327#"32>7#".'47&5463254.#"ç]?,H>*$þ~P_þ»22ØDJ#+@,,CE *"(8;KBA+4YP-0i&H?VdLBDI:#(6pp¢Š.)  e$ Z;"@)!"#?<>H"9OÿöÿaFy<°°#/±é°./± é°/±é°/° 3± é°=/°;Ö´1+²;1 +³@; +°1±+´ +²  +³@ +³@  +² +³@ +±>+±1;°9°·(.45$9° ³#*,$9±#°!9°.´ (1;$9°±99±°901&5463!5!5!#!632327#".543254#".54g>*$þ~P_þ» 22dwKE!'#2-.JJ9:%©c6hCK($.A&I:#(6pp¢K?&3 ^$5#rB3KG[/5V5Lÿöÿ5y1°//±é°/± é°/°3± é°2/° Ö´+² +³@  +°±)+´"+° Ö´+² +³@ +² +³@ +±3+± ° 9°¶&-/$9°)°,9°°%9±/± 99±° 9017.547&5463!5!5!#!632'>54&5'7"ŽR/"#D@'B8)%ÿþ€?Pþ»+;"GJ/40Z#+ Sj3dvCS V"7&#".54d<-#4þJZþ“ @?gšog  D=GJS69%H;Qn;A=(37B=#-6pp¥ %þRÞ9( CI+b.6? BAIU/J,HeB5ÿöÿ^y:½°*/±7é²*7 +³@*' +°/±$ é°"/± é°/°3± é°;/°Ö´+² +³@ +°±'+°2´&+²&' +³@& +°'° Ö´ +² +³@ +±<+±°9°· "$*-7$9±7*² (999°³-0$9°$°9±"°901%#.5467&5463!5!5!#!!#5#"&54673267Áà@ -`N-:6/(þ@‹[þ}op 1CYF8& ,Ç;,% W7‹X'L@@),6pp¥þJI I<-8 T  ÿöÿjwy1ž°/±& é²& +³@) +°$/± é°/°!3± é°2/°Ö°2´ +² +³@ +° ±)+´(+²() +³@(! +°(°" Ö´+°/´"+±3+± °9°µ$&+/$9±&°9±$°901"&54?#"&547&5463!5!5!#!!#5p~¦µ7 # .0µ::6/(þ@Qþ}ˆo[ ,B5O4#7 VCßB0@@),6pp¥þJë+ÿöÿƒy1ª² +´ +³ +± é°± é°/±) é°,/°/3±- é°2/°"Ö°&2´+²" +³@", +°±*+´0+²0* +³@0 +³@0/ +±3+±"°$9°*´ $9°0³$9±² "999°°$9±)°&901!3##"&54>7#".547&5463!5!5!#£¹¹2ir.,';9Q'::6/(þ@c3dop#6w)&:$ \ENB B0@@),6pp¥ÿöÀpyN°/± é° /° 3± é°/°Ö´+² +³@ +°2² +³@ +±+±°9° °90127#"&=#5!#ëH=6LRs3zØ./=€,`I pp%ÿöÿòJy„²+°/± é°/± é°/±33± é° /°Ö´+² +³@ +°±+°2´+° 2² +³@ +°2±!+±°9±±99°±99° ± 99017"&=#5!#632&#"#5'3275#îRs3T•3, Go)….%+0®À`I ppS'z BþÎá¬%%µÿöÿôy7X²+°//±é²/ +³/5 +°/°3± é°8/°Ö°2´+² +³@ +² +³@ +±9+±/°9014>325!5!##5#".54676?&'&#"#"&(;`9 þ,—To› JK""À/ )0U|% ¤qqýìÔQ /c552pÿöÿ_y1Aв+²(+´- +°/±@ é° Ö±<é°9/± é°/±633± é°B/° Ö´8 +² 8 +³@  +°8´+°/°8±+±522´+² +³@ +±C+± µ(-9>$9°8µ!&@$9°´ $%2$9±-(´!$9±<²2999±9@°59°° 901%>74"#"&546;5!5!##5'75&'&'46327>75##27632"7!(8x1©þÐ)PorQÃf n01 @\g£.!((¿!rËã )! #+g, •7%$6ppýéYkH¸%k/#^:ii$+"£%¯¥% ÿöÿìÐy'w²+°3°%/± é°/°3± é°(/° Ö´+°±+±22´+² +³@ +² +³@ +±)+±³ $9±%± 99° ±9901.54632675!5!##5'75'67&#"˜?6GZ=lSXA0 Rppýé†NYvK`'.9##ÿöÿä7y&²+° /± é°2°/±#33± é°'/°Ö´%+²% +³@ +°%±+°"2´+² +³@ +±(+±%± 99°´ $9± °9° ³"%$901##5'7&#".'732=!5!25#67Po¥G¤J9 C/-z XK~|Z+6(þâAþor`ô ýäñ‡Uƒ9$/<JZª¯=;*$vp¦N„9ÿöÿ©²y/£²+²+°&/± é°/± é°/°3± é°0/°Ö´ +² +³@ +³@ +° ±+±22´+² +³@ +±1+± ±99°²999±&°9°±99°´ $9°°,9°°-901'254.'5!5!5!##5'%5!#".'7Zfff¯(  Úý¼PoåG,þÚ#9%7^:.ha@fff +  'IppýäS—XÀ"(*.#9MeB,gŸÿöÿ¹y8Ò²1+³1+´ +²+²5+°/°-3± é°!2°/°3± é°9/°Ö´+² +³@ +°±1+°2´0+°2²01 +³@0 +²10 +³@1 +°0±*+´$+±:+±°9°1² 999±*0²!&'999±1°69°³&'2$9°µ$*/$9° ± 9901"&54?&54632&#"3267!5!!632'>54&#"#5±~BK`T8.#%Q<þ›(þ®3;AhŠa(R")@qšGC5 :TG} u)!L qqi/fB\¡G#k& hþø†J/ÿöÿ}>y&Hϲ!+°3³!+´< +°A/±0é°,/±'é°/±333± é°I/°Ö´5+²5 +³@ +°5±D+´.+°.±+±2?22´+² +³@ +±J+±5²!999°D± $99°.°<9°²')A999±!°9°<±99±0A±9?99°,³*2D$9°'² )99901"&54?.'732=#5!##52&#"3275!3267#"&54>9~@.L*" cåHRq X.„Ï782'þÒ12jM.v221A](;0ƒC9 \Qa&)7 yqqýä_ /k e,+/³‡*;8S(1OH,A ÿöÿ¹{y1³²+³+´' +²+²+°!/±0 é°/±*33± é°2/°Ö´$+²$ +³@ +³@ +³@ +°$±+°)2´+² +³@ +±3+±$³ +-$9°² 1999±°9°'±99°!±)99°0° 9°° 901"&54?&547.547#5!##5#"3275#;Ñ~AF( (?…Nq+”¥† &!#Mmþ<YGC5+O2-H,qqýä¥ G/n#Gõ 'ÿöÿµ™y*œ²+²+²'+° /°3± é°/°3± é°+/°Ö´+² +³@ +² +³@ +³@ +°±+°2´+² +³@ +² +³@ +±,+±´ $%$9°°(9± ² 99901"&54?&547#5!#32675!5!##5Ø~_))Ž‘f*+3.\þ£LqC2VKC5.)@:3rr#7U6¯qqýä¹'' /ÿöÿrêy+“²$+°/± é°/± é°/°!3± é°,/°Ö´ +² +³@ +³@ +° ±$+±22´#+²#$ +³@#! +±-+± ³&)$9±$°%9°°9°± 99°±99°°901"&547%5##"732654&'5!5!5!##5„~)Y25¸gmgQ5!ýÈôJršŽC4¥%)/E$O/þôW#&Mqqýä?J/ÿöÿãŸy-l²&+²+°/± é° /°#3±! é°./°Ö´ +² +³@ +° ±&+°2´%+²%& +³@%# +±/+±& ± 99±&± 9901%"&54?#". 4>3!5!5!##“~¦å})Q!! 4#:þ©Nq=aC5P>›U )%/+2.-/@qqýä/)ÿ·Ày>ɲ5+³5+´+ +²+²;+°/´+°/±.233±# é°02°?/°Ö´+°±+´&+°&±5+°-2´4+²45 +³@42 +²54 +³@5/ +±@+±± 99°¶#)9$9°&±+<99±5°<9°+±699°³ ) -$9°±&99°°901"&54?.532654&#"327#"&54>323275#5!##5ý~DFS?/LC*&-9O(:0Sj]W%«þ”0RþüPS0*1' F–ˆ”C4CuCFd8qqª85(/1&3!j$ #*A/)ÿ¢~y:à²1+³1+´' +°!/± é°+/±.33±, é°2²+, +³@+ +°;/° Ö´+° Ö°3´$+°±+´+°±1+°)2´0+²01 +³@0. +²10 +³@1+ +±<+± ° 9°$²999±´'58$9°1± !99±1°89°'³25$9°!° 9° ² )999°+± 9901"&54?.547&54632#54#"63"3275#5!##5ó~3,'+VS;7Nq +2ZaF.'=h`Mr"%‚)^C1O9+GZ8TS0))@m"eßqqýä¬R8ÿöÿÙy s²+²+° /±33± é°!/° Ö´+²  +³@  +³@ +°±+°2´+² +³@ +±"+± °9°°9± ²99901"&54?.=#5!##5275#­~\,44Pp‘.1.³-'C5,N0Êqqýä¢F/++ÙÆ"ÿöÿ¹íy+3¡²$+²+²(+° /± é° /±233± é°4/° Ö´,+² , +³@  +³@ +°,±$+°12´#+°2²#$ +³@# +°#±+´+±5+±$,±99±#²999± $µ%/1$9°°901"&54?.=#5!!632'654&#"#53275#­~€;I4÷þÑ6+Mj:az+Sp‘&-'1.³GC5>W9Êqq{(bM%MJMr8Lþó‚F/‰"%ßÿöÿ¯gy!%™²+²+²+°/±% é°2²% +³@ +°/±#33± é°&/°Ö°2´%+°2²% +³@ +³@ +°%±+±"22´+² +³@ +±'+±%° 9°°9±±99°%°901"&547%5##"&546;5#5!##55#ý~)Ù3$i$hqOqš–ÙQC5 :5z$.§qqýä|J/²§§ÿöÿ±y(›²!+³!+´ +²+²%+°/± é°/°3± é°)/° Ö°2´+°±!+°2´ +² ! +³@  +²! +³@! +±*+± °9°!² 999±!²"#999°² 999° °901"&54?.54632&#"327!5!##5²~F-7bQ'3'.##1#64þ±&fqƒOC5![/Lu r , )#0qqýäs?/ÿöÿì«y+­²+°#3°)/°3±* é° Ö± é°/°3± é°2°,/°&Ö´+²& +³@& +³@&* +°±+°2´+°2² +³@ +°±+´ +±-+±&°(9°±"#99±² 999±)³ $9±*°901&!50!!632'>54&#"##".547#5!ç£þ²µþ­3;AhŠa(R")@q™!*\7B`b t¾pqi/fB\¡G#k& hþøi( y/YT>pÿöfDy -1^°/°3±' é°2°/±!33± é°2°0/±1 é°2/°Ö´$+²$ +³@ +±3+±$°9±'°9°²99901747#50!#32>7#"&'#"&732>767!5Œ(‹­ 39A"ƒF-K"i5>W 3%R/$Gü²ú82ooJ 8%€$S/("5TªJ /-'ppÿöÿ%áyZ²+³ T+±>é°X Ö±:é²@+²K+²F+±Oé°5/±é°/±/é°/°, Ö±é°*/±!é°$/°'3±% é°[/°RÖ°2´A+°22°" Ö´(+²(" +³@(' +²"( +³@" +°2³@"$ +±\+±R"²99°A±99±TX°R9°°A9±>:²L999±5³ 7$9±°9°,² 2999±*/² 999°!±9901%''47&'732654#"#"&546;5!5!##32632#"'327632#".'732654#"#"&ŒRRRRRRRþ€ UDD#²I1*  =2#¨þ?ëºæ% V(.uW',* <'/,S98f[A)F%²F)2  & ;ƒRRRtRRRð7Z@3} m6!+6ppš#CHg  B">;##D>/<3y)# jÿöÿ{ìy:½°5/´ +°/±% é°%°( Ö±é°2°#/± é°/° 3± é°;/°-Ö°2´,+°,°! Ö´+°/´!+²! +³@! +²! +³@ +³@ +±<+±-±(99±,!°9± 5²,.999°°9°°9°%²999±#±9901'.'732>54&#"#"&546;5!5!##32632#5#"&547†RRRþ¸BkIv  ) @7j= §þ=öÂö T-Dp×~“RRRéM-R…  r9 52pp¡"J5þ»¶^/C6 ÿöÿæVy#“²+±33°/± é°/± é° /±"33± é°$/°Ö± 22´+°2² +³@ +³@ +°±+°!2´+² +³@ +±%+±°9°±99°²!999°²99901%'%5"#5!5!5!##5#"&'#33275!»þó7DQïR’þ;`Rr6D\zqq=AAD<þšš´NÑQs@qqýä¾!t`þÕ (DÊÿÿýÅþÔÿüÊ'ÿ~ÿè Øÿÿþ þÔ Ô' ÿ~ÿè âÿÿÿöÿ…•y&ÿ¡ÿúÿÿÿöÿwLy'ÿìÿÿÿöÿ³[y'±( çÿÿÿöÿ³•y'±( èÿÿÿöÿ³Xy'Ù( éÿÿÿöÿ³Ky'±( ìÿÿÿöÿ³Jy'±( :ÿÿúæè"ºÿÿúÖŠÿöÿì‡y.†²+°/± é°/±33± é°2°//°Ö°-2´+°2² +³@ +² +³@ +°±+´ +±0+±² 999±´ %&$9° ³ '-$9°°*90150!0!632'>54&#"#='%&''>325 ‘þ­3;AhŠa(R")@qþþDÿJ *$5 >$¯+I;qqi/fB\¡G#k& hþøÇ”Y”N  [H5;¥ PÈä"²+´ +°/°Ö´ +±+013#M{wFä”"® jkÿìjwÿâj~ÿìj…ÿìjˆÿìj‹ÿìj”ÿìj–ÿìj—ÿâj™ÿâjšÿâj›ÿâjœÿâjÿâjžÿâjŸÿâj ÿâj¡ÿâj¢ÿâj£ÿâj¤ÿâj¥ÿâj¦ÿâj§ÿâj¨ÿâj©ÿâjªÿâj«ÿâj¬ÿâj­ÿâj®ÿâj¯ÿâj°ÿâj±ÿâj²ÿâj³ÿâj´ÿâjµÿâj¶ÿâj·ÿâj¸ÿâj¹ÿâjºÿâj»ÿâj¼ÿâj½ÿâj¾ÿâj¿ÿâjÀÿâjÁÿâjÂÿâjÃÿâjÄÿâjÅÿâjÆÿâk‰ÿìk–ÿìskÿØs~ÿØs…ÿØsˆÿØs‰ÿìs‹ÿØs”ÿØs–ÿìs—ÿìs™ÿìsšÿìs›ÿìsœÿìsÿìsžÿìsŸÿìs ÿìs¡ÿìs¢ÿìs£ÿìs¤ÿìs¥ÿìs¦ÿìs§ÿìs¨ÿìs©ÿìsªÿìs«ÿìs¬ÿìs­ÿìs®ÿìs¯ÿìs°ÿìs±ÿìs²ÿìs³ÿìs´ÿìsµÿìs¶ÿìs·ÿìs¸ÿìs¹ÿìsºÿìs»ÿìs¼ÿìs½ÿìs¾ÿìs¿ÿìsÀÿìsÁÿìsÂÿìsÃÿìsÄÿìsÅÿìsÆÿìukÿâuwÿØu~ÿâu…ÿâuˆÿâu‹ÿâu”ÿâu–ÿâu—ÿâu™ÿâušÿâu›ÿâuœÿâuÿâužÿâuŸÿâu ÿâu¡ÿâu¢ÿâu£ÿâu¤ÿâu¥ÿâu¦ÿâu§ÿâu¨ÿâu©ÿâuªÿâu«ÿâu¬ÿâu­ÿâu®ÿâu¯ÿâu°ÿâu±ÿâu²ÿâu³ÿâu´ÿâuµÿâu¶ÿâu·ÿâu¸ÿâu¹ÿâuºÿâu»ÿâu¼ÿâu½ÿâu¾ÿâu¿ÿâuÀÿâuÁÿâuÂÿâuÃÿâuÄÿâuÅÿâuÆÿâzkÿìzwÿâz~ÿìz…ÿìzˆÿìz‹ÿìz”ÿìz–ÿìz—ÿâz™ÿâzšÿâz›ÿâzœÿâzÿâzžÿâzŸÿâz ÿâz¡ÿâz¢ÿâz£ÿâz¤ÿâz¥ÿâz¦ÿâz§ÿâz¨ÿâz©ÿâzªÿâz«ÿâz¬ÿâz­ÿâz®ÿâz¯ÿâz°ÿâz±ÿâz²ÿâz³ÿâz´ÿâzµÿâz¶ÿâz·ÿâz¸ÿâz¹ÿâzºÿâz»ÿâz¼ÿâz½ÿâz¾ÿâz¿ÿâzÀÿâzÁÿâzÂÿâzÃÿâzÄÿâzÅÿâzÆÿâ~‰ÿì~–ÿìkÿØ~ÿØ…ÿ؈ÿ؉ÿì‹ÿØ”ÿØ–ÿì—ÿì™ÿìšÿì›ÿìœÿìÿìžÿìŸÿì ÿì¡ÿì¢ÿì£ÿì¤ÿì¥ÿì¦ÿì§ÿì¨ÿì©ÿìªÿì«ÿì¬ÿì­ÿì®ÿì¯ÿì°ÿì±ÿì²ÿì³ÿì´ÿìµÿì¶ÿì·ÿì¸ÿì¹ÿìºÿì»ÿì¼ÿì½ÿì¾ÿì¿ÿìÀÿìÁÿìÂÿìÃÿìÄÿìÅÿìÆÿì…‰ÿì…–ÿì‡kÿö‡wÿâ‡~ÿö‡…ÿö‡ˆÿö‡‹ÿö‡”ÿö‡–ÿö‡—ÿ쇙ÿ쇚ÿ쇛ÿ쇜ÿì‡ÿ쇞ÿ쇟ÿ쇠ÿ쇡ÿ쇢ÿ쇣ÿ쇤ÿ쇥ÿ쇦ÿ쇧ÿ쇨ÿ쇩ÿ쇪ÿ쇫ÿ쇬ÿ쇭ÿ쇮ÿ쇯ÿ쇰ÿ쇱ÿ쇲ÿ쇳ÿ쇴ÿ쇵ÿ쇶ÿ쇷ÿ쇸ÿ쇹ÿ쇺ÿ쇻ÿ쇼ÿ쇽ÿ쇾ÿ쇿ÿì‡Àÿì‡Áÿì‡Âÿì‡Ãÿì‡Äÿì‡Åÿì‡Æÿ숉ÿ숖ÿì‰kÿì‰wÿâ‰~ÿ쉅ÿ쉈ÿ쉋ÿ쉔ÿ쉖ÿ쉗ÿ≙ÿ≚ÿ≛ÿ≜ÿâ‰ÿ≞ÿ≟ÿ≠ÿ≡ÿ≢ÿ≣ÿ≤ÿ≥ÿ≦ÿ≧ÿ≨ÿ≩ÿ≪ÿ≫ÿ≬ÿ≭ÿ≮ÿ≯ÿ≰ÿ≱ÿ≲ÿ≳ÿ≴ÿ≵ÿ≶ÿ≷ÿ≸ÿ≹ÿ≺ÿ≻ÿ≼ÿ≽ÿ≾ÿ≿ÿâ‰Àÿâ‰Áÿâ‰Âÿâ‰Ãÿâ‰Äÿâ‰Åÿâ‰ÆÿâŠkÿâŠwÿØŠ~ÿ⊅ÿ⊈ÿ⊋ÿ⊔ÿ⊖ÿ⊗ÿ⊙ÿ⊚ÿ⊛ÿ⊜ÿâŠÿ⊞ÿ⊟ÿ⊠ÿ⊡ÿ⊢ÿ⊣ÿ⊤ÿ⊥ÿ⊦ÿ⊧ÿ⊨ÿ⊩ÿ⊪ÿ⊫ÿ⊬ÿ⊭ÿ⊮ÿ⊯ÿ⊰ÿ⊱ÿ⊲ÿ⊳ÿ⊴ÿ⊵ÿ⊶ÿ⊷ÿ⊸ÿ⊹ÿ⊺ÿ⊻ÿ⊼ÿ⊽ÿ⊾ÿ⊿ÿâŠÀÿâŠÁÿâŠÂÿâŠÃÿâŠÄÿâŠÅÿâŠÆÿ⋉ÿì‹–ÿ쑉ÿì‘–ÿ쓉ÿì“–ÿ씉ÿì”–ÿ앉ÿì•–ÿìš›ÿØ©›ÿت›ÿìÅ›ÿìâÜâÜâÜâ"ÈãÜãÜãÜã"ÈäÜäÜäÜä"ÈåÜåÜåÜå"ÈæÜæÜæÜæ"ÈçÜçÜçÜç"ÈèÜèÜèÜè"ÈéÜéÜéÜé"ÈêÜêÜêÜê"ÈëÜëÜëÜë"ÈìÜìÜìÜì"ÈíÜíÜíÜí"ÈîÜîÜîÜî"ÈïÜïÜïÜï"ÈðÜðÜðÜð"ÈñÜñÜñÜñ"ÈòÜòÜòÜò"ÈóÜóÜóÜó"ÈôÜôÜôÜô"ÈõÜõÜõÜõ"ÈöÜöÜöÜö"È÷Ü÷Ü÷Ü÷"ÈøÜøÜøÜø"ÈùÜùÜùÜù"ÈúÜúÜúÜú"ÈûÜûÜûÜû"ÈüÜüÜüÜü"ÈýÜýÜýÜý"ÈþÜþÜþÜþ"ÈÿÜÿÜÿÜÿ"ÈÜÜÜ"ÈÜÜÜ"ÈÜÜÜ"ÈÜÜÜ"ÈÜÜÜ"ÈÜÜÜ"ÈÜÜÜ"ÈÜÜÜ"ÈÜÜÜ"È Ü Ü Ü "È Ü Ü Ü "È Ü Ü Ü "È Ü Ü Ü "È Ü Ü Ü "ÈÜÜÜ"ÈÜÜÜ"ÈÜÜÜ"ÈÜÜÜ"ÈÜÜÜ"ÈÜÜÜ"ÈÜÜÜ"ÈÜÜÜ"ÈÜÜÜ"ÈÜÜÜ"ÈÜÜÜ"ÈÜÜÜ"ÈÜÜÜ"ÈÜÜÜ"ÈÜÜÜ"ÈÜÜÜ"ÈÜÜÜ"È Ü Ü Ü "È!Ü!Ü!Ü!"È"Ü"Ü"Ü""È#Ü#Ü#Ü#"È$Ü$Ü$Ü$"È%Ü%Ü%Ü%"È&Ü&Ü&Ü&"È'Ü'Ü'Ü'"È(Ü(Ü(Ü("È)Ü)Ü)Ü)"È*Ü*Ü*Ü*"È+Ü+Ü+Ü+"È,Ü,Ü,Ü,"È-Ü-Ü-Ü-"È.Ü.Ü.Ü."È/Ü/Ü/Ü/"È0Ü0Ü0Ü0"È1Ü1Ü1Ü1"È2Ü2Ü2Ü2"È3Ü3Ü3Ü3"È4Ü4Ü4Ü4"È5Ü5Ü5Ü5"È6Ü6Ü6Ü6"È7Ü7Ü7Ü7"È8Ü8Ü8Ü8"È9Ü9Ü9Ü9"È:Ü:Ü:Ü:"È;Ü;Ü;Ü;"È<Ü<Ü<Ü<"È=Ü=Ü=Ü="È>Ü>Ü>Ü>"È?Ü?Ü?Ü?"È@Ü@Ü@Ü@"ÈAÜAÜAÜA"ÈDÜDÜDÜD"ÈEÜEÜEÜE"ÈFÜFÜFÜF"ÈGÜGÜGÜG"ÈHÜHÜHÜH"ÈIÜIÜIÜI"ÈJÜJÜJÜJ"ÈKÜKÜKÜK"ÈLÜLÜLÜL"ÈMÜMÜMÜM"ÈNÜNÜNÜN"ÈOÜOÜOÜO"ÈPÜPÜPÜP"ÈQÜQÜQÜQ"ÈRÜRÜRÜR"ÈSÜSÜSÜS"ÈTÜTÜTÜT"ÈUÜUÜUÜU"ÈVÜVÜVÜV"ÈWÜWÜWÜW"ÈXÜXÜXÜX"ÈYÜYÜYÜY"ÈZÜZÜZÜZ"È[Ü[Ü[Ü["È\Ü\Ü\Ü\"ÈN®MœüF {¯ Üñ +M É $!$$8ò  ÈÔ¦®þ Î Ü š ê  0 _ $‰  é Võ ’y H× æ  ö J $^ $ .n"€ò$„ŒD T&Ô ä®¸p&† FRÄÌ š¦!,!(D" l"z$ $&&°&(È'v'$Š*F*P- ^-j9 ¤9°Copyright 2002, 2003, 2005, 2008, 2009, 2010, 2012 GNU Freefont contributors.Copyright 2002, 2003, 2005, 2008, 2009, 2010, 2012 GNU Freefont contributors.FreeSansFreeSansBoldBoldGNU: FreeSans Bold: 2012GNU: FreeSans Bold: 2012FreeSans BoldFreeSans BoldVersion 0412.2261 Version 0412.2261 FreeSansBoldFreeSansBoldGNUGNUhttps://savannah.gnu.org/projects/freefont/https://savannah.gnu.org/projects/freefont/This computer font is part of GNU FreeFont. It is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This font is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this font. If not, see http://www.gnu.org/licenses/ As a special exception, if you create a document which uses this font, and embed this font or unaltered portions of this font into the document, this font does not by itself cause the resulting document to be covered by the GNU General Public License. This exception does not however invalidate any other reasons why the document might be covered by the GNU General Public License. If you modify this font, you may extend this exception to your version of the font, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version.This computer font is part of GNU FreeFont. It is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This font is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this font. If not, see http://www.gnu.org/licenses/ As a special exception, if you create a document which uses this font, and embed this font or unaltered portions of this font into the document, this font does not by itself cause the resulting document to be covered by the GNU General Public License. This exception does not however invalidate any other reasons why the document might be covered by the GNU General Public License. If you modify this font, you may extend this exception to your version of the font, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version.http://www.gnu.org/copyleft/gpl.htmlhttp://www.gnu.org/copyleft/gpl.htmlâ#mFreeSans â#m68@=89FreeSans 68@=89Kal1nFreeSans Kal1nFetFreeSans FetNegritaFreeSans NegritaKrepkoFreeSans KrepkoTu néFreeSans Tu né>;C68@=K9FreeSans >;C68@=K9grosFreeSans grosNegritoFreeSans NegritoPogrubionyFreeSans PogrubionyHalvfetFreeSans HalvfetpusjuodisFreeSans pusjuodistreknrakstsFreeSans treknrakstsGrassettoFreeSans Grassettohuruf tebalFreeSans huruf tebalFélkövérFreeSans Félkövér ' C 7 M FreeSans ' C 7 M ˆ½Ä¿½±Free Sans ˆ½Ä¿½±FettFreeSans FettGrasFreeSans GrasLihavoituFreeSans LihavoituVetFreeSans VetfedFreeSans fedtu néFreeSans tu nénegretaFreeSans negreta?>;CG5@5=FreeSans ?>;CG5@5=LodiaFreeSans LodiaÿCE _  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`a¬£„…½–膎‹©¤ŠÚƒ“òóˆÞñžªõôö¢­ÉÇ®bcdËeÈÊÏÌÍÎéfÓÐѯgð‘ÖÔÕhëíjikmln oqprsutvwêxzy{}|¸¡~€ìîº   ýþ  ÿøù !"#$%&'()*+,-.ú×/0123456789:;<=âã>?@ABCDEFGHIJKL°±MNOPQRSTUVûüäåWXYZ[\]^_`abcdefghijkl»mnopæçqrstuvwxyz{|}~€‚ƒ¦„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”Øá•–—˜™š›œžŸ ¡¢£¤ÛÜÝàÙߥ¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH¨IJKLMNOPQRSTUVWXYZ[Ÿ\]^_`abcdefghijklmnopq›rstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`a²³bcd¶·Äe´µÅf‚‡ghi«jklmnopqrÆstuvwxyz¾¿{|}~€‚ƒ¼„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅ÷ÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúŒûüýþÿ                           ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [˜ \ ] ^ _ ` a b c d e f gš h™ï i j k l m n o¥ p q r’ s t u v w x y zœ { | } ~  € ‚ ƒ „ … † ‡ ˆ ‰§ Š ‹ Œ Ž ‘ ’ “ ” • – — ˜ ™”• š › œ ž Ÿ   ¡ ¢ £ ¤ ¥ ¦ § ¨ © ª « ¬ ­ ® ¯ ° ± ² ³ ´ µ ¶ · ¸ ¹ º » ¼ ½ ¾ ¿ À Á  à Ĺ Å Æ Ç È É Ê Ë Ì Í Î Ï Ð Ñ Ò Ó Ô Õ Ö × Ø Ù Ú Û Ü Ý Þ ß à á â ã ä å æ ç è é ê ë ì í î ï ð ñ ò ó ô õ ö ÷ ø ù ú û ü ý þ ÿ                           ! " # $ % & ' (ÀÁ ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~  € ‚ ƒ „ … † ‡ ˆ ‰ Š ‹ Œ Ž ‘ ’ “ ” • – — ˜ ™ š › œ ž Ÿ   ¡ ¢ £ ¤ ¥ ¦ § ¨ © ª « ¬ ­ ® ¯ ° ± ² ³ ´ µ ¶ · ¸ ¹ º » ¼ ½ ¾ ¿ À Á Â Ã Ä Å Æ Ç È É Ê Ë Ì Í Î Ï Ð Ñ Ò Ó Ô Õ Ö × Ø Ù Ú Û Ü Ý Þ ß à á â ã ä å æ ç è é ê ë ì í î ï ð ñ ò ó ô õ ö ÷ ø ù ú û ü ý þ ÿ                           ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b softhyphenmicromiddotssharpAmacronamacronAbreveabreveAogonekaogonek Ccircumflex ccircumflex Cdotaccent cdotaccentDcarondcaronDcroatEmacronemacronEbreveebreve Edotaccent edotaccentEogonekeogonekEcaronecaron Gcircumflex gcircumflex Gdotaccent gdotaccent Gcommaaccent gcommaaccent Hcircumflex hcircumflexHbarhbarItildeitildeImacronimacronIbreveibreveIogonekiogonekIJij Jcircumflex jcircumflex Kcommaaccent kcommaaccent kgreenlandicLacutelacute Lcommaaccent lcommaaccentLcaronlcaronLdotldotNacutenacute Ncommaaccent ncommaaccentNcaronncaron napostropheEngengOmacronomacronObreveobreve Ohungarumlaut ohungarumlautRacuteracute Rcommaaccent rcommaaccentRcaronrcaronSacutesacute Scircumflex scircumflexTcedillatcedillaTcarontcaronTbartbarUtildeutildeUmacronumacronUbreveubreveUringuring Uhungarumlaut uhungarumlautUogonekuogonek Wcircumflex wcircumflex Ycircumflex ycircumflexZacutezacute Zdotaccent zdotaccentlongsuni0180uni0181uni0182uni0183uni0184uni0185uni0186uni0187uni0188uni0189uni018Auni018Buni018Cuni018Duni018Euni018Funi0190uni0191uni0193uni0194uni0195uni0196uni0197uni0198uni0199uni019a lambdastrokeuni019Cuni019Duni019EObarOhornohornuni01A2uni01a3uni01A4uni01A5uni01A6uni01A7uni01A8uni01A9uni01aauni01ABuni01ACuni01ADuni01AEUhornuhornuni01B1uni01b2uni01B3yhookuni01B5uni01B6Yoghuni01B8uni01b9uni01bauni01bbuni01bewynnuni01c0uni01c1uni01c2uni01c3uni01C4uni01C5uni01C6uni01C7uni01C8uni01C9uni01CAuni01CBuni01CCuni01CDacaronuni01CFicaronuni01D1ocaronuni01D3ucaronuni01D5uni01D6uni01D7udieresisacuteuni01D9uni01DAUdieresisgraveudieresisgraveeturnuni01DEuni01DFuni01E0uni01E1uni01E2uni01E3uni01E4uni01E5Gcarongcaronuni01E8kcaronOogonekoogonekuni01ECuni01EDuni01EEuni01EFjcaronuni01F1uni01F2uni01F3GacutegacuteWynnuni01F8uni01F9 Aringacute aringacuteAEacuteaeacute Oslashacute oslashacute Adblgrave adblgraveAinvertedbreveainvertedbreve Edblgrave edblgraveEinvertedbreveeinvertedbreve Idblgrave idblgraveIinvertedbreveiinvertedbreve Odblgrave odblgraveOinvertedbreveoinvertedbreve Rdblgrave rdblgraveRinvertedbreverinvertedbreve Udblgrave udblgraveUinvertedbreveuinvertedbreve Scommaaccent scommaaccentuni021Auni021Buni021cuni021duni021Euni021Funi0224uni0225uni0226uni0227uni0228uni0229uni022Auni022Buni022Cuni022Duni022Euni022Funi0230uni0231uni0232uni0233dotlessjuni0250uni0251uni0252uni0253uni0254uni0255uni0256uni0257uni0258schwauni025Auni025Buni025Cuni025Duni025Euni025Funi0260uni0261uni0262 gammalatinuni0264uni0265hhookuni0267uni0268uni0269uni026Auni026Buni026Cuni026Duni026Euni026Funi0270uni0271uni0272uni0273uni0274uni0275uni0276uni0277uni0278uni0279uni027A rturnrthookuni027Cuni027Duni027Euni027F Rsmallcap Rsmallcapinvshookeshdotlessjstrokehook eshshortreveshcurltturntrthookubar upsilonlatinvhookvturnwturnyturn Ysmallcapzrthookzcurlezhezhcurl glottalstopglottalstoprevinvglottalstopinvcstretch bilabialclick Bsmallcap eopenclosed Gsmallhook Hsmallcap jcrossedtailkturned Lsmallcapqhookglottalstopbarglottalstopbarrevdzaltonedezhdzcurltsteshtccurluni02a9uni02aauni02abuni02ACuni02aduni02aeuni02afhsuper hhooksuperjsuperrsuper rturnsuperrturnrthooksuper Rturnsuperwsuperysuperprimemod primedblmod quoteleftmod apostrophe apostropherev ringhalfright ringhalfleftglottalstopmodglottalstopreversedmodfrontedbackedraisedlowereduni02c8macronmodifier acutemodifier gravemodifierverticallinelowmod macronlowmod gravelowmod acutelowmodcolontriangularmodcolontriangularhalfmodringhalfrightcenteredringhalfleftcentered tackupmid tackdownmidplusmodminusmoduni02DEuni02DFuni02E0uni02E1uni02E2uni02E3uni02E4 toneextrahightonehightonemidtonelow toneextralowuni02EAuni02EBuni02ecuni02EDuni02eeuni02EFuni02F0uni02F1uni02F2uni02f3uni02F4uni02F5uni02F6uni02F7uni02F8uni02F9uni02FAuni02FBuni02FCuni02fduni02FEuni02FF gravecomb acutecombcircumflexcomb tildecomb macroncomb overlinecmb brevecomb dotaccentcmb diaeresiscomb hookabovecombringcmbhungarumlautcmb caroncombverticallineabovecmbdblverticallineabovecmb gravedblnospuni0310breveinvertedcmbcommaturnedabovecmb commaabovecmbcommareversedabovecmbcommaaboverightcmb gravebelowcmb acutebelowcmbuni0318uni0319uni031Ahorncombringlefthalfsubnospuni031Duni031Euni031F minusbelowcmbuni0321uni0322 dotbelowcombuni0324 ringbelowcmb commasubnosp cedillacmb ogonekcmblinevertsubnospbridgebelowcmbdblarchinvertedbelowcmb caronbelowcmbcircumflexbelowcmb brevebelowcmbbreveinvertedbelowcmb tildebelowcmbmacronbelowcmb lowlinecmb dbllowlinecmbtildeoverlaycmbstrokeshortoverlaycmbstrokelongoverlaycmbsolidusshortoverlaycmbsoliduslongoverlaycmbringrighthalfsubnospuni033Auni033Bseagullbelowcmbuni033Duni033Euni033F gravetonecmbuni0341perispomenigreekcmb koroniscmbdialytikatonoscmbuni0345uni0346uni0347uni0348uni0349uni034Auni034Buni034Cuni034Duni034Euni034funi0350uni0351uni0352uni0353uni0354uni0355uni0356uni0357uni0358uni0359uni035Auni035Buni035Cuni035Duni035Euni035Funi0360uni0361uni0362uni0363uni0364uni0365uni0366uni0367uni0368uni0369uni036Auni036Buni036Cuni036Duni036Euni036Funi0374uni0375 ypogegrammeniuni037Etonos dieresistonos Alphatonos anoteleia EpsilontonosEtatonos Iotatonos Omicrontonos Upsilontonos OmegatonosiotadieresistonosAlphaBetaGammaEpsilonZetaEtaThetaIotaKappaLambdaMuNuXiOmicronPiRhoSigmaTauUpsilonPhiChiPsi IotadieresisUpsilondieresis alphatonos epsilontonosetatonos iotatonosupsilondieresistonosalphabetagammadeltaepsilonzetaetathetaiotakappalambdauni03BCnuxiomicronrhosigma1sigmatauupsilonphichipsiomega iotadieresisupsilondieresis omicrontonos upsilontonos omegatonosthetasymbolgreek Upsilonhookuni03D3uni03D4phi1omega1uni03D7uni03F0uni03F1uni03f4uni03F5Iecyrillic_grave Iocyrillic Djecyrillic Gjecyrillic Ecyrillic Dzecyrillic Icyrillic Yicyrillic Jecyrillic Ljecyrillic Njecyrillic Tshecyrillic KjecyrillicIicyrillic_graveUshortcyrillic Dzhecyrillic Acyrillic Becyrillic Vecyrillic Gecyrillic Decyrillic Iecyrillic Zhecyrillic Zecyrillic IicyrillicIishortcyrillic Kacyrillic Elcyrillic Emcyrillic Encyrillic Ocyrillic Pecyrillic Ercyrillic Escyrillic Tecyrillic Ucyrillic Efcyrillic Khacyrillic Tsecyrillic Checyrillic Shacyrillic ShchacyrillicHardsigncyrillic YericyrillicSoftsigncyrillicEreversedcyrillic IUcyrillic IAcyrillic acyrillic becyrillic vecyrillic gecyrillic decyrillic iecyrillic zhecyrillic zecyrillic iicyrilliciishortcyrillic kacyrillic elcyrillic emcyrillic encyrillic ocyrillic pecyrillic ercyrillic escyrillic tecyrillic ucyrillic efcyrillic khacyrillic tsecyrillic checyrillic shacyrillic shchacyrillichardsigncyrillic yericyrillicsoftsigncyrillicereversedcyrillic iucyrillic iacyrilliciecyrillic_grave iocyrillic djecyrillic gjecyrillic ecyrillic dzecyrillic icyrillic yicyrillic jecyrillic ljecyrillic njecyrillic tshecyrillic kjecyrilliciicyrillic_graveushortcyrillic dzhecyrillic Omegacyrillic omegacyrillicuni0470uni0471 afii10147 afii10195Omegatitlocyrillicomegatitlocyrillic Otcyrillic otcyrillicthousandcyrillictitlocyrilliccmbpalatalizationcyrilliccmbuni0485uni0486uni0487uni0488uni0489uni048auni048buni048Cuni048Duni048Euni048Funi0490uni0491uni0492uni0493uni0494uni0495uni0496uni0497uni0498uni0499uni049Auni049Buni049Cuni049Duni049Euni049Funi04A0uni04A1uni04A2uni04A3uni04A4uni04A5uni04A6uni04A7uni04A8uni04A9uni04AAuni04ABuni04ACuni04ADuni04AEuni04AFuni04B0uni04B1uni04B2uni04B3uni04B4uni04B5uni04B6uni04B7uni04B8uni04B9uni04BAuni04BBuni04BCuni04BDuni04BEuni04BFuni04C0uni04C1uni04C2uni04C3uni04C4uni04C5uni04C6uni04C7uni04C8uni04C9uni04CAuni04CBuni04CCuni04CDuni04CEuni04cfuni04D0uni04D1uni04D2uni04D3uni04D4uni04D5uni04D6uni04D7uni04D8uni04d9uni04DAuni04DBuni04DCuni04DDuni04DEuni04DFDzeabkhasiancyrillicuni04E1uni04E2uni04E3uni04E4uni04E5uni04E6uni04E7uni04E8uni04E9uni04EAuni04EBuni04ECuni04EDuni04EEuni04EFuni04F0uni04F1Uhungarumlautcyrillicuhungarumlautcyrillicuni04F4uni04F5uni04f6uni04f7uni04F8uni04F9uni0510uni0511uni0512uni0513uni051auni051buni051cuni051duni051euni051funi0531uni0532uni0533uni0534uni0535uni0536uni0537uni0538uni0539uni053Auni053Buni053Cuni053Duni053Euni053Funi0540uni0541uni0542uni0543uni0544uni0545uni0546uni0547uni0548uni0549uni054Auni054Buni054Cuni054Duni054Euni054Funi0550uni0551uni0552uni0553uni0554uni0555uni0556uni0559uni055Auni055Buni055C commaarmenianuni055Euni055Funi0561uni0562uni0563uni0564 echarmenianuni0566uni0567uni0568uni0569uni056A iniarmenianuni056C xeharmenianuni056Euni056Funi0570uni0571uni0572uni0573 menarmenianuni0575 nowarmenianuni0577uni0578uni0579uni057Auni057Buni057Cuni057D vewarmenianuni057Funi0580uni0581uni0582uni0583uni0584uni0585uni0586uni0587uni0589uni058A dramarmenian afii57799 afii57801 afii57800 afii57802 hiriqhebrew afii57794 afii57795 patahhebrew qamatshebrew holamhebrew afii57796 dageshhebrew siluqhebrew maqafhebrew rafehebrew afii57842 shindothebrew sindothebrewsofpasuqhebrewupperdothebrew alefhebrew bethebrew gimelhebrew dalethebrewhehebrew vavhebrew zayinhebrew hethebrew tethebrew yodhebrewfinalkafhebrew kafhebrew lamedhebrewfinalmemhebrew memhebrewfinalnunhebrew nunhebrew samekhhebrew ayinhebrew finalpehebrewpehebrewfinaltsadihebrew tsadihebrew qofhebrew reshhebrew shinhebrew tavhebrew vavvavhebrew vavyodhebrew yodyodhebrew gereshhebrewgershayimhebrewinvcandrabindudevacandrabindudeva anusvaradeva visargadeva shortadevaadevaaadevaidevaiidevaudevauudeva rvocalicdeva lvocalicdeva ecandradeva eshortdevaedevaaideva ocandradeva oshortdevaodevaaudevakadevakhadevagadevaghadevangadevacadevachadevajadevajhadevanyadevattadevatthadevaddadevaddhadevannadevatadevathadevadadevadhadevanadevannnadevapadevaphadevabadevabhadevamadevayadevaradevarradevaladevalladevallladevavadevashadevassadevasadevahadeva oesigndeva ooesigndeva nuktadeva avagrahadeva aasigndeva isigndeva iisigndeva usigndeva uusigndevarvocalicsigndevarrvocalicsigndevaecandrasigndevaeshortsigndeva esigndeva aisigndevaocandrasigndevaoshortsigndeva osigndeva ausigndevavirama epristhamatra awsigndevaomdeva udattadeva anudattadeva gravedeva acutedevalongecandradeva uesigndeva uuesigndevaqadevakhhadevaghhadevazadeva dddhadevarhadevafadevayyadeva rrvocalicdeva llvocalicdevalvocalicvowelsigndevallvocalicsigndevadandadbldandazerodevaonedevatwodeva threedevafourdevafivedevasixdeva sevendeva eightdevaninedevaabbreviationsigndevaellipsisdotdeva acandradevaoedevaooedevaawdevauedevauuedevazhadeva heavyyadevaggadevajjadevaglottalstopdevadddadevabbadevaadak_bindi_gur bindi_gur visarga_gura_guraa_guri_gurii_guru_guruu_guree_gurai_guroo_gurau_gurka_gurkha_gurga_gurgha_gurnga_gurca_gurcha_gurja_gurjha_gurnya_gurtta_gurttha_gurdda_gurddha_gurnna_gurta_gurtha_gurda_gurdha_gurna_gurpa_gurpha_gurba_gurbha_gurma_gurya_gurra_gurla_gurlla_gurva_gursha_gursa_gurha_gur nukta_gur aamatra_gur imatra_gur iimatra_gur umatra_gur uumatra_gur eematra_gur aimatra_gur oomatra_gur aumatra_gur virama_gur uudatsign_gurkhha_gurghha_gurza_gurrra_gurfa_gurzero_gurone_gurtwo_gur three_gurfour_gurfive_gursix_gur seven_gur eight_gurnine_gur tippi_gur addak_guriri_gurura_gur ek_onkar_guryakashsign_guruni10A0uni10A1uni10A2uni10A3uni10A4uni10A5uni10A6uni10A7uni10A8uni10A9uni10AAuni10ABuni10ACuni10ADuni10AEuni10AFuni10B0uni10B1uni10B2uni10B3uni10B4uni10B5uni10B6uni10B7uni10B8uni10B9uni10BAuni10BBuni10BCuni10BDuni10BEuni10BFuni10C0uni10D0uni10D1uni10d2uni10D3uni10D4uni10D5uni10D6uni10D7uni10D8uni10D9uni10DAuni10DBuni10DCuni10DDuni10DEuni10DFuni10E0uni10E1uni10E2uni10E3uni10E4uni10E5uni10E6uni10E7uni10E8uni10E9uni10EAuni10EBuni10ECuni10EDuni10EEuni10EFuni10F0uni10F1uni10F2uni10F3uni10F4uni10F5uni10f9uni10fbuni10fcuni13A0uni13A1uni13A2uni13A3uni13A4uni13A5uni13A6uni13A7uni13A8uni13A9uni13AAuni13ABuni13ACuni13ADuni13AEuni13AFuni13B0uni13B1uni13B2uni13B3uni13B4uni13B5uni13B6uni13B7uni13B8uni13B9uni13BAuni13BBuni13BCuni13BDuni13BEuni13BFuni13C0uni13C1uni13C2uni13C3uni13C4uni13C5uni13C6uni13C7uni13C8uni13C9uni13CAuni13CBuni13CCuni13CDuni13CEuni13CFuni13D0uni13D1uni13D2uni13D3uni13D4uni13D5uni13D6uni13D7uni13D8uni13D9uni13DAuni13DBuni13DCuni13DDuni13DEuni13DFuni13E0uni13E1uni13E2uni13E3uni13E4uni13E5uni13E6uni13E7uni13E8uni13E9uni13EAuni13EBuni13ECuni13EDuni13EEuni13EFuni13F0uni13F1uni13F2uni13F3uni13F4uni1E00uni1E01 Bdotaccent bdotaccentuni1E04uni1E05uni1E06uni1E07 Ccedillaacute ccedillaacute Ddotaccent ddotaccentuni1E0Cuni1E0Duni1E0Euni1E0Funi1E10uni1E11Dcircumflexbelowdcircumflexbelow Emacrongrave emacrongrave Emacronacute emacronacuteEcircumflexbelowecircumflexbelow Etildebelow etildebelow Ecedillabreve ecedillabreve Fdotaccent fdotaccentGmacrongmacron Hdotaccent hdotaccent Hdotbelow hdotbelow Hdieresis hdieresisHcedillahcedilla Hbrevebelow hbrevebelow Itildebelow itildebelowIdieresisacuteidieresisacuteKacutekacute Kdotbelow kdotbelow Klinebelow klinebelow Ldotbelow ldotbelowLdotbelowmacronldotbelowmacron Llinebelow llinebelowLcircumflexbelowlcircumflexbelowMacutemacute Mdotaccent mdotaccent Mdotbelow mdotbelow Ndotaccent ndotaccent Ndotbelow ndotbelow Nlinebelow nlinebelowNcircumflexbelowncircumflexbelow Otildeacute otildeacuteuni1E4Euni1E4F Omacrongrave omacrongrave Omacronacute omacronacutePacutepacute Pdotaccent pdotaccentuni1E58uni1E59uni1E5Auni1E5Buni1E5Cuni1E5Duni1E5Euni1E5F Sdotaccent sdotaccent Sdotbelow sdotbelowuni1E64uni1E65uni1E66uni1E67uni1E68uni1E69 Tdotaccent tdotaccent Tdotbelow tdotbelowuni1E6Euni1E6FTcircumflexbelowtcircumflexbelowUdieresisbelowudieresisbelow Utildebelow utildebelowUcircumflexbelowucircumflexbelow Utildeacute utildeacuteUmacrondieresisumacrondieresisVtildevtilde Vdotbelow vdotbelowWgravewgraveWacutewacute Wdieresis wdieresis Wdotaccent wdotaccent Wdotbelow wdotbelow Xdotaccent xdotaccent Xdieresis xdieresis Ydotaccent ydotaccent Zcircumflexx zcircumflex Zdotbelow zdotbelowx Zlinebelowx zlinebelowx hlinebelow tdieresiswringxyringxarighthalfringxslongdotaccentxuni1e9euni1EA0uni1EA1uni1ea2uni1ea3uni1EA4acircumflexacuteAcircumflexgraveacircumflexgraveAcircumflexhookaboveacircumflexhookaboveAcircumflextildeacircumflextildeAcircumflexdotbelowacircumflexdotbelow Abreveacute abreveacute Abrevegrave abrevegraveAbrevehookaboveabrevehookabove Abrevetilde abrevetildeAbrevedotbelowabrevedotbelow Edotbelow edotbelow Ehookabove ehookaboveEtildeetildexEcircumflexacuteecircumflexacutexEcircumflexgravexecircumflexgravexEcircumflexhookabovexecircumflexhookaboveEcircumflextildexecircumflextildexEcircumflexdotbelowxecircumflexdotbelowx Ihookabovex ihookabove Idotbelow idotbelow Odotbelow odotbelow Ohookabove ohookaboveOcircumflexacuteocircumflexacuteuni1ED2ocircumflexgraveOcircumflexhookaboveocircumflexhookaboveOcircumflextildeocircumflextildeOcircumflexdotbelowocircumflexdotbelow Ohornacute ohornacute Ohorngrave ohorngraveOhornhookaboveohornhookabove Ohorntilde ohorntilde Ohorndotbelow ohorndotbelow Udotbelow udotbelow Uhookabove uhookabove Uhornacute uhornacute Uhorngrave uhorngraveUhornhookaboveuhornhookabove Uhorntilde uhorntilde Uhorndotbelow uhorndotbelowYgraveygrave Ydotbelow ydotbelow Yhookabove yhookaboveYtildeytildeuni1F00uni1F01uni1F02uni1F03uni1F04uni1F05uni1F06uni1F07uni1F08uni1F09uni1F0Auni1F0Buni1F0Cuni1F0Duni1F0Euni1F0Funi1F10uni1F11uni1F12uni1F13uni1F14uni1F15uni1F18uni1F19uni1F1Auni1F1Buni1F1Cuni1F1Duni1F20uni1F21uni1F22uni1F23uni1F24uni1F25uni1F26uni1F27uni1F28uni1F29uni1F2Auni1F2Buni1F2Cuni1F2Duni1F2Euni1F2Funi1F30uni1F31uni1F32uni1F33uni1F34uni1F35uni1F36uni1F37uni1F38uni1F39uni1F3Auni1F3Buni1F3Cuni1F3Duni1F3Euni1F3Funi1F40uni1F41uni1F42uni1F43uni1F44uni1F45uni1F48uni1F49uni1F4Auni1F4Buni1F4Cuni1F4Duni1F50uni1F51uni1F52uni1F53uni1F54uni1F55uni1F56uni1F57uni1F59uni1F5Buni1F5Duni1F5Funi1F60uni1F61uni1F62uni1F63uni1F64uni1F65uni1F66uni1F67uni1F68uni1F69uni1F6Auni1F6Buni1F6Cuni1F6Duni1F6Euni1F6Funi1F70uni1F71uni1F72uni1F73uni1F74uni1F75uni1F76uni1F77uni1F78uni1F79uni1F7Auni1F7Buni1F7Cuni1F7Duni1F80uni1F81uni1F82uni1F83uni1F84uni1F85uni1F86uni1F87uni1F88uni1F89uni1F8Auni1F8Buni1F8Cuni1F8Duni1F8Euni1F8Funi1F90uni1F91uni1F92uni1F93uni1F94uni1F95uni1F96uni1F97uni1F98uni1F99uni1F9Auni1F9Buni1F9Cuni1F9Duni1F9Euni1F9Funi1FA0uni1FA1uni1FA2uni1FA3uni1FA4uni1FA5uni1FA6uni1FA7uni1FA8uni1FA9uni1FAAuni1FABuni1FACuni1FADuni1FAEuni1FAFuni1FB0uni1FB1uni1FB2uni1FB3uni1FB4uni1FB6uni1FB7uni1FB8uni1FB9uni1FBAuni1FBBuni1FBClenisprosgegrammenipsili perispomenidialytikaperispomeniuni1FC2uni1FC3uni1FC4uni1FC6uni1FC7uni1FC8uni1FC9uni1FCAuni1FCBuni1FCC psilivaria psilioxiapsiliperispomeniuni1FD0uni1FD1uni1FD2uni1FD3uni1FD6uni1FD7uni1FD8uni1FD9uni1FDAuni1FDB dasiavaria dasiaoxiadasiaperispomeniuni1FE0uni1FE1uni1FE2uni1FE3uni1FE4uni1FE5uni1FE6uni1FE7uni1FE8uni1FE9uni1FEAuni1FEBuni1FECdialytikavaria dialytikaoxiavariauni1FF2uni1FF3uni1FF4uni1FF6uni1FF7uni1FF8uni1FF9uni1FFAuni1FFBuni1FFCoxiadasiauni2000uni2001uni2002uni2003uni2004uni2005uni2006uni2007uni2008uni2009uni200auni200b zeronojoinzerojoinuni200euni200funi2010uni2011 figuredash afii00208uni2016 underscoredbl quotereverseduni201funi2023onedotenleadertwodotenleaderuni2027uni2028uni2029uni202auni202buni202cuni202duni202euni202funi2031primeuni2033uni2034 primereverseduni2036uni2037uni2038uni203b exclamdbluni203doverlineuni203funi2040uni2041uni2042uni2043uni2045uni2046uni2047uni2048uni2049uni204auni204buni204cuni204duni204euni204funi2050uni2051uni2052uni2053uni2054uni2055uni2056uni2057uni2058uni2059uni205auni205buni205cuni205duni205euni205funi2060uni2061uni2062uni2063uni2064 zerosuperioruni2071 foursuperior fivesuperior sixsuperior sevensuperior eightsuperior ninesuperior plussuperior minussuperior equalsuperiorparenleftsuperiorparenrightsuperior nsuperior zeroinferior oneinferior twoinferior threeinferior fourinferior fiveinferior sixinferior seveninferior eightinferior nineinferior plusinferioruni208B equalinferiorparenleftinferiorparenrightinferioruni2090uni2091uni2092uni2093uni2094liramillnairarupeesheqeldongEuropfennigceditenge indian_rupeeleftharpoonaccentrightharpoonaccentuni20D2uni20D3uni20D6uni20D7uni20DBuni20DCuni20DDuni20DEuni20DFuni20e0uni20E1uni20E5uni20E6uni20E7uni20E8uni20E9uni20EAuni20EBuni20ECuni20EDuni20EEuni20EFuni20F0uni2100uni2101uni2103uni2105uni2106uni2107scrupleuni2109planckIfrakturlitreuni2114uni2116 recordrightRfrakturuni2120uni2121uni2126uni2127uni2129uni212auni212buni212euni2132uni2135uni2136uni2137uni2138uni213auni213buni2141uni2142uni2143uni2144uni214buni214duni214eonethird twothirdsuni2155uni2156uni2157uni2158uni2159uni215A oneeighth threeeighths fiveeighths seveneighthsuni215Funi2160uni2161uni2162uni2163uni2164uni2165uni2166uni2167uni2168uni2169uni216Auni216Buni216Cuni216Duni216Euni216Funi2170uni2171uni2172uni2173uni2174uni2175uni2176uni2177uni2178uni2179uni217Auni217Buni217Cuni217Duni217Euni217F arrowleftarrowup arrowright arrowdown arrowboth arrowupdnuni2196uni2197uni2198uni2199uni219Auni219Buni219Euni219Funi21A0uni21A1uni21A2uni21A3uni21A4uni21A5uni21A6uni21A7 arrowupdnbseuni21C4uni21C5uni21C6uni21C7uni21C8uni21C9uni21CA universaluni2201 existentialnotexistentialemptyset Delta.mathgradientelement notelement elementsmallsuchthat notcontains ownersmalleop coproduct minusplusdotplus divisionslash backslashmath asteriskmath ringoperator bulletmathcuberoot fourthroot proportional rightangleangledividesparallel logicaland logicalor intersectionunionuni222Cuni222d thereforebecauseratio proportionuni2238uni2239uni223auni223bsimilar wreathproductuni2242 asymptequal congruentuni224auni224b approachesuni2251uni2252uni2253uni2254uni2255 ringequaluni2258uni2259uni225auni225duni225e questionequal equivalence lessoverequalgreateroverequalmuchless muchgreateruni2272uni2273subsetsuperset notsubset notsuperset reflexsubsetreflexsuperset circleplus circleminusuni2297uni2298 circledotuni229auni229buni229c circlevertbarxornandnornarylogicaland narylogicalornaryintersectionuni22c3dotmathuni22eeuni22efuni22f0uni22f1uni2308uni2309uni230auni230buni2310frown slurbelowuni2329uni232auni2423circle dottedcircle whitebullet largecircleuni262Cspade heartopen diamondopenclubspadesuitwhiteheartdiamond clubsuitwhiteuni2669 musicalnotemusicalnotedbluni266Cuni266Duni266Euni266Funi2740uni2A00uni2a01uni2a02uni2D30uni2D31uni2D32uni2D33uni2D34uni2D35uni2D36uni2D37uni2D38uni2D39uni2D3Auni2D3Buni2D3Cuni2D3Duni2D3Euni2D3Funi2D40uni2D41uni2D42uni2D43uni2D44uni2D45uni2D46uni2D47uni2D48uni2D49uni2D4Auni2D4Buni2D4Cuni2D4Duni2D4Euni2D4Funi2D50uni2D51uni2D52uni2D53uni2D54uni2D55uni2D56uni2D57uni2D58uni2D59uni2D5Auni2D5Buni2D5Cuni2D5Duni2D5Euni2D5Funi2D60uni2D61uni2D62uni2D63uni2D64uni2D65uni2D6Funi2e16uni2e17uni2e18uni2e1auni2e1buni2e1euni2e1funi2e28uni2e29uni2e2auni2e2buni2e2cuni2e2duni2e2e lowcircumflex colonmodifier shortequalsSaltillosaltillouniA7AAffffiffllongs_t m_n_armenian m_e_armenian m_i_armenian v_n_armenian m_x_armenianuniFB1DuniFB1EyodyodpatahhebrewayinaltonehebrewuniFB21uniFB22uniFB23uniFB24uniFB25uniFB26uniFB27uniFB28uniFB29shinshindothebrewshinsindothebrewshindageshshindothebrewshindageshsindothebrewalefpatahhebrewalefqamatshebrewalefdageshhebrewbetdageshhebrewgimeldageshhebrewdaletdageshhebrewhedageshhebrewvavdageshhebrewzayindageshhebrewtetdageshhebrewyoddageshhebrewfinalkafdageshhebrewkafdageshhebrewlameddageshhebrewmemdageshhebrewnundageshhebrewsamekhdageshhebrewpefinaldageshhebrewpedageshhebrewtsadidageshhebrewqofdageshhebrewreshdageshhebrewshindageshhebrewtavdageshhebrewvavholamhebrew betrafehebrew kafrafehebrew perafehebrewaleflamedhebrewunifff9unifffaunifffbunifffcuniFFFD gur_ra.blwf gur_va.blwf gur_ha.blwfgur_ya_halant.pstfglyph152glyph153glyph154glyph155glyph156glyph157gur_ra_umatra.blwsgur_ha_umatra.blwsnounicode_3_1_3glyph161gur_ra_uumatra.blwsgur_ha_uumatra.blwsnounicode_3_1_30gur_na_uumatra_tippi.abvsgur_aamatra_bindi.abvsgur_u_addak.pstsgur_uu_addak.pstsgur_oo_addak.psts gur_ka.nuktgha_gur_nukta_gur.nuktnga_gur_nukta_gur.nuktca_gur_nukta_gur.nuktcha_gur_nukta_gur.nuktjha_gur_nukta_gur.nuktnya_gur_nukta_gur.nukttta_gur_nukta_gur.nuktttha_gur_nukta_gur.nuktddha_gur_nukta_gur.nuktnna_gur_nukta_gur.nuktta_gur_nukta_gur.nukttha_gur_nukta_gur.nuktda_gur_nukta_gur.nuktdha_gur_nukta_gur.nuktna_gur_nukta_gur.nuktpa_gur_nukta_gur.nuktba_gur_nukta_gur.nuktbha_gur_nukta_gur.nuktma_gur_nukta_gur.nuktya_gur_nukta_gur.nuktra_gur_nukta_gur.nuktva_gur_nukta_gur.nuktglyph194 gur_ha.nukt gur_a.nukt gur_aa.nukt gur_i.nukt gur_ii.nukt gur_u.nukt gur_uu.nukt gur_ee.nukt gur_ai.nukt gur_oo.nukt gur_au.nuktgur_aa_bindi.abvsgur_va_umatra.blwsgur_va_uumatra.blwsgur_ra_virama.blws gur_ha.blws gur_va.blws gur_ra.blwscyrillic_cresc cyrillic_dotcyrillic_ukrainian_yi_yi_ligcyrillic_titloEngsamisc.bsc.csc.dsc.esc.fsc.gsc.hsc.isc.jsc.ksc.lsc.msc.nsc.osc.psc.qsc.rsc.ssc.tsc.usc.vsc.wsc.xsc.ysc.aesc.thornsc.z sc.oslash sc.ssharpsc.eth sc.lslashsc.asc.ohornsc.uhornsc.i_dotcyrillic_serb_be grave_cap acute_capcircumflex_cap caron_caphungarianumlaut_cap gravedbl_cap dapostrophe lapostrophe tapostrophecircleoperatorfit.0fit.1fit.2fit.3fit.4fit.5fit.6fit.7fit.8fit.9 zeroslasheddev_ka_ssa.akhndev_ja_nya.akhndev_ta_ta.pres dev_ta.vatudev_sha_ca.pres dev_sha.vatudev_sha_va.pres dev_ra_u.blwsdev_ra_uu.blws dev_ka.half dev_kha.half dev_ga.half dev_gha.half dev_ca.half dev_ja.half dev_jha.half dev_nya.half dev_nna.half dev_ta.half dev_tha.halfdev_da_da_half.pres dev_dha.half dev_na.half dev_ba.half dev_bha.half dev_ma.half dev_ya.half dev_la.half dev_lla.half dev_llla.half dev_va.half dev_sha.half dev_ssa.half dev_sa.half dev_ha.halfdev_na_half_na.halfdev_rra_ra.halfdev_ka_ssa.akhn.halfdev_ja_nya.akhn.halfdev_ta_ta.halfdev_ta.half.vatudev_sha_ca.halfdev_sha.vatu.halfdev_sha_va.half dev_ra.rphfdev_rakaar.blwfdev_kash_au_mark dev_e_ra.abvsdev_ai_ra.abvsdev_sha_half_na_half.presdev_da_half_ma_half.presdev_ta_half_na_half.presdev_pa_half_ta_half.presdev_pa.half.vatudev_sha_half_la_half.presdev_ka_ka.presdev_nga_ka.presdev_nga_kha.presdev_nga_ga.presdev_nga_gha.presdev_nya_ja.presdev_da_gha.presdev_da_da.presdev_da_dha.presdev_da_ba.presdev_da_bha.presdev_da_ma.presdev_da_ya.presdev_da_va.presdev_tta_tta.presdev_tta_ttha.presdev_ttha_ttha.presdev_dda_half_ga.presdev_dda_half_dda.presdev_dda_half_ddha.presdev_ha_half_ma.presdev_ha_half_ya.presdev_la_half_ha.presdev_sa_half_ta_half_ra.presdev_ra_anusvara.rphfdev_candrabindu_combdev_e_ra_anusvara.abvs dev_rakaardev_ha_rrvocalic.blwsdev_ha_rvocalic.blwsdev_ha_ra.blwsdev_ha_half_nna.presdev_ha_half_la.presdev_ha_half_va.presdev_ha_half_na.presdev_ha_half_ma_half.pres dev_pa.half dev_pha.halfdev_na_half_na.pres dev_jha.vatu dev_la.vatu dev_sa.vatu dev_za.vatudev_ka_na.presdev_kha_na.presdev_gha_na.presdev_ca_na.presglyph275dev_ta_na.presdev_tha_na.presdev_da_na.presdev_dha_na.presdev_pa_na.presglyph297dev_ma_na.presdev_va_na.presdev_ka_half_ta_half.presdev_ca_half_ca_half.presdev_nga_nga.presdev_nga_na.presdev_ka_ra_ya.presdev_rakaar_u.blwsdev_rakaar_uu.blwsdev_dddha_alt.blwfdev_rha_alt.blwf dev_qa.half dev_khha.half dev_ghha.half dev_za.half dev_fa.halfindic_question indic_exclam dev_ka.vatu caron_side  ÿÿ>¦²ƒ„„…‹ŒŒ‘•––—œž£¤¤¥«¬¬­­®±²µ¶¶·¼½½¾ÃÄÅÆÕÖרêëëììíïðóôõöö÷÷ø-./0abcdpqrs‘¯°°±ÇÈÈÉÉÊÊË]^_`z{{|Ÿ ¹º»¼ÀÁÂÃîïïðÑÒÕÖ¥¦¦§©ªµ¶·¸¸¹Þßàá"#*++,./233456=>?@AB\]^_…††‡‡ˆˆ‰Š‹‹ŒŽ–—™šš››œ¥¦§¨ª««¬ëìóôõöýþ  ½¾¿ÀÁÂËÌÌÍÖ×üý  ! " , - Y Z Z [ _ ` b c c d o p p q Œ  Ž ™ š Ÿ   ¡ ¢ ¢ £ £ ¤ Ä Å Æ Ç Î Ï Ñ Ò Ý Þ Þ ß ß à á â â ã ã ä ä å                    , - - . . / / 0 0 1 : ; ; < B C D E I J J K Q R S T U V Z [ \ ] ] ^ ^T$,4<DL;Ó€B6,2qr ( ) Æ    ¾” DFLTDarmnVcyrlddev2†devaÄgeorgrek gur2guru.hebrDlatnRÿÿ $ÿÿ MKD SRB ÿÿÿÿ SAN $ÿÿ  #ÿÿ  # SAN $ÿÿ  #ÿÿ  #ÿÿÿÿÿÿÿÿÿÿ .CAT @ISM HLSM HNSM HSKS HTRK Pnl Zÿÿ !ÿÿÿÿÿÿ"ÿÿ%abvsàabvsæakhnìblwfòblwfúblwsblwsc2scc2scccmpccmp"ccmp(dlig4dlig:frac@halfFhligLhligRligaXliga^ligadligajloclploclvlocl|nukt‚nuktˆpnumŽpres”pres pstf¬psts²rphf¸smcp¾smcpÄvatuÊzeroÐ) !*, "  + $%&($%&'#2fnv~†Ž–ž¦°¸ÂÊÒÚâêòú "*2:BJRZbjr|†’œ¤®ºÂÊÒÚâêòú¨ÀÊFJÆÒHf²äôF"Trz~‚¨¬¼ò  B < L ¨ Ö  t † – ¦ ø B ² Æ2>v¬Ê˜¼8^zÌZdÆÖæê,ñ¡  Ç ¬LóJ" Ä ¥ ¦ § ¨ © ª « ¬ ­ ® ¯ ° ± ² ³ ´ µ ¶ · ¸ ¹ º » ¼ ¿ Á ½  À ¾ à ŠÆ D]¡¡¨¨²²ººÀÀcc rr! ÕòJ" Ä ¥ ¦ § ¨ © ª « ¬ ­ ® ¯ ° ± ² ³ ´ µ ¶ · ¸ ¹ º » ¼ ¿ ½  À ¾ Ç Ã Å Æ $=ˆˆ’’šš  òòbb qq!óÈñv d $*06<BHNT©È¯Ê±¬ï¦í¤ë£±¨°¢¯¡®  °¬÷¢LM yy/OB 0 ϵ ϳ г е ѵ ѳGOW6 "( &IO %IL $O #L "II 'WAF 2< Å»b» Æ»q»c»r»28RXÎ ,>Pbt†˜ª¼ Ħ„¢ Ö¦Œ¢  ¦–¢ .¦¢ Ŧ¤¢ צ¬¢ 聆¢ ¦¶¢ /¦½¢ $(,28DHLRX&8Z|žÀâ ð©ò£î ì¡  © £ ¡ ©£ ¡ ñ©ó£ï í¡  © £  ¡ ©£ ¡ ú©ü£ø ö¡ û©ý£ù ÷¡„Œ–¤¬¶ÄÅ ô-õM,L À Ê ˜ tžÈÞ &.6>FNV\ o  o ÿoÿýoý o  " o þoþ " o  o  o  " o  o  o 0˜ ¢¾¾6 ,  ,Œ *Š )„ (• +•“¦¡„ Zʾî@FLRX^djpv|‚ˆŽ”𠦬²¸¾ÄÊÐÖÜâè׺׻ Tº T»¾µ¿µÀµÁµÂµÃµÄµÆµÇµÈµÉµÊµÌµÎµÏµÒµÔµÕµÖµ×µØµÃ³¿¸É¸Ò¸ : = @ N P Y2 ( Ÿ• `• a• b•„‡Šæ(V`jt~ˆ’œ¦°ºÄÎØâìö (2<FPZdnx‚Œ– ª´¾ÈÒÜ ‹ ‹ ‘‹ ’‹ “‹ ”‹ •‹ –‹ —‹ ˜‹ v‹—‹˜‹ w‹ x‹ y‹ z‹™‹ {‹ |‹ }‹ ~‹ ‹ €‹ ‹ ‚‹ ƒ‹ „‹ …‹ †‹›‹ ‡‹ ˆ‹ ‰‹ Š‹ ‹‹†‹ Œ‹ˆ‹ Ž‹`uw…‡‡%‰Š& c•ƒZ &@ œ• n j ž• › š • o k ` a b, " ™^ q¦ r^a}Œ*   s§ t§ u§dehf *4>HR\6789:;<=óôõúÿ   Þ+ó + 0++0õ+-ö+-ö+ÿ-2:B 0÷÷ùùý:; 0/b,:H N+ø+ +ü+ ++ ++ ++ +ø+øú¸$NXblv€Š”ž¨²¼ÆÐÚäîø ",6@JT^hr|†š¤® ç+ è+ é+ ê+ ë+ ì+ í+ î+ ï+ ð+ ñ+ ó+ ô+ 9+ :+ õ+ ö+ ÷+ ø+ +8 + ù+ ú+ û+ ü+ ý+ þ+ ÿ+ + V+ W+ X+ Y+ Z+ + + óöøøúü  69<<! Þ Þ" ã ã#   0  0 ð 9Z(2<FP ] 0 < 0 á 0 = 0 ã 0 > 0 ? 0óû9 á 0 ð+ ü 0+ ó 0(0+  ++++0¾fpz„ %+þ (08@ "+ !+ + + + + ê + ÷ à + , ð"(.4 8 ÷ 7 6 5 4 * ) þ ð ù ÿ &  ò++ Q 0+  çh",6@JT^ G+ @ B E H K L I ç ê ð ó ÷ ü 9  A F è ñRht”Òä&.6 P+ O+÷ +ö +õ +ô +ó $+þ #+ý %+þ (+ '+ÿ &+õ&.6 "+ !+ + + + +ö M ð ó &, 7 6 5 4 * ) ÷ýþÿ ç .>F+÷÷ùùý++ 0 0.>*43à / 0     -à#%& J 8 æ å 3 0 2! 1" S R   \ [" *F:;:;"++  R S11 0+  0+ÿÛ 0 "+ ü +ö "+:; ü DFLTDarmnPcyrl\dev2jdevaŠgeorªgrek¶gur2ÂguruÎhebrÞlatnÿÿÿÿÿÿ SAN ÿÿÿÿ SAN ÿÿÿÿÿÿÿÿ ÿÿÿÿIWR JII ÿÿ ÿÿ ÿÿ ÿÿ abvmbabvmhblwmnblwmxblwm€distˆkernŽmark”markšmark¢mark¬mark¶mark¾markÆmkmkÔmkmkÚ     0:DLT\dlt|„Œ”œ¤¬´¼ÈÐØàèÀ Ê Vn”d %ò-’.®2:5´6R8Ö>t@¾BðCJF˜G*GÆLTP>RhR°SúF@ÿÄÿØÿìÿìÿâÿØÿâÿìÿâÿöÿâÿâÿìÿçÿñÿâÿØÿÎÿÉÿâÿÎÿâÿöÿâÿÎÿìÿâÿâÿöÿöÿÎÿìÿìÿöÿìÿâÿØÿÎÿÉÿØÿÎÿìÿìÿöÿØÿâÿâÿâÿìÿìÿØÿöÿìÿìÿâÿâÿØÿÓÿÎÿâÿÎÿØÿâÿâÿØÿìÿìÿâÿâÿØÿìÿâÿâÿÎÿâÿìÿÓÿìÿâÿØÿÓÿÎÿØÿìÿâÿâÿâÿöÿâÿìÿØÿÎÿØÿìÿâÿØÿØÿâÿÎÿìÿâÿØÿÎÿÉÿìÿìÿÓÿâÿØÿâÿöÿìÿìÿÉÿÎÿÎÿöÿÄÿÝÿÝÿçÿÓÿìÿöÿØÿÓÿÎÿâÿÎÿâÿìÿâÿâÿìÿÎÿØÿìÿÎÿâÿâÿìÿØÿñÿìÿØÿÓÿÉÿÄÿØÿâÿìÿØÿØÿöÿØÿìÿâÿØÿâÿØÿçÿâÿØÿÎÿÉÿØÿØÿìÿìÿöÿâÿìÿöÿìÿØÿâÿâÿöÿÎÿâÿâÿâÿâÿìÿìÿâÿØÿÓÿÄÿØÿìÿØÿÎÿâÿØÿØÿØÿâÿÄÿâÿâÿìÿØÿâÿìÿØÿÓÿÎÿâÿØÿìÿØÿìÿÎÿìÿìÿöÿñÿöÿâÿâÿØÿöÿÎÿöÿöÿöÿöÿìÿöÿöÿöÿìÿìÿìÿöÿØÿöÿâÿØÿÉÿâÿÎÿìÿìÿØÿöÿØÿìÿöÿÎÿöÿìÿöÿçÿìÿâÿÝÿØÿÎÿöÿØÿØÿØÿìÿØÿâÿØÿØÿìÿØÿØÿØÿâÿØÿçÿìÿâÿÝÿØÿÄÿÎÿÎÿÎÿâÿâÿÄÿØÿìÿâÿÎÿÄÿØÿÎÿâÿØÿÎÿÉÿÄÿÎÿØÿâÿâÿöÿìÿØÿìÿâÿÎÿØÿâÿØÿâÿØÿÎÿÎÿÉM$$%%&'(())**+,--..//01 22 33 44 55 66 779:;;<<==‚‡ˆˆ‰‰ŠŽ‘’’”˜ šš ŸŸ  ÂÂÄÄÆÆÈÈÊÊÌÌÎÎÐÐÒÒÔÔÚÚÜÜÞÞààââääøøûûýýÿÿ       "" $$&&88::??yy¶¶ MMUUii¡¡ «« ­­ µµ··::ˆ$$&&(())**++,,--..//01224466779:;;<<==DDFGHHII JJMM PQ RRSSTTUUVV WW XXYZ[[ \\]] ‚ˆ‰‰ŠŽ‘”˜ššŸŸ¢¨©©ª­²²³³ ´¸ºº»¾¿¿ÁÁÂÂÃÃÄÄÅÅÆÆÇÇÈÈÊÊËËÌÌÎÎÏÏÑÑÔÔÕÕ××ÚÚÛÛÜÜÞÞààááââããääååøøûûýýÿÿ       !! ""## $$%% &&++--//11338899::;;<< ==>> ??@@ iiŒŒ ¢¢««¬¬ ­­®® µµ¶¶ ··¸¸ ::;; " # % & `$%&'()*+,-./012345679:;<=‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’”•–—˜šŸ ÂÄÆÈÊÌÎÐÒÔÚÜÞàâäøûýÿ "$&8:?y¶MUi¡«­µ·:tÐÒÿöÿöÿìÿñÿöÿöÿçÿöÿöÿñÿöÿìÿçÿìÿñÿñÿöÿûÿöÿñÿöÿûÿìÿçÿñÿöÿûÿûÿûÿöÿûÿìÿöÿìÿûÿìÿûÿìÿöÿöÿöÿöÿìÿöÿìÿñÿìÿöÿìÿûÿûÿñÿìÿñÿìÿöÿñÿöÿûÿìÿìÿöÿâÿñÿñÿìÿñÿöÿñÿûÿñÿìÿìÿçÿìÿöÿçÿñÿçÿñÿìÿìÿöÿöÿìÿöÿìÿÝÿñÿìÿöÿûÿöÿûÿöÿöÿâÿìÿØÿìÿöÿìÿìÿöÿñÿìÿìÿöÿìÿöÿöÿñÿöÿñÿìÿìÿñÿñÿâÿìÿìÿìÿìÿìÿìÿìÿìÿìÿöÿìÿâÿìÿöÿâÿìÿçÿìÿ°ÿ°ÿrÿìÿÎÿ°ÿ°ÿÎÿÎÿÎÿÄUDDEFGGHHIIJJKKLLMMNN OOPQRSTTUU VV WW XXYZ [[ \\ ]]¢§¨¨©©ª­³³´¸ºº»¾¿¿ ÁÁ ÃÃÅÅÇÇÉÉËËÍÍÏÏÑÑÕÕ××ÙÙÛÛÝÝááããååùù     !! ## %% ''++--//113399 <<>>@@vv VVnnŒŒ¢¢¬¬ ®® ¶¶ ¸¸ ;; " " # # % &EDDFHIIJJKL MMOO PQRRSS TTUU VVWWXX YZ[[\\]] ¢¨©­¯¯ ³³´¸»¾ ¿¿ÁÁÃÃÅÅÇÇËËÏÏÑÑÕÕ××ááããååññ    !!##%%++ -- // 11 33 99<< >> @@ 22 nn ¢¢ ¬¬®®¶¶¸¸;; " &iDEFGHIJKLMNOPQRSTUVWXYZ[\]¢£¤¥¦§¨©ª«¬­³´µ¶·¸º»¼½¾¿ÁÃÅÇÉËÍÏÑÕ×ÙÛÝáãåù !#%'+-/139<>@vVnŒ¢¬®¶¸; " # % &@8ÿØÿìšš©©ªªÅÅ›š©ªÅüX¶ÿâÿìÿâÿìÿâÿâÿØÿâÿìÿöÿâÿöÿìÿìÿìÿØÿìÿìjjkkssuuzz~~……‡‡ˆˆ‰‰ŠŠ‹‹‘‘“• kkww~~……ˆˆ‰‰‹‹””––——™Æjksuz~…‡ˆ‰Š‹‘“”•" ‡ÿèDåÿ`Šnš  &,28>DJPV\ÿbÿ²ÿ‰ÿò#B</8}8,41,‘4 #%26>BDFLRV ¡¨´âä &,28ÿDDÿnDÿXIÿuÿT;ÿL( & Z  &,28>DJPV\bhntz€†Œ’˜ž¤ª°¶¼ÂÈÎÔÚàæìòøþ "(.4:@FLRX^djpv|‚ˆŽ”𠦬²¸¾ÄÊÐÖÜâèîôú $*06<BHNTZ`flrx~„Š–œ¢¨®´ºÀÆÌÒØÞäêðöü &,28>DJPV\bhntz€†Œ’˜ž¤ª°¶¼ÂÈÎÔÚàæìòøþ "(.4:@FLRX^djpv|‚ˆŽ”𠦬²¸¾ÄÊÐÖÜâèîôú $*06<BHNTZ`flrx~„Š–œ¢¨®´ºÀÆÌÒØÞäêðöüXtvZiMtŸL?¶sŠFˆdZEvHßQJ- J'$¡'ÿ8.‰wÿ8„¾08jÿ8-ÿ8‰"Ø(ˆÈühhhhhhýhhhhŽŽš™ggŠŠŠŠŠrrrr[þþþþþþ£††33333!!!!ÇÇhhs"hh z"?I,hhhh¤•¤Š¤–¤Œ‡/‡/‡/l#l#l#l#l#OÇOŠ8v'Hÿ÷6Ïÿ8wÿ8#hþhþhþhþhþhþhþhþhþhhhhhhކŠ3Š3Š3Š3Š3Š3Š3Š3Š3r!r!r!r!r!Ç[Ç  î" qÏäF.ó. 冟ú*.%$=D]‚ˆ4Š˜;›ŸJ¢¨Oª±V´¸^»¿cÁÅhÈÙmÜÝêïòó‡‰*38:™bcœeežqrŸõõ¡ùù¢&&£==¤ÄÄ¥êó¦öý° ¸ÄÆ")Ð.7Ø?Aâ ¥ ½å ¿ ¿þ  Âÿ Ä Æ ¶¹¼ÀÃÓ ÙÜçéíî!óö#ùú'üü)ÿÿ*+ÎÎ,ÒÕ-1ÆÌÒØÞäêðö,28>DV\bhnt†Œ’˜ž¸¾ÄÊÐâèîôú $*06<BÿZÿýÿZÿZÿKÿ4ÿZÿZÿZÿZ ––ÐÿZ ––`ÿZ ––`ÿNÿZÿfÿ|ÿZ ––0ÿZÿZÿZÿZÿZÿZ ––ÀÿZÿZÿZÿZÿZ –– –– ÿZÿ@ÿ:ÿZÿ- ––@ÿFþÝÿýþöÿÿÿ:ÿÿþöÿÿþòÿÿþòÿÿþàÿÿþÏÿÿþôþáþìÿÿÿÿÿ ––ó”Öþ yôú $*06<BHNTZ`flrx~„Š–œ¢¨®´ºÀÆÌÒØÞäêðöü &,28>DJPV\bhntz€†Œ’˜ž¤ª°¶¼ÂÈÎÔÚàæìòøþ "(.4:@FLRX^djpv|‚ˆŽ”𠦬²¸¾ÄYÚqÚsäHÚgÚ[Ú‹ÚuÚ¤Ú¡ÚFÚ@Ú¶ÚyÚ‡Ú[ÚƒÚsÚHÚHÚnÚQÚÛÚXÚEÚ@Ú&FÚ'&+Ú$&åÚ&>ÚÚŽÚ0ÚÚ¾&O&6&A&&ß&&¢¢9&†&säcÚ%&jÚ,&œÚŒÚ&mÚ-&kž‡Ú6&nÚ9&ú&‡Ú-&,6&'`ÚiÚfÚ&“Ú‡Ú1&‡Ú1&jÚ2&jÚ2&VÚ&!þø( nBüä@,, èƒ÷, $=D]‰‰4ÆÇ5ÚÛ7ðñ9óó;45<]]>bc?eeAqrBxxDª«EõõGùùHI11J33K==LKKMNPQ*-S89W<=Y ¥ ½[ ¿ ¿t  Âu Ä Æv^_ ´Ýäææêì ðò#÷ø&ûû(ýþ)+-¾¿:ÂÅ<ÊÊ@ÍÍAÏÏBÖÖCD$6<BHNTZ`flrx~„Šœ¢¨®´ºÀÆÌÒØÞäöü &,28>DJPV\bhntz€†Œ’˜ž°ÂÈÎÔÚàæì¢¢ÿDDÿnD ––€ÿV3ÿVDÿVDþÞDÿY5ÿZDÿXIÿÿY:ÿ DÿYDÿUÿUÿDÿX0 ––PÿY7ÿUÿuÿuÿUÿUþÊ$ÿP/ÿ[0ÿX-ÿXÿM/ÿU ––Pÿ0ÿGÿ3ÿ>ÿs ––ÿ=ÿ[þîÿþÕ.þÕ.þÏ0þÚEþþþñþóþíþúÿ þþÿþòþÿþþþëþ÷þö ––€þö ––€þöþÍÿÉþ©Éþ¸ÿÿÌÿ2–®œ ‰&,28>DV\bhzŒž°ÂÔæøþ "(.4:@FLRX^dvˆš¬¾ÐÖÜâèîôú 0BTfxŠœ¢¨®ÀÒäö,>Pbt†˜ª¼Îàò "(.4:@FLRX^djpv|‚ˆŽ”𠦬²¸¾ÄÊÜâôú $*<NTflrx~„–œl –– HÅÏÇrÏ ––c§€è ––€¶ ––| ––@| ––| ––@| ––@| ––@| ––@GGGG´´À¿ÏÏÏÏÏÃÃÃÃƒà –– à –– à –– à –– à –– à –– QQQQ¤¤®®{{{{{á –– á –– á –– á –– µ –– µ –– µ ––Ï€Çè ––| ––à –– | ––à –– | ––à –– | ––à –– | ––à –– | ––à –– | ––à –– | ––à –– | ––à –– GQGQGQGQGQGQ´¤Ï{Ï{Ï{Ï{Ï{Ï{Ï{Ï{Ï{Ãá –– Ãá –– Ãá –– Ãá –– Ãá –– µ ––ƒµ ––¨ŽbR-Ô –– bO&$$((,,2288<<DDHHLLRR XX \\ ‚‡ Š‘”˜›Ÿ¢§$ª±*´¸2»¿7ÁÁ<99=bc>qr@êóBöýL T`b")l.7t?A~ ¨ ¨ ¬ ¬‚ ² ²ƒ ¸ ¸„ ¼ ¼… Ä Æ†{Ìö <BHNTZ`flrx~„Š–œ¢¨®´ºÀÆÌÒØÞä©&Ñ&©&]&Ç&Y&³&³& & &©& &Õ&½&Ç&Ñ&½&;&Ÿ&E&³&Ÿ&£&Ÿ&©&&Ñ&Ñ&Û&D]ÏÏ  ]]µÿþ!þÖ Y´ºÀÆÌÒØÞäêðöü &,28>DJPV\bhntz€†Œ’˜ž¤ª°¶¼ÂÈÎÔÚàæìòøþ "(.4:@FLRX^djpv|‚ˆŽ”𠦬²¸¾ÄW#WWWWWWWWW^lywyqyoyYyyqy¡yy:y9yµyzy„yXy‚ynyPyEyryKyÝySyDy=y%H%$%&%#%¥%$%/%Œ%Š%%ˆ%Â%5%1%B%%†%% %,%%‡%%%%÷" mØôßE**å…ù ¿$= D]$ ¥ ½> ¿ ¿W Ä ÄX ÔÕÖרÆÇÈÉËÐÑ 28>DJPV\bhntþàþôþñþ~þlÿ)ÿ)ÿ/ÿ)þÂ)þTÿ)ÈŽê P¢¨®´ºÀÆÌÒØÞäêðöü &,28>DJPV\bhntz€†Œ’˜ž¤ª°¶¼ÂÈÎÔÚàæìòøþ "(.4:@FLRX^djpv|ØyØHØÙ&ØLØpØgØRØ]ØAØäØ^ØØSØsØUØ_ذØq؉Ø|ØLØØ6Ø^ØÅØSØzØ^Ø ØØØõØvØ]ØËØpØ! ðï!ã!l!#!!'!C!!-!Z!0!.!8!X!!á!!ÝÁ!.!!Á!À!À!ˆ!5!!`!#!!! !}ä‹ÏÂ!×!8!î°kêÚyú iikmpqvŸ¡¶/»¾EÀÁIÆÊK ¡¤¦¨¯±ÞàáÒÓÔÕ £>DJPV\bhntz€†Œ’ÿ?&ÿt&ÿX&ÿY&ÿX&ÿƒ&ÿY&ÿZ.ÿ^=ÿ@.ÿ<#ÿ:%ÿ_8ÿc8ÿ 0&@ Ý ÝÉÝÇÛ Hª²´´ *06<BHNTZ`UA--UUE*7Kî& <z€†Œ’˜ž¤ª°¶¼ÂÈÎÔÚàæìòøþ "(.4:@FLRX^djpv|‚ˆŽ”𠦬²¸¾ÄÊÐÖÜ^6žU˜ÜYP’úNc^ÝYT4>JnÌ£{ ,††††Tÿ’J,¢TÈÜTÉÈT,TJJh̪†”J"6&¾ÌÎÒÔÛ 0 0 : = @ Z!ª²´´ *06<BHNTZ`T@,,TTE)6J|`† Bޔ𠦬²¸¾ÄÊÐÖÜâèîôú $*06<BHNTZ`flrx~„Š–œ¢¨®´ºÀÆÌÒØÞäêðöü &,28>DJPV\bhntz€†Œ’˜ž¤ª°¶¼ÂÈÎÔÚàæìòøþ "(.4:@FLRX^djpv|‚ˆŽ”𠦬²¸¾ÄÊÐÖÜâèîôú $*06<BHN@Š“XrXÞ2xX,Xr2‡XXÞ2lX6XQ2ŒXTX22TXX[2mXÜXW2ŽXTX]2XhXLX‘Xö2yXXü2…XXÒ2XrX]2™X^Xy2ŽXhX”Xy2‰XúXX2šXrXz2ªXcX9«X6X2§X@XnX=X‰2“XTXV2XTXè2vXX'2‹X¤X»2¾XšX–XXXX’XX%XX“XXM2uX,XèÜ¥X†XèÜuX†X£X†XiX†XuX,XuX,X“XJXX,XX,XuX@X‰XJXkXÈXuXÜXX^XMXÓXkX"X‰X@X X†XXTXuXX“XJX“XTX“XJX“XTX“XTXuX,X‰X¾XÅX¸X+2EX–î2ÖXý2®X/ª‰XþX…2)XX¾Û - - / 0 : Z!³µ¸,X,ÚXì¾ 6ntz€†Œ’˜ž¤ª°¶¼ÂÈÎÔÚàæìòøþ "(.4:@FLRX^djpv|‚ˆŽ”š ¦¬Ú€Ð€ú€¶€ € €”€p€„€D€þ€D€l€€0€€€€€€:€€€Ì€&€€€ô€€€€ê€þ€€b€þ€&€Š€ô€€€ê€–€þ€Š€&€&€€0€&€Ì€Æ€f€Ð€`giŠŒŒ*—›+¨¨0 v v1 Ž ‘2]^‘’“”¦§"(.4:@FLÿ\€€ÿA€ÿA€ÿA€þû€ÿ\€ÿe€î$ <z€†Œ’˜ž¤ª°¶¼ÂÈÎÔÚàæìòøþ "(.4:@FLRX^djpv|‚ˆŽ”𠦬²¸¾ÄÊÐÖÜŒÿìŒÿì@ÿìxÿìnÿì–ÿì´ÿì–ÿììÿì<ÿìªÿìZÿìÿìxÿìFÿìFÿìFÿì‚ÿìnÿìdÿì ÿìŒÿìdÿìdÿìÿìxÿì ÿì2ÿì(ÿìxÿìÿì<ÿìZÿìxÿìxÿìZÿì´ÿìnÿìFÿìPÿìZÿì(ÿì<ÿìdÿì<ÿìxÿìxÿì–ÿì‚ÿììÿØZÿØŒÿì–ÿìTÿºnÿÎnÿØ–ÿØ‚ÿì–ÿìŒÿì`cfŠ—›)¨©. u v0 Ž ’2 • ™7 þ ÿìþ ÿìD6L  $‚ÿ´‚ÿ´‚ÿ¾‚ÿ悎‘’“”]^ ÿ€ÿÝ€2þZ >~„Š–œ¢¨®´ºÀÆÌÒØÞäêðöü &,28>DJPV\bhntz€†Œ’˜ž¤ª°¶¼ÂÈÎÔÚàæìÚÿöÊÿöøÿöÿö&ÿöÚÿöbÿöÚÿöNÿöþÿö:ÿönÿöÿö&ÿöÿöÿöêÿöÿöþÿö0ÿöÿöÿöÂÿöÿöÿöÿöôÿöÿöÿöÿöêÿöôÿöÿöbÿöôÿölÿö¼ÿöôÿöÿöÿöÖÿö–ÿöŒÿöþÿöŠÿö&ÿöÿöÿö0ÿö®ÿöHÿö0ÿöÌÿöÆÿöpÿöÐÿöÚÿöôÿöÆÿö†ÿö¼ÿö˜ÿö`cfŠŽ)—›+¨ª0 v v3 Ž ’4 • ™9‹‹•–«« ` b d o š Ÿflrx~„Š–œ¢¨®´ºÀÆÌÒØÞäêðöÿ~ÿöþÞÿöþÞÿöÿ ÿöÿ`ÿñÿ`ÿ`ÿñÿ`ÿñÿ`ÿñÿ`ÿñþòÿñÿ$ÿñÿ`ÿñÿ`ÿñÿ`ÿñÿÿûÿ`ÿñÿ`ÿûÿ`ÿûÿ`ÿÿÿ`ÿÿÿ`ÿÿÿ`ÿÿÿ`•ÿ`w€f† $*06<BHNTro‚oJooÚoîoºo¦odo–oÈo âìîðñò()*-ßþÊpŠn  &,28>DJPV\hÿ0ƒÿºlÿVlÿ~l(бlPlxlÿ¦ÿâÿû æ#$%&'()* àÿ:lÔ^ø jÖÜâèîôú $*06<BHNTZ`flrx~„Š–œ¢¨®´ºÀÆÌÒØÞäêðöü &,28>DJPV\bhntz€†Œ’˜ž¤ª°¶¼ÂÈÎÔÚàæìòøþ "(.4:@FLPll`lÄlºllØlãÒÉjtlÄl6lTlœl´lºlöl klöldldlPl°lœllœl lâl<lœllØlØlˆlˆlœlìl°lØlVlVl2löllˆl(lˆl<l’lŽll4lœl´lºlnllœlˆlØlPlPlêf\i`d hh"hhh^h$iegHcžge/e:cœc¬h²d hþgþdûd¨iŽgÍc¶gºk½g·edõiødþdødÍg˜i¢eŒeþg e¨ggãåçîñ 23,,46=5TU=XX? å æ@  ,B 1 8Z > >b @ @c G Gd J Je P Pf T Ug ] ]ißà#$%&/12  - /BHNTZ`flrx~„Š–œÿ•lÿ‘lÿËeÿŽlÿœlÿŒlÿkÿËaÿeÿjeÿÎe eÿºeÿºeÿºeÿºet.Œ dÊÐÖÜâèîôú $*06<BHNTZ`flrx~„Š–œ¢¨®´ºÀÆÌÒØÞäêðöü &,28>DJPV\bhntz€†Œ’˜ž¤ª°¶¼ÂÈÎÔÚàæìòøþ ”¬²ø…ÿúRÿòf\R_ÿô4ÿ÷”ÿôQÿö ä>‡ÿÛøäÚ€‹”î²Ð6ÿôVÿé>ÒÃÿ‘€*€HVÿ¶”ÿì¶ÿí²fÿì€ÿ$Nÿ$ŠÿìÐ HHø\* Nÿô`ƒÿ“MÿÈ}ÿÃfÿ¬íÿj6ÿ®Çÿ¦?ÿ-(ÿ31ÿ3øÿh‰ÿ0šÿ0†mÿþ”ÿ¶–ìÿsåÿÿ‘øÿ‹Ûÿ™ÿ”åÿŽ˜R­ÿý‹¬ø f >ªÿçøŠŠî€ÿ¤†ÿî\ÿêý ó6=% Þ æ- í í6  ,7 2 8I < >P @ LS P P` T Ua ] ]c  !"+045@A *06<BHNTZ`ÿW ÿ}ÿoÿƒ‘ÿÿóþéÿéÿ%ÿéÿ%ÿéÿoˆÿˆü– 1djpv|‚ˆŽ”𠦬²¸¾ÄÊÐÖÜâèîôú $*06<BHNTZ`flrx~„nà|¦ðšÜàæ6: /£T,PÖð·î¤ãÂæ®ð€T¤úàú”Ü̪†è€úÈ4n sd1–%Á¸øÿÄÿâÙÿù«ÿºƒªçÿÓÓKx­É-ÿì#ÿì-ÿìÿö7ÿöT1óôõöøùúüýþÿ     67<= Þ         ! " & 4 5 6 7 T U 0 R S$ÿÿìÿ„ÈÿÄÿÎ& ÿ’ÿt"$ÿoÿ’ÿ[ÿQ˜@F "FLRX^djpv|‚ˆŽ”𠦬²¸¾ÄÊÐÖÜâèîôú ܪ\È*–*È*‚È*‚ÿР  ÿøxÿø–ÿø–ÿøÒ*n – –*´ *Ò* * *È*‚*x*d*d 6 x*x*x*n*dÿäxÿvô  !þÊ<H2ÜÈâAD\""âA9D\_ɉo1ÃÞYïËÅÛ]plee-the-bear-20251226/bear-engine/doc/examples/04-text/main.cpp000066400000000000000000000104271512343254000237700ustar00rootroot00000000000000/** * \file * * This example program creates a window and displays a text in the middle of * it. * * In order to make this example minimalistic, it will not use most of the * functionalities of the Bear Engine. Consequently, we will have manage the * exit of the program ourselves. * * The SDL is used for the subsystems of the engine. Thus we can use its event * system to detect when the user wants to quit the program. */ #include "visual/font/font_manager.hpp" #include "visual/scene_writing.hpp" #include "visual/screen.hpp" #include "SDL2/SDL.h" #include /** * This global variable is observed in the main loop in order to exit the * program as it becomes true. */ bool g_quit(false); /** * The font manager handles the loading of the fonts and their use at various * sizes. One can do without it but it is really easier with. */ bear::visual::font_manager g_font_manager; /** * This function processes an event of the SDL. If the quit signal has been * sent, then g_quit is set to true. Otherwise the function does nothing. * \param user_data Ignored. * \param event The event to process. */ int event_filter ( void* user_data, SDL_Event* event ) { int result(0); switch ( event->type ) { case SDL_QUIT: g_quit = true; break; default: result = 1; } return result; } /** * Initializes the visual module of the engine and registers the event filter to * the SDL. */ void init() { bear::visual::screen::initialize( bear::visual::screen::screen_gl ); SDL_EventState( SDL_QUIT, SDL_ENABLE ); SDL_SetEventFilter( &event_filter, NULL ); } /** * Releases the visual and input modules of the engine. */ void release() { bear::visual::screen::release(); } /** * Creates a writing given a font file name, a text and the size at which the * text must be rendered. * \param font_file_name The path to the font. * \param writing_text The text to display. * \param font_size The size at which the text must be displayed. */ bear::visual::writing create_writing ( const std::string& font_file_name, const std::string& writing_text, double font_size ) { // Open the font file. std::ifstream f( font_file_name.c_str() ); if ( !f ) std::cerr << "Cannot open file \"" << font_file_name << "\" from current directory.\n"; // We pass the font file to the font manager and let it handle the loading. // The first argument is a unique identifier for the font. Here we use the // file's name. g_font_manager.load_font( font_file_name, f ); // And now we can get the font to render a text at a given size. bear::visual::font font ( g_font_manager.get_font( font_file_name, font_size ) ); // Once that we have the font, it is easy to create the writing. By default, // the text is aligned on the top-left. See the documentation to limit the // text to a given rectangle, with automatic word wrapping, and apply other // alignments horizontally and vertically. return bear::visual::writing( font, writing_text ); } /** * Creates a window and draws a text in it until the quit signal is received. */ void run_example() { // Here we create the window; it will be immediately visible. // The engine does not support multiples windows yet, so be careful and be // sure to create only one of them. // // As soon as the screen is created, a render thread is created bear::visual::screen s( claw::math::coordinate_2d(640, 480) ); const bear::visual::writing writing ( create_writing ( /* The path to the font to use. */ "FreeSansBold.ttf", /* The text to display. */ "Some text,\non\nmultiple\nlines.", /* The size of the font. */ 24 ) ); // The scene_writing is the scene element which places a writing on the // screen. Here we set its position such that the text is centered in the // window. bear::visual::scene_writing element ( 320 - writing.get_width() / 2, 240 - writing.get_height() / 2, writing ); while ( !g_quit ) { s.begin_render(); s.render( element ); s.end_render(); SDL_PumpEvents(); } } /** * Initializes the engine then runs the example. The engine's modules will be * released before leaving. */ int main( int argc, char* argv[] ) { init(); run_example(); release(); return 0; } plee-the-bear-20251226/bear-engine/doc/examples/05-keyboard/000077500000000000000000000000001512343254000231515ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/doc/examples/05-keyboard/CMakeLists.txt000066400000000000000000000031351512343254000257130ustar00rootroot00000000000000cmake_minimum_required(VERSION 2.8) #------------------------------------------------------------------------------- # Find the root directory of the source of the Bear Engine. This directory # contain the bear-engine and bear-factory project directories. if( NOT DEFINED BEAR_ROOT_DIRECTORY OR NOT IS_DIRECTORY "${BEAR_ROOT_DIRECTORY}/bear-engine" ) message( FATAL_ERROR "I can't find the Bear Engine. Please set BEAR_ROOT_DIRECTORY to the path of the engine's root:\n cmake . -DBEAR_ROOT_DIRECTORY=/home/joe/dev/bear\nCurrent path is \"${BEAR_ROOT_DIRECTORY}\" and it doesn't contain a bear-engine directory." ) endif() # The engine comes with some CMake scripts to ease its configuration and usage. # These scripts are in the directory below and must be assigned to # CMAKE_MODULE_PATH in order to be found by the upcoming include() instructions set( CMAKE_MODULE_PATH "${BEAR_ROOT_DIRECTORY}/cmake-helper" ) # This will sets the variables of the source directories, required by the CMake # package below. include( "bear-config" ) #------------------------------------------------------------------------------- # Include Bear Engine's CMake package to find the libraries, the link paths and # the and include paths required by the engine. find_package( bear ) include_directories( ${BEAR_ENGINE_INCLUDE_DIRECTORY} ) #------------------------------------------------------------------------------- # Now we can describe our project. set( TARGET_NAME ex-keyboard ) file( GLOB SOURCES *.cpp ) add_executable( ${TARGET_NAME} ${SOURCES} ) target_link_libraries( ${TARGET_NAME} ${BEAR_ENGINE_LIBRARIES} ) plee-the-bear-20251226/bear-engine/doc/examples/05-keyboard/hourglass.png000066400000000000000000000150171512343254000256720ustar00rootroot00000000000000‰PNG  IHDR9Aki )bKGDùC» pHYs  šœtIMEÝ 7.v T®tEXtCommentCreated with GIMPWwIDAThÞå›{´¥Euà»ê{sî=羺ûÞ¦º°!m7 ¦ A ‰2š`Bt’8.ÇÄ,åkI_$fåáÒ‘ñ91ŽÉ¨Kd£¸’¨#´ ¤Á~Ýî¾}ßçõ=ªjÏç6i ’Çšúç®SU·¾ý«½wU}õí-w}":«,ܽ#ͯŽÈŒ´ Ä©ÅOY¬ `„àYœCÄYŠ!qj¨dIÄâR‰APKð Æ"¢ Šª¡ôõ‚!'bq¥ÃFe¥c(+OY)E©4UP,>TÀU¼bâçýU¹û¥og'€}Å Ãa#‚1‚1-ÁNAE xCWBU¡àÔàTñ^qz¹’ؘåÅŠ´!aÔÒÏ=E%ôú%Â9ÃÜRElRú}G–%Á<¸ €!E4:øíˆµ”eÀ«ïÀ{%ˆà*E‚ÁE…“^pµ[þޝD±òRiwx'DXk0xld0€Š ( ï@=ˆQ²ØR:‡1† °°ìˆ#è9ƒHDð^p•#Š"æ+âÄRyKî ¯@z^_IcEŒÅ{"8ï0ï eÈ2Á0xJ7°ˆ çÚu ÎCPÄWô"ôKCYB”ò2 ý@šY$@)ˆJ bWøG5âƒ'CšÄfôûÝ^Ÿ$6D±ALD?w¥à/,sëWJŒ€b”ª4 ÈBU0 €B‰‚\E1PBP(< ( êçJY EA¡Zi@@rF€ÎAdÁðA©×,®ô¸ ŒµUÊJ(}ŽÁ0ÜjཧÛ-I!"Ç|;PK"z½’$‹È œ£àQ PVB¥àœ`D)+]ñ?‹¯ÎC¥à¼4(! d÷~²Ó“»‹Rw%âÕP:ð¥*¢‚($‰¡ðk!Š‹HðŠ¥¨¦íKŨAŒE–ÝÅãUÍTõVUÍVªjƘµÇÚs›æçç¯,ËòEÞûKœs;BÏöÞ?Ë97UE Ðét†UµÉ –K/½4ú“?ù“©êƪª.9V/"#‘óôN§s*`^úÒ—N=Fæ)æÇ¾ßÐÐPODÚ@}rrrçŠÌœä}Àï}·ÙlN[ V4íŒ1ËI’تªÒ4M#cL¦ª‰÷ÞŠÈ)"c–£(JOrxx89zôè\’$‘1fÀòòòäW\ñÏdMÓÔxöŠÌ'ù UýÙ$I–Š¢(€¥$I²ãüã‡Î¹™²,}Áöz=±ÖVƉãXT5‹ã؇ú'øÚ×¾Ö9r$ÛºuëÐ=VÉ%— ?ÑÇJQ'ÓÀÏß8QÈeÉ€~’$é›ßüæ´,Ëè8¿<,"ÒjµŠ‚o6›ðUUUÆ¿¸¸¸ Ñh,ä?øÁ$Itá…zàÈJõøË_þò¸Ûíþ3˲l2ÏóË')"¸øU}äºë®›Òã¿[UËn·›WU%eYªªR«ÕðÞ›ÑÑQáé•ôª«®²EQÌ‹HñññáË/¿|uUU?xŒŒQžçeš¦—w®È̉n!þK»ÝþA–e«ßò–·DÙ_¾Ùh4jišæI’ˆ÷>ʲ,íã™ÖS)ªê7nÜ8Ÿ¦éⱺ~ô£ëŒ1:66öÈñ}W¯^=Õjµö¯Z‘•†‘EU}°Õj콟»þúëǶlÙòè2~×]wÝ⦅õÞ HQ’e™8ç’§YÅx³Ù<""à¹Ï}îèÅ_¼ù3ŸùÌ×W| 8räÈáÅÅÅ3Tuˆ,þ¸qåIfvð{ï|ç¯ÌwÞó'~ø«EQI£QgãÆõ¬ZµiÃi§½êN î­^¯¯ÍfMVÌç+' ¹°°ŽŽVÇ~OOϾpjj|·ˆìûð‡_xcU…þöíÏOï»ïoß6>>ÄÖ­/å´Ó.['"Ÿ6ä è~èC¿ý¦¸GwìxŽÜwßß²víÆÆ4›±NM)gœñsôz=jµ5,-í§Ù̘™¹áá&ý¾cddø-N§BÌÑ£3¤iåå6"§Ÿþ,¾öµo°qã©=:Ïèè ³¬_éøáÃÓ/úÞ÷n;err-û÷Õ©©-â\NQ,‘¦£\}õŸ½KD®{2†'…Ìón–¦õ›n¸áŠßJX¿þtÚíDQÎÆkY·n‚$ÙÄ)§lÅ9%Š"D”……/â}9x‹÷µZʾ}3¤i‚1ç`y¹‡11UU’¦5FGÇxøá²~ý¹Üyçn††ÚX3?¿Äڵ率ÚµVã7þôÐÄĦ"R>ƒy²YÖȽw¿{íµÿã¯Cæç÷Ñl®Ç˜Ò´Æ¡C3´ÛqàÀt: ´ÛK8WE£”eÅêÕãt:=z½.ããk0&¢Óé#bH’”ÁÉMÈóЇz‘aœs u©×[,.z¦¦Î%„Š}ûöÐhÔôW~åíû'&6÷TŸä`ó÷·Zk^ùÚ×~ô{")33ÇÂâb‡ååcr&&k»4›-úý>ÎÑnwé÷ûLN®¡Ù<‰,³$I<¸™Ÿ'ŽcŠ¢¤Ù CC-ªªËôô÷Ed„³Ï¾Œ~–üÇ»¨ªRí×þðÈÆç?GD¦Ÿª¯Ë‰­~½á¢è}õÏÿü­ç†°_“i4êlÞ|2Þ· lÞ|N‹µkO¢Ýþ*³³›Ä¹œv» (Öj­gtô4ú YÖ ª3Ï|É×ëõÑ7ý$fù/ùO‹Ó¬dÙø[xàÏßsäÈßamFQ„P¡Q¯¯&„.½^“O¾„-[^ö¶vûÈ4›“úLÈcž‰Akµ ‘kµ)¬ÝÀÂÂ2iZ§ßwÌÍÍÓ릧Q#¬Y³ãË"rã3øŒA>:¸ÑçmÜxËË5”¥26¶‰U«Váœpúé¿À#|óÏx†Ë3 yòÉ¿xO¿_ÇÌa >Ü¥Ýî°¸Ø!8ï¼ß¼ëß5äà€ïÕ{h4†Pµ¬^=ÅÜÜ,EQjÅüK”è™\UG¢(.z½nšç}Ù·o†V+åÌ3O§ßŸ•Ÿ÷ªªF¹·š‘×ÏÌŒ½À9½'„@£Ñ`x¸A§ãPeû¾ðé¯ÇqüÛÏ´&åÒ oæDäfàð'?ùêw8ðýëFFÆõ¼ó®üßçœsåo‰ÔÆ~ðƒ¼bÓ¦MBx·µößþ¢ª¢ª·‹ÈÇÇÇÇý—¾tãeIâ¯k4@!çœsõÛº]ÿ,àð©§žúéûï¿Ñs‹ª^¸2Aÿ6!Uõ"à“À‹>ñ‰O¼ø `gggçî¿WïÀ½dYJšÖøÜç~g³µöˆª¦QÞ²e˯½öÚÿZůÿke¬;EU/RÕ[Þ÷®w½ë‚7¾ñ[—––Î*ŠâGµ›o~ݶ?ýÓ_ÔÛn{ý¶Ç¦œ L¨êUýUý¿:láBUý?ÓÓÓ7]yå•ÛŸóœçl:tèÐyeYN7õ²,/!œúÇ|Ùùÿø¯?¡ÏµZ­ÇÞ뎨ê®À^ø/º…„Ry÷ìììðË^ö²÷\~ùå þð‡7ŽwEäïW>«Å"riasERÅߎŽL 7žpÜ¥¥%·r÷:•¦é¡•»Ô7«êð{ªz%ð6)žQíyï‡Tõö›nºéU;wî<[U_Üét®TÕ©ãú\R–åuÞûß/ËòÚ^¯7v¬íúëÏ}ÏS0ÿÌÍÍýÌãÔ?WUÿZU‡žIó\§ªwlß¾ý’/ùËÏév»/QÕ‰cíwß}wä½užç¯é÷û飯ê÷¼÷šî§>õýÜç~ëÎ']›{¶ª¾Ö9wê〶TõU]÷Sß'CëUõ†3Î8ã»ví²Æ˜™V«õÝã^ !üŽsÎUU5’e™³ÖÞ%"·—ß»¸¸°mh¨!n¸êª¿ºþ‰žÕívëišž¦ªçGQô1ñmﮑý?Èüüe—]ö¦|àk7oÞ¼WDöüÓ»cÿÜ8ŽÕZÛuÎYkmZE?˲w}ñ‹¯ÒÉÉU[™Ý}ðàA&&Fˆ"«ËË9ÿüŸ?ÿ´ÓÞ¸ë L¶^Åkíº8Ž?ù8íMàÓÀ/?}JŸ n¾ùæïlذá¾3Ï<ÓÔjµ8Îÿ~És÷¾ïœ3@ªªÇñ®(Šn¸ýöWh¢è’çCC#TU…sÕõ¿þ럾቞ëœ;ED¶ªj/Š¢¯>Ž\/‘7ÿD‡Uݰ¸¸ø¬k®¹æoÎ>ûìF–e÷×öBçÜŽ²,—ÇqE‘clUU÷ÜqÇkvgY¢U•3>>ÆÚµ“Ôëql‰"óK?þB;Ú !lPÕÓŽ³¬Ñ•sñßëV>J=}ÈÂoßrË-ŸŸžžîE±çXtE»Ý> øï}áœK«ªJʲ´ª_«Õ¹ýö—ïNÓdkU25µ !Š Ýî2¬^½jç­·þ§óŸäù½Â#Þû‹¼÷«Wê–skV&ú¿×>mÈv»=º°°ð³×\sÍ€Žˆt޵Åq|y»ÝöµZMEÄGQ”eY¶EQ7I’{o¿ý?»^O¶ª£ªJ²ÌÐé,dž¥¥Yò¼ƒˆ½ñSŸºzÇÉ`­Ýc­U "rÞŠ†½ˆPUUÃóu`óÊ^zâ>Ùëõ~÷k_ûÚüòòò‡®¸âŠV½^Ÿ]™É¡²,ßÇqT º´4½)Ï|ÍÞ½Ȳefg¿«cc™„`¨×-ƒ×¬!æçHÓ!Ž™!„ÀÒR11Î]ÿú×ñ†'ãÒZ­Öé÷ûÛjµÚ"2«ª=UÝhŒù~á…"òlyÏ Aªj¤ª7?ïyÏ{ëW¾ò•Yý•a³1æEªÁcîÝû­—OOßÿóÝn›õë×03³›z}çºdÙÐ#Ž- ËœtÒóó] ZUU·V«Å­V‹³Î:kι Àð=UÝr¢«ë¹Ÿýìg¿ ø}ûö~|Ã7þê,,ÌnÊó%–—çh·—HÓ„zÝÐëÍ11ÑBD1¦¤VËX^n“$1õzv»Íèh‹¢è366Æøø8Ö¬5ŒOÐëµI¡^ÏäÁïßúÞ÷þò½++ê¼÷þpQ‹££££@røðaœsK¯{Ýë&nºé¦ï‰È¹Or%f4Û³gO¾cÇŽ3ï½÷Þ‰mÛ¶ÜpÃåÛj5¿½ßß/!ä„ÐcxxU!Š"ŽùµZŒ1ãã-:.ƵZA$ŒÐét©Õê¬];E¿ßEÄ04Tã”SÖ‚Òëuh6›ŒOÈÑ£³g½÷½/Ü–ç‹wEQ%Iâ’$y`xx¸øØÇ>6œe™œsÎ9É_üÅ_=Q¼kôÄWýµhÕªUSßüæ7uçΫ¾óï,®^=±ÛûG>LY&McªƹŠññ&EÑÇ{K¯7ðQçÝnZ­NE ³¸xˆùù4 òÜá}LQäyÎêÕˆÎåX »ß÷¾—n{Ã>ÿý•Ø¢UÖZ»iÓ¦‘~¿_lß¾}dnn®þ¤ûäß‚‡ëQ?Š„JYý¤ÿxåÃ÷|ìÿ¶«U›ZuíÔkùBaÖ^Pjzv§½,ëÖO1stŽ,nÑíöHC’DŒŽŽ²´¼HšF¤IÅ¥eÒ$Á%Ž#––;$qF¯—ƒ*yáQ„#G`~a™~?§ÙlÒíö16aq©ÃæIûÞ²,mZ[ÕÜýï1µî”t|¤ÞCÍï?ðíùóá•—í¹÷/oåR.ÀßöŠw³åžO™»Ë•Ȫ2d‘ƃŒœcŽ™³!Ž UYáW"ömdqÎcÄP:%ŽÕá‚ǹA°¾Š¢^^)*%M€ . ^èJ­Q•² ÄQ„óàœ¤fTŠS°&B5à}@$ƽ¾#ŽB&1ƒŒ"Ïù×¼WwEy®çûHˆcC^)¾äS”ê™Á;GP0!€1‚ a>a#ƒ$Õ@ÔŠ2€QG°@’DtÛqbQcqê(1”!`èwÖÒ8¦_ÊÒ#fðe:.Pª#McÒ,ei91h0tûŽ4‰p•G¤iö|èïŠú}È%@SU0ЊC¿€ÁUŠ×€¨`£ÁÌc)«©…ˆ"KYuз³b­!xav¾ ˺½ $ bÉÈ¥ta»UŒŠBé—"–(Jj,&5háèõ*œ:²8¦Ó¯¨‚RKc*_aÄ"ÖÐ-¯šÑrOIbAKOék@Ô+U¥ØÄ" y Ö®t(ðN+÷oÆ ²vBP¢Œ‚÷ˆç…Ø@¿òx§k¨JO’ª* Ç&L-Á{¼Öâ*%‡0Hrq„`ˆ¢ˆ(J ¥c¹SrF"KYUX±D6¢¨*Ô‡d„¼§à±]É®dÍdAð>àüà¯`#ƒ2Èv¤k->(I8–i# ±N /** * This global variable is observed in the main loop in order to exit the * program as it becomes true. */ bool g_quit(false); /** * This function processes an event of the SDL. If the quit signal has been * sent, then g_quit is set to true. Otherwise the function does nothing. * \param user_data Ignored. * \param event The event to process. */ int event_filter ( void* user_data, SDL_Event* event ) { int result(0); switch ( event->type ) { case SDL_QUIT: g_quit = true; break; default: result = 1; } return result; } /** * Initializes the visual and input modules of the engine and registers the * event filter to the SDL. */ void init() { bear::visual::screen::initialize( bear::visual::screen::screen_gl ); bear::input::system::initialize(); SDL_EventState( SDL_QUIT, SDL_ENABLE ); SDL_SetEventFilter( &event_filter, NULL ); } /** * Releases the visual and input modules of the engine. */ void release() { bear::input::system::release(); bear::visual::screen::release(); } /** * Creates a sprite given an image file name and a region in this image. * \param file_name The path to the image use for the sprite. * \param clip The part of the image to use for the sprite, relatively to the * top-left corner of the texture. */ bear::visual::sprite load_sprite ( const std::string& file_name, const bear::visual::sprite::clip_rectangle_type& clip ) { // Open the image file. std::ifstream f( file_name.c_str() ); if ( !f ) std::cerr << "Cannot open file \"" << file_name << "\" from current directory.\n"; // the engine uses the graphic module of libclaw to load the images. This // constructor builds a 32 bits color image from files such as PNG, JPEG, TGA, // Bitmap. claw::graphic::image image( f ); // Then we create a texture from the loaded image. bear::visual::image texture( image ); // And we build a sprite from this texture. return bear::visual::sprite ( /* The texture of which the sprite is part of. */ texture, /* The part of the image to use for the sprite. */ clip ); } /** * Returns the movement distance to apply to the sprite according to the arrows * currently pressed on the keyboard. */ bear::visual::position_type read_sprite_movement() { // the distance of the movement in the direction of the pressed arrows. const bear::visual::coordinate_type delta(1); // the result of the function. If no arrow is pressed, the sprite does not // move. Otherwise this value will be updated accordingly. bear::visual::position_type result(0, 0); // The state of the keyboard is supposed to be up to date. const bear::input::keyboard& keyboard ( bear::input::system::get_instance().get_keyboard() ); // bear::input::keyboard has both the begin() and end() functions required to // use range-based loops. The value type of the returned iterator is a code // identifying a pressed key. for ( bear::input::key_code k : keyboard ) switch (k) { case bear::input::keyboard::kc_up: result.y += delta; break; case bear::input::keyboard::kc_down: result.y -= delta; break; case bear::input::keyboard::kc_left: result.x -= delta; break; case bear::input::keyboard::kc_right: result.x += delta; break; } return result; } /** * Creates a window and draws a sprite in it until the quit signal is received. */ void run_example() { // Here we create the window; it will be immediately visible. // The engine does not support multiples windows yet, so be careful and be // sure to create only one of them. // // As soon as the screen is created, a render thread is created bear::visual::screen s( claw::math::coordinate_2d(640, 480) ); const bear::visual::sprite sprite ( load_sprite ( /* The path to the image of which the sprite is a part. */ "hourglass.png", /* The part of the image to use for the sprite, relatively to the top-left corner of the texture. Values are: left, top, width, height. */ bear::visual::sprite::clip_rectangle_type(0, 0, 57, 65) ) ); bear::visual::position_type sprite_center( s.get_size() / 2 ); while ( !g_quit ) { // update the state of the input devices. bear::input::system::get_instance().refresh(); // compute the new center of the sprite. sprite_center += read_sprite_movement(); // and build the scene element such that the sprite is centered on // sprite_center. bear::visual::scene_sprite element ( sprite_center.x - sprite.width() / 2, sprite_center.y - sprite.height() / 2, sprite ); s.begin_render(); s.render( element ); s.end_render(); // wait 15 milliseconds before the next update. It is necessary to avoid // the sprite to move too fast, in this example. bear::systime::sleep( 15 ); } } /** * Initializes the engine then runs the example. The engine's modules will be * released before leaving. */ int main( int argc, char* argv[] ) { init(); run_example(); release(); return 0; } plee-the-bear-20251226/bear-engine/doc/examples/06-mouse/000077500000000000000000000000001512343254000225025ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/doc/examples/06-mouse/CMakeLists.txt000066400000000000000000000031321512343254000252410ustar00rootroot00000000000000cmake_minimum_required(VERSION 2.8) #------------------------------------------------------------------------------- # Find the root directory of the source of the Bear Engine. This directory # contain the bear-engine and bear-factory project directories. if( NOT DEFINED BEAR_ROOT_DIRECTORY OR NOT IS_DIRECTORY "${BEAR_ROOT_DIRECTORY}/bear-engine" ) message( FATAL_ERROR "I can't find the Bear Engine. Please set BEAR_ROOT_DIRECTORY to the path of the engine's root:\n cmake . -DBEAR_ROOT_DIRECTORY=/home/joe/dev/bear\nCurrent path is \"${BEAR_ROOT_DIRECTORY}\" and it doesn't contain a bear-engine directory." ) endif() # The engine comes with some CMake scripts to ease its configuration and usage. # These scripts are in the directory below and must be assigned to # CMAKE_MODULE_PATH in order to be found by the upcoming include() instructions set( CMAKE_MODULE_PATH "${BEAR_ROOT_DIRECTORY}/cmake-helper" ) # This will sets the variables of the source directories, required by the CMake # package below. include( "bear-config" ) #------------------------------------------------------------------------------- # Include Bear Engine's CMake package to find the libraries, the link paths and # the and include paths required by the engine. find_package( bear ) include_directories( ${BEAR_ENGINE_INCLUDE_DIRECTORY} ) #------------------------------------------------------------------------------- # Now we can describe our project. set( TARGET_NAME ex-mouse ) file( GLOB SOURCES *.cpp ) add_executable( ${TARGET_NAME} ${SOURCES} ) target_link_libraries( ${TARGET_NAME} ${BEAR_ENGINE_LIBRARIES} ) plee-the-bear-20251226/bear-engine/doc/examples/06-mouse/hourglass.png000066400000000000000000000150171512343254000252230ustar00rootroot00000000000000‰PNG  IHDR9Aki )bKGDùC» pHYs  šœtIMEÝ 7.v T®tEXtCommentCreated with GIMPWwIDAThÞå›{´¥Euà»ê{sî=羺ûÞ¦º°!m7 ¦ A ‰2š`Bt’8.ÇÄ,åkI_$fåáÒ‘ñ91ŽÉ¨Kd£¸’¨#´ ¤Á~Ýî¾}ßçõ=ªjÏç6i ’Çšúç®SU·¾ý«½wU}õí-w}":«,ܽ#ͯŽÈŒ´ Ä©ÅOY¬ `„àYœCÄYŠ!qj¨dIÄâR‰APKð Æ"¢ Šª¡ôõ‚!'bq¥ÃFe¥c(+OY)E©4UP,>TÀU¼bâçýU¹û¥og'€}Å Ãa#‚1‚1-ÁNAE xCWBU¡àÔàTñ^qz¹’ؘåÅŠ´!aÔÒÏ=E%ôú%Â9ÃÜRElRú}G–%Á<¸ €!E4:øíˆµ”eÀ«ïÀ{%ˆà*E‚ÁE…“^pµ[þޝD±òRiwx'DXk0xld0€Š ( ï@=ˆQ²ØR:‡1† °°ìˆ#è9ƒHDð^p•#Š"æ+âÄRyKî ¯@z^_IcEŒÅ{"8ï0ï eÈ2Á0xJ7°ˆ çÚu ÎCPÄWô"ôKCYB”ò2 ý@šY$@)ˆJ bWøG5âƒ'CšÄfôûÝ^Ÿ$6D±ALD?w¥à/,sëWJŒ€b”ª4 ÈBU0 €B‰‚\E1PBP(< ( êçJY EA¡Zi@@rF€ÎAdÁðA©×,®ô¸ ŒµUÊJ(}ŽÁ0ÜjཧÛ-I!"Ç|;PK"z½’$‹È œ£àQ PVB¥àœ`D)+]ñ?‹¯ÎC¥à¼4(! d÷~²Ó“»‹Rw%âÕP:ð¥*¢‚($‰¡ðk!Š‹HðŠ¥¨¦íKŨAŒE–ÝÅãUÍTõVUÍVªjƘµÇÚs›æçç¯,ËòEÞûKœs;BÏöÞ?Ë97UE Ðét†UµÉ –K/½4ú“?ù“©êƪª.9V/"#‘óôN§s*`^úÒ—N=Fæ)æÇ¾ßÐÐPODÚ@}rrrçŠÌœä}Àï}·ÙlN[ V4íŒ1ËI’تªÒ4M#cL¦ª‰÷ÞŠÈ)"c–£(JOrxx89zôè\’$‘1fÀòòòäW\ñÏdMÓÔxöŠÌ'ù UýÙ$I–Š¢(€¥$I²ãüã‡Î¹™²,}Áöz=±ÖVƉãXT5‹ã؇ú'øÚ×¾Ö9r$ÛºuëÐ=VÉ%— ?ÑÇJQ'ÓÀÏß8QÈeÉ€~’$é›ßüæ´,Ëè8¿<,"ÒjµŠ‚o6›ðUUUÆ¿¸¸¸ Ñh,ä?øÁ$Itá…zàÈJõøË_þò¸Ûíþ3˲l2ÏóË')"¸øU}äºë®›Òã¿[UËn·›WU%eYªªR«ÕðÞ›ÑÑQáé•ôª«®²EQÌ‹HñññáË/¿|uUU?xŒŒQžçeš¦—w®È̉n!þK»ÝþA–e«ßò–·DÙ_¾Ùh4jišæI’ˆ÷>ʲ,íã™ÖS)ªê7nÜ8Ÿ¦éⱺ~ô£ëŒ1:66öÈñ}W¯^=Õjµö¯Z‘•†‘EU}°Õj콟»þúëǶlÙòè2~×]wÝ⦅õÞ HQ’e™8ç’§YÅx³Ù<""à¹Ï}îèÅ_¼ù3ŸùÌ×W| 8räÈáÅÅÅ3Tuˆ,þ¸qåIfvð{ï|ç¯ÌwÞó'~ø«EQI£QgãÆõ¬ZµiÃi§½êN î­^¯¯ÍfMVÌç+' ¹°°ŽŽVÇ~OOϾpjj|·ˆìûð‡_xcU…þöíÏOï»ïoß6>>ÄÖ­/å´Ó.['"Ÿ6ä è~èC¿ý¦¸GwìxŽÜwßß²víÆÆ4›±NM)gœñsôz=jµ5,-í§Ù̘™¹áá&ý¾cddø-N§BÌÑ£3¤iåå6"§Ÿþ,¾öµo°qã©=:Ïèè ³¬_éøáÃÓ/úÞ÷n;err-û÷Õ©©-â\NQ,‘¦£\}õŸ½KD®{2†'…Ìón–¦õ›n¸áŠßJX¿þtÚíDQÎÆkY·n‚$ÙÄ)§lÅ9%Š"D”……/â}9x‹÷µZʾ}3¤i‚1ç`y¹‡11UU’¦5FGÇxøá²~ý¹Üyçn††ÚX3?¿Äڵ率ÚµVã7þôÐÄĦ"R>ƒy²YÖȽw¿{íµÿã¯Cæç÷Ñl®Ç˜Ò´Æ¡C3´ÛqàÀt: ´ÛK8WE£”eÅêÕãt:=z½.ããk0&¢Óé#bH’”ÁÉMÈóЇz‘aœs u©×[,.z¦¦Î%„Š}ûöÐhÔôW~åíû'&6÷TŸä`ó÷·Zk^ùÚ×~ô{")33ÇÂâb‡ååcr&&k»4›-úý>ÎÑnwé÷ûLN®¡Ù<‰,³$I<¸™Ÿ'ŽcŠ¢¤Ù CC-ªªËôô÷Ed„³Ï¾Œ~–üÇ»¨ªRí×þðÈÆç?GD¦Ÿª¯Ë‰­~½á¢è}õÏÿü­ç†°_“i4êlÞ|2Þ· lÞ|N‹µkO¢Ýþ*³³›Ä¹œv» (Öj­gtô4ú YÖ ª3Ï|É×ëõÑ7ý$fù/ùO‹Ó¬dÙø[xàÏßsäÈßamFQ„P¡Q¯¯&„.½^“O¾„-[^ö¶vûÈ4›“úLÈcž‰Akµ ‘kµ)¬ÝÀÂÂ2iZ§ßwÌÍÍÓ릧Q#¬Y³ãË"rã3øŒA>:¸ÑçmÜxËË5”¥26¶‰U«Váœpúé¿À#|óÏx†Ë3 yòÉ¿xO¿_ÇÌa >Ü¥Ýî°¸Ø!8ï¼ß¼ëß5äà€ïÕ{h4†Pµ¬^=ÅÜÜ,EQjÅüK”è™\UG¢(.z½nšç}Ù·o†V+åÌ3O§ßŸ•Ÿ÷ªªF¹·š‘×ÏÌŒ½À9½'„@£Ñ`x¸A§ãPeû¾ðé¯ÇqüÛÏ´&åÒ oæDäfàð'?ùêw8ðýëFFÆõ¼ó®üßçœsåo‰ÔÆ~ðƒ¼bÓ¦MBx·µößþ¢ª¢ª·‹ÈÇÇÇÇý—¾tãeIâ¯k4@!çœsõÛº]ÿ,àð©§žúéûï¿Ñs‹ª^¸2Aÿ6!Uõ"à“À‹>ñ‰O¼ø `gggçî¿WïÀ½dYJšÖøÜç~g³µöˆª¦QÞ²e˯½öÚÿZůÿke¬;EU/RÕ[Þ÷®w½ë‚7¾ñ[—––Î*ŠâGµ›o~ݶ?ýÓ_ÔÛn{ý¶Ç¦œ L¨êUýUý¿:láBUý?ÓÓÓ7]yå•ÛŸóœçl:tèÐyeYN7õ²,/!œúÇ|Ùùÿø¯?¡ÏµZ­ÇÞ뎨ê®À^ø/º…„Ry÷ìììðË^ö²÷\~ùå þð‡7ŽwEäïW>«Å"riasERÅߎŽL 7žpÜ¥¥%·r÷:•¦é¡•»Ô7«êð{ªz%ð6)žQíyï‡Tõö›nºéU;wî<[U_Üét®TÕ©ãú\R–åuÞûß/ËòÚ^¯7v¬íúëÏ}ÏS0ÿÌÍÍýÌãÔ?WUÿZU‡žIó\§ªwlß¾ý’/ùËÏév»/QÕ‰cíwß}wä½užç¯é÷û飯ê÷¼÷šî§>õýÜç~ëÎ']›{¶ª¾Ö9wê〶TõU]÷Sß'CëUõ†3Î8ã»ví²Æ˜™V«õÝã^ !üŽsÎUU5’e™³ÖÞ%"·—ß»¸¸°mh¨!n¸êª¿ºþ‰žÕívëišž¦ªçGQô1ñmﮑý?Èüüe—]ö¦|àk7oÞ¼WDöüÓ»cÿÜ8ŽÕZÛuÎYkmZE?˲w}ñ‹¯ÒÉÉU[™Ý}ðàA&&Fˆ"«ËË9ÿüŸ?ÿ´ÓÞ¸ë L¶^Åkíº8Ž?ù8íMàÓÀ/?}JŸ n¾ùæïlذá¾3Ï<ÓÔjµ8Îÿ~És÷¾ïœ3@ªªÇñ®(Šn¸ýöWh¢è’çCC#TU…sÕõ¿þ럾቞ëœ;ED¶ªj/Š¢¯>Ž\/‘7ÿD‡Uݰ¸¸ø¬k®¹æoÎ>ûìF–e÷×öBçÜŽ²,—ÇqE‘clUU÷ÜqÇkvgY¢U•3>>ÆÚµ“Ôëql‰"óK?þB;Ú !lPÕÓŽ³¬Ñ•sñßëV>J=}ÈÂoßrË-ŸŸžžîE±çXtE»Ý> øï}áœK«ªJʲ´ª_«Õ¹ýö—ïNÓdkU25µ !Š Ýî2¬^½jç­·þ§óŸäù½Â#Þû‹¼÷«Wê–skV&ú¿×>mÈv»=º°°ð³×\sÍ€Žˆt޵Åq|y»ÝöµZMEÄGQ”eY¶EQ7I’{o¿ý?»^O¶ª£ªJ²ÌÐé,dž¥¥Yò¼ƒˆ½ñSŸºzÇÉ`­Ýc­U "rÞŠ†½ˆPUUÃóu`óÊ^zâ>Ùëõ~÷k_ûÚüòòò‡®¸âŠV½^Ÿ]™É¡²,ßÇqT º´4½)Ï|ÍÞ½Ȳefg¿«cc™„`¨×-ƒ×¬!æçHÓ!Ž™!„ÀÒR11Î]ÿú×ñ†'ãÒZ­Öé÷ûÛjµÚ"2«ª=UÝhŒù~á…"òlyÏ Aªj¤ª7?ïyÏ{ëW¾ò•Yý•a³1æEªÁcîÝû­—OOßÿóÝn›õë×03³›z}çºdÙÐ#Ž- ËœtÒóó] ZUU·V«Å­V‹³Î:kι Àð=UÝr¢«ë¹Ÿýìg¿ ø}ûö~|Ã7þê,,ÌnÊó%–—çh·—HÓ„zÝÐëÍ11ÑBD1¦¤VËX^n“$1õzv»Íèh‹¢è366Æøø8Ö¬5ŒOÐëµI¡^ÏäÁïßúÞ÷þò½++ê¼÷þpQ‹££££@røðaœsK¯{Ýë&nºé¦ï‰È¹Or%f4Û³gO¾cÇŽ3ï½÷Þ‰mÛ¶ÜpÃåÛj5¿½ßß/!ä„ÐcxxU!Š"ŽùµZŒ1ãã-:.ƵZA$ŒÐét©Õê¬];E¿ßEÄ04Tã”SÖ‚Òëuh6›ŒOÈÑ£³g½÷½/Ü–ç‹wEQ%Iâ’$y`xx¸øØÇ>6œe™œsÎ9É_üÅ_=Q¼kôÄWýµhÕªUSßüæ7uçΫ¾óï,®^=±ÛûG>LY&McªƹŠññ&EÑÇ{K¯7ðQçÝnZ­NE ³¸xˆùù4 òÜá}LQäyÎêÕˆÎåX »ß÷¾—n{Ã>ÿý•Ø¢UÖZ»iÓ¦‘~¿_lß¾}dnn®þ¤ûäß‚‡ëQ?Š„JYý¤ÿxåÃ÷|ìÿ¶«U›ZuíÔkùBaÖ^Pjzv§½,ëÖO1stŽ,nÑíöHC’DŒŽŽ²´¼HšF¤IÅ¥eÒ$Á%Ž#––;$qF¯—ƒ*yáQ„#G`~a™~?§ÙlÒíö16aq©ÃæIûÞ²,mZ[ÕÜýï1µî”t|¤ÞCÍï?ðíùóá•—í¹÷/oåR.ÀßöŠw³åžO™»Ë•Ȫ2d‘ƃŒœcŽ™³!Ž UYáW"ömdqÎcÄP:%ŽÕá‚ǹA°¾Š¢^^)*%M€ . ^èJ­Q•² ÄQ„óàœ¤fTŠS°&B5à}@$ƽ¾#ŽB&1ƒŒ"Ïù×¼WwEy®çûHˆcC^)¾äS”ê™Á;GP0!€1‚ a>a#ƒ$Õ@ÔŠ2€QG°@’DtÛqbQcqê(1”!`èwÖÒ8¦_ÊÒ#fðe:.Pª#McÒ,ei91h0tûŽ4‰p•G¤iö|èïŠú}È%@SU0ЊC¿€ÁUŠ×€¨`£ÁÌc)«©…ˆ"KYuз³b­!xav¾ ˺½ $ bÉÈ¥ta»UŒŠBé—"–(Jj,&5háèõ*œ:²8¦Ó¯¨‚RKc*_aÄ"ÖÐ-¯šÑrOIbAKOék@Ô+U¥ØÄ" y Ö®t(ðN+÷oÆ ²vBP¢Œ‚÷ˆç…Ø@¿òx§k¨JO’ª* Ç&L-Á{¼Öâ*%‡0Hrq„`ˆ¢ˆ(J ¥c¹SrF"KYUX±D6¢¨*Ô‡d„¼§à±]É®dÍdAð>àüà¯`#ƒ2Èv¤k->(I8–i# ±N /** * This global variable is observed in the main loop in order to exit the * program as it becomes true. */ bool g_quit(false); /** * This function processes an event of the SDL. If the quit signal has been * sent, then g_quit is set to true. Otherwise the function does nothing. * \param user_data Ignored. * \param event The event to process. */ int event_filter ( void* user_data, SDL_Event* event ) { int result(0); switch ( event->type ) { case SDL_QUIT: g_quit = true; break; default: result = 1; } return result; } /** * Initializes the visual and input modules of the engine and registers the * event filter to the SDL. */ void init() { bear::visual::screen::initialize( bear::visual::screen::screen_gl ); bear::input::system::initialize(); SDL_EventState( SDL_QUIT, SDL_ENABLE ); SDL_SetEventFilter( &event_filter, NULL ); } /** * Releases the visual and input modules of the engine. */ void release() { bear::input::system::release(); bear::visual::screen::release(); } /** * Creates a sprite given an image file name and a region in this image. * \param file_name The path to the image used for the sprite. * \param clip The part of the image to use for the sprite, relatively to the * top-left corner of the texture. */ bear::visual::sprite load_sprite ( const std::string& file_name, const bear::visual::sprite::clip_rectangle_type& clip ) { // Open the image file. std::ifstream f( file_name.c_str() ); if ( !f ) std::cerr << "Cannot open file \"" << file_name << "\" from current directory.\n"; // the engine uses the graphic module of libclaw to load the images. This // constructor builds a 32 bits color image from files such as PNG, JPEG, TGA, // Bitmap. claw::graphic::image image( f ); // Then we create a texture from the loaded image. bear::visual::image texture( image ); // And we build a sprite from this texture. return bear::visual::sprite ( /* The texture of which the sprite is part of. */ texture, /* The part of the image to use for the sprite. */ clip ); } /** * Reads the state of the mouse's buttons and applies the corresponding * transformations to a sprite. A left or right click respectively flips the * sprite horizontally and vertically. Moving the wheel up or down respectively * increase and decrease the size of the sprite. * \param sprite The sprite to transform. */ void transform_sprite_with_mouse( bear::visual::sprite& sprite ) { // The state of the mouse is supposed to be up to date. const bear::input::mouse& mouse ( bear::input::system::get_instance().get_mouse() ); // The scale that will be applied to the sprite. By default the scale doesn't // change. double scale( 1 ); // bear::input::mouse has both the begin() and end() functions required to // use range-based loops. The value type of the returned iterator is a code // identifying a pressed button. for ( bear::input::mouse::mouse_code k : mouse ) switch (k) { case bear::input::mouse::mc_left_button: sprite.mirror( !sprite.is_mirrored() ); break; case bear::input::mouse::mc_right_button: sprite.flip( !sprite.is_flipped() ); break; case bear::input::mouse::mc_wheel_up: scale = 1.2; break; case bear::input::mouse::mc_wheel_down: scale = 0.8; break; } bear::visual::size_box_type s( sprite.get_size() * scale ); if ( (s.x > 10) && (s.y > 10) ) sprite.set_size( s ); } /** * Creates a window and draws a sprite in it until the quit signal is received. * The sprite is transformed in response to the mouse events. */ void run_example() { // Here we create the window; it will be immediately visible. // The engine does not support multiples windows yet, so be careful and be // sure to create only one of them. // // As soon as the screen is created, a render thread is created bear::visual::screen s( claw::math::coordinate_2d(640, 480) ); bear::visual::sprite sprite ( load_sprite ( /* The path to the image of which the sprite is a part. */ "hourglass.png", /* The part of the image to use for the sprite, relatively to the top-left corner of the texture. Values are: left, top, width, height. */ bear::visual::sprite::clip_rectangle_type(0, 0, 57, 65) ) ); // The position of the center of the sprite in the screen. bear::visual::position_type sprite_center( s.get_size() / 2 ); while ( !g_quit ) { // update the state of the input devices. bear::input::system::get_instance().refresh(); // compute the new center of the sprite. sprite_center = bear::input::system::get_instance().get_mouse().get_position(); transform_sprite_with_mouse( sprite ); // and build the scene element such that the sprite is centered on // sprite_center. bear::visual::scene_sprite element ( sprite_center.x - sprite.width() / 2, sprite_center.y - sprite.height() / 2, sprite ); s.begin_render(); s.render( element ); s.end_render(); } } /** * Initializes the engine then runs the example. The engine's modules will be * released before leaving. */ int main( int argc, char* argv[] ) { init(); run_example(); release(); return 0; } plee-the-bear-20251226/bear-engine/doc/examples/07-joystick/000077500000000000000000000000001512343254000232125ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/doc/examples/07-joystick/CMakeLists.txt000066400000000000000000000031351512343254000257540ustar00rootroot00000000000000cmake_minimum_required(VERSION 2.8) #------------------------------------------------------------------------------- # Find the root directory of the source of the Bear Engine. This directory # contain the bear-engine and bear-factory project directories. if( NOT DEFINED BEAR_ROOT_DIRECTORY OR NOT IS_DIRECTORY "${BEAR_ROOT_DIRECTORY}/bear-engine" ) message( FATAL_ERROR "I can't find the Bear Engine. Please set BEAR_ROOT_DIRECTORY to the path of the engine's root:\n cmake . -DBEAR_ROOT_DIRECTORY=/home/joe/dev/bear\nCurrent path is \"${BEAR_ROOT_DIRECTORY}\" and it doesn't contain a bear-engine directory." ) endif() # The engine comes with some CMake scripts to ease its configuration and usage. # These scripts are in the directory below and must be assigned to # CMAKE_MODULE_PATH in order to be found by the upcoming include() instructions set( CMAKE_MODULE_PATH "${BEAR_ROOT_DIRECTORY}/cmake-helper" ) # This will sets the variables of the source directories, required by the CMake # package below. include( "bear-config" ) #------------------------------------------------------------------------------- # Include Bear Engine's CMake package to find the libraries, the link paths and # the and include paths required by the engine. find_package( bear ) include_directories( ${BEAR_ENGINE_INCLUDE_DIRECTORY} ) #------------------------------------------------------------------------------- # Now we can describe our project. set( TARGET_NAME ex-joystick ) file( GLOB SOURCES *.cpp ) add_executable( ${TARGET_NAME} ${SOURCES} ) target_link_libraries( ${TARGET_NAME} ${BEAR_ENGINE_LIBRARIES} ) plee-the-bear-20251226/bear-engine/doc/examples/07-joystick/hourglass.png000066400000000000000000000150171512343254000257330ustar00rootroot00000000000000‰PNG  IHDR9Aki )bKGDùC» pHYs  šœtIMEÝ 7.v T®tEXtCommentCreated with GIMPWwIDAThÞå›{´¥Euà»ê{sî=羺ûÞ¦º°!m7 ¦ A ‰2š`Bt’8.ÇÄ,åkI_$fåáÒ‘ñ91ŽÉ¨Kd£¸’¨#´ ¤Á~Ýî¾}ßçõ=ªjÏç6i ’Çšúç®SU·¾ý«½wU}õí-w}":«,ܽ#ͯŽÈŒ´ Ä©ÅOY¬ `„àYœCÄYŠ!qj¨dIÄâR‰APKð Æ"¢ Šª¡ôõ‚!'bq¥ÃFe¥c(+OY)E©4UP,>TÀU¼bâçýU¹û¥og'€}Å Ãa#‚1‚1-ÁNAE xCWBU¡àÔàTñ^qz¹’ؘåÅŠ´!aÔÒÏ=E%ôú%Â9ÃÜRElRú}G–%Á<¸ €!E4:øíˆµ”eÀ«ïÀ{%ˆà*E‚ÁE…“^pµ[þޝD±òRiwx'DXk0xld0€Š ( ï@=ˆQ²ØR:‡1† °°ìˆ#è9ƒHDð^p•#Š"æ+âÄRyKî ¯@z^_IcEŒÅ{"8ï0ï eÈ2Á0xJ7°ˆ çÚu ÎCPÄWô"ôKCYB”ò2 ý@šY$@)ˆJ bWøG5âƒ'CšÄfôûÝ^Ÿ$6D±ALD?w¥à/,sëWJŒ€b”ª4 ÈBU0 €B‰‚\E1PBP(< ( êçJY EA¡Zi@@rF€ÎAdÁðA©×,®ô¸ ŒµUÊJ(}ŽÁ0ÜjཧÛ-I!"Ç|;PK"z½’$‹È œ£àQ PVB¥àœ`D)+]ñ?‹¯ÎC¥à¼4(! d÷~²Ó“»‹Rw%âÕP:ð¥*¢‚($‰¡ðk!Š‹HðŠ¥¨¦íKŨAŒE–ÝÅãUÍTõVUÍVªjƘµÇÚs›æçç¯,ËòEÞûKœs;BÏöÞ?Ë97UE Ðét†UµÉ –K/½4ú“?ù“©êƪª.9V/"#‘óôN§s*`^úÒ—N=Fæ)æÇ¾ßÐÐPODÚ@}rrrçŠÌœä}Àï}·ÙlN[ V4íŒ1ËI’تªÒ4M#cL¦ª‰÷ÞŠÈ)"c–£(JOrxx89zôè\’$‘1fÀòòòäW\ñÏdMÓÔxöŠÌ'ù UýÙ$I–Š¢(€¥$I²ãüã‡Î¹™²,}Áöz=±ÖVƉãXT5‹ã؇ú'øÚ×¾Ö9r$ÛºuëÐ=VÉ%— ?ÑÇJQ'ÓÀÏß8QÈeÉ€~’$é›ßüæ´,Ëè8¿<,"ÒjµŠ‚o6›ðUUUÆ¿¸¸¸ Ñh,ä?øÁ$Itá…zàÈJõøË_þò¸Ûíþ3˲l2ÏóË')"¸øU}äºë®›Òã¿[UËn·›WU%eYªªR«ÕðÞ›ÑÑQáé•ôª«®²EQÌ‹HñññáË/¿|uUU?xŒŒQžçeš¦—w®È̉n!þK»ÝþA–e«ßò–·DÙ_¾Ùh4jišæI’ˆ÷>ʲ,íã™ÖS)ªê7nÜ8Ÿ¦éⱺ~ô£ëŒ1:66öÈñ}W¯^=Õjµö¯Z‘•†‘EU}°Õj콟»þúëǶlÙòè2~×]wÝ⦅õÞ HQ’e™8ç’§YÅx³Ù<""à¹Ï}îèÅ_¼ù3ŸùÌ×W| 8räÈáÅÅÅ3Tuˆ,þ¸qåIfvð{ï|ç¯ÌwÞó'~ø«EQI£QgãÆõ¬ZµiÃi§½êN î­^¯¯ÍfMVÌç+' ¹°°ŽŽVÇ~OOϾpjj|·ˆìûð‡_xcU…þöíÏOï»ïoß6>>ÄÖ­/å´Ó.['"Ÿ6ä è~èC¿ý¦¸GwìxŽÜwßß²víÆÆ4›±NM)gœñsôz=jµ5,-í§Ù̘™¹áá&ý¾cddø-N§BÌÑ£3¤iåå6"§Ÿþ,¾öµo°qã©=:Ïèè ³¬_éøáÃÓ/úÞ÷n;err-û÷Õ©©-â\NQ,‘¦£\}õŸ½KD®{2†'…Ìón–¦õ›n¸áŠßJX¿þtÚíDQÎÆkY·n‚$ÙÄ)§lÅ9%Š"D”……/â}9x‹÷µZʾ}3¤i‚1ç`y¹‡11UU’¦5FGÇxøá²~ý¹Üyçn††ÚX3?¿Äڵ率ÚµVã7þôÐÄĦ"R>ƒy²YÖȽw¿{íµÿã¯Cæç÷Ñl®Ç˜Ò´Æ¡C3´ÛqàÀt: ´ÛK8WE£”eÅêÕãt:=z½.ããk0&¢Óé#bH’”ÁÉMÈóЇz‘aœs u©×[,.z¦¦Î%„Š}ûöÐhÔôW~åíû'&6÷TŸä`ó÷·Zk^ùÚ×~ô{")33ÇÂâb‡ååcr&&k»4›-úý>ÎÑnwé÷ûLN®¡Ù<‰,³$I<¸™Ÿ'ŽcŠ¢¤Ù CC-ªªËôô÷Ed„³Ï¾Œ~–üÇ»¨ªRí×þðÈÆç?GD¦Ÿª¯Ë‰­~½á¢è}õÏÿü­ç†°_“i4êlÞ|2Þ· lÞ|N‹µkO¢Ýþ*³³›Ä¹œv» (Öj­gtô4ú YÖ ª3Ï|É×ëõÑ7ý$fù/ùO‹Ó¬dÙø[xàÏßsäÈßamFQ„P¡Q¯¯&„.½^“O¾„-[^ö¶vûÈ4›“úLÈcž‰Akµ ‘kµ)¬ÝÀÂÂ2iZ§ßwÌÍÍÓ릧Q#¬Y³ãË"rã3øŒA>:¸ÑçmÜxËË5”¥26¶‰U«Váœpúé¿À#|óÏx†Ë3 yòÉ¿xO¿_ÇÌa >Ü¥Ýî°¸Ø!8ï¼ß¼ëß5äà€ïÕ{h4†Pµ¬^=ÅÜÜ,EQjÅüK”è™\UG¢(.z½nšç}Ù·o†V+åÌ3O§ßŸ•Ÿ÷ªªF¹·š‘×ÏÌŒ½À9½'„@£Ñ`x¸A§ãPeû¾ðé¯ÇqüÛÏ´&åÒ oæDäfàð'?ùêw8ðýëFFÆõ¼ó®üßçœsåo‰ÔÆ~ðƒ¼bÓ¦MBx·µößþ¢ª¢ª·‹ÈÇÇÇÇý—¾tãeIâ¯k4@!çœsõÛº]ÿ,àð©§žúéûï¿Ñs‹ª^¸2Aÿ6!Uõ"à“À‹>ñ‰O¼ø `gggçî¿WïÀ½dYJšÖøÜç~g³µöˆª¦QÞ²e˯½öÚÿZůÿke¬;EU/RÕ[Þ÷®w½ë‚7¾ñ[—––Î*ŠâGµ›o~ݶ?ýÓ_ÔÛn{ý¶Ç¦œ L¨êUýUý¿:láBUý?ÓÓÓ7]yå•ÛŸóœçl:tèÐyeYN7õ²,/!œúÇ|Ùùÿø¯?¡ÏµZ­ÇÞ뎨ê®À^ø/º…„Ry÷ìììðË^ö²÷\~ùå þð‡7ŽwEäïW>«Å"riasERÅߎŽL 7žpÜ¥¥%·r÷:•¦é¡•»Ô7«êð{ªz%ð6)žQíyï‡Tõö›nºéU;wî<[U_Üét®TÕ©ãú\R–åuÞûß/ËòÚ^¯7v¬íúëÏ}ÏS0ÿÌÍÍýÌãÔ?WUÿZU‡žIó\§ªwlß¾ý’/ùËÏév»/QÕ‰cíwß}wä½užç¯é÷û飯ê÷¼÷šî§>õýÜç~ëÎ']›{¶ª¾Ö9wê〶TõU]÷Sß'CëUõ†3Î8ã»ví²Æ˜™V«õÝã^ !üŽsÎUU5’e™³ÖÞ%"·—ß»¸¸°mh¨!n¸êª¿ºþ‰žÕívëišž¦ªçGQô1ñmﮑý?Èüüe—]ö¦|àk7oÞ¼WDöüÓ»cÿÜ8ŽÕZÛuÎYkmZE?˲w}ñ‹¯ÒÉÉU[™Ý}ðàA&&Fˆ"«ËË9ÿüŸ?ÿ´ÓÞ¸ë L¶^Åkíº8Ž?ù8íMàÓÀ/?}JŸ n¾ùæïlذá¾3Ï<ÓÔjµ8Îÿ~És÷¾ïœ3@ªªÇñ®(Šn¸ýöWh¢è’çCC#TU…sÕõ¿þ럾቞ëœ;ED¶ªj/Š¢¯>Ž\/‘7ÿD‡Uݰ¸¸ø¬k®¹æoÎ>ûìF–e÷×öBçÜŽ²,—ÇqE‘clUU÷ÜqÇkvgY¢U•3>>ÆÚµ“Ôëql‰"óK?þB;Ú !lPÕÓŽ³¬Ñ•sñßëV>J=}ÈÂoßrË-ŸŸžžîE±çXtE»Ý> øï}áœK«ªJʲ´ª_«Õ¹ýö—ïNÓdkU25µ !Š Ýî2¬^½jç­·þ§óŸäù½Â#Þû‹¼÷«Wê–skV&ú¿×>mÈv»=º°°ð³×\sÍ€Žˆt޵Åq|y»ÝöµZMEÄGQ”eY¶EQ7I’{o¿ý?»^O¶ª£ªJ²ÌÐé,dž¥¥Yò¼ƒˆ½ñSŸºzÇÉ`­Ýc­U "rÞŠ†½ˆPUUÃóu`óÊ^zâ>Ùëõ~÷k_ûÚüòòò‡®¸âŠV½^Ÿ]™É¡²,ßÇqT º´4½)Ï|ÍÞ½Ȳefg¿«cc™„`¨×-ƒ×¬!æçHÓ!Ž™!„ÀÒR11Î]ÿú×ñ†'ãÒZ­Öé÷ûÛjµÚ"2«ª=UÝhŒù~á…"òlyÏ Aªj¤ª7?ïyÏ{ëW¾ò•Yý•a³1æEªÁcîÝû­—OOßÿóÝn›õë×03³›z}çºdÙÐ#Ž- ËœtÒóó] ZUU·V«Å­V‹³Î:kι Àð=UÝr¢«ë¹Ÿýìg¿ ø}ûö~|Ã7þê,,ÌnÊó%–—çh·—HÓ„zÝÐëÍ11ÑBD1¦¤VËX^n“$1õzv»Íèh‹¢è366Æøø8Ö¬5ŒOÐëµI¡^ÏäÁïßúÞ÷þò½++ê¼÷þpQ‹££££@røðaœsK¯{Ýë&nºé¦ï‰È¹Or%f4Û³gO¾cÇŽ3ï½÷Þ‰mÛ¶ÜpÃåÛj5¿½ßß/!ä„ÐcxxU!Š"ŽùµZŒ1ãã-:.ƵZA$ŒÐét©Õê¬];E¿ßEÄ04Tã”SÖ‚Òëuh6›ŒOÈÑ£³g½÷½/Ü–ç‹wEQ%Iâ’$y`xx¸øØÇ>6œe™œsÎ9É_üÅ_=Q¼kôÄWýµhÕªUSßüæ7uçΫ¾óï,®^=±ÛûG>LY&McªƹŠññ&EÑÇ{K¯7ðQçÝnZ­NE ³¸xˆùù4 òÜá}LQäyÎêÕˆÎåX »ß÷¾—n{Ã>ÿý•Ø¢UÖZ»iÓ¦‘~¿_lß¾}dnn®þ¤ûäß‚‡ëQ?Š„JYý¤ÿxåÃ÷|ìÿ¶«U›ZuíÔkùBaÖ^Pjzv§½,ëÖO1stŽ,nÑíöHC’DŒŽŽ²´¼HšF¤IÅ¥eÒ$Á%Ž#––;$qF¯—ƒ*yáQ„#G`~a™~?§ÙlÒíö16aq©ÃæIûÞ²,mZ[ÕÜýï1µî”t|¤ÞCÍï?ðíùóá•—í¹÷/oåR.ÀßöŠw³åžO™»Ë•Ȫ2d‘ƃŒœcŽ™³!Ž UYáW"ömdqÎcÄP:%ŽÕá‚ǹA°¾Š¢^^)*%M€ . ^èJ­Q•² ÄQ„óàœ¤fTŠS°&B5à}@$ƽ¾#ŽB&1ƒŒ"Ïù×¼WwEy®çûHˆcC^)¾äS”ê™Á;GP0!€1‚ a>a#ƒ$Õ@ÔŠ2€QG°@’DtÛqbQcqê(1”!`èwÖÒ8¦_ÊÒ#fðe:.Pª#McÒ,ei91h0tûŽ4‰p•G¤iö|èïŠú}È%@SU0ЊC¿€ÁUŠ×€¨`£ÁÌc)«©…ˆ"KYuз³b­!xav¾ ˺½ $ bÉÈ¥ta»UŒŠBé—"–(Jj,&5háèõ*œ:²8¦Ó¯¨‚RKc*_aÄ"ÖÐ-¯šÑrOIbAKOék@Ô+U¥ØÄ" y Ö®t(ðN+÷oÆ ²vBP¢Œ‚÷ˆç…Ø@¿òx§k¨JO’ª* Ç&L-Á{¼Öâ*%‡0Hrq„`ˆ¢ˆ(J ¥c¹SrF"KYUX±D6¢¨*Ô‡d„¼§à±]É®dÍdAð>àüà¯`#ƒ2Èv¤k->(I8–i# ±N /** * This global variable is observed in the main loop in order to exit the * program as it becomes true. */ bool g_quit(false); /** * This function processes an event of the SDL. If the quit signal has been * sent, then g_quit is set to true. Otherwise the function does nothing. * \param user_data Ignored. * \param event The event to process. */ int event_filter( void* user_data, SDL_Event* event ) { int result(0); switch ( event->type ) { case SDL_QUIT: g_quit = true; break; default: result = 1; } return result; } /** * Initializes the visual and input modules of the engine and registers the * event filter to the SDL. */ void init() { bear::visual::screen::initialize( bear::visual::screen::screen_gl ); bear::input::system::initialize(); SDL_EventState( SDL_QUIT, SDL_ENABLE ); SDL_SetEventFilter( &event_filter, NULL ); } /** * Releases the visual and input modules of the engine. */ void release() { bear::input::system::release(); bear::visual::screen::release(); } /** * Creates a sprite given an image file name and a region in this image. * \param file_name The path to the image used for the sprite. * \param clip The part of the image to use for the sprite, relatively to the * top-left corner of the texture. */ bear::visual::sprite load_sprite ( const std::string& file_name, const bear::visual::sprite::clip_rectangle_type& clip ) { // Open the image file. std::ifstream f( file_name.c_str() ); if ( !f ) std::cerr << "Cannot open file \"" << file_name << "\" from current directory.\n"; // the engine uses the graphic module of libclaw to load the images. This // constructor builds a 32 bits color image from files such as PNG, JPEG, TGA, // Bitmap. claw::graphic::image image( f ); // Then we create a texture from the loaded image. bear::visual::image texture( image ); // And we build a sprite from this texture. return bear::visual::sprite ( /* The texture of which the sprite is part of. */ texture, /* The part of the image to use for the sprite. */ clip ); } /** * Reads the state of the joystick's buttons and applies the corresponding * transformations to a sprite. The axis moves the sprite, two buttons changes * the angle, two buttons change the scale and two buttons flip the sprite * horizontally and vertically. * \param sprite The sprite to transform. * \param center The position of the center of the sprite. */ void transform_sprite_with_joystick ( bear::visual::sprite& sprite, bear::visual::position_type& center ) { // The state of the joystick is supposed to be up to date. const bear::input::joystick& joystick ( bear::input::system::get_instance().get_joystick(0) ); // The scale that will be applied to the sprite. By default the scale doesn't // change. double scale( 1 ); // The length of the movement to be applied on each pressed axis. const double movement_length(5); // The angle of the rotation. const double rotation_delta(0.1); // bear::input::joystick has both the begin() and end() functions required to // use range-based loops. The value type of the returned iterator is a code // identifying a pressed button. for ( bear::input::joystick::joy_code k : joystick ) switch (k) { case bear::input::joystick::jc_axis_left: center.x -= movement_length; break; case bear::input::joystick::jc_axis_right: center.x += movement_length; break; case bear::input::joystick::jc_axis_down: center.y -= movement_length; break; case bear::input::joystick::jc_axis_up: center.y += movement_length; break; case bear::input::joystick::jc_axis_up_right: center += bear::visual::position_type( movement_length, movement_length ); break; case bear::input::joystick::jc_axis_down_right: center += bear::visual::position_type( movement_length, -movement_length ); break; case bear::input::joystick::jc_axis_down_left: center += bear::visual::position_type( -movement_length, -movement_length ); break; case bear::input::joystick::jc_axis_up_left: center += bear::visual::position_type( -movement_length, movement_length ); break; case bear::input::joystick::jc_button_1: sprite.set_angle( sprite.get_angle() + rotation_delta ); break; case bear::input::joystick::jc_button_2: sprite.set_angle( sprite.get_angle() - rotation_delta ); break; case bear::input::joystick::jc_button_3: sprite.mirror( !sprite.is_mirrored() ); break; case bear::input::joystick::jc_button_4: sprite.flip( !sprite.is_flipped() ); break; case bear::input::joystick::jc_button_5: scale = 1.2; break; case bear::input::joystick::jc_button_6: scale = 0.8; break; } bear::visual::size_box_type s( sprite.get_size() * scale ); if ( (s.x > 10) && (s.y > 10) ) sprite.set_size( s ); } /** * \brief Creates a window with a sprite in it, then polls the joystick and * transforms the sprite according to the inputs. */ void run_example() { // Here we create the window; it will be immediately visible. // The engine does not support multiples windows yet, so be careful and be // sure to create only one of them. // // As soon as the screen is created, a render thread is created bear::visual::screen s( claw::math::coordinate_2d(640, 480) ); bear::visual::sprite sprite ( load_sprite ( /* The path to the image of which the sprite is a part. */ "hourglass.png", /* The part of the image to use for the sprite, relatively to the top-left corner of the texture. Values are: left, top, width, height. */ bear::visual::sprite::clip_rectangle_type(0, 0, 57, 65) ) ); // The position of the center of the sprite in the screen. bear::visual::position_type sprite_center( s.get_size() / 2 ); while ( !g_quit ) { // update the state of the input devices. bear::input::system::get_instance().refresh(); // compute the new center of the sprite. transform_sprite_with_joystick( sprite, sprite_center ); // and build the scene element such that the sprite is centered on // sprite_center. bear::visual::scene_sprite element ( sprite_center.x - sprite.width() / 2, sprite_center.y - sprite.height() / 2, sprite ); s.begin_render(); s.render( element ); s.end_render(); // wait 15 milliseconds before the next update. It is necessary to avoid // the sprite to move too fast, in this example. bear::systime::sleep( 15 ); } } /** * Initializes the Bear Engine's modules then run the example. The modules are * released before leaving. */ int main( int argc, char* argv[] ) { init(); if ( bear::input::joystick::number_of_joysticks() == 0 ) { std::cout << "No joystick found. Leaving.\n"; release(); return 1; } run_example(); release(); return 0; } plee-the-bear-20251226/bear-engine/doc/examples/08-music/000077500000000000000000000000001512343254000224745ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/doc/examples/08-music/CMakeLists.txt000066400000000000000000000031321512343254000252330ustar00rootroot00000000000000cmake_minimum_required(VERSION 2.8) #------------------------------------------------------------------------------- # Find the root directory of the source of the Bear Engine. This directory # contain the bear-engine and bear-factory project directories. if( NOT DEFINED BEAR_ROOT_DIRECTORY OR NOT IS_DIRECTORY "${BEAR_ROOT_DIRECTORY}/bear-engine" ) message( FATAL_ERROR "I can't find the Bear Engine. Please set BEAR_ROOT_DIRECTORY to the path of the engine's root:\n cmake . -DBEAR_ROOT_DIRECTORY=/home/joe/dev/bear\nCurrent path is \"${BEAR_ROOT_DIRECTORY}\" and it doesn't contain a bear-engine directory." ) endif() # The engine comes with some CMake scripts to ease its configuration and usage. # These scripts are in the directory below and must be assigned to # CMAKE_MODULE_PATH in order to be found by the upcoming include() instructions set( CMAKE_MODULE_PATH "${BEAR_ROOT_DIRECTORY}/cmake-helper" ) # This will sets the variables of the source directories, required by the CMake # package below. include( "bear-config" ) #------------------------------------------------------------------------------- # Include Bear Engine's CMake package to find the libraries, the link paths and # the and include paths required by the engine. find_package( bear ) include_directories( ${BEAR_ENGINE_INCLUDE_DIRECTORY} ) #------------------------------------------------------------------------------- # Now we can describe our project. set( TARGET_NAME ex-music ) file( GLOB SOURCES *.cpp ) add_executable( ${TARGET_NAME} ${SOURCES} ) target_link_libraries( ${TARGET_NAME} ${BEAR_ENGINE_LIBRARIES} ) plee-the-bear-20251226/bear-engine/doc/examples/08-music/main.cpp000066400000000000000000000060031512343254000241230ustar00rootroot00000000000000/** * \file * * This example program creates a window and plays a music. * * In order to make this example minimalistic, it will not use most of the * functionalities of the Bear Engine. Consequently, we will have manage the * exit of the program ourselves. * * The SDL is used for the subsystems of the engine. Thus we can use its event * system to detect when the user wants to quit the program. */ #include "visual/screen.hpp" #include "audio/sound_manager.hpp" #include "SDL2/SDL.h" #include /** * This global variable is observed in the main loop in order to exit the * program as it becomes true. */ bool g_quit(false); /** * This function processes an event of the SDL. If the quit signal has been * sent, then g_quit is set to true. Otherwise the function does nothing. * \param user_data Ignored. * \param event The event to process. */ int event_filter ( void* user_data, SDL_Event* event ) { int result(0); switch ( event->type ) { case SDL_QUIT: g_quit = true; break; default: result = 1; } return result; } /** * Initializes the visual and audio modules of the engine and registers the * event filter to the SDL. */ void init() { bear::visual::screen::initialize( bear::visual::screen::screen_gl ); bear::audio::sound_manager::initialize(); SDL_EventState( SDL_QUIT, SDL_ENABLE ); SDL_SetEventFilter( &event_filter, NULL ); } /** * Releases the visual and audio modules of the engine. */ void release() { bear::audio::sound_manager::release(); bear::visual::screen::release(); } /** * Creates a window and plays the music in a loop until the quit signal is * received. */ void run_example() { // A window must be created to initialize the SDL. We do not need it for the // music but for the events that will allow to close the application. // // Here we create it; it will be immediately visible. // The engine does not support multiples windows yet, so be careful and be // sure to create only one of them. // // As soon as the screen is created, a render thread is created bear::visual::screen s( claw::math::coordinate_2d(640, 480) ); // Musics must be accessed through a sound manager. It will handle the loading // of the files and the releasing of the resources when the music is over. bear::audio::sound_manager sound_manager; // We need to load the music into the sound manager before being able to play // it. std::ifstream f( "mus_1.ogg" ); sound_manager.load_sound("music", f); std::cout << "Music by Alexandr Zhelanov. See " "http://opengameart.org/content/mus.\n"; // Here we start the music. The second argument is the number of times it must // be played. Zero means to play it forever. sound_manager.play_music( "music", 0 ); while ( !g_quit ) SDL_PumpEvents(); } /** * Initializes the Bear Engine's modules then run the example. The modules are * released before leaving. */ int main( int argc, char* argv[] ) { init(); run_example(); release(); return 0; } plee-the-bear-20251226/bear-engine/doc/examples/08-music/mus_1.ogg000066400000000000000000030137261512343254000242320ustar00rootroot00000000000000OggS&à6~xvorbisD¬q¸OggS&€ú§k-ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿvorbisXiph.Org libVorbis I 20050304vorbis)BCV1L Å€ÐU`$)“fI)¥”¡(y˜”HI)¥”Å0‰˜”‰ÅcŒ1ÆcŒ1ÆcŒ 4d€( Ž£æIjÎ9g'Žr 9iN8§ ŠQà9 Âõ&cn¦´¦knÎ)% Y@H!…RH!…bˆ!†bˆ!‡rÈ!§œr *¨ ‚ 2È ƒL2餓N:騣Ž:ê(´ÐB -´ÒJL1ÕVc®½]|sÎ9çœsÎ9çœsÎ BCV BdB!…Rˆ)¦˜r 2È€ÐU €G‘I±˱ÍÑ$Oò,Q5Ñ3ESTMUUUUu]Wve×vu×v}Y˜…[¸}Y¸…[Ø…]÷…a†a†a†aø}ß÷}ß÷} 4d  #9–ã)¢"¢â9¢„†¬d ’")’£I¦fj®i›¶h«¶m˲,˲ „†¬ iš¦iš¦iš¦iš¦iš¦iš¦išfY–eY–eY–eY–eY–eY–eY–eY–eY–eY–eY–eY–eY@hÈ*@@ÇqÇq$ER$Çr, YÈ@R,År4Gs4Çs<Çs@BDFHJLNP@OggS@&¡Ò_Z\eÿÍÿÖÿÈÿ½ÿÑÿàÿÌÿÕÿ´jEk'ÜHŸyŸ­¢R£Ú‰ ‹Ps—ÌÌë¯Ýï”’¥E—â²,k$Œí0´q‰~2å¹¢:Ä!My]i¼®#u{±R äB2ú|fÙ®Tþüz-ž"nìUÆà±$¨‘€žµòªKäÛ]ÍŸ•Ç­²KÅÁªŒÂŽ©>¸èºÒê¾ë O¼ôüXúE6ÓVkšQËIUä ¹®œ]#~à$´riÅ.Š!ú³]Ê2eÙ!"©ž>@k+¢xW1Ù\^¼S+?%1£‰Zõ£êÛì_=Y§ßòu¼ ÷ýÄ,Ûùr¿î¿÷êû_‡ íkkç> úšR +Sˆ|;‹æîû^Vb@Zëe^ÂÈBèn¹Ú3ò BŠÐüˆƒÅÝ£Ù«û‹Ëtû”0îÖöÛ¯oûèÓG>ý& Ëj5£T†šùp5bHý(4/É6´S·[b0']Ëü¦{ËACÎqœFI5ØGl…Qöýów½Ÿ3U¢ÒË%NN‰ÞM!¹4MnõñšN E}§œ5™K–÷å-(ö.û­´arê^EL¡ð_è8hú£ª©~h?o™º5tsžÞÌŸH¨R„|6}oî ÕÇÇr¶ïÛ=òõ3Ì?ËþO&ý“™G&¾ö¦¾tô&Îÿêžäæòv„s¼\òþ&sî!)ºûÙ,ÛkÛífضáïßíÇ¿™üÐó¶™îÆí8»ýqݲÁŸß?s›˜á 7×.*“.Ýu8Ï™õjg PÄÝQ–dÑ·.ÈóÄÏOBgÄY[ÌÄÚã>³¹ !kÃP„³ÉÞ«‹ä †â˜õÌÌ6o1ÙP™;õ2–‚É¿DÒØj²JQCGÝò•Z^^ wR%#´)½&@­BŒ€V (­7žËé+² °Ž¬q#>Vï4ⱄ÷!æ£}«®gYM#t€Á¾¬í €/A톳¥ÈÇ j¿.>Qð$šÔ¾¿ýo/Fä X~Ýó|$õ{hUªäR­.À åùtõmæ¡9°ùò÷ÿ¢qìOçm‡¡Þ¿,œd)M³£8å©I¼ºŸÜš›PŸØó]Ü•ãl÷ç^P§þ8ÏÐCð9ïÒs;*bS•½Ô!­¨{}’ ˆ¨U<-X~&ÑDÓÕÞðþ ‡+_ì|øùîôŽoE‚ªê 4ùÿæú2çPçôø±U>;ðYRÎó˜¯;=Ñ8Þ ÷¹?Û¾9-C¢wn6óçák'2’í~¹#ô»]=Ãd²£o%ÿˆêìîaš«éÓ‡™‡Ë6š§_Š-(^Š8p¨æ–öÞCU}xæ×rù`r#¢ ==ÔÇ:ø·×íù¤pwúÚâÈàbû± ?÷¼_üó¹îþÿ›æºåý·é*³Dï©æç!`«æo=;»v|«›õöâ‹5(½í‰C¨ @[4Dë°Ð¾ˆ’£˃` .€°˜zì!È-t° ¬3€ H@·ìßzÁØ‘[4‰‘œ -–ûË@ØpØù–‹e§pA ÜÂ-$^ËÕ’LŒH$±5Çf1 ò ”hþè‡g>æ+À9[çL:g„(“ …R–" ôçijþZ5o_¯Þí?6ÓûÃZ3-Q@ÕÛ:Š×Ë#N::>²Š ¸qøæŠ€tQêaçÌ™+³øºëm¥‹²rPf,t1¤Kb0¦sZŽÉa½|48IÎÄÝ¥çÍò0¨jÝŽíäÃGo;’iš^™ÏÑbJ/úóý8îzÏ`zæåegûÿ«·éû]ÓŸ§¨IfïöçÙ€fHIø'œEá}hç¯þ9x«M÷úSOBÂN#'Þ¯¬Ã?J ÉÓm}bª.ÖŽ\30§] À̉|…½aƒ`<˜—Ù,¿f“˜è;‡Œ_êþ¼+Dì‰WFY7EÏ@øñuá ˜‹ÆñÀŽá‚:‚sƾ9‹ìÙ•_å¾ÝÇh®q À¹>fS˳ÆÛý*!,]ÀûBS`àɃR\x `€•@$R‡€…¿G€a šGº¬4€û¢Óò?If>-Ъ¾Eo„Q•, .–äð&<6ß™4þÛ-Žˆ (@óíÖiØü `EÔç[c²N¬Ð¾öÆkkéäÀœ”ïÛ6Ûá›XMMÕ\¢ üÖ³‰/{ÝWÛþ³µXpsÙ88æÂh{€Û˜ðÂçncéiÖ:b»¤J)¹øž­\ÒD=4šÝur47ö„†»ÐMÞ1w‘3^ij§ôT Tþ*î…Ó­±Ý¦ . ÕItÃLãNt¿½ÿËÃöƒí|±Ôšƒ<ì„a‘cõ½»C ¦™iE¼ïÙC!ÀËÕ;4ÀFÌþÿnpeø/é·ji8ô$‰ŠÎ¦ºê²;÷I(”ŸOðSÓ¨{î§íó#I‰š ÏPKÙ@£Ú0ÉrÌ>•ˆLíÉNSuöóÿ?¬<"ºwí=û\‡)¸€‚Æ?Æäé}ÎŒâX¿í0ü7tBçÛo5IQM¿d-ëÏ>Ý›\òš_gêw>ŠAП­Üø„N8Úà nÄþèj†Ã-— ”ˆÖH¾:/¡† €È8sG¬ x¨“…¨ti¯P1„{($9W!ºìWиÁâ æ-žÛuŽŒ ¹V+„?FDhþhcƒ¯§Ž ̱çù:2¿m£•šÑUIEP€tHWÙNM­äÔájUÍiî¾øl(çÐÜin²ñÜš}H¦ÉŸlSŒŸŸñÂóoàíÕÜ“ÇT+Ošö¶—ÌzÝ­x>¯u›¦á v“bÒ®°âg½àîCÎÔ@œ¡y,LÞ¹§Ø÷Œî| ¡¶†õùïO޻ʋvÇ»þ*På[iÍkùü˜Qtø i>üø’ã°áXê_Ë@tÐDˆ$Œ<š\$Z‡¸è/z{ó<6á]óyúPÛü'¤N3l^Èœ¼4ýëýdô8 I0yê,CãI¾42tPLßõœ©ÿ¯ªvV‘3÷LÀ–LÇkÑÈ6]Þ×c ýΡù@9‡= bîIÃÁg7äûñð« H螎Ó!‡Ã•ÍÎ!¡rvNƧªàÛ"û°®ÏW“½+‹2=Lݨ¦r-¦Ù†žþ O -Uåi¡¨©Z@X0<„ 6‚ÔqAŠ— ƒ{ˆFëV]BdJQâ¾Z÷WÍ^_a¢š ÇrU±U±R`î€D5ÊÏPÛ•È~0€æW­1¹Ù|bŠKŠ ùƒgÝ|Xøfâú‡/WåhÖò–‹Ôð àp.y>À-É“‘¬yXͲ”†  RîI‡Îh‡Úÿî¾=“–Þ¿òÜýÒ³ô¾ßÆ‘ï¤@ ίA¨Vrc[[ŸêË9x_ )õms`Êñ.ÌY£wKènïozŸØ8é~Žd\Ú¥/ |ñˆÅ«OÓÌ%Üø2Ëå™ù™Cl°)Z]EÍoÿˆòópœØ¾eÙþ/Hi _"7}¼•å†$'Î{B’,`û“­äóP(‡6ñéc³¹\¯Õ·nüJrÉ}톺ñͤàó¥;Sä·;¯Öê›·uÖ*°ÕðñŽ{™ÈÚìõf¦²+9M3žk4ߦQ÷µ0¼Š˜w&<த'}íi ÿÞמíÈë¤üz&wB~7­Ð@¿Õº0€såþ»ØàÛ=¶ëÏé=š$;gmCÃÅÐLÜTÉCÃÓ:üW"[ÜpZÁ ½ä (¾ßÌ@Z–Õu ‘w6€ÛöIcIè-ƒ^-@-f¨¬@€/È–¡ô"´ŒX×ma² <´¸ €Ä$“ŽÞÛm@l>DÍ­ZiÈyÚBJR\§š?˜ª-7Í·ŽßxÙbÂÍßÍÞi} 0|·Ü:#©oUuÐÞí s U%YJ~4æô¤™»{Ü5Ià#—;ŒÂB´&åx¼)£–ü¦phl(Ö?-kÙÃ}ñ\ŽfŽ~I¥L¥ß×9¬!5š¡ZGæ¿‹¬8ÐÃäòÆs `éyà>ûüïþ€Ô4Í ÔO5×ͨש/âÍÆ4*¯pÔ11yXSöv?7‘ì=‘Ç*‡× ȇ·*Œç¹ÿið>ËüšëáÔµýf±×Lšž©3M¹}‚d¿¾‡ùÚðÞIrÜ?øM’wHõ5ùüÝnšÑ?‚ÎŽ¿nÊóìÉ‚/º=οeR3Ìœü9Åáäïñïºfh^N¾IÖÏœk@Êh˜M³ãî‰Çæè€„ 90MRÈ “/O³w'©‚Nˆü/–wÙ³\,‚2-²ÀßÁ»ã»Ã*H½É(¶‚PÑEE{de#À ÎÀˆâg€£ûµ·dàŠà#; ò*^})  3JMÝ€´óPl0Æ€óPÔo¥A0ƒ¡Еƒ¢Žš? HüÚ^Û-šŒ!m"B/V« ‚|øMaÉ–hþ¸NOá»ÙÇXûK€Ð3æšÏÎá;êÃ, «™©c4AÏëKnïSkùz—Fú¿s $ªH QèÍ>[l‘gͬEÿê…ë îÙ£Wåvnœ§ÌB®Ž®Ñ±ÉaZÞ«ìëTýìÐä<ɼ[~RIö"‡îãë½µå© Ä½¯¢¨ ëˆD’õvÝ?2yó$°AƒL¿?†Ê¥ç­qù»·¥üFaè¾û­³”|4äBl5D8óuIW¼Ù|M4 °oÿ ¤…= ñÑ×¼øÜMO¾üû4ËtUÔxj­C:þrñÜ †¹\¯½¯¯3ãñOpw÷g&@NgãäÁ0”«»™äçÝ@°ÏëáX)3¹ë}>M5?ß"l&ÙE~b–=€w0s”Î Œò®ªe¾YÓPô¸¦»“}¦H;ÉeäùÏ—îΦ¨ªñ\LAÍØ­º@ÈÔ•%J„à sl#ZøÀ`ûzß"!=I $n„]š /G„P%’Íp`6 Á5(? .ïL…î銀ûl4í¡æ€Vk à€Ha¾4žë-›MP¥–6Ïn½ÀöcÜŠ84¿Q·Þ#Œâîqïwò%À6Çê皌}¶Ñ”¨6ñ” @ ÏœÿÕT®Ë0kQèöMœZ&ö4/M>|ßl«D.WsXýÇÈ$k¼ ÿU_.Ûã b²c«iqúØ,Vžn²xÑ:ïLò+Þ ½¼d²oÑw(±ÛAd×ý\ÿ ÛÇóþ}/1é(1¹ äë'ä|Ç¡tÖ »É õ"ewÂûÿV0üïFvÑrè”dËùùú9 쟱?böe(Ëέ¿æÒM ÊwÞ¤[¦˜Ùgéü9…ôžÃ§—î™J1{”ßlOggS@C&³MæÿÚÿÒÿàÿØÿÁÿØÿéÿÈÿ¾$oRG¤OrxiOÒeÔ?%ŠÜƒkñ*â{çgõ‚ž¿ë{†¾ñ)æòù¿Þ,ggúÓ.ß‚,~~¤ÖöµÎÍ|$tøóÁñ±×“F[sýºÛ¹è™9]ÀÐÌÓGbš­Ù¯‡Éȉ#9î-¿Òñ“@ñ¥‹ï<õ8€*  ØkÞ€Yà €A#ƒ6/0w6’‚9=jj×,(AK(n!¿2Iñb@€AFE›ðz$7@h)Å<2¦¬»<øÌëa€Òô @>æÀž±C…BØ+AáË^ÛÕD$ˆ§¢^êVH2r€°Fó o;"ç篯/œ@Œ3Ž?òmócÎZÒš[×Ö RÔ`#xéÓü}Æ>Ô{ €OøÁGȾäre³ÇµËæn é_ˆaΡéç7ƒìUç®tžË.|ÿ2ùɯkzcðle+.}kÏ–=ÞáI~=ÿ90Ðÿ•ž=“R¿Q´ï© —›]•†½Y¦bmdçsà$[_þe4ý±40@%3ø%‹§›þ‘—B\ÄÌeOØ,çá8¼5+ðÖI›ÚœºñÆkƒl$û¶{[\ëù÷NáJwßA?s£ßè6s?3EÁI`âû#ü?yÏk‘²Ý˜·C4 {ÄN˜3q}qo/п'0ó\>ÿîî8ÄLNl!ìÆ[Ÿû>åeo »y*ïh~¨šäÊÞùïÝ›Å'iê=•ðï` ÈkH@ÍIœêº~©®Óãó-Uƒ®_k=ÀôÔ]y`x<Ð …%ŒdÃH$vx6è}ߨÝI*äÀƒ6dq‚ ,^ 6ÔzV*í¹o]- –T3/‰h( ˆØpþ ¶°P¿€ÁhÕñ  ¯EuVŸ _à¥o>ÛM…TÖmHm~Ýš‰„ÍøEÜçàbgKÞþDZZË—û¶®sÎdÙÑzu›…jÆ"Š Ž 6þp1»[õÇðô÷Ùœ'œôƒ²¨D»›¯8éi<42Û3"̦s5s´ëŠÞ?7úÂô–u#°=…¬žçwÿõ0UÑÛZµt†¥ù2 6÷Æ ÅØ÷€ÈMÿ5³=²Œ>m 0ÍÔûÄ#×5~Ë¥þÞÊU"35¢h˜(e 5C1÷/ç‘,w€_q$€8nðïÄö²_öd‹üïfÊÞˆÃ=L\.$—$÷ýWþ¾»ûç©ä$œ §¶ÛÅÌ#™§çùðí=0¸°>ÞlÛÖE“puª€à×·tU^èúHÐñúñù&±jTЇÓPŸ=À†û‡Ïd™N}ÙÍ @7ôóÉq±yg·º„¦¾5E'xo~|ÿÙ‘dö\\]ñVñ›Ã5‚™³$8剀¼*!c(Ý~d°ïÏ„ΕÙ`ÿe0ä2ò£HEj()’ä®h  ý÷û·Ó‚º"¤”TM@AJ>sû/6|ÍN)Ð^Ûu‡Ñ4ÙšæÖ­p‘†Ÿò•±×Ðù Ðÿ$_ls=Ò•äâT¶ü/ÿš$#÷¡æjhP^IQ€ƒï©NÇÖ÷orhEÔÇäG—?’ß÷R%ú»«uæö‚úm` ä’XÜr—ÉJ·+…rj”ËL¦bntî€÷¬AWkëi^ôÚéï¬ðÔxÎ’e¯›¢³‡ã\^wÞ×Ëóš’EZ»7úƒ2haŠ¢:⑽|l™jä¸Àd ÐYý:o xô‹íPÚ,7À˜å²~c¬¯ÏpBæ”9Áòõ$ÚñqèåÇ×KÚñûÙ?žÞ±q?â#¶øÙÃ5L|”Ÿ‰Í‚‡Ÿ7%3õ_¾üë½öÖ/t<Ÿ¡›“{`—zþ_8bpÄ­Ï~kè[Þ ÕUõôuÇ?é+‹ká ‡3>µWÎËÕ{ûçäNî‚oò'fïáãÀöÙÔ”P…3Ó|ŸèašÓÆrಥ¸tæUÌôÆî!M=ô§¥8@Ó5Bêw}ê~ß5@`@p´’bßì`¨Z aJn~@Ò H'# VÚC&²P’s-&­èó”'êÕõÂÆx€Ç€€ým¹øE Y hÛ•žùM Z·´ùTK1~L[âî+À—s®GÀM÷CØGîçôÖ†JU HE™ €…oë£rÆÒ‘Ïåñ Þáà³w<éÚœ·“%{… µH4Ê!^ì8óìyåÛa>N_~寛!ÃÓžõdJ3ÛBZäª~ßùîµ´àxÌŠÜs¹6™,^ŸÇå&¶m™E]8¼#ˆ²oÿx  úÒ=à³ifcמ˜'Ðã‡XNâ•05 “5ÄÇm¯füÉßf?+†ÎúÂD§È.ꮿïöÍ)¡bóŸ_œÜ»Nç¿fê{ æ _þÇ[#DȃÕå¤qœØx-;¼*¡éMT„hZr†¢½h;‡ôà¥Rò-È\ŽtP w>C›û€è®ÿ¸QÃ!?xÕ³Ó˜§,=taÏv¼EÓwÆ¡iÿë{Ûž ) šöåâãUº÷˜"€ç¿iQ½Ñ¿ùLÕÓ<}zü9D@< zú4Ostl`‹m¾>åf"aŸ®ל–Zøœt7ù2ìîÚäO;Ðt~É'Õs&ëSYYúùâI’¡wÁM&ýþ?‡Ñ8Ú;³Ø†?@¾»Ô?L1•tW¾O3p˜b6œgâ]hè’:'æêè:•Ç?Cú Kß¹›¥kL9óÎÅçZYŽ©ÓB‚i),»Á¡áé9€¿¶ HG`_cùm¸P’ F`ON¢ † zaЖ,A„˜Zch poÎeKBàü±ÁX`aƒõMèGj°dä¡’XLYw d°œ£džË­†Bå…,#èÕjÃ`Æ—Djõ~¦‚qm@~ p ¼äë¶çéæXKÆ\sk¨…kn+ I*è§^šôÏØÆó9/6 ðèéúo˜PŠŸÛ©‰®¹%k•z-9¥ÛLѽ].K<™TK&{ õJoåo‘`)w‡ä@˜Þ³ÔªcÜJ6pÑViM…ìstÒ –X UV#9|ºül굫 £y"IF¥«v‹ñµËUt¸——PC¢ôݨY–C?‘üÃM*ÇÙ!ˆ—a˜Ã_ôçì9Ìq6xU!ó²ŸÚñù_7—%—€œn]§É'â­ùMÇ ¤yü÷Ú;ûö¶ç3ùœA3?æ_rf{?ïà™»yñð'a“üü CÜËôsꈂÃ.ýQeˆpJŸ4ù›ãñÈífôï"?ïç$Ü\Ibjð7»Òà{Ó—w£ºìªÖ¾Ü¥^ü⬻ ÿjn3îN†Zwa·¨COl&&R«°¥¯D h9žn} bÙ°6)Q`üµÓÒðB#d ‘ €›i0^@mú5#ƒnÜŽ!)€O ކ‚³ŸH0 žË•¦@@„¬w[<3üØÐû”Oö§„ñ às%è›cßP#ñCØYHƒ†nQÖ¨¹ÎQ"qÄÕa»OÇu6½’øžeòe‡‹/%ø\Êt/¸!‘yÌð±ÒæpŠ?u¯[foßåm™¡™;(_çm×á tñm¦d |àƒËæã)ÍñáêÀå–-–rv¾÷eí®ºŠ"¨v–2ÙS6½<Äac¨×¬z!õ14Eñ$aìV³zV#gƒ¡.³€úýø¶¥xüöóš?¿Î@U,ÓϦNfÓ7-iÎgä%-[XTlž/¡öfΉîµ†ùGgxÑüè—ï PüÏ\>–¯!ƒüœ©d¦0S[1õ—s ]{ŠgÏ×´O¥®:Y‡!æs³ËKì¿Hè„}5º]ÊhÌÜ_õF¸{ÈqWœú —˜èܶím²ß¥i*>‹—{ÿÉ ‡€€° ”€¼.-'€à²!A8?€#4±Ý_âH ôº P."€­6 ¸K“?ÖAØæ1ð+0jÀ”´AæüX€޵ÌË•QÌEÁjîå:/c ’¦Æ‚æ>}4ÑÝXûSö£•4YÓäW€Ó)0Ò4 [¿Ššìc®™o˜ºJy’¤j_jq$\ÏðÏ´9¿Þ£¶€ÞÂÄgŸyWA»ÀFzÍZ|Fn¶b Z˜ôj’ç_ŽÃð.ðÀ$gã Ö.¦hˤÂb]ž$¨´ƒ×Ô2¤¶}8òzù»EägñðæÕ7ÆâI‘åŠ]¯ì­˜&Šáú ż=ûš|‡Yu`Ë;ôý[“áüTBUÜ õ82g‡ËŸ?ö(-ÆûëjÜçvίÎÎ~NOðOð§£Þ}ÏKQžIÄñ½O3÷‰á;Ε)¦_à!x’Ó=Ú:ÏÏ’Ÿ—Ã\8”û=óòaÃÔ?$óiþ ÕôÖýY°|¼lä–O6’áÌœW½Ï¸l‹ÈöÖ1màüC4 ËE{ƒ»`xOD¹f&¿#h`H3>ÀÆ0@f4DB¤Ùó矀à€ø– 0°ˆ« –A_^ÁFØ€°ÒÚ`€FTÁ«°©Iž.,inŒÈ¯þ"h¾eW0-@¬d;ìP?0žËM F€.W뜈͉6µ×É‚îP-‚N¶nø0 ÎFžï{îç2é:Æð> \ÀŒ½¹¦•ÜãoMëxBèßd©CD&€æ§¾~õí"ÉqŽ™PR|ìbDŸQ»âÝD¸rh(­Ç›µÇ_õ3—m2n[H½@9Îø8ÎJΚz¯õêÕ Q±¯+—ˆ ŒRTÕ |£OOwfŸÞØõñtÞ4µõá5“kžÆõ¥¾åV殚ZKéÚDÏ.uŸ5û¿>M£) ȯÆ/sL|T’ýè°Qoq8OmþíÑô³ &:“}z>_ÌOggS€h&…A0ÅâÿïÿèÿÜÿÓÿêÿÝÿÜQNNTPNaòµGÞÏÌ¿ùñ‹Áû*".Çž Þúôãâï]s>4ÙÕEEPË|šÜüyÅi ¨:͇ÿ7êßU‡Ö\tt30«¼½ÒÀ†“¿RÓÐ ÛËaA~q¡MBþb8Lµ·GÐÍóᘣ%3wNu½Ãä*š`rX€.†œîzº®u0bËï³\,LË_lhaá‘|F#:ôÏp" ¨´@ø+Ï4x ïAg~ôF0–2E÷ ÄÐòÂVx-ËB1p´f>_ƒ0/Å`¾ËM&4€îVk¼ŒR,)ôù(jsÛä¾IÓé?ò”˜-€þô¨ÝŒ¨öìÂé Ò@]È»%IóúÆH–¥ELˆ=#§û§˜—ü~ù ~.ÐâIûÉ…ûj‰f8¾õ;嫨D±ðåàÿáAw>gÒ)”«I÷»•A:ºµ4ã JLd…3ÈéšâI•,úù‹rÑC JÕd¯0P•ì Ó^(ÊêKBÚPíEV Ž¿†ìSÞŽÁ8¿Í*TÄpóä}ÐþãÃùÓâI‹æk— ‰—!® ˆõ‡£gܽ¬˜§ E¿öáþÞ|T‡øžªéÿI`ŸMöj+“ÇâÃ%Ø'ðK‚øZ+ËëΘ$GCüóЃõZ—å3QøCa:ILŽ{TOw$¿sß›~þÓ™uõ¾qÿ@ž`œžåËQõ퇘`‚<9™Q1nŠ:ð’ý#v€ËðËY57³hͯOÍðó¹‹ '¦Å4°ïúáš çö¢B0²½x}Ið Iñ_ #ôµQÖ% Jä›F`@@À{Gô€dZ¤Ï!.Z¸ UAê$áË} € €=ÒR_°q!ìW@‚©Päüq>Ëu‘ÆLThkµÑ±È â‚æ€ÓÄÚdís³“ß2Àk´¬šÕ¶¯ià-Þü¨í«ßš¯m®YЧ<ÀEB¿ËÁù)ä »oàJïßß¡0¥ŸKŠ|70ýžƒûÔgÊØ·ó£0ß»þÇUjdrãoG!:‚Ͼ9þÚÉ·IÁÍ‘,'ò–³fbuÕ¦;u-°!cÍU8kÇ)Cx0‚.O•‚ˆ8gÊy¤×xš8” “¨*Õ‰]ÚÏŸX‹ ´ ðt}wV¢OÅù룯˞ÿ¶|Fã8Æ’ ÄË[çøÃážÝÄüéY£+š*UQûì É,ü©óóN«€â@ïË«¹ãÁNl ßæ'À/o~}¾d†{>á2È»¢}7fžÿgM~ ¹³míã>ü\G¤¨S; ÂE·Ñýž…@Q½ûwüNg‚™g;AÀ'ñ†,6ôý3@’çʼ”êS§ë³¾³šš¢n ú鳓Ãi†Ì»¹ 7"Æî6¸ «QýŠ$`I¯IûütN€Ðð*ÑøƒÐcàWi¹EþV¾|i€Ýüš=mú1àÙxûøO$ÁE° !AÀDÙ:Þùmc(ÞËŽÈP¡íÍÖ$b¤4¥të!zϘ?;SŒ:_ÖœðÀIÄ+ˆœ[¾åùºmÓ¯1|5*<¼ÑàQßnÓÆ~]Nú'P€ß¨ž[ô3xJ•ê鋊÷¹îÞ_Æ›«n´iôŽØÿËïìJú–žrqE#4ÝO8ù—÷»8O]F|ú"Ïîòœ­³<÷"¯Ê`x.$Û„t@캣rì”òù†ˆun€9šö¤ý[’ÃmÓá/Ú¨ç­ä ív;‡¯=¨eX}¶Õ{ì„öÄ£•‰š_øÃˆ3@„gÛ‚ÓË9º™6«}©ÂôNóuònm&¸›Üuª€žf¯ï}Ú 8À=§ ‡c&Q™¨y‚N>ÎÀ4§ürÇ>óÝA lõ §=€9ùÿÉÖ ÀÔO¶v‰=PNºß,¼¨#(€|wÞ©¸2sö™ÙÅt“SÑPͶÛZžS ±-9$ lgŽ›…ÖnT[Pš˜[ ÿ™d˜’(š2+p ˜Š®u7¶›Ä€–õ’ x€{„ØŸ~† 'Ñy“"ðçü—”Í|‰`¢ Ð|59Øk¸A fk])—#7ÐB p#N{pÝ·@¾ËM“ŽÌÍ á?듌̑ÒyÞà+ÀôÍ.÷¹æûžù°J/ƒiWpæL H€ù»¯˜£¡ÊˆÆ7öú”–ÞÏWDÂÖ:ßqO-¯‘Ýb¨CÝ—`ŽU¯ÔÔ÷åÒ4g£æäü%bó6û.îÑVïäfàhÑ{ )ÓÄþÕ{€Œ"ÉywWE;ûŠ ±/Ÿ}«JQå~D@ Ì0©ý9{ŸMâò#§Û%år Ì)€C켕iñ‰¢N:õuûÚ›×ýl:M“$$uÒꯌø䯛[ÿþáMDûáGÁt¡ž;96Éóü}iÎ30t\ ýyÚ²;ýôÞ@_ùo¾ôË—Jø‘ì|ü̂楯÷|f€žjb^@ð‡€}¢ šÍP›¥Sשµ~>Eàž|¸^ bvr®Þcöì&(Ëw®ù¹vCÌ“²õÒÄö¼îÇ[TRÑÛþ™Bk¯¹˜y¯>yñ €…1mÂÁ@«~TRCâE‹EÀ.È‚ü½`9T8*t Û«ŽŒÀ~-¦D÷/%Mc6n°nŽlB ø]Z0þÊ5UÎdæ(ŠN_m¶:¹e™½ž}<—¼¼ö?5£Ÿ< ñíS ö7€ìû“@_ Üäã´´_äÎPÄ~€¿Àê×$FÍ[î+ª@úÙµ;OÂ{Ë}yg(‡äª2ÃNï{w("ÇZËyÆg<ºVÁ 6ĔʔÚñ¶×¿õÒ[Y{jŸò’—Åwt-Á2BiEs¦„“äô¾….׫ÞŵcV4_ûÒ%j¸ØlÔó4g-0Õ>æD”JøùØæb»Ú 4c]§|8Îõ›ý¶õòy¸2l±ÍáeqŸÏÕ¾¯¯?í:¼ CV7ÓߊçvsWœ¾½Îˆ_\éF.@î±™gÿŸ[=v/A̓Ûy €"Ÿ*Ý•YÍ3ÍLŸÝ)Ÿ–}?Ef7^Óô{0ŸýK¿Ë¾›:óÓ?ÝÓœD ýN€àøøOz›Þ=y.²²µ9Ïü³gDnÿ `&á­‡ueÞùf‚š8™F€@° Ì»2NŒÞEý¬ ¹ÁÆ¿%äf À{Ѩ°X¿£ù(`sa€ä‚ÛÿÝFÄ¡8Ðb)a4tˆÐE‰࣫ÿ®  €·‚¨@¡k(ÞËMÕ¥#Wør±±êØÄ˜¢*¨ýàøDAoLþêÍ™VUŠ¥¿|ò+ÀÓ•€ÑñcÝòü€Â³Á×@ÅôÑŠšYVêÍŸ´²•£šÓ$¥`ª‚RH<ü¬/­˜x/£“Ètäücä¡©ì x@v ™ [ átËç•~ùªžë–:û§æÐýòγØY8Å¢å €>¸?O)S¨ ZfœZÛ†êi ”¾îY¼²Iä¶€iº9~Ì5—¬æ"ÛüøÅûTG;Lþ®¤údÍU€Îœ ´êÍùà%b>ÀaöÝ?§<“ÓûÙ!>|X̾èHc¾&âô{ëÛßõeâB@AL˜‡]—·Îy`˜J xÝÞvÿJ€€ª>Ô¿’½ö|ÕœlŠ*~Ýk5:ûìÿ.Áö¼÷ñr)§Gú´¹ÆDw}¸lA֟虤ÜÄw˜}Z ßðTsvŒìŽ/É™Œ¤×'§V*7€ñ«Qç4DZ)¯E“aöxE0°¬TF˜?ƒWŒ@`[C[¶¯xð ©°!ÁÛòCøyAË2 ¨_¥XTHR ˆ*w@&UàZ{h–ºR¤#E_(A™ ¦¤J@û˜×éÑcE?ºcf}x%y6F¾ /…·Ä3Ѳ>(²2í î•[f¾'Ãû)󣯅³PObJ¬üZ;¥tââºÿu²1S©´Ú`}0gQlªDÒLIñ\yòñ2'& r¦ÒJç)»+¿pã@¥Zk Z:û×g@û”>=%E%ÇMê\ìù:´‘‹ÅåI£Ý¼äÖ0O1Yû¾ äúö9/ßjýìÏr¸òœþ¸øõ1³U §o½âpUþèçj˜)N5_]›¿Ô¶ ˆÀ€u³¾¦¯Ê7Ó4Ëk¶}}ñ¥/þ¦Ú·Ì_þ8æl_|yÚ<˜]—–»Ó¡- ÷lËñùí‡W–ð§Hn=¹ç>=_¨åß 'ý·ìÇ¥ôÏÙdǧz«8†7Ù2è:6ºáæÛŒÃ>PÌÔ©Æý´1ýYdTv“o?.h€B°`ÌÜ¥(Y`“ÀS¡}™Eå‰âT6޾±€m0Õ˜ð:Mðù5¿îðȬiX$ïs=ò‹›|\¢bÁ—è`ÏT¨¾T´ni£ÓŽ ÷¹kã0>¢•O]õþ.˜ryÓÙ Ú„æ|üöß½Æ6¥žôwàÛõ{7yfïø÷¸Æ×íÌÚ4ôa¤Ù3ÔôUÄB!hdDÓ·õ °‘Äñ§þ`›1j$ƒ-\·¬™ís†ÕÑSb_Kñ”*:ÿüç|êg¸Fï†C~Ì[‡ÿùüN椰’RºðÜ"¤bi\KRz¸F¬”&FB‰ þº8€ëSÀYKö²7¿W6«2÷Æ]Œ·ƒg–ûŸúò{èó³øö|ÞñCÕéamëlìv~)Ô„Z=L&¥kúÏ”ú¡'\J‘èþ:S<éqLƱüu¯]´Ù^¥-3NaÑgHOÄǼþÔÞÓÛ——ÿwlüË9|ʉ½ (PªâÄHùDÞW¬J5k“†mv2S+TãI(„ÜñS¿m­h­p¶dìÎv8C j +Oyu=Ñsß<Ýñ¹œ¼ps¦‘t1§§æ÷¢ÞS{ˆÀüuþðáÜNuÌP%µ¾]; õ0¥JÒ°ù[ï»âÐ:S(Ó]ñ¶Cî>šE¯œ" T:ÄË9%QÝÌwd¹è³ŠüÖOå¸!ÙŽõòWRþKÚb% ;«Toír‘äøžùîúíþŠÖÒ Ö½÷ÙŸÐéHÖ[¦ù„o|º9(‡òøð3›MA}:ü=äsÚ0îå{e°Ëúš÷ ¡·!’:½h"¯/½—÷7ÀŠÙOggS@‡& Ä>¢`ÿÎÿÊÿàÿÚÿÏÿðÿúÿÿÿ´Z=Æ€W‹½ŠÌLÀ¤|€Ü¶P`ɶ¿æ•÷.î·1ëZtˆh¥–ÓtýGýFäüuœä3‘ñe£ÄÒ¿vô­ÜsY'¯Ãž—=®f¤p9Y9æµöŠ0͵(KPˆ·å^*Š €´ÀNàï¤Ú$ƒhÿïÛÌv»òU” Œm›ëµÑÌgu©0QHKæ5D7gýö ¥n#øΚyÐ9ùÍÛÌ=1=±mÕPÈj4ïžæ¾À¸cÊïm×ý”ç;mž€ïÝZêÎN…º¹lƒ_t’rgWVYE«,©‘æªd¨&=€F”Ö™¦ÇvYIy„œ;ç=³ÄÊ]‰òr&ºq“¥œË¼ EvYØ£=_§ÆÓѾžžˆÎà…&€?é‹wóSoTB'Ž¥Ð@´“«T¿tÄ'E"—ËR»ßfÈc²þ*S.f¿ tê|šwöüñe©ÿä‡r ’jrÓJ~`—qm|õJÁ0mýEiÆÙ¢;E†ÉöÅ•ÁÅ-ŸfgåT’ôÊJ`wyç®ÜqŠPL6âÈH*§r¨{3ø"{0—HáZ Eâ` p‹`Ê]EŒy(7Ó¾à.„¶t¿êÌRYžË5PB‰›Óƒâôb³0º“´ß'ûäë6õ¾²ýM+Y{ÀÈçðk²šŽ®>¥ — ¡¦Ž´Ñ¼ü1+oîôĬú<¼ }™a-ïCe5)%§YÅ@kn¯õ ä™KÈý®È]k}v×… 7ôwSΖŽe>–£Šå!‚ÆBë’³gïÁ»¨)™° ]Jȉž¸Ägq¿m†j•CîžÎºjïˆ b zÙ–ŽOý5Þ ^Ëé»NrÞ9pZr¥‚lÛᓌžÝ(5óÚÇ}kø=3U5¥ TP9 tÓ ††ùÞ—¢+æÅùP[P9ª«ÉXÐЉ3:PQ»«HÌo’˜Ü GÖ@©7¢Ž&ŒÖÎÊ Ø2cÍf¦ÎÓÜ0ÃqWñÅæÛ[[•MÖ0$3X&#ä´^…4}e`͈I*;#u…º#H9 +ôÌ–“’…Áb¡/ÄŠA Q‚d)P A-”82B °0²PL%@°ˆOH p³†H‘aÀ—@+±Ô°1€mc€Æš~q"Ö€®÷rÿ0ëQà Þ›­LBØ Ö6'AòÐ"H¦wÓ…í^fmòœ½ÑñÚõ«8µ,óê'à÷õLöÉÖ®=K€Þ†ëi:Å1ÐÑ”œ?ß1ã*þøµúž{M(“_yl̬Nª/etÛïòR|Éuõ-h8>i :ÜMzªñµÖ3¶[B.¡äR ,žk U#ù´"„4 Hh.ó@" ×Y” ”,Rš™ž«¡«qZ ç€"èÉPszC+}Èà­¤»QœQ2–5 vã«Óõ(uF÷+r–'JƱdFÁQníÖI¦ï“0üØ“ë/‹Cì ¢Ô[gb™!³P4Ì#kÍ §2ŸŽYA¼lÁ!Ž-Ą́vSü!®–”l“ß2H6cö4bdZ P³dc2¹!ÇiîK73vfn18 ¾õ†¿ˆØ;\Ô}¢†„Ê{ƒ™›Ñmþ›²È‚Å1m4œEmMª«*¼¬Mvé¾Ô:dôê@k5Ì#š“ÅÊZ´´…‡LPãC²ÀQ¬@Q@QÕu¦> @VØ$D`/@m‘"»Ô BY€@ka 0À 11nƒà Ä ,ð6O äÄŽmˆ^l¢µ­‚Vˆæßìä$ØÍ ’h~Tgˆ›Êž^ÚøP]5x)ip¢öKs›ÓÏdmÌuëꎔ2q*P#J¬Ù;–˜ÔêW>¿¨™›a‘¯©ºCk®Š…]&;Ñu,!efèÍÞÐr¹ôñÀÜõücjÈœT* ì §õöìÃeÅú²pndž™ˆŸ 2Y;÷óÁîºãM­Ü2WÖÚ/NÂÔ™¾‹†c6vèt@D%LÜL#è½: Ãý›|IW{QÀ %„¾TØë PsÜ S€.€L¢ÛÀT Å#è$m)„±[+‚€#8EJ‚8Ož  Š¨êZQ`‘ÐLA, ˆ¾ÄBŒAJ…o ,Šk„Oú¯¨´ ¾Zš& Hëe44·f¥0É2¡M”ehÿßz žŠÕOgt!ÜXÁ [>çLÖÆ>¦he³îtI$ïqlÀýÕœÉ1ÁƒÇ#©¿¼oVðT9ߤœîæ’}®Ú¶-—'{íÔYÀÈ ÆBôX#”¢"m©º—'cŠž1àz<'Ûâ‘)‘Cn²ó–C øâ쳦N!ç{…ŒUĈ§×yMŒ'çšõ·aæ”<M®²9n 4½.²}ÐÄÀÔå2CêcÂG,· âô°;if“ºÔr¼ÌÁélðIG0P6Hkõë ÐC"’£?gFtÜ4$œ. ¹9³½€«ë6ÈBoÎ×¶×ìë”õO}ÄÈ [AYž  “ÔŒC¡Þº>šI&€Ìgz9³ì¼å«Ç]Tv¤ ògf È“$†©î¹Ù¾¨èÜvJHöO8ôø×/˜óLP>A&8$Xô2À” ÷§â¼ 0f0è¶—Bi€2ñÔˆA$d+Ï‚ ¬w•¸,„#è2г[p2€T Ê3h”?a}q@Lb1>aJX¢‡À`„ˆÄg]c¶.Ak55€0+o þY@ÎdÆìYFG{Š¥LÇ&eFa’"jó©Ò°9º?áæßH¸Ñ#Þë`;Û‰Jb_“µÍ³ÜÎ °TkÎNg€kÌûaÀû‰Ã\f¾ÒÈà1`•¯§àQ=4´ª¡]Èræaj\²Ý\½‰P )%©€Ooò–Ž ¡OÎUN†â—±äLØŽz/Ê']W¾mzÁƒ¨hOÌ t¦“MÆ!1K¿¾JlÜši§ú†¿B˜l-ºž=:P×ф䒲Æ_?•œ{·±Z ¢Ÿ.“í>ƒß2ÝïLTì_Ôp?¾w¤™Îj4*ÝNE›ßÉ.Å!vŸf`ãõßïž#^yâ\‚)*®ÛÉð9̳¬,åb˜Þýi.걊&_ÛË}^Páõ U £°˜º¡yššÌ ÈKÿÖóKw*6®ŽÉ6üø{‘ùLC73R!/ô2ÿ &ß®àù †?k†ÞS@ÄX¦õ-k«ÿwµl¦rE#HɨnÛOAnôZ74‚ <±‚¥Š а!Bɱ¶ŒˆˆAA_ ‹²jÀVÇ`Á6g‡a©7€È”€P ޽h`TQ2©žG@#䑌j(+d$‘Þ9¹ C–©Ð–b™ÔÉŒ¡‘õðý¿»³Èž¯ |hø pF³^¿‘½@ž†€ŸûH¶6Ÿ[§»Ùº$ FŽOC» çÇïð¼ €~´ÍäÄ7’ ÙKp…P}Qm¦ô&gÆâôüuf_±àeœf7nípšyìs>0KG§ºËG–1V ½úèþÞê(aõŠ•÷±ß\´-¶ý›.°|3 ²ƒºbãH ¬¦Yâ>D¢f’äòïI„ýº¦¯×¶öD}¹?æuŠ¿>Y¶Ìˆ,d(:^ðÈåëÝt'ôý7}†FÄñvÿì8ˆòÝãºàõå2û˜i6×ç†9•[ž-PžvnðŠ¸žþŠÍÛ0ápä ¥f‘Ži_Jr€M^“í9tÉýwµ…z|‘æF2Á‰·ß3÷Ð^ËY)€©û(«èšh¦PÐïUtNv´‹„¡bÄ:hfÀAåtäç91OGÄg@¶8wŠL64ÀѧÂç§ @uç–ÝGc ðC‹ Âî ° pz¬Ç²,±èKÛ$,ànù~élˆÐ¤ 2µV œ‹#¤Qt—FÜG€Îm·ˆ@k’EÀ bD(&X@$’D~)% ŽI‚¬èdºÎ+¦"Yn”ŽDæ#£ÿ|ø¾ï‡s¦h=I¸°¤ë`îsM²d뜢iSi·îÌ÷“À  ÷ÑÄîå‹ãÎ÷ ”à4›ë£…ì—ÏN6 úlq¥+…Bü}VæÅyEç¸Ö“ £š¬ïÕ6-oѧöR7XI9ÿÔ«µÁ½4Æz’‚‰LHÖÈ*9þág´ºa„S“Ý÷SÓs^ †„ÄPp’_`kgËuMkÖŠ¹†ÉØ>ëâƒúóímrZ½À44èm>»í'o·q9LŽË(¤J’ÀÝ ï­ÍþäH1døxÞ^`dÉOggS@©&&èàåÿøÿ÷ÿíJL^Zÿ±ÿ»ÿËÿÄÿcEcgïl>«ˆ-Èþ×a8@Ö@æ¼Ô$Q8ªM±½üt>¯ÄòÑäça’uµÎ${¥O2ds1êDç×Q÷ËËQüÄ„G,“pN~8!üÕÐK(öE9Õ‚‚„AQÖï|õ°c³Á`³%†l ôê% Ÿ‹òè©Ö5d?ëwü®ƒ`|Âr€]”#¼Ä¶ˆñˆY/"FÛT Ž0¸ì€È`þGwd@ ­´zðÀŽ€ WÀ ª6›¥€€ :VhÞØ´97†lDï³Ê0 Éi+Hæÿü(~ØìwU & Ì:òúrw÷ÀdpÆžOŸutË[›)`wyË|œ8€óí­ß „à5«£+˜~B)¹kr3äÌÒ¿ð9ü+ÁCJ=Rr=__¼d-Àg€ì®Ø83v"‹4Ж]çg¿X,›iw¢)šá½SdϽ mi舷‚ŒŸÉÖW¢bŽç+C³ý&GÒ¨¡ÜÜKÂԇ廀¬ Î=#-N• x½#×üL§£=˜Ï6†µIW·ØkwßD&À"ïÊìL±5>>=~¿ê°7ßt–ж`/Oq}éiöÙ–(>ÀÖvÿ¼½o ziæSýú7ýÐ÷v/}Øå0‡’5ð_˜Šé„‰„Î~É«ÌÙ‰¤òN0?ßýêéj&µ†aÆ4½ïÝ)®,F”@l~,% ªC`ϯ‚‹M ä$”z›ž.¿ ©)DІbÙCvgÏ€ëT†IØ "ÁçS`IbþmÄ àüŽæìKÀi\ÃÅ€K`H^C€É`ÁœA¬ÈåÿÇ _pKA€Ñ(•½£h@ "²Ù6„jaÀ\ ЭѤ9H  åH’1´™R’Б–Ù”¡îyÞ·Ð8ó?«²÷ à ÖÍ-â}Ê­H—3H¸°„ûq ``Û÷=_“µ>Ý—v7ÇÊ$°ØÊûÖ•£ÙÄ3–®]àØÀƒÒlã ²7I‹A@é“í(€%B7wi/2ŸO?‘Bå°SÚÆá ž’U< GÇÕkCßQú°FïÙÖ…ün¯dªQò°Þìñ=Uãy1ÒÀÑZÙ5’Á‚r—LéD^Ëp&í³£³[›Q x?»êYRS鳕¬¶5‡*£ž‚Ïœœ¹€Ø/î5ópÚÓ¢ÿ8ûÒ¶“?šÕó'ÚƒÚDõäŸIÒžu}€‚N¢w´!_l®oZ¿fñÚìü»ÇXjª‹ÙÔ8L rÜ•L¦©÷|=öñR‡<^3±bõæñRwNÏ~äDÊ!³ônÀ9ÐçY¿P@¦OWˆîy³—ÜÖ‘¼ðo'†2rÈéß@¡ó(Ÿ†›DÕ±¨õ67Uñ“ÁóžçÊÆZ#ÜPÈ'eø Ú xàÆÐ8ÌOüÍ €¥(´BÍ-´Zn0«ËÀÙ¨™ï´1,öùÿ®W¢€¦r ,_ Ðb¦å"NXe€^ ‹ŒÖÍ«rž'U‡ø?”f8“A:¤ªü€oç¦Kݧ?ÎFŽÝÂöS鞉ɖæRIzC~}}9Ÿë=§›Ç[µ•³±œ˜î¨`ûÊËÎËYFBìCæñ+ d.tÔ_ù™?ggÿùœov®×kìŽãQñoÀG±™¦È]ý4X æðÂ/ÏlIl ;™YÙØß :Ÿ“ÉPâŸEUƒ ›³—LÃì¡ìÜV˜×lÿ1%êÖš.3ôV¸’»ãþýxdP‰€&›@Ú€ÀoÄ&`p¬<º ƒ¨ÝéKVRjá¼2€Ò@´*ùb<Ñ*BZá•Mà q ˆ•ŒoÑî Nœ:5©5C1­[›¢aÁšŠ3¼ŸyµbnN ÀѦG²¢—žj@ÑÍ„ø³'úá翱þù÷öLÝõ[‰ÁÎk.¥¢ð¤c¼>i&ÆD˜ óKf ·W Ó`›snž0ñ>7ýnø”>ŲMàŽ¢Î±ï.¯ƒbº ýg²OVt?@)Ñë›X+p¿>¢N(Ç–ÌVaÔH Ã}¿FiCl‚©AÃ[{êŹ‘¹Um±ÏçôÓº,[+e¨Mµ|»o9r×åòZ}ÿ÷ËWÌ'E¼þ¬J¯ßŠ¢åP’.U¹x!ö"êÆ;½ÆenwëÜ^±evhµâs­ÄI—ëç·Ÿ2…”«b¤Ëši}RÎVJ]‹ž²½H=5¥W.œóú|øùµÆñµDÄ÷ÂºŽæš0RëJRíB\ÿrÜ/Äßæú –S…A00 Ûý²’ Ó—ÈdF÷xí‡÷ßÿîvŒ°Ž9f££m‡È¡”ŒP™!€~RAÌ;¥0üUןYŒÕì wiãø%Š/Øùˆ8ån,“h¹äNïÏàÕª6ÂÙ¶ë]h¢¢‚“Û:B§¦*zk©]“y e fk–²­Š\X ªÆßÇ=–‘¡ ’µ#¬)2‹AÒã®aºçç‹p¿.¹½(–î¬ÅË÷Û$2SO­ƒ©¢(¤®eâßíh¼É!ë¸K¥éyîìEzµ[Wksø@¿ X†ùy÷¡Ø{ú[Ž’F¤ŒLêóß3ÍôÍPÕ@4$ÑÃ@¯íJ¤‚f óíb> ´y¼˜œ¼Ë›lö.ò*Å Éd5P P•ï{ Ì.!‰˜\z ®Àéo¬øZb„@1b®è™–:8GÐD3¼)@¿E!å½`<ˆIdÀówZºëDl 2$X•N¨ QPD-}Á%T™I ¸0(7w‰Ð‘o  i )á_¥ûÓˆ†'(¾Ü]ŠÁ‹’é oSõŒ†$Ó=LM¶²U3"-±;øÓEI¼rÉlõÃ:×|¾£­™»ÒÌ$qN³î¬0‹ujµÿ"¬k¥R÷ôT`Ç 1!æ¼NB6Ïóm`ûîa1ÿäô Z¶3þtu%ÞŠf{Qáš z{vPZ4/³évK“ …Ù1L²jÔVÓ;–* `|Ÿ\מ\Ì®$ä¢z zÊ$뫨~Fÿ÷ª;™ÕÌŽ}]‹:‚crŠçÕ7ÕÈä¼uèoï÷Ä¡¸a/yÛ¶%ì‚—W 9¿á\sÝnŠÀf{Þ{)¡=ÿœólšRí†®È #úå½OðPQ‘'áÌÈ|7×q30.¹Óù÷Ž/ÐÌÃv“øŸüÉü^sâ΢hšN¾´™™ÕÏ €ÌSqÔІz敇ê]2v.<ª¼Ÿ·“Ê3#W;˜ ´žEË Š4Ò’Ë€‰,âì[X8-%“}mw{i:FlH( q5û~)Ð¥ü‚Á€^ ÊÊ0šÑÛcPÞ dœ¨2¬dý`6n=Rð¾ë-¾Æ&F)Ò7»Õ&ÍA YœF´ŸÏZ‡•L׺2Ùκ' JôžÈoç\¿mûÜvÎð"³mE¦ª¡A²SüéI>î?«¥þ?ÏzŸ×.òëøu" ø¸â"Šä iòÊ»_à³/Æœ¶<ß1„@  {—6Wl?óQ<ÿpªF¶¤YLI'˜º ¸mÌùhŠhC­UãX æû¯H­(Ñ­êX˜JQÀF ‚pÉɵ¤µrNÍ«ê$-g ÍÇ–Iˆ%Û¢±Ì~©^žÉMR>§Ég8¿ ¨8}œõæã]@g×ç™&Øð»ñ¶]vHøÍ,LîÒLQ]ÇçûÛá~pŸ¸F͡Țn*:½«s6 ¿j_Îz*_Çb’$:¼û|2‡)š¦>?ÈÙøÛ||6ÛÞa8»ã ©8nªÎèÓöíÝB¿Sú”„C¼^&È>nÿeO¨ÜstòâÛÅ‚KPÙž9M/Lõ|gö²s˜ãg쀻ðl·ÆQY&I²ô*ñ¸&ÖÞ³8]#”À$»³mà˜ÄȼÅ€Ãu V¬(T€ pŒf(VU$ª@ >’H ´ý&@(^Á?Ác`à—N¯žûí©Ææ¤†X¬Ñiΰˆæ ‰á'Ÿ™o;Þ_ž½þÀgtãáÇÇͦƓ§ôï>èø¤H8Pƒm]ýš{]÷ÙÚ¬ë}ÖíÌ0mOm•uÅFñY™oæTºsâÆŸ^9ÛqE÷ (î(Ðàºx}ðH8ÛåF$à3Yä²<¿àÜ`sº Þ’ ØûÂÍBˆñª±ž¹Œ#Ý h]qwËTÔ-v–CNÒ©¹Ý9ã‹èn. PUÓeغÏMMY?înÝ?3'^BXZ £»jàö™Ûߣɥ#f’š©éÍš™Ú™…ß!Ð8‘¿H™‘¥éâIû4ó/àFE6d2’[ù«'Øâïþfùa—?§Nê¡©ƒ?ÒÞø_'ǹé:Õ¸_šó³_NGù¢6LMrŸÇçÅ†ÞØb˜ùb2ƒíÑŸ°í3y¡˜CV7D­«7ÿï¿ã†IkÕ9+4ñ—œ2jP¬ÅÙÿò{Kƒ©‘úÕl›Å`pRQ]7/€÷IcÒF H`;ßû%Џ ± ¿v‘°€$ç7 Æí¿€ `Þ›m®¦Xr­É§¹`"€DpÔÖt:Uø„<÷î/±WymƒýúÊÀz=ßi~õ̶Íí®Gç> OÞ)ZζÞwød%j•çOfH÷+×öóèi¡"€•8†4„sï ~§ñ·¸ ZztÙ-WàU¾¿of¶㬅þozhóaÊ[ÉÔB]A™‚zskøŒh ,NqÖ™vx¬4€ M¾ß—ìɼ=CÀõoŠ6 §ÕÌ‘œ<Õ ßG3xéCf½0bÞ²*ÃóÙe8þ’îŒf[9-‹‰˜õaÔ kºšCeuX û·‚£Ç¿³ê¸±±½[ÙÜÉ©OφùØSzc¢›1^¸Clϰ|¿À… 0“\†ŽG $ÖçÖ‡±²]Üj©ò3Ýù½O^?uVpÿÛ3̯›ûqz#rù¯Ã} wüLØ›gV æ¡cèñçph¨§¦7?ÏžÉSà?E÷LÓ=ÓM2]×~Šx¦æår”mñCåaê<ù‹ä㯫zåSïý3q5 „/ ¶n€’dé0؆ç8-G.€HžrWôøíT((`C!¤ÛþÊõ¬¤òÀ¬5éÍÀðøÐú2@óº ˆ»'Ã~5€uíÈks¬¾3ŸõÂy#c’}€ {¼)}Ο½'xöwÄïkfrýþõªgC”}P_ÈäTÞØ‰:lcU¬z®/3ÿNÍDïDé«»þ­tÐoÿ`2òŒßÞžœ_bæš&G^™ )ŸH™*Hm§SˆuÊéqóáìØ¿èEÆèT¢£B]®HÕØ„~¸n@_š¤˜S˜*' ö~þ¤Üåéoe.|ßvöÒ¹’þSÀÐûjCU®}$"gã×!Éa;_è„® ˆ€>~íÞniP€Å-Õ¯oÑbŠŸ†ß”Ÿ=+YüÙ}r¨†M°7öw*ç¨î]þyzNb,ŸMÏþšÄÂöñMH “Ûßö$ôOôúÿ?Õ›¦éÞÏοqJ¯éjzrWCÿ$T±É“ðv¹Èå•ý~¹ ìÐp~ø!,€ª8é¢w €ë¶~åÉvƒˆAÄ÷ëv<(LÞ`©™€¿ÿí6°€AÀ‘! Ø@~ 7–.”åùõ fCÝ«•Ñò§.® ¾«¬D—`j(ž:5Ì¥X˜O­šÆèp`x&<«Œ®_}ôc5|8­W_ —íTÖ}í\ýv%ñ×|²`NÈCû¿ìýâéI2ðÏo {ÝÞ„/ãò™ UoÖ"—ãþvüè·Ÿ=RZB.kÀ-¼èÊœ|q²·ö„¤JvnÁåæžûÛ¥ÆÙÁ3tÝÛ£ª¹@Ù·1Ù ‡ºÀ»‘ðmæzs´¡_zO ¸Tþ/½.ÐfäEÏ^ê¯ëóCíÓ57ÓM<}ŸL·ôΩ«<ú7þŸ¸õa¥ïòðóÁ;/¢¸~ÌÍùÙìN¸æ'ŸLö]E×ù½ x¦Éð|oܽ]Þ=5-1Ïé Ÿ®þq@7PL}9=ð@Ô7ªIŠÐz¼ÉtÂx}š'Ð>ô=8¾{Ù"S¤0Qò»¿Û€=Þš_ìì­—&AEÅÌK©—ê!xŽïÙöçMóe€ígbzñ¶%0 [Ùò‘i’ÂЀòfEe7s1È€Àzh£Ä¼@þøìDz ¸“ä’Ä€ü`úè×  ¢?¬)¯Ùœ@  Þ:ÌÅåD‘ªh­ V"‡‰¨ I<=£ˆ Äáo//üÈ7{È×Ù\H '™Ûºçùôs=À_²&ás/j2‘Û{Q×tc?èV¼Þ½vï1É P²+¬®TŸ8 Œ³¼w·nº«&,9Öàö}aX!˲­lû]¿S÷xÏËV³ý[+&¨Ò›µ7zj —Ì¡¬Hçù/î ûù€}ùÈÜÇz-.U8A@³!rrv¤7‘ÉÒî…ëB©y×LŽ~èîIñ\f@©1·íöä¡þqêœÓ‹G¯P.ùhÓžú§Ì0;ÿ½œù~ADÎ7ö‰|=y9 ŽSæ¤d~]¦ÿ¦‰úû¥ÉM5gŸæ<€§_ÉÙMåá•€˜ È \¾Äñœ‚-éÞZºËoý¦§®¦*7Ó0Ô|÷ß®ÞÛÝ:_“Óý‡Õ0Õ¢§šfàçÚxp’yöÍ¿œ‘¢ð+ï0òã‹JÏÔ#æóÎß’â\7N‰æ"€™0›Í ÕÃË$[foðÆ`à¼ñDiY€m,-B_€×;ÌÍ$pa €¨ `sYËÏ à”Pø¡ƒ ¾2$&€ÓÀS~9ż‹‹ RÓ&¢ìA‘Ìðø ð*JÚL¥|ŒJÈëGO€2_“v¯% @¼¢×+&@àר~S{Ù%ä¸r¯­fGZ±òí;Jȉ/mªÚë™-Œå— >T^Øs–'ébÿ0i¿XGÐ÷„p’îÃ…"SZï£~· Môa› ©…Z<<Ýù¶vESø!èÂÞÆ\Ë_Š‚^Iý¶šþ;ÒCãÛˤC9±¼ý¥µjì±'-ôе¯táŸÌâªÿÐr}ÐHî WÏ)=þÚK»a–’7‹î?ú“ÎJ:î?fœðùã¾Nç§„ï.ØUØ|a°áþ'Œ/˜¥î§¹œä! ¿Õ”ekàïßÙ÷â3› `»¹7/ÔÙ P#jE*8§>\lönàÎ ???/Àáø2 57-õó«lš 0gç5øä²g懸ùìÍötZ>ü4«Ï/¸’3û¬:óˆ'ÀçÁ·l(@t«Ÿi§pX`ƒF'gü¸¤mR0 áE7®0^=ˆö+H¾D^ ]ŽI0AÈ›Xˆ0ïðóÒJ€«ðΓ ?É#R%*¨–üv ù˜‘‰©d’™§5Åä‚6Íôøpç¶ÀWû–å#]÷ákI„ùŒèbvlæí‡ô|£'Æ&ºà%îЃ.‡ßr&çTMõió@0±ÿóïç“wØ¥Ÿ=q¼T?žÐs^ét¹¾ Ü•nh*iËM8žª)Ýx!GžûFë¼Ðôj› Ö§Nu.áO©lÙ\zZySÌÁqóÛ) ep<‚nfR[Ì®°oÜ!uù(ÙÕÇá忇áw æòøtä m&îvÀ;©¤ˆ¥Sþº<„.Ù$Z>– hšß·zhzøÇç5lû—ú;QQÿ4 \LdÞ0î:‡z}^޵Éhb:¡gWp·z‡4ŽRœ)÷å¡ïîòÙç$»ŠÏ¡«ÙDû¯ÿz©¹è9xßýk#Þ98BÛ§«§ÇôÿæÝ=9ô¯ËǿΨ¦òÐSðƒûvô7ö´Ê%@š”'Æ`E‰a±ri6™f± F¥˜.LÊx ø-`Øæ‹áBu e/˜‘ûø*„|þþ׉ ‰€|FEcûÓ© v£˜p¨;þîZ\>0›s^ NSQ9Ý3² 8þ‹Þ‹ãô/NOºs¨èÌïÏfjs`Xu bòÅ8´e>ØL* £ÝÐ&œs”)ã($n¸âý¡¦uxqKXçFÀÞ'&'…®×ç\Å‹çzÓÏ—Ãõ#‰n6?9“/™q”|þ׸öïûé—ˆzþ„áÑ\ \*K³¡Lб=uªkìxlL8Ì?wžïÛ\ðtíË…FÄFþ•¹TÖë¾?NU£w²º«¹Ïžï]½EN5Q½‡š\ÈÐ÷ƤF…nÔд"SÓ˜P¦7† ÜÔé^~çñ>œa뜠6ÇëŠ"ÅÕ2Y¬Øu¿þÓソu6óþÎkéÏÜÿgºù丟Oª… H}œBf#H±hMî…6¶{X† ÎuÖ™Ê1¿¤)nÈHÓÚÛkÅíãΦ}˜}zçn·Î‰ýq^MÁ²ìWÓÕJă` Ò Â4à;PŒFcÜI{\é“v†1ìüÂ퇹NÖ_yGUEÕ¸[ƒÈÚgß¡—J]Ÿ.4È÷ŽW!Ï&V»CÚŸõðúy©×år'Ã^Þ`402‘©'Øf“÷ïK~-‘ŒÛ‡3‘6‡cå:æ¬R9†ÒL_¯«c{Î[hr‡iŸŸgª£´E!ÅŠpEPU,eh,DGtŒ,–‹¦­Pq¡L8[¤éâ¡b&‡d9±Í´²[‹ ·e¤5ˆ‰s+wûöâ÷6˜Ù-ÁÔVrM×$$TµoŠÍòõôRø þºì¨½qÏ¡=±FY! Ð.rü#']6IÐ\P¹ÒyËr •E5Ï2™åN’æBïêlD#Pék›Árè¡x(w5©Ò<9ÖˆtB‘”/óŒÄ©Öɨsd2'ïf<È 5“<63xK\g­“°w(¼Ó®a ÏñÑÀú ×Uó¶éPW\=„ˆ`B)è¶éî=z_S÷£ÜØÔöe~R¬Q²_~²m‰P´"&•laˆ‡v‡”Ôòý„A—¿ ,†ê×n™xÀà %N[e$7Â_ᄈ ~ë-ÒƒINç)‚v×kD?%Cû Ю’wïó[þýo) póëL/À·1}ë-Œ¢\ª\Á‰ r8––kŒûÿ*®úXÿa8*'Î1ÛJÉ@–Z"uÛ¢S“'ÓÎÐÈ®Ñ[Jº¾hÙF>ƒ«"”¥ÚÈ ½œþËýMš SÀ0Zb`Vƒb©ŠcTÖ‹}*hûÚ$‚%($@iE=ˆ¥V*`¿Íeû `ƒ8EÂ%UºÔJC¿ÀLÚC|5,®C¶}:ÿû¢M@Ë4™••MQ \d?tïe6LñöªX{±³ì¹§§s_üôƒSQ#'w‚ðƆìýÀ´pÛ ¢zòzïÄÞÑBƒsuÝi’j2VJ•=Óô<Þç?Ik–i'„ E"xâdz``zÔŽñ˜™©ý©˜¢2,’ô*"§ËÄÏUn‘åÄhôÿ´Ž–% €®œæ‹%æ`¨‡£Ah€2Àù` °@oB¥Œ@·¸,Œ‘—ò¥+‚A¤>ÜJÃÈè$ñõrk*$Ë ™ö‡ãùŒ˜fò†=à€š ŸŽW#¨}ضÜû3 öíÚ€Õщ¢)[Š™P6%á`Ò4ÏŸ zøäÈ̘+¶2ãÒ™fe ­us& F„V}šÓàÉ­Jð´ÒE9Î2QºšÍB»C ø´ÅR`è´1´P( <“âêÌg°‰Ñe9´ÄÉÑS®ypýù”s;ªÅ`Ñ'dp®'òÔ’ C¦­ŒOT‚„mŒ¥Ð­³€tUWôÓí%ÕB€'×w4ˆ¢ÞùDbO9Äê}Û.CÜê[ñ³½ßâYp3ëðJUs†€”‘ïú[Ž”Í íÉoßg ,"Ëšk)PÙ'>v:ØdYöíoªÛCHóD÷ì´õ (H2YÞ”Oó´ñùóßïL:L8LsA³:Õú½¯¢È‰Z1PÙëHö4÷+ ÐAsrd…Œò§ß^H®Ø0Ç2}·R©)Ó31€(d'¤8CÀ(9 ÀÉÚ,¢"ùøÙ ê*@dœ€€ÎßHàHFÀ%¸ k±Às’;+UpSÞÛ­µÇj¢H‘‰õw[cAPÞ`^phŒëo€w6c¯÷O¾S9 à©H毗¦Ƹ Œ ·õMŸgû ŸàðÓ! ’€ Ð7%ÛeÚ©öÙŠï]9¶•]ñø—'ÅZÌøPÀ9h'[Z¦²ï¶ääìÆ÷§^(¯‘/¥yn;Ž™ÞSò6‡¢*ÏôKð_4¯(iœ7“ËÒ_¼'ƒ…ðóä ž‚‘T xUBò/w¼ÊXJ÷áaÜz@·q(àr L¼ ‹ïRôì´î @‚ÑbåœEZ»’cŸ' )⤂ ²ì¦‹Ã•žn=—g=z_gÍ9¥j:ˆ&$þ©{´/´·Ù$sä†iX€´LÏšŽ+?Ô„Hx‘5<|Nx×J48™<Ü—9LM×sݿꀩÈFD[Öº M½o®‡Œuge8$89qO;†‰×Ž‘Ø£¤ƒž¾j\÷°|Öþë…}ÔWS+†£o3žÍs˜úv„D΂ È–XŸìÒ‚XXÚ` ‘ƒä ©'BZb #Á‹€1….iƒØݶ±â—Cü"†ƒI¨@tJo 2š9 ~ë-¦Ep1@2ÌnkÀú¨Nvæ›WÀ7€~€'·)û´t0 ØÇÙ³#ßnàjZ€­yr²¨ng tKEÐëNÁ9nZgŘúò¡p—ä4­îCŸ’}Æ]fKRrîz¦2ÝXµ±À“wì {̓Ͻ;© øÐRȹ.1qޏ -ê¶Qó¼d2” àT@½å¿Ì•pÌäènì9T'7nMž<|Ǫ5]¿¬fœR´S€ (F ëÎF •Á²ãhuÝ®À ¬ ã@5V2º¡ŽîRG1ª"ëcOuƒªÊ*ˆišË[äqQÿÐqO„%è©qoûDŽŸ_½M·Z5"Ã&‹fÀuO¿µ ¶~˜æÈ®{SeØÏljÛAö— RlÚg)^Jækׂ8¨;ñ‡‡ˆ&cGSÑLê+CäDþ ¬@g‰Þ¨[Ëހ͎):¦±^šNb¯=g©nT¤½ÎS΃Nn«©ˆ˜ Uƒ—ࡼ†ÊGØM”1`‰'@‡Ñ.jU„5kTP ÄT*z@„Ú ˜cÁFPUPaeK ⊠À^ûiœÁ  W[SM2¢LR3=ãèæÃ¢U}sºÿà9²¯Ùùß.ÅÑç‚Sqa çÌ<>ʹÞÀ5}ÀlîL‚“öq@`[¸ºÏÒÔ‡XÑÌ(ç¤9¼|û Tø¾‘Ƶ0ÜçÇd?ªÆhÕ—ªO‡|¸] ¨ïB©„2–=¥+¾svýc’ÎÙzQh Þ¾î`$¾xðA0ÈÁ{4›à2%H¸òð€5ŠVtXz0_v¤wE$á@ƒÕy"I[Ã)Y†s±h4I”îâl~Ãr€ç[€ãUu °Å\U-]¿Z¾ iCY?) +¥|~ŒýlÉÈÊîG>S@Š7ü8víÿПì6'juûü­7äË”ºfÏ`²>.Ò:JR†¿sˆƒOú€†p¬]`pfd]»fA5 ´¸ú‚’š `ïÖÕ†ýþ[7š…¶å­x2•½ÃïàR€1†³cœ)Áæý¸Еˆ+ulZŽý»î¹ž£ p—„„¶nAÉŠ†YÝÏ$t<){"•ïu9‘Ó¥qt1=.„K÷\Áyƒ3,hl)@ð0Q{[ìOÀû°&uIñ÷ñfšÉ¡Õ€ô3O±.%§H4G¼‚DB¾e™g@ ­»t}}üݧ'·VÎx· N_cù¨u  £UTÕ˜v7Èê,:Ív½¡«öç+>ÓHž²v¤NÉšÓtNEÒ›ùéÏ©Qéàoº63=Ëçæüi¨ Ä"²JÃ}Á¬îóLÔVhÁôw3ðáämÎЕ€¬ž ÞIkïØD›( ·ŠþÐ{E@C&•JÒCÐ.ùº Ä)ì³Ón¶Ð¯s•s«i˜Qyîå­3ª»vL-@3”©î¼ †¾\ALÁƒ€­ƒa]÷08ºˆ´ºHŒÂÖX¿=`Dу€ qȈ@26¦uÉb1|²¾Û| â^³Q¶rÀð‘ÊÓ#Éïžø¢=Œ©=D¼¼[±ÓËò÷WcCìÕE…înösyé›?ÚsßçðÉ9/`Ž. ºÕH69¿Âàg£½çÝQªÆtZþ›˜]3H'HýêlÔ¹x ”¼îìܯ1B|ýß7”^E)ÿÉMˆðZ¸¾[Lv%¬E®ÿ ½Ðf_kàË.õ qÍ5.^%[S4)@¿¶(ùnd½ÑJ$“”Aû¢À–Ì]mz榧۞rÛæ|ÞøQϱøù!\Æ|:CÞŠø\ (jAEÌ[Ðs³ºõÀ$COggSÀ& wŸ¬¸ÌÿÒÿÀÿÈKHEF_^acÿîÿÐÿ¿ÿ´ÿI(.'èn ¸w}ßEžxÝ™–ÞŠŒu@6 ³K¹^ˆ IúZzæ™v­‹y›¾©Duê“´ƒ3Ï?*×Ãë¤åÐ5ƒÂ%"Èy-K ‡¦ü:9€iü|Ž"hf÷œ%I˜â€Üˆ_~|ïš-{KÙ€´M @' œ£Îpl‹›n²r¶Ã2€„“H³^H€Ü°T ¸(@ï zLE€50®Ð8 ^dfk®0L^Û]‰š™F f·E·ù!Ó({àp˜ 6½æM ý+À—‹Ìòí†ä#Oæ9Àšë!3’dId7G' 0™½<÷È VwŒ£6ùaÞ$î¡À6å7ñ-2B–ã’Û@Ñ"A=Žë[ÙãÛèЈ=*  uòmËŽÍÆUžðN—v”«N¯eÒ…¿õÀºï/Ï4ç¢íþï¾°po´È~ìIƒl9®±Pœõ 9÷Ÿ@¬ѱzû¦Q]¼û~Ù#M–…¢¯€C¸ÛÙ¬ê‡eÅne}Sì  ©j:qñôÈ~ü±Cí=¿&øîŽTw°YçYêyzõî*^Þ^¶p€:Ê^šã’ žðÙîxïs” „Ô¡ëf´Ù[i…Œœ¾:_foFESO>”ô»ï.r & ¥„3Þ:M!¥™³Æ‡®FÂÉ;K¶«\²²÷‰B-_d-µ&A$À&i”õ%™¢qˆ3[;Oj(D´¿l‹]øM"dn´8—õ°éM¤×\Âë4)ßEHv äн®íDâÔLÞÓiÈÂy¯(iö¦¡e¾ýb@ Gš™àæIº&»ì%€é& ÉtŽõ\¶ÿãå2£X‚™ºPå~vñš<ÎtÐÏÆq ¨¯Ø@ë¼~d¶†äXì/¹S¥€Go†Ap×`‹•CVu7؆â'Æ]9SŽ¿—/RØî ¤À0a.ÀÀg[ À`"(@lc‚‰ @·œ £I“€Ùª›çÖ–NFþÀeÚRQûxAÚ¢£x84@èÉžAo£éðžç½æåÕßwW2áx>MÛ@/Ó¾­—¯çbÌ<3/,˜©¢KßÔΜ—›íï#ì!7mÃû¹»/wUÕ¡O.Ý’ñdÉᢴrÏd {?Uüi” mÉá´„IG* «JiK©†Kpi¤Mn¸öµ×ÞÄô ŽÞxÇ ¦W¼4Ó±z›MÚñ­î••¹õPª%B'êBì [ÕÅ·WuÝê÷.I(è÷ÏÆ+<ìO€ôð(›ˆM`˜‘Hœ¥­ bZJÎ×ã×ð7ªØ×º}‹Æ)ça&vßÙEuÌ×” æÆA;9´óoLAgý³ U¾fã{öN 3ÿÈìºXH;àJAÓÄ…P4Z6; Èß-2Àì-‘MS¬ÿoÝÙW«D°ŒnZÑè=º_9L»5íï¿õ‘  Óã':Æ‚.GÉiÓŸÿ•*@ùû”‘¬ *Pì–µ+X\XSºaè¬ ˆà²bƒ‘u…,`ÊÐ+zBÔ²7€cE8Q(L, DÀ ìlQ@û *bÔvYNŠ—YÍnѲv.l‹à4‰J¢= |°÷éE†¸CÅRMˆ&NÿžË9³™x²£áÞôtVññ¹Q`ñŒˆ+¤bÅ nX…RuÉ =¤JñˆJ‡ €§ON)“§{ƒøßŰ)]JL‰Ú÷«L'÷„{vµš¯´æpÒß33ñ÷ðaÿ™qr øpµ»¬ ±Ä_§MÛõ–ßWõ}+ÃØ'ö1è¹:¯M¤²FÞ6o—aªãL„²ÂUâÐÚ¦…½Ö‡‘®žrMÒ!H)5E jªn ùMN®KœœfººÁj\™mËî™hàÃîfC ;'€öè-óñÙOŸUL“·žØRS ÚÃ3¬}?õœ}mâÿ½gêúd uægWCÂ{õ;«þëû·ó_r²æLQlɼṳÌ$—“»l€KìÍå5õ·®ïž¦šÎ© =Y6ù3ñülâ zz’¡O4+îJ.Oç9Ý‘C”1 3OŸ­z|Aœ÷hÍÒ`É[Þí'½p8Gì³;+k¿*: €ŽZ ×Ë*/lÊ…‰î À†O0$`£û«ÈT@Qþü¤…JA¤ 1À3?`Š&<üöU}0HØàsÍ7lÅÎO$™©ã¿oƒä]X Øêx|£,#¾sÝ–ŒÊ\“€Ew ^˭΃ú‹&©ˆ»Zl÷Ðz?€½9k?| Æ@ÄM2ÀyÁ9û>/´È|k5•Áf>H® —ÑÃD$í3­äM]$óá–˜àW¾°+ûRŸ%•´ó]›K=Ù…¯_ËJyBN{-œwœ©%¬fEY61X±S×gjû†¹ÁÊ+óeIW¦@4P—À‘d}QeÈBKôŒ5$þ*ß»•)¡Zy¿,Ó7%²ž­:xÄvì÷LÔoO|í׎ãã_‹¡Îs[2žl/cs܉‰Xü¾ÓÍr¾º~³}=NÖÏ3õI¦-îi¾+4=Eì¸Äîûô+=­ìµ+.òwÜ÷îÝsê~<¦,éîT“ï|7Ÿ¯ŸÎ×ŽŽ¬é-†×Ç×-Î?ÞÀ$3w}>b÷ÉA A°µOò“?®M hîåE…0"@¾+q#8 †f¡Â)‚WJ¨+Êù†JYH¬ºA @ë†m€AcZèÑ«—öcJ¡ ÉÙ²#î ·H$ ‰–/‹‘Ë øKe,ô`­^»«O†`¼Xl5à€ö°žæÞ+Œg¾†õ  àü)ø’Ó€S²=ïˆÈ­Ã›QZWƒ" ¯ ß™h]Ã6VSrÃ.œÄ· “9ŒÎ!ò⟽ 2YðÀ®;ö½€9ƒ†FOË¨š¢™†Á›ë!;Ù»àAã´¡ÑZ/ù·ßFäŸ{lÙÆûÕýOÚ$O‡U3ÅM.ºÉ|zº„Lxþ*Môb€Ìr_Îf"3ãòxGÈèŽéèçñ¼´Ï>H-áÑp9ìË^ÖB¶tÉO‹Â³“°;»û _q@^Ÿ–E¡ó¤PÁMv „×(É€²÷i䞎C:¬•'‹=Ì®?ó3g«º2¡Èô¾]lBÆ4'›³kþøœª}1¢ýš8åyæ%¶òÌRª`zòõûl&Éÿ×IÓÃÐ Yó°’õ?<•ä€ È`woã·ËNðu’O>£iÓyþLÀœâ2_3“±ô¦Ž«çœüWŒuÜ(Àÿ {*€Ïø»Áz¦Õ‹ãÌ…ªìþº#ËøÐϿи^6Òî2d&0ÒDâ %“qþª-ºDÈD2PË‹M®!`ïG9{óôOÙ^áËÿN¯Y7$Àütœjöë,`lIxßÑzQÕÓ”V¸ dŒ Ÿ…ø÷\|ÐŸ ¿aªÚ›§ôX@ Rçe3Òèâ]çۺϪ•íyŸ=a éA±&{C儎ZñÖFl¯ ÐgÕ¬f°£Eaÿ¸mŠË8îÔšÏoÁmã œ‡ §‡÷ö¬Õ¹q(W½w&ú^ «)›t‘až¥éu1/;P×EÉðú‘KÇ™mþý»É¹[0üïf–¯7R.½¬ÝçA÷TfÂ\.±3›î…AÞüáÄd´Iv}Gÿ›R:ÿuÓÍ;}’JÞq΀&‡‚žíí˜Ly á5Ú4‘ìø ùð¤ÓÊ—…¢ˆL.w9»€/-:8Ù¶ Ÿ!`ì¯O7Ðü/ÇxB¨åß9ËÄ×¹èè°Ó#?g|,ç;Œ‚ÁQ@MœãlKbóä1®&æywõ( Ÿ§U¸|’e-»02ò—©ç×Õä<çýÄû…9|ùIàœªè×ôþ]37¤š?L OggS7& ܬúä¿ÿ¨ÿ°ÿ¯ÿ™JPLHceÿÜSklÿ¾bad^Zhœ¯Ý»,€Bzñ‹í ÷Áà¿8g’ê—å&¡IP|èD…,qk¶ ¹CN»ç(FSg:ÛËÄÀ¬¶Æ)pÁøœÈÍa&þ°~bþ¬€òõÙ‚ìùr0ÝÀõŒå¥$~ßæ8‰M3‹X fL¸û„ªÓMdä„`ÞÍñh¤›ì…5ܾÀ_4ØùìO(þo" £"á¦Ó¾æÔþb‘Ø•“¶@wyŠ_.2dò|ýS«œg,ñ¢IÅÛˆNú/UL/1zô”¿Â<¬"ð°RFÖhÂ4öáJKCF[Ø»ö%w €&ÓeAp¬Mu³ž8T”̮ޜøv¶IÌoöNÁ¨ä±Ýí\Ã~¡ ®á£êxÅ)àÆ ïG8§Óäk.1ÓDj~¡·Ua$á Cýoø'b„ùü'.Á U¯¶Àq]ÑÔÃM’gç1&"‰þUÎs‡„w ºù¤aCi £÷ÓC1­)˜ê]Ñ òÖ&žœ:)¸éÁù8‚ ½,Å{Çûhïè­©Ä™U5÷r ÝQÙfD`¬XÊ'€ ÀɤG+€ÀÄèS²x^ÛKo‘#(&BÌj[šƒ€@9¤¦?ÿ<ôÏÃzHG;AõÉ\€àø5±˜=mL‚sÖ}û6ÏqMC¨' \Iל "z ½l*Úï 7„|…×Ùþõv÷>æEhÍñoe C mÎù]%„裀RB÷ÉÑ øÓxs~¥-.4Z<‘Ckç…íÐSöD €Á ›gptî\¥gö*âjOŠUN“™E>ÝÐÛ¬ûRÝÊêcjñÔÝ bòÎCæÂ™Ä»oeøh´CÍóYäßþa€Še\» $þáœ[Ý.Üç=z«I~½Ÿ´Mî|€å¤3 ƒªTù¹ÜBÑ1ŸŸ¯Ÿ.(œ~¢!è¨èð9’ Bx}§Lb#‚xyø@ëÙP4Äžt~ÜE11ñ˜J€jê+ò éèùt&ïwïsï¸ã¸£o†ß«Ôºþ­ I8BM]4PˆrV€  CkÅÙÄTj 4ˆðÀ0¸/0èÛëÔ`/høfµ=-ÁŒ €ÌàÀ~ö= Dÿà@‚«Øvß}ÎuŒD5“$ˆLèO 0A:x8œ `¿ë¨WÀº¿ ÉÆ¨Y Û¹úÚÜÓmÎU£qœ4–_3½õ¯Ûï[ŽÅ¨EÁ-5ªo¢dÐQëŽ5˜MYúìk“Ú¸N9ˆ=äöE€”OtÐЊ|ÐE]Ô€H]Ëllß.8,£ôìw…¶ØÙœÎ^g@hCçÄì3F!^Qæcær¥eûØ ö<ö;¦ò|H˜¬è7Äü}¿ˆËLHï|®ýšUÉ žix†^r‰º¡£ÏÈ! ˜>^Æ+äòµíŸìéN€€(âmè 2ÏéH2àÈñç¯<»vRôƒWOÅå‡GÎ|ÙÔWß*2cK€&uIÁÔìÖôg€×Lî@=$SéÆyÔ“êþz(`"ƒ…Ë}:EÏ $R™7 äP€ È`kþà(ì€ 0è¤-@cúà qoð6Ê5iɆ‹hjZîÎ,¦K2>D Éðx?zȹñ¾1? ¾€Yó}\z@niøáç²a"--È$ˆ”2/½8¸$ AúX™¾Û08bñÞ7 Ú—šð’óäo¼N©Y(Awd»»ÑGö»ÌO@©ÂÁuˆ %:eíçk§l[nàÏ®uBÖúnµ®=¤@ÏÊßõPmmUeìm²È%‰Œbš\ˆ˜þxÿéÌD ÀüòÝžgò’vçŽ+àåçNÒ¼2š»A“äÚˆ÷ÊòŽéÌiåR.¨¤úðùE_ 0^ß¹;öï èîdæ°„ÆÃüAî^2·ÛÞüéÚÍóÓÔR¢ò PO¯Ã€›YªŸ÷=ä¡ wî£&ù@¢?ª8c #ÿŽÏ!Ò˺ÄäÑ›k¦Ø}îv×µ£€ã'i¸½$œ P³v49îâ’aà|}œ±8WEå˜ÔûÃÔ`±…àROD À€w™Å àù¦PЀVJ…l¬^`ÜŠÕt)…€‹Ýê'vð¥.´Ð~‡Ò¡ôØ÷ MÄÓø³Õ•°Ã*"–8ßÚÚj{w}â§6"Íþ—¸“£saÞƒH8!E.¤ná £.e²Í|±XÕMŸ…Hɷн«b€§BÂk—ÿöÄ‚“žÕÌ­J§œ¹ç8oq¾s!³ßlHíÿœûƒ¤q§ó'/L©Hl;H „‚ÅÔ­,¥•_èiÆ-•ªðy ”®0O>ÀÞšžðÔ+™[²"îðÖùÓq9¿Ü³}>7îoÝ}Éßt‹ü¢Ý œ~ÑÄ&کݫ݀3þ1ç÷ˆ¥(€oÌìºm!Éô¨š2;eŠêj­DíéO=•ýƒ÷˜Ü!“ÊÞ`Ô1ð®&(ÌfÍT’ Óef¯|a7/)iRìíà´VnÔ?ö=4vºµz&ãÏ Ëý%ߣ¸îÇ·ù¼”?¨£ÿé‹3»DÖò(Ï‹L¶½ÃuvüóœèjfÄrjù#âaÃV¿nmÜfÕ £þðµÊºaèÆ~‘ªÃÐô?Kõž»3B  +àký{ŠÎ½r a‘úûÔ‰jûTêºHíö$G]nÝ—Ë2Jâ£1凟]¿£zNež_? ³\-— ï“Vòâÿþ’Ê5r)ìf²Lm#ZJ­LÁ&Ò,épt”ÌF“£çÙ»³¿\mГoùLšºñðãŸg·ÖL«Ÿq."‘Òqèö@@@xÎ(„¥®’“¦ áNºÝ/¾íÑÞ·‡¼µ‚7GãÖ¥‰Ïò?Ç|xù­wfÏ[^Èkç²”Ð~Çýô¬Ç<­§;tdP@@ZÊFÃŽR÷«ñÓùÏÔA__2Ó¯ÇZÿ²¯M¼¼êéš¿{‹ûï =T•øÙÞÊ0iÏ´æZOë1Ѿ²‚}Îöwà™§Å—›£šÉÈŠˆ”Pˆg^kž£CQÔ³äÒ¯Cshé|ÊÈ+ÓÚÚæõ\?™/Ê+ù8žèc2Ù˜é„ü’—Ù< ÀŒ°ýxKHF ÙÔéyfŸ‚g ‰oe¶øº¥¾åΟ瞇®¢Éwæ ‹úi :&F4Á¾o¿rg—}ˆdì×Cqؾ“l‚Ü&€˜\]þãÃ|kgººŸî­!Þú¸÷–½˜N9G|ŠHØÇOû$ ö‘yF䀥ÓÂó/ÀÀû`h8P“×%@ãn÷|}Ã8¸ÚƒÚ–"r7Ó¬ÀæëF N|œVéÞ쩾þÞcÂY)²n·™ó¨´ã$<=80Rp³ú¸ùêëÔ´ƒy—A¦êxøBÿš™fxs´È?äÕèG&¾6Ó_€Ò$p9¼vùdç(×=çZç6kö hÑeZB¸÷7žÕï^¬Ôz8;’÷„šìƋߡE¡ìµj+ÚmƱâ¹ÞÕY6ù}ºŸÓZ¼^Üwýük§‰™Ÿ o§ëU>|óçÿú0o.³ ö?T Œb©æQ²qõ)×Jð9jW©…AÅühÉP‹•}ù—óÛ."°¼pª¶¬óæ5×›_Ù¬\¤qãkʳµÚ”­çœûôÖÅßÎí5ž?÷C×½Ôµ|ùwÕüYMøtÿ³Xýü¡ gþ>Zòš¾gL‚e“URËSW­NLa(¼´=¤–fL?€¬)"‚5š¾_Ä•o7pqäk>êÝþÓ¦tgà|;ô <VÂÁLÓÿœ}aÃù€ %RÊu˜§[׿íïÿ?œû¿ãƒrOçšiÎ’Ó,¹9Ÿ“ƒæóEUµ¬TM-ñÛ¬ùgؾr¥ÑäÌíb´í ä‚z)9F÷wœƒÈd…ÜÝ2Ú³÷y‡”™âË—ÍØÔUhâádíù} g´#œ™#n¯ã‹¦~îÁYþèþuï졜É7ÎÍ@z»º¢¦Al>“ãY52L$¦Œm¯ÀgÁÙV¯´^§Ö`3äGhòÄcÞcà}%©žvON÷¦Å«ïl¹òòbF:FÇvËÉ1ƒ™« 0ätÞ?Õ4Px:ùšÙ0ÔÒÐåõÍùÜYÙ|¾>ŠÌ¸@÷0±ˆœÞnzšªsóŒß|Owi`z>Nç—ËEtZZ$ŸN˜cßæusÍf'šû=/è›ç¿ÿ¯~ŸýH2xÖ,ê}ñøçÙºôðÓ·f0@=>æŒ( 4XÌnÙa?VÅoœžpV¯8Ûv~Y‚oݺõcþœ¨d¼²HšG€€Üßç‰í¸x/}ÒžÂÚrR)«Åy)úG¯}Ù÷»Ðß5Ž'6Çïù­G å%S5­CYñ'‘ý»¿m‘‡ÿ¼fy¶Ûºñ ZωXªJöHm†ü½ø!À`-j\Æå‰$6×^¥èÙÈßÔ‹Z—ùÈçdsjþ㽬ùݺ»)’ËGåÁ®¬ë¯ŸY`<Î`¿ÁýýïˆüÙØòÔN•1ÄbkŸÊ)E™npÆóí£‹ËŸÐZ9• ­7Ì¿ëéÌÂ`”ýÐÓòÖåSŸÓêÆ?xýúw_T/—íKõe’KÊú°{ÚñÚKØ'º×˜ „*ó›@úŠ~˜%j'ÌZ‰±º-à·8ÅN1¶j¨pƒþ>¹±ïØÅ@콯¦mµ—Kåø½ M]—V'ÓË:}³_B­¨ûe{½£F­,³Õ£í# î’_Ât/,+§‰®Ë+| Ä*ÜF5fÀ)'Wf¥"±Cr( Ýãæ™»Öb«"JàßÎ÷±¾RGˆª»\ЪŠ*£%êR*º¥Ç;…u±‰Ñ+J/ÉëQÊêÑ¥möDU= ÐJ\¸óº>¼>=̆0*!Âç³4yFeÇ$He:û£·¯ôÛ¡ksI@OÇõ&½tt ëÓžcÚ‚µëër¶‹?¢†ñéôüM[íÍÇœu<ëYG—Ççóìôôϧ£rŸ»ø´^ Ä—E„—Ÿÿº:ÚOggS@U& ' ¨ÿÃÿ°ÿãÿõÿûÿÿ ÿÿÿÿ ÿúi 8™;:tRÄÿ¨5ä=PXÿ€/Ö1¦ßÛYXE®TuU­!I Ÿ)PB)È+Ä+èPÿ~Kj~}XÛRe¾/ý¶;t§õq—ízî3:ÒW]óÖWrsÜÿë.ºXrØ“Ý.ú´í-¹a-ñ½r|ÑDïÕ‡‘˜˜´7¿1ó‹ è8v+)i?kAåäôR*ýî (ÒÝS³„=ºNd°Áàp«7'~ŽïKòržI„¬ï´–Nú7{o)’x"ôx‘àƒÏU h9k‡q£ÆOƬ•À…O› wˆ~â‡ÕÊž>S•íTœ…˜Î•â~Õô4ÎZô¤Ö3ý(Ž´N›ÖªÍ=¼ÙßžéÄt°o¼¶¥[49SQÅLCˆDE›‰@GDúe·]d”±à–&©k#WZŽ{¤—ç/SC¢ôPYˆ :ž,OKÁå¬ìúÐ÷ N¢Œý=R‡!$•Ál™—vb[¶†½V¤ñ ¤–Ù…” p`HÈXª‡àzC©MRTRtÞ Ú´ðÑ@ò6ø ˜JcÅ,€^3Z0Y–T¤Ÿ‘ìgNâßÀnØ ÄTd ž›uØÛª¹Ýå ?L‚Ζöù“„vÔ¯Nõ¯—×øëó掠GŽÀ“áa½õ 2+ôÜŒ9·úîµÒY™2¶Š\àWrœÖ¬¯m¼üÈÛ—5K.+íµº?5%eÊñÕrêÖœ‡ÞœCæ½±äÙ~$”PÐ dt°[ß܇F1X^¨sÑä* 1L%jUÂ35ÉàìèDgJŽF\n§¤Cî¶å’Žñ Ó1Žsúé5‚.Š‚´¤!ëÖ{}Ë('‡N=fcnв<è—AW‘Io‹€HôSûT‘T=„!¡¬¨‰@7Ëh† âx2H`ZÝÓõ.Pä9$딸  ¬ì™NSË´Ï·ÊÍnÖ*ÌÈl¯‰œ*dY‹Mモ֣P$\ƒWIoI0ì]ÕUOÖ´Å;P˜l2Mûù“k˜Í´£@¦i<õ8+ m%buͪaDq꜈¨#[°0@`KÊ‘q¿÷Nõ ¤BóÀ@däôc•3=.'Š–4ˆf l1½_n€cd( ÷VFÀÀ<ƒ@Äõ•”œþª5 ‚§ô@]íV3‡<òŃ‘¡ûL3YföHD¤üp¯‰nÝ€QŸ™Æ‚?$`;SïÓ ØüÙ ¥O™´ %l AŸc®ýªÇ¸øÿ½íùÇ·+rqÇ |¥t¸FãZ}Cù06¯mÚ̆£™%ðŒÐ¡RœdÈdŸú½²F” BVŸÆ•ŠGiŠìÁäÌT‰1ó”½åö3ÔzHyçü…\Êõäz9GG=MÐŽdô•”nèô£wö,ˆPBÖBv¯NïU«=L¬&²qSÓ·VAî¶ráoy,–$Y;0t…6œ礛Z Oü˜ãò”W$—×ÜH‘h“L]ëVŠŒ)2ÏžûR1Ad® élRDâjÀ_ š¦8¸™i°N‰U¶ )5Ggh‡•¸ãC¤6\`7À,²TË`'><áóvg.h/Ý“4 ~"õêTÒÐÓŠÄxˆMw1¹ö“ìêÉ,gÁtCgQZY»’k€Ø{&Öª§h@ 3l,€pb„…ª*ëtù‡~ب”ÆÑÚÂ'ÚºJEµ“Ò@‰NÚ&ÖÄ`„ ŠÝHÒX©Ø‚E@`d0гi€^«õ:‚?>@ZºÚ«cºÙ±¨H$®á=ãèÙ;¥2ßÍsð àNðºÞæñ^‹aÞ_}ÎÀØ/\6A>“MÔ3 Ö\À×M%žØ°¾g~ØY6!/ €·?¯`€® öϲ|ö:õwS½Ôز<\ë|ÈJ™œÀïNJé(%S4´b”N¢€Ç‡Xcö#..àív¦æ%E>—‚Çû¬½ÄÒ/õT¤ÚØÏ¯ ÌWêó#†xžoìáy•ê§œþQgq¦¢›€ÐkFzÖ]¦ë+ž²ˆÌî‚È—hÞ»Î]\biÔȲ7QÐSe‹5H—‹±~É'´£•¥Gá Ý@uij³™ZQI=±Aˆ•eu]'êaØ QZ@C—e™ì Š.!!]¥=1ÕIFžîw¬g¤Ò ÐÊÎGl1B†•©›”=c․  V°Sëj3”… Ýëk˜ÌM=Ž€yM% ¹âý6ož&AèûŠM8F`a J¥hÈn°™0r5íPšP0<,H €hÇ À"ă` X°°°aÁ‹X  `…EôÔµŠÕ|7FJ X‘^-ÆÈ‚Ø  èR-D Ì^«-2ÅÆ‚*™/öjh!?tÈRÓû|(+ðÔ þ.€ê•°ÝçÀlÅH7`}<L€Œ³°_,HNL{`~]?¶M€pªcT :¨H|y}2 û»tÜiÎ9ärß×Òø¢€²*JzÛº%ƒWE²f(4s¿ÆîöPmãlrÁMP32yµ– êbã½>0)ˆÉû•%«Þô2ŠzBÎ^ƒP|«¾Ù‡¢¨Ok7'XûLaWà}ðL;°´ý“ãHФ«y'³XûžnTÓ§z¡Üû½çʺ6‘O‰dµÉ{K磮4û2S¼knPÙ™C”î'rãyK‹‰ÐOÕüU#–ôa­Þ=’€$´›†ÑµVwEU§†ØìF“f> O:cbR ÕdOàÍZ{GEM@¤5çßYpÎõfL'‚ †ê ´ly¦ ‰•â@ @*CÓŒÇ#Ù ê’\gv€]Ëîx‰T$4àš­ -€ ôà XcÌuE¨%6Š ‚ÞPhðj °-J±BA*‚H±@aæ L ÀªÞÀöX‚ˆ‚%ÆìUª9…¡ŠAPT {#À›C PDo b@¬« Š «-²FÅdŸñr­•Õ iYÖGûŒO?«——ÿsÀ€æ†À«·Åû*×¹°†²×â ôÜd²ƒ J\z.Àîû‰åg@œ•&Á܉¾:ËÙ1 wÜ©ý:¶û¸;þ@T(ÿÝ)=g‚'3ÓËä»*ŒýXd&œ™ÃΊÀÇ‹mc¢}rΙ Åw:ŒiUïC %* AJ—º˜4ìi ¨ý‰¼æS €˜Ôv³:êŒn UX/`/„Z«€ 2À0ÚÐ,µ;Hj—» à°f¤ŒdUžd ŒdE\T$€O[†û*ˆEÕ   äÍ E±Þ$$kS !€">«­rŒZ£<ÖÛk•-b,*²>þÀázŒ%éÀ7€+Àk¶äÕG@¿™3˜ô91o@FL%œ€ñA@Žú jXoô9$àf„ÏHÞ·-Mø4 ý¾çb›9à î†y!)»¾›ùBÏæ@" Ÿ¾D=ðT{¦ßðÔxd ¸Q&jL( «#@®Tà ¢«%ª€L(¾Á÷ >7QÈð¿ .@K4«²ö÷7õ’”\ ÍBÉ™~«c³—ÖŠºi;€ wšŽP¼&%J Hts-%øcµ¸U&{À28G¥Jœ3BµR5PPµøñò±xw–1î“ïjœª‘Ò¯dq•w}c&u€1V³B¶3 ÍÖ‘b¨Z!¤æ¬lSJ dþ3\’^½ ´:ÐtëÍzŽ¥çþc÷äH¤ÝRPtgw ¬MmoòaáYt0…>§ QL{±Ï¸‚ÛTØÎ²-li68à vç)d½V5HЀؔää¶H¤ør7}%ZÐ|øKðŽë†÷Àä! à¨Åãk€VL¥Äþv ê¶0À¥c7ðÄ {ºÈ…ç•@Ìœžy¾ï©¦K&’œ±t ÉÍêøñÌøøýë[Ê÷3ÿ4VȾ9h  ¨?mNQ „ÆPhÁ·yÑï8šÞ:»C–U „0ü©£Gœý’ñ•ÆÞC¡´Qû?ûßÔà» €§ŠL†Þö¸B¡ÇØ8 $¬öçk³²î³®nA‚L:wƒ,º=dÍñBh4‹J±Å“ys`àù\Ñ=M9ÓZfÔÈ|ná¥+Þë.ÝÙN`¢ëÉx …Zl<(«lXf Ѐ+? JZ·~MN’ EBT±n·V½>)[’²ÖÀ2+g‹ÆˆNRñ5J! ¡ *ÇDWJ K3Àˆ ™+ `Àó3`âE`1ŠÖ£[wDÑ ‚€6T× `Ña ÀX" V1ÁR­©Àóu- µA5dÌ`¨€ªÖ*† UÐ@\ ˆžŠutŽ0†dæÜÔª†cÔmÑ!ë'úW¿˜5O²ûÀ–à+À€ý×È2ú´`{ ['J´p†Àå™àÌ–ÞÎDDù:p4¶Ý!e'A¸€¤‡±§ 6æ”VÆçòåç_; ¡-—ëŸâð… ¸N p#"ShýÀNÈ@:elÉ¤óŒ –Èxþ<0ŠÝè)¾@ðqWíDÁq"!Û†×!;Å{ d() 24Ø»ÁÞ@ð€b<“Ùù þa™ V+Šc¤¨jõ|5ö„¼íµi'gž¥.2ì‰fÆéÓ­2®%n ãGOggSÀu& ÊRúÿàÿÿJGDJELY[_ÿúÿíÿÔÿÔÿ÷*q6bÄíØ?ž¥­ÖR–qƒÚ©°~ÎÑM@ã”T öŸW%H-û>gè—«2lÐ ÝZþî*3QX{Ñm‚z5Pl`²·t“ÊR6°J]¤a¬Ô ^!€!R*º*{[€þxÒSµÖ–\Ÿ€¡UÚ(¬[Ë…j‡ôLÛ£‚Î(<¨¦I €Ê  ÖœRàÔ€ÄÖ)"*ˆ­±‚h :õÚƒ-¬±   KTD•1¼ðSôu0âXÑÃ(%’@D×µS2 þŠMlIHDzp¡;[­l i‹Èü„ÿÖ<‰œ·æÕ+͵+3"(füfrZŒw\DþÝàP –ð¹Én@UY¿€3Ðs[0‰.½û–ì¢y FÚ9ÏÜQÊ ä&¾UØvÛÜmúÃÜQ矺_ø»‚÷?º"àèmH*àƒ\ú\n˜‘ÓÈÁñ¹HC†®d¨ï•5‡…ÛÍ 2¨‡ t±‡¨P(> C[‹¤vÃFh¨U©ã@ ÌÓÃ3¾ 4žÆyŠkŸ mý3­²ÀV§’sÔPU#DÏçš­1݉¼d]Ö9`“e#ë*€,ÉG÷ç…Т ë·›*&Šöª€›ì“ý)”€PMGC†ïã€]UCUTŒZ7«}¸–k‹ÈK*ˆŒp®Ô_Ïn;å1àk“t½fõó£ «5b)Á†Å˜ tFw:qx› ã€F9ÂjK FÁB`¯ÖPU €Ô²Â ‚¡ ¶"èÄ×kÖ.j@@´*ðòÓ@ +AU ƒº0`ˆ€~6iå­5ØBÏ&…y±jÛs2¡XÔ‚ñþ¾\DWö»@?¸€ËíXè4¸• €tÀ,ÎX Íl¦ @O±mŸ))L!C2Gý­{tБgeý¶$´/ ÓØEªß}gæçG%*( ”à¬t{ý–4Í’s@|×}©_‹®nñ ¨uœx9Ø(nj4÷ŸL !— @ço®437é;>ºöRF¾B€-9hëí„£› Ã\/>‘ñF–ªc2¤ÃÇÙkÐУ($š£&5U Ý­¾äáµ:}å=¿?»l±ËÏ`a¿¾ãˆ¬sÅþÿnNŸ¸¢¾ÈojU·jýIÚówT"ní ¢Ú¸ìimUûÌÎÄÅh ¯™›EF[³§ÄÕˆó4PTÕ<‰žÄ£3»b¢!¢ƒ†h\S:vÄqµ’ùLÒMSnn@Ç×¢ŽFzëºÖú!Ë9bqjwô‘¢Ø±"”S9.¨åÖgъΛ@g ˆ”Nª' 0hÂNt.JÓp/""0±­@,…Æòa‡!c³PU+h€Pë4(`¢:baE€8÷0EU‡ˆ@‡ €0Xô¬h¿s€B&œNÅá ˜ZŽg£H²£‘yBäúýǤæZÀa×ûü ç¾ûŸ;Ef„¾…ë¥%+ ò5*‚³ºÀ‘X¼UA(e²‹üM¼BéɆTæÂè¿BÅÅHþ}\ÿÅ»».b\yP7ÚË;åØí˜[¢Rmâ”] W‘i=”HEM…¦b© ü€Âm(”Bý‡6ÀÐÁ_}z#8Œ÷Úߺé:† ©5ûʰv‹ãì²αj} r>º%•Ž6Lüð{Ý·ö}‚s ]ŒF=ÃnTØ êqvªu, ‘Ü{þüªõS Ê.8ƒ¹ã Ù®­D‘ÁLÐ}ÛîpÖvœB;j…¸‰kf@ ˆ%£|­ œJ=«=UcA‡ñ4êm)Q[!îûó»°¸t¨fÊØÐŸ6TÉ… ZcYA++Tµ,1[n=-Ää”Îvb€ „J rȬ^ð0ÔY¸ØP;ø/€U& Ò«o|ÚÀz÷̯a·g)ª’Jñ›Dk­³Þ5 :} I€v髨>Ä1ÀœA@œBéÍn' L8ûë•Þì 7”ĺ­©ß [³ˆÀ´ÝFYi¹¾k´”WϽ`[­«›².•Ìý~íå|Èæ«O;¥´ˆ¤”!UŒÌx%6âÜâGi¢Ì„:=Í~ì@Á{…Ò ¹)0p¯;ŸzþÇÕe¯— Ù]šÆò’Ê"œƒ¬kE¼JË1ÃëÉží¦”µ(àû,Š¿›@wáŋՌIÐëYd»<¿p»¿Ëª t=FÛ9»¼2©d\ÉDDܳøÌÕ A[ÇK¢®÷bv•{;íõ)£tŸGU¯ÖŶ™½-Oê÷Yu-wYæ%¬}j·Î²YVSÝMüæ{8<‹ˆh}û²ŒFzŸ¶îzø mI…ó/RùBf‹òpÊÑûÜÂV‚‹Ýmw €Þ‰a¹¯‘µI½÷QU3Ykó©[ÓŒþØç±MlÖíó´ c˜Ç“4õÚøõ°scFUÛÛJÈ@¼¥V©Œˆ465£íÒâü€Pðf€ìñP²ª®¼˜yúOiûôù¥áÒwoÚ«nWÏÖm+ïÐî¶ÞƒV?쳪¾‘N[oNžƒ|mJ @…CoŒ!Íc” T‘Híƒé"–ái¼Ö™IÁÓ3nÜWºûrMÓ¤IöxŸÑópfy¸CSA$Gõ¨iøé»é¬™óÃÐÃMç)y‹ĬûlNÿÃt~É0õ$Aù5®ÿÏ®)(â3]I%ðÔë<5­!ó[{êÐ¥15,3$™CÎ,ýº ƒ{Wpfý& QÑ~&szn’;×fŠ\sªáôZPäåëqb$È­;¶†°FôÁïÃEÐG÷¢[êœ0dC¿ŠÙ®E.§7†}’w–®¡Áˆô¬€‹×€:À[ RÞ¢Ðnh@ s#0)¨J*þ,ÒA­2¢|7ëÆ€0ÈЊ§äA@|pÔ: ©q€®ÞŸøXà¹ô¢Hbuí~sŒⲯE'~á&#³)?ŸþÞÿÀŠ-¾Ïšgàâ¶e‡^I*ƒˆ†Oy$z—WaQ(»hdðh>úB·Çeb˜E{:ä« *ËŒíËûá˜t?À꺶Þƒ‘,Ö|„oâGE öLYCÝåbê ÅÞ~¦9‡]`õe0{03Q¼íCî;ºå^wÒ8›à!{ÏqÅçèwÎ;Ñ Ùf—'/cÚÉ×r ÞC(9ÄZ›tø¯©LN«‘¥¢…Vf×? ›yÔó¾k[íÆä¿§yû.Ó©6.í«Ö…+˜BC˜OŸ£4tÜ’5ðQÔ:ÑRHà¶¿¹j”Yú­ëîÚR^ʘçÝóâwú×rwö ²eÍtÀô–ß=y! ʘ0¨:„ÜLôž—ñäŠE»›MÁ4ý2Jsõ½uÆ]cnŸÅô'+qýÔîì–$Ó¹ñ•²É~—A£·ô ¤x:.êY‹“}ºû¶&‡Ô€“ïã©SË}½›IêÈÈŒ²ûr.r8ë5ÏÊÔÀ¦èÞÔy…ªêù÷]£ŽçbZV—v‚`‘e„á1WBéö£ŒÄâå·8nì>P¼Âûm cŠ–7»DyÒÒ¡í,d˜¶€¯ Ë`K ¸‰eùß²èz9臘UC”D¤4ñFÁþˆ9Kþ”ße>ÚÈ+ $¦Û—ö©G®„ÞÑ|xà½sFîÐ_; èxUR”ÇÀËÏ›æ¬ôI|j÷@LfÑý¼9ãÖŽ¬³M’³%ëRFI¸h:^üG«ÛÆ8­¢^, ‘üèݱή`Ÿ?-ÁÿP ^› àâ>íºCöÕ} Bra÷oÆcÒ‡àÉJåæÑ·Y´…9dÿíri )3î˜ ¿yÓ웣Š`õk€ {¡¤Ûœb²Ó3ùL3s.–»hˆŽ/gg7lÉs¦dí¼wÍ´Æš5‘$ÝÀÉ Ý¥ÑgtOâ®îËÏèÀŸìivÂ󫢫§²ŠšNÔL t<`˜š,•þÜÏg¯š'ñþ4Oçˆh\ÐÌávñê ô/´é‚ßóÓï÷·¯É¬†!+6zëGFÝæÒÍÙršéd™Í¿íØíK0Ýû™'ÉN`Æ›ë}Ö,’ÄÍ΀èÞô´4~²·@ W[ Èù‚—0™_‰“^’@w. \Ç D‚t§ü$ÖÝH’îW‹ÀFƒPì˜S00n ¾xE¥¼2~G'£ã^Ñ ›¦Eæ§¹ÿóû½·Í0o®¾à3f°ðÇra±[Ogø×\¸áýue@ûÃWg o?A`øæÎ@­:†iµLÀåìšæÃéÝ•5û À—/°ßäÇŽ›NLmî¿OÞ<Ð%!wˆ±6BøŒo#ØÝÚ)í7 d!2¹Ø,ýZ‚­óU çBž¹é±‡¶@wyŸ)‡¦Í€W(½}Ø¢é™úÛÉv¦~Ôx[­¾.(rXIJ›½Ýdh¶âß º÷^Ø“wó¨Ù:PÄðalt9ì3Ùw¾hŠÎY¹²þQB[Dʯ ÙØvqæ ÐT®•@»9]-ÝCF3ðæ© þ½v †j2d¿ ±GšöW$Ó»® âoª/]ôýƽ<»æPÕ&ŽžõÞ]E»§g®ìè1]ûÞm›d6r€™˜<7g>›Aá«Ù=9'8—ÏMÏ›™Ï Ÿ÷î[–{È»H: ò+Úe‡À<˜¤0âA`N£À—Ð@xžkù‚7IÍÚÂóùµž?‚ÍÌØÈÐ6/î‘”]ÈKhßÅqþxÙ–%Šò)"Žú¯ —¦.ƒö)"—Db?Xg#e£?ä—Ÿ ß:(‚×¼‹%ð⟸q™¸~€(sÒSœË~†yˆ„Á_Ó¶aÓ‚IØŠ ~÷~›é^Wõ$ÀyýŒXæƒêÍ dr†¼6Vå”}Úòkz€âôQSÖ† ࣊árÞ}  wJb/ÈP‚[?Î*=ÐCVŽO~S䯉€¡;IÚ ï2°a÷û“wЉª³{¨é¢W¦+Þ#ðU™CΆ:€¯á&TM¢«N|ÀÎÿñFPBÀ¢ÉkªP|!€„@zˆ„DÀòǵc À» y>Ü20¥/7ˆiMnÀ^ˆ%†—bö’'¹FàÈa–Ìón.û!#W*àðX_-| áÂÓÔÞµ  œ€Ó»= ´Þ"ݱž%0DÎà%WÍÌ•à §AÀÀ³ÔïœêÐ=! K P0ÍŠ+ànw tÅÈ) H~÷"‡ÕåbWÜ +dJÎÎû×Û“j $B‹úðO]è…É77—R2¡ã~ç{í’"u‡(9X>“†ûB ÇtY=°Ä/bdH@ ˆï&DEgš¢Ä&*ÜÉÍÉÚéCžÏÄ™[zãAt!U­qä—6"Ík—v¨×"Û`"Û¤«ŸbílF^{¥àdùWó‹”ì¤57æwÕò,$OYjèxšÿ] ýØ¢oü3œ =$ôL“MìõúOÝ5&€üdwdÒkÒÉô²Ù5&ÆÖ Ã_ˆ›žðº†æÛœ¤®`¦X¿Á 4™Ì(:1³ùõ[Y¦¬ÅÚÜœ®Kìš™ÚêÍWøê¯ýc†±=Ó7qd$^&ÏCßë—ØÙ;âëY»¦ ˜ª«âì”,aùB«dƒ!cVØ%—!¤Óå¶Zȵõl¹â"!adúiÙ§$HÞxÙ’e?ü&7ZO˜É¬°çºòÃ~1È‘p´Ý(ÅÇj´KòJÝ« ÀW€ iºû|çv$ô©áJ9Çh¹ˆÇháÂ3©ö,„‚Ÿ4Ð0"#D¹;QpzP  ÿ¿q·š.–}çËßúï©Ñìäecî²6Ó®<^KúQ÷ž§€é™€—¹ÊP»Cœ çŸ}ÐÝA‡¾#2[d¼D—Ém øÏJoïÛ཯FRÀ#Ðy0´(ha_${à´µ \c}ƒO”^té’ß09£íÃÀÍÞ½µýRÛ™ƒ(—`)“ÖY(Iæ¡­'ÔüBøsš¡—H<õ7Wî^Ñå BÓâbëË0I3¿`ªÓÁ¯Mçƒö¡©û‚˜¢èmÂcÀ°Ó+¡¥øÂ}qÊþ2;…½˜îŒè¸ ›Çl O@BÉ»—N衹UNH`ýÊ×O‚$;Ìñ9ðÕº # ‚:@Tÿ©Í³ (€H/HëV ¾x¥á”²#><$9$f‰ì6.'³—ÁSäh[prø¬u» —7Mf̯•ø@À (E-@NÌ£{‚#@Fúx4¶M” Ÿr±Àû¬.!v€(¸ .6“Õ}Õm\ØÏLýýY_°ÓÌš?|­7¦|f¦ñÈåñÒAûáEOH3@¡·%磉î @emÊÈàï¼Ü߯^àK.)A}ô{6/Œ±ä^yöšÛ¬fpÁõnÜ ¡Õ³£È›%ÈùË<7ªáïX&¥g€)ºv<§×40Öâ—Øí½ Å{d,âÏ‘žßèÌ‹"Ú§ÞÃ(Äýh·jåÔu²ÃIÿ´æç6~·&pËýYGð·‘Iô¼<Û{§®SO $¤×É—ÞðÅæÕõÕ$÷®ïü¹‘É.€œç¸ÇÆ Î:ä4ºÈ9SÞ1Áb båÕ«“%¨¦@Š,¡ád ™¨ÈL:º" ôD4Ižª[,,0XP¦3Nì``¯¬ª† °p€¢|=“xÀx冦²‹—¶ÜÖO<˜%÷¨9œS.(žŽöÊõ—øôuHà[Ó PžRàK€Ówwú!œ€žœÅ3Ï“Ð0¡4I*äK €•uÛߟIg0¶×òÇð¯Óý#ù™$æåJÙÇ8^B‹šš¯œs†àAù Èb#L·•^Ä?   ¾EtÝnøu=Ÿ¬“R@ñ¤pÍ1×. ¼uÙçnþ:£_r×íyÒ(ãÎì<¡­õWA'“ëH÷@þöAÓúÿèå¼!…N‰\YÅÖfð¶fü—ZXÈ.™< ×]ÖKG4@QwUèöuÏÐ05ÙÁmí,<òœò*y9’èíÔÍõUÇ÷`˜†Ù&>t, ÙÓ0ì ,O p&éKÑ8M³¿—=A°çTuÀâINÅ Ø{° §ÿïý%ºçÃ,/,û?>tè|8rŠ+ãêÏØ±æCa ЀDpX_êéù-šœÜS$@ɉ#ÒË®¥5ë{Ÿ«‹!m¬€ðõ$€àË0Þx…öžÐ‹[n‡X?¢i²+¦\<ý’(ð ¬_ßH¸ÀVÞÕ€UqÎw«A+q ””ù* p(iD!HîD/‚0G{øta„57ì̼……^Éø!@?!ØT˜‚Œ7ŠqR¡@<¨cë"ëÖd(ÿ|B&³@r\7žãþ!@öä‚_émöÏú”‹—y ÙçB9¯-.Cö!ä'kçUKZF{Ÿä}ÿ·¹/¾£ôoLG€f  W3CE"YÃTà÷»Ì0w–q•çŽìy£ÈÅ ånÖ+ç•%NžÝ?ëùÿ»$S=bŸ¯û]k€LÚ:U…3üèl¨6´÷›½dI, ýú"bÖ¼¾Ë6‘ûÀÜP1%rL@Àµæjšë™Ìù.žé2ùï¿Ë `àp8',[Î ˆ¶7§„©šÿü‡Éî8Æ;ÛÑA’¤¾6€ £ ¹‡‡,˜ž*ªC޳;6 ÓØÖR³«+Üb`—X ÆúƒcþxÅÙ%M^Ê"ÚrxE™KDšŒNrä’b |||Xnr½L(ž)ˆWQòSÿyÊý+À èè– ]c_G’Ÿ±‹t©n:¶Ðh¡ "€´ÎÏ„=Ô$ú®¡öšªËy ïá3ï{.À›Ûi½×6×ä?vÈK‘S õGê|ÈD03£ÔïÎéx€ê¯Î¶É7UB¸Ÿë¨ÏKJ§\ñç2o» ö™}€~ãŸ@$@²ûdÒý¤vÌäl®> ˜è—lJÀXKw¶`ðÝÀV¶Cú®4n@Ž{O®ÁRà³ûmê™L5{¯MÎ8†÷¦ë? vf·¯½Î¿ýnÇ“™fhñ@ý E1rY¿¿QdlŸµ?³?ò†—‚}#PjH62’¼c •€°ÿ|"E"DÜnÕI6ÎújÇ4:Õ=Ø=«¼C€+ÓÀîOðÃ^–Ðќު£QVÈ®ÌNWËõ}*è‘ø\”çäjã·º|¼]änù 9ä&T«W.¹f±Žcžwu/[ê ÀîÁäeUþé<yXEj9—Q[©ú-¿S÷(?ï‡æ¾^WôÏ êTao¢KOõ™hE«Vçïuþé­ÌZÁÉnsа:EOfàß™é˜;‹ÀÎ ¾;èÛšÛqbñͪßv[òèA­_Tiu×ÊRfô × žŸ{öÕ¿¿ž?üôà.o¯ Û®Ë<øÿÊýÙ4[ýós@è<û´|óçÿ”×@Ä^Yg÷Žø !Z2Êë9 ›ƒ_M¢óý§Ÿ¹°C+Èn}±#9ù Ng¿*¥ ŽÝ Pß<å+B8ãVÌï¶v3SÙÖ¼K†bé¨fýLæõü#½yüõÊÿÞùtòŸûÔëÃùeÈx÷âBÜZ…‰hK¯o}” ™¥¢“Ô‚¬7>ªcÏw§—-Éôd/Q0ƱºþY|º@ÿQ®‚ŸqGÔUÈòÓÓoàÿ£ÈË)|þ‡ 6ss'ì ’ú ¯À÷ïÿHÌN…M£rfc£èRZ¼†ÃÈWÆÑÐç('SA ͩΉ„þ‹ÿ[öÔd-’½± êíaÖg¹çw®sºCò§?Ý=|Þ9£ê ÁމJyøÃ‚ÿ ÒÔ^é½Òª“–›­6kE7eÌ«0çÈyyz±ÎÏ•L–tðœ¤ã8åä=rAž¿Q´†ý!¦$Å_²wæå{9Yßÿ©‹tiÃ_ŽB6Û˯¯à¯ÿ=ÀÌRé›f§Zf}0’ã,N¶Ñ>… ¢ñÉγ«'ÖíùŒCãU„H$¼ì´GvϼÞúò:ÝÊpWIÎZ=µäÉŒjàž¦¿¼tôÔX~W>?¸_~€ì^É“¡L²Uδh”Ù*}*%„þë* ÇÞ|«S;Ö`²ó›w@$!pêZ—H8?ô“uMs±æ\–= Šª;¹¼Öóú+àONÐÛºúK8(Ì+ê€wRí?äOggS@½&=„_\T\[bÿÄÿ¾ÿ°ÿ¸ÿ¶ÿµÿ¤ÿ›ÿÜR‘½¡t"½-eЮœN‘j¿3ë²*£c~ÃYÿ’#Ÿ%ˤƒÛeìýù0»üÞ×F×Ú2«©û×Ô“}»síhNÛú¾.LÃÛi1ÿxû`…6/Ü^±5 ·­ÞôÝY¹Tƒ¥G–ÎÍAÅßY\;Zç9³ 5ÒÁqMúuÞÍøFŸÏKH¡‘B¨‹ê¡®b›] Ãpµí0´W—óømÛ¶mÇq¨!¶©½F_Žöâ/ô†…ªb'{½à0ÕÀRì¢í>Àì\¦,<±ÞY$à;ö•†ê¢WÕ°ÔªÕ*¡ˆ6i) ðB@Ë¢”~¯ò”¬P- «1Ñp®–[€¿ÓPžÜ~™bwj¯±]ŸÃ]¬Àåá/¢…Ì Ä5À;+½è µ†ºäh•³u·nô¢â`M/Z‡¥*ºìÝHh 'ÔëÞz« A!£µ^&Ïíûý_’λ¿Szäz™!† 2LÇ`Õ@¦üÛôÀõ‚ÿ\ƒ{ô¾nZkê*Dõ ©yõqòµåU«¾¿d-9½­üŽØwZ^¾9,îé¢ÖCŒ¯ÊÙîAR”Wؽ×.ôN±AJC´»X$˜ `Ó^€mDhp1ûzËãÛ´q›ïŠel5—×[~®tÂiãïGYÖöqÿï8©éyþ Éõ­W—ל‹çÜûuõ"õÁ 5zj4Çkå¼®‹ï[ (Z»eZ‚õŽfÎ+t©[4dt4Qç ¹û|yZkÍ#B{÷ñr§c쵇ñ/¾Št·@¿Ä‰0:Úðá[¯Ò\W•…´ï‰LÛjö{©Ë :ÚüF¿Z“«¹ãe­¸Û}˜´¿Ã}©_J|ñùâ–³µc‡É>‹B®øÐšKžqÞkˈî3‡Ÿ4D†zkK‘“‹I$@B5 UdWEH‚¡Ãu 2ÆöŠ(·•PËrÓ)K¥r²ûÔ^fYËáêd«Ch¦ÇI`ЕUƒT½6Y|öÒ»{èÉ=çý“#óu’Ó¨3ÍØš¹¸ÊNÄæ2Až&$%¦~äP¿Âª¡½Í˜'›šñ]™¦<þ(žÜ2\Nt›(ÔÊÑ  •‘ >÷õ–ª6û‰F° ¶ SÓýöüç=ätÑ“™,µnÔs'Y³*º’††*¨x*å÷^N9 ÉÍ+;ˆxIa“fJº%2D4 6·°$.ØÍöò|¶Ú1æ´WƒÒšK"Bãy¹“Éáõ—CöUoïg»¨åñÝh€üȶó"d¸[†òì8¦nðjï˜_YЦǰU‹†išjS/‰ãÅR].#OiGŒ‚L@M·LÆú˜ÒEiŠ”„ƒ¥¢ÓÓ#€˜ÀÐÕPÙcºè‰”¨Jñ€§¤‰zvvaÝb7dz±-ÅLè˜ؿɎ}+ï"b~£éèe²ÇFîPU* ™÷$Ç–“·àFkïé6;ýäšN2êób¦‚oΘ5~ö®üÔ¤éŸi·qúj¸³Lå]TRˆiJqÇâ…œÞíÍ@CFÇ[¤·2£ç™¦;¡!We‘Ɇ6äwÏßçýN⃉Ä$ÍYùÜO[N—úÇÇù²P øËÚþ]b‡eÎ4£¹€h²@ƒŸ×­Ñ>%XC[ K dÒG&o±Эf‘Ñд€4À^E €ÇcÐR’ÔŒ,LEE%/V]nFFøäÇ@”QIN 2ó¼ 0²Ÿ˜îâ.)þÛõiŠa(ªßnWËb´ß¥)ÞÉ7€>µ-vÁ îßì g^Q£íZ¯*e”fÇ@‚^fòü|·99qe¦?õ%d2Ïýƒ¬ÜÐ륞Ðùq¯„y%,rP›Ú;„ú£;⣂úª?À5Ò¦«wE)§”òGG¥:#ÓýfŒ÷0Öaâ3󉱺OnÜx®á¦4+À9 M ŒÒã:kBB!h”³ç´äÝ•‚diÙ–¾÷ØÔI‚¹µóH@;j´'³Ã ¡Ëi®ºr”aSû§­ªµ²‹ä±ßß2Æ1åµ$!ëÎÕ4'š#²¤¢ãfh* ’ +çtÏHû„xûÕÄ#Þ*—ØLLƒæf˜3Ú²&õV¿×À0YtæÞà×ww~Ž65EtGWKÿjsc‹kð“CM“ÿê½ïªÃ0S TC¥»«×Ìœ¿·‘£d²óåÄ?R0eêJk~èZ:Ô@t4D £• ¢È\Ð_ÊæýÈ€g¾ò³ @øÇ!¬iõ•P®Ë\žÛeñˆvÃ6±°c»”€À÷ ð!¦¾“¯GK°ä$NÀ¤Ÿcø6ë:j5©"$ 3 =Ay;¸õ›G›1¥XÀýç‰ß ÑT ”¬÷%¼¬ø^v¸©kƒC¹\7" „>é¿ê—h<'ýNGaG~òAS»~Ö\ÀoÑ*O¬¨ÏÖü3¯óæz¶}Í$‹€ê;(âì°Qç}"¯Ce Œ+ eGLëM'”»¨©!„Ê{¯‘ £@Ÿß± A]­¡&Ô"‹­=ÍÏØýëø6ÛœF“gÉNfÎ#ÜÑ —H b*¡Åª˜,òîÑZ7,0îFôµ…Jr¦ÐÓÅô­ÔÑ ŠÞL†ÂÝn˜dõñäõ΀¼ 1_ksã-æI6­7öId½ ñFÑš>ù¦Ùïã,§7 =ämoM%âøJµ?Å4šÌìíeލ‰)¢NDð¶›1J1ðÆáh‰5¦y5?\8à’o­A8@â \F>¼1ºÕZó6 Â÷.ã{n¿¸íÛ«~î¢Æê$‡ìUä/ª4rx/­J€6ŒîNÿRqökûCxPðuu6'>™‘Ùט) Þiû×óI›½VWUrÖØ™oúdTØöô7r–µP$&@f(º&S(çÏШ §kò,M/¸hrèÄýv’hŸk [®™’pÀs°-0=ôáë€ä{Ó¤X™‘d­3к!€±62|Géÿ3=ÁŒ8¬hIX³+kT níÖn­º Èu`É‘˜dr4ª°üWíˆ'yg]ÕY*:k hȸ:3ûjè*Ÿ *ÐzYåøü å–NÜ%C_w÷ÀܪT§ ˜b¼{öSUƉZn«·&Èr¡@VI`ï^A¸^·°5k hŒ!&R#x¸d Vd¨#S†³X0 òc!8hµŒQA>@A…ûÿ¬‚Â<ÉWçlÀ—ŒÌ,ñ žë­fÖ¤M-!˜ÕJqÌhÉÜ ~Ç5zæ¢_Bó%ÀѧìÛº?Ùx·¸ßKß¶­¦é àÎÌI»ÛmšÓó²uŠÏ|xt‹Ç%Ç”’Îô§-ØÝ „b_WðÌ©þ îáMô¹¥&î?Ñ‘^iƒ‚n°p¡cšoTkœ–âM½ÎeHÃÕº(†ýh¼Éó Ề! ÛåØ4£þañ`7ö4Ì=åc’Aƒ /®C„2¯õ1 K˜ÏXTé Ìy€r7mŒ4§¨B|ç´¤¦¹e9bzæ"ïØÉ1 Lýýi+ ÀXC7X´)pœŒ«Þ,gOZh ‚\¼I˜Œ5cX¦6 £¡Ó5¯;=DÑ}™¡ŒÒ?ÿþ|í µÁïÀ»µ« >¶k™ÃGKqRÚŠh²ÄÄñÓˆqµ›PFü”qNìÓì,€¡ÀðªXUÃeUÓÀèfHÈDF¬`¤ “`@àÀ¬  c j€V¦.%Ã@41z#`Û?ÖÎXþÉþMÕÕÛÈ”<þÛûü€X’Éí&F2‘@jxF¥8¬Œñó­Öø °@¾yÂ]OÑÒÛXz¯-ÍÎpƒPÞ^Ó™Aò•Ý¿U@—|äwŸ'Ë€^õýCã 4ª5¶U)P5G…ihñ|ÝÁ‹Ô“ t´Ò \;êFTÿr=@†Øk½°»˜å™’ÿK•Ó4T€@oCVƒ5u@¬=Àt’®®˜ñ/×]cä¬8« R*#9‡c&Ñ*³i(Ê^¶o~û¨ö3ºªOW[ÎŽlÔÔuB1'$ ȱGõˆ‰ÉÆåý°î;…¸ÛØ ° 0nÿ«¯ƒÛF5f†_†}±ðàEÿÚO÷†ŽzÕÄâÚ«^[„á=wè¹DVJÌÏÎÕuózjœ  ç\¬ûÉwNõÀt¸èô‘Ð=vȽù°½M yôÎÊT A{²®@i%±v<Ç»Awof2ÎAf“ŽšÈé§A´S[ç :€‘ÍL@ÄȈû9Úf¨7ÓÓïü2Ú)¸š2ãl¿¿Œ>@‚wšŠ “4àt÷0 y j_¦@v“΢ YsÆâ¤ªV$P¥é=žÿž‡ÉèàSêï?üø:hš9^ÃdJ㨷j¨Ü„¬Û-ç­†š„Ùp)±SšwM+)˜F>éûß÷L#h ÉY˜HÄØ¼B7Õ+ &,Š¥± ‹±Yˆ€ òƒË-{7>ËMþê ’6b¿ÆÜcÛaLZšàð p~0ø"Àsï´;ÐL†[¶?ý‡—ÍzŽÀ‘ à­ëXš©ËÌD’ÀÌpøwèT,ƒQæÛBO À'.w–3í¦ráÿÉL·9g¾Âíî4gd|åÌè¼G»)5ªž÷4•®T²mïçïdjGù–÷ìzÃOdÌjP]¤½ï Ù_ÒI?øùð'gÊ+?@Ôæ2 ºrÕ È`Ž4J%Aâ3XZMR ŠϹ]ÎÅù~ Îî®$Ùêæªø&`kÇ˵zyLßü~D£éθIï— `‡¡Ø×Û˜OggSÀã&Có³\ÿÿ˜QPPNRQQ[VZU]]ÿÓÿ·ÿ¾ÿºÿ±1Ìé0Év§º†5b#h¸èKoc/öíñ4CÞ qö@ ˜ð‘!s˜9-«êl’2ÈŸ>† [Úý TTC60½œ;hLß#$¢EÓD ¼¼ÓS½ECNx–ëL¯M'] Ù‚õx°v ²$1–8­ @@ää˯[ tààí¬€ÿœí(p~Ëý5îI2].\umý:óHîK9ÚlêáðÁd½‘ÍòÚÉõáÂs¯ŽÆÅâ(À—G ,€}[nÀqÀïÇJ§ 0uyÄÛ€ÈÌd!AÂäî_/Ä[œ(mø¯¿ëÈé-{x ñK+ÞnòÑG¹¡)· oªË”–^ÉyU2™ýûp¢Ì©ið m(ØvÇ•@h’×]4?ç4ótMo\wKWÁ1¬Ÿé À"ËíàŒE® eA,Ì€® üŒ®ŠEmV.õ%(OÿrŽ…7@-tþ*h#ÿ8"¼X©P÷L…ñþûº Kb‘›,‡èñd>;ir? ýŸbŠ!'목¨H"™L"fÞ.A&c$f]’'¾·ÀZŽõë²@øÙc`ö@€Àj›‹SsëÇ! ’œ'M©çó›K€µ$I_Vï³qðÀ¡0˜É7  ÆåÄ»{!‰ß“`8Ñ"}”IA[¼€C¬¾d Ê.Ð8@øOvÊÕþ‘ËjLÍÑ–½^ÈÞt‰Ó0"øÔûu\ì+sæ­=ú޶@˜çx­Û…ßÏ*Òž¼ ÆÒT­$a€Ìl*0w¼aMZyíý«ÙtŸ›8ßg¢‹C²D$Ç$V€;¯‹Æ ŒPö†V(ÅSÊéÜwnmÑ~µÞ/Gy¿R”@Ⱦdš`¦X'ivÊzà-žÞÈU3®š/ðíŠÍÛN8dŒŽö–®{˲}Ô)@ºÖœµŽ^zÓNbÎR@¦É™”W¤3/¿äôß»÷lÀŽÞÍ[*¯oû¹íB{³I?ãHsè¢ãõO.Y²ÊO‰ÿo5´Ø38Ò§ót@)ñäþïÉ™ªf Ä““0d߇ž1Çùº³Ó “CìsŠ‚˜‹›˜SóƒžD “N€)˜8o±4IsíH†c•q}ÐÀSîÐH»‘¶‡ÉŽ»³‡º˜Ê„™°7 ÞÝÝ]²uÃB0—ñƒÂ#~Lrˆ`XÀÁÏ`€ü‰3Å|nµ‡gä¿!e§>W©]úaWΉ"¨Põ„­`ø©Aâùwññ×J6‹'¢·¹øê¸cxïèòííÊZv:'欳S|† ƒIõƒ?δ~ÕÞyö5CƒfjWxñD¾šFNç|x¥ €K“ÔšoôoÒ.Fe}êûÛ&?Ýv ø³'2öJâÏ `ªÊ•6 ¬ˆAÈÃþެzñ݆øØ”2w¸R½â§Ç ïúØ\‘°\"XVB7×õ®½³YÊWúSêRŸŽóD?ᦣî9çÜó/×Ôy©„æÚØ|• ¤Þ+œvñÍâ Nð©B½º—À÷|‚Õ qcšµób wr.çÞ.SX^?°?o¸³ïìé|ÚôÖ§¶œÅ÷ƒÐ4L”`b,B4y Œ‚ś׳Eõ»Ó«ö¼Å5eP‚v!_€°,Or éÒqwúxÀ$?KÑÎ9Q×̾ÏBÿLoƆ_8èç× T=•{|þ-Œn…½'Íß>^¸¥êÕ݃äÁPüª{T.n“U’„àvîµKÞÈAƒ´}¿äÎzâÝëÕqÔ¹k¦gÙÜýîcMÞÌøŽÙÈ%w V>o§ðúlŠõ/žL|ì g¦šHõÒ;«Où¥–¤ü ¬,ÿŽAúÃ^Ÿ²…‘ÖSß?55B]öråBA®õÈxß§ÕSη3ÅÄe€òq ¤zñ›'Ó¹<wv­_ôÍ“­ª¸Èµûy©a¸`²¼úèFgôs¶u,Ô•Ç|œ[#/yõáégÕuÍ|ÖËW‘ñî{§Ü>0·FµÁ¢ -Á€c3øµ2"¼rÙiÔ¥Öàë¥bÁêùXE.Ò»7`M@ebróxcqGþU¤Åú󸮖¯W}ÖsªQÞ;øÞ"1¸FÂ¥^úœhÙ‹B„êùÓÒ µˆàP‘ª¼rñƒªesôJ³Âh)ŠôØf#p®Ø|ü à6Ó>6xtϪuþ[ôMñ/*õv»PâQÒ—Ptæeñi¢»F±FDUH2´,F`ˑЙ0(À.Ô‚ÓjªWèøK·È’ÔXô|`›IEàÑFÇq&2&£¿›m¥¸ÔÕ×Ëê´±ºf}ð—ë²F?aY>AÑWTpY3Ð"6RìH6rLúé¯,ÄFYSR¦j™+ŽZµ3`•¬ §§©?À6nzDßÕböĪhWsµ ûüPŸCy”™ÚTŽ/ÕØ/—EUW.WË}SäÞÇJ‰­®|»‘!†¡±YrŠH­Eïz[BÌf³´3FR•Ha[keÁeªÒÆ`kQpI ö-ÉžTŸÅbkçb_D¹PUs¬©«Ë¡¬*ßOÓÇÙâƒ[‘[IŠL•NY)­qJ‚S—îŠüFEëåvVŠk šš5’‚ÕNGdMÜ•v± ¯Ñ}äÙçÌô _ÜÀb„$›~³aá[/ŠªTÕª¹bY;»^í«Ù9°M/æ¢ÄXv|œ`|l#ɨ’´ìEü™ì~ö~3Œ0ÉP·Ò;2Ó{ ¶ñDÿøiÇô¯Qg!†5-\´aãC3\våäaÊèÍáÍKâ‹9Æ×²¬Šðx/×éU=S²8]bÏ4dIñ_){3\]ëMOß:ë²ç#ù·ÈïjÙÙ@$™qMcKõ¢þH 1L~bžX~Øþã%½ïÛ=±×çŠ?xéT“]S÷Ðù_1Üõ$lv×§\É3½¨»8S“ž§‡Ýž‚â“'Ú““n‘ÜÅ.¶paEîa¦7dÖÅ/’î T5)*¯ÝoBù&¹sm¦*½ÓMòPduE£ån ñÐJ—™æñ{ ¶90µzjGwãI ýÝGr™•Eo—‰ž¬™ç14ˆûK­A ÐH`GUÀ-Ý"MÚÌ\"MɃT›d3”6–.¤ixQBI'G€`c®/¬6 ¶GPvôÉè,¡†M‡EßîÐÏ|Íç1–H¯dH >»õ¾á»%A7£×ÛM®ñÑ&%¯Ñ¾Èüld˜ˆë׿ӎ¯Þ¯dë¶z­oÕLYªÑ À»²­Îh|'ðÑåz ä.¬8ƒ×¬ˆ~“)+±Ýo·vz“áÜÏϬYrr,§¯™Âî˜=y|‹Îã6©%„hÛ¥Y­nJ%J)u?GˆâlÒ4pbjà£u’5P*í_£C«FTå^®â,ËNß߉æ²& 'ó…(³Óa´Uv]+ÖRht½ý:ÞÀD¢ thM‹š‹Íö͇ýCÙ²©é9 ”_½ÕçÔˆ¢é+Ù„WxÁS™Ý‡¬sŠsbhê®ÎúlÕ~†óÿ)Î2v4¼ ùçwŽÓ{He“šWƽ{í™Þ˜ßx ²§•è»×¦ó¼üø=rp$AÒÎÚ'_Õ²žeNŽ&ÝP$Š—OfOöt-ÞdÃy7<÷뙯Ù¾fƘÊG#z¼xdÊnj¡¢À“XE^vPs!7ë.ÿtÐ\@^ø(Èa¡ÿÄh„…á1 À¸,`D„•R:BøÁ¿4ÀK" 'þ¾»k ‚„!Ú\n‘%¦tf´?€þ)³ƒ&»=øàSnyct°÷ÿ­™ûY6`Ùò¶m½Yk\Jƒ’ RÁ°¦c÷[pDÐ @ù…„ h×"ƒ7Ó§³ò˜ êKÊߤW¡Œ«&¾Ø-¤ˆØnÉÎ)3öŒÑ ëOŽjë?¥o¶-ˆ·òȤے.s¶î‡²ÆÁ¤t¾9I@íÀŠíp§xio«]8ŠMR¶OÌдµ¶(xà ¬ 1v{ ‡öaµß [$ÈôÑñ•7Ëv¡æ|Ž~7U‘»»›¦ÈYŠ!—pòîµåRëUƒë¤/òÍ»{HÀs1¿sz2ç…¢vÍÐ9¬LC7 ÄÙ••>äï!ži»ª«Ã½æ>Лš«a ª ‹¢ ¿{ŠšÞï×9$MM%ٜԬÎNù†qOc`*îuÃăÎû¼‡šãƒço“ ‹õ£Š~»J²f7Õ~@a¾>f…àÕ`£Dül(’y“ê ~6 zCÐKZ`ÈA[cÀ€9–Û-Ò4PrR×JX€;ÒÄB<@‰#„,  ž«miž{9’©GhÍåκ&Cdî7À×·§¯Ž°=`8— . iÛ§÷IŒ›S5Œ²* H g&óC?͵i¸a>ç¡àþ&̧Mf¤ì+ >T».Ë^ðHœê•›½‰P¶1ü`–—7Ä÷ŠDwiœSaŠÇgÞl z˜uÛ2Ç2tÜÁ‹ðÛpDZ¿½ÇAE£‹C˽ãÑyôe{€e3 ¸Këe\‡uí4`‚"(¬6LgÃnUpÕ0ÙËY£ÖÀ®¤ÐPÓµ£B{}ÖüÌ&òPMßmAö`P¬ ×fÅìE…ÓîF{mJóT3w˜§ v‰¶¼veqÓFÿÈSŽ0òMÀóÃÙLV6y`I~udÖždb>> ©3=Ýdb±§^ïÝUtÂô´¿ÚÂ#»E¢ªB“ÀNÒ™½¼üñ²1ó"ŒõßÅ6ô§3 ! Qöé0Ã>;Ÿ‘a§xó]Mê¢8¬`Б¥„_çåÄ`ÀM9ç×=R'  Ç`+x™RÚŒ¬J¢Qíh²ÒXdc0A¯àËd ‚gO» ‰ËõrÍšž0ë­xŽa²'oäiÂxxó»ûÄ¥Ön|ø»:ÂW¸@³°Í¹%³cD[‘Ñ>,H@ÓÖÔ,^pu½ñÍ^·z\d1Õÿ„ÒûÙM‰ŽSÇåV=zÏÝä³)ðøä±+žBa´²NÜ€£°YzVð }#Ît6X6O™eGÔfgwö2gùH‹"F<ì7(ŠöqhhjUWݹ@òLïCÔ½@ëÈuq‡lb¦Zº§Q·Ÿ=›º§óÇžhÉ“v^ÜÑìIªòÝ„Œ]l”vÐYçÿ%¥Ù‡{ñš£Äk%&*ÑàGOg“=ЄÛY’× ²ÁÙŠ¨Ç@R™YIÈìùYÑ$Y5pµ€Åä?_gÉŒ²à¯›ìçŸdoŒ€!I7™—:(ùB¥þäm:¾vÍÅ0h@3Ÿ¥j&Ù 8ó1» h.hq1,8÷:ÑŽXÁß.c±~9Ã,à ¹Ó Ö “ßU ¡t&An€²lG–)Ÿa uP–@OggSÀ&õdÓÿ¥ÿ·ÿ²ÿÀÿ¯ÿ–ÿ¯EFGHE\[]ÿ»ÿžËãü€q·ß.ŽûÀޘߜÁäü¹õ|<— |¸=ìÇ‹}›ûžïcá}>ƒHšé$ØÎhM¤˧C‰}ûw`HgÚè$Œ_zs÷—žÐLøy/>÷ϽíE<†¶ÛÏ‹$}6.91Díº¬di)öÀgƒÀ3£á\3·Šh¹ÕÜ©õáÎÜ4 ^¾’@¨Yë@ùZÛ(M›`©ÒÄR$ÐùÆç¥ÀdSÞ9wwð…”nv)•í¦ažö{UWÅ)’i`=¯ºCÐûw¢£¥Ú{ÞîK'uš¨®;í– Ûhª sæx0 D×”…9à]øi"S?—É ‰£& 3€­zÕä— ÈK%P¦ÈÊßË–¦[8+Ãê?'º{ß&UŸ ™0 Ì1äí<änÞb‹=zZø”ItA3;“§Ò/SH,DÕä`©(p$X,GÙú‡3<#g¡" –Ð l@€ (ˆC˜³B32±¬ €– žËÓ=Ñ'(µÜ®/±q€o€/§!ùðÌ£s4û¯3àÖ¾]Ú@~Ð`ë´Äï‰K ¸„•BÑÍþ!˜‡ãß0ïûýb4 9€÷ß>Q6gßè˾|;7‚°æÐ|3tÿ6Nðž2 8c€ã[/;™¨¾t\r)¡òQ@N‚’KOžDºÌ.ÒÐ?6{̵xç¶:àž¥ÿ<]·xôöL­@"ÕðæaûÏu¦®óŠƒ’|Å^¦ó³¼²'ÙH€àúäfýƒÓ@­¯ÇvŸ  kärü`uBC0 »é úóÇ®¿Ð‡^PrüÇ™&\Þ48sw5£0èY{êÔp YFŸ ÐLJ¦FŸÙåt3¡C‡K]íÕÙœ|“uÃM ½;I A@q[œ ûãg4C…Hܬ4$]Õ ëdt0è’?Jpè>EáM’ÆäÊTx›[gk–h ͲªÔPûõÍ`2 €èƒ€Kœn ‚H¸"›'¤‚;(~Ëmæ!š=Œ2ð9ßn½Mâr¦Àz#óÆüÙ™œwâË£œµ\UÁW€ûLÂ÷‚ ûvØ„j0ø}™9C@4œàI$M¤cxtóþíÞÖuö¸kÍìnoG—¿àÛîo±wƒI.à)ç›O›(ã—òúLðÐ^û<1œº}} ÊÍ O¥¤Õ¢¯¯Yȹ B‹àÉbÎás9xŸ!ûQȆJÆ€Èþ÷9ž«=ôòm[z¦!ƒÍVÒÜ¡¢Ñ3À°ºaçLò©³]€òèY Üßµ“‚‚>›EIDhOU}*Lz@[×b~LŠv´ŽUÌñ‘óÒ¸7lîy­ºO›L§=¸Ip(€20<¯Hr”54 c}­Ú6Ïd®‚Ü^¨÷3ÞÑßä!>ÅÖzkeK4 A2WÈù$ubŠ€¾_†ìD‰{ó=Ý=:s K7l ¡{L´a¦û›T6@‡k‚ ˜u,PH8Œb@>دx¢àT†Ç1žËmõYÍ8N›àüº-â[7ð0ísÆÀQâÀöýB·íÄÿ1\Àíô2ß÷= „íL€-61ÀYRÀÓD.*èÙÑw·Qd ߯Ž=ÎïÒÑjâ[]X#Åç0þdØOC”S®Èžrq4WNÕ”Ŭ ä„çÓÐmD*€ú(³-|°J“) Ì‚÷mG ¢*ÈÙ¢93€  ¬Ù …$úÇàÏ’:ÎÁM{²CsQTûÅ£þ DùØ´ýð”3 EjÖÈAôK-MHzŽ*æ$ }šsù^Ü=.‚²»u;;ଵš]Ìhý´•9ÚO^íYŸ'šñ³Ò`P "ÊÝÚr7 ڻسFçNÖÌÖL>ª%8ìÛOÑ[Y¬ÉZ«Á-À@[IÔ™¨îb¶Ë´j ز§I«ÝÌÚze‚fŽëÂ!É4ÌѳwNêOÐ ÖŒèÊŠe’Э»=ÙC=ºiqˆ. Xk3 Êb¤)Sáf­À`,^à' Š…  €ÝHÎpžÛãG´ša€¯–;É{2_ÆNœ<ÌSÆôçŸ}?´¦ôŒÐÉo­„ç§Xà0ðãƒn …¸iÀ²¿¨mëû¢¬M¬Ø0/Ú` ‘Ÿ aNRˆ$8Yýœ[Mr–jmMuíÚ«ò½—ð‘Þ„p4÷½q×CUJ+—îè×ñ*™* ×_)ð@’± /sœG>úmÕvuI|>Yyœ\»ó›ÜmU¡h#ÿ @‘rš{ÇLAQÅ! ÙX1¯¥5´×!d¾+«²²%œ7¾î#>€Â<è`§Úç•pâvïæ>™€ùí#DŒ¯ž2ÌJ5à?Vs¬bqQh¯áóƒ»úGAôœ†"T­çãÀ°j-0M)U–°³ÏLÕJÒ>tÙÎRàð°ÊÖsаҡÈ‚‚›sô"ÕœutŒº’…œ:¤éb*$⥪$аHE ‰k6­ i@¦*€fÃÌ2 àõA²V6€, ¬þ¾p >Ûôµumæ4ˆåŽz; ¬nXÀǧ̑GGRÿE8þØBÄóy 'Ÿ€ Hg cò¹ð³¢²-ÀT&ÙÓ¼¹vùeî…ÍP^S_;x¶¹òý¬ÈÙÙ›Å#“ÃÉ—RrJÀ È@±óüÍ1éÁôÀê¼JÓj"GKFÏÆ†ÖˆN]5Ʋ­û9pQj2Ç2 ¨¼ †sµÒ³áÑ “d­Q/‘õšMÔL˜Ü!U<^¿ jM%Ò Ð†/”FnËd@Ç%FSEÓø-:¤A½ª€Çj’¹ÌŒŸê€‰ ²3¿m H'€Àʺ‚”(ºI)ZQ”pE€=5*‡¡T18 ãJ€z°ß–q—ͯ¹¨Ï£s;†¬á'Ïub?¢QÓQE=mÛˆb{Fk²ëÎsŠþpßÛ¡ÀXO]_.׋ϱØ.H¼Z© M‡Í¼Ço±H²(Ùð†w¢¦ÜÙÞ¶ÐËàú6™©—ËZu1zÍš5J{N""ÕÕ²RUµÁ!¤ç‘ꢺÎÐK‡±»òv|š<ØÖç²Íóð"ôbQ«ie†ü´ o©”2èü{"*bÄZÌZ_ßí¦Y»öPPkK«ÅÓB‰Xô,»<ôº]·_×K¬â¦¨Zxï½¼_ï $ö·Z–ÿ‚oñ;}›® Ç` šjåH ÆTA!þÒ+G ìF²j‘¹ˆÚ?À+ö0}7¾Œ½Œ9;G1jµRb*•2@ɃxÉlŸÙ‹É”v:ó8MœAÿOš§}ý†‡À‡?äïGâGT-7ýXËwxgÈpB]þÖ©Q;ÏÐõœK*ÃDÕÚú\va Õú:HS]’VÂÒÍK ÕŠ”lr7©ØÓzMsq=i‚a'@\)‰fÂ9=ON§ØÄÓQ÷[ £ÓÓž(jŸO’xšÙv“yÁ£r¿8æÐ›37?ÑÎRh\‹Šf¦çqš8Õ1•P›Îé²"ôöÔ ¸To÷ ›V¤ÁÙw]Y à¿ííQ=ïlø˜¥Ã;’D¿N&;f„d’Ĥ¡´pe,Z§ü™kxŠy§¼»ºm~«u0‚‹‡  —«õØ“„ÞºIgtož®lhÅQêð9¬=¬Lù­æ*(§-p&ÑJÿÚÀ¼¬mI¾Ï±n“N5RËä:²ßaÂþ{›¼V¡˜&å2^ƒ$¡TQƒd1¥¨˜NLÆ)qîÔê!>O@ùÜöY­HF\w ÙÄ~L·ª³ÀÖÙÔ€‚nFo˜&T@”r-Ö&‰HÓju&|È$ŽwZ—}1@é`òçSF·DÒ$I*M2ÂYÐè ¸÷°‰VÅV=@†˜˜¬ØºÝ©”ò,Ñ@@aJfjÌ$šÇ ã w,€ôE¥põ>«­"ÍŒ!ÝŒ CÛMÀƒµ?3‚Œ†î”5ÌVܵûù$?ŽjªxHf˜×OÒ„»]˜ž ¦¸˜Eg,âÒK_,HG»÷g`œ€µ ÌqN6ñ®@Šc@òr®„|ݦ .×ÿ¯ZýÞìnlY¯|—ff?PbÏ r‘iÞüQÉ€.mŠ×ŽI‡²]Η‘+ì–Çg-9"õðêɤö'}ÇÖÏg(UWð¤ÛDZ{  viÒ:˜•BÏFÉàMyiïhsB­Kx3†ó=è¯Dc®PA‰ ±Ë«â†B¦ Y‚E$xJO‚6HØ ¦yu4À« *(Ò«³0&ÇC¥þõ]¾«´G}›¹Üg`¢òzv{¢çΘ©,¦âž£¬‡:€¤7B 6Ûš©ÍÙ‡=˜î× /3¶×m  !¥„ŒF—£á†teº=•åívÙ†š›†èðð® õ1v,0H@ÓÁ຦¡¡9a1•\›†@«µEä]I)4y’"€xI×Î|bÐ(YÚjŠŠXªP‹ TÀX—AE[aU‹ˆ­5 µ`l½Ù1€ÅˆM–‚(j'(Ã1 „Xe@+VR~H€)+ `,z)'`H1›m¬ÆZaGTU¸±Úˆ[’ENA–éø¿Zä$?ÊÓ"x×Bô€ =ÃãTYê$<@Y ·-œqÃ¥—àÌdØwŸŸŒ-w”{§oƒ§c$Ü%ãî(mŒ«÷Ìqõ5ÆŸQ½™ ½0¦På)èâ´Š­%€·MïÀc\„1xÀ{ãìñÁ¢,ïCð#kFJ.Ì !D_€*g©ORŒÈX[wìWÖ4’AåÓ‰&w:xÛ‹Þ… y ¹ æ‚áØ¬ù@¤iÙÀ‹}ÈOvÛõ´_Ý!YÇSëõ†§fü6ñ®þ›ÓieuCL¿_‚míÐKSíðh½SjÙ40Œ¶µÎ蜡›ÉÍGlÖ Xz€ÝZ€Â)]6…{ï4Ñ ÅFV93ÖVÞgÆÑ èhÊîýΙ—Íj‚Sà´Ææva sÆ4‰B8yW 0*ƒŽA¼Ärp(“°´+;,$€Û¨Š… tÓ¥¾CdÑ•Â4€fîl `U‡¶*`½Ø€E5ˆu jX¤6`Ù‚L\´EÄèTÀPD­Vžd°´.¢èˆ°FµV- ÂE6p5$­Œª/1`þŠ­²ÏQdY§Ž›«íºU‡Œ†÷æ`?&•g/>ÿÃYƒǵGŒ×“.˘|ÎHSyW¢ `ºq‡V 5m N”Àvë€]^@Ns3 `I.rÂû˜ÜÒ”$>Ï·}OÙ˜Zþ}Ztï~ÿûØ#Gy½šÝY_Œº´€Ç ²9Ö.@®~[“>3¨2­¯Ñç³Uh6-õ! G[ßþÏ#(€V¬Æ¬¾¼7¶¢øBLÜ·‡à3aŽóÞjZŠ@@ÉÅê»È.QrÕïl|Æ#–,2n¥ êdÑ+·¶^›ì¦r Ø€…U4†Ñ˜,Ø#LÑtUE•[š™F“÷v6v´B¯×Œ¤skå9vÖ°53õ(R ë©í`ÝÔ€ # Eo ôª!!1ÄD8Q(ˆЭè °®$Å4ã\0ºREeÝAREÔ¦¬`ÝjÍEÃF«(Ø‹Ñ&€˜’m]D@$¦0­[Œ`T ø€ä¾k=bM2Jéôª‹âÖb;#0;*Ë îYFJ±Î?Ý'±seQ€ÀLå—ÀÝh¡kHxG#QŸ¬½ $$­úŽsàõ!sßÊ€ ¸˜„üŒ$ù•`¬Ðy²o»C*&’ØwMÆ×2®Í ;F ø¼bŸúýýÕï=¾€i>5 ½z)Ì·Ažh%8cÓÎKæõo@ýìé\ Í309G“÷‘j\`’¬9ûôÚòEæwÆðϬÕ0f‚õ3R9:ŸË Ÿßd€ò1çT›ˆÝx³@¢&@[Ú¦ˆÀ3§}£h‰Ÿ+R ÖS»QÚZ}ª%“=,ÞlªàׂøÛ^2dm )!P Ûðç ›zðµ½íÙš€à™¶ €Pµ6’6±`•§£Î"1ýêó©¤öŠÀ[}y ÷2þÝÖx‚µV.ürÂÏp`¹ˆÊô~YD`Š5PuCçÀ0¬'BÕ<5ÝÐô8ÀÓýºãžfÎJ a f@Ñ{<“kKÀÈÊÐ{CS ˆÚÛªvXPT¥6º"C_$в˜¨ë4,µvéQ× @XŸ O(Yh“*TÁÀt V£1`Aƒ :tZcå²ÀEtt¢(™PĈX¬ €Vc°h1@°¯Ö€ €Y@¶DÅhÞùÜÍ>´Š ƒ'QÚê4‚¤ý9½*Êà 'ùËìW;Ælü4ï¾¼ï'–ØC¶[pö¸C àBðžn]ôú-. ïCQe¥>àqÈ;„®5àÄäž^À.0V¿'i@ú­)N' p ýÞç6cšƒKÐ;Å1K¡·\8ïëÜè=vqWmñ úVSH– ²>¿‘Õ¸ÜtSŒÍ1¨'  º½‡ù4ŒcŒàƒ›@2mÇ–€Ü¹"¤79ÑÒlúFó!“zŽõu–ç*O)À„Á®ÿï3d xÈES€­h?ùü¿J6;»÷@““g=&ç 0Cž™Bag@gjh‚Â" ÌÜið_ ORPëó« :u`ŽHÎì„NH7« õäÖ¸«¾Á îs …lbß–_~ò|ü^“%­ôÃ….&<΀˜(Ý$g —}Ð_úÍW oàÞÖ9#Ý€MÀÍ0¤[€3l 09Ó6€ÀW¾å))LÝ¿vûƒ´à®ê_˜Àz^w9€ePÍçê^Á3ÇÖ@)¡z©|2lƒààÿ›ÈPlŠ«½™àõ¾¿¨øQÀRßt<À»CHÁã‘HòÃaHÇ+²j›]¯!@ ×M "Jó“fSÑ4 PŒqÍ+x_™ÉbLµÆÉû@2bÓVV‹B2E4æ ÇØ*ª•胳úL»[ï(Ñ´s•“•Ò¹ÿíÙ±ùšü×÷Ä,hàanƨ ›2Œ­Ú€’jb›P 6ø]AÒŒoÑRP@쉔ß+HJ]ƒ€à4 Öí•룖 H‚BcÐ~ ¢YkzKÓ€ðÆb±A ´€ªÖØX*ÚÚŸN4ˆ¨µ':ÄàZ¬›Šˆ † j‚Žm4 ž‚:Q  c0¢øÉ­A«X@H h¶X%¬5›” zü˜©<·ä2sÚê’³ÿ}§éº/¿Zp2Áý|HX˜YN@ÛÀ=œ¼.½68þ<=€³9¸ šG€‰°rñ³Bt’) `†±ëþ<ÎXäGI Ÿ ì¿âëQç÷ã“7a8¸‹Ô¬TU‹–Ú÷±!Ùó@ùû]ë}ë›;£xrÎÙ‹ÐPÕâ‡AUK€”þÍ„¨~mš€O{ÓǨ]£›“Q¼ˆH¹~ïHKU¶Fè®5ÛçÄã( PJ|z²æpW à½x?ðìk™OVªð1“2FÄÆ–ã#5Ùpù¯Í7‘•Kî<ÖÙG?þpÃÇ>PÆ`Ͼñ+W²Ÿ³I”UòŠ-îÖÖk©jŠaë•LQÝ^ʹûa¾½àþé ô|pJŽŸ{ò”êG´+þ·§·çßz¯ÕfžJZu‚A¦¤ŒJ= ¢AÓm'9t1úâ8…–jN&­Û©Ÿè%ÜÓÓÅ“RwZÅ’ÃJ8µx ã„ãºÑréQF_)R„6 ޲ªÊ"¥üÝ ÓÉpªè̪gCÞ½Šé@ÙÜ(ÚNú,ÛIÇ=]¶»òdêzdM4=DK5ýg® βNN&{O†q!uÂÛ“(+ŠW5†é’ÛrÚVÝ=;óúÀ•k%æš ªHw­{€ÊÓIÛÙÑ03U¶vUMDïÈIÓŠ×>ÿ=Ús­{Žɘ΄d^©@ü«KP¤€5€ÝXu!è4²R¾rif¤yÙðP57,Ƚ6¶p­$9>X£ÕLG­ hd)ˆØ ?_ÐÊnË` €§hõp ×ÀMjØsµ±`¤–4ܾþ­ƒnW«e¡ô>ɼ6ÛÆüªÿùÑ{M {Çåû9á­7Ë_ξó&‘`›ÛÜüh#|ÍL]7X­€CNͽʽïº6›q}¶“nûÿ A[0þÿoÓŽ‡ýOµŸ)EÀ_©æSÖ¤ÑË=€Ï…Y:Å”–‰¶.O”b &ôÐ#Vžžt-m4†*Ð j¥õ3 0ú$3û©*‰v z1ÅÁÎ-Ûƒ~sµ¶†,Zœª®žp',ƒ“OUBHp=ÒK½C$³¹,Ð}÷ƒIh±¶K#–—a¬½³° ™%L± ÓôJáÌÞÍî©Ú•÷Oe ¤£;êéqŸ]¹Î–*rqWr+WÕôäÚ¿pç(˜bÏ‚çdçóKEbŠL(§Ûz›óOÔJžÝRTÌ”¹ÙŸ{³$ÓËT#t^IýôfÐ^Í鬬lF…={ü°ÄX´Â…Q PÂ'°Å%2Tm]€]>—¨„aÈ*Á kØ\³ûé4J‘¤æ’8m(­D[\ , \@É@¿–Ag_»ËTª þÛ­±G6¦Dˆ¯wëÝð@ûÈ“ƒ0Öïþ¾7ø\,ÆÜ·} ŸŒ‘X[35U–$H½ç‰{Õl¦7¾á›°þ  Àö¦2è¼ÙÈQãS›Aµ¿ï"Èq¾vܽï·/Þ½âø†ë+³ºÎWU3¡º‰™>÷€PXP?M¹i«È Ny ÓPíßûHTÁÓU½äœ Àê ,D [²@°´6iØA®~îä¼ÓÐýуº6<Ýy ùΫVõãÅ‹ÒNöª÷ÑBÃ.w@½cë/½fÓ¨âåucÉ;†|ÖÙrCÐ)0È*wØßävC&»6Ý]Þ<ÿ×g@‘£+èmË[(•ôäà,‹SÀv̤7r¢žš“@$|Γ¤.!¯}†f¢‚€4üró¹»þ'y8)²Õn2/¸ú†ö®·§¨a8TÐPCefígCâg’aЉ¾{zbæ“g«ì†èO‹)l24%2¨±~ü` @3dH çÀ+Qr• 4ð-a1HÙ4AA ¤¡àX–Jêaâª>¼ôp@ÓlV¢9!˜ ¾7&Ûk ×^ÿøÛÈÀ[òN#×;w\ýN  ð:q @/Ùï€d»ž³ÎðcŽê°Ê2[H ¼ïä}Hb‡1æØ%åÈyj:¨sšN°-I­ÆÒ\¡àþÇúD(‚W‘¶WÈN¼Ü?¨çÁ2 Åé£L‚MÔߌ§d VçÍ@ðd,{2¡õlnSisÉed û Lg¢ªw-ŽŽhét‡ÝKöJÈ@M"»:θMª¡K5‚TôiÈ8%ê ‹¬JF:Ÿ²uɽ¥DÊU»I7Èò'Ð00v@)Õè˜wCQ yÔ'ˆÇ =-~f  u<íÉ`~ITÝÑþˆZ]µ^bŸvI̾;+ @f5›LÒB ‰Š ES¬ßçÕÕ¦Ü2ÑÇ"7‚\{¯é4õLj¨©q 6‹ŒŸÏ8h¶öü8ÐA‘CMã-ˆ  ŽÞ_ Œ°à&ŒÀÐþË“«&/| · e, @0^ÛdLY ,Ì3§âPžËõú’Ð%ôÀo7¹=Î~m1‡ùî¿;ŠNþdëÔ@œS‰–4 Î`¼ˆ`öÔ:”¬kÛY‘Î΀ 0Çesµû\,s§¿ç_ »ú•ÂË-OÎsŸncŸxв関Ÿzµ¢ôn€W##V´:dòiÖÀC¦×e ^ÜúÒö…Q¶÷–íôLÖä{Tüñ¨\<:ïÙͪ-hH}©¢Ä @}¼$Úƒ†@ºZª:u¼—¤ªPë¡_W˜P]†Ïº;€³^YmwAz{µy›£hB'ôŠ[T} CÍai9Šééî¨eÚ³ ¦3NHš‚ݎï¾HPT€äNhI«Êý… ìýöÚCâ$}Õ›]÷¦'‹h:†Æ †rÁL-Î]=Ù &€¦§ò]¢“yô@‹¢kJYSÄ›IhvÕœõ|ê:¦ã˜$t¬''&(öÝ964ñmØT%XŠcÙÀHˆÀ 8ì°`SMI# z9`AŠÊ€Á’☴ ž@‹€(Ìb‹^ŸŠ€°IõƘß+P'(þÊ•ø’LdµK‰m$Á uœw{ ¼{îîoïöØeÂÀk\èˆã ÿ öåK$ŸŒO ?ýcŽ|] ®d ˜ÀÜ쮇ëŠ}^?üá£ó]ug?½O½„œGe¸[§ö-Uäþÿí öDG(2o~¶P| »'H ÙØ ‚Ü‹h)¼Ï8žVÇWÖkÕszv)€H3³kcT(RÀ^uâCý›—)+y)ó(€éÙöϰPDíCÏþbK7²à¥ lÖ¬)k©ùX7¡”™ “f``‰¾ иQWd‹’`Ì @FgÝ=4“He©H*A1=iÿ8h# Qž¨boÈØ=Së ˜€ÀÕý€RÉâ` $€ ‡ŸNŽÒ dã o 1>ÉÒÙlÐCU; 2#´ÉäD±MOÃݹr:gbº¼'éh¦uê8›]Lh»/…è<É$P0ò‚p$_£mxTTÜP-8eX€(€[]WQ-B ²®KJÒÝh`Ä OggS@o&‘Þùøÿ¶ÿÁÿ¡ÿ¥ÿ“LGJHJFXSUXXVR`[[ÿ²ÿ^ËMø–â ´Û­ìçÝ@í;Ù€ä emÆ´‚ CÇ“ÆÌ À‚à³Óì8Ÿ€ôô‰®ÌiâðÓ„vá$Œ“ŹԂ@[P¡Heh Ù#sXÄ£Œ}!öLèè dð Ø¯µ: ’€Z5EÓ€¬…ñ¥Yà ˜¤üÀÑ"õrê‚”oà^÷µÞ€å=¬Ó 0 c@ŸG: ‹Þ AšÔ‡ap™¡[ÿ%‹‹Ô»Â¢cÔõÊB"0£íŽ Èô„†H†)´Î Ý»³Ý–U$;M7Ì™Í@삞0*½Eá$òV5'm6Жê\„œ%„…5rCªŒ@Î)ˆ(rN(”¼ã\¨0°È°ŠÚœ¬*¶P. D°@^Ëñ6‚‰¢>¼µÜ*.q €£N䡱ÆÑwþdú‘ûFk¿n5ð0òO#x?¿3wÇS à@ î@ƒµœñ&øâW?ñX8SKŒÍîe›1ÆŽ|*¢à$RYUé·Ðæ„è¸{Jß wŸ•?ØÏHÀ¹æ©МCxþyIÈ:üàœÙÈp—‹|ã¤HÀã´½Ù‡€é}á@„Í|ój[ *us”$È@©7„_È„Pس¾,BÎR7‡mT'ä±M6!µ’h§¾w'ïa%Dp¨À.ùý¿[¾Cw_ŸPC-áWšQç.‰$ã*à{B áxw2÷1¡J'ÐŒµ™Ð vܸúw(¡^UNÅ’²yɆ c‹•VC¥ M#Öm›s“”ÓE‘S©À8œ‡u©îîf a‰JR P$ÑÜ^Ã1êeƒ ºW DF5 •Ñ ɨ‚@qrº”Lým Ê€®°ljA¦®dw¯P†€k` P(¬À­€€*ÀšÕ‚€`Ð`>Ûæâ š˜Íy0K¡`?€x.ÞÔûü@ó à› ¼^´(«šÖëÀx‹ÜÞýô_q¢>Éó¨×µb´g¢à|0ˆ+89/l~Ô;©~Ì«ÐÁþê šÁ}qC×!¥êh¶æ~fO¤Ó›n÷³«L€ÕÎÈÝ•â̇<–<@&t9žõÁ1ò~³¢î<¥Mp¥)½cŸ¿#6­alÒ NÏ>³!÷æÆÛ>tâš{§x¤sê,d׿¢7»9XXyUBƒþ?;J3ß(”°{Œþ¡ÃSÃDV“,”ˆ_ï¿”ŒÿSY½N%ëu“95A!K[¯4@¸^À€îPTúì& C÷çº º)f_ªï_,)è@×J÷„DD43Á#Áe¦T¡Â¸cL[Ù÷vFÕÙš ®ØY¥Ì` åÓ=èi ¶ÁÍ:ôÜ@£5ˆ¦™@A‘¦` Á9€èæ0F+@^0è ôM o ~Ëmø–à`0‡Ôp‹­îÁ¢‚$ø O-2¹œ¿ö÷ÃëßÄKì7ûÀà s_ßù—HÑ\iS/›ÏvšŸ œÛÍ<€H\(@Ø7Š–õøùwÈ9Ø{» ¤ª»ÒæP(¾ÀsO5wåsIÝR-< ˜oãÄÁ( Ë(ç.xТß÷øÚž¡¶ñq”pÿ¶Ÿ7UõÖÊtŠAV²E3lä:ËÊž.:âêÇ 7ôy¿çõ~’M¾ð÷E<~oí{ ´b/ƒ€aõÔMó0àvK÷ý˸œÕCÙôþÎ@ÓÝÀÚú !Ìh´Ì•õð¾U¸6C ò3…8ÝL6JI + _¥Ö[ÚñE2døíŽ‚¥˜‰S™Mz + Š¡a”sÌÀ¥™|Y‘ã™±h˜ˆ˜L¹ÀIðžšžaP<Ö‚8Ôª¯x €GD©€¨èPVÊÕìšd/šÒƒO,×À¹AÊàÀ#Kðº,¤(?™W 8œµ¯ë–Ì 5š™ \ÐÌ€î­ù5»˜¬›KŸ®õÙ¿[¼÷ ä]æû]>z2ÃIs¸¡¡@¥d5!€iˆWlÌiFŠ=†ÙœGaÉøÞö·=Ñ÷Ï®~?ë >zЭ57˜ãÀöGìºÁÓ|šèfTùFc{au';¸š[Íö¯™t›c ®sABFÂð:=[¦4‡G/ÊH] òÞ +Cl¶–ÛÛ<’|ÐnÕþê3ÿOÚ»o‰ÝÁ"%"¯¶wpc•êääuª%™ZyÊø`*AÔ¢ê™<`ààT¥6Â(±gc0 ‰VÆ‘Fâg«Ù ‘’²¢—¤ ¨H b€ôÜÝ H¦¤È5 W‘EÛgÉXFÄŠ1¸$w¢L¨¢\$ó±¶ÜZè ®J @ €â84€1–y€"òb´,GÁ …£HŒJµ»RTZKŠöÀŒ­ÊÕn—¤<©‹Á%€xIÐ:Ó·“N©Ã ªÎ–s×ß! bü|š†óD(º/5î´†Q*&Ñol Ürá¥ÞÔö¶½Zò`× Ëûä/ÕÃXa €;È÷9J­f‹¿Þ褠gµE!bIÐÿ¥ÜX $Smˆ¥ì{eo… ¼ZÑ'#FÔO®V«Sê& ’äÀ©nû¹×ùN¦€iÑe.Öd;òîX2d:œõÄÌÚ’£ó»ŒèÈähª˜*ÃnT¦³¼^‘=ÝàçÏy™:Õ=¤pÁò¾åÿMö‹5,”$ o“¨×BªÙ+*ªdç§&ЇMNÿ';TIà< 6*»@½“„>=‡Ö ÷gà§UánO–À2Ðß:Ü;óô™~·:¡fá%ı«OÆMܬþÇÙ‘Ë$¢»*0€B>ÚjÂâ7ÌnÁ¡¡ôþË›/—Ë…O¢ß°ùŽá¨@×gÖ5±}›>(uÆôæãÊε9AIí(WÈÎÃ\ÛU5\ˉÃñ,{×Eœ^éÕžPå_vœÿè•:”Á%n8Ïh«È8}ðöý:nöìkU_¶??5ú±½rø*‹k è‘ -•î[—`Ý JEºP,ŒHcB°P± Œ þ ¹ÔryŨ¤]Òæ‚0«Utx D™œ¶;ÖÅýî©& sô…5¬mž¿*⋜?keñaå°– R`ÕTaÕ¡U§_H@¸JhÑ ú]E|-Ðw”n5ìx¯†‚Ø×+I†Qüál;þêêQïçTj“àÜÃÒë™0XÖe~Å“)´…;µ:HÉMd$cˆYa —0p‡²@Âe•,CV«Dȶ¢ÄvÕâ «‰e3›•›2XÔ?l^€nQ×`Õ{£f:QéöÊ=ßwxMCš¨±›Ÿ%Á޳¬Q¤x)ÜÜÄeÂXP ÂòáîY¨¼jÙ© þ~Š\ý®RÑ»¡é_ÍÏ7>ó³ Õ"€;Õ 3µý’çÃùUmµ7KÙfݵ@Â+èu§o½ñ´ÞP¢Ð¢<ÅE< TQjWDÉ£r%ÊêWy‹žŠ~±ms²1_‹Z‹´ÇM Ý–tr62zd1  =•2™#ÃÜjÝÝØ² óÜ«»a³ÀaºÏ>åbä[ `vˆ×:ZîëõåÒŸÅ®ÍZé×r¹•І¼ˆRÔ苪 *“K‹ AIHQ ß·‘nŠ©•Ê¢¼^‰Nk–0·±^¥0›²œ†ÁC€ÁZEa0_±i~žÅ¢|Ò\-±uûGózQÄŸÇãòù¾îZ²ó3;Ý,&ûÚ“R닢˱Š&ˆdºHÛ„øXUÄá®S)TUé»8‰ìRq†P!3LåÁ~¨àyá øµO¿^$ËÍå Ê2UMm[ŸÖÌ[ÕTR×Ö>sOíývÑ"¶ÃPçÅõ½Ì2 ‰.…„[i/GíJäL [I0É, ‘ô^©*Pœ¸¿WêVsѼ[%º/ö~zª¦*½ïPׇeçJ\(©Àã5ã0R\Øš.ë=EU ®-µöÿòعûTs¬/ñº!zi},AÚëeb„æ;ªaºÛ. ¼Ý``˜öPÛÚ!2ö•ˆw/z¼Y{õ/»ÕFÂ6ŒÑŽÚ¨¨mEZ©TÝD?A"ÓNYoÊœ»¾ýq[·í|ÖJQÛ8÷,>öæz¿¥ ¬ìŸ b»‰ù³6CLwšÕÌÉi5žÛ®?ó¢;Œj˜eU»…ª0UG‹R D¢è £Î§¶s£MÒéY–SuU09p·[×3Ѻ8‘!%4 éèLªî¸ç«PñâTR¸`–‘ëœ?gd©N*ã¢æSævo¨¤¬X0Jzȯ˜±Ð™× $EÅ4”Mo6\ä߸¬gܼ‘G´ ÝÐZpÑ/ÊeDßD¥MBf0³ÄO>9ò‰O"i°æªü–FIŒû™h4E÷RÚ@ó½Û5kš;ŸX èá•ð\±ʤ“E¦Öw.›ö鵦kÑìÖhO,¯€ür1?tlù6§h¶c&VUY¥‚à¤Mt¯WõzÛä×ÿç/Óo®vN*‡Ygg9ñ“ä}R¯é˜1¼B,m‘‘êù(ß^ç0«Mœú0'ukD¯ÛÐ$:¨­öÚ‘N‘VàZëk™2–&#K}%pꎎTL Pô@JÒñnå#Ù*êE&¡­oS $RÆ ¸úðªþ’MÎï@>瀅é†<%8¬/…E2A¢PFÌe ³¸Øu˜%9ÙóÍfS'ajazr$i­’;ÛþoZJ¦'ÃÌ“E˜Ü›ÍœÒÐ[Ù@“½ó‡(£Üço) Hf8/ªUAw2ªsµ“P E‹ÈdÑ™™vÓõ﹩9ÇoÍy;n4M2 Q2ôôÖÀ†±/Í…-,(0£IX J97 :@â4 ·¯Ý¡e>i@¡X‚is\Oñ@¯Ù¡cŠj²qœªå½ à 0Êž‹áSCÓ5ÜÄ9ÆÒï¢ewsöR ª${’u;€iË×Õ„Ò´Ü=9+ HŒ'iËùZªÌ ¢®yèk ÞK= a6çFd#–¯Èž ªsöX@ÿ%™œžf6uÇkOÚ MCèÔ  /nC®²÷£‹m%0:‘¦[©’Cʇ¨P@‘ršôZŒŽŒ¤˜Nº»]Ú%L1b)_aTuÀP^CèËvÖT3½(QX–ã]dB'àÛm]˜¬ÙD­Ò p¹ó¾Žûí@ë¼àfDíŒX ~ÕÛ.§¡ƒâpÉpBœ@7ÂÙ€CœP•'a µVŽ ƒ #$-Mé¡"é"YawkxK „‘€%€À". Œ„F•Š')‹9<<Ž^«õlŠÅÀSíדsÅ‚˜~ý{ÑS²¿ngi¬ÿØ—"ïG¸*Pº0¬³Vf[ø¼Ùˆv¸¾®ÕedB‰Ž5¦>³™U—ì1íïÏXïÞýxÇœöß'«A¥±|3}Hãr)¶DËÖ‡œ‡G—ýå9 ”¼¬õý4þñFBeœô͵6}ªXýö:¾ºÈÂ1¾uÝ4„‹Å„”ÒÍAV²êÚ,L4ÇF‚rN}ªÈlŠ›â\BZ*×uåAGÖ ;;hI½(O@“ÎÑzgJ30çãs»î÷?Ï$Ø ðBÒà–'ЏïR2uj iÚDyûžý]Eø™FÐC¢¥pŠ' ¥FM°&QAk—³^-@îl=ÅÄbÓD}n6[E©@JÑPhÄt³F!“)ø 7>-h&” @SÅcÙIcŸzln‰»«¤^ªa? xžö½f(Í0欇妡Öeèz—ÌT”7,ï¨ã—£gÒíz¾ãI„‰r äãüÄíëê%¿œñ))ꨚÉ|JwÓ‰pJÉ,õ¥#Ùulõ;Ý™w°ÝWËÉ"áîúœ’û]µSçã1tÝ—ÝÔù|7ÓÛ;h¡2M €%¤á÷@$Y´$Z]År[˹#~ÞüÞ}hñ9‡¬¹¯༇ìS==íοdñŸt>%êJÇ÷³ê×ï˜úòÿ'óxúd’½;O}ZŸ¬îtu2Åš@õ48… ú™C+áÏ‚ãæ&›ŽÈ \y/WÿsÈëã=÷TO'ÌžêaXª9™ÕoðódgÑLL‰4Aç£#:û.Œ*çEè9ð:öòj²W}ÅÇèÞzDÎû0É €‚´@p‰˜Å ²ðÜ¢_…_D.ÙkË Â7^g³Cj@À3?`ƒÁR0&?C`“Âúø{ÉËDnü×Í`PÊ–ÈžK¯])‚Ôï¹ÊÈ`Ã8’-IÞ»]|„âFF]n·ˆ3~ î`°ÏC|Îç·|ø'»¼ÒA\³Bꯕ4õINEp…÷[´Þš)Kn@€^r¬X' V#äúÕ׳£Ù[††„5o}å{ûgðM~ö?tÞ³*‡ÖíѾWѸ-™¾šŽ‰õr‚v  Æ˜Ê'¤ù ÈG-F „¶™çýõ/`›ìrÛo™‘ìT3V Hÿ³zhý¡2Û•š<¨ÕÞÖ%ªÆÂr,rë ·SP€Ï¶É…xëe»éãô›IAr5ÐÓªx¦HS¦ŽþJsqwŽŠrGÙoV½.섵ý97µsŸ9ÿÎʦȦ4 ƒúsøÒýtMf¦WÈñàzêa ý)z 048÷ áçýùͯ&ÃÐd³Iö™]ÿTåÃ8€V†`2à«<”Áô» Íûóöi»i`:÷ Þ{ΦhS0ê¯>ý·À­M HT¥°ä³À * D’… Ñnä·H 6?MÕ$æ›` ðf€²ü2ÆçsØùq»½Â à0BÀ@LJI!"üXÀƒ¿;N0ÞË]\ ΀ ¯¶[iM€ ˜ÿÐG©|Þêë+Àt”ŸðÛ¶¼m›´¦JkÝP& ôIzìÌ£é´íûà=l¨õer)½Òú<>ØÈIOè€Bé»n‚8áÐ!;˰k¾àãÓ3©J›_ca–·zYæù4 žÖÊÓ,ÞÑñwž •È¡‘²ü®j=íAα€|Ó¡ÄŒöŠ(zæØ?ìmÏ EDf7Úa(tOÒ2.(oékFƒ—LØ,†ÛJf ª:43[¶H"5uƒá’3òµô°Ü³Yvµk|V[¨„fe’JÚ™tžªzô$]U;ÏÞ ™ÉýÿE2”H¦†gªe¦‡1MeíÚõ?pþ•ÍUÓÓ“CõV\îÏxú3D÷t¶‹Hš¢ùü0®°Ò›×ÇåÔÎLW$3•¬³`ýìóÂ7‹iÚ0EŽïûGuu<žìÑ`z?À/ÎÕV—NäL¾ÇXßBáÚä{ˆ¤„ü2Ô5a¸ËßµõàØ¼$&#øÁàÄðBCA©¸H:ÿB ·9»°x6'K(ŒÈ¤mb(®¾«üÂ`ÊívÓC Xñ€LFöïßwï»ò‹/5Y]°À\ÒTà ¼Æedú¶µ)ª†)­’ÐVþÉ9úkrí{Ú_i† ‹aý_jÕ—©¯B߸FTÂè´ …ìsÉÞ>òB¹.Í+ã^¤$«¼÷ž67›ƒÓ§¡€VGŽÐù]tFån3 +ûè+: TÄÈF×, %£Åß{5eô«ŒÎè--zKçL–׎uuIlóŸ™U™5-;øö¸F)jXóþ5/ÓÝu¹¦ò¤FS“tOx2 g'‹ŠLýš2½)½s’>wGV‘‘DWÉzÄÖ%©&iöm›î$È;kºrMúqÎ${Îô ¶`áL¹Ôç* æ‡Iì Ö€É*å@ |{5sÖ”»ÍJt'©„‰ ³W27\¶lîâñ·¼$û¤ÔAÝÉ¿ÅRÿ`ï ²ÿí0äqwÏÁŸçü6€qì*(®k¿ë\´!^@{¶äößX žÝ ^` ŒiJWó…^ä¾Û·™–X$âTÊ'JŒ¨sH”.ÞÚí` :AÆf½É­aNà`ðô,¼.5a|sF1𩹭—¦å~XÛÖ(*ˆeùhtäçÛ´9Që¯úÞgJ­¿vèaŸ¹XÌ:¯%üäü‘°ê4NªfÅg²w-èž'o-vðË~qÛ}óôLO3êœý^Ÿ1íñ~€å­›Å¾½Ú5¢dÐY¿?f¬@л®S]]›ÓZÛÙ—ÅÄÌî/Gw&8Tôë¡OöÅ™§®ž§ö—$šŸX™½ª—iEGëáëÙ˜Ìù·_6‘›‡ ù#;éÙâojÕ™w‡4™YÑ1Í‘¡˜ý®G¥º’åÙØ”z輩Ä93Õž€H:[¿î ØŒÂå_0YÈ2tؘ¿x9ãæ@O÷hëd–ö 4ÚBÕ»ò›ðÿq` :©›|èÚUä7ù÷ü”º8sUvemFÕOô»«A­3ì“4'àÕ-a"–6ªD÷Ï_às›1çÕ$|')ãáÆ û,…FA e¨Ý(¾%ሠ«Æ ¾Û]ݸ@®wòkhø8hPzÏw±Œß¶fÚ .àj@ãÆ€)¶±¢ZV3¥(R 0³çïɈe_~˜YÑÏÆZ3ã‰áõcž‰º ¹=¬E}i­Œ ªkc…’ÅO”n‘ÞCpsîÞ‡íyÊnˆÄöùXŽÛÈøŽ–sB1VsICd?ÿýÄûÑEé·eDèIòÏúîìàAëlX!¶‰NÇ‘âú7’€’¦È\(–öOŸOCãAH2MK&´ˆLïYBÀlDOOózSlêúWA¡Å4 ±CA%P‚Ãú‰fšÈŒ2Šœìꄌ'ÈfÛÌ|o9IG¢o,ôÀ°W œòì^×Ê30 ÉÝî`l˜ •'€ d$%óïçnßöÔÔL2: “û'ãÜÝ3EöšE»ýå2Õïc¦÷©ÎÝ5%:ßù‡a÷}|,±¬ÁP&+_Ë3Ä¿1ñ/m®xÙ.Ä’ð>L•ŒQ q€œ6@¢~ÛÜ5Ô$àµ[Å%ÄÒ‚NRÁû ßÌUÆñ¬á)€½êû¶¾¨tÂy’µ^*KаHnfwìÏ⬄kýîò?pÅAİÖôï·ó+£ Ïk…ævÕ,›¤~AIÞ8èù¼­kÍáK_]»a°þ“•ÇW-b¾9Mʰí¡AÂDRœÖž/¥Ç¶¸Ã(3‹‚î_íÈ#o¢qn±8kÈÙ&ÙÄOôtšüÜbã “Ð:@§aôé©ÁÙÐè¢OcyÀwwº…’ðð’DóùYRTŠ˜bWÈöTË92¤05yàRÜŒ#öŽRUfŸ íˆÌnC Šl¯ô@éä• (Ü\Öƒlv˜ÿoö³ð¨çteâwŠfûDI6`€¤†jê_ï¡§ÆTº½[Äÿ\mSˆ•CÒÐL¥ç‡=…ó½‰ý…«&³ «¹¼ÿwi@Žáצ0š·²@óÉhÃмk¤±A ­#‡@ž< ~ÛÌ=´ ðÖvGy Õ€Îßmðçë0Ï4»ì¬ÚÄ9@GrátLÄ‹êŠfÈ…÷|F-LÙ$I€ Ð^7·øa Cq,ÅýÚmã÷[Ø6…šS:Ô;f€hÊç3½TÑøØ$õ[‡ÜýM¶@VBöãWß ¥\®³´B$ôïÜÿø™![«(Yts)ëÌô×ïwÞðêÐcÎñ6•Ä¢å9ñrm“%DNl¯nzk}#a¦ÿ]­­Ð@2°'ÆY"Ú…¯÷ö3‚&?ÿ : ÊŽ(ª?w—+4ãRÞúh$=S½€*2„Ð@yt‘ÉP¦r°·n@Lެ˜èò5†V;(IçʃHf“Œ91,äˆô“øCNNìsx¼]€ÊbYЍè¦Êîñ‚Ͷ“ gÆÐ•@§™ËSÕp>ç‚qé­ÙfjXX’R‰Úõ~ÿ’¬+¡Ã_á PQöXÛ@Á\ %žhPOggSÀÞ&iëKéÿ‹ÿŒLL[gmÿÔVXiWTV]bYfÿ»ÿœÿÑÿ^Ëã+´LðÆv;}Äc)C ×@|ZÊ ÜÅ<Çë¾8¶óEÈó28_c?ŸW¹]¾#9iî¡af”dAÂpA(ƒ¡¿uãxüYå_ø’÷þ+¿vÊ«Ô -|¯7Çè¼\U¡Í„®%øêÓ›YWjÕ~ gèm{Ù^F;I²‡9¯ òì~ôðöOD¿_dýáåªñô:Hžx݈>ôtU÷E3K°”÷´ÐOÙŽÞéLI}‡yƒ½Ùw4 Dx|Zw;UHLspg÷þº‘ÂS p„ŽdÌ*¥‡þo §T#7äqâµÇ™eÌZ™Iщ:+£ÐÍŒ»QÌ@u‰ísùtEì`»ÛY*ÞJC{'#gŠ·„ÓtQÍh(†k›©¯Y™8ÅsŠcÌeõãÚß'SgzC¶“µtv[Öñ¹¶"e6ú=cš=‚i _·‰HQÐÞ) ™h€wM¢lpìQó;“‘8!z"ï¶ÊMþ!pÀ{Ê5ò]ÒZ78ý柹c’kÿ"®nyõxµ7Åó)?b»´ŸìÉÔPÕ†¹¤@¹r\oŒ;£¿0²šŒ/;ôíó·ƒ'Gý³IGÛf‰…(N›5³²ý-Yzmöã@‡'Z<×WÙvŽýiÜkæ‘€—?èAß{-¿lÔtƒgm^ã »ä±tˆùâRõ¥Ön&ƒ‚f öþ¡‡yÓ‚W’¹<•)p÷äže뚺jlÚ­Z§èZ€#sø>fÚL3ˆ@rðèµg¨VÕé©ÙVT Æ Oí­€ÎVtÕÓá…‚wôZ;©rÀv³m]*˜ëd]C)!Å,4€ƒ'Ù몂XëÎ4L{gÑõ^Ü1Äø¶<­Y~²ãÚö¡Œ/ÀV<(™`–ñêKSH¹Zó˜ôç§§¹9µ¾)´›ºwæ.RÙw¥‚¯Ç2?†& (EÅquŸ’Ÿ¿éSqŒ´è’ƒæ¼vÙ B:Ç¢xî5ßѰ«!ÿJã„/@káþV ðÔ8`ü÷é5Cï c3Ö(\ ö2þ£¶uŽóO’L•”W Õ‡í´=üÿõ/‹H{u»õìÑ'å×6ô¯<Ñ—ÖKÏ=lË»6$Ì^í^¢z~º?Kãä¯[òldzZÓã%ìôÒ>ÏFÔ¯Ãó¤ƒþ> P¥‹‹Ïv˧|–(À‰/›:\{W–Ñ/Ú0]ÿÊ••öú\A÷áùåo=q–Ï¿®®'#È-¿f§ ðúãÒäüW»­z fðŸf{ëÀ ÔBæ@Ü0Ð6V¿÷à/_®|œiÔqž^°Uä4€úÆ Î÷ç!R¥S_:„B"NÀáB|,9iûݪŽ¿û¾Œ¿:7 'Æé¸ø¥/‹š~¼‹ ê‹.´( 9wjšþ—¬÷Š}^BV&yk]§!̾ÕdÛT:ÍUŽxögU@VØý7î¢üªê̤7?ô¶ò; ùû›7xFâ^›cëÍKž¢¾ÔöÇã’þý¾óf™Ì‰½dˆŠ §b$O¶ÞÀÙóÝú7ÉLCj°ÖdH ˜a×`"ÚU.Ou8w\Àã9R·ö“€PU ­}¨9,éî¶8§¬{{a¨Ý*4ñ3~{kSñ£FçÆ-vRlZcvÃ0\3tü3g ª]CBe€KT™óŸwÏN#’ ¡™þ“…zú-ÍÌÅ@“oB¿â}urŸ7-݇‡¡ËÖY®{)…ˆ4ïàðœ+6÷¯8Çûá oÐpŸ÷•Ðr]‘âµ ƒ{0VaO†sín»1b5`iUIPƒë×o4äaÓ<Ñú9–WµR΢­œ7½ ”‚RIÌù•kÞKø¬ÂS§èêuš5ä¸ÊÊA„^3|"ø×&¦äÏ/t~:¼N9³#É.ÈnìÓZC·Œ!§ÿ[^IàÎÓ7y<íÓo*÷¼úwÿŽw÷ºÚšå©¶˜ðYªÊËÊõ½Ó¯düñÒ×PGß>3¤¯<†ÒÕÂæqð?"Ôú¯Û\ôó´€'ô^i uÖîR1VÂ@cFHÎz¢}uw6{ H¿ÝǼº(cdL¸XRÖ®X&­Kß]ïÃ;¯ÚeÒãHMÁB’i-ëDˆ-Â4C®”S<—¯ÖX ÔNõÆàA>?#§O¯õLbOÒîÏöîì®GÎ+üéW ùDõJê~ZåTÎè\ë´ƒ»ú×ã(êÛ<ÿÜ0x=›ÝÊÜÛë¹O?Þ|ù½}-a™£uüµ½Ú &Ú¡´úº?ž1?ښ值±‡ÿuÊ „‚¤‡ï×ZY8t90PÉʺæ4/’¢Y6~!BÄÿ`¨mjz’ºï·‡3“S§—x]è„vf¹Åhê}†^Õéî;GVû)ÉØ&³šq’‘—úˤIÈ“î…B‡2dHÞìéÄ’SvzÇË8é+†œÊ8³çÓ=VMS  èðͺ¡E¡{j ª|*iXÛ³ñ´ÊS+mÔFF6@ ˆÕÏîÏQØ BYx È@Y&Ž‘%#¶0t BçP«`„¯@F üÁÀóêmûlVQaôÛC¸0<ª…Fkà ¤¿H¥M‚I¾»5Ò‡v¡BÜuÔƒÔCƒÎB÷F~ZÆq¶[ÕVÅø °ÅÞm®móÚÐŒ¦X¦pÐ!z]Njß´4Ú»äëíÂ*‡A¦íÚæéCoá|ðm¡övš%šGF SQøüž›íÌœO‘n»yš¦“ÈpŽUa! H2+­èR-ÃÄl}+×W6¯Â(O§rG‹Œ2B«öÕ3TsWRBQX=ÎãÛ¤ž¯¬]~ÝK˜£-3ж¾‚之»Ô­Ùä¬N´VÖ®†ruQ(‘3ÄdGé¨ÈU¢@xÖˆI&©é¨Šœ†ÄR]CCžq)ºqw…›Ì 4±É;':ÜzuU«ÙnÜ´ˆG£Iµ® Š¢,ÙÓ/†B£†y›–VÃÛS ›“ƒ$BîC©WH÷DÓrBÑ©%.sWÞ¶ØÚP,ж7ºÊzö‚%1¤2N£44h|XcD "2€''Ϋ·!`Œœ±\¢K »&0/0’c Z@s€‹¾Ûõ4Að*t·[ƒ8:èÞ(OÕsÇÞòÚe ƒ¯Oå–õ!ÉiñWàÏô·½yz3ïÈå§ëÍØ€·/äZ§×õ7íѺ2Š[©ÙÜ6ú7ûXÃy{-_/èP$ó*žœªÑÉâú¡¦ºÒŸ¹ù˜ê˜ÉNñƒ êy¥wÅŸ¼}z³YßTÔ›_Ô“›syû’t5 äq¢ùÚÛLWwÖ>P·³MÇ»ÓØõÌÀêäÌì§´¶÷”êÉ"gÖÅÄ‘,ÛË÷dʤ”º¦w÷(БЀËñéÏ¢ÅkB¤¢É¾§3ˆŒA-Ͼ¾±He›Á££½pCý,ÛåÎ2‚}×UÅе«! iÊÆ9çÆŠ„¡ÕEœ=Åz‚r‘MA¶r­F3¥Œ˜ˆhò˜"S¯]·§tD tþžîZN)Mgr ¡³jˆަ{¨sÃ5Q/”ÀÑlGYç«Zé„é,@*uéuœ«'cjÁ:ê34,H[O(Ry`ŒÖ˜F0‚9é@@$ „@`@,cb€µðЩ6‘…Ì"'´À‚h…Ç ë-îþË-²E@†?8Û´ÕdÆÔðÞØOeþ{­uJz‹¼öÿžýÐD$Úpné-É;ˬC 8ã†ËHüÜl®ëlënŽÄÜPòšÍüóܽÇ!5~î8ÿ³ryßn×ïºæ¸wå^cþÒ2Mï˜?|ÉâO~.siÈÇ…!Û›"< >+:¬m¥Ÿ<™¥"…‘hîhµýn´)øÕºX3„vÅQ¡%dÈ®{?¼ßðNš”ÃÌ,0,' d‘6t1¨îOÐSP†«y¶ð`Ab˱ºC„‡«F—k5tù…â Fu’ùLͲçZ†²µ];ÑÈ4€5Œ¶bØ)‘OggS€&@^µ4ÞÿäÿîÿÿÿÿÿåÿÝÿéEFHGHF™T¶3ÊÄ¢-É"@²Ã8Mg¶§@Ћ«4¤²úB˜³Ž´ê { Ì!Ë;Úl=“U¢Hbä˜P]Y™KÏWf%(’”[@3D"fÖA’äeÑ (&Íñš(ŠtÌ”ðÍP‚w@ª€daªô“àê­*•itéÕ¥ÔÛÈ(%`ÀŽ`$Ö$08±âA±`^°ÀÈ Z ­¬²bP" ˜Š†R—Xà³L(@XprìÙ‰&SÀº*œÂÌ­²§©€¼ßl“Êüè ÷FyÌÎ\­k¯¢ßáÀ¨/Äëø˜@m«°ÝYˆLÎ@ËmÀôÑÃä¥{€}O÷«ÈŸ±åyÊætfÇÉí9Ñ}¸Ï­õŸ«yÙæ Ýx¨¦ÏÝ–/HPõÁ&(mž,ÿ?¶'„ìõ–×ýÏUd"дé$3¤Îp­7¹(Er,²B°Ù€\¨Vƒ;H!c‰kD4Ÿö J Þ"ò|ÿpÙÀ…ÀÐ1ñ ” (ñ) â»Ê½¥í¿ÜóÂ@%÷啟'zðhEª(é*·Lsˆ³sr€ië™^áxÊF»ÛrPõL PÕŽ®ÍhuÐj 4dˆÆX'õ–då\€”bÍ«‚C‡4íX½Ö5é¤8e‚€f§g&(Q˜ž&}âxÃã€MY?gˆd„iº £ Š_Dè FT…»P‹´ʈ¡ÇË»ºìË·b%óÒӘɄÃh« 0Ð €M“}’&–Ù-TÀÈ:E”ÅØPDÁ2 A%3Á€"wƒ\æ @E°ª‰È ÀÚ `&Éœw mÐ")‹Ñ¢ €õ ˆ ^ËÕbºƒ¢ZXo³ÆÌôð¿ñÌ3g\k] æ@Y§˜P¼eä~³Ã´-–wàŒ;pÉ`.ìgºIxÆšûÍQªÍQ'H Tÿcsrù=ü÷Å[oædóàüóÉEpñr6 Ï;¯ŸX¤€ô];fÈ3Èi5Fã¯ð•™É:Ê€ Q­¿³Ö|¡dÈRp8.žz?¿‹’ƒ PÉó§“uŸ¶ïeÂzk 2™R ˆIðùƒ ´r)FȔƻgçé/¹êJ²ÊäB&`ŸTî×Gtã/Ë8y¥?ª/$Ñë—nz¢.¤,°³Ašš@öu“¨£‘Wð2€™ bãz%¨ÖkÓäÚÑ14 4 M*jè0`M⹌¬Qg ªáO³¶0*m]ëT£Œu! š€™&¤ÚM‡M1Õ0$¢¦I‘Š ¬¤ïÔD6½VdR¿Ô¤ PÖ±n[¤ + ;[9¬@°ÉUËDS@ 6‹`T¨¨‚ìQ@¼Ö U«D4VJlÄÀZ+Ä+¨×`L¶H¶ €@¹Fk1è`h@°F `b XX@ èu@¡—Ò $~ËMtIˆ ’¥Ó­6Š9 éLâûÁÉ“ò®Žÿí—£'!´¯ŸgâÀ$ø@Â.8=‡@ ÛE ¸†äLNB8?'˜öX`æDæû.V&2·iyŸÌëæåe*çn*^Ïû¥Îç ¨àqŸ\ÉvL %ŒÜ6ÖSÎŒÿ¤ÏŰ3(© !B C+#@^“¡sžÖáâ-š}€Ä€jTNÌ|ýxZŠåj»Y©êUP¾èùÁæu;h4H†«-7'OÜEÎ`Žle£²S}Ñ“!“¶{RE¡ÖÇÊA?¡Pê4n©”IîýëiÎ9¹Á:kqSjû ub^kf¡DAÈûŽ-8‚^Õ= m¹¾vç½€.Ú¡a8çNdŠX:•©ëcÕ£éöÓ†ÑUè ex°ÓÚÄÎ,º¡ÍZL ¨9Ðd[é}F稒 ÀÈÓVtt4€W¸×€«OE¨\ÌíõŒˆB­-åjKÜc1$U•åäýXíÄý—›Žlø +ðº¼gšT#œÀ¤wm+f‚íèM%ˆV-ˆ wâVõl„'yýŒçàŒˆk?'˜=Cb÷y¾o{ªA@áþ™´Qãù¦Ë|¹™?xè MïÎÎÆ³5 ÙHó> MsGÉPšBrM¥]'hõ™ žøµ|õ¢Ùè!KµtñÐ2Æþfÿïx¹sèÀ z'-¾Ñ15ò~éµ¥€Œw¬. r€o`MÆgÍær€€©ÑWEø„24ÐK…÷^T>K¡ä2çr*ù$S¨ŸZ&•y&2¨iƒp+ž±)û moõ/7ð)FY…ÕÌÛŽJu^7BSÇEÐþª¤ÂÀÁKTÖ„W¦1£‹h( 4ºû±ßÈÕøÉ;PFÊ1LÏ´4èÊQ’¥eƒ†Xæha¨ì§ºöjPëÊH[¦i¯ E­îÏ¢`ÄöØ€´5E ‹T@ ¢¨U ª°Ò% ¹ €˜¶@§0€‚€ŒÍvVCQ¬ƒ Ø, @Ûˆ"ji5KÖïZÈm1@u$‹ö €( úRàÀ½ ‘"¾Ë]ô#UÔ"n³##PôVdÞ'!—,y:¤5ñ| ¾¶d3Ù¯@)e4 @#¹ çŒ'gX)xR𛟛…ñˤâ[ÀØä"¢‰ñ~7å€R¥<í/IÁ£q‰F)ä-~(Ã`b?vK»Zcñ Àç:‚ý}ðq–\‚ÍhÎxTÐf`:è°Qáwå†'æ'÷<@ÆasÌ,;,—]kêU@ãR¿…Žžâ²mÙë×MM¶3í¡æ˜¥’núŒãÞµ“=qÎlfÂÚ€€f¡ €¨Ý T´u+êiÀ€Ÿ4dÕê‹e 0 M“X‡*ú€\Õ^Ä0ºÂXKT‘-çae½i·À‡ÑP©½—Å­à™Ž "d¤DÀ¢®jPK­TÔ4Mý¦o `Ö±3PEź‚`˜ &*cNOV`£UˆŸƒDºÖõ~Ûíú·Ž* Y"Íj¼! `¥°@û®e‡­“ß>xk®'¯Ü`Ž.à ´= ˜úrƒ¼°A^Óï`ÏÏlDcÙ&½Ö!e !P£ã )O7œPÍ?Zf.6§| š³¢þlr•Lnfk,@ZÙº#ÀãiŽU$î)ŠvL@_Ó2e7¬sT€úŠ;9˜½Ö·^2@Æ9Åö½|v ¯¿¡¸«i;$Ï^?œW€Ï–¥‹U„ ”LÅ¿pÛ´çTŠ€˜²×..+ f‡ð-±+?¯=›ó¾±>Ï]:YÉ¥æH¢P4Xm.øW‘Ð2lpV$°û(@°³åùUc €=´í_`û · €6|%K º©árV…è0ãgÊÏž6‹V%h €€DwEsñ 5V`=‚'c«€`‹Í˜5€Ú §Iè0\‰ÚÔè(” À P5Z XÄ €.{¼`Yˆ"€u´„@Ë`î>Àà„XôÑsIÀöù•ê—‹:Èt2ŸX@¬É²@e’ÄüøÐpÀYg ܧØÎÀº-1oÝ;°é€‹Î=Àjþ09sâéóÝéb Ò; J Côgí^ÆsæFÛ ‹÷x(ÅÔ!ùqM2Ydvºíƒ{r)2§fÎ'z’É™¬Š ª•šÅ)¶×šM/"€^ÄæÆ >œ+«¢ZªHÍhjÐï}µ3;¯Íã×÷µ~,€QüÝÈ™jñEK©(P€Löø\Å™ªd?ŽŒÐ´U às†dÈÞµ´ÛZꪢùël+ë?6k¿¾©%Æ6ÞF ²‰œzòuãûÃíåz鯴Ck'yi7±J“5€UOk©t3an}’žRM`hf\¥i©ßÛtÎŒ90…Πsš$›‚nŠ<ÇT@Ƴоƒµ€0ZH©©²ýòCöÍ QÌ3@:Ž‘|{€  e3ÈuôC”j2k R›¢Dè €ªžµ> ""ﻲ¨§pmDd-FE'¶µØª ˆõU-Ñi@\ AUEkVUQ€£uP€Œ @ ž ì^Áœò´éì0dîŒçÓ™?g–€kõoK¹–2tIá¤í¬µÓB¤i ‘ sBŠ¢i/F,cV"ržð œjõ‹.Í—º|½êY:‹cùš•0à2Y±ÓÏ"çž•ed½®TÊkh[S·…'fCh)Vbâ@0Zdˆ8:³P Õ¢[Cö·Œuð•,À± š€pQ@^{uw_ã•~IV¿Õˆ§T¯ÕJDí{®d¸»©UmÇ”Ðo ˆqã09…ÙªdO$ô‚ÁT…©ùcßf…’‹\O·ºO¶ÏzÆR FÖLjmA×d¬œ¨Oö^2#M§^;ñ„‹¸A ¼2î…¶&€8âWÜr‘½†¡òênª[íI ÃâN7‘ﳉ*#ðów|I*c‹dA}ºM¯&ju¤7*<DäÂúÃ45˜®0dÂÆ V±hèô~ñ úç´ŒÅj§Ëí¢«‡@8¨ ®ú׌áÛéø¢ »ÜµOºÆTKL„k ¬v¬lùd[,’©¥mFé'‹¨OggSÀ#&6føƒFZcbÿæÿÞÿ¿ÿÊÿÇÿ¿ÿ±ÿ«ÿìzá3ÄPáÚµWôM&]}¿'''܆°@Q…Àp¿ÖB%ª;¨ƒTçZM \æhñ®\ÿ¸Û’ZbžJw 2…€ÔrÉf.;§;Œ½¢{{ŽÝ‡€Õª¨ÂЇß3î÷O8-³V¿‹T­<}çKÏ(›¦r¨œý*õ2”h‰`‡Ú}§tË&"UUm}„ߪF5·ºË;"лÖAÜ6‰SÚ”\‘RŸt5lU¥ ëèµ,GIÐ;Xä-yŒ»£³íRª5ê­/FÇå0éûÙš+ljÑ]<|hU-ߺeŠg͑谂«£7Žjω)ädz¸¨¶¯*yà¥Ç0Ü^IfšR!)ésK•‘Ý.,P8ÝXUM‚K+=o–%z0DU·²RVã`ÍU{yžQÿŸŽë'ûRŸsqÜ~®Y~ÈkI¨Ìe Z¶‡Ãrn}2< ÷³E4—ézº¥À5A¡nô*H¹è Ý`Úã"{ɼèûËŸëz!¹Fଠlé¾XŸ0ò½Y£õ^4J™­ÐòŽtëqã·Ëd{v³Û„×Q¬ófóÅQSsºÇqCȹŒ‚_çâ3™Á aõ“~Øì‹BVðDøBð`®ZׯcÂT)݈–Y)ÑÕ‹%:®çPÝÜa,›RQQQÉ ¹z®> Z-T¼'bÏ&Ÿùãùïó°ø¢pi—Õƒ½ifVë”]Ó?Do¦5‡Sïp¼Øžµ ×Íßßê©D©Ët•¢ü*ØÐ¯Ïà sMÖTœõÙšøÿEòŽ0±_vÖþמ×¾vÖ.¨„OͳNwå™êbç7ßsº7I@Íc>0•Ptû‡îˆ¨¾Wž4°‹„lù«~Fsü;³–AY=³««Ïk CÌÈW#$²o™ƒÒš7Z>íä>$Çí«¢ä ýÊ®‹3žŽDÉkr·#7f®éè€} ºy h,äÚsn„iBK2)(’J€$â¿ßfÓ„N” ¤¶ç¶ÿ`@ ø#÷@¢@òWŸŽ’hvãFÀndÔ˜,ÙNù5_"³\ì¼G‹``°Lu¾Ë™‡Š‹¤“¬ÐÅb• ºÓVQ”$Ü{Æ4%EX³S®ìx(èèÐÈ^?põT8³øì9\KÞ×36?4Ö[‡@+ÑÆ–¶¾ÓÌ”¥†UÈÑŽƒÍ'ZÝNÖHÀàîàìÕi½ÁÞÙm&WÏž•VÀ*-ö¹–O‡(Á—ípæ« €Ÿ§JBE ýŽøä ´ÿä$áÇPÌ7Ò ! “=ë kn×–È=yüèrãr$Ã×ñ÷Þ2¹|ϸfzÛÊÜ…7€!¶ºâÙšó €6TÐOû’õÞœáŠ{ª)Û·]è~òãÞå·R°a9”ËÚl’žÜ.\´£€ëöˆO³çE˜-ÊN¢©™®„ž†7¯œ»ï¹jŸ9‡Ú?Y4-7 é< éÎÏ™¯—Q÷qå™ÉéÞf ™ÃÏŸšŸ¦ @CÌF1ßì—çßÏú²3Hh’ÓÌOåOþ>óì†@‰³‘)¦§Z¾Å39Àõ†€ïþâãžÚUŒÀŽ1®CãÅ#cP‚+°/( DDG‡é+²€"£NA ìùÕ‚p}ÀÀþnÄQ£dRÃ+µ¡nˆÛ# ÙÍW¢jx^Ë@Ê„± Jæµb p˜%>Ú  }ÆiUŠÐûÓ«À](§§ÂÉ÷'ñ(Ø?_¢h·Gü‚í¶@=¬c„¶JKe Š„WuýYí_É® €ðÃÍ}¯—ËåÐsÝb'·"E$n—öJ(„Ü|6¯½}!0‚–Ð ®º:*HI$À'/UÈ0 6ûŸ}.d¿2"Oi'öGQš!²k˜ù¼†dÍjÒ_ú$>~ø¢á]Ê,7¿JÀâ‡38®Û˜Ù›´À"ó@”»³>ãcØh×D¼•Ñø¾sïæMºÛû‡;¿§I¹úÖýX”èLCQÔ¨«:h:{¸¤sÌ`4×S9´I²÷òßÙq5 ÔL]î8—˽ñ¾_þ?¾¿ú(§§«‹‘ãä×mïÛä• % Œi øÕg“mòýýÝMWÝ4ìÖÒ+ª\õ6'‹éy(dGMæ‰é¡õЙÉÜ_ggíóþ@Q´ŸI‘÷> ¯^”ëèÉõ­ð§Ùiv÷Qaæ`T $Q*–<ê% '†úïðÝ€F ´œÀpG$…šÅ3€9à*«A͑ċm,¥¹à!¢…ß³ˆgšyÄ>À;û¬±ª‹ø² >ÀýEaºÁ›¸>O^@@!§Îg “ýŒ¥á­5¥T ¹Kkûð«L7¢ÈðƒÉü§Û¹­À˜}§–Æo>ä¦÷9—Œ‘“g~uåQ Üä˜C) qÏ7ºxÈÐì©æÒG ¢*ûçé@ȈõgÞ»€(äÏ>ñŸÛÓ˜íLgWxƒDRt@^žßiÝle$µM¼›Ò1ÊŠeÐË~û\_8úŠCrk%€¾ –‡˜w$ ¤„!ö¾»ÐÈÅ–ß‘L¾ÉNââÎjìd\ršÄúiê!ƒÌ®X`ÈC¹ÍßI=ñ5ÐEÓ»AØ@ Ó€ÏÜ€øÉÉa¤µ8dPì.2k`¹ØßÞt÷Á1; Ž»oÛO®ÿÓýæÿíµ  Z5QU}ÿd˜}#î¿Ïçþó2µH Æ@gd`°Ç°˜“+ÆaôcÆuz!òd#º ãuîi¾ì=5ñÊR(ɬ¤0D¡$áqèÚ8±þÚm`.gLæ*£$xÅvØÒ(ëíð˜ö¸X^µÏQyÑÉLo♨©O+e^FÎ(µó¯sÈ÷Ñ…œ Ÿ¶ 7ØØ÷=é¸&ÃøÖ‡q€Êºò¢\ØNÄ-iKÆÈ¬Í48]h ªÏŸú_Ù?k83øÌãOÁ“Ç@vPpï茎š\"a84â¡Ã÷omèP¢­mc€CsŸî~ðjØ<®òŸ(¬ˆ_¼ü3àà¹-vgU8”WpEý«éÙ\Ù9Ž ¦¡&˜Ž ÏÁLsª`8ŸeGAPÐáad[©ù7öÜU,Ü4ifèÌŠ ‹Í>ó“Ïh8S$P æÃ=^Ï¢15 HpäM×Ö¥¹LÞgå¡0ŽèYÞi“#bæÂ½@ÂÛDÎ °(ôÀ °FQQ•—` à€þÚá-K4*š:\_µ#ÝFÍDZ €?Àç~ÇÒŸ‹ZàøÛÅàõMgŠž€"QÔdxT`Ô¶Êá$žÀ)Ãâ@<N˜ /{3÷«÷™)»Ž*á ˆ+31½nŽ#NÐ5„þSØçcz9ç $]¡·ó B2”÷E: ÎX‡§1@n-kÈ9³v[7ª%ùgÎ`óR‚Ï€øéÕ!–.¼(Ç5 ¡2!{W€×#ßàþlQ‰%1¥ûáNõܶî†qùĺç™Ký=„iMeÛgÏ7Ülq ðÀzspü4’¥g7¨MæÓYñàþ% Iõð@HWIÙêÝÍ@60ýôé@ÿÉ$dZG’1Òî^‹üìSQdÑÝAOï³è( hz£iʳnÉ/*í=ȰËíÈJ2É!ôš·1ÁÔ•Nz¦ã t&”Ëløù~‰Ñ Xm¶ §ØÕ Ê^€…Ž„ä ,5 „ZÑÐÌ|À>ÛÝñ5ž C¦‡ë¬vÑYBæ§Èà!އiAœÌ ÀëÊ’‡ªe¸Ñ6p?ĤÑûa±?t{h¾û8c’Ð9¤Âg. |¬aŽñ Ø @ ®HŒŽÑG ørp›Ÿvù ñpۻܡN:Ceø&ik”„åßrÎdû‚««§öd œ–KqøÆßoðP#Jètèý¾º]Ÿ ××–@ÔX»nû¤ßBÌx„à=¢'ƒŽ%s/Z2ð'qa æù,€/¿…â!”’3€gî¨1”à#gžKß#"ï€Ðñ¬]cPŠOggS@I&°„϶ÿŸÿ¤ÿÃIIJNJVf\VSWÿÅÿ¦ÿ·ÿ«uô©—K²Ž¯·×²]óË´=“l›š®©^àHY>ýÞ(&pž…£è¡Þ5=r~w4B$ú•–6wÁ €Ê ¸jšFt¨A’Å‚©ü¸ækWÕä]K‚ɾRzS@ö¾9BÙ^ïï AÓÉI(Ý;K¾ÞÆ8 fnÀÑÜ¥“§®“3ß1´† +g:˜f<`—+&©€¾` šF8‚už‹½Ò9=,”!£‡kíõ4{lvЋcÈ%ˆ<<£(£ \œÀÇZéü,¨½(ÀQåïvI81.p5Þß:êÄ8'tkH|Œ WâÞÀÅêEC¤Y˜K’7à®4C²©ìZÇÚ¶mYÜ‚›9×%®{ºŽ3ùU~÷wI(dÔ8&æØœŒ”Pš Fž±]Ó‰9³ˆÿBrÁç@vŒg7ü¥ä $~mÏŠTמYDð7 œ@$¶éj–Œ¤ž»ªW o¾IÿãéÈD(9ƒH!ÊüõãðÙ²QP Ø_´F·z 4üÇϵÃñ' ˜Ô—·vQ,¾œÊ¹ˆS<  ( :ЪŀØ5Ï“ä"$µ— I¨2 Çx‡àp p\?6 ¶aS9—|ÉFK@Ž„ÁÅ:n«X(B`sŽÅ©Î«àh^âo¼{·G% !9º‚ók¶[âÔ Ìàn¨ë)NÝF! ! X$_0$ >jíÜÏ*“ÌJ¯¼Ä³¥õbk2=x&ŸõY™b6.?~´OY _*"Kàx*\è»>ñúkýO¯§˜|Å[aß’|5ÍÂØu/À-¢@€¶v/?¶Ø´qúìðþ@ô!‹«±“sy€Ý~Ð3Rœñ_rèÆ‰@¨Ý~ào ¨Ü-•+K úi 9}J54õů­¨‡Êw ”€´}Ï(ÇД¬,Â_´ß’à›ýÄ':RÖ6ÚQ×ÕQ¹nrñšŽ`£™¦ÜA˜ÐM6@Ùâ}­gÜY÷ŽƒÐ‹,ºŽƒwÎ/ [30YOŸå¾ƒC>”æ4Ð0™†ß¡´(ˆ@û±« ÿîv@C³f Š7¥Ò®qÖSº‹›ÈÓðÃ38à” Ñõ£Hu£¢ÖYÖȕޚΉFÓ«*} œ·@¹J#y&, À= vP@D‚Å `Œ,D 8¦ã1@@ÑŠ0þõÈ8€€€üÀ/ð@¶8ÅÖ+š /±ƒE+PßqÓøtáÌ ø|Ø×‚u¡Eíýé “YtúÔps„³8c[¸” rg°$gÎÄ2•Ìî!´ ‚åHÖx¹Fʃ3|x†Ѓ  s4d‘œIÝ) 8" ò8YÌì=¹JxfÜŽOFÆHäGþgÀÞ‹8þÇÒØGUJ&C4§à/§•ɼžnÒ¦qUâãzQ!h=³7ܰoΦoG®ï û~u(@iV]ÉB $‡óäPrÂúè~6œúrðÏí\@ÃqK„¸yÐæ?— |ôвz,m–}<ñÚêaú¹ë±¹Ë¼tÉ€o¢Ñ[@·/¶ž/UUÍ`ÃÂÁª¨†*%4Ìïhô¬Yò Åéë7 tÒh˜úâÚÌ +"@Gf¬3mB\¶¯¸q Jª{ÈL²½l†I†(üöÃmsP”8G šˆ 9ÝPÀÀ fª× 5Ü‘£4i¦iŽXitÃ=´w؃‘Û,ŒÀ’ã@{ùxC! .P(>@Pb©€À¿%\€ $œB=Ÿ “ùG\¤VÅwrUÒŸâøxê®=r±^T À¾Â5\ƒ\KX6þtÉážTX$¢²˜úýûmeÄ wWÛZî›ðò¬N©¶‰½“î©Õ)rgwi¯É1ÞxãðÓH²´psª¸Å/ÕRzc9 ;•‚b_Ò²Q®Kw:¢;ƒ0ÕXžXí%<ˆÁ_뀔B…gæRÿC—°*Þ;³V •x|t7ù¾Vc:Žö±gÍa ü^¬îxZ΀p˜ºƒ ¦íßÐ6"`º ‹‘< ¦ß¡ ´FéoàLý¤èO£Â3H´þåùùÝåŸþù®Ë•eÖm;õìuΚ9°n ÔzÕ¼]@ÔºwsÇç?U 1j "$Ý›w8¤F…àRþËÀütª½N]«¦C€EèZª@KBÓ{4…ÿ”åÞkTX5ÉÈ¥+²ÅÆõ] âo1ºŒx t>µ;/ ;™È¢=%ð÷¾ýÕáå-Ù9ÉàYœUíx\{fáÇ™Œ_0¤Ucžèœ“«ã>÷ùûMÜH,ò°~¾]kèj¢Ü{ßGƒ\ORœNJŒ.©Å°‡=Ó¦:©»2 Ö—šýóÚørks+ Ý×’»ÒîïÓkUÊbe$U;’Êß̓qGc"lÛûEYŽÆ„õ}î[úš má"€o»’²hÄÚÙÄšÔ4D¯b+J©hËRÝEQDш,dÅ­±èÐÎXÊU1:hk‹ˆAk$Q\Ô~acb\ÙŽ‡þ«–ï &þù8WUD5zíØúU´*bm¢*-­ê1VFŠJ-ÓÙ’.yK ÄY]»²z¨º«’SÏ[½+Óû瀣b.ª ìèbÈ9ÑÙ¹Á1 5‡9M‘½ûotÎeÆ2\x+À3%w¾Eý×Þ{æòŸÈ<§ûÜNM¹á©ÌŠ›öæ~W–ݘԂ;H*ã£kíè¾uMmT2UÀ}î}ü—zs! €ª¦ sT!ž×'Éì/¹˜<Þl›ÅË­MŽ—¼%;zçžmî``Ä«ÅÈú×  B™Ÿi¨PøUˆ0&ù2Е!4hŒÒ·0 ‘$…M?ÜÒ‚ê£s¯Ûþ,i3hˆZ(°ò¢bÙV-4–¦d£¼«™+Ò ^ÌmIº tÇÖX= D»ÇlzäE×HÖîûÇ_Œ9f‰ÕÚQ5é¥a%?9•[­¥Ýüñ‹4óQúyé|©éæ+6oï7di~»#ò-QVWr†º -ºë¢Zig©Y/’)–åW/°ôxmh|¢£]Ó&RÆÔ,juˆ4 bX©¦ð(‚L®Bb,SP~l¤ÞŽ­g—©5ªÇEŠ•NÇ)È©LRZ¡ ,w5ˆþ˻ݵ˜¨Þ廟v‘gzXjÊL13§X*jŸYfž½~ª º”Y¢üÖMPlŽyª÷èÞ=*åœÚzîi*¹‡®ÊC}91w55º™" €Ê»“êˆ^uܪÍÐiÕ(!ï6¨šŸ*9 ÓPV?³ì`‰ƒ½õ&ÔÈICªT9MQdPI–Võ önÓø€6Ä}lU@#bɸ @žh4šDÞO ’U@ ®YQ @¶á½­w t¤¾ i4x´ö.Ä[pa$DÅ{ß’ iü¼ÈBè†zü¹Õè@ÀL¾«íÚƒäÃD•LÛ«mÚCð" Bïâf²fZó>±@ŠÏùà ˜;×9¼ù¶k§Š’ÒhÓ¾ÑÄ`Ý~÷³y¯Œo¯Ú6ñ)ü÷ï.¼|å9Àè7.‚ÏBn¾ÛmGq³uh<:ÞGD²ª·¾çy½\Þ¹,iͱ˜w7à¤[é責Е™ºvëªÈÆÖ°‡†³:ì²Ð#*^ª!iª‹ p8E¶ôDy(RãewGÿÛÑꈞ4ƒR)}a´4nD~†yjÏ3_ÊËçž ñc¹B& â, L©©"é¹Ñ®]t |ÁìŸÛzÈ1¹}覚z›$+¡ßÅÔd>ì":½[úR‘2úÞ‡8¨½zNm/TÃ@OVø´(G†·óîÒ/w8ÉQæè‡ó.ߦæÍ™ÚIÓ4l{ü.6¢˜íù7ÄÎþ €À?ÛÎ=_ÀQèf»³7˜i¦ù ²—ˆ!fb®­Áç~qÄÚÌ ¬v ÎWSºUa¾°b«?xy1iqᓵ@6` s%*Á¨³b÷+FL>ìÝc‹cHè$K÷ïvr)‚ rûyâˆ-ßhuÙ¯‘vz3|¸ÚàƒmÛÛúß&"5•ªª‚Àq­]Ñìx_%Ãïvßx¼y\þ޳AÜT'%+â*6Ÿ‡4ÒÏ!YÆÞ­‹&jMZéÆ-y´$_ᇑiÓÒÉê©@Ö;;ÂtF昮[Wš‚XÇÐCêF.Ð/²GuƒlŽü6F—`s2¡§åJ …OggSp&¯aöÿ§ÿ©ÿžÿÿ”ÿwÿsÿˆLNOM`\afhdÿž¼ÝÖ‰$‚Êo¶û6µrØ·Ñ—Ýñ«ž_œomÛM<ë F}Û¶ÞLÕ hTû‰é’îJ£órMúòós^ẖN”¿³òêGóKè?2¼9.^5—ÏÅ-0ib”n¢tRäòþåµqÁwªY–;*U“¦¦ZaëÈ&ß_Êñåa›¡­&Àûk ç¸b×g©Žù w“¬ÚëÖÁýÔó¯ ÷ŒöÌã¤è‚xL± 9YqGU4]È?>ÌØ½ª›ê ÷W"ÄNÎþº¦;  Õ €3ïiœn¨¤ Ÿ* ûüÝ4‘›âüÞL7Kò ¦Øuh7ôt]hPNÔ½Nå™v>x7Pi˜âéq§CÖU™SÀäI8ƒ|Q×>|¡ÓɦÇ/Ùœ]ŸÚ^øFï`5ÎÎÎéUt_wÆ÷OÇÀ(£3L §8öæ=º¸cÏa'ë>‚P†ç(—úc¨`Ú¬ zÛ”øB&V»}›˜ŸØ¼÷񾁨›ðåÔXlÛ7bËóïõå‡Ï@D¬Bú‘‹†Ö7|÷÷•þ»Òù9ÿ!xþÀà«ÓþàÔ㬿¦¨”ª”aüWqoÆ”BÚ÷Û°]lp¹ X½(ØZµÕ»+ a ·7ËÀ¤ÛM©R×4Ô2û6Ѐޞ^MWôÈ>:,_YÁüº¢½ÍµN6ÛÜÝîÃõކùîfoËpîýtå [ï kÓ»r—ù=#CAÏMõæAn3 G7:OS$Cß7%´Ò5µºöðÍ3¹5ݹïëmî¼Èrò#Ÿ9Ó™t {@D~îžSû¡ádr ¡‹tŽtßíÃÞòà™é'ओz¬Œ.S…™  ¡'£¡²Ê9Þ}j×Ìõe2§çl8P•6Úà` a ã:K€3)4/‡OÑ¡™]Âøt Þû]â=¢E2ηÜn®Q&¢¹“d!Þ"N+×¾=½}Osü p€µ¥öx[³aŒ: :­5eŠ ˆ‚+s<Ë•ð†“m 7ÖLbiõ–ùYùþè&ž¼\š9¸äjè[””â‘ó ã]Ó¯Á ¬øoçµ>îßcÃæ2wQÈe Â\ÿ=¸ïNúb¨–Ê: Ž•È!?û‡3Ÿ÷Ûsz ªF’ƒ›~N*ª¥‰#gB÷ï¶I4 ±ÓuçpbvåÝ?ï#IлŽnf˜m"›åÅêçðýóË”*H¨PÍ€è½ëOugœÙÑO–6•?ùÝW²p È.|7é΄ç_g™ÙtOïûžâšËÛ{˜‰©xTBN]Mw¾M÷™õõ34ÈÛK6Í~üþ:F==0Ë»™‹wWŸû;I:òbŸÌÔª)`xòüz™i¦°&×nο3‹ˆûY#wWvYk-owmD¶ÐPËC´b„©dUh$nhH°5žû]Í5ê­ÙRãtËíñEdLÉ8þhãVôÍ€8§"º²ž@[ëlj0ª#j*™aC'” $Çõ ·LÞúnj¢ya¿tí}&@˜þdêtY|äóˆÂWW–EÎBÛýåÍÊF¾‚ÜùtGH³Jö“»ç‹‘·'Á“>جùQÁKÆÓ ;ÛDUXÖOÓy ¡úAÛÇû\˜;~΢û^>>,j£¯7<!M°­y‹þªzÏ¢aè¹9: #™§Šscº8|w˜—¯sGBßPçû@6EƒÄï«§ÅËsËðûØÇ‰æ½$2`€\•fšî"ß'\VM{ìûP ÝU=™E}·á¡>$E#Tg˜7)ƒgºÙ͹¾;á;ÅLöU ÔTÖ;w“{UÜgº þNÁõ?ñ3SàÕpì&X5P¹³ª‹“û»ÌÊ&›¿úûQ6g¦¿*ûOµþIÌóŠ, 7ޝßîVqשּׁѦò^Ì5£°fšViÀkkÂö <žûÝã#áEœz·s{„Þ€ .>?þ”˜‹Ã°GÏÚH{hÞ »_ÎÀò}Ÿ­³ˆ†÷aÊ$º„\v}§ôHgl3Ämpò,õ~áúL¥Zz¯ÚIïú2ß¹5;ËYF4—BD´  ãË®]¯Cþ4 Q]¼°mò~}áÛ9ð†ÈfÙ`ÛÚ'ÉÙª$<Oc}³P–;Ý‹=_ÛàçO5Kw:ÝÄ{3Þ}‡Mp¹LÅL/o:ÝxÄ2Ý[¹™hóõÇ÷ýò«²íE²#MpsççÐ5U7?V_h€äÖÛfвg‹$¹«Ó{ïœA(Ž˜’¨†+ÛÆÉǪCÓÀÜùìZõÿ6ü®JÝ4s®»É‚úñMðóoAÓ“1 3êi <_ˆ,z€9½ôÉgt@²E• ©æ„zgÑúm­½sC½µGpφÚ5I±®ö ðtl  ×პû=Ý+AÛmî¢0P¤àøà$Žõ>¿rpçlû¾Ž&ÖÚ05š:  7ì$kŸ<Æåû÷èMþ>q€€½!õq{°’£‘Ñ„ÍãšM¸³ý¦Ó§ªÝx@Vo*~Öª¬ìm8²G{»®#Õä–wF¤Óh_x#PÐ_º4Ñþ!Ý ž/œÚ½ãKšGnÑñTøåÊHÀ«7‹%DÛÙî%t¤£…ÓuC1]¾Û:ö®*Î#uKT-ÿ+9Ù\ÿïšú¨§'Ÿ9T¹Š.:3EõI’Ô@Âù½!wÓÓ9ä¼ÚÛ÷&%¢çôöjê”9ÜÀÌLQ»ë>° ª§¯Mç7ÝWO‚”(÷ÏU×$4À[@5%ïñquüÕ;ßb0ñe0D¯°+ŒaªŠ›:Ü ½£_Æ“$8˜±¬û{À ™Ó-ÀÐC< öêÝG,i~$©â(U[Ü3PlÀ`Úoznûn¿Ï½_¼Ø_ÎN4·|­wv7 µá‡Šˆ)’‰‚n`(Y‘$'›õµÕ®­Q‚ÞŒïüô^ LùŒ+Ýõö×4/_8ä`>É¥P•R¬€"G7IP…p£b[Êg袾N.Ü—ð+›,³óši?ºCÓ<Ëîˆu·Mq:|PI•ÜÑa>1Ÿ¯JÓDŸ‹Ü²áË1ñü£ÂNL÷1e!ýkõ?{º¡Ý9 ÑПYTÊh’`Þ‚% 3ßìY&2G1sÓ¾¼ºóúö˲T%PM!šd-†ä"ÁYÔ}ŸOB}ŠŒúù@¯…AŽÒÅ©„•|Ty*ê!©iˆ]SE}i »{0°v‡«ß"I`?þ­=ØDé Ý—a`Ž$šnj²¨Œ 0 ºœ°Œž¦cšºLH€]ކÅcCwŶà$ hŰ1 „oÀHÀÚ€å^@¬–Í—Bí£jÃî’¾nÚ©€•¢ð3ÂØ8`üÞ³]–C ô’Üß²Ÿ[Ìk9DGr í¦Lx“Ë+P¨“áÈžf6k¼vÕ»ý_׋¥ÿ¬‚gÏä¬Í]óDÄ9xJB@+ë¦25ßëó4÷¯Þ°¯‡ù©I‰Ck8Yf:3˜LQ|~ Ù âëzPvß‹”ŠÕ‹¡|[B˜§]ðiÊë•ÛB~Û€'Éž8Öôeó»½]m)¯b~Uv×çýåGªOŒö*GEѯëY­ª¡QÅïŽt¥-Pý”ŠÉ§}¸týp*äk—¿„ÿØù`+ À×Ò<ƒ ¹î¤gvwPX¯Vö/FS½V1Ë/Uû½k÷ÜìÌçaaеwÁ•Y/’Ñù"¼†ó“ïK \×zç‡',QÏFå}r+‹¼#9±]¾)M7•˜}™¶o=ÿÎßo÷ï¸ëàíøüÒlz9÷éwUív–ryy·Ü&ìZ¢Ëëø<ŠÒ6,)aEÆ„§{Q[Är«µC€WµjÝä‰Ì¦Ïñ´(5èà{‰úû­+l$jó­_‹“}™oŠ<­óòºY;ì^ÃJå0Ë­úÀ.YAÆ^Ã5ª‡îVìhŸ@·ÇǺ*›- ÔJ'`3"ÃZQ]²nÙÿ´µ( ¦è,Ä£ˆ½(×ÍŸ¸9¾°Üçjl+)äðöÈËÕjy¬‹ƒ¦¾M”4i&Ý(Jý ¥¥C—â!öEd¯8ŠdË~0Üb'`À²ÙÜS+ƒF2[Áä~€®[•16ÂÿßÀ9;&r¹gŸ®ë?{ËŸª˜?~Îø´¼n¾avrþÖ—-¶Œ‹Wùj+ºÿKZ™¯óê¼”_l¤â—CÇ2oGÝŒôŠ4ìÌJ3e‡1TIS:™Ló`‘Qú]º&²2¤KTóΟ?õù]ÆÓ/=LæYËaHrIfž­üXâ‚â †¥N“Z9©#Ÿ:†ˆ¸yò‰§æ¾vR±ÄíB7Šìå߀,är#ÖPŠ‚­ÍJlˆ@6µ0~€®›Eš¬Ð±ÐOm°_L¾ïõÛrŽï•²0ûà÷t_§7õùƒÈöá <Œ?úÐÄÎ&?^ÅO÷Zº²Ëåe]Õæø–"¿ÒŠ‚Ûùl9OªÍ|™þºÊÅÎÀè=…̦kµ"©‘£OtÚ sóÿ¦=õÔÌmlÚ{õñ%À\ëýæÇŒš¯¨º*#TìeËÈD¢/C^±†Xî¾²5¿:€®~À¼w„Zˆ"?E ë¢VUš’$à††ÝfäN„Äû©—–ÁÔ=ö˜`¢RõÛ»‘ce:· šNàŽí/U¶oÂC9Д'— •ªë2Ô¢]¤Ï™„àˆ‘Ú%Š"%E¡ÂèÔ¨@­Cg“‘1]!5„E·ƒ*\dÆ€"ÚDP.ÆJE™R)Ë4¦¡©R*H Т€iÈb`õ“:Ðp)!‘‘£8 ²” …ª«•0Ë]ê‚B©(›L[£- ˆ¬ÕOfî‡%ÊâÃ@[, T†!»†„ZœÓÐÀ¨ÐîJY€ ´“cy¸ø}Rx†]šZèÚš¦j˜§¨àÁ”\*9É Í}u÷`ò¤»û…R¨/¦È¡‹÷ È"(€Ò|‚€¨Ê㸠0üòŒP*_ Xp#x™´«‰+M‘E¥Ü0fÉ&@jåÉRÀG©Ý…²‡'™ðîØa€/À<•r¾‘>Wª ›0 ¾»MnŽÂ€N2{·ëEOÓ|?€Úk+H"I¾ìg ¬ùðÖ®MZ³†4Se.@Ì®Ñ$Ynct l·¯@?!øÊ#±b ¹QJ)ßÃ~WXÕ„oxFùŒÕëÙiM’§µý/íeõžØÆ3í½—~^|…SŒñt“. †•-Ƹ2Ê(rÏÔ¦É`}!cªáiRLÆÎ*‘I*q0ªh1uMo9‹§à‚Pêq„ŒÒÀdňJUuÌ@Ï쪆&Ä€8¯ZÀµ ©,H¼Sû4tVá^swæcÈ]Tÿ™JºUU0ÓübO3À´4pî­jÍSLç_<bÏ$ÝY“¸?ÓOžŒ£¶rH(``¦ç¼ÍT)Éyó:Ü£&¡Š²’u)Ëó04™™3 ðƬ÷‰Þo™„Y1Ÿù•3kíÌ ï'TŸ¦Ð\›×ü´œÁþAÔ6JYŒndH¶=`Yaqiúz¨*_â_w4":½‘Ö-Q˜T"ß##Û·¨ìeÞj$2UJÓ ´‰ºÓ”Q/P>¼]ãH 8;š1¸‰û™Œ9ÆlÚóŒb|¸X°AÉ>¼ÕÑDT«©™¨ù9ÒtÜBÃ'°0 g¨ä…‹š›Z þ“XÓiʲu‚¹Ä'UqŽL6ølîO®%9Y7;Cf dçTxdN<­0}–ñ€ÐLv PÎ!LEÞ_±C”ÉfexÀºÒ8œVI’3„¤ÖcK¢HçHÒ©½w5}ª«RÙRáÜN8ÝÔ,µï‰êeôeš÷aîºLwXp™»ü˜MõäÄ)×P®¼ŠæjÆýÄÈ_6oWÃIª(X¼9Ï3ïL§ Þqv¶þû{À€?ÑïIuI±ô®ð»=¦ýp(²9\ïˆu}çÙôÔuyóÄiï|TËO²pÜUê¿Ôôïûßã­{r"öçìzÞM?øñÛo`(¤D] ¼’a¼S–q“ŽÞf¾,L2>,ð…õ$Ä‚ðGâÍT„h£CºM€踆)<ôU%OìíeYɤ…` &¥ÒHræ92Ÿ."ÆT+ãq|8v?ƒd oMF[Õ(JÅÛ®³397¹eE¼æ Ð  .!{¸ý7Ñ57Š?&![*69Ë(@n[„($r • Þ=¸eÀ%?DB9£ìÖh•¹ 3õ©ÔÎûí3§@µÛ^ñm4;Ðg®Ö «œ6…õÌ àÁ¢¿²¶£@k}mR€Þø’Ýu¬³ü‰.&&;G;Ø¥„xszgæÝÂ.öá/×0õ39È[ŸvˆÏY——_vú˜§èʬNOƒ»©^›N™Œ¹ãêÝót§ÌÔcH •æSª@S@˕΢“løIœ C?ÕY$ì¾"gœ\9™ €ªNbHíªì«”º¹5Eekã$ÑPyêù4•œÂúuVÀ˜½aó½<)Žw?6kÌÝ¥¿Ù-ÄqÊ Cïž«H`pöeŽÙ¥ÞKhŒ¾ÈgÈ?±Y"€TI»¦,Í¡xF‚ {é ß™b!ýëN€žëíæ2Ó˜” Jxw¹UnC»ÀGÆÉ’ÔËoË2¦=Ù"Aç+À $60ûÙ°Ã61Z‘†¹‘$¾Õ’ŽÉÿ÷^ƒì¦îB­«ù ò7Ö,M0£y.ìÁYˆ¶YñÀ~劙`Åǽ0xr“6=~~Ì+~k YW“•ãÛø£ L›ÙQ³„N¸bs“ ìfîyf¸æ9ëÌEC8¡+ÈÂÒ=¼5Ð^¨Bˆ2xæá&#iõT'/Ð…Mg…·   àL}60ÅD¯»UðÑ^/ î~týƒf¶“R»è›&‡Ü"éîÿ«ú戙ŸP¬Ï`Ò)žÑÇrªŒŸùû0çݹ4Y}¿Ítð<`šHàßG<¥j_YLanÊÕÊé~U½Ÿ´ûÎéb`繆»²«“ïºä¤sÌ–õ†½ ú£÷dÉ)%óÍr@ÀÄÀÈp‘üy=ü&ÈBbôLÃM.$¨,(­~ìë3ÌMAõ wÇôí-€÷Ã|~LŒ|7ÍÊqÚ8Ø…š¯ùXgp–35^4;¢j5i¦D€ ‰V¾_&?hàð›Ï{Uvóóöþ9@Ð ZëfÀ§n¨u}ñá½Tš-y„Ç#UysK¹ÂãŸ+½’E‘«ØhÏ"‚PC|’2çO}‡Dû~S(À`䔜Ë9ëF®“Š PÜð].Ñ5ð9¬>üZÔ;׌=¼•ÌwÇ8û-’ÊÙïWÕÔÎ ÈL¦/Øb’Ø[ @–X þ³`Ýè ‰6{ùqqðòܼɞqèÙ·˜ƒ°½¥ Á`âSÔw¨¤’”¯°‰Î÷tVV!#è®}Í^«gîWA`àªì©CºÕ»z&oÈüîÒñîÃ_^]­¿Íp¾¨‡µ6Ýï$†¾¯Wð 4ÉK²Þdå¹È*®¦ìtÃð‚lóMƒI¥žÆA¢]PƒÀ$=hhJ\F¬€æ P œÖ žëmæqšCo-·Ð[hÐÀû8Y§’ÄW€ínÆ$gŒ†£¦V©R2a`$!^ßäÐè· ×ßøÊ ÐÀ;Xe~ƒÔC´ö=Eö9¡2EÆ.@]åâ†Rp·¿¹£ë{ï ‡nsÃùnæ43k[ƒö¸ÞG~œîÙæ’éœÍ–µlo¬».'‡Uôi2Š3ײ0•17Œ€ÔWœƒ áYÛ/SoÛÑ¿Ûñðq¾³®1Ì|þñßÄLmª:O«g` {]ŠÎº’ PÙn.>¶v./ß,µ»ž_¼Å«lÔlñºÐ2û' ‘Óó¹÷®9e”`,Ñ—·;¦³2¡{ ¯<4{šÆo2§Qö‰ªžêá@cö"XÎŒEeþúÉn;e?üõ_W~F§fêZ¡¨4 Óó*wCŸÆ™%îMj ÍÅÝ:[>&£»òk|ÀKpŒÎ0cÕtDo¡^MIàD€ëÙìÝã+Ì4ðön{zÆÎ%L…p~&‹Šò»GZ‡6À7€€¸°)`»Œþ£>ÂÚJÚ%D ôßý=Ú:¹ƒ«°áh‚©D9Hpçc™p0r a>¼*º­ë&U3õ†URðºÍ½UmJoe u‘l¿¥ëæÔ€=Iâ½ègüW&ª.ù@'ƒP„¢ï›H< ¦m]†kô‘i!Et¿¾L­B½çUæ"æ2ƒ¹×Ï/³ÿå'íø¡¸râ9Í““ ]¦øìãþd–þ§’šÃ¥³$Ý59Ðì~¸¦˜îAÙ¤·#4ùÙÓ?Ÿ{Hޝf‡m›ª ùQ„ÌþJÐ=Áa T tõê÷>·rï|·ç±»4YTSÇ…¡ñsDßÅDO)öI:+Iî$oÞÈù/ ‹šfº&è¼IeÁI4ï†Æíova*É>ÃAÜ0Ù$Ue,˜æ…Rú¡€ ^œÿ¿¦ÀP„`ç}öêuâ;x‚6†=·÷t‹ÄwÆ{Ò lY΀/öu›õI#2 Ë\– "Ù ‚…A_ôHÀó@hXÒp¿b:)«ßÓïž9p÷ÛHô©s‰ìg ìL±¡·3+1:¸×¶ŠŠäæRŸðoCÕe­.%ºˆF(çÌ4VÈ:Ž`dm€–1I唈E²–PC°75 r}•'GbˆTm€è—žÌ˜ŒÌ}…ð×Ò3q."®g¢5]5d lïjz7}¨uêÃÞ\¾çsFàjzh èAΪi*'˜}&y¬£JŠÃÖDT^g`#ÐW…«ß:Ž»6°„qÕTUn¿¿Šîãéëü;îì0IdAÂŒqà´?ÀU”rnuà­#T|Ix¿lž5U?ë©Ö¾÷sŠ:ÔM{º³øv"ãâ9ofom>º.'$ h·@}{½P=Ùà×¢^\q@Êî{EÜv‘×I3ÿªà0©SÏ»]^¯LXç§´ÆCtŽ¢°4›kÜ·Ÿš0DѸðí²ŸÊrö©gîx‡œga»ßˆžI:õ>Á½âõ†èx5ô’Í(ý¤S¾‚©wôñÃýpq —iE†¯þÿš#)K©–Ð&|‡½ëÄsx¾Éì/_Û©‡­@Ó¿|ºé¼èž¹¨âŸðhPÔvÑŸZÇüîªÖ+|Jô3âuyŽ•/«w±’mF€œ³“F2n‡.±ÄÝ?qóÇ_uï_»ÝEž³öE ½c²É\¾g&òX °îÛ “Ý'nýéŠÃöõÀX¼p­ã©óCÎÀV €‰Y>M ³84Ñ“sôϩϞúÑÙ›{y öÛ™Á.Èh¦]ûæÅ¢Ä¬rñ·•©8÷3z¥žƒj–E Ïuþò¡vœ—a鄯wû/‡ðYÎuP¯~* çòÚ¯[Çò‘ãÍž²¿½£¼;xfYXmYzD€†8ôqrlK*d[kOggSÀ¸&âp]Wÿ¨FADI^^]ÿ±ÿžÿ½ÿñÿÿÿÿÿÔzíCCªkJ±ó«Õ²‡FÐ^™ã~€U«à2€•¾´£?ô ¼e¢ú¡Í®èGþø?—»æõ·ï¹¼_•0ž gc̈́ܫ¥D¯C8-³b‰kØ"2’ÚEú«ÌfámÞ —Ô+É>ÊÍ2òSÛ$û¦?ÀW€1Wïëg^?“ uFÂtSR ]-Èyq€ùÖ ¨ŠÙsE@QT\d—ŽÎEŠ{·ÔºôSW­¨ CÉ ê˜Ø‡öƒ%b;šë¶•7˜\öv+èáuþvYoãùˆGò$Ku’My+©”çéCÎ,µ"­Õ\k2˜•~ …E­Ù-ˆJ ŠÒ[ôe½“Á"ˆ¦™˜å™¡IU§MîÉþw¥ˆeL";:1ŠR“FÝÛ×MR@Œ ›§ß~ûô½ö¨g«#Å̘¡¨¢ÜOMo½%#£õ:† ¨;ÏPPôkef°¢G`d™™iDMà©ÊÒ2ÌtXÃ…Nè’âclÝ… :u‹… „‚0Dê4™AH àFLoÄVA$sš)ÒVĆb ÑB`9Ä c€ì¢0ºÀ€ˆu•Æ ‚ c Nö.µ¶1àR5ÏÁ€è-äì2 ¢(!w "”nÔô~å8Ýx?µXp³U\ËôÐx" @ :\vp‡e~3)kkŠh é q¾*G|lC”¦$Ú‘%1¦̉T³‰Ðkƒ?ìzñ3è¢WÚ¹^³ÂEëÂòNóÚÝnErI¬@°wY!¦UëÝØEÐ1?"µRGH›Š-Àk£efÔ}ª1áÔvéçSˆ÷‹²¬ÕROYî•?zc Àðà ÷Müh{†1Ž; I²¯ÅǼçé2 e\XaG#=Y°°tĆÁ›± sM(nk–~2¢z^{¨ão\+×e{q @›éÄqȈ8ì‚x~‚!­8råиõY”Ðm¬pä*¥òºp„Á^¬VÑ»‘p I»fjT¸p]-ÿ®>@Ž cð:l8÷k—?¿à„Úµ^tæ"úX¾êÏÃÚž|æ‹¢ýNéõß'/‹Z)Õêf]£-KÅ6HÍê^#_Wɫ뻔ێÌn¡RR0©¸mÍ]+‘2Òá·?À2¯ÆÀ¾ uI¿Î}½ŠXÕn­æXUD¬>­”)"uëÖªª[޳”Ù„ô„;^½LÐÊñæ\NìWN³%×7‡#¶_ú^ü^eÝŠæ“pÄ^*"yÆðl?¹tËZlät-³Ã³ô)ÉÅZöžQŒZ-KDÆ5SlfsÓ_?ŽõÓ)ÖLÇ©Æç¡@iEZ^½È»K¨õaÓàíA.Ѳ ÚŠå€<@iû:@B.ª˜W— çûÔ?ÙÇ#J‘/ç¿"¸¹Eîuwcr³&ŒëÑáÃ%Â#Ãå5çw'ÙŠÁûôt3 Ž2Ùr&u̾¹à\/”‚»&ÉÈn°‹‰¦£lz8µå„!²|‹úGº™{²Óû[NTƒ:ôt’KÏ0‚˜TVÖ.R+êõ”qØ9Õnr.X$‘‘r?lÝrøùešÝö§±ÏÿÄ(†*ÇqœÄΑ+Õ-VD)c8Úqpseu–`Cyç…ù‹ÉN PÔ¦jÆ Á£—©Ú‰Göœ1G¼» Oßî~ÜKŠIJ1,àEax°ìO¾%¦—0Ö5úŒXAÜ%*ö^Ó´²VVȲ(¤§L”0ö0„ ­$ÀÜd~Čڕõ;‘yd„ì‡Û>XßwçV… P¾«uÔ`r2ut½]<(‹Q±,:º·È›½¬÷(ÏÂð`[Ç\kc3 s™ÅĘÍ*úm¼Œíb×8Eã׌UÝ´HÒö¨/a¢å¤\yä 6;û­¦Áy,ñ¤jÛ\«y"ⲦK5]̱¤¡±+`he`&a¼ªÓ±ÕV²s˜Ì'ª̪,p|n0N Ñ)íJiF™˜6¼u7¬D "l juD8˜ Eô…]êjÆLëß çãdh”»}@–r ûÌlÇ5Í}hº„˜I°ªh¦~²Â§Û¨ky×’;{ز3¶€ÈÍ£ÝYô¨Þž´{IJu|mIhu‘²’¸¦×5ÉÜ$¸íLæeœ>¥Î+»i¦î¿öf©éIbÀ-ÜÉáôÑW‘T’ƒ{@ ÑÛÑB|Ï~ rDD'š¤u…‰ Ä”ÊÖB›—]>\Ù¹_;vç71Œç‚‚ñ4³žu­Ò‡ÕŸ{à¶qoÃÑ]zó'@PÜà²`´¹½˯@¸.[ˆ"ñ©`¬-:B‰—² Bo7©&snF’énd/ÛãÀTàJƒ0ó0樟cŒuŠœˆÄ¦ÉpI@$‘ëU§ëæ§b‘C›q×& çL¯¸§½]þ`Ó~Ä€Üt.¯ËÍÜ„.dfœbçdù¼¨Ò9"Ó7¡ÄÕ\ü‚ý»îäQ;©º¿o‹Ò ±«¤!Xë DÊ"T8)#Ùniå:J„Þßí‘ÈIjÕÙ¬F&uMNA[ÂŽ’V}êî¢hÈðõ¶Kw.Uj±v5ÛèþŒ‹s´QGmù=äXÃ9#h†ö‘A-!Ú‘;aC–8U+ÓpHæyX¨l,5.zˆp5 É W ¬rrcëÉ$a”Ö%:„œEh&ÂЛHƵ2=ALwOäã…Ä6IàT]!/’¯NQ4˜Ô%€ˆ„mªvõSyÓ ™¸›PÃÕ%36Ù¬<¦š:@ë“ЦäÈ«1è:|Ô;ƒ0&³1a·K+@K­‚)n´2|YzXl0†D€%râÅØ`„àè¦ÿ¼µ´ e‚cÄF  ^;ÌChEôb¯LF~ƒ$ ª¡}Rš‹Þ3^[óún§¥-Âk}Çà½ÿðé/‡†]û–ÈÅOSíŒÞª×Âvw` Û~aƒ¸H0ót°Šüºî”#KqziŸŠZ5õñßwÎA£÷Ú}\®å_QÞ—ï§ûÞ[i÷b"Oi2ºDñÍ4›xH¥Ç³Ê Ï%S%H!k¦äÉÏ:c—çÎìE tÁ;ëÄ$µòÆÆÏ£Ž’K&µ·Úy@&{ýš‘1’„èùغÜY¡ŸvãÉ"ÈÉdK 3e®g4}$ND”JzÛtÀàD5ì¬k¬Î²¢#»Ì`‹Èq1:­˜Þx{^£23í- ¦!&"ë ©Y ‹N=MOJRhî‘ÚKH žÚJ.b6 )–c•°Tå†åu™™Aƒ•÷[îBãõ#æzÿûlKÔLÃÈ*!0£û1±¢sƒ­gé%ƒj{stšqLÖ.c`觱óì´/CËÓ‰'|3d 2¯ŠE*C ¹Ê•*TQ¾ÄžwJ ª‚ ® J¦x!HkÖ‹0XÕI€`ÍHàzX‹1 Ù‘0`À°bY¦bè‚D×R©(`Ü“ ~juÈGXDEV…¿ÕÊ@çeD3½çˆø,Wªã]|¸€¯Û£3ȲȊÀ±ÇÜ€ ´ñdD^+Á¾¥#3Úmˆö3 ÏF.ò©Î@اŽ¥¹%*ÏOw@¾Ä "“·ƒNU ¡ÐV’ÐçìYõäÈH¥ ×Ïô5À´ t{DéìðßÝù…ú Å:2@Ñ+“_t\½hº @I("¦¨Ø™b R©P^ÜZ³I;eÉ8=*ëævq2¢Ý—74Íæ•‡4[xÒ¬®©:8° ®ï¸Axì[¦]{Ý ¶un?dñÙi~ꩃ{šíÝãìqY+¾ðÁ¦¸ÞnÛ,Ý NCWjeì5)§˜§«tA•}F‹ö®LJCêc·NDU2ËÄ鬶M2¨ïÚ4ÓaPT¥²†‡{¹ÐöB0é„„‚€"Wkí QŽ A—’Qì'|ò¢ˆˆf؈\‘®[Å€šY( ¦ @k\S0Ö Z/0DÂØ£ˆµEDz€XD§`‰ø'À U€Ñ1jBVS°Q\µA¯¨©\c ‚‘yÔø¯ b]Šˆ)ÐŒ‰„F+2k´¥IˆNR1l5‚aJE–ÑÐ>H:uøÐÕOGÚAo‰†oU ^7“³®L¥ cúîH;=Î@ä¢N à‚×ö\€=€aßü<[š3Ù6âÉ$0Š’ÆfWN6NžÖÝgÜql¯ÖºÛé`ô&à”Of?cȟݰÒßÇ/ düƒÁ :»ÈÔŽ9 +É{G˜,­ä\©ìb‘õ¸àªŠ/@B}ÒѧE˜¸²à³× tÖOjžâg»ÜŒsÅ¢>·xÈ൶5 @‰Î\„€÷-]–[pãN3„({B‚â*jåäAv hFƒ÷ÆFKÀ®ÎG“ºmÜgÏbâ¨4Ѐú$h² ºèaìó™ìÑ¡P´6Õ@§K­íA–ˆæ  (¬gf+]!í¹¶ÐP¾$µM‘qíûK4@´ÄÈûÖ²´f:(Œ D¡i½¶x Ý h©¸I0…FA`¦Ñ„›†^´ŠK­€h‹K•L™€,ƒLeŽ.»"3€¹6Y €QÅbZ=€Œ¥èÒY"‰#PÐŒi €"jdÎÐSlRÅÔlt#bøÇ:è…’¸0z Ñë*± •>J•DK€èEYæú[­×ÑédYŽïpJ”ú&Ë có `¼'@õ! á 0 >>'"£¶ g íC9j«¢öØ.=à 0íÅ‚üL´A8?r=`&~Ûòn. `Á·uä]ÏY?qäÚ`Ü%WÐ^z‹|)5ìo¼÷ Óy @rm‚/¡Ð§å¤UÐà];~ €âCÆ“!CK ëY2•]‹é&e²u/zMÜnð¬9ÀZ#P ø,MÀš „Ô6dÈ^˜4®7¿L+@Ф¶Ï¢œîBÀµUQ N›½´Qñ“ȱÍOggS@Ü&H“Nÿ ÿÿÿêÿêÿ÷ÿöIDCJZX^ÿ»ÿŸ“^ü×®sPM P®¯–X;ØZGEh, ‹`vÎ×q›ÿqvb¸ˆ©h¢'HP¤ »ÌÆ,lA%azÜØ?íz„¨=D—:T±~.UÀÜÐ= ºZÏrãàÞNCØ *aX·/ ‚dÕº"é(;Tp+†f,]êË  Õ´¥¡Xë´) ìE•Ì,€ €X ¢{ â Í€ YˆA€c°ˆ.ED­Ù €F#ÉAUÍÌ@@´zD‡F[  ÖÔ4€p°ƒV kVstXDX °ö>5¨¥@ô²*óã߬’h9…XdU’ ýXËØÃw»|x‘%pôzbn° °ï8jÀn¦ýlo(ó4àÆ‚Þ²¯J2Ý€^`Iöd¿H§§M|îÛž*# @ÎÛ¥gÙyiÅrmÞæ£”™ÐN/Ñ¡*øõáâCà©q“2ÆFE3äŒÁ[û\Ðê AÛUÛ|Í9äžqy pOÀ@(dPß@1´w~QBON‡S¼ßf2ÒôÁx©à=@¶±:Χ )MS(ËÑ `m3dõ€©„œ¨<›hÒ×j€ÎmIXBœD‚žÞ= }4‰FOïzsùÊgÐ@eÓÊë8Çk´)Ö„îùÑ¿`¸°IèŠWÉ|ÒE¥Õ=S@†ÑICš¬w¹ º(1:{ к*Ë,ªW;4®gKV­“£WÜm‹®g%. ÀÂZE5DW;€º$Ã3·T€Ì·p¶ÕP2R!ƒ^ÅPˆÀèQ €*€è6– د+ˆF5@Gš†£-ZÐŒv ¶íC12o ,F‹` *6Ú è( pX£Ó€T0°& ¢ðóÌ P‚Þ ¥d+ÒÉ´©UI{(F¯K¤¶üäÊÕÛûÇ+ß¼­_V—É›©Ù|¸÷Ùž¦=¸ðÛð®)Û€Ø~‹3>Ä<²ò©bGŸÎØ`^Ú‡•õx1•€Üy›hn3mG9o©R‰%@I Þlgï©Ù¸ƒ3—Õ×L¹æB7ß=hKÙH9ò(>m)Lc‘À$I3€wíæã=€ïU O¹ Fåü»­üæ~ë‘âjißz ÞmL•Àx .ŒgøÔ»&•4]À² €ŠÂ à† p¯6€Éðrª\LBºÃ€‹v‚hä<Àç©Rœ¤8€$@h/ŸfW¹âè¯|ïêWÔãÑi+8÷Ø}Xä"BÉÉD%Y©þ’¢²Ú <ÁïC€ÂÄ^ê¾Û‰n»+ˆBgö¥ƒdñÍß8T\'(xÈabvÏËxQUÿ:$%—>[Ê6Å(!4ïmž9ï€\È8Žã³-Ò@퀙yᨄ:Q0’æÄ@6ÌèÍûð!C.>7ýša?YÆø€Ä Ðå„PG%bZ1ßwðˆ"»à¡S]ͼ*‚Ì»ÒØgIgE²Ä@‡e襞n€ú[—8€!ö™µ;€š± 1gHåÝP”‡WEá€{°H’€©&ô| +€@,âÅ`­( °±Àhˆ€Ÿ t ~¸ ÀªF¬ÚŠ r žé\ZaTœÐÛœBnŠJ¥õ"Þ`š?œ[GK̯ZÉ€¢Nà]bpåh@n¬·°V9Õ§®”´k‡¨àÐÖÕg€ âÞY3\€ÙÓ-ÀFø\ó´rŸ8}¦Z] ÷ú<~6Ëðï·6ÞíÒ œ`þÐÍÄgH¼î2 ˜J@c— @˜Ì…‚¬ ³ÜtC}Ù0]·‘æÍ÷©ÛHö@ÖuÿÚ JÏéÙdñdûmF=„•§ï ¾ÊBç‡ß/©õ|üô| d ëþ÷çt4ÈÁõ{ÇuqÈ ' ¢©‚b8‰ësóþ­QpPõwY¿íú´Q9¤µÄ[Ÿ½L2€¤ôd­«¡:sK×Bi¨°)¼5²G@lxÂ*$cHyÄŒ9WcǪЮ¨å²–1%¢êõèÃPcÉœY­8 AzÐ6YÉ€€uuHõhÚ£‘Hmyá¦l ÄkÅ^Ę5¨˜€Ûš‚à$Äè|¼€ŠMª`戠˜Ö@~tK1NŒÀ°f-æ„Áh˰ VBàÀVU­%ÒV¸…S;»DC¯kÔ÷ð ¬)ˆkÁWÇ q÷YLrÖÂÍyñ¸ ñ2.|·pÌ élŽæòŒ½Ó¡~ÆT$ ôR"tû¼}ýxú#;D€xN@BÏæ§(RøBH ¾ ´­jPe˜UKët M~Ì=?óùiÐÊ x)Sޱ£† ªª€½õînŽdBª:=ø¿ñ~^AÒ+POÎ |º šo¥ÚµG?½xšrùë÷ë·AnŽ` ½ös,#ƒo=Ê :.eº¨ÊE]R]¥J¢( ™^­6˲,,Ò¬®jzAèʺ½²k•bÀöÊܯʜBuÁnb"²:Õ5C³|T Õ‘°ª*-($œÐ÷Ä:Á”²J9ª«r)«‹^ e±ŸŒÎRµC4¢gÏX;u{m‹hW±Lªîe¥³¡8æéFâr¬„.Ct‹Ü5,zû•ɾƒ ØÕ~¡K@Ü t€×ÝËãçkÀ¹^댹Ek¢¶¢zUVYA ¢™¬B »xC<ï|MÏŒF–/û盕űtmm|Ù$%z¸Øø eó³®+U߇t±øÓÓÖìüxý€±»Ëž~²ö¾äðzVÆ–"¢ÞÕ{¢VI3¬jU´(ohl‘ʰ°bŒé¹Wsœ¦q0M$ˆÛ'ŸãôPöÓ·›„¬^]Ó»ñ«²ÈÏL"½»§oD®…ùlq½>G,Œw¡¢IS…¿¹|×åE•¬9Œ$ ƒi’`zm–ûCþ€ú‘ÉemäNèº ¸æåŒ9ÚLY³4ì ˜àçrõj«×Jè¤û|#wî­Cö ¦Ý(^f!{3öæ/P0QU«zL÷ú^n {&îµÐÐÝöwÈI⎯' ŠID‹ìx?SóX¢ç‰î‘š.º×Ì`Æã!äâi%ܧ’6‰¥ÂØÌcG+ðhLÔ”¸ÍÆX’„ð?J(é^畳€1à:ú P¸ŒRb!¿Mi‡l;.l!¶¸-dh\D6ÌM¦€‹H™¹»Å v@…î¡•®˜(«Áœˆ±^~Œ‡ýú`ñûØÌjõ>¬Rªš™Ë@œ1t¢É‘ùߥ9 WŰ‚UÛËwöuǨñd­ëO}«.J0³;olÍ…;Žäˆ˜Ò*=4N–‰P€.N:iAEÄAˆc" =g^rÛ"¨`ªÈIFµ½½õ–¨†Á €«… éq÷‘²3FLÓ%#‚@Ü Q°8àB7nçgc&‹%¤ Ð>Ò¼ï•jÚ(T€[£w%««gäé˜iBÍbf¸è|÷ËÇ5C¼{5M‘Pœ¬aâî··\My4{’l+žöEÜþši84…†ƒÓDûä=·òg‹‹Œ#™,zFsÒKíeéÃY ˜&bd¹Ÿ0’Ó“ Ú •@iºòÜ¿0Wï àÂSÊÌ##nÀÈ!X @FDHÁÈÛ6Ìã‚bWã7‹½™{( ý’/ü¢ˆ‘Éð˜£h94 ^ âhCè²P#² ¼i°‹%˸Rp(OggS@&Ö`ÿ»ÿ´ÿ·ÿ§ÿ£ÿ”ÿ¹ÿÿ«ÿµ>›5p,§CPe#ÁŸ«M2ëz»?ÀW€WÍ–“-ó[ü3YÛ·uF½·¶­Ju5¤€ 0Aàv€è×>>‚ww.¼z|tš¯Ý\2zY?“Z¾x~–^cw¢“¥*ýÂhu¢ dk0{ë-s®Ì‘¤¶åõZxçÝ829;Q2ÆØñA'DÞFÙy¹f|Ÿs à.¥I"ò°ÐH¶nÅ(^8ki™¤$.öú´ ™²,œ(B‚ŒëÎSîøk©iCNçñ|ý.†Œ§™²±Ý¾wÐT^[xÓßÝ ª³œ“@“i±¤<0=ɤ ¯ìu´óSü¿é;»‹d×ff ÛìÁY*ý©_ÓÝÑÛ0âÎîänzÓ¯Î退=8æë߯IÍýçwåõ˜!+™á€çQMé+?Ãn«DO ¨ &†Ûšî|¦E6]/PEÞû©*y»h|†W–,RLÓ¼` ú‹•F[ òh)±¹ÐBÈÃMÛeQ)€ÀÿƒäÙ¼’“'•3Ñ{ÊÍîì¡È(r©£õËäpæä¿K“)‹3úOï›ÞLH: ò'“)¯%^5%¿íÁÆ6Í@´ô•S˜'"T +¤ÿÙä3þC#æ莌.ùr+ ê² ÞËÅ’Ç'V W›ôÒ®(¬2Ú,ósÈ“E¢çÕ^êï¾ ¿¥àŒ¼õŒLóàJ÷ÇØÇi¿,8n»¯¶­…Ñ2 €c]îfr zÿg®H~¼šé7Þ¿:9í»îAƒ‹%5MÇq AŠ>÷’jF 0{8êÊæµ¦“ H\• ‰ß´Y­;Öæ¿ÜM!ç¡H¼ãwƒëRV.­\íQW—6¾«‡hsÝŒ8¸ºQ8ÍâôÔ”¡:·*]ß¿;8Þãg¹/jDÊ–ù“P¼B2~o˜š>ó¢”JgL4ÍmõöžŽÂªmÁT”ŽK&Ù°L9{ æÙœOÜðE@NKRe1kïíêšuC)rQÆÏbó?Œ•sÝÚ®·"Op"€þg¯ÚÅf ÓnˆŠjoWoªs€F‰’œ“•Y¼?ÕepâŒsº ³½”2ç›Y¿úÿ½î-&º¼_ªE~ƒÔ Tÿ èd NJ§(›êËDËÀmÕ OÓ‰ ô» ›–³Ml¨*BîR?kÛ`Þj`7ý"Ö댬[§ÁâèžËÙ™Év³]®é\Ê€g¹žçb¼¼Ò£ðÞÙLS–3œ ðþˆ\ žŽ€€ýî€è5ÖÛÐÃrzí1½QÊ;%H’@›AÞééòòí²€u˜{…¡2^]wªúí†B¥eœËÔ½‚î™5x½ç5Vð ½f‘A|To¤C@[§6Éh/ÃÀÞéè¹z[g¡èÑQEŒÝÐÒÑ  øè¢ Fô‘ƒ@mLxÉ×;¼ÿªGÙ‚èØ¾ÚÆn¡=“¯ë4° ‚ I8 Où÷ÕAS¡h(‘ð Ç} ¸qøþÇÙŠsÑŸ÷h  ` ð1«ˆkƒ™t´¢Io$tn¯lŸþo†NÑI3ÃÝçï5!aš!èýSMþÍÛN„‘äîn¬I„@\XˆüË•kÕ¹|÷L³7}zÇŸŸ.gÎÌürƒ˜€Ã>9qŒJÎNȶÉß îS L¯9Õk}¼l/ÐA%)Ê ýÕæŠAÌFø[ =wÀjó­$ƒGŒ MçØé–@]C@Ÿò{UDÀQ„,"S&›–%¼ý5w\P ;ùm ÏDQµ‰¯ÛZ{ü8›~h¼^¢ÓÀQu8=¬åX耜Zn=.Øö)²Õê’å¸$ Ê´ÿºó–Ê¥ÈÕì äHã#<¼Îkõ!ÎΗ/”9îMÐqÆK¼÷ :Æ#9t ÑÀÅà÷ìgýóÙ™§}C€WË0³ÃQOhÞ4Î>{Š ë–”kûvH/75ôÝÒû¾ÀÁÍÆuþ¯Š¢ö¦ëióÇ^ë9`Z¸Dôƒ!ðžù»G ¿³Ù§¶BÖ›^@…›¿žÙ-Jäûú;{xN éÁ™?k Zhbïè^t1Ô3Ùºyo¹0ø½}ˆžM²{¬çJ¤!†Á£¦n½)~=éx€¦“ɬ &SÖ$qK•3M^9U‰¦eê—é§`H*•YÉÀÈ͗鼳Ʊ*RÍ lÈ‹}?&€æ,]DggÄ s³¬o›É(€T²[21ÀDi£Ø×_§…´€  ¾X* ¢H ºH$.°þ«=Ü5ÎÄ@’ùá¾ÅVqKó <‹²,^Ÿ§6€»ƒ®ÐB$xMŸ/ ¼‰`ÎXØÜÚ XèŽmn^´Z³JfÁ p1 Aдõ·˜™ƒ¶×Cø¼ù=˜=t Ù»m;“¿N²ï^çpB¯¢xšù¯ºI¾6™<Í‚öÇÖQ&ÉÅ—GãƒÄàBüqv•ƒ«)€¤@–jl§kݪ•úP@!ƒ(Tƒ=¥ˆß—Ï ý§½“~[j¶n™ £ýoº‘_DRε>'YT²:ÓP愆7£^$ÇÁ×û Û3U–4òéäq`ÈíÖ©ý»%‘ ±Èðxn‹‰Žf†¢^å4Çïì˜r+ /KªÆääYlÖ¼¼ÿ1 M ÝÌÄ0Ëaßyù ÓÃhºÈ¨B0}=µV¶¸š¦öá/7x†Ä@`:(èi• ¸Úæ\=R>•Ž Æ©á€£¤=cB8€H`{íð’ÎCe ³Ø&žiZÌEÂIrÔ|£Àà}™dùYÐÀfÝe€ÌÚúдñ~ 8Cà¤=÷«ïÉ‚q®bàš×¿´)§Ë|úctµÑµ9øôý@€¼´Ò¨ž@÷x›ÎÝ @Ôc]Bèmw¢Ï›ùÛüR€Vî2â!ø G§?³¼èKQó«Åÿu«z»v2F× 1L²x€|jsâT¢8·x8è™Æ¨¨ˆ6ש”—o1ÜF`+©1ܼáF_ãý~øR­ý`1SõÊXWéé} a´Öyá`e¢ÌÞ°=ÜY¼¦`¯/|»ëà s7@]ù¥ù±ã&ƼYÇ{nZº&ʃ©ºbØg­½Ñyšu&<Ú ²Iˆžñ%Õ¾ô½²„êlÈѾNCÔëd&ï{‘\½ß™²y>8ÓÁ95§]ÉqQ cªÇe°»Iò Y]0—†¼EAž\:&¡ç´^OÏ0j†(€Û7§Òº°@Ú‡k×KšŠ@Ä€P΃ ¬¾‰•ê=%'Š,«W#žñX4ðøÜÌׯ4rûômÏ£ð <õŠTS5Ã~w€ ÇB|•n`Úp[ž'É™[³,\I’‡ ’t ~ñ/n¶¾Û¬ÞˆÎç ч^É[Ýz%øì±J®© ÉaÌâæÐÓže.9CnËMûsØ£ÚÈ¿$^3äôòxû ÞÍk9´Û.øà35«ÏÆ–÷[rAó°£€¶5-¸pH¥™åýaÛÊUäqýßœ“U¢FJd¤i;€Î|2i;3`l=Øþ¶h­£S¡ûª€ÚGáî|êbl ,oùáQ X, ÐSwƒÑ]ÕmφðvVOÓÛ‰ìГ€º²Ò…ó2*—˜£‰)H“pVÅñ$îô)D‚y‚Š-:Ño4˜³½y,ÇÀ¤cskVæO>ß "#ÉÈ€uµºžùÛ|w`‹S.ÏÑ•“SpYï@ `Ðü}Š>juÄ3“‰…Ad^!ÿN§™+ pT†ûŒ«ð ?[Ò^q HàäCد3O°¯- È8{œ¡Á~6O–õ¡Æ.y¨L’Ž@ŸáÔÿÎf™¿nŽ.vûÓýÀAð­ÓéX€œF{|“—÷ƒx@óŒ5íçš_ iÑL<Á˜° ͉ӒfúšÆ€èÚ\!{PÈ–kPª‰à=@  a·´€*צ ½²JåÖÑùÉ¿ç´ûÿŒN]ë*˜ÑÇžžJ¶à`Ÿ¹C†—@¯ûP°øÝ$0„18Íð$ÕMyÇÕÃ:Yîj™z‚Ìd›+ÌöNl;`jí9Ö“ñ”Ä=  ¹¼°uÚøf‰Vÿ‹Ùi¶‘Ä1’ôºecCž”@Bø~L®?uš Ü»Z\DÜò÷qã—›‰PôÖ²±·ÎEŒ€†ÊjH‡1`˜:ÅJa²*!NB“™C®}7ž±=¥0Ÿýç>àÀƒ{Ð3à=€AÒ"bÆ6ˆo@P¹S{®üC8w¬Ùtæ‘ä ié2¡äÉc²kÌÔ6@®ëÃØiåPÔºÇʯ“sÑR´”ÚwR):‘ɳ„^ ¡t‚]£  Ç}Ë>ûæ;E—Í<¥X$ÓVÜLAgs9þýóïžÒॷ?/!>mHÆ÷dB£éèPÕ ³eh  Ò¢X@Sî“/þ¾*‹òR1¼Ub¢Æ¶¿¸ß‹&g’ ‚šÇXË4 !{¬ t|¹go©b†Y ^\[oKÒ›zЗp„÷ÓìÊ @4dzþPº BÜÀDe…b ¸ÕdIg”Åïßm.èJÒ€ S¸SIý^T +B83OöGª-bå 2J2€ " €"£§{@Wª (ëM.ÕdÂ`E–¹6OggS@(& ü¼JJKYUVZ_]ÿ¥ÿ•ÿ˜ÿ£ÿžÿšÿ™ÿ„ÿŒFu/ÆAç’¢c•*|H;e™Ø–÷è¬öòac Àc­M¢1Î.â—ØÔeTcÎÃòöi‘åø‰(T­$ª–WžîJl&½ŸÊ¥K™(ö—:Õž¥Q euxŸ<®žÝQ:•ü5xoSEUâ¦ø™Ž$çX»8…ÜÊEx ™îbùÕÈÔ9û ®l? œBÑ7;ë’ÆÕeêySdü`yîÃõٳЭˆ)³[ñ§Ç93­,¾éùðÖ^N³_Zxs°¢]µVÌ^ ~ŸT-£Zð0”‚¼60Vbצ˜ÊÚ lRu‹}ÉÒœôW»P(vƒ‘æ!^ïülýËu—]Û5`7™]~ °²H+;DTµî)‹Ý¢÷¨(b­v J@Õ©ŠFÁˆÐÚ!F‘DѵÊJ”N1¶oé"xÊÁ6:•ÐøNêâ˜Ë{•@`ßÙð¡•sÂö*ôÚ5+G$ϾùS꫎5¢zTQ´q +@‚ÂJVZVÙ¤;?Õp+x¥4ëkÉ”(ÄF©„BGÄ­¥òÌŽR’ýÐëtÎëÞÖ`7÷4ÈÍû –yì/²XW)&ƒ5 #ˆ¬5òø¸ZŠj-µêî(=޽ñ*EnõEN"GJÓ ì^b[ž1›Ó+µ] ãÈ£„À 0ã{/Üþ3~ŽIM­ÿ¤rU*O)Èwƒt Åå~ººÔR|ì+mÙ¥`$?YÈ`ošoãBïá¨öœð©ø±á¢Ú¾ˆñˆ—¶g“7A›ÊFwµÒ±Mù¡;ø¶ŠIPèàS©åÏ̦ŽGªâVµROumÈp®(VEê®Ô»ÚÝÄIû¼ÎÔg •³´¤ý¿f,j±oªÕ'‡¢O›q”bB>ç¸Û7X¢“]Ç+çJÿŸ÷ì9ï!cÕ늞£å; /I­>ÇcõÜK]+U¥F²¥X×RKû*œšv…¢)éC ¢(BÛˆ$pƒtÊ(mSa:GΉÖr{Á²ÜVlPÂ[mÂ2ž"n·Á]ÈË*Ôˆ¿TQe¨GL–5K-£xÿ¦Ãuç+¢¾ ¨!fhSsOBPIO_ÑæýÝ9`™†¢²ã„²²:ÇjÕ&»§Ir™‘:; zÏ=Sw1¥¦{$OªEÁ@÷<Ó5='ÙÃÈ%n“8òW~BM²‡œ…$P¼'îVO ­® ®ÈGèJéJh­ê]N¦°g¯H–é&†ÒzxQÆ••³°Ë綈Ö#Qc(,¸ɲ‘A6vÄHUöI¤ ((R[¹Õ‹1…_l;ñ,ú«$Hù¬¼÷Q1n$übA:TyزSD /ÞÜ-µ€ÆÇ¦¡L[¬õƒrÓ­SâØäd¤©’£ÿßö¢ç©úìH¹ç£¾¢f"k­­¤T¥d Dn²¿t¶Î‡›ïm‡¶%ãÆ.®$gpwÆòñMÕ˜«å«•XÏÕT;³C°Òy/×k(T$¯Fy.¢œMM)E­ªÐmIE:ÉT‰:–V!‹)×N Ô@Ye½ºU4å2 Œ¤HE‹ H‰¢‚Dh*‹ei_E0X—¨TY QZTö´U}v† ˆ82V¥œŽbÂÃPЕ"'õgfêc[òÔ•q•¤ŠJ“MÓ.ÄQÑI*R"ª"×—'B°†+ö9RÖ‹V´îÜßž¯ÎJ0Á ““U¿€ Ù³ÄËÀ ‚îU8) ãôUîq àÊ+ƒ[k[È­³ °™Å+ h Ë–1ô /F€À,vd/ #‘wªPš@ÿuYà£AøM´tQÅ4ŠÊí+¡»,¤´_æK&D©@>ñnº¹žÛfš:¸ÇÜ&§4 "üy?Lèªq8Dy2RÛø_ë)cg ¦«Ia»°Œ}zktmÒ6Ô¤š“ìFÛä‡|F;ó˜>W]OæÕòÑá8ÞÚrĈZÔÀk:ŒLk0”TÊÊTåÜL)\,O±42‡ 0|&†„^Ÿ€é”P3—RnhÚBfêæØ ¤,´QôlêC5 š¶A )º‘Ð覄ˆ1.50t¸ð 8¡ÚÔSŸ³„AŒü3 M÷ KLR JÖ€ г»Tg±œY}-ߨìü÷.ª­ú ³éê3¶|´ÙÎÈ÷ß/%AÜÍîoAÿ*¦öøŠÊ5Ò"¡²¦ëÃ3$޵}sšŠ9Ý4!æ ñÒí¹ê]è)èl †š¬:R4™ÇÓ“­‡N’äm z7ŽYœÄÏdEÖîF/PL×!ÀßdŸÙS„Ea*à`þ %;&—(–s” ȘB"RAnŠÀ€FtHË_J&€1‚;¢)4t{pq¾ËmbN`”°»ÍŒq ÖÀM¢M$Ãê“_\cÁOC$Тvï«"?F ¯ Je( ¸Ù ¨ÉAî;–A+?@­0úÈî™òãÀdn¼jÔ‹  WZ³ðä éHp‰‚Y”‡«m2š=bÆÈ2³E\ñÚ]*ûÉJŠqQ¡x¢»(,C9±§€µ²QŒt]Å‚ ¾Ø…X›yI¬„M”gêI|88Ó¾*èNìeÄ›‚´½În›¡Xª½f¸–ZŸ4Nah*áÓ›=Ö^3\H´a3ªŠT­¢=A=Ï·÷ŽºÍó÷`ÿø©'ÈñH@ Ô[Ùï \ˆIêk3M-ËZj‰LÊdK³Îœm:$..L%:¬¬IÆE èÝ•IgÖJöÞåö昺¨–$‰éçóöõÖ² ·4^‹¬È&ÂýxaÆ ‡í+{z™ÞEínIœ0¿+:lxÀÄŒm´J€¸~ÍòýÒÚC)h)T!TÇš03‰/ ƒ¡A6%©hn•æ@BbüÜž i(Þ.nŒp§Ña˜éÃaþDowó¬?M0O†^þ¯õà€Ä q6×­Þ[×Ö*}]1 1Y{ )¨·÷?QÚ7:ƒö¨aI4 Þkºì/Çy ˜0å– º'm|È Ò7d7‡ j§lî (&wqŒ´^×ⶪßZ¢Sêâ~p•~X³u{à‹ÍÒ^oÎ)Ý¥Êk¶k&×eHåO¬%ÂôÌh'¤S6¤Š¦÷-'ޤáëÑ’;¿». pH] ÅÚ ˜“³ È¡ a€Œ'’œf†‘ ‚ã–¦PŒ‹># [ÏØ÷>d&º¹¡ˆ#RÖºe˜ì¢«Ò™Ðd†Äv­•Õ‹p*`–Ý@$\¢FÀ›6Õ“m/CÉÖgí¬(\à¥|€$ÛÁ*ÌØóæÝø-eu%ŸÊJ9«÷™éÒ´ã!TìtVÏøÇ8{#™û dˆœhŒçú޵>$B»tQ`,Ük¸™i¬5 …°, 50@$"#Kùíå¾ëmî˜{LD&‰à÷›â6xðø ° qóæÌ›“D¢‘™U¤«84“$ð€}à@­Ð+h‰q=JÆ3bV ¨µ.¡þ…£øÒ˜ÇU xjÃbVÉ9…ÑÊ íÏÈÀŸ)u`íÿN•mßÊ\¨G Ɔ¨´%2Wí¼G!u¤]ßoiŠÀê.†³bRìÜ•ð9Ð 7ÇŠ»v&ß…;—ìl" ˜µE ³|2l—T<É⩃ ³àzcQ{ÇzdF@ÑRÃÔð²e„¨ùn9ôJGF0GÂýü#wMº…œ •I{»ÿ·þŠèíë»svÉC“e T"wSù€ªºæ‰Äθ{ ©êÇÇöÇ9†á”[—4qëE<—[MÉÝë.Šf:5güf§JÓ¿²ni«9^Ø#”ÌÔcö‘J¦ƒGH"’%±åÆøÁ’²( Ñ ˆÍ 4"KBwB—I´<8’R²/Nþë]Ý(½Üj–L0ü¾ØÁ܃´ ñ4„…¬,ûl>l.…GÕ†+&V— ô:’€ %@ƒ-¦8¬ý ›»Ç„{W¥´… |sÎd½í„Vxú|-ŠP6ะ%må÷Ð9Z¢Ñhí$Ãæ1¶ƒÒNŸú¸ùž# ™Œ2Žð¼}êc# ûQ‡òÊC Š$bجC¯ü~q¢PâTÎ £Gì t¨¤ jIlhíp¨«Ê[`zQ @ÔSG6tA%·|£Ô½« Wì 7Ðs,!Qg·ƒ>nˆ6¢ÝÃŒj¦U d…䟣#e¼Ôqè °µXg‡a Yºú¸H £v^1Ò^Õ ²g¤Ñ…“ÜÐ^sjãÙº÷¡•$$²m’eX,4eËm¦Y-ÃbXCÉ´!€wŽ f<”xenbðb/€ˆÞˆ±ÀŠ0a2‹…6yúÆ„å ÁáZ™.`" °ìÐ#°Ìb(C‚jžë­zoˈLRÃï·úkKoàãõ”•ñìו÷Q­4‹=<ú¾,°ogƒù‰ÃZ Q4R¹.Óbìâ(~hÃŽ2N·áXÛ<›ÙH Y ÃÞU™.#B›Ç¾á2A^gÎJAʤe¼m(TÍ™ýÝö¨ç‰Æø‘7ê\Ì—¤nñ´Ïu€åøŠ`‘ õö,8_×±3³NnÃó`ÀGC®ó\ PF> kµ(wp .x¦œ¹…ÉךX4k7áEâžžÆþºuw’8sZäÝô¦Â:ÏSÂË‹{¦É ”pÏ ­N2œUÁü4aÊùÁÙ‰¹²Â ¬Ql…5±ÚL2ëLÀH=À˜Ü€CŠJábrŒ®òè"æTɯJÐ(¡m2Šp4 Å´3€ˆŠôÂF  B9¡5HäR0 +,Ø©Ï&B!¸ã¸IS÷õ’“¤ST 2ô\MyG/~ëÅ5N“ëMæÑš‚ øL%;è¹ÿ'_öC‚À 䯨3ÑQáÌ×u"Æc€ =Â.²k½ñßHe !QlNúÖ3’¸™<‰ž|–-/2äóÇ«ú4šMÊ-7.^b Ÿ¹4•åLaÐ,tkT,œа¶Öz´P‘(ÑûmA­wF+œµ~€[³­#Yìðé•×ã¥ÐýÎ@ÒcG@åú¯ %!¦µè@ûÁ}@¯kÒd%€"g žî¸[vÚnÀ…I† 9(Ö8Idà’.sþh&`âÌŒ²’ÝÐôÔÇbi =´DKoˆ€™Sõ|Ù#«Èß`mßÝä÷_ª‚nØ©û|¦7Ò 0P¶h?–̦TÚ˜vE†Ê)• Û@Ö­ ŠØë=™$¹}Òà‘JQ«2Ot^Jv„Q,‘hÄ Pà…¼ €°©ˆžëmþ3àííV÷Ž÷fD4ExŸ9|ö(Í3ÿ´FSð `€ ¶9†WŸe"U³`™Ðñcãìh®ýîæ À™€2 H1“¦~I¦ÂÑW´¢F‘|s !׊lƒQ¯ÜÍÙýá2T4Oøãñyë´&3¥(À«­9“‡ KV@&ÛVðÈC¾?!@­žãñ[3·>-ÔÏwÀ±8[€Ô}‚ØÖßí 6éø…ü®üÚ€ºèÿœ“ ]?ñÔ IêšÈØÁîI¦`c÷Í3¸(€ŽaŠw¶K0õßGìO÷EõÜ-Ñ;.G£†. ÎÑGbÎ`@*‡i" Ù¿îm^]0xž<72ÀìÅú5'’Sì–>B¾=É…f¢c“{?µüªÿ;¬g–•[#ß߿ܿ3oO   (h¨?0oã0`6T„_ÚX©¶¸2`…ñ Þx 0b@Þ}ÛQvê¥âWÄLLÕZv—r ùVm‚óà€û~ƺ‹D5,j.bùIß+õר%‘`ß jºÈ:þ$Íp’ªúY(ÌJBÕ(&š›–ZÌm«{dæåßþÄ Õ{{-ù€ÕƒÊ3Õðàê÷ûጔ¼WãÏ{‹Ò|pB™bç¶Ý¬ÚDš8¾÷  hnSÏNcR(‹yŒªŠ¥¦¶]J\n2u´†,§¾èî’ÜÑù:s8ísÞúÕwmÏîwG&@·Çx] #TŒ·®Š9kxå3 ÉI®ÿÇ p˜·¢9ßÇŒ=>YÒádê¤^¾TBEÃÙ]S°íf2.Ïo›‰ÏIh  ŸzæùO6F3Tͯ™ÿ)ÖÎÎ.ð k®u¼ì:ÞU1ß:™ÐÅ î Ðu±îÏ‹ÕÔ»èìéˆlu7Õ> Ü0dgÛÝ[ż³¿ |4&³j§Z¥jUØIlÉHh‘€Àâ¬ì ƒÛïþDÜŽÉë_ªunùò¿!{­æL@|kç Øª‡Ø¬.ÔX­yëHÊ—¸îëLoX_óý¬¿‘äQ¯9 Ü"”n=?ü[Iêsñ˯þë…~¬`¶4_Iý.Ë o9„Ym­T¸däµ9oû\–Øy½<§¿U,õñŠJÜC¾u•4€¾€äŽÉ©ùZÕúöK½†…ß.æ6€\ PF‚.…-{çòÓçdàúw4ÿöY˜yâEGÕÍó–úƒï‚™({*6ˆnÌbÑO Š¿¼é6¡[ÿkmÈHp›l.ÜqÊm‘‚)$ÓU)ôTÖïÇcO}éçÞÕðù½Ï0û—ûSÀãL¤¦øx´‚åª Ö±Ú|äzå“ëHÐ;ïhU6ß8t|óð€¼˜"ªÚš» EF#ÃìÇZ©J[-}©^52®z¢½†•½ ½^/93Äa¸Ø£KRêyž§¯ëÊHË"¼RѦé‡cg†·ê&Êg¿O.ži² ¹1„€7­××üé¶®rÝý’Õz_î¿êÜÛï=G\ctyÅÞk”¶ZѦ,ÙÓ··6ú8/¾œíä9Š÷êÃI èwÌZ‰eÉDUŠW+ÅAAõ¬ØìÈ[L‚×±‚ýj51™”Ç:çS-NûJ¢ø÷`¥üã8s”ÅryðTŠ'grªƒyœFKçò*îe)Ë"ÆòVqŇ^PÏï+Æ+ÛÕÎý€„Yí•jð@_`‚´÷8åñCfö™û>Z™yÝ÷œAä»iv°­G€ÛÚuŒÖ·SÔª¤h7ZA€Œ"Ò¸ïsò¿Ð¦ãî¸ÿ°ýîNæH–þÃYÁZ³«+Š÷ˣɺS§I¯¸hYçºùš¡ªê§;žåÉBè&{*Ëci Èú¨]¨Å€Ð”x©èøí{AÍÐõâê2÷ô=íóØÍëæõá³?óÃbª»§ø6îe½š‡š,êîî*Ò¿×ÿ™,ÈBHC‹šg8]þ÷óÃ?“÷~<=üF¢é¹÷þ Xºömš„Ýð zÎ’¸Îžj O¿ãW&›Ê:Ô»4sÕÐCò­ÿ”Èqw6~0›L$óö†¤xW½oŽˆa˜&EEoÍ´{ô¡®ì==T®—OÃy-*©;×àç05y2—BÏÌ{Ggܧ$§z–fn_ÁÙù¸T{ޝäÌ>ªdÞå1ôì[€cm?k$@œW@EeCÔQZÊ ´À¤ A¿o6ÛØÐ안¦aNd×üå ¦‘A?Xh€D¹ýÍÀbe^€KË h‰·n@˜‚‚¨©É>Ħ蓺/E0üª 1ÜÝ£ƒ^ªâô~¹sô@¼€ Ý Ÿ Q„öï¬ÏÅ!šxUwofò(lû…!öð8W?FÛ‘´f¦ìª©IH ¤Û›*»QçÞ~œÁæËªRÏoOï7ÏÜfÐ,xG£'Ëæ°OBõÔÊM'9G@¡ŒüÆq¯€–œKÙj§¾p&n­A}Óy¯Y§ƒ ´ÏŽÀì  ÕæU爵´1ü“Ów#Ç ¥þá$aíü^£Ó»a­Ÿí!\†óëþ/ö˜†zèØ/?/M/¿åY+Oâ¿ôo€ýÆ ÉÀñ5èöÄRQî»4ßÖ[M­aRèulÛ˜'¦©ÍN†œÒÌ ÀÑëõ“kiñâ3P¼‡\×%0²é ï¤$Xâ)gï¨@&ûn.!lÐ}±fU®ÜïÔIú!ùe½5;r@w9w³Nc"›y3ªIE÷d¦€[¾Ðcw¸ÒßÓWw¦@ ÿdfîìf÷r_wö(®ëpþ«}9¦nîfQô³aH&:X&òëýfû;œ_lÚCùçyK å“K‹Jh{@[lI; r#`¿i²¯«8sŸÙç0™¤öUÔÇÙ=¢fÜøœöÿžÓ)çÿ¿ÿ Ütí+“}è]¼î™ÐPœúÐYˆz>Ÿ.†M•• S`ÅîüÙg*éé—Èj÷Îü¬™·ÑÐê®u6†,`äe®Ž8Àe"ãþ\yÁòÓ–R_ X>GˆŸÍÀL%Úÿ0ð`VY§0²¾€Ë9`Æ_"€@ç_V†d ‚—È0 €JÀÄÆV¨™ †& ž»=dJk Beo“Ëí±Ç»Q"ÀþTæ‰d·úìßãX®f!/,®ã4Mþ:¶fm‡NkÃ( ôû„öR£"iú¼…$p_¡ôãï\þàÑ@áo×(sÍã@WG±ŒÝë—üC€úÚżïÐYо‰!£Žâ ZpÙÛþši\ÁEQEŒx¤AÎÕÿ·kqqÎa›RçSé=‚STQ]È‹§  —®af¿0ãk›Z˜ìŸH¤ýE7l³m¹ï%»†$)<ÅkÝâz9?îþ>z×é²vMÖÔœŒ¥Xs&e‘s’é=¿²;³.ˆÞŸ—oö«5L›76EèseW7IvµïyÜ'<¦¨)¨ÝS4DP`Þ"&ïþ@ÁÐHYp*½dí¤ªa&W3ŒFæ{=†}†˜€kÙqAî—æŽçïz‘ÜòО:ËdÎ{®Ý½{×ÏhÚªÍÌ€þìC» @Þÿx9ªWÒ ¢F€°fþþ¥©I°¡YA€46ýŸþ w´Y$FoAoh.ƒAŠbªÎHh´Þë=ôœÙgv»‹™R}Ò𞕲Çåü;ú]OìMþ^|Ø,a ®aáhƺûú6Q£Úˆ€ÞvçJ·î=vãÚKèÕø¯ìÓðÐjýÕWïóæ¨"GEs8 Ì*‚LÛÏHð‚Ãi&xÈ¥=ñÈlËéÕ:f‡8ÂBU×<ì»ÎTLÞM4z–À-?êÈj ¿ý¶O×s‚†©}Ôк}b€.~zÓÔ,w&USôö­Âü‰Ài–ºZ™yD%$3ÇÞÌùÇHºÂ¯ç?%x¥¾’ÈÝbnzz²2)enÿ°Ñ‡¿]”ÆätDg%ð$ɧg†ÝËËÔ‘½³Ú`ÈH'óÍ!;P¤Ÿd RÎÊsUÞ P;{Õ[LQ @O'5•ìQ}÷ÏOî` ·@ó“uQSºZˆ†åî þöm^/ÁƯòpœsº;»v  ˆh9å¦6•ÝCò“ôœêô½¬#¹,/6sVÕ(I-K |ÝŒ1cùŒ(>m8(@@QÀÀc1 .#0¶î4XFSP6ìÝÆm¼/&"¸‡»gÝüÀ‡}tDf¼º±Éœ­z3&{SüŽo/p x]¸p€—ß¼EëG˜YÕu™(9Ö–Q?ìÓ.»Ûõݧ%¶%UIp»a,Æsu–‹H«q® „È9Gx˜J´ñMõp°ÛzJ¨†fï¶+¾¼|SM5eÔ÷/Þqzêye+˜|±¦Àút§fÍ3ïNM&@~]MeAÐûÛ‰û³ÏéÓ±”ÿ]æ’ž?ä$Žê­yæyö¡‡ Ò'›fŠÿ"î=Ÿ£(—‘!§sžË¤ádÅ(æ*ó §wCì÷Ï› x)qþšAoÏ©,OggSs&"f˜‚P‘ÿ‹ÿ†ÿÿƒHcgÿ®UWWVUWUdbhfZcbdbÿ\jáîùBõÉô}ÕÞgÃ4“3ÝJÀ®ÊÊ3ÞØÁÃ`)Ññ½›\Î"+ë0É îêßórý÷±ùöõMûK¾—_ ÷“SÍ?ŸLƒ{ö×~þ{çÍ8w²î¬ÜcŠK1|n˜UiA Ü@âŽ!“#Ô À/€14@G8à ¸<>ôWèô<ÐþëÝÆ[¢RÀ›Ûü=ô$àðàZð»ðc·­y«µÑz5ŠKd€‡`ä€y…ô1„É’C#ç±Á¢®+Ç6 ü¹Ñ–RÑ\”1%ãåqÚ¯C tS6D#ûž(£g;ÉK\¶óŽ1CAµfƒ&¦È¢kd߯bÄìèh(‡æùÿ»(¬åO <¿ÅÅiŠÏÆiðÇn•µÙ*<ß›¤Hg  oRRÉÏžú_½±ÿe–ާ³{ªè¨È €ÉXb’®ûu¯š»=Mþìl€©“š.²Ègº‰ï„¡99ÀЈ)GùÓÐÿÏÁÓ"wÞ̹ãgÏ k"®‹j6Cý©CNù¨†a¶Â­úkcÇ,ßëåGê86øj¹£þLU"ÒšdW÷ N»$;«={þ'ý½×Ûˆ?×M ‚ë·hœñÖ}³†µ0£Y R`\ÑÐîŠfØGç}ߎ£", å$ðŨ塭AÚ{|^N6™~Äw¹xŠ;¦ä° “ëšîˆàÆäYöz„ï~W°=ýUЧŒÖ Ë€y~é‰ï¥Yß+ˆ¯¬+Þïh‡CAò±k¢€éÙôªÛ.‰¦üÛÕ» 7‘@ð.íî…ù¥‚õQͳ~ަ&3Û¦»ˆ»žìxÿN"ØiÏÄgê²æ» ȽÍ~²¸qÁ©w×ã÷ë$ç:IQ ‰€¹+øõPyÏ“LõÚÐy6tWÏ3$y>ÉÏUz*QBÂ~®½ÝÙkí¬¾6@Í“§.ºx&-ÖÎ{³“@SK.²>Ñ‹oî-uŒë~ÛP”HõÀ˜àB!c@³€,„MöÎÑtâ©ü@'%ý~D–êôORsÜfÙRÜ”nú+œÿOãQî€|¸!‚m?“sõÖ6Df5f‚@X2%öMR–06š^Uí:šCl·ã±÷ÙãÝ˼¯lY^ñ™&°ôÔÍö»gþA7)6¿¼eH”"«#s»Ü”;Ò¤¢J‡ˆ„ñAƒ µd®oüº 0Qhe×É4h³·@þäÅ3—:Tûv €./u ²c€üc¿ÑË ó3_‰Í—Ì "r½ü,“ƒrYEC×8) Õ®^âgΨ6䈗ÇÖtöÕáúÁåç'¾ÜÓvSóžêšAL‚÷³épæð$ÝJLm€É>7MwMWÍ©Š˜wSnª‡ÈßÔ¬EçË'~šÎj×]?(þ¡cÄž™ÂÝ¥|uÆ=ô6À[ÈEÕÏ<CA3~3f¿À½#èœýÅL[¨›ìÝZ¢UÝbv3õʱ×sb%"(*S¿ ?" p~×ôŠó7àœÅ¿d­8~)ÉþF¤ó ¸)z$²I³‹mçqZç›fï´´óV¬9Êঠó3²É:—”¼Cy›Æy·EW”ŽùlÇõªí^Áî4PiÜøŠÅm`¢aæóß?cHГK»)»Ë“_/¼½óC ¦‹•þV×J[]*‹UŸ5Ž×uõZ±\~ûÍåò,Ëò,®€LÀÕVĤ´vY2–ÎÜgøa±öÞrÝbhŽÓ‘±È÷4¼•!«ÙèëÝÙ°åEn~¸EÎÔöh¥ËÉ -A úK_^Ÿ”ÛåGzá?®%^n‘Öµ»¸ßÍþùÅð«Hf½`xþ>ÎömRª-D‹t­lê;K5½°Ý@O· -æ>¤Arù"ÃþO±ç"„Öù´=9™³`ŽšÙøøhuê#Ò×À k¶òåñ‹‡{ª¦Â‚„«q»?_Û €c„  ùÎd£/SÍÐÁñ=9ƒ„r5ŒN´â¦¶7³˜%Êm[xÔWý§Ã}×¾fíhþk×µ]Ûµ]éòÒÖï3ÛìÙÞÛ¶P(¡ÌN[óOeùªôXiœó4᜷nTb¤N)óìkõ_°}ƒŸaœL©Cˆê°na×F¯ ´ÈâbZôÙôE„Ø¢òL"é3Jt†ˆ³Êä)¾@dŠÚ&%8ÜÛw˜ß­ôÏÁgqÝqò;ýìbÖ";:I“MWwki®ìŒr÷µä¿æ;­Ý¼¼åa—-‹²ç/‡Oôî»_ ]î‘x7fÄ^½ÍÄ521¸Lö>ûûÿî&I’)àû_‚°f3,Ç)þýîÒç@”ŹÎ(àH”n¡³=«­Ër¥ØU·n©åaT»Ï®¼-–Î[©A‰L$À=ýHWYëÉ.ëç™>ôþ²‚ªµëg’¨s†ë|’?2!è¼ûtûÌ' üË?Þ–²û·ÔzUcvÿvÑŠ}¿[mlDªmòb+Făÿpuš• y&` AÜÒæ3£\òEQ}ðç7Óɳ>å¼hæíOåßœÇ=ˆçTüþèO—6€3_+ìŠó\½¶ÿŠnm8,ÌÓj7–)¬’ðrz œ´^£ë£kiožm8Vm}xÝSÓÚëõúGüÒý—?RÖ]\ Ñ,Þrúæ¿QÞ{ÌzÍY®zð@±ÓÛíÆÁ<›Õú›¼bªþ%²dÀpHÛœ™ZHó^3+ŒPÏJõx“ö=ì«ÿ{þÿ+{jk|c»ûÞæ€½´±Ùôk@ øãaìŠÝ*?{Û'’[ìÞ»Õò»«F¿Š¨bÌ>ë~fb Š4.L„Tö¯òVºR•qušÓ}”¦î5F¦øŸ*ïýýu(ÔâkÊN]}F‡Ÿ3ècõ´¢ðÝ*ÌfÍ$=zzån1ú|ZµEÛ­Â7¦bè~:Ò¸0˜‘ àc€Ò›nî¢PmJ–ΗîL3¯2 ‘ZÓ„ŸÿáxOÍßUÝSYkú>Æù¸/ÔŽí\à¿Ý÷gŠSo·k&uìUöï¯bœý füÌpµ;¯vˆvNaé;… HÕ¹uo¸¤ãpœ~ýyC¼õßíÀ˜­|‹ËëÝpó¬zÍZ)¼êItl1ú õòa¿ëµÿþÐ)žïH5*ü¢HÀ=}q>×a6ºÿŽS‹ë*ïû¿°¬Óй›}Ô”ÊúÍZüÄÿÎ/އ!Œérækvˆæç¶Å–}cþ3¼~í¨]éJ¨·µÚ™g—ý½ò^€6Ï< –{гC"­MºmUîÓÈrÞ1´¯òqÕÇ6¼üUâ¤Èq.þPžÿPæñ«–ĬŽiOôt / å‚""¿e™”N|]ä@ÔZƒaŸnŸ’+ê÷Ú#ßCØ•ÛÌs>u²…ÕµV)3ì*¯~ÕElì/“qþáü{Ï¿ÕîÇçËŽ`z=Ou×÷÷Ë¡>á[—^£éè^Ê…úøHŸjá^ óÀת}ómA|æÄZ´=‚Q!ÀO«Lh´Ý”(³”î_€V«0x öv¬™ GºèW/·ùNzxùåÅó«i©oOËX«}z–GÙ¥Þ7#MáPŠî-µœGZ(íåz§uµ÷ ”¥+@øßÛv: KQ :ëΤY0•eŒZïÙ>yQACO{s2“¬û0šÒµ)«.uÇ´^ó}¹€¡Õ2lÛ¢¢¬¯H-c‰(£Z6Ù¦z°Èû[ÁXZ§ìb]¾h8çËñþ¥2ÜFfדàI¯NQÙJ‘·áA9O=¾ú®ß…sH`·ÙÓÙ§³3bÃNx)*<¹$|ÃßNŸã_ßèåï˼TÎ)çÎR~Ëþ½ŸU¥õ«Å8·{”e+×èuG¿£^”sq™pÂõW‹XE$Ë9YL9¿Ý±¥1ñöeg÷ƒœlûñíOås9T¤œQ–yïüz?ß¼}ˆæÞ>ˆ³OŒÞ™˜‘ùQp¾ž3ŸH^o;5õ=q¾€…³ôBá ôÆÌ>5Å–ÃbAì•¢†± !"Êù¤þÔÞúιÍU²ZùÚö—å¼û„±ýدõU¹à§2ž8”lËŒ6Ë÷ÊrYow‘Î=>oÎÜݾ[ÉjñAùkß…Ëp*¨k¸’t-~m¹_ÙBBc­"FÃPpÝÜ,¥42éFŠæÞäPÛ¢$8ftoõÉ;ÚÎÑ–þñõ[PΣ~Vø™¯ùU/Kñøñé9ç¬68¬Î×å"/ûc-•¯¤w½E|Ìsò]ôylæ¿'lú‰UVX¡MÝ„KGGX%­íà‚ƒÃ‰ÌÍÏ-Úlkd–Â)â%Kµl?õ±־(,_JDÌÕo«;éªqÕWsNˆÏR¦úëFUhö4g´ÓWi.=-åª+Žþþ¿ªãGíE|Š+ƒ  m€>þìhÁüšcDÊêW¢#+[ê5ÁG:Šò“cŸ»'‘[µ!·¯N ùß’ã9ÝûŽur H©²'8úš:€¶ç+}™W»_ô“µp±?Ƕ:DiöN‰½zh¶”!†eê)¸ÌÆhÆ×‰Äº}ÞJ$ìq WáVeÂhÖv ù}rêz`o`gZís{,„˜Þdpé:RñºÒѪèÊÙ0 V‚³¦Uå!šwôŒ¨f%¨XIgcª½ÄÑÐR\À¬ž,Úz*i:"ãSšÄ Ô ôIçT–5¹5XÂnJž}%5†"cÈÂÀE´Ô@òV×Z’'£‚tó5L`¶_¯2†,ª™‚2`IÝ(eÿ27fjN†‘!pÅ{° @EEº,Ž£ˆen²¨²Ú‰€,p„1`£[Œx€ÑÅ @`0@ g <õº#YHÆ*—¥ 1‰ïyj cŒõ.ƒjBDÕAPÏ×B`Lj龻ɴôéA»» bwù0.€Þ[æ3A„^¶ÊŒÄ|xµXñÈ2åWÐýŒ œM€‘;÷›ŸÛ8 €>ƒ UÊ \&tµvwéCwÌŸN° ¦SÄtŒ{ag ô -™Kr#…ÊM»ù uK€fß9@YöíÆYCT'yÀÛ¶E t0†ÈΊàƒkJu8Έ((€WЪª$­7\¯µ»ÌVï’ä²{®Ú¤OoYïQ€$t·ÚíÛ/h˾dçO²¦ KY·½ÅÕv°zͪôì€+p4ผš¡–Îf1¥âɻԅ­]æ¬ff¥ç,­(sUP\[üAô$ ‚#§ŽY¥Z›œ&§Ã!¸Á\ À€p˜1 ` ´CÀ Àú†*Π[Ô$©íÌhY¢EEŠÀ” C™“¦³zxâÏ”·¸¬aÀM÷“BU»ôFÃ>NF†,®Qfç(Žw}€mný´SÈ0AÓ9QŒDÄ®x­èU)1 Ði¬ l¼'^XBÀ~QEl¡6 SÊ Ð¸ê%Å;±F@0µ,K©Ûƒ—€P04PX¡ O˜âA‚ ð‚$TÒ‚LÀJ tž»íD‚Åϸ¦íÕ6œ É—Ý#ÊÄèÞÌŸÈÌ«aÑÖ|¸¯?Óüò« !—Ò&Ç^pÎÄÊ¡¯5@¹{éC!t~\‚9äj‰‘[…"„l0²»m^ßJ†ÖÈ–tTÈ èÆÔc´"…Zœƒ¥Ð¦¦+Izq¢¾ƒLV2‚ØDmT…,nWÙ ¹›Xv9Z“åìÓ9¬MWƒ¡^zï[[[“Bnƒž^lŸ9ò+ÓsjðÒ?[)ЇÒ׸h‰ZP26Bl@B!_.X§€·Þð¾2Î?›¯SJB† ” Öž5>–Á…Œ„…P‡b17&röý–ÁÉþ!§%"dñM{¯  EÅÑ­.üדÊï=YP0IÀ€Mf­NWA¹wj"âÊA‰µUf5´d» ̱´ù OвÊÔ‰®…¦  ÒvOê*3iÓL³AaÊmõÌ’(pÌå À28(ÍÈ8™ž<Ð áŒþ©D# tL¥*4°i ¤¬)lYDU%§0aD †±L+ ¸¦Ëê´Ž-ûvZhhPë@.‚ Z#\ ‹ðZCÁaìì0DAl!ËìB4YA–c³(¨Š¥ˆf "X·PQ,TŒ[/¨X#€Œ-*X a €#ò@)¢ÀŠ ^»`Š'ÅCßÈ<¼\lg)j ØÈèDÿ ×+¥œß7’í›D ¯Còx˜š§P Ädò©ÑÐy]âdÜ6“éáÂx‘õ u1`^Æ€Ÿg`lÀÑ,ŽÆîˆ7&\€Ô9È2®Ü÷·¯©àI@T(iš“ h Íu»6w @‚sÀÆPo¨È(Wÿ>xð˜?H›P2Ð|^­ô»AÐÐ98ÙlFàsÂR¯@W¿‘ ,ê ]-¿^ø\P9C–^# ]áIƒ¡!‚'cipf‹‹P(>š ÖBÐáT ÞTME@1¬n¼"Úì‚”l¦¤^WgÒ5w%5”4"x'c¬“Il2p¶Ö!0m™7Sƒjà@¤O'ÈPé ¬fé%2eÕ†¼ØÄ¶èj¢Üíl€uÀ02‰¡»€`û\ÖæHš™)•ˆ>TE7ýÚYKÃ( +àµ9 ¤¦qXF€RE­WE „‚h–‰`Íê cÑa2aXE à3¢Ç`‘’1hĈZ±€FWE ÜjbŠV1P˜ è°È2¶3©’Ѝ €ÛgTQ¥ë ¶€•Šm±pià`Mª ˜ue @:Þ»ÝaIXÇÅ$ó°w± VhÚª\q‚ûPÆ‘`ÄÅìÖº–šÌ&æíν“LÒðZ!o+@õ"¼rcL:à}?údÜl‹3Ðóa@´{m¤zÞ orÔLð5»¿ šÛz°€£mnÛ>VŠTZ¢™Ì;eCüÎþûuGó"_‹·DWª¾“ÛÏÜ®¥Ø¬ÙÇ<€ Ñ¥¸[@¢Ûî õ&ÚloçØO)n®•£u/9„‚"âr¸éìr€L.…g økgÐôgtÁƒ9W%hE·s ¡T/‘`/ïSöÙCeÈŠfr\Zg @&Ó‚Ç 3‹.°•a –:@ˆ²·5£Õð¸*ûÂE/-Y³÷Í”,ik©•!sëiè r·ïÆ|ÅÖ@4k‘1ª4”iºaíË"iû¡bÀ4€Ñ(Jnsä 3i @I“ÕPÁ<`† 娵)pôÄ‚ T , ˜XŽmì¬QTK hm…kÇÀD ,²* ºT€½•U0³PÀû:EoÈ    j™ ô 0ɺ˜€˜(Žbe.@$ŒÝ²’"/ý ó…Óý½."¦©áÒ 2¿ÒDï!ÐÕ3k!Wóö6üf®½Ïà݉ÖIà¨pÆc;^Ÿ´Ú@x€n`"ÐÂþf4' ÀÍ ÈÒ‚™\ rž±Þ°ñ‚$_§ØtH5V­;t­?Ï\]Ûs<÷°æ2ë [>qØþÞn$B€@sº¸wËêÜó@ j ’^·¬Bvh .ø…ìmØt20¹™Sà.c ª»H€ âLÐk½=Äjô¬iÑÈV€œ¡àÇ£¾ÏbP2@•!4ol¼øxÖº„¾{C2LY'=¢EÔpM5U [TDMHÁD `·ncÏÚÉy'ß÷ĦyˆËh\Öçgw s5 ¨Þùª¥+·úªq`u&³±jet [è}á ‘+‹ÔÀ¤úä$#i ŠööÎhšLµ ëÈoBö–( Fô ²vjMX€jPcŒ%M†¼2ð@[ " j(Bvæ ã8° ˆ€ŠuY#€ˆaM °fÀ° "`Ûº`¼_Ù¨ëk°èЩˆàÐ,•Ãj©0€t@ˆ>kí°¦¡ŒKd¾ÐøÍb#h ¡Œ…$‹¾y´íÁëEö©,>IVF~ª˜eç@ûY­ïöŒÚ#àp ôáBCxL…Ô¡ Î@Ë‹H׿• [2×΂7 ~¶äÒü2vœxK¼»€¹¨ÕÖóý +WsL—ÿåžãvŒ½³B=ë/ñ„l¶ZF^KÂàb]-õ‡¤7xÁ<þø’ÿÿÀˆ³³5 @ܹ.½÷¦Æ ÛŠ®ÿµË°Ñ\éæ9²ŸˆÈd2` Rn‡}"‰@*ûôÀÛ˜.€‡‰¿Y½”IȲ-{~´zKS> @ó´ú¦>É+Ÿ ÀblçjŽÛ¾Y@ 8O¹Øš™EºeZ½Ð0Z½q6˜jñ͘,°Ol´f(@t_õ@€Ú®ZWhS$±Ñ4s«,A0äb ÚÃ֌֮k(ˆ%° Œ€ t » (&€f’m$ƒÀ˨¨@%Š@cÀP`Ÿ©¨Šj5À1ˆ(ÔšMè!OggS@µ&$¯:¡ÿÑÿêÿèÿÞÿÿÿÞÿÙÿçÿÞZ­dJØÄÂ!S™o(–‘)–¤Uy£€ôþŒG#´hU£…OÞ2ÁkÓ$xZw.|Z³:wÀ|2€¼Ún0ðß§*4 ÝëĤ‡6L¶x4€ QâÞÛã ¡×?³`^&@,cç3HÄò}¦,  7±òq ä×Ú0ƒ>ö:c%üÎ;ÌÈÊÖA vèûòTåïOÃ-…”ÕIÕô;®A³f @uóÃÎABüjmT äÆIœ?à °r:êk’«ÎÛÝ¥@õÖ,@H3äð›­ø.~Ò¯._[„ ä‚uªú@‹JzÀÈÁ 81’¦£‰­0PUÄb‚öÎ'„)º¾ô÷©]Z¦mÀ ×A˜w ¾`¬jŸG-_­iÜèßÅN÷¬£ì À¸<7,=@’Àj­N Œ+€iÁV«! B€ÏâQ%BØ`Lp š†×ðB%ËtŒ V3P€£Ù‚@k dT@G €X¨1ŒUÈ"€åÐkT×B‚ÃÈj]Pà(ÞZíDЦb®–;ɉèê5²š”˜þÏ£ÿã8€ïïLñLؙ؀ð0¨&w«Âl/¸€ž‡l¿ àÔ àxboz1Õþä Ø=y‘½'"ý`m—6zÏ÷1ýI:ý †ìN¼’b³SñDMDÛm{K3¹ò6@Ù½Œ€ì3+õ$¼R'€ ûÅ¡< š³е½˜ æH€bMœóƯ°«–R™‚æ‡j›=!=¿TBU@Ô=>Ú  ÍãÕxã4z €á€GñÍzÅ&7¨ `1@À&ÒÑ_q.&Mëv¶õÚtIwLJNš%zËÖ}ÇÐE)ÐæÁAƒX§9Pw˜H4y¯µ©¨(È­S`3: i su¥€U6Û] "2\‡L v#±V)Êgk¦@°P› JAj©NnÍÑ6øpö -Ä€Ñ ¦dxºŒ*(bŒV9eÙˆ…ÀÊj ˆ¨nɺÑí×ö5Ëpæ*V,ª~àlÿÁDѵ ¨HÆT@@T ¬aŽ€@×@ž:õŠ€Fc\ ££[Å:àÀ°3*ªzrïc‹Ô3ÇÑwšO"~|ߛ̮×ÿJž[ó<Áµ‘¸Fg´¼€y"kñzt|¤[3.àrkÃnà,æ6L”ÏzS“TB Òa‚ÀÞÍùk^ó<ýŽM©í«©½â/e}?$×ÃN®7%J wœ_›LÕ´ŒŽÎ- «è‘…}÷ß>¡Ov(2PÈYr8­Oym(Þ{Ê'ñ³Qi|n_‹÷’Z1‹ÉÓÊpJ¦ëÞ™C \PºqDJ¯ª&(ÉtŽÕ™Î>uÅr¹9kÇ#€IèXÖý…dä@æYH23ƒ3íÞWª ªzß3“fUÄÝÐõ¥`uÓ}*¾«à„ã}ž‹ªsΩ:}7PϹüܘ=ÛäÄß8D`¿SF0@DˆxÍ=GÏË¿¼®t€&gîïï{€d¢Pôd&à04RŸ¦@A(’ºÏ9e“Qv7^ß™Qp,+•JY&À0ŸÅç’ú8§î;.Hž+\ !]å®<3ÆŽ Õ®#Vlo ˆÐ?S”)|~ý½ýIõ¬ôS0€cÀn¬PUी$°½®®Øëk@a¨ì…å–†aɉÅóÿÿú9¶g4//E2¾êtB¨`\êÕ .­¹ 4R.f½·>Ëýå5¿ŽÍâ7ž_#Åg—7€ÉÔ?­"â©5‰à›Ïvg´mºÀºo‘µ¾¢hHªÚ6//fö¸óËîèfœv§=OxK<ùÜ£³(›/Â\mÔc"„Y@·’6‡ç—Æk®6@ ‡ B>®Ñ&"ê­Q*Öö$+$К5«nÀ HTŠ}y¢ûÌ/2¤³†NPÍTL²øàþƒÏ;Sg€Ht|–äMUuçkmï{ìÀERM™g+‡¨âået³Øùæ_sîO&Ï5LÒo‘?§ž+î]ïœß¡/ÿÊæ®Ý‘1zb¾®…€' ’kŠÊ¢ ?ž®Ý£œ¤>Å{šª&Pgö`±é·6¸È×·ˆ}³˜¼{óP=Ä × Õ™õÕÑ¥ÝY=»FKuuVžÙPÉÐYCA†ÀF?z"k¶b6¯¬Àìøä¾º\Å‘èÙ­¢èU]ô€P ”è:–m }a0™•H!GÇ?¿A]mJ¤(<ó$ ¨ wÀ†€(ƒOîoj `ÕxAÚèÑ…ÇRocÉ[õr‹Ž ÊŸ¾#áÈP)¸ tV:•ªÄLïŒO èu^¥-ÀåÍ\åbÐûL> Ú›åÎ0{¾¼tZŸÀk²ÅÝ=ˆoýuxVW[Áã®ç(4àv ,ÎÐ`úðÞûi¢E‰à!Ä‘›ê~Cö×`®ÎømÛñ©Çíó#k`»ÌaÈ•ßüÁ ¨•Nà”X&@®n»’‹_E¡­Ïì-¼ðìJéIÁï¤edª*{BöFâÌõÿöïµHû‡§|Ö žÍkÏn†×X6ÝW,x—ÌQ4iýa×6(s÷h¿œQBP²6Vh¯ÐÞtú˲o¯x¡gÊmÎ|½-ÁvhpOû@>]zºožkH—kï™SÍìª~ÕyVrî&’éa?E0­úôœáÃïW›ûg2s&'@¿õݽg‚Îr¢ûëÞ—€¹çdœÒû1$—âk†0Wµ#¦®ŸÛï×~“€H2rÎ&{Ÿ7ýijŽ_s¦Q›½†ÄÅ}=JÚ½ÕÓ|_²îˆúzþ™YG<{zS0¬ nba€¥þ¾`a nO¿7À€¼"d5³À‰ü&÷jTú’e}À€áý…€Í?HBQÓfåè²æ-!†œ-c¿"À!°ÁËÐ~V5â•æp6Í€€ÞU¤k‚R ~YÕ$ïò§ü9„®òJm.?æ r‘ŠºÀ4—¥Xe_?<%ÏŠ\þ»5Ÿ𠀄Èý™dTðþu{ö Yà»Ê­ Œ#ÚXG– ç¾­Uʨ ˜ø#½c¤»±‡cz›Hµ=3„ïm˜¯a¬;ë=ÀøÀä-Z ¿€fîøÚ¿´-k^®1µ…§PŠuèÚÄß@éJP¡ÀçÝW/å¦Íâ)_ÕÊÓ]‰:°Sðý^kÕG*n5sãÜ•òðF[ú†¶Ø¤¤ N[¹náz³×µ¼‡ÿ½;Ö:¨‡'5‡üÒ:0O‡ålÕ)åïlXI‹—µJfƒC ¸ OL Ów§@r Cÿå® š³cùxÎílf›è³sÉNý3ojÖË¿œ¼šÏ oö(¾ÎŽ`ïŽÔŬÕ/½° mjzçÙEe„¶—߇ân†Ä%V=îÖ›#>$ Èɦîoq•ÉéñÊzSóÀ@@q«v%Û¼$‚ʳ›Þz±Xü…ˆsóà¬c°Oùq$c@ K,Ï©¢Cc  üAÖžŸ!v’› 8øµLa¸VP’ Mf±4 0˜H)-ÎÈÐ$#XƒT`žY•Vœ-)Ü¿ÑÈá…^“êJOÄ\äBã{Ž•ÈÕû´_µÇùx~q÷àÊkà ÀW€Ÿcöýã ÕlÀTmÎÀI70[Àb®k“ÜÂ×¥¼ŠT2 à„W1ï¶wX®9€+çÚ‰V>LçÍÝq€DöÈCר|ÝÅÓxðãà} _×ö?<¶{ { ¸éë´^ eO „!ØÎ9ës©ŸM€è1×?­ü/BɽýO|ÁÕ”àhNKÊüê+vϸjq…×}u“ +ÚhŸEhz¯Q€Õ¸Œ·ÒÖŽ~¿À©ì’@†‹b‚ļ¸Ôý­Î'­–2úàØ0/_Ü¿@u¡i(š|ÃA+ª'¨4’bt›¾ÙdÂ@˜GTgÑ»aWjpŠÎë,“S§€*/ÿ鋘ª%]4™8ƒÀÍÖ¸oÙýñ ¾(þüæV¾ÀÕuåÜ@°›¤‹±®½œÂ»ÿÈÆ9I›™€g{é¡!ÃFØE‘€'}QòóKÝs|þ]9M¿Ðù2 iF>ñkÙ¿6KÖ%ÈóM6ñT€¦€R˲ß$Åà˜ôN àßU<„$®# Ðò 8žR>Y•ai–n~è‘K*?±Ž+ ¹´—ˆJOϹô—oÝ'ï7À#ÝÃöøßçÀ7^À¾Gû$ÞO`¦ Ž Æf ÿ°~‚æbœñ.* ^à§:Ì*r†np)€‘6[È;çeæ5>û€ÃæÑ`dægÏ®ua™ÂJÐNàeàﶦd<PoÚÒ8s÷ö¤ì^ 9êû澚õ.š)Èhr¿ï¹CråúZä@lÝ.¹ÇÝÉþ-|¢½EÔõµÐ×nÁ£È>»’[È¿ÚeŠëiAiËb¢( ÚÜ6‰ v¨(wJËû[ Ê.±*3ÿÜéfµˆFðáýUm‚Cý¸Ðs лˆ²Ý¬Ig=P”n¬›*&0 =Mì~)ü~åHÑË $…µ3 ʈ™š +îˆÆ±=Åi¦¹{ràN‘ÚÔL¥Ëä­¡˜¾Šç™íï÷ÿ¾Ï édè`Ϩ³ÏK™p’éoVÆÉî©ï·kEt±×è§h²¡¦ÉëÕï|O¹[ K¨6ФÏûó"ØEd’¡I¦Û£ …¦[н Š)P\½2`h0 Àø±dn 8"ÁÄ ”þx•9ßÞöÓùðë)•U¦ŒS3i™—„\R†gVd|>y3€ÏWñï ‡ ùõ§¿jÄW€à$&ÁçãehècMl¸€Ý¶ËÛÐgl öÎàçvàÇGÖàŒs¢à48FZëúI'Õ{Nà Þ¼vÎ~zÛ§o)¾·N^y$àN|KVõ Jw÷ɶ@©gŽ®ŸÈàe2ñУýÙ@{+Ï>¼®\/cÔ\/È^?yÃã×ÞSÜ r̭LJ0ìZD«Þ Œ»g}n BÇê§ ÂÁ é9Üí3ptWö>è•OggS@Ú&%•Ö†—Æÿ½ÿ£ÿ´ÿ¤ÿ—ÿ¢RYipoYWM\hÿÍÙu¥¸œuèî‘w>Ó@Ƶë(¼]•8ÔöK…ؾ]p ÷ßÉS§r6<&îAÍO¤ð7ýDâ`ã(±ß9à6Ðà倠/›TÞ¹ƒëv€ÊD?†1¦´B9¨®Jö©4ýåøÛ­ú×l$ƒÈ21Ìç]“’W"Îlo8œoñÁg ôdîm È(–µ¨²åMLqõ§×ÊnbG´Åd¨÷Ž=ž&ÅA†dgµœ^G٨ň؇F_ $Ÿ¯–Æë–;ûìñT³ Á±³±€šÌþzkÞ.Ó¾®pj¸„¸#ó@3«Û¨‰Ü)ð%$ÕÐ î–ŒF8!43”ƒ—¤U4„Cþª«÷†ý[Ÿ4єӷ¡XìÞSξ²¸g8kÜ»&¸æjH¨$÷PqfÓ7ÉB@ª§2FšL³Ô€ÐÀPxÐm p@Ë`@^yuvMÓ‡NÓeÉaÒË«á{Ô,*{Ë¥ü\>?¬@ß}ÜðVÓËð9k¿ þw °N9“€ÆW€e09¼ÿ¾œ#ú1<@e_qÆö`sᢠvÉÀý+lµ{M7ÆNÌ—.H`l3) i™+øø‚¼éÉäâ½€ýC€ŒüœlÝ»Gâ9 _—§r&åäþâé<¦B¯M#/—/ROé}¶ê,…€H\86x²”ÐB×B/rÑçñŸ¦¼d€»s ÙÕ¡#¸é"+ËjHT¹¨Ð: ØøWÛãBÏt¿p€$]€³ýPý­ <·h8Ðañ#wï6²Ú!?&Épû[Ó˜‚ðð¢HÏv²q`ë‘ç¬^FÌ 4ºC‰€­µ @,ýL<¾ÒšüXÑÝL?ŸŸ­4à dÜ^ ž1`- 1šªdV3Í“=4ÀÇc –1Œ× –SèaØ‘ ¢~x¥ù’`ÔíE~¹Î‚‚Ãxòêì±TÓúy óx ƒ‹sùüöÚÒ˜óéKy àÀ‡ßxƒ\sätÿç?þ ÐÀõÖˆ\Àoz x´á,¶¨¹›'· ?"Í¢„RHO‡¯Ì€€lý1™Üws¢oRȼ ÚÃIW’« Ðæàó)Ú¹hŽ«¡Žû,à³ ôìïõ%¾@€$ߎoõrì³+B¿)(ÙŽYC£E.H3Çk™KökcŒN ž ÁèÔø†]Ôzï€'dÈ]òd²'ðÅ=m °Û²"ž¶ŽI;{P”¢Ûzãÿyg%âÌ[Û’oÁtçƒÚ˜ÍÏ}öCì¼`Ü@Ù»þ´ ëJjø|$ï&A̾ÎÚîD•Ö‰Öc´7xkÁîB'ÎÎ ‹84;DüÐB¡€º“öhŠ¿ààêYˆ°Ä™ôlp @ÓÐ ¥Et—éqÏ j€Á&Ž@™@•à €DòÄr ¸Àº’@ôm@Þx5¹Z:Ýëî§\­¢±¡¡ñÊÂ6)S7Ü·€ ŠG €?ÀW€ÇI¼±ùÀúœX¿¹=ȉ'‘øŠõº8$` o„iËp ‘¤¿À÷ïtãn»ˆ;7çZ&ÿ£b£Ðm@ôàöt {šc¶jZkûKdm|¾M|æ8/ToT›®WÈ”<÷“Æ÷ìÑ4Äç?›±·D€BñêuH@B €ÂÆV÷Ôþ—›Rõt \x P€ÄÍLxõ<ÀGœI×E¡ïP/ÇW ¥í·¼¬ Ë –CRÉ{F°rÇQ€@S{·@?ºîÝ ^2@Gg©‹M(@XlWR ÎîEîPÀ Ý/_?ÝåR@ ÀÈܨ•1\‹b«‹l˜Ãúõ€±P¡Pÿ¥ €ÚgzC€¦éÎ×—u¦£9ú- hÐà €â'±&;ƒL]ñI:nºcº÷ÁÉ7à(EÀ[€ðóh>zeà’ðC‹Â™.¦ri%ù{Ü‹Ñi† —Ï£Ù™;w޳IýsŽ5ú©^Çdø×yoîgà[8-þÇ—Í&ú"‚“uöy"Û¯§I:'îâÑÉôd2ûÚŸË~®HñÇëó ŒsùžlÓvV—'…v³òÆlnw2¡„¼|W[óÍ…J9K"' 1ÇÜÙ\zTù°Í#Ÿ)Ý5I‘÷ë|z­vw~½@|˜y‰>äG}±€€æ+änùÕî=r·4:®V‘'û!$¯„êyþOý£ùy¦ ù¢Ýs%BÀÖømíU]}lZ=w £úøí¢í6Æ},ÏE¿ô‹îîThêt׳.súùxúµ9¼/Ò‚4 7y~> w㤤c¿þ¤`¸¹W|¡[–êh$çù©Å9–j|x_…æ¬ÓÇ,«½&öJ)*‹)õ \>üà.ÆórúÚ+ÿ*¦õQÞÅr®tûæ/÷YÞø³_‹ÿ>>~f|¿õãÈ5??I< ßoG¼^Ñ‹2t%–¤MvkåOÚV>Åíd‘ƒÅÕgÙ=<‘ö „ìü8€;Íù =Ínñƒa(WFÁ·'§Ò õ:x>­^ˆþdÁTø(Ðz§é»¯Ÿ[ü¹jÿ²y6`õ?ËüA9-€_s’db»¯c.N`²ò‚Þ[¹rs6ÂfOsjýþ5sŒ–€uoºK×2ºK,ÕÂ^DŒFƒV…åØzT ªª€°"9|•:Zl-ØŠpÈ×þ‚üñr sSaá,c¿¢1¤eä‚Í °p„0|áþ\.ãäN‘À°ì²1¥—Ê‘¦& Žvþ[Íå-ºT¬2ýÜ-ñ—øG3™)ÛîüÎpY·—Ò)»v%zéŸ=›£©žßë{¯ÿYùùþPz¸NÛ×C¦]Z§¾>óHCpë IŸëþ¯cûºÛ•ÚC« &†èn»,F°µÀÐAï3êO3ýdÎZïÞ¹z]¿þÌÄ|{¡¬/W®¯ð±1rŸ·mçfªnPjVAà×?ÝâÝ‹u›z†ÝxÞ$?¤òœúöeifÀÕ}Ô‘é²r—AsAÔª~R¶Ê1©±výYôj ¨ÔUbˆÅWq¶…LTÙ’Ù”4hK3qlÛ 1ª™?ël™íV öL¯’°‰·©•ÿéŽ}’ü.µ™ÇTUo¶×2ªt-©ÌpæÂÄ^ÝØI¢7:ö7úßý3fA©áõD#^s1ÙEîbèL%uI‘\lN?á ¤éu¿•EŽv¿gƒ¢{ªð“$kA3ô›n²Øçùí¨}UAæ¶èžLP÷• “Ü Þ5¢€È}[õº_×3Líl@pC7ÐÓÍýÏ_)Ç­æØ Ã€… ^}G_&—¤RßͪIòk‡­+·y•ŸÚñ4d:¶¨€™KP3ƒdK TXdçèö¼TÒ—%Øxä'X×­z…äuº‚‹’„ó©2ä.%Ù ·ãhy ÜØØŽ*-¼ÿû*a ü£x‘½|Ú Ñ!Ó_dëÁ°OggS@þ&&(¯\þÿ¹ÿ¿ÿ¶ÿÏÿ·ÿžÿ¤ÿ“ÿŽÿÞÜbõ“ºß¬sž„î@Ým’ééQ|¸Ç‚ÏíÄ%€ÏüôáÃÚmzk¨T«–®Œ¾ámÌÝr¿6ýÜÚ³keoN‹.œO½õÛ­¥sÃÒ|³ Ek7:Bª¦f”fýOJÓu tå÷˜4¿—}Ü®'PhdñÇ}ì¢#èÎqnI« è$à ²¤Œ^Á-¤\GÑ%4eJ=²8}‹%Õj F„‡è^Z›C¨\¤ Fm}ºË¢t,ˆ!Ö™¼—è¼>Úï}š[²a`ÀKÆÕ$#ø•Â߸ŒO¨EÅUgMHäßßp¨ÑSã­³Oä¬òÿ'û;þļ˜ûkâ%¾˜†‚i¨Œ¦Ê…`a(¨è I'‡“ÖY¢žÚ75Silñ ‚-A}Qÿ2ާëȈ”ò´qH:O¾Ü§»!<¦²¬Z/j7qp2d©w½ezéÈæmúË+ü“è³¶‹º0È(F Ä’A7` <¥i´LŸ i Yb!¢ÃR^’8RÅHÔ€ã…`MV¿ ìÅJ ~Œ(9žžƒè¶Ï*°(€/6Þ«unN8¢iª‘ú÷fï@}`ÈÐ}Ò~Rhí»>ÍKíc!™ÏäˆýàNÐÂ|…|ÛçÖj»®õJ™ U“.€ÝŽóùqØ¡ú·nË1mZÊ'Ü/•/_v€z£22}©@û>Ï2)!ÕÙ_Æ@P=èé÷Wþ!ÄÃõ¥„d¶[+_iéZ!®%*–1YVô¡kX’¢}ƺFš,˜¬Ð²x:Öû´·L Dê%øÜ{k"¶Ó[«’Çv&O’ƒ©™¼‰£ÊÍvß¡IböŽìóv‰]èÄP>IS‘Ó‚J–PñBÔ½ŠÜqÿãÃ"çÓ®4™•[›Súò"°üpvçnèìBµ.¤2î'—ª¢¬švOÂiüéFùÌ÷g@+×d[±éï¯*Þ*¦{v‰0äªÃßýßmú÷ÝCq&»Š®OÜonÿä'?§§÷©Œ¦¡ÒO1=_ugᙞܴë’çJ·¤£~’7B„ÉDmÇ àf#΀/Ä„þÝv0 À?hPû[¸(XÉFW,8Ûü<ÂÀ0É IžÞ®)°¾€^ÌíqMuÃtÎ ó¯¶úž€à{“e)ã»)ìŽGÞ"ß:Žžlã€71G$m{o3EfÁ*RI€úuùºxI8"áÙ6î¯kFî"¶^úÿðÞ^ï€1 ”o?IèZÒ±¡ÍÊ¡ÏM(UÏõ¬bu¯€hÚ–ôg|”B¦äB™Ü6CÞxêNŒ8x±î UšívHn¶ bmtç.©Í ¶€f;¤r Î4uçUd¤¡GŠô4H­â5CzÀî`¦Ð>Pk¦]q xZOB¬†™"‡ïiÓô–±ž~×ç_vI>Ù9ð4g™Ùs†F#..§ƒ—¯×‡äìi´³á|±'€ ª7ÊÕC‘üF•À 5qU}¦êýÝ@ ŒÙ<ÕÍÌtÍvÑï ÕgçWi ¹ytgË}y€Ù} …šÓ‡m²»;hfŽêkiÌÎËÇ;Ü=9LôÃaz„p-'_¶¿ÔöÞxÕªÊ<ý? u²äé·‹ÎNÀˆ=@h_òÑC2ôU?‘™óö3W¥&k2W³Mm;ö Y]͵ÄÕ›ùÞÖë¤zøäX®ðbþr r mÎ>’yï»* ÔTS5·°éü•§?“õ8™rT†}g¾ší|ÊIMÖ4ß=œuúõ¼G²å¶{öPœi“[YásÖÒ šÆR‚ªSùÏë“­bÕ™ÓHôêÈì ¿ÅiáS((6­Zèh((ÈôÇï]–"jåÀ0èe«/€º „´ ÕôÞû­n­‹¡$’awÛÄÕ‰J£%ófîdÆrѾ®«Ã8âK€…. oMãm0×HT;¶-QºJ …Ó ‚²t·iëj8éÚ¿–Ëô¯'߇…ßUcÒë~ tã €*ı[õY}×òÜp¹æÌ-  @ ³U³­@ˆWì<]kcQäu?ó‚=ãô³Û½m{' ûÎØ(ëˆ&âÎãÉÄÂ5S4$¡Xž ØŽºYž€ÔÇYq…°ÊTÆQ$˜ Qò<—¦éó£qAô3µF!a^hí¿‰$Ç;/£å7>,“N¢˜Ÿ§ºç™¡ãξ((Ùß÷ÆÌgðaÓõéigw¼ðûÙ÷ð¸rçîýüæÚÕæÞ1Ë?b?{óöšÿþ·Á«ºÑ“Ñô5•Sé¦2ßôt'Ì.‡ã¾íœ>Ïõá!‡}íS• EgI‰Êc[Æoxe’ÿj¶®c8nXÑ5Mhõ_7Ó¹â-`’ìÙ03äOŽCxjÞ¿ÏM˜2JE éø`o±àe' Ý|óUD*’ ”0P~k&Úä þû-î™Ö&Š) »ƒ¹c¼ðqóq 1.¯mÅnáÂW€£@ðÛoƒy?*ÜŽuõR–" ΃  üœb¿zXÃ2a›éß§q{Úµoq\&,'Öýë€ÄÕDÞʸ톙ÌðéÀ8rÞ>§!¡tî®Ø¤´€ ã9CàI»2¡ošˆ—Ò¥"ŽCµ_ùáq7£›Íƒöùã:€S "ƒwz€Tièåÿd»·DÍQ<>jÃb÷ @Œš€¿mבy¿a ¿¢V’4³î2L“§G³ý¸SïÓ-çØÚ^ç.XN0¤Ò²t•ÓÞ ó™î†‰GÕS¸Þ®µ»®.†éá\gr1ö}&;k€íû†¸xy€ªâMf35Œ{t ‹wíćrâ_;ŒruûÀÌTÈŸXÏóSª|ôª 7/U턃Oí B·0ÝÁFàÙü€©2+z¦j*ÏÀàìH€C¦Æˆ¶ B[&b(«YÉ/=˜1IÐ0‰.H>ìíýŸ“Ê4$áÚ«mñÕÙCÛ Go²¦ˆÈ™¯'WoåUDo[ ¬»3Þó XððuöÈÚl “ʤ$ N #?ß©í·dpVúÞ¸»ÛV˕ÒßgùòÃg vÖÎòx%(ZÆKžW€ºG¾~»—Ûv\9g‡ðG Ï®äÌ™/Ò+£ ôØ>g.÷‰ZZbU•ÿ‘Κ±ú<:j¼"½m"&#·öÏžêé›p20ˆÃHfÙ¢•˜EõÀùcíùᆢ¥‰Sx/Çn:û¡ew÷4Í ®ªð¶C'÷±ãy- ö\‰ t-½rd4{ö7#¸º6Ô•$Ú8iò¦™OÓª9o³Ã³º­íÕI²Á ÊW]+ài`Ý×™™³ èù›î¬i:Èlµ"û|æ\lLŸa±|ÆdôÔj]ßs>34L7Ål4‘Ñ0ÇÓ£Ï7û¤œ%Ï>ÁŠUÑü¸Á•¨FnÛsûô¥ øÊ €€g Dƒ$È¢8þûËGDkLÍ–éá<Ëõâ•^¹7ÇÚ“Siþàõy*3ÿ°‡Íg¤ü °^ÆŒ$߂ۯ°:ÛÑng@#² HB ÎØ¡_mûì½ÜmæßŒ© Ê;®iñ½õËžW0A…ŸA,V"À‚ø· GŠ×ö¾öBOJW|& 9‡6ø¬^¥Ý4Ë$ÀÃõ6màÆ¦®”­nüëá]»&TX¼m9¥:E ¾Qy5o[£báè«?8-ÀåwÐ*ƒ @Qì)'K¬Õ`V(àÁ¶ï£!D3 _KdlîÔ®üÜ£bCOZý‡ü|LûïÓŽåÔ+ꋺ†kᢜ ,ƒä ¤4f&™(*“†Žàd TÓsÈ•oÒmh gv~25uYô°³ªçɵ˜ê½ÉÎNð]©¡`Ψ_zÅÝ™ŒªÁU¾ÀfèÃÁó.À9l;vlða‹ –ëíõ+'zñ4tΡ[‚>’Å¡›Ê=d4ðøà°8^0Æè𒉢6ÆT‘Š™(0ƸùH:'z„¸ËµÌâà2ÖÓNK hþºÁW“cºÉY?n]ßOö>(¢^öí2÷zN`ÃWç"ÕÒf@æ±Éew‘ùïëä•ëÞ1aùû¶«–)ØSÕ. SNY]÷Ð)ÕÞÓõôQ´ÕÅ(ëJ¶¬Wª›A´ôûK$4+€\_êò$) Ì¡»5T•2,ËþªÕLœ¢<' ±–è%U™açV{¿±—zá쌠\u3ÛöÕÍìá”G)mÚ q¿/üú燽ù”À9?ÒÄ©üç2.w_8âLGok?Q¹`@¸EuúÖ?VT ¤@SxüP. ©œ˜!“z€Q 7/m Ýû{÷ü™‰“r0Bè Š*t$r/ö®Žz0À«·àuâ$d¦YWAšfv põ*à > AävÕ Èô{U„›5r·è§ìKpàì÷¼ÞÃoÿhí(Ωp¯–?»ßõs§pHÛÅÙmÏ2kü÷tº²+Óÿð$ª€å©– Ç —Ç€ò0ßÕ«—¼(;gש‰û¼é4qw{K…¢°Xùß;gnoyï±½§KIøø÷žŠ"­S™SO~ƒ~]·@U¬öï½Y-ûûч¤RÙâÁrã^µ•Ã~sZ<ÿýqÑ¿3Í‹B Ï†k× OgqA}¾´»x2談׽÷gõõwVõ²HQœôújµzÙ3b‚¦lÇêjåÉõÉe?¾½wŽt· g[“íJ­ƒ«Xd³K{5ˆý” Í<„ÀÇV&æ?1ö+Ëo‹‘eÖ¿»Äª¨ëò)ço]ñôj»{?üˆ”÷­²®¥PþÛ‰2ã5$ÈUþ¼ÕêIáŠ#ÄÓß –㱂Ö#ÔNÔp(«SÌmƒ[áö|îÄÇïõ¥[lhobe…x¥ÛbK’ÓÈ­—þ,9Ÿ“ìçz`©ž® ‹Ybǵ®W¤{Ye/ûr­ ›ìßgÕ•ãç¡}q‚Ô ¦q [ÔrìnÕ(ÆtŽ÷œ¾þaœmZ›ÇÀP5§L{*_wÐ~t/r”ÿzõ±ð¾úñk2"÷_Âê©`rÔ£nmYžç¢}v}7 fý{³àMdy³xgõÀ’¡áTúÊÅ:öžrw©XÒx}²òÚÀÑ“—O[£ÉÖ"_ä¢ÉÞᣭEU)“&*a§„5\©úp²µþg/ßÚj …—­[VÖåO=:m™9‰hÿ¡³ì6½‡ÜnuåÍ=rEC¿Ÿ•âܪä½Ð(õ1¢ÚûÆð¬)%T]ïµ´iE§Gîî÷ ţР¯ê«‘—eÈœ üýª×^ìþìê’üÜ^Ö%†Ÿ É+‹äÁ­Ê‰é/·48t‡´P4±Šé¯?ý¢–“»NóeëÕåYtÏüì>EC_g ¦v$Ÿê7It’÷^º¡ëÅ0dEAJÎÄKôôæŒÈ™Ò L_Áwž _r3ñ„yÝ;n²“ ¥ÍŸ!¯÷ÜSLgã™Z`fl"zÞ>=¢òI ‚Œ'©yÕïqÂŵõG. û w]]n¢<À½[ìr÷šx³íLÓ.³À)c º7äM6Æ Ä4)“‚²Q@Q zIM¥VÂîüÀ, HgüÊ„0@k¾a+Õ¯ ¦„0z0bS *õwýM«H§¶b#ƒîÇ‘>Ì-±‚ðP%Ñgcª ëÆ@†î…'¹R¯´Ž2Ó—¹o}´aÃûšÑʪj&I JãZc»ý?u†èvo Áv½¸ãô +Ø:”lÞc»±òtÛÇXOUdè=8" ‹ª”/.[Ê”)Gb­Ím L]ª|ùWT5ŠHJ€-ð¶EY.³§,aH2 [Н€0*‡q7ï@”MûûD Òhh»Â!{ ¢"mËt1)TÕìàyi8æÄ{–Ñ@'Æ­YÝÉ«)ÆÎäñ¨À¥éœR²¤aò²U“E»2Ç”³àÔ_ÿEÎ:© G®UbTEÏDe¶Ì{2ç…l“¦Çì|Ü\Lô¶³¹`Ê´ºY’©ìzû¨êuÉé[Æ­tÈn•Öi²2]ÓL÷Õë0À=½ë?;*–)²F•±¬v¦åË\múËí¦7^øîˆÈ õéâèÕ9*åâ/O¸ë@BŸ”P®&¶ ‡s™=Y‹»Ö…HÔvWÊG ›Ó,wHæþ¨ÍRôôÖ]^ó"ÃAGÌ©q)èZY 4Ò ÒµÉJ â‘r}# 3lÎ?ݚ _£"ÈYc¦š)áG;NuèÁ1ÍŽo²ÜÞHž$Ó¤,–ˆ–|þÝ_na¿tßGò®$¢p³ 15ЀK³t@±ê ­[ôq'Yókf¶€r)Q'‹è¾ŠÉòNiù•Ìwäe˜œœžF4s|7Õ³BíÖ¹æP¸ Af›Ô—k@R¥è1•»Išªêd½óæû˜gÍ옉 >ûƽoC—õ¿â6Á v>ÜûàLÿOåðÌqíÂ*u/“EP(Ë_W—Ý  '¼Tü²ö.ÒŠ€â“PùU@“NE¯£=Z‘²Üe‰Ü†¦2a 2€ò%HB¨ÞëmæL­ 5äb':EP”1½qºÌ2¿*W39Þ¾¸ >Fìûžù¶ÑõfjJŒ•k½zÇy97¹-öŽ~²4G•®×ˆÌ âL—N}$‚{¼é‘/¹XÁ㹌:Y[ò%Ë´x-£ò3ž,WîËy ¹Ìœ/„LIøQµLçŽÐJVH@Ÿxï°h`eí8a©4 ~f´_Κ˜ ÊGìf‡ØJ?ßL™IG\e øf‚™(©' *)C‘ŸUih.KÀ>ì_)k²!cb¹< ìÛGC•©éñ‚ ’™ÿÙ»¦§™ç®n€w’¡GÕK÷ŒýtÎ ÷:ÃÂÐùÔnÈI¨…fç¼L²{ƒÓ<Œ¦².C¦gz¾é&w“÷õ3*ÈdzH÷9ÍÙ›¬b*Ãì’_:+InÕùý?eÌtÒûdr<¼u%I- ŸÓ>³ fòÞŒ¨œIòÞOÕçT×°ñ©‰:­©%Îi€bz¾£øcýkĺaâà@ØrÞi€†DÑÕi!â Œt‰Co:Ý¥îo ‰ÍnA90Éú© þÛÜ3Qf´ ßîvÖרDàü&NäÚáö?dñ_À—‹`<}p¥m£>šU+R£”"hËæ¯A¢écW–g /j¹lÒ7ûÜtûù.^æeüøìYœ"[’iɺ£ž(|^Õm-<ªšZúÈ* *ëC&‰D–HdÎ8²!áÐ3y,½H¦³‚Þ7¡{•·$¸»3³«]𳟪ÁÂÄû“Óú~¾»§P 4rºúÁgæ¢4 œì.º+WÀIžGtôÈq#‰ézϹ}ÃôNýzk?Q‘óŸžå|ŠÊ·&Ó“Å.ÛkfF¦À&o¯—Úßs aWM×ÙËÿûÿÒS¬5µÙÕƒÕŸ;\óÛUý[ŽÜÃ7)åÛ1=É,•½üñÍ×w5"ÈȘ€aVÚͲ¡Ú³jªDÈ&aÿc NZ² §å ¼¤²!š@žX ÞëÝgªHøõj}‰0Y7 ÎÎò悲¹­«51å»Ì–| p`?†30³nÃ×´#¢VÖ`"æ·/÷OŠÜ&æJß2 N:;÷wÏ® Úý0*0½ïÚsP¹RðsäË?"oi•G&•ó¿5Í*²ìZEÊZ¤Õ°wG‹Å“ÁÚs¼«y™XÙ…= Ó‹€°1‰Y…̦?‹»aØ}M7 ½2Cù;õÕe¼•°±qwN=ÎÌ“Ó.º M]3]Lj½AÅrvJ€d"'o·üanܽ.LÝÍØ`Žç~qpk›}‚g áOggSÀL&(’¯ÿÿˆNPHPLKMZWÿ•FCT\[`ÿ¼ÿ—ÿÓÿë´¹ª¿î$u=Ó›žÙû‡šÛWóœ’Ò{º«`h:ÇIÏ—ªaßvgößõ »²^ºèŒÎ›¾s1Çõ(A¢#²¨'grb,²:YæïÇ3ôo†9Sœ(7…®„ºÅg:A`×s<? 0(@àÝ÷YìݺWÔCÕdtøŽ·gz%t‘Ù œ.ýzŽ'å—‹0óç€3°æ\¶3šµ­r0ðzû¬ßŸuŠÃ8Z†Ü]2ämç\°?x63ô9›à›>4äG¿~õ‡iˆ¾/îlÖÇ'ñÔ£™'Û˜&_þöd”ÜQ¬}Ý éÈWirÇ|WÎyOçY²†ÊJw6øÎa­fèæüQ‘€³¯&+§`¼Sèþ €$—Bò?0~Àˆ6çˆÇp°xÚÕð+¦9†d|ZH~F®EÔ‡ÀÔ‹«w‡;w*_,‚ü)öu_Û¡¢F¨23aÃé†8ºðÈìV—þ`ú˜î”žü! ÁÿôoœTŠèn¤ ¢ßXb»®Äà¯uNÐyüµ-Ûgoãw|K±Ü¶|¯²·fðø4Rœ”)~•P.3{_¨P~÷±¼Aôð˂̩7Y±_+AŽã&£ã’†Äi¦®©ý›§Î'¡"Šézrš´5¸úþpSɈ„Lê…bgƒbÙ†…cM9%ÑHrCzÀ!ä^î 8Ì~ÁõüÊÓ¡nÔ~‘×U¡~‹¬”Úº7yüþÅ9QJAÀ´6å+Xøz ר&äëܤ_ áÊŒ¿Õù=?M¹úëÇ‘Œé1=Š!é“„zu_ýx“º µR/FŒZÿwñœ¤€ŸÂØàÐE›³÷—Ý~*¿ñBgÌäZ륞Ÿ:Ñγ7Ñ¿üø=¸|¨¬'÷÷㼯%Äè×äŠÍ'ÐóIŒ§Üýª/f¦W§Üåñ´ÃÕø³¢pz/¡Dáõ[ÞP ”î£\xÞÿ ÄÚìùŸ¥6%†Ù·0UsSŽn«ñ-Ôrñ¦š|5ûsÕfÉ'C½B„œã”u 9ב&žêL`—SÛ µ]\î’JN¿#{oõ>Yi×[äøxæ×#˜øŒtÈ× Œ|¾P‘3· ì’åOÉó9«Æ%kÃì˜nJú °T1Xjèàˆ!Žº'ý§”+r÷qP‰ŸŽ¦_{£c9}„Keï«‹ V߇¢>›dæHp.¤R…wÉvÝüáµVþ’O¾8Çú6W°\Ò<3û«SMiŠˆÄW””YµŽì^îDçtþÒ’$A.˜ë6WQoɪÚ}8­ìŽÙëÀYèrÎzù—‚ñk¯ì8Öàâ€2èðÀßϼðô!‰ÒùõçÓwªçl;¾xÓßy Ø’7å$îꮫÃ,jv0¯Â€">¤v©gåÄPŠ÷ökV`®u™~y÷dÙú¡‹râCô+ÊóåjÝ^Q®èRžyå³/ÕꡨçysÉUQ2E9gO¡«}ù´™ü´äŽ0†EE¿ï ̒哆‚lo½æ–æ­Ië¨Q€§§€7/ñü;GÚXÉ_<™öhYÇIêk-â'H)ù¬ŒB"îü¬ì—'šB‰bQ0šíØy¹2…$†±oÒÊÕâ×e Ü$ÁëUºKœn0ýþR}¸|ÿŸ3—}} ¯Ãï+J•ìM‰+;¯dÎyŽ1f—8ã6£"ü,¾ ƒqöæ#ÅZ¦22«¸Vq~î¬ËÚšz·vÏÝí&ËÙ/Š\ÊŸÊ\<ATï½'wŽ©·ðÈYLíÓÝü©f**R¡™ÑhÍ$î˜Àé6ì½*Ä@ƒõbU£“#˜¦i-˜n`A­sYôÇ胪¿ä@» X^h'7'ãM§è17žÀÍéÊÓ¼\ Q†]éC˦{Þ†ž<Ý=]/rÏŒÌ4‘c’rªMÓ†TYcÕ!Äbb I:q„*Ñ€±,+p9½µÓ+KÆ#j«’0=2:±sz  @RK7 @Õº(A3I¬»àbãJ¡`€2.*B (˜Ö3*‚Y ¾”@@`lð·@d‘·EdÀÄ‘b ¾M¶Š 0¶ùÀÔ‚Õ\^Î}‹…w²:=Þitþ8„)ິ²áWƒmË[Yþ–KDÐ!á.¼83Ð1q«š #@D`Ì ƒ)éä5eänݤ\'ñسXxbª\®u'j.ïßK ƒ €þ4æ«çGLT l§üÜûše4¤V7* }Y "±•|e¨µ¬£ôÖÄzùÀÓ9™v~V¯d³Ç`eitÎóYjöE°(^˜p¥•³×ô2Oëi±ªÖJ¯—Þ‹ËåMªÄêO¬S´å´hÏØJ±¦¸ÄPÑaÁˆÐ"{kXšE]½šõªUCfÿZT)´Btººø†C}Ä—ÇëùpýHÅòhÿEÉëaÏûáÛªy]¯Hyüª÷ºPšÖ(Së;’ã±²”¥¿o”ïöûêÜØ:ñyÜj2 ±0üµ*2œÔõûéGíCfØÂ“ÀKr—ÿFTvÕ:dÑR«)Öª.Æ TÏZŽ‚,"b<£–}ÔZ©ôÜfeßûòòëYBHþ¸0þ3üZÒó¡ŸâíR5\Il¦ƒåµãù»‘›è®½lÆdÆFiº×ëÆJïµx/¸|þRwY)›ì߇òp¹ôÄšÞL<9dW-ÑǬÏL"9C}•gnÿ(d¬/:zzU ƒãð§J  è x?€‰è‡'[­|ýà%ëíòÆÙ¸[‰±uÆ~Œˆh曙Ѯ+CÒ>À7ž}žJü_ëvú_éÎÏï±fRQ¿Š‘5Æä86{¥%”âëEKîýzzUZøê‘¼®*ÖÊ‘—ƒZ(ªÎJaÕúaºv%L½D}WópšèæAZºz-Ÿ¾Ð™E’a‹4Â×ÚE¡‹5î9™JrA»õÝ$DKŽˆ"èé¸ò í.Zõâ·‚­¯SÓâ­"«*U±G˜fzºvÖ¾Õͱ¦F3é5š3P÷|½óysXâìZÀ'š ǦE*²‹çk#¦÷€2«BS)Q¦ s³Ù¨¬‚kJЬ”‘J€l¨fxÚýã<4 `Ÿb¨»Ïêmù}Öyä~÷ž‹Üg­ËÍ[M2÷á­QQ!0 Ô@Szº'EŽ—6Ô45‘LdÌP/TTR]j*ªWÓ´¦-4ö*¦B[™€M ¡W¨‰”pàbªRÎÏlîÿIÏS@Æ€aæ ³y»{ JÍ€*ZO1ôMWÙ‹±•µ0,&=ZQ‘TФ´N鯰·Nz†ƒ¬AÀˆ ¤kœ@õx¢X€'ŒbŒ 5€ ­Äc#‡@òs€`Ù¬–d ‘'´Le?XDNâ5"’Î ß/€Þ»õ"A×D¬Å½V.ä#¶üa“1ÓûèhI~fåiEp…>Ò¸z¿ç[„èL€ŽuÛ¶T)Ã(Z’Ðéáð_oªrÖ©›çïúÌÖà~€¹[ó‰€ò"×%JÎñCy[ñh¨®øP|ш€`V¦XÝ;sW6¢;ïCݽ—OÕì ˆÖ¡ÔÔ¼_L»!B.â§½{‰'øá³An±‹G> ,Ÿó„°ÜÅ‹l„,§%³úÌ1× „â ”ª9蕌Ç+Y‚ÍhŽ*ÄJÎ`Hʇޓ4"«­‡vœµ2‘Éñ’¶f‚@ϾnƧ?SÚY‚ÆM ì>e×vJ@'Ú~ºLR]¨]N$[N;¢ÓµéÈ× D$„ôœË`¨Ø d@F–e[SèR-BBÏÕhU²Á A6hÈcä¤#³´úÈyfÓÔ>*Eb¥iHhu¯®¨&O CȶCqU'|°·1û–i‰7±lH 0Q4£¸âl=ÅI3Œ‚4kÄ®¡A„ÙH’J †aÃ(Xb  dVa1ht(¨Q…Ÿ¼Å‹^‚¡‚**j xuÀ† Tlð‹Q0$Š ¨cÀR À€Q€c€S>OggS€o&)® #ÿ÷ÿùÿöÿùÿïÿÙÿâÿòII^¼ÝuŠi+@û‹XäÃXeió›ÌB„óxq¿›æ¬‰±~²ujàsf¨=æB õ3 ¼@ýD‚ÛÂöƒýš 0·ül'¢¹µwKåt§‹wé$½kî܇¯kóºLªœÙïmé»úiÅ]²ùÞMZ_ß娜,I¼†Ê¦‡âC—†ZÆ¶ÙØ‡­í)” Ò$x)@æ…!´O.r®B<\¾gﳃE5S¯¹’ºx @Î: ?3Ç@LkϾÙпrYÜ@D•X‰kŒ;mè©Yð*˜¦¡Z0H]Æ“R“ÁZkðjñ; B9 ndÙ›1âS:æéFIm­ŒX-¹±Ù‚|Vªœ®ÆƒLeCf Stn C«ÌÖ«º§é²³\ÛÏumZ @a}~ÊH²ÐoÝããÈz$s Må4Ða ­{P–)G€"5ô$ˆÃZ¡%cj„ ˆÖŒ;“£Pí5°ž¤öcý™R%Òd4ÒMAu°{K«â €¨5cÄBIrX1`X  ¶HUÔDÇ–«€Šd­XЊHÕ*²¦ 8‚!XÃÀ¬@ ÔL…€x‡<ÀŒ0˜È T(Ž…02k49¸)»­(Ʊ3…*¼[l—&&!¥ÒȨÐý&o¹ ®»Ëo­¯Ã1£õܧIì%€V?y€8‘nvÐÃ×l€3`öädt®ÛÁ­»'. à Œiw®ÔVsBæÓôÑ<÷$¯¿ÀJÎ>`ø/]ÀSQúÑ|¡PÖÁvø™fZ2²4Ægs=Fs)ÞÐ@PÀÇ ´ñ=  |ùvJ|˜‰‘ Iµ³õCÙĹÙÌÁ4RðL­U( Ió9Û7#Þ# ðL·ç±¤íÀ¸ÄŒ¹ˆJ¢š‚ b‚Zl è¤ Záʾg•uçI)˵ôNŽ•0©œEüÙ+dòìÍ‚h R«ó Ьf¼¥¾öÜ-Œ›€HÆfÓJС:°¶& T³:€¦ì3VÒÔ’@î³Ù΀@F’0 ÇMÎ©Ô À¶Ä$ÃJW”#98Ð:—¶÷f{âE¨cÑ”« ©*YLµH°èSͱÂR h~¡Aj@#@V,€‘LF™kL…à ‚Í( ª¦Yš 8Q°C00PTÀFq X""€ ôðºoÇ @Ê: 8Š-¼=ecv N´{±#«)‰ÈbŠ2=AûNQ–lù²ßý~ÍÖ"üÞëˆ NŒŸzMS~‰S‚£ê¤Z_ðÆœš¨<>—༈„ó…c—@:H)øŽEuîd (öihS2>ë¿¡Eìq¬@= Æ¥•5xþðü‚'C€|Z!ñ^f!Æ` àFI™ZhZ°Ø9ÐÐÆD í5¢Ð¯*ª¢{åÃ6ûÍÖ{©XƒhvÈö¦Ÿž‡ÆAÀ$D­T©–¤B2¶$—„.0Ís à@©­¾ÚCvÐ8Ò±€ ^j‘[væ˜Øaf=,¢,êv«k ¡…l·–%£!@!î¹õZ­·›0 ( XsÁª58÷Y±Öb€¸±ˆ¨H¢Fæ­§–Š@)Z €NElà%½ ­@ «(P¬g+ªˆX ËJPÅZðJ0ªFQÀ˜… 6 k,TJ=ªø‡2>Œ=J‹Fë™U¦Çí­Ž¦D”ŽYe¾ ˜àßddAãóýÕÅ{¥¹"}h×àÕ(8šäFšxïïJœÇô|ÐÌË{ƒÃü °¿¹,® `[°ûj2È·åîd÷û¶‹Ÿ4 `i—fÿ ý½¯¢f>éï§§3gåÛÛý¢Ýœ—¯YȹøR¼pL—íŠ@Ðaö¼È±±!ðÉÈP3ƒä‹côÓÊÅ|1: P<‘\~öí B˜w5¨Œ Þ®Ó j§&YLzáý\L < ÞvúÃXhð %¨‘äìl5{zTŠ›š&ñ|(A>QضñÀgŸš4n¯BA½lß2‚®ãÄ0r»LPÐP22RM¾)ð ×GPÃ-dyŽ1B‚h "‡xYé€@ Óº)€Ò*ðÔÄiEX#K³Sm\§t[†‘@­¸)!ÖF…¹ž\P+¶*¨…‰‚°.Pá%``iÕÚ`1ePL[«‰1 €ÖfDÕ+ª ’ ¶ME@,-¬ @ ¨ØÂº‚€ˆ‚X±n* »€ £è+*`bq P1>k­¬FÕÙUdz¡ñÞR‹öÑ&ŒKWhMÿoâ霕íûËÔ†2Ž?»?xç½È6p¸AGÂáJïO®´€ÐÒç`òèáÂx1œš¼€¼i"|ÒŽ¹ÎKĵ¯[ª\ŒL¿C û=ø5tûN.¿—}ÿ»RÛ³Ûßû}·_™@,€ø¿³’½â•0}ê½_PnwÝ€WóÜ¢ð þvhž÷¶ŠsÛÝÉY@V#Ó!G³Ðà@¤Z¿Å½z÷¸âŽ9t¡$X‚Ü-ÌdÈ€Úƒ֩Ó>Õ Ù¨j‰€€¦UÁâû'Óáˆ:«Q«KÎ&0Ô`tšýê`±ÇŽhËÌ~~OÒcAPPa¼¶ÁƃD(Íhj£ˆc-€°–✢ïx› 0@°( ð÷2žµb=`àiW-@TFh jÀƒyšƒèdÕ`v–m ø“`¨¦!€Ø µQºå@®Œ‘¬ Œ ·.`™(ÀXYð*&@s´€¢µŠŠñ>EE7 vvkPxdPÞM°¥€¤Ê$ËÄîtj@Œ‚”Uldš‚‚¶o#[üøoqÃy†›’o'ðŽ39ZÀíIЂp<]?x´KÈJÑ‘8'ݶ\X¸m À&/ UÿÌ‚ä²DÙ²»À$N5|ÊN@@GkVÿ1ˆž4ظÖ'“‹}sf}Ž›^†uH Ÿ­ÿ»ðíx,^Pˆì{þjyyc¢0÷š@È:Î¥ï}+—×kˆÆõ Ž™ã#d<~üI‘"ê *ª{7Û>¬gȸ}sPöó•ÏàZìµfcYv%“€Bñâ,7¼D[ …í# ´vP4-RÕ¦ÿãÈ |ùAÿÏzFA«qêOÍÚœ("µžÔ | 6©TH"ÖëðJ“†‰jˆgEXOW@!3zhΈ†Ö5 €Áè­9R„Xtë €=RÇÀÍÂzV ÉÀ$°‹ñ$6Ö¬dÈ iæÜDØc °µ€µ¥ `T è¥,¥ <]× 4`´@ #Ä¢°N-³0s €h’ %(Èž M"EJE'2šÀñK•:"Å¥¢ãPÜã÷‹±Ï_¼Ü¹]óoÒ’#Û]_üh¿õ«:˜H€lgüŸ“_ö }ubL\@Æm`{>.¼%^´Ú‡«*Àæ/›€0ý‚¹ œAB¼$eá# pNÕÌÍÍßi°Ù—¬ÚÎ[ÿà˾ V9Ëš(‚‚1žñùðf!3ÖË» àM,Q€94:à*S7 ñ˜k¡TÏü÷7@!EAïݤ€†k_C`v‰¸”äĔݲP¶7£€WI:´Ã·êmG;Ùçô %ÜXCiˆy²›j´u4ÃÄ;MQH1Q@ y)1gsDD:€ 0^M:ÅAÖByÐYÜýž Õ8i@Ûý:€•±L{TVU\îz0ž•FÓZn#m!jg¢ ä2 PlÍ ³@( } D]Ñ6رÐôŒõQP`PJ©€b1 ×í‡ðÌV@cÐUT1Ñ F €JF@t˜ƒÂZ}˜>(vµù#6kõMJk Hƒ5 úøhÿS„¦!¯€æp=Ès[…qájN@Ïmèˆí²’Ýy—Vw¹]è:ß6WŒI È]æsì8NY·ÀŒ€0wýâŒêsžM¬ñQ¢|ã1†Í¶Q¼'Ëáå„@Fõ í2¾ BIèFW4‡ "â²ô‘"ͦä,"©a±[±›L0#Õbßåœ)¡ßqø¸ãÄõY(@¿ëÌÞ“¡€ˆ`Äž¹x! `Æl€C…¸S‹39ôð¦¤_Nûß>àÖ%ÎýÚ±F¯¹z¶%_¯9Cïø=]$´ëÊÊb@ļÉñ$€öýª@$¶46ã’,D(GÑÚ$f¢in·iý'©Í\ljÞÞ%»± #%"‘õ•w uµŠè_-ª‘­@‰ÓTáŒK¼rÌÖ èÅúæ=±Î@`oaÛÚÅìQ3Ó&€ˆPû^ƒ´‡½žs=– %(52$Á‰|õ:ƒ€(€ˆ@ Çl ’@THX‹Ó3@dkT½ ¢¶× €¨©íµ(€ÊÔ›³`®I@dE@òú«PzõšÔ^q7"4¦U§³0Û·Õ…¥®úý/4=%Jn]÷µÍ.‹¼'ÍéðkˆXS.iä¨9á63©’#R!ÜT€R+Ä`„ð!¤>}‹¡u&iópÕémR;¤éˆÔã­óêÇVÉ.pSŒ€Úbåħ‚ˆ+.šJ\>g©}0U7QÊÓvÀ·…+ù,Õo„;OggS@”&*B‹²ÁIHY]\ÿºÿªÿªÿ¦ÿ¡ÿ›ÿÿ—ÿ™„F‹6‚ âžú¶ªÛ@fÄÁ-$Þ_¦zÜFfTJÄ„¶¦“ë)+»£ìŸTUK¢Ï­Gr=’‰£ˆ+Y°†¨à (ŠLØNÐ#òêødV‹æ ¬®KåiêV#Ù@À±>ÀÊ#p%ÁàùËþ¨]Zçdd j™‘Ùß#bÍñû’F¦Š¨L:ötDˆE Áà ÀÊ<(ÄN‘ÅØ"Ëõþo–ŸäŽíš÷í-¿—b+ƒJC<±eÑ»­‘/]…ÜÅRÞV¿ß©Õ#ºrÖ‚Š%”î·¢2sôD“KeÈQXžòºú Ã$I9‘Q¨XÑ-šÙ2 ƒ6¸>¬Ä’F £“ļ­pžº2Hæ~0ϴ˧?-‡ˆ vÃÃOèÞŸSµÀ˜nGȧû @¿Y䬿hßm×ê´°ªR&@½iõû˜¼2½LêYÜ/÷_§Ï;Ü÷ɃÛ¿}OnûßÌÀàÃz(eÇl5k&ßôî³×²Ï%€öª¡•ݰô»B÷ùQ”4§*2ª‡+¼üã—ä ÀH!ëè¢í €3_ €ÔP‘%OYM@µi`»âzŽ?„ z¾Ún"«!Q0nP”]ñˆz•$$ݱ/Àu –‹fÒ u-ûPÓ$YIL{Y³¦‡¢i8 PÑx;Ûùvótx½]Ýz7Ù;ÒU³™ÐÔ5'K»² Ë.=k]Eâ¸ar˜\M¹ÍeÖ‹y‹˜º³çøúv˽Ã4Ç/×ÉÇqK7‡›lëý2P ßIVT ÓÉ%ÍVU@È. €@1¸p˜¤D¢Wcrâ4YÒ%Dô2‘' ¥ë‹«Ë Jº·d "cI` QªCÓs1¾û-ôH« {»Þã>‘A|È›C¤Q™¨ó™ÈbZ™;ä{÷ÿý?Û')Ã;f­ë‘P>ßñº8,`ò“߀Ÿ}_ç0¦Þ¬ªÃi×éÔJô>˜ûä½Mòû3Tˆeěǣ»þjUšÔ~9•ûŽ xMcÓ}ܵ°  ræ!PâJ¨XŸðàà~.PI¦%ð<.T0ôlwäÌÐpñhûLV´ðàG²n«™âÅ Ü×®!’uu逪I²€åÞ$ŽÖNÍØc­Š4]:Ñ­›$Ðʵ$AgJ²®Ï_Y’05ëûãÝ—iÆ5eáAr§s%p2yI?›Ã™‹,ÚÞ4Å9ˆˆ4ñTÔ&zWŠrB °i¯AçÔÿºa):Ÿ,Š&‰vo_¼«ã\.7,»ª· €Ì…›žå/‡!b? aù‰»ig®yîlŽñhéËÞ.˜¬¡–_g“f–×=†º EîùœY–Ë@7f$; `Àü9ð$`>Ü]Å3“$ðþr'±Mè¡Ï0 ÏD™¯•ÓZ." × 8wÀ¤Æ XéD‡q‚ ûô¢³)‘fT §+€@¸cVkÕ˜(– Ç&jþ¦<Ì.7'÷w“»eÃv/ú¤/sæ8¿«RÈÙ–Bb4VÃÁé8€3 9,=øâ}ct&²R"äÌzÔ,žX¹¾„@FÁƒcÿ§9Ó\ˆï¾käÿ‘†rvpûšUhZRâÞyú[±ìHä?_Ÿ0¥B‹¤Ë À­ŸËÙ\òP•ãÀD¤žÎ“ô1…‘J:n"FQ«Ùq³s‰§jÈbù¾gœ©‰;sÞgž²ØwfHÖ.?¿ ;“š%\‚\<0Óˆ¢B68 Õï<0ÃCÇ Í4@/©¹b,ìö'¡"“¥Þ?Þ•›SsÁO|ÒÑ#Ãú2â|°k8˜Záh™ŠzhzŠˆ£‚„ÊÆ‰‘t€€ÇÐa˜€<…@~ÞÛ]Å-e˜\{µÝÜ~€†Ë3qt¡_¿ö}zãÄ@ÿ†à>%öûcÓvø[Ž8a`KrÑÙˆ"SeÇÈC@êr¿CÎ-ü뺟3GŽOë“Gワÿ÷£v°é«'xÉÁ~}žµYñ¡>± ¹²´}J)Žu(Dø*£UAÚ€Ä"JÝÌ›Ê8.Í‹&o®žN¿‰íÚZ$ж[DoLh ž˜ÛÄ8|´êeê \Q. %¤¡Y;zsEýÓ¿Ë>Â6¾,l̶w&r€ø'mÁ£,‡4sÆ0P:Ôs"F `èQù¨Wœg ll;LlýS¿õ”½{ìbá@¼•ó#ÑMÍÍŽfÈŒÃÇQªQŸß‡¤™YΦÛ\ÊJzh2sf‚!™RûÀ¹Ïs fN¹›·) 'pò÷|üÑÍÀh¢àï°£'ŠÐ‡óBOÇ!Ì} i€®`¦cðç, ü OggS@¸&+÷ØÉ[ÿŸÿÿµLJKF]aa_ÿÂÿÿªÿšÿ¤ÿ¾Ëíò¥ š NÅÙÕ ¿À†Vé3×ã$]¼õÅðà: qÊöz»Yl¶Ûø#pÛ¾yÑ™f™ºá߀»‚𺾼·6[·9+€7¼ÂËþev¨HyþsËüõÐ3ò‘l‹’Ñè˜áž "+-úrAs±=v“Éÿ¿qÉP>IhŽ á9$E™Bœ°l|«Ñ<£B5Nö~æí[4G5Âëm’™Ù½ýÒg3Ú¾ÓL`ûÃ.}¬ÀTZVÆÎŸÉK—˜ W¸‚ÄŽ1òéGY©J·A÷Ä{¾9Œ.çd7àÁè½gÇñ§ äÛfëHÞ›Ôêy"<ºÚgâЙ+³ KÂÂÃÅZ’Ãå CdÓ¡–¤² (4Ùt‡ÑÅа¾T= ÐÃ0 3 }ÁU¼9|S@ëÓ9tó`:v™Mª?Ô¦˜!ßs$dãi[}ó¿·‹÷ܬFëŽèð`U&4?м@òP0˜Ø‘€W púØÞËÝ+* Sá´«mîá Ì$ ž‰Ìöáòol¸Åð8ùsÛ`]@ã€Ñ gà”[ÛƒÁ >ÀX½èìDš©K9UðÜ !‹änä˜4„Ÿ| ÷ ·Ý8s¶Þœí¬Ò\˜]‘œCßôµ‘ÕÛúÜ,ä¿ÙY¥U(!”Æ#) àÛk6rÓÏÁÈ ‚5“s¬^$ú gvœ3%l.zÍ«ž¸ws‘Ðæ"g”ØË §;Faâ¿ÍÁ/PæÙuš«äS²eºùívyZ´Ù€²vñ-B"ÍìK*ÓÝàŸò³/:t«¹t3èϸO ~kfgË"xSÖ­Õ6x:0>e¢ëÕ™Æçî< $µIä]ç}+) Ó˜¹LRŒ(Ü2å¼[˜øÁÚï’õª$‘Ùzh†nȆéNQ+} Ïïÿ&à M4‡3óã1“²ÃÛN²¼£é{Ws¸Â<¨Þ:L›ý3¦ÔÐM Ð9õ)H‰£Àô XàU¡(àÝH¶©ä+R'¢³i…ÙÌRôˆÐE¯¢µáð 1)MN^-ôy75‹|€¸Î¾ÅºNo[ýT‘g¾w\¹Å즙Ÿb¬‚µcD|A{?¤”³hJÞHænƒæ¬jœ¾?@Ê|ß‹‚º<ÌiÛª€ˆ*z±ô™…+P€xfž~Z¹w½Sô­æÌìßö‡Ö—Æ·ûîîý†í>KéãËøl²ømþ¦³ ‘€Ì%údvQ..Á4‚¬Å©Þ1 ]éŒkA1ÿŸÉ¿<>ѸtBl;ˆ^}>ãªõÎÔ±G2;ÎÝ1dæ*"’õÿ윧¡ÃÂÆA€MúÞPÔÀ@„Ýé]£¥'Úš.ê=—3¤[zfU¯!†¹¼7m„nàtM& 5Ë 2{§¨T,Œ»-ÞÀi:cÀD"?óû™Of}ñfžg ¡ è$õL9DÝ@&ŠäŠ4M@ €¬SmfRÖ/1iÝeìF"ôR@ƒ½‰ƒÑ›X£ƒŠÉ€Y@K¥à#KåH&‹øµ€H1>)°ÌbÁ [ªrIã±X~Òg–­—©àÀ*¤ÀÃ^áŽßG]µ×iÊe]tOr)u)tMn…Tô–ûv;ü0²1€µ¦b'•߈5ìvíƒiFzïÆÖÈS‹%w Z]Ì9γS¿Zgc[Iª¨4˜zSbÝë’rÙlÐOr|È„ÍReœÕñÛ+HdÛ¿}B\ø‰ÈbÌ^©oЕÞé?yfÓ{ÑžiÕˆèøD)¬+|÷Æm›ÚRÄ£8”ûô®È•­å i»e|Œ\®ÛƒZô|(XqEåí§"ø‰ VœJµ¥{O˜·FÑ»@‡ù`U\ €ç˜pòºW~²×é'†µrF8ÀÛŸE7öº@¹7¾2Œãc}Ë6—WÌRÍ©´¬h.Ê@ëÌØª; Ï P¸ï;ÿëkÏq‹¶rpì{ÍV:~±ÝÊ×zÁõ2:ÎXDÑUí*-r(ü8Ìçˆ^YºË×uvJR¦p?Ïõò±¿ýæˆõ£\.}ÁS›äØ„W)º(d2 |è^~óäz˜u­"„À uçõÏòº.®W^?ÖJ\{Y¶ïÿñPì„|<ž?y'ªÒË㎒œU”^C/³ ˲YFФz¤H9‰P2öëuÌ*©2[e¥6uÆf~F™!Nî7½¿½‹°,:tÖy6|>Ôª:âÐÕ½üÈ£—Ê²Š¢P4"âôfwŒ4âö@KDœÝ4µãåYg0ŠˆX·‰ùD‘#å$°Ìƒ ìb‘H¦ª Ñ!¬»Xàˆ!+®´/À6ƒ";`Wq~¯äúÜ2Ã^ז”½ £(Ô(}%BS£’¢^òàþ^©ªÏËe¯Lÿû‹‰ÐOëw†{Ê7‹¯ÆeeW:Ë¢€û-®•˱ê7h´€,6?:VQQ[Q´áF„ Ú‡ÔWUÈã6Ä0£NdÔû~8M‹D5õ5ÕXú‚{Øs[/zýüÇï¾È{ó •ï2×íO›ëÓ#o~>xäÉ•§$£Ââ¯;ÄŠmI§CMi¯9 ¼nÍ"6BP¸ˆ½Äô(H!&¥"@C¢ýXbŽáŒIÄ€µf©èËräÈKœiеÉ{p§h˜ÅLE@1®ZñÉš«²„»04**-Á ºˆ«î!ŽÇ|*k§î⢓TL9=‰Ït×ßI;H8fÁPWJÐËé¸ÝTS X³Í|ý8$ÚT×â.œ$Õ43µ¢½{»´-ÄÅÖr0½™·­Ïõ:«ÜÐ)ñN/ÔÌBMwÄáÍjkz +m€u–]79ܵsk’@rÎØqÝj^)%ŽÑ=b*–Êf[W €”% $“2Ž,Na#ÛÚÆ”0Ñoa•Í4€Õ$Ž!càIDhÀxâ!haø bßlHÙE)„ß ˆ|Y%0zeAóê5%ëQR`£€"Z’©^üu¾í€¶¸*MêÀ÷&)3WG¿î?_18¯ ‰ŒÌ‰Ûèmx«µ5±RŽQf&d®U¦Ú^c:®Ïÿí•ßô¯Û ççQ‚íØ»Ÿ>mëóvKE4ñLd4s̶¶!æ»´H[ì·â4Â$µÐ½¾dD@Z ’ŸÀ6`7a8l(Œ`N‰A%êèNQöݪjŒP¶€KíÐh3@¡…,QÅä2à Í4 V‰)Ü¢ ¶rŒ 4Cv"{a2ÊÊš*¬ÜÖRE’5ÐÕ])£‘[ˆVΓ\*¤Ž‰z%‹¡ ©0N€Nço&´;'ì ©X¢*•8{"W_ïeÅÐ…ñ«JÄ,”ÉGU²DÆdi qFÄ™éwÉ´£øDÔÇG„Mû‘—,kÂÕ–ê“·¬A 0D1b1²äÈ´®Ù¡0-Öˆ/¸ 8¡ÜMšˆ‹ÖhÀ0 &2ˆ€#ƒ^0X »­Â"¾ÌêGpÑ:xÁÝhú¤‚€ ¾ÀýÉNkÖsüý¿Üû pQm›õ~ø­Ikj´š«®$ÉÅ;{k㦢Â5®‹èª˜7ä´ÏµI%˜@»g$[lRC±#ozV1 ¬yÍý‡Â·œa¯â„Iœã05m÷í¼ëÕª™ŸÓ0²iywììS“4ôÌ:QèÜÁþl EB:FÓîA޲8UÝ`ñ¥,É0Y»0z;‘°W¼:H†^‡2S@h“&SÃ4ÞÖñÖËx]’¡kFqS‘#S!ëe"Äz('šÄ;[œ‹ø § #è9Í|s”‡C%ÀHVu×ÐK,ùØ<êqìòÇ~w# » [ÀI×^¦ ')àÿœ?ÆücHäíHô@OϲÎ,Îzè (ÚTsåÇYŽz¨ñ0•÷W1‘?רöRé!½=i·à*Š{} J€'0À_¾oøš|0/ŒD 3?P(„÷xd8)d2úùKäg¿@ „ÝxÒóA,óî T¾›Õú˜{s iXëô/€÷Éx¼‚èZÅ‹ø¯WŽrb&¿ ¯$Ã"'Ûûð ¾Q‘Y¥j(ÀØ÷îŠýÇj¯´ëÞ›_Æ/§{ܳ?RÝ>ŵúm€e@ú·ÇG¼‹ƒíçÔʸVÉN[?T%@«J5ih«$p®¢Œ z-%hº<3Ê™r D#­ªšÄGlU˜h‘NÎYã®ÅBדº¶1„:rŠ}†ÒP n‘µO?éõ¹Ÿ<ˆ,/1L µ!¬é?c­p6B–—Êu˜M\äx7Àéw\õÌ…ˆWg>U—ÞHY6ü¦»!“¬Áîö•4£ÝIáy~‹  Èj†ö)Åê(î(Þ]Í5PÔÞLÒYUÊ?Ÿù%íªÛ{ær`Ô¼§·Ÿû§3¦ÔWSÛðkôo”ÊgtéË?qûçôVŸì¿ ‰à}›,ƒàÍ B ȵ™m# ?–0ÒB™ýÊû@ñ!!ù› š7=ˆÊÒDê˜ À_  jh"$mjC@>»` :A7·Û„ç¸YÒÅ„ëð‰˜?cßLKý•?½¬{ÑÚt"Æ·þh4_Ò¸1Û:;;šECdZ3)lï¹þÂÒ~W mã¿ø¨Y{=FBrý£”‘'°Ì©$aM÷6QèþlØÉ)1O``L2Ö­>yùêIÎã(;ç÷̱Ä1çó_d£ÓÚ®ä »—åÔB¦ÉKSyÚè4…ZÃ(ÉêˆÔåÞdu Ù}ˆ#%D„Ù‹ ÜÎxQäÎɤº ÷š”LÑ{LhVÍtoq‘Èó›éç–¢7•$,ÿzÞC7e’ªC\ƒþ<-{QOSO–ŽÕ»à™ÚIl¢Ç ÒIçñ´˾ ûšò†Eeéó`MšÝ&Æì¯«¢,!òUmê¢ÉÁ]½tNÒ»ÿ³­iŠnœaîï6ÇìÓ|ˆ2z^/~õ3¹½ý†èôÚ Êçòînëו£›|@ ÈâÅ¡@ ÀߘЯ€Ø4±Ð¸cû¿“04ý‹É!…7[º¡e÷`O žËMb›¨lÀn7ê[”ü¾Ø·uämE#ªõ¦J Ð ˜á<‹>{@.Gö½ÈßèvÞÞþhV×Úv;}~OMu¬} ›Ù8‘¹z½½þTv ¡±i¿úCÈÒîÊùIYóòõùøÜÑÏ~¬ŽÉ$§Œ¹¤x»XØ®E”ZiÑ|m„$î:Ïzà‹Z;R¸žy¦HÃD¸AwÑ2©~›z€ƒÌ“ÄÁ ˜oiœ‘=rQå]òÒ‰0Ì:Ã=ÀP{ñÊÓ<ûÏ`½º‡á¼Lsæt2Y™'‹ü§¨†šâ>Å$…üí°ÆU8Ÿ¿Æ4& ÁüXOggSÀß&,SÚùvˆÿ€ÿyÿ‚ÿÿ”RVÿHVZ`aÿÐÿÊÿß ³Ç¾ ’}P}{&×ýL)¡ŠÖ|Îúg°ÐSEÕ~q:©ë"«²²mÀˆuS1[?¹Å•eSµAEGg‹lלúßi&ÎÓ*M­}ŽRˆIÁÜ…÷Ž·< Á1÷Uˆš­ÕÁTÁ?Fd‰#”‡ôCD-À®.σŒÉ€`ËÑe 8þ˭‡ `·[ô-p€?À7€ep`³më¬ykÔ* )Y€¦@½´÷Ð`¬ mºfÀm] ­G»¨?ÕÊáË&dá0ùTkåíâž[r>h«£«DÀԇđeä<L3‘ ¯g$Î.ÈôáÖôÑ&?÷9ð!;«2{†£— lÆÅOÂÄOÃÙ dì+ó7Pf*yΓ þ¡(Î^’NÎ-¨¦y¼Äêtõ@ý5¿í0xŸŽçüå&¸;Þ5ÙIÎÉM²»‹L²†÷<èj2„¤ªÉ$Y"/ÎÚ‹ÖÖžŠ˜n¦)„»Xœ§àe¨jx\‹šzüE~ÅþÕà\¤€5ü%8 À˜¤ò®€×ÇÞË-ñ#´@ð¶èwªp}ø,89çxë )¾¼ÈæÀpľn#Zá†ùÖTRCDàËÍ'GÖ© –‡×Ç7øúµl/ÿOgî|hB³I³åôQJ_†1‚¸*C½:É>Z܈À‚’ù}+=Ü’ßgÙ"àTfRáö¶‘î-3FF îÚyšKꛑ3íªÓf«Îr,v.sO¿ç0 ß;Ÿ‰&•)dÝ;ÏîvÞk÷*ðmÆ(š‚ò1d»”4Eü“yzŠ‚Óm >Ïkóê¶§vgƒà‡S ð=t’¥á àjùv²„ÞÑèIÕLÌÌÐCòC¼‡fnrAÝ59ÏýÞ¦{YØÙ®¦w:1ç …óœþ“ÍØš¬5G³Å?fîO!.ÔH$¹]Þd3-j­aÎà:Yoç`™;+ÓÀŒüÝ1~&V@‹1 ˆØ% TQ †Æh—ÞPƒ@ÌŸ_àíC^Ëú#Ô¸sµN|ÆëP`ÏÄggž¤âéõóÝðàÌ`mëØjQ 3«ó$L€ÀÍ™ƒñß4{ûsÀÜ`újA×®HM¹özDºN=Mq¥TYE·˜LÛµT»Œ‚¡þüD¹%£ I¬#רè`Í \Œ§ç*ÿŠ•<{h(ˆ³ª9ḛ̈^Ÿü›†‰»š9Ý&Ÿ¬úfõ‡Æ7Õ‹YÜ¡ï|Ù'Ú˜ìz9Îj—®âÝ3™m'»Ÿa-0ÃL2‰L%ej¢ïлw§ÆcÖÉ—Aä·ŠÙWeefZä:ÉG±›\n›9D{_‡ÖÜ[5»Â™‹2Ï®ØïÀ¼Oë̘EghךM1Qr®6¯Ÿq›Ï>½÷4Å–›å"øV_°O×Þ:[Uù’$Y4ÓïšÎQ €þ°¿±Ðf–tRÌ2V@€2Ez?ax÷Š@þ¸  ÖªÕú#´ ’a­Yj>CÀþ߸€×¶Qõ¢Q_55ÉS€—Œ$wØF© ä±öªéÂW]³l5iÕµ´¬o”âî|ñ7IN<Öþb»h²ö#a{¬aðß'W2Û;W‰Ô[¿œñªœvÝYÒ½YGª†ÎU‡—SN¯¶J cÌ’UÆØyÒЦ­‰ e(ú.@Ï0ý«)–s0æùˆEB÷¾ AÕLº8¾ãÉ>>½|Vwî眢"(rU|_øÌF†Î¥Ø •w'ÙOŸõ©õÀØôÜ!÷'8kp@oÒ“ìñ ÝYËDo0ä¥Ãœc‰&ÅÞß  ×{`ÚLfî'º ž^Ðî#˜3T'ÅEþØÐ•(Ùd<ÓVÕ qLR&'åDvz^è<çø®ú'Sp͆=–]³fÛ*¶ß}Œ¸¯àZo53 þÁ ãêv33êB¤ ¡1x…4èÀ/,© Àðç;–aøO-âÔbÙ;P•÷•«•oÀÉ™á£ï'o©®Þ"ÏÂ@jè÷¿Ž+Éò©¢î»rg%Ï»[³Ä?/ô«"á>Æýäë¥Ô) I‚T­!éõ6‚Ϫj)Œ ÄvÉd‹t´kí¢OF2qU,{ ­ €PA­›KÝ^=O'vx¿ÐrÑlŸ-ÝX¤‹ý8Êàý*‡žŸ³¿3¬/E¤ËŠî@lj·Ò"X² °T‰,’Zø‘¨mƒéôÊ¡g˜Êóà´ižöC'óÎY;¼VØ,5{`ëœÃ‡høÝ‰°¸Ü”!N IäÔŸãnwað÷v·qï$vU7¬½®½s·?h¼¦ÝGw_aëõFw¥Øè²Š–Ž®d™½ý8j17%KHxµÓ.f`Áx†Š0‰©<ªˆ%²Ô‹ $BÀpÇÍ2¼Š}!g˜¸cšÄ©åª60M4霉Æ"çȦ©µof KY˜ì´Ô)=4PE¼¨Evm §G³)òÎ5#Ñ„¸à­Ù‡cÝEWh`h! Õ; ¢U ‡‘"¥”ºs2‰Í$€Ñ(ê ~Ëž/–Ñ¿îN`JU†pkR[—ˆ@ 0é† #€LÕ” u­â áffBŠ-r0UÄÈB 7DÙ²HEÉB;CD\ßQ°. €:”×ÐÆ¶Ž"¢KEE^¸êp „ v$ä@ ÑŠ1ÜøÓD)¼bõAiô±-ÿ°™ne‡+>vQ @}žÀ&¥Ñ8–¬jÅ’OmUú sª5^/^“b UØ}(÷=6åÌjáMÓJs/(»Uª¸7Ú,ß•]ÞuZ[¶É«H~œ£[:‡'ÅR©y" Öxaqû*¹Ž_åÊú®œÕB5BX¯亢XäÌ˶5Š•L9"ê"k1¤N©™%Tiœ…‚UÓ$BÆ`[˜‚ËLÐÁœ‰”ZŽO5CÆ ºm …®Î¢PB‰UlK¾ÝS°*°RƒK}¬tq8E¨KDÛÕ‚6µ¦Êâ%×Ò%å5k=£¬JA0–›u‡D›­²j—\VÁÞó,/J‚ËšàÉkR%Ó2#)ê¢WK.o¡ÿ¯Ï×Ýòú¾E{¹Ê¯^-ól·-޲–B#•F†-„aâÇ'¦|ˆºÉó\TÉ(,ðàG(|õÆž 1€0 E‚MNÑ sýGOÉn*DéÚƒR£jê3$}ɯsÅëõ»£<Äýxú:)&¼WÛ‡Ã-gÖ*‡â½®sÖçÛÌã~’:š%W@`zõÝßÿ ºšE2bdëf½T+G ØÓÀz?€ÏLsX}í¥½cœÇìµocK¦yŸ˜«ÏmkÖúÙ)jC)•рČìÇÉ<'Æ‚µvžÛžmç=MÜÆ±&ZsÄD²ƒ¦ãÁ^xIcß¿—U+¤3JåÝãÞh•¬fkµ‰—™ƒ& @¨W J ˆŠee·@9»€¢×P£ÒŽ^N›º5÷Úɱ—ž­XQ‹¤§#ŽæZnï®c¿¦«'"P¨™›•>nŠýœ}rdMoÜ¡éCËRúyú;‡òrìÜD§ô»iOiwMq5Te ¹_˜y©Q»I`lþ/~ç³”šÈ‚“¼zfòÞg‡ÏÑÞ¦„«º“¥ØÃ`Av8äk™Ï½‡…è†ioû|¸·˜#ñÆ\@"›ÙwW×XÃçèñ5â ÚRÌq g¶êÆÑl›”¨Å»›,Acc¼¯åNõRMsz‹¹5T?먆¦0ÌèBXBÀˆ²M,nz0²(”ï›Lý®Ð”n³‰Ò`I%õ%þ‰ƒ¤;Dz4vÕŸýMiÊY„†±ô³/ø_;jj/͇B@!½Ùò±ôÊŠ¹PÞ«m&BÌ› ×›m1qƒ$#m~& ‰Ëk}ÿT|Ø÷lúámâk¢))³ª£ýIŸIצ!&n!ý Éwg°*§¥ž–ôÞÏ·PyÚ¼1þYH£=búxVÎ5…8¹=Ó˜u¦cLÕο”–åªN0ñïW'y÷T rÎqZ‹›¥YôŸö©KzAsn)»³8ʹ{÷‚m¦ÖÎvø/b¤#?ϳëÊù8ÇÞèÞ„|›í—K$}z;|l³ß$\†–ãKÿúog–üuÚ~Hãl ªMçÏz|HÊÀøË³ÓWßä{uBxÃSI1 ópâ¸óLïýõËÔý›šÈÙ0=þžOØÌäÕ8«ÊI³oÎôôDïÉL4$‰îÊ †›ëÍÝ·§ƒµÂ (‚ÓÌOåïªôK=×­“V 2¹3Öüu_ШÝýÎÏÛEÓ‡ÎlS½óªgSt±TbÖ*ºZ`PrñŽ`Âr3<@iÁBœ×²ŒU*½[mrâ#Å^ÔÁ)€õv%M’˜’W`"£WÀ‘¢%J<–á:Ä2‰„¹ –-4-£/Ùë†/ t”þ«]eI+DF' æÛÅ6“ úG©í3q2Evßj;L-€j÷lcØ XÛ¼cm“zSS 7‚%€êÄnWüþ®•"’;X½9µÑ9«gNx“øB4Y| “n›TõX[ã•g¦t¶îkŸö¤Çe1¥f÷M'U¨ÜæZÕÄϨ9ô,9ÃCÍ~o@Èâ2´ðÜî÷*n}iWÇç“gÊ“IÛZ.´šfâØ=Éóø4}¦xý¸'K7Ÿ¦ùö¨ÉÖêŽïç$ ¦aŸ¹ôPþ[üa¨¥Küîxq!ySê"iâ‰\9ÙP* rû/˜”ìsjó»‡,OggS€&-X—\ú»ÿ­ÿ¦ÿ…ÿ„ÿ‹OLLKJYRÿJJ\ZZÿ‹PKzø&ýašÛ½=‚ò9ñÛ93ôSÙ”È34úŸÍ5Ss²(þ‘ñÝ™3'_‚é„ )8oþ$¹ìÒ5Þ´SQíUQ ØîfE•«Þ†,¦é¨„jòú¬Éy#¦;zꑜôîÁ¢gqdZ“…cí¿šv 7 HQ…þ ±Á¿í‚J¦P «S˜,®mTrÖy0èG.v£ƒ`à‘ ~€DðU£‰±IJ¸h; H ¬]Êv2Xw±5õp¾g¢()†·¬} ðÚY Ð|÷ß5ä`ÖáóÑfm½ÈÌSª*²—¬†®Ãè.=É{Æ»‹ÏžôÌ›ß d‚tv{ž±ÌûÓ¥‡S©x$Ÿ[}ÇŽ®*2ÞXçq~“§„sN©È”.X”UV¨Í|‘É×:HGÚÝLÏc™ÏD·¨•»êf÷Ö熢«óîRýÞóºâÊ×pŸhºßûp¦‡º›É;ëàײG3M{äaçõôýqSo>Ysª˜ÓÚ6–ÎèÉòä“&ÆÓûnFCW×}"’<;³ÁTžä‚q¦×CIŸ+!Ù€rÛ£GüÅÄ\]x¿ã¿ÿh±•C2 Ovd>wgQÓ=d¦EƹÌgÈjvW&@ ¹¢ë:ÂT3“³ød“ó"Qÿ–—drÜòã~ÿlÇbë½cÚïCÊÔÄ^¾vuçÙôà‚¼o! ÈX~Ü& ÂÒÛì !,ßxøÏVœFUŽ”U¡‡;/4«N¢¡–äRh 5…‰e›T>Ûír 5€Xl’Sè0ÿžy(@31Üÿî®y]ï2,|ý*±¿€¸²ÎÎÆ¬Ex«jÈ–€ ’1H{Ýê3ñ]C<¾Üs¼ŸÍñ¼àÿ‚ p"9‡ÒB<æñ‰ÖGl`¿óÏ£¶Y>R„6€kÈ™Ñ_'u»-+}ëîáÐõ™Á7LO–x×G‹xr1Á¼dÊߟh’³‰fŽÕ4üx–ãÞtÒz3åákÛ`g¢g×1È^ Šò]äîtee6ÛtÆ¿ç„àïaˆ‹J¾ÅÄ> “dN)sêùCN€šÌû‚gx™°?¿ÛŸíw½$'À_ô–&C¦›ÕÆ4AE×¹`äcàdW¿§*Ûó³7ej?‚)/s’, ȼM•;Þßü«Ÿn÷tVä'ëSÃÏL®Æ“ÕIV½9YhÛóÀg/P$}¾ûv{ÿjœhù)7¾ŽÔªÿÅôÆgÃ>|/bCâºØh•tzÂÔèÐb(¸™ó·çA]7¯mAhN ÍFþ!e ˜yÀy1—å4'}Kpƒ@F¾Û]õꀀÎÎîL›øp˜?2×ã0™#oà"ì3¯µÚ; ?ÿÏfÌ}[;M£¾mÍ() @á¦(Iþ‘øb Æ„Þ5ú`FÏ­{¾<>ùkôwí¤r'ìºÕbd"xSz¢(§·'Å:CsY½#´7ħ÷ÝÉ´r÷)@t§¢M@‡ú±5:ú³9? @¶KÒ½Ôçß-¦ªÚúùíìoç–údúÑtÜô¾üáíqÍßþw¶_'¥øWÁ šÆzÎÆÕœ9ÿ‚ÝäÆOïìMÌéiõóao¸÷Ø>~Ï\ÄÚÏkr8Ú*ñ[ªa’ÃðÉ‚½Âá¦è¬ÓÙ0MäþŒ­ï¯í!gÎ[3@Æý6 ?>î=TƸè‚læTßôžè†œêº—xcÊ^™üÃÜ“ËßiÈ8’dòÓ”N…?^]¦È|nñp 8X£ž&®˜|bbðé6»mæªAhŘÛýŠâ™Ô/ Xà9ŠSNUTrÄ“·/×{€×áÐçs±">sõìg$îmí¬Õ¢­«æ׌·uZéÎ^ó H¼Û2Á÷5®ßLSõJ)åj<"“î°bQÃQÜ‚´w…°+JºE›1…Æ»êQè™â^Sþ¸}Ëã¡öîf­nÄ%¯@ï>y4Ý5/ˆ;ÌÈÓœéç¦/[°¨xìí] *zEw抚tM-ëGïôAÅg'$C펀é@˜¡^õ3woì_E°÷³6kÆ›§Ç¸ ˜;éœFÛŸ×8w³_‡Ýê™Êê¥wŒFÊšÍ Sª†Õ»«Æ,¾¨›.ðkÜÝtf79ò5OÏâjªï./ìyžfÎ4Y\°hÝ >Õ8™—ÁÌ\'Oõ!a ›a(’;¹Ô9çÁ²à cz‰Í°I8;‹kÄaµ«1HЃ”p ï~3ï0ŒÞ} 8XlV黯­t¹J§Â3Ûpõ›=Æ`¥hðIäŒI¦¿bêCýã2®$AÊG¹ãñ¥ëæýæªÍÏlô½kØøŸc5]ÉÜÖìrÝ0þæw±[åŸ «õƒ*~|Gè$:|–ÐÚ­uâœ^Î?»Š¾q¿dísõqfýž–Æ…·¶ÛΞKSñ ð+ä†Ý»tñA5Ú g»øÿf–ÇÊ›•íf¥ ºƒ5Éo=Љ©Z޹Mô"Ñëߢ+¬é©ë¢gz—˜™y ½`y$IcÞáìjÓpFÿxwZ%ßöt2¦/(ß[ýòQ{šhwÌ,ߌý-û¹Zîê<ù¼-#ʸ¬S¤®õ­'íp‘ƒ—|lè ×'â°Zq’½Ü+—íz„÷æ@þ=ô~Ó;ÐÕNµ« o@_I¤CõÛ]m{yè73.öÓµê¶vdýºÉùœ[Ñ×åRħZ󈸫ey©]óíÛ+üR¬5 ‘ °Ð–w?Þv 2Z•ø+ÌC „V1üs´Kðx*î>˜‡hŠÉãH{Ž9Ö¶ÖÖTU2ÁF$“"!ÇHçn­Ží/“ý'ÿ?omú´]X0VE?c»˜貃.8û ÷f¥²cjHqÈQ›tõû"YÊítà[´ñ‘ÓÙkRÚ-/á>~>—Ô> å Ãôw>AcÑuТ |¸äGôe?Å“¿º£ìJ<.eaÚdÿÚïÃD0ÍΩþ…s­R¬‰:ÁñzÄ2Zåõ2+«“•킜¤¬[IªhUeÖ™áëÍ^Ñ–‡ùw·ðäTfŸÊjrúO³§)ºûHódÝýV€¹°Ý¥t%%ê­÷›ŒÅå?ïžú¦®Ô¾M¿qwWŠW'ÍJì/´E‘¦"òºåjºéÉmóìˆY»ux—!p0%fçpÀ9»‹Ï@‹=€gÎ^СÃMBFxäP‚wõ¯ @€ Š8?¸.YBç|U”Vå‹ yñæ›PááA¿—ò‹{cë^„(›€|»aþó{g–_½í¤ò=Ÿ™"ݱèZåܳ•™+Ëmº©)*‚¡¡Þ„·ôvÃ'ß’¸¿¸ÅÊ/P¡?n¿èØ.kn³c+¦ÈsÜ݉¥{κD8Õ'ëì=ñ?ç+Ùýœ_k]S}ÝZY»RU€øŠSÄrë‹=Fî?h¡y­¦»¡e9ÿ¾»åùêÔ#™tQÚ!G1Ãú}â_¬œðó»ï쬜n´ëÉ9Tv’úî\ίçm”}üíÃ!×=g/ýÎæBÁ•%Qרo"烀¼Fe7ŠÌô{BÃG/¶Þ€áæ°§¹÷WND_c–Ãaò´¶–»—çÏÐJmëö.Ï¿¸\ʯŸ[V}xNñã[‘™…è¥sÂŽaÕL—bdEŒÑǬgàÊî$œ^Éi#úBù§W|Ø¢XöÏ´QÝòÔ³ƒU)kǼ%¡¢>¢zú/OÏûé’?ëÏÃ5 .ünS>±¯YÂv:žÒÃQOqo½ÆdÅ+R°,ÈC×ô{e2²y%íkØÔrÜ+ø|üÞÌ[r4b]W`÷Sä ¸|+ü~| ¨†i•å‘ Æc÷©ÿÜ>ätžñ¼÷°nM%5Ëu/§M«7C0<%@Ó¥OôFõÞSöÆ>Œ_G×öGÃ\‹îÂæfWÈ#å¨Ï Þ~‰û.9ƒtÒ¹lô€]ÚPOš¬M•6ËBé5w»‡˜ËYkCz¿çå£Óí*5O_9‡( Ay fì“ûÇ5&€˜V÷h>ö]É„1X‘ÊI=¨g窴qrñ#ëצ‚º·S4MÏô¤!GÖO’XÜVúÜ;ÁÐVM+€:$ dRs7mÔŸW1`¤a‚6½Ä cñɸӑÿd£³ÞÞ$]÷Æø¢’ܦ·R´gýùÃòaY¨ñÝ|ªàM!nä”5)nŸœe?QvÀ‰!`ÁÙ¥HŒ‚qpz6ßOOn2 @±Å6ˆß8‹Á` ‰ÑŒJˆ ¨¿Å äzݤa_ZÄ5¥C¥`òÜ&Yü/+Ã’æ‡3-ù-ƒ÷öÞà2³©NSÓÜ?$g©b#ßk˜eËGöý¶I¾¢7ÐN ¼Ü¿-ô‚󤔲ö¬¥¾Î¯6Ü€d¸á{þÌoç#)Òü(© Ëó³‘A‹îç%s‹ÙÜÜå\?ÃT=ûD|šÜÙù%Ÿ$¬X½ÑOggS@#&.i=¯gLNSK\d^]cÿÐÿ¤ÿ¹ÿëÿúÿüÿÿ{Ó ì9š©F§ôiO(â“›ñ”ȹàæv ó9ó¿î²¼¿—l® ÆzÉt¥C,¬î^~ñܽt{µèu?mÌH6þzÒ ƒã aï½I¡ioÉ6: ­Á›G•w}…TäR @(3ºÃ_è÷m‡B>Ä… ûœz´~|äcKíÐøŒª²~ëCí‘·ßÀK:ZU- ¨ƒ€ß«”pQÐ÷xíQuF\®¯~º_¸ŒæÔ·ÏâðÖ5£m­fT„Ò´ùpIà©§@®Ÿw\în.×lÌÓÞ9¬»ºµ¡³·ÅòñàñÙ¯·×ªD)Ïó”˜Z“×Fj“K–ØÇwËéÐSÄÍ;M™JFg]æÛs9»ê#Œã¬ð°2YL ¬]—× DVŸå,›x׿BÿÉ›þúéDÃ40µ£å#vs""#º¯e w%]Ô¡ ¥Ëp´dÕš$¼KšÝ?[AôPRÆÇ+³ç“hý¦cQ]„¾ÞšŒÞä2‘Û™‚{¨J ê‘-—GMwdª²Ë¸Íó6a<»ÝrQ(ØÍNrªŠ‹¢’3¹/ݨ*iú¤+áA)¢(šNuD™ RYÔԘʹ£U}¦.Ahô üÇ?/áÛ¸06ž^ièuºëeIèë ´8kÇç9·››0¿+¤0fHƆ±GH-°M¯ŒçÙ›TQ“ ð‚ˆ†[2F@ž¤I(B7ÐEUa¢'Ùë#ðC‚ @ÒkØ xqB’jâTQÓØ¬ÄVßÞ´7!›YŽ‹En(Ð^üÝýÞ_ÊÉvŠ Ø\ˆ,é(Þ»5ÒCˆ¢ÅDÛ»•ÔCh¬Ð~0Ÿg̈«_«³cÄÊíîæCö†w6OÂì¶³ ÐΖßü¾e>ëjæ›Ââ\¦]:$€7ljzŒ®÷=ˆ'¹;9ùùÿ‚i]•=GkWó³¬Vv—½¸¬©BN¥¹éÝæ+U6²ê܈™'"SäPÕTÇWÒcxÔz“3€C«^ö!‘‘¢O{14ô¦1(%e=e$lµ „‡t2”wžaµ±µ«NÛi<*§ ïU2JB"B•¨Ëž¯ïcb_*«Â‚›†p™qj{¥Ê¹â Ÿ@G]8ÊѳÕtFÖfh,•Úá¦Ü»šó6• lYD-DNft®Ý,L!«Š0Ö)|Ë÷÷‡6ç4Ïz…9³= `ÀoqT“Ä º‡a°‘Iˆ ¢d• '¥¢ ÙB‹ £Î½Ó$²_9ãÈ^÷½«‚, ³GJdœüÖC€±âÄ@£‘ÓF6nÊûý%°ŒŸU^Áˆ1@‚¢`M>Ë•°€ò¡¢—L7ëe(Bé‹KQMô~Åq¦­÷¸•Üs@£‡^‚3‰0ÎmÀºX È·áó½™7%eÐ’% ¢O6¦ü¬ëÌ´â”üÙËuº©µ¶˜õ•D)¥n®v ¾øN‚ät:¨‰é3”ÍS ¥ˆú¨Úæ"aß: ªYŸ ðyŽÑiž‰ ÎзÖ_§<µ”XR¬Ëu`É Q&^GdÄì$`Vµbýi]YI‹xÈHE[‰]Õa×UIÆK¹Ý UÑEͫϾzî3Œ¤^Œk­Cr£t)8Š‘ù•…Êà¸úP%Ћ’ºÕ àn÷£He%¾“é)i $+M65i`ÕÓ ,–‘¢Éê¤Ý³ã·uu‘;!ŠGµhÓˆEyˆ ô Bî¢ùv´±ªhUu¹Þ.w™ôh@Ý‚Ð43Z×ê*èšV:`’]ÝI¢À=”HÜ#È$ zýX9uRš¹LŒÁƒ,¶ŽÌ,õàØ 4¡)ƒ¡Ò š ÖY £ŠFdÁã…5‹ @`)|x~ï*fFÉhC>«È'@¬:i ;›uœ&Z(#Nó +båÌ¡õ)³à£¨ÝÉHõD<÷jpnk¡m¿[¬a}HX7¸p#O$I¾ŠæºÜ¼£”\z¦×L^²]Ãiþ${Ö½‹Y³ü¶î¸áÓ‰/e ñ™l§<¯J.…Oçe¸¨/ã¡u@Éc¨žºC½´i¾PrÈý¯CÃÞ>—¨UÑF&Å{Ÿýñë6mh‹]7R×z-fB›3¹ˆßÚ—§¢¬ç™ ×?uc_Y¥¶Íb(I÷•nÕr9…tQ°õ³7„“±¤ –Ã:>µv5y=!„u´:º¡hš¦¨%œx P4AFX@*î†Cj¦ ɸJ9uð#ª@Û`…/0`´I½Ê–àQ*H;ž›XWÊ€ÜdOç°rZdg¾¿U†@z%VµÐÐe¯$‰fG­ëÅB(P|¦s»òuB¢=å ˆ„MRsjÏž@Î£à ˆY«"¬,(¸`×ÔࢠÐ`pèÙüD…ª¥±U°T­°àH©]P,(Š¥ ð )ܶD ‘Ѷ¦R@}!{þºM(FHD¯G"ÚZmE„|±êÑŠ z?€C-fÉo|&"ùìü$šv‚œŠÀW€|èÒD+0Þd¼Ù ƒ'@y-âÖO³°ígv6·5—ø5•ËÄbޏfì =»_>õz0ÛÏÚÞJëϯªâ8×]ÀËxñ¨*CKKb…šT:’}hg»á-ôZràX d’Y=¼ïï3¾|+¯7õ;Æ´Ðoì-§và`€Û€‘^"‘“¶3) šg`¬É–oÛL5˜DÙ¿ P^*øül?âÕO2±ðy·Œ.£o|޹0ä+ñ ÄÆôE C!Ù1qëõ5d|xWþ9àíÞ?< ©©ø" àÇöÓÞ YɨDzÁtLµTAUÁ´®OÆ¥ïµU‚¯|г!£@€ël‚Á?KûSò Ý6R¦>^»hÐJ vñ1g«žÛZyÉ/©[]Ì¢@“N€K(°£s­Žé Bœ¹}ìjLÖƒ:5¿âØ tÊj K}ˆÚçúm¶È‹‘E¤\Šö2@å\ÃVJŽ"ÑEigìfiˆN~N¤ˆ¾i(°uÙ+óxì0®4„k ã$°^ x, €$-ZЂ"j©8@ÁÔ‘l ƘcU3À:é \"@ÉBQPÓ°žZÀ«šÚ AƒÁ†Q#Ù hÆ‘ôÙæºÝAœ ¢A¡ªUÀ¶ `XGɪè(U1ê TcÀˆ-ÈÄXŒF(€ ˜t)…qOggS@G&/°ë} ÿÿ ÿÿÿïÿëÿßÿáÿíÿÖÿ ÿ 8Þº­Ä”i zUاYCL37ÑYt2z¢ï0U£‹,ž™~çæ³þãOÒ$žôcp^m5¼Ÿ63£Mn¸Àð~rœÀ¡ßlrú> ¢Uÿ†YSÎØÄ­S˜à8ÓÞ´XÒØý~0Öü ‹dîcŠ•€’€HÎx__îçk¸§Ÿ{¯2þ˜Rhbî?å/­ÊKãûÛ^GÑ7 @(Nñm@L&2AbO·³ìÛð›#ÜéŽÄ†Ë@4•¯þ•ã:÷ ^¢‚&ÞnÂ?^¯Ë°ÐO4×ç –Òí;2°îfø@¨}U°¬³V¾·G$ÿ <7|NÚ@€Ü‹n9·³ð²u ¡B(f–dðYª\·›©ß½©Ò¯ÙlYÖÒ¯€¶½]è2´‚¾\=Íx<}9Öw•'äR®;L'9–·šLÂs' t%Iòésá #j- è!¯€µý44@àÒt80…œõ¼bÔ™Pÿšh€XG=è"É2:à€¸-Ïhê4  `U* ­©m[cUœ€dŒlK1;µ ÂZ‡0í­i1b±“Ó4 VgÀs–+ å"¬œfìÑ(aVSà!»£TŠyc¢†9¬ÑÓÍBÂÞ'8Àòe¢f™0‹ë ÎÞi( ¤ÛF„àÄCÞ*ÙnhNïVP@ÈÛ‰Ž U¨²@œaÔÄ‚:&ÕA©€¨Ç³¥û¼)º“+¦»Ã|‰Úñ8““¸lErò{]Öq”x@’$ðL0è¨Æ):v`€€(ÄÉpð*QèÔêúÅcy4LÝZ[€~,gZ³¬ !õɰnYˆ zý!ä<¬X€Ö:´D®ÐvVë†4`˜YÇjThÁ·d¢x€ÀxQ@9C=û*m ¤ë+ –H„H„° SQ@T„n:ÀZ,ºkðZ±6—p)«Oë°b襀都}F뀛áO‰ŽÖËè„G«×D,Ác±èÚϨœž{EÏþv Às<þùVH¾U¸S“mõ5Hæst}6Ô¢5 OS<ôÁ=0êÛ5ý`Î,8$àŒØ\+¼{â<•£”$PR×zÛ:ïÍ8)p ÞŒÆÙog7ß±2 X¦56üQ<3åb„NVOñÅ|Æ%>½U9¼¹^€\|0š†Sµ²ÿá‘ ççF‡ àEMŽ*Ljz2€cÜ'ãô@ªú±¡Ä,õÕœ€R – ^z¯.}Cž¡Ãˆš(xÈx(xM”õ^C\”Ɉ7þAã¤MŠÓ5ø¸yE{‘J,ì«ãK)ÀÄ$hºüiÆò¥µ!¦_Ù€  Uî`F¼U ¥ h«€¼ó¬;#TÀíŒz]@JBªYÐ8 Ž@¶Ž•€@SÑêr@ÎRf2TTÍ‚ëX @ªðê  雼™€h&1EÈ”9T±Ì‚l€0ˆc¬‹ï ðb:@Q¬6‚…©Š*‚* `­€JÜ`µˆu€€ €¡0ZÃ’žÃ^H Þº-hФ-4ñ¥^#ê±–h‹®e‰x?€WËlõLó†å‰ >E0±êÙòJ¼€ìIÔàS5@ÚDfkÚLúZÀTyí8Aƒ79nì€LÛ ù°ŽÌoÞ|Š« Q{€›çVkÌòƒýš¹&È͉4 QÛ¢DC†PË"ïËÌÞCUAàåø)µß„Z_€†¾îš¡J:³+>îÒïù#Aƒ´9& TPF/µ*ZJ¤>}_?ç¥èü`-B€¹7‡„0á‘×2ºLdÚ‚ã "1È€Ñ V-€ ˆØYoU›ƒ. PŸ”’ƒ(z Ã]@=cˆßÕ´ *ÆÒ€à ˆVHªç Á‚pë…g èÀ¾šu¤€¢£‰è•V¥BÁéXAí`âd޶SÞ]>Ýëñþ8‹ZŽËI±'f<ÏéÕWË’!ýZ“Ù¤‹„Y'é–ܘ[RbÎóDyßÀnf” ƒ3¢ÔªbP Т] ¡ØÎlÍ€Pwý‡Àe@6Oƒ¥JÝϪÃj¶eɈB¯Ãsl«üö…©ü·¦·ô‹šÖÞûzŒVS@ÖâNVO^ª•œƒ;z[F¹÷yŠ€Q„æÀe=="õ§ö¿¼ë³û/v¾ˆmÄ€,ê&^ëH×€‡‰˜ôž¸ì€½{îdmì£m4ñSd U·mHš€ ÞðSo©ª}ã”?Ùm]v\Û÷f(?"‰‚ ”VöR<¼¶Cn;òΦ™‹,mCh ŸÉÞü¼ Ær¶úüµpz˜sÌP7©ÕîÜXvϤ|`áˆæïs¨}wâ4àl™Ø.ßQÊè€~ûVRÚíß‚|éHmüÞSuPjñdV«æcÛÉ9ÇÃàå ØxÄ©iµzÞ_Mv ´ªGÔNÀ¸=™H¬¹o[_k•M*¥.ä2@ú€É]R££y9çd§Þ¤¤ÖùudOÆn•ñ2rÍárrñ@cèSÆPȬ"äA"9•r¨…dräœ9??~åpè*ä…à=€¼Éiq¼œà™8v¢?RŽ[ÏàñrÂ×ù„=Áº­ñýº]òŠ«èL¬qJʬ‘2nzg 0÷D{0cWÔØåÌÆ ¥œZ(—W¹µ¨ëÁéþ·gÿ¯:‰ÃýÞ€a:r3¢m+·Óš*Æ) 3=¼7y¦‰œéL~_S=@Qy&ÕMÀÚ$05P“±†Ã?ûeT9M%О ©ß üd_ ô`*©öž¬ìæç÷Eu™)²*Ÿ¾Nââý]6qCTÖ<4Õ}SÓÕÓùŠÆ\{…³êèL‰yŠÈâ:Í4#Œ<$‰A€1±ä9ÆÜ€ÿ`XHÙß”­‘fƒõ†0¨é 0Pø5Cn ª7‹ŠÎÚ««ÝLȘµÌ!R=± P ¾¾ª­ ¤¡x¡ƒ›ŠMÈÅñP‘Z¨ý|r±ô/—_í±Ox·çòúà¶\ÒóÉV' Ý€À6g;j£ê Ð!™€¼¢çü;0œïFõÂØù%{E(íͤíÁúÇü<@üg¶ŒOAÉúL|õ¬MÉwVod@.ðJJ‘Ekç{ÆÚ™¾¹üßœ•ÜÄí¹CZ€œ÷ê4º)YX ¯§VÒÑÙŽûëŽT»a´Äs± »~jëôŒÙD ?g"w%æÐï¡9’ðVã*uÑÀÄÒë·éò)˜#¥BVf'™‚­ØOggS€o&0aÍjÁÇÿàÿÙÿÍÿ²ÿ¨ÿ´ÿ°ÿ²HJHJK~k2vÂ1™ȹ‹˜-^:0¤ÎSN41É–pvM|©ÞC%=Àäô;f›z[oíf}#†Jšé¤eß*54ç\S•¨hvQP‚¨ëýfv29=ÀDZ˜œ:~ÖvP@BÒ‘ôÉû–òf ÊW餓žž™}S­?Épž¢ïçâ±VKÉ’\ÐD‘ÒÃ-ÉÞ:$<”&´ÞAO¨Œ€X¨f,„,ƒá@°tîõR›jþÔ$Ø JÞšíDÏÑÀ‡R¯Ô”é!£°ÿïuþs_ëòŽWÃæû¼‹7$МÑ&ü€lE«|ùçÐs€.8Ab[N1‡ïªÍU¤‚€¬€Û•ˆéW'uë<ãSžß!ð²6\® A@ÒåFý†×¥ů td2-ÒÓf–ôóT訙ÕÝȧ½‡@)oA´yPð”ÆEƒˆ‡€÷¥õÕà:öÙ7`µLËœaH«z pŒ¯u_ñ.]CkºJ®sÖ‚÷¶¢»òÀÐ-è¿Í¾µ>€TFXàÈç:ÑÐA–v£Üøïÿùí]WÌRP{f¹õíWÜ»ãNw7ÀuQ¿a›©ža^¨,%³³9ΰ×l +ù† r€a™ ‡“* j8•d¾ó6À½cpN¨è%Ï;Szg©Z̸XÎûîéáBƒ¸˜þ)½²Û[w$“‡‘¼Þëð$MvvÈÉ»ñ—"l8¿NôVª™¼æ°&€&e¤³/ ‡—É€àqW¢Ã€V\ª¢²®(-€|ý0vSjËBCŸE]p 2áZ5ì‹Á¿5s"€ ©% ³ ©RÁ| >ét"€M¾Êíܔ㽠HêÕSZ4VmZbú<Þ//‡AñÙÜÜô1˜\8kjŸ?TX Â仓›p˜81 Ú÷Ÿžs8c+ò¢SÔá½¶†í´)È 0‰àË-θcÖZœ¥Í¯ýùtGõÕΦÀÐí@_4¸qA¸q…âÁvÙï=2@öb^—»tëmæ¸+CwÈ@üÑlç¼!ñþéwŒ9OxéÒ¿|F~ÎJy|öHÑû§C<½³q¨™çÇŸ/¢žT掛ŒTqhéøã+åpÙœ ŸÈÚõ?kÎ…Í@E°´°ø5@ÓéÍ?ýc;ô;ÝDÙ~Úõ¦ $Cn;S¬ÊÉI¹~‘AϨ…{~ “ôHë º8 ›âÒ½2† ˜YD²€8‡„«€l PiµE}a²˜€ÓD†2$0´;Oçþú½Út'¡iˆ/Ôóã'K6$·{î/¢KÓ#IÏ*{Þ`­Êj&ß k¯6M  §¬©¡$ÁÌIÒ‘–’W‘© •¡%@W¾{lLÆyg‚iê0… ^c%¤¾ÊmäžÉ%ôB£GCœZ˜SfÑÓÈt{ü,~zxùâ ÀG|žlRvˆù ‡0î“;èCÂ…ôö}>¹Ö€¼hµùtp>öá¸PõÈ]ÎØ ÈE~ ?}E/^I@–c‚LKAÕV™9ã˜õ±×Ï?ȾÞPrÙ‡ÞjÅóû@yÈr¿ÆàÏ1Á‰çYÔñ­/*”ãû;áê˜{eí»¯>R ýñ…°Ÿä€ÏŸîÅÅ–™ÉEy?_ز Aà®V6eÍtzkc|—ÁbFA çûN×WiWþ³½ó‰Ç´<ÛM’ÚH §#Ñ}'‡½‡î’(tç´@w2uG@Bñk}õÊ$woªˆ _ÜŒý ëNaá r€c¿&ì»;‡¢¯¿n€&""¶þŽ/¶ìl¨t¥/0ý-ß·aWAª¦ìé—d+E&A ÑA‘Ã@ºŠ&ÃÈè=[[‘n†F.ò¾~ $‘‘@ÃM–)Úp¬Û ²hâ´´A""¡Ì΀­Õ@¾ÛŠÁ90(XþªíàLQ AFEÁ=z5ä%.dx6™ÓšBìuñ2Àãêã,”ŸšÀõ-/ 8`~2yOŒ@¿ìŽ€òpë„Å »÷s ·rÊ: $9^Tyi{Ú•Ðñöó÷Ówmýfvû’9w<i>{â62±?-€ø‰ÚZ†ŒÔß6cíëìr‚/HQ<@×ç¸~í“çG(àmóU–,J!aÔü7€€O|hV ÜŸ¹¿âózÜfNcñeûjØ3ë!Á! ˆL6gih÷v#YH^f;qœKVõÀnH ±³ýÃ[ZÁp-Ï^gµmuP7:[½<íâ½›édPt_Êl0NÞÌà”éÔçµ4À C¦Dm¿0TW+(ç@!ëë¿øÐé1ºD(r,Öx ‹§¢ xHQ 1MPYÊ•a ®ªd ²` ºÇG$d 4SÐ4 gÀmÅ,UŒÀU4~"xÕX€V´ð*R ŒnK¾º-hÕ à”Š­Ä6ÊRz#þϹ_×´¿x_v½=€gbAÀÈ Œú€ŠëQÄ Þ²µ²NÇ oìy(àc¬ÛšÌÍ:BS˜%€pj<fjx~%¼+ĜѣzWW@iÁH|ññ€  õz®Ü,Pº%@ø^·:Õîu×´¤äw޽{.  €m™Ÿ‘W`õáÙàs&¯ô ¤ˆùäñ” ÉAeÓ —÷ò|QR3"ë9é>¡KËœáâÕHJï眂ì]Vúš¦4`öEˆ¾îtT€šÖç­ FFE–Ý9E5¾Ù·³(A@šÈÈã©/•3 P]ÒZÈ>7Tþ—¶²zh÷Ä-ªtÕàOžá„˜@r]nëyR°X ‡ Î1hßúËž=Z×C.2ˆólü‚ÇÕÔГ9J”qVB\ͤ-E` ¦Ë’Ä@ÆI!¡‡5Àà©$®ü ö1 ,Õ4 DÀ!ï% ˆ®À'€>€‹]ð5%':IZ©Þ£2Ð Š:<µAœð rê$îrOá\H›ßBôlG45ƒõ¡ ž­^ÿ8ž@?™ NàÝ“¥p²f2…$oÀ4B Ç@ô0WU²Îè>ªðÈräêö tª{ÈHÝþ”õc®^Ô)€×E) @)»½E³eŽØ»Ù4æu@ÑâNO·¡TŸ¤¤¶ùq)…ÆN&?Ÿ[‹ ¡%J†Bhw×N(Ú‚P( åfZž³³À/ïíZµ[£}4zœFvu%3œ´ã¯§‰ÙÉòÚ/£\jn-ûÇìÐÏ›ˆåO·_`j=-肎~ª`0TýƳßͰišÂ´¸å :HE¡Ø²_pœ€!‚ðÇžX©b€Ô@±®Zëá¥Kfdx\"ÍøÅÖ…ðïÎÎz'  ~|O$N»¤r0%gõ µ£.Ḩl¤‹Æ)oR/ÇéZRO³âa2®dúÕÛ[L/ÇnS›R9@€ £(¤U\^™5™{J.£¢ÈÐ@%Uò×$“X0dÀ1ÆgâpBlÆÅ~íJg`¢&Á|š¯ò@Mûnœç.ìû§k ÐÈÃÖqh¾Jž´dû¢äÅÛÀ›Üsg0¤oÀEø "?ÂuIÜ€«¢ Q'&ë—üïºòz}î>svåÖ_óØÑiŒsIÈ@2QœíŒe€’¹~ξνî@qî 4Ïzxý¹ @î%6ŸÌvv#ŠL† >›öf¬[WP[“ A¼Ò#ƒøöýåQ„úWrn*n¯ àC ¡$o:šs­dÂÎ Ü8\®2Àêf ¬Üu}ýpÑâ;8ó¨yà`Q¡- ñ»Љ¹«?®™í]ûqꂈíS¦õÍV&aUÍÒóÅÏ p¡–\«œÊ8h"a PY:錥&H#AF¢û­vMQ%Tm`‘P c|RõOvM™õ‡E'Uw` ý …¼¡òèLˆbT=¼áN'­“ŠÐ(§ˆbGîXa ¶XE ÉäL¡ßC1NümàõÙ1œBÁ³m3 ŒŸQêæiß»ë¨ø¢­Õ€ ÷úwG_g:Z9Añ£»›Jpm (©|0ˆ•ñ×Ä9}F!µxô·OˬJÁÝ€Üt?*Å›§í10^'^¼<—¥àI¬7Í(&¯ê]¶¡¾YGqLËGIÚ2^Ý4,ÂUËc¿Id=™€XÚ|ý´°”VÅ7;X(a u¢7Ãó?‚Âööi>x™¬J&Ö:ÕVM4SŸQŒ˜V¬¤†Î@zi&¶Ö !†ZÈÛ ~áõSQl^õÏÆAîaÎÃT)¼1a ‚ÿfiÀ˜oPCºè€GŠU”Ôt‰Z ¡‘• $k)\ßb<©=Â`æwSaú˜"åäþI OggS@&1ŒO¡XjbQRUTURZXSYÿ¿ÿ­ÿ»ÿ§ÿ¤ÿ©ÿ§|N‘O£„øÑ/S§vïÙÓ¶Í*cxöªÆ]°4xŠÀ¢ù(¬×çRtGíE©ÆÕ'ûº>ŒÅ¨¾9þO×aø¡ó¾Ñ‚ÇBU¥>¾¿þp¹ (œJ‘dë:ɹß:5 «q'ùú lm‡çù‹ê3i¹_¢²WpÿI†Ù¶ËA[oŸ[¦}~ù®:ëç[§¦Ë|ù÷k}YfÈ5—|›§ÝmÕñ÷ûó£„n¶9¿ˆ??¶ñýóu£7o«ŠX÷­”2‘¡í_}BéæÙNêüè Å{þòé÷]jYÏÍ Ï=bŽsT¿Õ¼Þ[»{Öõùãów-(2çC·ùðƒ[÷ÓÌïíçå?OeorÑ´ü‰ôsPR¸‹_0€/¾|6½³=BǃüÔ§8y e9h¼½ùú¯ûíµÍŽ" Œ¥O¡y6*>* nï®û~Ü"FÊÍ@O®Ú¬]$éýeˆöDN‰ŠOËž*îahx³{+i¨à(©ŸzÓ!CüùðúL¤>…Ít™ òB›úÙ)êÍ™†ßþçOûH!¬ù²‘+pùÑoÝ_ûðá…óÁž¬ž‘jܧè€.ü}¦ž­¿€sÿ,vð†Šn@¾ |6=«'BP ½ÇGiAM0ˆk8äT*w?¾²Î^¹R(’lª!e¥¼KfÎoåSŠp¶/ï²×’¬&¢ix­ûÝÇËÀÀçK] <Ùª êÊmQ¼„Ju“縫܄Ó*¥&;¸†8 ñÞŸ/o÷(ÍWPÀ¸dzÇñs5×J¥ä¾¾›Ý[6±ÊõòGé'#øùåa Ö ·¼\tŽýtB‹7;&úÅ©Zõ.ÆÍÏ!úRëÀ•4σI\3?²Ѧ¦™z{dæfm«Û é0%Kï*š½S>Oõ}ïÿQ‘ @àؾ ¼R™õ `ÿÔóžV±õ|3kXV—½­/¬&v¼Ø¼yóÅÕv2{<×Y~óÎ~9n‹n‡<Õ‹¢`»Ôªq”šÊ½R›¢ULµCP H&†ý#¢ù¾‘Sïà¬^±µ’1ßPùY&xŸlùwÞäÅQÏ[^@0?f·_lþrÒSèGÄÔµEe¡jRE‘•`¬H)!ŒG–C Ǩ×^]‹6ºwåMHôfË`Á9sµ‚3à`Â1?Àªª0èE‚Jvº è›x!kc >ÙUiךM8F£© A¬Å¡„Â’•EET)$k‘ZóÀ(d4 ˆDµPU‡,JkqÓ@Åx¿^(Ѧ ‡½7­¶nû–—ŠB`­å—Ûì庋,(zEca­ë2•ÚkÛÊŠVFwp¿£ª"¥àŠ%¤%PÙ‡ê‰A1«ûó¢¤:|\伨`ÚëuÎb@—û1,tÐüS}Ø;Ü_¹¼rXûÀk;}}k"Uéºf´ PKÐOñ«œ·¥ÛhÅ?|rÛ; QÌ\‰gœi +tÇÇ2Ÿ:*¸Á2ª>R+ìþ‹Cu=U]GÖí7êe~›• ÞÔzGNíyW÷}œ ü0É$²OÔ#$--$e±Åáø(½2ˆƒÍËOƒKWq‚z^0À‰#RÆ`Ë, àA y׈!’ø $|©Ž$„ØDÛžûXͯEI N^Œm΀ҙñçn%ó ìèTÓþúu¢œÉl_lyŒ¼ÑvŒ¶æ*maÁ€@Â}~§ßû˜‹;İý Bƨ‘Åë0ëN)Ãut Ù2ý–32µÎ{Aµe_Zÿ¿ HT”…xúÈ&ò³ÀM2|A Œ„²¾V\Ä0bÑ¥×*€Þ¢ó`«…¨8,€D–XæÞ(aðTh“à©£BžN(Ì~”EÑ0€dJÝW‡@«ÔsGæ´u2ZȾ÷c¦²+! f"l «>uÐ4åˆÉê¨eT(Ö0ÝäÐW9A0Ǿ°jt§V;kêÿ3Ó@ÍUL6¸]ëÉlO1RPªW79IJ ±Ÿ&‡ƒûíg Ï4¦Þ…ahLvÁïÃT—x*ÊÿMfµµ·fD;"`²zB½æ@÷TÛÂ_ñÞ Ï ±»=°.Z%ÅS§¤ªDÒt€ÁLE XvT’¹ŒØ  I¨i!$©v'ºÑ_L € ƒç2 3Ëéõy*xé ý‹hàyÚ`’XÝFµ‹Cè„fÂ%¼m:Æd`X£îvYÀù(U5ÝÅa#®×¿.µl¾ põÀÑ $(±ç›Ÿ>ÆXýðU“Ué°èï§j‡Ê!Ù™à€™Æl®åªÁFJN­ô¾2_\m{®s>>÷|‹zˆ&žªŒ5ÄwÑﺆ[eÿ € ¤1dm¯¶uC¾ý;ÄxÙëa–¯Jí…Wì3¿£@MÎ\mV5CQþY$!Oy!ôì^ °{IêÌ`& Ål4° SÙ¸³ÒÅ'Q§¼=_&ò!¢ 0 ¹Ž%  ­'“÷I·´kÃ2Äq¤§½íò §Ö¸pu‚É€ýëB6 }‹PÙØ3ÊÌ:Sl®2·Šî•¼Aá†=ª÷èr»ÚîNļ$Ðzb[“ŸûÔˆál¾Ê<`UÍCIp·ëO€é„ücArö..»qï4=5U <ÿŒ»þ{Xº”Èf¨ìe¦À úÛ ˜‹Ò” :S„n€óÀ­ô0©GQ=d™ª`Ðc„\À!‘´?€ Àx+1Ë‹ÈFX Ûe †Æ€* æÇ²uÝžÛm²ŒfÜÛ®g%bPâû8š_® tt ™À¬<¯©µQTU¨Ñ TŸØGaãEž|‹ßµ4p>²q°¸µ<{×zEž™Ö{+„LcÓ«ˆT§ME³ü«Æ«4­ƒnög¯åS·¯W »&o`!wÀÞùغÝrþÁ†6‰†"µæ¬µíFV섽0ª ²Ç>-M“ÍXZQ«Â@Êc¼rb2Ïl@YÑ6ÀÖ‹"c† [ÊÒÑÈüþ:MAÃzÖË54ékŽQ7PÐZg è,ø§ &örw©õÕ´epsÍ¡   ¦3;š.rÀôMh:rVÒ úõáÖ*€ùÜÛÐ Lÿk/ý¯IßÙž¾½tŽ4?Û_Í¡¨ìž4öî~æ¾ÿàøÝ2tÆÐ“ž¡ÂØ=ý¶ÇŽê¶‹Ð0\½1€ ¼Äc2V¯×9@_Œt&%lý×…¶7@·K®„”EÊZi@4´ÿkžM•X “ò™Ì56+ÀF`ò¨t£ !?/›>Ü]R‰¡‚:w×Xb…3šm°x¿qxºRÆEíx¦ë9æâ€SåW0n`ظ€Íuk½azºUSŠÑìî8®çãvÚËî\fäüžŸ6ü¶uÀ‡:ðu^+ÉRŒ÷aNmë €qÚÙxl³@!tUð”p¸òöq ™ŠEލd›ÈË 5f¨è™/«Ôßpã‹ b2^kìÛbdÀÕTœx”›ûs»°æRRey›tPôtNeúŽE´d@–G}åb0F»¹‹Iô‹rhÎ:t{ ÃùØd¢šÁ@áœè¤ú¼Õ®l“² ,+ ú׵σêm0Ðq& ºñ<·“Å:*ÚÇuåë£aè)gÉ“I4XyØlŸ.9à* æ…¦4¿U°¦ÓL»&V=°æµuÏñ4^{ÈîYXóÅ—ÙÎ`ÙÙ#xà3\¯é!€et_F4² BÀzµ6î’Bh'j€žEz¥°@nŲ†.TʦÐãDÀ¾û­zI«är»3˜d 6R~í©ˆf–\/!¿|—àÕZ @ùf8Øz×€VŽ}ͧumÍZbW@Jx¹ÉÃImWj±rLzß sö|q½} ~zXn“Ì|G!ïŸNù†Õ%Ï~¨•dÉ ŸÆ» ÑF”(»Šæôewù›ŒÅ›j;«ÃmÓmõ]Å·ÐÛ*ì6OƒØhÂY;â@騋6ZxÖ³@ç–"…n(§mD'$K¨ì³W‚0;•šˆÅÆ\k%Š®üô*ÿ½õè­Åd£•÷zéa¤I€Ú0M±îÈ4ÝÓÊуešélíLûÆ.¬¶Τ'F€º‰Qª²è¡óŠbÒh"ñow7ÝU@\ÎtHHªï&©ªŠK‰ˆ³lܩɨf¥ÑRצaf¼T cT³Íþ.×±bd&UyT{{¦¯ÝM•âb PµAì¸À!‹-Œ1œ5¢GLd -t@@L<õÌiŒ %,!‰ØÊb‰íÁ òÊ`PàFáЉ0 žëü2A³Üh–YN¹aÉŒ~½–Y_M ~¬ Àìµ:­T”Æ£Ýôà)Ú]‚dšá‚Ä,Çñ}̼ÛÒ·”$vYÌ‹‘ÐËÑ¡så]½ô69„ýÀËÇVT9ÏÝS—'ê„q'{O ÖžŽÂŒdè°Ä¥Þ–ö†ÒòÚ×k¥cH/¦ä…¤=7œÓóˆùáúS2xÏW›ZH¶ÚœÉ]ŠŒÕÈMü«»»ÐÕl½-JµË5ŽÛñÚ†ºÎ¨­™¢I'DQÌI“†:€ÌÎ YcczTo˜ªR{gêu“ Ñ“0 Ö[ $¥€èœi°½¥ö"“U‰d·˜¨Ð™%E6 d¦jg¬à8¬[{ Kㄳçz‚X@Ö0ÇY($C\Н[Sd­’td-S£v{ˆÚ©Ä*(, ‹[‚Ú0Ôn W.5§Õ&Þ¿[L1Íc‚ÂXXF+ˆ†Vµ2õƒï†+s¸V¡ FHXhƒ‚ †7 HI0É";OggSÀ´&2€1Štÿ˜ÿ¡ÿ§ÿ’ÿ NMIJ]_a^bÿÏÿÿ²Þûã‹ 2qèõŽq‰Ñ¥$6à0ŸÂœøp]Ò¿|Vƒ§µ‚'¸´íÙþøf.¶­#,†KL,Þ³c¸€þÎä$+ç¬5 ™ À÷¼Ý#sÓà1>h(Pš“LôPÀš°Ö@¦)”ÄQœà°þ>áßZÏžÎ.¬0=ERøK^è2é³jÔ¶5›¼}¥¥hVaÔ2…=ï¼üò‹ç³ À9Û¹ž­4Ml|OÖ`•™dgÜ8 y`z ¨O[\÷½%ÛÊåXç¼4ÉÍiIsR²¾k „ šQ…9Òñ€è©#hÎA{²:ªËan®±ƒl€<·ÎN††5•1@D¨azä’4r‡ÀöÊ0¤³_O>@‚W¹²Ã 6JÛY =6î„2l0 ‘xF.("\qQ=ìÆYÚ`f0m``€eÖ@Û 2ªT;=D€«´í™Ðº 6ÅD,ŒL„@Æb,€ü2=g~ûË™œÅà¶[͇49Ö)ðx|¾ì{köÖ¯ìo€÷jÓÄ© là\ÙÜ¥3ΫqU€|®«(¬bâ]š&¸H¸Œƒu›µvޏ±„  ß;tò¸#Íäfö…<þJ+BH­wR‡;Õ#@QŠ[1ùY%<<̦C‹Fw>r€Î:öŸ/9ÿ¿ê ¦'äëv2ÁàeÉušãó\ÞÚ½w%ãìë{®™vkwÛ\¢¨ò÷¥3v §Ñ]dQØI³°”IÀÅ9ô `ÄSà:5äk÷ÓÄr‹ÝÕàø4NÒL^ø›²úl °({ñXÿN“iqD‚”4”×6¤FžªD¡¶)΀îD+4v2r€A# åƒBn†‘–þã+e·)mpõŒü4x– œ±àQªe6˜ fmã·}Î-ïû'òö@Šä k¢4$t=&`“LˆèQc aÄdb#°,5( Àذ‘EÉ ¢€Ê{`FÉœ¾û]Ê-´$p÷z×xMbb"€Ã xœ ö“—àÀV‰1J3e•¨¢)–ᣓð. d¿Õl¨"; “d$sH(×H#sH$j]l=Ò?½í;šQ@E T*¢¸¡s2¡XÄ‘R@¥ °ÀÀ TÍh%!Áb‹$†¬&éѯ3 tÒ¦gW$+Á(âRd ‚ wÂ8Ar~0(žûÝÓ-…† îZo/· ÚÄ͘àô8ÿ`iëwÿáÄW€×ñAoÚ@YËÁÔØf:àæø|°ås[5› !ÀD¨`öþÖ“Æ|‘äevnü¥_Ü}zÈÊu¡ÿôø”þ”IÚ¾ð¾ºa5… °µMYk1àŸ3O”Ô6yȘ+.cVMï¥4X ¿Zñ’}ìG-œ^q­v‡ z@þÂÃäò±!7YùuÑ›{ª} ëóW5 Øe}f44Ì)Zßf./<÷tà}$žßÉ-¡~çIåµ7 `½‹e´Ó’88gÿ§«” €X´{Aœ4º.ÈÎñ¼>ƒƒ·,}ok™ö耽ÈCú,¹‘‘µÞD€õ,ƒÝÌ¿ñçJºº }v|Ö!@ÑÁ¼oe­ß{šE0Å ë„,:¹`€žõà“Q@ˆ4¥pë!&‚Q7,P ÝCF1€A1@CoÂ9l\YxÊP@ÞMvêñÕ\ÓD Ibwª7Õ»-P99SF €/Î/hå¾5]€ O€Ö¬¯×¹ßÎ4 T½Ñ4I˜$™–] â>åqÙÀ MðF6,"’õæA‚ïBFÄÌ'×|“Lö}ÚaØ}5 ÕÕBÀo<à£l8_¨ ãâóbÙ3ÇÍ­ÿ~=_%ø'$×·CüÄúþÐFþ3îR!3zƒÉrB pe…Ê&:ÅB4¾ùŒ¿ÒúYÕ«·´NÛ~: ÌPuÚòº u¤6ãÒ-îg~vÒ~è|È juZMËz|ç7}£s˜”Y·~‹ €¥jøsP,@_ÏD¿*-tôQÝcçÈlòÇgb-Sm'EæÿƒsÖ ! “’ý6àíT’œkdfw×`@:NÚÒ¤³©`íèvHM³ƒéý¥ˆ¯¡'؃¦0àE‘úaŒûÌv ïÿöõ‰Ìô|=Öy_ÁP{¡è.š ŽoG€¦¹ÄKpL@`ªU,@x=¤~‘‡Ôô,¾ZOå‚Óóbî:2Úgù¢…ðT 8÷ÜÑìƒ~9•H-ÄîkÝòìÚÅÑùw™P@:^éF‘‰~1p&'º7-SJߟõ6u¼Šù³2ägó<Бyý»§b¿ÌâÔæ `3à’èè³ß²rÉxQÑì&^*Ç<ôsœoÔ{©({òï=6z/~¶W·Û;!@$ü€n¼~É» UÍŸnûÊå{Ï1WA„<ýÂLB¸&wܾ­«š¤EKJ.—µî­ì¥³<ü¢ã&m~ä*p÷òüÌ[E"høÔ)¼ŠíÝžtg`ýúe7Ͼ4áé@Ô•„p àþsêKõ[ù6XWÎð}÷©òœ ]ùH/ª;‘«ï>råLöIešmŽ× ´zÝ“ý W3›åT¡^xó|³soô¦>@·•XdcpyƒWyo8T#¡Mÿ÷öõÙ[žŒ$‹ÞÎ=ƒŽ×ö5)¿Òʯ’®þn•O!?9rfŽ÷×qd,_ÈXE”rUµ’»T‰nžzųçV¹jÊFçÈ+ë,½"ùÙXW˜á¯®Ê(K®Óýù|KUâ»·OS’çÜ×k(ú‚ìZOf+z…ÙÑÂd(S ”–%X|ßêùèJõ/´VIÖJ•nÎM¥¢1ˆ*uÁ|òÐòB  í:9gú’ÿ–/J”¢_ʯ9ÖŽiІó±ü'ÏùSŠ˜Mï/NÓâK§egJ«Öjk¬h£Õ'^»B¤|ÿéx]ùU 5ó²4´V™´C(ÝÜS)äÁ¸áTól[H0.À„ÎÇÏO*»·ÇBŒJÌzÊcG9=¨•Bûöˆ;JFÑ–‹<$VYáp ž¾ª£ÄýýšÄýØ ŠäþûŒ"üÉ?ÚŠIü>f4–fÝ.ûê` ´r…† ʩȾ¦}ýCáUÔz%áYŽµã½±íOCšuº±F©‘Ú€êê– e£/‡IÔ¼Ã&H²õTDˆé¤,G(KæôD%ƺºH“A ×̵¥SZ8k×§” C›f™íÿ?0•¾'á,†i°: ^&Œ 0¸:E5 0 Sd;Wb‰Ü-Øì^ 0Ö*€lÂe` kÍLÓ4h[RY¤””Ë3²JNŒÒÛ˜ÿI?}Å™ÁšývRí©‡‡¦P0]o“]î=ï–{k(™\ŸÁ´å)1)À2`—Xd¢LNYº Jæ‰eVY¹œ\%{€, @E,x(€0¬GÆ€0Èor"mªD# 02+¡ªQz!RzM'òvž»í¾'`DôÊÜ\o%fPæûIù889ÀW€«  ô ·…ƒ}÷ÞÇɈ5©V—Ip5g’É:F×î‡,CÈ_Ø *m 2vô‚£”@²Yƒœ°¢ÙjÏ©ÎaÛúãX Q¬ °Œ3,dô Å×õ´‘…ë}¨dHBß„ æ[‚馳jǨÄN€À Œ!Í kbî¨è Hé@T)Fè ªK0À CƆAU‰šp!)  ë†˜Aá’± *D]eŽMt„b~¸.&°x®FFôà´Aß¡pÓÕu“Š$/5 Þx#÷]dw0"š$âÆAˆQYiå ’"c, PŒ…mÛP•°U"É !IµnÀˆjU AdŒ¡bAƒú ^­e»×ëUSH’ˆ…¼Â ž«]ôœV-cv»³c=hO™eáP–ÁÚT®CÿÐðÚÀ³ï*¶³¯qIºivú‘‰´Úf—#ˆ½±VߢI†ƒøPr¾ýýÌ›FžŽå¬hP×mk¾k=€b³:ë‹÷%Gˆ†™1ÈåÇõ.¤Þ'+`í2?ëÈçâuv§³¥‰Mé0d LŽV÷ý÷³ñóy¿é§S½6O+ÀÂMšýV`4ïÛ»Ž ]Ò¥n€J6c‚›•F *ïë_詪‰*Vg<’"²"R !X#[0°$)µ¨Ûâ¢E‡4®EÇ5eô @³ ª ŠŒâ†êj-U[@N†¤ìú}é¤Á V£uâi –85Ój{­b‚¦FsHQ¡’aT¬Œ/d㠀造ѫФ;9¸Ë.ŒÁ‹l¼X ¨ÔPBI3Ûu^>ƒQ9ÖŠKËÆÈ‘…LÜæÊÿ(@ "°+Šœ ÐþÚ­f„6°úulŸ¬7éɰ€û8ðj.RMŸyKÂÄ+–6€Ú–y›F¾û­³â#U]/^Œ í÷N Ln~ÛDîÛª.ÉU¾½,lž†¹H¤H°m%‡ä.k×zß~ÜP 8Ö¾¨¥)­ù€°ÚšŠòàÔâ;W]qѹË¢ Lî³ï•L®äD&¡è°uw؎»I½—◼ȀÍþ3ìr@[mÛ`¥ªŸ²ê@J(5¥$€-Ö7ÓþÛfw¦ €Ýa8xjÊt@RÖ“Ì È™™4®m$3ai½D‘v©%4 ãzîq@±™Ö©Q‚"¦ÛءȢJ®”ÐÐ5i×”»Y<Ð’R(BB¤B®  ” H¢©‚¸@°ÇD¤K$è9#Fh# Ð gmP$"„ ˆƒÀÆD9nhít»“Œ— ˜ @ºdg°"ˆ^0À%žÛ]ü÷‰É€½Þ)‘µ´sü¾|IØ÷3Ñ ŸH ¸% BƒWö jåv› øH¹OaÎL4¼¹Þ³+F”‘ƒè0ÎϹ”ÙÓ™ …‚/ᾜÏñ¾èN Ü]àoÌà¬>j}N¼¿¸1F‰OE®]k tƒ36 dðÖÊôQuâìúŸÈøý‘b[ä–É©¹²d€.¿Y‡@M‰þMK]pôšÑ0Ry† Iu ÆK)ºãd^3}^·Íß] ãÿ €¨6m †ñ´3¼ß*wÄ툺„^S0p¼“' B—´¼¼ ] äfí©Ÿ¬ Xf¹,,š\FjÀL_ERª"Dm€L‘Äh!YFÐYÑa7 u©Á2SÙÐÐúÂx¢°>«R;-êZ}Ȉë0@‡¢C¹ ‡#ƒ0˜4 V+Ô ` ˃ÂPÝ@b@a¡–Á€ÁŠA„ôˆêÅÑ /h lGP) a*p ¾«]â5å‹AËÊs»£ÞFÄ¡LŠ|ÏŽ”ñì·L}èZ'!äkß&áÕ¼ÄÚïÃÁÔà|Dž!pf¾Ï=†z_š‰iB$ý½·ð§5×ë6ÝÒÒ¾æ˜>€æ=:¿ãm>\<~Ž÷ÈéPn>3àíÏÏÎŽ›(dàò>˜ƒ}ÔbÞ7{k¼Êq¥ÌØy2âªôK(¨p‰Äèñâ/` FN°Ïà~uE‹J°¾¿.jH —»²iÚ$³«•ÎN1õN‡oèÒQ@òA=:€O[}¯(÷@x²!ž·©4®¹Ž€W%ÂS"²Ú˜0UÕ¼Y³+ äÒU·ºŽÀ°¥%†ÚÚAVØ-Àe4–EÕµ& ´ï€vYÄ‚ÞPÑ( €˜‘ÅòYàûÅ-`â’E§.‹ C€‚DôEb ,±ŒÊHäZ!€ªÏÉ@ 8L €€)¾Û]ã#UJøj»ÍÝck1Ñ$áýŒi°»ñâøð‚yÝ €ø±[D*Ï"€×¡À8%b{s¢aØ ›’ü^Øà ‹smsï@d M€vo&M§IzÍ<Œx¯1Œ'È“ç=%¼äl,ç[6$¼ëW ÿT—²röÑ”š±¦Ï)…ûÔ¦OµgâO $:^Gô†iÔ\„ì›yd¤ƒ<…PŠO¢€ >»î8gø.>A&¸QLDM’´”™­n¦¿RŒÎm0ÂÂÇ_&:]ú3õÙÄYôã‚sï€æùã¹%¨µ‡mP0žáÑ¡5€˜¶íʦYoÈ:Á¯ÿ¦ÅÔÄš@1€ŠÞDå ,õ‘  àëw¶S örD’d‰ï Üt;Z„ yùèÆð­êê ݨá*fÆÊâr‚ÓM XŠÐZ•b‰ÌP©Ú}M4 )« Ð €æ™¤ c$ªª"ˆ‹[ ! A¥ €14Õqë@€ŠNQ €Ðš7L6Û]Ò-R.WkZ*šÓ,·Ë[¬ ó8Ô®tã“ Áá+ÀÕ¤ýîXomLÊó=¿X13M€s "z50} arælô>¡½™¢‹ ªªÑÔ]¢L ”(¨û*­ý ›:ž’ÁSB0ϲQhiÔ8·•âŒ(**S;­˜on÷fËo¢^:NÇ»!¡Nh±(8ÝmOû rêîtëŠ-%7.nSÞ]±£ìŽ«sŸY^ £¶DÁ0quó¸ÞÂM½=¾‚a/oCkY¡X›™Œ‹ªªKu_i¦N-ÇtÈþ«ihA«E™ÜInÎX£á,¼\q-.²bîbãSKcû½¿j«©ð¨FmšÕQ±Ãæm§ *2›µk½šìQãÂVf F¶a4hµäóí޼w ázn€%LÖmŠ% XBYŠuÁ$¯ ?ÁT]$QOlÒN*Ê”%Ê*DCd°¥yšIŒ¤‘)¯“˜ñàákôv«°Ù ›Õ„„2‡v¡[ãõRìÈЛ t?€ujHÁ¾r»ïå7€Hð’ä\ =`nùð¹54…˜ÈàŠB€ ˜‘5¬9ä)ÃNNçü €iÔ|éu ¸QçÊÔ=³x;[YRúrÔf¼ºg5{*“¶^‹'XÿÏ>Òµ¿w-ùæJ¹ññKüpϱ†Vs}!„Ö í\¬¬M-g%q'ŸWÕ0¦;Ú‘¡Ou_WÓøb—ÜXhW¤“@Ÿ]ÂÈP˜öiEgŠ~úÄ)fè£#'2BÊBŽ¢kÛ¸¤k 3_LáÊz•ŒÁH!ÀW‡fŠœšþ÷Ô*Ú†_±äNB˜I˜¢Ã¥*`^?Q[ô/h*ôôœõ®ú…ÓÑæˆ+¡±ô@•·WKQ ²æØ5›áΧ(ÆY Lf( àåˆ EÀÀT´6I4«.`o2®âŒøÝ‹èfZF«è+Á ¤àu_ w)[ƒQ\g>ah üÑÑ8¬y¬´(@€b2³Í,9Ûá°9±ÌœcQ2½ÐeÎ튌Å,$O$¢ê€þ»M2Að1¢U­×«M€0/ÒÞó"ƒx­,&iaKž£¯n ösOY %`rÚžùcÛ.*`>ÉÚ±NÚ—§µ‚†‘TÜuèþ&‡gÓ½eâ÷nªYzYvœõPàrŒ=_ªÙœ1–\@hŠ#âráÚÆEiK ”LÎlúdç ;g¯_ºGÉz’©x2«ƒ‹aÉeÞE e˧d‚†ÊWлÞÛ(“ì¡L±j—ÇqIo9¥ª¶#ª»¤HžÎ¶ÎŠôPª2%ØÝ¡é÷±#(Κýz9Ô“ E¶vàí*S²|j¤!ëÛ­rd`Õå‰:1I4P² 4Â@è.©É ã\¦:²aV¥ÐFª^©’,Ánû_ßYön5EBQ´â3(ç¢ÐÀ¢µLhwÙ¢Ñ,®U&ròPê°E´ï]4ÔÆÝ´P”™ÝÔÌqBðvÓ €ˆNMÈÁj Œ°AÑ `ƒè½€°Q¨H‡€H:ó=’³‹©¶ X4Ä ÉÈX ‘ ".cV ‘œ’ÈØ@´€:~«M,AùÏîQ¡Õ:˜Àò0ªN•,ê}´cÝx÷fìB¼^ÏEàC€§yIO`ê¶tÆÀý€”œu[0/@L Òeä{~fgà纜܎áRM!D‚>—p’˜\ Ÿÿ7G%ï·ïœèóìÐÜSEº÷^/= CL÷WÀgßÊï]xŧɨûÜú½UÛž’Qi)#£~¿ìšœ?RrРâN—¦ØŒD RDtpóèÓÙ ¹€#š{iqïýŠ«‡,ãÛÆêô"®O) +%Mãd}`p mñœÑHRáp88;k¾™ê)'€P›è@\¨Ûz ›"å"©DÊ*:ΖiíȾSˆ$i§ÕðÎhš:&éMîlHŠª7d`‚.ƒX°°m;@ Áز$Ì‘Œ#Ð Fc (¢Û`@­¡ &@€.Ψ$FˆÅÄ€¤X€„(ëÁ ì~»í¢DaVçån“iI¥Iüoij%㹯ž#ô¬;ù°O/€×aΠz-\èà `·ÍhYœegLàÒ°ïélæÏ€<cȽÓ/8r SHÀH¿ûϱ£/n¹Æ8O™C;šÕ‚d*L¨Z¹æ ’­ hµHJàÓ‰¤jô‡µïg½fðHêÿ|†6Ó“„àÐjd¡ä š=Y½Oƒ˜ò ²!"¥(¨T7¹u.XS‹'}A< äuâÌF  ~EEÈ*Þ;Ûx/ÌX*N[”¨2E]…D•ˆ_5Jå¤1îª'x¸¬öª6>ç‰X ]BF3 ‚JÁ×hšÞyêê¬Dç Ñ^jå ÝI™(¥f; ÍÂÒ*ÖY­¢]ŠRFfÖE»‰†T›¥tíˆ1Ø!D€®S=S†×ùÅ&ãz+CN0ÍD‰îX»‰ãže‚•¢",¦h3ªÂ%b û¶JÀW4KwÕh’ ‚ž¼Ƥ¡\ ˆìWU×k`g[UTõ>¹X Xg¡¨u‰,V \A0QU2G,Œ±ƒÕ8Œ:­Zm  Ö‡< jEM3Y¨ÀPĨBW9 Û‰@d¬UÞ»íqŠÄ=ì\m•=R23ʪ$Ñû <d¯Þxÿðª—OX#9oCþ(¦-Àú °?ú !Ç :Î@ÆC€-Ú@ `¿tp67“†y¦Í3 gâ(OÆ–sN’@Pwb®6hJÖ¤ól»B´yBÐ;¨‰wôÞÐN$ú,_C‚8)€0®ú€¢2àL‰³ÕPhea„ç4œÕdA÷ùÛéô)š C!§)Ð 'ª¨cœB!†õ’Á{Ô›PÀcs¬5—DŸ\Æœ®/%—`ï5€‡’;Ü5ëpÁL]kmWƒÔç¿FíѬïf@¶‰wãü‚%Ïe ‚êÌ­Na½kl€±ª[ΡIÀ9k€µ¤8é¿cßTÙV‡ÌF¤£ÅiŠÌ3¬g̤Ð&›a§'딌È` `ÚxGȵQÑ™År\Y)Ó8 ÝÙ$`±­ i º@Õ‚Š8™ë(@§V › 5’ß¡E2;» ØÙ!Šœf¥`ƒ­ X‹"(Ñë@3V’CŒ8) ™4¼V1(TµÔ€°jÑYÔ"äF *£Q€ßèOæuªˆj&À >«­zŒÁidÀÙ·ÚQÔ£Èdz¼@ë¤\‘ÌÛ°~¬SÊèÞÏ,¢\<ðr Ìô8= ¶6A”ÇÀ~ËÀf:$àb@~"„÷3 ½Hà÷|^`ÉÅÄ3 àè"ï†õÚ;«*^Õ2,'˜ ÀùìÇ{<¡KSÂõŃçÚ¯!X±àÉ ¯ºÅ·ÁÀœ®•¥7(È€V ;/ªî‰SÉ@ɾ1ôÛËBPãXÍ…3Þò§‚§@¨ýñ3µfV@ˆ €@ŽyK >?”¸ªÞuÔ®¼z›dP<Òl@M‡PÁFÕ+‚¦ñ€)¨¡ DyR씡rKÚ÷“¿=ðO9Ä„Æý×ÊÄF¾µ—Çê@AíLµlC>Èþ;®MÐ\«ÓÔ«dG,8 ­w88+`œŸÙáÞPb°ž÷ËV dµµ5 Í–Š 1| *è) ½LXÈâ „¨ÿ8°\xlÂûD9€`úùT× ×¯¯òZ ¸ú$/ ¦¶|ÎÏä–&Ï+sO™$z9`ãó˸IÞz³°ÇS€|.?=O}È@(ùQŽÏ;h6âd€°þ=² (™é³ìsB%Ùû1ø º€—°dø  šãR(¤4GŠöw krS“V»ˆüÈ!: ‘ð¼a|—ãM-¯r6Ä2dd‚€ÓMðr\3iÑD¨ˆFAiP@¶l'6öTØ çÇßG} ×}H} ÈÕ¸[*EYˆìý°0òtÚ¨Þá€pÁÈ4eª* ¶£ϪÛÀCi&À×öàT´ªÒ?õ—€Dªím¡NCxØÎ¸v½#T 8Ð@QÑè>‰8¹PG]Àˆ¢+ -$ ³Xu¬4ûÎíËÑͬÊšZ¸çgÁZU°* ZUE@eìc¯Á€€¬ÀÊX(‹N±t¨:À0Æf(€( Éè‘\Qk€ÞX£@[·AžZulŽ» S‘$üJ±Z·ùàÊX\Èhåïðx÷!ËøÔØpFßô=ú ŠÌú>¢ O>Õ£OKxâ¢Ü×hƒÐ@ž>ØDs»¸rzK5Å6’$\@?æÆÆ@˜±7Màš0-Äsg-¯È@¶Íñ Â03S…•ÃA˜ý°—`ô Šd«Å18ñìïÌŽq öU~”\€ï¦7ô¾êέÅRy€ €dqÜ—ZFº@Í𜥠À4Šà™JêÆ*áÍòS²kH›ÃõÚjò… Ö¢ùLö‡rOggS@&5`†±÷ÿêÿüÿÿNLJJ\XÿÄÿÂÿÄÿ«ÿ,x‰þ}-ìªkÜæZWÐZ ªà!PU–jN>]`;þª@4@àï®'ÍÐ.š*@÷²”ÓØ œð~ÔÐ+˜FÇ>C––àJ›Ý:îÅKô ¦c¥qR€‰ÀÚÖqÛ(@µd™™S°,uÕÝë§€&¨n"ãYÚŠ¨McAÔÂ8€€Â1€Ø‚õ5 ¢ öÖe\9 ²f)€b]4Z1¢7ˆ Š@¯€¶¶ >¿a!6* P€, ^:ul0¢ W …/­jr™YƒºMŒ)Ü`¿»Ï¹8‚æÀ§ê<Àû2™&ã Ѓ Az P£:ŠÄ´=$Èiô~¸0‹{úÝL†C.ägÚ-#€lNO-Å!ea%À ¸¬û°ÖµÆiû]‹úâæ=L“ßm,„yž ©‘ñ¹Úm6€Äß´.R@ H˜s¨OõwX×ÄýŠk@Ü ÆVô—FÐL!zˆÏf40%P|Â'Æ9>€ÿYJ@Äæ3n›éëKô˹N§œ%ÕÙR¹õCeYÈbQ YÐÉbcm¨$Cn^ÎQÛ4²Ô)†$µüû£4»zþšò\ܦp×ûïìϱÐÖxÙ]TÙÐÆ†=–`3@Í”ICF÷«@A!„ý¿[pÕåSÓ¨ê×”ó ×æîPA²^¿&=Ð’6>'I 0lHŠë@³Ö.HX–šaɵb‘õɼ‰a‰J ¬1 0¨PÐØ¢UÝ…\£@@W."À˜D‡¬‚¬C~40(V×ÀPÑîÀ@  Þ)5ÜaM·³ˆz÷³*À8åÖQ.dtÂ÷9˜³íøÇo.ÿz±þïJˆöV-LÂ….þñ™æõ@®"ë´à z-þ2A¼< Üø.à­·ózZÜ€;ÒØŸëv0 rqíëLIÅ$àl)íçPã¨Q=@`€Õ {òø4(Æ=@HÞ6øÉ @éPßžáòöS¸ÆårÆ ¬á0 PÇg»`©« drÈV½ù&¡÷3- *@ˆÞ?‡RBýü(2@p§²V( ö×àÐd¬ B#ÊuQê="h}q €àŨÏtŽD‘J€è¿×—è]¼Ý‘n†N~í”ì˜/–xpÛ6n‰Uï⩞| ¬íí -êe싸åœ4…aÝ2J +ãA2ëÈ‹ñªµ´2ÖÆI(í¤R¯qÌš† ô´»€ŸRff@¸ä ¬ÇCj0n×vI+öçÙ ¼ŵD€ƒF €*ˆi+":IÔ†ÔPcjÍÒT@ AM0Õ ‘,@Ñ©€­@£…ƒ’µ‚@^Ú v8U­qº@@;‘ª†ss‰!èÐ Ý?Àý‚·~DE?À»Lth\œ3$œÁ†Ç9@ÄD g`ùÉþ~ÜÆÏïÅa/,{½Ä—¥›H³ä !u¿¤y«Ÿþ©Ovw]&0œAîÀK t~³”¾pX?šÈ}†x(Ô$g¼÷…÷˜MÛM;™2Y÷ßí%’ëe”@ž~ª½ÇùþŒÕáhí†Õ© /"HÎpNË?Ü6¶Ýk§->8³',½ÿÿÑï±ßëï·ÉO¿ýÒÑW ˆÝùeVÒÙ¡%¾¯ª¨ˆF‘¨vF/6tê˜ h€™æ<…Gš26û¬PÛav7Ö¤K € ªª¤ÜöªÎd‘™Yê> µ3€*šèªna&‰¥laoéîãU˜°— ŸöÌTÑ]ñÔËû¬>³«Ä¡g²câØïNF Ý]i§#u$R߯4ÅÐݤàõɸî@bXœ=Ó*Tëÿ,³'!»!Á‘‚¹‚F8SWx.ÀÐ4“bd‡T‡DAX“B)a½419Àæ^ \]¦Šç߉$<úécjJP€ ‘zábÀç@Ç¿L¼¹º·Þt‡SFÖO‰dÏâŽu ìÔ¦©:o±,à—o ¤V)ã1\ÿhÓç ƒ0õÀ∶„`_¦ƒèïáëkÖæ|BÛKPÕÙü趃ʈ@ˆä×Z¶É–‰)ˆ±= yâHø4 TV ]°5à…»Ddts?ÌïÔWïÖÝÝ0“ÊýÎé9[ù™LUÒS*½Ž{E‰jÚ4+ÝçJÜH9F½LïV¼ 0g%ÌRI5ŽD5L÷µR¤ÚD®pöûÙ˜Üç‹”4GæÂàr‚^·Péݬ§òë4g–¥>ÚwžIÛLœ‹7ôQð(Æ’¹ZÔV¶ gí2y%Zš¾ Q/rñãl|s4Sêäb‘d kT°¹W˜¤É’jôb[ ¼d÷?ŠÅZ¨è[•rÑ] âU5m£ˆZ°ÇòÝ…Ö½¾‹}™Sl½à•8Ãt…Z­\°,ê¢X†Á/mºëÕ¥bèn½¸ ~ƒÔÐûÜähŒU΢O]—É7€ ˜Sü²Ù9¢m­ÞGUªÉª ¢ È…?öJãYYbhÑ?tw¶ó ëêR(É’pYrl(&¥¢+_™2YÕøÖò;–{ îïxPÚÜ…£Òœ4ú®É3ï0hô²xMYa„‚À2¦-“¬%Q­X°]æ¹]ïÔj‘8,±d3m´Jq*¥"ÓtAõºTVЀV…Ë*¶Þ²ÓHð9Ç“²¾ï }» 'Ä…ªq½¾,WuY¥ºvRS•¨ª®|eô>pô^ÑvÒ÷£a4Eb’i_±€JºGqdQMWÒ#g7ìþgõršÙ¼éI®ÝÕCC:’`¦w¢ìˆ›œ“å¶Ü–ºÀÂo6€›$噪ôdÜt?PhôÜ ½Û»šTÊåž®'~ï23‡žZ=µ£ 5 0“ïÁ\–Õ}8\&ÚY3Ïch((tÒ¥±@؃,¹€[º7D’ÒfæRÓ”|©þ6Ci£I[º¦“Ç32€e€Äá£ÀØF ×á‚ÕÔöÊÖbFÇ-¢aÒaÕ»˜~²à˜O’7©Ù¾Ë5¦ƒÖÈ’è oSª xQ ½@&QFöküžêÏiµsf>¶Ž‘D}½Y•C¶`ˆPQ›üo'Þ¡E/½—»gR}pCVÛÉ>x[wfl¦õ±’hÀüåž^ÀÔ‚Þ–Šî=æy’È¥=fË;¢•Ý_1—ä¥p€Ÿ†ÔµTpàpI²®ªn¨µ>,FÜ”Hê¯/èö¢ Zh‚u#Ù¯á°Ò"’ÁýD‚aÁ„î궃(cLC©¸ßf8ÈvY€e-ˆ4t«ŠgW7Ë|ßɇ²Ú‘©ÉˆU íè½4-ƒ[¡è XAtÒ0mw'‹Q #L_• Ópºb gŽÿÚ† aÇšß9“û™úMnbcÖêÝk×ô¤ëg²x€|²A¥¬Ókó\ýòã·‹ƒ# ¬¶*O¾YÿäºM'͸’J |§â$£§óêíBGCÞ #ø[“ü mo:‰è‰0`@`  B`0…0‰Må&3¨m ·MbMÚü'È@£`®Agq”*I¦Âû ÁÂðé0W%0"Fe)+BøÁ¿4X/I"HôÞÛíq zøŠµsK`ùI ûàѧsWoZ¶fQi'+åŸL€o½ï](~h a_o È’ý6°Õb°F’Œµµª*”%´œ‚#Ó¼Yχ󟡖“|kÑ7?¬¯} { ¤unV Îþ¹x —*v"od[(8^d‘ÑL°D þ‘ ÅZa7€/?3æÙ"û\¼æ#]•Œ~UK­óDZ“Cµ lÁHë]´d¶fñÀ²cì3ÚÖDžؤgY¨d(\m™OZ´”½&%Ü6·Âþz*„è×Ïâ¯-WÈ%Ý¿ø A–ÙK~F¼Q)@–Ž@mÓ÷J_î½ù3ÂÙ_ÀÃU˜spBÉ$û€Í¸ž‘¡ozn5!s5[²âæ‚Èý,°XSì\5¢¤!™MR#ô¿†™Arô*¹1O¸Ûú© ÷ŽÊ{ÔçAÚSa•¬‚¡Ñºž`:1$P꟔d!nf‡OggS€E&6\•´¿ÿàÿ¸ÿ¯ÿœÿ¬ÿ¢ÿµNIXXS[^`Yÿ;c2 ºª« ÁÚT'$ÎN–ݺ¯çH/†¢1¶Õs¥¡"?€Sêµ¢fˆ{yÆ:§FÀÕ ,¡òßo΄B eN€3†dþ}5wïÝ `[dBå»*«J_g=¼õõÇmˆñâÀ¶"í}6±–gë^{¥'<©r¨ €8:¼2s-h³Î6½lÄ„ßû4#Ä‹“LhX.ŒµXȸ¤œÛ…;Š”Ý]P »'Þy¥g²{‰±!taìkßÝ?ì Õ·¶y$KuXY/b NX»ÛC!ú©¡Â,È;âN +®gb27UŹœ ÓéÓq¯˜›ÉSž´Cûˆ…‚°~ X$„ó0Çu "û§hSÜ=°5U@AòAÎ.Š:€âJQ@I€ô1JRÊÃ&” ÑÞÚô!È4š5æ˜å 3ƒÀqýÈñ¸óí=àÀü;w=öû¼`tàøp!í¸Oàœ€¾·°àÕÿ¿z!†“ 0g²F§(…&fŠ„c©›!& CS­Œ ,ޤ!aÐ4ݽÕîž552R”~8—$@ºlܶã@„zÊ29Õщ,’-EÖ@% pãɆšwžl@±²h€¤zº±X2¶<'¦F8 ÙÿR $;ÓÙ5­W3·€~”¢6‘n.ÜÞõ+\ž,bÀ`à ¬áeqÆ`ˆ ë‹X (PDÀx>¬=êô¢(ÈÌà×zú=ÒLFT‘eàA˜s3Õ‡^–Ð\ÿpÍt¯×È Èg¸°6ÜgÈHN@x‹,Àçï^–8s8QKÌé 7æl—ÑpR¢à<0ˆY›¬›IæãâÏ.×ý»> ±š@¾Áëü ȯµ]Ê@ý?CŒ—ñL^ÁwŠÂæ…åfÜŠ' ¥¬æep<^Üì:C¦@.&„LÎv:†hiJ¨†?wì¼õZÆæâFcCL®N„y£§Á'}“7Œæ#„òY0Aeû«vÎi¥õ>WuóKžmž³àÄz¿° ¼ÁAbaËK¯€ßgÓ™ ~í»ae@ »¢%`,Øò»ÉäÌ4€ÈJgµ¼ Y‚ Èâê%EeÒÆåº½,:)·Š^Œ‚(* Ð @6$„BÎØàjh !2#59 H7Ý”‚:â긳¶×匥Qð Pï¾9›;0=†ñ"c.¤ q4Ú¹(\€xÀ†i9Ä (ã¿«ñÌC“™b­]ï±òвVÈ4’ü¾;â|‹ÛþïvÉ 8^@IN5°–õM/\ü8‡³Ã‰Ø§ðQ5Œ™f¢à4$ ‰qpäg¨>Có‡0}ÛÉöÖ@-JÂ^¨œ z9³yÁ£Þˆ¨÷…ì}–T^Šb}?ïÓ¶øŸ/íF@©çUgoN3¸×ØtXZ ^ü·×DbµwâWi6¶}Sk{áÝáÈÀ¶Ê Qí¨× S,gå*V?Ë hYÏße¨b¡‰uZKͼ›.žúö€k…!§‰/Œv|˜¥ž}¶ó"tNE[héìV­9D AB”«:v·££Í;YT&¦ðÎuuáÁ⋵‰‹ˆª9íMÄôa3mbE…FÀÜXÈp๋™¶Ä´ãDÒd‘£Ø€!Y9IcìE“˜÷1¢ >pT €Žáµ…ݲ@Aû?@¡D€tÁ MÞjmò’$‚0ȶx¦Ôšè6ÆLF¥‘e<ñL5[Ãaü¿ñ*~¼ñp€¼Gâ+\˜¢ÒkÚ»Þ,NÀ‰.Ÿƒ·óº_€MçG¶Í"J³ˆ¦n0%ö:I~^3ÍïîÑO6·å*ÿÙóÎÀÓfæ –c Äžq,ÞèÅDCƬdm¼JÉvˆ9øZÞ%QD¯²ÇødÓ㜽ÉÕ ä|ÌÛeðið!{Jä°äɽ[ŸâiA@_e§aÏ$1ûs=ù±‘1Cãa»ù˜Á¿[37oášrr…ÃÏKOoÌw¡^Õ.Óèì-Ý@8p²nVá]w:“ñP x•ÝÄþ—I j&ÀÇ9©wDÜá%A  ©ž¹™|ãYȦ¥Ä®:e––ë:É Í0²Jì“ãкÞ|ë‚Ãïõ' '@b†­”í€W2À”g€—„jÀ‘@@Æ•ü{žƒ(f`¤;Ä& D>ƒ`¦ ߯ ø–U"b @ Hp^ZìšÌ©eR­ÑÜ’8È þ€WK-à”˃ýý­¹XÁHàê!\ÀûýÙÛÌÜšš™©U%Í’‰‚ @¼ÁbÅlö‡C@þÆ .> 4»ƒÔfÕmåç@Wº]Ñs H¼ð²­!~_š!‡²Þ¼° {óäøÐ¾Z) •|ŸÇiY@Ø:HQ@nÜænp‡Ò®Ÿ8gFÒ÷Òêw,ÿ{Utõó$&£²Æ¼GÕÍ5Ûoß››åë®ádDNµDr”oµDE€ f‚[Ïv ¾x^ت0¾€ä寣c%üµ;€øŸ,ìñ”â04 0ëžVG À=Ípir/ÿ‡‹@DÌõp [ÚQc¼ŠÎ'áˆÐðg‚wàø+ÊBw€ɑâÜԙɆØígÙtýö–%„{»!.ÐUÆ$”cÇ”d” À¸µ‰ƒÈÞ- w @öþÂŽC@;|ª4 R€eàZk^Â’¥ÞI’B@ÖH%ÔGr1Idcà°JÀÓ@~гÉrðø pµÚ.¬Ÿ×eëë¾ …ï0FÍ«ˆ˜ÅĄ 2`•ùáöVÿ—ò €ùe !ÑÖ5Öb¨ Ã)!㛆ÃÑØ|6î/çóGMAsÐD¶ž˜®hPí»;Í«x|AfÔ|«&M"Õ hÖ˜uÑ“Ÿ°sü9²Ø–n;,8à`—‡“hîûßݹ!¹Šÿ<ýCN™`A§ÌÏ;°Ô;èú~sw@Õ)ú€ÂU”–—ˆñ#›¨ €r¨ó:ã\-c›)DC@À‘\F¯ÅNLq€€¢(ß[ æ Ì]ÙÓ€@tÄ;•riH@ d¤f¥Q43€ûàÆí-@´h-á@˜ ƒ% âB€d8í´@Ú€‹V›tD5°:DÜnd^C*@˜‚DG1™T& ¶mûÚ~dN…½Ý£ý5hù¹D7ÃÃú0êòÔt¸û:Ùà÷Ö¨u#£Õ1syw| }†Æ«Eí[·õGà¢+h*™!Lºƒ¸@K¢O, ËTR ž=œñ›®R‡FõOön˜îÉ×"ïzºL9÷ c¶ŸÊ±0{˜„H²ß $¤:JgŽ=§âåªdA4騃\®¨¢Ô-\N Þ<†<™ÒÆæÔJ?w¾ì„ßÜ¿Ÿ6v_låŒÀqêwÊ^Wåç*–ª£È•è¬|€üXʉWªõ±žŒu^‚ˆ ãH9ä½,"é *¸”†Ióº¤VñÐvÊŠÿæýô?2{<À§>ûÕ>ZÍ€:—ÜáŠÉžÜÝþæí[å¸ìµô\7ýwi‘ª’)ze!4‹Ð–(J€¢TÄ6r²T×€…z¯€db)å±áIü ‡ ­ÒÁ6ºMüát 1ÍH €oÒ ?ë®]?›A×GæÓx{´ºRS”ZÞg£‹UQuØÐ12 ÔbzÑ:– ÌEGÈ’B7ÔVeTÆ|¨!÷*%ݰ¹]D$7ù˺(CçE³T±ƒªÃ¬©ÀAHØÎPa—yOÈêéc¡*è;öJÇ^·ZžGP´<–§ÄV-3p°³Tžäg‚Äò¦`5—È2À1.ð÷©ô„|Ü¿:1}±YýxO­.ÛJñ]:oåtÊcÕ×Êrâ^rbd)X•å¹)•ˆÙ&näõ 4Q$/Ë&¼[ ¹D êæôraKJòÈn–+º«Ä@Îû­¶Qp‰_×¾®à‘!eÎW¹òúwz¶6%_ª[Ñ#z)ÕeñÊ©zð‰—uŠÍVhªËã®ùu) FL'œ|?[±T,"MøDýôná\K +­BœåXF&¸ç=zvæ8°ªgÍdLt-ºX”"צ׈ñZÕÔ:ÂÔŠ/¢Ÿuˆcîº8>J¯,Eä ™š¨a?Jv{¹éðö•Šd å º ®ÞAfwd½j#în½QPHùª›ìIÛo€ö4ýÏ*^™9rüOK«Á–ûî­×±ŽV4B%ªª‚@¨Q%!3ÂÏüÃ1cÇò:þܲHk½öþõjpìzMCߢ½„ÝA¿| ºÁIw+SR9S-u‘]†TÔƃJk¨/2n"£–JqÎf]à#Y4X[Q cÃN (á( ¢q3SëâEéÅ>Û~FTA‡¦ZÈc@Ñ\Æ$Ù™·ERóH"Ц‘FW‘Kkzò÷=g0«îL¹SE–¨ÄÔà,ƒ•ºÍé E”KÞ1fÈ`Hº¼3ÿPY ^OggSÀk&7 ý¬²ÿ ÿØÿ´ÿÛÿ¾ÿÂÿ²ÿµÿ®èŠ6f‡½€›¦—†Á …‘=y@~ó@KågáÙSv³$ 6’ÊÖßµ;¯$«(¬a& fæÁ@ö3cŒýj,ÀÔÌ’ÔäT r]И¥øÀ:eàé-Ñ!L'9(oÝ!=ƈ$ plK 0„¦ª@Õ-:LÒ‚εÊÀ0 Û—a×B°€[0ë·! @Õši*ÕPFØ_è 2µ(¶ªˆBVÑ[T«¨“`~ücåCAí¯7éð*´ï¤] ‘qõ¦WkóXqó*1À~ÀÀ–ïaëœõ¢¨±+UM˜š¿Íÿ¸Ž5y½Gc÷¸é¿·A+íÕšSyðl2"M!š¥þ½Î)ŠÑ—†´†Ê®Ü€Ï~Ž^€Îå~ãH±n’Ú©Û)Á3s¶®ªj§¢¥ ¶×$:¦¬@*ë 8°ÊRC"B4# $&If…o2³ÐBI ÉÕÂ0R§a¡jH&ãÕ‘×IdBAÁô¾œÐ>¥a ÃÅQ¬T–€É0éeæËèz¹ö”ju6@–VPk#TgDÇÐä4.öBÛN)•a ïï¬-ÉX"ŒÀ»ÉÉ âQŠÃQ‚ ðvÒ…«g™¦5¶œ”,Gî5+¡GÜ_ÝLøÀÚaaO¦Ât" †92°1´Ö(Œb€Wƒj £[ F!‘h„å%¦Üuî 4è /ð¢H—HNö$ƒdHY’ÀM™ ò È€ËÐ /‰¢ ”¾ë­zŒ"èàþ~›l ˆàûÑLÅ@´§iE°_¹D~F, Z“€³qÉeÀÚ<v®·°·¢“IÐIÕUŠp(’‡™]4}í˜Ñb­òCÜ%@¥ú;ìùÉ—ßÍKð1drý¦íK‰ÞÔ-6å‘ìöÖ € f]°„%xB>ñ!à¦)»W÷d3Ú/®„‚Š„%Îë¼47ý¸„¶¢î¶JA^3ahÑó½6“[)hí¥Î覕k›ÿXÅ Z/aÆ­˜<ôÕÿbiµ§0TA 0Ïa:4Ø‹°s«f&F*€+ñŽnü¬ÎÑt©y( òmµm`Om»úpüŒæÕº&¢zÜ”º‹ˆF B44|ã}z&¡t—iXE“±Ó“=¬tÔ ÈÐË1Ù!àÓ<ý¼50ËÄÉäd­…_¦&tµF}=‡S17KÉ*I­ÜÕÍ›Óyálz ÈöÉëòUá…©Uk»GÌ›õÕñ>Ìwè}&ÃÝÑÛ H&µµŠ¨€  @‡DtcƒÁ@>c7ˆtC@±@€Ù  Ò’1VðþI¼Ýò×Üj à3)¸Ô¼Œ’iD! þëífNà(¨0w»ëÁ@†ûÆáYk‰þÆ´ÕÙÓ›WÅÍñL½¤à ð5n =f%Î3°±^ðã ˜¹æ›U´Ò‰w’$ Šwò<>ÄlÝÛÅ›JªÝ–€:k/»ÉñÃgO­¿¾o3¤ÀuÃ9µFðéIÙû_-nG&WQ4‡YptA$B<§ŽÁÌ™ƒþ?5Ï „`¾lLˆD†=]ÔæšoÎþ•¿7j‹e6¯4€ÿ¡Àª #ÑËÅÓLK¼üi¼ÁQ‚%g$gvxiòþF‚—H)áiF§ t= Ñ¡i{æÔG ]¥€;ˆFdX^º)`ä™Ñ Àˆ º ‡ô,ˆ Ú  ¨˜tià (û…€Á±`Æ ªx±€J!F€„‘Á:ˆ½t¸˜Y°T:ÅX«Xâ÷àH!A\ŠE,Ä+¡6%-#@¬Ñ ¶AŒªK/ç»3~½ÿˆc@U ÌlоëüO‹ÈÍžLo·Æ)ª‰Ì&~‡½ì‹yÏ& >ýÁr™¿Ï¬ôG“¬×!é´+á@‚—"[@P3l‹@LŒ$?3à•VýÖvbÀ:C|2½£ét1šˆj?Ÿn*gEõÃЯ÷Ç =9of¼d諾ڿˆÍh {^'2üón€d¦ûÔ·\aƒúð¾)TðÅSð½w‰"Á{I¡OßðEŠéh:MQK¼7½ªt³¬=ä»w _©  ¹õÃUh±j€…mûÂ\gÍÊ8€˜aåv­$·9SAjІ,*g!5>¾bÞœq,vÜ©C—Ã(á(g^†rˆJô¥0ñî5Å s´™f²ŒPäά­€ªdo7í$Äõ„ìñ9iàCÐ#»(4)Gý{Qr†—_ð4l.•€‹þ5E€'BcÚ9hj'Œ¼jvg¼¥˜@kÕà¯24Y°VÒàA3K½Vf€,u9 @襈ÊX¤µ€ÈDz3*!I¹^%­™,*𣠕€óeI ÄÄ©4zƒÅ®ÂªÄRœ6K‹‘”mªVÄèÖè@m ®Wˆ0€ ‘%#AH,ÀdŒl-ªÚ˜Š‚úWZ†ú/MÉ „)DóH'Ô5pöh·¶ üÝý’Ћ¬NŽNÌî·º5Ô&à`N“‘Y^ƒ|Ï šþ¯—š¬I8°çx ¸Y7–õÖÀVòýÜ;û‰s¶B °ÒâJµ‰- ȧ?‘}ÉwCŽ¡|ïÌ?ê±?ËoZÈᜟû4ƒx¿­®sæ¡&@VòœÙfHÅÿ €øGN'Ôx£Ñb`ÕAÛã ô5Ç»®WÀãØXöW@ÐÍêðé ž0é>Ìõe¨þSU@ɵ›‚:T¹ŠÈ:|–l«(TëÄB éa0ðk_²k…€÷¶ Y`è´ìÏ–1Ü0lÀ,Ù ÃãK(ë87ˆ«¸ÝÓÛµãŠgZ!ÐT0Ö+‡äÒed©UºIŠN‘Òu3âêŠZ€ 8 ’A˜@w‚HqÑÀèÖR—$™XSˆz”Œ’@Š*”Ä € 4£0V”I­è\X3³Q䨲eÉiŠ äS`2ZV‚R¤´0€” bdDRD€ €ÀÀÙȘÁQ^û-nж™1e-Êýv3¦ÄCϳH„ø°Ÿ¢-³îÄûJnž¿úo¢¸ß–0O§LÐîÜè3¨Á«¨•ópÁÉ´o×€µgŽ×¬™w&@…‰µ€à³ŒÍ2Æö§eÂÁãów«3÷y‚7ÂÌü4Îø‘âE…‰Øí’bG󿦰»–ƒg>Àü2ø‚ß8«zí tòý÷ Ì퓳h)©vý+¶„ÅU„/‚[TgîJB2­HS `t Dx  i+ª¢S,"ÈÀä¤ã±¡)­ÖÀÀH¢JÇXS@øN`oÛ0@¹ –€™¨@? XÇH€šOggSÀŽ&8ì3°ÿ·ÿ¡IGJZ_bÿÞÿÌÿ¾ÿÅÿ·ÿ¦ÿ^ûmþœÊ2³(€ÜoõGˆ Ìü¾lÀû>½P´7$ìW "OPâfEîˆöÔ–Ø¿ØÎLÀ6ÅOg‘Ž¥ÐŽ‘¸€›9Hp¿’9œËU)>g!ºiìɯ\d|q ÀÈðEÉ1®OÖ$g Ø8,éϧI%d3s\'dòú Γ϶íXÀK¦ª\P"Ò €'4Á Rú|*°É̽b]̆‡÷y‘§ÿ'Ú€+àÀ’d}Ï]$ýõË&IµqHÀÖA p;2>½Î ²(‹á@ˆ#!ïÀŒ'[燀 ÀÈd€EÑ©’Z700¼ÂB!€=gÓ*Àà³@Õ¬ T CÐaå2R†•€©Jª€ Ö€ ã# ʶDÁFÈ(Ptê*¤¢—€°Vˆ  –úbOë#c2‹B½.¡ÀlL¢@y4y ñ–ò Õ@>€<ö}½µ 5¹Ÿ²§¸j€¢0WñâNPZ$éû>ß®4¼áúMUûÁxž¸‚½å` *èÑpû)4çÔÇÁš»²)õxß½°lg·4Û,©øÄnΠ:PŠª­Pµ®ÎÝ'’ì¢b˜&Z4B4Žûra¹x¿;ŠGOüGÇp=ÝB^ö˜É:‰j§†êµ¬ˆHçw !­¢KûõÁQI¥·ßgß¿À[¨ @µÚŸã±lAp‚U_h1B¬¬ÓªÅ 0‚\<Ï‹Vßf(bEÅá`Ár<(Hij´È¡F±+Ôa4Ö¡tÊÕ èpp‘,°¥}@HTQTÆ ½``˜5hhqjâzd¥Û2 ðƒ2HUU‹ yÞh @-4‚BF@Šà €®µ– ´zµdÚ?bÚB³þ™¶à×E×Óÿ t¥…psQ ºóš[NSEß8/‚HÑúˆ5n¢u[í:B L©úb"¼Ž©C§þ‰=¯ýí—ÚÈ„ë|ÄÞ÷B«$ žàÑÍU$o¸H‡¤Ø„ÔⲺOÑ3–£V+Ý^b0b#¯,@=’" ÄjéLYŽÔ#oVJÏdrž/IP}=b±2ž#á•€Ó®ýf„e£0$="vŒTC(#]ZkÐ8Â+ôìâE#FD " ´Žyg7'âﯛÉPœÌ?„ô û›uðä|^r&ƒš œèµí׿÷>ŸÔ¥9>©>)-j„UÖj3­ˆ¾YD¡;nÇ]q‹f}YÂ\ÂËÏõù\ÂŽÕ”>©¦7«‘0ÇÜ\,> ¡ˆ´ ¾ë"Lo=à»4êK„uTŒ¸eÊjE6q™õÏ'Ë!°ÏŸóþ:tsóýˆ`¹¶‚µÌºÊ(Õ`«ã¥ÐSDÖvÚk;ßzÌja"K‡vcúìfe”Š:2KžÆ°¶˜Ëž´œë»©;NáE§Ö®¥O²þòr+ž;/¶oé¶X;”óȵuOv(úõ•±g^‹žrÙœoŸ¨o‹¹TÔ·2`¯X úÙÅ@¾@µyµËŒÚ€Þà}Q®¿ý˜¬Ýý_ dýÈ4 Ø›oÍV?E­Rª2´‚Þñ Oéb}Üý2 é]ýãÛÇÇa?d¼yÌë-«‘PG‹„=^EÛ³2}2K—aì hWq“MyýÈo_§>݈ϥ1>wC5p­ÀÔ'VØZiMϧXLä¡â¡ßWáÖ_”©!Èê;_´SáÐľŸoEfò§žs3ßÌ£±~ÂÞ“]Ðô¼³†í9IèΔéò¦{no»tA*Z ,bIO1ÿü—¯}{Žàó{ÿÈi¶»:)oÕ€†g«¡Š†šÏîËá;ã’)ÑþÖ5¿¨ x”\.º²zcý0ý»‡ÌS{âÓì*¦½ð÷Èèxÿƒ€˜»¯>9ˆ¤`¨RÆOö3½s»v޼͹^®†ÃJVÑ<žœÑ³S¢¹|ïGØî"éEi˜ƒ;\ž«`»*¹doLï£Jfú14€‘ø0J7çb<bñª°ÿÔ T¦ì-)¢ â ;!Hk %´ây§O”ŒP‚J:Å`#®]¤PGtÄ)ù“"ßÐ’íë”-ŒðÙÉ÷2tÆÁ4þÚíRÜЛíV¡Að!HT¥ÝÀIÌ3òÊf€ ˆLû?"p=·±µYÄH:LT ©FW€'èý™Ä|¹§Ì"ðè@{BÕXÚ®ä–z) ÷tY96´Y=™„µgð¡W?ô_rÐd º±H·Si–x.U“ùýK‘ÊZ³š¹,/öXÄôNºNÖˆÓÄ`™€í*¡‡¢Ç¯ü¡nÑï:Ë)Ÿ‚:—éŠV‚Ï—€]ªÜ5 о¼“÷Üæº×ÞH¨ôVÃ4s&?úŒkçyX“¾Üަ§5Lïú÷G y'ï}$™)ªã»ß>7¥{¸ãΚ ïžsþ|ÞßN0=ʼn:™ÓìÞ®ÁØd’­}11]~ͧ Þ“ûä7×›c¤Œ«Ý$Ól~Þl•>ogµ»5U‘YÌ\Ó§2šìé³¼W ßýCvÕù÷]³|M p/¹Ë `a¹1f^8NS”T'h‰w šÀ¤éŒl]€A™Ôí•>"X$ùTL¯Ân¿Ì+|à–Á X4z,ðKÓyhžÛ\Lo _n·ë”ø¿Ƹ‚Ï}QðüǯE»/p±pî NÙÏmðÊ`IC ¿F½yQ£Êª’€°{Ø £®î¥b­E%û3©߬¨uýö>“­==%K„6ÜÞÐ\@]÷~á_¼EÀ(÷Ï ‚ŠKÔâwUá$ E"ï¬õv%˜A`í_6>£´ _׿ªÍ™»Ûzé$€;:ôþe…´dú?×Óp°‚)w}X] aª(õU"!‚33×ûüÍby§ßЛˆ‰‹$Qš~¿#ºü\ºÔé:ïëfb‡ì†:Oæó*^‹EX¼¿Þçþ ‡J\‡¤~vUŠh(j¿óc¦WCÆ–³²®}Ø?ûɺ*‹Éêjoü¥“]ñº:Ó ˜¯_¿¦ÞÔ޿.†¬dØEÖÛÑ3N_ï DdLOGža§¾fŠëσLÐsY.†Î‡aØ•ô^­o‘$^H*I‘xNû±äM]•Áð„0GàßÛ ‰$Y…Gº}y>†V5ËÐį€ü¿´M'6˜ d|fÆEß!4–„Ј ¾Ë]cMx‚„2äv{lÝ1ö Ì /ãî¬?Àk•$àþùn?/8UX÷9gc4¦ÈkUÕ˜D&â¾/ù)«ŽÆ?Û²à‡½Ž(ˆ”!´'CýǸ-!óõý#8Ö8ã°²gŽŸè—}¾¢Ù ò„œVÅþU~!äÂÜIzL´ˆ3í¸0ŽŠ}R‚ÉBƒìf…aÏ‚ õÅ®¬~¥‚#³[È—u'ÀÑ™ZÇÞ)4²“{5L%~–ÅSrï@(ñ~âJ/“ð"êÓ(‹(HÙçð§ë^zB~wÎ./0ƈŸ¿6`©•QCù¡ÉŸ*Ý7?Ë ZÈ4ˆR+G°€¶ \`8Ýãî\žûÓb rûmq‰iCA5|ôˆ-y¯Òhýa’£LÈOµxˆåÆ‚M‰÷¾<í–ÞzX|×9“F}f檮àQdÓ¶âé©z9ø<Õ™?NzêÆ’–E¡d‡î zÀUt"wbÄãc|ع¦‚‰E‹å¦­$3J¹ à!ìü^>PJ†®)UUz ò>·¶À-£¸¸ž.s†Vi²*l§ç Œ%Šâ^6‹?€w®‡Vt ¸`–õ. H¬s†d‰bÐrÓÌPϺ§zß&ù©°ì¯Ê3ì3=J¸»:Úœƒ!É*ëÖ¥²'zN(li9“Õ0'Ï E2K³ª·&pÃã– CFäÄj øcv$Rþåd#d°ÐST’PךÙPSÔÁ„WOêÞP«;ÞSçu©“¦Q–ætÝüÿÎoÀ>$SÄÌ‚8,Ùß„¼Ö$Îf®šé¢Q»ÁÇÿWDJ\b:ú:ÁìÙÞ .Ü@WT~ä°2h†‘õ5@É X7bžU4JïQ@¼å KB‹Ò ðJº-Œ" —0Ô&¾ûÝÛü‚Ø õåz·ð8< ¬Ë ØŸû(9?ù*==鳡?=¿!o ØNàªÁ”'¼¨?×f³Ì瞬ûÚ!ÒjHšy ¦é-HÔ4Àúwnö‹6¯Û ä÷SÖàSîQBF,:£}ÞG@{\ÊY(ʵús⯠@ösÌ|wàÏTÂ]¤¾ˆÓá.øeÉíÖS8»Áy—|¤Ñ¢øÄžÖÑeTtO}¾¡) z¨M|Ɇ]€‚ux_½PÀèsŸÓ6}ÇÌ>ÚšÈg¯©«<_OtÓtB;OЋ¤5 0;@Œöö¬Ñ Q‹,Ú8:dnÀÓ« Ëì3‹©dp"ˆU«Î" ¼¨'%¢¦`ñè}CYt†¨&èª'žz&‚‡OàÊÑ$DÏœfÏšz’¬ÂYL|NÆð¡+QM‚(:‰|v>ãØU§¸÷VgÑÛ¥S–¯sÉ*'‘cKó­zÚRbˆÈÄÜpš¿’Ò 'J0xª ÒM2Ö €ú!1À`_p~ûÚ6rN &×ZoKÛÐ' €÷§Kíä-XïÊã}ÿ‡ûðd|IøŸj æ¶´ pµÁXïýiON¦«í.ÀdjÂ¥S)Š0€ˆfZI)FƒOF¯ô§ v¹Ž”ëVŸ_mû€!7íÞ°f-!øãÞ/J´õ%RMœy‚ÔE3Ñžåð¸ž)ø£1aõ¤”=ê¢á7Ó+¹H„ÍÑý¿#(~k2@N½Bñäœ_†ÅÿÅ·9:Û&×^vü{5eä÷3ÊaÖëT`P €¥“é€,øö‚žŒ=p”ûÞŸÎOggSÀ²&9EJš§–ÿœÿÿ”ÿ”[hiÿàgefZaÿÄÿ«ÿj¡@ÚƒÆ-· Ð#2‹é3pn§6ÕSÓ’—¬((  a­ aêns 6í⸀»d‘LOâ2Ûânóx̫Ű®ž[¡Ùä"å8a£µ„+ôÁf4=’ €tŽÌý¨ ’ì¼§S“4ÐR-ÁdÒ÷ÝØ(¤Ü‘"Gßûd$ˆv  •R3#(¸úŒ8™³è ¨@@øÚsî‚P€Ÿ_c%*ßN“™ÝÏg MÐàÒ‘šª¶vmfnz€Êî\³“Æ./GMö.C’xŠîžUN†iÃ0;Ûà zbˆ°Á²²qVÝS*X `HóXku€ˆ‚ðH xàûã%TíÉä®íNfÚpþ<µX¥Yûö7€s‘x¿,¸¶±¿ôì®·lï¬O3Ð&á—N´Ìå°Yd“Hñ4I“À“Á}…6æìpÈ‚ŠÀÄ%€î›ƒèBDêËñ[4`Ûyv¹üÀÔõºDçœÓÄû{[›=²‡"×}~íx4kåo¾4ÈÇ‹’›ÿ—ñqxPíÙcÕ_4’xwç@r³½>¾ßžøÏ#õÕl) êg…ÀÃýCþ>Ú‚^_8ËHU @H9çû@]·ü%4A’”ëòƒ¦îN<ЬÈt÷À“­@Ÿ€Fï0€¬J`q ‘qÇ*@Ñ0&\*Žõâ IÈÖy’ÖÁØ›C &,ÿö @š, §É b>zïgׯ2<ž®Ï:EbP* •i“$è (t5£€‰€ß‘Á@—‰#ÐLð¸`¾û½–KE«b{;P’‘7·»¸khpƒëàè8‰d·¡ùП6 `==\y»í W tí8`<¸tJïg`6_nY– %€H@س@DB? ý1Çæä˜6öwÀÁгùr" ¾ú½L¨Ÿ7òh2´nš)+¢sã)Åw G›}ð¯·köP9L&ŸnÐ= @èkŽó‰«µè<ØÚF%K\T€€LìÊ=ŽGÕÔ¾’FTd™Q£ó‰¡š6-«^Óµsç‰M? t½gO欻 yÓ¬çò…6H!Eçz—Écvà¶oÏ}6æÒqœzUDÉ<\@Ǫ²‘‘ÌаÀ`mQ­Ë™Æ×S@¦)•À€À8›C `“uå¸-`RX£0K©7À;W„DƒEgeë7 ìÁzØiÞ~ KÀ‚ö`0@Õ €1`àÐ€Ø  €‚€¬ª ‰%À+Öê˶Í)lù|mÒ Ø§\i.!.H÷›x‹þ¯çÈãÜwÎå ±ðê=ä—a¿LTœ°ƒ[÷-Ï_ÇÈ­$;f^¨¼‹‘„“¥&æãNß* #!ÞmßNÞÃ¾íª w’”Æ=Ìm|êÅ >3Nø@)eØíŽøe¯ í]¾–`·›±lŠˆÏhß8ˆ'@Ñ`ŸLÞKN@΂Ì>FYd¼äeiA$¦¤$ÅLM\“å7ýóüiÅúî”eƒ' Ü­KU}Lìº)cIäø5ßöƒím;´ŠVº;„,|Ï+·ÝíLÍÈo”¦NU3o;»nÚ”TÙ¾`/ À½´Ví[mŸªTå{jž#u€ PI °ñŽ"„@0l´PШŽpÒbh‘1ª€š˜Ax€@!IÀJ<c D)j€z@t‰A¤&ªŠ8¤]C Šþ€oԊþ¸Í}µaüò&(ßÚç½¹zešÈÑjUÒ•üVÃD°9ÊõtQ;ù¹M}({xý$òÓÄ)êJÕ{±5×Üh)X }¶ðùðóÃÿÃù“‰¢ tZ¡± u¢c‹¢J© kÌìøŠ¼°Ë†lØçã/wCDàånÍm©b…jšp­ãËC¦péIæõϽXõ ªe)óèw•¨ØÎïÞþœ+:³Ô_1?äpöÅFð<Û¯—Åëi¤‚ARžüôן¿ÅÎû–k‡ôPÃõÍyVB‹ %ãfÈw?ÝüÔtуϖigà—|vö&€ht|Ôá²fÞôQý–óÙÒ½ž^ôH½½¼ :Þ×÷º&·Ÿ¿øQ éoïod’ªÕt©1|°«ôóB9ÖÕ¬Ðg™ÑCy§r²µX*àpòvbD«§~¶ßÇûß~ p¦ò)•ìù\Üú_ì?0Ùþ˼=§«E& ?h~<„à|@@¤-OåÕɱ¬?S~ß®Ƨæ!ÿX÷—g”-Îö“f˜^Û]OCOU'Oúnx\mn¥õq¥®{.BøÔÌLÂÉ'Ÿƒi!¥à› wrj+ååñŽ6%+ð+ÏLJ4BÆ:©í#'¿]=Á£Êy€™÷¢U™Úàï侃m•§æ>Ýžzda;§r'—‘½æ”f†Pçeû憰,O!&eŒfGŽ·ã*çõ§îd°äÛ0 ;E¿E2fßôSövOûéo©ÂÁ$º¨špêø½y-)Þ&¾°ÓdSH,–õ´">O³›³z :'òlè»ÏÒK(ááËã“÷ƵWçÜÇf÷ÛgÓæxxšfí¡ÜÊHF2 Ü0ÍT‡ßé…|覠z-’É™y††f~Lßïnh·ƒïcj—9ìñî}Œ=2’\LÀ7?$€bÀŒhGšu£ ¸,øcËÃ, hظôòmúænÌbe•öY¹Ž–‰U*˜mcUN–{=C¿}D'–ˆÀõL²iúŠO¶¡ýmUVµÕ4=7›Ä-N©-ÏiÙ¿{v}¥ÎþµÓTy¾ûÒNͱ̾üÝji,‹´´”Þ>ó:MSìf›1î0A«Îw±Ýw‰ÍBîŸãœ¬÷çÖGc=eàÒ¹Ü.R*·ìäÖ¯’Sunu‘/¹Ëf/ÿþ,gólë§ GÌ‹ÈÕŽú8äÙ›^·n–чuYP}ÿvø§á ÜfIzh¬Îs«.0;Ènå·ÙëèEÝr•—©ƒæ«WããÚ#_3³{É|Ü3²ÖµŒ[wï.ËõÖú“×)ïx~ýÎxû|9]6/å#Ëp¹í–R0£MË ¶7ÿ%¯ÔšG? °ôF2 ÅBEiÃ!ÝÁkg'æAb«CüVs¶£Qðj©¸RROÅJU: ¯Õ:{>¨è¬PTŸÃb‘ÐW{ºžt©Ý(lÞbIa›ª-ëÞ‘> Åßxd ìJiipÄà€Z*Íí°jÊñY Âã¡ïË'$QÉËC-0h€V,dÁ« µÈÂVŒUx%¯`»Wcù‰A€1:€(^»uØËòAÚÍf5pPÜŒdaô~×'d¬­+ €§ÞC͈‚y-À°Ÿ PádÖ¯ë´1S&M».(`ˆäÖóïr¶úé^?¼„oŒ)OQ¾ÆJ¯;Bd:Ö÷5ãk39нÕ¯×=ŠAæ®Fè–È)5ºÂû´0ÿ%÷7È!Ýœ£‘µ·J¢5·k,(W¥¼&Pº,ìle»nÒAF6º{%$ζ*u$”"³½«èÌ)GítKËÐÌ€RÑe?K7' P'sœŽ„pIåÖ¹ Ÿ_íH%pD¸P™„é`°LkÃÐÌTá8j›NÏÜ"h µÇ±fÕ¾ßĤ8Z%æ{Q $ݺ«F ²Î0D QJ²Y Z\Š 6ºÀDJGA<Š€E§"¨Fà ¢74F8–@ *a  Á€ `E2‹¾ì (>¼} R±(ÈÂx¿ØÉ§È+²LCûŒ¢Läz­Ü À€}Ó•ÀSòíˆvº„»@öÚ\Àºœ±‰}¿ÎÖ9·30vG3Åé»#ñ"×1@Dï{´²¦¸rÍ=ÀºüusBÖá Ûõä¤ÑóÈÆš ‘w¨Ê½tÝàèÄ%ÐHŠx V¶Î÷áãèZÀ—B¦€4Tn|AÀw'‹Ó8ïÁ;Ûž @ÝÕ¥¥b”‚—ž„àɱW+q ”\ àɺTÜÔ;X—7;#eFZÛ«µ/,ÈQ«W㌱’³vÎó"©¼ízS뀽â4ˆì4èmóQ—²Œò2%üK~Úº$ű­±ÌÐÝkΖ¹õšMР…ØÛ4nÛr¢óP÷Ukì]Ã:©€·}wÀ;u’ö¡@ mPٌɜ½Ýº2·„dQ8A/Lt$1h¡F€ÌŠ €=;¦ÑÖÇ„BiÕu£ ·(Æ Àm˜I A[mGÇd@±QEL1DZD öM¸„Ç ”‘g`Üd¢íI+¢>.ÀìóL¹ áyN°y†ÒHvGÛ6ysŒ`é u³vѹ[Ãè¯ou´rÍ›g@•ß* ‚ï|vÛéÏn ˆW1PFñ]æol¡@¨j.@9Ž^ä ñÚ @@-ë54Ù;ÔÈêê´• Å›W)¸Ÿöß誮L¡<”Ћ­“ BØ™©PÄÁH $j…AY½Ý|tq¬›á–˽|½Ý#Û ßá  «’f¯“V ëÎÚtÇÐDi¨å"ºÁLÖ2ý^*.Ê(@¿ûCvAO–§ªC‘‰h†!ºÐ´^_"gJ-ìW­€v <¶jW¦4]r®Æš [w=tjÖ¯Èö ˜0hD´:®.6Ù2ŸCí¨hì½×ŽÐŒŒ0jº‘ZÖ¦˜DûÄ2Ȫê”ì`hbzÑdt}¯QqÏÐ@€À@@0V@uT– ‚ÒXÙYš €&c¯¼¥Z ª Š@cÍS€‘Ñ ¬TÈEƒ|ÄPD†Ïº-€µÀ€U0èDŒEPN³FÖPèõ%dq`~»­f8zÌœ‹í¢EHF§SÕˆ¾ÀÑN‚p0cüˆS2xçœö‡íg.„ ŸZÁÄ Þ²@9j“ì÷d`Zp³,ù&<·õ`ŒÝo{în”c2ÁŒyvÌéçò›ó´Ööù»ðò‡{%:›æ÷ÍC@I%rEU`‘!ƒe?®oÀÛ-¢‚O tßÓ€BÈ(s\Ht;¹~Øyp¬À9=å3Xqt¿Í d_ðQd»¬S|#’*#€à B½xr@­iîù¯î1I_2$窯 M¬SU*D݉?Ç JÙßsç°§«¿ô¾×¯EjG"Í”+…:5sM9 fF{ÜÆpžOÍ£ž»ƒ¶AÁָנ<äQU§M+*‰˜ÐÀÊ=õÚV "à€¥ƒÖ   "c¶ò$Ðh5€BƒÀ fµ*‚‹* –(£2J'[€Xc³(@šD'±UQ¬ìùÁˆ(ÚÚ4€»dàPÃ0ˆÖ°>›­lOØ@™GhÏb«\"­ «)È4¤Ð7Êœ§÷oŒ~±'Wð àd¾\hÃ{Ú¸ˆ~'ÎÀI·˜Äì·V'„}K`ósáÀ6þ@œgâ(e@Å_÷üé5Îåš¹æ%:kLÍ™iÑ—_?ÙϧýïQž'k çKƒg€ð*Üz¨;Ç‹fï( €„ʾéÀH쑨§´…’m7@ï£2ÁÓ°®]§2JܬcWØ|.Ö@ÉÔUÈJâ ÍáÌX1A]Ó@Ü~{Kv“Ìéz=Y®|wøAÜjgéÒñj8ÇÙÏ.Z°T¬¾ä«í鯴Zœ;ôß]Ðn¼ÿY¶,VY¢––¯ÞES „¦0ŒõNkw±Ê±²fŒCôj‘§ÀÄ}¨Œ€ˆ%ä~§hóO5Ïf”Â]©59ô S7nºõѽZ]†¦gM€æ'¤æ)°R-±Ø@ˆÂ° ¥è«PD€Ìé÷Dp:1€ÁµtªH†% 1 Œù#@e@´ -5Ö¬  8ÁzeäZظ”‰)ô*Ð\æƒb¡Q˜ýøäÄ}4F/Fæáá+À]jÐA… .ôŸâZÙ¾Òºà‚À%ºC`Hg›ùåÌiïny*1—€Ü‚¸ïÇdº÷ÿ;<)üü—vŸ¾Ÿ ßÚ;{¥”R›d䯯‚xŸ Âïz[ùbˆø\èöÞ—fOAdÌ:c4" h¤Ã¥ñ²‘ÄSª¸ùÆ4)‚ŃßÜH,‹ó¥ãóëi€cZ ãì Γœã¡yî\I³Á{DRÂùÙ×"³ šÎì~<ÐÃvL{ï¥>ñÚñk›²s>×Ê4â©·<Áxâî"’Øivöã@ÈÓ‡Çÿ¹Ï˜Âv[f’ÕØ#ÃXtòÔ/\ÊEÊÀʱ{1ÏŤµ!©('y p«Y`%* Õð1`¥=êu.Ú¶í,®¶=\'G§ &qe…9&„r p0º Ý«a]ƒ@QÉÌ.û¶6 @ª¢<=z HEë&t¡&€œ¹¾:¢ªª€Àî%°0%,«‚ÅbA½b!¯`«ñ5ÆP@T-@BѪz#²jk ÔÚ?耲R (ÜÆ,1€ OggS@ø&;ùL•CDEIIHJ__`iÿÿÿöÿÙÿØÿõÿÏÿÂüRÁ ò¡_ÜR©Y¢€Ó]¯Ý¿lL0\GÝ–öJNaD"Ö¸CŒ;w†.ÁJ­&鮀1Ìã$÷™ÅvDôÔbÅ‹‚³,„\¢–*®:¡>ûýÇGH8úV'gÈo­dÁÆ® Ì ÅÄrܳb¨02q0¸ ÀT‰ÓpŠ6„>=ݶ“l,º1ª5i?0}‚û¬„1ÛLðÒ?qÒ-z»ª¨¸G©Aám»,´z†².*—ƒ>$y¥%~8 ÌZéCK!‰Cž·Fu›‘P¨´÷¾NSþ€VE9gèH^{)¡Ê;A=•™õEÝaÁ¢8VØ'ÈÞ}Ú01žk©ªz{! ì ¬Vu‡=€Gu{`rÇDC»PÜZX<ÓaŒÆÕ§,]Y#úSSbD¹¦áÎ8k¢e”T)_ùžAÏH%1†s$ØO „6ý‹/5ªÚ ,!…äyí¼ú±ß†pPXü=´<“Þú1‡T#YäRÍI!Ø]2½V¼PÊY …vŸªÀœ¼Nu‡]↫f©Âf$Èr!”Šþ™7Üõs²oQ£‚TNmUжDè½QYæd!¢Bdˆ ÛjèIÚ$ÙÚ`7nJ¾4PÿaÄR‘ÕÉD ¬MÕJV{)ãÉe8?¯_èÏiäªy„ÕM×w]–÷¾ak”er/ÔêYº¬ß¼,1«"ƒº®!øÌ~žÈЮ\wÅ^®¯Ù{W^#8¿Íý9 ÔJ•3ŒE Ø›Û)œ!¥ÀÐy^yæ0Î7ÛˆD!0:jÿ¬´æÉV²s»²µW¶X»éÕ‹PÙ­ꌋ÷D~“쥪զ¨53Å»aù|ª}Ppñ¯eA‡SQ–"âwx´>édOgÕ•Ö¦ì@Æ0»ëŽÇ]Óµm–`ŸçÓsû¿õ£ªµXâwø$ÛÎõ¹*¨}Ö‹HQ>z*Qœ<} ­\¬Þr¼|í%$öáðüë„CdbE¢lìç)‰…\2 ­çc§¢!¥!µ>iåj/@k¹fðô´<ôäÇ®œÝS‘š’lÓyßA¿•©E=Õë·úeÓÇÏ–‡»^^‹I_ ¹ãkÑ‚]ù³µ=/¯X­ÃñÛñÔ©ø²ÛDÌÕ µT êJ)xˆ a5›Õ€hXDÜ@Ðý~¬:=$À9ú¶v¶È¶µÃÂ×QV©I¸m˜Gš+ë/ÿ>çv©ÙIÌãm8Ýíý¼˜ð¿ï¹¼O8òéñM0“ÑÄú—«™ ¥g]º×t%¼s¬«¿{{·æ^üLÅo# ŸïVzÙ—üªL—çò…GíÓ³é+ܶßÍUÝ'å~é%Tú (èÙ\ˆÊYqÒ3œ3ó³dö’@i;Û™Š•]rVëßYCÇÎ3UUµJšî{U~ÿ«™\¿)K 4øŠ±ðò¸ù[žUÕüûLO•›æ=ºxèTMµ4ÊÊ >—/&.)CÔÀAgWðÙ<«~L}mçü&kzÅçð~3¥œâ#´˜O 9gÎÕÑ~0Õè@?Ñô“Pò©féÜ&YXŸç¾d gi/“öÁII"âþYŠ„ð…—‚,§Ø ½JU@‰È<4ÿ~LÞOû©½Äq¶W¿KÖrwà>í[¶[ ÚMÛ‘$¾³¢*©­ ê(¼>³_žs•–4¸ž"Â~ƒ&;Âbw•Z@†ÃcÌÞè¸ÈÞ¿tR$Êd^@?ùô÷wþn"´iyñr2d€’çºöñX ]L‹Õ’]Ï:kÊçíéL_z¦6·Ü>)“dÌ>ÊzÞ½ùÕ$ M6›dúŸì¦&þ™'»ZcÈŒ ÊËãõ´“™¯©gÃÀš9|ª ëNW'4KÁþòõÄu€åzK' dÞyÐ-T „eRªAËZ©Ÿ7¾@ ÏÈøúPäž*-Ë ¥!,bh”Íl/k¸€A~c Ç.,¨„X+Èí½Xx?~^Rh0€„€® >‰¥“&Ÿ$2ÿgÕ(\>¸ôÈ¥ûuBœÀ»Øò~ÿÔ4H¸06¼ŸL€É¯Ÿ:=·60H¬ë¬ÈûÖª´ôA™”$ /=IV^Þx¯=ÌvÕä„×Ãù*´Œ¬Á1BÖ÷P¨Ú¥ <úý®"/¬>soCE Áo@£µyðfçöeÀ7Œ5h'—iÆJ n·0ÿ—M¥×l®”Œú­‡VmzÙúzݭ形ÇÐ[”2þWæÿ´eÀ6s±º²b¡}1 ylÎ6ôYPq²*Úã ¡…1ë_qTßëlL¶Ñ²¿: "‚ @.±d:{¤#L"eô§C³ÑC±%ÔÏn´éNHf ÐŒÓýö4d%0¤b7-]³ ¯ÞzÛ˜û {¼óöÛ•ÅMLÉ»‡W/hàqHŒ"À—ØrMÀ>ð ,1@U~‰@%`Ë÷O3øÐÏ6Z´‚f꺸 ÂHšDAŠ"0cŒ6B°§ÃM(€yeÙ2ïÆh¨r%Ü̪´]JãC\Rþ?Àã\)œÆÌ‰CUxëÊ1ðî_g³ XŸºHPdy;ñ«ÍèÀ!+gH¬¢‘ Îà­Ukª¥ÍTJÀ àvJ"ÁëÒ»ô^²ÊÃ@çGa‡4–=úšŸXº§Ê­³!ÜgcãPÂÊÍWA6ÿ¡€{í!š?< ÁÓ‘¿eZÞ×›!gý >.›©J™¨kîÒÞ¨@ sÞ:2ê{¹ ¾dz¹Ë7ùù6ÆÄå®OÜý–{}kÌÊÏH`.Fzd|üg l @¦‡õÐÐ,‹ÚüëàúÛ)P`ÄŠ¥+8DÝ:ßùq½Ä¦É$IÑUÛÒЉö=@ fØéïÜeŒØ5îd¢ag' z&&ƒ­k(6¤þ75 ½OÒˆ¿’ÍÕ÷ª©Í,Ó3§G `G½F3Y¥œ¢€Ÿ0‡ñ¢Ëý­ß YlTm^òÖLõöSÏŽv²;½†‰½;ŸÞÚ§®jŽ{~ø"¡tAAÀÇU€@«|ABÁ³e€}ß’VŒÐd-õþeœ@`ñ 5Ë4øNÐ¥))C4±µ”bs¼p ~™ÕA)—NÆo ӃȪȖÚMR~³"W)ZÿÃJœˆÕœ¶u€|Ï»Yuü×ç ¼@>Ìëdòùú ˆ5jV>pà!@á_hp×¶}x¡à;öšÕkD’”€F5açoðóX»m'zÓ¾ÜpÃêañœ?#¢öqûY9@žm¨?[Àó¢öä Ö\÷WAæõVE|~K¶¨j.ð@.釻‰wÍ @PÅþÃYWøUhUür>‡¬¹H7ôÞþ‘'ñŠí5ûm©èÝÁNªžÖ )¨Ó>^p43Ð!’ÎtÇÑlqšÅA#é‘MîsÞ††è~úÇ÷8ÌVû¹)ç`ŸŽû§<í¬ áLQ³Ê×5+\Ž‘M2]Àde]<ÓIÖtSÈz(ŠR .à‘cêèÙ½Rñ”Ù‹­>/ïeÏÔõ û8΋&“¬¸(šëôug Ò #pjï¿6w¾0Y»fj–ÚÝàToÆ»ï¼'+[L¦¡ïõŸ˜Hm¨™g *÷A>ìF8× ¤¬FK2N©¿íÿž2Èq’Gñ \· €u°7A.b`~ÞŸ,¼˜ ‚¨ <–² yë,(q@…ã« Œ!²Ð >‰¥™ÒÞúÃ'‡Ì·™¼ÒÌ”i&éA!£'ÄóÃ,;´Î¿óâá]x÷³µH\ x¨_Þ@'í“\Ÿ7€‰­ò©í \Ú°o¿š« œpרVa¡àE(øidU–î.N˜³ÿ/jåĽ^T|FL³žQû}KÀ_³¹I €Ö¹bîtð@•6”—!ÓXp'¢®ÀèÆéc¦@|2@†¶×6éŠ5‹BÈP¦}Ò+å9‘hlŸSdgŸtf%oŸ]dX‰kÒ à)þÕJ<¡ø®à}ñZeôíBºtˆq.;ÚÐiÈ4æ-úמ¬Ý{æ‹ S§”­ `üœ„@…ûœG>½ß½‰óbHýÙÇ•†($fö;þ\euRf¤æ®ð SôÑe~uRT”u†Íß”Ság6 Æ.kÝ÷–-¹d* !+‹oÖ]TWeå]@ÐäÌpv]o0å¶ë¥HùŽüÍÂõû…\TTæÀ»':Ñ ‰#îL6±Íf‚褄¼™U–°„Qæh2vŒ KàEA@{¬Ï,€ªzØC“nÁ߀!ЉÅAÊô?|r†ÜªWZyÕöœÈ&i‘wKCØÃóˆÕõg¾:Û«ø4ëß™ý“€oTðr õÁûͧZýôMuæ¡ýƬ'¼%qoTDØÂ\ä£F‘Žjì¯ 6‘?¹ë8Žã×§D?¤ !Õ?eªŒµj¬™Gèœ8€s€º{¥— 2±e ƒ3•JV€ @öñ±çmÒ)àŸÓ³Vñ>™’û/÷ÿ;@ìÀƒ{mî# kÏ|ü3{ÃŒ)@¡„¬x _–Vû’ =ð|_‚@˜ÞŒ!¨Êë+°ÉK,YáMÚãšKVoRýç{Ä›üØ@Ž:8o¸ü¼J 9DËZªÒÑ`OÊ¢âÿO60óÜ®:É\-_ié-²ºÐ°Quå4ÍÍ™ÂnÕ›º ¡Š)àp Š1 zÌÈAµ0ƒ0U À”¦ïæ&œ/†$Ðd¦¼–%¸Å¾F•$j’Šry{ÈÚhîX“«€Rzê@ñTÅFÅOK”OggS@&<K˜àœ ÿÅÿÄÿ¿POQNKe^]FRRRellÿÆhbVTI`gÿÇþ˜Å™V.i/íyË•ÌÒÉ«ÏL‰¡±Êsz qמE{ùç×?Ö·¶à+ÀPÕXöQbŒÚ–öC' •7 WÖ|‹ Ó—ØÓà& diff¤àND€øR 5m”½µ ÁU›$Û’ó /ðvûeF(xV€/@Öd«·é| „Bç3œ<çСS d¨¼Ò8Ä?·*PÈJîÙ ©™U| fçÑ^†ÞßFs x%hkçCZZDßócû](Ÿ)0†à!„m#xY[ žø]ñü—Ϧml|)Z™i]íƒ +º6CÿSb*[NDwÖ°L›ßïkýºK¬s$Ý<í|ÎÊð£@Nô†{WPãAxá®Þ»ïcÁj‚òš€R(òÌn×®ôŒÞ8€³HbózCÒ! åù‘A¥þ´%€7Ž;a¼˜iÑ_cÊGŠl‚“LÔìfà¸ãŒ€„ÌŽâuçæ¸«.X.ÝÑ8ê¦RYrE“áÐGm à^¸†UžúË88^˜…Cµé<¬œg€\«.Viæ•Â^DS.¨‚¤g¶\ôø·ê}_àÍC7KÆoIøP‚o¼ “SÁûÚj€`e8óp üí˾u<öÐÞR:ÂÉ"€îËÝ¢X#‘‚;´¿b¸¤BÏŽ{¹É³ÐK`Zã oÙž÷Îþý¦iížþîÌ Jðóo7r {òs“Š{ò{ Ÿ@€…hp­–pQûLÓ AŒ‹Í\Ìíœ:z×Oæå¥ð:%H (à É·—ÈX[(ž€ríÖâM冬ø°ÿ@O ¼äúš¥ÇP—À¸YP—÷†ñ˜çøÀ¯Í¯[Ýú_]Zmß,¥ J)8§â;ÉîeI?Šo¥(Dˆ³9Ã~([| "îms5@ä0P7¦ïÐP?ê"· Þ<=_3öíG]•Ùme4xæéϾñÅfóò¥ê?¢¨»N½7ë 8àÕß' øìpÄ¢×£ù¦3 ©Ü<Ïu[JhhD­Ðˆ "gˆ¨‘Q2ÞͺÍyÐÐ>4}”_L4 ÀXÚpÆ* iÝçT³¨ÄÄeü=O%˃jzV%Ë ° €!ÉÂQ$,Ö P€Ih¨Šã7:¾¸¡¸_Ð¨Š€€‘" @^Î`â5 @ŒR½}Ö÷zW,½«Õ)u!õvŠ`÷à~våU“‘†)Ì|—þô_ítæ üÒ5/ðTHcpÖ{mû qФ)"æ¯ÔµV•`“±M „Nõ'û,o®[ÖÇm©T»)ûõP…ÐèŸÚ5gó$’"Jh¯ÝÖ{š¶0gÿ·xpyð8£cN8µTTçIx"–‹£'n °bŒ”Zá¤=ì^tªTªp‘_öÓ·‘¼X˜BŠèè ÈÛ÷®….3¸!@ê³¶Z,U•Õ2"G׸î—’öQÐbøx¬ITVh ®/’NdR‹ÞˆguíôÞ瓾Ã@0=ª9Ó¹1xÍ`æ`šÓ–¼×º?9ûÒÒS¸v +R:©Ÿ,(`®‚T—“…ˆYo7ýÀ”VÅ;ûÌ/sP[©Ô»´—,ÿ÷\§TÆÎ´0…”.˜VÝ)Û UzÔuÀrEÔœˆÖïfe` k‹Y)²è1g¨Z„Fé…ÜÕUÙËu G£ÂC{V¬Šmžœ^}2wf£[™47ø–^=råÏÙ µ?Nþþ.Ëó=}öXì‰ë4~/™›R•Tý²ʳÌüdË¥âhñÞŽ¯…_דÈtJ½³ÝN’ý…Åe³ Ùïò||¸òþL覛4'A /½§9[òÛ´’ÿþÕoíôëã0¾Ð¡÷L·{¹‘Çÿx%äïK‘Y=ÄûѼN›0×X"މ¬áŽ^ÄJ…E*ÁèÕükÆVµCCÀ'Þû;Wq¢¯Z[¦Ï0ëH¯})T‡óž·ºrM&ãã5b[ÙŸôïCþØM:J­W†Õmd2Ö#ººÂR;ðbèq‰Ðh´ìnµ;üa•‹ÕnðÁ5漦?¼+ @X}Ú+¥¾˜ .}Ó›òY˜­ì1ÅT±Vë(ÌYùà’éç©?ølNK/viú3×\<ÙWñ;HkBöîãÚÂr;cŸ·×2¸)Õ÷ÎÛóW–ÙO¸Ö¹˜®e/Žg¢?fϚɼJKì{ ÞCàí3´buþtöüióÙª8I-ß~dï<ªiß·7Óun.+)Mïw÷ÿ5˜c{‚'¾Ê@ ¾û™ï×íð3¿;×ïü~-^fÿÃâL̬¤ç52ð)ÌVõ§ &Ìc«Ô6!Í!…â™7LæÃÀN"*!ðf9Óñ}øí.Såi‚êŠ~¦ö¾>Y=uUåûn?Ã75q-Lg»?ýmé@gàœ^éųMqcivQJÕfφ¬äô×{;÷Ï”+u(pþuŒÝ‹Õß”¡—?Ç^è—|žü¤¾ÿøs»Kïïü3og÷ýŽíëétôæ¬W¾Uþ„ø××¼ òï7#@uÔ^©Ù`Â’Ÿ Æu.ýÍЂûË™†ÏùÛo>¼´Õ’!jΧëvæ3»®fÏ ZÚë/ ÉB8<ÿ÷ÐF"[õZß½ Û;øÞ/Q=NèëeúˆHõ‰‡ùTs;ìhÕÞ>_$ÙF’Å&Y|ìjÁ¦¥#éJÉÈiÔ3ì[èþãÔƒ­Ÿë—ëœ'Vÿ~ Ü‘új[4„h°­š~|Pj}ï•åKQù'û¾EhŸßË&Ö‹=þ0Èôù©˜_Ù“µ®§ß¹ªª|ˆÃ'¾ôíÿ` Ò¸ÍY{rEd©Ür qJmÄ¡k±íÍ•Ò$ç¤%Hþ¼r<‰zœù—+_ÌÖìºÆÌæ ŒÖÖìÀ޳¿þîLUTæ¡ph:F†ïú `¯]cÜ:±?ò“¿é/L0ØvæÖ›ö×xÆãD;E‘’wõº¢Ê6µíÏÓû™\¬¿æš¯¾;4ƒg¾ç>~̯h›Ö랢*ù]®úo·vWlÆ?ùá·}sùõw,ûÖA*ç-VÖŸxò þog|yžRh æ†2b¬yPEQf€L5¦¾F ýÿ½Ì»üDpý\ “Ä"ÝÙ†|w&Ü>t“ÄYÑ|‡û¸1í "•SvFb¼‰š±˜˜>>pOXðt‰$åᆱÙ‚6PpS—²Ñ4YœUkjxe³µ}@•Bk÷î8n²ã, ÜT²(¾\¶œ¦†³ˆ§²r²xÛÜ}t~p¥&¥ÉS‚fûÿ³Žëìs ûöÿ:]|žfŸŸo‹?@óœ«ÎAC”Æ0I ¯³°ß:È xŒ¨,ÜSË@ éX°0±]TÌZÑUêYZœ§ |©VaïiÈŒüðv&?g7üy9#GrjJ£ àhÌÁï9\èƒÊË‹ÍJ2âù¶‰”ä˜iúwq|蟹¬›9ÝÊcûéàQÆq.µpdî/ÈåÈE/}©þ0O¾ÌVq"vçg(9ÝnVV{üQæ6`œO>óÍ­Ë&YÌ@îsþj}§~°éÓ׿KlJ]U$Kuj½ˆW²%Ö.¤—õeÑÛÿý±T’ôߢŒÙ"zóþ.¿OÍäraF!Ò»øÕr& €‹° O\"­˜r½¯å+šjRÝRH±ÊªËrš×!JYѾ°P–‹BÚVàP²#žZÄ¡¤€p2«Hy¬j(W,²ün‘°±¦b:ƯÅþ<1aºuë—­<áB 3$·°Ÿ©W*UåòL™k­ŠÂyµMàpIQX+UrM ‡šÅTT adbe<-tEf9ÜÔr=‘ó¯áÿz…&¨°üaż#|ÿL¸÷û§^¨öükI%«kQäÅúɉ§Éa£¶¨…EEd ¥¨‹ÅÈ``W'Ýö ÜV‰² Õ†©$«EŒmÈF ˆÏ ®U~$8ì|·r>«‰Øû|MEzøÙЧ±|w×jg–•¢íeÔséýŽØI‡4ÓŠÒßÅ—p1k‰m;´Smñê Þwç•ìF9רJ’F»RÔèšRÄîïkÞ‹Þh9W”‘Ü|7ï‹TþE%ü½<ùJ?Š6¾ûW›2?ß_‡|™ëé3‘ƒz:~l­oFzZ™—qyÔ;."$8³dKŸJ¡ ¢Ÿ†@šËÕ΀õIŸ@jz¹\©= Ð#ê}²¶rzed±÷SSù¤þGý¼Ÿ§3\_n`à+ø¶£Ñvv˜Qª¥Õ|ó%™Úm[—¾³Wc_“vŒx8[7ÿ-%„âîÔ›£Ð<øÛ žBÞøKí^³ù’hß?kÙn¥W?¥o"ïò¹ƒhd&ªxh ˜JJovI¦½EH@g/©b@Ä'‡š¬à“‰œ Í’)W²'(µ‚é!3JÈî±.XöI~öÅ—˜K\ˆCþ> @ßt¨³ÕÐåJêj2ÏT©àš‰yHfî¿]ß|¥µ6¦‡b:Iæ.z†úg¨n\›Ó÷¾âÕTuM,¡ÙtL—r*«&+‚ÊFÙò¼¿.Â1x9eÓ‹0@„Ã$ ÝýÎ?!ÊÂ@û£äcãbwD¿“'yfä »¿yÝ<;ꉣN’úø^E<€ÀõgR)`"Šk¾–­$@OggS@;&=§t‹ùÿÀÿ¸ÿÄÿ¿ÿ±ÿœÿ›ÿ¡ÿ—ÿ^¬­1µ ôr·BVrêˆî™¹Šœ¨mEÇø pàaŽmVm;g-(–jµ’@Úá/äcj6羚Ñ`îN­Móòj&»,pùh"—Ìbá.ÅTûŽ}¶Õ`üÇ?Ý•0«oûvtž´{W…wzçöžÜ2Dzé¯4æ­Í>S \ Ùu„Îz ”ÐYŒ„Æž€Ì;¦†®’LgLnxt×Ì®LdsÝÜ6»@KIEjµ– ¥K‹l[Ì3ÿŽýcþªªS×ÛÓ©éø«kå Tgöd-R¥§‹ºÌpfÄ© —š=9+õŽÍù]~7ùÿ'·fÛ|t÷bÇ]ó9[[°½¯ªš*tªJ’tïIvö¾¨H 6»Òû½wç³3{¨¨& èh¢÷ËßÞ·7ïÓ3Ùݸeä¬üèw†èb>æõSIb$)ʪfzXᢠÌÚSðùqÆAäæšþßO .HùÐ!uº“’ü¹æµaIƒÐ0¡›– Jå܈¡™ ($±0¦ÿXuùqĺë•éˆWÀ€ßç0Çþ AcÜb.0¬žËºG(!)*¼\®\0îðLyß×Êá<ÀW€£-Ð5€|I[­_‡÷¡Ê®†I\@_&îº~Òëé2øeÀmoâÓƒˆ^/—ì1¾'^°„Ô¾€ÏTëTwòÅk”ÉY®H2ó½Ý‡§n5¦kÂ&{IÏa¿ª›jé@ö7+’“w(Y²9áÀèÕ5)µj %T¶ ín"?#¬m—†A[\óZZ«_¾½‡ñæÃ­Y<ÙÇÊ4ÔïŒf¦87{®·`Û=;ìµEž!Vé›å⼈œ³ÃNÝòq™ Cã9ä:²µâl&«6µeá0d`8ˆ”¯y%h’3—ÚïMϺ2r•C^cŠclĬS!½})ÑÓ²p‘dbF¯úú0ý9‘Ь·nš›lw½q[ÍøÝnNÓ 4é'÷76Ç×ßÕÞôÉ–˜î½m•$uÌ¿™ì ÀÕ‡J:XÓää×Df2± Èžž!»|ù¹Çãî ¿YòÍÁô Çó“@©>>táìl!nø¹my½ì÷ä~SþÚe§!zkÆÔåvåpqBûô¶S]l«ƒIˆ¤y}©3br¹ £Êg·æ=fÄ«ðX´6rëÀª ,âíMf—tjcàF‚n¡ŸÒNT ñ €#2`ü 0èÈ/M¾Ô°‘G8+¿ª«²ƒh2T8>û5~ 1AИÝЂ7YüžýƈÙ9ßTàhúÒ$Èg~fÆ»Å=ılRÑ E­°‘\$äŒÚèÓIK}ßËÓ²ÐÍï=Jómj4O,;ëb¾ת@·þ˜p<6×Wœn(žÎsðìöFNH_d=ïõò†¶_§'þècµ¦»¢Xæwp.ñç‡×x¬•I³¹Z (-Ó€®Å®;‰“Ž€ž%V!ß]_‘2Ó²ÏË“ä¬ëi&ñkš©ß]WïD1»ˆ•qéh÷ü$²¶•Äô¨rrfòÏ“œ2-G\ÖU<\¤›…z;Ó§žK4šA«°çx©,T I³³3ëe‘¿À½Tµs^}¹½ƒA”ô¿ ÐjrÄŒ)€l†¬©§h†ëd]9Ð Cí¨Qg| ¤©Á¦°ëŠÑhJ{71à¬iÌ]yœµÑÇvŒ<•XÍ §÷:g `z•…lñZýÇS%^Z4e ’„ "®`„ÆfU @¶b'@Gð•mlÃ… Æh!$FQ@yÛ@±Bsã8¾ dX~ vñ2ù< ìvSþÔÐØŽeŽ4aÐëL%0Å!‚€Ýã¨g"r´oî4c‹€/š Ü]@@,º¤3¢Gn¦k•›*ª­=Ù‰M:»3€Ä÷[#¢Ÿì)€Ì œ®8â-ŸçÛs>Ìï“dCϰýdcÕ&{²zPZ>°Mê\ hòsð¨­l( …à Ë²êP¬øã£ÞûÛ=©S2¾Xo2X] y49 pø|8¦@ÀœcÆ—fMï8' ·íD ²a¦.-%ad‘ç°ÞvÀ™€}~À1Žªç¿?9Á61às¬š]µÿíf©›[Kìñhও<î¥@k»|h&_Î×óÉ{÷rµ§þ'^üΚ=Vyv3P”Ysà…©bMÙb²òñ f·Òx>þ™!Š7àÐøu9b@ezkfŠcnÇÖ“BlñÆq¦ä ùÙ¼ y±d@)AVâ\ ”îJdÏ{Â=§†ê$ÉÙñ콯ež= Á¥ž8|‰¨ þ”§-u‰ð´(u€x#çhƒ¼Í!vvg7€ kÏXD`* w?Ýé¤BÈ*(û³¯ PÊ«AG 9QôÏ4ÍÝÀ8!9Í[„Dþ´kZ> ‚ÈH Ù¿¿¤{¦jŠŒn<°oéáÓ@ó¸ðë&B޳ª4Iáœ9`AqpD¼Ð V" Ð$ŽÈxp ü8^ë-þéE™’=Ãûúuî™ÁS\ÿ_žGI3SÌ-K.üEŒv¡ÙÒÔ\bŠÀÞÄœW [ö½Ö¼Þ†}¼m§î;€ì=~wßx¹{˜\,)ñ®‹JöäìÉØ(P6ßжiÎxYÝ®¤ZÜö$ŸÞ‹ŠUjWƒ}îüc´¶x—ù/K¹_¹Úåð‹µ©„ ·1çâkÅßÑu^(Ks‘Cõ,’°ù£ë˜˜¯;-Ož?TM”߇0±TL £G¤÷òýz¿æMÜÎÖØøa ï4Ô$÷ô¼ðÁˆÅQ=%îEõ{u’@âÐ|»“hS¾¬ûÒIèÚ]ä}3IÓ ¢²è‰5 tWUg3=Ó)ô¡²dΞˆýiÜÛÆIV#'ê-øug>Ý6à@¨N›øRßdÅ~Lß÷?ºüP ÓBŒY'læ±±‰Á)Dª† °d77€ÉþLU€ÊæãÉ2 ðáO ÞêÕâ+Cj‘kªWÐgrMZÜ?€¿üÓóååZ‘øàú˜ó i6×i>Ö®U!h*X€å’€÷ù6¶a½jHÕîÚl-x9‘ ÑL.šÇP^þo°‚÷P`í°5NŽÔLj=à‹³»OÍì()xϯÇÞYlÈ}ùù$¸ËÅ d=ÍÌ 9 ²)I²Þ=M 5Å:uîúÞÃNÓ3©.T÷ùÚ™3%[+y{Ì¡Þi%„ô]òb9µÕ9,ÍhßáïGä3Pd§ö49¾Ö2@ÈÅKíDì™Ýáœ,ÞrEÿ¹bà0p‚P5OggSÀa&>›B°…ÿ}LJ_a^ÿØÿ¬ÿ½ÿ­ÿÂÿÀÿÀÿË£"-Òy¤(1Œоø~¸wõ`úÛ3—&pq»€òÀ¬U9UØsM¹¼‚ŽÑÌût1“)=pÙ¾ù¤ ŒcZL‹*²©é(]¨ 9 ûÏÀ|ç9ïÒ0ËÁ‘4ض"’Z¾Ã ¨€L7<Ü Lž_‡4Àð ðvê¥î™$l©áT+ÄÀŠK¦áøø`1ÁÕèù躋m¨IÉ$MKë|¨»wŽlâ9ñ@C´T<üq—•õË6 ±)3ßz3qÛú¶/vøÅí—)Ñíß7rUš^*¹¢ÍÝ…Þ«.]v–¨Öj¥µ™V?~~ÔÝB›gz#lߘòô2ŒdÒ›ƒJÚâ–ïѦ†w8î0ËЦڕd˜ƒ+hdu7½Nä–*sŒèJ½ñ¥¯@A÷·N&ÔdÉYxI¸>‘7/ÃöÀK3æ]7À¤£ŽýѬ'k*Ë&æx®¾û7azxáPdSÙ†a"Þ5pBç_O‰ªÃ…ðóRëØöô¯sÒ`ÚÀ,E1ß½¨£•ÄÕñ”®îša.uu73cx†< »"|žèð“p¨‰Dg Ô”SПÆ¨ÖËÃ+xÀ¨€oÈN),a± ( lã/œ´‚ч ?»8ÕëÖ-õlëÿH© ¬$€åºÃ Ìÿ_ó´Á7Ž;N5Ö“?gáfoü—fiy¸•ÇåÕý±‚#\j´v©w#™?ø˜O®çHqÏ ânŽõõbï.JQ @\Q{»}Â)_ý’Õ›ùÝÛ©'ãâãÈOVçÔªS»(ÑhöªbƒÄ~ÙÅ`Á}j©›çc'ŒB±AóZžu ILÎ{ÄÒ6èvõ¡kúTo>ˆÝ’l^÷;æ# }(3Ë”r¦m)sÐÎ=DѬ©*t§'£@®Øëj=ÜŸ?~Døú™âœV© ´Û~ ¼©;Js¡„”iŽºqBÀÓ¯1Ÿùô´õ Û›³†Ä¿8ü÷K&ßIӃϬRÉO™§^¬>žïŠSQwÆÖZ±êdO‹{]²"eJ,ˆ¾*BKø5ÔbAS˜JÒm« žÉN îØæ Ž¤ãg·ìœô—ŽzçõZ©Eʽ® ×ï¾84q%¥Xcå;ê¤X×ä¬^£2]wÏë^ß+’°‰ä+RýÄý¥zÒÞIÆú¹%Úä.tËKÛ88"ÈÝ€¯PEgçl4󭵿ªÊ†9à±4‰ˆù‡¹ºBžuðMJ¡ ½r]ùˆšÎˆNèé…+›nùñ—¼ˆ+Ðñ>žîìMcåïHž×>ã‰Õr3ª1zÏi¬n^B:KsYò‚C»¥Q]ÓÍÕI¦˜òòÿRó Š×´I&’²1áŒçuvè‘$rñ8ÅCD‰îîTCL°ä¾÷œ §lÔ™tRUŠNXG¯9äÇÇ't ’ØÈø÷õw¢ÛÉ[4t& “v7,­«IŠfjg£ÿÚ:¯veæôàçõþ­ÁXS“•œÁüŒ“xŸ´²÷˜ý 3¦§þ;|DG 3ÉEç›z?8d€aç[3=M_Ô•ÓCÌ:SU¯PJ•Ö­êéÁS J×5«–Wvn JyjKwLò1¦>¾¿òô<µÈ_émz²Ô¼ $Ród€N[+ ' nŠC™e™6P$"â(ƒ¢/ »°“´t¢(´¤pâRCnP2NÈà2ätö ç`é8[¡V4· ¤·ÒÙëDË'dõÙQ PMOÜ+æcéc(ó‰¬vU%…I¤>&:IqÒÔª;›œªÌ°çºC6±6ð¯žcºvíšéž!  ]k†úŸÿÙÊÊΕ8 Ìqïî-û:.HHÜPsêÏÉš ýä¯.†™.а%‘ÛUö±U¿ìʨéq2TBqD©»èÉóö{\t6CÆY »«òÞdžª4v]gOO[€¯1é DšpSB~)ÿ²d³‘TÆ ˆ\@GŽ@lq'€a°¦_#+ƒüVxv7OáV[_©ðŽ ÓfF&†‰ZþºõnŸƒ^»^̳„ZAû#ÜDûøí×l~žÅ¦1|XàN°ð1¨Àžç~ÌncíðF P‡’àµäv é ­æîó’ïo5<Ô'‹”ñäÎ÷ E«ÐÃt6÷&œ£;· 4ÿ)¡2 QÅý·6W4rˆu»X¢)ö¯ÑR‡Gx^;@³Ýn*‚Ä>ð:ÓbHÿ¨åbá ¨«!gâ(AxR’Éa`AWž… ÔÙ¨JQÎâ"š£¢[Ì]ɘi< Ç©ÃVé‚¢fª`íQ]‚á´fÜ €E…‰3ê%…‘'‰Ü::HŽ««fh*󙞼³Iš¼Ð=µ™6ŽšÙøFåyHÌ—d¨òâ}2·¾;y:ŠÐŒÊý²ÝäÝŸ²‘¦ I=Ö,׾ή¢(Þ.RYãÉÈÊ•¨IÈÄ ‡¥··ç.;«©å¯Üj¨ñ ٠˧1L’à3fÐîKØ m@ÈeÁ·5o«ŠXóYíI“šúªn”5jukr{‘Ä&@,„NUd¢Cc>ÛuîœËZF ÄävkÚ“³Àà+ÀÝ€}Ÿ—ÚzbÁ–µsŒÎE f/z€ÜüÜDZ”´Ú²¯í×@N&ôg3õ@Ô…aÜÄ‘3¤ d(¥¯ãZ3%ȱ‚ÛB—=pcžÏjbGßýàE%îäÖ½.©òÐWX‘•ÛicFñ‰ cåê]kžj±¾6ªTàm9ÏÚW¬U&ÇÞJûS·8Mè6žpµóðõ¤€ƒYL«4`4ª¨:ŠÆËô°á.½µT¥jÒHW[Gª™1ÓóÎy>•NF³3]. £AÁB$&Ò¥Ð5AmK=“™”!ßöC’X_b¤ÉÜmÅ<ÃJ‘Š“|Lyøa‚‰³e’H2h G‚(:RˆEWÖýý„íÜ“Yšb‰²÷üƒKôPÃTì|sªzWÍYŸ—¼ö!‰ªÕ¦Mb¦|nóœXæ [oä0Ü;‰ÁȈÒ+1ˆ@LŒ¤gtƒˆÈŽ%á XôÇ@ X±$€\‘ ˆ @àÒ`þ8³dÔ‹!ð^Ûuò–X…˜å&z-ðÓÆ_î:¢¾L‚;p ΄}[o €M3Ÿy>¶1çD櫹 €+i`LXö~bç¨ø%‚œmºÕ´Y(H‘iÛÞ*÷)€®ë Ž>å44”â*­7¶{‘!Áç’Û"…6SÉõªPç/:7§¤\`,]í§ç=‘d‡=/”«K uGIîxêγˆó~²²€9ó_µ§ììá^ðÄÓ¬ü(¼º%–Îè·ëš`³L1ìÖ=3=ݬ Ð ùˆéún${ hTû2œr@€&E°ÜŸ  „nCìÃäè‡é±…LÞ“¯éF DW cèX £ jÈѱNm2fGrª0×/'¶¨2GØâMCí*0€6 ²ô`^{­DX‰Á,ú7æéDކê2v-B˜­sÞb¢ƒé±äÎRYµ™$Û’—î[0!2°è®¦tB´€a½mã–°¢Ë`,€ŒÒ\Ò#6ê\m€¤Þ Y3 ºŽíAˆAÆ€(jÜ@@ €  žÛÍ-ÊD —ÛÍ%).sZ~­iÚ?÷ ¹'`|àm³äõZ/¨Áv‚Äá›|r¼°g[Ì\Ÿ»–  ú“ìø4´Î°=.¬ÀÃÝbÞ0áNJgÉå¤TÂóCÜPˆ! $S¡ €³V@bKD°sÐ| €Ö``~Ûmò‘ ŒÞÝn×H&H†7ž>šcš~|±ôËÚß2Àß¾¯·6åù5@¤!qÓ$èæç–2Å•¤"Ü1$—Fšè‚§Z›ïµóiWûŒ9ŠÀ+à¾ýDaÿ`WÖr‰”P Pºm¿ŸÌ¹-Τ?ë€×ø§;-%P(U›”ŠR—Ž €„ŽºÊÐ Õ•â) ô;”FP(™à•áUɱL ÃQßvó 9Už_ý÷J¶Ï?³Åé#ÑH'´à®k¡tϨ{Ãc€ ¾ØH‰BDFïÍt¸f9šmu‹@ˆyÍ_!À ùX„ T.èмÅê)¾Ú×¶RxÍ…=î¹yÙuÂ-*k?EŸÒ%ºÞЋ`–þZ´§!3šäüj=×í{:znzc Á+4ÐCä\}H²ñ3^£läD¾Û9"=„ڠ㢠2! =ga¢D§5h,°^Üd÷N¤F¿Cë36›¡‚€d¶Ïˆˆ(‘A¨CHCÖ4°@’$*äÉšAeRWuA8EFI=Bš)@Å× ®5ÈD‚L'I€Àåº @­Òõ… Èj¯ ³  ;Π׾2 b`+¢ˆ  +¤zx}I]cX¼†‡ˆ_1ŠÞëã;ÚM1ÀW‹MþjÀáÐ.´7Ãwò+ÀŸÂì'Ülî4ü °!¿@€¶#÷ŽÄ•A¢7mÁ©ÚûK!Î{äZm­$ƒ‚› ’|ÖwCF*K¡¥¾º9{@5ê×°œè @¦—>µe‹ÏEùÞˆpŒL@Q:Ô„‘#7mи0„µq¨̦ZBL÷¸hõÛá÷ÞÞ5].>nSÁ£;TŸ$5ˆ5;Ksi‡W—¢_²åWn™o ¹ýÿýÑ¡¥G9Äœ­6¢YþQ¾p`2<eu_Ѐǹ3Œ¡ =Êä€-?öµÿIä0Ð1O† M|GÅ Ðk ŠV¦:iš&à¨}* dÛ”.m£É84t/k Ld@êŒ cˆ `åºXP\¥ @è(À@9FFÄ€Xã`@\èÀð†¶@€pÀ Uy À°ÉX´"àxy>ë-îfP0±[/î‘4&(ÁÀ±sk4qõf_Þ'¸˜-Ü?äÛ¸$0’}®cl³Â³t]p‘0ò%xÿØSíQòÏss yùèÆ 9„Zž{'ZþÆé8m(!cæn®q’ Jßå·ÆJ¨ôh §s‡,÷ˆ¿Ç” hwÙ9bø|™Oê[Ýš=œ“`Ë"°¢+pæ­¾š å•?Ðp0;·ÌMÆ -ÃòVI˜=RaªkÜt“ä&ÍŒÃuèçÐf¢±ÙF²¡'ÙWû„ä̼b§—nb½’É@µ ½cQ4Í(k…»8¸w›ö1¢à™O,€`²u·40 hWã°q}mU¡(`°ˆ¡ã±K‘b¦)œ6€^ʈ҆Pµ£¤ˆÓãA/º"®T²pÚ¡èÒD”YêÖ­ °Z»J±ªÖ8Â$ÔÀ†Hši½™RD  ¸¢"RÚXÕ­[ÆDQ `€v•RØy0Û(€" ŒmÐmŠ$6ÛÕúô€ 2­XF·€ápôdä‹»×ËlW7éK€cLŸÍNÑå^\ÍFJ @T0#’uº™ ㊨ž–÷Å—ÖÛ7ïO7KV‚”(œK‹¸IífáÛ|zÓ2=}GQäz÷ó^¸â“:÷âÅ|–s†=f‹xúÄŽ£¡),o×Dˆít&‡8Zc€è½¥ê1Ž¥bÜ„}…s™ ‚=“ç§±.²1¼è°Ž©ŒÔ” @oL·åúÍŒÕ%•fš!bš2hÎËÁщÝ"à·Æb p ^Ç\Cú ÑPQÌ¥@»B‘@œ3V&!¬›ÒÙ ÍÌú¶;Cx@­½p”"ÝÕ¤$i"ôOBgªÍŒ‹ˆžBSg˜q©I‡34LËA«KA@XµÖ¾¬¤ ·I½m @E%£¨*@ˆ-d'FŠb Á®”¥­’Q¢W습Z•T‚€€èFña]ÀØÚ¬(@B ä†Á ¡·´ßöfÁ ¤.&,A›’pb+ˆÔ;òÂI}ÿ,Èd?{Rïa/vFƒ1c34„È(U3·×€ìv‘Aðúvòzw OdUý¦lŽ'¦)2þx³2\`³ÉßìF´†” -…ÖkqS„®PAQ-ŽÐB ŒYHH,„DvíÄ‚©½Ÿ–_8í©VÛ<Ȫœ¤Õ(sJÀeð°[ìè ¡©Ì_åîyîX1RÅ[p:޳6A´ :c×Ó+ú—<ôrÕI”`}µØnz±ä4 Â§q~O}<Ï36e2þôÅLäÉÒÎr|ub/Þˆ»es[òP¤Â€bÁ+Ú+ ˆ “šd´†ÃiØ%pàãn¹ìfG–ӄ󾵈p àΛûwT9ÓB¹âö˼[Ÿå­ãí»üJÛñ«SQ«{õPÅ˺f=-¤½^E#apÕDQ±Y–%ý‚ÌJe’Æ €“·B‘f_*0¼ÏºVFs>´U²fm×õDUäúzyªyTm`”<”¹ÖE¨H¬+¨ëK•ÊâEu #þ“Q©<6^7ãçxÑÅûŽmáØX ÌbEg^zNœôZÕŒ}@K~è•ø‘Ã!AI‡[>zx€s­ÑêôªÈ( ¦"Šˆ¬ÕÚÙõæ}ÅVe’6ƒbµwYY”^lüDJÔw¿±ˆHüžQ~€–SSjò0”Z©ˆm@QÎê3‡—ºHfhý:"’ï,óØ/·e^¹ë…Çþgñ9³bLŸÎwôçq¬bº¢Ú^Ûî­l"”–¨Š˜Š…t-×84r«¡!D´R½ÆåÐj­šµ‘aRarO½U¬çSÄf!`滉î:.±(çb­– 3|³\μÿNÙZÞøŸûÉ*ùë²šŠ’ØugĽT \µ,ÂƱ<Ñ”ßÇ1ŠÀÚ‰ T ªEªBÿ(Vå4¤h€N2ÿà*¢«3 Ö1ó|m¬µ¶nƒRIAùiÁȱ0bVr¸öv†3¤õ÷›Ç<-ÊXßÿ»²KÖéikçÞ[éVÏ]/X¿¢ýoc’¦¬ü޹=L÷t‘¾ßweÃP^N­ÆÛÌó‘TL9WÈÊ*:ôÛSÓQ;«"ïd—ž¬ÈÁÀ²^ÓѾ"Û>B'6œR»IÐ2ë³§­”8[ÏDQe¬9œ£8‡§Jç)i”H!út±,ï¢&íÒ®²*'ðIÊÐùÜÁÖôT›,DÖìyege½Ø=Íä 5˜Tâ*|"º¹Šêb–*v9S¤²¿VM .¬»p,T×jx IV‚EWÆ w0“Tî˜aШúáÁ}~ôÏKœ’š†w« »Â;ß{gû,«•¨ÔÝ%„®¯]†•5&>õ˜»6±Ëh÷È”8¡èâDû¢•…‚ƒm¨¥Jùªq–’U1õÍô ™2Û³CÓM,½wJ™]ÆhpBZÍ@hgœ5dç˨˜èÉ\œÂ ªZ dU jßSšY°Ó^:»Ìì ÊÊEO TUC¬?#û¡{feŸÓ‡F4¢Ú—aŸuvIœÃ4³ (Í!ÞæE€Ø ƒÅ ±(T$Sú7T2k˜³Eˆ ¤`B&P¯1¨²®½"`c1ˆÆb ˆk „’0@0¶ÆÖ(8^‚ ¨H‚IÀº‘¶Aò ˜ÙBC¢¬(€muPÐà£Ý!±o0Þ#€Ö„žZ¥¤‡ ôb¯EFI4ˆÃg,”eë2cÔ½ÈÉù<]%ñ‘¹¶výGÓœƒâZO‡£O±]‘Àv›.¬y~ÙŒ…hœµæôèLÑ)$ðÍï£IQüªy;òCø5Dùë•&ñvIÅ|ª®Ñ”zéW‹UÙ—÷üw÷ÞÛ*_§½aS¶ÑŸñx´Y²Q‚º(Hzë›ï2ðÙ;m=Û <­f[[)°2|ð‚Ô%&^‰›sG H†"F¯&(%pö\«Q(h TíP§SÐX´ºUrâÞ­Ô’¸ÈêÔ†hèˆ>'vÈèÊ0•Ï ƒDÆ `4Mj $7 «¿nïAçÖk&&N1447à°´É̔͑lÇqèõèŠNµ´„èE¸í)í4Д”W»:ú §³[øšJpM3´ SOHÑÐ+ÓÝ®(DOÓ6ÔċЭL(µ¢Z”‚z*ë›1]rÊq4ÐEO*ú°×Z` @1ŽAli¥¢@¡lP0¸ P`5`‡  0ä#™²ŒUT €­[Â2jlê¬0ªèU€È°F«˜ÂX1@…V>šùgmˆ÷§€‚AcŸÂU·žIEd:"‘Ñ1ÈÄh_­¸‹Ì¨dô¤uB>ö~º‹òÇã~ôéû© ¨3Òv÷ÀìpÚncÐà Xµ O12nH.Àîþ29 g ­»?ƒ¡)›#Þ˜Ü9õ¸æòë9þ\’àØðÚÐ <+íÛ¬Ï÷ÐÖO„¯›1)…Œ•œµÀ'$ô;¥}®;üªL[ ãe¸Æ¤9 9“:NœIÔ†œ­г\¯!ë§ž­ì}Î@d(¡+Ä ²€ÜßhqŒ°ÃàªçdÈ« €Y§ªÈý?ÞxÁg5Ô!þ¯Ù˜LÑ£=ßÝ>퀭;]¶·²^ííšH²5úˆœ(zKR½æ\Se@TgÑÚ1¹<,ï¨ R¸|ŸVîÚl:0ÈAÇù]d£™·,¥€ÉE+Tƒ¸l’€Z3ffêéÈÈ ź"€€D†a=cÜù(‡Léj1!¶a(9«*h" }H€òP0†¬e È(¤%C¦uœ4²¬ibªv ˆØbŒ¢A •*°°l–•† ‹ˆuà ÀÞšªˆ¢*ˆˆVD¬Ê=CA@"Áp‹~rKꢠF¯C00¹}ø¾IEJK8Ñ*ÈTøO¯ÅDu’é<ÿ?€#Ùû•d´Á{=ztXÌø}ßÅâd‚×Ñ–“3àäµp£Oìûé=ÛâÖC¦«Ïlà ÷\ à^2Ñëïþ2Ds[wùÜr±T4I€d¹óÛ°ÃlÛf#æ‡*u‡èn¦æ˜])Áaq6(RõN˜~tïþ{Šöï‡qX;GrŽƒœàâ3Õ'¼VÎÊ÷´åñOÓš¸~uÞï!¡+`$†Âe“ OÁ›Ý¿¶,Àû’@@g†©¹@HwÍñ‹ m#€ÜzÔ%ÊÐ=ºoO‚Ï>ïM¥·HZGQ®J  €¨®Ô×,Ⱥôc.VOÊO8í{™Ív<À°Xwµ"j¹ŠU‚ZûIºÎY…ad@ˆ VÖµE D畨p6«Ð`V•U¢ i$ï1£Ä ¼˜nÍ"@Ó¸ ÓBа¶YcŽ€ šE+j‚N# „0ŒÍ3Kª8RY·’x¨™±¢ .d¯XTQ@°·AÑS`4 Ó€P*Ö¨kEÀÈ `³*`Ñ btXƒ¢ö™°îXB­@`^ ›€H^9%ÔGiYd~¢/”Ê8¡Â¨ºFæ+õÿ|ø¼ƒ©ðè:8Zîô¾ù À¸ÙÀnër~¸ð^©­vp¨$Ø“Íçë¼` $Žö9ÇtIì/äÅ:Aq0?=°è9t¼ÏxÍ”õ{VÆâ Åê?çøy(€,ñÆo-óÉ"1äQó|ö³{\üDíóõ”•DÕ™‹º!{€[;dÐ(Òxø¹äRªÆÑÞ¹_K>ð|¤~0»dBñ€73T ›HÃPT©€‰Å°º‘0d!= ÑD‚žÿÈß{¿—ëžãú'ã›Ðð… y¨îèž¡ÞQ$Ì¿fÌ5ÀAÕ ðü 4€GW¨åhAµÆ&v€q6F§¯Ž2mª ¼ ÏpÛº[;  @+4Îå‡ËsØT™j/Mà²f<£°¼SeãÊžt”ç 4(…èËPr%Ôå“BÀˆP ØgŒÍ(q{l¾Ý,$í!¥Tm €E€™3À¤F2ÙF(u) A'®‚‚U b‹F kÀ @SÑÀ(]% ÀD¼È~EdãĨŒ$ ÷Ø~J!ˆ1ÎÌ…‘È«äsO’ÑûDzþþVøÐO– À{tQ¶‡©g$á>@ö’ 2Lî89€¦.L/9•€7€7$`~'C L¿`\ØxËfÊÙLÀ¿ôµmÖŽÓ]ºÆ5‰ x°Vxm}7 ¨Ì:ØlwÎ îz ¾î$ÑE€@á`Ð’ËÆõa™ iEú3c…Xœ;à|Ι@x O±@j6‚”/Ûu3-Ç ½UÅ㱚Ë$gŸìÉÿ4FmA­Î¨°iGµÖ` Xœ‘ ÀÓHƒô üŠ­z€õ=âw´NóœÂ•›Te)ÃÁ¦Çç3áCãµ üe5‹@㥬ïÐ@¡0ä Ø­ùi!ëk P!m¢Ö%ÁÁl€ïìÀÀ÷[³,õ8tl‹ Š`€EAÛÙ¦‚Mvòw­ÎFºªe 1À, ’yÉC€c ¶b€hj™ÉšˆÁ QÊl—Mš`Í@ Km ¥1 PÂ-]QÀÖ"€5ð0Šn€¯8€~%­We6 ý2¥„RZ—b™‹p 4Á.Ã@¬¼¿ÿÔã¾ß]=ìÈÇÑ_ pôÿ€ÏÀUp¡GxœêG»g`Üz°S¡… ?ܪ@ö¸S°ù‹¢Xv' gÌ!ât`ÇLªcÓe­ ±ð/ óÛ·2a͵µëŽ[„ÃîuÏb…èÀÜ›9víYõ(mùwV9ŒŸE]c ’0üð.BF ©º9ZŸ¡­+"u‰ êœãÛÁßøøÆh2`>”l¼Ç¬Z‹úÔ­žO”@(Øs¾2*¥„(òÁ¬³A¢ÒTPÓÒð\¸J@À3 X¾íѱ +(K뛤€#RQz6hJ^¥GöeÔºl¯¹S)ÛR v‡po‹UjÑC9¡£ZoPÇÆ0 "ú‡$D*v\™2Ÿ&&  9"牶aOX(ëE@P8€ ¬X}Å/¥ ÐkÀ¶Q-€ÅX£°@ Bð€¦ÆP脤jK€¸5Ú")%øk“ ‘@/§@)Q“Ü‹x"¢ýü¸~“)fÔCxœ7Ó˜»@/K^×yh•ê?.´×îIpæb‘—i‘]ŽÚòmKL8ù™ñìdò [ÁÖp €žÝAZn>K;(ê—5r(ûÄ€N(œ¼rc¼@zàæˆBÑsï øT!+„¡öêüg(Ú-‰ÐŒ²‡ 8Zâ?¾S@zËx… ðPçÀŠ’¹têéöMÉ< €rïs@¢aƒž´¦âÆ7¾°³SÀÜ4Uä³»NË—ß»Gœùí¦õäß­quWº Ä·náùÿšFö…œcé§#ô iHEV~Ô~šJÁYÜùzSAæRÇj.4 Ôȹ‚o²0cV€R™Öït|,qº˜¥#»À5 |L±(D¨u„xÁ±þ±t5€&™• €ø);)¤[@ÁÊ2óI¡ ª H&wgNˆ#%lj„^3l¥3Tl«ÀJ À…ž/ u†›ð£B¶2è¹s!4¹—FÔt8Óó-ŒƒžHpDi¡ VE!´Né™Ù ÇMÿ±Na²#kh”ùZ1àz I÷³e†¤å«†ŽþÑþ3Ã5Y}ºYx®Üµ>¨Õ;Æ‹‹šêZ•:5¯b‘·K¬£®5—´­%JLóXÊ"©ôZÑ̦NÒã™moVœaoÉæÈ]|€Vsˆ àeÅxU„¢ѽÏÏóU½gó¯V\úÉ<\¶¦ìÀc-¢Wm¤’y¬ÕæQX‹ÙÜayË!??DO—~¥[W ôjAÐCDˆ27K7p4“Ÿ|r5£Ïåm“ ÌQþ?,Õz)uõS‚jx¦T¥«¦ 2•„k½¾\êœå²pݰäqÏBs0ýö’¢VL9†ÅCIKúú…¾à£ï 4ÖôZ½ˆ&|àe€îðž wâošœ á`]×nk Q[?D­)eR]"[—¦†kbîã‹vZm…Sö½Q’íºþsxÌŒáGrÉ%uWÏ~F>0¿ìä'2ÿos#ŸÚ^>: Uñû§®¼òûSi‰}V 4¼‹yÝ̦|¡Q9 “*T×±7¼¹ X Y3ËÁèïUÞ¡%w͹«3x*APê8W­Cd­ù³ î©f?»”»ò„·ïC°u!‹í:PÝ…iþi¨¯‹ž«ÚAíº¹ªz¦´øø-~–ç+šøÿƒtŒ3’lhÍRÓÏÐ\7_ì@rÉ™ç÷÷àäîþïΙ¢s@õ4P²Uð2IߙŶ˜ÆŒªŒüd“Põ;¡“Îj&ÝÕ‡PTRKu¿Iwc‰6t÷ƒ=„î;‰ê Buc¨ ïÝöµÚ™§#Ó=}ÖL¦Á ñ1¨X´¦á@ÞÚ°[ SHqØu$R"܉è'Ê”Ô^, ÀDq¢üÄ<]aÈïb[éBƒDwÕ2÷+›ì20FZD¸¡þËu¸ƒúÄ ½`­¤B_†Ý;YOs‡ˆY»ÝÊ ¦®|8‘hÙòm£Â­7³àКIJòÁ ɺq;Õýi_Kü<°Oïõ´¼p§U=™,¬|nv…žb¶µ‡™y'ÐtÁ~J´lu|žjR]Š›‹§fq)€R ™âvZ´TCŽWÝá¢äI‹FܤET€&¦}:bkTPyy£%ê·uÓß³miwêûhsDP¨·¬eZÉñÂ3 ¥©ÓàPVj÷>œšÙULŸ‚89C¬CB!ŸF*ÂI%PKš„ÆØJ†D÷:´_mN=³ßE±ÿÖ5ì3®³Ù ÖšÉM·Qz«ÀÈ$—ïȦâ2C±Ÿ¼óе¿Ÿ(îJª!k*yöCÕŽÖôMSEe"ëÇWœ éfüei¢a °Øß¾ge^Õ™Œ h·ì'1½JƒaZb+Ý·¾p.cZŽ~3'hS˜&*zTZˆíh EôúÀ€}¾Ú ÏeZRÕÈò @ŒÊè K1#çcÁäƒJ­êœ) Aþ˲G¨P ƒb¼]­Æ#(?Ìè>Òádnl—­ÞZaGFVþ:2x£ñ—?ÿU“ÅÆ±œ_‡Ùæ¼­p ³úªÒá*%IÑ_ýWk«†AÛy_æ —ëî1žCËí/'¿ÔÙ¢¡}Xùì#ýÊŒS‚×É2¼V È¢Qo¨±‚`5ª €¦œ–ìÞ­PˆIÆ)°½{›¹Ü4œO:À¤\å±ÅB3PÓt@¦þÀï:RQ tY¹cp‡ &¿ß]mjSÀš¢÷S€úz7YqžeòídMc*=š^L£³´kÖÀt5Pg#¿* T%wòpÇåš}˜^7@B)v“6üÿûíRffF^N#d•¡³H‹ÁÿS+f~Ÿ ]=Ùc*¶È=ÿ8DÅ€(&MÕYª®ÆÍ®—·(:€`ºÈž/O7ÑÉø:› Y0$gäÐ ð§ð'ò…°«àväø$*u `ƒIÙ“¯ªëG6ŽôŒTˆ¸Á5h¨ ,-Id„ Fž«õl L»ZÇæ¸0€ûÁqibLL½‹µRéµÖ¿ý*Þ¹kýü~YW;žç*ðT”"Ps™öë s™ Ç"sd¾Þ«±Š\ŠÀóÙðÒÕ²cÚS›LÜûvSbÇ™>ãr³çÅfÝëÒáDí(HV$y]uæ ê4ÑgßÓÒó¾%Ø‘X&®ù@Ö2”êå䀋 d؇¶×ʤ n‹DB‰jQ p¢¦ì[?|7ûVrfÊàô9aÈÃq¨´¨£†6Àö[Ýë2ÃÌN…`þÓï)ÄÅ9,8i&dµK7=àÀîì3Vü‡†À¥ÎŒœèˆÊSOrÕ3^¹ ÈÓÅ=2{çÌ0ç8Lôô,®ßV`fŸX|s*I q˜@R*E kL~»‹"²fÔ{™[©²ÀÝÅÚîOÑu25àVCÇ@‘MÎ~}ÓóA$=\†nàP¨ˆˆ¦D!¿Q~]-ª-ªma¡W6ÀÊ•ÚQPÔg‹ð¥(h Y#Å5^Äbøk± F´Ÿ;_ÙrÖb–@ ËðˆÐƒ¦5Q›õx‰›Pœéƒ§Ÿ)‚¾Ÿÿäo¡O£¯ƒÊŸï£Ýì»W÷ßN®C ºØ÷qÐ_Ç^×íhg…iˆ­xþY¾ÜàºZ¡Bê&ÃÞÈ:üGí2ÇðäºByÈ!çèàC_oã ÈÊ룋:ÖT!‡nþnòöÊ×à˜„ÏŸÝ<íŒØÙšÌŒÞcº€VþüSwhP°m_àãvÃ-c1Û`}"SÂñe&ŒÉ:p~'ß8¸qVÛSìfõÝ]kºÓä4•a“0’Õh=\”MWTàTW"i`rB5ÛæÞ/D<-®Ž±Þ¸ÀhC{]ÿk¤šðrÖ“JˆRxh°pO4I%‘ÚªPà‹Óg Z ¢ (*0[wK ãФ¾ƒœü™m°²)pá̇îk†üÇ?Ÿºîý¹Ñâp†Ñ=çÎ…ÚÕÙصÑÝCÛV1daˆ1²ÒÜ÷gìÀBðX×m @¶‘•Χ1X01à 0˜K !Mk3èû L£‰/ˉ@€¢~ÊÅ`ꢪ¥ä6ÎAàðæ¡ó~í4[NKð䂦íòkØ^ä!|õö‰~&ÉÙŒ.ó1òd% JHÀS`Ž9:™€ý ÄúŸí„½ÐsøN6Ÿ‘M/™D‹¬õÁóŹ4uñÏ­” %‡àUzì¡”ÊAû}• 7¶Æç }æõ¹¸9+ø‘RA^5~Jíc¯q¬Âމæ +ß©Ñ}Ús,ÇßXŬ(ß:q0-Îûÿëû:Þ*tÖ¯l,VˆòŽ+Ðx:rÈÎXþÿ©[€PÕNŸÍšBº’¤RÇQ:ÜO™2’Iš>T"ˆ õ7?5MSºƒ¨ëét” Ó™¢jTˆìÁ-9mPTt¥J̪ÍYç \iªóéM¡ªÎê š¢@fì)‡Œ–àÁp QéN¥+†¬®¬Õ—á“§ p'“2BÃb¨§Ó0;Ûÿû«‚„ÆËûÓ0ë"ÎÌ JjKq¥ICÓg™j‚õ‚@AdÂI°ëSg®‹‚ A,Fàì¢ ŠÈ9€`JRJÓ" g >»uà–‡6H€[lbgËÀŽ4ñõ¡òÕÙšDÌÎóÃò½³Gœ}ÉR'p•à3»3¶fnl-Wï 7Ömtø´øŒ°¡\° E»uéxÙ7KS»ÏŠÝ§Úqp†t?¿üÙÎÚ³îgnëûŸ¦{héȾ~w»%@ëNMÕ-OÐcƒþ—XÎT’ð (~? dª Ͷ+%— CÍ 0ED§ë+š´hz÷ó³«ÏÁE0­[äƒ4s²<ž'XZd†j –꤉úWÛÄ´z‘||÷;Ó¡bÏX¾n­ÞY ÏÜu|Û³9OöÖŽM Æ{åÛºÉýÂLU¸d2¡¢éЦ"rèL+“õLÍ&÷ÇK®ýä ²‚Ì tÍcáMÀ¤€Œ5hL1íùÙǻԃr:€ÉrÀ[æu¼]£ËiaH ã#`0@­ 0Ò$’ä;Yg\dW2d¡wtÎ{!ÓÍ’§7D`Uc \ÈàÑ «¡cá²4H Ð#€4X Ö^«õìô³X®:ÑxÇÏÌÉÙë²Ó¦«Žïe™Å_ßÍd¨JpU§YïG`/¶ÛÀû¥Â`Ù)ïF]ñêhdE)d³z›˜ÙëÎF´þÕž˜Ôçg¯ïe õ :>ôÐÅYw×P x÷M> É»s•n¦â#÷Ôô¦~/r`ÑΚÌhféïJqùnrîÛ3Ö9M[JíÜ|Y‹~$šðù¹†¬„¤h›!_ꮽgl@[[W“/ã–s´z©L…©œÉnÍo)xA¤þd87‰Ž“Ó*˜¨  ºI0d•’Ð En (§Í[$L(v'90Ó”{†°„YÏÁÍÀD• Í$á—&É‚#ú˜þâ¨>޲ÌB[Š´ Bº‚È€&”§ €1 É^{MâÁC’AÀêU“·¨]&#xX|ÓE«îÐ/nóþÑe‡Oô5óãÕÿ³ÕBô|½•W ÜÅíÜ 0_ä¿I.ë“qvW@”e”xš‰‚ÓÀ$@´ßYìÊ€žþÌ5ÇŠÑ]åü”ª4߆é-î ®óÞ¶ÆÛ¼~oúãí–H>Ÿ³µÃÑ‘Ão§ç/‹@ð!{²6!8K Jc»˜wð'.˜@Ð ‡†JF™é¨á\6Ò :G\‘>læµiЄÌLCó© ĵöÇõ}?Nb‚äí2tH?ú¿;ˆi³7’‡+ƒ ¯¸C›óa_hLy0=Á±Ñ[OggS@ô&BÔ~¡[•ÿ¡ÿŸNNMLHT^VSNUHUYÿ¯ÿ™ÿšÿœÿœ§v菱@•$†Êù<ñ.*é·^*¦¸“NºR @“+ä’ZÄÔåË8kßb¼¡i¶R—ä>Ë ñQÌd% 0 ª®Ó2[ÙºH’“™"I¦!!à €õ7#Ü{)À@襮»€­kŽçd['ìe€ÈÜ ;$€bÆþ0À†£ þY…ü=ÊAd.¯œò ¾Àó k¤ŒÇ/ÿßC4?€è­‡oö€ó ´lxþœŽ^ÄpøzœH‰1áÆ¶™fU)ÅX(Ü\œ/ëšÏñÆ´Ó-à`'¾@Àï1›ø Eˆ+s‰”€[j‹r2¹­Þ:W¸2Ah†’¶ã§ÑÁ*óå@ îŸ@¾N»¾³žéCº âÛLnZ÷>ÃR(ß—ô2PªnQó%õU§~âÐqJ÷¦2æï榔f˜mèÑ©Äé{6¢^³ ¤! çySŸ:uô‘Ýìì3¹S |gÞÊ¡%ªH PdÙߟÏÏÏc$_|¹…R>‡8t_Å4 *ÊûqÙ!c@Æ{}ûBâfÏ€ÎÀ<ÄñÝsŒ 0m«wDšiAh÷|™‰w÷‡îCÒíq¶ÈÂUmÂU²I ›¦TÏ—@ i»`çDµŽ‡ÂY3Àׇ™`G’à0Y Ÿökº÷È@¨;‚,€bX®ó@´Û(Ù.¥H¬ˆ*8@À(`(à öXåíGX´ªÖ-)DÉðøˆ‡½ÿò©ÿãª`v»œ²{p‰¾=_î'RbìÉ8¹€ÐPc1–DÁ€Ì‹ ÷ýúž3]ØÛÏ]S®õö°æþs&‡¬iÃ6;Ozdº@7²¸ö¾R7™šZÆgùô°×Q2P ¤'¡/ƒtè¼p_Ìáu_kHûòWûé§ÿ¢i¾ÝäÙGìtÛàžh—”¶µ Õ•ê ÀÓ¾bÎf×'`¨ˆÈ£`òÏÖ\æ9 ‚¤oGvéÕê¨A@ÄÐP]ûØN¾?‹¿;ÛW± !€úòç?~ö¥äR~%ö=3ŒÝ4q~Ñõü–=x;¡yó®ª{JTðíDw&ZüÂfú"Ðy[ “qC«:å2ëæÕþÿSÊÛ š·²]ÄÌùäÉÿ@Ž`«rf’)/ºI $9ŸÖ/|âìº[Þ¡a:KD"ð0ÎÂìü'(ð@ ã†«C{•ecVa è‚ä¹ÐpЀNO[d±¶´Vñª ùBÜ-G§èb¿k²øÑw,oLûPŒ=Ël¥… ‚:ƒœXç*ø’ãb¯MßÜVó½OÏZÿÔƒÎ]°Îeä ‰4Ùµpþ”Vùìi?(óã¸ôèΞö¸àà÷®v~8‹TQ”À2ž;ÏW\L|~„lq¬Œ§®`…ÜïÏ^ÜŽÿÉ å”Жk g¨ÒHçA^Ÿ ”N©Íf^Oë/›S©U;<žZ½©Ësò›·×»"Ì`è5Ä›a_$~~ë•q¸’·¾ùÃ7k¹N`GÀ¶[k“Ô“¨ÁŸµLJ=«§Ýüé²8š§RÁa|˜í¢¨›îÝß¼{†´t@ŸîUV\TƒþØ`ü¥2ªÛŸ|ïéf¯Gµ÷¼:ɉ@Ït_ƒOm)‚vèc”Zuw;ÄLIãmh“Þ Œõ’Ä5qo¢Žbua%Iè!ÏÎb¥$=Û‚’KY¬aÿ2¹h‰§•Ü íB›$”—p <þtJ½wûÒ™ï×fhOy:o6”í?¤ µqæ‰/ïóE ‘3®Ÿ¿ùÚÁ“®´u¿ýÓ×ËÍÝÜt}½©Éí­©!V‚B®îCÉ¡a?AŽïŠ”N©‹~YÅé¥ú|R§Ç¨†þÁ©Î4î-N–Š1/¤aÉøË‘ßRÉŽoLsw©“.¹MÑM˜U)ävYYªMy-­ Óq: ¡[®|B!ó´K¤¾ÐÅ7 E³í)X^¸Þ9¯éçç»±(¢ˆÀp]ùZ_ØgÏáËÕòZÈIQÂ{i-¢,„kIXª×FRµhE£8Õ‰E£ccVUýŽB¤Jiæžr¥5ª}j”–v¨GT±¹Úßbš³½#l}#cqÖiäªÆ‹V·*¢(JêÔBÛÊу¢ƒÖÖZ‘V0ÖBü$UÅŒa"‹¬;Ì~éhD*ü)q¥rµ¤ ò¡ Ψ¹ € x¤Ç´ÝdW}T­¨µ¶^)zQ %Ì ”,U1‚5e¾ÕzMÅmÖ9ûañJ •· ÜŠ;7ÕM4ɘ#rA´Þ¸‹]aT9ö‰xÒ±À0#—fÎl­EfiFL³œ*­ã¬¶síç[åšl'MÚ=‚¦V³÷áçÀ]Í4uÉ8™éºèÇ“Õ`aà0…hÑG®BÈֿߥ̺;+¥äµHgú¦I(’d[ÄÅ"D‚£ÂÇR0ƒ‘®o§€ç¢eQj1ÙÅB¬Š‰Êª ç”XŸ‹½ä~Ü-8A“7“ºãmÔB>ÀÌÐ>ÌÚS'¦@ Í}ö¯|ðü¡ëå²G9u;–4÷9ç#¢­Õ\–fÁPìí™K5ŒlnÜóœcÚb4GšÓS¿såQÒ-CSuìízhøú+}ÓîW¹Êˆ°Cô ëç* RÌò$ªÊHPxuSeÇÅ:,Íy´ºÖ*»®®.µÄHc&uuÇß’¥!S’Èô„EúRô¿«àƒÕi+)È—c×Ë €Ü†é¬Ï­nH®EN1- âM&˜ã)Th¢â²´rQfÑ'HaP(z»²«ç@×)ŒÙ3'*1ôÄž*¦É‰¹©}DÄ-Åê8‚%™4 2Iöv*ñuLä¤`Öì9i5Èw>è«…´' f)h˜ª‡éµ1L.ëB5#æ\¡;'Vh·j±€ì‘‘bJ4P "[¬’á!nj–í - {\€þd/Fhi -Mn¤ @T÷º@¡²P˜ ÞË•lO@è”x¹[§ÈðÈ,X­kZ9(é­YìV:åµ¶‡Pè¡·ÿ¥ØÒPbŽ9²vŒ«Ò”’‚FnIo;Ó§ä·$»ûWð·LosP7jÃËýP½­¹¢ÙËM[_Ú˜[£nžý¿ÐÏÜv- Š(vÇÕÇÓŸúÏÏ É0€¨)úuîHÎ &O¼ŠTµR6‰8;@º”ŠÔw{g EÀà`Drvø¿k¥º¸ $µÕ²$Cù+‡<@~ Ù}~õ e£^ Z Ž&-£LRµáÀÀOøO­*jh’Ê‚amJXRöÞúüÛ¤üº-'¹¼g1!ô–}Eи‚Fð×é¬QÄûóõÅäF-*&ò»£nüY—ò C'ÌÍúkâf`–!{†ŒÉPí®ÀÝ“ˆx7T»Yo{x†1 À«ôâ¦K„×b²[X€@†{ 4²Wœ‹p4Êja!@ 9ôµfD‘À–E4¢€*B5G:4«þÛõpÍ$HæÝ®£SÂ("…ï#ĉDñÝ~ý‚ˆ¤Óžßݽå»g<tÈóåáy/F{~ÆÚ¬ÞfVk-JÓn(hx6Z‰e:Ϋ¾±ü'fÔìÞ·N÷íÇò›Ny¹úš {[ÏÍ”Vž¿, ×íǃo ‘còù¹žEyA[È¢pòÍq°ÚÏ @ß;„nËVÙ#§+e±j9ù{W'É)ò0ТíNþÍ¡¥¦'ù S¤&ãh † Æ^.Ê»õ"l?‰&Í •Ówk¯¢ @TEy‹%žê¬Ì€½ñÔ6ãzk³èŒB ü"Ѻ` ¥iÒ­OBÂîózíÙe9ÙÑÝSo<^M3N cJQOm D55¸q×7“$•kA hfXƒ}þ=sº?Ìtö0=ñ @ú' s£9gà*þWæ›ö¾=ÂÐ'@ÈôÐòIÂ^À+$Pã÷³°"Àc9‘†ƒ¸@@‹mûÉíT~í " ˜T2“‰Uº~û5hOciT`¶+À'`ýìÐÇî+WœüX“¨$hŠçïò€€üŒuˆoŒ†oÖpBG ‚Þœ`æÇå¦!y¹6&Oo§^P%V©YÆøýÇ9ÏìÇ%ft̳]¨™}ÖTÛBFUæØWƶKC[+*³ÿgØm0vålø¸;ÁàVÇÈràzr4¶DߨúäçíƒÈeFbˆ ¡x»2Qo½2ïîêìQÓJ:Æ`Ÿw´‡úùãº!„8âfš~[z2 §mN9ú ˆ ;—HÈDBã&΋Ë´ƒÚ©WÝÌ¡šgèih„3†nÖæ&û š¢M{ÇU.ÖIwMGŽ<,Aº“£Á-p›8)†$Ñ¥MÐÂ2…­mî¤ðÃ1asB¨¨jGŽ£Ì×¼‰ô@K­ÂBž%dD€5•Ó w…¤iŠRhÀ‹A Æó¬–82‚Á²”ýh"3:Â2˜Ëæð ¼¬Y« Ö+ÛÛe©!”!À®5( OggSÀ &Ce@ÿ¢ÿ ÿÿ•ÿšÿ‹LJJKKILZUXTEI[Y_aÿÑÞ îâHØ¥T Žä~µ8"Å¢p(Ã3òÄ Ê‡ëܺñ*€¥ PC¾gùÒLš~Žj}&^€N¡™ ÏÇ/›C[€¯¨ß¯±w¾rÖôï7Ì_y1m^œVaòjØ\õˆ!¤Ì;-eBÑ>¢FW)íÙ&^3 v”Î:%k>ñªTùs1¥Âh°õŒ³šÑ'ÍyÝ!©ç•áO1 Ên‘DAjõ)§^³¸T¥.@9Çì½fÿºuöŒÇÙºÏé²#v9½÷-G÷t‚0’œÝ£˜ˆ=%žþ©osˆö…0ü4ð §}5 *‹-þ|Þ;§±³à¬ÏÉI:tM1Ù•ÑPM$˜!HHм°§DIÃQË2š §S]+Œ xò:=ô>$ø…í«ºaÔ$t ˆµÓ„&¦µJ¡¹ØùûÜì;—Ý(VBƒnxzªðj¨Æ¥°†X¤†lD6D`Å*’´n"ÂÀ Pdñâò¾@·€s?‡‹Á€ @E Œ€ö6p¶°X^Ð… RKFžûuðÌñÉìÔÂlWÃ#Að˜ÅŒ ÙþŸ«ÿUꟽ…Þ/9>%3÷­Yÿ3\ÀØ/kË·mvd> ¢•buIHäîå`›£³Ù·­9ßMy‡ßËÅd£DñçŒñ> ï7¢›/€Ž:‡F®U˵ìÜ®ñ˜_pBþ6QÎäÙ8÷˜_e㽘öÝ/Ó¼¡ñ^˜öyBÄxæE«ûõŸª‹íQ4@韟Ï8ËHAA¡D¤ÉtóÙ[ÓSâ°Ä`©µ«äìÕçÑŽ*¼Âº(•ƒø‡[7î=mÀè!³(½ð!à=¨J¤Tdð\ö¯ýç2CÚË 82Ѩeszˆf``šjãjûî+§³Ð–œ¤$’îHqÊ „£Že:Å’»žcá> )²2&3Òºä 1â³$€ ÐSš¢ø@Õ@‚‰*Q—:Ï X$¬å¦²!*T‰\A4AH c@°°#É2–‘±¥À`„yj¶HI|Br­¬á„Á± –AB¸–%c^l`°Þû鑲˦›ìAï·‰=ªMaA¬ >ÈãDüö¦+dFÓ3Õ>ÿÔ‰Þ|r¬ÿ‘fÞÌɸ÷¿{ãÀÛ öí ¸÷±NÑÈ:‚"…˜fñb$´d\†c‰6‡'¿Ùxõ—›öýÉ^g›õö3»Î¹â:ƒ1„Lèàm˜Ó¨ò| Eª®1„‹Ñœ¹YžT³¿Ö©¾?{~ÖÈ™v $çÿËh˜Ž3ö ïñÃë{ê·«d#Ö  ìûPÄÅ»ÒP<}³Zœ¸ö£+§ µíbQÉÙUaº¥óÿ^–ûs³´ª«™H5ÍSÑ[r u"†N¸¬Ý&¯G˜ŽÜS4Oe€7<ïY9¤L²’¦SvÑ8HH šð”j’ ³ðFí',KÀÚ BPÄ2v9½HC²Pc! ã¶À( Y °X‹¦¸\¡c×ÌÁFB©=€èý¶J`ÅøÑ‹eŒe@žqyV)¡ÉÔÉX ¹¢Z‚0€_žûõì’òÃb%ÈõFºMc€ÀÚh†(OßtŒ÷ŠÅ¸8ãdð6 ¸¬´›À¾æË™Û¬È›È-Ó®gÀND?`Ø–øž¹Së!­×Bå܆–NøÿIßæÛÕûóëþ(©eÖ‹¿¦€dmr’ÆX}y Gk‚§Põùž‹¨žË”jû]ý©Sü™¿RÔB€è¨$-Ÿ%Èj“\yë`Qš uÁyŠÓ&X ö)ÚšD·`ó/ž˜Îì̉êz´»ð«eñἫÀEËb½@59$†åÝ/üym›UcÝór>·ïÒ‡yI€Þ©µ  R?ú™íX{cÇQ)±æö”ß¼{-¼9S ½DÕwoæ3]I=F(ÖC’ЄsºE]}ƒ³ê1¨:5a X4œ$!–µpFhRB& ¢'cŒñˆÍ{0¡=HË_ÏÀˆ [“@§¼¬ÖFE±@ [Æ Dì,åfºI7s#0 X ˆ"`™È€Å’'1'(P8QH¾Ëé15qTlàÖëÙ5jhðx÷D¿¸ 'ŽË ¸ûàÅÛÀ~F¶¯ë>·¨ ×I§€a’@Bܧ@wœ¾~nXçŸ0ßfå<ýSë98Ó×çӞ䜣±¶.ÐïønF8`ÓÕü£ï¨|ú¦%€÷¡¸aø´“sý2¹[æ—º-óRÉ%ºÉ¶OkãÓß›áyfáÖåLÔ Œ'Ñ ‹'2«:Ë ”Ïxåò‹Æ‰¼TK`` ¡)/~^ŠÝâRíC¶2ä±=·,rq`HtÏZ€™Ú^4æéW·Lá€è/3‚“o®/¥GBÆõFÓv‰ÇNœgöj]“x8Aéz,%«²ë‡ Ã4C€²ÎÂ"1´Ý9+Ú™i S•H‚aútW$ýwÅ—ž4 ŒéÁ— ”¡ €º´ Y9™¹OŒ36š¬M\ ("ƒHG!¸z² 9#£] / @–…¨¢` •@@(4ƒE*Ào vÚeðš®YV´åAi—€ÏÀþ¯öùcý;«}Ên8ø*sÍç&Š0oLL;& r¹À¸ñ]™H “öçòNK¯Î1ê<üÃ^”¢abýdž°¥%Ç`†òúùËÝ~ñê)×ôûä»ΚˆßÛv·Q7δÿǺÿÞ7úÚüýôußD˜Ȧßí"¿q0#GݸNŸòd®”(:ò`´e=ÁÚ<ªÓìëÀ„ Ø&«oý;ÝÙÔGš,ÆÚº„³©å40}íÌ„ÔÅúeÆÓ˃Yöï=¯CÅ hÈwwEQ¿1êJ‘Ñ 5@0-YÏ–©²5½Aé¢T;kÖHÊÖ=´è&S:hèÌrÌ´/!9—´@Äõùz( [¤¨é9²‡• %Š··… ›i`äÙñ ü^ŠhŠ¡¡ÈÐÐÀø¬)ë"zŽ@Å ôüð8¡²Ôà‚Å p$h€å`E Ìn©!¥_E¼]0ÞCÊoI°¾5×Êß|ôeV62:ÇéY%W"ŽM*ÌÅ’rªca³ÞîH\1³–`…¬g¡ ‹° _Ä~ÉÆG³“p˜Y-¸( gAlUㄹ4—à§™^3_~-®—’-öÅßÌ9–3H-¼éW(&¼Eßkïð&¹»£¥ÚWy ÈKÈÛð'Ÿ ìzScG£ðAA#Ãâp‚¬ñCôÓ¿‡iö¼mÜûRjÊúEÝôw=m׸ïî˜õ›d]†ê¬*”KŒ¢H+úlD‹¢É–¬Åz¬X«U^ 4ðËœZµnB_¸ÙŸ^õ‹ !øà6 ¸âP^;àŽ{fÞ.µŽ{’SG‹=ê€ai«¹º‘¢QQÈÊÌ7bV LgĆ©Y•õ[A\·^°Wü…«í˜u8€² ¸£Sm‡iûeËKÏ(^'e–'€FÔUalEÙ å@\A’˜èJ° p å ÄvÉ!Ù&?¨hWËÅ7 D»áù/@·4\Oì]âÌç{,Òjê)›Ä0?Z~=§•›º,3ûµ•{ÇDõÌåû\5%öÙ™J'f‚# Ê£¾¦Äô]úôÜnÙLk¯ðÐp pïg½ÿy{™;­‚°¢ï6/SVâù?­A¨v|¼mOŽ=ëó^áS…Wø~vªY˜jQȽ„²¦ŠÃ“˜¢Ê-Ö³è¶ÏG–EÄ œN©D‡`àÆbY0bidî¿‹æÒžÜ¹@Ÿ÷·ûå5Ṭ­^ä'Y÷\p¯$O¹æü°í)ů¯r¸úq |(·°U.­Lq*šEˆ·,×Êò,µäŠÛ*YÍ—ÈÄ^%×FÉThvuŠX¦)‘-¸`[å#T}CæŽÔIîÊ2ùù)U½åúc¨ôšòó¬ËcVÊIèbqŸËùž\Å¡ø*Ïjù7ïY åôï Kñòö†­kø‚/­@?š¤æð"w¥\€ä|ª_᩽GfÀælbv®»Ü¤pÖ±¹¹Gò5»a’äCæœ&ãîd§ÆØüpeQSÙ¯ÙdQo'^¶!ܰ IN#Yÿ}®¿wÝS=TûrWŸ 5 1Ó_#$“ 2I3ñugNŒ¤ÙzuòÖ͸Cÿ>„¹Êc$ÎA¹›œwig3$”‚–´V0êÁ2úWd]”o›L½N…¤‚›^%MD*‚–ÓýA@šÚÁ_¸Á† – Îµï”f^€€H³J`š"Ø”ÙÔ¶ä×.ÉØÂÞy| #gy"ÈOggSA &DÔë…àÿÄÿ­ÿ¬ÿ±ÿ~ÿ–ÿÿŒÿ{KMOjd^Ë­>rzèb¹8ÀÐè~ëbY·ÿÿ<+¼Çï/¾g¿[°ï¿¸€¶ƒc×'àÎáG¾Ãj»T­’@^A×3Ø¡ËOÉïaiè?•+:·ñ3\q¾íüé«Ë¨YÕò¸ÌNe‚™Ç ÅøˆÏ¡ÝÍñ“JAºL;¿Ù[ÈY³këèA½óVÔh;ÊtÖÛW½ÝtáÛ¬‹c³¯À²IÛ$ß×õy% ¸‰N ûÒ!ü¸üë<ÄEVŽ*aÈ`Šìj’Ù'Þ¶¾#CAäv(ÎþG÷ö{£Ÿj>‰J÷ÐÓ/0ʾ×$äTá§úM.r½kžJЬaî»gòÜyvð÷³Þ>7ìh²’„GŸÃqÓÝåÊCÏÂlLOOûëI3î"ÎöÅ¿v oLIÓ½û쟪™ï3Ï4tð$dF)÷VOIÏã‚õ¹³;æŽýç» :Õÿv'ÚPd^Ó`hß‹I tÉí1 «pÚ`⹳ĒQIø4ÅÒþnÀxƒ`ií³@æ»9H£`àm uNJ<Æ€[– A¥¡óÊÐ5â+ÑÈB‚^Ë-´¦Jh sg¹QÔ’|߉7»ù p·|ͶÖj>iÛ0aÁ$¤€ûpwìuª;K8ÕhàÌ{* ¨eºôÅiÞ±¡6¶uç™÷»Î/Ži«u¤ VF{>Xëµ¶jt>jçÑ£=wxß¼¦´ó([l74< ÙÜ›/ŸÙ0eÐC4@ðáŸ,À‹ê&ù?^ZÃýüüŒ›  <ÒTÓ[“Ïyó¯³Fùð’àÑô;»î%6W„ !g Ÿ­ç™­É"¯Ú=ãä§é>FqfÜŒ`h ® „é¶u†ÓCB°RP?û  À/=XôôÐŒoÞ¦ÿ|ÿµe1pb‘×TÁ®”7wô$™ |÷*#¯ç¥·3ÓêNHótlU®zÈbš6 •´{ççï¬ðôÌ0UEç³²ÎNFë®l¸µR3õÒÓ¯^,ô6÷?4l+A¿ìõÕ£ª’*ÁkaÀ«4Jv´•„óFÀf ®Â˜ Tÿ#YE¯¤ ì Z¶V öUvc“/ ž»­bÎ*€év[d‡Àú Ѓªóû¹ËäåÃ×ôb7§g÷¶ä t”öV`®{ëÛ¶^dæMÕ$ È}ËÆµ¼»yq5çÌe;~ÓsÈoKèˆO7²Fëí~ûïU`²÷<<³VB¹{)‹ÞžI@È cìP‚Cfà^ÖéõJ)%äü¨Öê‹f ‘“Öxßk¤¨–G¸ðøu¹Äw —ž$Ê€¥"_{¬N±®¹Ù@BWU’=-bKxÍbl&M´ ã4ìÊ99?Ïnï}ú-je2ç°D'ŽêÉrBN92ß]IÝš+éi(W!ˆúóVRDëê³E Cí5á)¦hºé<ÓxŽã¦è•÷`õ¹ª6ð¯®YRHT›*å@OÓgS0•ÉKµºë:S Ì›ÄêäÝ;–î·ÿ\mD¨çÍÔîŽÅ½ï3ìsù×/1›¿òyÕêÁÒc€&€~ì8¢AxYÁà:È7njL"0@!$'ª>I0Ù7Ò»ÙÌ#-*LÖÀ4”d[‘w62”­ÊC Iþêõòq€×®ÄGÖš  ¤ÀàðÄ’Ùä‹ç\£=ö§½’þÎE̤ ÖkÑq“ìÙe€múÖÖÖ"ªX F BÊq÷Ëös ÆëúÝÝ´Óß¶*(6ŸFr²Ýû?™KS@û™fÄÙ©Ûr>N-²Çkdñ¶²·òœÅ³tÝD€­_~ÉQ´ SLÎbCOÜo>=Ú|üy^;ÂÒ^×aŠŸðÊÿq9„к13SÑ!Óäªp¿NµZ}ð·î©?¸{‚$€ät2§ù¡¦wHÂóV¤4LÂy¨)@UÍúÒÅãJˆæ†rï,Þ¾¦«É*M=³.غ¦VÅ=÷@Õt—„z§¼ç\rÀLϲ4'ëS5¿¿r“ñ\˜þvü^?g'p«¢25Ÿ;UÉ`rÝ÷çÕ'«Þ¹’æ»·0I æ81,F€Ü Ïùÿ`'A°ƒÿ4çÍØÆwY†hBz5`ò b":, Y‰T(~ëåÒ ×Ûäõ‹já'G´N½±]²øãr×twëYlx­ Þqð–`Œ¹œS µÊ $E €`.mêûpæ®PÛ¹G%n™õO?¼þ¿¾õ5£¼ç b³{¹Ùâ†8„²hdá!G úè²õx«Û ß?.mäžÍÔIjU…N:K}2yœ&µvë7}ópX/î§í:8ô2‘򴯮ÅÏßú;"$´”væµ8Û~Ì·Q¿äÎCÓ¹û™ÎªdŸ+Ãß{i 2[ˆ§…è(¼8 /#í8@q8“dFOS¬?bn: '°Ùvë'¼ŽãÐõjì†Á[wyŠ=zèìE¢:‹“±=+ÎÞqþ‹kvþ7´µSÖ3jS|ÿ¸¡¨¦ŠáÖ°?ŽEÞêJF•Åpþ`æú)†8ÁßæîB—@ —dƒð É®§/0 ‰Ñ†=6R%xt9P€¾ þê-ðžM,˜¢uøb»E܃XÀ×o€Äç½ÓJûÕš9>÷xÏ?8 íöu›s÷Ój5£Œ’„`¸ïC×Yœî`p|í?ùÝÛï¡ mÏýβY¤ÂØ÷æ*²QªÇSËòÜò 4d¿h´ ´íUj)Š‚¿X!-‰Àú^~£6ƒDc\VKl_mHÉéZçºP‰m?Ô4ëäw¸Eý¿jÑù,í- áH;RfÖðiÎÒ5Eò$¦ÎjËM®Dum“>±! ¨.@ÙÑùäÏÂ[J4 =uÅ °ì•×bŽ1Ƈ32Lƒ=²‚,Ãì"k=(÷™d4;"ËÈЙÍÙÚs³³EO®Šfor:’A¿‚6¸ ~Ö䢋²`À @UYTÔÚ=T2\rY@ÄΧéRÁtQД q‘YoÑOY•À Ü #VÌôTVVò¨goߊ…_ lÞNi€/ Ò—$q£ÆBã¦8n@IDEp @òžË]Í-B4ˆ¶®µÝ.ﺔ€©×o€ž¡l¹;ó À!‘7ÞO7û& –äë¶oyӴ$L€Ì€~@Üܶ±²,}£ÑœËý£¦¹aƦy¯¾¤¼FI|)¥þé¨ùº½uxjº×ëë­ý© L/½·˜¡C¦P_ ŒÇ×ùœ;SV¯>nã Mj2è½uÁt©OAžüéÇ!½tmÌy9ë»úðœÇ ÝY\ ó„8h¾N7S†—æ w&ÁÆFS©-4·î‘¶‡^ü, 6Ed ¼Ë=ª—ñ]<å1éˆ À“+aË!É&«ÛÒ3LvT'ëàxCESÊ^ögþûŒÙ¹ôºp(*]7{æa‘ÂEÓ„Y;"¹OYÕîddŒd€ÜÀP•ö“lª®Fbxsf0 ´hf:NmgL™˜‹óEÁßå#–å` ‚ÎÅLý«€ÀçÝ"H€bŽ?kŒ@5qØ@`BzV„„Á`Bw¡ÀÐàí7ÖÊMîÒ“ ÚØàNåq LLøþÞ­]Êæò.Õ?,'KÐÏcË:¬6ªjê ÏÒ1[ ‰ g2æûì~&ï}üÄë…cZúdðtó•`0S2á6¬aÕèóé]æøïݹòË0DAgÓk$§dØ£–\bŒÓ~ù‹3lŒçrÞȵuPÍLüžØ_s]õ0÷N^j$vÈŒé?ßÝ$ùÖ½d1t0„ Žž]ÿ8ÚÁº|ïØJÓµVÜÅaË,H’4 Ê ’fr.P<]L¼P:á_kTÅ4£ˈö@S[Çáp’’YA˜0Ž;0n*H½fÕtc;X`hÀB-f]ŒÝ7¼÷™ C¼UиlðŒ«ÀŠŒ–6 …Q€ ´§ÔðþFô*o9–©-8¼d'?ObPn@*I%»+WAsi~@`ÐI€Î8øãY´ví©ÀÅÃòòª¿“XžBõ"8‡°»¸ýõOG<’œÿä8qMy:פ:ô©£lr¢‡pºÎkÚÖNïâf-XÁN°ñƒs|ruÏŠsNyXçzÕ"oLÊRþËBÏXÀã’ÀxºÛ ÿ>ñ°P1õd1å&ÚODzéŽÉêAÄŒ¾´ñô0èjr1$dcð«Ìrñ3ˆS5Þõé–º3› ÖéñˆÅ8 ?L(>ìôù\Š ”éua»XwŽ,…Í[p+#™_]ç®óœ©ú°¾þõß?U,)À|Ré͈k}ò !l¥"#·ÇÊæ…¾iÅpÿÀüÊË^¾kCßËÁ»A6‘rõ»kûPIÚ‚^ì›,æñÏNœÓ ?-–ëwLŇò(ýÌäç•홯ח¼pÿ ÙïGø­ù ¼Rñ$›ä紼Śj?$²¿¤:ù­™v¿Ñ[<Æ«:94÷þÓ¼Eèåyß^®gKMG̶6Î|Æa*î#_|{ÙØÕ—:âþ~«‡ôïäp×3Û¼ŽKjÕëç|OggSÀ` &Ei]ÿÍKFOMLO]__aÿËÿºÿßÿäÿýÿù¬J…jÇ4ÆM¬ƒ³v‚á«~第9z”æmæþ¶±|›Ô» ¾ˆ:ùžrR6%euQ~¯³ë ·}Y|xòîGëcSß¿^¾Ûˆ}Cæ*_®rà VCñgRYÍØSr«˜ZáðãubtŒÌ,€£?À7À>ÈNL¡Â–Ì1©  3º4mÈ]ÙAddôo~ÿï‚ ëzÝÐï6¸ûs|?·ñJGÔz¼«‚ì­ýY'&cA Úòâåð|Ô¸ts2§CÊM¶Eøúü¡êæ·oüè;-õÎuê­ŸÙ¥Ó>|ø„–}z¾A•vùþ£²WÍs¨š9IÖØøG¹ØÍ3ª®Ë‡r1=™šø¯l¼²;þ8‰´!!@9Cˆ¿˜º,[œEÉÉkŸœE·ì|‘ç%%îADúùûÿx÷ÏÃ,%É8s<âÎʺ2F !¤ˆD0ž¥ÏÆ9mÌ4Â>Ávx“TÑ3kÍu‡aàÙgŸ+/»Ô àr›¿ãˆ­2û1v ‘&”‘P&USSua‹™l*jßô„£™®ÃLuT4Dõ.ÌÌòÍ`Áæý: 㺢RœPÉŒ-FØ–ý•;§´À`Ç…‘IK› f>¼^Ж‰.ÏÙoùý~ÇžX,–ªFÿFt Å=™Þ+(¼ED“°ýüu–ϯ †ÜZÑl”Æx_PW¥þÉÞõoâõïwξÏ(E™Ã8sU<ñgÑ”Wïµ *G#j„‘”¥/‚L/^Ü0®ðTÓ6§"±ûDÔnµa À —ÊÕÒ+¼pò{úiÍÅÝšÁ¸û ßÊUFÞ}è®Iæ--ÝŒG6_O`lE"v2l÷´ò(oyn–ÜV‘f@Ò|ã­c±ÚfGÖÖŸÛÄxœæ9×ä[µ¤I¦¾pÂ^‡bþÂeQZžø}Ç‹Š­üÓÙŸk µZ+ÆsOqŠï‹bý;êD aä‚Ñ!U£›?á8»Z8ëþpΠ)E9åèà¬,»ž~ÈÝ‹ŸÌ&~–½¬Åðn1£zú­ŸÝSúQ €I{²ÇþY #´ZµÃ˜š§ïÅÂL¨Ìú¨$S8OsàÚËg uï“•¤¢‘ïùáMI‘Uéµ³0häßt{û_Xº-·_cª¬ C±†‰Ë62ôzѕɎ, RöfñІX=>.¥×N·ñÈiAË´™AucÑz?8@"Zkâ—ŒgòwÕY?íÙWvÇ1·§³âÉ|)Õ™ê Ü^a³QpÅZ,¶dItFÜéb2Î{Hû(Ë©õŒ³¬-Œ ¹§9.ëõýcóû¯ª¶ ƒ@?Ñj'¹ÏkÇ.÷[WÚŠ¢Q¼JOG‚¹’‰o„$}¿T| ÂKä^¡U¨ŠÒ­›*ÕY¶9„ÊümQ#€Þ°ò}¼»Ä§*‰‹.î£V›Ä4Ô\t•UŠ"÷¥ªhôU‰ËEÑžTèƒ×¼(TÕ"¾›ÆÂj™ƒ¢ëiI~ýLìRi£û¹³;ÌèBïöJ¹ÕBÇÿn²>,*éƒ)3³«è÷Õ±å°ÕW1‘C×íYR}œüìÇ¡ì]ªÁ¨î25k>uÊûQ“‰°vñjÒ#·w¹~ª~#Iæ¬ ÔRn‡r„[©`ŒT²5¢òrE„ÁUêVfîµ¹Ï|ªÅ—j­”å×®¸xg}+ ÌÙßlg™SJ¹=úîý ïè|Àòê~ÊÎys#œ )‰´F)–³ÕK€xúAzzE<…Ì:*8hÄÝg•W(d2õ¹såX²ÿ@®çÇê‡vëÍùº½°_~;ÿžAÏdY×éóa£µš¥f. ²FÀ#yãÂ_ŽíwïÛ;ËMã–ožh÷.yuV,³`#O‡›Ôýnï~Úàªí:î-µHsiÖ.EÍ|Àr¤¢Èr{™yg—Ï“lýå‘+KZE?aÄœQT¤[$9NwÃÌô Ò/ñvºóÎ?W¹šŒ•ŸLjÍ­s Ù%#Yñ<í¦;Qb*\ ¬˜£¬—õ–ÌÎQÂÏã°¸ð¥ÁMÎó Ükßè1ÔJ~1k‘¨`®îÝoº§-½H„ømîd=Óxz¨¾TÉÔP9×)Õƒß ¹˜…v¸ÔE ÄÛ‘@¾Fû´/º ‰¾½ËOöáêÓý¼ÞˆHbz¹c—S§ËãO»9fô$v‘ yרg ÙÉLƒIÃÍðÊ"¥À@´Ä²4ô*QŠmÓ‘²"9²°A€‹ÅaôW×("­²7š4ÙW5hMHð15º’Qfbç›…åŸJfücÛ 9Ë?ÀŒ Á€Àöe„Í€¾«5ÔƒD´³Y<  ÐC÷AµqÍÄÄõTpÈáÅ/|ìÁ9è93€ÙfÝ,V ®5‘2€MŽJÓøgï¡ÄjŠÆèÿsÐfƒò Ì¿º³·‰è¥ã±[º Ʊn6s©Y‹¥cÙ÷*äÓªWóHöR 0N9¤KõŸèÕ/HDd¦Z]ÔU¨dOBM9ª«ûÝÇ-hŠãpLõ f·Gè ™ì^êLåÌÓµ¹Ñg“é!uæÐ´”¾&ëí©Èx´uûÜ †ª¡iDŽ¡©Xx#æýþûÔz·¦)вV˜-n–óÎ)„»øÚf²2㞌 ÀT)Ãf¾d´¦ä¦EÃPn#Mä g¦¹™;´8Ø–Eò@°áï& "K „©Ô²@cY%#Heóc`•™D¨©âE¬š€J´KÉ.:Ý5~ËÕ4âèr³˜òÆÅ½Oòôæå宓Ý-Êñe„Ð|Æïþý÷b ³fðz aç” ßý ¸Û€Î6Á˜ÉÙí\Ï ·º“p«K[ÕçÞ—=}t’óuž¾¾ŸWø)z”¥k› ÓÞWíW´fÖ ?מôrxZ%ºæÑÎgËdU²Ø¹¥Kñ".Ÿ»B™NïC¯èsøQ)P<´aèõ$·½2d’4J¿\)Jgëj È(XR(**C 4Ìœú¢:ƒl§Z¦Ñ©¶†ž˜ºÞšš±³‡ÄiŠB 2!2Ê'îáª,«LˆèI ë€=DÔÍêAhJ‡”L¶ÍmZý5Çe$øªyÈ(…6¯pËkŠÐ¡j#j@®j(! vQUC ë’¨p‹ˆ€â*ìD@l90ЂŠjj° ’0ÒL€* 2Œ1> ¸ò¹ 0V°CT`ôF@ÀèKX¿+^Ë•z Î o6«eøÑ!C÷øÐJð”Éá*°êfæi \Àº Ì]¢…õ"À°û!{À.JNÀZnc›ëFLL§²€1;äí+0~8}ØU'ft2Ö<*”ÐæOš»Z,¥ó4c9×Äg_2=PÀÚ·R ñ@) CÏ;µéƒÏÑP\ÚÅÅ[‡O³PÀ1%—æÉðƒÍ@&gÛ5z  Ã{ÍR:ð—Ò‰@ûÈ®‹w•_Â`íó'¹ø`»pZ¯E@D œ1³°_ ˜/Ô$ ÊOÀØò}wH5Å‹M& €î&3c>KÐ×¾iç¸Ï DÀQ=ãé²½/¨€ Ÿ=%T@(!2dâ‚mÎz<^œkJðK¼yœC­›ñÍÊ ×†Þ›Î …‰9 Þ…F_1åtL²!ä§H=€d¯”^Õ“J6`K_Ð4N [n÷“†ðWlõ&½ê!ªÜ—ç õý{@GnœWÊfY'I4¥¦*A’Ñçr«ÒÙ™©yÁ–Ê™™tµ ª--m[Él}³¶i]j2D@Öw] €bð§³”­õºah %'IJ^{J ½(iHJaMš…Ê ™¡hæ  «‘LëɪC*2´nÖG#îf0ÐD•£-ûÔÆâùD•n‘Ö4X Y%é:a*t@9T†ZA`@ãbá¦9bMŠ °5Š-2@ÐH†s ö*©*€®Ç@Í” @˜PÅŠfÞÞ@1M óO2‡!1%hÅän€X‹Q@j Z>#†„% H åƒ \€OggSÀ &FOçX9ÿÿ ÿúÿíÿçÿÝÿá^fÿçÿØÞÚ•l ¥ ‚hÇf#¬Q¨:U=Ñ÷ÃJyT~ý«=’ÀjÎj"r†x;¦·“¿p•» É HG€À×lÜ€IÀž\&€h®ë¾Ý ‘ Æœ#`)ˆµ»ž›]߯ôþÑøBà ¿œkpÎYï}6‘?+“ÕG…’ñÙpÈ)ø®t@ –bӣľ›½rüpïxPMð #¼íêâ#Êã´„ð*Öì|oàÊÈ!„§ø†H@O°&|ÆW©ºÕ°!S2콚€2ð=‚«.Œ|¬Ar°Øšó¦ÚÙ %¤jŒê’¢RÉ\"  ˆÔ ŸøqSyÈ!uS›Ý}ì³£oý¾æ¼yŠq²:`òŒ1TPÌ[T±=xUøC¿“¼E Ë„ßh‰±yhuðB5Æ^[Z&2lÆŽ¦‹,¨sZ. @3“53!:Š® 6%«µ¬ 0XVä¯ai bd-4 °ª{F£¥Cdl#@´EÉe0åÀa”¦Û `mŽÊ„€<K†ÎÅ**À}ˆeÁÀRC½"4ÕF€•k(‡ˆX£€*ˆH­1 b£[ ,ºD0ƒu!‚pÉþÚ5t ê ¦Äº[³Œ.ÁD~?€VÁžžëífuññ¯_}Þ€˜Ìf7Kùâ5À«=gt ÎÏÛ~uÆâÂbÑY™ÎØ—ìƒàhÏOÎiA2·uß7w¯#1/Àd®ÐCà´w ÷³•ίã…žÓaÿùÏZ»Z–O® Éô$½Ÿ«©{¯ºêsŒ àW=x‚‡’ÍâO’¡Ì%Ó0Š ákæÙ>²äžší`ÿ¤s¬<<@°cwg×;ö]nàÁ‡€Lh©£,¯DJ7©/zj W]„µ•uµæ& ƒåÅû&33+@(…æZÕÔËàX®:Ûy+o.É&èåpP;ÒBìÑY€´Ì÷Žò¨_ ÑR˜éŽ7Cͽf_ïŒ:·ã º…*T4K€¶ÈCÀaX[J¿ÖYZWÀw€¬Á‘*Š dm;¤«†ÀNÃz€¢Ð—jºÒÊÙS…Õ+¸®'OÖG”.úºq¦kàvë›!@dsÚ!Ta}Û€¤ŠaeÝ  `Ÿ®ƒ ¨ëuÙ€q©ê.°ÂlG2€ 0(¨f²nbiq( ˆãÀØ€+@!”‚€ªwT– 90€íŠA >Û5lMó˜[³ NQPÞ7À·L‡–?À»Õ±€g.Vƒ„í¾¸g9}o2¬ú‘èãŒÇI¾dލpÀ&|Y@ ÙÜ}ÛˆóáÈ]IÂD+Éñ/ÜI 9º;÷^UÌ/ 5Зtq´Íä_)ÕÖ‚Pèü׳W¡4×J@¾?Ü›6sð€€à»Æ2æk¨œ!·ì¤QÉ¥£8o+‹Þ2yÖéŸÈH—;»Õ³*Ô›þ`oÒÐÜÌ XãíU ‘Äq˜×W˜:åëMý>X4vé™ÃàµN“¡] ‰&ì? ùwm§¬‡•àÌót~S¼»Êk#¯=ÑPÏDèzD_ÈäÐÂÛ° Ó¦ ðèwÏìè.G ŠÌž`#EA•E«0ÃuQxEã]ÏÒ2(4I­Y€žÚÊÓrÀk ¨ØÀ èD±ÄÄYØ‚¶r"h·GÀäªiËVÁÖQŠ¥`)€26«ÖAÄ Xt–Fl­€€ÑZ²`B†PSk,Fk ˜(…QÁhÀXf‰˜@t¨`A@¶,ǰ3(–H>»Mr ²P9š¤­Z z”`bFnbÿŠ1¬µcÿ]ïy'k]¿n ~ÝJœµßØìsZn28£]á¶ÝLrîÕ_$ LFä`mÎïKD¼9׉3Õî×¢ó‹˜àÄ »_!ÿ<ú›—ÆOëBñH•+í®;·,=P¼f²‡ hãé•ó¸±Èð%ôÕMìÈ9m>FƒOýøŒ7ŽŒ Èá¿E"dÅð¾÷fùöYKu"™Èn2û¼¶Dl4sîijñÇÄY‹'`xŠªY½ˆ)‘á¦"XÚ¼-äŒòœe|ͱ¦:'žðüyÈ/Ñ¢º8ûªu`!x-ýëÕž½Î^˜}ˆÅYöswyFÆêûC̹`ÑVwȦI[·µ÷à³YR4ØeB9Ø“ÝÀë €[†Žj]€Ä>±•A„Œµ]‚b'h+ªÐH¢U”º X:YX ¼µÎµ"F€5¦ & 6Éj‘fÞ¶‚¨Š`,ê:BiÈ€RªT0BX¢Ï§­áD€ÀèÕ(ÀQ”•uHŸ~îxN™Këx^³ÏA:°3$ð5u2¤Ëhvj¿ìÙðÕZkÞýšÕO+£xg‹7p0 „ Cº¿ Ûœô°`® P{òäêÐ]ö4pvO^˜Ê ì—Ý÷X\ÓÁu@¢†mRtô[Ÿ¹*ì3g^²Vw¢ÛËb¯wÅd}­‰÷AW£Ph²¶¥w»Û£8GVe˜±©J¤ èð`¹Xh¿­52ÁŸZœ©u¢(¹u^Ìe ….÷GT üö¯ò’SïÜùtuãàs€RrQr-‹VLL×B*¨¢zéþz•VV®ï­)r”ÐSµY6 Y$Yë‚{`(›ìü}¦¡¡¦(jÇòëÙv|-’ž²Œ*¼s lZk6à±Ç> û\L` r) ‚õ5m@ZöËL›²Ñi];QbC‚Â:`DXƒˆ(*da.8£EÈ.Ç+x­®1ÆÆ@3Ž :046#€# `Ø<‚Bjs’šŠˆX  ·[ƒ ý ØÆ¬knb)¢ˆ@£ÀØP}#ô"í b€XpVºexV¨÷ˈÞ3)X-¨Sïà+À‰–t·˜¼pžÛ€Ž%ÎÃ,\”`xÖ ^³±¯,,I@‹RŒ i»Ë˜WG|°I ïôB ¥T%Ñðxh}5èÌ-Ý"Ÿ ]vB^«ws·<7[¥ ˜Q8*€/ç”5Vë5ìe*Ëšq숡<Û~*íRÞÀ½:;Ýl|ƒó×ùìdÁA'8gâîËûÙ…V¦¶îÆ1Ï¿ÿÝ|Êö‚zˆåR[¦ºyg˜xhšáç0ìEÓéÊêQˆ˜Õ ©¥v=¾~J kÑý²Z¦b©×ëë;ש¦yZ\Xd…©ëúð×÷ûxÏafÿ˜h:ò$Ùyvè¬lQÓŸžy–A é.í8ÿ!¡¨“ì!ï,ž™>$ÙCÖÙ,{Ó®¦·êÐM!P<è«£û\‡ œ,'tÊš/ÝC½¼tä+ÜMvtWºNŸu’œâÊË÷æ6‘Ó‰•6o>ï© .¥ ”§‹™~p²øó£cªò˜bÊלÙGEñøUMË@Vµb(ñd,K«a ˆâä€ïŒŠZΟ˜å Â7N¢L•¨È0üd¤à›êDW8Aˆ¨þøVŠýWŽÐ €ô'e4kš:Ö£T!(ÿê;…‘MµjOË­ B‰ôÐfb xI/dÅèý~ÆÅÕó ÀÕÓÇW'0)5hL­‡†ý6,¶µá;¬¦¬2´.¨ € €N÷ŒÛ¸€{²Q2~â‘Ö0OžA¡bzé| —VI|XúpÒFÚ¢0_ËLLÐÔXyÊÎbAäw”2v½™»ª ˜Í³ÙôÁ=´a#àÏgéñ$zˆR@mù,… CNÕI&OiÓE¼.×fíJŠìè°íϹ³vîóß5›ûgâ÷»Ä†éõ<Ÿ¦8Û·»yUé•¥N ל_‚—Þ, Itß›%æ\ßÏãsñnÇ$‘X˜šù™¾‡<Ñ^¦&^è<q¤d>ëòTÂôÚ ½{6®‡3Û/†èÔ³r’@Õ}!@ëÃH"éó!À\)Gj"ÀFvqá¦j°˜Ûœ]ër”…P“4 ôƒ/ŸI8xn[‰B¸vz×Uª6eÖSŸ¿üY…^½VeFΦïùrïˆÿ~¾Y<Ð+» _éÙoùðí\6Öwç Àû0˜ àèu‰€ /µ÷ÓwHÑuXo- cÛ‡×Ìü°ÈC@€  #ÀþÕ7vÍòÚwùÕnRËçj4OÎ…n¢údP™ÿwÈÐt>ó@) ºì¾ìįž!áÍ#-T€_ð4ÖmD}õó÷¹mê5«›”Ø]ºkGmÓgÜç>B \¡„ˆ(ã‘ gÕˆ­Ú[”DÚ1{%tî<ò²¹§œí§-]s ¿€n­ÿü?[Ú·ï­?E‚&¨Uec7dÇÖ—îÝáÓt2=NzûwÇ𛨮"GëP°8nÃe2¦ÂkèÙ+Ó$áÌÐÏ0Eg3W`( ±µ=+W{~é«€3Ö&©³NdL4‡ÚÍõvŠŒÜK«ŸûÃ[ÍP½2gÈÊy’]»õ«hÈmöˆHo¾»8,Èžú˜¯«(örï­!k{º§çI€MÄ”„ÉÕYX¨Ghm)@à ‘71”ôØðƒzY±T#é`0ñjõìv €‚Àè±XÍKRÖè^€@2ë­àÌ­“ö1‚Õmd{J¼ àðéùcŸ= Ý‹ÓîvàußeÑ5³8cM¸k °e„ èèöÃ>¾b³=À guGÐ;IP`å×Ïdk¯ õÓžóäõýŸßý5«BéRƒ  ,w ìBô¥-íƒ5g‹zÂB62aÀæßí›Ü·u»L àÃÞé k×|ÕY{¿Ç~ĺmÉÊé{Pï‡sÓŽñhQ4Ò4O#€ž0ऀÙ@²Øˆ’ ¬+ €P%Qô­ÃgW%€J(/€T×7þêЙ––V…–œ2xS·l3ÅÁEüÇ®ÉÙ» €÷Ã=wŸH$œÑ2i0™÷‘\@÷x#Lö'lby¿‰D™¨nFœî “$5>ÒÙ©Gñ™â7qÕ £ªÜ.Ó!ç‚x•XÇ) ˆg?ȪQ_Sr)¬…#û]Êx½r*éÊqö*(K(“›×ZÒnÉm)´3ƒüŠþU@[k/Z4ÄÙ®nëLPÙ/g¥A„/DfŒºVÖ­2™Ê™ue›$Ñ×kÏ=ôÂxCLD¡$Òðï«3$‡ºqµ€rì×| 8è¬þ½™ú,«ïòXEÄ‚ˆ&Yû$¾nw¹ªFß·ÜL$À`(½“3ÐÑÄ©Œ§òtÓáóï! @³ò>Æ®,_ü‚(˜²J™ªó5‚ÓùLö¶Ÿ¢‰´qÞ'qëƒ ‚&q@Ò‰®)÷‰-ðó›¹1 z‹ýÇ\7€ð0f9Ù ``aP…@!€è\BÀ£¬üøæ’ë Në-òžÒÚoê6%ÎE'Ÿ¦Ò?Àóš_I ¼x]6L&p÷övaMºk"'€np&ÎØ´. äÞ6‘(kLÇz¨„Ô€ÌÕ7Íõ×FÉ9/ïYèO /å³5@æ÷YdJÔn¼^V4 ?éj@éÅyhàí£iýØjê€ ¾| ?­6·%ã aÚ(”¤™ ph¸nÜK÷dÏuñà‹9®·qÇ>Å]Ë%Î܉Vn“õví¦ãòu>ÜIÏD¤Ë`x¯— µÈYçdo7Ý™Þs¶ÖªÂŸ6­I»3Ö×E‘ ¸É€°xïû-ÜAŸ :_û„…ñÁbüØ>7Ÿ¶„RNƒÂ·€%P ß‘™CŒñ²Œ{šfÐ1¶!x^JÜàâ!ûÛWIÛ–%üè¤ÿqeTòÁD…'7Óq©ÚþàóÈ[g€×éµ9SŠ2šo«/28Uäyæ8¸¸èÓ@Á÷ ñA ¥´Ï÷âOÛäÁÁ¨@åÙAU , žçse&†OiÍŽk GxkùG,-¼¾îä~uÈ].2÷åy ëäb^š24²¬%<$¥tqî;y÷<ò£¤à#¦¦ht”•óÿuYú¡ÃZ„K°ýâ´˜½¾èøÞþ¯Ù·ŒØ`®# ±ßù+‹÷ŠÎÕ‰@`€ÔZøØD KèKÔ ëùô/ 0ÄPJ–a° Ø<ïÁEgLQƒ8ã9‹TXÐ H¸i0  ¡¥â0èÀ¤à€?Àþêíâ‘…Š¡îÖmÅK\/iao®öøì^­zF̈ês/$€«¯‡¾3.*¯ß8ßà ”>ôG9õ¨57'/€m;6I/D¢e¸®Sù܄䙀à«ÉNŽíE'ÒîÐÙlãõmRP¬sˈA3a¦(·Ùb9! n®?}ì­QϳA­ÎωÿJ°jñ„„¸¯Zï?OçÐ3ÉŸÊjñ†ž}& IàÏõwdÖS‘ÿþ½íÑ{CGRÖìh‡`­þ}RÞr¾«ÐÓd¯4kaïy0PH¼‘`Àê]nHRBfbqöqé6¤^ˆ„¸k3çcì€ ô@ pi”!8a`´È&ô¦øvÚuô3j«¡ë§–ÁGB.ñS›Ó€wÚÒõCËr¼\$Z€ÿès³ÁöÜû³ òC#%Ä.ÀM8ÈÌÚBD€PFZ­ìéÏ=WFÓÎy_ûøòWžÖz›ÍEUMÑ<œSDD¼õ®/@Ò†P '§§Î.çÜ/àìñͦÝr·´!“@!Šé_ñB(A£8“eÂõΕ<öG'½#?J–4gßy9“)±”Œb¦Ë©sk1¡€ñƒ.yû‘šO5<³ÎÅÏè–¿O£¨²+U‚˜Tn¿™/<üt™eHѪ.{€ªôGåOù£A+JôUžºU m© X‹Ã¯7WŽ­à€0Ùm ’}؃¦º»¹àD ¼r@Ó zmÎp<ðC6†î,u Ì@ß@’ÀÄSuM}çÌÙ,Ö àºð Àµ@`i]©º0CMÜÀ-sØÆaü§[Ι 8‹É;v„° € ×D|ÌŠáR¿Õ-áíÏ.}Óž›kTÈ´üÍJiø„΄gß³â»ûо.„Þr–Zï¿`ÄÅ5‡ø¸• ‚Ÿ7æãDW,SÂVðûä¤j©»¶õÓ1G… ¥Ò§ñ©¿]ë«ù¿M–+(¥SÍ©»IDÔuža“9]$Uø¹Wëôɽ*x±fnuo¸Á*ù&®Ä öÛ‰<OggSÀÆ &HaàÈKMJI]ehXhahL_XSWÿÆÿÐÿÁÿ³ÿ›ÿ›ÿÜrÙCßúÛr‡[·^ñ!íÅfµ$Ïoýš§/²‡*S-ipkü¿Êµ‹ebkÊ%”3üô²Äݧ ZÉ1ŠOÐ 5ò]¬)Óøó„”n‘›6è%§\®VÁÅ#ˆ°?@s×x²ÁM\yK°W^×j‘=[`½¸¼ÝŽŽõ¦[!1§yhUnÖL"E@ ð¶,´v‘ ³õKNhÁ‹µ² Ïì õñÞüÌóïî°RT À¼Í+}í#uo9jéзpí:íßXz²ö°‰ˆž{iÏšHŒ²bº=¼é%ä~É3JßziÇ©Õò=¹±‰AXãxzýöýJ%Q-ξïlŸ ƒÁ}rmѤÿ¤k"Dã×Ü­BUÙ˜øˆ<˜—w¤ŠÁƒÙæÛïÁ¹6½âE{Äéu°ã¾KK×X4˜ˆ>÷´ß:ûC;WñÏy{ ÓŒZ¿Û ùžÞöÂJ_~ûÛ??q©ŒÌŒFÑ+¦Ë¹sÅRtm'öÑ/z44Ìnͪàö×µB8V­ø¢Ýc…4.4ðX 7hÐÁ&òtÊ‹ù‰µœžØžÉGQô¬/Ç+e„£?È­íÿü1|.½ºúyW>«þ˜yùzý“ôA²ßÍé_^Å67"øMÉÄfñ…ªý5Y#ß-ÖZ Û™¤B¾ýéÖo#Äõðl4jÜêh]B`?‡þRø¤t²ß4qŇì¾z=ÇRàOsúQ/J¿‹þÉa.YÁvD}wqµ—¥6óSégºæ%nÃùù¼N©Y)Ëã 9”×(µç»¬ÝGˆ’CòJó¨E¦¹J„À5£ƒÅ˜1óÓŽ(úàÃúïŸJçVîù›YLqï::3i™µ~Ž àí.*žœNúÊoÜjÕa¤ÚÍ—Fܽ^ùEytÏû¢õj¨?6éÛŒ@òζÛ Ä-xdZßB‚±hMÆÒo•*Jò6§˜}o, ÌvÕl?¨-ßЎ߬Ø3Г›{êµòî÷h=<ë"îíÿ²ª©„wÛ¥|zŒµœ,nFrÛõh5ì¥RHQQÕk}ô²;?` ñ#|–Z¤–Õð±ë{-0Än¡µ²ÜÛ¿ÅòÎÏÙ۾鲗H‰q¯õÿYÌʵsVƒ.ס¥Ã˜”’WÖ«ùyê(N„&P‡ O¨VvnV7„¨Õl{ŸÀQ†× ‹Ä‚ÅÈ'¸á¼µ\!cÎõ–t!°¤´±å,ýd`ÑÔª¶¦´¦XÓY¢U«ª¢,*»,Úw|gSªèqJ°®T qÉ!rèRê' `¯.üz 74Öq¹ÛÅÒ ª‘µ±~b[QP(Æ/° 'Ö‡²ÑöRá"E#*šUKTjУ*ÕS †(UiO/U…Põˆåy]Ĉç·Öv ºûõEBÆVBavêzÁ>@ Bó»RÖ{qêÄñz¨8ÙìSo#;å8íP_Î,ÖZßúŽÚèð¦êJc… pk³×ŸãÌk½ñnýé‹9ÇÎo™´í¿ûzr7O ™ÐkæÕì=ê¸yL!]âÏ—]{ÒÐÖȺruÎYhþÔå¤=ë83Évd}qêÈ@"Tö%%tE"Åö£N z®×³ÝI‹^ÑTUIõô*ˆãÓ]™·8±bÁ´Î…xn˜O‰’d%éÑé ÖM;z4RóŸoG›¾âýóÛ KÍl¶é“+Ý çÝÁF'‡C2›½aªö“ïï¡_ކ‡Ç\ {HqË ètÎÓ4ÌäN0ÓÕÓç´«èWuˆrMÝëî`{ 9;Î@eA)ÛœS—£¢„m‚°I˜ÑYžï¤zãFäÐ0‘z¥¥[6pîù§Î|’.ŠÂ\¼øp}ãöñ2`ãíåüHâa!Ú!OȾ„ôTh¬‘*Ÿ2‰Øñ• ÿÛE ²Q—AËQˤ_b9œ¡ÁX›Døá½Häš…ŸÝ&‹Ü–uÚ-ÓÐÈRV¢<1Ÿû÷¶f|ùï ø¡ßµk{Ë–É&Œüüfi´éËQç‘¿4&½ÜR•e¯ÜÕ<ÍÀ9÷›mêªÍPhyÕœ7ZÐÔ½MA8Ý»suO¥‰™©Jmñ¨cþ˜wÕØôoF÷–e(«¡òdd|Zá¬#H’ÞŸ¶–º¦sezº&s×®Ñpzšÿð»ú-&_ÝG <Ê 0?“Ð$£ûñ,ux¡•ç/yÑMuxvAðôÌHÌÞÔŽ™ÜC54Iý,qV—nús‘§ vÞi÷$Ó÷áíó¸0 p}{ù‘søûŒÉ©Ý¸É¦¦-ÖÏÈÙCßã-žÉ-#ÉF:5ï[/Ó)¿ “Èžxæƒ+ÿÿoÂ¥;˜KÀ¼Ý¯ç!¢éÝÈ'Xý VâÊØìFé¯cÀù€€&y§K!ª¤,„T›½ Ú hó%ïÆ ½®pÏ8Íe`,C ÒV +q@Pbé¡þ«=| $ ·Ú¦kT8ƒì·Ìº¡ —óïÌ¢l÷Aå@Ô’ Ày$Ò¶9Cƒúh´–Œš)«H%@¢äÞë›×ÞÎí%.§Âtótûròlüã‚ýŸçZ²ùÏö}©ìuð¥úáè­ú,ÿÈH7^Žý¨no¥äâ•©F¯—YB£EÌr™j½ST\%éúbÂò™Wœ¢že ¹ Cö½ü×-¾Á v?K+#y§´•ÃIõ® ^˯f™áîÞ¦=  ŒxÇÇ"Å‹¹'ýèÚ7€V‚-?×€ÔØŸ¦·¼mØ©© aŠ $kWžÁøÜMˆŒI£\Íòöª¿‘ø‘¯¥Ûä€ÒžÛ)% Lùß)²ª{'Rÿ¤P"A Ðm =é2ÛØè•wÌ%A0‘þÛ6Ð-1DŠ ø‘lP3s2ŒüÝÆc†¸ €Ìîv×Kà0ð¦(&CðÇ-íˆC¬›û›mà¢Z. œÀƒÍk¢ÑÑĤ”J K@Y^(Mé6«uçØoGFóÛÍú–ók»›ºýÏ uOVO7›d }ý÷޾zèÞoù2Ÿ—“Hr¢ XéA¡!Ð(%ÓÑì¥ëìßÂkwßèâ#«ü[ÌC"7ÀfýS>ýkÎŒwEZ´ô+ÈZÇ¡ˆr#gßÒUMÙ}•^è;‚(ú±8Ó<à zt”29]¹n¹àÀÏïÍ-=ÁÍ”®¯O83DL› ³;‡žsÛÀäÌN5©OggS@ë &IG_˜ÿ€ÿ†ÿ“ÿ”ÿKNPQ[`degÿØÿ¸ÿêý,['pç#ÇÔåÈÔôX}öÕ”ûúÏÍþš)îGpù³ÌI(“‘D¾=ÌåYòºï’Š¤È¤ €SªÍ=Wº5+WÁ“0™0›³û/3kRgƈE@±&wnóÇôêÚ@^‡töý÷EóñÛLê€m»Þ€H°¢ l°4@_¹ Pø“6* €…žû]Ü5Î"¡€k-w‘gTNô’à ÞÂøPÞt>:€óHœiÝÓÐ`6’ÌOmM™b†N(À8„ýÏzÚõNº½¸ÙíÃK·ûñ¯?@èãÌÏÍU`7«b¿¢  æsÉ¢·ê²ùlÈ”û9D¼¸A»'§÷_÷‰u)ÿÆÄÜ«$Õ{XϱF×”ýòïÀb•œ¯ªÎÜc¦D®sÏÜþÒ“ H'᪢@jŒ/ÞkL4 vCCœ:Ø´MÛÓ—×xȘR/ °±~“ƒf²šÊ¼~šü¡ë €yúuwº754}Ñæ¿úÕØÕ 6Ëæ·ÈCví ŸûË®¦ËGßî&isÓC}ü%/I?Ogôñûr”8ÐDLŠ3Û_wwô/û›õî‡bq'ÕùdÍ|ºÐ@N;óLUWþUsÆI­U Lv`$Ôæ*ák!÷๢à8€4¾û]Ý-Ðàì N½ÜÃ_ã±X$ÃÁ„ã7Çób–½z®h²×7€n Þ™2ZÀ£6Hظ Hì#g='ÑFÔ”" aÃé6¼\»þxúýìuÇâò2rÝw¸*®OÿCw€„\n¸áuÑ,Ð) -ûÙ’/"6€|èÂÊ€>ÌÆ5–_ü¨¯Qº“´¨R2ßm§¼‡U>äðø©ðhæžþ‰GÈÐóÔM¢•Äô`ÌÞ룣:"zST×/x|i\|eH¨oÞ ÷f% !œü·1«>z½pä…sjPÔÀ0è<¦ëÙálrTÍäôK;UÉ2Ls`ËÝõô l /3b˜›¤N¿ÙÝg6¦ƒ†iÆ•¥"®dÞš"ß̵!ÊW—²wLS“¥?T7òªÈ‹÷î·¯ÛNËfÒW KóÓû%hf{0 4¸šÜËz†žþi*¡Á² Úçjº”ÔŒ)c.â“HéP ¼oÖ žû]˳1^t…±¥à´»ÝÝ3ª…N1¤àòàôÞÂàð2½ |¬Y±íûÈui¬¯ö kŒf&)A6œW ‚ôó}5¯ýòò¾Ì3?_ÿZÞV =ÀAåöÉK&åÕÁb_2œÿÍ÷®OµÍ7Äj=å@áuSÞS²æ—Lå«|ûY} î¿ÚÐS×Â¥¹öÁŒC,y‡{öáÆ´ ÀBg½7#@}_‰âºº Û™Ï!'2fƒN¾Ïxiå±êÂ+ðäÉ{cñ„ ŽƒHÌ@ñ`ã56×ãÏã§g+ÊR»½Z¾ÚVªZèHl¬ª+î›ÿ‰²23 êÔÄqÞ)/[{3Ý”Š‡—çÍsŽÍ‹ÿôÅ>Ý4䎟JnWS™¤I>ñô³=ʸkOÝPÿKΘ†Íþ‰­;‚nŠÈ2OM†çH}sêÙ $ÐteLž©!¨<  #1lÕ²ï“ëŸðòãaVà«<;«'áÓ#š@â$†(¯È‚ Ð p8¾û½ÄWÐD4m‡YîbZXdG«àòà <+ô±Î¿|ðŽÍÕîOAÀöô«®Ðp/ü‰³E‡Í¨³V ë0_UšI6ܨI²&Ô°Oû/·Öå’Ôýê׿ :­u·‘ϥŃ8Gõ 䘫=÷¤ ÚšÏyà—!Û¾rT´ÀwauÙŒ'šóeâõdÜ£0Bj7P(…Á͘}Â6\óø°E[Šâ3¨<Í- }¦:ɰf¢8ü\È#M,{Écm³l·_’I†"€óÏe·ˆG>ɱ‰z'º/ÿÀœßD»úÁÖï{ÀbŒùûqý„öÙ9Ôç •õŸîž‚™„éur˜)¨”iÜSÖ'Ð3ôÅ~v¬yôqЉ*óì!“R|ÓL?3Rùœ ¤Áä35çþ픤¼'ë`BÓq—:†ÍÍ¿•"¥ø–ÂTÉ€$l@ÂŒÃ&â¡Tø;V¶þïÿhÉO=âÚ§ë>qm§OÄ î\•OŒÕ¨›á»íõŸ÷»sÂÔˆÔ‰oÚ˜-pyiÑ_K€Ôa^M^µ9ÀÁ %îRò*_ßÞ ­Kb8¶ÓîL{Ó8kÒ…î”Xþ¦O³8Þè*kA¹qךȽ`à5›3ûxoMq÷–·ßué†*2"j®çøÊ»'®M¢Ë 9ž”€‰§ÁP É ²§H&—]§¸«y»zFô25ñ¬Í$-²d¼ ¦zMÈÝCçD¦º@¨¡QÁeöýCIC•$Ž@PÓÕäÆÀR]t•¤“³¸»dóþþÔÙ—+`FàÔñ´,.ô†ó'„þ‘ñ–µ[÷¢à›0|u¬·¾Ÿ.î©R”3Ú8f?{¶¸tgèÁGÜ+n¡ÏËß«•èéÝ;fŠ`±dÖ ó¸Ô–íñÇWȰgõÙ°ùÔˆ­¦~€3HàÆŠoÓ.óå<ÚÚ¨²zjïY/me:vÍouvĶ¿Ÿä ̃ÁÎIØk޼jå·nü.YW}®Vá‡=õT…hð?¡ƒ€‚/üC¨FCú˜6¨Õ¼§2}~bU©Ðänÿ½Jœy²mÇÉüw3ÇÆìi Î`í- üŽÃ/†õ“µc΂ͷ`æa=Õ?€5¦(,½dÅ·àGܱnÐkn«iõ—26‰x/âšþÕÑJx‘æÄ?#Ïwn1íI ÚLS6oF8­Ìz×l·þ2Ö3VêV}{”jŒ?,îž>_îN×* @®V:ƒ©×\ó\Ëö_fs4O|n)ÆR{séÁ¿ý掗–Ã*—n1³¼»»™&>OG•ž9`GWõ]›¼ŽÃ©á¬­ró±¹Þ<L8¥£ þ\ m¡#ðõÍÁC>Ðãñ¡Ãªrñ|í³Î˜óÉ™ƒ÷ÛI¯Ô’Ë9ûr½^C}ªb[Îç#¢T«Š@73W û—êòx<õ|Lš „BQk—&B"ÄH+”T>M 4yžqâìáEÃVÄÐ’ocè;Oø–ïì{DÍ'ñSF÷çùüòQ÷U‘£ré⢟w©ÏK—„a0oź6*þ|m™P8z݃nʳћÅ#—/A´f¹2°lá%}V±œ¨Rø+ð¨m¥K.6ë5“æV¯åöì¤çß™%õýþs\Ëÿó)*qç‚V¥¾²úpED«‹¾âìÞ—Ãöù "…Û³^)~lÅV¼qì«¡´R”˜¤J-Sêwžä!ÂÈ”Ÿäl«szn)wh&tšé¿ôçK_½›‡éºAjqLؾ6ö{‹{˜{Ä0½2úãðèö-j³OÁÎÚGÀON%É5‡o¹GΗ'öéøÜ5§s¦HŸêç&ã?ÜJh˜§9œ¨£|yÝ0°Xþɇ¤ª/¸jÜÓI3ûn˜Y€&ª~ó9Iê] aDztDgß…Q‹óÆ"ÈoÅÚ+益k–ǸDäôäÌãÉšÆÐm8ÀÊŽ–l!¢’n4bLŠD1¤HÀFwVü5»k½¤&XÐô¶á1à¨Ò—q«ƒDüÕçβBÿL ½è|ÄI™³¦âK²š‹R’€­ëë¡ ½2¦.A^ì=‹êtÐk÷j€¸A2½{~$RæDoE~ØÖå?ø­m›t„UÙ•ÖÔŸiQÓƒÆlãòáúHà›¡8ÏpìFºLÙæi­ïîRÿä-嬢ó]ðÊ1ue1m(sì¬}=µbYÌÙ%¬qvË1nÙ/)ɰö¨‡†»e*ä2 Àºƒ(` U¬ ÿš¯O…x%‰n­°ÃN¹ùûÁf7lè~Ó±ÌCgAç×rû€}2cÇ›¦XúëËéJåþÝçþÅrèû—ƒ¥{ð3Õ¬=N=5%Ìåßî{Ò]ofæÃã,†šóÌ|¢é®¦«Øäy<°”Ši÷¡ºzÖïÙ½½'é¯ÑQª,œ]œé!§~vÑÏXõB’(®Ýºé¼?žîÎöINg“gWÿÏ?³ó¿²ö0$ Ä|•‡#L¿Ë¦yÖ>-`7 Lçþ|{ÝôBoaŒqQL¸·{c„1ø¾ÀÂrP”z[Jíë0,Ë_@à0nDˆôC(çqbôjÀ8¸ŒhcÐ-€4N¸¥¹w[Ê­Ó¿“I~˼Ÿù$™w«í>bˆO {QžzDèoLî¸Ìo¼5Ø×Õ?øÜÕfÒZM¥IW%(½œ3½—»š_÷8ê_6@€’wÿÔs˜ n@ón4*þa„§±¢Í!{ïZ]ýøæn{¤2~*ç½OˆÌ07÷. pwÈl!Ö×–ž Vî‡RÀþÝ€“ é”èž ê¦šJRT‡ÀÀü˜ÔÒñ #LÆf@±v¥Ÿ¬¡x UWCž,ò :™ 7Oå7§X8F'!7†ÈÏ&ÿ¿Î…â뺽»éMÇŸØ šÖäÒ]›bÔ.UŠÈv4t011—Çv¤™c†›û;ó»'©®ú&ÔÇOggS &JRЙZ´ÿ«ÿ›ÿŽÿ}ÿ{ÿÿ|ÿqÿtHKJY[[y …©ƒÙgXy¦h ª¹_¿)÷Í/?ÃÊ"œö+ä±#&ÙòUŽI“$°CCqþ}öàŸäuÕ^‚©¬|^Græ 5M²*™ûþ.•ŠÝ“O>£Áœý¿8W[í¥v%{à=ƒÈûs†i ‡;÷€oœ¨AùT$W5μSÉÕA*„ˆ¯‡ 2‰.càÛÛ|˜†×€PwnÀTI·¤]%ØS¾Ë=cŠF )1äfwç#]°Üo€ñ&|ø?Ø–¹ßF-já­æMÕ˜\>ÒdV‘»Ügý)Ž!¯úõÍ$”{nœò‚J(nîÒ’„‰LØ Þ_–ìxÇ“£MmzÐêT^c!»Æã6’·Ý :[!Y@öWŽ~ú U¾=à7Ö³ZÉ–|7íŽkvÐÈÌ·ÍÚ Ï›RqìYËF^`çœA·Pù/žW”0¥LCC±ö5òr29ô€“Ìwß¾l´¦Z??ð.~GMìeoB$DoD©÷³Ïn ’ê:TW39™¡3“ž€9Yêõ×ýßÌ©¤ûj`ª0ƒ?Lο7-Ë»Îd4$,t¶wîJ{õQOTeØI¡ =Pì&iªhjÝô›oúvŠÃ£êµÇðltßÅ÷GÙÉ>HD&犗¿Noêæ`£ÚPO·|úEã÷y@SH#Qàm^½ ¼¬ð…IáË1€T"‘À €âSc•¿Bö+qµ¥xJ4£[RõX—0k²îŽ¡^û]Íb‚Rnµ»¬ñ(\ …éÍ“øl3_Æt×´'b ø °Ÿô,}§¨mÛ¶ªª^Pœþ™¾Üd®yÕî¼6¢œãÌbºª»ÿÏ6P ¼M}1*ŠäcÐ]Ÿ8kpÕä³€dk…süʪüIuI%€AÄפ,4ÂÇ6ª h^ù‚;0M%Ò˜S… ƒìÆw𕧬›Ö:;üè+,êú¯˜…Ù5»|üûºDæ¤i(à›{OO*Ê>¸!!›=>³ö$ÿÿ”G„ú{›`>kzcj¶bëL Ι¥·7=1È雩®y¼É6¹ß&³¨Ôt¯oC]†ª,4§ NSz¡¡²¦i  ëZFoMQYLC’ÄÆüO_>;…f¦«G“w&¿~ª­Ý$tR_ò©®]Õû›ý×ûC?EÍUù8kƒÜOô»ªA­z«Èý“4»€¿Œ(]6PH¯´¤;<ÜtUþ ÁF$JÒ‹NÙbÐ2½¥¤(@€ƒ€„^Y ÚL/¡‘Ä z@žû½è5‚‰ @.wwsh)ß-À7€Q„û—Ò‹Oûº¯¹¶ÑµV š)\€œ„á†-†ŸuÛ¯ÿö½1«Ïù @>ßoû¯…6­Àä3Å/J(¯„j`šlúBñ e8›fr¢¥pÿPœÒ*n€¢’v2œ§áÿ£˜ÿüÌTM;¡Ýï’™þ?æKûTç~jަóUõ`èÃôôºÄ_ƒ«箼çÆb¡yå-ïoÖÐ2¤½Å›W€1Ö¢\ÀŠ6€Àh1D>ü}¤k…‰¾áí¶nC? ¼ÙGs‘òüšÖÀ7€¸:ƒ‡Yg¢¨Ž¶MÂT™H€œà¥»Á3.7Ì!4™ÌÝ_É+y´~÷'ßãÛ® ÃËïù$ÑyS§“Câ¯2v|Ú{”58a¬Ô1h¾ø Açw•Gu ‘{÷æVëxoü@ ü·—ÊYù­"}šd ›h¯Ð´ ¯D§[Ÿˆq˜}>ä]Ü û=vÕm3ëßð˜‹Ç×ýξt$Ù/߃ ¦“J .j”=Ÿ:Ç_y6¹Ñí?µKæö4=]›ºe“Åå{ñíÅô»k ³}mǘÙ{ï7ëÅ“¥®&‹Õ;‹™•çDòVÒ`6 ÀUüÉóÐëÄÍ~òPSéfCVóòž†‚y’œšà0M–˜¶ rÕ¹Ÿõª9 4¹kê:ÍæåO]ÔІ&«W ±€ê,$€€W 4xÔ#ICFÚÊÞU‹káÁ@"6Oü½¦{j& šd|¿Üm½‡¶`H6¸ßäñ!¾žäM=ñcýéÈsW‚³¶SÜÒø¬>¼6³¨EºLXý˱Òb¾nÕ‹¨9©cðßQo1XÚsý³örÆgo ÅäÞL‰W]y©û<1t 2Ú @` »sG „hÒ¦°¤<'aÔéA–À“ì½Ã14Ã7v5ÀáÃìpÉÎ"ƒ¯-HÀi¨åbªjz‹\´—!;ÉUL×Ö}¹èfó5ó’]ÀPÉÍô¼l§ƒ}d§ƒ·ÿ•fzªk'ÅÉ‚¦l°á"À/yÛÌ¡ ¿C¢3‚ë/Öô¬øÿ¶ÿYÎì3 v³*›Ã=FÓP >ÎpWã]&6_xwg¸[±;Œ©­ÿt澺X¦MeÞ°ê=‡"»¾ÿþ];åýöE2iîêÊ©g<•Èt(o–*•z_ƒÜÉ  _ FP¤Ë£«Ÿ(¼Ó #0Ì x€‘³Þû½•G´¹P†Ôxg¹‡µ‰„ ×@N$Œ¾†ý àÊ€‹.ë–Æ6XvŒh}´&%3a’ “©V›¹¦HõàÎéç{d$Ö>éý¾"#}ÌÁZñ×´Xφɾ´šÿøy¼Ë<\N¨’~~G±‚×ïu›¦ ¶ìˆ[ëKŸPðjÛ&„ÇA|›1ÏzYvŸáÂã3ìü*ƒ © ¦Ë¦“ûü› ÒM2¾0hèý[_Gº|ït²ÕWêîW â¦Ã?¾þ:³®¶¾ãÁÐÀø»¦gÏó^Ï[Ò¡'–½¿<Û$}OÏôPÅ$mÎ11uúyÿì$àJ5ªf×T6‰©®œ;1÷‡kØ :“d vOͨåÖdQ©‰ŸÖhŠšÆYuU=•½¤²ßïýŠ"æøœû+/ã™Îbª†¡®ÒU1cû¬58»Š:ïéóÿ×hŠnH6ð/†bÖ²cEB!.Ô#0€^, ÔÛ¸Ty?À yÇ@>û=ãgPSoìvÕÏ Ì N?Ï–³CÂ,;ߘB Ÿ,\òQóamÕ”˜’„ WÁR[Óä-²ïϹAôy»îgânì‹äù¢ßA½æâÐj3òðêd½ÚU76EaÎE%Âx¼• c»®ú®«Ûåd8 ÉJ#ºXP4Ó³téLñCPŠô“ã°Ðöeå”7Ÿ€úçiî ¨®QàNzBÚŒù'ÚŽ€[ù„ò¹Ü_äô%(M垦² Èo>Wå}ýìLhÖÃuçÎþüòxó—"i¸'Ù|rÊ z²qÞNÞ“\@Q ¸ö_8'àÏŒ€ßÏÝUµkÂì®§'ûeGï{–æ©îgó^ÏphÞ¦Ag’<Ù9Ex9 9=œ·5e*×ÎÉz¦ß˜ò&Æ}îìëÔáß—3ž^3Ü4Χ”@‚I8¶!ä0•js„0W »Œ„Ðý'Þû½ÅÏTwPl —{õ_¡ Ã ˜Hr³‰Æú °m§ÆÛàŽ õцÕ$Џ™`[Œóóèkø?ø=_V[w¾Ë]tmö”qb§Û°%øÉœéµÁS;/`¾+ËÇ/Ft:¾Ü“nÀ´›Í|>Ýk©u^¹DQè8\×îd;.ºìŸIýð.‹ ÁÎKôÿi ‹ºê*±#ðl¬ÂÍÄ çªœh¸~(¾]Õ»!q«Í×Ékû'I~:Ú LG¼s¦7DrƒÙ! °wçM¦†7ï|oܽ=½¨:hàÝ[>˜H¦&r°ÝYŒÞä}ðÑ †Œƒbeßo:/ôÀ3YÞ}Hú*ð 홤€‚š)FŽîh">óíŸøí“½Íï*«¹í¤@Ýs»J¾ ¦ –bP5/SynÜíÀTÓ3óZ­Xn€=ÚÍÅ|Ü' { gÇ6À0`Í]ëÝÓW’óHÓíHŠgM(Ò öùùšß¬mäçß~`ÏÖ¤1Df¾ 3É$ Kr÷DZ× ¹LÒ´Úzíòú§D@Û.·‹º(˜È×ö¯&D™iZ6<|¾fµë=õž‹_|ªnÝv~w¡sQãË:e8¡gäóžËsº›P½mU#I8ôàƒ8ˆíé3uû>›Ç;)@‚ü?7ƒÂCK@’³cª€qí¢ùå†ICž¿öõË+Ù0gw7ÀÀ û0¼Ó)ýÕÓÒCNã§{è)6y²ÃŠõä»ß!s 1@ ûYoeÏîiàf?wþÑ?|–ûEí®D0>¿cæ¸wõÛ«È`‘ Ù'91Z5o{æ:عk]²­ÄbœsHÞJR FS­†h¹4‰_¼Õ7]›º²ùüÞ5Mg‚ÁLÐ~jïÞGZÀHàD”æ¤,·„¢0À€µ—DÌŽÛ‡†ØLZ"ö[?l@äÏxÈÀf€’tøY,Ö¦l&’xIÍDýÂÁüPB­ÃQüêuíöœgù2—Qal¡úaNßÜvçg Øóç*Õš^<'ñõñÚ¡î‹göû¸,‰\kÝb%ß¶>†mÑ÷îì˜7õnrä~% ?íØ´‰z0mXïRÈ9pHþ¬Ä–û/Êæsï»âñ¥dÎ=¦ÀJQXžÞº°GôùïÉ[«£8gúÚ¹>ÕþŒw­r•~Ï­ÙýKí k^ÁfŒS.€¨´Z×Õ$>•æK«æ„óùÎö‡‰x)äԦɮ‰ßG¾¿Ù+‡~>fí\Vñ†¨üY¾Ô4צ«ë9ß;öúzl{µã8Žc¯q—¼†k\03Ñw‹œj¹5 •r¦-f±ÕzŠÂ„€Í¨Ð«øÚè¼zó÷Qí6!Š~Tu¥ZíŒÝKå„ajYÒª½_qEPÖI]¹·JõëXž…ýÒq="þ ïˆMA ÔbQnÄÉÔq^kE™½Kj. ,oîÇíZ&ÎÌqü©+R¦ê5ŠóªÊ` è­–#.tI÷Þ²ÆMÛラwÊU»,V$3AôÕË׿qìû³m‡J‡oOggS@2 &K-8gù`a_KHObgÿ²ÿÞÿåÿÿÿýÿÿÿÿôRQkèRylvvª6•¢ð${N?­ûç8 ÛôIÐÜv?Tç¥æ¯6P*™kæ`%.Ûó[ý¨ýfùøW~ÖŸ‡nM,Q‹zTçåµÚ¡¡•W²œ½¡´TC.ze,–—SRbäbÑH BŒ–à›µ ÜiYé”sÚ©£\£ËQ ~£•ðìÏL$éÓÇ«6QêæQú’‚¾–×®¦¥¾hJõbTQ”Þ»—>‰]ºTô†‹mM~@¦P%ÌNõF²ŸK’p ˆ‘̆ f áó­ë<ë«ÛBLH4Ô»V(Κ‡­•Ø÷&,_úX¢¢æí®,ñá¯C ) §ƒqx ¹Èœ³Ž©§»-\Œ=ÓÃWÅBÉëi »ÄäZ52) H»S‘Uiœ„ãg¦½ßt¶U`ö]ÝŒ?îPLh5ÑV™ès2­–÷žÊóå[j’Uš˜jäÜZK‚8Cu 1ˆ8ÿ­/¬JE®aøäФ&÷£x£îÐx#-=ÜÏ”þÒëýrœC=*S§cdK§ûOQ}ýæ4gm½$!î\?ýs´¦‰ïÝ8šëÈËsO¼VBÅx‰]eîýX­Ç’„ bÌZQcGf³%jµRÄ”&iDö´…›ÁE‚ì†7>èŽæd­î÷¢.'cÞüðÈÍö𲣟üŒ÷Äû¥ËöÏê6¯áÉìWãËñ¸úwÝR¡d,t]÷åLÕÒŽ‡Xüa_'ÈØp «Õ‚B.:ª=ºÖ.`2¹E‹svî~ÙÚ‘ÙÎqýÚù±_ãì/c‡&£¯ŽüæO€Ñư]›"^²´2@F ½Eª÷ÉÍT:×;y¾­âvÿƯ֭žÕ³4³ ¢’4³I%+Ez^>øÝ…Ö_ostKXïÙ×Ô”:FkShLöš@¹HOG•¼Ù)”17•"§F“¹0„&Hp÷¶CVH}‘úR1 Êm”bZŒuJƒïœY†Utå¡4f"ó±®Hu9œâ‚èéÞêµÁC-Ê Öê²ØœKÍ&»g™Óij°P¦zÓô]d÷›ÅjMU÷,EÑvOs²95½cÂ^¦ÃË©FZLAB‹¡¸R¦Öþúh¿mÀhŒ¹G M;¯Vÿ ÜÛ¤õQCN²¶ÕX ¨D®MW3tú8)„ŽV§4§`XCaX²X,ƒÉX^ƇE]ð pެW@–…Љf¦ãèVL ª@q @оýxh,Ahé¨s;³6x¶1`§‘Bw ¢`ÿ$ þËíÎö¡t¢ì¢½Þmt;¢5½@Œ‘Ôï·>Þÿë;ú“‡4Cë¦ @Ûî|—@D²½k{`a,^ë2€|Ëf~6€÷ÛºR[å0é:FÈ!{Œ«+÷kóò«tÎu›5<5§õÓªAO>Ps§_¦þ©Þ HvÔ—z˜ €ÇÖœnåѬ/žP9ïe*ƒŒÝQB¢SŠO•PXZzdŽ Pv6!³7Ooêa+ŒdyS¾H´(ebc}ca¥k'…pôô”zá ÚOµ) OÈÚ3¼JSÎ)D¦‹£îA+&ïõŒÃ´qB4V[[' …jºrHHÂU]‰Abï(´LŠœLô«øÞ¥{da2˜$t@ºgg@·Îq†0íØ#´ÖÛ¨!¦hð@£sËÎì‚M–}OC’Eê Ÿ¡Òs˜¨8!rªÈ¤“𕼰:½"b€ƒv•¤Sf†bs<ˆE7ääT»S#£ ÕüQ©HT`Áºv.øN¤ž¸º•>‚$™¡ˆ h €Q„Dz ÀXQâaWM,¢[A@‹…ñ ^±p»°mde?I2`ð® —£þ{mÆAã¡­$’èåJóÐèŒ$Ñ»EÐobÍð  •à©’Ll B~ à ¬ÅÀ “äÙ,ˆ<€3­€Žmlôæ$eŠQMa W‡h]”DúßûÿíEçðC¯»¸=×;ç“ÌÏ€"Ñ1Šã|W¼I¯íRŸ³?£¤ŽŸQÈ%g²z ¥à•¡¶¯Œ6×BFÒlŸBiýTÔ94”$w!C^&8Õ$øP¬6½¡›\ÃÑ‚Gu>|¿¶ë%û¢Gï`.ŠŠ€p­s Á̹ZÕ“eå0ꘫ÷$Á~æ(ÈxûŒ«³N)QUL“Yt™6Ž(]™=ͪ:,k#:”íŽÌ9‹¸É¡2%ödÌ" %°ØG"èO) û”‹Ñ!€+ÉSÔõìCˆÌ€!â¸%ØbZ«†!+î}µ­&l\ ÌL¡=¬'ƒ"äÀ`ûT›4¤Y²&2;¸§ã#t• ¥¯×UÃå=h §±[ºE€nMmq‰ã+C82ˆ ŒA@0Lµ´†Ð@iD°F1/R2}a@l Z*4~€¨z]`0"`Dks­åÇ;Q@Ì`)²…ÁªFñyç ^K­Ú47*È\hŽ¥v$€ì0V¢Ì'j¾#ƒé-¯møpLð:IÔ?VÝt#ÐÃc¸€–C‰¶[+ì²m‡¬¢¹•Ó[×Tâ+àt1àÔyXŽL·Ž(q9üu—ãã‡jî{°™|æd ÅôìY ëìi/ˆÀÌ6êiÖûœ«ÞØ,H ùÔ c6\OÎ’ >îqYŠ2…¦Ufâ•“ HLlÓúK#€—á‚)€òsCYk„6@ðB†ì¡mû]²÷1ÇxS´øT >Ak¢"– ?À@ÀX.ŠJ•Î20¯Å hD&©Нxâ–‘jªÄ¬®¦‹ƒ˜JA»¸:º¾Pc;ÇÓÐÁR†³=™5èÔ>ãQöUCÝl0»wVv!ŒLf–DBJW³ŽhƒF¢f'!ME÷9 S ¬$+´„”fR›Öëi‹²ÒGà€òλ1©L¬) ¤+úŒd\Á À(Ô$¼ÃXך (çh@2hèqT°VY£˜žLS¯X`B@ Äš¥ jUÕ¡ µxÀ@¢›Å€¬(  ª:`µ àE§‚‚ÁŠîk€€X6€0`"  À‘CBAÖj‡ë(\pF–p¾Zõ8‚š—Ò#J¢ùÕš ™æB#£Bó[ÆÎœ-q6ÎÞÚhã˜|8™àK€ÐLHõxŸh5@Ðo ÐŽÛ€SÁôqa/"nÀ~±`¾Èã"€%ÛºÏ͉ŸÄbŽRÄ€–ÇÙÚ¤ú®o㯃ñów£Sœi›¦`ÿxTHóÊýðà}ñÒ°ÂòABHÅb ÀGÙÒ %)»Qw @|coŽ&xÅÁ˜=”ÔD€\„yõi?nöž†w½ dð:pk6Ó’ƒM)ÎØ¬•@Ô÷@3/T~çŸœÝ’ÊøÐÆìµsô‰ç• \!+! rê§Ù`Í"[‹õÏ’ÛB쬿[F ( DéTFeB"ZAˆw‡²n¬D@)Ŏ鈕s±Ç(« @© q}´Eën²IµktÂ@ÐH‹”•²váX˜çYƒM €•PÐ#`¤ ]ÐÑIdg6Ò8«vº2b¢bE±°–M—“àÔVñv]É\"`UD,U 1 Ö¡ d¡ŠX«htµ6r€€Ø›aâŠ@ ÂP¶E#X4"` À€õ B$0ÕZ (ŽZ¸2ª¢Ó€h€N" þYÕ„›i‚´žF=ºÕ­ƒ1d.b#ÓylÅ´rX¬vdjþïO’l“Ï|€•àÉgýº@ JQ› X´¬êÔ ŸÎ3þÀ›ì×;°x¦ÙýÙ&ðsÍò,¤À˜3Õ&F@l £ûHJ/77°©_x^¾µ@¶K4ÛgBàú«dŠ!ä %<žgMy¾A2ÏüP¹r:S @÷1€ã§—<tf£?Bæe ÓŽIóБ¤• ]›£%½ þ…6ŽÞ ðÈ^MZOe¬C/ÞÆ;b ñ ꀈh… àèv‰¹hÌÿÈ,K?yÞº®_úüÃä*x\§5xhEÌWݪ££`)dÇ8äÙg…ŒrÕ {ú2½ð.lµG)Àö˜Ìo‡;YkŶÃÕÔ„rBéX©‘€Ð ttk¬)Y*š(@\ uÀÆ Œ50L=ú¤:Öä¦B›)æ:ØAPêA.˜F3‹´"¼ÞwÐSèÒ¡ P]ߌ€Z‘òŠ¢01m‘UTåÃ+0h cDk…±… :(R XPô[¯ÑiÀÄŸ0ÚD@@ÑŠðâË0ξJí̃4?¥w!—RmC«i2#?¬®D¦W´ý¨g6ýhh‚@£Œ)¼ïÙ©G‰éÁ&$ïO÷6-:…ƒ ðÌ,¬C`ß/@ûŒ„dηuÏó±-p”âà2€p7Rv·MÝ”{´¿¶óº,ð—¤ Ó”§ìU£~‹/€¼<Î1ã (!„»^ÔvzF_´~ ô’ƒ“·ÝšÈ~î½… ¹ÖsC؃ U•Ë{Z.-€ª ó&9HeNð޹?ÃŽ£CâQ ]ûïÊçšÛiè ¶m¿œC|KÁõé(Cƒô£7X¶¦èŠ¢ºû´¶jGçi3“€à¬Ì¯ø—TIœ{Ä5h€¦Ï|ÊûÔØ%Ä 8€škb>ÅÎáý€µ´˜ JF¼h 7Ðôr8Сh²´ûÅÈ@@”’›Œ³€a¿šdïš -Ù"ÔŒ†ðì`¿QùX X(ªZÙc­a°EKaŒÉ6Æ*(ÀÊZ #­HI Ølä€iQ°F@DuP ÖˆÎRÁdÛP°j/"Ѓê uP”ATFt†*‚5ð|ŒRDD(4½ŠK©{üB €OggS@Z &LÆ+æ*ÿÿÿþÿüÿºÿ–ÿ§ÿÂÿ±ÿ®ˆ# BZz, ¾)•ÀÇ8Äb)ä©ÍœRÕÌ…Cfg)ä‚ÎÿsË6ßèO_¾øêùðÍÉ Ü%ø o ÊE«€ÿ~\XÁ \L‚7Vô©HôqÆ /š¢R€7õ° À 5F Ì|›ûgðÞ)¶¥0Öì¾|ç«M6é\Øß¶ÚC~]Œ€'³C“¢ñ›"tEl§Ž×â Ág¤K …!%ן—LÉÏ;í ¨½}ÒFlÈä@™ÌÞCUÍÔPˆ|Aç¶o ÿÐ2¨Í°M€0j¾VZŽöìþõR-)PßûJŽw&E±Š)p0 ‡ÄèU3hk‚€¡¸‚º\–¡Q¾ Všæ’7ÇZXÐÇGï¿ÉÍ^J¯1•ÊhhKiŸU€¦(ìWë:™Æq·³†Ð€!˜ @[¨ @W¹½¥…5¥Dê@žbDÐz€±`t¨aboUUì³8íi )à©i¬O  Qõ¨íÌ‹=(¨¬wÃLÅc@‹¬+ZÁ˜JA"­q§uCTEGÁÂ"󢉥€‘08ŠËlK Ôª‚•-IJœj&ë(.ujJH©7!dŽ€P¾9•DŒDËÒ ó%Aÿ(ÕãÖü¤Å"Ë%nÿ?ÆôïÉ!€'mІi;䜰€8YÆq¶·ˆjòlº¨qÆ©Š|e«~’˜<3Àßò$v…Ç2ö §@.F§8 'ÀY¦"±Ïç«bTñ )‚ßcî^õçŠ=ì€Ú¥Bñ@è<ãêþûœr»«4 :ÜdÇüïÑ R( ‹w· CL€9ê8i"ó äBÐÈv˜Ç^ „y;ÊOCy…Ä#Á90×)d„LÖT¤Ô cQ%P²Õ9±yîz   ï$êW S’â¢Ò뤥U¶¶Áÿ™¾7ŒD=ì0Xæ¤kÙHTFš~™‹:87ÖŒs0@™ßÿÒ:€·•”Q3òÄ4=п!ƒ f¶m 4XÈ>'ônÀ ÜueÌ€†ÒãºF€›’Ä) R0Y¡mQ¡€ì²0È  f1bÀÐÀ˜Y˜XºR`=U1T EÀ"‹ €`‹V¯hl±b#ë( ¢5ª@°¬ÄrìDdÁ/¼Íùpài¬haÍ»È`Ø ¤?­øpŒP^Ie|š kœŽC…÷HalIªß+'«!Ñ}î».CãEîßæ~æ”yÈm|Ýj?õVp·|@ÞÀ£žä) ð9íÑWˆÖd3)ñ€]›Ú`ä3ŽÍ'WAxË^\ÛÀ 7`°;÷—í"ýšjß.àh)+ÉÀ ¯¯˜Ö§ëÇ{§ÞÌ™OÛË!¼Õÿ¬`HÞÙÝ&@Ô:l¨-o”ôë-x2H»£(Pû|¬Î< Ñðõ ÀˆµºÍ˜x<⾟M £µ¶Eã§D CèM>®ùaè3p<äïÇœ&:îîW€LîYbì¡üÖJ¨ªª¤ˆØ9\ …€€ç.¿ÿKÔêŠxrÈ ¿!†ûID<™ôcíF= rý|Û@lÂþƸEµ¨Õ„Þp{©[A€P>7~Jzæž°t¦èàH«B·ÖN׳ e€ÄÂþW Ge‚Flµ'Pde}¬ö>+k j ^¹ÀmoÛ2QΧˆzÇUŠ[¶†F«*( Í«†‹XÞ1Hd¿Q.R8åØj)"-`@bœŒUDJ}°Ña`Á"²ª³X°m-(‘aÕ:€ˆ‚!(""6è^ì© €¦ d´¸R€¶¹¢XéÏ¿ŠFEQAt`¤b»-8—V8`ü›4VmT@D€g+˜•ÐôZ:`ç5ôüÐxeì8~ þ E²Ô'›|­R~ë6!TÃü„¯ ó'æh_@þÈÓ"8®àzÐf¬‘7¬ÖÖÂu%Åâ•vMŽÖ¡ÞvÛg;kyùtð`à^¿Žñ®]õ:HͯËïs&ã;/˜ç­zicÒ[:ïî«-Ÿ;v@OÊê1­ Öu‡ªl4¢ÚHÄ€ùêU5IZ$yiâÕfÆ6+%ÅÅU†¡À±ÙuoöR yvúD ¨BÙö3`‡µ,‹ Ö5Ί#-Ov³+Uµg=·µèŽéV 0Æ Ћ¢ ‘êÂ]l©o%hÉ¢»» Òv‡Æ€Ë´‚ XZ´zé¦{yž>ضw3 à3’i)2™™1V8?!‰ •×ÎÁ Z¤^º{YZ—g-­Š)OÒM7‚±vKcZµ‰TÅ‹Ú3P}þL¹‹"–…ÀfÞ± 6lJ¥Eí™´Ò²H`ÛxÆ eiðzáî¥úé–Ô-µº(Þû•²Béͦ]°W¸“tßý`­oýçÕˆ9çŒÐ¶õ¢¨”ª® \b6ך–lägwUŸnuw*×­·ï ±|â&¬<“}Ö3iþ§½šÊ‘5lÁ@¾Íå[þ|é®U¶€ãÒ®J—§t:íÐ60âÂ9€  ö6k­¼‘jÅ)4e)6°EèbtKBÒCDµ,,« › Ä2â J€.!gpODbZzÚ‡ï«cšR’‘’f*qÆäˆ+O ©mOÓZ›^•Lò>®ß.dWÎk¥qïòÓ_ݪäÉÍ40N/#dUCC¨!Šé—™ÎéõÎè$Ó}RœzHzTÊm—'Ê`äû£¿>ëòâ¬o‘õàép/¢ ¢}²1òí² ÖÙˆáý0k°JS“$`g~·±ý/3·Èóål-Û„a0˜8Íu“óOê&ÉI²f%lï íÛ¾t!÷VÏÙ^—Ó¢€gaïGÜTê†|,>Ê *â6CǦœ°®*…® æ Y-±_³fØ$×-é¸áE+ö_=7›—:¤Ã껇ñÀ™TG2§âŠVDŒyJ´»»/®ž™˜ƒTŽa™—!Níä“sWßdNz‰[Ù3] uêFIž;Ïîãú©û§þPª]TóÖwWÊüÍìæU-à] LO—_oÝ3 ”zpåþÉ›“‡yy•R2HI!éa7ó?U3Ç«{²ˆÌà”—rä,LvO2°¯à]ÁèÔó马¡ö7׺qÐ0D«d! @`¸a†à2•l¸Ú76X¡å·äÀ§)²m§€˜Â=í•Ý`°‘S©éi?&µ±°öêˆ12ª)–bFÖcÁd£µ.DÞ»í¦&q!Ãß«MºAÄ$Ó=3ƒ¾ÒV? à~;Z`OMB x›v (¥íþñ7¶}dYt$f UU7\ÉZ©L±Â¹ãÊ@ù†Ãûch¢ÉÈ•3^j« iÏSE²]šê#ž’õ¢é]†¦È  f̆¾ôÙ½ŽlªslŒç4ªí7]¸qÁ0ˆƒ²µ"µª—Ö6 ÃÐB)ÜТD2Tdî ËNZ]3ÒÃù ±›¥Šéè[YÐ[¥Çκ4´}=‹še?±ºÄO5ˆjb•M4¤Xs15ÙÙé;2›˜Ìý7›w~õ?SsšºÄP$|Æz Õ'MW?¹Ïÿd7YÃ099üÖêGb™½Ùv®ch ²4Lö\‡=Y1è7±¨Š­Qþ#ºÔ9ïò6j˜ÎÚgêê¿-7ÝU=ô´ŸQg3М¬+yï©,ª¨ë»éj?”\n€ ‘ªq”"¨[q´+”@C  h2¬äé6#2(X?‰­ÛT /€ƒ]Qp, ˆ<‘;"È„0Qˆ~«­tÎTÊ^"ÖÙlÂ%M0.I|?€œ>R&Åìá÷ÿоïÖã& *¯À‡ïãÅDõ?‚n°ß_àoœ€öíL²vm½É0J@Ò’œ–Ìâ§#§·<‡á· øôøöusã§®—}PY}¡ @—?š,ñŸ¬  úù‰s€§Þ×7¼ýªÙðÜ.¥ò¹ä¡þ"•øá€f°Ý¶™€ÈHfF-3²TAq•øÅ±m“3¾G¡ìîxvŸœ¨‚UöŠ õË‚½W ÕTÃ*#g €¸kñªä¾,ðã¹q  ™6‹,ðÎ c[/ qÈWåY†C2{Ó ú¢#c¦³ NCY—›ÿCÀ‡óöÚ“5…àdBöm 6í³˜uŠ$;{šiU9üÊÂç:ÚðÍ)UYNº‡FÄP™Ú¤1Ó•@‚a©ŠP%5CCã(Þí'¶\|Ë A´Ç9Fí®ôžsæ°›ö‘ÅcŒ§xo Š0 ßT@k‚@Áƒ  tzØéW`0€A@i“ºàDZ³¡n@€äÉžs—ÀOggS€ &M¶6qéÿºÿ½ÿ«ÿ¥ÿ¢ÿšÿ­LHKK\VVBDD@C\Z\ÛõhÏ=˜![ä¯D’XŸyüèfì~x>MøÄn÷jç…ÎjG€×}åNtÇ:ë­õ£mh¢Æ‚+ù;™³Åê[¯Gð|XNºg–™°¸zÂóëbŸ~üJßWeøÖLþ”ÝMönP2wî!+ø­GŠöç¨PhÐp0imÎu­ f ”ë_8¶Þ¼ú$J ãGÍ ÒwÜÜ:  ìXÆžI$ÅûC|ßµW <ÀÊ `í\Ï9§ôàuYðùÁÁ0ºžì„ŒZ[T@IôðåÃ)„žýXTÉØß‚fútηå'Ÿ!˜n Ô³*&Ï=c_0±ÆÑôµsÜd`Òy@Ñ“9Ì!ÁQÂÀT°ÝPÿèö(@FΑÝ%SÕÐx®)(dç Weåy^YM~¢¡¡¦Û|®í¿âé>1Sеa„È!öBÛôúûI ¹š}ÜòAkdýk@q‘wv uv<èBCi@oè±mQ"þ>û;€^€`Ý¿J" Тv*Q4R¤Óˆ€%žÛ]ð6‡H2\gµî yÐ1IÏ2ê–$/ÚÑKïq>ï@õ†ÝÑ©Þï:@þ\6Ø€ Cz1JZÿœ€žx¾â‰Ë9`T4†(éXÀ‡n& @›PùÝ;¥}@òƒ‰I¦¡{|÷¹êÄÛ9ÍWAçL§vôÞ™6¯­ÕW§ë(°:ë]á°j§#hzDkRð?Ua¦z;ôûQ2¥ÖâÁc¾<ˆ²l¥ @óý_ÁrÒž €eqL(øØúÈ÷.>{Ýe|³ÃƒŸuLP€Ÿ…¯ßå ³òìC6ºþ­ Ìݳ(ëíÙ¡ŸS [@×0Ðfeía UNÔZì|HŠbÏÞ×4ÃßÌé*5P=°hèª(‡j°\îÔÃ×W!CƒÄVÙ&3úo ²õHÆ3'ˆ `çKÎÖ@F“œU;WÂW¿"0L'†˜A=‡uñjîMoÓóÞBF /¬?¬èô À©0Ð@`@@G@À¨éì‘÷#‚{€€Ëmà’ÃAÏ,Rp¯f#ZÓô¡g’¼ù|Öšè ºöÛwéº@À˜µ‘Õà¿?Á“¾:ãPÀcœ0‰ýlÞ“å Õ°`Çø\ A üØjΡæ·ä˜-Ûl£ò%¯¼2¾ü(ô¿8^C“’ãúF¤® ‘B†ÚwT¢   \õãgo ’Á¯O‚h5i\œ4›/Üá•Bnö@!6Õç~+„œ›sNG€(…ÓŒ¬™q} @ÀSüΗâoPF]¥^÷>îÇ (àq8î+K<—×L)ÞãëŽõÑò}O®Én+æâYî{Åsõç ´ì¡ š S&z™¾½{ðAeWòVü&ÔÌÄÖòNÿ#Õ5ãŽNéßÈöˆÝØ–L/Í^=uìšLº¼FUxCt=éÐ4Ø×ðZ¸‡¦`†L¦_`pühóSÏâÀ_ùößq.Á=“ €–•wxSÊiŸø °BOÓ”h`¡¡Ç”s D˜wÀð÷l@0š>»íâžÉDE‘ŒsêÕÃ[J4Vž)ë)d±åÀÀ8®àêo—ýó©»Þ€lÉá©´½iÍ™|˜Z‰Ssú^îî¢5l¤7àJà´~R][›wÞvš>øÕ @ÞŒM³ ‚?ùªêåØ,ËïdYÎÏØ<¡Aæ¼IV•󪸡ÔDzòZ…’ѰÑçÛà=ô­ú|•¯=í‡6·@XÀ«/¶|qù*ƒç÷ü¾Ïš¤ª¡]Ò.VŽḚ̦̀¶•«àŽkG)@/6xCßç&uÎÇsêG8Ø'Ëò7MI @‹ÿ–[œee€t?©¼fO¼“ª¾ÞC&œ÷Þ€€TßI ˆ¶$Ô+à.þŸlÈdb5.è! Î9€nâ¦ç µQU €ˆõPÐu’½w8ïµD/ž:+¥9|Ñ—ùhít$0›ÀÁ\ÛNÂà»Ò@]LùQ< d8”±mðü1zÀ½Àh°m@@ šuü5ƒNÚ çÓ«—4¹xpÏä§çrcÅj%À³>968~ÜÀ;æÔ$ÕH8Þû tKgà«7ãà¡2qaáÚöì¹èdR‘† Á.߀«€€êÎ4‡™Díû‹?<ØêãÄTÆkP ÓV,áíì @X–J¾Li Tâ äÒ:<1^ñ@hz@@Ÿ˜ ŸŽ5Q|$”W»þ–V£äŸ|R›ÏœD>c›“šsÆ“¡ô̆º‘W¯™ÍÁ«ÝÝ¥š¾œPðeµæóÄð·tÐe@P>?¯ Àæÿ\&2fr1˜Ç_ï›_©òQ¿“áZ|®òÜÔ“³íy†¬ê’à×Âg645 NU¾´?SŸ5ÐxøX`‰_^º¨EL0Ð+hºT¡f—5«#(ÎIÊ@AN…uÃãxöiLIœipàê÷ÙÕyöa Í€+ZèäþJïÙÄ%ç(2ø ÄxŒ¥\@`àÖhUìW`‚s I¡•··IiñÐ&óã𶯄ûëZ ®•èh»Ï —å ÜÒp&ÎØÄvƋΦVÃÌ«d)v¨,!f´¦ÈÄ*ÝøCˆè|ŽNví¢Iû£øÆta¯¦µRU §òYåÕÕRÌÿÇÞh¸çßB(V @KkÎ9¸ºèÄ’2âÅ{qÝø¡É¾£…–RŠžüO¹’3@†Äaë iåñžBOðHq×<ævsô‘«â)$L­tEEàæ³ ¯¼ÀµG¯ûOà)§|³Qâš–Ž¾>ù³i[.ë茆ÅßÝ+""Î~v ¤Æ`dcTþ/òÅî‰?ÌåÑù•9}Æ€ÁÍøû+¥÷ìίw×üv>^.Á@tfïÎá{w½§ÃÄ•Žq¾¼‹dföÔ¹(Wî<郘d(u) 0.åihrbh@ÕÀîâ‘Udsƒe‚À,;Û šjd+žhd• |x6y˘ՠ‰µae†ÄKUÐ A0MýÁS`ðTD€ŒVŇ}YµØ¡QÝÍn_•õËã}¸ñðnE*ëJö9AÔëÕ:f‹]=gúéX ”æd°Àb‚9ÓI0ÞRUÄ4“FPÙûG(ŒRõO6û¾5L£Mq/mÁèG­Æ{xãp¾IUaMœùWpm íV-Èðä2‡Z×’+åÉõ‹‘IgKSKTaäD ¤R…‹­Ô}šÓ/J§Ôa¿ãCû»^Nü$™®KM Ï•æD$›Hª=ÍE2ýz (ÒHñªFèˆìk3%s&*Šå¡†œV©'Ãf˜ù‡Ej•ÚG¹˜C®Æãí÷•³çˆ0¥ÃIàù’÷“­ ôx®›ÑwYÄܧꘘ»˜ x‹Sº)2ÎUUF3XD¨ÂêÄJá‹1eí…JcÍdÒk=AØÂP¨yÈÍ/ž{¿;}»R“Ïze°'½ò¬¼dÍ›´f^ÝOÎy{³™sÃN¤EAÀ,§0kÛ6º¹I€üªªªªV·V«UUÛœ>ÑìÑ\Çà2“^çy»”HàÝ÷5g/G¦6AÁL÷6Þø<¡£©þ²ôú¸Xîž¾~ب,amŠè(*ª9h"ЍZÎ0hĨ*ª©*òQ—€b„:AöÂxR!ˆS'vžŒP²¤ÍϸöÃaeZž`ïØÑbxêÓ~»2þIyU5-•ü>ȉ¢¥5.ˆ[„*ˆhAýlÐ*:‹ ˆ«rs›‰tB &¢ßXŽJuÎÖ³Âã@p(9=VKoÍ´†. Ö‰XÙ9P6J!§ŒÍlº“±?¨³e°§†Ò1l: š} ~¬O›b0ì‚é»ú¡Æà:pZÉï¨Ò¥Õ\Òµ—!ÇUTG;N+¸-£›*¼©’g…hr ÌF©Á˜É'2Üà³Õ©ëZ®l$ù†ÇÉjû]—c€lzf8£²„X¾Æá¸F“A˜‚7êb/&ýö?ÏZ³_Ô†ÖyQ¼R…Å`Ùî;Öª-Rr:>æeýw!e` €©†B_³HÍ‹·–*FQ M滵ÊÄ¢õ:ºÑàÜ,œ>=‹R:­A½zìì–p§{6u2Ï3Ìc Xoç×M±)Pá~ ¤Ž ¥AÛ^­Ö’²$¥l$]Z¿„–C¢œNyTvÝ.;mþJ…Í®t6‚tê`•«$ȧ­À{&òŠÞþŠ;Ozøq)«¥æ¤Ž,ú'8ÑŸ¼Qe$³ BTbŸ·‘Y—a¶HÏSjŠØ‘ò–Z‚ ÒÝà†kŒä–Âþã¥(Ô»x0ÆíHÕõL£T¤áTj%f貪å^"Èš÷Í5àâJ)âØ'\¢ÈÂò³AKOggS¦ &NÃÐü]ÿ³ÿ°ÿ¯ÿŸÿ¦ÿ—ÿ”ÿ„ÿ˜JJGZüf±8Øâ¬QdS bð?À6‡Ñ~ôÎÑWCË Úž´zTË¥ÕÊz,%ë =šÐjÉb¥Í¦î²’Xôe¹ìÍB9—ã*Ö»>‹,Ggyô¢¯"nŠãõxƒ  $Ñ{zû¥º€ð(ؽÙ.pˆhŒæöð½w"»k ¬m»µa­È[TU]Qý"éudèOp{xí¹Í~ó¼ÿa•š¥‘¶Ï‹Ç0%øš-7µ£D&7O×ÈûöÛ¥ÞE ½T7ýŸ¶º€ùÍ"ƒ.Z|ÎyZQWW±~»‘FòÄ0¸Y«,'´-* ª\–Û]K*. §‹€UÈ8Zev“kï#ÏbML–2KÈITΪ7­X^Š‚v­&ÜLÒEúé!åa)˜Îƒe‚,Íëò”ôôÚ3<»gà œ]õˆÏîJHF@Õ}äD€Ö‡dÑç#s ¡Y”žê&ð„jóMÐo€uã-°—MòlòÊ’ÄñÊìÕ.°Ò2à„X¹ýÊÂoð#å<™€‚žÛ-rŒ‡`¢ÂÍÝFÝB@øÿïTβr*x§Ã €|Ú’ëL:l,;“ÖÌT#4$ W@@&ã…:„•Íø.ýSÄÞÎ&õJ‚GZè²A¤7ë«8Á±•$–ŠFÎ’áÂ%65Ö`¥K’=dXXy®ó¤Ä™6º·H %U´(­‘€tMÖCÍDô$ôêÀ€OJ¨™°’jœåo7 ›¸¢˜.º|îàl&âE­q>a¨ Gä•+Õ690MOóÝôÖõ³åd>Y*DÕöÍð/00ºEQUsÍCBo±ÇöÌ]ë4H½†à혦ˆPTÉÜg"g+²÷·dSÀ{(JW«°Î#ѳÍ9½FgÛZ˜±©) Që›=ÿÕöÚ?ÙÀü gøóoõØ•RQ= Tãœ{|щ9Ô¸ª[¤á°Y[w±i‡Ê2ÜuÀÇ&7ÕvL²RH¡wª$OôöQÔ­~˜žQŽDõ,jBzEUŠ÷z€$VwîÌt&1½OK·[·19YղȮ -@ÜׄȺȳœ©žgýEOæþP¶ Ä|•A³ÈªÄr“…7ôäÐõTYÅmù¼l]Mu6¢þ¬ ì» º/yèw屑_ÓÝÑÑ[éî7ºÜIëíâÎ}’`Š¡!3Ùqà;:)ªš¦Ov‘@Ý´<»f®{[@Áî.f’ VoÞ“CÇË?šd7ÞkNAöISª™ªä:Š¢°)M3+°-0“ŽL„¤Â Y~È´lf×f©Ñ´”]ú rD#²&&R‡"-°$Ô¸©ŒA2 ¼”.þ ^â˜Àn·ë%ê“ÔDðLœvˆÔøî”v»ð à¶}^Ôú¶Þ{«jCI€¶1ý…o›û†ÊŒ7ˆä⸰V‘„È#ߥ’†ŒÓ.€¼ëÐ;Î̵†«?U§™SϹ¯7ƒn [ënÞ:qÅò`+$’ûRDVKb§‘Î.|û~Æjs`ÝU"íp½ƒ±ò8g·˜\DnýâûUÐäóT PÁP°ÛqÆQîüš€Ì·A½ëo‚üp1‘'ÈÙzƒ¬@ÕõìfH˜¤èëÞÐSLgÍ.èÙpº’«&g€z`n:Û=3Uºð<ç$ñófLNÿ‹ª²òðø ¡D×õ¼ZÏäd’$6±Ï™>Ñþ2*1˜iŸ!+ý$ûì§ÿí¤{€iÈ9™ÿINfæsÎÇÔÿÂ#l}g½y²§WÔÊÛöY qÜ<Ýìÿ€¢ÚÂD«9 ‹ÅRÉ _Ѐ±Y¬ƒS m¥ü{L¢SÜÒ"ÊB€,_€àºX€ñcéòÑ*Å(€iÃ%1ÞËâ6Ú·Ü&ÏDMD €¯gá ¤«lûŒˆšE•IzIˆ¬Ìg úËeå&ëð²s ^­‚N:dñjN¥ Ò)„ 3¡;-¶Íú±¢ÛkìZ]c_¦SX,®”Õ÷‰ùÿ _ÈŒ 9P¥˜¢2«9†øŠ\Li}XŸ—ÓÍ‚h@€\U¤©‰Yîºd ,“v\ìVÎ~ëËE´ÇâUö{;ð`£6íYŽ| B·WJOÕ…Åú¾c§=/ô‰¯¢bf;(êÇ=ñrœËw¼»}‰y{ŸÃa¦¼¸¥31Ü›ŽwOVÒ£Â_c â³àÚ39 P sûéKG×|&3)v]ßkTì¹ú31q½e‡ ãï¤jø@R=U ç™çÖ$UÉUIf0TwÏþÉïן©íûï ayORâ.³{ŠÉN÷Ô3¹º`rõßñåhj:qÄ•¹“v4âJíª„–À`Æx?h¬’aP €è`È@@ð* þûÓ3ÞPÀýË]â#¢+È„p?s8‰5ÜôR´àÝž÷ör¢6/p&ñŸíg“ûZom­^¹Ô` 9 Í'ó·c´½ €[®Õî•v<;CÖ¦ed)9B2„æTH犄‰§›«BÚp¬"¨sŸ€nsójySŸÌÑdÏîjaøÁd>PóÛ–&~ jú“gxÝ×݆¤“bèê‚îÓ}ÝŸ˜žNè,ÒÜM}ܱÿ “\dçÞUl˜‚»Ù”³úÈû²î‹„3ET’÷ŒÜO>ƒ$8„ݬöM-p¢I ÊÞç, Ä ˜W @›à¡¨’€ðú:2À1$¾ ^Ü;€Þ[î(Ÿqš$\ÿwk“^²Àµ]`Ç>f­Ú!j˜©+î@b2pÇÁsöÇ=àWj§‘f_žž‘")à™!n¢GÏmby;#øt ¬*Ô¯9@P|ù……F#ngjM^^@RPȸIyªöá7 äë²ì õ{URï¸ È @ç4¼”붨T¯jÈfo ΢áu|:/ÝØÙlêãÆû5$œ¼cmÍŽË3]\˜¥%äýtËýüü¶œìiw2rž5&…Wvâ‡r„ HN÷Œx»TWé›ç¨ºšÿ†Ý¦u‰ 3}Ýî˜èç…[ûï|ÝíšC¶Ïà=ØÍ?½™2‰, • Ü `²WS*€à À~C‚  €¢ðŽÄVë­þ;4Lp·jµþŠiM"œÿß~àðÛöq£Ã¬Õš™òN"œ¾ì‹‘w£“ÝÄ^¬T¥”É'IÆ×\˜°ï¹•T½,F×R2¹šsÙ|ACÝI[ "!g‰‚4K|¹i¿ÄëîQªÆ«ûä×î]<¥ïi[wŲÌçoí^öØÍŽõóMWÔb4ÚÝ Õ$1„7è2Ľß(!d¤¡'©£ãŽÎeS;ÞAøY=_¶©¬q'L.Uiµj.€ :.Ëû'1 †aw®Jâ;³AÉœéžÎ©¡Ã¡®î ˆcü†(›"ó9ΙIÚúÃÝ;Ù»s “[0õï»ß XíÎÿ[¹sÏÖÐÕ÷­¯ýxº†BwõKÏÅ8Ùt· Ÿ×ϳ-»w±ää,ÕtÐO}>¿îü·ŸZ?˜N"*]TTÉy»™:å~ÿ+hg=ÓDdB“ň1OÀÖ€ PF 𼤜f“´@jf¡žz( ˆÀ[ï;+@ä–É7È{-´¡ïŠÉÀ>å0—Ô¸4ÕìK¤…ýžÐ8ì-¤šKŒä|¹îVö®5÷>=3/¯{Lví‹7b–ƒäŒÜ~ÁOP ÿá6¹zåR_Òàç ¹&îëuöKI¤¦¸þòÆYÔUKJ‹cÖ*·R¯ ܽQ^sM¥™¬ªhé~kj§’ô_ÐWËÀö.ÜŽñ7ˆ£ N5û?$5Àîò˜›é”LÐ"aŠNNã!…\‡iQÍÒk-LÅï…Í\'ïŸaξ |fÞ}¶F†û]0ÜŠÝ7¨$8tn×}*Y¨ñîêû¬Oïru[¸hód縳ü~UÑ÷r®4ýîÕšKÎù¾t<וÈ—z~¯Çgv7ZåÐì™*€Ø!‚Cæ-!OggS@Å &O¯$Ö€XUÿ®ÿ®HILJI]ZbÿÝÿÂÿ·ÿ®ÿ°ÿ¬ŠÉ»AƒçU£ÑÝl—=È´vBÇíØÓð¤^UöçÍÁËÉoïôÊ*Ï¢ö¢—â8—§÷©ÙD9©_YæñT·[ÆÈË7ÀhDѨ˜V©Ùg¼ŽÓCÛ\K;ÿ_»a3俵ï.÷Åm^a•·ê&Ë唓,%ÅMfS8‚Y4¨¡JèzK:¦t ÿz¦Ù¦ ëXàRÎ|€Ä ÅÆúÈ ‰…FY[Ô ûÔLŠ2g&ÜÔ[ƒƒÈ©ß0Ò0•OäÚЭwl¹5" ÑÅ,,Wa r’ À£U«%)ˆ£M¦ZÃ)ÀUrZ¨5ѨXÊÀ]PMÈ­ª 4€^k@}°Y2gˆhÀ ÐbÕj§‚¨£6$!!šdfaM IDCHJÔ@ˆi¹>bPHÖ%PŒB€P$ê)" ;CP@í3¤1€@ÈÄ· Â,;2pY@Ñ[¶úò¢'àUëë-ƒðüînWÒ­gà«3Î5`îëšìC´ú­"'ëœ@ÄÅ2Rôú™}v{ú¶ÃóS–»¿¶m›½ÅÜ£,©aÌySê§£¢@ÌûDØX ôIH_ô¤)n˜39Kˆœ‘tÅG@=Ñ´#;/9vÇKô¹öïÃlxÝú–šô‰otâûÇæ>Q˨­wŒ8½ÉÎÑËÌz¥» ‹ÄD‡ g®3(Ú1qYlÚêuàöÛb§ªê¶ìØ.(ß»ŠP€˜˜_~)ÏAóȆ«9´šÞ㠌ɥ·@£45I]aRI]‹€†D¢8uõªÌÙh © *¨–Í6EâU …Š€ªPž–ÊJhU3¼îÂ’¦BФD jÖ†¢… *Ë4€* –BÑ-ê ªb¬cŸ@¡Kt F #' T( h`DSÑ«à€È`˜‹4Ã:¦ˆmY- €£kLSl'ö‰¥`@L„*àývÕ0TôÀà2ÈÄ’Ùü|ø¸¡añUž/ùz@p¦B|ʰÁÄ–v¼@ϲ&o›‚/òä ¾LÈ>EEi&Êuhã y'S‚̆ÙO`ԸɟötK?+H÷ûÆéóDSúû4 q[Ó©FFLðƒ«UvGþ¯±“î¹—¹í2×½S˜Øl®UÚ~”Ž…/"­ó¢Ì8Wé—~!Z|‡P¢®R}€S À»ÔÝÂówû%#ç8QHI¢çÞÊiT½ÔdÆ&û¹ÔzÇB(Hfí¶(‹Ý-/ÄŽñŒëÂtÙ]¯ü®÷ƒíº ‡¢€KXá&+Yw“·•1ÍlEB¥æ„ïìèµ²Mcê{Ú‰Èj;=¯ì˜H·]¾Z ¸ERÌ‚åêéÒÆñvÁæMNF³±ï„M)× +:zúÙr“\<Õ@8ªÛ¨#§†4ôg97Á%÷¸P )FV6B2Ü’óƒœÇw·úå/JËjÎH)÷ïô•l.jX¡*îh´Óf£åêä hê’²r³öU>ºòXŽ”³lRwµ¾µ‡Ž®/{YÊ©nf[f¥fuwD¾dC×ÌÂù%ûÒNÔZmÎQf¬¥†ŠâBÇ'”ÞÞguó}’æpM·åê1%‚nŸ'õ>ð7*9áȵ_2pÞ¶;‚+4üŽ.µ ÍÄÿÜ´ÃÒ¿ÌUS59!ú-í*“Úý—é»úÝHÀE¹8Aõ5‚’×n¨ì·ž¡þÙMŒ@¨rŽoOŽ÷áïa&úœõáwò›_/õåqä~oä0ý úÝ,ð2{ŠúÅñ2à¤Îÿèý„÷uz¸èTïê„|ø×™…}¸š¤†¾tÅ“m_w:pf ¿Ã8¼®îÞí«zSÙïÛý®]šóÍ©ˆ9ÝqÇ?Ï¥EÃLoH*ºïÌsÒÙÉi\™ñy»Üô•ÅUËÐI-wçÀfÉb¨Ê58§Mf Å´4åžæ ׯa›¢$oÍiÀ h~áîj>žÈ¹ÛÙdÏ+Ó¨º@B¯)€-PEºµ!ÛêhÍ®Lw×µÈôùE– ¥ ICD6•þX€^åm¢§lr}õÕòlda,ü ?…VRý‘¶¤ïjê !{ž­óHØ"ÈÇ®Žì=Fè † ½^íR$à7­S€Þ3eyÄÊÖõëÆY¼‹ÇúÑ[[ø’`_O «hm4ñ¾¢††4ªÌzÝ17–ý"¯-_EÕˆÕ íM |ém F…¨¯öÜ* ÷4 ìüo±&x|¿¯IÞ¸g»ÞýÕÒ£BòcT$g%ö)Q̯ÜZvê d·ºúúL&£$ª½áÙ4Ðù¹]ÿÚÝå2ø\õqž”~'ïç‚ÄúÙÚ2>ýÎùGï1M¸æ >=,Ͱùö§Ÿ×WoÊí¨£Gî]÷¶ç»U*€J /òe®>~¼a™€é„ŽËäó÷{ÃÇc[ü™É&õé·§+a†ðÒˆj¯sÞ:c2rÔëUCU_•}íþæþwÖôl ÿ8»ÏM>Oó¾Ûqî]¦v×®ßOÿìŸ$kŠÁ]ÍŽ s7ô¦®¨§æ$ÀP ÿ|ˆ¨'énŠIšÊœf2¾¶\žÿ™"OÒ r4˜˜¬x£á4½>n:ŸžžÚ@“àëü)à‚g’¢¢ïžžÆ²€?×,4½Ú¢5ù­ deÇ 2ú#qÛZ†JS(ü`ò@Hh<Ší€Àÿ2Žnk8$ €€;"µ …p˜ˆ: ¾Ê ‘@®v¬5t x?€õ‰ö™ÿ94îóÏ(r€}[‡Ï;"üè´¶J)EØç "é + !8n òÿ¤ƒµç_5 æ`âžBÈ«Ï8:Í^ɉë5S÷U:w"RçcWø$ï²3OØgxO»"Öºh,w wïàÞ ø­Pç//E.p92kVàÈþþŸr“ö è<³fÈd깎¬Ìš˜ûó¥Ý͆¼Öö¸3Ir=9 §€Ù÷^úíwÍ=“P>¿üVš¼|WóÌ~Ú[4‘R{:ì²wEGo‘ šBssY.¤$ï&5]û@ñÍà Ð.ïZ›«ëwîùÉÖØ5íÊu3y1¦Æ¹%ŸŽ À ¤ÙÞˆŒ€ÈÞ7GdÁ©|ŸëL&S䙞®ž„C»¦X8›ÌoNe“MÒ™½ì¯/Ÿ}ó"3ñü]/‘a÷çØýöÝËŸ®f÷®Ÿ‘³òbxüÝzÌÚó €óÞ@Àx°¬1ë‚ó _Pr‚ÿÀR“à£%Ö{ÐŒJÿ‹ÇDÄBƒ–¦¥šC5ßçbÊ¥`_ncü}ºž`€\í^k¨3àÜAqiö×GÆýødDW®Uá¶­ínÃû¶Þ×¬Ñ ˆý€9$•wå“õ õ¯»þä“ !™˜0T9ú:ý¯62FèkÌoRæ‚5ï²ó?V ˆ±ds:­u®£3΂–!§ØI!æ›`9Z˜V Ù¦?þ{í~o‡Ñkqyspò˜.g¾šeÁbÈoC)Ë€þ¦§Ó'ÊæŒÎNê“PUšâ\¸ê»;ÊhÃIC0WOćE:ãÌŸíŽÛŸÉ]˜»?ÖlüóÍ4›vMB–ïCdô¼ß{$p ÔTÖ¬œ6µ0ì*j$f¨î“A”¾9múMøØš–ï}º 2=E%ôô{õÍI ¨¡b“ ªÌùòNš†˜žJ·†ÏñœŸ·ÝIC ¤»zt=óTgΞÑ¿ÊÈ2šíŠg«²¡ =]ÿÓ]n™Ó ¹ë0ýoP}f ü¾jæ@¤x†&6¥xFˆ³LF2áÈçï]K6ß쫞®¤Ktñ·òïcÓŃìy yç?Ü,nóT:°o:¾ÞeÁ1 ÖÆj§D“JX%ÐÌ^”Iú~JàÁ& 6žï¢•R,P©‹¹Ýe!žû½™3á„ÞÜí¶¡&pþp|8E¬õ_×”£¼!¬‘?Öè_®T»‹à7š·ÚN3oj6Ȳ²²~RÕv›ÊÉp[¼SæÎ¿Ò‘`ö¡sPüTÀ‹æÊn¶µûxqâà= ËA-;Dªyµ¨2sâï} ê“-þIØ9²»|9€n­&p¸pßlÿ7VÊéÏKK¿ ìðAx€ÊoÇågyžˆùywƒ, ÞâädÝQÎÚd1¥k« Ôg3t7BBÀloŽ)U¥Å¿,BœY²òª3=c]Ló@ï¦f†bÙÄkþ©œŠ~öžžÞp¦®»’/>ž»Ÿå99{‰Ýû'¢ºitêÃTAoïÎÊ“e2én‘sÅÏ4• U„‰9dÏ6Ïùïåsa #7ìñ×ñý3ód–€Ê~òEÝ×eLr9“Ñ!Ïæ0¹»¨Üô÷{=y†aÓD#p€eW0À#Wî6} •mƒ—N €Å@ŒÞYË ^ûݺkè ª†Ø[Ë]Ý=ô$ðþšÓ¥9Bü&ÏÌö{\œ¼­B¾81àöõ\€ÂÊÇŒF[3+%uÀ2`|·›l>¯ôÚ^ë.Ós'ûV]䪾ä/©Âá˨ äo¹é  85Æ9qÏŒO^u|ˆþ¡K ?¤?êbÚL¯mÐÙEœ{à¼õ¤Bà à[4ð!ˆïl¹|Ì€ãø—#Ô‘Õ”#êñ¡|ß¾æå“F&^£[Õ™³<ˆL˜Ü¦™c·ö㳇Žíúç’`zª@f"Ï÷g-cƳõgt éÀûGdSIU?WL\›ÁL}37ÆìûT7Ï|çFw—«G.Ó»S³}ž½,•9äžZÊTC5“ S 0ñŽŠU¤àjóó"mñoÒ]Ð6îåû:ÝÿošfÏ&ÛÃ5oxÁô®¬˜ÎX¦@`à!0g 7¡ªú.¥„˜B’€€`@Aà­³PDžû}¹KððþnÏòNôI1ãüáèé§ÉŒ‹cާdˆE,xÒgïâñåªB=Mè¸Zà·Ÿó…×\z k¡'$@Íþ¸Î>Ý×]=[`e[ÎßùR·{Ef¿â/÷Ãg”"Î2OqA—‰ä$Ù¼ Í”eåcy/À{(ð/ïV\€ª ÿ'ïÙ »]¨mcåÔ Ÿx-ëÙ¿f{ò}hn_¶‰ÎÏï¯AÐ»ê± ù6þ ¹»ó~è¦òŸ@Oé†éG´LfL_âÏlwoýβ×ÞwVWñBQgcfî¹snðÍÌÖ;ÿE 9ÀtÍÈÜË?ÉÒ=ÍR#²ç¹ Ùy&).†“h ³ðTBöó™m¥¦|eÝ9$Ùï™]§ÈººDpçþs|XWÀLŽ©¥®Êïßa¯Þùs®Þ·ÜüççÈÒA3G ܺŽ&Ž´±€- 4 TY'€†COr € æÿ¾  Þû}¹Wh8ÀívkÞ¡ˆšçQ§ª‰ðf!š¬_=èáëcÞ»}Ÿ%dý:-XàœJtmÛ·ÙZ˜÷ffR$c®«=²¹‚Û\㨪½½Údö¥ÑµÍ$Qt&ÿ PÜÏJE¨¼ÛŠÿ±uùž$ŒÁ=¦A'2ø=£SA7t:ÁØÓùâæ(•D€û×v̉†Šoë+ï~ɉ%ŽÞÕéc @§¡ÐOÝú9cȪƒiFý+qH(~¼TØ7â…7™&lÆLï¬7e’®&i‹"K˜¤Èù¨jgns5 ÁÉ麞©óƒ›‰¨~>}e%L²Á{bî­½Þçš*sÍÝÕ5¢§ßžï3îøE2Œ-&¡T ÔÌ,ä1´û!€ïÏêÖÐÝÓç¼]î!{ ”ÍZÀlSªjˆNT:°ò€Ç˜¡»f˜l¿q'©  ÓK@¬ÀýVúÝáG2w lCºè«^†ƒÎÔãðx÷Å!ƒˆJ­d_OEðshf™ªYH2 [Š º›+©— `6½]!š,Ǩ^M·Û Û•í3¾xƒÆmßhf«›àßïm¦j4ΞÓùÏ5ÈfáUJí’´Í ï*•YëZë2ÓCIæçÛóS†Ú`—¾µÜŒ»ˆœyZMêt*8R ÛÑg,í#’V³VQðà| ¯©–&>ÏîJÔ÷λ§I\Ÿ²%I0üyÔö}$¦üìÙ„ ‚«iz››çЕ¾ñ(ëÆ®ü]w;xtÏH€9|pœÝÖ]¸žµ4SöèA6¬²“ÁÅÙ&ï¦ê*ºçISd’÷qùŒ$'ä,}Lk…f*!²±’s*qîœßqW¼ïájæó-•+\0ÃÝç(”#_E”#û…Zóñ‚‚É]¹|ã¾Â¢  FÈàØÐ¸³¡xúŒƒoÎßw@ŒŽã‡ô%D>ø¦W}x`äú£ [I--‘‚›¼Þá©ÜEÔïTîç¹'<½Wæºç×tŸøX›Ü.­ 9!£¶æQÁðùE/€ë$rÑ)g¹õ§F_fâo@?ëßXݙ䕓X×€3î÷Ü´«|{èûü]æGÜÏ<öòes"4;óϬͶ̯%XøŠcÖ¥£Y«+œÅvK>ë mä–÷Á€9÷D×¹âå°C~Ýh‰ßÏÖÇNšFÿ Di ¬y¦¦PBl±ýÂÏÛûꥌ/í—ËŽÔ~øAù/Ÿã )Þl—ùo9ÄD_®¹ÉK‘›ºXÊ™‡´vGð`üç©áéB§v²!®Wbkz4Ç£¤PRB×mÎfhŸ\7ãòÿM«A÷G/qåöÃÄìè)6æÅ0ãáŠ:ï à}űç½áæ‘ë0ó‹Ý®eù=x±íÊò×þÜ™D¾ÖÊ}î¼üšÿø ã8,×9glß÷÷þáç4 ?ýì[¼yã­®¤ne4< NGçsõjÕYöÌ»ðCúèy¡‘¿P•}þÓÝm7×逷ÍaàhtÉŠñ7êOûz¹7Ø# ÛC±ª:êbk~Ñá¯YªÂ]5s"?/þâ¹rþ‡áT^á‘ðýÜ~‡-lüúä~±Ó‹ÍVW#èé£/‹þôÜ5Ÿ/9dï>,"E€ï™‘,Sù²ÿõÂÁ':¨ƒÖCké¶³ê±Áß™¤üã£+ï¥öûdþüoßÎu×¹õ˜­sýüÒñœ¿Jxç>6Ä~gŸ•’ü(E³«[ŒÏWûTú{q²^€‘0Òø–ˆÀ%à¶ÿ"ó‘²ëˆdƒÜf)¢õç6ð\Ý%÷¼åøÞÝÃü×ûËÈ]ÿý`ñý&€.àÝÜän;/;ñ{Q›³­o³-hOÚ–e1N1¦Ÿ§W£L¤Á ;ø©Œê?µÒX»›:'õWN°òs4 ™_¤˜Iùwz¿uÿ°Wó»Y¨ß\À¯3Ü~'ƒç­|;¾×îâj ÔðM„ÞyêMö|¤L5ÝE.Šß‘(?Ó:Ì“M}pÞôÏßûäèΟú7 ß³T¥GäÙWd– ˆ¢+Çol|vÛ¿ éüD‚Ãït«Ü^/bmøAž•²v­òì0ÁÒÎ~Þ\O:ú?Ï\ÓسÍk%aØã6•÷Ñ–‹¸ëŸ\6í³PÌç¯èN—·Ÿ÷¡Àö©MFYè?Ì«ÓÌ×âx^ær¿ ΰÿÂ~ ¤n%¯ŠCÀ0ô*qagئøº°S ZàéìMÊîIU[šR.«.Ÿ-äž»; íé¥3ËÑò©Ø¥î—¿ý[û°=sîŒþQ ™t\ò‡~Ï{ITâò““¤ã}Ö/%ýÄ>È]A0T…F—^ÄŽeÀiT#çÃ'W‹ÐUD…Ý5¥ò³¹L{{ŠÿòÝÊ~U4ví0ŒÝ©E4ºÖhêK/Š'¢k5fõn¢«®J)¼6*D³®ûÒ¯+¤÷ý²ÀÓ$1 [) T›ûD¤ƒ¼%Îêµùq˜e^v(àj’NËrS©[&ûbýA‘½’#No.vÿ¹þ(Ž[Y‚’~×v(§•~}-OØ×v«Þk5 =³,g®^îûºö‹%±¬HáTBN²àûÈùÓgeô8Ën2%ïwQ}”«ã­FºÎáþÀêG÷Ù6²µ5v•Rk1à ¦9Î ~·¼r—{…¹ãùqÎ\÷>¸l¿½6ÿ®|í"⬵MöŒ T#2ÈíwÈÕáØÛ#"òqLR™ÐaÖh ª‡RÔB•a^Vš…Q™Î¿ € •W|««‘¶eÅ@!k“¦ÞËYAI£íÁÚL^˜ÒWæ®@Úô¤nÕJŽHÔS¦Þßåýi;š»sÁ‘’šìé쬹š¤’Î,ˆ&=zÞ~ ,*—äítÏ3µ¬òÍ3¸.Ž E†”’‚­ê$‹lžÊöƒ™˜5'ÉJ%Ž#Ñ‘É ûûº9•P•Í@]ÕåRÎglÞ¯=Ù DM3ÀÒñN©&‹ëHVÑ$ ÍÕ¤÷×(ãY„•0‚¶"<$¼‘<MIÑ£ltzÏW¶x²„‰:QFäÚMJ¢‚P˜´~;Q×I „jBHÈ^ŒÚ°` Š($ wcA¬-ôÆF> ä#d)ç‹ÄÌ£² L]Þ«õÆ@f&t’é~¹R{@:œºñä‚QT§í™—ãáSëvy z μ½à/À=3ÝBg—tˆ#]:h%’ñä¾ïe¿ž;9×[Å—×ÂiëÚWúä³k¶ã™6nz 3ˆX;îDŠ"¢Åbf¯äãzNO0’ÖàP1µ™ñ!ô2ˆÏ‚à!ƒ”¾ç!J ½-›˜M‰³To£\0à X»Â±;ÓΟ|J:=™ó£íŒ:‚»ŽNÒÅÌºÕ ŽàZe |(ש%…s¿Ñm“¿šœ–^”Ð! Î;#fúW YÐó¤$¤ `L5Y:»AÀ´3¨À}×OggS@ &Qëó˜`«ÿÞÿØÿÿÿÿÿÿÿÿ ÿÿÿ÷_šã˜¦Â=êMµTY(G„“±R/×BB‡$zÚä z è]é¡·çsÿè˜H×nÜT,'Ç»7S¹!\ßp¨L"³gŽue¤ « ·³4K¬f…´"E²®u$@’N{€¨ #dA,€6€Å@QH%(*Lµ·J vªáäå;JÀ¬29ydI6)këé;zLæÕ“—¤R£&|Y¾Ë-Úòã(™®v«ü°Ð=‹<-"“Öž¨[v€{¾´o…õî´¯…yî¶ÛÂޱط1“é}¾NQ"̃Vï’ê¹Óqs„tp\€ýn®|™p”\ÆmÚpƒƒm(%„Bñ¥;¤AZgJ¾lˆz¥@p' >T”ø ÒE¡-y•ç7ûü"MË`ñ(³ WG3¤¶WööKo€,]¾ÁÙôÖlIuy`NHg7qМrñg©›u¹œBGÒ³ Þ噳‡*ÈNP~?;ñòãð¾æäžºUºdíYUÑÑ¢›•sˆåJÒQ4Ô’Ý25't§™î‘–p¹P³€¼POg¡¶{ÌæìIA7d³È”ZˆdºâH›ŒÇÄxZ®D»v¥ !É31=–Ðjj×LS4ãk˜sqïWöéi²É Ãûö$3 §hÑwÀÈqžÏº…NX†¢gxã€Ê*Ö›4Ÿ¨¬L0³N#0 ö¹DŠlT ØÎ"à´$ 0ÀšB 3 Ccפ@" HÃ1ûÞSDMŃˆ€ 3¥Å†",4`A>E!ƒjU F¨« Ð þÊ5|̤=¡{ÅjÒÀ’>¡÷N'=K`Òíýêm)ƒÏž?“Ñ!æ­9 ^yà60êÊýî°‚ H‹7I@g,œIÌd³¹Ì<±¥L1Z,EX‘$yî‡Ù5ö¯%+K2Ä_Íݸ_W²SfôÿƒZ3†Üu‡¤y%—ÿ¡‹ÁÆ!|™s™Þkº/’ ™àÏ»²8±fЂ´æÈ ’^$S^TX• Z½Å ³*m,™ÄYÉ•…’U€4_ÛŠ;.@yTn¡qµË ºh×¶zÎm{c„ôIœ¦ý¤‘Jw&[óWï|Ìû­ íUÍÍ4¬-ÓeJÈ¡¦+¼¡hÁh U:phÊs=Á{‡ä4ô WmO Eë]³ØöÆêPŠ.Z ª9ÈÛYI -ZI j‹õH!lcÖ)ÎÍ4 [ íCRîZA€8‰:‘Ȥ#4ŠÄDi¦ý›Àêˆ Ad7H$:TûŽvd½7ŽÚät€Ñªµõµ1,5!€ÔÂà·QH¨¥jA@T#‡N*)ŒA*€Ýb ¬¢Ê?K€•Á†ºX³ÀÇuÞ ³„ÜâZ°Ìüa ²¾H€9~Ëm4¦IÆ 2q¾ÚlšùpL…Þ ê"øô“Ø]~83ÀW€\¸ÏA‚hã „Åk# ''lIÜ$€ÅžpÂ.ê×0?§“O»$€ C°#'Ÿrån~@V(þÌwQÈ0ö´!<ÏYBë#ã èИOÛQÀ¯Þ÷ ” %·†{Ìn; [l$؆3ž• ñu£[ ûnøŸ‘”, 5ï˜c—NÉPrÉ^û½ÅKÉ,✖H´@$ƒY³¬ .â%Ù($ú,:¯uÌ]OR§¾ýyÙūǖ³óº˜c×ïJµ kÑ‘–P{û_5Y(2ȨÔðPµ>Q€44øvõ¾Íd]›¨šòG»ŽbL(@Á¶ 3j’HÂñ¦{f|} ֘)>4ëÖé$†l—= àÊZ%WY[*ЬJèKNAÂ,åëB² 2`”, âV7äõN‹ hµꈄk°¾™ªà#9`jÕ£R<Ãzè@Y¯¨X *@Š +Z@P€O¯h±Ñ)àÀÖ-4FŒXŒ€A´ÀA¸yΪ c3TTQC@\¬5@ —¢«À*@(Œ† "ÀX"v8>Þ»]iIeŒÈÌy¿ØÅ%0Ù‹Î"Ë|´Ç™çŸ?ìâ4‘M½óÝ|8] ž”Íúý/6T{¸Á‹GEFm‘8mmpM&¸°%®ÙûÅ€ýÌDùXkÚ{Noíàˆ¨võ [Òþÿ¾Œ?'Ing7¹Â>X#€(€ûn^G³x| ´Æ–çöœ6(Ž3Ì€,³®æl±E˜pŽF>×ÿèØfãñ¤Ȣ͜Ö(P HÒÆHÑÁÀŸÙ‰bÕ-@»³ëL),ª^ŠÚ7‹z(€àÁÇZ …ÐáCK´ütÈs#ñ%{›”\ÀuQF#°‚¤Uá7uïr6§45Ì–Á‘ÚEih«!ÉŸéòÎ×TWM¤«í3)E@+€½P¦­ë#…®Y €‡“.–Ž4è92¥®FCÓÑØ›^7™ÆÏrè @`ÆÍ Kuí݃ `ô4YÔ©ê!Êpj{ @ú¾Ì  b5iAñÚ… KðìÁóÀý€† ­–z[³  £ PÆ0²dÍ8pÔ¹© À˜¬ùîéï€`…Ö€µVj,-€ˆš H©ÜÁ a( rƒ±€DÜb©Ø€ä&¥>Ëí¬G áYÖÃËÅNº±/z«*ÓHÛ?À€1¿¢ð‘³«€âuð2SxôàHQmOÁX¢­kmP¬cà¸ÀJ7 €à"?=ÞÎ6Ö|æÜl¦ˆg ö¸K™€š€ è únò S ãµÏwç C² ‡cÄ%·<𸟿ió“4 D¦³'¹¼÷}Ó—§Iâ#òŽøÐûóBÞJÑ<€Ê'¦í¥ÁùðÝç5%¹@PrA½¯yg€’Á—JÏ{%þe3»@@‘Pì³éV Á($ºµ†>cÛ›C¤dOÆÞ$ˆD€iFV0w<øž^C:rðnWeÞhËÞÌ5¦“ŒâIùpf´é[Áhf~‹]ÒÅd½ïfÓ Ë–†hÄJ;äwd-ê–ÂQ:&#“ðG€ ¢ ¹žÕ™zI¸(Óíih­³·ŒÿBVæZ ! ‰ #‚Sr6EúÈŠ‚¥R¨€Ši£!†  2´+º Ø$€Êúª ‚mtº ¸Àˆ1ºÁ )õbÉd 5T@ÛÆ½éªËÀ€aAˆ ª*­ ÐÂ#BtYÁhp `Dkâ]ñÀÄ2 s þ«ÝÊ5Œ‡™Opƒ¯§¨‘ÒªU'W|†èVW$ÌâøäîÁ'=ÿViª YNÛÀ«ï˜UÞ7`O5ž€¨nbšäS«dk]»¦8ãÌ´d½GÀ…;q™OL{! ÙDû¶å{Zbûœ)ƒЉÏ.¦ÂT" jNůDX6ŸVöÈGLÏSZ´i Ÿã}F•àÕCÞOûÙ¯¼ëvS€g4[e¦¸Y9€:‰Pz›—4€ÅÍY³+@—KȽ²u‚5bi@ƒRú½ïX4ÄõsÕ»ÑÆ‚(Ô!iG7n8Шm­&SºÖ³j}Ê÷Ž4i}”¤yòwÑk!äNR PÕfö`ËuΙG½§“%g`j`%:ð²aø6Žk¬Ëˆå(ĸíu3šÊöQ’Šè^iHœvÝšI@t×DT­ €¬QP2Ü1 æXn‘a1­4aËCV*#P@‚©ÑCYͲ€H ÒTVN7B c܃´fL@dý¦!  ˆˆõ1ŠXX*,á[2c¨… ¹5ÀÒ X (Z ö»‚ÄØ”è@DQAoH<Y_ ‚@ŒˆÉ€à?€ÞŠQ‰°B[= uÜ[ëKdBfõÒÉ¡Bï™ýéOm‡FiôJðøä¥ÙoÜí“Ó&À…q­ÇɴЏ&pzË9Í8cÃÎ¥Õ@¯>DØÓmÀ™~„ý9ÁÆÈwGÄé q¹“d@+¹î òs v¿–ˆ+à-¨ gëÙ1o¢9޵ðÀÈc™lòóÝ'Ÿ]‡‡"¶›@Â;±å€l8dÑ0Ã)ˆ;)d@ðçs Jðƒu ø†aPÈPÈÞ ë@ÚDÉÁ@L†Çá ¯àƒ|v_\öy|„DÔ@±ëYÉ ¦¡¡ ãü¬¦Ñ‡;«@вÏb´h*¨.¶ É`ùU°jÀˆ¨`] ˆþBÆŸÉ8±™4GY‘@°îƒÉx0ÞjÁ«Uç ¾Wl‡SD"ÚâҹСïÙŽ§D¤èó|Q|úÇŽäØÔLM @~°mxÍz팻WÈVŸ'È©p 0Ð/@N–{z§Èp®=ßEsäˆI˜Óû”… ðórè²÷ê­¦ (䵯Q©4ŸYÆáŽ Š'¿@(Á1þ˜  xUßœ¬ÁoÅÞöxðúF8©?l: bÝ â:kQ€P_ ÄŸy¥ù¬8E!d€üJB%7ù¾Öñâ“È{)Bÿ”‘Ú{$ Á™ x§Ã €¨éŒDˆL€Z½jhZ 4-Ó?Êt ¡lõ•LUgÙ-êß‹¢h°«³4ë3 Ìå'©ÙïÐÝ€-³ÃÅv*€ @'c?2îMУ(ÀcÇÞŠ Q¯C(ŸÏÖ#ê @ƒ˜#Ë÷¬ ;9 €xd´½²‹Œ¥kÖªB ¾6ȲX?UGêl @•±³âLñ€rPHy p×4Ñ‚]1CÁQ A‹Å €B7€5‚R €J ´VÕ`cEØb8¿ŠÀhmQ Ôƒ­ªÙçñÜ`ÖOggS@. &RCzOšÿÿ EHFEJFEX\hÿ÷ÿîÿÚÿÛÿìÿÉviÅÜ™«ˆÌ\ð*¯3ŒŒ…I¦Çû<ï‡_ÝDWïÈt¼²Ü`$>o¹Òk ½n X·SÀ,á\7À’î¦Í°1òÝ‘£|:¸âIˆHiD7½Ö‹$Á,ø¯Q¤µ\/)V[vPÕ‹.ÞS¼9œˆ÷ PJуk] Ó7rs€4:6¾#Ð^ßÁ!ŸÊ“œÉ9÷=Œãp„@@ D±¤VÌ9“LER‘Tf°_q$µ8™5U”Ó½ñ'Q_@ €'çµúþåU ’׋;ºÀèÅbJ ŠQ§ÓÇ8`¸"J‰/¨–PÄ.ÄÂÙ-wÒ¾ÖC/Z4Óé×ïvpÖãͼùýB¼3öA;”X¨45Ï—=ƯG …¥4ÀïËj 6;×1ÛÆ·+_¸áF]&S[hT`ŒI r7ñ´†Vk*^£@rЋ>ÄÀÈ)0È‚¾P´šRÇ€Ô£& ©¹T(jZV ‚ PÖ,ÖWQPUTQTuÐ,Ì ADQб2g$‰“tƒQ1€u‹bhjKU· Uƒ°* EÉ„ lÁºõ ºO°¡¨w @` aHïcr Y@`|:}ÍŽ$ÜC #÷c¡Ú,B!àN_®+2ŠÁÀ8ÎCÊ,7î•‚hÆ#ú[Àz––6áô8t4šŸ<â m[."”6=³aðN¡Þl »‘ŠÙ=ܤï1KDA-/¾È¥¢Ø(\$w]äS˜ˆhÙõ R>£ Ûpâ¡G‹¼â¼F©IÛŠ=§±vJw’¬!×Û9±ŠÀ껃‡­mÌ8»+d“2 Ðä¼$AÑ,C‡.J³JTI|Þ¿¶`å#ªì^ñÄ ‚œÓ¼– «´%ffºjÅÅ8 "„´ÉÏ|–®ž“ÀëÞ?e_dGpR­ý ¶}° Jnâ¥jÉÇ E°h–—º‘|\1 €Ö Ò´%c€—¨Œ2}«¶Iø³Pý 3‚œwþýem®‘#Rà C`®5$Y×ûZºŠ*ÑdHˆEÖnm8“Î%oì X&W¨*€…3Ëø ¼FI°—ÝÐ^ŸÈð bÈioNŸm‹&î[gë ocm‹ÆkV+™(¥¬ôEÔŠÖEš¸îBùúàtÈ®~Õzý‰¾.x ?¿ß쫪LÇ×÷GÞŽ¥„þ¿´:… l‡I…ЫS°Ê8Ñ]d±3žiEÙw±V=\'§n#†¥E5»ÓWá2fð<üxÒêÅë„Y›QWcé,⿓ܾ4}ß÷ÖÇþ¸îGc‰k½Äö ¯¦]ìÆ ùäI F|Šh…ù ¥ÙaeIˆïð‰÷ÿ¸úš­lj߈¡ÎÀÕÓ>Ï@Êc®6ÚzïE£¡5 ­ ¤2Èt—ïH.¬x!áœ÷MÖ—ev£® äRñkñ®õ¾ì+Ê QßE>x ŸÕ'xÔƒÞ.£“ŽÞ8l¢Ò.~¡¹þ¾ÀÙ¾hÇ.ÖÞSßz«FïKuõNÆÔÃ[dš6ï6Œäºuþ ¾åe:ˆÖ Ö±mo®YƒU¾A9ü†gY¾½íM…ò­UôÛWO¿« @TÓ>¬TLǯv’3†šº¨~ü÷ûh¸Põp ÷ëgÎ IAÁurªäa Š»7“•4ZóÉÚ]ÓÀæ›o¹ÝuQuöOÓ1Ã@3úBÑ]»Ü°~ž<ÓƒKÔòyÍîâÙÛMPWçÀî…JŠÈOŽs!‘=f—²ÍÀ®ßÑ6±«­êÏ#è‡g]ýþ¤ožÔé>™Þ·Î`øJG3 `†á+@Ûk$@œ Ž|ŒätÙHm”G¿ª¤B‰ˆlÈX?ƒ.È’Šç†gk0½–†Ó ÀÈ÷¹vQE¿v)ÃÓ_ÿ¢•|¥P˱?K“²›#>:¾[RüŸ¸9>J$†¢áCă$zV¡2íQæGï9ôÉ0oíâ”ðɇË rcO8nàÜÖ't¡mÇûÍ} ¤Ðk÷·Øé˜£6/f¦Ò[Ð>$0ª×ê¾ j5¾8£v€œw¥à›ïÇš¡õ7‚ðh¿þ!ŸŠ,webs¡‹ 9àü0¸„Ϙ2€÷Zå"€§ ]w“eø6äìýý“™3 ÁÇÎÈÚÞc²'¾›ª2ž|Ö´6:ñŒµ¬s¿/´Å MÖ|¯L›† <˜tQŽsøs öšãêi År‰k Æ“ )£ã¿f[Š-úK–虌¦‘çjA ôìñ1g”qÑÛ†SšQg ÕgèJèizeœ}WžÝ;kÿL¡¦1Å05ë×Öÿ`ÒnÜ=úcKÅûÄý¸û!á*Zÿ.À™û‡›“½?ÿÞN“ɤàíÇùéz~¿èçº5¤™‘…ù*Ãx$:ùÍœ¢k–_ÓÓy¡Ì<²d! PÎÓpC‚…(ÉßwZE µ¤ÒŽz~)Âmé/(ü÷$ ì) X\„àïFd×®Èý¹«jxÛßY@i$H» È7b‘ö-¢x•4ÁUB$Y…ƒYâcüB–B÷iuŠ€.ʧ¹¡Þç°,V‹³áþÚáÔ›¬”­ŒÝù¼+ÛhM— Öî.L&Ë[X§…OÚZ«²¡Jo…! íf…ùMχWCõëó ˜¸€N.Õ·dÝ“*STe©ÈÁ‹?–È}¾s}¸ÎžA=-ðýÙÒÆlÍRŠŠy’%“xižÝYJ!j¶µ´`À†êNI4‘øñ IÈ'ÔO×û+ d@¶$Fx8…á]^“TÐgŽý¨vÑgQ$@O%¯Ø©¦&s/^çþ|7 =×¥œ0jA²^mF÷ëíTŸÙu$4üüªè:¦‹$OÞãë7\m’a²¨Ïœ-—ÙœÝï†Í‰#£=v± Ž®¹_ê >$ìþÎÄðþþNÒ4“dQTž×Ùø_M% Ó* rÆÄP¾`º÷3ÏÌý9k‡úºÎ΂L7 "ïMO˸$€!Ž,Ž ~\¤L eõ_·¶,"h C«@Ôhñ# °~k¢K Ñ“4nAÁ±4ðÒ˜(@@¢ñ•-¸!€EBù%$M¾HÙ4Û!üB'ƒá›¬šŒh§Ájà…\‰ =úhžªƒç~š·ûGéýtˆ¨¿ØßϺ\€ 0Û‰'¸Ún< mÎ&Î@­6MU)Ñ*,ÞænT]|TÛ³»Û/˜€XÏyF"ž'Þ”u&¡ð?8Ràâë9ÉXk}}ór‘AK–:gg|ò`KA!gŠõ2›Ä-ûJ¼÷Õ÷ýµ‹ÍÙü|TѲÐàƒTeUv}3"ÑìX["\5VŒ&Ú¾±å/QYŽŒ0cµËE¡P2¼_êòÍ9¬B@5ˆm¼E«FÈh²¼ð8Úɬž“½þûb_âø¨7ÀÅPœuü8À$Y2û¾Ä3ÝyI:R€v]û[’0í ÜõödåC±zF@ÆtéÜmPM{ó÷~™§ópÈêNzè™ ä £^ÉcЦgûܵ%b/Te55Up€¦;{ö×ý“ÇNQ¿ÊdÒ³mI;ü|èjèùaƒ{¾Oú?Íâxü…„o) çål)9,¢Wh䀕y½ßa",0ÚÐ ,—_`ÀópB€ÅjñH%ùG ()°^9Õ3Ûe°?™dôX#¯"Œ³Fr>-xpŠõ3OƒžÄlýôzÜX'bDz'ß–›?ÀûQg²þõE‡€°¢á¶š|Þò `ç 1oW 8¹øæ*9gûh’X[[Õg¸áp›ç™kúyL+g®¹gÎ sûÖÅ- ß.€ ªNUºœ ààwC j»oùùo›oYh†µÚÉxuSç@Q d1Üa—-µ[³ÃZp|À|Ù UËvX§¼'w~üuN_è¤a h›ƒ ¸^Aùë×ãí¨9É~èŸ#\“VÞn¶]7kƒ½Ó°Ñ†²ÿ IÜ@Ò'.[<‡eYÇá¥söîôýþÉã¸nºqXµÊ3VÄŒâ¾ô SæVMvòéÈ$î%‡¹¡’¡—{€ÒÕLn *î:µQÈŸÏwS¦¨ *¡¶KÈ47ÒçýÓq£Ç®©aƒ“êkºŠÌ¢0Ð&«·¯"»Å4PTfW—VÍÉd÷z’ ²ïìš„ÁÁÓÔU™#Aÿü†ôŠ¢ÔÉ䩇0ãU·¤‡T|”B]‚È‚(¶-(> °÷e6(€¨ `hxe‰«²†X) $€0 žH¥9“©—ñ¡›ä’ˆÉ«TÛ$LÒ.r5ü>9ÿõØà7|òæÛø ð#h?ÛØÏo €@Ó*b <Àø<|8Ù X‡õÃ,ÅUà¹O‘3ø‰©Ö2Š…‰‚“ +œõ¯~ú‚ÓK {„‹³PI€ÎÃ×@î úÜy€#+Š'bùõöX3{瞇 |bÚ•ÇWw¼';i×þ)…rüÚþš¤ò›= ¹ûúO®Àš‘yh ;Ö$àaêq2ïBfÕ$4r«Œ¯MÂÙtáPP>,æù€!W6fˆ=${kÖž#‡Yrâ¶4ŒãJécçw I²n2+«€ŠvÈ— T,zþ'çõ…›››?äRê¢(ç°0õu6E§¨Ö…Ý4kL­5óun‚Ä8G=ÒÈ×Ô E2†¤9åFgO€Ï¾ZtëÆL(Ÿx‚°ý0† cÃ+9‡8@G¬·L{³OḊL´Œ’ "Àó:`‚½Ù#DÜï½ÈuÒa$˜£ã‰GL‹Ú-­9MD¼÷}ê¿ßgú9ÍÌq.€ !V Ña1„„øÞ¬9X§E ”RJÑæœ¿‡Ýù^,Um¨u9“ÁÿØ¥=Í>hQ(³ýÛ6'޼'¡ô5Wâ®Ý7AU5Ø>nñ"^þÃU›?üùã̶Á)×ßlEY¯Ú}“¹Wˆ¨æÝr7$—»ï{fYýèîînÄ 2ئ¨xûΧóÞ ºî™êMuÓ¶ZäLC\JÜ}¡Vp)[oÍ Ýn¡T\Ô0}2½ÅËq/¯ãÎn×níeа¤hº[¯Âp a28¼þIb 0¯+ãá@;ÿø—^àD<)‘BÌ~À³S¦:» £š8ÊiŒû¶/:å01Œ@8O9û°ámÁÙŽÀ\ÆTЧ`Ü@è@@ð¼"À]ÀpœBõ‡’úÌ•à#¿*nFX39…}r­“÷=ð%àRŒ4%¸ƒ™7’+I•„iÛ fj"Ý¡•ѺOeòøÊŸ³+Ý^–»gCÁ¸dBµ…Ý›9)ë)Á/¥z_”]HþC ÎIœãi°r’ªc,ãÓ³‘mèhÝúL.A®ˆzÞ7,½üXNIèÀé±k! yT6u³gO¬]ŠüO©ïn?æÉ”™ªñüðqò,“XJaæ°/KÑCáìý¶Ì]}Z{É<g-T£š#™¼?Kï×B™…VÖÒ¸'¼V‘ 9ÎmÍ–ækU*õ= >„œxPuÚ¹Á‹“(Ì\­ÙÚkÚwAÅW´dçê“­¶ôTðÒ ¶MË_á'œ[’ØÒM%l:ý§mÌË $×-/£ÅÏ[fùƒ÷„˜'Í ³ÊP½cÜ-ïž:•×åï eˆš€oùîʆŒhYT”º‡|º?M…0-÷ªŽ7`€”:µxª{®¤)ò¥RíÎ>[0Ì·ü8ä…Š“ð^ð6äÖξ,A©Nðr’¼÷Yˆ-â@Èpæø]œ“ÏÓŽ@1 ê…÷ùgd:µµv ·!œº •¾‡£‰_‰Ànuæ´gc>Re]’æx-}>+rÙ’½º¸n×Ñ¡cQ¨` JG#¨òóëÑä›6¶À*”VñD>«¨3ü¡Ö«\l³tÒUóC%ݤ)A@¾®°-ϰ绅h¬¡$¥:èÉi=,ó~õ!–ç{±øø¸öHO7eyPª3ʾéÿ^›ÿõS[Ïm-¬ë}ØàsÙvün?ú§´Z‘YÚ¢ÿÉËY-îÆ!ëGXÜWŸD#‹ ‘õ8o×K–eÃ%#þlôk¯Ñû^ƒ÷Þû€î÷)÷~s9ì¥æÐO£_ë/5V¥4Ž‘Hx‰àwgsAÌjÁª4 ý*sU®ç´Cp¿±ÝÿC€kÌ €ùúÛÍqÔ·Hsë³Ñ=®ÕLñã³Óë/û}þÌç!é(Í¬Ž¡H5æ^ˆw]— Kíˆ+&õz²šBDÓçÿ9 ìzÅ£óRUãR»]íBêöšgÓõ%Y×9,ñîb¤òâC“TÊaÙã H?.#±†t·¹M*YmS~¦Ë#kè¯Â×?ŒR /ÚpÛê‹áˆ«×ÂgõÔ¹ž\¹+³Œ‰–"I¶ÝgŸú:ÜÈܾ²¤V'/è9—èZæd¹Äû9ÿ„ÙûSê†Ygn“ö‘„’¾A¤f=‹1åÕK¶f½7]Ó·ƒqpD)Å  .ÀÚL#>+Å?Ô:½Œ1 Ðåk=W¥—üGɺóúÍw9ëí×Ô?¿ÿýwÿ¶ø**F^xâµÜrÅ‹‚úáíÈÔré [Tzÿ‡z¢¸‚½äÝÎûþ«é*ÿZE‘ÞŠFy›nÉXæMòsË.>÷É÷söÿï [qUoúCc/<ùàÜjÑÃhóNP£Ù,}W àM ד·&g$ì¸C)roôg¼b-r<ÃûFõ(ìf‘EoAoSplB™E,.úPâÎ~ý÷ï+¯ãë†pÓu-µÙsHýÖÊ ]®»M0 Fý­+V dA˜ÀæS94̬N O†ª÷^ë>ñÖêYHÑ;©3ð°9†à6@Ëq^˜’¶H£ߨªèªÊ%*¹ë!W&fPG5¹¬™ñ"‡lv^ڰИÜja—I¯ ‘'[§úU*B&ÿ½O;ÁakáŒ÷§–6ÎP„ª7Zº3Zá<.ºIÝCä0bºŒW-xÀd@±ÔZѦ ªŠSk½èÍÉc[ˆÊFÿ°²T|»=aåo5"?d?Ö-?^I»õUýªœ\ÂÿBÑKš+φîÇÖ$©Èa kÁ^QìváI¶°XðyrµÔd2²lŠ@ŸÓýØîI·—x±FÓ|󽲪¾µ0‘sÇ_y«çŒÏ™º ±”g·Ò‹IÅÒˆjT"ÀA ò;½X`õà{äZa“Ÿ*Ó;µ:̵âÀZ'«à”ã6§LÞö䯲 Vük™©A£äª/éŸç©‚ÔuY¡ªÔ±8Ðr~·¶ õÊeÿñ¢¬ÊÊ@XEq©h’¶¬¥ª° (ŽônÉШÓðW˺Ô†gqbrd„µá…qÚߦÇ|J}gD—Êæ:¶§eXÔÔ'öår;ŽõzE„B*”£hŒ¢ÐÑ=8Ä+TŸAKA!êJDÚ[‰¨ÂåBÀSiÔ‡ƒ9ûQ{µ“V’b®cÁ¼No0ˆR×Oô)=¢@È¿“8\AØdX\ªiŸÇ1c+ ´RuÕl¸ÜP¤wKÕeЙ*À;øìÚÃËÌŒ S˜"ð¢w×k'9šYTCjzu¥‚#fëh²‚u)9 )¡©÷7šú–ünATXF½äíÝw‘ ¦â·Lïæ,jyÖ"Ê2%udUK¾~LòÊ×´N(‚@/‚¾•j­"|)$-KA¤%XE XIR$eÈ×Âsc {±•ÈZLöVË_c@V|!ðT/ÀFt pI`“¼Zkv±4k_z.«¨ ¢…²ÕEUmǪ*¢¤\l«Zu5Q-7(5ÔݪB¿" H¹cкȹÄ"p‹än4nI*ãÙC»zãѺ=ŽþŽ«6]s€?pg¯ À¾L´6›ªËPþk¶Ž'[ÍZêdz:+A³‚ŠRXy`GZ<»ë,ûÆXÊ\f½(†¯4r!ÄØRÈ_,ßTìzIF& õ{½Ü„é:â!€¤µÐC,K:\-ŸÝÇI9ß‹º‡ù~¬™‡q±ˆó[ȹOjVL©¿ì7á¢ãÑšØHûð¿rå(Å´Ë¥"±ë"Wç¥WÞ¡ëä|êó‡Ãêã¨0¢Ÿ%øê¯ U”²?Rž0ç<” §W«C³‚É뉇¬?ËU®å ¸:˥ƀ©ŽbÝ­—º ‹Qzèóðà&ñmƒæºEn¾#æZ3Ê"h5_A@e!1Sâ-$Ïío 7ÚÔÛù@.v·ƒ>Üa".¦!Å{ÁøíÓçôïð]VHwh+3fŒ¿Ã›«÷enõÂú ({Þ†5FΑ;håXcè¤&­›Ÿ&Ú’$[ãÉ‘d>Æ6$¨`ØF¢i½¡™p¼£’böí‰ à Þ–åº.xhK1ŒyØ(êTûÕrµw´ “>JOeLMÒ7þÚ¸]½¥…¼Ä×ßà ié×A}¿9ssm²sL]Ä;«&ÉÚìjyâ)úª­žþ›0=Ù¾L+^ªh˜3qSݼdoú°IšÈÙ²?ÞB’k€ù2ù&UTŒ. i¹~yБüõEYâ°óZ& ²-Út8‚ozøù?Ö½Ÿ¬¦€vöt+ÁiÏy*û»YÓ›QÐ?êÝÌ=wô³£&ÎȹøÓ%Ðâ1mI‡„Bèö:’[€8e þÀ aº!B8ª3€–Ä~'¯ }J’2ÓFjÉôA‰hŒ(7+&2%åa|@¼[|•£ .nSHÓößú¤¹›2`ÒXÞ»M&B;:£TU膵>ð:`‹¶4„}8ô4bB^飛ím¯ÕS|x”JÜ0ã}«ìëî‡ùèðû4•̪԰@ÓNÓ}¹âö¶Oóú`öŒÿªP{òOÝúðy‰Õ>•Üô”ng·H©tVÿñ?˜–Ë ætïÎÛ²£1Òó¥¹°1}ÕdµœAçR^˜·nUQ‰ãUzöœ‘$/P‰§ú²ÚûÐ옙Íâ?…¦)73þ&5nêÞlc`Ú!”û%Q×AÄV¼›»ÃÁBÎKÞû²U/ÏÛ;•ýÿ©gz8³mîÿ¨§ª²›ÁIuwõæžéø»ÝI{âÉ>Yɨ ¹¿ûGÇõ××u/¦tf( é˜÷™öÂ…¬µñ±\½€ë %åî‡\æJ p~ЮH›Æ‚..@ðý¼ €'UØ¥¦¸.¨ôÃׯ-n™Ë8°ØhÈx®üF€DÌ·_µ¡íœÎU€U€DAþÛ-zLŒ¤Œ*×¢~¿Yçh|Rè>Ä“C$qwÝj=œ<:lÄÝþ0ÀŽ _gœÀRÃÖµÞ(•ZéT±Ù}¨˜‡å¿çxʇ¾°nSƒøêû×D$2ãÆÚjM; ¥d|³ÞÝñïE!Š;Á·*ívݽ’’KöxÈ#Âi*ŸåPH]¬Ö`ÿMUÈlPµi\Î3 êFêz ÊUû]¹tà“œ 0ÕÙ·s™][ñýTƒ‘í,ìÐêFDŒŸ+ÿŒšùÓQÙ›ßíÖZÎuiÎ^¯'¨z…œµg zäéäÁÀPÍ Šæh†(O_Ÿ [ŠLÕÕSôKůäN¤û²qò.XÎq‘ _³—ÿ|B¶ör€V÷À'bÖ~ãóð½Þ “n겘ñ|·ôæ‹ÿíËÿ»ïSu* ÉNêwV÷¹®ÜÕÓÙô¾€, 9KDÔÿ.…·éÉóß5w|dÐü˜ÁI~!V¤l–ˆPéò ÜW™**Bƒíx0¨{e‰ÙÕ.AÀ܆©‰F(&IªÊŒT!¹ÛÆ`ï’dVKdÏ5ÇÛ^¼ímŠºQ›RÈ5¸ÇÙÚ—Tƒ ‰¶üÏäQ¬Øò«‰ÞJß2 °nŸ¾oûÌ»¶1üxИٿmX¨H¥€,æª!%꺭éªÄÛç‡ &hƒÃ7E¿¡“L†°4O›}ÏJ‚ù_Ø"{ Y1L^¸V£FôêÆ“UÁïæŽÜø!_YŒ˜ñW­žI•výŸ‘¿ïëC¤`¿f › ó<¤=ž¦ç³ôf[qÂ5—3Ñ9¹p*g`‹„8E÷¥™îÎ~7:zL1Ϲ9б0Sý8*ÔǼ€ÏþfÖÕÕdt|”6æk^ÿTvÿ›jT`*rº‡d€äÇoòí<ï„› Ó (³Nä£~ýÃç^Èõ1rä•ÉÜÓC¿N\2¡@›Ót1•=°¬;Þ÷6ã[Óžrç¨JÀX¼Xˆû}À‚¤.’BïÈò@ØiEa/Köó§DAt3ÇC>k8ì{Ìw¾ú·fò¦Ò@LZÃnï‚ïæÃLzû¹?NÕͪ·Œh Ð)šªœ¬Î¾œºÆ›“‹Êy 9MÏù0Éa ¦¦bŠÇÆ÷c–oÿo-:æ)Âýìó\ƒL_[~ÜÁù/š|4Åá8ô‡iÛŒßçÊw¯”3Ç4 5‚ݧ$›ÃôÐôü»ÛU‚Ô–öxqž€æ¸U@hez ¾ÒLÚ™€9ÛDþ‹Ëœ¡à  ›N¡n¶—oCÐLe¹ôLíª¢øp`òôtúúPPDÆÛ@öÛŸ+úÏlÐÀ|È»áÔžéý¬Ÿc<0}¢Ú9½«˜®9{<ºx:’N.©+¾èÌðÃ] ÌE¡©žñiÉÜCÞëytHÝþ>ÏÖM' ‡ºNíƒó,º?S¯“©½0`Xn\P`åîãe°´a–‰ovó{ù¿š€ñ$ À¬xpðàÞëý3Ufïi¹Vã3‹¬(RÅѳÈz*”ÌûzŽrü˜×ö ÀÑq#Œ™øc¶÷?nêìÐv]C"•‰‚ €z7ÝáÛwža¼âýßý ƒnÿœï«Ôç œôw$¯w=…²:Ø À+óÉŽ³oɨ՞ױ<PDãGx€IC®n’å[{7«[ÝZ—¸å¾ÊûèÔ×{8Må{¯7Y9u2šÊ˜qŒ¡Z(¨À"jufÃPˆ®{¨ï‰·„ì–™·Ù·aŒsÎ[÷½kË9Ã9ó~1Šym*§m‡}_è¤÷Ú€'¦µK$ר3eÇÌéêM·j8Ðú¦ÙóŸ÷Õ4<솮ºPv#Í:dˆHHðÔþ¹^f8½¨j*›š¨¦)2ÙÀ ] ´€æY;QªIÍ/H  Š!Í5 Ÿý#ïéÜ@Ó f.^Ï4gæ÷g0.àYËpì¹Ù¸ûcÎÝÚ÷ €íÁHp$J´€ó y@¶êEî'Õ›>ºÇÔÖàTº%ͯˆÖîÆy†?À7€hÀ½ðž~[çqÆç êÌt]‡ŠÊ’$l¸A k6D;>ÌÛ¡ ÛÿñR»e/…@v×ÍØ³Ù“sv­!d¶Û­íïËv×¶´ž9Yd a‹÷©Ñ…ÍOîJ’sÎMPŸ0— €dÙóâ%[’X+ö¹ñÉ=ÿnÌekkN×Qýzœœó¤i¹ù´23>9À¬ÍR­[Ib9ØyɃüR%—FeU<ãH_ëT[²èßT"r GD+Þ1¶l˜&š/“uy½Ë£™ìÏ»Cî $ýOggSÀ‘ &UÍ  c_^JNNNWTZZKGLGC\XQWÿÄÿÖÿ±ÿ»ÿ¦ÿ—™r³Äš2t¿é}UÃNU5T%YuíɋҲ]îO‰\>¯Åk;«iûGÀæÔ…‰Ñkz «¯J²ngû›Õñå½Â¸œ@p¯u®§‚Aó™{êœÜ¦J"hà‚ ;¿þÊO«zÖ$r HˆN*}ú8\»XðØ™£cVæ§·yñ €^À €RE <¥H(¤z‘›†›¯Ìm™wuK¿m0å‡èGxˆ¶R"Ož: é`cYFš~ÿagux•/Þ941m+å7‡{[sÍ~‰Â«;¢¾”üŒ_('ý"ió°³Cí:]Ä€ ïw&S+¼‚…‡±&A››Ù­îtØ?NÛ\‡Š´Í"—VDÝà™owÎõþñOÖð“zKž|ZƵ,õzA¾ú‡‹ú9ؽ]8]ÉQæ3n¿X7Š0xEͧMÅìjÉÁˆ íZüîbñAêüdýñ”t+g2Çy>Öynûn2äÚo …óË“ÿã2Ʊ®ÛÛ%„ŸÖ/¹$«B ©ÄI?ÕŒ…åÔ²R±X„-Dø¦Dx¦Šì䆅g£ðƒÎ¨_.zèzã¶à;cê‡ÞZØŠÁàk%7GÔ¿))7Pþ°Æ,¨~‚QßK¥Ž+×T¦;ö²Õœ›)C”qà¬|VË?K¥[ÃG=ûmÖó jnØ|Ûr¾tÉ^ë­3þòðFåõ‡p)±*Öe1áDˆ§âc×q9†ÞÜoYß3ÔS9Ûä\TŸ ¤~ š\\ߎs®[­îàÀG}—,_;ÓÞ?S.oöф͕úÒ,‡ô¸X»ô°Äåt1K|gâ958ø$ðks8ŒC¢*õ†vXÞ´j‘Å’0?v±ZÕîF˜pͳrÓuÿòa+ü q /ßÈáß|ÒßÈ÷ŸÃ'ÞKúÿ>É ›žËÇù{4×ÿðÏöÌWò6"ðôzá]a:©S/ŸlÉD®8Þ °Íà6,ËôUKêòóƒÏ£’9÷¢þ¯F¶¢ü'™wQ\öß­G Y:½"jÑ‘IØVK#Š^£/ÛgC9ã¶uvµÈ^âà»gÞp(/¶½6áàÍ0ä½/˳¤‡ñ‹¸œŠÈåÈ¢áyiE9KYIuU¬£+ýÖÓu¹)bYƒ¼»j+F\õ.ôbù¦R6N›æoVNH“ÙC…8ø©Öõ|(É9È ÇÁ±>5¬¶L¸ªZk y½ÔÇÈg{+™ž,Îæ—Ô[ÍuV3ÒAV¬(/^YØEPµ¡#ø¤nYóêËÊõåf‘M‘—²àöäïØ‚¼x5;X öcC Õgîù·}xôùó´8ëžnÊ[{R,—꽦â¥ÅÑ´XЊVZw_ÖTY©á*dˆÄ^©Î”ÉV‹¸ånUÛ$.á¾õp)8àéœV5|¬+èÛ¢ÄïŸFæÈòÞO¾WzO8”dÝ YÄÃïµöwÃ1,>ŸÜ~ÉjÀ¨B¡òžz=«ÍTµ;ì€Å1ßlœÌía¾FS!A~y2ª×¹áÛðYð9ïm'#rFqT/.E¥uç]K‹0aù?€ F¡ü§­s¢Î??ìq¬Ó"ÝÈñð~tÊWîû%R­S?£H®pÍU»¶‹º’âî8%!QQ×Tìrá œ×ÀÖ™2õê_Y›õªÐõ\°À„go›¹¾ÛtüŽÕ1¾ñ§QŸøZ°—Å>NÎ…ó aµTcÇ\ÉßüidoÙ ‡«½êÒ^ àÔ÷zýùþ¼AÙ#pœ´wëÍ>ç­òÂOŠZô{¼xEZ¤É©^ÜF,¤5™á ¯%þ‡˜âÌzI3¢—Ö6ÜZ+:ŒYML‰{Í WI¸¸ŠµÃ=Ç?yä j(Îß}ì³í*ãþQi>?óÈÙM¢kÑR‹R^¸J­ÕD)ƒ×.Pë[+¨5ŠRÑ1X×*ŸF· 80Ö¢æ Ëòâp Ö% J„\Ürñ¹ÂòóZ8Œr‡éh›` ð ÉÄ„"lóuZ¡÷–Á[­Òî5¸]yU«¶*§…ÖÚ:Mˆ¨8ÕSÑ&4¢ˆ  «:­Ú ÜbAÓp"ã4*-J²ÊBÈûrN„=±v˜ñ´.®<Ë«-0zµêG©»•P­¨ÙÕ úÌdQb\Y`Ä[U÷‹@mV”§»´˜6•ªB¡kí„£ÕhÛå:ªå@„,&ˆ w­Y‚zÈõ`KZ÷øÀŒ1÷V?bˆ¢ª’–J€ø)$±tŽ y½|5%ÏçVB”æuJÍæÒ5wýtWþůý"ú²÷3ÿÝs鯪÷£Ó÷ØmbÞ^M|é„·Èùg§ª\|üàN¦<¯/°þMU"ó‰ÛÙãüÄÞš” @•ÌrAtu™Éx]vEG‚Qo/Õ{–Y§ëé ¾Ž§…iR–zåF…¶¾þÇ0íÈ2«ž³óÓw6€‰‘9@Š·«­˜Ãæ”EAå•wWÀ¯šÜdNÓ5º—¸!g.&Î~eM¡öËd3ôÍ~i7M7¹‚Ü0-‹b]¬£·›D§ÉmF`À“ý- ™n.?Z)`rÅk’jë3´µý‹D„ž?Øs&ª îU}oó9Žÿ0u=^|<ÙlÑ$Ìš‚¢Z„*àBc ”1J¨Òä7½„Ðv·ÖI“üŒˆ¯”ÀQ î05ý7`„DR5(E”ÃýÕê”xÄñ6”ôÆN¥ S†-sìÏuŒ-uÇk:J^ÌqQ;šPX¢îskm@Yjzr^ˆÌþfRºv¿^=œÓÆàÀäsÍ·-¢Vï§÷pµf. X×l[ÝúMà?Wî½0ºáÉïÄÈt~ôItEã¤HVi¹xÖ^3çå$õÆ iy.îÈÃ\ò¿b¹®*h«/Ÿ‰‘n”RŽ Ð'±8áù›R¿õ`Æ|¦Ýi-WC¦Ȫ\“Ó•Ã;õ9™Ï8íÒÕi²úGAou™¬M‚F™â3¹AÏ0UÞÑøý¡9¾ùí%ëϷ瞌öál гf-xFÁ–÷wûg”uÜ]•ev>ü:ï=åWRŸÎ½ó'»†¤ÄéŬ߻»ÿë»ò4}òô¢,%Uô”&yûXü@VšlH&]ð+ŽèŒ~¶]}“$˜œ§’óqŸÙ9Q¼sùÿ“Rć02ßgÙ¾¶Ü–z_bvöP?ƒ‰,þ¿Ü Í@VNµHZ¾-— ¼ Ôn „0`¿‰âTŒÎŠA¢mÄ*üßÚ©f)‡H }`Ø_0Ë€(KÊñÕ²Þ¶ú†²ZìƒuÆ<ˆä-# p þË-zŒ7ˆ¤!™¶Wëu‡è?Šºy<'bvCa—1yQ®–•¡ù pÀƒ°¯{GGÔ××Zãê*ð|?méœúu[üüG[†œŽ>·½€@Šù¿­… Ù¿¹™n¹ìñoFT¹Z3åjԇѧÃÁ¯ß43<¹LªW77Alßj:®@ä$¨§ Q#®Ìä€ $ñT´·]8)ÎL:7‡äxÊb àg¾¸¿–7¢×À³kÊ›¡+I œéšÊ(<=ÔL1u®w[" ÎLg‘uïÊ$UµÉ•»é½™Y‚v›š oM¿ä[›ùéÕæ&xuO÷ çÈC†›màŽ6••Y{b*¾.¯GF"¶!·ºz2¡G[äâ³™k©Ø˜`rݲÿëíÞ¹t–ÿÙážÓ°[dêO€Ù:þõn©éJd¿úИ÷ùû°Ìÿ1€ o‚*íJ¼È!Y``1ý- vFóÅ$ƒ.]:mÁX *¤Jó¤¿)›°“6^(´DJĈPÌŠL 0 ¾Û­æ s€^í¤çH‘èôHQçsOEd~qƒXe¯óó£±Ð øàT`6þ`ï¾ ÍêkQ Ó  °ó³´ƒ)Yvº»vøVû£/:0ó].+^¯k}¨p.ŠL¨‰ŸúÂtlûzúݲUe[³0õ9ž¤ú¢Oø¾Ÿɵiûõ‘ ã"¾¹ƒýö2 ·ö»_`":Ó.SÜý ®O£P‹•–-¯ØþÝ5|Äê3/ÓwBŠ‚aŠ›ë–}˜„&»çàmsÍý#Py8Íp®0X[à§wÞ`ŽDly¿ÉŸ×éyßÇBµ‹~h>@öf|uStVR¦'«zÙÍ>ù#ŽˆtwfeÏsïQÞÍ8¶Ö~í'ênfzÆ0ôœžJæ4ßÌóÜ×ÖßRÉ>sæ¬à±¿5ÝëOÞÎêø›¿uùq®ìÏì¼™zi¨Ÿazk²pþªU(”šZ.  ðyü }vŠª‹ŽÜiŽâZ"Õ ~Ö ݈’$¸`°UŽË`(*ѯÈî.$ ¾Ûír›ª 4R —Ûô6Õˆ!øˆøLÚÄkU½šíÚÿúEß^^,‚ýöئïY½¨Y½JeIKBïg”Sfàþ®w,´yüBJ3>|õ¾c%{@×sà$éÂy¬íJaA~1”÷!„é1m~ÃrŸ>âÊï{7­±œ?2Š•EÂRd®—‹·ä<5‘æâ°ûï|Z7 ¤‹#7÷Óúÿ}‹zà,Ì´{Ü)Ù–âÈZëæ¥Î ÿmb6Su)ÆQ7>G¬ÝÎIrÜ]‡z½»Øgv×Í•È"i¶Þ‡éüŠ€4PC4™ßÌöòƒ†¯ÕÁŽaÁ¢ –OggSµ &V û5ë%“ÿƒÿ„ÿKKHXWXFGFFHHX[Uÿ›JIJKKFIYa[akÿNÏô^mȆæÌMCæ4™&È_Ù9ææ]ï ú½'Ã<‚ìtTä÷™¼°HÈ„„NI"ƒ½OÇß·ï²Æ¸7Ú?UÙÌaøé³1'믗aº`ºgês½åÎQÄ–¤•ã¹W=¿ZV©È¤›®ÿˆ~)a%¥”@¾RFÇôÍæ^`¹Ä(› ÞÛüs ÞÝmÓ8x&+…ž|7F^]_¤ñÃ6²Ñú¶" ¥(JD/® 2þ¼®0:^ÀùNXA€Wß^žrWªvƒ9¶¦½fç‚&­leV~ÎÞ¿¹~ÁU·sXß=ŒU$ŽŸ¿/R äÞŽ$Ê™}Öż½/å3»Ð]'[5ñ÷U.??Ú;äV8öçJç6I†8ò0g ¬`è%†cwl ªÎt~aÏçÖýÙ#B“ÁóÍvÜ2þX@‹L QLÏ{½«ƒw$YC/Ig kŸ:9“u¢€“Ô<ûÀ[™Äxgžöþf²74Ç› 0o>ȶG'OX¢…¼ÿð'Wšª„šÉÒ5ü¼}§zLÑIºŠåÏþ¡v]ýòTÖnà\\³³‰¼˜#É^윋Þ'öÞŒ«µA.áÿdSû*eÅUÎ[Ùaô;€*V¡!•âRAéù+@ÔU?‚r,I³@’w×°žÛMúcÖZƒ¦{X;ÅW„qɪó›Ãñœ0&îä<Úð`äûÒ>ëGEíhÕBU)"@Öø|[ZtÖ ï¸¾ØÃä6êÊ8{Çg^♽’ UÀu+h¤ùöZO÷›ç<Û]<·×*gñ•ËaEæC»´RåK‹¥Ü~Šï­Ì>Ìt•AÄ,ƒã>‡†îœ„šú\+JõØi †™¸rø ðó4s¯d-'÷So–hŽn±|O~/&šáüœ³3l9“¡Ð²Ñ4Y]ñN°cúŸ@eí­qÖO ].c·&[?ã_„ë’D‘%LñpàN t,0‡dø§<LJ¬ö<Ó°áXä#/Äly±ÎVõP dBÈqöü`âTTZ ðÃѼ•õüÙ×0¢«ª«ìÆ”s{ËßîqSs1ùé¹¼ß*¢gzLVC3LÏB¼Àg¨P~PqÀ&Bäè…}>yYŠA€«ýh6Ú¥â³[c`Ko4‹Àg²5馨I‹Ãà+À¨æíhæ:G[³Q‹Z¥ ‘€xç$ë$D¾½&ÄX€´xöú:¿Ò낃ͮ O»© ü7Zn\ɳwíbûŽþN:ÔðîÓ—,ìÝ7­–e½2W‡ `¼¬¬Ô_=gÛˆt I©7t~lÄ\NÛ×»1PËÐ^£L7A÷ò©  çiv÷bÒqÕÑ)ieÙÅ€R§qF« ÷{ó_ÎÑD÷×Ûˆ¥\í »,¡Ål‚üÏh)±><Óuè¾øès¥^Ïuö ¬§ß÷ÎN™¸és¬nD€Ï´n…o‰9î¶),—ÐÁóÌ]—‘aÿD§µ×Ëéì“çûî“35%¿'Óù䡟i†O^¼¹,°zA¡GÔŠñ D½®„õ®W>+‚?X£nŸ7×®ñS'Ì °¼q êkûæ9ƒñzèË\²§’äožêÜ;ÿWí£ýo›zO:(¼ ÎGÔzí33T)ÿh§[Ųg».‰¹`wžüìùÝ«Õm."8ê8ýûÙö¼<~Oå;¿^äù× ?átMi5Z–â¤çÐýdÔ™ÑóÞ$ꪩ8´µ¡Ô\9Ô’Í‹FE^ˆ6¹—–o d¯Ð¤ïXµ„¸†Ö¾tS9E&Èÿ}}mFë.çã×ó¿Ì:Ÿñ|•£¦¨e7µ&$QZµèÅ`ƒ,Ú©nÅb“}XW·’»òòWR.¼ÈÒò¶MµÎCF«×>®bT ¥Vô"p#‡±@Š‚@A"´‚Ù^PáòVµÔiÄiö8€rP8-’‰=,áŒj¥ýû÷T€‰r*ã»íŸî\-peš/f€@­Ç~Ò‹è¼1`¬bÑ;p2;÷®.¡âR+ªÂΟ_´þ\V\b^Ì\e¶¤_75­qäAA4û´ÿË2Цˆ*ž*¾-ãÈF‹Hšò½œ‚©‡Ä%åçíŪ¨\®õØÂ ÀŸæA¯?;·Fœ]®ùIÏíê٦ǥrÈ«*åâ(·!C™BVAVGêB´v‘»Ö3S»é|½\~JgõúuÛàÂ@ŸúŽ=¾§Ù_ŽzË®®'þ<]N¿qã/ªPÜö* X°¼êEã«ÜnÕÝ'"w{%w¸ÊÙ{J£ÏãgN´®4É\ÃpϼWLô«éh"VîéWçÏßÝV^}ÉNV E9‹šO¬ 1¤~áÝ5ÉpÝ×+¸K„ˆ¥|ÊÆ0xJt0ýÀKÞy¥ÉÞËoBS=Ñûö|¦c&cQ…¬g@€ °âïÇë~ ÔzÍaDIÙiWûW+z³u)˜Îïž~2û˱¤‹0®8ý¹Èæ­Ø×Þa¯Ã ‹zó]ÃG~~î!¹~õzW®âÎÇ…ä±¥"ŒºßZ À²¢ âE8†P! ‹í8ÙnÚec»xo@0e"¨ëh%Æè@èF¯î°u…jª‹'‰½õ6«ò+ÏÖEÊ“Q!üú ‚ÀõôsWÔTKª›}#9Z²À”TTDÝ€¡R”(´FÑÍæ6aU›7#—ÑvB åùwožß¾µ/†Äoa@¹ý÷‰øŽ¨ñT}Ñ”ÂÐú*ÖJ.sOwÁ^Œá(ÚFŽ\t1Ê-³ Y§ÅUÅ¡2Û•lÄœˆÅ2¶ š ósæñ©§äšOŒ›\ä¨À—iö…uns޶–uªÉ”Œi—|׿ïw·«ï6öY€ù2€u š…Éæ ~9ÿgL÷ò2}çJé^yÔP5:•/…­]pƒà[šSög¯ý¾ø3¾¾µ}Z¸£..­•ª²eα,ÃäÊÄ¡Òï~rYÅ}ÝE’YÓ>\¾Ê G†s =q—‡•üõ‰ÈHm Š˜jЧ÷;ÇI&-ÈÈ­œIêÊIŽ2LGÒŒ²U.‹dƒÃtgä)§„(}‰¯§J†¼w‹a¦fàΑI@â±ÙK´¦"Øœ-€Šª˜¥éiªGmÈŽ«“r個·§º—ò4=%yw;·o‚2 xIz–NÂéCè‡ ÉùÙÿÖþg&ÞÐ &Þc â*â¹YTèæ²¼©"Øãm¨Œ=ö¨¿y…·ˆ7LJÅ×)`VQÆ…ò1Ÿ,À©7ÌvA¤"ƱDщÊFOQÎI@ë26q€„°7@¤Zé½!z™Èqj£ô ‚ÏCï¿UŒC¸+¶Ï8kÆ+r5TꯘcÞûCeG‰ÓC—Ó§!B+/ZöÇÅ}î®Ø;}K¶l× Í¦8N¬–~2˜pÍ l —B2ä;bu½èºÝ‘¨-¶*˰]áÌ]Ò=·Ø{ê$ï¹Eªvæ‚ga5*?+ìbÁæfäó\,Ù+ªàJÆ5n>>µŸ¯ÁfŠà®àƒ«·w”~mR?“!íVƳžî™ÒÚY®ô7c ÚÎ-¼aíJ”8ˆ´b´ôŽÁ¨ÎG®½`¯¼Å¼-\À¥$€«ˆGÔÜÇÎÿzZì‘R &äzÚkÝÏöë™Å%NÒ‡ž+vž2{;oŠ /ÊYùF”V v¯ÞÔ«ÏVÁÞÖ óM|ÕGÿKÿ«2§PŽ?}¾7ØŸF‰«!“ªó;—-ã|³ãÍý³Í£¥\ÑÚO›@Ÿ"r¹vž.žÎJk$üvÉ\p®Ú,úB0áš Ì)€Þš±â´§Íuñ¤Ö›Ôõõ!„:D]Œÿy†–4Ó×bj¢Ö’o>O˜  &C¬`närÉ8zÊ™±íÅâ|v|wu?¼¯9¼X¸LáÌx÷BÕü¿ŽzM)'²žœñ¹ÁÕe‹bðž¢Þo)¯–9 kÿ÷UÀeôjÕ8aá.z·æ sžôÁ;Ÿu;Z-!hÞ4ÊÄKúyÛùVÒy¿ÃôòÑjóHýðª\JÒ‹‚æ>¾”•û޹[©û¸ëõ‡ûÞr:‹Š½†¡kû wM*Ù©žJ´‰Í"ÆAšË°ôƽqâ]kdJ·j Èàeòô®<ÔƒrË#kb°1ãÐDKWTUÍŽ:ËÕêéBô"ÒêÉÊ¥Zº.£x,C8}ê¬`dÁ'½y«ÐÁ-7¾¯ìM¾X¢ï.ž•ÅN"Ÿ/Ï×þ¨}W—•òÇåðÿñzÐDA|^:Ž‹²zç]ö>þ¹<_q1×Sœø§ôbÙ£Ü~+ 8¼}~–ÌT5šjå±Ü4à_•ò¼J€éÿœÚ>ü~T+îßc¼zùì3½çŒÑz¿FÙ°aÈheJ-$@\®l²WogT{7õgŸÝÂþñU´'Üm<ÒŒ¾x½™}¦È?¤ÜwpWôÙÒsš³zx½Yÿ%E±Ëª­¢”f*™ ï5!A¦ºÆÊyš^‡4SåøQ¸é[øÇÝ54Êj;ºk9CRÌZÒ.PÍåîâ¢Ê ˜‘mzú‰›ʨ£}‹‘i"ir’hIíÖ̪³{Ñ;’{ÂoŠ‹RÝ©SpQ3ã¶Î­Œé"•è#… Âà 0ýr•&:îR–R;TðÔ OggS@× &W¶c–Cµÿ¤ÿÌÿèÿùÿüÿúÿÿÿëÿi*©íW [wÎú<DRÛŒ`ñ™ñ¸yVà†8« HìÊ[Å ÓÜöÈ«OÇ›“gJ@6Á$0«¢•Xeä©ìÚ5²:{ìzšíýÉp×aÖÔŒÊn3Ö,Û,F [Dô~VRÄx_¥À1LµÌS»í?ö$äX€ uó­ÓìšopÂ^Oêk/X‡´Ô5«¯‹W ü ,Izô*Ûú@tßQj‰$SóN𾛕Ú:AJE¨ÍÝz @ÊÅîÔ°8#Úp3™¡uÓŸ\q4t?ÉÖÊì|ØÆ9~êªÖfâÅh©th$=¶Wwî¿Å\çªÁïuüàw{9Lëí M6ûsAñBXxä[_}j÷x¶Ñ¼‡ñÍ’åúŒÊº%‘ˆÖÖ *#ÛÞûGƒÝJ¼÷ÿböȈ‰”u8 %.©T×:ÇŠÓd€ÕÔ]ÑKã&é‹ãêÊŠ²™¡I5P‹µ…²‰‡93yfdðäºòX¦‡ËPªîeʆHÑñÕ ÑU«Æu2‹L4050ÆÜ¹™Ã÷ÀNc¹‚9$Æ"³ZÝ]qÕÛß.a«$¶â©^ÂÐ@>b¦‚¸LÔ…j}—®Œ¹-i³\w\-äH%PÂ\Söµ:ͲGÿ×Ë^I§µvK xZÍ‚¡.º{Éí7­EÚU5è*f?s•WÍ8º\Õ@ÙŠÖ,-5ˆèÆàÈÈ:ùFp×0‹È5Öt•nf¶´í,\_icIÖ„VÔÁëdkK*2v yf‹’Ú!ʦ쪭ãFø\@³4²'¤²v & ’1)#{,õ*ÃôÄ *ßåmX—ÜÆãÒâpJ L¨`bƺót€ av:hê8 ¦:ð@79ÛDñÓ|– :2 ¢-,/ëI[*(h¤YÎÚXö~ø¼³…€S¨%n­Ý®çmª©q Ö±PW Ð"$cY\e…²ˆ‚€*ë5  ï LŠÀE%u¦ÀÚU“SïÑ©/À² ¢‹G ˆ›¶ÿ²7µËºˆ€¡ Ç>«õ FA€öö¡Ã*ü$½@ÛÇ÷Ý=þOÕ-Ê6P[2ï^A~YÐ;cg Ÿl¢±­»À6äÄ´øŒp \ö¯;§]÷ë÷Wè}°ƒ¬íxµ¹"_}½­x… º ÄzNµ¯Ü@Ƶ©ïB(EŸ]õJç Æ¥h6ôi3Áñ¬rA39°MSç`T“–=T$¥ãàûŸcFûR¸õØÕ(oáôfï΢‡²1¢h3Ýù¢ûmjè&È™>–³/ßúè–lY§¦‰:£¢ÐUáÆŽ4bFF‹ˆ¥¥¢y;ß^ z2I†nu$:’ÛíBgZ`UJ¬ÉJ2íB—ZX”Ódç”b,tUáÐ ai—E²Õ’2bdC‹èV䀛¹w©ZÚT¡!€‰Uµ2D³˜®£2Ò–B#U›Ìµ¶w—œ{HšÜA Ķ ºÙ9¤eÞ†6Ö<×($DUhÌb#ZŒ/” €š*c§j²Á®k@Œ€ˆ€G J…@ÄÊ èˆ!£Û~Öèm+€1 €X„,Èb‰L”­Ä’ˆÄTÖSn$¸ Þ›í"E!NÜ?Öê€x@¸ÍŸn"”7¶ÃùŽVë¢þƒ&»Xü˜¨ÀûZ$Àtk@ û«Ï¤ÐZökÛÀ~fœp¦×Ñ\×ÞFªuˆ ¸$`rÅ8ÃßÑnÆÛ¬5†´—6®å8!šo ;É3©•ñT¾œxê älv?Í@^Ä5Š+ð@Éô¬ÏÄ'Ä_¹Ð(>uëœAC‚6Kñ@´ÇìÙº0º4&„«Õ9ì²z @APÉœ$HW(¾ V7¡Qk̺ÞÙY,&d¾±ó]Û¦¹m¢%VóËÐzšk`C>v2åº&]~l§e%Ç îx±u}ž×¢èr*‚iŠŒ2‚°PðeÖ÷®R§ÓµVZL54 8u=Ö×Wk z*´Ü²º×åËÔ¡¡èÒ9 º+•€œ°ÃìiȆl)­]€a¡$°–€†!­ è3Ó: S¢«$–™ËÒì‘*´Là0¨ªazx&+Öh7êl˜&la1¶ýÙà€a“’J:Bª x¼’XeaPUÆ>QV, ê­ˆE³`‚µ ˆ˜ê0¼l†ƒÂÀF $BV‰•€ ³`LDzHE¯"ˆ"ÇN.4Þzu\ŠÂì,†ùg­ ÷„Bm²¦{sø "z9n¿8ì¾órñ`M•xofxöT@ û»8=ÚU@5' ŸböŠ1¦™%`wÄÓŸ€uÖ.® ´Hqúî@”¯,iLwPs]Δ?ù‹?•týJcùnHfÓ¤€ì³úf…sG™G¤@›Óç¾|  àØnœÙ53… €h1†Š÷ Šò¸³oýV-Š¿²=2ºœ9î9¯ùs$‹‡E(ä ¹o’bF}xµM\7Õ¶(c´¤Á» )•­¨`¸5P,jÆEF$æõu>æ|z0Ó¢Œ¯ŽNLÖ˜ ¬hp=ÛÓ!ÕÞ.¤…ã£3{þú’w÷&Q ѬM€YÑYY4µ·`i G}Ôú3͇!€Ì*ˆŠÌ2Ø ] a±4Èx. ƒ€Äa3„ST,Ù ¦ç]‚¤kñ,9= q†Í@M—Ù e¥P«ÃxA!@ 0èê2××´ƒÔ†õA,3‘(\d0ÉLÁÎ ÓÀfŒ)Å€ˆPåYð¶%*`ˆ$Ø`*ÀgAlTS SP[KE Cð–^ ãb#lô"a‡€EË8J^J• Í,zU–ÿ©Wz„2#˲dÁÿÉž;È1æ¿ÉþtÄŽÇñÛÎ`?&Oû+ÀL¸ÛÐã v%ÝÚpç°ƒ°§˜¹L‚° ¸X\z ¹n{÷¦Úò”IØÞæ'cÿØZå?Xç\6úþ§™¨q¿ŒYÚ‰â¼ïÑ'd<Ød¤œõeùÿ¨*‚ñ®ãPX¿P ¹ÙÆ{r3BÔx¾¡Ái/nG’ ©¥L–ÓKÈÍ.ød€¹ª@ã\ ¤Ä@ðZª¯4H°Om\Bá‡n›šó²žòO“Óü=aªrÒׄY5ú<ѸR ƒnI`Y1.Z+ñ°;ˆÞ2w… ö«ÄÁ^ÉdÅŠ¸ÆM Àj±Ž= ÐÕ–’ØàPÂX´­Ð€¨S© 4Ñ ¶Á!¥3'vX‘¥#9`XS4 ™: L9¢Ø«¨¨Ä’Vd…,@(MÄ‚,Ì ¨)VP,׊°#"V€h `—":*XFF3ÄÈ€¢Ã‚ŠVÑ €! ¶b"`´Ã5ÅÈhP#“@ P¾9EV›G ³2àé ­R«µS:NÖ#m¿æï’oý¼ûæjøxÚ,PÁ𿞠p‹ÀyS@¿¡.ü‰ÛŸf9$`Ÿ—Ö) oëþÉܾ§ÚÄ“]z™îž?\½quú\úÃ}¬ >¢íxð“/…R@à*…¼o'h ×w»¯ŒÏx_À G†Œt¶.ý ‚µõ2ÑÖKâÎ%R<äÜ_§p•¿Ú=$*@À£Zƒj  Z¡'¥š¶ÍOxâ5îlHçË×8ýéúŽ®¹7Þ\Ôð ¾›—GQP+·n=ÞÏÆ1Ûbjˆ O>õîù,<{­£ÆR @7´ìUð,ßP#3{@Ý”‘ <£z§4C+—5H OÝ"3K¬K#eå‰>(Puq£‰Å>4U©±%&:qCÇúFEL³LauìÊX0bAX P+ ù€ cD@”‚0€è½‹> \<€oÀ…´<:VS™g ç–0páEÞÓ¾LpÚk¾™€»ÀΩRš²° ¥©yjøcQ¿£=]βA.wæÇq÷6€yD§ÓÑŠB—¶%EQjŸ³øn>Böà !9áêrÞõ/û @T2PHHÎ6»@/›±Hõ˜ìB&#æð/®õ zî†J9ŒÂa]ÍY³£¥¼]\¦³"ðÀÈ0\™€¼pë$@ðøOggS@ÿ &Xv[¢2Ùÿéÿ§ÿ¢ÿÂÿ°ÿ¬ÿ´ÿ¨ÿ¯áE°š6¤Üô®t4ŸŽ¬Ž.QµDÿ<%¢@ÂVÁA¾¢)ç) ï”DÙ¿ª =Qq×Ý´=@InÓAWPvÃRÔqŽBž\'p9×ÍÓ=1¾H @Âm÷Ù(„ä´Ž½ëh¢$*€J€1ÀëU€X¬¬§ì”sÚV@à ¸’(‚­LR@2ª+”x8½ V„Û rö½‡2¬ °Ü ’dž9VŸ¹Lô’Ø—T"ÓÊ.ƒyq"$ð£Ó­h¿¼×[m?€Xž€{µñ9Lnô€¹ÿ @[ð¦xíù0\ø8Ë“àP6ç\6aù#ÀHµÓgt›Û‚&×3Çʱê.†Ý3_¼šÕÌmŠaÌù€ ë´™tî]„ ´ùq¹éRÉ> :É%—îåvÕSè Õ•Yܽ­Ï ꆀ]ŸCÉQG¡x3²~ÑïøÒì2ðœÅŸMF…@˜o Þ …Ϧ«÷ÊGáoãØÕ&˜Í(ÏûéÛÜ!­øE‰ÞSBÓª [ÂJN0<ˆÁ5ƒD†‚ †¯L|ïg§Gã-óª× uýC]k”IRDwŠ®Úÿ¾ÌDw89½Ò}^í¦Z j%ºI ø(k mKÛt¡]-Ð Ä@ˆkml$*ã   ™ ïÅi :PBwc2(€õ è Sˆ È X èeA†ƒÀdÉ1FèubD4Z°O*¢Éd‚€ b]UÖÞ…F+€.­ì¾iµ3SZ(!I…^ñeV³ù%r0:ø þöxæL>èë<ÿ,`¼ÿuJ;ó€Æzn @~ú'ü°Ï97ÓˆŒÅ!p™™™’ÎX5ŠÞ_Ƨ/ëìjýk£Îž$ß6¾ÕÿÈ&–L7IÉnÿÈ›nokÙæZóDƒ/ Ÿú®?P(æô±1¯ÝÄÎU#õñÁ7d ¥ø†©Ï$ã‡_Æë²ò©ÁT׎@GkëÖö¾ñëq¸ä@"%à º`˜:ãÇÿŽxÒÔÁ0Zòõ’žÿÚAZwã«-þlvš&;•tfvCœ•5 žT/í*„ÖÊ5¶ÕÆÍ-y„pÜS³WÍS6m©y«üˆDØÂú†%KôÑe HOá~ofŸÈm±êœO»X™K R'tÝ0jQ}c¸À0£¨‡Iåå§Î%ðI˜hB›°îUY)BÛa+w w)¾ÝCy-œØ”ÿ˜·l¹R£ýÿ!d†ÑjüØ^m‹z5\['ôõGùmì¬pÀ^Ç ð€ÄqÊ>¬õ´€`gP\Ðk“Là£ÑZ´Z¥)ZZÐ$P›­³ÔÙ餷›\$$¦kkE^Æ7~÷O¼·CÛXš’4™ðº&ÙóÙ0ä¦Fg®àQŠoÖ¶$ ¼÷¶3y' šöéiÆÓq!'z=! 0´…²4;V£™•(Ai(D¬E>PÕÙ "W£þº ­‘ Òj›˜7{B0cX­xD ./õZj èNg5`ë#Må@«fhKÏÖN M"%3ˆ™¼¼t33X0ÃÌd ()ˆPšÄE%¨ëîr-*ªO“"\[¥Í¾ýYà6ÊÌŒ¢ô)E²¥™ð@h+9ûÖeÙ¦™ayN@W8ûŠ”€fÜÍûŽíú.Ó*¨*_UǪò Aƒ½®Ì$]8:º@Pih ½&"Cw‚H8Vày·l@ôÄt™a èÖÀ÷µmdß…º{5€´‡ŠÞ: ïß`-Bþgt^¬í̃`!€Â´ÅZ§ v`€îÞ@…ÂDÿcÛ8·AÚò1GÔÚzï³ÕÐZHÀ@ls7Kç¶+yT‹å_ÉÓÃ9ð²š4\÷ýÀ¡Áûy,”Éúï"!@.¡šs°ݼùÏßfCÛéè,Ï·¥j’­³Uà}YÄg·ó•;w2›¦å1Žep­f¼·Ú~,u§û á­´Ç-cÈ®[v0%ÙyKZ½3ï‘’’)‚k —™‘éQŠ•íƒ gE&#!ˆªåºÏQœÏXµÙÙU®L©™Ú?•c(M‘2©°Ÿ}7Ð5=pŠ çv=]]ë2¸-ÈúTÞÚ´¬©Z\ $îá…ÂHk¯šî¶}9ÉUÖ@›%Ô5k5UŸÏª“5¦Uù&ïÞÓPÓ{§;=´+c ž­¬ÒeßH꼦ÜÝ$PkiʲÉÓº]”[Þ= “ÛÕ ‚VY|YzXh¥°ð€ttaÙ†Iê< 1¡L¨ ‘³ƒî&ýJ&À‹˜ç$t#‚½Z„BƒŒlù|*3–£¹ä7|ƒ¾Ø °ír Cª\^îVˆÃ S^œMrÕ º\¬àDè}F+Z!“+-Ê&öv{‘Ÿ´\ÜsðI€s€³Æ>¶1£ ß¡V¥‚MiIc·­µ&yGU†·æ|ƒWíºÖÙÇœíÉôß8—’¥dom 4=‚¸ÞVÓ'ÿû=ít~ -}˜æ½ë(8@2ÃèEyÿϯÊu˲pª1"‡…J›—Ìçä¡N6Ú(Ð6óéæKê1î¤h &䲆?ûì¨è¢Ðc[¢©Búà}ýÖ{xêZѧR\ˆeÐÙ¤^ƒj…±p)¼Ï17µ3B‰@'†n±¶‘pR“Ä1³yu¸=öÄ2çêdòTÓC‰u–r¬IyšéÜßMõ+©xÑLO¢v˜=C5{ž´îcÿS\Pº;5·ê‡òcGbdÙÝ“Äþ‰4ì.­¥f’,óeR$íž·7oµ‚Vvö~Ð.Ì.°FÀŽ ¬õš· n€ +AoZ5ŠŠwõÍ`•„¿HЯ í݃ù ¼jpœWöFFQF ,+= 0² ïü¯RÉB³M°ž»M` Vö®ÖÀ9 dø?<^GË‘ž“ƈ !ãâþoïá¨2^åbp¨YýÂ@>FD Û’ÖÌBÍL2(M¾ÍY²œ_¿F9m…Ûüç·óMuÞnx!êmÞÛÅšc¢¿à8¯V‰!#+}4O(¡'%°žO¬ý⪞ çEmË}ðÊ„—ëNŽy€t7s¿tý~ôÛ àŽ"ìF¥Ó_5]‡œfH ò!˳tÝij˜5*“º^ú†…,M#Œ§Šf½þíOJ¥RY ŒÈï5ýöÍ!»‡ÀEÎLÿ4;ä¶wž’Ù’€V¿MÁ@\=àÿY;ÁSϨgÈÓuèšì7!Ó›c+Ó,çCf“°õD’L2gÜDS¾¼F%ð®.ĽݬÝÃ<îo6=#HÀSd}Vîà6æ-µ¦èôX!pª¯I€)Uçá¾~³„ Xðü1yĘ„$2@1&ùÛÈ ";BP T’¬ ‡6B:²¥¾äNï D·7QŒ Æ2F¨ „#dcˆÛ@Ú<±P´G‚0^»•øŒ·dv³¯ Œî`ÑÙþ£³àUlÑN`ÕÊõnà1ë𯫩¼¦•¦\‘‚!‡XWÕ?S„@¥1†Ó<l‰Ãë<%K¬äˆ€¤1w6~€Åö9۟د—‹mñ´x4´‡/=½~úñz™CìÌ™"ÑX #MÔ4tÁ¡Lϲ£û{zHJÛò9LoÊã Ъñë{éyÏ3d“„$ãÛ—ßlen¢è¡ .C×j/€úÉfx¨¤ŸáÌ!±Óãgíx§03µ ™ÂÏd]sçM 8Åë›HÍäÈsg5 k«ûߎˆªæLº†â9û$5Ϊ¦4ëýl;Ëß#ä­ÆR•Azîš7Ñ™PÑ:”ªgxu¿½þ¼ô3?½ Cw5”¤~8h<``ðÐñZIK¡k,L¿`SãP¡00/x€o,~EGp:4ÿ´Ä¤ s_ 0á‰ÞÛítMè¥ar±™Ñ ÓQ½¤tñÔËoÀÓÃ0´€~³µ ·1÷u«(²Ða¥\¹Š(&­†³$26ròÍέp¶Ï(¿ñD’»gÏàâÂãƒÙ_oeâ a$ÊS3W"d_éê§ ‡Š†d3ÍNeˆNÛtß+Y°¢ÇÛ ;4G!` 6îüØûm——æj/T4ÈêØèg›ï÷ꞪFö­Î ß=<&‚{•³®ƒ’àö5 ¯Ï9æº0*]ï½\µp„R>yÕ»Æ\ÙéX(QCäž)O¹ÑÚ©@sè$ز²qÉí¾Šxš nN®¿jõ†ªdR»aó5ÓÞ®0 µ§óP÷´ßžfghR¼SžÆÊ4dìãÎeQ°Ó‰àÌS7í ÂÎ5¼˜€úÙFgbÏØ™9Ÿ¶Î“œº¦i³û>"{”Q.÷SÉ855ɦ28:v,6XÞ}e'õ¨-™°o™í~N)ZÈF­–Sðä"ÐÙ‚x Ûò;AzÐ%°j@ÁžûMàÖ6?ÜàZËuè’Σà™¢N)ƒ«+WÎ`q{}•Ù¼o[\$0÷€õ^Ø¢ýÒƒí²\§&'TGU3j'’ H¶ƒwÁ‡ÎXOxëЕs¢²uõkº¿•°¬ˆnG½.ïû|§1—Ü_¢÷dVžkBÈ:º®ÙJ„g,Ÿ!Jq§®-‡¦ºßI@¡MÏžýÅÇžéÇG9ÀÊfpòr!Óü\–—ÖÞ¡S·|!›Ë?ü¢+žmg¦ß¬i®µ?íníƒÞò•Ãö¡’ò{™›’¶Å)¢¨n¯‚¸áàocäuðû¯ûB8.IÿW”wTDÓc {YQ:½Lw4$9»æ¦þ^îÞq``«€˜é/ÇjÈõt?³ó‡"Ú£‚ÚTÑYÀ¶È¦*s7•ûg¾r{&nêÔÔl›kX¿ØIp­c¯.JöŒä;Ey2çì…í&9 ²¦v뛸pT‚¼ý¯¡spšM‡B¹D`ÚºÀÂzJøª@…?aí( ‚‚ ` ¼u†PaYOggS@! &Yl^‡jÿ¨ÿ£ÿ©ÿ¯ÿµLMXZQWYXCDQXÿ±ÿ¾ÿ^ûuè™)&³0vÏn ½%ü€ðá°h}«u9V ÀU‚ÇÖ.¸\€Yn³]«™…tõP  @ǯÏ0Äâ¹_>{oy÷²ÃûÒ– s­ËÙJû as ¶-%¢ àa㺴I±:£ Òxmz¸OUDAA9¥¯ß©‡tKÚ`’µ^ááEz¯çŒÿõÍåñÞõóän±x8d;Óã·z²žŸ6W1ÎvBÂK¶ÇQ;B/³Ð®˜ÃœÝìꊟ}ò´…rœFdÞ”îïièŒ/™öÛ©Ï“€ ŸíúÜ?J‡í6×9ïêàZ\¬ZÚþG­c‚ô@‚ a>pˆy@ îöÇøÉ?öýù®DNšˆ³ ©Â4“Mg7ÕIvÑ}Õ[íî`ffšiœ'û½f_˜Ú— @7QÓt< …©êˆ7k@Í;;}ë¸5Ñ 2•›·¿ÉÕàþ`ñ©Ü[¼¼]@eâb=@ Ó)a `0,e¸§`ðÂþ¿ƒ¼ðû¾ë-è‘&&›Ò†×ÛmÁ—¸$4Åà¨þ€ÅÕÇ-#® í×g`åG°°M‘?»jª¡C , >ÝkðQŸcmýÿ­µN¥ œ‚Íf½±ÅÐ Bî”ÞP0¢Çðóµ1ŠªP|P™)à¡Ã³¾ÑĽæ‚e£± £Bh\¹¸›w½6{:§º ðd¤7ûÂýS÷ôOÿbÞýuæ V.2‡lµIŒjž½É~ªâA5.[cþBOŽI€ êspÝ&ŸÖ=3ë8xôØé仸½Ãw}ùŽ„‹Ù ñ뢟zM¾¬ð?í2¤àŒ«áFØ9Ôÿä~[WÏgÝ@7 u‰|÷~Y„ ;çYýÚZ>è¯Ü;›˜ݵnQ‹î!Þ톩î‚|Î~t¯br€i& i€iŠRŸ4”¹ºª5ìÓ¥oŠí“‹¯{–å·£:à9ƒ;ðØP1£¨YÇÂûvvÔÞíj—‡2àx8|‘‚`¯/ ­€ÊçÇ'QH(þÚuèž0‡‰18½f½G2xæD>;dÏÛÖlµàÓû²Ñ¨ärþíßê°o÷C¬·´ÝÀœÂØ|méPU—:”Â"€ <½ï¨?þXk«M€Ý=?ÓÝi·'ö¹ý«5+nLz²Ï?ã5ýdg¡Ðe xºâ} ~¬W6¶Ý“µÙF¾—s!(Ã6„(®PÆáçs¤h+ÒÜÆä÷ÔL{Øâöÿ-{ïAmÿØŠÄ™V¨“3±ÔmÎéÕ·Mñ£ÓLÝËצ1•„Ó1 Ø!FOO>ÀüÆ®+÷BŸß½v´^,4 ÒHc 69=5Áq·„â¿{<Ý0œ½~-ËÙ«f Öà vH4aˆˆBÅŠlþCP ÂÕȽsÞqÔBÁ¦!Ky·l…RÕØT #M÷²hý•° X ºojR’ÃV KE•Ø[Yu´©™J!ÖZ‚%”KÐZÔfVQ­,Kcm6|:-ülD¶5:^¥NÚZš ëu¾¼ÿÖ+Øtr-Þ¼_ƒ/^ÝʵøìËëÓŹ,k2J)0hµèD¢€ªªZµ:a·{IÖƒ(E‘ïm™•ŒNu³Òºa“_“Ì‚äùæÊ»ƒx}€tQ ¶7Øâ¡NX’kWÑè˜7.£Lõl…ÿ±¢ë³K›5W/Ñ”ìÀX£Ä¢j´ðY«rëÜâ|:éì^àS¤6±µmFêågºÇÐj°]CÇ(÷”»Ûé‹<ÅïçK¯Öù›D6¬Î ÔT%µÒ¥„”¢íU!Š$"ˆ–(BÊ–NkÐ) _ºìU– ïI„.5#íŠ '¦ß[(bƒ’ÓŸ¼ýüOÏ¡‰Ò œxüÓ·:•ÖÚ©ÏMàÆ¢¤­Ù¸Á¥äÒèùD)Œ:‹»”Û[I«ÊQfq’ZˆhxÇ~åÔû³`¤Rôa¤YC¨E’h\Aªµ èŒkh+̉n’‹–•7*l÷û' ÔNé&¹ MÐìñvªo`‘àŠ·2MüuNáñ‚øP¢U”*ŠPj¬ è‹® £^‚Ø¡Vœ£ÓC°C+Ai ˆµjÅÓ -‹ø¡„J}&×]r"ç^BKd¥ÓPƒ¶ï›µ‚%ÑÉC}ïtÕ‚¢ÐO!O”TTEm[™ÑåªnÏ0¿B4ÃF$#(Å  «J7T3µ¡®ˆ°Ê¬2«±^:Û4¡Iw€.— \ë7¨*ü€—ÜÃ0‹l=WïctŒ¬Z_oaª¬R#¸¸ÆA®d®Î8vÜÓ÷γó-ÇK‡ÃÝ;º¿Qf5v;|áK7Ù®ë+néŸK öù}ÓŒOnà´ì¡»¶wHog?g'×ÄÕ•¬Z™žêîvÓJ#ƒ*!Òû‡ÅFþñ•‘/*:ªHA¤ U‚Hfo"„‡.4˜,êZ»måQÒ+ 1ŒyŠpš÷B9(–Yˆ¢@XVq¿K8ABÉ!f4ƒ%‚N_´) á¬àiŒ‹˜øx,É%+§Q,€¶jÞfítÌε]žè>0›âTÙ“í(ÌŒ;ÓêéJ̦Jñi/.G)JÍâ:,]ÝÎêU¨@^X7@‘‡œ7ømFƒàºµ*‚…žÍÍR½V'q ¶ žh0Zº’Œ´ËÒC AÙÀK¨Ih=HDÙ€‚ iœaDd'œW0h„tG©iV’¤$è‚®G(£ŒŒba `ú(>²`¸HlÍG™Õ¾ª O4^¬²BqÓ:6kºã­‰ /°Aïh¶ƒ^ àÝGHÈÚ“h¹€”Ïmlmdõ:̬R5¬JØÉŒíaݽü¸¾!ÁÑtœ‡Î-'ÜyU¾tI/-{knÿäÙùÔÕàå}OÓqåæ~ïñyÌ'gÞ\/ÎÚž9&i×1÷X}óm¶K’¼B²AŒh®~Ћ.æ¼Oj4ÔC2…f:’:Vw|œYÄ2 @tµ³µ{½¦†b°à^€¶Þkêÿޞπ×jh‡YT‰ÄüdýPh)é¯éUg7x´'ꜙ¦’ÎŽ©AÑKæ¸ê ‰*ã•ïtu}]ûªÝ™Íõìóï•"º‹žnž!jå»[5@¨²Gxq4ótº©†i˜ÜæÞñò«}”Œ0@ܯßgÛ¾†©ëÂ=#ƒ$'J¸·8ð¬óÊ{0Æ÷㇠®‹ôÏtB¶'ácz\ï½øÕ ”e¶^@D!ŒÍ>WÙ)m£SŒ€ù#kÒTÁdªŒ„=d´«µ$´-!} QKâ]—„¶Ó0¼=@d0p,u^Ò8ý6þž»¥bM8ÑPÀÿ«tM8¤¡€öñö^+s2º9€ÏØ16äi£ =vÏßf>×u¹Ž¶õ&jU«5) ÅõwØŽ©rœäà©A¹¯††´æåÝ¡e¶£÷vtrK´H5k‹ˆdsÿÛŒ 7ºYäzéQ÷nÜåõœ Ÿºþ|ºM8 Ä@»(Á³³s|ñûÑâph9 ˜.Ù¬¯WÒÛ%h&3Á£@ßód²Y†š¼Åéœ €ª)ª~µé¤²µªM‡Ò&Òh1~Ê•·^{µq?…¯Šeö¼òƒ®š!&!›„! ëÙž/ʤ ¶É¹ÎéÊÍ«©\«K@’µfOggSL &Z÷è g¹ÿ¶ÿ´ÿžÿÿŸÿ£ÿœÿÁÿ®JJXa=Õ]×éÝ›³ùÙ‡sÕv[•q”d&UœÌ»¦é(H’û:¤.èÏ^n(MÒ 5Pl*Ÿè;ŽÊë}"sK¦ÃbÖ«À­­dt²³Cï8ËÕ÷c¿¯“dÊL;€$ïÝÍÁ…õZ¸ È ô«¿'?›ªrI´Ã&®g ŠR–QK‚AÀu`€Þý7â @áÛLƒf”óbA£?H€Ý ¨6£Â t¢-nbæ`>«e`Oà4{v+È5]*å¢QâýÞAn¤›¶¨ÿªä€„|_ÇÃGÛa­ˆR­d€=Îz­«ãS2¡E÷¶©rƵ5é.BK˜¬Ä{‘j´™}³"x¡¿>¡^àÆæÊ8åÛTƒ ®QÎŒüD¾’$5}{Íš³2«Æ&ûÚ¤Û³1ã.â`æ»ìQÿè´æ¤ÂÁ<bÑãv‘È}û&CâÅ¢ ‰”niTò»'‚x€ê¨†Â )û0½î³»ôiŠ5œ 4õ,ÿ{vsoï;§€ÂìªLU÷¯°³óf,w–ìž]JÍñ×93³H* ‹J¸tÑÓÐ@ôþ…Ùºý•Õ2ÙÓÅ^7¿È¼úן>õ–¦F¢³é:WžmrSL»’i 2œ%k"jÙîS$Õ$+vΙâSP@WÓC8ß)¹{ù£×ϪNKbÔ,STÿžkﮃŸ½å¬ =½¹t?j^¡þÆÛ€à«PxÕÌM À¿üÖ‘œÂŸ¨„]$‚– 4ÌãOT˜"Â`xKHT(¼&vRÀ^Û•ø’ÆA˜åJ´'˜«ÿ^&Àc–²òüÃ=ìûzt‹l™u´™5J[E!fe£¿òºþȪQ ZyçÚÆö¬ˆ~ŠQ Þï|8¸no×T/\K›ïæ.êùÙû:òÅRªS³Ä©H¹™ Có‡í‚ ‡Qª§;Ú/RÚ«o}ëóc AqÚâ-Þ­Úk—$º3þøïs]K íŽr’³".i.¶he“(îšô¸¶¯$óuß›?;Ô>¾·‘3›`¯Tï 瘚}¼½vúçnbî©p=F=+ú\DÌËÏòêÂ\ÿ9å®_Ÿsª»2APݪßg}™è9‰i†9¹Àò«D;'KV–¬œsÜ=Šîô€kÎ=Ą̃+ñaêrÜ3l Avd°Ï¿í«ß W¸MgLIIeÖçùUYëÿ+®Q# -ßv¡{S/MfÎü¸IØ÷(«Œ·å“´ÁÀ ˜³ÊÂØ¶µeÆý¶Ž¡ÅÿQ¼XÀŒ1XÒ7[F@=@ À£%6bG$ßÁœ]C)'ü…(±¢ žË5Ä%]32¨@-× #ˆËÀ• äüµÈvL^Ã0r}ÑþpÖgߤG'iÔ˜}Ÿs]Fc4ÌJ©–vI@j¡]$I/¼Â3±yÓÆ{d5ÁËaâ×v²þ·֣ˆ?z®Ž<¦¨nΫ4èfÕ«…ÂÈŠ&R9Åd­'`r`ǘ¦Œ=Í›¿~ü‡ÐCPµ3¹+”æOu‰~[Ïåx7¨4°ŸÝ«b‰~¹,_êó×tN2;1]ö±á{ñN}ަœð­Ï‹@MWäâÛå»y˜‡!§Ä¤`XZšÒϫ٠vöOˆ‘W¹¿»º¶ðÚ»W€¯÷wÿAöìoÖ`ØC6ÕEÞóSÁ[t±lLçž“iÇ8žúÓßtz"izÈ(¦†H†J œ=Y·aØÑ&ç*€ntØ7þàﯮ»™9ÃÆÿ&L½ô'ódBã;7¸Wõ¦;ˆ;³Dò6ÙØ@ƒ€ü àu‘Àþ¡-éŽÐ¥=@d-3a (d,º#á `0¸ù5Èí¾òaübà¾ÛÕô™Ö.(ÃîÖË[J/i•0 ÍSê×"â-™¬àìÛï¿1û°¯ŒE?~;ùLÛ–-—¾5­©RR$’$ Œ:ñ™²£uø¡ç|y_SwÞïzëp(.ÍMù›ñ~-„hödä‹èQ l­*Ö¦¾Æ§æËvžZ{(G¨ÂÔH ´wuv ~æjÜ€u`—‚2óÎÏåÒÁDNNg üQ}-ÿ”‹ÑÇÏûúø'·×Þœ¸& g¨™iª™Ëè/ûýòÙf¦+Þ™È)ý¥~È»/™òÇÿj¹™¿fï–w>¶£ž]ž}ØÕÁéèIϛՌ‹ÚœÑL7y63ô‡Iöá«¿kTÝQ §ººêÝ@ï.ŠÝœûUq&]3‡díÒ=U®Ÿ†}¸5žMÇÙf<\Oo»c׃!aÃ$<ÄvsgßäÙÓþXì2ø}È"²öŽƒ³‘ (BÇ yè@€Þ"MÃß 1€šZò¶xhÞº•Ä5Ý>`³ƒÛ­Äôx iàôiì·^[ðü‰ˆ‰,N›Ùèk]yMü;šµîÇÿÛg`åù põ>ffjF$aI«ÉñKÒmÿ}ïÊiÖw»£}@ºRx+·–#„“n40/~ÊDì†*CðšC)º\ Æb"s·ümïJŠÏÁ§Ò¶o#$Û˜>òÇ G€‚lø{”}šäi/0å®+‡ iùøo2åÀôÈ™€ѨýsóC-+Z i ¢Ó»’¶!“ne™ÈÏyYŇ9ÐD=¤wõT"ÿ0oýz=UeÑ=ÿ­2E?vØw÷ž‘—¯ÏûÞqéͬð"è>/Ií`'@a2ŽN™ Ù-×ç»<ÇE6 ökg‰8ªn² údÎ<ëû`¨n¨$ oýF¶ïf®÷Ô ûû|»®È ’·U}TÍT‘_º«3YÜM1Ü¡‹‚'¾ D¬Zë».Ä  c†×’WÝ‹UzòØCâMü¡±‚B·ÙË4礊ëÊé¹xÆ3:’éáØ•)+RÖû uÜLKºW0¤§9z$.§ÿýzƒ€:ˆ$¡cö膷ŒÕÞ…—ž" {†¬âIöYÿt¯í½÷œ­/Zúö±íý½•·W*?Ptf5\L¶ývù­q÷m»žpÚÍ,öflžÙN,Ð 3-lÂ%âmÿ³·ùÿºGdSt4vókv¬WÏ`:fÆ]íû×ϰUˆíɽlÆ)¦«†˜Z ¨6 q –òäÀJÀÑ+` y ¿k(²~‹à–ã”Íjµš=ã,(Á3±ŽC¤7_¦Éø@7PB>Çz‚hX—¾ _v]6ñ„v;ß–Mûþ±_8ï fÀ·ó½Ë•ƒ¤mäï&›,jµÒzJÈ¢ ÔÙÿ {•àq.]v/ÿß5þµ¸”g°]¹[ukð»]óÇ›áÒ”¶¡ÕHET0³øg8DïV’\7T ãÌ9q§ 1õouÝç]ûõã²Ç„'¹ì0’-÷êyvü 5¨Jø€TùFÓ}‹X§“AK? Ì,0´†i¾þòÿ0\‰ MC“@¿$]‹ä–øU]˜ÏOÔâãêÆßÚ7 »I&+kX/,xèÚß|n 쎇a @"pló=¤©¸Š*8LÌ™.j{(è)Ç.² H7Ý>&(Š BD_$3“ eU±c ÒE)†6ô>34Àô!¨ˆí5¶ T$ 08Žcc¿R$€^¢˜‡ŸÀxcƒØFúý{ð«´ Ðî{ÃbÛ€ žZÜ%&V±¸åDRª±99†gÄ–«5*_Ïrß¶jÊB¸€°oÛº\×<^“=q¹©¦xƒæ¹/ùeÚvî˜èØw°0 ôÂßýtãn¹›á¨ þ4IZVJhz—%løÊ=š{ö”=ç|~ÊKô=n˜g["Tí«+i½ ´v]»³ _NU¡ÕÍNþj*[†eíÝí—wÓW(à“´írªtUû:ótÒ^æòê8 îipG ‡”7ßô¿Ü^2Ê霤ʼnv•:}ü^|ýž5iÕîaHzCáãÛ/äS¸™öbûùrüOþ×ÎB61I±0t29™Ñ<\ú}~’©%èb`ý ©îR¹?rål £Û*ó@/¹«ñv±‰·-£>õÆô€3ÈÙö¸ÍúɵÇû£Ж‰£Éihšle÷0RÈ ¥ •¢T¬K biÍB =ƒ€@BbB ¬©@ ëV€¾¿, €1 ,bPU«6¢‘ÌX@÷i@cp!8‘18 È ]+öH ø[ уªyÍïDþß8>°bÛüèrõ>æåñº2‘ݺ†ñeѽÆ9ïØ9»ùcèOp³ã¦ŽFŸÞø”µÍ}þ¹j£ï¤.p×%Ÿ(Ÿ˜œýöGêÕNû2å¿þ¦'@ú§-é¦ÿ}Æ=#[ ¸ð&õ{MGåK2,5õvßÂ+$EùðÎU7øîmy’Èp”àQ.¹7;°÷Ë À5Ž£ÿÖÿ¸ 8˜Àû>~{'øg^'3™J ;$ù©ìxw;¾æbh4uCNExÙ§ŸÄÁ¸ô%íÒ1p I’$ª-d×ÙK¾Y`l=l½…+˜YïÎÙËžItk*ÚÍkð;fŠÍ‘ÕA ¾“è¿“”u#R,Úf¦*6D• ˆŽ€áøjH׎i±(ʪ³I©ê*És»³4€` ‰0h†b+€+…p.Y½ÅNÔÌhZ¨ ’T@‘0­Z3@Óª…™pí<ç¡HoFìÛ6F£ŠÁ…A™h N¤NÅÀŠùÇ0_½zŸ¦/´Q}€0§pÖpõ˜CCTèKÒ³¼ËüâFt>r*™»Ùë´µúR1÷UŒƒ‚pÍ-pþŸoó¬N…‹ +ú§Tý“ £‹ å›kža–mÆ({=3Ã1»üã‹Å1ç²ë÷tÿ Of½ü3{*òhÖŽvÿ‘"=OéW¿OggSÀn &[˳ÑÚLJJEH]Xdaÿµÿ¨ÿšÿ‚ÿÿŠÿÿtÿ¼jµàDÿÃzöJ?Û@ôÏ ´`ÜóßÊÒŠ`’0²ë,Ô:Ë©`bƒïÎÁç(osÞñý×â°1×NÇîï›ÿ¶Xí¾ñ2’ô¤Võo,Y6qñj^2çjq¶~ª¼šoY¡¨Ø=ÝÃô…K ùYÅ&ß/ ª¥ÏDÞªu2ÿ2Ú÷Lñ~6]x Ü%ôfå$5pªØ+ýL"d]aò¾þzåWfœ*t–e÷òS¢ç¼ÑAñN²T†û™ßFuº3ÿ^ŽÙí\R¡"Ú–ë.ƒ ÔJÑÄ ˜r©àPs%N·×>‡!c cŒ¶+ŸÓ#¥òÍÎh;<ßñ3›=èùsë­ë¨ØÅPú›je\ÏŸ^Œ:=wŽ^áK©º»=R§ÂÑ?€ÀèŸÜbìîdÁÔZ‘¹ß‰ìõÒžóÏ/|ùgutü„÷ÙÐEГÀY¡HV4ºÚˆœV©f“ñâtqb­ªyÂ’õ SD¾—û¬ó«ó´6«9;ÓˆÝN<%­Y9ã^™nï<)ÕË!”›údGEµ£V”¦\©A…j -â¯!‚5 — à"Ö²ä€Ôfi'ÁR+sç±T}NàÒöÚ`‹Á ²‚ @[Õ˜»þúlÜý˜#ÿ½«ð/¿ž_·aöô¬^¶ê±þ)êë²\æ°ì›?*[ß[,Eåù8Ñ+‹ùˆòз>ÿü/…¹ü0ß»··ÃqBzªE¸/ä@ãîùóªpS‡„ýxÅŽéÔóž!ÏgëÛ¶­µ­IS&€Ú¤æ#Æ6#¸nr.Ú·]ӆ™“wÚGŸÖ±Á«œ'ßÀÁóS÷¿ÄTÑ5»ËgžRæO“+,ÒÇnµn¨1ýÉ|gOI—ïGÛD ®Ësú§»M¢õ¨6#Zš¼ÔÓ´åRxkz+Qx{>¦‰¡zÙþ2=à€xzföÉf©>ó¯Ú=m*GÓÕõÔU®éÒt‰"ÇÔTñgµ¾9Y¼¿¸Ÿ¾/÷Ç—OfÈ€êa‚i²›Œ›Ë?z³cªÛQA#²“¦‹æÊì6à‡,âªÁwŸIàdÖµ Ùfí¾RëÕ39ÃX€µ&ÌOi·/v?Lѽ¨²p“ÕWe=Íd sª¨nWBSQ¦}¹“6¦’uVå)žä fÚ. E³*‚Qï"P;Ê¢§¯Þ=¤í]'ÇO70Ó·H|¸e£uÔК{ö±m6°¹M­H øFîˆIƒ£A*0 *kÀNnað<‹K‘NŸöU›­tQÂvÅu£’”aUüa›u¸Fi€aöêi `…ýa~|’1šzow?Dûá>3g;ŒÖ‡O­ÆLª°¯ÞÑÖ×jV SÚ”¸£õå4§<‡¶›ì:¿Éàƒß&ûlöüéï”®¦Ç=¾x[<Æl.ÓnYDéÁçÒX¬g‹“WŒ¿pÈkãT?Q^J]W—öfqßkrÿŽÞO>ójÕ¿í=uýóvtýÚŠ»÷=;sÛ©§©ÊsÞÎætqïŽL~9{\f^fd[BÒýV×âRb Â’ÜçØ™+”2ïdi*¯ò•É‘ËLßñTEµÓgÇdM\¿•EU…ù쵪Õ_&u2Á}eNI÷œ•naÓdò˜ZE5w'¾nt6$x7ÅÌ·Òä›É Üìþ7bb¬yÅ@0=ÕÕ°H—V&r”®4âYæ±±¬å䡚Yn¬oñr7鹇c€JŠ7u ´“h‹¹àb²ÂQŠÀ ’–K¯°6V¥ á^Õ¼4!€ÐÀް£ B•Œg’Àˆá2–¨:E™UÀžË-zJp€Ýk1sÐ{¬7ˆbþªsþòírdhVÚÚF¾FŒ1þÜlv?›û1jÕÖÚ¶¦$€~•oÿØlŒüÜÿüîo¨c~©]dž‘õž¦;õW_¿>xû¥yq§õ¼˜Û¶ûXµ-æ”bÙvöMî²ãgUT#~TÁ²«éµÎ.rû>mŸ+÷ÎôxïÃÄ4DïñF¿µLí‚ÞzÏÞªK,Õðt*"¢þÝ›fèt™½4ïAr°9҆fá,*€¹óV÷Ò=å‰wúõعå½ÇˆŽÛï6‘†$ —·—Ù9 2-[Ò‘+RÄîÉUžLŒtê©rwR3¢«6'èÁ˜”X²—\­*"YD‹×EY+bêT»w¿úGyö2ÂT›õ5MQ<­U…©LhèÖŽdÚn%ª€9ë\í¯³Ç0˜"ª´ÈR±PPÓ€øÈ!6 1‚ÈÂNGŽÍ\Æ 1„yÒÏÈ¿ ¤Ó ¦ æ±Å€ ÷xn°éDÈ 6=?å+[€dI;ÞÛífMq€Ú¬Ó{¨ À‡¬)Q~Ûy¬»šÆZÆ8´Ò]ïî°A>ü>@Ð0s?²Ö6¢a¥Õ-“ Ó‰AEù_æô/_FÃÀ@¼Ô{˜ûÚ:a²Äì? ‡ÎÅåÉr"ÃÛ1¢öäð¼žÉÇ¥¾ü–߈éð JÝ >ôÌ4Œ¾æÐqv –7 ¨0<ÓÕ&3(ã¤}mïÝޘɽmð«›‘-{A±@KQÂ@Æ1*æè+²C–„66Hn„ Ä/la" 0¾`ÐjÚ»¹‘ÞÛãžÒÇ `½ÙÎŽì:i— búµí¤ðø7ÖÆ=~ç~4£Iâ‡ò€È÷9}Öhµ®I*D’ ››*£„Í­ÃíÄ×´¶ÁmþùììÂØ@h­&™ÁGºüi&C¤'GÚê iP MVåqc‰SÐuý鼞ºÄì%Uœv= ¥Î:öñü¿%:StO@naÔÓCõìÞðÎ’½gÀNö°ñü‚×”_JLoÍì7±³“®çª‹.¦ôšLdŠ™Q¤«‹¿Á~¡p{EF-3<Ã’LS°Ô^rÜCß(EÅ‘ÍÚnçüæÛ^Sh=Ÿö¸)²HwQË'¸gkªÛWÒTÞvŽY)3•0 ¬ûf.ÓE®ðþrÇO gú…œt§a-uB%3•Û æ{U Êä$묮êý³·½öŽ-oRT,Y€nßÀ0,ª1 <´*'ˆÄ– È 0®“E“d]ëž7^#7HE€1`Ä×€&¦¼Eˆ·3ÈÔè4¼3ŠþÚt›Æ¥T í;hÍpM4¬À òè°ãüÝ+^¹Ÿ˜cç§_ŒNž¬ë:Ö¶ª¦®ŠD’`„d£¿N°ÖœÞö°?ãî•r¦¨#ó“Z ±ï†›ÕÙµ¡†µ×·Ÿ/Þï;kCQóN‡"r[/S;Põ‹ƒ'‰¹1í8 \?n:'{Åå³¹·¾)|ªpŠ„è&µ÷ÓíYãÿ{SA>Z\NðÙÅË©i6ÆwÒŸŸý š$9ÉáˆÎ‚"ÛS}8úÝSCçTÁ`Žì|~EÙ»Ó‰Hn 3ûÛˆ&3¦ 8Ó1d¯}öøg+³¸ýh»iŒ½¨¯­éÚêöô·Î[=éCq·½7z…3Ç®·k «Üë1=•Øìd2×ò=Uo¯]TÈŒ «„™ÌÅÞ«(µi&bAsYCáÚ…‘­1DïƒûcLn‹9X¾àJ½3½LúÆ(²@6ÈJ”ÊPHò‡l€»æ„_)" –TPøõˆ`™Œü!P–Ú6A~«­æjãЪðžS4€•j-öáõe_®gŠyj–¸ý‡KùÀ2s6^Ù0ó¹®#Ú6TU%Å ÀÖã­³gwqÞòó—~ßu÷ƒ'=€¶±Nx÷L;¥;„º§M&™Ô:ë¾Ö©|w£T‰LÜ/¼IÎççzÙhДäJ³Çi¹ño»ü^huèÛ-s9~þ¹ÿ}ŽØƒñtB4—ÉÙë¡o_o§6Ðt{ =wÄÍΨþb¾e€†,懢çó&d;n}Úö½U¿üT{h Ášpù™‚gîÅTµkýa?´ å£Yf¦ëÌP ï@¥•u²ïÂ?ÑUWï¬jë ƒ¢üîRö“VÖ’qõšLî`莖.怙qì™CÒ"›ò›‰–ôd''¯ès|šZøXkÆ›Žûï†;¸0ÍùÀm{³Y<Ø÷…žÔR9t‰– © _U@'Œ´š©Õù`/ϼ€ð'€=^Ûmúšð Üf«¹¿ |˜æ8Äh*Žê•Œ°­/¾äsæ3F´mCCJfO¤Khgº=C¢?l³ì?écÈíÎÙPÙsÍe;œãü?¥L\¸Ô)ãÈþدv終®Qê$á蛲i™XýÚ.:'2/å"ĺÛÛÿÕŸía˜f^¶Øš=^Ðñnև׳^{W¥š&ÛÙ³ý¬?ÿ§6f¶†6duÁ»Ä×õî^÷ þŽ ‚(øï%ÌdSt*ºtvõhªR£Îöø“O=ªiî€Ò“Ït¼d$±®›í©dkî±—Îi4CÝä\î“Ó,&¡!ÛôÐKõ(º0t¢ºˆ¡¨š!p ƒ7ê© ñ±Çà#pf9M40$ƒ},ôÔßÙuI"O² _»¡Þ· èc$Ñ+ˆEÀðN€|Ñ(è®Ëmæ8@,6é[`€÷¡ùuõ|a(ÙòdŒ,kÃWR–A$ya‚Àtî>„Ž×¤ÿËn8{ÚŠ¬=%466ÃŽ‹%÷Õ±KJ»j³eŽÆ¥§½Üf±=]kaÛí&OàÅëØ—'i:ðÒ숈~þõ3ɲF.ß=°³;ù§ß¥ª÷ÕÄÓñ4•ÞoM|tª™»=¼z˜Ásx^þ[ûA¯ôÔì.ÌNrȉœmâõ°¯Mo˜3§RdÛx‹ï·èÀz6òí²ô ˆ;ž9ü7N=ůѼ;Á¨`Ž"‘™eŽõ8f]ä¬bØï¨'OggSÀ’ &\y‘Nyÿ†ÿ‰KOIb\^[HaVcbK]]Xÿ¢ÿ„ÿãÿñÿ'BÃ?Iþ)¾YrÓj'Ì®NVGgË5›½)(ÎZ™ dãµ1Mb½™%+~•¸ 4]k¦àhp/Ñ`RÉPÎØD†›˜•ÜwÇÞÉ0´(!Ù1dMñ”AÒVØ LTP H~@¼ƒž«ô5¥QÂ!»ØEnÓýØÁCÆFòäé‘Vâ2þû_ì@ƒ=ÓøÝΞì#ßF–e£^#Ô\¦2aI|9œýŒÅ ÓѬ7ŸòtÇóCÖºÍJô|öü3ûpÇõ;—,+µJïùYÚš,b/¬,Yæ09~÷{î]æËgÜ—k+ªd ãb` +'×0Ô¦½ ²'ÛI³K\bíG¹øm<ô‘^6,§èÍ…ÒÁ{gÛoõ7éÄB㳊ËáúsüY~š™2³î¾‚qöl•Þ n}:ûÁcë¼Äiïø+Ô´ûüÃ\ºÞ_‹[ÅWȶد¤H y(0åÊiemrA,Š%hMÅÙfDŒËÉ4µ»'ËG»9”ÌŒ[t¥Š,å⪶³E„»A N„ƒÄ³ “ ÆézEEv1&áE!,¸Âs‡€€–Å F`0‚“°ÃŸ,‹­H%%Ä`xõô<¦q€ „z]‚ pz•äôaKÐyèÄ ;ø¼Šœ·ò†©ÄžäËu™5YšV+™y©ËBô¸O)"ŒÉyîÓõ*î=ú·|½¼è•!‡u1fi±é©³NÝ`ØÁº]rŠz|½fº½¥Éž\óé‘Eâñéô‡¯HÕKHÞàâ‹Û¾ßÒÍn®¿¢—µ;Èœäy†£ óþiÐÆ@6¶ˆØx>x(¿ñ–yZ0Oq*æ.aÆSæï摳¿»ûœ*z¶‚H9WþÆ7ÙTOT•8­“"þÓT9µŸ‚“‘ðßõ—Hïwï“tª¹º¬fÃÝ{ßk»Š¡¸Èê)¶$êÊHSt£½ÝÝ=þûùçÏþò·é¼½¤jSQø3ƒú §øÕ¦6*WfÆã¬÷gY˜º;‡aŸ7•PƒY'yɆJÍXc“b’HPŠ‚$ô`0˜KçX = •ì)\ÁU×Áô²U Ø HÅÖ•ÀÈüP@TŸ|p^‚”ð€ì^ÍÒ_$¢§¸½º•ŒÇršöãÜ-AšÅ${åçC*-ÝÞ€ß}¢Sû×å©îx¡þž®Of&¹ô…™pŠ«ªW7@p9lJ©äAñó?µåçÔI] Õ_ðîßÕ¿z¿K,*V ûºeë&dûgò}½œº®·|‰ß‚݇n~ý wñý­ñ•‹-\ €9ý|ünã Ês&¼1« 7;ç†#_;;¹"Rˆ ë\œv^kg«s©Íïåzª7ó™7+Ôé‹Þø•NßÜÔª§§¾'I7 §g³¼bm7Rþùbh³®µÆ‹iË?ŒÕê¬FmnÑ[2o#ªÏ”LÙ÷Éýy?œî$²1‹N²•oëÃoozüú.ßÛž—í [9?<Ȱ£™!´—ÍÁA;Ç]eid¨Û¸~ŒÄVy2PñÎÊ2´Jå Q?Z§}W?D¯Ù:ŽŽNOóoE–Ãß²|,«òJ¯ëEzËÖ+×úy?ÑüÝåâ|¿_ïO}•$}jo¯«ÃXZžu1ßÖ?oë·mtJ ²'‚™¿%×)B§žÙNf‚³Äå÷zwoíÑõÛQHö~ÌŒh‡nÅ_‡KÖè•“äÛñÕek)oõÆZø‡V[/·î¿I®Ü“™±âº¶Ûk WVK8 ´NõÈ„ýËÙ*² u{á˜çg&n¦gä¶*nÇüåš>h*™¶SüÈ]wå"¦»Ë!S©!ÆÐ¶nÜ}ýÁ97ï¿.‡I"ÅÅ9ïy‹†ùa1ZE¼Ýº|AuC#™ÄVõ“AT–“Þa•›…dsÃò¬Öÿqk¯&8ã€9Žã†Sk|(ɹD–­hR^yW6ÒOPLçÔÍTâwCÁ4+Å·‘úÜn©U›UË?Øí~Á…À•ø8Úðlås¿³µù­¹F§ßûÚÉtFHƒÚŒuËâ«”R•Uœý¡mùïxëÕ÷ËŸôyŸ{uð3kå&fÃÅquѳA߇qóëÕÁC ‹ìné‰½ëÆ Û^.ڤˡ¼ç;ÕT ±möHþv’:{yiÍôIDÿá¯V£V¦¨¶Ôs^:^ëB£Wbi‰é屫*ŽOÅÕ‹$™%˜ÕÈÅl§Ê•*" ¤ZEnçÊ1ÌO£^cWq0½ç®mÄ&ÁË¥íŽÍ…›7ýÖqñWqqÐV[ÉëxùxÛëÝoõ[ÍówqŒ¨÷áÔûŸÇçýòµòæóùàý?8N—2m«²®}$¬RuÉ&ƒ±™®úÜ­Âj¥z„kœÅ—S粯­6¾¸W¾¤í°ÜÏ~“~¶ß×…ºt)êWî•}ßçr:ïÿåÈÆéÜâ5á“?oå÷ù( Ÿq~É¿ãæ>±-Â겜J º …­\÷Uªu{‡ñPËó¾õéhbζ„"`úþlÈ&a~ЇµOe<úÏqæ3­Ýõ«šJ¿w<ÌqÜe5ïÉõd»pͪ6b‰ÑÖíéu¯>=S ´NiŸ2»â!äJ©f‡ó`Ï›ô÷6›œm«%GiƒßrHvúñŒ§ä²½ó}²Ô¾P¹ÙB½(E„þÚ`m)UMURRÐö_ÄZkUU«UÓ6Ø}ÌÜBQN6«g#ã´Þ)B&vãÄÓWћȫFßà|÷å%êÖ”o?.¢LûÃYcX„'RëmQ US Å­–¡ØÖTZŒÆ`qU¼W-ªXˆÞ¦óÚŠ… r¬‡ît«ðдÞLU÷œ“U'N­Ûv´ÆÔD/SGÀ¶M¿nm{ÀëÑH8],EŒ Ø1àP¦&ƒÏr|à)öu€Í5ÛYëÊSo¼•P‚(ÉÉéa©¡b¦ôýÎF5ê¿n—ÿL_U½çæ;ç#ßÙÍ^=¶N GMÕ!f^Qw餄 ŠˆÅË7Õ9‡!ŠMÓ«??…<½ Ì O³ýˆœ9öb¨¬½dÓBÛ%hNvÚá‰d5× Ã%»èXBEm3{?W%‡%—N9+¥§DŠJ£‚*Ê ˆ%‹Ma‚!```0#  ­ 02T‚ìÐÓ2L#ãîl­"¥Œ3WW£c¸CшNÉÑ‚ÀªÀ3¸A %¢©8TjÕV’á Y‰€±mc¯p½Æ«ÅffcÌÊ € €WŒ1Š¢ŠŽ1PTT”1‚ '**€¨€Œ®{k€‡¯&4þPƲö¼U›ʤ ðN§÷Þñ:Ÿ‡a>ÌMr•‡A4s=hà:™¤ú0 ÷ÐÛ #jY;ÏN¶2;xÙ¶+~ˇmþl£‚ˆ¥»b4Ó$àêÝñLíŇ®çxní‹î\a9ãø¬kž‰Êžu;½ `:Þì¦D}ã‘d²âî2„¢V7NM"ñhxÌîyúÅ+—ç.ƒŽEž§iF šQ–ɲU¡Rú#Ðh…3Ý.;ínAÓœë!ËõÚÞák$?k±ÞÅD ²(/Qn Â¯~9Æ(ÑHMªãÉAFœé2 s„ãJ×ý²ˆ† $c¢Ý$¥e×zåÐV©Å=RLDµº+§Ð(Æ Uh c2†EÀ0­À¬ DE[¤DÂè#S£S/4 M8bAExèÒŠHŒÂ%"²àlß¾çtö|¦aK@àa¼c²ávç A£ ‡¥cÆ´‡ÃdÀ‘0fÆ—@>€À›²ï°À‹Á΀*´ B3} \þËMrŽ™ÐÁ—»•hÂvHUݧˆGiGFí\q"mc÷ß¹Òì¹V[ãOÁiÀ¹¯Æv#ñ‡\äÙ$Ørç>àEÔí™Ѷ°ÀX7mKÙiâ2 $ìo×`æ>}}7ùB’^ƒ„áoÓœeاNþŸf÷Fw·Û]çep6¯Í9WÉêJé·íß¿F;:RÙôÙ‡Ùzî‰3!“ʲ®S R]³ä\4x ÌŸÎa½,+n|Í30\¬Ï¢šKÆê€(Ùuü¹‹”õP‚+¤!Ñæ…‰D—; I¦hÔ×ÞîÕ-¹`PN9²ê¦r":¹|œ|ˆcƒ¨*¨¯CAéÈ9Î%X½žJ¡”€~:Ö àИ9¸¬A4]8@˜FTé³N» ™iØ+0h˜  R(€Pn!6Xhö1YëCmšÁšŠ Gh´^TŠ!†@EQ1@¬Z·†€€ǨÕQÖ2 J†ZƒU‹EŒ€¶FŒPU›mTD±j€Z£UADE0Æ(5P]TÕbÕ€ÕŠª„$¨2&DAPëB½ º Çql`…21=/>Ì­fŠ*ä`€¿WYõ—„½‡¾TQv˜oœ¯&x$ˆk½"x**LЮ•ÛÕì—­3&ñ`;€!€³ÍÖÀÏõ°.œA0S¦ûAêí&ÓÄÁÉÁÙÏ&îßl¢Wé»}/½Ý¡…ä¸Þ‡ÊÒ’ùœö9ðòbëÉ5C˜)!3g T™ßfÏL ”º àÚ8†¥áìA PÜoMûÚ`;”¥2Gävf0ŒÈÔ jÚXúlãœC†¼‚˜ˆˆET Ã4E‰ÔK@ÔtYX$# Íä Nø¡ÍØÙ°é®0$cÂA%Ç–Z‹ðÈô´«¶›ï®ÅÄT]€‚ «ÀflSzdr¬$ ×?lÈGrqÉЬ9-íU ïjë‰S«lNAÆ gî4 ru]Š(ÒÑvN¬ÕQ›Ð]¸pÈhÛ@MC —" Z h¢Ð¨á`EcŠ¥*hB—lI¨"bÅDµ$³u“±Ž 1`½`ÅX¨‚¡¦±1Ú± ŠÀˆV1€‚+¢ØT¬ ¢1– Z 8ÀTÕª-€ j¡1âR€…^ZÆ?°P1bA€u”p$¾Ë-¸ÁLF÷ëÕVÙ~TdUè>áh¾=Î}G÷Fý‘±æW÷§þn,<¦‡sqÜ+¾¾Üà)´f@åSÖ…ª”¸-7ÐG‚Å©%°ßz `ƒ3`7çþ—È]ˆòmÍé-Õ¶90í (/,‰~§Ó;wº >¶øæ {cÖþ0’P‚œü­Éèh$íŽdjåO³ýsúÑž)[]܈Dý¡j*´ÿ?2¢Ô >g Út <èð–¾ÒB NÒ bûP¯Ö›l†’=¼âÉPsnZM4CÈŠÑdºþœE€@pë‹ã±Ž C ø=öêKz€ ¨ºOggS€¶ &]ß{rŠñÿðÿÿÿÿÿðÿÝÿñG>GCGHIX_bO\.«k¶óöîÌYœõƒ*=-h*t­ ž 1&‹Qp¿uÍ϶¡L[4nië ÚqhZþ] tŒ½-PI=cL3:µÒž€ ÆÀÒ NŒ«]†sÔ®PN… €B[$­`®E2¡ˆ¬G­[AÎ ª…ˆ€…€ÛeAf€°¢³¬Ù¡¨ ¨*`mb( ¦bKE±j €uŠШXÄõ‰ bƒ b¨ª ‚ Z1 èØY5PA,€èP±¨OÀ3¢À¼Jh€@ŒcƒD"~ÌÌšBhnp¶Ä%€€ ÿQ)Çàè$€Ws„Lÿ4lÈLg ܶê¡36pé%Èo€a{Â4“‘ 07§o$›£usp§cT ÃvQ¯Cã /¿ûçòþì¦o°?È9ø¾æPÜy_F€…‚†jvè3¾±¿ß|Ž«Î<€W‡4!dâí4•þïh¨¿õbÕšz ŠÊÀ\ÝÅ-ÒÜUn:½Ù2B‚»FVȈš•´€¼’ñA"UAtXÇJ!©¨!r“ãQ¡Ã,xeèþ,’«GÄ_#LÚ´ºÊVÀz½52Óh(‚‚™á«þDX»ÖˆÏ‰¤4ìuhzÌ¢cHõYì)ï7Ø$¨- YS-»ëH@40…€èZ—…(šy*gÑî«Gf @ u­sÑ@ˆUÆ¥Ÿ– €B%J((nH .÷ © ¶Ìx@Ç]ª@¡í²•ƒÎZ9h‹±™9UZ  ¨)ƒ"XŒe*ˆŠ¨9vY´  ŠkªÐÓY@#X—…© ¨Z ÖLQ‚0d&¹" `@Wi, ‰¸ 1pàCô ”JQþËíf2ØÔ]QÑpvtsÂÉzù=3j…X._^Àg˜^B¿65`û²7 à$pÚ»´_]g í¡ wÈš9pá@‰{€Å PçBBþ9uM´ 0·uÅÏM\â7BÔ'ßÏØã½Ì>c—À‰§€«eh®né-ç—bûÐjþ´áfOBV¢6=ù¦»yO¦äÊý¥@ÐL&g2Íx‡Ô…õâèœ_S£ÈÙK»C,¼~ðünÑ…Ö:ò¶må-w¥ä¥ÌŽRŸ‚‡"‡LÅÊ4Yõ ©`Ž#œ”½í‹LÔÀF\×¢ÒKlAžöiŽ®¿÷Í¢CV€ °?§]ÌÝܺÐ×iw¦J" Ô€ ½½œ€QÖôGWæ~¨©Ì®Ö~Îîµuà@µ%õìvH€Æ×Ö9À^x‘É<ìbÕ9³j$–J]”"ªî€¥ ÖŠh­Y!Jd°L'uâi4)JXÍd8¶mD”‘%]_+¢fÆuÁȪ\ bàÅ+Ƙ˜¶4s"d+²FÑUUPEÖ˜@4,l£ˆ-À€ 5· 1„ €µl{€€±àœv(`)OÀ ~ËMxMˆ`VPœ96ëÈG™•IqÞ`Þs¡(ß¿õ)ßëq. þ]‡nÀõJœráHéus\b-ØÀD»•YØßÙŠ¸lpÚ[¾ ççi=@àI¾o[K’ŠÐMìåöþjœìäkŠ¥ç8M}?8þäZþ‹ªž"( QßI<Ъ?fj¡ÊމO=¼íg†èÿŠgáSp<˜·Eðîì±ÚcâuüNç;«dô7tUhKî@qª²~2Ž Å$ié 0%˜BeØ‹‚UL”bƒŠj4L'ªœüŽZ–£}ëÞ ¤ °?—„Ç)D&WLY6Uù“9uÆ5‡¯9%Ždïg€<ë«îí¾À~– ²þÃ[Ëc¡«lÛTÀ X˜&àˆëk4à!­0@λ#EÀK†®¾”-›×»/¬Z¨p€¬6͆ŒR4³±*¡- ´D€,U°Ž0BaX ƒ3À"Kæ­g™ À½ûb ˜¢D †Š 6(1¶.7ä ˆÚ£ $g4°l5,í°khlÃF@Ä`Ñ©*,(ˆ€ V0 @@Ìín‹böL0ýf›ŸbÂ(„Dá"¿£úÓç€O?|jf¦¾ˆ&¿õb%€Wt^]Ÿ9a(݉¸$û˜V¥GÀ Ø€ƒË‡>xÎM°'/õ; Ê×¹;Úˆ·T©Äv@)sí%¾u6Š®ß+ù ¸W°ŽêóG×Ý÷…ã…Zaˆ¾:€d×9JƇb¿ë÷©q¼éI:ÚE¥Jó/ʼï?‹<÷qê·ׂ€œ«›ãŸ?½\!ßMhÁÛ;…|H“Ð6_^ÒVßðx²Q•?íå›7‘€ Ù wÓ@ò@@Jþ)Ï7žèsOVŸiB}I“ª ìÖ' P“8r¨”õ=ÍÐKyÚ[Ø^ˆŽ'“¦,o3¨nhúð≧]ÄÜvë@CˆÑ8,2ƒˆˆc€`¬sX$@ÉêXª¥EJÝWE ’¢2bAÆÔ³ Ï‚Q a%ã†ZÑ‚+ÐXd>£íU €V3—A,Aàh¬ ÖÔb€‰½5+¦‚±J±.Êl7» Àa³( ª¨…€U@DÀèT Ë¢7œ@üdÍ:œ~»MrÊ aÁóЪlŠUçÐf2*X:ñ~ã±m(îß¿~u1Þ}UvÀj?éü¼ &ðñ¨éH¸°p—%€Ñæ „Càǯ`€›S6y®‡gˆ.øìH‚¶^Øè™âàÔ%RÖNN²qÛ1u޾ïz'‡ªtRU”-GG 6/Ý\|‘@Ÿl<–ŒäÖÿ¥€66ûÀ“a»MŽ·Ë`©ëƒã¥™¡´ý]%{?ô:˜póÚa²4MV†¼fJT÷œ… ƒkË^Îf⚟'P€âñáÖz±i4Ë2” ™"îÖ²9/2¾0!Ô‰éó8—±ãæ(w¡€J0 ¨a&NžÚ:¦9gQÀã‚.â*¥.$ P퀆™Z‹ ;zü7wÏôäÌ _ÄT‹¸ôœ‰Ö,´Hœ¦Á~;Ž]Å9˜ÒÌ2ÌÕÇt_4%0€HžqŽ€ö¸4å @R‰€Jù¾ ­äd´@É`ƒ‚ °1 XƒˆØd]DÄ èöK)V\Á€ˆ€rÐØ€hK ÑæÃ Ê=`§kFVë­l ÙÁÃrš eKÊ—örÝQøÔ|•ͺ½þJeÚÞÎáÓÄÞ¼ˆ^Üx™ à€6lˆà Œ[€~¢#.l…ËÜà Ø=½€Ë´‘c9.ÐHöuKq*PCvàlý—y‰6Ôn©œ¶öª-Ðau,¦Í‡Ô•L’€ì—s­&Q\5ÞgÕ6~¼NE‰1xÜµè ˆŒB€V€Œ@àb„VýÃŒðëtu#ªOÚ ±$¹BÔ–Wàý"7ÙëÐÛ*‰DqU‹î-Q,±v R¬#V/JôŠŒÙÝWìrÑ X“6³T$Ic"ĵÄz~ë<ŽÉÖ Ýw:+jU"gi§"Xò©rfh7®î8DF0!„6ëyagé—^ÜzÑ@ÅK×ÝŠ¥«V$«wõý  Œã/Ám"ƒ0Ï}®¤ Èy,5vÄJØØDHª¯ŒA4+Áz$ü[䜂õ‡†„^˜ê¾U®÷dÈšÏ0zñ}€PšÁ„ø¦`–®¸Û•½tXÝÌR"­mµM(ð[.¬vÉ$0P2NÞ ìG8/¬r=§DHõŠRððZ±Úªµ¬Ñ±÷˜¹ÄÄWõÍÿmãl£ŒBëfã,¤î[™N)¯°Z8§4aàÑŠ† ’ ”w4µ¼JÑY‘*17ïÑO©ºa£èÎ|B¥Ö"ð( á8oWL 1#ÈL“Ø+/_qg˜nݺU±BÈ,êŒf±Áζªj–%Ràø»À¡–H¯(…(…’ÁÛRì^q™´§ëü”鯠JMà¥nÊ °¥Up{Dy½k7qÚxV'f*#ýY]‡³LÑÍõi„‹±F}|ª’f¯½;oVŒ‘ bK§Thµ[÷BY=îuæR’% VÄf97ŽËén¯Ä†Lm5è2çô_ÝÍ2åy×vôfHÒÏûöóéíó²¥ñðÞåéü4Õ¿ Ûª‡Šu´+Z¢ªèèí¸‘ååßFcêûr2±Ì¯8²È—|~MäfÁRM¡ç¹Í +Úm°§½ÿ0Í“Ñde€wÔùñO¥è9å]§ü9=QË×ëwíúvÜœK1­µ&fúSï¡W’:y¿U`èB­oÄ~a’CëGZ×’YÓF? çÿÚ<#°À9=wŠrb†P]ûOùªlæ)²9úK½¬»óóòµ]¶Êc-#êdœé(ª‘±ºZ6;§ü)u?’Óãõ×ÿ’”OggSÀÕ &^\ÃG‡adÿõÿáÿüÿßÿüÿçÿÛÿåÜF‰bF@¥Ö š2JÀ?@^7 þv`¯³E|¬Ï•¢®5·ÎXª¬—……ÝSŸÏWŽsÝ÷y÷qþ os*_”¸HÌ·þ`OU»×‘§ •o“‹Ky¶úa Þ‹oã}ìn•5"U ÔâíVåaÉ*`ükid-¸ö€š|«Ô>R»¼^©c—YÊÎòð«>ýïí¡mlýôFäòýæaÁHjPÙv×Õr&\ÿاjóåý£”ŸØÂÂþjlºªe¤´1šW¹ŒzÈY”ŠŠ´ùPNÍŒïÿûöùù¯öùÖï“ øœ[`ì»ð¶‰¶Îzß!¢Ô­ª5¸è·Ù’ìm4ƒ¿_6ËÜwã¨a»î´Nì…ñûiWrl>²‹_Ÿ‰R•ÜR²Þ¨¤†ÒáÇóN™0Œë…Øûw»~ôê€'þÖ˜^â>iM)TÔc¤e{®Ž‡”óóóÙ]×Lj‡çO@ø<U¥éz…÷?.#üû`ÝöûèúgÓ/wš¸àâƒû´/GbÙ±0tt~×/G´ëI =üwé4ô¡çQ}~ÚÿÍòÞf¶éí8±5-û`ÿ.÷Œøwøù!ôLDå“Ü&Ë`ò¨VçÿÿËɤ™™Þ©NL%,ŸsÜyý zû{ý܆`™}o€ô{ï q?‚›¤‹þq]ÜjrÌÉWfDsuùNí¹oz2ÓU{DœOå8:ÿ¼øÌQˆF“•ÜÔIÕª¥jæ^(’Þ@2ô¥·^œëä*Rsé9?< s¼ÿƽxúë"ªøs ÚäžSº¨€À„O9_ÃÏB` À¦ÖÕà)B5’ž.EÉn 3„>xèÞP¸lY B þ»­‡÷æºÁÈ, Ú)êîØ^åçË'÷4RÚ?ž^ÜíÆAÓÅ€Œ¸ÏÞnÒšØqŸÏ”ŵ«‹0à®á4t*€×®ö® \­%Ïóý 8\ž$¾¹¯ÈÌèrPÂK Øäm8©Éùc²+HçŒgxù½íå4˜þ«çì »Zsúþ n¥é?æßmÌŠf{æNßî²77½çüÚP{‚ݾ^c²D¤Î~[¬ˆú’¦|>/u]c ±í©ïìöúbüá–)¦)6¯§»%õ©7 A†n9×Ô¼AéŠ Éò°¸ÐÎÖ¼¼½µtÊ):ÊkZÞApÚwRú‹q˜:;W¯ãÏàrØ;hÒ¯±yfLlÛëÁÂ÷Î/ÛŸÝß‚œ”Ïu+LMM¸EôؘÙz¿(ùñ³¥kMsCPðÔð¥n"¹#§TÞ63ï ïÔÍÕEåŒ'¯ Júµ·>l¿Š=Šl=벬 ãÍ3ù©Í0ÄqUô&¨ ÁžEw<½ÿu†_Ê>OŽ3‡½Uó-f$dOš†.0ˆó›h 3*.6@&Ðü4«À?FBF<`@oé%­í$`ƒ/P ˜h±ÒAKjÑÆÉ«¿E 0¢[}sÕrñë´]Œ:\ Ĩ4ˆªBÕ·zû-œ€“nÆjU‘öZ¹Œp°‹¶j@óà5κFîÉØÌç‘xlßf~pÃuÌ|š÷fÕhƒÀ}ˆÀh¨­ÍϼlŽ_.ÿÏÿiû§ýää©öçxÕgàË1/.S ·på"“Ofªnyç¾ån9•ƒ<åä ¿èøžd¹Æ¡>6Ò­›¹QËI%§ï±ã­õͲPV%*7sðU“Ð@-Mϲß}êÈxþ_Eò©w>þÇÅ Éð)àûÄ´"ºCr¢£‹ËöB’­#$î_W‡¶’$™Ì“Jt˜”õñìÝ\7U¨Ì£so“™Þ¼™6T t÷]Ïi’dIBþ1;1LÊìÇŽïMö½ÿÿ“Íž. ‡·?c{øsCÍ»´éÓñÈ—¡ä[GI„„:„ Èvê|Å•ÅvS ±A›!àxb²˜S ű)rÒÅëç}ÞÇ9” ` ÷œ—7€7ÿjjB‘s^²Oº3øçU-™¾²R4·Åç@!0Númè:᪠>×iôå6E¼ãÓ}ói£€Éÿ½øÅ0ãú@jÔPÉ©§éðsPýëïýþ2ÛJØ®ã /o’ñ¨ý‡ÆåbxÞÄ/ø;‹7„M¹;H909§€"ór‰ŸþöûgôϳFûºÿ¹™¦}ìw¦]@uÕÏïõ É2½ßM1óæ:i7PŸ½Žàüp†ÞEUèKȤì!‚ôÐþT&rfv6Uu¯9ƒ_ÃA7{Ÿ‹!y×E'~×òù‰oæFd]L¿ÃqõÇÎZžKÎÇáŠé:¶Aæ!Ò`q@¥÷ýFÆð@¾ÉÅGX?% Èp%0e¶Ü/2ØÎŠn¬`­È~.Û€€ ƒ7ŠÛ’@nl¾6@ò‡DJ«@…þ­DÀüÅ¿€t*Ú$ÞN„ÄOöꟗET£u«Z4ìÚC‘% õùøÜ{ÑgèMë–Ëë«X®¶ÄY¹ß·m_¨Àº¯³¾f4Õ¨) `× ðúù« Ã^+*ü7»a‰SmšµëÌ á¯ÿªó"ACð›Å™j­l¿~W÷(ã±HzÐxíjSWÓ6O×Tï¿Iêýì™Ng ƒÂ¢?U¾†àø™ÃjðΈéyêœP´N€*Ù2´ïf8 yf™Ù­ï2£ú[³ÇÖ“x9€çß~éù¶ÿò¬/ RÀÒþŸž"&6¡¹ÙþœÃ[zÛ VŽÓ•$¢¨ù“¾¯;Éù´¼ìl þ°pÅ:.q–l—ê?|s†îžïžÿÍ|œ½Ù¦Ö€qˆ†qkç4…4~˜à4üõa»ÃéS÷ž3àxmàÀóS,Ù$D­ü¼è@¢7‹ ¾œxË^»yòúO“ ç»ãœççˆ9D–uò‘®e.CÇ÷ Ùô’y£Ï荒_纇ëõ‡bh€î†·™X›¯êåÿqȳP4Ðoh”ÛÆ—Ì<ÄZnä ´ bˆ¤/ Ìk/–i¸õ ˆ–æ†%ÄåW@€î6°/èc¶ /`ˆíPˆ ¶à` õ @·n@â!~ªÛeÅ)0þ)Ö¶ÌJÙË ¶£X ´ô0h#"mþ|Z ¯.²‹_µ6 àݺ3F vsòbA¤dŽ™O?öuÌŠ"̇R! °rØþîPò‘·£†uù&¿ñã#ག\µƒ—ç¶Wº§a “¾®ì}(Ò]?nëùlxM$P¸„Õ|è½¶×pï¼òÚz¥jÓëº`Ö/M1Ĭ»?x3ôßW“ õ§ñÂÉ\-³îôŒ·Ý Õ· ׋\SÙÓ€‰êOè;zµuSûúÝLùÇohï|¾óœ}üæóù°ók˜­·çï(h²gâ£=óÆq»š}&èHY¶ÿ¾"ƒ$àׇdÀ` >KÔÜ ó\䜟Ò|&qy: ü±•‡ûžêgN SÌgRôˆÉxx×¢"^×f  _|¸TÜ|=kó$ŒÍáY~oûÅÄ }®Ú)B:LCtü½;;É÷lr tÓ ´²Ÿ:o­qCàŸ^04d+¦š®ia {Ú~™W1Qɪ)€í YúÐ À xÁ°Ù  \/`hrb! „B‘–‚0T#õ™9oþN Q Þ"åÕœT >*ö–À×ð1犴û¬2ŽBσڠöí¯]}3Mà­{À—Cx)Áu놳ödÎ<_ý´m‘ˆ®Yp5@:¯õw­œVÏél}ÝÛW¾à²!¼”½î`íéÐ ~ólÛÌô®¶ÒT)O×ù¼þ–ÙÝóÐWcžWöLé^…zöÝÁÜ=ø- ˆÅ´:#Óö6J„~¨ÔÐÇß2†ïÒÃ$$À¡HÏ´Ë*0½ò ×?ÝÙ§XɶåÐKÒþì[î¦ /³0ÛžgÉ…äe>÷é{gTÍå¼!ºÕþȆæÎæ®K%ñšÅé9L?ÍSµ')³'¯À䯼q#”‚úøƒ˜ò%az—d£#.Ý9÷Îôüw=s¹wþ-–ŸÑUw~?µ_.z±˜Tß~4>Í3wÊBB$™'ŽÊRŽl’òho= y)úU† LFÀ*]vÐ ¯›ÍPÖðõßV=ÏlæíÀ1Ø~²[yü "Ùü~LVìÈ ýW*>H0üƒi¨…9HØ„+üÿ>lø A~¸ S\FÇû±ÅŽ„¡»nôïc1ªŸ! Þf¶ï·%æ"ÊÚõ+µ  ÁíÍM–‘ûü|âþåÚ×"rI§¶³Y{¾m~j€Oæ¶Žé®Õ$¨Ð3Þþø0¦k(Ôÿwÿhc ã?ÌS!!^4—ù´„|Î`¦î]ÕËÛRÝM뛤"¼^½ÌìV¿>ñi»6W¨hC‡ÿ‡l« U—ËßnVb@£–Y›´¢Š}rϦ˜ÃúRà:Ì}Ý.^ùh9m^q   ¼˜R«‰÷}aË"0›€nKã¿«^ìBb2F~¾Øù_ºÛáÌ­øŸ.€œ *#~fë¯Ë}ù™CœØ7 Åý¯7pj Šú‰#ˆ ­¿ad&‡0³ 1<¾é·^ÙúÝ̬0~C\¯àpó“Ãì!±Ï—.Å0Cî1Þg„Ëü“‡[@n·¯ ÝÓ"åøÀMB¹÷À[5û5·iѲO_­ÌÊŽôE à€dë=_ª‚¯$ó±sèåë³fþA ´R>oÛÞ0Íó ðÃ+dñ6Fm,€¤«-©®üX.%+£ÿ^ê¿@€yAB€d XXg€4ƒß`%pˆjOm[ ƒ1$P_0ĈòFBƒOggSÀö &_[®xIÿÛÿóÿàÿíQQTUMRM]]_ÿÇÿÍÿ¿ÞÆ+‹T„GOCþíðÔ Ÿ)fYþÞ7†ÈzË„ù=|Ý[÷cùc N};s:ºC»çžž÷ó.l6ƒ”¾ø£C_Ï;ZL ß½9ϼ$Þy¢µÅœ™îŒ¤8rÊû5 sç¿Í˜êžBYÄo."Ô^ï_EÂ$)´Ó?]£uÄÒ°ªÎ·ò ?÷žŽ€¢—©“Г4pO‘g’÷ä(¸x©eàáK˜ *@‹¾)ŠÓ ˆ†Äi°»X׆ÛÕ°ååK‹Aµ€ªã Ð#:K8xÚ\VÃ-ÅãŠ-Œ„Ü.Ñ8 ³Œ ¹0Æ\Íø5yÞ¶i6tm¨Õó|8œPû|&®MMÀ'óc÷É,ú¡ž‹¾¼Ë-£ãº$ìûšï‡’LçÓæ˜^äE~ˆjnÐþå¬~i?!õ,ÏõÇx6hæˆôaµ½ÿ—ǯœC¡ymßÔÍ3ýïJq–ìqŸ AÈu¹ÄÆÝ×ÓZäÌ“KöUhÉ€0À«›K—úžvâ÷×ÓéÔÓܘé3ž˜ @†™ªº?c<ùdzΜ«h÷.À«a·wÖ„P1±d­/¢%úðÚZß ñæ³·êäy ,Ð(YD¬LoûC‹6€Óǹ¿1Ÿ´âáôuM~ zž¢þc€÷tã´;~ÑÐðýô¸÷3°‘“§øv2û÷NŠiÔ¿È£œ»$‰^5®Ih Üor°¾ŒÃq Ý™¿ €ËûïuùÜSüþsûo"˜28ÎìÇËL?9ôõó,«foþCà¿u•H“Lf¨|ŸÊ]ÜŠ$y¤¬nÙ@ýÖñÐG×Óo;€A‚§€ä½ósß›lÄIx$°PDü”1¥Ž”’€Ëÿ«//Ð `ôç!f¼#÷“\“JsÐ ýb¥$¡4 De_QUÒù@u ¸à`¾f[Ó@Ý&ЍméÕ@.ÞÔÿ>ª±€òµ)ÛÓv¼Š‘`µNˆÄç~;¹`î«ß¼Õ¨™6WÌ`ÿõ7I—)ñ9ä.c–xFl<3CMEô%=_¼ÃyëL=5§ÿssàbT €×â³Ñ8ájüÊ%èÂé©Î\s^g±wÿ6>ŠTVæÛBŸ¯7×*ˆ˜'É|¨ÊóqBÀDÍf<þG¦‚C%/t9å!Út¯_ê%ƒ ÷žCèw¶]J¼5û_Ó‰n—æ|‡Œr8ñ¯ÒܯÓ\ßz†.h¯ûû/‘gR€!¯g k@hê.Ïÿ¢_c'èü¾,¦»a˜:ò_éÕѲSË·Îx|£„;:µôWÞº-˜Ý¥A£ÊŽÔ»é„M§Þ&¾ã©zdàý/ ›ž»[Y~³˜˜îc©œ' Ý3Éä;¸eÂꤸ¿’×]î†óÜÎ×5¥'2ÍKÕ9@Í2EO© “µìœàýsI"àÓ7Ç`ðð7}›Êe o§"J([ú_) 0H/`,$~ M™±¡,p_å  ºlìOÒ÷_>¤#DzhŠoLÊ ’A/ʾÁ.`DrËÖ¸å-ØÁ¢ÖÐ&©„ÂÀÍÎó!a+êóðg÷Íë» Z^;\M®•øjßv¿§+É™Ìð~ŒÕê† ™ís0:£Ú?þ»W²*³/%%çâ©Ñg¯Áæ•ÜŽf´Ø)!‡e¹ycQêCÛ{ØöÊÛIÓS(¹äi7)d©5mèwá†êf­x«Ï,þÇa¥Êr‹õo<ál³·—(ìWkâ6Uã@’«ƒãsvÏßmοêrŠÀ›ÖÝí»ñ’ý"ÃÛ— D» Pó–-€SVæÝ£wOtT:„וU¯rzž’g_GtÓ $ÍTMB±®Ãru‘[ïáx=×go6ß‹r¸Ùh>—“@×à ûç8Ú¦ÈY'm_øæ]°aøý›8Üé åZßyØbµOÉ00ÔêÄ}âå T颚áE‚çÂwçÔb®9ÆžE÷Ù“ôSû&¿?zà¨lUÃ4ðÎÛð/hÂÏ $ 0סáÒ’mM £vCì#ò¼?­àÄÛÐ3°àxñù€l'ßHz·CæÞ XZ"cضÞN"@æu@/þ¤)¼˜B,V ,‹,!7ºRŠ}H°€€ŒQÊ0 ¹)ÀS%‚•Ñ0$œ ~±”%= ~]gA'–”OûCÝ÷æí‡ùtßÛçŸ&ŸËÍý{ßä¹a:¯àþU3ÿîsóÃ’Dpl ÂS¤b°·2£ñcU ¹…T 7š³¸Þ>–4”á¿Í*~ÛÚ@¶ÿÊOšsþÿêw¼÷ÝuúJÝïT ø(¤z¥¤†‘Ycþ t½P†Êã$\uÒDƒÛ ±öD¸Sp5Á%e™˜’ç8RÅ´ñµLô¿:åT­O~ú2¿IiÎs3Ï’—¨šA 'ï/Po‚±¸Ëo„£(L Q[q.%ÑÇc0<¯öÙŠ#<fpîÇÖ!뎎<ù‘ܺ–xÖdé¨üYk¤ÍçÛ£zéSWÕþ]~MgúÉŸ"'5§ßúØz…tçÀ xóŒ"D0‹A¥L„Röùa¥½tà˜ë\võâzZ­hƒn«×[ º÷Gìö¿\~—ÉÞ§KÁ˜¹+}€¤ž¡[7‰¥SÈ¿¤&QTÙ$Åqqª¤‰2H=L!½o^ÿÔØ™ÒP†BÁá\Ñýi„c¾õˆþãížÒ¡þ??à_3ýv¸¨—¦ƒª™ _<ÿÀ"Ù$|yËk?›â´2"@ɥԥȘ²4´"¢œ×ãʼnûA•R¡IO°s³6¢¤äò¹ÿg½oúcÿÞ8¦ô¹ÔݤggGÜoÇ•JÓ¬ý7S~Çã6ì>)¦º)9þlT0 ²¶ñÞ¤˜xˆVƒ‚#¶Û{…¢Pu¥Ç¥µ\¤PNŠ^¢ü~L¸¯Ÿv¸†ñHAÐR&™‘¢¥ÁÖadзgB£jò»²ªüb!¥7 pIf™¸·žú­%"·9X×T<ƒÈèfQæTÙdDU+‹jÔK}«Ì1¯|^n…ã~:}6sY.qxÖ`=\_RÖðu¤±~@/2ünBîpµá­Àmd* fg –Ipi§Cê(.³~NŸ× Í Þ;ˆ¼ÎéqMå©CÉy|d!•OUI"/«O¼ƒÐ|²wœ3ï«F÷9Ü[³qœXNøîº¯n)šûN#0Çv¿_ Š9º@ûI_úýC?õî®]1¹·™¨¨ of¡V³™—2xCI\ÑýœßZcW;ÿd¶“ö#¯ÕØÇyž“~?¼ ò30‘O†ÅéÄ#Q y¼[ã°dLOÊt*’žÊ®•û^ûÀýlÓ…ÊÂÃV²£hËÇ-ûqùêÉ`(V†ŠÓIO:Ê×ǾCÚ7*:5\?n;çJ Õ$Å‹'¦¥ùr[E™±Sÿd鬻òéÞÿîÞv—·ì½ÿˆ¼üýHˆ  OþÝ?›º(q™"æù§Â¥þSÞÕ?jböí`LX›[icwöç9¾åv>¾$­yWÑDYEξ†h`U>ÓsÿJÒèd›Ü+Aœ0½sçÔ¬ßÖl«“ ËœŠ^5#ßõbz`°Ï†Qï£SÉ+ (ÀxG‡BØB<ÆèJqx± d_ð _ÅM“š”W¡ŠG@À1º"‘€6à 8iýµî‘ XBI‚$?0àºðZ·E $¶©Üõb¼ óñ]/5fúô++—üÌ5žBÈ [Ö¶Jìh?æëiXÅ™ ³Ý×:ùÉåÕÎå™GÉê×}ø¹·£aªÊnÔÚ Ú|Ì&«ø¡ËÆÖŒž™¯`¥™ÞæÊƒû::ñ3àŠÕ¸íX+ûÆÝêe5ÏeT_S™«`ï™s’ÀnÇè]Þe§£I,LuLV†P#<Ÿçøíø¦àí[ï“£‹¹²*UTÁ3×ã*v"ÿó^–Or‰­¹Îo‚Ú"ò ý‡ã«>3g¢a÷¡»Ð?ñ>›öQŸ©o&§jþ=òóõpèûðu©æ¿Ï‹÷Ø7~øxoχ׆™­7ÈìÇ"bóFg¨ªj¦.âC5§g×¹ù©ýÖÏäah¨zØMŸ¤aèNöÎÌ+ht}âüõî:Y{zjƒÄÛÏw~¼øºNÃ&}\ìù|'1ç¢N΂tÍýßY¹s÷Ç&149~6ðÉ.†ü¼â–Ý­Þ´ßúÇ|yk1CË` Q6pð'±ß¬ä··¯5— @€_‹iáÙ]0€°ÀÆØ€áÊ¢T)8äÌ¢.X T¡ÁB0@ VDw„-2À˜Ã…^ÅCÈ/pM~ ÀFV<ž¬í‘„™ÿ ÍÅÙ1Dú lé=ä2¬Ìýâ­ÔîVk¶.]¡fã ÛÜýðûhÒ(ÚÜš (SƒvUUgØŒ 9žzy»IÎ;uíwýì2/·µõ‹|ä¶«ò.ÚÖóQ–žmÚO¦/Ï[¹CªÕ!Wû®›!²ÝN7ÁÐ é8b§RÝîc.)}„‚Çr81Óiï<:“^ÿÝZd Ê…þÞÌx]+üx½²ûÍMÚiËLÐþ]ƒƒÎ4“ÇUqÜ úxH3ß›4éâ("ù~}¸ørþx¬vŸ¤ò·G*œ –^eºZ9ÁL |¢‹úïòc¶‘‘Óæœ ¸wɏТ`|olº“t* “òrÿî.õbRšÇ—Æ[û»“Ñá81I¿ìr :˜=Šn˜ê»að´ðÀÛ@À>¨*W)Á£&=üf"böš•tÀ0_ŒiX&øÆ™hQ…!c{0ö‰…BF … -å¬xSÚ6??pÀ̈ é¶°xÁ¸¡ ¬"¡ Àùÿô¢n„¡§•—ö3¸áô_@$tœOggSÀ &`OC2ÿÀÿÀÿÔÿÎÿÕÿØÿßÿèÿÙ^ËÕ‚Hå 97«5~0€>Ÿ¹9oóÙÈreg’>³ëºÎvø6j¦ÞÕðU@üØ£{_—[ ^T=Ÿ`w:1^¹¸îÙ.ûUƒc Ôì!®¢zî)ê¹V ›dgØ¡ÿo;ÈR1™_“9S!°³¦¡j(¼¢Þ.&øl É!÷äÿ,?LW?9ÌÂOC÷;â@B%£Bö«<]ä†é,2Ï]å°És °þõ›¿õˆJ˜9³ïÙœN¸‹¢s8Ÿÿ™è·«Ç4yª£Æðg]ãå,ÛY Õ4S;|þôf×tó²UÝèÆ1¥g¯@CñJˆ±*¼¥z3Àø•m7b®9´¤bl*/2ÈÆ€ Ç¢€9ëÒˆã=¨n "+éþj xyÖUHG@c0€ûë8®¿±@X ÒàÍG> p¤‡ Þ«õ†·¦ˆEÔ¼›5B8 ôù̱¬Tƒž­xå’ â Æll>ÙšuõцftUª)  )O\«ÿº‡™€ÒIćmôgnZ–:jµ‰¶K½èÏ¦Ž»æöú8ññv–²Zæ`ïÀèúßSr@yZw#· «½sNçͨ)ˆ:ÃJÆ4Ïï/K~ï»2[çc±v¸æWIZ/#•F|!tÇÍ…äzPñŽ2÷ÛžâÕÏŽg2yþõ²HÒCQô: à^²¡?2lz»ŒGÕÔI§7Õ¾î#xž2®Ï›l[|sʦ¼ë:swçáÙ‹¾ê%'“r¶«=ëëcš3 §ºóꦲΠõæ$EáÛë1:Ù,ßžæûÓšFUä0ßwÆ ¾º¯ ì[Ìë|4U¸Ïœø¾7³s5ºöœC3 _«ês·g:ï,CH¡ ³/ÃTÓoZ*…2B7öè"( #RÁ?Ýÿ@ÁÏëâB¼•ÀÈhzMÍ5þ0ÀAËú ¡‘ßÐIlE«*@N¥•*nIúƒÔ³±L~M ¼1ŽÂ ¾«†€•>P€>oµEpÐ/>ôPC·gYY³éÈhŠì“ p¹±L¿o  éÂ#Ö"SŠij„ `LÅc&Núá~ˆW"÷3«sÉüZŸ»ߘ3PÆÏÙîÄ÷»O[•ÄDo=iÍ5 VÒFrî?ölÙö ”Ë.Þ?>ª§ÛéçR¦é¥³¾ç¹²7£< p¯Çâ¦Ëç—ש®½¼Ò€Žœ ¡ýñ¯©XøRçÅ£ë¦_š£ÅD3ÜÏû}ÿŠAJ\^ ë´¬„=§søÏ³(Ëk}­;¼Ó6zøÄR1,wx€èNÓñ°}l_·$dGltîÌå÷À(š¡êW“ ®]T|`›ÃØú; ûµ¦•NghÐвųñïW¹‘uå àg²ìí˜ÅfÂÇßÞ7ÚñømêtA1ûÏ€âM>îíµ;Óœ€«ªkºtç › ÉÔ첊œ’æ\¥¨n À˜†XÄòþ%À¢¼‚ “ˆI!Ã6Ù‰4Xç%3ñDaëp6æiSŒÄ]”ᥤ†~{u/¾*HŠp ×ßmnà_Àcú€[doRõWHœ]œ ¾yAâ>ƒ¯½PÛ&BŸGõ'ظ,†mÛ¬Ï÷V­ÑÙáA¦nXŸkÄd4á®?kpÀ¶¬¿ÛŒG›4u½•l&U½k¹ì‹¹g0ÛçtV¸}•t‰¬PÑx¾½Œtùx\|üvR8pœoû?m­Àß>iëvЬ¹€|{²?Ëóñ×òòüL4=™ù~˜—W~» ã-ïì´£'ãÒLo+]{¥·~ÿ@nÉÍ–ÏÙtþ}&b>ì ‰>/33K‚8{:áãÝÐw£Ó9ÎæüœÓÝC½ ¸£þ9å|Åa®á€þ¶ÌTÞäÇÍówLcoÜôšåì&³~Ⱥ s&úO°1pö¡êª¬Ïôù\3C÷lwÖþ2ßìÁUë]PÍi†vp:p°å “¤î=9n~NO‘š¬YNöŸå}Još¦%ãêÓãJ$€â  WGÄU¦„H‡ÜÂ@^±1 ~-€Š Àu¤*Ѐ©4Ò*óŽ6°“4BÚp)1°1€ãDÆ ÈŸ ò¦¥0`Ò Ì-À°@ š‹‡×À ^$Òr¿h0~«­’‡¾}h@Ÿ¹×d˜›½Ò¾=Ë8‘Me)cp¿]=üÀ˜sMf}ø1†pø†UÒF×r›üwzTéw8y½÷ãë~`¢éIwÇçÐüº Ë›ÿö{FÓ|.YùóIª[Áv&ŽdTuPÃ'ùѯ•û¨û©È35=ñ©gzàSÌ›?s¸?c†&‡¡0øëÏÇäGÙD>ª›d±‘ì SWCóSÏÛãÝoW-ûb л‡ <wÅ5¿³²©>Å2ðÍæ~†Nþr<ÑLC‡âßa†‰8HÇõrLòcHèýuõÉáªa†÷ uüÜÙf³ >·]·ìû^=FÅ¿ †toÇÄ↔®†lÀÎça;ýñ²<Ä¿Äô<³cá$7õ) :æ>ó; 3u²NEÍX ßÙ‘Ó@í„Ìws3Mžbb± }»Ü«£ËkïièI.ân0Ã.“påîÚ æw€eÇ`ƒVŒ„dnxÀëóöÈØ9`ºhȃ…ˆ…ƒao§8° ”äY™ÌúaÐlöH…¸?)-Ã;q ºuaê—µ À…À–ðÛçRޫ힀µyAˆú¬Å ;h"ôíYDurÚ¹$3Z pƒ6¾«[>†}óÖˆ¦DÕêÕ¼ÅõsUóòößQš ,'gß÷pØ¡fâyOFÖá×vw¹ëQDþÎ-wr@'½÷½ìžÇ«ÊæÝ܇Íø`ØðMz5xæˆzêÊtÆá¼'ÏžfÅAGLt¡¹¬‘|<÷~ûx™Þ“_ÓÃæPÄ·ò«"¿l;É$fÛaþþeòùûCïâ¾pÅç _k“üÈæå‘ÖEÎüi? ÂÍäïÕl½íùSªÞtž¢xôÙsªÍ‹!"!{ªß?ËH¸„{DÍùª ^¼YbåŸSKà2áÑoÆ'¡ÓwÞoÍס–4ÓügÁ§ÅbÔæç9JÓ0?#ŠŠéÆÐCä×ÞŸ‘eùbÆžÞŸÚYç¡öLÂT7óm&E5ìžóìtrç½kzûiql*¤ÝºÄb@ ¸Ÿ¦n0€€fíAhàÅ}ÙÁ`¿\=PGA"#Ɔß¶iÄ‹ ,d < äy‡”F^Æ¡¸ÃŽà)í¹¯(1ú1 ^ˆW c%$çV¶b_’>~›žÀœÍ ˆÈÍ»Öy¨íÊ`¡ÏgŽçùL¦b'À'¢1O&×ylš'}-Øk·5ïIEæ6tõ‰¹Ý•Mk½œB”€etçëž™]'¦1ùóºšêÌ ”ÏÞ¯‹³“fþûFÝjdw'û®T|uÒݶLÅ=½³KD>|%zÔÿ!ibÚuCƒn/·Sߦ¦þðkæ/ðlññ{r°¿®|uðåšr| ³ÏY”î…¦øáUŸûSp»p¢iø~ONÕ)»;ys0äΟ}`î·¾y„ÏÌẙçÜÀï{gï> {V$™LA9æß]Ó§ Væ3ñ¹9÷U³óT&š½!§£¹‰ÏŸ2ùñ ØÌ'þ¼_êTU²Å¶Iˆïêïìû9Íì݇¬ŒŸ„æOªj;_™ùpœvÑ/“ t霷ÒZGº¿yCχæóßgþ™—/z\?Ã0~X…×=¦Èå%ÐÁ~kC%]Äs x5@J,¼Í`>/èñ#Ó`šÎHh©n»HK‰¾¬[P@€üŒ‘Ñû ð‡~ù ÀÀq À©P>Ýõ‚è-#,»@Û#7J7¾«õ ÂJ/H²µ¸ÏÝ«îÊ>L ž÷ùÌQY „6€œBs®'âù¶ÙóÄ)@¾6òªE¥ðÕú¿Ÿ4ˆÝWˆÓ41qy>“<;k·|ÍI§¦½Ï®Ó­4%§ÜÆ|Ùð«ïÆÐß[ &ÚŽ¿{¾Tâ3@a}1§3µ´¾ªþÊW’åHöþÁ^¹ìÕÇç3t4Évi‘8\²—˜}BÒ¼Tzb1Ïúº¨›ÍT3UÐùÙ]Y&s¦ë<ÒouM Ÿ^/R–^ÞEP˜Ëâ5:áß©´hhŸDÿއ\OÏO~ë óñê8ºe®ùè-Ÿýœ:mt~øI2ŸÒ/ó»Î2?¿V€YþÑdï{ÏÞÙø¸ìSÔËrº*{ÉÔÓòðÇGFwT[0dçäÉÏ@†ë¿¡ ëC~è³™¦aþEU¸>u¶±Ì[Fd³G0m•Ó›|êèY7Pše`5.67i˜éÌ?Q†RÆ  •y% ´”„ ¶8‹ßJ´³-€ýnb€X`²°Ü´*-D³2$ôk­0ä ÿ¼‹/( @"ðaÁ ÂPŒ"`> `h,?>Êï/œ F€:2â¯8àWfàt Þ«‘B¤—Iê"ÂÍÃ×RDöÐ "í=ó8Âñe¶¬¸ u–ÑõHJnödàåxjŽ@’ŒÍW}T5L¤$cº«þëÆÜwš Æ<†²ªM÷ch¸¿ÊM–«ªúƒN·îv®Ð‹r.”\¶å4z`Fõ½’‹»<>e˜7Ç ¥þkîvGŸ8/<ãgìdÛ•´ÁêɈöQ†lwå.Ç…W¤¥x:œhwÖj€(Ç0³kk¡}úy˜šE70“l8· \¯þê?,Ç É7í~ê¸Ïß„¶ŸäÒ„>š¿•¦²îa˜ïÿ-‘™¸;+"vÛƒî(•ò²³=_qøù=\•ËŠòËǪ/ê=‡³)’]›¹óÌ;ß©þêÐÄËýÙXžÚ•èj˜°âkÙŽßW‡3a÷qÚè~¿\}ÌÌí£?¢Fç¢øð¾5<¯âu0Sþ/>%–6¨ýüÝÝÔfzwÇÎâ¼‹È w0ÌÀÀj (TpÅ1i:jWZ 0 øÛÁà-æN,€ù³¤¦È¨Àd0Æ\/ø{PËÖ°HK‚UhoîU.I2”ùº-TUÛ]@²KCŸ+Ù ¨ÀU2ÿ"ÑèOggSÀ> &aÃ2ÀKÿÌÿÒÿåÿÖÿÔÿÙÿâÿÒÿÚþ›õ‘AdŒ ç®·j Ì‹¨{Gáh³úD3 pÙ”Éæ{ùpï{“v̪ºQ)kFÁ.a‡Ïžºƒ(G ×%Ÿ}®øÒoés¬l¥\,‘¤oõtïó6“ËØÍ9 !¤£ø1+ÚX+¯ó‰ØkÉB܈w¦²ÁM0¼ÕHc4ŽæfžhTÒh”†rÂ_g #'̘@ÊÌ™ œÏÕ²’x„›aœ]i«*©"‰ûtóÛ9§z€£74IæP÷ÙçßÔX®&¥·WùÙð‡29Eço–¤=ÎÔ“?¼¹g¶“ЊWåóö³%=Õ 5ÏËô_̉ž¹’ü?1$ôlHÖC¾5u*gØõ}ò$§`Ú*ñ½Ã:s3³y{3ðùnªTgòä®æÊªjwV£éÿd7¼¥ºv}>MÉI&A¾Z•hæÇϸ›ôi2ò{fº›Þ`Ê¿}”]¢·¸‡J¦an`NžëM²zÐ`Ü ‰x’¥UDIxs¹ÆQa!àF’9 pdá/6êGxÈ\ävò ¶ÁÿIQv Dò|XÁØœ¯€[¨Á&wáUU­æòþFá’Ð"Hžœ:Íw0ˆÞ°5y5pÜÍGåЖIG6ÑX&ù¡äµ‘kh„ÔZˆHlšÓ¦³™pÜèwþ×\€M$x­Üé?ŠMÇ]Û•6 c€þ¡‰WQN@Ï®f)´’þÂÖµ ÊÄ«`ÍKŒ[GoßÓ¹¸ŽŠè³öë$xó©÷Ò —­žÏLúøÎWô¼*L|‚èƒ3¯åæ’níwíö¼°ö¸T¿¸ùïþmefÓ?1?] Ÿ:DASÇú\’ô¿þ[©¿Ê³Ó†åùå–þvçö>oâ:LJ>÷LÙTÕÿ¹œ¯‡è¢îÏL ûí©tî†o:˜™;`qÝ–Ùª‡tö×ü‘BÓÌÜ[•YUg~Î1*‡âxç'9¢ÏO6Àõ’ž_Ãô@RÏË =œÞvî@ú»¬‡ý4L» GØýØ×Z’ƒû5ûô,ާs** ¼¸En‘¨Eè=mØ p`"Ý|}È(ÿˆ” ,ÀHÌùBPÞ„š@‡Ä_§Ie.¢"b ¾ \4ÈŒ!ª^~dýeØ•$º£3x ‡>ª²E“ˆ•7Ih‡]0ͲD´!lÞ›-“íà Örs069Š\ãFcKŸGµ„]o{;¶“Égƒöd¬k¾'cîy“Ì:ÚpUˆÊÑ։гö.Óþ™†—h˄ޜ֟]³Š\9X·¹1dB1mÓ¥ØX.Ŧ•Ü|AÇÉT%›ßPI‚ÏmrèFÉ;ß,^‘&¼KYT’°ž$ˆûW䥵‡éì×òóÈ¡X0@°ùSwz~ñKèîâWe  ô¯¨òë½}W-GjKtLá§:©êWŸ¯‘}ˆÜ˜Y÷Ðå“¿¹< mxß¿öDÇ#cÄÏ›o¨ òt*èÚÌÅ@uÕN]yÙh'Ñ—80ÛD÷¾Û? {O7ÍìÌB³Žç-bxÎÈg]ÝY>£ŠåB·¯ 柗ҥº ’{{Α‡àÔ\Ðñqœ†®¬Éù¿CÂqR§Ñ^¿@3µz9%Ùó”ÏiWxúÚ=HN lCvL0òfÓ­öܹA‰÷kœ¸ pž(¸‹EÂoH‹úKî ¼€b`د„@¼€K\À/²%@€@J(™#sŸ‘‰ý³j©™*yÒßî°ØH¡<] ´‹¨>i'nÀ¶`rH¾«†ÁÊ0B†>s³^bèã Ðüj³z$#2ó(Ú-èëðó³F,žBä1"[§ˆÏ±&I’oÂé¿€"ygC”©Hk•ˆ–ËäS-»íÚ>¸§Å\Ë^Ý„ø W)㟽9~?4ÉÙóö¢óm›­¿×_÷É'úVé\« e.QZ4 ùj:Y>?`¨9ópž},NZ¹™rÙ£?ôGOÁ1™À€\ŽÏöl™¾Œ0\6AÑEýþÒ5ù ‹ÿ6Ig/§‚ZÌ}|ø€çsf ÈÙα‰éᯓ'ÃÕëLÿa>†þ|=OÝÛù„o"ˆ­yÞßï¼´›Þ6ô¾©/^œ¡æ—¸†áÆüezfØ`¶/ øqíÕÏÊæv:ÿã[ܾŠh ³·¡‘סã…}Ø’Óþ Üyþ×L§á¹Xs˜$ñ¡[†úyÔÛ½¿8r#/ÿîa–¤ËW‚ãz H¨MWW5ÌK5ÐÝ Ý¤o *Myƒ‚”E€ †Ê-Hi@Œ÷gëÍ|OACɺHd5@‘“<2ǨÐÁ€ø1p¥„J(¥æx?… r |³ vA¸'Ùs( (~«Îø‚>oµZ2ÒÌ~P0ÓçGæ¬È›C\fˆÐ\œ]<ÊÚ :ApÌ…j˜z ™-ûÙ¿ŠjÉW€f>óY?Dëðcäui O{%,7Þ&¸Q·MŽkîå¥ÎÀɬí{!蔌Ö…q Jö5®-Ñ/µf.€ åðãD\óµ nO‡ŸUrÆcv1é-Mß{å×áØòbO†˜¾ÌJæëqXI_r88¸fïó 4T1ìÓ:?9ö£ß~òòC¡ÚÛË*2#ïØ.wÍ¿Ë0{ [DIL±tùóå[zŸ*$˜¼Ìß=RDÙ9»fýÔîýgÀ?»!þÝæø9ôqõÇkÿø•,/#’ýãÀ@þnÄ9sºg˜Ÿ[°³Ë C‡cü+§*œ)¦e×<ýn<úkæáNo’Iz'™öç)v€fÈúýSÕ ù¿výlàwMÊÎL“â Z¶?Þ’u˜ê¾¾î3@è3h¦ ȵ ðü3f a=*°-yû ´#¶¿ °`ž;ÞšPÖþ«ØÂ`àÿýRГ h•" “=Z ÀH« Xtý€B@à]ø%džcÜ/4y €$qb0 óÚ 6Xˆh`‘ž«MšÁÉÐbÅÝçmÖIgøA¡†ø™“E4õ¥Y©œ €'Í¡¼èd\Þ(ÙüzƳgð2ëódæÝë-Úe-‘$²Z^'¼#Á»—\˜ßÂ}åרc[S7J¤¡ñrvÅób120v!çXÏX¶Ü:J뚪—¨¨~´j’jîÏŠ›aÝ… ¼Ó‚ür°*>Ê%‘Âm¼¯¥‰{îÁs@i<“`B.¡KO‡ß~à˜Žß `ÿ¢i𯿠ÝêÆº,~wBâv6Wß Öçl Ýð¹~ï™í¹ý£àö ûxzÞÐÿ>@½§òûónžM§@Ư;A&Ù$ǯ>à ~³É§Acî&ÎC¬îD´«) ¶ñâÎ+ó^ üΜ—O^þ(èÏk?¿0ø`@öëæˆ¢×?ß‘àÝ¿î23U“5»šCÈk²ø²‰OíÀ&:u›ÓT³GÔüzV*ßo& yŸ¤³ 7\øÔ·:óöm¼˜N¢ B­˜è cÀòÐu@ƒx- Ðÿ¾Œ°-ÉC}?=mPeÐf#Qä–‘ K<ñ×àŠ8ˆHÎ €@*.BßQ CðR~«ÕBØÀ„ ÉÖr m6˨ÈmÑ"Ôç'œböÜ2»9(À,>}G%¯Ø; gÓ̳9·-ŸÝ†OæhÛ°Äõ–0 ¤⦽Qƒ8ûtɘ£ËŸ%’ûT¯ï…·æ¸ßܯÍ^<Ëq½£äæI&g×סþ¿ n­€”®B:#*Û\ ’°4EW]i÷·vË£”A'ô Ñ3ó‹t»ÍÁ‹t%ëÙ“MOóÅap”Ÿ›tîoÿÃ7÷ËÓÏö½ƒ p‡øæ9q¼t$”ˆ!÷¶ÅNÞ¿`ʱ02‰îÙLgçï‘Лb’ϦiãAà{Â-yU²ÚŒd0×ìñý-r€?“9ÐM³žt1Àä\&¾—Ï ë³ëÿåœ]ÁûÙqs ¯ ¿DÇLôr@ËŸÇØa>æ{‹î™v¾w4)à ùÀÔìÙ¹«!a†_Ï›õéþµ™q ›Lr†zNÿžÙÅÀPÔ+Ø·ÀàF’€ó‚-ÞadûP 2¨œ€ðex\Æ‚Kئ\’'àËŽz0gh+  ’#NΗ/IG p@׿\"Á_νañžË ˆ`’Pž«-gåZ‹ºal¯,+‡è$Ñ"ÔüÌÓø9"(De¼"—‚äö»²±û|;m9·Í¯#"ÂÖ©ÆzãÓAº®q_wUâ~KýZ»Ä'1/hÐâ›Û%´]cs^ÌÊE0¹þ2ßy¸Ný«(Þz8Û¼PÔ¹A1†è[ÓÅËÅöó¥JQ&ho¿ØëeVÌÕ,rv×°3¦å èpÂóÇûŸ‡È[G0GPýf™Úfúæ•æöª<ÐùºGoÂÏ-jñçm0o´+¨nº60þRçÞ;ýôujÏkñð‹£ÜpÑmñœþ]Œ©K<;ü¼ýãžL`么4{TžS´üLÁ|øÝ±ï÷ôtÿ˜`{¨–K€‘>ä^¾jê7ûwœ¥éG`>Êc<MFt{ô×v'Ÿ(ú÷ŽÅÉ¡!ÚYi™þÓÀé“Ìå•&ˆ žÕo–`fß:ï€Wmêþó³›üUë2|L×þú@+Ð'©D“Λ¿Þph2»HîN7|`Î_ÃìÇÂG¤'wQhnĨ@I_§iP¸uPÀÍk! `@ÿ˜,P`(ýq‚V³ê€¦`#ßBÓ9ºЛ- $Q…oºÀÀö-RÀä!€¾«õ^畦l¡÷›m…eJ‰ºg±gûD efýxÇ| D×%0Øý<÷É'öääs”8À_`ó[Į́a®1M üá\ãzÛÆ!s @9$=¬Ô„À-öWÖnÍì¢f:\”c¥ô^ÿ¢neéž½ÙõJ¸#-ÿïÞ¦ Ë^É] àO:F÷¥PN72%+vòðã'T* lâo•NV×j_»}4•Ž/Ñ»—ÌDš‡Êê­‰™é%¤çT{‹ø‡}ÙnÙ‘eئaÞ ®Ä>7y˾ë¢tû…Otiõ ‘\]üa༜¾pª©™ç{ bÆŸüÛqÂÇ“á÷Kw_`€9¯Î¼ûóf9\"œŸ˜æ¹(Pö™ÇŒWàíáœ}^H¿6µyy‹6¨‰·´’í×ÿzêz޺ɼs‹‰—ù&úùÝ$@ñöyA)vwVfÿÊÝàݵ#™·¡“‚Ù¦š•ÖÙpwÂÀ)‡@†ìöãþïb{àSB!t4ø‡ÎŠ $\Ÿ›# I£¼t²J€7cÀùo Ðà €rµ„ƒ)² ²L_J 1±$ý¥¾ZKÅE} ?&@”§Bž«uÑL¯edS´¦«Í²h² ƒ’²§Å½?À¥Á©£Y¿®i(b?pôlðm>¼÷Ó º MQúH–¬¿éVÈy×;YÈ×x¹%v(´ Jˆ:ðù>ç°1´ kä§Xnöê:5j§Ÿ»¾ùŸ’JmvkƒÍÿGÏ+1"ç)ì%Ä~OV ÇwTî\7E×u]`á]‡ºs{®b³65Ük8ûÚõ×tAòl LŸŽ¿y#†Õ…Å£=g5Á˜ü麘a_”‡ê³Ç¯±/̯ዞ20'ÿOÿ¥í•ÑüØéëôs!o·Ôbnþ9Ÿ§¹®Ý^4ó´ˆ9àëÍMàå}}²?ý2¼ÉFžßŽr ÀþñÀÄ=÷M äçLSf~ÿ÷“L~øxö3)ί-›îùÛM;TÃ%–_çÛ`¾°Aù% Ÿw'õ$Ï’‚áLwÒý˜/ÓKô>¾!X;>>=°Î]ÌdvÁäCn¦ÚP½þ¤€@¼ -€‚PM1„¸xäÅ̯ /ø¶€–*öTœä/1 @Y €xeÙ(œ¾‘TôоB!vd¨8t@E=Vj¥†¦2C„Ú©I™–!(xZÜü¸¢A×Ìd¬»ß“UxKÚš(£M*p¹.­ìlŠçrÑÁ>ê—ì&¿_6½{FWR¯þ»OKZÿïã¿Ìý¶Ì}·}'LäÈ€A÷ôØ2y²ð§ìW tsçÆÒ%¢@ˆ;”Ⱥ|?¢$ÁU˜—ísQ"yn%n"úÚi”½þJqƈÐ;y¦»‹JcTa¿|â×4ßYlfØK ź³vù˜Còw1w;¡ežÓÖágog’¸T?5=ð{M`ïË„ ùÅËD¹¿5¼ô]ÏUqÿsÚ7ÓLܘ~Oõîä ¨ùÐÕäõÜóF~f¸™ºûQdñ%Õ Ø‘ëö÷u1×´\þ˃0‹/ ðùƒ 3‹Å¶½r‹'ö¡#‡ÞUÌûÃ>ùæ_W¿U÷ž“CF;w×r´ósA窛g–šFPK®¬ÌP‡ôÝW§ª²f\Tæßc ›¢ˆÚåz0ÀEîa$¤~xû‚`Ä÷'g2ôè*ü{@ñ‚Wì–¡•|"€Öbh¥qËL ` Áó³(v©*ìg7¸V P€,ŽC‚° ”:”¤Û£Œ§H  ›!ÚÅ¢ ×VzëΩr¾G^NûÇ&™±]=_kûÎ…Ö©~~O™ßÿL7µXîûóÎö»é[9{^e{UµÄ|qH¬J¹@õˆ\g¥Qäb¯ñú÷´ãc¥pj(C(_/¿nê-òRëùwþ>È[Ü7ïxÿÏÀFË7>Eupö¼§ s؇G-nÖF*´&Q„œî!£b 2,¶‰)Ô&‘KpïéçÇ­"°Í—&IýQ~ò(h~¯Ùýi–ÙùOüœ:ÉâaÏ|ÏT×öùõ¨~ró&@ª‰¡ËÓi„NE.‰°h@ŽNid‰npÞ˜Í9Ëï$d}öv‰õGèħø©Í½ó9õüCrú¸ñºÏÏqÂÏÿ.¨ü¥éÖ¸9 ÔlÓĉ`ÉÑ E}IF”B¹HÐð°Ê?ÿlMïj®Ù¬ô¹Sn-åø¥êγàPÍ+çËýÏJêºnû¯w²©ýXÇõƒâé_²è÷^Ü:,2ź¶p;©ðqÙ)¼ I¬Z«¥L‚•$ ‹½bÈÀÐ =@û¸:mÝžñ8âåÈ=¶}ëÜg­cd¢a®ºjÆI%CN¶ÜñË ¹Ù½žƒ¶öXá÷˜6П‹Ä¥“yÚÿ¬ì!{ùÞ;ýÈWª×¯ìÆÔ•eý}«'<[«sÝqÜmy>ŠLˆs™¢Ž–Š­ ÖrêM % ö´d5Ä”çŠÒRªârÔ3dͤ†·±=2Ö¥’}$­ Ì„gËí™3rÒͶCÈ·Ón¯q|R²ÝîÊ»‡›ÌÌ-º»þÅЊ”Ô‡òZ.Ÿw;oöî†Jz{¾ù6v·ï²0eX~f"eèÙ0{€ï:P‹Ö$î.C»éÌÓ2¸?û·¢ ©È³_r™´:­Š¨ì)Hî¦Qî-UÍy›<ªiÀä+îS#± ]ötS+»èaÊ D€¬¸YÔÌ$%±UA·¥ñ$-"`MC˜¢*u‚ ¡»ÆP@båtŽÒ@$#€Ü¥rˆ± ƒ„lLŒAÉ\ã ÒX-;¡ïHùï?§¤Š„¿«£zVéµ(PZ¬-€@t³5`>›¥ˆA׫3]n×A-ݸt¢sô~­g•Eì–f,ÒºÁB$Øü6æ­efÕÕg.KšIÜó’;s nîÇÑP¦6ggµªFS°¤,Ï¡]²xˆų?2é=kŒÝ³²à‘ççvsç‡Ú2xÚÔ5*;§ÄÕG*¡Ær(f<Œ¨ä¤×K‰döÛÜYži§åL­ ‡BòÜEÎ ‚j櫌Ñ~,QÅ ’÷*>F$±Ïÿif:ø¼›\ îЧ…òî4·Ó‡— ä¼JÈEÈG—†Û¶¦ºðÙ¸Ødî8§ç9ì™þÏÔ/–îJD¯“ DÞÙ;ÎHÛ¢_\@ê®”ÐR³×ÁÓµ³{«S ?H™LÜU(ë°.–õ³U] *( J#ºxÈ$SZ#š˜UÑ+<µÍ” ê¨+nT ÈÀQ Æ`¼’à¬Ë`bh$[a‚ 4`b„ ÈðM„%DÆ0üo¾{Nñ±Ü sŽ—ð`XA0¼òµv ÞŠE„&+ÿ)D¬E½Ù¬D‚¬¥¹ê°ÐÝÚ‘!Õ·K¢_/&@€óhaÍ­ù¾~øŽå&°ù_º’☵:7¼mC”Ü=ñÐÐECõSc›kRk S5¹{.&ZK¯~ƒ}ñýÕ³w\tM¯U oQïu%<•b9©bȃ(±mˆfÈÓeÐLv§k_0~èöÐŒt,Úç¾P•šÙz?¨¾ð˜é9õõÔ4=zùì_æŠ<ü¡é;*œ¤9Eè^G?4¹O(-çŒs$EêÛS±ïÜ;ÌŒçˆO>åÔ™$B·ù.…à÷O•T@Œ3 ”B§ØçCôÄ=†ÞS „NDHÒ‹³"‘¦{€’DWEŸÍ©¤ ‚h$ò%†4ñ¥  $zÖ¸ZFƒ Fv"bAº—!`ø6…V7¤4ÂÀÜIŽ –¼À˜¿ƒ.·XÖ„lÝËOggS† &cWƒÿéÿýÿñÿäÿëÿçÿäÿ¶KDHDžj…„#…ý¹i2ôn±QЍEîNAz0øô\û¹f=ÚV¶Òì §“x*ç48ù4lWVÀ¸¥à·±úe›¯Ó6'©fæ ¤À^(nãˡɗý zÜÛð–ñɾÕô¼ÕX eÔ½3 ¾ùÜ[C7Ì¢ãMïƒ~—KPOC C‰*ü6dòÀ!Z¥1ŠZŸiš<ˆmÊj@ªM²#ÀäêV˜gI‰S ï—Àª§‘šix§ #vªΖ¬»\ïÓ&Ë96°î‚à”í±®.ñûEûðVW…¯kÈÏêváãñùâëî_]ë '¿ ¢bÃ{+º9À¼ÌìžxÙbbÝ4Ô:&øpÑ¿ZZHª¼#¦Š¡Ózá U[õ~cÇ4ý™N~€&évúÌ_œçÉ´{×݈æ2IuUaPf· îag5@BQÑ =¸§ ¬È3Ð2‰Œ+úÌon" ¯Y:ýýœ®M–›I<¢,Ös€6ºH±-"`€îpÍ`"€Α’ ª$ºÄ‚ G&~µ» "…1‡ óÔº0b$@Öƒ P5 "T:¶&càäò㢠0ëShɯ>ZÅXÏdŽ´Nw­V(J\BD3ÍÏ™b¼³>³ÿÒúçÀ³Ož†Õ`Úé „Ãuª³Ö ©èeF”íW0øRˆûaãiR@4®ÔÌ ™ÐüY>R] -*µ@ϼÊðù¶¯Mñö~ñEÛ_Ÿœºb÷©Ã©ôl‹ê š. fà9CÚœêøVkèrãÈÊ9ØÄÁþ(ο*ñ & ÊJÍóCš9‰!šD~Ë€*{YФ€¢™Ž—±ÊÌþxç » ÿëIk®ˆ> “š=f2n}{¬@}×TT-„`Ð „Ř҆½ÏQ@"<3K;Ìá ƒþdaƒàbÀP¢ê-(ñ’BùU‹D@@ €WbE@«€²˜ü pÕ)!S£€ˆ®ÊÀm¬- JeŸN—E,Â` @WJý°ô°š@¤ë€  ¢Ð1xÄà e(9%2xVÑ:Q”ÁÑ­R%ÓñD”‡tïeež_ÙÍ™hÿùoã³@“~3>™'¯ûMÙN¼™yé5¯ÕAyâÇž ¯mÓ¶ØÄ&5](91ÞÃÐ[éZv(¶7 óñyd9&§wô@ö`ãÍzâ½ ä b |0Žogv]Î]ÃÚZéû¶ÿ€2-„òžqþ.%klBgÀ®k¤©$Ðp¶Ì¬wLÝààÑzóW@áØ­ìÎJåä9LÝóDZƒ5# ›¡N5Ó[CLfíx|¸©y÷ª‘|ž™Œ,\¡C§Òöy–kfV¯”æísO’<"÷S˯Eâ@w)TA¶jCo¨ë¤t&]ÒÃÌ|úð[¼\ßi6ŠŒRˆs¦utÑÙâ³l™Q¡5ãwÿcÍO„êºmŸN3½¬×?Í;CÓ“ÝA®9dñMqs¹6i€böC7‡|«gÆ´£dLd6ëÀ ùK×áQN/¥ƒ®°#³–eA=2€#åá”@Ä"n@AÂFQ @„'Ì0f1²ƒ¡bY­ k ¢ ¸ìÅ i²ý*Ù,çCÀPQ ŒRS@9@H ò ( @ƒ~ %TÚ®„¸Q5´N)À4ÆE25¼Àúe7ÍÞx¯µøðù¼û&€ÇÓ€ .¼¤û!F²]€rIæg;ý.ÜÌÝH€>0LÛîÖÆàMÞvØ@VØå‹ëÆÞ—Ü•ÁXiV–@ªû^­@Qó×±§´PBço.ˆí• £aoˆum®²ô …²˜Ñ 9¼D]Û–ì|¡ßëÛéºÍÍÓ{qw_®w˜Ô²;ïO_®].Hö@«èǨ¹Ð´£¦ãåç_>Ìq.ZVoŸ¢WýzèÃõå2Ô+µ°S˜æ%( Û3»æÒDZ’_;ô]ö ]«ëŠáú1[ Ä/4{F4ÀÉ$x —‚WÌR§¿}­z¿d÷žÙqÃïÏZ⬮C7]Wƒ v~ù僑‰ ­)Èdö×s®ôîz!Ža€qÈÌ?«Šî3Îbv ÏCP%14TÊ·`¶;]v#Û#²²Òyæ øü#|yæ‚@ÛUPt $³$”ª ѰôŽŸ70ç•8€!Á/~4² HÀb@Bðl* €)½FX‘öˆS1áEVÖ« K!3 p©]*¾Ù$]NÑk¢djˆO£ ³tˆñP4É’5ÄϹèå‹O¾ü"¾œ_‚+õpÀþru€õD2fÖÑ‘7·ášYʪ$Lð~jV穚1YÏ€8€Þš¸)¡H&û Z=ÛúÆãZ<=pV6Å—ås¹Ó¡DÍ„ÖçP&ÍåÉ—‡w–Ê'oîûÆo„\˜Ì㫚IŒéõHÌéàE¯=—3i¢b^of;*+6-| \Ïæ^]Øôœ!CæÖµX'Ð9˜'ºf[Ÿ_™ÉÉÕqŸÝpWö.$ØYRy',ï/rCÄy ¿yð¥¢+·c‡ÊéL—o½ÏÎ|”tþ¦Ôw³4ÄöÕs$&bIÂóuÙöO ·¯œcN_v²TÎÔZöEÝôtT2‰€eBÌþ’Q+~Éþ§eèÀÅŒ+ˆ:H~H +‡¹!KÀ2Ù\ lþ/hx2ó ãäDNqú…ÏIm\+uÐèó˜êœYa + È+*D tyfâ' Q‚@^¡îÄ€³¢ƒXiŒ(B$@V–NŒÜ_„øcmHÛ@¯T9Û±€ x UÃeH3Ëâ€\°bÑ€%pB€ 'Þµ³²y@„j4Ѝè=ÏÝ/çý\ŒÛÆøØÇó jÿ$0†?,4`y×™sc xh¶;¸[>÷.“µÛl8£™ äWÝ›Ÿ®tÇ÷ã}z+°à_ßо¯M·*ð|AZNÉT?“úê{y/Ú'ê—ðeó½éŸz ¯ÍÏkâ†P$Â~‹µ³Å6¸ú3¹]¤SÝ´÷:-Fg4¥ˆ<ȱ‘œµ½àfatUŠXÞ¶¡e RÌ].:Ñk½}o—Ï‹d¢ÈåÕ¦¹86Hõ¹sà%o¸Ô›¾ÿëæI÷ùR±?’ݺ÷ì?>\@_ZÙ蚇ÖdÓäÝð3ËOžPhÙG¶Óã¸lmkÄ^JO%+Þõ~ºÌ 燤ï¹.ÔÃ{Š÷¹’êN¨&ãòã Èîå@fQÌõa’¡¡ç/p N%ËدŒMd ‡ÌÍT²–ˆþ—"ÙRÙÈN`H(Î0L$ºÍ:ƒ°<©«*€fê0`[üKàD¼Î–$÷E»1`à ’„— ”ŽB†Hú,YX“ˆúD@,#ûzä@‘%¨; ¢ŽÀ8*6JEÂÄ!è:§ÐA"¢îðöøÝ=ð¨~ÃÖ­OÇÙÌuÝçèjˈ†Y™â`fHä©™Èç™O¯8rñÌ‘£Ï¶íõé÷VCT• !˜‰çàæ (2ݘâAþæð<øò^Ë6 ÛçˆO8ªÓþý=?ññ6woñ¥S õÍmšu­Â%†2õNi]CB"HŽ=Þž¾âÓ¸€ä’ˆ*t 7ïš\ÑÎjwZhâþÎ{71vvUÄÿ‰Ûyd‘£W¾‘›;‰m…¨¼2Ý…ò‰˜dfôÈž¿ö¦ûyï¿ì½š).¢.z“;–õÓ ÇóF LÔ•¸»@öLvŽÎ}þE½Ï‡Í³cO}] ž~€) L±} š¸òSY5¸Fö´ð’ògìÉlÔïøbîø@ÅË~7Ä+£ÿüˆÓON}ļúK§63‡¦_S Óƒßenª•“@90¤ñֽ˩¨þ¦Â4|p§#è(D`¤+Á?hµHFè¡h –'þ-M)K¶È¨å4¨hdÍUàcƒ±Ý +< í°%—¨P‰ÌRŨ't›e³L•êÓ\ó@X­îYã¾ ³bpÜfújWWE NƒXbEÖu\ŽÄÏï÷žÊmÿ;s39ú•9þ¶ûÊû=UVš¸¬V½ ˜pf,Ô@ †À6¥¼žÖM_”T+Rµ6Lõ‘ƒŽˆZyø¥QO~kŠ™úù,iÁ/s‰G™©ìR“§©Ãg©Z`À7¦ã×õ>¼‹”SŠÀ]ÁZ³K±Ýñ£§U³*(í•}üS“Åñ—ôušÓ‘E<ÈÜÜÔjÏPêÜ÷¼Vu0ÞJE‚"ûlE1×0¥³]¿®ðr5XìèƒU¡éŠ–Ð9:»Õëóã.våT³ 86r^ KÑfÝÇuOggSÀ¥ &d²erø_egÿÈÿÎÿÅÿÊÿÁÿ³ÿ½ÿÌÿÄF‹âbPÐr©´#킼À¶ˆ’ ®Ü’ÕvCÇTzš[€™qùÂ¥p—õ¥ú’.ïïRÝCô—¢çe©Ì‘2ZÝSÅU‘(µš—ý"ï¶×ýB|6ýsð:H‹ðäfiÆ”WAb‘V¥‚`ØœµÈ&c÷¸8:$‹Í!Ql»ëlQÑ¥/BùðoÝô羟͘ãïÏgÕ´8î }Àóa»p}ûæ±ãfúÖ³¼].±÷‹>ω;e[ïùÞ¼ø_| ,Xh ün&GW:jÁZà@æô©ðZ^ƒ‹ÍøæcAÈÚâi<²»0\OÅ“ëý}¼wŠýWþöü“—Ü}úø'ûëGd_S„ÒÏòpX`.qÉ]ÞHþ_ÊÓ‘¢¨€ï ÛÅÆtè^»„ð€.0Þàv¡ p^Ð3“h#F˜÷ÓBKG„E%ÑÌB"ëð|÷¥Þè†Ã¦Ëz‡UæiB)¦¨¨÷ef7Ú?o¨ ùn8Óš²kÊnæÆXc¹¢ç㇎9›ñ+–4ßzÐû½–ëÛ­D˜`*„éý0½ c,Æ—º"A@ÊåóNxRVM’&‰3ap<’Õgºwºpçn—]»ÇÕ<GO^A'YÕ¦3l_^Ö ÀLT°*ZËÇ]tÿ.Š©ÞŽj6Lg´a~|c.î}Æ1ÉçC¿Ÿîg†)>‘ü¨ôþc.)Ûnª»a®·‹‚†ÒçßÎîgsïâî›óݘ.RMA–bÅ MEþžÃý+ƒÄ1‘ãLŸ?Ó³æÒvæ˜ ÒåßόΥÁû¹Ý’»Öÿˆ= üžé;÷sç45¬X[¡Bè] Hsû°,0ëƒ0h ^ >§÷8 ¡Ó~ªèñe ƒSº0!Öq¢)A+–A `AêWCÅij™Š$<ìsq§Çrs{{ Ù@µøe¢¬AÜ)ðË ˜h5eÔ ìMÆ`Ž8`Í»W#4fÉΠaDóÑœ>#ž5ýšA#Þ€§j_Ýã!:“ý¿›‘ÍIò;8?}ké”;!cü:o]kMZKP¼8ô4 ˆH €tÝt+¢ ðÈÂмDÚÐaBhyS« #Hˆù2 qÅðE* ýˆÄâ•e02ȾœvøËÇadˆè¾þû-Ô#o6hÎÅ&¨á˜E[šê-øèýÉb‰qã,1«iUðŸPÎóg"ó«l‘ŒF;Zóf®Ê°0˜LkÃì›±ªJŠÓšÁúºT¯;©_Õ³{â'ž[G‚Wÿ²Ç„¶±W,çRm¶9l;UÃÈ%ût›u=äfk_a<1nàxeC“øíÍ:™uƒx$®k¡9ŒHüÿå3AЫà%øGò ƒ•Éež‹4¯ ßC,Õ`ƒœ†þ< £®Áû ~ê6§líî¿ÿø©ïlˆMÂïû:OPó§Ò"ѼRæ/ÌnÇÇì2]äæ@£»`fΞ¨ð¦æ¼ÃÛ\ÏÎÏnŸ„*Î>ž‚?þ³Ž¬©Kç×ÏÇ}SyÆè. 4é,7dýmà†¬î¤†1xo¾–à_uïŒkCÍé y Fô»Ü$'ê)Ɖ›ì¼À/dêèß‚怯qµù›.`vïdb• …TGR, ˆÛñbAzõ h! ¶d<À t'€»†’šÐÂ"[€–Ž*º´«a1_(ˆ,€²&Ô’.·+¾àMÉ0HX€2+±qôͼ/Ÿ@®†~û0e a€w‹ÔÁ´³S5ôžyQn[ߣ·|ô5Ù§ˆö4@<•÷Tè¿ùºæù>–¾Þ¼PJ’¢Îìr˜ë¸w’¼Ý¾01èJ>§œ/럟*5ȶ2ØEóuîÊBFû%¾¨Y´á–ùÄÇIÊN•qÚšBȉ,MMwÕmkƒÁÑO?+­LZõâ³Ï}žÄ=|ÕÒÒà g¹LÃQbØ>&È¥ýà7‡«Õä{îÖì–˜Ù˜mØ9¾Ÿ,6SÞþ/1§3ºøxÄDÎëÎìDõ§³î#§-§Þˆßî,=šþPÁÄv ¼€ú½Á6_%w’´™¦üÃ;| b¾NJ5Ýø”ÛÞlGšä*˜"ËÅdô¿í˜Ç-È¡½_†*öî{N#’C°µ)¿›:½YªùFÞÊaCÛËœê2YYË4U•É3Tgñh:ö€k¼õïðÜY]Sã¾(¡ðR™@ìõòãmððZä¯f°ák,×)`L ý>$'Œ0@•eŒ ™’¯`ˤ^=ÚP‡¦´ ‘/à&É–ÐÄ#ñÅ—è89€{”Õmþ – »)6„†Û«Ó%-!´ÏáSî/ïÞè{d<¦Âq¸qžòU<è“hÂÜÆØVmg­Z£L•ðsÉn&Œïí$»«¿GàßÙ¿•Ò¥·CŽ¡ÍóeIÑgIJ ÄËè½DEncf·/0Gí®Dþ)ÏfyNA´ÜnÍj¨6z1¬ÞW†Šë7·´øµÏ’eš^Ò@ ¤j©tFön‘jét!yTÞà%±š×ã°ÄÅÃðòôÎ.8ëÜ!tÏÓvÈÓ†˜Žß“÷|îï-Å~ZDø‡ï?ÎQè«ø©ÍDÕ»ëßóòÎö;{ÿÇd8©ü75%jþùX›oJ¿n’]‡ªÞ·6ÆÔùž_5¨èùýM¨JÏÎúÉ쇖a¦‹ïÅ4;xßå—™ýÛáúír>sæ{ËŽØ;þíDwé]rXì~òüâYŸ÷q èrbœ½ºxчh<<C÷$ÍÀ6G¾ŸñÜicå5 |EÙiW€Ð @˜¡„dŒ^€Àì{¾&lK‡IÐØfn(çxÜKD•ÌaQz¤‚¥€;-þ:vd/“Hpj¥(ådƤð=uÓ“« KN4㩊ÄìÚû6q?äÂcHØF6’Îe;|kÃB+%`l¡B¾Õœæ /'Ïo_ptÃÑÜAÃØtΜ¤Šœ–ŸÌ¦^‰çØká_:¯×]7ÝIâx“¼Û—îP÷BÁ鬯~ì‚XºÚÙÞ&ÅvÙ¤@û¿ hfç¾<äs8 ä4 8¬ÚIÍ],¬”ê‡ßß[ž»ý½Ÿõ½u[,§ŒË>Í€¿•i¨ù-Õß @101) nœ¨Éoý(-©¹¼ËÔEÑsò‡Éâ] #ef¸?Šà²Ûÿoú Â éŸ>ǰEdWEÔ‡bwÎŽ€„žç›æSÓúùUTÝTL Ð5’\âóšÓôá¸÷zN·êŸì²àŽŒ&êßÓ›¾¹ ÙùQÕÓVbJèmoN—7Õ²»ÄÏ!Š™Íþƒ‹@²“¢’üÔ™|2ëͶóƒ¹ñJ*˜¯=ÒùOQôß>L3çUÙ@eòS²IÈ¡ \@d½Ô±œÕ$ èCßÞ¦Ü/š­-ù²ƒ©e~|òðvAlöÌz 6É~ó­œ~cHz3Ižk4D&“m\ <×îó“‚¶3†?ãgM¿;fWY €x€ç2ëb6ì¾[û0–¿® –tc@äÇš@F€€Ë *Ò!0 R}ƒTDD¾ Üy2-+-ð€;ŽpÌ-7 ÌR kY¦84lÅó³È§³¦o?ÊoGÀùЀ WX·±ÎÚÌG[?LX8H@¿ïùŒ†væùî9ÉîþÌàdBàÇO^=çP^o|9÷£âC.Õׯ.ˆ ”(Ä«fÏú¾GI ¹[Öµ®9õm‰´9êÍê|‚ôè3¯ q¤*é˜o—âÀ°:Ô e püǧìoµ€ëzʯ&:£N~ÖDX^˜Öûí’Ú=ìË@}_Ò-ñQ r¦4—ÜS\øûó²ÇåË@sŽ€¸õÏ@ñ/$œÿž™„©<Þž‚ÀýP™ÈØ;iöË"ù•CCÂá½¾«¿ggÿ|!~ŠgÐY»É¤â©f°Öâ ƒ×B1µëŸÜ{1ó:9ûah¶è.dvOþC`‡yr€gßÌQLò›-g;ãݳ²–ÂŒ)t*''oŸwhª&WÑÿÂVÔDwGÿï,4„)`XýzÿioñÇB'ÁðÒ{jO4ʾlú¿jyËËH’¤‹îÉwöK™Þ¾cZàú–˜©«Ïro 3î7š=Ù?23÷8ËA/P÷•YC}©Ê6PC‚O]Çç‹R€yþ;OggS@É &e'U’Y»ÿÔÿ¹ÿ®OKIGa`gÿÅÿÍÿÂÿ²ÿ³`n¶çäÐWBj (ò†*õdÁހ¡€ñèôµƒh?v7*ù|OU«ø½Ç¯ÄÎvÿþñv¡™.ü›w·E@úÚÔg­WÚf*¡Þ§œáúul¬$…òæS1@N©é‚]zŠtýsHãh“Í®àÉ€¿Èزâ’ÖÛ*CöZÄŒ€¹¡#lz=ÉÐ#ˆÔóU 3?ôÆU)öIåÏ`ž*öJëyì,’ŒZ5*iò{ ˜þ€SK ms]ó4^Xgý ¸ìëžYn” › € ôŒóÇ 6  @t£ô %=Œ¯»Yæ%™¾>Bh{ÑМ/‚7Æ¡­½z=-S*¨bþ°yè[Y+iÈäƒ œñà» rôu݆ŽÈDhu»B¨xeËßÌÆË'dÆ>™àȰcP€,¥&¸Vð°z¢| Ê×Ï#4Ð% iVE¹þãežzQ4p,u?+Óžì•á¥ÿpè¦&éSÜ“Ùç-Ërú[WÙNûë/ÍÆ¦?,'¯øzIr,u7]ü­öí/¶Âð~Ñ{¦©*@?öO:ózwþ¿ Ò€|¿ÔÜ"ðù=3¼Ïœ§àuu?ÉLÔņèþ&¸gCÑ Äé0M™AÉí¤¾äP×ù9ÓL%ùgó.îÅTÿöÊû"fŠw¨ÃM’óä@š$¡ªŠ.€‚ô°Œ7óEПK¶_¹ÄÛ±w8²~Øúc¯XÌÖ¾ke,À€À&ö‘€(¸öÊbÉŠ øQº,š*Ä€A`hÂû¹¢ —7 Œâ%DAþøºT@CÀ± a~*6äØ{õ7ŒR(9²™½†…ùðñ¶÷ì'w Ôo·ð”ÇD÷µÌqÂpI£ÛHjk>ªê]ªI€J€¾œ¿ÿí À³çö 6éµÿ 'S@!™x»e$PÆÛDñ­9©aR4|>ÚB(Þ­‚çåŠïðqÏ/=a<‰*W»âàH­è€ºw¯Ûþ€ï"uêj’¦Ë.Bg9åAm¥’;ŸÝnHòc Ï­kÿ™ñ&ñE“‰0ìx.¢IòOÒ•|³vÎññ;?‰Þ‰@º/”qªt¼† ××;ÛNóµþŠüõ¼ ÍÞ±“° †w'ùSÐΩyÂCÍÝEáç͒ΞÁNíz~Moú'þCÕØ®¿clß ¬£ºf§Å|bî¼tùíïãà9ߢÉûùç6=ûBOT»Ðžþm#ÐÍåý{Ë-6íSÍKnÃÁ@ nÑ<ëïùêú_ç“Åw†Ík§†Á›óÁÕèrOtž¿ãâ°øþ-pZŸÆŽDì7BÐp_Ü@p7@‚G ô*ðCT€¿I" öFêôë1ÁMhpYåAK&,Ѝ±ùÿïtè ºx}ÃYà<#߯>GÔÖFU=MK’€ô´™è¬X/½¹ô½ÿè àå™ÚŸóÞôi»ª^Ûë‹‚Õ¢Q…:XuE|)úŸsºÏAºtè?Ù½2»ê¬“ŸyeÆ«f]Õáì±àÓ7XnÌQÅQ ˆ€+…ÔEVÈr¹¶0€º¼ðá¶»’àz”ö\hbm!›‡ú#—ê…e?ê<ü|¿¨êªÝt ðÙ[F³¨j/¯ÍáÞYòÍà1ÍëËGÏÏ‘IÏþ/¢)¯°“ÿ¶àóG°lX:{8pfCŸë™þ/_sorYQ´U`Dç@÷ÈÝu˜ýU™u -nÓ¸fª~笓Y;\bnõz˧óWÑ»øˆ¦{VjÀó¢»Lë¯V×wç×¥}¬óÜuöÐFœ5õ:®Qν*{®XIªcp‚TÝ ÅˆA©Y €vɤá®Âùø]ªÿh°m$8ü?ÎØDa2üø–qÙ6(¬©dØ8öŠ üzå2GŠ»«×&]AÔpü±bã- Ï®¿úå¶Âš ý½®`ܹêR3ï\6å%3â%ïï­¼WȽSb{]öZôíµMêW¹‡®ëÔnA’Ç œ³Tê±Ì¸ 3Cã`U0A½Ÿ˜ÐþÙžé  ±±rÜçò»ô·êÑÕKßÕLàç”çè› X§˜x€E„wU™ç8^êÓ“I»HY:ýâØJ À\ûN|*{ó±”*Òg·Eêí\ãkÏ&~cWüÞî»qª|è՛؂X % £_ wÙ BaÁµg£ZTR;©®nëµÿyÒn  OÛië¤lgÔe®Û8z4÷²zäfUGuñÙ¾Øko¦¯÷nÏœ¨‚mbôz]&)B?¹y=+… d¥_Rýðä-†€üœ1èÃ_÷ŒÌé|êxI/žJÙºßɈ—óyJ(³.—òüV|¾ÜqËõµ8fqoÝ‘ñþßšÞñ‹y¥¬šôå‘ÿ4d$S£ Â,JW7Þ½z_û>S,—níÍ®ÐËÇA-g-ÅߣWÛ¥Ku;æY+û «9¾¼y¶émëÿx¦îYÄUw¥”KS ¬vËpo€;WëæÆ¯µˆ¤V)µ ¨Å¢(ÈÔº¤·/ÀºV™'ñ-tÊêº{Õ®Ú…Ê}ÄvÉ·Çe½ß~ï­‰&_ÜÇñÍNKp8ù° ¹Ü÷ÛóÒô.~>sqa^-¯ÏǾͱ–þÝiRøqŒOzëeуð‰l …v¶ ×…l’èþg‹6«íMó±ŽjéP­id Dd%ŽîüW/ °|Z¿Z×± :|^?騟@W.Ø>C×ël#bb¡¸ÀÅÕ§ž¯<ûZÖ„Qu²H<žo£»žêUÍ^¢³Xk>mó¦Ô†ÃŠ=‘‰ikdE…EU#ÄÂJl!sºŒUã !¦Q,=hÈÊ8 ¦—ž%|§2̺Vz(YéÇÂ0t0Y IGqîÆ1‚ Gvøp”_֫íº§ÌÕ÷7ûÜëõe0¤¸º!ÞØo湃aûÝoá¶ìèÙÌH'{[Ó轞< T‘ë¥9»¿ÓìÐÓ~7Ož ÁT?íªŠ¼/,uç+ÆCt£œ¼¼Žß>›g}˜¡Œ;CEŸ12{¼p,Ê%\œCQi †iö̺Ä„K½ÓPþª\ümró­ÙkJHÖÃ=mŒO£Uh;#0†ÇƒúˆòÑJÇRª¨´A„D2Ù c4—¡ð-#°¤ºlÑ@òmH©ŸA <œÌTùûu‰|WŹòÂ6BÞ¤ð_’Ý ¶ÿü'&\¦z}eéj‹žûMÌa±#kHôr³ÆièqPM ù¹”5Ù vO1™gwIpèbŒ¬I;ºô3±VJ£ÍF]€ß½©K|lMSt`?ý ÛíßM`”eçg®e)ã‡t\?€ö|ËÍ—íð+Ú´Ûò]þnó(#s{ÉÖ KS'ïšJ¸fL€as'µˆàmAØn/5×ÓÇ$ìL! Ó“ —»èöHþ_îç‰wÞ^~Ë,o¶û7ûý9SÎRýTû:ý¨åÝMSg÷2!úÅFºÿñÊ1Z& ÎÀ@a꘢f7Ô§²æa–µ(²îß²¶awü?û>¹Ïôö¥]=ÓP.H@?9ô?×:(º¯•dxùÆ»Åq5}!±ÖLÓSÕ £ÙÿŸøsÛå\‹n׋ rdG %ÞÇ‹\³{’‚¤!‡®e‰>]aA)àSÞ Ãl2«{™N(jŠgÀ²–¿bá¡^ $У †=ÚÙCCÜÿ Üô¯™ Œ^l7ƒ… dA­BÚ•ÝÄÉX`@/ -/ÌÚ°xy `“€€Fï/>]B#]ß[nùÇÌà"±¸ @ÞûíÒî?@ûKmQÃaáR€ÞQû×. ð·×[$­· œpÀk½Oºµf"u-,lÙ²?Wìò™Î7^*axHƒJäéóóÎmÞtšsƒ›‰ö–­»0Ygò’›»¹g~heÝ9€uÒus(®F^(ä(-;¢Ð)½ ¤nÙùžAbÒb×>ìŽKvTUF¨/® ¹Í%myÄÖ§9';ûs_ËÊ`讦aÊÒÉÔ¿'νùù9ÐÜÞ§Õ¯ËB0ÛõsÇm’R&pkmŽy£?3‚.09E•8u1¨1¿‡–:017¿®7³²ÄtÓýŠÌg“ôä @L̯g… ¢_s9“ó< ÚîõÊY*è’›ž¡é_p5gG®ädÝöfe/(×§2J2§€zì¿–}3☆üܵù.ÕÅÆ~³§B «R@l!C*æ–oDÇ÷”¿F=n!‰£DÍJª¤@Àð³)0 »„!ÊëP›Œ&8_·µÛi˜Ç°) ¿ £ ÀmÀm«yå£#”ˆ¹0$ÀÀ>ë85oz [î¬Õ OZ¼LÐ{O|ºÙ¤È"¾œ/0Æ3¯Õgmk¦RÃÜp$ïXò[9 >füÊd€,ø¢¦ ý¥i<×s\§xü­A÷pz^-’'žPäŽîô³8qrQ)áÊÒ-kӈηæfŒ´Æ•dZiHy29ݲXÐI3åýþ„}‘:rRÂß_P Mrö47ùÞ:ÿ?9C)›Wqûy¨ÅÿÀ…Œž8~e'ÄOé{$Ø2Ïyo@4B(úñ!/š(?Ag3@2½+›©ÇÝEÚ÷ç®ûâ¶ö¹+Gã7ÙüÿýèôIN {ÈÓÏÉÒ0@œ•=×ò$=Û‹ÿH^’€W9î—Ïß—Ës÷0]YW“?ûtÎóéVp¾ ¬Hè,Îõ‡³¿]Ù¥¥‚þ~Úód'w0K»g’`ª†~ƒ?þ×PE2ÀS…{Í /û‰•@@„µÚ£q)P…Gwܰë´A!âhfÙ 0hýpZ ÈàÈ aaA}Ži@8æJ „(ŒXP pa žëiin`žµ&íÛ邤ðŽêmº'¾ ƒ‹s¬3¯Ÿ=ªÖW¤U5sIpŠs;º!õŸû·vÎÒÏ Dõ´J ÒÓRÈug1a7ƒÛªQuu#¯žÒ×Ì!“K™\•ON ™Ýæ ™”àd(+k‹ÆþiñFuênI_>HôÎØV-¤©tϰ¯zË4O莶ÿä&Gþm”¬k¤™8‡vqWÓqw —wæAì’Ã:l©Ž4ņ÷ÛÌÄ>l #¿S>„ÞûÇP³‡‡É_ÂÜ¿hòTf}iEftAŸ4u>Óãý‹ÿŸDä;§ù½«qOggSï &f¹ík »ÿ«ÿ¦ÿ®ÿ¦ÿ¦ÿ›ÿ¸IPLL]gddÿyüÌoI¦Éü“Ó{€ÎŽ|Îö[“E6™Ðy'S¼|ÅõCó[ @ÃŽ@ÙMqê×DﺣvT ßBT$MÂÕ¯ö§s÷œÌVÕìRö2=Þ_KôMì Sy Ñá%“! ð|±ˆ¿Œl=|›Ñ$#í:²m‚@k‚AYvTî *]È9eM”.h€֛ÒË`’yJ{ÿûvUTàßY–þb@d€‚C >ûm°µ¹´^™T«¦ev4ôåA€Ëûœ¦W¬Çƒh²— ð`ë˜>éè@½615•!CÜkÑ¿>ÿžÀy·WÐY€î]DÈžèmÒ ŸàY•øëâ5²÷SE©ws@ïÒÎdÝhSà„àäÖ3l€Á"o|ÅCÆXÇÓhÄÜ5ù<¸D†­Æ¢Ås}ܪÄàû™®‚íW¿JRŸñUK§ÀEÄUšÓ —ç»Ö~o’êTÁš1T2:Z.æ#NÁÈ1òïïisœØó{>ª{ç0O»¡sÿùî'J×1PY9‡y³‡­³‰†ÞjþÔt};Ìu˜y0þÿàUúH4ß͆C5ôUi5húúþ|sbO†ìc‚·Àó‹J"Žž±—3#‘|O:D'à®;r3‘ m€–]ŸëÏ}š•o2“‘ðæÜiÇé;¡Â©ø)úno å=›4?™€_¦*à;sõZ[ìýÛ¯p¶¾GZ§Ø±§ä°Qý•~_P ЕwÀßnMÓ®·ê÷±Ä”£¦Éœ|Ë+Pü© í!ÒÉL ~¹È©œ¸|0ÉWÉTÍ雽SçÌ5ÿ¹çOÝž`ÌÌWaÁ<ÏãÿOû²ß^Ðx>$Í©Ó×`¦Û#¨I}¦ù¡"0ÌV¼—}ÿ`.‡·hzf.:M¿å¼ÁÞ¦dŒÄ¯ƒõ0dpÕ×s\}’“IIDçCS‡Qþýa†‰>òÁü%Ë Û‡a·“égCÒ-•†æ~¹M:…æÝ±fØ NÞLUX€…þ[F:ÐÒ¯“b›\àñ’g¢è}l1ÈŠµ I–FaŒœ>ÞGø>@Á«‹‘ (`…µ¾ûåØ><ÄÔf«3y¸8ª?îx }ž¤“u:žlú@C~˜#öd­P(qnëpv× –(‡O!%u`¸=Ë·3 —ŽŸÜŸ öõ ™«7ñ1¸{$«Zü}=ûZyÙâ^RÔ/Oü| Jo¹MÖíÚM|ëuð„Ì£±‹·Ú”’E[ !D׋ä—»_Þ›Ôƒw‚I(§37^Íf9r~¨ß)¡u‡R…¸$¸JOÓE 0 I_'Í1ß)§‰Cö0‡èùüæ+«=NåRó5Å·A0ã>Žä¿ç½79ÃÁg"ª›Š×UHͱü[9ÛMô@O“¿ÿIÂüëì ÃĬÞÀRRØ|vă4YÝüžd çbÓÃb€Ú š‡»kÖšo¾EŸú¡€¦šòÓk%ðn÷œÊ:íN€Há?ûø!¹qžúÙä:³M1S%Qq¢©¯ g’Fr.xà Ç;€Á€ˆËED`‰ôü- ˆœ)@…ï¨à x he`³9¶ `@N ÀšžûE/ó° Rv«]÷t]&à¨wj+Þ¢Õ+± ®Q 1ö©sõKkb" šòn €ZâûÑ1ÏF½Ioäžs,Ù¯o ¡CSó=3àœ¼&XMß#3íf!±!ÜÇ1¼‰“®,IeÆ{våÓë´®ãg».ëEõâÕ|““’ÜFÚTœTn“%U0J¤ã»ñµé:]]Ä5(?ÎìuÝã9Þåg/dçS œ.’q(Râ·î“­sLTý-|S孥߻DF7E&f¿os¾ìó¹øŒlÙ¿¢€ñ.g>MV¿½Ïä“}öžú£žî÷Àv|å:]³gðNàüd £œ§3é¼wB°½ýX$°EI´GMÓ⬕ÿÚŸÜYüÌžàþ¬¶†ÒÞ7 ™¥·ó^nig÷b’¢u@•<ìrÙþÛΡɾ|5ÅtB0`øÒÝÀä,Ô¿àåUò HZ8˜$ˆ…óŒ \ÈÈ ¬:@Üèƒ(dÏQe/Hós|1¼n€c ÈY8¾0žÛeo^é!€L,6ÑqÚý1V 8jÿ`à+À૱Ž=ÏÚd®Š(šN\€£¥ÁêÀuîKc¬ï¤üD‚€$X ã‰ì.z&Ù™É0{êºñYÇÂЄ¿<ƈ†ŽÎkP «v1Á9{+´ l1ÛL‡å`áa ë.Ú®rz!Ð’¸B–tÍZÅГzžsb‘ RR›-MgfõwœªåÔràö½ÿÞoæCày†Þ§3ša©+z4¾;F¥‡æ…Þ‚yÚ¾}¢h€ÃkO÷¾E•WE?û¦«‡é9þ%[ð…¿&¿€u‹íë®j€Lú£ŸÝóö¾˜îån@$Í|º’³÷]dý*(üø³ˆ‰¦è’èMøüÄ«²á$ˆ?l¨ÙMMî¯d2Ý[6ì§xNà01nöÐ%êWrMÏN@ÿþ_sÞòè'¼Õ{i´6 ¥¡6PÉtNrÞarª›MírX¬E`Iû¿Ããºì@‰f@âÆ°¦ Ú?àQ <. |Ô¥°°^ÛMbmžx øÅÎnÊ‘½ð,?òIT<þçjJàJÐ5¿6÷‘¯É¸šÄ¼ySÂ¥gÀÛƒ®ÛæúŒsÁ¹¼I8ît1[¨‚¿­â&«vÊö­£þá 5ŸÈL™4ÔÈŸ™×<²÷°uß®sôæ†Éê­Ý=Ù5y©Í@ Ãù3qHY1é~P”Îò@àêó ÂD§|±%4¹id¢ 8I¤lgTMt*c©¾jèMëM¦ËMmâíÖsØ}„œ‹N»ŸüåÌ]÷ŒNcèyþ3«“^z«òœÚ,7…ùÀô¢oáë8@Àl´>]jÛL|tXxJ‘»ùìnr™ÁY¦šN@¸ûõ”v'³~ï/“ 9¿¿P°kW6„ƒÓøâŸnÝñ®§ önïö奩—§PÌ)x™µ¤ß*èÍ¡ztMvŸ˜5êá¸I”“D4É;÷gFLîßÁž‘Åó÷·÷Weò†©+O½`çjX¶gh :úógåPÕù÷ï\ZæAEÐ »»þýSÔ•ï4m ˜ß>ùÍ‚¨Ë¢/2ê¹®<=œéùžÝÍ®Üßc˜7箄ü»š”;{£—šîÉÄò—”OO¸íõñ¾9ˆÞüeˆŠnØ^i8r½Ý}šéip¬bд¿·­LÊÜ¢«VÃߗعÑJ4GHò€á}MZ½H0€Ä¹Á…Tu8Balû ,1 €|-ûŸÇP¬bqcJeùÃÙW 3©“\Xæ€Ä0WŸ' ÙÅ·YÂ(ôªÊ÷Öà óýÉá»õWgÐv_¹ßéòho¿Î7“bÍÔùì^CU’4hÆVI™ðŸÌh¸—W§ý˜³Nà»ãÈI”guq&?ywý»ó÷ØæþBÇÑ{¶²~¶ßß”ãËž¯¿œBF¨ûÒ¡ü†s÷ϳ™ó¼vyƒY¬ùÕØ|€° ?2 çüsAƒš[]9¶EöDZ·Xøõ»¿öôÿ¤èÃý¬E’.×)?ìüe°­Š/Ä=Üf]Èò‡S­V¯,ö†Ô• ç ®ÑEZNj[Ѽà`‘î—\béŠëëžâ?Çð½6x[`ôz›Þ]ìâ¿}¡Èâiûï “çÄ1Žökfà '4ѿϽþø½®ç®…}¢s¯ýLu uñ¿â!g<û-o÷ÇDú·Ü¤7oWïù¹9øáié?˼ì¹}χ&ÏÖbÙó"Nÿçsòç›´6%P¸<+S6)óëÓÁ“uB&ø/@s’˜1È[~Áµ‚±â2ÜÃY7<6m8->Ä|©~ý|)gÂÐaø^—×p]íødùæ–Ûö¸ñUD‘´$ Gµ_ÿ{úôßûþõÖ¤¸#+­„ô>»¨P 6!§AD®XÎ$Ž›_œhÙµµ’@³s§U×õÝŒo¿“oäcõl/‡ŒÍý’ùë~Í+Ì3ŽÔ?ˆ÷†ƒ²Ì×*®åóTºíõ Ó²ù}ŸÈÃÁ,›fsÌ‹ž‡¡ÂëìBµÖ*9PàÞ4ÿçlÖS^ŽÁ¦|±™#º‹¯Ø³2?~Ʋÿ¸ÉWÕø×_¹Yþ<ìÏ×½þÞsGÎo³Èõ¬í@Ï}^Y.¿7."‡»‘Ï7,25þ~#xºšõˆÁb‚â^*Õ P ½?À5ÝÐmvt´õµúš éjt„ PÂNÂÈ2Ùù`\«9A‹3±îÂlFm=×[ÆÔ€…TGò®ßÐE÷8êC;‰2ûªUoç ³¥%z´äje}^Ä\í¯83°Üw­·¨ÓgëÌO9‡'§øL lÒqiO˜ã¶‚é·xÔž %ܰ¯WщÙ9³khª ò™Ûµ%þ¹÷%‹Ž¯ËÔŽ»jsï3@õÜÿf¨]s¦Ï>;ã—ó9ù|ò0)Nùfgä÷þk3ûyýÐCví{’© ¾£ÙÏÛOgžd34TvxMCôÿæIòLåÛKfÿªöOggS@&g<fÒÿÆÿ¬ÿ°ÿŸÿžÿ©ÿÿ‘ÿ•ÿä~†ô†©Û]—¸š:@ÝÑ@—K’Ù3ñ;ÐÝ“0=DK–@Ög²ƒÁyp‡÷³©S9ÏKfq?oM‡œàüÕ)'94ÙƒJÛÏLØòØ¿¤¦0Ñs¥‡—.vŸœ®ÈÉÜb¶è6È,ƒäaV@ý“7u]4<(o˜Œ‡ì ¿h€ÂÍGÑè2l°°ÌÀªÌ„¤æ­b—üóïý¨S…b>¥ð1—oÀ ý †ëøRƒ™„á¿ÁT¤´b$mD^«íRÔ;›âÞ¯uñBè=óÉÁ§F,æú€¯[c 7m;EÕuÕÔ\~Kî6ƒœœ-çÀþ|@€+àlÒån÷x}ï¥qyÏÛAÐÀ͉ 6š´iïH…I2|>.M2Æ4›Z¾h)nmT'‹¥/æ-«NMpß»¤+QÓ/4Ü9qÓIŵìJ¨¥û|×ï¹y²IÚ]ßESŸ‹ÞV·Ùʪû8#ú%ã¯ôt Û~¿ö~›w?•óÍuS /î[j²ýþŸ­Òýëg`úßì΢Ö¨<÷Î<»÷›~Øãý¶K·òûÚLþéÍæèdîøì uAñý‡‚ngM­¢ýìľ—ý˜”Å_/mªJ/æ=Uµ™e†«É&Kóì :ºwùÌy²Dý]TgQ$ÀìÏé`ùq™»ÚCÒã_r¶}t÷á˜>Ò=o㨞œ§!•`냬™î›B0¾£ß—ÍBÛ0ް€;^਀ Úw„„@ý nöy@¥¥"l~W è`!ÔÆÂ·FEAó×Âãk/°½ŒoÙßK†&¢¶ì²EŽ>c>¬]JÌ^ˆÿÜëêtùÒ>E {¦˜Èkk ÙŽ¼\o‡‹…èó,ƒ9²5÷¾Ñš™©r˜Q€Oç~%2þèm C¢ûʉô–Bm{ûުОyófÞ80Õ‹—MCÔ:õ·ÂÈÆ6Ñ­÷Äg(—5½ª'ÎyÉm/[0k\ÊÊn,ÀêÒ8ÙÞNÕϯMâðUnÄ–Þ“×7?ÔÛO¯¨íg?haÞS”ΟϮÍáÀÎ+ñɾ?ˆ7ý‰9jºßÞhý9'?5Y•UϾ¥®eB÷|ä)³{ÆWEoAB$$„wY}2V‡dSE¿ï»Oþ§=ŸõœýAV]Ú°k¦`ªrú%+y _osYsÅõ`âïUÅh²òããÚ#ÛÆ &êÚ“,ÃŒ¦Éìéð!5MÖÒrÀž;›.rŠÛ©m[äh?kµžBCÇ›c—?™®SóSÀâæ—`‹'ܤ†D’ðr 22¼ $1Ú¥¾Ú%E£ Bh ÆÕ£øÂ´‘Võ º,¢8 sªÀr¸Ü$ œ´nz5…‚ÎE¹E ~«eÌN€ìÛëìL»Œ^ð=‹|ºÏnÞDi<êoåíÄJä´[ äc£Ý*ÊF½™Fh„Q$îÖXw›nÒh³äÄ+Añ\wu:ü­n¼ˆ[Ý8áMRu.Ûcï#»©2Þc.Ë(ßø,O?§HÝ‚4“â(gëq™Ã£!<°Ÿ.HÕõqæ’ê/Ü—¹Õ¡óy·gŽžÔ¼}z6¶ããpL7ba*wÒ“™ç Ù›ÈM…ùF™3ìOïáŸ]ñçÛP0ïô‹@$Ìð°ßÌ3¤~òþœœ&§©§é©kõi‚AÀ— üX¾;üèì¼¼y èb ëJ'0StOÏ̺® Øb&ãuk™HH™‘ñç¦Wíy˜Ì„ˆ½ ^ÁïvÏ„¤“É)ÏÐ#x Q£i áÀ0§€%‰ü¸Îßç—è`­ù3Ÿý2Íð³÷>eðyïC¯§°|r…–3‰^)‚g>µF°úÎ †7í…%¼Ô¤Û‚(u `ÒXF° ^a ÛÍ‚»X*ò[@§Pù-‘TÀ V65¡œÝú’eL€àëéS‰UöQóJ€—ñ¤ Î#ÁÖ1ó¼yt´‰5ÂÕPÕ};ÎÖi’sÿá¼m0“v1˜¢)×M·_ž2]·{^¾…%<‰„o—R2ŸY5 =ì߃†¹·©!|’:¸uOC¡kªa¡—˜ÆÑ\•3€šöœg×[FÌëó¡é}ówšfèêÍ´âÅ|ªÏ— ÝÉ ß,Sä–ƒ~rfúõ’ÛCÒ ~hV)º¯_Gx~Ľ3!•?=E_Q>]Ã1Ð@ÖìCemþ@>çô÷N¾ŒÔéíÖ¬™û—¿öUÍž¾ë úÿw¬é{yÚ™$;™"ùNçz0 1Ï{ÒÀþ÷9 éÜŸ~kj “Á½³ØEÒ*šy„ÉVÕæ_Ýß Ôô†ŠaTUy¹¹òÆ8Ÿ'†ª€ç°S§DQwThH )*¦A³àƒåÂYzl±‚ZÀ+ë˜&É¬Ž Àk´Ñ É*¡<‰$ H:„¬[uÍ@A]•–Å ìP^Óe¾ËÝ]O—€`ì¶´”`×ã—ïoæ8MÔ¿»)hg¾Ï>/Å\Meñ› ;{àØm'‚ý{ßöš" 6Ÿmdú4GOýú±gó²eɆ;w[wËl\­•ÃOAòrðëKï@o4¶~ªi€üLÁ¦óÎ]ÛLþ°}l¹3«ýo²®÷µìâþÊ‹ðS2 O€3<ƒë ;É{À—5· ¦ÚûvùeÅš†l*Ý» pCbÀ¤='ÝäZº”€Êx#à‘W @Úo@‹([  ^ËÍœn¸n³‡i‰ìažÃgÄ»SG!JÀ‹“·'‘ê„Ý,Ù,ÑÚHÔÊ¥½ LJe+$>ÐÝää¤á´Ó[šÌ½è~¼ñòñjÏAOAUg=è´ s2’`›7ÔU˽çûjaDú¶gָݴߥé"< 5)¹|¨{uÛɲœMئH’)x‡îÑïqkžÔU¤Ø™­˜õc>uR—óžýzsØþÀüxë³[ Î7_7¡W¼¨èðÓ⛘~_¿·—áð¶Ÿÿýòk=»©¡éw^ˆžÏ«##{øTïÍBóùz½ñq]þç|qßÙÐ\mܺ妙 –9>èxùø#v»¡¨~ÓQxßµ|p;cvCSÛ@\ù¤!;{Óÿ)j½ïžùö7|öfÝtÂCE˜E±° :Ë`ÀQ°oƒÐ´„6ü€Ò·Û˜¢{è ËÆ7Pìx˜¯ 0:š‹A7@M†žË]Ó’ œ=êœ0œx擟JcGä</‡òöT‰é¦`ërÝóÜ~¬ÂkCXe©¨—€ÞN°×ÙoèùÊ*’ó• õÞHSév±… E¤eÔÒ‘÷/H*Ÿ»®“AlÞ ×£(ÙÙgIÃXÎd°°}_œœHû¼lߣ›€Áû–ø[ê%;^û6µ.©»Þ. o˜Òž·Ë×33Úûï§ýåë¤Úc]ûn,.Íu/™»g a¾µCÐhAèû$x{¤+ް©ŸOwÈËD3Ä0œ*’¿ó,ÞÚ°¿üÊd‡×q%(¶Ä¨ói²þÏîa†÷_˜ÝO0 @ÏI‚*9œXõ‹õƒ o½˜>̾,`†ª‡¹""u>š¾œþûÓMB“ÔÛI3@5pi]C:`Š*Árkݰ¸z¸cî7]¾1{¬ œ¢›:?à8†ôû Þà`€‹R½Û£… €%P0À ¯00+c@ø£4°¡ACH>Ì}ÅÏ»ÙÓMÑá‚ÙÀ‡¢0uB2"=ôŸ[—¼Uˆúµ’u#OVg<¬iŽJ¬Va5Sš U'û+ÈÑèÓÙÑDÉÁÍé¡ ôa¼Z×”Bȱ²‚ÿ±”·Ñè„DÝcKC‘q(£²˜ é.öøA,O0EEóü´ÚÏâïw§Û‹]_N0íCÌ4ùw&Éîð=Ÿ€__%>$Mrõ§!) ¥ëÊc «C’IÖÚ"PÕµtâ‚`ˆ hyܲ‹Q¸Üp|À®^Ìݤ2¦Òd†µw?&² 8j¯@¼8*K„©z`ølÝ„-_“ZÍÌÌj‚$©»®öù8Î’š•1[?^€€úhT“Õ!DÉቯµàð{ENQ_€P[îÈmC¤¾c­~…Îð&ßóžZfâ½av$ÑÅC湑žj•Ÿ_éÏø•Ì« ‘@ßÚ½©O逿{hcÄcùT½‰÷(žÍdÂôÏ{Ï;{/Àç-Û.»úˆúï1b¾qÈÇ*àø?·OÛ©¹»8ß; þþ¾ÿ.š6 ?/#¿/Ó 8ÂâcÈýµ€o~yíž!¢i ¦`ú?@^•ÅOggSÀ6&hÞµ(¸ˆÿ¦O^Va_cW]a[`ÿ¨ÿ®ÿØÿãÿðÿ4GP€——åæ/§.Ú«wís²jš°òTOÞpX0{¯Nà«bz²N½4éR=N 7dñà?®AœšŽï¡C±R³“ FÜ“rê1$€ ˆI@Þ0 } (»  i— ˆ¸\­@ðÐøŠ‘Ù|±J„6«üi/n7Àk¶¥5Cv±Móx‰‹úDÏZI6;æL’ ¯0«ª … ‚H‘§DDÄ´z;ú‡éÜc…íÏuÊ_9zéz9 =?ê GÂ!ë¯þHØ„‰™™Ò˜W/L|'—+«×¯êá 7÷\ Úe©©šsØì?ÅL|\þnRXúšÜ}ÞŸ]þø%/GÊÞ%3¹ÿ‡æ²?ïÃoª;ÞJÝ#€Êwºy¨._ë(zý¼¾óõ'tž®ZN ®ç®+ŸÌÌäg\rrþ~r÷uØC`x9L\>†wgfŸ‰*ŸÃ|ÜÌà“ÌEóæåçPIø°ùËŒl7ŽöÙïˆf€¡Ȇ&ß.êg·Ü¡?5ÑGûo>{7ßP%UÌ—zË}1…ø;gD}³ÖÙ÷ÎÚt3Us˜ŸI*Ø»6܆:½VN}mÒƒƒ"ß‚‚ƒõôZz~Ç4l¾Ì™=UÓÀò¡¡‰#x `€\$´ÀÒä  ¤´êö€im ëz´ß „>’ .QŒ‘„‚ÙdÈYK–ã¾zù$Í¥ñÁ“ \ ÀŸ£ëàÁ¯Üù÷°i©[¢ü5„üŸü|•ŽÞãL׿§wNC_Û¯ã–1㺠,F´ Qé>äjÇ ²Î­ÎS¥*éö" ¹¶òàËgÊV ¼ÖRﺚ¥{3gï˜Ð5/»?NÊVïåUa{½ûQvDvò“éãåáå¡»ßĦ%Ï-=2Ù— K ‰h,Èá!ˆ˜üV«™ìÚ-G™(ñDÓÅß{ãa22É-B€Þý¢ŸQ>*‡ÕBQÞ×cËÂîË'©3˜o—žI»R)íÅáLYMÄc´D’Dj G—ñ¢Ðb§äJ¡G*a)Ôl¥5èØšXèoЗë C0\²ïkÄçJö*¦Ô%Ýêá´Ù£¢\}ÁKÇö¸Ù+öæòÍMQ€‚FC毪óåׄkµØ¯ß{^#¾ cdGÃÇÒoHÖ\¬˜”³š§¢×E­¦€º$7JÊc®w‹–¼Î»§7ONäÇŸqèïj¾‰ù^V]ÓÊûû£.·7Y²Q|T«eZÒte?aï/¦Ç¼>e2·8‚0n¥ Ê0J륰X”xξc¼shùNÖ©¢Z]4#gžÔÇË^T¥®YfÉè­pÎÿ«²OùËjqò-—Êë+¬#©W¨^|8J-'FsóÞ³_vðCœc¥‘ÂÉÐìñ•8`91FÏSÊÇÄJÙkèÍ<éÒ0dŒì¸Ã ÑT逾õRÈ¥æ’ËÒ_Íòïù5D¿}à~ý~òôZ¯èÏÚ°{ì°î¾ïèíÅ(jOPáë¢Þœ¢R³v|‹Z&‚Û[xßùNÑë± ˜=ñç|ÄtQÔ²‰˜@}Ÿe4¯†¦«õüDrL£gD¬é ::‡ä¸{$ZízÏö’É2ìîïK]@n¨¥"M‘ç™lùÞ;h+¡Ö+Fq¡[V@]göR“EƒËûÉTYÍÌ6$Æ”é&Vû•z »@áPŠÃ.W.œÁÓꌣp’#â,`PR‰&FE²¡M㨠ZF %SYQÏýÒ(²@ÄÂV5‰´¢' 2Éî H,‚%dþìAŒ|kx ¨,Hg`»bKBËÓ\í «Îíx Ûµ(¸Çp,@7 ÿHcP~ìÑ ÁÀDW¼­R‚ò2=’D½g’±e‘a ð1±&uΚÞ¬Ùv½™ÇcÙ/?eA”rÎq(sk}CG]QŠg6JPî&RúbSÃW G#~œoüf¯ŸíŽÛ [&âáë”åù'Åëû„Ðjnñûkúê,îlê…ʇoéÚ²f4Y=1Ç(ydŽ- ß9 {Ô[d„Ìé­Žz"/¾sCÊPjSÇ1ˆ­žÈŽÓ1º7 ’¦iæs“¿ØÛO^•(0ÎSèrá®Oz2T©×IªâÚôa›§ÉL—ál= ‚B퉉,*Ù¸÷¤avV“õæÍ]‚šuš`F@`Z%˜EÕ³P`AÔÓ©¬ p$’ACA0îQBg畳d#¹z*ÑJ™8mÜû\bäLÒâÊ6–qHOºz ‰Â)°M Ž…LÇ9ßóIC‚L©Š§ˆˆWF±bCcaµ¬À 9“´•l0X´6¾I€061  èF~ˬåP@ :ð8Ž@@e@ >Ûe(M Èydº\lÊÞÌ@ó‡'be62·É¹ÖÍ??,¾vß"ÁÓHëÚ1Ð'†ü^.ÀmñàZ×)k»-=eî•nFÉ—Úœ|×]÷<ÞÖç˜3ï®ÔŒ¥LJ×<÷Ê(·£PQâIM2^«Â“°XoÌ”ÿ^èëÒÐù •ôÌÏÄ]= n)¹ˆc(Å{_Àú$¥¾—u¥Û<”4 ïWØZ•´éóÌ/ìÙKßÈë¥u³E/¹·ñþŽš·{f®IöÜÌ­nU|@&¸ôoé–µ«+u¥mÚ ª}¹úœ®TÙ†(Æ»àjc%}ÚU=ÑÑ[  ÝA ñxè¾ááNέÎD©»;˜Ì¬ÅŒËÝâè=o2 +PË=½%#îpÍH™•Ì À¨d}˜è…d2¬>9'jâ„ ôZîv–“ŒÉ¦àŽ A8\"šìi«H¼Ô)Eì3óö¢âÐhP%XÇNŒñòèy:O.  €²ÎRV(Ò$™ TY¡:ž ‚do@b¨3tÀb¨èFaˆ b‚°"± YF±ó²Òñ Ð`À:%ÇÞÛ-4¦Iá¼¾_kÕʼ´—kAï!'׿ãú¯ïÅÊ&»µfž=ýÇ#™7®à©Gª½&wØ“í\Ûe¹æ[m]s?S&Ó™c€—Ï'Ýë÷Ì Ù8_?x‘z’ì”ô-û„½Ï¾ÿÔd¾,ÞôÀ%ÎL(|(ïL4«mÉ MdÐãÅÙlƒv™ì‹t”¡µr·­ÄA–•Ò&†r­à ˜KÐ’ʵyêî¢AzjJ×óز`kÆß ›¢3NzN¨S:žÁR2?–}Ò€kçXtªÑÔfðåý×bNù#B_‘Qk˜–nøÓ[?]¹›Qã<Ó“"ÍFÅ6†‘uÔc“¯²¶ó°œËhHKÒEÎÙuÑÒ¤!²7•S‰VVdL{‘2º3ç™…†Ú<½]º&ØFB!”§8Ó7š“uÛI±Êà?ÖN®“WQL«*J4@µj]h àJhT5ì­gÄ œ©,–ɦÖ[ 1ÑÔ.0T¡_‚½Á–y1à16º¥,ë@ ˆV0v ¬AÀ€N+âZç"hµ `P\Qð7œÊíb@`!ÝÀÅ™ ˆõ ;Å~Ü]‹#Ì”x»Ö¨xh—^•"èŽj]cÞÀÇÇ›ÏL Êk-| °åO`‚Û€©ÐÃ~v~€3àÊýj~[“zâ5£S¦c@Ô—Pî'®ÅHMÔnüˆðÆqŽ÷&`züñ™S±— •}Žpé€HÀS•Õ£ÁÇ#%„âÊÏ3µ^ä;&ÎVÅw¥¨®ÿ­õ‹zhA3â…Jš#pç{öæÌOy=ž‹ ×Ê·ð‰ÜfìÂDØ;¡`ÌSt„U?aHˆ¯ »üyálIu'ShÏ$ÒG¥zjØ"j¡ƒnª)?ÇêµOkûì¥3CÙƒ/SÔÆ‡^”ü©å"õÔW',6ÉY4=‘÷D²%y×~ç°Þn3ô»u E·äFïˆdž--Ýà!éûÛup„I()œYZ)×ed€‰0C‘r0«lÅ}ÉQ¨IÕ9u»Þ7ÍYF1… ·Ršš¦ÔصÁ"‹¦Òà…—bÝÒ.IKV, 4€ÖaZŒA¡îîz!±Ã¢š¡„щ*` eÌb3,c)0 Ã$°V]c b”ÛÖ!â°ÙŸ È¡`5hÄ Xš°±`Ë,`„B/Ð9¯7,¬ °ÞëE‰&§½@fÌZ›M¢Ô@¬ 5ÿQ;Á‰À€<\ xŸLû î°-ÖÅ×h'_¸³Í!Û2ß^ç)L’XwCµñÐ5æÎÙGm-í¯$xM ˜þÐwq^AéÓ®.h†é¸ëVÙÏ|)dB ÎÝ ;^'|ɶ/ñ9{uÊ@ £LÉƨŸ¾h¤ú§âó±w>9g2ž[øŽ ™Žœ}H òÀ1 4ñ^töÉV¯Iï4ý¨õä:ž^æò²Ô]õ1S*æm/Z:í3»"V¢ @=³Ì’ ïRuO;jB(yªà³3›g­3D’OggSÀY&iW·RÄüÿïÿÿÿêÿöÿèKPJXgdÿïÿï]¿­:p¢I¯‰Ö ÝåD5”6a®µË`¬i¨r‡‚P!õô„$GT¶Œqø¤ûÜ@Ð&¥KÏ{“ëõ–€BzÝùdk7ùǧøèå.£-£ªawW¥Ö=WVúù‹Ò¥Æû:2´§Ã)õíôªÛ þfWĽq¹AêµîiÓ—Ešx…o ÐØÖªãÞÎ'ð!‰³ ¼£Ññ8—õié ;L_Ž›úVhhÒâ²í™~ßÝ33Ïõ1¸›ð³í¼^bšg¨¦é|‘X_CyƒC>ÅT¥”Ÿµ²¦²ßâÍ åSŒ#uù(“ëC3†¡’çdÕ$ô ;‹[÷J€hÄ4SÔÖ= †Þ˜i†²èŽ(f]¹”Ï%´èRŒ,ÐZðbF¯LÃ@©Õ¶¡©@)œsÄÅ &LÀéZeLjÅPn` PŒÈ‰ i’QAìPu*@Q@Ŷ±®Ph1dÁ  ŠˆQ¸“9LžŽML,³"`ÛVÃ@@Tk,`lÄÕW ËX\Uô` $ (*y0 ë­ ·“`~‚l9óíµÃ:ļ¬hM|G€M€€1¦}ÀƒoÐpÀ&}ŠJ{À‘JO¸€¾‡-Ъ'Hâ ^€úù\E~ù>é|Nw!@ÒõÏ"{g²¸+{ÃÏÛˆç¯ð4 {À«3„䜑—îæÏiZÀ¥~·ÀQ+Z(@P<ÈäÁ(7ŠSþ39EßÚ6ÿ_ @FÕw9cf/RªÐ ¡„±ˆz»ëÍA¼§è;y]Ùú\yí97ÐÆ†VsãÞíµ) ´]&S4_Åù a°ÿÅ}n©X‚dÀ(AÐê={R&9Nœ½õµTȪÍTŽÜ¤'€þÂNNÀÖ½6Kà Xžiã°:Ë€¶æb#ªÐŽHWŠt“ÔéÜ01 1Z ­1Áਈ­Ž7¥» C‚€x†Õëd€jßâY4TÓeD—gìÔÕR˜ÆpòØ:(:ŽD¯¯W yѶXÃM´ÎuëchÀ²V˜â€!pÓa–F©žAÜö™K°#ƒˆ ¬“…  "ˆUÑuh`0ÔX šAôz½™êŠLˆ€•ª`Ë‘ÌAb PÖˆ”6ZŒ©ü#ˆ5€u*ˆ0„€": ºVƒpƒ`»mhLOÁ¼@¯Ø‘hñ™—ª†wTû^óÖ¿<|hó[ ­ëU¼uýé; ì½àÂ_²(¢œq€ÁºŸ»%»Ÿk$7 €åH ½€DÀ©+ej÷ì›g} ÷´ œßëÇWr$áë®°ëùq¤Q+i<`i†JR}¥eÉPvÈ(œø¹¾S^²9èÃÃe2Êåå¥ U†B† Bïƒ79H)JxG•§XÔB££ÃA(;ŸÀç˜'kã   ØŽT•JêÒxML €Ým¯mümêñ }“}õ9UDröLÑ ¶Ò´À4Õp´$¶Œ `äLK/(êi‹jv&„Á!³gº·òVfOã€Rt‡WÑɺöç2)ñræ*3@íbj3“•õpdR×ÀätÌ;Å2SÓ5ãfàµãMàx±]yŒ'µcâc{ îàDH¬õ–(j ¸¹l8AÀ€´}.1ŒâõªÚL ë0%(›o’˜!çÀÀÒ ~Áq¯PÈ+=ô©µ¼Ã*äWQ0`@¬QM Z³Ø€z€È(4(À™÷ ÏЀ• ‹ ®ºöL(ˆ0¾êm\OÏ—ñbP^µ ŒSdÎX™Ta=ÊBà ZÓLàÃøk ˜·AÀ þÎ`ð¹éÅ@NeýN@ßmÀ&ºã kœ‡ìé¬ê·™ß°ÖôyîÈu`j73›lÆ\ŸÖ5__çþ‰x{¿ çU€Ôt™PxÐB—™Þg<Îù Q7HÆ —¬äÙ _>3=BÖ°+≉»·â+×l€ZûY»Áàé2Å‹ï·é:M(Y(ZLù;ïÖr@'vw^ãNÕgĸßeâÐk_ª^äàon*%“[„(±žÓ<> €c‹  €Nqcý»”öÒ½ÂÈnvKM¤CÔó5w¼])Q4‘ÿ&½³ôð§jš¿ ÑwwwlÌÞ¯9ØTðê¢âJº©ÖÅíÁ¦³Z_¼“qæ¦XõÌppSÒsU›Òejo‘AÚë£ Æ6p‰ ë?£Àœ€†x€vvE= ÀbY›#"M©d¶N.Kf^  $U“šhÀh¡A'f@ÏZÇN !P @ ]µ€- ¯°@Ñê(‘ŒVL ,TPP[ªƒ* üÈK‚Ê`À ÁÄBVÉ¥ö”2‰_Vd* ™Z¦L™S~Y ÉóàÙ퇱5f .ºáò¨`ßn 6ñ1ÖËù˜¹_EÎ ˜™í“‰$’™B¯³›;ê|äWl~YsÕðNtÏ7;üFF€ײOPU=Øf2(© ßxSM7>íJÐȺzûZ\ï&¯Q [‰ÆŸ}éó4}Ó{Å]Æá=@/¨Ä¶ˆˆ—ƒ8댕nsÀ0ôߘ(—Öï{|g‘=3üòØU4dÛœgmˆ¡9vF¿¯mÒžä@_´Ê™ Jo‹"è%g_ƒS‚aŽÐ笣¤ãx‰†(_žË`á*ôäp²!ªv"ëóCño{»Õ‚‰É–"D*e2‡Ø9STÂ%€Ñ©3ÀYF´h[-U=¬Ö ûÌc GÑ›ŒB((ŠªiŸa}ìEI@@ìĆõ*ÀFDÕåBìÄÂX\j…ŒË®p{a7™72 b/Þ÷8U$‘?i.SPr ÖÏÌ‚¤j©Õ(Œlb'LwÝZEã˜X”võ ÙŽ€ùU`dVÁŒù&@‡Q ?O®rÉ‚ƒØ+óbòƒW²B— bÉÀ,€1ø`¬jéÅ8"×CMµZén òľš>@è&Â"0^î74œÕéóµI×ïCP§´XIWô2êݾ#W¸gÝ.µ@q"Xð: ž¿æó Üvñ’Y*ÜÇ-–:ØP%]ãDq¢ÆS`Qù×]Ve¹žwÊÛ‚%q N‹Zyv_(C$Xu× Ë©›8k@¶I,hQÅ`Ц/ìzÙ`“ëã ›X*Úµn&ðè$`ÆsÂ[ç9jùj§£©O©DÖV;ôÀÖMçW,Ûr07EÇalwðDÑ•ŠÒåÑ[:fîUÖHZ"¨^,®ÔuÍÆÜb#KZ•¨`7µ1!8çko}öb y©ƒ‚¿oµÁ†›'r×­q årÌ91=ÿù¸›ßòö¥.©}yyÙ=-ŠñÇÞúö¾7›§Â5 ×Iæåü>q|Ó¿5ֹ;[}û½;rU;ÄfЪ$ÎZ jØ’^ Ò Å9U ×0q–?½:6wðǤç1pòÚjG~d/¿K/ÃÜk³/ûŸWÚd¨þЗ§IÙ=•ûãGù̲±ŠñQ/ÛÓñ2ð³Þ”þšˆUsÊ:>Á8mæq$£ø]iïðÙïâ˜|›5 €sº±Î`Ic£mµ¢ÑF¥©´1@†~ddÚå<ò+þ®· 8N ~´ÛµKÿ¾ M}õûÜÍÎäàüÔ/€â‹8÷æÈ¢™âA⬠JWèqfá[+3㟙ùÅó¦q_Zj»ú>Ôô“!ܱúÒÛÏXpDê)óŠ],k¹Ò9n€`‹²}à]}µ Só [ÎP¹ÓTÅœyÓ¹ŽÈ.ÑÕÙ#•ÇÏ#{lôÔäšØ3ã²” 6ãÎáSÊ#[Ï÷ç”iúÒSgÝý¯Œ|]@Užy¬lþPœÝµ]]Ï¥« hfC1sxúÇ~Uïo‹*î>4?•§g}—I±&Î[†^ÍÀ>køgþ[3Û·ÑÁƒ¦Õû?sͯHí(àbn©£¶_ký”™˜I“EÈw^&²„îY&¥+ϼ9M]Ý4 ^øÿÜÏàeŸ²Y4(mb$#€I!­f} -@*ºÁíÁ·D{è“1 <È‘&3PÃÑÐå&/JZ(·å*P…ÇŒhqóµ¼òí977­@ã#PÊ–íB¿-EEA>äøiŽ›o„ZÌùJHO‚>ºÕ €eºµ}€LGs*5q$Ƴ°¶‡ŠÌî(W2>æÿuèàè*Žk \-gà±3ØpŸ@ë–o#¼÷~šiPÕ¨¯ dîÚÅm3.±¡nºqZ¾ì €l“jûa‹÷siC¶)/2àû}¾´íMÊT,+k%ô ;c”ožÃõ˜^…Bßå@ï!4nØË8gn}†N&–ya«é.Èì\Imx¬g! ÛJè ÆûÿSªc‡—ñÑç/Pò7~vVâR©Å¹h¼+|Ù}é™mýÚØà3x}Q{û}ùÜ]p|ÐéÐm‹nÐ7[z<>Ë©‡†þDONdú³>≯¡¸ßïCïÞÕóz 7¬ú(Àò1® ø^± ø}¾8Éc–yš=zod€e’œlhºœ=É—Møwh¦Qæ¹®Ýÿìa~Gã¦#Ó•žfëÞóøx„?¶-‰„ˆl6â,dSøÑ\NÇìè!p»yz­1L÷»Iïzw × dE ÔMn!Ù¥0,dXAMA/é¹:ÂiÑ`ƒá'ú…6pl@^Ý’eè!êWÖ!ƒU'Ác£XÛ›ð Ó,¸G`‘°ûû˵øbY)UÞæ ·Ü †´ÈÐ OggSÀ}&jÿÎÜÈÿàÿéÿßÿÕÿÛÿÅÿ»ÿºÿººÕÅv³8/Ñ7oV© 1ÝtÆK¸ÖÑûüdyj‘âiÄ•Á̶ÿ)lwG¦½¬ù>Ú!jk •"f‹è )ó7to $¨zÝ7ê žÞŸÎ:Ù¯S+\Wk(™.õ€'{Èrã~ÝøÖöu‘Óµ¤:$ŹàMY½ÉÚò–ÇØ1E–­í}ÜRç–žôõ!9Æ›$'•ª”á¦Í;Zi c›« g¶ N6ŒÄ3“ËÇާN¼Eðäžkå½µ{OÑ••> Zšú¼EÆåîBK³³—^QNÈö÷ wÛȾøpýÝÝêEŒÏSMË¢òú9ÝÁM“åeœ•£*qƒ תL´Ð»éž¡'ŸÉ´l(8›}æËlÂ9 â-öçÆ{Ìq¥bÞazf4Ãü˜‰>td0ä73 Yipï~ÂìÿT‘&‡©ìì?=tsÈ0Â÷ªªLž¨†œŠÌ®&ýƒdÚy?óáv~ÿ$宪áqqš.ˆFIÁõ(&Në2 ¢š@/º÷M » (U³Š¨¢Ø%PHIFdüŸÀ÷÷]–8ñýx@ãJsp,,> óÊ*NÔÉJ —{_æ³g€,+²‚bª•„ÆL>Ýó¨û´2N’MnöCÄ¥³¨;ú»‚nÀ€'Èo$ì÷ƒŒ>ÛÜÛȽoÍ|"Ji øzMýµÏ^îCƒß{)ŽÙ¿|Û¼=¬@ xzh˜(Œ îè2¨ÛŒ”œ”ñóU|ð£<9S€­Ä5ž^ÔdÚi©æÈÁzÀ>Yžø0b{Özïê1*-t‡=wÉ[\¶³>r%‰¼EÎÙu¤K* ùë p±nO9ÐQȇ7ÈÙXÙTô?Í|]aß.Pò+ÉÌ-Rµ§Éø®1ÿiþü¯»ó¾%·Kã©OÉ¢$ÙKv^K1…?Uðò¹D¤°&û®MrsQLÑQCWß4@-굋֞i®YjŸ)+ž3Œcôã‚©é>ËdÂL¸£ÎÇ¢>LádãSY¼Pû}ð ñµ9:4SxÄZÏ/¤³8_ÜS» ²¶HnO]9T4=u`*7¹»ø9Ôtn\ŸW×uõ9I7Ó{C}N6dÍŽŸÿ½²a€ä bùg[ß6G Oß‘õ7@é@ ¾8ècGŒ0—§ ºY eþ?“¨r¡‰«,@ÄtK™Õÿw\Nò€l¨¡€ 2^™Å–ig°õ\âû¼Kb–ùi/¹Vº£uìfëøÌ"êÙÀ«uEÍç?¬Ù hÃ8–^µ¯à\Ûh$¾Í…«•FIª‚Þ6ÆÑÐS|}#áäÚwï"â-6ä3 N¿ým‹àð•FÛ˜/þû@©Ô¼þNóFbÈåGÈ^ƒ°h aöî¡s¿-K OÆÂíÞ¿Xи¹rì¨W`Ù8'%*Û“Í­{:lT+—izb/dXý´O p€r÷ªËð¦Ë!Ÿ˜Ç<ýè”bM÷Ì÷Ê¡¨ÖW¼õöÛAw<ÜPÛhS ãËio8t(X&Ûð½@NnÅa~Gc"¸™þ/U_QꦛY¬“Åq?] LŸ}kwå¥ìú=ùH`zŸ^+öè ÝããunØß¯eUÓ&îùïocN稈ômFÚ½é½&@ÓE__Õö™jL@Ãô–W÷ƒé s’Ö@Ç, kî8~/¶€·³PZHÈW59ÝXàsä;ïËå€.nå« v ˆ‚@¥M¸79ǰ«=/Ó¼X©œ„²~åÀI]Ÿ¿~ñ¤Ok ðO €ApÝ~™Jš5áú»¹¤ìÌ*µc:Ì\@®Á÷¼þ´è²Û÷/à@õÇ ¾pFØÆûµ9 \œ€ÇŠ$¶-‹$iV•*òª d±uÖqþ–š™1¿ÚºKŒ }åþ×òõðŒHì&§PJ† ØÏ4•ñ±‰p'Cö6™„,»ýÙ [Kh r¯à!ççì㺲X÷%—θ%ßñÂhý§¬€ôqÄ<÷ðïÞÎjäÝþªŸæÝ ÿDu¦:‹îMM%.& òŽÝò•CéíBIÖr¶åí ³Wha±®¶ƒ©«sí8tÖµeë¼4Z¡ñäå•PÐyÊ#œ@ÞÈ‘ÉbŽí[²Uþ—ßcÖÍ=P3³2]w&ã™sOR©w³‹?,óuþ»î_tçCµ2Ñ)¢ëüß}št3 ÏTÄ2à}R¼ t&Ô<äÝUÛµŸ‰˜¾/-M8@B–¨fXü³Ÿ}òfwë?ž.òû«ú¸uBc¿•ÝFÄšú\ÞÆœ cË25õȪQn\{Á@ªuÒ‘/Y® ˆ½à1¬à€‡à \UÜdw‚}o¡[`yeai§hË\T䪉ø¼J¾5!ŠÙ È¥d>Ú¸™ Àà+À…¾ œŠàXÈ)}ÑÙ˜™'°ÍF|†Pð­yµ … &Çþ6§WgßÞN=§Ÿ?õEî¹=@ €Ž¼ÌPJfN"žz3n PJüŽÓ]J.ä ø $Î`¾Šëís†œ‹*<øÚvýk£Œ-^{¥Õ¢Lh eÝšŠ<¬o—ÏÿÆÝem]këE:ÂÜvÅR ª¹ü±Âp(ºðÅßÎ6‘ê5=¢’Rë¢ùûë<À.ËÕU@PØE†ž¥ë)ÿeÎÌ@œ U®c߿զ•gƒvÏ ×ÍØßBìR=¿øSN#ùçû>ë 1ÅzŸ 6&vz&Z€ ϲôP pv-•ÀÚCnQÐ×¹ŽZS] EÖýq`ëtr¢l^/næÔ²ÞNÜ€`º›ŸW~«x Ç×{º²²ÊoM–Ùõù/ '¿×«kr‡q[¬ÐéÄÑr¸Ïb¢/IÏQA]P5Јùg‰µn "H ÓóB(K# ¨ÀÖ}0H&€L”¬µ¬‘dÇf ÉþBIÄX—!Dˆ(©¥™ÔLñ80È¥LDLV©ÚKm¹{¹”pôÕ­âÿà@Í—µø ðŠHÊ ØÀqº^ ©óìG w-`ݦ9ƒŸ4X´5 •"¡p>‚4?Æzòõñ0?w²~qÜ¥ò¥·!½3 5ïmfö™  Þ LsUÍäÒ«‹3šÁA¨ìOÏð½=ö>÷Sɯ[œ?²ÙGù³VE÷§¶Œàt¢Ýár`'?ó« 2Å"ŸMOï?:d zc'ºÈWæ›Õ{¨ÌšLŠ[ ÓIÞ™ ïÎc ^͘ñwÀ¬ )Hå°+ó4ÜPPPù½¦cŸ‹Š¯3YY5Pp,nóìŒLPÀp+’˜1€€08U–¤bhæ²H¢v@Šåö•`ÀpðÐ$Ã5 1! .>©•A/£õîÅA.5ØÄjkiC,÷ r•ð<‹%¤qÞþ_^@¶`÷™ôœc}x¸ý] ß_…mÛ}ÁK^«)%¹BáHºœ÷6²ÞZÙí9v@L@Àü H!I6œ×[žã!JëÛÕ_J 9\;íõ__*(n÷Ѷ9—r.½9c§Üv£È>ø|ñêÓO) £—=Bº·›:çBovÚåÜmeëWóû p°ä'g›•së,¿aÕŠ®ItÍ÷‡Cžv/65›ˆƒv¥º€j7ß'(ï~ÚFI¨€:ãß/fj˜äê<ÔüâäѶþ¨[KKwâÐå¯]æàÓ—öØgW2â Ô\SÌç‡,¡ŠgË@0O)?#²Ù’љРKSŸÆY.€.wAÑNº<’dö¯ð˜»˜òW]Iº›, §]µI2ï„J(ê³ïo~ÙÜ9IÀpUÖR3sH¸€Áæ›S9ðAɈ. D*X O,`[ dè„Ðà >™5ÁX—½ÊÈUƒK¬±–5ïE<<ï!ÆkÏ‘ÄÊû‹ ðàäå)øàÂMéõÜûœ€Ûí1èCìûæÁ÷ìaª"•X¾šw »â™´½î³¹JÄ&äàô`j×1xÈR¼¿vP ú˜¶te¾µúòWY'{O^U4=w°›íÒrãµ çìÅ}¿é»:-Åë„ÒvôAÛÑj{öiË8þ'€´oˆ&„éù`N6[Y±=œì;f¸õPLøÏ1|²5[ÉÚȈãÿ³Ï*@; Hv(zžÜC“¯ –û÷×ú>Õj5Õe”°ÎP‹¦yŸ—gþ“el<~øá‘³~‘^šõ‰y'Â%€¨zvût°29½–îP£WÈK²LC&Êù®LîÃ$@œÞHHò@qå¦Ú ’œŸ·Š§qúžNÑqÿ—óï¤È"î/§¾þŠe–'ŸÖL¥2*j ðûÎï_¿»{çY¬ƒ²ÉÇè}`9Œ€ aÓd… M‚¥·Ħ§Œ€üP˜† „™ÕáÔ”¹œ‡€\jðY­ä“9ÏË‚\-†çµ¶œw3³hZ?ø|¸Pú¯¯Ž8@cO…CÆ6Vï ÅüÔL•¢©àE ¸¤ãœ¹ö>ûÄ~öªñö‘ èoÀ¬€ ‰<9ðÃø•±îžRtã r‰¯‚Çtþ~´ ¯£¢”Liø¼-ü>@Æè\-Ggã *¨ »­  übÙ÷XŒ²ñq¯‹n2(ÙmeYæNvCÊ“áÀ_ó¾j>…9®'e¶ ¬µÑZ{;A€f.4`Ë0DB3ßhÈߌý”Å•©kg ÎîSˆÈ—;/š‰y¶å¿Ù‚ÄÈz7Ý$‡t1“ïÀôgÄëóéDÒÉÆ>ÝÙT2õÌÏZ@̾˜ G_Iº} áäædÏ|€La€€Ô7PU¦¸¦ ™hOŸÀSg)¿¥Ñp?EÒPpÒão€±³erAnMO’ÉŒƒÂ¢Ž$.O”À&9`0xn³ €u€@Išøˆ€žÆoÒ&<"Ñ ÐiÀÏiNOggS@œ&k“±Å¨ÿ¯Qb^U`XZ^IX``bÿÆÿÚÿÇÿ¼ÿ¿ÿöwåsK¤_|¨ÈÕ™9´f”G²*dAñÖ€{ ŽGèÚ0óð‡h.ðsuÖ:b›ÞœAƒ¯š­0ÇAí$vÊ»ÃÞ»,ú»¾ñ½CúºhͦëòìûPšÓ ãöµªÌH :,oŸ5ç3Gû@C`-?Œ«á·S9ëqê=€Ó@´TRð™¾Kõúq­ ZÕŽ>Ëé6²¿+Mã6‹Oõ§Ð£F"m‚Çñ¦šºÂei‚hñ¯Ç¶7ÂxíüÉ㟟pÆl“½7±ì9§{ âsN*¤ ŠtS¡ïº»ˆ¯Êš™7Jsc·ßýÌ$ õUO²u€òÃcÞ¢íÊtYµqdçBÏôùs™hNeqL  7rØf‹u=@ò?Ã@, Zšø€`ú*àŸgwÖŸ²šÄ$p:“¼rî+ˆî‘¤¹ÇƼ^HmU%pKÀ.w}c™vû«ðYîöÁ,L¸‹àÑ$‘#5]JàLòB€„@ ÛHÀ¡%wx0À€è!.ðå&ÌfÑ=Qêµ–¾»]:¥Ò“®:ø+Å!¥ƒ0òÐæa Jƒ¯(ì&Üfù*.>¦ˆWu^ñÓßf»£ir׳ l,n²–j8ÀMœ^©I{ªtý t\dBu“§gJç S€3Ü!À…¶ˆ€·±Á¨;˜ÏèøÍRÛ6QÆeòDÙ­kiB_Íâc–kÿ8t쮋SQב(Ûq†áj”JEФ–‚ x MóôZQõ¬:ÑF>…Þ¡DoSŸH”žUYoaf‡ t›‡@¾|£õúP öž[±ŽÜ”ðè¼åfû-6îŒêµÌ¬ÛÔ5…§Z®AK± I«¨¨m·-GˆUˆ*V´ ^}‰ 4:‹FÐÃe$®Ÿ †Ý¦›6/_ÿ˜ÁJëaЧqLˆ²ò×ïåD~Õ—zEYšý\ì‡M¦´=¡í|ŠµÍ Ù±m³$a¤@]¡(·Ö"A|B}Õ°¯l½Bðk§TÃ.ˆ9RŽXž ƒœ_Äf§T#Ù+µÇþÕ£•ÕW©ÌÊ}/ßÏ•ã×ÞîócV?ZR}PÞËv_ŽÈ襮!,Àkh³ Šâ*¢ëël|”>ýŽÙUîÙ¸®Bnƒ‰,À6çñqå,däf¡îÞ/õ½®gý¤†ÝsJ¡ýЍ¯fsš¥¾JÄb·yŒRËÎ%"Z$\¡qŒÛ± „  Ñk„Ãá¼NE#ÎÅ16á„bEh¡ˆNip“Üù4Àbzp°¼a…õÓcPCðu_µ/5´W³îro{Q íò¿Wþþ”òνõV?~ºØzDí_$eÕ?1é-ŽªòëY–Žsàñ g‰U˜J1ÖvÈFsžZÆd·²m ƒ~Í÷ÂA>.Mìó÷«íáDÇ,µîµ¨jž¼lýú™…Ž—b&ž/×›ú$¥"3Åkº”Þ/?Œä-Þöx>~ÿ”Ü£è´xzËÅÂb‚Y¢Ëí–@c¡j˜è>•ÚÚSr¢\³|°'¦ŠŒ÷/ââÖ(þèóv[aJ@A0¼Éè@2F}[~é«THhd H½Ù{š‡ãw¸Çá>£žAǹ_kµ¼ß« jE5”•qðu2Ó?qûøb~l¤Ù»#Ñœ ¾“† î}_~¯)Š»KÉô€Œ|§½j?ÞÕZ*x¹f¸»¥Xw¸×Yúä¸N'(gg¦ ²ªè\"ge¦HìÆ®öØosSòµáe ¡r“3ÌH†¤’[o©Þ^Í‚Ï:´â)wsðU*¤ª¦óf^ª‹¥“ýVÝ$‹< PÝêë͉ÕÑûYxh€ÉIZ~ ÕùÐÚ¥X<Œ%Å‚Øï†8ff¶l˜úYPÌ­¾Î/ýDšUgÜ‘»Ñ*@ôô³ Ž;Ó[Ë9ªßÁ8køÞ®?³ze; ž£?_Ô{1¾ë £ù1”N³T¶ÏAð8ëf(ÍÝÛ½åÙJ‚ ¡ørÿ:ì2[]@@ËÓÍé¼oöˆHÕ¸)1·I™ ~7][š bFšð«@µý[‹»ãQ2P“Ù¦ú]”ü¼ \5ˤq“ÉÄì!7ÛšzÝjŽ?s× Íþ©v›‘;½ï&MÞ?Õ½»`'}÷Û9 ‹“@N{g†d.ëùé,9§)H¿Ú0cÞ]ÅÆïé:ê4$‘mÞ t¿4è ^q½Lws¿ãåè l¥§éÍöspîUôÌ@W14%ÑAÒÀ¤©Ì|ãâ³*Ž|ÊÛ}¿3Õ_’«=è À›¼ ôº\Ä`³€YÖÐyþ6ˆJ@±Œš±!JÜŠEx1ÖBIá„§%Ùl ÛÐnekým Fø|Lc:ƒÈåÕ¶q andµùsÄãK¸m_6%?fÀ€TkYe„ ž¼m²A÷›@AN¯˜Û\„ð—tÉ¢÷œe‚ì‘®ÀGŒ7Þ (/™!v‡ñuÓiœ Âû6F}×u݆•–®…ª D«ÏYI³ÔÛÁ] [oaïxד0¼¶fIó½÷0­z Çåè¯Z«ö›mÛÒëó8š4ÛÞ- Ò½ö\öø—ÅŸh„¶Ùþ;ä37÷n óåé)?¼»•ŽÖ¢È=÷Ï›>>¬Ì_ØU‡+EáDlŠž#¿ìþ‰*ÐOGNAæ´Mâ~ìÏ ÜvâÓdBNòû™kç]Údí¢™àTRÑ)v‰ÙË\uº :æW¡)E^µvÛï¯ÓlìÌžäþNÝ /Óm±sÙdWNUJpýÐÍÎéì8s ê‹MWDk¾³Àf`¦Û“ôLkÁÇù*CÆÀ¥]Ul¯;¿ŠÌã×eB"n‚d8JùµÅ¹ºGÑéaÒ }`ŠˆúÌ$$~œm@p Q€^ ‡ddu!H€°b%RÁ€˜ŸHk•‡’ta*½ˆ®Éßu àçðok6­íZ³P©´+YÞb™ª¿Uû0-v½3³;WUøÖ¿×xûèÎF¥°ÙŒ›Zzdz5¬ø+üÏÎÚrsrå@4wyŒËRb6U[ôåú™c-¹ÄEW²¸gÀ骙Úû÷Aâp( eOR˜N_ÿÅ|¼EåÑj}t9ý‘WGF&ÍÒ\†-Kð >—Kþ|§:÷÷s‡!Z,c¹k÷÷_åB´{GÝíðP=š¯‚ÛìHß“ÔÍ:3ú˜Ø·=#‚¿wNCÌŸ3UPÌ—•JÄê8UB_ ¦DGHÆ I„4+¤oq4y%Ç7¦QÌÆ 5ÑL€ùÚ³î®uY£pß4ªÉºÑ 1g~»ÕtMk¢ý›m¬¥T «\æ}§Âú´XýX¯“­È-Ó~òåµüWÚ 9ºÅ‡£G ‹ëÃË¿ì $é«öuvŒqo#•V5"M’$WC?§¥:ã%ã9oò3ñžî2!#ƒ£Ù]oÜ› Ã3öH¼ž®_; ÂN?…ntûªaqtÒU<ˆ+êÉÀXð½éW5¥Âð`3ù™\ £VîÞóõAþuJݵ}nB=öÇ{|Äï®™G2¹A_¹þr÷Üz8x(“Œãé9Ýg®!ýYx‹^Þ%/žu~ûÔUqYž&eÍ'€Îß';këRïßòõî½NÒé¨wùÜYЕ5PÓé:þLûäáÂKEÃ2LϼÇfŠy¸6u€Aö_çmš¦·ä\N”ÕL1=AyÉý‹½Ubÿ„QÁ¦‹ E|ЊÞÌ[5S¸u±½ÅG˜‘ÙI¾¶a±–èýÁÈ@'0ô[§‘jƒÉÉ ¶Á8*,šCšA*KˆÖ—Ò„@)`ÊÒÄù˜18 @€ÇßÀ Ð+Ba†~¥{ÿ¼hj¯,KèœñÍ•—}  @€JÅË´v‡›râ["R, Ò‡¦÷vEwï Kn=o‡¡îÜ ½pk'5ƒgø€ÌÏ`hɲ 27­V¿‰0€…? ´Q„7  `€ûAä ` ^¾ìa€´¦¹ýú›’$uÜíîŒriŒ ³k-lMD“ˆbx–ÅÜ“ÕdjÀ›b<°Ìf"Ÿ–,àLö༱ňðã ¼†*-c …NÇÕ® ŸÓ¯?÷àrâó•ÚR¯åÄP{.×£¨ac¤æÏëç  åèôøÓ»ìU àñÞ¿Í%4F/˜üßìÈ\Ió¸é€ªJ7{@­òý‰&5_?ür2þ2·Lu‘áéé4pãáL«,½äéÅí休`P^Jy¢ˆ’ÿnÏÀöÍÛcõ'ßÌ,X Ëò鬚®J*«QÁû°ÅÇëÏ×Ë=ð.Q`¼˜ƒ°ËÎt}å¿ÍTòô’ÜÍÀù=¿Þ¨ê.zqÎâ\ÏÃï—)2Eü½ª¦ }ÞÖ?€ôÿÁöŠnêÐtÓY1ƒ‚ç8+ŒëtÿS•ïOâŸH&ÚßLǹ±>|¿ÕÛw3?3ãIh3}Í,È:ˆ *¸ÌÉ¥žsulvá¶ÝÅÕ•ÿ;W÷5î>ƲK‰QÆ!Ìc>*õ€X8áç *O €ùSâ¦Eh…ÜÀ¼‚2´Ào>ÌܙЌÁíÖÓkº0€£V pÛ†Áx?k8J'$€´û ð¨íÏŸåêòµ¦¬ÔNté %µ£­wДþêzö`‡Žøøâ3­2YÚY1YøösL·gîËó®Ž'êý;ñÔ`‚ ³ëwžçX ŸÃ¹µ¹Æ åS$W=Ç­ux×bÈBM1Ù€ƒ;Ïîøa•g÷¹b&`—kêÑ>íf’™ÓÏúà™5ÿ UÅ4®`Å$}ÒCøƒ@·Ï&€ Dó€Ìmæ–j0€Ú¬Ó·¸R/ =Ã3¦²,í1»àÒÇ9H»`Ïýp ±f£¾#´”ät l8 ì˜ `uñ*J—Wûg HîúC±¬ÊnÂ÷ÈW»(À— ºñÁÌ—d·êa”%—më÷Æ?FÕ2· ªˆ(’üV@ñ<æZÐÔÜTïŒñ«{åÿjÑVl÷ãQž.Þª|E¾—:‡Y:7}°Õ ÈßY±|ëä˜ì Go$§ìÙ.zá´ã{þ¶˜¯§6S-†.v˜ê7*ÿÉë¡>äÀî”' Jΰ>ÿú/—ŸäÞÕÎŒaö·½M€\æ^¼æã‰É=¦<=À€{øÐÃÛÈ{—Póâ[·ã˜º4±½4$@¾Ð§ñ׈ú¥ü”=̯V覨aZ÷FE¹9 [ˆ¿÷]¦;iêÉCïð›dr?åGÃÉtŽÐãÉÆ(ž'ÝL7Ð$À0‡œ§À‰“m\¬ãxÚ+Ï÷;ÛîLìgh8À£ 04;ÍXQP1Ié%0Hð^sÛ5â^‰£!™†`Kñ¥ð¸¶NÍá €ÛWtÄÁBÎŽ 8ƒ—m=kÍMµ§Ka @\-ÄÈ ä|9Ôâov”\Z}8ï¡¡ ‹c»ïjòDïÏ÷² 8Ï j݇‰—émø’ñFê)ô´¯Ï³õDź6ørqaœd´Uh!CˆåýTZÙá6M»}Ç>áû­Pl£LTjçïÔR2zÅéËH¦dÈ+9c¦˜Gw)‡èÐÙ2[)ÇäXÌV¹ÑTóϺþüï:—ȆŽnœÀ-Ž$ñþ¦ý$丷åÎÃô/æñyG#&…:©šÏ¸ äl®g O³M£\LMfÛU“Íû½‚Û×ü‡J¨ü3 ¥:}íŸ Ô »ÈÖô žÒ!¯gÝlíb.ÿ |\qký—Nù·ËÞ|~CÓ;‘ !3¡ýš²÷m¾2; §¦˜¡{#þïðMĘ‘Þ2|ÇýîÛßÛÞÃŽóÛïäýØwù s†¤A1F˜Ÿ4 謗×ôõ`!ž„]ò`€X4²Xè·J– (t ´zµ'ЗÑcçf©7ž&•?ѱxJ– ~¿î¾{¹EI1Ëo™.N¾ÇþÇOtzò{8_œLÝï®üù÷×… ¢IèmO±¨•+¯¯ÔjñžŽ¾[Á9c±Ú“‘û”-hÔãY÷ña’F¶™À¾5ûZ²½¾MTí[è¿2m¿.é9ñÌAi´ŸŽ’äP­=sÖ´K$'»bàt€ Ô‚Ù3}8c~˜›FÍfu¯ ¬©DjΧ§\ÜÙf€Uw¾í¹Ðß!õˉ¼0Lýá0úŠêœ\踳g“‹ò!Ÿ,³“SB`Å Š>,䊩wP7‚x¯U›ÕÞ@¸ô'ÌM/@éf:Ày#ˆn…NØüŠÉ3à¥æÔÕJÝê_£Œª§?åŠ/@ZV@oJûó›ßòøÕŽüá$øÇc¡w™|/½ÕÑ;rf{à»s˜³f¾®Z»˜‹ú"ºèÔrñ3PYþá£c£žwÞ²*ï2Æ ¬hpÍ.à‰M#^¿51·–ùà¿!ç3_âœKÜyÔD]ÅrpæÌïÕDOõ¬ýcŽtÖ?_ÄZÑgÅô³ îªÕªû0ÊyVÓOÉíõqd.§ü¯…ajî"Ææ,Ûkécÿù·œx½ÎSöw/ÇÝçzÿD{]Þ—\-ñnf7ÃÅÿªðj©„–ƒ?t‘žíÛÖç×í/Ì‚Á*aˆÈöu‹»Ý`uÿ ÀÍ!€3ÈSQT|ô1ü¸Þ¼m ¯Gꮪ<*ZuÞÑϽåÐ[fo%§jU æóÍÇO¹òœŸã}MpЇ½+¶+¥H}Yöÿ¢ÞpEÌréÅŽó0IÞÖ^…M±G7,Ï•Ëû{´^c:Áe<ó™µÔû›_¬µ*ï»ÛƒGbŸ˜çùXÃÜ*Îí¾ã³ï¿VšÁ=™*®eÜÖiAḭ“j• ì’‘ ¬,< ÖÝ¥RõÝ‘ ÷tiUP Ð廲"~ò6? þm¹ÕÓùØyª9×Óqy}²4É5’]ÖV¢Çûæýu—©Ö‰Ö%æ{Ž!àÇQÅ^ô"´f½›£è›Ü*= p7,î'Õß½'gJÆÛØîVʯÏíƒíÊà1©æÑµ¾£Ë‚ÊFú ŒŒ©›Þï¼:SpºÁÛÑ5Üj½xþX–·WñÕ ,ïáæßÿyÌbf3ÊÐ0Æ·ûq¼uq/±ó~K;3$™äÞðCYÏÍßUQôá¿ÖWÏ÷Ú­€/!@¬F V ½Ùai´ø4PA‡å±îñýçäqKˆùõ憸òvwÔ¹ ÙÄë%T²Ïïé󿜳BoÝV&ñÉÌ)Ë!FF7\&äzéC¢Jù†ËÎV}×®¡pã©'&—Ì™ÅR€û7Ÿ·¯s2ýÀŽ|ò¨™Êp­-ˆ,ÏNsÚ» k_CùZ \V4÷ÏäfÑ…-Hù>î2תß$~¶|Áôj:—\"À‘á3+wèSLâüLåògOÿ©G™ÚSª6G~µÒN³Úðä¶} wý&ÿɈŒ› ¼z=OF²ÄÄ7½œ:{n61À©-¸œ Âë?Ÿ/yV”­w:ßÊ'¬üÛ¼g"º>Hp;úL[gÃÚ Ä#ðê@-€hô£„fý\Ò›°Ìœ–»Ù•ª¼ ?@¯UvåBàIxá–×;W·æ~wæžÌfýÓ¡óŽú¸•¹ŽK²èdúés–š×÷"<¢]“Ì8óÊ÷2Ã?<R9KùcA¤JéÙ3) SSK:â©´`32™*¸Ã7|r™Ú¹Uƒá\ΰú£O‡ŸšíWý}ø–íãÌã=¹·Sò~m}Þ‡­X7ãnÕõн¶vTvTX!ËHAñ"„ÅÄnÑÙÐTÕˬsµô–Ò´a}€nE4×cÀžïijŠ·H—yò[?ÏÏâÓb*ãõ ·ÛëU-†Õ$f]IuÐ{)¼äe…m¦FTžVb\±²thÅ ¤V…Ó~€`â\¬UÿdCUÒÝýøv»–djr #à éè~Ïõm‘òå³rÙã½Ô¡äïãðÛßÿdåp+¿6ÃúW‡äR}Ë‘÷‚§VǽùÃØ³®ax߬¬~éÕÖ<àt¯Yqe¶ T¹—ým%P|ÃxÅuÏš»ˆíX·ëÿÝõáí7«¯ÆÍ²”ýAuæOü]®=–«¹©u葸)‹žëZBaNHèmY‰—OK1¶ÜJ c†Pà ÄJE˶JÉ “§¶2Òjé(v>§š”q û£[Ÿm¯ŸýQYzÿÜ<Ïÿþ½¹V‹&þý Á¡¨<}Äë13ÓÓÇã‚‚¾~]Á…,¾Hñ¤ø%òé#¸HòÜN¥ÕÍP Ü0ŠÀD=OmÍnº¼(·c¿<¹eÍâR³ž¹s4d³¸~ëç7aêñ÷¡}}¿~÷±Ý…Ÿ¶_š9øãñÑR}\ª¬Ûº^Î+û˜†•ýæíàƒ»üóû KÒ:‹Å¦ Ä”Ѐ¶”DïhªÐþ[²Ø¶Üo£Õ¶£!r])­­I (2„‰“@ºÄÓ9‘wÛmÜÅdܳ2jÓ]¾ª á󼛘“6ï6î¦Úõw‰LëMwb¯cxú7ëîðÖQ=Á¡,Ž~”QúÊ|ãV‡kH9P2Ôíº’ЧÔn–ŒFr¦ väKUЙnêá1”Åeûz‰}ÚI>HtÎ`¿-ŸpQäÝ/™__±ÿž£¦q´¢Èƒ~ë.&½ì¡H‘@Ž7)ŠËwd¶j¦OAÖ.gõÛeÁ˜žw¨ 0C™„òùÔÀ dGJj-&Ê>îúâë·OggSÀç&myÄ‹ùÅÿ¨ÿ£ÿ©ÿªÿ‘ÿƒÿ…ÿ|ÿ…ÿ‰ù¤X¢ÈÁJ¡8Ìœq§²'Ö’Fh¼÷dk¿]i ¦ð0äM·®øyLCì•RÄ>{$4uø½–Lœl¯ÝL¡jÑÛ½Lø<VÀ äBS3 MV±,8Ú7¸(ö•4´°§ p ˜t«)È·ì ”£¶WH¯Àðì¿}‘è(]ZT¡¥Ìxbã0`ÑöbÁe# D§Ñ§¢ýø¼…å«\¤ñƒz0!òÖÄQ¥LÛz…À@%¸ž»Õ´úËDíïUË¢n€îÃü±O ¹†Þ‹ÌÙžeñ©̇ä!j‚>æWb#Á¾Ž1Ç«Yg+2u©0 -”ÕåPNkc›¤æ·?©þrŠíýš{'o=%éÇÓäVÿLÏéLØx4–Ѥ)h„k_ˆ¶ñnUÝ.0,/Û åêâT3ÄÍd(zâýiHF¶”ìYÕßÜÏ0¤õå@ÐîRȺ¯zŸXn¹  Dn1Íií_5J™f°¤ LýáËÿí€ß444hšž¬®Ç˜cìYI¥¯Ê™† ?ÙkÉšgh÷Þ^q]Éͬ±ŸÓzUé]2n€h²ÄÒ…U9¹viÇ4»Àµ+[[÷f\¼E‡”`Š5eÆ.è7Zk )D ¦óµ¦+Úš’IA,»Þu¹ÁÇsŒ<ª;CƒÓ d§#÷”ö¹¨¹e@“ÃS=$_¬cÚ´ôfž \J¾pƒ:;™Á@PÈaÉô cŒWÓ(h|† b ïv‘8t rTñlÀB”4AZ"X4_ÐH¬r Ž  ðýZ}œ^èŽjoRÖ·6Ý}&mÖj׬^dT¨ «JqeÎéå.ÉÂ.l S÷± ˜ùšÈûé—"޹£Ïëfަuns3Œ}½æAÕš=À”ñFìÀûx<à‰$PÔâ±t¢û³oß̈L0ëÖJ·[Oü÷1,[;*«(Ò 4ƒ–TÔöÃ<ʯÛ†^€ì=ËZƒ{5×ÉSÐdpôÎu\ÝU9 ÓÉö‚~ ¾ïøúp`éfþ×l?=“u™ Ð ÙLÔ,rš,$¨æi*çÌå7 û06ŽŸÕ™ÿHŠWð±ñÕu'ã>ìfH×[¡‚„^»ÇOÑC7$„èÓ[ÎöÒ1W37, ˜æK¹+y²ßìuW©é"ÎDÓ©1K}äÚû[n¸Û›nm~pqü/2Åq^âåâ€en¾s‰YƒC Âî¬ WVåþ @ î4­úö‰ß’úmnD`΀Î*Ъ Ý0GnsÀHº±ÀÖ…ÀÉàÂUBJt‰`¾«p·d˜v¯Í „àûp”ò Œ²›ËÍ,ˇ·{¶y´È»³×n¡7 ödŽ5ÚÖ·Öuµ!@b«gºº>ŽwpgÛòßæºÝÊùºšóÜ—ö¹tÛg·5§çÕžÉÄÕt[¶í'º¤AIB=‡ éz^=ЛúÇ÷¯¨SG¦È?Ž fçâ‡CA¿f"è%5Eëá_È•™;†E…&;àšÔðÛ³Ù¸ÌW “ [<~¼Ã²£¢¹€ðÂõÙgQÞ¦éÚz @“fÖŸ’©=ëž_›û>5 ü$2 dõ›ùŠ»ª2¹j—zh ˜Êþ^P´à`*á_ï (uŠ|+΄=§(Ñäÿ›£.šÊ*8hmšI  nˆßùÎÛs¸ï†€ÜC&³ðžä ï©¥¸·^zS=Ÿ6ZcNjŸ« ”µ¶ º øAjŸ‡ftòÕ™,ï¡ Øü1p­¸À"±Ü êò¶@ÿ¡?gnÊs RR’"=(½2ˆ)sÍK¹ýèàèq0Ãf•Œ8¯±@`Y·a… À`þ»­ì Lv…àÖÙ"@ňýo*êªÐ×7?ÿß~h ·AŸc'À‡À6óumE–ÖÚhTà¼Éѧï2=13hïþÛüîýårÅÁ ÍçëPd°±Ùw¶•¯Ä›‚Y•IãwrÓ«suéÃøå3E dÓ#¼\E.W¨¸éíÍ÷–A$ê”óõÿl¹OÏ3xW ‰f¬+¦a;†ºì÷g'#z€-áߣf÷³š©Ü)˜X°„‰!­t®A»`³q¢Ã·ùÉòç†e‚€æêÈ™®ú¡¢Ï™]U¾• @Üêëÿ€d’=½•w6«ýõg{‹)‚·:ƒmz‰ów®û¸yfÓwv_=8ùëI¢áˆx3ìxÈ v‘·J¹õþÆe ­)°µÊrXÀ<6¾wöe³,̵ hˆÉ·‘.H€þË­âô Î _»Ü¦XÞÌçÞNœÃJ<Ôåð.*N’l¹h.G-‹È†…ª["% m‡ú}†ÿµi&¶§“}ß'ñ /r_À­¿1R¤÷r3´mÎ_q÷ÛËøú4bÑU¬DU¤òºÊÝñg]DÏŒü§_C¼qf6'{ýÿ§SKá‘rìßÝÜ ô–§åñNæFfgÏo ÙÌÜ/àƒ_Úœ{Ç]üßbëÍ—ËÛ"™€@vôåù%Þ»/çï{¦†'zéórí|êð«ÀÇïØû2ßy†7 L‚3rÍðMÚ=ÌÍÝ™³ìrö¾~úØZ=@ÄTqfr† .i~“QÆÍ…Øï·žîý&é-#ßí0@V_9÷ývºý‰k©}4Ó#Ç&ûøÀO]'!÷-8ÉþÕÞçí¬ËYEv™ÍkÞ;°ÜÝÃ.‹ì&QÉ»¾T‘1…(”8ÜŠ+÷"Q“HÙBaSI"Že \hô @è^6Æ @@ékf_òvŽ(@e8í+~Ìý#å—€Ülb—ÖyÜ@0ÕŸ@ðYÂíIÛ̼ÿndîfˆ…4ºÃÜ}’ oF¨)S""€Èí·Oîiâ­MÍ&ëTl…<ά9=õ;ÎÏ­½áµ†åe¯…‘ÎÇûÈ{!$šh‰³áDÖ<-ì•=éBŠp2yêc,÷Ÿ—vge ¿>ö­‡éˆÌÌÞÌ*Mk­ º>Œw×MÔÝDÞÌ:Å Ýt™-×±¸ïœÿ'Á0ÝIý3J÷5;á12Ä<_ê×Çç.½ xÀ,ÛãCI¶¶ÌTYÂÅñÞŸ½­soÎÕ½&Äþ±å®OÈ€œ™^WvQ=:Yëiª 𡀉ߋG}˜ž.ºº?•n±É·ÓsŽ#‡¡q^#ç3Ó t¸®j²‹ÚU «ÇÖ©WŽïC’G$ëUÄL±¿îÇ€eíÿ¸ÜºùÂ[0’ Îcµ‘ AèRH§Ø8Œô%躔´} QàŸšà(¨ ÞË­æçÒð›íú¸Lõžêl·pÛ†Aá8à{˜I’GÞjfÌ”ˆH €L¦ï‡OÎ'©k^× N\Àz=$z»QåK•8Œú.߿֟µ6gGÑåc-‡ˆ-(—ãx-¥Ù"ØÒX­t¶o}z”ÄI‚ÿ®Qe4¬dÃàwuûùS¿EƳ·Ïýø–}þû¼‘s dÛ"Ú÷µ½ÅÌ—Jð6J~'ËG³û˜ŠÅÄÌ9òŦÏ? ˜yŽ,™¾ÏL²çÉ §*ipž?ÿÇGC<þ¸¤§?zù»,aˆ* &HÎ÷ëúîü׺¡ó§ Rg CŸ<3³00ìSÙ¸w~¶fK)Ÿ%s¸vÎtÎÀæâ¢3f†&ö•{™ˆÈ8*‘ƒÎ4‡ÜäW´Él2gØÿÙØœm†?¿5´Ð»çÇø²ï0&NœÑ4 “Ô·áì点¨)€ý£n&DdË^— nÓ$1®ÁÀ7œ?  üÑ™lªÌíú‘ÐÀ g;{¦Äeàáÿ!²”–X¿ñɸÈå¡{²,ë…s£kÁ/Œ<ñ1j¾¡¦¦Rz"éÔsÖX½ÕÖ×<¼;ì‹jC: QŸ áÁ/É„"â‡`NROBùýp—0É}}Þç²ø8çDìÊ£lfû­ï»Ùà:ÍÅ“ñßlHŸÝ=ü̧"“bšûÏTù"½9S\Z) fàSwô³þªè–c'i"»Qí~÷g«T›;çá>öIÔ[|ÐLIç/ö•¼Éz(¨ªQ¿©ìT± ˜‹)º6•u5žÌCIŸÚpø©öø÷"Í–§»§g“5Yü*©‰àÆP]Y¥ÆMå²g{Ý00÷õ3–+vã–å7í0å2Ï)°¸_ŠnH‰÷ඦ·½½Ä>w ×ûuÜÝðžwÁWë<ü-Õ4’ hâ$ "z€£Ã|ûT¾Ëmú‘ÐÀ ôf‹x¥ü²bž9žû¤‹0Ç ððmaÝßÝ~o`,Hã;Ø“Ü/Ç´®¦YÂb´›åLÍKg˜àí€æµ¼8ؤ¨ñl€^îNyZ|1¥BâñÁL/2¡‡dí¸0…8RÑX×¼ñæ/BWx?žw¦'_g‰üÙí4ñóÍîç>Å/—X>uI+ÝÞ\'àeHçþ±$×ó]ù4é9Ä$8âß[ú7×y¸P€nOdõ.…ן_!—îF€=¦=Jb‹3ïY¤÷—ÏÁµÖkó»,u??£Ü²!“êlŸ©ûU –û¼oÙ{’Œ¹§??þJÓ±‚»;`ƒºÆ™Oùî“ñìÉú“5JÅäüéfCsîí àßRÔ4qve£fÖ»¯ÜuœË °×Dd¥:™¡†M7Ûl;°þ,vÊ£^j×ÝvÉó$Þó¯ßþÜÇóqï@€>`Ã-4À€'‘ úXàÍŸ@6Ë5ò&&Ð6Кeì•ÐJ;À'â´ê¼îSQ–“QÖo•qÛßµŽ~øõxÜÔÜxèQ4àóÑå6GÍÌLšä¢à @seÈ[c_m&æcÜnþ­õí³y%âÿšBv7oèÚêb¸7œmLèy—{‘ cu4Dð‚zQ€¶y7’@ZÍ"I“¸þv{JP¦VfVAJóññ:Inäáõ8‰Mß´V‡7çŸyî@@]Nѧät̉ÙEÒ*𦧿ÜÏÎÇA\áUHªª‡=çoþ|‰gœ‹¿1G—þô ‹öí‡X:ì4DöN3üý–—-Ù“t%»»ìô¦O¶½3èï<Ñ4“à“7Á YÃÿ¹¦·”³ß¡©¦OO€ûd]MÇɺa¼™æ*8Ûé¼&î‚׸|3î¡jVLsXçã˜~ÃDñt¥©bS.¬å,×NŠbòõiöz*ðL¹³Q|~”OfK ýÈC T$?v@ð‡' éOggS@ &n0LJO`d^[NaZSÿ·ÿˆÿ¬ÿÛÿåÿôÿüÌrÁ ÈÛ,8÷éT÷ÂØÅðÂÁﳿ»ÞE_½lEàz¿mÆeöf‰yúIÿ™O4œ·¦‹Ÿš·ÒW»Ø¯ØŒ¨ý £…´p}¤RµÖNB¿&«u O>ö³0Ù;Ž«¢)+ Àí3h¿~Ã÷xÎ’òûm¾Ã‚à;õ{S»ðOâñ˜®«5Áoü(7ô&'ø ä†éo±>ƒüšµv½fÄ&–©ñûì‰ykßUŒwØü›ooÊ߬;¢ä$)¨mþ•Ëp6Îøç÷¿jÁs±wÔ)`½€€È hÌráMkKq.›eO ëA—V7Λ¼=9}Öe5ª Ìp·ïêÔ¨íå›ç‡“ë®1>…QßnçÄÿg¾ì‰¬?½\.—‹9¿½MTñŒ[Ož-öÎGù8†£ àœ–u/Z©Œ8´‚ÐY0yf²!ëÚCßHÛBàÏŠ5á°ž<±÷Ôy¹­\ôçò1‡W¶#•ôwýÏþüü\*™yñºkÉbýÃì9y>n·ÿoëÒÒ€+\ˆ51*ïI¤nÅMåÝÚkwZnvÆ\p™C5[g"×u CÊrrbæÙ2Fn[^ŸøMõÐÏ|¬úÉèõB¨ÿXBêbáuVÚKhn«ùÜ ppµƒ‹Ø1/êü‘"ëÒ-ÏÌjñ¦m’/ØŽ:}w‹M"%žõ+‡ËÕ³O\ ÷'hýT_yHbü…~þxwËìÖ(Ä!Žg凷̧©Íúxª}©ÈÎ(FÑö`GF@ jÚVxCŒÜ^µ7J—ÙÝÒÎdå‡÷:·zêÄ«xDY18ßäñ>ÔV^?,‡¾·°¯åÛ%ÿ`zˆûÔi¢ç¹ÒEMoþ¼NÝøµÒ–èÄ‚é»eùc:Ï­V^ ¢}XZæ~º• €k pëdîð5j5–M™þfšírÖ6?žVÆÏë]ïêKo•9~J<߃.7åÕ¯õ)´~k}vÑŸ 7^W–Z.ûYÎùÂ7-ÜVQ¥ÑyŸÂ|ÎN`n‚œRôhKÀ `PÌ oF|$ÅžÖaõ¯éeæò6G9UEÑ`ª±<ìÕjñbêj ŠMÁ)ñÛQ4EnŠ8ƒH’$ùïÉìf¡‘Èè±þ­T¡ö$f&0ç)Ç÷-V1r œÇõ‡˜ú™wè­ŸJí§>ËS½ôÚôˆJê¬@)"˶ÃX±@Å Ø#¨­âüÜÿ­ë<½&:{%QÓŠAÀ“t­ZB‰Ú± ‡î£]7‹—Õ¢¦f•íöd´úõbUjö¼ŒÝSÜ’»sÀ6¶¹mÙu3Ëš dC£JÓ XSšCÊ®n¹Ç®C¾Ç½ß\ª'V‡Ò‹©Ù›9˜ß§\ ݯ¹ÑØ(I¨»ªVꦬq‘b‚úiy3#õ)6éQŸLzút¦°õ»ÎMo Uˆ4¹])²îèDºz×U§Å¤ÓÍ2ÜC×3b®ÚÍ„°dMI8”­«S—¢=¦ÌY˜»"ƒ7w±ºz9éãìÞ¯Á¸w©^{{Ò¦ 嬻Ó1ÔØ±ÿŒI¥¥ Tf)Ï£îXa(* 0ÓLÇ„WaÄ^Ÿ.–à“Rd8rH*r»g—Û¹>‹^&ËÓX Ê©¥›™RD`C&l mŠ¿½Ú‚6-åLqÌØCOvÓd6ã0Tш€ »"î…ADDS`1fÓ:B„:cHìf ‘ 0Sò¡ˆ @É @‰ € Àm=(E)¡¨‚v»[«4n§”c‰–${(œ€þ«5Àè~·Œz¾˜DÌôÞÌÃ|(ÅšÒvÊ”w°ÍáëýˆÚP6ÄgÌb’j gÜ×øZt‡¥¹ÎŽoZrâ­5\w4ª¬;ŸêaýÝ3zZË6ƒ¤ŽŠöû#¼•‘"¹v¬G&O•-ÒOke?nuÐ `8T.EËž’•K6ãR´ô}EUU à%€¶:Õs›DFšcÉ$V­Â…&érj†¢'‡âŽ8+ÝLBt‹ÝRÅÁíàŠé†ÊM6à–d\¡é :ƒÄ˜¨ »k gNÕ|žâsÑ›ÑÔbÐb²Eq{z 0\<½ ,ÂC F÷\m)ŽX´"é6‚3ð( ¨XàaŽ«Ì|ÈnUñe<ŸZIÊt ‘(z7zfH‹¡¹ªÑÍeV0Fî ŒŒ¢C«1)N°F¶°`•ì/À€V¹`Á´…VšfÒWF 5¾‡á@`ãZ…RÄK{ðÚVr@¼3A`ËÐo`[ÓÆ€1ø£H6ÙX^œ-ÚCÉ—ñP^®–²B®â¡A„ÞC‚+U³w/<ÔÎcãcDzȘÅ×W7IàJЭùõÉÉ6ÆrµNñL¹L}__M•™Ø(ÌÿÖ$!—þkkßkW®[ºí9®ž¦?êÅúª§$lIø|5ø7õã8Édh:ªZWÁ·,-(KÅ‹ÐәͩX*¿IVÓ›÷$g¬¶¢7s;JpS¬ë>•¤U™E2騒f¬7.klöä2Q©¬1ª¶Ð "¥™ö­—b—)f¯½¾©–eØž2TþÑÉ” C|9Ì4ó¢í&òÐÕ#¤1–˜V/¦àVŒ˜¡ân¨„´b2­ëÝ…†W áP £¦Š C¥w¹­/ÂÍÜr]´• 0»­í˜t˜,”´IF"$ö*ƒè‚PTÌrñÆÌXT*Öïj$™Ì iJ|a¦m°â¥&2‘ ¢ÑTÀŽZÀ°ÞþbÕb” €l@¡^y #d"‡€A€©–ˆÇ€¨|æOD%-€|$U{Vs>œM:ŠŸI¹û½jQÀãa±Ð=̄͌Jî»þ~äÓaIo:+³×Oœ-d€sZôÌmÛ·†-Û5ËéuŒÍÓMEc\{›;ÞT­ß_u|4ï‰3ž·›t·Zök“Úé÷”š/,K»?‘}.L{ˆ¥ÇÕçÀUR™Û[fšá˜H2)9…üÞÿËAMú¨Gëƒ-@Î9²bçO“l¢æ.-€ÏŽnT½^YÊÈ€fÉ´•m¥cçºMÇq¢tãVFM±f!ɹfxÏj׊!Ó¼HsJ|î 2[O Ýãö¦CÕ~dgäDCÞyWÑ‘Ã$«„@a›Ñ5Eî"rwk^QÌtº¬¸é0r*ùÚÒiq…ú¢K@Úyf™V2$y²Aø°w˜20.€¤T­jBf` ¹âBb8 ÙÃ9½šP-„ƒ]æ³M:¤•‰“„@©[8×ìs÷œâµzrt€hFTê`ay‰± ` 6&(€ @D Hˆè À …tX ˆ[T-"ÃjPk† )€°è¶¬€0‚*È‚`ÆùZ€ÁŠ H€Œdc‹u ¢`Á½þ«-¬ÆA&€ö6ë@ø ÷ˆýÑ«ªcµZõ¬,íà#DÞ\p26O•…O¶VÉôy›0˜[²už€qÖNo)©J 8F× CÍá,Û¾ø(:z¼ŸXêô›åÃíóD~v«‹å ËJK.s;š ”¼W[ÇÍÞ·š«E (}Ǻåó¡…¶ótOîõ/ÄgL®r$~i[ gUQY\ÍeƲŸ·k8Â$Qd¯/ƒù¢ÝbaFÝ@G¸ùÞ±²&ÃcZKGÁc†¶È¸iˆXni2í¸@Ð$YW¶Ð~ro º«#¨¿ Ù:šêîÖVô3ïú9®çbG«¸A˜ûݲ€”©\Šø©,2²Pm›ݨî‘ÑÒrTÆL™K6 ¶ôèÊ ³ªÂW ¨ìÀ1J(¡ AÄLÊàÈRW$ !¢*A -;L"g:É9ûÁ‰¦¤€ZÏ ‰¢îpùŸbŒŒPTTÉœ¨  ˆ ˆÑ‰ˆeŒŒŠn‹˜mÚ•"`È’ýò1­€(ÎX@Œ!h Ä>¤þ›MrŒÄ, ð[«n`øAworî¸g„å‹•=+¨Â=’³I¯_¶«œ€p ˜gLb;v÷g“ ~ÛvqmŽ̲wI@í?ëòí|‰\7\WF7^®ñr<Ÿô(ŠýuËq>-Æ“­ßÕ§…m*!š Ò¿h<Ï|ZQ¼ ø ’K°-ÅLö4ß…‰êüyK4X´5†³-¡-äŸ æ`<Ñ”” U(>4Á¼)iúupÂ=Y%*äùT3.P«âÑJF·sÊ{"Ö£Ôñ\\.½ï¤:Ìk:(–¶-—kl:‹ö.S$5k-™5ÀtÐû,#C<Í-N3ã #¦çz6žÝlð–NÙ=žfµd°®Ý¼Phzy6+£E°ÂôÈÃÚ°Õêá+ÒÐÛjŽ‘,»(Xߢ°¶¶4U@7–æ¬ã˜L¦uIL·E§$ADBÝ4[†¥gZWÅX z ¹+µ€2Œ†%0íl`BÑÏK³ÐB­YË<Á%ÐÓ4=Àª d­*4À`X³¥[šÕÐ ¤–Ö¤ë€À €Ñ °¬`@e-k°”£»°V# ¤2å&(ˆ "èhÕAÐV4 €@¢€jFSQrO ±Õ>AQ8©R‚`À ‰°OggS@(&oRµŠ[ÿÿ ÿæÿËÿæÿÐÿÇZ_db^cÿÖÿÞŠÕäØNut:´ÆÚm¥b¼L-½¢šEÿ'=;óòûüó²Ù¥qöíÃ5ÃÅâ@x=P&Pýl8aLz®%6/6ÀPµ˜JàÂg\€k&—D~Ûv`\ Xs±É$к‰µâ–—÷ò-ˆo{Ð`V\cª€þA9ZF'ÍV0–¸KÖ@ ^ö”ÅP'åô…I¶ß7Ébf.€R žœ|²’³ÒãñzCJÁb=ƒhÞPzCŸ› ˆòzÒœó‘\|( ~MÙi¤¾/vrœâ P@ƒ„‚8^ä¤Ktú¨æs%>U‡MDeQÀSlÜ,eÈí*¹¡nÙÍm\9P>¿ÊûŸq>˜€šOeQ5/îÐWõ¶dic@tÌ¥ÌYWIO’)Q K–%Õ º£ˆTa Ùõw‚ÆåˆÊ"Øg‘Á›÷<)íZë™Á‰£§zÒ–ÀPŒ˜H€­VrlŽP¸ˆ‰õ±LýÚèZ%βi‹A a ¥*0z¬!@:KErµ±‹ €PµÀ€FÅfV- @¶u+¦–2Z@W€B¤c-€ Ym4~+…ÞÖ€²®J2&0›õhIÁèU÷®Õ»€†ýbjn ©É}u4÷¹³ÿÞDŸºï#y9#Yvëk{]£_®=J~Ò‘Áþ¶?9@T#À /£ï©ÀoÌä…“… a¿Æ%]`Α²“úÔ1Êe$þáNóbïnOËh!{®7úu¼S}pÅ¿éÇQðTü÷Š øÚiöÕ|c2ŃJ§R7%ƒ8&¡@&ägÖnü-“Ia¸­oY%äê~Å*ó†¿^HY`åLЬPÙdA¶É]î^î¨Pâ°9ð•]ó·f×?¿b™é}mˆ˜zjª« pâö_>ÍÊ µl€phè™ nÿFµU;ã@5EÙýº¨31Œ¡»:Ê‹:Øø¡qÇk*’ýÜ@rôgÝ%C (6=€Îº¦Û˜åv‹=B@@fnq'KÁ »9HŒ™E€€ ¡§fÖb€ XÉ&Ö° äžYp$@F b³ä¢¢#€‹€* %@T³ÇŒ210@ŒŒÚ¤Â*ZWD\ ªP¥@ŒÑ)_AXt ÈA!À@R]ﺢ œžkõl‰G0ÜÚiÄ=!™ñ`H𷾊·îòùóã ^<)ÍØ{œ­à€€ýqU âb'ì·„Í6à‹Ü÷MtÙ ˆbµ]`˜C e%¢äÔÌúê'£õeš²6Ô®ÿ:èpž\Ù®:¸3f|'ºbؘ˜Ã¸úôd s0ÍdžÀËÔgÚ€íÔ¤ë̾¸«1‹ãU%^àþ)ÿœžšðù*l:û`_³^رåïwp8ǹ˜Rûk\7¾¨& û¢`?@L@I’¹W®-h½]·Q¬„[¹óQÑ „ÁÊ92ž?ç"/ Tª‹Æ~ÕA-›©¶Ð^€ˆ½M¯ö;³@ Æ:– ¥fºLž¡{¬}2úäHl]Sê`D$KW®It0z ˜tFA<ÓÙíL*hTžgn0°d°åVPÎUE  \5 3j*¶ôvO*€mC ª Æ€è4@€Z@tZ8«¶3* `G^:•\O³MZ¸Á+ÕrŠ @ÙîCëzæä׫¿„ñɇÞ>¿¦Ù|¬u˜¡Ù½ý#¸¼ÇU^o1À¸ð•ð~â¼FrÚ´Zòá pa—= Øœpiµ@—sç û–§¤¸Rù}ð×M¿] íÞþÚ/þ ¥Á{4¹¯úL_;„Ø%Å!…^ÑÙƒ„¶ÉhǾ*e*”ž$J~™Îqì„'xÂþT£[B.û™ýxÈ ±õ³c‚ d( rõì™xŽiŒr)â:U׉ 9¦g$—Î2Œ~9 ÅL›ispÕ™üiÅÑ2ûÚ¬¡-ÛJ¼l{? êÔ PÃì `˜ºTÖ P›¼kÕúÜ8‹ãÙkÖmPU,ÆZ}™ª ÒŸF¶¡Ûdèu®$ 2j€Ï8b'@qÖa@¦õD‰ àj«m«°Î š„U ¢÷ÂØ¶1NÉúæ ¢‰=Íj€‘ º`sÓk–ª˜`c©€cÕ]•±X—ÀRU‡* $-b@Þ)vM¥F§;ЦÎ)USÔ³WRþt™ã[}e|çqœø]®ÛÞ¾Û÷è|ÄN°û¿ü86Íá«f ïë!¸ñšxï¿ pîxH¸ZÀ£IàÂ/­³ ßE—+–ËÞë}Y<l®ê¤Î÷¤ðÇQ§úJ;ÊU^T×)_æíÝÃ%6|ç¾~>¹2´R½ê‘éډϬ…*ˆþo:â(A`°\lýñzä{[ ²Ôdž³vf  ƒŒPÈßrÜ.Þhúr!ƒÇ+“æì@,ó[72P®v/YTvº|¥­™±>4ëG­8® l~f @‹Õ¤if \¦uÖ”PÜÒ™€ ñ¸Ã縀Ñ[G:çïØiùbZqÇ)Ý®I¢Ûl œ-ƒÀ±@,8ôn©àlݦ°v5«쳦%|€åpjð}ØÜxFi¬^«]tUDVlšÂ]2¢9×Ï–[‡y[wóá‰IC¯ý_ï«È~“³Lô_ÓܯÜžtöS„¼9Žb€ Îþ‰`äj) ²Îo±XM±%ƒá´¼˜‹&p‰±ù&+hj§µjZ4ÙcáÙ2§ßjT”Ñ—<öCÇâ+É1“.FÖ‹¦;W¡ìûẰôÕe’òZÛ@ŸRçæ ;Ê•sË¡ün‘Çj’µ_®rê&¨±p/@µYä Pxœ vI«µÞtZQ;ûòà"µÕøÌú»â “ÖggÓ^èG½ß ¦Žçÿ9T¥?ï½¾?Û0[~Mq©|{EÆ?ä"e|£ÅZ‹eFZ`íl•2 TдŸbÚââäg‹ÊaGq8êÑO{ôè‹—/.¢&šq0[”»îH‚„sœµîë6²ˆaÞÓ­¡m% 7$œéÖö±G÷›>ä~ñÚ}6½õÄwvžS¦‘ 9©ÉÓ6 þànš=ý‚&uhó”,óÅ|KâU(N@ ƒî~ùÐn-¤¤üý†ea^þ:Â@5Ê$P¥céd¦°ÅÔ@£œê¬ÃÙZº{ð²QÙkOøÖT»‹©Üއ ç¨«3IˆäÀ›ËÜûo|ªîG?¿ @D¼ˆœRø#êýk¶óÝÆÌÉF9Uÿ†Ý›ßqúÔG×zæè¥‰‡‚ìÖukË¡œw„È}˜Öˆe1î-Þ1Q|ç âÝ M%ƒEQŸÙµ—ý·kÒÛà"f ÆÇ3ýÕº)!$pÄãm2…‰è纪šºÞì ®x›YŸTöQ©ðñЉ©¢NÏ” øq àZkI˜ôJBOøx@‰@k©QUâ ЙB\:HlTÒ¤¤H € XxA²úF¬¶'úÙÖ‘…‘ÌÁâ¡VdJÚïã÷ºl=ík› ö-…Z° €¼Õ°@édÒ€Þï•á+&›‰`Ú[öÀº›NÁ[nÀÕ&àó[8§DÛØºúQõÑz‘¨f¦5P×áúºêÀÝIc‡ÅBœå…&>¦/opZF¹Ü¸®Yuþÿ±Õ6¯||œ^5{_Jcý@0®ðEDüc7²4² «’D,Xüç×ëW¨ A³2s¶`:«_J޹SKí•À] Cëï}f 5;j2!«‚‹e²ƒoøSxrp£¢PÝ@úD’O‰jd€3\ñÜ¥õDZåÖóús#bLoG7bˆïðBC²»W¥êCLsž‹lõM˜žf²çÿ¾ÜÉ™w®¹¤©¡³wCMOggS@P&p´m`Æÿ¯ÿ·ÿ¼ÿšÿ¯ÿ‰ÿŒÿ’ÿÿÿTD–Ùñnì™Ùdy­Í´Æ‰âö+Øm™¸©\^7»?}Žsl¨{G¯‡žzµêZr}ôÔû|n‘Í ¤š¼3Àãêiy  ã§ØÀfðc8¸#éùâ9âcÄ_€ãN!X*Ò’¼€¾„Èi'øé@‚ù]]¶  •— ÀÐŒ` RVÙ(]΀À¸ß:  d$!(ð_Jò OBò‹IÅ_¾ Œ°6BQá3˜$Ò">ìõ¦ñ2ô‚±'hz wTD pœdÞœ5·&#js´5QM0¤Z¸‚€mÇG ÏWöerÞÛÕÁÆíÓÚ.Œb&ƒÓH7®9°n7NR麠‚e·ó±¢#§}¼xÁè¯ÛéÄ—Ñ@Wn»‚±‰~©ž‹ebÈ$zü<;4/|ý‡ªƒroR±$ò¡YWä÷¥\’ïàÝìÑÕ@evËÃ(¡.g|¾3ˆ 3í×|Q3¢ìÜfNغcj²˜è¶ÇTñ¶É¶Jjª¬ÄÓ‹ÉÂÝI˜³x3½Š¹Ío8ÎÙìfÇô6xÝ‘íMGKNÏiyeÜ g"wö ˆ]MÑ0 ¦²&:3ù\"'K3ü¢€SLcb‹+Nõ¬É ‹5P•L>cœh~^Ñ@³3îÁEgNºÀŸ³7†_D®Š@¶çcaxÀ0!þ`Ì@Ù¡°YÓq"x@†æ$貫‚ÎaQé$ór4i²Ùe´ÅÚÿðwE{ž9B>LÒ¯Ízz2kvί›7ð‚}ns4,|«V—RJiŠàu†:—¼{µ·}ºcJ×ßigýO+RlßcDÅ6/7ûN|ÇŸ6d]ÔåŒ`ÈU˜·ËdòÛdû¬FQ%BA‰5Q¼¹mÕE‚Uá.#“߸dÔ]Ršêd¢+­Ìž&m»ºKÇ@¿òG«/ߟ¿öCdx­\¸œñr|(Ÿ¼«)½<ˆÏ×evÞÝ£§þ<‘D’,/§e»Š}’œþdššŠzÚ9u^€VÖY{ãN7U³ìL0t–íE2}9zÕý>Û³õÕõ{?!L“ :^æLñÅl›N³v’vg;{–õ÷nîûðvÜ“-¥™&«ÙYí¬9Ü¢ˆ3çPW×[ð]þJ{`šÁixüøù¬üùøþƒ]> Hk. ù2 €ßcðUv_Î{@âEIÒ²·W,Àè²…‡bºÑï£YoP`Ôy`xÞá ¾ Žp‰Æ²…ÈÅ:8•G ‹RÀ÷á¨È'¤{ôh¥ñ÷ÿówqþ×¶9&¹ŠF>¼~¶-€ ø­ûܺšum‡°Yͼª@u·AÛå1ûÓO)¹ŽÜ#fþ=q¿ç Eb6¿zÆ—)1ƒ&b–Bô|_}\È_;Æy´,?‡»t´£5’¿õ*qM‹ TÓ×<¼ÌD(ªôóåÜí¡©ƒÏˆG»ç+—·ínë=>‘Ìußm"ß“=8ÝVTÚ£+ßÞñÙ±üì/t­ÉžÈuŠvž_‡Û;g¤3¬Íà·;I¥gZNKĬ"»àKe"MõYtƒ™õŒ»÷¦ ï':û5êŸ ’¢ÜdBÓ™¿" ×õåduºã£hEõDi•’‰íÅôí§æÓtM-S¸6½ Ó(Áöµ?ša@†éé§p÷ïk¬"aŽ*ÏqWÀï-¯ƒÆkÖò.Ö5×LÙ«âBäüãÒ%´ph0$ø: ÌÛ`áFê†×` -@±AZ ½ €ˆAˆzx„Èz À'.¿ Æ)ïHq¡”7|Û™…’JÇDP~,ném‡Éè½F°+œMöQ;aÀC £õÜl[£À¶6F›Ôj!eâ ŠØ7ê^Ã@bÚ´ãÆ>aõ÷Øè5økØo¯êîÍq74Þ‚’sS¯úºÓ†ÿÕnìÙè7Þ/Æ?D¤ÿ¿^™ï4OÜ{jÃï[^˜Ô‘pòË:¼”íuÄrÛ5Xƒv“ñôçeØžDæ¾åqH¦B!÷Ñ·­à¨é§ï¼Ñ´‹Ö º&µ¶ö’u²Í,˜ˆ& Ûœ~¾“ík¦*™&P3³>Ñ_'‚.jª©&»¸†z$CúªçŸ=?tÃ0s€¼ Æ0D³msáÏV}ÆdÁDR~Eô±ô¡ÜÐ÷¥šÊãTYI’¼MÂÈäaÖ „ñ3˜„†Z’æÜ»T{¡x+(bÂ0tóì虹5e1L7ˆ•Sà}n(Š5}Z¤÷’Ck²t_èD]¥(ÖáEJG€ÀÀP–°ùL)db|ãB&PP †8†ŒÅ|ñÖ°J^;.ä5.š¼³×‚—'ð,ãDŽMìÌèíð i»÷úCûÚà€„3N_ û¶¯ecd1ÔÓj*ND ’çÚÞ·yáÇËdŸ·´›[æ»"˜']˜™§’—Y2}Qü…Ï!”…ésGåC PqT?óÓo»‚Ï]Ǽüí1=%zÅ£>æ«sÄ]ÅãÄáC¹“rþPlèŽûyˆ÷J>ÿë ¦ÅÒ«Kg æp{ÂGδ[~L7W/Ÿd, ¹ßýcÿ`FÌt©„w‹²ûÄJ¾Üª´gýÐM{‡C´äÌG´QÓÜØ×0óŽg‚9=Ô›@ÁN»ÞÞÊÝkÇ%—×€€¿s0/qÚÙÐdëê#aº7C0§ìéÅÕ6ÏdÑEw£{]·$B²M©äJxk Ý î}þö y~ïmÅý—s8€W©fLñeÂÝ“àÓyzËxéûVÜ@“ô˜š‰,²ïíî¸U=Ù>î”—“!auE?²”€¡AðˆÎ‘y6ÍôQpÞÀ_|‚H`1)`\Þ+nø×f“4ðî^+¼¦Xn0£v!î·ˆ³I·s»à÷e­ÝÔ†™†cLØp>@6oœ~˜él ¶QX öW;“V7ä¨YºZšÜųuæ¾@?½ÊÚô À8hif°$ÏL-ǤYùkÜ«&%äû>ÔÚÉrýî¶ÈÕý9âøÍùû¿,m,LÄ?ë6óu(®°¤TìíŒtäóiê:3zÙëqAQ† tÚã´»ÏÏ8öHÒ­¬û5MÑÌ`§Ç7ç4A±åžébëîfÐä ½Ë_ÔsS›†eòûŸ¹Þkö›°Ó‰§²hF+ó߇›MeÊ'™~“^™\¶|sßäTMƒ ¼ï)4yÇÚ³o19ɹ;¼ó;_óý} »˜i~ìȰß÷ͧ5²Û‘28ö_YÔäuïžÇPÙ°™þø0ëãþ쎻¨$+Áf}X 6óïàÁÁ!Q€„Bº”iúÌ Šv~+.ø‘Òfæ îÚk—Í À3ÇsÏdÎb€·þq$ô‡7Fð¿ÀÕ“ù¾îËuÚÈ,jJ± aáºuvÎum»“ Ú“µû7p»cÉ,ô¹îÊsâjèÙÃ]‰„R’ð®ÑI’a³oeíš4÷{ Ø;ù™SïûÑé—¼vk÷5åÈÄ´t¯éi"”& ¡øýX¯9íÅeuÌîn¶ÿ"®íZšõWéãǦ$ )-¨ê›Í“JE„wxƒê\ý|Æåðç»s¥fCÕf äYø˜eü”\ºk9úÁéFrî³<[¬ÔuZ¬½ ®!=-Þ~ñásž)P PÝœx{ÓòáÊ…åkŽøã2«ˆû5eÛ—ròØPÀJÖq.ÞkĨ¡jšÌ 2Þ$ÉŽ¦‡lŒº§ðIt¾tJ’sgÙY›vúûßÌΙJ7Ýs±9“fxÌŒ¹ºwgÕÓoæ=>S 9ßì,ãa¨~§H¬IÒ]ñt€€…ãàp‡Á„†† ž+nô'ÙOp½½NÄ5G÷‚&ŽŸ9qXÇÇ€o§UàJöñB@rJ{¶O‘ßLCë2† @Äúá]ûVŒ„¡à%¾B—€ù?£ç¯,ãq¿÷’zŠ™L³®4Á…°®þ;@~X{nÚ—à»-%Hç=à8<ˆ p¾ß3^f£ë–L÷gç$ºDÏ»JW#NeëîóB}Þ ÌÛzì)^(ÀìlY¼ž“í„Ï ìæLS$ô„]§Õ´æÙ´ÈI×»Dîß$LÓ±M´»;Øße'Ë{|ôî[x²úäßÞÛLoÓ°BåÑÈòÓäÚ DÍ¢}yhž^µ{šf'C¥÷x¡£d|¹úÛ£¾""`•dSIÇ+õtþw÷{ï#0“íÂû}I%Þ”ç0Íg¥Ëš›ý_u3Í ÔdéW~áÆßÅÜÏ LCÏÐ×Ű>žŽÏ÷VsÀ¼šŒííûG/¦™‘ýpÕ`½.g ©m  À ^+nà7ÉnÌ\g¯…Ý£4‡dƒ‡gNUÌOöL©1î-"’êç°8PÜï€Û²ïc«53 U©aC7€Ž´¿ü[¹§Ê ã‚üß•3-‚œŸÎ¬v!é“¶¯ç‰±\y mª‹QÖñ„’&í7Âìšßâ2M $½¡ºO¾_4·àd½À33UÝò³»çXbdñ#öëU¥]óãî`ݧƒ»H舘¼w¿·¼èóWxµwkTîÞ—xKºpyÿ§É1õüYÌ7Wp\7BÐÍt@Égom‡‹œûŒ¦‚6öüq"<ð) h€Ïî/<¯pš¡¡é¼ù7?kŸÉЄ‹—žçyrè«ò< Ù>9"¦Ü IUÿ8L3¢2Õ‚–cý¯Ã¤;éƒgö©v¬˜1cb‡¡¨Z5çÏôl~ög?/ì¹k€4ªÉ5Ü{ߎ·`kÌw÷Ö÷ïäý½™˜J(HÿJm’ -^É&àÖŽð#eïapZ•ø)Š“ Gáñp;¢á¿?¯LFûDÄ~U€m϶ac5­U2@Øp!K0yþÍŸ~º<^ÄÙì7ÕÉ÷ø›Eó»6?øý75´’»N´ £WOöÌþÿÿ+ïÇör×eŸ Ú»ìæ³¦÷xáPÒ­Ñù¸jÜÑ&˜ò;,1@¬NøÇ7 ±ù9[þĪÏÊç½9"µ8HTu;âî¾èúµoz«¹•iênf-Çqz«Ÿùì°9¸ÌŠoÞ¶S/Áé§.$6N/ËÜ÷€„ £¢§TÏfÑ {»mG„õUH r¨«çe2yOggSÀv&qƒZ¤Þ—ONXdkÿØÿ¥ÿ­ÿ¯ÿžÿ ÿÿ‡ÿ,ølRY~³³·æÅñààé˹‰›Ž’h‘Ö)óf͇yg†]`G}çoHAêjva‚Ÿ¹{èÞ?×éÁÝTQCZÖ')qªéPoZ,nUÀD 'Ý7ãIíà.ÿíÅúÌ„¼ÊEõn¤ê´šaÀ¬mžOȵyZ=ÍØœ¦ âàµHö õìŽÉëÁ9©95C¯F… « ¶ ûeA@žx…™3Íd>¡ï^í»#«ÄW‘a½–;^Ô] æ7ÅLö÷TÄÞ¹ç±wólŒT8øíŸô~ñÈ«lÉS+}#7v‘§š>€­$ä„,÷WúSó­Ý jgÞ=¹2O¸šUõY2Ñu–ÈrÆç’é/ƒcGK]áæ?ônÝ,‘ÉRií¸R¡°³£Š¡2øçw¾ùÿ¿Ýh5X²ªKÜ}ë"¤–¯ˆôÅešS¨êúFDQF_`»¤ –@F£qS€¢ "Éã7«êò/ [µ.À¤Ye(&w‚o tì“•ÿ5d]ÁA´3iË1{ýh%SúÂòÛ»’œ_\þ4¹Z]u}‚bM}Š-Æõ¹®—§×ø9q3±îpç.yÿØ­ý¢(ŽåJÝ?¸³ž[fk1 x“tbiû E’ÆRðäm¢Aß°Œ-»#÷g…ÔküwÕcéÛÌÞ¨t9e­—a€øž 2N'[x$d¹GL#³W¥›v…² ‘̤³Ö"IG%…‚¢½\î9GI[EZT´>£ž x$ÄÂ¥/èyO'f* D• 2;S9O‹R6±gODyÈ»3ò®—wÒ§²vùü•rŒRÝ †}ô8ªÉJtkšÊaÎ'ߎuŽä¯9ì@2&ö'©„Ïäü“€2>Csvß»óe:¦+/[,Ððþ.÷Ø2f–jFEOOR²šF»¨ù}ÿbôv3î¬V¤²OFFîn×ÜÛÙ*´ø½¬gÿÊjyÓtbö/µÆ;fJ}£IrQúWÜnµÛý‚֘俩}¥NCûgAIˆ§¨þµî €ä QpËø* Àpκ_’/ûJ:F¿ÿvSh½l®0â©4SÀFô/“öùù]²W^܃,¢º `‚О 6ÂÃl7ôr¥’jhQLð?g¬Ob ²$ì[âG}}›µ‰.¥æŽÀÈ9/׋ãV çõ3€zDÛøüâã,‘T›oõ§ïk’Ždø¡¯mÄù¿ÍùŠË–’6Mûm3rS¾‚R¤¯ƒI(**pA¬$éµ*Šª‡L)šJKªÊ½¥BK.Hn×}E@ôRª &0KVF8“‚žÂ4ë K*¾–rjòÉšÌ$¯_þ+si/_„áfº€d ÿy'úM¹²Éc¼O¼ôÚ4 ¹¼nEÛÒAöÝÏ~K/ÉÙE¦W1°)¨f ûúaÐ?‡j\­ÎõÆáéUp‘p¿Æ+v:3cúüu ]±–b¦ ç(DmtÓÑ3Y먪)‚¬,hÀ@¤ÔM},DÄAÜES9OÄÛã"†û`6À2ËÆH68pR üÈÒ X ° \Àh3,ºõº¯‘ UH¢‘šJs/‰¬„ ,ÆAÈðl ³¯ùS0ÆnÉÈò/Y[7ÈpDyÁ¡JƒP’žûM,BÔÏ í-6b®7H@ó3ž¥ˆI¢9à&é¡`ë³Í×uÔ×—–®š ›g=ßþ³®öçË+€rŸojTÜ©nQÅŒ–ÝÿãNªH…àšµ®ê=¿Ã¤È6ÝGëe¯12:±ƒœ ËÏòP\˜¨d”#7ÕÐ- ¢I/¸¢\k!΀–Â0BE*°§8<-ŽôR‰ê~y[±”ÓÐKŽdÐÒ:dÍug€>´îï¿@õ«×ΜëÙ·93EG0é„fè‰þdRÛÀ8¸cËÓd±ó®¡Ú)G¶o®¥8]]}g}¦5L[#À ‰ùôzÞÂÎʾuªÄÀõŠtd¶—5§Ý0ty ÍàŸé;Ù·5•ÐÃE <ˆ_¾;‘ÈR¥¹êüº;çlpœ€é©fȬõøOâ(tLÐ$n½  nC¤Á ½l@¿} s($A‘È`Œâ ÔDŠË `/@¤‡0µ,#„PšÈÇ*ðc 4¨F×wÍ+ ¬J£7óÌäÕ—RŒP"ÆD4 V/>üMKkÂðz­hñ3{ÅèÕ—ð=«Ym± iÀ˜gP±Î™%m;†™©ŒÐÇÄ\›™t}”ãªþ™>s¦üäù{ähàä–u—~’ÐM·’ª–€:ëÆ¹ ÙçÀuö¨ømÓ[»¸mÉv”8©™t¯i¬+Í öTwáŠ(¾³†ôéÍÅ\FÄÛÌ0Û¾Ÿ@FžáUŸJðý-.NðO¢çÞU~ªe˜©3²w}ŽYÎuÞû¿H!‚­³WzF 溄)«BnÁ\_¤§»ç¯åv.füfÖ´³¨gΠšæ‹mHl&‚ æ…í¬äéÃä'KGh0¤{ ¢¥7LÓù{_.HšÄòwöïÞÍï·h˜N%}öÉ9z^†SL±3 è îçÓï³²!IÎtþÚ—î,U‰Çf¦[£HÀ~,>¥ŸÝ(Þ°9V€ŠÇô{•Ió-ˆ&`@«†Ò ÿW z`žìqïÆ‰„ž1ªÄ€€:8­ sH­í:Ë®cÀÚÀ¸0™@ZÀ…ÞÛmtά 1z­UÔÌFL&þ£"!ÞºÑF¸á®lc[úYQ#õV ªZ&"s['Ú£mß8.~0¹RIv¾Àýš·N+ó~p4¹upèÙ›N$*šÐóRÕÊÕ@Ýük¥je,‚U‰z2ZTM£ìfËéí¬ƒ@Ð$ ¨o¥lñ¨‹ÅšÊÑI¾‰æðN¸¸¥Ÿ Ôôé˜ÌÁŸý} I~øUDëøáüðùý5Ó2rNÒÓôò/oJ鸜ÓÍ$Åõ´$BÜÏÄÎÒÛœ~Ë45Ôð0³IõôBvMVpÇŒí ,kže‚h2»GCN=ÀŸ;“Ž{ÚÉ$TÑ4ó]ö¹ØyÛu×­ý‡0»þ¥ؘ˜‰YÆ¿í¢r¬ò]¯³^ÓPLSR‘4MR™kóëâó DˆM3Æ[[ë³â<Ù™‚L3\ f½q¿¨Í4ÕÀ0ÀÌ3î°*_ËH r%‡ôÝ `Àð ’ýÂ;f*o^8ŸôpÓd÷nÜ`(¾HÀÕÿ0Í3(`Þ ^áœÆ¤`·ÍœÖÆæ£ÚÂê¼5yY"ó- |`ß¶1ò0ß±vЬ•&2¸L cS5ZF»É]·{Äçà¼9zɲ÷sâû˜_Ù}ø%hKúÜ&•Ãß`¶€ù­’";HëTØ“s«s¼üŠ”zPóËç´ÞFL¸Â4#s#}nó>Ó"Os†ÙI1,•We!ÞB’ô»D?#vY0˜èLiM‰©ê)ÖH Ù§fg˜~… tsyòZ¸6\Ù‰âD»ÝüøïÆ:Cé¿ÂY!ù^E’‰&Wìí€Ã>û7G7MCfSYMÒw:kFõð›=?Ù\–ïõ_ŒpɆ—žT'“ ás/ÓÎñÍѯµ“<'¡ag747÷lºªôv34 ³o;„O¹ ²ÄÏíãõ,Ð>ynŠÆzï°4ŒQà‡s'p¨_hÃ+# 2ˆ_ad~0 0ð¸‰(„2é*1_ Æ Z1À »aÅ´ €9`¸ ˜ûõðÌì—XÅ2t6³]& àð–£<Öt9 Ð€}]çæÛ6–a¡ªDҠʤ„Ÿ˜ ÀcNÈ\wù?[©¿Ö<êjÁ ¦­Ûɳ±°v¸M6iPÿÙ뎫³Ãì|¨çÕ!óKô"nD#±’yÌÙƒWŒ5TA ûìo ‰öBcEeëÒ=ÖÅ$Ésª&B~¤¸ÆATue¢„>Ô0$SUÙÙÊÿù-³3 äN;@çoïy~í±bcH˜ß¿>=¤øÏ$ïýi @Óš‡'_q²ò63CVOåä¡Áûg€ÎÒÇN3Íð^_ê…CWÐïÉ’)ÑÙ+Ì„)ZÅnšC¬d(€þLOVç YÝ0N{N ñ¡õ~ ¶>Ò î’áŠG hÂ볇žÖ}O5LdÁ þ†Û¬ï[¿Þ´ÀÒ(ba!˜ ú§Ž6Û¢Œfª¡€Lù‚* U ß”ƒ£ÚÿPb^`]~û­ø>µ¹ HBã_‹­x;—€gæ'rì=#à-Mö ÕÛ ¸\Tè9ó­m´#¦šªJ¢àÀ/ûâ®ff¿Ç!pâHˆxµþ7bΆà‹iŸÜTi¦‘xd(éT®$4fµg³+€‚¸Ðe°J=‰tõyt­¯m·Aƒ†ÅÓ=é3š6`’£Ëj½]¨èGfˆÃ@?ú˜1Ð¥Z4Ïj0{­ùÙûÇàéI˜†~Bx©6ã RE~kÛîÚ¾üJÞÛ·hä½Ì­Í«z–€ôŽyœéž‚ÝK¥ûÜÀ3ÝÃŒ¦™ýìwŠ>>y6¤Î3Ñ~aÙ©~ifàÕÐÓßo.†Ý¿¯† k>œwȤ¡æÑhº( ‚ˆÜ^ø58w½mj &«êÀaö·úp{ñWEßéÉd"2”²y•ïîcìà0œß¿îgÍa·.¿lýšv Ž,@éÀ$Ü\Ïx: hn.!ޏ†‰/ ¨$Ï~ûÁ#+šV1ÅZøj± ]S6$pxæxǨvDÄ€7+['ÚXê¼$-tœ³Í±gZ]cDÍB•…  “NvíøMRû‡|Û AZ)‹äÝü''_š‡Ã½NãÅ y}:h²9È•r§k"˜Ì ³êÞ'·‰<´9"„=\+fÙ¸ÞA›Ü.mC%å:1!ÙAÌ­ª®vsW’Ü_F’ÄÝ;\#b©B®}ˆ*x’¢ªªZë«ïÞúö0¿Hã›;x5C±:ì³5ùyEÖ€é™ßgn¾¾.¾ÜX¯Þm5¼?ä9W?žúp'“kgõîÊOggSÀž&reýŠÿˆÿ{ÿ‰KLKIWfheÿÓÿ¼ÿ«ÿªÿ úýY·œ5Âìô,ŸUQzugžünOU2ÙgBªÚÉ/ŸÃ3I'9Û>缯·'šæÈOï®zkåäNAÛš×’ìP¿¦\»8Ué7“b¨Üçå³öì|sHΕ䔇«ÙÝã Qn ’!Ý& x>õ£â (ÔPC€`,>û­øÕž( lð›Í&ñhz,sÅž9qØ»‘Ú» ð!rúõžnŸ´É ðdNèO˜ÛÜGøh4¢ZS’(8 P¸Çñ1£zV|’îëXÙY+¹·©ŸÃÿŠ‘j¯ ÙZk‘߈LåÏGMHu®”eN efǪylÁ§º Ý×€²DDlõv÷(yI’åzºcËû_:4xa×ø…L~÷ö±z€¼4ë-ÁÂ>êõïä8!B²ðÚû¥ñßÊ‹§˜q²µ˜øqU_»‘ب –[ˆjDÜãY«§ùò—<¦œI—ª×¿ê¹ãIßþÜÝ»Ð<5ì¬dF}.ArWW}šê©›à%]ýsÔTOD0‰ÑN ´)šúwú¢ÿ']4$0Nºhf×ùÏokF¯v|@¨"Éç$óñõÜݵ:Em˜‚)FÏt¬®ôn8t2>ÍÃ_dSÂÝ 0^ԻߪŒ‘„@ qÀ 0^Ûíô ¸Í¸{³£ûHø²W pñÌá3ÑzBFU‚Žhüô046pþ~Û6¶a>ªª¦‚’ Î @(I™Ëèhå³J°óÍLpæÚÏêÞSlgÜ…ØÌt _†NPɯ0®(±4b¨/9ØÎx çÒ6çÏà{c¿¸PÁ½ïéÒÒ£ÁË®¿Áéí2Baî¦ëÌëÈüéñ*ŠÆ‡¥d7ûTü3Dí„€ ù]ûTv‡•{WU· @Sòé¶®æ;‘«%z'ȶ•êB&/sÜ5 ®šÂ£‰»/2Ú5$‡Ý¿»™­¿üÙPFÕ%SõŸ—Çû:¾¦¦ï˜µF¼‡SPYUÿ‘;¾¨r÷©'c?¥WëØH¸xž•¶’6†ïw?î?¨.¡ãæÒ/οÜM2 Ø4–ØÏv\ÉÀ\ÇTaÑØÞ:?ýX×Ô³> ÁµÅÉ•íAÝq[ƪÖúIÆz±Šš.ô¼Î*Ä€VÊÕð«R Øà½ð¯¦1Lpùx‘·¯g²ûÙ-«i‡Yh¸ª$QP‚ËéE"ä9cï_ñê@à_óC¨—¬âÖ€^„ï• …!¸ÅÞzµ«¨0ô®1P­§*¯¼ÁIë­k²xIšW —µŽlO‡ß}ÏMÕ$vÚi¤¾î-U³°Œ…Ë:¿¦« `ô3«4(¦cÂÜÈ’U…“_õ÷M6ÀY`˜,B²(—]$÷ÙÔ™¦k:ûJ?Ú±êb1ÍL­›‰ð‚ŠWä+ßÇm¼T%:ºéàK7–àÂóôûïóy`–ÚÑ[„{†F™ÀôÓ9Ùñ×M]3?\ûÔ!q7'wîÇë;?}mÝúά}J¦jGOŠÚóËìøƒ©‚É©Öy ÄäÅI’¬×ûkóÏn}Ø©"ùv–èQþ~g6E’Dû®ªŠÚ90yiV›Š½°=}<Þž å9ß cµ:…IÕì±Ø"×^H¸Aיข¡†€ÔnÕ3ÈËœpˆÓ,xRÐ{ˆ¼x<ÅHðp\žßÙÄ‘Í.ºœ·ÅÉ{ôSËS/û…“ù8;üèÞygu^~\Tªma Âæ°EǬSB Xõ¬ÍV(ÆeÃëºÒ¿oç™ÃéQ¾þž·âåórêÏeïâõ%Æ/qsL§ü·‹Ô÷~üÝÇýt,î%¯oåc/ \] XõО{÷ªó¹±ÇŽýÄIÚÊ5LCg@oë$i:¥j(Nóàzºb›Þû¥ÏêÛÎ0 UV%@.½dRt2†—ñ97L]®5»*,–rt~¢S×Sæ‡?(Ü #ê†}°·œ72ðï9·¹ò¯ß;úªæß F‡uËÿ?zÊ®‘1ÆËAä‚ÚSžª*)pYy NzA(žß”‚Ñ$ιˆÁÞµÓ¹,ƒ8BB úRε*dÎý£ñzM÷Ö¹ASW%íÅYÉKNoâÉžýîu å: ÑÌo¿Ú5ŸÛîI(ëÎ${þ6“Ó]F§Œl¿e’rúöþúúkO¿Ì¡ w2uO;†;©¬%¡¹•1Yl´»r:ÐÝ“0 %¯?ô~kºvA4ìÃ$_Õ\~ÞîjP®Ñl'ÿÞËkë¼]©êÒd3 û§»îp*ßËߨ鈞+^ºØL\ý¶_Ÿ:ScúâÒ7Xhe°\% ´€ˆÆŠ5••#Ê[`|P @ê“´ Aòª˜Ôõ»* ˜µWò×À’n°Åþæ-7Ïô«º 9¸ùþõº€?¾Ÿx^2_Äû7Ÿ6R¢ˆ6¥ÈA>»-ÌÃÒ›Ii¯;j ³vè=³ãI™˜KÇ.5:Äæ§OVßÑZ½™USh3 4‡áö÷IùØìǾòº%6 Ù÷ú>ꦦŒOïØó¸ÇuÞÌþöLÞ¿ ôSŒ—t$²W[š€ù’KíW’” éàf×yq€”•`zòX/Ö:Ùø­ÐÈó·£éb‘¶m“ŒˆÇ~émúXCuRpê×ë~Zq!lf G½ÁWÖ³s?Ëíæþ㥗щºBx,–Ç1ÏÀüKïó/vgSfšÊ“JÝWÍÛŽ$@F°?ÇD^ö½›µøéiu2Ðx˽$ oP—w3ÐhÝØoÂüØ×ÚÍŽÞFÙYüõ‚¹³2î;ÝX|n™|›³öË¡€ñGïœ4ùžÄ Ô@À.­µî†Ï—¤å¡\ éñ/–tL9šxÇIOÜ#àœ¬5½¿Ä£‘&÷¢ 1âÌ¢UY&„o½ÀVaΰɆ<Ä ß p@Û(Á ß6"c`0RA¡6OZ±Z h  Jm¡ tÝȼ¶toÅU:){ ^«°K dÒ€?÷:IG_¬ˆº?À5]¡kö±UxúZtÔ̬*ÙL% à °ß€2{ô£:¿ÒàFÅ6^¢ü¾D5ùLZö@¦úèöו+×NÓÙ-‰â)U\ÿèüV6IÆ´ÄØ*z›ÃjÔ—ç Ke'ËçJ8šü%G:ç2æg[b‰ÊÁÐ;SoåÉ3Ïuö2Ol9«âÎóZL/ñœOá‰÷"¢´'3?ß@Ý>KÉcï¹÷]<öÉÎç¶vÏÃ~;+¯{GÍÝ0<,iÜÄ™fgæä#r4ö¿Á->í¶!ëžž&ÉÜÍì£e¦¥¹X\q=TÇçrA»ép!;a '8“?³§iÝ Åôl¦¹©ØÞà§?c ‹ùÁî_ŸÑ*¯ÊçtíMçM7ïé©ëLqžcÿ<@¯š1†m%ØZÍôü€%fŒám_âQ"”]E&-G",+Z@7”ã¨ÌÐÀy#¼ jv'%œ$u1Š ’ >«í¢e5 Ø»×Ñ”ÌF`ÿ3G>‰ö ¦Ê†$©X2 _ 0.Ì—K(¡‰§ €ËPQ 0Ä–²,€^Ûé-½–FÀÝ«ÝÝ6±.( ćÃÓGú r¬L^üj8ë’[Ô´ òn¢d-^å/«ÆæîXô°EëæäÿÈÓ×Ì:ÿúcÆ5†­E­´Åv@/Ä ï½rvÑôÔo@."ç¤Ï½ü ¬\—NQxÉ×ß_]ÓÅi^8´3ÍýøåçÞé£îÝ}>•MW.ÕÖÚºCÏ+A0ì²áòš9·&ð¸kê,EàÓ‘çAyÏÊûʤÛÅñ‹G®Ùk7Õà+{þñVÛË}‰Û¹ÿ½¢:èכ㵼¢;<@5MF‡ïÐIîþÐwVÓ½·í¸Ó;S` ÈØ‡$AÒÏäWæéˆlx¡‡óžKUt2/î,“d1™7‡¬¦§A»³É:ɳ]g(j`fš{sÓû€ç¦ÿÌ6æ4}‘Ý}6+ëUï3ÌÛÆ“|s23¨Éì±lCŒ¶Ð‘g¢$2N˜À@âä9¾[½˜Wf¹ØS¼Ú àòaÛmLåòÿú0VµyÉC1 Ëi`vó£õÖ¬¦Ì$QPAMeÎÏl_Y‚·‹Žb¬çÈíÆþNvÇ¥´m.‹ã‰&'nbáz@·çŒ|9cxên÷„voYt.ó뙆i’ #»ìãŸ]‡íœ¼}Q´Ó pßUˆ`ò›u’J¼-rÿ ¹¼  (h.¨RÞš3»˜rÓ¼;’Å5ÑU$ìž&kýŸÅ­JÝ—{ädAmx¹ÓÍd®=tÆýaòÞêìóÔ4–ü.ú¥7€³È¨ø&»’î*¦,Ò¯uÞKCmØÍ7ΜBrao\¼xyÕ¯<`1<¾þ¨ÞÀ ïp”’äù´fã“2!ì 1kuÏÒ+ô2¹ö¨”QH ›ð®aà9úL¨äŽºßMÿÓqþ¾ù†ÏÞÂ¥˜çÜûz9+X;W§ºÊû¢LIyêïœRÕ[¥h‡Ûñ^ú$ÏŠ‡Þ\¼ñ=«ÿûû‡Ìà”3® ;uâ=Å÷.≆úe};û³“T?[gzjçõà?³nY¬äIÑþb ¼JS“pu¸ ÑqôɘL™­_€Õ`3÷^ÀîÍfáÄØ#ï¿æø8—û™Vª¥ZVî‰BQ”@M?éJE«Q4Šàt.v.Wkµ*Ê:4 éFô>»¨'†U§‚ZJ*RÌý«E)ÐÏ6n «‡nw²<9)o»ªî_]ª./_ÛvÏ©˜µ«Êß?ÏÄw—jæýôžx=ˆHäçÿ¹ âO®õáYªÜÞ¹±h_ðÿ_‘lÐ]cR\qÉ4ÉÝf”«»ßzônØÙµpäz§[—ü˜—Õ¯Yžÿ)â”ëv<Ù&ýì㟹ÖÍîÁË^äþ­°Ü¹›}~¾Dåcž¿~¿^ÈÍu¿âø;rYæ¨_~⛑®/ ÄV°ëhZ›+Æ%®üÖÍ!|M¸ôësÍ®›ÓõªêåéyÅïùÈBž«šïCÊvzñp§ßA>þù¤½‰ŸÛ3ýû?ÐošËê3Ãî:p ?DGùiÚŸgŸ'H;`5$k¥‘ !)®bÒÉJíY'W®©ûîb¼‹(ÅRà•W+„T´a™â;.'V¸F£ çÕBKxñ¥¨^¸KÄy6+–_µV>Ñÿû9_>,W•FC!'¦ (p0çdõðE#ÊÊ‹¢ âm_ŽÑôo%v )nQ¯Wb=D Ÿ>Ô:«Ñå~î/k/:ÕAF­R¶ZÛEÇCôáò üÞ/.ûèc/å¿U& :ë%Aâ€Þ¬•d²h4Ý`¾s´ªµÒ”+™M]™‘2é™\^ÐALw|ÚRö‘Ò Ñ©äœö÷}º%ÎZ/íí§J;Ùx™o·¶tÏkÛçÿÄî%ûk¿~)µ¸ÚŸž:çw7“©”QÍÎòåþ8ÈÃ׃ž]v?1…ß”÷áÂqÏ®f ‡¾èE!ð=³ö†O©¿³.ÃôˆŸHôô–“¤åx:kVËIÝZ;%#$4[R¨ê­‰\:í­Ì¥9šõ$†½¾fCÐé¬$~È0]«ùñaØeAÕÙKǴȹº4Rm,cžÊƒæîÊÒhNL&ÅòÈ ?d EÏ´d÷Ù$:»g·k(Ù9h^©{›5©™^Q¼xá!„„+’žS»dó3€Üarø¦<‹éËûú`r%¨¥ÞŒ¹T”‹RÑäI¦-*{R ´’öR›lÅ=9Ü"PºÛ±•HIâfHz:–:vä68Š”8Ä4‡ BOÕÁÓk"!t*DFNæݘ²¢:ÍW¬Uh4Qa ˜e®7-S MRQ =A (ÝÔyœ,JUhMmè cŒ1^qÝl›=5ˆ¬á;«2V)i4×ÓIÙŽ³°ŸT»ktÞÏ)”.Hc,@€,› S]¿å¬OggSÀæ&tL2ÒÿšÿÔÿÿÿäÿöÿÿÿÿÿîÿ>Û¥ÐG!Ths»J’šŸI_²Ý3|:c¾CÆ©ùàÀxJh³ ¾cÝüh´¡3\r ÍLªÕÇ¡»>Ù±û ¸€MãÚÉ¥Ðví6G^ƒ*ÑÚn—YNŽÛÕ2½BMU\_­Í/Þ#©)6ö3-еÑ4Å8%7Yod<1§—`?2pw·ôü>JÈdºš<š\7Oe­B±—˜X‡ ÃE£E"4.$ê1ºƒdz&K³t²ªk(Ì•³Ïº»#2Ru6X¯2\BYa Y*%¸G²‰7%‹õK ÐC 3FУ˜¦yû%'ëÝiWÔ è)£y¦A2¬¾z&ªì¨i)JÒ .¬tH2£XÌ`zF ba‘9XШ³]™ž7òVïÇ`ÀmBïr–2`d„(¥CW[µuãÀ"³dåâ! =‹Åb±4V±€jÀI±° €²Î¯Ÿ»Šx… FyØiµŒ#BbœLzi“,Ö«*/FÂ>ëe4EQnˆð_»0Pöa®Q ½çäðã0"­ùÜàãÙ­£†@k€öÕ 6À©eÐÒ¼‹W8Cb÷I¾µs¹Ò~¦ä4‹Oq ¸ò3ã[rܺՉýÈç¹=œ¤æÝWŸëë±ünh ª sôr$¥î'6jÇ÷ >O¯9(ä“1 ll_÷«êtD@ã¾´æI4Ö –õn´}h|ÕäO’&™žŠej&|ªÑwCƒžKlàîRëa|F¹WÒC% geÄÐ93,;Ž;ÖJmÜ·S„¬öµ¢{Š ©7ÈÞ[Üêû­ºô‚¹¥´*$ÜÕçXã^) âeȨVLZJÌ=¤;)ÇHÀ,*^*ÔZñà„g8A9òô+kĬ  ©¥°²8§e€/h0)Q±ž1ÖÌ4vRrL‘”BC‚„ £È € jkHˆHè]!-’¦Ð=9]à ˆÚ‰ öFÃÁtÁšRÐq I¬*b,² vÄ$ “¢­ØÀ P]‹Ka`QÑ€P¯" ¢¬ŠX ÁX¬XÌj$„VòÖ+4€á òE(£BïÇO{Êf5ë§êøp'8·tBÏì&' ïP"pÆ ge€¹'C4Ç2ï}*G4 d‚€éòÌ5Eþzã´¯oö>@Vh»Û9DGÅç¢ã釗d‚/sÆÕ"¾ òŒÏ¥¤ãuÀ£ò‘]÷†tPÈ™@‰KV·# ¯ä|URäù· „8ƒ¾ÏãO$§žRJÆ'’ZÂ(]¦ ¥“Ç=ˆUeö›­•½ùugÎΦƒºêœŽ=JÀ¡cú´,×$êÃ?*mìE¡ ™°Ãi“NëÓì~kóžìE/Å¥sŸ€TtUtV„° ÍTÖë…¿n4’® 0U*˜‚w)Þœ="4ŠJ@R‘{-×®R`†á]}©WÊaRÒ¸§b„çìŒ>HJ2&*H¥Ú== ¨ºÂª ‚Ž …2r©ÀIÚ4q M§kÑT¨Øª¢˜©( À+  )´0¶¬cM­€ êT 6ÂZ±p¢, €h1Q mà~Õ @¡ 2@˜Õ@lxd”²@€SI€,^ë-°¥aŒ^D2»öšX…0?zQvy€öÇ'[™©qþï}ü°®O‡ ìSmÐeN%œðàšJí˜ûêïsÍ3 ×|&)©R&E*ß„æøêÖIŒŸHX¯èE¢‚}ɤU;ÚÍná9Šònê­#+¸Ú––w‘¼r­©™ï#ÈkæÆ£Ñ‡™œ3d)a*?6wU(!grÆØ ³‘žÉ^!€À/P?ëåØh@@â=ÃGÞbö±·t¢J€“ ZúÌ ÖÍ+ ]œÐµ 4Mw¨$t* çX]è“SB4[K¼ÃtÓ(†\VCW –š‘d=¶Ÿn½¢4Õy㋌++¹œáB6Ðl0@ž!2‚J£’Pœ¹&ƒÐ‚¡¨ˆ*ë°ÅD9H±´_û4öãOB1Ä2 4ì“þ8È@²¬Ò€HU*%mÄŠ³‘0ZJÚ•²NM2ëF™ƒµ¡Ì¸§PYJ½ÐA4¤‘9Í‘4GP¬Óµ% h5€ ˆ YŽaD @Àuê2dÁ€×d¨ )[@€ ƒÆ"z€Ç¼}hlHÁÝÀ”  ` ¥.Ê%€Šz€žÚÕhj§:m‘ÑJ‚9ÖšX‰ ˆN‡Áÿ,}öÔèš¿}þC|èX÷šÓ´?‰€3˜p· éÆH€×b@fý pAâvª`–ÐKÀÅøM8ß¶|OKŽæ6S–„Zõ7nß~ ­…ÉÛ— È7@qãù^;h‹÷Ôn’$5…qΡҖ@†ZІj~‚•¦u”›>ƒ\' (±‰šõ³› À« ABLBy-*S›ëgEÌpu-rèàµP6²F9wMoJ󷾿ʭϥ”©/šÕ#>ž EBÒ$WCé‰zQ¢ %{ÍUê&xÉŠ×"Hª‚ fز¥ó÷š$>H¤Î­2Ü/н3­ÅóûÎ=kY'u®˜D*ÎÎl˜¤7Í]6Éö¢ºС:ð®dåéF Êé ]“å¬õ >„”wJ™2²Ž¹Jé/2©êu<¬ŒÙ9О¡I5  Á]Bš=Zܦ4ƒC€X9K½¤¾žF¤KLû<Ï3ŸçÌ2MB€>©TU á@ÉüzrQ¬Z°Ï‚T•T±nµ1#†ŠØ„c—ˆ kTÕ€PW^kÐhmÅ*0 ¨5°]Ë( ªVq +ˆ\èÕ°¤Þèt4$X`ÞÚ-DKá *2ë+¶%*!“Š:áÿðìã§Þ˜ºi&ï‹÷r¦îÓ‡=×ÌÛîsZÀh7 §;Ç£¾ˆkûmp®-ÙDùcß½ø=¹uŒ€kÖŸë@œÁeÑì0cãrž1†PÞ—•±€\.‡?Q S2€Ïf|³åÖÚ?F€‚Šn{„—¨ÛèØÍ[ ä @ EÐ>/Á×OV¼p:Åø‚Ͼµ°S 2Þg ägÚ+üΡÿqªíðJ)Ùç‚P|øÏ‚úÔ@À2‡h½ö°ãœXÑ× *WôyAEJrû•fý„‘]×uh².U4ÒðõœÏ2,q$û\¾,) 9{Q#=g¹þjh˜d*@[ÝìùiëàA:3OGJA¤«¥!]›¤Nki åšW¡sh‘3„C£,®¨4]M€ AÕšUœ+8W$#ÌY 0¶nl(£Ë `¡"6ÈL†h + (´m¬e€R£J]j‰+é ·`¬UÈB# l#(’Ѫ½ À XÚjÁŽÖ–:¬àBtØ:0›E0±Y K dptÄÒ¦k Pµ8 @Š RŒAÄD°žÊuäš’Î&†S­AST0ïªÇy |ÿ?195€wûœy>ÝZpaHŸÚ ˆ(ÕfâÐwkÁ€6ÎØ6û’W€€€œÚ’M4·È/L|:rW¨ÙÞí¼ g˜q{B•÷¼Ü¹™/Ù{ë Șf¢ €ý\“ù¡‘’e…w|' ™@Tü[V‘áûŠ `å­ë,!tU¬ˆ>£<ûºA[VUÆþš?Àrçhœ@qñË1~]]Õé[gw48ì'óoÙZ]Á®˜0åk´¾Ó'ï(k©FóZZŽ7F„ž½)ÅTúÊÃÛˆ¥r ²'§;!pG§³Y‘‘tbl‚`¦‰‰**l, Â=t% Ò#³FF0ÀõÔr빬«  ¥FŸýì˜ÅÆ+€º‚1/ñ@¡wRI@S rBtTTY4H[²p $ëêÖ AJ “@¼‚/€0§7Ê ÚPqÊú Ø‹Z$EQQ5Èš9C@°ˆT@A+F1h(A ¢–`+U Kc”¡ Ø`-€m#X^K1p(k+ EH°n V,¶Öä”<›ÈºAn dnÙ‹, ÒbiR‘œÿ8<Þ‡ Ëi'€k$z.¬ïk`v8áÖ°]ûû–L›'@zg ܰ6¦@zÃQŠ ™Ú¢Cr7#梿Ïe ¸îƒok•ë»é몔b£OR^€œÜµÜ_¿‘3Yòѱª¾prëõö4.•û’U„spr´T${r&KöâJä&¨JºîâŸÅÛÐ÷>±¬¬˜1U%<ûø~IcS¤à!«!d Þ¦+('"nŸ‹¡€ "N‡UU@ƒ¢±zâ¬AGUètXK¾}æi©gômºOggS@ &uqÖ­ßùDHDCFGUbjÿòÿíÿåÿÜÿÌÿÌÿÃÍÌÂÓ ßY‡×•ŒF;,ÿdh½HmÕX÷Ì5R.!.€ëz,Ê…d”퀯­C©<¹wÏçigâœô™‚¢;ƒ™uÔzç èÒl%X±õG . Å 8€Åz¦î|qC2.+GE$˜€¸Vl'ëI q‡rÇÅ º4¥ ¤àTé‘OλÅië'£S_¦¤§‚“$›¸€†l±ì`¬Ç1Р¬…cÁ€ × ŠŠî•ˆ€¨%ˆ€¢j XÆ †{‹‚H €R E¬¼bµÍÀ4æN¸ù+T? Þ?]y7¡‚ÄpAΘDÑd²L\Akì`† ¤t‹ea ÍÀ‹s²”x –QüfùŒÔ;ü°•Š£ñiÐÈühÁM@ï<£ÙS­ Àåïrfˆ «î­,ôBáBãX§–EÖbh"ˆ±ìœZ½‡@†±×Š È™TD}€Ç€ãîÀ^¿xÖ¬Ã*/A­PŠHªË•$‘Ùêe±Ä‚‰‰2óåtl¼¯ky×âTĈ½ÒÕˆ%O‡–ÅûæŸ>“ɆS @wý>Û‘wŒˆÂ8DÎ0Œr ±Ú!,„8jºúr¥Ö^ônÁ *C†oíNÑHòdŠÿLW†À 0W¾ñFukZÝ5öí ä«‚Q‹Ã¥Bs‚cJáð.ª*è÷<ãÈØäd‰_Í`fHtóÙ):Ùa¥.À¿¯¼#"Â0HE d?[¼Ùâ)^Kv*k·šáŸíg¡žQ‰†¹âÈÂ8ù`ZëônMÕw0å@}zûH ‚ÿV&9žÚÐfƒÌITi¨¶ªJ׋²XYYÁµÂy¥.•ŠÏ¸ëZA/A  ‡¶í Ád‹”FSk$Ü ‘!Øô^­ €èA@WeKЉ´’¿xO´ò 95U™×B±ït­‹ùöo¯ÏåòÖ=Ç÷÷×kJøüû'÷ô2k»ªxò-¼e´|~¥þ¿®ýêx…ÊRlú}äJ9`›¨S“ÆÍ°Z°æp÷†ÿõbËX² ­ÈI«;µS¾¹ì3³<ÄÇU}е›*ÛèêÊ_÷÷ÝGÛžßMò_/õ4Åâ#Êåò/?_¾È-ÛÑМŸ¿(ÿ¬uYæ·ÿ)Ú™Å$pT=ˆÛL)ÂŒR`±‚Üý°ðø?A÷ £6pă¶|ìÛÙ4ŸL³¨T¥,›.@––2`ìÍC¿ñϙɚgm¯–ÍÔ”ÚíGäšÑóUtâ¡(«söäÚ¥DBöç{Q`£Þ±kºÍÐo¹1ö¬Ùàa£ÛŽ u?&ÿtÑi¿ª9¼µ9žz«d°QgV˜)§—YÕ­gnÃËÇ.Ÿb©ø,Ár€a“©”mJ×7·cÑHy¤c þЙ†g1õ¦ì‰^Êk NÒÎc›ç«e!sK}=Z=ŽêÍ’…Ì•Ï1áÏ?›Ý"\_ à0±ô)]?.;[¯r2üÛ]•lí-[&¾K…Ö ]™›fæ%.}xÐÏÿ÷\±ãê.âÑ¿Öáß_A²m.{ìؽݧ»9ß0+)<&Iˆ{XI÷ÎñòÛÐ $¶"Ðgí>wĈ¢ÞB) PÐß/=}èÖ ‡øQŒÜð)ÁÿŽ}oàé3?sM#Ÿ}µ>U}ܤÀ˜–1 ‡ ¤5¤e`0‹¶èXÙòÁ J!”>•8”“¬SMòæ»Í$t@dÕ5$™„ÉëyÝ6­ÝÓ1]Wø°|ÖÈﲨ(ÈG¼Á‹wožNœ7–åM¾$ ¾Ú†n÷*ƒ¨ù´ª‚°qŒ½?À€ÊšÀ¹§….. ìcæc´Z?E²´Yh[@ _}¿ß¯xÄ «ußET‹»Þ½Þ„X¿®7‚\ o ”¬ƒÚÌV‡ÌuÔ¢ªÔÑšºß_4I:F©dZƳ±Ä¥F2rãM~Öm«³²ÏàƒûLå ™:k…˜ D_<ý×Ö~ZçÝêo懥‰˜o  Óêê±³tœ=áz3ìãFµó£÷@Þ|Ëuö&¡‹^Ýr$é»ÔnôlyèsÔÃìÛÇì.zq¦äÏ]Ý̱-dõðw@žg¨ý]z†CÄGy šï—–ež_/sæ¦Ï}y×å}@<Ìî—i*§8—ðsNšªÛÖU'iÀŸ/wu‰ýéF¾ú¼èa`×9óè®?ƒÞžfØý)žáLiòAï·ï_ØL$Ù@°5g–XÍ…ë9Àtä›.^ì ¶["šžûk'ÝÎô­ÁãÛl“–1À,¡¶t¾¯ 0ð·xdFA|š© }ž Oc! É-t:ƒI·$7Ñ^´ ‰Š^0_Hú!W˜9n©hCÒiëçU%À*Ú2ÿ­T±Í w"os Œ€¾Úm‡¶Á¢\Þ>]‘ë"…íB4¯¦FðÒ$¼ÏÒ?\Bâ•Ú¨¥ƒJï¡٥£r"åˆê¦¶šO›µ÷ÐѪÙTt¨2å´ûØTdXª So±|ï(ËNuu‚—ì©Þ¾¸ÍFõ`¢%ì–C± ¤.] d²¬ôõÂk«LÁðìúæ~öEËÞô áÇ+“Pû·—)‘Ù*’º Õ‹o3Pgú@O>WæöÂlþ?øäŸW8›d„¼%Ãþ|™lïÙî¸Uqv&9²âj xéfù5íÜÇ‘’wÏ\“åõ“=‡5Iÿkàƒ}/J‚Û»c’5&§È(Ûo Uøœ—$¡ûÁ™yÓSÜ 2“^•ä°abY€„½Õ0o ò~œb¢_ZøöNÐPƒ{I¤ 2€¨.P T*ZdÏ÷7í Úx:^÷_)D €JM¨-§t½`êªYÐ+²@àÞ£`¡‹@–{_æs ƒ\ ‘Ù ¾ê9ši‰ýKߨÕ í {Ætõô–Äh/ß¾xW¶lO³w0 꼿Ý@˜Á h»´½£ÃÚZý ”RZ]ÀØ7—µåW6yî¾ @¼b€ß¼¸^!CÉ6…6ÀŽ,ê^¯óŒZ2E¹6õ%~Yu])×øBžÀÉxÈø{OÙG i«àugéJØz£¶¤ -÷÷UŸÿ?—à6ãÏèò ±Š×G„^£ÅÚxb£ªHj è²åS ×'FÒöÏQÝIÎs®úEÌ {÷K5‹–.Z'Ǻrp*#yÔ3O¤cïçÃh„ì\XÏûCìŽT³Ö禀ìªÁbkÌͲ¦òÛÛÙ$§žý– ]͉c+ÊHßë"WªÿÃë¦åók®ÏƱÙ4ßÍîÞÍK— “ g%ßÉ Š¢öhß9udÀÑèÝ]ÕI'l €é}z­hFŸž,Pûo’ÞÓ¿å?¥ØAÑ{ª_ûû#œAÓ‹œYM]Õ'ç»»é1)½õ5Yº~ÓT»iÒéóÊóÑr|öu€ÁRŠ^\Îü= û›Hˆ© ÿTdÍ­ü`ž± XeðÈaüC4RœÐ—³@3l ÖNbéi }ÙÀ°‚4B¥@2ƒ`¡`€PWž:ž”Z_–óK¥ÕB˜t!œ—øþ?M=àý¨‹ú€ùln¤?ðƒ÷‰çzmNÀin]NጠÌÑ/ ³P%ª\99¿ò€ó°cÀ~2ö Ÿ3’VHÇ¿ào;…öæ›C€(£w…áÌÄ´ƒ\ö&è@<é…›-òŠ(Í“½í±½ì¡x ñ¶O¾ßF…ÐB»rì鄎Ǚ¾Äi¡…ÁCûì]c.aá\XwÿͯeP9^yȪèc¬qç1yé0)÷„LC¸ÞµQÄÁÆ+?´¢»·É¹ú}æšApŸã­ÄQxù3"öÜúŒ›}â ×é&Ǿdý’_¹q9»g1]k©Šõé]Ý9""ièœ{’’ÞÔôÚäÕn ÀñUÈèɆÌÑJäÛo§éM­b<ô· ½ ®kdË_¿™É(˜îª·/®™ î*ás>GÕ0b0…ßÿñ=Í7ºmY0Ȱ¸‘å¡©ÅpR‘ä}tF0©  ð ‚Ð ¬T*bÀÀ Ø„@òZQ8_ 1ŠH Pn~:îüZ<4ûRQ\à¥V”â2½¹ÓàyVý]úë=ðxh[è9o €]cáï77 ègà¬[МÅ6;†…¯ùʈ€K`àËËO Á6ó´ „ÿ®èÉäe`î[¹˜| „ë݉…{ Á¦ž%ÊZ3v†¥ÒyÉ>Ú7?xœÄýÏ1èà‰¼¼¹¶Ë¢¯I¤#ƒßøõä} ‹_|¦ ^ý4â É”$ªOØ¡W÷WúVô—öZõÒÝ7%M 2²Zøël"€µNg¢[Ÿ`fêr.»€a—þÈÖMNže˜jÝï¾dçÖ4[C9S–× ¡†ù°½: {NaØU(É˃šÏ‚· ‚a’­Ìéá×GÙÌ1ì{¼‹Nè3ÖÜLJZTeD²³Ù= ý¾Ãþí_Ù¢çÏ¿ùªòà2i^Ëâ…61Pb’ïD}e®7Iè!ËlâÞÙ ¼AgS Y yƒ³`é¿¾Ü æÐÂ&MŒ//€$²#z>Æ€bhÂ- © `†Aà?'¸ ô—À $OggSÀ-&vp³1Ëÿ¹ÿ£ÿšÿžÿ¡ÿ¥XS_b_ÿ×ÿÖÿ~:^Õ¥[º»%o|*ð–J;lq™ìœ{’üžýá&¯:pc&ï—!.8a`zpaLx” k»ÖŽ@N-·Hhc݆Q?E&Žt%€Ž¿ ÜÇï>„S‹y’ý€Y^ŸHá#>æp£ÏHðGö"¬  q–âÀÎQêï™3xüŽ«‰?²q–ßîk ÍhÞá‘€Çß@ã¼»|‰$™ç¡IZu™,zÅð¬ß;îÑž¯Q1Èà¾løÛI,ò 1àÓ;KÎ<±ÞßMÙP22íù_“h;ëÃì$Nâ·.¦|íÊá)Àq†drrѤžÈ&,”;^rš÷Þª·) ¨kö1&Zo†_r¨¡Š†é€¦õ¹ ÃZfpŸ©ähù& ÈyFz¦H0TLö{<ëLÏU P‰ )ö€£,ã½'ïI ¡ 2 âåuz&λxÛH®Xõ“[÷•}†Éh¨YþÀ ³{9aº×Mƒ6ݬ½@ÜœàcJ½ À``ž*Þ­µX6¹£hú“ßh5â5hs*ŠŒ€?À]ê£Ix€ 0>4Ú ö#°âz=á8dýÈCp‚Ä\Q¢Ö˜$ “°¡á $F_>õ‡ @Ü"€¸&š£àüX~˜ò€çˆéª2—öâ9²JÖû¯™ðÈ>îZ ‡ÅN°óµ [K3¨œýõB{%CÉu YAŸµé@ÐL¶½Û¦D9Lè@¶Ú$šnHñäoŽ–=Þ]Ÿ8 `‹ó”Ç#ÛªåJŒž@iúª­±Þúkìçààbjê©¡r™k ŠÇþ5ÓÕ·º|Q 9¹W–F @’$Ë­&4.MÎ )]ºïAU9 “=œž¸cetS¸Ò”г€ñÏ岇j6G‘Tê–ž&,ý=EÔEµISn½‹¯kg\ü‹ég6e·¬ƒ@“Å4³“M¤ÕCÝN$è]kèó=jÈ,º Fæ’#Œ¯ë¦!°1à \^*ž¬ëX§b¨Ãý)­ÄIp/bJλBA3†gò´S{î ÀÇw~ººÁ´¯Zਞc¼/Ò°N‚„a|sÀ­6ÎÀÉæaÀŒù±¬ å³ËZUƒ$ Ji½×8“æõƒLô¬¯¿ðUg7xU3oï=ÆM1f õ÷Χ«x€}zšs;€ð2!–ËöÙéâ ~4XÛŒ0Ú?kh¼ 6úÖž[›XƒL(ľõÝûÚëcOÉÁK³ûžãuW¤õÅCW¸”ÀY\OyØo¯é\¯õ¦€’  †ˆkЈeCµ w:ç+"X1¼—ŸC‡ù@!b¾³ñ²‹rõ¦‰ýÿË&@ßÕ,é…w…Kwæi¶X/î‚ÌÙIç2!!du= '§›œ(ªëµŠDÌ`•— hš¢™\¦bg@EŬì3í¦3¢²iÀä]5Ga™g2v6è??0Í4Æ ¤Ds !Â"p~9îÙí^2,ï^og^@äòZ¬m°Éó—î$\þÀøPžVàsQ)¸Y\8åJï›>l ˜lóñMz8ªë€ûÉ\¸kbß¿™ªŽ„ § ®$@öíñÎÀ¨€èf³àÓršÎ C<@y·)¢ßý]`@þR䕇dˆ@ÐîéžœšM-d‹Ã[CÙû< é?9Æ™ñ½=Nol äÆ;g˜Y>›¡.Ñ-’•'–òݲò¬ç˜½f³ çZhñ‹§ òö#‹ë­ðíÎíÐà0-íI© ûßú^:Fæó;Ÿ|VŠsÛïAÂaV¼ŠL/?fó-@A1çç¡ÍW·¦^-@<0ËŽ†ãÉ‘Xþ”³ÀáT ‘ oŸ§!‹Is]#FÕá†È# i=õ|Àç}×Lª ÈY• Ö\=Ô0Õh™f¸BÛqzSˆ & t;xûOÒuöÍÌ:Åà<È£0=*áH Þ9ž3wÏUÿ¼dw¨ß‘W\#lp/2zxüü8®= ÞÊt# |pá¦ò €V_øàÍC$@3¹*tÁØN€ÍóÕ|Ê$ †óWŒ°¿<ùWÈ>@¬| ™;’RM¶#oàÈÞiÓŸY=ÖÒùûËçÏúkƒCd@ þj=ÉASÒh³Ù¥ •£Å^Z û=ò4Ï J/$©¹ïžæb$O¬£Ñ!»|cô<·(]×7—ìç²)\bɲ»î ö©¤žPG4]R~÷ Û±ë2p€œ'¸øŒ:€èÆp(a¶§;LÑOù­Åªö bûãÇ“ªrúÅ@|¥ÐÌ@& D;¢™#o&¦C ã1B䟵MéI¦r¨.õaÈÜT¦ )Z Ùê '¸þëû»ÂŒ^è(‚´H˜ jy\·š7ÒC“ã=×U†·õ(; €»ÞÉ©©}5±¼¬p Ý8¡!À46)Ö¹Ï{a>§è–,&ïje>b„“~W5#<þÀð¸O‡î%âdà „ Kí>Àèq,´Ojðaw/ŸÎN˜®°ï‰¿èD–…‘$ Â†Ó ]æË9çœ|˜ù=cœëŸó5»&Ö^çLÝœ;I8?Þ»>æX¦gU2ÕX2k¼£ˆˆ+ßÖ¨ûɰïÐ"sû\Ú €¤Að{ó£ñxÊÁ÷ä`~ظ’º|ͽEšíÃy9ç …f¹ùk¾RFJoàð™‰Zð™ìôz½©‹¶é½gw+ÿÓ¾µ´ÆºW5ž`#gÿýÒ´'O (Ýã+k_X˜ÝDèxG§í!wüù²ˆˆHþ”AÜÅò¬Rß9Ãâ©G0—Õìõ íôVÉ7TIÖ1ë´—B0I~Þ€öÃ:¸DÕ  þfùóZFÙL’ICã€gq¸¸XÍ0–`æ4#‰<Ç´ëÔj 4#3`&ÏË©Î]qÿ†ƒä3°u‰qèä‚"lQ: VÜ’ã·Rô2ùé1#©pKðØñ§~€5Rº€¯LP½ é÷Aû$–O~—÷®Æy%¥EñaM)ÍãE~›êtzÞJï²°hìÐ^Ƀã0vÛô~YbkF^çüW©Z™â¸×ýºs U}à¦Ý q,tˆWvEKa«VUU]VªÑ²,ËÜÜÜ܉š†ãp°%Ÿ"‡†Á^mPüb1`J&彨s‰"JUÄgì`ÜÓŽ¿üБg›$ï Ñ]£ÔÖ¯–¸•"±kÒȳ–E¥"‚³|ƒÓUö„Ä*ÐYI‘$‘u‘žðýï©VÌåå¥ [– $ÒèUDm# Àýäœ:0øOÙ ióÒ¿˜£'Zý êJqQë(µJURË}i>¢—e¿èZmSæ? <1¯L´¼Z¿½ÇŠ—ü}©kг^œçÀK¥þüyü@>¾3$sƒËS0»\É€$#¨1çl#Π/W¸ÌÌñ‡{)—|îÛ§VPŸrÔªqéãIjGü8Êßå¥C}ÝÇ>ôu:Ö\…Ô«óû( úå¨' !?à#žSäŸ^RÍ:ëMX€ÈhƒË|èÕna¤QósQoÍ)O3Z£%¯‹À—çcŒ­sæsd#¼… ©a–U{|-ý{‰}j­Ø™áõá«Î VwTñw¾º’½N>“çYfÆâ—\µÏ×6¼v÷uª¾xuàü¥sKwF¯ëõ¤÷x=®ªÕq/=‚4YIÉ$|¦Æ2bÓˆYV=ÒÐ&*c oÿºLÏD¤´IM»ØÇ"LL±& rDfÑVgÖæ¸‘¡rr䄎¡Ö`¹ :•‘E2zzÚÅ[ÊËgG}~Ýã™l1ä¸ ß¡¾vò+€žyfë×ÉÂíÀÏe@^⺑N²ÿ4(¯‰@NG€ÁíËØ”nÐB³š_sÐ ˜BúIÀ°ˉÃ+ ‚'|1I5ÕÉú⨠>?ï²æ«AãI4‹S*ÝÚžë­XCó‡ ÷›mNCÔad ‰è=›§§AJS7&€oœF‰5×<Ù“dóË9³J×L£•€õN_¯¥w8øÑ`þøHà#WÇ©éUÒà!¹ú¹I-£•o_6I+Ïk¸jue>ÛU@ªÆ¼jíæþí©ý:)P×+Jã~ …ʈ.×–TŠ*=@±ײÁ¡õ}4•T†šŒ¢Ë5%Ó Ëö_02‘ÇÒK(Õ›;?ëüe fF951±È9Äg_Yœ:Âô('€dž8N^|ÿ²]Ö•òþ Õ›F›ÜŒ`ïSω¿·‰ˆ`ž6ÁpS9‡YÖ¡š®Ãÿþ5N0wÁ”6]:m¦9$ÖÃÆL›2 ¨äþŸö9I†$òù]™@Qáåò Á#”‚&“e²4¿^Ž[Ê›„ƒ†‰ +ãè$S‡yÔ‹“éŒà4•é5ηúáí AA®j`N½&HzФ ­·ŽaXŸ-KÁ«6€ 0¶Ðyþ¬havSq‹( ^6BFÄ£˜&@’¦@±¡2 ÔJ”»Ð`ÐÛ@¢ÙwZ!Ò4¼û@߸m.– °1ÁÖVP~»íØú‹¤ 5½Ô¬†Lýa2€Þ‡¬N 7ÞXd´¯ôøø©vX4ô¯×J<–oûM»ÛÆðÃj®RQÕ ¤Ê½+Ÿöãç¹˃ñ-äÛùÅÝgNüàJΘŽÖº³øÊ—LK].mνÎÃngf¢Ž|¢X“³è­@¡Ò>û>]A®JÁH‡®’<éUR[Ø PÌ¡UbÌêP~V‹'D£K‰ 뎦pãoîìÉ^ñ \.röÝ›‘¦æM˜&š·Þ—ƒ'3ßÊî0ì4¿3:w$çþp07ýNLCM^0ÐõLç^v‰JtJ@Žò•ý€_OggSW&w¨ÅWMÄÿ³ÿ¼ÿ¼ÿ³ÿ›ÿ›ÿŽÿ–OKJNLMW o.8ŸŸœé=ONr6*Rpýæ*êÉär"Zåæ?v@I‡UðR# g²èŽÉü»}ÌÃ!Z;êÊkªxêeuwþ LqM ¿ãíºõ“g2U9ГL}L{XúNÎÍi6 TRäÛF‰î‚Û2ðP0z%À8 nQ`¾€…@4… @ê<@–#@DhUt4ˆ„ X:ÌCâI+ü¡×S+H2aˆòQ ›«¾“·^|>8 ÞÊ-ÀeP€Wª•À`ÿà+À•à”ƒ®ìsŽ6ÉbÔj꺔¹RšLDÜCðé—g ÁsŽEO(\oMô’uwWJ(Í.DlÞ§™¬-%±DùQ=¿­ù/[̳ΠKxÐ\A †vè—¤íÎsVm‹En¿—B¯†ÑÚIÃ4‘ÆØï· HJ{©æ6¬ ûc«ÐͨuSÔ"Òîpé­k¼wì¨h_þyèRqækQa×ÏÆÜ÷4ÃDžV6t ¾(#½],±³õ!÷sNçìÙtVŽ—Þ ²z˜$#ƒ1󓦇»I <Ì›îŸçWuiÇ0›ž#(½MO~²t 褊,GOC9ó[µ¬ ½¯!ûÇÖ½ <&o†þ“ódý˜þðˈM€è f?ü¿_ªçªdcèš’„?qò²‰Æ£Ç59´ìÕýÛôÀ4I*3n€Ë<Üz¯ÛŒ¦ ‰ F">:F, €_1ÈÏk} q1:4¤Î… , .ƒÌÆ pË ƒñõ„)HŒfXžË]tIˆDTÐZ ³Ú*ËÌ…‚ƒdÞ ¸A»ËE×¬Ú ¯RG<è@‚s 8@ƒQŸXÖY_«© ¨ ÎOçÉr¿7¹uÕuü¹A€œt¿ãiA=YÜqv£#rV¾ÇÆù¡ÓâðØšŽ!—BÖJ7Õ&¦^ŠŒÍÛv¹´ ñê,zzŒöޜܷä5Nr ݲÙúƒ 5ôG&Aå}‚ªRˆÑ‡̱˜ÚMSE2¹.ÞÞDÇF¯rêk«€÷¯—ÚU$éF414CGXU0 (j+zI€þÖÙàžOr`@d$vSÔÍòGËã’Ç9MX0ïþÝfp³«£æ¯¶¿v¸òùÖEÇP»é "b gÞŠ³°C°þŸK|ŽCçéMÖvÒÜÉÉÀ@1Ñ/´Þ<_]d3ÐDguAg§¨_•ýþÜs¿OÇgÄÇ“'¶»"†éáMÒMEÍ>ÝÓT`íG~ &W„>ÆTÛ`€8B9Ha¨=V±BwÒ‘B M˜À¿nÈhèí S­8d9_|S÷í'‰I!=(^ûírN0Án$C*7É2³â hcøÜøÝ`5måb‰o]'¸b¸1@‚ëÀlÞ·~¬­7™ g `æ&’’×?³œT¾}Û ‡º†¶#x#x {“÷î5ùÈ J}ìZ(y BûÞ“ŸŽµê•ÜÍÏq/dFf³IÚJYB6óñ¨"C‘e]©Žü‹lqÊÿéœ+˜¦”…5¿‰Öz=…3¨–Ò œåĺ„UEK¤ÉlÚPŽCÓwr5Ä+DjyvT¼‚M:[ôôì祅(ö©z¢ÌšTÌìsúY‡‹“3‡f?é.`„D†f*ûÈpIúWìv‚ˆ›žªîè왂ýôy)ÙI6d] B“€dIÿšb‘®ÿ¹Ld˜™'éPYC—/§)ŸÞ|[s–êb78aä¤AS™÷»ógØ$ÄVC÷¡§÷¦uóËã¸ó΋’†R†wfïdW÷Ç•'qøàÏA 7þŒ¨@øiÀâé¯`ø#¦ú¬t€D"æ,Ñ(`4 “ ù™€äúÀ¡4,@P^ ^Åå #JÆ5Ö;Ê)˜‡H#~Ïím4ÝaÌb¥MÍq…Nø¼ KØ>l‰O{V`Œ,l ­u‰‚ˆH 7ÑèÈoÿ–|öói~㈀@ṡ$x¨ñøÉ›Säâ¶ÙÍtÔÎR˜xÞ‹d(_^ÌʤZ‡þŠ ¾9˜Pð¢B™¾°¤qçCØ6>IpÞéê¤kO^ø¦·@7.¯Þ(–Í'K½0övýÙ8TÞû Gs6O{ßІ/ #  4DÉ€(ï+$d‘\쎕r|~â©CÓ„Wº6ÐÜSy(Ñ}.ñ6„À\873ŽýЕ”—žhØR+xæëôÐ0Î2Ý,-•{YºÔE“™u¿n˜f㢟)@Žak‹d ’‚zÞ”ks Ëá1[[# ™æ\ºè¤€€JCOgwå‡ @¸Ò$SQº©0tÅœˆaè0`z^òØ€± Pzd¢ç0;¶V F°°žû]Ì÷E2ɸÖr'³?ˆRÃ'N?¤0ZÏ?ðæD§ÏÒN8ûð°€÷•ÉD¼c¿À"¤èŸ,`æÎ. í˜ ]Gól„I6\p m}ÚÅëÙAuï+·¨iÇ–(D¢—¿ídÂÒO|L‡¢%xÈ>õ°¨/´ääÀP²÷i ÊÎÕpãiàYÍkåtì¡·e€pú¨ 0µuRrS®‚j¾ ¤˜ozecý¤£X ää·«tz’²ª­ õ> pèÜ;‚ ci@µÇeñ'ß7ù!;%/Ñî8ãöET4râÙ¹žj¦ZÒk5•ÙóêC+‘U) ¹7LçÈáÜÀ+Çæ2ÂfË&q¶]ínzqÆ•@‘¯(~¿ŒœRW @¹T’´a“óL !«j º` Uô•¼DÇ|Ì:åÓ-À£ê%LÎì.&åŒ pÖô”ûÙ‚n)$ ™Z!à\)ãx–£î …ä%´€(û]ü½ÌMñHÊ<² ™Tn”ÏRÄš:Í—€¯× te¿°0g?sXmˆ6T¨2ÉGè°v覇‡[Ø›’pSJ)|Ku÷šâ Ã]”Öß·\lçwÚßDcSõ£VPâÜìTUyþ§Q0-M<¥›¹a;}ÁàC¬;ðyž^ý{öíxêï‹ö_{Ïò>çŸù¤.Öʆô÷rʵfþOŸ#IDw‘qˆŽ,\´ žŸˆ © ë½¥É3ä0}f¨ˆå©«`³{×~™™€Ã6z£¸¯óÝê϶’Ñ¿ ûD ß½¾O0‘JáxºÇøÓtOƒæŠ¡(°´Á¶B´7Z$4Ô †KØ4.úHž_‘L3I`}è$6ÊÑ{‰éHÈ_#ÝAàFŠ˜&áØõÎâÝ’3PÐÓn€ŠÒ¬Æ1A6$ù>ÄÅë‡$º§ȤYAôp¢4Ð ÌêÃ&€N_Æd ÌÀC@œ†åņŸóHÎ1Z¹øY²ç­SÒõ€|Rs 9Ÿ–î`ûšeüY,ßÃųæ’Ü[é û“sïW®¥.M°ºg4Q î/Ó*C¦!’Q ÞgW¬vÉ›õ’….8W*–<<°Ë é óÉM3_Ü\B@vâKy¦•3éÐ øîk +V;K±›ß@…;ßÇG@ƒI"NàɤŽÉ›F,Âp¨T0|“» ·=Äp™B*ïb«K Ÿé‡[6®!QxÉtì]Äÿ0cä uøx‹f\Ñ™\J½ÅЉ(àõºÌrˆ ó'ƒ%„qŠEžì’ ê!‹ûªR¼ø0°n 9uÓÕ•³|bJæÓåOÌŽæ®ð#ºüT‹Ìw7ßE/ÀS)a.Mê‚ 'ܼûȬÿpÛaå‚íP)~´:å¦,â¿-UV0úcÓÑü²zˉúþ5³Iîýü,V¦‘ïSh÷=„œæ•ŒQh`ä,´rù›'òi€|ͪ»=œ¡ÞÚgúýy'ŠS¼:®µ¦¯ûtˆó;êï3VB;2ÉLÑõóßâ®Æm€{“µHX¢Ué€ÑÌŽë›'ÔÐ4+H½õº7 Ò,pg÷¬J˜ €k˜E÷yô?öœŸY>x~ž®³JuHvŸ/¾Rìò±¦WÙœԚ"¦D*PßZܤݿ‹3ÀúlOggS@y&x„LÁaVSRWE[ahÿÑÿÇÿÁÿ»ÿ¦ÿ¬ÿ»ÿ®Ôbíi KÇ"cóØZªZ 퉾ÍÏ=QÓï¥õ±‚‚Càº=%UI#{ÂÃɇ2ŠÔ:6 >°nqy©« •2E+‘òaUm4 9k)´Ö¡¢`¨èºÁ8äŽÝMÂe:nAêë—ìºL†³íäÈ AzÉÀvÛô_ã>Ť¢•ê&º./J—û6–ƒ°ÆÂ¸bTÁm‹€¢×™„ÑZ…SþQ`–· àÜZ‡±kÈk®J™± óC5«ˆ}€7çh=F;b“'ÏÓUkÐèE–E‡Ž»ÖÔ‚ÈÊZFBÄ¢§,K„Ë¢1b‹b+hé,,Ô~McÅ4œÕÓŽ{›eUã6œJ:Ï °´`sa£æÇBN«;u'0Æd°KÆëM(¥è[‡ªn%ÛRÂæé –/:\0 ¼Ö“Å…dDiDôbmήɯ±Rà4\:aj)§»ávýØ!†’ug´ýàÕ¥³`)ëºJ‡%˜ÐVÚc  ‰yÌ€XžwÅŠÀ?ÜjM]Y ‹Ûj…ÉeûÁߣS×»qÇV+ü8ÜAUFYIÉyY+(“u®Ñ*¢0K©¶gŽêõržíPt]w©®V«cJÅLLÁQÓÜw%_v©<>7}õ*ÖÌüR#¢¡ÄßhÄÀ5$>í>S?Ïwê¹-Š‚dÏŒÿ£k)E•wäó±çs¡ ù÷8þü܈ù+ò!]xþn£ß„e>•ëñ-N§˜Ù¿~©xa>ø–CÈcß}\«~ã£-ø&P{´R%ó Û)a1wjDÈ<†ûéç«ù%¶¨N¶}³íÇs­«¸|¿^¿NñöQ/_or(üü³xaù:¿¾Õåsßï}¬yïŽÒþº/¿2?¿>äB·b{åõ–§­–~“&–ÇvœÚ¥ÌaF? G’®×Ù%xDo=¨½À‰8.ÌåèÍì¶ °6†_;êë››Yhh;T€%º%K«Õ÷½ä :—þ§/ãy l?nÁø+Íz×=€“¥Ë÷f=o/çÿðW; ›ÚÚ4±WP›œ+ñuØŠ°ZU–C‚môzKÑ‘8&îŠUÄ֢Ьq ÂhÂÐPD‘Ãç†p¯_O¯´§¤·„G°û¨¯¨¡ß˜à^g‘ê=Î[_,$Ñ÷åYÀKЩ(ºð×)ïGëÓ]CB–³§¬>ÑòÒ¿†›¹} :]Hæ-‡óÎ%:z*§ Ÿ‹®3õÕTvOjg_÷@“0 úšig† [q<ÇÌL ,ÙÔ¸söÚÝù²æa€ÎQ Ð}“Þ(ûûB6 ‰—â)ªÞ3r‚gæ!ª¢rv9‚áx½£¬Eã¥I÷¨¦Mn~ÎÙ<Û‡~• î2Õcjš}cZ†@ Yºè6@ÈxÅ ãæN×å%õ€îÑbÊKi¥/ +#I,©{ÜÄ6™ó ”è]†º(az~}¯êáÕØ¢" À–Ë·€±xJ¶¯é2);ÒXj-%€Bã¾Û¢‡Hj{«­ÚaE¼ ¤¦÷ÆÑgv#£ý¸ZòÁRà+Àv %ÎZ°n€Š3VïÛZ½¯…뚠ħ¯W3a?Ís$Ó£Ÿú°h>„@»ýÕ „s„Dó®…³n 6$¤7#/PÝQ†î¬í’ëŠÇã}ã@n2s6uƒ—5pÞ×ei4Œ ÑR*ÍóõÍoÅq™*çìÈœ ™-2  ©ÝíaHÄ.ÓºÍu|c ¯‘5 ü±þôãeŸdŠ”  ¯ç)b¦'îIx5Ù Ç °ñ^Q]z„`Rãßq°vºæg4 ÿh<ÙYöÍîÓÊ)˜¼‹œ®%¦{ܘ^5“?¹¯—ª4}oÀ•ä,î6Ô§vÜw®—Po{²®*­·‹ +Ë=•ÝsžœÎù∩€ȦÉ;`©ñ¼S¿/_ =@M7Töô¾¥”Ìô x†D€}>DÞèc `œ½" ô"€’™ý­•S*™6@Œzà`ÐÛg`nC‚FÈ@,d€i€©¿(­¸“`¡@ˆ7¤ø—,ƒ·#• ¸%cŒdmPÛ½Ÿ„LÆã‰È/W» D)ü?€^éAãbÀú°ÀÕm‚óm{Þή£YMCºfLÀEBFöú(=>ï}ÎUêõJÈs{êP_¼£ôù‹H¦‚­¹+BŽ ox è sΚ­Ý8ÚHOí>÷Ü~œÝnhÓ£´‘qÞ› s °O/›™¢yÚ³ìãO€ÙO7g,4ÒÌ–žž€m¥œô2>ÕXVÀ€¤(Í*¿rÎa¿Dj;ê¬JuLx§™ Ë›×Æ’”Ô½½`²¾Ùµädæ»'y{]d÷îá,LQúF%6m•®®IŒ”Žâ™{ÈÞ‚J" J“ÌZtdýT“5‡hÝî>{5¥-'YŠ©Ø¥2—×D# 5½> ¢ p'$·?:r®Ý7Lôp•†j–UÍdžéªMv7¿7ùZ•}®Ý/L· ÎßÇÅyç+ï2ÏΆF à  J<Ô GÓJ– ü½ F©ÚÉ‰Ï ´† ° -e÷K• ¾4÷.¯k%fA¹Í蔘½„ äƒñξËÝc‹ 1xÕFÓæt€÷X7ˆÈÍ«À,¾lÂ{_†…!¹€°Ý”tÂOaïÛúz‘†qTI@T0²L–%¥ÛéøSpÔG¿úÎ×›‘Pðâó3‰¿½êc–\ ­Û€§=k1?ƒŽB8 P³TUb$àÇŸ4ñ.žÎoz÷WÝa?|h@ËúmtõM:³Ïø[0Y½ã—ž»NᾆæGüˆ£š±îh±È3#óÓÀ²¢íO)ÐêÙK1@˜ƒBM¥û œÎ%±oY©td2ôé÷3aÈØOD“sPèqßÛÙ¬³M?ò÷o'˜Nh 9•½)ëGw0û3‡Ð ɽO:O¯=™ô–oÁôMärQƒ—õ¡7E¾ä¦²ÔKöû;§‹LL69ÕÀô¨hØ9“ßë\]š UÓCôK=ÚýE„ÒÍÀ@BÓô¾˜žxNKtÕu…bWï&%óQ¯dºóGóB¸;7ë*FS/»w˜c ´¥µKš(ƵCƒ+_0(U‘³‹´4¬Æ€ùèL`i#ü$-/ŠÂZI€Ÿ 6ªåHÀ`)~ûíi™¤l{bµUô™ÐBb’Ìü Їà+Àë³Mh9±¸D \Èwזּ1›ÕÌÔ«4qHTÐ49Ÿ3¢Üûv£÷7:Ê‘óÛcÙ‡áf(Íiª ðCTݸ_æ*!ôþ ÏGA€,E̘;²BX ƒ/2ueÊ3€A>ÄŸåÉì/{Nÿ~~D8ûé^ äLÞüz+äìÈ4F:€jèÀÎÔ±uìý¶jà ­U%Ÿ]cÕJ(ˆ… nbé”»V sêuÚÆ¤B¯mN÷ó2º ôkK«í¥šÐï8¾T9EñÔèöh–Ϻ£ÏDϰgp:‰8ºÃä„FØ6×7‹‘Y#º¯E@$Èxg]7êh2€†Ç¦ôön˜„¢˜(A2Ißús4}ÍV±ñÛç € Ùç“™_&Ž€Âéÿ+ðU‘S6w~Ãq`/t’o\ø˜ 5T(ö0{¾!¤SøJÀ›æk0ˆ°ÙÜ`ÕnéDQ%‚m% —*ƨ žû]ã#‡$ˆåŽtm d-xã™Ã±¦{ñâ¹C ‚&Vt€Ç÷!'ÁâºÙ·K>Iƒa®£Ãï“pEN d]GgNÖMý¨Ÿó2ް-!:¸Ìt2¾”g $ ÇÁŽðý×Cå×û(~ؤ`TìCö|.~Ú§ óRë(–qAF·Ž’ïö²—žL8<]§‰½´‡ÕøˆâDˆÐ¬àáFY¦ç’ “ܬ¬Mð¦’qÀ!¨ÅÁÙMÐô•¶ÃXQ¨F€¬ëÞþ±œ2ã~)]ÅN†sYn˜°Œhï•ëÐL÷´HÁï‹/q5) ˆÖ[yÍ€pã+‡ÞÀ:êl¤C"Âz2dz<óFQ=O§CĽF]8«€*)¤ÈÎôë*Ù \J˜dȪüu–™üŽz Ä4AœX(ú³!@f:£:ûÚGnÝ ŒC¨5‚@…Ò5¤Ml€$*’q|Þ¨”G¤ ”Ñmò0€%‘Îd¸0P*€Ìp3çužû]Ó5F4’gZ?¯s.w6Û”gÞxú¬yÐO¾ùÖ¯§Ø0_^Oæè æmnàÀËv³rgmà†±Ž‘†Àð „€cåtsŸ'Á÷¡ê¸Ód.9¬ôüµ®Œ¿#WN8Å`Þ“é¦<´ÏÞfWƒF×8×+Œ(Ùö-ö–¾G•Kn}öíõó·¹äÉ´jô(ø,ŠG*!#šg)>xßz.(œê1ûá§H–òV¢«ÑIX°þ•Yôó Èo ÎÛæ@›„+ü¹¬Ý+Uc÷ÒÂXfQ¨†ê^Qð#.†ÀMkg#®G§#ïnr™HÔkÁL dDÓ@ÌëÑ©Àf v­%[B$øOÃdGQP@)6Lwè‰ß€*×=ÏþÙ‘ä Ö ( ,áœè˜ˆ„KÏÛ/õP@ìA”'œ31‚ôHÆ}]6äÝÅ×Î0€`ž<ŠbÜA{=¶`i°j£M œ Q€e… ´YÀ ¬M° Áë»è0Dqz˜" ®ï¤#>ûÍ=ê…Fkà›ÍNú‹pøè†?¢þ–q}ÓÑ Ül.lùž8ë ì}0#­IEžp*°ì^>7û"ßX•ò°ë Õ(?ÏKänkw§°¤Fyv‚Æà½íw—…Þ0]Pÿ)„Ò´Dë&€.O—j “ ø8›žE€RÖ]‹Â‚‹0‰!ÈmnÃÂ/gúÔÖÕèÿÿjêz­¼î+⎠½–Á][çµ¹Lè>MéÁïMhÞŠ£o%Fã%ÒY€dÖæ±P±rc1½sŽ-›UKo<Š*Óî%k.dÓ@Rkb J=Ó“(PPÕ CÏ« ¥P*»6Ù£U…“û˜¦§É(] .¾žL(4@—xYØ `Ȳ¢!1À ´(QTf|j1 äôìºÕ  r%_c) @mTÏ»Ï1Áº˜„`È¢ÅÎF Gp€g!`€ b` Óš% €Va/Ѐk u¬5€0`¸2A{wºThô˜2PZïeiS¶h· gk†¿nˆPÈT`Ž4ë+mXt¨µ+øÄo}ž°QA F½sYÖI†‘G%”¡hÔQ(P²úêPuõãoZ@¨,<´zT^QÖö•>$„G ¿€¸õ`~qH€ûMSQ®èqUæ+f%5: ¡é ­&Á~UæÇ¶V!ZȺZÛàH¼v& ªSH`HÚKP0ºUmÌq@§;`2h¨uèvMSÿ;$ÓÕ“ˆh…î¨PÎp ´Ü5Pëlôè醀œFRǪÍLc|¡u{¤„™4Ó&¦š¡ÙXà… "«Z !àÅF1( ä@X÷l€sûÝÍmfdb(!9zn×XîäîIb±É¤¸ºþòuD&Á7€8¾ž"W®–n ‹ØÄLa3Y@¶ej€XæE‚Þ†p\Ç@dÂCìdLïhwŸAÙo¼ý¥Ýˆy([FkMàÇßmgÀ‹ß3„Ü,øÅ°dJß1R ‹Î"çà  døccÛÈ®¯FIµÖÚVæ!äô½[Ñì!`ÎÕp^ ‹nGDÝcZíΞI(§¼Ï{4-  /Ö@HK M"üÆ`âPÀ¤Aôºҙnj²RLÑ”¢b€€•"¦[ˆ"@ H,lETu,€m$;¶1°’ÖeoÑ€b0 è°~ÀžûÝã5ªÉÔrwyD Áá2¿¸ãà$&ùpN ¯~K4`vxn·_”óÜÒªÜ R¾Í5¹A‚:# w;šâ zN`Oåµg錽~òøÊû§ÞÈP»ÿ)y Írßåh耓ò«HÖ# øÂÐb¢¢åXÝñ§§‘Ê{Àx쯧q`ü‰z-1MKVòl*U¼m¥%D€JB3£HÔŒC\zŽ1G€-çAÁ%=LÊø ÷*Ùêé¨þòÞ³¤§P–ƒ.œ=Y¶p€¾Õð܆òÈ™ÆÍÈÅJìܶk$!޽’´5 ËJ¨@ˆ"@½äþy]VÜnaZƽÐL # +0x€g0àŠ¬ÓºU2*ÀBʈ{,ÙY@?hKÀ [·ÐÜš P` eˆdDnš¶5,M°³$`EFa'@F 1¥n1€"I&€€˜$pœˆ"cÛ1‘ Ö-0D2€G ¢ ¬¸0 ‰vú-ñRl[Qß ÀçÖ°}[¡‘àÊàÆ—1V¹–ÃŒþàÕfÀ“ázNÀÚo-Ü—él9'ñ*Êi¦¬Üp}›3®³ZJGnZ¢unëö ó¥ódÓõ ˆú¯¸9Õc×à iªrÁd‡ÅÚñ•ÿ«óßò ù›õºûº'Þ{ø¾I*ß@Ÿzç4Å<žœÔè[-±Œ &#KÅ %6Qs•4 ôŽÂ0^  R«[ ÂÐ4gt|éÚw%ÄÉCPj™HZ]w†È&%êN@ +U0Ä,­’ j‹ÒŠv­VP†µ¡(T°V  ”üêðµ.¨‚u,M€(2€ Ñ Ó‚$!Ö¥ ˆ¸Kbd’”µ `Bà²Â(ÀèFQ1àX" `¬×U¡0Øf@ßë»d]PI̵†m°cG શbaw>…0¸ˆ5¤rчF‡˜ü»Îí’P.§ì^ë°n˜$.Ö‰u?vósÿÝ£'Tˆƒµ©x€ WµTÆZÁCÍ‘qLƦgTß8€·Ì‚ùp"/¹=vn–?¡¦à]ýDILÀ«èVÒñ†Ãîñ’®ûDjŠȧYñN¼‡ÁF† qIJž\ za´ ²tÒë "¹@nud˜*{…&gŽ÷ÌŽÉ;¨,¯ìwµK?q‚[nÏõX‘a8•^/âßVëäã‘z&Ò‹j£%«DA¡Ê2<‹ÇsG­ª«EÜ~ÓÅ ¬åªƒÍërWçQ=q¶«¹h9]»Y5Í…2òÔ’[WÙ³¨µ´¡ôé­kMêI†pR/u²TL&1 ¥#cC°bíJEê`ql_­H¿UYA0VÐèÐÝJLMÜšÙ*J‚<|§Õn¹Šè«£–âå ïë{/ê6ËêÖ+õöù<úw>¹³Ý¡Hp©.Q$)aÿ÷µ·iî‡_^¼²ÈŸ„ýßûìZ9×HHÈ!תCi §lé¼›¶•KµŠP`U»ò¯5²õÍrmYue µØ6ýU.5û÷)ñµ9+µ?©C¿mÔÕCýýl-y?sÖý{B„è/An»CñgÃ-Kéµ­ $ke®&Jïµ vå‰A'}€Umd˜}ûÑ¿Ñb5Š•Ü^Î[%×ÇöþVÈq[+«ÚÊ1tåXÖ¢B‡5¥Õ⩆îqœ): ]ª.Dxˆr¬‘r;ã§E(Z›eZ‚‹JAûÊ¥ZÂÈAF§8Ýàåù¿\äš0“=‰mÝÆ¾Ù°˜jA§„K©IÈÞ|lÐ_;Øæ]·Œ¡ïS‘ÓSêR±Âðú%õ™íüçùÎKäcßí¶¶äl™™i';ùYì\|B†Q(=E×xÉÞ&k2«ñ¸…˜˜¢a™d$Ê‘JÚÄåTÅXDO³F[ÅMÞ‹ F‰ 5å9›©XdFbJ(Ì=å\£ŠèŽöHBç|9,ÏW#bX@@ 1QI¹i@0VL ;E=»5)Ðbð Äç e 4D±DD¸cl3Ð…åx.žU@ÞÊÅ„!5óÐz‹Š¨÷ڥȅÙ½º@¼~{è“3@ µ›ß:çŒvZ„¦Ðbb®Ë”1 Àdd„מ !£aÿ“örî7`póÎîk ²ä šúË/S©eÁ®cÏöšWNŠÓpgâ{4#b±¾"æ²µìT…‡úDEÇ01›$pÖ°kN<‘ŒÑ‰^×Mi)mDZ‹^ôzÓíjŠMÚIœ –¸ÝÀàÆ“H9ݹ »rq;’f‚iÄÌ(g)ö£¢Ïlt«#£J¨)=”ˆHÛW[:“L}®l |èY‹CŒcÛR9‚ˆ <$Pe¦²:$ñ’Eg‰µ=9Žô:t‰íŠP Œ±Vå‰ä™Z"Ò9 @© «¨…1/-»‹JJ-Ç.ä4žT£MŠ£–‚V´0`Ĉ³36øœ}#ð*ÜdªÄ SnF0 ±eد) À°Ï§×y?&ieææi¥ay°#@€©i ÒWÞ˧ HZAºÜ¬cBƪÖî“T*2®å¬|#Ý$bÁÕ”³ôŽûù£„¸ ÖýJ€? Ð_ÏÈf²Ù\×Ͷ‘’»LSøýÛýRjûÎF§·ƒoaíl®GseÔýYº*îÝ¡|nš\Ÿ´5ÔkÉÙ¥4s¬_eOñ¹o}!:èxlž÷YK¦V¬”Z9G‹–§òqDQdÚTWzCäIàÅÓNæH:êiw)ÃÀf¢I×ë¶Çµ<]ÕM=.—{:3ë;É#!šQ4[ߪçÜ›„NJzæz¦-ê++ ÛÕPµ“N‚H Ë©ãLcÉpß—á8›îÏ‚ÊÙ«S’µMÙcE‘[BÇÔõôÄ`¨qU "]ß•…AÂ}Ä<—ebj^Ž€Ì$È3Z‹±NˆV˜](FÉ€€ ‹Ð0€Â=jVÆ \ª|Ün:ì„.ƒ+$A[<óv•L!Fk ¤6Z3a+@X4ŠE±EÈf¥&6…‡€„ÁÆL ‚`d­`[À(ú ÛŠ€KZeU+"²déeQ-xU€1 Àj€È¸K âè@2aŒ0€¶Ôµñ–°>ÞË->¥€XÚßlõ„ÜÈÄi~xû¦:«Zokä±Ô—[ÿ0 Îkq@~õØ÷3y`ìþl%ØX—=ħ ñl)‚WŸîWû ϯÌÎO/‡EÎІôösù. róv¦]?éÂbª/V|û¬…Tn®«Ó¹¯nö=¯4Cñ(#bã›j~Ttз]wêí¹ˆR ^=mâÕqqÅÀµ µùë÷‰±3_yye«½»¥B2ÐãÖ½I¼{4ÕÑ)véÆ_ PºN†sŠi7Ix÷\ÝíD-ÉlecýåP”nr:è¥î¡Éã™_y%5x'¶WtãG*:·mŸ&hd3xM‹µé´q$  ”¼úŽ&Y¦Ìd’ãZkR÷pÒT¢Â¡æ3ˆÉ&;;¸L•uëTÝîiéìD hÎëñ—>·ïr1ÂÓ¦L"¡mGcb`‹{%d*†”³Ûû(&ÄÄm  P·WXǴבS°&»bÚd€h…¢C±,R—W@8$€ Öh F@€AEC6`­X‡Ĭ›€¢Õ)@5`•}`,@ ’ À< ÖaÇ€Ò±P^¿Žµ $OggS¿&zT-$2ÿÿÿÿÿÿ ÿÿÿêÿÔÿôGFKJFVVUžË-"¥ÁèAqÞl¶R2ÿh=¨B÷¸9ÒküD¯ òu8btà08ã,iˆkÙ#Ðr 0‰Å¸ 07çà²ká“í Œ\`ŸÛFÓ)$<êÅ(õ#ßÜå$øž+ûàƒoP4cÊSL€fMò÷üF]cúBå"†?G;2„/ë¯ÒLÝjVÈQšÝÌ¢âeée¯Å[Ì9¬U ”8vÀQÑ,R ÞCËê¢纔ìñ¼Ôš½Á‰•®Á „ò†ÌåË/óßC†b†ò_ô\XkSé=TDî¯mì\çu»¤« ‚ÁØçsHd_Ÿ?õä†ÍÑ]<¼”òíf;åF{èá¢û[A«ƒe®XÊJ:ANWù[&‰Μ8NíÖÍ ¦´'ï– Bõ\V…%R*ÞˆÝjPPTAÖí¦Ô å´¢d¶ÆTW5ew>Ð-@@ʴТ¡ +ɤºhÖcii›¡­‹C²  aÝ ×µ¶ƒ"¬‰ª)’ mü6¥pÅ^I] 2o'‚ªX&)ˆf‹ €TÀªb€Þ¶=€B.†5ED© 6¨‚‚˜Dt¨bKóÀÄB`ˆbD@JY_Ö  þ»í©Ç¥¡G•ˆ×‹í¾‰´*Ë2¡ö í7ßà+À…±éêÎ@Æ-a ÛÆ…I¼pmrpö†üÒK ‘ßfÚŽvGNß&O’@ÀjÜb·¹æ/ ¯·ŸR\®éÞ¢@Z.H› Ä•¸â)„`ÎIïÙ §†OÖÅCö$* C€ !ˆ†JñÃI†ÞwýñCkÁ+ãÁÍ9‚/”-¹ÊŽG§+*pQ¥¨ÿ½ƒúŸ"Ó•\‘@Ô÷†›áY•â‹«?¶?5û‰ ç¡G¥`:E‘½Þ’£áôÅ‚Cœ9ZxÚÀO­Z$è sUwpb*ËÜŠõÖ„ƒ‹ÙõVDüåóÔVÇÚx5 !,WÙAži=«Îe•ušH–h®ºŒvfŠD1m¼éú²nÚÝF†µ¥ÕÐNdX×ZJh)Þ"Ш½!©±jœQÅŒ»RС3q]'t^8HÉ¢"À@6‰²Bž†cz—-Z(šÙz²j½ 1‚¥FÝÚhôâÑT´J'@Æ ×a¯€bÊYˆ"€ai! FF“ÕÉQÀ©¨h‚¦:ZàpKë ¨`! à56¢¢5€ `Ö`#×X* ¥bÊŠî ÞŠu¢MB»‚Œ†·Š5ÈÏ„*-ë¹F¡Dß;9~–…vü.^äë-ð êÀ«¼§è@ëæt ŸgÊ€Ôë'œž‡€éêD@¸pÂ$Þ’×%¼€Öõ\,ð—Iй®· ‚y Ù¶=eeˆ¹ådÌÜ•[ô§7Eµä}1ääÁÍøl¼t@&” :­'x<¥ÓUC« ž–wƒL ä‡sÄ_ùx€^ Jö¹ {1åÌX d€"j{LÛ“ètÀC.Qôk“º@þþ*)` d•ñõ7BÁ­8Ί÷Ž9øââõ/c!‚@†Œ'k¤’µ7ã³+}E3¹„Lá<àÞŒs“ÖTA³‚dKÉ@d:‚€=†*¨(LX­Lë¿ð¬a•#< :CK¦¥n™9ÛŽ …î€+ >¼J0S눞Ë:^ƒÓ0Ðv]e™¯ñ. Éb€ëPÃ=ÐE¸ŽŒ³ $ RáÓ@`‘U- €#íÓ^ ªÃµ¬d°LQ÷*Ã@h‘[Aô€``E!¦*€ˆ 4¦º #ƈ(ÖÚ4€mÅBQ¬©`` Ñ¥@ÔJ"‚À(µ€E 0¬€* :€bÚhØ+B€á‡fÞ°PBY@?ˆ^J5¬)ètª\AúµV½I„ “[–õ„Æïpþs2©ûÎ|†þÙ¿ÿöKÓL–àhêÜßéã+¼AN €½?+\HÄÐo@<=ö[yh'‡léà¸P­á¹Í]`Ÿû,»›»$º0îÌ`®2ñç|;§²ÿ»›¬Üuü>á—×%…æpgýpPY‹s,8‡‹IQð!£~ø%~Ç’% .!À ÏE; ye£äN¡Œ@œ·ËßR(Õa{>€w0H<*F´)™’kBÿ'ãöPý&²÷×>Ý«¿š…LK 9øWöm°ðÁB<™ÈÌÞX ” €ê©ë—1CöbUQp jëλœŽ&÷î'vLß}ÚÐ_ù·$§ÞÛÒ€†èJ `}Þ:æu‡¹•ÊQ›Á~SŒZ÷À è+  4°8³Õ@n]Eû}¢ÐƒÚª&À` š'Öì±7S9ÐöÆ€ŠA½V'T4@@£… Ö+€3£ TDà9(` €èUÄP+™Y5T²1@-2© XŠ7 `-U3Q+ ` €Ñ²ˆ€­#€@ X3EV‹¥2hA§PK3“€ ŠÌÞ•ÐÇBŒNßÈ‚Â_:•4ÅHD¥Yí§Û$½Ÿ|×§»ŸŠû0ö7þ<Ü÷ž†ÇðfO­äýîú@d«Ç²P÷ÚrM$8cƒ¼”=ðLåþ’Ds»ßy«O9k d™-ÕlÿjÃŒ6oŸ·è?AH@ö ­üÀ“ãÃŒ®"dwœªøßLA!ð{vEv¦ÞyEOx ±[¬œôWÀãð ‡ÌS@ƒÙßjÎö‚%ê隯rLñrýª™€œ Ô̾ŠšŽ*ñ±¶o€Hd¯ ‡ŽûÉ- (ÕÉp<©!7A‡¤öÔØÀJuÕ0ÍÔúÄs¯…f"ð`âà‡Ë™ÝôØ7´i4 4£·î Ñ„ €ÐJ¨¥üÖ!€¤kl¶= ÐVÂeê( F„0h2SP1ÜV«†Bäˆ1tŒbä(X@  c€C®­h5PÑ!È5 > Õ8¶æDé5B .ˆÝ‰3Èà…ÿaž2äm+ÿ)^?Ù³Y¹Ççx^ß}ù5¹i× À{t&Jฃ„ CzD ¦¢ÌĤ[ v‰ýÖê`pf]ewz˜))+“ОOdžD´AÖ|ºÚó÷~~³Ëq'„+£Fk€.Fb” ¹ÅÝ<€šÏ FJ€Œ/ƒõfjöǪl»­÷ðO°¶®ÓŽXžÆ#ÁlK 8»«Î æ'GF ÿ¸Éš’QºP/ÄôÐ~ E”.È@‹Éµ³XS2àÁþ°ÌáÅXh¶Ñ+™·=¨ùJòŒ(@ìûî?¹ÃÊÆ€=Z¯.èø§xj-h(ɶÕÒ SG ñ¹4ÐsÖœ‹@Ï&™yÓW#€° P)¶*  ™Ùdê¸Ç9 §Á]Ð^‡±lÚc€V`*ƒÁX€W€A,³À0@ÅTI1ÚÅA³h°Ñ(ªÍ Š t`†Ñ–ÖXBü&N–(%ÉT^d‰Þò„x'V­ eLœ ‰üx7í×"ô X 'ܡ 8ã«M÷Ù@O› èYœG ššÛ/`?jðb*8`¾ô‘_ÎK¼ùéô-U Â{øJÝ’?qØiæï¹+ÉïÑØ°KZÒò÷pP³Vª HzÜFÌO¢ŠR›ø¹Ð¿Œñ ŒÖiVÕÔœ‰Èã×dT(à]ZDê'é ’’(ÉY˜ˆä ï¬[]xáâÒMŸÏìô*÷ª¨¨4¡H¿ð1Vl :O¥kÛµlûJ}df©4¸‹EÛ JJ½NKÅ.q\¥e[ª·€xU•¨><  ®Mm Av™oUA$+yj ØÆ6Z½H Ø ¢3ª ÍX‡Ž UÀ´…ª2à˧Öõ€v¥ˆN@£³¶€8y>œJµnÐ#ÌG¾äŒg¨‹ "I€K–~ÉûÁqq²X,é÷°¢+õÆÃÇi: Í Q±Þ@t-$$\»¦Ñ"|2 ›2†Ô+¶ù¦³¤¨Æ™¥ðð~ò¿—-™‘§Ã„¦…tÇ`—´XØhÂÂ!9hԂň³‚j$`H« mL·Pd6K&›QÊJÛž>½ÝÃBæ|i£ñÎ?™l2W„5F`ðcßN´ª£t5„ÅÈJQz‘ QcøQ3*¥jYöæ×P$¬NÅjl…È×eµ+ÝÑ Ø~èêê85žÎGÛXÎõކAMYOÑ(•nÌ&MÓx÷[Þ˜3a A-ÜK3¶+¨hýñý‚kš'±îr?§HWÔ*uÝa¥p²†5.ƒt Ö"ê‚­ÁEµ •-7ÕOggSÀÜ&{EÌ<8SFDU^ddÿÊÿïÿÚÿÆÿËÿÒÿÒÿÔRq–ÃÔ‰á«OÔÙmRÉS oŸ¶œ/‘]sb ã»ïpD”щDŽj"ž I梆´2ˆ*È:‚j¥$,Ú åe¡‘Ñ* bIÑUt‹°X¼J‰±o›¨“yq¶Š]Kl„ñ8uí¸È\èà$/Ñ:Q cÔÈÕ$³:Ãxi*@ íQAÛ@yJá#G&À­’ÔNÑ7Yºy‹Õ&`híäù+˜È°‰<-¶x½Q›A,FÑkOЦ"3,…BH©W×¥Ð(¶T÷”›_ÄZÑÍéŠlв †Ö”®ÎiÙo]«Çõ{Û’à”ª:©Š~±ÿeK¤Ûï%ƒ uÚΈýúAPWŸ«wja"W i±«¥bÁZDEcUÄ´Niekð"À{µÒÕ®df×áƒw½Ž™å Ô÷<uݸâ~{ÃÇ€ãBB—áî¥ôb¡¥R a¿Yh«¹Ä5÷ÄM^ ZNÝKŸvASµÞK® Ÿ>Þxj¿y>î|hÒ{|ófªAjðôòVÇvóFSÁ¿ä,û÷{ù\ U_3\¸ë>ny{»±,ç‹WäR)ÆØ[ÉAL½R„±¦Eˆðb‘¦×>¶×­‘¯ ±¦ð󉃾W—:·ö;•çkòF}yçé‹2ª7½Š¦xR8>Í^¼Œ†òÌõèñ›Êf‰êGÞcýìàÀz»ÕÚ€¤°ôj»Ì8ÈX”š“Sb²·›µ~÷t¹À„mnõ£ÑYŸ¬¦Z £l È, äèÍèZ½2×s܈ýn¨µ6bNÜ0¤n‘jh=ãÅÞ—hÏöÅ/¥÷ëþåcwæADs¥s•D“q ´2»]ºÑ X-2¡qJY H¥µIOÏ‘“žiP„h;¦6ÐÓ%µEÞ—lz–(2±èŒx¼ÆK&B½~ÃH馒hë)€~=\:x$}a'ûJ’ &go%%Ï~èzª·vjNÁîQk˜ïÓ…sæçÛ—æs«÷J¿Õ­¹]¥Ä5›L.d¼û7ˆOˆ”>ŒïÑLì@ºKä‰^Ug©MÔ]Í™†Š5gOýúæ×Ûˆ°xÈ$Wö´Ìãîs/cD£iÅiÊRÈ?n\ۗФþ‘Y;m?www.¬ï™_»‘{Ïê7EHTiöÊ–üXƆÂ2·„$‡=Ž A\ÐPjªPõ°*@V]]•7Z2W Z»‹Žy¡­ƒ`{{i{¸Ð#É·@Éíåë…ãgaeanòÞÀyýb\Q¤tMž›mš0Ñ#C¯[£Lç,½ç ùY[ŽÉ箫mŸ»+¯oö­D\­Ó@¾šŠÐjÞ±°4æÜGëë½÷0:¢¾¸oÉò]5é¾Í˜U?Ü„~TëÞŠ_÷nEw—±…äÙš2ç' uóñ%n]×=c²C–h€»³<€ZFASCΡþ>(  ‘8ñhv›P-šá†ïÉž¹ã N[v£´ÎY²SІ®Û ]«[AÔ¦ì$E¨ìÖ5±þ·oÀº§ dS*9Hž("ÑìLIA’é‰Õk„] §õÙ༮ӬՔs¾77^9]T¦½ãì'EWåóGôÚ•‡Ó¦’‡8JÅIBÃ@.õ>î=³> U}v ý{wÑ9EÅÞ ýüñïgÜQ剢Ë1׬@SMÍ=Å-†ÐÓбÇRM~2¯Ÿ«Ñ@Ñ0§™­›2„úwœÉ1Å$t“ør0s÷K’Eã»wìì 2S¯`†©¬e4€A°*HʹDö¾ „æùR`v+ZéPMÀƒh¡… ð@F—h&Bzú4KFõVÿ‰*¼-¶t­Á80ÿÇÔ`ìPc#³î¾ås;i8 i€GVÉþŠ58aZ|4šjˆ.«i„&^ 螥Sç™™û»—oÿ5À'›"©iWa_{f¯—47€èŸyóà@À{HpÕÖ™g¾#:†Y¤He¥-H`¶íÚ}_{Ÿ:—Ó2Áƒõm”ú1²MÌ~úý÷îZ¹.|»½‡/&™UòJÁ·„·kÏ\ÙƒY„|æñÒYËÄñ#!ËŒ:^o4ÀÖ0» Þ³… ¢Ãr] 5v€à¶ð=¶)@·9†Fø£;ž§˜‡…,vH×Q–"÷K©kí‰Ï;g´Ò—ž$vr 9!^e{ÑŸUH1æùÛ—œ˜ýÏô0L×ñ‘äðŒP’`³ôŸæ"}î••¡êí•×€ !†,h޳Ð@¢òž¹w 8Zfêß ›·1× ËGÒ.6KÍ“ïϬškn€Ñà$v‚Œ½„ëëªÔÐYp†i8æƒŒÉø)ÛLö¬+åÿ­¾j˜Ÿ4ptÑT䟼 zœÜPò£ ð {Ñ!šÐ°„/ù÷'GëP`£Õ ¼‹þâPAe¥|‰wŒøâ4" Âpz›W8«„…¦ñå:^‹­4¦)# ƒ _îu.!!­—‘éèžq8¬´ÇÄ«×_x^}#éÇÓàÝßë9€§5 àBšž» Lm݇o[ßÄ5JU•ƒnïÙQ Ð~ðŽÔ/¯Í¨ÞÍžœ ½@³ç^7@.c[ð}Ϭg1|&…()ôÜðµ¾ÈYïú&¥,‡rüÐu™ä´Îu”¬Éï?ò´Mopi5Èéâã$Ç¢°€ 57ÞYü'·bqFT²EWÈ;uAh ؇B¥¦u‘Å G•pËÉLÈ›õv²JDŽ1š¤Þ‚s˜œi`žùWÇ9“T‹œíEÍ­÷Ù|òÐéa¦M*Z«Ð4I0šÝûÎy*GBÓÖÏdCE÷4IÞ†é9ã“O¶'šCW2Õàù¹éâ õd³ü5•L94œBŽÿßÍ%èè-!f-0Lbè£}ö^’ ­‚—é åK(Ê`b¹ò¿ Ñ/*›3· áÍ㜆]檼ez@“*žÌ3¦x¶ÓÂÈuТDŒX¶UÇÓ  ßüv<HŒæÌZq€:óŽçÌÏï{ånOU”=¤«ŠXß?¶ðªÞ·išpwúmuãiÛ"Í­DC’P~V’æ¸nŸ'ËÏQh{¼vÞ’šì‰ yè;=]P£îMÿ²Í>y&`ȵ®(üÀÉ™êUYl"[•%È‚oHF&_ûdÓ g¥‹È}Óá WMÑ»†®­iFÚû &¤g:QBrÄNŽj¦®u÷méê€ÂÁÀÿû|ló/&US°A?œSpdÿz6ðÊcCLäìßGöfeØß[%3(Æn°P›øŸóì!dé†Ô¨ìŒI-Ú¦œ74 +£ `Àm8šý' !‹iþ ‹²“R…€¯0~ZuĘ©‹B#£a´:-DKgD©0?ãð$"cüøÚ£—{|x¨ïûš¼òÅÏ ¼,PÔO¨àùx4pv7€˜4nӆžnFgxu;CYr.ïÚç ý¢ŸŸa²B¢£úÐð±_λ2žÀ|Í¡ÂàÙC 2™|‚dõ>øÐb¦«=߆”®Î«õC^$ßËKo_ñ€Dð™ì5̲2¹²=yfÙµ å×;â1gàÕŽìÙAN½®Ñ”žµ+lÆ ë"=Úê½íû™vCAVàSpmŒŒÍ«¨Û–5‘Sêkó¦«Áþ¶czÔi†-fÖyœ`‚Úì¶p_"F¹_§Ãs´æÔT±›ä˜¹ÃTz™†üÆ2[ÃæÔcP¢+ñ‹HwgqeQsnâh¦‹éýX›¦hpÉ«ÇYAs“ÃÄÑWL$k `À4o›’[Å #e’·éa²Rꃛï~1=4M@î‹àõC° : ³£Žå·¨K@Ð1hF|¸4h .€ˆ©½Æ@õ$Ù@x04¤y ҆ܓªsb• "Ê^jõÜ’ÆEàÒ*íž’½™žƒœÊó™õo¯?jgøÏ\Ðß/ÅQÜ~3$\x éýß-›NÀ8Àc,‡7;™ÑYQ¸òPhÀñïEÓ¦»ë¿¿ ‡—=‰ÙϺí@Qþ»Rö<ùùá  ý®+{wGΓ,—Þôƒk@ë û¡8sÆáœC³øûXÓÞ΃gñÜiϹ®z=]·EF#P!( -†.Hs·í›å–%'ÔˆéÑÀ‘Ý[¡²“4¸ã½t¹ X¹{ŒÁÝy x9È]eÛp_ÒÕö¯úêçQÀëOggS@&|.‹ã¯Æÿ¬ÿµÿ¹ÿ¢LRUR]ccÿÀÿ¸ÿÁÿ€õ– ¹øéÍ?Ëý¤,ФdvRÌU†ªˆQ15gžkÄnæNAÆÏÇdØ}Îßjn²¸Àç~O“·¸®™.1PÐÓГ- O•ïó>fÍ0e-z†]-²,Å]L^0êd :#§sæw”—x 9.‡ßß ATO9*²šŒé¿ˆ‰F•gÎs_÷@K)mOý‡ ÀÉùŸ`PYÐxšÿøM”¤{€ˆ(€Lòtðº¬儉qda‹.À>y¥á>qD$Ãå•r{ W·³TH‚çÈ}fíû|7fq@âÆçFh˜_9¯v§šÀ¸Î$Þ÷ ‡1=ö7Žœ<+ßb ‘hÝ42S*븘!÷•Õ]ù…ãgœ“ ˜|بίËçd¼6sîþàfÖ¦(ýü­ÆÕEFw°€ß4D›°h0€1h p¬¨A€# ð«Ã[T`œpFAjg u~i5Ö7d00i¥Ög2:Pþ?Ú§´€÷‰  ˜¸QS£(˜×oè˜y@~Þô#€˜l­Äcœ°0V›gÛ¢ÈLeÐ7àJ+H`äë¡€ÉûH€>ÐB”¿‘s{Ò¶€Ž±d „6 忍"ý˜ó›üäë-æ/¾”lÞhv'Ð!œ¯Ñê<ÝX§'ñê!ýdó\/‚¢ #²¬  •Vxmh–ÐköÕ§¾ïV‘@‘2Z*ŠèÕýíš•±ÌOß:úËžîG×™%­S榾ŸŒ]øzÆy“zøÿÊååIDih\+I¶ N_¬9øNçújåô:ZK\fº²¾“±Å@’Çue"€  èmÈ ÝIå Úc f‰aþ ‘:alëôoñ’„p† QÕiƒa ]mÍÇ vRH€$°6aìð)™[lIŸ;&_ t›¾˜µÓÅÖ@ÐB:u·{\ñ>ÄŽÖ*ƹ¬Ã@º}Zìç0Š- ‹À -€ €€T˜?ÞXŹíTö0ziÓÀcU„k"öŤ µ->ù,Žþ/Z à]-i%pòc@À¶Šà€Õ‰ãÐÜ8sÃW\X¸<0À°¾gw‚Z¦Bˆ¹î ¸* A×?]=}˜w+ý_Å2í˜ûèÒ‡g¢eÜ¥?㯫Ò²ñIt }è»gê<9 KzÁù4ÊbU|&t+ƒg^PÀße½6ÇUmbiìyDÑì }ÍÜÿŠ_Œ ãëÿ9¶M DÛ,¥YÈP%ÖÕÜ€T Š»ñµÅh›à½!”¡Y2*ŸqÝf›GÅdPQP¨îù ¨pr’1}[GÖùÿÒWWæQèK ï4 €2­­~ "»Ä2jGD§–‡®Í£·4™ñð.g5×kí€ 9)—ÿ‘Ì3Ï@v‚¥HÉN ^d $ÐÜO% Ó3KÍ@ ôPÍ Ó+S$TC øˆ5›¸vô Ðm…h¦Œë4Sk"Às(ÜÞ02fux°¸ „ ÌÒ B¶ãÄDðôK€@!Ö7 3ä>QA1ø«f²Ïä>ˆøÜým|IpöÎ@+o S£ÛôÝL‡Jv{¨TA@°ãŒ°Æmo„Þr™ÎÊžnß8¼¡'”P™º½f1\q%vs|¥ªÁœ˜-2”½ˆˆ\w>­à¼ÉÚgÜÝmáÁŇçXÍžÙAßv °›3Ögk4EÄhÚÙZ{˜3÷DQhd¢|Ú&hrYe_ýB‰sjÕÍôOË#<ùágåøz<žêÌ΀B§êL  )‹‘¹ä¥/v‡ní¸ÛîÛéçÿÿé´B¢Á²ø^vú€R '¥½BîàÞ° ɸ@eƒÌåìHwgAºJÝé̾`'3 |üPd6‘“-åºI`@.ÎERå~ßœfÈn²•ÈÙ^Òì!ï¢"J ‰¡!Z?ZcàãÝŽ €‰èaÚâÏZ9 YÇ**L^Â@O(¼]ŠC'  r$(A„ 2ˆ~þÐ2Äb @`V€t:ýïvé6Þ GŸº'»qøÁëýiÓ<šÀù3ÖOuq9tµ¤2ódqÔ…Ä¢ôÝ>qgçz À•”0€óÝá#Ð)vßÖŠ:46K^lM«ñ/×…ÿÓ)¸Ûžü­’\A Óu® ò:»ì¡õªc…²épÐ÷»R‡5MTzt°Ó3Þ窎ž·¹V¦ÉžÅŒ3µˆ È𶼜6‘ÓFHKÁ”:ÑÓÓæ°÷õûaùÑÍ0 ¡³^Üg}PÛ<ù6mERo;ëÓ*ìµs±ªò´QôЦ.¼…DÅaÛàÿ½ïó©W”¢ÇaÆV¤>AY[Á OŸ Øí²mà†¡³Ÿšï‡Ðä0à¸gà–;,ìŒi:ÿ;:ƒ¦Öi…jEªKr‘nü·³Xë}ó‡­ŠX£*·×òœ2ib7d¢lÚàq‡ ìÁçá<ˆyïë9ÿÍ”[®æürÚ颢JEçQä-Ö43!­¼’i«i&s諼®kìÐŽ»šfµpP k²È]IbÂ8Ž—Å>»ÄÄnQš$5ÁµQ¨i&À½“§}GÆ:;/ŸÇ³Ýϸˆú¤\ÿwž/û¡>~oÒ¹¶N¾·Ø˜ªãã}¦ÃÖ¸æÄõ3ó°žû®I­÷×£=²›7ZÒØôú? ¶4[´j¥´Ho³–š”©/À:»(xò´ÂŽ/4ø’áût¦<7Ä’L]=Æ·õØçX[|¬L‹üb|\´}üe)Ô¹ÖÏ7Úüš~ﵯüÔsùZMÀ›{Ì'Úù)~¹ª¾¾ÞºÛ•F²ƒ ´­]h@;t?€]ŠR;³}y·Àbuvd¾¾~®™7Óªf1½GBfOŸÆ¶Þoeï>ï™Èç‹ýŠ6Øn¾(xÓ ‹)/¡ŠEš5Ë]j3ôÜ Öi¸ÇúlßE¸öé3©kò‚¤þ¸-=Fí¦€Å7É$ cÕêU/ƒd¤÷J‹™†ÖbX,g7PÛ‚…²ŠE®D,¦"àÍE-H™êäôBa©tù“ª)ŠÑ ž8+ò³‹² yÛê”= Ù)Aeò¨éØ]\“Ì4쬾ó¼ ;¶c¾õHt$‘[7ËP%:I<~&“$¡Ò÷ÙâpýrÏέÕ7 4 dçª ¢(¤¹f=B‚{²Q ÙFµ‡üvžöÛÝIR9+ö$}Èm+øÕiÝ+fz²š‹K”¨uù˜ž¼ÔÇ›Õ:i„ÌúËÏýâ‚Óm†‘=B¡±‚&øJ˜è¢F4:)‰¨ØRc !qe&h‘x "{h«–|{׃¨`š§þë[Žá¿Ö p]0y ô[±…Ï¿wm6z$dÜ«2¨Ï>:~Ì“€`1tÇÜÖ4Ht€÷ºÌMAÄ4½çå¼ws+×D ŒÆ&™Ä±¢ö*Ó  )$Y¥'rÿý!’ 0‰—·ÞëV¯î]" 8xë åÔûµ 4¤ƒ…Œ#cÀ³çGÈ ÉQ(w$*YŽðÚeÿJÂ_B( hš²…¥o¯fMâ$c 5½‚i –Ü0#0²¬š3dêù¡€½Î“¾ÛMÆA/h ô‚½Ý(óÒîÐÜãÀeú˃ý.IÖÛÓÌ$¸|ë)p%XÛh$]G;¬” sÍ´$W FðN 㿎w×rÇÜcÐJwpFÏA‡³äœ65¤»à&î¼ïµP펑xO¥)PÍ!=(ѨY„y@}¨â(@ÐÚÈ:­Zoà†žŽªô©Š}ö£œú>«szc§ ´ù4¬2jX£/àö-éÂ,fzr2êX¿%0KJÙ’L×+tÜC4ð}ý‚éç]Ö¶Þýìbz(:§'rÒ͆Yf+<ÿ±óC6oM6dn1¿% ¯Y{ú×ÏÈÀÐ óÊÔ¬Ç5ÓPm¨Óô7WQgg«K]q2Âõ»'¢¥$Rk–œY0§ñ+ÏÕœŒÖN¸3“fæÍã·K+w¡ƒÜ0@ÐÄ!_—]9ª{€ÓS11Eõi*êÉÉ )éUY€K\ ±…ŒDÓ*à–¤j:¦…,À… ¦##8R €x³>¬ ‡Þ$‘"qäã9'Ù2”‘Àk]‚´ÀUÔ-n½·-ÿ `@þÛ-®fv€¯·[O DÒüÿœ·¥f<ïwä;z_¹Þ.#xW%I@ëõtë6çîGµ#kÍBe-\—€Le'ýÒœW/êžšæš©[û/¤,ú¶v“dAÖÛ(ÙT€,úÌ ôVšÇŠ9oº(€úbé—ˆ‚ñ^^Œ+'õýð'¾ûxÞ(V­#¤*Á €uÍZVììq •$VÂÏV8p¼·ÿeUI ««íHƒ;«•wiœºCû¹!€ û;rоi,À¡æ|Äiv“}3Mædµa «‡è–¤äälkpEÕõ6deÿŸœlî“DS sùfOggS€)&}$-¼´ÿ«ÿ¯ÿÿ¦ÿ—ÿ“ÿµÿŸFAKHTfg²~¶qùoÀ§?FÂÀèééaÈ/×!¡Gµ&_¦“ù[ºV¦z€* Ðw3ôöžúºß®Jª èÿ4y~=“5Šå„€ø¦*JŠÅRf†Î¬v½™¦ÿ {w&5 îaÔÄá–WÒºInÁW€È‚„iW'mÙƒ(Ôç€="ZÐ c@Cÿh@zÀ€h@1 I­¥”9_‰ðó% ²dr¾ÛMqLU(b÷zSl¡öà¶m½_õÛ¿‰w˜#ˆ~rl ˜§2‰œà@ œLŽËÞû޶­™¹¥K@/ëžüô«š¿S)sÆ­IÂËbÍ×… /üarOKè Y|óN´¾B„lÝÒRÆÖ5s\âý3ŽDf9:È£B¨üÂÂq>úÖ§cÐèÖÝj¤i6 ¢ÐI,$@Wë5ÈñíçVʉ •“‡C¯‡ÌÚX¥»¹.|Õ9¨¬šoÐ ˜[÷"1‡ß±‡´0³'!ÕÉ…½ÈLCg“­yr¿LŠIWÕ¤fºJ3ÓL~…®vÖ@iáácqŒžâ-+÷PÐ+0Ot4 »§®f²’*ªªþsý½£ŸQUÈ bòÎÇç»ÛÙ„ Y43Œ&ØŸ«õHšf˜&ïÅ0›ǢkJNàRÝ• ”¸eÆ@h¡K8JÄY2桲À¶l LÆ€€ÿX&±xÀÞw4@ ÐL´lA¡X\WžkÌ:p$ž»m¦gV!=†ÛnÁ=`˜~{>cÞкô¯Þ¾œ ðô¸ m z(Ü@wÄ$žV[ §Âš'¾¾Ñ¨Ù(‹o0 ¿Ž1™µïG3d¿Í_©äÐ:pÞ¸°ÍÒ'_ÚïS=ÕûzîÅã ô³×U<ÞXNòLzE*g<’ühž<ãüÃóغ#2~ùFî=b®åß@Ù“/rî™å² €æÞÊQÜAÙ0¡ÝdQð}»“'Öìa˜°;+É!|z fíª/Á _ƒ¹¡¡ò42Ž.)¨I&^hwÓ„ÖæÍTpQé©$§†îm×gÓ0вDG*)+Éik¦?•Yƒ×E %RÜ CnÍ>H˜œÒÃÄ#Õ“ z:}ºýÞ¡¦©ÔçŽ] HÀ©‡ØÿãG%‚]ƒ3› ª²<Ù'  Âž?Û4ÅÜ0ƒFÞg?WuÂ$€âÄ'iz|?YE~- ÑOÊ€è@D0¤„€ÀB&MBP„àæãÿÛ9Hñ…UÂ9± ˆAÛhA€AÑ!p¶Ð Ç>»ílÌÒD§ÇSl·à1!Õ𲵸ÂoòùYk# §ÏÁ8½àÝd'¦MH8 èYóÛ@–‹–™¨mÅ—¸âÅH\ÀÂý<¸ü4nÙv½´®;ž©Pú—LÛf¶¥ÞBž¥§QÓYEo9ס)Ôš¹=-`vær½ÏíÍU–!S²Ç;pm S'F¯–¸ÎÏ=:æâ½9/?è<©[4ÿìwÖ—äP¶¡ŠÕçûè$ªJ¬ï´¢¨µ+ÙZCCÛ4Jcˆœ}=؈0Q&¿ 2X…¢2¢iˆ&#2Aô K/ŠNW²°°K@ú¶£’賈²îš­:8Ô2»Òæ¦u+Oeÿ—õÔ•êÈ5sç‹ý±9m?"DéƒnÅ ƒŠ3¤ÇY´Š¬¬ -" Ù Ž¦ˆeT`RZMRTv[éÒô!ሥì%½íÃïÚSë¿>Òkû'm¯½šU4’(ííºP|$—²X L|®±P’Mœ¢£€ÐP÷71Ùê¸,¼ßmÔ%¡jÞtl±];¼•Ý‘½nyXƒè¤M5}ÜPßYS@ú…Ñ!@ŒÛߤ¯L²Ø@‰ÊX[¼ÊWvÃR|Ó¢Æôìç’Îé$ñ…™ý;n”ž™žE¥­á|BöaUÃÄUñ¸äQÓÈSÿã0W_ùí ¦Yg''Óˆe–”ßfç»õÈ™r$ƒ¸±¯a )СVH” ™-@f´€©ÓÀªðÙÆWÇöǘÚ)vëÃøsoºûŽV3ÚÂs¢·¯¶¬!ºzVü+²é„¤`’a›xô8rçÄ< ç‡P:9 uuí5 £”«Ð½­ÌF[P“ Œ<è(} ŒŒ¡CõT-ÊåÞvt¢¬ @̇!€‰4r’¶˜Ô©/Á$àzk3d#¡ÁªhCçüF¬Õ:€È2l’lЬ05¬0#²gI&A+ a$Û R!GP)Á@”PR3º]¬áKèhp(ëMøžéYEYfö›è-‹ üÖ$²;ÿ³|µcŽv2yC¯š7ûЋ·g±_ "ÇÃïùÅ‚˜­÷¾bÌÀ20úyˆ­Ûü5§÷¦òÞÞ‘2F´ÒìñmüW/‚Îýç_¨@Ì`›tu+äI£ÙSКCªðøœPÚìÎ]q9pösí0‘.œÇ3¿½E½ ’.ã°8Èì ìy <w§Ëª(Xûª<íç@+,Ù/€zí2]Ux|ËÕQd c×jèâN£Àqè©4@Ín¬3€Xœ 3êj@ìÆæšáªG’f hÖO§9e6€†Jû+e~ÎÎO½, 4\É!2â+1ëó6€õ¥ç@ÄHXþaÆSÞ§>‡…µÌç ¼ÒŒØ°µ@×t”*ˆÏàŽ¿jÙ"ª× î«i5³ÕýáÉ®9¦£Ëõzéz a¿¾ãï’„äÐT_ÛБ€ 3#Þƒ *}“˜ {IÈß7ÓLÑ~¶Þ*Aq¾CÕ} apx(ð†ÅÛ†ó£<&óàc5ZXfT¦·í8V@O32'-.·2þyâ ¡ ¸VÝ „4“,”Fq4“¢ž=0¤’jH tá¨d2\$ù³ƒ¡ „fÍ n×k`,¤P-ÀCâ°¼€ ä±[_T$‚Â麦€  T*Š à~WŒ‚ ¦Ä6ëMú™‰1$ê—‰gˆÅ LɸþÊÉ ÊÔ>Ûùßæï=23š4ùÙ˜a€§§g+¥1pÁFvù)¼ç{´M„Å {Ï$¨„9™=‡öwëù.WLÍq[Õßé~rÄÃÊþ…ÅÝ ])!órî?sôÞKÌóúª0¹vèÇ}ã 4D?Á €¢¶ó¦ÏiìÔ16¦h):= þþpâ²H÷íúf;ãP¿m³v»ÀCbz5ƒ«"^@®ÖrX‰°iÁö¥öΦ;&UîÍÈ /g!=¡j [hi(ß+hÎÙ¿ÀL·ä•ßÎÚÑ{F@›öå¬ZÁ«KT%,l”AIØ zµ˜$€{¶Õ M+™Ï:..x‚ØÙ% oÆKÒ) [‘Ø…Zdh]šÊ)¢‚"¨¤¨И hH èŽ@­65 µ¦&‘¦Ðp{;]Ç2QÑ8Å ¡±Òg)`€À1ë B1`ðüIÀ@´váè²ÛÑ©~S°nñÉ`»ö°YH–ðóB÷„Qß"îÿšZ£¸ãXñxV…µÌR5š~u*X!ÀP„p\ ä‚Ób¤ñ7¼Ù~¿rŒ[þˆßw‹S×Y¶rF óØ4å÷‹`åŽlÓ™õ*Î$²«å¥žxºñêEÒ° !Œ†…»Ü?iÖ®ö¯]ú¤? Üãþ°b¦üŒ{àESÞx³xjË>‘²©‚jj ˜©œ%p9”¼ŒŠ絫׎ÂX@„He ÜzåäCIîaoÕKí‘ã/MÛíÿ.& <ìÉ\ð ;5OXvÞÚW! ƒ¯k°¤ ÖçÒm#"›øªÉ™LY·mVRBÄäŠÇ¡ RÒ?¢Çþ×½†|&rlÎÏÜtt-, @cy•Þ‡3Q2â19Xšå×#g1¨bAXšº¦M¦L¸HAÑcp„Óå@(¶¥ òƨ†´. M j+ˆ|’›¥e@I’&Ýþëx.·r)‡áß}º¡ìõºû³Sçæ(ºuÕ̯çísÙ…¦–WòR˨ï¾]rè'O–(J êü|ïÓÍÿï(•}÷êû£§ù\œï·lÄ- ÜZV² W*¾&Ù”—@`y× 0m½C´%«Û\uy‘CY|¬]Šx^ź¯ïË!~þÈ—çúû®®¿äþ&v”óe¶ýßÇc^ u/ó÷»0è:kòú,Ѫå.¾Ö±ÕÃOggSN&~Ãs?eObdÿÒÿ´ÿÂÿ¤ÿŸÿÿŽÿšIGJFH¼&*!HÉC¬Ïe ” pÞõäÐ¥µfÁŒÞô4ü2²¨}{^x»kÉç¿õSRžo:ÑÅëð¼¼|—#s9Eoß2§²–M¹¾9s2ÜÃV}ß´ïÚ¿#jfÉÔ_¦Wµ‘Ú¬f1Ôp­”p`ˆ0[¤œ‚'`Îon4_ŸNþé×[«nÖdîÿ™93Ùß~ôë÷ÑpÛÓD0Ýö¯eªÛÿ¾õ)êXPÃ@ÜB%B`@RÄÐTét‘ÅàxÌÜ}WÜ^­x-Q•¥r1Ÿr)Žúfù¢ñÁÜÖåWÔÁ=qœ–Z8ÿ5µþQØêv¿q1éYCnÎtž£ pÿô2ûûéÿÔ^bØ 9’v+ULIÒB"¢|€œgKp &æ•™q;¯^«”Ú|QÿÿCÙî{u' _Ö³Ÿ¶¨Š¼ýñò’~Ìk|±œëå_·O¸ñ?vÌòÿeuCÉXž‹£çª¨NBI»Cѯñì‹ÿ¸£âÑNº¶Å~ZÕqÍc=OY-%0ý!²±D&Ùõ,Býþ% Ø9—i<«tW)Ó[Ùó’&(OŽýë•$)8Œß«:q/oÏá€îžþùµ›ûæúŸ-\hgÈ ;&åÙ²ÿþÊ}Ú¼#L¹†ß'sÌ,§ù­7o››È¿áý’xw¥#83µ¯úùoß ûÛï¾ç«<Ÿ7UÎÒIGS•5:“=tÒLé¢DeÔ½K¢MïuÙŒ¾==áUì¨Ô÷æÑàj¤;>Cñ ““L\ñ¶ÿ»þyϦ&½›Ï†ml‚òúØ[dZ8ÐÓ0 ퟫ —UÊÿ¾óz)Ž ™·hЍDG³ã¾QNïºiš³Ù—.€+±h‰êŠ ¸ùA˜ ³ÿºì?ÐT¶áK€€8@ hö±þÓ® @«¤ $dµ²²ÚœB‘# ªDlxCQ€ÏHHl¡¿X @Ð ^Ë¥†/hX¡­åVé@ýCh¿úŸy?¬»Eò8¸œ²_}ð`Ómõ>²ÑÖ‚6 ÚL\ º~ ¾MUíRñGkl?Ï–—ÖEʵËg$î>¾³ñ9g—¢Ž7ݖИzÈݯËáÏ|.žv¦Äª‚Ʋð“Wž¿w\Æ &ã0ô ’ )£[ði$´`=ÿ½2ØêJAHo¹T_)]À^²%MïO©ßg-^ £:sÇÌÑ‹˜B¨é8Áßçæ—d¡ bûA§¢„©6ïÄç !˜ê3Î¥²¯ø7- É ÛS;ÆÔEDgj¿Ó±!ËŽ{êÌù¹/šúkÝ3;Óà®—-sÿî-÷çÜÏkö`~…έá¤W+©@LœºZ¼T_Ý@:·“g×@ï;ÕYLbÈÈ{™ÎÍ3KH™aIñÁ¤K·ó¢éË“½™éÀ”ÌÚßšÔÏ  _ëSlqâ­”ÍcFBl7ꘃŒ#H‚‚ÄêP Á”ü`.ɘ¦Ñîžcê}@NLb@Vz~ÏžË]MŒ¢˜/—ÛLI4ÂP@~ß…3¼ÛñíäÑý(áu`]i“àzÁÇÕJì[^Ñz‘È"“ª¥ ßKŒwVÚÆDüàwž|©wzÍÐÍm Ÿ‹Òs<&í Qõ·ù„úrôÂIðqìylr§ðÕýs(¡û_™³¯Í4ç9„sûñŠÔýþ¾ÀzCÀôÒ"n?hQFdÒ€šUr´O Š"8L=ÅW‚`­Ò2çCd?luÝŠ) ¤çYÔŸ}o¹â>£éû41ýQèøìip·_|rç­ƒÉ$åíÄ— ö=Þ‚ªŠ)¢§¼G³©&8꬛ýühD¸¾$š¯Aö¸c`ÿÅófzÉšöfƘ €û‡†¬t}9ÈQÍïQ›EY4=€¾hÃÌÃÛ)ÿì$IÃЕuѵl‚x|ýžCOÂqÿ* Ž«×ß?c—„¼0GúîïÖ5ŽÈ€¯o1²õ ”2ÏNH#04€ü@!áEÃo‰Š¿ `³8m TÐ$¸PÀ&:oY]~>Ôx¯qµ„JçN¯dºÉmï¡ÙÀm)Y¦)@™LŸ U‚ £Á_ëržÛ?Jv9È_èÚ'ûwÁˆ‘exÕ v„‰Ïf+ @~-•± i+ ˆ96O’°úú'ª0ļTÒ™¢AtýVtš€šDô3yÙ;àé;[OÒDüËÂqS¯Ð ïg÷$•tn«§v¡æ8‹yví¨èäá$Ý•A0Ux `í[è× ðtÖXE»¯û…áò5Ìu ¿úë+Òéï/n†;Èâ8Ÿ§˜=æE9 ÅÀ°{ÿ]|^WÏTß* @0Íde"VCŠ|†9ÈN3ýF¶úpáù÷¸ŒÙjä+î˜÷1$˜Ç$Ü @~ÑèÎNå=¨fæ Á ¾Ê@j’Y€M-¨*ÄÒš9vnLK“_ L  :N^ë]ãå³ÞQNq&?€x*ÐÃ_ï³§÷AExû" •\Áç‰3ðçØÚQom]ŠÀ©ý49ÊSÌ,ÿßisln-§Óã ÇSPh> 0@x|™Ty€Pf&«‚üé¼¥/>Ð&º¦À³ßßlÛ†½<ß’Õ¹ËÙŽ ¶3±š%åjzà£m@`xÀ ‹þ@D~Ys  gÏ9 Y§"û9™bîÔK¿#ÇHHt0 iæ¦aUÕ3š¹îM2•»2N€*º“4d÷¡idŽÃ˜*PÝÔ†‰¯J®ü=YÎNæ=ТïEk×Pô'«ã™Ævd1Sü—‚nFÅ¿3îúMc HFÚJå †÷f_ƒÓø™†IXr¨zi_O3¦³jº)Í}}Ï›?öb…ŠL6ÌôÅç»xïþaNVæM>—©Ä×—ÉÀ¼6`üY€·yÀF½ËŸfú×Päc @Õðô±`À4I6—±èî˜bJ¡žë=Ò˜@­w–{”ƒÀ`Í“L¢Ï~zÇçøüQ#šäÔËN0òõ´@ëDw0¶±W”ˆürdK«±d™ ôÖ šWZéFæåÊ{öW×ö†ÀB¬È±1@Hh~ý{¯^Æi£Ï2×MCòØ yF§ZÕ·tég¢Œ?*4WT…4ëë7^ ©çwð·cœˆíØÒÚE02<ùPœªSÐ/’X9èt‹EÔÖd3D1k>æE€Œ•ƒ•§¨|»¦Á,¶ØßFY[Â4$³R¸™_…)= ®5öäE¿]–ÅCû™J! ¨w…nÐTÞÑ9ö8϶GL@(¦‡ …OÕÐ?jײXMvÖôxþý}½)U®] L¾n;Žr_~8¸rE-u¶éëXŸvÆ.˰XÌÏ«™ž&ŸtŽi<Ï.%y‹á1(¸]“M‘6ãX4sIrж6%PÀ^ë]Ý%Z‹„ÞØn“ÛèœHàû„I„ߪüÜ?*’²á”r€CÎ3?õ{jË“û“x‰É:bðÂy’YMÕL##R NMlÊ¡·…v]u(wèázÂqîœ 8ƒ3ôHÎI§ïF=§4l–¢J&+~~ŸÃæ\ µÓi …8*{  )ôú!S™M/E±sˆÑ„Îzh¼á¯6–À¾ºQŸÊüëØí~o üjù;ˆ’Iw¬oZ*“$1‡½; ´;êý¿¦qÖ«[¥íš–9z@¾O¶ÇÇ?.«ÏÅÄ!Å7:lz9Nj=S¤àì3efñƒi€p2 Z½¦òÈX‚W0GM‘1¹g&ùªÛ˜ÐÃòP{±¸ †˜ TÅû󊞟]LCoäæªë: MÀyدU¼VäìYSSî&o­Ò0–ȵ à€r,0«@€Ø HQؼH0Œ_›5@@046Âi6 `¶Úòê…,)I}«\­?BŸ hˆùÔlÑc å/·k=¢SŸÍÓ§P´Sšû /Q<# ÂI ù®K«‰(“ƒIP—B>,ˆˆ{íUƒŠâ„×5~Õ×ìwæhv˜ÊŸíZÖɾP辰E•ˆgt,™©ë½ZMð„Þ'‰_ä^1oA!óªS€à³¸Nâj! +ø^Vö¸»í+hᲨaÛ¶“Y… €iPDÅ£ó"~töH›n4Z¿È¸"¹KÖÛÎÓL <ÔOÖ¢³§ËyF£f ÛcKµýF‘Ùú4DD«Ä£ŒíR£`•‹Ô÷Ù‰ %1i5EÁÝ!QßúõÞÜöÐÖ#@x·Û Ò0ƒ®›LE™„dÖž¤áî¿Íoõ>Sgfì´;€‡LÔæ7ÍxWvœg­_ÿ{ûW½@E $e´ìêÑœåšÝÇP0Â`  ,YIB’Ó‰ß'ƒóF80 œ‡‚”, áA@Rá0 ü  `ÔŠåÐ¥™®n¿ìE.} Q`=ôˆ2•DÎ>ÿóK «É6¾VÓötŒ+j¦çÆÓJQVaâ^:ÉÁ°PÀg¦_À Ì^ÙIk馭[¯ðޱn%¥í)ÿS¿µ ›È×Z¦Ò‰$ѱñÄSîÀÙ:É‚£(t‹*(vÏÿÓL¾6{_® ÜŽóppËÞ!VÁü†A‘R®æ@Zâð¨Çù0‡?ÒææfY·°Þt ¦rf=r¯mB›{ùÝJr̔䋦 ¤fáÑÉoàÔ©b·ä…¾Hªcoùl…5pé¾Rsõv £\j $O”b•¢ø€›±#D8“…©nˆ… ®‚È´Šá'¨NMl}£©îqÇú1n ÀÒ@ÞgñMImœªeüN¢¦K«´ UY¢ºKÂû¶X¡þ* X@À `¸nOggSÀn&†6~ìHGXZ^ÿ ÿœRPSgheehÿœÿ”ÿÇÿäÿØ”‚‘7 ?Íúj]&OJ3mÉTŸ€h¦(m `lè‡Ö`=ÙÉzKw¥oúUZ]º#˜`ÁòTÐ1õ¾ó¥[Û¦( ²Â##Û¬~ñ ¨§SèÙÊEŸAì½Ð#ý¦ €ëÃÃ.øÕ´]eŸ5‰]B˜F¬ *tX=2ÕM鉧PÀÓ+Y¯.]Je‚!c„‚ù³q°›8’¬Ž˜‡;6³ŒO,… O¥€?çv‚èæZKʼnõ]_sWßu1jæhÉ 5|ë^gíRè)ºªTŠzÄOóé›"(Y›ê%!’lØ7Y”vñ¤àûÿ–‹=ѽjÍÞˆœ¾"ÔÃðþoåh$¦Ñ_JÔ´k@/½[tϺ•üPºúR!j½S/ #»«2K8^Kä~üÜÎæ~¾6»¥Ρüûà ĆÍ`R,Þ[“\­W¾ßTcZ~€¾È–øå D]s¹€ehú¸@-»ç÷È#·¨ÈxPþâMKÝÊeÉy}±»êDz¨åóªþþ(·yë’­¿ÿ ùn³€¯¸Ü‰Ò§:ÚMÄÖkz³ ¦O®ÆÏÐðÏ?€›Š>8øV=Ç"_+Š®GFö›Îgó`aîgÿ®öëÜŽY ÇíÚß/ÑÕl\*Ç]⥌&ESÓ¡ÍAñù9|¯¹ç"**IðpÓ‡œõV`Wú Áx|óó×ÀË~;ίæpJûbñüåÍ‹V¦÷ºCl·?³&ø#K’üy™5«… ¸$ÀYQÅ÷}.±ßÝ—­z(ÐÉ£¬fÞ"|.<ÎÉùä•×ÞãçJ¥Õ åÅW”ìÑ húPIhº»— OC9ìÈÔœ¬ƒ×„à.þDAVBCÂýÿôÃ[sWÓ3à ònDF~y °…ááh%P Ã%гðèƸrNO6ùtS íKìÅÈ5»*E×@ ²¦“ýìG‘« ¨.`Ór®bSwûãÒ)Mœpù ˜ê_m>m¶ÊÁÚóIÒJ©ÛH_¡7Pžœ~E9ÆhçîŸÔywv¿ÖSA Âu¸J0vÀK˜ÿü»/ßѼšvŒd#@esv¸€)Ó~[h+*S8T\1Úö”ë\£¯ÐgÛíloIWs¿ ¥*Os,Ó`êÖ!ŸÝì!ûà‹àñ%o´ñ8ÿ<ÇÇ«¥Ð{ þyž)…LFjŸT¡xú> ½B tÖâ\2äàƒçcîk|ëÛù‹ppösü¨À¨Òm¾ý[Ôô@³¬óáÇüšGc™/ÕÑÏÊž4¬§(Gò2îPÁ³ÄÑGËÖè×KºéZBºOœªª´ç:§$ÔÔxÐS¯TP±¿žáÖ‰b˜m’í\3C<§§®˜ X†.yòÌ8Ø="䟇Ϋµ€F!šx·d6ÀÜ¿!)È)ÃÇ=ÐoŠgîxí¯ ƒb˜†¼U C’\ćÝLÿΖ۹¬Y lB|œÇ>é锢ÆÄ\X°§¥ç&ùo¼zñ«„êâõŠŸ@âëFgëŒ@d¥K{{ÿ…£*ú±ñ\¥!¸þ f=‹Ç Zç’_T_QÏ݇¼øc‹¾²YüúIÁ¿‹ Ünùž™Å™¿Æ-‘ëµ7ÎWe¡çÕ±öÍy±…2ã €º bãå!R4ù4>M,O„rO+“ÑÔªùWr=S[󜹈öWN†'A&مôýçN(!Ê[­z–f::§< 7ü¼à͘,_ºxY!$îsÖΦ5[X.ýY“ŒøÊêÒ1Õ×!®dw°îÁ@?€á½<äzû æÉu2n±Óõv{†÷…·¸u÷æ:ow1úf˜ñpß»¿[#ºûÞºŒ/Šj.ïýzò³_²«Åñú²¬Ê<îj%–2·S¾¿¨å»b×öþÙÏ ª>^¯Ó´MÕ^þÔfM`…_Sv‹2R¯2Úv#~YkÆýðÝŸæ""í YÍÎû‡u7D$nÎ9IÎåo QSw¿©Ê¯×{/ê}´ýS¹ÜËVÐ*£×C›ü?þú±Îÿpþ_×ùnØ÷¦`.¦½~ŒßTôf3W0ÿ˜³Vi˜çWÿp|R±’y~/#}ÆWWŽÍ´%vzÍ5ÏÜ=Ûù­q>ƒj¿÷å8^CgHÖ(ý¿GüË­jÛY>w_êLdó–ËD¡(JQô5‘x# ÜJ ¥í¥’ ÛZ%XzÊRÓ#‹È¿ý ­¢È{ÆfgPÖ—eÿѦt¤¥tÔSt-ÅýoŽ|~^>Ü®‡)/ñíE=Õœ;ôQTw{fþŸKö—‡¸kûx~XŸÝ&¨¢œœZ¶{Jd‚'·2èñ¼ÅQäH÷¶p1ð:ã€xËŽ¹¸®Oé¨rºLë^ý.ËùÇu}™åvyþ(j®Ë;åGœ?ÙßjörÿýûëÐïøóû¥‡Ò<Éô‘^N÷‚›P@U÷]8:kEÀ€ /€ÿµª¬(& øŸ{ÄQåøZÝJåó³<ÜtZ€}›¾~Ô"ZÌ®kZŠqsÍrÛ¾™ˆ$®©ƒ™¾Xü¦%~çìŒïÜ3´õÙ=Ã×9´ù<¸Ùž>xµKìëz?owØY%j´¤j·úÊ"’c¬§”G¤ôÜ)”3ê]³dFÃÎJ,\jMÖôàZf8}ïªÙ-ísP¬Á¨§­Š@EÈL{ )ù”Y{E9åÊåÐîÉL³(Œ9)YC7a»Ü¸ÀFfu/w&·L:ª^µ¬ÎíµÝ ,§Õ%wº”e¨´^1øMH·Œ]ƒ¡—P[wܧ¹«Û$€…Kn/#‘Œå–aè¸aš.’œ½û±µ)o&Œôœš@ƒ%ꪫ‡‘‚Ê ÅTȨ" PCOÉHš ò ]A;Ì¿°W}üöÔ HÎL$#&wÅ7ˆl$¢4Ýa¬ Úm â?Æ ‚ 2ªÛj”*ØÎë-^ŒõØA— Thƒ»†9ò°ÉªÝ‘)s¢×®´ÓfÄîùú{p))âÄ?›Ì°Ñ:c=0ÓR<%×mÑݽþü¸Þ‰±fÐöÙ^£1ºÁ¦põcQœÍ푯šŒó}Žgä!/#Û§]hä‘ÚU)Qî7®šîk¼«qå:°•I‡£9+jnѵżçn|—õ0½¹æv>´ иazuØáˆÝbåL“%„Âëì]å:#Q„3ÈDç(Ög Âæë\¬zö"Jy²ËéïÜ•õßrUÝ0s»ö?Ú«e„ƒ0?áN"ºÝ­§/cA†Þ` cr?ÿáªÄÝÁ&½J1€Í_­fê뉎æ6b¬ª>K!ÞèTÓhà Œ qEy×ë$Ì4þ븿ù+3"O<7ø÷0:ywŸKçe!¹r—Ì1 —ÁðËËE`A“vF «W¨ã‹–RÆ”’yz‰>õ}Ö~‹¥l^ñOHsV$£mdpt¬—ašœ™ÖM¼,k÷¾Ûšñ¶uÃJi¤vÓqV(±‰²ÜŠ2ë:„¢°½Ýö~‡C³‰˜ ^Ë™KRîGíYf?I)ê¬ÓÁÔeíþŒá »÷éð®ÆIÒ²h(k±¾-Ý»˜írÕf *vvÔ3éy¦ ®¹›7l}TÕÆ ´¾IÉ8îÔ¤E•@2Œµ,fª(ÐÀ›“€"/;üíz‰¡W3îØd²Ñ›ÆËž“¦±€(„š Ô0‘ èÍM)fq+j!–$F”ó=8ª‚jF@«"`¤V£Ÿþ.c@„Ø^ƒ¡Ã0´¢· ¨ÐœD bÃ#eØ–¿€ŽR*„y‹Ì!3^«ÀºZ¬È>`‚æOr|r•«÷‡êî“-ƒXæ'Jt·Ä)T%ø ßý8{Aâì*ÁôÉÑ–m¶Í”YÎ „ÜÍíwp³ëlís” ¡º—¾º3ºi«6 íkb£á»ÒÞÿ-MR‚ïÆ!'^™dÁªô”ÜÜ¡Oð ÁíHȪCHoœÎÕ–e¡¸†/3W´ö:PÓêTÈB ²éUjæ-†v´Üd\aH=,•Žy±fªž±ðíª6X|ß’ë•*\Zú\¦t¡ó²ÄCB¥'&`OÏ*{|.—yú³©NÞ¡ƒà LÁ™Ž{oŽI—™ËÙI/L6=z¦9°wrÎhc&SJ(VÒCe™¶;Nq>eÇx€.W‡Èë1cá€W5ˆ(Ú‡L;“Ɔ` ×HÀn²Ës7ÅuÀ}²¢†©§šIGƒVdìD(õ”XŸ!%%è…©ÄÁ™3¢’”º˜ç“m2Ç ˆÓ@XSc ˆ•Ô€F&ˆÅq Ú¨Øe†©ˆu© ‚h±Œ ºE bЊ`@JƒÞŠXOB×F¥+AE§ŠU0ˆIF¼H„ÇÖ… (ºVAÁ €¡e¸bÏzož«u2N 2VL·›­LC¤«5jó'8Ž^o­Ñï²ôyìÏ üØo 6ÀSAþù]*sö4Ä?î1ýÌWóëšÛlªÕeH‚ÉÃÙ£ínú‘WÄvõ®ý»W@ÐÙïò“P1¨p|0y¿’»M²ô9H°ö]ëÓo 99C@¥ tÞæÆÉ»òÍD}Ú(õ-ÃH[€€K½HfÀd¸ýN^2­ƒSÔÐtâ™æhí:ñbDÍÞ…J@p“¦W•:éxùÿµum½D÷µ(=AvSCs ‚ÐÜéµëDé !°ÚðÒîCŸ´†H¢™weî:“̶‡`se g‹ Ñd­/Ý "SdÂú)ׯ Ê×´¶Ð8°Öv2Þ”Š$Ý *kH¡â,9IP°EƲ.K$Ù;ºÜ '£ì ÂÓÐI ­d Ú£ •ÖVÄCbÔ²›I5D‡ˆžMmÇ´„A`—……¦bÎC ¾‰dZš@ƒ€¬;PE¢ð‚ŒÈYÉb/(Ö3(€Úf›/% `*"–1¢Óú ÷5h¢GP`ƒ3Q[WÀ⊈#=¾‹­ºÆ%Ò>eÆ|½Ø&„ùhItV8£Oދ߶³˜Óì™Cû3«Á€Xõ Oöä`êj:@°÷`ƒ30v¯È"€36pvUà¸w¿Õoë¾íN†/>3úîZ?›äú¯1\'ÍÏÙÓ§ÙyXËœ5‚_^Ô[õÃèA°a`$­§o€P7=-”±ªq¿ÂȱÕeâ>_2ú° zÙ·#ûà rÌÞqy2bö%B&‡ z¶gh–½È§Í¹ö¸ ø¬¨Ï Z´šY»žþ£ó¡ çªÛhⅽ꫑Ïëd½8 -P–’ÐOÇêêaŸ˜ì_8g¶F_™}ðôt슡N݇¨©£@+ÎD+Ìõ]†6Mjßꀷœµ>“qÓCÓrÃ.M”n’ ÂЄU±–Q"“W„ #`È©E«¯  ¢œ‘]À`Xj1YzU°0´±aˆ–!¤¬+C€Þ†“VpU m1Ö@%àÈn]‹=ã€p.i$öb¿Û¨± –\£[£ ª¬¯fPK«Ö2àI €¼ÂÁh‰ b…!@`ŽU¨ '€ŒX컕 H«ÑZc_‚¤pMþju¬EĤðßbGc,d,dzâöƒù§CûS×þðeöZAnÏþŒÎþ\þü§ï‡ŽÉéV6Þ;9ñ8žXpÆšÊûS}(¹€´xÃèQö}ßzÙ"¿­û6Åæô).“@’~Iÿ?Í~¿ûÅæ}Pë8]¿ÖV¥ë¨­°Z_¯ìËà ÄmÚ /dü¯û- ÜÔ‹|)B ÆM…ðr6¦Äï* 9‹2¢ò@ˆºO7Ö td¼WÎÞ-¿ý«9Î¥65­Ë^KM_2ø2 ËäA÷s2\ë@âÀã™Û×¢ú±LÒAk¿wΠ•¾±úŽÙsI wL]©¦è‚§YœsݬK/ŠÞT9Ø`£é]PxCãË®¶ms¦¼óÔ„bŽŽì±•ÓH5žõ==2 ©Oš«¦Ý-÷Ýa×hD“Ü´Þïâ>ê5Ž,„§vª»“FC: ˆµr5QÕ²UÕm’½@ˆ+‚¸©¦]f¢à´€B¦õP„õ¢¨]&€õͨ¨”Ttc¡pEtFtÖRD¯8ü‚*?½`,b­š*@µ@ Šhc“€…XÀˆÅª¾ ºC‚1‘À¼rðµz`žZÈGd,42m)Ö“æh2ë$£'ý?]æ^¬þ¢þ‹/Ú£¨îŒ”³Ïž'üĸI€÷¹íÓçÀ}}0ðTõÞûÌdÍä˜X Ô¯'¼I¾ô¶©À¸fr¶ D~9æ¾sž‰w½ ÷=žN¾ÜkµhzŠiÚwÖåsÉã 0ôÜÑTó dBÎkîŸc ÕCù9O È•ž[¸BÖüm ,OÇ%PœÍö'¥-’sp›Ã–¡2d¨Ðö|$Ÿ‹¸ÇÔÉtŠŒB’H¡Þ#äõãìV¤MÝÁ:•Í…LøšÕ+žJ²„ Þ€ïw`aj<x„®XÉ3#<žƒ{kÏâ±I330_MúNMÖ0“Í¥—,õÑSgoxûp’•®.*–”d=¥ Èh²h¸S ˜»[ìÍèBuAC! B¯Ñè÷xÎ…4i«$Pè À$Ž UWˆŠ’š¡Hc€XÇh¤x;£jS 1Ö­ ™0`½"E!TT3g! "(†‘fTÁV5Ðͨ Bj¨Æ;Þ^103fTI@°ÆtòUv$ À@`bÌšˆEƒ±ÀNøFp^Zd°H[]È4ü­ØŠR°Ä^­¨ã{^éù–£¸ à@õdh>½¯ü‡Î*S$°ßShõ‡3Ð÷&ÀÄ=œ1ÎNõÁ˜-Ùü\ãÀ‹N¼€ØF¬ýåQŸÞ3VœÝèƒñK(þãò\wU¨î—À£YZª¼°¿!>os€ì‡–‹³ô& xj$‹ºTÃgŸŸTß„R‚ôÙ«ð™œ3ÖÏF¢!GbŽŸ®Ï{€d(!‡¨"»±3W{fJ„ bº˜$ùºs›ycšƒ¿wžZ®Ó*\:°u2Ôò\s•õ~¾ ™6‘êxØò*M§üÌ—h·¦š0ûÝ!QjÖhà Ü2ÒhGò¢KŒ±P¼SÉfˆn×ZÃ4ÓôqC¿ë½­ ¨Û°>/‡M(€€–êj¢,À@Ò$Bߺõ)D­2ž0'®–èX $u)Ö•41Å sbUÝU°T0ÀÀ aÜ=fRk€JÄÖÆN {1õØN‹L™2‰ˆE—Q‹n @‰#V ÙhÕÂ{c0 Ó«ì<ºTÅ*'$_ Ã: ˆ G0` þI•d Éh+›,Œ›yEv Æ8ÄÃHpÿ€×hçyí1p™-7 ðyæá` "‹€3ÐrtÄü.sJÀ–\ùµ—n›OrG) H€ÇŽ[²NyÄ\ ktÛËAKœneï¶Ë21Q„‚TK!í ”LÑ6z—b´ç– € BåVâðUÎdÆñ^àµîš!ûžc+Öt á³±„@ ´åÆ\P{T ?P¬u© Œ±½A€ € ªi̪¡ÙcG©ÕO¼ÓØ}®]ðlŸ7¨TËë1<Ã/æk*º÷–¿rÞVg'ð W†•½lׂHY Ö ú\òsFŠ@¬¹,0Í'( çX_Uª,×yÿÇß?—µ;ù\½<Öݳz[¡P´-æî†ZfAQ†ÐDbQNÓÙ4‹îsÍÀÄÉÆTi/ ¨@D» €{Ü (kÏÒЪš‰€BÕá€qi&€(xÚ™ 3í{ÃЬn- ¡e ¶ 5ÖIs$U1ÌÔºm…ÅÀPjìÅ *46€…Ö[Z‚U¬SEá¬gпЀt¢ XV00l´P’`09%­)ÖV+ ´yEvI”²Z´÷xŸ??­÷xŒ*Ø÷ È8`y¹n°íù%$É:¶}£Å%.ñLÌ‚„è-ú°·®D¬p­Dÿ˜ÿ–‰?ièAðf¤AK hã¥;pҜŷŸ°<´Qä™  ¦H¯ANŠH±l˜­Y‚jYs¬¿²j! „*޳„dRxùíº»¹bY÷ùØ$KÙ;¯÷ÿ#ÇØGÏ£/jù²”_Û¥ý)J$??K’’IU•V?û’PÕÏð¶im"È}¶¸ŽœAr½W¨‹‚ªfvPiæo¿ckPÜ’…ÖÝÝ­µ*à €Ô3ì;SÄËwqáºÊ˜. 0Æ ´úèp´Z§–BJ°X•©Ð€d„÷ÒȤQ” P,GI–‹ €JµsțqU×@Ý,Æf¶Ò wj§äD¹ ¦¡«ñ;f "ÍBŬfñ'H™˜ŠQR”ä³B95åñ¤§‰EŒÄ6“¶¤ï„´I‰‡½¡ãı`.!  ´­‹ŠaúEUÕjµEœJ‘•JYQ+«½†ahO׊¦®Þ…¡"NA!ìÕV±®Zž¾®ƒRUÏwYÇákµ0Z¤jE ˆb¥LQh "³ÏŠA¸ÏÔ=[¨<ïºïQ­è5D¯}F×?BA³£§ßÿ>çÇ&zóõ_5ìzNùûãðyé{”ø|,yª{Îï}€eÿÒü…øÊã˰ÀgÌj!–6£ C°ÌbQ.J%1ýÈŸ˜ÍAœ&XíX¸bÁzC‡Ñ©+z®/¥èèkˆ&ö4¿¿?ô‰/¶óÖoïäýõˆ·×”œËu/gµ}ן¥äz¹„õ)ú~üK[ñ0 ùð³ZÈ´ó*cIŸ/RªZ¨/€îðê?,—£Á9%Ö¤}äc´Ó*ò¦ ©JYgH$èÌëãï.{t¥@r³Çð=½ß_È­UÎc¿yÒœ/œÝ¤'xrÞù&mâdT±…ß~?kë¤ÿ¯¬9Nð°>hwVB‰áv1Îî¾—jr¤¶—¥q,^z@ÔMG&R‡¬"&ˆÒì©;ÿÞî’NÚâóÿ?®¢‰ÑNyÝΚے«¾-²E—¿ÒM¾"ŸêÔÑêòç[fuåe÷¬Ø.bZ1åÄð–©®‹œéûß/HM_ËÓPø`¶‘ÂÈÛÇžDÞt¹8ÎOggSÀ°&ÊòÿöÿòÿÜÿëÿâÿ×ÿÈÿ¯ÿÎçÑ5Ì÷é(¡ûi’*†î§ëos–ÉõžäÊó’«2Êß»dƒP9ŠÇÌ€·û-{ÃÝš&»&Õ}·9]T'¤Ü›Ú?uÍ'’‚¤nvÆÌtÞ:¤:IKX—>ëÏTJÔìí42°IðœñÞ xH>Y Žæ—·)õ˜”:²#xn 0ë@ªö7ò •Vä-UßÈjAÒj¥Ûxzùœ—P¤ÃB@ü¯-úZZñùÜñöT[Sé×öI#Ûr¬?nî?ÚÅJî›ÃÛ†l0Ÿ²G`ùÇBýî†ì›¤‘ Äž  ‚n~Yç+4Ì_"Z3º?À§ýòí‚xî»6h}®€+|ŒGN@ÚçÌG[Q½…ÖÌ¢¾J€2Lj"p<×õýÕ}Üýr޹Ç÷J;™èÇ?§£àVréÐûSðdð#iÁꡜñö¼ÆIÄ+G¿1!V§D‡ü©ÆKTÜ’ºÕú’,œšÔÊ"Æ×M§¨¦VÈŠÏ›ù›L›>•Ž9@ÆÇ8XÖVe¡Ðé(ɬæL|¡x¡wÓ9›ÕÛ.Ð`ׯúL袙ʄS‘Í$ñqä$Sq©ãÿOCŽn(æ49ÇIÉøŠa 9†¯åôªw&ÿà“OR1q=¾ò®YMC—;MÍq¢~©ÁLýÌ@B÷ƒçãûo‘š„~Ñh –-@.>ãðiÀô†ƒ`@€Ðû|U€£BÐÖ(«TÙK"5©oxî€ýM²À Í2¤@ofa½¾Ì5ŠeÂÕî#üKŽà•UX ¤? Œ¯Öè·£¸÷{’Ál<oe]øn~Y¥Š€fnÊ/T¹í'•) BìÌdôèþŸ‹Öÿ 6*/33Õë- àµZòñðn~f{ÿ:4@°0ÏÀÊ3Âõ­YË’ Ú‚¸ “¼@p® ¶sÿ>4ŸóoáÌ“¶ €Ç^Ò×ëx!øÛ¹½Oý3ɯ2@Oê˜ÕBÖlögõà›¡=»0¶2°:½Eç þ©… "¼bíj쉳ï'â¼²mšÒŒ«\†h ¸³ut’åñ ˜cCçdóùP!uëÖGÅ ÉëQr­xéï€Y»†È2ò¸íïìLHª_Ï 51á8«ËúÓCÿž˜hvÊqÌåylêèÕ(É!ž^ö¤e›i‚ëdeÁ<$<r…šM»}&à¬Û q Îsœ¿(º¢óöLÕÿarwM‰…\g  —M±f¿þù#õù:MÃäI‘7u¢UÞtNeö† ²ò.Þn ~jl¼óá¸ãbç$°IDþìé"Ž5d ÷e]ƒ^„€â`cÐ3Ø®SÀpK<[îñº‹ L¾Ø¥WkߨI“‘ TÈAþNƒU BE´×¢¡¼èp_¾ — HÓнK~ ä­Â°ŽHÙÂËËgûþXÅQN‡ø”‘å¤]$òa>dôèý>g»þ9öljê§ðî‡h>S?}3 àøß?%È 3ɉ>qx4'¼°5𴹍j”R"I à#¹²" n|¶9´PݑУü3}Šà) %ß_žŠìWÄy\Í{“€Ï¢ O[$:Ú÷'›Ú°} ”Ü –v„à=å»…|?Ìb$¯ö)Y£Ó¯®„’Kðôš™ã”ÒŽJÿî—jx× ˜ûŽvOî}íù üË#fÌŸáñ‚öš[FBþUËýÕ!/ŽîÌLª²_íÓì›^ÄÌæt@½3“ëÚ0£y{(žh߆æT>³]f‹<C3³:ToA=žšŸS ›$Oû\Õë.¹“×€©»¸"Éj(rž™x Ë½{ô{UÜÏd%g3¢7^l¼Dû ¯)¨ž+:]£4d1ÌZ*’)6ÜŸÉ“›W¨,b¦ÃUú¦ß0{Z 3®îsÏóÁ7Ñÿ^z:Û @õ›íœ ø¶Œ¸,!ü@‚T¾&=Þõ †i‹R† ¢ió9ÓB¨Ý·,» H@쥬†Œp*1Q2ª …A»Œá理ƒEÀˆ··ƒEi@€~Yejj¦Ú ä¶òE^¡íӤ⥠7Âû|.Ï×Þ˜}“[|xV5¹¿+°À]Ætô0õá]úØ‘ï>ikJ‰S&ð°!zH”’Ç|ê[™×ßb~¨!L@2} @…}*À©šÛ´;‚’!”6Ùÿ$áç;Ó24;&/÷ssîÜPèJÎÍÚ3Q{ýù_˜CeÈÿxÙžšä¾Þ³ÝOíÚ#Ãf 1L‡·ÅcÁkåaW-]Pøë÷d úÕÉó{`·n†n%ÀàíeîöHo“¼YÎÕ³†&áîW‹·»×èY¸°­qÃKU&lªv×UÐÔ§>68ï…Æ¹ÿ tjÀ ›|X2îÀâÌæ¯ÛzÓ+ 2ëC'‘ye#ª ?,qÝüýÇ¢Κf˜æm8¨+ZáÕ|úlw‹ÓÔèßÞQ¿Â\-d£4ýò©ÎóÎâ¼µ¤Ë( Aó>þyy C“@3ä@N}~g1ä™23Íy ÄÐø²v[M”€&,ÔxѲѪkÝ»ŠLrôžCæPl¢òë XÁ/°€z@ P¾§(®›¡ÎWøzl`E¤ìJ‘‚Á9þH…A-;AûMAÖyòÊ”L3yëÆðü`°GÄó§|éïöøÜ–o·H¼yÜ™Qž:K¾ðÊÄ8÷ À›Átw ˜úEûÚ:ƒš4xi‡ù*剂"à«à^gÁëï«  `ëq rÒîëpÈþo‰@ök@y@ˆ†oÔ († Ú£X‚_!”LÒz äBÉ£õ›l¿n¡ÈôúOûwYÍ·Bɀדk íg}ã14®'=@ñ| ´!šÜr²¤ÑS*‚*×|³‡ÊóWY±!Ÿ? ÷Øf;k{ÿ›·ÆÓ”a-ó|]³ÆP · ¯føYn qo$Ý{Vm,Ó»-–,áIi(êÉGˆúìÕ4yˆÂÝ dm톗*0p%'3¨‹¤9Y•Ãói˜„èéÜ5M}zéˆ x  4̦çYsúm3DÕ“S“†ÝKv¡é+ÞÕ]Õ0’ðS-4j°CƒVš~IÌÊ÷Üž“ö>0½v5íˆé™äûÃò²]ÄkD! H,K+Œ„2 @r X ²Ђ@§^À6 8V ’Ê}ƒÞX$ŽïBþh¥™R.ñ˜ŸlrPij‹Ê¦¼˜ä Œžw—‰ûæÎð¹Ó5a†.KÌœè'€¯7Â&ÞÇI 7ˆÝ†p6oàÚà1NØ$·Ùä†ÕL¼” Qp"Œ,­X/ù<ì{x9DEà øÿR>-Ò{‘ˆ Üž€È„aUîê éC3zÎÆéò«/xÞ,ÄÿW𯊠¯sÕ+F ”®djŸŸÿ}]·×H–2{œ x›ÇŽ’‹ì“É‚WÏçà .ÃÆE-Šq¦i–ózŸéjų‰²ìT´ÄÏà¬Õ`¼{òøÚ÷¬q “Y/‹:µ™ÌOEœõ¾Š¤¶'[×»% iï Ò4IôC¿’¹ÅÐ%Ãr™†jö¯º Ø#ãøO ÊÊ©J¦´œ/PI9Jj(&¬¨§q× ÚƒŸ¹tªÅßg±ð‚r Týöd&Ó›ÓÑB0±Ô†ýã̉À$€¡€Ê»÷mßW–¯ïKW,3Ñûw*^ª€P³]‡û°Ö?`è0Ðè5º%š7•!(0cšëü“** f i5v‰š‘ù°lr£±8X"YÆ‚$WŠ£ç8ÃÂþש‡¶ðìÉ•’@»&𠀀𴪼ÿ¾ èàT$g “[Â>ú-ðë¾z¡àsìæG%-F¨„ Ÿ€0Û>´Ÿ #¿Ï‚ì. Ÿ%B}7Ó£\Ïc)=@Êlí#D|’K<™ìÏ>ïUýË€ Ïö "›…ë(+–Ó7¾BAûÊÈ-€W@[õßs¢@ðЫkfýÅ û„h~ùþè|×}‚ÄáKaŒ§¨]¿÷Ûdël²ý_EIaÜâýï§žjـæ(:¹yµƒæZZÆ–©¦Â¤õÆöËé-~ÁA«hý3·, ©ö¥;pÛ’~3  ®éd¼@%Co2rC åÏàÝå”Y¶ý¬÷$ö³á®3á13ÜÖË^ÙÇÚ»5}¯$§®‰ @@WO1œö…ˆ2€’2òÔÉ$ uâ ÀÔ\@Ö®nH¸iÀ@‰}bÂà@›ðsé4Þxe™R–ø˜Æ”›¼ÒÅ+ ÖHÙx È%ÁÅó¼ŸÏ µþä°öð9/ŽØÏ¨­Vð%À³6þ÷ëOÀö† (½™“/1F2„‚—Û]pĬfª¤€¯`ÖÝwÛgžàŽÍO²=5ÀåÿÒ ™tœÕÃV½‚É!€xØ€s²~¾“HŽs¸) àn4*”è ß@&$ŸÄC­c4Xlœ ÀËøi aK€Ï©\Ÿžöû‚7ç+¤¸OZÚ DkŸ¸¸!º†ßØÈ@„å4ýP¬n»çwÒ _»Èë‘e«.Ô•OggS@Ï&‚è8š ¥ÿµOMT^c\^TLQLUSg^_MKgjgÿØÿØÿ¿ÿÅÈËCZP €¦ºHh(ë©Ä DçÇÈ$eœ˜åçFñÐ" M!9 =í9ëdôL¬ãfí}-T8Ðýþ0ôÖˆðE"x`,ƃ¿Ì«9Ô Y³Á;k™ ªr(`ÔÔ>sǶ›ä½€11‹ætÇtQ@×îò`­ ›t ¡c@xé@ÀT€P@ x í5¬F»=D–“§¼µgHÕ[æ÷å€Oïõ(nDÝÀÓ µÛ@üËpݼNìÎÀ#]Ø9cÁï¹ðíÀG1Q¦š9•$L"‚ÙðUôh@pN0ꎠq³f4ÜaHˆ&>§Û|7UÖvÍÀç;§Bù*ïäY Nv+!ŒÿÚ2–QªB|+&ŠÕÈܽ­»etó<° õ(AÕ!g*‚ïW¯ës­ö¡àñeôV§cÓª]»©cô<ï¥Rú?+^2Òèý™_øÃ¸'Jtlj!O ¾Fï°œ Óâ™™C¥œñÌÌt£ƒKÄ[îF|aƒœã ».$d"ý·üÔä *cý-wöåºGg4Âòïžœ&¡€ÜÖÏ©qð&‚«‰ªiËÑ2ë¦(À!ØvÈ>“3IdœT+ÜybÅo¶–µ\Yá·þoÞ8ké‚?’j¨ø躳ŽxÕ[q"ëñ5 ŽÍ+8`u¤µ°]… p2@½x ÈÀœNõwvwÍl²S¦RÑS{Û.WË3¦ŽrGJ]rJ†´ÎËË}ÿ,”K+²RKÝùÆÜ„‰ÇtýÔSBJ9jÆÐrŰðÛ÷E¬Rá¡<ó…0ÔóS¨vQö÷»JÄEÿà¨92¼ˆ¬(¤t€³c®–Bëï|È?ãtͪŠiYS‰aÔG•è¿»²ÒÕ¬i¾¯—¤RU3<™ÍÜrtê?¥ž»Ýn½ŸB\È&WŸ»¦ªin°yš¶é¥a· `:‰Â…ª /»¯ÇSÔýÌÓRpï¯5%OW,oïøõPbdZ}ûýÚ¬"U¼t OûgúpRºÉ=ù *ÚÒ€lèŸs&ܸº°QÕºzß[Wh£N˜É`çkDºðU·™êñøs´§,‚¯g¥ Ú©Ò „§H=#g0Rî×”RµjÛÕMðVŸt¢O™ŒÔç!ÀËs&]‡̾Q©<»í²"9ÚÊ=è•7™Å¯úËr*o{ǨçGÎz{ lúëÏ$_>âz!¹¿µš×¿á{[’ªBª»›ïf߈lN‹‚mì›Sƒ¡QAzö°Œø ÿÌ/u±SÏ]y˜?QYcþûÝw†¡ÒY¬ý` ;éìuîÄE4ö&ÈK¡]?ž3Ê­‘¦C ¢ ÍÈ RyOÁEñÎæBp¼^édkpó{ÞâvK’qô(¬‹än§ð–šn唦7¦Þ6ýÄötÜ\žØid²s>dqã³âV½/'W]!—¯íRŒ€.2@;;Šüy __|ÿ³tرS|BËŸv@¶g&Vê_¡*«,õ¼¯íz;[{6O‡ööaù_Ó’a¹É–è?ïliR›Ž£„þµ“ÐTòÆ=Ë0Qw?˜™dò†w ~\6wÏ2h«×¢ÕFFº‘Éž÷_µ>~‘„M%üËÎÜN;~ÿ&wÍêO1^žkN¡$Ó9Ùú½˜þán¸ '¹æ8ŠíÇ_Ií5¬J WèÕÃ:rho©âœYÞHÚÀM§:¼šhü<Ìy~Ëù1/DUbf­õ®AMF[,cê ¿#SúÓ‰uì?7~Râ*VÆñ °Y¤J W#€¶4Z²Ú#å6!,½[9¸N½„ÝêêURìÿ;S‡OŠ·Îò½ˆ ŠŠMǧþd‡0­ØWS°;‚ªHc£³W€:x|RË/†NÜœLäõÊêQ:×€÷´4J×DÂó@QAr?“¯9ûhM¾VþÎ5a»r)¯¸~š¹õ‹ˆ`†8Ò¨øo*V™lί@qó[ =†¬b .FPÓ„p–Z-ZíP.n }€¦Ì˜ »B‰y¯;c¬©üüïÕ¸T¿~"ÿ¼û¸ŒKXÿÏ‘ýûW\ôós*dfÚâèÉ䯹­ê¾¼ZµfKGé? tÎëT˜•p"ä°s~íµÇ{Ö‹œj|áiN >š½{Êö¡ta®ïNVÿuÄ=Ϻ¹–G÷³šù›”̓=˜[ñû¿.S|ÎDÇ/ÿÄ?Ц†«¹ߢî)?”r|üj‰¢Cf¹‘Š´yÿÍJnCŠ4á\ëœÒj6Ñ¡9 À•ß0„oç_>7A8 Æh®qêm?ÏUaN=VÊÕzŠâÐZ°å¶Å0j5Ç X±u©[jÁräzig`Å”ìPÁ^àXsÌ…í6 -´A:p͆?rí_[­@ÊöþŸ· ­Wø›1y¬Îj­ QZ•(EØ¢éŠq”,°ÿsQèAq)¶Î†Ã±b;^„ÀÄÿ¿ú üz©*D•hÃ`/¤ ×˜¿es¨PeÀ-ýÜ‘\« Š¯5¢d9 *á5Ì£œ <9ÙíËÜ„0ôngسe„AÐKÔ²ü ì‚…˜pÇ^2AhÀ‡>@¨j!pÝ9aÖt|z·æ¡Eê;3ØmbÍë-›B*Ÿðãs–¤@tþe¥IYêP,ˆˆ…ÔJDC«Ž8ó«ÅF*Ç 7ÔÇó´šy{›5­ó¢€ýÁqíéºymÅ7¹?þ¢9-5ñÑJ×WYÎzÕ¼Ï*z0ã:ÑÌ~ã·»aLýñû…è‡w”K]Õyžûûûû^‘)xÞõÌf¡ÑFg\ ìà7Ëv°2Þ °nÑ1ðTX¡TYGdmL«êÍçgêÍ\=ÿ]»P‹—§JõQÞÔœÞD²r:ÿ/Rñ|>|ö_sø|‘pùJ¿–q,þÚŽKéÇ©y:þ-3‚«8$sM™`£Ì7˜ËÓ Ú °–c=ÑÁ¿Æû¾áñ« û“Öe/9jêÞŽý¶¼†Í4ü‡ñ½æGÄö½Ë#ýãÿÜ>ÞOø™M~³c=Ì(MvåÕ€p¿M¹|üp5à {…Zƒn•Ã|­]Ž:P_¬ Ñý¾àt/ˆZ_fÏgc´Ö¶µ V‹¨‰“„b.$Ö€µ|µ¬Ý9góƒÎº>!ÊÖë9ÒÍ0î\+d[ÃˤŸ¡þ޲ ôäÏžíÐ…Ð_W¢û“%g8KgÏ«æ¼{åÅð`ÎäJêu:ÅkÄ,Ñ)ç›í¡'Ž¢yW0H3U ê·^Þš«Íˆß1*‚,Q/z0ô&¯¦.T[ÿHéÀª@½ÖmaH •d7l¹ç¸Í³ ×þÌÂÛ±§ Küé<²'éJu弌Ȟ¬Î—aHKðíþ“g]hö›ó3'{žd`jÜåk·¼ü¬¤L›"霳æþî²Mrß}U5Ffà)áf’¢ÉQ fƒ«‹†ÞñÀù\¿³Üë)*)]aŠ„N6g†!àšN a´éÌ¢o§—7Ÿzc$‚?³r&³Á È´sj)7kÛªèמDmºnL ,G*K†¸Ÿ ÁèÁÈ–(t¡D(‚³/ÈNÀª nd0y  ~·`lù ½ ˰ǞܖpÕ mÐØ´êf6ËÞ¼¿~Üû±$!( N›®þ›u,Bg@/¸kt‚7è=ËÈÃÚ¸i»ÝÛ~Ì’µÇïwû>Á*ì[>šd~Ù™ˆ¼I©j•€Tû²’íma÷6žïÀ1šèëÚƒí:ëöñR„E¯y<®6[çÙÖG©!3 Ë«÷j,ÏK‹cÜA…-5¯{æ;cßUO«\ñà‡v/“•f–£![ƒ•à ‚‚î®þ´»o¯ÌÛƒi…3q¨ô‘‡û2ªú]ãD1ADô¼‘L˜¢Ò L ]§e B`"šù\Ǧפ÷Oµ{rÈf“‡®7ê¦Påa"ŠJ’jž)@Úß™Kñèò&–¯< Ñlldøñ±å)²gmê§ž9ݲ?Wz.Ðfé—7S#ê>£Å9õWÈt&E{ÿ~?¾¶ª«-+O8ðÛW-³?új1 “@Wdjâê?4ŠHPЇSÄ3›óE½åf" ¼`d®Ÿ.%¡¨Å›D$)ì™ñ³,sCÙT`K *”Ã*cûWqªµ’H&'JŲ¯”nž}Rܰ6r0f€÷A€!é ÃþjlhA  ñžøtçd@‰µÏÈTJˆÝ:Öi%D½ÐP†Àrý‚Mÿ!¡£y (±8P—JJ—€1Š%Q}#Ic 4þ^Ó†lÞ¶qç~,àE ý@ Þ»-¬¦”¬ðçr+ˆAX°ÂÿAu¾bëõ¯V? ºÙe|yå—ßñ Š4Ì~¬Ìƒ8ºà€}Ïçhͯ][«ªÔp%ØåßZÌ0ξçñëR1·V;ˆrø¼}íãŒí’•{ý˜ÅÍx‚ëœÜôÀ§¯º·xa @ô;k=ÊY­WëÙùŠç¼Qç% h±˜ôL{:z6_'a9îM-Sì¥Ê=û¶‘“¿õåW"* ’-–ŒùÜ®ñS/‡û?t3¢U$2–ÊB¨ç`Yô‰@FFûíVô˶ûôA“øî>CäàGƆ”Ÿ¬…¡3A¨¦Èxóö4MOggS÷&ƒ¦#ÜòÂÿÉÿ¯ÿ¨ÿšÿ’LPP_[ÿ°ÿž]YXXJED}ª4d­E?_ÐÚsÅSwb°vš©N;ŠÅs= ¼ü’²Pj­9îåÁLÎ3PMY™õ¬-:ÑÿgzÔmwâQ-èoøÅ¶ßã.š¼©É`ðçžÞE¬©Ù žì£p€¡€Í7O–¢ªapL!"Ø…£Ñ2p31GS‰ ´D †(ÉD<í#•C$ì5éåxÓ=tÓ›ûdk1e‚ß ÒFË7–-¿Ž‚”4Ë&“ÏÉ»ehIkp[¹š¯™Òi+…aÖ€1[MZÑúñ•þ àTx{À~ÆjÌ1½µc5‹–R"" Ì=rck‡/{¥wÝÃ:ƒ[@¾øy®ýòå³ë§îKÓÙÛ @òæ Àóˆ—f:EJÄJi… óyœsñŒ›ú†Ã›8ò[™ûúñ§ºO™ër¿ÎË,RÕï”#*•ç´×ô• PlÆÁ…¦+=Ç"Ùð¥·mq­§fÄj?ý8dƒ*½(Ѐ¹˜=Œd³ý¯SÜæ*@°\¶Gý-ÓÝì{z 3öŒË!wÖ|Ã^5©9õßÔÄwÄ¥ˆšH’ÙÂwMd`t%dŸ_ä©“P&šžÈ¢-¸¯Ÿþ>yz¯»É‰¡fk€$TQ;TUÙ"Øt«•û5: ì.«ÚP4=)D6”ÇÏy~ðùY£b˜dR´:(³âs_NþÒ¨¦2 ~Ý`¶Î¾¯Î5Hؘ«ï½gj1ùšJ±4£1 Ð Z¾cXÀ œÈ0< JæAù5¢èYDŠG²À¦pŸ  Ÿî*l…Â%܀ꡭÞú ž^«5∠†Üm”s i†æŸ9„&þmúiþ=š¾w.[?ôrúo–oëù)8P‚¹ÏeÛ.;j¢Dðš‰ñÌçÞÆþþǸ÷Ѩÿz÷2òÛ@Ó>1ÆÅGy¡_;¯`{Ðrpß׷닟tïUo½b}H’Áýì¾Ö’õ¬8 ÛlÁý0²‚SèZШ#ç”^»ùÔDÂäùó´ÿÖé¿q!™B1•xšèQ¾÷x‰A¼¤]@ᘆ-ˆ¯íÈ‘pdjÚ@ADí¬l?l(,“ŸþeÃyø®aèÉPÐiØy‘÷¡Oïêâ Ø›°>Àª†©-=¨ºËV¼âõdBzyzÓJÉoG~‘N3„ß_™ûÏÁ !ýÌý¯ª|£7Ü')Õ Ë´‰}žß»0Ou-E÷d¥Q5”’ëîâ ÞZŸŒHÍñ`­yÝ4tç)ͳ1 ‚m¡x &\,ÆÆ5‰j)¯@ˆR8@C„O-K²4@,°(adékº ´…‘oPÐÄ®(jA× ¾ >ëõìˆr„Àë–3]'ü¾ôòýHÃBi'ÎÇ…dŒ,±èˆšF•NHABÂÃÎ锻Ϻ²d}Í=¯ï›wfßzà­~•ÛB²F0æ;¿ €/EO{rÔ§ÿøÉÕM‹{*ÃÓms½=UÝœë© wé^Ÿ­C›¶g€ n‡BÀŸ '+•ž1Ù/סÌ5vN”³ÍÉ÷¾ŸˆÅdÄò–bºXZùÎßyƒQ0 ÄU°Ôúû_%Äm-ˆÂ¡î=E”j±×4Š! Hzß>å¿—ÌQUäã £w¶Õ§ˆÄòéÇùi2§³r*!NØZ_´6”õíœãµµOóDf®îÚtN0€<ŒœYûîL8dýìfÎd-hr™:gŠ‚èFx)àòM—¯¡€¡²g·‘åþÆDÃÍ:qQ~hõ)} º;À=CM@;£ì7.µÙ+c7LXˆ6× `G2`+ ð±`7`Ý$92 € Œcœ«è™SåN>ëÕô–Y€Ø­„Û4¿ üú4âÐ×ozµ7ßæ%G)±ÒØg~j‘¶™™ÒRÊ„"ˆ+®ñý_}‡ô­|w_xÿh÷sÙмö:¤ò‹F9>è GîVºr²¹ÈSQÉà)9 t»<ñ°5ú|ö´Œó”Ö«äÉ¿˜àûÝ{ÙGæ$ýÇGX-‘¦£ýrEÌ)ä{Þ厪icr4…ÜAÂR)˜úM_¦.Ÿm®IgX¿îø°¦@ÐÄPÂ_9EFP õãx„XK`D ¢Ð¢ÎRÁ‚x˜4)HÝl€E B@úí¦Ô&`6ÚEøSlÉFÒusË“·½ˆf£þ_a¯Ì€$Ÿûð“MËa&•™$lè ²M¤TŸ_s0V`vÝ—Á9?묵VÒö™~z(@«¥Dî½Ý„`!‡‹.BÁø;ŽønA½ýª‘îbòÜRö=î“§>Âé´Ûÿw ºÎ]ß—ëÍGn%eלMK(:Öûé)Ïúúûþæ´Mߤåg_Æ+´fÐ 8š¤[~žómz†~KÃptî²ü)òæ…݇¦ÚPÁ>Dñïí/2ÛÂ$ŒéEJDw Û?#×¹: e¢vîÙhÆuÊ{ËÀ$“ý{g±,/(olý¹ä] }ø™Èè+)p͆õ› 61yØpÈtKvî#!iË57‡™…¾`šâô漪¡†¢Èì÷ZE]3[õ€9 ‡®ìeÞk|;àâ.ÀÒÈ¥¥uf“‚Q(èÀŸ¯Ø“q…±×ÁœÀg@> xqÔÄnáaÄ\M­ÍÔ«þÉØ*øàÐç®)^ÁVr쳃‰7ºøçu+˜¾~P×(nŸCÍOéSOäêçêd¬3—±ÕâþŒps6¬Šé7iS¹üE»>åR‹moæn¨m 9KÚ6²ÖûLޤ×ó‚žÖu*˜û§“àÙîþ2‡Ê`7ÊñBÕ5³Zo¦GŠ»kÃYÌ‚…W™Ò+Ä÷T«Ý= ¾qó›ÂàjoÜqXä`¡£Õšþþžžg&0Š:ú—\^†5‹“Ÿ»³«Ö£$¥½dæ3•ÙVmgÀW°æĆ‘ƒiý‚MëVÜÛµJž?ùÙ`­œ¨ã€—ËSt÷Ÿ¢SõèÏÉPù|V—ƒ^êùüµ}z¼ËÎ"ãŽ÷éÉß%âåøò;g¯'³È>µw­v¸¶–ŸõH˜XûFÄ~éÉÈ<å$®·à d&_Pý¼­ï²`_X¡™Ï òYÇúÔWÞckßîˆÅ&¹Ÿò”ѹ·_ó¡‹XäPpe“ãÖKv†(¹Iåšq-¦½…´^lýZÊåÈí€ db3Ä-DNÃàÀƒ•iœ›OöÕ{Û¬aÚÒ¬4H@i9g ÈÞ]_ÀùØì~~í ù’“Ÿ} Ùëª}¼Ïn S ËÏ´NVüfGÏØå'ö–²¬`å÷ƒºù½s-¿×=yÝÔlñž=xKä1O´2ëãô¨>ùP¾Ñ3K©Ué‚]‹û½oÎsBCxxá‹ šì þµu v_-Y†j •’ŒŠ¬j¨“Á[ŽºµÛó½ƒ;¢@Âé¥@õÛkŸ|¬·êåê´ôe9<Í»‡¦‘)*¹¥‚¦(¼mX&z„ò_ñg´,í¦3×”—õ¼Tïêù@,fc ºÌ2=@©”ç¥öS¿4E’,VqIÈAÈù0ökÝ]T0=`ÎJ75•™2 P½·ªõŽ;:¯@ Ìäå0¾ž'7÷›ç&æuW7Õ¬ñÆÍÓm.Xõû+‚ØI©‡½6‚f`@Ý ³_ÙÊD â°ü@_–€F}]·b‚©Ló{@ˤH @–Ú%À½'ŸŠ @¨–ç. q€øœ_å¡x˜÷}úýÓÿiêŸ×jfÖ.®‡”@l[’,‡oMµ¦¡’$@X$ú‰®K`9ûƒYÃë³?¹í»B$bâì‘=õC’ºeþ¹q(^Ĥ… =¡·ÍÜ—~Ôßgþ¬fmÎÓ.ÀL¼÷{WŸ¦§ž¹"›ê9 .ó4[‡˜B”êì4tLðó´ðX^tŸ?¿R.×4t/µø¯*,I;h ;| ?{þqê›dh÷«pþ»g³ðé/7nBþ(.¿ä9gˆ$¦ÈœJ/-ÑЕ³õ6*©7%³²´ ¢Iø3p¦‹‹…(•‡ÊÉe²þtåÉg§Ì¿Õ=‡»À»^70­½rÕέeö(|¾x~fÃ2^€¹›;èaÒôDÅ‹ó`ºEÅpj P™VMªæ£&¤°G“ÆÈZe#,hJ"€Jbà&jqN…÷‘>¹¶H,0^8òÇÓÄd—…ÇQ]änÝjÄ\‚¼J³jÕ=€„ºupÚ“wûßÇÚZE À“ú+ÆÅ_×bü.®§¾~¦Ð±g¾jHžæbÊlÇãT…åY¶®Tŵ~NŽŸ¯–7Œ[àãÔ±]ü\3 ´nÁæ Á¨ “ù®Ü€ ŒA´Š^€–ê.®˜8F†‰Žµ« ðWy|Ú±ï$ÆLIŦX³9”‰…èm³½ÎÕÞ‘·“¢QŠšÖÀPWÛ1KHF ´Z‚È¡%ÔbM—L‘åE.‚<Ö*ž†ª`A‘` ª#PHXî¡C„+º{­~ü‘íp¹®÷_9°î<]æç™cEµÇ½ÏU—¨ph4 ØD¡ì>3ŠÖZT¹)«”Äf©Ã'³C•]µúö ]šRD7ç“ï®âÎÖºr pþÙyóÌÊ%ÙFr¶Þ1§yUòÉ{’rd°\Å2 ™ÑLˆBÜA(ËI°Êf6rlcTÐ ˆäb… åv(bWé*q„£ðýïÃÆ>‘z}øÙ_cêß"Çû¢¾)‡OùÿrÆuûñ=™‘lýVȵ$.··—?E3 8+ZªåAêÀ¿ºå@Ú€ö°«My1&ýåÿ~=#¿Ì}ú­Ù°ð¾©hWʶÊ@OÙÌyÖóÿêlçÙt¾³‰â×›WÆx­ÚΟgâY§V4ãב\ó²ÉÄæ­þê ý«›ž}u¸ Æc5’Hð+eö™È[óј „ÆCì[j É(šD¦³ÊJ» •VMïå¡î6Bc9Š€È*DEs%‡öy=…§Cź[ÄÁÍ÷®„˜L¹aÚ(>éô' î\Ùe0du@e¯ÍÛ]I‹éD"¡’ûêÝ4S‘W­Íä°ÏíäµQ‰[SѰí*±eCâ¨bf ÅÑ¥´Š”( S©Ö n†¦Ñ„‘î=ÞÆ2`‘ÉŒ,¦‡ f´àÍ,:÷›ÀšA:ÃScÄ|eÁH@s¡‡´ (‚õ‹£Ë÷M  A+ˆXO‰€ FІp½sÌçm°€vE˜K8Ò ~’Sàt{ „ïe¯J½Í¾±Œ$,nÉTÀ ÌÏþ&F–T`(,³µ>`^* AH²™óáÑA~»•x„Ùtµ\At˜|Ð~’£ù&Û»’ѵfIÎFþv|Zû·‰l³4jšËúÌFPC¾Í|h#VïëM]vM%¯eäQLÕÔ½ãžó|§™üoB2®¾ÔÌ”oSüW|å|ßwŬjJ¦èpÃÒT!û0öÖZÆ@åäÞHLPgÍpÖY¦!ÎV&Ðêy‡Ñ0¤ì¬­ÿž`˜ÖU*P¥c’‹ÌG^$t=Iè«5y Fö÷ž:̨Žm†dÿœùþ`ò¬0M6Pþêªôû®®>&°‚ Jh*Í~¶­N"7=Ãîb®‚1¹)ôê3+ŸÝ÷N,ÿz¹h‹¹º{ÀÏÇí«ºNcu lZ¿ÿå¢êyØL‘PyG=M½DïÜùo950EÖ“z3¦þŽ+C3` ¨<»ß³‹x9œ™.¦I rTý” «?7±„ÓŠ !„ð}¸|#„ÊH•dË€  BZK–<d#êW¾Zä›`_›Â uo_#˃E#’~Ž •Ø2K¼-zŠ—À»ízÐLô7ÞòÚë¡ ¬•o½Vê?€=×ôìûX3·QkGÍû¨²V™"Šä`FûLÖjË.3hŠáëž;ð½fô‹7¶–Ë÷0?n %tÍCÇ›ýííà£ÄqÒP[±Üí*Ý‘yª Ÿý“߇iW&axoøéz§AU|™Øh¹’ñìi4$;±uŠ~ý÷‰É¿Ž†i3»Ý-ç£äHuDc¸<Öc]— ´V €YN],5V›ŒqA}œŽ·!;èìŠm< (3™%2‚I'ÐÝ ºæ8?ŧSDµ§|†"¬I7s(‘M\0MiåSˆ®l°ÛË 4`H1ùJÞ›Ìéd5I¾ ]•̬{´öé(vûûÑáÜë£ó=Ét;«"˜¦¡¾÷=ЗчŒo†Uån†16²b‘Ó±D0ªZ’ª~^( Œ‘ ôêVC–…µö\Ïš8´V`$BÆ:ˆŒsÎ@qJf§¡Àã+4þªäÅ™ s,W‚)`°­«2æäçŸÚšá+ÀŸÁ”8wŽõ±­m‡iJ1Àô#ÿ«éýŽßæ½`8à!ïvv5|²dBYÛ:K8q{„ìÝæÊÚZ ‹:~z ˆ° $‰Az/Øg¿ÃÜ:ÑñÖŸ¬hS.8ÉCí–WZót{þ¼Ýóm^È—R I »"^]C½¹‰™X×®ˆÙçÛNÙ!È2)suÞ?•›8]P”+½èÓÀtPÆÊ ÍÑ®êÚÕbj~µ;•TW@k¨ö¡'(%@RtN L{ ‚ËöÑÙU²ÊŠ +ï*Û€﮺}(X¿]áí>Ó[讹,zôþ¶]ANíÊÌ3¼¨0.œ3]Ýg‡i_+¨€vГžåEIMõí'& ²U©$”ę0Z%£‰lê\a%9~✶ӵBãc‚dˆHQRL„<½B¬Q!Ë£0/ÌYY ˆ@S}~Ú›’10‹[€ˆ£[=à`mIuÄ!c²é_ÐìL  ^›5tMD#Ñ(‚Y®f{‰ÊðpƒP¤Y>rÞðŽ~úÛ”PÛ8 †}»å¹hfsÔ†‰¼C¥ ™à惞f˜ý¼ùáôcÿóMBI„9º· Î/—‹î.±¤&èÜ¿÷›Åk!Jm>”^ÅsYÙoú)czìo _˜Ð Y”÷Ý’Lº]È8ŽÛ­w¢ÎyÛÎbd½4áÃÙ#(žræ3‹îÌfP~Oe ¥ËIÖLv›fWkÖHe¬2R òé2÷£ÛÌé j}TiÃßG'éYÜÍÖÓC5™œv`Ž +Ö ²zHŠè®H•YZ.G 0°oo PÊì”+¡s “p.¯P{§0Iqj§Q*ë|Ú04˜«}/ûn@Àdñ¶ žd¤e=“"BtèS>")¸J8¨€Âƒ³EÖÝ“ôÄŠpÀbv“Ôhöô$Uâ$!h5€0sb&šˆXŠ ÙT¨ÿyµ¬G F ^¨ \3€ƒÿ"×_„ 1Æ2†ñ /F›Äƒk<4 þšÕèHá0Ôr˜Ã7À2ßßnภ!q^pUÛÞzÛVßÖIŠx×¥™$G@1XæÍ±¥›þy¨YO€OH¸ïk:Cþ«ª·s¿+݉7éšÓØlE_”4{Z²_¯LŒ¸Ë¼|•FJãÛ§'nu‘:|½š —Jèk¬7=(6Xþ,K¹|źCÜnæ¦U’G ìG=ÄÙ6‹8ÔºÜ#h³Dy|÷Ž@XEºÆÝ.)#Ü7ñ1І»³ €ð’ñáh¦€dZ›ªŒžlpfU¥!Ä ÔÀ°\´È Š€Q¸‹J©#À %Äì`*4OØn`‘ìp•7]1Û2ŒnÄŠêJ­F"Ó2¾*š¢hÁ>òe¦„ÁnÀ&ï`-ÊEªZa,–"À&kFÐã…Q©‘ÀbéÚ•½’ @1@Qj€Ô À#Çab jÃŽäü Æ‹<Ñ:r W2Z@E,dÁ+1xE¼øðÞ\B GB Ð±}KhžË5욦Ë(†Jî7É#®  ~­VÒ,¾zg¾ôoϸ€óËü*oskw›:³PϞŋ'Œ$D/AŽá·#þv™!yÏàìUCõ·Cn¾6a ~×_ð€o;½½ûå¿Ñø*Z@]?°8u­ó”¾‘£Rm¤Sÿy÷ë'¯,̇ª,T¡úœ·²¨àV‹¿+™qÞQI”óL³þ\¤—ï ‹C‰”“ÞÝóÝxô®o¢ÇáéO7çêð"óAœ#RóL»0' ”t¡éâ’@:+•Hà~UJMd%˜74Ó»ø¿¼äày¦ÖÈì\ë¼a[ºçVªö›@«†Ø¾ÃœÒî‚¢¸/Òàl^±4À„­Ê`Šé7©û0a‰uDÜ‘ƒ˜H}Ð J) 8õLëGã0ºñ$ÀL &…À3j(ÓçN-t ÔPBF°T¤x^­Wòo[+ÀT ‡ÜOiP/Âl‘;EÅØX°ø òK8‚Q>Ëè§@ì×Ðm¤hLà ñ¸:è€ Ü Î·°Ÿ+°á`SÌÜoõmÔ Ó®#fp ÜäûÇænjðÿ2fï¼ÅŒÏ 2þúr<üŒû|™–Ð$ A¢›G»R| ùØfHUÉøŸñÞ J)d·ŠR‡¢“IÑŽƒòìªËõôž`bPëuðžÆbðÁÍq`ä¿N÷¡ì ;š_µ÷~«Ïâ‹fä0ìÇÁäOH°ŸK°²mô†q± ³Épmz I@Ÿ¯,á Oîw¿¦‰u¦m9x³höä´ûØÞ~ÞügØõˆ€œ‹íÄ2éÉtwǬcå·Û xUo˜¦Bñ@öUTSÀ£U›êDð¾-dÓæêëI‹4PÁ{%ÄQfu™b4Ø?Åigó%–É+(wzbúòU^• &]¬÷l±©ÞLÀ£G›‡´  ô•R€”wu @w0Y%’): b¦J§à€$*1Ùݾ*ñÖB€L:Ù9Ö§YèXP„^º˜»Œƒ#Ò¢Ðû»+3:0ÐT÷ô €1C¢ŒÖ Ã!+š‰€„ aÅ y„V‰i€R( zŒ­Šj˜V@‹ =I³8jU'”œ*È0®WYº;Ç¡PXX€D+FgX @Eà ½À/_`k ^Ûuâ™ÍœM÷®7É{<&£)ã{ãѧDüÉÉO.ºA_Þ'σGÁ¾m°iî×ò½cÔ‹J¤ð ŒѩƆá2NÿyÇæôþvºa{?̙۾,ä|àÚ5C‘‚î¥d™.¯Þ4\/º@ ÊÍW€}Ú —€Ï=߿Ǫ£Ã6Ó49¨¤Áä¨ÝlýfÂÇãâÞÊù”<…å<ÒÊ$ëºñ^ñEní¹Ðé ‹cÕAÔú“;,Èù`šüúd]OØ{ëÚ$márÌ@¥ãÏ Á<ûÁÒ@Äì=¾ ‰øŠÑ•ÍG˜ËVtT z`¨¹’ß±OggS@>&…àx§?¹ÿŽÿ•]QT\[b_ÿ®ÿ¾ÿ×ÿâÿîÿŒcÑ´ygÙ ¸çIwàÔ&×õÉœ Û6'‹Ñ@F‡ž«5œ¥‡ÏAÙ`ûìHiAÐ,רG‹¶S9wN2Ý$]ëÐ#`€V @Å ³L]Efœ¦RÓ * PTÐ`œq'-ȩؑ5:Vèz}Œ´@µc€€’èH„#»KCºÝsµË( :‡öÐëÉV¡Ñ!D(üxj@ÞÊeà ú@XõðŠàß]åT|Øçæ÷9r¿6ê]cÇh X‰‰å†+ãªZ™J>ÆW˰œä°® Ÿ»±'02©¹úôcõ(ÀB¡‘ݘlV{à3_ž¤‘ã»ñ³Í=ÅétÝ:Ù™ÆÀÔP nˆˆÅ-çöMZh+lÉ*0¡éœ(tü_’jHïnm \3®"ÀË#äT­ {ÖIÕ$°÷žó9'Øc¦?r$³Õæq!G4D)«3µB7D°ÏYe ý%î{DÂ}if‚ûñP㤯;M‹ nà3˃&’º~W÷­ÛšOKbü‰HÇqv3¦9ë$™ÉhÐ>kIB÷Û»™­4™ÝPDN"âœ&“Š=PT™™@PJ®Ù3ЧȔÒYTÌ9PUßÝ} zé§Åõæ“Ý„TÔL?Œ£ÎTÔ5Ð4¤Ä¼ŠÂº ´DÝÐ ¶ãÔ(ù€xb `´0€ž6Ú%øKà©]ÝâõX‰ÀàúÄ™ãJÀ˜Û6Öa³Ñ¬2(Š¢ƒH×ëÆìyp†ÓõBŽŸÝd–C£¸5ÌÓ9îKªŠâ3‚Ö5u™ÝÆÛ¿~®ñÔ†ÏzÁ,/î´ŒqOß3«§hçZ¢nHu>YþønJ9Š—!%%óž'FâÖ’Pd!é‘kÓ1Ù]IÆ?ù„EVš¯yHÀÇpC¤ì_ꯣnaG%&¡q28½˜è†-€Îϲ’Ê`¬Àœ8à `ývA@ 26§»³¨Â„Ê‚Ý3S_î -Ç @¹Q ¤˜.Ë×åªHv×ÔJª1#-’À¦'Hë=2€Ó[—õÌ#êHL¯Ð`ÒI“äÏÔÛÓy­èP0ÉÔœµ¿ùœu@,‹7®Ö¤rVІ–ësÓU`æ¤ð¬S•êMzª{rL·üT‘CÓÒÌ| _5º»ÿV®óv¹‘Px… Û+ZYò‘ú´mOT—@Ež½€zß-Æ-¶¡€(¨Ã¬J‘½‡ÌÌО1uJŸF€˜\ÿ¨MÏwö‹¬g>µn7ʜ٤ý!y.ï'¹öÞw¼C¿•{Ūҽ*C¶ïÃþ¢î<_ˆ:£8¬A]aIÅ]%HQ°Ø+Õ"‚CüZP<:P 0Œå¸NE”éVªµq¾Xh‰ä¸²ï¿ZÕzM-Û®æêÝ™Š ¥Ð+Ê’,f¬®TÛ(Yv^å1¢h4ŠÜq)%þ«ÌB)i£’nÀö^1WÒkBö¬<÷¡Øj1r Ä îž©•¡ÖcÄ“Y•—½²FY k%â¶NU‹*©)*APv¸*Ð[cÕ¢Uìgý·®ó´kÌjQg(.Œ¦Û­Ä¶&X¡PË UÅ0XÆ„'Cv¸ÁÂOóz‹V’WØûÒwm¼Ì’~äÿÕã­ÊZ)]|B/Ë*Ö‹ê;YÃW€ìEƒª¬P„Å:TH'Ìj±ÕFÁf…°ÖFc + ÄÞ °MONål­Á«Íí±ùxÔƒ¾þ”~èƒeÑ5…šªº2¯?žÎ¨KëÕ3ú,Ž5€^U… ° ÖÄB«hQЈ‚P°äZ¡TÔ8ƒ'ƒ\°‹5ÌØFUì4ݼ8åá"gÖÒ•¶ËÝM¨ºÚ#ZÅ¿VÝ…òÌñRQfY$µ³]éÈò~d–™’%•×Ö…j1³l¡—õø¦GUÛ9_/e=Q’ûK´2)ÅK¤õ)@ŒŒÄ¦§>SŒ\ML,Ïh¹öeû:wpMŒ²Z«òzï—5)ïŽ~Ù·çZfÉ˳Qku-Ó>Î2VtFïQd#ƒÉëB}Ø.<ëY új…À¢ƒ¬3LÛzåÈxŒ‘¸ûÔ/‹²òtr¾'Ö²ÓËúj¯²év¬L¶/65c­Ó]–f*@f ôD¤áÏ\joŸ·´SµOë-øü*QKwÈ^¶û)G D?”¦–qÕsê£kÚFiÈì= ndÛ­²,ÏÒ FÉ\*ªîߌ™qÆf¬Êh±UÕâ«cW ƒÙF"3¹xL¡ 3é«Båà3Yª‡²hOàƒoÞû—1ëu|HÓÑjì÷Xf\_ô唽”ÞËZ<Ï£‚K÷n gœ»r.ª±Õh³⒥²¹qÓC“Y¨:9å¦ pöDf¬m Ë+MÜYšš§Z‹ÿÑ·Ö¨M* ˜²4I ƒžm\͘hR Ž®gûD"‰Q H $ÌKy‚yq‰[¸i¦B‘QPF‘B¬‰“Ê4J"åœ)$)." ¾1 b00ÄIÄBAHTÖDô0¨0€Ü(î¡tœN¸a¾‡4V3V¨$ 1€³±Õ6fÅ2ú; ýmÓŽ(¡‰ÖpßW Þ›Õ":­,í‚·…ûbÕ½7óõÇ®©> ÷ó‘8£¡¬Àî÷nsdíj]Ç*Ú|JJ˜  …º"sXÚü8tŸcSN´Þe´þÉF[— ÝK[Vãš|…QÝ}f¤x¼1[z¾fæv_×2Hˇ>+9T†B@Q‰Ÿ]Ó5U(ŽýL%§·´’I”ˆ¢+qÂ]¡ÄzlíMïbÒªÔa©d§@žnpŸ+§“EŠÓJ/ÂkÍ:wÜ€ä½rLñ¡ )ÚžÍëhÀ`ÈR*N“ •‹é´ƒC“L÷ÅÝ[»úeô#¾Bv Æb< ¬{ž•†Œ.u,ä**@ÁÚ@R‰0¦v£¡¤)W¯êy ¤bÜïâåCñBÉ-¦ëŠ“!aG¹öT;dÆÐäÂ,U 4аœ¬[ =K `!ÄÔâ†8Þš¢qe‘Ó¨‹¶'£«4  $ Dw™%Nö] PÀ̼BÐ!€¨€AH±a0`[¹u4Ä, "0ž·"c€ºÌ€4.‘h! ¤ká› Ù€Û‘@à Û)xÐû Þª…DÁv~&Q4QÃÅn1Y!x ÷ p*‚o“à<sÐm;“@4p²Dë:7ÃuT¦ÅH. Fb®©ÙÖ¡‹ogô^7fÛ*o€nCH—Æcë‹„Tý¸Ôjäã$äÜ3ÚaÍafŽX#…N°ŒÂZßq„BEA…cã5¦  Å%’á*óDSïŸ)|åñlGÕ@)Ʋ´ …ùe™‰¬ºTbØ¿é¨ÄŽqœÈû§KËBö&í•™ƒÔ=0Q: ®j˜uzý©’¥¾;‡Ê¬¦†ºÁÓÙ¢†Ê £DQhôu–s{Z¶Eùâ(9¤Sуåû;Q©‘íÞ²éšd šlÑO‘ >¦ªk«Wö@݉²0ÄL”I%t¥¢p®·Rö"€šÎ°:§»ÒE—H¨%ðß[…Ùs(K—!§c€¢ÁGÏDº (0f›«”pŠšÝnMâdÆk0 $!b©¨º Ç$ô$ô Ð,¨T¡Dt…TR€“´$° ,@kt!‚åS ¶‹ ±ÁŽb€™@Ž`UG`A¶…e€€İÖj -PaãT{½ŒM¢f ÛÝ:VŽXº¢È Ù¯GßÖ¤q­6Rà³÷—«ËÎëÕœm8±a<½½‰püXŽ.ËŒ}Ûü–lÚuÝé­›Ó‡ëSH ŠÁƾ{3ÿ †Û÷1Íkw¿VlìyKîÇßÙŸ9œÝ}Ü}¬¶¨/?_urxØõ­Þ{é?N\òïe´Ú$0 èëžõe—bˆ±©¡0ãÁïžA;xJ1„q¨€c0s¶¦€¨`%ã9OOqzîÕ™Î9ÕÒt,~ô{Rhãl)’ë´9 BgÍë]‘¡Pðd¢Œ=ß-5£D“$Lá$A\™&Ș‰lè`]MAX„9 Â)%0ºÐâL[ÅBRï´™¡ÜúZ²À>ƒ8dH{ôVf>q[ý}Lߤ°‡"ÓDîÑfd±‹nDi‘º8š“I 9#GÔ•ÐPQU4c&«@@%YK¶mÓ´^-4U€…­j€ä¸)0Ml XâÄ€E5‡ÌREŒ”6 ˆ­;b L€Cb)ˆ3 ˆbZ±T@`„,°HŒTØñ@,8½H #šÂ¬ƒ€P¬Ç®"ÉþzuœO—Äèh§­ÍÑ"(›ø?ÁI{}·&£U“½_»·ä{½ø»—„™›<¼NxU €Šta`ßn »Î¸vmO¶Îu݉·dÍiš8…²ýIF•¢ë‡>Ã5J6C³m Ž¼œïö–Õ-ßµÃ{Þ>¿G˜î3íÔò9à©Û©Lð9OG£2¨&úc6”æ˜6æð^[$®g›¥Ê™"”Ô[nœV?ʪ³’hÑRÞÕkÞ>¼ b¢í¿±kV]²ñÑû4N­JçNÌ]t†k23M§ª‰j@µl™™•Î@j QÛsÁçHŽq‰lOCCE’)KûMC·'`.Oy ­*úÉé¡e°mž5¸ÆìZàºvN\p¦'J`‚§" o…€’5k²pÅn^ã3Õ%ÀFR¢/‹H €ŒDŽ,Št²ÏY­.@ OggS`&†Î|îÿÿÿ ÿÿ ÿÕÿÞÿØÿÎ^ZQSWeldÿÏ$¥ QÇáBhÝ}öÞ>¯yZ€€8sTt¤ÀÈvC=ÕÇÇ¥•±ëSÛrM´ÈSÓ¡jô”vçг¯[!¦ Q@um«)û‘u–z6D5“Õ8:Kìh¬^;‡1ƒmº˜Q¯¨¢)$ ‰½5ÖîâMñù$ì@1 !Ä„Î!i 袊Çjª€NëëØof2†¦™° ,J=h+ ðÄk©­èËÐŒg"`ˆ*(8‘Ò/©èQ5QÔV€b‰€_o€«‚N^k‰ €f–X1ŠÆ‚ÑKiÀ¢d–𢢠èá~¶N"€¨f4QP€´†*¾:5 ¦,22éWzEüœÂè$Vâû¨ûUÜøPñ 0ƒ÷džv•ë ' ½Ofû‡ f{ª>`ÚœqU¸ ‹C¶y™¢¹­ôÉÜ·=ÕÆ$@íÆj¸þÏìÆ½ÉÊ&ó^+¦˜ýƒb.*ú6ä?{·®õEÜ!*ÐvÖÏ’êC!{h ”rT@OçÍ|ûUÀŠàErBιêoÖ|!Ä|$„Ui›¡ŽÅcUO†ÇBßä}(½Lhö÷½_( ”â!@.âƒ<Ë­Ål*™ÒèÀ±ƒÚèCñheŒ 6ª€`h✦U­Çë ¯¡UŠôeì³Ñ…û 6[>f`s±¦ ©ÅSä9¹Xˆ˜ƒ¢(ªrHï°­Æ÷Ž6‚O‡¯­®–ÐMWƒ@­»Ç)·Ì¥%¥°lë ”Zœl•è)të¡ wh,%‹5N«Vºòi%ŃÝÀ4¬]ËZ7€ ÷,3Ë©®C•e"d  ¢Úºh]°‰Xȶ6€`-­­Ùª#£°n'`U,°€@o£GÉ`MP”ÌŠ"€¶>¦­†¢€€TT0xÖ P^Iå­)•™e¿Q*æRܕ٩¤¤úýÊ¿ë_|SæºlKožï{\<ž¦ t„ý>VV²?€iÝ §Z .,\ôÁ ×·ä¬ ‰_Ç%€$ç+Û–*wI<5ÌN7~ø#óèY÷0ÖDÔxÍÒÜlK›õÏG7ÛçéÁ+öC!çÚu=¡@³ákç „q€È™¢¶§Û­Ë%€™'ñ´Ù#íÍÇ wd¸xÒòñ(YËÊoLÈ!¡DóÉÞ¢„ =>EÑR!„ñ Se:^g(2Hݰµ$P™ˆŠ˜V”R^2ò^WYq`óÔ×8èîÉÕ]Üä©ùy7ÒÍmæê›º«‚‰Êö]ÕÌš*¹¨b¦þªB9àe‹ÉÎ{ÞŒd¢”Ãx ··Å¶©@ÀQ 䏿šP¬1HVÖ³‹Bá@œ ƒÂÃÛÐ ‰¢ËžfèJz¹å  ˜e¥õš¥Ù/ ±7B Àíèpµf @TÔúús…0Ø€²Z+¨ši¤c¬`‘2¢ b(€5 `D»VB>bÊhÌìõÚa°n°@@Am2P ªbI¬ beU\Áp ‰èÐ!€[%ÅÞiEê¡ ’×/tŠì1È$4Ží'=þ¯zV\î³»Õ¼¼½{†/ÿå¬É7æeý€wËè×/ûj@À„»ªl¿ÍöЂ9pp`¿œðDõŒ€ä² D]ã}€ï(e% 0ŽÏLõ>ÍìoWý8Äo#³goñ!öüŒMÕ ¶Ã Ͻ)/AChã¼+@IÎǾk\ä €BÈ%Þ%í»©vCsÝiä"àCðê|ë_}±"d JèyÈ æ3/jÃn²ŒÚ3“ó"½*„BÿËž©vÚR@ccȨOÿ[÷"†H/Î ¡‘X ’†Z4û€*õ}dwénBd _Õl€þŠ­Þø` %Ï>÷]4 tã°bóAV:àI¦<}º24 ,€Yô)hG WÉ$à©®k‘™ ,.Ö×Eqœà,ÀI`˜@$°N¦ #™@6( €Hµë( )°'@,¨" èvVÀ`@°Œc´åàÀà @Ð@Y˜™(€@P>IU²ÓT"ÙØà^RÕLŸºóûܶôDƗ#ÚåÃÚ?ÖÙm{6ðà†‡ë ï×SºìyBwخǀýÖ½Àƒ¸ð.np¨ „/ˆºœ»ÀNd>-H!A€²¶_UùEÎåû=“©¹4Ý¥ç¥å» Hàë¶@i0 u;}í­~y w÷È:8 ¾Z®¹P@BÑìírë!S¢ÅA>·oÙ¹~],tÁõd—O={‘F}uGŸ—’sÁ¶Šøæ†[@<à‡Å‚„¾bØùaWS3@ôÀÁ39;hæïUÚ´iŸP/YŒ8Ýí€Mã`à €g<3 ×ZI  ð^O®ªcäöj@,£kTæÞaj©( è*‡^‡»ÕD9¤*NÄ,Ï3ÚáQOfi-/ 5Æ Y€‘± }¢oˆ PdP5É”¥‡§4Ô½!@dïhÝP]¯ ù€ À”€²d£ËL)*`€š™´\ @T¬u àaeë (”b@Õ©à%F«}« FÕR" X­˜fy~)å35nŒ@!^c5ÌO16Ù˜`?k£á|]{x2ïðÐdMàn°ïg`§°9 ø™_.@”-çÎgÌ1™€‘}½¸Ôo íõ6à @šqÇLlÚ5ø“° ¹£%gJrVÑJûF«@¨]ëeÃ2ÙúŒ†æx|ñ\»Ì~‹ä.gJ©oŽ$J)AÔ%œ4ª(}°÷Zc‰¯["¸™_ÀÆcl\Ñy†(GOÕŒôî¾üÿÿWÞºíWÚH€¥‚ˆÜvG›«AUS³DDÏ´º"£¼‡áZתgYº%]5®UÀêLïHUyï½õ­LVB.IÊ;@@uEý<Ȥ¶×•YžŠìŠF—^éNÏvéõEl3¶g(Ïë ¡k õûû”òƉ(€ˆ@ÇÓ³V»ïf9—($IõQž’3 £t­$€ª³jm¢È4¬/¡PM™N’òDFû³€äñ5 €  ôÄCZÚ¶H Þ- Kˆ‚A|ªàäl€õ€@IP¬_Ø1¤)Ö " gh³^´ çH@¶GÝè†sD)(ÄwxÌí‘Ö`?¿¯^V¯æ:¯®OþôŸþá‹Ó_H†oWûY؀턪к`±Nßf¾ërÕÕ5£YIG[~¹}ŸŽ¹†Ôr —戄_—ÉæøDÂxÞì' f-ë¸j}Þäì*é»áðé¯ÑÚç¢7ÿ¿ÍÈv?­¿"Áø HvÒ)†þßçˆ)'Í!>£Ù>ýZÃÈsîŽ$ ¥q/ÝÓ5C®Ï+í¿Ý)*ð@ºÂ“˜äù³‘ó··#õÉ™Î:wtvÚ—_úñ+¥Ò€*QMµ†Ê“_ù4®|9™M ãüVÑÌÀLqŽ·u!€‘lH‘w§¿_Z&§`JÑ”½k9ï_¾;ïZH€lâe“0S¤%ñ*ª½þ¸”köT‚º†.ã?ß9l©Ä/b‚f<\ ™©®l“Å\ÀÀqßèã;j÷8¥ÞÎ|3Ý9€ª¨Œ ÈL¬< &±ÁNÀR¥Yž‰ þÉäxÉ7ß“ƒ§yò]œ_gíÅk’í/ÿÓù6XôYBƒ¼æã$•ï8äÝÞ‹¼½ü'ëþ®Õc=n"¢0úJÀ.@ˆ?6K€² @ï•ÑÏ÷µ£ÉO½ÏýÃê­œ¤,Ûh³¡õÓ¢¥UÃZIBF^3Ę̀ìúè$Ç'cîãSãUxîãbo/Í€xo™¡rö#ETGwFdzdh£L?3î4C³dáž×xÓâþîJ‚±”ù\äà²ì‡À¦É˜ÚØ)ÿ­™÷ÇGj;…ºbÛZõõP¤i…BTÌU~pþòÁsÅ$SžIp&Ú¬§Þ½ÛqUÅô:Ñå"ŽôŒ=5ŒD…‘šC”QŸe`ÿÙûbr¸úÂÉ|Xˆ#ñÙPCuáq‘ÉMwúz'&5pjö†á¦Ûräs¦OOggS@†&‡½ýiÏÿÚÿÉÿ¾ÿÆÿºÿ©ÿ±ÿ¥ÿŸ¬V=dœ&±Á–"–Å=Ùڙ~Ó;Û›Û“ùí°3J4rïôýÌ«ÛÓ @UUs—`LN@[ó^»l3&:—!Å¿Kdˆ¬dóL’ó¡Ã"o†Ò³µ¯û€5gWã\1Y¨d%¦0 ̃ ÀÜȰX„±, ½@<„oË]2«êŸ¦rˆ"Hª_Iëèf©eˆßõ2#Ú®/®äÞ5GØГ(õz]¾ÜÿÈÑʼpoA½v—)F¤y“y $þËMÂ`"€"z¿Y-=„X`ÍÏ8ÈkQö6€÷Cº::|(Á¹²xж™gmÍ{ïCÍ,ÚÖÄüí \ß5ž/Y­ºglÆhëÔ­MmÅÕslW÷îÐïämñ´!—ù¿Ç`8®BŠV¯›»éÚ ¡òÛæk¼;±OÓv ÛôÒ„åXÒׄ„Ð|¸Yõk±­ÙBªhRN•ž½ÙyûÙ9¥™P§;…€NScÞ¹»ÃIQ»` !¥ºtêì¨ 5¨EGm oYceÅ0ÕQØr“aˆýþožg6ôâCUôçIäÀîÕzÞΟýêf²÷[EMþ:=ô$_õÐtýîÇ]dõd¢™(¹…gST£™ß&îâaúø¸«.¨ ÇåΟÎÝ1ñòkfäfbr­\éݸ'ÏBãý ["HöPT×DUr#OçÒÅ™œ&¡§ 4°Q‡÷:.ßAÁL™‚ºŠ*žHÙC¿mJ¼»‰T(ì,´ó4 =ߨ€Ø#À¸~Ú€ W0È tÝ ÛС`Ëz“ú$È Ù$ñdÿA¦'KD¦YÜN@`í|^ ›.øp 6_ùBþÚ FØ€0| þÊ¥ ÁÒ´z¯ZÊEXP0 ÷øŒq1ÿ€õi²¯4Û*Œ¼­Ž¾æË”II«2€kÈ€a®¼@ôuìªøÉd‚–³rÓuGד@35]û¿ßÝ/£ð™eÆ×F¢æl{ÏÕ´™ÎñÄkŒy½2ŸÙÿ¢† æ­H(ë­`,å¿37u£‘Øï*£œÀ!¶÷wb¢Êì$ÌT´ôÓ1}ùÓo=M$=0’‡f‚óÏšÙ™Äs|Ç‚‚mY€Æåz{>Èì[r‰z_§BNVzOV­s¡x…®ž‰ÎOï>À¼Ï°6á‚R435Dq9‚hf<]oÁ×öogówóÆì?VôÃ&qêÌ¡Ÿ?>ƨy¶ÆLFqpÓÓUtc³¿yçqµ˜}Û{%³¿xWR û =LVg—ï¢$bW˜€Nz¸AÏ”)ãŸ=€9^ã÷oúûoqá„òch ›¸-haζøP àälæBó|U`¾¥#Ûì÷ÈgÑh…(Š  ýUVt zÇžä z ÛÖ+(µ|9€|eC+¥–½SP© Ç^Ë5 EÐTøg³ Vèí€Þ ÚC®Cqß¾{ñß<€êÞ^N^œÛJô¤ p7 6öY³£5ÓJUP%¸Õ“ƒÌçÜ!8¦®Ö‚G,½âŽ§îœ—‡ñ ã@.*°ûfï:@šs.ÆríÆ qRŠTÌ´áýŒœ äR†e××*ÐÐbã†bÙ¤fÿÿÐE»EÃY_e Iv/<~­/+غ¥Mq›<}6 ™ñ¾U™j¨³"U`ò*óPI]'à‰Hf*"9ìÛËûó2„·}@æÏA&_Ö\]Lr4 $W%“ÍMÆEQ#ÔÓοÁ¸8Q¿IJYÓ¯ÑíMÛ„ãX¦.Iñöœb¶Hôä³ö¦²ŸIÊ׊)€éäî s ;[ËŠ£?ÐTÓSo9äíêËW'ˆ¬h˜3L'$ ºyi¨ï=f÷Àò<½˜k>ˆìÝÌù×ëÍ kðåK§‘n~‹øÎ6À- ‘·ÒáÇSÈ$MŠ>„áƒXíehDâ™ @Ã]Xðy«D Œ«} ˜_))äÞ@%DK¸Ì?ßat«ÕÜÔv” `ßb#ìÐÄÏ í3æ7g¯®–/;|®WXt±ïÛÞfÚmú)V£©`#Ò AçéÙÙðœî^@~c?ÛÚ£ÑJ&HÌá:Y5ß YŠqÌ}HKËR·`¨¦ó,˜·…u¢­úÞq&Rï"íéK°=ñždvÚ¡c’šýæúâ餫÷Û9 ;wvžDRºrLöq†; +¥@uÖÖŽôŒ+ øPÁÀ“«{JwqÇñ$ Ë ãÐ…ãþxfé ƒ;Ê“¦Œ«TåMÔS“YÙSͰ y¶îÌN4¨üB&Y …Ð)Ð^ËéÛ…öM0æÿw¡Ä¬ÿïO‘ô¹ª$㈞~Ïë£gzrYóîéž<]õ𠯮7ßû Ð0¤Ì½VêßCüw÷÷¦ƒÎK®ÉÎdϽéýWnÒÂà *ýÝùYz„ŽI±ëùôsýÃëü›èj¦ZhSt±>Î> ²ù/6fÓQ„{$¤S~…`ž×X@K2°X2@e QK‡>ÒÛàô Ï‚„¨qrS)€1ЈˆiôW¡±|ÍSý@Á¾J ÞšÕ`$zeÜ”ÂÞà3z\¿±3³ÛÞb¼ ç'íýy§mmŒ1’¬Õ }C$ Ó@lÖãec~‹d+²Bª—ÏsvXæ\øçÂCQáÏo20r®¬ßíýÝ}ÖûZÎÂQm¢9ý²×Kº¤qëæIýô›¿þ@êÌÞŽmËLšÒ@ÃâÑ‹;{z–³cï½ïµI15 ‹Ûï帥)*ì!ªÐÄál³À²º¼î•!œ[_»íh€ÚŸÞ¸p-6—âøŒá´]‚™`€˜¬töuøJ`';CYMfï”p®#Ä\Ý™ao¯?n¢3¦’xšœo¬Ò“5E7É4»¢wÁ\öFC4 i†ºyv“ã¬{¸|iòP[]J&ÁúÉFpwnûyÓxË·23g¡¦)ì{núìxSsUÒÙªÄ}3ýÙMÿ¾ãAÀêÀ¾@ª¨K¡2‰ d’;˜…n€—adA,ï¨3 ”À‰ˆ ¸6¶ ƒùŸiSg€^{MðÈL‡†˜½v¦8 <ã(ŽRÚã!Ÿ»Ãë¯.ìYxþ“æ/+θÊõ: {¶úŽѰȨC ðA ÞÛèî|>û-:/{¯†¯ajö¼ÇòíÕ/Pâ—¯Ùµfè 90÷¿|:ÛY : €Q0óÚëñÔËÎÔ’tĶYœRëò £]âM v×ã?9ͽk¡ã¯ O2‡@‚g{Lkã—€ÆQ<öœ Ï&†V…{@w?–1?3ßZ„ ©]@ÍV§ÄY›çÖÎÁÇ7à—.hïÑ3Sô¬pêßQõ@C>,°ìþûê Œéý¯©óÅÄde&¦]Ðó±e ­eF™)`!xç>É@DfôÉPcCÜd1dýŸ­ä|üb6§cÝ4Õ2W5çÕ_»r òÌxøÉs¯ñU÷¿ãÏ CF}w5Ó°iá(¹FÓú‹k°i¿¯Úˆ ÈœÆy‚Àz€HK_"ÖyëTÂ@Á } XØ` òö`,°Ä¬E6 …^z¥Ö6]>iVÊè•rGÐ À‡¬‰ªžî›Gçš×ß4âò,ï&ëËtxNÎ)qÎz/Ûˆuõ«EM¥8ô¸(Rr2nן;´öÏ[ÞqÜaðó•ÓÙ~÷yðZÐpìl³!^«þ²º{ñìÀÒÌ]ÎÍ @ðÊÈw#ÿ2ô=z/z^ð"ׯ¼°¿·›´òôÛLwO•΀X‚Œ@8»^Ø£Wü}gm¨"À—èüŸ‡kÌ眾&ï9FJÂ[>¥°þ«PÅ¡kªõß0Z›I¦š²ÌðLLóöpÝ¡ëèÇ‚«è³ËK=ÿ†3TŠEEÒòïžûPQn6À0Ms™9»@Jj€ð[CùuÇÞÖ¥…OAA¯^ØšVÇJ©(b;¬»³_*š"éª œŒó]ÖÕ~sûA& uÓ©¸wRø‡l€¶€Ä¾ÝÊÇ/-Kª¯® J”{€Ÿ=`DxÀŽ€¿_nZ^£€4†?> ПÈ@L‰U2÷ .°xµÕkŒ¼X´øŽ',€ó€°íë¾\gçfæ*E_€‹0Ž€1¢ð’á1ÓS/³óuøßø}ëJ…ŒRsJ ^ ñ!]ID@¤•a^üf¦1L÷lTl\½ý|–¿™?çGÊ /ð23›ëÁ™ÈCî»ì!Ö q\ô];+ßA;ˆê‚Ô ³ÌÇ[’i~1·c=ž¡ùã‹÷óU³E€‹JS>O%»ökÞÚnññvpÏÏö}ËÙvÙóºËMAݪMw©ÿúçÉù-R~˲f Q¤§8ä(ì¸`á`z+ôð´b¾Î™ÙBÀ̡ɂLq¿V–`2˜îA«± w\ùsÁ)’˜¸ µ»ˆ†z2†¢R2ÏK²ïS=¶³'$90Ïç|NûöŠl À y œÙšÉüNOÅII~(Ýr–éªî¬/»® çê¹ùÕÐæé˜,"'À{×€Tå !oj&6>Z æÏkˆ(ÜOggSÀ¥&ˆèÖç!KGMINJP[VTTXKKOK_VRR]gjÿÎÿÄÿÖÿÈÿÐ|J=;â‡yÞ:å“ö°Û#Nþ=YsùCöP©U4÷äûÿ\ÕtøžSAóyrÌùGÇSžÇeªïQ¨õJ•slM~ 6i€+„‚ÄZÑ È›ZDª`-\€/«À½ñ¤¶÷ÜMYQ €rÜ0óËRW´PÛ{­twAì³µ u:j)0tOÞîÔ~²Ñ‚Ðz „FÅÓ†9 ¢SéÛì´ÿ doûßÝö•³²R…ÀsŸL;îÔ¹°ÅæYeù<ÝZÖõÃþH³æð(®ß錀[v`x]+ðÞÔjñMAÐusj¢k•RrgÈy`~w¾ùÏ:Nè´²Íï?SUU–‚5Tuúíö—ù¾Ž{v½7 ×åiTwaÇŒùƒ¾QÆ€ôÅr"{ôžlÉyÇ'rµ¢ž)WAÌö«¹‰Ç£™$ ]Lf3M\¾ú· p8‘ ŒFuÏv€ø„ؽ¯N©‹qz#Aý·8õòì.ÒRSp‹5!Ç·(šž™MqêìçÙ£o·NßòP¹Ü9µz¦kÒ5‘µ_.ûöu§ëÄ¡ì’ä+ZÓ½–Ÿ«ã¿e+§R.ê8ŽcW<ž0Ãíé&P ¹ÁÐ~~Wbz= ŒFéj—nIpù¡Rª{zHfþa}VsâÇ5B›k,Ÿ×“¬ªç·êÇmLKÕ„ýzÔRïÕÏ’…†®«z©…i•mVKà¥W&¶@ Ô¢<¯7ò[”RQeT¸àlßJ5ܾE\p´ŸùÕ×9_¡ª€ÑjüCH±1Óœ¯ÕJ¹Ê,ªA®(@µH¢KGà(€´Ö¨¢0&Œ¡EiAd… …Òm‘ûÍänÉ䣖ý¯XäbCú#Òâêl×oý¤ËmQ´ëŠiÌ—[<9ç• çR!´"‹tE±‹¥¶XQ5€¨Å¢_´ª¨âJa`ªB¨"(^Ì}ñA¬rÁÞ6Æ6§—j…§mZþäÒ÷ÔgµZ2um7'u#”…rò²?Y+—6ÔGFF ûÍ€†ÚŸïpE¸‹ÜźÊ+žL´{7å&0Klƒ|Uáó]±Ìj‘ ”â§K¥R{mS…!‹àb´è­Ã/;žå´×z³võY—&îR”±“8®ÕBÛ4i½r‰ä"JìFÍlÖy¼Î€³€>ÔzÙ^jéš+:Þ½Ò‡m+à°ƒßç~:/w+3Lßî ©Wþ§†Ë#w¬¤–÷¬]¾ïL­h&' :ªß%­K¸ûÜŠÁ MI]ð|“)DZ LpÓÁÅsýr×/ò¶ºþvÖ1çè§N®‚væÎõ™øCgvÏg¢ÌÝbÉ™Jœ:JÁÜtAÔfñ cax6¥UínC, ð¼v-ÿ¶r-ìåš¼ÇTùY0pýâ«×x‰/ç8&Ÿªò™¢9ɲ¦¤Þ/E37öŒ|˜ xÞŒ¿´†å‹´·RüäÉê•‹Ÿ•QR¿d¦o½miKσ;ÿkžR¨už±ŒÅ {ß`Üç²ñŠFg—È˧œîR~L}_½ÏÞí½Ýp1Žï¢Ð`k‡0ZT«Ñ£²|”"ÌbÁti‚Sc§¬K› LaÿZ«(ªÇ}q‰“öðÊô^Ê?sxõÐÝÍ—Oª({Š%ë‡R7aY#6 ˜&$°Mdëlcë©Ä-Ìn¡Á˜—vµ+½Rʰ ‹=¿ •É €^¬ä½;'Éz2T\>v‰šjªN¨ê5UEÛ¡]HA°D{u±´½.úþE9òŠN%]-ó>3M1$mXQÑÆ¬…÷A #ÛH3Ú÷"RµOxeq®–LIŠ¢^$ ìn ƨfµ«vÈN ‘ñÆ Ð‰›ÈÁ÷íYaôRù¯\m¯2òԮ嬸é5‡§3t¨^¯ú<ªæóÄï¢Øþ”ÿÍã¼DùvþºÙïúõ“ó1¥Õ}{vYÌwP+#Õ™Y/¼>Qb$k9Irˆ…¢À8¥"QåûÕD1ïš%¶ÙHîY—<ïÃUÝÑÙqx‚x¡,òsš SÕïã _üî;ô¿ÿn{ÿxš‡;9%œCê×~¼ê?ö#Ä…¼!ìÛÇ.³²¸|¼®ösÉ?ú‹fz[•’Âîl: ´ÐýÊ7eÎã"þ(>]h ]‹Ìòõ5 ±æs*€uÔw™Õ²jhÍ"!"z&¯Þ‡ šSû R~L?­Ü ë” gʾr”älLN7¢e…± __÷çÒjÖĨòg9Ë)×÷ÉNiÔƒ³ß¹½f;Ž#Ù¨…!ãÑ`S©j"°¤ôÓ’ÐR€îéÉR?àN¡ž²†\ÝIL'­¹Ç-Z;–(µ²fõª}[Ûß\ß_‘×áü—£ï€óG›)}–“'ìÓ]3/CÖñÒû8¦ùj_»¦³Çð̬C’•s¸[â]j ’Jó@röÙ;=í7¶XêLªú ÓIhC‡xÁÝo¢ßžõnlT„!ÙÑïW6_Ó“\PYsÉ‹éu‹‚.`ß©p7}_ê\ Iâ䔆Øjˆ”5$6`0€m Fxul°RÇß7D¶¨vbƒ" Ž@DÂd=ô И¼1Š9oÉ$JDQêO{$xJ=ál¡½Žu»!¹oKØ´dYE^ð!±·ÿ/õÔ'ÂÜÀ€—I~»XBc1t¹_‡5tn@„Þ ˆ}nÕt?ÿÀ'×J2„“=‘µÕ Ïç ,V`›sÄðÝ:kU*eÖ   Ê ¨‰§¬ÕšëZßüÛ7´\Vßt¼×ò¡©2¥cšq#odõ:‘ËûsïŠ4Ë(9¦1×`¦7ƒý ;¢ÜO6;ÝÌ{>µ¢½L·[’TîlÀ>Ÿ„iD)ž¥XH¦Ð­N‘Ó1¡y¦)@fˆ…!¦õ+2†V”ÖV%A†èë¬rÛéN¢„œ½¡ÙÿæìYÈó“Ã4äÐ0{†ü~kö﮿‹¥§ƒ½A:5z:¾÷$d¥áí~w3I×ÿìœòÔx·q]$¾n¨zšèþĬ`Hœÿ’wAD8'Uel±AF )È Îýɓޯ 3†šK«"{²g2ï§ãÚ#²˜¤H¨Å‚*·Ø~š:ÚÐúà…ýC­/˜H“¤Åú#ð€X<Žh¡÷¯’…ÍA(½Lüƒ¦ìG–%RjŠ]–}m!R^ÚÉúˆ¥qÒªâ#˜U:€èË,$Œa,ÿb´ÛjqK¤ûEÏ€ÐPñ Þ»MÒAoôr¿Gè|hí \!ï‚£ðñPüQý• ð¾ÒùF‡€À˜ØvßÝÏéýM‹0ׂ z~9"Chéÿt¥ËºÒB}¤µcìvmZ¡_ÃÝȧ2¾ì€”æô³.S¼Çëi  ®§´ÏI‘O¦ø¢n/õj?§S¬£NµÕºëôyÀ’Ãe ¥Ý<¨q( +f" }¹ì­~›.°Í–ÀÑðí@Õ­imÝù¨ì>wç…wŒ¿ÊÊè¦+ØMêÎ4Ê“áÃÙó*&]宕IšIZÃ:Lu³›õPP xæ"„¹dÓLËõVúfILT;óû/_€¡›î©§[EôHvIí"ùñ‘¯/³GÐ}lú9ÅP÷@G 图gÈ !ò†¬œiv†gï çJp¨*†îÇ›•ÍÞqr @ ¯.þí™1#Ž!»!íGŒ"›6”yÇÛÐ9@ºPÙGp@€pÊÄR $%˜G2 Òn©À €D†ÂàÈb!é%E<m B«ºø¢h‚Ó€Ž|ìôÊà–¹&ã±’(@ €e$„ÌÅñúÁM(” ÞÛ­2¥œÑHpý~¿MÆÄ’ù>ðÌœ,nzýòiî(ñ»÷ ^ñ¹Ò$ñFy‰nœ¸ï+NÀ¹ØÏÄv 0à¥cŒ¹Æð]ƒîP•’`ºÚ;‰wq¼wÇ9¸ 3þ7®Èîõâ~I6õzú£ìû¶Öçª"Ï£/$talùü´w¢æ[¦€º$´ôå<® IwLK»ÛÏ1¸ ¾ƒìŸ€ÈÓ\ˆŒÝH£™3+è¹²@šý‡?Ï­­Y‹ã´À0¸ÜŠ'Éèë™° ThÖŽ!ò¾E-* @½%ò}H½³õ4ËôBÏÀ5ðr•¦ò;Lå5T¬Juéé 6¯ýÝ?WºêQvð7½%Çj3ÃÌÔL…p{(·ËNA÷_äN øbLÅÜ„Çå¾óaÂk~`€‰²*G=§÷Ù;WvœÍ›  <}øÎ.î]t3E‘ÀC£ž)B-æšf„t‰ú¢¨Ç}Õ Žc’ièŒá®‘ƒøÂÍÝþ`Ëð€0¢É˜°*îp…2–ÞŒ†Wx€0XôàÆ'^… &Á£$ÐRÈkLSÖʪ&üz (Ê´¸EÕ‚/Ë- a bǽýz1¦0Ø?Í¡ïáÚþáR|v&àú5 ¹ab€W “é––` \Ö8ksn~M`m“ÞôP¸\z¹ ч¾¸ã˜u†fJ5ÕѸ*Ô‰ñÝ>® B"ºô^ ÷ï;ÍÃÀ¸+ÂÒõ\ý\øãú ,­¦™†>…!w¬¾~Gb:$O¶W©„\ð¡à}Fà *c›ˆ<üš®.é A¹Èþ`€2q(™Û†$)š®+Ÿ±è›Ü½´Z'¨)hòó½÷ö¢^4IæKID«ÍáûHNÈ€5=Ð’;õu¡kÆ+|öR|Æ-Ï´¡¸./H!Ú*Ðl^’;Jè‘-žË¶OuD# îºf]bèÕ¹FásW¾›‚¯ÎK±Ë4MG­N8ÇZfZ&ç»wî¨3ÖÕÄ‘ hÈÀ\÷î~çCÒ£P ™è}®ž¤M*›©ì™CÐCÒpø@Û*îî@Qz+EKw»žÚŽ9ÆpÌrY’e0 šZ † _ÈR ¤Á·±©ˆN±\°ò{0ØÀx]A* °Á4­³i€Þp$€OggSÀÉ&‰¨<$ÿºÿÃÿµÿ²ÿ£ÿ¶GUMÿ–IVedgÿÖ~»í8¥Œ N>û÷;ÊžæÁèô8è±þ²DfæÕWþübïO[Ñ×µ±`”ûÖêq%hÙöy¨aÉçЛcÛê…kž=å’$@&ŒÙ¹¶I~¬áBÖ0ãöòÛêþмHnõº iÞòy³#M¡µßOðCµEBÍt8ÎTŠ-¥ €n=Ž{xáÙãö—dMUÉÏ÷qÄï h,B”«Ð=&Z²×ìJä:ºPßt¬€ž6Ú8˜1úý’ö;kí ]±ã— Ò­Ùè}Êó2Ú+ââ›ó;1q0Q•ž} Z·µóCx4Ät„WB[×ÑG=$I7’½¡“AF&'@ÕÕ 1Ò¨ºRA:ˆÔUˆ I/SФÐeŽ‹È9ÖêÅ 8,l/Þto¦(N H‘c#Œ#†|²vleÙÙxPöôè¬kJ¦ü<²>œ€¼à°¨6ਠ 1öâ+Á ÛÈÔGŒ‚†EX±³4’°äÕÀ ti,€€x~Ó*‚$ƒ,ˆà÷3m²ó4ްɝ€~»õzJo…¤Ì<û`L—ÉȺMtþÌ{бÍ>ý¹ÿ¹4ž‹¾P êîeàud#Â-%‹g`r¿-zé‰õ =×}´~T™è÷P5œs÷È9!%V…åCÒ6Zx‚Df7÷lŠ/Ì4ÊÃ+r.!ô %’JÏ››^j@ÜÍeæ[ ÿ²!nY‚Ì×ô]ûTEš`…L”'Ep%ê÷eH§ IΑB$2B€2f#L4xÅàm쎥ì%:Ù[©GitE–»( 3™RG›”µöÊÄŽ's×jÜ4µ„ÑÛM£¶Ï%5B”†Æ‘,À s×¶€"„s¬‡(Ö @ëÜÓDÙ¡  &Ä$@*À ¬j ã”À´Æ¬ocè)ˆº€Ês„¢¡×zˆ2-€ÂØ‘Àb‰ŒÀÏB‚­µÀþ>å©!`U#X@ P +ð!XœãäÀ gà­`Ë-` b¯_¦P˜€@.ôÌóë¾ïâFêáN°¼. ãnÁÖ0)ÏŸœ{v&ƒòBIPO¤øñ ™p³¸%Þ·\±–äœ^6!VÅ4-Q…wCüYü®„Bð@ƒ’oj| ·‰ø’ñÁ(ýž Å0Êzäèɱȫû¹ äRy>™C§Kú~e02šÐyb:*ÞÙˆcÅCAÄkZßõQ‘€µ@Î(šI‘6Gb¢ÄáíxŒEÐÏZ,àWåþc~ì}w}ŠÀ úå·_Q@ÕÎØÝE  Õo={ÅEl¬@Æ7öÑ„C­Ò<±fQ„˜v­I“$qoYj’8&ø,yœ=“áM@7”kT™èN`9 ëäDIåɸd,A¹é(]Qmt´fæ@©Š*‚Yê<–f û®u€nL‰>DQ”qŠ&0å@P†Ô0°@2EeÚƒ¢Tà€lpc0`Ä Z F4š!6[怂UêYE:t²­%K_9L€ÈPë)* ëƒ(þÚõf ~€ xG:Åõ ˃£€ÇF•8«9Ä  ¿N,FQ¦Y¸ °Œ8ÇœWìlÛ˜""S ÐîÏ ‹^ž'0ì Œ ngÛ3nØŽ4¶wڲʯÛüŠ/î¡2¹|;4>³t@ÑÜ®•dð€x[ x‚ËÄгÉÐñ¢Z(ø’v–뺡 ¹ª™#¯Ùac/O™^E(bD\Ù²ÂÛ "“¾ñ÷Š·˜:}-¦Ôaë¼>Chm93ÄPœÃd!4‰o—V5å@ [ÊWM’ .J]•3Š ÑäÉíâ=»[/À€k^€qN­ûp30e©û34܉î"a$Í‚ØKÑå^š«uK#  I:)t“ÒTÖ;¶d ð¢‡&!lÔ@M3i#k2 T% ã,S {ÃM,Kt¦ÈÁj‹ŽaH@$ç „¥-%;PPó 9xDDàËÑ'5ѨRJ D—Ú‘`@ kà{ªu @ XcØaà ,Ÿ®B^ºhJ°1súe` >‚¶!åp»ô¦eõöÉü3ù àÞóÆF— eý0èUòý<`Íq&UáAd2R‰_@ [ÜžÛ¤ÿo3šk½Ëx\€°vßÛV“-<{YG»”“ak_ošðC!u^öµ5øþ_º(À8Á¼¾Y´Jñ…éšc1$ ÌáÀG5£ÊÓÅØ6²pÓ§ÿjDfÙ=Î G˜õžxCGæ†Dë<Ñ΄!dHONœûpö=½ªÌÐóš­}Ù(ÇÒï¾M µ{¶dªC–°fæ×e¢ æžj`OÕh耋ٙ¬K,õŽx»ª®J¼ …LU2º’~ºh`#)ÚŠ DÑ9 ×lU €  Ý…!o k€ÂÅÈÌSP2o‚hA³· 01а¦ˆ€Àªi Ñ@€`1Ä:´€üLà26X@ '6™U•Khh€M/T÷àt“üžŽ1òì>¢xzû·lÖ+2Qf𬆯«>FÎl°Ö[ WJò/¶.ÀŒ¨³¦ˆH'ËŠ€8X{_¿ñÒö™Ññ×ÀprØÛ›·i¯I 'îùÊ}¾$xŠߎž[]Ÿ3€`·%K܈E „î¥;4ûB!G<×4r@ %Á©Yrš³5rDð YÄ ¢Q1ú-L ë~eL â=vøÝ{“}`£e.jÕû¬6·Õ„j˜ËV‚:{7öMœˆ0ÏQ‚´ˆÈáå"ÕŸNã4L+Ësw˜î<šP$C´ ] Ýhžø¤Ù@+>Ù˜Ñq‡ˆƒœ'ÙÑ%b<­à=-<³T@ 4I™û.W·“Ò2ÇÊ$ 8’™À€u¬jh©C cbv(fiT¼F7àP´€À¬`ˆƒìZ¡$@€VS¶Y=I15U£aUk±Ð€•Ð1€Ø `Y±à+p™ ¤VÑÌ쌪/íéà.ïäÿùO=D]×ÂØ`Õ7µŸºÐqS¼ ÄžºâûXŽ+I;ÓŠŒ^b(ASØîAŸ‚^Z =þ-ƒÜjebKfÅ g[­—'ƒ”dýÍfÿüö‰£ÕÄȨªÀi’›½bÛm–C¯ú @AÄÊzyO)Ç£Z ë^¼†&‰! íÐÁ"•±eØ¡µˆ#©0ôvUaÇ Wû_0 Úøá;ÛnŸ>VŠœ5-¸—qVèm‹:­šâ•ˆ¥j¥YbEK„•Â%ÛŠ«9z„Ï¡¢T@7„ƒ€µRÚe`ãfcJ»¬!{` Ààñ™žgúþúÊí—×þä,ÐB«>yy°¸áºÁ­sÄê—ëèNð^Ú©$€ïLêïÇz#c¸‚É1ša¸$›àž}§f_µe£U}³OöÌT5ãÅŠ†"92·Yáqn#ù'¾-Hã½EzdBø¤)Kùyös›©g>4·ÉŠçdæéÀêyL’K„iÕ÷+—Žƒµ@1ëxV@ P@ZƒÛ¡JZ‘§~3"E0çÊ Qd%EV‚JˆÀÒ0 „ÀßAk‡<»£PJ”J†õÚK¼àŽU` ΈYl!Dw îk×¢ #NIÀj@ ¢¬¬Cå2¤Ó8pØ‚e@¯¥UÀK(ŒIÀX&J€ÌˆöbY#ƒk»i‡«+襧×’š¥Y +™©ªnUàµ9_ãubq ,!² L̺saÀ €T ¬¶ Jˆ> èE·bNÄzÁ ‚‹?§çf­H§E-%Í=Ú J‘A¸ÎŸNðÍô« <:J?osî£ö"¼œâLÔÕ°ÂDB,Ô,kw þU¯GÄrñ¢¡\_I~Ýɺ§dDýè6`Mµà—§ƒ™Î)UÙ­®‹ÙµÕ‹úCýØS{WòëƒÃöùü­ƒÇõ:hOxÿ®5<—§k\åš©ªæeã??÷b9~]‡êõ8þ~ŸeŸ´Z3 X$ªabGÁؘøtµ´(øé6\5¹áJg‹5Y*µ³5MÙO¹éÓüzï×¾ßS‹íüü¬ÿŒ>Æòsù»}mªrïGN??”Rà îäÕ‚CÊë5ýÿ,¼³ÔR%AÊ’Šü½V ः•Sòbiúm¶Ãt’ÙÌŸ¢®÷ßýéºø*ùóÿ]—·½_¿>÷Ù~‹ç×µ˜‡lÇÃvz»ôa!F×Oç»Rx.oÂÈþþ±µã=$OTßG^IßZÊÕ@,è}v1`õ dšÿ /ƒlêà\‘ù¸5éhkõfêªvˆ–„~þrÑï‰Ä=ÝÊqïûY-óƒªéø²JªÌçdÌÃWØÀkX„Š\¤jÔckýéÅŒŽ½ú aóºÉL‰Gº+¿zÏaYÂlò‡‹gI2œÐ¨¡uëñþ8ì¸W®ºÙ˜Ì§$ ¶àc»¹Jˬպéúò«¾4b’vx¹Cš˜ÝhKe$IçëÖ]ø3‡8Ê“µ“ÍöXóRK84Sâ#lÍîùɯÓLéþ7Õóù~Ì[äÅ¢ˆ– ÞÉTâ«æÇçü_jW˜Ñ$‘òyŒý ôô>â­93yúÔ‹›‚œŽùNÄÕhŠN€NvÐÜ ±É-Ï5Ý °5Z4…å!îšð ÚwE_Sʧ癆aoôæèÍÊÊZžQ§œ¤»‡†É|ôvGkËÿ™ÒI@ôÔ鯸5ªz2ªoŠYk§ O¦F‚A¬†*­`*òNs å-Ü@M&°/†„ˆÈIvØIíú^…‡2#¹úíÏÁ¯m² ”˜£FvË7ÀlKþnËÛ 0Înk ÀSökOggSÀí&ŠFrV ÿÂÿ¾ÿ«ÿ²ÿ¡ÿÿ©ÿ¬ÿ¬ÿ^Û…†¦HØÐ½v#p€~ ´ûòŠïÝ mâK.`äW‚ÇÖ}1ê[o&ªJ ³€ˆ„…ƒ:5‹a>æÉóå¦16Ü•¾Ij7LlÆYÉipÜ0žB)JJ™XusHÓ\`›ÚÚœÈ0•]OCÉœ‡¸ˆfŒ¹ËfèÌ«?1âðÿ­‚ ô• L/°è>bª5í¢pV—Ëû¯8MH½ÔŒÿD<œJZ!Ö+!Îü(—waÏQâbÞÞ´/˜“N4Îg3ý¹ñ…䦽€‡‡/ÿRÓ„‡Üè·£ñtB™iйºËÄß ÆƒMûu|J);^î=ÖlMòìIBã-w ï‘Þó•iÍ?'¡µÄíÿ)åÔɘvDLRYóaºLíZßZâ&Á@“ƒàê™øŸj(€qª—\»§r¾U5E%PPgWÀ³NwÙ¾®âI¡÷?:ïL]l¢Ý.xî]ÖFv4¹§€àÏໞ[ÅÈXðl ÀV¡¥µ[9H^Aêº`"@/€;ëX†ÒLÓt9ýlË'M¢ [´AèòFÆ%áâžÛ…Ïr䯶›\IÄP€ÿàÄ'ž¯ÎKLáãçO÷m$0žïÎøáÔíâº'~Z;êEF×4T™€HÐ0YýÄè«=Ó<›.5ÿÍ,u"Þ»i2Qà ßóž]O ¬usH)ÁºÅß]¶%@áGäF´/ÇAgæ=NÈß(•kIÞzÊA†F†X-o,Õ5íõ_qy‰€ •ñ°ûý‚búRGXdS}©(RO‰ÍíÎ3õ›†®¢ÕÓÃuSw¥£–E–«S"ÏõUßl®Ä7‚îtr{4x”úž\™“/šôk0±mÐ",HŠƒºZÊÄ?h¶$ûßY­9é Ô¥ YS u’ÚKŸ]<‰â,DsӜ驾;cPAÆôt¾Œ™n ™fÀ~Í|ž.ˆ= UÓ3L×^ÈÙÓ,^fW©i’¤2É|k„ïÙŠ½ehoº8פçòR¢§…øóæH€K( ï+it€ÃÓãÀø‰¶{véÞ¯ÛhE£æÊ Þ‹ªpm±]Öÿû¸6y?ZOÑù~•X¯^3ô¼Å·'ø :„©A<´'uz’ñfî—""–µ¹B €, $Œhª-x¶Ý+ßãà~ý5ŠAü:Y€óŠáÛ¤h/ðØ.G/«kÉyD•é©ûø*»ŠÏ4U’9³Èž¯^eÛQÆÜB-¯4ÝÄnpYS½aºO@0 dæíàxÏsGb«=@õ;=•©Êª[C½¸‹éDq]‰™•©Ÿ˜ýØ=Õ™µ¥¹Ê´¼¥šêBáLݘNHгîÏ×úž9;²bºèEûÞT¯j€i†) ç®kíorOí ™"‡úÏ)ã1uÇãœÁ†Z° H™}F;q Øq¦…,÷@,ÀFâè»A ²Ào„ëÎH€Ž&2 teRGͼ 2½=݃ ‚F± t¥ªB1²Ž´Œ¤€þªíl‰s€UoÁK”C‚á ×7Þå*ÈVD^3 —%öiªàh¾g, þ¼%p%˜8³N€[2¶µC¤´I5— øÖR¢<Ï÷¯£ó‰Þ]KwÅÎ‰Ž¹ŠL÷y7r~÷"äºqŒ>€¢ßa‰/9®9(wµâC`‡E;ЧòûÄÜ?§¹ª{®»ž‡µr<(êÉ@ÈÍ^Ki@˜²9:ÎïR~² «†í° ±¡rÜÞŸý¤ÈÔõ8.t ^šbõGµ Hâf“™ÉxÖ9èiàM éÎq’Nv4UDTk¯± ˜(ÁYuP ,R ti„f —vÈ¡¢ÑOäÉMT8§Ètâ£{Wã•Z¬ÑäÅdhÓ¢^„$oo‡Íá:³L ìd4TR»²ýTNHÁP‘¨S~ý\ÛÏ8*1ÔôSxåM@ÓûJ¥)col6r|k ý_Ô(^ä  À Úk'`Z€ £· 1¨#ДÀ0B%`;0`¸‰T ªhMˆƒžF”zªõè–Ò‰$a\¥´ëÈmÊ' c€û m ësÞ-™ ìgEàïñË€Q¯<à°À²¿D=-3€'WÅünÀ&`D… ""é!r4Û òD’.þ'L^}…ûëòİÃL%ÔúTÅ>[íW€žŠ^ÝN €œ /Wdp(ãÉ¥ÔJ\3»¡]ÀÐ ¦•.ÓÞÙãïÃ8 ÷n<[â¯ϧ“-¦ŽÚöK çÙ¯9ìþl8d°­?ÿx¤þH' ‹!Ôð"¹N _H=G鮽ÔÿWw‰ž¿ãëƒ4V§íµ¿êÂ+YÉzaWÊPu‚—tý.42þ¾;º®)cóekÉ÷¡”âÌãHJ!HÖà;XEÈìî§Ï£ð~UE‡eœ3…EZ(¥3…Ü{îZiµ/–騑” ,–1c€øûÑ… îH7×WÙxa÷ÂüÕq¯êZIr¶aÒÀYðC£ ªièE*Ó6>Û¢Å\)¼éÛþ×\M€G©¦Hu;T礇ϦtE¼Î¥U5@CF®É4Ð(j` ‰Bcïù1ÓÝÀºH(+‘ÜÃ…{PCäö¹,?’ %’$›u}39eÌüAgBvrz×`$ À²0µÞ @(Cü²8~»RmßNÞ™5êœÙG°–a°”C¹†»¦ÕRžàé5ÈÌö¯ç{ÝÍò=ì= Ól¶3öé؈ɯ» ?\çàÓq‚Ä¥$ûµ`{©í€Gïvv p-‡ö„É‚;Mq³™x)5b{1WrûnC^·o•çòÞyÓ|î´1¶–,…žÏþ˜2žð߯ëIñEzŸÐçµ”¾¯7_/š¸¡úN8]z]–¬xï‹&Æ_W×-K¡xJ·¯È ´gÏ]à •ãF? ´< <_©A>Û«±I|üüskCU»@ ¶Lmo—Ù€3ø´Au±úí˜Ã‹$^®ënz€dWJ6tÅíëæ«  O°je 4xê5…®¢©²»]›Æ O ó-@ƒÎÙPÞ€‡t§dC€µ+Sðõtg:Pt¬ÕÙÙÿz÷¿H ³ÒCÃKÒYó¨aÈB™¢`/ëâS"L@7`Ì‹sŠ3ÎxŸÓ”šÝ'D•@SÄ €0q9ãI„]ßR øÄ°Vyµ¹K$—þÐÉ%¸m23b‚$ø¼"ɳâíG±Î53çÝ›|cøHÂwˆ*)Éé À$ y» !çݙΠ¬Tz®&ÿä^WGÐ’6« éÛÏÆÙÁV2( ä6åm:sã¦Cϰ¯OÌ©jÒÿ[·xJÄ;–\wÙFkve³ã Z<òrÃ+µÏ¸-{Á÷‚*æyÝ{_MŠ@µ\[gŒ|ý;Ü“mÐÃì¯ûÖæT1Ôtn¾å#´HÒv×Ïßña¨*(¨™,Ï5R èÄ´›¡'› ²V¨”A‰À±1 ¨ Š±ö} g‹˜‰À¹f\OggS@&‹ ¥WSWJGGHF[P[d_ÿ´ÿ–ÿ½ÿÏÿâÿÿÿ9&{L'ŸÏ£lÝU¢z™Ä~üé:OQ½ÐM5Àå¾ýÄ¿:CSquWl·®¬…–Bf"hÈ@w)Ý. rjyX±ýP@¼^Ádpàj›í²Yl–­?îõîÔ[î¿ãAÓÚ`˜× N=åXVÿnuyøeBÍÐo»G‘¢~W9!µó¸Ï< é©Téî¢E¯„Éð­S¾kû Ìb‘j# üálëíÊ& ¿¨Êèð¿Ÿ:q-vPk_½/žÝR´Îíã§X»H±Zé·j¯ïlA¿@ªc,DF X@*0Œ¼°¶` øS˜êÄvÑÉßè@¿ßÛ/9løF+AÚÆ~€ M\;àüo~ÝE±’T¥WáÊ«>[c¬µc4‹„Z2ZO@!KM©WZZƒkE«B&Œ&Rì*áRHÓïtåNìbá Œ*>êt«? d¤îúˆàZÀª¿&¾xôÌïÇã%”g¦TëtŒRÜ«&kµ‡\'¶ !Á5ð6ŒÈµ€làMÖ˜bäve£è»*av·Á]9¨ôÛ4ëØV:—˜ ­öø?ljTP?Þñ!ž?X¦Wð8uöJX£IVƒQØP° <Pß…ô^ÙYâ‚ ¶^õ›Ìö]Ž_]=Z‡aG•„#ÐC›rË® åœ8ŸY4Ð'Ž’)xòpX33ÑÄxÀLdƒ¡ ä~ùltK˜?¬{­à¦äKFÛ)>¡e\húôïG‚êi³_•†5÷Jµ²Sy„8k¹ðd…dxËœÅ`=À(i×Î Œtñ®Zó©N-òåñ!.Ö5GЩx8!P«qÏŸu/@@,“~üz͸’ÿpW§Y2 #Ìúq´ã|Ä*=±&ž¼â‹ÕZïl¦ÇûÍõ-ý¯ (Aö©©Ñ{¹k•¥2Gâ哲¤ÊQqsVÛië^„lõ¸­÷bA¬ìva5IÓ‚çr·8ÙÔвàÝþv‹(êí?9¦®Y™(‚ÖŠýµ¢´ËVDÕ­Z³†NÍâÖh¢@cFô öQüYx5’ˆ€ZYˆŒs‰‚´‹iQ[Õ¸@…«Îׯ“I!Wµ"€~ßé cm“v Ï•ç[VkC“u¦—•ˆªJ¡fæÒ+EYj…(×LDăúŽ˜íù5(îï×[]Ëõ+Ð)_™á#’È)[a÷‹E,à¿m‹ ¼Œœ@ÒײÌ&¯þó]>IçÓóTÞNìG÷ýÏGåÝwv½úž~çXŠºÈû´:•ÂQ_J0ýòíÃ|J-U~É«Åök $_Y é+ PÉjY6»ÛVYiýõëùIqü¬?õÚóGßöÛêm) i}1P¶Žb Óöä~~ƒˆªÏ˜ Ë^9ã`"zîRLѨ¢4ô8dJOÒÁˆA¯Z¯ KGÅ1!ÔV”‚Äô W¦ÍŠ @Q¤•P¬Fa€@\ E "h)@Ð] `E ‚ºSlX@D3ŠPÊ(Q@ Ø°€EÄb„‘ÝÍê6Ýä G MlwÂÞ»õ,Æ$,PCõb+“ ÜX]¨Bóeع&àÈœ5÷°ß”œqÁæ}²š_ǤK§xf?HÀtù›®kmsüþÜw—‰×¬s4.¯&^ÈÔü8ë8棉›Ôç’ýÜ×[µ-~Th;"/L\Ù¦ûìÜ>«OfŸù\>:Ÿ]›0¯ó£~»kõ³[~ã—v²—ÓaG2­:GDç"ÇpÌ7e”À€_öŽšCŠt´ Êͬ»³i‘sÛï¯hm$Þå]ÌJ›¶E3 W¢K=•#ösM¦èÓ(²Hã¡'µý#wÌhÎ[Ì.“É6éœÉzœ9dhçBßð¬K ]†)¦î¬¬ xæ¢[í$êæL’%V,‚ô¤.˜¦™ Ë’ÆÏÊÓŽ ¥µ¥u?kMÓ´÷¦Š.Rƒd]…оýëhÜ€LC&m(ˆ ÓP¤TM2Rq$Ž8ÀzSpŸ×D1䌱S¬SD Ý3M­™ˆ×˜ Ñ(%%‚”R…1ØX± 6˜PTEêbc HVÅ#€FA¼íB2 0âŠP m€ß›NÀ?x L$ Õ‰ E¥Ã^»Õ Æ•™t h{¯žEðø@º·ðä±£)Ç8;”û.Á+ò7ÂÙüÜP?g| ï' åPaqÆ•ØómõÙ`åÞm£]:Å1 v^~}þw³sÔ §÷ï£ö)ñÓcQûGã|É/îÐj½ÿé~Æ(- _žò —ÀÕ›öÜX½pÒC î«ÀØ-à„I\®'ÀÀ07KÖ5Ùs¿MÇÀå€ÍJ_Ã÷J—ô³^ðŽ•¸@ t‚þ¹¯X äèTËMkQ(‘‚f·Ñ®x>õcš´%ç1Õu=r1î;UAöêƒ÷í3ód_rÏe@¯›C{>SðAÚ"êfB´²Ds8õ’ƒÖôþ~-‰§ž¥¾³gŸ©ªb¥^Ò¥? ^úq}²œé¯;ï#‹Í6^<^l΋В é NvÞžfßH;T±­¶á~³GlyØÅgfÙ=¿ªSÁ6=Ý—ã¤F±_hÒT5.Uh¢Í ¢úª8Òh Ûëd€ò*½{Œôz¦Óúõ „$h€e=‘i(ºGc$¤ ¥²¹®6÷År"G#J ã¬ÑÓ HU¦ib^¸Ve°%£‰ÆFÚ¨Z;ö ê I²Z¡¹)Åьв`HQT@í3EÅaM€ØÖ6`Åš¥˜€¢`@ Á DkX EcËb@@Ñ…Ì D*Ø( ‚$ŵ @LY ¬ÝT€>»õ¸'„Q²¬J$¾±WÇz A§Cðýêûñ÷YHÓß/ä7€sÞó—Às?´!`;Àô9= ÎMv5 ì×^¸›€‹əހðXfù–8Yç¶nÌ"ÁÐy°3ïZ¦ùíÄ?Ý+fÂX·11ѸÒ$ˈzŠÕØ”ô8W ”‚rǸ•‘? >Œœ!¼1îüDŠà)>v1}$ÏÊÆ®->WÈåEòù»Æ<.¾£”A%—½ovR/šx|aäÒâBÑcÅ—âðT¸/V—qÅû"3våsÖŽ`†æŽkþôI·ÞœøkúW-?_±¿3OggS@2&ŒÆ·kÿÿÿ ÿÿ ÿøÿøÿîM_gjÿèÿñ4@•…FÕÅzžjLž­’ÐçõÙgçE_%Ãã¾-ØEG4Íîx+Ð_þÉÛŒV"Ÿð^}ä Õ2x°ÚrÕÓÎ9tŠ:‚•åÙœŽ* 7x‰\%9'±$÷ éJÇࢢ”qÿìJŠJÜK×VX¤Bë-T†ÄVÅ›qB}mjlM)ihq¡×et©Ù J‘`të¥IÐõ"©¡€ÑÆ ¨ "‚ Ëb°£°¤ÖƨZ*ŠUQ b# ðĺªÆR¬  ‚(T h0…‘L €…ÖhlL‚€E €d4SƒƒœÁ»ub ¡ ƒè®^ê…ˆ:´¾?Àó:úð ¶fªL¼Ë{ öÕZLÀH…ÈLµ óìžèÓN®À­76اŸÂó È™ïi ¤ÚÌÏ ¦}Kð ÿ‚+å÷KC¡Î:Ò§ ¨8yŸ$7@È,;ê§Lk.EA]ÓµÎîAÈçýÿ%´U›Îgz¹cš} >CÓÌ´ŒqEVžkì™ÈP ËpLvê˜æìLÒŒ ”œà¢âbˆ"bZ|a¹gk+ñ<óÆÜ›|›)¥ïuÉý|‹}Ó¯b DõÞ1¦S—ˆºJkAåHAúqh]-ÐÙðý±¾žc€$8kè2oëKàtS#”s%ˆµÇžÖh"v'Í…ÉK(£ãT6#l†i›w5ÙÔECÙEOiת’ÆÀd7†Ð‹^#€P²Ëª–ø0 iª{Ú1`q@Vô¦‘`­¢èR²B¯S=¤3­*kUFÑb0 o£ŒÆ%fP[­YŠŠ…‰’( ™¬dPU2ZIĂѣ`ÀbÐà·@ƈªf²®jEìDA°f8š"ºJ0b±¶0€PTŽÝ9€0€”˜J‰PãEI^{t+ª$n.µÊ ÐI¯SÇÿ!=%ˆ³|½­=ñp±„x? >=owó[Ú×€‰¬f0Þñ€GU°¾k³aô“pYl 0æS θ–¸èà†<ÝœÉ>çÛÈ·„8wâS6WèíÞ¡¥óz»®èÛ»^vrÈÊ ZþèȪcFäg Þº9Amȸ—ëí0©5|Û3ýP¡è³2ÒµÈÈÀ`͹Nûe2Pm"ê±ÅSW ÎÚ¡ÚÓ ÕÑ2(Þ‰+ŠÑ–A±m)q¼»ÌB¨)÷qgÏÈÞ  ’Èi¯[[NýÍÔ1~ÊH)¹‚Û™¸‰S«e³e5€˜¸Û`7àZë¶©2ª ¡¡iÄUzji¨šGA9› T2")€€¨[š‚b­nAK1ÁÑŒ`åãP¡C€b­!Û´µ’ „1ÄF ’B EÑ‚H!€Á(PF94S&¤ÔG €{tІ"¨ øZ«žÎ1@ZgQjŸI§d„8L®ûëçÏ»üdi=¿WædàÝ5ÀûÓ@öGD%³¦ÃvëÃ.Ä“¸ªìp®UxͰÙ|Ÿ„!=v”²Nß2AœÁ®kϹѷ‚‘@âàûjö¼¡VÈÞ¤ö2!øã`Ð\ªç. „ùÆ7ï•|[¨LK¡Rþ!ƒ¢].¾r ~Ôo¿Ò—=!vzà–’%k)´ô®õ&s¾Šâ4\{þ©k Z¤d‘4«¡:¢!!6ËÀW€ <•õ4ІE0¶ÅàèTþhØ;*£ 3˜d(dÀ)8ßxL ²²i9ã  @ª¤½×Éö±  @w-Ÿö]+}ÁÒ4 P<éÙNhùÌèÙ¾NJƒððˆí¹žM¡˜"Mˆ«¬â:¾Ñ>nüxøQg%*.HÓˆšñÎÓª£µˆiš‰X×ë½ †áÆAwœACà ©ï2¦Ñ™v‹£‚΀PP°8ÀÙj€E¤62ê 9¦¨¨ `?vª€æ†U[`ƒÑ ˆŠˆ¢)8þ0P¬@–ï?2ßÀhÅ¢Z Ö4@­›}ìí2* EE@H€þMlŒ FVAø¦V5]b%3U•Hè%¨šÀ£û§*gÕgÀû€ã\~ºCÀþزèq8=-°çzÍm‚õ2ØÓ 8#Àæ6ò ÓQ²œ))$†bï`msÀt(Þqú)`°?·é@H:°´‹ÄkBÃïiá[½s 0.Ÿâޱ‘ ¹P’çw(E÷   üã· ÈP ”JTŽ­ÍžçNZgeª}×ìå_ë‹»ù$·>þ™z©‚fõB˜Ã9(RïE3 Q/̱¨xŠ(àLQ€}=ÃÐoÃöÓü‘jZ p,Ü¿P䀱3dÊ™7ÉŠÕ9šZ‡¡ @CÀ ½ûâjk@¯Î;÷÷¬ Ý @[mµ_l³0h0¡N/)Eƽëˆ0“¤(¡JÖ¹›rÃ4ø¸s†­Y—§‘»ãŽÿð¨#SȈ‰p™€ˆ}ì’Öü:5“y”cîã€0¼ÁïmBÜÍ{¾V‰êÅHED²AÍ£!Ä{ñ§ËÞMö¯Þ#Þõ•Å{R;Ý7­Z…¢dÐÇ÷)ÎÑ‹‰BªUBë?q ŒÂþ‘£E_  ÷7¹)é}êýój?!ç@ Ÿ=¾cbV›6A@2ù™E̤3á˜ùÑã=ÑÔU‘ü)lÞK%ë³R²Ä*;¤ÖØÛ«°¿?wÙt5CŸ'Z?Þ@€‡ jØœáiÇ•#§"•I|ÿgëˆDÔ²®×( …èHÍÍ„JÀ¦;Š–hÀŽ@À&5 Am-l!Y¡„<Å´~ iA¯]1²HUc£H]¬Mà3yTݨÕi¦(­«0PUÓ<`@À4ȺþQb#+`$…¾ÖèpÞ`ƒT%À÷{ °Ü‚ @(ET=€ì.X%@=pÂ%„R .Bŧµp­F…Õ®XFš6÷“¯^|ˆŒÈ€þ(}á°]}/H®£%K÷]ˆU5éK®eREXF©çyt}ökÎÏ#ß§”j5Ô™Ã9TŸàY‡4:¯½;üv÷”ssIÐíu;cÓÓùC£vßLèýsÅ*¢ßœ¶×*¿õ”ïüî›–ÍnKÞ¼óºØ^Žåå´-ù==wý#n•?Xä÷‘›÷¯ú–e°^^Ìj1´2„æÔêáÚØuÃÐuQ)8÷+\YïÏÑš~&Îïgý{_©ÌgÛh:Éæqù,§t¼Þ‚Íï_|ï%q¯%|”í«ßÿ>•—ʼ•ï5Dæn z(Ѝò³ž‚¬3TÆSMÑ«1§æåÔ»nûŽ,ˆNWArÓ>Y?ûg>žçödS$.eÑ£„^)׎å €é€2Pþ}„g«Ó=õœF&6±gÆ?ؽf–ØÛ¼‰½)¼Œ•î¨løW-"uJ˽`ਖ¡|m”Q‰è4†G³™c$.!2št÷^°)„„(âwUÈB ÆÔý öðñWÒb´Ô»JñaÙ.\Þ=@í æõeƒCs!ØCÎ €f'€(þú-#Š£Ÿ+HDo5!šÌÿøŒñw]Œ½Ö¡Õ€8QBÜ='ñCÀµ‰ï‹˜ëAÀØöuÔ›¯Y6¶Ž¨0‚ýôÑæ[~.=Á~¯¦wl+ù‡'T«}"q7}áÒw|Z|ê%*B(Àv/abQÔ¿X Pï-‹÷0¹ {òq®çn†"eYÑ"ŽË½IÙÜ¢@ë60Vcj´â§ÏØÙ?èe»}BÀA@¯¶Ñ¶ wG Aã/.CˆEÝÓ…w´9Ytzêíè›éBÓ«½|¡¹»ªÿ€†i3sxÊÓ|ÚLÿ'=]ü–¹¿ý».ºç˜ã~³•j‰íç˯=GëK%éÏúˆ7‘˜¶8ËfÎ`sî7Ûûìd¦y÷»\î`ß—¡÷p CºÌÓìAþ|º }gÊÓ,Ù|þ=ù ±ÿbF`ØúSôKM§ûÞöùÌþ;k*¨®‰(¹KáÑ\NÇ "ߨ6©iÁ»Ã×½~zo7“ħ-o XÆ\Æ@^ë Å&•6é§aT#~ƒ#hÒuÓ­@àÁ² å¥ ”Š&,xŒõc &"Á F_Aîc—e[ k›™zôÇ6m`ƒˆ7üXÖ–Á1 €OggS@V&>DKÿèÿÈÿÜÿÊÿ¶ÿ´ÿ¡ÿ’ÿ¹ÿ n„@ñÐ.€î”š ‚™:~dšŸeeúúhÑÀ{våѵ:´‹àU ×µ¸1n8Žï:€Õç´mÛ:s˜ÈKU•t4âš1ö”—ýzù=cÝûÀ[ž¿ŸÛþØ9äÎöª‡/E²PEÞeîÛ'ŸÉ£»éFàµÙg"ŸYúCν\BÂ]5j®,¼Æ~Ÿ2@}fùJ(YÝ·Ð8\ɾó9àŽ!Sòê.¬P=AÁ&7&qX9Ú‹§{žù ïæ9ïÉ^Ÿ|¦{û⥃n®ANí•<äܱZ+±±Øæ¿[†izøÄóøqôô3§ëƒí2;³ü¡Òd^>n³$ÔvBRÄ̘ÑOÛãÿw˜¡™ö~â×½ ëo¶Ï1û‡×Y}$œ„†ýÇßÙ5µË7Ї„œ®¾Õ“UÌi×Üy¸“aÉåÈKøïÿßÛ4ö, ììDY༯¥-6’ÙAÇÌø‚™ôÏèçpWþÃ~7àÇÅqÁ³¹Lqr¼] )çáð6 È?,F(IM«­e‘"l H!x © -,i@š¨M0”¦#ºÀ,qüPzX‚ƒãƒÅu_2C,ÈBñÇ÷u7`.bþ Sì0û$à½V;`Ðä)¢Þ3ó›ekDðéþ²í‹ÎåK ô_Ÿàñ@pPÀ¼_›g +y>­oÍZ©¡´d¶.­ðÙ¾îiû;;Öþaw3œyùKë‡9öA2HÈj~~¢€õþË>¨N¿È¸ÍRµ¦/š™·_MüœTÈ¿” (ɵø†éÎ ø€Är௸ãzkðùÚôÛg[“=(ÏfAÇ¢bƒ|²bÒÇÙng oÑû´Vq™qGlûNÏŸò›h§öò8ê¥CdÖã^Nûâ½…sµ•ïÒ½· §íÃMWb8KwóRÔP4r÷Lu7kW•õ¶;'Û›op*5—€šbšÚœ·.LQД{(ö“÷¸s÷d i\8j×ò¡YD=Ýd#ImЬ¹€[÷TæPZÏtoè “»ÞA“¡5 €ùáÜ›vÞ«’ìÝ9=Ûh'Ö€åö>¾ Âz0%Ç aYÿd\€Œ•~vv"+4+šHøÈð• €ÁfŒŸeµž‰âÂ&Ê` 7$e@6´¡.€(Àþ žÈX_Mæ( ©Ö‚? ‰îðqñÉØæÝ«>48zõ¸ïÇ‹©æ-ØoyÿøfÀ¶X/ÞmFÛúiÖšRA €ÁÛS?Aév™]~?Æøù^?ÊóÁWòáŽÁºIT/O@À‡ÌVã>XäBèÒ—»’ „m¯Àg2Ðm{uê3¹jƶm|AÄÚ§xüy"%ªô#k Û »ãœ:­ñ3{ÙÜ_ócrÞ©¼¡üš-GÎÏá÷ÒPúÓhvïà{QÀ¤kö[¦ó=‡jÑZÀÄj¦Ún–Ú'fZF–rFö×Ïã»§œ‰Ijz;@ûžgKOHt;Ûº§Èmof™ÀºNû¾¦;­,e?5@ = €zö£]¯Ìñ7© ( ÎÙQœðM+;õj*ºH8d=òöÐçÏzNÒô’NЦÏtæþÝ{.Ü-‘@'ðäÛ?~³åEmö‹Oõ¼o~&þÍœasÍL;Kí·pr[*ݲþƒ¡MŒ‘Áöè÷‘ÓÐ#oà_2m ‡‚@Ähž€,šŒ2þ!l (ƒÑ ¬s.L'ù­’Qm¨1 ÔU¾:¹^Üq¬ã…á´qŠ«2{Ì}ædœ¦š1zøp~ó‡×G¦¼€HŒ“x×^}%À3ƒ3p»uÚ‰³ØfÔGýhC¥5A@ÇzóÝ/mlvçœÆùõ+ÐL@»k™PÞ«¯ªÄŸ®;ô®@ѰæD3Áw+›*È^3òrnWîУ¡r²åµñôŠQ¦ x|ðiêÀ¤ãû;îð™LȿѸ9ÂKøS€ð圯hÔ†;›|%¼€üäŸëOî»*yu›ÜoG¤!°-;ë–oûLUú ÙQEòÀ@J—‡÷fÕ;#R¼ÝóçßYÝ—½XÁÈ4³é~H6J¶m˜ÃN ¡£•/kæúSÑçÙÉ)ûŸ…µr6þ§IS(‹Été:wÿd]#d¼õ~·PŸj×{óÿÕ¹¸˜¦{ˆ¦KúYçóäà# xêl“Ïç ¿÷‘ D‡̎‡9MÍ4 $Cñ}°˜FÐÔK‹@ £¯uË Š1€ÕØmC$Ò-DM²S¡n0ä`!†_€Ê@ 1‚ÒÐB•‚ÖL0±Þ*îè(vŸlV„ÐÒ"«ˆ–óàãú.x¾o¦Ýàø›£€×Ç!G7?M7ØÄ{—Ìx€>µÜ$´±1²¶Ã*ƒ¦… €B€àìÿêí 2Œ “⩸ó¹Âo9·wᆠ€H64@ BÁq.CH³FÞ…\üÌ\£Æ@ œÛà)¥ä´f£î§AÀÀO#:š³Ê]¡HHÎ6GŒJÔtphd¥o (êß„²µ¤êoñÌë&èÊÒG´{ªëoªÂ­`‘pÆntf@ÞH½ÊìI ÝüÿeD/­<[LÉгúYÕtÑ”ëß}90‘ääÐ=d­8ŽÌ@4É÷Ù4×—É*'ìªG’;f²Ç?™OcÀ £÷ É«XæÓ›˜C£eº†ì¡úÉ"ÊÂÓÅ ðÓôd5‹Ecr «óU%P³ÖΪ¦Û¼)h€6…Üúm‘6Wh,zHd%·ÛMC½T% .hçQÓHü3Ô§W0¨CJ€ŒÑ»Œ‰1ŒWà @ õ’F ¨ H0ž*¹½Nmv™ÞR«k¢&­‰àYžUFàè}òYÔà}‰‰Ê)pc,¼ÅÀ"×¢'8ý8qgHÌᛵÃÌ(I …a¨=óºï^ÇÙ˜2ø\ÀYßàoãûûÖ·:׆P`{{ór› @° WiÉ¡çñ™dÌÃÝÁ!d/xs"| ŒÜîu–ÁS2Ímz7ćE"z¥± @qÕÓê¨n1ªDÓø°3{|¸œ ´Óf¾ÐR–É€௸y=?µ€UÖÉç>û Ì §¡($d¯íd9ÙÖð.-Ϭg†éGÀöVÕ½dƒL˜Äô Ñ!稔d]F´t™E®Ú‡çKÀ _ö$]ugd÷9ýù ®: Ð$+äÕ„ÙÓ•þx“t5Áô%Î5t™ ø~çî¢pW¯ÆSu¹+'4 »‹Îêõ¾f7Ýè†ýØ ÕkzÒ@ìì`|zÿD Phà±÷ÀˆîS*‘A ÃgÓ©€pž)vÁ­77fÅ-Ç»™uÄ%JãB’‰áø¨^C'ž]9ôdþ–L^#eÙZ'¸6¼ž^ÌÀqX_¤7û€lJÀ‚ÜfÒáC¤ê’$aC à>=݇ú&½ÄËíݫ׳ßí¿ö]üh§±Nõ“[$ ÀýÕ;€çrSËäàuCû4_̱óL=ŠV¡ r@lr½â¨ÌÊ#Óq›‰Q«9@ùÚÏ.ü{ð»ÇëÖÖŒsäç^vÀ¬Ê€ÏfVS@> €jÊ2c68Pºá¦¿^@£O@ÇÇ–åºfe¦·b30tÆ{?‘ã" áû<Û—áàsã@ö€^YÿnC‘ã§kØÝ@féÓ<³Ï›¹x€œ-mðŸé”FÀŽâž®³/@–êÚ/›În¦š€i‚lŠdº_®æ·{ËI”€Œ“Ðp'Yü„ŸvŸ7Nÿ¶—q'“ß; p·E#æþ÷½óÇñxé­é @0*89Ù3Ý ½¥|µBƒ7ËìKB..Út=>[óÇ"ÄEjøhµÓÌ¢u“‡âoר}ˆ€3†Òû[«ƒÆZZ<Àŵåè‚u;Öq{Ç»ßåõ=`UÑ´pŒtl6Tºú8Ûù¡ï6¿†ìóÕüJ˜Gw?Z를cþAN_…j`C7ҼϠ9®¶Á“ÝP$J³ˆ‚Œ6D &¸Ã€_š9“GM¯GÏ]šðd¼÷+¤xÓŠ÷™âÎÏ@Að!K@ýMøAÞÚ{n¬8`iþlËI›¥”@s€½ÖÈfO½IÖݶn»J¨ýÐHËǧ}NŸÍ¤VhäÇæ]t¬×–ÿ— :ìnû“wh%†C¯\?Ùµ€æ–›ñŠžÜË÷i æ({ùÞ¡ƒ7È8@ÀØøbª²š|òPÑ@Ìó,ý„Yé²èfÝïÂ0Ÿÿ•µ{ãñgÆž7§ý+|GÀ`ŽÖDncÉ-N@—3ã~š©¬f Ò0.¡BÀÚ€¼þñVù…öåÓúÒ.¯ñn*›“e°ë¦ƒÃ>Ó¼q ¦¯còxs•™1L–­àL¢–ßçCn8߯ºãŒIìÓqÍhZý¸Çê-3—áØ¸Îळä.÷cí<þþkgž3‹Ñ#æ‰í÷›\³Ö%”Ô“‘Œˆ£­6oÈ%ß7­Ý—”RãÕŸŸÍm·íººð¼gî2 „¢!ôBuóF»¿u0M|^Æ¥P(Åï/?ÿ˜ìŠVQ €T­ß~×-€ÐlŽæJÙJxî©g4mb/íóÞŠ{ׯÛG¬inûÓÇÌl1}Èê™O>è\ANþ4† ‡f„„–õïHfdBQuCü»øžð‘màŠ3o`3P|¡—ñƒ@InETU0ß: óüʆÃ8÷bë½ê“€2e‹²âŸüj†]ƒÅVàýÎ;£¦¡ð.Ⱥ Ài¼b‡Ù+àÙØ¿’ªpœjéå}µv*ujï•ý¶‹¬á¿M ¦ ñ:¡Óîç)à[«WDš9ý…{¥­9QÍb¸Û-BœþŸ®©®ì,($ûÒßw E”¨@ýæZ¤Z…Ã`õ9ñÍѦîÙ†•ÅSØß}t²G"§¤#°UÆï9¡ÙO­ažxšÊû$¹lÂ$$æÞùRqŸÔtRÆ-ålDøÍL t:‘¬=Û>orŒ¡K$ŸX»H!½ýÙ£Ó²y!04s/¹²UZ~/%«Ú.D‰ú+õQŸ¨EÄå ‹_¦i”ˆ M+HOQ\t -ÒÔñ‡v AË”.)«mö¯¥T‰Hûç—Béæãß]Ê´(á!Ïí}³å²S‰·Õ¿}]:?ﳦg!Rœè.fuUU€Š(àŒÐ"X¯ “0¶F´@¡¢XX”NIT¶b¹i«Ñ'q†be ,^€–…áÂp@N8ß O¶ÚØÓÈyû ÃòòÝ#=.ïçåx}Nª¸ª¨b ƒ——¦¨:vèv;d‘W-Æ>¤™Úd>©êi°–öGºRÝ–6­µÛïe‘K¹ÎÇ—)ô¾ÈÄ„ƒ˜NÒi}›èû4ÿqæ³Ù>Ú–欅RZ ýz’øl0R™„Ùb-Æ‚¢-,%dä»tŽý_¼RÑEÁzãrOµ>ÑIÛ©ðI¼ðÖ/‹£$£„µ9{ùÐÞªZKJøÏ³Ò—JŒ d%ŠMÔ³¥Z"ÄS4bDm@±®ÔRá’kÞ\ƒy¨S¿I[’W†ñøí7Ú…ÌLX ëׯj˵8ÔÀÔF—÷¡–(Ê2%Ê×m²ï ¯~™4ß¡Øäbù ¬s>”™¶¸{•"ƒm•Î C×çyåú“öä…Àۣݫã¢öºîë¡—èVÔR'wY~—޲C†âI¡J¨×†FA”Ž´8%“•{54\2õÉ3¤…Áp—›N-ÙF©Ràšw·®º…'„æe.Ó{Ûµï£A=Üý|Oh‚ìjº/fmEPW«EÇ¥F7kÝÕè.ì@-BYÀÊUÔE…  ÀôjQ‚¦œ@TÊÍR˜œÊNY¾Ë+CA `Û—äð!gK&5òAN«’®ý8è3gÑkÎY,Ó•¬ôð§K´Y¹´—ÈK=-"fMl6’]ßçܶá&Š‚@ñLÆ~lWg-Õ‡*Æ”·å!­·:í• "£­DRìÂýáªV3ËZweQFí5{¬uÓØžç5”÷?ª7ço\fê·wæ²aóçé¶Ö÷Ùò=?½œ<^ù&Ö¼ Z Æì@ƒk· f)µƒ†…Þà’ÁÅÚ¶‰µÞ¯YUéjµÈ$Y—&"D"qбs±¶3Js Ç—dlË#Öà-Ÿr§ï9¾÷šÙÓ¦6·¢#Šäý›êÎK~Z{ë {úœE]_±›¤% ·žŒÞF‡Äí“1<”GëM 7™!B6C¨¨@Wâ‹Ýf âð€5ã¶bb·£•RaDhÔ®îJíYk´2=Úåªh²>»Ý8ïÍåvŸâÉž<Ÿ*M–®ºøÄ& øÿæfss¶3"ïÊÉꦡë@Ï—Ÿ7Z÷aßç>sçèæ­i’tNS•­¿” E÷ ÕŸ‡Ivï#§8¦b,Ðìp ’„‚váSB¸€* ™æŽ>½}Ï«q7CS"N¥+AOoù1qáæNtíS“}Ç [a>¸G5&lWû9;›ÎÄÜßEîÔØSõ„5ï«íØO A<—Ç_wSÊ¢K#䶤y8¤¦Q…‹$}‰ãg^Áê9VæÝÎ#5Hô_i¦|Øl¯e,D„tÇÖK±agí bq’áþZûúÝ*ÛÐð¹Û§\D}±üðiw¹l𡳲ÉýîïücùÝU5g²«y ›©.³%’£ággF2 ÔÿξYèýsß"ÂU$¼4ªnrëšàÞ¬Á2ã¨ß:óž—½1 ‘˜í5‡„=•tBQ}~Eûy²…f FëÅ“Iæ8^raM䢨ö¦‹ùúñù±Ig"Àyûxz¿•KNOU,¿ìõ€œzO,0¼KÀ60úl””qc0œ);¶\7à¦ä@Ôyj-D*éUÈ&i@H–‘!ݰ°±19P¢m €F. !þ|M¼Eâ7â›==”`L´´~ܽ‡U˜@ó/va 7:uôŽÊ^¦ð–ZÅ€]g¸JðZÏà£l~óI¶ŽúÌj!-¢‚@„Û& “êa·Q»`Àu€Ê¾Ë«imܯ“;•Ṳ́Dîþ^g?Ú³÷ùÊmG¢ÈïqY­A.¨^¼ØA®ßœnrn›f”Ÿ÷þÎõŠ9ªÕ¢‘É¥Üí¨*QEOÓžv¢ØUT¯)LÌidzï/û’yìËtÏ~—Ï¢¥éÈz«§œ×sâ•æý“3ÙqÞÚ$bQn.΃ÜDßÇ¡7.’dçÚuÖzÛØ2"eƒ`Ûës¢‡r‹ý?õ(œ™©K_xf^ptö¶¹.VãS衹¾ÑCs˜Jj"LÑï_€Œ’h:n5 ›¦vBåt35¿“{³+^²€ÊÊkC33yxô³¶_8!3 =pdÈ·(¿æ]M®þàÞÙÃU¸™›®®HŠ4%ƒ_ Ä ¢˜Ö‹°ÊÐ-  °(Q Ò#¹æ'… ÌÚD°°å¨¾êlY° ü Èps`–%Yb €U¶¬©‹úZãÖhóІJÞËeJ °æ«ÍV©ø }Ó(Öñªc\ð’­(ÆF< \ ~s[ç6¬ÉÚÖÌTÝW HÙžft[#æzW2®à[[ãÛšÍ8ôuòë–‰µ‘¯e‰á×Ü=¦G`àöÿ– K× &`{Ç *¨•)€ ð÷³pÄ ê v_‡9 ài|^((‡ö]Cƒ÷~ïNKMœ¦I)ü£èaðàͶ•`[s}×É‘©êM¤~lìcO·!¿‹ôçWöôä>yÅôöPÛöRB!S™Öã-ðU-„}>wžI7¤ÉèÍÍÝnëÓ÷W£M%É KN5ÙKŸÁL~Ò*ÑL! (çó3M¸r}£r ‚&ª¢ŽÕxøÇ™’`(j²šÿÉ©~Þñô²©b€¨ì}ÿ<ÌÏ_Î(ŠQ7Àây†êXôY‡™nXõc/ïž·*³‡†éÑñrN¬4|h7 hµ}p! @ È ¥lÑø" ´ ø³6`Æ÷R €¿®Hë:K¯mA¬»>É€ì¬Mƒ¨)žËX)g%¢õÛdLoF’ïéœR-"W+S+Þ@c<šöä>à¡t5œC…×8€Ï³Î¼¾Ù­ÈB©š1“2‘Õí_ѱùøï¼Ã_kØã àØ¾9-F•V‡ãf`ÆÊÖ„ò}2áü;êý/t;4ŠÈ5uüx%Pw=Y|PµÉÖŸõŒéé™ÁðJ dxž:e¸R‚8ÊÈ ÍñtÁu›ê4ðTÖN­LX˜O¦áeá5‡P‰†ÈWék³n2ˆËÁkÑ›·}¾Ö}USëôÏš[ó¶œgS™Õû›U óÞû/ì1$‘d×¼¼Õ €ŸÊb¦‹ž2¸ç¬”ÙïÞÿ3ÆýÁð|Þ††½!o¹)Ámˆˆ$ˆ~áí*ßxwœI§P“w>s~çí&fØ P])ˆ ?»BÎw"÷ÀÕO³sWx3>†íJOÀ›ób?A•öò3üÙ’…ào鮋=OH$§èl®K%[Ø~Á€ø ø}# Iª³@`0~_.u0ÀÌÁ¨þ?Ló؆B@ žÌÝ„ÒÒ™Àïuö-°ÕFÜ“5=dmqÑÂçlWÂËêgEµl´fVõª$ D½º;gÕ£»ÕóW$®:„rõúÒzË"/çXÉ•/é§›/ð$ë%ø‚+2àÍûZn ?ÆÊ¢þ”Лý’ f/ôüÐÚvËkWù€ut¿LƒBªÏàö—v`žD32@~T2)tˆ¿m8p:Ò›³@IEÅp®†rpï¤2Ò ±OO¿è†`؃|‰ýt ȹ~7Ãì»î öpí¢ò¦•Üø¼‰À‚2•üw¾ œí0ùG‘4Ó1÷U€üN½Yîl¨)÷ø7“ð¹O¿g˜¾¬ùDéì°3Ó‡dìs|Žúð;¶è û@õhek—3:g&ßΜ' ›!éÍÝ¯Š§gÙq=éäñð§–5¯÷PœaX×à!ÐÛ×€KÉv_mȯ0ÆöÔÆ‚x6ÀPFVÄ ¼DÔˆB ¢øž1²‰E»á4ßÔþBÄ}_Ô1¡)tÜ=ãœÖ€(Î^ü”îÏäq=!Ò ð,&û°˜•_Gàf1pÂëbœ}ÒlÖ}‹Ñˆ¥h˜Ñ2•Úh®ÞS»ÛØ%Aîýå~–ßÒzÎW¨y,–çÛÎ…ò5éUEÛÔ¨@ Bo®¶`Þèƒôœ‚Ïuõ¦×©”õdg¹y~ACÍQoþs[¼9§t•RZA C<˜@Ϫ哮x-h…öãS©M¯ušV̓‘¬·CͲvÜ*s߇x š}Ï[ƒ€Û]òóüt‚3‹AT=yøöóÎýÈÛÖÈËë>ÄìÌ}®COggS@œ&f!ÈW¢ÿ•ÿÿ‚ÿ—KLNTPS?CGCGE>^`]ÿ¾ÿ­ÿ Œúgkžþ™¶ ÕëÏ@N±uŠgg…0ÌßטÖ3äÿ»MO~É÷ël2î8áN ñ¡ÍïÞõcÓ¾3™ÝpCiá­è¤'" ``=ÂýÁÔÔðÝÕ0Ø5¶ éeç—‹<Ì õ¬Ëèûñ­£âdÔay.Y•X!ûDógF¦0À@PPË+ *!Š€‚Ø ´!¾…4 ÞÛÝÍ6³@2Ál¶É=´ fx–¦”5ŠŒCšpo—äFÝ€§"¨?§cOg ¼Öøsq‡±oõ£mgU*y(L‚¼än|-'í½‡š   .mgN¾&Ûêq³ZÆó¯¶­ÔÍ%“ûïVÒ’®…¾zTÒd_ì`Ûy·x¨Z×i¡Æ* ×_>Õ0¯.5oáÎñqëÊ­k …˜TV½ÁúGËŠ_wåÝ·`Pwš¡Ë×ËìNòNº³¸G=ºÂ«o±®ÏK™asiuˆžåãOõpÌÙ'T9+a€þiÖ“'Aƒ£›z†¡aWmÎtÿžïR"^E #¹‘{ÿ¢—& 3ÙUw"˜¢³@ $ËÖ‰¡Á¼ÜÜÙÅ©útÓÃ`U®I7ŒÛSo ÔþÍ58‡Z6@Ñ /»(Îaã$j\ EÞ4“; £?o›äòß²GOdÓÀMú- '+ÏÛ´ùW~5.›½FzI ÀIö€&4Å…³)lÔ’*ÞÛ=Ì™968ïj½ÍÞ>€gQç³CÒ3GÝxœèÀQ‹í%þöÅ=æÃOokDÔJIêPé#ÏuÓïínSl$à ;^_ÿ´Øs{‹× ©:ÈFì¿çTŠïþ½Œ‚‡lûu\ä d)µç: äúhÀÑõPäU‘ÅJïeoÑõQX&éß>>ë`NÕ¥OsÈ!¼¥Ç‰‚QYvlÕeÍÀ ôµxD´qè,~3wZ²±2=ïV÷¦»öˆ‰ID÷õ¢Ã'ÜÉ{âì)€‡ö=²c$CÇóen™}dÃ/¿öm'¦3ëÉCsš“0ßç$ó-ÄDæv ˆf&‰qïÅI€Ó9E„C÷_×$A>O6˜fšÈQ™M·(ƒé„3¹{|Öä"Àr|Ÿ´:t>? Ÿ``ÏÏ4ùMj³fÔà¹óªe10ßl€¦ßiÀ\1°3ݪxJx ¦<@x:&”þÛÝÆ{j ¦ ×[íï©6±*&x|f²P·ÌŒ¡ð¶'lÉìlšœ p=¶8g{òÃÿÀXû mXVe;€ê=+Œo×ÕÒ¶än´x}³ÆΓ¦ÙŒ}iA ²>ܬ6 ÇfíQåƒCGïä”)T'Èê‹'À_©z?œL§ÑXó¼T'OdëÞÖQP§XeëjðŠ©œbOæ¡-  ^ºÙ„9OéìÀJ<³Ç ‡ô$ÿ^¨»15]Öœ¹ÍnIæÕ¿žwH5 ç~¾ q/L0±ÏJÑ96O§1κ߼nv«m(fNòÓ1À.Tn:˜fü;_D3•ã¾Ý6væÚk2©hèÝï<~˜«/Ï@NÁÃ;. ¡I m ®z— ³ü·ÃÙ´¿»æÒ¸¼HÌ4pû!òù+Ùðv@\S qÎP:³Ð\…*Y›ïj$5foÚÿýQ¬ú£^™*öÚÅ=Õ YuÔ»®j‹x…h,Š­UàðóÔ4‹—§èŸÄõƒžüue5?nœ€±­5aQ­¡A¹“ ”Œ¬ô%è`†sÑ›}r·Óg–|ÍÑêÑào µõ‚Cæ˜0ð©‚¼¬­”ŽÐ^DZÒY™[ÓÜØÔ Óf]Ö˜ƒÕª|,xÇ>ÚËSoœ™´ýbëžm}L·v$Ö;h‚P#C~jʘâ¼ê&<ÚϳÜ)y,Æß^[iQ4qVs‘³ž†W_ÿNvU•'Øzøü)e¢¥VŽ‹Њ¾“»‹Ó]C'˜™šSMNó€WÈêžµÐÔ_‰±?ZÒËÍãɦ²êêÔE³ûg£}öŠfê#ÃNOÆ 7îÙ¾>ßdÒ½Ã=åÙ 0S“ oQ¬¹©?cüÊ]¹éHÁtœ@Q¨¦pßYYÕÔH eme¾û>X@ݛְ‰Û”ádÝÝöàŒjƒ* †Uµ:’ˆ¡  ©ð<Œ’þÓúž–„€„zåªíìÑ·{Ù©EÆÁÌGâü8Œ5pƒ2aa÷Ùeõ)d4£Ìä¦÷,¤X®YTCM´Ï}úwö~Ï6¹VÕÅ^éœ}ò~­ŒfÍÞnßö\LWìœ"Ï7ˆó§÷ïM~>¯ˆ0Δ&|§MÝ»ÖO0Å׃…Ë¡º ½üsÝÞõ•|Ï!`óÊgAäÀe | ¯×⼆ãMÚÚu&:u^ëi_îïr~cx:=û²›¸:^5ëÈ ¯ÏÏ”k´NP„KÝ¿gËöÊ×1.Ö9.¶¦^¡J‚‘ïÔ~×Ãð4ªBñíK¯v5<Œ€…ã»ëÄ w3™›0L ÕÖ:ËÄÑ­™{šúçõµ}îÇ­_IX½WêÂl©Ùw»²†ÆU¤›BV¥ySì> mTZàÜŠ{ÔºéÐæ7v뜱!ãÐâó´%L†@#v µG£Ëu²R½,ÇâÑË)㢦*Ûz…Y¤4¢)Ú…`­­Zù¯%[/Fáb|´c‹2îÌrcÕF©Ê×XÈŒµº¨µbŠÓ¸õtO½8È.¯Èq]Î’›^§uDzæE=!n1ÛÝ„a%!D§¥¢›Q´b[LÀbS[ߎcCŠ…Ö)(è¡ Ôfù Z¨ÜqvJ²4ªÜ[ï£V!±%&`Ü—§QÑ@‰Ô§Â1 –„ЄP‚Ð C,-xoN¶ûÁ—™Ú|ÄFÙ*'°mRÁ€ ¨«ã·Ÿyz!+8ÅŒ;Ö€Æ`ÉfɨCǽ„–¡«)p¬„‰­+ Œm:éuÏä‚yãöæz•í§ÞåòÌKÕÅlnãœ@ ›b®!a¯EG-o| +w¨Øp^bj-ÁÊ’ã í\ÀЬ„CÓ Ôa×Årï¬j‘*ZVQ8^'Õ›Y{Â4åØ/€%ÆÜè¶AôÚïiïš92…ÒfÝQku­È’” _#µÛ°tüÚ6Æì~Y•mu‡ãöè[Õj™¦ÛT'¯?€§$ nÊ /Ûµ¾çªsDïÊìÕu|­ X–Põ.H(5 ÂÜį'ñädf½ƒ¦Ã‚s¥JÅΔP î1žBêÒüWƽ9?|J¢À%Üú4¬½TÚˆ À‹Yë“SèÙîl zůL$)ÌZYd–ñéaæ«PÔãõEó1Ýõy̶–#pÏx {¯dUÛŒ ‰º X,!kÈ¡Ø*À¯ٕ·Aë¡ÄN Q˜†éÜ\¸Â&s&ø ¥³X–~ ‘Ôq5°ËTKµPúcZÍ©¯?_ºSçüí ,ÏQ (­ßßED ñØŽ±=ÿõÝ;\×u¯ëÿ³ßwoû_ÌBYj†&¶BõŒá‚ Cí^9z¾’ÈiE)À=ÓO Õ¬U¤üõ¯%¤ÐL;²=±yëu-koÛ-Æá·jµ´é¯÷幯k­çø×þi=à}Ó÷1NxÓ¶o¿óá9™@ªäf*¿WÉÀ²ÏŠ0ålÙ—LPlS©ºI>½V*(Ú˜Ñ(SW—RªO`6WËWùÜ—¬WQ²ôY9r)sݘbiÊYOKo‡xyñkÖ"Û…©?ädŠÇ–:‹ÕÞµ =@½‚!¾çÖ˜vú‹Ónž<¥¯+Síypa˜M:‡o[ë4ÓP7²ÖXN‹·=ÍÙr½x:jaàŒÐ0–\F“˜œ¿ß³½†F Û my™—ÀæöL{’E‰©b’_ÓÚ*푵ÉÒâ@PΚ‚^Y¬¸ÀA@"œíÊʲÖo€%£ª©'áI¦ç^€`ÇQU³€?=·ŽE˜£¼éß•¢§+´·z®Ñ;¤IùÀ‘,ÅÛËÞÔÿ\S*°Š™b©Ô›ù¯ëŒL˜ŽlÂj+kî=Z{œý.„KµU77š¢z.fÊ}gYVƸ:­×] Y¸|g:£ªv®¤G°Ènf^^3ÍÐ4œõ’gòp±Le r—ŠŸ6'8£NÅ 9ô’èuÇŒlï_¨I‚¾eaîîY wè7¦ªã¬ÆÃ¬ƒN ŽX¬&Uã ˆÜj‹0€•±8*©…UQ2¾NÉŠ´%$ãPÀí¶!âÍû°Gw0OggSÉ&ŽQlF«ÿœÿŸÿÿ|ÿnÿrÿ€ÿkÿwMWOQMb{fõ<Ô®µ™¨¬m.¦A“Ðä+äHÓêu¢I€Ndôõ¶J¯&5 IOzê"5 Õ½8`ÏMC‘ì~L_L½¶‚]˜Þý^¿wqîy â8Ä·ÃîÝûɼËáÞ͘çªo‰4‹ù›ø7‰AVŠ|UhmŒÀeˆqu($Àx»¦€îÖ2@€±b@îdž§Ò…Øà¾*k c ¤I^œ]ýœÕLl]K_ŒEÁ–ï¡ý3²¼&ȾNù$çÁ[ïŽN¹ºáòm~´íhÃTƒe[ ¼ÖOF}îžM¼Å:¶ƒ•CvF3œ7>¸òœM­˜kKÈxkcrëÉõO­<9$•ÿ;–¬çý«(fŒ¶4$L„¦ QºV÷“’ ÷N¾ŠG˜§²žslÎtðYÒÑS L·èÌ$’I]<}`Ou~÷ÐØ5CFÓü{;®NfxŽì=ë½Õn¢§ô3­¾ßxÄÏ.v†Ì}w}þ4Yœê¼§G3=}U¿] Ü“Î{Ÿœi¦'i ¿· ÙSCzÆûAëñlè”fïâàó·ÜA¶0Ù;צ«‚®îúÄûÞé^Ï@“ SȤäk‘¼`ˆì ÝÓ³t"o¶ˆµtŸ=Ü“ë‡Í lpcÉ=²¼CÒtÿ –ØTo @’ÀI3Mþ‹,²zòÉ[Ãåo5“pæòI'ÌpFcû»ÅdëB»!ªu:ÒPùÀÑî¬BÓæÕ ý4ß©©Š`‚}:;f9_.÷gd{(r» Ôˆþè%ƒ×ÿøomÝœÙ>öí1wó$+5ÔI:g§ïh:‡Œ/™<´»3äxÌÄÇÏš=díe8 Ÿ=Ãtôó¸ºï¦!³šb>Íôpuå?}=w°jTEÖï×½óÚn! w†‚lG“iUÁç§4M ì·L:¶ýíú™e*ã¨È‚:;æC¸ŒºMyXŒYà<æc@Â!©øË¯îHÄ%ÂF†+0†‹ó%Áœ04D¢£Œ„”"€*žËé£=û¤@ ¯YïS_ €O˜&âQj"2ãbŒv šüpsÎø °Í}Îim´‘™Ñ‹H€”¿›<®aÞÿÛ”•ðïsœ9P $œˆx‡Ä?Rñl%G}sŽ/œ2T1Y}³…=w{¹†–㋘¸~œQUˆ-JÐ]è×²Ê JоXˆS eCÔÙçà %À¡Í̵ÀÜï…üÌ|þ„„¯é€³…žÌmD¶7n)‹í£÷œ—að¡ÞÏÂFv²EGŽ/º‰†ðyû[{oçY[ I¥Äh’úá¸óëÚwÍ7ßûžmf×ÀäÎŒ±ëÓÁ5‡©›lÖz:§¦’<êU8ëôçtýt%ôUÓªuÝ}®éJ UÌ™!+³Íi?ì÷ 45 &w}.ðhêw²xûxºÅdd}äQï“÷åŒOØ÷ìTvÒk¥Ên-g$0˜üXnŒËà IØÐ=І¤ j`ò—È8žËÄ+ßjôhàš›­ô‘u_4àÃÉÒÛF!ŠŒê($Ò.ßz=:ɇ˜ç û´ËÆ‚·¢Ù枯­Ža ¥˜ ·våvÌͧ9ã•¢iYM¢³ž(}Õ?¡ªîúµ„eû©å¹$(é1j#É4›ùBÍÀ{Õ˜•;Û u¾Ó«å ˜UC°mU¨q‡ VßÙ–Ãq@b’]¹w2k×M[áój&&éè ¡ŽêËïU";É|ÉSÝÎLrS@òÆ9Ý N¡ó&EÃñÍÀÕÀÙÏ€sr–š=íì>¨=ýü¹Š|(¦ûÀP™\±ÆÍþMÒxê„ÏÔœ]šž¥gǰlg1ÐÕ4d-;‡×˜¬¤h>µï+o§þÆÌdzýtÑCÒ ÓÖPNÃC‹RÇd s`Èj á‘Ù¦áô3¬#+GóM)"¼d¦Ó4Y›,±`ÄÀé~̽úWN/ÒªàýÍ®úžµØÀÃL S; ìgžx¦Å›VØéÆ äs1­6Ú0šb§4Þ¬¦ïò9”ìûdÈõ±‘C˜«§ÊÝûmÇíuOIUñ—çûæQ ˜q†B”^tÝÔT—ïcܲ{Ä3VF3ák^µäá¿t‰èÓ¡ xê¬¸×æ)†ÔÖè& è—öÞ‰<"èˆ÷z7äý­ƒvuÝàIö¹yÞ¢>@ŸÑÒ̯Ü"#¡#çëó¥w»NÂ…c>pëœéÎðgñÖ€³‹Kƒ!ÿçcæzø2e6ùàœ {39dCÿ›žÝÌÇOR=/É1Ôï}~Ø‹ä Mý“[Ï߃'ɰ?.ò]ŸN<Ù}ˆè$©b²˜kzÍæôž¹< ˆ@äÊn†ö|€ŸžÁm_Ù¹C@¼²Áâ×Y»XÁ û{;„Æuš¥2…wz žË=ô{:-H—bÇ»Š5죽çbÕÆ§gaÚ½çF¸í©ð àg±oûí´Ö[h™¦v€05:^ÅÚR "Wb@¯ƒìÓæPQ›¦é½ïÛtbÙK5³uÈ=(6®üƒ†`ãbÕã[ç¯Ò‡½Ã[™ì&m·z'éü–{µ॥eSÜâ1ª*‡àà‘Ô8Z¸èÑ-HOsTu êð-£](n»»×{‰OM5Å ‹ÀãåRTeý3¯¦‰; í‘M ð$d¿÷§ªªo†F‡’¾ôÎà¬:§z˜ù9E}²[“0C&”¹0/éérûǰ·³LdÉ€½O?èq±©Æ=ÃM„Û¹{z.Š÷‡ÖétOu6®jÄÐù†v÷¼=°0?"ºQšœeHy;ÄLêVðDªËU5ÐwÑaŠÜÍ•Nê¶ÏÏ7çáÜ557ã¥7Ç4E<€]B`‰r~Bå I¬M·@@Aåµ(~ÌÝÛ¯œ'Á°ßìä?³¯ÆjŽNó‹ZÐųŸÆxÌ[og‰ðM‚æÜ’Í·Ö6ÂLR”0g–áìâì}‚Õ?cÿL޹.ï:§?#9Œ«5ïûßÙëi!³²G/;Ö[qÉnwç“OÊ]®^ýLô—µ'@(K¥% õ»¡… )÷™ D¶¡–O¬.ÊïëìÞâÒìÃ>dT.€èÿÿ(ø©?VD(åèÓÐ ÇéõBtv^z:NÓɹ²í†i€¾JzÈ.¨s͹#²U‰²hó­ö¡³›ò^âëâLéî›2ß4ÓTRÕLÝÏPƒ3×Üç¼?"Q²öœùW¦«5½€]|I¨†NL«húmzJ&3×’:–‡üŸS{û?Lüs‹©Š=qÂäù~çÓ1Ìy«?ÀÕôÛ½(>zwµq¢ØÓ˜†¥òÒ@h×ûN©U„MºÙ`5 $ä×ûËMåW8ÚànÅ:ñ•¾<Ç1†ÃàÚLNds$Y+l5S••œé*¤à*ØžvP7¸,‡;L9Çœ!TÖ»Üqâ/Ü`DZüå3Ó ýêÒ¶ :r*÷âìiÝ/)Í ÌOÏî+O'2Ë£ÂtáðS’æàóº:"QO°ZqbU}ƒ¨°9†õ¤d LMÂÄõž!ϱ6œyîìm ñÛ:„€rÙ> *žŸajŸ>ó°d‘8“üi ®Õù›<¬~}y_”«ÄvìªÝ}¹™k}²¢ÏfêÍžÊÝ}®HÒM¦?¥-’CçÞ4ý×ÍÛØðj})Ù¾éŽyb–p“~F$ ÀÀD‡ì{\=?ï†ÞT¢iàêQ Šê!“Jæv}Ô9¬™úëaZ¹š1 +ýž}s ” ùIÁP“qU«üì>|y ­? –$Y"Éà}Û„e³ÛYÔm)} Àú^P´~Í‘Â4Ÿ¨ïº>½‚wVÖs&s¬`¥¨€ºlþ#IMúhÜ»Ÿïê@QÖÜÉuλ$öÉÿÙm¯¹îçr¦²Òp»00Ö$¡|CÌRÃtõÅÁ}ãÖšî ËkQ·ú´<Ä •ŒÀ0èÙ&ŸEª'ëßAoÿi3/ÿäþè_ʾtÝÅy–2þ<|z‹ ¤~×Õng–(ÖEÂVÜvû¡–*,Z«abÇ Ca¼Ÿž.æ5a¢Ǹ犖å¼6Ú×—yY*e¹8+ô¸Râ:Ak5SµC‚D¢“.±j­µFEk[öÑKäZkY‚#àj¥ÑàÅ1ä>ëæÖŠÞût­  NP“ûø•¸èúXöZ~ªh$¨µšJ¥L[lEgohjE‡¢(²ÁwÞ¶N‹ÙËÍZÕ6þ¯ìr]YAàLµTn@V`ïÍÕ(Ç[ °š^%¡,k5]U4(ª­hEªu°±VpEÖ z@LH'Ñ¢¢K[µC‡A`qÈ(Ü>vË3cx⬓Êvd;9 BÙÎO·Ë2…Vi.‰~éu™Tò4&£AìÖJ-£u½NÏŸ–£«k$ë7~.Ïjv¯ù¢²+COÑy. [csej,êV-™üÚ"O^OggSÀç&‘üýœ9cÿ§ÿ©ÿÅÿõÿìÿÿ ÿÿÿÿÿìR‘À6%0Ø„]*ÁFd„Ч‰ÉyèLÛt1Àx]óïñ\®Kî¯8F‘³ŒE¡·¨÷¾üÞ>fõüâÏ>”T{¢(Ÿ šçžãÖ³ëûþûÝYÈ(•köªÃ‰nB©µ"z‹…"Ñ´±ZÀ „N\XÔˆþo€®ë¿þöZ÷œ½ÏU 6áÙuŒŽSQ]ÚIÙåV™BÌÈàæ‚|îéÄöë¹nâ0ýxÙ­VíŠC“{{Ç_~¾²«~J}•̉uš§e”Ì ‘eEGK.¿ÚøtcWþò‹\/jkoǯa6lÞ.˜¹ë´ Ó‰•c‰;yº‰Iñs08¡’},âÓþ7~Xß!Ãw‡ý÷˜ûk4ûGmåÜÔ%ûàÆÍ¾%M˜«’SÚÿ§É´­v¡¨GD«K]rât– eLmf´HPê<ÙT>õ¤iÂñbÖñt³g JÄPðmeâÉ’ò°Íèî#pê»&T${Ö«>L30¥ 8ÑSQ³a赇®%{ˆŸjfâí"r`1MR¹xÖ@•DMå”"²É¡ U´”"çºiʃLÒA JŠYoIqàÑZd€*« ӛȮ¡_B"OàÃ@ä˜0Š „Œ„cS&{ e¡„¥%d»@,–Y!o,.ŒObÀ…€ƒ]( ÀÙ`@"A"@`0Æ,ueP"DvhƒÀTÍ$b €@MÉ 1F–…EÄ`À€™0¿ZoÜ J>¬íIƒÊ ¨B/¸šœ‡ñh¾Íl)ÃÛtôÖ®·µ6=sëz Î,Zò¶Åë€Ø×á“Ù1ÖI{ZG4ûP³nW†ë3ëÅrpõï0yýõnæpù¬þaû¼Í6Nwã×ßVæ´ј‘W0gKú4'Á|œ9 ½Q¡(‹ìÔXê;¬áÚH#Â3Rž•‚ðŒ¬”dDéÇ ›ÑSN”œóþ,R‰ót.*½\„1CvµÕ™ÙE%Z•t¹¢ E &U˜†$XI 0¼êr%# Á0 )]a›¡5ô@â5ÈJ"™Ò SÕöJeaEE»Ò„™[H(d¹Ò²kU\`°Àq€JX%P+Ö¨@0ÉÍ"2H+€!ûnºä®ÈÂÑ„ € • (Ë™y4DlHà(T †0ˆD:¹—’Þ[m΀š—^D\Cë¥Nš‘7V‹,ƒ¡wë=Šé|§Û[àãÐ:Š&‰˜ 5“8· ‰ÜXºarÀ¶øzŒ1ƒ3î$. ɦ=rL½¥lâëS9ˆ\wxóÇÅ@¢¬]ûÏ©]Õïõ^ÚÝÛ|\¶‘£öߘ}ôÙ%Öy1@ÌEÈߦ/ô^>«#È㽟YJW¼Œ?Ón+Á,À×h¬M9¶ Ž!¿Š>öëà¿ !Gã½A›I\†ö¬ñ⸴WÈ-F<"š‹w–õ[Lsœ &Ói/žfFÛ¦÷gé¸0)ÕA¬Î4R‘ÝÇfË­EK,3[G« – ?üè\rUß[ï°AìB§*:V-@3MȨ³Ëè%ï¹}½ÑtÓ2¢¬S ˜ Î&=N_‰²Â`²`U˜!EÛ°;Ê”v 5¬î]‹Q ÁÈ€[º¥\É¥?ðþN$æ’d\2ˆ™„Æ­ q‡C@&$êÒ Cy ÕЕ­€¤Ú @ƒÖ"ˆEŒ¨bYVhŒ ° $@µ €¤t0`,Þ€A,ZUšÛ4“(€€hm„+Æb!c„di1à@%)Ž CU1%z¬Á"À`^‹MÆD)+@÷[in,*2ió›Çè{eÿäíxŸ?±oh€§"¹hóúém<¢ÌÀ„6pZnîDg,\³¶‹yf~l¹x/)4™âæõ.ß\·:Ôj×þz3ù'ñêÛ1¸¼2!ÛAú ÀËS‹,?ˆBåá5›K¦ôjŽÐϹŒiÀtã ô¼é `¸Þ‘éãÂ1q»ÀD:$àfÀ…ð&<×,Ùñsì)Nw] æ~$wˆòëž·aÙW@ê'Þ‹/Rkϼžœ-«grÆÇW¶¢›n`r€ì÷;ðù1Q¦P Ò æy®J›–„É×°Ca(ÔEšaè4çoõðf7NµùésCÍ ÀO*ÕD…?ª<á?–YÄÇ:Ôñ2­Øí>ôù‹Û—k¢N’ÁaÅJù ,'ˆ÷Çs160u›pFŸô®iˆ˜ésÚÀ–dY8c—HðÄÔžoI~6·í‚„#±ÝéŽR¹4£½jK¢ð»;ëÉ·qY‰gû#lù€ ¡Ë¨Áß+éιˆtS;Æ1/àKWØJ(ö§6šÓ<ä’<dða þ¸°:d(¢–®[%çqñêíû®'> Î0Θ¡©B.»ù¡d”ÃÐ¤×Æ†^ÝšŸ+ÈŇÜ#YÔÚ;•bQXPÜEè¤ ÜÒ`-}¾±"(h–—#¢%y³(ØÅ•¾Æä×dA@„Œx­¬÷â…vHQWyíi&ÛöNA>`GÑ@AÆEBDZ‰–D$ÍÎØP… a%ϼe>áP À$èuEÄÐÀøhËœÆÁÂÎ-„GÑC¶ó±EР†…iÒ©GŒ&!M2XÓ\Ë ;­Ðèd+€: Ñ­“RŒn VEPlç™Y86u¢cmEo‹X§˜»*»²Q°EVE-RPH­©M Ä/ªŠhÅ €ADÕ  sû € F¯`1€¢0ä„o0 Âà:ÄYQ% ÿ£UIVpý9zí îÉ•™›‡áqçð¾ìð´µ°ûÇMÈ2²Vâ „‡!A¶j3vˆkz-ð@ k¶ô$pfhŽLø‚€#"ÅÄ6¦  ·Í5Mtïc¥`üv.h^ÕîT òtŒ `Ç ë|N, ¹{TqW¼ÔÏ– ±®Kð{/‚7’ 5É6‡hBPy9°Ò!µ“ì¯Ï« Èä øT˜þFP€  †ë@/ ;B—1ûh¢·~Ý;[<Ÿ ¬LbG.ž|OggS@ &’<‚qìÿæÿÀÿ–FFIPSdgÿÄÿàÿÑÿÛÿL[×?kÀ2(`‹a¤s½³ŒNv”BäþÒ¤^G [@(^…§#Oì±!kß̪¬a¸j7f,è4{å`€aX32{Í´ÈcÀ0ô¢(Çð0Ã×@¤F)—ÐK¢)×**Ѐ§ÐjUQ kÝêb0ŒÖˆÑ€È<žG%ƒÜ@œ«¡¶ÕÎEÅPÉ(éE+( ªä€QÇ˺‘uL`Åäý´l©P€Ôù†Ala¨ è°ˆ`€R$… *uÄ͘ÖÑ:õx¡U‰§XKÌ^M žÐ{úxãîníùo[ ð`ª:-îиÐö†Oí£ ¢VuUà´Ýlq¸¦Û‚C Ø-À&Ê–€ ¡ Xà(%I`…ª< 6–±3½žàÐ;dÍø X7o¦yâš œ®¨BÁ;q†@B®h½ñ6UŠ@+€=9Pb2Á׆µ‘÷Z2ÚŽŽ½Hðó_‡Á¥ ^ «åkxqÁm£Ògß¿÷’™’aRÁªY ÙÄ( ¢¡ìD€(1²æ `À0ðãlt¾Þ~ÞnDÿW€áRÆ®I-¯7CM3:À±ÅZ¥Ê\è@±¡ê‡ŠÎ´96k‹Pé"È µò*€Î‚¶Ð"@¶j•†¦ýö¢Ÿð(À“Ø(r&”m=›•³J+< ˆ+§qà m„Äú Q@ß @¦Ëj¤rò–7ÐoÝë­¥ pn¯ éL¢ 6ç 7.bÁ€u ˆÑB’” ‚èðsõ V Q4 ,©ÄU `ŽA€¿Pþ9Dä^˜ü¥V {0û’[oLø–ŒùEt1î?õ€W™”mଆ Ìú\€ÈÌ:8= îJqõ$p ×q/pÀ,ùfÞj“f1𙦑Ñý¯Ü5öûg¼zô% cŽc"@QùˆdÒófös×fàÍå¤4€^~ŸÈÄlƒ*+S"P*ç']äÔ‰ J ¸7Ù 9¯¤üÍžnܶгç!"²X<@P¥é¦d­^/S?Ý‘ƒU$z½]ìªsà‰|Â÷i­,+wâÒÝRä˜5”ØK™ÀÂYÏû¯mZUCÉÂ9€du@$@¬Àœ/ .3#AˆùE&[Ç2ƒV@Dz¹â“bf1[€ÖvâX ÍÚ¶¨*€ à™.™Ì ⨗`ÈD]3òUª8&%Áj’‚%@Qt @CGRtK­W»(À¶À °p$ ÃP2FШ‹m¬Z§ LÙ6€q‹Èsnê/5ˆÁ€Š÷‚èœfAÀàÅšÔR .`öY%qVÌÒ/óJ¢”"ô.–Ì#ýž‹©JMñͫѾVVãý?¿øÌÖÿOˆâB)3•§8w6ø”¯‡@c5k›ŒLN1&ffwÛIâx;¡bÈ}ôøŽH¬àl­/{Ÿô*¦öŸ±UµªPUöاZÃbLÀÄJh„ˆâñ!É´ªÊsA„R™6½,"r•´÷Äùj;–+yÍ‘’Æ’2c´a\³t}¼ øÝ‚–º®Ÿip_½ÎSÖ›(%R"Eü(Ëa]¤RHô KUEñ3—œ´6RëaB{2% ‡³¾'u)P €4Pl˜BØXåÖA”Bئƒ  ™ˆ&$WRXÛ‚¦S#…ŠÆV“8D ˜'Hêb]ˆŒQB(ØëYÝ‚ Xµ¤ ^K Å l#ɨŒÀ¨U³Ï‹ÒÈ&å³ U«‚€  Ø9ÃG«Úàäi–¦{[a@Æy&Uù !±®ê†o|üµÀ`Ürq5çÀröJUC1:‘á `p‰Àu$8Ïr]çØT2Úž*9•' "í4Z+9&&$sòÓZ4%Xì7´RµTPaþJõN N{…é¾}Óó‡´£•aŠÀe.cÎêÚ—’©åÝ¢’÷eÝ>îö´FÂ8ƒÆ‹ l¶é%ÝÓ°ÄrÅA6!æ Õãiµ°R˜ù ,Ü~€T*¸`vÏ ª˜Þ(›u¥‚C¢ìΦÌRíQЗIgàmOâÄ€¢"5Alà•¿Yì^‰•R¦Ö)M´MÈ\Ü0Á “2{ KÎsçÐH†s:(Ѻ¿D7¥(…RGz}”飸³`UE©j#Špß»ívÍà0\ÍDÇM ÜVISF@,ø·VÃ;ËŠj¹óú7_‘—an°÷ê!¥öÓÉÄOëÕØÛ®~³X‰:+¥LATB]¬”ªêèÒÍÚUÞ.UU±+° ¼2iŠØe¤Du¹NaÆlŠÎYûk³)Z¯4\§CÆi1¯_‹(«çïãùÚ‡Õc“BbuGE7ξ²É¬[©ŠHq*Џïû±¸,=I??ß;Ž]à÷×=§¾ÿÛ¬ÔʽÌoÿ½€ÌÅæ:>R]˜Æ1ܹ"j²ržë7<ñõÁ`öz8‰€9•¿¼e1;tÙÃs&!« 2n€ø¤EW¤›à™$ ÙþMÿ›rj8˜õ ÷OÍaºòàš¢úªyØîZ‰/yð5Ÿ½ÓÇ h€`C΄EL¾Ã&c'Y0ë°äŽ»éyŸÝC€0²l] T)$×'‘œ² íCLf•ž®@!H¥ŒŠlH×<°²/¾4È?cœ¶,d,Àý,ö¬) §% °ApüéA N YDm¸˜ñúA6ÀÄ iÈ €l™5F!o·Áž î´6«’ `ȵ6“Ò 2­BwTkÈ®àÀüâúL c»Î¶Këh4Ú)ªfftP´ ‹¹«Å¬>gc=ý»XqÔãùóWA@t}(Cvvþ|²·ú¸ÏëýÄbßpŒ(€'ü¬¨,Û>ÛÄ2e¨[¿/säÓÝ7¬©¬:ôáÓ²ò\4Á)5‰ÒìÖ×>‚™enÀÒ£ÛSä°0ôûêœÄôÔ¿ð0.ç´úч¥ü:Óõ'_XÆ&=§:_;hz¸]7šélât³² ÎX§«)c‰Ä”¬'¡ó¹•ý [øÂ¦+¯ø"˜¤OggS1&“ßO™Éÿ¿ÿ°ÿªÿÿ—ÿ’MHPKIKHUUUTTUafiÿ›¦vàè­Áœj*ëƒöÓ¥ {ôu Ü-Þ©¬HŸ·š§€ÑîI “aÿþZN=Üt}´±ïç”f¨|åx>ÐëÆj S¢*!ofÏ7ë˜u +&z˜Þ\þο9nÃdJºÇá}Ütÿ{é!;)…é¥Fó€-dË…|¡<0’v&÷Øþ†Ãp1þ ’ˆH; ¤LÚ½ŸK…]ëƒ 6>@βd¶÷@3¿U{’èd€û²¾:öÄ^Þ}‚^«…Ö„ £)¼ç\Ÿ}ÚdOšŒ}%>Z¯ÏÚàbj˜“Ÿ¹Ü‡× }èîoÁ 8·™èaÛ²¶ÓáªdI 8ð}ÞÏ·ico9­þNtÙígö;Øßkÿúòϯ, œafÄùé6-óÀnÈRJ†`ýdC3> °˜˜ÕœýäE @„›4#ý£µ¸»þ|ð!“Ót¶ £m›‚÷!Ñ’ÿ¤jǹÆ6EÉøúNò©uïšãŸ\Ëlš\(`ûüïOI,µè¥EVg@¥æ0Hà$M)6º¼Ýš¼É'Ð 1ÑOî,Ä'bòeÞbt˜Øs³ßÅä×Õ×Gð…µPT'ý7¹¡ŰÇßµµþOÆIÁ‰j?š†*þÏ.ÐÝ^F4Ð CcØ&Òw:.€2éé[«ì—uß/ñ{?Ð$@ )Ì\ç%ü¹ßóB'ÀÔoø8¾™è vИ|²IšaÇÑn«dµÛåÐ,ª!jÎÕfö:xØÈõ”é()¿7 Dââ2Ñx¤ê“ÜÔ§‹N~:.Ê^OM6ãxS§µ´Jö0?;Ì?s Nì¦àë"h1É7Î(†h½)‰‚¦Ò·×ÛÍÉùv½1ÑM{ãöi@v£{/F@!($€±0b… hÒ€`ò¥zåG@#Q*ÀòÁP„>Çd þ)–Öµ®ÖÖÉ‘ á:`èÅ¡Ãàãz\IPVÖ©“x_n#¯µ^ØÔ8­¼P¢;NØ|£mͤ4#  ApSç¾@­¬ÞŸÒp²E°Wk]Ɉ‡°mñÍ•¯ÂCî¯b¾äâ3¾vê¦aTà/—.ƒíÁ³i¼Õ d2dOθˆ~)øVõßÈŠïsíCÁ‡àACž}v"ä° x8ìy€8¶›Uw~åñ5<Ï&Õ¸Ù^h¢ß§·lp£[ìÓMòvE²ì°‚€•±qÞÊòå `©î¥‚“•U¹$äÔææL{‹Ùwï ñÇgE7lTu¼÷½ÁTóW7 @üÄd veÕªJ¨Þ\“ÉÀÁ ÎZÅ|lcþ¹Þ&`‡›dO³Ñ䉠ÀEß ÙæxœÓ|HÇ@ÌédäÍE/÷ÙéI:*üF» ¿Õù/߬hX3¼cüqT0YÙàðÿHÖú‡‚,†¡ • ]ÆaJO2®û[V!ˆø@ž9Žá¥èžú»M5xC­ŽØ£¾ÖÓ#ÉhàèN}ü(¦+€Wk‰©Ì«ìï£`c9·O7€»òýQNØû5ÓšIe& l¨ølõn>ý;r}œw«M‰”ó_¸@0ײ |/€À4©ßx„ßíK{°*ø¬ó6öë£gjŠñksZzÛ@&øZtßTŽ!~T=F‹á,rt‘œß6ØÈ°ïµÎNófë†BšmVŽi6zûóUJv¤Ç3+ÀZÖ–#@ONÄ™çºì>—o-ÝZü“Mç§iv‘§d¤TƒŽ‰é–YyÿLtjbÏ™»f ²”6’é$»»¹; ˜yZ%—[ß䇵pw\÷¶o#2é]Ó Í2P7ÎV<òÛ›¤ ‚Vê¹ÙáøïÌŒ ß̶~]ÿNïM铜é9´¯Cá·¢âÊ颀þÆÇÜ¡<ÞÅú)A!ÓïcBÀcÎÈ ¡Üµ_ÀC&4úY—6Ç•šaÇ<ù|B@â¯Ýµý$TÖò P JvþÌõ›‚O®ÈhÆGàY ôx?¿¦þž#_0bñ°úp •mT¬¼Çtý×QB7,Û=Ùò/ Ç @Äb™ë‹MrpŽU{ã•¡“GÞîT‡±¢/9>þô¾È‚*Õ—"UÐgö3ÉI’´ãÝÂÁ ï0LÍ30¿)w¼½ƒ ™ýýQO00ÙÁt ’¢Ù<|«¦_†,°Ø †¦fšè‹ÁZ˜ öy¡ª&ü ÎÔ3• VpÎŒ«žãöa µD ¤6 p¨%V)ÖÙ穤jõF¦ðª¨¤h¬²iËçß>¥ÏçGW~\WÎßàí"º+ßÎ~€—%£òi4ÛÝ€5<À˜6<§Vo' lSÔ¬ÖP&†ӆ»úŸæ¾syMÃü¥ñ|ùÍOg&ðÇæªÂ÷M1Ù>Ón¸Ir&Cj†Íl‘¢Yqßpljˆx/â€Jèº]ÝnîH2€¼|,Éôd<.…‚÷]uänœ§{«ªòÙ{ ·:³×*Ò[X §sÏÏ{m‰…ï¥ïÓ‚$7ß>éFÈ?QÔnË”K)VT‚,Õ©C‰Ýø´Ö\ ôÎx…瞨µW ÖºD¹–yh>·-F¿_Gžëä­Ãýñr|íüãg¤råÅ‘ Šû¥ÌX*’>s¢ó¨½BFg­eóö7ŸýwùËÞK:ëRƒëÄÐÕri1€OЀîpí…óY¶£m½uÔŒ J«ƒˆfFa’yÎ?À[}â'ûãQl¢ä¯æhÒ6þgT¾xè@ÝÂZOòn¨Í¯dægž^gs;Ž#¼HpR]¦[Û-³˜Q(sE4‰„÷™ð§L³—Šd¯ÕÞr/=e®S…=Šƒ #k²2jJÙM#‚8³°ÜÊÚ8{j2´“¡Ä(M¾1ÁhmÌdB¢Z æ§¢A•H:VÏã©8r¿ g¢ŽNÉ3 éÓÎrÅdÜôÐu¨ù*w×rvu“oûì; :{º—¢(J;/ÂÿE4Ý ©¾OggS€Z&”´1ZX¾ÿÇÿ¼ÿ¨ÿ¦ÿ¨ÿÿwÿ†ÿƒJJJèaŸ5LÎedÞÊÓ$îîpdéÍÖ,W“·I´„¨q bz{{¬$—™9·FµÞCÏ=½49Ud 9Iלپ¡&Í,ëÀ*̾ì±ÌôýQù‚ƪvbf¶D¹*¶-ü‚Œ‹”ÒyR ¨Ÿƒ4ê3[éÃÛ¼åU¨¶þ‰XÚ *àò¾LHP`ÉàR ÚXèu,€ûÔ¥ |dú]#ìsñÆ-÷Yaü&È ¬ü´„ª‡F¹×kMZ­@ï¨Ö¤5×vF‹ðòë:ó™x¿ŽQyéªYG%PÆ [û¦Jã²ßˆUç‚ýõ<sýf0²TA¤ªËc¯½*Ò§þhÂc²æ]’/4º­¢{,™J½nÏMå‘- ¯‚LC.zeMe$kƒ:²D$%ñjÇϪ–— ¦¤Æ+¤‡b{Àÿ‡ii5ô˜‡>]¸è:sƒI‰g}´õ/?zÓT{b§'c_˜¸´É??>?›Û¹¼þìÕ²õî”pt8næÂï[Ä–C~6;ÁâÞfí®kÚñ÷,e]‰oÞýsvwÌô™S•`ƒiÆf È{OÃO-@OdJ¿º¢ýÒD”t’p¹D ò@H˜Î_—{J÷ Ìt7$“Š'pà#ךW¥(¨ž",õû»ÿg$І9ø9Ûä9ûÙ U <ãÌ•§…¹n”Ð , ` È׆›K(Ñ‚à$æLñCbˆGŠø tŽT˜ƒ|5¤ŸtJD(^‰å`d0˜~!f±màpF6Œ€A¤õ›ÅgTCM‘÷¡ñ¡²*Ye„ Þû¥Ì €¿7[¼‡ˆ  ÷Ìqæ)™‘Ñæ€h³„ö©O€qøù¹Åh²nÃû•V—®ÕBH2Íxfû×¹¦ý^²¾ †ÇޫĴ¾GÉì]EÉ)%Á¼Ük;ë']íQ­ 3 ðÒZÑN"‹ÓàÌài¬cÎ!\¿v ³JéRæb{W³Î¸6½¦–uð•d•‰´$H8Ziµý<«øÊ§Wã¸t^v‘™¡-U>ò1V#;•õ …Æ^ï¸ED4ºŽ(‰¼@Ö:è”)b gª®†²z Î< €EOY;ë¡ÉÙú㯛$ÜÎV~7²œSͺ7»I&ˆ þ©µyaï 8FDû·‹ÏÆ$ ‡(Ž {¿°ODjžÉØ#é1Y$'G}MUO1ûÿYÎoû›[ýK˜…OŽ3õcNBÍ$ÕœÉÏUËh*q' xC“xø}ï@·£•ΔzÔGº7×yh àΡÿó“õü{º`:§"ƒ2àxý¼õö•€&»Hæðûp¹!‰¬YŽ™¡5T`¬er×ÿLÙÓxîÎfŒ|„£ÉãT ¾Œ ƒDx+%hI:h|<œ8@x^ëÑB²q.§=ä‰à82hز€¼u¨¥†~y` ãl]>Ûplö™à†^l“5« ˜À÷lí§ÙÑg“>¢Œ6DN+!Ÿ€t¦òëcHV¿×7b´ft•¢ëà‡u·Ì›®q«Âyê$Ôõ÷ÕÏ©÷ŠZ4³¾¡gÅøìzwéôôcÈÝ"GµgÐãEÁwÅd(Òv@î±Ø0Yc®.µ™M(œœH¶ ¬,Ð]ž*Œx.Ín²í ˜’?Ú–F8®ÿ;>‹ì9çš4™®Mÿi&êÊÉñŸ$Ž÷9Ä‘žG@å±ð¸žµ˜k9Õ´Q­í;%3¢ Ø—´›~ªüÌJMeÖ›³aüinå“2d¤3jh?Sù6Ì´Ÿ»?tÜY[£2èÏÚsëÝž»‚%øæ0TÚbWÑ/욬ÿ'ôTNCÆN€¢iÎUÓ¿.>= ¨.k–ÿÉ`öh:®ff\\­ý´ß†!-¸êK X~ é&çExŒ#ð„Œ ÿ±*XJZ8$Ü£ Џ^x àÝ€¬ó¨®ó§G€àn€"U žûmrmöu@¾®±§E‚a†£Þ?ì¶¾ pQ¡`žÖ$iÛlí™…T-¨&W£5ÙKŒô…Óq0NrîŸR ÇÚ|® ’Æ]… #ml#ÊÁ ë&¬€Vc!ã“#ÈÍ£;eÝ–Qã¨Ц.ª—V«l`ÖO#Yv@`¬w- JA!¢¸j ©Ðýw $H^õ;*ø(ÇwïBbúŸÁX¹ÕɸfA=»N»È³x 2{¨¸”º–æ×}i«KûTö¿ì÷^„€{öŸp€O²G³‹«õÿhÍ@MW~™¬ùù¸sè¼#WB×4CWDÔ5;ë‚ëá¼SdCM0WÉÙdBs `?ë 2°ñ·fÆ;àÐÅršòéÍkÙ÷R‡ï†²ÀEtjvÏCÍR5 [²‘rŽmÚÉ¿æŽêNš¬DÁ9KJE~L$û0ô9ãâñŽ|ý}’U$6@¸…ÁHð‚@j’çÛ°%†y—5á¼IA"æÝtú(…a—(Çì"ä­-œRyì/P`Œ žûéÞžyÁÈÕvy$ÚàYå˜VGŽ1ÙD 1¦•àȱoû:“ÎŽuŒU­Rhªßy4ùî6:WžIà«hûºSП/Ó2üæØ ñòšaÌž….L{cÑ’Ö[‘“&H¨ýö’_½ùòñËNAÅÝ©†¤m·3:™È‘ûºO Þáï˜?^Álõ™^ÉDÀÚZ>–\èf›O`÷Æ>æs N HŸÌMûtDoí%ïmÏÄzx¸~®E=x}+ á‡åÉ ÊQ²*öM÷¡vAÓÉ${SnottDŠúçFCÑ?÷/ÐËÔ08§ß399l‘ÌA ?Ña˜&Éd!ŸmèªéT>‘Gfzß "rH$οw(Osu‘V“¿§‰È£=\q6;çÀ@È™´4$` ˜²f`ƺ[æ÷¯…ozVÐEw€Ë€ kƒë-ô5»iÍ»-ò:ïëàB÷3§d¬RȈ(à­?*w Öõ¼Î$Xç xåÞûŽˆQUSŠ",€Fn-% /êÙa€}÷ ~L!qL ÷ »ò(áp#{Œ™‚QäHñ[ziSrÂV"OÎê¡ÚÖç”7*¥{Ühƒ ÖÆÛÛ*– Ѓ®Wˆ¡$3IéÌÎÖLbæ½V!Ö½®f¦bÃëˉî™!%ç´¨â wdOôþt̓ÞÖ¯0× ÁɉULï‘÷]W㞉¡Y+J~`gÖÉù wÆÆ%ûæÐ]zª3ü®L>¶G<Ãñy#몬®d~L5ÿ¢údM'I“´“Æ ÑÆ°êh* ¸OeS™=å?/ýŸP‚3»'æÕÖkÜsîÑ7;@M??bNÆ]9“$ À@þt¹˜üN¯lÀÉÂÁïlžs7‚ðœáÃ!]€Ð· O6HKÙ¤–{ú:« 움·F(ÖÊõò•Ú $©÷Uã#z^Øàð¸-÷)œ °Í|£c4jªJ¹’€°WQ*iʦ{m{Ë|¿˜Ó¯––røðrgNeZê¹Íõ›W×TúßUºsÂÎòßǤ¿ÛmK³ÞÐ÷—‰iwoÙ„•²JDW}`T5Ά„¬uÛi×¥«†ÚPÿ]›CBòn Àî#Áëþn‡ÒÍŒš1dJíª—œÊ{Ï!üP!dý©†˜cܽÚvf&!+-ݱç%;žb›l&IÈJò\•YÍKSÔn"·Øº›í~MȹùÞ÷,¯ñ3Å1™Úju^ˆWOggSÀv&•BúdˆISXMVEGHEVVSFFIGFVijÿàÿÖÿ¹ÿÁÿµÿûÿJjÕ®ÕÚ' Ç4¦åy½ýÌ{R(EaHÇgj½'nJ‚Óh.6¬øÈj¿U•ï3×Å„D^~jvß:Ù²{â £ùsÌ~íKœsauûµï ><¨ñ{q“»¿ë†…8÷7ÒÊìQÙ´hz9¹õÏ1ŸÅ{ßœ÷GÍ/>ííêËÞç*·ŸŠ üÉý­¦ïÖj ­€IáW ¼bÃňs2¦Ï1z…­…¬ÁQâä˜섎zo~ÙTÔ¿X£´T>ÕÚ=r¶™,-•!õ=QÉ–Bá²çjE[F€F YäÐ|ÿ!…‚Z±¢«* ôzÛT‰-°¹Ü4i­V8Í­ÖüO'ˆaá$¤©äÚ¢tǬùD‚–Ã-*YAŠ9©…x–U@¯ aµlÅÈqj_¢U$ñªÌŽåMÁ·ül¹à¸²Æâ Ž–}/@¯Ÿ…0,K• ¾*ϲÎuݳêÂÇj-k*Û•f2G1‹­,ªÂTd ˆ-.¨ªD«aGé×Bë1ô†ãÉ,güÂ9½P­°ÙeRFµ9ίžø˜=‰æ00;¨~Õé¶°;’A:’د–’ÂQD<rÿ"²S¨¡Á´~=ÜnÝ2\¡Ó[µ¢§ÂmC •é°@X‘Aè{Û.]ñ’­:ÿQD½d 4£-LY‘› q¬ôP`@•¡+%ït¨£äjã+Èò1v:½W;IË”°Jœýäƒ “‚ #0Zq»´½^W†)žIhÓ0܇M`$ôæ&³­¯JðÛ`ôzí (M¦ËÎvÉ¢¬‡ù™—ÄôõÜ9À{Ø^3»â@ñ!OÓ ™åP£õtÙmZÀ4.Ø?‘”²üvç™–#h»µ'Ȥ\]_g«øì|˜ÉU°@Í~—?=©doÇQ^Ö”9YcŸ£†9BJ«º6‚ÑZE4ÕvhC°èïODJ­²Cßìzk“ÕŽ¹3”› Ž‚Ð(b¦:þ ¡qI'` KnðYolNKÌcàU¹¿‰—–Kh]aµ^ÃâÐcbZL`BA§Uúø’ïjwTT© £cüb{n EPIÎZªjÀ—ÐïüN¾yüÓÎFŽÁ °Ù³~>븺žâU;Rw&#Ô>1 bÚYKSk-ªht¨ªÃâ§zUJa…“V«¨kóŽgÚI%G¯^Ñ…E5qYê›âc|ìvâB?¸¤®£ë %‹l¼¨D«(˜pdhXfF,K˜~ûFþÛ0ÔZyÊö#ÍÕÍ[+¯² ­®R¾Öó[½þ™60©0 ¸ßuʼ\Ù¤% µTK•ŒV3Hz ‚ÐÓr]Ã-ÛWz²åä~ÕÆHeü[)®‹ùºEf Aê%ëë✠ÐßcÑ'k^ã4©SN¤BÅxZ½ *6V ¡C—kEI)4Ô"¶`‹i ¼jÉ º]ÿa«U.Ô»ú–9‘b#ƒÀR±á'ëV2ÑÔø*qAD Öꛊ´1°B¥Íè¥ :1XE|=åôzÝ ^Ïë‚+žb…UºG¯ØÒýœS @/78ãT£LÔ$ ñ"¯©[e¥{Tˆë cª^…MœRžÊ¡@}%ÿ}m/CÜbSÕDR¢K¡³R©Éi¨Š­‡ú °Y;n쀮›à˜‘ZCZYtòl<.®ÑX¬êBDÐ7¢Q¤ëjv%2”á@jÁºäÏX-´«å¡]a0œ6!¥ ÙØ`ót´)Hà È&ðæ«M÷džhkVá¡}HòΗöF¢TQJ«ï_ÇíÐÙÃ×We:þÛ¬Vë®èóoMFQf–ë÷ï2÷åoéßG-)žÔŸ|؈¿‚£þ=ÔB%& 5òInub`)‰‰?@[ÕŒúvet[ù²FQ½-ÖÊkçãOËKL[Íq.•bÿü‘õþ#Ž×Ü?¿Ôí.Î1»²/K¼|zùøwI )]Ž€_[øÏ–žßå³›µä×2ššMŒ¶Ñ>Ev¡YA0v’>tÖz€·òc;@+Á¾°ŽÍ·¾¹™E¸*ÐÑžÈÀ]ä¯ÜÛÉ´Üüº¬ˆ¨kZŸ³D³ rkD>”ཌ2”ÜTØ·æJŽÓÙð®KŠˆ6ÔÑ¡—Õ•wÞ}ï£åÕ<ûX#:j˜åèÍ]ÉLÑÛ²ó$¹E«g !”DæƒN².YXö»ŽŠ Ñ“ÄÍTÞeÏ’eÕ¡»HMxöþ!Ò×·9CsÙ.z„`è÷£Õå…œ³Ÿ­#Àõš¬îjŠÅÇ&_¯½\vzrQ[hêj÷ñù;³íDlà†!(òmîgŸ}8Ðy%ìŸ*¦þPEAs)“š§8y‘3•õ¨¸;ïirÖAw“œ"Æk§a­wiÞš< ¸`gÑ|u&ºN¯= ÐäRÄlü»Œ¸¨¬û!;ÎÊš!£<^‘µ¨¾TIQ `’ç>fθŸüø¦K5ªœM4fVðŒ¼ÍbHÊVD%,PÁî¨ ì¦éPâHfi70^l d¥†\©Ð2zQ0±Œ40T¡ÀFÌþfÜoïGHº/,€HÜìß –ÅO©\ük^!‡¬ù2 ‰WÐ’~«¥†&n0i]®v¤¦Þ”UBˆ´÷Ì3§%)GŽnG€ëõ–ß=è‘¶À!À–µmÛš¨”«5 d1Wí.l2ïœýŠ>YM[hqÛõ_gÚȃÂyJ Ù¿öè­}nÕ(Þ ÀwàKK7Æ)nWæòiJn³ËðQõÍ.·c—–$6ˆÏÆ2X4QFæIR‘V³‰Q=¬·„•ä`ìwCYY†0´^¯Jù\'¡JR3ug±oáHŸ5êYè®fnež3<<®;·™s»&éñ§s9Á’³umÑb¼å¤c÷Ë^Ü&Ï^œÚÊõìø|žÉQgò 4 oåi2)ê¶œwt €)`X7TýëÄËä”rö“‰87g&aŸ}w]nŒM 4}%M eÌпr ²RƒðÛùÒ»Jÿ€ªÎJ ‘ ì xzfîÊyÞ7xË8˦vïþÜ‘o\tï{ŸXõÀ¼Ñ+^›€ÈØêlÀƒË(†Â$ ‘çԃƃ^dŽ€aTJ8Š,xnÀ€T7„Z‚½#2¨$ €jd±ü)K°mRv%d Þ«=ŒI(¤@ýo³Ý{LÉ—si íž©¦Y‘dFO€oç\_¼xíWö}­hf¥Õ¥‚V•$ ö›~M´¢´a»pÞ6“Lè$ÐÌ¿iäbV)‚t{§ø¯sBH»ƒ¾Ó¤²i@@&³ÇûnñXñï\ìrŸŒŒoüQÂÚSêíÒ¤••Š-õ }^ãLì÷g-iˆ³pâV@€Z6eåíÃA8á¾Ý7v·å€LϯmvóT~§ìÈ«÷Î]™†‚¢(÷=1¶W½ø0¤ÁE™Pº/§:à°úDb°G¼=qd1:Ž¡_êI§¯,%T?¤_^ Òa6±ñ:c`i1SC[ýÇlŸ÷?¨Šx†}Ï“•n1W÷Û0Á&Ž’Ž`:\HT 0)ÈÛl|0ë•¿Ácxaš›r—Nÿp0å˜ZÆ­/ãîzͳ¶ôšé£{ýœ÷ïáSTŠ©==ã.0Bë&›¡õ>ÍizxTeuF  Ñ 4 —QK`ó¾0€ð²¢mJ¨\Àòe!CiÙ„[ Z ݉Žf£˜(ÄÄ¡Q€>¬½Å˜.«‚=¬ÝŸЇ¼£vÂ\ À€þ HàJ‹žýõ´'8}û„µæ½¨ìÊ*! ½ÎvÀMpZüZø•¾zH€ ˆ d}ÓwDŸcs&pTŸužjbö.øá~ 4³*¥àzOÏËÕ¢1ˆ‡f7#)¾çNÝš‹÷úº“x–"—-%ÒÐ:lä•ã7ú2å#°wÀþgŠÆ>¦.gÕêMôAßlè‚PÇŸÚªÐû}Ji©\ÏñÅ{Ï º§uÿ0ݼV¨P ”Æõéä…3Éåðx³+µð‰ôäiå8¯5`„Ÿ÷æjz-úSŸ«ÿß²lÃNÞs­Póñ-¥ABúŸÿÍæû¨gc^ãÉ!*!ÏÖ>žÍ4s²Ne5d]?ÚÕdã¡HRS lVÆ9kR\Pð¾¨3g*!æámèá{Ïrd g:§ºÞ¹ìØìrõÇç[À@Œãü´õE–Ã4³ýÄÏÑÆÄ`zè„?4p/­úŒV- M«h˵É _¼ž÷_àDcó‚µCr•ä ÿ~­s&ÙGDX¼Þ²1ìJ© 0ªµ¾Ë=tK÷‰Þ!v³«n™”˦gé(Ëš„=ÀËüõœÕzžb3 »"€ÿz ÈÏ€Y£¾mmD0 ïºb­ûv¾®•–Õ÷–Ýcw0»£—£²|ô>C>ñ„‘ë»D—Ëq@šxÕ’”‚Çâ‡á6«ÚèÞ'PwTS͈ ®Ÿ~Ô¯Äv$‚*,E àR§°Üò1oÆvnweZv£›äÆ«ê‰dð;Um­ËÍw¢\6ƒþ[«œó³ã½dr$¡ˆÅí_.g‚™^nࣂ¦û-Ѹhذ/ÈñšOÒL£> •]³p9—kz[õf&]YM¾f“@³µ©½ MRní¬ºšµ (±øñÛ¹CNï¶ ( pè¤y÷W'íç¯Epw3M1Õy¦ö3§êSL¦§i”és/o_^®`¬) È CÿlMuÅQW'(ª°“‰’ÁKÞ± »,?uF¢Û€Çâ×#=lüØ@ pu¸X´-G‹FË‚À\¬†¿H)$‡*]´„ ~ËÝå’V¸Ý®bLk‡ôàð6ž:†<ª“x=nˆØN²|}jØoÀ4€3¼E×ѡèP‘€H`“x=@ðÙ{•2Ó¿Óh}_ü"CeiFBûÒœX^ÃÚ¶Iu Ÿ ÀwÞ—`2=3U̽@·Ÿ½«Á“Ÿ­#Ð[ØxøÆ?¶¾”jä{Ëgè‘McÞí]­®­,ò~^Ù¤~KÂu\Ð|ϵ’Év{js;°ðÙÐ3áäé2YsÇ®@½ðÚåÖϾ#N—“ü*üØ¿üÑ%ÙáØ÷$•4'«ã;‘Œn²!ÒÜÜþn®OggSÀœ&–lDËó¦ÿ‰ÿˆÿ€ÿ€ÿ—JNNNN[W\[]TWÿ¤ÿÿܰ¯r℺ÎçÎŒA5Ä0Ç™Qt ÙÝãiDn"NåFÅäV|òŸ´ƒÆgª÷Lo€âWÀ„Äûöï«ÏÖY[´ ™j7'Ï‹Få|{0Zb¡æ8¿Î«‘0Ô‹éÏ_½n§_e%@öˆ@Çàé'H§ Ñ ‹8?Ö(¤P[€@€.tÝ@ø,KJ,`CÌÛÅ  ‚ú^ÌÝ$¤Ç ˜{MK¼.ž)CýÌ$Eßoåûq ª'n§Zâ±à½Lrçì{kæ#2«Q,€¬æ2&‰7q§^^àØ }õ¶ééVÈao˜sBÑ}W¦Ä帉BŸ÷eü¢® wLnG°y9—o)@EŠÞn¸G)hN 4oç» 7‘u¶àt3dQ¢ß•µÀ^°.bbòÙ{ß;ž:àc½0NṈ̃݉Á>²yÿÌY,NxŪ¨.ZƒaÕÿY[PrWkö³>+ÛÜçíŠJÙUÊRûl3 E%ShØç½ÉfÈ“÷$Ó¹óï¡÷ŒÔðuŸvý í³¡y ÒCºz*k7&cÐÓÀy:¡w7dÖ>ÏÎÏÓó}eedÝÀrFðjºèlf ¾¼5TÀç‚Þ‡¦¦zPÕ²«F¸B'™¯1ʈîW!l0>š È]Dì0„& S!¯ ÄÁÞË}™#Æbï.÷dgfLÊehÀ‡YAð8Ë’÷þ7EŽg.x9TÚa·n†3´}€Š3nÀ€}XÛÕªƒ–’i`ª»£zíÆlÓb?Ñ»Œ±¹à¹Ü¼Í' o° îÔë¥K€¨ŒžŒ¸—ð¡S ö²9wÿ‰ÇwcÈšõ¸•¨WŠö@ Œ.×\W!HA möPé[÷ïm:5HÚjî D‘@Ö<•¾Ù8|ÿŽÔ®DbçIî€ï2çØó±ÁÝP\/Èöf½~Á ͯ;K®Ç§>,=J§8ã'WßB ˆæ–î!²“MùTC9ôžN^CGa_ígüøAq5ÔKìvW^†hоZU´æKŽäB€ðøwÎÌÌtן¹ÓÙÓÃd îê1M¯5¦OÁdÂ0žýŸÖßSË tœ@ ,¼¹]“X¸³j¹Âã ²Ô«I∀2ˆÇ@¢,þh,I¨@4œÆà^˽Ãm:…UPýn¹‡¹%¢ñ0 …px¶¨SKêöXçÉÿ­ }yî=oý¨þĨ•8 œ€°_¹€Ë¾×¹Ì´š±*&èUD§Ž]iôó^ŽéOSˆvÇz‘ ~Ú¬ih!ÇPÒ8;Ì$ UŽHúÛMš½¡EÒa£ñäÈ ”P®P ¥LR„.­³¤€Þx¿yËEµg;tO §.ˆD“yç¤ëû/ICE=Ü®½Ñ^kA~(ohcþîÌjÖ‚Ç@€©w}쟞¤»Å‚ñwßx²|ÖEP>ÑÁ@ºDa'4¬•®*§³&˜ãòznBb¶ ‚ mO±O ÐÓüŽ{ïÚ1ùÍ>›—§kBC@s®ç êŠh6i8ž–˜^™böãiNm³nÊ¿ý…qîà,ÓX_&ç|Ž3 ÁÜbáÎÞã¦ú¥ÉIÐÔã•NLŠû Ä¡‰ôÄ I’ˆ§pŽ1øuÆ~˽àg³Âi$Õ›Ë=ô+U…ÅÐÀùÉÂtÑ“”ó(_E³>î¶³Wy›g"e€Ìõƒ¶ü.àç>8$`¯×ÈBC#¤$ ´>>¶uOLÓÄ”öË-ÿñÍÛ,ç*d8wiwLSÁrmp0C5A¨˜}j/rˆ\p©ƒöFã6‡6¹êkÀ—LøõUãpÿJH úbè½|—÷Á·ç} H¾^` JÓþë‰P·~qè Ò\Ë7,þ/ø VçžfŠº²BÎÏ”Gó¯¨7Û˯ Ð5ÛÃ?¯& ŸÅ÷®0å§šábŠM&)f†‰¦!ÕÙÓïìô@À AÏÂÍ}c0Ó7¤¦§ÅIJsÝø[c¤Ö<=úYȆ_WORCSEžçå| V{XÅ^§Cý”õO“Î"Ou%ÂñØ1ìõÎ-ïfÜ :õ)còhF×Ô°2è_gE6`<"›S a¢füÒkÀÓPÀÛ;öÊmâÓ [©ûu[åG†Þ¸m}¬gž=9M͘hEЉ‡~úÇ«?^þck?Üí»àÒG3pÖ…»Âù|Àš®Õ¦C-…bA¢à$È{›?uß~ÆK§{M§‡~æ;Ášï‹4·Žiê g]6k•NÞ†sŠ4e4fY–iص¡s“©Â¡Ï=$w!g€à!o¯¥·Ó ƒ{;Éã "=Ñ·óñ"Ì+MMGÙ[¤(,lÜŠsN&´S™ŽÊ»«§ù{ÝE¶Äëö«üùtÏ¥P‚ààÿ\AOÿÎSIÁ|©?f`âûm‹ô|M64èF7Ù_ä1‹Ì(ü]³»çÔuî½™zMf÷44@וÕy_ »çmÆœ–û“50ä¬}ììþôÔæO×Ͼ|ÍAfëÎá ‹Qòsa©·î¿k¾ÈwË)gA¯ý©Å1?.f®ßL–‘×Cb“½eîÑíTÍ0Ãn޳Ì1v†U¿iìñ7© #‹‹çëz*e÷–4°÷ʶð0ün— H¦½sŸëÛ©yü º=? —’p6]g?—(ÐJó»+îññ¸ö¯Ÿ ³áøjþ5—[t›w5W‚iO ÅþûôЧ  øTµ`ùæFz‘@ôÀ  ̪ä–¤¼K÷åæ´ôor~¯”>loú¾t„7ÓŸÿM¾™³Ä¼¦x*EÖý3‹ð±)—»¯]òî=-Frý V0ȸ)€ÿ¢ÍmcR )>û<üTÔ[WÒûþ§áϪjßÚ{Hˆ…/Fêxé¨òÞÌŽÍ»’×¢Ë1gÃæ[™,ß •„xB 9ÑÞjtÉv>=3G„»ç^f]}ÙuѲS-·Ì,ÆoïÙ_íø:Ì¿g\Á¸^xÂìzã3¸––LÇå©|J,Rþ¡¾?ÍfðqgÀœ‚Ž1>üºDÕ³ÄïÏÌó‡–཈%Ã6µgN2ú 4üâ4nZ P QSÞœ ô†û›kQ8d¦>©Ð*y¸5>8ø Ж9ÌÜpß?L\¾çÁ`œ¸Pô7§:e¿µÐîìïñ¶9¢éÇõ…Kãåé}9 ¥+$ØÔÄ›ÃyQpÊ„«t).‚ ç™=KÓ9¡rÍZ]Ójeɧ/@®«cÐÏ×åßO¤áªk%‹[2©}¶z‘Jk"݈R‹¢X7kb*ðìˆ^ÕŠˆ¨jUƒ«é osj!à׳ÕD M(S¹ÅK¿­çþC6A«4h_þKZu ²(/½Ú²ÑiñÙ¡è«Ã"gOJ“¹üüþ©‘¡ kh¨ Ú*ëKP¸å§¿û]ŠÕ±Zq  ôvƒaž 攟O³@ŸPNȦ}€–U>agBúƒ¿}/U <¥N•.‹ÚÒTSüðþM‚ÐÔR-0¥/Ø=Ëmÿ5õp†]¥ Z‘!¬¿ø¢Š#Ö@ͪ´1ìR-'ŸTùE1þ¼Ÿ¥*"=³ìqÜL_€‰Õ2æ  œÍÂ6 Ýk—‰6°ÐÝV¥OWëqYq…Dz“ÝÉmKÏr±– öÒ l :3T°®ÃýžA´¢Õ¡0ÚÌTìVÓö’íüT(ÆûÂä‚%¤gý?ú¥lUš8³¯¨«¬)ó†N»â\¶Z#(º€ZÑ‚ž]k_›ŠËŠnP"A¶Ö"Š„~¼HÔTµ®8û+)äJNí¥‰F1­LñmòžD¸ûGÿõöÜ*¡%CùL׉„Ÿ‹QI"Ë"LC”ÌHÖ6•#©h¦¢ãŒh1c”bÁó¥VbÄõg']ø½Ž»À€”²t±U’pE[Úç•O*êé婿íjíaìëðY1ÛhFd”¥ÊÒ LsrÜlMÜëº%Çþ²ìò“¯ø_ {#¸ìµ‚ob:Í!6žvV¯ÿÖçqáàçÇŒ!¦Y£W›ÛñJ WDïÅÞíØU£îq Ki¨L˜ºv_/Íew[™šu‰E$‡¬“;xÜ (3 Ò°0Q—äÀV¯rÓ À,ˆ·¬è#;ÁÂdB)-Sô9ÕGÄ%î/žý¾ÞŽ}ÜlÜ[^mWîýymÛ:®Œs¿Ä¦6~;‹Ónᛄ%¹Y•8>¶Ÿ¯GEº¾&x±{Žu=ó’µŸÌæQ’8ðBìÒ< Øçµ{ˆ4[9À¡(»ZI ÕÉl§'¤H*eÆKåÞÑ!”’=©®´6”]¦ÇDbu•){઺|=Š Q’ËVž%jës˽3•H©ŒEFÐ=æ a'Ì4zG c-kgÇQ0ž2àȃldeâ긧ÖÇÆLb>®@@œ@¥á4&B ªÒl©eñkZ©ÇÝv’Sb-ÝÞtón˜ñR•µ±Ý~m ™Qõ@ËN/ÒÔŒG–õÀèošbÑïÀj¹™F È{1  ° –»e‡0Ra€Û2¡¤KÒ EÀG( ‰häXu4‘‰äy9 ~Ü-ÆE 2 ™6ë™!væ Ð}ˆHEDÂä|bþo[}ô$‚늭p¦Áð»ŸÛÓgí¥ŒN™4庂¶Cb õj&‡³CÜ©B²OÖ¶ñöÝr÷Î>îý‰XUªËU¿‹äÃÍ¡c:LlÊt!Çža2f¿¡“|ÊÍ]TßîÞNÛrÌÔ5gGÝïŠ/Ý¡‹ãË÷$v‡ ˆq;1·EÇ5pÈ!”È;ú”ë‡n19jè~· ·-É@jÙ(æ{£:ÂtŒd1L¶yÒ³³)•ÙK¼¬¨:sˆÀðV#«¿S ùQ»¦`»}Sä]ñø¨m &²#;@@OggSÀÀ&—^FðªÿÃÿçÿÿ ÿýÿÿÿøÿðÿáŸÄh@™ µrÏ¢[=œG¤~%£'‚Cry—ªI1лc ZE)0L6ÀÕĉº„³€n#Ä$= Ñ'$&l¦ ÀX’݈MQ2:Åkc1ô$ãLd*I—Èa™”]gUTM3„*b@XàLùåÛ’-€jA@tÈ¥*X€€¿Z«Q  <€‘ÊqE,(¾Û54¥ æ ðÿb=vÐåÃÀ½£þ]ò À›®ÖœqOí+öíÑ@wuwcŸÛvQ‚¼~XǤÜ”ALu@5ÁKë8þ]&ŒÄ?ªã’7ðfÄ®6ÿ®Ü1ƒ•œý(òëSC"¬ðsšmk:3v—ñ#qtRǽ‹Fg”¶¨­`ÚÉ,ȈrbfîžKñ¤é2Ša ëÆË*”•s¶ÇÏEÑ”êÙ~v ÝDº¹cd²YC ±!“Í|Å XŠb8‹±EþëíÂ%d02C„ö,Ö#Ÿn!sEV…î™,¼)E(v«ðÖ³ÏùF»ºpX ŽGRüí´°Û‰30.À¬gl[2:ÇšÓž·IL{§ ;Ǽ*çÝNä~¹ô:u{¼öÉ»¤×=\û¶(AØ+´ø‚µ&„â†Pœ7\|vdé^P:b79ÆUÙkºÈzÑ[8{~äC²¶>pˆ}-4iœ mMºšéˆ¦›º–x¨fÃL]ÑËõéô”¤§–n%¦E0M]g»?ü£½‚e•àÒ'ÉÞr™×=gœÑÜtegA†nuˆÀÏn59|‘r©—ˆdqëaOLý—9 4 R ZëIÙ¨L9 Ò‹§ØWhN„R! ÈHŠuE!Yq/óû>Å2¡ Â…F@æ­¤HrË º†8JE1€z*Õ01`!rމž ØpFb@ŸRÁôBƒtº½Bˆe/.¨ŠñAÅm²t `Š`Ú²¡i,¨f I$QÍ@1fµdø£e€p¬Áèôþ»ú¶r²TS- tjŒ¬X ˜bàÿx!E¨µ€£@ìõp*€Þû­¢¥ÓÌOÌœ‹-¬LS2 ÿ3óCã«ãðx·Ã>ù…öwš@Â… Ü£ä ¬C"á/Joùfó È‘¶’¼ öIo@¶&>{ZôG¼ èúЖÝ;ëÀ¾{P]Õ’ÅSì7únã&qÛÏ.ËV»Rr²äB.!”ìÝ¡k?ën+¥” Ec+ÆxµQ=Ð.K]!cBÒßšž¶##ÖLA `âe8 ‘søQ<ô–™hWWîÉŽVåfÖöØu0’Èü¤X­#µšÞlÜÍÛ¦Ví|Üö&9€Â:¢ÜßálÍÁÃ’òæCåX7–6Íâ8±éyÙ¥u®œ3äZx¥«è”fèi¢4o}¯i`„T§‡ƒaݬ7Ú{®Š\Jh‡–Õë#$P¥¢2=†Èb}¾sD†‚òeʯCzvp\! èÖÃë°ÆDÅ‘pyŽT|¾ui¸âê8™pªŠ¸À ¯Ù)!VÊbZܽ’Š'ô!et– MÖ )º+³fi1 í]14ˆEGVì‘AˆÂºÈ'ë8™°žABX%)6ŽHd! –KQ0±É MÔvfª’ Cj¨pÌ4èRÁ€¤Ð `à2‘…5« òÝS`ÞëEM7Kù‘$4ýb'‘Ò˜+dîQä¡ àí 2`L[¶‘à+À…4Ü%¦d{cкŽlû¸öÑ\×$Kæ~ËÞ*€RžKÚħUÝè,ŠßÝžÈýÕÈŽé÷ 9¼—ˆH§µ†›h;Ïø4Àe™äR<8†â¹)¾oÄó÷+žB– rÉB0thbઓ ŸÃš!gûœŽ€0èžùŒ"dO “ )¥éÖƒ¯ˆ*â¢@ë\o"¯-ô%0GN§³fkCä­Þì±µ€ü§FÒs“5(´@€NE:%D{Ðòv }J¶I'X˜æ}ŸÊ8vïoŠ–žNEQ3‘w ™x¿Ïñì3M5PÑʰöií(ÎÕ[#„5Y”X´ÒKQªA30T9Íe9¦“ÄPSÐ*ëmIÀØí5`ëÓÜØãEJ Ò$ÂÂPˆþ°ˆDÂA$ÁˆªÑÇÙvv#„£Ðù“ƒÅqg 8]™¤Â¶š€aŽ ­ 㜄@íÖ=WìV)" `« -U)&$-Œ©1@*ŠÑÎ@B“`1ˆ Ï\ 9¥Ö2©ˆ¤™¡¢€àŸ7ûÌ „R@lÐÛM°O‹IûYä^;®)aÌKâûÌ“05"éãn^|xÏâãuàÊJÀg„Iï¢~€öMòœm01 œ¡ÂY&¸3E3™çrîDæyžç)SÀËäöï³M/ú!>'Ø€’ ÚpÕK‡B.ÍÙ¾wðAö,€ˆ‰Ûgrž»ŸLÃé"NI¡yjN‰\T¦ÑU¼¹îÓ&mç ^ Öcסåw.ªB ÀwŽB674¨]ÂsÎP$(”´ÀCÉ}ÏÚF:<(Â1ŽcÔ+ëÊ3ïÌGóuÒh³ô9«½_§3hµ„‰äcWVÓ¦˜¶Í@ëèÜMé?=á'œÃ»—óg•Y)ºRèmȦ!sÑè½ñ>vl“0¡‰qìc½ d Û iVe²›í‘Sõ×êh¸ƒG纬¬;ÙÐÓ‘ äLž¥² èj0gKEpzé¥-`9Q6=t«¢'´ª‰nMo€ ž±èC´º,Ð"@• جë4%vd>Q°HÑ„1³…Hź,¢BX£bITÑBÈh™ 5V*" €Ú€Nƒ`@ÇJ"3 XÖX €°}2+º†bÝPP©`–Ê!•¢0p^ÛYÏ”ÈÄ¡7»²žfŒñK‡¬‹ð}NOy"„¤=‘_¾œ‘!}¦½L@ *µ™ØÞdt€ˆ©ƒhãÂ&^r¸Ò8`; `Í9…’@|"°ÍT)<©Ö®yî#ßûÛóôû  ó$Pfýd“ö#1Ê£ûȈə b‘VB§~Èdfϯ¯(^ŸéGJÎAÉJ/_ô3ÎkÅŽ¡éËÛ ¦òb-wD½¯rŽ–˜Å“ (Ð?¼dp¨îúÖ{¯Þo}cCµÛ2$jÌËò{w,/CÓÕ©êXz¿9îÃQhƒNŽ7¹¬Ù˜µ gÍBPëøú å01::©”@@ù  ŒÝݤækÊw¡Œyt£NAtjl«cñîÁ«Í´¡€^ ^}Ö©&MO¯Õ”ç®-£·¶Èz&q€r´$:2â‘ø~º ¥¢t(®MD¯m¿XõöÅ2]†…^ß %ÓdòÎqèIÚ©2`¦èRW©z`$êõªó”&¥jµ þ3Ä ˜‘Ž N½÷¤L¸Š   Ðd Ž@• Y/¸€Ðd&*€Ý¨Ð`¬7¢C0\þP0€ @4è¡ H×®XgÞû=Ä’•–ö ŠÃ­v¢sšqÆKD枎jMØw~ô+ ïkê×À¼ nôlìû†û@»WñYŸ[L…îØö3àžù&GÈH àÝmw”²Rµ-CöWÍ*„g¾‡ëçz` ¢=HI<Å!xB‰ØÕÙ•}(‚UÆ1€ HÃÏq40õŸ}¦@Ζ8_2'-¬3ɯ…âÆ'&ðk7!+Bý4Ë1m%Ðþºcï%Ãòg€§(rO êp£€O«\šiÔnÿ1šT\ÏÓ‡oy§Ò•^ZF½xÕÈö^6óˆpŽB©Ÿ6P»ÉÁL3þÇc}(A…ñƆZ–OI¥+GôÀM )O»Äþ½2ô¦qï. ã¹&™¯@Ç3 Î$ƒ^c¢!-‡ÒÇéa8œ< ™Ø)Õ¹/Õå`ƽ*(¯î.Œ^X®/Q-n‡f½Õ8 ›¤a!*Ùf˜éÍ»¶ Ðq Òceðìx޵ÇMúŸ†¦p *txûè¡ (¥*‚! ÖÄ‚ÂÄ ª@©S@@þL¦‰2¢hm H ˜ Ö Q@0¿KàÀ€T=¨@ÐuR¶úur°Ÿ4ÀjÖá9a «š 0üpx‹·%ØSm8U‚W›>yì+âŒ$Ü7¶ÅvkƒtÄ~Ù“`?€Áy›u̼Slß§×Ì)ÉoýÕsZ×$ñîq0$MÉ•)šúÊ‹a>ozO)¥D}«=»±U…àß:¥^]¦ÞÉŽµF-€ª€4hmÀÆÑá†,"Q8¶'.@A½9üé†xOk­ëï \zŽŽ+Ÿ7ÅõÙƒÇL)dúŽ)ž’œ£)(„dIÑ–2ÕHÃAûÝz†,6r‡»¿mpè{>Ñ=ŸðµdKEñ¤ýû”¸;8 ò&4!ºñl=›U00ó“ÊÄ…ÑÖF ¥—´Ÿ•=£Dã ¢ÏÖgdµÝME·VOë͘ ‰D€à¢6­V¥é°/7ˆ E÷pÎÓê¡Ê'ØÁ(އ„*Mƒ:£Ø¦¦œ€jXp\êEé2Ž×„ªÌÀ:EB¿:›ÌlD+šèDŸr®H š Ä\ã¨TS©Alƒu‹Èâ‘Àz €ÈzPÕŒ*€¨íß,ÕSƒÀŠn0€‹5OggSÀß&˜üYMHKHJKIddeRaallÿúÿêÿíÿäÿñÿãÔbÑE#¤øèj=‹m„Õjõ¤6ÀØwàí§·_®&îK“´$­‰ÄÑÚñX <à vŒVjIK#ÈÀØ6á˜ø{ÙMmÁŠ·Çt˜^+XKb/xN~õéÏÉŒ Cþ­ííÅÚÖNq·"#b¥\; â^pMv¯°(ã O¬i2h ã÷Áä~Á ”î©[§â©$éܺø„‰@ø>b/¦¢²ä»A• w[›7”E]ºù‰Po6…™¨«lˆqèà[€ìzÍIlÒÀcÅrÅ’/Ò5^€XH8½ÓÛPªíu`´­µ¬{ð Y!Uý.NíE–†½tÍ葆vDÅ¢11ž;@ìvÉHð"ä>[±Â¡ ,LçþKXæx0be×¼Æq:¹5Û.!–ÄÔK¸^,‘·ñ2\#£¬Np»Š5`BSKmÁåäb‘;TÜ„£ÇVÅS.¬†«Îëÿy0Q à~Ïëzý³E6 hÍ*É%˵"A†ÌÂjzÒþ)ä]"†§A5¬ßÎÄzÄJÉ&F˜ë@t…+P– Ü [K±ô÷?¼¿àt/þ‘+ñþCÆm#÷wû’DÝrX†‘gùT‰n³¦·¡›Ìûó´©‹ï)yïü¸}jÝYèžÐ3A„(õFŸÓ‰ÜZ‘†í;U¨ŠÕVщL^÷ô ÕããõH· Ê~Î^Ú86Š­yЉ‚Ûþº®Ð0ªeòƒL.ÙšNæZq‡’òÄåKYË3éýIrGZÙTäw{$¡Zï¼àœ“âþ-üfÙýœÉ‰ª\­”šÉ­Sq‰õÑ;§^L½ ¹;6fŸ/øð’Ÿ?œ»ÍcÜÙÜ‹å+cHVÅŒî•rþ²òNvlŒd©Cûþt±A–.?#ÍJx"âg°|Ž  Üõ+~• sy'JÝC}çèîbé…–®Š§h_W’ž<à/‡á9˜r÷Ý7óÑÖ2„W±/TÔ($îþN0²°PRI¦ÖïæÍwA{ªÎKeKkäfñLws­"f·õJo†!ˆþÉÎÞÈ;ëå†?ýýp …pÜò^Ru¢ÄcIq-Sëß t:W©èçs—t²iVæa»ªö<Ѽ¢þºŠTMCزqÊQ ü‰7~ÔFQ+XD9©QÁÙBÝUpïÃü7.[,• Å›qªÑ~+(šòXv¥îCë'—Ð(¯(k\¦°hOMçUçòDSDÄá0Ëý}Ž!È·ß§Knä½7µgï÷1ÀJ g%–Ó$’qƒÂ ôIë OP«,^€–›Kþ< ß'çÏýjŠR_ùò!I÷ôi×÷>×ÍI)>ûc9¼û]PÊörýgÔo†ö•Ë;Ó¼Ýì£ÜÇkñcªçöç¹ûòw;Ìü>úf?7Ÿ\“/Åt”Bà±— %Ô‰Úh€>¸¹såûÛm˜{}ã`Ü62wêá×Ú~˜^¯#ËçÞñoåôY¥?ëxzhe±þë‰kl|±¼}%Ó®¯o§¢]^¤9 Ž:»x¿yÊçËDaºWÙòuüúPZšÕÛÂȺÐvJ@H¥] 2:z€ûXÀ)´\cñ± Kx¿Zp+éÜGdü¯YK©†€Pµß089"ÿ>B ïþ©~¿¢-æð§>4«tböºªR€@dÝÚÞ{¾ÚU§a­™”¾ŸŠlï+¥Ù™ Ä쩼|Ñèú>óŽŸGyIH*^vuòÚ‡u:Feä˜K6-šÓáiÿ…è(Ô{»"¸“ÆN'ÓêAÀLÑKŽ‘vúb wìb’Oð”zéiGM'\Šú¬ó·…8öìN]÷ñ»è¤ïwDZ%‡<¢íÅgêáC-|š¦ž>ºãQäÜ}Júícg‹J6n~\“*jŸ™¸éÏ;1”¿ þÌ?.÷rÞ.2{=ø8pçÇÕÌØ&#/§g6v²E–Še1/œÁ»›s·¦Ñèt‘EMAˆ{yþ}¼ü.¡ñ %îjWŽ:½­©«¾$PBO ,ÇÏ[Y^¨úÞb™âÌÌñö½AéÙ=Wpg}ÄÆÞõ‡¸c$„$ƒ_,ndlü#dp„õ³Z˜ %³ª›J<(sIµŒç•¿Vd€A³¨`”毩¡®Â-Íw<‚ñŸ¿@Ä.ÔRûèâÞùÉËòNY`¾ýÁ}̦. ·,Ë»Ë`)žºu$ÄL&ãCÂ¥3ͳÔJ (S´K@G÷l?úTŒ% Ñ'àÃ˾*ÿ¾dýÀS«”»^~Þ]@¸`ë–¶ÖV$ÃL£m%À6!;¹Ç4þôÓë‡Hœ\Ïvʦxm¦’¼¨ÙgÉà·ÜæJ¬ew|°û ÁjRâ¦Gd ÈÈÓ7<ÚxìÐÀÝZUZ?qYŸHþþævŠa¤ =Å då]%™¡Q§=9ÃiwzÏú’ƒCØíÙµH®$>ÿ™\Qébýç7SÅWŽN_–ƒænøÅáí‡Boý¸ÜžõÐfþÛx8}…üø—ˆŒìË{/^{à:^½UsýÜ3Ùÿõ.zíÑ/S €žOqºtv•#3óœ¿&7TNæìÓ@ïýAI^dx6E5‚î8쀾F4ŒÐ®½çgº§¹67=deL®°;ÝÞÕË~zæ\»vdä$q¦5ÄËóꢜ|ŒBðÃnHLJ°ñ5á§£Ý<äâÍÕu×¥‚iD€Ì‹ -§=7ÂÐàúP5— D‚ë§%«^ÀÁG ƒF¨_äË%ÇXÌSibd­‚ÂmnÐã¿ bMž’>8ÎÓg‹«0¼BqÒIò³1žª­<†G.ž¿©ª\½Õjâ v™Æ\uÈt¢ægk6z;6iÌàm(é³×^‚o\8ïãÞ@V¬ù>|‡†‰Œ’*Õ:È1ÝçÏ{‹¤eLo{ @NÞ^}äiê}OÆÍ&†‚%Ÿkß|Zn6Õ·¢3”|<øRd N’n>nþòæ~n¿Zó¸âËbùñ´sò÷&”³$Ô§Ëw–sØÊ›‰T’n¶&®# ;‡aׯ3ÝÔ?çiä]¢ƒ<3Óy_>ãÔÑhuÄ;:>S}`ÿÛöÜsòÖÌÐM70‡£<ŠžŸÎëÉž¦³èìÿiè—Ùº–5ššq g²ó¿é䛳0Þ]ù«É›þþ[¤&õ¡8.xv*§O`Ž…±Á/á9„üS2À·'Þ[^CØ©9ÅI‘w8¡…%©tÑBþ–"%YPGP¬”Д5¡>²ŽˆÃ³ã$Àÿ €BXʤÁ·¼Á‹Þcqœö>ªõ„ ñs>ez´¡Vc1ÌkîO9DÐ=‡]³¿•IØçÅxËW÷ ¦¹ëf¼ ¾œq–Æûû`“5Ÿ£yßš¨™«RÍ”~:×þ3–.QëŒù$çv*¿8«#'÷Ò©õmZði/€q „†Û¼Õ†ã¼¶Ô½æ‚2t¼ÖÛÇßl¤ä¹<ºþ‡ÿ˜6†•Q‘K¾˜ ì)”ÎʃƒB¶´ÁËÍnâ…œåäÉÊšѧ'+¢©‚é¿)?>ÍUƒíQÒ"¡óyË3µ&#gM¾÷I’ž:iýXfæµlÈIÈ©ÝE×q•fDÞ^v3¨¼xf€ëMIôЀάg/ö5Iv¶¦Ù–@;c,îØ~Ki 0¬Huo ƒÓ€¼Âé"eý ^ž íú&¥˜7È»®V) - î=ݵ±„z<ÑßßMH€þ„kþ“ûóœ ¾ÍäªÑ³H&‡ð 8R2PFó8êûòž†ŽŽÏãj!W( ɹæcÕxk2*ò €ì½ƒßM_Ìc‚Ïer ¶Ñ~ËPãk‰Xsæ/ Ÿ†ÛÛezbªÛ;zCí úåÛu_1“Ý4xʳtòo ŠbòÌÛav6KfLõÏfH:© *rÓog”ÁÐåÏmßþKv¡›ï–0O´@}hêO±ûû;IÒ8ÇãÿÐëÔQ’'áLO˜ ¸?Ž—×­æŠ!30&AÈúó_Ó8twpæ¾ñ:ÿ†®æŠww‘ÅdOÎÃX>ã4ePw T¨(>až1%˜ð³-ƒII‰$‘Íç „‡Þtž'XyPv—ð[ʬ 2iÁf߈iøUh—ýÕYÑuØ.#ø H€€|•8Þ™ujjṅ€\%ëèµr¦™™2/¹>¼£fßNßhà ¨Hާ >Ç €fª‰V 8å¶°óÙÌòÄ'ꔩ…’‚"98:?:øFj‘¥©Ê—Þt`,D"ïN_^+9|GîâvÀË\„á7¿ó Cð†tE)€·2™"¾»ß®Ïå¡z-ÇÌÆ{F _n€P²2ã?_ _ÕQ‡»*x 3N Kl=«åh¿ÐаJV5’¿zÿ‰œœÛäÔÐ÷U6Bx¬§(€Ó±ß\ÒÇ›Q¸r6M'윣¼ºCêãÝö'1Œ@ï}}/6÷äa‚Õ¥¾öÃ=3rÜÿ0"¿LÕ<îu¬ÚAÌù˜=H’Ζ»Ì 7y°Ï¾`J+ýßÂiº6ÝïY°§è ¦‰”¨ÝtŽäCtâyî4|‹É`˜ Á ä3ü*ò¼gñÖð€, Ó_>¿x®96'«Ô>¾ ÜÕþ½¿ KM£Nè©·% tGU›à§áøx¤2³+^ÏßwÊͼ½A«'Q MÀ‹„  (Í\¾ž¤ Ð{F¦„eŒxùiþ ,t[~ šfOggSÿ&™3äŸÿ#ÿÔÿ¼ÿ²ÿ´QVT`d[^MIN[\bQSR^Z_Ma_^KS^_^©ÕjkŽX‹äúÀ§Õ[¥é²˜½ˆ\H8ÊöXüf1«éÄ7JxÕ"ا w À©Ž€¢v;w¨ìG› gÕgîZ?@ñ} ™’³·¹5^s(x |x¬Ÿ©òã’‹ó)àPÙ·â ²—Œ÷+óù‡Ž’5ï ˯GÂÊCnèU€V¼“T²Ã¸ëääÚQ ´¶÷þI=€tÚÇ*À^¼©ñ1¦o¦¢º7cŒ…ú˜ßˆ×4ŠŸAõS²(_À4Ö]ìÑô`º†Ì‚åî¨Äg˜‡fÔœÀ}FمؾØ'‰@vÕ; Å@ßlˆ¾!ÔáÔbSø/ÿzuê£ý˜¸¿(N<ˆØÜ¼\J Ó‡éw)[$[îÇûSäÉÚ¤ âÍm}ÃqDžZ•c^NÊÚ )jÚÑМì8é5o€x©¦.hëdÓÆXàrãÃÛ\À¸BºÈ/ª¨¸,IžÈ Ö}!À© F°TBÛ+Î .¯ä½$êðzoóz$R*^©Õv/>ëýP¹Ê‰Ê¬ Çt1-§“ Ï]·ÿô9ƒ£7ß²_^ÀüФ¨“áúщã0N¤[ ìq†ÀM’Ö›1%)!ò+3Pî–JœÕûðZˆÏ:À‚:”ð< Pze ? ÎðûŒ)O½]P€Ò+#€h06¿úÙ^ 0>|t PÄMܮܻ)ÍÐLm£Œ"…M‡ÌÜæÞ@AÈ®l@W*6*³.~_ЏSö/¹ð¦ÝB|{€*vÿúGó1lA³K)ˆ¤PVÉ7y@%¶8C‚m- ¨jX0š‚Z¯dŸ~&ô‘ãrý% c€Ä4C4û®K¯dウ?{zVKÕnh’j¢/“…£J €ÒÍEeR¨ M"ìxÚ-)ø4ýßã%¦jäY'E'0Õ3T{%1ý½'΂zŸé*3Wá ¦¡çt£˜NJ5U‡'$¨ò&ïëÈáR¾~ÄLÂsÛ¤¿§T' g \-3€ =Ï0›œšßm®ýfÚ»JáSA¸ajò €Bfôø-ËX ~™MA+;#ce¹0Š­ÄgÙ$rt”­Œà£úõ´ƒ†›n| pã¦À¼ÿp¼VrQ|ø krŸ¾Ò€3æ ¶u 5‰YkÌ$áDÐú Ø?˜./¿ú‚¯Î'ügU—›;@Þí²À2/:½ÖOû ™)ã ¨¼x°nVMgÚP $s¦Ðûü>;d ÏÈ xíŸt4šÞ,P_É×+JŠé)ä,…AY-·L>‘/Er-Uü!-}“n‘ï|&Ów°£C¼è½’Åyûw¤[û´jë}²QûC7Ès4ªT™ÈMª›=÷ÊŸ:ŽO€ºRÎìË;¹ ù‡‘·ÙöÁícT4­§ñÒ™zûW£ãsi´j[±ˆ ãÕKU ¦øÜƒx@$ Ù³¶˜äÝà\°ÜpP¾£’Ìê¢覟½ù¹]6—1ã¿ý:tç¨êç˜sÿeã×=™Y9$ 9Wí&š¾ÙE~¨zŸ®†‹__õ7¸úxÒoýjùÀ^€ƒ€¶‡%óSŒ9x¨çÈ¥&3ˆå³ÛXÙ´KÕY9þ\8^’üøèÎ…qqwà‡p*n/ì p‚{^¡à3öê0cAR Ðþ"€Õ_&œv£õçþVï;¬Àx3¶Ù¤¨©ÃÖl ÃMR2SXk-Í•Õä ¥ óâò=lVÅ‹ý3½¬álÖܵçæäY«üâÏß|ÌäBÓˆ?Lš3àzy‹‰û§…ú¼+ø¶4Nöw£º9[Àv-MքϵòíÒQ–óˆZå{7w¶ÄH¡îÒüxßè1¼»Y´JÑlÛé27‚­ÅÊÈ>·› êÕ!€†mÎ ¿: ë4#Â]òýëÉ=ryÿ;ŠR÷a™ƒ¾ö÷¡`ýñ²wqÿ{¬ÿ}æ y/“|ùhˆë¥©û¾×uÞ:pb“\¯xµ[òClD-¬JõVæC§ù+•Ü~/ŒúÒÆsgMkk"·r @Ìöó“þõ7…|÷yEÞº?Ѝýº“Î^_•»ˆ.G„^«Pö²§rX’Û0Q…«×B¸mèmeŸâõ™@ÌR)§ ò›üa'Õß<‚!S†¿}WµXÇдV<;^]w¢aO½w°™ˆ¡i&»æïÞ‡]®}b6æºÑUªþZšä EED ­ñqô ª ¯ ‹µÇR1*]¬N 'R”T—­Õ‚É(…{Ð’.îîl|êóa7›JöXc¾$*ofy¹Pâõ§&ïîH-Ž#8Ýv~"'kâ¸,SÍâyÓžjµ¶'Ô^½à‚vBwL·;ž/ß.?¶àÇ­vþvèW!®·-žSŸ9Gs‰+*g˜4;{ÿí>Ä ¤ÀzÙ5Î!åœÌ¯µ¬b½Ù‰ï"_©¾Ù@VéâG Ϻ®œ•f¢â €°ò®×;¿MË;[r;Î\cúÀª‹¼+ç÷ùÍ뢠bªjˆ9êLÌ"¯Y¤Ftf‹VÏ„8äS×Nщ’{<¿sãytvQg£mKfvË´ôlÿã_+{ïìoC¶m­}¸f]ñPò›þQ+¤„4.Byo£ª›èaEYhY{ÌËÛŒf‹«çduu ã4­V_µ‘]áf<ö¹žëÇN´UXXQ}ÒäÃcy_ÏxáäÆáëgÏÈ—S,ºV2Ù©WÜJö5Ë‚ÑêÅ AHdˆ—q C!•R‚Ŭ0Zò ´n .v\,¦ô‹ÕV;€O¼¥œÎiïšÏ.käœ#„€þ0Äô§?ÚQ×Û,¼¿m—iÎb¹·µ9ÿܰ1õÃI³Ýe…{¹¯o]]aÅάÀZ‘)¸=`d+>åøñ÷§… ¬Fý cGt‚Ð*õf;Ï„ÁyÊ}»<èE˜´œ’¢;D×’™óŒšö‚X}Óÿêþ —ãpÄT ùëäôô¡×Ó¸ç n]Œ¬—ÿwÜFõ"w èt꯵w)#¬ç•ù¯¿&Ó”H:!&««ÿóJ‹”¯Û›zDg¦Ú”o”¯¨HLÏreÿ š(šòüžQw,ðO?¬B=ΆT¯åÌ+UWEªÞ…Xº?k?í-ä9\sj€ovEžŠo©j 8?9œš~+yê©Nõ»“Eñà UÀE›ø l6ˆ n@ÌJ1Œ†ì@UwµSl #JWÏéòÝ£–ݳ§ M ZÇÏžIR7gõýW=TÍíªµÒ~}>ŠÖÛõ_•aÅvèQäï#IB¯( ¶ºÐH^Ö—ößÏ^äV«•*­ÎÙ»Åbi!g…ñÌâÇɰ²UŽ‘²M«‡dF>%¦™ò—¤k2ì[ó¶®õ ĺjE«écÝͯePS„¨¢ zp9`A­Çã—QÄB©lrJ¦_á Õ…Lìíuܲ­ ÔMýÕ}-'쿟}5 ÌyzElj¼¨hի䢶žPö÷×;[Z:NrèÓ3Zò‚eBÅ6¡ãØ1!á ýþÃ.ÄB£ ÁÔŒhªÍJ=ÁˆÒå¸Úhÿôù’½‡Ã%¸¡llšïW*¤³ßÌ¥èvI™»2}lX·Ž!ì üÞÅãXÈë@Ï"# ¬R=YA…œLüõZa•ŠÃ¡_€–5þð4Ý¥Ÿ<¬(ÞyÖ½­ÿø±G÷øoñäa{hk¯#ºv+±ýí½8À¢ ”°acÖšÒŒÕkZùCû)EÅ£T/t_.¯·sYõí ¢œ(þ-—‹+Çãy¿°8f¤™ Ú¥iVŸçŽ «•ýãÅw޽OggSÀ!&šËƒØ±bÿÍÿÕÿÎÿØÿËÿ¾ÿ°ÿ¥ÿ¯üj 7py¸ãÁVIi-k˜”óô²ì!u ›ØÇÑÛYÙv¿}¶ŒáúÄýÕ³± É{ i¿wˆÃã\¿Íå‡:ryue6ûé¢Gùæéïl=¬úÌÑ~£Û÷ýëOËo] (z fÒ£Ä1èn¿L:Tø1T‡cz€´À{^MîóµÃj¢®­V]µ¨F¦€¬%Aæ*3Ø gDßMM¤}ëfWDs•Åh–wÆPz^¢E¸É'¶Ÿ5ä[ŸªØíÕž>_Çø‘‹R§:£Ó:c}sdJI£Â¹Íô¤8V‹ÝØÈ–þp{Ï3¡ B!€”šKþùgWñ—ŒžN2Éy9þYLÄïx[}¼’pwèJ]g ÔPÑ7SG9d¸ÌvVÆ‘g Ç(ó`ÎÍ€¸(dc€Ñ_Óñ|Oveüyèû*ñ+w›;»ÓZ³Ý‹Õî÷Ì!ß]Ó ÕGûº:I43Ì:æGý¢–{j“¨’„é?øegËIâtȽ†‘ó¾H hgN'”Ü$4hTü¶hz™¡tg†T4_[%kÒìX““Ðä!“Q݇ZÂÝ==PÔHì­ã3ÛþìD°)jéšfôÁHÃ,ªç$èÒ_-%àpžãåé aƒ¦ ¢P’1<`„uSP"irJý¤óGÀ.3 {S…©¿Å–¾ºÙƒŽ@¨È7ETÈÁ–MöMnÙˆbË®VÀ~ÌM2bî¶ŒÒÛÐKÖ6o Ú"ÐÓ;:½…xHôA³¥rj´yàÙámë~4ëH¬æºªÖQ D¶³imNßZÕñÚÁd½@Z6X¹ŸŒîüŠÛ´ý|zUî¡Ç]âîyÔ”_ýÉÛ÷F‘4HðyT¶âV®b²ä; õô‹‚–ØÉ@ÌåϒűÚv–ß>¨VWE,AKºòëL|Z‰óÿ-ewg;ä@¯ªårÞ}xëU³¼îÐ îÝlå‚k×~^È€ÎÍhK 6>#{—?¶ýïæÃ##°õd´óŽáõw•Ï4û©"7×:Sý–™.ßžç0ì,_{o{d û¶gG÷z¨f‰¦â}ºê§–aH`¾K¶óÞâ½ÉÈ@öÇNüb;=¸ Iö_·wéîÅ MW»^\H"Ås<ˆgYÜLIY L•‰nüãq¼^À¾=-o1 €h’·H§×"#1§D€°ì½aÒ˜dcÜ@<³G¹é_ID#^@Àta™HG¬l•‰€ÅXHÆÈ ·Ñ³Ä2lÙÞÙ°…€Æ6?|Œ?®¹lyÑ/€€"´x"º>¼­>A‹½_lÄŽï€Ö|T~IÀãÙF ¤;ýþ7‰!ï~übH{ÃÕkG“Ž!•’ÒBk|5L£ý3·ùÀxŸQ­Ûˆ­›ÏÈûgG ”‘}RÐŽçÙ= úv©Jj•Iz6â}Fƒ?ö|çCÏwP2íç«{¹æE)ÞgyXwÆ£UãÖšé¬U¥jÄþ¤I .ÄýÊ!0,R6ß·^‹¼Àý–ÛOÅÛ‡ë_ ízØ9ù³øô5Œª2¯vñ*æ$9yÒ|`8 ¼ÌìEý¶ºpüqÜÉðÌ=Õ(ÈÎÿ$Ó0íh“Iåp¬!³ta˜ö‡Þ,«©èž«k×;‹¢gr¦cŠ·€éª6 ÉÆïçËt‘µ³v”`àý/ £ I˜eUYÆð‚ÅÛ³þ·]Øó4 yÜašÆŸ,ÿK=J?\‚L hHŠÉ»ß/9½Áq¾ÿ¸xQ;~G”ÍT2õLÊ$$ˆË‘‘Ê*8·,ÀvÄX-do*…A"ðüm,ÖŠ(<:"¥MƒÔiY° ü$À€±Î`~”•‰*—Ì‚d¹uó¹d™…•Òÿƒdƒ  ž»´æ "õ*Ú.¶HË?âC@1ºgNä¼ylE;B €™y{ÃÓçIÆf¼öÙy 8{}ÛhøvæÕ"huC€Éþ–çl9íÑå9¼Žw[”_>Úèãûß,Ù¹ÞR¹Òê Û/i™ºþão×ö|A}hZ´@Íó±ó? öš/í ï¢âoÒ2€ÄŸ;î¥5‡ìòd$(]}¡ƒç œj~ä–D†)Ý|›CBü 1Õܾuº¶þpß?ü‰j“ª¶9ÎL½úz>|¾s7œÆÊÊ9ÕÇÍ"æ´®Éíâ Ù†IMÀÖäõW̶7î–Œ²º†[$••§Nñïùy›éì>WDÖé¬<Íkç@Í$E^ÎðyoIdürè&&¼œ‹ƒIÌAÕŸòìÿwØg`èN8s¼Åtÿ2›ÇÔ”Ÿ)"ùryíßÿ®ìº¦»k éÈHüëx×P£~<ÌÐ-àê§E< \Í$äÉq€–³ìwá¶h þ ¨‡‚H0­È è©ØÀ¬z€¬µBRLo<ÜÄT°-<Ûdå:K¯cú,‹Ñ¥_AcŽTPCYG<Þ»­zJ‹ ­"FÜÚk…)"­:4þçT«8Ž#)À-*N‚ÿûà4€$Y×Y/Š1Vo­jéJ)`‡!…úv†á™÷\¶| éûï]ß|w\š&s§Ò^œÉÂîì?û}' |k4ûɶ„¼vJYsý.ø)óõFÍ; ‘ä¼\6A=8eH‰e¥²£C'$@/YÓ×ÿüp ¯ü»C:þ{ãß—Lدx„€_tšñóécß|‡ý@ç$4ÞÔàÌÓŒ|úx3O;5y·z¶ ¡GDî÷ßyïÇqã±cÙP~KnôzÏï~¨™äÊh€ªOí¿¡º 1ûêç²›™À+½»äj¿eâô @ 4;ì}çW1ƒƒ…­ò< ìdTéÖ´H ÜÙ›ó)>Ë}=ëÕÕ˜¡&“h&ºzþly]þŸ3Ô;*i7€“l?ëOD…ìc2=ÃÕL³>ÆýN>ƒ›jŠ€—~ z¡Î4ý !cáâ(¦<ÐŒþR•éZ ‡ÃpÀa€É?EÐ/0Fõÿa²êä™NùFÀ¾»-bÍñ¥-°›-rÊ£M~Ó3GóüTc 9Ëpƒî Ìÿí‹ÓÒªìÛ˜™¯f«Ÿf­ë…+IëH6Wë{ŸDD#;í½·í,+7éþ(¢Û24äO¯—;Oœ»g€Æ ž1²XF‡Z)Û…Â %IÐvõaßÝs\®\™[ÿžêå_Û_Æä„“ÍÛv5«2l½xÙLf­Jö €tZ¶:}•cŽ¥-Í6(»‘  iö÷nUÍ ¶ì‰dï÷“O\Ya²\7Dôì: b›Ž_pÿ€¸rJvªË ª˜š×¬ûäC+…:0Í4TÀË?md¾œamúDTD„€¶÷ž±É˜«Æ¿ï·9( “f#©jÿ{ÿÂs8s Ø×œa¢6d½@A"©Nœ'w«òýfX,MOÏÏåþ»‘’ƒ@tU´{8ËÄ•X¦þ;øÈÏï:?dÀPA\ÌÌß³© f¯éMu˜úÇô—p¬²`sâ:ôg¢‹d˜ýוY44­•=÷‡8¦a ˆ²Ò²tO ÎïTÃT3ìúrf¬ñ±9 —¹ý1uÀx—7 ȱÀ€HŒAo‚éöýèjQœ4_ (øß[*8. @/ˆ €^Ûmr›&éCDÓ¯YI·Íò’0Ï2NIŸ‰8ŒŒ1pKt®«®.ÈÏàgÛŽ€2mdÓŒ&åF$C2¥ïGÍkÇ8À2/ïïË«’”\×^ÌÎ_ãlÉønèþ¸ý<{&ðÀ(øPÈxªŒ<ä’K¥›oÓÓi•£T½Ùä®Üýͬ¯ )œxÚ |<§Öõ¥‹Y{ËÒ­kã 2¬RÉz È2ÐÓó[–?ëˆ WÎwYúTîD81»ƒûîÞÎøsB’Iö ²M6_ 6¯H˜êþû wø–·ÇUÈØ¡õ€i‰t¾¾wе³zºš×4E5“ûèî ICO×¼Àß¶þÇÉ™b˜Ï¾§š†½k}¦i kxŸCnD•Öþ­é¢ ` ©kÍ=5\Nm0Å3={D°m ó½wà—3ö]œé ÈÓnáÐ I4i0 Ö#š™.èd A^æ\1W+Û)Ÿ¯9ÏãŸ}»^X!ˆÈؘyÁï’™]gÉ¡Y›+^æëgŸ±.¿ä0ƒÔ ¯·TûO‡Xª£3̽§½¶©™¦¶<ðP\·«WÊW°ý„©U%è¾i.œñÔ§ÎH¨2}øÙ—®õüùªÝIkÒ$œ ”‰žÜ_žúXýo§€,Iý‹“º÷Ss›’}Ø®ìýYáBø-–ùõ‡çG]™Â®.Á°|þ¥Ÿ·¹ÏÛ†˜þ:k{\n K™±M>¢?!O>TvÍfòRåÍ@ 9™àý×(ê}u‘äý{Pf‘ÔUIb Ç-Åš†ä$3{ìûƒ:£I ì  ?ÉÕôµfÛab'ÀÛK¬ä»rÎBv3›ùs]Àý¸û1óî¤øÀ}ºt>¿¾ÎÁpoþ€J /P^a $H/€O áÜTz®‡O(À¨¤ß8OggS@A&›<÷^v"Pb]\ÿ¥YXIG_SZFGFSRRH=DFdeÿ×ÿºÿ¤ÿ©ÿÔná…ibíEȲTª¿‘M^uf ¶jbj\D˜¥è)géš-³PšëzÏøTFÖÍìCEäÆ÷Fºòá%ïä©Lóïv!ê”CgQô~Ý…±õ²Nȵb·ô8Û0çå!€‡èù±¨@_®üàT9Wh6›mí4¿l©Ξ¬#Ï»²âð¶šñ¨˜ûõ?嵤ìî­ŽúôugŸ¦_Ó·áüo6¨V÷o®W-ç]¬nÁd²?ØÎb©Ek.ÇúoÏüÌ«÷Äl³ Çv}qâ¯wÏOó²2ÛjùWí…Ó¨Ùå½jÀ²nÍß¿õÅù~¿õîþ&“yªþÛ«+ ¥åY{~Ë«ºÙ¤’…IIºˆJÃÛ[ Ó›¡eI?øþ ë÷¦x’6è…²‘f÷³{u2Ëz ÓÆÀûgµÈ“ñkn¸} íÇ.kÅÒVÔíJôËÝKÔT"„·‰S^Ä´µñVWÁ2»Ål[áÐJUåµçÝ5S `}µuËSN+kôbE8ħÙ@>üœëô¶YÕ´¥ÂÓâÌ!¦åWwÚ‰3Ðé­/s]Ãê)ÞÇ9œ0¼¿ÝÆT{Ẏ&5ßñ£Z敳I¿£kbég.†pð:e±³¨)'›«W]µ^ÎÝï¯ €LÓ·&ÞÿýXöÚ ÌSÅa0Y¿6=QVôž=¹±%ˆKåy¤R¶IdvG_K‡û[yòëL´_ïÿ_×ÿyŠq‹D`èË÷y<™Ì)BÓ™ $‹þÈdRrÈÅŸÑ£ †éɵGÕ¡UöëR=¨f[øÁ*£·Ш—g£éÄK×X,¸<9ÏM¾Öýý™4¼…©º+j*•m˜z^D÷;îècïxñv\"§‡ñ`nnMÞ€W>¢ÝMÁÊ7nÖ˜.69¶MÀÊ©Ø9¥Z`X)/ð€‘„XÀ €z@€Î×Þu»­´8XW@–nH Û6V´+ØÆ$ÐvYJí» -Â0!”àäRÙ¤ÉVM óV¨ghš‰ãÁÜñ¼éñ'/)ûjÂZ \ñc¨ÁªÔøi_ÜýÊÓªû™÷ß“ò> êb‰¢+«?U "©kÕV.´ÿ>Äе®Ûw´f©SÙS]âÔì[ÕF:P_€-àz6 }às¾"¯Ž¶í4¦·.ûßÃs­Nëh¥<4›²™r¥%¶Ê ÓƒŒ2…@ä^²"Û¡ê!Z¨µX¼r=ÈL­¸µÛz-85B®æ ¦¤`)I8h·ÔûÐÁóPÏS ý{j6GW3ì1w¶qôµ2㤌ï)€!”·žb!`š¤ru‡`Âib¯ºE i1iõò°Åì§FtÍxzæ’Ù¾iÝÜT¸µT-šÓ×ÔÝ+£ŽMy’ \&y.oËX#9¹.Ù´zéƒH‚È?Êzw‹¶Üš;æèÒ|Ûi¦*‡µ@uD2{31ì|“¨®Ô~g‘Òß8àcR_÷/œÛ>·-Á53²óïnþˆ£BnÛà9þß/SY[¸2Þ/t[®ì/wºŸÖ»5Û¨ HIjT-­Wývj%Í!$Âvw ™²ÄFQu`~»5°Aô‡ w‹•D‡^;ƒ¤Bï9Ϻ m9ÀÃm†õíódçi<’Ü'k4¾cš ¨ºTX]A@²ë´±ŽþC¬q0ß$Bóçèó`øÇ·&›¡5çÙµB\-ha<¹õ:x±WJgŠÄÐ¶Õ ŒÕñÞé˳U½Á¡$ÆÑ~¤ÑÏϺ¾]SÍÓ'wž·Úìäì²îcë°vÌÅòç<õ˜ Gëa /-QâE~ç¾7Ý“1ÝPðïû]&­å×ÔѽšÂÁãc顎)¸¼9ô™‚ì¬<†A@]çó 6_–Ø<³[k¥ïMSƒÙÓ =—”9àÞè÷½|ZbfųßDÀ|æþVWnJНj@uÀ¼ÑLŠkμÉñ°ìd Ð`îbjä³ûN7¿ræmëÉèž¼dѯV ¢’öý¹ÒKÐ-?:ãQ½0¤Ååy~¸«ÿö­ˆ¾š‰ÏŒ½‹7RÄ”q?€²Ðy_¡¡¦@©M G´[€ÁÒLÝ; d¡—6€àLʼ€,6¬ƒ§Au6 ©Ÿsp°ò³£FãàFÀG®-ÿÄ£>¬mfŽiĨð~¯U6€º£bpxž˜ 6ï›hç¨Y-BÕLRfgæø,n[V׊®Œ7Ý»ý÷sÍXÞÜ»Lvh5íöì ß‚G½4¥Ù3M™ïwÔTVÿò›³,^Ñ.ŽMOß.oæt ¥°Ô oѽáòu½ T Âñó÷eض¤'¦Èß3@¾|!-£Öû··ü<~k99äìšþ¹î‡ Ž»a¦ü>35¿]PÐ’ž`dœ}ðµŽéîÜöä{RRîÂP0Ó0¹"(ªvùyõÛç”3›‰`¦f(¨úˆ·›î«§ºäg†©|rÔEšÃݧ&“ìò÷ALŽ€q½újih€œ‡ÞŽ¢‰40ó°‹áª\F5Û{ ÷ÓÐÀðLž™àOggSÀi&œƒ%†5¢ÿŽÿvÿÿ‹ÿ^_\ÿ¢HMKXSVÿªÿ•úºôÏd_Zv©—Ý“ {z(rèÝÌ›½aД ¯×ÊagÏ÷ñâÊž™öp ÷cîî·g[[×ø†ªNïOXŒâ¯çD…[ä¦ÁïyþíêáR‘ÃåÕUýÌ®Ÿvþ\F¸dÏ£¨œ_ H°oýSÏÀÆ2`ŠÿH ×…ô#‡øBó99郅ËQ£»§[.š¨O¤EPÜõ%!/®Ìf#>RLà#&'ݰúâRûj´ Ä¡¹œê•Þ}4+4í Áj÷çïè y`jØ÷úl:|´¥”È%šðÿòÈ?>‘KÇüû]ïgWf÷á­úIÃúwäWªýVæýÉË!ä¦Û0êâ>¹F «ú¬)½ºH°¨ÏAû–áòΖÒe¬÷“ÿâEÜøü¥cR%“P'bgØ ô#_|Üì:­¡§&‡HŸjZ+K÷J&TÂÐ0 Ü¿•ÿVŸ2ûÆF 1@0ÛË¿q¾ä2¾8w‡˜ë²ýTÃ'¦î§³€¤§xþóudçcË6Œ€é_s²˜4Å]A˜ë)øŸk·ÏO‹aè¼"Û ÁPl2Û™›"«Ï$LÓ1p€Ž×„€,G´OþŸ…©µgì¡>ašÄÑpÕD¿‡] 4™ #0ÖîïÈt:r5÷yI{ƒšÚ½ö &ï믔b#ãEüz:šk*ÈadÀz ÁÚd‰]‚²©ÇC2¿Ý`ÄSR>Ìíþ•Ðg»¼35" ¬žûÓGÑ~žƒâaà€ÀH¼ï0ÑQ©Ê" ðæÌñ“Ý1ýÍâ<ˆÅ*çp—Éé;ûºÞè_Þïm¬Æ÷ëî´63™2áÀO[ªJ²¸EžÅî˜6Î r'»c¡ËyßÇG¶FÔ;³G(’H6ôÔüò½B¹ÞM›üб[B6ïS3@èÁ‚Éüˆúß}ùÁ ´!OŽžö¬ïDµŒ„g šLzfþÝSª½s.` ‘ÃߢvÐ+ »fΞŠùgL~Hïî¥70›ÓÞyºzgü ìG–…µêNÖ>ÉÝg¯XƸûäù½º²iV¬‹QoêƒEºÇ7÷Öf+˜ìH˜xí­s²ø•‡)ªh€B Ý5ïòCí.¢þÐÃ&÷Æýy¸ºãÕ-ßkaÍŒ~Y0ÀKæ”XPFEF XìÁ€É?pQÍo ÌÜ3î“ ¨Õ:úLÄeB§g¡šÙÐ ðx%mø>ÖÙÐ×8à…mÎd¹j«¦,§P¸Á„$ú´ÆÖ™\ ò\/ sŒcs6Ióîô¹TܾvÆ(¡ã;èj‘ž½Ä. æÔ¡4—(¸óÛí jÖÌË%ì ÎÀäîÏ—-ÁÌgÓ³ëÖ·;!!èKš`¤ùLRdh‰wî#Ø—ä’ÿ^®l`‰ÍçÙõþã’ï/=,Ñ»Kož;£ý›ôp9¨{ƒ;á½™¿øóV¶5o^¿›CH¸þ僦‹C<ò@‚©Ù7D"~mÄÝ8½êwþÿ¿¦›Iæp@ÃÑxæŸû•çÓ=þ¾?³{zŧ/·Í&f˜CæôTÆ­‚Sعù÷â/»×ÍÙ'³€ìÈ:ßSIR@2P$y² ïzú_ÑI ðSA·»¦ÆÄ°¹óHø¤3á—x "ñ…†î+d8m„׊@@„^ËõôÕÎZpÖöøˆÇeÀžåáQ~ºr‰229Õ¬w_6Œ[ö$ Ôf¾ì´ZX¨•–""IòûÃvŽï~&㮫è Ïgg7ûÏnó҇Ӭɯâó݆ÚÖ³ hçÇ${ PZ²P’kÝø:ÛÑQ£¤sÑÎE+2åù£ó3¢#ò7 À R``aíÚx.q}ÿ&fÚgo_œ\ß$ÝIÁôû4H³‡ûµÞŠõ-êÞ¿÷É Ù.P<“ß·Ý ‹©#˜pæèf#wʾ¼™7ÑþËþÜà`¸µ6{ºSE2i‘ôs¶ÇsƒLl9²mÙ½ú˜™ÙÄË”û(Ågj€/»EOîäÐçaÓÝhSq•0Ë$ßÛ ½é¸¨N0ÝЇ3ý¯YÖ¦[os1õ9S¸¼EÖ3Y3ÛtM4=¶.n¦xåŸ{Yf×ø× SˆUHP; \ƒ, <ƶò-½Y yU`ê‚Bëן$VýS€6Ëò•ð ¸…@iÓwð˜àèpK< M h`&>–Ëš¯Y-B²0a1”¾G¦ÌÈ Ö}ÁzØY}HUO.K^¤#wbà®í}½Þ½8éÒž”Ð6N·] T¦ˆ„¸bîão;ïwÛ¶ŽÙm¼Ï®1÷Þ†ûïˆÏà Ÿ§ú²¬Hï±!Jæƒ]ú··ž<{z—çË…äA7ê'?‚™bâ¿ðCNdؽXt{ÅÔÓÍ~eðîqÁdœ½bîìûájŽxKºéÉsò·N¬ûàý¹€j_êÇ\;›2Óçª.nÐÏÍT’¹Óâ¦è¡á³¸|&ÏŽ)Š‘Jƒf©<Óf¦ŽFU¨ X< €HN¢¨æpN@‚øzà©ß9€Ìz͘½—£Éú3+¼àß`ºÿkvpkƒy泟‹Ï·z¯Xö¿µNùù|/SjƒƇ^Þ/üü|ü’÷óã©ëÇÙÏ÷<AVÙ úøNäì^í\²¶Õ*¹ÙÄFéŸÚ÷}ýÍ}Ýé¢ •7‹¬Å¯¾¬žæ£5¹ysÞøDúçOéßﮞ§¼tæúµCv™õÁËŸÇm)ïï–@„$yŽ‘¦òÆèG{œŠÁ¡I‹ôÁÉÖ¦Ûn˜íX›ïìpØ”ÔâªÇâÛÍ£N·¿©ê/?øÐ½QTǰÜüËÖµ2T©Ïo~I6®}ÑlŒƒÝop¯1ƒz*2ņòÚ%è-¶=GN· ¼…º `-æpeîómÎáÃl4 é*›1(©Ÿ¤˜9öÍH+ í-{™‰ôk±ùÙÁþ1ãpY׬:½¼Ël7SsóÔ/O¼h€Í=vþ¸+ýv°'ËØú\ƒ´ïY=¿ÐG-ìŽ!>ÎÓEÍÒ"±±g³gµúååÕÀe SÑ´ýé–sÁ¼Î%rpÎ¥²mÊšNï! †BŒ~È—/þðã‹ “ÚA¸¾×æ{]¾ÝMtÆÈ­ïóiµ)å»N’I¶ÞèY_3Řpr }ÈS¾«Ïv§˜$ìµ½œ®•âx]‘“´ÀŒ¦;«¢u©Šòñ[¹[ï\.Ñ0ýŒtp_@×™.`ïî²hÔÙÏÏkæ[v²@OÝþŽ)<(¹È|DO>픘—7(“=›ª½Tò“û®d²€½á5EwDÚÙ}õ´À4|ý•a&Àܯ‹€—Y5µTçÔÐ.Zt»FXc»Q‹HFR#Ôùh=&ä†EŠIÛ‹ó±K”šÕ½A€0B$“d` ëŽÀ€Ú.½Ñß gád‡Ôaöbñ‚–ÎmaÝÕú}·ÒŠ3 À•ïÇWÞ —´„6"-×<^ÉmíNŽÃ®>râj›ûxoÔ!rž¿ìrÅëÍ*³&z™×§~/™IöLcûýv*3àdïøûõqã.åZ¶tî\*ù48YQÎé]º'£!G!kß–ýbîcv×åK~|ÁÔrÁEÕy9ǬV|€ :Üá P6…P; 5^k4Bª´Þœoî°Àµ¶íPMÕŒ'æ­u“w÷q8I=Y\ Çz’r“ˆ¦6óÒ%ïŒÜE|ÈõîÌ—+õ/»E/pѽgúÐ}c“yÃ[g&>–ûDý4ËvägÏêk)2»òšØ*GÖèP:%¡i œdÂHj«qÙi˜\8 Û9@—lÏÌÆV4“Ôº¦+Ú­ Æ…5ëÕS6ÙÇ2+cgBDõ®ÿú(S„tV3Ÿm+b‰)êªx¥v_2Ç¥ì8ŽÑ•à*”‰ë®Ž£ª(²T·f¦:À“¨0É®ª—aíÐ$2œƒÕ¢NB‰N„ˆA×QºÜùƒ¡[ñ n˜@мdX;̲Nƒ$+×1]DÆJ¥R—Ëž‘fAˆºÖ˜8/ ëv` –X–)AÀX È[0tWŒ!B‘š@n5l¥q{16XCKEèâ„b JÞ•tqT t†&Ö= bpNJ-·íqPÖhƒœuغØ膷Ih,ö…:B÷f.ÆÎ£’«×zöcüŽî§s¡3n`ÌmŽ¹ÕºšVâ²K)%0œÜkI29^MÌbÂö…±ò±¼¸(ñ¿Ž9zÎ뿾%ø»†ÁZ©Õ¾Û¶ 5)¹¤Úë¬Ã…2ù¤!'èd¶f g²ÏJ†•2º9Hd\àP…õºV­‹>¾aê`sä(ïØ•Š˜‘œ%š¡O‘`dý1@ ÀV+ ÙM´> º•Zs-äûý2rT¹t¯Wñˆ 9(Érm %í¸Ó˜ ì¢õBƒqgGÂTwõR¶¹””Ò;“3JM-X w@Rj¢›¢bkÀ(F£2Éd/Ni@Eˆi(&éXŸwg>((#3&‰ƒÜ×1ýŠÎå»=âÁऔ Wkæ@ÓLœÕ¦~êò¡UkUpcÁH¸`aað‚=ÉÂ2D–(AÐkÈXfVy›³§ƒë€`Tªaök’BTQIÛh—®%¤ÇÓLCO%ò'™n{}-0OggSÀ‰&^@ð›ÿÃÿ»ÿóÿÿÿÿÿÿÿéÿàÿ~Œ-ÒŠ›F‡‰^1Ö›øNz·3ýˆ½kMz'úúü²CTàJ,%`lëšyáÕ².WzmŠ#¦ê:DL¨s2Ö_Šm¬?s¾9f¼y»¶×xtå\,¢î ¯ß^Ç<9û ;=z¾@W,•!Á;lç“ÏSXÙ¬…†zí »B !gQrÖ–Ã]>ÊQÌN$g»êâYìû —õ¿oŽI ^T¬= ”–2¶ä—SVZ¨QåRÏ…K¦Àµ$3W#Îû¥Áj»‘Ȭ°NNÌÉ©®•é‰%ãj°ÏDo7Ý.D^À¤*Lš¬o–‘=zB38ÿnêJC§˜k “Úcb2ʪ» ðñOk븡µ„VmMÖÛ>.U"ír˜©*e4DãÝnÝN™£¤‚a„’„Ñ=|­ûe(^Ôt]QÄÜä²ÒV êtˆ4¸gÇî›+S”bok µuˆC€~Èç´Ì@× D;º#aL€A@-[ädGa,`1  ãç¨åIßM“DÂhI²Ñ%¨È„)§'€ˆež›õÌ€óÑzPˆ^nV›ÑÁÍŽæN« î3¢,âlýFîµï²Ç̇±×Álx}b•Öª3`\}‰–-Ÿû¶µ~5Ãs*ÚÏ܌Ļ~æä_ïéTKíÎ/õ»¬jÔ¼Mí7,mGÞ2óÙ]C_ Þ[äÜ iW{P˜f—¦°YúYÌ”ûT]°I¬ø<2’ Û>{ÃrzN³ÉÓK*ïÀrwãNrJ Ô\7I§”pèLº½÷‚ήGîZÖø2‘ÍÂ&’ƒq•®^„­ewV^°u«–AÒÜk^èÓô0U‹mê;µÛÅ2mÂäI¦Áö0·zuU%‘ Óú"'‡t–æ1xÆk|Õ¦³º¢6nȵªš™Òt”ƒ³*tD/ Ù1ž‘n8‘ ‰4!zN»duš¡p¨ÈjµzUýâb“ü$dPLS×çàŠu¦É–Å8#WÕmŠJcÃèPÏf²Èš·[‹·éA¯–Ä"¥ €k0p0…ã— D a X&°×ÅZ@+*U:ÙØ_×wv))o¨Ö’Æ! h Ú€>œm²Fâ@4Ñc{J0Èt"4µ¼%À-Ñ«hx* tàÆã°æg`Ýn°-\—;Àv± =€½s=c£†§o!&Bnn˜2Ÿ±-É>¿6ß7wœ‰^PÕVÇrÚJÓùÌ2Y·TŒÛrZB΢ÒáCºI†êŸ|‹fÈ´]ÉzN‡¢‚~BÛáK(Å9tÓò#¼¹Vž#¤%\íÝm¹øR(Œ[0mT…¨‘Î.hö²BH}” xÙKަØÜÐöõMã÷OŸ-m&;–?Ê Ü „vù¹LÒkŸ‹¦9l\Ök:,VÊ›Ìå@0~®ö¦åº‘N”°®,;rغØè’dùs¥.u†¢ÎŠS¨˜H*¨Amµ³,:ÜI{&ÉT™Ù²ô”9› QÞíÑ‚€Gæ°€2Í£ôL+ûåìë´mûRzÆÑ«DŠ9Ööš5‰F³Ø¥(L ™èFz’Ë #«²3x+R½q—Uë–C¬'¥@u…«® ëP(4º´¥€ÁI|¬ -® NEpè  ;²°â0Öë* O*Œ±,TƒkÅÂÂ*[€Ažªºî@.Ĉ¾4.þ›­¦$¤ÑH‰ïõ*A ’€þOSí=e¥þðû³¦×xñø·ÏŠAç`·Ÿ4¯ý Ôs^º€pE œ€qôpa—;À¾û“̯Ûî/8Z°MžL;ÇcH,yÎ÷¬]½™{¹û©àPàïèæCårÀ>|×õ@{vW\ 9X/F¹;ÎøÚ|(>·EÔh >{¼exk^‹ùr*Ýz3°õv”ÒKqôZJ“ÀÚ÷ðó£^s7r(–]K!äRª‚¢"ÚºŠ¸œŠbC 4Kôêu[Ý‘½GŠB¬ü{ÖÐM@]¥k€¼çdÍڳβX23—ƒPHö2íšœ- ¯t½¶G!ÛõN³SÍ,lÑŽ®‘5ãE„Rî¨Ö6?ôtc*ÚÐÕ:•Çîea®eð†V4(ÜÏZ9SÑ6™Eã`Ȥ8 1´“t4$e Ø ô%fÊ+f¢Z «“„ÎIƒÇ"ÉÄ€aÚú\ÚõÔþ\dh£P=$8¤d2EoL¡Ç˜™­\«ä\2@l+*aÀ@Ћ,2™„c -†ÒbJCQ'“(·@t=© Ø+@E[A/ `V`Љ  MæOøat …žŠr×ÀQþ[-nŒ+ƒŠYú÷Z£î© ôþ‡èg”»\ýüá”±ÝêƒO(ôek¾ýn9ÌoLöË<"Ͼ. áœô°°'G‚ú œp'Î2ÀàÚ>/ÀÏm;`^ ˜Û6S6—$@HNÖ>µ$”ö¾ó{Õ-â)W§æÑî4¾>®¿íöúÇ`š¾“ì3)/&ÊS¯ß¥3×ì¼v @q\¡ñ˜ÎMJñîÙ TŠ@.99f|XðÑÕD ½6·ÅßœøÌ8îÊA#9u:žÜU`L­»M̪õü,®J¦øqÎ3ûßrTÉfýl‰ÙŸhƒ]ÍC¦€è‰™œŽê‚‚bŠa+^›üG}BCl`Q¦£Þ¶f¸õOæ³#¸ž‹y1ALèεHl¬z¡qBªgŽ€ÍÓ¡Y/ € ‰‘9ë‹4šT Ðh’sRbŽ4ÀÌùÎîAUžLX:H"¢œÖêH*Ñ5 =˜¤áqÙ –må:†iÀÚ&è„z†NT¬lŽp­l›G¢/{ÁžŽ¤p‹Œö¢ÖLm€Atšue(xÑ®*`‹1 Ö jTUP`}AAƒ¨ 6 Ú1ƒ*¤Ø[€ŠN@4(ˆaÍÀÈJ-¬ª €AtXAÀ¬0KX„aÍ´D¨ª¨à³€2>‹²Ç…#˨“îÛj£%*™Öéd5òÿO@4¿é<ÇnF囇<û@磸Ï_~{¤™&À‚þî²þŽ®ÃÜpBßÕóô¸Õ@¾8 SÀ~Éûô—þÑܶƒvqåÛÞé’@î{ìƒó×:½ýdÞõò¿F÷rà 9ï,ø/kçnäðcÓ | ç6׋BÆñ'€°1Y¼dr2„敆ï—ë9ÛHIö¹ÛèA*°¡pJñH>¿Kñ Шÿ¹ýu4ŠdR©ª¬¤¸©*Hú€K\@¯I2Ÿ¬Û´å!*Б“=ûôç5—ÃÒÊ*›Ô£K…UÛp$Y-ìòõT´X¿OæQ»°q˜‰­ƒƒ¨SÉ~›Î ¼((PBËe­µ§1ؤ¦H5 ˜fn‰„ ‘zVÇŒ1@–¸b ñ*Öxz"¢¤+ºX4±î¶‰>PR+‘…î‹Ò3ì=A¨T”fz€†„ZGê0i‡òT1mÈ6šŠ2(*j1X*#ûº WÀªM94F,\k,6T ±ÑNEdDD±Ì”´øÅ 9€ŒmÑ(¯±# €XÉÓPêŒaÝPD°na‚ q$€€QTÑ6€RTÀD¬ ¾Šel ¨ ’¹¯T[*˜vÑà±ý8Ì?³Çh *˾•ÿ]“1Æ#ÆÌ7€6ð ­ð0*ظfLì·ÉÎøqÆ1ˆ3mpîlÉe¿f—Î 9=•O¹$ A1ÍÚãtyé=¯ýrT{ î~ïîAG7}ÒnÍò8C×jŸI‚Èåøc@sÔ»qlR<²,§ã@FÔ7à ²›±½ÚÀçæÇ„BÎ(PŽ~ª½ŒŸ¬<ÑWßµÆÞÖ‡"´”BÈ9Ô:Jˆ=!žÈð%gÅ{k¼í™h+!£ T€ †ª!(¢Q3&B5ÌÕ¸¸vdªG"„¬Wî÷ÙÆN)‹sª± hQšzùßÎö>]˜ãT@Ñ4ìfzß è*qÚžPYˆ[w$yɦƒÙi²çÝ×Ç µ5k^40 =€@­¯@L7€GQám™ Ð@´aš¶Ú)ÌR«"aíUÐ Ž`R€^ŒÆ2mR1*ëXbÒQL ̬™î x<£ˆ®±u@4r‚Àb¬±è–â” Ú`@kª »¦T V[`uæ%@XS`4˜7ȺÀ*Q žZ•xŽKÅÂ`­R#Z¤ Ú¢xøŸ…CìÜ.†ýOg À@îÚ‘\ãÆû}€vo8'ݦxŒ oÙÛWÚÀâ Øá/ø±ìNï<—>e ØŸ5¬a¦/þŒæœWÌ HÀ¼äWóĦYxä”´¿:>ãÉm\qê5M¨R€â  ²Þõ­;žPú>©ÜâúãJ2Y«Å\g1ŸAܽ›ª´õÅ 3ÑøåBÓOæéJ¼æ, Ê¡Èx£]O}:rÐæs¨¥ÿÜjm+@GäÐõ÷1*0ýUõsƒó6êÕ,ÒZâm®þå’gé©Xöº¿µÉtpª(í–ƒìõêt½Y5hPs¼Ø/ø^µ&XGŠïÜÁj5sQáª+ˆu(Ð൩©4C©Ê@s½¸šÁñ²¶¤¡a hsŒÕi™hfÏqÍ ž`0ªk,¼PÓ£j,·—¸Y»èpkf  ÖÖÔP€FŠXZX3@E `ÈÈ` K£5€+DPƒ 1•^ € @EE@§?Y»;8+ ÈÞ%ÃE™þÒ*´Æ¸ ÎÂï6—`ö>A¿ÿ•Ë ×ØÏø´¸\-À~HôqÆÀ™ l{~6€p—~ïFícKI!Ô?Míúæ‡"Û½7ãjï²§_/¾’ýƒÏÝ<¯½•œ¬jO ¨íäâõý¥4Šæt¯^öÙm‹²ýX´ †aP™„†ÞõïëËjWuÜ gZ´ÑÞWþüq™ŽÁÏØ‹WïÑ[t"AC‘}Y€ÿßé»*¥ÉmA˜„\ÿN¡).ng®ÿ”è úû΋"®çH³WWãÒ°`ÿb¶€. @ê®Ò—¸ö²cÀ¾5§S·^ ’çó:”÷ØÍϳ%F {¿þ³v**%2J…”X6}ö§ùÆS=–ÃÀŽÀRЉ!tbèæý©œF=ÍÁ]©÷¬½‚dĵ)÷Ø?Б–ÉÉHíÀ÷ú¸ñL×V•,¤ºÜK¿_š­]4ºäŠø è.Õ}ÜÀÁš’6E4!bâ,¤ùLÄYü÷¥"¼>½T²g,^¯”v i³o~tbD°ÄÉÀuòêµRìѪ«Þß]LèÚj+Y« JsTWéW?ŠÖJˆÖ´U¥‘ 6ªaW-ÝD^Ü^…®Q ³Ó†¹W4T{§·¢M8À…ûN¹j-ÉÝØ·²°ÃÐ,q½éÍ+§‡Ø'2½Ž^*€K—•LÄ¥nB±Ä€uªÕŠÀßÛÔ^i¬¤£8kuê¡Ö:¨ yíD©Û¼P»ªÅ Jšüúâãùàl{§ se¾ÌoòfÅyýÇqoÏãž‘bÝëëççD­/N"{W=O½k}¢Eûïå”Ù?^|~y‘oÓU~ìbgÒ²S™Fˆ@n%M›û$)`ÌV¨Ä–KoR¥ãó%u±ìIÇZlÝÿ½óÂeWTU=ɽyÑ ‡\ÿ~þ2Û—ôåñ÷°óº÷wÇò¯ï³~??ö3·¯Œpý zËÅÚÚ@µ9— d¢ƒ‚ÍŸâ¨ÞæÉ£Õ8TæÃ|×^Ì?Žêï?¾ø¿Ä¦¹Áâ¡Ûð³Ñ¶~¶V­†¡@ŽãÛËϺg´¼ôÎå8rÝã¦uÍÄì{ 6Ç£ÐZ7™ûù¾ÆÉ¤‰ R^e†ÝêRQCGUOeCP„^H"…Z}y¥’߬A¬¹×^ \t2-®K}å1DG‰.Znx$H3 ”¥ÔçÄ »¨]Fä!ç锌bº”RèÁ×·æRv÷G& ÈÑ› ®nYï•Iû̸¨hç˜ZæÂR»<Õü乨š›¦9”â<0EÝO’P9Íö‹ÍÀÏÀLV5SÏh*«&èS8­›¢ZÕS×Û¯¾<÷!l"ÜYóx)õOêë4 ‘ 2’3óõ<G[ÏôÒçvJäÖO¡’É1CbúÌÏ\»ÑÜù˜4X€/(ˆq'Ð¸ß à€‘c-n„0FnÃ+3l°âÃH˜=“EÁlåͣ„€ÙU0!)£Ýr¡ Bå2ﯽ‹l#£„†'máâ²_óf^/VVøŸ/üùèÁD¼¿†v4~ÌíÒ€3 y8[ †ðÉ  ÍG3Ûûù ÄWcÝ£Ñð¢3s­ ÐßX_ ÚWšúÊfëF5ØÏ’®&B¹Ù#%࿇:ÉZ¼h^õaŸ~[¿Q2F×t:ixæ4Tüùþ޽û;²‹Ì¢]„/Ñæz˜n’´„Ðù¡©ôÎþ:‘†üòg®Q©ü!;'ªí«Áµ¤ñ…ØÏŸŸPrè2ÏÔ[MQ(Ú8zSkôçrVu@ÅbÙ‡ p—ÏŒžfsò©Ut~ 1Ùñõc˜_1q» Ï=“Ò¿©éùÝ0=Àa DÓ>®±¸qp_VÁüœ/.(;þ§(•?5ä$—{úß”Û3Œ{Ÿóü»^$·›aë«x˜ƒ—€}zöW_E1Ù9œ “®¿nî·ƒLN“ø§`±Û]G,4ÍwïÐ=T$ ¶¨6*Ô€^¢ø½Át‡ ø;GMÙò iõ%8x( hV qƒŠµ <€×€Á€iX|ET¶ø‚Cíd ë9ÿ¶ŒäY§QùÒ .d0¢°  €ü-¸B«‡IQw¿×(<´šìNšš $Àǘµ7"Z»q¾÷Ñó€óœuàû¶Î­_óÆRJ¥#HÀ0ÃuÉ2v·QmèåÂ"‚õuÏnÛ‰÷„~\k×e_ݲî‚ÓËY¢ GEôºG«(Ý€'xFŠL>@nüÅ>øëô‘¨Ô‡ÃFäA·jIé ëü ñ½ã¤5àõU?'ÓÔÑ‹‚@: M‚—^x6A{•YPøö­ýÌìä&e|wôdF3l£‰pZ–~æ{ÎþfòædæÁ¯?_öýÂö|m?Å{¾èÎØ»ì˜+ãc_Œ÷ÃÚ{íÆõ»Ø(“t X?’“Ó30êW­e“g÷Pû™/³ÓsWê.†“Ýï©ÙµË1‘î ÿøO†›úÄB Qå¯?ÎÅõ“='Iž?0 G§¶Ë£˜ÌY ]ÕÐPUÃB‚@ÿP0Þ¹í+ÜÔ)P’‰ÞÞ kOÈTq@œ0ïèýXùÛI5± ;bJetÜqðã:û iµHt)tÄ7ù)%*7@Ê’Ò©«,Î i7$€F¾N‰o[ͳ>ì]hIL_p6± {}L „îa7 KÏÿn´ÿçlµ²ñfMÈ7ÇE³©JðtqУ é“ïKcsFu´&j5TiJÔÕ¦íM3r ¬¹Æ ²Ú¼î¸Z¹õ‘—»óI1<ûg•ÉÍœã´o—%Pœîøî”Ñ0/?Œ«2•/+DÒùÉJ "X¥ŽŒ!†»¨ÍâåËP^ÈÔÙÿ??xÙx©Kо èübÊ+’«oc@æÏmªºåŠ1Ìm 륚·€PÎÌfˆ—9ÿS&rŠmϲóÈ+MÒp^'}Wç!¹®þmbÞ6ûUa(ªá}œY4×,_׿rÇëÞËû"-g 3i^²vžœYCÂd¢éÖþ™Éj_¥==YîÉeOï'×oÍ*_;n8T£Êó§èüN“—£NŠÎ·ÈÞ@Â!3Dï&!ŸÀ¯Ÿž{S“Ã.fÎ[=ü\™õ°9*?ޝ€éEHnnóÒ– Ë 8 xv#D(@’± ðô*ÓOó€&ŠÀ³J§ ôݤ9™@ åãÆÇHž À6ašl ²À´à¾û-`ÎlÁÉ0 n³^Lq "üÏ”Eܘ1‹ÀÃâAÖþéùyF¸R=[>÷ÑÖïó$š©i( Úû-cì¡É:çƒüê¦ e?/¾ÄæŸýNvË„;ÛóE|ð½Ú,áÅâÉ|î.&~ñ¯¿5ôèk¼ñEŽ_ “äžÚJ ®ÝƇ[oŸ{>pkPMDýïžk6Ù>X¿¿àÍÄåêÑžQnÉ·÷TážL7Ðú7•ËÀšGñÂ%ƒÉ©;9à“ÞÝ·wùl¸a³;X¨®8ÆuÃõL¼Ëݨ§WN3½Ÿ¹Ö›Î—½1Íw˜éÚé™uͨ­›ÓŒŠ'IØ=½ûÌ}MW¾T0]üÀT(À½y^âm_ØËßÄ˶åd€ÿ(>\$[O3ËNg®Z+{è™&Ga]ÙÅÿ=Itö"g9YfÓûëð)Ô˜H`fßž*|u}SjlsðI ÃÐo[3=û˲ð™h-ª³H?µ5cDðn2˜@L#K–c ÿ,)0b(P[@\7öi²EØõoó` –ÎŒ"Ê»’ÑÀѹ0¸›÷«¡þhƒ‚^;NèÌb20{5bN5÷™YLVÑ,€gvB:\›ດøÌšŸ€Ë~ÂÀ¨1|­¡åUÿ+Ú³âÿ™öW_FæK5î’ÐÚÌΖ[蟖èÒ·MJ^mÓ¯ž/=ßù€ §‹%…±6¾ð¹Θãž/Ï÷ÔŒ'„„è¥ÏÛ3~šï­è[µAcE O&T]`œ&œp|y\³ÞGwí¤:ÂX Bíªe2,“lçò¸MgDæÈ1ÁÐwÞ™Ô¾*|Ox!{3¨@$[yŸ?IÓN% ÛÑAÊ•èCï©}s¦ºé2Þ>'öí²%Dµ4ÍÐ$L“–-Jÿ»Ü¯Ü'ÉtV©—·¤¦‘­ÞLÊP"%\‰Øû š¥)cÌ¿»o nž¯¾éôaü{Ãrø1#¥°5 âèê—ù2Õd¬€û¢Ií] ­ê¹¾ïëûòÚÓþKúŽ¿ªˆNTg¹~\s9¬;ûıéyùÕ&&:7µëšClΞ^”Î!äILA1%óÜGÀÇv$UŽ“, õf‘•½UÉUµ.7 18»æóÄÙå]/ˆE`R š3ŸÁ­ýÍÍÎÁدË}b0z_=BTœ«;Á>a› -F°t` FHÐ €Âï„ò¯>+.à–ÍDkàkÅ:¼ÑÃMÏò”ÂMJ\88Á¡À¾]5`îë:-FÔ›©ª$ N0ñ„|Iö¦íœž™Ãö‡È÷0û_-˜Ç¼Ž|S| …À¡ƒ^¶p£>G&Í©ë{'·ùy¿hwm塳¬¼ÝÞþpÇ,ŸÜ´yÖc$æ˜ê xô#×{oŠù ÙH)ÞZ~~5HIgì`cëïßÓÑ&ååÜa˜w^\^2’äõ_²-·¿ò¿>Б†¶>JG6޾ki'Þnü‹Ý΄‡‡wïŸzVtÝ7Úµkša9_ùRs¡ÕóEµÏ눞Ù‰‹úQ†\:¿FØÙ,ùYø7¢&×Ì3h*ã»@U¯Ôç2=gÿ"š±|ÊÈËŸë=0 Ñs4ÙJÈ`=Piø™æÝ“vݨ9n{ŠœéXtL“è†9 YÓÔ¯»ç&ßòPÿþ!{dÀ<3£ãë<¡84LV6Ãzÿ7TüýXèô4PƒÌU)ä­.¤oH…5( Àþ*Žà‘) ˜|­VG· Ÿœ**ˆ?Ë“E®$ˆàCŒÝáûÎýYï?IWt”ï'àv²ël—aUSJ2aÃéìÿ3Ìñ´³’îÓ×½|ís°A\­u$ß±ZÈ™/Ëy'Vþþçìw8-fBP|z7Ìæ¡dä¦±Ñ î­ƒ¯_1ßK¿/1_|€ššj¸ã†.ûß% ^ApñVù/òþE DÝò‘ÞºSåÆë‘½·;Ž7á3}Ò)û}žŸŸ•!ïÖYrFÜÅ+²=ݪNjY¤¶Uš$Ìâûº©ÜŒ‡{’BÐÄ)¿¹%^ä£ú\Ô,¨¥×¤úŽ4}ùŸ=‚!ú)ÔÌÝÿ<ì"Y›x-½• 9!M7ÍÖ¤ÎÓUÕ¡Y CRUå3e“z@Ðl?ö5Iú$äæncÙ AƒÏÉx§®»¡’, ‡s*Otqª‡ZF ŒìRдæð9µEÐ Ô~ÜFDÒ_ bM*€#i<@Á6*–êkMpÀ»™¥ìÞ­œ”ýÀð^«ñòºœq8àJî…™Ÿ€K¾Ža~3Í,¤d’Ö+Ð1¬cŒ¿$Ï—?çGkÖ|kEÏ;.3ž@o°Þ4ÛhÙ‘KÐ<—n†Z4ç.Ïùé_ dDÑÚ^{C0€¦z˜è¤jöñïºÝ¯ZaUÁØuv=iHÃâ¯\ýuÿ3ÔD¿€áàq4ŸÆw( ûØ¢ëÇ}çföˆ†Õ ÒOß—~> c<|ò³:ùÃóG[yþãXRÃ@—Û$xžs5nF>ϧÛiÜrܰ[Ë£I+æW™Í™¤@åð;Áûg$@CïÚÏìwo;=€ ¨ÑÙúÓ8ãvÞßþó@6@FàëGJDŸR½~W2Ç»ezÔ‡÷ìv©¶”˜2‡Ö”ûÇoN½óW÷NÁ­VBÍû9mqz³l@täJ¶¿:~;˜Œº „a)`˜†¬lO$$ð— ‚´”è`@Ü’Õ\Þz‚jÍRw¾¬FX­€0çÒ 1~”±)Á÷/=ÂKjÝÿô29üQT0ÿâRJfÕ{^½¹åd¼lø¦ŽÐ‹™vjˆ1˜“ø}{8Uj•¾“oºvðûz|òÛŠ›BŠ8 LJõvÊʵY¸žeKôñ(ÚNTçÌúâ³f—›•˜Ã(Õˆé+{‰>ô’Ý1ôÇœ´CçjÓ¦=†Ý4)?€žšB€qû ˘þi^[§¢¯“ŽÏ`Û䬲ýÿäò­–N7Ù¹ª™d…)Wd`¦m©ßÿà“ãðÓ<ˆúw›O nõ²RRà9¡ÚÔ™'gW'éã¹çXbd5ánwo÷ÿaFy øÜŒ¶D+šr÷ 2»þ&‹ü§‘ü’ùkA=éé*”ª½xPßÒí(›BÀèÞœ²ûÌæûp壶hy@AWGß¡®p’ùv»òŒé\;ª‹î¯ûFYÿsðÁ÷W üŽÝ aÎe¶t‡©”?ÆëÖE7}€(SHàÛÏú 78dö]'S\-íìy>Cè+‚k©d ËÞ‹'XùÐõ(©üÉRõÔl×ß¾/ì’㇜ò‘Ç}ì«YvWžÄã½0üke˜9˜ ¯¨=æ=fk“Ø“}­RÄ(Ú²r§–êO-çÃTÔ­?eú‹-óžn¦õ—ÏÏ“3d+1Ë6î›xKæ®ìŠÍÉÚÉ̯ÆGBY´m–<“¹ÓXØ@æ[À´¯Ç½ª•ÑѼP¹(‡§}¨ìY, WqèýÛñ„öR)„áŠ$‡! äØ$ØqlÛ(šÂÚŠ¥/¶ ‡ÃòÑoœ*Ê<Ô~WØú˜985Í..´J Q×vÛa}T¯?9{è—iy¹¤î•?둳ˆ£^‹[h´šQ¿ÔÈ•¾.)Ký­/‰üŽÃ^1DÃÑþŠ'¥eáFÆó´(rX(Ðݸ"âKÊ­5P¤øÖ¡,K†Jr’IU]Õ>R÷[Q+U#Â¥DÄ+ã ÜzÚͶo[u#ø“5 Ü’Õ©Ù ú£]ßlÕ v42§Æ]¼y“°È/3¯ Ù«É«a]]‘\®¥+{ë£(óN“‘ ߨ­¢`)5S"¥>,ƒX1JEqPa`áþ§âw6ô‚íTtÛU)˜Œ£ZGÔƒz˜¿m.XxÝpÅ›O-5”Ïfe¿a²qKM^^‘\–ÜUíÛXê8JèUµV­ä:ˬh±í…EŠFD°ÃØi¥ V׫ªjÌ~ñ^¢’µ“7£Oª+ƒ”«rL ÍN 0÷|ÉígLxurÛõÝ)Õ¹MYfÔdÒ²ÖŠ~—ÌOVTE—5bÒë„`­"p#G†PÈa$DEQ5:•Û†$ƒG±¼îbT*X[ÊbþˆéöØÚ@€÷µG°'õé®Uç÷R7÷ß‹*—£(²è6¬+ú(k”² F¬ºõ±¶#X$O¡  ¼ŽÙ*µlês1@¯Õ «6fZG1ü[HX!`ü” »åǽ7®[ V‡'¡­ÆòbumLñ|Q¨J­˜ »íÑN)ª"ꂌ«Æˆª#TÉ2ák³Âo«8–ƒë¬4B¥9é,Uf¥™ ¾ÃÝË©ã©k1rX~^üŸÊCñ úÇwMdŽ•F]Rʰ}‡Žj±h E²ƒˆGQÐZ ý:ï>ïÔú À‹íƒKª½Ë…£Ý,•M2¬>ÀVÄ@@¾l˜Y„›¢R-Ú£Ýø#Õ§Q–ú¾¾Š0²òê¡H°Ò˜zĪ8mª²8²”¢SQ¼ïo”â܆ù Õ‹w½Û*X€ ‘±\ë †0…ÀÀn3WÌ2”—¤­ïø aÖpj·Ìo|œZÑ`K(z‹ -Å–ZÃáLð³ƒÕÂ…ëñ«óåZ±P*2ƒ«qîÍxæ/cÑp‰8rÆë$¼æØeŒZ›|VÑ¢5Z©¦ÅYE*P⌋>ÑNÜ~áÄÈ%ú¼Édúœa_E^„ñlÚ2Îý3L/ï—«þ Fך¢T8_C]BUñ¦kTJÆk u1j¢¢hE(E#Ÿ¨ˆEÀ‘Ø^¬PšX’v Ôn‘ĘK‰Y¯Ú o§”£â6äl]ËP­„É1ŸøW|¯a®FU¯ª›î>ª{W ; Ÿ'3£¡ˆèÂb4Š-¢w@(µ@-…^»—?µÆzoßnäj%Â6°ÔchÔãì—HXÆPs‚ë€e¦½soùÃ4ݨ׎–Ú²fGí25­ ®%Xö?/ÕK’…¢ü¾Ô/Š¢ÊYã+—JxS]ö°ÛBä,äûY9Œ¡º®ôb ªT‰#È4†Y& ¨¼3Ü:‡©?'j´ÜMTàô%ƒO§ë…î É^oüt}Y®{)•cøEäýƒÏÈŸ7¦ô»ýØö²­ífå/B¥¼Äï£Èe£”É壘ù›a2†o_üðü)[U2 ´Ñ'V¡ü¶¶¬ÀGæ> V¢ÜëËiåÜ“5{Šr-«r¸üqWº?æ”ù¾º=·‹,¿Ãþw¡Ø{ÿaçîµë±>b=§78Ù[1èß̼ˆÜ%D>úûãø?õ3)zÛÞºÀº[.sˆ Ð{ŽÊ©§VmQöq\Ù p­ ÅZ?|£õ±eµ B5̲@t‡0<ÝÎmìcæø¯=ÛÈã2Z›ØE¬¤V›hôê>fì|™¾{ôé é–*’‡{‡ù^÷Ÿ¯ABLã± *öó5Úƒ½OÙp­! F£BAH8Ö¦4ô>ÙIÜœÚa‡1¢*9ÅRÍ8aY{)ÊìîXhJk3Õ£±V™;pVn¼ºc‘R’Žå<£u±n_u|lhëhÚmqz&cÃ+¼Öî1$\ŽîèL;¾ÔUIV޳¶4TÞ§Z…Ÿ³²¨Ê)í†]õ×Ë–±SÊs1 €­Ó)÷kfÞ,¨‚êeàóñ­‡Ø}ydwÐäÁ]HEIF²9ŽŒÄwËY†é¡nnks­A½P=*̾ìÁl¶3ÞYÈ 2]bM†¶ª‚ ©§bˆ”÷ €“‡z²¡¤ó˨Bˆâ^12› ®$B§Ú€£ù»ÅýaSHõ4 « ÈíÅȯlo ol{ùZ°·¾?n9Ò–ÿ3­ÃÛâbH >ü¥î;Œ&5gç" µ½£ZÒH€Aß[;ã\³:6¿çÉð«ŸÞZéjX´h»¹âúÿb*ã¸Á¦ N|ûFG‹eSÍÄ„#ÇqþöØ¥çà~¶*[. .ÞÿZÖ4›¸ä9eøÏW¬éÐÆ:y¼35£×¯é,›™Î/Q­#Æåa¨ƒ=¤ ‚. (†DPbOÃâøå0@Ôœ‚LôÄ¿_l@Ð É%QKÙóó».7G×€(2_yîÞ*‡ÿP/®ø•ÀÒêÚzwŒ0Ûsç×~þV¼XúÜ5G;ì;ïÜÕ¯Ò{*ƒÍ•.<:j{éOggSü& øÊY&ÕÿÅÿ»ÿµÿ•ÿƒÿ}ÿ|ÿÿ†PZYŸûæb߇ŽÁhQ“4Ëù£?Õ¹7¤ì'÷ ˆö—:æRº³´TC» s(ØÿŸð˜Ã šèéP¥Ég¿ŸµânJ‘’7“^«þÎÏ}¢è¤aW5œ95«MO M<^ÖÛH¬`V2€˜™ígR•|MFpA¤_Ó¸>tÙ¿Š(¤°€„Û.)1I¨¨ ¦„  Ð h–¨oÁ2A Œñ/Fû)Ý\ÆmÐkTfH*žû-4¶«C±1HÁÿšÕÔaÃÝd½çpcØV62àö%há\ 6¿mc~l£Í¬T„)­2“Gsüºi¾Ãùñ8¸-½.úÄ>¡´z¡ŽÉG­¦=9»F꾩>ôûü*êó¸n=·J³ûBñ™­ÛÕ’0:zI ­Í›Ç8†«f5„/ïe‡v0÷]]h‘¯ƒGAªÃ¸RUõdF3÷õ«9{S}±<ÌÖ}Q¿åiÓ ´!IX”þúõN|'5S3ÅÉ+v">Ì•òÒÕ`šÉ‘Ã0 ù5=}ÿL¥J̋ļ·ÕÌä½ÿÓÿ¹Ï$ûDÌÏÏžtÀ…Þ&‹3ë¡FÅ$´(JQ_?´D'“‘õ¹s€¦û› BERjk–Ê`PMBíj|è_p\w €äª*5ïÆÑãã{y‰K‰ˆÌ!_âw½í×nßáÆÔǬ3‡ý˜}sNOI-“ÇL—4ƒÒÀ­9ðe°€ $T\`Ò²Š&=h€˜ç# ¸¢„@ÈsJaÅ‘óx‚…ªÖÛÅ:0ˆtoQ¯¸8–a†©o@ þë]DÊ,cؽØ&cVAZoÝ3qœehSx[ýî"ë7ðø`ŸûšÌ‘4_vÔZsU€¡%÷ÚBºŽªî'HtÄz/¹±>ï8ËMæìÇØ·¡Ì6]|Úî ûçÞ¤)39·á€q‡^ªa.› ·dHcÐÄg¬Iú>fîä:b'³é™; ÇÂ;ä©O´>^Þ¬T<)½÷¾ô¿ÞÌ…÷ÉŸÿRÿx–á8¢ØB§M8ùå…©ÝûÓ€³ÇÖÏ¿÷7™Îa§M(IkóK’ ŸüØ#ƒ1(œœiˆ9¤Uôäáy;Áþç9Ÿˆ%ÌÔ¼äàP7Ïùîy€”1dtù ”Ò=½}t=àµ2ƒúÒ?ÎM¿Þ¹sÅNBí¬~;§sžÿ=Ù Ù;#‰¦#;¢üÛóüêÉîtr I¯ۚ!'2£vÍdkèÆÖ«þxΗ 7ÀT¦¹l:‡(æ¼Q9 6˜ºðqK&@¨Á€ÁäsA‰ èmA¿2 (È Tª¿ …Z€/ƒ†-' [À²g*ÂjÌ"€^ÛPÍ"™†Ùk¢5­ˆAÀˆïÏŠûŠ‘-z+>zï°n˜1kÌ^½Õ™™y‘`ÛÖ™7ñYG2[Ú¨ + ’gõ6¯º·¾`Ï7º•@Ƈ$S5·]f÷uÖÙ{Kï^²Ù£yòM·% ueähö¥´[8' õö§}5 Å’(‚zyÙå bªw[ö~åDèmQ-ýß@·ÛòÍÆµhHíÇ›€ò(°g¿ôIÂÝûwP8“…4nŠYÎu2O%Á'I¶$¹šGæg±ÍðxÅ„¼ÞÑêßÌS¡s¿åÌ”Ñ{ /±›C™~§I’J²¾LíºÚl èг opÈfòí,mh»ø-Sl9Ã$Ðò\¾ùØòö»b>½¨r€Cñ¦¢¢¡F5D{l¯ïÏg‰¯S TT¤Ø î©%æ7]á"ª;›iï•^.A®c»‹!"`˜}“¤‹i*zxz šbp· TzMi9f7:ÂW a)ÂYø•´Ïv mˆÀÈoDž‚…3Côð˜Â4 ü;k÷Ÿ1‰ü]Å’Þ&ƒð‹ØX¶j€ù¨þ±o$À›œˆõÁ!À¶íË‘7ê×µ™UJS P¦nLüž¨Óa¨œˆA|å€ñJ~f¼[ª’—« év™M<’ÑvÁ®Í/˜_ýª/³ôÀ¡9IW½EZ $çž“N µ-6=Ï¡oÄp&ï7Á‚0ô+¦T¦ Ôua4ÌÜo_ÓÀü05ííÆêìõc—y\ z÷–½"’Ó›!*í™2ø¹§f ˜šÒ£€«Ý'Ó…‹‚r2…&çü+ÉɆnºrè}v¦sèâ»ÛûWnvL<êBO&ÜûÉgDeph Ât×b‚ß2 5÷ð“´€T8@¿Åì$=  à~é•×÷²2ì55 8·ãOæZ£™ÊYtÀœÍtUþôqsç4I¢ã Ãzº“„m£qà®6(i£ï$ÈH¿E™ÄÂêx2†gahhþ1¬W"¡ÀlfÊÌ“ÐæVZÀ§AFP™_ˆR‚Ø^ €Aü]Å‘Ù/½×Y,q?L` Ž mT·Áà¶1;¶úÆh3³ª+…€RÕlö‡_3нZ¬Ÿ'aýÊ î&>bß3¿‡=ÍWû?=ý­B±Õ ËÕ¡K^õÁކ®ž÷:iÑ:µ‹ü,W!¬~õ ÑÐò‡jBŠ4 ä×=Þy¢¬DV>$b²yþýöMtа)±*^—0$ôÿÐd—œÎúðij9ôS]Ȥ¯¯ï»ò&8ÐxxMÉÇMƒY}”†]Þ–’ìJ’›¢:>40ïäMQìÙ½/È9=û @3ÿü óÐ@Îò9˜I(Ñé5‹Šäo¾¯Q; ðáÿ ÓÃK|Ns&(’Ь›Rÿbñï{& ˜ö×™6 J'ƒnäd𤀀<ë ÃÕ¾üìÁX{Ͱä.Cgåe¼[ë/þ8Öì"mæ–€J„ÿ2PvVa²ZP`?€‚£HÁ€)RG.è ˆ~‰&Àûmð’Ð¥AoìÕéK¨ 6À3ùì}å¼G6×µ‹Àe°ÜÀcH˜¢ëß°i¦ª‚‚h‹Ñ›KÎ~¯Ò=áÜ@žì®O(Z‚q¸ßVŠ!äd^u|Ô×ÓLö3 ¸ªUlñõiýä½£Ÿ­hªS+sÿ›ës«oÄÈÍ ’aø¯JXY•!¼w‰žÌŽ|ók¡_§9xºß©\ïH¾Ÿ.ºü„Ξ³dõ¬{Y9-Cx ¯Ÿ3U[tˆ§w9K}qÍ¢M´BBÑØ·Ò™T:ý˜I6òAfzÎmpæÔUL'W|ºÿ‹§  aÈÅ~AW¾Èæï/즿óÈÞ@S³6 C%ocí, ƒ É3‡}Ÿéãcð¸a/Æ×ïõ_3=.(t‹`†dE+¹½øò[Oà`™kÍôdUÑl;œÁ˜‘ƒ€í$Œ+ÿÀ£Ìí!ȾHõ ©Ð©s€FcåÐÀAþúõàÕ®Ö ™Føf¯‰ÝšÙ.sà™8a"“ˆŒ‰¸ ß›ŸùôaÑÈZ5UÉD¡ç[gÄ’Ö{ƒüêfzÞqÞ¢}Ñâþ òQˆòú^:Ö`‡ˆ„S2zʲÅfž¤ž¡) &ÚÝ–=ˆ-¯úZÔK%XR-ŠÉ©*ŠŽ{ñ×¢lh ÿ«žf”Í4HØâñs;ˆ;,Mƒ_4 ¦ÝxðÏj´›ÚÅú®Êò$I¢ŒÈv§Ðd½g¿;=' Pm ¶«¯ÿS¨º:·Tï¶gM~šÏ¥6ë15X\]?£Ê˜‘“îÝ×¾ïlÝÅÞ,Ù\ÊÊ'~¯gòž<ˆ©A ÊùF•Ýlø«eN!Ó?ûXž¯øþœµŒ¦Kç=GÓ OLvN6çbö™Ç”¨á®øÝÿ\z¦¬ß?;ÿy°ÅÜ¢‰ºFïÔ“ €CÜE@"Z£‰8 ðC7°¾êèÝt‚ür©I¤­Ã¦•ÃL\"9˾n¶T¨'BÈéãÑùµ™¦¥šq›ö°¿~X;PŒ'JL8± Uy €‡r°»¸%2›¹p©Ê/n8Ku<=™ú˜ìf£øÈÎm-> =CrýŠÃW  îðe; EìÀ•ŠÍËiƒ¤ÓÈ€Ùðžñ“_J™ˆÄ¡!J zŽU¶Ý &©Ì¬O×ì²vNJȼ¨M²ÓyÈ7óGâ˜Î²¨Y~e™«öÓ´ŠìøÎÌ&sWAÜ@åzoö€ýs–Œèv>Ó|¯û…·N½¿ÅP§˜ßÌSª~¯-–D_’ñ›L€ã:¯÷º¨¢vW ±%ÐÖ‚EDÙ°vgŒ* ¡BÖz«T4m%´Zy’Aj—„™f:=Ùð˜ÿ´¥1Kèj@¬Û›ñU}⾪’›"1œÖë2s"ګDzt› ÎöÞ>;;eÇw·Òæn¸-תòº½S]S³hKùÓËbìR®5ÉHLô@À–Ø{¿§~ BÜ\÷Rïs_ÖKZSìµ|åe Ó7Æ}ËõþG«šwŠÃHñÙ¬ŽáëKUç5b<óùõÁÞŸox×ÔñÉlï‰Çï}sü‰@TìJ•JbhÉ>J0pqÇ}˜üŸ1 )váb` W:©7×ÁÚRÂóãkýÖírèÌûÆCèõ»Åõ"o®›—'ÕE;ü‘Ë\Ñ?'ï3ÙkóÉËôú²[,åå–O]ɹ¥zªeØ@i'ÑZî­Zc ôþí@\<·„€ô49º76€1ýž¯Ö¶³¦ªmU쥵' #uíå~ú«ÖŽ±ì¯‰Q;÷uf¤c¯Ø6¨¯‚ÿïÎáž)ø4Éwï~©ÿÞÿŸ©vSrŸ®Ëz×ß'ó–M‡K·3Áèy±4n—)bfo{Ÿ}k 锌]÷ûå]fx]êXµ`»(Ê)=ô-ÔþÁÏI¦vv2ÄèË3Ùÿ?U»( Ë‰¼@ñù{àÞ¦¡ÿÊÓ?÷ˆ½ˆ¦.qõô0‡ˆžqúG=4wkʇÁWTÝͼ=ÞJ£A÷‰t6@40¨`ø8;î?Z{z Q†ª]ó¼y²æQä¿z+¦2‡®!£qd×ߤ‚û½OYˆC2’Û•NfTOzFW’¦ôÓ³m p`¥A,R–@÷:l€èUÞÒ-©Ðò pƒ‹‰d pzy6J œ+JZFR*H‹¢.(qèmô©Ë=zí2×Gü¬Ë ÆúÔ'þõÁɬé7Í¥,Iõ >«­Ô@é­?$t³Ö†¦‰Ã}t€·C=½ûEB§\- Ö­»·¶m}+2uµfA¸"X÷HŸÏÎä§ÝÉ¡ÿÓäœFɦO}(b~úPÒü“âj‚¯9ttä}µ2…vD+&ûûnÖ{€ì«õÄd:´ÛþY•6 @ gƨ×ê,Èö|õD4 wOÑl×2Oà>~Œ.*÷6ì2]ù8{ .²`‰ÖèÜo-Í`õ?cnb;.íJRIÖ{ýÌ'ÿŸeêŒfɉrÃëçû˜d˜)RìÏÁÚ¥ü¾]m Þnç0‡Æ{º"æsÝ4YÙcrÍ‚ž^7´ÿuîefßo@ÙY½Š-q¬ˆˆg“b `îbÈ&…詟éæÎžÎŸ©evEÔóê•Ô"Ø'˜¥>6±¼__2zjº¡²§ó–¹²/fN„蜜§ ˆù‚ÄÛ fDš©À àÙêlp)£Jçx¶ IK·>¨_aTJáÔU?²b‰-À"³‚–:Ëa˜Ó2ö@)ó„.£-Áç˜ë¸&Rö€Þ»=…‰‚lÿ/ö¦üØ@îŽê×à£UgB@^¿ âZ?8a! nÖCÚ!ꙩº´™›7ÜËÒ>O³2$¯îq{Aò+;êkj•e©¾º ²51]MÅkVå¸U^G ŸÛ<¨LöótÜë¤ßŽ«´Ö&Dœ‰n­±U3}ÿÎSJïd¿‘óí¹ìêìã%›<SÔu3PÍLƒZ2Ã’‚Î*~†É;¡1çÚ¥ÃÇ-Éko°åLB Í3µož$ªQAÖEÒpÜó€C€Ýï2îè0dæ©÷í3¦qÆ»§™*¦Ù@viúèÈÁì¹(Ö¾[ƒülµ>ríý˜»]èÖæû¸Ø›ÿAÙ5'O8˜›}PM/1•Çc(K£ÈÞQÏJ§É¾šWÓ@p@»]Ñ‘.c1 ð‹=Ó À‡Ãã'­Ì@伯kúíãÝÎQÿ‚—Ã:1À•šò)ðu§cë¾îykíêFI"™+^ˉöXÍFÇ©½›~쎚‚’Wï–퓯Kÿ~ —õd¤œbØn}óyË$gOÓ…Ëûw½éˆ¥ˆÁƿϻ‡+Eô°võžÝgüVz:âDíySŠð|y³ÝG«DWL]ôÓX¦>³˜'9UЩ¡êŠ(•.­yåæË¤Å®ŠÈ9Hîmñ;TZûÍŠtQMг©Ì©‚ÿh¦èýÙ©ÌgÿÖœ¡awVÒÃRuÖ»ßvÄùDÞWop& ÑÅßP*UOóÐ ðþ8¾NªáŠ(šÈŒÙgz2Gý÷<ÃS9¦€ $)íÎÃûDWÄNLÄL\.€É޳?4`À¦ÖTVNcr­½Š,] c€FŽ$PÀÈJ<4DJU€úEω$0© S €ñ  °^kÝ¢3Á¤`Ö:êKd» |ˆƒ×ZÍ -ZYŽ>Ö?ÿ&3xcÎ¥sÒg[®'àrÎ@Ò¶mkJQ,‰‚ 6¯§þuÕâW‹vlm|»ºÏnö•kóµÆJ}pߟ-A‚×^±ãƒÏ¸Mð¹ e¹¹ãÊ{Ⱦ”Ð"ÀÚ”WP¿Ý¦]²³KR‰í/_büéßÅkføÖ7//Ï÷ùdؽ°8çvÿ®bpõ£Ï._‡Ï|Ý›%Ó]÷ê_wÕž*|žìä›YÝtqenª\ÓgDœ‘M@ßkÕ0]YWg|0$0 ®¾+òéìa¬‚œH6ÓOggS@B&¢ .Ìùÿ‰ÿÿ’ÿŒQQdgeiYaVbT_ÿ¢ÿªÿÄ%$ §ê*hCÃt¶8óæs¥tsèDÓÐ즊MeEή È*ÝyÎo%Óþ4P@#†¸ÿlž©‡Ê8aì‚×t½Z]›Uû$Ô0γ„MòÙd3=Í›éË"’]4 BûÐx¡ö8 ¡PH…÷j‰„”G¤Ñ€&žZˆkB4ƒ rÇVgzM0 8j¦E6oë(ŽA¯#ÐAlÛ:ð³±4¯^²¤‰dSGö—Ï=4-6yf¦³·â˜ qì¾wQ{z®Îqöý ZMìÄ q:\ìEfV€bêÿÐn™ä’´A÷ÿlŸÿ±ÊRw7ÿÞI²Do¼æF€÷LQ½ø“Ëg®C›žŒy!ÄV?fs¥;âpC9|ôó|ÔACÓ9Æ3óÈ=eö ªÍjp(æú®6^à€'}ØÞíØ/npW.\ºÇq0¤{Ñ5•ÌP5ü÷jpßó¨v;‹„ÌΚ¹7=†þ¦ôtsÇy&×s¢Ó50y~[,ï¦=»18s—sü¾›/è6½Ûqüêc•¨‹fz€‡8 Lu¥Ï½‰$޽݉îÄÿöºÙÞ¼˜&'+,p¤®Æ€,+Ò/ÇåF9PJšÈÓ0Ð* Š€ò_C(ª/Ú¾J”k¦Xf§àx„‰µŽô§˜Ð€w·yù(úÙºäÃÞ 9-D܈ƇcÍG2WamµHa/ÕaßÉä¥/LŽ›CóFÕçnÉh¶Ã^BH÷:õr°ô¢fKE§ùpLõgpœºßéV> }ݘ±r»Ýä¯ãá±3/”»@‘§õÎCöü~dïFp 0Óº™Ž;ñiÑS00ÄyOñèÏ@ºçhŠý3f—­HsŠ¢‰)îÜgö¿Fàç?7؇„t›ä«ÍŸŸïn»Ø¢?ÐÐ÷ßý´“;ì᪠wn·ßNCÀbÞ¦wS›1# 2¦wþMG¹ëæGy*»‡kÞ|ƒ¿‹¬%Ž•–h’‚JœÍîÚq'{ºë;q5ÄûìéÈÅ?{¨"K êúµ’D3ò4NÝ~陞 ^agkl^®åט¡È‚dz6þ7/Ú0Bbd0ýÿ¿F€®B“X 0éc’H<Ò¥°T¦åûü6Ã{™–"ÒOï €þʈWZ3j¦Ó§×‘{&Dšƒ8.þŽó²¼A€ú}èë»Ão韸?‘¯µ«©”ÌDÁi /Ö|»+€ÞŒ_ô²ÑÍÕ_ØÁ„ðº"„k9vsÚÇ걎Å7çp¬Â¸óyA|/“?šEýîÎûŒH/9'^Èþ¤ÜA†G×ÖÖUuMñ¾»´Ü§ßÒŦX#ŠåkÃ]nÙ&Ç!Ørõ¥Ÿ>ÀDkR “ï¦gúkú¹âå‰ròúÜ"!so÷{­œÍPÑ”–CõŸ¦é<ÌÌß( ª: $÷×—- ç÷~à0Œxý|¸q¢{‹Ï×ôC˯*mÒ<³DFß|äwCºh*àNuä9‰„Hò€n€ð©©{²'£}:¼NŸÏ{¿MMç¾€FY š^¸ºkz²ºhú"hº *©??dµ{f"~-^_ fÒÜ{{¶š ýz |ö#(üŠ·7Ãô…± õ*¦^Ç=¾4¢'çŸüSå] r›Is€ãØûå&Î*ìuÉo8x{ÿ£>_/Ìy–QË©þëyLËÆx¹|Ìß%òÏ.3ýòËû?¶Y·Ó'"-åc]: äV+Ù“¡S¦‘vL[Z(qòl3üT~»vôþ&œ×”²˜þ#×ꇜÛã©¶rÜñª’}yùýûR_>>>^ÎçA]-‡×Ã6C0¶©8¶»#»÷oýºUòûí7—Ëå4‹ÌR£¨]ƒ†µLG1C2²«œ­ÿþæ§ÁêjU\ntúžç#‹ÝÜNâѧëTGcHç_&äëm?öÓY÷Ε×ú°87ýÌç{åòÊ[+̶\ÀÇ×BQÜ{žWŠ.ñ cH ÌV30`ŒV²Rë4Ð6ä`yÑ Ìùt¯ß^ækóSW{ÓYw–ß)ÿâE߇õ˳lÏ}þ¥üh¦›åÝ¥ÄgWÄÛé~©FýX´?¢'f ÊrEÈw,?[îOÞÄ(òõ"¬nµd‡” S¥(Hw÷ko [Ó­¾õm2¢UEYT© ¢ˆÕqY†^¢ÖSrø¼‰ê’Ä|ërŠÝ/ç¯ÕD¯ò²í¹œ nÄÞX"òb'ë›ÇË/»”Ü[A*%A£xØðGà6iH9_oï@™Õ*¦qŸÙ=Uýål›ì‡$½w¬‘” ‚i_µjËøÙ¶™òØenÑÙ]*d4 –`/Ó„j¡"ÏÆ'Aj„/¿ŽÈï_â“Æ” _¹;Œ¥,à0Þ²žu® QŽ"€x²Æî­Ž?çxù«/õý‡Ï­pIåJy›½d)–÷8k ¯Tص¼Y?†Ž:*-Z!·ŠDaÙ,«… ÷â%V4é¬Z}Ii•1±‘»¢ÆrFv_€¼\“ \¬×Cói|ý‘î²Öžùf‡Ç‡†%Û[míC> §t¡»¥Ø€à£]Ýî6"i ÈÄé=K~cäœ\ê=;¸¦OQZ·½ySmŽTæ‰%’$[S½eTB^—»Ãú CïÈÅ.'ÂÐúIX.Sôu€bdu…+ѳnsÁo‡y=a1×–¤Ô>HÏ8‡ŠÔBÎiUº •N€ä¬ ‹å¸œ½+éeUôä,±ø'I¯wÍS$bY[»Ni‰‰mh¤OúFx{jTädÔ¾½@‡IC³$ÎG„Õpi sR6…À}uˆÏŠ~ ¹ÞÈËK<oÜ~\gU_ÀbÀrM¾˜0ö0ó”zúÄS_ÿðaç7=^š [ =WfáJÜU8‘ÌšBÈuІ­ˆqÔC‘úõƒ Zu.¥ÎàÏñóÂ8Å$•´ŠlÁIO™zK  OŒ%±â䄨Z÷ÔâêI@5†-!4BH‚K j)&R0Á#È@„Ô €õÅAÑôˆ L›X€ÀRV ¥( ˆAð‚-PmaÚpkg ©f·I €ò䳨aÛe FädDhg±ž˜ÈN¬†îðJÓï–°2ßhEw ÝГ_Qºa\€Y·é“5ÆOLL‹ùÒM!äU o/0Øÿv®9̳6unN›2ç)%{Ì׸pLïó¨ ÜB)ž.—Š'“Y]yŽï°‡¡5·Õ§ X§G®;„c_~µg‡V~äóø'llÞ÷½O¨—Nµ•Yfq~ŠjfK~ÕYœ^ û‡) |«OÛš¯å]S¯=#=gŠ¡%¥Ì–\wRB¨ún2{Šf튊])*-x+-Ø^£E…hâ(!á$Ü52®O—ƒGÌÚ 5GäœE{ºg>›0­ï‹ ]dÃo+ìÂ鬢eH(u 7P³ÐG«2o!®Ý…ˆX=»Øµt"‰™ìÓ®0‘I¢¢}W´ÁD¨"pêí†L d“MžT§ÛÄ+A’¦“ØšJpBä¨å†78‰£¢D€©¡´ `¨@Ec<†¢{Û# Ž ÆB§(°íX€¬ˆ €„ Ãy€ãˆXBX˜„(+%^OggS€f&£ÆÿÿÖÿâÿÙÿÃÿÍÿÄÿÉÿÁOO`hl>ÛÕdl–0æŠñíb+0Ðùh‹§„Þ?Ý3™s;/"ÿ÷ñC6!í"ßzÀ)uÂå*Pb?}·W…Á⢾s‹±Æ$Ï)Nw`ŸB ³¿QR:‘Ò»ÇsÎØúŸa§ù¡è“osÙÃ]pMÛZ.•}ñx•†¿Ôõä@¯7*]±\Æ—V=åÆZδjYKö€(ŽÏ¦ÖjEÚ`,:_9×’ÖQä'†ÍyÏ@ð)Â'@CU)—Ý\½Eh¡mG*WÉAÒèÿ†ÌÐleª;¼°C%³v2«çÖ—Ï4·LL©C×±fuÊŸî°¥µ-ÒqdæHÌRlù&wpzóAõ6"Øž=IQƒPªWAìØŽÅœ*jƒ§“j2¯Ø·g!{°‹„D1EêÍ ÝbÁëV hñÐÐ2R‹5+)hé”@›1#•(.i€|À@)•¢Szè!C*tÂAkÓLS!‰^Êêõ0™+e¹È‡ãJÐ"ºÄ º(*X,®òÊ29²-hYcƒ(ħŸêN²¥S+ˆ8›<°Á1AÕâƒ( ±Ù„ó×°äÈ€‘  F~Ûõ¢F co7;B—€(¹þg<þtKOöÙÝÔàãìSí¸¸–AòZàJ¬ Hw@7Î@¸%P!qÂgl›Ÿ"¿6÷¹€øI3M’€¨œàʘs3×YIø €DÝ=låóæúõfl½mÍhÌ…O¶Sä9g餄°29(™…l’ÏO$sâ^|”JW|nÉ%¬÷»›ë½\ºâaT ™Žé³Råg':ßFÅYÖ)½f׎.Î.K(Y`™cmÓÜZKäûšf oãt°àvÁ‡`âåžz~ú‰ÚVË7ˆïÖÆˆ-·joÒû!Ò‹@\&?çE…I=^zÎ]Ð?QoÚî¡éIØ.Ú(Ζ)/ E´Fõ³/91õYR¤®®ç3N#©¨Mǧ×ɪ1ôÐ9,”þ,K“dB3À±kiØ" ‘¦'È©Z>y>ø•Û HD‰Žj`NNš ¢G q†\¡ØŠ®œ-a*G” ‹e¢'š)Õ[º;É10d20SECÀ @@ ,g0 ‚HñHQ;{@]+ÚÚHi0Tr`G7Ji@ D7ö#°1p~j X8k~Û-¸¤‹Ö׬Cµm*̬¢†ï'k[}¶—<ï_o€YÓ¡ÏÀù  ý ŒÅë@î¶-Ï;*:"ž¹€ø1SR îûï@WÓÈy pH0ŸÞšü‹nj7t‹Ñfɹ´3×2eŸpŠß)‘¿6EÖ •zŠ‹â áÔ=£+Ç¿9_y3Ð6Î k²=m´Xu$hŸ«+ 5^g,H½ÇL&šÈge½"$bÀQV[y¯ótãsÐí ¥@ºƒn2g®^Y)Õž_)XŽQ†Ã0uÔ4kŸ•5ªÁçMEBÛ­jD½àânB–‹÷ëGS»WµPA¤‡ôÑ>#“ÐÓá-¶u‡§z÷Òg(‚Š^O‡ÍN@à8g%”h'8Š{Ú©8î1È&{8ö }‘¡‰ñV4\jŒ5¦3ÎL KA–›^±ÕTÊzY+Y¨ÅÅÉ$X@7])lÒc1Õæª;~8!åý°AE°¾ƒ¨`ÀÑp.ÎX@¬7Hfvk@Tsôù[£¤rÇDdXz€Ú6`0wˆ*@½Ø`1 x=`3P \Ëõ´Ï&†Üì(j‚@‡ ÷ÏÏZ™f™¿;œÜ÷™Hô¼îïé€ê—Ñ÷;0UéD Û.ÀL Ó1GÞ‘_}J ÐËM{5³ÎêÇ»¼>´«/‡³óÍ€í¾.ÆÍjö{¶…vRDPX!ð& =÷çîھ²pMm) ’i.öäÜÆs/ÁÂpãìCö*Ó¡P2Ï™’Û·Ç Ù‚:>x²Ûi¼TwŸk4JW4AS“Ý0ó¾g&^!@{.Órnü‰fg]‹lƒsv%ûÐo‰8÷…&ò|ŠïD±n §IWtSôûOß>Z¦=CE$žaF´I IØÊŒ{3h9áJ]a± ˜&&2ÞmÀL­fFßìµAŒcTVF¤Ü¢úÊ`j>ÜŠÖßûœ¦ÐÚÆ¤#²Ç­¬Â­ÐïðL‘×b†€™“0ᢗ”1nêµ[ÚkÜÙh!È“¹$ƒÉ¤(€µž¶-’à–¶]@ €Ð…z0¨ºÀ˜“lÈÚhA€Í¨ ˆš0 `/€Øš`_P8ôÆYuV:v·1íþºgM¶›5ÛY¡7ÛÞÀx.½™·‚!&ÊÑ5ƒoÍ@é1Q™Mh²{ä……©Îìnw©Lf %à{E¥˜¡5¢¢8v šI “•Õ9 ;=€eq§Ç§©¦åéžK¹‚qÑ$IM:X=muVFº´ßlÆÚ1FÉj±«™Ðó² “4…?às½€a@4ŒX±CtÊÀAzáJƒ  -––í+˜ÅzNC c. "pðD8ô €b=žêíhj—8ŒdâB¤j'¢%äad êÁà#þnâÝtÿqÈ·¶¸.EtåB¦tÁ 8Í-Áœ ±úa:ÂOºyIP™Œ¯ß=€@ú9k"tï^Žymõ}ÇTa¯9ïõ~óû a\røã¢êAf´^æÚšy)£BãtßÄ‹­Ï>àÉ™ÎBóÞŸ5GÞr™Ò’}ÉÁÄÛÿ¶ZºÎ¼y!´à…^aÁ÷â""Ó,žâøÒ‚·FÇIbÖ] å s™D¶¿WA2ƒó4 q Þg¾O:Ït®ya® þ½äGÿÐ2Ðj„¢#¿zŠº_ó}À}yœOMâ-ÆËQ¥=¼Éì`.­žÆ³0½ç5¼] ꚦžË$†Lp2©9ŠœÎ<{ =Ä+ÀB&tDÇ —ƒhrr¤‡(º°*ÛkpÔ9¼ÐIñuã÷ÈnÎåFí`ÓQš‰ ¨ïPƒ6Ðäÿ` ®Òæ…¡‹h¸ñ› `0`óú`ÀëZáa&cä Þ@€EÔC¬lÀ€L0Àü!A]` DœMÚuÖž£AA’$TkÈ%Ô=øÜŽË)d .|lÞ§ÀË ¸=”à›o:hâ\Â>;EkXDƒ©]˜&y¼sô&†”ä—r×é°g2k´?“Öhvîô¤õ;þ]/£P¤Í'¶¥9Lj²¨ô¥ó¶o$ 9“!Œîb%~eèðnì ´ Àâ-ãÃñ'¥(h(ËñÁ…Ææ³ø¶»Ý^Bxmÿÿ§­„½?SôUÖ\C7Ñï:ã´ÿËûúÜ_Ôð8ù¸g:jûÉ݈VhpY¿| «‡HCÃá[Íܳl úTÓÓDÞzRªëåŸuöÍÛøf⇂`¹‰©ˆÞåÓßË Ã>tNK7ïé:©9=‰™öô ÛÍJöן>è¦ç•€é±ëÏe—¥yóRÙg˜óùÞ¶¥’¢H¿ü~©¥ú™?ÝZžï·“DÐtxýíý0´*ÀýÕîell?ìf(Œ…S„z©Ñ”±‚"½McSÁQÄ ²ˆÊ¨’‰Nó'Õµ/ífø³úë|þëýe1ÕŸÛáïÍrªGŸ»ì—?Þ}Ù.Ÿ_Vîã“m~žÝùãë·¢}Zý¬Ü_>.æÝ;@OggS@‚&¤û§§ïmfcÿæÿ´ÿÑÿûÿÿÿúÿÿÿÿôZ‡Žm²˜IŸ§%)fxºŽXE1_Aíâ—<ÊÕµnÚwÊóÅióV}qL’y›¯øâ›óuëB6¼qÝ|¶²sÔ|<ÿ·Ôi–ê[q½ä1>S–´¯–ý~<çóá__g¨ •’¿¾^@„:ÍŒ‰m…¡lÖV©$²AÔ [ŽPèë“'û„îqÅ2í×ûHmNéöNžä-—ׇM­Û—¼Ë<¾}¾/Ûl˹”Ã*ŠfZô=kh\J8ÕNA=¼âͧB|„¾LxT ôj›ÎHAu)^X•bÁneM˜¤óñµ¿\ò*¬€í÷iËÈm‡nm÷tQQïçyáí›UöiuJåøyPŽó$³\”RÊÒò­‘!XŸkgÕÙ¹øuÞ¢,h!nGH;„ZŒ‰\+8zj•*UEÆNþS¥˜°(ªˆŒøûÜ bXóÐÈ·u4bT4üVͬ. -ÛÌ4¤îu;ÙieW‘±«¯Íû—f6]5ÔÍ¡„œÝb.Orñ¹¬EË>ïaêC54Ü»õÒs~çÜK¿|ÆÝ.|ÑÌw”çƒ3‰Š†„…ÈúÏ>„œ…¡ F ‘²R×ÖDm$OB4LZÎÌøÔGË7Ñ€oŸ+ ½V¯sJLíG 5Õp´)IÄêz+eQ'8&‚ $’4جmÓÀ•}~*ÿŸÇrš˜ÓQЗʼƥÃ`veþi.Hºz=ÀsMuãy©é#˜ÖLß>Ñhýé©éæßíO6&×{øÜ…ÐÑhúÎeàgàp +Uz2¦PMÂàUÔø"+gÃæ{ÓİWô¸{EqËU}DãˆÁeŽÌú¹§ÐèÎØ³ý%¨žà$ ’‚¡ÒËÄ‘Ù)9S²Naèº#€¦9Òt_í#u¥A,Ò5¢A r%ð€€€5¼mpaÀBHX‘-4X€TkÅäF&dÄ‘, ¾Éæ•'±´ ؾfM—öˆ  wMÙXÃî;“A~]õH[¢HäýþšX“":ÏËbÞí,—a.&÷%æÕB÷¸P"l½ú€ÜÏ6ÖÖ†…Ì”¦ÚJ 0ú(€°~©oȵI¥¼aåÐ&44ºf£WEP¨›©«‘T š<{Ür§¦ý™`+<[íRZñÚO|õ#8t$UR;mAyÕ[DU]íIVÆÉ6É àñ ŒXšf¿ÞN-ˈPʵ*ûZBøäa €$` —˜' çà¤iÙ.¤¤FkŠ^Tì­ïÙ?ki ¢¯ÊÑf/C!RJH²·*Åô§è!Ó@癡‡¸t¼Fÿÿtb÷JxMÕó‡r¬>ź*3©ÌÊ0^ËYÙÎÄÕé’GÙCâìÜgî—A»;f0PSøx>÷×â{ªP•‚$&iÎPZ›!ãHZÊWXXØmÈÆÙÍ©>k„Dš<™Y'€«¥‡ÎÒ€½'@Šü¾Ð9·ÑÈ6‘Óë Á”º$µ;Ž4?Ðïú!gðy…¥keÅH“²„´£·*HTŽ‹weP"OÒÇ/Å Y)2Ó‚”fÿÁ‰Ç—k.Å ­Ÿpy™Ä—þkÆÒ~œ Q¨ËÕD³¬ŽXÑðËO"Ð…Ø ¹6@ÊQyŽTŠb\ ŠpH6z "C¡„‹ #hÐá¶®ÉÂÕ5ûÒc²•V§®G÷í¶âÁããdE£¼ÅA¿ÐS¸) bbÂÀ8I5¤bÆ34 kOЩv ûJ5³Ñ¢¯“§dzRH¼^ŠˆÃ,”Ò$VÚU&¦ C$B\1FÀMÏWö{¢hI ÀÿÑнAÕÕŸF5,<È (UVt-L]yÏ!™ iÑUfÀ”aø¢ûÖL¶í È‘2AÞ„ DbPÀá7¢ $<V(@`ÙD”l°0Š-lÐîî®~%>IÓ G2Nˆºú¦&U5`Câ6S1$Üž¸«¹žÊõœ!5ù²/D/Û·‡vYDœ¨Ï?À›–ÓÔ“0ž²ÊdÏÂþyr2»XpKgl—Y0òäd$ø±ŽÍ†ø”RTWÇœ ¥¾Ìi5²qÜhòî,öî0dÈ-ž`¦æ˜z—uºøÿ 1(9ƒô–ùÿA~¦*zÅcŒ{Š©Á‡\5W“ÏÛW¡5íQ_JLè…ÎÁg£¦änŽÐÓ¸3ÓÑwø@ŠCÓÖ9j±¸RJ.âç¯è{EÏ\aÜ]¥Ìo°}úH[ÚzcéÖó_”Ý ÐzÇ‚#à•Œ]TXÝ]§ð&̲¦>ÍÒx ŒÚî#B£ÏätÜÉ .L48¶×¨ ÔÎ$ÖkÕ4•ÕCr¼³£è]‚‹€³–Q[™5uU«²`] «ÑLº§‰ÊCåˆPaŒ(`Å7´vyõ‹Ø{Óôk>¸K¥&‡iŠ0c,õ¥XÍrDçŠÏÚPnhÀž¶VWç9 ô€²ÞòÁVCƒŠ0ªNï‹AÀCFÀ  'ÄÆ"Fhƃ:e FØ5€€˜ *à`mÛÀ‘cQ8¼pK«@Ò(€/E%R( ¬ 0D€ÁÞº­À$,¢'‘Áív[8 žß´dôhþüdÞMò)khêŒt%ÀÜÐŽ /Èj:Û½“fÙ.MÀeØ<묜^SÍ#N€k' ¼>@_ ·”=ÞÃ#ÏMÿÑ*ãÇè@Î@BjW¤îÑèÏhsƒ">ŠÅ%#ôV<@¦€w®E ±O+Àƒ'X§–’™‚9W¢8® ß4OF3 —€Õa‹ aØ™1" †Q Æ›® ùšëûÍ ¹ D MÞH‚’½5ïŠj'úi¢1 á k™û?•ôö¡Ñé[²™¢ôøŽuñp¤Û4m3-þ0.žo©©¹”¨`ð[€Îع7L éùsŸbß›»#4v½¶Ñê0Ó€S¡Ê¡r{˜ödù´æûØ@3›I‚ÂŒF’J@§k1ÞQxShn¹ÎÁM™¸à™~2^IË@§hMä6¹ì}4mPôöÄ›2ê´€¹èp;|heÍZ.44À«A$MU Ž!ƒA   V³Ô@™Ð…!`% oT"¯EÀº€ÈèQ‚‚¨ ·¼R‹0ÐÂ<Æ2ºÌyÔèRbT€9»° ™¢Ê\o;2›#:U” J ùøˆvSµ™È1mOñTœà™‰ð”è5ïÝ`{-. å–°¹èã ˆ'd<ÉUœÀ˜=?Ë~®ÛÁÉ‚:}:¢rÇHyì;b’ó‚ÆÇ/*Úsœ¸„FŸ‘,øß×ó~5:û«’ÞHø@ç‡âñŽ½Þµ@Pkö@5!Ái­Ç-¢D[)!U ®wë) Ië}Q@Ž=IÑYïyH (H)Z›Áu´7d0¤Qq×D³†j(b ¦­U@æz—ÈÄ“KR›:ìK§¸´?w5‡Êþ„5wùÇN‰ .t>]šiÛc 0TÝkž0ÔÃ0 JµÒ¶W‡y@ZžÉÞ8Hªs›P4øzÓU`8†€Èò"¹~ÕSZ] ` hÑhÀIe ¤>Å"Ô)Ð@Ϊ„"Ž’h‹´PéA²% ÕiLЂVµV’d =d´´) в‚… ‚ʨÑM6€Ž` …È^€Å¬,P5ÅªŠ <€µZEJC+`Ðê1¿`QD*F0"4€ A¯ ‘d  (Ž8Þº±0Å2È »Û€°ÌîõÈ¡âïð`ª} €w{.f ] /€dª2ø<{u  ’©Ü8é!àÞú@{À…«ÂM˜à€›`ñ—5 ò°ÖKþ‰Ÿ[.~2X {<¿B ÈJCøTÿËý¬Rîï «C†Rº xý) áÿÈ¿v( Ô¯ü|sOÀ ÎØ…]+U7Ö’ ,wÿíë àmS@wúpÎ:ò%µ‹Ÿµ©á)PhØéz<%Ò¸JÀ‡’³– Q•!¨¥Ð»ÕÆ8{@b©ÈÚ´väÖ°”\œ¸˜FÌ/*Ga7dÆÈåIw³¿~¥¦ðüŠœN®¨’6ÜyÎT·'1•OÀ^AŸ6ÒçÃÉ+@¨?Ú°ÝÀ´‰3ñBÔTx1mfrÑs{/lët' —d ˜Ó‡WÞ¹–­ŒW·µÆöGäÖà!£äxçØ†W„ ŽÄàƒõÞd|æ-úµGªŒ÷àóï¡z~œG[&¨}ª@qywðs‡æÎ(Q<èv¬Þ:_~žàƒú -PÒІO‰*m*€W»ø•Ë„Ð<CCLSâùçšzç Œi囚˜î[ÚÌ(-B$HnIïâ÷ ºbÝ4ð›ж9CªOõŠ`Ú#•ª†Æ480?üTûCè+q¥V¨×UÀŠKМ;P €µ®°(­f¡ëvá®IÈzmëL q4óbB$€ °X¡ ‰È<¹íÛ6Z¢b&¢ Š @r(` 0@Ì̱å51 µtب¢˜ŒÉ9¢Ó€‚€ŠuQ`‘ AtW•K$(J¯+ pE ÞZh ¹ c$õÖ÷:± ‰hý2xþgqxr6òè«ü¸öéÉà¦1}¸±¶¼ŸÊùYÍš„3ÐrkÁLà.¼ð—­×€}= 5} -³]`ã!ærØ¿wâzº–}iéö @Z¾ÃjÙÈP¶ï*87ÖKFУA«”˜óX€@ʶw_˜«aX2`&:¹¹äÚÛø—ÈÎè_ € ¸Ç˜"8+ Öù/ë1q9,ç2‚mE ~Ð6œûÊY Òõ\Í"(éxæÆ4WP§±gÍ?žHH]Ø:QŸÝKXÄøtwZiì+(€·w2@1šµ©}÷@Âub p캡â#* ãk~uë5éþöÕŸxï}Ge¼óZ¿¤X¬2蔇éc䀩ÁêÓz@›B¬Ú`ƒng@e]Á0W€2³Ì2vª„èb,q ¼·Vb¢€Êˆ-³s¶Z«$< FVÎf£¤€W6@r5Ç~P@ThÒ›ÎË 7 ôØ QÍÄÒ:`ˆ‚cg‰‚‚ƒÝ¢€`Í1  So@3š¢€(°d @( ö8U•9è`m¤æ¬žÜì‰ïþn àC€s‚´|l™à ôÜÀö°]¦òMø²D]ÎI¼±˜øÁbÈì‹´_ÇÉ×z2†Õ mj1­•]MZµ2kæÞÛ0†!"€V\oL¤Æhøª ï_å#¼<ÂA‰ê«R@ƒvíã}¼´ñ™ó±©Zµ¾Ó‹u-@¡TsÕö‹¦¸Ð•ÝãÖ®|bjóvüèD¿ºþ¤‰˜|«ìLk®ò<ºéºýåÛƒ6ªu€j•ˆ&"’å轨rûæxu´ÝíÏ1Â~£ Òh×L3 ˆQTUG~eëR`S“ë "XYïªÙÅ !!NýÎú¢+éNA(è1€–R>–6nï EJÉò\ÙǨæhy®Z°Ø2Z q·¡LkEˆ”S DÓh¬É éA1c‚ŒnIÄ€`Áz+kTƒ \T#‚“– Ps=¤ €`”Š›LÐÀ<™ à—"ZÅ Y ‡&Ôb‘Հ徂rÇåN¥Þ¡•nÌ38ÍÕ« \pŒ€èƒ–&¬ÃÅÀìcKï&žŒ&Ñ>”FK&';®SU¡Ma‹màUò½„¼NŃ،ž*]•}úg»VQT2v¨Ž_ÿÝñW–̪´÷ü+ ¾¤²^#‚~`婿@i$¢‰{¨7a„ú‘ÀOì|F »¦„\¸ª3Z2Ûá„©¾ßo]~Ò—¥†P©7Ä•DPý¨ «ºS¤¬îJâÝ qDJkÓfI­µEbV è@M |2 ;¤N–0/BŸþÅ8* ÏþÛ«»Y¦p’álqí–¡-Á‚d·¢±U­w¦ÒE솺=9 O ¥!¤5Áá*9X¤F½«1ež3ñp«Tïj#ƒëãñß®œe†pb€?ñ2*A¨$èU8Â]S¬Ù›`Í` j¢ŽËSˆ ²‚õ¶¤5¬NnlPù‡úÝzÕú4âë×]µ­Õ#„' Æk¦>¨^xŠYP)Z:½ Ëj£V;0LeךM'%ÈŽ°Ö5¼f©jÄ‚?Î^©aD%ý  íî?´+ç=ÒæÁH®=?WÒq\kJ/ñÕÅê2ÊZ*dUE3H)ŒfA?‹##¤ZÂuY$Ð`ëUÇ–ÌR½‰ñ×({°{ÆÛ«Žâ?Çh¹0%l2øË*·b0²ÐºôVutª‰W"ð¤CT [X²Xª¨­Á(赟_,Ù  öí_ôj ÐPŠ#ýjƒ¦pXÜÚz³ÏR‘ó´¡o±ã¥¨<”ƒ<ùM(â3-°;5xlRJy®Y¾~,_Z¾}Ñõ÷V³Êìž\Æ÷×1Û‘F?qx @jSó‰ü"¿4¤jE¢ 0h­[ aF@‚ý9Ï™‚>€2çyN¤5dÔç¢EÑ%-Ê»:(ZŽkºž[îuêÛòžez>º——g3ó;ÖS)BA_÷óê5 yÓŸrY9¤Ç·§çÜÛôÚûõF¢è%^î×x °@ÀZÜûÓO·&Χiiìëq=ç±®èùÚ:ûâ‹þîq}Z2d\¿Ú€ô4)tÀº¾ÇšÌ)òõÞÖQ é*Õ6 !ôuF÷ºD¯K«ûdÃÿîVwÌGä»;nòÓb%ÊãF{N'\SJÑF¿s[V^Ð0õQµ«PY-°ÇB¨š•’>#ŠJ³TöÔçÎó.Æ“£I”ŽÅrÍx²­ó€îê–Ñl›üäû«.¾ÿÁ´‹'2Lr=qñ#*¤ŒøÞ<ÙX|‰²S~^³Þ#!ŸhD“?ú§‰$ã›i†M’ç—‡lÄžßuçMá£fŸéf¨Œê¸¯{&Á™¥¤‡]þôÔÆ°oú?úXƒ!ßç ¦è_NÓShƒ†xy½õa©‚µºªóN…J$ŽáY&Ü0TuÞT;½»ÈäR•âÀ/= ]Ô˜P?ÖË1GçFC“¦K¬;˜£"·® éjôÆ_^T^ *jZü’½W¡#.äB Õ… Èð¡ vÁÈÀ˜íL=0od€x ±EÄc‹%’€ßBB––Øï;^|9^L¿ËLà!ÞûÒÁòôz·Q躰(@ïP”I éÞ\ýð:B;³iÄz} Ø÷‘$³cLaUº¦ÖV¸€ÄÖôªØŸâ[Y|D€a† Q©•ûJîG53VO ̘½\"çKëc©r fê»–¬ԢЄËüUÍÝ©b-s¿#^( l¿é]ÅÉ«K ì¤=ê)©Ó@7'EÜS$ÅÒrí¹(ãsM´2ÿc¾éhs½¢Ç I÷}éæÚ⢲2J´Aé¸õ)~ˆôÐer=S*hxîH¥$„ïûG¯ÈýSYôàîLMÑfÏdðváå~rŸˆî;+·™ŠjÒŽo<èb¢þþô~HÙ÷™ÞÂyê-™Æ”0™õN3]ÊÜ@2õ\­Ï×ûn&%#šî«P·Š¬Î„„ û÷óuÒù ¡™™Yê( é#_×h?¦Ý`‰ pw2ÔÍÍÇB„ úàì÷ô£Y{ ’‚áZ<×<–†²À-é=€aI šlŒ€!}0BÏd*×{ÜMÂ"F(#Ö†~1Z‘ÄGdÛFmþ¡¯òQvV]¹_ül06FRS)ž»íLC—7zhÞ½vÁ`²ã¡`¦÷¡xzØk²7­,+¹ƒì³Ûïûú¼Ž‡ŒpùÙžÀ{¾`a[‡ù®£­•’®]Ëøyžè¼Ûo¿=ìý¶­ë”ÿÞçþ ÷X{Þp•ÏýrÁ§^(¹+^ýòrúŸÐâéïÈ znëè%õä¢û};ülk£ÞèåÚ&¨ùVb9iÉA¯F°}ÐgtSÓ\QβjlS¢1Ýž6íU;Ï'¥œŒYÂÆ¡ìR—F{CDÒì¤Ñ¨ÇB†5»sÓLòVOIG¾Ýê@Ò¹i=‘&—}»z¨™ýºsîÙ׿ÂL Щ$1{âÝÓne{y\·n‚Þ¦ç䮂„¦“ÝÐz›¶ €/xýЧ’¹jgälàñ5S‘âÔ» œgäɱó=ÿ^!ã@e嵋}fqÍLþ§n‰Rh®<Ÿø0µéºgà00õóÀÕ¯æŽ 'i Hj™Ýn¸[`J¸úÕ3ÌhÒÄP7ˆ¤¢D¡k (ü„ Tzq°Y’ÒD>VŸeƒjC¯éA·÷Š,k|à% ‹™0Ç팭:ÅÞ…²à³>KrÄ XÚ\ÑrÓ”= èÙ#ø±?öDâ\RF.×Y ¸Î Àû~€Ðâ`Ý .^»í¢¤k ×Aa~ÍQÒKлx?€‰› 7íÔ»þàÅ÷¸J|u w À­â戎 Æ>›4:[³t)’€‚&+¡µ3TmH÷YÞþ¸šýÒ“¹Ä¤è1ƒOÝYJñ€¯Õ(冄Da˜Ñ5O+!3Z¡ ´ˆVnL0KcºÒ›)d<{×$PùåLgZriz¯JvœÛÔs¶<, êÂ÷ëµ÷AOßÑSUÊ(>±U«Ï,À§`€¶ÈꟴœëÞ }œ“¯zú‡³dZ(‘ŽúQÕÀ1ã?ýRDsž?dk–Þæô;öôgÊ™Í&IÕ<š<×!êljW&l`b¶ò” Ax4m7¥`]ö|î—ÝSI&tþë*nN|ãÚa¶>ñvO×Ï>ó…ÊÐÐkCB@ðLû,|<Š„šhÇIÐÓãèÌÏ|ÎVS¢9“µµƒuy«¯xª‹NMÏp5Þˆÿ<ÌДÀ¾Ëß.#€ô¹Ûþ`ƒ!H7fÄ@‚Y €ÂPùËÆyµK©X QA¤¼À¼·Ìc€ Á(N í¬3Í&«( ž ÙœÅAÕ,æV[eO×FgÇã<%bNnåyÔo+E´-f?Mÿ§6Þ/ç²5#ðö÷ÎÂ}p'nŽèj\Àä>šmõ¦VÉ¢2@³g*%/;È8WòItJ²Zçèñåù9€ »µùfÖìÖmÞýÀ¡uÇÏ Æb@o„\È †’Ÿœ©`ýÄl žpÙ¹< ñÿqè J&·ß…Œ–뿜%ûâÉ«ÃTø nÎÑà¾ðäÜÎ>Óë¶ÌÅ}­lŽååìÖLØ(@‚tvòax5]¬ó´û<|X%Pa'Ñ0Ùýç'`ÃåhWÞIî¢ù1ëýÅñlôÈ‘˜8ÿ#ˆaÞº©ì.²èÏù5›õS£¨¦j½ªkt¬—?ÕÃۚ↌ΌãÛÂËõ°¹ÿ—¾±±uÄ €ÈETgþg/Ó4Mg%‡tF÷oR?·×s@Odò  Aü#’ Ýœpíš³·Á¯X(%£¨-5˜à¹Õ’^€[`x0%1¬´» )Í>½ÌriwQ„;Tÿ`ðu{@€AŒ|A 0~ûÙœÆn¹“›ãò"KH‚?À€ó×îð~u'úLGüòjaºÃPB¯àþ€Éàz Æ¾¤]G‡™¹Â4¸€¡0€]€Pò y¯¬íŒÛß„ÿ}O¼èÊ'ƒÕÂ{/‰p¿ë³ç¢ ¿¶'P@Ö‡?K~´îÙÉ Ý…Z|.xµvÄvÔàerLÍŸ5w((JBõ¶äGu[R4\µÉ_™BýPQýj—š‘ÝHI¯'gèã`7Ö¨uZ&€[×Ntš™­]E¶1D ™«-à`=D7¹em€Ä(ªçÓ«Ê ?o ÏóŒè`°ÖžtÒªÖ&± ‰ºjQffJ†vþÞLß5ÔvVïgbè]t)®&HÛò•®=”¯¤`òãˆI*Nà™sáHº‚õï*ÐS“ë¾Ç SͰ  ÙPW5ôÞÌÅYAúBßä+c D*£ÇDÁ¥€d (8²Á7ø2Y@û)€„¬û'Þ².~û]ä™`" IÁ]ËíâL½‰døP<ûdF"µzNÖ±(Bofý`æí Üç[Tp#L¼Ÿ`Ü ·gpàYã–ðtÇ:QçˆaÆ¡L$ z ß ¿óÛù3Ø0ãJÒê÷|~ýt`&¬mÃ{Ó“¡{ó¶J¯ÝªàÀîi¾€Ï¥Ÿ)ŸZžSÊ2² A;2¤Ý–àüÑ Ùçà=!ޫܾ#ঠ_D®–0Ëѻ㮉´.¥$N—RÈlýä±×ü‹>€m. pük/úîv§ä„;¡¡Mi´À5Û! -P@˜£é‚=ßU&„ÈHî¦û' ÐäN^ƒ´W \ ob¾~†¹úo8I Ï’OÁÀþ…}Gŧ`EQŸß¹ˆ8!‰¼édšh}2šÏ}?!ÓÊh  ˜Ú1ÅÍTaÑlHˆ„Ik:{ÓÛÏݤi ±Ðçrùò’­¡¨i;¶¸(ªàuƒÀby (sàx[1•§û½ (ÖúMæVÙ`Œ-ÓˆR»QŸ˜ôÕ4d9ø|Øn¤0¯O?ŸàJ·€mA‡ÅÁ ´'42s)ÂH°@DYºLB¤Ñ^:xýñYP<àïÝ,úÜ®/x*¼÷Rº\ÕœsP ˆ÷Þ7ýtÙ ^î5€2>ßÎys­O¡Ä6†íR‘œ÷¶OÇÛœ¡Ð!=ŠÜth ðdI³»_²NêRm5*>÷p©!”§ïÌõ_yòLG•’+ç~å7v¹#¤¾ª˜_Q¸|®—æÓaÔÓÛÆm]Ö–¶E‘Ugh$“Tî*4ûÛ‚ˆ`íŽ ™ÞÜ*È@]/w¶õb!"]Õ!–3;fæÃã3Œ]Ët›=ǬwÆ7ÎÒ@u1ÍURûÞž¬èéNædADŽO¶™f=gzÒ)/Dãd3tÕ”Âj²èéÃY Í®ÿéÙnÎ; ÛV9ôV|¦ÞSÏÞÅÜöfèsÃT’•ÏLPf¤Aú €†bà(„òôÏ{ãèTK˜ê¨[,;Ø!o«ay¯W¯î‚)3Ȱ~t†YSmZbV ò,ôªÕÒéVM/3ÐgR¤ézK1]ïöKp ¼ÏyìšÇi#ióÆTŒÀv¶{ ŠÀ»§íVX*lXlËî·ƒWôÒË9Þ_ šã¼s)=Õª’™+šî¼²H×¢0* ÃûFHÁHkŒ­‘·5¤bñ0âÚ¯ãÞ½U*ÉöTåʘÜ|€mdP°ñËN ¾œmªÖ[Þºô}¼hW™Kÿ¹,®+S¹sW(õÁkuê½TD§¨ ¨¢jLä»ôÕÝjª‡¬ äŽÃ©X½ÌDVw 6‹­éãEâýÿ[ BJ%YAoó9©^w¬ØÀ$ ŠîØä®¬µ(yySe«^»PZ¶®¤žd!œ[tk5:‘2ÈìPÍÅŸÍP` ÄnÕÐFqº=i¿baWv!ÝXï§ïïÎ;.SXNjÃÊ(EzÖ ®Ô±"O¼fŠ´[×ÅdBPQˆÅ2ÊЭÖxHªÃ7¬’ñ͆>ÁåzÁjÎÃ+ƒNõ¤Á),?M×aÜÚ¦~ÿ£]- O,œqk O”´+ ð›„ï0V 4}¨hXkvͽ›@ê“ÄrÁ³D|¤ÜAÇ8­ê.}³È±8÷“ü‹†mJ@w]~{¾Ï 3C¦×ø“¸%¯»‡çWwa×C<“€œñ¬ ð;Jpö“ŒŠåݳM>Î…elW>Œè-›\¹?ÀÒN‘¦€ß”u2çƒ÷›žéÉ/x^ ›…(Ÿn"ºÊÊ;rçå¡(³©ËòõÏvÓ†çŸÂÒ»5†ÛS‡eµ»€ÜvÕC g/µ"³öp("šp µH €›âÀXůØðöé2QW§²ü<}'fØ×Ù·æùZ==t¶ —1ÆOWÙdl© )+% èƒïM( ¦ªU¥*6Ävùa*‰cy~kÕFÛ3ÃU¡ÛýÍ%l–%ÆîœeÙúZUV´E-ó¹fshÜ_°Ÿ¤>~jôv“(N Y³^+ªFË"V€¶*°êÝ'„‘X;ŒÁôŽÍ8Û´é{í2ÐÁºÏœ84/ûRJÁ ŸÕÍ_œ.ê‰Î­ˆÎ¢x·d–ž85.ö •†a (ʸ°Êz5C ÜzólØ´vº¡'½[.?ŒTö>"ÚÃí}Ö4nw§«9p±ïXŸýD·¿ûí¹,[ôL—ºê”à Ë: XƒêÖSƪm°6$ÛF †Àà„ÇzÁV¼ŠáÞ–»$L˜Y/[¤m"[8Û}€6ŽÀҠïæ?ðö¼ê©>åZù5bÉñÌ¥|s¬¨X“ewQ”Šº€£0”×@TôE´ÖˆÙð=ˆl#ÔvÉ]áHYáhwŠÕÆ4DÐõÝ7§Ýù化FÀ"5ßy[U7juùL1mËÚUEù­/Ê4Œ!âÜQáZq¤à‰.Y[Œ 8LbT*è3£sǦ¤Ž…3¼’.êÝÞzñ*K…»~* Àoµêà°#‚oŸr¼¡“³)vZw]Yfê1O3fpµ±ÑÏ™aÓç+ ”Zu›IFÀÙ?£¾ÙV‚…+oñöËïF5 E „žôÙÞça·"uWEhCe­Vn0T°cþ×Ãäz‘ c&áZÆÎbµ,‡ìþ¸wùXX‘a :Ô5-RØ™ÕjË8‹²“¡PŦïéu4q!²’Öä‚Á!bô±¬îã=äjaeduj•æÏ^kN)SÍÁyº'¦ûó&m‘0)`¨æ^-"šKQŽîÙE»Êç\ÊÕ›n[UM­VklÕV;HDÑ+Xí`vh– ´ÞÔnmVBJ.Æö™kå8yŒ‹Yiðx ¨‘  e©ÓÁÕçôFÓ!œáß÷ý&{?ÔbDEŽƒp •5!O²j­Gq¥uw¬Ö(µˆÅ©Öh±XbOggSÀê&§ Ìc€SVXFZSSIJXigÿÕÿ¿ÿ¬ÿºÿ¯ÿŸÿ–ÿÔvñª¡4Oß6"Õ*N6‚F%6ͼukZã}†\dr|;9îB¢R墜«>–c"¬¬#…rÍÒ Ã^ÝÿîÛ6B» áëK4¢(JQUòÔ^U•gC¡×clÕYÛ“A€ û{~€#/2P8•á:ÿvÇU´¿¥:oÔ.5òWT •ÁÖ+¨±ˆ+‹ˆSoŒUÔê'|êiJAŒ…âȰn´†…wŒXXÇÅn‘‹Ô²”'ýÝ}€Õ\<:xг%Æ+Q ¨î)T—_yžBÉU›§ËZ)TÊfí&„9NY¥¾lZ%E·+ Â(­XЃXÑ`´Z…½ή § ­úOO(yB¬žû¾øKÙÏs°2€5“YÃe¢šEŠé92ê0@ê.»ã'ž¨JÐJ:¡4µâ#OF¯‰¼ üŽíÙ*VH™ÿo×kÊ`äl8éîéÓäzΤ¥‹Àùš~[2ëjQ¨Ï§]²&A.ç…¥‚,$ÞÞ*^˜«£^•µÎóˆsJË¢T¡ˆ¢WD$À±­.:+¥Ì^ñ¥’!vÈÖ)¼xBAƒÅ­Lóp›ÁV‰BÀ޳ÕÐâ󷿤f}ü[ê*D-dô­¨2ç*ßʱ.;JÙãtË5!hÀ•[¬hÅX•# ìŠÉkA³íÂ;»8"GÛYÏ›ûòýnT¬€qëÄçuÿBí†t¾èK[w]¬»¬Ði"kÝ]õ¡Y}VÉ* ¨*+Å ²";¤àÇÙÌz‘7-u¥^øî¦V Þ ÍA†"Ð÷”i3Ï2•u ÀÕc›±p¹J›ËË„JR‰ : ²Kxqeàæb¦ÉSt–w:AzÌŽÑ&ùþRÊØÕvÉÞˆÅùak€~tÅ À²þœh»GYR˰İô­¬ì8$ŠA6{º2;‰‰KÀ|£m£»£/¡€Xo´Žá“¡Ävâ9WÁôÃPòâˆî²`µ jè`¬~íöÞš©¦Wj|T YçÃbEE­ˆô¼¢Õ®-Ô9aŒVVéàPÆÔcµ)ÒñÛ%dÊÑ<¤V1° “æxO§XyÚ ‚@Xò¨é¶(XžÕF­Ùù^ennÊœÍÒÃ%Ë·ç¼d±»÷{oõ´ÕÞ‡Ð_~7‹Z¾\êÓaYØ¿.æ$¢õý97¨…û±x¿h„g‡òs”ŸOòsiÔZ%–Æ`˜„T)Eì‡ “wÒèÒ¥Å@/éð³ªÊ÷^¯âRßšÙÕü:ô&§âÜqÚ{qž}ŒÓDþeÛ—~=O e1ó÷ý¯ÊöRGùa.ú1¤€©ë1o/ìK\Õï¢þïh (0_q*šÊ•Úƒ.P@îf±Ðè :kT,hþüp.à¬m]EYÛÖ×d¸R†µn p aæƒ\&eG‚ÕóÛè~&ÇàCö³ØC;Ü~ÍÚ1j?™«.×ÎXF©Ð·fLu_š»Vðgï=®ûÙô»_KDï}¬{Õ©_wÛ[é%E{ÔŒ4¨!0¢˜—ðÂX÷ h’T H —1¡)PKç0I^¿¶Üáš¡êí”ÆOº+›Ìed‰Ö»·…Ïg×4I¾€dð–¯Ú&^ŠýçÓà”DwQ4ó›Cž~Ÿ&gÈžÚ/7å÷åßý߈ ’¦ ÉùUnÃpõ üâjöóTs¨¾çÙ¯ØâD0 ·4¸ª¦Âè ažA Sb”·`â®<$€`N:ksUëXÿε¼8î“ç}Ø•ÁìøÍž$Îʆ8 ë™ Kâý)§·4#Ž ð‡¬™Ü¼M\ŰnÓc±0,Œ$@dió¾]@”–név]"”ÑÈ`ÁrÝ^¦І°§Z¥FûçÊ–4kEù¾P´°…_n½½[4i"ÀEÆøÇ „j\nùa£§ÁÝ-xÛ-ÌA‰Á$¢Õ:éÁÛMc½o€OÛ(ò à\€÷]ÉÛ'3HXÏ Ø’µ­ÖWE¦®e.ÒExñìpf~û%½ÁZ ]þ¥H ™Zêcž¬Åã ÆW¶½N±qÞ€sØY´st¨‹VµhðB_ÍÊÑãKFÆŒ_1ð8ñÞ¥Ïv²kC¸VªB ›ÛŒ®P[V(Ô25%˜lÿi–Hê"Ï’g®Ž“>}òhbïè¡#AÓ ähÞé9ú›ºÂù­´ táá§ ™ª¹ü/è~ ¡8îaðçÌñd0;1¯IŠ ¯fº–žz'ùŸs/ä.Ä+z×Ô¼ßüF\< ‘€Ü´™~õ×o–ÿ^yØLL»s¥äæCàªÎJj8üc­êîÙ7×ò2 ^¨ÝÓGTí{èhwçîîrò‡­RlN”(€Ðy_a‡›ˆ¤³uH@/P(0éÇÍcЋ€êý`" {¸¯WÆe¨‡¤E¶¾ RzípÑ–øŒ)È[fËN~Û}‰#¦N·V[]âh'#Æìk<Èàú3cðnÏÉ|¨Â‚}ÛÆðÑh[3UI¹fLÀ€áš©ïeWºÐf‰~Øû4@Nð´ù&€'vo odEŽBat6S°E—ü¬ÌŠð<¶}S-™B"Ò[‘§N@Ž‹Ù S´W¡fo‹ª¸B³ÁuˆŒ 8e‹{äôVdßßM0ifòŸ©_$£sÎñòYNtºijCî¦]œkê×ñ0â@ÄÀœšîfW²ÿû0 ! pé‚9yî „ºiJÝÙ=Ädz™Cæ¿Yô¿{H†ìúŽ€=ï½'išSPó¿÷ík`79dªiæ¬}ÿ¥NŽSÓ læ¡áK3Ï%tìn>>Ü­ö*þ½;_Öùòc€öܽoÑ•ˆ·ia#mdk4µ"FS]ÞWslùaÛà›“Úçÿ€d„¥p˜Œ€? 6èm]f* ±Pÿ  `BQ0~ûÓ’ˆ ÉäjW݃L0@žŸ9ºùÓáQ£O€o€s‚‚íõó˜¼0}ë-£ÖhµRª)+‡“½â庰?úîWL°°:µšGÅT³¶‹Mõu!75P~MKi'x<>à¥C6ÆÚ¦ê£-žP$ë ߯êµÑRäV^Ýö–ú®QyÄ%¯¼Ê ÀêR°KŠô´SؼµåEn!T’ û]†ìVópœk ”ð7Ð^ÙÏ›kIÆÀeëª"Y—û\2äÆIðwáoDÆÜõhà}²À5 ›ä_=4t~aèÉ™Ÿ¡  ÞÊ´o ]&ÙÀo‡è‰NˆïaûèŸU[â†Ä=×}h@¢ýag~ý) 4þÓ·¼£Š€'¡‡™ž„–èäoðøÜìê<Üœë³ýÔÖ­÷‹CB0ÆZÏ£OeNgÅI53==EÇHF½ãùfÁn–@Ò¿"q°oþü²1`¥;pXÖ€’fBKyÈ  [È`ÍK´›k´Ažû½ê9¡SÄF-w—SQk\†ƒ@y²•6} šo7ðžc áÓ 4ïù 7ðà ðÞG;ZS•RЦ{ì®H×1hñ}øMnæ‡þÔ{zeÉv©—š»Þ̯„Rnþ¬©`Y𠙝æÒÉP%¶JÎ!ãfß÷Òû´$L­ü–R€•c«PBéªÛÎgè‚ça\xziy⇽ÏgT²PËðÕ/©µ„öÌ®Ÿs„ô(zýÇZK¢85 «·Ê{Àfƒžæs~=GMrkþåp`¦² åž$š©h>•4ÕôuÃCIFeѪ¼ëÈ@÷ìÉö6Á?'1Óƒ*¦¬Ú›Y /€¦?7Át±'r¨ê9Ì/zhjÃT=æÞÀ„˜‘yÙÿww}’hz(TE‡™ÌOM® H1°`³jÿ¾÷³.P]P™=››| LÉ50µË4òÛôdÕ ’ò´Ò€jŒ’qv; <C@”;Ðs8*Â/88~ûÝë5áMß ܱۙ¡ðá¸x–BÚ˘÷·vèv×ô[‰o?ð¶9 ~e±àÂ!4^  ö ˜=ã‚V8t´f¦R& @“§Œ’rò¾žœmÐÞs+ïõÙõ/ì8ÐXÎ,ç2]•RÒœr~Gôøšb‚Pøl» ø²®€Çï&ÜæÈkx T÷€”M»â Áûóörñ,Y~ ÚI@ý übç¹O'Ö%j¬Ý{.o}[}Ë€4ï} Éu…?© è3ÿ©ó!Ã\]ßLLŽê§–ï9£› ü| .<¯k2á3ûP•âh=$)È;;©æìz’3î:O1¸)³÷l‹¿7þf:S¡°L<õ4@»Þºônùµ®ÌÿŸçr‹éËAö†@¼fñ9ûã>ìÍTYÛ9…†ï§?ÝN¾¹!Ë@Ã4ˆ]ªyg©!ÛZ*]–¹†­q ?ÒEÂÕLÄ|Êa„ñ—´ˆ‹(Ýè+4§HêpšRº~p¶úõñ³ÛÚ²=ÉøF·ŽÞcZ³Â×?ÀW€ øjß÷Ý›·Ñ¬5£Ø•@æò/2Øùv±Á¼\î nJܯKzºFœEZÐõ] Œð£,Yß/N¹[^¾ÿ'ïÌ4ýª…¥}Ã&õ:áÕge6¸¿.:~õäž4ŒÇã‰46~ÊÝéÞ:Ým9:wä¸J`g”6/ïÏYA·Ó|fõ¯“o‡nĽê»‡–:(n> êÐî¤øHHgßì&"|3¡w/¿ùòîvˤèî^kžø‚<õ¹ñ`ˆŒÌì>ÝëPo·®¢¡É‚f†ÙOggSÀ &¨-(JKLOM\TTN@BEKFVQOC?KHFDWKQÿnILU^V^ÿ¸ÿ¹ÿ½É¢tÂÜw÷“œÁ=¹í±Ôþ933¿š¬,"ÙIäö¶5[îÛ6-x£¬OÓ74ÝÃ{æ\Φ=mz²v <ÇOïW »h®CÉó¸Zï 34p¦€,=9ÎÅ횈CB v; ë¿ï€œÃ—ûšf¹¶$sÞ@‘$cà>E`ˆäË8 (€îŸÄrÃ]ÃM}ÀñR¯òb3ýÃ9Õ­TæýÇ$B1X®VÛÎ:]ÆÄöÈ­ èÉ<ý{ ìä¥-¿;9÷õhúùðü†3{6DÖu̎ջĹLr\',? ö{D˜>âp) `©Ðẞü±Ü°JYO(aþIœÝ7ú,YgÞÞgU¢é4'šÝóë}AsKà^¼‚É;çœ?N£m+×Ù¨ê,P0Ű™œ €%ncåòVùÓ›l¿èœQÏ›ŽVb_?|Þ¯]ªçœ{·K­Š(Š E‘Û]ahß·¾5Çys#´Üfóª!hGf|®Ñ(F™œvÆÀ`b‚|<:©Ã'/oHgܤ&’Á.™ KQÞ(Úlñʨ« Úé§2#Ã"*Šê‹Û¸P»#@U* ƃSäŠãTõº“í¶kªÑ…š´»Ï®¿yd‚¬oœ<”ß”KkC{[']RŸr¬±äÅ‘BB[AcUµE#¨T…ÝÇù§}ÕN µÌbYUf¨uB'¶ŠTj¯ÐÁ:ž2Mûey7# %czð†#ìEveÉòd€ÑÆþIJ)jkáÍ}~ß8?¼’ñ 꼖‡¿úfÇMØ}®ŠBÐÀ-:¾ï²ºÙ¤@öaéìjÄnD3ŠÖ h¬PSép#{¥ le( VKÞû5¼nÙa7%7îqN³ôfäÕúK¸öPæ0+Îþ´`Û;A ™ ¬uÏ)•d!L"F©À •Ì^n!8e1ºòý´’ñе®û ¦ïžª4åoŒ¥…÷4›Bx"]àü¯DË~{&Ÿ*?†3åTšÒOÒVšòÕc¯`O¶*XœO` iˆï†èûÊ4¼rãb¨vy§ùœÒ³ý² 5~óŸçW~ÉÁ,ášAWÔv…ròð³qü–d”%U‹­ÀX+ì5_µêî!ä6åp·ÎåÑüe³t1- ¡;£y–ÑËVQzù†$Î6M’ëæ5¦­ðΊtˆôE»=ç9êC”u\÷¥t o·3Ð3¯Üvk3À¹o¯.ktÃ4pŽóYÕâ¼½Ùˆ Òr3w¡íö5.k¾Ž}Òˆä²Q E)µV4£S jké7 ‚âTÄZ‹"XUE£Q^O´´rs0Ȧd}‹£Ýl5:;‘$—ßâ¸`‚ä‚Zž>>üìì5ZéÇ:EŸW½)¥­¾[¤ÌwOŠb}RÕÙÞç0k,‚D”ê« ì†cN䋹Ýk—DÖ‹½Ì`a' t8ÖùGµ){,…Ž£^Z®IUb*4ÆöJfš¹ ¦(²‘ŽÄnåèý6^þì•u Ô9)Û@¤p ŽÔñXŠòöÇ å((ò”ø÷»]¤ ëU×N;yÚ{â+´ŽÉ…8Uä?á¹[/ß.¿àk÷DÙp¾&×Ï6o#ƒ´²ŸŽ¤ðÀ¼5•HœÄ©K¡ZTRge­¡¨àZ©QQ5¤À« -ˆC*(btŠ*-€k‹` mkJª­YÄ&òÚÕé(Ÿt›Bj'R±@ìÉ5¨›Fj§ùÐ:®»Ê59{o]ÿ"À:—ù š§ÒÈ4ˤ¤Ù-13 9ú„öŒÎ;_†¨7jþí!ñÀ’Œ{?Ý9šßûÞ¤Ý>˽žÈF}B^)9«ñ³BecL çz;³H¯T˜‡š…ábŽ‘ âüeÔG‚Ͳª£h™ŒÙãúrІ¡ñ».y`½q&Q޶W¨ BèÞGÑ/&ºVN‰¤¨z‚%F°“Ñw$º£Üï4Mç4"}Å™i¾¢k‰Õc ÒÞ‡"ɸ§š¦¥‚ò”¡æ-À,U¬•-1e˜­û”eƒöŠ;É,€éœ›Öj”IŸÑب¯»Z=u1èjê ñPl ¨™)âÏ’c“Œj2}«H5êdäçâ¢Hç8µ€4z6»èjM6Ù4¨4Áꨲýd_EÆIO àKBä5žªéË"GD3'©€LT°AF²€,ÐLÄb €i„€fAJ zHÖNMM³ysSBÆ`Y¸AN‹ëË,Z ÀÀz€aªLLQIwÀgžËõÚÅZ¤A†vV+ø û”u£Ç²G+°â+À6Î=À ¨lë62Ñfct“…Éæ¶RÄ$€äa¥cDŒuº¯óy$pÐq=&‘Ч43~Uñc_¾7Ü€fàD\Tj{ìÎ~_A±èÄœ×|-’ÃÞ¯†æ>h¨k¹f OwΚ Ó¤ÁÎæƒ.ÿòЧ,÷/Q놩ˆ!b6²{’áÔâŽò~² vïow—úXOXÊÃI¯/ÑøÀÜÓÓ9­yˆ±Äþ¬÷=˜.}pNѽäɧƲ—J{Éòn³U­‘ƒq¶å¡®Rªñ† ˆÐ”!æbé OggS€2&©Ý8ÄÿÓÿÖÿÐÿ·ÿÎÿ·ÿÓÿÆJNLNâ,‘=æAÆPç¼k7£öåäk‹íJŽp;óf*B€;L a—ZORÛ‘B5V½•ÕºQ(VŠ (ê!K?Q §iHÑ‘sªA]ëº$IœsÖí†Î¶ãIL&`Å8¢&J2;!Érã€,Î\m¯ê-¸Ûg;@œÈÑg[^¢!(€y¦”gÁˆdpØà ‘cË„B˜ˆa0§"chE ÝDdƒœ€°(7>Ìm.¥I #¾aí¤}d,í­œA ‚o/p<çÄ ìÉpéJÀ àZ¤P%'¨0ýôg“ ±f˹6E¼2ð²ãñF6CÂò¯?z·ºvkq©¥+ÕyÉ1y¡»ï¶†ýI$š)ûbqdåÃÊm͵ÑUÌJ÷\²å,7Kêƒ6ÉÞS>‡ç+à±×÷ø5-PrÀçnãøêd¥«|ò"-%hŽŠr±üÄ2é‰7G~hŤ¥þxÇ\aÖšñ ëo¾kqš«û½ » gîˆ ]t_ ]L¥uζ[Y'Mª$âðZŠš¼Ø)þtA%½}¼¬:Iñ<_<ýnø-¦³€†BN‰}cÞÉCd€ô> %SÈttÎ>íB5T›hCUXè‹hh b7H4¥+Ë$@ ÔœZˆbÑí€6@AŤšáEÍøÔ}m…ê’ÉP[×fH&¾Ð¤œ [¤´£ÔOæÔwóúÂiMmiÛz©CÚ¢”œ@ € UÝŒ€( ˜Y`—& E`dÀ€‚8e(d ƲÖ8NÞü!€½8V­ 5‘Ö @r þ‹­¾&0øz³#õq„@þ‡XºÉ§±Œ&ä.^ãÿ~~šiÊà+ÀÜ/àr Ø. tôlTtF¶ l>¥LÌk×UµÃýÊøõ§¶óZË}n{!=¿«O+v‡9_¹ƒ ív…Y|GðëGŸºÓFŸ»Òz-£»ôÄÙÃSÂ@3ã ­wOˆ+- ï)"”g/š}Ó PJqÃYÍöwÞﯞ‚h‹O}U0¼±BÓ G¾*ÈÒÐiE)%Âa ôÚc†â @ħ>æžõ>ýbˆiÉR‰ «Y•>ùÄû¬Z°h×:'víxø¼H‡tA•o×Üf[HÖ$>ûžŒÜ·Éh$*Z:ë+©@NÕJMÖh(_Pa=™]Ù¹ˆ×#¤d©Oàˆ"O¼À4$=ºÝ@ä(1S´ÚåÎ&ƒ4‰k5¥‹‘»©­;!‰Äë…‡µ¯È¡é”Uî½qjÌÐB©Bh5i½$ɔ̨¾­F`úD‘ÐdÏ®MQ-‡ŠuS×.¨ /ñ’ÃÈTÜÓnù@Ù6¼èžÖH ^”CWÓ1jUÆw¼šãp&ÁôUÈ DÓŽ*AÖ¹EÜmhK©;<&ªë;ÆÒ&qîPeõú¨)8(°‚‘ PÁÈhñ„DFc ˆƒXÀ¬ê/å0\2²ü)#˜!€ d4 €«¼ÞJõ²¶ŠÑ²ŒSˆwŠM¤'G§ŸäJy?€«'èd—øpÀk?ÐígÂþ> Tœ€– ˜9¬| Z#N{ÉêO6¼hÍ– z0atèƒJÏw×û³¿œù6€¸@ËÝßå:¾¸dÇ'‹ÇCøç¥þø!@<"š /럞\€Pe(éã@Jj45”Pð{æÍÞ‡¼C?šRIÿÿG/œÓ@¤ vÍ8ë4>—€ €áSUæPZQ¯Ö“šišv-¯Í”)OMà¢QœJâ|T$|~Q³€QOd/ h…>\HýhfÝœ#ó°-€0ŸÆ«£e ¤W#˜™U¦»«[ý¡Œ]@Ö›dMÅpÇŸ«œsrè„,ŠøgrCÎ/¨VBÔcqÎ3C‚25f‘U Ô¸é\Ó8ÑU(=Ó4ÁN'h`uØ^7Í d!ä±xª´!c¸;hƒaF«tQÞEô:Ù µ‚Ê43&Ew´m‡•^cÛ><šØ£,!cŒ¢jQtÊD6°ma†Wb¼Ê|LŠFI:5D‹ i@FÃ>½²&´i™ æÀçÕ&›Ü´ò+ÀÇœ+ ¼ña&ïù;0.à{7  %N¸‹8o~ø³µ ì·l¥O qpKÌ A„:Ýtu”öˆÅ“ï¨ óÚR¨—ð¯^dð}€à)Pèsƒ‡L71-BÉDtÈ HN¥d ±YÕk•h; e”‹§]»öìs …à‹sÞ-ÆäR\²2š˜ÚXC6V§äý™ æ=AZØ–®˜%Ví½J@P‹H$âËŽy·Æö >/úߣo`[é e(êüX¬€k—‹ü鮯Q›è]Ñ H¬U #¶¸3œ¸¹Ò©k©E^æØŠ†¥Z/=/T:a f2ôëó¥òεÓiW'ZN¦+-{l½Ó3Adæ ifðÝÙ½5aE¿@ÒYyešÀtBOuéü¤þÞÞ3Z4ˆ^ì/´iMÚ 4’4³ôZÖ¢‰ªÜ¹T00‚&TÀáÉa=–PÐ(–±-)mAŒdGÆD€aÀ†Ž¡a‘9P0h![Ï À¶â‚¯5À¸p€’~¬v¨•-B›Fš`þÜkt+¹L‰o‡ïùö€tòË–ðþ(°‚3pÀÜÍ og¶O¿Åæ(…r›»g$·“mi­rvÌ•bô6PÀ8$Î&úÉŽ iÀÙíÙà}ŠóFÓd Œ„bÎP˜<‰ež÷êÛ`ÄGýÝ€ÈÅKÐùÉ÷•i 9”@V>?6PÊÙqƒÛ›}*Ía®4ƒx ôŽ‚&Lxïâ\"õG×Nþ÷­gǿ䞆d 6K‰?"ÚÝÂÍn€þ !ŽÇ*¢IîÆHhˆƒ×ý¡è¢H&zKÎéÉHp,_ßèÈ_;Ƚ…dÖh²Õ €¢-€Y+餈Á?ˆ5>× Lk¯:¶Çòd”4Ý4²«k2 ©b)fm Œ€ H°bfh°¦boBbZæˆV…°¡†µän &æØ±ù•(€` G‹AÕ1)`06FU5êÊü91óǯ¨oÃdC€‹Aƒ€E ¢ªgDþù,¨FâŒб¦R;M1²‘Ùs9üòÏíGcyÙfY?ÙkG¯2è–Êó qk`aæ/Dãðwkv{ t ‡T”›hÚe/Zc¥‚‰ÅHÀé#ÂàªÜ×™ÁdsXÆç2Àïti{ÈŒY핊ç÷ÿ Ï8íTF9;¯Ý®+T4ïj.t…ÆYó™9¿ŠÇW¨;fôj5nÆmVJŠ Sþ?Ÿærém¯iñ!S2Ðüù9#Ã÷]Œ4›u—ñf]žÔj˜b.MשtOÜ¥WÑfz¯¼SÒüû=ÚðŽ:žÚ¨¿½t~!ç†Z€íö„5]Ÿ,X!}Õcæv„–ßÑ+× #®_34ú~vç~Ês ‰ôäÎ;åì?7÷kºG°Ç®ãO!É4=¬·&¡\)Ù‘ÀÒðpyë|üš¥˜(  ¹ï19 ´&4t·Šyœ“¸:@;À±ˆ`ê[?*‚AÉîñ,Ì@Q° ƒ¤QÜ (ËÛy\¨eiH¶ )J±fÕB%ã`Г< Ê@œ¹Xå„¥ñ! ֨İe›8€È*V¦X. —?À7€“ . ‹3~ºy}ÒãpñÓ†'üGWî~ú“¹€%ËXé5hÏH$y5â\Æí=lL`ôFNëo ªª Á´ º®q郧ȋgW\z…Ã96CžAÄ—Ä7ÚöÓ…Bð+r¦xOfóÅùOÛ:ëVûBÞЃ«;-øš¯ýÑ÷»]L.ð=lÑÍ~`j¹ÛïèMׯƒnxÂÒ;\”ÔĤÿíÄ2SòΩ‚çÓú*­¤ý½¹:^ir†ï”é±MC³k›'ÖÖ²`¨ ^‡žò¸‡;›B"”‹ŽßT½UgŠž}Ò×,oû~z)(º ºœ Þ~Â_o¨¢r`)Õ†©™Ö?ޱuÂÎqþ•R|ÂLÌŠf iõDYéI€¤IÈR{QÎDd 㹈œ‚@8ÒuΘnŠÎ¶Žrøú€Mvç Ù=xàØZ}å%Á…@Ñ㌄¬Ðlƒ‘‚€Ý£u%P  @ƒžzð„ B²h€6Ý€ Þ¥:t"AµQØÞƒÅU¨“îvXäCWSǯkÝÊIp8ÿÃÊ‘çX’ÿs÷¶ÿ@_2pßcçœÌ¸¡¥3ËE'­ß;0"¯:µ`?î…Ö’†£Mì€ý>)¾}þê·ß÷2Ò¨ÂÄáêNwDO_OÅ&>¹t^œ_°ÉCž .**™96Íp5ŠW©c^|6‘a¥/Xg&ç1ës]½Íe8}&þíÕí¯¶¡t²#|ªú\ûßs˜·˜ú0kǰ©Èº|VÒ5‘¦˜B‚(² Èl"Ña'¥Ò3TÊWªœYèuílÎ÷'ÿõa i@°­]ó‘óI;þv*ÙëuË}^§ûZfÎÁÐåS:ÈIˆ*€O˜=¢GåOggS@R&ª0Ñ9NMP[ZTIHYdiÿÅÿÞÿÏÿ×ÿÂÿÅÿ¼d*Ál'FJÅ|ÈÖ«êš—SÖFÝ9?õå¤w#µ°áì~ûÝœÊRzQOþ™2ǵÛììÊsÍ.ÙdO#Ö'a>M(U ã ß&ñžï8uí/ƒÐ* Cø1ÊF½|ýÿ³]œúÓ¢¤úö¦|Þq¾K™Ïb‹ù߯²¨´IóÝ\Qøc'ß ’y÷ýp*¾eçit*“õ´=àÒ4!Ž:Ùä–#aºÇó›¿{‘g‹æi‡À‹"®÷ºúðí* FþMòòÓ-³l®ãØO`ÅãwŸÏÕ‚VñTe”Z5û¥ªEŒ‚5¢5ˆ„:y3¶£L0e Óyåχò]¤Â ’u[f-©± ;»­#¢K-çZXnr Ñ”ú"nÏ<òP9­\:0õжºQŽú¼Re‡ldž˜úl^©¼³Æt¨éSOÏæ#„m2ÂLz'…¦Ê~jÆ û–ÉR×2QWE5K›QtƘ"ŠÙáW¤:c5Î=T8ÖªS%)oLÏXǦf2ÎÇ­PIðßÕÜk«òÖß]gµHŒîq!Œ»Zï¦.ÞLª ôç e×·m¨Hž¿d b|J|X ¥.ôØd©îΧ“åý˜eÎecðNvÃÙ-ÃÖý&I¿ù•kQw}v-¢xuÁh‘8…¢T5š b@BÍ"ãØ¥ØašÌ´ ‘Vr ¼Fi¨´ŸGjÅY*¤AÐÔqÍØZ™¡¥€û‡3ÆpY#.š©ôš[9ªá—/µÄ«éýÉ[©ŽŒæó9rßýþl‹ñw¾¾²™Yq¹(õ¾·Ï¿ IsàÑÞËï›#[ArNV»/´VE”–S0åRQ 4ܤ{û0§C¹ʧ‹iÎJÕ–˜= õ#ªµÎjuŽ«NÑ®Ý9_èŸñö´¾ãåà~%Ÿ°néÙ_gGÎøQígŸè€Åó7ÇÚ&|ÖñûŽýo/:ë•TBóÝ«— èäÞàµ÷ï‹ÞÉhƒ3 üèL:²a>¦2´Jidˆl ô%ú DÄ^qúþ÷4ç˜ÞŒ·‹ò3“MÌìö¦5’Ú¾zIY»(Æ7Qÿn“ŽZ4S™¤3¬ÑÁ"½›Í~³£¾Ë‹åÒF»¥¸n¥£‚€D"#j¸(MÄiÖˆé¸BÎzÝ–C 3­ºU'5LsèêåÅï¡3²ª¨°²`@ËIÚX£t±ÿuÇaWÖGî%‘[ötsåÇa%Ïl.Ë|ŽÈãSÐ…¶&_2 }¿Oõôª5Ǽ=U•|6[6Ä¿rŽ0ÐhDonJžnÌEH!ãš™±1åÛn {ÈðTS,˜šõÉÙ¹¶~'=©ŠÇIJ ëÖüŒ¾;î_Ñ ÓdN%[#û·´ Õtâ£_.ÿöØsM½Z—KY»·?–ñþAéø¤Y;ØmcØÀ)%Ùýb|c0`Ö¨–%NÄ +lA€B}㨽@R‹¤Z!Í™t_SJe’—â¥eW8¿â1>wb‹X Å1:YäBŸ×t/SÝê¡Y *>|]<¥U$©½`ì$0ì¦ãÐ{ˆ¤M?‘aa_øõ—kßW+lÜÀ9.û¨±Qßú)҆ѡæ«@‚NÇö­{¦®-¤½´[w£ém/Ÿâ%¬#CÕÀw\”¯?m¾¤¸éufZÅJÈ Á××ù`kW²Y‚™?¥º±@ðääþmîH‡´¢èlÖXE=ÛVÂWÎaÓQ4¢=%\x¯­Ù©RÃø¢LBg7;„òß¿&ÇqŇÍεՀa`èEÑÖ3z§“f ¯%¾#ß/ éžçójÎt¦¿IZ3º«çtý5ÚP02çÙ@múÛ8 ]‘Ï=ÉNIX—Ú͈®9îúfb˜Ó,ÙçÚÙÿnç}hªGCsæN^Øh¥VâKžò½‰cÇ>A§@Sž0*×éû|Éi’«·gv`j¨™cCLÿ…|«oû!˜°€1ËÁX‚Eþ°a•d )èn÷hÂKಲ٥–ÁƼŒ,š"Ë’­M¦6úq#1†’*Q­ Ñ? 9#üTZ±š…i'X$ì|¹NÁ#û¥äÏ€ˆ%ž[þ~‚÷ÁHZ%ð^K­€ÁÑ ÐÍ^bPt@î}"× úꮕ[k´«Ñ€œ{ûǯy =;qâFØî¦–m ­YUº•.ݺ€«áôõ_q¥×áý`°NêŽÌ—« ”§õT6uuè:éõ\FÃmxù²7– !F¹…’ÉyËÈÙÃf;C¡f© šVmC·ú¨†ƒØKÖ`3£Ì…z[s˜ÌߟlÀ¼¼s‰ncïJÒÑIw¦£ ZÔÿö KáþІ}Ì!bï×·­ó¢Û䥼0Ûì0Èø;îY¦DR´)’<€—íêcfΛL7´çÙ£ø¿M33«c–kÜîçT‘QTÝSõùùuúÎûcbGÔÀMñÕŒùᳯÎÊ™˜˜$-sÙ¿êÞåžÂÜf³HšùR‹ Å†’ì­Â{!{D-Töxçܹúøþ ©Iè1ø«Û©)bÛl×ÃQ1 b6@¿ `ý fwK£,@¶€«0k'À[ÐÓ@,! ËßR€…Ú%x4¹ËÖjÇòý6ŽàMÉ0À³ÅF€ËE·ÿR¬Ñ“F$’\ À`<¾H?#‹-ÌÀô¡›Í¡Aõe@†Þà@+ÁÓÅft:~YË0ðm70°e>:ÚZ[©¬F©cúDHò‡ h~Ø{s)ôBå)F^!ĨzK÷Û8 „OË„B'>7&ß÷J—QJ.Á·0;ëýäL>gŸÉܾÜÏÞHÄk“Ü=C»$xÄß&»ÃõâKÄ^Ð¥ÚŸ'¼óÙ¢Ѽ¿CݶQJ†„.]%„˜ó–Ö¬¦Mì='X¾;r—@HeÀùÙiX®ý¡ ÁEû("ó•a¯>/›Åò} fÕ²K:‹±äùøä¾7¾pÐ0”dðcà`X„拦âÀ(S.0O-àAR>„/èpÃ… ˆŽ‡w%ejA‰Œ<6«¨"â%ðb^‹¨É®ŒEáo7»0—%!ehúkNJ€ç1oÇØp™'ðÔ^$:ñ©§iŸÜؼ_mûÖ¶Ãûi5Š V05¡7ÛM™þÒîpû‘hɤãGÜ× ²yµ°ÐÇ!½ÿCsÃ.ÍÂð&†0¤L êÝþÚ×ŘƃC"á\¶¹êÌ*Ýå<ú»4Ñ Bl‚*ÈN`R³þÀ|ûJ…è:Sœó)ƒ+¨¸Ç:vNuš8TLÞ4¬O†OïO·#\”d˜CÂ'\ÈÈ”-iã"L4±Xb~;ÞTwNI®æ¦œl .sÑ$39å®®»ÙÐ5†I…Š7Ét'ÿq ÀÔì¾îÞÜmÈxYÓŸlzš$«f?9µ2tÝ'YSBø£_\$ô´Ñ[Ã[XÌ`Èâ~ÜQ+2“LÌkUd1ÛüŽ=‡›" hCo)+Ï?ñ¬*·@„1¹ò¯vӼߞ®6Á@rרzÉ]nT­Úè€GŸ˜ðÖ«TøŸ4m ¤E-¤Ý/‚j¾‡+qŠ—\*Æ †Ò€šð«@“Ù±àâ@sQ{pJ¹!‹¨Ú¯Ø bºi¸Ïæ!Sü–¦]À7€%x*@?® ·$À>ÚÑÇ/Á ´‘à€3¶AGD‡¯¶É$pŽýóm1òD0 Xûàyñò†´_ñ_|>±&Û“¿éI¨ýBÈje…N!»a(k(º»ñÓ=²1Pø‚LÂOð½.ìæ@ l®FÚü„ð“¶>ç"Gd„ !¼l¾«v½ù°åå²DŽZ†cû}É.Ü_3F=®ÊüpûÔÔª ªÕeËÒΡ\fÑË¿>¥„yšîÏ™*~›ªÝu1ÕÔV¶jœ—¬÷üê8ËK%Lh, ¤8ý—Ⴠ¬³\Ù^NV²6ÿ©.Á­¼7糫ÉUК­éž,`'®¦ùL4Êò™úPÙÌ¿# 3¦èÊ)A?ïòi~²ézÈN @íß»€6m§C 0Z©4ÉÒRtЦ[üxãè~Ücah¨*Ó@¤«øõë2ŽÀ@Ë2¶D¨QËcxßÅb@ø|=ÀÿJL ~ @1OggS@v&« rüÿ¿ÿ¿ÿ³ÿ²ÿµLEJGX`baÿÓÿáÿÌžº­Ä’Ò‹ ’àԚЧ°‚døÜZè£'á+ÀK<úT³$«¼Ðag`­!Êš‡ht¥Ý”Ü•$ ô’!|~cºÁ~:N!²Ôê¹Ýùð0wÃx" €º ~ÔIðK›œÃ”@…’ó< s‹&<ø Þû-ïÿVd²«etíæ> ,= énÈy–f8žµ‘½²? ™yÜô"‹ió6¦¢ ö qð2¿Ä¢77P ïÔHòpc£êâHš™ù­<ÎI¤e­Úˆ:àwø»?!ÑÞ ™ABȹ*a¢uÄ499ÀýaœcÙ6{üvubö­Êë%aË(Ÿ÷Î-‰Ýaï5Ã4]ŒŠÅ4=]=ÑÞ4•\ÿmsÞz讞ŠõL Y ôÐ[ýÔÇÏ;;þ®ý(ïKÓyî-DoHè3"³qzmä’®U‡\C’άS–²ˆÌþïf=’àèSo‚×ÃÍu`òÓòF˜Ïg—€per› 8 @ÙëŸñ¹ [¾ê^])WìPXI àÑ$¾|æÏ' ¡Ù쨂„a·µµ$‚ï(~'œ6ú„W“yå~„÷?UœÈýÕ.ð…Œ7iÕ·þ¤@&pAƒË‹œs´zQ=¿@Öž>T„å;@˜é"Õ$Ð{½é™dØhs 0Ÿ}½¶ÏCyáqé ǧòµÄ=çß*ªaŽ»÷ãºí«øÔ˜•3ò´"Ûlù²Ò0;Ð…GȘ­dQés’í+svÆ×‹ PxΔ³÷±Ûv9ËL:˜fs£¢²uõpWÈf HDús«™Dq5`ÅȘÐ&2²^8%=´JDȘwÀ=P€÷­ É0fÍ‚6,8¾i-Öœ)/V¹‘K ÛØÁD2ø|Ø _3Ú-`êIº1&þ÷g× àj÷½àûYg@¾±Ô?ã+xáÃ,ë ]÷Ü‚”!Sn>¿@V€³‹O¬3>“ ä|MG”装ØJÈ%§ok†pã_Òð¡ÑgGÇ@µ8áxØ/ÊíðÏ÷€¤Tíã3"s—¨„ð+g€Ê©|JÈD³è9¦.¢(×Y»gÜÇF}4§›zúsRYªçÉÞh)Í÷yðIý :ͺ¥ sG!7µÝ¢60 âMeÞ™]á,w ‚¾£~¿Ò¹ DÏS5³›$CÅ 3 OĆÄíøÐžzªÍuZ?„ÃñŠ’Ý6à ¡sª™,è¹ièÞñ¿M6B©\–t_‚AHD!2 Þ¬fê¶ÒaîwØ1<;†¡ Q }÷A³D¬YϾÁRV2ÄÄ –vR€“¡K·^WC`â(AX@A3 ¯`°ÀˆƒÐj„À7ðÆ€P j”5ž]dv’õÀ(¶Á3Æ.£×#†?À€b"€§´¨ûIx gD¿^„Vùä$.à!0sÆáa:3`é‡Ùˆ5Äèp€‚ ²/{ÆàíR‚Ñï»9¢öx‹ã‰Ú}ªGé …©¡›Œìçz·f¤ª_9[ 2XÆp^<’ʶ[éRFçåC¦d Ï=Œëëk<Úl;Ä]Å2ëޕ騞5hCù á ¡‹v7N, ¿€¨2öÚò …d/Ëw¢¶…i‡3ATŒ¡õl `Ÿûu-F’zYâXå“Hr„îd˜ÎGèæ²ã2€6ú„oé*ß—É´‚Ë{`zT=D— óbfóˆ-¢ ¨$±ž°eÏá’Éê‚ðàÎÂaк™3C`+„Y‹®=‡$—C)ΦÀyÎaØì»,B3¦0àˆô» t@‚”/€œ€œ²VXá=†‰hÅáyEä=RL` [<þÞ{”¯·/àp¼€„š‘.¤á}èÀdº€ŽÀÌÉL œñ!°&Ëî¦ËX¸ @‘ä¸) dn™3?Úî¸,äs€üÊûu »Å·¶I÷8'…õýAg²ˆdá›eIªJ*Ã0ª÷‹‘Ao2¨>ªJ0åùÞ‹xIÝ5£º.‡ ¿wãµKðc2™lTIÚ“jÿ‘30F‹†}öŒÔûh æ±¶ç^<(JOã[O.ÎÞ{þ·>1)cY—n¶Ò)ŸØ8î9²öµȬ%÷d޲Ø0cQ@B[0d¿›C° /·–¤ÈIͧȡg^Ì^@0…+|ƒi PìjªÜÊí1Vò© ¨B€„44 ßɤul*ðY'+ŸçòfºBåa€b0ußc¯aþ¿-¸ÝxáTåõêfUŒ9ÿ_ùz¨rh¿¹é¸4ÛjIã`çyØzhiá3KRÓ3Z‹÷öž-¬F¢Ce'`‹£" €Mxj0‡²,2‹Þyõñ\j©¢¤ ΔdM6¦h.Ù$oo+XßñèIŠ2×B7¾":ÉÎU¼ÙG%  \Þ¼Jù˜YBèôJu»Û·9ÏÏœ¶¿8 º.5WsÞ%Ý÷âyPŽtŽÖX°e臼ú5ÆÍBw¡€+Æ@Ї'ÀŒFñaCýˆ—þŒ¢‡ Cë~{¾ñø«~'´U%€öæö™ê¬|„6ü¶¬0Öä7Źó}£æB+:*[)°Œ¦+®H †<Í”Zµ¬cÉŽ…‚ðŸÔÊH0dB½:Fe#ðY„:cîXsYä>"ñͺµ8±Ê¬–¨•­(”jý¡ÙÇY¶çÍåûFÅøx®__"R/§j}ÿo#‰*×W<†Óé5´Éõ²×¨œ¸PärLìÁÄ Ø" H^€œ.¸ ˆŽˆ+’4#ÉH"›ÐŸ4‡}ß1’Û†…éÏôí~G?î{ÙïwÇ?–¼ÏçSèõ¾8DëßÔÇXæhÅßßtýìõÛñŒ HzÛõ‘¦Ùôb½:Q€Í€kãhz•sxßÖwÍ|ƒJ‘”ªvˆ@“;Wè>Í ƪûÓ“°q\ü'‹Mðmœßýù®øNöv͉ˆ Úc…%3†9¼øÏçÒ|¬¾ÍöÜEÓp1û:oϽ´íáÅÎûj¾6TÂsû›í‹l°T*^W²ÐJÀÅ d¬8¨fz?Ó¸®°wLÉ4åfÞºv”B/u”Ñ5ÚÇ\ÜQkâç*ÞQj’.ûø¶9©ªÍÅÀ0çßÇÃÑÃéíG€œéNÓ¤4;N “Y@3»“§?ö–\õ´:E/¨‘I÷P½t<ÞÚ<¤a}j¦©œº6m!DCð,“CÌó3;††éÉC&WÇíÆ×}ðÀ‚Èé,Ÿô|°J†Ö¼zz‹¨ô ¥!%RQC1\~Bü6!bƒÓe¥Jžº4½Å!÷È”äëðmM[ÂLö´â–ot7‚[Œ·á$€¤}à h°ˆì¾üûZjó ïc^¹ßÅ ß6ëi?¼ ƒ.; ÍÃÙ½tP±5?§ÃÉ¥$'Z2:À+WOHe‹3çá¶ùÕo¹]·™ˆ|¥”Ò,ŸAÂõV¦-1ÛÕšÖ€Õ—‰?å;©7ù3Ǘʹ°ÛÒƒìº>‚ó¶&FëÓiaßx²jÉ—xG¼8M¿[Yž²uN+&EŽNǪzÒSjtpöÛ潧‚@!rv"wëGÞ軋Ε•DÙâb=·0_®^<¶MüjVMÿðìST±;“ŒÛU_œx¾,#ž8 ƒ‡ 3Wwúîáo.ó“ùïr”¥&wÌlI÷ÛïÅaéóT“7•sr‚w²0½Þ?610;òï‘}dºgçà5Ú0`œ äÔÛ?Cÿ¯µá-’©çê„(^¾Å;J#pÉî«z©†,vÞÒÍ›ëaŸ–¬“ÎNyÔá 6|Ì÷êÙWsu3ö$•ÝäÐrßüÕ1¨£Ÿò)lûÜû.¹NO&  Ü),04¼À2Àl å=@!ÚÇ#  ü5¿º¬õ¯"úüÝ6¡i›È­ Tª #h™—%¦@`fÁX°½+l‚8I1øB(”ýÈÈáEä² sü…}¬ç¯ñÅ`€›[Õ€ P Þ뼆¥/:-„^îv./@ó³\§šžzûM®x>koox ÞìÀ~MÌmëæó®£¾¢Ò®kA›… `˜Îú_{Ý03o ¢9—‰„]ývÔâ{yYþ;&OJ—o]8³¹Ý[˜PM¹—Ù{×y—¤Ò*( 0Ït‡vÄ7Êúf]m¶ý24M ÇÞ¢cþݾé¥ÒA„ ÎèNF}÷y¹Ä½2r˜™†dÉDß}÷ᬯaˆbZÇí„À•(£­J_œi6 ¼½§9ª|Xœ%ÆwýÚCo;Ñ3d-“ÙsyûØŽ!ŽI #6Âù_ÙÓžçñßÅ¢ gž¦ÒŸ_S09Õ•½{Ùd  :G¢{ž_Ÿ®µ)˜‹‰p@ðÞwÈXº½Ke0tMSL5üÏŸ•M¼L9YÕ9hæÕK™‰Ã÷…C ‘`Èl2ϯ›mM›«&?êö²y_ÙaØ{ HJo–5`dD[æšY€n †Ž ‘‚ÈÏ6 ˆñâ 0*H\_!L¡X»3fO! q`t€­ZLŠxq Á}å÷FbÆ=©u GÒOggS€ž&¬*®²ÿ¸ÿ¸ÿµÿ¯ÿ¦ÿ‘ÿ–ÿšÿ“KGKV`¾Û=L“ €Ð·›==Œ4‘A í3ÅÑÉåÈhO‰žïÞG; ˧ ·e%€ÛS·à¿:ÖæÃ×/£ÞL5‚27xSñowvò ÷†ôÎCuËì'oK,m#(™Û¹B¡Õä|(is'+¥žÙµ!¥…1ê¶ñ&-ÛÑ!™Æ\´Ú¦ ßüFœMl¡üðó t´39ÂÒÓ'û¡ ¡¿ýYtùý©ÿS Õ½§ÙY{8¶sŽ½ÃŸ3'i *ÉœþÕù2#éZžzáT¯½Ôˆ¯ï{$=&Oœœùîž„¬ØoCöe}NIÙvØØæéùI¨™x„4‚ÆGŒ©ò—î°ÆÔÏNñ¹ùZƒXÈ ÞñGT–€O™n&ǵ¹û&àhÊтBþ¨¢&Ô«¬¦Y?w¼*CM“$‡,˜N†™­§ÚÉv-?ºÉF¦Gf|¼³ä63§:{ÿ‚Œ¶a.õÿéÓeú›Ëù‹ýûÝï=øxúu`ö"‡~§ë¡òmðs¦ÝÙ£¢€)70g®¡ó±|Ц±0ú—†lØZkóp¿†€$3ýÌV‰xyH00¡x(¦æÐÔUô/‘5ÈÀôäÀÀhGó¬?û^»A.÷Н æøµŸötOBu1L3OÈùü `ÁÛ`Ý2B—ؘú¿ ©Zˆ;Q`¶ßdБ zä„àY…@À…â ~^罜‹Ц~ûݺ˜à€†Ìf³“OQ‘`ÓàÀ<­Í`òÙòx¯ok$õm¶Ö‹„­’²’2ô1Ilœáý€: cËø_ *#%CÖäÛÐ}æœØr ¾Yh”“Q仹“®dxZZO•—·‚Í»m—(ÿô:©³–åbÏvùû™¬ÖLÊ÷Üß`Ç4Š@Ÿ›õç h,†­’@CL AìZ>Mî}<à^¦ ¡Q2õK< çÿ^¨Cc®Ú\5?½©lHº êÊ3µ&3Á»{Öj_•_:á]þ‡;h¹ÞÛ~3@]»Gìâ"÷÷ß #Uv •ý?šê™>üYdÑÐßF:$5UpñÛ&+¨ax»’®,ÝC1üâÛÃо߽ ‘Ò öìô,,æy8½þ®ÏgÍy( ‚bh+«¢S³»×É’7ÌN€ÞMÄ鑌­ŸÏ…ñòÀM[R*Åg’0Cã†qW;$ ÓLúº2 ¬×¸ix°Œ`€l°º4J)\>ÑËVφíÊ€MœZ\§_jðØâJÑÜÞ þp1!.:çôrŸ.¥Ì¥¬ <Ëóçv„JË(:À—Ç÷’ÙAVnNoÙ0{tg3Þ×ç0Àømù˜ëXGW3c—V€¶­ïÃëA¯Á|x†Лð%ïê^AZ^rì¼ÝßOáÞG| x%7KqyÇÄ{¨Š¯0<λ°ì 5öL„ ô¨7+ÑÔ&Z1—ƒ*,Åÿk[ `hGe1 DûVtÿËß°ÕÀœd(Ú7´ÀØfýõîº,<(aò¹…‡«³é©š;|qËu>óc#€šâåßï‰i³‰Ïí~¹Þ uK$ oSFvxòÀ쨹ã(9›ûën&Ù8=£;˜bçæûM€W¯ßm(Ñ ]·I*!Ýxw 3d @@××ÐUÓ©¼{ÎÄ•À†œN"3Râû’®=e’J ÞfÝ…&©¸œ;¾ ©f€pVltPýÍÎ6 »ÌÀÔ@ÞyAm´þâoyãâÍó`H#´„„1tWåD´Sz€À;Þ7€À­b*P€_¡Q§¾ ~ûž‹M÷m÷.[&€¯ïûäʦý¥¼…ŸZÉ]àú€­p;ró¾mcšR¦ƒ€5I2è¼Y€þÕd¿‘dv ½ÏTà:øòµýLn¯Èd”^#‚ìnx¤@oé=¼»’BñäíU†®øÖŽ@!Z| }7Ø€Ûé Ê,²»ª[P¾÷Ó–£ˆQê=¹çUo¸´}Ÿ™vÒ2×Q1YAßTqDƒ”µðæž?Úxmü˲T^vtœ¢QÓØlÇ QŸfT™Û.9ô ÞW{s†–'Ç;Nêç.SÍÐɈ{Jõü ÐÌd r2æ÷RIK¾…º÷°_ø¿'n* b:k=§¡œdgÿ®H dñ«†l€„Kç…„¡²_Ú Ù 4'®¹…†]K2˜b’'û‚éÔªÃLá`ºšœjÙð™1$à8ŽÿX¦fš]›á €,(ôõšà€ü€J0€ü#Ãù‹@Ižûýsº6e±j.•ˆ|»Ü‡œÒõ.4à™£ù3bÎy¡çø°ÀÓ&8å‹tCåO€ÿ=ý[à[g׬5UUjP®”tIŠ0ºÞýÐ ´ÇØž6ǹòxJ8Q… ˆ½Çkñ{äÃÞ"7K˜|Ý,Íà3TßÖ 1Ôh†ðüå×þ-…ôzo››’kúN:ÇDM©õvå*’9éØa‰u€Éhªy~Ðôg?ü°(${a‚´jãѱI´‚.Øù Í}°âŠ”ñÔ×ûGìÔµ¥ëʨ Ž™Î¸ ˜Úp:ï3Ûä<Å(«bh&ßûl"3þ>;{›}¿jgÓÅL»éw N0*„CSs*< Ðzµ`H¦áLÒäMúÏí ­3-~œøÙ4Ðh˜©,JçsÿrNº=ÍË<Ø^?›úºE]ÅR ë,;俉Ù|³Z ëÏTø‚c8( ©s" Ùx(0<Î? ~ ~¸3^‰Ngk½ï,÷ª×¨XÊ‚m€×j½³À[®8>ŸÉ˜ñÉ«ÕGÂàø6jgàó¶-|CkF¹<°É$p€÷_hw!#ÖXV¤†Í>ОÇðùvÄçLÉÇÅj!Y&}ç¡¥¿op@3ÑFÍýk;‚ƒ.9Mì© WëæÁº‡l`h+r¶Ìe’cT·ƒ4¡—¦Nº&¥È²2¦ÙÕHzx¤_\E'fGF^好¿g§ñI‘,>´Ýu¤·8n?·[Ñ ŒxÈÚ=ÊÒj¼îò ²9¯gÿtÑÀ”úöÌ÷!g™xS]A†»ÙÅ$CU¡Š ¨ûsæP š½R/ •,qVÍOÑ*øq¦ï 0é r¾î£”[õtÞÀ$0"ü0׸ÿî7·±S‡=ljßûéÁO%4CPÄŽÓ \E·bÏlFu@÷Kb½Œèâ`V‰4hPEþ\þûÝ4i›æKgkM¸o¹sMˆ¤ô:Õù™²R#2MÎÕ~dMWê†n|µîoع€×ØØLÔF£jR9@(Ûš1w_ëK@LwŸ!QæŒî ¡B‚Xþ¥ÿù—^•¬Ãä×±?m,EF±V±Ì&†€ùÎió²xˆ–×]–onÕ:œI@ÿ×Ì’ó'àÚ­”­aù ÄY ×øæœih¤ ™wÂTsL‡Ä¦Í{r):¢þ½xÖk;¤®3½sk…nÐZ½xPxµ¼vó h´ÿ‘º=U*–}èú!e›ßuêñx7›kX'c^*ÝO•É úñì¶ÔÊ̼K¦ûgÞÔ{“<õé…2Þ…˜—©ƒ“ËANì–×oPžY8Uõ*®ŸÀ¼<±]ðèºÚ£CVÇ‘vÒï‘5í¼îµ-Y¿VÖzÕ\k>ÔáûØŠ¹Çjg(¾)ãŠbU­ÑsਙIÜ3"1òœN,OÁ¥³§RÇØ Ò¸óáYW?O+ª"2Ïìöù‰ýíœNXü/•ý ¢(X°Zf]ÕÛLjy·ëûßÉñ\©˜YCär¶¿^ýñóR¼Þ}=iœfù)OggS@Ã&­3Ö¬gbigcÿÏÿÂÿ¤ÿ“ÿ‹ÿ„ÿŽÿ€ÿq|R[A©”£ (Ö`¡&×7€.W”¿Í™†|jŸùñ“æ[2]ÊŽÍêo6ƒ,ÛnüùÍfQ‹¯È[_ÔJ‘~(Ä|Ø}Íüšøý©øÿ{Yß^‰En™}ÚŽ_ùF_ ±Ð.‰[k·Xü–ìT¶*êÔj$¥0"ZöÒïiU"CsAD/@káÐú=`…ü¶S^Iñ ÝŸ´¸Åño~LõÑÃiÿûò’ü5ý½:ó®s}dXך&¼ïË[ÙÊ.k'»+þñÖýÅQÕ ÿ_çñ¿ï7àc¢¥GÌ> „‚¡UivPƒ$~€Õb”ˆv^a_W´ÕËÞríw)‡å¤=|^·ý=ë{WOÿÏéc uÏO˜yÖ`Wú£ž7vnY]–>ƒx¦<é.‘çƒ\*"ÂÛSð ¨QòšÚ‚J;z=’t½Qmu$»ãÒ½?Àë,î‡39¾ÕYÇ­£Œ-Ý’QoVoj‚fe€ZA$èã`lž»õºÝ;^iÏÝÝïû¹%™9·u¿¨F%ùÌ$&dÌóô¢b§=5Ó†uÛš¼hö™»qú=½ë¹ÛïqØùÅ©,‡í†WטP¥wZÙÃÜN•Šñn·O‡½šÈ»ï}‘¦äßÚ^È8Ž0tRÜcÖ¢íØvž÷ír÷Í}Oî}h¦x÷p¨d˜‚µêIŸ&Ž^vÖê«ñHëüëÅDýæ·¯»dì-ŸûL$í¡²&äëüø©#ˆE]#³åø-ŽÌDW{¦'n²öÃìg(¦«§ˆvqq¨ÔôTç[ sÝò¢$v;ÎC3BÏÍéŸ_h=mjH ·ÿã@¼›¦§aÚÇìéêÍ0ºÖ…+IŠ9Óëwyqý¯‹¹í0ÉÈÇÅsëþ«+¹ÒÀ©Ì‘ç‰ÉN-]I)¨Xh0¼dh•6úÄ6²hÓ8È£¡'P ¯ÜöàÒ0ZM7D1§x…@âÆF4…y³ëèÙÁ^|<`©~¬ÆAØù^Û½8wúð‘$·­ÚÙ`hé@Ôû¼÷»ö]‚øãž¸€ã™\4Þül7Ï`&ÓwD[_©Ô£€&€pûSÖ^;ÌhæÞëètØ×v$é–ÒòåýŠŸü'=ÑzІ@ÆÉ„ØaÍû¼!—TjmLèãT§)õÅŠ{À`Ç?qëÉóçÌ@åCºÅÿ8àyúÊ-•=‚­ÅûFÌÖŒwíþ=ÉpÊ­·âóˆå²}ü>øû²to(LÊq?Ðs(òÙ…Î5×?_Ú} ¸8AöÂ̾w‚»óKˆ``¦ú´§]½  ÓçSd»§Š¦þ$=s¨žÙ£lvöŒ·˜¢Žõ’C'ø,g~ÞsÍ·ï§6Ž÷3PzvÒ)î[KvE  &&‹+7;'¦y>§‡ ˜ãô³ÛÌïKqÞ]€“!1°y[5=YÇÞ=ý}™Ä ¢½$@5 ÒMO4ž„cî/ Xøã'‡¶ô´AKÞR~-ìUP–¥¤Ò]ö«&:ÏÇÖ¢C±MY0°0ÃJ¿mnD ÁÈZ¦Y…óy%Ó– Æ-Q-€É’bÉ6P7 0@$É[Ù•F@²ô½d|D€'è,Ü´‹ÞË]}K«¢åj'“B(¼qZÕ}¢m¤Èd%9›½Õ¿ñš2ATKœClcv¶V¾­Y]U`J[Û—¸ÇÕ1ÇtGZ´~ö OsnyŒÐ¼û/Õœi1ô¾>YEëeÕc¡‘@£K‚3Ç=PY´6f"ÄèG À® ]$q(KU!@¡»†¤×«‘‘Å…kPdÐC¹OÝ£†Éšî~ ÂiÅ™oO¼³'Iа%AJŠ~ >Æ‹ ¦ßvQmqgqà¼=@LÞ¼‡Õ² j×ô.š¼ s¦üÎ{|?`êÛû1€‡^ɪègúd‰ÄÏxûËõwõ»ñ›àd9ñ–jÊæ~zÊͤ©™40ZQŸÓ|wOÄl$ÐÖTVkÕÙɘñr.^J8ifa´vV3ˆþÿ4L>ïÏLí«²'‰Kkëãgùá«2š¼²±üøNÀéO0€ X #ƒ…“^d#,ÀFl N}ž…Œ÷tÌ\j‹³ÜÓŒ¢¦B*‚ Þû½Ä)CÀmv÷%ÐÀ‡<­éÛ‘®p;(ÒmâK€' '.ÙÖZfÍSÔа* ¦)Ź…˜.óöÝú­H¸æ]í#,ð]áxb™šßùÒkÌäT‹ÊšÑøò–(u-ê‹°(S@¬«ëÂ…xÆmr¶ç°m¢ Y&mxï7·«–¸'©i5cSq@U „õ tOuÐkš¢*d]9ÒO)þœUMgœìb^¾/™DR;Ðóûàs*€µ¹wFó’¢€’ûÓ0hÿìXõ¾€q6Í•wy&‹iúÄ\¿½ü@³ ¾$gßY³Œ!‹™ìïÃô ƒ·{f. ÊƹŒ†ÿÀÝO1=ÓLõ@S;»‰<Û•;‹ Bd=Çgm£¨D 1ÌôbÜ:ögú9…ÎW×{˜j€ˆoÉ+i#ƒAèßP2d‰,-‹‘&ʠɽþ¾’ @‚P ¨4sÆ- €²b‹;/ƒDka£l.šžËݦ#AÀaw{§¤¸èA|8>¾9cÎw^Ekbl¸¶ë÷ÿ§?µ“=EmëEû¹kC6×µ«E¹F‘]ÓwíRk5ôÒç³w$´ëÌ’KÚ³{Lˆ[ÜÞìý´‰:,ë¸+Ó«Þ^}ú¬*©®‰rM JÔÓ8Àh[Gh‰²S¤æ@¯[Iu¬–Ié'H—Ñï2@€><hòe2|`œTÆ„{ bK™ãE¿•û£{ â­`ró92HÄù¹(jÙKW£±ŒÅÛë÷k6Ð $9T»ºô‹™©«˜½¸~iÎWÌõ¡ÈI7€\&úÑ‘qÔg0ÛÅ›&ô<}Ro¢zšééÿq_l`P"W º^¿ðâ_^€ ‹ÔnwnڹϿ™Æ ´7¨t—ÉN%oŽ•,³pÈ~œú©~ûÖC+{u÷øi›ˆüfm»mKÔ„ª{”€P†JŒ s`ÐTÖÝ € [HÏ6^û½ù=Ý U¯)RݵÜmÜ£<@ ü¾°_ÒNÕ r¾£™o35UY`“$˜Ï À1Hú\%V| ø×MJÔ}åâw§¶7¤éOðÁØ· ¤8eH`é"ßA¦¦´<°þK2åá­Õ(<ÛÕnŽÜOõ>9²÷±Î&à—œè˜4†é¥A²1AÖÿ9ÐÕ¸³yðm’Ûá>öi‡ó3^4Ù ÷®÷Úúª8—…ö3•ï4•!™÷Hº{WE¡ƒî/ùnÛ÷%’± àúd‘›Pz§‚ì¥îÈ,é†?©ke {æÐø²fzVMž†Øj’ÃÓï¼ ?ŸS6bWc‚†Èeú¼Á=•$óÿiÏ4Ρº&cí¬hÈÂ9kíV p§’*ò´ò“5¥<íMYáäg/{êUßZ=îÔì¡·¼±\úùÚwñ0ß6*Gª½äê™óÛ)FgIpÛy»<¢™þˆe2Ÿ¤PsýØÁ{ *§ªê¿,~~â¶Ú·‚‹ÏŒ™â©œ€Ç>M@]”Õ—›¬GL¤øAç×sù]|oúî*@è¿}3 ÝL>~|ÿ¦gÜí¬~æ.¯©Ì3Ô0•@B“73UɤGIîÚ=Ýýºb³>Ö1Bd| sš›d!Y¥¢j‚=ššÅ Yââ…¼›‡¸”¦€Œ`GØ£ÿߟïrg$ "ÿ“ Ù”×ÎVç‹Z®k&?bïØ¸°=ýñã?¯õe zÚ”s¹?65Ü1GVÄSŽ©„,päÏw¼ŽÛ'!+ï?JÏš¡_õl€ë¶Å°9TËÔÞiã­k1ñ«ô¾Þ,–2}ýt&­aâ¾§¿-™þöÓNsNDwðñÔv×w€%þ°šÌò›¼d¹µþrX¿ß1ᨮKß›32ÀŸJWóP^_WÇ|,;Ø\7’g ƒOÿ3WÜ—úñ»ÇsòóßÝ×þO5$ŠËü·<\øx­¿l÷[¾-„N9fžzO^1G¬NƒbFeÏšø‹%ã4Ñ Ý÷Í[e.]¾ÔÐ|?_èïC¾ô¨¸AÅ£¼ôºËÞ™Y<‘õ‹.ïXŠàÕcîõØÇ¿mþVÈŸÊ3W¯Ïw3œù°-î÷´<.îßüÔ†»,Žø~:çÅœ¿sËR 8Ûÿn/‹ç¤™Cvˆ¿ß[Fàûé6¦0ö÷Lž @uiD,eqýï)ÜüK@}‚ïÉéµSÿÿàºúßï;~÷Õ§fÞ¼qüûå üñUU1òª]\ †«n]ï¨íØba;É©ÚFÇ”˜•£þ¯h]Í'2ðà‰RÊÖMÄ,NfAOàÓFŽ>DGÕùªáoÞfvÿ¼òòc€š©0?ÖÌÃýWw·˜„ @ÈRDbÊbbð' ]¬²šõˆ­Ðf Ïx..ö°ªé³6-˜Cê»7}+[ÑJ„¬”Wœo³Œ/4³Åõž¨È¾«úé3d_¼Õ5aV2•òÞ xǯ¿>¬÷©WSc·~†ÈïEùÿò>°å]}Ò=}Õ§vüƒfŸrò@Ò“@»§¸jÜš}pN.Ç>xªÉÂé/cŽs ÞÎZè| «›¤é ·‰ùÿ/À;Îç›ÍÀ˜¾‡i 6—C~:þ»ßÅq¹8›7ÐÉŸo?¬†£)âOíqC±^å&#=OóŸâʦ˜Ü_€Td]`ÉNÁ†_º¦ß¹§ÍN‹¹Þ<òèóÜÊ~£Žjšˆ©˜þ: ¿·À®šIX|SÔü¹‚Þvà­Õ¼f-Œ•õƒb^½²Z´McùWLŽçe½Qî$Y2ŠDº—íÆ ä¡oô6‹¼ð‰þËÜð0²Ý¹Ü\ûgjŠœ./$éýÜq3ØóŸE|ë7À›÷Ä’[­K­´VŒùfÁ©U½óø±X¼^€.;¹nxitÀÓ]‚Â×”Ù%ãN€_8úïö{(|Æ¢³ëc7{Ÿ»Ïv?¥s°}¶xÓ•ÞàÞý¥§|:ÝúƒÚÝpòéÊgW'ë/´B-=%Cš¨³O³ÔDè³j4ÿt°Ÿrý}"ÑI1¸ÓíD¾¿±7ÊÙDÇ5f¡ô_Ÿ|}‡¡Ãpý\ãÅåyÊȳóÍ-·Ý²=F=E¨8«Ÿ?þ=}úýã¾üÚ| Ý0 ŒRZ-¨¶b@™NTçi´šôË=áàB×ÖJ‚–­FŸfk£—ÎG¼U¼¿M¹=YÔPö>žï\—Ô×ý(¶¼"]9¦üˆ¾Úª?Vs)ŸçÜm¯o˜¢ùý(ȳlk6Ç~ÑÓüA…ç$c‚T…x¶¢ S…[¹$j¾7kä¾í• ªÆšÖni+…Ò…bÝž¶R’êw^ºT‘LQ×GªÅDG؉ä>>ô½¶xoŒ,ßÛíÚš%9‚Ez´±VxÈi4Ý ~û!‹¸oµ?Ÿ¿Ÿ¥¼º¬cÔZÖÌ4ëȼ놅’.•ŒÐ?Ü!ù—Τý<ÛÚ7£ßéÅn{ÐxÛE¾1Æ Õ©‰°—c»j}½{º'c}'OìvÇ—‰Z¤¢¤M¿òI×JóêC’î†u²+½«Aú‚ôÂT};RÜ« Škr<¬JöšHé Ü9ûÕ25Eè=Uˆ^sèé· bÅràFoõ,]Àz—Ÿ ½‚ß âL¶K©×¨‘q,Íõ ¸ÜOLùô¬9š†’&pV‡ÐYeßľû{†^JÅ‹Ÿê™p!FHI¢ÕÌ 7ì`Y²³0¶JŽ*I ¥«=wš°îZ"ƒÈà€›—b\ß8‡¿0° …À.ˬS6&ô²¹_> l„™iºe\²ÉòñT’rr•gÆÄ1²E„f]—¶ƒˆ!X@à\®w ¬ ‹Å€Rt¯—¨“Úd©bÑ…Øb@H† Œ šˆ LkÀ ¨„PŠÐÜsoù‘ÀÈ`€$cÑ£WlìýjÈ(J4žÔô†’ÍÆä¼•8b»îìKT­éån1Š .‡¨7ÓÞ&„™æÓè£íL æôÓ¶Þ4‹%-&lÌ€Ûhß0 Ö†º²Ñ¿:P«]:¯‹‡“c÷¾žÆSQêÍeb(>\ô9cMÞôó3–Ù£øå÷}>ðà콿–ï÷^KªYª'=‰ä¹byc¤ÇÙ{L¶/%±œèXh òåD­uD÷ÈmR&; |KµÊÐ2Ýs×äšÅ^PThF.ٶȒȾº·Ù_H9JÏ2:$/kuÑ·|žR >R‘ãõ }¡<ÈgŠzîÕ¢ Y.Ý‚e½5~n¨YÂ%VÑd‰Eé j/3#L|f—Èæ×J45‡J¨î`“ Cw7!EEÔ÷f’ÀÊ";Ň{Ôö^s¶v¤‰b²Ee¥oŠÝúFm$ QˆaˆW“¡;Ò‚u š¨)SÚ áâ® å„YW€› .´ ˆP®#u @Ä{höòÎÉÛÛ@d ™ "íÏþœóý¦£Ž8- L¬È¾_õÏ%Øtþ»uÐAãg^½amaŠq ½ÛTíÞàôxËžõë°û+>ßÖV´UDz´Ó›2Œ™"³š^;(nSݯ‰á>Ž9ˆš‰]¿i>ü~/§›îänvÆlÆŠž‹þ—Ú·uX“Ê&I(qÈ êË[ä¦M<Å¢¹ ÿÿàÁóC©uÐ.žê]§Àƒg¼©ðÄʳïæpO¿óÌ­D¨ÖöƒeÅ<‡/½)$©âñÒÊ)‹:’–‡@rât¸8j†Îé\c!SŸœ¼´£(ú¢Me²*:7VÊù(e¢ÝŽ-•5ã«æD«7T‡ÇéR¥ŸV\³Tò¤›zw3Õîu†ìJ†Dš’;"2n‰dFÙv ©™79¡…ê©-@FL!Ö2!H“D„3š&¢˜ 1SéÊ1ÁR ©™Ú™é©¿ÄÁ+Ó&.Æu·J­ÑEB¡Š Ð a«´YÐí ‰Ã Æƒd™UŠn#†ŠŒE0¢H!Jf*‚.ðeXF@„Cc0`$õ êÁÆQÄ1†4«À2Ûú‰ií!*ÖšC”U  7^»e(•ÈÐÍb á°-ÝœAqú|§xö!õÔZ}Oœõq6>Yf©Ù7if3«O\I38~Ü÷~ø;àón€¹ok“äˆÐnÙNoâSÄÓô$`¾Ûç³½Ù~üºk=æ¬Õl¢ÑQÿLâhû™¸Mµ³çN;'Ÿ¾»õG?DèNß·ÞSkQkÃâcƒ–fw9_F”®Á“ŸÃee@ŠÑ¥ãx‰8%P℘Šö^ åõ¯’ø¤ ÌoÌÜï`g`ÚHœ1³I_ HÎ6€hnëž\`è:5' ÚÛâ¶ á;Ç0›\—M ŒîA®ð§^»*ø€IýÛ¢C1{ŒÛ«ž†àQs;A(ZPyƇáCV>—LŠ\–^ÿ¤_×\ÐâæP„Éå2ž2¯ººb_º0@[H™#ÅgïQÜ’Æ­ßgâ]ß¹‚ ªNT#"Döø†(è+9tÈÕ…‡<¶ÑÔÌ`v÷5å^Ž8Ы9œy6Í:Ô>h¤ï0ÎOggS€&¯àL½§ûÿûÿÿÿôÿíÿóÿíVdfmÿÿ“îiX«x?ýV¡µ£VÎÞÔ½ÒúvÎÄ»„©= à ÓÙú¡Ke¼Ú¶Þˆt¡JyrÎ4e(5 ç½ê,/o¯p‚¢õÖWG€³‘eØ9•Lt6ƒ,JëY ’šAŒšº\lRòª–$ãºö°‡^ ¥ ¨‡rµËn4Цƒx02Y– ÕÈÈú‚b„ª„/$*€*¨`Ú‰=XW pu(Å€-€´Ž XÉ`  0:+ŠÁz@°P£˜& bDM‰p1 0H¥‰fðþËbÛ`<@&ÎÝÅ6#¬0™ÿàãÉx¼@µNg3ñ4ð4ù¡ìĆ«XoÚÀJ¼Œá*.À½û³Úuî½@wæÓLˆ¸Õ¸¨J}H{8´Ú>ݵ«¼€”Òª³|“ÊÙ½B*9x´"å4’òwÆÞ<‰ ƒvkcr mö²Ò+H€ì£ïÏMOñšõr%Å Ùg”€úœ3¾¥ÕC•{=§™`C€ªaDvV´LéN:#¾âÄSÇÈÎóýWoǺššÎ§»Ì¨—«VAš ì¡Ïõ˜AÀçJ“ñ™R9°h:ì°?Çӌ꼀¦ôÌ,X]Õ™‹˜.¢’¬K{pFº³9H€±víjÎÅÙhjÝÑMTwÊzh‘.{Ÿ¢@€äiR4H€nŲ×:“žFÄ0˜+Ѻ$^Lõ°Æ$Z{©–`èÈ+ …ÊÝLB"hhë³&ŠâÄt1€ADm£³ @ h‰4 s€Ãb½¢ŠdBQ`A`, V €ˆi"€¨Ú(aG¨0@l‹¢Ó€ˆF,ƒYT­€p¦‰‚hK €ŠA«SÄ‘¡ QŠ^E`ó@Þ›]K§¼Ö\k7%Ó~©²¾‡ ªOí~°»òå³VÇ7€€÷f]<.ODÖTÞÚ ":€6ù0 B-°í'À½ÍKÍmì~›û¶¥Z™œFm/7Ì2y:—;üœÃ=™5¾´:Ãë—b©}m>5C¾HÀ‹ô6q¥W¹ìi§ m Б}0ò“„§> fØ‘š‹3Zr®\2”¸•Zó¹>žödȇàÇŒñŽ/æúódŒÝI)!4“s·ÿ‰Î‡³Ýˆë+ž´xOå²gÞæ¯€µµg é©ÍjÚ0é*¾ªaR´‚r,²@Ì·Ö¡Õºìç2æË+åøÒ§t·½ÇtãagÞ²>‹MGW)(‹,¼ØWu…ÓA™êe: ¤eõúhµ “ÓEë¸m&B_¸Uê±À BmtÆzðÑË9¬R$ƒ»˜0µÂBˤ¢Ã•QàbˆŽÎà#´nM4ÓÐ 0htª Y%SÝÓ ^W°n9:w‘,mDɃ( X+‚ Z\QÁTÖš¨€-ŠˆÁ U ªjÀ:l00E»1€*hn ÀMlõe…ÁR×-À€Ñ5i ˆHˆM>‹í´¤%§}ÒÈRعÕÅøÈD”Õ‚LOÔ~pó1óÑ\‰Yî‹ Ó~Ë[7A|ÿÆpÉÒ6s¸q$ïK¹ß|\%và ĉM^ïû§Và°ÙÂßÀÕK´qáMòL0“Ëd€hnc§79…àéÇÖz²în©Î°Fw†×’½îŸŽ|_Í.È;×›âÃÁ‡+¡¨Ó[™ÝÝP°õ²±€Ì*Ïd Ë€ Bò{·»*‰àõ™t¥ äÒí­ ËÅÀ±ƒ@𡊄"Ù‹~/ .+rÖpózH ÁŸ!kU®ò|„Ñt%½Jf”3¡ Á‹yð)‚qñ²lˆYišNŠ„z”°hB fû¼äá,íšq/BÓMá€i$ÿ ½§‡¢s:\ :ãy w©“¡v­''×úŒ0´Ú])è dzD hèj4ªC<Œõ.ìãMiæXjN4 $ˆe=0 6Ë"•Œ¹ãT‘¦º®µ“1БÀdàÃRžZŠ¢"3 Û¶¡ @„,PU„ ¢´0„ €ˆÚ§ÖTŠ,Z½|ì~9`ÐhUƒ¬0%`Ñ4ˆ¨`å—*V‘ àœ£€¢w°P¬[/€@ŒPKY'Æ 2 ÿ*5¡5Ä~ÈHþŸsåJ˜•ãðÚUoÇ1‡á¦_¶ ü€7\èÛÎÞé* y´Ú=Î@ß›,²×LvÂb;‹ \€kK^"+„³e/\  ÇL•r– ÌÓw«8KÓB—€ëJs_f^Oó5º–ø×K2Er(Å—$Àõe Y ÌŽ•ô/†2îê+àkÉã‘ 2ÅÇõ•¸áílŠ2¹£¾ˆ4hôøÈçi#à }•鈂»±z££'@.¡9£à¹^²iö畚d¬‘a<*¸¢PĉÀ}]ö‹éGÍ7667unÆªÂØwB²ƒ æÊwu0í©ÌÁÚàû© ôÏOÖ•‰C³÷¶ÿœ/‹Ãa‘(šÇN3³4“= ~ v*nu ÐEéb,Mè‚òÔ ˆ4Ô‹º®)Ú‚wíåšÊéj(h i¼f»,FP ƒOk-T΀1¬'XæiMsP[miˆ·Ï©õPCw¸°¬BÌ0$0½ „õDÁ4"Ð(ª" €hFÞŠ hX´`c¼n@Å@‡0çß Xd@”4©À‘~:õ(¥Ùb\l°?«”Éd¡ž'KD?ÇvHÈu1~ðxgfó/ç0 7ž&@²Ÿg·ž ¸![Ù†3pÒ­:âÆ" ðÒêŵ Àpí›p£—xã}ßRRHjÚ”E½C xë.€è ¬þÞv=êûç>snss¦|²ºÞËÆl|q Ϧ!Cµ/gôÁÂ7ï )W¾s€ @ÎÄ­‚ ‰ 䢱•͸~_@Æ3‡!ƒ$ÐÚøožÅgó™ßâñ(Çp/Ǽ9s…AS_ÄwŸEQAt¨'šs{§BÎuþ˜Þºñ€R ‡<4eqÀpÈðä™ §XW™]½’€ä8À:(’µkj`¶D7T å²ö–Ç“©aÊ)4j 2 c=TáºHµÐÂ!2<­ÐÔØV¶××í•s]a­]Õ ªT´Æàüá¢*õ{ÀT @VT¼0A·<„!¶‹ði Ä€Cš* 4°/Z‰Ê€ÅêÌD Ð¨_îXô˜±¡€$2 t `ZC0hÓš€÷ûûÁP°&àŒN0 sID§4€–Q@ÖH%ì›.I²¡õ‘J¨1Ö6meP,‹%öàmÅNÏP¸Gg$\xšuE\@Æ­ Û|‹3¶€{t ¸³'—„c¹nÄ›ë¡BBD‚Û:Ÿi¾[¸M nñk·êWBbßu®S$ã˜ÛË“ÆËqÓ79YbE)` _´„€ˆ÷Áu_„“(zægßͤ7Ùu@4T¸C…‹¨ˆ‡ì1ÞÇãÎêK¦Kn‡šãdtÎ/_Êx\u2G¶Ü„^…†B.„LÉÁÍt-d2Þ»’]*5këFj)@΀¨Ü°¹HÕÒf½‘÷ï‰ã§œ9Á­{ky®·ú̼a·±úì’¦OÅL,¦, ÕÎ 2d™túU»f–“5U’: 0µ£:Ð5îâ8 ꈙ¹ BÑ ‹D\ðV­»¤thg=¡è(€†pB¸)‚¤O¨ ª€\˜ëY‰³j]«ZÙ7,xZiDí ’që`€Aq@¾›D(X¿J@ ÕÊ™¼TM›×# "˜]”¶0€½"F 0F!ÄkTˆÄ`k € ™P,x ˜@¬JéÕ˜”dùùÔšý^²¬‹ ¥-ˆ¤Xu†xÖy61ŒÜ`=R¿¶Ð{)}]\©™|„2<*\äéøw‰2saèuFr°–½Dr+½n……¼^&6øÐ7¯M A‡ arOo¸ÕµšS Æ©‰ó»úXçÜŸ|œ»Ýõ-v›r\\½ëÚ±®p÷}žÓ‹r:)ÕšÄÏC!Ýûÿÿ¿¾ï#æóú:-Á^m´+}ëYÜf Íî „ÁT© ÚFA"œkîDšÆSæè2Þ™)Vü9¾JÕgŸeÉÖ¾DWž¿eÊ:ôóûÇe¶[WÊñ|ðKñùû^öUž~ó£-ûúÞ‰ü}þ_ÿ%¿ßøó0Œ^<¤5€}@BO•¥la¤ù˜Ü¿8ñ‘s® ¡./gMA¾Î¢leUÙ~¹ÎéôÌÇ»¥}wäìç->?½µ’oç<ß?²²å$ú²šÉ-qŒïn9aYËÃÛÛ¼¼Ýûëò‰A¥y¿=7—¯^xšØ´lŒ±XA¾Å§šáAZØ«Œ:Aû¸¶ÆòT&€õðª7g ]O€ßöv óÂ[-J™”6¦Ë¸²!ÇÉù»ùtdHk·Íü\ó+mW²ùrѯĦñÓ·óÚ%àƒŸu4"Ékªì %ƒTBà¾tïoz¯Ö]ª÷ÅwßøÃÓCîac RzàÒ×ûîÿÖ<µ¹r„دɼ}>¢¢bÊ%2Ъx`àvz޼.©Ê]žª&žb{mÙé"6 ¥‹9e‘ÛC÷ÒŽ&NíóÞ!½÷)ª]u‡r/ýùs}wv0uv™³ÖÒ)¼zòî¯Ý!ÐËŸ_)â(žÿ»©lžÒðoêFCåOŽ©à¿×r†ÃÞÃLõÓùÉå4ÔŸ3ûIš:ÝÜ=ìlÈx÷'dl -²²X0Åñ¼3µ>~cá ñAý›¢D£ª¬Ÿýóæ±—H‡L NïÖEáv%±¤…j óÕ$b©ÒÇý… ÜôçÂpÓé÷Ì©kºÓÚ¿L]J¡à&@!À€„dÄ&€að#Æ2·øññ¤¹B•nà ³ªp Aƒe)Pe :>ýÚÒ¾ŒT•7¤åeï ÆH¢£ƒyûµs‘1¢4·d»_®þÁóåÝB­é‹yÝ7ˆ‘;DÄpkd½ú±U£ß¿OggS€*&°’°ÚÿíÿìÿâÿäÿÚÿÓÿ¼ÿ¹[VWT%@žåréµ¢€,ÃßX%B’¼eÅüT‘+êžÿßíYX.'úÛ5àí¼è ñâ¿/-$x…ˆd¶ì«¯‡3–”Ï}_G½¨õ"Q«Qßòv?¡R÷ó) ä-kh-g²ëïätE/w®êÉ®ºëÄZç,'š[›eTJþÙô`{nü×÷F(L6—ZýûM4¯$¦Eäl}Š˜üŽÐè€ÏÂÍ`É:æ-ã™#; 0š¿‚û±Þ?gÃ!EÆ®i® +ìwí—²péª5æètQöã;ÑúY¶ÆòîfþÛø ÝÁÌ[µ¥Òäô\€e€Ú÷›®d_^w<"ÿ0=Ëô/S à°ó«3 sP=ûqWY=2+²`ºçƒ„8DTúÇî­|ÆmðÓ†€-’ë p€Nøü{º§¹vÑTÃ4g¾YùL·²sÖóŸ‡}++Á9Ì ¬ö=ê w0ï) fÇ-㦇¿Ï­ÝLÒˆˆXàb ðc0ðZ…ÁÈ" € 1Ã,T„„£’Nhé§€(r}„6éÊÀÜÿ ¼BÞĦ xëΟ-¥Á|XVA ²õÇ÷%Å‹fd3ÉŸáÆú%ƒyVÔ1ˆMÂG¾8%rŽ,ÎKF¦¡k¼¢¦Ü¿@.)½ç÷–`X_昷àÀ¼>9P®] Ûý=8kßLjZGͪZ)­€{®ªFÑ÷½;ܵ p À¸‡ÛÞ1WÇå%à Œ->©Z0Ù¾90Ìx€¾ÉŒæ6{¡½}è¼éÒm"ׇ«6“âµ–nÜ\ð‹{ôœ˜H ÐæX6bÑ1e_¯mòÍÞ,Ü©€€¹•jÆ™áç|¶ª :#ãPó›ð¢éüX]Š´ ö¨±7MÐu8³üÍuêié’Ûè´wÖ£w§k¾¬øpÿìÛ‡F§kFgª>Õl¯gb:3>î–d}Ö‚<ÄP©,sëMÉP5ÐÍôè¼íÓô{ +OòÆì+úa‹ŒN1ðùþvvUVGU${1n糯N²ZCâMby ?=?דMÃT6äßib—|¯K¬¤ÓCÓYWRÿnu ý» MÐ}ÈÙùýE“)^¬S¸I%Ô^.YÖe€AÃý ú°˜°ii#ˆJA$Q•eö\Ð(XÈG2@Æé‚ºIITÆ>;+”Ù(zc9°ÿ! ì0‚K0JFè¼—µ¯Ý ¢Ã Ä€e-¨p©ŠþhÅÅÞ<êýK'«G/2KŠíùË|!Ë…FïhWê€Ïî1@þ¦¯wÜ9«g¯û#ZַϺ án°°îÛÒwú¶f 6Uºöÿì'VãTvþÓ¿D“(ÚžN`ÜdTé¼MBC¸M’Þã)Ãñ©eª8G¢ä–ŽÌÊõ㶦™ë?èŠß×rÈxèõo­ì·^щwJoįUf»É-¯°^?Ô M›ÎVx¸WáA¹æ813ýc !dùÖ˘}/\k ® ÙŠP…Þÿ%»‘_|ê‡W„ÓÛ.ˆ…dÇËÚuèd)'ÎlÍÇeÓ·¼œê%zÑó•æÇx›æ<’ê™Cu¯2õˆgîæ0×7I„:ÏôOLO—b«ºÀqî iã¯}Sãs§Iš¸Ðæ\?LÖÑ“M3KFBj g»–_‡uf⦘œèdRùò2mêJkO'4 W>$äõJˆžn€³ÿNõ…‡iöÏÆ&Ö€…Ò?û–`€â:²þàòk0‘¶d>…Ê„5R”‡0¼G·„!u’ ÔÅDŠ K"鲡ÎsâpªÍÅ)š¦À€„†éÿÀaô_`ñ €éƒ— ¾XÅV.ˆý‘ÁãOÔ¢Àa4ûuçÒd¹ÔhŸow[`)ÎZÿ÷||Ì—ÀÙå@Ó«O â}ñXWÂl}ýÇ£AÀ…§éû °¢œ00Z¿wÖ,Â(:¨2€×g¶¬²Ÿö/·kD­àœj”ðOÌö7ýë6·zOž÷YﶦB…sæàü\2’tÀ*xB áÂ’óóõ%¿ÎëöðÕÐ?d(Ùš]þ|6—Qñ£Î}‚5do”›õ¿@+#€‰MkÀœ¿êwßÏ@”©íÈà0³:³'mºš€KÇ|/ !Oû?C«e;’ÆW]ÚcŠyšn¡÷³˜‚Þ†å”o#d×0|ašOFO3“pÊ‹uSìð$ ª€ìvn^š‚8‚Ýß©¦ÆM“ä@¾ç­ŽúÐ&Ï/ñòñ=Óø»z×ÛõEx/;ÒMógÑåS8%\¦ý\AŽdjAàK·®ß—‚\îóÚÁÌÎ/~´~KMuà+À ÈæÓ&÷Vî . £‡Žã'К[4œÁKR?̪j®‚`ü0_9{¼Ü–Mm$T`+=8ùöG=…‡Ò?ï¡€pÅ üûJ4ÿF¥ ­«™ ÐFµcKœŒ½R2Ù÷Z|ðymúÀy£äÊßßžËÚ¸?W h³‡6ihûr.áj 6Hö¤…Î\l®9–µ6öÌŸÖÂÉ*r¶ÌÉNýó¯V»™±˜ƒrÃÒ—·uRdÌl]§Ðб„–ê Ÿî\»&(4 ézùÃR´¹7È{¯ïé'Ô4ß5y&/ àqa;Ï2¬{¯OÌʙڠ'¡ƒ©n(õ¸\á‡ldµvMBô¾‡‚Hû›Ãšèè`ž¿Ü e˜g*‚Rç™ró¶[ =™ßÎÚÏ–¼½zÚ‘@¤€ÀuÕŸ—VÎY æÐ€;ÇZÜEž_½I^Ù.¸£ÿÛ5¦ùæÍÇÛ¢qŒh«àÀCÔÈP3£†h‚X2±±@@ Ã+0€  †¿ãÿ®@ôÝg®Š£’ €°~ chUqˆÒB‚p>Hƒqꦘ«Š\ZL‰W”-M™f/J"ÕGo ðÜ´é ßR¶XßHx‘Iûtéî @«J.à[·€+4$Öaá ~öè¬(‚¡PBp÷½ZOŲ7ù49{˜tz \¼–†Ž§oiƒæ„±°ïÁ7j<ÊWP÷6 ¾ÌÁœ/tòÜô]ãO™Îx€0¾{v0äêøR2ÐÙ[gÊ%£êZžŒ²ᩲoÉDÙ1|ƒ–Î+C?“¦í‘ãzJ}·s¬8Cby¦örut bG?ía7.pÖÚ&ïm)kv |xOîõ^º6pœNTœ.âÎÏP¼¶_rÙYQü¥vp~w? ††MV%ÕÐlî]Ä­Í)AAñÍ\Hv1I'@ð8|0µ]`ú®´¨>3uí¤E)gRgRÂâ_ŽøyxF¥ý³Šê¯žÉ¢²åòÆX ¯º€ Ia¢yÕTdÏË)3[Lôd (4¸j¸äCÓS4×nÿ¾{ÁÍm¹TjØA¼€…½Wboš A‚cÉ‚„¹0Ž o ’eYðØ°«õàôD { U€62¡ 5ŒžheÙT„}œ^7ÉÍ‚Æ+³j¤Iž½ˆ\4Žž*è9àãé?pÛ¥ãä´óà+ÀPAýã0Ÿ/ß2à†á2à &&Ó¡j8e³ÖŒ•B¡\¾úžúlwš¡ÃeíäaÑ6@ÞãËb‡Ý½Ì趈:Þít&‰*îÔ:@àG!h?éÀ\¹²É“îî€â¼ØN½|ð¹û6È’ Ù˜+±НìSL|ïÛ’ÉÜ|ý¢U… ÿè~žÈCÊÕöå`]í¿•¦m“U.·-vúÌo«OdèkD$ä©(€Ð,ïX]½™`¦˜mõXÓÌDë …ÈÐädh–i:b$¸´\ß©4'QýÀ®L&NŠ,¨¼hA¬išµý£ŒŠ # ¦‡v',:.î©-ðloMgÜ"€}È!†.Ø)¾;G$Ù•¨ûSáµ\7×ãè»É W¼Âw6Ï?;L€¡‹35à …“ÇïPP ÀX<$òW9Ð+¢Ög%²-Yzèõ›\"±¿Ý’®~¿”–¢·<”æ èøù­çï®Ýõ¯‹>ï·Å—O*ow ÈïD½/,Ìf³å¿ûvá·¼žÞ6à ´Ýž 4Xóe8ƒ†ÐYMiÇH!ˆè¾œ €Íc úýRÝ¿åEÚdæžri€p\Z‡uõ`’£¡ŸÔWª „ ñ aï×Üã$CÎaI»©ñÿýB$ € x€WŸ¤èLc*9çìóÄŵ靯qÉEÃï©xr¦µ@¡ýþÉ!çàœór{Þß3™?&wJAw¹ýa†ã mZÙ6ÕÂ$¥¢Ó4MÓöÜíîîîîàNÓ½ý¶ ‚³ŸÃV]Ï^ºŸD ÎåUùËÎrWjv] {²2ÊÇêE6†™Aši®uÓå¦"‰’8`ýú-࿟NÖ§¤¼ï¯Ø€„†¼{²‡˜ß7±”no¥Þ0tì\e²Ãž'Èá³yãêjYM%s±ƒJŸ›é̬H¯y1Tþ옆ÌêŒ ™‚€¬,6`ާ U¬JM­ $s¹,%ükl¶­JºƒÑO=Ì’—¿-µ 㻥P¦ë{qvVé>ǰæïå¸7Tö‡šÚ•3²©ßË.ùThj¯6­("a{µÌySÕ<Ñ¥ˆd:=“6,­K˜F…nÿ,P%Çðà“³ê’Ü5µŠàr£·9°ø©åž©O2'/{,aP «[g–QCT!ÿŠæ0ÕÅ-¤B\2B´Š­X±‘E£Ö×X¬F©fhS©¦O§-^Ÿh6l—VL½ýb›°'×?wâ¦~ñOþ­íí¸õwÙÔÏŠT–/õ6­¨uPÕjmQÔpe|³`4Õ¨A"K|åÒÞŸvp Œ:uÙn õβSõ9*Õgã®âÊÐ#¹Û炸„  FÃÉçÖÒX¤ÎZú"1‡ÅÔíG,ÊH °¤V‘­¥Äâbª>1b딥J´vÃ*_OggSÀH&±:‘íCKIEHVUÿeÿÍfidY[NacaÿçÿáÿÊÿÏÿÄNÅΔJ~ï6vê鬽™Ëvœå™ÓÆ< 6”bN¸|…Ìæ)_ÓC‹µjj {´N2(.щyƒéŠ•þ§X´Jé“ÝUvZ,=¸f©ÚÉ´Åþ¤©Îy–u3CŠ*@ÄÝ6eþñ÷U?í‡/#«ÃÕ5=åzp’Q_azJãÀ Ä^.p/Œ6ý ³Ë´WlÃÕ¨ÿ”·K'`:XÏóG7D› €>s-5F§Ò ¢e!éNã}·4ê,$¡gòÅ•@ ä´¿j™Oˆ”>½«­dÃY§NÏl29 ùzÛ-la `¸ëŸù›ˆ9™VÿYAt‰QûY§WIH“±l2‹GDirVj5Ýyà\´>½3ä­5zU«Ð‚í…ðÚ¼NΧŽGð#Ì%˜ÒÐBÎnãeAœù¡Ò;eVˆElbF‘ /E+CA£Ð1×z ¿Œ.uͰ ƒÿªÐ§¾ÙoBÆÀY‡"2¹ èí¹nÒWjXo»beí—ÐÑ“e}ט7¼#µ‹‚ŠLè J¬]Û*ÒXA еÿ³ûRŸš†Œ.=ÝubƒÃíéÓë ã$§ô@þ©Îûy$K X2tVü±%Y±ý5ƒÒ.”‘:t‚ª5ê0R“Œ¡bТX1ª¦¼“UcQ¡‡[q¥Æ¢ªlšºi ð )C»™ ˆ9(ÄE‰ÐþÞ¹÷Š$éSÒKp<RùÏ1Ú±v µa/%1³ÅL2IJqi1cföq"-|wvmïáyµVr¸Þ(ªiQ”òü¯/ZVšxµ/rÖÜI…™Ò}¸ù¼½ç¼óK‡~>»Ö _ÅæÆ‹þ•iœx"³²²ÜÓÄà°a26N[FV5a$@´j0$ñ¸À^›ÅÕ0¨-™•ÎÆhޮ鵋vÍ t½Xn°B9b‚Pn  d`FeÄÕ´e G0©Ý¥ˆºì.Ë›¨Y¸8‹…Å·X°Qƒ0pƒ,'@Œ¾RH1Še´ÊYЖ…µn…‹‘5‰ *€µ¡@–Ì@I.€‡€w&›ú†Uá*ß7÷k‚Aí«@ö@¦ñÞQreÇ _…qý‚ÜwGwë¹viµí# khVåÁ:bøø&»?`=½o¿¿¼ØIĵk‡éž"º¯ß¿Ì¹åÃÏŽï~è·K_]z-í¦.^=¤ü8‹€DƬ]¦ã.žYëžü¹fGëC¿Ž‰)ïî9EÇ5}¡yÕ›¡´¥ âÓ›[SÎ~~?\9º; ýeýå,éæJĈvP…¿UúÌ&@…œ­]š_»^ÆÿMlñ|,Ëeñ ] Ì2P½d©!ÈYéþØÄª³ D`€ˆ€£<(ǫ̃ï¢#hY|±w¶¥s rØP³ºóÑi'3- Ð t™Zêj-9¦»™‰±Z©¨Ë˜–Žfº3“Ó˜C74.Þz{&Êd˜y§ÀŒa®\58®*:³r`è‹ÜK–ßMFVÇÑÀ¸ÎÓ<;dæ>EY€œ ˜ÚÄnv@Äõæ·~<³\5{îÎ^d&EA/j ÝI¹ÞÏ$Ô;såîõ2ËÒ UÅËÓð€ATd(^#A z˜ñPr¹„ëøýú-櫃ËÅ÷ 6z$Z,m,/×Àw €à¾Ø|F 6ÏQƒNÙj­ôÃP²æ7^Úî¼¹r1ß­•EkÿÔäûŠ­9¸îyͱ™•úçTXÉÿr»LþæžÕóUuYiåÓŸ…‘ù[NògÝÞ'þìÝÿ;éL7_2¥.¿+ÿ[¤í]/Üf‘d Jò+ŸtKº–*Á¥bð`MùUÙ“û¥YT¢æü:ø{¸BÓû2GÕ3Gàó¹OùᬛBXÊSݳ£ x2 :£€•Ãø^]úÍnC‰DQJ®Çöo¬zø‚ðc‹A™ÊtyfÅ¢ÕJfùH5­9 ÀÇöŽe²Ø'†ª8Ûw÷(`F« ¹B«™ Ú1Zq«¢Êò—ìÅÓc@Фº- ’l¡ëcÆÄ‚Å`G7ðÁ9Š¿R‚lŒeýTŒ8ÒÁÏ|²óé¤pØE?íX’¯]õR• 4¡* ""·½ˆŸ,¡ÁãX®/.”eî:°\si¡`Vc‡{óÂñña {a!½ Îøû¥˜ ÜÅ Pª´p  ¿&xÉÕŸv|àhn¾ßÙqõHo!]™Áw¶bõèÆç¹‘Rõbèd®Ÿ ÉœàL ¥K4ÒŸìj‘Æ–`Éâ¥Ñg¯v ÓîêšåW¯—1¤’}wð=ë}nòx°Â±.Ég~^ÿ>¶\>!ßÏ}ø{˜[e¸f‰8––øðñ¹ïîýåÐ ïl~‹eRCæÁòç,Ô¾j5WCPpù½çúµ§Ôþº·ñüÑ•ˆy<­¿\ù~¹Ç(cmw @èh}ïÇ PX½• ×B-†&_íà¸wŽ£˜Ғ›i¨2åw¿sÖ,›]—v>4—g½Venì7ñ(à%PÀkn¶¹àgǵ [²6 1Ë“UÆNQ8©igêÇ‹.GÆqrzû‰˜­ÝÙɲ—‹9ã.‚aÎÔºvÇo9Xfb"¼KÄðj2{[Ù™ ω(ù! ÎgS•£ŽÅ”³†œ©Y¹ç¥ÌÚ†9E;{³(Î/Ïím—Çi?ì˜Ü§6ÃÍäéÅÓèÿÉi˜Mö'½|¯óoØL§é;ètúÉf€,m.Oryl ;ì¡çìO³oýÙå±xu6˜iá~È@äàk`ÕT@¿zëaЬ6°O*BNËø,Ò¦!§®ÉQ©òìᆚh$–jÞ´{ì³³îÕïRÑŒÌ0]bMÍ4~¦A Ö+B¾â*O ¡_ð>ù‚| # ²#TĦv ‚€ –/ p=$ÅDš@ËßëµÛtaæ^¦„ŽñiɃÍõFÈŠe)Q ¡>nI_þ}Y öc=fžUlPŸ>:6i¼ÎCk Ù@¦õ’±5ж@Â0ÍÌ÷Áì¬MÈ‹Ý:üéiÇöÊXö7€x$Hhz¿aŒuó{"ìý˜Ó›Uªšud.К5S‡fNûq‡¾C<ã%¯œøN./~¥ÄÁñ™nJ.9{& #® 1tÚvú:ÎM͡ߎòZàöA½êË(1RÅ.YBG˜‹hZDr+×Öq¸$%(‹{=÷­_8 € ÝÙE®³é½R´¼¸N¾¨¤s.>}mÑ„›‰Ö“y%)Š´¼}þ$‡£äÄDL3—˜ç}zòûíåx«ýCWWÓ@縫øó²¼ÝÏAÁ|/ ˆÂø¸ÇTîlÞóÓ»Ú =§Zγ=4’$×ONæ¯\›ž„ðönOÌ{½ì##$›«­"‹ ùá×Þ#_M 3@O‹*’){JQÿ{¤£z± N’"¦Á„F¾÷Ï4"é>å%ž·ç‰´ö $ƒz,•–ÿ±5ˆÈ™Ù~H6©8°–Ñ;`+2òìF¥„‚PH¢!²À‘ }T ¬ÛèŘipAX̘ûOÁ‚ˆG ’øë.ǂ޿=ÇÈ^“,!,b$ÞÛ±€ÐAC®Wëe‚æ7( ö>äÑséêÜ"Ë1‹óŸœ=,C³¾Üg€ï·°nkG“n£k½™”VU:H`5Mþh­]Çž½õ<·æUž·Þèõó 0_}³‰iñ!7W¼~o5/C‘ócžÑqZ9ó+”‰Hh>Ìmµ‡"P0àÛ½F]@ø‡¤!‰ö¨Ñ €/'-¼(oO€fµÖ4ªR%€6j¨7¤ö>?ÿS« YtÖ½tðúÕŒ¾°Mýó»ÜIé|ð%ÐóøPFóéâþ?²¿2|Ùi_(mÓ,cAóK#ì{´óW›|óÚ±»B¶ú3ŽDôÈi•×r9ÆöŒq–V›·Š” 9 ,u&fêTãøýKÊý33ôUÓ”k˜e>í®™^¾Pž>ɰÝ4Ÿýéè  ç~ô²3†ê³”š¥÷Ou11÷R¦ƒ;†LÆ’2ÄM%/DÌÁT75ñ—ýXßÕrÄôÛƒ ñQ~E†"àRp?sÆ=¯Žl€œD ÀéÂgÂüíiY €¦¨ïÏÿ»ÙºÎòvM$yÃtÓ¼?ÿ/ãý*é)²òû?оî,FU@xÀâÍ´ '2“ à)¬ú!Ή~òdfÑ 4Sd•r憗hô%U"¿6ÂÔÅáB €²!ÃRÞ@£ü±(ðƒ»')   õ3~ù#L °Òé³%ê ›ˆáç?–Ð"YE bÞË­nJE€ˆUÁt«ÕzŽ7e —O¼\õVei·úåEû¢ÞŸÆ–3¯G/Àr ÆÜ*òÙ«·6´Â•ڛΌÿò'ö¤TJöŠæ:¡79þ±ÝDâõAÌÐ Šô• œçg:B³„§ÓŒ#üa_ŽóÇ5–®½d îÿiö¯(àÖñ7<;Î.z:ùäu'¾8!+GdØ­â&þÞ\žêoì©^<Ô,sŠKš„$’˼¿öŒ†^_碑yi5¾^–aè]™!̺ Jv¢§ÐaööŸ•D±,0¯ÄŽ£ >ÿéÙ$jæé¡²HàÔÛõ»÷OggS€m&²JÐøÈ!ÌÿÌÿ¯ÿ¢YRUSTR`USVWVZYGFTTLÿvÿŒK]eXø2tdCah?S9f˜½P–}:ƒ ȤéáE?}0ûçîŸËãÛì¯å6ìñ…ÊJŠNAB°måaïó‡ò½ßŽs€b7Nòh§¼¦ª83ÃÔÿü½ÛCÆ ÙYÇ_÷»ü“ulw1{$ßÿq·ù1î=†¦T0¸ÛOS2êÑF‘acŒB_%cÀ 5Dқīo@¢,¥†b´Aœ|ŒÀ@ßÄÐà¦TQè9lTÀÞ $qTÜ€Îó‡‘vw(8¡ûø’VÁ¶¼f%]Ú²uú|X`œ›³Àjt QˆÖ}"k¥ … Žý¤|ñ èM€í`ñòò\[ƒ»/ÀX¬w@&rås÷÷1§ŽU@eÿÔÙ B9ú¯?Sû®—«;åÝ¿§Ô0Þkíæ~Uîè Û†©÷7ݿ۪¦,.Õå($ŸÍçá{üÃ6y|ÉLùYÚÎQWýäâ;bJ‹Y‹=ö$¦¼5ï„ìÿ̱O[Û­ëÁ®s‡ævñôïîå‘[”Ûìî#ê¿Ì"f÷ŸDÇ4äò,ETÉtçzg™¥î-¾¥98:2˜b“k.w•qÞ‚lpeŸÝ•ÓÄ= ½˜½yÀîËAì2dtSPIEÑûIzÎ×YòI Þ§`¾/ íãsôñßÕ'û¿2Pe•"æßͲ{( ÃÞÝ{Cý~^ùv2$> Jš„¦C™{êï˜rz`ðû_¬ =œ>4ì‹úm€×ù9eìFÐ#i¤R(à€Ć…wÅžS¶v._»Â]©sÍSgüðÀÒx¥œ‰”4×?2êCñÙW¹ø!õ—Úù7E]ôæ)ÖÓK¦Ëg"WÖtgìÜw[úIq?ÄL€dÍ· ´bõφX8_s>W«T{ÐòêžóO¿½ÿÅæâ r(×!»ÞŸ}Cx½uNN(gÍGËn$ú×å;«k¿K´ÌEP}Ó§fLÕŠ\v® xÿ/¼ŽáCkbéê8Ç9íê? fÁ^%î­Ôˆ6# Õ‚ÎýMöíò¥Î9ýøÖxØV]éÌ&>.´˜üëgNUŸkC ïüTÎ2ZÿìŸrøÁ^¬nÁÍ–ÄŽ;ÝÕK¥Â…™qLN›~÷°Î5|² )ðo^ïus̲ós?¬"P6o_9|òûþV¿_©z˜ ïÑ!ƒag€àñѤ†é7c‰…²„bu«Eß$íkV/ÅWó §¦ð5÷ÜõË’C=ªôw?1ûöØ/—ykl–‹_FI$Åæ5u ÿtî®Ñ¾çmº<Ô÷àþœÄ†Á³–ú™ìB¦Îä·ZôñyµÂ6?pDtAJ\ XÞÕ#›7*ºÁ?íbD“z>õß"Í ¶ß“„A{Q5ÊÊ?}ozŠ9ù )YóP” šç‰Õ‚%ù°M>ûG윤9ý4Aw´Áï­Ô“§fʇV^äZJÏÁfùŸ§ëŠJÔ£ÿsÕy³\;®ü¼ÿ#–T¦\!J!®TÜì†Õ©i%‹R¼¦Œ²˜jÅûž_Æ:ºPèp „‘cÐ*R9 kE´(Š(+ì ĎɰÕÐYpµíR•1“\³^ÿ!€—… 0,ËéLŒÛk“aÔº"^Ÿ2iÄdü­£Räe¥žöžVö¥‰K[—Ãr³ükU‘@¢lÇqÊm0ŸºmDÔfÑ›âSWÓÉ-ðW©Â¢Ô)‹‚á²Émû–‹Õ ƒ†‹ÿ›_6âÃ2éïûO²ëõ*‡z“ëÉé^«‚â ,Xä5:eB¬ŒFÑ*@„ ¼XrE½èÅàä‚ñõêÈÕ0Û¬V»íf*þ Ð" 9eØP³åø2–˜Ò*³øËÛƒ™d×±?nâí.êö›í±øòʵިf E ›T[-kAK \´’‰„´r9ÿ^VÌrÁÞ@†Í=ïS®Z}{–x‰sçkª«ýy ˆ‹R8Ñ™î¾sèò`#^„Tê"¢—AáUÔË(ÈlΪúç_!´ÿQ\sÙBê"bõ—U‹¥'Ʉ齧Ýû P 22Œ@?S‡Á¶ôâekè‚úב@Ãjx‘7"¶™ bvå¦?ÑkMŠó—ïì~ù:ù]¸w·ªÕ/ZY¼/ ¾ÏÉ›¬kP‰¼@ ûk45ÃÀÛÈÇÒUìQ¯[ÃN* ¥*Œô÷ÚŠ ‹NÏÒQÐ8¬ Ep B<€r1¤bÅh«•ì.3qÔª)ANå<84‰MKNÚͺáó÷LÖl1õ·/6ùÊz¬,©Uyå©@A±NUPUÕÕAÄÆZ4AkU¥³Œ›.Ú9óônY•¤â?â­µF*|þY3Y®çÔdÅÈaxæè¿åž~#!¥Ëª%­‘ ;Î -b1€ªÃªg1*¥Söiñ)¿vŸŠªSàUË¥z‰tã#S²´ÜY-ÇŽˆÆtM›YÛæûô£Ëçg¾2vˆ¦yê_´ß™q6çcŽú¡1¬ É433Í$\¶H‘ˆqºQw|ßoß׿™]ÇëŽqU×T·+ñA[ÿ‹ŠÏ­áe1z£>ôA÷²Ü•fˆ\Õ8¥eJíÚm"цÇß~lvQ¯ûJ3 H²"µÙ¼{V(2èÖ C6jk­Ò4@çîPœ¨y}*¹w¸0è11BƒºF㦤Zâu¤`h ××mAbEVEF¥b€ˆ—˜º&ÁQ±»iG •€nÈA–S^Œ³G¢’]mœ†x±py(]^‘XQ#‹¤àÀ€eäfI ÚX£X¤kÈp±F@[aàY¡…‘dYЖ¬X–# zÒyn€<Àçq•Ö[·:¿d°V¹³Õùù-t¶:ï3pòÖ¹N&7 0NÎu˲@à ØT6Û¥îÙÀf¹TÞø|8 „1òfíð^T •Æ‘ÌR@D_†<û>mæa@ÉA–I<¾ˆ7šÒŠo©Ý¼A#„[pxðîïÝçþ}ÉÛ=»—Ôö^ì•§'igˆ>kGŒ!Ëš§jžnÀD…FX¨°ÐüÍÆ.c¦&Ã>£fMûqB&aôS¦#h2ýîtâJPÙ`MVäš¡²ÈBwt“2,‡RÎJÜ1GQl†™Z2a& x$0µùKcýI¬7 å"NØå£™ä¤ã aªÁ¬g˜ÌJôÍ$f¾o5 4Ïà Ԝ¨‡åAêö¨žWyéΆw1uQã" b¨Éd>¶j‡››­ÚªÛ½½û,$v>½s{ÎU›Šp'°gIT0Õ±ço“ uïãz©ko Ã\8L½µk›uçÒå m6Ù /fVÒeJèèÒE,$`÷§ë¨ pÊ-­)áwAU•ç?º„JÞ–šg(?Ìf‘‹ÌÔ‹xÅY*uØ!ÈþÒü tSŽÀ%†}gø÷Ï#Ó*·î‰G]ìÞ[>ÏCôã“n«å´ŒÌ-Í‚àîšÊX«Z´}6eº(Ônù“=¶ãoâv‹<ü=⽯½Òc¥–S–ƒ¶°Ù+åºO~l»ßN,³½PØæŽ‹\©Ž‡ec\ä­#/[,ªï×3ÚS«Kw ÐÞ¥¢˜åñ»F(O#*¥Ì¥vù·Ê«Ö'mÞ ã-ë¿‹ÛÎ–Š¦ ½Ì»ÍëË;«m¥_ÿëZ=Cþ~¼¶ÏÏ{+”ªÑõáóFÑêD¦¿¼e¢„™:ßû> ñáÃÉlY¢÷õiÿÚççü¼HeOggS@&³äy3òbÿÑÿËÿ²ÿ§ÿ˜ÿ‡ÿ{ÿœÿ®ÿô^™G³pƒà×j™e£`OºÇ7?r™r[ßÌÝÆÚ¹­ÏÕòyÿRÔByº)ÏSÄß¹.ï?9‹)c»î™Ëi®S½õùY*Ëž¼üëÆ¬Qñ¶ÛrY#ý?K€øãºª%PƒÙ'ЉYîV±ˆ>éô~í§ÿ÷»u?±{†®Wü÷ãÿËOn–=û˜£#ÉêkU‹p5:‚°,e’})†9ïWÌÛ[½NJq–éÉì³ųþ|éÓwJ½n>§²—ne~Õ[¿âüNóX,½¡CT>ÿžš‹pÄ\'£]-ªvFMTÝä“!ý¬nfî!2{-Hû£·}£‡vßâÖ ˆ7Å Eô[³D4y¨ûÌSAe×îµßãá( ™0üþ]pÞ~ÈÙd\Ùƒëj÷ñùS…ãÐŽ3(e³ñüv‰}#žî¼ëg®òiHçfj¨›ïÚMæÉ¡ò~tV©É='+q˜ ö3­—`á\“sžTm€†›Vwy±¹£ùÉuš\S³+ŸW–ŸÎðLDq‹IrˆŒÃãÚÅ,­|ïÞ0#5ð&8C‚ßPb²Æ—½4æ¹?ªZEÐá@äj0ÑËEEU`7BíFð—Ä `1‚Ä(”"{ZRf4—N€‹õ1 ÝPÉ”þßËâ±$î ŒE^ù†4ÆyÜë `ä´à'‚9žËu²C ÝÕ7‚X/ ¢V¦û0w’"óå⚉ðÿÿðøšYâ+À"ˆÛ€fÎ<£cøÖûŠ,\ÚT]¨á’eeˆw³ä5ncºû”·½VÉr@&Ÿ+Hk øð/>â±ý>6÷Ž£~ùÄl¦Û…—ýÄówž“ é-ŸïÚ ?€²E®GŽ›ã5ò^ðßoüXØ c€ F~1 ÃVÉ-D«ì"™ ×{?÷B‚ˆdÝRµñ@SWäÛ Hò¢:]ˆ·>¼ÝžN  “Ìp‹m¸ÅCuç¾É‰B¤üîÒ¯z;ß æ\š¿ü°ÍQߤÍjÞTURAÄp9ñ¾ò‹Ssÿƒ GŸ.op"ËLŸ*ã+3$(¹Õ¦?ížùrÚ+ÅÀ7}ídmhÁÊ!7o3@Îùrÿ>ü×ÿ>~ùE©Œw¸²¨5örm%Ä •©dvN|fåu asÆ&Q G°ÁLpžØšž =‘ÄñqϦ†æêCWÓà XCÝSdU×­»×Ê{ÿ)=9Á€H³›œ¢]ô5¹ÏçôäÐõS™lÊz¦ò¦®ŸZÀ5TÀ¹*«Ï@“4Ãî8¡Í0‡ü=hí{6oÑŸ„ÓY"áóír9;æ¾ÓSsГ;ÇùÕÉè!!»a&?.ø˜¿';«€ir87gN [?>~ü<ˆ£;’ïÎ×ýfö·ïk·Å£áEó¾‰À´„TiE èk)ËZc’<× DíÀ]ªøI)«"‰HL,¾6*y¡ˆ­ÂˆÄBKH[ Zþëõ™Ö&ˆ…gç² A¾ÖãËvÚ×î"zð%ÀÌ1Gkm‡Ö,"ÔKàuÿôæ þ|ÐNWÿŽëô“îYäð)û»‡ ™â»ÕÕ_ Ð…´€“•%oOóô…iO¸æ7MA.3eX9]g¹ä0Þy¨ºý€¿òÃ&>ö‡Q´ƒ3¸ãëãß…HÀæs“ðïBmD:+Õe×ÏEæ9¬‚ Ý¿Êâ<Ì~s_¦%v›·x;Øìsa ®ª9Ÿ$µø2~ʺgUF÷5ïÖD7tóðJ¿û Ÿ:Í¡’lf:¾pö矓«úJž}m.íêÚÝUu]ßèb·)FoTÒ¦gOùRÎT2PùÔt˜z¡‹J:¢=Ø›þ-²wíÅŠ¡p#W¼®ùš5ë‚;†Æuöµê;Q-Sk $¸¸/ÌM÷ÏÖëáä\jØ\Q_N8ÀzÈtJ¿žÑli/@jaÇPÙ€øBi°$P¬Ùø·^ °íªžëMú™½&ˆXC®¶š3Ñ.²ŒÔð˜ÕÿñþýWÌ_Òx4l³m-Úa¡UZ )ÀINÂWNhþû^’ž¾å¬ìî +¹-+oÅ!ÊÔÏ<Ö†ÍgÑOÞV®Û»ê ¬XSrx<²Æ="r Õå©üóQç=¢¾¼3bÿyÔý¼Uä8; Póþõ»g~îZ†,›ü¼\½·}8dà˼š½G &<€ªþ9Þ¯ž}œÎÚ9Gu…m¦<ýSåë¹Ê«(èºÔyQu‚™…†žº©Üu%tq–e\YPLO§î®ywOA‹Ú Ÿ{ÄCÏôÊ qÌŒÎɤ{< y®ÛѦ˜I3Å3gy7=Àd ‡Ÿi’“´˜d‚eÛÃ{üèëôî³>ô¸ø+*§f-ýTÏP”š1jãÜùï¹H×—›o^óxÔÞÜûí,l`pÞ×i››(@æÀ\IƒcÄx,BJA¹°EAgRh žë-ò#­ܵÛÄq&€døPäI+bÜ_ëóV¶Š_þµ_æÁ—iþ¶Îf­×¶¡f*™(¸!ùÕ{žú k(ÖsþκèKUþ0¬Z†ßð2Â{ú›€Lo ´Ùm×SÖ½nÍ޼ǓTíó˜>ÖÆ¿öïC`î¯Ã;y9ÔñéA£m6=Û¡#÷(vYÑ;Œ' i_ ’i ;€•uÿû¬f{?ÿâÿ4Mk(¸\";Ï1QT©Ÿ6¾Ò༠vO<iDÓ¢€”Æ!Ãcˆ*;@æx½î ¶N‘Œ¯{nìƒèœ€XY†‚3C1˜†r ²-£Ó2dqÄô¡µ …)@ ¬Ùaàˆ¢6:š¥E§ˆ"É(–”CiGdÓC YNÁÒP`XŸŒæ*p)R—ˆ"ªë 82±(²EŠý F ”•ÂÀgÏ  Dìù€½žÂ€cÞëô«íÁÚE_ãZ RÛ}4'‡Ë W|÷¡$}X„YþýÀ¶ŽaÓç™_çÃ7eŸ @[-ˆ¹FkKÓà_6ìNæÚˆËÂ8Ô{RãO^áÀê9ŸïhÔ<±1óg¾qbíC+éÁå®Õš·‹‘ZØ/ãõŠh±­MªÉbE/þòþ±å¡VûÓ¬,£`)Uo » ‡2„ Qºà\¢` ê|ƒš&sè.ˆ‰cvohö ©2ÛçCFÇd •äMÓµ‰L9»þb“4•.j`ÛwL¹ÁÞz&6€HòM}ŠjŽ!$M WË!'íB2$¶ÐL š:@½¬4Ûpa¼|½ç_ÔC­"Z™Þ<‚Ìš¥@ó±K§š‚Æ¡:dG€fä\@ ª÷ iщ„ƒª‰ÍBwÈDo¨ª00€#ÓÀX$2è¶f%L@,°Ç°uëõºÀjE³Ê ¬¯$©¨}²Æ^q,do€AR€@±–„•B ØE, Vëõõ«‘½µ%iœR·F¼ü¾Ü@ g±g 2’1¼éR”Ù4·L¤cÙ#BÜÛų9t¯}!1ýÙûÝ.‡XU…&¥øÿßøÜIÎÂ{së"JTïœ÷ öè¯&/j·Ùx³Þ5|ýƒž=T‹Tõƒ—KTåbDâµy«ÿÏü5µý#uŠFõ£½e9*¶éîêMœÿÄŠjº=ÊuÓ@ξë*Ž«m_ÐŒš¬»Uy’É~ š"$Œòhå³Ü ÈÿóàÃajêçä‰ÞšèžÇr!z'ff¦a*Ïža+y!.ž‹«EOggS@´&´»EÌx¢IKFKJK]_\]ÿ V^I[]aÿ§ÿ™ÿÐÿíÿó¬÷þîîßY§Ï“Q¸¡ÉF«†žÓyݑ̓ȰƙL$øzšl'¬P­z3ß4ÛSX‘1. 炳òS i6ëbÜÎË,‡^ŠiÛF­Èù€„´%J…4ƨŸ™X`ŽIG ú= €€»ac%@¬Ø¬P£82ðÅ1€£8 ÄQ4HFI„Œ_+X1Ìjñ3£ôŽØkÇZáÀT‡kÞgýxåòáE£Ê€¸ßøñͯ±4ñ(س”ìŠéNÞÍÃZû¬îŽl¹î‘=}@|$Ô†ñKµÄ¯{ªÝ­{R& àZÇ·žŒ|ŽÜJ%,»ÇÙ¢É×üZòœ9VÜŒ?†ºû¿ž%Ùá×··…åZ˜Å++<Žð:ÜjÕt8ïèÓ÷¢hv¸‹³z²?þò›cXLtq7QüÓÂóà=÷¼|Ïás÷ý¯yn.E~‚JÃÀ'œ'oüs ô’ã@°°}l-|2;=×h?úH•)€À‡&äÿ<ëÆÉŽøïÉ}j1êɞϬù›xæ°3¾Ýÿ—S9H±k²;$ÍÒÎ"Š œV©w#2suŠÜlŽÙkÃ1^;$€Kv6øüŒõ͕ͮ7 ’ÞßâП+|é{ÎÔ­0¡\ý®;:,+ °š¿tžËœ†‘7Ù´õ¾b»à%›õ‚®Ñ Ãðiƒ‰ˆ× ²¨ÌÑ•ÄõùË9sE?ó~™fN¼Qw§kˆ¼ª3q÷!šÄG‰ßYÞ‚å Ìvã@ûOÖv™UáÍ%´BƒŸów/žþyœ ‹…Àôr.÷qþúìû5?ºÙ´ÅsËï©>ù<þÜþŸS¨‹mûN»8j£3ƬQh&F+D2&ŠElýýB܆ÍMËùÔ-;êíÚ\p¸ åYDàš¬}Ðmy±òžçSÏ÷ÍSÕŠýôã¶ðØNŸ·ç ÕV˾l®¯kâ°þö3—,©óVg–7ŒxQË>õAÄñÄzáj M%lF³úî᪜/…%âaÏë'ZûEÓmUÀïCÿ_ä#—éŸZás–Ók¹ÌµèmõÜ ›ö锪±Äœ¿»«VÖRJÓY õØ‚M´v‹ðsÑï<· ìvͬ` >¸nn.6M4Öã´óÿ¼ù¾æb¾­mF ¹‡”žŽ˜Ï6//¿›=%ÏÚë÷zÞž÷gÓè(s¬Ê¨‹êÀ’±žBWŸYd R1Öëq 4Z€;ü.±pÒÚÅøå!+hMÐÊeôHÊ.2ƒü¾¸íc€ö¹ŽvˆDm„ªQ”L$ ]Dˆ!vì®9Ò”ÆW²@ÂÔÀq xŠCä̤ŒvO4”NÆü»“4_¿,švû¾&ŸÇE¿­Þÿ\ɹïuE•é&­Ûpa,û¯/Öl-Å/ѤuµSYsÐÆòaÅËÊêbs]³<‚c}º&x''RcV”Ãç½ÜãóË˶ÈûÆ’wẒo³‹ÅX};Ã[ýÎÓó\b+ à:> 쾿m”s˜Î<¬&â²;ã!Y;,þÎ-#.Ë_šI4tæ$±¹ÕÏù3¤4w»ɽ-Lþ,*Ê’ÂùfýÝÚRžŠÂÀèr8ä#ïǬ0ºÂ¦|XÝÍ»ÞÓ6êzõYŠ:fQuåu¢èúìâJÃn-Ëò­t]]£Xµ–Æ6KñÌR1ªa‰P ê¥2pP>ÀZÍ\Æ]Å ÒŒ§h©ú!«ãÚX±þ«ÐoH*OåRÙþ]§í¯á¬jÂ"h-þÌʻݕ™}á9´‹ óîè-²ð^ùD±}•uôV91¢z’|ÄJ§(b÷(Âè´-¦P/\òÏý yI:kXŠÕëTÚÏmƼ¸(Ť¨Zs9äcí."Œ²*áÔ5² žR=¬¬Ø¢© ‘ÃQ‹ZÃIä寄¬7@û¥ÔƒàÁŠN Ýk–a2udôêÑ=N¹9‹‡Êä›S«uh| °mÓÏáÇ«é²K1&ÃL’@ó5%¬à¥öm[}Ç !€xƒ¶üè ÏòŸUTOü‰¡Þ6òvuî:ÚÄXõÊæŽ,¢®EYRþñ­{»¯-êZ°•®Ì¦€U–j=Dª-‡ð¹@üDG-Œ¶ Kfኄ>ôzm^áÀ^„$‹§rûó˜CfOYnÇEJT%µÓf$íîR]Qy¤4†"cg&Çè.¥·ŒÜ»â÷BL’ÑÀM?4ôä¹EÇ =(mä±GvÐí$Fô¸­‡;#î‹C5„ÈF :1…¸¥Òä¤  Qsͦ”í¨dBšT ޤÈFQ3€–‹ãG~ÜZ2×Ú ÔU´´× u¦®°r—+)aÆF(ñ£]k*àЄ(j$üa¤‚nl(Àæ·²þ¬ø‚óxV‹e‘9/S$[øF—1–!2X0Ø""°À„Ð ÔÞa8ÌMÒCɨBoWë —;{U½™aõhß$ö“u|>OÎÙã•SŸ¤µBÆÖsêÛ,ºZdMq´€v‡1Å ˆUw¤Ýq¹§õ0môî‰ïîxÙÿwŽã6=ëÕÌIEqK—«dJV|¨Øú–hb€h2ÒOÙºÏÔx eŠ…î½÷ Û°ÁQÇWDÝÃôO/ë;d*èVk¢KÎ&K]:¡™ f€µ”¬"jXC¼Ýú¥b$ˆž¨Ì,"îȱ»u‡ö,1–«KE+ÓÝ5PÉ@§#%Eb:šG`ˆTï¶ó³°¸»»hÈT¼îoLÓÈ0H] (D¡ò›@ ¢™UˆÓHS&=Žô¸wg¿¢éiª¨Ä"ãdš'Ö0öli9¤š¸³c@#+/¼O?²Ðˆ¡Ž”&CQI!ÄZMKŒ¯‰q}s›è$# Oë±ÖØ]òïX2b[l@DN dÀ@ ²Zˆl§b 82FoçKÂìeÏì:AÊ ~»õ4& ä.6+‰SÞxjhߟ}ó Å{¼ûÿ/b#ûÕ´†g Ϋ‡ƒ¶»ÀÂ8`ÝÂ'g+¡]׳¨Õu]¦˜PÒø5œãÐmµ‡c¼Öœc®¡®Á†æ·VU·võ ièF >~"Íë'r”j´9ÜóZ†ºšTYÝ<Á‚o†¸s_Q‡Ï†­ÖIî¥(•seÞìW£ jÈfŸÁ“É uYoÖ¶éäí¤|dó8‡l”½µ§*„·dás¢žw41çqDëž}/²3‡\ÉÜüÏLxO‘÷$/SZ Zh²}êŠë4O¾8cAcHÚ°ÒdO6ÕOk®2€Ê~ š¬(G¡$‰f*àÓÞOÉÇ„–/’ij‚\z#rzÓ®˜"éuz–Nª2¿Þq‘":ÄE;`µÈã)è6d ‹Ç†c˜&!q9é4ëâ®X˜ÛLTÔšÅ`P&±DU Í”µ»È ."Z™0šÔJ½©´»@ÔzŽ‚²dd &rËq´:T$*ñ# 1ºÊï[oì7°"™!ƒÏ‹Àž >œmº$@€¶×Z¤zý`‘{‹»þ}kD¦¶3¾¼sÚ 8:ÑX÷3°. òÆ…p·ûpÁO&̯kNoc݈} ¤úš~ÜŸ¸ÓÎÁþ*8qù啽wÚKè(¹9&Ö×ñÐ#®=W×îÀ6 >»½çH‹ó†^Ë"·r¥WvÝP²Wr3‡6”Lú)Åõ¡h•Ú6Mì-Žä@ÆÎÂVm$9üÂ[·½|¦ÎtûÚÃîÓé3L#òAM6ÉM1¬^ÇçêÑ: -:/6ozÒp ì§[Š~¿&LVüÆÑÔÚèU&{A¢Ô§E°Îøãk“µDû ¼Á.jŒ¼?T "ÚU$ Р¼qÀ½3r"3É F—Hë;ÐrH$¶}Ýœ°™_×xkªéŠX:4&“³õ%)®9§¥œ*9 ›XÞÊÌù¹OþÝÝ gÖü;{œ0/*!ä&ÞźOrùžB ÚÅÜníÁ€·›¢Î@NÆß@$¾óâJÛôÚâñzâ†ÁÕ^Ág¼Ô§k­™Wœ!?®d ™¾ÖQ¢R¤‹÷ˆ®öe<~^èÉšfË  %¶•Ÿ¹lš ÝxöÑÔ€V¾ÚêL«–l°ª¡éH2ëÍhá°€*¯˜ËÛlÍäÞxCŽ(ë»zÆqLgY@µØÛ­‰ÂauôDJëTÖa3‹DF»1»¶×’æ-M™²¥PëыյMNÐxD¸¨<@¸ˆ±4aÅ^••U­gÂ¥Ö(ZE@UÈ›¬ÊÌ3Ð0Œ5Ú-@M1rTp~3àTLÛÖ-U¤¬V$@²Ð*€`Ñaƒˆ¢ÃQÀQ‘EX´XÄZ€ ˜ €Œ¢Ð,(è©`Á!kSX OggSÀ×&µS1"ÿÿ ÿþÿúÿéÿ‰ÿqÿ±BZUY[fdÿΞje áo­:T¢iN•$nŸ3ç‡ÀX¹ÞÿÑêßÊ |¸p‘Ы8 W+¨pa— °ß,CþÂT;$€h¬ëîè ÚˆkìSæL3ŠÞåãÓ¶¥çt^î#!—ÄóZîhC âeÅÓ+^ó§šÄn} ø’= 5^—ìk ¹@)@Q.Ï€cãsÀóüð ƒ#•³„ýßÕ‡V˜8oE‰ËîJ{ÜE3Õ\ tà‹R†K*€ºE A%ccæì%ZóHe¢T‘ËÄT?$ŠœWü·²boêh}}c‘MJf¿6Ù2•ÝHܾdöú»+—õ¤Ê3´JUÅù2#˜û$ï³'H€è"õlª÷íNgy@‡fw´7sZ€œæ°ŠVÛ6ÞUŠtMU Ð.«2ž¨‚ePɹ®¯B²zm® à-Ði½ c–|.ÀÃ|KÑ´‚NrŽ„7¸š²¾$kX&„ IC•¬ \Ö= Aœä\í­tÛ%ºT#!@­Ö;w2+2tÆ”Ä2dð!œÃÇ2gIšã¨²±7"ˆ:ÅÌR—„?ÊbhîVÖ1ÿÝ‚ÆÑœhöûC¢”¯y±»…¶u†Õjº!ý̤ËUO=0œ±j=Oq v©(ëÈð&±<‘0 ÀЫV­ µ‘Ö¸f3kahyÊZ1º\mÈÞUÐCÇM½¦™5kí@ÛXÚd[ À02`a ˆD®1¬€zÉ@›@[ *Ø¢#R¬¡  XrÀ —ª°­ª1b ``Í4@+f ªbb½—€ø)ÀWÂþ9¥|…dY†ï” aJ”…F ÿàø¯¹šD›àÀqýÀûÁ,G<©¿¡‚c`Ÿž\ €ù6w‚œ¬g¼‹>xL䬙oÛ%G»¸ö™‹M—Àyø³ç–'Ù†àîý$ÌÓ¶=õ2Ï—®[î¼`U°µD[£WJ†HyÜ~ßoê¡1¡@&ä\ð)[ÒϲùÀ[”P`Á-¾%‡hõ¸‡2UÉÛì#€¡òâ™=t GÍ¡©}#tÈ™ EiëdCWí_L‰Úš@–¨ tÈhtªÖ¤‡¸Á¾ùû‚ uyŸLîήjœ£EG®ÖñG)[¥^Ó^Ηìi˜èä¡7û ó.€!8qëй6'›œÙ(' Ü>˽vÔÚ”†zÈ*jÁ4!’!@ù€&N€à¶ÜRhpQѬU€Œ¨&‘Ø`@°+4 ¦µÂ¦±3±Ù2òa½0Þ2–:¦•v`R[bÃúŠ‚ETÀ%`1€õ\1@Û’™Š‚!vÓ‘e…s"jͺ©€Š‰ZQ2Ú£èVJ ¨ª€<@°h´@ c(*S¬¡(të0€`ëV1€"øC6¾*Õº%)!‹“Ì< ý£UF–¸:]#ÓNí³”1»ïÅk?.€€æÚÃU¼Ï;×6ðP%\XË+ÙnàîWèáÂ1ˆK÷6¸íäÉe‘wzä•j¤KÅ$¦é_ûÚöôqÕøÆ@âmü â„E.¼gÙÜc^3i ˆCJÉ~íó÷²È™\4ƒg׋¶Eu²jÛ:&´‰‘½™ @Plòwªr´´¡¡”Úײ$¶aÉæ'ë‘«Þ+!C !@28l³æik.âJ!æ8Ô¯ŽH¿-g„šA›k^áp e‘;èðåÏÜ}Þñjçm7É‘(åãÉm̧WØü¾à$v@€Ëù4nÝ:Zh€uK´šÓh*𢽖ß[9-  Ñ+•ÀX«@yXQÀ,{×DÚ ™2&€¦N][i"ZÀöâŒÖЍ¸£D ¶&IIktâDÐÐq6<]ºtª€¢¶¦* ö¨¢“¡ÕÖ¢ˆ`«‚hQRÕ,TY\@Dô.=¤ÿ@§DØ•@1F‹à8 è ` \߬êÔU¼[`À@ :%‰>Q)Ô´«UFðùh_¯¿«=c$­!ñ¼ûí5”WW©B‡mìg Ý ¶9‡I`1”¦Å˜˜™0€é©§˜UV˜>«sÐÞîšôùbÛŽ™ÆjÞn¾[2=u1]è(0wª¾úZäLöW†¨ûÑw’\1DÉY$àÇÜ; â.TŠ*Áy2^Zã%-Í…ƒ¡`€¹0]€ÄíkFŽWQ¯¬ ”--ŠŒY[©àn¦/çì0ÕìνXNŸÆe”èºÖ×úz[×}“uF­¬´ªíu&£–: :ˆDʤm¼œËÑ*°ôvÁ ª î+«›ŒC6²à³¿›+øØY¼ð¨gÐɪuŒí´ËÔ÷÷AŠS‹^‘pÕ¤Ö:à .ÝÆA-a;STUQňÇvH¶L­)lä?Ü~A²ÌŠŠü|}¿` $®Ÿ„qÐ*ÉÀ²$jòú¢ú´…ÉUûé¯ða^¤åJ+¥VJWì:Ó#c ¢µÜ- X‚EhÀ ÖÍbnXžT,¶ü†e0"ÉüÃ2Ì3gt”ˆ;ÆXÔ~¯Oh‰Å…½Ä§òìç'%Õw¿–ˆòÑg¯¶5 GU{¥5'e…K-ؘ¡Ú=›Û¡«ÕÓ‹ökïØ K1™5 Âð+Q%U%×ÿ-7Ez»ƒA:{ôŽ¡5+}ê¡OêõéóÍ¡þKÑSó=oÕs± u%yýqQº;¹líß~èm}”êþ¥HdŽÿ+ÚÒgëý«xx®÷ãï‡Z‹Â§S¡A¨",K•DÕ·ýúÏ·»‡åP©‘ÌíÌö£O¨ëûe¿ø]wr¨¶ªõ9¿r{øÉH¦vÿýË®!ó1Åë®||–O˜e2˜å‡£øé¨WýE,1ø÷þ’ZëeÆ­@¯¶‹µ‡L Ï?À›¾£õÉ£”M‡ ‚ó€ž1ý–7ë°zo&«ªÒ²!PjôBX3_¾*œ[–MÎùuZ¾›‹¯±ÿä|¯Z¹«Z˜ìí‰%íÓŽà“Ÿ yùq·´]©ÎhîyÖ¹F¥žö”·éõu¶¾fN ý^‡nû¹] 5 ‚uW…P¼î”L&ê—Žr—]»ã@äÖó6½õ`è9¯¬ûÉþƒ©tÊnÈ+bd9V›^‚Þ  Å~ÿ4µÌÞè5n}‘äK¹tlf:ãÐYÝ=7§ÅL}˜o_ÿ†XUÌdW2róSÉì1ƒÿJŒ XîÄ:^Nó³L®5IÎ`6\ÝõíÅ@ö4R=E¯ÆtÍÁ:¾aŠLì “$8‡QºÕ\ß~îA=ž„¢ªEÑhC¯9¢>½¹R¢‡N }û'ßÎÛÖCú£lw$ìðñ6ó,ÄKíoõ‹å1¯opQ»Q…ăúÆ`Ìc!„EB¦àÅ•QF• ·T¼ð…l“ Û½aªjs")"pQM¶:ƒŒæji€ýµl²ÃÓ1Ô1±È…~3®¹4u kƒÂDJÿ)OggSý&¶E8ìÿâÿ¿ÿÒÿÇÿ±ÿ±ÿ¨ÿ¸IHJLMNZÞ»uÂAÕA”¤öz±FxˆêÐ}Ìãć«3‡=‘ã‡Ç‘©‡ÿ{æáŸCd Ÿ”ØÀy%ºÇ¨­c#ó–tŠ|)³ˆ¶ðÇ^ŽñéŸývOñ®¾3ëüå›n,º×?ºîºß£ƒ«Þ[Š–ŽÚóaF cç‰^¸¹d—ù×Ñ{ >¼ý¸¬LÚöÔ@þV€þxÞ;ë&†BMzÎ ²¬F<¹ñ4¨¸]'©pÝP¼¤„C˜·^*Ý,[›¦h{cÝ“}²i†ÕA†;ïî5Ц`r?t2Ç‹Ž˜æ¿-îI¯þ“½3ôA¤¤ßâï2¤§²´&"3ó~ÝɉËáÑ>ómzz€³3~ËNʾeºHòjvƒßº³dîÞ»ú %¤Ëò´íÐMøü0¿ìŒ&ÉOš†èÁ5Ü¿‹3H¼µ„" i¼sgzÜñ}>óÔ'>´/T2Ðø40”×ËÍ#_ãMÆþNˆ½Áì½ä^ ¸çMzéF,¼K"#>ƒ±$@<… <òÇÈlø¾*ÐŽGNAuOh±¹†à –,ð‹,c,Pc.ãË’­ `°à1ÖG‘V!…€ô àXpáÅ"²5H´íþyUXÅcY±áq[@†ÇLâ Þ»mÀC°3 BW›u„#‡ ù¨ :i¼¶žgý!D«þH^åœ+Àzþé¶çÙÜ¢Ñ>ÔÌd¥´ i8¬$3`sìh2>à™w4Õ‡ìÎc±åÎÌ!¿í ô? ŒŸÍkã“ÿ­ÌUÙï7’ˆ$óùcÃáóz¦ª‚:^â×'¢öºCr…™yúóÖœ®9]ý‚ò~Dʨ°çž‰ã€½Èmß|:±Ðí2¸R÷w,E>ö€`èJñ%»Ì7@'Qý–³%&f.•l{ì¹k“&êêS^Å9€×>ÃÕP“Þg@À3ms­¨mÍšIe5•¨¾o›wS’\8ð-‹4<Ó#ƒ[Îp»²wÁOÔß•®¤ã¢Aòr9NÆköiY ÕýnžíD«F„¾g~ák’VÈ€‡L2Θ|•²©ÖŸíØ«çž1NÓcT™B46] §ŸM‹·_š ¯–¾ºÎFà„¼»ÏÙ}“IôÃä>^­‚O&™8žr]~ï;lÕKît÷Bk’éfCh`7uËt¾ñJ³ƒ£W—èœdpýP™•ÄE2YY4ïC°¸×6Ot&Ë›•¨òÁ#"¦¡&'‹R±Üº¼ŸýîÈOöïã$IèY¦jþ÷º˜è«¸›& ¨:/Ú,5Ò[gV9š»¡ç@M Y[P÷O‘C-ë1=LgCVÖEu ¯7%¡h°Wž³×wŸ‚†6ç_[˜ûkÀ˜ŠÞs’1Œ@u^° 7À€ƒ“ÎFÀ"‚2â‹å^¢¢óÁM)·õ¦ü.ªôÌDÏ…HÚ)6*€Œ@Q„‚ž0¢´Y¥‚~ËMtL”¨Z„÷lÖƒšPDRhÿ/1įúyw¸mðö|Û×hŒÕû\ب0¥\Y* €î7zì±CnØϾ¢uUéue1GHÇÁCOnîÈÆq?ç8Fc"ÿHzcö¢gÙb÷Õ>-Hf’R&ï¾tåÂÐ×?ú¦KÚöûìo6Â< qî0î„ÌŲÿÿÝPè:ÿSsHy- fq߬ôjûÛ íÞx% DñÄf&À×Ã$›8÷>Õ)¢¦yqî[öÛÇV{Ý{@ÙëÜæ<‹5Õ¼sšyòçÍSWSÉÏPÏÇŸ‹9„ƪè$Ý™ÅlH’<¸?wÏ”ªrbòúk0Fö®2ˆl:³·/Æk›öjOÍ“¨§oV|ŽÍ M­‡¬óxÁô *ÙT¿r,mèÙãQpézMGÒ!á¸ò{±ý°èÂ\1¿¿sÅ Î4W]·E#Y$!óغ‹ à"•]›y1d!®Bu³§ÔÁ}¹üÆHƒ­ë\˜~âG³¿ªlþÚóàÇȸJ>ë•ðlN-еڈç4ÖgŽòTFë!{€·{œý8bì³ØøY\g84[ó¹oð#›£U• • ¯n´çví·ŒMžWÀúLùMiÙçÝ¿ÏóËHÓîqœ†më;ò•üç‚Ï“¶ËƒÈTfß|øò¢–¨Çg 6‘[f žjõ‰€:Í“»‡q0Ï´sÈ}ç(ùo`xH²çýÈîØ6€B’u–qÙÍÎÝc@Ý`ýÅLjb:À¢’áyyàPŒÝƒ[ÆÐÛG–fP3·?^¥ÔQ·—½f0LvÐwgæä'““=s•f w£O¾»j¹Æœ?ƒ¡ÜYSšÇpÝÅs&©'Ê"»–Þ\s ãýÞ€ÖÜLvKæh%fH¹îÃLG Ïsü®§Ø|–Ö\Y`z?æfâëÞùýr 8ÆÑaÇpé%·/–¤1•CC+4ÕùûWe5õv*¡º¦ö#‘$HL´¢së›–GPe4HÛY!-ïFe~è0R±œ6¥g #R銰Àò¼À»©Ø¤[E´,%ÀÝðèΕ,@Q~Ûõô’ÙP{õ`Ï^óˆgKbrpíg÷™ß¹ÎSÀe=à²á¬ýŒ…ªµ]Í«E¢Á3ªéÕ[T«»;œÓö ¾Þf­}1Ÿo¸Ê¯ølîçÆŸƒ/áëÈ Ñçý£õ«*ãK@à“§»5Jȹò#*OÎÓm9eÌåÁã·£@Pbä`Så*dç=·"‹7#ɲ`ÀíÏ–;áêQBÇH.Δƒ@~{gý35ø›’$jŽ´˜¨z®º|4‡¢ ãPºdP><Íß¿š‹GòÊñ¼˜ïí(õÏÐlÓù:‚Ý$So?5º{`oîïcƒ—G>î> §~©‹d)6mÕ?’h»îO”ÖømÓ›^Qõ;Ij–\1Y•ÉÎCŠ„¡ø¿ì}fª`hš]]W©¼®½³ÀKWNF pÚƒ×yÏõD*¬æ¡Ò®Ž÷Q1:)Ú “1=:Ù42ÀýWàSY@@cÊ‘ QKU»¡B€@¾ ¡?°5J0`ÐÀç©(¨( @Óá40 €ó— Z ~›­øÌâ±X/ö8jÛ‰#Àg¸çeÞ6͘L Ôt \•o±‡ÛÏ_ëžEk£êkVNW"K@o+ö^,Õé‹s¿ù#î‚sG³u~ÿûw=/}ññä2þ{'Ó|å¾½Óíû¨¸¡ô=Ì¿?=¿.Á3&Uñ8œT@éDáÓ3ÿ»‡7Pé¯ê¥ó4¹4¨¨WDiW‹¸Î-ê`‘1¼`i’nç7†åŸÈœlU«K¾CÇôLyP @ȹ̈́ÌÕ0Ì$ÔNÕ¢+ŠH-_usI!üó àt5õÊ‘î}µÚóÕý†ACRýÚảy6Šèãw!ˆêMc²“J}h j_PÇF¸˜Ú1“ž3q½v¶ínîÞÝL3E¯E%À´©w&GŽo¼ý~à‹Ë/ùGoåÇ/kS»iÕE¯V–.çÏ ÃF Ù©B¥Î˜Î‰Ö ‹<[øå ,+_= Ð7À(/¥‘ *0˜€2n>îÞƒK ã‹Èû 0ßU0ÒeŒ$Æ`€ –y%íkÐ Ò€˜Ê+oÝx.ötO.úݺ©9À«éÝ~ø)z\̶y7¬—yÛ@ŒX}œÜ@Öaªn¤+€°K’pL<2 ×hÿí¯eFÝŸsö O÷ÜfÊýw¸B8n\ Â!BsÆ©ÖçÒ=| ®Íc´h0GüÇI›i½kY‚¹öÉ^chNˆÐ \PÀYà±UÏ~5ÎìF“kw_úÖØ‡*æ/cݳ¯#^2oˆ§äºr´H‘D¾ôù‹ñBCÍ {?þü5€Ê%P6ãÉïÇOéx¾g`‹ï¿—Ü?ðªwȆ4ÂäéîDé¡jžÊ&M.qy8“õ3Ýýꯈ/³_Ð MxÏÔ~ÓýÒE%½i‰µ Db߈žœ·F쬟–µ÷ßêΉÊÃL\Ñ1„]Ø2wyãŸÙ ,º§NMwõZ×1wP+#ÅÑ=>w¢8·Ê üXSÄ|E%Õ\LÒaÓ‘–#¡ÄBiU)ÀQ¡¤Pà¾0K¬@àƒ×ª‚ >WÎümª(¢À²Þ”>…‹^˜V¥Ôbä,áFÿ¸^^¿B¸¸€}ßFÍ-ÈsP´CRóiS•w™¸+ …‘‹wÕ 0A7Sõ²aRÀ 2˜Êoá7äVÉ>8c­@O7…ÈüæõÇï.wï¡Jê\Ã4o»¿œÛ¬åÌÊñ¡ ð;³f$l[5ľ79Sq4PÀ‚ */P¤V©‡ eã…EèSwa®¼`.Zd(Q줔Æ;Ì»ß}ïzJΘ–,—^e6­ÅÕþº£·¤Ù‚œâú 5)õ 0çà´RÁi^ø*F¨S˜<ÙvAÜÞ¨ÿèaœ¥¨¢:—cÛ¿£ôyãùžÏ˜d½§³¦æ‰k²Ï°Ü7i˜YmÉæIšŒAŠzYÎ?¡P¼Vñ³„^œÛù\­ê.æòˆ¾šßøö_/Έ°é›·¬˜—ßcd–ª³D§´ÄhçX,3^;cÁ¹¬G÷k ðÄlùȬöW”FÑ; !çO:­Š¤ªŸ0ßåºñÍÛ+FpÚ7‹±—ö½·ìñ5D?]Afd×›ú¸'G?)®™“ç~Ú@.hˆ ”'O€¬VÙÍN•p­T-Û{ e› 5yŸ®ï¼ä6Þròf‹Î;×çÞ?µsTfyç’²²+É~B.³yˆ/fyþ?òY²Þ½rŽÊÆ•~Ù¸®P>\Z«Q Xûuã[OggS@#&·Ò ¹PWTSYUSSPÿ\ÿSÿÿÿÿ›ÿ€ÿÿŽœ>ÁlWº”t9v§©K§âkâ|˜O]ÞJ‹âä¬òm÷©OÝŽ§ÙÃe{¨–§û põÁê“T¢ë'¤}««µªQ]ƒ(z‚@J¥ cT vßSþpÄfÙa‡Àý›„êZðÞHÕ0ùl+‰AÜtàÿ»æ=UÓ€‹½#ÚýqÑú‹þÝÑpé-±œ]‹'PtB‰­M+KÕ¡¢)ÅÄ{&ºŸ‰¬JI·aÁ­WŸO±y BH¨÷¼æá·wA:' ƒ4ýsF è^k…r5ìÇèÇ7V¸ŽÜÊ;õÞ'jP+*ñLèô kÁvïf¬µJØ¡”2c·Ý¶Ü„P b«±ÆáRz£TÁÐB Çàjìȃo#º®hݲ¨üx´Ü¾¢o[æRxçi‘q Íè u´ ¶ˆF£Ñu]e*Ôâ5´‘Râ¿G“ÔBmD«ÆØv³·BѬ‘YyŸñ¶ÿÎ M…½µÚ¹¾ uHå¢Ëpö²Z‚|׫–4SB†ŠÀí ëV&wª¢p±ŒuŠ!“Ë´>A¶¥ |Ò-ÕXea|›7Üx¾¤Mò¸ºÜ!;ÉEö!Ë‹Z¿Êö„5ª»öJÈ*­hDC ZEï¼´ZTļŸ©i E-¢j_T&œ"u(Í bº×(šŒœ­4­³îMÿñ/#«‘ c ½ƯòПꖕޕ"F)ëÞ”¥:¸+:ÕÀĸÃÊH]·FEÅB9˧Ävì0]ï›õ \2=Öcg„,Üi· 2Ô íŒ`N bð*LZç‰_/.Jѽ­†b¥TuµxJ:JJ¨š„…Bbªv’óÓêÕ>ѧ{rdŒúªE:A.~ ôЖrm” é”þ?ÀeÅôY·N/ùÊÌ\!hÉ,ÆÌÌÌ@ODfdZkBàtçþÁjíàÚ q'e"Êô@åF™m»Ï[$ý¡˜~õϘ™”n@-ÉÏ_{×Ê UÎYžZ„©*fXˆ™m¯Ö 錷X $ŒEH*ˆôXŠk› §¡Z«àB¸ `Œ`’I@§hÒvShp"¨Ø)A#l Ð<¤^¦±Èe` Q5U*ÐFÀ(ЭŶ%pMØ „ˆ†”0@€c RéÒ‡Ù«ÿž£Z¸%|@¢´”pcaDh°@°"¿wùœhÇÏ\Q'"MŒ„ìd)®@Â)Ý LÏÉ¢ -F¿: M2$‰±/i’+_þFÓ'pï/¥iÌ›y£ù·/£+ᯌ7(þüí¥Öänr-ŽÑ ÃûÈ2B°®·®ê÷Ù#‚=fý§ôÊÌÔ׿H¬¹÷ÓW-QWå Å˜ifH!æ.=ê¹|3WÒîH·wîæm13n¯Mû°}ãöÙ«¬cýiÕ À.L·ïõÒØIlˆ^¡‘R ²®4D©Ÿ±6v¢×,‹4wä@ÂI‹ˆ0Ž0ÆD‚A`°ÞNI’R¯b¤lÐâ"BaUt  Ñ(ª ˆ`$â 0F›¦ËÛ°ìÈÖpŽf;¢@BÆ¡°4¶ÄžÖ¤î¹0 &Á¢)bºd¤vh–á*I¶MZ„FÖ 0 #X Àb@²BAÀ=íøn”TŸQJ¥ Åñb# dQT­f•«,ͤ ÖX¾»»ÊÛ%±v/»IY.8Dz ŽŒ,€µÑ`­žìíiå¢ð žâ™Î¥à±_„V§Ø­¸3[4fû¯üpC@ãa?Xyn"‹ÑÖª¥\Z•a»»‰ÑQ­Éºuÿ.®–úLÿœMëGW8´O`¿3¤Ÿ·†—Â{+‹, <żÜÛ.*×I*´u‹tìæÙ?W×Ûв:Zå †@Ñ5´Œ¨g/Q+#¥¹¶£¢(¶•©¯®ÞÐ4%;£êRaY¯œ2’&QDèrb‰Û>ËS×iÌö4¡dmR€"¢¦ æÃÝY‰¤VÈ ¨QëØÜóÙC“õn­,}‘gïn÷50K ã¦-/¸‹˜¾{×p3w‹^NdhR^¦»*œÚü¨3wzw #†ñ,°¹TÍšV©¡;+käî ©e€Ì¢ï‚¬ê¦Ýùrv¢ôioïOMûI% ‘$:TgÁb•®Úµzìu!I\‘H%¥Øk€@EõÛ~}HëI„'Ì@cËzкµ À2Ü(©+ÐÈC!dX'±— Ð @þ»ÀpX‡¹£›ƒT1ÄýˆuÂ’Ùz}rõö7ö½w§³ÞóàN‹6$æ†S‚Í9Í×ü ´Vé$…i—™Üýñ©|·¾¥ÖãºaD˜k±,H öÉøÜËïø\î#€WË5À—\zã§þR˜ø-”|d”#…RüZ•æðª:t*²O÷¦*·ø‘c) ¹¨tíŠñ{‘k&Èß l,[žÖÚSbE˜3”©µR\þÉÄlõ"›ËöiØ 0[ÒŠ  õ°Ü´*ËÛF‹¤>Ü]ôžÐ : Aï·êíä4 yHŒù ©­š—«Ùh~Ç7€îË…{À ÌTëf‰ÈæE‡¬[šfvœ¦D›Ç™úœS¼3óÍ2jXt€gw¬ÍÀˆ¨l{J(vŸ—Òû<ã,´—ᳫ«&Pro.ŽÎŠglø,šmt Â>¸hÑõH!„¸¡·ø†ç…âäÐ}èüHáø•sÊ@¡p:zú´¨ŽÞ¨)ÛžÔf3yуK=G¬ {÷@…æÉL—Í!‹îØ<ôÚÂZ¹¬*‡:ÈFé k¹¥Ð’ˆí’щx.“éä—~wýï;ï ™Ê: E 9SŠJH©6)ˆ^–—-R$ºiB_í.¢Øl)˜8jD€hfšDÖc 3²¿ Ѓ™Bvµ "›Dw €8`U(j*û¶j Ë1ÌCœôø2ÂC$ $E¶-±`ƒ!eë0`Àxµ~1bE€0Jxaø[¶ •ç>¬å‘î(#‹e‚¹]ï)w,LRÛyf«wSôî ßùð7ðÌOhL-ÛÜÒ`hýRTµÖu]Ú%$'w0SìÙßÖ÷gîºÄíÑK\íN'´Šë°Û³ÉËI_H¢´µD>õîä¦nQ 0Û›j½´„ìèÆ 4EÒCûã‰cÏêês l0¼n‡šŸíQl¿ÚáÚXYsß°y)Á#SfÙfЍ ÁªÚ7‰³¼óm6ÐNºØÕ²ÇÅ\<¬º1‘VO:뵂œÊÎHzu U&hx²RšèÈSfB^8YO’@ñuÅ­aªDÛ¥ ÆTh@-ŒÚ L Rƒ61¥…¦¨ê È]ÿÁ%IJk;÷î8J=ŽºÞ£ŠèÊ@ÀVÃ^‚m$Ú¡[xFmp¹«á 6Ó9‚Và À²ìa K€Á6ö ¶¤ldP$’u™`¯(€PßÁÚÖ·jƒlwb£@À,¥B¬Mî’>M‰!Ø›Ì%§•I™áC…"2¿=µZ­¬Œ}063¾oÆ7€H#`lIÞYá‘ ×Ô‰+Æ®xv Sçþ;Þy¥òw‚;„° Ù÷o pþü¥§y¬Î² Úq €87|Û4×ÈÛ3!«3íô;Éã­ÝEjÒ]ê8 °TOЭ½$=Åù„ PѵÒD/––¶ŽI@*KCIqW6@VP D© »1k3£)×)LLWgÖðòÆxÉ75¹üØ0»O†Ç×TÓÊ¡àâ¹DE&z$¶HóºjCuXGÐãd 0E÷Pº-LÍŒdTRÔ•°3ÓЄΠht‹€²‡¢Pt¢—4 ¥Röð‹¥Ì"µs»Lvš ö~ ‘™ˆJÒ‚Ëø!tÛ V(¬ÈØG8†!ÑF†bmƒ#Œ“å5Ó ÈÊ ø€¨… ÑÉo‘-DÆðב’À þËÁ5Ý›QØÁí׋[Dk uP@û;q…d0ÿ\|Ø÷ȱgÞÏf¢ÌbTŒÅ‹g {põÛ~™’ܶúU€…„©sB¡´+æ\ (G#Såx³Ììë8s?“v–õ‹4Sy[™¬ñ–Û¬,~gŸ§ÊhgÜR•¡Ò3߬5 ¯"€Õuz|7û³¬@½2KT ¨ °aF¤ûóŠ„Ð5eÀD–›"SÔŸÀ9KâäµÌpEàem± È)yêµ’ÅÙ¨6Ð6v0_WcÔ¬?guï»ç$"ûQê8†ÃV X’nÁôo=í(‡É°hƒ8l= +ÅG`jÑ$¹Ö@5&%,ªì“ì£ÿØ8u®<Œ\vRè#\ÓEd¤>kc(‰Ï|Û Ò¹°ŽÓLweX4fäÍëÚ@Ñ– P¸`Âx ,{LHcf&‘ÅšÈÄ:ŒÀZ‚!‹Ó€„¢0 Ìã-î°ëé“Ò8€?À7€ö §klõ~k“ ×)¤Ñ h¿2é#€3IС}’6—2Ê!¥é–œª¯rÐñ±0m‹õ¯D-Àv<ØË¡R œd`ª’‘›#?÷zW›ìø‘Zëcš«îÏ̱ ÷o… ‰õ¯ÅXY×Ý”Š¸˜@eßYZ€‹• ]ÝU’Þ) r@@¦#?ÙŽ}`?S$IÍôf5-¢ÌTÎÚÓ’uAgBNÑñ¶ËÐÓ õ‰œ•\õä›ÃSæ6Õ£-OõnŽ|]¶}ÊPßǦÞX@þÌRÔx§¸ª)ìN…d¬-8ïÊ@ÓÈ1Lch FÕq^Õ>4==AãšÄx5@ƒ»ÊXv©;!k.KMµYK©™6L)„‹&«Ö!<À¤Àà€Èf@†.'‚ ÆÖì \¥È`…® bÄ!AD”ýb0¼€bàOggSÀF&¸;×è9ÿŒÿŠÿyGIMKIXUQSÿ[HMWSa]ÿ˜ÿ—ÿ¢ÿÞÛíþ+-Á»ë­ú×fd¥YŽß3Ç"ØîØóø °ï' rŽz¿ŽÌ›…¤]逢½×tíkgì˜Øì[ÀB‚ïÚ 4¾Õõ"ƒï¯jµ©<°¡µë¬|HÙ`õ,‹²}óNŽu-wíeäÚÇú“YdŽ““TÌn…|µò„ãçúÿš‚`år@k½«âçN­7Ü¢{æÜ§·nÝ€7=R˜”d¹lä¢ëÚ@B ͨÉ~¯Š_ꉼTŸ_rˆ¸÷þ׌ñÅ?€š9/9Wrݵÿÿ$1•˜dº&•\»>s£!UÓ‘y_™S“ðÙ3Äk0ù60Àfdt÷Ð .=þfhh×$òî‹ÌxjÚ]n‘gÂç-RÆ==‡òX¿ÿ>­º›Èä@“R*ùúv'€…ÂKû>ÌŒ&€LcôÆ ãÐ'fÈI2|VLc˜ÄäM_#Ú)[ÀDXq8ãk•ÀB7à:(ëŸ@vò ÌÝgzM@~½M~dÕÒ E¸~˜§D?¼ÞûX4Ù™~ziö `\@Ë…È‘oÛµmUƒâI$>ü6bµ¹·œà“¶Ï³ZÃè×i;,ºaÅxÉŽ;ŸE;Úd¬¯¹4›šóÑç©äÒY¥/‡WI‚À3Õ9wÆ,ñq{µYŸ² ê{®Q›— kö kVÖÆ\®z׊8À4ÆSyç/SÓSTSûô¶§¶ÞôbŽ|ÞTTT½ríÛ™Iü¤ô!L@Äu43fíMw2'‹«*é!g»†|¢'Òœv&×t¬ÈÎ*&ÌÛ³r0ËP?Îû¹„nòÆÃ^Æ3Ô0/›ÎÌÎ>Ÿ}~­9?‹&¡›ÌV¨©™°[MÂrÌŒ©¹ÒÝ“3°ƒ=ÚÐE”‚Μ«y ¡[â¹*y’n þþsÝ;>Øz¬Â;WëÛ§$¤T ;«ÁÄ„0WmnIÐ$8ÿP¿Öºì3Ô&Ú%ðOˆeOÄ®€¯[¾vVÔšµV—b™ ²Ì»›bˆkØJB]£¶­~µÑ‘דö“âïf·jì³jNl–êú;ižø´ÖÑ;i”{úe¦ýì`öÚIÚQÓ( ð44^õÖl£j€½*$’™Õš'"HkCYö[+8@ׯ%"˜µÊêê3ÑÔÒô9•ÁCÍb¤rW ù}«\y`PG=x0„¬Ü·ŒxHž¡'Áµºš©™•*”‚kkÓl ì˜èl"Žrx+² à-;®µG,•dBt7^Vªï‹¤¡¡¯Å5ûЩ³¼Ê´Jjke°îÏ—-Üï„L÷V6½XE‹\V®6É.†ô CBOF75솆zÁÍ]Ðí¤S I0#«0, í„^G‹ ¡¡™61ˆ»x<©æ;QTYè@j 0ìó¬ ’Ð^?0Äv…O ÕëÙöz‘דÚÖÇ'µGF°5µ·Ú‰½Nœ¶ )k–kÜh¯›:=[Wþ˜"ÑMßÍ\Pn@`n€oÜr‘××ëC';ì%¯B_¼s|råiffVÛï}ŒªíQ¬ÆªSWËgny­soû‡L&¤*г]oêYí€Eõˆ‚¤FÅ7&W±-^µÔÓìs Ãð„åôã€*]ÞxûšM—Œ”åîºØœþÚÆßk\Ÿ‰îž¥û˜ÎóÏ WÄnÛ·ü |/¤ruß ›\pº^.x-À/n8íàP¤O_¼è±îkN?ï±Äª˜Žä9gíëhä½ >Œq”˜ïË•ðrêã,å(Ã-àó lV‹>¦ºëV¯]á]Cðþç^úÖùòe< \Šrü_?X)ê;fɾ*ŸËbå;Ú&~ÓŒ+<'Pÿ]ÿ—7•‘<àO`ùÌr‘oP÷*bLêV{=àš…[ŠòþÁMî[Éòj c n!º·X)êe¯.Õ{)Èiü¾ýiúïÞO¥ÏkÜ Ý¾‹i^/ÒlQ¥cŒQóv¬¾aäzebeAÁ•ÜvY3¢wM~½÷Z8uÿ·_m—*j•ó­KŠeWj™ç·v±G]­ ‚ j—Vµªº8Y&+ j,…1¶FA Žè:ÌR±þ(‡_É-ÈFú›&éðÞ–à?ÛìXõß‘c¿sF®{Ü’.ư:•ËU´Z­hQŒå®íšÂÁj‡’ÃÄ‘+e%56oÜnñ ¨?è8ûß/¿±QBÛî3•³È! bjüpGw¼¸5.j=m‡™-crEªŠÖ ±Ö«%+Öž¢=µV‡8‹AÉ1É2Vþbñ+îrë5æ× FiÌÞZ®–àÌRÀõpòjqÉ<Ç.òå»~{ìi¬'Àu.~Z3³hÍ„pÅØR†}IùµFÖîsºýû'1õ¿³ë¶óN1rȪ˜#Áéúë‹æÈã œù*¬ËÞÚún¯1¹ð²À2Ùt™¿Uˆf½Îê-““J䢚h¤uöóvi0š±‰*–N¦Q+)D´x& LãÀ ®ª½j"éAT „UÕ¦ˆ6õÒšÅb;—'«ä¶±, €tPQÐ €B… Z%,tâÁ÷ÍŒJm”lK[¬Ñ ¼Ä ¢±e¦8ÈAL& @Ð @::@Œ¦Z&pa3K¬^3(Ùð¢qa©4ئCL`À@¥ÓX!„Mòjt^Œ »Šy5œ€0%ÀoQ À¿O¬~ÁƒU»«¡W¦¶K¿ˆ{†€­(€w¼aVj¨—æÚŠÅ{ÉÞ.9X³2î0pÏF•OvEˆY®©cwï‹`3=û;Ä–á§žyæ„×nùü !-œó(+fžžúöרIÓ†E_ŠˆÁxzptoµÞòùÀù©Só/õÕ9¥=±U×\\ l .C_Ì~í^Óä•çC£Ú^ÃøE3Òáþp÷>ÀV`álðêçƒ]ZQÌò¹óC¿Hå®»ûü­½·ÜE©F¿Øê£D¤ ®«ŠÕ©0FÈò[£‡!ËeÃünA®S[¥‚†sY15hÝi¾>>D’3üüòÝú©¥,eURQAMÈ´R=H,³èÔil³Z‹„&¶ *ÔE_”­#•Šˆ1¹®Xº­4 []ÓÎP Ÿk¥¬†rŽº×o|÷®Ç°šK˜~;úGû$~~}þ’û¤Èåúæúzø¸_gµIíB_9ôíù„•èyî—âÛ{ÄqÛÇÑ«Ú2Úú)¿n¶ÎÔátÿ«1›äzq0à, Z{­°#ØÎ{ÿñú‘½[ͬ½m¹þ÷¥(Tý~øp÷t1ãºÔïŒÅFó“”Å,òv šç'/óµgõ\üŒÌJ–™(?¿Ôã¸ÿ–øÈþÊGo-&]ÚÊ . ¥[L¡†À/}~ÙÚE;vfë…þÍN„¸{}$‰Ÿíh­©µjÒ”µB÷è&q0™Çéì¦O×÷ÓûuÛžîæ6*BF“'4nœùÿËí~@˜—­gQÆÚý½ `Ä¥|¾oTÞo~w㧤kÇ•jj¥ëõPø–;î8_%èT^¤Œ!›ç½‹æ(‰Ñþ8eD²oбU¡ëw6]fOO?nWæîý=t± å¨Ú·n¹öÇt d!p<8²ý)ÏäûÌïRÿb¦ï î© f᪅(¬­ßeÞÅPKœÜTUÑ$pâS[€f:ɤ<¬îïôàïtœŒShª ÃM‹®ŽÔó±Í>£âðÒ+…³ I©É8Ýï UEõND¡m¦.§ÿkà*ÌÊ…N¦kè©ãü>`Îî æíþŸ»ñÙÎUö§§rðž"×î.:'OvêCº…å÷³\:â$ØæAˆVc KõÕJÙë*'T@FÔ ¾Ô]AZB+…^„%,äuÔrptá¥ãì͸@¬6‚hàà;LÞÎ'Lù6Æh[_«™Ò53#D$Â=H^¦o—G»ñë›ï~4pÛ~íÍ{K/žúïM¯˜ÁöÚÏòÛ_ÁÔh'Ï7Ê}°î½ÊöG)SLO={±tÑ8Z²ü~ í€æ$t¹žm3-gB'f'rѳÖ1s)¨½Owy¹÷ü(ÈÉ(kº²ez¼‡œjn÷p€o™Ò9K»vœý©)XÆþ©H1Pî õY™Îf–ÊRÏX‡¹Â%7w²*/|‘(ò<ùvÕÔMxWÂÚ•÷“Bn¦£w“*.“4Yy'5¤pZm¦¢Nï‚‘½všž@VL è ©Öà[]ÇT®™úÌÍyÉšmâ™D³â…g2N»sMJ÷T§okÀxtYKgOõÌšÐÝiñò¡¢ÌST¥)z6z3÷šl«JÛœë/‡MâX66žÞ…Õ&Ö"Ø *À–5u¶­XŒW£66Ý´v^nK”«#a" þˆž¥{7^$³ŠÂ@ÞûÝœà2Û-` àðîSë½>öxqï=ÿû¾âÞL\üx/0/À½vxomÛZ$èO6q4´ay\ÇŸµ°É^°ûY¯WšÏçê˜Ö­uZJ›s¤¨Øá=ê„wz²ÔFfØÛ£IÏ>)ùÝæŽâN\Líï² Þ{€áÝûK)kèTÕŇc<,«ñy"¹ÙÖµ™(Ö]pÞÜ7³áMÇ äLuOW’÷vvfOô×Å“BË¥ºwC”÷dwÆaãŠwúõØD.bÉ’¢r¸ÊF¬Ð×mj–àc¯píêÅœÖ1“QÁ:@¬‰éÂÝ.¦yÞ¹¥)€žY €YkÚjg»!^{™‚¸²³¹`rš»m¡•2§`:ý“e©èÊ™ŽÇYQÓ Jfy­ S!- j,@ÈYçj+†IgH9ªš‚¸E¤ˆu'ËjÛÆ6jn´ÊBÆ\‹Q)n`0 ²³ËU„ÐS@©c›¨áadE +FQî±dMd€ ÔN iþûåž $ ËM`Íâo&M#V®kb¾¹œõ € ¶é;Ú1Úh3«É(ET‘$y® öy»ž¸âVÝtbóÒ‚°ý¹­Û¨ªÑ8ÇrÛËÁ_T„©^¥´)³òãÝ´‘!¡kòt¡K×:ÔvznR~Iôµ4㼬ZF-~¯u›y()ážÙ³óÓÒßõ,Ý×Iò޼DÇž>;7†<—Ù0mrÆçð6[øÞ¦Ú4€û»›÷to¥{…ûÌâÊÏÛÌBñÜe¨ÞÎ S™]ªÏ)™ÓM2 {èGaèÐ4ˆ¸s ‘Á¡<%KIO•Ĺ.”fhOggSr&¹c;ÔãÿŠÿ}ÿƒÿwÿpÿ{ÿÿ“YQe`LG]WSDY¨ÍâEC“yg¼lÒÙ–Mæ"«kO[g§árqâIöP3ë…ýfµ3®>TŠ,â¡i`œÇ 9P‹gÉJ0G´ŸO}ƹ"7¦…B÷ndY2ˆX°&@B8¥ŒÙ’![^Û8Ë”‰iˆ(Jƒ€¨zI$D”Á€,Ý‹Š2nÐ(¡~ËÝAò½ÝÉií"ð¶oæPdïoá®éÓ|È/¼˜­Ñ‘éhGX”¢BÄ$@†Þ»+Ï4.Âwhµ.j̦Æ^ æè"î|kæ’ýq*÷纋m7¥Û9­bäÛ³ÄT¬yçÊÚÃIÔu QQîQzæ-¡òGbóÂgá@ey†«WO¯zÚúÜ5×usyäÐ,Ë/:p¾8pž%zÈ“ÿB9ñI:1µowÖÏ}6?è\=S]jÞ Š½ÿ>»’û™T¬«cæVǼMeÜSŸvBnê¸SÆ—W½P°œ‘Æ'-y i¢ò,K«s–n.óÛŽ»0ëÇí·ÿ~c;o°Œé7&‹T)YHAºª§š¥“¾…“qƒ¿•Mª~FM7*¥VSmIEšìH²‰3÷¸ ¹:k¥Uà…bÿÇV€Ÿ>†:›¦E LgÏÐC1OcÔGšB)x„@À ¡Àcσ9BÙenõíX€>@Å1ˆWÀý Ður¾«ír›YÁˆ¤lz»#»åÔ>äQÆëM®Ã‰‘d×zÇ+Ö¡Ç^FüéßÛÌ9Zß¶ 5J²H䀌îج¼Û˜ÓHßIiŽQõýrjiÌ÷›3ÉùR1õý{ɰj|êÔ»£”S^ž×$ômV: á“~ð@)Õ¤ê¢+ šúiI À÷l0!“¯YŸWI½™ ÏlF»á0sB•àá¾î껯âßUÍæäú䆷)œÔ'†oºJd­³ê±”ÕŒ"‘²I´Ñ¥Ræ6¯ŠÎQ Ä£5˜§îr‘0]¿Q¦ê‚ ”jo f>ûíßö“Žõ½c%y_ÃT ŠÛLÕ©”¿,IÕ%±žÚÒ>n—öï(G.Y"¨™'1h°gÊê!òãÑÇ”riš=‹éÅ@•ŸW€…(ÒÍ¿øÄµìº:Uµ›¸Wí™4=`J­yšÊª2Ó¾è[zˆ© 鸣0"ûtÚ³V¯IFÐÕk5CH&¨A¦£VN±=Çc¨Ò0D˜ ¯ úüœŽön‹_šÕyè|ì¿ÌTà÷œë)Æœ%–SâÁ#aͨ¥âOÙÄôîM6¯pð†Æ€¥f€‚ñ ¥"œ®‹éžÆA Á*·ã#p€À4õ´gÙÑÞ~ûˆ/^óà‹vw÷ž€‹µú64¤²0&âÑ$Dߎñ‚ 9Œ)tl`.kzÎâó^Èe”|Ë„‰“ RÏ3/ ®¶¡P•ÕêóŒ¬8\AÔWä¹ê…¡bÃ3Û¯þ{Ö8—«'Ë-gšÀÃL²0oc½çÍèÃs^rŸÇ yHˆH6¾Ît é@„ÜØPüÅ Ãø~‚“ÞŠmè’ÙHXî„¶i11ø`¥œ·Ú§}-vžº )éݯO»@¯nGì£ëÍ¢¡ u%K6寊ÇÑ÷¦{ð&éõ"Ò¬÷‰À(`E||å‹mæÓ²«öÕ…žò#Uñ¥F9Ù½“Óšƒ,·Çj¼cHøŠg:!Yõ”ÎQÛ>Bræ1±?;îž§¿ko –û†Dàð;›3|«ÛôpSÎcMeÉœxö·Î&©*ªÞôLtžãñjú¡4šï´uu‚-Çî|¡oz™SÓίl†¸ª;ôÁ™©$«ÂîȈeY''bã}£"•PÃRGx–UvJÝ¥*?'3 d_.LuÄÞ,V;=ª„®Îô8P°ºÌ`'€ßDe¹š4ÞóBÏ}I8ò¡.q¯hz”š‚¸M»³a(§=A7=|ì¹ðÜ:¯ a@€Xá´ûô÷ð5@€â ’ç~ŠíÜ’^ dË`•;—tøÔÔ-Ѱ†÷…ø@µ rÕ¬>k5™mhHŠÙ %I@Æé“dF±ö…®%Á'6`÷¡€Í¸u°›læV÷ÞŽoÛÝ}GÖà¼mnCÓ_fòÖý-êþ´Ž§óã@®*ã9³Ü•×laÑšMßô¬ˆM’K5|NŸÔ€ÍeÀñì^5ñ|J7 Eåá1_ƒ o§:ß“'›á¬Mw›§ù9Ö°tS€-ùØÝòÝôìó€Ïfè˜xlÞ?g®÷$0PQ]] zì~!§h” š/Õ¥ZiQI5õV]îÆëŽÙY£ÍJ\$äÐ…šˆÚ™óyúøâó;¿>>.Ù3“…Ï@B·)¢É¬xÒydn”©;‡\s9ÆB† .‘¨0jõa¬@Œú-2åöÖ–­’i²È¬ÚŠßy€UožNb©HÕÝØ`¨’à Â6è.ÂàN7¹ $(^ŠêÒôöI¤å&~›hP¤†?À;ï³OÚ!O'à®`^xâzàoÿ—çfÃz!°ãÿú‡Sh¨U2;¶3Hàáô‘6ÂqÕ¨I!-SËä²jüyGÆ™sÛ…•Læµ tÓ%z^A$rvÚþ²äšÕc?îŸû~Wº»Ñ8—ˆy™Hë²gCp ¿bm꥟WãR¦ Ä¯yÿУ£ò;ÕR„KLÒeJèwž©µ *}ý|r…žÿ]ôó^ò²1)ñL1=—ˆ€%N‡ûª •à‰u®ºäñÄl››ËNGÎWL [Àš™CæìºE‘•.k*¨R¿ sr"HínQßé¤Tc%£;» É7è'#ìOoׯäíg£ª²îŸ,q²*)J®NNž,ˆÈñ·ÐMj&sŠ5t£þ‰{:3;Ã,x5^€¬, " “ÔD¦è­µ  *=px¢VY„ñš‰`~@Aý“¿]IT˜€0öxÅÁÚkk$DnQðk€?ÀkÅÃ*qT73Íù°âÃø)s·k#5€Æ^»·ÖLMÕu/ÀEˆ„ g.\¾ß2ó"›ò2huo¼ˆ:3øÓ.Uí¤v¦ßÛ‡YgnŸA€¢ àñ¸y\ñùnë 4ðý;ÞãÎõë6·~CÃ)£M’3°cýÐþ»ûWuO˜¦¹®®fj@!*²2Òû8Iè"g`X)/Ý»ÿ í¢>¿èã@g΢‰x|ÞsäNK0ACSù˜ª,¸½§ÈÉ´²ÏLžj™ ¯¸¯x).ª7Z¾Æ$ó6Ù¹m¤Ë«R»GM.¥(“×SSÿÕ>L&…'™R’™ê ™8“ËÖ øœ"‡#Á—6{dAU4êÉR“”¸ŽÀY®ÊªN D€KU@ŒÝÚªõmHë†ÆTO­Õ혡“CŽEâƒ|÷AŽ‹Ö Xñ)NïìP“Ãî…ÌXô&¢³¤ˆzPâXÖgàA€BÙAWPP@‡ $œbm´3›¿KéѶª «€wï|KëÓg ú±ˆš°ãkyÇj?ïRŸ0’4-ó=^ouo¥×¾.‚ Úÿ$_$v>¯¯˜(Ð"¦Ø%•º®ÖúZïY' ÔZ~ÓŠdwK…8©·qs‹ëÏJ)·ˆ@ b’n*ŠRëõ¸¬~ÿÇ ÞDMRósyžó:0^ÑôŸÈ°²©(ø€ØÎú»0à7GÄvé™q4.¸Æ«UJ–LîçÆÞ°Ta @ãkP6%LËw¿÷åþÌÕ†G鯧¤3„OígNç òŠL€ËÂÉV¢mÔfec±¬ß„³×^m´yƒ¼!l?ÀVÄB ®ÆØh˜¿ª–¾xí—[s<À¢ÈK‚«Ãk¯™2n°V¶N[¥ª†•BÛJZ_EÑJá!Šf¬VEµHhZ|óŸDµhP¼JØZöcÙY‰‚`Êù ®" HÍno«-· –°[æÊ '’&™J”õ¿©Ù²j5çiuMŒ¢SX«@ª‹b•’)ô‚È¡/ ±x .Œ  ÜBf ²ö¥$PR !«œ6S°®Ã1Í}ïèòOc§Zª…E˜,áLÐTpÑÐ ‘#Y-òB¡ì§ÍX|.uÊE5N ¹•rfk£jö[ヒ­0ú2€}]¯÷ßÅiÚî[JUºŽ¤¨åH5ТT(ƒhJ‹¨¶jVYëL°¨à1¢‘ª¦Z°Uc­ˆvÚÓã ìba›eò@ßRÿÅfÌî L÷ôš‰ˆ [9׈ }&U 5®eì•5öÙ†$}–s¶Îx0,­U FôVU ª©1Z¶À¢‹#ÇB¡$¸nC¤ :ª%¸ÎŽzhO»E@î¤ ‹:ÚÀM¦¹Ûk2M¶2ò-ëDBNFF2ÀÚsÆ!3ó‘jÏb ‘BÌÌ)Ì ×K 2óñaßߤ¶ZÍýò®ó½IÔ´i:ñ[¸vå"•¦ŒñŠÐ¥%û<ÇP” â  °íÆ*YóÕÄÕ‘¼`^v«mˆûzìL£@|u/ëAHc$J­aÆR ]c./΢„Ftë¶^+ʉ E¬,Fd²iš& ÍzBœ0µn %º"®”ˆ¨mj”®Ø5ªˆ €P;Žà Dš)õX‰"žoXL ™Z•pQ@¢,üE3†2l².‚ˆb¢ )¶•6 èQ+PD€Lú@ŠÁØ€FƒV„ò Tê“u1Ö¡Û@> >Í»ïxBÊMœ3iQŸŸA}ÎÒÚ[Ê>)±A4Z…vh |Ùël@O T€Ii/ÞËí¸æˆ‡,Ã_œ¤‡ÆCyˆ)"í}px$ÈÑj•8ŠÈ©î™LÞ1Q© b6Ý,¡œûúˆÜî½LÖ"êO[™À %Hð"MfyºØ…ç¶nI.¶ {&è9¶lŒIÿ/Óé½ì/cã4M¹ö9õõÄ=©\é8­Bðd…‰õÕBª4“gÞ{¼)(wUÖ d:9I˜Ó#‹^-@Xâk9åH°d‚ç29š=àMý<^Ô±Ž*µ´AB¯ zø>ŠdH¬3M„€(]hÊÅ=bLA‡T–#¢ŒL↌ª’ƒ,Aˆ•eæ$iˆâî K®€ÓJ1m¥44¬ k"CY6WVƒàfiÍ7z#3”"kar «û%KRí ¥Ðì`°”±¬maÀ5 KiDDѪºÖVCzЀ­¢@åXØjJÖ 4 @™ÔÒŠŽ ¬ÅDíËd ²—6 ˆÒ PhЂÂU€Úˆ¢`bØ€‹è´ˆ˜– ¹j›1ź!¦¡‚ €¬TḚ# ZPþàC± PZ7@à_U ~Û­ ¤bÑá"Þ‚ÿ5¡i,zYqqï“TëÑ^á;Û}˾1vl9ÞòÌèÁ{Gµnl|^EAÑÊ©p÷pÎ@?^(ĸñ@LJ/zNìûþBf1!2À¶Æ.;Y·TìSH`gõƒ‰ëŽAÏîV×òûU•·ÏN~¦¥[&—K{s%g¤Ö/ ×5ؘ• {ô>7Ç]…R²š–ÒzŒ¸ªÑwjðàaÃîu/‡  D–¡€Ñ&бýH²ÁõñJ=ZrLž# $‹æÀ0†( uvR!ˆˆ­²@†NÔÓ9m§#*Щ3zŒh… PjgÕúHf€#m*ªëªIkf ‡T 72š€ˆ*€ë¹ä’_±RlÍíM‡Rm aF—C\ P€&ë à´6`-%¶³! lÈ0Rض¬U ì ÍYÇX td”ÉX9 †’—¶ÀZ©‚x1ªƒŠˆÀh0 ƒ‚)θ*`, KØÀ ÙÖF0 QÀ€X!<(+¸Ö~–ƒ®6€nê€~Ë]¡‹Z¢­VdÀy»Ù™yéÃêLG÷ ŸQhzýñø‡­èIÊyût’óixå1‡60ž-÷&Zœ€^Þl‰6ΘÀ[ŒÉ `Ú¤p1à°€3ràÈŸ±Üò97b¦3ÇK÷F‚ý݈„i]aÆÜF^Ê¢S^‘€q)6L2Wˆ1øDFñ±àìëí <@˜kØz t•d<¬ ³ç Û¹(ð¢sØÍ X;?Ýz€,iä˜`›ÙÚS*€vŽ às\°œGñ&  ˆY»ï[XâúTð*(­ÑѲ;q*”…òö ­åzdT_ésã ±h€ä&/±Åmi¨wQDº¾cçsÓ#6¾m‡jÄ' *€kQ¯-ÓMÐU- «0À3i±n€'¦ HV(e¥¬Ú,!@mHcÀ`‡Š€¢¬„RjŠX« Ñ–©}j£¥ Ê-ÔXÖ>°uÓÓ?¨@µ‚MYj(jADm@Q#1À6¢°XÀ€îRP‹AtZR¡š!KD Ñ .lù*€:N5 ¶cAâ³1 G>ËÉ•„¬WUÝ\ìˆ ó²«UU'jå¢2­ìò³ßZ- Ös3 OLOë ë Py’n0 ì$O§d|P`׿á´`‰víÀ @$bê–ü¢5ŸŸ±%ŽrT“Xü$]. bµ2;êJêãÙêÜìô.gÕó]ëc'&y lXá„|<~­¡hgZ¬Mk -‚i…l@Õ;½5ã{È‹±Ó|‘¡ ÿ^o¿ÀÊw{†L¶9x#’AK¿ÑÞ© `}s* ô–kÄ"  ¶EQð„˜=¼Þvu5ú ÃÞe<yñï I‚ЬÎâè58 Ãñï£È5$h¥£Vÿ¨ÿd•ÚÌÏ«ÙcYˆ—B@5ÂØæ6æM˜0ט@Xϼ-ˆP <¥&AÆT" ò.{%c"À bJjÝÝ `{ $Öm§*€"–† hTQ¬À4E,l°T€k!ÊĨ5Û*Ši¢‚¡t €X ÈZ X±2"&¢Œ1÷«¦S ˆf¥ °xEd@Ñi¬`«ˆÀZ±…•Æ÷Õn@€€Ðt‰P@dþÊP VÑ¥—K¯©ÙD”` —N}€å´ïø4½ <= xL+="X‘z½ðÇQú7,pëfxY€8 ß„ç¶ÌÏ0Hˆ;¶ñ$ @ëô!H@x$ Y÷éÊÀ?O|n~y”µ]´¤)nh„*Sœò¡9=zÞð@pü:l3´ìwèÞx€œðlB ô9dJ†Bëüö™@ €~r1¸wÁ5'. ˆoüoJÀP$f4iRõ¹¥Û{À¢šBåTAÎ,,€šŠ‚Ç’]ô †OîõMÄuÍ÷ή·Cu›$ÙïÈJZn5r¡Ö-Óä²²ì©"ˆŒÄÆ©iÄ[4€ãeÍ_Ïù°"Ò¿^’“ŒP€®“phÊa|ìÆt@K—½oaŸIG›î8$P´x¥ÍÒ íA ±1 —ˆ2è0£(µ ÕÚ1Zª¢Y`ãh·Ö‹¸@€JÍÑ¢2ÚèÒ‚€©a« b€cè,ÀÂÊbi¢"šIž@x†à[!`Pu*ÔkW0ð* j]Edt€`À¢1)­Â B€ ô>Û]@‹P£u\à´æfÖ‚DpéäR Þày¿}ù1Àýô™¼Ú÷©Ý£É턵mïÚè@î`Ûl r¢ Úí€ãäµ@pÏGzÚ™nÀ¹lÉFd¾®Iž–€ø-•£”—€ ˜a(»íB.íCŒ’Q@^¯ZàC:SOÉenÕÒ5¨wOÈrþÀ6&“+u–ÂÙ È`à¦=CÂ[ÆG <ä³XBšÈéÿ1Ë Y"Çë…ú@È“Õñù¥é¡MÌ€æìAFi•ª•Ö™…·W»¬‰À‚·Ì_þþøÃÆØ3ÅõÅ‚j.4Nƒt÷k8• ^2·ÍÂ@ Áç©a@ö?RÀžS`NE©\Þ5)@ËÆJ ÐÁRôòK+ÉM€‰@AÊÒ€ÀµÁcœL™ì€.)Õ^éR(ÃK@UÌ¥@“0"º xðÑ £¬Õˆ­Ù¨XPØbõX„œWh 0ꀽҦÕ< ˜P ue±š0‡õƒêˆ*@-O@ÈY¿…À5À¢™w-€Ö±@òB£µ×hÑb±‘5khðŠ ` ¨PHz ÀàÏ(( >Û]à—ά.䂈æÛl—=Ò¬˜„ßàAXå‰zÄâ@e~2À¸)€ ¯mù-€ €Z剜€ð°°í\« <Ü$í|‰‘Ó/À´y¾ äÛØ/lé¤8  .#ÁI9xä8,OàÛOF ª*èмO5% ˜¸*#9æø¡Œ3¼ÆœÕgµ‹ @ÖÓñFÁ™œ°*¹Ôß<5ÇùÄTA,À @ð&ã“ã¦ãy€ÏI±@Åê ‰~+jc ˆw÷5³­]3wã÷6¹üsníË^»0“AÔB3)ŒlÓíæáª¹-upä´U±Hš´Ñ Ö™ÚË2Ws„ñºœcÅ€, ¨°¢F`M©S5ÀÔŠšaC È ÝOWÇÊb4^dáa[XBáÀ jjÖJ‹âE Q)ñ¢C …@k!Y¦Ý*_¿)j@«`SŽFœÔ®ÀZ… %SÐÀ“ÝX®S¨K€b݆¬jÕ0U@RÔ#:&b]LTc-F§RðÅ€YTU °Ö‚P@­¯@²K•5 XÍ @i]€Å2 OggS@®&»hh„ÿêÿóHFFGIHHTYb``cabÿéÿïÿûÿÿ>»]ÁM†jQeyP›äi˜ÖYuêqÿ€·KŠ Œ“°Ö½À PdӔ㰦ÂCÖ<@À³ä5縻ç»hž€Ù&»¸r×!e ˆ È$³¬ÐÏ. wnÖai{(Ž¥§àÁKä@ƒMŠ\›™¬ç&Þ\+z¾¸-*@¦œs¢šî”+„âãËcÎð÷4ÚB‚ùÌú| ½õÄrêðuÏ4V€% ƒE­™‚0^©‡‡žðtÕL²ñüA÷=[‡ØÜb®5V¥›Ô@ëʇÆôHø6»òtE»Åñ‹÷z4 +ûŒÚVês2œ”غŒ_ нbMù 44”B‹õ,Ø·¾•ÿnª&  €dµÅ£!ߎÉñU‰¸l=Œò=\O¶Ž@”ޱXlÖwd4 )­uk¡€/õP èêšíÚ€ië°¢`$äw(˜fX‹`mFUdl‚ˆ¢ÆØe¨®GFDT†ŒP `j4€¬5.Æ-X€a%ÎÍz~@î\&Ä 8Öc+-ÊuhÈ«¸¹Ì!ëñ’hVÝ FáþÞýáçù"Âc@Sƒ{$CÀþ®1Ìf€™eyëg‰î8á™xkµÇä¹V8$`O÷«úS‚É™ï©å)sO=9g¤fDl@?Àþý¦µŽ3ôtzUæPK·P4J¸ÌÍùMÏér€JìØNºL–Ì0ž@>§‘4µÎι›sRU]Yq(D½4úôõkçɹKì4«RJ) zû(ÚßÚdš½ç/%@ P˜t|;T†k•Ê… ¨«ª¢ª!@ƒ‚ä 56s÷Š·¿É&¦¿¼õS¡%êÿ¢Î –ˆ í^Ðñ¥ttpÄYµ3—X³\«Š¢¬@IE»»»AµÇz_ÛåŽFÄÔçß3°irˆ0p’_@Ë£mš ×eV€ÐuϽNî²!@än‘;!•‰¾ÓüröªÝ@f©pÖmOs\viÖ©àßqN½ü®»€E* äibÝÞ”gj}µˆº~k²Al¤¥Ð ÏBŽUäzñdÅå8³X݃áà b\ @é€] ¼áY‘Qû$W0Î:òJi>cÕªNÞ!1q¬æ:GàufjŠF@‹pÄj© L¸vílÀ°U…‡»£³óýØi)+Ëjs eF‘ô«UY¬ÐÄK—â¥ã"aºTQ°,¯ +;ìj¹ *BvÁ_“h“´TDö?@ns Àu øv‰æŽúåºÛÊï§_/E}xHåõzØ~úr›>ÿzáægÒÇ—Ã…#çüþ×)KgD¹­.)Ͻk~‰¬\—÷{¡Ò._?~÷ž—Ÿ ì†UqBä.Þ-™7¶ ˆ¼¶ ·môCÂnY=±l¶¦—LçNÛžäCñY¬ö,úúá3Mzš—¶+›zpÉUÎF)+yüÜ~>ûQG”¹¡&/ÿ§¯šò!…À×ý‚|^Äô†mRÔPB¸¿c;8b£Äpx/@nÙ…@ÉèÙPÉç‡õnÿ«ñÃåzûN^/åÓt?þEù ¾ýðüæ`Ñevñ´«Ob³ò(u ×dŒ~ß-û Ÿ„*^×" ¬N ±Ç‚‰ˆÙÝÚ(í½¹„ïµírit-×$ÀÔļ¼v[C½•õ[çís®tqÆ;rÙòCÓÍå»ñ¨§å.³<á]Á±_ú2x5gy–Èd@{.pƒîwß®] o Üjq€0wk#1$ _€¶4J\ÐFHìÏ×2×ü8Íb{{÷«t¾í&÷¯ûññøÿ¶m–÷ÑÅñžÃõëøq)ùhº®»¼ÔÕòÓŽ½$"TË·Å¿¾n~ÌN™U ÀÎ0·V£ØÑˆ0œÜ°pj züøç3vÂ%y‹·ï.‹¯“²—×ÏB¹ÿµ^^·¯—ýý.ÑUaüòÇ›f”·Ão•ü˵:äxÒ…|.óßâ빬ª[yÝ šº•P‚ AŹù´Ë¨†ŒƒN–µŠÚü˜¼¿ÿ~¼ÖǾ¬3_£çß ˆ­Á©–xí{žo>[}mˆLÕB¶KÀ¹|Bˆ.™‡»B¼ûw{ÖüðúÒ=×­Ö ]ï÷¸±½[FµÍeZrq¦5ãu€NŠýQO&Ö‰øé s'ô×JYõ¢¯ÇxçDÆ•uñîb^RÜE-šÂ}*±ï¿—+É÷Ó9¨ tPÝŽÒìn&ïéI{Ûgäðµoûùøûzjw´.ùµ›9dssûÙFïNµJé:žÿ^¼ð+±}îùùó-º»÷ðDѲ¦.ãåÏß?ž zÊ}ýÂ}q€ÖþìVeöjª˜€ Hp/ß¹?‹"8}š¤¡>÷©!eÓSÛLûï{’Éôç&‹xŒŠ<E€²nCe2QÞ⪟Ë“ÙÝ´Âþ6Ví~׋ž*Šä¦wŒùœ*½Ü7ô^‡b*€hf®_C„ŸšÕoOùôÎ[®œ€¸ü¾-ˆHœHŠЋh> =6P`P5@œWBb@ØÖ°€ !un0 e*ìØh m,€n ÆH~ NNÓzÍç¾(,X F}ÏN¶ý?C”” —|•Vþ»€Ò BÎ&‡>s·ÑH@Dkió‡ÌßlEŒ¸4—‘‘ûäÛìOïŸàìRè[?àj´ðÿip5fžœáɧ3Ifs_‘m•ªÉR¤¨CÒnÇñµÙöŸ_ƒÿ{Hƒ µ›߯ð#×÷êÙû–ôe_²Ý7Ä5uã2ƒÏþÿºnÕƒ'î~{kë~¥×iyaŒµm/F|moÕ-S¥òë¡íšÄf¢Ûq:‚ö Ãg8¥DΧi`K2«¿GÒ™Õç”éK/Ô44U:û4µV‘I2CS‹¯ø+\8æJÊù÷ö÷>Ι ™í×ç@vÐD‘wQÍCù÷÷dEõþYó¥”MÓŸÿê2ý¬-'¡»ûi¨“y(€Îí77™4žyóG¦S¶×ë9bžy=nP€¦t˜sSÅ@äšËìîP=;Àší÷~™Œ˜½R.Ào³m^b»îõ%ÓÏØ‰{0|\À°ÏŸB‚7%¦ÑŽà’0¾>ìÈ0ì†h—š#àÇ’LÌ‹[ °00¿„¡‰‚Á>¥b‰&k)äXÙ@ˆÄe.¶e¶Ò¨ ‚ª2m\~Òe!Ï'nùóãÇD~Q¨„§ÀÏ ¾Úõ@ÀJ‹°È è3ökœ†ð«€-Í€OñVÇ-¤Ë¯íËΣ7,îZµšgð<õ<•€tÝ»^ž7’¤›ÔŸCÅ’‘혹üÎÜsû×ÑäÏ `p= sÿK?™[Ü—¯N꩹Ñ}ÛèVwEH·ÏTÁÐ÷ÔdNE}÷y'÷ó¼’€-ÇàPj—¥ “ÏËÅCF2B“ùÊGuËàC¦D€®|<³gnîÙI3ÀŽjü”_·[.qÃ|ž_Ú -ƒ±p0º, Y%Xó aŒnHI€  =Ø_Q÷ …MýßÇtR{Éß «ÈÊÉ(äŦ†al°ç2 Ïkæ¯ÓL^ÞªM‚È:9 kÎÍz#Áck­ùð>ê_X &5ÚÀ¹ø«¸€ëá÷Ýϱé‡÷"k­nýª< ® îïKÏÕ[ôïßœÛñÎëÖ‡ È m¦ ¥×†“ó.Ïæ¥x(ߦm Ýfn#<2š¼X—€ÞFþr4u€@Ð!{â;v§8½J§ÛU}&¼|•¿÷öENe=¶m•G·„а5Q9=\=ù³~@ËEV¿^¶×„U‹GÏwßv°úy“n(ü2%obF·W¶~ð“oùapÅ_¹‡­Lógýyö»~¤{yxIx99;O&ä'¯¢ Ct¾×ù›æÎr1Ä¢À§¯/j\ï_|ÛçŠÉg)È~c 6??‚-èÉd^ÚÉ »¿.²e})wHiø=I`(ÏPUugpu^7šì>@'ÈŠèò†^ÞëB»º•À Lv??ÌqÅ/9lCÐ ôÐðòž¬ÑOºÞé;"‡Zƒ$ß{m¤:ô@q5¾Í±° cìâæçÖ;€M| ˆç´…þM‚Élt4 @l‹µ>õV”7Ø2z·ù1bI"[ ÄšÇ!ˆ¸0(ÑCùB „ÌílÐyg#çå@±Èz@6­dA{OggSÊ&¼iŸÿòÿÙÿñÿàÿâPOjjgž«5%ëduûœÝ&Æ`ÚDÑ$îó°XóÇÏÌC“®…JÁÚ¯и*‹K¾íÛ–/ÓŠ°æcVd5Óhª²×VNKûûéýñ(ïZ™½Üx| £¯Ÿ^ô;ý“{ºýÿqȈ¼ÝJnæ]M×·¯ß cÈÝæ½$ŸIúoè4o<`›Z?°ÚÕ ÿQMxØM6;¹qˆ{]8ôó$õðG‹¼ÿxéDP=í~uC‹äñOœðy˜¼M×éƒ92×O×åêØ Ñ ÀÛGæ * ‡—ƒäkF:Éòî)Èæƒ¾|å3:æ9v€ß/¿F6 ˜6'=-¾>Ô€{í»íßûþÀÕÞožñkLÍñçùyß¼êTlê³ÚíÿÞY x’F½‘ò‡pçžÁV½êƒ9uô}ÜöÈ<Û»$3õ}(2áLåpړ殳÷­93M^b(è,zükß>›ÑÔˆÀEÏðçÓ; µ<ûó³÷Sp‘i$Ý–ˆp‹Bbºê%aI_ðHŒ‰PÜ !@tˆE©aM­£/8R…2 z“¶1 p€àc8à~a„ѳ%‡ÐiÌ<®òËŸ§¯Lóà @€@ÐG|ËŒA·Á¨ Ní½bµ0Å š`¡Ï7Ö›‘úaÄñ“¼OŒî"àU_Ró/8—àÈ8kÛöéGG>fÍZÚ”¢; K›aesϰy}™Ü·¸kÆd¹¨Æµ¼°³;÷‘å÷&Øù¯Üôc%>*䮸<>ó2N/mØ\ûnt€"Û´zrjãÞ@jAçßí‘øœÏSÔ·½ºð€]‘‚îýf®š—²,Jµòþ¿ù'›’ÌîQýºêt¢4ºàXoTb ¸£_&ƒ^^7ïº}ìŸ/“?!·ˆÏ‰¦É)Xf9fþ<{&"ÃñQó˜Hr‡¾~( £CC)7ͯË=Ù3ÔåDüx;¼ÜyS?óe`9Ö§dTN Kê;õ Ìñüº|DüÚóIñ™†„)r{{ûÑÑ;ŠDà”Ü2ÚSÄC6¢a:¡ hêdÜÉO0ÉPù þA¸]÷.@àÈúA 2‘…@ äÉF[Æt±ø\"¡Ý€T]Üí‘Úˆ‚Ð!Vݼ¨Ó× èp°‘VõÆ0o üw‚@…ØiðX?ýǦá®/ï ðbÀ€ñ<ôÞJdƒ”†±%|¼ ¶©T!)4±ÐKتÍßÝöÇo°@×eîÛ>ýê}×Q‘ÈÚ†œ~ýlŽæ2†Ý|…êÅÇüôf÷µã0A5ñ˜h¦{]„†\‚€îr<ûô¹å](šúºÙ@<üÓD¿ÒV…ʨ½¤"¯lÆ—©á­¥ùîq­'—ÿ/˜öËñ÷\¯Ÿb€ßT¥ÄÿJð¦¤À À™º˜8 ? ™¦pi½Ž/èÞýà›¬–Î^:)túpØK|³¤h˜þCUÓÄlûóF?÷_ñ»Èç-·çnÒáHzx² oH.ÝùüE}:ÅgÑx3ÑÉä Ou~ årϼû²±•9ÌÎæè½Wß5Ùl ñÿ]0ô ft˜èÝÀd2ö €ƒåBo}ûaÓ´fÙ@Bed¹[ßîË–³q§”ñ@ IJÊ*”vx’²mžöLÙ‡_w5xŽ‘~…Ãþ5ÛÛŒ0 YZ,ÈŠË`ÍÏÊEÔúÀH߀þ˜s8”» Lƒ‡Ðàç1ƒ¶e0´œ€‘·Àüd»ÜÂÖç6Ú´‹W’Éö @.bÑ‹3Ï£ÀXÀ<ø KtÀ->•¦ró+Öx¥7²$Z•ûüx®I¯Ê‹òxã<Í.·4î“æ¾o‡šœQ€dŽltˆh3%­A@ €Îã‰óbàÅV±Ýÿ߯ý:ïhB®ƒCžaxÝoœ|¬«ö±­ìæÿÛr"@ ÌøqÛ€bsd _Ëæ þªµw³—ãS¼Y¶6>(èÝÿÄü›Ï§ÕÒ_üíÁ`“¹ÄåÝE~߇cÖ:{»ü~ â×l“Câ.ÐC„¢K &¦v {W y·¿|ã†qy÷ò’m‡~}h®•8¿€ž¨äà:ü¹VG)ÎÌçÓ)`çæú÷÷súÝᥛ#þÍ¿ŸŸfïZ4át¯û&·nÕŸ¢Ew­™Ôžã¶ßžkéørö÷LÀÛÇͱI‚Ü5’ XØ‘WgôϾ3‚.Î9³>˜ÞSòù%ß^ ¾ùÝ|©¿M¾·¦ñ¥ sx=åïc P“‚·ë^DŸt¢×ÛÌÐû#zzñývÕUàqÄ—ïÍ‚@‡5¯€ÔlÿÉÙ ˆ6 K2Ø1g„MÒhq„V€£‘róš.¡ Ä"¸Í¿ µ€/›¼` 0ø Á#×GÂ5•Ò4à ¶)… ãdÓ¬u½R¬ðÈÐTOJ{?€ÏŽÙºì‘kgÎç}âÝzüïç i²Úl ®[»ßš'MšmS§ˆJEZK›¤äzº7wz8g‡ÓËüàž³òöÎýkG·y"±.rnFH3ux×ûÝ Íž9:ýêë–ÆÒ¬_8ùg3nhÙÆýg:õ¼ËŒYì†N·Íw¿éš¿;£õNEÿ!³Ë뛯§'÷Y@”;E7€„Þ÷ÐD(š,JãíiÕì/{<ÇH$=ùC7]ÌÐsËŸ@óÜþ\W€·[>žüê}¥ˆM|ó“™äÛÙßôãtŸ‹~@ö‡Cž*èé¹6é~üЇÑzÝEµ~sß7J€,»(€w(ârv_â"X•Àô DžÈSþRr§×%ëƒÕÔŒ Ôx/Gíï<.oŸ13 ¶!-OÅu»x¼§~MÆû==¤‰Óûwãñvflo1==ÿgdß5#ù¼æÉvŽåì _/ÁÿÿAÆ”J ¨ )d^\2JãÈÛÙp'ÐßF@«ñˆÁUÃÍ‹ TÁi„0×–éîòìÝ‚à+-e©\~ÄË|¿j´xŸ@Æ\þD½q4¤-@½M£Jšhá„À6gôO‚Ö‚çêî/8™¼}~G¦ßþÝä˜úègò'âß(5“ûõë2Å•ùÃé*”wñ†èH±Az…<Àd)Ý,£äF•% €<Å)ÙÊ\:ÍÑ>D-ïü„õK2YéCOµ\þ¢Zyëà2ñóå_R ‰§28þ\ʈ¼Z÷ŠªÂÆí(lþ˜ÎˆÔÒ·¹ˆ)ž ÄåÈ][)ð˜›ü3‰Ù<îŠå®¤Ëäoo·’~ù>ìJšw¾Yxüm~Û£×[Ç[d„Èûp2}~Þ§7zïÎo‡Ý{yKúrV—RDø”Ó¶ž†Ö¾Öw|Œ´IøÎ%¡H›´&ù‘~€œçT÷ œXöí«TíÖêÇ¿žÏ:Êq¡œ7ß,¶sÊÍï÷% ?ï_ÛëñWï}Û-¯ùø¥^‰ãü|2öóÇí«®ÿðb ‹‡’ߟûu·È ì £Ë“QyD«û+v¢ éiƒV7>À4z8©øù;à„ï¡Ûp’¬|j[¢17ZµëCårZí"åvU J9¼|¯ÑmÁI¯eýýu7$û¬AL$9¼=ëͯþá‹ àçíºŠOplee-the-bear-20251226/bear-engine/doc/examples/09-sound/000077500000000000000000000000001512343254000225055ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/doc/examples/09-sound/CMakeLists.txt000066400000000000000000000031321512343254000252440ustar00rootroot00000000000000cmake_minimum_required(VERSION 2.8) #------------------------------------------------------------------------------- # Find the root directory of the source of the Bear Engine. This directory # contain the bear-engine and bear-factory project directories. if( NOT DEFINED BEAR_ROOT_DIRECTORY OR NOT IS_DIRECTORY "${BEAR_ROOT_DIRECTORY}/bear-engine" ) message( FATAL_ERROR "I can't find the Bear Engine. Please set BEAR_ROOT_DIRECTORY to the path of the engine's root:\n cmake . -DBEAR_ROOT_DIRECTORY=/home/joe/dev/bear\nCurrent path is \"${BEAR_ROOT_DIRECTORY}\" and it doesn't contain a bear-engine directory." ) endif() # The engine comes with some CMake scripts to ease its configuration and usage. # These scripts are in the directory below and must be assigned to # CMAKE_MODULE_PATH in order to be found by the upcoming include() instructions set( CMAKE_MODULE_PATH "${BEAR_ROOT_DIRECTORY}/cmake-helper" ) # This will sets the variables of the source directories, required by the CMake # package below. include( "bear-config" ) #------------------------------------------------------------------------------- # Include Bear Engine's CMake package to find the libraries, the link paths and # the and include paths required by the engine. find_package( bear ) include_directories( ${BEAR_ENGINE_INCLUDE_DIRECTORY} ) #------------------------------------------------------------------------------- # Now we can describe our project. set( TARGET_NAME ex-sound ) file( GLOB SOURCES *.cpp ) add_executable( ${TARGET_NAME} ${SOURCES} ) target_link_libraries( ${TARGET_NAME} ${BEAR_ENGINE_LIBRARIES} ) plee-the-bear-20251226/bear-engine/doc/examples/09-sound/acid_burn.ogg000066400000000000000000000735451512343254000251470ustar00rootroot00000000000000OggSG ÑNo¬ ×vorbisD¬q¸OggSG ÑNt€—°=ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‘vorbis-Xiph.Org libVorbis I 20101101 (Schaufenugget)vorbis)BCV1L Å€ÐU`$)“fI)¥”¡(y˜”HI)¥”Å0‰˜”‰ÅcŒ1ÆcŒ1ÆcŒ 4d€( Ž£æIjÎ9g'Žr 9iN8§ ŠQà9 Âõ&cn¦´¦knÎ)% Y@H!…RH!…bˆ!†bˆ!‡rÈ!§œr *¨ ‚ 2È ƒL2餓N:騣Ž:ê(´ÐB -´ÒJL1ÕVc®½]|sÎ9çœsÎ9çœsÎ BCV BdB!…Rˆ)¦˜r 2È€ÐU €G‘I±˱ÍÑ$Oò,Q5Ñ3ESTMUUUUu]Wve×vu×v}Y˜…[¸}Y¸…[Ø…]÷…a†a†a†aø}ß÷}ß÷} 4d  #9–ã)¢"¢â9¢„†¬d ’")’£I¦fj®i›¶h«¶m˲,˲ „†¬ iš¦iš¦iš¦iš¦iš¦iš¦išfY–eY–eY–eY–eY–eY–eY–eY–eY–eY–eY–eY–eY@hÈ*@@ÇqÇq$ER$Çr, YÈ@R,År4Gs4Çs<Çs@BDFHJLNP@OggS@!G ÑNªÓ°(ER]_a^sdjcQTTLN[WWY\_ÿªÿ‰PNQISQ[_ÿˆÿ’äoÙM †1çxËnb0ŒäçÙ·O´]›ï£rŽ®‡¶|?¹7™ò` ¦±¹áþë_›îŠÃêoöjfï½?Ÿ_;Õ=‡×ççm€Ÿý,pð[Ùôa`ʃÝ<"Ã6¿GCOCöù%`$þýéÕ•ÖÞ©¢¸ƒŽat¶õËï°õ]1ï»óüœ¼8?ç< ‡WŽlßßÉökPXú综Ú÷m\¡RˆLMÞ¾kr+~ Ýä»–/@š‰nG¬ ݇ï™%·Cd㟆ã¼Ûí§dáͰDŸ™8Lùvù|ñÇÄÂyàÁ¥ÿËÏË‹ ÈF R“ÞŸ±¹ðDŠÉ`{òV¤PX/ý]³ иûyíJ%»éýýÎüøù9ÏX¦‹Žgo¿èùœ–]÷›ìGÿëE¯¬¹[±}–¯3ïöÌ…~o6ù­Ó¯¶/F½Ø^ŒÀDÖà´³.£Ø MÓÀŠ5ð¤àÏ H«@Ã:>ÉŠ™¸4Û½ÜçM¹¿ÿ…Öô7{ÅßË^Lfú‚5”yó=ß|Ý s!æ6òóy—…þ×&&ö¢Ì¯ÊöüYöå¹ü×á‡ú-†óéù°¾çóíÛßù;¾á l6E ˆk*ÈIäÒ£èý®vç´e‘äæ$Àt*Dwí¸Üòž)ÅѾeJó}ι¬õS›}£VµT2ilÀÜjš4ÌlRÀPÌGüŠPþ=eš{-ÕWàÞÉ|ÇÎhssŽ¿ ɯòãñY¨ÎJüÛ«»¸\bÿmáËÏ6sv™ÇwŬÏUˬkµ–tf‹:p&*4¦«s«S@®ß>Û}±ºh!ÀyC5˹U%W /ºIõBâÁ…Éø¤}¼Õ @T@îØóJï!/ÎàµZ½Z9ÿƶõìúHù­!õyUÁ{Jò%Þ?öj«œQ¼À¼Ä‹Iž|Ê8À÷ðês¾º:%M º é!GM¢èC<ÐT« Ÿ¢¬9>jÚ£ö”g&ç{÷yÞœåk·ÁœsªÖ¼u´f3˜»cxã‡ó.šúa†5¼szKÃîõÊ\ÅÐ]Ââi=Á±Á[%欮ÏÕÏã@Ù£œzŸö¡ÒÞTµ.®új}©kE¢S$%úñu}^HÒ펜·ÃÞt×wrææÇ˜ŽLB„»Œ¯êñ ãa÷°G'’r쌎ޛzµ%Á.`ÿSÿ/ÛÌö¹s_w9`sûjjÖogý¨#µºÏL˜'k÷t²€šÊÛqsn«¿7yU÷²ŸÚç‚]ïõžùn ¦»¡?“Éäc±9¸€x†!ÙKwåää#g P•VwGÊ[|ÝöCLFRWeÜÌážy|­é'{€}Ò³vu?PÔb¹‘€ÌúÆæa€OºiÞHçz-ີD\Ë¿«±0ã"@ðY ˆVÑš<Äs„ˆe ð«”‚Ùd+x¥BÉËq17oú¾x2)pv@x¼~xìûKc»} –*%¤PE4B¯žk-xZÎÐôÅÿîŽOœ–åd+v;ÙÖ¾m[m”]ºÞ©È^dä„Ô\?}6»º¾Æ\ø¥ø¼unRwäóO+feñØZw¹e½››céòí~t-ÒJÔk¦i‘ê^分§k,Ï|epdT¢iÑä ±Ìô! heŽÐV¦…BªU·ÀnEמܧªÑÚIyu¼« "§ƒ@Òœ§ÈgèîxìÄ€»›¯×[Êî LÔZÕõÄÔ—˜ ¹§2îÍ fwyÔÕ™¥zÈ ¬j¨‚).€fèºb'°\˜$Ådqr¡š!Ç·ëî8¦®êˆxö&R糇¦Ñ¬¹$ÀZRÕ ©ˆ„—Ö‚h˜Ì `FIGÔà]kðŠ≙LLQŽ]@»0†(‹oêIa"jØ6ÈÎñ€ØØ±1†ÿêÇ÷B12x]-Ð’üŠZ½0@ƒÚϼ´ À÷_ÍþbwWJîEÖ(Èë!„J=„J`wÎU)€@…† ~€•‰` ŸFªSô)°:7±-»L±Ÿ?ÈmôË}9âË¡R=¶$ º4ój¢rB½V—”xY³¢å<e©~´.$m£n¨­Î[—(*»Au{Œ©©y’¼ËL¶¶ê1ÐÅÖ2VytÍ-×–}‘ß<¹æ¨ÿIÌÅ÷Ú{º”¾yÈB-®7Ê/œBuR¥‚Џ±u*DLFªØêë7QA¸Äz—²òÞåM±"¯÷§câ²åçóN»):˜¹î‘OwÍ|ê ?WAüÀ—laûïU,´:QFS–\¹Zl•Ap˜;¸ %€ié–Ðêê8öÇ~ììŸÛÃGG¨žpÙá?WÎYb ŠƒäîvZ ¤o€§Húd¼n¡¨´D@Ö©NÁ€€¥©âýÙ>@”2€O’¤ß銚 ”âoÜþP˜©þ0•¥¼éQ5"äܹôÒè6 p,ÍÈ\˜»[üß¶~ù¸„NõÌ€qš€E)…ÒXÌdDr°}€Å( <ðñ’±’zRè>C­ËþnÏlYˆžè]N\8ê¤Ã…Æ–õE©›§Œ-¦z¬Èi„ûª¼p”&ΙôÓ Ú÷FªsžýË·£•[[’`Zm_‡Ÿé"Ë´HŒ9ÙÆðþJ+²M=œÕe‚'k”z–£ QkÖ±Möínä¦UQ++ËL©KrîÝñéó-¤1–a“j¥AûÓ5¥IϽȶNyÞ]/2y-Éi9adû¸œ#¶õ4jå·^ͽÝ?Æ^Æã‰Z—JI8*[ŸïôÜV…t^\ÙhBÅ–Ü"ª~QÍYœÖ3Bye«¥Í.àk»4úÀ5Àž¾"§ß¹Ï>}G¨úQ?šyw4¼€Œ"%‘¤ˆ¢†sÖnêÙÝ\#§Æ2Ÿ@r½¬"(±s,\ǸlVÞf°*V÷e~]FŒälØ»UµÇ^M«ö¦W(Sʘ2¡l…iªíÇ(‰®^ì%4±XJñ+˜KŽMŽÓ•ÄÕ†™D†u9 ^•u¯´‹FÇEuGZ_´L¸ˆw×âLSr“hqOêÆ÷a~F~Gr¦å¢7ßö¸ztëæÞ§Èæ”:z{ –N¥Mu™ºM½P·”wËH €Ñéäg¨„Ú§öé%Î*«   ~v´—!H¢÷G.()æcSk;Ö ]Rl¸ .߉c¶5,ƒ½2¹ `D•›Ë}xó8€î©ÀÌÄ„0“è YÃ8m& ôª,ŠÄ`GBŽ„!… °Ì‚b U eTv7á‚|•µ„"V¬J¡þ÷?_Ð Ì‹*ÍT^lm£ @@µèñµ5Òä|»ÏÖ·m3?G³Õ×üöë“ ¶Žf®IŽâ,Kß7Æ02Ûö–3¬eÄzÆüÌ• ™[$éÞHï¥nm»,õއÙ“°Q]ÊÔçt 5õmä¸N¦(§)#bèš‹ =•Aƒz@S™%w4êJÐYìeF9pÑ1ùVóîywqjéÂ5¬šZë3P=P$ôìd‹b©I=sìµqV›”¡¦g¨åtOkÁÝå¸ú¨{¦¨4•Ì$‡ÅÙeAOl¯]sf©ÙïÅt¤ŸîþyV-õåÒÀkfòþÄNƒ) jYéµ ›ª8º÷#â2z©œ$YÕµ¥V¢V,ÝË9ÅXϺ׿ո¢%w]×ÕLÓÌvÏûP0•âeyêùütf‹ã+D=’°×¨')Ž €OÅ F™¶ RC @‹BU'‰$[‘Æ^¤8DRlõ㲄ª kKE¯ .¯¯‡[[J#Ke‰OggS@IG ÑNkŸ.¹ÿ§ÿuÿŽÿ”ÿ¦ÿ©ÿ¼ÿ«ÿ…ÿ•^|«Kà4è Kc§æS`…õÞXú!õ!ö1Ǭ¯÷3¼Ó±¨÷JŒ+u ,võ“•áãK1ê­Óññ‡ÆhêÈÍ4Êò6Mô@ë\ŸmwVÙ7Xl“’S:dõáñ'ï8WwU‡j¤ÔOÒX+!$Ç…¥{ O)‰3&jkˆÈV<{Þô{"2tŒ®Ù˜p9Ú”~½˜³jçÒ‹=Ũ›Þ¡ß`2ÊIÕDY‘’8ïY²¼Gxf|’§»ÉŽIbVBr—œ¹r†6êðVuÆt<'­ÚR1 Dm—ûùpÐöÌ\]Ž¢%®+#áDÓŒ³8gu‹WŽ›ã¹kÙòðÀ…Çt/™Ó;¿]aÈÏT¢^{ŽJ©d0q77Ý®®gΆéËÜ[]ïóî#ÿÕ1w(võλizW%4ϲÕÝ$‡ðièŽzšã+dU53Œ\q±j¼®<ã¡A0Ü«m(V_XAØF&yŒ² 2åE¾ùNâŽûœsÉ sù¾l‡7±ôóç±X/[!±×¥[o^Œ«Œ€0|‹òVàšè#ìmk£m[ó>âN£ÁÁúÁÁÊŒ·Å¦nÜÛu(la¹ç 3Üyš5óÍš±ß{§³öšj‘ŒäävkF͹›5d´W"ÆhƒReÄIáÌ-Ų4yÏ(4IH3ìúìlR‰&aún·›Õëæa·<0Ћ¸3Ç,Ä)î$=%ª<"€!"Ò«óIg‹©5M톒/’ì$ã4^Ý­#ìÈI¡ k*);ëÔ:Ó4-0Õ… ÀvRÊÄÕe*A¬½@k*–EŒ €™:‘ÀÌÃõØneVN7Y€(€ÌBÐfÙóÜo6P— ÀtÆ!]™`)KZ; Êfzñ®ÏËÏËBËEh0™PyÃH1 Bš3ˆP¸Ä=¨n,‘cÆV>{+Ȣ愸†„µYÏAP‹ñòãùÀJ) ÷Ù ‘šïß+æšÕã^{Iy@,Ö8¸€xÅáãs)£µ¯õ>êÛÖwÔ|îÔ}Ø×ÀRNëÿ6Œ6ÛÆÑgŒ²–m-ÛÆtwÔÞMÆ;Ÿj­æ³zåh,†TaM$œÊbØY}ÀhÝ'ín™† î&ñL®ñxé,lzP¦Z¬ÊE¦N¹´V‰)3'¤F‰Uæ%hZeÚæà±öT”„m®"9b’:»~[z•ÕKÜÕ•eu ºÔS­jBHl‚r¸žE UÑöZ–‚Å)ÖÆ 38:ù†–æºVª<ÙBÀ4C™žáž*0€®QêQ©.Ou¥b¡¨ghÔä,@gEås“zB^³/ÍTÓª=<ê¸x‡¥C#¢Š*m`¨Š„ €˜Í‚ëN Òª,Ö€Œ|ÛXÀ(p€ÀŠ/—E–åïá•ßYgKÕ{Y®.,–ãkk" ²[€AŠâ¤«P €Ú¥ØŽ'ž+ûÞ»úÃryè@þß/ÏoV>»uÉ.`r·¥ºž ^Àëæ³hwŠ´6™û~ŒúQíhGø™g&ø1á¶ú-íòºyØS¹"@ÏT½ú¹eög±ke}ì–ɹ–Íc"+q§ýd}:b?è¨$Sjg!±´œÍ\ªdÚun÷ÜLÇÔ¾I€©ÙB(D†vË婦{ Z $U“A‡ìUËPw-‰sŽ ®‚R¾“Ví„"M¤@ՂĤҙnâi¹c*½.¤tJq–¨úÔ‘IEv!…ÅžP•ñÕÂRˆtRM¸ZX5AÌוñ‘+¡ º»{m26½ÍÝç†åMÿþb¹ªå¿YÖ@ pMø(¤™É*`JM?½ .îL˜.È„º Є˜L̃ÃÑy¦—¸NP3x³îÏ"sAïìµVâ MKªãÞJfëRDZ›T, -õŽ EÄiRº®¥ö[â´´¡ˆ×œ9‘zÏØE¥ùˆHÂÊ&3Sš]œf #ÖÌL@Z6Þï50ÃÐ^¢þî ó¸4÷•;!ùh&ﮈ„Hàüç·’7 ø†ºd_å«Û»ùºß‘Þ‘ûþšï›j)£\˜YIÕ±ÿ²§R»v˲ª÷×þú¿ÿçr_À}}_îp¾»µ&­—|ª*¬ön[5 è!¯®?öá}G³úNѾG­#ÕîTl¿O6K¢U­ vÖÊÒ–#m{äΗ²ó|²zö[5»³x‘]sŒöÙ÷f·ãû¥ñ)CBšž©èM«ë(Q¡%biJ=]ɪŒ;­ê½‚é)¥4æØqÉ©âÈI˜ 4C_™šØçª•ŠD/5kô{ÏyUEÕ¥xìþlzÙ‹ùòq{û$_^šðäU«ŠËÕ]bf†Î7ŸáyùàÚ‚ÄE"„Œu……jwlÑ)º³¦”?ï¼Ýﺿ©ñ0í$?]DÂ0_år½88¶hÖÔ`|våæ­í©œ"¡…;޾l§LËŽ P×ëøôvÛ oÛ³¦ o6ç7›-‡~µ­mŸ,¦L‡¦ê’‘z|—Ô¼Œ‰šnU,xÀ•¯# Ø— ANk‰’AÝ1d’ym,k-·X¨Á]ÃíY¨Ô,HRèóáo ÛÛ3¬cF¬¬s.O –ºµª^›­IÓ ªPø–[‹òQ2Dh~Õ\w#“€´ÏÖû¶Ñ™o{’çsLg.qà2ýÈ´£6øtOáF’²=Žª¦í°“…-Ç~,[&mÊþÅÝ]u|õ™¦Zd`t†Dí#Ÿ$Cšg°Ìú¾ÉŠU[9e×µVD77bmظeÛHwéIðhô\}ÆÄíœ×+§»3‘·‰ñZ¾û<݃˜©í˜¦:n†üè>óyˆ-d¯÷ã®dÌŽ>Ñ,»Š<ï±Í=âpÖÆ‡âüíµà¡q)Û]ER/]EMïÌy“,JÙ@{&ÊHÒ Î xæÐÕÊùÏ.º»iÙ¼$öÃÛ †dËËγuq¶›âJÈcÌì‘Áȹ‡7õ!#¿.Óó½%‘‡´ëpïô²‰% ½A™>Ôuç¼ÅYÀ|}7@â‡@WSÛb»¶æð;_ý6Ô¶º{Sà,_¿ÕôzÙ¨.ž|ÏaDB—g±ˆHÏ7#éÒ~©OŒH"úì¢ð¡"Œ‰å”œŒ80" ‚€ ¤Ôãu€×xÛ¹`ë 5¾‹­]}€LgîÅŽE–ð ƒh¼Ûm 23Óœ[-`úé£ÑÑÎ}9ç^ w*›Žgs­‘g¬ÓÖ¤mg¤†;8c§›µírª¸ÉÁ£¹b#[±I,UM’¬{eE;¥‡ouc‘Ž žb“ÊóÔˆ<2±tï5#9>uSMe»,Rªìnö|Fzi½HP{'d×WºÇYë"÷<½“çCÇ8£”?µmf?¼÷””=u»b±l¤B–bÑÑ«=ô™S¿ë»âÉ!+“·Ä>÷¹ÿáföÎýî`ÔÍÉ&§ïÓU˜Éÿ»¼|\÷f‹m&}š^gï5 4D£îš1Biu«ªl9ÊÌ̼¨ªF|‡ª+æe.ÝRˆ|]òñ=ÝÀp~Mâ% à0pÇWx±8„ªÝÝ_Ü~ù Ô¿»€È·ãÔU`Âï¦R÷Ìýu÷t7Pó•z#½!4›€) ËI(( R)°$ÂÙ)e) ıžJ¸o@F€ˆd9œ__R â¤RTô`¸|_ 9kÕtø–_Ý 7ßþŠõÚþ+¸g©Éé8?À\ÿµ´qÞ^€áëctÔš…¨~E‰D€†åT>m&£úò„½ö÷ûœÚÙË1S èx@û®J3ËýX+s,©!ÛF2Ÿ™¬ê`È“3Î èèr¨b¥DÏ€˜_qÆQs:Ó¹D¤#Õ°xºŸç loU»TÿXvöÚËxæÂ $䏨së©çãñ—M&³À=‹öt4ìÌõ±~þå®ûàG"·,Ù<+$õLœ+³8ê Sk÷®•pyõ#‹ž™ÍÈ=ùW|÷$7SÿNzΧ¹×g"6<»›¶ÊËÆ?sþweχþ½`ÞöC¾v—xÛ’Ù&b@ÑTÕàš7o}“HSÓ°Òfö³ïËù–(¬™±Ï? :8{ÈïÒ«P—€Å’´Pø¨ßgæo#¾¼ÕıYïãè§Aäó.ájóí(àòÕÀÛ+ öfÈHÞþ<šTγÞ{WgÈÍZÓèSL&,À{ÊI¶‚‘zĦàºÀ0FÛáG}ÛÖ5?óáTVÿ9§8oo¬¾=Öã‰F±¸ 7Ö8yß9ÝÆ§c¯º¹hLΚ«êàÁª©±Ç­õ×Ñ軬‰œwÜY/°6)9ES…é‰À«+×5«¬žÄhÒŠ6«›fÍšVw°&‰vfì!Ž&`mÏ4¾ƒJž}zé骙qRªøO¡3 CbS)Ë]¢œ <½Ë%Ë–Þé]ý S†9õ }+A9—FòØù‰³”ߪq7®­­T5°7u¸€±·ña§¦/¦ºöœˆixÛpô&;éí餇ÎO7T®U”$YÉ—š˜wè*ᨄˆª^ÀIÑÃ0ÝËÀ+u’$3–¨º#ì‚á†jí4ÆRfÕ‚€ågúS®2ð"4¾À6‘o‡Ò(l~#UB 9»0¡ÐZ`¹ŒCf¹ ÔøéˆNæ¾{ ÃÐñzOggSsG ÑNÆ<öÿ•ÿ~ÿ‡ÿ{ÿ{ÿÿ„ÿ‘ÿ“LLLMNO^^^{­É¥›IƒÅL–hõµLÉɦèaøH2°ÍúÑÑšo£5ó~zÇЀø<`Ú8íÄaµ·š­ü“O‹¨”×á2 4»g3í–Æ–Cn1ÊJ&˳,о¯K9š¨N­8–&º%bU©öB“]Z«¯—tH89¸†S2«öjêG³f—EÄz“ ·|G[)Ç(g‚Éž7€¥XÍ L’ó™5h#Eftmnílwwt`v—ræQ…"™ .>‘V#u‡I±&Ú£†8»zÚˆ†&樕@µ›¶“fò*hÍ×3É‘˜˜À½™·®Y'5ÙE¿¹§:sC3ÁéèÉÏÇGf Íd×ñNÚV^?ÅTs }sM¡™$³»:š!çîžÌɈ¹Ü –)Š«1íÍ;†aœ~’Dn i€Œ\Ѫn%X¦3) géa$¢U€Û8´ª)ËÊ€ €¾@¦‚Š(¦ˆc¹¶@}v"–qñn1Ø6 5ß -ûÖ¡Š """"IÔu ¾:u1¥ÉIYêiUGŸ ²ð7@’­áÛÖÌ×GÛRÚ:@ö%ÌVÍd:7Žê­V]“xƒ¼Á ÀD¢Z×t1ú ™­µ[ZìY.ë5Sã;[]>¸ë]UFÑÖ½ˆ\Ä„Kv ÒíÊ—‚À6d´Öò TA²æiµcϲ>YQ×dÒnoSë#»VVÖQ6yùr {%ZW÷Ù!dù^yÊmíŠãZÈŠ<3Ry7¼PezV¹ßu–a¦Lq˜œ\2!_ åä½µéo€@b‰šäêR•Ÿ}ú]ÚϹª»««òCWÃîñædf@›†á4®x¡üü»ûJ»Ü ×Âtg¾TÑÙãª.I,Ç»Ž;;Þ¤{z:Kn´ô+¦(’~Ç• tkfð$©6E2=TM¯0+$T©…†Á,™y”@ —ŒD—²!F°•XÒq 1z‹f!ƒô Kcð*!² #¤p^*5ÑDR¨XT“…¶>kÑCN‰,öúTÙZ8N#"Ïm`æô~ø¶£†EÅt ‡“^ŠàëZåNZCqÎRò̺a:mmLÓ3Ö¿4+=Њ]F½YƒZêO …Â$­®ôŠ ©SdèÈ~Þ¨à ݂ ì¤d¥‰h3vêeµê(–ÝAxU“qA1=ÛkqÓH9¥£­•Že‚¶ Rïé¼Tê^ÎÄâƒ, wCº™˜Û\wÅ6™­v¨ŠF뉼K˜¹8e»¬dvWÆæ]éŒûò Öâz’i/K³djfäXtÕÁÙ.ÊN¦òêÊ4c¨âÆwîÞ²ÝdÒ§4tÆÓwAM&dC×ffí²©Ž)URV½k§Iç¬$ 4•èêÎ*ŽÖÞPŽw#<¾³3Ý$¿Lƒ  jmJ¦ÌlL™ú—,ðR¡IyŠ,^ÀF$–V(u¼»" „Nìßj[S*yU7«ÌŠ|C†Ÿªô Q­@UÕ-—LQı1ëlU¡†{e–(ã@@‚æ[?{ÀÈvì>†Ÿ3Úfm}•V6O0‹£‘ˆâæ1MÎÓ5‰ŸuxDßÌafû²-ìÀ4±óÔrhK2oÅ3”!•¸ØiIôúDÛŽ[6w£˜4⣠´1Ô±J¬a¨XÙ•Ekg.C¯,Y3¦rQdëÉêô–Å2[]Öð^ê’n<7í"·âñ5õöRô²Gû®¿3%æçä²g|’“ÕôR¤šÅ³Üìøÿ˜ïG&Ž“N5€3éöÝ.:õ†])y¼UÕ–m"],JŸQ{FÙmèÎ>9èÊ´Ðý˜¡›i1ó3u_`Í=µ4•¤Rå»›ò AmS™s{DwáL(“ б€™%›©î¤¦úJfºÊhfætæ’“Æçrˆ‰}ºrÉ’™&+©¤\vŒáê¸qPå&`Ê €yÍ^gX’dˆ¶XÃu2dˆÏ&$0¶À"a$ °¤1õ¡0#ÅzžêL‘+ ÇDM˜ê¬†+ˆPÃÝkȶg÷¾YgGÑ0I1Õá“Ü®ìmDvuöή9`Db¨m°æºª>ñ›*.1}”)YNaŸu]˜ƒ‡û}Ö¥KÑÜ_i½¨€`ÕªÊQ+Ó2=M#õ¸¨HŽ]r¥DñèËËM¼\"üѓӟÞMgV¤ÐU¢è똗✊H^"8^ ÷\Ç”{udŸ®<}úYÔÝõsÒ%-V¶çò"B‘G x"Ýi–ŽÕIãRÔGÓOö{´T1‹øÛÙ;šIEÖÑóóŸ“M7Ì´_èöy™ljkåÄuæPG eʵPÝY§»jh(òQÌÂS4ÇºØØmk®UɲÕ)®<Ç¿˜Ð’àœ›¤›á[gæªL—ö(†÷tåá“]éGú‹Ë– óx² Ãgã;ÞUÿñEÚÚ?m$ÕI´4‰"-2¤5.VãX"’ˆȰ‘@’m1¬°Í»È#`ìØÆ~z”M‚‹0l©É‡Tf)À‚dM-ìÞ¶mz¶ÑŽú¶õclº OÕzA††[yq÷¾l,½ÄI7£L{±ÄoÄ:{{{×GÖí×Z¯¦ÍØV!Öì¤{ÛGBB_W ëÉB™ƒ° Ëò¨»Oݱkuæ~×d'É®¡W&;›¸Ö;¬îÉæž^WÇ ÑŽÞÝ…ûb&T½â2R¶*!ÜfZ9î¥&#ÓÌ^»WÖZÕUƒ¸ªªkŠ¢‘/˜ž‰vI=Ó­©,Ó=CVŠ£]ìµry!TC3D+Y8§êiué8 TGÆP˜†® Wìfj¥œ“å.ôoþ÷ÝK|31á…«>€iBêV¥•üä4m&3©zàÓÓ‰,ÀVU²E Zz_s3ùôØlm9€+ß_蹬J+º´RØþº‡°îþ÷u¶¨* |&ä ` ¢­y!)`@^äP ¥Pàö àÉK€̲ pcq©Ý…b`‰>Ú”]Ä1ÈòC¦‹€zÈaW»+È=[À·­ïð­Z£2ÚÄ©¬LþÅ£¤ãý@4rœX µãÑžø®Úîí£iw­•¥Ïw>ú©uö^Ù¯¯®Œ…s‡ÉòHGÂ"<=ÔUìô ¨(Z½Z½öq'™ªt"•³iŠÂÈ"±Ž[ËÌÛB+@gQ©ÂŠ.c‚)úŽº†Ê«f²+«ìRЛq§Î…¢ï$.U#ËKâ‰Ëž„lÕèÊI:_vOÔÍ´³ò0Ót÷wl\s;âBä¼mîÄd©÷=¯É¼oìé¤Ù˜Ùå÷ §ËICÜÓCÏÆ,S–Ucw¿@ÑËÊ~ r:ÖÊ© ²ÿñÍ¥¹«ûöŠ‚ajß0ÒÛÊÚéeíu Ê‚ÊJúÁ=MãÀ PI½r%@7ëvk>³°r*y£Æ€^˜]‘fa• Ùz €ÙÂÀbs7q¾ !ÂågàyF î«pü1`Z¤B-Þ^þžž9”ŽÅA&ôP«$J$.ôÊdqwXè'óÄÛÀI ?ç­(j²Þ1æ×'kÍß‹‘¯=‹Å!/©g¦:\XßÛà{`ˆ?ûúÅyV”«D>ÍT“†²>„¾«2S͸K±pÌ¡îÙ e2¶²S©§Ü/]÷v?äkR2V~|uÝ|†Žîžrù ïË.µéVf[¥y&l }àñ2I^ö(N!ɘfŒšî½~§SDÕ!{|;͇YYÃ~ã=Íô¤É2Ñ’,ÝñØ9·sF}Üß}'ŽPï´ÀÔ9?Õ}ôô¥Ì™¬å ž™{¼+]ÞüNÓâÈŒp&¸ž¬,å•d1}Sšæ «Š93™gÚã­§‡!ûÃTuåÌL¹K½çѴøï†E¥á€6Ô¾¶·ì•ð•Ó“ç@S=Ýv]q‚Äb$ °+^“Ié–€HUŒA --GX'nàÚ²4Ò½wqúàyŸy½Õ×Фö˜„ްB-ö˜„N4+äô?€r^[‡¨E:°£~ÌúŽú¨©)·¹¸ £’d7¼ØV[}±½=çýUÌG.6“Þ4s‰™®TèúÆ’P̋ɬI\f}–*º´ÛÐ„Ž…YHURœC&¸ 5‰&K‰¸:ºIO+· ü§Úýþ|ÎÃ1OµïÞ«KÍqæÙQkFØö\Ô¦òIÅ‹ä«> ôtÓÛx_¶öTÇ,À>%ôó¬Öfý÷LSW¿ÃÌ›@¦úùÜ—}àB.ßJ ÕœCóâ¦ß«H¦¯L÷6D/&οº&Ÿ©ÊjŠ“UÔž ¯‹^ÐO•OU⮡rœÙkvÏɨ… €@fžÎ8ÌÁ@<Ù dÝ€˜5„—]5ï}þS|; 7TQÝÿ^î{\|‹Uú=ñ¹ƒLîdâVLÓˆ ÙÀƒwŸ+²{#„°$¡…–cŒ%ðZضÍÀ#0"ˆèÎLxGD,- íf³)"͸êüìåÿw‹4oÉq,ÇÖ}??,Í×­!Îd»LEº¡ ½«É"Ö)„--¸æ [EP¨?tq]]*h%9x;÷Yç?Ê’âÿý#9òÍ#mþšL'Ò»z9lTëÏT¹í•wÉù¹êùÕo³ÞOõÒ/O¼dú½ OggS@œG ÑNIš|ÿ™ÿ©NKMMadÿÿÿÿrÿnÿÿ†ÿvZy¤Qðaá]…A6(íø`vÚâÒÎ L?ÚY_mX¨ùy€Dd”HBÆ®9·Y}]îM‹&Žf÷]»ºP…ڊغÚxÚN@ZÁ¬;f5!ZFAÄ …{ìFY³1ãþ¼U#ÉhyÚ§ìkäVÊô}Ô_&ŽßM$fÈì¹ól6ogƱ0TÝ–=£cìËÛqÖ/råêa&‹ºvKî°Y¦’<×kýÏîf+5r‡ û¶é‰Înëc•Ø}¼l½çw¹ßÑ ÉH¼û‹¾gäëf~ššCÓ g““°{*+oÖ¦²÷i¹Ë×p_H6™É¾÷ÏÿPƒ=t™•Óð›á¯°.æÂ«øÌWNÚtÖx†„¡êbÈJ:7¦f2±¦†šºÿþþŠ‹eº2ªL¹{:é“§aÍJ*A궯f+´Ÿ¥CwïRdïmo’L8à _ÆÁ†‘Sp~>b›•ù:•z3ﯫÂîûë@­”—»þþx¤Pô<öÃY76™ÔžFàx`™4‘F¦Àáû0&ÚY[uVîªRæÖéGÛ³Ñ1l 0 %ÈÌ8$ïç7õ¶'w2ýËÚ?³/:ýh#剩¼èÁgß?fÃuÄ>=°3–5«ÅV­¥+5EõRluØÊ5ƒ†V4tdDç¾SZ#ùÈ-÷KwqïQÏ;*¼C=Ì%Á´ÈðÏ1½gkÛóµ=3ï¥Èæ»ùa©§éÑ—O¹ëÏÀ¬åƒ:úÍ ¯äÌ“Üt7œ9ûÄ¿LõÛY@¿3=£‰ìpו9p<íØWS™U“ÉÅí¹s¶~–"—Ü·Üô8£ß`ž¦§sʘž†¾{hMá eH*Í™îŠkˆn_ÏîZØdÕUÐ}½_ó[3B°a†îµ€mH€Z0l)=W,0k7 3 à±êPœD‚·Ü¤5ÇCMÀRŒž·.7€]o€÷°–•âòTÜuEü°r нñj¼3ßV¬ÍªúØr^bl÷ÔrÝaqfš¯Èb|gG¶"òß×ýÿ`L&ii¨pe#Ò›\•‚ÐÎë[€oà…‡<ñxÕ×µFËŠkýר½á Ê_=Ô‰º; Ì$“ýoV àæ¢ZóÂìýø1=ÝtºZ½(à€*3 À²H°ËÔúLêF:¯vC‘w^Î{™Óÿ_ ©SmÉàÍïì>çÔw˜)Ÿ&ïhÞ |G„9êWŸQD)î걨ƒ@©.¨`—@ÍÝÆªW†‡ãOÚ;¦¨Wh—‡Z¯ÿr¸YŒ¯#|Ú¹œ®;‚¯ðæâܓ׈·1XëåýwÌ”J•N¶l:ÛŸ* Îe{¬ÖTŠ€Xæ)Îm['2ÿ qÉï^ék=¥;¦Ò’™Þ]w¾ÓŸS0· Ø¢x1<¼ù¼n|+~ƒ”B™ðRéØVªl‚6 ‰{v¾ð¬'Ê@Îsàþ*o¢Éæ²szûoÍwNµt|úp9¼V¿·eudšŽoÙ-ŽÝûþõÕýÒ‘•˜ þå„íÿbEëÇNô–W}Ðx#T"½,£{´™|úæPZ×ÓùÓaxÆ¡7}Á~å8çn{ÍæµO"ÅIbÑLoz*Uøò?$÷¦ôÏàú ÕUoðX€O¨Lz!ÿ$´Ö%âå°Î1Fk¨F¸¢1– @f”È jˆµ+i¶ô¨amŒ‡Í섬u­I!›7wª@æ]ÕÒìŒ]Ä;_cÓ<%> –ûc±þó•©Úús]lû\žÔºuI¬M7CŠ2Ì3µž¬) Ȱe¦8×Ì9ù@•Å3 ûèà]y~ž½·[bSîýýØó£•í¼½Ä ²² ôÔË®ù²ý‰ÛDZçÂuòíîWÏ ‚Í3yÜ™Kü‘Dߨ# þ •­½&òcù8›®g*i„i¨Žž*×n€‡2ʬîÊ‚«’¹G¿««‹ñ_s|ð7÷øešÏoú’g˜žîÙµ¿ã‹¹w*¡!Ó¼»8lc¹27&ÈGaáæå»Yÿ<çî¶g3þþ4C¿K13°,` °tdžÂ›CES=0 Ô|uþ‘½:Q^Ä'A€ˆ`ý ĺÓêß+¥l/\@—|¥ŽË3ŽÔþ*Êá9º,$ùï @^yŒÍÉØ•HÇ‹L>@ÏV ‹J”çH`tŒÎ¶ S‹0?À°qu&žØ’I׊XǾº¢«1ÿ\×0—5©tªTjc}èŽ<-(¦ïò¥¢¤Æå eæA»kâ·ùéÌ üL|}3n`/+ñôKj~oÞ[âŽou³þª¾³lÆ|¾eöï ÎPM¿úÃ{¸*ϧ’l€}ýÐI4.5¥×Ïö…9J<0™rxÐ/ÅVîÂ4¼À @&†Ý}aœLàä<];O]óÏÿÄêäé]Tþ¹‹J‚¸Šý“ùvç›'‹80ù0d%@@ÿ`˜·gfæˆyuge»§¡§úg^ÆOnŸÄ°×ä**2dãúéúO>à}~Â×Ε )Xö?pá£psx'&…ÁWa× ÀËÐ0 µåV`±‹µ¤Ä&{$XϬjpTÀ©r<€¿<\^?^y4^þ€Ë¢32ð`ºW&‰liÏlcÔÏF´cvø¹œ“0ê4ØFÞ¬oç:‰3–Úȶg¿ÙýšwšuŒ™„™Tsíh"½’.DBN“Çzˆžº°„ ‡GdD–ºÜ;úÎh–…Œ¢–2º2«2—¥¯¡ª~˜hšî0bÿ5IGR=ö„¿§Í6p÷¥ÌbJn:ýûûŽb—c&‚0’ÌÜ®ïÔ{æ+’a@.Üßð'¯Þ©tÉþЩÔ%†öß&‚ïNƒ â ,ê½o[­õ­Sç©Ib2Á1¾ALë¬Æ©T8bñŽf½OZìSÏ 9%”ÄPù†\3GöXì1*rLh–0"㱘·k¬µGkO.` ãFôJ H@ʱ&¸²â(¥Ì£’ÅÙå¡|¦ýÐCuMŽ&ªÞ‚[o¶Lɧ»r×®¿þ½;÷íân\bTp†÷Åtr ÐÉΓ@÷'‹Šè}›8§I«®¸1£ñCõ€¨äªëfNçùS;¼__SÏŽkßþpòè* 2€œqþLrÝÏFÝÐ0wsß5Ó³ýýuœÝ ‡¡^UBÓÙ‡òr¢ÓÓÛÕýð@率ߙy{^ºy¸Ô{@w_¾/ïòö;ÝÙÓ¹˜yš™Á:ï®@Hu!|ñ ¨­r}7p݇ðŸÿø0œÿå¯^hþ8”R–&¨e‡°` TîÝ^Ò »ûN߆ ÖPÊó`ý¤=v¼Lºñ®Õ:ã˜8y01ê™cfsÝ8û*!9D]-õq ËìÎrwý¦µîÎgWÃUÜa¼*Š›ñ’îÂfЉS@I±Ä,Ì0W-U,Ñ¢%ëŽiJvÄ™×ð’}Yy$Î&°{9'®&¬Îœà™Ã<ß2sÿ“I¸*Jjj˜ë#NV´$µ”€&GQÖ›‡lß3ÌÜ“Øâp\ïG›î¹šÍútökwÔ›3íO1ã±83ïúúáܼµ8­ y×PEKMæ²\wûa}ì¿|_Œ’æêJšnÞ”¹üüô 7d’ê÷xõ$<2JšKµ$ƒq\Cë?ûÿÌâ*ê®âÜÅ•ÕÙÕù(óŠ®,hhÐl a±ËNýT  @ý.—@–[X@#©[À¥G/ü2Ô}ðòÕð*~9L‘ÆeЀïrh¢Lp`½G;$ٲώ¶ú°ˆ¦¤ °Z+#¾g/u’´-3¡71ûzצaæn|ï0J­ðÒЉ˜ºÌ”[Ý®-W2æ®Ò†=E0"±^‘ºˆÍj+<šÌôDB´ÜëdÝ9]L2ÓYEçù*‡Þ¢Üwùgõ´¼ôa»´§Sœžbò¥@U wŠ—ÏË Ï{bÆÊÿ9{8éŸÉ©“Ýwîž«ûî^PʼZ;ÞNž»ÉyAÏ$,Íy k¿ÓÎÂtCÖ: Ã$ÌuvãWfúm4=º¯ÊÅ©©¬7Ý%T"+'MŒ•®‚90:þba°»\õ’­’ +)`ªØ@4Ìé8ºgöº¸¾¯\¿/Y/fYì HÍ.¦põYøÏÛy.®¥ž"+ÉÌ[/õ³fQŸ³8qësî|Î6rûúŽý¾ÞSýÞ;JÅb&>¦g’—˜mçê”Uó¬›>ßÍÀ¨'·öÓ g~¢Žéì®;ÿ…€·Ï}²6õ‡Q=EòO¹¿uõ1+†„S|“¼±g;~.¯œ›ºÚèš½™ä¦’¼'OVúþUœáÔž¾ÌæPQo 4ÛÙðŪœÝ‹ùth ÀHEŽ‚ÁÒᒰЃB¸± G¼î€~én¼Þ\áw}qOggS€¾G ÑNGîP)ÿKGGFHL_]]V^ÿHFQMÿfLKMJOLZX[DIJMTOWÿdKEv8¤Îp ‰F™tFþïšJmq²^Q™ÕRavc"Ï)Ú¨okQó­·Zcðz#§ëœ'†çØÏ»ñ\c­Wo;‡^Ù¤«‰‘eB|M§«›í¦r«ËR,"¾>VîV¡öò1›:£¬®Ì¦dÞÓyÍþþÔ÷æ§úOvÃ3½!Ù¦êÑ&éÏïkÉò_Í “ÃúÎæbWåÍa˜’‰x{Í”}öùÔG÷¸vÁÛTמÚETÿ˜üFïïôa-ÞžÎìÍó2 Ÿ‡nˆ?ÍëÀÔÆ×ÌÄÙÿn8 “qv‘¶0mïðÈ}%þ+ G¯#@~ Àû¾´æàõÆŒïï/ À`™‡V$1ŽPƒ‰B$¬p#,}?@#)F¨€¶‚—yôAí,÷f»ø¸MUD–½}øúØùÿZ¼ÞLe¦¯Íw†"S==0ªøóú }¦¹^ÔÈS+-æ~öZ–!óNhÝõ×j}Qª¤ ¯óð=´aÓçsÜoŒ%î[¾²¡¯§ N2`´QÀ7¯<ò¤(6DzÏFÂ@^HgwrÚ2Rš¹–Ð[Óú©bö(äfá"ñÉã'óÔÖovÚy¡áþdæÙo°7°¨Û¦{D¥¤ÚtLI.³ñ’ŽñÆ£ÔHð±r²„tV#ù ë(Fú¸yþˆ¯R/×ÉÅoamQ¦¼üšå¯gW®dÐðG\…à‚Õ$’+`¨øéû•idf*‡°]›äªTœIjEè¢ãݑbÃÕçÔ"_Á ]QèÀë#}+5dZ­Åâ²[Á2Ü´š*»YÀ†‚ÙùX¬‚ !n3Óða¹HGwØÎpÍÌv†}-ëç¸ë~v¹R‡OAEà7±l.ƒãD}uhlRSer[¦Ø v™Ô¥lIÿÍZAš`ÕR8* ^_H[JÖÕ“›:øüÊá¯ò£ºÝ[Ÿ>z–åý?6–Ë^F}Þ®ç~Ÿœ 9§‡h^/ÛÿÛñ:løqCåeI-ð ”Z»¡ˆÇ”L4üQkå@.(·ÍÙÝi+UÙCcKÀDï@¯¾õV<¥úvÑÇ­,ñ«/_ÞŽóõîÓÉ_‡÷iS5Ç=¿7yþåm#ªÈ7Ô¯¯TFU`àEà_: G2Ìý}€¼´ €*Æ2i6áÚìóƯÿ‹ÓÇöôy¾7UßÝ/£“íëa¶½ß üññ|üËez¨…޿ɉó}õ{¶÷[¾‰*n^Ü7\>±ãGîí+›ÀÉåÛ¶5*ȶJù^V>M®[ÊþZÜëÇíë¤ãùó¾jÒzõã¥÷ŠïÛÇGǬö=N~¿ÂØä(7¾-ÞŽÉVQbOÚÖ‡ád¿¥”ˆò£ÞÈëR"7" 2É—™0ë§o9k¥,ïêù7 Çeؿȴxþx‹¸·—ûr<¿É£™áô ø[þî_.-pAÁex=Òx”Ô/øðˆX¥@#QS¶ .R˜²(£Z§nFŠHgm`ŒÙ¶Q ?Ò(A&ˆ ©d¤ÜŠÁ9áÎј6vÁÖФ)V7¸‘Ë/äSeÍæí+W>Éh×ÈÒµƒër)¤ˆH½*V–‹vŽ eQÙ¹uÅW\h qÏÇ-sÙŽZe:âìþ|sØþþÛ·ˆûr_‡þü|ùu98gŸWOï³›epÿŸ«²æPû좡÷wzëÿXî·ßÎDÅdÍó×@U’üNNާv7»è÷y{Fw>£ažaº²²’œì$Iëàhù¿ëÖ2œñ¦’ä§Ú£ìê©ÌZv ìE‹qáÿNOJ£8}ŽWIkŵ[ü½3XÀ…•ù¢˜ýôq/·íýÍ%ñ @d!ærɯåxÜËóýé™ÝšÝYY0n*‹ùùÿì“'h^Öžž¶\ÔÛsu 8 åÌË< àt”2/{³œRʼ ޝoæc’ÉÅ0ퟑ&ù”ÿ‘"Ãÿ3‘èKp§x™FÚ±q½ªIA¹~BæûjgoÂì™oì™´+™òuY$QÄ&ZAÓ´}F”1‡]è »žªO©Ð¨³Õa4Î+>QuÛáŠcêMís=gS¿n¯ÏÍf]¬¢ª)ý؉¯ûí)eìæV?9õgÔ˜QØÿ-›6÷úý6›F4ŸYFÞ6Ù™ÞC[ô*IW«šB)üÈTUïGµráp¨>);+õ\.‰Õ_åWÿ ù§ü‚¦Éß‘&ìÍ  1¹YÛ^!s ËçXæÚºrôû{û9u¬ê‚BUúrŽ.ê#¢?kF–ÃRLÜóGÛÝküƒ]®²§„,ÆùX¿¥d¦Àþ3aD0ö0.G}*N=ä8ºì¹ ï;¢mŒ¶¦‚X~DB&Ⱥ\SôìÏêv.Ýã•‚”i9œ&uÚŒ…×\µ9nfMì1j´¹‰"Ú‹\ .Ç®£ªUPxèÚ`—ŒÕÑD[„œ›ÉÁwwUÜ,;{†%d^Ù²8v-OTBÕ™"ë°9L2sŸYgûþvÝuº«f*ך:Å“7/C懀}2³pßãÌæÁí/iÏäIúa­ÿJ³ô}¸Ñçð¶ßuOÀ‹ð¯™»0ùTžúÚQR93U Š29´ÝdQ§¸©j~Ú¼»*³‘áÜî]§álÍt.Ãë¯ «êéëJòKýtŸÉMuoö\ÍÏ0“¢«W¥œÌ9§:X·™fšç4ŸL›(û/ ÝÌÌnÔ 4Ç<œÙgÿçZ©€¢$Ê.n ˆ€Ý“µ?TDŽv™Í(=&`ÁÍÖo÷CXO"€Ôiã ½™šŸ‡göÒ,§ÙÂ9³ùUîþ¹òÍÎò¢ç<Ô>è¹ÔŠà?gÛl*«eg¥Ðè~æ²2mÚ…LÙ︳§&Â. ˆ•éZüÚÎ\ä²2ßîyyM¹ˆ/ѵ™å3}'–ó•ûnfPñÇþyš÷ýúê\:³ÔB¢× ‘ã²i­ÖóVlÃõ«5É&6!~’¸|,‚íª(·w¾ŸgWæú뀉ŸZžLÎÔÄÜžíŒiæÏˆâ‡èûkZDNkPÂÀüàzÓl$̦'Rãã{Ú²& ´ à~¦­Uà“/¶ËÅù7ùäo z/¬ŸG%QÞß;ãôñ[þ—(–Ø×ÍglëêaÛ]¼åÛù©g`þûÿë\Ne@_·bìÎorÊ#Q×v;˜îî´ 6Ò( XÅokÊUÜ·FÃE9$v¿ÉÓŽõõÏ)WýZkökXÿ|û.v™£ï¯ÿðV“§ðÿßýùy^4"™b~.Åa ‚4"­¢¢ìeòùõN拦M¯Ewèt¯wÿ±³çû¬Yl/'__M,_eúêOERþhŸ"˜¨óð}™<fýáYï¯û‹ÿï $.‰–ˆC$‘cQÉ0*7ǽݱÞ"Ë„•R`š†.Ù‡+Q/wÆíñSoö7ªþ¹J#¡ÏÙq…yòL}HÕ1¬Ž0À‘Š 8PЇ<˜®LýŽ55·¶¶,2Âf!Hn·Ò“¿r¬»,³î˜ê¡ÙDúwHyU‚!?_ñT½oõT'ÔѳS¹¯|BaöÀÊ@‰œ¦Â#¢,tõB\>·uHК@p„°B‹4Y[C,’~¾>ïü³kÏw©ü“ ôud?{Ò ÍôÓ §‘[¸ ù·Ì×µ—çÌ ‰Þ€ÝÛÂî(}vn—e šý9UÇ2ÔL: ô3íNþƒÄ%ƒp¿ÿøŠxóÿ‰Yâ£9”½•?¹÷beåÇÒÏ’Åöm¿ Ác‹_þêE,V=$óÉA †³>º¨=±ÝHsÖèð“Ðí;A#åy,ÕÐõü×7ñú­Å±×åúõ©…y¹¼Yo´ì¢QÏwÝáË\€»/nïÓ‘ß_1¸Î¢·K4\Í÷u¦gÏlvɽï`æçÿöÛïó>¯÷Ô$¾—,²_†Mžô¦YµÿÍææ¦ÛucŒM’¤" ˜L_ÃÝ…î<ós4‡Ótt°eä!çz¶·§·×À<ŸàÏcmnÎ777½h˜à¤„|ƒcÀz€§ @^v|2§èžƒ®‹£`Òi7™“RUîò?ÔG1Àu,jOË…Ù°ov8º„BÓʹ¼›fßÙŸy½» •êõýpÓY?½wî>$1Ã{ /lBW£b•z  žv:“tˆÎöÇJ½•€0çãIÆ63GÛ-ýh§Œ=ò+÷C펺›Ï[Ÿ:;KŠ¡Žý,âOggS@ëG ÑNh'¿LFYTXÿUÿVÿbÿeÿ\ÿUÿEÿPÿOÿfÿhT&CrÆ|Ø‚xÚI¥‹.„,ÿ¨`™¦}f+€ÀL­Žñj‚ &ʧ"Ni™·:æÞŠãîmó^ü⦦—.¢(_7"³ ^˜Ô,ƒsH CA8M‹Ç`M,·¿!MÓ>¶â€¨€hˆTÉÄ©cÚšŠ¤Îýs£ä¹Gß+¶i:Ýz¿ê4Sß8`$³q IåÝ*8…lj¬Â âi|€U@3@}—†öÈZ_ÌuåP¾?Çíí¿úå(—߇ëãïR¼~ö~ñþ•[û¿†k\¿ó¢Êë;L^òõ5·A?ÿ#EVÈöûlÁÞFàÑA`ï¥PN{Vë-ˆ´¨à­Äv7ëö7¡–?^”‡ëq^?ù>\Þ¡·cô;^£ã®FùÁ¼¼ï±MXº{Îý}½¥{†üþmm¹ÚüHjAX‡Ç)e)Ì’¼xê,ê-"’‰-ZÎhÍNC‚ÝHróñyû³¬…ºlËaÿxå÷¯¿þqm¦¨ùëX\rñÍÏ›å!¯Èv8ÂôeRùú”úf„)lXÁΨ‘.ÿ˜Áø|>yJUf¥,DU€}Ö·áÛ†5Ô ÀögZO½[cÜCÔˆ@(_ TY"†ÖÏ_ŒÍïŽÍ2 -%5±íV,½‘!l0M»½$i,û¤ß7<>àBd\bª‰¾\Š HÂ%* ³pÖKO“Ô¸Zo/o÷øÇÉéhÕ˜}crö)škL޼6½µž-þ*j:;N?ÙÔä»3'I†gNQSIïIvßߦòèk¨\3gÿnæ\;t7•¼°—I†ŽÜ˜–ùø×Yši訋‚Ì$/Èùèùy&óß@ ŠÚÍU•ß“Eþ§rºŠr= LIPPµ1½¶<Þ-Ëåÿã÷€»Ù?™u6É¿™gžô•™<ó\dQ;î©]@ÂÛßsîòxÖZî*9¹ðS D€šzà±®3Íg”D²€òèÁ¸:£&þ(DIC„ñã§c\~oG¢Ãéî¯û78{ý¡dæm¹ ºsÏ“”•r™ˆÞ3茤~¾ï¼y¾}hómåÆu½vf÷)xrœh<Ï©Lÿ?JÔSPû¸:ç÷}Xªg•éY‘gØÿ–éÌ 2ÐÿxL{ÓCÍ©¦)Þ]LÓ9Ýíì'²"Fçœ »keV³i¿ ²˜î«ÚT~³LOÕEÝIYÅ Ã&fššÞœ;=ÌÌ—(¸S4™Æ ëk×°îP€â@Fnø>h¥/>ó3 ôàZh\¥èOög‡‹B0ÆoŸªjmJ)CHd’Êʱ£È|vz«oÃ"BöÀ§;Öz‰â­&²5…¡µeü¸]ìï\×j”cQÜl¨•è›Ñ9I´Ë­~g-WNx”õ°Ì åžQǵ»³Huܤºg9sg½Ïòy¤0Ög']ì$™²¿òœ“±lŽ®1ÙKUp×Ú®3»/ÑùjHvŠç……ÿ8Müåô»N‘îú]¤øˆzrOÕéì{CIg®þ§ijrj³³·×=>¼÷äXÃæWîžI PÝ^§Ù¿“j¨;ïJ†ª"+‰†“øNص¹azÂÞ›o{Î凟¾ý;EèâÏ)±yN_Õ$³ùãZ*>s¦É$¹(r®ÿîX\/›,zÏÑž¯Ø™æŠ­€ ®ü}«wÌ€}.îþ¹óLo<ȸg— <ÀOà–/žX\}ÌÉÆÓ™Ü|á÷ˆþ€L‘)BDqº2Ÿõõ£mÍÔLCŽL´Z¬!f/Šv±Œm"®"¡¦/ÍÚ>*[TÊ&½Ûz_gId%×Û5­øËV§rVžñ¹N°o} .ˆ 8DtÎÈŒ+§öüTžÕ Ï(ò•ûe{l´¸^.âß™!ˆk:Ãz/ëÀF»3áwÆÍäÖ§hÍsJ?ÿ¬k†—âø‹ÜÈ çžÙ•ÅÛèîyÎÙ¿ž æL<,oCKFòA2úk0žDO§«.Ïd{×›M¬VSÜÙPä²nÚ}¦ù~* ÿj_UWuW0äÙ?ÍT³û%ùW»g{kÈž™q¬‡Wl˜)²ç 0$ÉÙ?PÛ›zŸþçÏsI÷du3¿s)y>}òØÔ2ý|öýy¨|uÕŽÖ¬Ì'´ºNÎIx¸¹ÞèôÌ2tªÆ½ówg|N%œaÿÞìy @c^èü’SCO×évMü ¸“f9Ó:<÷_ÝÖÝ·Þ^Í6ž›«1=}'g7Pw&P¨*!³’Èëôùÿ•@¦°² URñt¹çúÿSÃùÓÐ3Ç%¿/}˾ÐSç?]ùÔîÚœÍ×y*{²;û›ý%« r¦áãÒ\9˜õïÞ͵¾n¬¤€·¡€Í©e aÛy^÷´z´±~iüt)»9€Æ·K㧉yäãÛèïæ“ú¶m-TUÀ1¦Õ4±Š­­šuv6QÓF¬ªUclV­[·Ù–6ÛÒF3ó–6Úg0MË6,µ­ë^V”gD”˜]’‹ºjW^Õ‚ÔP¨Ç ;„½R×Ìúce:ßn®±t“÷ôñ™Ì÷aÒg}€š÷ŧù™^y•å*§yæäÖ±}ì7ÀþözýÔ‡ÃæGW_gNUY•“YY&¿L’M’i÷yŠä®J9o’„gjyO¹wç4»7;&Sïu5TÕ?[£SY5I½ôa^ éÝ™\TÏãNŠ"Ï¿i j¡®â¼ j ´Õ¿[ÎÌCf]$•ƒŠ*âìÆÛãí5Šqfÿþ{W~+tà]€•uïÆÿ°fÜÿðñùü‚ï<À0_7Ü$7¾iü‰=»œÀ¦ñÇ·¹ØÜ¬í%`ckÛ¶­ªš*"$€­Å´Ôu6v¶v©ÕP£Ê5£ÎbµvBDz°7E]¬ZkÔú¬cIR…³$–ƒ*Àa‰ª¥âØ wVúŠ rÈ×3¨õ>ÍžЛÕÌÕ“wIAͽy¹ó=~®É"¾RõCe¦[ŧù(«®wÿvõËþaön’ãMnθã'Ãz›óÀûŒ³%EÂU$¹Wו­¢Ï0ÃôÐ'ßNHã‡XãƒzçL“wž<8ïaEÐSSä•õ¨ÌQYÐïä'Oõt‡ÑOº­ÑT.“^&?÷çG/)UjŒ‚½~Mýkn~e|3.ñSö\>`3Ÿ˜¸ütî|°½_1çüVÀàJ§_¨ñ ÕOŽšt»+ÀîÏ Ö–¬- W\bÍ"€¹áRJ&Üi2§ ;Øæ0ßú¶­ªJŠ! †1É6¦T5ÃSÝx´à¥O¬ˆz#÷! }謦ÕìÝ‘4QMxu-s¬åª×/äNN%;/g SFljÍý8F–YÃ.¹IÐ̧¦ñÛÛ›¿ÉÄ,ïž: ”6qÖΊ¦êR7I˜×@ÆlGÅyQÕÔ¤™íí„£õ©çªž*òr\¹ú éq/ez¥‹sÑ.‰JdÞöς܉EÝ™PÝ9_D§"Žé‘³œÊ¨zçÄu]•ž.’¢ûêîÜ3ÃðÖÞŽ A‰òª;µya\ížLà¢F»ïi k“o1ƒ»¨ªêœ/ÅËì\.w´>øy¸zWCïaÝc?/†]ûðŸÞð·ûøðµÄÆEÎÈpŒ K€]n>œ+ˆÇqF좦£4 Ɔ]Ö,„ÃͰzØÆè˜­ÕWUC*›Y³ÞÆboU‹M©OZ´VYTm1ªšÁç*.»+m{Õºn-Y5ŒØ‡9ž–E™º:¤Žj¤26¥PJ‰‹FžR°UBûdq‹Ìeá=àÀgŠÓ8gUUUÕŠZÚ¶m«‹j­ju)í,ËT:´Ç52¸ªœ¡Õ#M´"™‡HH))‘¢@,©HÁD©VG’RµÊ…ÌTfBö«wg?~Æ40ýöïdA¶™tÏpf™ƒÇ–mcÇ{½=Y¬aÏñvL)9NøÎ® «‰‡¢‡² &ÊJ®vEh:(+[„F¦îHá”'E€Pg÷£€NeTù¤Ô•,X©$;Ïôþ©toñÃÎ: @=tÙ¡;z[ݺ^j<Û¸l{\U93÷xÊ7EQàŠ·cÙâš›pÎ;1õ¹˯&1Œ—…‘e€:zQ ô-Ú ³ ô–*«Î˜ªòZ5ÀÐD·óÆjöHŠ/ÀZ„HTˆOggSóG ÑN¦àìðÿqÿ+žFìuO¸`(fiÄ^÷x¦ôzØêÖZm­¡¦‚̬Ô[¥¤¶µlÚ%ZííLk6ÛÂfk––V,-T³Z·0ó «£ÇXËšukc¬ŒÒ¬UQU\«J„K„A„Q„A„Áº8Š£8²,˲,ËK„ÑÖ­[·ZV¼X–³Ò²,/±¼xq~÷õïƒ.ËRq˲,ËQÅѺ¬ ƒ0ƒ0—uYåe]Öe]Ö` ÖÅŠeyY—UÓ–—u1@©(Цb¢(ŠÖe•U²¼„ŠeyqdY–G±,+V,ËŠ£XV,+Ô¬©)ËÂlBVÓn§£’e•VY#Ë˺Xë/±¼¬‹eY«,+–åùü£,Ëy)åÝÀÔWœœDQ|äŲ,kz:E“(£é'¾wuu…€w¦ûùóçÏŸ?Î|g) `#%ò3VµÚXºÅu·e­2°A,Ì’‚ êF¾eüsÆ70HáIQ`¥.ãïmüÒt&`më5‹Ð†jÕÀF‘€wúÒÀ°¬$CgÎ3ôÐLÜ@ÿÛŠe¹÷ù?=Ï4ÐïÃÄŸïU£š Ü9•¦ÿ?9³z€Êï¯oVP0=M]wÌÏÿaTŸÿý|.ˆŒ KÆ0¦,`.ß@¬Íkâ“e¦è·Ø4cjŠñß?ÿŸIHêºõ~WïÎûàð Øå`eP×Íu“UZ›é¡ •Õo3ÐïÏ®˜² û~Ly¦ÖU´Ì”6ÙÜ\fj »IzyçPY uÝW15µ`Øu €gœë7Ì›‰–t €, AÌc:ªj°'9ù…±d´.YªÎ›æ‡d*plee-the-bear-20251226/bear-engine/doc/examples/09-sound/lava.ogg000066400000000000000000000467551512343254000241470ustar00rootroot00000000000000OggS ‚Ð/Ò‹ø­vorbisD¬€µ¸OggS ‚Ð/kU@Yÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿvorbis-Xiph.Org libVorbis I 20101101 (Schaufenugget)Comment=Processed by SoXvorbis%BCV@$s*F¥s„BPãBÎkìBL‚2L[Ë%s!¤ Bˆ[(ÐU@‡Ax„ŠA!„%=X’ƒ'=!„ˆ9x„iA!„B!„B!„E9h’ƒ'A„ã08 ƒå8ø„E9Xƒ'Aè „B¸šƒ¬9!„$5HPƒ9è„Â,(Š‚Ä0¸„5(Œ‚ä0ÈÔƒ BˆšƒI5ø„gAx„iA!„$AHƒAÈ„FAX’ƒ9¸„ËA¨„*9„ 4d ¢(Š¢( ² È@QÇqÉ‘ɱ  Y HФHŽäH’$Y’%Y’%Y’扪,˲,˲,Ë2² HPQ Eq Yd 8Š¥XŠ¥hŠçˆŽ„†¬€4CSøÚR,1Ö\wƒD‚3¬$޲ RŠ1ÆsÎ9ç¤RŒ9æœsB¡TŠ1ÆœsB!”Œ1æœsB!„RJÆœsB!„RêœsB!„J)sB!„B)¥ƒB!„J(¥¤B!„B©¤”B!„RB(!•”R!„B)%¤”R !„RB¡„”RJ)…B¥”’RJ)¥J %„R))¥J!”RJJ)¥TJ ¡„J)%¥”RJ!„J)8A'Ua£ €BCVd¢”R)-E‚"¥¤KFsPZЍr RÍ©RÎ æ$–ˆ1„”“T2æB BêuL)-•BƤØrK¡sA€€3ÀàástG€ DfˆDÃBpxP S@b‚B.TX\¤]\@—.èâ®!!A, €œpÃox NÐ)*u ð\ÑÌadhlptx|€„ˆŒ|$%@DD4s !"#$€ €OggSÀ3 ‚Ð/5Rj_*64,28<ÿÿ ÿ03446A?=ÿ382?EBÿ!ÿÿÿ ÿÿÿ ”ÂØ¾B¡T ŸÿÏ~£iÀb*ò¯äÌ×Î÷ýyzOg»oì;ü_÷žìÿ[õú3µÖkÖø„Âf)`Öèj™êxíòºïL`³ @|éÍËX;FHzÔÅ¢[•z·§0çׄbc«Ô>.Æ‹Î>Ôñ k­BV®ÇÙ¨ìˆ0,âÀÅxrüEJß ÜÝ]ëW ¼æAþ÷1·Z̤ÉfàqƦ%¦ÙÝ4—¥$swÄk)Õ%– Ñ|7ûh¤Ì±C͛ޔj€ì¼–‚€ž'æñÔ£n22MfÄÀæàÄjAÔag´dŽNGReyj]òB­¼_F=wyº–´i‡+Ë´Aº‰eÀ…` Œ/k`,€mþ_€~z³33£("‚9fU¹ªVŠd&yrmÁÑJ-µÈÈYXä¦#ûç4s&-u#’_ÚõR ÷/«Þ±9Œ_ÖÓHy¼pÙ‹äêìE÷zoµŽb¦0B$!bP•íжJQ¥<™c0- ‹Ä6‹‘+Dᘅˆê¸¡õÒÕ‚$ô0« ÐÀЋ4/¸BòÎA4¢¼B+­e9K%ÐíuF,Ë"V8Kn@º%{E– ’´HÂvcÏu¸—¸ÄÌPè ¿^¯)¡wUˆÕ¿)ãÕ¸aÜ÷ã(ºÏ'n,î3Fÿz‰äôˆ¥úã“縡KkãÂytó3ŒÃøÃµÒ¤õ¢¿¡Ci~¼í>e5F•ÂòkÇÔ3]Ћ8Óìs@Ò¥G™rÎUeVUˬ’Ä–tÞ&Aû!-¹ïlÚí@”EËq„J‚õ+þAnéjÑÄïáZl_¤!íÂã;U\UD¹x®Øâã~húykÒ C eÖê®ß¼\£gԺβӬ9µÖéŽR©êÙ¶MV+Í¥ýý {¿Èóđӑ LMvÍg§¦PFz'Êjf:J{Î[s0íâáåk•Œ“X={µ§Öœ¨F÷ZµjhJ–âðæx­h©«‡<Õðy DM¸MžIÝ­UdY¦–)®,ê¬>@ƒ18É×îlnâIàY?KÕQ™»ýP»EP¤–ÈëQ*õ@Ö`°a+,Y1+TQ[¤€& `]¾ß¬,‰Þ´cÁ.¯àÞõp.u‘0âYW°í÷*T.;óêÏï¨Ct]”¨pM‰¾u«ÙΆ\(Ú†æülõ{ŸNÂê‰:kaŒ§â݈KͯآÜ7&”te=¹÷¥õ\Þ®iK¢ ¡¡|ýÆ”µ‹õI^ìËè\ν碉¢å”¼€,]Ù5™ª®”ª$é,½ õ‘»CIÑTQͳ,¨ÞÚË“c àí㑾\§Ùë±/O£³zïÏ3^MãÆíJºH´WÝjÊz‹ï®\kÚn5T•pd]„©zo_¤ÉÞó÷<’¤â Äè}­ÞÌGgÅÜqÐzë$õž±+õ³IS{êR¯WnÍUe¥¤šÔRÒdÅU¥·£*PšëMÝ%!€ ß.8ö‹Ñ(*|Ÿöäñ´©ß£(Ë㬜èmþpQÔ“.¡\¬ª„êë&½ÿ5'o£·9ˆŸf³þR6ÆCsýË— UjdZM¹–\„­Nié‘ʹA×¢yN]Æ^M•~Õîçr¢|.¥ZJcAT¸hýíMkqf磛Î(žb6WY öÃÎ2÷O™µph‚Á+(vS »P‚¸ÒÝiŠ1×B@2à T±„XͪUªÀ ‹©.F¥(ádÞ²Uò·ÿZXd~WÿA,-¦—õ¼òü¢.'Rõú$‡ÑâÖ®„fLUFûÔ¬ ]\§¾ÞÁ’›·¯è·ÏÞiaRqh682´˜> žŒ‰tp‹¿£7Tx·0:…Îd¹s±ªj%U•œ˜c¡)Ùmð9çTd8EÓë #*Н­®¼Ýf]\µï±nz¼µ»ó³=«ýËT‹ì1?" è&¼ôêäô8‹ývçÊ`@µ,N1¶<Ï0…mˆJ"D‰––E8ÜV/FW…Qý²m“ª)I$ϨĄ€° IÆAC'‚¨˜¤ÅaË’CÄúžVYµÙÆÔÄ?–Ç+»Â®ég2­pÏ6Íö^Í–+mà*¦D­8Ó>1Á.¤ûeFç~6íñáàýütÃÏÔuÙoä-í`î¼=NrZ× Ûu $.ƒƒ ~üÆŒƒ¦‡=î- éa½7€Sè̈.¬–«XåZ¼S/'ª¦¸•ÕHˆïž?„½Õ*E’•wª–ri«G+ ˆ†‘ÜM[ä¶Bõuj m0¦b8„!¬a…C…Â:‡ÅŽAi©H @1Pì–ñˆÈd‘`j:2 ”¢Uب‚ “†6@k±$”`4ã«{ITR,+e¶mÙ‹) ¢ˆÝîXK-KS˜Yù™ðû MOÏ×W¹u—á¬ûxKbY Íec«UU¥)Ⲹ۔.Ób%h‡ÏIzD%rzE·4õ‰¦Çý˜µ¿p,A+U÷Í\n™èŸ6¤›»´qßÝàNhFÞ NµÌÔÃý×V‚T0S÷ŽØ™¥Q çs¬*WjdwˆÒd7jAŒ„K¹æÁËô‹½C¶ª\±l|´l r*¶d®§(}.ú{e§¿jÖ®z¿Âk4€¦# Ĥ @ŠCˆLÛŽÝ“ J£ RJ•v±ª*±Ñæ#íBJ™ˆžñ¶…“ŠÁaŸÜŠu€ ûÔu5,H,aÂA­Egžj©*z›´ÒŠÄ:) UÅâ½Êßcï®k–1øª5Á³Õ”wùz;"ëó„M£Ò֧֜ݨ·pÌ uÁ(ªÇ3’w3./dÄ ueqh^|¹KüÜY‡ÒsâPÕ ­^,^Z*1i¢X 3ç^dHn-à :#jF\ŪªjÝÙ)µD‘H*µº9KìCNG’…ÄôŒËÇSõ¦j£«G‡$“ª—j ²‰-Ñœbu4ëÖ‚Ñ„rÆ)2]‘MIõB7Î…L­» ´‚†ecA©^XB0h±ÅÈ =º™÷Ô$¥+Ò´ëf*ˆ†°,ÓE˜Œ$c fè°æR)–x¿ïUm$‘Êò°ã}í§™Y‡Ï0~çÅ¢·=c—Ã: ŠŸpÍ‘¨Ø}±¬ËÎù-¶°ílpR«éªRe¥Àáî›NÛ™ú²à™"{à:øx:àØšíÎØ ¾<>æ0@wy¼Ï5HIèÞÛNf”QsÖªªb²Í¿ðå@UMF­4t@ÄïØJ…1nÁ¸B«®4´Å´ˆF“Á \=Ò©çÝ£p}Hh&²ÜZ« e ^@ÉCdÜP¸ GÆ ¢Žœ±T&k)T\"M„'Ò,¢Ó«-ÂB-Hh­²ĸÂ&Æ@ KÚ˜lÖ‘KK`l¬„6ƒñÛSêçºhÝjˆwm+B%×3¬“P$ ºíuW“¥ñÖ§u¦‡¹EØÇÇ_“]o;G3 cÎÕ[ æ™e‡µËku¸x/®†~ö HŒÈ~WØákÎL‰û£}í- U>^kŒÀ™ÐÁNSŠ4Æ`¤Ö;"ÀîÎ%‹Å\¬ªêNbH-•T5Īìí¸!±Ã¥W9Ösµ•kK½bLå̰ˆU”Ôâõ!•êüìíÏK¹ ±Û«NÔœÁ+¬@W¡%X[¦˜#s„"š\¶¡+BPÂc¬ǦLÇk ,%ìnGZ{…lXVM¢4–ص¬6á ¯ÀbÄZ…“”iÙ^@*:”ÆtÆhyßF³¿ ÕbE¥dÞ•Vh=ןj lÇ\Då2oZÇš«IôB†Q …îZ9ñÞùU¿ºÕ9½µhsº‹2éV Q)bw5¬½Yïm¼öÞ¤ü5Y(BQPOggSÀo ‚Ð/‹ö/#ÿÿ ÿ ÿÿÿ 0/10.0?Aÿ ÿÿ þÿÿÿÿ žî:•3t&n°x1a„Ô°ï.`:{&…š¬«b®ês kãÍRT ÉGõ†*º#fHÖÃa+G{--1#[A&葜¥tYç´mÏnÿ¹’Ô\­õzl‹Çæªt3ÒYH³Põ”Ò¯3)EA¯9`´)[Q%5UˆpHÙ&S3©Zfl—¡ÈQ,‘mjYmp˜à2ÙŒ:–@–µVš&JT$Ÿ R´ å%ªšRÚèuDI-(¶FñÕW¯øSãΥث§“Ñ&rÁrQ\m¸8v“N61‚]ö1—šû3Æì2Ëéªä¸ô¨Ó%ÕHªC\´ZÖCtNürÝ ¤tx梧ôúJÔ&ƒ¾ëe-iƒÖ]ìhR ¥ƒ¾{Ö%{’ÎL:ä*‹±bUúµ2‰|Ü¢5¦ö5–…Å0ꠦĽ]–îX«ô’ŸÈˆ†êÖz¦œ~YŸ²T¡A²˜ŠT$‚{=»Kµ¥È°¡Ò X$Ô!¢0´i4ŒƒT䘙i3Ä`¢j#ÏŠ˜Š…K)‡FX@%ÌZj·dÊæPµÕË”Öl«ƒ ²aôzp}ÑS°÷Ä—íFÓ¨>X}²I.{Lö@=\ßbЫͺ% ;’ÜÝ…¿8Ê‹}QÏ ‡ÔÒ·ò¸q·íëfLsªUÖiÞ2˺°çƒy©ïܸˆÔ“”h6ÞÛ]æp@…ýË]Ö0@…}‰vÔËÈžŠ•ËUUhÑ„Æ&[ä}’cß;¾þwõÒz¯=ú+W;——>WÞJ…„-tŽ,sz*y®vÆeQ³*Ûn•B¤8m˜t±¤]]Oɱ­[U(E¨#Ú4±f- ‚°PzSm+u•ÂzØMUkU“ªfoiÚv±*5H` ž¥Áî–TR'ö®‚7q€Z!ªÝQÒDdc„! ÆôyYä{tkœd©¡a´XØ ÃóUñ¼ûñé=ÄfðÅzÁ>Ö­f´’š‚ÖB¸‰<8¿ ‹¬8¯`Š!Æel®éSxóÝB•þ—R;dX˜}/è Kü]ZK# ¿ß¹ô4‚poX233#V,V.VŽE±åûFoS©lZù a¥0©H4–jÆ)=H GIK¥:VhL¥UvÉöL¨ ÖY)!dÐu»ÛÎ$@ØPR‰%T‚ÈÀÂ]`R„¬ dCvÏ‚MŠÆ„ôDEiÀq«”2ÛDe)m Hv)öà‚QER¤@†[>‹">Z”¦¯Ë„ÀíŠ}Ócæs}\_t†bÿÄOØò¼’ìÀÙ»Nñ¢m,zl§Þýøi‰ ¤sÌyb a²M¢º¢¯˜â6÷qË!§®§öO×ZD’Bz‚*Ë=Œ´š´ã4›ž»§0Xo¹c¯Q æ{ÛXvf&IeÅ+–Ä\….ž;:ò˜c/S>Y·WGJ¯\±'«Î¤‡Kµ—å‚¥h+i—QM2Û9fӋá{ÊÓ`ã© x­E6™Z@0cœàÁ¬¢ÉN9p,C®ÕnUh–xA«´t‰¬›+¿_í*1µÓ.úª‡apóæ†hþs ÿàLĆ–¿“nɉá yãˆéZ1¼§- FªEí±ª z DUø 4QfCø©2D#+£ÝÕ\c»m‘™½.ÏÓZÂÕ׃Ÿiû3£4WMH?U2¤?@Ä*Ï ð®‡ZE£îÌUv°Œ¤ …ÒgÛ‹…}y8 Z^µ{Ì8ww('MÎîšVËBÛ`02i ‚Åœ+WU®ñ»_ÿî¿Î tÔ$gŸÍ4ÞàP"ËË+õ¦½¬Oçª]½jæÕú£gçºízô6“!c¿±4¯jœ¨]Ù HrœâS®Æ¶k¥¢ ,–²iáVÚ©`Úa«-¢0Kð %2=²‚lY®…üaåìïÒƬ !¸è·ïÜUl²6ç¬Ý¾Å –OzGZ)I(U•—ýßæêíÛêwr×ìãÖü8¨¯yz{ýb†¤—B@¿P‘h'Z ÃÚݧQ£éi×ÞëH_û±"eb]èT‰DÖ;¬©ùýçá˜' é¾WHD†Á}‹é‰ ÒŠªŽê׬qA.(ž˜7™½Ÿ6U­¨‹]RÒ:½`è:PÞùL^ C/ôÙ¼ ÔP·3³KR3Š"6À‡ªªê¼­zS·{EêtN)ƒeÐC+Eê;6U:&ê ÕBõ^pRï1){eµM*£Ÿ ™q®VÙ„¦½`ÕQ©°¨¢‰´cw¶QVW³ŠD¼r7Ui2½ A‹µeƒ‡ª²*D+ÀÂ, vñTÝ4yTjR#S^ ‹¨dn’Ä ªË9 _dwª‘*¤PVq’yo©U@TòU k“+émAŸ¹e_å]@OƒáàñEtågÞxÀZr”Zô„-÷·ìc”9^%ݤëšußÈ\41ÊíPǾ ]€fvÊ… Í«ÐÙiX¼”UP5dšÏN:*5iÎrŪª9¡¢Ãj•**¦®H+FðÐèVÌàpÕ&v`3…aÒK†›§N›E¿ÍUjîQ!”!(„D/¹Lƒp Â)–!LÂêŒcš%ˆ„@ƒp©(æ–ë%$bbLÑPËþzsbµGJ?qz‡]°?k%À†*‹¬1eÎÁû–¤Ø1Ò tœq Z‡VŒÓåylËЊa<æ³ Ð(SýÔŽ^ö­Ë5wUùŽ` á_Ó]U•ø|÷þnú M‰®ÌVý÷”¡¡°“¯çõˆT38²Û¾jþù¬FòI5ÌÏ"5 ƒÞ³«O:fdDÓ,—ËŠUU‹Si-iÖ\3Š)†Ä#u–äH“çSu·S­W·”E©lá<Ð’É@TR¨P9wŸ13ÔrÄîWÓ8‘($@ÖM ‹m… ˆ—‰ÕW©TMNJ˜µ³dÔ"Û¥W`¦p‰dpPtá²Ä²+@u 2q+#Á 4ÈCBëBwHCà0zË'?i™rÝqõŽ#ÕáH6n… Yë´³và*CçŠzDž '“óÑV })Æ (õA.ì=½± ²°{Ì~[ç~”—\OôÞU‹"‡@ãúí´ÙÇ^úœŒˆ+ôPÃ>§è‚@À5á¦{”Æ\ŽU•«T¬‡Éd©fLª#÷HO‹ŽÄU×+$Ó+¥Å†Íâ*ÕöÈÕe©¤+µN;¯µ3£RW—޳®:Sª f¤Åí!½“°Òäh䉄øÈ]4j T#hÄjÙUó̱#y°é¶†”²›UM¤ ×SeÆk9™ˆá^=£d —énuVOM Øí g+]æPø-mVÁ9q\?>þÕwm5æm㊽ pñµˆÿQÒ—]†«ç=Øêzµ:§DRÁ-Ñ.ý¬E2©»a®Ë¼ûNpÄ¢žÑˆ¹xšˆP)6ýÜ™:Y k> ÝŽ T<¡yzí \|”*ôn˜†ÎäžY2+ǘËrUU-âËÎÉÑòsÉ5_–7Ã*Ô–¶#¦ŠÇîeåb[¦³W¬LRšE„ˆÐškïKÉgÒ¿‰3i†ÓX¯®š"(iËaׄ6& '¬I• ‹%µ *C 5™Äp-eMu%ˆ(PÖ•1”…E:Á¶UVç¬ È6 C†ˆ±{a[€h[«’Ô½ð°ÅWïuC¨¢&ŠÄBsDc½g+à¯Né¦píÒÞ÷e*ÝÂáj. ™7–5ÛlÌqí¼BH¬|/}ÁmfÔ4ÄCTÃ:> }з²Sß 8$°OggSÀ³ ‚Ð/%ø¡vÿ ÿÿ ÿõûìðÿÿðí÷ÿÿÿ óÞ*]i,ÄþWèI}Ìö\ ØeRéR•cŪªX&u[ÜjJ-RS CC‡v¢ "+®ƒÀad„Á0E½ÔcC÷V¹ô¬Ë\ÌÓOoÂÖ³.§2K:ˆ]«’Ò˜Š0½A*p…Ëu©r4=¥¢-ÇÂ+¥RB %r®ÁtrXlå¶ñ¶çs³:V«§*…TÁ CЏ›ô ¢5) CuŽTU…X$©z‹2GŸ—'9+IÍïçŽækqnÏòý™ì´xˆîÖÓÕ[ŒãÀ¡¼9N¥Ìɼ²C¹>¯ýšÉžöAK3Sÿ.›ëf½7IgáÐyœûì9HM©÷çIº· 뢖>h Z-?­%’9û´Žj3¢›˜W„QÙj=h¾ùœ—‰ƒ”:X7Ÿ£Z²„­Âü´°-°{fFYTVUÅ„ZÅíƒõVq‚(FƒC““¦UÄTW­–øØ˜¸­Ö°•Sºg}i·êŸÊ:ÝÕÒîÅN§­þ‰¤»1Ø­r`Y0eèDN2eÅZ…ÖÓ½Ýî^a±BªAȰK°XÓƒpà“N'+`3´³(ïš8˜‘¨Ñ”3A®fŹ@´XªtúažZ÷z¦‚X#ƒGixÁ«zûʪO(N$5-§´8\ºi..Rž1õÔÒh®kÚ ö› B´ã®’œq&z¸°nW@Rþ¦Ãink²¸Á´yàÊŽÁâ Ù#…9¶À`>ÉLdIWcÓ€ÉLdMó`30.¹Ÿ¾,ؽêÈc.6 ªrc‹mT-5Á2GMIppmbš¶ÔæìP½b–:™OEƒ¤¦qµN?‰V\zûý(US¥Z(µA¢[‹•ié2U"aˆñ”” W'5FETTÒÏqÌ«júU›[ô21©×ƵhRm½Ú‘ÔÂ2U¢­³È&È*"lr1%" X€È*S¤ãýµØu5‡w8_¹jA:ˆ»áM_tÌsþ¾k¿óëˆ_T¦ƒ—4Ý{gK®ÜJD)!Méú:Ë«VšF{¹k7þ#g³>Ó`vhÌàXΓVæ¯@Ä´ˆÜ@FÐ^ -l P)-l 𮢉Hi—(餓åXUUU«¢kSŠÍ>)AÆ ê1yøTµ vuv2 ÓsÛ³íôÈèäT'hV ^¼RÎ(Q”èm:P¥ÊöèÌ»€Œ°# Æ4é…µyLJ’Yª†²cÃ*[‚À^ðiÓèŠ<Èà°ñ@¸HÀÀ¢ÄÕ6E z…츫ûì–79î’çkZœ†=Ë9ÕÏ›¹vJ¾žiù•+‰9xÅ“»:3R^ÒÆb~õ|1½‡yw;ìnÇbF@–2í&¯[F¯CÐÕÃìh3ŽIJà^¹lr8L•ËÆö(J0Ÿ“™ÔˆŽƒ1WUU¨¢wÅÓEA-¦^iV15¼£ Yõb{)Ñ8 4© ŽËV§Ô+ô®{-E £.;tÖ0b‘J¥P ˆÉm›ä³"°”RM¦%¼š¬‚d袈 l>ÕX("Y0à[®ÈQr9œçRö”1a‘€ÉêA-Š,¹M×t ÝVt»Ïp%; ÚÜùQ"._U‚o¢sËÑ Þˆ,t­HÑ Â½‘U¬Xƒ ï¾3Ýé¤f&‹IVUUµR'ÕµFAŠ5Ù­Ü1† [‚4ÕÃTŒ¦HWRT©\‘´kËR£zT5Õoç¼¾eõ 55Ms2Ód ã”`lœe…s2ÚÙ‰0A;´Ýé@Âá’Ç"&¤“,#DÞ÷\DØgˆ•¨cHT&µö8Š;æá­íÓ+Õ±¾Š7|œ˜í§,“8”T½í•6¥BÒ0á⪷[t¤X°ƒÁÕl’bÒÑò ÷!­¢/žQ‘ìõFFÎǽäÖvæ&G7žxôh ìã'æ€À~°°a÷`•¦#ÌUÜTUÕˆÇsäÆ}Èjذ%ÙjâMUyì™ÉZ2>&täPT¯ötŒY»12é«êU™X01`·#­ØÈU T Œ`´4ŰÚ]·MýyÝ'aAŠOIï} €X¸†Ê,»²´ ËmyYÌh„ ò /!“¸~ÔD®¶Ù»D°É«žý8«,ö¶AhV.0©KS¤¶¾\8ØôBÇÄY“TѦ7`Q{ª¯Î!z öÍQD©²£T ýsýO£tl Á`œ›°œ9nÿ ˜í’ÂÊ3·H6ž:}€5»7È Lêô…Ö<$V#eæ ßÏ1’ÎŒR®W¬ªB•FuU³¡r¬ïDÍ1>&"Cã†F$Àî¹(¬“ë´ýÞK;ê´ê\].—«y9Öõ:ªÖW£J¬ö¥öHIΨ)K $âÌ.R€b#„M>+ ÐH±¢@hF ‹œ8 ‚2ƒ¨¼à¦@Ò¢z´Èmh"Éi'$„ÆL‡‘2W´»¥ð>™ã‡¼›sò4î ­×!´áæxÇÜŠ”6BoÕXÑ5î<µÜ×hoƒ'¾¡ÚMŠ(Œfßßµ–/XÄUc¹YUB¾³!÷dg`Ú…Ü >*½s>Mòb„E¤FïÜä‚•Ðki)wýDw'ªÀ*ád £Ñ/tuâ \ŽÏ@™'`% ’B…f$•³,UUE¡L10ELÓ0íŽN v›³Õ4 S‰Db£¨#Š%‘H¢z±/ÞÉ–Œ4F8´+Ù¥àÿ‹¥8FXAªtÒ³§0;Ý ·"©æ©j¯­pƒ Ú£)R¨L„ÝÂŒ U!µH$ïÏ&DÑÁæ{ Ð-LÖª»©Š™pßgä!‰ßy,’áld#@wàj!œÝæGiÇ+ãÚ ˆ+DÉâI 3ÄݶéÀyëά T¥~£™€€OggSyä ‚Ð/åk]ÿÿÿ ÿõü÷öõøþó™þ×Ürûá­;Àpð×ÜrÓá­wkù‡*@FY°dffÒ„†ªª*²AP#˜`ÔõªPQ…J ”9ŒÆÅ GLÊ&¦=%TÎ"À,`%€a°4rXn N‡1¤¤°V T€]Ø …r²XL‚ÚXÂrM5‰$TΉkd˜!»ð„iŽáL©×žJ5Ћê¶`±^Z°V¦LíÌX+ ìãïì×/â'ÝŠK½¿2 :nâdm 7\?>u¹ùîdÏžÕwå¢Û\m´úô}G­X£„ô-Ñ^íÙusý>»I^ƒ1ÁkŠ4».­¥ þ†ì™ÅB#À€7dÏ,ÒLP䣀>™…Nš&$¸ªªªÁ X«ÚE1 uÀæhµŠ!bKz4®ç¤šÝ¶)=ªÄ^T·É¾¬® )»l0ÆÂÑ 5'¤1Ø@¼H(<¢q¡h"Ü––`±Î–²¥]¿_.P #ÅJÀ ‰­Q\ÃôP´€Y§]\D™ŽÄšRÍñ®% V2±Gí|uúük¯Sm…¡û™&£Ë–%C*ÚOjì)ç0ðìÈØ­ ™§#ìN×±š„´L±† fÖ Ý¡OØ%jämr¸n5Ö]Û¿Võ‹ß´9]+;kfËœùÎ…Nª(üà.'æî©hÈÞ‡Ü*“" h€¾äE™íDð©­J@ ¡bôdôˆŽ$ƒ«ªª*Æ–ZUP ÓÁn3­bŠÚ;í¨’®ª‘Eg=5™mÕÂluR2j÷P}*OÍ*¢hBI–{0˜¢C*f”ÑÔZÖÔX½,JFY×ÞW“í Ó:iÚV4že†: ­¹ÆHŸÖ.9*Ì,bºÇµ,Í‚—~Äšr³M±L±´Q»w!:Ú‹L+«¥ "$áH–A2Yò T“ôRR»ðpô\xš9öî"ýL4¯½ìÝy:.ŽÜUÔáÏɰԜ£uÞº!D,RëøíÊî|È÷ކ«“óÜ „JqÏ¿zfˆžˆ|È9_9H‰È—œóÀ5[2¨›bg¡3éHV®ª*«U­V LC@Œ ÆXT´ŠˆSD؃aJn#úVΦgRaÓÈ!FQXRQJªa pV¤qó˜§äþ¡ ‹IQÍ2´QPíÅff Øô¸< 0Ìh…é–W˜Ê&=¤¬spUA¹Õ’½°*)“ ï°¸Häò²»ü¹çãIgH²Tˆ<Òyÿ•ŠTÍˆÕ ³9tMïRˆ^¶Èdpí¢<Ô!HÙXFÓ)#]ÆÆÀP~8Pz±Öçu%[ebïæ~.¿Éøn­ç´ÎÊIvºR¬ê—ûfRôŠ.Éü‘S>ˆdþÈ9IÀ³‘±ldFIʼnUUUmvÃj:˜b ª`»!bØÅÙfØÕ9–°Ú†Aß…hÔU¨*2 b—âeXX ŒËa5fÅ EQ³ ß•Bç%St “=Â&—ZéžlÐ$ dŘÁ˜ž4+ ´È:JˆŽ Hœj†$qˆ\‰I ôIk[c‘ÜVíîÜy[6XÆ6ýHä~‡¦ÖmÊ&Í+§·r0{–†eò(ˆÞVÇ'd¼ïgסï_†b»NüN†ÕX»S¼k+¿]ƒæ(ÅW›SÖ¦(þÉü·Ny+€Oæ¿eÉGscdfĈ"÷PCUU±ZMĞÊAF1ˆ$’ÅÆGÈ¡ƒZ­»n¢k×Û°X7»´£-DÏP¨äŠÇr¹)nXM+€Å©\14¸)l`¼"ÄŠaÊA¸,@-iÆž‡Ó½aCŠ×¬øÞ̼_œrd@ Äô£“ÁX{¹¡Ç4¼@§6„‹+’Œ fõàW-;‚}Š¢·T2†Ë¶Œ} E€õ¸Ö|ôðÃêÅ$¼ãŒó*é®cØÃÊVѰžs-Ö·qÄ÷¡^Ô‚½§©›2-°˜ÄÔÇÜHç0ÒÄm€þèüHkö– aßqÍ!€§‘€L,Y{f#\UU…p°bµX@0-¢†ÕÁ°[ƒˆ%ˆÄѤRud0»v¬1 µz¨¦t ˆ¦dTeY¨Q•©OÓŒ“86ãä «íÕZ„ýjfy0@ ´ŒÆIãÕLÒY@W/j¨…ž¢½‡’LÆÅ±í_ÿ¬2YEÚx@0’Ìâ=ºáŸ}1˜ï„J†Çíժ…‘%$à¬á¹wèýº »•o-—W­×uU“&c—Õ¯j"†¡:¯pÝý\Wö±‘Ö6¦™ƒ^àÀ4è" `´Ñ¾©ü-—ÙÞ,°¹ü#¦Ù^ ̵“.™5lªªªŠDMDPÓb1¬âhGlè ¢h¢‰ÆŠ‹«@zH ÜÈ=»•~âT+œØjdƒ1AZ¸9t7" ‚³oºY—aD¦HÜ#.aMaæjP‹dpòY`"¨Zg®‚`hÎb:‡®l´8ƒd^ ^À½àòëV^¶/üv¯ôi²ƒ8бB—ÓÇTé¦TJ„eÑñ±0”ÓjíŽ=ªfüîÛödkÆàÃã·S »U³›ó&h¥³gMl †]Áu:5™þ©Û Xgi]²Ç#c¤Ìˆ¾¨ü’S‰ À¢òCöô(m$<=€ííŒ2“šaÈUUUµ; »¢6Óf:¨ª¨¡ˆ©*6$AH¶e0aéö9©-SÊÉJƈ@Zgà@Ĥñ„­V )U¡„1Q°Ý(qwLÊ&J {° Å#lˆél P°Ê YÆb€… 5¤]T‚ª PTÔ@ƒSp!ŒŒB|7Þ±Ù0ïíØ7Ñ¡楧ˆ<¿~p³rätÆìsw-û C ™…ÜÖ \:‡?a¯^5¸j?¸=Ú. ~áÜ9DÆç6ÅlS•3\ûÜ®÷9Þ—¼Ç1‡ò’·8å‰^Âg÷Œ2ЍÊÌUUUã±¢‰Ä£hÄA4 Iï(aLbTÁ cPI«2M¹DÒIUp¸ÎbŠiuõ²‡«—C»³®å,ȰeÙ˜ +%`ŒS$¤jÊ©¾šŒ¡™„L8ìM®@ Ä%LÂÐ15é6l+â“Rc ¤ÁAVõtå”1‚ý>´Ä#«ËDÐy«ÆÒM÷ÄJ›š'ewlˆà[!§ôââÒæ¶»‹ÈŽ€û£ùmòHx«·M¥ÎUû»ø‚É{8ê6Æ=\ÈñÈ>¶-µ¡ƒ“5Ô¥@„ ªl—<Ì”SÉ a‚¸än–œ k8#“N:©!¡ªªªÑ06a¼(ÖCD=.Ñh4Ñ8GÃᢵ^¯+Ó]¤tF{ÍØ*©yÖç,«$YIîHf@X” Ò¶Zˆ4“,N)g6Il‚XMyK“+éÓиªÐÚ$jÕœNÐ-hç8%–V¹ÐS6[5öc¶ifV4·áÿþùJZÿ#“v½3Î|f²dþ—|ë9þ’O3¥W§÷ˆ¦£ìrUUU¡ L˜ˆš‘Ð Àމ8^8&ˆÆµ¢G·gÛ鑞=ÓY±hC(4˜Usk-"·„…pðJ!¬ ™!®¾õ‚F,² "Ç#AXAW¼ì¢ì+Ó%d#“·Œ`ª3*9dí"Í URaèlHƒS½fÅnÎsŸ1&5Ka°ÌU9Ûšƒîù O®.ÛéNý¬Ÿ¥—%Ú+kKkLÔ‘brÞíï¸BªÑuäj!ÔH[˜ÓlCìçM«~¸<š¤b»ÌW<š4’¤­Mƒs–ÙÑ2¦EÉÞ•ü•úCWÀº’¿R˜8Àé8¢#XQa1ÆÅÆ&&Ÿ'L„D(aœÆåø8âcˆí¡g+WèvtmCaaa¹¸.'êOýÏP •¡°°°’f'/c/ *Hb#Â(Ce¨Œ…………Eô{{™œN'AAÑw•±—±—…%“*'UNª /** * This global variable is observed in the main loop in order to exit the * program as it becomes true. */ bool g_quit(false); /** * This function processes an event of the SDL. If the quit signal has been * sent, then g_quit is set to true. Otherwise the function does nothing. * \param user_data Ignored. * \param event The event to process. */ int event_filter ( void* user_data, SDL_Event* event ) { int result(0); switch ( event->type ) { case SDL_QUIT: g_quit = true; break; default: result = 1; } return result; } /** * Initializes the visual and audio modules of the engine and registers the * event filter to the SDL. */ void init() { bear::visual::screen::initialize( bear::visual::screen::screen_gl ); bear::audio::sound_manager::initialize(); SDL_EventState( SDL_QUIT, SDL_ENABLE ); SDL_SetEventFilter( &event_filter, NULL ); } /** * Releases the visual and audio modules of the engine. */ void release() { bear::audio::sound_manager::release(); bear::visual::screen::release(); } /** * Loads a sound from a given file name. * \param sound_manager The sound manager in which the sound is loaded. * \param file_name The path to the sound file to open. * \param sound_name The name to give to the sound. */ void load_sound ( bear::audio::sound_manager& sound_manager, const std::string& file_name, const std::string& sound_name ) { std::ifstream f( file_name ); sound_manager.load_sound( sound_name, f ); } /** * Creates a window and plays the sounds randomly until the quit signal is * received. */ void run_example() { init(); // A window must be created to initialize the SDL. We do not need it for the // sound but for the events that will allow to close the application. // // Here we create it; it will be immediately visible. // The engine does not support multiples windows yet, so be careful and be // sure to create only one of them. // // As soon as the screen is created, a render thread is created bear::visual::screen s( claw::math::coordinate_2d(640, 480) ); // Sounds must be accessed through a sound manager. It will handle the loading // of the files and the releasing of the resources when the sound is over. bear::audio::sound_manager sound_manager; // We need to load the sound into the sound manager before being able to play // it. load_sound( sound_manager, "lava.ogg", "lava" ); load_sound( sound_manager, "acid_burn.ogg", "acid" ); std::cout << "Sound 'lava.ogg' by Michel Baradari. See " "http://opengameart.org/content/lava-splash.\n" "Sound 'acid_burn.ogg' by mikhog, based on work by Micher Bardari. See " "http://opengameart.org/content/acid-burn-sounds.\n"; while ( !g_quit ) { SDL_PumpEvents(); const double lottery( (double)std::rand() / RAND_MAX ); // Here we play one of the sounds once. if ( lottery < 0.3 ) sound_manager.play_sound( "lava" ); else if ( lottery < 0.6 ) sound_manager.play_sound( "acid" ); // wait 1 second before the next sound. bear::systime::sleep( 1000 ); } } /** * Initializes the Bear Engine's modules then run the example. The modules are * released before leaving. */ int main( int argc, char* argv[] ) { init(); run_example(); release(); return 0; } plee-the-bear-20251226/bear-engine/doc/examples/10-stars/000077500000000000000000000000001512343254000225015ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/doc/examples/10-stars/CMakeLists.txt000066400000000000000000000031321512343254000252400ustar00rootroot00000000000000cmake_minimum_required(VERSION 2.8) #------------------------------------------------------------------------------- # Find the root directory of the source of the Bear Engine. This directory # contain the bear-engine and bear-factory project directories. if( NOT DEFINED BEAR_ROOT_DIRECTORY OR NOT IS_DIRECTORY "${BEAR_ROOT_DIRECTORY}/bear-engine" ) message( FATAL_ERROR "I can't find the Bear Engine. Please set BEAR_ROOT_DIRECTORY to the path of the engine's root:\n cmake . -DBEAR_ROOT_DIRECTORY=/home/joe/dev/bear\nCurrent path is \"${BEAR_ROOT_DIRECTORY}\" and it doesn't contain a bear-engine directory." ) endif() # The engine comes with some CMake scripts to ease its configuration and usage. # These scripts are in the directory below and must be assigned to # CMAKE_MODULE_PATH in order to be found by the upcoming include() instructions set( CMAKE_MODULE_PATH "${BEAR_ROOT_DIRECTORY}/cmake-helper" ) # This will sets the variables of the source directories, required by the CMake # package below. include( "bear-config" ) #------------------------------------------------------------------------------- # Include Bear Engine's CMake package to find the libraries, the link paths and # the and include paths required by the engine. find_package( bear ) include_directories( ${BEAR_ENGINE_INCLUDE_DIRECTORY} ) #------------------------------------------------------------------------------- # Now we can describe our project. set( TARGET_NAME ex-stars ) file( GLOB SOURCES *.cpp ) add_executable( ${TARGET_NAME} ${SOURCES} ) target_link_libraries( ${TARGET_NAME} ${BEAR_ENGINE_LIBRARIES} ) plee-the-bear-20251226/bear-engine/doc/examples/10-stars/main.cpp000066400000000000000000000071651512343254000241420ustar00rootroot00000000000000/** * \file * * This example program creates a window and displays a star in the middle of * it. * * In order to make this example minimalistic, it will not use most of the * functionalities of the Bear Engine. Consequently, we will have manage the * exit of the program ourselves. * * The SDL is used for the subsystems of the engine. Thus we can use its event * system to detect when the user wants to quit the program. */ #include "visual/screen.hpp" #include "visual/scene_star.hpp" #include "SDL2/SDL.h" /** * This global variable is observed in the main loop in order to exit the * program as it becomes true. */ bool g_quit(false); /** * This function processes an event of the SDL. If the quit signal has been * sent, then g_quit is set to true. Otherwise the function does nothing. * \param user_data Ignored. * \param event The event to process. */ int event_filter ( void* user_data, SDL_Event* event ) { int result(0); switch ( event->type ) { case SDL_QUIT: g_quit = true; break; default: result = 1; } return result; } /** * Initializes the visual module of the engine and registers the event filter to * the SDL. */ void init() { bear::visual::screen::initialize( bear::visual::screen::screen_gl ); SDL_EventState( SDL_QUIT, SDL_ENABLE ); SDL_SetEventFilter( &event_filter, NULL ); } /** * Releases the visual and input modules of the engine. */ void release() { bear::visual::screen::release(); } /** * Creates and returns a star. Its position is set suchat that it is centered on * the screen. */ bear::visual::scene_star create_star() { // The bear::visual.:star object describes the branches of the star (number // and length). const bear::visual::star star ( // the number of branches on the star. 5, // The ratio of the inside of the inner diameter and the outer diameter. // The lower it is, the longer the branches are. 0.5 ); // The size that will be assigned to the scene_star. const double width( 100 ); const double height( 100 ); // The bear::visual::scene_star object draws a bear::visual::star. bear::visual::scene_star result ( // The x-coordinate of the bottom-left of the bounding box of the star. 320 - width / 2, // The y-coordinate of the bottom-left of the bounding box of the star. 240 - height / 2, // The color to use to draw the border of the star. bear::visual::color( "#FAFAFA" ), // The star to draw star, // The width of the border of the star. 3.5, // The color to use to fill the star. bear::visual::color( "#F0F000" ) ); // The size of the star. If the width and the height are different, the star // will be stretched. result.get_rendering_attributes().set_size( width, height ); return result; } /** * Creates a window and draws a star in it until the quit signal is received. */ void run_example() { // Here we create the window; it will be immediately visible. // The engine does not support multiples windows yet, so be careful and be // sure to create only one of them. // // As soon as the screen is created, a render thread is created bear::visual::screen s( claw::math::coordinate_2d(640, 480) ); const bear::visual::scene_star star( create_star() ); while ( !g_quit ) { SDL_PumpEvents(); s.begin_render(); s.render( star ); s.end_render(); } } /** * Initializes the engine then runs the example. The engine's modules will be * released before leaving. */ int main( int argc, char* argv[] ) { init(); run_example(); release(); return 0; } plee-the-bear-20251226/bear-engine/doc/examples/11-animation/000077500000000000000000000000001512343254000233255ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/doc/examples/11-animation/CMakeLists.txt000066400000000000000000000031361512343254000260700ustar00rootroot00000000000000cmake_minimum_required(VERSION 2.8) #------------------------------------------------------------------------------- # Find the root directory of the source of the Bear Engine. This directory # contain the bear-engine and bear-factory project directories. if( NOT DEFINED BEAR_ROOT_DIRECTORY OR NOT IS_DIRECTORY "${BEAR_ROOT_DIRECTORY}/bear-engine" ) message( FATAL_ERROR "I can't find the Bear Engine. Please set BEAR_ROOT_DIRECTORY to the path of the engine's root:\n cmake . -DBEAR_ROOT_DIRECTORY=/home/joe/dev/bear\nCurrent path is \"${BEAR_ROOT_DIRECTORY}\" and it doesn't contain a bear-engine directory." ) endif() # The engine comes with some CMake scripts to ease its configuration and usage. # These scripts are in the directory below and must be assigned to # CMAKE_MODULE_PATH in order to be found by the upcoming include() instructions set( CMAKE_MODULE_PATH "${BEAR_ROOT_DIRECTORY}/cmake-helper" ) # This will sets the variables of the source directories, required by the CMake # package below. include( "bear-config" ) #------------------------------------------------------------------------------- # Include Bear Engine's CMake package to find the libraries, the link paths and # the and include paths required by the engine. find_package( bear ) include_directories( ${BEAR_ENGINE_INCLUDE_DIRECTORY} ) #------------------------------------------------------------------------------- # Now we can describe our project. set( TARGET_NAME ex-animation ) file( GLOB SOURCES *.cpp ) add_executable( ${TARGET_NAME} ${SOURCES} ) target_link_libraries( ${TARGET_NAME} ${BEAR_ENGINE_LIBRARIES} ) plee-the-bear-20251226/bear-engine/doc/examples/11-animation/main.cpp000066400000000000000000000126711512343254000247640ustar00rootroot00000000000000/** * \file * * This example program creates a window and displays an animation in the middle * of it. * * In order to make this example minimalistic, it will not use most of the * functionalities of the Bear Engine. Consequently, we will have manage the * exit of the program ourselves. * * The SDL is used for the subsystems of the engine. Thus we can use its event * system to detect when the user wants to quit the program. */ #include "visual/animation.hpp" #include "visual/screen.hpp" #include "visual/scene_sprite.hpp" #include "time/time.hpp" #include "SDL2/SDL.h" #include /** * This global variable is observed in the main loop in order to exit the * program as it becomes true. */ bool g_quit(false); /** * This function processes an event of the SDL. If the quit signal has been * sent, then g_quit is set to true. Otherwise the function does nothing. * \param user_data Ignored. * \param event The event to process. */ int event_filter ( void* user_data, SDL_Event* event ) { int result(0); switch ( event->type ) { case SDL_QUIT: g_quit = true; break; default: result = 1; } return result; } /** * Initializes the visual module of the engine and registers the event filter to * the SDL. */ void init() { bear::visual::screen::initialize( bear::visual::screen::screen_gl ); SDL_EventState( SDL_QUIT, SDL_ENABLE ); SDL_SetEventFilter( &event_filter, NULL ); } /** * Releases the visual and input modules of the engine. */ void release() { bear::visual::screen::release(); } /** * Creates an eight-frames animation from the first raw of the file * top-down-green-dragon-animated.png located in the current directory. */ bear::visual::animation load_animation() { const std::string file_name( "top-down-green-dragon-animated.png" ); std::cout << "Animation by Warlock's Gauntlet team. " " See http://opengameart.org/content/top-down-green-dragon-animated\n"; // Open the image file containing the frames of the animation. std::ifstream f( file_name.c_str() ); if ( !f ) std::cerr << "Cannot open file \"" << file_name << "\" from current directory.\n"; // the engine uses the graphic module of libclaw to load the images. This // constructor builds a 32 bits color image from files such as PNG, JPEG, TGA, // Bitmap. claw::graphic::image image( f ); // Then we create a texture from the loaded image. bear::visual::image texture( image ); // The animation's constructor requires a sequence of sprites and their // corresponding display duration. We will build these sprites using this clip // rectangle which we will update for each of the height frames at the top of // the texture. bear::visual::sprite::clip_rectangle_type clip( 0, 0, 128, 128 ); // The sequence of sprites in the animation. std::vector frames; // The frames of the animation make the first row of the image. We create a // sprite for each position of clip incremented by its width. for ( ; clip.position.x + clip.width <= texture.width(); clip.position.x += clip.width ) frames.push_back ( bear::visual::sprite ( /* The texture of which the sprite is part of. */ texture, /* The part of the image to use for the sprite. */ clip ) ); // Finally we can build the animation from the sprites and their // durations. Here the durations of the frames are equal (the 25th of a // second), but it is not necessary. By default the animation is played // indefinitely. return bear::visual::animation ( frames, std::vector( frames.size(), 1.0 / 25 ) ); } /** * Creates a window and plays an animation in it until the quit signal is * received. */ void run_example() { // Here we create the window; it will be immediately visible. // The engine does not support multiples windows yet, so be careful and be // sure to create only one of them. // // As soon as the screen is created, a render thread is created bear::visual::screen s( claw::math::coordinate_2d(640, 480) ); // This is the animation we will display. bear::visual::animation animation( load_animation() ); // We need to keep track of the elapsed time between each update in order to // synchronize the animation. bear::systime::milliseconds_type last_update( bear::systime::get_date_ms() ); while ( !g_quit ) { const bear::systime::milliseconds_type now ( bear::systime::get_date_ms() ); // Update the animation forward of a given duration. We convert the time // to seconds to match the 25 fps expected at the construction of the // animation in load_animation(). animation.next( double(now - last_update) / 1000 ); last_update = now; // Display the current sprite of the animation. bear::visual::scene_sprite element ( 320 - animation.width() / 2, 240 - animation.height() / 2, // bear::visual::animation::get_sprite() returns the sprite reached by // the last update of the animation. animation.get_sprite() ); s.begin_render(); s.render( element ); s.end_render(); SDL_PumpEvents(); // Wait a short time before the next update. bear::systime::sleep(1); } } /** * Initializes the engine then runs the example. The engine's modules will be * released before leaving. */ int main( int argc, char* argv[] ) { init(); run_example(); release(); return 0; } plee-the-bear-20251226/bear-engine/doc/examples/11-animation/top-down-green-dragon-animated.png000066400000000000000000005011321512343254000317320ustar00rootroot00000000000000‰PNG  IHDR+ƒsRGB®ÎébKGDÿÿÿ ½§“ pHYsÁÁÃiTStIMEÚ0æ:µ‚ IDATxÚì½y°åYUçûYû7œß9wÌ©² * J±é§FYÀ{Ý`ã …ÕíÓîCŸÝ6ÝvØ ñ¢›§Ñ†(F?£%¨’IŸjC7j· Íú1 ÆÐ˜7¶ÈÄÀ(üL¢¤ÿ‰’ÿO”âÿ$H”@¢&J `¢‹ˆr±°~xæã í¢ÆdL€ ˜,£]Ô4oX?¼†ŒòtlIÿ%ÿŸ(Åÿ H(9€D)L”ÀDî¿Ð뾪ÒÎ[ö=û ë›´ÇkŠʼn‚öxÍúæûž}vÞ¢ªÞ¼0Ù€¤ÿ‰’ÿO”âÿ$H”@¢&J `¢‹ƒF@%d ˜ÁÉÛ3ÛšRn–t£ŽnÔQn–̶¦œ¼ý8Ìðß[‰ÿÙDIÿ%ÿŸ(Åÿ H(9€D)L”ÀD»\÷_,Jfœ‘UÕÕ+ìâ!ª• .Wcp¹R­Lü×®^!« Ì8ƒ*üŽDIÿ%ÿŸ(Åÿ—ÞÑì-8õ7§0ßiÈ‹&GA‚¸O96Ÿ¾Éé{N£‹¤û—ªÐÞrꎓ³€¶©Ù¼jòìŒæÄ|‡Ð?TI§x €«9œ†“[Ç)Ö ÊÍ’¶o†°Ûê˜d²vÚƒM6à’J÷¯Pé ݼeQÏ}ˆOÇÕ„µC%ôójg{äÅ¢úîd.ZÝ/ ¦Èc°(®ëiÚgJÏVg•¦m L™#ÆÿŒ+Œ\:ǤÿIÿ“ÿO”âÿ$H”@¢&J `¢]«û/ U#…k™M§Hëè¶:X(Lƒþ¯ö´c‹ªCKC&…AFíòQ}W²Iÿ%ÿŸ(Åÿ H(9€D)L”ÀD» ˆpŠk{lïÀ)XEJÐLe‚ýwH }ÝA'X#HîVÄ &Ù€¤ÿIÿ“ÿO”âÿ$H”@¢&J `¢ÝI èX‘Z©f#æ§çаR nËóUÖ=£pú`¼1b‘-PëW¢¤ÿ‰’ÿO”âÿ$H”@¢&J `¢ÝH˜~]™÷sXñŸsé0×(€Óá{÷[ànu˜d`ó¯Ï}tt¥øß•(é¢äÿ¥øÿR䟉Ò-}BÃËz'ª¼ûc/ €¼@œœ„W¤ô{(‰M €)L `J÷^ð÷¢8ÎóOoWØ‚¾îƒ¼ño¤h º£g=ª®ào|#üä9¯zd W t ÎÿNý¯ NúŸ(ùÿD)þ¿D|å9ŸøéL±ê£¨ÿ U^¡úÝ ÈKEeÕ@%Háù(:SL rÈJx™@íÔŠNú»ô}Ƥ?J ÏU¹« â _&è›ížbäGDÙ$ƒ±Ÿ×èq/ rPÐ::`“ɶ8¥è¥àï¢âÿ D |]½­:+”!1䈠÷êvh|ð8€^ g¢¥°ÉÅŸ·{öÁ×}Ïþó¼â]¯ 3ݳ …+øÍ—ü&ßþíß¾ `¯þcJ/þ?K”UAFÞ–«S¸'Ä,c˜\1a^Ï·À ˜TæwÏaôþr#>‘h€©¢žøŸô?Qòÿ‰Rü‰æe¹Ò‡ä? ßæµê“è. e}@ÇÚg¾o÷Ò¥,ò|Q$$ü£`¨2ïì0‚ƒB.¸ßî÷ŒK €)L `J÷ï¯edŸ@L@F9RfUE[׈1¸¾GïôC€å±%&ÏQç(«Š®®ÑÖ¢Ms =é«ôo“ $ýO”ü¢ÿ_¢€ù¹BuÖû›ÿÒ@.ˆ‚ˆ/‰SnÓ;  ‡Ü3´ èÿ÷èØ¥&òâCi^EHú3Ÿô‹ þ¾RÃùR˜•÷[ÝÞIþ“H` S˜À½ÇÿëDÙr… +¦*(Çcªªb<“ç9Y–ñõ¯~•öïÊËW¹òñÇZKß÷, 꺦],pu‡Î,z·ÂIÐ'þ'ýO”ü¢ÿ_Â@õ6µo[\Ý¢sëÁ€Ð[.ãÌß6+¸V}«¬úÛvë•î‘® ¸T@ž/êo÷½!#“íÛþ\0¥ødß)º°Û³ È$ÃT%yYRÿÊ©=e¸’H` S˜À=Èÿ§‹2BvÕ˜¢,YY]¥,Kªª"Ë2N:ÅÖÖÝ©3›k¬¯¯³¹¹‰µÖó¾m™M§tm‹½cÇèß$þ'ýO”ü¢ÿ_ütŸ[ê_9%‡~õqÚ÷=MÓÐÖ58‡öwº÷ ³(ÈJ¶ÖW8ñåéhA^ŒÆê€G¤2 ÅOø}ñ×÷Às~é9ƒtõҔà (ª‚Ÿ}×ÏzØð€ µhõ‘Þåý1Ñ/`«¤ÌÐyÇèô˜…Y`6r$ÏÀʪb4‘ç9Ç~ñk{+ù¿Öƒ&2fpfT Wn;€Æ€ô%*Û ÉÁ\Vë2|eEíwr»œ ¾*foŽ=ÿ‹²üæ`é@¦áw'Úåï´§Š9P—%ãñ˜²,)ËrH1™U6†­­-6771ÆàœCDpÖÒîhïí¤ù»Ÿ&A÷7„¢,cèûc Ó锺®™ÏfØ{çdûýàöè'CŒSU}ß#ÆP”%n£F[MüOúŸ(ùÿD)þß@Y–äyNY–ØÉ„¾ïiÛ–~ÒãúžÆZŒ–¸Sm(µ7ÞPöê“çôþsòRQB.­ï|èób¹Atp^?È/_Jú%|N™C‡Ù,iÄ’ecLž<ŠÎƒ1{Ðb%À¦0%€{Oõÿ_ùGåý¥S¥;µE d+clÛBÝ¡²F×ÍÁn-˜NL«‚¬,±3¬k+Þ÷V µÿú?œô?Qòÿ‰Rü‰wþü—屿ñD5Æ IæxÛa;€aVDÜJCJ0ÒAñ%ÿ¾Pç+M"3Œ¶yY¡ö·»KH`JS¸wÉlûí-Y–ñ£_ÿ.¿ür¦Ç¦¼çê÷cŒAU‡J?`ð¹Ñ—þÓÛžÇêê*÷Üso¿üÝh¿´9 ‚MúŸ(ùÿKíèRü¿'ãÿüw¾3_c,- FöÊR]ç|ÉO绌¤ƒÌÏ/ˆ‚e² Säd#ƒ+{\ÛCëçÍ#GŽðWõW<ëYÏb}}µµ5ú¾gmm UæìD_ïœÛñ=ëëëô}Ï_ýÕ_qäȸû]ý÷€ž7QÒÿDÉÿïJñÿÞ‹ÿ00*ÎùnýãÇÄÄ{yx`¼Ùý$þ©laç Ú)nÞ!e¹ÂD|ŸÉ?Õÿö-„d—€ü“üO2Ï7ï 3ÈØMF¬®¯3Ï{&ñ¬ây/£<ËmË<8ûóŒ. Ìê/TU¥Y,о÷­@ómŠÛa3 0~Í£"˜Ò`FÚ;\ïõ­)¾Åƒè¼ÐË ¡ôÅ‚þáƒ4»ÜÈ Ã³ô¼QñCÿŽP“$7¨:\kqMŒƒøR+Ëv5ŠÌ$ÉsFTšþÇãÛ3[R˜À”¦ðbãý“¯¿žÛn½õþý€ƒ_|Ò/rà 7pÏ=÷póÍ7så•W«ŒOž’¤ÀW\Áu×]Ç{ÏÃûïýÔYgûê+^Ít:¶9çxÆ3žÁ;ßùNþçuEj¡išË@úÿ¼î£üЧWyÎsžƒsŽº®qÎ1Nyõ¯æµ¼ö[>ÃT•ë®»ŽøÃhbcÒÿ¤ÿÉÿ_”âÿK/þPÀþÕ'åIo|š~³~ô倮ëv´Ä’÷åõ1™µÖâê΃H½ƒ#(@Æ‚®)ò Qýëo*ò@¬38÷?C”5ÿ¬¼¼Rd‚«;ìÄg Ñòп’ÄÿGG?÷Íý/ü«OÊ#eöý§+ÔZ;Yb‚à.AütJcQÌЦëpâ…¹nŸj,‡)ÕW‚´l— }ëò8€oÊÿñ‹•"EPü8ă%¤³Q¿Z²0˜Ò@fÈF#Ä9³DÄOð gžÌ+¼„ 6θ8ùKw_Rƃ…Ccxß’ÿ)|T@yõÕcxõ«y-¯ÝÁÿ”><ôEôû_õ*®»î:®½öZV—WRß zÅõ×ÓýÉŸèçí°×XöíÛGUU¼éMoâ{¿÷{麎÷¼ç=üñU`òÌÛÒ`O¡¯U\oùã«ÞOöžŒÃ‡s÷Ýwó‘|„k®¹†}ûöíÐÿoÏ2½ê¹Ï¥¼õVýØ’ ¬Špíµ×úÿüüÏó×½N?¡©u(é¢äÿ/~ Åÿ—NüŸ?XAèºntY*C_îý? 8{F@Lþû¾§ï:úã3d’‚…Ú¡/$°*°_w/¸?¢,( FÀü¨þé}Gñ@~HtXy’‡g«#k/LÄ—ï”Sd` &VÔƒ÷íu™&Tƒ,¯Œ|_lyì¿vɘêðʇ1¼2ÝîòG (%€/]wÝu<ýéOçK_úÒ9_[!ÈÎßû^ýô|.¿ök¿æ~â'~‚²,9tèï|ç;9~ü¸÷ý­ƒ\pÖù‰Öv&3TúÉÉ@ïíïM7ÝÄÁƒ¹á†xÚÓžFÛ¶XkÝ/üÂ/ÈS'ý‡/zW\q[ç¹¼í¶ÛxúÓŸÀ+“þ'ýOþÿ¡ÿ_:ñÿƒš¦Ù1 p9Á?Y?nX~Ëʦªt]G_רS ²š{¤Çˆ·õcÖ÷“ˆâêA¾_T?ðM„`¿<|ðµoþÈ÷ûÞ2_Ê¢PŸ, wAÈjN|†nŽÐª*b©l™ˆg™Ý4ÍŽsŒ ÀòÇG’"—Ažå-ÁŠ "ßûeyÖUXÈs¤RlÛ¡…ƒc¡Ö&Ì(±w^¹ä9¢úA•ó:€‡ÿà¼@ž#:“÷¾÷½¼»|,@JÐ<øaÃŽéH¾åÐù¾ÔÞ]¾‡ÝòÌg>“ ¬µ¬­­qøðaÖŠbHNþü>{¢¤ÿ—:%ÿiûÿÿ_ñÿƒ–ÿèr¢Ÿç9eY2 (O<ÀåƒnÛ–®ëh›µ;mÉ­âÚÖ'üÎ+ã2 }˜/Q¨GV¾xÕxøàªÿðÍÀPêáŸ7–iH0~ŠÆ¡ ™Z¥?9CŒÁ¥qÎQ–åäG&WU…ˆøÁa â20p6/)ºóç¿,ý'îhÉó|4–·,o*ˆha|*‚ ½-&ÏiʦĮXÄ R ¶°¸…ƒy@Ÿ)zÕ¾çï ðé“ïóƒ>036de†:E3%ÛÊhG-4Žb}ÅÿÝðž‡óYBõ¢lE1 ŒÀPœ—±¬øwþü—ç /•YrâñÿºäðâŠYrlYxidÛ`~ò᳟{oúô›ø£ƒtQ€?ù;?I›µt?Ρ\:—| )^£; #/ ¥e,u¬ôÔÜ”¦p—ÒT•/~ñ‹>|˜›o¾™é’ŸùÇ Où™ŸáàÁƒìß¿ŸÑéÓ¼â¯Ð'?ùÉÜ|óͨ*W]uÇ÷C‡MÐo'+’‡ÊÂ<§>Ìê‰Ã¨z_~Úº–ãÇsï½÷ò±} á)Oy ¯xÅ+ôã¿ù›ìß¿Ÿƒò=?ó3LÞô&ý‹‹LU¹ùæ›ù±û1¾øÅ/îxöDIÿ/™$?ùÿ=ëÿSüiÄÿ¸ûßÝ&ý“4¢>ËSë³,;o¿×u>ño[l@‚úyÃèà:"B×÷Ø35f’øA6)q]‡ŠC{ü …‘"Ͻju—Àô}ÊÈ?›TÏ—xØyK˜‰›wd•ïÙ8¸Nsê ùJE³XÐ÷=ÖZŠÂW'Ä–€¾ïɲl8׳·*dYÆW_ù…G%ˆ<Ï ŠÈóˆVEeFƒ,Ä÷°l8LdØÎà„%Ý‹é±B–gÈŠ¡µw îð¾¿xŸwd+ÞÈç+Æ ¶³CÀ1šŽh\K7_0Z[õàÏ—u'ži’ÁUõ3‚1ˆgú°;úš—öÂ.9,³´%ÜÉÂ~ÙžíÑ8š¹0Å*bÅï5º¾ÃµŽýÊ‹¸ú" _ô+/¢v5vl!l•LÐÌÏA@M(u™í³têû†ô<7'né¼Ã™! ÿLÔ;”¥ Л/^` %€{›*àí¯~5ÿ÷O°ß#ÏÈyâ_÷ ð?¿7çüÍ[ø½ û×=ßlnnrÍ5×pðàAÞùÎwò‘|„;÷—ïßÞ=ݹúK$Áh6: »®á=î=Ôï«ùô§?Í‘#G¸á†ØÜÜdss“)ðKïøe²;rì‡{ä{sžøÿ|·?#çÍ} ¿ãnâIon¨;“þ_̉~òÿÉÿ§øÿ’Œÿó ùá®ë†Éÿù‰=ý‘É1‰µÖR×5¶ï}_H×£­¥ØXñ?Ó4ØiC¾Qá¬&KæeIçªv[qJ…| ÀÇß%Hé‡ÿ©*’eäe‰5¨z°!ߨ觾”?+KŠõºÓ3¤ôÌva#BUUÃv€¦i‘A8Æãñ€Å×£E_}åäšÿòÁ(Ìq@H4ª:Ì9Xž¿ Dß÷Ô³º°Œ©h7{´óÖm­]cšM½aØx#÷O\æ` IDATºÿþ:^õ}¯zTÀëþûëüsUáùÆ^ž\¯¬µkl¶¼|o:ÆuÅbQÓ5ÕÊÊPñ häùrÛLÔ³¸y#žk,úÒÏ~ê!5òòâ°«4ßFè%“m‡Ñ,üjKuêÛ\Äø™Š‚Õ?'y˜ƒ‘¿¶sˆÉü¯Ó8 S\ã<ÿÇ`e>ŸsÛ÷­ÁÛº(ÀÛ¾o¹Î±+ÖOµµ …`FÆ·@|U*h¦0ÃÙ >Ù´þŒ…ÐW‹ZõUF&Dgº]9À¿ôkz± ¥–úî‹H àÞ¦Ï}Žy¼u0OÍ …;è¤Ù0 `þ·ŒþÏv_U™Ífpoà{Áv`Ý™¢‘×6L Žx,7U8xð W]uÕàâßøø³sÌãÂ3<-ƒÓÊí?X ?XJ`¾ð“%î«>Ð'¦&ýßýÉ~òÿÉÿ§øÏÄÿĤ4¾¬µ,Âmv,‰oÀZ‹ë{´ï±óŠõ FÛuØy‹Y)ÃTIñ†¤õˆ‘Í2œÊ~Å »ä3Û'é-?ý2Ë2h2Îã2³R†ª!+ Šõ Ý™9¶µÈ¤ÄmÛŠ!*Îd2„!žù£IMÓ ¼>ûy–å"‚@Y–QÖZš¦ñÀÐbÎQRàÖÁµÎËǬàD~‚¼*B…†¯þ`Œ@Æ£î†2¶1ÞØÁ‡T‰îãÙ»Ñâp¸u(çÖ9êÅ‚•ÕÕÕA Ï.®ÊŒg?÷P ôrp,±‚EÂÊ’8ÇB–uECiZ€©z0Íyý2™ oÄC€ âõZ[ÎYýÇÜx'æ"JnÀ¸PÓ±bKK}ªfßíÓýzrW€'~h³~†Ý´0Á;íÖ£óxÔ¡4R]tôâ¿Äa©NCRâÏU ñö#~N—@Ë”™ °ýüb:ÿ·5ó²-/Ý.ÛÔwì^0 %€{œfà¾à`]Ø_þ9W¨zЙÂ̯Œ:yò$ùÈGxò“ŸLUU;vŒ·5oƒ«2ò•ýÿš{{f¶U„,DÊÑeEØCþ&ô³†·Ýû6^uìUTUÅÑ£GùÜç>ÇÉ“'ýtê-EíÒ Ýªpãn„C@é’CJ5(/"¸EÇøÀvdéÎÌp}O1S¬Ž‡³É×e”û<â´Í¨E1(RüÚ£EÃ*Ú¶À‰ˆÆ! ˃,Ç#Â|6CÛŽ¼ÌfA3¯Á€9uÕ …ÀDp ëD°Qx'ýšw½†ï~”ÀkÞõ¯ôñyB?—3Žlœ#N¨»sFp í[F›L;ú²c>›±¾±±ãL–‡cÆ>©å ¶m@è¡0æ_ÕÙ¶Sœ“ ‡`œ8•6xDzl†6šè¼MG³$ƒì.•}¹¾Çõ–¬gýüéÅaJƒ³JïøT”®é¨ÛšSÏ=€”[»2<õÜÔnN7î`E‘lÄÉüá š)š y)ØLž ç㜮ïý@Ù¾G­[ Æœ¯nêÕƒ˜ìZ P¿V'~-NÕÏ{÷F·;A€‡"\{ûvbwŒ”rÈßÛÖÞÎ«Ž½"%€4)˜o7°">Ø ñŸ”ÞöP‚d>áçËM?ñ‰Oð‰O|‚{»ï¾ŸÁKfW £Ck4¿µÍYâ{ü›O)q§;ú{æþë3¾ð…/ðæ7¿™Ë/¿|(m•Þ×{dL‚ÞÃÿgŠû´KüLú¿+)ùÿäÿSü¿wãÿ ʇ~}OÓ4¾Ä Áˆ“ ý¤ÿ7íÈ7+“ŸetuíKá×FdYæ'Ý›Ø0¯å#U‰6®ëJzýÒ;~÷ÔÎóž‰Ài¥ï;îºë.n¼ñFžøÄ'òÅ/~‘~ô£¼ïäŸmóÿ䂿ë[È·åè™~gomˆ dMpw¶žÿ—Oþ_{íµ|Ï÷|ßöm߯—¿üen¾ùfú¾#×Òó{®èÈ—ùúÒH<ÿ3p'ô£¬%ý€äÿ“ÿOñÿžÿ/È5}ñ_ÿ/yü럤u]«ªÃL€¡ô£ëpgZ²ÑöÚƒ®#¯*ªª¢,K9‡É·# «&Œ1”UE ˆmýðŒ‘¯póƒ6a ÷8똌B Žøä¿¬ªÁàeåvÉ¿É JeF£mž{ФëÈŠÂm½Äžn°EŽ–åP Û­u]£ªTUÅW^ö™Gý/ùˆ« #RûT"Š`Q×Á´#[+iê`¼Nw˜ý¢Š6 …A­#ë›G:Ï3JŠóßÜüØ?¤|̶m±ŸiȾcDV–Ü,ÈËŽ:÷ Ê?&á™ÄËXÖ\éü³ Z îdçQκ!_+±Ó›çÌf³Ô‰²±]F$£ /#”ñµüÿeô:~|Fkí mÛzÔ7ôJa|éZåÊèÊkÝvÙš C‡rp™cÑ/¼ó¿§z°ÎþéìCÛüŸNÑUÅhà®`&áã  ®V YYîàÿyÀ t÷´——,ú.sÛ5Né 2l2CÑ,¨·WÀÆŸÁ(GÃD׈’Ǿ°x~ËNÿì3?_  Ý1!6þüâÿ9Û^ô `÷•fàÿùÀWÏçCßý7;ù? üŸÝ?þ?ûcOçïëó$€‘ÿ_i†$ %€1µ  m¸í]Ÿo¼­í>ßìX%ö¥/}‰}èCÜu×]\vÙeˆû¸ þoœÚ`}}·¿ýí<æ1ÙÞIùÿù†âÛGþ¦zå´ ¾©M ’þïî£Nþ?ùÿÿïÍøÿ‚€e†/®SU¦Ó)ýÔ—´›0¨¯],XÛ·ñx<ªêß`(¹Â˜9QØã@ É XëhMй7²ç÷¤žù|ÎÚÚ—?çóùœ­¿þÆ} Àè»ÖÙØÜ¤( Μ9ƒëûó €zYÖ|ù¿¨ÂÒ@Ä=/zuBT,ëˆÆÒ„rÿ3§NQŽÇ˜¢@Wý´fše¬¯¯ï˜‡BijÔHhMˆ¼ÇÃóc¥¥?õl†N;˜dÃ0·ÕQ^±F^´Mƒm|Yšë½˜öSØÄÙ Up¬É?Ÿxÿé ü/Ë’ù|Ιo;ÞÕÃià«Ay/ ¥WF«çðÿ¼ ð@|së{±¦ýÔ£¾½ ¶é‘"T†\‘ÑÞs³Qø÷>ÉhŽŸAV ª••¡o*ÊFì©ÊóœÅb1Šè(jÚvpèW§÷2ÅçZ"â»ì”¢#ÆX‹w~-NÔ‡ÙM@ÿÕQº’vêoøddБ Úº¥ør« }‹7>7|IõÞ7ùo;ùß@ëÀÿÏ/ñÿ1ÀÁsùÿ’¯¾àÜðôMÛ½äËÐNZ/“#°kã`夤Õß/Èÿ^3Ð0à§Ÿµd“bpð£ÑhX÷²lEýYv챿î¾xtì¿vq®¼°ûRãÏ?ö­ÊùÀsôÿòcã< `ÜÓøß}¹¡¸f”À‡Ô©„µW¿öiU\‚›VºOŸËÿßý.‡¾xˆÿñçĉüùŸÿùóÿðáÃ<ëYÏbÿþýüÞïý¿;ûÝsùÿ¹†â©£áù¼! 6­ ï%QÒÿ‹€’ÿOþ?Åÿ{'þ¿``y `Lއm‹1 Á(tMÃæC|üÞ(Dá¢ÖbFÛÃ$¢!)Ë’ºÊqSëw†ŽÖ¹GÎ/'ÿŒ¾ï™N§”eIUUÌÿÁ„þ ?°e˜ç<’c®(UÕpÃÞ÷=8w^ã—{´W{õ[Pªœ2”ñD¥L@ø†1öóGŠý3Y–qúäIò²Äå9ÒYúEÍ<ÏÇ;6.Ä^‘Ý@÷¾úNÙÿÚÇhJ@4hË­ }ÛÒŸ\­v(ÿèŠuвd~æ Ú[ïÑ‹àhç»a| å³bÐ&ôˆMÙnšŸë^Z½ˆ?šüÙNþW%ýªõƒ!Ë%þÁŒósøÿÒ»^Äßå,0¿ éÄ,LiÜÌ·£ØJaî`Å„r0ÁÖ uß3Y[C®š{¶È6JãÌ÷¨c9P-Êø¹qàæ½¯¾óaOê¢ã8üŸ¯Ò³u>wñùʲÜ1”$î(uÎѶ-u]ÓÔ5Ýl޶¾/NãTÛQèíZºåh»ÖZÅ„›W. ì\ÞC\œ?^3Ÿ£EF¾Ü½k[ö80 1ˆ«îâÞHœfdyN7“MªAŠ uQUE3mÚñe<ëŽ[²[Î#/æÝGÞ7 Ï0Æ0±ë-Úöž±lбDkk-/½çÅçôÞ’ÝâvbüP.ªfÄÁ'Y–aŠ;¯)V'C·A\›±Ü/3™L0ÆpòÞ{)Ê’ÖZ´éiæsÿìaëBQ§v‰³ˆrÏÍCQƒ¡ªëÛ¶tߘ#k9 HžÑŸZP=Æ#nóé”r<¦ï:úã³Ù$ǵ=cýNY§hJqJ˜¬M¾©¸þŸÏLÖ&,ºÅà€$ìp¥YË0e†µÛF¿¶dWÈ‹‚ÅlÆduyÌ&õÑSä›c_7ÎéŽÎà2eæ;ä¹”¢#%UEQpâäíч\þkGtåÃ9ã¿—uµëºå^óùœ®i°MëÁ²\ô„±øËÊ”®ëˆ%HQ€Yz ;8Ìø^ó¢`å1˜;I6.ü™¬ftߘÃaa6lTUÅd2¡(Š¡4èÑØüpÏ/Ü.W¿á)º\æ‘çX¥S×µa((ø¡v±À5]¨”1ÃÚ©2ò*‡Ówýp¥'uG˜wwСeHV2ƒQ3ìÜv™zÎʾsoîãVÌ“2ÕÓ~ï³8¶×\Ýÿ_xë ùiýiþöoÿ–[Š[ÈÚê‚øKq £?qôèQÞ,oþÖü_(Ì]„[à9¸/Ø= ê$ý¿4ô?ùÿäÿSüéÅÿ DÁ‹eóùÜpƒ.ŠÑˆÕÕUÏØ®ÊVbIûb±Ø^’eCŸ|,5ZF@¢¡‘ÌøÞ!ñÓ4;XQÞåûÏ€Oר1Øý dmm:²mdã°m,Ž–ºîÐÓ=,àðSw Àû¯|?' z1êMÉÌŽœ8ß`(ÓCR ¿øžã9Ä!±ŒfßþýL§Sš¶&™ÎÒ¶Ü^°k¶%Ðc:2Ñu®ëè-¼ò–ÙS «;¸-ÔA&Ú¶Eû>ìŸZU˜ ª~Ò¦öŠ™¸QçË€2_ʳhçÜØ».Œÿ'³Ó¼õo C?‚òÄWx,ºÐ&¸VÆ?û(ó+v¹²²Âb±@ ÕËö3ýÚq²‘µV¡;:#?4 jDx'“ÉpÖÝöòÏÊw¼å»5:þ®ëž×u= ½Ë++qæ½_ádíÄ|R€ñçeø’É‘w&Ì瘢 7JGëKÃ2ß'è2GŸõð¨žVaeÑ.Î í…ñÿh¶3\|`u~ˆQó•†~½÷Aœõå}Ú[_‘X–ô™tp´'eØQïßcxÏÎòIA§Î#Ú½ó·#˜÷ô™Kc`­œkŠíi¼)øÌO}ìQ7 rcú〶L¶-áÌE¡²"CTèç½ß=]zóŸåÓLmȵkèN¶Ã­@žå¬m®‘Or:× üúï>×xOÍ-pÄÿåðµ÷¾ítà¹^’ågNœ¡w=t÷4äEA5aÅ}¡½±ÁvyýÍ'¡tSò°ãly°oX½%?.m¡Þ¼·À÷+f=SéýDxÛuß’ÿõñš×š×òî^gî¸0ý§€·Ù·ñ§'ÿÔÏ·àº%›å~’ù\÷dòŸôÿÒÔÿäÿ“ÿOñÿ¥ÿ_0Þ9Çb±À.jÏ”bue@/¢0Ä!qõ_,—oê“eô]…ÙÑû²¼_@[‡.ˆñ!ó+}ì×ÿÂNË3¿‹ñîΗ“í¨u»ôÃ…W„àî`´7Ù0œ<¹S~ã×~ÃO~Ìį1± 7L€ÏK¢â‹ÂøÕ"EAS×T¡×$¢|ãñ˜ét:EQ0™L¼¡ÎP§¨­Yˆ0™LvÌØ ‡T ƒ^‚ƒ°Mƒ=Þ`6òAé쬥¸lm(Ï1ưººê§Å67ômè­ªÁ¬{Ä˃CPjÆ`ŠíÃ^ÔåØGŽqä§v:€ åÿÙ7Ç>r 6|9¢)¼Q+5÷Ã^âö‡q†;ãÐÌ÷jïßÛh4bmmÙl6€gÅekt'¦˜qîo?Ösúo,¼ó@OüÞQØ2ñh=QÆc/Zœå+º®ó|ì:ì¬ó:LÀõÄ÷Z™Ì a¨§d™7ú¬s`}¹Ÿ -A¶] èªZ¶'D—Š-,uSã¬Ã5Žkþó5¼þ©¯÷àÚ Õ…ñÿ–ú†ð•Ÿ~¥oÁÁ`zƒ-¬—Ñ€#á{ÅÚžl4Æö=&÷UNÖùª(ñëPñÕ=ùJ響¶7õ¶õÔœl¥ q ý€q¢²µvÇPÐXâö¨ý/ ¥¬E¼¡óvYr¿Kñ '¹æ´ÒBí'|K+¾$Rœ_¯j-Z…}Ï5ØÆ2©Çh_q¦8ãíÍ8§\ó>d™ÿªÊ+޽=ªð8A*sAü×Úñ¶¯½ßûÜï!Vvð?«2ʵ’|‘·€kíb….ï†ÁšãW2e~SŒão‹ `Ë—7—ZÐKû êÔë‹ ½®ÖÊ’Ÿ¥óÏ­°7À÷wVÌwg*•x¾Äð>ø¯™úÉÞÿùšrìè±ûÅ0­÷±½“ü'ýßúŸüòÿ)þ¿tâÿ‡XNþqŠZÇxÿÆ0é?VdY6”4Äò x®±ü¿·H.œ]j§úv€P й -2œƒrŠ+d‡sꯞ‚;u(aœÕV€ ¸ Ê«×Qçèg‹s`@¶Qpév>ÓÙ;P£‚JîÑÁXÚ+–ûÿcùTl‰(Š‚ÕÕUYÆâÄiƒ]x "€»…f³Ù°špPþ¶ Ê_ enê2Î…sš¦a6›¡Ö¢S ›¾OÎU¿?Å—Ru-•™àŠ0$ì“¥€«åjÞð´7x · dÄÿ[dûàåŸ|¹ßõ[‚”AùXUw¡tM Õ,f»´oÓ S‹Ž,³ÙŒÕÕU677qÎ1ŸÏɲŒS¡÷K‚7öx‡„v©Ôk±X.G~ëÉ} ¢ŠÎ©Ÿ.0Î#»NœdðÈmQùý¼b œZf V·|ðíCeYÒ[‹®+í©v@{±øžÑR°ŸµØ§n?ÏË?ùr?÷ŒO.„ÿL•·®½•·~ò­ÃscÈ>›¡kŠÃ CˆE[(7G䣒¼,}9Û2)dan–ç¨ñ²’‰Ð™7ïP—C&9º°Ø¦'ËóaÒîð«:ÒÛîshP(/7}E8Ïð“‹_ÕšùžHuÝêÐLÈ.Ñ[wp¢ôÓp³7Â;éú¬Cª)<ÊÞ5™dl²‰kMÙ°h8u8qôni:²r†‡„ÿúxõ{”—øŸKNÓ7t¶CKe½]Ç”†¾èéËF>€Ñ‘ß ïMÛZlkÉ~†M ý Y‰ÝjüÍßzùÈj·'ekáùç!p ï¾´Á÷1+¼eÖ¦2h©»Šÿ¦2GuZÌ IDATCO¸ÝßÃsÉ'ÿIÿ÷žþ'ÿŸüŠÿ/øÿ!i躎¾®}ßn˜l®SU£Ñhè Š“BWVV(Ër¢ žù’M¶‡],OHS¶Rá3œze$W¿ÒÀ~ê üÖ‹~Ë Àé[`Óï”4YÆäÈ~êËæ¸;kÆw±g,¶·¬ê*§FŸS¬ŒQçpm‹vÊ-§·àçÞûsÞ`ǵÆàÔ'÷ÙJuÎJ”婦ȱó-ý6€øžœsÃ&…•••‰ IUùɲr@¨§S´wôuMæìŠ}_6gße‡8q÷QDÔo‹pJq Âîè×Üp®YØ2ñhÒí?÷9¹òu×hÔÝ8ä¥ï{P¥Ýš!-˜Ußó¤½7„ÙjE6€ô}ïwßZëÛbbà–o;J:Ü:GYþÖÈ€1™¿Qq`%Ü´n{"p‡w §xHø?XÊ0•Ö‰Ã䯗xôß™ÏPœ7Ö­s”Æxy]fWØ jD°¡"J’/ÆÐe vÚøËÁ˜v´§§°¾2”ƒUUEY–Ã>àGÊùËKD‡óxˆhx&H‘ñ_{fuŒ2ÆÙçç½ô=ýlÖßšÓ‚¬_ÑUàË®׊µ\NJŠQ 4‹qBvWÆÿÏÞ»F[–]åaß\kí×yÝ[¯®V—$‘„ „ Že36/ÿÎÀ`Ç?ȰM,0Ø„AD`ôËŠ$ò=)» ˆ¤Ç§ -é µìL×/=‹ôlÆý>I:c¬ùØîvð­<ó{eÌàï6›>«: Z¨3<{¨\˜b}ã°zÝy"g’ç9꺲Z̲‘;ÉÜÃ2P)(c¤—lÛT…@ä0ªDl$`÷Äþ8ŒŽ;Ɇ@Z?¼–,®÷YJš´*ÎSTjзu@è‚TCˆP×5”R¨ª Þ{Xk±ºpÇÏ^…ž!xç —¡ï1Tž „µ˜ÿÀ9Þþw×îÚ¦ŸÖd×u=’Ìè6[pëA¥p]„Æš`–%tœßÞ{kcO_´/QD×Ä[ŠÙâD¢™ie[„Ž¡gÁx™'À%#ûtûPìÃên£ýÈ®dU XIö•)¸ƒÊ Y•#(ýq=¤O‚"wI’îñd8î‘Ì Zܦ‘gW $pãÑm¶ÈóžY9íãÄãm ú¿9ýIsÛ@´x3Ñ÷`¸så®D½hÀ'®h¡æ²w,ÏíÉëç¯ö’YÙžpÀpÛ!8ml ét}K$À¿po%èHªø.îã–Çn‘þ•ѵC¬þ™{!“½‡CÔ¿ ö‡H7+FÈb%ÐÇuò `üÒPϤ¿ï}t§þŒ,èÞc‚ŸÖÿ´þ'ÿÿàúÿ)þíÆÿ¯jæ,þÑynÛ¾nAJ¡˜ÍPUÕ© ™$,Œ1(Š¢— Ù1sÌ1`ÊHŒ7fÒÃ$«’V3Ë(ƒ8†C’þ‘h(\󰺆)sÙhh¤;Ê/ÅÌ#lð5ßgsä313Sý÷" ‡½$i¿‰J- Zk”U…íÁNøHë3eQS¢$é|EÑ3©¦v€ôúÚžÀ×-Z¥°øGçyóÃWïjÀ’ÊkAÇAä[8@E™¿í0»°ß/þ”øH¼DÛ¶Cý׳&fØx€÷iÀ7 tQÈ¿»0ÌfЋ[lÿƒ(9™¦vbRG®%I¥DIЕ#vª¸®CV–}[KRÃPJÁ9‡Ù…}ìž?‚žçPÆÀ;/r2k >㡲 Áû»žzæ»?Mû?ü0·mÛ÷=¹¶·jž ,Ë@Šý…‚Æ9Ì,YNV¡ß,YëSU><ƒêES× R“>@"@Ë"y𠹡bx«ì&~.‰c : U0н‰fãÆwÈòêÔ½ô“: "hfÚªGï´G ´ÍBíದ(dÄýáÊ{>{[Ö?} 1Y|NJ‚42B€JFËš÷nÛ€°é¡~=§{Ùn·½/ûKµnkè*“µY‘Á[!XR•†ƒGåsts ¿vhPCÍÌ<@hB@Ÿ%ð>÷kìvÛ,Õ…° ð3*lêv‘æŒA2XíaæZØ•2(ï¥jZ)Ô'µH@u|Šá7„Ð#ÂÎ\|¨o[_y]å0¥FpNú ;é=•žÆèÿ:3ƒþî(éëâ¡7öÇö,ð4:L¦Ã¿Uù9˜{ñPŒ°ÍàâÁ'D»XÜQû#‚‰²e‰*Vwáb‘àkF‡þñá_žIz#}c|_Ü6øßÞ%ûMëZÿ“ÿ`ýÿÿ¿öãÿW•hv;„¦“–ªìeðÒá>ATÒÁ?%R…|Ü Ï!¬'S}b`œ H $eŠz"„Q– ™–‚P•B¶È¡f ^yØ«ìBV0î³?Â4)‹—׬ ¨Ù*‡^h„]€ÝtBlXÄï Äñ»S0Ã=œ|½ã{A¦¬‡ÊpŠû õò¤gdŒ9•HÏ3A¬µðu¿­Ñ$ Å»8¹aè,pä Îf÷iÉXPž[Áƒù|ÞK†$‰´ø•RðmŠ):ÀÄÅBJ †l£ÝƒÀ”!5 c uËíï✠C§Œl ¸üHÇk%‚)Kt.ª@ hÔJÁ¶mßÓ4 ŠHð2ŸÏ±ÝnQž[¡YŸ@%ï¡ÎfaÒN’Ô%î2ì+Iwº]å :ÏÀ¬¬lYI¼5M•RÂô ô=€ýlt«Ð6î˲ž²ªB[7€Bæ†@:Âò@@¶É`++YØ[lÿÐ÷ÕxÎC68ùõààcY$iIkعÍà ùÎ~_ˆ÷Ïq¥Q­µÈ–ì¦[•)è<j®ÛÂÌJ¨dƒ[ø+14E‡š&bð¯ò\ÈLN´…™U(ÎîB*%5“¶mûV®¦®Ž:`®PÚí‹|¹@ç6@`!p^ò ›Í º¶9}ÆÀ[° è\‡|‘ÁÁûÑéo<ãþ°u»ì´#`À p…ƒ) º•ŠÅ"2›B—w0E†®³€gp„*kÖÀ\!_.Ðò Šã õ¼E8êÐå-ʪêßE!¥‰.B÷º -b]·«ÁžQì/ás+°EÇà@} „ÐE ÏàŸ»ýIúzâ¾÷q|ØW79ÂÃ>ñ½ä©·kñïè &†ÓðáÛiÿþŸ´è‹XÒu£G\Œî‡GÏ"í[ãʵ¡ÂðÌú„üoî€ §õ?­ÿÉÿ?°þŠÿœøÿ'ÌwÏØo;̬êû9ƇߤU?Îlzï{8X]×´6zUœ:8{éMÜDt–!”ÜÑíáC˜W׌Å[à  Ra·kÐ|â˜q?‰`FÙÂØ{†À(¿x‰Ù¬7T¿s XÄÏÖÉñ‚— ¦‡7¥ÃûøÚӽ蹼P™£ëº~sOpªôÞ„"H“dŒ˜ÐZc¹\bC{¼…ßv0ß=c÷Ovw- ¨´–Å¿öPçò>›æ­3Pí¯@D=ŸAÛ¶½C3‘Ü! 8.!L @5‚Ó LziD $ÀuH“$Bb2€··ÐþÿñÚ´¥€5ö<ºN´]SÀJ Z¢¼‹×èXÞûÞ¾ÖÚ~î”e çªýš“ ¼µ Îå×:„=†2w;õ£•B[×`ë ¼ôHi‚©ŠžÈ'©$dL¡¯ 0³dcÀÛÙ®w©•†™‘Í*´™›1õ2d]"d]:O(÷+dUvKìok‹æ¨_e`ÙiÍé€ͪ¡?­oi"tuäP€m[”I%ÒþŽ¥|Œ1ØívèÚÙ¼„«[ÉFkyÊø¦EÈ Š[ÈK-2yÚœDe LCeØ9¸] o,ö¾Ð‚i?·Öb¹\ö½mIÈZ‹PKÅÂäØg-fs§#K¯ôÌ@ñ%YQ¢Û4àŽa´†[z`#„Pz¦áá%3oª æ!ÏÝû;†»â$ø› •&-äT°$ÒðAÈ©òE‰àL–#8·má#¸ÉÅÞ¡*ÑÕ0¹³BÝ"E/÷Ä̲ßo6899é®´Æê‚À)¯ˆ¾ta  ©Â°õ€§Øs* rúë")ÆÿâÖúJ¿îóÓ‡}ixçOWÃÃuèTÍ' ¤ÞJ FÏÒ°æyT¡ÓÃÕ¥¾­ö÷¿ï†õOޤW˜G÷’Òp]Ä•b•v”µh£ežŒß×ÅÃÜ7Æ~ïÛ€ ˜Öÿ´þ'ÿÿàúÿ)þðâÿWœ­•E>"ƒªªðÔßü¦Ë›êKXEæËÂ?"Áóέ;Õ3>@_ŸPÐÆÈÂa[y¸*Sâ˜5÷ýtóK+Ô®“Ï´üF‘• çbEa1rÄòû2:»¢rFu6— 0Ò´UY„þ»ˆF`†Ž¤|7»æž(‚(¹8øxÈO›\jË>ñîÿtÓç™XNB€Û6íÝ«gß=ã`è$@_(Á=”Fîm¶·êí–¼-„ ÌŸÌm±öôŒÔCâˆ9¢)…lDÒOC†Àá<½Ñ-³ÿǯÚ\§ï`ƒ…DˆjÊæ¦dMßÓ–®=ÞkB}Ìçóž5„p å1Û[¡>9é³å /”ðW„%#ûîÛ»˜øi6„&Iö1BëAš Š ¤5вDUU=œ±mÛS’5éYù“F´Sc6Ÿ´¬—´™&T’I:ÝØS— 1dŠ |ÈxèË/¢Sî–Ø?òËOHb1cþô Ä ¥:…ÖIAéè¸ ¯ñ' 0“^N5JŒª,¥J‰™àžë$™8§¾‡n¹’ÊA]×X\ØÇîh ßxE ë:„&@Ít®áçAÔ`<ñÿ>/øæ·!tþ–ؕƿø˜ôxÏ+°g¹†B!39,w ‚0ß߃E´e]×rO9 åøÙ]×!›ÏÐnÖ$²aíÁ>¬ö÷{„3ãܹsX¯×躮o·Ûl6Ðsï$®íz-ö €^æÊ‹ÏTÊlêokÿ³{Ùó†¾.öç§¾w=:ðªq@àТËe»ÐWzûF[÷Sú¨ª/}¶B×£ô¨rãìD+¾®k¼å+߯ïn©ýg«Ë K<ûÏJ¢Â_—ì01FPñï3r*!bµRx ØŒö/ ñk3Érxb蕉HÚ#Âuíõ`W’˜Öÿ´þ'ÿÿàúÿ)þ°ãÿWœpÿ´!‡;¼ä÷¤ƒíâ­œÅ!˜,C·µâ 0H<ô™æS?ÓZG˜÷ýu¤(S’¥ë¼Ú[ô “ÆØmTTJÔY-¿Ó’½K,}/_.PŠ€Rýßm†LÕþÃ×IV „/Ž{(WzDô²¥<î6ùЉ‡:“ƒGý\ÞZÌ–K”e).¶ÔuÝ3¦Lðb±@QxþùçvTjp'¬ÀýóÇèï)È´Bª£ -‰b€=8Á.Ý-°?‚Î Í’l2$±u€ Ãkâµ&Û+%Žƒ» ̸;ZΜ9ƒ¶mûÿR{KzF —tRw› t– á u&GXwwÍî¡óP…–€‘¿í  g½óϲ E„3QÏœÚyŠ¢èÁéI…Þ‘$ÄPz—9\”‚& 5 ¼£.o„?ý¯?üÏ®^•ý׿r(‡Á PÌ ƒ… Ë‹óÈÊÛxÆU!ž¹îùÅkJ°Hkmÿ|ÆöO÷ÞÅ=Äw~ÛAW¬•TxºWî(S}µUJ n<¼ (_·ß™Î"Á«sëõZë^Ò5É•.—KÔuݯï¶mẾA!l-fœ…÷ËåòÔ¾žˆrعÜyUæ òP;ÂÙò,®6ÂŽ|e²æt.°à?þ_?‰ê]ûðqþ¼Rûwm‹ú׎€ ÐûòÙ”|çAÑñŸ]œÅÖna*.4H »ïr¹DÓ4Øl6‹¥û^.—Øn·˜=r»g *Þ2|Ýá„Ö0yÞ“èÖuݰҟ£®káËYI‚½¹²–9Z*(Ò=Ÿ’¨Ø¼¨ÿ8 *F}—¹–~bèB‚aoÝPù÷@e”+`¡Ä)g@÷+ÇÈòL4J;Ù\ªy…j¿ÂCÆCFµ_¡šW½„ˆsYž¡û•ãÖ·P \Ae¦ÿ>¶a “_Ûh‘'8¿ŽÐ~ÑÃdø®ëûûŸü®Çè³ïS÷~³ùo+ÆRƒ2,>zç0[,úþ–ªHj£µFY–=3#Ïsq,Þ±wJ¥¦ØœFeF6}5lÂj”eâ"-t~öÿðñé€ÓD2¤˜V‰¹v$a£2s ¶¥ä^z‡+É¡ÍfÓo†Î¹>ˆJ—ªªú¬pžç˜-ðQ:3ËsÑ[^j±ÁÝèû2*:i†ßXI‚Cæ?A™Ä)Á½ÒšH[ÿœ"DQÕïJ!ÂÛ’&­*ôP TúE£À<ªrÝG^…ý?r<@›óQº”pŠrMj¸ÎÔ¦{€‚Ü[¼×±ƒHÏâúg4ŸÏûJOžË³ÕE.1›ØÈF$¶x…ð#Uéßì(Ó˜]:‹å¥ó}ðváÂdY†Ífƒ£££~OW+V«¬µ¨ëº×õÕZÃ7øÐæZæ‹Z¼Œ8ÏóžM9N æ£X.—Èã\b xãr;ÏÀ #7¹H¾’,¯r ê_=ˆñ+´õ¯eüL¿Ã¹ÉÁ #›g€’kb 9ÅÃW°FU,h!ÈÝn·§žŒTPh®Á‡¾é µÆn·CÓ4¨ëZä‚V«¾BTsŽŽŽ°ÙlNÙ¬( ,/ÇìÒYP¦£Tià?øÒ«F}Õ? Шҟ57P3l^ [–2Ÿ|ÒÉŽ_cE¾­âR¥Ütf†õ›*lQc¾ç0£ïNPûñ¡;% N€õ¯_íåÉ^ý»®Ãúׯ'#ؾøÓu”×]£Š×ž¸²aÿЙ‘ßÍè4'@ŸQ„¿‚dÿ L![–ÈæÔLCÍ &Æ6HvÛjZÿÓú¿Eëòÿ¯Mÿ?ÅÿvüW$¯}ÿÓT¼gÅÁ2Zë~CK‹Ì”Ÿ2”+p€š…uªÊ¤ƒ€p€@ Ô¿zþÏâzQ Єùr‰·}ÑÛŸø£O Þ41 ܶ¨§¸WàŒ‚ª4(Ó„Ö›4¢ñH¹º©ÂAÚ’#’„`=‚÷¸öýOßwÿ~0 +™´Î9xçà~|KÇØžzÙ1€‹ø/¾gÎÌ,Ù@¥àÛ;PïÎX ½ŒÐxP©/æÐ#"›,ËP–e¿ŽÛ¶íÂx=ô—Ž¡‹ ¼ Q˜oX7D2ù²@Ûì$û_( åá  < #Öñú×Á_ú2íÿ»íÜWéPBCÐá(Hú5/‹>ûŸî9AÛB…·:7ð­íÛ‚R ›N¬µ½¾¯Rª'…IÎÒEÇÓÑ¡‰URPïÎ8|о¢½Äý KºÃ×pîG.qUUÈó»Ý®OVÎf³SĦ{{{!ô•®Ž¡µF½Ù ´¾?œ…Åê¡iœ9s¦w|½ƒõ<8ï}],Øn·X.—8‹ù^;„Àا}ÚCt»Õ¼B«[øÌ9#G§;¸ßØ_½G˜ñKµ¿Í2yïÈg9|éá;¥ ¨w5Lf°¿Ø‡ÏJUA—*ϱ\.ûþ¾“““nöô=¦{ßÛÛÃáá!V\Àñg¯H0©ÐzÔ› ²²Äññ1öööp||ŒÅb²,1›Í°Ýn{)fF×u¨ëÎ9ìïï÷ÿ>þ¡+½=^ÞžA_GÜT#üQ/4`ùªDÝÔ0e2SäpÞ£«mì{_ëX ï vüXçE>@cyTÁ1Òv§µ†ï< âAªâÙ…ïÙù#\Þÿææ«°}Eöä3àFh…äªQ" ýW¢?äê<ʽøIš,äEŽŽÛ¾ÿYB °@Ùs9 2ÞyäUShQ82ŒŽÕªBwÜŽáGðÙ 6{©H€iýOëòÿ®ÿŸâÿ7þ7÷ÄA2jzªLŸÊž ¿¦>_U•ôÎ乨É`Å@!ìˆÈºÎ2°ŽÄð›ÔVYf\¾rE²t̰µ5—ú£Qf} fmJ=/ܱl>1o¡ò¬ïçI“›ÝƒRJzël8Õ+t¿Sð®Ýû^ô†Ò„¾øÏã”™Ïç8>>RH€2fs»}fÞoŒ§Ô´›e?Bã +‘Qy&‡P2˜¥J€ˆ.£Ç¾ôíÿXÜø18*¼9 IDATT®@™8Zàk+z *V6´º!cMDÐe‰°>˜kI`+°¶ÍfƒÕj…õzÝâ^pá§`íÇ·ä¬~è!ÖZÃÁ¡¾£vWF80’&t¾\ ùÑ£›^÷ÛæË¹ëº^ @¯v‘6H9ÄR‘œŠÏ0Ë²Þ ZkAF Ðqìûœ æ–ŒTÍJtzGýyô{ÑK´ÿïŵŸzœK‚Ê•ô|¥bÎL‹í€•!*RÑY¥¾X‘úø¿44å=INZ =.ÐueYöü)×òûö¹;ÞÄ€_ö½[ÉòB‰É7þÄ[9I׌ƒ“ýÝív"éÊ np€¥†>;ëû?³,Ãl6äHÆVðÞÃ{ßKUU…,ÏÑZ‹,d0l` ƒ¢-à=j[CA‰Ä–Ed—ýÄ}x¼M*6/ÅþØ1ÜG7ÀR*Ô°€f £¶5ÈŠe|YÀAÓ!“ì|‚6MÓßs”Ű·Q_9M°A}v&$Q•N8sÆõÏ6A|S… ,K4MÓ÷>÷>sk™á¿AÃÆpw]jèÒ :;GÝÔÈ«Ü+ôøÄó“&½ @-Éøž_˜I5\ ÜM¾ a‡\˜)9üCˆß‘¸ @9PFÏÚ’®ûúû1EÐFÅfÜÏ£ùÑ#z¹*¤i‚?ôcoä¤ œN…Œê{Ó‚JÙrvA`’lÌÜx„H¾¡†Ï ¨LÏ;öæÄ =pù9ì0ªè¤`¯T R™Ä—’)l"³õVØCÙ…>³?†öc`M¼·L$N‚s躮g~½òžÏÒúe<ÇqFÿÎ/Y)Œ†ÿ‰58zÁ×~âÛ>JˆVÊv'Øb",Jª3´c W‚°‹hʆïv»€ÌίÐè ‘H晬”"Ä œ—C‚úO¾øâöWOhgæÞ\jÀ(PÞ¶A5-C1(Ï,„,"”²i(¥„³&WðϦˆACý3Iÿ¶ÖâÓ÷ô¹Ö r¬pƒLèíãV¥·üô—rªêxïEŸÚZäEv³AØI5Ž4}ÀÞþ>v»f³Š¢8)'ÀÀÀ‘—¹{ãööözœÔoì¹A{ÒÁ9‹bV k;Ø#‹°'ÕMZ*¨Žåàô1¿Á;¼¨ý¡ôIŠû?Y¬.9†§˜Å?̾A1+ÐìjxÃPK S–}F?mÛÂÅW&À°£%–dz٠»Ý{ûû88~V;Ÿu(‹¾O4õÓ¦½ãÉïzì¶ìôM‘å?í…%  joä =oPÌ*±GœC€ÑFõAÈzqÑ.Õ…p•ì@<ÿ¥Å¡¨J(£Ñ¶ ‚q@퇽=UØgFoâAº•ÓÇ üz²—fX€>EYaªšfß“štPÐP…AQ”RÅÙî ˜pªƒ‘Ä…H¥ ´‚Ï0r­uüü“x‰m‘F90¡œÏAJ¡Û5½dZ¾WU@½ÞÁk/¾1’$Ò7ó¿¾urÓúpÖÿäÿ'ÿ?Åÿ¯íøÿAûgÖãûs`½ÐØ{×Å>cè½)@­Áˆ2 N¬¤€ŒB0€Êåö¥*€'>ÇØñõF6>à]#9üWæûW¹Èy°ó`ú¶ƒQdÜ(U’ÖgþÏOÂo<ð‘¡0ûþ3L:2X>À#ÎÞ{–ÙIR…*-UƒBÝ€œ¾œÖï$0kb€4'©æB8EZI6® °'TvÞS¼{ûSdóÌ1êû’Ï"C dñC¾–ú¾VöŒ,öõôjic6#­ÁÇDÑ I=ÞËÃÿDû²¯9mXgßÿ•/¼÷ðm ûEÆSX¨Çöï[ƒ´†·Aë¸A“¬G@·&(0PePD:™L sÕÀÎìMíŸí28ã8oEP¥U`À¾‹Ýk–Œµ\`ï¡"ü1í} P¦á-}®ðm ?búM{Úú/¿¬gëî¢ d‚§À´m[E¦®E·¸cÐRƒ[êugz[Eѯé){ž¡$Ëo"C¶÷UUáøø¸w¨ùbŽ&œ€O¥*á ®~ëà)@+áäVèìÜøÚ ¬ÿ9Ék–.B¼ˆŸ×ÄlDÖ®**”¦D`.×”‚·®ë°Z­úC‘) XçÁ‰[jç´ÖòÜšFúÿ.ì£~öPöÃöŒ®mQVÚ¶íŸY–e7ðÎÜÒÃ?F{a$Â]œ_¡ `ÏA4×ç3䱉„Pž¤¬Ž"anƒ¡—6S0…Ál>Ƕނ`@NÀ38l7ÌstV‰žv$àÅΟ:\£Âé^ý€ô ß¡¸/b(ymŸX˜á4ßÀXÀÄJ È¢j2ƒífÅrí£Ã¼FbÀ±Ã|1Çv»‘DI¬¨¢‰Ÿ{€³ Êh(R †! šKu¬ÙîDa!¶M,ί°¾z(ßÓ¢ÿóV'¦õÿÚ_ÿ“ÿŸüÿÿ¿öãu·'Bû"-„»9¤ë¯ŽÁØüîUØÇOz@Ú4ÕÌľªÀËA½uV’”ÑáËÄÁ‡Ã€pÙˇAœ~b$ΊÅ`¸• w󟤃÷>s_͇dÇü¯V+Ìf3„¶CX[PìG¥{mcýÚHLß µÅž…éCå˜÷Å9‡¦izé¬nÐÚy‘P!m¸# ¶t€ù³9 pƒý¡âïæ×öéòÙNzÖ ZÛ¡›‰Žy×uÒËè\oç‘&÷BP,÷(ÚÑè+šýÞGžç@%ÏŽamÚ³Ù «Õ mÛöÒ`/W9æeþÓ>XÈ¡gïütÁŠ´bïkU"+ŠÞN®³{5hÂгŸ Q1À”Q=‘Ó ‘Ij^pš³ÙLžUêù „¿}9cL8‹?·}†À¿ ý¹`Ðgbåߌÿå¨òoFói¦z²?­5f³™¼Gp^ ÂQV"RFÉ3Èõ rЗ×äÙc@@v¶ŸWYQ ¯J@:Óè‚ÅÞù3Е®»¼Î¦ÓúŸÖÿäÿ'ÿ?ÅÿSü/$ÀÿdG/”U >À[ßzl½†ƒGŸéÚó½=Ð=ôkXHßÔÆ#Xé+a$+¤G™`Ò㵌W£¬F/õÇ6Ègm¼ô³¥„kÐùÞ^Ÿ˜8xôl½ßzxë|xÁ êÝÒí¼Gh}„VI&GyßCÓk€FÒ4{‰8©pjЄ(Q®Y¥Õd››Øœ’¸Šï¡\¾?tV>»öÀa„l68u-¤©ç÷)¥ ŠË=r¼çx|æ;>I òÖ7È¥ª^öÔ¥¬z$%ÇPž‡^ö%øÓsÒ²CFŠ(Åb8öbò öggD§š %ÂÀ½ägðaÐ7€*5tÔtÑM¯Ukƒdiº×½ß‚¸ñHÒE³Ù ‹Å»ãcHÆjwÅjÑ·H%‰›ôïSÐE pÍH¸i!ÅÖÚžõz,'ÅFc›í›ÆJo¶À¼˜õRjé: S7å„ò°¼Áþåa ÊIÆ‹{/ßFò™[©Zk›Ûl6ú”¼UbEO×mc_'B{AÜS,õ¹¦R Åj!r¶ñ:Øì"Øl6ë¿ó¶þ˜~.=ÿ‹³+ #äeŽºk8 + ˜ÑÁÎu8úk Êñ¶8ÝO© º4Ñ/«Ó2p×ûö€_œKEQ ŒÐ™J-•@3²Û¸rŸ g#¼ûúýgGþb”DHó(UK-ß™Ÿ“Ö¹÷$Â(¹öðPÙ‚–B€.T½ôuϪÏ€·ìÜÈæ&Ï‘Ô]ƒ¼ÌŒ°8»‚.õpU¬¬ß†$À´þ_[ëòÿ“ÿŸâÿ'þ7÷öÌÿ|ç…ˆe!›áµ?~pÀÞ\„* øjl1ÀÞ<„1¸ ¸Œ6—Ý[\Z€*¹}®¶oåwñuœ´B´e„3qªª”Åð©gz]àÀ¡ ‰×?Ï1lô?(«ª’þÝ3Cbfd¯¯à /Œ¡ãpÆB!à™ b%¢ÊCù?\² !ÌšÐeAzø®cÔMSªªB&äJ´‘õÕI0TBN”6[1µrÁm¸Áþõgj©ÆC'DѸ÷¬ÃzÎ TìË©Z5h“óRÆÀ+ ¯òµ†]´•`ñ~Ïú?ÿ½OÒÅ|'=ëÝv'•˜*jå’êåÄêº>õ¼R@/dIBÆ9ŠNâšG‰¡Ô'›¸Vˆf9C“wð<Ëa½…][pÉ ™²*7ìÞ{èLß`÷Œ“ß$§ýiî¶‘^ç<ËáG³ßÁ³SUÊDl–ª:ÖZ˜,æo.:Õ¤¨?Ì^ÿ,œs¨ª EQ 5QÞ¨ÒàÚc—ï°Ûí°¿¿­õç$ zE‡ÿ(¥=7',ίP-fØl·¨Û*ÓÈ‹YQœ::k{r+xFØúÁÒ(XÒ"]UVœx{úŸ>0{‚«tZ÷=¶]H„€xHfRñàžöèv8TÓÂüËæ§÷ÿÿ¸•}½ˆ×0>ü§*~"û3±²Zõ,ì]×ÁÕ ÈÈáö†„Fº·XvΡ¬*ìx;©Ù(n@ØzieÔ<‚ePìÐÛ k[lv[TE…År°¾ztºîo};À´þ_;ëòÿ“ÿŸâÿ+þ¿·á¿÷„=tÖ]:@]0à­ô…zy@˜È,éq*·ÈX\X6Ïž`‹íð{‰džVܨÒp²Å:ß™% 'AöL üsFžü‘Qàà±ùá«Ã3»ÎþöùZÙ¨Oqánc²Æ0PAǨ«ådɽˆý]|Í€ @AIí!±+ÛQ¦P !æ ×výÇ<}1™H K×Gºè`F޵oÑù¨T!ò9D„ÏþËO‰íK࡯y£¯Ä`)Ë2Qç˜yø`‡$Ý&€a)9$XôªløûïÌnØc,ÀPÇdž™kè™Î³žû#Ä€>ù¿ÿ¾d‡X~Íü ]Ó^!Gǯ û¯V+Ôu£ƒ„Æ æGya‰ìÇ{Õj5H¹Ž”PT®a `µ"<´ª*4Mc æó9¼÷}%0,13¬a„e@ØЖàɃ4TÜÿI¤ÌŒ@ö³ýSöžŸ—¹‘àšž¾e5|ëA[BX„e€5 3ý麊xÓZc»Ý"±¥×u 0Ci…Œ3¸<Œ¶¾áYÌf3öä@åþÍók©DiBhŽ µÆjµÂå[¹#ñ˜ì/þ÷:ƒjVa}rŒºi`rƒ¼,‘ÅjeUUØn·hëäS{#X?Èò¥t†^§Ùä9Šª„íNúêÎ \™l úeYŠí}¤yŽÊ?Ø÷Œ¾ÿ;~в¾oØÿívØÓÍäï×|Úë+%ßG’;ëü¯ÕñÍ! @_%bfU‰ÎY´º‘g¸—1Lþ-X³ÌAžudÑ®ëZ’Dh¹Æ¦Þ³ÇÞrhÂúÊ¡ôÁ&~[óÿuë’Óú¿ÿ×ÿäÿ'ÿ?Åÿ^üoîM9NªN$ƒ; ;`T4ôçG!|*i ´(øÂ7¾ðèÁ£¸l/÷„T b6 ±‡‡w þc7H#ÍÑ÷b78Úi¼Dóþó@ônÍìøgn˜ÜÄþmCDCrG2xu d‹HÄÔĬ\'ŽáûC’I ÐÇÔÇæ@¬¦@Ç€!ÙþsØŸ† ßÎLJÿy˜CqÔFˆbû'T”–9yßó’Œö¿òáÏ¢øÓ{§‚§¢,Q;'$Ÿ!  –éÝô@p"Ão´¸Ü'•W@È´áç£ê_¡@…AQ–#ø²À¯|ø³§ìò¾ç©ü¾}VY&°/’ë®M‹ ÕkÂ~ýÑÞû.²m!º)5(Ù¤Ô™$\i•«º€A h‰ÒZc·Ûá™_ü´ À–À…w¼³Ù u<1¨2à¼C0XÇ5ÚÈy¨{ täéû_qW†µÜÆM‡ä3|ç…™½ˆ}¡•Çû!`6y³§~ëqyÝØÿÚ‡{–ó ÞËõÅ÷¦Jf‚‹ªªB×u}•[ú£\ãa›'''xêï?~ËöúFâ^Ú®'¼(y5›áÙ÷<ÙWþ¾göŸ®5‘—¤ÒÂ.ˆ\ÿ R´1¨ª*öÁkШª7TÉ£ýK‘O²]* 2PZAeFˆ$ùhØh”Hßdÿ§Ë§ÙŸ«Q€—Ö}:*ù»ÊäˆåÚØPnäBdq:@Š„à/Vó›Í>³‚bH¯qGè¬4\Eíì,Ëz$ò)ûh‡;ãu?ööç<6Ç‚ˆ¤Ép+“Óú¿¿×ÿäÿ'ÿ?Åÿfüï'üP•GrÙh#CW@˜s³‹g±þèåa"ì¢1»ø÷ PýÅ (u…JùYýêAÛ7Ç {~ö¾ì"v—உdD¸ƒœZÛ¤~ÁÀ4nVù ¥Wb&†:¯ÀÇ×N齩-¤‹v±@õçobÿwV¨ÿ}-ß•^›2†Ý¨ ?ŸVôŠìÏ?å‰1ÁÿûçÂÀ¬þiOÛAÑö:û·®Š/–ec ²²;x`ÞÖ€ªt-,ÚÜ0<„Q¹øŠâFûE…öwZ&è ê½òULAÐ¥FV–=;mðÝ£Ç/hÿ±F2}Kìà àÒ¯a­…o\_q ­Gqv ¥®~ßSþñ8äœbOËJÇ-UëB@žç¸ú¯ž:µþŸÿí'ûõ¿ü‹¤À4#h§áƒj@·ZdÑRßmlË*ßYÞ`ÿò%êß©¹X1Ò>~^è…ÍŽ D“ýäWŸÇIvãú?ú7Ïáü_}}OÖÅ^AŸÖº3§g’³÷Þw‘‹ý%Úƒ“(»Eð»¥ÌßôM±òŸÈ ©¦/Î,qòþ#:¹Nâkûƒ´pæÇ^Ç]×a½^K%”¬Ì,U7Œ¡2VU3BVJïzê›î«ÿ4:t{ -yˆŸ93ªJäñ²,ö‘k°uR™wÚ¸^íèQ«Á¦Õ—Ýdÿÿ² õï×C@Ú{ü(,bõ?P<ü›,“„€Rrm³|*(Õ£$ÈÐu²¢@VæðÎÉ3âØrØ£ ˜E  %g¢õz½=9¾çÙ¼MJÜ,߻ϛÃa1K1‘¹µíÓú¿?×ÿäÿ'ÿ?Åÿnüï'ÂÈ‘n00?6ö5WÈ–²‹L™!xå;.àä£ÏŸ†â·—73ººÃÑî¸"_q´;BWwà73èqƒ{ °|Çï1۟Õö²…õa€#œÖNIƒ)pçìÿf±ÿúWŽ6eUb@Åoû¿Eÿy‡ž8èqK ìý¥}¸f²ÿ-;8þ“ÑßÒ øçoŒ¾€ýÛŒvØûê‹ÐZ#›U`·Ep,ú¼‚ñy› ¸Ö,¡ùSÍ Úß¿Á£üt Ê&ÃpWtpC˜ '¨\!›U}ugó›WÅþåK³?ÿ<}»(˜ÚûTÂçfc÷þ¢¿¥™Œ›±w7È=ÿ½r yÛÿòŽ>?žàܽƒ) –ã¡ïê/>õ¢ëû‡×íËþ_«¶¡Î»9å¨U-‡’÷ñ^dý¿AO‘ ËX‚ÿ*Tè¸C—w­E¡`ŸÚÀYñ/°þ¯þâSXþ9 °gaÁ‰ÖZdó0ü{¬±ë¼Ló8Ç`éûKõê–²'?5¯‘øƒþ†ƒÿõ#8Õ÷ÎxDÚà"~s]àÄ’ - øã€s~xÝMïLJ/"¡$Äq]ì wÞÇ®ƒr Σ¯ï†__Ù'€~û?¥€5úŠqí‘L°y>e0YvêG¹–¾ó›•€h"ó§JkY7™ì_=³tâËd+mˆ@xÁƒÿõãäýr¡wk†fAjlomô7­ÿûtýOþòÿSüÿÀÆÿ÷ÇüjpŸÍO²>0Kƒêl…|•CͶ]´Ö°=‰}!bþ|`>ghû á íÌ"„*N€9}ùÞ{dJažçPP»€î¸C}Pø¡ßq7ªüÆt¼[ö¿·;½‰4Ÿ‰ö¿JƒlH ÐþÌl²ÿ=lÿpM·n5Ãl rŸC³†fЬϭ_’ý÷®íA ž<-þÉþÓ˜ì?—:Ì»sfþƒ½í¯ß3p7»¿û|dßSqhBã-AU.‡€*ƒ¼ªeNÞû<Àü‡Îp[7’8òC•<ö|òÏFXð}jú›Ähãu%tþ$ŠªÄö‡¤J¾|ÿ¶Ö¢«kp+J›H"˜‚Õ9A•ª0°?^Ó´þ§õ?ùÿÉÿOöŸìÿŠ÷ÜûfÄ^e¨#°e´u ®ëÄð©ÿ¢Á#œCØc·"à+þô;ñÛÿá·P½¾•Ò‹ÈGýtwþùwâwþà·Á;‹8I¶ñ»¹Cd5î|X@Cƒ-Cwògðaêýžì?ÉþÓx™ãEã×€ýýk8ð·?^“z·áþ¹Ó(ø"™Àø›÷Q3z_:Ówš¡Ê äúÃÿ}lþY&úV¢àû@Muÿã”Qï©Y”.Kdt‰Äª¾ø×âáZÿÓ˜üÿ4&ûßÙqMÕ?Ö¹U„P‘TI,»‘ÐóQh`0{œgO¶8sá šMÕ›VxÇŸùrÀïÿÞGqüÄ1ÊE…Ãç¡ÞP€: ·vBð°e¶ñ{öb°åT£À5‹dÌG¦-`²ÿ4&ûOc²ÿƒ3è; ã(J¦%¹Þ=‘ÍâŸ|iÐeú6b4ÿÜMÁîcûÓ·£ÄÍe®nö¾Ó0ÚÈ¥4Ì—ö5øŸ9šÖÿ´þ'ûOöŸì?ÙÿÕ s_M€€<<·ûj IDATÔW**ôd @$‚ô{l/zÛá>ó €0Vcff8¸z 033\Ý^Å®«AðI‡·þÛñ±g>&Ja€w¤ àÐO¾àDÊ$üÖ¤í>Ù·ÓþüV0Ÿ ¸íC>59ÿÛ5T­Á5ÀÍ=jÿ–  P™OþgŽè¯ U~´¢—|ø^ü€¬ƒ„pÕß“ö§óú*Á§2ÿø¾~îåÉíñO:¢o× Ã¢ÂáÁ=üOë“ÿŸâÿ)þ¿¥ã¾œ¬ê?×TìL2=©Ç®Š?[úŒ†opxØ[îaóÜ ~ýÃÈÎÓƒ=´xî©ç°xx‰õÉ´XXºPð‡^à 3I=Šæ4ÂïúiñßnÛ¿U3½žà7îž²¿^ðSŒð©iÜ6Û¿C3¨7)¸§í=es)CxB˜dÃïOsàv ý•†qž@g îÑîÞ²ÿæà®2üo=¸‡4úfâžpiNàݺ Hµa:O sûñ{ËþÙ—äàk ¾Êð¿qëìOC1¶ÜSñ/0MëZÿ“ÿŸüÿÿOñÿ«~ž÷åXô…Lz2lücbPÕ„‡Ï? X€ŒL‡æpîÒy„YÀsÏ=‡õÑë£5ž{î9„YÀ¹KçñÐü‚HAÄþ»‡Ï? ªi€š$b ï Ñ2Њ ÞªyZ¢·ÙÌÚ#˜ÏÏïû›ÏÏA{Ì'5Ûp¸(tI ‚ùâ{Èþ_œ ¹6*&ßÛ†»Pdï,îûgï,@Y|y°MÄ¿À”zùoåá?Ù_äôÙ»Ê{Çþï*CƒÔß­|ž ”ÔäÃÿ´þ§1ùÿ)þŸâÿ[¼¦î× 2yàTìÇZ1‚ôÎ|‘ 9Dà‘ &ËàŸ©å59¤G$Mž ÒãÑIFG?RÁY à+ ÿk“ýo›ý_¯@g ´"p'ÏÝ~ü.ÙÿK ™‡¹hIóƒŸ “ý§õ?ÙòÿÓ˜âÿ{ÿL}¿f1è<Î,Ädü\²=ê ÷5 K/·æÒ´_ÀÀ@ŸÑÐg4 ŒüìÒÈßv¸tñ" ½¯Ñ©È2™ÇïPb|:C ó™&§ àm£ Íeñ¸kö2$×2UîˆýS0I¸°cd_UÜqûg_U€]LöVtÛ*€Ó¸näC—pbwÚþ_RÇr ”#JÞM{ÿmvIóxø¯Œìíù·ÿÛs‘“ªÜÉ5â5NcZÿÓ˜üÿ4¦øÿ>XR÷åÀl˜zyhqÂÚj,Î,p²=ÁÓð$Ð f<òú×£[ãÌœ>~ˆüõ+\~î9éñh<ž¾ò”WXì/°9ÙÀ{/ÎÝŽ¾+NÌìX`ÓpÇÀݰú^J×ÒÈyrw2ì$¼+ë?~/ïÅkéÀ©äNïŠýÓ÷ÖC‚>äéx;‡¨xÇÒ‡ÉÛè{ïôþ¿f‰AËà"^››Ì4­ÿiLþSü?%îüˆNÂ×ë'Ö’±yàUºÜ·xúèÓøü³Ÿ‡7¿ùÍ€O|Ÿùä§a®j øb7Ïù …!»ï¦à=íîý'p€wÊþSxoïÔþ?ïü <€•T\°G½¾vìÿ,ƒÎÉþ5Ë<<æI|ZÿÓ˜üÿ4¦øÿ¾꾞†c Œ€ôh,ýp„€¼îà=ÐnåA¹B×vxîÊsxîÊsèÚ”+¸• ^Þ£ãg,ãg¦'f†ï `÷€|ç퟾w‚€ÞðX䱨Æ`ìÛŸSÐßIàÏ;¦ð¶Ããÿ?{ïe×QÝùªÎã>úvßVK²$c# cÇü€Ÿ‘Mf°1 œ0$³~ ,Â#?ˆ $Žä—x†ðÀ"N^( 0I° ŒI ^&‘ã'~Ê’h¹[ý¸¯sNUýþ¨:§oKmcËR«û»Ö]-ݾӵk×wïïÙµËâö[\ßÁ!‡Ûwì¿/|wßáöûk²·[I'F@Ÿ¡ÑgiWþnŒšjù×ÿfXïs`\¡ÏÒè3´¯ˆÿ „ÿÿ¯pÄkb”†)„0Ъ·hlh0ùãIöÞ²ê ·˜r[öÍîc¶ð2Nç`7nÎÁ°¯`ï={!‡‰ ô\ùéyÿÙÕ$ð„Àáw–ÙþràÄ€KÞ\nûËÀ“>YÃ…;8t>zSù¦>˹þžnR0í°÷[±Óq™7úÅõŽ×Õ°{ *Qì¸É?w÷X^ûïøŠï uïy1.wDÏŒ9ã“{ÄTâÿáÄÿ+ߥV¢sc§ÏÖ0¢&ÀÀwà,Ê΂ŒñçAö9ñ ˆ tvÅ|Kº€ûŸ;"–$ãŠeµ¤bß¶¼†’ ˜›ÄþÇÅþ/ˆÝ`Ïáº`:ËëÿÑH‚jâ·ÿ¤¾!išÅþÇg‡úº;^WÃ|¿Xœþ,ËjÿÓ¿Á‘ àÇe(ö?8ÜkÞû^Î;ïµíÏwl„Ïr*¼¨)ÿÞ<|–>ì;$\YP @ HŽƒý“ðÙK@B+%„í˜Û_ Ù?—á^q(ÀPöwÌíOøì%@Á J#OÈÇÜþƒ!‘AVzñð¿@âÿUÿ¯-*{2ŽMø> lV›™¬Mú£ùÞðªÍSFÑ©##ØMŠîƒs¸>0 ôt`ó`3“nÒ;ý ~Øý¬Hœ…c¨ûÇæâÙ?žôêo¿èßÅþ+?ƒ£…·w›í1²¿žô*p&ì-bÿ‡3pÞÎÁÿ#ج‘ým°ß¨sd 8Á({¥Áþ6בýû“þ@à°@ñð¿@âÿÕ½¦&Àý(:ÁP9LªIpÐÊ[P(ô¸Bµ5[·laþà<­Ñ­ÑóçÙºe ª­Ñã åßãÂgäá3;’ü¯htA•v²y ìßœ\P—Kò¬L”Õ9Ưl“#ÇÀþ#!ø7‡}‡`eaø@ì“­c`ÿÖdõyt@°pØ@R˜LýÓI/*È@ññáá‰ÿ×ÖÞB¶=TlƼáÒ,¥ØPø}-pÓP«ПíC Ôå¾âé˜,ͼóÏ“ø»ÿ÷Éâ¿¢ñ´!°æî´q”öïeUIi¥þÝ.ö_±8¬ˆo»4>Jû™ŸC¤h5à°;Ô`óÖÍÌ<8sTöoŸÒfrÿä‚ÿKÐÊÆawiúu í¥ÿ73ï÷]ä ø¿ø¿ð¿ð¿ÄÿkÊöñš›yxAµ‰!Ó 1Ø.0¢ ·ô:=ÿ Œh\t‘¬’ÿplDõ¹‚•²L³½ eý£°¿Íüg”ÐlølÁÊÅý(8jáÿá׬u”þ?ÍÂ?©ZùèàK€SªSa&Ço—ù÷Ö  Õ‚á;€ à`óÄf&g'¿ý‹Ì¿w¸˜öñð¿@âÿU ½æþ¢‡PÌQu쟘˜€C`»[XÐè¾&®ÅĵÝ×¾Bûר®…Cá½åÉsᳫN¢ öa‹=øìÐbÇ€Äá3DZ}P к`­eÛ©Û~¢ý·º k­¿ëW’H…½¿‚•m£~6@ÅŠÚXí'Ú¿6VCÅÊ'ß!àêH‡J@q  U=†õ?²Xe! ïu’Šÿ‹ÿ ÿ ÿKü/Àê€[˜SwLA éDJcCÃtÚBÅLA1Sxçž¶`¡±¡A:‘BÞ[,‚Õ+ÑÆñÿ~$û ¯i Ð#¦aï÷÷ú×<’ý ¯™F 5šÌ0ÑžðÝ#Ù¿ í Lf$\c `E4Fèýˆö×3šÆHƒ(Š$ÿÿþþ—øMÇÿkS(Yyh4ÞuÂÝ?6²~ÏÈ\xM7¼§>#—ÅÍ@cÀ<Ä­¸ZÔãVì÷þŒ‰´àÔí§o޽MÄ›cNÝ~ª@ë!l#`ÛÖ—‰'áß#þu®íÐ&ZÁæ%ÿ·Ãs‰•Pü_ü_ø_ø_âÿuÿ¯M`?ŠŒj£ȼAûéÈ“zX¨…çúÞèÙÌQî%ËÂg Ö†´ ßà£æmŸõ2Ø$Ðz!€ö<àïì•ý=zá9€ÖG¸éTÒ4õ¯É MSNÝ$àºIK_ŽÂ£\3$ÿÿþþ—øÄÿzÍN‚®7Ú“¶>‰( ÿP‡v»M#mxãh¤ Úí¶¯ ‚@ñ¤­Oò†ïŠO‰$ä/ P  @ü_ ü/ø_€•‰_Ü÷Þº³ß@Zí$0uç½é^%ô¦{LÝ9IxMÌ~ÃÞ[÷zˆO‰$H(P þ/þHü/ÀÊÄ(ºá/f!m¦¾¬/†Öh«:Ûµ5ÚªžO›©?òa,¼·>K @@  @@ø¿@ø_ ñ¿+ÁÀd>¡Ÿúþ”ïäÛÓ0ÞÙG¿Û@'¼f,¼§|¿@ €@@$€ñð¿@âV0Ê2¿ßì§lÖxËÿ¾ Ïm ¯‰Xh$Ô_H  P  @ü_ ü/ø_€•»P B2E݈(|Ù_h”õ2¢4"êFU ò°ðß%Î/@@  @@ø¿@ø_ ñ¿+}|'ß–˜ÃÌžÌÀø2¿Q0ƒðÜŒ©^‡Eöý‰$€@@$€ñð¿@âV ~ˆâ¾ùOé¶Ô—úƒN4:ÑþèŸzø]^{(¼W @@  @@ø¿@ø_ ñ¿«ˆ³ÍdC»ÙÆ‹5–v³ yøÝlx­,ü"‰$ P  @ü_ ü/ø_€U†=(f€IàÂÌ}30Ì„§áw“þ9öÈÂ/@@  @@ø¿@ø_ ñ¿«·¡˜Â—– {%Qt€©ðZÁÚ@BBJ(  $€âÿâÿÂÿÂÿÿKü¿¸86é£üë] üiDñ_ë¶÷ä;Ìþ*,ü‡d¬Iœ‰c ‡o4¼ ¿Óáù¹ðü,"®%œ£lÂïû>íSÚÌLÍОh3óàŒ_:ÀA`× þo H[)ÙCŒ‚Îýý›X˜ƒôä”l>ó7¾#öÿÿ $þ`mÂR€,øëcH@@@ %”Pü_ü_ø_ø_âÿuÿ¯ß‰þ\Uþo€‰Ó¯«€P !! %”P@ññáá‰ÿ×Ö÷dRè¼Wœ~ÝA !! %”P@ññáá‰ÿEÖ DXç  €’J(þ/þ/ü/ø_@ H(P þ/þD@@$€ñ@ @ ¬ô°L@ @ @ @ @ @ @ @ @ @ @ @ @ @ <ÔEÊ©‹”(‚u-C IëÆö?§… Äÿ@@ P  `Ùþ|åhAº!%ÝB+<'ÿÿ "B ’ Öˆí/ð¶ßùÌdýŒ¬Ÿ±ó™;ý¸@æ€ø¿@ø_ ñ¿2B ’ V¿í_¬œª+N;û4žyààᙇ9íìÓPu…z±Ìñð¿@âd„ $¬^Û_äm_Ÿh05?Ål ``¶?ËÔüõ‰†ŸrS@ü_ ü/ø_™!€I«Ðö¿¤5PMm:Gií£ Jk:Ç6 ª©¡Þ#ÿÿ $þ@&€@@  @@Á*B ª¡Û2Êà²^EК £ˆ¬×gðƒc[FQ ± ›ø¿@ø_ ñ¿2B ’ Vï¿Ôû¾sެ›±áù›o“ì“L%$S ÙÁ>cãm6<Y7Ã9ç×€—Ê þ/þHü/€L€@@$€‚ÕPWDèÀô½éÌÎ“Ž§äµœ¼–“ާtfçù/ï„þµuåß+ÿÿ $þ@&€@@  @@Á ÷ý—+Gt#"ª'ÔOaâôÍÔGšØØAh€õ‘&Ï~ÿ/:¼úúA=|†@ü_ ü/ø_™!€I+Ü÷SN"”Öyž3ÈXã U*¬q|âý‡xóåø£ßßÌg~gDjYÄÿÅÿ…ÿÿ¯ÕÔxýMWÝ7MÒIÈ}Æ·o@=?b0Õ]4Ü_;%n´ à LÏ$KHÇS²"¨àMÍøß¿1B´1ÁÌ`„û×T81BÝw3zý®ñ`£Þä™düþ_t¸øÔ¬)P/WÎ}^Ö€µ’Ú¼XœB•¾öò è4¦ßï£û96µP³2Ž«Ñ÷_ªþj ÆÐ™ŸGe–|6‡žƒyÿÚßo¹ršÿ~YƒH)H4ª¦q…E½B9÷9YÄÿÂÿ‰ÿE H(P°ò A) Öa³SX°ŒC¥àrÐuÍÛ>oØ ¼ôu¡²“a´BÅþ½Jiœ–5@ü_ü_ø_ ñ¿2B ’ V&àÕwÔ;5º3]0 ª®°³–g“À«ÿö$>õì^ô¯A£]£õpÆ–@ü_ ü/ø_™!€I+è€{ÐÑ-º0⟳ÿdÑiHàÝ_tŒÿ |êY°_´èÿ¨¡ Ý»>::Eùψÿ „ÿÿ¯u@ýªräCO¸ð0žDÝWþ`¬Ç  ^¢:œ  ¸Ï¬£$V@@ %”pý¿ Tîíçîu0 _½ê«|ìc#Éò9ø\ÅŸ}Óñá*’,ácû_ýïrþ¥çCê98ë?ÓýÅÿÂÿ‰ÿ×Ì0Fž¯‹M-£À¨ò–‚1-_Z¯~I9õ’Ü%ñ° u3L'£èç¨ÔKº®yÇ ŽÍÀůӼ÷uÓÉȺ6+ª °’ÏJP/ ¶x¹r´6R vÅÿ¿©¼m×}KýP‚Ûkp÷ZÜC7çP©Âf‹ À=äüköê‡è[ÿB«7¼ÕÑÝÓ…i`ì-Ìf!üÁPÈ<0 Ý=]Ü­:H¸Š@uJÈÙf᫸ºŽ?|®â!8"d6|Î)Ê'‘!”‘]%ÈNòI@Î×ù¼ñso$Ù–ðW_qЂÇÿ.Ù–ðÆÏ½‘óßu>´Ã{Bœ€Rþ3âÿáÄÿke­\2w~sì(œÿu^f ë Ç+eEPÇ2À»aå(äê—”c\¡"h˜Æ’  ;èØýEÇ<ðµ­[ƒÔ Ùn.(€‡îoVÐßöbåP!@©… %RZ¡"Zy£üÏXa?R¬›;ê%ÊQSð`˜§‡ÝPïú”åg/~±Â^îhOÕ€[U/‚¡0{Ÿp÷z?øêU_åöÛoç-Ÿ{ ¹Îaþ웎ÿç…ŠÄ&|èâiO{ÚÂÀá`á×<¹¸Jìÿ<åh)TͯÎ:Ø_ÐÜÖäšOuxå ïøŠã}¿¢hÖ›t÷u¡ü~+(­| 1æîëbÿoûs”c Ôu  ª£Òˆ¤^'ë÷¹ò=~­Ñà¦^qà‚ß®¡ãg-i½NÞïã2ƒÐúà¦}û™âÿáÄÿkTÐÿoâ\§ðêWª!V(çÅpgƒºb‚‡A.¨¶ ¸¿=±¶Ö&€úEåªÒþ8<’ôG>éWœ§€ÂAf}%ÄHŒý_ùúIþ…$”P@Iןýw)ÇPÛj$B×ÒFƒz½N£Ñà5—ÞÅ |(ÀíÀ3¯û“³1ÆP½^~¿OÖëaû9®cpûLƒ»Yì/þ/þHü¿†€úï»"˰ý ×5ž5ÃÞrÕˆüÝf6s>á,«ʲ ãn¹+ÖÊP/VÎßÝ÷ ‘Z¸Û+tª|²o®gz5hPÍ]O‰Ó”þZW —€€J( à:´ÿ¹ÊÑ6A´½A’¦Œ´Z¤iÊûßö#ž¤=縸ü š}Ôò¶ËÛ¼ãÊ>óѧcŒñ¶Ï2:óóäY†¹¯¸o‰ýÅÿÂÿ‰ÿW?õ€þR›¯<ÕEÁ`0 ë÷ÁZ\a°3… lƒ^ÚC$¸Ìøj«|yº2P/Ç•ÕËRá;üïÜï÷–àÓŸÊxå ÕÂÀºßHÏÿŸ­>‘ö ²åÙ¦~1”÷—‰~‰B¥®›S›iÐÓ=t;FÅhMZ¯S«Õˆã˜ÉËX_Éÿ9^4Q *еuÊüþ:œÛh°û+žþç))ƒôIõ# ÂWVôýg ¬ph|UÌ(ž ÜÝë1 ìþÇøØŸì\:L}È<+ºˆ \ð¤=ïÐâ4¥Ñh¦)ï»ô.ž¤ÝÃÀw^ÞæoÚÃg>út´ÖXkÂn IDATQJa!ì Úâù+ÍàûmE’¦(­)Š‚?þ½yë2ïøÝûùÝ·`îÔùí·Á•WÎð,àCP¯×yõïÞÏ“€w½s‚$M±í>.sbñð¿@âÿõ!¤iJǤiŠi6)Š‚,Ë(š¶(ƒv)öPJíµ_( ç“ç/þ9õ+Êri÷Ùc?˜«q¨‹Cƒ™8ˆeÒ¯ÂsèXÜÀ¢ÇSÊE tW6Šã˜(ŠÐZ£õ:\±„$”P@Iןëÿ_ùGÝó¥uŽüÐ,ÿû#§oÿÝûyÇ4n¶G´±I­^àò·+Ìlùƒóœß®qðŸßáY’ÑϽu}ÿîŸEÿÿ $þ_ýîòñ¤œ^ÝþvÎUk-Nc &ÏqÆ`fBËDz,Á—‡æ&|Há| VŽß"pݱ#ÔÕT¦~9”ø'C‰?„;þ •øã(ìlš1BÔ®¡¢ˆ(Iˆ¢ˆ‘‘´Ö(¥ªG‰½—ݽî–,)]çüÿóÊ1 j³¢vÒJkÒ4åÃïÞÏe‡€ ®|—g¿ü':küx7é`Üß‹ýWt8ŒƒÚ I6´Èç:üEHÿø7hœ…h¬Q%€ƒ~ß'€W[žóÛ5>ýÇŸÉèùôàÿûŸ§Eý~Ÿ2–É2¶_š¦gÖëuŒ1ÌÎÎ’ç9Å|7ØßÀ¤ƒ)pßû‹ÿ „ÿÿ¯à´ŸåÊ;ÿÆI(Š‚~¿Ï`ˆhµs}0U×þ”ë»Ô+£|yU¿w߀ûÊÑòJžê…¡“ŠoN’*\ä Õ¾áD®o!RÄ£uT(áWJQ«×©×ëÄqüˆ EUÀ=¿õïOh¢ªßP¾oƒjËÆ_­ìÉ/Æá•C[J" ÷kŸ´$”PÀulÿÿ¤mxÓß:¶'w»òTšÍfeã,ËȲ¬ºy¡CŒ¦i57ºÝ.yž3?;‹äÐ5¸;˜÷bñðÿK‰ÿ×Eüÿ˜ÿ§~ôé®L<1Xk«G) .cª‡sŽ<ÏÉfæig£ÌŽtP0—;\×ÁÀï³cpt÷WòP¿ 5üþÄšB5}‰?‘ÂiëŒ0“Α¶[$IR%ôåãðÄ¿Lô˽þZëª*À9Çoø×ǯ‰Ö.œ&àÔ±ƒ6lÛ0,låp~¹Ï¬ ‡Xo ~5ôÓ(¯&b¨a¤Z8–S¹êô´Æ}Ò¬Í3M%”PÀõkÿ_PŽ&°I¡Û)ÍÑQjµI’Ðhx±?Š"œst»ÝEþßl6QJaŒ'·^¯Gžç ºssØ™ úr¬ø¿Œ¶ðÿš?‰ÿ×]ü?Ö/»ó ÿªvþéO»2éN6­µEQ‰I’T\еZ~Óé÷qsgº™€6¨\ ¨9耺@9÷ws üæ—Ë  Èg昭¡ P&ÔQoãçÿ eLkþë;3¢0ò™yß¿¡`îèÁ¨ ”£Œ„ä?U¡Ñ_„íæ  9Íú8õz½ßrŒ—Júã8^Tþ?Ü›á®7þÛã¾Êè͉sÖ ßi(¥°£"?›¬óÇ"– q¨_ ±<&ÒrÌ{;<&X?ÄO®ÿ“‚‹Þc€ív»"€r^–Ðjµ–&€ ]:8—=Ž^öŠ(O¥(C*üÜ Ž¯båÎúJ“Ò†‘ªmýæÄ™äkÄ"øÀ/*ú!ü³|³ É·Z­*,çA¹ø—`E4›Mvûa,YÁÊDÍûÆŸüW½8 QË0Žã#ÀÃÀ8ŽqÎÑ¡kç°ïw5æ ½À?®0DQÄ+ü%¶nÝÊüä<×ö%´Ö8ç¨ñ¨8·äÒ_¾çBZ­û÷ïçÚ­ŸÇCG K#XñðÿZ:‰ÿ×eü?ž )Ç2AnyŽëPJU“JEg­Ÿ\Q„Šc"­¡:аEÉr¬±Ð7;\‚±’< ¨—‡E¡÷7Çx1X¥ ~)(|e›)}‰B%þ'õi¢4AÇ16\kåcÆ€s(­qÆV‹µsio·HS¼¿»6ÃX %”pÝÂýSê¥Ê‘Ãeµ·òÚ×¾–F£Áìì,³³³œvÚiÜûù{ùÑ˪øµä¥;>¿•Ó~î4FFFgllŒ7½éMÔ>Qãýùû«ï‘ÿÿ¯%Hü¿>ãÿøñ^lQ‹’Î#þ˜°w½Ü³^¾®¬0Æ µ¦V«‘¦)½4eŽÌüÀï³K:½0¢A[ԅʹ/=†É²‚&€ºP9Z@#$ÿ‰Æö ï©&jÕhµÛ4Ewû‡Ç©$¦¢(ªž 4æÃbÌÑbxbDoMÍ­/ùɽã/”‘ä)T¤ª‰¥£ÄD5M lV@f½Bhy– Aáí¤.V ÇK~ö,«ˆ†ÿv œÁâŸHy…/Õè4FÇ1.øSÞïãŒñŽnÜBÉ€)¼Ê—hœVèDc>˜­ýÐE@I%\s8=hïw?ï ûTwìØÁ7¿ùMž÷¼ç166Æèè(EQ0::Zíÿ,×û8ޱÖ.zÍØØEQðÍo~“;vÀ=<æê¿Çu½ñðÿ €Äÿë/þÜ@9€¥ã,u×øxÀògE‹š–w¶Ëæ<ójÓàr‡íæ¨4‚ØASù}&?¯ÜOìÀ¿B&€úùü7DÞ0¶›C¤Q MԬѣÑh,9&åX•ã=¬ò o¶ÁáÏ?aEph´޽É9çôz¸¢ð[ºn`q09&í›…(@)tªÑµWXlaQÎoM!ñ[<(ðÇ@ºà!xs}”‹Á 'õÒp „ºÞÒñÃþ¥}ïkT¬qÎb3ƒaqP¾ÔʰP¢ºƒÇÔ‚¨4ÿ‡,ôl‘P@I%\m¶?󢋸çúëÛ,\~Æå\|ñÅìß¿ŸÝ»wsÊ)§ø»YÎ1==MQ•À_rkQLOOãœã¾ûîãÞ{ïåÁäÅ/~1[·neïÞ½\yË•éjÀi]×_ïdˆÿ „ÿW$þ_ñÿã¼ô.õ”ü”+§LZ«‰cLõ|Ùq±Ê¬Gf­†gVÍPÌ÷䣀j)\×¢v)çn~”ɱ&€Ú¥ P-Ki¸PSSD#uÆÚíjûÁ Íý¢(ªºÓ–cYVRT\7´½àGo¾õ¸,NåDj¾sÂÙ Xè$^4~8°yŽŸÁgv`À¯d%¡ábâ+0²Þ ‡8(Âb`üx©‹BS yûÇ %õ’°°•M;Êý<ÁéUÍ7„L5ßH37^Ã*,d¡ê$(­eCݬ{g>"ÌEtþÛÃkФ$”PÀõ‡ÓÀízիضmÞpÃcë]²víÚÅÈÈguFƒ~ðƒt»]xà¾÷ü[I:Éü›ç9ß}ÞÜ?8N=Õwë[ßÊŽ;ȲŒ]»vÁÇv݉Rœyæ™´Ûmìµ×º{dˆÿ „ÿW)$þ_»ñ|4¢,ï.]/ÃÄZÞÕ.Ú²ü¿ʽìyžû»òÝ¢Àç•"¿¦aƒòÇ®ô 0Š¿Öšc}5‚Rjt=¦ÞhTÂH’$‹¶$” ™ä—[†–ánÿåï?†ñx¡ûž)Õ|çDõMåþ’rï‰N¿%4¢(ç ‹ë›p4…b@ßs…ßAMù›Àž盉a1(ÿöÇÒrÀð5~OOê …À7•p¹§}"Â>+ëPõÈ?–² J•U¡BÕŠTpþî{¦Ö\ò/ $€9?Ž à}’.'°mÛ6víÚÅ–°ýOƒû·ÃÆöŠmW0??_Jd­å¼óÎ㳟ý,ߨõ]T_1 ݸÒ¿±ë»¼hO‹óÏ?k-ý~k-óóó\±í ÞÃ{~â5Ì;Ç®]»¸ùæ›qbFññáÿ5‰ÿ×^üTÀ¿ùCuÆÇžái?úð€<Ïm (KÞ‡,“Yc ¶Ÿ{©pUãP …u¨ó”s7=âDPË0Ê:ƒ#¿ü<åõ׊ÆObwŠHaû9¦iª1*¢á¦¥HRþ¿$ªò¹GJôïøÍªåZ6ü·mÎSYJ‡‰;$P„Éà»Sjª%Ä 7€±Xå';]·0ªe9Lê|%HÆB™ÐOn©–Ñþ•âWVŠ$ÁñË& )ç–L4:Õi¢Z e-„^J)ßÁ3ŒeéðDÞáUbãÐãbú]ûÖT q bóq â'Ú_Àšª+N;Ž àiWðÞ³Èþ’üŒRî—^Ê®]»8çœsh I< ܶ‹."ÿ»¿s·›ê\cµaÃêõ:W_}5ÏyÎsÈóœë®»Ž/nÿt:ŽüZÖS ÚW‰sØÂðÅí_"º.bË–-ìÛ·oûÛìܹ“ 6,òÿ§E‘Û~Á¤×_ï¾74ZJqÎ9çøÿ\v7^u•»ÅÉÖ!ñðÿê$þ_;ñ|´!ÏóÑe¨ }xïÿábÀá=Êä¿( Š<§8ØA5#@¡´ƒ¾Åiü$‰€–‚ ·rÀ‰pQ¸f Êá+”Báè=4M¼i„8Iˆãx‘pxß­u5F%Y W-‹ÆGƒéwíS›¯<Õ•• f¨åð1à ±Öz…0LÚ¸Vó<)ÀZlj|³‡_ Ê}DQp  êEʹ/?Ê"pï¨)Wy‡k/Žìûù@SùòT£“´F—5Zã§ûÂq™:Tƒ YÚ}¸±åä嬹ó¨îžrÀSäà OY†°‚$€Ç»víâÜsÏå®»î:âw#PÙñ¾àöt»ê}ï{Ÿýõ_ÿuÒ4eóæÍ|ö³ŸåàÁƒžû3 ±Âë;ZC83™ªÒÐwN ¿þ^sÍ5lÚ´‰‹/¾˜g<ãdY†1ƾãïPg7›îg^ö2¶mÛÆìw'ï¹çÎ=÷\nSŠÿ‹ÿ ÿ¯Hü¿vâÿ£ƒÁ¢f€Ã >øÎúå)ÃÀ°³9çÈóœ¢ßÇ Z±Wz´òk}CƒñûI”Ã7Ôk€zrîÆG˜êøM€YüQ/ð{ÿ‰|)‹SAõ‰Bs¥pT+¦8ØÁ×põzU‰P–ú—[&Ê1*= c) ÿ\N”öy†O)(¬òƒÒîEŽ¢8ÇUˆcTÝa²—X˜ µ6eÃŒ$ {îK¯œûªSKÀñ¿°$¨ó•«®$׬©J’Øì{Di‚S ŽTÑZcŠg q’„¾qWBÕá'E W„,ÇöÇ õŠPUºŒr²EÁ¢½_¥€‡†güXKàaáoóŽÌÐ^°ðœ©tì…†¦áOvŸ[¤$€‚™™™%Ÿï…ùqóÍ7ó£Àå[¶latt”n·K»Ýæ¹Ï}._øÂø|zô@¥àâÀÚEÝ‘ü–Cë÷¥fðùô:.±¯ä¹Ï}.ívc £££lÙ²€Ñ$©’“¯?Îkˆÿ¯uÿ¯mþ—ømÄÿG- ép¢Ç1išR *O9€Ãeyž“ 8c0óñæ6Ë|Âo½3‹®ý%ç••GR·ÿÞñ›Ûï‘ÀPê᯷,ÓPañs¸²iC¤ˆ6·(¦;(­±Ái¬µ¤iZ%ù¥‘ëõ:J)ß8#4T·Åraïew«'}àôEÛ@â8®áS †O*(ÕÂòopJ¡ÃÞÇd“sC:H1#e*U˜Ä`{ºA |®rÛ7¼xEÀžé|£ 4A74Qá¬ÃEŽh6"«e0°$c#þ{Ãß\ϪWÎÍ$Iª&¥0TöËvü½—Ý}BÈA½T¹Š¨ô‰—ÿwC„Wq¢†ˆ- µ°`þð…ðï·}˜«÷\Íßlú›U¾æ“¯!‹2ò†qH‡Æ%RЇĸÅÄ_6Q¯¥e u¬Žºk®$€’®PÌ;ÇwÞÉ–-[ؽ{7óC<óŸÀõú׳iÓ&&&&¨ÍÌð–·¼Åyæ™ìÞ½çÛ·oçàÁƒ¾é°þmćÊÂ8,NEèÕS6£*|ùif3<ÈÃ?Ì÷¾÷=”RœuÖY¼å-oq?øÐ‡˜˜˜`Ó¦M<ûõ¯§yõÕîC,2ï»wïæU¯zwÞyç¢kˆÿ¯™$_øÝò¿Äÿk#þ?j`ßÛïQOþà®T}†»ÖGQ´ä~ÿ<Ï}âŸe˜ ÝµMc(¥È‹3×G7c‚=ˆš)6ÏqÊâ |#…šC=O¹í­2æopÔüµ¹ êùÓÍ=1°Ýœ¨]÷{66184G¾”~iáì鈿‰ *Áh6r (Ϻ†ëìuôoè³gÏvìØÁÅ_Ìøø8ãããÌïúÌ»‰î‹17¨çÄœþm}÷žóñï~‚OÚk8ããêbNñÿÕœè ÿ ÿKü¿&ãÿø‰¼9Ïóªó©ü”{úK#—I¬1†~¿) ¿/$/p™!iø÷ ˜ùq»Ž5¶ê,§)¹µ8g'u¯  ðƒ •úæÎ9T§)¦3À9/6Äí:ż/åÒ”dl„|¦ƒJ½±m8¡^¯W§ ”RÕäh4•T>NîëjçŸþ´+År2— BÊEÂ9Wõ9î¿P.EQÐïtp=Cƒ:ÙxËýê6š2Íû…­À_ä®ú‡«¸ôç.=¡pÕ?\寫®¯áç“-£Ù(³µY?¿Ç-~^¯Ožô©ŒTåZÚ|xÛLégåÉ帖åAw½ñߎé"¯^Î*z©B/Õ,üÑ–Î:¿ÍEißóBÃq‹Þ§âÐ#Öþ\ØÜ¢tä?Î…àÀ¹Ã¬·Œ6t»]îù¹QøûÙUÞós£t]3b|W[*QèšöÛ‚4 |UsàbЉ®ÆçÂÏ07cEØU-jœ¯2Ò!:s •SüL/†ªÔÒ}~uˆ’®oÜö‚ýd c ÏŽ ƒû¶$¸.¨:¨¶úÿŠøÁFÅn·­ûÎ9:<ìž°X@äp¥­Mè@]àe¹©ƒM›6±}ûöŠÊïøÁócô©ážÁŒãÞ&¨¦o¬R` îxMнßÂ…Uüå'ûÂÿÂÿÿ¯›øÿ eRZ>Œ1ôÂÝ첤üŒ1Ø¢À¦›‚d¬‰V “ç˜n†ICWIå’Ì+F&аNUâWÙ`a¥(€Üº0’^ØòÝ/£(‚Ì¢J{…L¤¡*@% ÉX“|®‹É ª™b,Ë*Ç)'Bé8Íf³š 嘟H ƒÊÖ‡_Ïð¼(E (ŠH’c ƒÁÀ C½XKJ‚›Y??: Sñq= ¾úƒFX"N8Tel üb¯F[T]1•OÑè40í ‹ÅŽAÚM0ÖÒïõiµUw” jéà娕Ge–cZ>w¬š@z9KYÁ¢Â‘%e 5ì+.”¦™Ú:/¦Yï_:R8_ÄC€à”÷k—Ù0ÎÎÿŒµ'1[ªä´­5×p˜ÔÐ?ÔgË6¸‰/O¯èpêEè̸&ž´3¯Î{áÑU¥‘ΖD¯|ã—²Yªu!)ñãªå×ò97$Z–A™Á ׯŒƒÜ·‹üÜV¿²P¶é>³rÅI×9:`ï°0¦P ÐV¾ü³ë ® ×qÐñGFMOOóío›3Ï<“z½Îää$Ÿ| ¶GÄ#5ŠíúõL/¸Qˆ”KÊ*×Àâ§7):>õð§¸tòRêõ:à¶ÛnczzÚw§žu83t‡®[vv9줃Y·(Έÿ¯¸¤_ø_ø_âÿuÿ?! V«UªÄpyy±EQT¥!Ežc¡˜ÖСÔ!ïõp…%÷ƒÑ{x†¨™úD: {!j5L2Àà”ƒTAÃqɇ/á=¼ç„N€K>| lR¿èBÅ„R Ríÿ¥°½œÆÆ6¦fÈç:Ø¢ i4HZjlâ1U5Ê(÷y”Ý6KA%I’Ê‘Êß(TG(E–e•8QªeáFñ(E·ÓÁe9q¦Ðã ƒn4è9èרDASa{Æ“DÙ`#ñ$ýÎϽ“g xççÞé¾¼ž°ŸËjKÔˆQVÑÏè9…ÝY‘Q¯Ã|N‘æt;ÆÚíEc2ܳÜ'5\”eY%‹@ÿ¦v®³@J9é0†ŠÄ)UiW¤ºÚFS’·óQ̓jî•}Ù¢À†¨k|ÿU(j¬±zâsÊ‘rúYŸClD¥³+2°QtäW£q‘ÃEŠ8U˜tUã㈶(|CÙ¢À;ŒY_ÝT8/bª°®•ΫSþ®ìª«¼ííÇìÊŽE8zíBb7ÉãJÙì_÷©Ñk¹tò-’.7è§iQ>Ø ñŸJýÚC *ò ‡²¾Üô–[ná–[naÿþýìÛ·žÁœ¡˜ëÂ)ŠÚæQߟ]°¿²{ùg¥Ø™œb×ÿ~SÄwÜÁÇ?þq¶nÝZ•¶ª ÚžëýP¨Ð ~ßÿï8ì+öÿ_‘þþ—øýÆÿO({¬Žð+ ƒ/ñR0ÊN…¾Óÿ;Ÿ×ýü("ï÷})üh(Š|§{]n˜wAå#õ7ȱE8N!õª×»>ónì…ðüež_¿þé3ïöGÿ¥ª"+T-©J9¢f*üþ'c µZ8ŽÉò~Ÿ¸^k‰Çê‡úèVâ· UXŽs–eÔëõªÉbyĉ¾·ß£¶¾o‡;¼ù‡1¾t+:Æ¢,y)·…ôz=œ1¨ž%oøíZ£YlܼEh,eÿ“°ï,q¾äÆx%ð»²ìðÝ Aª_=|~¤ TªX¼PåúێгàÆ5Y–Q­aõp±¯˜9üd‡<ϱÖV i³Ù\Ô²\ ö½ýž'œ¼éfŠ _–»J ó%faÌ”#=ê+m¢ÆÂ>¤²‰ÂŸMZ–3•ÛÊ—¯¯:ÇZ &ÇäÛ·h¥HI) ‹ªi¡¨5‚#Ðô‰ŠÈ“ØPhÅ’à§7î&:©á‰è(î:çø´ÙÍ['ß|Dhñl²(úªï÷‚©P¯d})¤J4 Qìç€uWe‘iB|}xŒÊ±‹¢•$UÙœ³Öo ã«Zaÿ]Ïo/²sùÂ~Áòô”²éR¬=©F ÓKÕ'€&Ë—LõÎu’ïV\ÔzþìÝI5d h)â~«•3fÉд âv* àñB nz³ÂÕ€žCYŸºÜÛž¦‚GQäî‹¥ï IDAT<ôÐC\rÉ%œ~úéÜyç|÷»ßå†é¯,غÇàÁYÔScÜ\±xomˆ Ô¨Âîͼý·6+ûŸsÎ9<ûÙÏæ©O}*wß}7»wï¦(rb—z{w®æË|}i$ÞþØ)÷£,€Äÿ£ ü/ü/ñÿºÿŸ5Ýù†UOþà®ßïW뜫zT¥yŽËˆÚµ…còœ¸^§^¯“¦©W‰¬EÇ ƒ…£&´Ö¤õ: Læ›gÔ|€=Õ7Zh/ó {ªñ Lj¡Gùä?­×«/JJþu¬q¡T¦V«‘űMòœ(IüïÆRÌ̓ĸ4­JA`a+E¿ßÇ9G½^çGo¾õ„ßÁ+›|”G–JU¹O¥T±ÊƆ•X”ç0Ÿ¦ úañšÉÑ Ê9ÜT¢qÆå "­)o3J’¥ïì~Ò_“ž<ŠÉ2Ì­ƒÇEÑOÕˆÒ”Ýê¯yóäæ#ï$Áù@3\“òs,Ê56µþÚ‹ª)\]a§s¯röÄ£)f>ÃÄ1N§uʹ1ÜEµßïWÇ®Õ)Ǥ‚㪾ŠßÖt./@[\-ò=0Rå‚H¡“&Õ™¤Õy¤C‹Öð1Ÿ¥hUå¢_’[že¾ˆWTªq9 ú_Æ–ù`Ï©¡ýl‰ç^¯Ç¨e>í¢"Èå,}0þé:8‡É2¢³ë˜¹Üï=< ôÆg QšB’pÇ¿’@‘ç$õg 5;œžóó!YHË@Àf^ÁôP÷mmaPIŒÍ ŒÖ$iZѰê;Üñ5 Àð8;çü‘2# ?Öõ›åØÜø}‚I(CŒ•Ÿ¢±F%1Åû»+·ÀcL‹ aÉð+½\°»æíß U^£C’ÁóDâÉ\·“Eö_*$â`Fò”š$€Ç¡)–ë8Ô˜Âá×§Ñùä?âá ¸æÐ5œþÓyÊSžÂÎ;ùÄ'>Á+ë/çóÛ¯_d··XÚþSàæœ÷ÿ!û¿|ïKùþ½ßç’K.Á9Çw¾ó®9tMõÝɦZ%T=…B ¸› ¼âÿ+ÂÿÂÿÿ¯ßøÿ /M½^¯jøWv¯/¥½n—âPh¼NR÷íP²n—Æè(###$IR•¶›ÂqµZz½N§Ó¡77GÚlÅ1(Eq¨GO)ÆÚíªÑâð>‘Á`°bÎ/+?JÇ/'i¹DQTU‰”¢ÌLF⪱…ɉ·4}‡Ì,«TL—;Zù(3zÖïI³A¡Ú ´¸Ÿ²lÜ´‰,˘æ<Å`€½uðèðM2ÚdtlŒ4MyøàÁ%ïTû~F†Ô¿È­¼ÅL>ç›BÚP—¦è- Å»èvâÇ`$ÆÌô‰7%UÉO¹'¨\TËrŸ~¿_k¿ß?¦•ÃDиbƒV$Ë9<¬P–áÿ«×åëËk4ÆTó"Ë2¯ú†ý€*Ѿt-Ì庭‘§9ÆØ…²5šÅ`#K¯èyòߟU{°– ¿ÜùÚ‚ýççq-‡Ý8€‡Â:Ð ?§€>°hi¢4]dÿ%À äû3’­)½¢‡ìŠZvé sXGš$OèÑ_8&Ñ~ j1.tt-Uòr_X9~äø˜/(¸¦[Ô!¶|ï½ÓÁ°ÙªOó *û/•¾¼þb¾ö¬o-¶'Ø¿óØìÿüïË÷ûK$€¥ý4¨’I12…ËÂÝÞ±ðüÀ¯µùíƒEG‰Ýu×]|ík_㡇⤓NB)ÅÄÆOÈþíCmÆÆÆ¸öÚk9ùä“Τ/íû€äi5§ºVÎOpYà¦LN€ÿ_ÙC-ü/ü/ñÿúŒÿŸ°0lðáÆuÎ9æçç)æ}I»ú²^Ñ h4•`àœó`(¹BëÊ8åd/J¨Hƒ1ÞF®ëÙ¥&€=£ Ûí2::ÊÖówÐív™½éÇ:jÏ£=>N’$ÌÍÍa‹bé ༊¬F}ù¿r†".Úó¢Â^°ª,ë(KÊýç"m4ÐI‚kYŠù>óQÄØØØ¢.‘eSˆrìO8„­ ¥­Fu½ZëÊéËÒŸ~§ƒ›Ï¡UÍLìlNºm”8IÈÌÀ—¥Ù³À|1wC=kPò—"€/ÍÜXÙ?MSºÝ.sOÂ=TÀ ppÞ“Béß6M­Ý:ÂþK@°¥øÆ Œß‹5_Ì{Õ·°`À T*C¶EdûçÐíÄÿí͈ÁÁ9T+¡>2Rí›*çF¹§*Žcz½^µP”Dq¬±@°ùÊSÝ£‰Låu  ¥â;LJ%U cŒÁts,NÙ(¨½=Aýw–Ô¦dóþŸªi\ÍY?#¹;Õ¾ÅkfŽ _Q 74ÿ~±ýó)\?Øÿö!ûŸ l:Òþ¯¸ÿ%G€3×,ì…´ î†¬™ù9Yó »XèAÚLÉ\†S~¿ 5üß ~ŠNFÔL*‚¯ÕjÕq/ÃÁVé?ÃÄ^î¯{4M^þÀê<ðQÀü®ÿrߪZ:<Âÿ§ýÛí%Àòœæ`ÿüîÉΚ$€Ç”TBŒZ8ìSK¡bhÚ‘ï9ÒþÞùs6ß¹™W¿úÕLMMñõ¯ý ÛË–-<ïyÏcbb‚¿üË¿äÏ;~¤ýoœ]«®Ï/¤aMËÂß"ÿ_þþ—øýÄÿOX>°LŽ«Óz}”…|0`|ãÆj|ùÚr…ă®-4“(’4Mé×cì¼ñg†6Œ:Ô~µô˜þ EQ0??Oš¦ÔëuºOoRü¸ç¶t‚ñ¬Wrô¶”Z½^Ýa/Ь]r¨ƒ ¶zµ×Ο‚RICOé”J)tPø c¹Ÿ¿D¹&Š"f¦§‰ÓǨÜPôútã˜F£±èÄ…r¯ÈJÀÃWìUï9Ù•M K(´á­ E–QL÷ˆÆj‹œ¿¶mŒ$MéÎÍá ã= DÛ5˜¶ö”uè„=bM‡šU\Ó=’~¥þ2þ¦ù•Åö¯§-ãC¦Cöo€nÄGØÿWzßÿÑaн•+¿hD¡KkMc;~;Š©;èZÑ¡LaúúEAstµM1Ø?KÔNý4"¿G5,–F£ÕÊù¾¯FÙpóá+ö÷¤®$Ž-ÿc»;ÜçKᮼ¾4M5%)Ï(µÖ’eý~ŸA¿OÞéâ2¿/Ε]mkao×Ð]€,Ï`TAæÐáNM‡vŸCœ,áÿÓþK€IHNÂÝ—†ÏJñ[˜É-Œ*²~¶pH…R1‚b HŸQÿ‰  z¡rôý±OZiòóÕ)Î,ƒàŠÿŸ½w ¶-»îú~ó±^ûqιϖ»mY2¶1œŠ«\¤U±-S¤lÀEÀɇ˜ P´lÇ8 82…yEàT e ²CŠ&TbÙ¸bÇB.‌ `ÉzØz´P·nßÛ÷¼öÞë5ù0æ\{{[î{[·Õ÷¬ªÛ}眽ÖsŽ1æÿñÿ#£x[™ùÌö?Ø¿¤ýmcyË[ÞÂÍ›7Ùl6ãÌþǧǔeÉÍ›7yË[ÞÂ;þî;p­»ßþÜÛ?º(óÉù. —ûÿKpÿ_ÆÿËø™ÿ¿¾óÿ.d‚‚¼áóËëw;âèQ•ÀÝÇaàʵk‰A–ºËº‘R95k7;Ì¢ž*Hù@]E]Óo†$S¢ÆsxÆ<ó à;ø‡oú™‰X{ïùŸùŽûfŸ1ÏÈ÷.´jŒÉÖõÄ}‰OŒ1è¢Àï:ŠÕbš6Ȳóy™ÅbÖšã_¤(K£ßíäÞ“êB&ƒ(Š‚“×H°Èë ¿7­5EQLŽªë:ü00¾°C­-QÖàNZê'¥â¶Ûl(›7ޏ;Û  ³°„ÁϽhʆHì§„ÅzñYÀƒØÿ¥Àb½ Û)©¤áÊjmÐ¥Áo‡½Óï<æú[´Û-‹Õ õäÝ­ìQ#¸Æ2ÞÚÂÍÈ.ñ;X+¥H3¤ª( î~m{ëOR½á¯¼)Ϋü™œ3ÿ~¾WÇq¼÷ÚívŒ}ï)–Y%rj¡Ñ•!ú(l¶™}Ø*T}TàO|ç1Ö ÊH$¢‚b±Y°;Ø¡kM½¬y÷•wߟfÿ{Àwßx7‹ãݶ#tÅÙ·tr@)Êh|ç¡sT^‰6=“–`¯Jƒ2Š =qˆ6J‡ÃE\Û“Í6Ïsa¹P¨”š`b¹˜˜ƒCî|æ>ñšL,Õ·%"+ïÝE‡öÝhõí*ê áÅ—>¿šH‹ò(—b²ÿâÊâþàòÁì¼½xü»ïþ»ìŽw“ý§N‡áW;ÊßV¿äÐ|›‰A§±°R˳‡ú½IwÛI"&^€ØGøtD•¢c„ ÆO÷ŸÓþozÓ›èûžçž{Ž[·n=°ýoݺÅsÏ=ÇSO=Å›Þô&Žn}NûOUrï;`ŒÄO_@^îÿ/íýÿ/ãÿeþÿúÌÿ¸¼Þáœcè{‘ªÐ2û>Ž#W®]›„snšiÏÆI­~‚÷Ä>`ãè No­¥®k†z+l¥ÔRzh£å×Ýý À1m¢¾ïq}½ŸÐÿ`8Û ë’²®E¶ð³TÛO¶ðè¥ÚW÷¬™ŒB˜à;Þ{lQàú¡ñÓ¬“÷~ª–eÄD6î•k×8¾{¥µè©úÀÐ÷ÓËß—+C¯…+Û)jBl·[º®VKçdó¯Œìk¥pÛžå“×IÓ¤ â8 ²± hPEòÂ~F‡.-˜$ RBûÉ–÷ü®÷ÜüæÁìoxÏW½‡ö—Z¸–6·UÂèRK¡ŠôìZ?Ìü¬¶(X>yíícLSÈ;YÆvð„¢M u]³X,(Šb‚= å‡ÏüÀ'Ô›ô·Ä9Ì/Wž3J§ë:y¾D 2"4´-¡RFO²5ª6ØÚ‚µD’ï0ƒöœh×jc0‡Ãñ ÕÖQd¼ñèJspt€Z(Šº`¹^ò–ÿðb苳ÿ½ à»Þû.PTqúo¼èüƤ™ <¬ˆFãMR±ŠÁ D—$b ‹V ±óDQ…&ôžè;ñƒ3¨×8ŽÔ‰\4Ï×eÿ›a–9øøÓ¿öšI"ÕïO H‰rŽ:‰€K{özJ胨¨P×zÔøM¸pD1AmaY¬ìïÐùƒÙÿÞàr½¼`ÿÝf‡ÝÔ‰ŠÇñÂÐŽšp=ËtX1õ¤¹L˜28PPÅé]ˆÿàñ,„å•þZã©è>«À^æêsØÿ÷½û÷ñGãå}ï{ÏÏ`†úìÿLñ ÕOWܺu‹S?öùíßFØEb›ºÀ;ñmQçrÿ¿>öÿeü¿Œÿ—ùÿë/ÿà@^xæ±Ûí„À!]UÅjµÃŽã[Éö¶m÷’!ÆLsòj4¯€dG£Œ–Ù!%lš4–‘ŸýòŸ½| Ã7à¯ö`4qð‰t~èïEž¾çʦ½'0Ðu#ñÔA O|ýÅð³_þ³p‡Dô¢'©MeôNæ7˜`ú™$%ùågÎï!“ddÍ•«WÙl6ôÃ81™îR¥m>^ðšIØfEÍf3­‰q ㈻ÝÊæ×R-ó'=«¯¸¾_ÔiM Ã@t.éÏC€:1ˆFaÚŒ.¢¡dÊÓí}ÿ܃ÙÿøÉ‹à?ÿÎDú‘6¥áÑŽi601¸ÖZî½2"±“*‘Ëå’¶m§"ÐêæU6Ÿºƒ9¬¤¨µ‚ñÖ{£™j®ð.‹é]?ŠëãOÿšú­?þ1þq'›w]7U{ç’•„;'NZ]zù•Â. Ðò¾¼V™¬$˜°‹ð„EVGF†™ &àŒƒAý 5>xÚ¡½?ôfÿ[æbØþ|‹BbÔ¬Ç8Iâ¼Àû¢ó‚H,KœQ˜ën9Leð•“gLÏ´Æ. Ƥ¢í‚tG°s8#ÅÒœxï§àšIQ³?Í‚~Ïû¹SPß•’þLÐfÔ>Ð’öµŠà¦0¨¨p;'ÚÓ¥¸c5º×èNcZCzÆãaê XcY­± ËÆÉþ¿óù¼íÚÛ䨟Oò@öŸßþâÛ‰cœì_”k8¿{Ž ŒŸé±EA½©ðÊOs¡Nûä»dÿÚE‚nÆ6iœÍ‰}“ô–ú#*f_ÿþãU ñJ˜¨œ0Âûqü¼öïît¼]¿ÆdÏ|òÁö?ü„ÿ ~îøçäk>ýÝé€ÙZa2ßÅÇòð¹ÿ_Ÿûÿ2þ_ÆÿËüÿõ•ÿ?p oømÛâÛNŒB¤X-§êE^ ™$"Kÿe¸|ßuhcpã…¾0û2×—ˆC ¶”‡`Dðöûo󖸸Ԍh1>? œìª‚Nˆÿüw)þŸ¿ùkÏD¾ÿ÷§Eð|rÚG u¨9>¾¸þú_ùëÂüh”Șøm˜`ó=fHTþE¡EZ¤(軎:Íšä*_Ó4l6›©`P‹ÅBífK ‘è;Z¥X,8^ W&©˜ˆ^R€ð}¿Ó£í—óÛâæz‚çh­Y­VÂÛ÷âè‡4[Õ>Š—‡ Œ´F–è’.ê2rûŸßæMßs1<¨ýïíÜþç·áPàˆªÐ¨BœZ­½dõ‡ÆÎÑÈ`tòlUU±^¯Ùn·Sñ¬¸¹f¼»A7Vº÷B+Á#zò×VIeâQzòϳh™Ë##Æq;Ž#~;Ê&Õõ”ÌZi£Q‰ÔS#N_ƒ¼ÀýB òC;UW£gÏ]F|áéúŽà¡|õ|5ïøúwH¸~ª~0û?Ó½kJ¿ïß'#8h´ÓøÂËM•`TºGñÞaªïÚ ÊÉAEE¥DA÷Øe)÷ßù\7ßz²Ã, úˆi03*{ï/‚fˆÛ#Kúÿ@‚²¹C'~YY‘ÊHÈÝ€–A Р÷”@"UyUï‰uÒ{îÀ÷žE×]Íyq.þ¦±”k‰!sûÇùÞÛßK¼á+ªÖdÿØ~âS?ÁO~è'Q^]°¿© åºÄ¶vꮇ5Ê+F;NÁÑ"’LF”b´ÒÒ-*€37—±À)W51DÙ/>ͺz!ÊRß­"£t.â»b@ø¯ô7š¨j%vÉÀÏaÿh¢0{?$ûó©Èí[·¿ û€Ä.Þÿøþ/÷ÿã±ÿ/ãÿeü¿Ìÿ_?ùÿ;‘k?üṪ·k‰>| ¹z81ý窔¢®kV«»Ýnš:=9È|+3^Ë«W¨ªjêxg郶mÙÞ9&œ;éþ—ŠÐØDØÀÇþÇð¾÷½Ÿú©Ÿâ]7~ »l0ÖÒ={·™`#4² ßÿ ¼/FþËoVpÊ7CÀm[þÀíïä;¿ó;ù¦oú&¾êO~•°®ºÑ0DâÑkËòº¨xï©ëzb¡íûžíÝc) 4Âpxt4ÍöäÊÎf³¡ëºi¦ÊÃ8Ž´mK{÷49M]44MƒÖú‹B÷…\7ÿòc–&œ6ÿ0àowÂx©2"€Öݸ>©!h­éûžÍfƒÜ‹-T2'Ç6`ÞP¡¬Åo:IÈT¤~îëˆm ž°ópñ©È~Ãò¾÷½Ÿ~uÝ<ýãÏw—ßÍ7}Ó7ñô¿~õiG Ff¹­kºÏœ@”„ìj¢søÏôBb€>`¯5˜²dµZMd.»Ýc '·ï@(•œxYs£Æ”å„(Éä0/üà³Ìîoú[_s°Ï‰@Þã™<¥?9G%’.*H"ƒTn‹Zôy•Ö¨Ôðžáö²âÇ ‰o(Y®V¸¶e<ïN„P'ú ²=LkPç ÿõþ¾Ê¨:WÅþq}‘\Gkù€!®#¾Ish5I¡Ê£’b]a›†ífƒúÌ€/CR‰”7–“bȤ¢c×v# ‰³ŽšAGª£5ÖÚI+6§û1†O¼õC_Ô5¡¾#uúŠô>SÂU"Õjd&2†@8Á(ÌA%1âùJd<êÅT=Ï_+ó”EQ¢zPƒt}Ì`°XÂèŸì©šŠƒpÊ}Qío£¥4%Ziú¶§z®B—‡Ã—*I`bã8ˆ³KÃ^þo¯Rð„€V?ëÁGôA!pY¤Èœ˜²§Á€$4â?| ŠßNÌ ¤®5ŪxMÙÜŒ2žÇ~š×½M.÷ÿã¹ÿ/ãÿeü¿Ìÿ_ùÿCÇQŒáXÍâ耺®©ªjš ÊL¡Ëå’²,2ƒõDï‰cÄ,öds¶Ñ\i2ËšÐn Q?6Š.¤†¯úž¯âoý'K*€§ÏÀ‘hJjcX¼é*ÝÍáÓÍs þÜãç_DÇ7(ÅÓÿwäþA1~âyæt{ë?z«fÙ­ Ñ£¬Â,ëû$Qæš©º°øÝH,E ?SaRRX.—”*Ô5E·Ù]Àucâ x­\yîË'iÂêÜS\¤ZAÄWoÞ „ÀjµÂC×uìv;©t ’ (¥¤zfÁ!F „³ñ¥Q “*&%U<Ý>-ót'ŠxÈþœÀ;ÞÉ;ÿÙ;Qÿ63"ì­z¯É*3é‘{öVtŠ•RDa±UÅ.‘:æbØn·ãÊÍÜ}þJEQ‹‘âZM8që0½W“T&åõ‰·~H}ùßøê˜÷n&yqÎAŒ g[Ôz%3OÑIbgV5ERqΉö­÷2ƒôÉ#¥÷©µf²(¤k¤Ak#•^¥nÁöŒÀ#’lðPì?yÊÄJT@[-ÏTý×…‘JôÎ¥Ö²^çæJ ¢Z)|BD©TÉWZ3š¿éåÛ,hm‰›‘átË V×5eYNzÀ_¬à¯¾SÅé}$r5Ü(Ta@ ¤o8ßAçP•¡yòŠð½8‡ÛîÀKGPŸ*ÔZ ¢«@`×ZHà%TË墤¨ è¡o{TP˜ç £¿b$¨@à‹k‡# âSÆœuD1ÁT†ÑŒ n'lÏÄt_Ü›j´<ûJذcç0‡ Š›R8îÎÎ ­Ì½–ëÞ9‰Ž¢€‹0±Œ«ïR13ÇŸzæ¹½‘ùà©ó÷í¯ÞCÝ'¿õ:>ô_îÿÇ~ÿ_ÆÿÇ7þ_æÿ¯¯üÿ¡Œôm‹¦*¨‹‰¡¾ëº ªR–%eªd̵/\ùÁìÿwÎí™FC‡¨„(ìA„§ái $Ô­@xÊkqT„€ºnh—TU#üÑ7+~á½_ÁŸ}? (+Œ“ÜÇ;o½“wþÂ;ɇ|N®nƒHJÄ4\€¶ägÀñL÷/¿‹ünæó>Y:c®ùØïvø^ÞùkåZþ¹kq·ÙLUÝ0Œ¨Ó€¾Rà£G—Âë;ÇÁ—]DΤ,KA7´­ƒbGÊ¡Ñhke–,3vy?ÊZ|¤"ά±‘D"ÚøPìÏq ÜY6ýð&DÍ d)kÒê\mô^ßÖA¤Ú•¢m[´ÖbdGn\ãìù;˜¥EY…w³.Ç#ñ0¢ËB¸ Ƒ埻·ÿý‹Ìéç=9 Ã0Lö6[bïQµp]„ÎQØuIëÛ{OÇ4Ó—ì«T’vR6)³áÚ¢ 0 Ul CÄ, ÁzY'Ä:R|¬`¼™:IëhÿÅ ¡I kêXéBãv]*Ц$hýÅ&HŸ%î’,ÝãÊbò‘1FÔZá6¼»ÚB­ˆgØl)WˉY9ûyáñUIúÿPJú³æ¶E´x Ñ<ÖV¡*IFÆÓE0Ž£/»9y'à®'žX)jWÓ_ˆ» ¬ÉÊL@­5*(ØE| çîÐQ6•@jÛ”ø:…ú¸"<ö3ƒ_û£eÕ|Ú ŽÑÆ©£àU`ˆ=á8@©0ZÃ"%*. •Æ—žHÀ]óÔ»švÕÏ®êÑKñëkW§Bòéí;“dVq(ˆ¸ØE{Dæ¨?œHÄ€ø¿½¶ŠêÛ”tñ]òãÌËñ".1þâìÞ¿-uÿƒ¬½PˆïQACÒöG ¤;êH(™›OûäÛˆüÌ þ£ôì÷b/Õ¾¨MÏþc‚¿Üÿ—ûÿ2þ?¾ñÿ2ÿýæÿ´rVþzìûßö(­© 𦹰 3Ì}_ɳïùcLÕ¡c NÄxs&ý9ÜHªŠi#%X|,"ÔAñ’ù‘d(^ôŒ¦ÅÖ¥85ÓReÒ› ¿ èaÛ_ôS5‡ ?“eZ˜…ž>—À{ÉÒ~•ÙR1ÔMÃöîN6øLë3WQs¡$CCªªš˜T©pÐŽçø¶§×šÕŸ¿7?tç‘& ¹¡­%Œ#ê,ˆ|K è$ã·‹GÓæÏ…Ì ¡”bìû}DÿõªM¶8UP1à»SUòç!ìW³uW«‡lÿ»Ir2/í!¤¢ŽÜK–Ê…,¥”ÌÝÅq(qn(ÒxÈ8Žz>0 IDAT“†Öç‹GìnŸ`–%ÚZ¼ó"'s:¯xtQ¼ä ç¾ÿcêè‡Þ °¯œäõ=±èe!3z>€QTG+!Mk8F©rF&g¹ÐåóÁ£Ø«^tm‹ª5 Næ•#<$òº” ¹}ÇðaÙŸ.ý\%%˜°ï‚©4›ˆ0w~ (› Ï2-ê°ÁB šÙdT9²ô'IŒF-5¡u¸¢ÇV•¬ä^­qõ‡UD+(Ò{Ò’¤)+¨ÊÙóÞã¶JÃÑS7§ýœŸe»ÝN±@ì/Ô¶o1M!{)DŠªÀB°¤ƒÃÓø’a9âO-z¡±ËUAèa¨gñ(N{ìÕ¶?Qº að ªÑ"ÌÁ»ÄsÅR†‚ÑxìÒ»³ÖBå½tMM{ÞŠÔ/0ü†&DØ•'nN„@§/Ü&0M‰­ Á9™ƒdö”À>Éüî ‘ø¿>š¥ú–tèMó± ¼š&óáßϺü1˜'Å}w0Á6ƒ š,÷E´?›dË2)TêîâR“à›g‡þùá_ÏÞI~3zKú¾ä6â?~Dö»Üÿ—ûÿ2þ?¶ñÿ2ÿýçÿTèv;B7 ŒÆ4õ$ƒ—÷¢’þ¹0;äùWHs0aôPè©00/ä ’+Eˆ—™Ri©"ô M±*Ñ ×žñÎÀ¸’¬Bœª?Â4 ÏßeÅp:B)JÌÊvq3±a•>C*¦ÏÎÉLœàüóû? …&Œ]0)Ì™ó;²Ö^(ä÷™¡?ã8âÛ¿m鲄â#¼2¹aF8qè«…ä}F*VÁêkXkY.—“dH–É›_kïƒÌÿ צ͢´@ ã˜ì¤­"èY™©‡n—Ö\Ø'qÚŠ‰!N‰Ÿ2é^•ÂÖ5ƒK*•†> 4cßOc0]×Q%‚—årÉv»¥¾v@wz޶Z ?Þ£¯„»#á'Éêö•¥;Ý®C{…) b „QöF±n$_Nš¦Zkaz…ipÚ#‚Ãôš¡¥!–öSÑ4ôm#„ÂíéËCA±)›Qª°Ùþ¡—ùÞ¢-ˆË¸¯ç¸œ|¬¢H$-yû*P޾’ÏœüBzþ˜öù\uGŠuøi‰£GSÐz†a‹]Ôèlƒ‡øÿ1*Ô0*%ÿº,…Ìôäœ`F좡ºzx©”ÕLú¾ŸF¹º¶%œ °ÔÔcEc¤\¯ÜúÀˆÀy•Ýbaúå4æŠÅž° n \8¥ ¿QÄEœ[¯–ýÔNÁ!p®rØÊ2lFéX¬³yP 倭 †a‰ ªl¢¥¦\¯èã9ÕYA»ì 'CÙS7ÍTø®*¡ððæ †Ä¹#ó¡¾¶è"1¨)Q"€úÏUÄGâO¾úIõ­*N²fóþ~‰Cðü <²?Ðç$0}¯òj²S4ߘf©åÐs>üjÚ:äg-ú*u‡LšWÏW5{ž8{ÅÌoÍ;×z†ûw6"ÄŸý"Øðrÿ_îÿËøÿØÆÿËüÿñÉÿ_qÀ~ÿ"úí€Ò`Í4Ï1?üf­úyeÓ{?ÁÁò5 ÊØŒ˜ƒêÂÁy>Ko“1EA¨±ÂA5Á‡Ø3¯žFV_»"6 jÍn×Ñ}ðqZDØ}µðýÀ—Gê¯_³XÔÄ. Z¸û¾…ø¯JŸ¡¥ê¼tTe'xS>¼Ïï=?‹Y–ø³U— Ã09÷ §Êß›Qy‘ÌÆÖë5¥϶øí€ýþEtm÷Ȫ€ÚÙü§}­œhLý8#4G$@ß÷S@³ÖNr1AIàR6ÉÅ438   ™¥)€”QR4 a’¡€¸}ˆöÿ—/î“¶œ°¦™G7ˆ¶kNXU¡ö Æ@C’wÑÄ–©€å½Ÿì;Žã´vêºÆ9Gst@w¾Á£@ }­$¼8#ÚuéÇhMß¶ÄÑ¡½ÌdJ…m*aH-ËI $#cB"¾É:¶cßO ï0SÈ£41FŠEC_ŒÉ«©CFèè*E1¨ëŠú¨¡hЇbÿ±éNZâ«ÄNk/&ìÑE( X4ûù´i¤I1´”4Œ}OÕQíï\ÊÇZËn·cè{Šek{©Fyz ø®'–êa2Âþ§‰É{6æ$*+  ƒ. ¢s¸]·#‡o¸1%‚ÙŸãÈz½žfÛ²<Ð8Ž„V:¶”ľHh±±Ô8“Xz5˜…E[‰%EU3l:â±ÆàÖ6‘ádÀ, /•ùT«°7>÷ªØßEÜ N’¿’Ì+#äTk…UªT”«šà¶( Îã¶=>±ÛRìššá¤Å–7„¶'TÕ$÷c¿Ùp~~>ý½6†ƒ§<{ñ®èKW]I&޼J3§R Wß-’bñï=܃ÀÔé·³Ã}yñ°o ƒwþb7<Üs€ÎÝüy‘ CêGIÔÔój¿çã¬Cg†kjóªÚßw^â¾Ûïå”Ì ÇÙ³³„4Ü“qå\¥ŸBfãÆY'óïÒaî-iÞûU@\îÿËýÿßø™ÿ?~ùÿ+.„~”M¾"ƒ¦iø·ÿÕ¯¿¤cùêÿé·E­õ“ÏŽ-~½sÄÑ]˜™ ï-(keãÄHååêBK`6qš§[>u@ëù™ãH|£ÈJ¨Ï¤ŽÂjˆÿÚ·*Þö³‘ø•Q‚]UAi®–²fš¶ºHЗÐ1b)ßKÝóD¡T"rqøtÈÏN. Ìå?þô¯½äûÌ,ç!à¶¡tÝàâû1Œu07jbF.¤g[LvË’%ÞB`»ÝŠ“/ Â8^\‘f_8Š1¡)­$…qŒ(%ó4Ê*bLpÏ$EôÐìÿ«/^p.”ù31YH‚¨æjn.ÖL3mùÞÓ³fÔÇr¹œXPCP‹ÃÚóó©Z`nÔø;a)¾ÇGXøé6B—%{JEBïQF¡«e U]Ó4Íg̪Ù©çwåÏ;ÑNMÕ|eÔÄœÈe&Œ>µÕòL]!Äù —Âbúk™:¤‹Z_@ëä$G™¸¯ñç$u=+Œê”,åNšRJäQ«‚Ð2—V¢‰è ñÛá¡ €Ô–䥦n­BÉÏMˆ‘° …Ã,*®>ùJ)¶Û-nY®V±Ór¹äèèˆív;½Zké¶[Ô6b×%îd@_- ùÀb¹ÀÝÂ=j¢†jµ % ¼^s~ë˜#E´ŒzLþ7bêt°L‡)wËñæßóftcªýCëøøÏË ”"³±&±[ËgÚâ•$«ëGëc-»³3ô¨eí(–"ñŠ1Ä+wÀ•Ä­Ç/† ³}ßst$?¯ï{–K™Ýn6Ø¢àj‚Ÿã6-Œµ°Ò¡ðÒ‹‰¤ˆfº ˆï|°ƒ€ú–Y·?“dÍ;s©Cnšd£¤ãÌNì0}}šåæ(ó:¬RÀÏÎ3’/åR—ºB$ÙŽJŽnQ¯êWÅþݦãä…†“ߥ5çf÷V¤{®îõ÷3$@Žã å0¦ÑÂ…tA½ò˜•Á·~ߥҳBB~þo•Â˃.÷ÿåþ¿Œÿoü¿Ìÿßüÿ´5”Ë«ÕêóΠüúŸøUð5û·Ç{ÿÎ9© ^6|ªæÊßRŸçä•R"«’ /(PÖ B$:e„>õ¿œÃo}‚,S˜;ñ0¢h¤?¶=œEn§nBÛ¶Øt˜¿ó~zVÕW¨R˜n£2Ö¸0¿•ï}^˜î½(ðª#oFÑ€L3?ö£µæ£üß|Î÷™ -7ÿòã¦Ø0lwM 8: ˜ë•l~5a¢hÖë‰ òàà`ªö-—Ë)°9çÄÎZ )LNжûäbê dP´Jˆ5¨©['ëü´ª?õsçðw? ýáÓ{‚& Ô•f¿„õ5E¬ˆÌõÍÖl{ØàžÛ TQ‰¨šÍ@õ}O]×,—Kv»ÝùȺ®a½¦Ûn§y£˜kþNO8|tÎß|oÃNÚuA%‚’í Šu‰I,«Ls^)k­'¾‹qg²Ö࢟ TU”""¶¶¸nHóVñBÇÑ+VRœûüQžú½_ÅØ¹²UUüÆÏ|]k(ÓÜo>¸ø”T¥n ­í~ýç™× ]‹éÙ¼»“;ÿqiš†#UUMÏ=hW ß „Þc–%a‚iØ9Ì÷–ÑÿÍáýÇlŒc£Ò€Ñ¨R¡ ƒ?O¬Ëë’ÕS×'2×¼§³œiìËå’ÃÃCÎÏÏ'›j­%1=‘YW¥>™à‰ë$›¸TÓ Ýú@:mÛ²ºqÄîäßyªªft¡ è¥Æ”¿ ¢|üÿú8¿é}aðÅþ4†ÿ•ïP)L©‰>Ê=TšÂ–Œq@UŠåÑÊZVÉ–mÛÊ3•jQN?{Šå‚~sJP"ÖßÝâCààèhBÈŹví§§§ Ã0Ûm6€‰{'kDoOOÅ~̺$h/1S'(³Uè?fbø;îe¯õ-i>?Ͻ›ÙWÏ ‡ýëÔ.Û…©Ó;µ0š4º—™Òg]}™³B¸ `ö<°­ø¶mùšßñ5xè¼{¨ö_T¬o¬yþÿ{^ þžb‡M9‚N¿_(!§Š3¤CêV ébfa!U¯"æÀ&$@ÜG„{ÆÚ½=^I!àrÿ_îÿËøÿøÆÿËüÿñÎÿ_qÀýrtì¸ûO>ؾñ_ó¡8„€- †í(‚½ÄÃTù‰ñÂßcL$NóuÊhT¡¥J7ˆ+=äµ–1¤@[@£êýKP5mÑòwþ YÖÚ‰¥qšå+J¢ tÿÓgÛ}¥jÿ‰÷HV(Â'(W~J©—-åñ¨É?Ô¹G_)‰³y.?Ž,Ök꺖—Æ@Ú¶˜Ns%8kbÞ¾}›°s¨ÚažÞ?³ßç$sR])ĨÑ‹ìÒ=ûÇYÒY€2QŠMVIn7:ÃþkÒ½fÛk-#A˜qwµR\¹r…¾ï§_y¼%¿£ Ë:©»ÍSB8è+%átxdvƒGWFF~; +ƒ)‹)øEA•àŒJ©‰18óTU5‚‹‹Š)dÄPþžX—¸$„Q0ˆˆ$ÞQä üøÓ?ý1Êßyð@ö?ýÅ[PC(Ã>¨TA& A–—@Q—¨4Æ3ïrñÌ=ï/ÝS†EŽã8½Ÿ¹ýó³ɇøaÄoLc‰FK‡gxå@zê¶ @);õ—MD¦‹DðêœãôôcÌ$éšåJ×ë5mÛNû»ï{Ü0àÛúˆªa;²xò*Þ{Öëõ¿ž‰r¢ßCä2lpç=º.QÊ£wŠ«õUîtÂŽ|@²çL)°àßøû¢ùÝGø´~^©ý‡¾§ý''Ѐ9’Ÿ­ …<*þ«««lÇ-¶±ÄÊ Œ°û®×kº®c³Ù,vFp”Ÿ{½^³ÝnY/ŽaO&1¿·Ù&Ïp~“ ý¢‡ñÃ0Í÷êO}T=û}ù’Óo¶ÿuYTa(á£wŽÅj5Í·„h©1†º®'ˆ#eYJ€Œ§ TkaŠÁitaÅéë½Ö³*«©}¢åaxïØÿ½gN›ÈRuZgæÚ™„.ìØZ˳LWŠC›Ífr†Î¹)‰Ê—¦i¦ªpY–,V+|’Î,ÊRô–×Flð(澬NA:â7£Áª}å?C™2Ä)ýòžÈŽmzO ¢h¬ž¼RH𶌤ÉûGUfß Ô ú¥f‰y¹ïÊ ¿üöÿå³=´¹œ•KX±ñÈ=éý}æ¤6?y¶ô¬ó‘ߎïh¹\Nž²”wkªR$b6iM)±Å+¼üJ×Væ7‡€* ‹§®²~êú”¼Ý¸qƒ¢(Øl6œœœL>mÞ­888`GÚ¶t}1øn ;ÔÒÈz±û¯ #.ËrbSN B’ùÖë5eZKÑ€·^ ·Ë‚ØEJ[Šä«Ò0ByPB í{Nbü íB }Ï ÔégŽé3,”¶$v‘bY€–{Š9¥Ãžw°f],Œän·Û ï+µ4Äc‡ïŒ1ìv;º®£m[‘ :8˜:DÍL1çää„ÍfsÁfUU±~ê:‹§®¢ “l¬ÑµÅÿèÞ5šºþåM“ÿ¯ÐK‹^ŠeE±®e=ù¬“>fù¶)‰Ër«0…ÝïßÜaKó§€}v†ÚÏݹhp§¿tg’'{ûÃÀé/ÝólßÌüù>ê{îQ§{Ï\ÅÞ˜ÂÊ¿-ÔEN€!½£E‰ÿP…¦X×Ë ½0è¥ÔÄÜÙ.s[]îÿËýÿöÿeü}ÆÿËüÿñÎÿ©€ä‹öÓªúÁƒƽL†1frhyóÏ™òs%P•šØh£°ŽâÐM!ó ÂÀh¡}Ï1ñÒ~ÑŒb¹^óu¿åëøà>H»éb±ïiß× Ü«®htcP‰˜&ôŽØèDãQ•ú%²È`_ÌP„ѼçÅ?ûé/¹ƒÿtE0,ZçÞ9Ü_ݪ3¶¾ì xâG¾2æÙ–øre°ë:\ÛÊûLðH]™ |œªTÄ™ææäH&Ƶ§ÕÝþÒ1ñë_¦ýßßï+¾¨*Á´Ñ©÷B+ðÅ9lmº·ÊBò$]ĵ-Ö¬’£tαÝn1ÆL©[ú“/½.þ›eŒ1J5Pk|ÿÅGè§‹(ÞHè<ªÖ”«%fFdSu]Oû¸ïû) Ì÷ÃDpé"¦*ˆÛ4€ã}ûF)…²–r]Ñw;©þWú¸?(„dÆ:Þþ“câo™öÿ•~ŸÜ7ùP¢öI‡P)™G4P®«©úŸŸ9CÛB%n¦´ø~œÆ‚r¢›NÆqœô}µÖ)L–.žAm ]êÂ(~ºˆáGÇWäKÜßèÔ~Kly‘k?üTlš†²,ÙívS±r±X\ 6=<<$„0uºBœaŒ¡Ýl½Ÿga7rðÆ›t]Ç•+W¦À7X÷Á;A_W«Ûí–õzÍY¬–k¼q„9RGÇ »fÙЛ_x(¡¤d0îŸnà?XÌø µÿXò½+(%¾öøÁ£¦¢¢ÝµØÂr´:—Z7˜Ú¢Ë’õz=Í÷ŸŸÏp³Ÿ1?ûáá!ÇÇÇ[aòïøÚ˜¥kæÉI†þîv;‘t‘Ø;8°ÖÄ1WÓügQ,‹}‚œÈx¢Æ{÷~’ jš†¢,éÇ‘"Øh±•¥ê+ü±§[4Z$¶F;¸ø÷Þ |tl¾û³‹¸÷o`-j‡L4D"íØ¢œ¢ZW”ë ‡¦C!Õù !ìºnzŽ“l,{ߢ”š:§6h®.„$ªÑpˆ…#X7½Û ñÍ‚º®éºnš%üÌ|âá2Û†Íáî¦6˜ÚÒ\]Òv-eSˆ“BÏ öÐüŒ<ÈÿÜT3ôA)1¢¨kBð"iõRÖPB g ‹_Œ‚.È‘¨ÂÄ4“\•ø‘bŒ ¾§lJ|ô¬nÐÞßz˜Ðˆíâϼ2¢·Ëý¹ÿ/ãÿãÿ/óÿÇ#ÿô€(D Ê(l’Å›WO檹b¬µ¦^,Ø–­Tƒ¢tÂõA¦Jvíe¶ð ÔG ^øè8==A'hâéé ~ë„PçY„òXh9üW#¤ÏÈÜT u‚ðÌ¡-ù¾ï}[U„>)ÄÈ—òÕý¥õrUHó¿ù—ß³&lpN8 Eè·ýõÇ•hÀ2Á›kV£‚ð~Ä1È¡¦è+–úÊJøÈB)C »®Ck-œ5¥Æž¸PØaO B˜ÞIþó8Ž|ìO~P}¾½"ÇŠÛË„¾Ú×|Tékþöo¹«ã½}êq¤¬*ú͆°“nœ2Šè‡GGìv;‹UU]¬”+°Xœò²ÒlÜáááD˜“ç}ìèÏœ©C?0žŒ„CéÆe¤ƒê¢\DýEüºHÜñ9퉨©äÿ©»ä"^¥*þ Ø#Kµ¨èv-ÞFôÚ`ëzªèç$ ï{\šq l´8µG‰åÂñb±`·ÛqxtÄݳç%Ñ)!ì<¾¨V«iN4ÏÓfßñ©?õÑWŨoO,ÿÙÖ`*Cs¸€R3Œ¢ç‚jÑP¥ñÖX9Ô!ëå<¢]Jª+9àj#:ØAÅ=ñ_¾è¨P(ª¦F[Cßwë õ{ßž;ì‹£·é ÝËŸÕ¯*â—G(¾0û3‚úˆÚ“æ. ÝÃì'²C› ]Yªª–.Îv‡ŽŠ ŒJâPHT Úh|¡aä^ÛôóÏÓ$EZcåÀ õr‰Òša×M’iåa M =Ýá—Ø˜HÕ·«úáÉ^îÿÇgÿ_ÆÿËø™ÿ¿¾óÿ×TšŸ9?Ø¿G4+Ãáï~bªzïE Ð"IÄI jPV,èR/¨Ü…>ñZd7´q(ñn Þ¨•þ`)°]ŠœGtžèÂ4v!Š‘û¥JrÀúÄ?ú~ãá—÷}€ÅŸ½•I –ñ• o»£“¢ŠjŒt *}rBærJF¿“ĬK ÒB‚¤^ á”2Zªq•"z%Êý÷´wŸÅþ*±y–Ìæ¾äg)«P!ÈæG>“1ÂŽi®5úH‘æz&µŠì˜­ÀÅ”1ÄÁS¡è³I=¾–/ÿŽþeßsvXWßþdœ+_xïñ}Mó"ã),ÔsûO£AÆàÇ‘`LrÐJö#Hà6 M„¦@#…8YQEì˸_ÒþÅ®ÀY·‡ó6 ]kTSÀèö¢Ø½R±¶àB zNðÇ즠ÂàǸŸsµàû?cúÍ>íô¿»õ²Þ­{„2œÓ¾ï©ªŠ®mE·xˆ¨µ!öžæË®L¶¬ªjÚÓR*Í<£¥ÊoC¶÷ž¦i8;;›j¹ZÒ…sây¤Ö5®rÄ&â·VàUÀh“àä Vè¡ø`{£#¾øYöÿRÉ׬]‚xï!~ÞTT°Y»¦j¨mM:XÊ=åämsánL IDAT¦C‘­*F牙Ûì!ÔÎ9Œ1òÞºNæÿnÑ>,þðÜ}dè{ꦡïûéEqïÌC=ü3ó…‰wuý€!Œ=>Ñ\_.(S'’„P^I$ŒNanÇ~–¶ÐØÊ²X.Ù¶[T è‹|$†Àv³a±Z2ŒZô´/;ápMÃÅYý$€ê9E|s‚â~û£åk§Â‚‹|su›: (¢j Ëv³AG¹wÂìðŸîQEpѱ\-Ùn7R(IUºôsO\ÕhkÐJ£"’4†@³”îX·Ý‰ÂB›X]?àôα|NÏôÿ‡]¸Üÿ¯ÿýÿ/ãÿeþÿúÏÿõ£^ýœ+e„ða÷ÃÇêÞ»‹D6¿r‡ñ×Ï'@všzaÓ\Õ‡(õÞF)¨Bí!|…øp·¼ü:ô3#q *UÃ舽T¨â÷Ý/F× ;ÍÀL0¥_?gó+w2tÏÞýð±B‹’@ÿ#ç_úsxíÞ~WÅ(Ž[i•4ˆõ… ZÞL“®f&€ñ©ºwÛd£Q±ª¬ØÝ&²¤:}O›FJRR Òì¿Þвª,ÚZâ(E °u?˳¡ù^ÌÅ{?ƒ°-§g4â>lêõxÝ}ÛsêoýÊ(ï¡uŒÚí“äL²ª¨Z—avº°{ˆm‰­G%äÞË(•Tò— P„1Pž•÷Ù¿<+ cfçüõ¥Øï…g(@l½Ì¦¤>“¾ètoù/°[g’¢ôkÔòÌÞ¹ Ýô‰·~HÝ}Ûs_Rë!Û1'ÿ, B?NGTš§1“¶10íÌôQ[ÑGa:g?G9ç}qÎÑuÝ$5,ý8`±”U tÈw&Á–°K(Ÿ/AsŸýÑéß–÷ö"ù?ò³Ì¬[,ý80,DÇ|™etn²¿s‚H“gQè(Ï(ÚÑLÍÉ·¥«,KhäÝ©•!œŽ„~`±Xppp@ß÷“4ØËUŽyY‡ÿì+9ô^¿ÂF‘ö#;65EUMvrøg¯Ž@ö3û¹ lU ­žˆœîËL‚tó‚óÄtÐ\,ò®òÌïbOø;µ3æD‹ô÷#¨O(b?«ýcQŸH;;ü׳ο­§…žÈþŒ1, ixOp^ ÂýYV&ÒVË;(Í^å`j¯É»S‘=r§uUTeSƒOÀ†!Œ^¿‚iÌþ¾ë{lz¹ÿ/÷ÿeü¿Œÿ—ùÿeþÿZ(ø¿9¨ÏVU >àGï=Û¿ÈÝ?7´—‡‡¨+f?¯1"sSOe®$º U!3«ìhà™ñZ§ßëYÕÇ0IýÅ1ÈÏÚx™gË× ÔÃòðp*LÜýðsl?ü"¾÷øÑ|ø¬ÔG¥ÛùZ¼Bï´J*9º*§šI4ñ@(£öÉ^&Nêã@h=a„”(©Rïe•2T3›—°ÿ.H\¥ïQ¥|~FùÙ­‡ãÙì¸p/ʨ‰ÿa>¤µFW%åczæÇøúÄ[?¤2ämË]½ ì©9)ÊUõ)IÊ¡ªù¿}m¯ ùå/D,+q†/þƧÁÁáoz]Wøf[ö°70W*9‚™sIнÕS+T#[Çö×·òoéëbÖv „h7«Tu-›ÿîGž›tC „6,$Ýÿåõy®1ìõ?#ÔM3%Iwþ¹}afÅ—7¸Ê cè<E>F°’,UŽ{çí^ÂþŸLöÏ$RYVðÝ(È— _ã,YÍëªR˜Ò²ùðq& vtõ÷<)Í´¦a{w'zÀ•–ù¡Çüºû¶çTù§×ÑM(Àž*†"È ß=Œº9aÊ]2!W[èë«“`h„œ(;Û8cjU$ôá>û·Ÿh¥;˜1#Šæ³gmØïçR¡ê=ûrîVÍÚ¼´µx=âu <5Œ+…%YüR¯úßþo?¥žø‘¯ŒYÏz·ÝI'¦IZ¹JOrbmÛ^x_9¡²$!‹eÜ+:%ˆk™$†òœlæZQJa× ºrÀoÂ{)Ì}öwÏ9™ñÍrj)N(£‰CdìdÖ¹,J¼õtG¶Z\èRfb³ÜÕÇ[ûõ[ŠNµÒj:ÌÞû.œs4MCUUô6É5†ØzvåŽÝnÇÑÑƘÏKôŠÿ9QÊ>·T¬®Ьl¶[Ú¾E†²ª(ªêÂAÐãDn…„­ßÇ@5K–ŒHWÕMƒ÷¼=Ó-^<0{ïÑVãÚŽÁ˜iÆv™PWÉ̪!ܳî÷‡jõ‚bùï./úÿ¹¿^¥{˜þs?“ýÙÔY0zba†×v(+‡Ûû ùÙRØ9GÝ4ìâvŸ¤³¼!@Øze4 ‡ý]úš-àTŠÕ2»ò8«ê}A(Æ ÷výç^}ŠÊ&JXuo¦û˜^1RRÒúžÁÐht%ò9J)žý©ˆík¸ùÍoò•”,E!ê ã¾H· ÄLØ¥´F&ÕŽhã}ößÙÝÞÇŒ€D4ÄTÌs3s-À,,¦,&î:€ýƒ%Õáëo¾!ßJbdèðš’ _ö?88 m[NîÞ%tn¯aÞyê‡d²ï={)×™Š. ÍhFHðЦièºk-ËåïýÔ ÌK1FF ë@ØÔVá•G:ù%Ò#AB Gì;Þ–µ‘áš…Js}=|ïQ[E8„u`´*ýù¾ªt3ưÝnÉlémÛBŒh£)b+ÃÌõíßÅb±àøøx"ªÖt·O¥e¡sœÜ½‹1†ƒƒn=Lüçdùðxó Í¢áôüŒ¶ë°¥¥¬kŠÔ­lš†ívKß¶(ŸÇã"aô{Y¾|€.˜tšmYR55ãp>uw>ˉ›ÈÐÏT¨ëZlïÍsRþa7+ÜG¦ùïœøadßçÿÇíÞ§Û}‘ÚóÙ×7Z>+]Yîl:ðÇt¯.¾4¤¦.QŒ‘ª©ÜHo:y7!N2†9¾…Ñ£Sõ!Æ ï:±h·m+E¥èc˦Ýâ£çp}Fqú±ÌÁf~(¶Žï~xE€Ëýÿ¥¿ÿ/ãÿeü¿Ìÿ¿üß~i8 öä8¹;‘ î œ9`4j?ŸŸ„¨â…¢A6ЪZñ›ßøµ|øî‡¹5Þš„t R5 Ÿ%i†'î"ñ7Ü^iÉ4gÈnh/¯/м?”zÚÄèñÇ_"1y ûÇd¥Ô¾¸£g¼6%²U"bêRUnÀpŸý‘bŠ=´ÇÅ=ÔÇÏÖ@ê¦`RÂmÿyì<*þDŒJkâ…ËÂPºZ+ÄFiü¤eÎÿâm)&û¿ðÞg©þà ÉSU×´Î Ég{ŽŽ +‚ÌnzNäcbˆ÷Û?Üš ŒÚkèR™~9ëþUUYªºžÁ—øÂ{Ÿ½`ÿó¿x[Õæ(ê¢Ø—’ûnmOAóº°ßGÿø¿Q‡ñ‰8vÿ?{ï$ÙUßy~Î9÷Þ¼ù¨Êêêju·ºµP#ZˆÅ`­ÔxÉØÐdl­{‘e‡í€ l–‘Çxí‘=c;`ü ÖŒÇ6V3yä•ñZÆÃŠ1Ø€@ yn½_ýT=³*+÷qÎþqnfV¿D·èªÎªü}"*ºº*óæ­û»çþçû;§ãº‰ *ôÛ&õú"{[¸ªRÉ•»º V[lfÑj°M”1†V«Å‘¿~Ú+ÀÆ`ËëwQ©Th‰S UpQ‚ ,4Š1š‘Ìç`‹ÊÕ)ö1{q0–»ÅCGùcäIîWf/}¡åWüÖZ*¿½Ù¡žô¯kÂÄÛú«œ÷$¢6ÏýùïíÍdöä¢J)Êå2I’ôg¹}b±\''ítXZZâО\Ë@.½HÓ”¼“õgÜl7§49†Öš™}Hlù]®·@Î +€÷†•)´ÞlµDQÄÌÿ{è„ñ?ýà ýñ?ö–-~Àe¨ŠÂd†ÜæÐÓ5~[´^ßmÑ–_Ÿbÿøš˜ö×ÛƒmäŠ#“Ç ÁÔ ª¢È\F€ß“}é‹Ó,…§Žÿ…Ïcê_ìì/ÖårŸPXsâ^w+Wï]“ÞŠÙõßÚêJctç–Šm·y';¯+«-fþ{‹•ülzmÓK\PK'mñµüoçÔ2°éw·»$Ih4~&Ô9\‘°:çü¬+¡¸˜U aì{×{}ÓýÙµ"éδäQ³`“Êe¿=^}ä—f~f>ºÅxMW\j=°iù §yþ¿¡Lûáö   ÷ìÉWƒ¥bößZT‘üaè Zûs« $Á'¥fEd… IÂR‰0ŽÈ³Ì_#W´öU…çüNXPÚçDFƒzÝ'Dó¿zôoÓ+ÜŒýú„kÎ/ùUÌz1Qp~Ûdü¯Ïñ/þ_ü¿Äÿ£ÿÀ®p¤M+?v€ ÐUM8n â›çŒ½~ Kßœ>QŠßÅ/â²Ç‘´Z ð¢ÿˆ…ÖI;Áíq¨'•7øÊ^ÀÆ^¿›çT&ªdqJz<%ÍSì²…NܸW4ÀÚÙ·ãï«)»3E@å^óöóû?·è/tÂÂ-m¨ÿàYGìÞÇ?l)õ^ãPà>uš`ô öïþ÷EºPÓVŒ1„•2.[ÆfÎïÏÛÑy@ÔÀAÖÍP©¢óÊÎíŸïʉŸŽQ¡"°~…ᤔ%¶b!RèHVÊýÙæ×f¼ýã³³¿û”Sêý¦é:ÝÂçt´>8§Ô{S_ØÌåÙ)ÛMÿšOHöþÇ×÷ëã=9wßÁV´–‹¤o毽äø_þ§Y ÿüok‹K½„:J""ÑÖmŸ(ÿ>·ë%Æÿ.‡:¤¼²Ìùà¿lË$.!‰¿J´V”JšôP“t!õþá ãæ¯1öÃ>Aq¹ó«ÆÁ‰1Æo›Çàÿ+÷XhüÛãªú›Î÷}ãüìÕy]=¸ççŠ=¯ îóSÿ“é%œú×*nÅ¢ÝØ¬X¿sRàä|@¿þÊ ËòÁëNû—ù©¿…’_8.)zó†axB’§"ãûÎO7¤Ad–å'$Ú?nBÿüê¯,Ý[C.ô÷°6"(ΘøŸÌÒ}¢ÞoÆy¥Æòùþdü¯Óñ/þ_ü¿Äÿ#ÿ¯ðM¸~5¿·­OÁX@y²L4¡+‹e9IH­ÅCúÍ¥¢/ÄÆív™Ï¤Fý…‹;×{2ûí‚(7@Âï#ÏsB­©FmY’Å„ö\›l)ô;¶VÌ|ERÀ eûPëćHÜÔYÚF ¶ éhWUÄþClÿ–±dY£ G°åÆŒ3Ø®¥±¹qVö¯ÏÖÑ%M®rr•“˜„¬šA]ÔKqL%×bÿ“0ï œ+f6â©:í“·u=‰]ÿ׫ÜÑ#G¯×Yœ…ÅœÜxMÖèþî¢z¹ã?ø|F9.C šYÓÏo9Ëñ?íg)kA ºÐî´ÉÞ¼ìñ_úÕq—Ì5…ÉŒÆ7of±Ñ`ûÅóÂÿñÄK^§òí›\g¦áûb5ä’ßÅÿ~V»Þ¶Gî?äç|ìè_WË.ɰ™Åµ-4Ü`¿· Û¸A…†r­F½^'M’v‡åæ²_hi.÷¯ËVTãÚϼk¿ šËrÜ·Óïþü¢Ø/:c.:Kû'jtëèW}÷ç¿zmˆ ŒOö¬õJ„ÞvQ½…åºÀ¤ÁÄ!ÕZÕo£E4 Úͦ_¸l±Ø=¡·ØTÔª¬ÑFE*P$ÿnùœm¥þwãüºFàî<¿2Tÿësü‹ÿÿ/ñÿhÆÿëã}3ŽŒÁÞ¼UБ¦˜%/z>Ý…,xÚ_ý¬rt‹óê©&| TŽYþM?K>öÁ-.MS’v×.f”šÅ"‚½`µªÐ±A—Ò?h+ÿ2þÅÿ‹ÿû‹ý_ö3wÝÜE/ˆN5*Q¸ÔÑmwÉÉI’ üŸ‡ÀE““üo×ÏyçYů»¬P ®þ¾kxðËPÞYFžÑurÚ‡Û\ó×ðõGĵ€Zq“,ŸÝ[Ü¡XÕ8ÉHÁ`p©Ã$þ_›[éýû báyÉÀxØ?ßÀúm¥ß¸¾|_­¾zç·TgÅûz °º-Ìòà¹~ò¿ŽíïîtJݪ d¿×Víþ{ý«eGXl]Ö[Œ®·ˆUÉ÷ÅoÄä_Æ¿ þ_û¯-ëëV½g"ƒ*+llý–*½Uv‹©Âoÿ5¼jÛ6Þõ¦c0A=ÀE!ö….›¶l¢Ól3~é8¯¿êûxø¡o²øÌ"q­Ìüô§^+t¦Ñk;¿eÌýòû bAì?:¨8Š-ÓzÛõÖý¶Yî#g']VïVޏOžfA°ulu«rÄœ~›«Ó]‡ÛG·XK¡·‡ù0apÿ>S2þeü‹ýÅþb±ÿ÷‚^W7Àý¨üK¹²ó{ÜÂq`˜- S|ý›·Ãô±cÜý÷“° ïûp†[J@9æææH–*A…¹™Yæff©’儹¹9P·”pÅö+üñªxyH÷ÄÏ`¶øìã`[ì¼%ÿR®dð‹ýÅP«gw†Õþî(âüWÓYµ ®1ÄöoøsUÜ¿ÏTû]WHZuò>A>mò@M­ý©iާû»>éÔÙ&ÿ€¿fZ Rì­b?ªÉ¿ŒAü¿Äÿÿp G®{ôöVúðòªÿþÑZÇææøÒç'Ù üÌŸä¸*Ô/ªãŒ£;ßåÅÃÇyñðqºó]œqþwUp³–ÿñð·aBa6™v`¬ø>cP™Ï‹sVÿ†½Ü8UÕCgUÕèË ­¢í_oЛ¡³¿¾Ø@¥8GaUP%…Ú¡Ñ—ÃgÿËÔ*¸p+¢ ¥pzc*såðÙß\ ŠÕ©ÏÛ¥üÓ\õ÷ûëmG(ã_Æ¿øñÿÿKü?Š}¹qj\a¶„¾'#]xô¶bÐðß¶LxrnŽÝÀVàÖ;›wLa+–cÇŽÑXhÐXhpìØ1lŲyÇU·ø­ Šþ»mSÛPm5šd+qÑb¶„¨q% à9UW»£¡±°;BÕ•8€5 ©)‚+‡ÈþWFPS®6E¨B¯) ýÃkJ¨óž®Ëüÿ/œêõò»ÿ|~·™#(‚¯@^ý¯!Pƒ­þÎçõüÏVõvpᔌÿâÿÅÿKü/ñÿySëîô¥BÁUI‘þ®7Æ÷V!ªE$IÂûî«ñm‰Oôs…£n­¸yB|GX0—ÉÒޤ@E$ÍÄK?Rÿ,„ÿS ×-VLö¿—¤}Xä«Ù8¦jÒK#Õfå÷Cþ‡Î±ôæ—9ܬóÚœƒGþ@&ö_ û¿)pjJ¡6+¨(TÍ_æ i×tÐò÷›qä_û¯Šý¯œºH¡6i¿/º—9Ò¯^ çÿK¨@ár ápó÷¢#ÿ’ØÕì¿S£&j\áÝÓo_ û¿¶äïÃÈï%íæîûËøû‹ÿ$þþœz½V©‚šR¨MÊÄžñ#À@¢ÞLãm· ¸åÿv¨‰f“Ál2þg;jBÞMرu+0†DûU&‰ŠÏÐÞøj“BM©b¥I©®:+fTÕ~à‚Ù@ÊŸ‹Ì¬‰ý{3€½-\\æßXZsû‡o,á²¢Ø[V«6(œD¤ „Oºr`±HÄÖÚþ¯-Á¢?Qly'ÏþU%”ö»¿}“u„¯‰ÖÞþ¯‰üvRm‡Kü9¡Šsdü âÿ‰ÿ×ÁZ—7•Á ô·×ù—_€-þà" ªÕ8Òl2 ¼)Šøç$áâ;I‹lºlóOÎíçø±cÐ:9‡_<„Î5µ‰Í¥&yžŸØsÒ+JE å¼ìQkî.„ý{Ÿ«zç’‘°–`âÀ 2þ‹Ïuõâ\ú t€¬uxAìßûÜ68|àæ$€«Iª®åü¢L\ZøÞµ~þ7œA4:\©8·LÌ$ã_ÿ/Hü?üèp¸Ì·ÿüÚë_ϾZ ¼ûGág~¨É…ݪIB¸âýOR¬²gÏöìÙCu²ÊáƒOÓ]Áí(ÁØŽ¥ñLƒ¼ªûÙà àvÅ ‹¬¹ý{Ÿ+3CÚµÿýÏ•À “.:H|èàùßp>ùL€E‡k9TéÄâ°pžQ`³Ø'-î˜Åu,8ÜÑ `ÿ£Ågwî˜?'û˜ì.ã_Ì$þ_øý¤Ô¢ø{Â[”âÅ'Ÿä­?Ø„q0eC¾S¶ãJ:G$Ý„c/ƒâ{i²ñÜïù˜çìØ¾ƒÃÓ‡1›¿W”L©•¸ö—€ ž4¸Öö—À —2î%wÔ•ï½½ö?êP›ýóŸ^2°è$\Mª _¡a“ÂÍøT¿÷å5~þWŠ€?&zJÁ¼Ã>oÅN2þñÿ‚Äÿëᑺ~0?8µ[£wj_ýi;èxC¤“qb¨m¯Qž,3ýØ4„ð¯þ+ðg¿ Q‹Pª°<³ŒÇphà›Â–Wo¡=צy´éWÌð ÙÖÞ IDATÀìüIÅ^  ØC÷¬%ÿ²,²*ö¿6púJ U5p]¿Kv4]SûÛCïJE X–öQKþ5±ÿªØÿºÀa8m˜“­©ý _Œ¨w½0‡ü~±ÿªØÿÆÀ’¶®ykmÇ¿©„¨ ^ýùõhz `~ŸØ5¸²¨®?þžù·2T¨Ø}¿¸ŸúÖÔþ—}ٟӳ׸ÔaÞpùǺ<*i ŒAü¿ ñÿ³¾/ÕØ›x7þçÍù&Í#M¿"äÖˆ$,/RÜ4‹Ð\löíJÅ{cC4@Ó’O˜þö´ßÒ¿/¶ à…)Wi`Íí/3kÏK̲¼¶ö§*3€kÍÞûüÃõñ÷”°æ'&€oZ[ûïþ|zjø‰¤— «@øù}ˆë®»Ž»õÝÜwÇ<Õ{âºÂ¬‘ý{Ÿ{Ùý™»ñ½ïåÀÜ¿û~>qûíb(ÿ‚øAâÿ¡G¯Çà´=€º0’-þmúÀçþ$aG­ÆqàžŸU°ÉÇ1.w¸ÜÇ1l2~…Çéœ-[·bº¦ÿСyÒ±µô^0p¹F_¡aBù‡oϬ±ýO‘€^¡Ñ—ëþg «^þ‰Á>šãžµ\òÙÔcklÿÝŸO¹ä³)îY‹}ÔKÄ.ÿDÒR…ÕIoùЇøoïúï¹êÝì¾?ã)POZkû÷>w÷ýï¹êÝü·w}Ž[>ô!:b¦U#æææ˜™™91ùïE2kùü/x Ô}wÜÁÌÌ sssÒ&ã_ÿ/Hü/€5½¦‹×ôŒT(ô©ù?rמ=¾H8®1ZÓ6m/÷˜„¶ic´†q ãyÚ³m¨LjVÜà?KÀárÇÖÐþÇÄ ]øÂÚÿ ‡-¼öŸêkfÿþgI¸¦(àèÑ£<ðÀÔÔ‰•ö+ª¬™ýûŸÕû¥xà8zô¨Ôÿeü âÿ‰ÿ¥°¦7€ÁéÂP½Sø*pðùçiÌXöì~%• ÂÔÄSST‚ {v¿f,z‹!º8ôØÛò#/Ž©éŽ$€CæÖØþâ†+$\Cû‡H8d à×65ÖÌþ_ÛÔðð ¨ƒ’ºÛ}´ÕRkeÿG[­Ìœ:ÇÁƒyà®»xF4€2þñÿ‚ÄÿRXÃ@­¨ÐÛ6´áŸ¯ÌÍq¸¨=öõǨÇuÞö#oãm?ò6êqǾþXˆk^}Ù«ýêmú+ObVT˜”$€CçÌÚ߈¶ðBÙ_ÀáH ×Ðþá‰- àÚñ¨ƒ÷ÞK÷ä_ìÆ­™ýwŸ¸ÕO8xï½'ú#AÆ¿ þ_øˆ 6Ì àð ÔO}(DÀïÜb°¡õ6Ì&³üã}ÿÀìì¬Qí–øÎÓß9ÑØùIŸáN¼¸ãwà 7H¸Ö`e ð[uL®²ý9ÅÅ‹X»Pßu—Û»ÿ© Á¯Þºy•íß85è€ï½WÀ5H¹÷ÞS÷Z5À0µÊö_8Õþ’^€{àdB`غÊöŸ=5»Ëø—ñ/þ_ü¿Äÿj^Óuå஻å¶oßÎ}þ0878ÿËqT‰¢¬aÀ(C^Ê¡*UèI]¶¸EØ–m娒oÙ6¶cÁqÔ8èªÆÎY\è ¦kÈ]>”,E€Ç×îû”r7~à=z”û¥ ¼ª\nïþýC.VÎþkºvì_›îïL3ÂpÒ LGçÁþÑ´/*È  ŒÿâÿÅÿKü¿Øx²K Àü‚¢$"Û”ù>ޏy]ˆÇc:‹(Ú¤|…/€`> ‰?øiüìÿsòðj^½¢ Xòî¨ü2íßNú’Ò~õï1±ÿÐr’ˆª·]¼Lûg‰¿‡–Ðzà¤J°eÛ‡/Ëþõu¦MÆ¿(€†›“f©øç@Ôz™ã¿’øqßBfeüËøÿ/þ_âÿ eû`ÃÝiñ•U› Ñ€mU©¥½ÜöïÑ@UãZ ‹+’ÄEòŸ_½ã ÃMO¦Y€’Î˰¿Mü1z ÞêŸÂðò<Š2ŽRñÿbפö2Çÿ<ƒ?Q ?Ëx pTØ,‚ég§Ápîöw‰o Q­VΆ€ƒ-“[˜^œ>wûg‰ï±b09é3ÿ‚øAâÿuŒÞpÑKôW쟜œ„°-‹Í,h tG”‚R€îh¯…Ðþ5¶ea¡xoog¥âØÂº+Q;k±3gaÿ‹µ~ö((Ž! õçJ…¨-°Ö²}×öïjÿí»¶c­õ³~='RbÐû+ w¸¢ŒvñoT (—¾«ýKã%T |"±ò®p…7H­²XsÏc±Ê‚)Þë$”ñ/ã_ü¿ø‰ÿ¥°>pƒ›`îñ9ˆ šŒ(o*{ƒÎ[H kddÌîy Ê›ÊD“DÅ{³A0!¬ße`ÿý™ì¿P¼¦Œ€6˜`ë°Í™ìOñšy¤´ÁÀ<É™¬OúÀîLöoÁd}’<É%Ü`  1†rµŒnè3Ú_74åjcŒ$€2þeü‹ÿÿ/ñÿ†Žÿ7f äÅ@VÞ ”ËeoȘb6À_k¬ïY*^Ó*ÞS)Ž‘ÊÃÀÆ&µ ÿPjïý—Ð(8€]—ì"Øx›:¶ìºd—€F!¬U°uëeâañ}Õ¿NÀÚÐB­°yÏÿ׋Ÿ…V@ÿ2þÅÿ‹ÿ—ø$âÿY8†"¡ßÆ$ÇoÐm¼S/”ŠŸu¼Ñ“ã‰ß ¢×K–Ç6Fh ¿ÀGÉÛ>i'0% Qq/<ú‚ŸÙë­ïÑ.~& Ñ§vE‘MQ±kJÀ‘I{cÙ_½g†$€2þeü‹ÿÿ/ñÿˆÄÿzÃÞ-o´Ûv`¢"á¯1ÔëuÊQÙ7‡rT¦^¯{@µ(D†Ûvx÷dLIHœ¿8A@A@AÆ¿ þ_ø_ ÃI×?Üç0ù±b¨ÕkÂÜs´çÛý@{¾ÍÜs¯‰!?–sø;‡½èʘ’ @PPñ/ˆÿ$þ—ÀpòŠVñŽ‹U"/ë  6VëïíZ«õU"¿åÃxñÞVq,A @‚8A@A@AÆ¿ þ_ø_ CJa`ŸÐÏ}kίä[‡¼œûÁ^-¾¯ËÅkÆ‹÷ôÞ/HH H(H(ÈøÄÿ ÿK`ˆéÉüRüb?%`+Ô&jþ÷½€âg[‹× µe,IH H(H(ÈøÄÿ ÿK`¸yE·Hæ‹…€LË`"ãeÅ"@I;ÁDÓ2ý€H‹ÿ“2ø¥$ˆ$$dü âÿ‰ÿ¥0ütð+ùÖüWÞÈi<Ú ïæ^æ7y·øY#ï¿‹ôýIH @â Iÿ‚øAâ)¬þ Å~ñŸ¢í‘—úM€5:Ô~럸ø]Z¼v¡x¯  A€     ã_ÿ/Hü/€uä€EH ¤P¯Ô±¹Åæ–z¥iñ»Åâµòà—€Ä ’ 2þñÿ‚ÄÿRXg<Š¢LÇÏ5 4Šï£âwÓþg<*~) â Iÿ‚øAâ)¬?¢˜ÃK{vS|õÅ20W¼VØ8HH€8 %”P@ÿ2þÅÿ‹ÿ—ø_âÿ|ÀíÁ±©(}ôþzW8üy¤â¿Ñm?á?î$û«âÁ¿ ÷À†d/Žqü ßXáàmñ;]ü|©øù"RÜH\‰£Láû¾ ¾³Nc®@}²NãPÃ?– ‰7 ÿ3ŽÍÀ$DµˆäHc S?ÿaC K]‘4? 0 |Cì/ã_ÿ/Hü/€åNWþh<¤$@€€J(  ŒÿâÿÅÿKü?‚ñÿèÞè¯Äõåÿ9ð´ ú‘ ¥$@€€J(  ŒÿâÿÅÿKü?bŒö;£Xø° ú‘C @âÄH( $€’Êø—ñ/þ_ü¿ÄÿR„A @âFÜH( $€’Êø—ñ/þ_ø_ ‚ â Iÿ‚øA€ ‚ H(H(ÈøAAA†=ì%‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ Âê¢ö+§ö+YNA„‘BË%AF*ùÿAå·3Å÷‚ ‚ £É%AFÆéÝ ˆ&#’¹Zà¾àÄ ‚ ‚°á€ £™Š|ôlþ#ÊQƒ=oØCÒIH: {Þ°jÅïAA¤ ‚°ÁA‘€žÍß®œŠ—^y)³Yp€ƒÙÆ,—^y)*V¨·Ë½ ‚ ‰ä‚0R=‘€žÍ÷+§JŠx¢LT iv›ä39fÊP+ÕHš)…6®ëp÷ʽ ‚ ÂÆDÂh'"-›‹|ôlþå(ªhl9§«S”ÖÞûiPZÓÕ)¶œ£*JÅ{AA¤ $) øèÙ\$à£Iª¬ß:F÷á.I»ƒ6*@´1$í݇»ŒoC•rÙAAØ 1±\aänz‘€žÍE>šv¿ÉuTêJ“\–³ðÜ<ár@ZM™¸d*0tçZ´-_jû¯r‚ ‚°±i€HÀGÐæ"=›‹|t)±ÂlaæŸay±I4‘–RÒRJ4±¼ØdþÙXÆ¿6Vþ½‚ ‚ RØ IHÀGÏæ"MD>šãýÇ•#]6˜8$¾´Êäe[ˆ«là  ”ÁޏZñ¿»´Š‰CtÙ@\CAA ë<0¼ÁÏG›"¢M‘Ÿý½A½ móý>ù'ËÌ5çXì,Bä°ØYd®9GX×”€H£CƒÒšGš¦t“.6w)ˆ6wt“.iš’ãPÚ¿‡H‹ @A)¬û„@$ࣗŠ|´“@‘€Þ˜ÿ‰bÌ—4„òœåf“N³EÒèbg38êà¨ÃÎf$.f‹åfòBíß[*Ž%‚ ‚ €uŠ|4 øh&"iϦ”ë°IFÒJÈ—²NŠŠü3AÇkÿ|ˆ ë¤äË I+Á&Xç!{å‚ ‚°±R£IV¬>ל£Ùmz 8^n%ž,ÓYhÃ~œ¬¾Aì~ øÉ«€'ÝŽ_ü-~ð•pY|s ¸M³%àЗ€*tô%à6²P²r×#]pe‡ê8âå’_Ù¿ ` T¬°‹Þ¶j\á–,¹ûåz‰¶iãr,AA)¬§$ðʬ”€SHÀ} 'wå•h9êʹ¿–äoC$±ÂÔhÀüâ áxH4‘d @_ž.¦TL³9$of>Öç˜?ƒ\%–t1…¶ƒ¦­­e$åç,.Ò¥úp—YÔO(çþJžë ,ƒ;ähe-¨úŸÙ´èýB Q¼v°ö^‹þ_4´ u¨å½ãNå%‚ ‚°A q£HÀG3  øH?ÙD>¢ãþ‡”ÂJAí,ê6‹ð…ßþýèG “wÜõuÇaòÑ~”/üö`±8ÎN…J}á@ý<AAØ ±Ò†ÿoRŽŠÿK+õ ¥ÉÊ)ð´šz xà%à­F˯Б€¯cÛ¿K9ªš ú@c“Œîr‡,Ͱ‰W€èÈ„¥jŒŽ:y'%[NaÙâþBîugûw(Ç„B(çåÓJÀÝŒÏéÔ”Âuzp äŸ} ø‚CÔ@ëÈö×+GM¡JÞ–Î:8d@*Û+´:­ •¸Bëh Úøâï6PZùV‚.Ðt¸/É= ‚ ÂúgãÏs‹|4“‘€6"ÍquÑîUb¼Â«¢vÂ8&ét| Xá”þ«ÝôE1Q“v:¸$Çu30 4¸Ž?¶ûº<AAÀðƒ'KÀ'«Ä®JÚJhwZ^Ž—€—ã c["Pµ–q¹ÃæêÇ•sŸ– oÝq’<Ï,X¹CEàR/÷ö·} 8©"× è¾ÜiÉ×Õ¸_!g§Â=ë¼üà xz<í/êŽ;B;€ßð|â·SA ®€»ÿOžëaÜâUUƒŽC¢r™8Ž)—ËA€1†CÏ?ORö€0ŠØùŠWç9Y–Ñn·ét:$í66Jq˹/J+ˆ ‚ RrdðÑEV]ü؀؃~ㆾ<í¤ƒ××!ŒC~ñ¯~ÑKÀëÀ¶"ás@® 5к@c¿éЛC‚(¢\.EQaŒaaa´FUŠzŽÖ,..211Ök-J)lž“öxæŸRþAA CŠ|´ øhæ"m*ø_]FJk²,CkM³Ù¤ÓéÐZ^&Ÿma&½,9¾È|–Ñív‰ã€,ËPZF¶ÞÁ%N ‚ ‚ H`¨ øè&"]D>ºãþ”#Ä~…uŽta‘`ªeò$Nг`6W(É~w³"_lÓl¶iÆ!&ŠÈ—ÛþÞ«B  vÐñŸá¾,ÏAA¤0|ˆ|t øgˆ|”mo€²£HMÈf¢B†T«U¬µ$I‚s¥¼AMl'Š"´Ö$IG¾ÐòÇ0ÊsIT‚ ‚ H`x øhæ"mD>ºØ¢ ­ÀA0Y% CÆÇÇ1ÆÐétC¿ýk’øñ_«Õüs@)â8&ÏsI'5Y³JùcÄ‚ ‚ €¡LE>ºˆ|d øˆcŠû 'ìˆ#*?ûEQ?ÙO’„$Iú…¥T_!âœÃC¥R!MSšY†í¦(_Oè† ‚ ‚† ‘€pˆHÀGÙö"]Jþ™íÊÕ*Aô‹~Æ‚À»½ž Š|¡@)Ežûªp8ç(W«´ì–Üûƒ’\fAA¤0\9€HÀG‘€."m4~ŒZpYŽ1†Ÿ<ô¶mÛFsºÉg.ýZkœsýqÇ1Zë~AèϼZ­Æ±cǸkÛ§qYîí® ‚ RÊ P$à#‰HÀG‘€øo¤Ô«µ~fæ'ù‰?1†£G²ø…E¾øý_ÃZ‹sE—sçZknxäM\}ÃÕlß¾<Ï þ*à?ðgþ˜) ‚ ‚ €¡ E>º €HÀG‘€4îïœR7)G ¿\ú%ÞýîwS.—Y\\dqq‘K/½”g?ý,OÿØ”Rhí+ºJ)”Rìþô6.ýÁK©V«LLL0>>ÎûÞ÷>J/ñ‡éö?C®´ ‚ R&D>ºˆ|´ ø†ä²B|ñÔÙ<-ÃîÝ»ùêW¿Êõ×_Ïøø8cccdYÆØØÎ9Â0ìÛ;¬µ'¼f||œ,ËøêW¿Êîݻᙳûçt¾‚ ‚ Rxùˆ|Ä øh#ð ™üïÝ¿Ÿgî½÷ìÞ`á×.ÿ5n¾ùfŽ;ÆÝwßÍÎ;QJáœc~~ž,Ëú k-Y–1??sŽçž{ŽgŸ}–C‡ñö·¿mÛ¶qøða~ç‘ß9«S(—îß÷Þë¤ ‚ ‚V; øè"ð‘F$à‹KÁí»å¶oßΡ¿ý[pg±ËìÛ·jµÊW\A¹\æþèhµZ¼ð |ó-ß!\ûÅ¿išòÐõâþÞ±k×.*• ¿ôK¿ÄîÝ»I’„}ûöÁsgwÞ¡RìÝ»—z½Ž½ë.÷Œx AA†ˆ%h=Y®Ád¨T¢^¯S«Õˆ¢ˆjµJ­VëþµZjµJEÔj5êõ:Q©D0YëG$àëän>üÚ?ÇÍÏÿ(Æ´Öh­‰ã¸?ëß“€k­1Æpóó?Ê/´ŽŸ<ôŒ1"_oÏ€ð,ËÎ(/•J”J%Â0Ä9÷Òð\Æþšt€íÛ·³oß>š§Iþ_[ˆrV n¿ôvšÍ&Y–Ñét°ÖrÝu×1??ÏWö=D§Ó¡ÙlÒh4XZZbii‰F£Ñoûʾ‡˜ŸŸçºë®ÃZK§Ó!Ë2šÍ&·_z;œ”ÌŸæh:Ǿ}ûؾ};²y¬ ‚ ÃÆÆRˆ|´ ø†ä\{À/´\zÀ¿w¾O)wã>À¾}û¸úê«©)u‚àûÁmß¿ŸôïþÎ=–çýë¼iÓ&â8æŽ;îàšk®!MS>ó™Ïð7—|Z ( ¿ªP€¸ÞóÀ9l–ó7—|óÃÖ­[9zô(>ø {öìaÓ¦M'œã«q—üÈÝ{¯ûæ [×”âꫯöÿùå_æ¾Ø=âD9"‚ ‚Î?"iD¾1“ÿsê ¸ô€ŸöíÛǵ×^Ë“O>yÊïªÐ—ÙŸý¬{´ÕR¿ÿû¿oú§š(ŠØ²e ÷Üs333¾ø“X¿.LnQFû .Lc}aÁåÖ×2ßvçw255ÅÍ7ßÌë^÷:’$!Ïsû+¿ò+êÊJÅ}ßýÛ·ogñ4÷æ3Ï<õ×^ À}bJAA†½áþ‘€6"ß0ôzÀ÷îÝK¨Î*^s øéèõ€ï»å.ETàß Fã´?o‚íÛ·3Vs¶nÝÊØØyžS¯×yã߈µ–OGŸÁµ-ts\f±©õÉ~šû¯¼øYV¼¦íßc­åo|#õz<ÏcëÖ­Œ…a¿=¡}Žç.‚ ‚p!Ùx‹Š|ä Z.œVö€ö =àß>iD®¥üLçÐëà$û™4ã‰'ž`ëÖ­Ü}÷Ý'¬ðfpW¼÷½LMM199I©Ñà¶Ûns{÷îåî»ïÆ9Ç%—\ÂÌÌŒWyéb†ß**°8 E57³EÑØAdRHlÂÌÌ ³³³|ó›ßD)ÅW\Ám·ÝæþÈG˜œœdjjŠ«Þû^*wÜáþ¡¸šÎq÷ÝwsË-·ðÄOœvýAA)œ„A$à’sê© ¸ô€<𵔀ƒô€¯&1p×í·ó›ï)‘+C]pÙý™øÊ5_þÚÇù„»“üþŒ7ìÙ³‡©©)î¹ç|ðAž{î9>}Î[&+¾‡ /¾ÝËeø{+2Õ¯>}Æ~†ÎßvxôÑGÙ½{77ß|3LLLÐ~ã¿üÌsùꚀËôç÷ìu{èã|ÂÞÉåë‹9AA"6ž ]$à.ùß»ÿÙ.½0ð°wÿþ~!@xyôzÀŸyæ™S~×ë¿êÀ®¬T¬­üÊJÅ]uà{÷î¥zšsïõ€ïÛ·O ù28xcÀã?Á8è+ j·æ¹ yö­!j›B¿Î€ýzÃÃo ¨×ë´Z­¾Ý/¹ä¦¦¦|Rß-’ÿ¼HòÛ@×á:à:þ{Úøßå…  ëÿ?55Å%—\Ò¿zŸñð[ôë‹sxAmS<ûÖç~,DíÖè+ ŒÃã?qðÆ@ *‚ Âаñ"‘€o^Î>àk-?²øùã»õ€?ðÀ<†k.~I< IDATàÎ;ûí _:Çs΂e°[W¨¨+h-±‚ ܲƒe ÌÏÏóàƒ²wï^â8fzzš?»ËËÓ…·ë­`ŠçIÎàu¶(lñ¯ûó±»øÀômÄqÌñãÇ9xð óóó‹—3(󵔄À‚ÃN;Xtƒã ‚ ‚ H` ¸p~8×ðµ–€Ÿî@zÀÏçÚ¾ÖðR£!=à«<øõ«5T•Ÿwà¨0 "P\ È“”<Ïyä‘Gxä‘G8vìGEï1¨‹"”Rd¥¶ŸéŸ^QP+4½Çš"Ø\ökÃä9?þ8ûØÇضm›¯ä9y=#¨G¨€¢ P% ¢P%åâÿËû¨HÇAAÀ9q=Õ'HÀ­µ} ø=÷ÜÃWö=„ê(ºÝnÕ ÿ:ç_Ù÷?ühn¸¡/·Öö%à䃊ï"í–ðï—ÓÞ“€¯”ö³ŸåÓÑg í“(œ¥9afÎYÀZÈ.OGŸá€ýÉ3JÀAzÀW“sí?Yîœcyyf‹Ä?T±g‡ë%ûy1KëŠbÃÜ™%àÒ¾úžÉuAoQ¸Ðv( Ô.õÉ?EötB8räà²Ë.ã‰'žà¡‡âóíçÈ“S/‘/u¡R¨<Æ {»â90[Ü#1èzˆËsLArõÕWsÕUWñªW½Š§žzŠ»ï¾BÈfÂW–P-‡+ ‹û) Ø9·Ëì‚ ‚ H`u“ÿsÙ|$à²øùá\ö¿ñ=ïa-%à÷}ìcÈ>à«ÇÁô+t¿œžÛâZ bPu=è߬xûKÀ~K€Þ¥û=à4œïO¯€*+?S]ô€Ûç-Ü—‰QÏãíá–j\áP^v(ã ¢HŸîú׸sáN.ûÆe¼ò•¯dÏž=|üãçÇã·óÅïÿI’Ðl6q5‡]îÂ`¨÷ÃÐ.jEŒEoùæµ|«ó-8€sŽo|ãܹpgÿüÒ§»ý"@_QTØß-Å$#æAA gŹö€_ øéðóÇÙö€¯µ|å>àÒ¾ œCx^ÎÖ^^ÎCé_M]…K ¹ÿxñó®"}²ë“wM{Ö'Ÿ|’/~ñ‹9r„‹.º¥­V‹±±1¢(¢Õj±”Îá:4€Ç𶺸˜Ò”ê5ê„aÈÒÒõzññqîºë..¾øb_ŒìiÀ´/¥Ou ÷”è­Tª ¸ߺHû‡ ‚ ÃÅPï°²¼y†ð•ÿ_ËUÀÏt0èß¾}»ô€¿Lz=àsss§í¿ê¤ðµ^üäð7¯¸z=àsssÒþ= ~ýjÞ£QÛ4*V0¡PÛTŠð²4íKÀ¯»î:n½õVnºé&®¾új‚8Æ—s×K>9¯Iß$0Ôñrðbvù xÄ1W_}57Ýt·Þz+×]wGŽñð4EÅxÉw¥8· …Šj›?wýj-{A¼á¡37§Þ¬œz«\©¬°Iæ í¬… éSEòoV_BøŸâ‰'žàï|'`ëÖ­ý<ò<'ŽcLAMÁ&`OñUʠ˥8&Ïó~ÙÖ­[9pàï|ç;yâ‰'øŸò÷OÏAïEÓ§ºýóóJçÏ=)þ–^Íé­Ê©7+gn0.¼1”;CA„5ghçÚ¾Ö«€ä#QÒ¾zœkøZ¯.=à«ÿdún=àé±äÂKÀ%„Û"é?KÔÛ•Cc1‡Ìeè\£Ë‹Eý¨rÚj˜-”9)~¥ÿØ’owüzãXŽ5q5¦²©Âþýû¹è¢‹h6›~Ç—j†sŽ<ÏÑZS*—ÉÇ\’yµGo €„å2Ýn—4Mýc!Ï™_ž'Š".ºè"öïßÏ÷ÞIk¾Eg¹ƒíØ ‡äÛ¢×ƸÌyuJVü ˜·gµ_ PGÚÿí&Cý å0Å3Ç‚û[ñ‚ ‚ Œhέ|­%àWV*NzÀWséhgί±ü¡·A0e¤|µø.=àéÑdx$àGÂí‘ô€Ÿ.ΌHø-½Y@>kt®û ½Í-Ê)Ô”B§š¼i!ô[¸R*Æla÷ ¨Ô*¨Š"ŒCªcUvïÞM·ÛåÈ‘#?~œ|g‚ Œ1t»]²nºy¿Ñû $‹MtÅ1Yšb³ŒãÇsäÈvìØÁîÝ»©ŽUÁBX q-G«Ù"K³þ=èæ®ë|»JêR²¸¨(VvÚ_ÖØ~!ƒ ÔO*׿VÜ=RAa„ pö=àk½ ¸ô€¯2gÙž-$nðÙ„`"’ðïðÆÐYç[pˆÁ}~EÂs†ðô;ɉpE_¾å‰-Üzë­ÌÍÍñ¥/}©/¢ˆ8ŽiÅY-÷ª ¨°¹å x·ÛíKÀ¯¿þz&''ùä'?9€'œÜ§ÇÂ×”ŠÅ™{ÀÕ[•£:Ôh¥IïK7\‚§I¿é}©Û lñ,Î&4(§ÈZ™WeE¾kîjtGcÚ†Ží’Î'ý¢]`Æ&Æ*©MÉmN;isíº–_ßüë|ýë_ç/õ_Âs—!Ÿì‚Ѹ$÷;~¬(àô”?®›cIètR\#ƒ6üeø—”þ¦ÄñãÇùàìq©#·9J+¢ñ–æ–Èl Òc]‚0$n–ÈUî¥L%Ètî ™ßu&¨(¥°ÎAPìqXZy½_R·*G^œßÝR AaÎuðµ–€Ë>à«ÌYìžM_x x¶l‰dð³MÏVÞ`E8PSC/Ov‰^[4|œÔ¾Ñ%àê-þް¸Zñ6S¦¨Óhs–À$*ŽWw¨D¡ŒÂ* !Ø<ÇÅÆh:ws*2.‹Y —¼ã*DcY–Ñév°¹Åvýn.·M߆;î`—BÅױأ©/êN*è¸ÝmñÕ)®ÿÑ"iŸP¨ºðç|òà'Q¹ß=F£Ñ™ÆÄ†h,"h}ÀX2†Êiú„>€Ms0à¬C+rE¡pÑ·7D.$SLjœu^d’mi¹ëP?­œ_§Üÿ#ÅAA6Xà\zÀíÛàMk,ÿÒÛà¥|UïÌ—êÏ^ xöbBpQ$=à§K _®|B¡Ûš˜¿p»+Ǹ@zÀ¿Î(‰ðlº;tðl:!ÜYhx_¢\$àœ›|Œ3t\B:ßz xòÏ‚Mñ±hCJÀÕO+õ…m# P¨Pû„?4 &H–ZÐÉP%CùâM^‰‘edË-Ƚ"@7jLû]ZB¼ÚCƒë:¯ÀU"ÂR]è¶»(«0G i–’îJ±Êb±ƒgAê‹),€«;l’ ¡²{’ÎE-ìáå#eò¥œ<Ë©¹- Ô+Âjg-6Ip©ƒ…ž2ô÷ŠU–Œ ›XÂBL`È‚ 8LÙ`J†Ô¤$Yâ×”é®h++…ž²ö{Már‡ëd˜z…ð¢¥Å%l;£ˆÆ*äYÖ»Ö8\hû u@¹ÞN ‚ Â:-œMxz¸{áW?Ü%¨Gþœ¥ü»'g+_æ´=àéÁ®?Ð0JÀt ÷–NÛ.ðïQ>ã²Òú€Ïl, ¸zW‘ô÷Ô6~•T ÑB•¼Ò*m´À(¬É˜Ø~QV>Ëü }Öéâ–,ÔqÓÝœàZ"0Ê`Ei”UÐräÖ’,%dõŒ¨\ò׳]$¾™B=£°;ìÀ–ª(εÁuÜbw䏨ùqm-jÊЮvúë½4²F¿ø’' *°IÇ-Î8˜/÷hP8²ÆbԄ®¯(È•%q]ì¼…Ha´†ŠÂi‡Ë,Ziò(ÇaÉ6çÄ­˜v­ƒ[²d¥.ºjÐZ3¶yÒ_r­iLÏx@îë¯Lë&ØÌáJ¶(xX_Xø©BA¸¿b€ ‚ ë©ð]zÀ³…!’€/$õHzÀO—<¼\ ¸Rè†ÆŽØ>ìð“÷7 ­‰\$à¬; ¸ú)åÐ Âb V­@û{\Et`óœl¹ƒÒ0±Ã?w•R„aèk¹Ë˾f J)œeínS!±`a)$O½ºB— 9å<"©¦äŒmtETCT l×b‹z^á&Üà¹\ÓífsRÓ&ˆ#PÊü sE‹Žò—ÐY‡]îàfýL;¬(eô?C-(ì˜%¯ä¨’ÂÞζå?Øl ˆlHjr‚ªÁvsœÖ˜’!Ïs¯š(kÚKmTIã‡R c¼\ÈZKµZ`ÓÖ‹|Òï§qL9"ˆ 6ËpYŽK”/Yü½¢ê§Ã:ܧ¤ ‚ ÂÎ(‰ðôÈð­ž-&„J€—è 8ç&?ê%àÝצ¤O¬ xøª¥'C‘€‹|]JÀÕ­ÊaT±hj/aV¨"ù×QÄÿÏÞ»GI–œ…¿ˆ¸¼ù®êªîžî陑f43’V ,$OÙ Öîr޽À‚Ír–EËk1†•±e`1˜9`›µ—ƒA’ñÁ»h- ûxÁZ,BŒ„^ÓÌŒæÑÒL?«ë‘Y™y3ï½±Äͬêžîi4ÝÓUùýÎé35U™7ófļß÷ý"ÂÄ1³]œ)‰šéj$IöÆõ8&Š"f³YHæiÍ4Ïq;´42e¶^’tÚÕfŽ’Ð–Êj(q3¢˜¨JcV"liqcGQ$혊 ú¡¿¨‘Â7ý^ò8ÓÄíÝÔXm)/”íÁ+ç÷v{qõXŽÇ*¼Q{ân‚iÜÄQŽ ÜÌ-’ j¢ t¡J+¢4¢•Pzh×cšSIA”ÆE Öãë~j¼–&é´™ù]ÒaLÞšáv ŠdF#ËPJa­%MàPaþSïè:EQPÕ$Ç[OÚï`“2ôÙÊã 'ÎO}—òXÿ¿% ‚ ÂÞ2x·î¯RÀçU` á& ¸BÝ©Q«*Ì/€§<7[TOçUãý øo¿å·yàxê©§ø­ßú-ÞÕú¿0Æ`LP+­µL¶øËÕ•kô!=Ú ¯¯C©ÚZË÷Ž¿‹oýÖoåå/9=ößòÞoy®îêchˆO¤ÐÛ›î·<þY-ÏB'(à‹êïÒ*àtT¡¨Š «¤aÊD'˜J‡ÊÛ bb|å x£Û w´GUUŒ§c\n®½÷xãñO\©€3ô7VÀUÌÙSÀçÏ}Æ£îSÏQÀ[Q1¸4`: «ÓwÊ*R”ì)à6r”e½cÁLa¼&J"|â)†E­€'Ï«€ãê ò(àÊ(zëkW(àÖZŠñ¹„X‘U fÍ7±`ÁD7s¨•+p îi•†ìPÎB/wJÊ“å5p"P±B4ÄÝVH@Ìf!ˆÎÝ^X…$jFèØ ¢;žâÏÚ¨xŽŽølLܯPÀQ*(àƒk(àÛjl¦è¦!$äÑJZ‹IZMŒ1DQ´‹n¨€WW*à(x¡ ¸úŽú®“vÊ„k*6è8ÆWvV¡"M·ÖÔ§Ó)J)eYÒéth·ÛL&¦Ó)ÖZʲdº3ÄíVD­¿k‰îÈH²Œ|0 ëzÔã`´ž¢#Þ£¦Mñ…Ç ©¼…Q=­¦i°SÎ{®èh„Š~FœÅø TC3™L™žÞ ÆE¹¯WWŽß8h¼ºC³ÙÀO*‡2/™îäøÊS]ªÂ× Ï7 ƒÔs¼ÚŠH,•(’vg(…«l8Çú{/ZOÉz]Š<§:Ÿ£:†j\ ;~—8Ž1ÆÐh4h6›ŒF#vww‰ã˜étŠ÷žF#,/;ÜÜÂW“FaúBYâËpMaý¢ï„ÿÿI‚ Â2sÓ €/HßP¸Wî~žÛ{ðî•û€› …k+QÀE\ðÛRWÿCÝ—Ô^òNÅ k0ç=nTââ ÓLY=q ¥ãñ˜ª,iµÛDQDUU´Z-úý>ãñ˜²,ƒíELÇcÔØuª½ƒ18çˆ[Mª‹! K×¶[تBÉZƒÝ‹Û8ï‰}D©ËÐï+ðʆibª‹/ûº—¡³ˆBWäU>‹²Äßåa ê‚ ŸS»¾ægáÚôwÕ»MĦx²Õ„ÄE¸¼âé÷=’ƒIWLdÂg^'Çb…$¦‚öZçBJÛD“á]j\L‚¸Õ ã•1øÝ*ˆú ~l±Í‚,ˉ“ÙlF¿Ž7›ÍhµZ!ñ9Å1«uÿloSòLjFèH v÷„¾îê„^ þ×% ‚ ËÈÍ >ã`ÆâU¦‰óˆ²]†Ö4Q¯‰‰¢…îgöú x¹§€cë>ÌÍTÀ¹¦®Œ"jfÄI²PÀ•R$I²PÀg³Þ{¦yNui ±&+SfÝ’´Û¡ØÁ–ƒ¸qXŽHÇÕ¬DU¯=¶´aKÀX|VÁ ÜÐÁ˜=Ü‚N¯RÀG´ÃªœÇ_­€§õÏûpw•^O÷Q-Ð] )W*à­=ÜGŽ()Ë*$ovºU/p¹ªIVÚ̆µÏ tDG[ ²fÆy€)ä“<üÜ€¸ß†zÝ£5ùí„÷Ö7X,*ÑxïP(|îY[[c\ޱM‹O Y«E³Ý¦Óé0NÙÚÚ"ߢ66ï­}ÿišâ½g<cŒarn E¸a…êFDÍ”(IHÓ”V«E‡¤Âîîî" 0O®YkéõB{åyÎd2 ».TÓKƒÐþ ® e4ö— I‚ Â’ñM\pQÀEœ«€Û_*Tô£ ï­ÃM*T3";²WyÖZ³ºººØJu:.ÖT™ÿišÒét(Š‚<Ï©ªŠÉdB’$̦~»BuM¸Æ"µæ}¨Ùl†v¨¯Aê¾>N‡ªî ãjˆlø¼[1å¤$i'”ªB•ŠT.v ò?Ü!úª6q“'!1¨BðŸõ2:½°æËî`ªN!Y™µš”EIñ!dt’06%¢°-Fq+ 6²x­V‹¨Ñ Óé„‚1ÁÜXDÝ Œ'IÆãñ" ¢êÏ¥P-ƒß®°Z‘f“ÉdQñ¢ˆn·»°,²zëRï=;;;4 ëëëlmmaŒ!>¹†µ–|¸‹›Tèf„2šêŸM%øAI|A¡¬.«€Ë*à‡fð…®n¬€·O®=G÷ÞÓë÷ x«ÕºBŸ'ËÛÛAO5J[b§iÊl6[LRIHÊ(¥èt» ¼½Þg²3ÀN-iÚ ø4(à&1Ø– Si€§ÿÓÓÜûíâ K9 ‰Á<φˆïùk+àµ=‘ç9Q£µŸfxúw>}¥žÔ øtŸî Tªhõû¨(¢½OÇûpnóþY»( âV“Ùh€S!a8Ûc£Ûï/ÚÞ{Ï‘#G x£Ñ Š"F£Y–EÑ ¸Ý¯€ëZ×{ ¸þ>ãÝ;+µ?ôŒÙäÈC'}–e‹íS˲ÄZK³Ù Á*aªG¯Tþù”çÃác ùh„›Ù:¸7)éÞu”étÊÊÊÊ 3B•ÚìõÍ¢(h·ÛŒÇc:Cçh·:XSᜧ¯úl—Û“‚¬•13³PaO !¡0Õ‡Fð•m|ÝÇ”Ö`­N‡_ù §9M>š¢t¬žÍ(ã8<· I3Á6BÒVMJJ>ɉâˆ~»M aº6!æÉ°ÝÝݽºêççÞëõØÞÞ¦{bág/…ihÜÌ’FÄÃá^¯Çp8\(ÿÍf“ñxLEDQ„÷þŠ$L¿ß_üÿð^Z´± ž ‚ ’¸A@øpg*úw½BwÎQMgø]mE£j0;Rà'.ÌÿTgÂàý x±[Põ*’, [æ~¡€«§¦î#ºèp'-¾áCPâjÍ·¦‹ pP [°Ù¢maá¢ÃÛOóKQ$IB«Õ sÜwwéõz´Z-ò<[Lv¯¥€›+ðë±ùãg¯9vÜõÜï§Ó)išÒh4¨ªj‘äðÞ3™LBÕ{ü¬‚]0­É¬†±k>§½Ùlîȵ‰¹a·k-ÓétQ鎓„YY»˜ÈGDiD:K±Û–¼ÌÑè\+©Ç…Lª>0‚ƒÁ¤¦Pêç=/]BŸ/ó5ßß;ÕAhªp¬z-'/sT¥H;)I'¥¢ Ÿw¬ˆëµ/ò<_L±Ö†1»žj1ÿ®QJÑív)Ë­ëþ»ÚÄîN!Ó°ëðq…‹ªÅg;oß,ËpÎÑh4˜N§Ìf3~ìŒTõAAxá QÀE\pQÀEŸóÙ¿óøâ9¯xÇküþÅþŠ¢ ,K’4e6…µ=’0Ö{ëèõûL&šÍ&iš.>ïÃØQ)6D©H½^¥UU-’MÖO™íTUIÚL)fåN‰ë……2¨`H5ÃÕ'þAŸ€õƒÁÚ„S v°ãzÑWãQ*è†àŸØ‡v©|XÔ`¢~DÚL™NrläÑCÔh$ UU-¬§ÅÎ3„u^#Q©jqÞqmš4›M&“ ½~Ÿ­áù0u.7±Ø¸ m·‹ü)¥(Š­5I’ðÌ|Z‚~AA¾°€(ࢀ‹. ¸(ࢀ߈yŸ˜¦³ÙŒ4M™æa\¢ð¨ŽÁÏ,Ù+‹ï4MÑZ/åðÙ¨ERMT_ÖZ²,c8.%I»ÅÔíâw= Ý J+|æ±c í`a]¯I±¡ IDATùùmTfð»!]ÌÂ÷Âüûtþ;gAA^P@pD\pDüù9ó·U'ÿ÷{ý<øïv»áZÝà%ªmBõ¼N.ò µ 6¿ÆC¦0¬…¢UتQëÐ7çÖÃþ-%£("n5Éí.j· ""I“pÍ:5®Hê±=f±Ícr>aÖS´T.? ÉÏä|‚k¹ðؘ½)euvR;«I;!"bVGÖ öKUU‹­çÁý< íÃ9¢CÍÇÎ(Šæ×ü÷yŒÕ6¸A šGŽ,®™(Š8ó·•ê¿ ‚ Ÿ@pD\ðÏQÀ|EQPÍf“v»Í¥sçFQ}aItÑZ/þù9Ï#{™°¾‹š'“ëþtu…|¾ž ãxB¿ìRÂgÊZëM¦~¶·(l½Å«--Cc»ÁôîiH×¯ÛøLÒp“Ô߃óØß(ZQ“éF°ž¢2"i%ìÄCL”-L…yNÓ”²,ÿ¢ Šcp.œ[c¯©æÛ÷Íbóþ­µ&í¶™mC’N/“á£'N„k9Ï[… ‚ ‚ |^ QÀE\ð‚(ࢀo¼ýuìßíç&Ëd<Áç•T¤ð*´wÇ‹ uôûzœ·Ö¢t°?|âç’ Q}~I˜'I¬µ‹¾ušL“;²$qBiKÊA‰oxT3l£:ß!…2\s&6´O¶QY }^Q«B‚'©¼Qø§LXŸ¥œ†DW'ØÈ2íDiÈ ÌßËÜj™›[eY†à>¶&‡Céúœ•zÎgQUY–…ïÅ(ì¬Cfð¹e’L˜L&ôû!A{ñï}Fªÿ‚ ‚ |þ QÀE¿¢€‹þ|ˆ. 8@·Û%Ïsv¶¶pÓj‘ÌqSKc½ÆÑ:™Ó­“ºQíû€N šÒ”à=Î9²,c:E­Vkayï™N§‹k¦Œ<®ãpc‡+¬²(N»Úª ‰7ï}Ø2Ö;úqŸöz€Ñù]6üF½&lŽÃÔ7oº4Ø™EØê:Ž2 }uÿZ-óõZŒ1ŒÇcæãä<¬&ö1Uâç½ÿ³h6›loo/ìŽF¿Ãtc€ŠBÒÒM+vj«§ÛírQî_AAx! QÀEÿ|QÀ÷! ¸(àŸþþOªÞOóåt 3‡j˜Å/’E¦5̓þùx6?_”Âi‡«ZE‹ê¸1†Éd¹ßy*LÙêÀúkOÑl6‰N¯*‹ðI¦X Ø[Ü5©A3Àv±ŠvÚæ»î౭ǸT] ý'ª[¯›B¶°°['É“úµêópÎÑl†Äæ³?7‚þ×_ôUï<㬠ï¯~îÜd˜'”RdY¶HîFQ¾/còYSK9²»»Ë³?ú„TÿAAxa QÀE!ˆ. ¸(ࢀ/Æ‚iµ¨¸»™%] IÐËÿàY°þs§ü|«Ó+®ýg\X´t^­wŽ$I¸ü»Ï†]MÒІy&Ú%tÞ¢­|…j*Le°ÎBff°Æî}§!1ÐxC0Èá÷ð»ü£!LŽcëãÅ`ÚÕTT¾""Æ{Ïîn°‡Äª~Þv~ïkÿÍ‹é[Þ†„‚3Žý_rûÇ€ùg2«{?}̧ý³­]” b;­dåAA¾ðÀµ\ðçCpQÀApQÀaò³[J}¯ñ*Ò!ibCP;ø©‹j²àÁùÚ…ö1Ÿ>:Ð k«Ì“"—çÙEŽQÊ©BMÆŸØ$îÇÄÇbrí𥇒"!Q ¹ÎC@…çùSž"/Ø™ì@þÙ™ìPäþ”G=«`.yc ™Ë(|A‘¸2$oÒTS>;¢Ü)ÃX±Ã^â`±› \þgéüÕ ðÖCS/¶’5Æ0N¯÷ÛUƒŸº¨Z?yÄã=Ê„„¦wžÉÏnIõ_A„?p=DGð}ˆ. ¸(ࢀèHḢ¢±Öcü6¯ùýŸ?¦NýóWx[UWþQ¦€9ÇîOo„ç%~¾> Š`çt êDd«I7A75éÝ)ã; Jçà*LÃÐNÚŒª¶²øõ0>T㊭éÛÛÛá:zÜVsüšGmK¡´C_˜~S“XkZI‚F“K)²‚|+§Š«”˜ŸÊ<éø!ÔîŸnþý®Çû½)nóäGÝöŸúî?»n[ŽÿѦÊ~|ÅO/PZ£#…•ûAAne`?¢€‹. ¸(à‹±@ð¥VÀí/WJÿ@ä£nFþÐöóöÍyâR=Ô÷‹àX+°žÙÏÕþÄ ¾n—hN4i'%m¤8ëÆ¾ R€1د±Ì†;0Ù»öñ„$ÒÜe¾*þ)!!˜ƒ¿ÃSÅ;ì„ßu#¨ê„Í$'Q ݯÝuÁ*)\8N\÷ƒ}SÙf??Tê­ÚcTèÇõ÷XõOÇê>ý¼ŸkþжŠÿnËÛñ ûË•TÿAAx颀‹¢€‹. ¸(àuçW*å¨>¯ç̧›E?”x Øw^ä~ÅWãñ,*íI+!61å¬$/r _@£¼‡UhÃY=~GÔF0Sz½EgéÖɇ¾IƒqýZ3`RA«‚&TªiE¥*²$#616¶L'Óðx_¿‡pÅ9ø_uÊüPä‰Ãš;›œýülÿt,¿ ‚ /}D\pQÀëø]ð: Fð@õKÅõûtÓÕ¥F _zfù K°¬0û’/Óº-  E7Æ ¥àõ_ü>òǓݙ¡áºóSK~6ç _õ>úñà'@»NŒë×®Í\xÂa] ¾ô˜"ü×Y×9 {£óAA8( QÀEQÀE\ð›È‡P¼¯P(¯(óWºðW„¤uÀoBφQ7¯Ÿgf<ñä4;MºGº¼öu €ýçÿ‚*žxò ÈæîU”T¾ í5ªûÆ î+=(ªèJ£½ÞKÿ è ‚ ‚px ¸(ࢀ‹^'qDü&¡sƒÏÁO]=¶×mëêvš“Öí…v|僯ä‘3§Ay¶¶¶ˆJC3j²uy€fÔäòø2“"G)𻯺çU|òÜ'CBA³×Ÿæ €ŠEòÁUõÚ.3…Æàd™>AA{@pQÀApQÀ¿0Dn„J¬)ÔªÂ=VÔcEý/©ÿ¬î˜ƒ9>ù±O¡,øô:=Fv™mϸT§PËío<½£=»Øt|rçSÐW˜T/¶%ª=«û—ªûƒý@„ßòpÙKC ‚ ‚pø ¸(ࢀ‹~\ˆ@E bˆßRþÉ,\oQý¹Ï“p P¹âø+ŽsöÌ9Tý-w´µNûd—ápÀ… 誰híðÂ×t9¹FúLÂÆh/áøÉãœ;w¯}øn˜[ó1¥„ø+R˜„䱤™AA¸½yQoTÕ÷¯´BEWT4®\³ üà¿|­¢ˆ­­-677iµZ 77ah±:¬ÈŸéÇ1»¿¿qåb~W(ລ÷ð¿áñC}üNOÔ‹èëÓ?Ò`gs‡‹;Tƒ*(àõ åÕ ¸ê*Ôº"[Ï(/–”;%nì‚Þ`OŸW¥tþê:eY2ÛÜÆ)èºGŽ09rä«««TUµ¨Œï§õ“GüäÒ6:‰ð•Ã;—=”FôC‰÷\§RúÕõmw‚¼F¯A£ÕÀkÿ\|®pïWÀ[ì)à®®îfõËäûðô*Üï½&Íb ‰JÈ’ åÓñ”é`º÷š|îµe~(ñŠç©t 7Dßo<+þú xk_{e!é÷š×½†GΜÆ^CTîzí]¬ ÉÃËg7øìÇ>K[”ÕÓ¼úžWñÉÿüÉPYÎy®ž²—|¨Â!l+ÜãVÚö&a¾6òê¨B­hè)”_ùÐu{Ô Â¤3$NÄDqŒ=—‡Ç$õ1Ï£Æõµ]'ˆÍ‰Œª,á\ EØ•¥¡í˺¿¹ø«Há-0ðøm‡¿ä±$[õ ‚ ‚pÇ\/ê͹(àQÀ_¢€ 7_^k<€>apgÝí¥€Ÿ4¸™C¿Öx÷1IÜ4UOÅ_Cˆÿ«”òÑÚHÂ÷D¡ L?¬ÝròØ1ο1DÇÛØ²ÄL,~%äÕHaûÇTFØYÁÉ;ŽsöⳘ¾¡˜ÖãË|'ÛâW¥0 }J%àÓú½!SAA¸½yÑoTõDÞ´ÒÏkѪ#ôƒÍMTذÿ«nïù_ƒ§ªoÀ›,𬓑µ3œqLÝô œÊ†ÅÀ®VÀ3ÂïfupÏQÀÃ"€õßæ xdÀZ"ÏB×V“ròÝ|OŸÔÁAÄ \cJ Ñ;rd±øÙçÂ\w¿²ÄÕ¥7âMbP™Â5\XOáùð>D½Ÿ|e}…é(§û²+ðáÓCíŒímô©ZTÁî˜+à–+ðyõYW=ո܇õ">, øÍÀ|YäçsÀ‰ úx±§€ëú¿A7Š_t"(àurnýØ:íS]žþ‹'Ñ…¦{G­€ŸâÇË^y/£g†l\ÜXèÜ'ï9Á¹Oœ Sx¦õøPÕƕ苓`ÕsÀíÃR¾)íÿU‘W÷hô:TÝsÓp—§‹ÐþðÏd†öÑ6»—wqÆ¡Pà!º§Å±ãÇ)²rß ÛOl“¼ºËÅ ¨ÎŒÃb°x´ÕtÖ:Œ.°¹ í_'ãWÕÙ€†‚,ØîY‡?ã°,í/‚ Â%¾D>§$Ó—i;*àîa'íz3À¯Œ¼ZS¨# š ÕwñéK¢€'_v¯ð#ßôøËû! oJûyäõ«5´T¸=øYøì«Ï”{  v=nÏM¬ã@·º8#Ê#ª5Ë=½»yÕ^ÀéœæÌà3D— UVá¥0œÂ…º½uý=2ÚKEwÇ¡¦õ.3)0ö¸GöO¥ýAA¸}¹­–,\xÞàÿ~ãUKÁèöRÀU[£ïW^æ€ßäÑ*!,4Z'ï|剿"¥üÈ-VÀ¿<ÅW5/óGd¸›‡÷˜ƒ®BÅ@O…¹÷›~ïÚœWtƒ`w,'ï8ÉÙá%˜AÕµ¨DSÌ .\ºH³•hª®­·­Ÿ³qsÄ„êÿp>…~èÏ{Ô‘0¦0ðøzÄýAA/² ¸ÿõpÕSDk ÕÅm± xt_¥Çoy™~³¹Æp`oý 2¦4´WÚìŽw9ûñg 8ÞsâÎ;)CVîݧ€ßpr`j9{éY´Õ´ûmF»#¬µa,(ëת_Wæ€ßBZ ïÒ°¢ð—ëëQMÆ{]üÚ6ÙJÆÆ¥ Î~ü,4~Øò9ÎÏ3¬B#Ž/ñ]ð»VógŸ> %¬®¬’ûœÑö({ždhª½]_ú ½¦`Ûã>ë¤AA¸­9Š(àËÉÕsÀÕ…ŠÔKª€ûª®@Êð›ßþ7šþ‰â–*àñÉð[Í«ëìÊãoM±^¡bÅ=™Ÿ'¿²Nþ¤ìõƒ¼ Ž%ÐÖemH m\yl¿^ïÇ IÁÈQ\¬¯ùl¯Ý™…ý Ï;óÆ(`_qÿ¯†/¡GÄAávޥ件õ~êû+r Щÿ„…N_ñÉ} ¿éð-èíá øÙ‹\:{‘Ùöl¡€ûøÍ ÓWáY}ÌVý ‹ÀïCо7Ÿ}û€«Vþ¡ž‹=þ¯RÀ1pòØ1ì,ØÑÉ6ªŸaV fÅ…ßlCLPÀCPÀõ><WÍ|þ·ŠTx/qxo¢€ßD*P)ø‰ºu, ?¸†Þs¼nÿ;N‚µ×TÀ/\ºp¥>c¡€cêctêcÎGÌ(¼¦/ë¤ÑÐã'•²g"/:Sà;zˆßÿößã­¯ûîùpÅ“ žµ¨þ×SűXäÕÌ ëÇŽÁ† ×Ñhà­Ç[O£Ñ€þ¶aY?v 3 ÓÃhÕÇÚlÍâuïùpÅ[_÷=üþ·ÿßñÐCL¥™AAÀ‹ü†ï7^uf=w„ó*î~\× øÚq(ëÀÌüÈÉ5\ÓqáÂ;;AŸ+àG[ë`êç”p|í8*WWTû¯PÀ§`ÖcTW…=Ê…›š¸Öp_ùç$dLihgmt¥9ûñgá’ U¼Z_i­pï½÷rï½÷²ÒZáÄw‚÷á1—,g?þ,ºÒ´³6¦4ÏI8-^Â{‰TýÞ¤™nõp÷„Ã_pø©‡?ï÷ } øêÊ*ü|…_ š·Ÿ:Î_8Ïã<Îã<Îù çñSþ¶BPÀ?~Š €·íÐös\‡9àìxüÔã/„÷äsRû½‰X`kk‹Ë—/ó¾w½‹'÷}Ú_þ‰Þ^òg¾&@òÍœ³öÙzmÑšÜäA÷_…Üä­¡«ÁÁÙ?û,ùfLêcù½$Ðⵉ€÷½ë]\¾|™­­­C»E« ‚ ‡+¤:8Áÿ¾9àÄŠè‹Tª(?9[Üø3 g7âpŸ€¯ðsllo@Î:vžÞ ŽCpñô'ž ø]{ øÙŸ ø¬XèŸó…çâצõ*Ôá&Qæ€ßžo¸ misËàéÁB÷ÝuqOÌ8»ó÷¬ÞÍ}÷ÝÀé­Óœyô)¢ËÁö˜+àî‚ Ç˜+àv_Hæ€ßzn4|>5Ç„&m=W76\³C G‹Cû´~nÃtöðOmÈן'[2ü%Èÿpþüy~øaÚJ…„]ÍŸ® Bûh s.’‚@r"¦ªî’徯|Ïœÿ,Í~€É΄S÷ÜÅcz }ÔEšâÉbÏ.³,ÅÔ¯5Ø{_m¥xøá‡9þ¼äAA¸ýcêu˜*ÔI m-Pk µ¢^2\­(ÔšªwïM¥r xÓ¨ƒ{ÕR!øÏ}ØÒÑÝz|ñº¹Çá=-’ÂMáÁ÷UÜÿk Á=bñgwÿ‡’{þ äV+à÷üAÉÝÿ¡ÄŸq¸GÂ*ñ÷ÿZÁƒï“97‹§A=üž÷ðè£Rú«mñ¾kÔ°w-æáz}àÞh´›àà±>F¯Ñ㛾ñ›ø¦oü&z}ô1pÐh7yàÞÂ5žï9˜}cK|åK—Þóè£òð{ÞÃÓ  ‚p»ÇÔéÍ^op¨÷€Føg2Cûh›ÝË»8ã«€G÷´8vü8Å#CVîÛ· ø«Ã*àÕ™1á¡m5µ£K£°Ô”Ńó9à û€ß²ö¿Ñ>àç˽à¼í;Úd«m„ö†‚°EHÜ ¡µ"ÄÅ*àÛõ*àÂâr%¬?°N¾•3:?ÚÛ^ÒAt‡ì~«¹üw?ôo|ãùÍßüÍ+5ð{ðœbošH\íº=³ºŽhLj°Ï{þSæT‚YØt!ÈÏ}è/#ö¦Íwx8^÷^ð_÷½ßË·}Û·ñá˜_ûñ¿BMnN?®üœÄ“kuûÏû¬“&6¸Øákƒ')bNÜ}€sŸ9G‘”‹5Ft©±¥Ý›^V/J\®ÿûèÞk_óý‚ ‚ ܦDîÝ^cøü&¸e øüueð[›®ºî>àó‚à-RÀeð[Ïæ€sËðýà'Añ®wù7¿ùÍ2üqÍ@{^õŸO#˜6µÐW:tGãÆ?…U·Ê™Oœàxç8ª‹¨&è–Æm¹Å¶¯ff°ÞîMýÚoÜèý‚ ‚ ܦ¼]öÏ·„¹ØCn½^¿®·á½°˜.Ü4Z ï×èWjè« Íç€ßbü9û€¿R£ï׋×nJþçÊ9àW€·J¿*”9à·IçPõ¸\íµ›)LHØYÈV;ÐR¨U¸è.¢š ÕTáçU ¥ÈV;á{Å×ÏÝŸøî{AA„ÊÁªW_oø<0¿jðl%cãÒFX °¡Â ß["Çùáy†UXÉm¡€ïÖ øùгOŸ…2¬žûœÑöh/øƒ½×ÍÁ¶‚óÛ^æ€ßDæó«kŠ{Ä^¹ø+û½ßhp¬\µ 8W9F'Ø®‡M»_Oê@`^€{>JËWìþkHSÝž¥ßóÿà[ÞòÜ9à† ú¹FRÀÀéžÆÅ.ü.‡Íb“¾ïƒlnn.vpÈŸÙåôS§¯ öç×´¯_ãªÀ|ø£ï}¯Ì©˜:õußömò2Ç&R…šÂ‰cwðÄæ.~×Ó;Õc°Vòë­÷l P‰âı;øô£|ª°Êb CÛ·1 Ç.Ø› ‚ ‚p9XÀö¿†¾ñ©°ârµ±ü›½›MÙüÖsÃ}À Ï«€ëu—÷ÝóršQ“µþký5šQ“ûîy9\vèuCr¢v¼¯§€Ùü¥âIP¾÷½Ì®þü2ë÷Úkaq4Áp•„6+àg>q†U·Æ–„ ‰S+àÔǘ÷'Ï5+À3àÑ÷¾WTð—’y‚®nŸ‘±ªWÃõ:òø6<þ‡â‡ŽæË:ØÒ¢œB9…--Í—uðCÓÏÁÀª^e¤F{íî$ ‚ ‚$nÏ·ø-TÀeð[Ï ç€¿D ¸ìþÒ$žlÏtSnž>e‘`|Þ÷#ÜZG-Qø·ÑÞí² •B÷ª§9~ì£Ë#Ú6íN›ÑåÇCõ4º¯ Rá9¾>F}¼EàqikAA$pk¸Ñð}Úõpt¯RÀW!79FkèjppöÏ>K¾™‡Ä©å÷˜Èð—&ÿsý9àóù¿ûƒ³}IÓ¿9‡›¯€+™þRqÝ9àó›ô7OŸqÍ °Ì¿M¸ª¼ÑzðÖ†T€ ŸE1®¿(Êzü.,lךvSÐaš–žj¢4"J#ôT‡+W;ÒnZoízÕ1¦uðÿY¹ÆAAÀ-ã†sÀ}}ƒv³ð«^C怿4I€çÛû+ÀñMPÀc®[–9෠רcyÁ øÂú ðÁaZ'iR KØÉc¶°¬öVCØvP@5¨¨Uxü¶ƒ ¬öV±… ëÕÇHëcJvWAIÜZn8|~“~³ðkT€eøm¾ ð(}ðt$àƒÀu*ÀEã(àB*À‘’½©[®nÏ&° gÿülø¹®çBR/®n…Çýó³°]?'ªQí;® ‚ ‚$n7œ>¯Ü<¼àš`™~›pUx£ù"(àÍ ©$®SvÎqÇ©;žW¿ãÔ8ç¤|P9‡bwo¬^]]…‚íÓvàÔÚ)’$ ) IN­ ë×Ý©Ÿ;ÿNÙ­-‚ ‚ €[Ëuç€Ã^uVß\_õû9෠תO¿|ŠT€ÏW†ë+àHøPà÷úÀÖã[@²š­dÐ…gy&\×Uý/¯×…l%#YM ©Ÿ;o{/« ‚ ’xI“× ¶÷U€GúETÀõè†`™~q pá^€î ©D>— ðݧˆÖ£ÔyˆÖ#NÝ-àC5”s«I™'eYhÇ5(ò"\×iýóZhã,ËB¢PÕϵì%AA$p›qUxC½ ¸Ú ðAâ:`·ép—Ýó*àî²Ãm:©d¤¼Ü\@QÔí–(.¡=§`´ Á"­7 m^\, S?·$$€.ȸ/‚ ‚$nO®®§_€¾ïR> |àë*àR>4Hx¹‘ °ðšÚë1° ´Ã˜ž‘‘ïädýŒœ<|WŒ€#„¤ß 7>)m/‚ ÂáAʳz¾ pœ©]ÿÜ@*À‡ ©/7Ræ =–„O ƒv¿þ>_úwÇêÇöÍåcAápqxol¥¼ÜHX °ð<ý0ÆÓ“ÚGÚŒ>3 ß„±¿}w›Ñæ›ÛÐaœøˆ´½ ‚ ‡ }hÏL*ÀËT€© Ó:˜o‡v`<2ÀÎlØê¯vVÿn`Ã!Ö— ‚ ’8PÌ üÙÓg±,4 ÝkC [ŸÞ"ßÎ €|;gëÓ[×i€½`9{úlfÒQ$uûR„€~ëÏ·` ôÀf6${ZõÏ=`\?¦[?gþ|á`òŠYÌ×[Aš‰Á$&,üX„v.ò“ÌÄ,¶€¤¬¯û'$ùs ùŠ‚ÑSBrG½}бFÇ:ìÓ¨ÿVÖÝA¬/AA$p  ° `A*ÀB^ôC(”ÐköpÖᬣ×ìAYÿmX?V®{AA$p‘ ðr#`A*ÀÂ#(„Ý\. >3k< ꟓúoáw<"m/‚ ‚$R¤,HXxÅ!<¿® { Në¿mÕAA8¤þYZøRoa_÷…mÄøAáУýJX ° `:ÀŸÀ5ÿIð/‚ °7aÛ/U¨•ÿ =¯Æ_3 [-'ë=@ÎJ» ‚ ‚ ’8¼I© RAAAK€T€ ° ‚ ‚ ’X ¤,‚ ‚ ‚ KÂIü¢ ,‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ÜN¨·(¯Þ¢d ˜ ‚ K…–@AXªàÿ/«°¬©AAX–û ùA„¥ùÒ{³ò4!YM(¶ ˜€¿—ïCAA=b‚°œ (àË׿ߍh×AA€ Â! E_¾6ÿkÊ«†âe¯~›ƒMð€‡ÍÁ&/{õËP …úkÒAA8ä÷Dò‚°Tƒž(àË׿oQ^¥ŠF?#iÇŒf#ìe €Y3´Ó6Ũdº“ãgÿ^é ‚ ‚ NÄ–;(|¹Ú\ðåkóÿVyRPMË,3]¢´ß~”ÖÌt‰Ë,ª©!­Ÿ#‚ ‚ A8$A(àË׿¢€/'¨LÑ=Öaö±E>EM  ÚŠ|Êìc3ºÇ:¨LA$› ‚ ‡ôžX>aé:½(àË׿¢€/g»s¸ÖQÐì5IW›øÊ²ó™mâq @Ù*éß½‚Š ³­ “Á$$‡&àÿé‚ ‚ .–Ú| Û\ðåksQÀ——h(Ì‘ư}æ2ãሤŸP¦%eZ’ôÆÃßõÐŒ m¨ð\AAI’ @ðåksQÀ—QÀ—ózÿëÊÓL#¦ñ²«÷®Óh5q‘‡ ÈÀEžF«É—?õëcþÖ/èÌ@£>† ‚ ÂaºGZÊ“|ùÚ\ðålwQÀ—·í¿]yZš¨‡@£+*fã)UYáŠpýëÄðï(ùž·¯ “ˆétŠ–TãÆÿÒAA8<, ø¢€//¢€/ç5ÿ7êk>Õk°–ñhÄt4¡Ìp›œ÷pÞó«ï(‰€þ¹mÆ£X ±ÏMëc ‚ ‚ HàÞŠ¾œˆ¾œA (àKýͦ”çqEE1)°ã‚jZ¢’0&è†æÇþ_Ï:ðß½UóÐ[5v\PL \Qóá²WŽ ‚ ‡+4Z’``Ÿ¾5Úb4A0@N‡8ïh¬fLwrx ^ðCÒîß*Þ{ŠIÁʛ֞£€³iPÀßpï}¨ü}³ò¢€`R ÑèØ ´ÆâqeŬ˜á¬‡$4­³žõ ;W(àzZâ©“Ïñ 2ŸyÔÔÓ§aZÇ 0@TCᆎ×ÀßúÝ£¼ûuÁ†k?ë¥ä&ÇÛp,AA„ÃÂRÔ6D_ò Pð¥Cð%Çcð§=“G&° ŒÀýGCÀÂÿö=}àcÀ»ÿÒÅð·° “G&øÓÆõ±AA$p€|9ƒ@QÀ—zd|I¯û¯Wªug-ð áý?ó~ÞùÎw1þ¢çg¾Bqø¥oPÄEÌ;ßùNÞÿ3ï ÂsUêëeAáЄƇüfPðåEðåEðå¥ \Û÷àÍ?ùfÈ yG“óî‚oýÅ_ô nÄüÀ¿ûÈÃÿsœøñ€UPHü/‚ Âáàð×¶D_JD_rD_ÎëþõÊã‹`xu@1_Ú ñ¦>ú‹üÔ»Ç|y–ñ›ày3 îL˜ýÅá1æKè£1tÂ1TF°È^/〠‚ ‡à~éPŸÜ_[þévDÔJh7[࡜äÓ Õ  êÅd&ÿâv¸œÞý1nTÁü¿ àÀµý·(¯Ú k|åÀùPáüØ£§š·ý{ËWßüÖ:fh…Š4¾t0õø‘Ãÿ¶ôÓö_¯<1¨HA þŒ ïÿgïç±Çã‡ÿÝSêFð¯ÿÄó?~ƒ"v1¿ø7~‘x€7ÿè›Á€ºGA ¾òá¿ÿIúÀmßö_¦<+ îP¨–A7b’,£Ñheßý£Oðu„œÎcÀ—¼ó—_µ–ªªÈóœétJ‘ç¸i‰[üyÛà–> ‚ ÂÁæpO|y|y|‰3õµ?òè#1Q’eI’ðO~ô N*ÅÄ{>¼ýû5¿øÇO¼½Çýà#üÛw¼­5Î9”R8k)w± c€„þ‚ ‚ íQÀ—QÀ—3þ|¹i]P=Eœ$(­©ªŠü¶§ø;?õžÿúï¶øû߭Э?ò¶&?ûsÞ\¼x‘ÑhÄÿ¶§xû?x¥u8FOA·>¶ ‚ ÂA¿_>´'& øòvjQÀ—·íE_Þ¶ÿ*åi}P+šx¥M¹;æ×ÿEŽÀïû5Þéf¤³é;Ìùè»oø‘”óÏgüÍÿ%Èqq§E¹=Âo;Ø!$ÿXú€ ‚ —Ã;@ðåEð%Ž|‰Ûþû~ßs?ð¿þ ¢Œøÿ~ÅÒþÊO¬’$ mç(Šï=J…5QDt¤Ë_ù‡ ]­ùŸ~¢ÀvgB9…¤p¦`×KAáÀsxw|9cQÀ—QÀ—-àÀ{¹­°õøÞëõh·Û$IB«Õ¢Ýn£”B)E»Ý¦Õj…A»M¯×#IS¢Õ6hUÿ#$å»@A„ƒ/Ê“|y;´(àËÛö¢€/wûòôà×s7pxxçÏ¢Ù Ù¥EQPÎ…h^kM’$$I‚÷!Ç7™L(Ë’Ñpˆ›•0±øKà? í/‚ ‚$n¯“úZåi+T ¤à‡ @ÅBÿ?ß=æ[¿Añcàù'ߢh6šLÎO‚ÇAitâ0òø?’¿Û¾í¿\y2` ÌÝq’Ъ+¿ð¶§8©ùU øÛÞÞãÇ~nÀ¿}Çk°Ö†à¿(F”EýL—üŸJ¸mÛþ«ÕÿÏÞ›‡ÙyÔw¾Ÿªz·³·Z­¥%/26 Ç¹Ä -Ûd€¸d‚“ƒcÝ0&y²]’a„$Ä„eB&d%ÜL&!ðÌ8⌃¹Ü.¹$˜Ø`Ì,ãMÖ®^Ïò.µÜ?ê=§»mÉ–lKnKõyž~lIݧßsªÞ:§¾õùU¹Ÿúû±sSÀí*<ŽcªªBA’$H))ËÒ·ûÂ"Bà9X÷÷¡¬Ëöÿß…£ Ìd/¡Ùé¦)qÓh4PJáœc8R–%I’Ðl6B`Œ`4QUEQ0\^Æ.–pÄÁ0Á@ žÛœq{¬QÀ3  2ç(â,£Ìs~õ÷Ç øˆ)àwÏI("›3’,£Ês\ip…ö&€—ûÇv_ þÖ5µöÿXü}¿´—·½÷<ÞqýÃ\ÿ -ÌÑ!ª•ñ³?¿õ[‹|ðþƒɲŒë®˜íÀ»yš8I°½W†úßuÏcð«ÿ}´FWJ‘çùdâ?ž¶Ûm?vA–ecXZZ¢š–èþDPÀŸHü=jÁiƒRŠk÷þ[·n¥¸Ï­| )%Î9²ÚþȲ )ådO€×=ð½´Ûm8À[?ŠÓÆ·»àL.š @ €çð‡À¸žG¿¸4bØüöû þô/:¶žxœ~øð·ÞßíK?È€H`£ZXâÏjü®˜wü´Ä-P›ü¿ ¼þk‡¸ügS.¯€/,wZ~8sûßðuŠ‚ßÿ~A^+àÿõ?in£VÀ“d2Ù+àã `¼ú?VÀ•R4›M¯€k-*„ðûA¢Â˼~|#U^ãÿá#×òúݯG)ÅþýûYú»%>û]ÿˆµv¢ú8çpÎ!¥äw¿„Ë^q³³³cˆ>ñŸøÿ˜Ž@ Àºüv?k'að³˜ðÇ?.×*àQ„R~æ®”"Šü°÷D xE8çh´Z í2ãÀ4¼Ìë÷·Nˆ×G?—¾Ÿø‰Ÿ Ñh°´´ÄÒÒ\p~ôA¾õÚ}!Ò'ºãÍw|t+üË hµZLMMÑívyó›ßLú¡”ß«~oò;Â+@à¹Ì™·¦v?{ »€‡Ñì øO~”kþ>”RH)‘R’eÙdÕ¬€K)QJqÍÃßÇO~”k÷þ€¯ ø³Ê…à.¬Œ0°cÇn»í6´Öt»]:Zk:Îdÿ‡4M'{8çÖ|O·ÛEkÍm·ÝÆŽ;Àœø½R×@ pš9£ € €Ÿåüì&(àgääçÕWóÀ'>qb?`á/x'×\s ছnâœsÎAsŽùùy´ÖÃÀZ‹Öšùùyœs<ôÐC<øàƒìÝ»—W¿úÕlݺ•G}”ߺû·NèRà‚«¯†O|ÂÝzL œÚ @PÀÏb‚~Vð3‹ ÀízØeï'? îÕ§`×®]´Z-.¾øbø‡Èp8ä‘Gá®—xO¿1UUqçËîÁýOǹçúcßö¶·±cÇʲd×®]ðЉ]w,;wî¤×ëao¼Ñ=Þ5@ ¬#Î,¡5(à¡7üìf(àg(ÐfggÙµkýcLþ¿ýñš½x×ï¢ß&Ïs¬µ\yå•ÌÏÏó…]w’ç9ý~ŸÅÅE–——Y^^fqq‘~¿Ožç|a×ÌÏÏså•Wb­%Ïs´Öôû}ÞuÁ»à1“ùc\}çØµk³³³¡ ÀºãÌ2‚~vð3’q=õ éÔë@?©ë “ï½òíog×®]\vÙe´…Xc|¸Ù«¯¦úÛ¿uß0fò:oذ,ËøÀ>Àå—_NUUÜzë­üÍùŸ‚¡@F êàWÔˆÎaµáoÎÿêVÅ–-[Ø¿?wÜq]t6lXs/TÊÿ¯ÿ5É'>áîZÕÖm!¸ì²Ëü~îçøÌü»Ûs$@žy‚~Vð3sòR5àë@5àÏ »víâŠ+®`Ïž=û·L4ûècs÷ ‡âw~çwìßøF’$aÓ¦MÜrË-9rć?¥õû‹PÒ'4²nëƒg¬Ï´/»á†˜™™ášk®áE/zeYbŒ±ïxÇ;Ä%ͦûŽ×¾–ÙÙY–ŽÑ7xஸâ >š2À:BžqÏ&(àg7A?c×€ïܹ“XœÐ<ú´+àÇb\¾ë oà‚°üÓbqqñ˜?ª‚ÙÙY:u˜³eË:Æz½W]uÖZ>šÜŠY( N[leýd¿2þËÔ§ëïùŸ±ÖrÕUWÑëõ0ÆÐétزe 8ž”'ŒNòÚ@ žMθMƒ€g[<3¬®ÿØqjÀ¿ö˜;òt*àÇ»†q øí·ßfÿO‘¾sÜwß}lÙ²…›nºiÍ/wñ›ÞÄÌÌ ÓÓÓ¤‹‹¼õ­ou;wî䦛nÂ9ÇùçŸÏ‘#G¼å%ë~+ rˆÈâ$Õi®¶uhì@ÚA¥-9räGå®»îBÁÅ_Ì[ßúV÷•÷¿Ÿééifffxñ›ÞDópŸ¯ûAß9nºé&Þð†7pß}÷sÿ‚@ <† €Ÿ‘œTMõ:PÀC øÓç©Ô€ŸNB ø©$n|×»øµŸL1ÿ¤WF\øEí¾pyÄ?üã‡ø/îÌ5ß LMMqÑE133Ã-·ÜÂwÜÁC=ħ’Où–ÑõWäp±ó!Pä˽œÆ÷­ Ðb’>Ýjo%ÿdÎ=÷ÜÃŽ;¸æšk˜ššbjjŠ>ðîÿþ+¨‡"ÌíqyÄ…wøë{ðʈÞù!þ‹½|° Í@`qæ íA?ã&ÿ;¯¾úD·^X x ì¼úêIxjŒkÀxàÇýÛ¸üÅ»wsI³éàô*à—4›îÅ»w³sçNZǸöq ø®]»BC>î}eÄ7,.ÈKb‡ä¡×Æ<øª±U _¤À¼Tñ•—Gôz=†Ãá¤ÝÏ?ÿ|fffü¤¾¨'ÿ¦žä€Âárp¹ÿFø3µPø?ÏÌÌpþùçOúÁøw|ååòÒú^¤[¾*æ¡×ƈy‰‚.|óÇî}e4ÀºáÌûdð3†§røéVÀE8ü™ãÉjÀo¿ýv¾ǧ]¿ý†&å Ÿ;Ékœ°ß´Ðˆè C™ nà`à „ùùyî¸ãvîÜI–e>|˜¿èÜèˇëw»ñ>1ªO +ßgë°`“ÿ¾¿èÜÈÛ¿•,Ë8xð ÷Þ{/óóóPKgX‰ù†b`Áa;Xr+@ €SÀ:PÀÏ '[~ºðc]„ðg‚“­?Ý xº¸jÀOñÍ/_(¡%üj¼'@$€€Pà")+Œ1Ü}÷ÝÜ}÷Ý8p€ýû÷#/RˆÍ Bt:ò+ý‡WbÕ@3þoh ¢ ¿7Œ1|ó›ßäƒü [·nõy1˜ž&ê%ˆˆ:ˆh D* Qÿyà°÷u,@NŠ“¨©^£€[k' ø-·ÜÂv݉ÈEQLvý&ßçœã »îä{îióŠW¼b¢€[k' ø{xàIÔîPþôy*5àc|µ ü±}Œ&·ÂÈO\$p„dÍÊœ³€µ ®„&·²Û^{\B ø©ädkÀ«€;ç p´žøÇ€¨7òÔ€r¸ñdßÔ«´®ƒ> pÇWÀC ø©grÈM—#‡°@Oà*?ù§)Ðß* †}ûö±{÷n.¼ðBî»ï>î¼óN>=ú<8‡)KT/Å,Ь-NÝÞ®ŽÖ}$Ù‹qÆ ’â˜Ë.»Œ¿øÅ<ÿùÏçþûï禛n‚ô‘’øy)bèp)ˆ¸îO >P`çÜ™³@ À©üŸÌ9àëAç€?3œÌ9à¯üÉŸät*àŸùà 瀟:î}e„Í øW^!Ï•“p¯Oo‚h¿R]×€Û‡-|F‡F=”o7pˆ®À!¼vå )¨¾UøïSpà\øå yÞóžÇE]ć>ô!þMöj>û]ÿHY–ôû}\Ûaì@³îs@œ´%*Ièt»$IÂËﺂÊÿ‰Ý»wãœãË_þ27,Ü0¹¾ê[Å$˜Euû»¥:LR¡9@ „à„8ÙðgC?¡ü™ãDkÀO·¾úðP~ 8‰pÓЧ_oh¢¥8Ô€ŸJJ…À•µîß­ÿ¾T{ ?y—LŽgݳgŸýìgÙ·o›7oFÁp8¤Óé$ Ãáåj—kX¾o«ÍÀ6`F’öÚô¦¦ˆã˜ååez½Ýn—o¼‘mÛ¶ù0rì€IU÷Ä¥Œw* \‰/](CùG õź>`u xÿ85à«ÿ|:w?Þ5ÀJ øììl¨ŠŒkÀçææŽYþâÇÔ€Ÿî]À[þÒUý`\>77jÀŸÆÍ/_(‘IÄV‰ÈL Ĭ€f]ž®ª‰~å•WrÝu×ñš×¼†Ë.»Œ(ËPQäuî^ê'çÍzÒ7 L=¼^¯.¯QÀ£ˆ(˸ì²ËxÍk^Ãu×]Ç•W^ɾ}û¼^Uˆ ¯|7ëk›ˆL ¶úk—/”á,ˆ' ~eìÔ+”/N¼J¬¼Rºní`äÿZD ªûëÉ¿Z¾Äð—ü%÷Ýw¯{ÝëØ½{7[¶l™œàaŒ!Ë2T–@[Àà¢ú« 4@6"Ò,Ã3)#Û²e »wïæu¯{÷ÝwÉ_úþ3~ƒRþ]´º¿˜\ŸO(¿ö²~.ãÌéU‰— §^¡\üÊ8ôŒ@ §ukœl øéÞüýï¿5à§Ž“­?Ý»€‡ðS?2=Y xu |öð%ñÖ$Ô€Ÿ âÕÂ!ë{Ñ€vi$²!±XÄ÷ '­„£µ™SáwúÏ|P~-÷4¾ÈL’µ2šš\}õÕlÞ¼™~¿ïO|iiœscR’6˜n‰+µ·=Æ{´!n4(Š‚ªªü°` óƒy’$aóæÍ\}õÕÜð‰ÎÉ96·+&€òk9É·g8í¼¢ëç A½Z9+ýf€2‘þ¹+ø~áPõ˜cÁ}2¼O@ 8K8¹ðÓ­€_ÒlºP~ê8™ð;Ï1|ÏiVÀïü^ˆfT¨?Ui$ÒÈɄދp1#•Äô-ÄþWÒúž­Û=Š#ší&¢)ˆ³˜V§ÅŽ;(Š‚}ûöqðàAÌ9%.ŠPJQº( 0“brï—P.õ‘YB’eèªÂjÍÁƒÙ·oÛ·ogÇŽ´:-°§1nèö‡èJOú ›w¸Âùr•ÊU;cqIV(‰tÒ¿ ¬²“  âZá&¯•wK@ œEœx øéÞ<Ô€ŸbN°\/”ÏÞ.àGK¢©$Ô€? âWÆÎ:_‚CîÓ«&<Ç©¯¾^®UÀ|Ó}›¸îºë˜››ãsŸûÜDO’„,Ëf ºm¼”Ômnyœ^ÅDÙË^Æôô4þð‡Wð’5“ûê@IümiP¿\¼J8r±D Iõ™êŒ›à‰Ýõ¤_¿ÄÚ2[ÅZ b…p=ÔÞÊJ|«"‰,$2—¨‘"·Õ|9 í"Ñ™ê5#*[a¬aTޏâϯà—7þ2_úÒ—¸YÞ i€™.@I\iü‰þÃŽmÀO\+üd»0XJò¼Â-jÁÍñͤ“rðàAÞsô=¸Êa¬AHAÒMP‘bynm5¨DqLÖO1Âx•)-´?u&jF!°ÎATŸq˜®~ýû’¸N8LÜ€@ gpp²ç€Ÿn<œ~Š9sÀõág_× %Ѧ$œ~¢“ÃUÀYU´ÅºWÀ«{ ’o¯ >S~¦+àâëçׯ‡ |› Uç4RÀœ%r¥(!÷v‡(B ¬°ƒ5—)Ðä` C3oàtÆr¼ì߸I'AkM^äXc±…?Í孇ߊ;èà\È$.·Øý•u§ä>äý•Ý‚ÛnrüÞÍŽŸ¿¦öדö)èùŸý‹Gþ‚ßûa„ñ§ÇH$RKT¦H: Ñ(šX²ƒ0‚*ªü„>­ (pÖ!…D¸:(\òå ‰‹ÑBôÄYç%S—¥Ö!Þ(œß§Ü_‡0 ÀSüܶ^/ì’zÍè›ãðX°ã‹^£~ðòW8Ô®óE=ÇðKßùKD‘Ï3Æ ø'/ú4B)¯€Ï?uüÕ{^ÅìììD×Zóÿé?"÷*Ô•u x*ØqG}}WF¸Ê¡¾3â,¸'œpR¨ïŽœØ!‘çH¿ÓúÈù@ªW£•‰CW¨> IDATàt„«®ºŠ}ûöqàÀ„üÕì­“!‡Ã!ËGæpûjüaVð.0+I7¬UÀhÿëpαuëV¶mÛÆm·ÝÆŸ/ýùŠ=POܢ͉7À ãð½÷ Åüƒ>+Ûÿdp+,ÖX”Sˆ²VÀ·øz±±îÉ'+ïSÀ{->ûßàK_úùÈGøÈ9GF~e¿ª*tQ`— Ühµõ¤ ºêq øë÷þ¯ýë'{z¼ü¿½œÁâ€*¯Ö*àÆ÷Áä’ºü¨7MÔA-.qaÖ(àVÙÇ)à°êµZç ¸ø7uÛÆøÉz=á' ý¤^(‰³»T¨nê7]Ý_BQ£VþùÿD"ˆãQ€(}¨JED„--Ŷ‚´‘b¥4%Zh¬]´‰e˜QD­*ŠÈ^ðã¿­¯·á_ç»n†/9Ç›þ•€Í\ÐÅY‹ŒpG ®³6À•R¹ˆD%H!)Fé¾™H4“HÁ%—BU•¸²6“@3ÚûM,K³ BIÌRÆ!»1BJ¿Ym ÝJ Pâ î£! @ pâ¬[àDkÀí¹¾žóÙPÀí¹å¢Pþ48®þ5àúp±îp}¸$>§vxŸ <(àœœ~”S䮤š/Ö½^þ¯œhCBv 9#pñúz§þ¨nÛˆ"–~Â+E”ËCÈ5"U4¶mð&†ÖèÁŒ7ä¢@t¤?¥%ÆÛ\á¼%€#i&Äi £ajŸ¢ÒÕ¹•ް+cAU‡) àz[–H¥hî˜&ß<Ä>šÓØ×À,Œ6Üé4/‚·üŽ\ï'ÿ¶,q•ƒ…Uï”±ï7VX4[ZâGbT¤Ð‘ÆEÕP¨TQ©ŠR—~O™bUYYÃ_›hHÿÜÛg.ר^“xs†‚|i;*A ’N£5XWŸZãp±&b·pãðÈ}$„@ žäóÜz½0ueä•ÒÕ5à‹~eML h ôb­€×+Š¿ñâßàÚk¯àúë¯'˲5 ¸. ìÁZ—[ß,‰;Í5 xžç¼÷½ïàæ›oæÝw¾{eÅÎ@ÔK`àps±Q¬\kŤÜ|Q‡f<^¯£ðâi% b³@lЫ5bí¨î-&h5ðÕ ø__ý×¼ð…/ä[ßú7ß|3hý9J)”RH)½ 0¿ˆ;¢×@Snîùß/ýRµ1†7 ~„k¯½–ç=ïy|ãßà?ñƒWÀmýâ)"ÞZXt¸y‹;ä å˜(àx|²ú{Ö*àtD)Ð¥Æ ©¿_â8AiéïËbbœv<ëfô6÷ÐZ3ÈØÈOs8åp{Ö*à,¹Ç)à¸í&ÇmàðXbEÿì#q‘xœÞÊZDQÄâ¡Eò%_šÐ©:þ¨:VpYªª« r’(‰p‰£\*k.w=ü0׿=CDfã5>ÐõÄ=a¥äCAühL<ã"·bAé 종D ¤„¦ÀI?ÈTb´/ME:LE9T1“´š(¥&6›”’ÅÃG¼`q¯éûxQbµóG×Vø“ltýükÂýU@ <žõ» à“Ô€ë…õ³ ¸^(‰zI¨?Öäá©î.rQb;kkÀ×û.à=\-JlûÌÜüdp·Tá”@mMÑÆÂ~ÀYáÐýrE¯|ÿЪBd¾¬B¤‚ª¨PB1Å”WÀ“‚Q1Â:ëWdí*ÜçXöðxc µ¥VÀukð«v îº>p˱púwžó w”’HDº 2.qtË®WÀcNô\Wõµ„ÔS¢±!Kг T2QÀE7F¦ÇPÀc??T׃ŸB\ü[áâúV)@ú>.‰ˆ2Š°Æ 9BÂÔv?î !ˆc_3 |¨[—c9B FÅÕˆ¡ô“ñ81•·+dC¡14LBÙª0‹šœ²)‰Z1"[Xli Ü”[—õªI°qpÔP©Q–€þKÕù·ó%&²ßç…ø};ÈqGýJ;Ô•³2Áv ¶c1MƒH.òíl‡þ« ‰©”!j)lapR¢R…1Æ[ Éhy„H%®t!PÊëBÖZZ­¶lö“~çX ލ“ Jät Ja­%n5Ñ} +‰“¶[­‘@2“±|p뱋¨dåû½v~®/“ j.xåÈFD)5#]ú×¢ªpç9ÈAðÆí:ì(à÷¾WðËŸr¸ó;ÒGc:!±v¤yà3øp0ñ㊊”Íëp,–‘1´g¦°ÖGÚ*Š.-!+‰¼I·š~¼R ·AbæJ¢©70˜fI£Ñ˜'EQ05å¯( Z­–>û}¢8fºî‹óóèþȇIÍ 0Þ®sß×mèÅàþ[@ À35qx&ðG@=¬(/ÕÏ ¼º¯ ¹8#ýjð €<(àëZ—?9WY?K@ID"±Â,ûR+ÙIhoŸA)E’$kV¡{SSDQ„1†V«E¯×cyy™ªª&aÙâüÔl6};ˆñ ¹ïëãkèt:èº/ ô&2þõnÅTʤP ¨$”>T.—KFŸ] úî6q3 }0(üä¿ÑkÐéù=_–AÔ!@éÃÊF«IUV”Ÿ_‚$ÄM‰„ȶe¿$nÅ ÁD§ ÕjeNÇJáœceÖ-@9’$a0LBQ¿6h)ܼÆHAÚh0QJ¡µ&Š"ºÝîIJh4“`aa,ËȲŒM›6177‡RŠxû ÆFKËØ¡F6#„’è?ÈÃä?œÀ¤0(àA xPÀƒ~Æ(à«'‚Ž’GÙø›Û]£Ñ˜ŸZUƚͦŸ¬Bz½ÖZò<§ßïc­eii ¥£~[˜zrvXÑ=o3yž³aƉä3ü*µZé›eYÒn· t:–¬¥Ýê`”ÆZÇ”˜b¾š§–4Z UøöJU¢¿Ð‡—´quR‚´:v^¼€¯ßóuFý!ë°º(¨âØÿl’f‚É|h+•$%e4ÅSí)LbÉd•EÈÚ„‡aËËË+Oè1ÏqüÜ{½óóót·mbéáCˆTùýa èß'Î2–––èõz,--Ñn·'fÈ`0 Š"¢(Â9·&„™šššüyé×MÚØP†O>@ „àI&„OA·J35»yn­EçnÙB[éŒbc‰ZH@ …UÑY«€—Ë%º§I©?*pä& ¸x@`·Ûc*à.rˆƒ»Ýà2ç'%Ö"f£V>™þä‚¿ûü¹œ÷ðزômià Å)óH&ÞjúÿН ÜN‡‚qšÅŤòOeqq3𛾢â^]?ù'v¾]´ó›º,@4‘6Sòá9dGeI’ µžXO““gðû¼F.B =yÞqmš4›M†Ã!½©)æ–öûÒ¹ìÐ`⒴ݦª*ʲDAY–H)I’„G~ö¾0é@ ðô€ €<(àA xPÀŸˆqŸOL‹¢ MSò‘—(¢£p…¡1»aò>¦)RÊÉDÙ¿6b@ %‰ê{ÃC£Ñ`iii”$í¹]Æ-;2™¡Sk8ÌÀ@Û[XJÖ;Ï*çï[ñ×côywÔ1t}Fý¡ïós7ç-á¿§£ýÏ(71¾ŒòÇÓÒÕP4ÒY”‘ÛZþ𬵓עÛíNB‘(M©´Áï=µrÿh­'aÚx3ÍÆ¦)Fûç …[öAtYø÷…ñûéø=v<Î@ <¥ (à<(àA'(àArü™{Åöß¿Ð'ÿÝn×ß« ‹ØÅ ÑV~õ¼'9Hm‚ïqŸú½P¤€ €‰õ0“‹¢ Š"âV“‘YF,—DD$iâïY+1ª>çuðÆõkn!ÙŸPLù-QùÁõ}ø™ìO°-ë¿7f¥¤¬N'¥•XmIÚ EURv,–·_´Ö¤iJš¦“Éý8tþ9"}ÇÎ(Š&æ×øïG ö¶ò¡´€æÆ“{&Š"ü™{Ãê “‚ð €üD 8A_EY–”eI³Ù¤Ýnshß>¼QäÇDWÒ]¤”“ ÿø9ƒ‘•dÀïï"ÆarÝŸ»B>>ÏEŠA8®oöP©¿Iê÷ÁñÜ_ ZQ“ü°·ž¢*"i%,ÄK¨¨11Æý9MSªªò_eIÇ`­nÙJSïbãþ-¥$í¶)Ž.ùN€«,Ã¥%6oÛæïåÑhrTh ÀIA xPÀƒþT xPÀ¿ó±å·Ïwc“e8âFÑPˆHà„oï8Ž'“Öñ¤ßÕã¼1!½ýá7–dˆêç—$~ƒÙqHbŒ™ô¨Ó$OJLßÄ •©¨+\æMŒêø„*Ï©XÑÞÞF4üÚ4zŸöOR¼‘ÿÊïÏRå>èJâò©’(õ ÂøZÆVËØÜªªÊOþÇckâ°X„¬Ÿ³{-´Ö4 ÿ¾ù“uh(ÜÈ0L† ‡C¦¦|@{ð «ÿ@ N> xPÀEPÀƒþd<(àÝn—ÑhÄÂÜ6ד0Çæ†lSÏ£u˜Ó­CÝ(ŠVÆ}@&ŠI¥*pk-Fƒ<ω¢ˆV«5±œsäy>¹gªÈa;;°ˆÀƒP`¥­­¼9çü‘±Î2OÑÞÔ ¿™Ãîp½'l½™lìKßœ±ÈJa ƒø1Õv,Uäûêê½ZÆûµ(¥ ŒÇÉq,•$v1:±“ç½úµh6›ÌÏÏOìŽlªC~xùÐÒæš…Úêév» Ÿ_@ <• (àA?‚NPÀWð €ß÷Ó_½_ßâª<‡Â"2åYÜ$Ü(K_Ö4žôdzñóE¬´Xm‘"š¬Ž+¥‡ìûø·|ÉV6]z.Ífst:!—”¾Äj‘Éæ®$uTjŒ´Ó6/<ï|cîÒ‡|ÿ‰êï­÷M¡SX®Cò¤þ]õó°ÖÒlú`sïí{ü÷õaê•['ýAÔ'ÏXcüõÕ?;6Æá‚F£1 w£(òï—±ôyVn¨òœååeö¾}OXý@ ðÔ€ €ü©ð €<(à“± דw[Òi‚ù¥½`ÓoëÆG®¹÷k¬²~ÓÒñj½µ$I‘ÿg¯?Õ$õmxøŽGüD»‚ÎËýF´ÚiDS ´ÂX#P…Â(³òžRú` »<ƒ G‹þï3ÿw£/ù˜È?6”©/ÕVˆ¦@;MDŒsŽåÏf9öÁ¢þ¹>u€™ï?gR¾åŒ¬²¬~“[=Œ_“ñXÝûõ-.êPÌ-#¤ˆM®ÃÎÿ@ ž~p,‚ð'#(àA‡ €†ï™âMʉHúÐÄøIí⯫Ã"€véDû—ùN4ýÞ*ãPäÈÇ÷NB8ú~RŽö“l¦`ðÏG‰§bâ-1#iq•ƒ ’2! #9ò!€ð?çÎu”£’…áøáŸ…áå¨Äë{ ü-¯Œ¢a”®¤LJlåÛ4•T{ûT •+X FõµZ8òñ½t¾ÇÎ8hÊÉQ²J)ò<_3&®¶«õ h½{£Ã9„ò¦³Žá{æÂê g>8A'(à« xPÀƒp œ[j²™ƒß8zÌk¼÷ÿüŠ8÷}ÏwFëµÿ(ð%`Ö²üë‡ýÏ¿JMm’Ñðý êD4¦$ÝÙ”¤ç§ fK*káÓ•)ÚI›¾îc´Ámòãƒhæò9æççý}¸ä°s~Ìq3qØ[ í¤íûBòåMb)i% Iº%¥l”ŒæFèXûPbüTÆ¡ãËÿx˜ôú®Ã¹•·qøQ·ý×~ìËÇmËÁowmpù‘E„”ÈH`Âç–@ §3XMPÀƒð €OÆ‚ €ŸÕ ¸ùc-ä¿‹\Ôm0úÍù'í›ãàRüæ”›LŽ¥ã(Þ»$Vƒ¸º]b 2‘¤”4K±Æ2XPº-¥0/5K 0\¹÷qøiöˆõ/øÿŽÀÍ:t¬Y`Áÿ]7]6ÉHÈdæw×z«¤´þq⺬*e+Þ»$ÄOJ‡¾×ïcúwâî{Ò×uô›ó"þ…–3ƒóÇ:¬þ@ xö€ €‚ð €¼qþ³}R?3.7‹Þ’8 ˜?}Ì$÷óþÇd¥=i%Ä*¦**FåˆÒ•Õï%íÛ°¨ÇïˆÚè ©ƒ% [Ùt–n>L9 êßUC - MÐt®ÑBÓHÄ*ÆÄ†|˜ûïwõ5|ž5ÏÁ}Ð õ–Èû=wŽòèÉl¿;ÿ@ Ï~A xPÀƒ^Ï߃^Ï‚ øS@ÿQyü>]gº²’ˆRà*G1*0xË ¿ø!ØlžžæÿxÙœ¿ÿ[øqc .ûŽË¹ãn§qN‘ùûÎå†Ñ£#.ÿîËùÒÝwà†@» õï®Í¬o(Mé÷…Aá*‡*ý­±pœgažèù@ q*½APY¯€ƒª¯üÏ ü$pµ~àÐ:°F§ª¿·ª¯h $Ã*°•ÅJKœJôÞ>ƒ>ê'ŽKõ5-Ô׸JŸº½ÞJ üì9™n¯¬¯VÀ›L>ø?V·X¥WÀ£OkYR¼nj¼ö§å´DtýïVÀQ¬(à‘WÀGùýªhn‡–r©VÀ—W)àÃz’X+àéõ]WÎõ2+ÀÒâ"³Û¶MVÂÇj\HÎÎUà—øcÀd,MA4!k=w¢€ÿÅqð.^o­RÀ·KßåðÐZ¥€7…ÌXÙÀø‰Ba ‹^и¡ó«Òb¥íÏàäÿRåäýhµ¢dëîW)àoúL›íý>/›žæŽ¹9î5 øÖs¶oðtVóö ½µÃâò"bœ:x|Þø¾`ë0 .'š(à¢í1ö?†Ø¯„à”çHÄ´@t®ôo€êÞÚHêû´oùp}ë[ëºø«_ÌPû ®íVôf›BÅ1ú@ºŠm³[yôŸ÷¢R…ɼ *ˆwúý^è DâßCÜœÃíµ!@ pöòßENµÒ“:·xãonw‹G¢ÆÄ€±k7{)]OšLðF§A£ÝÀ*Knó5 8Úøó «€7êIzQOáq ¸ß°þ·±)0†È1QÀ¥‘Œú#FË£|Xk6ó ¸DU@/¢·q#'³ØX?«7»§…hlfý~ «p VÀáù[k| ¢^„K¼¾aÓòþˆîkð¥–ÈÚ æÏ#Ï­ðE½²±ßxõ•>^}–Z"s‰9¿_ÄÃäÿ”LwEn\NúîrE—õ~(”àí¸°Î¾ < Üö¾‹xàÝ,%ÝÙZß¿„M,\|!ýG–8|ððDçÞ¾cûþyŸ/áÉëñA¯Lü© ú¿ à¸ÜÜ&€§¤ý¿;rb‡Dž#ýªûÈA^_/!‚Ÿù««êùýQÕ=3¹d2Óóy¿^óʤ§»ªºß]UÏóù|žçN è :æÁÏ•'CwG‹ÿ\Y¸ð§zØ¥éëëÃÎÚÄCqúzzéëé%Šcgmúúú@iô°Í~-ûùÛ+O"W»zƒ}w‚×éáõ{¸»J:ÿ»1ZQ¨™$$ üþÖqÑ‘*—Jv>óýSá¹@×,üŽáš_÷3‰®ÇÀšÖ Tª6Ö¼ø:ݽݘ³cèé!ÈkÚ—·‡ý†yò·`ÖqQÂïU&þ±©ˆèßmï©DÐùÏk8§ÁËÿ—|0 “I à¼Ã'?a•§!aÛ¤ý.ZM¢>Áüùó™?>‰úí+Þ€Õ~žxÁ5ƒ~ç_û/OöYÞo^£mÿ˜*Ïv uØçf†À{ÙE¯õ˜ó@‰¶GJ#KóK†fú3tÿ½,°š-fáÇr»ð‡ è!Mæ ™72~ð¦¨ý×FM¬Y¬f ,èþ{7™þÌÈD“øÛo{¤ÄœJèµÞË~…À>7Û,xÔQ‚ ‚ H`×w‚õÔÝ eïà—禂»å—€¯ JÀgŸ¼ÞE' ݘF›Ú/o狼½“b±R® {=^z!(¯3ý¬²l;üd+Ç!IßÝϨuÀUBùå×c±Ëã¿7+¯Å/Ï2R®j#„aÖ™˜u&!Bþc3“Æ/oj¿ÜUöÏšòøoRþ±„ýc“ð݈*:§ýrkÛ_«]ú%àUþÿ f³ &cKÀEåðŽ®Ž±%àE*%à˜Á6Røå+fÈß§.ág¡‡4:§Q‘ຠì ÀYW]ÅŸùçvmO9¼êuP•Õ ‚¡bd¨LòúÐõ63“I:{>­ Î$¢]v5ÑhêLÿÜîv™ÞÔ„Y zû‰`[£·mPÙoÛSçvÿ}æCœuÕUD“ ‚ ØÅ¼©Uœö[„剼4#Ù9~qR–°º¯6  8ûFMÃÌixqŽŽ¤££/îÑ0s‰éþR€!ÛÍÓšQy5f·J¶)˜ÀœFÕ(ra·¶6\;ºù—‡à{÷Ã÷ï„wû&“4ãlìeYijfQ—¨cÞ¼yÌ›7ºD3fÍ­ýÿ.—öåob8ÉX³dnpªìüc ©‘å…ÝC0Ü[í¡;Î%à2|üYêé»îbÅŠ”ôfqÖð¨sÔdä\ÌëÀßúúhÇÎÊ¥+IGÓœtâIœtâI¤£iV.] D“qö·¯ŽçG®9•àìk%­Y±bOßuk¤DA„ Nh²my 8ñ‘1à@eìí¿üqû³€¿jÛ̘5 {pˆºy£fŸåÏN(¸´w½‰á$k“d†3¸®;vÎrP"rº2s¼°›=¼¼xÉÿì¿~4`h”€Çêbtwusí)þ,à£KÀUÇ&†m¯Ê,àÃÁ,à›Ú×´CÉ/ÏëüH8™éAí  ¤Ñ‘àØ¤ÿ·Û(ç^uGy$‹ÅcËÀ7 ie»%à{á…-KÀ¼“Ç4,Ü ½íËÖûÁ¥tÐù·‚ó¾ÜÁÜ@e¿óžrô Ÿû§Ÿ~:Oµ=ÅÍ—_.¢v#¯ƒbÉ’-«¬Lüi›=æùú~p–‰öükwzí^žxô z{{+Ãwò†yåWF:û&#A=ìûë"°bÉ’1CAA&*“k€ŒÏp¾ØÎðñ.—1àãÏöÆ€fÜJÀGg€e øž lÑÙ.gýõˆ¯rÇÍŸ#eøÃu¨÷êYûâZÖ¾¸–z¯Þ.Z`¤ <<ÙW‚m”¿Oš±ÕÛ;AA ì"¶1|ÜKÀe øø³½1àã\.cÀ÷Hüg›cÀËÙÞ1ÁÝU¾YPÆ€O/‡¢2HÙ›i›~ÀÎ…X}  U^'*®Pqåÿ^$±ú”_ÑÁkG~‡FíGAa’2¹òÕÛã^^Þ/yÐø“ê~-cÀw#åñÕ¯Á{ÙE…mOù½¾7ÐÌø”€w@Û*ù‰µG†Ð%yHÈŸ¼,ªv k@wÝ¥,Z´åp¶ ìÒðÁ-å1à+–,‘1à{Šr…NpÞ'u’|)k¹Q¨Ìhjauï0zX“nM3ØíOæ—žžf°oe)f4µ°jÅ :¢p•‹i›$u’ Û6#+Ï‚ ‚ LB&WÀvÖ÷pY|ÜÙî:à&ãWnÊ:à{Š×A­X²„âæ(gfÇ£|³.¾ŒŸ”tŸŒÊPoÔûçkF£“ðÚc+ÐCñ¹)Ü’‹òÊS¸%—øÜzÈóŸ“ô_ƒ õF=•ñîI@A ŒÛ>Î%à2|üÙîð=T.cÀ÷L`‹Îv9@W`÷•€¨wx<Âøòªù?ÝÉnÐ,%ÁQµ •6hnj"Ó“!™J’L%ÉôdhnjB¥ ŒZŽò_£ƒmÛ«^ׂ ‚ H`|ØÞðîQ´m”€gaËðzÈ›yLÀAA$°ûÙî:àã\.ë€?Û]¼œÞÝ%à[ÉË:à€Í2À™ð.,g$<ÈâòÊA Ýk»±uÐk—PhC“ÏæÉgóhC£ /GeV[Ût¯õ+*Á¥|°AA ŒÛ^nœÃî/W2|O±Í1àåFz‘ÝW^d«`>AØ,ÜØ%à‰nÉOÖ£È7ŠRpý.1P!E¤&†?LË(„"!B‘FÁðÏ\Ã#RA…”_2z… ó¿^ÎqAA$0nlw ¸h»»|³}Èð=Ø¢³=:Þ %àa¶™–1à„­d€qyÛ%à•ªÉO A&Ôà¯ä‘×v©O×ûß~lpœAÇ~¿9¨O×ãÚ®ÿ¼t°H°M‰î ‚ ‚ €ñe»cÀËôÝ]¾• °ŒŸ ŒÊg"»°<’‘ ðd``;ú6JÀ£¶d€'#%F†nyÏ8ÐíÏ·û¿'ÀK{~P/üžðŸ×þ|;ô¯ ÛpFmWAAãÇvÇ€—3À6»¯Üf«`>AØ,Üß%àñnÉO&¶‘ö<–Ö––€·´¶àyžd€'+Q \«ëëëýõ_c@-0­ÓZ±,ËŽ –eÑ:­Õ^mðÜàµå{Êp°mAA Œ/Û#ÙYc7”€›íc2|‚°µ pᔀ ðdcG`Øv 8’® ôÈw ïµ>°Àª·ˆÕÅ 6¼¼Á?¯à' `¦ßù@D‚Ç ¾s»Ó†TðÚ~¨C®û‚ ‚ H`b²y8òJÀGmC2À“„Èo³\2ÀÕs ðÔ&ç;›Ù<Ó :ü étš˜óݺ³b¤Óiˆω€i™Ìlžé{ÏÉÇ)‚ BõP}šh¦Ag.Èâ1?ÖᕳÂÞÈ»×@­AHÄË{~xÄ :]@t'mhZ€éAã= ÖL 3l’ÌCXq ;ç ¨üÞ ±t ·äb·sÄn`°VÜOBÓŒÀ³‚s7Ál0q‡\?¸`€Ycâöº~G1ï °! xQÜO*ZÑ´úç~¹ 9ͯöbÀïøW–x-ÿ^;ê9å bØlÿ‚ ‚ TÕW° °—óðœ(w<¼œ'àÉŒd€ÉOm6 Èw¸`ÈôBL%}·…à÷àq+nùAŸšàµ9éü ‚ ‚P]TgÃfGà C^ÄOE¯Æƒ¤d€«ÉOm$,Tƒ¥0Ð $ýkzŒù<±Úyòþ½"4àýƒëÆKâ^A„êÁ¨Êwµ£ p<3(ñ7‚ߣH¸š ðÔF2ÀBy¢Ç~€'4A²6éÿ½< ÁcMÁsLF&ÍËÇ(‚ BuQ½ [ÉOm$,HX8M­'fÌ$Ù$³.ãßð¯ýÉ9I2½ܼë<üëÄ3â^A„ê¨Úw&à©d€É … 3ŸôÜA—Á—q‹®¿Ô_ ÜbðØ [yRõ%‚ ‚&E¿ßþJ;n‡ QH¦“†¾U}äûó•@¾?Oߪ>ω‚ÛáÒþJ»ß (ÊeRøÅö;ô}Ï÷AHƒsý`O"ø= dƒçÔ¯)¿^˜œ¬FQ :óÁRfÎÄ´LâGÛ÷lçmLËÄÌ™•% )çýj þLj^D1€_ÑS«Åò½µ`„ Œ°á¯ þV ž;€T} ‚ ‚ €I…d€É ’òA‡~ìAJާñ\ÏõHÇÓP þ6$,HX °°E~¸|^›ŒLZþÖšºÀyÙ°¾ ýHÅ ‚ UQõïP2À‚d€É ülõG:ÿ‚ ‚ L¦FƒG2À‚d€ °à³ºüq7Ä» ‚ ScJ¼KÉ ’@2À‚Ï£¾ÒùAa 1u>’@2À‚d€AA LÎ_-þ²_z³ ÂÏüH'°êÙ½Õ€,ý5µ˜¬Ò.ÞAA To@2À‚d€AAAÀ@2ÀHXAA L $,‚ ‚ ‚ S„™èJXAAAAAAAAAAAAAAAAAAA„݇Z¤´Z¤d@ñ/ˆAü â_AªcÊÞüSþ2€fð» þñ/ˆAü ‚ B5ß§ä›>^iâ`Õ[Ø}6ä@ÿQ+ùJˆAü â_ÿ‚ ‚PL¹ u¢Ò$aþ!ó± 6vÁfþ!ó!üMÿ‚øÄ¿ þ…ªåÓ?HŸyÒ¾â\ü â_Uó?YiUÌÝ.½ƒ½  ½ƒ½ÌÝ.*ªP'K#@ü â_ÿ‚øª‘s>²¿nnnfÖ¬Y|þŒ#ĹøÄ¿ªöæ¿È¿ùGëcôeú* ¸0T¢/ÓG´>æ7db ñ/ˆAü â_¨ ÿ£ÿ3gΤ¥¥… P__Ï'î#ÎÅ¿0E:ÿâ ÔG•&*nàÅ\ŠF eþ»7@E£„sQq"Ákñ/ˆAü UíÿÌî}9qít¼û<¥—È\Õèàì¿KÏ;—Ù³gÓÐÐ@*•¢­­ºº:>ñþ69çÅ¿Pňÿ) *¦¨iJQ|¡ˆ/`˜&Ä8¦‰/P|¡HMS S’“Eü â_ÿBµúÿí‡.ã{éS,ÉçóòYU±ÿóN=Tg³Y–/_Žëº$“I ௯Oü‹ñ_åˆÿ)Pó£ZkìœMݱӨ©Mc÷÷… ÷…±{ ÔÔ¦©;vvÎFkíg>&Y ñ/ˆAü Õäÿº9ŸæÁÿp8Œçy<úèr8÷‹ó*õ?cÆ f̘ÁÚµ‰F£D"ñ/þÅÿAüoåü¨ú7xšÒ$f2Dd0LÎÍ® £´Âî±°¦Yh¥¹ðç6¿ød‚bº„›q «ÑwK9 øÄ¿ þ…jñû»¿D"‘ X,ÒÓÓC4¥§§‡®®.º»»¹åþåâ½ ý_µ×)D£QjkkÅ¿øÿS„¯ž¼ž;w.¶m‹ÿQTu¡£ú„ÒDÁˆ™˜Ñ0ÑúQ ”³ÉróŸç…4±hœC°ù×Û³¼ÜqAÏuPŸPZß'@ñ/ˆ¡Úü?üáï‡éìì¤÷ßzùN¡@{{;×Üò¸RŸTZüWŸÿëg|ÏóÐZ“J¥¨¯¯§³³“h4Jcc#¥RI>¼*õ_WWG$ÿS}·VÿòÉ÷é¹õs©i«! ‰ÿ)Æ¿|òh=cÆ "‘‰DBüO•À20Â&Ê0pÑx%‡¢]Äs5X~»Îs5¿üñç]V‡a…( …žåAÄ“3Hü â_¨"ÿ¿9ä«D"þÌPžç1sÎ Ã```€††Î8qý›Û_“Žú‡Ã†±}ÿ‹ÿjóQÇíÜ2ÿñ?…¨­­%‰P(ˆF£$“Iñ/þÅ?U<€:%˜ù7b@Ø×%›ÉPÈä°‹x½lÒ°IsÓÏK„€‹ÐO6“×…°á¿6lKÿ‚ø&µÿïXæ–‰D°, ÇqÈ ÑØØH4%‹FåC¬RÿÅbQü‹ñ?¸ôÜcu:¦¯¯®®.†††Ä¿øÿÕ[`€RxÏvp< ®FY K`D ¾rŸËtàc籬k(TÈÁ f IDAT­RÚ, øÄ¿0™ý]OO¡Ã0H¥Rh­) X–…çytuuQ,hmmåŒ ’ÿâ_ü “”D"R ¥¶mÓÓ#þÅ¿ø¯þ@tL£ šh6Bn0EÀR ¢ oÈã0 8û÷ÜqX'¸þ бt„¼™G»þ¶ñ/TŸÿ…7_gšÜ20ÀòåËyáÙ‡Ãüußœø¯"ÿÜ0çrÏ‘J¥°,‹|>çy¸®‹mÛ ”ý¿àûŸ?>555ò9ŠAü “”X,ÆÊ•+éêê"—ˉñ/þ§DÀ² ßÔäœ$üǼ'<ŒE„áÊ?hj¿wÚ‰÷ã ÈAîÍœÿéÌRþ¶ñ/TÿÅÇšš2™ Žã°qãF}ô Vlð˜Uÿh4²÷Þ‡ðÙ'Åÿ$÷ÿZæñçç^¢}¦G{hmmE)E4ݦÃ0Ø{ï½åsÿ‚ø&!×ýÛ¹º\òýÜsëÅ¿øÿ›Q•s¨(ªjVPÁ1üî¹á†Ûat§æ»G)6ÿñAEØsà 7ðÇïþ†‚íÌR¨’3QqÀâ_¨ÿ—µ}¨2 ¬RŠ\.ÇúõëØ¿Íd¿ýšikkcÆŒ\9k‘øŸäþ<ð@öß¿‰†46Äb±öÿ¯D¼‹Aü “Œòroâ_ü‹ÿ­S6þ ß!Àæpü·Ž‡Ä[âüç6§}Pñ*@ÂÑ0Ü{äýÿÓ„G4à*°å: þ…Éîÿ¼‡rÈ!‡0mÚ´Êlཽ½455ñÁƒeY¤Ói¦OŸŽa8Žƒ¾V+uŒ&£ÿ%§~Ïó‡ÃÔ×?C,cÖ¬YoÉ¿ þñ/L²¯m3wî\ñ/þÅÿT ¨Ã•&*D8‘0j–I8Å.ø×Ÿdyo,ÆâGòÔ?šeQ ÑÅŠF) hÛE0A  þ¶õRYZü “ÑÿuÓÏ!‹1{ölêëë+³Ávuu1{ölÒé4ét×uÉår ²Ù,úq­Äÿäó‡q‡ÖÖV,ËzÛþñ/ˆarpýUŸÕ–e‰ñ/þ·w½¬º7´Piê@µ(TÂĈ†±‚eb±ç^ºšð‡ˆ­n¸~\×Åqòù<…B;ŸÇ+”ÐY½IC?è§¥PmþCú%íííôôôPWWÇgÛ%þ«Ðÿƒï¹×uI¥R˜¦ @¡Pã¿<>¬X,288Ⱥuë¸âÇ÷)µPiñ?yüÿæÈ¯‘N§ñ<˲*ëÿ¾]ÿòéŠAü “£8}útñ/þÅÿv¨¾! ØŒÆh ¢>–eqõ¥«™©9­Y\öƒkîqÅei¾váËüæçbžç¡”Âs]J€×éø3Ë% ªüŸ²ìnR©™L€ÆÆFŠÅ"¿o¼ Û¶9é™ïŠÿ*ñÏ».¨‚´Ö˜¦¹Uÿ¡PÛ¶)•JÄãñÊz±ÒùŸ\þÃá0–eaÛvåfÿNü â_ÿÂÄæŠ/ž¬MÓÿâ_üï€ê›0Ô€J+–… Æqüð+oð¥ŸÍR­ùðW|ã\…‘ˆrÉWâ ü˃\ðêþpè7ùÝÁßàŒ¯¼Áeß|eþ6Ò j‚m Uã?“J¥˜1c---ÔÖÖR__Occ#‘HDüW‘˲ˆÇãD",Ë"‰ìÐ"‘  ‹Å¸ü“d€Iæ?•J‡+@ñ/þÅ¿øÿÕÖšd2)þÅ¿øßUU ŽVš0þØßÂÓšÒÀ¿¸ÎaðÕo¬çk_0ÐCy̆8‘h”޾eQWWøå —¼ô_̹ñ"œJ@HATCÁ߇þ«d'»ÿÁoÿ­5®ëÇÇø…Bh­ùáß䤥ßÿUà¿þë‰Åb„ÃaÂá0‘Hd‡þËw§2LüOÿ¡P˲ˆF£•ñïÔ¿ þñ/L\\×Å0 ñ/þÅÿT  àóÿ­Ùøò…ŠÒ`†‡ÿŸK ðþ+êýq ž‡mÛ•% <ÏóLjÔÖ3-a §Çq0ãQÜ¥Á ˜ b †µ”W‰ÿXM žmSÈç·êßu]\×ÿUâ?™LV¢¿ÑX òvÊ¿ëºôôôTö!LÿÀ˜ñ»Ä¿ þñ/LXJ¥†aˆñ/þw@u ð ì ,¹ÞCá/étšd2‰eY$ ’É$J)Âá0Jk0L Ë"•J`E"„ê“`¨à0ý}“ß¿aY˜ñø6ý‡B!J¥’ø¯ÿåȯiúžwÖùgxx¸²arøÏf³•›ù.ó/ˆAü –l6K±Xÿâ_üï€êª0á'Q~¯™ÜrÓÀ ?h%LäL&±mÛ¶ý/E4Šç8”ûplÃ4±m›xŽ{âòÊ8X"AÎÆÃõ³À9ÁªÁÿ¬kOàÍ‹A…B(×ã¿¿¿Û¶9Ó-â¿Jüù?_æoÇÿ­5¥BpZƒ2¶ë¿T*áº.Zû3J«)MN>æIã¿ýWÜþ<‰D‚R©„çyïÈ¿ þñ/Llÿw5®ä7ýk¸1v.ápXüOÁÀàà`% þ§JÀÀ£ëv\LÓä´7?Jss3™î ÷Ï}Ã0ÐZF+/[°ø3„B¡Êœ§®ÿ0Éd’ŽŽîj¾í¸~鯢×M˜²þÝÜ0^±ˆÖÚÔÐȦÕ+¹ëÁ$“INëø¨ø¯"ÿåõ]ÍP¯˜E»îvýwt q`k‰b±èÿ“Îÿÿ,í¥¹9Læñ \zî±ïÌ¿0iü%û̪›%þÅ¿øŸ¢þóù¼øŸ‚äóy†‡‡I§ÓâJ~vÉ_±á“=§qÊé§`š&›6mbèC†ÁñËßÇáÇNKK ®ëº7ÄuüÜߦF&«"ÿsn:€§ÝL,•¢4<À÷þc Ǽø¯BÿßþÙï¸ê«§à:Ne¶X`›þï½÷^b¶Í’¶M0,þ§ªÿþ~:üë´:`VTçŽË±ª;Åéâ_ü‹ñ/þ§ ›6åÈåÄÿÎÆÌªýp°vö•â¿Êýÿß ÂÀÀär9ÇñÇ{e³ÛôïÕ,þ§¸ÿbQ>ßÉâ?‘ˆm>Jü‹ñ/þÅÿCüWY`èyÁl;Ä\hkkãÉ'ŸÄqjjjH¥R8ŽC*•ªŒéˆD"þáp­õ˜çÔÔÔà8O>ù$mmmà²Ó3€¿¥ãÄ¿0®þ{ârúûû ›ÍR(èêêÿSÄooï[ö¿lõ°Ú-Ç+ìòÏóé•Jü‹ñ/þ÷„ÿò1‹¹=ÃDð?YM†“Á¢E¬Y²dç^àÁeû\Æ©§žJGG‹/fÖ¬Y(¥ÐZÓßßã8•IþÀ_+ÒqúûûÑZ³nÝ:Ö®]Ë›o¾ÉÉ'ŸLss3íííü`ùvê"ÀÜE‹`Éýº ‹aÂù?ååŸàº.þ-”Rtww‹ÿ êÿ-}†;á¿··Ó4+Ëí¤ýýï_‰ÿ îøæ7¿©Å¿øÿâOøï{މà_»€¹ žu---¼ùàƒ w"¨Ö .$‘H°ß~û‹ÅøÙÏ~F.—cÆ áÒKY¸p!‡~8I¥Ædݲh¥‡Ö+]·•SuuuD£Qn¼ñFŽ8âJ¥÷ß?˜óäFÈ„`8̩˫hç¸üaÎC˜÷›455±iÓ&žyææÏŸO]]ŒÌ5;¦©çœx"Ö’%ú¹Q‘ʤR~øáþ¾üeýéOõr-‘Cñ/ˆa7²ÓþÏ{ó—(Ãà{ÆÉƒ~LÓà°yŠûï¿_üOB¶åÿ؃kèêêÂ4M"‘ˆÿeQŠb±(þÅ¿øÿ;ë_ÿ.\È{ßû^V¯^½ÅßP)³ =ð€~9—SW_}µwÎ9ç`YÓ§Oçž{î¡§§Ç/÷°=)<×C™†7‚k²çw,´ëù} G£”âÖ[oeÚ´iœzê©tÐAضëºÞ×¾ö5µ<®ßýñÓÒÒÂÐVÆ'¯Y³†÷¾÷½<*ç¥øÞ¶ÿÙ³g+ñ/숷ãÿ›<0âßñÿOêcâòù×Ûò?44ÄÐÐJ)¢Ñ(†a‹ÅÆ4M<ÏãßGÅ¿øçËÅD©Zñ/þ·æ_ík_“`Nú0 ƒB¡0eüOøU·úx>è ´´´ Æó655‘J¥p]—t:ÍQG…çyÜgÝÎ{PtÑŽ‡WòüÆ~ÉõÜà1'xNÞçyuÔQ¤Ói\×%•JÑÔÔ@*®”'çßâ± â_Ø1§všÚZçà Pâ_øÿ[óɿʆ p‡ááa2™ ™L†M›6‘Édèèèð'€ÿSÚÿ‡ÞˇÓßßOæÍ¿Šñ¿MÿBõùÏd2ô÷÷O)ÿ¶ £5«V­¢©©‰Å‹ü ÷ûÜç˜6mõõõD¹øâ‹õ‚ X¼x1ZkæÌ™COO¶mƒdx<! yhñÇ´£Á %°=›žžz{{yî¹çPJ±ß~ûqñÅ뮽–úúz¦M›ÆaŸûñoÔ ÊÀ2Z³xñbÎ:ë,V­ZµÕñË‚ø¶ÍΔLžvÚiꪫ®Òâ_ÿâ[þÝl–—¹sý%_s¹Åb‘|>ëºÜ¿×ztAüOUÿ‘H„D"A(Â0 úú4‰™â_üoÝÿµ×^+Uâ_»‹(p×å—óíó#¸Ï;¨#CÌ{ÊÑ;"Ä_ÿ÷—ܬoÅ}Êá ¶¶–ùóç3mÚ4î¹çžyæÖ­[ÇCÖCþeÙ ~BÖþ8à/_;øã‹K€xÕp¿w?… ¼üòË´µµqê©§R[[Kmm-à[¿¹s]÷iuDˆyÏøÇ·öÈ7=ûKnöneŸ›ŠDåüÿÂná[¿¹Rü â_üoÕÿƒ>¨N=á]zÍš~ZZbär9òù<Žãà8ƒƒC虞øŸÂþC!έ5Ù¬ËÒU]jéªû( Zü‹ÿÍý â_»‘'„0fPÆþ&ذ®)ŒÎŠ‚J Á8Øä…ÅÿM§Éår•Ò_dzƒ†_PÚŸ¾ÅL.ßì] ®ÓÇ žSòÿ?mÚ4æÌ™S))ïã…cC­Á1d fíè8¨˜BY@ ¼v®…·ÞƒG9Kߦo™?ÉÛëå/m³Òâ_ð^rÕ Ç†´øŸÚ¤Å¿øßšÿ€{}EýûhÕ‘eï½›±m»2Ãó·uûcÊÄÿ”ôßÚÚʦM]ttØ„B½°¾’ÝÛ–ÿgA…6µøŸšþñ_ LÜ9²à½æá½êÁ€öpÈåT謆! 6ô÷÷óÌ3ÏÐÙÙI4¥»»›;ŠwÀ“Ð~qÿoúÉyülù·Ð~q˜crGñº»»‰F£tvvòÌ3ÏÐßßï?oHûÇP¾¶ç‚ÆCÐx¯zx¯y•ôíú/ý¤¸E©ó»’ÿBñ?åÿâsÿ·ß~û˜{ÇËW(­MV¬è&›Í38X ¯¯(þ§¸ÿîî ©Tšyóxì…7ƼæöÛoW[õøŸòþñ?É™¸«h0ö5 ¡ èÿ_+üȪ©Àe‚)”®ë²|ùr–/_NGG›6m‚Ù& »8Ã9˜¥ˆLOQ|~hdÁ5²¯Ê>÷³ðK89ÿïÓL^{í5nºé&š››_ªAAZ¡B ]@+Tˆ+TDA,øVã½ìÉú6ý»ÝÆßÅ¿PÖØ Äÿgkþõ﵇#Ù7u¢Òâjøß>ùª:åø¹:Mr{éEˆ~ñ?åüÇb<ÏÃ0 žþUž^9¼Õq½[óàüWI…ϵ´øŸšþñ/€ÝxdºÆt…Žyò€´B—üÎqƒÇ)±qãFN?ýtæÍ›ÇªU«xöÙgy°ÿT£…R §?OñÍ!ÔÞ!ô°Þ¨†_0>T¥^» IE¨9ŽÖíº~øávØaì½÷Þ¼þúë,^¼Ç)Ò–ÁÏitTXU:§ÄʯOOðÅ'¶ÿmvúÄ¿PÖ'þ§<[óÿûßÿ~˸âÃZýð²Óõ7ÚïÿSÐ?ÀGÁ7Úïö=‰ÿ)ëÿùsņ ¸óÎ;·Ùø¶ê¿‚øŸÚþ…Ié¿©©‰ƒ>xÊûŸ¸CL¿®³ÚÏúÇ”¿n·¡F:apzmí·²lÙ2´ÖÌŸ?ŸçŸžÓ:> ¡]3˜B·;Ї?æÓ nþ.Ðz£†(é°ÿšPˆÓ:>ÁóÏ?ÏüùóÑZ³lÙ2n¸u̾‰ÇÁ0 JÂL9Aß®ÿm"þ€“Ñâ_¸õÖ[ÕæþÏ<óÌ-® —|æÝÒÒÂ5{CöÆ>ñ/þÅÿõ¿ÏÿD8æ˜cŽá g.ÜjkãÌ3ÏÔ[ø¿õ֑΂øŸÚþ…Ié``@ü3Ñc“¶†¢BÛA¹wMðxQAJ+‹þÅ5è,®^½šÇ{Œ7ÒØØˆRŠú†lÛ&“É “/[„øã²âA¤(s€¤iY¤jj°,‹ô@šššîºë.f̘ÁêÕ«ÇtPK+‹„÷øC"þŸ” ÚÆº`Ë0ïÄøŸ#ºô‹±ó„/Šhñ/T<ˆ­ûßâ’bÛ¤R)öÚk/þ¶äÜýþopÚíÿ.þÅ¿øŸ‚þ‡‡‡1 ƒéÓ§Wžsú‡öÖ 455±)¿ ÿâjûÄ¿vþØ<'˜¤)©P!_¨FSz¹è7Þ ÿFŒ‚Û²·1}ÕtÎ>ûlúúúxüñÇÉår¤R),Ë"—Ë1\êCVâGpÀ4ƒH:Iº¶–p8Ìðð0MMMsÌ1Ô××sçwr[ö6l öíAiE‘ðþ‘ÊñþäRŽÞƒœœïÄø‹­’#Ÿ­vÄÕ÷ëßÒîßœíGZ¡wäÓW×(€–ÍÕ⿺¹í¶ÛÔôéÓõhÿ›sý>¥Z[[õìÙ³)‹ ñõý?À7ýøÿâ ú_»v-…B>í=º±±‘w¿ûÝuÔQ4Ï™Ãwtïÿ>zGð}þWîËVâJûßQëca­{4;lËUé_ï ¨üåx²~i^ù[z%èü™#Š…X´hd2úûûqÒ™L˲ˆF£ä¢NÒCûcµÂþMœ±‘h×u)‹8ŽCÿ`?–eÑØØÈ¢E‹øÙ­?ÃÉ;þ…}TyWé•"ÖAÑJµ<;¬vä þEçÛño. kU¯pî°Ç^lOÆŸÈm´ÿûý)Ýýy‘í¿L9þjB‹ÿêeóók|ãßïV:‹aÛ66làŸ“ïᗱſøß®ÿ³ôJ¥«V­âì/þTñQ šøŸÜþ“É$ ,à„N NcÛ6+_|‘þþ±þÓúuJ¥w^w©>û‹?UrþOqÿEó;¶è †>ciÐ}ZüW³ ìtQC»FY„Zkˆ@©=˜Îþ Œ¨A4%^§­­b±ÈÆéììÄI8h­q]Ã0ˆÄb¸56Úv &hĹ@±Åb‘R©ø³=vvv²qãFfΜI[[µÓkÉõç(d xo$à‚ý÷á™ÿØs@I£ÛeXñ/¼ÿ¡Ó,MTDùþ½±þy`ä¼¹ÿùäÑ:›Íò«{ŸW¥e•qQX‹ÿ‰q°©½Ü·|ƒÝ‘ÿ2‰D‚÷½ï}Ì›7ë®»ŽãŽ;ŽÛþ¾Jü‹ÿíúÿ實±±‘8€Çø©^¹r%ŸûúŠ“ÑârûŸ?>±XŒeË–±téRb±–øÿÛ÷ÿ»ý¤„Áˆÿ¬øßì±ó_»ïWû˜Zjˆò@{Aƒ?(ý…CÄ“qT\ކI¤|lÉÇ8_ŸÏÒ¥K¹;|7¦E‡B˜¦éGõ‹E(ºþ;w™hÎ{(ƒµ°¢QœR Ïq¸;|7‘?Dèììä&u‰T<GÂèœ&—ÉᔜJ&Rç5ä4º¼Ît¼×\)ÿÿÂnðïÜã¨^vºž3gõõõ¼þìoyuSŒ¥K—ò­‹á8kÖ¬áˆ#ŽÐ}}}X–Å—¿÷ŸJ£´øŸøþÕ,…û§í—O¾ÿpÇýÓ)ô,GkͼyóX6ûÿãà>/þÅÅÿâÅ‹U$Ñ\tÑE à›œ¨×¬YÜ9s8úè£yè×Wé“μ\ñ´øŸ¼þmÛæ©§žâÕW_¥»»»Òiÿâ_üO\&ŒÿIÈ„?hã=¦Vq¸‰ ¡¥ýƪ>E(¢ä•P!E8ö—b1 ëÕ.%üòÞú0˜ÚvÑ šïÞ©™œwš –n1…tü¹Âþf÷ktISÊ–ÐŽ&l„qrÃ}Ã~#0ÈHšÙØ so™œüâ_Øþûõû;¾£kkk)•Jd2Ö­[GMM ³fÍ¢µµ•D"A¹ÔkãÆ¼ôÒK<öØc\uÕUüê]ÿ“Íÿ½g½ÿ©TŠeË–ñë_ÿš}èC¬^½šË†ïÿâ¿â_ߣ·éïŠ/ž¬˜={6ñxœ“~}¹øŸäþ¿þƒÅ;íKü‹ÿÑþy䮹åqñ=Žˆÿ*‡šZEn½S9âhM”tcÇqȲx!Ï_»×ÔèÕZ*j   i¿3X¯  +¥¿O.Ö< |åÔ 0DÚQ¯Ý QóÊU(¥000ƒD4A(b°kÂPÁ?0 f_]ÐxÏÉÅOø?«}ñxœÚÚZÚÚÚ¸àõ_‰ÿ*ôÿ›|h4ŠeY¼úê«xžÇÚµkéêêãÿˆ#Ž •JaZk®¾újÎ=÷\Žºõ‹â2ùr$tíw>¥çÌ™óŽü[–ÅË/¿Ì‹/¾Èù§Ê¶Õ©JoÍ¿w½7ÆgÃE ZüW¯ýKo§ü]õÕSô‚ 8åþ«Äÿ$÷ÿVÿâ¿âÿ³W‰óq@üïB“á ½ç\ŇÑå2K#j -M¾˜ÇÓžòp<Ï ÆÛ¸ÀlPÃ~c>ÜÀl QX?íÚCdüŽ:]ñÜÝpã=šÏ½_A#XskО‡“ÍCF£gkô¨å\ à ¤B"%·„¶4FÔ¨Œ uëør!oÿ7ú ¶;x¹òÚ¯œ÷~ýíÔGh}W+Ÿ}þzñ_%þºÿÙ 2<<ÌÓO?Íuw>¹ÕÏû+ç½_wuuÑÚÚJkk+Ó§O§­­ Ó4ùÃG¿ËQ\)þ'‹ÿ€o^p¢‡ÃïØGGÙl–b±8æ5ÖÞ[ñý–™àÞÿèU5Ôhñ_þm†wêø.ÿѽ#û^„ÿ“Ûÿ[Eü‹±4~ˆÿ]Çä9𓃠€ F ” Ïõ;€ÞȌ෌}_¡K":‹aš&…\¯½@lc W¹¸ŽË s8@)îÒš¿QƒÖ϶qs¬óеÚ•„©ìÃÀÀІi€'ãàe=?øð ÜÆÝÿ-ÛÿÌßjÐâ¿:üÿÛìO°~ýznøÍ3;ý9_ö…éY³fQ*•èééÁó<®^þè[ó|ÇŒÏZü¯ÿ3õ¾ì¿ÿþ8ŽƒeY»Ä,cÚ´i<óÌ3Ìž=›šš.³7ÖÿÃz»û°Î³´ø¯>ÿÎ5Eõ¶¯Sâ_ü SÏ¿°Û8ó¤}õxøøò÷þsJ¸×7©NV~Ïa¤¡¤7û78*ýçQ®“ƒìŸD€4¦òÚÓ~æß þþÛ­¿§Èei­µÆ-Ñ%÷À JÁøã_Zynýz¾qi áf èv] –ñˆág˳>›~&P mh<×ó×/22Cù¨›€:.xï›òåMüN†ý ®Ê/ßnõ×Î}—ÍK"ZüO~ÿÜñή]?øúÿÑŸþô§™ñÃï´ÿ‡N¿ŠÑ“½gZüŸÿc6¦¨««#‘HðŸK^Ý%þèµW² IDAT§77óƪUÜ|óÍ|þ󟧫«‹÷=ú•1þõ½¯°öÕWY±b[›ìÇø´¡ÅõùwúXû@qåvýáCþlàâ'¿Ç)-þÅÕøß™÷|¬Òâÿ­sÌ»Sz<ü§ÓihhmÝ-þ'»u€:1¸è™ŒÌÞͨßGßüËøàÿ• ƒÂ_Î Ž6æ¿Ös<L·4(JÛg”²yBQ ”òÌÊÆ!F&þàw(³t¯‹vƒô€B°o¼ç¿pðcÁsÿÿêý£.ú£/pƨϤüy˜TÖ”V‹‚×¹Á!><9/ãê§JüWƒÿwJWWÑhÔßÖNú?ôÐCé\ù^¿~=+V¬àœ¿\#þÇÑÿãˇ;Y–½³þÍt#ÝÝO‰DèííeÞ¼y¸ÿ5Ö¿—ÍV&úãÿ¢k×"ñ_uþ³ÝÝ$<¼\n»þÇF˜Åÿ[¡ÜÑSïWZü‹ÿ‰àUãíÄãñ·ç¬ZºXïóõ3ÄÿÛ`¼üãyÞnóÿÀ°téRfÍšU™« ¶¶Ã0(‹ óµïÿf\œïò€:)ˆn©ÍnöÆV.‚£/„%F:tåRþàµÊUþã6hSûYÿßrfÐÛö»ùüGè{–RJú=8åé‘ìo°ÝM}}~co°yM¸ÆÂLšx9RÆÆ+z# ”r#¯éàg‡MPö(o‘QïGú,ÂŒ”“—>£H&#këQ ú¡‰}1Øcþ·ÃçÏ8B777cš&WÿNüWƒÿ·Àhÿ­­­Ì˜1ƒ‡~˜žžÿóßIÿM—œDç5‘H$8gÉ5âœýM¡íÿ¯¿þ:›6m¢··—ÇœeË–¡{Ý1þïºë.=ôPâñ8ñxœD"ÁìÙ³yè×Wi€“~{¹ø¯BÿÓ¿}"ߟy Ó¦MÛ¾ÿrVè,´êšÚþß6 ñ/þ'†ÿ,Ë"—ËÇwÞÿfÜøÃÏi€³Î: €|>ÏêÕ«¹pÆ‘\Ÿ{JüÍÿºuëøøÇ?ÎK/½Dcc#{ï½7Ó§Ogxx˜ááa …w^w©¶m›b±ˆeY|öË×ïï»d£•HhÔÍÝ{³7Ã&®ãކz£ÐåÁÙ¬‘àÿ–Fuú”ÕzT†Îô';[¿‹}öÙ‡3fÐÜÜÌœ9sPJqØ’ (¼2 ñ`[åãuü×å^M ðå+¢û§ˆÇ£è‚‡ÊC)_¢0G;·àú“=¹#'¬Rjd›åÎ@x䏯tPC£>å¬1Ö†2qKîØ×ÙŒí€N Èà„ðÿ(ê¢sÞ§·ê¿¿¿ŸT*Å»oüŒø¯ÿúO[¾÷ñŸH$( <òÈ#ì³Ï>|ø+Åÿ$ñ¯·ý÷ûvü÷õõñ—¿ü…›~ûleÛ±Ëkôæþ?›;˜Ù³gsðÁÓÒÒB8æ•W^á#wü«ø¯bÿ}ßëQ—|æ lÕÿŸþô'6nÜÈâÿ^¥ÔqJOUÿÛ:–Û®½XG"æÍ›‡ã8¸®ÿ¸í¶ÛhjjâÓŸþ4Åb‘+¯¼’ûÖŠñ¿ÇýoÎÎúXûÂ}Ú0 ÚÛÛyî¹çèèèàŒ3Π¾¾ž 6°téRzzzøv×ïªÆÿöx+þ>úhz{{ …B¬Zµê-—ùO&ÿŸúÔ§èííå°ãÏßb¿_ùC%ÒåºneéžžêêêøÉ¯þ¼Ë¼«w|ã/GêÊ“d1*ÊdÈÌXpó×ÊnNû%Õ›?ßÞ,Vn¸Á‰R ~Ê-'Øǫ‰UkQÛXËã§\C4¥§§‡Gy„7u>+W¾Ê-×üˆ«ûÿâÏúßÛóß×ׇišì·ß~ôööbš&étšS>{•ºú›gèúúzÎûÊÿSà/a÷¥WnÛþo;æb^ýu¾síï'\àø¿ä’KX»v-<ðìµ×^xžG<§¡¡s/½n‹÷;Yý{ì±455±fÍŽ<éÂmîwÝòûõsÏ=ÇSO=ÅŒ3˜5k¹\n—ùWoûÆ_.U‰1RÆg2RÚ åGþ=o$êŸó ËØrÀ¤‚ˆ®4Ä+Y‚dy»Êo4”/¤vp,ŽÚŽé_XúøA¸†GÁu(Ø6™lÏóBç þös@"‹øç_¾CšÏß7\*%USƒa$ ¢–EÔ az/>ð¢¿wÔ' @Ö¨ W\”™gF}Òaü*„¢‚Œk"ÄÊÿMÃ"zäຠº@~äXÆëF0Qý÷üâÖ¯_OGG}}}¬X±‚7ú“I®I>.þ«Èÿ'#Éd8á„8è ƒX°`Ávý766²~ýz,Ëâ=ïyç®ÿ¹øŸdþ¯9àÞxã Ç!›Í¾#ÿÇ{,³ö?˜ž×WððÃûcú.B‹ÿ·ø}8=T¹ÿ¿ŸÿRåóýæ'êÎÎNnî{aÊû¸ÿ–o风:ŠÆ}ö…á!n¸þzº»»ÜjÆê䣚õ>ð†††Èd2üè¦?úcÁO5)Üó¯ïÝÒŸúgC‹ÿqô¿“”ýô£å€àÕW_套^¢··—d2É·ö»Ê¶žyä½ï¾û’žsÜȤŸ4ô[õû{¾äÏQẼùæ›tttpÉwî˜A€]åÿøÃêô?øA9ðÀÉý·t:M2™dÕªUUáÿÎë.Õx 3gÎdÚüîÔ~ïøKô®özË ¿ò¤>¡‘ìk9ÒiX&„ÀS3¥pKÎHäßÕþ²¼»\£@Øðå²5*2¦G:ø•†—9ª¦œ vàÅß¾1H/œ†í8¸ž‡çy„B!JåHZb*:ò!¨(ùpžþöÎ<¾ŽªlÀÏ™™»æfOš®!] µe_ÙT@­Â‡|ìð! ¢ˆ~¨ˆ¨(Ê.È"‚, .P@+.‹(‘¥”µ…îû–4;ÜÜ}æ|ÌÜܤIÚ’¶¹yŸß/?J2w–óÜ™9ç=ç¼çËî¹Y–E<Ç0 RÉ$~Ë¢}A“û°M÷(9µMøzD}³ÑÞ¹ÄqÙsö tnÞ£é5j¼„d˜n$ÐV3ä­±“ ­ NÊîõ®]}Æ­ˆ ׋`O÷_ñ¥Oƒ~zÀ)\óó¿t—­¡Müç“ÿß'sN`º;—X»v-óæÍ#•Jõò¿-?øÆgõWWÞ‡Tâÿø×ÿÐêêK>£gΜÉù¯ß¹Ký_±ìܽßÙ°a¶mw/é³³þƒÁ †aдf9õõõ¬_¿¾Œÿƒ#뿲²’ &°ÿCæ½u‚ÒYÿ7­x.üÿ8ŽÃªU«xòÉ'Y±bwþö?žÃÿ^x¬>öØcéììì[þ<áü~?o½õ¿øý+nCö"¥ë_ÏØ—~Àq÷w©©G›ýpö:4Ý~©®®®æSºjØü¿ø—Ÿë•+WFw¸ Ü÷þCýꦯèââb^|ñEü~?[¶léöß“U«V1eʔ޿ ²Óþ³ ÔÍ‹ÿ®+++©­­åw_¡?H2º=Õÿĉ9âˆ#øøç¯Pðîß?tû¥º¼¼œÊÊJ,ËñþÏ»ôvõ‡»¯Ð@`Ðe>þèîõñ÷ˆvf‡t¯ßðÿ£·ÿŠúŒÒâ?ÿý?–ZÁ%[J¸çž{¨®®ææûþ¹Ýë¾éª3ôOãO‰ÿè_?çî×¶m&L˜Àkçý’#ÿzÙ.õ¿ß~û1yòd/^L{W[¶lÙ)ÿuuuƒAZ¼Äëׯwÿí9.ÿzNÖ‰ÅúᥟÓeee|{Õ£{¼ÿmÉú…B,X°€Ÿ”~žëô³#ÚÿÓ'\GMM 444PUUÅøßž&þá¿®®ŽÝþ×óÂSöׇrëׯgíÚµý×HGˆÿûŽÿ*/½ô/¼ð=»¢×qõ¯½†Û—”Þ‘ÿ©¿›ª?ÁO¶{Þú—¶²ßïþ_»à—}†Eé[¿TüìkzÞÙ·aưøÅb}ôÑTTTðéOZWUU‘H$¨Þÿ”^ûüæÇèââb Ãà@kÝÇO:;;I¥R}ö;ë¿»‘¼ïÉê‰û¯ÒTTTðÇoÔ³Ïþþ.  —¿ßßïïóû¬ÿ½÷Þ›‰'Žxÿ+V¬ ±±‘¿ýîÇ;ôß+H2„þP³•î~0{/:3b‚¥ð‰'âXAÊRX?Û&Oã-ðáõÔjwÈS‚\vTŸû`÷üdìLnè_6qŠø¦ib§l0´»l[¢GãÏ×c(T6;»7\Ê~=†ud„t*N&ÝŒš†¦¢ °™ÀÒ%K‰G(Ã@;:™$ís'(Ú¯Çrëûzô|†zT²?AÜ%æ,…é7Ý„ŽÎU¼9<Úqðü¤t27§Ù—k°4øÝåê´;cãù°&$Á°4)¥ …Hu$ £±;ì\æTgh_â_üïÉþ_à­»|ÇC·ZÿL° (þ? ÿGïù¶ž2e >ø óæÍãú_>£Ôe–Þ•þ?1÷[üåøk8ì°ÃhkkcÁ‚Ü;çõAù¯®®&“ÉP__OII mmm,_¾œûJÞDu ÿßñ fÏžÍø9'õ:—ëùŒ:íøÉúæžÉÉ'ŸÌÌ[ÏÛcýg÷ÕŸÿîN­« ôHõ ‰F£ƒAš››©ªª¢rï½Iߥ«öe Ïú¸øßÿÁpÚi§±yófÞ{ï=~û×÷ú~vø¿÷ø‹˜1cûÛߘóÌòí7ÜÒê¡Û/ÕÛóŸN§Y6ÿQ]ZZÊØŸÛîþÌ •×þ¯ ßoc `þüù¬Y³†‚‚ößÿ]â¦Ýü™x¬úÚÙÕEEELžMŸ…N»K[f+Dq à}Îg¸I^´F)…éó¡µ&e'ñ‡üØÚ&2¦ˆxK—[Y환Ìtݹ £ñðÿâøW§+Môÿõ½Þë¾ýßúšÎ¿âÿÃúŸ>}:‹-¢´´´ûå¿;üÿ÷K×ñ»ƒ¾É´iÓøøÇ?Χ>õ)}Âéßí÷Z¯ûöëššfΜIuu5ï¼ó/¿ü2±XŒT*ÅE¯’nÿú­Ú~Ô¦‰D¿å»×^{‹Åظq#OŸ~'νfÏôÜs×uþ»'~_¿þõiðÌœëugg'‹-â¦ÖçöÿK—.eÖ¬Y¼ôÒKœuñ-ÝûxëùôÁ·²ª±GÎýEEEœüÇkÅÿþwDÖÿ¦M›úoüÿ{íµsçÎåžGçêúÛÚÚŒÿuëÖqßÍ_Õ_ûÞî7qS—ò}7¤óÕ2™ÄçóõûùÂÂB6nÜHUUï¾û.S§NÝeþ½çÛº¨¨ˆd2I8Þmþ{ò«Ç(p‡´O›6­[·rÉ9‡ëÊÊJ~ú‹§†< þóÏÿv7R'yÉ}²‘ï ˜“Pqü¶c“±m0À…Èd2$c1ìT†L:“ú×èä†î†¼JTÀžmZ‰t¶Ú½×.#laý ¤Ói’ÉN2qoT¶Ç7;78› .N.i˜ôD >P BP0©Ò²RZ[ZéÚÔ qÐ…îÜ,µÙ[Ú)›Ô%Dnè³7­»\L db, >ŸDWŒL"…˸üžë¾V™}AìL†t* IÇ=×8¹†M¥>†ÂòY˜~‹@8ŒeY$ãqR±„;_Ù41 RñövÒv{Y²å¢A?õÁ^â_ü‹ñ¿­ÿëËOå{7ÿÑmü_ÖƒñÿÀ䯉D¨­­åÊ ™ÿþÑh”cŽ9†††Þzë-îâMõߟÜKï½÷ÞvØa̘1ƒ’’JJJp‡+VðÖ[oqôÑGsâ?6ÿÉ[ºTv¨ïQG5àzÁ'5N;–I“&ñ“ÚÿÛãüÿæèo0qâDÖ¬YC{{{·ÿž”ÿl‚ÞÖ¶ñÿà­—è¬ÿï\?Çð Sïnÿ[¶lañâÅÔÔÔpÚ—oèsMßq™^±bgžy&S¦L¡ôªãÅÿþ·Gþûï¥wÆ¿~@«kÿ÷d½+ýñÄã3oÞ<ª««5ìygý÷L Ö‘Ÿ”é|ôî\ïý÷ߟCOøê ö?ýÄw¿z‚N¥RÌœ9“ÂÂBιäÖ! Üñã/èââbñŸ‡þíÞüx®Ò©(Â65¶¶±µƒ²¡ÂB¤R)œL¥ÁP†a¸‰Ú¼,À‰È}VÀ") £ÝÏtŸQö´ÀÖhÇ¡+ÅòYîn¿ AÂf.ŸMÊòzjÂÞ7ŸLÕ©î}ëfMlc”ºµÔm¬%¶1ŠnÖÝó»T›l%ÛKEØÛgˆÞKY¸ç4Áo¢ ËgÑ¢ǽv§G¨%›àWCFgG °–éϱNx …6÷ó†a`(¥ÁÉdH¥R„  ,…­×…©‰Tå*«þ\eµÛåÎ>üÅ¿øÿâÿ?ÕϾºP®*ЃñÖÚ©466ÒÑÑÁÚµkÑÐj¨üÿ¤óÿøyúEþóŸÿ`ûì³ÿ{ᱺªªŠÆÆF¢Ñ(mmm´µµ‹ÅxñÅ™;w.—.}ˆƒæ^4lþ³?€D"Á¦M›¶[ÞO¿ºE5440uêTôŸ´ÚÓü+¥xùå—¹äêÕ@•¿mýgÿgÏÞG÷ôß=<ú[í.ÿeeeŒ;–OŸù=:è ž}öÙ~Ëá‹WÜ­Ö¯_OMM Ï>û,·ís®øßÉÊÿ@þ¬‘Ö?píWííí»ÌÿwÜÁ‚ øÄ'>Á¾ûîÛ½4ØöØYÿ;"ú㕯þ‰O>ùä ÷=ýÄÏx^M›6Y³f …¸ãÇ_Ð|Hî½ñ"]SS#þóÔ¿µÝ›?˜îh†L"¥E¤œ4¦Ï$e§Á0ˆ/ “É ”rç[kã8îK=áä*þÙŠ—1Ú ø0,Ã4qlÝÝG.[°aàdl´étšp8L,ö¼ vØp{ÐzÌÂ¿ÍØož­Z¯Ðã4ÄÁiuPioÅ‘¨;OW4j½×ó“êðÊ!Ûƒgõè Þü^wžZ8ìF©µmãxçŽc÷ ³(ýfÃ2°>[ã¤wŸÙé/ ·ì”¯,™T_(H&“Áà8©D[;ø}>Ré4Å¥D[;°éÑ›’p6,þÅ¿øÿCåÿÜsÏåü#Éd’?ýk‚¡÷{êßðî¿Yòõ?P__ÀæÍ›9ÿò;»¯ù¼“fêGJ–º«h†ÕO-ZDssóË}êÔ©ìµ×^´oxQ—\qÜåÿ++~Eæ¾Ì€Ÿ/½yœ¶m»—ÿ,ýùïÖ¼›ü/<÷\*÷>h`áÂ…ÝŸéÉß=]+¥˜5ko¿ý6Ï>û,›7o†ýÅÿΰ=ÿYÌ+üÚ©OÚæÉîý<ø§·ÕŸßOOœ8‘}ìcÛõ?fÌ–.]ʹ¿ßï'pàrÐA1çÞÉúܯß6`Ù|ÿ=— ë|óŸeΜ9Œ?~§ö?ýÄ¥?|H,}Ž.,,äæï©ßÿ}æ¨å;5ä’s×ñxœÉ“'SWWÇÖ­[¹îî§ÅÿõÿèÓËÔ ê$où’@.úgúM"eEnÒ/å'ïBŠ@0„Õ#ÁA&•BÛvÆ}ê”7')à GÊ.—00ƒÊ4À4PJåzɶÁÑ6¦åC§2ضÝ]ø ­qȸÙr•å¸5´ìTÂ0¹9¨ÚûI‚Ú¢ÐU:·Mv8îߺ—žé¹ÄO˜ÜÜr (÷åo¹'lø,J)lÛFg”ßÂɤûyºzÿQʽvÓ- 'c»seÞà€{¾:e£BîzÀ¦å–± ¹òü~´Ö$ãqâ©‘Phˆ”mîpçd™ÜK@ü‹ñ?´þ:«¹à›w¹¸=šü|ðÁ´µµõz—ÿY÷~!÷fëu²ÒÙQv,CŇ߿ýóT¯+9öØc©®®æá¿,ÚîËÛçó±qãF¦NJÇ]ÿ¦èûŸØ³üÿHé¶Ÿ6÷ù|Å­µmÛ}ü¼öÌ/uuuuÿ¹–ß®÷ššÌ¬Y³ ¹… ÒÚÚÊS¯Ôuýߨãñ8–e¡”"2þ|~ÿ÷Åî6ÜÒâÇìÐ?ïÆÁøÏãÖœ£KJJ8üðÃyî¹çxüñÇ™={6„B!|>7]u†^¿~=÷?ñ¦zä©¥êö¬7nÜøáüÿxýy¾ýe[QTT´ÝËú þ;7½¤ '}|»å•wþ³Î:‹½öÚ ¿ÿú‘§–nwûÑî{Ì8â\U·ô)]TT„ßïgÎÂåƒýô[§èŠŠ V­ZEKK |ÿgs?йˆÿ=Ã? û X}nþìœ6_ö ˆTŠ„‰vuOÆ1|&þ@_5 S©™tÚúŠ;tËé²Ý(®½æ’š Ã2†BîÜc¿ºR' &OžLYY¯¼ò ýö?nÙauGþ‹®-שD’t:½SþoýÁ9zöìÙŒ;€<ææfκøuéyGê~ô£ÔÔÔ0mÚ46nÜHEE…^²d ßúé#ꮟ\ ?´àç¿yqPôìäƒÿŽksA…Ë®yXýû¯·ë‚‚vÔøÿÛgüÌ“TÝÒ§ô·W?Úý\ÜQàþ[.Ö³fÍ"™Lòþûïó?ßøù‡Ê#°#ÿÛ"þ‡Þÿ©§žJee%uuuúÅwÛ{Àë¾ùOô°d—¸ º=ÅU¥„ ôG;ÜžËèö™È& ’ñ8:ãtÏÛr×)õzN²(Ÿ÷â4Ýèe ìÎpÛsÈ`aamæ*¶m {g‹ô4¼VÈ;®¯G%. _„ªÊJª*+‰ø"¹LòFíC=^FÞÞ ÷X=¢6Á`0×àÓÞ¹ÒÆÒ§Zk¡ Û‹fzeãë1üÍ+?'mwÏ'Ö‡d¥Ý¤-Ç]®E÷¨üg“»ø¦e …¼y°&*“é§—w>/RY IDAT¬£A¹Öi‡t*… °”…a> 'q{º—äQîºÃÙˆrˆÜ’a¦ûßH Âôê}XѲ‚­jkn=ßìC0[éËöúèl¢(÷߆Ï=¥ŽvÏM§Ýá¿(Ž“[Fj›ö 2†ebxÑüD4†íK»½Ùí½QÍNÊm0*å;UJ‘H$ðù|Ý|Þp°ôM-*FŠŒ»y’¶Ëm¢-îº*W R'*­ŸöVjÿÃêÿÆI§sÆg0íÐ3Ýò¾-þóÜZZZÜ®~ÿùç[¶ç¿?¶lÙâÎáþÕyJëDbÀÞŸ wMÑÑŽÎ]îáÂ…,Y²„®®.wNŠZQQ+W®¤¼¼œ¥K—2oÞ¼=‰ÿÛ¹Ž…ÿ~hØü/_¾œD"Áe×<Üoâ  €yóæQVVÖlÏVæ‡Êÿ`ù þÿü›èþ2“û¾_ óÉÿ¶D"JKKÜo}}}wàq4úß P¢ûó¿mãêÔ©|ä#aݺu¬^½zHŸ;ò?âèü”Oý”zû…õŒ3¸ø¬ÃôýO¼ÙݵºÃ¹¤~ƒHi!×·©NÚzí¬ëÇ-ª 7éO*•¢½½C)”Öhï…¥µv‡æÑ#"t*ø¾ _ @*•êýU=*]¶w^ºG¤0lá¤Ò yËãøÜ¡¶ÚD§3n/@7)XÏõá³=8Þra¡ƒB„öx{÷¹… _Ï Å;Ûë=ÈhwÞ§ßÇAy/Ëçs+†áž[ØÊE5³/²LÞ%Õ»8•Já ðýØ™Œ[FZC¬GÙÙZ»™€q@ ´··S\\ @ë÷¶ôù¢dÜ…?,ÑÑÖNwž¤ÂÝ·µMHü‹ý¨Vú»Z÷ì­Òw¤•su@‹ÿüôïü,¡¶íåhmÛÚo®UãÅþøÏerܱÿz÷^y啼ðo~õ0~qÀ…}{&w—ÿÃ?œuëÖ‘N§Ùo¿ýxvþVnûõ<ð­/}BÇãq/^ÌËïwõ?\Ú2Å*…quXJ‘¹±o9UUUQ__ϪU«†Üÿ•é'i»f«Ú^OÀiÇOÖJ)&MšÄÝxUÁÐøß>¨ÿ ô?&Bç—ÿàÕ¸)Úýùd2I*•°|“Œ.Ÿýï 7´©~ýoÓàÞgŸ}x÷Ýw¹äê‡déÀùßâèüg9äø¯¨yOÞ¦'MšÄ¡ÓÞá­Õvn> ¹4}·ÝçÆß–ìǸ:¬nÀÉØnB«D÷`ö¡îS(ÓÍúÛ]8ŽC&›4È`€QÓn(_™&:e£µ&•Nã÷ûÉØ¶û¾Ð*£Ñ~Üù~©l™\ÏŽ=V“Чh‹µAƒ»÷¶X©x =V£šÝ!Ê$½—Pöܽ¤( Жa™˜>–ÏG*•Bk¶5Êo¢m§ÿ±€=–ËdìÜ|I¯'P™Ú§!éõÚ¹2t|îCô܎(Å€þ>ëÛÜHïe¦ÆÔnOMWϲøNÿŽãÐÖÖ»<ÅûßæìûóßßHñ?zý÷䪛žPç4SÌÿ—/ý-êB¥‰¨ I(R°[ýié/yñÄŸ“H$hmm…žïu´Ûú÷ö¥]é×â¿·ß÷Â[“¾5®z^÷’%K†Í?ÀÝ×}Q·µµ±iÓ&ÚÚÚøã?W÷Úß_Xçýnù1¿ßÏqÇ÷ýï,Ô4å;§³ ß•!·þ{ôÄÖÕÕ ª¬F£ÿže<¨ @þ{pÛ¯ç©Û~=¡&ë ^úÿûÿ0wêwÔ%çÞkÖÛ(÷æ·TwâªA_ÜM1÷Yä€NÛhG»/­Dá&ٟꎖ÷iÛÛ™N”Íâ­5Xñù­ÄÞh!º¨ _£M±¤¢°˜ÒÒ"ÅaŒña·'Àö¢þ1 ºÀ}ðeê2´lhaÝêu¬[½Ž– -dê2Ðåm÷>ãõc|˜@q˜ÒÒ"* ‹)v‚øm¢‹šˆ½ÑB|~+X†{Žºÿö7¶îû¢3 ·l|ªw™e×Ov4:í&ÖR^ÙïT$ên[ay®#=>*þ‡ÕGG+V¬è{Íâ??ýoC¿þÿ»Åÿc¨Ûƞ˚/ý‰U—­âžª/Óô“&•¹/£v«ÿmx´d™øFÿûï¿?'œþÝîÔAüì߸ÔÒêˆV§+=ñº“ùÌŸ¯6ÿÖÙ–®¬¬ä¨£ŽbÖ¬Yƒn4Ô××(ÿ_>í }ýwNÔ:ëÄ àØcå”SNé]yê_]ni€·ž@/[¶Œ 6 êø£Ñ¿ï»aíÿ~ÞÙsîåðŸÿügгˆÿíûÿ°üê±êí5¹{Üпu>Ô7"uc—ò}7¤µ£½áº;ëh÷ºÉ!ešX~?†÷°m›^ù({ÎMÉ.…•ýò¾–D[¸™}#`ø …ÁŽíÐÕÞEJ§È(À4a’ ™Üp—´÷‰¸§Éq+zàFC³Ÿã Ã^6a¼ßYØwšL,Ž_ù A÷ØEŽrç<ê%it, PGør×”ìÿµ—ÐÆ†å÷“qRè7„Ò«|f+i­ÑŽF¡IÝû@Îô/û>àÅÿ0úæÍ{±ßyPâ?OýoÃ@þ{·ÿÅÿ°úŸ“ ¹xç°6»DŽËßÝmôZïjÿ}°ÿ»Úÿ`´|ËÒ]í]âñÖÅ?&Ó´˜ÚÚZ&Nœ‹Wîð|?¬ÿÌíuðÁ3yòd½g²ÞQ¦ôâÿ7~W=ð³ÃuUU›^ÒE×| Œüö¬[·Ž 6ðÄs«vxNsîýŽÞÕþ³ä“ÿáàŽA?ýôÓn.“@ü÷ïÿÃ, ¸£×ÌÐ…¤µ[ÙvÈ-û2º‡¿g‡Ö}s­(¸¶T£¶éµs/}­À†cp'>y™qý~|¦t2M<'¥Sî&÷Åßå5¼³k7y/¤‚€† èTk÷oþm—w¬$Ë@A±!“ÈQBþ>Ó‡í³IÄîö^¢¡lpu¡—]ÕîQÚÞõÚ¶MÇ5Mî<­ë+µaš¹ap!Ãm8^ã%í•­ÉöGì.Äÿ€þիî€÷7--þóØÿ1h^Î]‘R½ýoKÝ7×*ñ?LþÿÜwPq*•"•J±aÑ¢þ½üÉûÌéè]á[Ôe¦v{°Åÿnñ¿2©Œøßƒü—\:žx*Î/¦^ÈãÿX9¨Jò‡õÏEè+Öÿö¿•™3g?ß¾ÏôŸeÍš5\üöýî÷¸ ÿý« ”>óõ›Ñïx­úàùAýõ÷Í%—>¸Kýg7n………âŽ;î8¦L™Âç/øÉN5\ÏøÊMƒÚþñû¾«§OŸ+yûí·éêêÊKÿ–eqä‘G›§!*—YZw9ЩÝu7oÈ]¢Gù-œ›ûŸ¿¢¾iišl÷%îKô#=G¹/Ãg Â «ÄÂØØn®úLÆ”•qöÇ[Ü¡ˆ^å¿K¡ à°>ʯ, 4!„ º#°‰×Æùèчóæ¢7Ð]@×HèÂ]ÕÂ=·lVkÛKbbâ$2mtL㤽ñY¯ö¨œçMº àç«0Ñweú-ã{!­SH8÷z)“Þñ ªÀÀ¹;£öÄ›^ü‹ñß×ÿN•¡ø:ÿéßÁUJ|ðÁd2¶lÙÂw®Ÿ3pyžˆÿ£×ÿMW¡®^û'ñ?üß2ˆ:íPû_|Ùï™zÈCâDüàæ=y›Þo¿ý˜pÃíÿWßò§^Û=xë%zÿý÷§¢¢Bü÷à_ºEû|>æÏŸß§Ì†Š¬ÿ††Þyç¾pÙƒ>Ξ쿿s=ôÐCÙ­u¹¥i³¡Ó‹àú€bcÀOŸ}\¤4‰nþ¡M¿‰ )œ ƒc9¹,û^Bg ে½ÇŽåœ£ê¡¬b í÷álJRZYJ"§hrr0 ß~‡Žu#!Z[1&P©4™ö ´QÜÞC›\ò”bï¦tÀÈ ר)æ÷-WužÒAÿZ®¾ii’´ëÜ\ÔB ÄDÿbÏ|ˆñ?üŸ²qÕÕÕttt°yóæîÄ1eÿ[®‡ËÿN—¥øÿPþõŸ§­­;~©Ï~¾têº?ÿÛò§¯ÖŽãpÖ“·ˆñ/þÅ¿øßþ{°aÑ_´ÏçãÕW_eÙ²eühÑ_‡Í0$Nذa—þð¡îퟟû3}Øa‡Q~ñ§F½ÿ,ýêJÝÐÐÀÒ¥K¹ÿ‰7‡å\ûø¿ý¯ÝǹõçèX,¶Ký¯_¿ž>þÅ!¿Öÿ9ñ#zŸ}öáðÃgÆŒÔxêÐvÚåÎô/2Š ¹µ\-ÀPƒ¾ùÁm t󛎧ÕÁÙêÀV höÌÞÏ>õõ<ñbtÁ7nÏ ;S Üµ S])ÂV˜–¦fZšš [aR])wH¥Ñ)>2î#îþ²=ˆÉÞÇ Ù;öVp¶:8­D ÷û»®G´lãpËÌP¹¥p”û¢Û“o~ñ/þ÷dÿúQGµÜÙ¬&OžÌ±ÇË™gžÉ¾ûîÛ½ÿ–;›•~ÔQÃá§ËRü`ÿo¿”ÒÒRJJJ¸ú’Ïô09ÿž<3çz}È!‡p 'ðÖ•ˆñ/þÅ¿øßþ³¼ô·;tQQ---lذÁmü½€û3 þ'L˜€ey+¦[—žwd÷>ÛÛÛ)>û“âßãþ[.Ö¬]»vØÿýú÷øÑå'éòòò]ê?SYYÉã÷}wÈ'g<úô2õöÛo³lÙ2:;;‡¼,­¡ [:I)ô½C˜tÂe1ËÂYœÊ=h4î0Ýì#–D"´µ´ðÒ?ËxƒÎ¿Çæ·+Š ‹‰Öw’lMÒ€»þcº565ÅcŠiïl‡f‡÷ÛC‰Âô†™‘&·^jÒ‹:+º“˜ûZèfí&ªª¢¼×Vê|ÃM+Ÿ-Ó=ñ/þ÷@ÿÎ=¹óðù|TUU1óÈSxýõ×{⇗~N?ž¯/üø¡þ8àŠŠŠH&“¬Y³†ÛÊËuÏa~ƒñ_UUÅ䃅X'¹i â_ü‹ñ/þw½òòr,Ë¢½½½×ðík.;Q_·áéañ_\\Lgg'ÅÅÅŒ7®{ûÓ¾|ƒâ£hñïâ8íííttt Û1¶çêÔ©ì»ï¾»Ôÿ‚ç~¥«ªª¨©©–ëýû6«¿ÿçð“? ù¾!¿ÿÓnÐý{gho~Ë{Ð[ ßǃî|êt— øl `uK 5@pÞýšò 8a‡úúzÚÛÚiok§¾¾'ìP>¡‚1•`º/Ò0¶b,*®rCÍ2=nÄ4À=Kå^CYž¿w–ý{L«=ý þÅÿžæÿcOý‚»¯ûb÷ë3‰PVVÆ[ÏÏaÙ²eÝ»ÿÎEÇé™3gò±}ŒÌ] ÄÿôÿÇ“¾Ç”)S;v,³8€“O9…#Ž8b§ýpÀÀkk‰Åb¼xÁÏÅ¿øÿâ_üï.ÿÀÜ__—••‘ÉdX¿~}¯¿Í˜1cØü¡µ¦ºº:wЃÑâ?Ç%W?¨®ùù_ÔÃY4,çº#ÿ¡Ph×úÞ{ï=b±åååŒ4¬ayüu¿¨~P~ð„vMzqÒ}(Ût'Ìð}ÜxzŠo̅À‰¸9ÁÖ½·üàØmëÚ¼Í]÷ÞpÀ¬‘I§¡.Mí¢Zü~?©dÊÝ·‹:û@±BùA¼s†0~bÏ¿ñÅ¿øßýë?ÕãàîëЗ]󰪯¯ç·¿ý-uuuÝí|ã³z¯½öbß}÷¥¢¢³ü0ô¯ëQgT‰ÿäßï÷ÓÚÚJyy9ñÎNBã¦pÔ‰—} ÿÐ@,£««Ë]ÞJü‹ñ/þÅÿnó_\\Œa´··ÓÔÔÔëo………8Ž3lþ3™ ½Žë;>(þw!{š€––êêꨬ¬äæï©¿wóGŒ/kDٷ݆š*Pè×àh|3ý¤W¦Ü†œ0!e¤¸l®;}w!0˜œû°æ±«‚˜1]êÞ¬*ª°KLLŸL};™b¸±ÔnÝŒYb’J¸YFñç"¿¾~p´»n8Ê=§V힣°ÇûãŒ_N§™0a¯¿þ:g¯¹Süç¡ÿµï¼Ê”äÐO~’­[·rÛÏÕÁ`#Ž8¢Ûÿ¨ß{ï=:è ÆŽKåÞ³€.¢›—‹ÿäÿgGŸM{{;ííí´¶¶ …lÙò¡üÛ¶Í›o¾É”)SxâÌ«8ë·ˆñ/þÅ¿øßÁ­QJÇéêêêõ·åË—SUU5lþ“É$­­­\w÷ÓÊw‘ßm<ĵø…þ{·¶¶–ŠŠ âñ8†aŒ¨òY€ ¨è˜Õ Ó@Ì[v¸ü¨tÛŒü‘uÑ(ÍÀQ~?ËR)ÆOœHª½ƒÒ©¥´®nÅ?±ˆ­õõî² ›Ú†Í¶A¤$B´3ŠmÛîÍvÏC·k+”¤5:à[FnÒ=Ùû%Ÿá‰iûRUU…RŠ ³þ‹h4ÊUï~œÙ³gó‰?~Küç‰ÿãŸû ®YC$aúôé¼ùæ›ìµ×^}ü¿ûî»Äb1*'LBdš–ÐÔÔÄ;_ø5ß{‘øþÛÛÛ1 ƒ-[¶ Éd2´··(ÿÑh”L&C&“qç5Šñ/þÅ¿øß= ËB)E]]]Ÿyæ»ÂÿµïüŽD‹ÿÑéË–-}ÎiÆ (¥8øàƒI&“68+(R¨ì#íÝì¾~ð\z༿z5ïD£\tà‹ò忸+h¤R¹l5¯ùeS¦°üwøý<_[þ V“ !ÐUèHàÔ;´¯kwçÿ*/íÍÓ[4ªt1î9¤=Ä + Cí¿¬¬Œ©S§‡=ÿsyùå—I$Lœ8|â?_ü§ÓiÊÊʈÅb¬_¿Ã0v迱¶–††w…B,^¼;n‹ÿàÿ†{žUw^{¾nooDz¬!óoY´¶¶Šñ/þÅ¿øßM„B!jkkY³f o¼ñF¯¿‰ñ?Üþû[Ù ¡¡1cưråJw%1 `TPªÐMÚÔ­€°â–WàJѰz5ŸþdŠÀ ™Øm6`P¤>­9à¢ãxì±Ç¨¯¯GkMss3·Oÿ¾•zÔ]óÛ¶™0nµµ˜å¦ÛÈ› ¯ÔÂÊ=v(Q Z5ÎFGîÒ=Ô¿šû3Þ}ä6mÚDMMM/ÿÓ§OÇçó±ü’9LÿÓùâ?üÿfÅ öÞ{oÂá0+W®dìØ±¼ûî»ÛõßÚÚŠã8D£QÞ|óM¢Ñ¨=ÿ{¼ÿ«€ÿ½ö÷êW7}E'“IlÛÿååålÙ²ÅM$þÅ¿øÿâ·°eË´Ö¼ýöÛÌ{§­OcLü‹ÿaõßó—%Õôéi½qãFêëë%0\ÌxÞ_³ò+œ%6ʧ¨™ïþCƒ"Á¡Ò ÜuÜúghÓšv`Bi)¥¥¥zè¡Ìœ9“9sæPVV†^¡¡ Ø’¡v]-¤¡¬´Œ¸Žmæ–8jþ馟]ÿ1 Ö˜YìóP €%rŸî‘þW­ZÅìÙ³Y³fM¿þ—,YB0ÿyâ¿­­gžy†šš¶nÝJggç ü;ŽC]]ZkÊËˉ#â$øÅÝnÆ ŠŠŠ†Äÿºuëxÿý÷Éd2â_ü‹ñ/þwK–,¡«««Oøžˆñ?lþ NcYÿz³yDQ À¹7ÜÀsç<ËW¹ˆšùÖ€Zª;ù¦ hˆ¶Fi\ì®ßêëg"Ð4TWWSQQAS¦ŒåË—sæWoV˜@ÐÄ?1€¬üи¸1Wù7½chº[3?ÃW¹ˆçÎy–so¸„Ü£{¬ÿ·ß~›³¿ö35ÿgžy†^xAüç‰ÿåË—S__ÏêÕ«imm´ÿÎÎN:;;Y¹r¥øIþ›ïû§Z¿~ýùå•W¨¯¯gîók•øÿâ_ü‹ÿÝC}}= .ä¹6´Ä¿øVÿýðèÓËÔïþöþˆ›2¢FظK.455ñüý÷³¦çŒý1q¼ÿFqSÀÏޓ‰°0eî…ŠF"ø|>ÆÖÔmÚÌøñãÝ }@£MåAhinpW€;ü×è±ïa“5 ¸ÿ~}üñÇÓÒÒ"I@÷`ÿ¿žûŽwÐþüßý‡WÕg¯Ô•gU‰ÿ<ðßeuaµµµlÞ¼™—ßï”ÿ¥K—2~üxZZZظq#Œÿ#Â~÷·÷Õ¹Ÿ›¡‡Âÿ+‹c¹ãˆñ/þÅ¿øß-ÜóèüA5²Ä¿øÿyƈ (Ü9 , ¢è\ØwÖÛa–ËUÒ³KvEÜûuÒ´i¼ºp!ÜxžŠ×+ذañxœõë×c^é×vÒ†f‡Ú·6ºKÌ{ I?î\§Ç±È͉(Å‚ زe‹äÙƒýß´p¡¾”eY¼þúë½ügynZ¼…øÏÿs‚ËùäÚ}ñ•Œåå÷Wt«Ù®ÿ꿎ñë×^{¿ßÇëû&Ý®'ñ¿çû?&¦y9§`Î3ËÕ'ÞW(ÿË“9¥ŸD“ÿâ_ü‹ñ¿§#þÅÿú—Àîe(cÎ=ãÄI÷xø,‰Å&º»§.›±; ¯‰ihr˜vÔÞ|þ\ÂMabFŒi5SXñê Œ1&–eZ“ê^òÛÛ§˜Þ±zÖšåË—³üé§Y'y@÷lÿÀµwþ]ò¾zܸq444P^^Þ½£Rüç“ÿßYÜÇÇöüüß˵Þg’0-þGÿmøÐþ{"þÅ¿øÿâÄ þÅÿù—Àîg (ž~ºÏƒž4Ž{ƒb’[¶+Ë€xK µ¸ùo®`\p,'Ì>€çÿú<+Þ\#a¦NØ‹÷7¼qoÊÛ§ãýÔ YŸ»Ñ“Àò§Ÿî=$MØ3ýŸ­4A˜ýÑÙ$“I&Mšäfz¿Piâ?ïüŸŠæÉ¾^fÏÞÆœŠ&-þG”ÿãѼ°cƒòßëÞwAü‹ñ/þÅÿžE šjÜi¼â_jÿØÃ^Û⚪¿ó*í~à¦sMŸãöèÆ¡9ÕÌËÏ¿ @ss³»‘ñM,]»Ôý|¶A‘Ø£½cøq>ÂíÿÂý‚ñ{¹sê6Ô‰ÿ<öÿ%Ðm󙿿fŽ?þx>ò±“ùÝ]?ì{3¼¾ø¹þ·Ãý÷‡øÿâ_ü‹ÿ=ñ/ìÈ¿ö`²=:Wa7“&vÀæ¡ @¥ŒB§ËA' Ì)cý{ë[8–úÌVTŒ§Å0ÐîíCÛî>uãâ_Aþ•Öst÷‹zÍš5466bÍKWWW¯]©s•Ö>-þGªÿO¡ù×ö+eÛó߇ÙÞ4ñ/þÅ¿øÿâ_Ñì” Œ€ZRïw>0Sn^Û*+¤‹”¥ÙZ¿vŸ[­¨2  •mlËý, ·×8ãí[É@üKqDÿ‘•è®–ô/5mÚ4:è ÊËËyíµ×€¡.5tAYÑâÄûßA%°?ÿýîös¦¶Ó¶øÿâ_ü‹ñ/þó€ÁúÏwŒ¼¹ÕãæLBDG ¶²! PÆWCiP<©B@Èûw'(­¼mÜÆ ­lH{ûJöxÈÈ€ñ/ŒXÿêl¥X÷$Gÿör>òóÿá[«A­´øÏ/ÿæ§L=Ðæù¹ TVVö¿Ñ‰î4ñ/þÅÿ|þo‡Aùyþ‹ñŸ‡ Úž“?#²Ãsü@¢é(•ÁJÍFˆjtD±òßËQAO.Än²QŽ{'Ûi›ðäBb›;YùïåPD5˜Pf”јh„€wŒ”ûPÄ¿ þ…=ÜÿÉšà±ÞÕ¶¥K—rû.!³bÅŠÞûú’ÒÄ5t‰ñ/þGªÿí±]ÿ=ÿâ_üçƒõ/€‘BÚ»ù³:?4úAC$!ê‹a”ÅØª*Ö._Maq!ML™5u]¨ ÆIB$]@TGÝ}d—S¸ÿ–€øÄ¿0rüŸÓFœݨOss3›7o&‹1}útŒKMMRü‹ñŸþ·GþûCü‹ñŸ Ö¿F +Q€FyW•ú Ka1ÀЬ}m58¶½;Ùµ¯­F•*ˆaA*•‚rkÁ«€•2Hü â_iþ‹ ­[5÷F_'X„H¬_…:SiÒZü‹ñŸ/þ·ÃĉÙ{iÇã,[¶là ýâ_ü‹ÿ|cÐþó#¯®&åý×ö®LCeY%©Lª;ÜáÄ@(´¡‰wʼnwÅцF(œX.$’ʤ¨,«t‡ýä–KÉÍ#þñ/ˆAü {¬ÿS0Ä1ÇÃá‡Îy—ÞÎÑGÝï6•_¯Ôâ_ü‹ÿüc0þ%0Òèâä†éhh\ß&8ÊÁ10P`$ ¬€…°0†Ý3Ümå€é}V{ûr¼}wÉÍ#þñ/ˆAü {²ÿØ´i¡PˆLÓÄãñ~·ÿâ_üç'ƒñ?°òêj6¢¡ xÿÇÜEÀ4Müa?ÉMI÷Ÿ2È´gÜ(HÊ€VC&HÅRØ!Û]ö#û0Ix7ÿFþ#þñ/ˆAü {´ÿ–ƒ«««ã…^ ¹¹¹ÿÀ™hñ/þÅ~²Cÿ¡$p‡éEÞ ;`S6®ŒÚúZâUÜ8Å€“-‰ŽÅ IDATp(+.£¶­Ö/\Œ;F¢ÃûIÈ#þñ/ˆ!_ügêqüì畃C¯2xZüç‰ÿ~¨¯¯gÕªUh­)..î»Üÿâ_üç-;ô/€Jš\âÇ»Â0Ð µ-µPAn>OÏD!ÚÝ®öÝZw8`Ø»ù3ÞOv¿‚øÄ¿ þ…íÿáã/£¬¬ŒÕ«W÷ÝÏS^Oßéhñ?ÂýŸ‰&ÖÃ)0}útLÓÿùînÿ=öât³Cÿ£#ﮨE'nв²2hB@ Г*&á÷ûÝmRà÷û™T1ÉÝ®ÄÛ¶Íû¬ãí«ÓÛ· þñ/ˆaÄú¿qÚé|îsŸãäó¯eåÊ•ïo.Jüç‰ÿÿAóywfxCCƒøÏgÿÏ£jü‹aÐþ%0É&îÈ@ËÊðƒ¿ÌO¨4E°iÉ&w~P¶w'îý®B¥!üe~ð{ŸÍFÿ´Ü4â_ÿB¾ù?«ko6ݹIñ7¢Äþû×ÚºôµGˆÅbÛߟøÏ+ÿ| -þóÜÿŽ6ÿ£û+²3þ%0ÂHx7­;üO1…Bn$¯Rñ€€÷ï  ÓÛ&Fn¨M. ˆ þñ/äÿ[?z“'OîõñÔý)%þóØÿ¿PEEEÌ›7gžy¦ÿ>ÌG‰ñ/ŒÖ︧^ünvÊcååUÕ£ƒ&;ôË©­)Z:Z f‰°s B`&vÂv#Æq·’H 7ùGÊÛ§ þ…¼ôÏc®ß–Ï·hñ?:ü_9œE‹qÈ!‡ôÝÇÿ¡8-þóÏ?ÀÆYºt)ýûïoŸ‚øòñ/þwÊžbäí•Å€L;Óoº•ü ÅÅÅ„ü!7BlCÈr3A½m`úM&ŒàF“crÈ!_ýÿhòI¹Ïý %þG‡ÿC=”/~ñ‹´¶¶ö» ñŸŸþ³ìÈ¿ þ…üEü‹ÿÑîßÊÛ+K¨]Z ~ "Å¢é(-«ZÜÊ¿—:Þ'Þ‡’Ü6v½MmªÖš”›Eü ùêÿÈ#„_<•ûlñ? üŸtÒIŒÙçhÒétoÿµKÅ>ú8î¸ã8øàƒ·ë_ÿB~"þÅ¿øÏç›Pļ+,:Àö»! "…·w'áýÛû½?ìw‡ýyŸyûÄ¿—þOìÆî•}»L‹ÿÑá¿««‹eóÿÆ’%K~;ŠÿüótuuíØ¿ þ…¼Dü‹ñŸÏ# {ˆ/)÷%Ðòn D€b°±Ý!a€²Ý¹b]Þ6åÞg²ŸÄ¿ßþÏv׊ÿ£Çÿ”ïŸÎ û†iš}?{ švñŸ—þÖÖVæÍ›ÇÖ­[û÷/ˆ!oÿâ_üç{ »ÔSwîW¨‚ˆÁn³{-í)‰-ŒºÛš¸=?Þa‚øÄ¿þðÞŸùöÄOöþÜÙh:žúX±b­­­´µµQSS#e%þ…Q„øÿâ?ß«Q”yÙ`Û€0˜1³Ü$»‘aÜ%¡"c"˜Í¦Û؆›!<éíCÿ‚øòÒÿMÿ¡øòbmŽbÇžû\Ñ#¬Y³¨¨¨àé§Ÿ–²ÿÂ("ÿâ_ü[y… ¯2Wä¾ì›öúvð…î&vÒ¦}I»; ¼ wÞX²ö³øÄ¿ þ…<óÔ׎â„Ù³!2–¶¶6î{ü )+ñ/ŒŽ:Jü‹ñŸÿ€÷PŠÆ|àç'U—‚B0ÒnD'ì@§÷·h :½ à{Òû#þñ/ˆ!ŸüêÏWñÛ¦¸¸˜±cÇJ9‰a‹Åxîé§Å¿øÕþ­Qq•q¯BgAÊNAŠÃÅ´·´îºÐí-í¤ÚSÐåm+s?Å¿ þñ/ä¥ÿÙ€ŸÍ<»ïgf¡Y" ñ/ä#ï¾û.˜¦ÉĉÅ¿ø•Œž/ø 4E¸Ã< ½—‚ãýÍð~ßéý¾X.7¿øÄ¿ þñ/ˆ!_8ÿä}õgœA8æø{¯ÿ£ØÿM7ÝÄóoµŒJߣ뢧¡)Jp3€g¯>ûï6ïG?‰Aü â_ÿ‚øò¼u€Äÿ¨äÎkÏ×Ë–-ãþ'Þµ¾­Quµ«QLC£p£¾=_ŽÜüâ_ü‹ñ/þñ/ˆ!¦Ôóÿ£™—_~™X,0ªË`t~Ùg¡û}Èœñ/ˆAü â_ÿ‚ø äS¼Ì°6°Vn~ñ/ˆAü â_ÿ‚ø!?™€f‚7Hÿ‚øÄ¿ þñ/ˆAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAñ\xÊþúœÏN×Râ_ÿ‚øÄ¿ ‚ ä;j´^øþk–ž0a¶mÓÙÙÉ}¿¡äë þñ/ˆAü ‚ B¾bŒæ—ÿ¸qã˜1ceeeœ={é ÿ‚øÄ¿ þAAùÂy'ÍÔ“'O¦ººšòòr ©©©¡´´”S«‘J€øÄ¿ þ…Qäÿñ¬”‚ ‚ò‘‹N?Xwuu±hÑ"lÛ&‰`---$“Iâñ¸|#Ä¿ þñ/Œÿg~õfõÕïÞ'AAùÊøñã?~<ë××  ø|>ÇáùçQ^^ΗN=PzÄ¿ þñ/ä©ÿË®yXráO¥á/‚ ŒJFÍ ðʯ¯'OžL*•" RRRBAAÉd’¦¦&‚Á MMM444ÐØØÈÃY$•ñ/ˆAü yæÿkß{@üŽBÿ_ÿþ¯Å»ø°FÃE^~þÑzüøñ 8ŽƒÖšÂÂBÊÊÊØºu+Á`1cÆN§å›!þñ/ä¹ÿÓ/ºQ*„£Ìÿß¼KœRÿÂèäÖ_{^¶aTL())!H$Èd2ø|>†á^¾ã8LØk/*++),,¤¼¼\²‹ñ/þ…<õî×oS'Ÿ­T G¡aôúÿÍÏ¿!ÏuAFÁ€o}麸¸˜––Òé4%%%„B!ŠŠŠðûýh­Éd2d::3f ‰D‚P(D0”o‡øÄ¿Gþr×ÿI£_ü â_aT“÷# PJ¡”"•JÑÔÔDcc#Zk´Ö$ ´ÖضMCCÉd€I“&I/ øÿâ_ÈÿRùÿR"â_A#B¡+V¬ ¡¡X,Faa!~¿Ÿx<Žã8ضM*•¢­­E‹±páB|>Ó¦M£¨¨H¾!â_ÈcÿŸ¿à'ýV ¿ñ?Óâ?üßÿÄ›Rùÿ‚øAò=ðË뿤;::H&“¼óÎFj; 2ØÄ¤I“PJ ‰F£d2êêêxþù—Y¾Éab)†ÁÞ{ï-ßñ/ä¡ÿ3¿zóv+„÷<:_*Œyâ_*ÿâ_JCü ‚ 9òz @v¹§ýöÛY³ª(À˜1¡P¨; ´RŠX,ÆÆ˜Ucò‘Œ¥¦¦†ñãÇóãoþ— ÿBù¿ãá—¤B8Šü â_ÿ‚ B޼J¥˜2™ “&MÂï÷ …¨®®¦¬¬Œd2I  ¡¡êêjŠ‹‹)..ƶmb±‰D‚®®.ù–ˆ!ü_þ£ßJep”ùÄ¿ þA„Q(**¶m´Ö1~üxlÛÆ0 "‘ûî»/µµµ455aš&J)Âá0¦i’Éd¸þ;§êÞö¤4òÔÿù—ßÙËíß~÷c-þóÏ¿0º¸è;÷Ê=+þñ/‚ Œ†À/ýœ6MŸÏ‡ßï'•Jaš&àÎ …Bh­1M“ÂÂB¢Ñ(cÆŒ!™LbY©TŠt:M8F"Éùéúáçô[AÈf†ꑟjñŸþ?íJ© Ž2ÿ‚øÄ¿ ‚0JZk"‘………ø|>LÓIJ,Âápw£Àï÷SXXHÕôÏöj¬~ë:»V¸mÛ„B!~ðÏêîyVyäGˆÿ<ñ/Œ>ÿ‚øÄ¿ ‚З¼\ ;ÄÛ²,ü~?%%%”••QTTDQQ”••QPP@xüÑ}uÓ=Si­»™LFæ‚ç™ÿšOÝacþ“ÿým%þóÿ0úü â_ÿ‚ B_òr@:î~8Žƒßï'‰ðûýC! ¿'•ÚîK$ûÐÔÔ$ß–<ò¿3• ñ?òý £Ó¿ þñ/‚ Œ‚@WWÉd’®®.,˶m|>_÷p`ÃïÇðûQÖÀ—oYétºû§³³S¾-yäg*âäûFŸAü â_A%€ÎÎN:::…Bø|>B^ov8·/Ä,(Aé×xw‡äÿ·wçQU׉ÿÇ_vDÄ×Ü-5+ÛœlÚÍ´[¦Å¬i¯i¯oeÙjSM™•VfZV6¥–¥©­î;ˆŠ"ûráÂ…ËöþýÑèOÇ î}>Î霎Üíóy¾ïö¾ŸÅé”Óé<ð%®Ó¿®èï:ýá^ýAÐp8—ÜNÊn·«¸¸X%%%*++SEE…ªªªTYYùÇÑý+*$ÉòPuÉFó¿×߸ü}³ÿ,ûO#æííÍhq¡þµU)æx·óé;ÿ4ôwþ[ÿcX3îÕÿÝ—n£9ýA¸‘‹FF™göÀq¸äååå²Ûí Ö÷k é­Ò{uÏ gÊÏÏOž^^ªu–ÉÔÔ¨ÖéTEÎo¦¶¦F~a픵+Y¯}ð“Z·n­ììõ‰®’Óéd3bì<Ë7Òß•úÃýúÃ=û?úÒœ±…þ ?€£pÉ-²²r8Ú™¨qãÆiÔ¨Q¹¹¹‡\&((HÕÕÕúõ×_«µ»ìÌ*Ò.ÐÓŠ™už˜9s¦¡ËžÎVÿå’Çxøá‡ÍW\¡ììlÍ›7OQQQ²,KÆ©  @žžžN gY–òòòTTT$cŒÒÒÒ”ššªŒŒ ]pÁŠŒŒÔ¾}ûÌ”)Sø@¸@ÿ_½j¼½½5ì‚ÛØô£>20`ý] ÿìÙ³Í5×\C?À€+.ÔСC =zÈßß_Ó¦M“ÃáÐÞ½{5iüP•••øB`·ÛU[[«òòrÝpY?½÷ùŠŽŽV«V­t×]w)66V•••:t(£…þp±þßÍ{Îìï_QQ¡÷>ß èèhýöÛoôw±þgŸ}¶Yºt)“À­¹Ü.>ú¨)--Uuuµ***T[[«ÓN;MEEEÿ—î*..Vaa¡ e³Ù”——§´´4åçç+;;[ ‹TQQ‘N;í4ÕÖÖª¢¢BÕÕÕ*--Õ£>ʦ¤ôýÑBû¿÷òdóÁkwÖ«£Íf3ü±¡¿{¢?ýéOúÃÕ¸ÜmÚ´‘ŸŸŸ¦OŸ®!C†¨ªªJ_~ù¥Îì¤ÜÜ\yzzÊ××W’dY–œN§œÿ=—§§§$i`¼¥/¿üRÊÊÊÒêÕ«Õ¥KµiÓ†CÐ-¼ÿ´'ÿf,ËÒO|pÔ-–,Yb¼½½5}útú»!úÓŸþô§?\•Kmù /˜ë®»N>>>Ú¼y³æÏŸ¯üü|9NõíT­’’Y–%???yxxÈßß_v»]žžžª­­•$yxx¨¢¢B» Cäëë«ððp]qÅêÛ·¯*++5kÖ,=ðÀlFJÐÍLnn®¡?NÄ#“ÿbèOÿ§__xX_›ÍfèOÿvíÚÑ.Ã¥¶ˆˆˆP`` ‡‚ƒƒ5lØ0-X°@¾åIÚ»×O6éõððÍf“$•——ËÛÛ[ÞÞÞª©©QEE…J3¶Ê;î, 6LÁÁÁª©©Q`` """5ôýÑ Ñ'ª´´”þnìÙ7õË]HHˆ%I|ð›»q€ €fèÎ;ï4 š7ožŒ1Љ‰Q~~¾*++USV&›­Fqq¾òöö–ÃáÓéTyy¹jjj$I¾¾¾ ———<<\ñññzã7tÖYg©K—.ò÷÷×ÚµkµfÍùûû+'ÇG™™™êر£bccõîK/¨]»vêÝ»·–/xÅ$''ë–§óÁ€þhAèÿuá…ÒŸþ‡õ1b}L47Sgbbbª”uŸ))Ë_kÖ¬ÑcwŒQuuµöìÙ£!C†˜ÂÂBùøøèÞ§?¶z÷î­³.½]ù›dŒQ||¼*++õÛo¿)))Iyyy¾4úúúšœœÝqÇ–$=|Ûh³gÏÅÄÄhĈZüɳæ/ãáCýÑBÐÿ«Û«¬^»ÓПþ÷ÀÕ´ø7¸¯?zÊ„„„¨ªªJ¥¥¥JKKSPP¢¢¢­€€íßÔ733S[¶lÑòåËõì³Ï*00Pk×®Õ'Ÿ|¢óÏ?_»víÒƒÏÍ«ó:yôö LXX˜:uê¤V­ZiÉ’%zuæ >4Ð-€}ï Cœ(úã`w_†¡?ýY˜hD¯=5ÑÄÄÄÈÏÏO>>>JJJRmm­RSS•››«V­Z)$$D±±±2dˆåáá!cŒ^xáÝpà òññѶmÛ´yóf½ôî²^ÏÞ¹IHH$]~ã³¼üÉý_~ïÇC¬[:ÃÐßõúßùÄ'µ®×-aè“EÐ’´È]¾m´ñööVqq±ìv»V­Z¥7fÿzÄ^÷ý}”ÉÍÍUtt´¢££Õ¶m[ÅÆÆÊÓÓSÙÙÙ*++“Óé<©ÇóÈ‹Ÿó¡¯™ö—¤gßdIÒ÷ŸM5ôwþ'ûåÿ¸xë¹› ýAà.ZÔ—ñénzõê¥êêjùøø(==]oÏ]]çexhÒù&**JUUUÊÏÏWmm­üýý®Õ«W«S§N ’$ÝûôÇ|¨£?šiÿ'§ý§Aú<}牢þ8ØË]mèOÖýA€ €fàŒSM›6m &ÔcîÁ±æºë®SÛÈHíÞ¹Sï¿ÿ¾n½õVåææ*88Xaaa ‹Ž–|ºIÎd¥&%iûöíâ`Oô§DËï¿_uÑ:S×þqý/§½H^õ‰9¸¿eyÒÝ û‡w9îôý—Ô¢vX±ÉnIö¹­ÜÜ\ùùùÉ3¸òò~•¯¯¯ /»Ý®ÚÚZ•åå) ¬VµÇ=å$/6éééÚ¾}»®½ãÕz¿@ì\3Ï,X°@kÖ¬QTTÔc„„„ÈÃÃCN§Sv»]L™Ë‹ýÑHý÷«Oÿ†@ÿæÏ××÷þ ‰þ-§c ?ýéß¼u:¾Q×ý‹Œ7ôGsà6ƒìÉ».2žžžŠŽŽV‡ôí·ßjÒ¤I*..Vjjª–/_®Î;+ @6›M>>>r8jÕª•ÂÃÃ5`ÀµjÕJ­ZµRAAòòòäp8$騿 OŸz‹‘¤ &H’ÊË˵k×.Í™3GÆ Ó–-[Ô¾}{uíÚUmÛ¶•Ýn—ÝnWEE…*++UYY)§Ó)Ýx 4€YÓþaèýÖþðŽ©Oÿý[¬øêUC×4õ¡qæàþw?õÑ ­{ú·üþ's|úÓŸþ8’9ÿ¾ÏÐ.?ðÁkw___ÅÇÇ«ººZ555üû(""B×]wœN§üq1BòòòÒÎ;ë½™ï×7¯ô˯óËÂ×M`` TQQ¡%K–¨[·n*,,ÔÊ•+5ã³uG½¯»¯?ÃHR§NÔ¯_?µoß^ÞÞÞJLLÔ²eË”™™©yßí´$)uãÆÃÃCûöíÓúõë•­«®ºJ¡¡¡Ú»w¯Ö¬Y£üü|Mœ8QPw°ÌÄoÌþÿ¯©©9pêºüü|µiÓæ°£Ü7gMÙ¿.RÖ}fèï¾ýÿ×G¯ßmèï¾ýëâX§÷ºûú3 ý]»}ÐÿĽúĵ†þôoÉýë3Nè—›x÷¥ÛÌøñãÕ*4Tûö)''G[·nUvv¶œN§ÊÊʦ·ßž¥)S×ÅoRrr’f¾ú¢î¾ûn¥¦¦jÁ‚ÊÉÉQçÎU[[«V­Z),,L7ÜóÆa÷oõ6’£ØØXuéÒEg\|÷!—ûêƒ'L@@€(˲´nÝ:-Y²D]ºtQbb¢:uê¤ÔÔT½öÁOÇ\ÏÞ¹‘$OOO…„„(--M6›M½zõRaa¡<==Õ£GÈÓÓSÁÁÁºüÆg­¾Ê„††êï÷ýÛ’þ8…Ù™gž©ˆˆíÙ³G§ýeòQï7mÓ—fýúõúí·ßÔ¡CEEEÉáp(%%EO½öu³{!ø3û?ýúÂc®¢=K ý]«ÿɘñâ$C÷í²št¾¡¿ûö?ØÿÝs‰¡ÿÉÉÞ¾ÈПþ-±}mZ1Óœhÿ+þ>… 4¯ €/g>f† ¦vݺKö½ýæ›ÊËËSqqñg¬.iÎ=÷\•””¨´´T/ÎXjIÒÙÛ˜óÎ;OÅÅÅêÓ§ÊÊÊT[[«àà`µnÝZ;wîÔîÝ»U]]­²²2•––êœsÎQß¾}• ôôtegg«°°PÛ·oWff¦<<<Ôºukµk×NéééòññÑ Aƒtæ™g*ªW?å§l×·ß~[¯}º¾m´ÉÉÉÑE]¤Þ½{+))I[¶lQAAZ·n}ÈQÊW/yÛtïÞ]Á1gø·ÙoÜcúô风;Öù`#½~·‰WMM222”}›§6´æÐø˜;޹.ž{p¬¡¿ëôÿ÷œßOjÙ÷nùÊпeõsõcÍbyéïÞýþqþ ‡þôoIýOÔ‰ôšÍÀC“Î7={öTÛ¶mÕ±cGÕÖÖÊn·kË–-JmÄnð IDATNNÖ´Y+zÛw]7ÒŒ9Rv»]ï|íËM¼¸¹á†ûÿýWn7:uRNNŽŠŠŠ”––¦’’ÙívõèÑC£F’–-[¦ÊÊJ=öò—G½ÿG&ÿÅôë×OÆ “²³³µ`Á1B;vìPiiiNöÖs7™=zh×®]òññÑÚµkõ¯>ìz¿y¯9ÿüó{¢ôúÝfðàÁJ8uB½:dlý)--Õ¾}û”™™yB£;Y͹ÿƒÏÍ;æú ¿ëôŸ>oÍ -ûg32ô?yßÎbšºÿÕ“_n”åýñË— ýO̦3 ýÝ·Ci‰ýϼäžc^–þ'ßÿàuÙXý›Ú‰öÊ Ÿ ¦¦F;v”¿¿¿V­Z¥ÌÌL=þÊ‚ãäë.ék¨ÔÔTíÞ½û°¿ûøøÈÇÇç°¿áž7¬w^¸ÕtíÚUQQQŠ‹‹ÓÖ­[U\V¦¬¬,½ùæ›êÔ©“ž{ÉqÎÌÌ”ŸŸŸ %I©©©*,,”ÃáЈ#®óÎ;ÏDDD¨¢¢Bú^rÈmÞ9ñt,½óÎ;2Æè“ÅÉG½_»Ý®ÊÊÊÃþ=99Yyyyúêƒ'ÌÅŸªó‹@TyÓ4ááá ×·s§˜ÑW=ܤ/"ô§sèÿð?"Ì”}Sïc…пaŒ¾êaëÝ—n3MÙ¿±4uÿýÜ[rÿýN9ãú:ÝsîÖ¥÷¶ é›ú7–ÔÒC3ê´Î׿¾\½ÿѾüK’«|ù?™þ@C©÷üøÍ{MçÎ5cÆ uèÐAϼ±¨^·ñõGO™ŒŒ ­ZµJ³l>ìºÜ|Ž3fÌ_®¿ôÓ®];¨oß¾ ’ÍfÓªU«4uú÷V]ÿîÝ»©„„Ùl6mß¾]………êׯŸ $§Ó©ððpµíÚURg•íûI­£FZ·^5Ä)..N úꫯŽùKÇ~ï¿r»=z´:ô¼ð°Ë^~vœ2dˆ.ºè"µiÓF‘ Ôy}N?Ô´jÕJÑÑÑ SUUU£ï'EúÓß}ûŸ¬†ê_—ɆúxhÒù¦±ú×UööE†þNÿº ãk ý_xç‡f±Ž]±?€¦ãQŸ ¿ùì¦{÷îJLLT›6mêýáÑœgŒÃáÐÞ½{øæ/IN§SÞÞÞG¼~`` ÒÓÓUXX¨ 6(##C‘‘‘:ãŒ3ôÃüÌÑî÷é{/5½~·Y·t†9ï¼ó4dÈ¥¥¥iýúõÚ¾}»¦+V(~àX«ç°k¬vÝF[ë–.•)Z§yúøÍ{͘1c4dÈÅÄÄhþüùu~ó·Ùlª¨¨8âßbbbäp8”žž®õë×ëíço6u]Ÿo}²Êzù½­¼¼<µiÓFÆM?Ô<þ Mc úÓ¿%ö—þØÜŽþ'ßÿd®ßýŸ¸ó¯ ¶Œ×_zŠiÌþu™pÕœû7„¿^û„5é¡Vsê_WoÏ]mÑ¿qµ„þÍ…+öÐtêôöêךàà`EEE)%%EÅÅÅúçóŸÖëÍoÆ‹“LëÖ­µoß>Ý÷Ìœ£^÷ýWn7}ûöÕ sn®Óí?y×E¦´´T§Ÿ~ºrssµvíZMŸ·Æºô¬ÓµkW [gM¼¸‰ŠŠÒi§¦ììlIRFF†þöiîïš {švíÚ)11Q&LPÛ®C%åjãÆ®s°)\a,ËR¯^½´nÝ:-^¼Xòññ‘¯¯¯úõë§þýûkοãÌ„Û^:êrmÚ´IÇ]ŽøøxÅÄĨ8íGsð)cêãöGß·$iûïsL`` žÿç•fË–-úxaR½nþô§?ý¢}œLÿ &èüqó1ÞsÙ&11Q MÖ¿)5Vÿ)\a~a¾Ëôÿö÷Ü^–äädú7£þpþþä €ÿ»ç®;wª°°Pyyy:Ñ'ÿ¯‹Þ0:u’Íf;äÃøÑŒ7N111òñùÔÌþ&ñ˜—ñ‘ñ&$$DC‡Õwß}§¹sçjôèÑ*))‘¿¿¿¼½½õ܃cMjjª¦Ï[cÍþ&Ñzåñ&==]½zõ’œYJÞ¸QEEEúæçÌ÷õíÜ)¦¼¼\^^^²,K¥¥¥úí·ßôá¶þÿËüþƒî½±Æ)((è˜Ë4räHuêÔI3¿ÜtÌËy{{+==]ñññ²ï]a£Ï8áÜ„S'X™‰ß˜   ýGÕ5u} ?ýéßpý¿_S`iÍñ'\µÿ° n¯óuO¶ÿ¼éšýý===•ššªýý%)**JMÝÿÏÐ\ú×WSôåýå'µ,ßþžkÑÿÏï×ëÆqõ˜¦¾“@pà €éSo1½zõ’ÓéÔ–-[Nú´§~ºÖ¯^-§ÓY§ËßñØLkù‚WL@@€Ž÷æ?zôhEFFJ’úõë§‚‚»eªuû5ÃÌ!C«.]º(==]áááfÛ¶mºçÿf[¯=5Ñ$''ËétjÙ²eJII9p»Ÿ¼u¿©¨¨P\\œBCCõóÏ?ëh³û/¿÷cÖM¯^½tÊ)§HzíØË4c©õÈdÓ½{wùúúžtÜ=/´2¿1—]v™Ú¶m«ÌÌLóã†âc>fúÓŸþ Û¿®\µÿº¥3ÌÀ³o²èß´šCÿújŠþ õXéÿçõ‡köGÃKÝø…ùé§ŸêÔn:pëUCÌСCÕ³gOmÞ¼Y7ÝÿVà OO•””ÔëöüýýÕ©S'IkŽø÷7Ÿ½ÑôíÛW^^^Z²d‰¼¼¼TRRràðoÌþÕºËËËDGG«cÇŽ’¤üü|yyyiÁòtµjÕJYYYÊÎÎÖÎ;5gÑvK’¦>4ÎääähäÈ‘¶ÿ\á'#//O^^^uºì³o.¶N9åÞ`o)ß›¾}ûjìØ±úqûG¼ýéOÿÆé_®Ú¿>ܹc| øSûŸ€Æîïn_]±ÿäGÞ㋌‹öGà ÔñúÃ'n½jˆ‰W=´gÏíÚµ«An|ãò÷©¨¨ó¯ûµnÝZmÚ´9êß³³³åãã£ŠŠ ÝñØÌ#¾PhÙ²e •eY2Æø0·qãFmÛ¶MeeeÊÈÈ8ä‹ZPPvìØ¡°°0%&&jÙ²e'½ UUUUçËgee©  @Ÿ¿÷ˆ9Ò‘©ë+,þ\kÝÒ&!!A·Œl¦Ï[#tú7nÿ[œnéÁéôwÓþõE÷+ôïwæ õ~üÝ¿¥héýOT]úÃuû£iûÃÍ'Z·n­nݺiÆ z”爈ˆ¿²Ô‡ÓéTeeåQÿ^—ƒQ=ûæbK’.?;ÎX–¥èèh½þÑ/–$ :T{öìQUU•úôé£Å¿åH’^zw™%ýq  òòrmݺU?m);éõaŒ9ê¹m¤¢¢B?ÿü³V­ZÕ`¡ž}“µì‹—Ltt´uY¯µ»jyÃ¥ãõ¯/úÓŸþîÛ¿ùóç·øþ™‰ß˜=/´šSÿ–¢¥÷?Q Ñ-·?š¶?Ð(ömûÚ,ùôùzŸŠä»yÏ™n>§N×{ýéëÍÓ÷^jn¾r¹ò¼.uºÎÜ·0?}ýšùþ³©æÓwþÙè§ñyæ¾Ë̦3ëu?×\ØÓüõôŽæ¾¿jÐÇ7iüP30ÞÓпéúŸúÓŸþîÛ_’èßxý[Âç§–ÞÿDÕ§?\¯?è¦áј7¾råJ¥¥¥Õë:kxÇ$%%ÕùzmÛ¶ÕðáÃÕ«W/effÖé:ÙÙÙêÛ·¯Î¹âŸÐ²ÝxyóÌ}—Õé‰TRR¢äääzݾ¯¯¯FŽ©K.¹¤A›¼õÉ*k]JM“ÌòÒÿÄÑŸþôoœþWÝú‚uú_ï´Îû uåÍÏ[ͱÿ—÷7ôo¼þ чþÇöÉ[÷›/N2Ù®Õ®Ón<ðêך… ê‹/¾¨×õöìÙ£´´4ÍûnçqéœßgÆÝò„N?ýt…††***ªN÷ I»÷Ÿ"¥Þ  èã7ï=î ܲe?ê—_~©×í¿÷ù+88X²ï]Ñâ^DérèOú7Nÿ†@úÓÿÏïÏGx×ê éx5Ö 5J;wÖÅŸª×lÓØ›ž«Óåç¾ý€éÞ½»T²CëÖ­SYY™æ~»£N×­¬¬Tee¥Ò6mREEÅ -_ûöí¨ž={Jzù˜—µ,Ðý¤¤¤ÈËËKÆ kq‹þ'þô§Ã÷oô§?ýÿüþ¦xƒYõÛo:uômMú«æï?j.»á™F¿Ï÷_¹Ý 6L §N°Ü¡]íïßoÀýý›JKí–¡Q¶øþ³©¦¨¨H‰‰‰öÀÛµk§¨¨(%nݪ;wêÖ¾Sç'Hzzº~øáýòË/Ú¶mÛ1/û܃cÍþÿþ÷ËnxÆÚ¾}»rrr”²î³cÎD¯ÙYcMŸ·¦ÞOà©Ó¿·’““µeË–5¨èß0èOú7|ÿú ¿{÷?xпùöolGê?ãÅIfÕwo5êVô?²«n}ÁêÖVSõÿ³´Äþpó €üü|mÚ´I©©©öÀãããUUU¥ÄÄDíٳ翽øÈxóÔÝ›»¯?ãˆ/ÎyyyJJJÒºuë´zõê£ÞÇg32;wVÏž=ÕµkW}ýÑSægn8p›7Ýÿ–e·Û®ú䯮222”˜˜¨oçN1©¿h›¼ÑŸþ͹ÿÔéß[ãn™j]=ùeë¾gæXôw½þ u?MýÌ¢¿ûö—¤¯>xÂПþGë_œö£¡Óö߯×ðk­kïxÕjÌþuA0 iúÔ[L^^žvïÞ­ùÕ».V|õª Raa¡ÒÒÒôø+ ÜÏãÿ¸Ð„……©M›6 ÑC“Î?ìI§‘#GêÊ+¯TïÞ½x‹æeÑŸþô§?ýÿüþÇÒý'{û"C´D ~ €ÚÚZ«¤¤¤ÑtXX˜¼¼¼T\\¬ƒÁ{ìŽ1&>>^½{÷VPPœN§RRRôRX˜9ørÞÞÞŠˆˆPÏa—è÷ß?ä¶½ýÓ¡CEDD(®ÿ ÉaW^^ž‚ƒƒe·Û¬öíÛ¸üå7>k­úî-¡ØØØFYÞÿ¬Ì°þ³ò#驚ý€¢?ý›{ÿº ËíßèOúÓŸþ~ÿci¬þÇ’––&úƒ I“šÑ¨³oóß}Ø„††ªººú°MŒäíí­Î;ËËËK­CBÔ«OýòÓOzýi_sÇc3-IjݺµBCCµö‡9JJJ:pýûþ>ÊôìÙS=zôPŸ>}$uTÞ¾¥r8’¤   •––ªS§N‡ÜïæÍ›5|øp………¹ý€¢?ý›[+¸½ÓÀ³o²Œ©2ôoYý¯žür£ÜÿY—Þk-_ðŠ¡?ýéOúÿ9ýgâ¯5ùýÓ-•GK{ÀÁÁÁòððPqq±òóóù[`` |||TTT¤ÚÚZ•ÛíRP„†¹C§žzª^úz#ýqðY³féÃ?<ð¤}dò_L·nÝÔ»woEDDÈ3l°¤B9•••É£ªª*åååiÇŽ‡Üoaa¡233åp8ôü?¯d?ú£™ô?‘/ÿûY–·Eÿ–Õ¿1ÑŸþô§?ýA¸¯–ö€1²,Kååå*++;äoÛ·oWDD„Š‹‹UTT$ùfe©s¿~tÖYÊÉÉÑKN0~~~:õÔSUUU¥Ž;ª_¿~fóæÍêß¿¿"##Õ¶k/Ie*ÍØ®šš­Y³F;w–ÓéTQQ‘ž~}á!_*öíÛ§ððp•——ÿ÷üâhîýoô}ëÐ/{ý]°ÿÉ¢ËéÑßžlÔ_Îû õä]úÓŸþô§?è&šò{yɲ,eff¶ŸQqq±<<<”••%???UWW«¸¸X))jݺµºwï®5kÖ(&&F²,K{ýU¥¥¥Ú°aƒ‡Úvì(É_ÕùÛ”ŸŸ¯ÒÒRUWW«ººZ%%%ÊÊÊ:ì1¥¥¥É², 0@N§“QÕŒû_xÍãGüðÌ‹¬gÞX$S¶ÅÐß5ú<û¦“þ@?p¬õÂÃWú7ÿþMþô§?ýéïžn7ØüïÁ é–ªÅMWùûûkß¾}JII9ìnϾ¹ØÚp˜êêjUUU)88X‡C[·nUqq±BCC¯è>[Q½/²,˲z»Æª¨¨PTT”òöíÓ¶_)99YµµµÚºu«¼¼¼d·ÛUTTtÄ#›æææÊáphÇŽÊÌÌdT5ãþÇC×éß:éßüû7úÓŸþô§¿{¢?˜øeeei÷îÝZ·n–­·öd¼ëÉ-›Í¦ÌÌL%''+??_ùùùÚ±c‡l6›6lØ £þ~Øõ^¹Âòöö>°ÿpII‰V®\©ÂÂB………)''G¥¥¥G|L¿%9­ªª*¥§§k×®]ŒªfÚÐ97÷ávÝF[ôwþ …þ-§ÿŸþô§?ýéïžè–ªÅí°mÛ6•••v؃¥¥¥É××WAAAZ´h‘bcc•““#»Ý®Ñ£GkÖ‚ÍG½m???ÕÖÖ*33SÆ………iÏž=Ú²eË1U¬ªª’———¾_S`1¬šgÿºÊËË£¿ ôo(ôoAýÿ ô§?ýéO÷D´D-n°N¾ú4“’’¢oÏ=æcŸxqãã㣪ª*…‡‡«ººZ¥¥¥zwþú£^ïŽk‡›àà` 4Hv»]………***ÒªU«T^^®åKxr·àþÓf­¬S¿³7ôoùý?øjKƒôúËi†þ-«?èú\d >&\`<<zýnö¦?èú¸4·ÝÀápè»… ¬ÈÈHFýAÐn૞0O|Š­>èL¸“ 6(//OžžžŠŠŠb$Ðôýá&ý'_}šñôôÔ¿>ü™/‚ô&ÜÁîÝ»5vìXµjÕJÏ=÷#þ ?è7럘˜h~X[È—@úà 3(”þ€»™öäßÌ-ã³ÿ'ýAÐôýAÀåy¹óÂÿôÓOr8|ôýAÐôý22¶êIDAT4ÿ¡Û¤ ‹ ¯\IEND®B`‚plee-the-bear-20251226/bear-engine/doc/examples/12-shader/000077500000000000000000000000001512343254000226155ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/doc/examples/12-shader/CMakeLists.txt000066400000000000000000000031331512343254000253550ustar00rootroot00000000000000cmake_minimum_required(VERSION 2.8) #------------------------------------------------------------------------------- # Find the root directory of the source of the Bear Engine. This directory # contain the bear-engine and bear-factory project directories. if( NOT DEFINED BEAR_ROOT_DIRECTORY OR NOT IS_DIRECTORY "${BEAR_ROOT_DIRECTORY}/bear-engine" ) message( FATAL_ERROR "I can't find the Bear Engine. Please set BEAR_ROOT_DIRECTORY to the path of the engine's root:\n cmake . -DBEAR_ROOT_DIRECTORY=/home/joe/dev/bear\nCurrent path is \"${BEAR_ROOT_DIRECTORY}\" and it doesn't contain a bear-engine directory." ) endif() # The engine comes with some CMake scripts to ease its configuration and usage. # These scripts are in the directory below and must be assigned to # CMAKE_MODULE_PATH in order to be found by the upcoming include() instructions set( CMAKE_MODULE_PATH "${BEAR_ROOT_DIRECTORY}/cmake-helper" ) # This will sets the variables of the source directories, required by the CMake # package below. include( "bear-config" ) #------------------------------------------------------------------------------- # Include Bear Engine's CMake package to find the libraries, the link paths and # the and include paths required by the engine. find_package( bear ) include_directories( ${BEAR_ENGINE_INCLUDE_DIRECTORY} ) #------------------------------------------------------------------------------- # Now we can describe our project. set( TARGET_NAME ex-shader ) file( GLOB SOURCES *.cpp ) add_executable( ${TARGET_NAME} ${SOURCES} ) target_link_libraries( ${TARGET_NAME} ${BEAR_ENGINE_LIBRARIES} ) plee-the-bear-20251226/bear-engine/doc/examples/12-shader/grayscale.frag000066400000000000000000000004201512343254000254240ustar00rootroot00000000000000uniform sampler2D texture; void main(void) { vec4 color = gl_Color * texture2D(texture, gl_TexCoord[0].st); float brightness = color.r * 0.2126 + color.g * 0.7152 + color.b * 0.0722; gl_FragColor = vec4( brightness, brightness, brightness, color.a ); } // main() plee-the-bear-20251226/bear-engine/doc/examples/12-shader/hourglass.png000066400000000000000000000150171512343254000253360ustar00rootroot00000000000000‰PNG  IHDR9Aki )bKGDùC» pHYs  šœtIMEÝ 7.v T®tEXtCommentCreated with GIMPWwIDAThÞå›{´¥Euà»ê{sî=羺ûÞ¦º°!m7 ¦ A ‰2š`Bt’8.ÇÄ,åkI_$fåáÒ‘ñ91ŽÉ¨Kd£¸’¨#´ ¤Á~Ýî¾}ßçõ=ªjÏç6i ’Çšúç®SU·¾ý«½wU}õí-w}":«,ܽ#ͯŽÈŒ´ Ä©ÅOY¬ `„àYœCÄYŠ!qj¨dIÄâR‰APKð Æ"¢ Šª¡ôõ‚!'bq¥ÃFe¥c(+OY)E©4UP,>TÀU¼bâçýU¹û¥og'€}Å Ãa#‚1‚1-ÁNAE xCWBU¡àÔàTñ^qz¹’ؘåÅŠ´!aÔÒÏ=E%ôú%Â9ÃÜRElRú}G–%Á<¸ €!E4:øíˆµ”eÀ«ïÀ{%ˆà*E‚ÁE…“^pµ[þޝD±òRiwx'DXk0xld0€Š ( ï@=ˆQ²ØR:‡1† °°ìˆ#è9ƒHDð^p•#Š"æ+âÄRyKî ¯@z^_IcEŒÅ{"8ï0ï eÈ2Á0xJ7°ˆ çÚu ÎCPÄWô"ôKCYB”ò2 ý@šY$@)ˆJ bWøG5âƒ'CšÄfôûÝ^Ÿ$6D±ALD?w¥à/,sëWJŒ€b”ª4 ÈBU0 €B‰‚\E1PBP(< ( êçJY EA¡Zi@@rF€ÎAdÁðA©×,®ô¸ ŒµUÊJ(}ŽÁ0ÜjཧÛ-I!"Ç|;PK"z½’$‹È œ£àQ PVB¥àœ`D)+]ñ?‹¯ÎC¥à¼4(! d÷~²Ó“»‹Rw%âÕP:ð¥*¢‚($‰¡ðk!Š‹HðŠ¥¨¦íKŨAŒE–ÝÅãUÍTõVUÍVªjƘµÇÚs›æçç¯,ËòEÞûKœs;BÏöÞ?Ë97UE Ðét†UµÉ –K/½4ú“?ù“©êƪª.9V/"#‘óôN§s*`^úÒ—N=Fæ)æÇ¾ßÐÐPODÚ@}rrrçŠÌœä}Àï}·ÙlN[ V4íŒ1ËI’تªÒ4M#cL¦ª‰÷ÞŠÈ)"c–£(JOrxx89zôè\’$‘1fÀòòòäW\ñÏdMÓÔxöŠÌ'ù UýÙ$I–Š¢(€¥$I²ãüã‡Î¹™²,}Áöz=±ÖVƉãXT5‹ã؇ú'øÚ×¾Ö9r$ÛºuëÐ=VÉ%— ?ÑÇJQ'ÓÀÏß8QÈeÉ€~’$é›ßüæ´,Ëè8¿<,"ÒjµŠ‚o6›ðUUUÆ¿¸¸¸ Ñh,ä?øÁ$Itá…zàÈJõøË_þò¸Ûíþ3˲l2ÏóË')"¸øU}äºë®›Òã¿[UËn·›WU%eYªªR«ÕðÞ›ÑÑQáé•ôª«®²EQÌ‹HñññáË/¿|uUU?xŒŒQžçeš¦—w®È̉n!þK»ÝþA–e«ßò–·DÙ_¾Ùh4jišæI’ˆ÷>ʲ,íã™ÖS)ªê7nÜ8Ÿ¦éⱺ~ô£ëŒ1:66öÈñ}W¯^=Õjµö¯Z‘•†‘EU}°Õj콟»þúëǶlÙòè2~×]wÝ⦅õÞ HQ’e™8ç’§YÅx³Ù<""à¹Ï}îèÅ_¼ù3ŸùÌ×W| 8räÈáÅÅÅ3Tuˆ,þ¸qåIfvð{ï|ç¯ÌwÞó'~ø«EQI£QgãÆõ¬ZµiÃi§½êN î­^¯¯ÍfMVÌç+' ¹°°ŽŽVÇ~OOϾpjj|·ˆìûð‡_xcU…þöíÏOï»ïoß6>>ÄÖ­/å´Ó.['"Ÿ6ä è~èC¿ý¦¸GwìxŽÜwßß²víÆÆ4›±NM)gœñsôz=jµ5,-í§Ù̘™¹áá&ý¾cddø-N§BÌÑ£3¤iåå6"§Ÿþ,¾öµo°qã©=:Ïèè ³¬_éøáÃÓ/úÞ÷n;err-û÷Õ©©-â\NQ,‘¦£\}õŸ½KD®{2†'…Ìón–¦õ›n¸áŠßJX¿þtÚíDQÎÆkY·n‚$ÙÄ)§lÅ9%Š"D”……/â}9x‹÷µZʾ}3¤i‚1ç`y¹‡11UU’¦5FGÇxøá²~ý¹Üyçn††ÚX3?¿Äڵ率ÚµVã7þôÐÄĦ"R>ƒy²YÖȽw¿{íµÿã¯Cæç÷Ñl®Ç˜Ò´Æ¡C3´ÛqàÀt: ´ÛK8WE£”eÅêÕãt:=z½.ããk0&¢Óé#bH’”ÁÉMÈóЇz‘aœs u©×[,.z¦¦Î%„Š}ûöÐhÔôW~åíû'&6÷TŸä`ó÷·Zk^ùÚ×~ô{")33ÇÂâb‡ååcr&&k»4›-úý>ÎÑnwé÷ûLN®¡Ù<‰,³$I<¸™Ÿ'ŽcŠ¢¤Ù CC-ªªËôô÷Ed„³Ï¾Œ~–üÇ»¨ªRí×þðÈÆç?GD¦Ÿª¯Ë‰­~½á¢è}õÏÿü­ç†°_“i4êlÞ|2Þ· lÞ|N‹µkO¢Ýþ*³³›Ä¹œv» (Öj­gtô4ú YÖ ª3Ï|É×ëõÑ7ý$fù/ùO‹Ó¬dÙø[xàÏßsäÈßamFQ„P¡Q¯¯&„.½^“O¾„-[^ö¶vûÈ4›“úLÈcž‰Akµ ‘kµ)¬ÝÀÂÂ2iZ§ßwÌÍÍÓ릧Q#¬Y³ãË"rã3øŒA>:¸ÑçmÜxËË5”¥26¶‰U«Váœpúé¿À#|óÏx†Ë3 yòÉ¿xO¿_ÇÌa >Ü¥Ýî°¸Ø!8ï¼ß¼ëß5äà€ïÕ{h4†Pµ¬^=ÅÜÜ,EQjÅüK”è™\UG¢(.z½nšç}Ù·o†V+åÌ3O§ßŸ•Ÿ÷ªªF¹·š‘×ÏÌŒ½À9½'„@£Ñ`x¸A§ãPeû¾ðé¯ÇqüÛÏ´&åÒ oæDäfàð'?ùêw8ðýëFFÆõ¼ó®üßçœsåo‰ÔÆ~ðƒ¼bÓ¦MBx·µößþ¢ª¢ª·‹ÈÇÇÇÇý—¾tãeIâ¯k4@!çœsõÛº]ÿ,àð©§žúéûï¿Ñs‹ª^¸2Aÿ6!Uõ"à“À‹>ñ‰O¼ø `gggçî¿WïÀ½dYJšÖøÜç~g³µöˆª¦QÞ²e˯½öÚÿZůÿke¬;EU/RÕ[Þ÷®w½ë‚7¾ñ[—––Î*ŠâGµ›o~ݶ?ýÓ_ÔÛn{ý¶Ç¦œ L¨êUýUý¿:láBUý?ÓÓÓ7]yå•ÛŸóœçl:tèÐyeYN7õ²,/!œúÇ|Ùùÿø¯?¡ÏµZ­ÇÞ뎨ê®À^ø/º…„Ry÷ìììðË^ö²÷\~ùå þð‡7ŽwEäïW>«Å"riasERÅߎŽL 7žpÜ¥¥%·r÷:•¦é¡•»Ô7«êð{ªz%ð6)žQíyï‡Tõö›nºéU;wî<[U_Üét®TÕ©ãú\R–åuÞûß/ËòÚ^¯7v¬íúëÏ}ÏS0ÿÌÍÍýÌãÔ?WUÿZU‡žIó\§ªwlß¾ý’/ùËÏév»/QÕ‰cíwß}wä½užç¯é÷û飯ê÷¼÷šî§>õýÜç~ëÎ']›{¶ª¾Ö9wê〶TõU]÷Sß'CëUõ†3Î8ã»ví²Æ˜™V«õÝã^ !üŽsÎUU5’e™³ÖÞ%"·—ß»¸¸°mh¨!n¸êª¿ºþ‰žÕívëišž¦ªçGQô1ñmﮑý?Èüüe—]ö¦|àk7oÞ¼WDöüÓ»cÿÜ8ŽÕZÛuÎYkmZE?˲w}ñ‹¯ÒÉÉU[™Ý}ðàA&&Fˆ"«ËË9ÿüŸ?ÿ´ÓÞ¸ë L¶^Åkíº8Ž?ù8íMàÓÀ/?}JŸ n¾ùæïlذá¾3Ï<ÓÔjµ8Îÿ~És÷¾ïœ3@ªªÇñ®(Šn¸ýöWh¢è’çCC#TU…sÕõ¿þ럾቞ëœ;ED¶ªj/Š¢¯>Ž\/‘7ÿD‡Uݰ¸¸ø¬k®¹æoÎ>ûìF–e÷×öBçÜŽ²,—ÇqE‘clUU÷ÜqÇkvgY¢U•3>>ÆÚµ“Ôëql‰"óK?þB;Ú !lPÕÓŽ³¬Ñ•sñßëV>J=}ÈÂoßrË-ŸŸžžîE±çXtE»Ý> øï}áœK«ªJʲ´ª_«Õ¹ýö—ïNÓdkU25µ !Š Ýî2¬^½jç­·þ§óŸäù½Â#Þû‹¼÷«Wê–skV&ú¿×>mÈv»=º°°ð³×\sÍ€Žˆt޵Åq|y»ÝöµZMEÄGQ”eY¶EQ7I’{o¿ý?»^O¶ª£ªJ²ÌÐé,dž¥¥Yò¼ƒˆ½ñSŸºzÇÉ`­Ýc­U "rÞŠ†½ˆPUUÃóu`óÊ^zâ>Ùëõ~÷k_ûÚüòòò‡®¸âŠV½^Ÿ]™É¡²,ßÇqT º´4½)Ï|ÍÞ½Ȳefg¿«cc™„`¨×-ƒ×¬!æçHÓ!Ž™!„ÀÒR11Î]ÿú×ñ†'ãÒZ­Öé÷ûÛjµÚ"2«ª=UÝhŒù~á…"òlyÏ Aªj¤ª7?ïyÏ{ëW¾ò•Yý•a³1æEªÁcîÝû­—OOßÿóÝn›õë×03³›z}çºdÙÐ#Ž- ËœtÒóó] ZUU·V«Å­V‹³Î:kι Àð=UÝr¢«ë¹Ÿýìg¿ ø}ûö~|Ã7þê,,ÌnÊó%–—çh·—HÓ„zÝÐëÍ11ÑBD1¦¤VËX^n“$1õzv»Íèh‹¢è366Æøø8Ö¬5ŒOÐëµI¡^ÏäÁïßúÞ÷þò½++ê¼÷þpQ‹££££@røðaœsK¯{Ýë&nºé¦ï‰È¹Or%f4Û³gO¾cÇŽ3ï½÷Þ‰mÛ¶ÜpÃåÛj5¿½ßß/!ä„ÐcxxU!Š"ŽùµZŒ1ãã-:.ƵZA$ŒÐét©Õê¬];E¿ßEÄ04Tã”SÖ‚Òëuh6›ŒOÈÑ£³g½÷½/Ü–ç‹wEQ%Iâ’$y`xx¸øØÇ>6œe™œsÎ9É_üÅ_=Q¼kôÄWýµhÕªUSßüæ7uçΫ¾óï,®^=±ÛûG>LY&McªƹŠññ&EÑÇ{K¯7ðQçÝnZ­NE ³¸xˆùù4 òÜá}LQäyÎêÕˆÎåX »ß÷¾—n{Ã>ÿý•Ø¢UÖZ»iÓ¦‘~¿_lß¾}dnn®þ¤ûäß‚‡ëQ?Š„JYý¤ÿxåÃ÷|ìÿ¶«U›ZuíÔkùBaÖ^Pjzv§½,ëÖO1stŽ,nÑíöHC’DŒŽŽ²´¼HšF¤IÅ¥eÒ$Á%Ž#––;$qF¯—ƒ*yáQ„#G`~a™~?§ÙlÒíö16aq©ÃæIûÞ²,mZ[ÕÜýï1µî”t|¤ÞCÍï?ðíùóá•—í¹÷/oåR.ÀßöŠw³åžO™»Ë•Ȫ2d‘ƃŒœcŽ™³!Ž UYáW"ömdqÎcÄP:%ŽÕá‚ǹA°¾Š¢^^)*%M€ . ^èJ­Q•² ÄQ„óàœ¤fTŠS°&B5à}@$ƽ¾#ŽB&1ƒŒ"Ïù×¼WwEy®çûHˆcC^)¾äS”ê™Á;GP0!€1‚ a>a#ƒ$Õ@ÔŠ2€QG°@’DtÛqbQcqê(1”!`èwÖÒ8¦_ÊÒ#fðe:.Pª#McÒ,ei91h0tûŽ4‰p•G¤iö|èïŠú}È%@SU0ЊC¿€ÁUŠ×€¨`£ÁÌc)«©…ˆ"KYuз³b­!xav¾ ˺½ $ bÉÈ¥ta»UŒŠBé—"–(Jj,&5háèõ*œ:²8¦Ó¯¨‚RKc*_aÄ"ÖÐ-¯šÑrOIbAKOék@Ô+U¥ØÄ" y Ö®t(ðN+÷oÆ ²vBP¢Œ‚÷ˆç…Ø@¿òx§k¨JO’ª* Ç&L-Á{¼Öâ*%‡0Hrq„`ˆ¢ˆ(J ¥c¹SrF"KYUX±D6¢¨*Ô‡d„¼§à±]É®dÍdAð>àüà¯`#ƒ2Èv¤k->(I8–i# ±N /** * This global variable is observed in the main loop in order to exit the * program as it becomes true. */ bool g_quit(false); /** * This function processes an event of the SDL. If the quit signal has been * sent, then g_quit is set to true. Otherwise the function does nothing. * \param user_data Ignored. * \param event The event to process. */ int event_filter ( void* user_data, SDL_Event* event ) { int result(0); switch ( event->type ) { case SDL_QUIT: g_quit = true; break; default: result = 1; } return result; } /** * Initializes the visual module of the engine and registers the event filter to * the SDL. */ void init() { bear::visual::screen::initialize( bear::visual::screen::screen_gl ); SDL_EventState( SDL_QUIT, SDL_ENABLE ); SDL_SetEventFilter( &event_filter, NULL ); } /** * Releases the visual and input modules of the engine. */ void release() { bear::visual::screen::release(); } /** * Creates a sprite given an image file name and a region in this image. * \param file_name The path to the image use for the sprite. * \param clip The part of the image to use for the sprite, relatively to the * top-left corner of the texture. */ bear::visual::sprite load_sprite ( const std::string& file_name, const bear::visual::sprite::clip_rectangle_type& clip ) { // Open the image file. std::ifstream f( file_name.c_str() ); if ( !f ) std::cerr << "Cannot open file \"" << file_name << "\" from current directory.\n"; // the engine uses the graphic module of libclaw to load the images. This // constructor builds a 32 bits color image from files such as PNG, JPEG, TGA, // Bitmap. claw::graphic::image image( f ); // Then we create a texture from the loaded image. bear::visual::image texture( image ); // And we build a sprite from this texture. return bear::visual::sprite ( /* The texture of which the sprite is part of. */ texture, /* The part of the image to use for the sprite. */ clip ); } /** * Creates a window and draws a sprite in it until the quit signal is received. */ void run_example() { // Here we create the window; it will be immediately visible. // The engine does not support multiples windows yet, so be careful and be // sure to create only one of them. // // As soon as the screen is created, a render thread is created bear::visual::screen s( claw::math::coordinate_2d(640, 480) ); const bear::visual::sprite sprite ( load_sprite ( /* The path to the image of which the sprite is a part. */ "hourglass.png", /* The part of the image to use for the sprite, relatively to the top-left corner of the texture. Values are: left, top, width, height. */ bear::visual::sprite::clip_rectangle_type(0, 0, 57, 65) ) ); // The bear::visual::shader_program loads a shader from a GLSL source file. std::ifstream shader_source( "grayscale.frag" ); const bear::visual::shader_program shader( shader_source ); // This element will be rendered several times, and sometimes with an active // shader. bear::visual::scene_sprite sprite_element ( 320 - sprite.width() / 2, 240 - sprite.height() / 2, sprite ); while ( !g_quit ) { s.begin_render(); // First rendering of the sprite, without the shader. sprite_element.set_position ( 160 - sprite.width() / 2, sprite_element.get_position().y ); s.render( sprite_element ); // The bear::visual::scene_shader_push object activates a shader for the // upcoming drawings. Several shaders can be pushed at once, in which case // the last shader on the stack is the one applied. s.render( bear::visual::scene_shader_push( shader ) ); // This sprite will be thus displayed in grayscale. sprite_element.set_position ( 320 - sprite.width() / 2, sprite_element.get_position().y ); s.render( sprite_element ); // The bear::visual::scene_shader_pop() object removes the shader on the // top of the shader stack. Here the upcoming drawings will be done // without shaders. s.render( bear::visual::scene_shader_pop() ); // This sprite will be rendered in normal colors, like the first one. sprite_element.set_position ( 480 - sprite.width() / 2, sprite_element.get_position().y ); s.render( sprite_element ); s.end_render(); SDL_PumpEvents(); } } /** * Initializes the engine then runs the example. The engine's modules will be * released before leaving. */ int main( int argc, char* argv[] ) { init(); run_example(); release(); return 0; } plee-the-bear-20251226/bear-engine/doc/examples/13-input/000077500000000000000000000000001512343254000225075ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/doc/examples/13-input/CMakeLists.txt000066400000000000000000000031321512343254000252460ustar00rootroot00000000000000cmake_minimum_required(VERSION 2.8) #------------------------------------------------------------------------------- # Find the root directory of the source of the Bear Engine. This directory # contain the bear-engine and bear-factory project directories. if( NOT DEFINED BEAR_ROOT_DIRECTORY OR NOT IS_DIRECTORY "${BEAR_ROOT_DIRECTORY}/bear-engine" ) message( FATAL_ERROR "I can't find the Bear Engine. Please set BEAR_ROOT_DIRECTORY to the path of the engine's root:\n cmake . -DBEAR_ROOT_DIRECTORY=/home/joe/dev/bear\nCurrent path is \"${BEAR_ROOT_DIRECTORY}\" and it doesn't contain a bear-engine directory." ) endif() # The engine comes with some CMake scripts to ease its configuration and usage. # These scripts are in the directory below and must be assigned to # CMAKE_MODULE_PATH in order to be found by the upcoming include() instructions set( CMAKE_MODULE_PATH "${BEAR_ROOT_DIRECTORY}/cmake-helper" ) # This will sets the variables of the source directories, required by the CMake # package below. include( "bear-config" ) #------------------------------------------------------------------------------- # Include Bear Engine's CMake package to find the libraries, the link paths and # the and include paths required by the engine. find_package( bear ) include_directories( ${BEAR_ENGINE_INCLUDE_DIRECTORY} ) #------------------------------------------------------------------------------- # Now we can describe our project. set( TARGET_NAME ex-input ) file( GLOB SOURCES *.cpp ) add_executable( ${TARGET_NAME} ${SOURCES} ) target_link_libraries( ${TARGET_NAME} ${BEAR_ENGINE_LIBRARIES} ) plee-the-bear-20251226/bear-engine/doc/examples/13-input/cursor.png000066400000000000000000000011001512343254000245220ustar00rootroot00000000000000‰PNG  IHDR szzôbKGDùC» pHYs  šœtIMEÞo°OSÍIDATXÃÅ×;‹"AðU£˜‰±‚k°ˆÑjbb"#‚™*ŠŸA#aÓýššˆù…^êÂÅb,L¢‰Ûµ‰Š{êÞ8Ï‚†™~Ð?ªçA€ßŠ8…ˆ È šˆþˆH> e2™W"Z]TDÁ Ñha¡ b±&“I(>_$‰P|}‚ÿíÁ÷:ƒDð£ üÓ`þß¿lg’Ÿ¶;Ñ/?3Ù?»Àk;Yä%‚¦Î+»y€¼@°Û×È-‚½ø˜¸Axpƒð àá)À â.@kõzV«…étŠý~d<Ëul·[ÉårúT´¼§Óée³Ù”Á` ¦iÊñx;±Ûí¤V«ékĹî8·€eYÒn·oâ-Ž*•Št»]½X,äp8¸B|X–%ý~_G"‘•L(¥F…BAªÕªôz=ý(;?!.€'7¿ ŠÇãËb±(õz]f³™l6› èD$Ãáðáæ×çõDÍø¦”zO¥RËR©$NGÏçs1MS øAüÊçóbgó{Ínv”R£l6+årY’Éä'€Õ¹:3ÿÕZ¿Üœ“rÛÞ?àÀ@ë /_´?ðx#IEND®B`‚plee-the-bear-20251226/bear-engine/doc/examples/13-input/main.cpp000066400000000000000000000235231512343254000241440ustar00rootroot00000000000000/** * \file * * This example program creates a window and prints a message in the terminal * for each input event. */ #include "input/input_listener.hpp" #include "input/input_status.hpp" #include "input/mouse.hpp" #include "input/system.hpp" #include "visual/scene_sprite.hpp" #include "visual/screen.hpp" #include /** * \brief Prints the details of a key event in a human readable way. * \param os The stream in which the details are printed. * \param key The event to print. */ std::ostream& operator<<( std::ostream& os, bear::input::key_info key ) { // The code of the key is its representation on the keyboard. // The symbol is what the user wants to see on the screen when he types. // The name is a human readable description of the code. return os << "code: " << key.get_code() << " symbol: " << (char)key.get_symbol() << " name: " << bear::input::keyboard::get_name_of( key.get_code() ); } std::ostream& operator<<( std::ostream& os, bear::input::finger_event event ) { switch ( event.get_type() ) { case bear::input::finger_event::finger_event_pressed: os << "pressed"; break; case bear::input::finger_event::finger_event_released: os << "released"; break; case bear::input::finger_event::finger_event_motion: os << "motion"; break; } return os << " at position x=" << event.get_position().x << ", y=" << event.get_position().y << ", and distance x=" << event.get_distance().x << ", y=" << event.get_distance().y; } /** * \brief The input_process class processes the inputs of the user by displaying * a description of them for each event. * * bear::input::input_listener is the interface of the objects that can be * passed to bear::input::input_status in order to be informed when the * keyboard, the joysticks, the mouses or the finger (on touch devices) are * used. * * For the button based devices, the interfaces provides methods called when the * buttons are either pressed, maintained (since the last call) and released. * * For the finger, a single function is provided, taking an argument telling if * the finger is pressed, released or if it is moving. * * We will use the input_processor to manage the position of the mouse, where * the cursor must be displayed. */ class input_processor: public bear::input::input_listener { public: /** * \brief Default constructor. The mouse is initially placed in (0, 0). */ input_processor() : m_mouse_position( 0, 0 ) { } /** * \brief Returns the last known position of the mouse. */ claw::math::coordinate_2d get_mouse_position() const { return m_mouse_position; } protected: /** * \brief Displays the details of a pressed keyboard key. * \param key The details of the key. */ virtual bool key_pressed( const bear::input::key_info& key ) { std::cout << "keyboard key pressed: " << key << '\n'; } /** * \brief Displays the details of a released keyboard key. * \param key The details of the key. */ virtual bool key_released( const bear::input::key_info& key ) { std::cout << "keyboard key released: " << key << '\n'; } /** * \brief Displays the details of a text symbol entered by the user. * \param key The details of the symbol. */ virtual bool char_pressed( const bear::input::key_info& key ) { std::cout << "character pressed: " << key << '\n'; } /** * \brief Displays the details of a pressed joystick button. * \param button The details of the button. * \param joy_index The index of the joystick emitting the event. */ virtual bool button_pressed ( bear::input::joystick::joy_code button, unsigned int joy_index ) { std::cout << "joystick #" << joy_index << " button pressed: " << bear::input::joystick::get_name_of(button) << '\n'; } /** * \brief Displays the details of a released joystick button. * \param button The details of the button. * \param joy_index The index of the joystick emitting the event. */ virtual bool button_released ( bear::input::joystick::joy_code button, unsigned int joy_index ) { std::cout << "joystick #" << joy_index << " button released: " << bear::input::joystick::get_name_of(button) << '\n'; } /** * \brief Displays the details of a pressed mouse button. * \param button The details of the button. * \param pos The position of the mouse when the button is pressed. */ virtual bool mouse_pressed ( bear::input::mouse::mouse_code button, const claw::math::coordinate_2d& pos ) { std::cout << "mouse button pressed: " << bear::input::mouse::get_name_of(button) << " at x=" << pos.x << " y=" << pos.y << '\n'; } /** * \brief Displays the details of a released mouse button. * \param button The details of the button. * \param pos The position of the mouse when the button is released. */ virtual bool mouse_released ( bear::input::mouse::mouse_code button, const claw::math::coordinate_2d& pos ) { std::cout << "mouse button released: " << bear::input::mouse::get_name_of(button) << " at x=" << pos.x << " y=" << pos.y << '\n'; } /** * \brief Displays and stores the position of the mouse. * \param pos The position where the mouse has moved. */ virtual bool mouse_move( const claw::math::coordinate_2d& pos ) { std::cout << "mouse moving at x=" << pos.x << " y=" << pos.y << '\n'; m_mouse_position = pos; } /** * \brief Displays the details of a touch event. * \param event The details of the event. */ virtual bool finger_action( const bear::input::finger_event& event ) { std::cout << "finger action: " << event << '\n'; } private: /** \brief The last known position of the mouse. */ claw::math::coordinate_2d m_mouse_position; }; /** * This global variable is observed in the main loop in order to exit the * program as it becomes true. */ bool g_quit(false); /** * This function processes an event of the SDL. If the quit signal has been * sent, then g_quit is set to true. Otherwise the function does nothing. * \param user_data Ignored. * \param event The event to process. */ int event_filter ( void* user_data, SDL_Event* event ) { int result(0); switch ( event->type ) { case SDL_QUIT: g_quit = true; break; default: result = 1; } return result; } /** * Sets g_quit to true. */ void quit() { g_quit = true; } /** * Initializes the visual and input modules of the engine. */ void init() { bear::visual::screen::initialize( bear::visual::screen::screen_gl ); bear::input::system::initialize(); SDL_EventState( SDL_QUIT, SDL_ENABLE ); SDL_SetEventFilter( &event_filter, NULL ); } /** * Releases the visual and input modules of the engine. */ void release() { bear::input::system::release(); bear::visual::screen::release(); } /** * Creates a sprite given an image file name and a region in this image. * \param file_name The path to the image file of which the sprite is a part. * \param clip The part of the image to use for the sprite, relatively to the * top-left corner of the texture. */ bear::visual::sprite load_sprite ( std::string file_name, const bear::visual::sprite::clip_rectangle_type& clip ) { // Open the image file. std::ifstream f( file_name.c_str() ); if ( !f ) std::cerr << "Cannot open file \"" << file_name << "\" from current directory.\n"; // the engine uses the graphic module of libclaw to load the images. This // constructor builds a 32 bits color image from files such as PNG, JPEG, TGA, // Bitmap. claw::graphic::image image( f ); // Then we create a texture from the loaded image. bear::visual::image texture( image ); // And we build a sprite from this texture. return bear::visual::sprite ( /* The texture of which the sprite is part of. */ texture, /* The part of the image to use for the sprite. */ clip ); } /** * Creates a window with the widgets, then call the game loop. */ void run_example() { // Here we create the window; it will be immediately visible. // The engine does not support multiples windows yet, so be careful and be // sure to create only one of them. // // As soon as the screen is created, a render thread is created bear::visual::screen s( claw::math::coordinate_2d(640, 480) ); bear::visual::sprite cursor ( load_sprite ( "cursor.png", /* The part of the image to use for the sprite, relatively to the top-left corner of the texture. Values are: left, top, width, height. */ bear::visual::sprite::clip_rectangle_type(0, 0, 32, 32) ) ); // The bear::input::input_status class maintains a state of the inputs and can // notify instances of bear::input::input_listener of the changes. bear::input::input_status input; input_processor processed_input; while ( !g_quit ) { // update the state of the input devices. bear::input::system::get_instance().refresh(); // check the changes in the inputs. input.read(); // notify the frame about the state of the inputs. input.scan_inputs( processed_input ); s.begin_render(); { // Then we need to render the mouse's cursor. const bear::visual::position_type cursor_position ( processed_input.get_mouse_position() ); s.render ( bear::visual::scene_sprite ( cursor_position.x, cursor_position.y - cursor.height(), cursor ) ); } s.end_render(); } } /** * Initializes the engine then runs the example. The engine's modules will be * released before leaving. */ int main( int argc, char* argv[] ) { init(); run_example(); release(); return 0; } plee-the-bear-20251226/bear-engine/doc/examples/14-gui/000077500000000000000000000000001512343254000221355ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/doc/examples/14-gui/CMakeLists.txt000066400000000000000000000031301512343254000246720ustar00rootroot00000000000000cmake_minimum_required(VERSION 2.8) #------------------------------------------------------------------------------- # Find the root directory of the source of the Bear Engine. This directory # contain the bear-engine and bear-factory project directories. if( NOT DEFINED BEAR_ROOT_DIRECTORY OR NOT IS_DIRECTORY "${BEAR_ROOT_DIRECTORY}/bear-engine" ) message( FATAL_ERROR "I can't find the Bear Engine. Please set BEAR_ROOT_DIRECTORY to the path of the engine's root:\n cmake . -DBEAR_ROOT_DIRECTORY=/home/joe/dev/bear\nCurrent path is \"${BEAR_ROOT_DIRECTORY}\" and it doesn't contain a bear-engine directory." ) endif() # The engine comes with some CMake scripts to ease its configuration and usage. # These scripts are in the directory below and must be assigned to # CMAKE_MODULE_PATH in order to be found by the upcoming include() instructions set( CMAKE_MODULE_PATH "${BEAR_ROOT_DIRECTORY}/cmake-helper" ) # This will sets the variables of the source directories, required by the CMake # package below. include( "bear-config" ) #------------------------------------------------------------------------------- # Include Bear Engine's CMake package to find the libraries, the link paths and # the and include paths required by the engine. find_package( bear ) include_directories( ${BEAR_ENGINE_INCLUDE_DIRECTORY} ) #------------------------------------------------------------------------------- # Now we can describe our project. set( TARGET_NAME ex-gui ) file( GLOB SOURCES *.cpp ) add_executable( ${TARGET_NAME} ${SOURCES} ) target_link_libraries( ${TARGET_NAME} ${BEAR_ENGINE_LIBRARIES} ) plee-the-bear-20251226/bear-engine/doc/examples/14-gui/FreeSans.ttf000066400000000000000000057551701512343254000244060ustar00rootroot000000000000000FFTMY-£ÿÚ\GDEFøóúĶGPOSõBò8tLfGSUB_üŸÉ|VÐOS/2,rÉ¿¸`cmap÷…¦d²cvt ÒÓxˆHfpgm´/§uÌegasp ´glyf²xQÚÔ”headþÝß³<6hhea1µt$hmtx´Òžbkernˆ…‰3Üh òloca«,°xÐbmaxp Ę nameåv6ç\RpostÈj¼çü°prep]“ocx4Rœ:èjÀ _<õèË屑Ë屑ûrý‚Ô„ÿ8dÐûrý,Ô€€·du‘ŠšÈŠš†1 䃎ÿBýÿ0 GNU @ ÿÿ ÿ8d„,`¿ß÷ Ù  #XúM|M(,,!y›4È5MIM&…(H2WM.úPÿø,+,f,", ,,#,+,.,%,&úPúPH-H2H2,M÷"š˜PÅ(ºPyPWPý(ÑPd#¢P3PNPÚP(P(ÅP›0xÐP…©‘¦g@ÿøÕ,,ÿêú/<ú/&<ÞBó<Ö<,<</</L<í"<ð Ò Ü Þ æM+ú_M9ô!Mz,4,,C, d,+M 'r%ôGH(M. 'M^—H2^^M\,A0úWM'^Em(ôHe=e=o,`ššššššØÅ(yPyPyPyP1, ,ÃÚP(((((H_#ÐPÐPÐPÐP¦…PRPgúÞÞ ÿôÿõ<H2 <<<<Þ .<Þ šš›Å(úÅ(úÅ(úÅ(úºPéÃ@yPyPyP‚PyPý(&ý(&ý(&ý(&ÑP<Ò*,ÿùÿæÿú,ÿýÿñ_ÞF÷d€B#ÿó¢P<<3Pò 3PÖ<3P<3Ph<düÚP<ÚP<ÚP<‡'¥P<(((Ú(—ÅPL<ÅPL<ÅPL-›0í"›0í"›0í"›0í"xx¸xÐP<ÐP<ÐP<ÐP<ÐP<ÐP<©Ò ¦Þ ¦gægægæEJ(˜P/<ÉQÅ((AÃl(˜(/(yÆ((a,(¦U<Bk¡P<Y" `PÚÿø<((/ø(Ö8(/<P›0ô"g^~xPk<õ(·PØe gæk(a ý,"ì1<_r_H2|ûPšPP P¨<ÀPœPö<š,ÿó(ÐP<ÐP<ÐP<ÐP<ÐP<ššØg(+ý(&¢P<((k( ÞÿßPšPý(&aPÚP<šØg#c ššyPyP,ÿßÿ¹,ÿÿÿí((ÅPLÿëÅPL-ÐP<ÐP<›0í"x(žÑP<ÐPgæšyP((((¦Þ Þÿî“’<</<úõ ZTååàù K-2ã ( <<< ÿBÙ«D`<,<,<,<? @<#<òؼLL|L<L<p<p<@ô"+*5ÏT`<ð Ò Þ ú 4ü òòò»((è<ùn<Ë †<^òò™À±Á Œ<9<0æ> c MM§ì ì#g*ôJ 1Æ1úUúPúUúYúOMMMMM3M3MMúYMM\MúYMMSM#MgMgú\úSM M M M MMsM=M9MMMMM º5MM N (((((HHMMPM3M.MMM:úMMM úPÈÈÈÈM M MþÉÿþÇþ¸þÏþ=þÂÿ&þÌþäþñþÈþÆÿ1þìþbþÂþÂÿ)ÿ2ÿ,þÉþþþèÿÿ5ÿwÿ þäþäþäþXÿUÿ­þòþ“þ°þóþþìþýþÏþÀþÆþÆþÂþÂþ}þý§ý§þ>þeý9ýCýCþøþ–þ”þ‚þÓÿ!ý¨þÉÿþ¨ÿ2þžþ¿þÏþŒþ¸þòþþhþ‘ýàþ”þ»ÿ:þ¡þQþkþ|þÿ;þ½þnýýþ¯þ´þ¸þ¼þ¼þ©þ´þÔþ¤þ’þäþ‘þ¬þ´þ¥þ¶þjþÞþÏþ”þ›1ÇLÌ"ÈÌ"PMsMšVjb})ÿꚘPRP»yPgÑP(d¢PšNPÚPr((ÐPP|(x¦ã(‘ú<õ(ÿþ¦Bñ%3<.<B < (ñ¿%ù<ô<" <ð å R><^ì.<Ç9 º<ØÿÚ.< .<Ø)³t³¼Ø, D ><Èó(442k(kk(kƒPƒPWPÅ(›0d,#ññP}PÚPoÒPš˜P˜PWP,"ƒP“(ÚPÚP}PŸNPÑP(ÑP†PÅ(xoM(‘æPl2>PSPMoP˜PÅ(ãP®è<†<Fý å#<#<ä<ñV<<</<úœÞ QÜ .<ê2 <¾<†¨<÷<úå< A†<úö$àFÿöóE<Cä<#<Þ <¨¨ /|³d¾G, dêG“ý ed§G"å+ú<º<(: : ’'°`(R¨¨ ¨¨ Ôþ„þþÿÿ ý×ýüýûP=<µ †P2<YPƒ<fœWPÓ<¤C (å’Pî<¨P<±  M’äP.<ãPÅ<"P<"(rÅ(úxœ¦L ¦L ¢æ · €2õ(v<à(vPà<“(³“(³þP“ý ŸPâ<¶ÑP<èP/<v<à(ePk<þPššØgƒPÆ((Æ((“ý (åk(ÚP#<ÚP#<(((Å(úoÞ oÞ oÞ l2ê2WP†<oP¨<fœ‘Ü ‘Ü (åŸñ(/©È }Pä<×P4<s22ÚFµFÚ(ß<µFï2¾F¿FFA¹F†FTF#ºFI2‹A’(÷<S- [(¿FˆBºAè-âF¿FãA”-µFo<F-x-Ê(úOÞ5ÈMMM MAA'F<#9A"AE#aF'A8F9#(FFF#)FF#8A(,AùÿìF•#'A†#AAý& A!AHAoA(A(#-FtAB,#œ* FZM ß< px€ ȸ»¾¢àåÀ&eÔ>FPŠÿz3¾€:O:ÒV&n?Ô>_'o?`=È:&&9X%o?m0Ô>z3_=K$?98? N3^>#%<¯#¨>œ<8¸,X7X8É4É2É3É,ôjôjôjrTrW>>…ˆ>Ä#Ä9>ÿ¸…ÿ¸…ÿ¸ýkýkªmId”±sÿ¸Îÿ¸Îÿ¸äÿ¸ªÿ²Xa”ÿ¸ªkkÎÿ¸ΧÎÿ¸>ÿ¸>ÿ¸~Iÿ¸ýkªÿ¸ªc>ÿ¸…ÿ¸ýkÎ,õÍãõÍÜ}© «ý §¬ª¨§Õ”„”ÿ¸”ÿ¸þÑþ×ÿK1LÍÍxÐÿöÐÿöFÿö$ÿö™ÿöÿö±ÿö±ÿö±ÿö±ÿöxxxxíÿö ÿö ÿöNÿö¨ÿölÿö„ÿö¿ÿö´ÿö¨ÿö8ÿöÿöcÿöÿö`ÿö4ÿö”*ôÿöQ)8ÿö8ÿößÿöÝÿöìÿöBÿö,ÿö³ÿö³ÿöÿö•ÿö•ÿöìÿö†ÿößÿö›ÿöæÿöÿ‡âÿöþ€ºâÿöâÿöâÿ þAþÃþÐþÐþÔþ=þ|þ`âÿ·âÿ!âÿ`âÿ@ÿ^•âþîGÿ‡ýàþ,ÿ2þÔþHþHíÿö ÿö ÿö¿ÿöcÿöÿöÝÿö,ÿö„ÿörÿöþ`þ_¢s¢î?Z?q?X?d?N?f?f?"?‚?m[ƒÍÍxxÍÍ¿ÿö,ÿö8ÿö¿ÿö?XcÿöìÿöþÇ,"=ûÿò4/XátD#s#e:Óá+¶ã ˜ýY3‘ÿÑ”˜Ì?ÿßÝ¢ÿé±-½ó R5ʱŒü½üÌþǸÁÿ±½´þwÿÿ@þžþß'/ÿÆþ6þJÿ/d Ûþ옱RátþþoôAµMß1ñ9ô1â÷`$áyÿçyÿç­ÿû­Þ(! žm+eX1þ¼ÿw_0\ÿù@ÿùeÿà ÿöÓÿùÓÿù™ÿöYÿùÌÿùZÿùªÿøzÿó¸ÿùèÿù‰ÿ÷¢ÿúÿøÿöuÿùÿúÿù‘ÿöŠÿøÿ÷‹ÿù€ÿúzÿú–ÿøvÿöqÿô…ÿ÷ÿøpÿ÷eÿ÷’ÿùÞÿúlÿú¤ÿöÏÿërÿùšÿùšÿùfÿöÿ]ÿóBÿû-ÿ"ýúýúþ ýßþ!ýÏþ®þ®|ÿóúÿúŒÿöÿúÿú !nn@Mý…•þÑþœšÿöÖÿùÁ þê£HMPXòYÕWÀWÐZÁZaW#Y³YÏXnYÊV«V·VºYŽWŽY?YêWaZZIWY>WMYšY W4Y.WºW7WjY Y Y 9WYwY³W„YtWþZÌZ–YWYÊVZnVñYJYW{YWe¼UúZÙÿ“ÙÿotHtHÃ+Ã+ÊYV|YýýÌýÿŸ:Ô/aW½Yýqý$¯Mµ#üMUšU¦P½U¨S@U­TÅ,vU*Yj>„WW|YxWâY¼YZWìY½YK<l<‚</<X<S<<}Pn<U<«<Z<[PPK<o<YP<ÔO<W<,<[<NPò<T<P‹<TPx<Q<´ë´¿¿tÞÁ½KÁÁªÁàªÔÆo¹¿¾¿Ö¸xÁÖÁÚvŠ£¦´<ÁN¦5ô5\ÿêÉÏ5y* $Ú5± ÿê¾ÿë}5 ÿÓÿã5O5GÿýÃg 32Á 5.pÿþÆ£5Ý  #ôBÿæ\5x]‘J ì¨ÿøJ x$œ2 r5ö¸‚53¸ÿón Æ ÿæ, ÿón q#øÿû4275ÈÍFi5±ÿØ5²5'[½„ÿù %$mÿæ\$J áÿèY2…5H2­2­2­2­2Ö2Ö2Ö2Ö2Ö2Ö2Ö2­2­2­2­2­2­2r2r2r2r2Ö2r2r2r2r2Ö2î2[2¿2I2I2Ä2Ä22Ã2Ï2!2Ø2222‘2­2*2ô2­2­2­2­2Ö2Ö2Ö2Ö2Ö2Ö2Ö2­2­2­2­2­2­2Ö2r2Ö2r2r2Ö2r2Ö2Ö2†2Ÿ2L2æ2æ2æ2æ2è2è2è2è2è2è2è2’222’22’2è2”2è2”2”2è2”2è2“2Ý2W2W2W2W2P2P2P2P2P2b2É2P2`2Î2ü2ü2Î2ü2Î2Î2û2ß2û2ü2Î2ü2Þ2û2i2i2Ä2Ä2Ä2‹2P2P2P2P2P2b2É2P2`2`2û2û2`2û2`2a2û2s2û2û2a2û2q2û2i2i2P2P2P2P2P2b2É2P2`2P2û2û2P2û2P2P2û2b2û2û2P2û2`2û2Z22Z2K222È2È2È2È2È2È2È2È2È2d2<2<2È2<2È2È2Ò2Ä2Ò2È2È2È2È2È2È2È2È2È2d2<2<2d2<2d2È2<2È2<2<2È2<2È2Ò2p2ø2 2ø2 2ø22p2ø22l2”2“2l2¤2l2l2”2}2¤2“2l2“2|2“252m252Ê2;2;2[2ò2ü2h2h2>2>2>2V2V2V2V2é2ê2é2ê2é2ê2æ2æ2æ2æ2æ2æ2æ2æ2R2222222|222Ÿ2 2Ÿ2 2Ÿ2 2Ÿ2 2¯2 2Ÿ2 2Ÿ2°2Ÿ2t2ù2Ð2Ì2>2>2>2>2>2>2,2,2,2,2,2,2³2È2W2j2p21212121282828282Ô2Ì2Ñ2æ2æ2æ2æ2æ2æ2æ2æ2æ2æ2‚2P2š2æ2æ2è2è292æ2æ2è2è2 2 2 2 2 2 2 2í2P2Ì2k2k2k2 22k2k2„2P2P2P2P22222 2 2 2¯2Á2 2 2 22†2†2†2†2È2È2È2È2Ò2222222Ò2~2~2~2~2~2~2~2„2è22222P2P2P2P2222212121212v2v2v2v2­2­2Ö2Ö2Ö2Ö2­2­2Ö2Ö2Ö2Ö2­2­2Ö2Ö2Ú2Ö2­2­2Ö2Ö2Ú2Ö2>2>2>2>2>2>2>2>2>2>2>2>2>2>2>2>2>2>22Ò2Ò2Ò2Ò2Ò2Ò2Ò2Ò2Ò2Ò2Ò2Ò2Ò2Ò2Ò2Ò2Ò2Ò2 2P2P2È2È2È2È2Ò2Ò2Ò2Ò2Ò2Ò2>2>2À2À2À2À2‡2‡2‡2>2>2>2>2>2‡2‡2>2>2>2>2>2>2Ñ2Ñ2Ñ2Ñ2>2>2>2>2>2>2a2a2‡2‡2‡2‡2ã2ã2ò2ò2ò2ò2>2>2ó2ó2ó2ó2>2>2>2>2>2>2«2«2>2>2>2>2>2>2>2>2Î2Î2Î2Î2>2>2Î2Î2Î2Î2 2>2>2Î2Î2Î2Î2>2>2Î2Î2Î2Î2Ò2Ò2Ò2Ò2Ò2Ò262r2k2 2$2"2Ã2Õ2"222œ2 2 2º2º2 2 222Ö2Ö2Ö2r2Ö2Ö22è2P2ü2PÈ2È2È2ø2ø2>2>2é222,282|282|2È282È282ä2Ä2Ä2Ö2Ö2®2 2Ä2i2i2Z2Ò262æ2?2?2ß2Ø2Ø2,!,2Š2Z2Š2è2è2ö2P2(2†2v2Š2Ò2Ò2Š2‡2Ø22?2c2èÝ _&û!ý6 Ö6ñÞH}ð6°f6I!×6øÀÿ6ؤÌmBU0 ½ ³-’,"&% ‡”)v&]Î\'X(o F [ Hš˜P/<˜P/<˜P/<Å(úºP/ºP/ºP/ÒY,ºP/yPyPyPyPyPWPý(&ÑP<ÑP<ÑP<Òÿñ,ÿßÑP<ÿöÿãÿô¢P<¢P<¢P<3PÖ:3PÖÿå3PÖÿå3PÖÿÞNP,<NP,<NP,<ÚP<ÚP<ÚP<ÚP<((((P/<P/<ÅPL<ÅPL;ÅPL;ÅPLÿæ›0í"›0í"›0í"›0í"›0í"xxxxÐP<ÐP<ÐP<ÐP<ÐP<…ð …ð ©Ò ©Ò ©Ò ©Ò ©Ò ‘Ü ‘Ü ¦Þ gægægæ<Ò Þ —](ššššššššššššyPyPyPyPy*yPyPyPSÞ:_Þ9((((((((/(/(/(/(/ÐP<ÐP<Pk<Pk<Pk<Pk<Pk<¦Þ ¦Þ ¦Þ ¦Þ BBBBBBBBšš æÿòôÿó´ÿï»ÿí¡ÿñšÿåññññññÚÿóÊÿî„ÿðrÿñcÿïoÿñ%%%%%%%%ÿñ ÿ÷°ÿò²ÿø®ÿô±ÿôTÿÝTÿÝ,8ÿôÿ÷ÿûÿùÿËÿËBÿñAÿõâÿòåÿñÝÿñäÿóŠÿà†ÿÞ      ÿïÿôÞÿòÛÿówÿñÿó.<.<.<.<.<.<.<.<ëÿî“ÿïËÿô_ÿïØØØØØØØØÿóÿñÌÿñÊÿïoÿó–ÿï…ÿ÷…ÿóBBññ%%8  .<.<ØØBBBBBBBB>< ”ÿò”ÿóUÿï\ÿíCÿñ;ÿå%%%%%%%% ÿñ£ÿ÷PÿòUÿøKÿôNÿôñÿÝôÿÝØØØØØØØØ¦ÿó¦ÿñjÿñhÿïÿó5ÿï&ÿ÷)ÿóBBBBBBBšššÿÝš@MtÈMtM M %%%%%Aÿ÷ÿã|kPRBM ÿÍÿÛÿäÿðÿÇÿðÿýÿåxÿâDQM .<.<.<.<><><.<<¦¦1ÿÚ;ÿÉÙÿó‰"‰"M ØØØØØAÿ¿AÿêPÿÇ.ÿÚ«(MRMvôèôèMú§,§dM.M.,Dô(è(è(@F6ÿíúaúPúPúaYPPW,&,&KZôÆô^¨PW§è P 1Õ1¨11Õ1¨1x ú1ú1nb,|,M,ÿê’;’;¶#H 2§ÿNNyNXMBMB|,.0 …(?’;…(z<ô’;$<W1Ò<Õ<à<Ò<\<à<à<^Œ*^^^^^^^^ ^ ^o^Nh'^^E^^^^^^^^^^ ^ ^o^LknhE^o&g&Y c,,AFªG%[²Po2e<6$›c :"¬'ÍZ››[€! ó ýùýùÿ6ÿýýý¨ý¨þwþxþxþ)ý¯ý,ý1ý4ý2ýwûrýCþÁþPþ)þ0üBý®ýüýùý·ý¨þÔf)[)Ò0ù,30@0(Ò+—(Íg‡.,<V—^„)áëÒL¦@ 'X4›[ &„»Ò]B]Ò]!íè›cõ(õ ¢Pš–oÕÈÅ L)° €:P:ÒV&Cd$:(kFRÒPý<3P,P¦  =°$³#\1pƒEyp$yoEypEyp&e4eEd,dBd±d…±Çݱd‘±Ç3PÅ(ºPNPÞB¼BšBÒBð Ò ° Ž ÒBÜ Ò ° Ö<ú/,<Û [-Û1[-    Û¨IÛ0¨IÛÛ-¼’Û Û |8‰#Û Û-|8{ Û ŠÞ Û òÛ*òÛ Û Û['Û-[,['D D ›¤X,+›P›P"(Ç Ç H7H7I-H7H7IPôaUU(H2H2H2þÿüˆ(ô5ô?ô–ÉÉ>X2ÈF @FT``((Ñ<Á<‰<Ð7ù2  úIlIH2 2H/ô!ô!ô#=Kô%H3H4H2H(H2H2H2ôô!H2ô!H2*H2H2H2H2ß/ó2H2H2H2H2H2H2H2H2H2H2H2H(X<H2H2H2H2»-»-*H-H-H-H-H2H2H2H2H-H-H1H2H-H-H-H-H7H7H7H7H$H2H2H2(((|4|P|B|B|E|E+ + ++ +++++’L’’’ôLLöL|>|>|>|>H`Hèèü=ü=*W×@Æ>H2H2H3H-4¿0¿!H(H(|B|BH2H2H-H-úRèèè€7'ÈbÇHÈJÇbH(v–v ’;’;II€(€(€(€,€€,„X„X„X„7„à„7MyM2M€M€M2M€M2v–$8$8 @3 3 DD : 4 = Ó º Ý ¾ æ » Ø Ý L V V V V @ G N = Å D X Ü ¼ ä Ì Û V, ô m  ±##########èèèÌè¤èèèÌè¤èèèÌè¤èÌèÌè¤è¤èèèèèÌèÌè¤è¤èèèèèÌèÌè¤è¤è¤è¤è¤è¤èèèèè¤èèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèè|èÌè|è|èèèèÌè|è|èèèèÌè|è|èèèèèèèèèèèèèèèèèèèèèèèèèèèèèôèèèèèkèèôèôèèèèèèè 2 2 2 2 2 2 2 2 2 2qàqà d d ú úèè|#|#€€|^|^´ž{^{]|#|#€|^|^ˆž{^{]$$$ 'é ' ' ' ' ' ' ' ' ' ' ' ' Š 2 2 2 ' ’ Š' ' 'è–è–è–è–K 2 2 2 2 2|#|#|#ü  2 2 2 2 ' ' ' '  œ œ ž  È È œ¡B###r"¶#S"#r"¶#S"#M7+7Ò7Ò7ŸBy<’2‰"ü ü ü ü=ü=H(`(h8h8ÐHÐHÐH 0Å0Å0ÐHÐHT6ºHæH>HæHh8h8$H¸0¸<ÐH 4ÔHô6X: 0x<D6 HÐHZD6à&¦?|6h8h7ÐH <€8h8h78¨6ÐH8ÐHÅ0ÐH<<6ÆH<6Ø1j.ºHH2M.,?Mô!ô!ô!Ð5Ð&”oo”,9^KºFºF¤F F FRF¢FÐFôFîFîFîFFF F F:F:F F FÐFFXFXFXFXF×F×FíFíF8FzFeFÐFãF×F FHF F¨FHFÇFÎF¸FßFßF FîFeFFF¤FúF¢F¢FèF\F6F#FSFSF±FLFÄF‹F‹F‹FdFdFHFF FFFÀFÓFwFwF¤F1FúFwF8FzFÁF FÁFF F¶FFFF|FÇFÇF@F@F°F°F@F FçFßFÛFFSFzF¨FwF/FþFPF¼F¼F¼FÔFÔFyFyF-FBFqFwFPFFFFFwFwFÍFÍFF{F FIFôFF F F‡FiF/FRF«FBF‚F F4F4F(F`FF(FeF„FLFLF,F,F,F¢FÞFF`FvFŽF¯F¯FèF¯FÔFæFÔFæFèFèFèFèF FFFSFäFlFF’F’FYF FFwFÞFíFFF´F´FŠFFXFXF>FæF>FæFôF\FÀFÀFêF4FÛF%F^FÖFÖFôF-F«F‚F”FyF’F±FÏFFÆFÖFÀFFOFFlFlF¢F¢F¢FFF-F-FËFËFÑF!FFF\FjFFF#F#F#F#FÐFFÓFÑFFFFFFlFzF&F9FžF FFnF,FFCF½F+FFfFÐF†FýF˜FFßFæF0FËF´FÈF¥FF€FSFF¥FôFËFwF0FM8V2Â2Â2ƒ(ïÌ ÑŒ…ìAAA AèAÈ:18K%z:P&h? 9R%i?%©#H2<<<<€:€:€:O:ÒV&n?#!s`=&&9X%m0z3_=?98?N3^>#%<¯#Ô>O:&98?€H.„ Þ a?ÆÞ\¿üJ.€d>-£¶Œšâ€Çþa|£,d€ËìqV Âé‚€2Cê#€ìIèö³ Cå €øoñM}€ù#pn_åÿÿÛÿÿC™1a\šÿþê<KŽ9øI&7ð7Ê6OF09057^1F?Ð:’9Y=&2í5í9\FV9#OHI+íN8d03òDçN/0r7HJ1<n6Añ8L.`O Næ7Ð7·7ï7£7é7É7H7—7‚7ô7Ø7&7€7@7u7Û7M7A7R77”7 7Ä7»77Á7b77)&êÿ²ÿNþ†ÂSþ'þpÿ—þäýìþAþ/ý‰þiÙÿíM' 2ÿîÿè4ÿî ÿç’ÿôGÿæ£ÿî&-ÿå!ÿ÷‘ÿâ#ÿáÏ T 5 0ÿè¼ÿÓMK¡ÿîÿî‹ÿïÈÿé/ÿêÿÿÕºšÿÎâÿ×:ÿîwÿî#ÿá2ÿñÿ)ÿî®þÞ"ÿ5ÿ°xÿFxÿYñÿá¸ÿÕ|ÿòß×ÌÿôêÿóÿôOÿçÖÿîØÿó ÿÙäÿñÿåÿßï÷ÿïááÿ÷ ÿáó }ÿù¼ÿð ÿç+ÿéØÿö×ÿøòÿíÒÿëïÿìâÿ×ÅÿóØÿí»ÿó˜ÿÕ8ÿé¸ÿé¸ÿÍ”ÿÙÙÿí”ÿÙÙÿí”ÿÙÙÿíßÿó:ÿÝ8ÿÝ:ÿݘÿÕ˜ÿÕ˜ÿÕrÿéäý++×+×++¬ÿçÿÕKÿó·ÿò·ÿêÿû×ÿçéÿíéÿòéÿóGÿè‘ÿëÿçÿçÿçâÿï˜ÿåÿæÿæ]ÿéŸÿÍq!:!ÃÿàëÿôÿÇVÿâwÿé§ÿÙX X  ²ÿöš,²ÿö1`Â?n?+ÿÝ+ÿÝõÿß!ÿé¢ÿßÿßþÿÑÕÿÑêÿÓêÿÓÿìÿéÿé¢ÿéÿËíÿËÿååÿé±-Z-PÿÓPÿÓÏÿç@ÿç@ÿçPÿÓÿñÿð ÿáÿð ÿánÿÓmÿÓqÿð ÿë ÿëDÿô½ÿØhÿØ~ÿñùÿðë3ô‡ ó ó gÿÜòÿîHÿçkÿç[ÿé[ÿé+ÿéyÿçÿõyÿç+ÿéÿê.ÿéÏÿé©ÿéÀÿèVÿéXÿéRÿéÿÙÿÙÈÿéÈÿéÈÿèƒÿé_ÿèÈÿéÀÿèÿéÿéHÿÓñÿݱÿÒ±ÿÒjÿÕjÿÕñÿñÆÿÕeÿòñÿñ‘ÿßÈÿÕzÿôÿíòÿí“ÿíòÿíÿÎSÿÎCÿî·ÿÝOÿõ ÿëOÿõæÿà¬ÿéÿÎÿ΄ÿé„ÿé/ÿÎHÿéhÿ׃ÿ×hÿ×0ÿç÷ÿß%ÿã÷ÿß%ÿã ÿóÿ÷âÿ× ÿñâÿ×úÿÓïÿìÿ׌ÿ׌ÿ×ÊÿñÊÿñÿדÿìâÿ×ïÿì¸ÿç ÿÓ˜ÿé.ÿç¸ÿçFÿç:ÿÝ×+¬ÿç˜ÿåýÿñOÿç}ÿÇ ÿÙÂ?ÿßÝÿèÝ-±- ÿá½ÿØó Àÿç+ÿéÈÿéüÿèÀÿèÐÿôòÿßòÿíâÿ×ïÿìÜÿç¸ÿç“pÿù—q˜+t+ ÿçÍÿç½ÿåšÿå–rÿûÄÿî‡ÿï–q ÿá ÿá ÿá ÿá?ÿë÷ÿëž q ž x ‡ÿú_ÿúCÿçÿçÃÿç£ÿç–ÿöoÿöðÿéÍÿéJÿçÿçñÿññÿñ¬ÿíÿí­ÿí„ÿí·ÿΕÿÎâÿ×$ÿ×âÿ×ÿׯÿì†ÿì3ÿ×ÿ×*ÿ×ÿ×­ÿì‹ÿì¹ÿÓ ÿÓCÿçÿçGÿçÿç™ÿítÿí:ÿÝÓ×+¬ÿçã ˜ÿåýÿñOÿç3ÿç}ÿÇ”ÿô ÿÙ˜ÿÕÂ?ÿßÝ¢ÿé±-½ÿØó Hÿçyÿç+ÿéÀÿè§ÿá†ÿçòÿßòÿí©ÿéïÿì¸ÿç ÿç˜ÿé¬ÿëyÿçyÿç™þWþþaþaþ ÿáþ‘þíþÔþn2þþþFýΚÿÉÄÿí¤ÿHÿÿÓ‰ÿ߉ÿíÿï›ÿ×–ÿìPÿçò·ÿÝþc›ÿ•qÿ³ÿï8ÿöÿëÏÿöþ|âÿ`âÿ@þ`ÿ'ÿå aŸÿö¡ÿöXÿö´ÿþvuêÿöÿöoÿöÚÿöÄÿöÿö?ÿö]ÿöãÿöÿöÿöcÿö‚ÿö®ÿöÒÿöÉÿö¾ÿö'ÿö„)èÿöB(iÿöNÿö¨)¡ÿög'>ÿö>ÿöøÿöÒÿöÿö|)ÿöCÿöÒÿö»ÿö¥ÿöÿöÿöÿöÿöøÿöäÿöþÿö|ÿöàÿö2ùÿöàÿöbÚÿöxÿö˜ÿöjÿöjÿö¢ÿörÿö­ÿötÿöèÿöJÿö{ÿö„ÿöèÿö*ÿö*ÿöÿöjÿöUÿöUÿöüÿöØÿö ÿöÚÿµÿöèÿöáÿöÿö‹ÿöâÿ<âþcâÿ<âþcâÿ<âþcâÿöâÿöâÿö )ºÿö¾ÿöuÿöÞ#Ïÿÿ³ ÿöþ=ÿ'ùÿöÿ'þ!xxâÿ þ|þ|þ|þ`þYþYæÿö[ÿö¨ÿö8ÿöÿöcÿöÿöôÿö¥ÿösÿö»ÿö*ÿöÿöUÿö ÿö§ÿç€ÿöbÿþ$ÿöÿö.ÿöÿöÁÿôb³ÿöNÿöEÿö9ÿöEÿöoÿöEÿöÿöøÿö¨ÿöæÿöôÿö8ÿöÿëcÿöÿöôÿöäÿö¨ÿöEÿöEÿö9ÿöEÿöÒÿöÒÿöþ¿þaþTÿöþ1 þ@þ>þ[þ£þ³þ¿þBþgþ˜þ¿þRì1Šÿôÿóµÿù´ÿùÄÿù©ÿøïÿù‰ÿ÷¯ÿú‘ÿørÿù‚ÿú‡ÿò•ÿöÿ÷‹ÿù‚ÿúrÿú™ÿø{ÿöuÿôÿ÷oÿ÷jÿ÷ÿùáÿúmÿúuÿùgÿöZÿù ÿùhÿë›ÿöÖÿùÖÿùšÿöZÿùÎÿù]ÿùCÿùþaþbþ¿þ_þaþÝþüýè{è2;,,ÒLèå6!ý6Ö6´6A!6ÒB}ð6š6f66I!×6I!ø6ê!Äÿ6ؤíêÌÝ J!ã6á6 º76L!®YwYºY½Y¸Y©YÀYPY­YPZPZPZ¸Y¸Y¸Y¸Y¸Y¸Y¸Y¸YºYŠYçZáYŠYŠYZZZ¸Y¸Y¸Y¸Y¸Y¸YVYVYVY¸Y¸Y¸Y¸Y¸Y¸Y¸Y¸Y¸Y¸Y¹Y¹Y¹Y¹Y¸Y¸Y¸Y¸Y¸Y¸Y¸YŒWŒWŒWBYBYŒYŒYŒYŒYŒYŒY©Y©Y©Y©YŒYŒYŒY¤YßYßYßYßY‚Y‚Y‚YçY=Y¿YYYY:W:W:WŒYŒYŒY@Y=Y@Y@Y@\@\@\ÓZÓZÓZëWëW¸Y¿Y«Z¸YvZvZvZ]Z]Z]Z]Z]Z[W[W[W[W[W[W[W_ZŒZ¤Z\\\ÆZàZäWäW^WàWøWW@W@W@WtYtYtYýYýYýYýY›Y›Y›Y;W;WßWßWßWßWàWiWW^WY€YYäWäWäWKYKYKYKVKYKYKYYYY™Y™YZZZZZZZZZZZZZ§\§\§\-\-\3YÒZÒZÒZWWEWJWJWéYéYéY*WüWüWüW÷W¥Z¥Z¥Z>W>W>W'W*W*W*WWWW™YY¸W¸WDW²YÄYJWJWêZêZêZüWüWüWüWþW_W°YÜ\jWjWjWjWjWVVVVVVºTºTºTŠWWWWWÐWÐWÐWÐWWWWWWWW"Z"Z"Z6Y6Y6Y6Y6Y6Y6Y6Y6YhXhYYYhXhXhYhXhYÀYÀYÀYÀYÀYÀYÀYÀYÀYÀYÀYÀYXZXZXZZZZŸYŸY–Y–YŸYŸYŸYŸYŸYŸYŸY3W3W3WY¢Y¿Y¿YôYøZñZôYôYšZšZšZõYõYõYõYõYÉYÉYÉYèYtYtYtYvYpYvYYYYðYSYòYðY¤Y¤Y¤YúYúYúYúY’W’W’WBZBZBZÜVÝYÝYXYXYXYXYXYXYXYXYXYXYXYXYVYXXXYXYUYXYUYXYXYXYïWïWïWXYXYXYXYXYXYXYXYXYXYtYtYtXtYtYtXtXtYtXtXtXtXtXtXtXtXtYtYtYtYtYZZZtYtYtYtYtYtYtYtYtYtY¯W¯W¯W¯W¯W¯W¯W¯W¯W¯W¯W°W°W°W¯W¯W¯W¯W¯W¯W¯W¯W¯W¯W¯W¯W¯WUZUZUZ¯W¯W¯WsY#hŒYŒYgggsWsW~YsWrVsYrWYYYY1Y1Y1YCWCWCWCW)Z)Z)ZsYsYsYüZüZüZüWüWüWüWüWüWüWüWüWüWüWüWüWüWüWüWüWüWüWüWüWüWüWüWüWüWüWüWüWüZüZüZÙYkZrZUYUYUYUYUYUYUYUYUYUPUYUYUYUYUYUYUYUYUYUYUYU$U0U:UYUYUYUYUYUYUYUYUYUYUYUYUYUYUYUYUYUYlVlVlVYYYlVlVlVlVlVlVZ!ZœYœYœYœYœYŸZ,\@Z!ZïYïYïYïYïYïYïY=Y=Y=YïYïYïYïYïYòYïYïYïYïYIYIYUYIYIYIYIYIYIYIYIYIYIYIYIYIYIYIYIYIYIYIYIYIYIYHYIYIYIYIYIYHYIYIYIYIYIYIYHYHYHYåYåYåYWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW‰W‰W‰W‰WWWWWWWWWWWWWWWWWW¦Y¦Y¦YWWWWWWWWWWWWWWWW]Z^ZzY˜YúY—Y·Y·Y·Y·Y&W&W&WzYzYzYÅVÅV`V`V`VYZGP'*¢WWWWWWë WW““!’WWWWWWWWW›#›#›#–YYWWWýœtY¼Y“W“YGYðWdZZHYYAWQYYW4Y0WÀW=WmY¤Y¤Y\Y|YµW†YyWZÑZ”Y[YÌV†ZrV÷YPY WY\R   õÒ5,+|=+(ú ú MMMMÈ ¢I<‰ (g-(*((.(&(,('(âÿöâÿ ÙÿöÙÿöÿmDÿö8ÿöÿëcÿö ÿöãÿöÿöÿöÒÿöÒÿöâÿ`âÿ"ªúeôUÿö,D¨, D‚‚~»õ 39ou~ŠŒ¡Î×öùÿ'V_‡ŠÇêô JO w  ƒ Œ ¨ ° ² ¹ Ä È Î × Ý ã û   ( 0 3 6 9 < B H M Q \ ^ u   : D H N W c u Àõùüôõ "›Ÿ¦²¹¿ùEMWY[]}´ÄÓÛïôþ d q Ž ” µ ¹ á ð! !$!3!"M"U"g"k"s"w"‰""¨"µ"½"Ã"Æ"È"Ï"Ù"ã"é"ñ## ####*#®#³$&$i%K%l%ÿ&-&:&g&o'@** -g-o......0¦+§Œ§ªûûû6û<û>ûAûDûOÿýÿÿ  ¾÷$7Ptz„ŒŽ£Ñðùý‚$1Ya‰°ÐðM y … “ ª ² ¶ ¼ Ç Ë × Ü ß æ     * 2 5 8 < > G K Q Y ^ f     = F J W ` f y Ðùû ° ›¤«·¼ HPY[]_€¶ÆÖÝòö p t   ¸ Ð ä!! !&!5!>!A!J!M!S!!¤!©!´!¼!Ð!Ü""4"@"P"W"j"m"v"z"Œ"¢"²"»"À"Å"È"Í"Ö"à"æ"î#### #)#›#²$$`%%P%€&,&9&`&i'@** -0-o....(.0¥§ˆ§ªûûûû8û>û@ûCûFÿùÿÿÿãÿÂÿÀÿ¿ÿ¼ÿ¹ÿ£ÿŸÿ›ÿ–ÿ•ÿ”ÿ“ÿ‘ÿyÿwÿtÿrÿbÿ\ÿXÿOÿMÿLÿKÿGÿ'ÿÿþþþ ü\ü[üZüYüWüUüTüSüPüNüLüJüBü>ü=ü;ü6ü5ü1ü/ü.ü-ü,ü+ü)ü(ü$ü"üüüüù„ùƒù‚ùùù~ù}ùuùmùkùhöHö9ö6ö5ó’ó‡ñWíMíLíDíAìÉìÈìÄìÀì¼ìºìzìtìrìpìnìlìkìjìiìhìfìeìdìbìaì_ì^ì]ìRìPìOìDìBì,ì*ììììììììì ëýëóëòëéëãëàëÚë¸ë´ë³ë±ë°ë®ë­ë«ë©ë§ë£ëšë•ë“ë’ë‘ëë‡ëëë{ëmëfëbëSëNêÞêÛêêVéÀé¼é©é}éréMéLè|å½å¹â“âŒáæáåáãáÛáÚk i¯i’=0+*)('&} dÇ ~ »b¾õ~÷ ¶$3à79ðPoótuz~„ŠŒŒ!Ž¡"£Î6Ñ×bðöiùùpýq‚ÿôrv$'|1V€Y_¦a‡­‰ŠÔÖ°Ç×Ðêïðô  JMOY w\ y Ô ƒÛ … ŒÞ æ “ ¨è ª °þ ² ² ¶ ¹ ¼ Ä Ç È Ë Î × × Ü Ý ß ã æ û!  7  :  @  (B * 0X 2 3_ 5 6a 8 9c < <e > Bf G Hk K Mm Q Qp Y \q ^ ^u f uv  †  ˆ    :“ = D¼ F HÄ J NÇ W WÌ ` cÍ f uÑ y á ÀèÐõ ùù/ûü0 ô2‡°õ  M [ \ " a›› dŸ e¤¦ h«² k·¹ s¼¿ vù z t Š E HM ¶PW ¼YY Ä[[ Å]] Æ_} Ç€´ æ¶Ä ÆÓ *ÖÛ 8Ýï >òô Qöþ T d ] p q  t Ž Ä ” ß   µ ä ¸ ¹ ú Ð á ü ä ð !! ! !$ %!&!3 ?!5!< M!>!? U!A!E W!J!K \!M!N ^!S! `!!™ !¤!§ —!©!ª ›!´!µ !¼!Ì Ÿ!Ð!Õ °!Ü!Ý ¶""/ ¸"4"> è"@"M ó"P"U"W"g"j"k"m"s"v"w!"z"‰#"Œ"3"¢"¨E"²"µL"»"½P"À"ÃS"Å"ÆW"È"ÈY"Í"ÏZ"Ö"Ù]"à"ãa"æ"ée"î"ñi##m## n##r# ##s#)#*w#›#®y#²#³$$&$`$i¶%%KÀ%P%l %€%ÿ)&,&-©&9&:«&`&g­&i&oµ'@'@¼**½* * Â-0-gÃ-o-oû..ü..ÿ...(...0.0 ¥¦+ §ˆ§Œ7§ª§ª<ûû=ûûCûû6Hû8û<bû>û>gû@ûAhûCûDjûFûOlÿùÿýv€{ŸÃ™ÈÕ¾€Ì ©ê  ô     !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`a†‡‰‹“˜ž£¢¤¦¥§©«ª¬­¯®°±³µ´¶¸·¼»½¾ }rdei x¡pk <vjˆš Ösgw º É ÇS ãl|<¨ºcn ÒT û ¾m} ƒb‚…— p q y z u v¹sÁ: ¡ ð – —>? ~y w { „ŒƒŠ‘Ž•–”œ›óiq{|}z€~j°,°K°*PX°JvY°#?°+X=YK°*PX}Y Ô°.-°, Ú° +-°,KRXE#Y!-°,i °@PX!°@Y-°,°+X!#!zXÝÍYKRXXýíY#!°+X°FvYXÝÍYYY-°, \Z-°,±"ˆPX° ˆ\\°Y-°,±$ˆPX°@ˆ\\°Y-°, 9/-° , }°+XÄÍY °%I# °&J°PXŠeŠa °PX8!!YŠŠa °RX8!!YY-° ,°+X!!Y-° , Ò° +-° , /°+\X G#Faj X db8!!Y!Y-° , 9/ Š GŠFa#Š Š#J°PX#°RX°@8!Y#°PX°@e8!YY-°,°+X=Ö!! ÖŠKRX Š#I °UX8!!Y!!YY-°,# Ö /°+\X# XKS!°YXа&I#Š# ŠIŠ#a8!!!!Y!!!!!Y-°, Ú°+-°, Ò°+-°, /°+\X G#FajŠ G#F#aj` X db8!!Y!!Y-°, РЇ °%Jd#а PX<ÀY-°,³@@BBK¸cK¸c Š ŠUX Š ŠRX#b °#Bb °#BY °@RX² CcB² CcB° c°e!Y!!Y-°,°Cc#°Cc#-¸ÿ…°K°PX±ŽY±F+X!°YK°RX!°€Y°+\X° E°+D° E°+D° Eºÿ+±Fv+DY°+ ¼ÙR]]J4YTDAPN[WL02?i8FH:=6.`*| ¸ hè0xè d Ð  ` Ä X Ä „ € ü`T0¨Ü$\$`ÄŒLÀ8¤¨TÌ4€üp„@( T ´!(!p""|"Ø#4#˜$$l$¤$Ü%&Ä't(((ä) *8+0+Ä,$,˜--<..¤/4/ì0¨1282ä3€3Ä4p4Ì5h5Ä6p6¬7T88 849,:”;„ >8>T?l?¼@@$@@@ŒA$A@AüCC<CôD„D˜E,EœF\FpGœHðJ¨J¼JÔJìKKK4KLKôM8MPMhM€M˜M°MÈMàMøN¼NÔNìOOO4OLO€PdP|P”P¬PÄPÜQhRPRhR€R˜R°RÈRàThU¬UÄUÜUôV V$V<VTVlWHW`WxWW¨WÀWØXHY4YLYdY|Y”Y¬ZhZ€Z˜Z°ZÈZà[œ]¤]¼]Ô]ì^^^4^L^d^|^”_X`T`l`„`œ`´`Ì`äa´bèccc0cHc`cxcc¨cÀcØcðddÌeœe´eÌeäeüff,f¸gdg|gÀgØgðhh h8hPh´hÌhähüii,iDi\itiøjdj|j”j¬jÄjÜjôk kÜll¨lÀlØlðmm n<olo„oœo´oÌoäoüpp,pDp\r s´sÌsätÌv v$v<vÐw¨wÀwØwðxx x8xPxhx€x˜y|zˆz z¸zÐzè{{{0{H{`{x{|}~~$~쀀H€\P‚4‚Dƒƒ°„|„… …†$† ‡Tˆ„‰4Š,Š‹‹ŒŒˆ@ŽŽ 0ìÈ‘¤’Œ“€”X•$•ø—4˜\˜¼™”šT𸛏œ,œØ¬Àž`žôŸ¼ < À¡ˆ¢X£¤,¤ø¥ì¦ˆ¦˜¦°§X§h§€§˜§°§È§à§ø¨¨(¨@¨X¨p¨ˆ¨ ¨¸¨Ð¨è©© ©<©\©|©œ©¼©Ü©üªª0ªLªlªˆª ª¸«ü­0­H­`­x­®p¯H¯`¯x¯¯¨¯À¯Ø¯ð°° °8°è±±±<±T±l±„±œ±´±Ì±ä±ü²²,²D²\²t²Œ²¤²¼²Ô²ì³³³4³L³d³|³”³¬³Ä³Ü³ô´ ´$´<´Tµ(¶¶¶0¶°·D·à·ø¸¹ºLºlºˆº º¼ºÔºì» »(»@»X»¬¼Ì½ô¾¾Ü¾ð¿À¿ÔÀèÁÀ˜Ã\ÃpĨŰÅÀÇ4È(ȸÉÜÊøËę̀ÍÐÍäΘÏhÏüÐ`ÐØÑØÒ„ÒÔÓ¤Ó¸Ô˜ÕŒÖDÖü×pØ,Ù(ÚÚ(Ú<Ú¬Û4ÛÜÜ€ÜðݘݬÞðßlà àœátáˆâ8ã$ãøä”ä¨ä¼äÐå,åÈæ¸çtèé0éÐéäêœê´êÄë´ìÔìäíÀíÔîîìïÌð¬ñ´ó ô ö÷øäúû8û¼ûØülý,ýüþþ$þ8þLþ`þàþôÿÿÿ,ÿDÿ¨|œ8Ðä@T¤ô(8xŒ ´Ð0”¨(lÜ$¸(”Ø @ X l € ” ¨ ¼  p Ô 8  è L ` x ˆ œ ° Ä Ø ì   ( < L   ô€Ô@Th|¤àô¸Ìàô0Hˆ¤¸Ì,„˜¬À 4ˆèü\¼8L¤(< ´ÈÜ<ì(<Pdx”¨¼Ðì0Œ4¨$8H\l€”¨ÀØ(Äèttˆœ¸Ìàô¤¸Ì8 œ ô!”!¨!Ü!ð"˜"¬"ø# # #4#H#\#p#„#˜#¬#À#Ô#è#ü$ $H$Ä%d%|%”%¤%¸&0&@&&¨&Ä&Ü&ì&ü'','<'L'œ'è'ø(((Ð(à(ð)8)H)X)¸)È**,*ˆ*˜*¨+€+,<-- -8-P-h-€-˜-°.”/˜0 0ô1ô2 3T4$4„4ä5606@7l88Ä9€:@:ü;„;ü<Ø=|>$???4?L?d?|@ˆA8APAhB@CDDDÌE¼FLF\FlFøG G¨G¼GÔGìHHHÜHôIØIèIøJJ KK¼LPLhL€L˜MM MÀMÐNNÜNìOtP€PðQQlRRR R0RˆR˜R¨R¸STT T UU€VV¨WLWÌX”YpZ Z[x[Ø\$\Ø\è]h^h^Ø^ð_P_Ð`H`°`Àaa$a4a”a¤bÈbØcTcÀd0dÈe\ffŒg@h hÈhàhøiüjjÈjØjèkkkÔl„mXmpmˆm nnÔo€p8pürsssøt¨uLuÌvPwwÔy¬{P{`{p|,|è}8}ˆ} }¸}Ô}ð~аÐð€€ ‚‚€‚‚¬‚ȃ<ƒ„††ü‡ðˆ¨‰hŠ(‹‹`‹¸Œ@ŒÈlŽ4ŽäÐ’’¬“4“À”H”ð•”––ˆ— —´˜8˜´™dš4›lœldžXžÐŸHŸ¤Ÿô ¡¡˜¢¢¬£H£Ð¤P¥¥¬¦¦ˆ§Ø©ª\«Ä¬¬¬0¬è­¨®d¯¯ °0°Ì±`±ä²d²ô³„³”³¬³Ä³Ü³ô´´´,´Dµµ$µ<µTµlµ„µœµ´µÄµÔµì¶¶¶4¶L¶d¶t¶„¶œ¶´¶Ì¶ä¶ü··,·D·\·t·Œ·¤¸ ¸t¸Œ¸¤¹pº<ºØ»h»ð¼p½|¾„¿4¿Ô¿ä¿ôÀÀÀˆÁÁ„œÃ8ÃÈÄpÅ8Å䯔ǰÈÈ´É Ê<ÊàË4ËàÌÜ͈ÍøÏÏœÐ$ÐÀÑØÒ|ÓpÔÕÕ¬ÖèטØ ØÔÚhÚøÜ(Ü„ÝtÞDÞàßüà àhà¤áá$áèâ8ããÄä¸åˆæ4çç„è,é,éèê„êÐëœìí í´îÀï`ðññ€ò8òøóôlõPöl÷$÷´ø\ù@ùÐúìû<ü4ý0ýìÿ ÿ¸p\t¤¼Ü 8Tð<Pp„Àø<t¸ÌÜð4˜¨,¨lÌDxØ < ä  h Ì p Ü € °  ˜dܘ\ð@äh´X°@4ìløˆ œœÌ0X”” €Ø˜\è T!!˜!è"p"Ð#$#h%T%¼%ø&d&œ'Ø))*++¸,H,à-|..„/œ0T1D2,2p2Ø343È44h4¼55ˆ5ø6P6È7@7 7Ü8<8”99œ:x;D;€;¸<\=€=Ì>x?4?H?`?˜?´?ÌAHBÜD`F@GXHÔJ(KÈKàKøLÄM´MÌMäO”QXR T$TØUüWTXLY¬Z¸\„]|^D_<`xa¤bhc8dteˆfØg|g”hHiljpkŒl`m@nn(o$ptpŒqtr¤sltŒuèv$v<vtw@w¤xhyTzzz {ˆ||˜|Ð}} }8}¬~0~p~È~àTˆô‚`‚øƒ8ƒPƒhƒ€ƒ˜ƒ°ƒÈƒàƒø„…ȇä‰$ŠÈ‹‹‹´Œ\ Žà‘‘è’l“H“ä”,”D”\”t”Œ”¤”¼”ä•Ô–˜—ȘL˜d™ˆšDšð›ðžœ ¡¤£x¥H¦¤¨H©p«¬­„®˜¯Ä°ä±à³l´<µ˜·D¸4º(»¼À½¼¾¿pÁ<ÂlÃ4Ä$ÄìÅÔÆÐÇtÈÉlÊÊ4ËHÌŒÍ<ÎÎÔÏ(ÐÐŒÑDÒTÓ Ó¬ÓäÔÔ¸ÕÜÕøÖÖL×LØ(Ø@ØXØpÙàÜݼÝÔÞtßDßÜà¤á¨âôãôäèåäççÜè¨èôéÌê êÔììLíXîîØïHððTñpò”óÜõPöÈöàöø÷÷(ø„øœùÈúÄû¤üäþÿ„T@üD„ œ œ  ôX88üdˆ°Œd¼$ÜŒäxØ |!!ä"0"|#Ä$Ü%è' (x)**ä,(-„.H/Ð0˜1h2¤3L3È4Ð649 9è:„;=¼@XBB C`CxEXFèH€JhJ€KÜKôL MlN O€PÜR„S\UVìX¬ZŒ[h\]$^¸`<a|b$c(cðdÔf ghi¤jðk¤lìmÜnxo0pÀrrät uŒv¨wôxpypz z¨{d|8}L~P€$ ‚D‚\‚t‚Œ‚¤ƒƒx„”‡H‰@ŠÌŒ¤LŽŽØìØ’,“€”•˜–̘ؗܚ¨›Tœüžè 8¢`£ô¥<§4¨¬ª˜«h¬\­x®Ì¯¬°°²L³H³è´Ð¶T·<¸8¹º »<¼h½¾¼ÀÁ´ˆÃÐĸÅàÆÜÇØÈ€ɬÊÔËŒÍ@ÎðÏ´ШÑÀÓÓàÔüÖD×<×ÄؼÚ@Û@Ü<Ý Þ ß$à4áâ€ãØåTæ0ç`è8éXêLë`ì í4îTîôðòDô ôàõ¸÷ø8øLø`øtøèú$ú„ûìüèýDþXÿDÿüŒðhàì°xÔ$˜D L à è d  Œhظh$ìð xÔ °$T¤À@М  ü"Œ#H#Ä$<%`& &''X(,)d*Ì+\+¨,h-d.È/L040¸1|1ä2€3@4@5°6à7ü8¸9p:Ä;ø<ø=¨>¼?„?”?à?ø@D@\@¬@Ä@ä@üAAdA|A”A¬AÄAÜAôB B$B<B\B|BœB´BÌBìC C,CðDDTD”DÐE@E´F$F¸FÐFèG<G€GüHdH|H”H¬HÄII(IpIˆIÈIàJJJ0JpJˆJ J¸JÐJèKKK0KHKhKˆK K¸KÐKèLLPL”M$M˜M°N N8N N¸NØNðOOpOˆO O¸OÐOèPP P8PPPhP€P˜P°PÐPðQQ|Q”Q¬QÄQÜRtRŒS$S<SÔSìT T¤T¼TÔTìUUU4ULUdU|U”U¬UÄUÜUôV V,VÈWdW|W”W¬WÄXDX\XÜXôYtYŒY¬Z,ZDZ\ZtZŒZ¤ZÄZäZü[[4[T[l[„[¤[Ä[ä\`\Ü],]D]”]¬]ü^^4^€^˜^°^È^à^ø__0_H_`_€_ _¸_Ð_ð``0`€`ða@aøb¤c4cLcÜcôd„dœd¼eLede|e”e¬eÄeÜeôff¬g g¸h,hDh¸hÐiDi\i|iðjj j8jPjhj€j˜j°jÈjàjøkk(kHkhkÜl<l„lìmmhm€mènn nˆn n¸nÐnèoo o@oXopoo°oÈoàoøpp0pq¨rrXssät´tÌtätüuuÐvŒv¤w¸wÐxäxüyy,yDy\y|yœy´yÌyäyüzz,zDz\{x{Ì{ä|8|P|¤|¼|Ü},}D}\}t}Œ}¤}Ä}ä}ü~~,~D~\~t~Œ~¤~Ä„€€4€¼DÌä‚l‚„ƒƒ ƒ¤„,„D„Ì„ì… …œ…ø†@†ø‡‡Ä‡Üˆ”ˆ¬‰h‰€‰ ‰ÀŠX‹0ŒŒÜ°ÈàޏŽÐ¨Ààäü‘‘,‘D‘ü’È“””\•$•Ж|–”—@—X˜˜˜Ì™D™T™l™„™¤™¼™Ü™ôšš,šÔ›xœ œÈxž,žàŸŸ°ŸÈŸè    8 X¡P¢¸£¨¤˜¥Œ¦|§8§ð¨¬©hª,ª°ªÈ«L«d«è¬¬t­­­¨®4®L®Ô®ì¯p°°Œ°ü±p±ä²P²¸³ ³Œ´4´Øµ€¶(¶€¶Ô·(·|¸ ¸Ä¹hº ºlºÌ»»0»H»”»ô¼P¼œ¼´¼Ì½½€½è¾8¾Ä¿„¿ÔÀhÀüÁxÂ4Ã<øÄ0ĨÅ Å8ÅPÅÈÆTÆàÇXÇpLjÈÈÉ ɤɼÉÔÊ\ʼËxÌ4ÌèÍÜÏÏÈÐŒÑPÒÓ ÔPÕÕøÖØרظÚÚÐÛÛÛ$Û4ÛDÛ\ÛlÜ(ÜäݔހޘßHà4áââðãüääåÐæ¼ç¨èéœê ë˜ì€íxîpïLðLñ8òò¼óhô ô$ô<ôèõ¸öˆ÷\÷t÷Œø`ù$ùèú¬úÄúÜûœüŒý|þhþ€þ˜ÿˆ€tlŒÔÌ„<ìÌ 0 ä ü  , D \ t | „ |¬Ä¸ø8päx¬øT°„ 4!„"¤#È$à&<'Ì(è)ð*ø,-D.¬/´0D0¼0Ô0ì11141L1d1|1”1¬1Ä1Ü1ü2242Œ3844ô67888Ü9ø:à<=l><?L@\ATB8CDhE´G8H IJJìKÌLèMüNÔO´PÀQÔRœS`T`U,V0VüW4W¤X<X¸YY¨Z[,[¨\$\¸]]Ø^˜_X`pa„b`c,côdàeÄfðhiiüjàkÄlÄmìo o|oàp°pÀpÐpäpäpôqqq$q4qHqXqhqxqˆq˜q¨q¼qÐqàqðrrr r4rHr\rpr„r˜r¬rÀrÔrèrüss$s8sLs`stsˆsœs°sÄsØsðtt t8tPtht€t˜t°tÈtàtøuu(u@uXv`w w¸wÐwðx x,xLxdx|x”x¬xÄxÜxôy y$y<yTyly„yœy´yÌzÄ{à{ø||(|@|`|||”|¬|Ä|Ü|ô} }$}<}T}l}„}œ}´}Ì}ä}ü~~,~D~\~t~Œ~¤~¼~Ô~ì<\|œ¼Øø€€0€H€`€x€€¨€À€Ø€ð 8Ph€˜¸Ðð‚‚ ‚8‚P‚h‚€‚˜‚°‚È‚à‚øƒƒ(ƒ@ƒXƒpƒˆƒ¨ƒÈƒè„„„4„L„d„|„”„¬„Ą܄ô… …$…<…T…l…„…œ…´…Ì…ä…ü††,†D†\†t†Œ†¤†¼†Ô†ì‡‡´ˆd‰X‰h‰€‰˜‰°‰È‰èŠŠ Š8ŠXŠpŠЍŠÀŠØŠø‹‹0‹H‹h‹€‹ ‹¸‹Ð‹èŒŒŒ0ŒHŒ`ŒxŒ˜Œ°ŒÐŒè @Xpˆ ¸Ð莎Ž0ŽHŽhހޠޏŽØŽð(@Xpˆ ¸Ðè0H`x¨ÀØð‘‘ ‘8‘P‘h‘€‘˜‘°‘È‘à‘ø’’(’@’X’p’ˆ’ ’¸’Ð’è“““0“H“`“x““¨“À“ؓ𔔠”8”P”h”€”˜”°”È”à”ø••(•@•X•p•ˆ• •¸•Е薖–0–H–`–x––¨–À–Ø–ð—— —8—P—h—€—˜—°—È—à—ø˜˜(˜@˜X˜p˜ˆ˜ ˜¸˜Ð˜è™™™0™H™`™x™™¨™À™Ø™ðšš š8šPšhš€š˜š°šÈšàšø››(›@›X›p›ˆ› ›¸›Ð›èœœœ0œHœ`œxœœ¨œÀœØœð 8Ph€˜°Èàøžž(ž@žXžpžˆž ž¸žÐžèŸŸŸ0ŸHŸ`ŸxŸŸ¨ŸÀŸØŸð    8 P h € ˜ ° È à ø¡¡(¡@¡X¡p¡ˆ¡ ¡¸¡Ð¡è¢¢¢0¢H¢`¢x¢¢¨¢¸£<£P£`£x££¨£À£Ø£ð¤¤ ¤8¤P¤h¤€¤˜¤°¤È¤à¤ø¥¥(¥@¥X¥p¥ˆ¥ ¥¸¥Ð¥è¦¦¦0¦H¦`¦x¦¦¨¦À¦Ø¦ð§ §$§œ§¬§¼§Ô§ì¨¨¨4¨L¨d¨|¨”¨¬¨¼¨Ð¨Ð¨Ð¨Ð¨Ð¨Ð¨Ð¨Ð¨Ð¨Ð¨Ð¨Ð¨Ð¨Ð¨Ð¨Ð¨Ð©©$©4©l©¤©´©Ä©Øª4ª˜ªø«L«d«|«”«¬¬$¬Ä­­X­h­€­ ­°­°­°­°­°­°­°­°­°¯\±t±¸² ²x²¼³³|³¸´´µtµŒ¶T¶Œ¶Ð··<·`·¤·Ø¸€¹(¹@¹X¹p¹Ðº\ºì»„»˜¼¼˜¼°¼Ô½¤½è¿t¿”¿¼¿äÀÀ4À\ÀŒÀ°ÀØÀØÀØÀØÀØÀØÀØÁ\ÁpÂÂôÃÐÄ0Å0Æ ƤÆèÇÇ@ÇTÇhÇ|ÇǤǸÇÌÇàÇôÈÈÈ0ÈDÈXÈlȀȔȨȼÈÐÈäÈøÊÌXÍxÎ4ÏÄÐÔÒ ÔÔ4××ÐØôÙôÚˆÛÛ0ÜHÝtÞÄßtáââããÈää<äxäÜå@å”卿8æüçç<çXçlçÌèè¼éLéˆé¨é¼êê4ê”êäëë(ë<ëTëlëàîHñHò(ò@ó\ôìöäöôøøúØü¼ý|þÿü¼@è”¼Ø  È ØÄ ¼Àø8TÄ8H\xŒœ¬Œ 0è 4"è"ü$Ø$è$ø%%%x%”%¸&|&ð''¤'¸(((ø)Ð)ä+Ø+ì, ,,,D,d,„,¤,¼,Ü,ô--4-T-l-|-”-´-Ì-Ü-ô..<.T.d.|.œ.¬.¼.Ì.Ü.ì//$/</L/d/„/¬/Ä/Ô/ì0 00,0<0L0¨11X1´2P2è3`3|33¬4,4Ä4Ø4ì5Œ6,6ˆ6è7(7l7ˆ7¤7¸7Ì7è88 8<8X8ì9|99¤9¼9Ô:H:¸;(; <8<Ì<à=à>D>ð?Ì@@ABBTB C@DðElE€G4GHG\GÀGÔHDH|HH¨H¼HôIPIèIøJ$J@J\K8L LtL°MLMäN NpNˆOO,O`OtOèPhP€P Q¸S˜S¼SÐSìTTT<TlTŒTœU`V€VœWlW€W˜X X¸Yø[4[L\¼\Ô\ô] ^ ^8^X^x^˜^¼^Ü^ô__,_H_`_x_¨_Ä_à`\`|aaDa`a|a˜a´aÌaàcc`c¸d<dÀdÜdøee0e”e¨eÄeàeøff°gTgÌgài,jxjj¨k˜l|m,mDm\m¼mÐmìnn$n8nPnho<oìpp p8pTplpÐpäqPq¼r rœssXs˜s´sÐsìtttXtlt€uu\u¨vv,vHvdv|vv°vÄw€x<yyìzzz4zLzpzz´zØ{Ð| |t|ˆ|œ|ô}H}\} }´}ð~4~|~´~ü$8ˆÀ€€,€@€T€¼|´‚‚t‚؃ƒPƒ”ƒ¼ƒä„ „4„\„„„¬„Ô„ô……4…T…t…”…´…Ô…ü†$†L†t†œ†Ä†ì‡‡<‡\‡„‡¬‡Ì‡ìˆ ˆ,ˆLˆt‰l‰Ü‰üŠT‹ Œ(|4d‘Ì“P”T•ü—„™ ™@™x™”™°š,š°šÌšè›pœ œ(œDœ˜œðH ¼Øôžž,žHždž€ž”ž¨ž¼žÐŸ8Ÿ¤ ( ¬¡¡”¢¢€¢”¢¨¢¼¢Ð¢ä¢ø£ £ £<£X£t££¬£È£ä¤¤¤8¤T¤p¤Œ¤¨¤Ä¤à¥d¥ô¦¦¦¬¦È¦ä§ˆ§¤§À§Ô¨h¨|¨˜¨´©<©€©œªª|«««8«T«p«Œ«¨«¼«Ð«ä¬`¬è­Œ­ ­´­È­ä®®®8®T®p¯ ¯Ø°´°ì±$±\±”±Ì²²<²„²Ì³³L³„³¼³ô´,´d´x¸ä€ÇÇ$Ç8ǀǔǨÈÈdȀȔȨÈÄÈàÉ$ÉŒÊ(Ê@ÊôËÌÌͬÍÈÏÄÏØÐ4ÐtÐØÐôÑÑLÑœÑÌÒÒ0ÒpҌҨÒÄÒàÒüÓ”Ó¨Ó¼ÓÐÓäÔÔ@Ô\ÔxÔ”Ô¨ÔàÕ4Õ˜ÖtÖ¼×TÙ¸ÚüÜÜhÝÝÝ0ÝLÝèÞ|ÞÈÞÜßPà,à¸àÌáá8áLáháäáøâ(âDâXâtããpã„ãäãøä€ååPåœæHæèççç4èè,è@è\è¤èÀèÜé@éŒéðê@êTíî4ïŒðÔñpò|òìô(õpõÜö ødøàù„údûXü$ü„ý@tŒ  ˜ °   è p   | Ì0Ì<¬Ä,Ð,äÌÐL¬hØxÄ,èÈ(„ÀhèÀ¬<  „!$""ì#´$ì%d%°'D'ü(@( (Ð)Ð* +L+„+Ì,,,L,,¤,¼,Ô,ì---4-`-|-˜-È.”.¤01ð3`4x67¼9ì:À;ì<¬= >>à?è@ÔAÌC¨EðFðHdHôIÔJPJèKˆLtM OHPLQ@S`T¼UlV”X$Z,[T\à^0_ŒalcŒcØe„fÀhXiÌkl,m|o,q s0tuDuœvxwxÀz {Ø|À}ì~Є€¼à‚¸ƒÜ…ˆ†H‡ˆˆT‰ð‹ Œ”Žè<‘Œ’ ” ”è––l—8—ø˜È™¼››ÜœôžHŸÀ \¡¢d£Ä¥8§,¨°«(¬H¬Ä­ ¯¯¸±²t´µTµÐ¶Ä·¤¸Ô¹Üº¼»ð½˜¿¨ÀìÁ|ÁÔœÃÄ0ÅtÆ”ÇÐÉÊ”ËÔ͈΀Ð ÐÔÑàÒÔÔÕpÖÖ¸×LؘÚ Ú¬Û¬Ý€Þ à$âã,äÄåÈç$èé¸ëìÈî$ïÜñ¨ó(ôàö4÷¬øTùdúû4ü0üôý þ¸ÿ„¼à¨œÀœ@d , Ø ´ \ h¸”Høx`äèT €¼!4!¸"è#Ä%d&P'Ì)(*ô,<-ð/h1L2¨3Ô5P6Ð8X:@;p4@hAÌCTD(EøHLIÈK„KÐL M8NdO\P¼R<RÄSÀTÄUèWXYh[P]¬^0_@`4`Ðbcepgh¨jpl mLnLo˜qrHs|ttèv\wŒwÔx xxz|$}t~~Ô€0„‚pƒ„œ…|‡tˆ|ˆðŠ‹<Œ¨àŽ Üü‘Ä’ˆ“”È–—„˜è™ìššš$š\šœ›\œHĞܟä ô¢¤¤,¥˜¦ü¨¨¨© ©8©ÔªXª¸«4«œ¬<¬¨­­Œ­ô® ®$®D®d®|®”®¬®Ä®Ü®ô¯ ¯$¯<¯T¯l¯„¯œ¯´¯Ì¯ä¯ü°°,°D°\°t°Œ°¤°¼°Ô°ì±±l±l±l±l±”²4²¨³¤´´ µì¶„·l·ø¸Ô¹¬ºÈ»Œ¼,¼Ì½|½ô¾Œ¿8¿ÐÀ(ÀœÁÁ„Â<ÃdÃÔÄ,ÅÅôÇ@Ç ÈɰʼËxÌÌøÎ ÎØÏìÐèÑôÓ<ÔÔðÖ×dØ@Ù¬ÚxÛ ÛÈ܈ݨÞ°ßÜà¤áðã(ää¨å æ¼çÔètédê,ëdí`ïŒð¨ñœò´óhôdô˜ôðõ|õÔöh÷ ÷Äú|ûèüLý|þØÿlÿô Ì   À œ è  Ô  ü ì D ð ô ô Ä \  ` x ˆ œ ¤ ´ Ä ¼ ü   À @ À !Ä "H #L #À $8 $  %P %Ü &€ 't (P (Ü )¤ *( *Ð , ,¨ - -Ü .è /p 0( 0¬ 1x 2 3d 3Ø 4( 4œ 4ø 5„ 6t 6¬ 7€ 8@ 9 9¼ :ô ;¸ T ?< @l A B„ Cˆ DÀ Eˆ FH G¸ Hð IØ K° MD Nx Oh P4 P¼ Qè R¸ Sp T Tì Uô V˜ W¸ XÀ Y` Y˜ Z„ [¬ \ ]„ ^P _ˆ `Œ a| a´ bp cˆ d€ e eè fÔ gˆ i jÐ lˆ n@ oÄ q8 s4 u< wH yH { || }˜ œ D ‚| ƒì …< †è ˆ\ ‰Ð ‹ Œx ŽT È ø ’È ” •€ —T ˜Ä š ›\ ´ ŸH ¡h ¤ ¥¸ §Ì ©œ «ä ®0 °h ³ ´¤ ¶d ¸ ¹ä ¼ ¾h ¿ô Á  à Äð Ç ÈÜ Êt Ì, ͨ Ï” Ñø ÔÄ Ø Ú< ÜT Þ< àœ â| äœ åü çØ éØ ì@ îÀ ð˜ ó$ õô ÷À ù` û8 ý„ ÿì L  h h t   ” < Ä D   ¸ ¼ ü T è  " #\ $Ô &Œ (Œ *X , -œ .´ 0 1Œ 2Ì 4@ 58 6Ä 8ˆ :ä <4 =€ ? @È C@ E Ft H¨ IÔ Kˆ M` O< Q˜ S8 T` U¨ W< X” Z \ ]( ^˜ `X a´ c¤ e fl gð iP jô lh nx p0 r s tx uˆ v° x( y| {h } ( €¨ ‚< ƒˆ …L ‡œ Š ‹È ü à ‘ð ”„ –H —à ™° › œØ Ÿ,  Ä ¢” ¤È §´ ©< «p ­T ®¬ °0 ±ø ³À µü ·Ð ¹\ »t ½ ¿” ÁL ÃP ÅL ÆÄ É Êø ̘ Î0 Ð| ÒÔ Ôl Õü ×  ÙÐ Û˜ Ýð ß” àè âl ä¸ æÔ èŒ ê| ìp ï ñ´ ó4 õ öü ùH úØ üH ý  ÿ\    ¨ Ô €  Ð x Ð ð ¨ X ì T Œ Ø  $ È œ "< #| $ %° &ü 'ä ), *4 +` ,T -` .p /Ì 1$ 2ø 3ì 5t 6À 80 9` :t ;  <œ ? A4 BÀ E0 GT Iô LH Nè QP S4 T¤ W Y Z` \h ^ `X b8 cô el fˆ hh jØ lä o$ q sp u| wx y$ {( |ì ~ü €¸ ‚ì „Ô ‡ø м ŒT Œ h ’4 ”Ô — ™Ø œL ŸH ¡ì £Ä ¥\ ¦t ¨| ª¸ ¬Ì ¯Ü ² µÌ ¸à », ½ ¾, ¿x Àð Áô Ã| ÄŒ Æœ È\ É ÊÔ Ì Í μ Ð$ Ñ Ód Ôx Ö€ ×ô Ù< Ú\ Û@ Ü0 Ýœ Þä ߸ à¼ á  â¬ ãÌ ä” å¼ æ¨ çp èx é¸ ë ëØ ìÈ í˜ ï ð, ñ8 ò òè ôx õ¤ öt ÷„ ø° ù¬ ú< ú” úð ü ü  ýt þ¼ ÿ” 4 ¬ h ° Ô d  (    D D ¨ d \ ü è   0 H ` x  ¨ È Ø ¨ ð È p Ô ì ˆ !à # $8 %¤ ' (ð *T +œ ,Ä . .° /¨ 0l 1¬ 2Œ 4, 5 5ð 7t 8Ä :l ; ;” Ø ?D ?À @P AD B Bø C  D` E@ F  Gˆ H˜ I¸ J` Kˆ L$ Lü Mø N  OÐ Q8 RH Sh T¤ V¨ Y [` ] _ `´ b cì eü gp i j` kÀ m$ nH oÌ qL rÔ tØ và x| z | }Ð 8 €Ì T ‚D ƒp „X …8 †d ‡œ ‡´ ‡Ì ˆ¨ ‰| ŠP ‹Ì ˜ Ž Ü ‘ ’¤ ’Ü ’ô ”H ”¬ ”ì •ô — —4 —L —d —| —” —¬ ™0 š š4 šL šd š| š” š¬ œ ° Ÿx  L ¡\ ¢¨ £ì ¤¸ ¥À §4 ¨H ©Œ ªÄ ¬ ¬ô ¬ô ­ì ®ˆ ° ±¸ ³4 ³ø µT ¶¼ ·\ ·t ·Œ ·¤ ·¼ ·Ô ·ô ¸ ¸, ¸D ¸d º »Œ ½\ ¾ü À Á Á Â| à Ãè ÄÐ Åt Æ@ Æø Çx ÇÌ È„ É` Ê Ê Ë\ Ì4 ÌŒ ÎÀ Ï€ Ѱ Ô Õä Õü Ö Ö, ÖD Ö\ Öt ÖŒ Ö¤ Ö¼ ÖÔ Öì × × ×4 ×L ×d ×| ×” ׬ ×Ä ×Ü ×ô Ø Ø$ Ø< ÙÜ Û¬ Ý€ Ý  ÝÀ Ýà Þ Þ Þ8 ßä àÐ áø â„ ã ä äH ä¤ åT åè æ, æl æÐ ç4 çh è è` é$ éà êX êÜ ëL ìH ì¼ í í| íà î4 îà ïX ïô ð€ ñD ò óH ó¬ ô( ôl õ õt õÐ ö0 öà ÷Ø øØ ùp ú8 ú¸ ûp üd þ, ( Ü Ì ¸ ˜ ì h ´ ì À è  Ð Ø "< % (P + .X 1ä 4T 6ì 9Ä øB˜D\F¼I\JøLÜN°P¸RäUTX$ZØ]À`HcpfÔh¤jüm”oÔqds¤vxð{h}8œ‚P„Іdˆ„ŠüT0“(”è—™›äžt ¸£€¦¤©\«ä®Ì²´€·pºœ½„¿ØÂ$ÅDÆ€ÇôÉhËXÍÎÔМÒÔLÕÈ׈Ù ÚÈÜݸßÄá`ãHåçPéàì4îÔñxô”÷øúxý„¼¤¸È ´ ä˜xÐ|Ôlxðè"4$0%`')*X,-t/0¤2x4˜6œ8ì:Ð=<@AtCdEŒG\I€JÔL N¤PdQØSÌVWŒY€[Ì]¬`bÜde˜gœi4j´l¸op(qàsìu¬w4yL{Ô|ü~°€´‚Ø…lˆH‰À‹xŽð˜’È•<—\™¼œtžè¡¨£\¥x§ô© «È®@°x²xµ·Ô¹ºà¼ø¾øÁxÄ(Æ$ȘËPͼÐÒ´ÕÄ×`ÙHÛÈÞ˜á”ã€åÜè„êäí˜ðŒóLõL÷¨úLü8þ´hXÔ t € ð Ø¼ø¼´ P"L$ä'¸)Ð,L.€13Ì6ô9Ø=,@ÐE IK„NtQ¨TŒVüYÔ]_ìcehh4kdm,o|r tàvàyl|l‚,…x‡ˆôŠ|ŒPØÌ’“`”ô–d˜™ˆ›|Àžè ˜¢¤¤P¥Ð§èª`«Œ­D¯D°ü²³Äµœ·|¹¨¼@¾À< İǨÊÌͼÐÐÔ<×ÄÙÜÜ€ßxáðä¼çÄê¬íüñ”õˆùHûhþ𠼜 D 0¬pÜ”ØXôà „!Ì#p$Ì&à)X+ä.80¨36x8 9ð<,>8?°A°DEðH,J´M OÐRÌVWY˜[ä]È`(b´dtfÀiHkTnqrdtPv|xDzŒ}~p€0”‚Є †ØˆÐ‹Tø¤’”`–ˆ˜€š0œ€Ÿ¡t¤§Pªì®P°x³¶¸º„½0¿„ÁlÃäƈÈÔË ΤÑÓà×ÚÜÔà ã åÈè$êHí<ðˆóü÷4úŒþ@¸¼ X,x08°| #&L(x+(-ô14„88:Œ=X@dC@EìIL|O$R@U°WèZ ]¨_¤b,ef”hdjkôn`q0t$vÜy |Ѐ,ƒ<…܉Œ|޼‘””˜–|˜Ø›x¤ D£0¥„¨«­°° ³0¶@¹|» ½<¿¨ÁàÃÐÆ0ÈØÊÄÍ<ÏìÒ\Ô¨×pÚ`Ü„ß4âãØæ,èÄëì”î˜ðàòüõ„øLúxý” l xü¼,<ìà œ"L$\&à(H*H,|.d02$4”6è9¸<Ô>ðADD$G˜K(LìOQœTWœZ€]èa\cdeàh¼kDnq0thx{è}쀄ƒP…¨ˆ`‹ltô’̗ؔLšœ,žÜ¡À¤ §ª$«8¬¼­¼¯H±²8´ µð· ¹ºü½P¾ À¸Ã$Å€ÇÄÉ,ÊLÌÎ<ÐLÒÓ@Ô°Ö׌ØàÚ`Ü|Þ(ß\áâhãŒäÀæìè¤éðëŒí”ïDññxò`ó´õdõ¸õÐõèöLöà÷ÜøøTø ø´øøù<ùxùù¨ùÀùÐùàùðúúú ú0ú@úPú`úxúû°ûÈüPýý¨ýÀýàýøþþ(þ@þXþpÿXXl|”#ÿuý #'™²'+´!7+° /´$7+°/´+°/±é² +³@ +°(/° Ö´$<+°$±+±é°±+°2±é°2°±+±é°±%+´#<+±)+±² 999°°9±±9901#54>54&#"#4632#5!%!!k%45%Z%54%F:I8Uolat³ZþÅÚýy4ýÌ.J1-9 /7%B00=#3?RJswhýëhhÖ«üUF|ÐÙ <²+´ +²+° /°Ö°2´<+°2´<+± +± °901#'#5Ð'STÙþ®ßßRýhh(Ð%Å ^²+°3´ +° 2° /°Ö±é³+´+°/´+°± +±é³  +´ +° /´ +± +013#'73#'(]' ]'Åo††oo††ÿì¹I²+² 333°/³ $3´++³$2°/³$3´++³$2² +³@ +²222° /±!+°6º>ýô¨+ °.°.°± ù°±ùº>òôp+ ° .°.° ± ù°±ù° ³ +³ +³ +³ +° ³ +° ³ +°³+³+³+³+° ³ +° ³ +³ +° ³ +³ +° ³ +@ ........................°@013#3##7##7#537#537337#3å$]jiu'L&|'L&erly$L$}#0| }¹ÄD®DÓÓÓÓD®DÄÄÄþø®!ÿ‚+18Ų+°3´++°22² +³@ +°/±,é°-/°#3´7+°2²- +³@ +°9/°Ö´01+° Ö´ &+°0±+²,222´+²#2222°±5+´<+° Ö´&+±:+±0 ° 9°° 9±²8999°,°$9°-±99°°901%#5&53.546753#.'%5>54&'oi;ÒO $h]e`;[gO@243"þí8<¯CC9MÃ`sggÙ % OXUg 66iU7Fù '8±ð>1ZþzJ716ÿì[Å $0±² +°3´+7+²+´%  +´%7+´  +´7+± À/´ 7+°1/°Ö´ +° ±+´+°±#+´(+°(±.+´+±2+± ´$9±.(³ $9±%+²"#999± ²999012"&46"32654&%3#2#"&46"32654&ÇHcdŒedF)<<*)<;oBþuBÚHceEGddF)<<*)<;­dIEdeŒeF;*)<;)+;^ý'VdHEdeŒdF;)*;;(+;4ÿé}Å*3޲+²+±2é²+´%7+°4/°Ö±/é³ /+´(<+°/±"+´&+°±+´1+±5+±(/° 9°"´,2$9°²+999±±99±%2¶ ,$901%#"&5467.54626=3#>54&#"'32Ò2 ;D\qE]/"dŽ\?2EljÙp&;Y$]]$Y;&2ÿöÚ R²+°/°3´7+°2² +³@ +° /°Ö°2´+° 2² +³@ +² +³@ +± +01##5#5353ÏFÏÏF FÏÏFÏÏWÿmÀh C² +´+°/´+° /°Ö°2´0+´0+°´+°/± +0173#5>=#Wii5hxƒ&&3.ð8(°/´7+´7+°/±+´ +±+01#5ñ8HHP¸h5²+´+²+´+°/°Ö´:+´:+±+017#5¸hhhhÿøÿìÙI²+°3²+°3°/°Ö´+±+°6º=ì±+ °±ù°±ù±..°@013#å7í7Ùý+ÿéûÅ G² +´C+²+±é°/°Ö±é°±+±é±+±± 99±±99014>32#"& 3265+.@;!èwqrvvþäŒJFWYˆM0þŒ¯¹»ÓþßþÜ—f[ÅC²+²+´ +´+° /°Ö±é² +³@ +°´+°/± +01#5>73#f>:Xù? .Rý;"ÿÅl²+± é²+±é² +³@ +°/°Ö±é°±+± é°2² +³@ +±+±° 9°³ $9° ° 9± ±9901632!!>?654&#"2ãe~–dA8uþ(Ro\`P<… Ïöt\„R6#B-Wu?47U9L© ÿéúÅ$޲+±é² +³@ +²+±é² +³@ +´ +±é°%/°Ö±é° ֱ鰱+±é°" Ö± é±&+±°9°"µ $9±±99°° 9°° 901"#632#"'332654##5>54&L9XÙesc@8ƒmÚXHHEN“% _OCxSEåh[l'ODexåMJKCK,A8AÅ \² +²+´  +°3±é°2°/° Ö° 2± é°2² +³@  +² +³@  +±+± °9± ± 9901%!533##5GþÕBAiiXÞª]¾þ4Oªù6þÊ#ÿéÅ!§² +±é² +³@ +²!+±é´ ! +±é² +³@ +° 2°"/°Ö´<+°±+±é±#+°6º?_÷ + ° .°.° ±ù°±!ù°.³ !....°@±² 999°±99±°901!632#".'332654&#"#ÜþÙ;Hfˆk)E-%XrHSTG):Q5ÅWÆ+ƒipŽ)/wXLO[%‚+ÿéÅ%j²+± é²+± é´ +±é³ +°&/°Ö±é°2°±#+±é±'+±°9°#´  $9°° 9± ²999014>32#.#"632#""32654&+"3G?#Qk X >.LQ:i_zƒeîòARR>=PJC^R3bW38‹‚O~ch‡‚SBD[WCGS.Å 4²+² +± é° /°Ö±é² +³@ +± +± °901#67!5x‹^(|þÅJ þϪ¯ µW%ÿéÅ(z²+±$é²+±é´  +±é°)/°Ö±"é° Ö±é°"±'+±é° Ö±é±*+±@   $$9± $±99°± 99°± 9901"&547.5462&"32654"32654‡z…Ò…y6*w¼w*spCC87D9„RQACSu:waz{av:"@1SjjS2@á=32=<24ìM|NM?>&ÿéýÅ#p²+± é²  +³@ +²+±é´ +±é°$/°Ö±é°±!+°2±é±%+±° 9°!µ  $9°°9±²99901#"&'33267"&54632"2654&ý"3G@#Qk X >.LQBÀzƒeïð=PJ€SRk^R3bW38‹‚O~ch‡MXCGSTAE[P¸ ;²+´+²+´+°/°Ö°2´:+°2´:+± +017#5#5¸hhhhhh¤hhÿÿPÿm¹ '¤ù-ÿ÷Ú²+°/±+0175% -éþvŠÆEÏO¡¤O2oa °/´7+°/´7+°/± +01!5!5þäþaFF¬FF2ÿ÷Ú²+°/±+015-5þŠþv EÏO¡¤OMýåk²+´+²+±é² +³@ +° /°Ö±é°±+°2±é°2°±+±é±!+±² 999°°9±±9901#54>54&#"#4632#5ý%45%Z%54%F:I8Uolat³Z%.J1-9 /7%B00=#3?RJswhýëhh"ÿr·å2>² +± é°/±é°*/°&3´3+°2°9/´0+°?/°Ö±é°±-+±<é°<± +±#é±@+± <@  &*06$9±°9°*°9±93· #(-2$9°0±9901332654&#"327#".54>32#"'#"&546322654&#"™SZ @hÑžëØŸOrpr|Òy…ワû’~`BLF]œeT&¾A[6(?b:õþè#ŽX}¶êà C*k¸m€ß„ܘz¾MHiNm¨Wþ˦L&4‚T1E‹Ù ,²+°3²+´  +±é° /± +± ° 901%!#3# ØþçMcxhepxÛÛÙý')Lþ´PpÙc²+±é²+±é´ +±é° /°Ö±é°2°±+±é° Ö± é±!+±° 9±°9°° 9°° 901%#!!2&4+32>54&+pvaþ·(=Z-eF?}’´´/1>D?ãÐ^rÙ$;;p/Tèèþ³+49Eû(ÿéåc²+±é² +³@ +²+± é²  +³@ +°/°Ö±é°±+±é° Ö±é±+± ²999± °9014>32#.#"32673!".(0GyLî+_^Wj{€mZ``!þõKwG/d2bjO4îNN¢Œ‰¡ejþß3Ni`P’Ù:²+±é²+±é°/°Ö±é°± +±é±+±±99013!2#'32654&+P‹žŸŠ¼¬lppl¬ÙÂþ¬ÃRŠ‹P[Ù J²+±é²+±é´  +± é° /°Ö±é°2² +³@ +³@ +³@ +± +01!!!!!­®ýõùþdLúRÙRéRP9Ù @²+²+±é´ +±é° /°Ö±é°2² +³@ +³@ +± +01#!!!­]éþt\Lþ´ÙRéR(ÿéÁå$›²+²+±é²+±"é²" +³@" +´  +± é°%/°Ö±é°± +´ <+² +³@ +° ° Ö±é°/±é° ´+°/±&+±²999° °9± °9° ±9901326=#5!#'#"&54>32#.#"…$9^PšÙ&u²+° 3²+±"é´# +±é°'/°Ö±é°"2°±+±é° Ö±é² +³@ +±(+±°9±° 9±°9°#°9°"°901#&=4&+#!2'4&+326 +q:>ð]Pks6+LCááJEh&0* ")8.IAC?þÆÙe^>RƒH6û<0ÿémå0 ²$+±é²$ +³@* +² +±é² +³@ +°1/° Ö±é°* Ö±,é°±+±é° Ö±é±2+°6ºïÔÂ+ °°À± ù°À³....³....°@±² $999±± 9901%2>54/&54632#.#"#".'3V8N%†µ‹x~ŒX^WJY6B·JQ(>gA)KN8%X+U;*)S#0%…cswkGMD7*01`C9=. #7\<64ZÙ:²+²+±é°2°/°Ö±é² +³@ +² +³@ +± +01##5!k]ð<‡ýy‡RRPÿé€Ù7²+±é² +°3°/°Ö± é° ±+±é±+± °9013#"&533265#]™€‚•]eUXdÙþn‚oþOOTJvÙ!²+²+°3°/±+±°901!#33ydþúdÖÊcÙý—išÙ u²+±33²+² 333° /±+°6º=Áï2+ °.°À±ù°ÀºÂaî¸+ °.±°À± ù° À² ...¶ .......°@01!# #333áf¨£f»h‰¢d¦†hWý©Ùý°Pý°P‚Ù &²+°3²+° 3° /± +±± 9901 # #33€sÇÈqòq»¼ovþŠ0þÐvcþâ—Ù0²+²+°3° /°Ö±é± +±°9±°901#33…]þçsÖÐoþâ»þcIÙ ,²+±é² +±é° /± +±°9°°901!!5!5GþL¶ýÕ¶þfÙTýÍRR5R@ÿ,úÙ@²+´7+°/´7+°/°Ö´ +°2´<+´ +°2± +01#3#úggºÙHüãH­ÿøÿìÙI²+°3²+°3°/°Ö´+±+°6ºÂûì±+ °±ù°±ù±..°@01#/í7íÙýíÿ,ÐÙI²+´7+°/´7+°/°Ö°2´ +°´<+°/°´ +°/± +0153#53ggºÔHHüS,I©Å²+°/±+013# #ÅI›EzyEÅþ„,þÔÿêÿPBÿ‚°/´+´+°/±+01!5Bý¨~22Pçä"²+´+°/°Ö´ +±+01#'‡`<•ä””ÿé )4² +°3´7+°*2²+±&é²& +³@& +°5/°Ö±3é°3°) Ö±é°/±)é°3±-+°"2´<+±6+°6ºøÁÆ+ °°À±1 ù°/ÀºÔÀ+ °°À±1/±1 ù°/À°³+°³+º ±À½+ ³+°1³01/+²01/ Š Š#9²9·/01........·/01........°@±-)²*999°°9±&³.$901632327#"&'#"&54>7>=4&#"26=5Ìad- #()T^O] -<$1&=8:<SEXeJ<6qªIFþÌ)? %(MTG& &(-0þÁI*^  -P,<ÿéÙ]²+² +±é²+²+±é°/°Ö´<+°2´ &+°±+±é±+±± 99±² 999013632#"'#"32654& W0_I\nUqT>#K!CNNDBLK—}€ž[LþJKeV*TJX_a2,ån^_mk^bm<ÜÙP²+°3² +²+´C+°/°Ö´<+° 2°±+´<+±+±°9±° 9014&#"#3>32#‰C)@NSS%K8LYSk70aPþßÙþë0'MBþtB–Ù9²+²+´+²+°/°Ö°2´<+°2´<+± +01#7#5–SST ýô Íiiÿ&«Ù 7²+´+²+°/´ 7+°/° Ö°2´<+° 2±+013#"'53265#5XS  $SS ý‡mG'%ii<øÙ 5² +°3² +²+° /° Ö´ <+°2± +± ±990173##Þk¶Ög±QSÙþUÞµþ©PÌÙ<Ù!²+²+°/°Ö±é±é±+01#TÙý'Ù<ð!o²!+±33²+²+° 3´C+°2°"/°!Ö± é´&+° ±+±é°±+±é±#+± °9°°9°° 9±!±99013>32>32#4&#"#4&#"#32#4&#"#328TTTM$C( ÃJgþð _;3"ÿéË$µ²"+±é²" +³@$ +²+±é² +³@ +°%/° ֱ鰰 Ö±$é°$/±é°±+±é°° Ö±é°/±é±&+°6ºðÚÁÑ+ ° ° À±ù°À³ ....³ ....°@±³"$9±± 9901732654&/.5462#&#"#"'z5E7C&+N]In¶bXf3<.3PNFucËœ/7-%" C>IWTMT+$# E:LZ³ÿéœf² +´C+²+°3´++°2² +³@ +°/°Ö°2´<+°2² +³@ +°2² +³@ +±+±°901#327#"&5#5353V'14GGS Dþ™F+(ŒD<ÿéÝ Z²+²+´C+² +°3°/°Ö´ <+° ±+´<+°´&+°/±+± °9± °901!#5#"&5332653ÝK%P:L[S:2ANSI4,NA”þ/8aP) æ !²+²+°3°/±+±°901!#33[¸^Œ”^ þW© È u²+±33²+² 333° /±+°6º>'ðº+ °.°À±ù°ÀºÂð+ °.±°À± ù° À² ...¶ .......°@01!# #333._je^˜\kdfgh^›þe þh˜þh˜ Ò &²+°3²+° 3° /± +±± 9901#'#373µaƒ…_¹¯_~~^þñÉÉ ¾¾ ÿ&Ô [²+±33°/± é°/±+°6ºÃ2ì+ °.° À± ù°À± ..³ ....°@± °9°°9013#"'5326?3zZé)^ ±Y† ý†l KSþhÈ .²+´C+² +´C+° /± +±±9901!!5!5ºþÉEþV9þÜ Jþ‡IKxI+ÿ,Ù!J²!+´++°/´++°"/°Ö°2´ &+°2²  +³@  +°2±#+±±9901#";#"&=4&'5>=463%$.R%.49",,"94ÙA'µEF&xµ'AE>§E< E ;F§>E_ÿ,›Ù"²+°/°Ö´+´+±+013#_<<ÙüS9ÿ,"Ù J²+´++°/´++°!/°Ö° 2´&+°2² +³@ +°2±"+±±99015326=47&=4&+532#9%RR%/4:!++!:4ÔA'µx%&xµ'AE>§E< E E! Ò¶t°/´ ++²  +³@  +°/´++² +³@ +°/°Ö´+°±+´+±+±°9°±99± °9°± 99°°901"#>3232653#"/&‹/571u5i'*bsNFKE%&?ÿÿÿÿzÿ3Î J À4ÿˆþt²+° 3±é°2² +³@ +² +³@ +²+°3±é°2² +³@ +° /° ֱ鰱 +±22´+±22°±+°2±é°2±!+±±99±± 9901673#5.546753#.8`TjW*euue*XcT9XƒEÎþg tZmab “wz˜ ZYcV2<þm–¸UgÿéÙ5в+²+´B+²*+±3é²3* +³@30 +± À/±é°2´"#* +°3´"+°2°6/°'Ö±é²' +³@'" +°±+± é²  +³@  +° ±1+±0é±7+±'³ !$$9± ³$9°1´*3$9°0°9±² 999±"± 99±3#°'9013#632327#"&#"'>54'#53.54632#&#"“& ˆ3C;?!h(+*9J+†#580E8nQ"‰e5>,X„@M ,> 7+'RD'B8.%B;V.&(791![{ 1W9šFC…é'&x°/±!é°/±é°'/° Ö´&+°±$+´&+±(+± ³ $9°$³$9°³$9±!³$9°³ $9°³$901%'#"''7&547'76327'"32654&å:5(<5)380 687,5:(;97,>?,+?>¾65391+;9-7575:7)42/É>V==*,> !Åz²+²+°3´  +°3´ +°2´ +°3´+°2°/°Ö° 2±é°2² +³@ +°2² +³@ +°2±+±°9±°901#3##5#535#5333着ªX¬¬¬—ÍU¹³UÉb3M3¯¯3M3cþ¾Bþdÿ, Ù(²+°/°Ö°2´+°2´+± +013#3#d<<<<Ùþo‹þo+ÿ+úÙ4?Ù²4+²+²*+²+±é°./±é³4+°@/° Ö´>&+°4 Ö±é³> +±é°>±8+´&&+³+&8+±é°/±+é°+° Ö±é°/±é±A+±4° 9±>± 99°°;9°¶".6$9°°9°8±#(99±+°$9±4±+99°³"6;$9°±990132654/.5467&5462#54&#"#".57654/¢=)+57ª1+27,kœaT5,&3 ’=0mkP.4'o¦II¡' E50&2&u"J12G33E`bO/70%"^'J6s)"4 H`*J0ó{'?=3m-<(ÿÿd4Ì&|Y|¦ÿÿ'ÿòùÄ/Ú²Š4zt%/Mæ#-•°/´+° /°3´*+±"22°/´+² +³@ +°./°Ö´(+° Ö´+°(±-+°2´ +±/+±±99±-´ &*$9° ° 9±* ° 9°³ $$901!5%#"'#"&5467>=4#"#63232'3265@þë"/1808DYC";~zTS.9%6b33_,++4,11 , l^³z /(Gj¬¶ °/° 3´+° 2°/±+01757757G˜jj5˜jjãYzSSSSyYzSSSS(V w6°/´7+² +³@ +°/°Ö´+² +³@ +±+01!#5!(øFþNwþßÛÿÿ.ð8ÿÿ'ÿòùÄ/龇4ztw.½/²+´7+²+´7+°/±+´+±+01!5.þî½FF—Æ® N°/´+° /´+°/° Ö´+°±+´+±+±±99± ² 999012#"&46"32654/>YY@=YYfN87&(8®Y>@XZ|Y98&'87('ÿÿ2ÿõo' Êÿ0•†F/_°/´+°/´+² +³@ +°/°Ö´+°2°±+´ +°2±+±² 999±± 9901"#6323!>?654&²$>“@R`?! åþÐ3H:;1ú ˜F8R/ #:IL& / +zB1%—°/´+² +³@ +°/´ +°/´+² +³@ +°&/°Ö´+° Ö´+°±+´ +°# Ö´ +±'+±#³$9°° 9±° 9° ° 9°° 901"#632#"&5332654&'춮&©.#?@K9GUFHO>,-*0 3@.)ü-,Ž@8;L=IJD.++&'3# $\P-ä"²+´+°/°Ö´ +±+013#¼q•<ä”Aÿ$  e²+°3´7+°2² +³@ +² +°3°/° Ö´ <+° 2° ±+°2´<+±+± °9±° 9° °901%#"'#"'#33265332 !S;h6$SS:1ANS-1? SSßèþ/8aP)þL)0ÿO ÙY²+´ +°2²  +³@  +° 2°/°Ö´+°´+°/°± +´ +² +³@  +±+01.546;####ÿan‚^ú9@R@ƒ^e‹@ü¶Jü¶ÿÿWã¿K|ÿäþ'ÿ*B²+°/´+° /´+°/°Ö´&+±+±°9° ³ $90132654#"'73632#"'< ! . *& &)B9/NŒ%\8# +2"E†æ/ E²+´+² +³@ +° /° Ö´+²  +³@  +°´+°/± +01#57>73#¨c6$ +>®.0þW(/Dæh°/´+° /´+°/´+°/° Ö´+°±+´+±+± ±99°² 999°±99±± 9901!52"&546"2654&:þùƒDJK†KKC'--N-,b33„ZTOZZRQZ4@78@?79@ÿÿHj­¶mô À=ÿìQÖ ʲ+° 3² +´ +°3´+°2² +³@ +±  À/´+² +³@ +°/° Ö´+²  +³@  +°´+°/°±+°2´+°2² +³@ +² +³@ +±+±° 9°³ $9°°9±²999± °901#57>73#3#%#533##= c6$ +>ã:þ<:¼Ì.CC>U.0þW˜ý'x; þð5d™ªª=ÿìLÙ *ɲ +²"+´+²+² +´ +´+² +³@ +±  À/´+°+/° Ö´+²  +³@  +°´+°/°±+´+°2°±(+´+° 2±,+± ° 9±² "#999±(´ %$9±³ %$9± °901#57>73#3#"#6323!>?654& c6$ +>Ë:þ<:$>“@R`?! åþÐ3H:;1X.0þW•ý'ˆ ˜F8R/ #:IL& / +ÿìDÞ%)47²4+°(3²+´+² +³@ +²&+´+7(& +°/3´++°12²7+ +³@7- +´(& +´+² +³@ +´ (& +´ +°8/°Ö´+° Ö´+°±+´ +°# Ö´ +° ±4+°52´3+°.2²34 +³@31 +²43 +³@4+ +±9+±#µ()$9°° 9±4 ²&'7999°3°-9±7°,9°°69°° 9° ° 9°° 901"#632#"&5332654&'춮&%3#%#533##=³.#?@K9GUFHO>,-*0 3@.)ª:þ<:¼Ì.CC>©-,Ž@8;L=IJD.++&'3# $ý'x; þð5d™ªªÿÿ`ÿ' "] Àÿÿ‹„'X´$ÿÿ‹„'Y$ÿÿ‹„'Zª$ÿÿ‹w#¯ª$ÿÿ‹q#j®¥$ÿÿ‹Æ#}¨Â$ºÙ^²+°3± é²+±é°2´ +±é´  +±é°/°Ö°2± é°2²  +³@  +³@ +³@  +±+01%!#!!!!!!#ØþóUg+nþ`þ …þdŠÖÖÙRéRúR(_þ¡(ÿ*å7¥²+±é² +³@ +² +²,+±2é²2, +³@2/ +°/´+°/´ +°8/°&Ö±5é°5±+´ &+° ±+±é°/ Ö±.é±9+±5@   ,2$9±°9°³ $9±2°&901%2673!632#"'732654#"'7.'.54>32#.#"rZ_`!þ÷ &)B90M. 8=4#"#632>3226=%!4&#"Ç01e%TvYˆ88e;L\*FGf$vp TÊ€/\6IpýFZgG86&P@?Rê4K%iUak:4TG&9$ N]ªR&,J@7p¸Qe  ,('-üGYWÿ*Ü5²²+±é² +³@ +²+² +±é² +³@ +°%/´-+°2/´+°6/°Ö±é°±0+´"&+°"±+° 2±é° 2±7+±°'9°0@ %(5$9±± 99±-%°'9°2³"(45$9±°901.54632#.#"3273#632#"'732654#"'à5N&j[mT@4DMNEkTt\ %*B9/N.  8=P,‚œb]7;oc]j^m!# +2!)%ÿÿÿé÷ä"CoHÿÿÿé÷ä"vjHÿÿÿé÷×"iqòHÿÿÿé÷×"jk HÿÿÑä"Cêóÿÿ Þä"v±óÿÿÿô×&óiàòÿÿÿõØ&ójÜ ÿéøç*W²+±%é²+± é°+/°Ö±#é°#±(+±é±,+±#² 999°(@  $9± %±99014>32&''7&'77"&"32654&-<8'';a$U4,%Ja(Z*F+"|â|íFPPFEQO@e<' (1-'(,/-%)#MLs>‡““Rm¾mm\anÿÿ<ÝÂ"tõQÿÿÿéøä"CpRÿÿÿéøä"vbRÿÿÿéøÚ"idõRÿÿÿéøÄ"n÷RÿÿÿéøÙ"jc R2Ø <²+´+°/´7+° /´ +° /°Ö° 2´:+°2± +01!5#5#5þ&hhhFF§hhphh ÿâ #v²+±é² +²+°3±é°$/° Ö±"é°"±+±é±%+±" ² 999°³$9°²999±°9°µ $9°±9901#"''7&54632732654&#" ?,}og<= B0~oeA:\î+?FPþéï)EFPÿGIm„•>EJGs„•AA¨þó0m_B· 4m_Dÿÿ<ÿéÝä"CeXÿÿ<ÿéÝä"vsXÿÿ<ÿéÝÙ"iiôXÿÿ<ÿéÝÙ"jh Xÿÿ ÿ&Ôä"vY\<ÿ&Êh² +±é²  +³@ +²+±é² +³@ +°/°Ö´<+±22°±+±é±+±± 99± ° 9°±99013632#"'"32654&é°>°4 Ö±é°/±4é°>±8+±.22±é´ +±A+°6º äÁ‡+ °&°)À±< ù°:ÀºÀ+ °'°+À±<:±< ù°:À°&³'&)+º 9À«+ °'³('++±'+°&³(&)+°'³)'++º ÀÎ+ °<³;<:+²;<: Š Š#9·)+&'(:;<........·)+&'(:;<........°@±84³15$9° ±99±°9°² 999±15´"9$901632327327#".5467&'#"&54>763>=4#"26=6Ëad- LH&*:1%9QaO]%(@5)1%u:;QEXeJ<6qªIFþÌ)?=7 - ,!( CMTG"3" N-0þÁI*^  -P,ÿÿ(ÿé„'Y&ÿÿÿéÜä"vaFÿÿ(ÿé„'ZÒ&ÿÿÿéÜÄ"icßFÿÿ(ÿé„#|Ú¸&ÿÿÿéÜÙ"|\ Fÿÿ(ÿé„'[Ö&ÿÿÿéÜÜ"jg÷FÿÿP’„'[¯'ÿÿÿéÐä'^G›Ù t² +± é²+±é´  +° 3´++°2°/° Ö°2± é°2² +³@  +² +³@  +° ±+±é±+± ±99±±9901#53!2#!326&+3YEEŠžžŠþæ]­kppk­«SCCÂþ¬ÃSþÿñCÿé1Ù!š²+²+±é²+²+±é´ +°3´+°2°"/° ֱ鰱+±22´<+°2² +³@ +°´+°/² +³@ +±#+±±99±°9°° 9°°9013##5#"&546325#5353"32654&ò??JFbf|{ea@––SåDTTDBPO5ý¨;R‚|—N‹5Lþðn²nlY\mÿÿP[f#q²©(ÿÿÿé÷©"qrìHÿÿP[„#{±¨(ÿÿÿé÷Ù"{rýHÿÿP[ƒ#|°·(ÿÿÿé÷Ù"|q HPÿ3‚Ùu²+°3±é²+± é°/´+´  +± é°/°Ö±é° 2°±+´+² +³@ +³@ +³@ +±+±°9°±9901"&5467!!!!!!#32768L3.þ=ùþdþs®7'H%0Í4*$:ÙRéRúR,6 - ÿ4÷*0¨²+±(é² +±.é°/´ +´0# +´0++°1/°Ö±#é°02°#±+´+°±++±"é±2+±#±.99°³ (-$9°+³ *$9°"² 999± ° 9°³ $9±#(±99±.0°901%327#"&54>?#"&632!32?4&"í&)(&"&)?L  (pƒméþ~01e%R~RŸ)B,(0 - 0( “›þÏ4K%iD\WIÿÿP[„'[´(ÿÿÿé÷Ú"j|õHÿÿ(ÿéÁ„'Zæ*ÿÿÿ&êÏ"iuêJÿÿ(ÿéÁ„#{Þ¨*ÿÿÿ&êÚ"{aþJÿÿ(ÿéÁ„#|Û¸*ÿÿÿ&êÙ"|X Jÿÿ(þÔÁå'ÉR*ÿÿÿ&êê#µ¥JÿÿP„'ZÈ+ÿÿ<Ü„#i‚ŸK´Ùw²+°3²+° 3´ +±é´ +± 33´7+± 22°/°Ö°2±é±22² +³@ +°±+±22±é° 2² +³@ +±+01!5%53!533##!##5¬wþ,]w]44]þŠ^1øZZH™™™™FþLþ´úFîÙ²+°3² +²+´C+´  +°3´ +°2°/°Ö° 2´<+±22² +³@ +² +³@ +°±+´<+±+±°9±°9014&#"##53533#>32#›C)@NS??S––%K8LYSk70aPþßX5LL5”0'MBþtÿÿÿù3i#ÿôœ,ÿÿÿæ º"áíóÿÿf#qÿæ©,ÿÿÿú ©&óqÞìÿÿÿý*„#{ÿî¨,ÿÿÿñÙ"{âýóÿ3êÙL²+°/´+°/°Ö´ +° ± +± é±+± ²999±°9°±9901"&5467#3327ž8L3.^7(H%0Í4*$:Ùý',6 - ÿ3ÒÙ^²+´+°/´+°/°Ö´ +° ±+°2´ <+°2±+± ² 999±°9°²99901"&54673#327#5†8L-(S 0#H%0TÍ4*!8 ýô*6 - ¦iiÿÿ_Çs#|ÿì§,F™ '²+²+°/°Ö´<+´<+±+01#™S ýô ÿÿdÿé¢Ù#-æ,ÿÿBÿ&MÙ#M¢Lÿÿ#ÿé„'ZÝ-ÿÿÿóÿ&Ï&ðißêÿÿPþÔ“Ù'É4.ÿÿ<þÔøÙ'ÉðN<ø 3² +°3² +°3° /° Ö´<+°2± +± ±990173 #%#Þkþð0gþþS ÞÞþüþøØØ ÿÿP„&Yn/ÿÿ ò„&YOÿÿPþÔÙ'É /ÿÿ<þÔ¦Ù'ÉOOÿÿPä'^/ÿÿ<hä'^´OÿÿPÙ#yP/ÿÿ<OÙ#yOFÙ O²+±é² +²+°/°Ö° 2±é°2² +³@ +² +³@ +±+±³ $9017!!573Ë««{þ(PP]–yLz÷R9M8uèÙ <²+² +° /°Ö° 2´<+°2² +³@ +² +³@ +± +017#573¦BBS??S¥3@3þ›92@2`ÿÿPŠ„'Y1ÿÿ<Ýä"v}QÿÿPþÔŠÙ'É>1ÿÿ<þÔÝ'ÉðQÿÿPŠ„'[Å1ÿÿ<ÝÛ"jtöQÿÿ'KØ&_×QnPÿð}è$f²+´ C+²+°3´7+²+³+´C+°%/°Ö±é°2°± +± é±&+± ²999±²  99901".#5232654.#"#3632~(B?l)@>Dm]]:)VR5-LVG½‘Nt;dMþÙM\%HRt±c0<ÿ&Ý\²+²+²+´C+°/´C+°/°Ö±é´&+°± +´<+±+± ²999±°901#"'532654&#"#3>32Ý &:2@NTM#Q:LZŒþmG'·/8aPþß X70Nÿÿ(ÿéèf#qà©2ÿÿÿéø©"qjìRÿÿ(ÿéè„#{à¨2ÿÿÿéøÙ"{lýRÿÿ(ÿéè„'\2ÿÿÿéøä#€œR(ÿì¼å-˜²+±é²+±#é² +± é°*2²+±(é´  +± é°./°Ö±é°±%+±22±é° 2²% +³@ +° 2³@ +±/+±%±99±#°9°°%9° ±99° °&9°(°9014>325!!!!!!5#".7327&#"((=RM'y>­þ°Hþ¸UþNCu(MR<'])94};;|59'dX‹T6XLRîRõRJ^5QˆZIn?' xex'@nÿéy*1²+° 3±&é°2²& +³@& +²+°3±/é° 2´+ +´+++°2/°Ö±#é°#±)+±é°+2°±,+±é±3+±)#±99°± 99°,² 999°°9±&° 9°+²#)999°/°901%3273#"'#"&54632>32$"32654!4&#"÷01f#TvY„>?ƒq||q‡=e=JqýØŒPPFEQX&P@?Rê4K%iV`gg“‡†’j28J@7päm^`ml^a3GYWÿÿPš„'Y5ÿÿ<Kä"vUÿÿPþÔšÙ'ÉH5ÿÿ<þÔ8'ÉSUÿÿPš„'[Á5ÿÿ-Lå"jUÿÿ0ÿém„'Yú6ÿÿ"ÿéËä"vVVÿÿ0ÿém„'Zª6ÿÿ"ÿéËÐ"iVëV0ÿ*måJâ²?+°#3±é² +±é² +³@ +°,/´4+°9/´&+°K/° Ö±é°C Ö±Fé°±7+´)&+°)±+±é° Ö±é±L+°6ºïÔÂ+ °°À± ù°À³....³....°@±F°A9°7@ #$&,.@$9±4,°.9°9³)/;<$9±?°A9°² D99901%2>54/&54632#.#"632#"'732654#"'7&#'.=3V8N%†µ‹x~ŒX^WJY6B·JQ;wT&)B9/N.  ,YgX+U;*)S#0%…cswkGMD7*01`C(ED+ # +2"(%E€[64"ÿ*Ë@ñ²+±é² +³@ +°-/´5+°:/´'+°A/° ֱ鰰 Ö±@é°@/±é°±8+´*&+°*±+±é°° Ö±é°/±é±B+°6ºðÚÁÑ+ ° ° À±ù°À³ ....³ ....°@± ±/099±8@ $%'-2=>$9±*°9±5-°/9°:³*0<=$9±'² $>99901732654&/.5462#&#"632#"'732654#"'7&'z5E7C&+N]In¶bXf3<.3PNF4.&O&)B9/N. ¨œ/7-%" C>IWTMT+$# E:/N # +2"(%G ÿÿ0ÿém„'[¨6ÿÿ"ÿéËÝ"jTøVÿ+ZÙ"…²+±é°2° /´+° /´+°#/°Ö±é² +³@ +² +³@ +³+´&+±$+±¶  $9± °"9° ³ $9±²9990132654#"'7##5!##632#"'Å ! . * ð<ï &)B9/N‹%[‡RRýy7# +2"ÿ+œ/»²"+´!7+²+²+°3´++°2² +³@ +°-/´+° /´'+°0/°Ö°2´<+°2² +³@ +°!2² +³@ +°±+´*&+±1+±´  $9°µ $%'-$9±-°/9° ³ *$9±!"°90132654#"'7.5#53533#327632#"'H ! . &(*GGSVV &)B9/N™%S*$ŒDDþ™F/# +2"ÿÿZ„'[7ÿÿÿéšä'^æWZÙ`²+²+±é°2´ +° 3´7+° 2°/°Ö°2± é°2²  +³@ +³@  +² +³@ +³@ +±+01535#5!#3##ð<ï]eHÚRRÚHþ›eÿé œ„²+´ C+²+°3´++°2² +³@ +´ +°3´7+°2°/°Ö±22´<+±22² +³@ +° 2³@ +² +³@ +±+± ° 901#3#327#"&=#535#5353 VOO'14LLGGS DHF+(´HDÿÿPÿé€i#Ëœ8ÿÿ<ÿéÝ¿"pòXÿÿPÿé€f#qÈ©8ÿÿ<ÿéÝ©"qlìXÿÿPÿ逄#{Ȩ8ÿÿ<ÿéÝ×"{lûXÿÿPÿé€Å#}ÆÁ8ÿÿ<ÿéÝ"}jXÿÿPÿ逄'\æ8ÿÿ<ÿéÝÛ#€„ÿ÷XPÿ3€Ù#{²+±é² +°3°/´+°$/° ֱ鰱+´+°±+±é±%+±±99°°9°²999°±!"99±°"9°²!99901"&5467#"&5332653327 9L"'9,ƒ–]eUXd]%44%H%0Í4)/ €pþOOTJþ4W9046 - <ÿ4 $ ²+´ C+²+²+²+°3° /´+°%/°Ö´<+°±#+´<+³#+´+°/´+°´&+°/±&+±± 99±² 999± ° 9°² 999± °901327#"&547#5#"&533265Ý#*$'>J`%P:L[S:2AN ýô; -2+>1I4,NA”þ/8aP)ÿÿš„'Z6:ÿÿ ÈÑ#iÂÿìZÿÿ—„'Z¬<ÿÿ ÿ&ÔÏ"iVê\ÿÿ—q#j®¥<ÿÿI„'Yð=ÿÿÈä"v_]ÿÿIq#|˜¥=ÿÿÈÙ"|P ]ÿÿI„'[œ=ÿÿÈÝ"jXø]ÜA²+² +´C+²+´++°/°Ö°2´<+² +³@ +±+013##5354632&#"­SFFA: :ÈDY8?E5ÿé'Ù!”²+²+±é²+² +±é´ +°3´+°2°"/°Ö°2´<+±22´+² +³@ +² +³@ +°± +± é±#+± ± 99±°9°° 9° °901533#632#"'##5"3264&SS––@ae{|fbFJ?$COPBDTTLL5‹N—|‚R;X5Äm\Yln²n("Ù 0ˆ²$+± é²+± é°%2²++±é´$+ +±é°1/°Ö±(é°(±$+± é° 2° ±+± é° Ö±é±2+±$(±.99± °9± ° 9°°9± +±9901%2>54&+4+3%"5463!2#!#"3263B1>D?ãF’´´þ{=G~=Z-eF?vaþ·R1 R+49EûMèè!š1N$;;p/TB^r‚:OÿÿPpÙ…<ÿéÙ o² +²+±é² +´C+²+±é°/° Ö´<+°2´&+² +³@ +°±+±é±+±±99±²99901"32654&!!632#"'!BPPBDUSþÕ‡þÌ9ihx|hk;Ío¸ooY^pþ3ÙIËV”‚ZC¡ÙJ²+±é² +´  +± é°/°Ö±é° 2°±+±é±+±° 9± °901732654&+332#!'ÞÔ@RQAÔ]]¥–ˆ‚dþÆ€RR=@PhþêxfcËÿé3Ù n²+²+±é² +²+±é°/°Ö´<+° 2´&+°±+±é±+±° 9±±99±³ $9± °901"32654&3632#"'#'CBPPBDUSþÕS9ihx|hk;K]Ío¸ooY^p þìV”‚ZCËÿÿ(ÿéå &ÅÎÀ(ÿéåå(~²#+±é²# +³@ +²+±é° Ö±é² +³@ +°)/°Ö±é°± +±!é° Ö±é±*+±²#999± °9±±99± °9014>32632&#"#.#"32673!".(0GyLŠHP _^Wj{€mZ``!þõKwG/d2bjO4O;ORNN¢Œ‰¡ejþß3Ni`ÿé-,"}²+±é² +³@ +²!+±é²! +³@ +°!° Ö´C+°#/°Ö±é°± +°2± é°2±$+± ²!999° °9±°9±!°901632&#"#.#"3273#"&54632“R T@4DMNEkTp^k}jTî>ER7;ob]j~`k•‚œÿÿ›Ù’(DÙ!h²+±é²+±é°2²+± é²+°"/° ֱ鰱+±é°±+±é±#+±± 99± ±99±° 901%32654&+"5463!2#!#"3263_¬lppl¬¼{=Go‹žŸŠþçR1 RŠ‹Çš1NÂþ¬Ã‚:O(HÙI² +±é²+±é´  +±é°/°Ö±é°±+°2± é² +³@ +±+01754!35!5!!".6;#"(´þtéþ·=Y-] 8'ãã'8Ú×ÔRý'+EF:.)-,ÿéóÙ u² +²+±é²+´C+²+±é°/°Ö±é°±+°2´<+² +³@ +°´ &+° /±+±±99±² 99901"3264&#5#"&546325!5!FSUDBPP£K;kh|xhi9þ̇Íp^Yoo¸oþ3CZ‚”VËIÿÿÿ; $ G(À)Ù J² +± é²+±é´  +±é° /° Ö°2±é²  +³@  +³@  +³@ +± +01!5!5!5!!5!Ìþsþdùýõ®LRéRý'Rÿÿ(ÿéžåJ(ÿéeå/†²+±$é²$ +³@$+ +² +±é² +³@ +´ +±é°0/°Ö±é° ֱ鰱)+±+é° Ö±é±1+±µ $$9±$°9°°9°° 901".547&54632#.#";#"32>=3EQv<‚i‹x~ŒX^WJY_?XlC`%N8;U+X6Y\+GG&}1-lcswkGMD7.[RT.)+47Ji5ÿ&CÙ>²+±é° /±é°/±é°/°Ö± é°2² +³@  +³@  +±+01!!!!#"'532Zéþt\þ¤QH DL%RéRþG58Qÿ&Ü]²+´C+²+°3´++°2°/´ C+°/° Ö°2´<+°2² +³@ +°2²  +³@  +±+01##"'53265#5354632&#"W &FFA: : DýËmG'DY8?E5R(ÿéå.®²+²+±é²+±,é° Ö±$é²$ +³@$( +´  +± é°//°Ö±é°± +´ <+² +³@ +° °( Ö±)é°)/±(é° ´+°/±0+±)²999° ±99± °9° ±99±,$°901326=#5!#'#"&54>32632&#"#.#"…$9^[»þcþEgI>K57<ÿé7Ù+|² +²+´C+²+²+´C+°,/° Ö´ <+°2° ±+´<+°±+±&é±-+± °9±±"#99±´&$9°±"#9901#"&54&#"#3>3232>54&'7%714C)@NSS%K8LYI-F&5Hf1?';d+(/70aPþßÙþë0'MBþÕ/#1=+.t3&};²+°3²+° Ö± é°/°Ö±é°2±+± ² 999°° 901#3632&#"#­]] A=4"8  ©,nþÿÿÿÙþ'=> ªþPv<øÜ<²+°3²+´ C+² +°/°Ö´<+° 2±+± ± 990134632&#"73#32#4&#"#54'7‡tŽèŽëÀ žÂÂ>lB @%k=“¥þò¥¤„Цþ΢ÖÓVÓ$$ 6+8]aÿé/w !s²+±é²+±é² +²+°"/°Ö±é°±+±é³+± é±#+±²999°±!99± ° 9±³$9°°901"32654&7#"&63232654' FPPFEQO¸%\%np}~n8R Îm¾mm\an©+8VEg”••# (ÿ鍿 #v²+² +±é²+°3±é±é°$/°Ö±é°±+± é° ±+±é±%+±² 999° °"9°±99±³ "$9±°901"2654&#"&632632#4&#"‡tŽèŽëÀ žÂÂqVOeTR^(&(*X“¥þò¥¤„Цþ΢ÖÓVÓ89fQýÑM4iÿ8š #„²+±é²+°!3±é²+´++² +³@ +°$/°Ö±é°±+±é°± +± é±%+±²999°°9° ±!99±³$9±°901"32654&#4&#"#"&632632 FPPFEQOHT"'#4np}~nT8@>F@Îm¾mm\an]ýÇM'*I|”••))I(Ù#m²+² +±é°2²+±é´  +±é°$/°Ö±é°±+±é° 2°±+±é±%+±±99±±99°±99013264&++##"3263#"5463!2_ÂCKKC±q[å]R1 {=Gƒlu‡DxD„]qþË‚:Oš1No<ÿ&Ü "d²+±é²+´!C+²+±é°#/°Ö±é°2´ &+°±+±é±$+±´!$9±°9°± 9901"32654&'632#"'#4632&#""BPPBDTSÞ;lhy{ea@T>9 :Ío¸ooY^p‘¡^š„}—Nþï?9>EPÿƒ{Ùx² +²+² +²+± é´ +±é° /° Ö± é± 22° ±+°2±é±é² +³@ +±!+±±99± ±99°°9°°9013264&+#332#&=4&#­ÂAIIAÂ]]ÐhxVI+q;=DxDþ®½Ùxqct:+o.IAC?0ÿémå0´² +±é² +³@ +²$+±é²$ +³@! +°1/°Ö±,é°,° Ö±!é°!/± é°,±+±'é°'° Ö±é°/±é±2+°6º³Â7+ °°À±* ù°)À³)*....³)*....°@± ² $999±±'9901%2>=3#".546?>54&#"#>32G;U+X%8NK)Ag>(QJ·B6YJW^XŒ~x‹µ†%N;46<\7# .=9C`10*7DMGkwsc…%0#S)*"ÿéË$»²+±"é²" +³@" +²+±é² +³@ +°%/°Ö±é° ֱ鰱 +±é° Ö±é±&+°6ºÊÁ»+ ° ° À±ù°Àº—+ ± ° ° À±ù°À³ ....³ ....°@± ³"$9±"±9901%3#"&546?>54&#"#>2326sXËcuFNP3.<3fXb¶nI]N+&C7E4œ³ZL:E #$+TMTWI>C "%-7IÙ ,² +±é²+±é° /± +± ° 9°°9015!!!!5ùÙ þfÛÛ¶ýÕmTRþæþåRRÿ&OÜ v²+´+°/´C+° /´+°!/°Ö´+°± +´<+°´+°/±"+± ³ $9± °9°° 9°²99901"2654&#"&4632327#"5{%%2%$2II29B& ž$$$#°IdHD8ýT'Gmÿ&œg²+° 3´++° 2°/´C+°/°Ö±22´<+° 2² +³@ +°± +±é° 2± +±±99±±9901.5#53533#327#"'53265°),GGSVV &+$ŒDDþ™£mG'`Ù^² +²+± é°2²+±é°/°Ö±é² +³@ +°± +±é² +³@ +±+± °9± °9014>7!##+"327#"?2Íï]+R16 {Z4+Rýy‡tOÿéÜi² +´C+²+´C+²+°3´++°2°/°Ö°2´<+°2² +³@ +± 22² +³@ +± +±° 9013#327#"&5#5354632&#"®VV'14GGA: :^RDþ™F+(ŒDY8?Eÿ&ZÙ<²+±é°2°/± é°/°Ö±é² +³@ +² +³@ +±+01#5!#327#"&ð<ïD HQmôRRý-;Q8PÿéXT²+±é²+° 3±é°/° ֱ鰱+±é°±+±é±+±°9±°9°°901#"&5332653>54'Þ%ƒ™€‚•]eUXd]X+8f þSn‚oþOOTJ <ÿéj‹w²+² +´C+²+°3±é°/° Ö´<+°±+´<+°´&+°/°±+±é±+±° 9±°9°°9±°901#5#"&5332653>54'E%K%P:L[S:2AN]‹+8kþHI4,NA”þ/8aP) ÿÿ(ÿüÍÙ <õÙÀPÿéÙC²+± é²+°3°/°Ö±é°±+±é± +±²999± °901".5332>=4.'3I7MM(](('GF3 4)+l޳,aJ ýÎ - '=a?8ciDA¾Á¯ÂÉÙ>² +²+° 3±é°/° Ö± é±+± °9± ² 999°°901&#"#3632¤  ³]þçsÖ­-A  iþÞþâ»þ#@   ÿ&`Ül²+´C+² +°3²+°/±é°/±+°6ºÃ2ì+ ° .° À± ù°À± ..³ ....°@±°9° ±9901#"'5326?3>32&#"Ôé(_ ±Y†‘;5&&. ý†l KU þh˜W]E7IÙB² +±é²+±é´  +°3´ ++°2°/±+± ° 9± °9013#!!5#537!5G¹MǶýÕÇW‹»þfÙTïCþÿRRCñRÈ H² +´C+²+´C+´  +°3´ ++°2°/±+± ° 9± °9013#!!57#537!5º{SŠ…EþV„]•}þÜ J•C¡IKŸC–I(ÿéMÙl²+±é² +³@ +²+±é´ +±é°/°Ö±é°±+± é² +³@ +± +±³$9±°9°°9017!5!#"'332654#52>Mþf ´,1›|øX ªQjí ÒµRTè +F,dyå—MAžK ÿéCÙq²+± é²  +³@ +²+±é´ +±é° /°Ö±é² +³@ +³@ +°± +± é±!+± ²999±°9°°9013"3273#"&'454>7'5!! íjQª Xø|›1,´ þfÒ KžAM—åyd,F+ èTRÿqø m²+´C+°/± é²  +³@  +°/°Ö± é²  +³@  +° ±+±é±+± ±99°²999°±99± ±9901'5!!#"32673#"&546؇þÜ0“NEHHXÚmƒa®JI«K€CKJMåxeXcÿ6ß )¢²'+´&C+°/´ C+°/´C+°° Ö´7+°*/°Ö´ &+° ±+´&+² +³@# +±++± ±&'99°µ %$9°³()$9± °9°°9°± 99±&²)99901#"&#"327#"&543232654&+57!5!(·aW=6Wb]Baa`\0aSH0þ܇“Pb &E"LBO40+;K«IJ"ÿÅh²+±é²+±é² +³@ +° /°Ö±é°±+±é±!+±²999°´ $9°³ $9±±9901632'!!>7'57654&#"2ãe~‚W§(A8uþ(I_S¡'`P<… Ïöt\{O$MD#B-Wo|9"MB7U9L©ÿëΜ#‘²+´ 7+²  +³@  +²+°3´++°2°$/°Ö´&+°±+°2´<+°2² +³@ +² +³@ +°± +´<+±%+±± 99° ±!99± °901%#"&5332654.=#53533#Îx]hsO?H?H&66&GGSVV&66&«]c|nD^8:)5=.DD-"&D<ÿ& >²+²+± é°/° Ö± é°2´&+° ±+±é± +± °901>54&#"#3>32.Si@7*haTK32#.#"…$9^M $5kL\nÎn^_mk^bmýöX(4$@2,—}€ž[LþJ[3468TJÿÿ(ÿéÁ„'[Ü*ÿÿÿ&êÙ"jZôJÿÿP“„'[Ë.ÿÿ<ø„#jfŸN(ÿ#èå&i² +±é°/´+°'/° Ö± é° ±+´+°±$+±é±(+±°!9°$¶ "$9±°9°´ !$901"&5467.54632327"2654&ˆ8L-)‹§Â ÁN–d0#H%0tŽèŽÝ4*"7Ξ«ÓÔ°e¦g*6 - p¥þò¥¤„Цÿ#ø&c² +±é°/´+°'/° ֱ鰱+´+°±$+±é±(+±$¶ !$9±°9°´ !$901"&5467.54632327"32654& 8L.*\e~nq}qd0#H%0FPPFEQOÝ4*"8‘v„••ˆy“*6 - «m¾mm\anÿÿ(ÿ#èf#q੪ÿÿÿ#ø‰"qkÌ«ÿÿ(ÿéM„'[›yÿÿÿqîÙ"j_ô5ÿÿÿßÿ&þÊ&ðjÌåÿÿPóÙ#=ª'ÿÿP|Ù#]´'ÿÿÿéôÙ#],Gÿÿ(ÿéÁ„'Y@*ÿÿÿ&ê×#v‚ÿóJP9ç!K²+° /±é°"/°Ö±é±22°± +±é±#+± °9± ²999°±9901>54&#"#3>32¯#O'? >#)k5__=_NB^#.S8d"+þº9$A6F"!*/þ!„×P;%^N,[EP.BÿÿPŠ„'Xæ1ÿÿ<Ýä"CnQÿÿ‹„'YÈ#}¨ B$@0ÿÿÿé „'Yª§ÿÿº„'YˆÿÿÿéI×#v=ÿó¨ÿÿ#ÿéí„'Y@šÿÿ ÿâ ×#v—ÿóºÿÿ‹„&]n$ÿÿÿé Ù#²ÑÿõDÿÿ‹„#´ö¨$ÿÿÿé Ê#´µÿîDÿÿP[„']Œ(ÿÿÿé÷Ù#²ÞÿõHÿÿP[„#´û¨(ÿÿÿé÷Ê#´¿ÿîHÿÿÿß,„&]ß,ÿÿÿ¹Ù#²Wÿõóÿÿÿÿ,„#´=¨,ÿÿÿíÊ#´+ÿîóÿÿ(ÿéè„']´2ÿÿÿéøÙ#²ÉÿõRÿÿ(ÿéè„#´-¨2ÿÿÿéøÊ#´ºÿîRÿÿPš„&]x5ÿÿÿë8Ù#²‰ÿõUÿÿPš„#´¨5ÿÿ-ZÊ#´kÿîUÿÿPÿ逄']Œ8ÿÿ<ÿéÝÙ#²òÿõXÿÿPÿ逄#´¨8ÿÿ<ÿéÝÊ#´¹ÿîXÿÿ0þÔmå'É*6ÿÿ"þÔË'ÉÐVÿÿþÔZÙ'É 7ÿÿþÔœ'ÉlW(ÿœóÅ)U²+±é² +³@ +°*/°Ö±é°±'+± é° Ö±é±++±±99°'² #999°° 901"#632'>54.''67654&L9XÙes1b0;ƒPX>£Š @[{%LCxSEåh[1O1{/O3:WB\$) "K20<8Aÿ¬€(a°/±é² +³@ +°)/°Ö±é°±'+± é° ° Ö±é°/±é±*+±²999°'² #999± ° 901"#4632'>54&''67654Æ'5VbOL`"F52\:8 #ZE9.Ja,Ð80PfXD(: #]4,$J "5E' )QÿÿP„'[È+ÿÿ<Ü„#j†ŸKPÿ%€åD²+²+²+±é°/°Ö±é°2°± +± é±+± °9±°9013#3632#4&#"­]]Jr‚•]eUXdÙ(4oý0ÐOOTJÿ(IÙK²+±é²+±é°/´ C+°/°Ö±é°2² +³@ +±+±°9°°901!#"'5326=!5!5GþL¶ &þ)¶þfÙTýͽmG'JR5Rÿ(È T²+´C+²+´C+° /´C+°/°Ö± é² +³@ +±+± ±99±±9901)5!5!!#"'53265tþª9þ܇þÉE &KxIJþ‡´mG'ÿÿ‹„#|ª¸$ÿÿÿé Ù"|l DPÿ1[Ù&’²+°3±é²+±é°$/´+° /´+´ +±é°'/°Ö±é°2² +³@ +³@ +³@ +°±+´!&+±(+±¶ $&$9±$°&9° ³ !$90132654#"'7#!!!!!#632#"'Ú ! . 'ðùþdþs®õ &)B9/N…%UÙRéRúR1# +2"ÿ÷/8™²+±6é°-/´+° /´'+°/´0++°9/°Ö±é°02°±+´*&+°*±3+±é±:+±@ $%'-/6$9±3*± 199°°!9±-°/9° ³ *$9±'²$9990132654#"'7.54632!3273632#"'!654&#" ! . 'esƒmJqþ~+Sf#TmT &)B9/N&T=?Rœ%V”z›J@7pH(DiR_1# +2"òAYWÿÿ(ÿéèÅ#jâ”"2qâÿÿÿéø "jmÛ"Rqqcÿÿ(ÿéèæ#qç)—ÿÿÿéø "nÙ"Rqrcÿÿ(ÿéè„#|Þ¸2ÿÿÿéø½"|iñRÿÿ(ÿéèÙ#|Þ¤"2qàÿÿÿéø""|iã"Rqkeÿÿ—S#q¬–<ÿÿ ÿ&Ô‰"qTÌ\ÿîÿ&™ %²+°/´ C+° /° Ö´<+±+013#"'53265FS & ý‡mG'ÿéuÙ 1”²&+²*+°"3±é°2²+²0+°3±é°2°2/°-ֱ鰱 +°2´<+° 2³% +´&+°&/´%+°±+±é±3+± ±*099±±"99±µ$'-$901"32654&32654&#"3632#"'#5#"&54632 DTTEBPP£PBDUSFB£S9ihx|hk;B"O6jz{flÍp[\on[^oo¸ooY^pþìV”‚ZCE1+™…}—ÿ&t /Ÿ²-+°3±é°2²- +³@- +²#+² +°'3±é°2°0/°Ö±é°±+° 2±é° 2³%+´"+°"/´%+°±+±*é±1+±³ $9±±'-99±-°/9°´"%*$901"32654&32654&#"#"&5463253632#"'ETTEBPO¢PBDTSEBPT9Ðx|hk7'.#"åmƒ€nZvT#f.3!R?327332>7#"#".žþÙY8?Rþ…‚!,#f#TvZd?YE '    -*O=E#ƒm0L0# ÖMSW-D%iV`>]ŒT r-GB^›&=0G"ÿéÇ#¡²+±!é²! +³@! +² +±é² +³@ +´ +±é°$/° Ö±é² +³@ +°° Ö±é°/±é°±+±é° Ö±é±%+± °9±³ !$9±!°9°°9°° 901%3#"&547&5462#&#";#"326oXËcuVAn¶bXf3<10>J+;@6E4œ³ZLV&%KIWTMT+$!5L6%-7ÿÿÿéÇ«ÿéÌ:>ʲ<+±é²< +³@> +²+±é² +³@ +² +³@ +´ < +± é° °* Ö± é°?/°>Ö±é° Ö±é°±+±5é²5 +³@ +°° Ö±9é±@+±²<999±5²37999± °99± *±(799± ´'35$9°²/199901732654&+532654&#"#>327332>7#".'&'#"'v5E6@;+J>01<3fXb[`7UE (!  -**">AVucËœ/7-%6L5!$+TMT0OT r-(SE:>K%&VLZ³ÿéÜ(²+±é²+±é´"! +±"é°)/°Ö±é°±&+±é²& +³@&! +°&° Ö± é±*+±&³$9±° 9±!° 9°"² 999°°901>32#"&547"32654&+532654&az\p",*rcyoßG?GO6=;+5)01?ˆ…WI(5;-LZ„ÂYsm_-%6L5!$+ÿ&  Q²+°/´ C+°/°3´7+°2°/°Ö°2´<+°2² +³@ +² +³@ +±+0133##"'53265#53lSMM &NN ÔHþ£mG'#K1\|{db><9 0_I\nUÎn^_mk^bmýž^b2,—}€ž[S9>EþJKeV*TJXÿ& /‘² +±é²+±é²+±é°#/´)7+²)# +³@)& +°0/°Ö±é°°' Ö±&é°&/±'é°±,+° 2±é±1+±,'´ #$9°±99±µ -$9±°901"32654&"&54632>2&#"#"&'3326=CNNDBLKT\|{db<$> 0_I\nUqT>#KÎn^_mk^bmþ—}€žY#. H%þ¸KeV*TJX_a2,ÿé !޲ +²+±é²+±é² +³@ +´  +´+°"/°Ö±é°±+± é² +³@ +° ´ +° /±#+±²999° ° 9° °9±° 9° ±9901326=#53#'#"&54>32#.#"uMb.`‰á,Lln‰$8^;]vV C?UVÿajUB=þàHVš|#HO;'ZR3,k ÿÙ V²+°3°/´7+°!/° Ö´ 1+° ±+±é±"+± °9°±99°°9±³ $9012654&''4>733#"&à" !Q%»\Y·%[*.N % VW :,RŸþÆ:þaN-8>D@ ÿè#/ž²+±)é°/° 3±é°2² +³@! +°2°0/°!Ö´ &+° ±+´&&+°&±-+´&+°±+´&+±1+± !°"9±&²999°-³$9°± 99±)³$$9°°9012632#4&#"#"&5467&"#>32>54&¢4:;5>`L2 (+<-.=^8)%.4Lb¡E-! ,??Af@’%6O)Zf)‘?.Y)T}ÃmG?3'1gÿÿ<ÿ3Ü  K À<ÜÜ[²+°3² +´7+²+´C+°/°Ö´<+°2°±+´<+±+±² 999±°9014&#"#4632&#">32#‰C)@NSA::%K8LYSk70aPþße8?E6š0'MBþt<ÿ&ÜÜ%d²+² +´C+²+´C+°/´"C+°&/°Ö´<+°2°±%+´<+±'+±%´ $9±°9014&#"#4632&#">32#"'53265‰C)@NSA: :%K8LY &k70aPþße8?E5š0'MBþmG'ýÙ`² +²+´+²+´  +° 3´7+°2°/° Ö±22´ <+±22² +³@ +² +³@  +±+01#5533##5#5­TSPPSKÙiiþ_ÔÔHððHBÿéë /² +´C+² +°/° Ö´<+±+± °901327#"&5•'14 þUF+(Ð K²+´7+°2²+´ 7+°2° /°Ö°2´ +°2´ +± +±± 99013#3#53#îIIîRR Hþ„HH|ÅÙŸ²+² +´ +´++² +³@ +´ +´++² +³@ +° /°Ö´+°±+°2±é° 2°±+´+±!+±°9°°9±°9±°9°± 99°± 9901"#>32332653#"/#&~/571T 5i'*T"sNFK2þœ %&þÙ]—Ùg²+²+´  +°3± é°2´ +´C+°/° Ö´&+°±+±22±é°2² +³@ +±+±± 9901533##"54>5"«T˜˜T—?*("ÿÚþ‹Mþéq&$™R(Dÿ&ðÙ "²+° /´C+° /°Ö±é±+013327#"DT& mFüÛ'G<ÿqBÙs²+²+²+²+´C+°/± é°/°Ö±é°2² +³@ +°±+±é± +±°9°² 999± °9°³ $901#"'732654#"57!#3!ˆYaƒm•5I7)EN“þÜTT‡ cXexg.KC‚K«þ=ÙÍJÿÿ<ÿñð  P, À<ÿ8ð !{² +°3´C+°2²  +³@  +²+± 33°"/° ֱ鰱+±é°±+±!é°!´&+°/±#+±° 9°°9°°9±±9901##"'#"&533265332653ðM"K4a,%H4IOT3.3HT3.3HTÈ/*P,$KG‰þ—27P9Iþ—27P9I<ÿ&ð*{²*+° 3²+²+° 3´%C+°2°/´C+°+/°*Ö±)é´&+°)±!+± é° ±+±é±,+±!)°9° °9°² 999±%*±99013>32>32#"'532654&#"#4&#"#32#4&#"#"'53265bM#Q:LZS:2@N & X70NAþtk/8aPþrmG'<ÿ&6a²+²+²+´C+°/´ C+°/°Ö±é´&+°±+± é±+±°9± ± 99°²999013>32327#"54&#"#%4>2#"'#"&f-EA*‚x3:7,T/3(4ý¸,G|¢{G,$<=!`0.b^`ë:T1 qsIc9!ßß"85H5)JU=('=SL*Fh4ZZÿÿÿ8˜Èfúÿÿÿñ  UL ÀÿñÙ ;²+² +±é²+°/°Ö±é°´&+°/±+±°9017>53#5#"'TTTM$C( IJgÝý'_;3ÿ&h @²+±é²+°/´ C+°/°Ö±é°´&+°/±+±°9017>53327#"=#"'TTT&  ‰$C( IJgý¨'GmÌ;3<ÿ88 (²+² +±é°/°Ö±é´&+±+01#3>328TTTM$C( ÃJgþ(Ô_;3<ÿ&8:²+²+±é° /´C+°/°Ö±é´&+±+±°901327#"53>328TT& M$C( ÃJgþ¤'Gmy_;3<\ :²+²+´ C+²  +³@  +°/°Ö±é°±+±é±+013#4 #4&'T T""®mm!%%ÿ84 ;² +´C+² +³@ +³@ +°/°Ö±é°±+± é±+014&'#54 à""T ÈU%%!mmýŠ< [² +°3² +±é´ +±é°/° Ö±é°2°±+±é±+±±99°°9±°9°°901#'##324&+32ÏRCÍgËETø,@![6%‰‰[wHLÝÚÚ 0/#.'›ÿÿ@   à À"ÿ(Ë0¸²$+±é²+±é² +³@ +°//´*C+°1/°Ö±'é°2° Ö±é°'±+±!é°!° Ö±é°/±é±2+°6ºðÚÁÑ+ ° ° À±ù°À³ ....³ ....°@±¶$*,/$9±$°&9°²!99901332654&/.5462#&#"#"'327#""X5E7C&+N]In¶bXf3<.3PNFucN/& k/7-%" C>IWTMT+$# E:LZL'Gÿ&Ü6²+´C+°/´C+°/° Ö´<+±+±± 9901#"'532654632&#"À &A: :^ý5mG'±8?Eÿ&Ü[²+´C+°/´ C+°/°3´++°2°/° Ö°2´<+°2² +³@ +°2²  +³@  +±+01##"'53265#534632&#"W &FFA: :8DþŸmG'@D-8?E5þÚÿ&!6²+´C+°/´C+°/°Ö´ <+±+±± 99014#"5632327#"5u: :A& 5E?8þ'Gmÿ&ÂÜ &f²+´C+°$/´C+°/±é°'/° Ö´&+°±+°2´"<+°2±(+±±$99±³  "$9°±99013265&#"4>324632&#"&'#"&\#(0#<"#M/8 31A: :"SGœVLg  *5 e8?E5ý‰ HpIÿÿ´ WÀÿ&œj²+°3´++°2² +³@ +° /´C+°/°Ö°2´<+°2² +³@ +°2² +³@ +±+± ° 9°°901#327#"&5#5353V'14GGS DýÖF+(ODÿéF ”²+²+´C+² +°3´  +±33´ 7+±22° /°Ö° 2´<+°2² +³@ +°±+°2´<+°2°´&+°/² +³@ +±!+±°9± °901!#5#"&=#53533533#!326=øK%P:L[IISûSNNþ²:2ANI4,NAxHÔÔÔÔHW/8aP ÿéB *\² +´C+°/°3´C+°(2°+/°Ö°2±é°±$+±é°)2±,+±$µ '($9±³'$901#".5467#5332>54&'53Ò1?';d>Af9& ?1nÔH5%N4,E'5HÔ×&};54&'7Ø714SI-F&5Hf1?';d+(ÐþU/#1=+.t3&};5   ÿqî m²+´C+°/± é²  +³@  +°/°Ö± é° ±+±é² +³@ +±+± ±99°²999°±99± ±9901#"'332654+57!5!4YaƒmÚXHHEN“0þ܇ cXexåMJKC€K«IJÿvþ )4ƒ²'+´&C+° /´0C+°*/±é°5/°Ö´-&+°-± +±é²  +³@ # +±6+± -´ %3$9°² ()999±*0³ $9°³ $9°&²")99901&'#".54>32654+57!5!"3267&Ya!$nI)</8  '“0þ܇Í##(-G E cX H /2&&*5   €K«IJþM$ÔÅT²+²+±é² +³@ +°/°Ö±é°±+±é°±+± é±+±±99±° 901"#632#>54&ýL9XÙesC8T_OCxSEåh[9fþ¶,A8AÔÅT² +²+±é² +³@ +°/°Ö±é°± +± é° ±+±é±+± ±99± °901.#"#&'.54632|=H:CO_T8CseÙàJNA8A,þpJf9[håÿÿÔÅ 7òÅÀ(ÿ+åY²+± é²  +³@ +°/±é² +³@ +° /°Ö±é°±+±é° Ö±é±!+± ²999014>32#.#"32673!".5(0GyLî+_^Wj{€mZ``!þõKwG/d2bjO4îNN¢Œ¿ˆ¡ejþß3Nh`1ÿÿ(ÿéèå&2ûÿ’ÿÿ<Ê ¦ÿéÜ$…²+±é² +±é´ +±é°%/° Ö±é² +³@ +°° Ö±é°/±é°±"+±é±&+± °9±"² 999±°9°²"999°° 901#"&547&54632'";#"32654&ÛnzcrVAp\~^ß3?10)5+;=6OG?œZLV&%KIW|/+$!5L6%-_msYÿéZ *©² +²+±é²+°3±(é²( +³@($ +°´!C+´  +´+°+/°Ö±é°±+°%2± é² +³@ +°±$é° ´ +° /±,+±²999° ± 99±° 9° ±99±!°901326=#53#'#"&54>32632&#"#.#"uMb.`‰á,Lln‰$8^;c;N :V C?UVÿajUB=þàHVš|#HO;'27E533,kÿÿ<Þ ±ÿ&ÁÙ!o²+´+² +°/´C+°/±é°"/°Ö´&+°±+± 22´<+± 22±#+±±99±³$9°± 9901#54>323&'#"&73265&#"LSë/8 31S"SGœVLM#(0#<"#ÙiiüÄ*5  ýÛ HpI* ÿÿ ÿ7Æ NÀ<r ,²+±é²+°/°Ö±é² +³@ +±+01333EýS”‚ÔÅ„²+²+±é² +³@ +´ +°3´7+°2°/°Ö±é°±+°2±é°2² +³@ +² +³@ +°±+± é± +±±99±° 901"#6323##5#535>54&ýL9XÙesC8mmTii_OCxSEåh[9fHððHX,A8AÔÅ„²+²+±é² +³@ +´ +° 3´7+° 2°/°Ö±é°±+°2±é° 2² +³@ +² +³@ +°±+±é± +±±99±°901.#"3##5#535&'.54632|=H:CO_iiTmm8CseÙàJNA8A,XHððHf9[håÿé…Ù #“²+´C+²+±é²+² +´!C+²+±é°$/°Ö±é°± +°2´"<+°2²" +³@" +³@" +±%+± ±99°"±99±°9°!´ "$9°°901"32654&%!!5#"&546323 DTTEBPP'þÉEþ$"O6jz{fl5S!Íp[\on[^o?Jþ‡IE1+™…}—QÍIþ¥[ÿq¢Ù*6¾²+²+±1é²+²&+²(+´C+²#+±+é°/± é°7/° Ö±.é°.±4+°%2´<+°'2²4 +³@* +°´+°/°±+±é±8+±4.±#99±°9°² 999± °9±1° 9°¶ *.4$9°+°%901#"'732654#"57!#5#"&546323!%"32654&èYaƒm•5I7)EN“þßJ"O6jz{fl5S„ý–DTTEBPP cXexg.KC‚K«þ=E1+™…}—QÍJ p[\on[^oÿ Ù 7:ç²+°3´0C+°2²"+±é²" +³@" +²++²-+´8C+²(+±é´ 5( +´ C+°;/°%ֱ鰱 +°*2´9<+°,2²9 +³@9/ +°9±+°12´+°2°±+´+±<+± ±"(99°9±99°°09±±5:99±0°9° ±999±85³ /%$9°°*901"32654&"32>54##5!5#"&546323!354632 DTTEBPPÙ &"ISNHþõ"O6jz{fl5S†þÉrB4+HþV#Íp[\on[^oþ»   )6)``E1+™…}—QÍJþ‡->5'þ¢^ÿ飜1ݲ!+±é²+±é²'+°+3´&++°-2²'& +³@'* +² +³@ +°2/°$Ö°(2´/<+°*2²/$ +³@/- +²$/ +³@$& +°/± +±é°±+±é°° Ö±é°/±é±3+°6ºðÚÁÑ+ °°À±ù°À³....³....°@±± 99±&² 99901732654&/.5462#&#"#!"&5#53533#Üö2H&+N]In¶bXf3<.3PNFvbþõ05GGSVV6.$" C>IWTMT+$# E:LZ+(ŒDDþÿ&øÜ#+•²+´*C+²+´"C+²+°3´++°%2² +³@ +°/´C+°,/°Ö°2´'<+°2²' +³@ +°'± +±$22´<+±-+± '²999±°9±"°901#"'5326=#"&5#5353354632&#"#32¡ &s14GGS A: :S ^ý5mG'C+(ŒDY8?Eýª‹þ™ÿîœ7A²-+±$'33´C+±<22²- +³@-% +²3+°3´2++°2² +±é² +³@ +²32 +³@36 +´8%6 +´8C+°B/°0Ö°42´<+°62²0 +³@ +²0 +³@02 +°± +±é°±&+°2´%+°;2°%±+±é°°! Ö´@+°@/´!+±C+± ²+-999°°9°&² )999±%±899±@°9±-°)9°8±!99±2± 9901#327&54632#.#"354632##5"'#"&5#5353"32654V a.j[mT@4DMNFB4+HSNHP: YM14GGSÌ 7 Dþ™Fi‚œb]7;ob]j->5=6)``*+(ŒDþi   ÿ9âÜ0²+°3²!+´&C+²+°)3´++°2².+´C+°/´ C+°1/°Ö°2´<+°(2² +³@ +°±+±é°± +±é±2+±±!#99°±*+99° ².999±°+901#"'532654&#"####5354632&#"3>32áJF &:2@NT“SFFA: :à#Q:LZŒþ58G'¤/8aPþßÈþ8ÈDY8?E5RX70N<ÿérÙ(·²+²'+±é²+²+±é² +³@ +°)/°Ö±é°2°±+±é°± +±$é°$° Ö±é°/±é±*+°6ºðÚÁÑ+ °°À± ù°!À³ !....³ !....°@±³'$9±°9°²$999017#332654&/.5462#&#"#"TT+ F7C&+N]In¶bXf3<.3PNFucŒ22Ùý¸&5-%! B>IWTMT+$# E:LZ<%Ù N²+´C+²+²+´ C+° /°Ö± é°2²  +³@ +³@  +± +± ± 9901!!3þÉEþT$ Jþ‡IÙÍIþ¡_ÿÿ0ÿÿùÚ/Z*…)™Z*)™wÈh^° /´7+°´+° 2°/´7+°´+°2°/°Ö°2´+°2°± +°2´ +°2±+01!#5!#!#5!#ªFþâFªFþâFh‰CC߉CC ÿ:Üi²+´C+²+°/´C+² +³@ +°/°Ö´ <+° ±+°2´<+±+± °9±² 999°± 99014&#"563232653##"&5b& C)@NSS%K8LYN'Gmþ(70aP+ý.0'MB ÿ&YÜ%f²+´C+°/´C+°/´ C+²  +³@ $ +°&/°Ö´<+°± +°#2´<+±'+± °9± ² 99901327#"&=#"&54&#"563232653: :A%K8LY& C)@NS\5E?8¡0'MBØ'Gmþ(70aP!ÿÿ…)`Kÿó†)™ÿÿ†)b ÿó†)™ÿÿˆpM–)™ÿÿ …ÅäUÿù…)™ÿÿ#|ÈÛUïÛÖføøÚ:²+°/´ +°/´+°/°Ö°2´+±+±°901>=3327#"=#"'776  Y,1 µ0C±þz.G„Gÿÿ*†VÜ Ã\ÛÖfÿÿ†áÜZ‡)™ÿÿ ÷5Û\†)™ÿÿ1¶âÌ ÿÿ1¶²Ì' Ð U÷¾ò ;°/´ +°/´+° /°Ö´0+´0+°2´ +± +01#5433¾ii"7÷xƒ&%5PɹÄ C²+´ +°/´+° /°Ö°2´0+´0+°´+°/± +013#5>=#Pii"7Äxƒ&%5UɾÄ =² +´+°/´+° /° Ö´0+´+´0+°2± +01#"=¾7"iÄh5%&ƒxÿÿYC±òb5ÀOC§ò @°/´+°/´+°/° Ö´+² +³@ +°2±+±° 901"3"&546§$44ò,,4$#45ýO°/´+² +³@ +°/°Ö´+°±+´+°±+´ +±+±°901"#>32#5>54&©2%9IEBK,$7>3+Ê6-JKC<%B u¢*%*5ýO°/´+² +³@ +°/°Ö´+°± +´ +° ±+´+±+± °901.#"#5&'.54632ü(/&+3>7$,KBEIg03*%*¢u B%î8°/°3´ +°/°Ö´ +±+±³$9±°9013#'#–!c&MN&î¯ÿÿ3>ïgM-ÀO3å-²+´+°2°/°Ö´+±+±°9013#'#t_`?QO@å–``O2å-²+°3´+°/°Ö´+±+±°901#'373Ò_`?QO@O–``ÿÿYL¡°(ÿÿw.½qÿÿ\Q-åvÿÿPçäCYþý¡ÿÂ'°/´ +°/°Ö´+´+±+01#53¡HHþýÅÿÿÿt/ÿºqüýÿÿSÿ7$ÿËC=üçÿÿ#ÿ8ôÿÌmÿÇüçÿÿgå"/tL"Àtg°å" °/´+°/°Ö´+±+013g~?"rÿÿ\ÿÿ´®bñÀÿÿS«±bý¿ •B’D°/´7+°2² +³@ +°/°Ö´+² +³@ +² +³@ +± +017533!5„FxþÉÛ··FFÿÿ •B’wM'À nB¦ X°/°3´7+° 2² +³@ +² +³@ +° /°Ö°2´+° 2² +³@ +² +³@ +± +01%##5#53533ByFxyFxçyyFyy çB-(°/´7+´7+°/±+´+±+01!5BþÉ-FFU<Ü >²+°3° /´++° /°Ö´+°±+´+±+±° 901332673#".;T(0; $<4ÜB" ‡@sdÛÌ.°/´+´+°/°Ö´:+´:+±+01#5ÛhÌhh=1 L°/´+° /´+°/°Ö´+°±+´+±+±²999± °9012"&546"2654&§,>?V??+$>,+=>+*?>9ÿ3 5²+°/´ +°/°Ö´ +±+± °9°±9901"&54673327½8L3.F7'H%0Í4*$:,6 - e?Í3°/° 3´++³ +´++°2°/°Ö´+±+0123273#"&#"#>[X :Jd :-Í%%h&%16NMä²+°3´+°2°/± +013#73#3qh<Üq<ä–––êA:)°/±é² +³@ +°/°Ö±+±° 90157332>7#"&'JE/# -*-NŒcK›N&r-£_ÿÿU:G™ÿÌD0 ÿÿ î8Ú„)™ÿÿ5…m`O†)™ÿÿ1îV)™ÿÿ †6Ü[‡)™ÿÿ †+S8ÿú†)™(Æ 0²+°/´7+°/°Ö´+² +³@ +±+01#!5ÆHþª üàØH(Æ >²+°/´7+² +³@ +°/°Ö°2´+² +³@ +± +01#!5!5ÆHþªV üà3H¥(Æ >²+°/´7+² +³@ +°/°Ö°2´+² +³@ +± +01#!5!ÆHþªV üànHj(Æ >²+°/´7+² +³@ +°/°Ö°2´+² +³@ +± +01#5!5!ÆHþªV üà¥H3(Æ 8²+´7+² +³@ +°/°Ö´+² +³@ +±+01)5!3ÆþbVHHØHÿÿß^8²+´7+² +³@ +°/°Ö´+² +³@ +±+013!HHO_ýéHHßf>²+°/´C+² +³@ +°/°Ö´+°2² +³@ +± +01#3!HHOþïfþôIÿÿÿ86ÿÎjüéÿÿQ. &qcqÚÿÿPñMÙ zÿÿ3ÿ7ÿçgM&Àÿÿ.ÿ7ÿçgÿûüùÿÿÿ#.ÿðeÿþýÿÿÿ$/ÿñfÿÿýÿÿ:þþÿÑ}ÿýüÍÿÿnçnÿÿÿnM²žÿ ÿÿpM€ÿ"ÿÿ ÿcCÿËüþÿÿPA¸MA°í6°/´7+² +³@ +°/°Ö´+² +³@ +±+013##˜PHíH¥²í6°/´7+² +³@ +°/°Ö´+² +³@ +±+01#5#5²HPíí¥Hÿÿÿ·°¤Ê¤Àÿÿÿ¸°¥œÈ¥À ÿ8BÿäB°/´ +°2´7+´ +°2°/°Ö´+°±+´+± +0153!53úHþÉH€d¬¬d ÿ8Bÿä6°/´7+² +³@ +°/°Ö´+² +³@ +±+01!53BþÉH€H¬dÿ$Mÿí#²+°/´+°/±+±° 901!'&/76?Mþò%33%h +00+!ÿÿþÉPÿšäCþ³ÿÿÿPÿàävþ³ÿÿþÇOÿæåiþ³ÿÿþ¸eÿòÍþ³ÿÿþÏwÿá½qþ³þ=us½ ²+´7+²+´7+°/01!5sýʽHHÿÿþÂUÿïÜ{þ³ÿÿÿ&dÿŽÌ|þ³ÿÿþÌdÿçÌjþ³þä4ÿ}õZ°/´+°´+° /´+°/°Ö´+°±+´+±² 999± ± 99°° 901#532654&#"'632Û,, %(04F@ 2&$3ÿÿþð1ÿÄ}þ³ÿÿþÈOå€þÈÿÿþÆOÿååjþ³ÿ1Lÿy#°/´ +°/°Ö´+´+01#53‡HHLÅÿÿþìLÿÅ&°L°»þbNÿ¯ä²+°3´+°2°/01#'##'„354'%Ÿ-I‹+8pT ÿÿÿ ÿ&ÿxÿÕvþÍÿ$þäÿ8ÿÒÿÓ@°/´7+°2² +³@ +°/°Ö´+² +³@ +² +³@ +0153533þäSHSÈHSSHþäÿ8ÿÒÿÓ@°/°3´7+² +³@ +°/°Ö´+² +³@ +² +³@ +01##5#5.SHS-HSSHþäþàÿÒÿÎ T°/°3´7+°2² +³@ +² +³@ +° /°Ö°2´+° 2² +³@ +² +³@ +01##5#5353.SHSSH…HSSHSSÿÿþXÿdÿÿªzþMþ}ÿUÿ&-*°/´ C+²  +³@ +°2°/°Ö´<+01'03#"'053265SS &-šmG'ÿ­ÿ&X--° /´C+² +³@ +° 2°/° Ö´<+°20150327#"=0& -y'Gmšÿÿþòÿ[ÿZÿÃ|þü÷ÿÿþ“ÿ^ÿ®ÿÆjþzüúÿÿþ¯ÿÿƒÿÔ}þrüÐþóþÔÿWÿ´ :°/´+° /´+° /°Ö°2±é±é°´ +° /° 3013+52505#þód4.77Lg8A&Nÿÿþÿ*ÿˆzþiÿÿþìÿ3ÿ¼~þ³ÿÿþýÿ ÿEÿÒ°ÿÌüÁþÏÿ;ÿáÿÄ>°/°3´+´+°´7+°/°Ö´+°±+´+01!#5##þÏF†F<‰CCþÀÿTÿòÿÎZ°/°3´+°2°/° Ö´+°±+´+°±+´+±°9°°9°°9±°901#"'#"&=3326=3326=3%&'$3,,2"%34$"""""ÿÿþÆÿ8ÿåÿÎjþ³üéÿÿþÆÿ8ÿåÿÎ jÿøÀÿÿþÂÿ8ÿïÿ¿{þ³üãÿÿþÂÿ8ÿïÿ¿ {ÿþÀÿÿþ}ÿEÿ·ÿ­þxüàÿÿþÿgÿ¢ÿ­qþtüðÿÿý§ÿPÿÿÿ‚Bý½ÿÿý§þêÿÿÿ‚'Bý½ÿšBý½ÿÿþ>Ðÿx8þ9þkÿÿþeèÿw.qþIþqÿÿý9Þÿ‘Õÿ’ŽýCÿóh3#YLýœLhý›ýCÿÃÿóí3#YLýœLíüÖÿÿþøÿÿPÿ²¿þpþØÀÿÿþ–ÿPÿ¨ÿÙÍþwÿÀþ”þÔÿ™ÿÙ4°/´++°/´++°/°Ö´+°±+´+01!!75#þ”þûÁ}'þûD}}þ‚ÿRÿ´ÿÅZ°/°3´+°2°/°Ö´+°±+´+°± +´ +±°9°°9° °9±°9014632632#4&#"#54&#"þ‚3%&'$3,,“%34$þÒ3ÿÓô ?°/°3´ +° 2° /° Ö°2´+°2± ³$9±± 9901''7'7N __ `_ __ _óGHGGHGGÿ!Fÿ‰R/°/´+°/° Ö°2´+³ +´+° 2015654&547w61%&h%%†", g7 ,  eÿÿý¨MåÖcÿÿþÉQÿšåCþ³ÿÿÿPÿàä¤ÿÿþ¨\ÿâÄþ£ÿ÷ÿÿÿ2AÿŠä¶ÿÿþXÿäöþ—ÿìÿÿþ¿ÿVÿ[ÿöþ@ÿÿþÏQÿáÚÍÿÿþŒÿ/ÿžÿÙ&Ôü,ÔüÈÿÿþ¸ÿÿÿÖ&ÌHÌ»þòÿÿ‚ÿ£2°/´+² +³@ +°/°Ö´+² +³@ +013#5#þò=S]WþSÿÉM² +°3´++²  +³@  +²+´++°2°/°Ö´+±±99± ° 901#7&#"#>32733273#"ÉC+ :-!%'>1  :J‡4G%16@T%hÿÿþh/ÿ¢„#|þ0ÿË#|þ’¸þcAÿÿþ‘=ÿË,#þŒ_þŒÿØÿÿýàÿ ÿÔÿÓG ‘ýÔÿ þ”þÔÿYÿÉ $°/´ +° /°Ö´+±°901#5'67&'ÿ9 4.8+ A þÔÊ, -19% 5 ÿÿþº!ÿÎîfþžÿÿÿ:Mÿ’ü¿'ÿÿþ¡3ÿÎ #|þ’ÿÏ {ÿÝuÀÿÿþPÿÿQÿÛàÿ~üçÿÿþjÿ#ÿ~ÿð”þPÿÿþ{ÿ$ÿÿñ•þ`þÿ&ÿãÿ× x°/± 33´ +°2°/°6ºÁÂÏ+ °.°À±ù°ÀºìîÂè+ °.°À±ù±°À´.....¶.......°@±° 90157'5%3#'#þýé¼¼K!c&MN&uJ:;¯ÿÿÿ;=ÿ“ìbÿâ/Àÿÿþ½|ÿ%ä|þJþmþäÿRÿ¼/° /°3´ +°/°Ö´+±°9± °90137''7'7þÈ/PQ5'./&4QPDT,CFFC,ýüÿÿ¤ÿÐ0Ibh°)/°3´4+°J2°G/°P3´+°2°c/°,Ö´1+°1±M+´+±M1µ)>Y$9±G4@  "$,1 M$9°°9012>32#".1#"&54>32>7".#"2654&#"þW   & 2$  $2 &!  *    1   "8   8" \(     &M(&     þ¯"ÿ™ 2°/´+² +³@ +² +³@ +°/°Ö´ +0137#7#þçA%–9?'™ eš_þ³ÿ9NÿÝB°/´++² +³@ +°2°/°Ö´+°±+´ +±±9901267>73"&'.'33232653#"/&²3C+WL**·,"C,317 =A™% *$FKE +); ?ÿÿþ³xNÿUÀþÓþû+ÿâ °/´+° /±°9015!'7'7þÔäE%9YY9%E¨.?3@?3@ÿÿþ£9ÿ_Dþ˜BQÿÿþ‘:ÿFHþ†CQÿÿþã?ÿULþÊ?Qÿÿþ:ÿERþ…CQÿÿþ«:ÿJ Xþ•CQÿÿþ³;ÿ^Fþ¨DQÿÿþ¤:ÿXXGþšCQÿÿþµ9ÿTPKþž:Qÿÿþi<ÿq PþS<QÿÿþÝ<ÿ> UþÇ<QÿÿþÎ:ÿ*AWþÇCQÿÿþ“:ÿIYþ:Qÿÿþš:ÿH[þ—:Qÿÿ1¶âÌ\ÿ>‹ °/´ +°/°Ö´+±+017j B‚ˆ@ˆÿ8ÿØG° /´+² +³@ +³@ +°/° Ö´&+°±+´+±+± ° 9012>73#"=3å !1JL£*OQO,"ÿô˜K²+°3´7+²+±é²+° 3´7+²+±é°/°Ö±é±+±°9014&#"#53632#"'#53326>QG!GR#@A0‚pRG!GQUp R&;b>ŒƒR pÿÿÿô”'y ÿökÿÿ"ÿô˜&y öÿÿPÿm¹ ÿÿsPDä¤dlM  G²+°3±é± 22° /°Ö´<+°± +´ <+± +± ²999° °9013#'#5!#5²Za:SES žUSSSSÿÿ‹å V¤¾ 5²+´+²+´+°/°Ö´:+´:+±+01#5¾h hhÿÿóä')˜ÿÿä'+™¤ñÿÿIä'-‡ÿÿÿé:å Wÿÿnå L7ÿÿõä'¤ñ<(ÿÿÿéÿø0ý"ãóLÿÿ‹Ù$ÿÿPpÙ%P4Ù,²+²+±é°/°Ö±é² +³@ +±+01!#!4þ|`ä…ý{Ù¬Ù"²+±é²+°/±+±°901)3!¬ýbtöŽÐÙý{;ÿÿP[Ù(ÿÿIÙ=ÿÿPÙ+(ÿéèåb²+±é² +±é´ +±é°/° ֱ鰱+±é±+±³ $9±± 99°±99°± 9901!5!#"&632%"2654&+þ°P½À žÂ ÁþŸtŽèŽ@R1¢ÖÓVÓÔ‚¥þò¥¤„ЦÿÿdÂÙ,ÿÿP“Ù.‹Ù!²+°3²+°/±+±°9013#3#rcxhÕÙý'uÿÿPþÙ0ÿÿPŠÙ1(JÙ )²+±é²+±é´  +± é° /± +01)5!!5!!5!JýÞ"ýî9þg™S3SþsSÿÿ(ÿéèå2P€Ù/²+°3²+±é°/°Ö±é°±+±é± +01!#!#!€^þŒ^0‡ýyÙÿÿP^Ù3(^Ù (²+± é²+±é° /± +± ±9901)55!!!^ýÊìÊþtÊòÈU#RRþñþÙÿÿZÜ7ÿÿ—ß<(»Ùr²+²+´ +°3´++°2´ +°3´7+° 2° /°Ö±é°±+±22´<+±22°±+± é±!+±± 9901%"&5463532##4&'>H{¥¥|Q}¤¥{SoVWnþèVon_•}yžQQŸx|–_vVk þc r{ lUYqÿÿ‚Ù;<¾ÙW²+² +°3² +±33´ +°3±é°2°/°Ö± é° ±+°2±é°2°±+±é±+01%##5#"&5;332657Î"^"zvZKWVWKZ‚«««laaþÉQAÉþ7AQ7þŸkb(ÍÝ!j²+° 3´7+²222²+´C+°"/°Ö± é° ±+±é±#+± ±99°¶!$9°± 99±±9901%>54&#"!53.546323!¯;D.Žqm‡iMþø¤OZ»ŽšÂhT°þîL /MwAqš nc´#LH.¬eŠÌÂi®,Hÿÿÿþ„#jÿå¸-ÿÿ—„#j³¸8ÿÿÿó5ä#–DÿÿÿöÓä"{HÿÿÿJéê#…Jÿÿ<ÿø+è"çLÿÿ<ÿòòý"`óXÿó5%t²+°3± é°#2² +²+±é°&/°Ö±!é°!±+± é° ´+°/±'+±!°9°±99° °9± ±99°´!$9014>353327#"&=#"4&#"326 1S4~,H +%#U?äxRBJFŽHN!CK9%WRþW E #*Nni[Àf<ÿ:Ü(Œ²+±é² +³@ +²+´7+´%$ +±%é°)/°Ö±é°2°±!+± é° Ö´+² +³@$ +±*+±³ $9±°9°$± 99°%° 9°°9014>32#"&'#4&#"32654+5326<*Q;_ihžo_;F!VH?4G8qAE¢2*?Gê7RE$dXw%ž_w$úè3?P^þªTJDˆJI ÿ:ü,² +°3² +±é°/°Ö±é±+±°901#5&#"'4632ü¼V§ $.'v þìì˜F #7þÐ~ÿð Ù't²+±"é²+´ 7+´ +´++°(/°Ö±é°±%+±é±)+±±99°%³ $9°± 99±"±99°°9° °90174632'5!!#".7"32654&v_ ÓŽþó¯51PR+ =A1ôFRPDOWRòsŽ¢HHŠ92P,Kn8$8]ùgO[]cWRbÿöÓ$—²+´"7+²" +³@" +² +´7+² +³@ +´ +´+°%/°Ö° 2´<+°2² +³@ +°±$+°2´&+°2±&+±$² 999±"°9°°9°° 901%#"547&54>32#.#";#"267Ó mgÖffDY9X| LV;@@..?AHrXˆPB’_`7EDN'%U/(;(/,(%'ÿ>°ÎS° /´ 7+°/°Ö±é°±+´1+±+±± 99°³ $9°³  $9± ° 901".5467#5!'654&7L=+‰gàdq§­ED&L" .T6ŠÞBH<@ℎ.A7aE!#ÿJéX²+²+°3±é° 2°/°Ö±é°±+±é±+±±99°°9°°9±± 99°° 9014&#"#4#"'632632'‘.>ŠX  $CaR[XÛ 0Q67R0 ß@[/Þ‰ :`þí :V: h?edC))AedAr>n{ßÿ5QO+þ¸6SU.-TT<ÿø /²+±é² +°/° Ö±é±+±°9° °9017327#"&53” .,<@XˆQHE‡<ê 0²+°3²+° 3° /°Ö±é°2± +±±9901!##373êl¬>XXÐrÆ <Î ÒÒÆ ÿôÚ"=²"+²+±é² +±é°#/±$+±"°9°´ $9° °901.#76323267#".' #Ð  6 !$¦0!! z’`') R !0:þJFbþ\<ÿ8à O²+²+± é² +³@ +°/°Ö±é°2°±+°2±é±+±°9± ±9901"&'#332676=3#5+6XX 8)*=VP; "üÓßx##*17jáýõ>%%ÿÿ æ Yÿ>ÇÎ/¦² +´7+°+/´(+°/°!3´7+°0/°Ö±.é°.°% Ö´&+°/´%&+²% +³@%! +³@%) +²% +³@ +°.±+´&+±1+±%.°9°³ $9°°9±+°9°(°9°°901%2'654&+".54>7.5467#5!#";#"jI'J#&8Ca1'3"6D, dt¦*@LXRnJd^F*C=^V"!78.H) K9+HFFT0+E@RxDÿö G²+±é²+´7+°!/°Ö±é°±+± é±"+±±99±± 99014>32#"&2654."0B>!+NM.‡mqð>\11410/1=_8% 6mK†’E\l8Q)*RpR*ÿüH b²+° 3´++²+´7+± 22°/° Ö± é² +³@  +° ±+±é² +³@ +±+±°9°°901%27#"&5###5!# 0.,ì^F(@@ >0FTþ:ÆFFþ®<ÿ8  Y² +±é²  +³@  +²+´7+°!/°Ö±é°2°±+± é±"+±± 99± °9°° 9014>32#"'#2654."<0B>!r‚‡mc5Xð>\11410/1=_8% w†’Gþû\l8Q)*RpR*ÿJý$U²+± é²  +³@  +°%/°Ö±é°± +±é°2°±é°/±&+± ´ #$9±°9014632#4&#"'>54'.Œtc|[JB01'?,%680Z sg£vŽu_@F'L4-D%  +,n PœÿôJa²+±é²+±é²+± é°/°Ö±é°±+± é²  +³@ +±+±±99° ° 9± ³ $9014>32!##"&732654&",KO,ˆ@qsZ[=IOL˜LMp9RRf{•”|k[lZVprÿôØ I²+± é²+´C+°2°/°Ö± é²  +³@  +² +³@ +±+± °901"&5#5!#3272I1¤ÄÈ! # CQ;IIþÍ+O <ÿòò 7² +±é²+°3°/°Ö±é°±+± é±+±° 901732653#".53”1SN4XjnEZ.XèbHK_$þº~V:H7Fÿ8© #p²+°3± é° 2² +³@ +²+±é°$/°Ö± é° ±+°2±é°2°±+±é±%+± ±99± ² 999°±9901"&5467;32+#54&+326'yZF*3CiNXy›†n X]OK] –nZŠ$D!d;NiŘzn–¾¾Ohþ•f ÿ,9<²+²+±é°2°/±é°/± +±² 999°´ $901+"&/#.##563233279$=a¸hê•   B ƒ`ǃ$È 3&ÅþîhN<ô"þ”û$<ÿ8~ \²+°3±é°2² +³@ +² +³@ +² +°3°/° Ö± é° ±+°2±é°2°±+±é±+01%##5"&53332653~uVt‚ZGUVUGZÖllÆÆjn6þæYQ²þNQYÿ÷º'l²+°3´"7+°2²+° 3°(/°Ö±é°±%+±é°±+± é±)+±%²999°°9°² 999±"³ &$901%2>54'7#"'#"&54673>=3–.4(4lP*F$<=!`0.b^`<4Pl3:7,T™"55H/”u"­NFh4ZZj<¸)lIc7 ßÿÿÿÚÿø¿"jÁóLÿÿ<ÿòò¿"jhóXÿÿÿöè#Rÿÿ<ÿòòè"qXÿÿÿ÷ºè#î\ÿôÚ2²$+±/é²/$ +³@/* +²+´7+´2$ +°3´7+°2°3/°*Ö´+1+°+± +±é°±2+°2±é°2²2 +³@ +±4+± ° 9°2±/9901"34&4>323##".'33265+7 ªâ ",,! CC 1L24N, P>-AI’i——iþ¸1?P2:"$ " 3'@*#HAeX8 &8SG+;^@v–©å L²+² +°3±é² +´*+°!/°Ö±é±"+±°9±²999± ° 901052>32&#"#54.'&Df>! •PK> '&'@2&`.&-…`3ZQ3^³E$. 9\¶x¾¾ETp_+4ÿÿjå"ÿcÁÿÿ©„#j„¸cÿ8žÈ!q²+°3±é°2² +³@ +²+°3±é°2² +³@ +°"/°Ö±é°±+±22±é±22°±+± é±#+±± 9901463532##5"&73"4&#26ˆŒXzš?nJXzšTa_b^Ø_ae[u™´´—y8^M+¾¾—xSk|oOSkþ„iÿ÷º+ƒ²#+°3´7+°2²++´*7+± 22°,/°&Ö°*2± é° ±+±é°±+±é°2±-+± &°)9°± #99°°!9°± 99°°9±*³!&$901%2>54'!3>=3%##"'#"&5467#5–.4(4Nþ§M3:7,T#>#$<=!`0.b^`!>™"55H/€ee€Ic7 ßžF0y6Fh4ZZj(„3F ÿ(" q²+²+°3± é° /´C+°!/°Ö´&+² +³@ +³+´&+°±+± é°2±"+±² 999± ´ $9012733#"'5326=&5#7654&# †”™cgjÏ &Æ”h:”ka Tc·}NqºmG'O–³F³c8* ÿï:!P²+²+±é²+²+±é°"/°Ö´&+³+´ &+±#+±· !$901>3273327#"&5#7654&#" Z1;O™cgj-#/,6]1=O”h:”%.+º(9_eµ}NF<ÿF .l²+±é²+´'7+°/±é°° Ö±é°//°Ö±é°*2°±"+± é±0+±"³$9° ±99±°9°'° 9014>32#"'3263"#"&572654."<0B>!r‚>D+Gc54)-1'-Dmð>\11410/1=_8% wlm&GR4Rl3[\l8Q)*RpR*ÿô”=²+° 3´7+²+±é²+±é²+±é°/°Ö±é±+013273##".546323#&#"xQG!GR#@A0‚pRG!GQUp R&;b>ŒƒR pÿÿÿ&«ÙMÿÿ(ÿéèåaÿôN²+±é² +± é´  +´++°/±+´ +± 22±+±± 99± °901%"4>3"3#ä 1S4CFFBN!CJ9%LVLBJVÿÿ2ÿôn4À(ÿéMåA²+±é²+±é²+± é²+± é° /°Ö±é±!+± ±99014>323#&#"3273##".(0GyL6,v$0j{€m( “)2KwG/d2bjO4 R ¢Œ‰¡ R 3Ni`ÿÿÿéCåpkÎÀÿÿ(ÿéMå'yPpÿÿÿéCå&ydPqÿÿP[„'X¾‰ÿÿP[„&‰j´¸ÿlÐÙk²+°3²+±é°2° /´ ++´ +±é°/°Ö±é°2² +³@ +² +³@ +°±+±é² +³@ +±+012+53254+##5!#+J[ 54Rc9Bî]ÇêÅÆWEþÖ,? BBK9þŒ‰PPÃÿÿP9„'Y܇(ÿéå |²+± é²  +³@  +²+±é² +³@ +´  +±é°!/°Ö± é°2²  +³@  +° ±+±é° Ö± é±"+± ² 999± °901.#"!!32673!".54>32/^W^x lþ’gZ``!þõKwG/0GyLî+÷NN‚sR~“ejþß3Ni`12bjO4îÿÿ0ÿémå6ÿÿdÂÙ,ÿÿ"„#jÿî¸,ÿÿ#ÿé¼Ù-ÉÙ(k²+° 3±(é²+´ 6+²+±é´' +±é°)/°Ö±é°2°±+±'é°2°'±#+±é±*+±°9±' °#901!#0#52>=!32#'2>54&+Íá,F.%“ua 1>M@µ‡{Ch‚_T,^!DNteG¨þÆtY^rR+48FûPÉÙ_²+°3±é²+° 3´ +°3±é° 2°/°Ö±é°2°±+°2±é° 2°±+±é±+±°901!!#3!332#'2>54&+ÞþÐ^]1]Œ|…w` 1>M@¤Lþ´ÙþÅ;þÆuZ\rR+48FûÐÙV² +°3²+± é°2´  +±é°/° Ö± é°2² +³@  +² +³@ +° ±+±é±+012#4+##5!#+J[]Bî]ÇêÅÆWEþÖ;9þŒ‰PPÃÿÿPn„'YðŽÿÿPŠ„'XÒŒÿÿ`„#{¨—Pÿy‚Ù K²+°3±é² +³@ +²+° 3° /°Ö±é°±+´1+°±+± é± +01!#5#3!3‘Pñ^v^‡‡Ùýy‡ý'ÿÿ‹Ù$PpÙI²+±é²+± é´  +± é°/°Ö±é° 2² +³@ +°±+±é±+01%#!!!3 4.+32>p-Y=þ·éþt´] 8'ãã'8Ú$FE+ÙRÔ×.*,þñ-ÿÿPpÙ%P9Ù,²+²+±é°/°Ö±é² +³@ +±+013#!!­]éþtÙR"ÿy Ùs²+±é²+±é°2°´ +°2² +±é°/°Ö´1+°± +±é°±+±é°±+´1+±+± °9°°901%!!>=!3#5!#5KþúÎE*Â[Pý¸PR5hþÓv ñÙ¥ýqч‡ÑÿÿP[Ù(„Ù:²+± 33²+± 33°/°Ö°2±é°2±+±³ $901 # 333 ##›þânEþåtî]îtþåEvþê]Dþ¼wbþÌ4þÌ4þžþ‰Dþ¼(ÿéeå1…²%+±é²% +³@+ +²+±é² +³@ +´ % +± é°2/°+Ö±-é° Ö±é°-±+±é° Ö±é±3+±´ %$9± °9° °9°°901%2>54&+532654&#"#>32#".'3N8N%`ClX?_YJW^XŒ~x‹i‚(>gA)KN8%X+U;*).TR[.7DMGkwscl-1}9=. #7\<64PŠÙ B² +°3²+°3° /° ֱ鰱+±é± +±±99± ±990133##PX}eXþ‡iÙý¥[ý'VýªÿÿPŠ„#{ƨŒPnÙ 0²+°3²+°3° /°Ö±é°2± +±± 99013#33 #­]]1oþ§z|þ»ÙþÎ2þ§þ€MÿöOÙH²+² +´ 6+²+±é°/°Ö±é°±+±é±+±°9± °901!#52>=!#ñþú,F.%Â^‡RDj„aV-^"FPvgG©ý'ÿÿPþÙ0ÿÿPÙ+ÿÿ(ÿéèå2PÙ/²+°3²+±é°/°Ö±é°±+±é± +01!#!##þ‹^1^‡ýyÙý'ÿÿP^Ù3ÿÿ(ÿéå&ÿÿZÙ7`Ù!²+²+°3°/± +±°9013#733ñqòq¹¸oôåþ…{(%Ù$0<k²+²#+´1# +°%3±é°2´!2# +°03±!é±22°=/°Ö±8é°8±+±"122±é±%22°±++±é±>+±21±9901032##5".54>;532>4.#"Ö &CcF3'?6K._.K6?'3FcC& _0H5''5H0_0H5''5H0|7jH6W8( ^^ (8W6Hj7]ý×%JdJ%þ†z%JdJ%ÿÿ‚Ù;PÿyÄÙ Q²+± é² +³@ +² +°3° /°Ö± é° ±+±é³+´1+± +± ±9901%33#5!3#^CPýÜ^R‡ýqчÙýy2Ù9²+²+° 3´  +±é°/°Ö±é°±+° 2± é±+01#"&53;3#¿èMX]Lä]]\A)þÅ9tý'PîÙ ?²+±é°2²+± 33° /°Ö±é°± +±é°±+±é± +01%33!333ÎÂ^ýb^Â^R‡ý'Ùýy‡Pÿy1Ùa²+±é°2² +³@ +²+± 33°/°Ö±é°±+±é°± +± é³ +´1+±+±± 9901)333333#áýo^Â^Â^CPÙýy‡ýy‡ýqÑ%Ù I²+±é²+±é´ +±é°/°Ö±é°2² +³@ +°±+± é±+01!#5!32#'32654&+çD¥–ˆ‚dÝÔ@RQAÔ‡RþêxfcRR=@PPÙ S²+°3± é²+°3´ +±é°/°Ö± é°2° ±+±é°±+±é±+± °901)332%32654&+#ŠþÆ]¥–ˆþ¾Ô@RQAÔm^Ùþêxfe€RR=@Phý'ÙPpÙ :²+± é²+´ +±é°/°Ö± é°2° ±+±é±+01%#!33232654&+p‚dþÆ]¥–ˆþ=Ô@RQAÔâcÙþêxf“R=@P(ÿéå a²+±é² +³@ +²+± é²  +³@  +´ +±é°!/° ֱ鰰 Ö±é°/±é±"+±°9013267!5!.#"#632# ˆ`Zgþ‘l x^W^_+îLyG0/GwKþõ! je“~Rs‚MOî4Ojb21`iN3!Pÿé»å|² +²+±é² +²+±é´  +± é°/° Ö±é° 2°±+° 2±é°±+±é±+±°9°±99±°9° ±99°°901#"&'##33>32%"32654&»»Ž•±v^]y«ž¯þ³r|}rq~|ažÚÁ¢þ´ÙþÅ—°Ñ¢þ좡‡£^Ù P² +°3²+±é´   +± é°2°/°Ö±é°±+°2±é±+±° 9°± 9901463!###"&6;5#">vaI]oþëneqQ7>53"32654&o,oq}np}$F2?)/J1%S(:“FPPFEQOÕF•ˆ”•„L„€U  ( N=m¾mm\an<Ê 4&+32632654&#2+[.;bb;.ËŒ'-.&RFE`TGóx,Ž)u›*&!*%P4W%ZAU <r ,²+²+±é°/°Ö±é² +³@ +±+01!##<6âT Lþ@ÿˆ2 r² +±é² +´+°2°´  +°2²+±é°/° Ö´ +° ±+´<+°±+±é³+´+±+±°9017>5!3#5!#573#M0"S@FþnF­Ý¬@÷Ðþ4¸xx¸ t;àÿÿÿé÷H ó =² +±33²+±33°/° Ö°2´<+°2±+± ³ $90173#'#5#'35¨ÀkòjáSájòkÀ ÉÉúþîââââúÉÉÿéÇ#š²!+±é²! +³@# +²+±é² +³@ +´ ! +± é°$/°#Ö±é° Ö±é°±+±é² +³@ +°° Ö±é±%+±³!$9±°9± °9° °9°°901732654&+532654&#"#>2#"'v5E6@;+J>01<3fXb¶nAVucËœ/7-%6L5!$+TMTWIK%&VLZ³<ç E² +°3²+°3° /° ֱ鰱+´<+± +±±99± ±990133##5bST¬ !2  ýôÀb%< B² +°3²+°3° /° Ö± é° ±+±é±+± ±99± ±990133####S?5egke^1Sƒ@CC@CFFþdCBBC@CB½^˜†•#+þï-&ƒ†™^åÕl¾ll\`nm^_lk]amÿÿ Ò [<ÿˆ Q²+±é² +³@ +²+°3° /°Ö±é°±+±é³ +´ +± +±±990133333#532#"&'33267#53.#"$m[j}k^pTkAMãà I:4@\\cœ‚•k`~^TMIP;7<ÿéÇ#v²+² +±é²+²+±é´  +±é°$/°Ö±é°2°±+°2±é°±!+± é±%+±!± 99±°9°± !99°°9014>32#".5##3%"32654&ð 1W7q}n7W2! ^TTJFPPFEQO51D8'•ˆ”&8H>é ×™m¾mm\an Õ [² +°3²+±é´   +± é°/°Ö±é°±+°2±é±+±° 9°± 99± ° 9°°9014>;#5##7.7;5#"B!@,øTEËgÍCR[[‰‰*1w/0ýôÚÚÝL=F›+$ÿÿÿé÷ä&©Crÿÿÿé÷Í&©jyÿ]Ù'“²+² +²+´C+°!/´$+´  +°3´ +°2°(/°Ö° 2´<+±22² +³@ +² +³@ +°±'+´<+²' +³@'# +±)+±'±!99±°9014&#"##53533#>32#"'5>5²B*BKSTTS«« *;#KZ7PP 5{\70bNþíT@EE@Ÿ!JDþì?k@#(|\ÿÿ<rä"v#§ÿéÜ^² +±é² +³@ +²+±é² +³@ +´  +±é°/°Ö°2±é°2±+±±99±° 901%#3273#"&54632#.#"3WâMAkTp^k}j[mT@4:I ßèT^~`k•‚œb]7;PIÿÿ$ÿéÍVÿÿFšÙLÿÿÿöÅ"jÝùóÿÿÿ&«ÙMþ e²+°3±é°2²+±é´ +±é° /°Ö´<+² +³@ +°±+±é°2°±+± é±!+±° 90172>=!32+##%#32654&SqmkaFö¬'B8||:81P,‹ŒyÖCXEVÀaŒ6êž,+(<' a²+°3±é²+° 3´ +°3±é° 2°/°Ö±é°2°±+° 2±é° 2°±+±é±+±±9901!#5##335332'#32654&€öúTTúTqmkbk||;72éé ××ÖBXEWêž.))Ù²+°3² +²+´C+´  +°3´ +°2°/°Ö° 2´<+±22² +³@ +² +³@ +°±+´<+±+±°9±°9014&#"##53533#>32#´B*BKSTTS«« *;#KZS\70bNþíT@EE@Ÿ!JDþ‚ÿÿ<Úä"vR®ÿÿ<çä&Cn¬ÿÿ ÿ&Ô»"{Dß\<ÿˆÞ K²+°3±é² +³@ +²+° 3° /°Ö±é°±+´+°±+± é± +01!#5#3330F®TúTxx þ@Àýô™Ù[²+°3²+°3°/°Ö±é°± +±é°±+±é± +± ±99°°9°±99±±9901!#&53>53653#&'0fKpdFG-*6dBKPRd)EB&f[38~‚Ù¹þê‰TW—^´ë‘•´oß¾@˜Ó½ ž d²+°3²+°3°/°Ö´<+°± +´ <+° ±+´<+±+± ±99° °9°±99±±99013#&3>53653#&'ö^ŽRk31RkdR‡^C#"á+Áïp¹i£ïÛÕþâîjwyÙf²+±é²+´  +± é´ +°3±é°2°/°Ö°2±é± 22² +³@ +² +³@ +°±+±é±+01%32654&+532#!#53533#DÔ@RQAÔ¥–ˆ‚dþÆÉÉ]ÍÍRR=@PRxfc#RddR^ˆr²+±é²+°3±é° 2² +³@ +´  +±é°/°Ö°2±é± 22² +³@ +² +³@ +°±+±é±+±°901%32654&+532+#53533|B08:|vkh^Iö­­T°L/)50·k\RI^ÀL||Ldÿé‹å'•²+²+± é²  +³@  +²+²%+±é²% +³@ +´% +°3±é°2°(/°Ö±é°2°±+°2± é°2²  +³@  +° ±+±é° Ö±'é±)+± ² %99901.#"!!32673!".'##33>32^W^x lþ’gZ``!þõHrG1U^^W4GnCî+÷NN‚sR~“ejþß.Ha\0þ´ÙþÅ/WXA(îGÿé "¡²+² +±é² +³@ +²+²+±é² +³@ +´  +°3±é°!2°#/°Ö´<+°2°± +°2±é°!2² +³@ +°±+°2±é°2±$+± ° 9°± 99°±9901%#3273#"&'##33>32#.#"3âMAkTp^f|HSSKz^[mT@4:I ßèT^~`k‰vè ×k{b]7;PIÙ @² +±33²+´  +± é°2°/°Ö±é±+±° 9±° 9013#'##5## RdLde‡^ac“Ùý'ÛÛÛÛ)@þÀ # (² +±33²+°/±+± ³ $9013#'#'#0'ñ[\z^AH[;=^O?G? áþÕ££‘‘ ©dòÙ`²+² 333²+°3´ +°3±é± 22°/°Ö±é°2°± +± é±+± ±99° °9±°901 3#'##5##7##33“]dLde‡^acaž^^Á)@þÀ°ý'ÛÛÛÛÛÛÙþPGá R²+² 333²+°3´ +±é°/°Ö´<+°2±+±² 999°°9°±9901'3#'#'#7##33?G?![\z^AH[;=^O}SSŸ ©©áþÕ££‘‘³³ þõ„Ù <² +±33²+± é°/°Ö±é±+±° 9± ´ $901!###'7§Eã{vþê]þân{1sqÙþÝþJDþ¼Dþ¼´Óœœ ó B²+± 33²+°3±é°/° Ö´ <+±+± °9±´ $9017%0!#'#5#bhþ†.Ö.jáSáj.ÀmmLÞþÒââââ.dVÙj²+² 333²+°3±é´ +±é°/°Ö±é°2°± +± é±+± ²999° °9±± 99±±99017%!###!#3!+sqþjEã{vþê]þân5þ¬^^™‡œœRþÝþJDþ¼Dþ¼cþÙþÜG q²+² 333²+±33±é´  +± 33±é°/°Ö´<+°2°±+´<+±+±²999°°9± °9°°9010!#'#5#7##3!'7.Ö.jáSájäþSSFbh ÞþÒââââää Ümm"ÿ@e'N²I+±é²L+´*+²6+±*é²6* +³@64 +°92°/° 3´6+° 2° Ö´6+´"#I4 +±"é°O/°.Ö±-é°-° Ö±é°/±é°-±3+´4+°4±9+´:+° 2°:±+±Cé°' Ö±?é±P+±3-°9°4³1L$9°9¶ #*"I$9°:°<9°'°A9±I±99±"±C99°#°A9°*²-.?999°6±1<990132632&#"#"&5463232>54&+532654&#"#>7&'332673#"&#"„!M#MY="M<^S;r8N%`ClX?_YJW^XID;T(0;BIi‚(>gA$c 3 ^ EH@K*).TR[.7DMGMi!4B" 4!dGl-1}9=.+ÿFÇ]>þ²=+±é²+±é².+±$é²$. +³@$& +².$ +³@., +°12° /±é°° Ö± é´=, +±é°?/°Ö±é°,2°' Ö±&é°´++°+/°±+±:é°! Ö±6é²!6 +³@! +°!°1 Ö´2+±@+±&+°)9±1µ $=$9±!°49°2³ 38$9±= ±99±±:99°°89°$°69°.±)49901"3263"#"5463232654&+532654&#"#67&'332673#"¸*Y&!]#?2K(0;+J>01<3fXI;U(0;SAVfS R‹6E-%6L5!$+T_(":B" :!+\K%&VK[ÿÿ<¾Ù;ÿÿ<ÿ8~ [(ÿéèå e²+±é²+±é´ +´7+°/°Ö±é°2°±+° 2±é±+±³ $9±°9°°9°°901#"&632.#"!26èÀ žÂ Á^‹pmýþ ‹ÔŒa¢ÖÓVÓÔ}•–|Fu‹Œÿéø e²+±é²+±é´ +´7+°/° Ö±é°2°±+° 2±é±+±³ $9±°9°°9°° 9012#"&6."!26 q}np}~M€N)þØN|N•ˆ”••ùRZ[QFNXXæÙ '²+²+±33± é° /± +± °901!#303#ydþúdÖÊÓŒÙý—iR & '²+²+±33± é° /± +± °901!#303#[¸^Œ”ž] þW©Lÿÿæ„']Œèÿÿ &Ù#²Þÿõéÿÿ'ÿ&ˆåf’<(@·´ÿÿÿ&¦'·ÒF²<(@(ÿé8å%r²+´+²+´ +°&/°Ö±$é°$±+² 222´:+² 222°±+±é±'+±±99° ³#$$9°³ !$901!.4>753#=3>54&'#5|_˜]]˜_hH{\5À”hhj‹lhjŒ YžÊŸX 8[ƒOŽÂjpu’‘ä‘ÿé4"v² +´+²+´"+°#/°Ö±é°± +²222´ :+² 222° ±+±é±$+± ³ $9°"´$9°³ $90153#5.4653>54&'#õhbuw`havva9GG9h9GG9h„sm‚ƒàƒAZIIZYGK[ÿÿ™Ô'ø{|'ù*ëÔÿÿ © 'øúÿÈ'ù©7Õÿÿ™„'ÐÁªÔÿÿ žÙ'ÐAÿÿÕÿ$À¡²+°3°/±+°6ºöÀÅ+ ° °À± ù°Àº=ì±+ °.°À±ù°ÀºöÀÅ+ °°À± ù°À°³+±°³+º=ì±+ ³+±° ³ +º=ì±+ °³+±° ³ +º=ì±+ °³ +±° ³ +º=ì±+ °³ +±° ³ +ºõíÀÌ+ °³ +±°³ +ºöÀÅ+ °³+±°³+ºöÀÅ+ °³+±°³+@ ..................@ ....................°@01''#7'57'573Àœ@‰87;ˆœ?ˆœK7MCÉC²ºBÈBëôþ„cÿì O²+´ +³+´+° ³ +´+° /°Ö´ +°2° ±+°2´+0153353#5#þ„HØHHØc’C’BÿÿþþU+Ü´<ÿÿÿ`ÿª¸‡·üÆäÀ@ÿÿÿ fÿ°¿‡¶ð4@Àý×Cé6°/°3´ +°/±é°/°Ö´+± °9±° 901"#46323".þ}' @[QJFN (N>~— '$I]!)!; ÿÿýÿ† Y&Î'ÎDÿy'Îþºÿy'ÎÍþ3'ÎFüî'Îüf'Îþ»üíÎþ3þ3üýÿUk "/<IT_u²7+°9 Ö´4+²+²!+²;+°/´+° /±é°L/±UZ33´S+°^/´W+±JO22°F/´A+° /±é°/´+°`/°OÖ´P+°P±S+´K+°K±'+´,+°,± +±22´+°± +´+± 22°±+´+°±U+´_+°_±[+´Z+±KS±7699°,³)49<$9° ¶#$*.01;$9±¶!=>H$9°³AFI$9±_U±DC99± ±99°9³"6$9±L7³01$9±FW¶#.$>DH=$9°A³,'C/$9°±)*99013#5265##5463"37'654''&5477#"'7327''7632&#"#"&5335532#4&#þüX/)-YX/)-É?3 ýà?3 >4"   >4" ýI+/*\I+/*JI+/*\I+/*üø>4" ž>4" ý¡?3 !?3 þX/)-ZX/)-PÿyÍ„ ”²+°3² +°3° /´++² +³@ +°2°/°Ö±é°±+´+°±+´+°±+±é³+´1+±+±°9±° 9±°9± ³$901332673#".333#5##Ö;U(0; $<4‡X}eCPKþ‡i„B" ‡@wý¥[ýqчVýª<ÿˆ#» ›² +° 3²+°3°/´++² +³@ +°2°/° Ö±é³ +´+°± +´<+³ +´+°/´+³ +´+±+±° 9°°9° °9± ³ $901333#5##332673#".7#!#53533#320]vaþ·YY]\\´öÏ1Mû+4^rFxxF| ê q² +±é²+´  +±é´  +°3´7+°2°/° Ö°2±é±22² +³@ +²  +³@  +°±+±é±+±°901%4+3267#!#53533#32[˜˜)2[UFþù>>THHvph™N›* CS~FHHFKLP^Ù e²+²+±é´ +±é°/°Ö±é°2°±+±é°2±+±° 9°±99±±99°± 99°°901654&+327'7+#!2ÞKCÂÂ62L$0å]-lu<:2°!6a@TM;lhys7U^po¸o@2ƒ?2CNþïæO^š„P996²+²+±é°´ +°/°Ö±é°±+±é± +013#!53!­]Œ]þtÙ`²<cu7²+²+±é² +³@ +°/°Ö±é°±+±é± +01353##<ÓTÓT iµþ@HÙ W²+² +± é´ +°3´7+°2°/°Ö° 2±é°2² +³@ +³@ +² +³@ +±+013###535!!¼jj]KKéþtíFþY§FìRˆ W² +²+±é´  +°3´ 7+°2°/° Ö°2± é°2² +³@  +³@  +² +³@ +±+015!#3###5R6âDDT>HÄLxFþþFPÿR9ÙW²+²+±é°/±é´ +±é°/°Ö±é°2°±+± é²  +³@  +² +³@ +±+013#!!32+532654&+­]éþt¬\]]\40+55+¨ÙR²fZþýZfR/-'-/<ÿq¡ s² +°3² +±é°/´C+´ +´C+°/° Ö± é°2² +³@  +° ±+´<+² +³@ +±+± °9± °90126=4&#"#!#>32+â)C$*=3T'ÓA9I>YLF079.[Vd L¹0'IFÏBMÿy„Ù\² +±33² +±33°/°Ö°2±é°2°±+´1+±+±±99°±99± µ $901%3#5### 333D@Pþâ]þânEþáxî]îxþáJчDþ¼Dþ¼wbþÌ4þÌ4þž ÿˆ/ _² +±33² +±33°/°Ö°2´<+°2°±+´+±+±²999°°9± µ $901%3#5#%#5# 35373åJF!þþSþþg0þðkÞSÞkþð@¸xØØØØÞÞÞÞþü(ÿ3eå:ž²4+±-é²-4 +³@-1 +°/´ +°%/±&é°;/°Ö±é°1 Ö±0é°±+´+°±!+±é°* Ö±7é±<+±0· %&-4$9°°9°*°99± ° 9°%² 999°&°99°-°7901%#"'53254&'.'332>54&+532654&#"#>32e€v6L80%H!u„X+U;8N%`ClX?_YJW^XŒ~x‹i‚È\x "7*4 - 6% €t64*).TR[.7DMGkwscl-1ÿ3Ç2¾²+±é² +³@ +°&/´++° /± é°3/°2Ö±é° Ö±é°±-+´#+°#±+±é² +³@ +°° Ö±é±4+±2°19±±()99°-µ&+0$9°#±!99±°9±+&°(9° ²#)999° °9°°901732654&+532654&#"#>2#"'53254&'&'v5E6@;+J>01<3fXb¶nAV_S6L80%H!£œ/7-%6L5!$+TMTWIK%&VDX%5*4 - 6&¢PÿynÙS²+°3² +° 3°/°Ö±é° 2°±+´1+±+±± 99°± 99± ³ $901%3#5##33%IP,þ»]]1oþ§JчMþ³ÙþÎ2þ§<ÿˆÚ V²+°3² +° 3°/°Ö´<+° 2°±+´+±+±± 99°± 99± ³ $901%3#5#'#373š@F$áSSÔ`û@¸xââ ÔÔúP™ÙF²+°3²+° 3°/°Ö±é°2°±+°2´+± 22±+±±9901'#375373#%#Ý0]]0Fõxþ“vtþþF)þ¼ÙþÅ*‰MÕþÆRþ³Þ?<ø I²+°3²+° 3°/°Ö´<+°2°±+°2´+± 22±+±±99017'#375373#'#À1SS1FgkÒòg‹F¯)Ø Þ1k%gÉqÒt* ¢Ùa² +°3²+°3´  +°3´7+°2°/° Ö°2± é±22² +³@  +² +³@  +±+± ² 999013#3 ###5353¼``kxþdŸnþˆ]UU]oF‹;þžþ‰Dþ¼)Fj  d²+° 3²+°3´ +°3´7+°2°/°Ö°2´<+±22² +³@ +² +³@ +±+±² 99901533#73 #%##5FSGGÞkþð0gþþS<Þ..FjÞþüþøØØ˜F>Ù A² +°3²+°3±é° /° Ö± é°2² +³@  +±+± ² 99901#5!3 ##ûçDkxþdŸnþˆ]‡RþÅ;þžþ‰Dþ¼ˆ D² +°3²+°3±é° /° Ö´ <+°2² +³@  +±+± ² 99901#5!73 #%#̸ Þkþð0gþþSÀLÞÞþüþøØØPÿyÄÙa² +°3² +°3´  +± é² +³@ +°/° Ö±é° 2°±+° 2±é³+´1+±+± ±9901%3#5#!#3!3CPQþ‹^]v^JчLþ´ÙþÅ;<ÿˆ a² +°3² +°3´  +± é² +³@ +°/° Ö±é° 2°±+° 2±é³+´+±+± ±9901%3#5#5##3353Þ32+/)C$*=3TùT¡A9I>YLF079.[VdÀþ@ þû0'IFÏBM(ÿéå2?Œ²+°/3±é°2²+± é´8 +±é°@/°Ö± é²  +³@  +° ±+±=é°=±5+±é±A+±=±99°5µ/1$9°± %99±°19°8¶ )*3$901"&54>3"327.54>322>5#"'7654&#"[…®#KŠ^~{mm 1:1JD_cz  J-T741?Ls6/%+?ÆœP‹yFR¡Œ…¦0ƒHZ…B u¼i (!*wK·nT-fK8yÿéh%.|²+°"3± é°2²+±é´* +±é°//°Ö± é° ±+±-é°-±(+±é±0+±-´ $9°(±$99°²"999±* ¶ &$901"&5463"3263&54632327#"'7654#"vtŽ}KiFL ?[4AS< ;: KA6.-):7$“ˆxŸM^fuaDegjeOGC$&Dh+hvA9d(ÿ3å,z²+±é² +³@ +°/´+°-/°Ö±"é°"± +´+°±(+±)é° Ö±é±.+± "µ %$9°°+9±°9°²99901#"'53254&'.54>32#.#"32673ÉL80%H!Hm:$ 0GyLî+_^Wj{€mZ`` é5o*4 - 6&CUlL"2bjO4îNN¢Œ‰¡ejþò$ÿ3Ü'²+±é² +³@ +°/´+°(/°Ö±é°± +´+°±"+°2±#é°2±)+± µ  $9°°&9±#"±$99±°9°²99901#"'53254&'.54632#.#"3273bL80%H#Xfj[mT@4DMNEkT\N7o*4 - 6&‘q‚œb]7;ob]j~Vh $ÿyZÙ M²+±é° 2² +³@ +° /°Ö±é² +³@ +³+´1+² +³@ +± +01%3#5##5!#kCPPð<ïJч‡RRÿˆˆ M²+±é° 2² +³@ +° /°Ö±é² +³@ +³+´+² +³@ +± +0173#5##5!#ø32'Y8?R01f#TvZj~PN3*$+: " c0L0# .MSW4K%iV`‰xU>9A-'!%+m€&=0G"(ÿ;kõ <¡²+±é°0 Ö±7é²70 +³@74 +°*/°3±<é°2°=/°-Ö´91+°9±)+±é°4 Ö´31+°±"+´!+°!±+°2±é±>+±49°09±3)± 299±"° 9°!²999±<±-99901.#"#>3 !32673#5.=.54632#4&"3ÿ &C-Vu_ 3>Z4,ýè{jW^_(ØHAg>)fgM?7AP.C0Ò!-9"f[ :17'þ›Œ¢MOá ¯±:Ne\.uSN];7 4*6Bÿ;•/6β+° 3±é² +³@ +²'+±4é°4° Ö´+² +³@ +´# ' +°3´#++°02°7/°Ö´ +° ±+°$2±é°02°± +´ +° ±1+±.é±8+± ±99°±99° °69° ²'4999°1°9°.°9±±99±#°901%3273#5.'.54632#&#";>32%!4&#"01f#TbJH[lPN3*$+: " c0L0# þ€'X9?Rê4K%iL^ °° †nU>9A-'!%+m€&=0G"DMSWP®Ù!²+²+°/°Ö±é±é±+01#®^Ùý'Ùÿÿ„„#{¨Šÿÿ óº#{ÔÿÞªPÿRÙa²+²+°3°/± é´ +±é°/°Ö±é°2°± +±é²  +³@  +±+± °9°°9±°9012+5326=4&+#33«\]]\40+55+ú]]kxþdwfZ¥ZfR/-É-/þÛÙþÅ;þž<ÿqØ p²+°3²+° 3°/´C+´  +´7+°/°Ö´<+°2°±+´<+² +³@ +±+±° 9°° 9± ° 901%4&+#37372+5265gC)lSSÞkþðMLYYL)CY70À ÞÞþüMBzBMI07ÿy–Ùh² +´ 6+² +³@  +²+²+±é°/°Ö±é°±+±é³+´1+±+±°9± ±99°°901!#52>=!3#5#ñþú,F.%ÂGPU‡RDj„aV-^"FPvgG©ýqчÿˆò ]²+±é² +³@ +²+²+± é°/°Ö´ <+° 2° ±+±é³+´+±+±±9901!3#5##0#52>5bS=FK¬ !2  þ4¸xÀ0)CXDG.PAAqQDPÿRÙN²+²+° 3°/±é´ +±é°/°Ö±é°2°±+°2± é² +³@ +±+01!!#3!3+5326#þ‹^]v^^\40+5Lþ´ÙþÅ;ý9ZfR/<ÿqÞ T²+°3²+° 3°/´C+´  +± é°/°Ö±é° 2°±+° 2±é² +³@ +±+0126=##3353+*AúTTúTYLF07Èé ××ýôBMPÿyÈÙa²+°3²+°3´ +±é² +³@ +°/°Ö±é°2°±+°2± é³ +´ 1+±+±± 9901!#3!33#5#$þŠ^]w]GPTLþ´ÙþÅ;ýqч<ÿˆ a²+° 3²+°3´  +±é²  +³@ +°/°Ö±é°2°± +°2±é³  +´+±+± ±990133533#5#5##HÄLxF¼³mG'LFÿR‚ÙO²+° 3²+²+°3°/±é°/°Ö´ #+² +³@ +±+± ° 9±±9901! #33+5326ÇÈqòq»¼oöt[40+50þÐvcþâþþŠFhR/ ÿqÒ O²+° 3²+²+° 3°/´C+°/°Ö± é² +³@ +±+± ° 9±± 990125'#373+lƒ…_¹¯_~~^°µYL(FFÉÉ ¾¾ýþñBM‚Ù@²+°3² +°3´  +°3´ 7+°2°/±+± °9± °901## ##5333-–ësÇÈqëš—Øq»¼oÜœHþ¬0þÐTH=þâþÃ Ò @²+°3² +°3´  +°3´ 7+°2°/±+± °9± °901##'#7#53'373œj aƒ…_¦i]_~~^“8HðÉÉðHÔ¾¾Ô(ÿéeå1†² +±é² +³@ +²+±!é²! +³@! +´'*  +±'é°2/°Ö±-é° Ö±$é°-±+±é° Ö±é±3+±$µ ()$9±*°9°'°9°!°901%2>=3#".547&54632#.#";#"?;U+X%8NK)Ag>(‚i‹x~ŒX^WJY_?XlC`%N;46<\7# .=9}1-lcswkGMD7.[RT.)*ÿéÇ#¡²+±!é²! +³@! +² +±é² +³@ +´ +±é°$/° Ö±é² +³@ +°° Ö±é°/±é°±+±é° Ö±é±%+± °9±³ !$9±!°9°°9°° 901%3#"&547&5462#&#";#"326oXËcuVAn¶bXf3<10>J+;@6E4œ³ZLV&%KIWTMT+$!5L6%-7ÿROÙU² +´ 6+²+±é°/±é° /°Ö±é°±+±é² +³@ +±!+±°9± °901!#52>=!+53265ñþú,F.%Â^\40+5‡RDj„aV-^"FPvgG©ý'R\R/-ÿqµ H²+±é²+± é°/´C+°/°Ö´ <+° ± +±é²  +³@  +±+01!+5265##52>5bSYL47¬ !2  ýôBMI(Àb%ÿÿ(ÿÅèå4ÿÿÿ&óTÿÿšÙ:ÿÿ Ç ZÿPnÙ0²+°3²+° 3°/°Ö±é°2±+±±99013#37'373#'#­]]±ru2Ko}hu(§z|þ»Ùþβ](K}U §þ€M<Ú 3²+° 3²+°3°/°Ö´<+°2±+±±99017'373#'#'#qXu.`Z`u ljáS ÔqH.YOlþîââ PÿyÃÙ S²+± 33²+±é² +³@ +° /°Ö±é°± +±é³  +´1+±+±±9901!#!3#50##þ‹^1BPP‡ýyÙýqч<ÿy  S² +±33²+± é² +³@  +° /° Ö± é° ±+±é³+´1+±+± ±9901!3#50###<¡CPGùT þ>чÀþ@2ÿy_Ù[²+° 3²+´ +±é² +³@ +°/°Ö±é°2°± +±é³ +´1+±+±±9901323#5#4+#3èMXCPPLä]]Æ\Aßч;9þŒÙ2ÿyñ ]² +±33²+´  +±é²  +³@  +°/° Ö± é°2° ±+±é³+´1+±+± ±9901%3#50#54&+#332®CPG"šTT—;VJчÅ÷ ÉB9Fÿ×ÐÌ?² +±é°/°Ö±é°±+±é±+±° 9°° 9± ± 9901%2653'#"&53YrO_W;[ ˆ1¡z^&:Ipvý¬]De$$œžžþc#6"(FyÖJ²+°/´6+° /±é° /°Ö±é°2°±+±é°2±!+±°9± °9012#54.#"!!#4>aRp=_'O=1D&Ñþ/_&>eÖ-XlIRQ:LA)LE8]–œ;ZR4(ÿÿ¼Ö&[²+°/°3´%*+°2°/±é°'/° Ö±#é°#±&+°2±é°2²& +³@ +±(+±&#°9±%° 901%##5#".54>3234&#";¼k_×?_1:kLBd9# nË^K5J*»´†‡‡/@U8:MZ5$*:4þàTSq=RR_ #K:rO_ 8mÙ+VmL°^8HC"pvQR/F^<+FÿöyÝR² +±é²+´  +´6+° /°Ö±é°2°±+±é°2±!+±° 9±±9901%26=3".53!!YsN_%=dDSr=_Ñþ/ %:LovQQ9XR6!+XlL¬˜]· 6"*2Ûß.š²+° 3²++±é± À/±é°2² +³@ +´"%+ +±"é°//°Ö±é°2°°" Ö±&é°&/±"é²"& +³@"$ +°±+´+³ +´ <+±0+±²+999±"±990132#4&'!#5332>54.#"3!54>32(4+{…S!$þYZZ ;[O:,GF"Y¼þåEƒ]E}YÕ:hH=! ƒ4¸7,BvI=Y-siQLud65}F Ñ B²+± é°/±é² +³@ +° /°Ö± é°2²  +³@  +³@  +± +01%#33#@ú`úúOOÑéMþ´FyÙC²+±é²+±é°/°Ö±é°±+±é°2±+±°9±°901#54.'"!!4>32y_'O=9I& ÕýÍ&>eDRp=ŸŒ9KBAM9þ¹WŸ;ZR4-WlFÿþØ 3_²+°$3±é°/°23±é°02°/±+é°4/°%Ö±$é°$±+±é°±+°2± é°/2±5+±°9±°901"2=#".546;54&'#"#4>;23#ÎE.4Y™_5pQ8Q-Wx´?U³,1_.KL)¿i„66p8^U8‰›¢%AC''>7$iBAE:-ýþ :U+q\KNAÿö|ÎD²+±é² +°3±é°2°/°Ö±é°±+° 2±é° 2±+±°901%"&=4673533#2675#"mjƒ€m\c`îEH–AEÃ[po^~\oÀÀKþ~:Où=Qk‰FxÜQ² +² +´ +±é² +³@ +°/° Ö± é°2° ±+±é±+± °9±°9014.#"#3>32#%I8Jg ^b y/Ts>^8MA45%:þâÜÖ"-ZlKGF^Ì5²+´6+² +³@ +°/°Ö±é² +³@ +±+01333F_¹Ìý’^FÿôÓY²+² +±é²+°3±é² +³@ +°/°Ö±é°2°±+±é°±+±é±+±° 901%2>=3#".=##33$#-+_ðTp9k__Ë %II,`KàáþÆ,YjL‘þ@ÓÃá9KA #ÿüú".r²+±,é²+±é° 2²+´&+°2°//°Ö´)<+°)±#+±é±0+±)°9°#³ $9°±99±&,±99±°9013!2.#'#"&54>7'"=4&#"26v\Ÿ^$ A~'‰³Á8fC4Qþkpš£k`FyÝS²+°/±é² +³@ +² +³@ +°/°Ö±é°±+°2±é±+±°9±°901%".532>=3#5dTr>^$G2.C) _a \Ÿ,XmLÿ)4C'!">.)LýØ×$ÿ¶4Õ%°/±é°/° Ö´ +±+±°9012&'"#.'%6õ,%'þñ€ /þ†t-Õg.þ¸°£0" ª¸82ÿÖOØ/8r²+±5é²+°0/±!é°/± é°9/°Ö±é° Ö±2é°±)+± é±:+±)· &057$9±5±99°0²&999±!±9901"'54632&'"&54672>=4."327&KD[_otŽeV I/(9OFA:$55?U)2#š5 2*WG=BXЇo?c°< ( "''K*>C+ (¢Y,+D%þ0#9A|ØK²+±é° /±é°/°Ö±é°±+±é² +³@ +±+±°9± ±990123#4&'"#546.jƒaÀ=QCK_‚Øq\þ@K@F3&'7672''"jý¾+;?)/<  ?†BwC,@<+XA‚ 13/ `µy^,G  9=C5/2f€· †(L_><ÿöÙÙI²+±é²+°3´ 6+°/°Ö±é°±+± é²  +³@  +±+±°901%2>53#".53\8J%Çj>qSRp=_NK BL7©]þµMmV*-XlI¨þXvo-ÿô&Ø4²+±é² +³@ +°/±é°$/±-é²$- +³@$( +°5/° Ö± é°( Ö±'é° ±+±é°! Ö±3é±6+±( ±99±!'²-999°°9±°9°°9°$°3901#"&5332>54.+53254&#"#4>32»)B’ny€](2 )##!5-èç…X45G`.[?5T2! ‚cOds{S!35!-= Ms:35,77"&31y ÿ÷×ÙR²+±é²+´6+°/°Ö± é² +³@ +° ±+±é±+± ±99±±9901".'#53326=3¦o=šù&9%sN_< 'UmQJ^þX!6")ov••IjY(ÿô,ã “²+±é²+°!/° Ö± é° ±+±é±"+°6ºò—Ál+ °.°À±ù°À³+³ +² Š Š#9° 9´ .....µ ......°@± °9±±9901467'5&'"2>=3#".5(nRŒ¦`$ôXK*=)`Žq;_8%Ms”TaSþ[R[ F2@FYŠ%7A3FyÙ=²+±é² +³@ +°2°/°Ö±é°±+±é±+±°901#4.'"#4>32y_'O=9I% ^&>eDRp=Ÿþb9KBAL:þcž;ZR4-WlBÿòGØ#’²+°/±é°$/°Ö±é°± +±é±%+°6ºïÂ"+ °.°À±ù° À° ³ +³ +²  Š Š#9°9´ .....µ ......°@± °9±°901%5>=4.'"547632G-JT-—þnƒŒ61!GW_@Ks>c5$ ‚32t_,+'a^&>eDRp=ŸþbBV0 þZ¥æ*+;ZR4-Wl-Êß9²+°3²4+±é± À/±"é°2²" +³@" +´ +4 +± é°:/°Ö°-2±é°!2´ 1+°±+´+³+´<+±;+± °,9±µ&+4$9±+"°9° ±-99°°901674.#" 632#4&'!#5332654.#&'54>32 )*HL+0L, _¢(4+{…S!$þYZZDk>gI)n)>iB2K?:UH?\."3A5]thH=! ƒ4¸793'4Y#GP<(%7FÄÙR²+± é°/±é² +³@ +°2°/°Ö±é°±+±é°2² +³@ +± +±°9013##4.'"#4>32yKN\'O=9I% ^&>eDRp=Ÿ¥Q¨9KBAL:þcž;ZR4-WlFÿôyÌ=² +±é² +³@ +°2°/°Ö±é°±+±é±+±° 901%2653#"&53YrO_:sT¡z^$GIpvþbFh\0œžžþc(3E)AÎÙ X²+°/´6+°/±é°!/°Ö±é°±+°2±é² +³@ +±"+±°9±°9°°901%".=332>=33#5_Tr>^ &:&.C) _Z¼ \Ÿ,XmLed !9)!">.)üý†^×$-ÿôgØ.²#+±,é²,# +³@,) +°/± é² +³@ +°//°Ö±é°) Ö±*é°±+± é° Ö±é±0+°6ºíjÂÂ+ °°À± ù°ÀºñÓÁ—+ ±°°À±±ù°À±°³+ºïŽÂ&+ ³+±³+ºîÇÂ\+ °³+±³+³+·........·........°@±² #,999±,° 901%4.'4632#.'"#".53326 0M^`O6‘kHl4[VRJZ2Oa`O2˜qFnB+YÆHiÂ(3'O9\i(5D&C>75$0)O7\z 2D> Ÿ?FyÙ:²+±é² +³@ +°/°Ö±é°±+±é±+±°901#54.'"#4>32y_'O=9I% ^&>eDRp=Ÿyx9KBAL:þcž;ZR4-Wl<ÿô9Ø(3²+±é² +³@ +°"/´,C+°2/±é°4/°Ö±*é°*° Ö±é°/±é°*±+± é°. Ö±é±5+±°%9±*°'9°.´"$$9°° 9±"² $%999°,± '99°2±99014>32#"&5332>54.#"'67&62654.#"O.bFêX)FsqŒ]WI)-"#/$h#jJU[RxP1;!: 9<$¸e% kNb}w`?M6#%95A ž`@79(3FYÓ8²+°/±é² +³@ +°/°Ö±é°2² +³@ +± +0133##F_´´_ÓøPþu-çÕ'-m°/°3±'é°(2²' +³@ +°/°-3± é°2²  +³@ +°./°Ö±%é°%±+± 22±é±(22°±*+±é±/+±'±9901%.54>7532#3674&'\<^E42D]=^;\L8!9@H4^,=/"Ð^Ëob0,?tIGp>,77 (?vL54.ÚÀ–™¼¼›–¾þ­ =E2"†n)OM0!3C=e¤ÍÏš®ÌÌz '?pI~˜5;5#"#".533'".546;32C/,..--þYm")fl…Ac7# ]§-48#ih_.j~0D þ’?+hG’þG_{$4-mp ;)X=ÙpbÿÿOC§òb5é›Ó 2°/´+° /°Ö±é°´ +° /± +± °90153'65=^35mfP9G"NL­Î °/´+°/°Ö´+±+0173X7iL‚‚A2Ú7²+°/´+°/°Ö´ +±+± °9±± 9901>32327#"&#" 6=,0../8%x"0705ÿÿPçäC L1{²+´+² +³@ +²+° /´+² +³@ +°/°Ö´+°± +´+°±+´+±+± ±99°° 9±°9014>32#"533254#"# #E/:C4*U7%Hn721?/,3a)7e*=3Ä-²+°/´+°/°Ö´+±+±°901'?3! TJQÐ=2TP7Aÿö !u²+° 3±é°2²+±33°"/°Ö±é°±+±é°±+±é°´&+°/±#+±°9°° 9°° 9±±99°± 9901%2653#5#"'#"5332>53(E;XOT4t=c¡X$8()X*B_ZýõI$0[[®hþµ?@ A.1þ«9<Fÿ8ëb²+´ ++² +³@ +²+²+± é°/°Ö±é° 2´&+°±+±é° 2±+±°9± ±9901%#54.#"!!#3632ëX &ŠKþµXO323##4'"#3” !BLddXNGEXS¼   D>þª>È6\_Kþß AÿõêÑZ²+² +±é°/´++°/°Ö±é°2°±+±é°´&+°/±+±° 9±²99901%2=3#5#".57!!ŠWO:k$9% XQþ¯/A«aþ³JU'!1îBÕDG#ÿ8;p² +²+´++°/´ +°/´7+°/°Ö±é°±+± 22´ <+²  +³@  +±+±±99±±99° ° 9017"&54632533#2674&#"ìWrqf7GRc¸1ÖHC:CACEA–muœ+6ýg;LTitKVtrFÿ‡MÑ X²+± é² +³@ +° /´++² +³@ +° /°Ö± é°2° ±+´&+² +³@ +± +01%'5#33#&L”V±±JÃwÑþBþ¹Aÿ8æ]²+² +±é°/´+°/°Ö±é´ &+°±+±é±+±° 9°±99±° 9° ±9901"!!3632#4.#ŠIþ_O323#2=#"aEBHYB=>:(? VNT%B^+)(¦PH $©G^JC>XA79&7.ýùÔA,"$81P<£e@4(I#ÿý9Þb²+´7+²+²+°3´++° 2°/°Ö±é°±+°2± é°2²  +³@ +± +±°9±°90146;533##".2>=#"#mbŒYbb}_1O. à'4 z… h—ÒÒDëfz%9KE¨"FQ;‘½ÆFÿ8ìÌU²+² +±é² +³@ +² +³@  +°/°Ö±é° 2°±+±é±+±° 9± ° 901"#3632#4&'*-XX>]dOX4Ç"H3þ”þÿGhaþ·I?>Fÿ8 -²+°/´+°/°Ö±é² +³@ +±+01#3ºX9ÔýeFÿ8ÚÉy²+² +±é² +³@  +²+°3±é² +³@ +°/°Ö±é°2°±+±é°±+±é°´&+°/±+±° 9±°901%253#5#".5'##33øŠXO9l1D$–XXï+?«"ýóJV%D7-àý}‘½þ¾BF#ÿøì$²+´#7+°/´++° 2°´+°%/°Ö± é° ±+´&+°±+±é² +³@ +±&+±² #999°³$9°°9±#± 9901#"&54637&'4734.#"32"Óe}~P=U3;^’+ZJBIyÄ\LþêšvuŽ*C=64(2@D»8I1ce[mFÿ8íÑJ² +±é² +³@ +²+°/°Ö±é°± +°2±é±+± ° 9± ° 901%2>53#"&'3 *-XX=_fKXG"H3ý, Eia ýô~FìÌM²+°3² +±é² +³@  +°/°Ö±é° 2°±+±é±+±° 9± ° 901"#3632#4&'*-XX>]dOX4Ç"H3þäÌþÿGhaþ·I?>#ÿòÓà&4v²+²+´*7+²#+°5/°Ö±'é°'± +±&é²& +³@& +°&±+°/2´&+±6+±& ±"99°· #*2$9±#*³ 2$9012#5#"&54>74.'47332>54&#"þŽ  KVM D9dx1HJ>@D)H‚EF*: H9=R™- ƒ_þì?3œv4bH;0 -. þPUs.J8Un}Aÿ8.W²+²+°3± é° /´+°/°Ö±é°2°± +±é² +³@ +±+± °9± °90123#4'"#3>8)=d¹QwXRB*)ýç?2\Šþà W$,ûÛ`²+´7+²+°/°Ö´%+°±+± é°2±+±°9°³ $9° °9±° 9°² 99901747'7670!%4&',¡@1>fh1'•³þ:eb ()#ÖØ1@2{T0'žÆþÿF]×,ITƒ=AÿöÍè-ƒ²+°3²+±(é²#+° /´ ++°./°"Ö±%é°%±+´<+°±-+°2±é±/+±%±(99°°9°-°,9°²  999±(°9± #²999014.54>;#"#5#"&'332>7u+3+-,MT6**T) !!AQX$*,: ´6&@&$D%&+9þO8G6™þ-+2*ÿìÿ8³ -²+° /±é°/°Ö± é±+± °9°°9012>53#"'7& X9I*{ !ýâ^X KFÿöÎéf²+² +´C+²+°/´+°/° Ö±é² +³@ +°±+±é°´1+°/±+±° 9±°901%273#5#"&54>;"ÿ_XPWOAQ%M3A_@1?‡FýôS]F4¼9B-=7>#3(3.+53(E;XOT4t=c¡X(()X*B_Zý,$0[[®hþµ%) A.1þ«9<&ÿ7Ï#5†²+±$é°/´ +°6/°Ö±'é° Ö± é°'±+´-+²- +³@- +°-±3+±é±7+±'°9° ±&99°°*9°-² $999°3°9±$ ³-$901;#"54>54.54>">54&ïA].Ÿ7*k‚Æ…%+%!0/!))4 9/%%(9.GB#šŒ," "?H0#2-$+L4.G) JB@!7(*@)79R&ERAèf²+° 3´++°2² +²+±é°/° Ö± é´ &+° ±+±é±+± ³$9°±99±² 9990172>4&#"#36323#ý GD:4ŠXOÌ_²+±é² +³@ +²+° /´+°/°Ö±é°± +°2±é² +³@ +±+± °9±° 901%2>533#"&'3*-XV®=_fKXG"H3Úü¤8 EiaGþ¹~Aÿó8&x²+°3²+±é²"+°3²+±é°'/°!Ö±$é°$±+±é°° Ö±é°/±é°±+±é±(+±$°9±°9±±9901%253632#4.#"#5#"&53‰U.þ¹&/ ±þäLXpaHþÚSTAÿ8æH²+²+² +±é°/°Ö±é´&+°±+±é±+±° 9±°901"#3632#4.#ŠXO5#"&"32654.#wj\;Q "1J/0<'UA1)89Wiuå5W.-8V-/sœJ?þ:)>*/ ;),.;1-D–?`f;V*ai7R+F /²+´++²+°/°Ö±é² +³@ +±+013#›~Ó þ6B Aÿ88Ó)~²+²+±é² +³@ +²"+²+±é² +³@ +°*/°!Ö±$é°$±+±é° ֱ鰱+±é±++±$°9±°9±±9901%2673632#4.#"##"&53M;T32'"254&umQ15þËVddQ E;%HG+ä4LE:@g}A¨BLLBFA47kvU_Hf±V^#ÿô %J²+´++² +´++°&/°Ö±é°±!+±é±'+±!± 99±±9901".54>32"32>54.+NL. 1C>!m†"1E; 1/]<2/01 9pM>b;&wDh:$ Û+U9ka-U98S+*ÿ8oÕ#+2ª²+°3´"++°%2²" +³@ +²" +³@" +°#/°$3´/++° 2°0/´++°3/°Ö´,<+³ ,+´&+°/´ &+°,±+±"/22±é± $22°±)+´<+±4+±,°9±#"°9±0/°901"&54>;32##5#".533332654#'35"Ia!=I/>=Yl*:7-W/(9/!N W%DDã5638±PC*; ߆i<_9%ÇÇ7#Jnþ’lS¯–-%!Fÿø ÓJ²+± é°2° ´++²  +³@  +°/°Ö±é°±+°2±é±+±°901".53326=33#5Ø+> V%*GHVO£>-# `ýÈ-+KD’þàBR$Z¾3²+´+°/´+°/°Ö°2±é°2±é± +015353Zddd¢eeþ^dd ¦&*° /´+°/°Ö´ +±+± ± 990127"':'0AU+Y  "<ÁÙ(‚²+±é°/°'3´+°%2² +³@ +°/±#33´+°!2°)/°Ö±é°±+± 22±é± $22² +³@' +°"2² +³@ +°2±*+±°901%#5#535#5354.'"#54>323#3#o_\\\\ #K:rO_ 8mLSq=RRRRà6968HC"pvQR/F^<++VmL696ÿÿ ÿPÿÄ&ÛƒÛÿÿpÿÔÿÄ'Ûÿg&Û±ƒ&Ûô'Û„ÿƒÛ„ÿÿxÿÏÿÄ&×Þ½ÿÿ€ÿÒÿÄ&ßÂ'Û‚ÿŠÛ‚ ÿ}PÿÄ*°/´7+´7+°/°Ö´+´+013# GGÿœ•¼²+°/°Ö±é±é±+013>Wd üà€ÆÇ*°/´7+´7+°/°Ö´+´+013#GGÇGÿÿF€ÇèýÇÿÿP¸ ÿÿŠ€ÑÇèÿ ÿÿ}FÿÄ*°/´7+´7+°/°Ö´+´+013#ÿGGþØLz^€ÿÿ¾ÿ¢ÿÄß:FX3² +°3°/° Ö± é° ±+±é±+± ³$901##5467'36=3>Q;”fä&,WP<”fäcW¿D‚'ÒE 'W/H†(Òþ»Je–:6XA²+±é° 2²+±é°/°Ö± é²  +³@  +² +³@ +°2±+014&+5323!5!•ao‹‘Qv>Jþ[sCVL(CJ)þÒLL±X²+±33² +± é°/±+°6ºÀ‘÷„+ °.°À±ù°À°³+³+² Š Š#9°9³....µ......°@± °901%#73'.#52#B¯uÏQ3G36TC82X¬¬Ë§2C L,V9þ…&X:²+²+°3±é°/°Ö±é² +³@ +² +³@ +± +01#!5!ÌWþ±ù ýô LL?:X :² +°3² +± é°/° Ö° 2±é°±+±é±+± ° 901#.'#53@{lWAZùWXamþ†tQ: Lý¨wþ‰>•X²+°/°Ö±é±é±+0133>WXý¨'(X:²+²+°3±é°/°Ö±é² +³@ +² +³@ +± +01##5!ÕWW ýô LL?;X /²+° 3²+±é°/°Ö±é°± +± é±+014&+#!2#äaJ£W\ŸWt=[ýôX}aþ†=:XM²+±é²+±é°2°/°Ö±é°±+±é±+±² 999±° 9°° 901%26=4&#"5632#"&53?Y Rzdœ[ƒ„ZzþŒ5c:‘X!°/´+°/°Ö±é±é±+013:WWXþé#&ÿ8ÚX ² +± é° /°Ö±é± +012#4&+5ài‘WaJ²X…Yý¾7>=!53!!'.2W%,4 þ[W¥¿5V+, *bD?Rn(*@5á•?;X 0²+± é² +±é°/°Ö± é° ±+±é±+012!4&+w¬þ¥xT‚X_þ†Xýô+@Uþ@0:Xg²+±33±é²+±33± é°/°Ö±é² +³@ +±+°6º?øö+ °.°.°±ù°±ù³....°@014&+##532!53ãuWA:X:Nç{¨þÖÓwATýô L`þ‰L>ÿ8•X°/°Ö±é±é±+013>WÈ üà3FX 6²+±é² +±é° /°Ö±é² +³@ +³@ +± +012!534&#GqŽþí¼RVX€^þ†L(>Z=9X :²+±é²+±é°/°Ö±é°±+± é±+±±9901 "&5!24&+3265¨Ú‘t‡WWT£WPL[ƒ[zvhœrJNþØ>ZY?$ÿÉX°/° Ö±é±+°6ºßÂ+ °°À±ù°ÀºÁŽñù+ °°À±ù°À±°³+³+·........·........°@01737>737ÍxYs# W +C:þÖCþ  &!Xþ¢5:9'LO9ÿ8 X9²+±é° /±é°/° Ö±é² +³@ +°±+±é±+014&+;#"=32#´N]y,@"(½×~}WtTD1L“Òský¾?X*H² +±é²+±*é´# * +±#é°+/°)Ö° 2±é°±+±é±,+±±!"99012+532>=4.+;'.=ôAj=*(GqAµ¯753å [UWÄc¥#W¾Kcþ/ê6þü +“3X²+±é°/°Ö±é±+01!5!3>=3 f<«þ&Fþ²d¥0-W¾@jþóL þý4'“>ÿ8&XE²+±é°/±é°/°Ö°2±é°± +±é±+± ±99±±9901#53>7!5!#&l|>7$5#þoèþoWÿlbL)L®ýŽr%ïX !²+² +± é° /°Ö±é± +012#4&+5ôu†WO\ÈXuiþ†tNJL<ÐXG²+± é° /±é°/°Ö±é°±+±é°±+±é±+±° 9°°9016753+;2653#.53öbWpFd x>WB†W¦{R}¤W,YÏÓG^8\nLRþ©X¦¤ZWþÔ#{XA²+°3±é² +°3±é°/° Ö±é²  +³@  +°±+±é±+014+#5265#5!2#$«ityMI<y‚Wt˜þÔukLDM/Lqmþ†>jX&²+°3°/°Ö±é°±+±é± +01!3!3XþÔXXý¨Xý¨<_X#²+°/°Ö±é°±+±é± +013354.'33##:D! U ;«Ü!,‰jÍWHV,,Ÿ54'¾*Œ½ S*IC25^M2Z,‰MuGÿ¸«4²+±é°/±é°/°Ö±é² +³@ +³@ +± +01)5!5!5!ýžþÜ‚ZùXÿ¸ÿaY² +°3± é°2²+°/´)+° /°Ö±é² +³@ +±!+±³$9±°9± °901#"&547'!5!73#".5'632 tþm¦þûM ¯8#&'f ²Z–-þ=Z #}ÿ¸ÿa [² +°3± é±22²+°/´)+°!/°Ö±é² +³@ +±"+±³$9±°9± °901#"&547'!537373#".5'632 tþmÔb(˜þûM ¯9#,&'f 5²Zšš–-þ=Z#}kÿqÙ­L² +± é°/±é°/±é°/°Ö´+°± +´ +² +³@ +³@  +±+01#532!5!54.#ñyyB\oFþ’("]eSé 1)þ×Zy83kÙ­7²+±é°/±é°/° Ö´+²  +³@  +³@  +±+012!5!54.#¯\oFþ’("]e­ 1)þ×Zy83mÿ»…­`²+±é° /°3´6+°/°Ö´+°±+´+°± +± é±+±°9°° 9± ³$901".5463##'2654&#"2>+_UdYƒ IP&44*&>9'X<_„þ”,Ee{OI14XY+6Ld« B²+±é° /±é°/°Ö±é°±+± é±+±±99± ± 9901!"&54632"3264@bz|`ay{1bNQ43J~WZ|}Y[zQK/2KHb±ÿV[s ° /°Ö´ +´ +±+01.54632'K"2X B:€_2@(Ï/}¢ÿ¸O"S²+±33±é°/° Ö´+²  +³@  +°± +´+±+± °9°° 9±° 901!#'#'!53547O$JzþÐøÃÖppssZ½Ã\rÁÿ¸ÿ_ª %²+° 3±é°2²+²+° /±+01'!5!73#ª¯_þ´þðJô.¦Dš¡Z–,þ>Z_ÿ¸ÿ_ª "²+±é°2²+²+° /± +01'!5!73ª¯_þ´þðJôš¡Z–,þ>ÿ¸À²+±é°/± +±±9901%'!5!5Àjþie£O`Z·Áÿ²ÿSõ #/;Tþ²M+´FB+²<+±0é°/´+°P/°63´D6+°/°3´ +°2°*/´$+°U/°AÖ´9+°9±+´$+°±3+´R+³3 +°-3´$+°'2°R±N+±Fé³FN+´!$+°!/´$+±V+± ´ 06<$9±R3´$*P$9±N±99±F°M9±°N9±0<°J9°F°I9°Pµ3A9HKR$9012#"&5462#"&54632#"&546'2#"&5462654&#"".546335'##Þ" ! K" ! Û" ! K" ! h&44*&>9.2>*_Ud†£j¸[ƒ I> ! "² ! " ! "Œ ! "ýNI14XY+6LO)V;_„þ°·Á?ObD”,Ee{aÿ(%Û%°/±é°/°Ö´&+±+±° 901#654#"%632×Z\@Dt€aþþE\I;@Ø•WHO]qZU´;I@nÿ¸p˜²+±é°/±+01)5!7pýHfþUJ³ZûCýÍkÿv…« :²+± é°/° 3±é° /°Ö´&+² +³@ +³@ +± +01)##5!5#…þ‘=S½ØOŸ^ŠÝXþ¯ùùkþÔp²+°/±+01?ks’(þã<žeýô#c7ÿ¸ÿþ±¨&3ž²+±é²+±é°'/´7+³'+±é°4/°Ö´*+²* +³@ +°*±2+´%+°%±+´ +±5+±*°9°2²999±%²999±±%99°µ */2$9°'°9012632#"&'!5!&546254&#"">545):5-AASXDfmþÉ(Jj7&$ "&/.(# ¨#xOaI8UZ-_hZþ¨Y+M Y :1 0#`n§ÿ2±¨*8в+±é°+/´7+³++±#é°9/°Ö´.+°.±6+´)+°)± +´ +±:+±.°9°6³$9± )²999±±99°#´ .36$9°+°9012632#"''7.5462>54&#"">54&5):5-AAWTS' "dHšDc@( '7&$ !œ&/.(# *¨#xO_J.†2´iS]eþ¨&+M Y :1 0#`4:ÿ¸¤4²+± é°2° ±é²+°/±+± °9°±9901%#"&'!5%277327¤kF3C$þ€&8,ÜA¼(E,71D1Z)m+þÀ>CKÿ¸@ 1² +± é°/´7+°/°Ö´1+±+±° 901%"&546?!5!'7327SdVF9Å?ýœ >"pA0(F)åOL8F3ýÀZ‘ó!."$ÿ¸@ ˜² +±é°/´7+°/°Ö´1+±+°6ºïö + °°À± ù° À³ +°³+³+² Š Š#9²9°9µ ......µ ......°@±°901#"'!!32654'./;Vd%>  ýœ?Åþé)F(0J""€LO‘Z@3*°$"$þÔ‚"M²+± é²+°/±é°#/°Ö±é±$+±² 999±°9°°9° ³$901!5!&'&54735'#"&'iþ)d‘4²6/¢¢i ¬#% W||W þÔZ)Kx_ SI´Â>O] "=,(,!ÿ¸&« X²+°3´+° 2°/± é°/°Ö´&+² +³@ +°± +´ +±+±°9±°9013"&'#53!'5#ó@ÎàŽFý5AdGþUdïïkÙ`R² +± é²+±é´  +±é°/°Ö´+°±+´ +² +³@ +³@ +±+01#532!5!4654&#{{n\oFþ’(T’R³ 1)þ×Z a Q/ÿ¸…«d²+°3±é°2° /° 3± é°/°Ö±é² +³@ +°° Ö± é² +³@ +³@ +±+± °9±°901!#"'!5!'#5!3…Í/þ\° ÈÁ  Ã;;Z÷ZY÷cÿökëI²+°3´5+°° Ö±é°/°Ö´+±+±° 9°± 99°±9901%"#"&54>732632&\ n69KN(Gþ¯n*i :((/C9E¢e*þlSˆÀJ*+99&ÿ¸t 7²+±é°/±é° 2° /°Ö±é² +³@ +³@ +± +01)5!5!537!ýžþÜ Ç$–!ZùXÉ«ÿ¸ÿa./Œ² +°3±!é°2²+°/´)+°/´&++°0/°)Ö´+²) +³@ +°)° Ö±é² +³@! +±1+±)°9°´ $9°±99±°9±! °901#3#".5'632#"&547'!5!732654./±aD¯8#&'f tþm¦þûMX87.%pOðZ #}Z–-’0 kÿ8Ù­j²+±é°/±é³+±é°/±é°/°Ö°2´+°±+´ +² +³@ +³ +´+°/´+±+01#53#532!5!4654&#¢{{»{{8\oFþ’(T’ÈRRá 1)þ×Z a Q/ÎTŒ£°/´ +°/°Ö´  +° ±+°6°&±.ɱ.ɰ6ºÂvîk+ °°À°°À°³+°³+² Š Š#9²9³....³....°@± ²999±±9901''7'77''7' &%Y(,$"5'=d+jA!5þÔ½ÿ’°/´ +°/° Ö´ +°±+°6°&±.ɱ.ɰ6ºÂvîk+ °À°°À³+°³+² Š Š#9²9³....³....°@± ²999±±990177''7'77m &$Y(+#"5(>~+jA!5,þ÷Oé°/°Ö°2´+°2´+013#3#,####s–ò–õ*à;²+°/´ +°/°Ö´ +±±99±±99°°901/'ÂK7K½ÍÍþü¸ÿÚ0°/´ +°/°Ö´ +±±99±±9901/'šK7KqÍã5ø K°/´ +³ +´+°/°Ö´$+°± +´$+±± 99± ±99012#"&54'2#"&546©.! !n! "!¤ ! ~ ! "õ*à ° /´ +° /°Ö´ +01'7''7'7Œ8!8 8K K7®^_`‚]_Íþü¸ÿÚ °/´  +° /°Ö´ +0177'7!9 8 8K K7ª^_`‚]_Üÿ•ÿµ0°/°3´+°2°/°Ö´+°±+´+013#'3#r##–##K–––}þöšÿÀ0°/´ +°/°Ö´+±±99±±9901/'|KiK@K©L[Ê H°/´+° 2°/°3´+° /°Ö´ +²  +³@ +°2² +³@ +°201535#53#3©HH²IIL"< <" ÿDÒÿ H°/´+° 2°/°3´+° /°Ö´ +²  +³@ +°2² +³@ +°201535#53#3 HH²II¼"< <"ÿOvÿ¾ *°/´+´+° /° Ö´$+´$+012#"&546>" ! B ! "«6{ 0°/±é°/´+°/°Ö±é±° 9±°9012"&546/537ù$•/ƒ++•U y!;9ýÿÍÿÛ 0°/´ +°/±é°/° Ö±é± °9±° 9012#"&467#'7yi.ƒŒ++-$ w";8jvÙ 1²+´+²+´+° /° Ö´$+´$+012#"&546>" ! Ù ! "ÿfqÿÃ$°/´6+´6+°/°Ö±é±é01#53qbbš]jvÙ 1²+´+²+´+° /° Ö´$+´$+012#"&546>" ! Ù ! "ÿOvÿ¾ *°/´+´+° /° Ö´$+´$+012#"&546>" ! B ! " 7xP 5²+´ +°/´+°/° Ö°2´$+°2´$+012#"&5472#"&546).! !7" ! ¦ ! Ì ! "þÔwÿÙ =°/´+°/´ +°/° Ö°2´$+°2´$+± ± 99012#"&54672#"&546?" ! ! "!½ ! "– ! "§7Ú2 #q²+´+°/°3´+° 2°$/° Ö´$+°±+´$+³+´!$+°!/´$+±! ±99±±99±± 99012#"&54632#"&546'2#"&546Þ" ! Û" ! K" ! ¦ ! " ! "Œ ! "¬þÔÕÿÊ !e°/´+°/°3´+°2°"/°Ö´$+³+´$+°± +´$+±±99± ±99±±99014632#"&74632#"&2#"&546¬"! º"! '" ! n! 0"! 0": ! "ª€Ø °/´+°/°Ö´+01%ªþæ¾N,`¨ÿHÚÿâ°/´ +°/°Ö´+01%º þâRHf§7Ô!#)°/´ +°$/° Ö´ +± ³ $9017777''7''7''7''7'²$"$$#" ï ; ; ;> ? ? @ @ ( D C C C B @ B A ÕV¥  )®²$+°3´'+° 2°/°3´+°2° /°3´+°2² +³@ +² +³@ +°*/°Ö°%2´+°!2°± +°2´+°2² +³@ +²  +³@ +°±+°2´+° 2±°9±°9013533##5#6#"&542#"&2#"7#"432ÕV'SR)UÁ, …, ,  ÌOO%QQg, z- ,„ÿèÓ  ²+²+°/±+±±99017‰þûTàÄWí"þ;É"ýêÿ¸pÃW²+± é²+²+´+°/°Ö´+² +³@ +±+±°9± °9±² 99901!5!732654&/ÁO?ýHfþUJ A"3 Ã'332âD58#"3WýHfþUJwL3BRO?¨#2 #21BþZûC™,6VxSÙÿÿþÑG„]ÿÀÿÿþ×M„&^ý8¡ÿK¸ÿßL°/´+°/°Ö´+01'kJJJLJJJÿÿLbà '^ýª^þÁÿÿ×\'¢Ãa×e=Ó² +²/+±33´6C+°2²8+´ 6 +´C+´ 6 +´++´)$ 6 +´)+°>/°,Ö´9+³!9,+´+°9± +°2´ +² +³@  +² +³@  +±?+±!,°;9±9°9° ±99±±!99°³ &$9°)²;999°/²129999012675#5!###"'#".'73254&#"'226754#"'4>32ß: h`J,œ0dE.;$8? PC*,7AHI3;7\):Q9W@ ÊIIýä ™+´+°"2²> +³@>. +³>+´ +° /´+² +³@ +±B+±°19° ¶',6;$9°>³%&$9±°#9±1,±;99°°9°°9°°9° °901%"#"&546;5!5!##"37632.'"'46322674&C Y.r"ÂþÉädêH54"0Œd- !(™,  )NÞ3`IIªM ; ,R?  ([8+ÿöÿiÚ„J² +°3´ C+°2° +³ -H+´ +° /´ +² +³@  +±L+±#°A9°±<99°µ&(/78E$9° °9°H´*56$9° °9°-²3999±A<±/E99±°-9±!*°#9° °9± ²999°°901%"#"&546;5!5!&54632&#"3##"32>32.'"'46322674&C Y.r"ÂþÉ4MM5(!#;KjdêH39 "0Œd- !(™,5)NÞ3`I^Y53 ;?*Ed063D0aHDE­EIIC2A(U1OZIayF&c…d2'4LIÿöÿú.e;Ô²+´ 7+²0+°33´1C+´ 1 +°&3´7+°(2°54&'"#".'72654&+'32654&'!5!!6{?+FY,63D0aHDE þt8þ¦+7BgO9Y#'0G"G(IUI`zE&0^P2'4LI*EIIC2A(Lÿöÿõ£e7³²+°3±é²+°"3´ C+´ +±é°8/°Ö°2´+°#2² +³@" +² +³@ +°±+´5+³(5+´-+±9+±5(° 9°-´* /$9±±99°@  $&/$9°±(-99°°*901%27#"&5467'#5'%&'"'>325!5!!674'432"ó)$6:PDI7(“Jþì,b %’-2š ,‰þ+­þr{F7 %,,?+;:R71C *?îÔŸ;˜oN8DïIIæ4 J)!-d$%ÿöÿ‰‹e=ö²$+²+²+²+°3´C+°'/´"7+´ ;$ +°23´ C+°2²; +³@;7 +°>/°Ö´+°±7+´6+³)67+´+°6±+´+² +³@ +°±/+´+²/ +³@ +±?+±7² 999°)° 9±³',2$9°/±"-99°±$&99±"'°%9±;³)/$9° ± 9901.54632675!5!#327"&54>54&#"#54&#"sh2-AuX@Q+KþU• 89'77'*(9':Še'77'8$&4J2,)@„@¬SDa73cIIf J20Q4+'!=)M;%;**>& )/"FU >ÿÿÿöÿ{»?'¡Bkÿÿÿöÿ{»\'¢Ökÿöÿ{»ef²+± 33´ C+° /°Ö´+² +³@ +°±+°2´ +²  +³@ +°´1+±!+±´$9012674'%#5!#'>75##'' þï4Å/U<1ÏY7 M÷7IIÒF3 Ãþëî( @=ÿöÿ{»„#}²+±33´ C+° 2°$/°Ö´+² +³@ +°±+° 2´+² +³@ +°° Ö´1+±%+±° 9°µ !"$9±° 9012674'%#5!'73#'>75##'' þï4Ií=û1/U<1ÏY7 M÷7Iä;þáIÒF3 Ãþëî( @=ÿÿ‚3'¡ÿøbÿÿ‚\'¢pb‚„Có²+°3²=+² 333´C+± 22²+´$. +´$C+´ +´++´83 +´8+°D/°;Ö´+³0;+´"+°±+° 2´&+² +³@ +°±+°2´+² +³@ +±E+±0;°9±"° 9°²999°°9±.±"099°³ (5$9°8² )999°=²?@9990123275#5!'73####"#"'#".'73254&#"'22674'"'4>åÖ´+³3>+´%+°±+° 2´&+² +³@ +°±+°2´+² +³@ +±H+±3>°9±%°#9°³!$9±²999°°9±!1±%399°³#+8$9°;² ,999°@²BC9990123275#5!%7'73####"#"'#".'73254&#"'22674'"'4>å‹ZWGˆK)›<€J:"9@ P=2,6BGK1;6[eR=A*&ÊIs74&#"#5#"&54632&#"Ø%Hþ›þ­:HBSyFT.#7IJ*AlVJ#1/'#/>´(  II²PRBXŠ0m1!,/(úž$`D@p L 4)4-ÿöe>Ô²+²+±*33´C+± À/´6C+´<' +±<é´0 +´C+´$ +´C+°?/°Ö´,+², +³@ +°,±+´&+°&±+±)922´+² +³@ +±@+±&±699°²!<999±<6±999°'°:9°±)99°$°"9°² !99901%#"./73275#5!##4>32&#"3275!#'32675#"&{"•;9eE9"< 2'å RIþþ#4)"LLE(þª0/$8W3(Š94D:Pq7)ANNA$."-ŽIIýäP&8 G t7Λ&3::%:(3.Dÿöep²+² +±33´ C+² +³@  +°/° Ö´+°´ +°/² +³@ +°±+´+² +³@ +±+± °901#"&54735#5!###Õ 'f(;—QH¦ sžIIýäÿöXe(­² +²+± 33´C+´  +±é´&  +±&é°)/°Ö´#+²# +³@ +°° Ö´+°#± +°2´ +² +³@ +±*+±°9±#°9° ³!'($9±° 9°°9°&°9°°901.547#5!##5#".=47"327!;…"6ObSIoW2=*£(2.*Wwþæ*IM*^I0%IIýä´G 9&7 -$P'(/Lÿöÿú²e3ò+´*7+² +° 3´ C+´. +±.é°.°1 Ö´C+´ +±é°4/°,Ö´+³,+´+°/´+² +³@ +² +³@ +³@ +±5+±,±.99±±99±1*±,99±±$99°²%999°±9901'%46;5!5!##32>2#".573254#""&[JJJþ¬1Áþ4¼¨û6-?.,"9="4lRB$34P_-q H6yŸJJJ$"!`IIª1= I 4L(6MQ7."FX7p"…ÿöveš² +²+°3´C+´  +±é´  +°3±é°/°Ö´+² +³@ +² +³@ +°± +°2´ +² +³@  +² +³@  +± +±°9° °9±² 99901%2675!5!##5"&547#5!#8d!þ€QIt5@NEªiY&;,º`:ÈIIýäÕEFb->ü44 uIIýä_)9PC2HZC*-gÿöÿi¾e4G ²+°& Ö´++² +±633´ C+´> +´7+°° Ö´F+°° Ö±Bé´ 9 +± é°H/°Ö±;é²; +³@ +°;± +´8+³28 +´+°2°8±+°52´+² +³@ +±I+±;°+9° µ!&/@$9°2³ B$9±8±D99°°F9±+&±/99±±99±>F±5D99±9B°;9° °901%"#"&546;5!5!##5#"'.'"'46322674&7##"3>3232C Y.r"ÂþÉÈRI-‹T&- !(™,4)NέêH 6/ '*'Þ3`IIýä¼|-F ?  ([ 8+.ªM ( ÿö²e'‡²+² +° 3´ C+´  +±é´ +±é´% +±é°(/°Ö°2´+² +³@ +² +³@ +±)+± °9°³"$9°%²'999°°9016323275!5!##5#"'"'73254&#"p8@‰)'ýà¼SI3%D*Ur0INpK+!–&— ïIIýäÖ!/$V:Fv95ÿöÿúBet²+´7+²+° 3´C+´  +±é°/°Ö´&+² +³@ +°±+´ +²  +³@ +±+±±99± ±9901746;5!5!##"327#"&Ag6—þL„Ô)5+6(_3DV{lšòMmpIIºL()A$V*tŽÿöe$²+°3´C+°/±é° /´C+°%/°Ö´+² +³@ +°± +´+³ +´+°/´+² +³@ +±&+±±99°± 99± ² 99901732654'7#"&546;5!5!##"s(1'EC96LzXj‰`HŽþ—'vÞ$ ò%;#197'1*iP`›UDe}IIÆ#ÿöÿúme/¹²+´&7+²+° 3´C+´* +±*é°*°- Ö´C+´  +±é°0/°(Ö´+³ (+´+°/´ +²  +³@ +² +³@ +³@ +±1+±(±*99± °9±-&±(99±° 9° °!9°°90146;5!5!##32>2#".573254#""&½1Áþ4wcû6-?.,"9="4lRB$34P_-q H6yy"!`IIª1= I 4L(6MQ7."FX7p"…ÿöÿú$e%.«²#+²+° 3´ C+´+# +±+é´# +±é°//°Ö´+² +³@ +°±+´-+°-±+´ +²  +³@ +° ±) +´+±0+±-±#99± ²&+999±+#³&$9°±990174>;5!5!##"&54632#"&>54#"1A+˜þ“.wØ)2YM>4#5 #:<h¥>(2.ü7@,hII²>.?i'-4B,& *= ”L);31ÿöjes²+²+²333´C+´  +± é°/° Ö´+²  +³@  +°±+´+°±+´+² +³@ +±+±° 901####"&=#5!26=#jQJ€MC@U4tþQ-“ýäÁ?YV=ÆIþ¨)1µ¹Vÿöÿÿ>es² +°3²+° 3´C+´ +±é°/°Ö´+² +³@ +°± +°2´ +² +³@ +± +± ±99± ±99014>3!5!5!###"'.*1'þRHQIð?…%4 !! 84+hIIýäj;>¡6 ! ),/4*že1´² +²+±33´C+°+2²'+´  +±é´!$  +´!++°2/°&Ö´+°±+´.+°.± +°2´ +² +³@  +² +³@  +±3+±´#$+0$9°.±99±$´ 0$9°!±.99°°&901%275#5!##5"&'3254&'"327"54>320rahRI &*e (1£5.B; •"3+J_Ç-¼‡ÙIIýäÓ  ›= {)6.0Cs 0 eE AÿöÿÙþe$¬²+° 3´C+°/´C+² +³@ +² +³@ +° /±é°%/°Ö´+² +³@ +°±+´ +²  +³@ +° ³ +´+°/´+±&+±°9° ²999±°9° ±990146;5!5!##"34'432#&'".*E4¿þ”Rð!(ËF&,$:b!In?' &?W`IIª+!„C&1OI8H)93)[e/ϲ +²$+±33´C+°2²$ +³@$! +´ $ +±é´+, $ +´+++°0/°Ö´&+³&+´.+°&±!+´ +° ± +°2´ +² +³@  +² +³@  +±1+±.&°9°!±)99° ±99° ±+,99±,² 999°+±)99°$°901%2675#53##5#".547.54632#54'"63"e9`üRJ_r$: 7-5G3.CI(1:1R ư89ûIIýäÅ_ & ;* U+0HG(%0"R ES4ÿöBeb² +²+° 3´C+´  +´7+² +³@ +°/° Ö°2´ +² +³@ +² +³@  +³@  +±+01463!5!5!####"*JþOLQJà B(%IIýäGX ÿÿÿöÿËBe'˜X6„ÿöée n² +²+±33´C+´  +±é°/°Ö´+² +³@ +°± +°2´ +² +³@  +±+± °9±° 9017"&=#5!##5'275#ßMh4óSH*I<7Û;¦X@ÞIIýäÍ'J7õÚ%-ÿöçe'²²+²+±&33´C+´# +±é´  +´ 7+°(/°Ö´ +² +³@ +° ±+°%2´+° 2² +³@ +°±+´&+±)+± °9±² 999±±99°#°9°³%$9° ° 9017"&=#5!!632'>54&#"#5'3275#ßMh4ñþ¯D1E^{E"S955H2©;-;8Û¦X@ÞIIº?WDVƒ0j2)&&1þþÉ#œ%-0üÿööe$‘² +²+°3´C+´  +± é´  +´C+°%/°Ö´+°± +°2´ +² +³@  +² +³@  +±&+± ³ "$9± ° 9°´#$9°°901%67!5!##5".54632&'"327'M þ›RIA=5L#YF(,8+'7.#$¥ð IIýä¦/)<0Eh PN,6vLe&±² +²+± 33´C+°2´  +°3±é² +³@ +°'/°$Ö´+°±+´+°2² +³@ +°± +°2´ +² +³@ +² +³@  +±(+±$°"9°±!99°°9±°9°±!$9901235#5!####"&546;54&#"#&546.I¹hRI¹ b )4N Fc/7°ÏIIýäc r!š/ !0=ÿöe…² +²+± 33´C+´  +°3±é² +³@ +°/°Ö´+°2² +³@ +³@ +°± +°2´ +² +³@ +±+±°9±°90146;5#5!####"&%5# )hRIÏ agÏ "ÏIIýäNpIÏÏÿö6e² +²+±33´C+´   +´ C+°/°Ö´+² +³@ +°± +°2´+² +³@ +± +±°9° ± 99± ° 9°±99014'#5!##5#"&'326275#¼9@RJ=Q` %)5LPD¿)A5¿4)IIýäÒ5xd ,µQå,30ZLÿöÿó½en² +²+°3´C+´  +´C+° /°Ö´+² +³@ +² +³@ +±!+±° 9± ±99°°9°±9901#"'.'732=!5!#dK6 :y3 #'1@;J>þÛÇYŒ3BT“ 6")4E])-).ŽIIÿÿÿöÿ°½e'˜›Œÿöÿõše'†²+°3²+°3´C+´% +°3´7+°2°(/° Ö´+°±+°2´+² +³@ +² +³@ +±)+±²999±%² 999°°9017.54632675!5!##'67&'"s77%AV7cLYCBHý÷¤QJ/b B1./Fø4#%@ $@b8D_GB|IIýäXr*!*. ,ÿö:Ÿe/;¦²+°3´C+°/°3´7C+°!2°3/°(3±é°2°75!5!#"'#"&5463232654&#".#"32>P >%þ7©–,RK^'(`HS\DWR:-"+(( K3)VV' `4kIIn 1;,UfY]gVQh¸'NK0+<  *Amu- ÿÿÿöÿ“Ÿe'˜óÿþÿööe޲+² +°3´ C+´ +±é´ +´C+°/°Ö´+°±+° 2´+² +³@ +² +³@ +±+±²999±°9°² 999°°901&'"327!5!##5#"&5463202--@(B<þ±hIABGfWH,(l9'4,<!IIýä¦4j?Eh ÿöÿðe *­²)+°3²#+² &333´$C+´$ +´C+°+/° Ö´&+²  +³@ # +°±+´&+°±)+´(+²() +³@(& +±,+± ²"999°²999°² 999±)´$9°±99°#° 901&'"32>7#%72>7#"&547#5##7E'(,++yP´2þå./6@,280UlšWGÎM*!Q8EV‰œ4ø5( =(*:85IGýäÿöée z² +²+±33´C+´  +±é°/°Ö´+² +³@ +°± +°2´ +² +³@  +±+± ²999±° 9°±99017"&=#5!##575#327'ßMh4óSH**Ç:.EÊšXAéIIýäÁ'¯Óå&,)Öÿöÿó¥e#)¥²+°3²!+±%33´"C+´)" +´)7+°2°)´C+°*/°Ö´'+²' +³@! +°'±+°$2´&+² +³@ +±++±'²)999°±99±²999°°9°)°9°!±9901###'#"'.'732=!5!5#¥QK¤&D 3`,3 #'1@;J>þÛ¯œ¥ýä%,Iv/6")4E])-).ŽIÿ¶ÿöÿºðe4Ȳ+´+²+°3´C+´2# +±2é´ +±é°5/° Ö´+°2°´1+°/² +³@ +°±+´+² +³@ +³/+´(+±6+± °9°²#-2999°/°9°±,99±2² (,999°#±!99°°9°°9017".547&546;5!5!#!"632'674&#"{2QS*=_R;AK#îþ£úUþç$/+!99!;,=09X{1< *I-98K>&`IIª 7 8'*.! :ÿ‡fÿË #°/´ +°/°Ö´+´+01#55D ººÿÿÿöì '–Èšþ€ÿ•ÿ)°/´+°/°Ö´+01%'þÊJJJ)JJJÿñ¸K"e² +´7+° /´7+°#/°Ö´+² +³@ +°±+´+±$+±°9°³ $9± ³ $901#".'732>54.546;#"…?ZZ?cJ7vC3Ya.)?[[?>3æé ßN +;470WþAþö ÿò]²+´+° /´+² +³@ +°/°Ö´+°±+´+±² 999±±99°°901"'632#".'332654&q53(;UG7kR'AE3'G vG:> K-0:I.@E .M3MH%" ÿÿþÃþöÿòþÐþèÀþÐþôÿòÿò8²+´+° /´++°/°Ö´+± °9°±99012>7#".546;#"‰ ".E69$E9aT$9É 3. 5%8I=$!þÐþÔ!z(q°!/´++°/´ ++°/´++°)/°%Ö´+³%+´+°/´+±%°'9±!°9°±%99° ² '999°±9901%46;#"6367#"32>?#".547&þÐD:aTC.!"'&)D^ ')O+H<C7@B1$7*7 6)8.0#!þÔJ;@°/´7+² +³@ +° 2°/° Ö´ +° ±+´+± °9012673#"&'3q+FIoKLoG*!Ø-6N]_L+þ=fÿ¯\P²+´+² +³@ +°° Ö´++°/° Ö´+°±+´+±±9901#54&#"#"&=332632Q?# p$es‹TýäIs32#"'732654'"##".5732654'&#'2654&#"'4>NJJJG+FIoKLoG*!þ³;P5" C7ECRPB:* %!+Q$(0G( /3(S<29}O)(!G$0^'  8*YJJJb-6N]_L+*ZAF&2;2o\Ys1G0@/– .- -@!3HK2!Ô/"3G4/()  (.2ÿ‡fÿË„#°/´+°/°Ö´+´+01#5D„þâýàþÿÿ2°/´+´+°/01!5!ýÚ&þÿ3þ,àÿ2„/°/°/´ ++°/°Ö´+±±99° ° 901.#"67632Î2(1(!!0!å +1$&;ÿ2à8„/°/° /´++°/°Ö´ +± ± 99°°901>32&#"Î!0!!(1(å;&$1+ þÔjJ„R² +´7+² +³@ +°2°/´7+°/°Ö°2´+°±+´+°2±° 901!!72673#"&'3þÕtþŒº+FIoKLoG*!°F·-6N]_L+þHÿ\ÿÛ °/´7+° /01 '7267GþÖG8iHi8¤V))ÿÿþHþÔÿÛ'²ÿx²ÿÿÿöÿ•÷e'˜ñqÿÿÿöÿLe'˜¬ÿ·rÿÿÿöe'˜ÁŠsÿÿÿöÿ›Ée'˜mxÿÿÿöÿLme'˜mÿ·}ÿÿÿöÿL$e&~˜Eÿ·ÿÿÿöÿÐçe&‡˜ÿ;ÿÿÿöÿÄ6e'˜E/‹ÿöÿDŽeGï²(+° 3´7+² +²+²9+°<3´:C+°/´C+´4.(: +´47+°H/°(Ö°72´'+°=2²'( +³@'< +²(' +³@(9 +°'±!+´+° Ö´ +³@!+´E+±I+±@°9°°%9±E ´ $BG$9±°9°(±99°²*999°.@ !%&)+017>?G$9°4°E9°9°B901%"327#"32>7#".547&5467'#5'%&'"'>325!5!!7'432+ML>88O#7( &)B'PD +4)ŽHþñ+b#‘+Æ$oþ5˜þ{|Bà-&A-=8:% <*A.4%'=.D )=ïÕ›9•lM7 S]-çIIà5J* -ÿöþÝ¢e\(²+°3´C+°?/´47+°+/´!C+°Z/°Q3´ C+°2²Z +³@ZV +°]/°Ö´+°±V+´U+°U±+´+² +³@ +³+´H+°H/´+°°1 Ö´D+°D/´1+°±N+´+²N +³@ +±^+±V² 999°U° 9±°F9°1°Q9°°9°N°L9°µ!&+47?$9±4?°=9°+°<9°!±)F99°Zµ(HN$9° ± 9901.54632675!5!#32>7#"32>7#".'47&54>54&#"#54&#"pg0,?rV=O,Jþ^†4="00",1 '*H ="  '*E6>*";"10"3$&6G,"2=‚>©SE\61_IIc L3+F-'+/ <* "  =) 9'8$%?$>-*7!$(%DR"0þ`þÔ(q7¥° /´+°5/°,3´ +°2²5 +³@51 +°8/°Ö´+°±1+´0+°0±%+´+°±*+´+±1² 999°0° 9±%°9°*±(99°± 99± °9°5´%$9° ° 901.54632632327#".54>54'"#54&'"þ–J& /WA.=2,< %.%"!"0&'9 &/'K'6%#.a/>4E*.& #B(.#, # 9&33"3>'þ_þÔ<Mа2/´)+°!/´+°K/°B3´ +°2²K +³@KG +°N/°Ö´+°±G+´F+°F±;+´+°7 Ö´&+°±@+´+±G² 999°F° 9±7±999±@&±>99°³!)2$9±)2°09°!°/9°±999°K´;$9° ° 901%.54632>32327#"32>7#".'47&54>54'"#54&'"þ—J& 0XA0< 0&2'/'$#!"%1  +  9&.,'.'K'6%#.a/‚B(J*."?14 $,  .+*0;'34"3>'sÿ ¶€°/°Ö´+´+±+01'¶C;ýeE›ÿÿîÿ®Ž&ÀPÀÿ{Z]äò I°/´ 7+°/± é°/°Ö´+°±+´+±+±± 99± ±9901#"&546322654&#"äi]^fi[\jÆ:CB;6E@'aigc`kmàG>:DF<>Cq¿e X²+²+´C+´ +´7+°/° Ö´&+°±+°2´+±+±±99±°9012##"&'463254&#"M]I#9J\i8!a?"$5egRþT;YFI^£,/\'26Xÿ¼òeN²+´C+°/´+°/°Ö´+± +±° 9±² 999°±99°°901>32'#"'472>74&'"X}/Z}#72<‹eB;/0SN?5^#.qU4W7 Í+ÞJ4/q97D/dÿæe,|² +´C+°"/´'+°/±é°-/°Ö´+³+´+°/´+±.+±°9°° 9±'"±*99°°9°°9° ± 99°°901%4&+'3254'"'632'&=43226œb6A,kpfO-w766!@&W?P7os3B/BÍ1?KMDB3 ;(T!"8!HX t0Ÿ><*ENþe#,y° /´)C+°-/° Ö´'+°2³' +´+°/´+°'±++°#2´+³++´+±.+± °9±+'³ $9°°9°°901#"&547.5467>74.'3254Èœk_GE[eZD-?(d,CJX$9X]eDUiWI@OOCHW?L3 B $=]+L ) þÁFKK9ff~²+°3° /´C+°/° Ö´+°±+´+±+°6ºÂ÷ìÀ+ °.°À±ù°À±..³....°@± °9°² 999°°9012#'#"&547327.54Š'%XML+7Og:D E.- â?I*þéðm\_m"f0G=8^fÿ˜äe0²,+´'C+²*+´)++²%+°/± é°/´C+°*/°1/° Ö´ +°$ Ö´+° ±+´+±2+± ´ "',$9°¶)*$9± ±99°±99°°"9°*±$9901;#"3274'432'"#"&'47&54632&#"°V$HZ/@@0 @!'8C8" RjVg_BH!)G #ÙDIH)(7 V(1'€#ƒ_K`26X;M E "þ\#t°/±é² +³@ +°/´7+°$/° Ö´+°±+´+°±+´+±%+± ° 9±±99°±99±²"999012#".53327"&5464&'"6q5Cç4R4#D²oKcH~)5, 3FT0þ3^n‘|Jýô}oRF_È@?]$5 0‚ÊcB°/±é² +³@ +°/°Ö´+°±+´+±+±²  99901%#".5473325Ê•43{M‚Z^²¬ :(*-zþv+Cbÿ‰Êe$h² +´C+²+°/±é°%/°Ö´"+°"±+´+° Ö´ +±&+±"°9°¶  $9± ±99012.'654'&5462654&#"4K#fPš F$ÛWR'12'^2e%7,H_þøE + t2BYï2 %/Y"+[¶/ˆ R°/´+° /´+°/°Ö´+°±+´+±+±°9°±99± ±99012"&546"2654&Å,>>X>?+$ˆ>,+=>+*?>ÍE.°/´+´+°/°Ö´+´+±+01#53Íxÿÿ ;'¡Àaÿÿ× '–¨aÿÿ‚ '–\bÿÿ‚\&Wbÿÿÿ\×e'²vaÿÿþÔ×e'³vaÿÿÿöÿfÉe'˜á7'˜jÿÑ'˜÷;xÿö6e ˆ² +²+±33´C+´   +´ C+°!/°Ö´+² +³@ +°± +°2´+² +³@ +±"+±±99° ² 999± ° 9°³$9014'#5!##5#"&'326327'5#¼9@RJ=Q` %)5<6#];3p–¿)¿4)IIýäÒ5xd ,!,L+«…å,ÿöÿìBex²+´C+° 2²+° 3´C+´ +´7+² +³@ +°/°Ö°2´ +²  +³@ +³@ +² +³@ +³@ +³@ +±+01463!5!5!#3!5!##"*JþOLQGýȧà B(%IIþIIX ÿöÿìÉe&¿²+´C+°2² +° 3´ C+´% +±é´ +´7+°'/° Ö´!+°!±+´+² +³@ +³@ +°±+°2´+² +³@ +³@ +² +³@ +±(+±!°9°°9±%±99°± 99° °!901%4.'5!5!5!#3!5!#".'732v(ýÈÓQGýA.’#T9-R90;>b->ü44 uIIþII*)9PC2HZC*-gXòe@²+´C+°/° Ö´ +° ±+´+±+± °9±°901>32#52674&'"X}/Z}|AHOlN?5^#.qUa†©â{A7D/ÿÿÿöÿµme'®&¶}ÿöÿìöe(§²+´C+°2² +°3´ C+´ +±é´!& +´!C+°)/°Ö´+°±+° 2´+² +³@ +³@ +² +³@ +³@ +±*+±³!($9±°9°&´ $$9°!°#901327'67!5!#3!5!5".54632&'"s7.#$¥Ú þ›RHþ[A=5L#YF,(8+!,6vI IIþIIq/)<0Eh PþÇiÿê f° /´+² +³@ +°2°/±é°/°Ö´+°±+±é°±+´+±± 99±° 9±±9901332673#"&74632#"&þÇ6/)'16T:4\eð#,.!@GJ=+# U°/´+°/´+°/°Ö´ +° ±+´ +±+± °9°³$9±± 99012654&#"7"&5462'7†s3V::R7â*à0(;8-*7<þDá*ß"1åû !+}°/´+°/´+°%/´+°/´*+°,/°Ö°'2´ +°2° ±+°2´ +°"2±-+± ·$%)*$9±± 99±±"'990172654&#"7"&5462'2654&#"7"&5462†s3V::R7_s3V::R7d0(;8-*7<­0(;8-*7<.%·² +°/´+°/´#+°/°3´+°&/°Ö´+°±!+´ +° ±+´+°± +°2´ +² +³@  +² +³@  +±'+± ²#999°° 9± ° 9°°9°´ !$9°#°9°°901!5!##5'#".'732654&#"'632Û>ýëG3R4C;aA* 3{F(7?()/S<^2 [?33þ\~I:bi:…—=-'N< ek={6å²+°53° /´+°/´+°%/±333´&+°12²&% +³@&/ +°7/°Ö´+°±+´+°±+´ +° ±+°#2´+°±6+°.2´5+°02²56 +³@53 +±8+±² 999° °9±6°'9± °9°°#9°´ "$9°±99°%±.99°&°,901&'##5'#".'732654&#"'632!5!533##À4-3R4C;aA* 3{F(7?()/S<^>ýë…   3JJ3±:þ\~I:bi:…—=-'N< ek9 [?3 …M3þÿòÿÎû >̰2/´:+°/´+°2° /´+° Ö´+°?/°Ö´+°±7+´6+°6±/+´!+°!° Ö´ +° /´+² +³@ +² +³@  +±@+±°9°7²)*999°6±99°/´ ,#:$9° °9±!°9±± 99013!5!654.#"#"&54732632'&/32654&#"'>32”nþX $l6J0 42Q9HŽR¤@‘®o'";+*9(EAÿö4*?ز+°/´+°/´$+°1/´2+°.2°6/´?+°@/°9Ö´<+²9< +³@91 +³!<9+°3´+°2°<±+´+°±3+´.+².3 +³@.0 +±A+±¶ $'6?$9°²+5999°3° 9°.±*99±°9°°9°@    !'$9°$°*901&547#"'73274&#"'4632>3'23!5!4+"&=33àG)..48+5G"3'!=513>(.^J(c>.]ýÍ«:ÜE1+$‰hkUUkr:d F;#%d1[0N +.N)#,ï5=33?,J °/´"+°3/´ +°8/°3´9+°2°K/°EÖ´F+°2²EF +³@E +°F±6+´+²6 +³@68 +°±'+´+³'+´<+°54'#"&=#5!6=4&#"5473V-BSþõ' 'fP9^8)32R.(< "  7Ý–.>f¥- 7W©6E3¯)2 (/!ZoD_|V'!jwU#3)*%( +-³3 f01@/C°/´!+°*/´ +°//°3´0+°2°7/´A+°4 Ö´+°D/°Ö´+°±+´+³=+´<+°9±=°9°-±7A99±1µ !*4$9°± (99±*!± 99° °&9°/µ ($90123#327#".'&'32>54'#"&=!5!4&#"#"&547326h.DUú2@S'AA#QˆE3313-$B'2"<>)þþ£%-TSR- ==T­7H3©"p9u2J%‡¶V‘Lˆ^R#/ >*4S:­3.8.21X‹09®²+°3°'/´+°/´+² +³@ +° 2°:/°*Ö´/+°/±+±122´+°2°±+° 2´+° 2² +³@ +±;+±/*°,9°´'-3$9±'µ 19$9°²!999±²$*-999012675333##54&'#5&/67.'#"&547^O>393TT3 632¦$eo  L&*'"$ÿpC; #ö8"6#›þÒ'%y\3þj;D+þìt`N8H4 21& G/3$ t5y;ý°$/´%+°2²$% +³@$" +°./´+°54.'&547#"'7>54.#"&54>:F55&8,7 ‰F.6R^R6d,* , %* &-#gK>!+;%4 2J.1&6($*R8Mi*1+ %'/!9-#õ;.¤²+°/´+´+°)/´$+°/´+°//°Ö´+°±,+´"+°"±+°2´+±0+±°9°,± 99°"°9°´')$9±°9±)±99°$°'9°³&,$9012#.#"#"&547326324&#"327#"&546›(23GG ORR,BI>F,€ #–;3þO9H_5A@1:'+Sz %/9•#LYGײ+° /° 3´+°2°)/´$+°/´/+°H/°Ö´+°±<+´B+°, Ö´"+°B±+°2´+°52°±7+´+±I+±°9°<°9°,° 9°B°9°"°?9°@ ')/9:@E$9°°39± °9°)±99°$°'9°·&,57$901#4.#"#"&547326324#"327#"&54632654/&5467LW3 >.DTQ,2BTD.+ #›7# %\­Z%*IhiIùW(þ†(/G_A5@1/1+T#x"+'8”(0:&9(D$)!*"I>ø2²1+´&+° /´+° /´!+°3/°.Ö´)+°)±+°#2´+°2±4+±)µ !+,1$9°°9± ±99°!²,999°&´+.$901#".'732654''254&#"&54632ö/ "2)(H75%)3 5Q]L£²1+´&+° /´+° /´!+°M/°@Ö´E+°. Ö´)+°E±+°$2´+°42°±8+´+±N+±)@ !+,154&##5.'7z™þÒ8×6H0/")( [63 Eu6ù"•)‰C`*.33.&N4#B%'6MþfXOMFX/Ó„+ª² +°/´+°/´&+° /´+² +³@ +°,/°Ö´#+°#±+´+°± +°2´ +°2± é±-+±#° 9°µ!)$9± °9°°9±&±99° ³!$9°± )990133##5./>4'"&54732677W$Ld3443¯:3:*4(%1( &'=¦5FaÝV3þR,‡1-45)*%/DJ+à{+¤°#/´+³#+´&+°/°3´+°2² +³@ +² +³@ +°,/°)Ö´+°±!+´+°± +°2´ +°2±é±-+±!µ&$9±#&² !999±±)99°°9012533##&#"32632'>54#"#"&546Å9M.3443V^!F O",&"'*I N  W15HÇM3þ`›7#)"5"% O %1^µ.%‰²+°#/´+°/± 33´+°&/°Ö´+² +³@ +°±+° 2´+² +³@ +±'+±± 99°²!#999±#² 999°°9°±990127#'47#5!##5./7#"&²& !&')ÞAt5´33„JN &H“ $ #a133þAAZ (R8 ¿ 8BÒ²7+°3´<+°/´(+°0/´+° /´A+°C/°"Ö´#+°#±2+´+°±++´+³++´9+°9/´+±D+±#"°69°2°79°°9°9¶ (0?$9°±-99±0(°+9°°9° ³-2$9°A±499°<³"#$9°7°6901>32#"'326?#".'732654'#"547&'74&#"32 I4 '.',69(#)ZJ>g@&3"5R0<3% =!o#>(ä<$U¨E$) W<P-JcM|ƒB @ykAE.0,"4”!W>1 —.r°/´+° /°3´+°/° Ö´+°2² +³@ +°±+´+² +³@ +±+± ° 9°°9±° 9° ±990172>54.'&'#5!!2#{#bDLgH—þä"L6: ºG5Yi þŒÔ33=.(LÄÿµý./:µ°/´+°/´0+°6/´(+°/°"3´ +°;/°Ö´9+°#2²9 +³@ +°9±3+´+°±+´+² +³@" +±<+±9±99°3°9°±'99°°(9±°9±60³9$9°(°*9°°8901.#532654&'#"&=#5!!22654'#"'%8/$22D"9ÉrGWw%.\30%ýþ[ML  þæC1  ;) %> $@t3\2&?^.á33! (/K&†ÿýY.@÷²+°./´:+²:. +³@:3 +°/´%+°/´+°/° 3´+°A/°3Ö´4+°4±+´"+²" +³@ +°"±=+´++°+±+´+² +³@ +³+´+±B+±="¶ (.:$9±+°9±°9°°9±.°9±:³+=$9°%°?9°²"(999°°9°±99017".547#5!!327&547".'32?#"&'&5332654'ó(3 KÖYþÒK9<10 #BP2$*%,SAHƒ3(4&"@(ø2.a1337'!kmHTjN]X !!# B!-"')!3_Žx+FS}A) 6'$&3†$~°/´+°/°3´+° 2² +³@ +³@ +² +³@ +°%/°Ö±22´+°2² +³@ +°±+° 2´+° 2² +³@ +±&+01675!5!33##5.'#5.#7p¡þÔ_ 63JJ3(3+@Y+÷)ˆCa,+3þÎAÜX3þ=£W8?-KV1ë:CY² +°/´+° Ö´J+°O/´T+°/ Ö´*+°D/´?+°"/´6+°Z/°Ö´+°±3+´'+°'± +°2´+±9F22°±L+°W2´+°B2±[+±°9°3²999± '´ -/6$9±L²?Q999°°9±J°9±OµGLQ$9°/°9°T±-99°*°F9°D@ ',39;BW$9°?°<901#"&'#4&#"#"547326324&#"327#".5463267>32'"2654&#"532654&»0g,[3EG g!}/69`:, @*  "#! Ÿ*7%!/,=j7_-X83%'/(240gCÈI:¡E9 C<9*#S )5. $ $>Ab!>-4lxE49!,3%ÿÑF‘'2Ú°/´ +°/´+°/°3´ +°2°3/°+Ö´0+°0±+´+² +³@ +°± +´+°# Ö´+²# +³@ +±4+°6º—À*+ °2°À±&ù°%À³%&2....³%&2....°@±0+°-9°°.9± ²999°#°!9± ±99°°90123!32654#"'632#"&5#5!654'".5473þ.Iþæ;d&!"-:c4,'E<[š #,!*a°7>54'#53&5472654'ƒ/2°™CfHFV2 ¾ P6&):4I<"G0ß,N73k*EFHZD N=%3]G54#"'62 ,'M˜þè 35% *>.9d?'’33þq 6Y1&"!=8€[?Ì‘#y²+°/´+°!/°3´+°2²! +³@ +°$/° Ö´+°±+°2´+°2´:+±%+±²999±°9°!² 99901327#"&54>32533##4&#"r, )F>)3& 3553Y$5@‰?3^+1:('Êc3þW+w=ÿß&U.+/G°/´#+²# +³@# +°2°)/´ +°,/´-+°0/°Ö´+°±&+´ +±1+°6ºÀÓõÁ+ °.°À±ù°ÀºÂÝí+ ±°°À±±ù°À°³+ºÀúôÚ+ °³+³+°³+ºÂÃíg+ °³+² Š Š#9²9°9² Š Š#9²9@ .........@ ...........°@±°9°&³ #$9±)#³ $901&54>32#".'332654&#"%5!ü, 8&KcfS5+# 3  $2BLF57þãva '" '{¾y 1&@)I%%7;X/:\IFa!w33ê†0¦² +°/´+°)/´!+°/° 3´/+°2²/ +³@/ +°1/°,Ö´+°±+´+°± +°2´ +°2² +³@ +±2+±,°9°µ%&./$9± °9°°9±!²,9990133##5./67654&#"32727+"&54624\%jI3QQ3";,C&,n'B7) ? (V~Q§8P)YïX3þI% 58<"*$3- 2DJÿéÿþ³.{²+°/°3´+°/°Ö´ +²  +³@  +² +³@ +° ±+´+°° Ö´+°/´+±+± °9±°9°° 901'#5!!67&54Mc3OÊþ¸g”,./j´2"33ê†!PO_ Lcb-Í5%x²+° /´ +° Ö´+°&/°Ö´+°±+± 22´+² +³@ +±'+±°9°³!$9± ¶ %$9°°901"753##5./7&54632&#y…R3GkMp^),*' ŸyU-J1& DJ3þVGK)[F=8Y325!5!##5.#"c4#4,b3þ©½33B$&3"„&D/F"fÌ33þÃBE--,  ós&p² +°/´+°$/´+° Ö´+² +³@ +°'/° Ö°2´ +°2´ $+±(+± ³$9°²999°$°"901>32533##.''654&#"72767&#" n6…F4==4* »$%.% # 3#43B£1P‚ÑE3þ:H Á"&!$ 9 ,+2&) S.(² +°&/´+°/´ +°/°3´+°)/° Ö°2´+²  +³@  +°±+´#+±*+±±&(99±& ± 99°± (99°µ#$9013254&##5./67&'#5!!32#"'Ì I<38b($f4Rþ9>(69vKZr7 #1?þZFA_ %M#6@33*8&1,'aOaP'% Œ.W²+°/´+°/° 3´ +°/°Ö±22´ +²  +³@ +² +³@ +±+±±9901%.#'675!5!##*–M!~”þÖŒ/3“%ˆY*Š6b++33þIX,G5.,0ް /´+°/´*+°%/´ +°2°-/´.+°1/°Ö´+°±+´(+°(±+´+±2+±(µ  "$9±°9°*°9°%²#999° ²"99901#".'32654'#"&54632&#"326%5!¥%`K9bC:"9%”T,P"5R3O)4! K%3þ|5® #!9 @s1Jm_:“¥Q?3Z7?#00:2”33Ê.!t² +°/´+°/±33´+°"/°Ö´+² +³@ +°± +° 2´ +² +³@  +±#+± ³$9±² 99901.'5#5!##54&#"#"&5475Å>N)É33`#B2U)D>=79.&!"33þ­C+P,],‰–82Nà±.K² +°/± 33´+°/° Ö°2´ +² +³@ +² +³@  +± +± °90167.+5!##5.')9Ye 6±33)“9?Y7?J"1#9CE33þLCR F7'2jÿÿŒ.' ¬¨ü.&¢²+°/´+°$/°3´ +°2°/°3´+°'/°Ö´+°±!+´ +° ±+°2´+² +³@ +² +³@ +±(+±!² 999° ° 9°°9±$³!$9° ° 9013"&546326325!5!##.#"4&#"V+8>FG;1.+&þkû33 3%'9#.%&;0S>@R0+ ‡33þ!JL0)5…6¯²&+°5/´0+° Ö´+°/°#3´+°!2² +³@ +°°* Ö´+°7/° Ö´-&+°-±&+°2´%+° 2´#%+±8+±- ±99°&±3599±5±399±*0µ 2$9°°9±°901#"'73>54&#"563263533##4&#"327#"É 4$E5‰N3::3Q$!, <X&)-1=8k_  $ÀW3þ^s/6 +½.Q² +°/±33´+°/° Ö±22´+² +³@ +²  +³@  +±+± ²99901&'#5!##5./6&'5À-~½:3BdE*÷I;0|UÖLŠ—#A33þ@]G:%3(?+7qc{šü.(f²+°/´&+°/´+°/±33´+°)/°Ö°2´+² +³@ +±*+±&´ $9°°9°° 9016325.'5#5!##5.#"#"'7326s@5"'2Ä B_$ü53 :'30A,-û84E®¸K7"33þõN4?4j" EÿËñ.#K°/´+° /´!+°$/°Ö´+°±+´+±%+±°9°³ $9012&/32>54&#"&546'5!æ6l•¥Y&©Ù_:&: M$B0d¶ÉëY:o2[p!ºH9!(# $<"%*9+K33þÇÿyÿ7ÿé *²+´+²+° /°Ö´$+´$+014632#"&þÇ"O2"ÿËç.$q°/´#+°/´+°%/° Ö´+²  +³@ +°±#+´+°±+´+±&+± °9°#²999°°9±#°9015!&/32>54&#"&54635-A•¥Y&©Ù_:&: M$B0d/û3NK+o2[p!ºH9!(# $<"%*9+Kÿ±Á{K²+°/° 3´+° 2² +³@ +°/°Ö°2´+° 2´ +±+±°901.+532533##L)Rb3BB3±.38…M3þg² +²+´+´  +°3´ +°2°/° Ö´+² +³@ +²  +³@ +±+± ±99± ²999013###53'>32&#"BIC3G9* €DX’V#‘ŠBUe3þû3:IdNJ&‹Wþw´)$ ²+² +°3´ +°2²+³ +³ +° /´+°/´+°%/°"Ö´+°±+° 2´+°2² +³@ +² +³@ +±&+±² 999± °9° ±99±°"90123###53.#"'67."&546цž AA3@@—f,[€o -@Hi)Žm3þû3Rv$ *!$%Hÿÿ*iL"_°/´+° /´+°#/°Ö´+°±+´ +±³$9° ±99± ² 999°² 99901'2654'7&'#"&5463267&#"š0 *:()(0M9< */)?/*8BA9/"9S ÿ@þîš$@²+´ +°/´+°/°Ö´ +±°9° ²999°°901463'7&#"327'#"&ÀB1. !+1(£ ˆ)3&0b)5?"!#&r/þžþÛÿ­)°/°Ö´+01?þž‘+d§sj2QG~8þßþÔ/ƒ 7'?'þßz/}+PF…_!V2Q3t8b6s8/.R²+´+°/°3´+°/° Ö´+² +³@ +²  +³@  +±+±³ $9017267#"&5467#5!Ç CL^O<±&[rD3  :ŠfKœ$31›n5qÿÆL,¥²(+´!+°/°3´+°2° /´+°-/° Ö´+°±+´+² +³@ +°±+´+² +³@ +±.+± °9°± 99°± 99°³!($9±!²$&999± ° 9017467#534&+"&47326323#3267#".(GA°Ò-Y)*3,2 K@<G>³=0 C0H"êQ‘/342H #6M3j @~  :9TDÿÿþ6¢{' áþ5ÿÿþJ£4'ÈþIÿ/ÿZÿóÿý²+´ +°/°Ö´ +01'7+¦¦¦{({ ‘13p°$/´/+°/´+°4/°Ö´+°±2+´!+°!±+´+±5+±2´ $)$9±!°9°°9±/´!)*$901"'654.'&54632#".'732654¢+9 &-Ÿ0 J[g7_G:OC# & /þ8- Li 4 ,#H/5.PBTA4(84'  >þìÛ4~°/° 3´+°2°/´+°2° /°Ö´+°± +°2´ +°2² +³@ +² +³@  +±!+±°9° ³$9° °9±°90126323###5374&"#"&547c)B&GRR3VV3(B`T*±4(,3þù3$63!,7ÿÿÿ.&ö 1ÿÿÿo˜.' ®ÿö÷ÿÿ±.& ¹žÿR‹:¾²+²+°2/´+°/´+² +³@ +° 2°;/°5Ö´:+°:±$+± 22´+°2°±+°2´+°2² +³@ +±<+±:5°79°$¶#(*28$9±±!"99±2¶$($9°² *,999±³/58:$9012675333##54&''75&/67.'#"&547HpCD96þþ0O>393NN37ds4ý™2¦$eo  L&8!$¯/3#(8,8"6#›þÒ'%y\3þi=C+þìGT*8²jU`N8H4 2!$& tþó€yuy°`/´e+°k/´+°/´+² +³@ +° /´.+°v/°(Ö´#+³G#(+´B+°B/´G+°#±+´1+°R2°s Ö´n+°1±h+°92´+°M2°±+´Z+±w+°6ºì¹Âù+ °?°=À±Hù°JÀ°?³>?=+°H³IHJ+²IHJ Š Š#9²>?=9µ=>?HIJ......µ=>?HIJ......°@±#G±&D99°´%.E$9°s±4599°1±bq99°n±Pc99°hµ T`ep$9°±U99±e`°b9°kµZqs$9±³ RU$9°°P9° ¶&(159M$9012>54'.'#"'7>54.#"&54>32>54.'&547#"'732654&#"&546¹5,".]," #,* , %) &-# :F55&8,7 ‰F.6R^R6BCT G0 .8(!*4F2!$19"  *1+ &&0!9-K>!+;%4 2J.1&6($*R83W )$8 3 %1   #&$þþÔÿ§T3œ°/´ +°&/´1+°4/°.Ö´)+°)° Ö´ +° /´+°)±#+´+°±+´+±.³ ,$9°)±99°#³ +1$9°°9°°9± °9°&µ,.$9012654.5467#"'732654&#"&54632À=2GG2 LZL/D7#!+45,¸$/",( I5'9 &-  #("2ÿÿþoþÔ—º&îðfAA£® L°/´ +°/´ +°/°Ö´+°±+´+±+±± 99± ±99014&#"326'2#"&54>pA4>I@4O<8DRè^IXncK*8. Ml,)[°/´+° /´ +°*/°Ö°2´+°$2°±+´+±++±°!9°µ "'$9± °901%#"&546332654.'&547ls=.A?1   19O+$==* 1EE1²Mc09/ M=4/!1 40 +0=b1ÿÅâ#% °/´+°&/°Ö´+±'+01#'&/&/33254./&'7‡^2aŠ"HC39@!* R'u  H:''*„"6E@~$@;#''=.V  *!&#-?,ô'S° /´+°/´+°(/°#Ö´+°±+´+±)+±³ !$9±´ !#$9012#"73>54&#"&54>&/;1!)BD$¯a3+mG$6O>$1: 3 #4X7A^/z CŒ„!*4#Dz%1= &,9ŠC 2r²+´++°/´+°3/°&Ö´+° Ö´+°±+´+° Ö´0+±4+± · #+$9±µ  &0$90162654'7>=&#"#"&5467.54>32½\>s(>h%:r"B+%3~aGER'D@=&7/43(J/#C.@ $Þ:O0", *1b8JL?'13M/%8 8&+61·%2µ°/´+°3/°Ö´+°± +´,+±4+°6ºÁ×ðÅ+ °°À±ù°À°³+ºÁôp+ °³+² Š Š#9² Š Š#9µ......µ......°@±, ²999±±.199013&5467."&546?6?&'ø>32#".'732654€ Z #+) .! cI>jF+3=o@1BL2228* #3-(8.!(! A*ZwEo? H“m]E?`Ù0i²&+´+°/´/+°!/´+°1/°#Ö´+°±+° 2´-+±2+±±!&99±/°9°!±-099°±,9901;6363637&54&#"+"./57"#"'463237“5' 89/"NF 6¢ l6(,x&CWLþ),*&v=g 4X:¤7 $  0o°/´+°/°3´"+±&,22°1/°Ö´+°2°± +´+±2+±°9° ±"99°±$99±±99°"² $99901"32>54&%#"#"'4'76326323;2?Ë*-,;3N#dJ/%,$/-9/'   18#¤@>/#  J†Og3"# ½>4¢°(/´'+³'(+´+°"/´.+°5/°+Ö´%+³%++´+°/´+°%±+´2+°2±+´+±6+±+°9±%°9°µ'(.$9°2°9±'±99°"³+2$901%>5.'.547?654&#"3"&54632H('E6Q &1$&\xšwR:)&:?G;7Kp I4%  - " *#/=pN` 3 0=+!7.258El: ÿçž. \²+°/´+°/°3´+°/°Ö²222´+² +³@ +² +³@ +±+±³ $901'.+'675!5!##*9Vˆ$ %ˆš9!~”þ½·A3@>e X,X.ˆ6b++33þÿçž.!Z²+°/´+°/°3´+°"/°Ö±22´+² +³@ +² +³@ +±#+±³!$9017.'77.+'675!5!##Ò`:,n6š9!~”þ½·A3H''%ˆ&&Q . I7 .ˆ6b++33þ$X,b×a °/´+° /°Ö´ +± +01%.#52¤9Õ{M„]M/báë3=a‰‰OÿûIf$ x°/´ +°/°3´+°2°!/°Ö°2´+°2² +³@ +² +³@ +°±+´+±"+±²999± ±99°±99013#2654'7#"&=#5354'80AA/F-,4_D99VV1$19F3Z/&R*."'<=sJXB3KNbÖa +° /´+² +³@ +° /°Ö´+± +0172673#wÜ63/M]„M•ìàOˆŠa=(K&$ N°/´+°!/°Ö´+°± +´+°±+´+±"+±°9° ²99901%>75>54.#"&54>32%<… 3ïŒ@" '%*8(1[é,µZ „þî:3+$'$. 4)34P: <1¤°/´+² +³@ +°//´+°/´)+°2/°Ö´+°±%+´ +° ±+´,+°,±+´ +±3+±%°09° ±#99°µ")/$9± ° 9±/±99±²#%,99901732>73#"&5463232654&#"&54>32#'"@8K}S5 3AR-2BY., " .9(7, ,!L;h7H“# V‘¨]nÑ«"D8#3(#3'(?=8N/…' °/°Ö´+±+±°90173#"54#62i %*L‰9TG&7N#V.(°/´++°/´+°$/´+°/´+² +³@ +°)/°Ö´ +² +³@ +° ±!+´+±*+± ° 9°!±99°±99±±!99±$µ "'$9±± 99017"&=4#563232>323#"&=4#"l + 2" *š1î&3 Nü?M?)"Ç 34)Î51e+’‡é%J°/´+°/´+°&/°Ö´+°±+´#+±'+±±99±°#90172654.#"".=4>32Ø1K)! 2,# 1G$#G/98#`ÅP(#3 $ "3 3 554<)"C.Qdt Ù$Z² +´ +°/´+² +³@ +°/´")+°%/°Ö±é±&+±±99±"² 999° ° 901326?63"#".'#"546326.,O+&?43473#"&53£%/YHJX 7„,¹( RlkS%0 ÿwÏX *° /´+´+° /°Ö´+´+014632"&‰00!H $!&000'(m+8{°$/´6+°//´+°/´+°/´+°9/°'Ö° 2´3+°2°3±,+°2´!+°2±:+±,3µ$$9±/6±!'99±± 99012#"&54>4&#"3262#"&54>4&#"326¬2GC84F.e2&$ "!)C #+C86D 6k.  )("mD86DD8 ${&"3 (· 6%5CC8 #,| ) #'+ÿùh>v²+°3/° 3´4++° 2°?/°0Ö´;+°;±+±+° 2´ +²  +³@ +±@+±;0°&9°°=9°²!999±3³ ;=$9°4°90126?53###"&54>5&'#"&54>54+532676“6+;džAN/7 '$+$BJ;& G8\>]P "3[9'ÔAýÀi JE>&9)H+‹&WI]7/$;"°A /X8DaÿùPB‘²+°7/± 33´8++° 2²78 +³@7 +°C/°4Ö´?+°?±+±+° 2´+°±+´+² +³@ +±D+±?4°*9°°A9°²#%999±7³ ?A$9°8°90126?5!#####"&54>5&'#"&54>54+532>“6+;¯ž@AN/7 '$+$BJ;& G8\YWP "3[9'ÔAþºFýÀi JE>&9)H+‹&WI]7/$;"°A /X8 aJÿàt„-2ä²+°!3´+² +³ +° /´0+°$/².333´%++°2°/´*+²* +³@- +°3/°"Ö°&2´!+°2²"! +³@"$ +°!±+´.+°.±+´-+°-±1+´ +°2² 1 +³@  +±4+±!±99°.± *99±-°9°1±99° ±99± °9°0°9014&#"!##"32>2#"&'67&'###535463235Ž@6{׈iëY¤K$>! c6\êœw€@}}p^9iq-{©Î9@ÆAóŽ!f# (asINagnýÀ@AstbTŽœ³ÿö±„5Þ²3+°3´*+²*3 +³@*/ +°"/´+° /²333´ ++°2°/´+² +³@ +°6/° Ö´+² +³@ +°±+´+°±+´!+°02°!±+° 2´+°2² +³@ +±7+± °'9°²*3999±!±-.99°±99±"*°9°°9013567&'#5!4#"#46323####"32>2#"&-{©þM“wZÌ|<2@SPZt¯¯@£_3LcP¤K$>! d/uÎAœ³þ|T[gnAÅ>:Liis&AýÀ@ó>/!f# 'coÿÿÿùÿfã"ƒiÊÿÿÿùþñã"ƒj¼ÿÿÿö§¡"‚k‹ÿÿÿùhÎ":lXÿùÿùßµ/@¦²#+´>+°9/°33´+°./±33´/++°2°/´ ++°A/°-Ö° 2´+°2²- +³@-. +°±0+´+²0 +³@ +³@ +±B+±-°*9°0µ #9$9°°9±9>±099°°9013>7%!2#"!##".5#54&#"#326} xJ[J0þCß]Ž=Z5%biMFu'L54W?2! DY- +Z= '9S26F@Q0NCA41 *H8*AXo#Dk64 +EC]Ic>+Aþ 8[0OG(5ÿÿÿùhÕ":nÿø¹%8²!+°/´++°6/´+° /°3´ ++°9/°Ö´&+°&± +´+² +³@ +²  +³@ +±:+± &´#-$9°³!$9±6+´#$9± °9017"&54632>7!5!##&''327.#"ÝPny]cn-ýïÁp! C A3³ .% jZ#  7H7rSXky—EAA!-%3,3M:3"®UDÅ'9 ˜$ Jÿóˆ#²+°/´++°/´+°/°3´++°2°$/° Ö´+²  +³@  +°±+±22´+² +³@ +±%+± ±99°±99±°9°°!9±° 901%2675!4.'#532!53##5#"'763%Tþð )@E ikY ȇABc›L%³0“@Z=1 A··AýÀ®54'#53232>54&54632Ú'*ʉA$0EA 3:p <>2SDHJ&)4)!¬ AýÀ"Bd#¸'KANE.ÎJ3A'+c 'TZz.}ÿ÷›'0¥²!+°%/´++°//´+°/´+°/°3´++°1/°Ö´+² +³@ +°° Ö´(+°± +´+° 2² +³@ +±2+± ¶!%+-/$9±/+µ#(-$9±± 990174>327654&#!5#5!!32#&'#"&7327&#"<>*>\4+B:þáM¤ýê÷/E"_6,E")Y^D]@;*L;KHY¯+)265-"¶AAv/.NM1mH4SL8(?Lÿú¼!”²+´++°/°3´++² +³@ +° /° 3´ ++°"/°Ö´+°2² +³@ +°±+°2´+² +³@ +² +³@ +±#+±±99°°9±°9014632!5!5!##".'#"5!32>F3#<þÂ’pZ1MG*9#ØþÄ]O!;1S.?6ÔAAþsOd?zY~~„f3ÿø &.7Ó²+´7++°'2°//°.3´++°/´+°/° 3´ ++°8/°Ö´+°°3 Ö´+°/´3+²3 +³@ +°±7+´'+°'±+´ +²  +³@ +³+ +´+±9+±3°%9±7°9°'±99±/7±99°±%99°±99014>3!5!5!#!"632#".54>3&>54&'#;$ 6þ ¨ˆþ-t+™o&tnrn,  "54&#"#"&54676'32>7Â;4=‰q86:;kb 2 ; (K'' &% )3!W- g\'"'#(l*";%™=KAAATW2OQ? &8, - 3M  ±KA!4%ÿúÿý2°²+´+°/°'3´+°/´+° /± 33´ ++°3/°1Ö´+²1 +³@1 +°±+´+² +³@ +±4+±1±,99°µ'$9°³$9±°9°±%99°°-9°°19°°901;5&'#5!#!"3!#327#"&'.'".54¦[ ‹þöK l•‰þÃ>2Oû+†#! ;+)X  @=;xx7AAA·$,@‘ )70  hÿùÿý“`²+´+² +³ +° /° 3´ ++° /°Ö´+² +³@ +² +³@ +±!+±°9± °901%#"&'6%5!5!#"32>32zM>àk<þ1š‹&,SAOK#)¦/#>"! euCç!ƒAAà )G/3Lÿöÿþ¡ )ƒ²+´+°/°3´++°*/°Ö´+² +³@ +°±+´ +° ±+´&+²& +³@& +±++±°9° ±99°°9±²&99901%4&#"32>".54>75!5!!wWPuÈ2K, œ\VT3/[<þÚ«þ»4(5,0A1þ 4$ÿ÷ÿú›".¸²+´#+°'/´+°/° 3´+² +³@ +° /° 3´ ++°//° Ö´+°2²  +³@ +°±+´+² +³@ +² +³@ +°°% Ö´+±0+± °9°´#'*$9±'#±99±°9014>32!5!5!#!632#"'&'#"254#"77%þ!¤…þ›(%EaG

E$9±³<>$9°³?@$9°Eµ"(+9B$9°5²-3999±0%²99901#".'32654'#72654&#"&54632632#"'7654&#"%5!È4'911('   ýóÊH&;$6 .*>,C"<þ®6) 1&,)#.$&<4G:)1050*0! Ÿ33ÿíÿìç.LT.² +´+°/´+°=/´B+°)/´M+°J/°R3´5+°0/°33´1+°U/°Ö´+°±&+±.Q22´K+°42³K&+´#+°#/´+²# +³@#0 +°K±?+´@+°@±+°E2´+°:2² +³@3 +±V+±°*9°#²),M999°&°!9±K²  999±@?±99°°=9±²!#999°²%&999°=°9°B°Q9°M³:?@G$9°J±,*99°5°.9012#".'732654&#"&5475.#'>75#5!#2#"'73>5654&#6'25"7!0 "D-7a:#32M*.;!"+ 4Q( PTýúÌ'; 6&$ 5$Ð1@ u!0'*2"B_OGP85)9+/5*33.'*';)#²oq7ÿÙÿO£.SWݰ"/´#+°I/´9+°)/´4+°T/´U+°X/°1Ö´,+°,±S+°2´R+°M2°R± +´O+°& Ö´K+°O±F+´=+±Y+±,1° 9°S@  "#)./4$9°&° 9±KR°79±FO³@9BI$9±#"³ CDM$9°Iµ&,/=FK$9°9±1799±4)²99901%.#'67.'32654'#72654&#"&54632632#"'7654&#"#5!w#) JR, 1.(!   *433þbÊ= >!)0%,*@,G"Aþ®4) 1&,)#.$&<4G:)1050*0!&;:#þð¬33ÿíÿç.Ya:°*/´+°L/´Q+°8/´Z+°W/°_3´D+°?/°B3´@+°b/°Ö´+°±5+±=^22´X+°C2³-X5+´2+°2/´-+²2- +³@2? +°X±+°2´+³O+´N+°N/´O+°±' +°T2´ +°I2² ' +³@ B +±c+±°99°2´8;Z$9°5²0999±X-²$/999±N±*99±O°L9±*²45999°L°9°Q°^9°Z³INOT$9°W±;999°D°=9012#5.#'67.'732654&#"&5475./>75#5!#2#"'732654&#6'25"A K !0 3S+!"+.Q132M*.;!"+!/U( PTýúÌ'; 6&$ 5$Ð1@ u !0';þí2,0#! FVGGP85)9,05*33.'*';)#²oq8ÿÙÿF£._cA²+´+°° Ö´+² +³@_ +²+°/´'+°./´/+°U/´E+°5/´@+°`/´a+°d/° Ö´+°±=+´8+°8±_+±*22´^+°[2°2 Ö´W+°^±R+´I+±e+± ± %99°=° 9±28@ ',.:;@$9±W_±CY99±R^³LENU$9±°9±° 9°'±99°.¶ *LN[]$9°/³,OPY$9°Uµ28;IRW$9°E²"=C999±@5²#%$99901.#"#"&547326325#".'32654'#72654&#"&54632632#"'7654&#"#5!¤EOLZ.EG 8 46371('   *44þ5Ê…) M@!4 .<) + .*>,C"<þ®6) 1&,)#.$&<4G:)1050*0!&;þ¬µ33ÿíÿç.NVR²D+´9+°G Ö´6+²I+°L/´.+° /´%+° /´O+°+/°T3´+°/°3´+°W/°<Ö° 2´A+°A±+´+² +³@ +°± +±S22´,+°2°,±3+°I2´2+³#23+´"+°"/´#+°2±( +´+²( +³@ +±X+±A<² >999°³9?DO$9°°9° ±699°,°G9°"±.L99±2#° 9±LG´<>A$9°.°9° ° 9°%°S9°O³"#($9°+± 99°°9017&54675./>75#5!#2#"'732654&#632#5&#"#"&5473263254#"'25"Ô&+$*W( PTýúÌ'; 6&$ 5$33)1@)L--" 6 '-7z1@ uw ?25*33.'*'; )#²6&þî*#F2$6 / *"µ(<àq8ÿóÿí.ah²+´$+² +°/´+° Ö´+°*/´Z+°L/´Q+°8/´b+°W/°f3´D+°?/°B3´@+°i/° Ö´+°° Ö´ +° /´ +°2° ´+°/°±e+±4=22´X+°C2°X°- Ö´2+°2/´-+²2- +³@2? +°X±N+´O+°O±a+²'T222´`+°I2²`a +³@`B +±j+± °;9±2 ´8:b$9°e°09°-°9°X³$/$9±ON±*Z99°a°L9±°9±$±99°*³ 02$9°Z±499°L±599°Q°e9°b³INOT$9°W°;9°D°=901.#"#"&547326325#".'732654&#"&5475.'"#'675#5!#2#"'73>54&#632#25"zCOLZ.EG<643;5^=%32M*-<%+1I(B‹ýúÌ'< 6&$ 5$ &34þæ=<vÄ' M@$1 *;) *“&>[SGP86(4+-54633.'*';)#²&>&þ¤iq7ÿÝÿzT.7>á²+´ +°/´+² +³@7 +°)/´.+°8/°43´+°!2°/°3´+°?/° Ö´+°±+²8222´6+° 2²6 +³@ +°6±1+´&+²&1 +³@& +±@+± ±99°´ ;$9±16±)+99±² 999±)°>9°.°+9°8µ&,;$901&#".546325.#"'675!5!##"'72>54&+#0?^&+>,RH›@z™þ®wò9F0/")( \22œ)‰7‘! *3&#Cc-/‡6`*.33.(L1#B%'7Lýà JX/ÿÝÿñM.8@².+°6/´5+°1/´+°/´+° /´9+°/°>3´+°(/± +33´)+°A/°Ö´3+²3 +³@( +°3±+±&=22´+° 2°±+´+°±+´+°±.+° 2´-+²-. +³@-+ +±B+±²156999±°9±56° 9°1°9±±99± ±=99°9³$9°±!#99°°&90165654&##2#"'74635.#'>75!5!##4&#""&'25"^*/5Y©1[%'&$¨-/W(PEþópV3‚B#''P1@ u3 "8Ï@2“T=8;š$!"15&33ýö@ )&õq8ÿÝÿ¨T.ELâ°7/´+°. Ö´+². +³@.+ +°/´#+°F/°)3´+°2°/°3´+°M/°CÖ´:+°:±+²+F222´*+°2²* +³@ +°*±&+´+²& +³@ +±N+±:C± 99°µ .>@I$9±&*± 99±7²999±°L9°#° 9°Fµ ! I$901726325.#"'675!5!##"'72>54&##4&#.#"#"&546x4& (›@z™þ®wò9F0/")( Z72,'(#-+´H+°>±$+±@G22´#+°2°#± +´+² +³@ +±M+±7° 9°0´(.9E$9± #±99±$²%+@999°³(-.$9°A³0>$9°5±7B99±9K°9010#4>74'#5!##"'73254##5.#.'474.#"725.'#7#3c6 'jçþ1"#4"  ‡3Q*  R+&3)?!? FDúS3 n 33Y)1&/ &EþŽ|5F 1#2 V$878¦L=0)ÿÕÿx¼.HUZ*°/´ +² +³@H +°:/´?+°O/±#F33´Z+°02³ZO+´I+°+/².SV333´,+°[/°$Ö´!+²$! +³@$+ +°!± +´+°±+°S2´L+´W+°L±H+²NV222´G+°/2°G±A+´7+²7A +³@7. +±\+±!$°*9° °(9°²IT999°µ $9±AG±:<99± °9°:±N99°?³<$9°O³7=L$9°°!9±IZ°(901&#"&546325.#.'474&#"#4>74'#5!##"'73254.##25'.5#7#3‹Gg6)KE#3O-Q*  RJ'6'jçþ1"#4"  ,(3÷BV? +">úS3 ?7/G'6:9[5F 15? !33Y)1&/ & þ Um@8¦U)0)ÿÕÿà§. )-dQ°G/´B+°=/´+²= +³@=9 +°R/´X+³XR+´%+°/°3´+°-2°3/³ *6$3´4+²34 +³@3` +°e/°cÖ´]+²c] +³@c3 +°]±J+´@+°@±+±*L22´+°2°±+´!+°!±9+°2´8+²89 +³@86 +±f+±]c´ 2U.$9°Jµ +ORX$9±³=BDG$9°²%(999±BG±E99°=±DJ99°°L9±%R°9°²'OU999°X±(99°³!]c$9°± [99°3±.990125.'#2654&#"2#632#"/'#3'.'#5!##5.#"327#"&547.'#"&5463.'#"&54 '/"/<3M >) OS¢#C  fR<ùkÒI3m+  "4!&&+'Û!A)'‡*? ¹ Âi™=9)!* 5 Ä< 33ýå8'^ /)0 -)#!&ÿéÿ»….!;Aʰ/´+² +³@ +°/´"+°./´3+°/±&33´+°B/°AÖ±22´:+°'2²A: +³@A +°:±7+´++°+± +°%2´ +² +³@  +±C+±7:³".0$9±± 99±"µ%:$9°.°A9°3°09°µ!+19<>$901675!5!##5.#"#"&'732>7&'2##"'732>54'6!„†þ¾œS395%,#5*!/ N˜S> ¢BG # V._a]9idR'33ýÀl0#)3@ ˆ,„„R.A/<'þì  <Z'ÿò߇ Ká²+°03°9/´%+²9% +³@9< +°F/´+²F +³@FI +°/°3´+´+² +³@ +°L/°7Ö´(+³ (7+´D+°D/´ +²D +³@D? +°(±+±22´+°2² +³@ +±M+±7D±!999±9²(.1999°%±#?99°F³ !B$9°±99°°9014&#"632%4>32533##54&#"632'>54#"#"&5467654#"#"&Zx=UBSB,þ´>*y>3RR3S>`D . %' O$U:)E!?;|eL 5—+1!rÓY3þgPlh"% $)+&9G   .A¼²+°:/´$+° /°3´+°2°B/°>Ö´ +° ±7+´'+°'±+°2´ +²  +³@  +° ±+´+° Ö´+±C+±7 µ$-/<$9°'°9± °9±± 99±:· '.<$9°$³ >$90125!!67&547'5&#">32'>54&"#"54>yPG.¶þ}e•,7ƒd-Iq09"*+ #& ! J8-.'…3çƒ!wCq8Nmx7³2r²<6& $'! $   -D+1ÿÁ8{GQ°"/´H+²"H +³@" +°/´+°D/´3+°,/° 3´+°2², +³@ +°R/°Ö´/+°/±A+´6+°6±+²%K222´+± 22² +³@ +°±+´+±S+±/°F9°A@ ",#3=?EH$9°6±:P99±°9°±99±H"°9°·#=>?L$9°´ %&9:$9°D²6AF999°3±/99°,°9014632533#632&5474&#"#5&#'675.#">32'654&"&25\GaJ1´²@23Cw2K¡"0!?)+ (  '$fJ 9¤,g-* ¥6Pn¾M3½UQUbCdE) þ¸Am@H< -03-1 (!  #"U' ) Ä:­ÿ%8{MW]°/´[+°I/´<+°*/´+°/°83´1+°62²1 +³@M +²1 +³@14 +°^/°.Ö´+°±'+´+°±M+³ 3NX$2´L+±5922²LM +³@L8 +°L±D+´?+±_+±.°,9°'@  #%+1[$9°± 99°M±U99±DL°I9°?±32'654&"&54632533#632&5474&#"#5'=2SU*!9M7X2K¡"0!?)+ (  '$fJ 9\GaJ1´²@23  Jx2,f¨-0:.5@H< -03-1 (!  #"U' ) =6Pn¾M3½OWqFCdE) þÝ   º¬-+9+ÿÊï{L² +²+²#+°/´'+° Ö´++°D/´8+³58D+´G+°0/°3´+°2²0 +³@ +°M/°$Ö´+³3$+´J+°J/´3+°±B+´;+°;±-+± 22´ +°2´+±N+±3²5?G999°B@ !'08>D$9°;°9°-±)99± ²$999±+±)-99±G'±>?99°D±;.99±85±3J99°0°9012533##54#.#"#"&546326325&#"32632'7674#"#"&546Å9M.3CC2#- .%$ -0ù›7#)"!E( 6)%1^+ÿ–ï{=ï²+´+°/´+² +³@ +°5/´)+³&)5+´8+°!/°3´+°2²! +³@ +°>/°;Ö´$+°$±+´+°±3+´,+°,± +±22´ +°2´+±?+±$±&899°±/099°3·!)5$9±±99±8±/099°5±,99±)&±$;99°!°9012533##5&#""&54632&#"32632'7674#"#"&546Å9M.3CC3=_%"/>,.H$V^!F O",E**8+ N  W15HÇM3ý›<‘ *2(#C210›7#)"!E( 6)%1^+ÿoŽ{:@ ° /´ +°/´;+²; +³@: +°&/´+³&+´)+°/±7?33´/+°52²/ +³@/4 +°A/°,Ö´+°±$+´+°±+°22´;+± 422³;+´ +° /´+°;±:+°>2´9+²9: +³@97 +±B+±$µ !)/$9±;± 99± ± >99°;°9°)±! 99°&±99±±,99°°29014&#"3"&547&#"32632'7674#"#"&54632533##'32#R!  *&V^!F O",E**8+ N  WC9M.3âC3l72l[? (&"=›7#)"!E( 6)%1^5HÇM3ýtÆ7ýÿçÿl¿.9ײ#+´$+²&+°/´*+²* +³@ +°7/´+°/± 33´+°:/°Ö´+² +³@ +³'+´ +°±+± -22´+² +³@ +±;+±'°9°°29° ± 199°·#$*37$9±#²'-.999±7*³ 12$9°°9°±990127#'47#5!##5&#".546325./7##"&²& !&')Þ3fOØ=3=_%&+>,.H$„JN&H“ $ #a0 133ýqP‘ *2'#C21$AZ (R8ÿÕ.>DR²+°/°?3´ +° °/ Ö´0+°/´E+°9/²747474+Ñ' ;Wiªœ$:/3  ~#k%3'4 *nHU ³cK:d c 2Õ'i ~x50%"*þì2  3FU&$!33Õ4F“±&ÿóÿ™Y.YbkD²+´+° Ö´+°W/°]3´L+°'2°L°. Ö´/+°E/´c+°74#"".54>7&'#5!##"'#'654&##5"72654+];9QH* ?A *)5  [D k&3"  " -‹fU(:Xi«œ$173†K;)á c 22( W6%0 ,<) +!  34 U&   33%i ~x60$0þ…AH“ æ %ÿòÿýÛ._hty‹²+°M/´W+°]/°"3´F+³F]+´+°/°83´ +°y2³@ +´`+°`°i Ö´3+°/²ru333´+°2°´e+°z/°RÖ´S+°S±+´D+²D +³@ +°D±Y+°c2´K+°; Ö´6+°K±0+°r2´l+´v+°l±+±nu22´+°2°±+´+² +³@ +±{+±;D@ @IMW[]`eg$9±0K´"'3is$9±±99±WM°9°±%n99°]³'KY$9±F´-0l$9°´D[o$9°@°I9°3°>9±` °B9°i°R9°²Scg9990147#50!##"'73254&##5.#&'4>?4&#""&=47#"'3267#".573254'#"&72654#725.5#7#36Ñéþ$+73#  =J3Q* & C<$ %7#_5_>%34b6U)2)5š'(- ¬=[@?4&#"725.5#7#3ªA =?W 5_>%35b5*2)45Úñþ*:93#  ‡3þ~())$y$ ":$_,C?: 38Q* & C<4=[@54'"'#"'3267#".573254'#"&72654#Œ6Ç3f *(<44Ld3TT3±87p4(0 %7#_5_>%34b6U)2)5š'(- ZMT3A4?JJ>`ÝV3þR-…1C*5)!#2940_yHjv1 ;ŒiI*=9“%ÿçÿúé1_g²9+°T/´+°/´ +°%/°3´b+°/²'`333´+°h/°Ö´ +² +³@ +° ±D+´6+°2°6°" Ö´e+°e/´"+²"e +³@" +±i+± °W9°D@ '*1RTX`b$9°e²?%g999°6³9>HM$9±T9±8@99°³6ADR$9°³HIWX$9° ´1LM$9°%³4O$9°b±-399°²"*999017>54&#"327#"&5467&'#5!##"'#67.4&54>7#"&'732654'†)58"%(2 k#@64 ( =MHk-4    $O3="-}$ÒB">' 3!+22 %N!@%2kyHY+    R=.'; -+ ÿíû.5>K² +°#/´-+°3/´+°/´6+³@6+´+°/±G33´+°2°´;+°L/°(Ö´)+°)±+´+² +³@ +°±/+°92´!+°J2°!± +°F2´ +² +³@  +±M+±/¶#-3=$9°!±99° ²999±# ° 9°-°F9°3²!/999°±C99°±199°²B999±6@²A999°´()9=J$90147#50!##5./7#"'#"'3267#".573254'#"&72654#27#6Ö<4„MN G%7#_5_>%34b6U)2)5š'(- ¿P!M82ÞZMT33þA>] (R@#2940_yHjv1 ;ŒiI,=9“%/ $%4aÿòÿ™û.-6CdF²+´V+²V +³@- +°° Ö´Y+° /´+°!/´L+°F/´.+³8.F+´c+°'/±*?33´(+°(´3+°e/°Ö´+°±$+´J+²$J +³@$( +°J±+°12´Q+°B2°Q±-+±>[22´,+²,- +³@,) +±f+±J@  !&5FOS$9°Q±D`99°-´V_ac$9±V°[9± Y°\9°±>S99°!²Q_999°L±;`99°c±$99°F²:JO999±.8²9DH999°'´15B$901.#"#"&'#".57;67654'#"&547#5!##2654#27##"'3267326325./7#"‹DN EW5_>%34b6  .)2)56Ñ <4þœ'(- ¿P!M82Þ*%7#_HD? 2 46„MN G2' ?6Hjv1 ;Œi& !,=9+MT33ýž)%/ $%4a#2940_U, +0>] (Rÿóø."Nÿ²,+°":#Œ6Ñ84`#$%T7%#O5_>%34b6U)2)5Â%963Màƒ$3 !#0 9MT33þ­‚ .!O,B%Hjv1 ;ŒiI,=9ÿèÿnP.1:S:°/´+° /´+²  +³@ +°/´)+°//´G+°A/´2+°/±;33´+°´7+°T/°$Ö´%+°%±+´E+²E +³@ +°E±+´+°±++°52´L+°=2°L± +°R2´+² +³@ +±U+±E¶)/9CG$9°´-27AJ$9°+±99°L´ ;N$9° °P9± ±R99°°P9±)±N99°/±+L99±AG³-EJ$9°2°C9°´$%59=$90147#5!##54&#""&54>3&'#".573254'#"&72654#7#"'3267y6ÇhC3]+ '+(+5_>%34b6U)2)5š'(+"ˆ,*":#_,ZMT33ýs;Z(* / Hjv1 ;ŒiI,=9“%9 * #2940_7#,.ùÿëª.#17¿°/´$+°/´+°/´7+° /±233´+°8/° Ö´+°32²  +³@ +°± +°22´$+°2°$´+°/°$±'+´+²' +³@ +±9+±°9±$ °9°'°9±²!'999°7±,.99° ²1999017265&'"&5#5!!#"&=2654.'&/#–2qoJ0b¿þÊ:O#ºG"`¶&£  \4À i7k}=]þû$35!m33=H  JÆ ‡3C£8 $… 3H ÿçÿµ+.2=EK° /´+³@ +´ +°/´3+°C/´F+°/´-+°-´8+°%/±(G33´&+°L/°#Ö´>+°H2²#> +³@#% +°>±C+°F2´<+°)2°<±6+´+°±+´+² +³@( +±M+±C>° 9°<² 999°6°9°°9°°09±@°9±3°9°C±<99°F°9°°69±-8°E9°%²*;I99901.#532654.'#"'#"&5#5!!:322654#"&'3265&'5#Ÿ_A-[/7"Da{=GVx _1u?0bDþ=WFNþæC+.ù1rrF¸¸e2]:(0$7<'4[2 @]Eg6 m33$@ZK†z$~<]<£ /Hÿçÿ +.@KSY°/´+³N+´$+°/´A+°Q/´T+°)/±,U33´*+°Z/°'Ö´L+°V2²'L +³@') +°L±Q+°T2´J+°-2°J±D+´+°±@+°2´?+³?@+´4+²4 +³@4, +±[+±QL°$9°J²!999°D³  $9°±799°@²1999±N°79±A°!9°Q±4J99°T°9°)´1DIS$901.#'67򂂮.'#"'#"&5#5!!32&'#2654'.'3265&'5#G  JP, AYlnGVx  _1u?0bDþ=gGN_A-Z25"!/4ÂC./ù1rrF¸¸e   > *0C0<4[2 @]Eg6 m33)@D2]9*/$$$ðüK†z$~<]<£ /Hÿçÿ7+.JT\bW°/´+°° Ö´+°/´+³W+´.+°)/´K+°Z/´]+°3/±6^33´4+°c/°1Ö´U+°_2²1U +³@13 +°U±Z+°]2´S+°72³SZ+´ +° /´+°S±N+´&+°&± +´>+°J Ö°3´I+²IJ +³@I6 +±d+± U±.W99°° 9°S³+$9°N²)999°&²A999° °;9±±F99°±EH99°.² 999±W² A999±K)°+9°Z±>S99°]° 9°3´&;NR\$901.#"#".547326325򂂮.'#"'#"&5#5!!32&'#2654'&'3265&'5#xC L55 .32>32#"&'#4&'#&'%4&#"32654&#"5326if0C G™QN5+'W@5o "#!)=b*7%B3"- ,0g*^3=c}o Hà$5a/W2% $-Õb+ ú@33@?%  S x$ )!`QE]A' 4&7-gBÈO-yQÞ xE67"+3%ÿåþ³±.,5:°/´+°/´-+°/°3´+°6/°Ö´-+°2²- +³@ +³-+´ +° /´+°-±,+°2´++°+°( Ö´1+°1/°23´(+²(1 +³@( +±7+°6ºîtÂt+ °2.°4À±%#ù°"ÀºñàÁ”+ °"³#"%+³$"%+ºí4ÂÓ+ °4³342+²#"% Š Š#9°$9²342 Š Š#9¶"#$%234.......µ"#$%34......°@±-± 99°,² 999±-²*599901.#"&54632#"&5#5!!#2>54.': +="6(K=+4K/+n+cÌþÊ=2-* 4¿#bDLgþü*9#7 /G =7<09N Ô33=&(ýÏ‚Yi ÿæÿù$.#uS²:+°]/´m++³m]+´X+°/´Q+°B/°q3´2+°2° Ö´s++°/´.+°(/°+3´)+°v/°$Ö´+²$ +³@$( +°±o+´!+°!±+´O+°O±+´U+°U±>+´7+²7> +³@7+ +±w+±o¶',]ms$9°!°Z9±O±.99°µ0GSX$9°U°F9±7>³2:@B$9±X°<9°m´7>UZ$9±Q±!99°s°o9°B±OS99°³5@H$9°2°I9±.´$4M$9°(³0ef$901%2654'"#".57"'327467#5!!327327.547#".'327#"'#".'&'73254'#"&ã( #~4 $7/%:þ®)¼>ýæ‚! @l7J 22 7$:@C1cF 8!;& 3/L$&B‰!  1#4`M8>.K 33GQ =Gf%=#`O (!+(Z2Bm#-!@z)2K..M"6ÿæÿ7$.)‚q°j/´z++³zj+´e+°/´^+°O/°~3´8+°8°" Ö´€++°/´4+°./°13´/+°ƒ/°*Ö´ +²* +³@*. +° ±|+´'+°'±+´\+°\± +´b+°b±K+´>+°>°A Ö´B+°B/°3´A+²AB +³@A1 +±„+±| ¶$-2jz€$9°'°g9±\±499° @ 6FGT`e$9°b°S9±BK°O9°>±8M99±e°I9°z´ >Kbg$9±^± '99°€°|9°O±\`99°"³;MU$9°8°V9±4´ $*:Z$9°.³6rs$901%'2654'"#".57"'327467#5!!327327#5.#'67&547#".'327#"'#".'&'73254'#"&„,J¤( #~4 $7/%:þ®)¼>ýæ‚! @l7. 3Q,!K\2 7$:@C1cF 8!;& 3/L$&B# á!  1#4`M8>.K 33GQ =,J7È3 *0K.`O (!+(Z2Bm#-!@z)2K..M"6ÿéÿG{.QVܰ@/´ +°/´O+°H/°K3´I+°W/°.Ö´/+°/±D+´ +²D +³@DH +° ±!+°R2´ +°2°4 Ö´+° ±+°2´+² +³@K +±X+±/.°,9± D°&9°!@  %(16@GLT$9±²O999± @°69°± D99°O± 99°H²./99901%47#"'327#5&##54&/67.5332654'#".5467#5!!327³6 @.2J , ‰!20^?1#<9S(1°$;  ,#2æ’þ¯S;?·C.N!–ˆUp+' 07S)’ r"W2þºL7© BS8+CMg9þÝ%*)  ,,*7*33!3þ»# +ÿÍT·.+?HÔ°/° 3´+°/2°/´F+°62°F´3+°>/´+°2°#/°&3´$+°I/°Ö´+°±+´D+²D +³@# +°D±1+°;2´+°2±J+±1D@ "',68>@$9°°9±² 1999°3°9°F±99°>µ,*@D$9°°9°#°B9012#"&'#"&'732654'#"5467!5!!63254#"'32654&#"&'32696)'€P S,]y0dO(7 =/e5þ÷êþz.M<^06@ %1'Bš/D61ÀK65k@$2É– ‰­D#/~&U332V`šCY5:2B99°±2C99°±4T99°¶%(0HQ$901%#"'#5./7&#""&54>32537632%32654'#"'732654&#"iF$cF. & $*(æ"P*;# )/+7654&#"&54632>32#"'24&#"3254'#"'7326&'32qzƒ/34+44(#ve A1,?%c- @!<^H&4.1.&0"((.l2&?M5E/Q*  )Ø|- *‘O!@r''' E4 *A!% ,B)2+5;HB=!7)-"?9–LK6m†( (7ëC)$ ÿÇ!0UkE°/´+°/´+°T/´Y+°_/´d+°i/´;+°& Ö´1+°l/°Ö´+³.+´)+°±!+´+°±+´ +° ±O+´H+°H±[+°g2´B+°>2±m+±.°9±)±,99°!°+9°±&199°@ #56V$9±O ±ab99°H·;KRTY_di$9°[°]9°B³@DFJ$9±³ HO$9°±99°T°F9°Y²!D999°_³B[$9°dµ+,@]a$9°i¶).5#>V6$901327#".'32>4'#"547.#"&54632>32&'&5467#"'3254'#"'732654#"> +!- & 5T22 h; !# ,Ia $8&P;+*8#>"#! H$%"W-#<-* .*)[yV/) N*0sŽ *B_1‚!%9 '.1X'(+%%. /^6?(W#)++¦C.  - #8!ÿ1ó- $i?°?/´P+³ P?+´/+²/ +³@/2 +°P°M Ö´B+°/´+°/´%+°W/´b+°j/°EÖ´J+°J±_+´Z+°Z±S+±722´+³!#5d$2°± +°32´2+°2±+°2´,+°(2², +³@ +±k+±JE°G9°_±BH99°Z²M;]999°S¶:=?P\b$9±2µ %/$9°,°*9±B/±1=99±M ±S99±P²,999°@ !#*EJZ]$9°µ(GH_e$9°%°d901%7'72654'#"&5432654&#"2#"'#4'#5&/67&#"#"&547326324&#"&54632>°L7U.h,}1 )9d_80:)/4%!*439?[0<€?> MDT$,A?IP  .m &—;.))&E! Kà*x# º#< $ˆ t\A-7/>+5þßU.£F\9,/oS&C8M; Bw. '6:Œ>f$ ÿàÂ'E°/´ +°/´6+°;/´@+°/°23´+°02°F/°#Ö´)+°)±+´4+²4 +³@ +°4±9+´C+° Ö´+°9° Ö´0+²0 +³@02 +±G+°6º4À#+ °+°,À± ù°À³ +,....³ +,....°@±)#± %99°± &99±4¶ 6;>@$9±9°9± ±99°6°9°;´ =C$9°@°>901%#"'732654'#".=#5!54#"&5473723!32654#"'632P#?*Œ\.Lq!?6.)‚~[˜5G!* aš3D.þÓ#;T *")ð)/&-ݾ( (*! õ35 <1) $ / E3 3ò7q9-$!B2Hÿôÿ;ê'`U°/´+° Ö´+°/´+°%/´J+°O/´T+°,/°F3´-+°D2°a/° Ö°72´+´=+°±*+´H+²*H +³@*, +°H±`+±!22´_+°M Ö´W+°1 Ö°.3´D+²D1 +³@DF +±b+°6º4À#+ °?°@À±4ù°3À³34?@....³34?@....°@± ² 9999±*=² :999°H°9°`@ %JORT$9±1M°Z9±°9±² 999°%² !999°J°#9°O´QWZ$9°T°R901.#"#"&547326325#"'732654'#".=#5!>74#"&5473723!32654#"'632#g>8RF* 7I , .3(:\/KrD6.(–\˜5G"* `›4B0þÓ#;T (!")3‘( V6)+ '30 *…ݾ#%* *" õ3 5 <1+ $ / G1 3ò7q9-$!B2L'þ®ÿÇÿo 'I<° /´ +°/´+² +³@I +°)/´+°/´"+°./±F33´/+°D2°J/°8Ö´=+°=±,+´+², +³@,. +°±+´+°±+´%+°2 Ö´C+°%±I+°2´H+²HI +³@HF +±K+°6ºùÀ2+ °?°@À±5ù°4À³45?@....³45?@....°@±=8°:9°,°;9±² )999°²"999±2± 099°%² 999± ±99±±%99°"° 9014&#"3".54632!32654#"'632#"&5#5!654'"&5473723##«Q"    5'73þÂ;d&!"-:c4,'d[[š3G!*a™6AµB3[@ (!/7ýþ´6ŒD$"1'6vS?'O3 2 ?/) . F63ýtÿâ5n{DO6°4/´=+²=4 +³@=7 +°/´M+°+/´+³(++´+°/²I333´+° 2² +³@ +² +³@ +°P/°7Ö´8+°8±+´K+°K±@+´/+³/@+´G+°G/´+°-2°/±&+´+°±+° 2´+° 2´+±Q+±GK³4=M$9°@°B9°°I9°/±+99°&´"#($9±=°"9°M²#/@999°+°B9°(±99°°E9°±G99°° 901%"&=!5!2533##&#"2632'7674#"#"'#"&'332654'7&547#326!#þýb9N-4BB4T`"DL #,F))6+ T 0E:qu30M054''#"=#5!#3267#"&'#".'732>54mþ¿7730)%&7 #Rú^1à~ú S-6aEH_1W/2MI</5· 0 $ȇ 7975e;"2)%:(7€#63¡33¬T]4BzH^0IJj þÎ!0)"ÿÙÿo¬.;ò° /´ +°/´+² +³@; +°!/´(+²(! +³@($ +°0/´+°5/±833´6+°/´.+°/´J+°4/´9+°*/´+°'2°E Ö´ +°M/°Ö´G+°G±+´ +° ±A+°2´++°+±1+´;+° Ö°3´&+²& +³@&) +±N+°6º;À$+ °#°%À±ù°À°#³$#%+²$#% Š Š#9³#$....³#$....°@±G³ E$9° °9°A°9±1+²79>999±.°A9°J°;9°4±1699°9³7BG$9°*°901#".54>3253>74#"&5473723!32654&#"'632#"&=4&#"327 % :&#? ÷[—8E!*4”/þÔ@b  "'KˆC/(h[! , 5#,6&.,c 5 ;1)# w 3þ™ŸI %"nO±=(Ös_(& ÿh'gœ²+´+² +³@f +°° Ö´+°/´V+°*/´&+°\/´a+°R/´9+°O2°" Ö´4+°h/°/Ö´$+°$± +´+°±C+´H+°H±+°82´S+°S±g+°2´f+³Yfg+´c+°f±= +°:2´N+²N= +³@NQ +±i+°6º;À$+ °K°MÀ±@ù°?À°K³LKM+²LKM Š Š#9³?@KL....³?@KL....°@± µ "'(*4$9±HC±E99°±F99°S°9°gµV^_$9°Y±\a99±°9±V± 99°*´ e$9°&±Yc99°\°^9°a³$/_$9°R°8901.#"#".547326325#"&=4&#"37#".54>3253>74#"&5473723!32654&#"'632#æD>/E#.EF <56;5/(h[B  % :&#? ÷[—8E!*4”/þÔ@b  "'K(3c' ,.*+ *;) +›>=(Ös_M- 5#,6&.,c 5 ;1)# w 3þ™ŸI %"n8Fþ© $U1?Õ°"/´9+°/´1+°/´+°° Ö´,+°@/°Ö´/+°/±%+´5+°5±+´+°±)+´2+°2±<+´+²< +³@ +±A+±5%´',1$9±)³ "9$9°2² 999°<°9°°9±9´%'5<$9±1¶ )/2>$901".546324.5473##"&547654&#"3732654'&y &E3lB99<8Í«3wW6c«a*#)ZÅ[c2$ET" * 8%327¯ %N?¿i4/7Q,/ %&)*- $  "/(" ='(5h49K­ "KmR;& # XKC<$ .E% 1 )FDZ,!®.;¸°/´$+²$ +³@$ +°./´ +°4/´+° /´+°54'#"&=&#"&ž7*.5Lþç`K .U6RƒL33 >GV80I$S%#40!(Ÿ%7;n3ÄT2l->2$Gd_&a“M/ *<2#*@3;[ÿöÿh¯2]²+´+°° Ö´+°/´#+²# +³@# +°*/´0+°E/´A+°:/´M+°Q2°^/° Ö´+° Ö´+°±H+´=+°=±]+±&22´\+°T2²]\ +³@]- +°\´4+°4/±_+± ° 9±H° 9±]=@ #26BEMQ$9±\4°W9±°9±#² 999°*³ &Y$9°0²(2W999°A²4CT999°:µ67BHP$901.#"#"&547326325#"32654'#"&54632654'.#"27#"&54>327#vCI L[.DG 2 46%3¿i4#6K&/ %&)*- $  "/(" ='(5 %3c' LA(- .;) +­ #`v\ & # XKC<$ /E% 1 )FDZ*4þ·1ÿ7².FU°+/´P+²+P +³@+$ +°P°S Ö´(+°I/´=+°/´+°/´+°/´+°V/°6Ö´7+°7±0+°2´M+° 2°M±+°2´+² +³@ +°±$+°G2´#+°#±B +´+±W+±M0± 299°´ +KP$9°±=I99°$³(S$9°#±D99±P(°U9±=I²0GM999°²"2K999°±B99°µ D$9°±679901%"&=&#"&546325!!3267#5.#"#".547.'332>54'#"'32632¢(4/!(8)02LþèdK3C K55 ->3 :FT?/I$SM4FmQ 325!!32654#"'632i 3cZ. &"2(2F`þÔ (w ,.ƒ/7Ökc)%- 5",@ H$Ÿ3þq„^&"!<Yº?ÿrö‘:»²%+´)+²++°!/´1+²!1 +³@! +°/´+°8/°3´+°2²8 +³@ +°;/°,Ö´#+° Ö´+°#±+±422´+°2² +³@ +±<+±#·')18$9±!%±,499±°9°8² 99901327#"&54>32533##5.#"37#"&54>3254&#"r,  )F>)3& 3__3f[B L!1)1GY$-H‰>3^+1:('Êc3ýwª!icM/=B+@ H$ê+w4?ÿo{‘<ô°/´+°/´+² +³@ +°)/´$+°+±!³&)1$9±±99±±99°°9±$)°'9°<²&,699901%2#53##54&#"3"&5474&#"327#"&54>32533#—;3…C3Q" *$Y$-H,  )F>)3& 3,,46ý33ýt6@ (&"3+w4<>3^+1:('Êc3ÿÝJ.*.¤°/´+°/´+°/´(+°+/´,+°//° Ö´ +° ±#+´+°±+´+° Ö´+±0+±¶ !($9±°9±±99°²!999°² #999°(± 9901#".'732654''254&"&54>32%5!ö cM=vX 1f¬(=" e2NN*I-A97Býçmg? 6A_{»uþxV+ 2^!0 .!@#6 F^33ÿÝÿ*J.AE*°-/´.+°3/´?+°B/´C+°F/°Ö´+°2°±:+´5+°5±+°2´ +° ±) +´ +°0 Ö´+±G+°6ºÂ™íô+ °.°À±ù°À°³+°³+³+² Š Š#9°9²9¶.......´.....°@±:°!9°5°9°@ &-.378?$9° ±+299± 0°9±.-³ +8$9°3²7:999°?°901%#5.#'67.'732654''254&"&54>32%5!‰XMm 33R,!(:Y>'1''3(=" e2NN*I-A97Býçm4 Í? 6B0þê2,/!PyzTIK!C!0V+ 2^!0 .!@#6 F^33ÿñm8²² +°)/´(+°#/´.+°32° Ö´+² +³@ +°9/°,Ö´&+²&, +³@&) +°&±+´+°±+° 2´ +°2²  +³@ +±:+±&,°9°´.3$9±) ³$9°(°9°#²,09990133##5./32654''.#""&5432>7b\;tY2HH0VuY<43p1!-  B>6u)+ &‰.X*Yÿ?3ýö1]AZD.++$ 5 %% 09&h; 2 #1ÿßþçU.<@ò+´+² +³@< +°/´!+²! +³@! +°'/´4+°=/´>+°A/°Ö´+³ +´+°±/+´*+°*±<+°2´;+°;±$+´7+±B+±/³ $9°*°-9°<´!',4$9±!±:99°'²-/799901.#"&546325#".'332654&#"&54>32#5!p +="6(KE#3M.Ca<" 3 ")=(BLF57 + 8&Kc-(3þovÐ*9#7 /I'69:Ÿ=v†]K^b6"\IFa!#'" '}];cþ£33ÿéÿßE.Jí°./´-+°"/´6+²"6 +³@" +°:/´E+°/´ +°/°3´+°K/°Ö´+°±3 +´%+°%±H+´+°±+°2´+² +³@ +² +³@ +±L+±°9°%´ :E$9°Hµ"-.68$9°°9±"-±399°6°9±E:±899°³?$9° ±<=9901"&54632!5!##54&#"3".5463&'#"732654& +0& )1"@B þ\H2} #(/  ‚].  ,!.,»  !1 7%f*33ýä6!U )+ #<*D%8ÿßÿo¬.@N° /´ +°+/´8+²8+ +³@81 +°22³8++´+² +³@ +°>/´%+°/°3´+°A/° Ö´+°± +´+°±;+´(+°(±+°2´+² +³@ +² +³@ +±B+°6ºÀ’÷}+ °1.°/À±2ù°4À°1³01/+ºÁTó+ °2³324+²324 Š Š#9²01/9³/034....µ12/034......°@± °9° ´%+8>$9±;± 99°(± 99± ± 99±>8² (999014&#"3"&54632!5!##&54>32#".'332654&#"6Q"  *5&82ý©ÍC3þÆ + 8&KceT9X8(3 ")=(BLF57[@ (&07ý33ýtò'" '}]\|0JrgCK^b6"\IFa!ÿßÿGU.MQó²+´2+²2 +³@2/ +°2°; Ö´J+°/´+² +³@ +°/´(+°N/´O+°R/°GÖ´>+°>±#+´+°±7+´6+°6±+°/2´-+°-±+´++±S+±>G°9°#°D9°´!;ABJ$9°7° 9°6µ(4L$9°±299±;±L99±±-99°²!#+99901!25#".'332654&#"&54>32#4&#.#"#"&5463265!["#"<,( 3 1D.BLF57 + 8&KcA2,'(#-ë9+ &*/6-$F1û33ÿÑ{>ú°#/´+°5/²8333´6+±22²56 +³@5 +²65 +³@6 +°?/°3Ö´:+²:3 +³@:8 +²3: +³@35 +°:±.+´)+°)°+ Ö´,+°,/°03´++°'2°+° Ö´<+°7&&547'#5!##5./7#"'Ð&  ß3fä2t2ƒd-n <3ƒKN “ $ a0 1èDEþPLcdY³233þA>] (RMrWGÿÓÿõ-.,‘² +°$/°'3´%+°-/°"Ö´)+²)" +³@)' +²") +³@"$ +°)±+´+°±+´ +° Ö´ +±.+±)"°!9±±99°³,$9± °9° °90167'&547'&547'#5!!>7)'4z")3 2)< 2TZþ,k(—N!* `*oZ8`Pc,H! ) (37>7#5&'“R,!EZ  2F?2TZþ,k(   (")3 % J–+0G//1,H   + (3Dz3+°6/´+³6+´9+°/° 3´+°?/°;Ö´<+°<±+´"+²" +³@" +²" +³@ +°"±+´(+°(±+´1+±@+±"°9°°9°(±99°´%&6$9°1² 4999±93°49±°9°´1;<$90172632&547'&547'#5!!>7>7'&#"#&'7Ž   8!#2  2hnþ,k( ')-X")3#F"¦W!- *Q 02,H !6- (332632'ç." ;3 FGµ! 4F0þIf.@;°s3@Š222´<+°&2°<±4+´/+°,2±E+±= ³#@$9±4<°99°/±)299±2@  ')9;?B$901%.#'67/75&#"##5!!>32632&54654'#567  JQ,!!2µ! 4F0þIf.@;.#*3s%†   >!)0+wD}*33©'I5+ '0H54'#"&5463367&547'5#5!!>76ª5qVN™43O- (0" 0!&"%   FB>)¡JþŠG0B?H8G`«b?M2 4"75& 0#)#4¾33‹" D,ÿËÿÊ.C °3/´+²3 +³@3/ +°/´+°/´ +° /°#3´!+°D/°9Ö´>+³>9+´%+²% +³@%# +²% +³@ +°>± +´+°±0+°2´/+³+/0+´+°/´++±E+±9°;9±%>±<99±· 36A$9°0±(99±/+°)9±3°9±±9>99°³ ;<$9° ³-.$9° ²+99901%25#"&54632"327&547'5#5!!>7#5&#"#"&5473265!'$2&'4# @ FB>)¡JþŠ/SV*38 'SP25:'Kª -1&%#@)#4¾33‹) D, þ²5KL;,=)ÿåÿ7/.[e°/´+² +³@[ +°° Ö´+°/´%+°//´:+°5/´4+°2°F/°I3´G+°\/° Ö´+³ +´+°±D+´K+²KD +³@KI +²DK +³@DF +°K±2+´7+°7±[+°2´Z+°> Ö´Q+°Z±*+´W+±]+± ° 9±°9±KD±C99°2°9°7²999°>³%4/5$9°[±<@99°Q°N9°Z±OS99°*±,U99±°9±%³ Y$9°/± 99°:±*W99°5²2,<999°4°S9°F³>CQU$901.#"#".547326325#"&'332>54'#"&543367&547'5#5!!>767#„B K55 .7!"&547&547##5!##5&#"27d'h2- *þóy%"V<7./MQ3U0  83Y #z0 $sþH5= MK0BG33þAp  ' -ÿYÍ505¯°/´+°/´+² +³@ +° /´ +° Ö´,+°6/°Ö°)2´+°2°±+² !1222´+² +³@ +±7+±°%9°@ ',.3$9±±!99°°"9° · %)/15$9°°.901"753##5&#""&546325./7&54632&#y…R3=`#.>-TFGkMp^),*' ŸyUxV DJ3ý^P‘% )3'#CcLGK)[F=8Y°?À±4ù°3À³34>?....³34>?....°@±" °%9°± $99±<7³) 9$9°±:99°G°9°ZµIPQ$9°L±NS99°Y°/9±°9±I± 99°N@ " &+%PVX$9°±'Q9901.#"#"&547326325#"&=&#"&46325!5!654'"&5473723!32654#"'632#ÂC I LZ.EG 9466;,'<6!(9(5<þÕ"[š3G!*a™5B/þÓ+°>±B+´+²B +³@ +±O+±K/±1699° ²-24999°³'(;I$9°*° 9°>²999°BµE$9±4@´(#BI$9°3±199°-²*9>999°;±E9901654'!53.5473##"&54>7654&#"27#"&5432654&'è*þñü%  F 4HΰT$4>./U<(- a <-§ .:8&.MC%!%34-*D<)%4‚#3sv5S. G4/*%. $/^.$1ùµkFsM20 /7T3;OA8   '+Ã3k33ÀH^HtBq}I 5Pb?,\F!a".:0%"(ÿçÿEe.WK²+´+°° Ö´+² +³@W +°/´'+°./´O+°>/´9+°5/´D+°!2°H/°K3´I+°X/° Ö´!+°!± +´+³A +´7+°±F+´M+²FM +³@FH +°M±W+°2´V+³*VW+´S+²S* +³@SK +±Y+±A ° 9±7°9°Fµ1;>D$9±WMµ'.O$9°*±,Q99±°9±° 9°'±99°.² U999°O±*S99±9>²1,<999°5±AF99°D± Q9901.#"#".547326325#".'732654'#".'&#"327#"&546325!5!!327#ÓC I/E#.EF :2965FsM20 /7T3;OA8    '+!:þÉ~þìQL3…' ,.%0 &;) *©+Bq}I 5Pb?,\F!a".:0%"(3k33ÀH^-,þ¦ÿÓ^.,«°#/´(+°/´+² +³@ +°/°3´+°-/°Ö´ +° ±+°2´+² +³@ +² +³@ +°±!+´*+±.+± ° 9°± 99±!²&'999°*°(9±(#² &999°°901%"&=&#"&46325!5!!>54#"'62Q,'<6!(9(5<þÕ‹þÓ 35%*>.ƒ@&£vR3L’33þq 6Y1&"!=Yºÿñ/.Fð°/´+°$/±Dé°4/´@+°/°3´+°G/°Ö´+°±=+´7+°7±,+´'+°'±!+´+²! +³@ +³ !+´+°/´ +² +³@ +±H+±7=°;9°,²4:@999°'±*199°¶$)/B$9°!± 99±$²*,999°Dµ /7;$9°4²1=B999°@± 99014'!5!##".'732654&#"&5467.#"&546323> $þu>t,+$N71[@43˜@5I4$)/% )* )-06F& ¨>33-&3_"142JYG x˜@1(7% "&!5  !259ÿðÿ3..Vç°/±?é°./´;+°E/°H3´F+°W/°Ö´+°±7+´1+°1±&+´!+°!±V+°2´U+°B Ö´K+²BK +³@BE +°U±+´R+²R +³@RH +±X+±17°59°&´ .4;$9°!³$+$9°V¶#)?D$9±UB±IN99±?µ)15N$9°.±+799°;±BK9901%.#'67.'732654&#"&5467.#"&54>323>54'!5!##„  JP*!"*6a?(4™G7G4$)/% () ))&)H2 $þz>y*>3!  >"(0# MdZ! Y¶A0(7% "&"4  !2% ,,>33-&2 >5S,þóÿáÿÆ.L °6/´H+°H°D Ö´9+°/´ +°/´+°&/°)3´'+°M/°<Ö´A+°A±+´+°±+´+°±3+°J2´2+°# Ö´,+²,# +³@,) +²#, +³@#& +±N+±A<°>9±±?99°³9$9°±F99°3µ %6H$9±2#±*/99±D6°J9±Hµ<>A$9° ³ /$9°°9°±#,9901"&5467.#"&54>323>54'!5!##5&#"#"&5473>3254`C$=(+ ))&)H2 $þk>j32: O 9J,8'#<(AH %"$P !2% ,,>33-&0'þ·3*V02: >(1Ø1ÿðÿI).cR²+´ +° ° Ö´+² +³@ +²+°"/´.+°4/±Ué°D/´Q+°[/°^3´\+°d/°Ö´+°' Ö´(+°2°±M+´G+°G±<+´7+°7±+°2´+°X Ö´a+²Xa +³@X[ +°±1+´+²1 +³@^ +±e+±'°9±GM°K9°<´DJQ$9°7³ :A$9°¶".49?UZ$9±X±_99± °9±."³ $9°4´:<$9°Uµ'(?GK$9°D±AM99°Q±Xa9901#5.#"#"&547326325#".'732654&#"&5467.#"&54>323>54'!5!#ž"* >3C I LZ.EG :55)33-&2ÿáÿa).FÞ°/° 3´+°/´+°$/´1+°;/°>3´<+°G/°-Ö´'+³'-+´+°'±8+´A+²A8 +³@A> +²8A +³@8; +°8° Ö´+±H+±-± 99°'°+9°± *99°¶$15:$9°8°D9°°?9±²999°²*+D999°$²'-5999°1±8A9901%#&/532654#"'63. #"&54>323>54'!5!#º %@(}¡"wÜ66 `SaG1 ‰   ))&)H2 $þk>j(å +#AŽ#m€3<)H] „    !2% ,,>33-&= 9ÿÓÿþy.$º²+° /´+°/°3´+°%/°Ö´ +° ±+°2´+² +³@ +² +³@ +°±+´"+°"°$ Ö´+°/´$+±&+± °9°±99°°9±"°9°$°9± ´"$9°± 9901&547'5&#"&46325!5!!67ƒd.<6!(9(5<þÕ¦þ¸e–,.Lcb[³23vR3L’33ê†!PUYÿÓy./5ª°/´+° Ö´+² +³@ +°/°3´+°6/°Ö´ +° ±+°2´+² +³@ +² +³@ +°±"+±,322´!+±7+± ° 9°± 99°°9°"´(*0$9±± 9901"#5&#"&46325!5!!632#7./6754&5Ð'g3<6!(9(5<þÕ¦þ¸MN12!%4 cRTM>˜}*vR3L’33Ÿoþ( +R#E ä: &ÿðÿþ‡.<ì²+°73´ +³: +´+°/´&+°*/°-3´++°=/°$Ö´+°±+´ +° ±(+°2´/+²/( +³@/- +²(/ +³@(* +°/±+´4+±>+±$°"9°°!9° ±&99°(°9°/± 99°±:99°4²7999±:°69± °9°@  "$(/4$9°&±1299013".54732632&547'5&#"&46325!5!!67.#"þ &/!24#o" , ƒd.<6!(9(5<þò—þªe–,./6%m@*81!3:b[³23vR3L’33ê†!PUY "ÿëÿñ.17´²+°/´+°/´+°/°!3´+°8/°Ö´+°±+±522´+°"2² +³@! +² +³@ +°±0+´++±9+±³2$9±+0²%.999±µ+.056$9°² 999°´#%)$901#5&/67.#""&546325!5!#632&545¯5(3=e&=q9"4D$7?".WþÌ4Í6# 2þýD&2Nþ½;b!35:%&4)0")55*z33 f;8lWq>;&!±ÿëÿK.7=G³°/´+°/´+°/°"3´ +°H/°Ö´+°±7+²;>222´6+°#2²67 +³@6" +²76 +³@7 +°6±1+´,+°/ Ö°33´.+°*2±I+±7´8E$9±/1°&9±² 35999°´$&*$901.#'67&/67.#""&546325!5!#632&547#5'O+!?J3G&=q9"4D$7?".WþÌ4Í6# 2 5(3~D&22  J‚#'0?*635:%&4)0")55*z33 f;8lWq>7þ‘&!±æ   ÿôÿ™Y.GM²+´+² +³@G +°° Ö´+°$/´#+°/´*+°//°23´0+°N/°Ö´ +° ±'+´!+°!±G+²-H222´F+°32²FG +³@F2 +²GF +³@G/ +°F±A+´<+°? Ö°C3´>+°:2±O+± ° 9°'° 9±G!µ#$*K$9±?A°69±³>?$9±$@  7þeÞ±6&ÿØÿpÚ.1˜°/´+² +³@1 +°/´'+°+/°.3´,+°2/°"Ö´+° Ö´+°±1+±)22´0+²01 +³@0. +²10 +³@1+ +±3+±° 9°1µ '$9±² ")99901.#"&546325.#"&54>325!5!##W +>"5(LD$.J7"5- "!4#4,d1þP3G*8#6/J'60CÎ.9'& , '$E/F"e©33ýuÿØÿov..5Ú° /´ +°/´3+²3 +³@. +°/´$+°(/±+/33´)+°6/°Ö´+°±+°&2´1+²1 +³@( +³1+´ +° /´+°1±.+°/2´-+²-. +³@-+ +±7+± ³$$9±1° 9°.± 99± ° 9°°59°3± 99°²&999014&#"3"&475.#"&54>325!5!###632R!  *"4'"!4#4,b3þžC3v 72[? (&8£.:& , '&D/F"fÌ33ýtŒþ97ÿñ†.6A²*+°4/´3+°./´+° /´+° /´+°$/±'733´%+°B/°Ö´+°±!+´:+²!: +³@!$ +³1:!+´+°/´1+°:±*+°72´)+²)* +³@)' +±C+±°9°³ $9°!³#$9±:1µ.348<$9°*°>9±.3±A99°°>9° °9°´ <$9° ±99°±!:9901%4>3&'".#"&5463232654'!5!##54&#""&#6'$;E )-02' $þ¯•C3_) '*Ú.1 È' ,, !25%>33þoQ((U0#,;+ÿð.-6»²*+°/´ +°/´+° /´+°32°´+°$/±'.33´%+°7/°Ö´+°±*+°52´)+²)* +³@)' +±8+±°9°*@  "#.$9± ´ +$9°°9°²5999° °9°°19°$°"901"#"'727&#"#"&5463267.'5#5!##.'6325J $": <+,6"K (&0&T1IX`$J01¬O#,€ESEU3:x "&'o)*&"33þ)<{0!B„3'AL°/´6+°;/´@+° Ö´I+°3/´+°02³3+´F+°M/°$Ö´)+°)±+°2´3+°3±9+´+° Ö°3´/+²/ +³@/2 +±N+°6º&À"+ °,°.À±!ù° À°,³-,.+²-,. Š Š#9³ !,-....³ !,-....°@±)$±&D99°± '99±93²>?999°°@9±6· 9=B$9±I;³ >$9°@°D901#"&=4&''65&#"'>3253>74#"&5473723!32654#"'6267&#"2¹9d4+&3 »$% .# o5ŠF÷[š5E!*3”9þË4k+<-þ/@)9 D $E9Z3BbYÁ"&!? $1P‹½ 5 <0)# w 3þ 6˜J&"!<4+E/" ,K~9Fµ²E+´1+²1E +³@14 +°1°6 Ö´9+°/´+°+/´:+°G/°Ö´+°±3+°!2´9+°52°9±+´+² +³@8 +±H+±±C99°3³$$9°9°9±+· "%-?$9°:´$.3AC$901#"&'732654&#"&5475&''654&#"'>32533#2>7&#"¸!0yA_¯73 E:=)5I1,3e #K;\P0–“þÓ( #8"?=>;J^ÛžVF* A0!C&%NR  ( $!J_¤P3  /y 3=².+°/´+°/´4+°:/°+3´$+°)2²$: +³@$( +°>/°.Ö± &22´-+°(2²-. +³@-+ +±?+±.´/2$9°°19°· !7$9°4² "&999°:°8901727&#"6%&'4&#"'67654&#"'632533##5&''27&#"6’)'kA+E! &+:3Wß!) L&)PwZW5OQ1Ÿ-&m9)4;ÊBt2HŠ% &2E •'4€ •~ÏK3þ…°˜.'`9G ÿo•s*5:Õ° /´ +°/´6+²6 +³@* +°/´++°:/°'3´%+²%: +³@%$ +°:°3 Ö´ +°;/°Ö°"2´6+± $22³6+´ +° /´+°6±*+°82´)+²)* +³@)' +±<+±6± 99± ± 899°6°9°²/999°+²"999°3°19014&#"3"&5474&''654&#"'>32533##267&#"2#R!  *(2»$%.# n6…F3àB4þ2 # S34 ?R82j[? (&# WÁ"&!$ $1P‚ÑE3ýtI ,+R)!þe7ý ÿ“ s,7À°/´+°/´+² +³@ +°*/´-+°5/´+° Ö´+² +³@ +°8/°Ö´+°± +±22´ +°2² +³@ +±9+±±$'99° ·#135$9±±99±*²$,1999°-²#999°5°3901>32533##5&#".5463254&''654&#"7267&#" n6…F3VV3=_%%,>,OK,»$%.% # S34 ?£1P‚ÑE3ý˜O‘ *0($Cd÷HÁ"&!$ 9 ,+R)! ÿ¾ s<Gݲ-+²7+²<+°1/´+°( Ö´+²( +³@(% +°/´=+°E/´+°# Ö´ +² # +³@  +°H/°Ö´4+°4±%+± 22´$+°2²$% +³@$" +±I+±4²999°%·8:ACE$9±(-±499±1± 99±²A999°=²999°E°C9017463263254&''654&#"'>32533##54#.#"#"&267&#"YC/5% ( ,»$%.# n6…F3VV3!,'(#-< # S34 ?!$F1 ÜHÁ"&!$ $1P‚ÑE3ýå'= &*/6Ä ,+R)!ÿÜ‚.2;E£²+°/´$+°0/´3+°;/´+°°@ Ö´+° /±<33´ +°F/°Ö°D2´+² +³@ +±G+±$±*99°0¶ '+27$9°3²)999°±9D99°;°9°@°>9± ° 901>3267.'5#5!##.#"#"&'7267&''654&#"7267&"76325Z.jZLUâ¦J05 (2%$(   '”,%#' 9)V¢[ !X(E{)+&"33þ EIe ' $* &Œ& 57+`E„ÿîÿ×üàR3²L+°4/´$+°)/´.+°/´+°!/´+°A/°3´B+°2°H/´Q+°S/°JÖ´O+°O±+°72´!+²! +³@A +°!±+´+°±'+´1+°2°1´E+°E/²1E +³@1 +±T+±OJ² L999°°M9°!±HQ99°µ$,4G$9°³)+.$9±E'°C9±)$±+199°.±,899°°9°±;99°!µ  <>$9°° 9±HB°E9°Q°G9°L±J990123!532#"'73254&#32654#"'632#"&=./67&'#5!654'"54732{"="þw/. ,2$22´+°±+´C+±J+±!±.299°¶#-07<$9°³%9:$9°)± '99±±FH99± °!9°'²%)*999±F#°>9°±-H99°µ.09(69vKZr8 #1?þ 8- -407X>0A_ %M#6@33*8&1,'aNaO'% ÿçÿÿ‰.L²+°1/´<+²<1 +³@<4 +°C/´++°/´+° /° 3´ +°M/°4Ö´5+°5±+°2´)+²) +³@ +°)±?+´/+°/±+´+² +³@ +³+´+±N+±5²L999°)²1J\[ ,A,9Bu=7I9&Z082;33ê†!4aQNI -[<¥%ÿéÿÅ=.*1r°./´+². +³@. +°/°!3´+°2/°Ö²-222´+°"2² +³@! +² +³@ +°± +´(+±3+±( ² %99901%&546?#5&/67./675!5!#636750_I-);¥"Y1Ky0%*"(˜þ¹TÛ` $ þº-E^w7ý2+[uo)þ¾;T&? *e#+33º+xT`l L ÿçÿdž.)¥°!/´ +°/´'+²' +³@ +°/´+°/°3´+°*/°$Ö´+°±+²222´+² +³@ +² +³@ +±++±$° 9°³ !&$9± ±$)99°'°9°³ $901.#&'675!5!##5&#".5462*,|%ˆš9 !~”þ½·A3=_%&+=ZH% ?X,X.ˆ6b++33ýiP‘*1($B21ÿõÿ¿.6<˲+´+² +³@ +´2 +´2+°'/°*3´(+°=/°Ö´ +° ±+´/+°/±:+±%22´,+²,: +³@,* +²:, +³@:' +°,±+´+±>+± ² #7999°/°9±,:²-999°²4999±2±99°'´:;$901%#"&'332>54'#"&547.#"'675!5!##36?6'5ª5oXN™44O- (0" 0!&"9p(\gþÑ%Â, ð S]æD0,.ˆ6b++33ý´<)  +60 >X,ÿéÿhA.RV²8+´+²8 +³@85 +°8°A Ö´Q+²O+°/´+°/´'+°#/´+° 2°S/´T+°W/° Ö´+°±N+´D+°D±+´%+°%±+°52´3+°3±+´0+±X+±%³AGKQ$9°@  '8=H$9°3±*99±A±99±±399°°09°'°9°#²!999°² *99901%6325#".'32654'#"&54632&#"3267#4&#.#"#"&546325!' (9bC:"9%”T,P"5R3O)4! K%3!%(#2,'(".;B05þçXE1Jm_:“¥Q?3Z7?#00):2G #!9 &RÞ:* &*/7,$FÆ33ÿê. Jë°/´%+°+/°A3´+´>+° /±33´ +°K/°Ö´ +° ±F+´<+²F< +³@F +°<±3+´.+°.±+´+³(+´+²( +³@ +±L+±±699°°9° µ 8:!&. #3+'(ÿé8†FU² +°6/°3´1+±322³16+´+°1°T Ö´)+°&/´!+°?/² I333´@+±D22²@? +³@@ +°V/°9Ö´/+²9/ +³@9? +°/±G+´+°A2²G +³@# +°±+´+°± +°2´ +°2² +³@ +±W+±/9°>9°G´)36NBè93=_%#.E-=79.!21ïC+P,[.‰&!"33ýP‘ *3(+;Ú82Nàÿébs Nç²)+°:/´+°2°°B Ö´G+°5/´+°/± &33´+°$2² +³@" +°° Ö´+°O/°JÖ´@+²J@ +³@J +°@±)+°!2´(+°#2²() +³@(& +±P+±@J°9°)· DGM$9±G)±./99±B:°19±5³7>@J$9°´ !-M$9°±99°°901267&#"4'#32%#5!>32533##4&''654.#"#".#"327#"&54674¨0)S43>`#µ '*:þòe‹ N$…F3VV3+»$%!/,#G7 *& ¸(8R)84,#)¢33 '‚ÑE3þ:HÁ"%" "9))3+'(ÿéÿ™bsOYe:²+´+² +³@O +°° Ö´+°'/´d+°S2°d°/ Ö´4+°"/´P+°=/±L\33´>+°J2²>= +³@>H +°=°W Ö´E+°f/°7Ö´-+²7- +³@7= +°-± +´+°±O+±G22´N+°I2²NO +³@NL +±g+±-7°<9° µ'14:Z]$9°³ $?B$9°Oµ "EPU$9±°9±4´  $9±/'°9±"d³$+-7$9°P´:GZ`$9°W±BU99°=°@901.#"#"&547326324&''654.#"#".#"327#"&54674'#5!>32533##267&#"4'#32ÙC KLZ.EF ;46+»$%!/,#G7  *& e‹ N$…F3VV3þÏ0)S43>`#µ '*:2( M@%0 .<) +)GÁ"%" "9))3+'(-33 '‚ÑE3ýž(8R)84,#)ÿéÿ¾`sZeqQ²I+²R+²W+°L/´+°D Ö´+²D +³@D> +°/´p+°_2°p° Ö´$+°/´[+°-/±;h33´.+°92².- +³@.7 +°-°c Ö´4+°r/°'Ö´+²' +³@'- +°±X+´O+°O±@+±622´=+°82²=@ +³@=; +±s+±'°,9°X@ !$*/1[fi$9°O²  999°@·4SU_ac$9±DI±OX99±L±99±$± 99±°9±p³'$9°[´ *6fl$9°c±1a99°-°0901%263254&''654.#"#".#"327#"&54674'#5!>32533##4'5.#.#"#"&546267&#"4'#32 2) (,»$%!/,#G7  *& e‹ L#†F3UU2- .$#.;DM % S24!?\#µ '*:‹1ÜGÁ"' "9))3+'(-33&‚ÑE3ýå % -3/7,%E--+R)!54,#)ÿÙ . Gݲ5+°)/´.+°3/´#+°/±33´+°H/° Ö´@+² @ +³@  +°@±+´+² +³@ +°±5+° 2´4+°4±0+´&+±I+±@·9;CE$9°°9±45°#9°0±)+99±)5± 999°.²+:999°3· & ,;@E$9°#²>999°±99014'#32%467&'#5!!632#"'73254&##5./7.#"3"&5¶/ ;þË*dÇþÄ Zˆ<^r#%/"(M83'–5!ll*Ú" #33 O6GM^O7-&-=þZC;V -VK ,ÿÙÿ™ .S_-²+´+² +³@S +°° Ö´+°G/´L+°Q/´A+°//±2V33´0+°`/° Ö´+°) Ö´!+²)! +³@)/ +°±T+´5+²5T +³@52 +°5±S+±>22´R+°R±N+´D+±a+±! ° 9°³%&,.$9°T@  $$9°L²<I999°Q¶!)D&J^$9°A³5T[$9°/±,X9901.#"#"&547326325./7.#"3"&5467&'#5!!632#"'73254&##4'#32‹F=LZ-EG.38'–5!ln**dÇþÄ Zˆ<^r#%/"(M83V¶';2( M@%0 .<) +2;V -VK , #33 O6GM^O7-&-=ýóAÿé'Õ.HTþ°/´+² +³@ +°/´E+°=/´S+°S°% Ö°3´*+°3/±6K33´4+°U/°-Ö´#+²-# +³@-3 +°#±+´B+°B±I+´9+²9I +³@96 +³9I+´+±V+±#-°29°µ'*0LO$9°B±99°I´=KS$9°²7999±E±99°*²@999±%=±?99±3S´#-!9$901#"&'332>54'#"&547.#"327#"&54674'#5!##"'367674'#32‚5pWN™43O-'9 0!4*0" *& eìa1$ #µ '*:NF9Fb¬bAL2,$ 7$'/ #3+'(-3309-/ "Š4,#)ÿéÿØÕ.MY!°>/´+²> +³@>: +°/´+°/´X+³ X+´+°°& Ö´!+°//±2P33´0+°Z/°CÖ°)2´H+´+²C +³@C/ +°H± +´+°±;+±N22´:+°52²:; +³@:2 +±[+±C±.E99± H¶!#&,FQ$9°°T9°;@  AKPX$9°:±3899±>°9±±CH99°³ EF$9±&°99° ±899±/X³)5$901%25#"&54632"32?#".#"327#"&54674'#5!##5&#"#"5473264'#32!'#7")2#  F#G7  *& eìa/3: "¨2 0D!S#µ '*:Yª -2%&# A))3+'(-33098þ²5—;442B4,#)ÿèÿZÕ.gsf²+´+²+´+² +³@g +°/´!+²! +³@! +°0/´]+°U/´r+°r°= Ö°a3´B+°K/±Nj33´L+°t/°Ö°K2´ +° ±E+´;+°;±3+´Z+°Z±g+±h22´f+°Q2²fg +³@fN +³&fg+´c+±u+± ± 99°E°9°;± J99°3·7?BHkn$9°Z³5$9°gµ!+0Ujr$9°&³(O`a$9±°9±!² 999°0² e999°]²+&c999°B²3(X999±=U²5W`999±Kr´7;E9Q$901&#"#"&547326325#"&'332>54'#"&547.#"327#"&54674'#5!##"'3>7#4'#32\7<QLZ.FG 929/=N™43O-'9    4*0"  *& eìa1$ !.5(3#µ '*:q: M@+* +9, +n¬bAL2,$   $'/ #3+'(-3309-/ 5F9;-þóA4,#)ÿé‘./;Fþ²#+°-/´,+°'/´+°/´:+°:° Ö´+°/² 2<333´+°G/°Ö´ +² +³@ +° ±0+´?+³*?0+´+°/´*+°=2°?±#+°<2´"+²"# +³@" +±H+± °9°¶23:$9±*0°9°?±-A99°#³',C$9±',±F99°°C9±°9±:³  A$901%463&'#".#"327#"&54674'#5!##54&#""&74'#327#A5&,#G7 *& e¨C3Y/ '*#µ '*:¿§2DÈ(&#))3+'(-33þo] ()ô4,#)¢09 .>8ÿèÿop.4;ð°/´+°/´+² +³@ +°%/´$+°0/³35$3´1+°2°NBÏ þá=79.55ý33ýt6@ (&/{C+P,],‰&!"3382NàÿéÿèÕ.DPô²;+°1/´A+°) Ö´+²) +³@)$ +°/´O+°O° Ö´+°/±G33´+°Q/°>Ö´4+° Ö´ +² +³@ +°4±%+°2´$+³E$%+´!+²!E +³@! +±R+± 4°9°%@ 178;AGHO$9±!$°9±);².4>999°1°C9°°9± °#9±O³  !$901%25#".#"327#"&54674'#5!##54&#".#"#"&54632674'#32 #G7  *& eìa 3 *-#+&.9A).3l#µ '*:ŸŸ))3+'(-3309*$þÆ(  @-7,$G7 ü4,#)ÿèÿ\Ð.8?¯²'+´5+° Ö´+² +³@ +²+²3+²7+° /´ +°/±933´+°@/°2Ö°2´*+° 2²2* +³@2 +°*±+±>22´+² +³@ +±A+±*@  -/59$9± ²>99901%254&#""&547.'5#5!##4&#.#"#"&5463265;`#B2U.C‹>NBè92- .#%.;K'2( ™=79.°C+P,P9‰&!"33ý„7- ,4",07-,=0æ82Nàÿé(.9ENì²+°/´+°%/´B+°B°- Ö°M3´2+° /´K+°/²:F333´+°O/°5Ö´++²5+ +³@5 +°+±D+´!+°!±+°M2´+² +³@ +±P+±+5°9°Dµ%/28;$9°!²999°³F$9±2²999°%°9°-°9±K ´!)+5I$9°³8>D$901#5!##5.#"#"'73267.'#".#"327#"&546747#325476325Ne?53 : ,.10A,. 0;1$#G7  *& ˵ '*:D@5"'2û33þõN5Tj# F?9!-/))3+'(-#)B4,74E®ÿéÿh(.P\e@²+´+² +³@P +°° Ö´+°/´(+°4/´Y+°Y°< Ö°d3´A+°/´b+°J/²MQ]333´K+°f/°DÖ´:+²D: +³@DJ +°:± +°!2´+°[ Ö´0+° 2°±P+±d22´O+²OP +³@OM +±g+±:D°I9° ¶4>AGQRY$9±[± "99°0±$.99°Pµ(+]$9±°9±²  999±A(²$999°4°!9°<°"9±b´08:D`$9°J³.GU[$901.#"#"&54732632.#"#"'73267.'#".#"327#"&54674'#5!###325476325ÀA =K\-EG< 38 : ,.10A,. 0;1$#G7  *& e?53þyµ '*:D@5"'2c' LA(- ,;) +N5Tj# F?9!-/))3+'(-33ým“#)B4,74E®ÿÓÿì[.:AÚ²(+°&/°;3´+³&+´+°8/´ +° ° Ö´2+°/°3´+°B/°Ö´+°±A+±(22´'+°2²A' +³@A +°'±"+´+²" +³@ +±C+±Aµ ,/>$9±"'± 99±(µ"->A$9±±5699°2³/4$9°8± 99013&54632635!5!#'654.'#5.#'67.#"&#"I!SK'; !þuˆÏ7J 4 :1-(ZE!C " +@%"h@5*i,L,=!  a33¨ (3"6!)& ) þÊ)N70O;"_` ; ".ÿÝÿÀÿ.F°'/´+²' +³@'* +°/´0+²0 +³@ +³D0+´B+°=/´+°° Ö´6+° /°3´ +°G/°Ö´@+°- Ö´+°@±$+´+°; Ö´:+°±2+± 22´+²2 +³@ +²2 +³@2 +±H+±$@ !"*0=BD$9±;°9°:°89°2±699±'±-99°°29±6B²;@999°=°9°° 90146326325!5!##54&#"632'654&#"#"&5463254&#&#"3"&=29- !þ‚"s3ZB!AH"+ %J N'bEAH"1@#!= %,a1G5&L33ýÅ“+\;+$' 0$8 +!=QL©  ^1-,1ÿÒ7Ê,UR°/´+°3/´2+°-/´8+³8-+´+°-°% Ö´<+°@/° 3´A+°2°V/°5Ö´0+°0±M+´+°±!+°>2´ +²! +³@!@ +° ±+´+°G Ö°B3´+²G +³@ +±W+°6ºþÀ + °°À±Jù°IÀ°³+² Š Š#9³IJ....³IJ....°@±M0´+238:$9°²(*O999°!²%99±-°:9013723!32654#"'632#"&=4&#"&#"&546326325!5!>54#"&5473”Cþ =f*2ƒN$,(,<!8QI(8#%"þy{[š5E!* Ù z 3þ¥ šH&"!8#Yº:,šH ^ ++N,=1&3h3 8 <0 (  ÿÒÿUÊ,oʲ+´+²+´+² +³@o +°/´^+°//´.+°)/´4+³h4)+´c+°)°! Ö´8+°3´V+²VC +³@VY +±q+°6º&À"+ °S°UÀ±Fù°EÀ°S³TSU+²TSU Š Š#9³EFST....³EFST....°@± ,³)./4$9°° 9°I² '6999°P²&$K999°³!8L$9°[°9°oµ^ef$9°n±ch99±°9±^² 999°/³  m$9±c.·$,'1aek$9°!±:f99±h)°6901.#"#".547326325#"&=4&#"&#"&546326325!5!>54#"&5473723!32654#"'632#@!L'F:.EG< 8356$,(,<!8QI(8#%"þy{[š5E!*3”Cþ =f*233v& D4%0 ,<) *œ2:,šH ^ ++N,=1&3h3 8 <0 (  z 3þ¥ šH&"!8#LTþ«ÿÕ6‡.Bа!/´*+²*! +³@*$ +°4/´+°@/°83´ +°2°/°3´+°C/°Ö´+°±6+°2´+²6 +³@ +²6 +³@6 +°±/+´+±D+±°9°6³ $%$9±/³!*4$9±4*°9°²/999°@µ16=$9° ² 99901&54>326325!5!#3>7#"&'332>54'#"5&#".#">$$3 4"(/& þ€²ÿ+"OzCRs9>-<)&:M8&)+#$G( " C #*/)$Y33Ñ  :<[ rSk$&-#3,$*@i>?$7ÿÕÿY‡.^:²+´+²+´+² +³@^ +°/´"+²" +³@" +°8/°03´E+°I2²8E +³@8, +°M/°P3´N+°_/°@Ö´;+°;± +´+°±.+°K2´R+²R. +³@RP +².R +³@.M +°R±^+°2´]+°]±' +´Z+±`+±;@°>9° °=9°³ 8E$9°.µ 5G$9°R±99°^³",T$9°]±)X99±°9±"² 999°8@ )5>@TZ\$9°E²GKX99901.#"#"&547326325#"&'332>54'#"5&#".#"&54>326325!5!#>7#í@!1K\.9S: 29+,Rs9>-<)&:M8&)+#$$$3 4"(/& þ€²ÿ+"O33r& LA%0 *32 +Sk$&-#3,$*@i>?$7( " C #*/)%Z33Ñ :<[PF8þßÿñÿÖÿ.P °K/´+° /´+³1 +´'+°"/°3´7+°<2°@/°C3´A+°Q/°4Ö´%+°P Ö´+°%±)+´.+°.±+´ +° ±+°>2´E+²E +³@@ +°E± +´H+²H +³@HC +±R+±)%³"+17$9°.°,9± ³:$9°· 90132654&#"&5463254&#".#"3254'7#"&546326325!5!##".'N›M8F40)H5 /+3''=. 1-=C0; .þd?gQ326325!5!!67g‚e.&)+#$$$3 4"(/& þ€ûþ¸e–,.R]b[³2|>?$7( " C #*/)%Z33ê†!P`Nÿòÿï‚.AF¹²+°3°2/°)3´>+°2°/°3´+°G/°:Ö´5+°5±+²%B222´+°2² +³@ +² +³@ +°±+´+°2±H+±5:°89°³$7>C$9±°9°± 99±2@  .8:BF$9°>±@990125!5!#632&54654'#5./75.#"'.#"&54>326: þ€Ý: ."A32>7&#"Û3d/+3''=. 1-=C0; .þd?3# Z#' # 3'Cü@"Î(D!/&9-%C 1 F33ýõa ' $)E]  ,.Pè²H+°99±L99°A°9°´19?CM$9°´/$9° ±.99°±"99°°#9°(°$901.#".#"#"&54632632.'#5!!2#"'73254&##5./676d, -*"(:-(69vKB_15 K:/,: %k B-/6-,=0#   33*8&1,'aN 7:"&$ 1 #2>þZFFX %ÿ™.a6²+´+² +³@a +°° Ö´+°U/´Z+³/ZU+´,+°'/°_3´5+°P2°5°9 Ö´ +°D/°G3´E+°b/°2Ö´*+°*± +´+°±a+±O22´`+°`±\+´R+±c+± *³',/5$9°± -99°a@  $7;DEHM$9±\`±UW99±°9±U´  O$9°/±W99°Z°-9°,´MRX\$9° ´$*2K$9°'±;J99°9±7>99°5°?9°D°@901.#"#"&547326325./67.#".#"#"&54632632.'#5!!2#"'73254&##EI LZ.EF.46,:W, -*"(:-(69xMè5 L:32( M@%0 ,<) +5FX %EB-/6-,=0#   33*8&1,'aN³&$ 1 #2>ýóÿßÿo .D°/´+°/´+² +³@ +°0/´-+°%/°3´6+°:2°@/²C333´A+°2°E/°3Ö´*+°*±"+´!+°!±+°>2´+°2² +³@C +² +³@@ +³+´+°/´+°± +°2´ +² +³@  +² +³@  +±F+±"*²/06999°!°89°±:99±±99±±99°°9±%-²"3>999°6°8901%2#53##54&#"3".54754&#"4&#327"&546326325!5!#¿84“B3Q#    '@%'." 0& 326325!5!##54&#".#"#"&546326*&)+#$$$3 4"(/& þ€O3*/",%/8C(.3¹³>?$7( " C #*/)%Z33ýýW" B.9+$F7!—.=JE°/´>+°/°3´+° 2°//´,+°# Ö´$+°)2°$´+°K/° Ö´+°±+°+2´>+°/2°>±A+´:+²:A +³@:. +±L+°6ºð›Áá+ °G°DÀ±2ù°5ÀºóïÁ&+ ³325+ºï¶Â+ °G³EGD+³FGD+²325 Š Š#9²EGD Š Š#9°F9¶5G23DEF.......¶5G23DEF.......°@± ±'99°²)999°>°9±>°9°°:9°±99°@   '+0J$901%"'&#"27#".'#"'732654&#'26325!!'2654.'.'\ %3 # % 8- >1%#!7lþÇ/"C  Y{+5— 4. %G}, +#,1 &306IK[3=#$ 0ƒ]3±*  ÿôÿµG.Q\°J/´M+° /´R+°/°3´+°"2°°> Ö´+°: Ö°3´X+°7/°&3´4+°)2°]/°$Ö´+°± +°32´[+°72°[±U+´+°±+´A+±^+±$±+99° ³.1$9°[³24JK$9°U² :M999°±9±MJ°D9° °K9±R±A99°±U99°X°9°°9°>± 99°:°Z9°7µ$1+3$9°4°.9014.'#"=&'327#"&'#"'7254#'632>325!!32632.#732>'2654&#"'` _0N)&%  - )nW&2 þ'M.?b>ƒk":ÊqCP6çD3*AYwKG% +11 &G,A*%N3< M81^,v$Bv2<J (ˆÿíÿä!…-[°4/´+° /´+°'/´"+°"°? Ö´,+°E/°Z3´J+°X2²JE +³@JV +°E° Ö´N+°\/°BÖ´&+°±+´+°±+°U2´.+°W2°.± +´1+²1 +³@1Z +±]+±B±)L99±³"'$9°¶ $%4$9± ²1999°,°.9°°99±?'²%:<999±"µ$)=BLU$9°E°G9±JN°H90132654&#"&5463254&#"327#"'#"#".'7&'732654&#"563263533#Q&54&#"563263533##5&#".546324&#"327#"¿ 4#I5N3QQ3=_%&+>,.H$P%!, <X')-1=8k_  $ÀW3ý™P‘ *3&$B21s/6 +ÿíÿo …Q.°K/´J+°D/´6+²D6 +³@D@ +°/´ +° ° Ö´+°/²49=333´$+±2;22²$ +³@$0 +°° Ö´(+°R/°Ö´&+°±+°/2´6+±1J22³G6+´O+°O/´G+°±4é°6±@+°82´?+²?@ +³@?= +²@? +³@@: +±S+±±&99°O² 999±6G±DK99±DJ±8O99°6°9±± 99± µ &/$9°°!9±$(°"901%4&#"327#"'#"'73>54&#"563263533#2#53##54&#"3".546P%!, <" 4#I5N3&&54B3Q#    )5r/6 +:')-1=8k_  $ÀW3þ:7ý33ýt6? (!"ÿíÿ¾…V²E+²N+²S+°H/´+°@ Ö´+²@ +³@@= +°/´+°° Ö´+°%/°:3´*+°82²*% +³@*6 +°%° Ö´.+°W/°"Ö´ &+³K "+´T+°T/´K+° ±+±5=22´<+°72²< +³@<: +±X+± Kµ,HNQ$9°µ@EO$9±@E±KT99±H±99±±99± µ",5$9°%°'9±*.°(901726324&#"327#"'#"'732654&#"563263533##54#.#"#"&546Ø1) (P%!, <" 4#I5N3QQ2#- .$#.;C‹1s/6 +:')11=8k_  $ÀW3ýå&> ,4/7,$FÿÎÿì.2:Ȳ*+°!/´"+°/°3´+°´++°;/°Ö´+² +³@ +°±:+°*2´(+° Ö´+°(±%+´+²% +³@ +±<+±±.699°:µ1$9±( ±99±%±!"99±!*°+9°"°:9°@ (.36$901327'654.#"47#5!#'2654&##5.#'67&x1b%a4«JÞPc]-B42'\C!M 7Ç\$ EŽ%Y( MK$33+## P:Q(" 0þ½GO60A0#)#ÿÎÿÞg.JT]>°2/´F+°5 Ö´C+°+/´!+° Ö´N+°/°3´+°´[++°^/°:Ö´>+°>±+´K+²K +³@ +°K±+´+°±W+´+°±/+°H2´.+°2²./ +³@. +°.±)+´$+±_+±>:°;9±K°<9°³5CS$9°³ N]$9°W´2FRU$9°²999±).±!'99°$°&9±C2°H9±+F@ $&-9:<>$9° °9°!°;9±[NµSU$901"&547#".547#5!!>32'654#"#5&#"#".473263254'326?'654.'"1G$ $4«™þÓ '' !0#"1230< S'-()T 0,Þ ! a'WI # ,K$33+9) 8-##Bõ2* ACMO$901.#"#"&547326325.#'>7&547#5!#'2654&##327'654.#"5I9? ND( <@2.0"SP %75ÉhßNd\-F13“0a$eON E=' U8(- *9, *1@A0! @K$33*## O;Q(!((þ_ Y( þ¶°G)ÿÝIÕ$;CLа/´+°(/±?33´)+°2°//°,3´9+°2°M/°2Ö´7+°7±+°%2´+°G2² +³@) +°±<+°*2´+°2²< +³@ +°<° Ö´+±N+±72°49°°59±<@  ',/9AL$9°°9°°9±(·218#9+01S1':K -A*3F31B 6 5ð +o< .'ÿõFm'7;í°1/´ +°%/´*+°/±833´+°2° +°U°L Ö´Q+±h+±. ° 9°°09°5° 9°°19°G°9°U@#(+7:EIN[f$9°L°O9°T°@9±°9±I² 999°$@  OSV[\^d$901.#"#"&547326325#"&547"&547#5!4#"#"&547326323#32654'7#4&#"6'327‰CPLZ.DG<46JN*3^B<å¤:NWJ0 zSE5g~M[M8,u#=3!N!” !0"c' M@*+ ,;) +“+3&:K37@+3F31<  4=:35'N6H"#9+/þÎM +o< .'ÿõÿjm'RVj²+´+² +³@R +°° Ö´+°/´@+°E/´J+°%/±7.5467'#5!&5473##"&7&'62654' … , ,;\P6&+AÚÃ>0cGEW™O9)<&7F<&:3|1þ¦  N?3]G#ìx@TV6\8!qÿéÃ.$:AEÁ²+°/´9+°*/´++°2/´+°/±B33´+°F/°Ö±;D22´+±622² +³@ +² +³@ +°±%+°/2´#+°2±G+±%´+29$9°#°!9±°9±*9µ #%A$9°+µ! (6;?$9°2µ =D$901%"&'#5./67&'#5!!>32'4&#"'67654&#"32%&'5(.g3AcG*g-~"Úþ¶# ,<+.1'-P$ D20f".þçH;0{UÕT‚]O$Ð@\H:%R#A33ƒ%  >-5%13gh3. ( FDKGƒ(>+7qc#wšÿÎs BGϲ.+°>/´+°2°9/´+°/±+E33´ +°)2²  +³@ ' +°° Ö´$+°H/°Ö´ +² +³@ +° ±.+°&2´-+°(2²-. +³@-+ +±I+±. @ !>EF$9±>.±3499°°69°9²;999°´ &2$9°µC$901267&#"327'654.'"47#5!632533##4&''654&#"#".%67#c # S34 ?ý(b%a4«Þ…F3VV3- »$%-V) $ÿ"¸ ,+R)!B%Y( MK$3 ‚ÑE3þ:M Á"&!$ (5 ,y ÿÎÿ™#s>GOX](²+´+² +³@> +°° Ö´+°'/´K+°B2°"/´?+°//±;[33´0+°92²0/ +³@07 +°0°4 Ö´F+°V2°^/°,Ö´H+²,H +³@,0 +°H± +´+°±>+±622´=+°82²=> +³@=; +±_+± H´'.MRX$9°³ $Y\$9°>¶ "1?D[$9±°9±'´  $9°K°9°"²$MP999°?´,6HR$9°F³DNXY$9±4/°2901.#"#"&547326324&''654.#"#".547#5!632533##267&#"327'654.#"767#›F>LZ.EG.38,»$%X* $4«Þ†F3UU3þÎ0)S1%Yþæ'b(  '2( M@!4 .<) +)GÁ"' )7 ,K$3‚ÑE3ýž(8R(b%Y(  ÿéÿù.D²<+°0/´5+°/´+°:/´)+°/± 33´+°E/°Ö´+² +³@ +°±+´+² +³@ +°±<+°&2´;+°;±8+´,+±F+±·$?@C$9°²!B999°<±"#99±8;²)02999±0<²$&?999°5±2@99°±#399°´",8BC$9°:±!99°)³'$9°³$90127'74&#"26"&547#5!!632#"'732654##5&/67'x*\'‡ )> ‡:Ah´þq)diG4Ke$!  †3>’(a8^Nl>.–=&7533#&(4#>">>E:%0 ;PþnAW6=&ÿéÿ™.HP[V²+´+² +³@H +°° Ö´+°999±°9°°9°<µ  02$9°A±>99°±/?99°I´.8D$9°F±-K99°5³"3NY$9°%³+LQW$901.#"#"&547326325&/67'#"&547#5!!632#"'732654##27'74&#"26wCNLZ.EG 8 46=’(a8?:Ah´þq)dgH6Ke$!  †4ÿ*\'‡ )= 2( M@!4 .<) +*V6=&=&7533#&(4#> @>E:%0 ;PþÅNl=.ÿÎ:.2=ð²+°$/´#+°/´*+°./´+°/±933´+°´++°>/°Ö´+² +³@ +°± +´<+³!< +´'+°'/°3´!+°<±+°82´+² +³@ +±?+±'´.$9° ±,99±32'654&#"#5&#"#".5473263254#"'3254'"'$1#."<8  ØÁá))!0#"231;V%7 (+2R 1,%C8$=ð # !H?‚3!3.33"5/ 8-#Bõ2* #3*)A"8; Ø/Ií$H8$ÿ×ÿv}.EKS0°/´+² +³@D +°° Ö´+°>2,2'[C!jQ?"<8' ئÆ)IY])E13VG?8&h8$=T' ;(*+ *;) +EN70]Q‚3!,M133"5 N7P(#''þIÉE",l$H8$ÿçÿåS… Lã°/´+² +³@ +°&/´3+°=/´B+°B° Ö´7+°E/±33´F+°2²FE +³@F +°M/°"Ö´ +° °J Ö´+°/´J+° ±+°2´+°2² +³@ +±N+±"±$K99±°9±3&±" 99°=²)+$999±B7±JK99°°?9°E²:@I99901254'#233##5./2654'#"&5473274'"&'#"'7327#5!2'!]  z*?>X3ll1:@g,Hd=A-*-  K10 <"1% $ ™?2)>™'   §,$C=W3ýê&/?')I0&J 3/6::!)n3EdIÿß'IQ°/´+°/´"+°/°3´ +°J2°*/±FM33´++°D2°R/°5Ö´=+°=±+°L2´H+°H±+´ +°. Ö´D+²D. +³@DF +².D +³@.* +±S+°6º;À$+ °@°AÀ±2ù°1À³12@A....³12@A....°@±=5²7J999°°89±H² 999°.°,9±±H99±"@   %L$9° ±P99°*°(901%2654#"'632#"&'5.#"#"'73267.'5#5!654&#"&5473723!25!6Þ?a*/6a6 +4-!21@,%. B_2¥$4—8E!* -4™6ACþ² —'1þã`$R–K&"!<9Z!™-?4?4jOCK7%3 & <1) F<3þn=E±oÿãIC$Y°&/´+°6/´>+°D/±33´E+° 2°K/°H3´W+° 2°Z/°NÖ´U+°U±)+´+°A Ö´&+²A +³@AD +°±+°F2´+° 2² +³@ +°°" Ö´+°/´"+±[+±UN±;P99°)²6>Q999±²4KW999°· &.1H$9°° 9°°9±6´ ")/$9°>°19°D´49;$9014&+3223#32654'7#"&54>7.'#"&'6732654'#5!4#"#"&547326¥%V9#=CE5g~3HH38+v#7.'#"&'6732654'#5!4#"#"&547326323#32654'7#4&+32‰EM/E#-EG 8 38@<*3 )/';"<8  #ØÈ:NVK0 zSE5g~3HH38+v#=33 $V9#>c' ,.(- ,;) +…3&!#=*‚3!A) 3F31B  4=:3#B419#9+/&%þæM+$Hÿó9*.:C¿° /´+°/±>é³*>+´3+°7/±;33´8+°D/°#Ö´+°;2°´61+°6/²6 +³@67 +°±+°@2´+°2² +³@: +±E+±#±!(99°´  &$9°°9±²!#999±3*³&$9±7>³(-0$901#".'732654&#"&5467&'#"&'>73265#5!!3254&#Ó&#"dT7&'#"&'673265#5!##3254&#† " JO+!%6b?(3-5N*5I41* +"2"<8  Ø7W&$"43f9#=B   >!)0NdZ ;PA.@1(7!& #,F‚3!N033"#2 UK+þò§$H8 )ÿ×ÿÊ.CM°+/´?+°?°; Ö´.+².; +³@.( +°/°3±Gé´+°/±D33´+°N/°3Ö´8+°8±+´+°D2°´1+°/² +³@ +°±(+°A2´'+°I Ö´!+²!I +³@! +±O+±83±599°²6999°°.9°² =999°(µ +?GK$9°I°$9°'°9±;+°A9±?´358$9°± $99±G³ !$901"&5467&'#"&'673265#5!##5&#"#".5473>3254'3254'"'`C$;'6"<8 % Ø7W$30< O $7 ,5*#<(„8$=EH%"#OH‚3 *M133"1 5þ·3*!/) 2:;&3Ø1¶$H8$ÿñÿh(.V_L²+´+² +³@V +°° Ö´+°/´&+°,/±Zé³;Z,+´B+°"2°F/±IW33´G+°`/° Ö´+°! Ö´"+°2°±4+´/+°W2°/´E1+°E/²E/ +³@EF +°/±V+°2´U+°U±)+°\2´R+°L2²R) +³@RI +±a+±!° 9±E"³;>$9±/4³29$9°V´&,17$9°U±OZ99±R)°J9±°9±&³ T$9°,´ 24R$9±B;²!7O999±FZ³>@9L$901.#"#".547326325#".'732654&#"&5467&'#"&'673265#5!##3254&#uD=/E#-EG/38)1[?43=k@5I3$)2(5"<8 !Ø7W% #">3[9#=c' ,.(- ,;) +b 2HZG AvX@1(7%! E‚3:M133"!4 UO.ó“$H8 *ÿ×ÿq&.7?ܰ/° 3´+°/±;é³;+´'+°-/±0833´.+°@/°*Ö´8&+²*8 +³@*- +³8*+´+°/´+°8±+´+°= Ö´3+²3= +³@30 +±A+±*± ,99±8±99°µ6;?$9±=°19±²999±'²6999±-;´!#*3$901%#&/532>54#"'67&'#"&'6732654'#5!#'3254'·#J1|¢"vÝ54!$0>!`G1z/"<8 #Ø7W.&?·8$=ô+3#B#m3,"I] |?‚3!E# 33"%7#Á$H8$ÿÓ. >Á²+°&/´%+°!/´++°$9012654'#%3267#5!##5.#"&546325.'&'#"'P ’ 'þÛ 4ÌA¥-5&Cÿìÿƒü.;±²+´+°/´$+²$ +³@ +°0/´9+°+/´+°/±33´+°,-H% :(20A,-û84E®¸K7"33ýˆO‘ *1)#C21ÂN4?4j" Eÿ× s Jç²%+°5/´ +°< Ö´D+³1 5+´+°A2°H/² "333´I+° 2²IH +³@I +°H° Ö´+°K/°GÖ´ 1+²G +³@GI +° ±%+°2´$+°2²$% +³@$" +±L+± G°:9°%·5J$9±<%±*-99°5°9±1D°39± ²)?999°³:$9±H°901267&#"'3254'"'3#67632533##4&''654.#"#".'#"&'673265#5!æ0)S43>ú8$=`' B!…F3VV3+»$%$34 "<8' Ø7¸(8R)($H8$)‚ÑE3þ:GÁ"' '(‚3!+M13ÿ×ÿ™ sHR\a6²+´+² +³@H +°° Ö´+°&/´V+°- Ö´5+³"V&+´I+°22°9/²ES]333´:+°C2²:9 +³@:A +°9°P Ö´>+°b/°8Ö´S1+²8S +³@8: +°S± +´+°±H+±@22´G+°B2²GH +³@GE +±c+±S8°+9° ±&X99°³ $^`$9°H¶ ";IN]$9±°9±-´  $9°&°L9±"5°$9±IV²0@999°P³+NX`$9±>9°<901.#"#"&547326324&''654.#"#".'#"&'673265#5!632533##267&#"'3254'"'3#6EI LZ.EF.46+»$% ",4 "<8 $ Ø7!…F3VV3þÏ0)S43>ú8$=`' 2( M@%0 .<) +)GÁ"' %(‚3!*M13‚ÑE3ýž(8R)($H8$ÿ×ÿ¾™sP[ejQ²=+²F+²K+°@/´O+°8 Ö´+²8 +³@85 +°/´_+° Ö´"+³_+´Q+°2°&/²2\f333´'+°02²'& +³@'. +°&°Y Ö´++°k/°%Ö´\1+²%\ +³@%' +°\±L+´C+°C±+±-522´4+°/2²4 +³@42 +±l+±\%°9°LµQafg$9°C³() $9°@ +8GIOUWY$9±8=±CL99±@±99±O± 99°°U9±"°9±Q_²-999°Y³Wai$9±+&°)901%63254&''654&#"#".'#"&'673265#5!632533##54#.#""&54632267&#"'3254'"'3#6´ (/ »%&24 "<8 # Ø7ƒH3UU2#-1$#-7#5!!#2#"'73254.##4'#326îDO LZ.DG.46#—7"^"(     #ÂôþÕ"!' ’2é) /"( 9&3U’!1*2' M@%0 .<) +.7I-Z*8 -  !B933)*7# *?%¬2.& &þ'%T2$ÿ׬. Bé²+°$/´#+°/´++°//´+°6 Ö´>+°B/² 333´+°C/°AÖ´ 1+²A +³@AB +° ±'+´!+°!±+´+°±+° 2´+² +³@ +±D+± A°49±!'´-/$9±µ#$+$9°°9±#± '99°+°9±>/°9±B³49;$901!3254'"'%!##54&#""&54>3&'#".'#"&'673265#·". 9þË8$=þYÕC4\+ ' )(% / 4 "<8 % Øû".0</ 3$H8$33þoZ (+" /!(‚3!+M1ÿìÿo .CÔ°/´+°./´7+°)/´+°?/³ B$3´@+°2²?@ +³@? +°D/°%Ö°2´ +² % +³@ B +³ %+´"+°"/´+° ±+° 2´+² +³@ +² +³@ +±E+± ²999±.´ "%$9±)7´&,01$9°°9°?°=9016325#53##54&#"3".54675.#"#"'73267.'5#5!#s@5"'2313/¤B3Q#     :(20A,- B_8ü!û84E®þ:4ý33ýt6? (!, ÁN4?4j" EK7"33ÿ× .?Iõ°1/´+°( Ö´+²( +³@($ +°/´C+° Ö´+°/±@33´+°J/°=Ö´4+°4±+´@1+²@ +³@ +°@±$+°2´#+°#±E +´ +² E +³@  +±K+±4=°9°µ17:$9°@± 899°$²-C999°#°I9° °9±1(°9°°9±°"9±C³ $901726325.'#"&'673265#5!##54&#".#"#"&5463254'"'¨10!2 "<8 " !Ø7W33** $ .9B€8$=ë6 ž'‚3!(F833"<þÙ(  %*(-5,$F$H8$ÿìÿ²ü.Oϲ+²#+²++°/´/+° Ö´3+²3 +³@ +°>/´M+°9/´+°/±33´+°P/°,Ö´"+°"±5+±22´+²5 +³@ +±Q+±",²>M999°5¶ &)/<$9±±",99±3±1599±9M´6¥° /´ +°/´+°/´+°#/´.+°;/´<+°?/°Ö°+2´+°&2°±:+± 22´9+°12±@+±°)9°:¶ (.3$9± ´568$9°°9°°39°°9°#³ )+1$901.#""&546325&/32>54&#"&54632&'#5!K '7!&"/>,-H%z’_:&: M$B0d/6l•¥Y&&3þœà|"8 *2)#C21Tc09!(# $<#$*9+KZ9o2[p!*ÚÆ33ÿÓÿÈI..2†°/´+° /´+°/´*+°//´0+°3/°'Ö´"+°"± +´+±4+±"'°%9° @ $*$9±²999° ¶ "%'$9°°-9012'654&#"&/32654&#"&546326%5!Û0:.;&A|¤Z&¥Ý[,CXK&1++ Q?0a 5þ'v¥;1$:*.#a!Yr!»G9!@3$=4 %4EF*-V33ÿéÿú§..<Aú²+°/´%+°(/´/+³A/(+°3´5+°+2°/²:=333´+°B/°,Ö´++²,+ +³@, +°+±%+°:2´2+´>+°2±4+±=22´+°2²4 +³@ +°±+´+±C+±+,°9°%´"/;$9±³ $9±´ "4$9°%°29°5²999°(²,999±/A² 999014'#5!#2>7&547#5.#&'>34&#"'46725.5#7#3f%X¾ê# 0D3O+$1C<-)CBVG)-øR1!Å#33] */‹O…n=þŽ|6E!6A%+ l@;¦7&2*ÿçÿË=.Gæ²9+² +°/´+°C/°=3´)+°-2°/´$+°3/°63´4+°H/°!Ö´+°±+´+°±@+´?+°?±9+°12´8+²89 +³@86 +²98 +³@93 +±I+±!°9°³ $$9°±'99°@´ )$9°?°+9°9°-9±° 9°C·!1@$9°)±'+99013"&'&/32>54&#"&546326326325!5!##4&#"4&#|4/.A %C¥Y&©Ù_:&: M$B0d/'V":0/+&ý+VN3@%'." %.301+"[p!ºH9!(# $<#$*9+K4''0+ ‡33þYL&3)ÿçÿJç.DHư2/´A+°* Ö´+°/´+°/´+°E/´F+°I/°Ö´+³5+´>+°>/´5+°±+± '22´%+°2±J+±>±99±5°9°@  *289;A$9±2²"C999°A°%9°± 99°°9°³ $901%25&/32>54&#"&54632&'#4&#.#"#"&5463265!"z’_:&: M$B0d/6l•¥Y&&2-+"#!.;J(2( þíàOc09!(# $<#$*9+KZ9o2[p!*¢7-  B"07,+?0ø33ÿçÿ“W~HS]j°R/´L+°/´++°5/´A+°X/´+°2²X +³@X +³X+´\+°:/²=333´;+±22²;: +³@; +°^/°%Ö´&+°&±8+´?+²?8 +³@?< +²8? +³@8; +³J?8+´O$+°?±.+´+°T2³.+´D+°D/´+°\2°±V+´+°± +°2´ +°2´#+±_+±8&°'9±O?µ5+ALR$9°D°=9°.°19±°9°V´X$9±5+°9°A².T999°\°19°X² V999±±D99°:±%&99012533##&#"32632'#".'32654&'#"&=#5!#32674>4632#"654#"+1;K-2AB3S^*= 8,&n!p[=b7'/Z4(-CP4 %á« Œ`&8+þÉ "åb G!/0HÇP3þ `›: 7!kWjIe[&†©$[H4 7!5+­33©/i(: ýƒ2i^"7ÿÝÿhT.)05”°/´ +°*/°&3´ +°2²* +³@*) +°/°3´+°6/°)Ö² *1222´(+°2²)( +³@) +°(±#+´+²# +³@ +±7+±#(±99± °9°*´  -$901.#'67.#'675!5!##"'72>54&+#/P+!AU,w;z™þ®wò9F0/")( \23œ)‰MKf!*0D,8P6`*.33.(L1#B%'7LýÎ2JX/W* +ÿÉï{6²°"/´+³"+´%+°/°33´++°12²+ +³@6 +²+ +³@+/ +°7/°(Ö´+°± +´+°±6+² .222´5+°02´3+±8+± ¶ %+$9°±99±"%± 99±±(99°°.901%.#'675&#"32632'7674#"#"&54632533##yMKQ,!LeV^!F O",E**8+ N  WC9M.3CC3º* A *0L2o›7#)"!E( 6)%1^5HÇM3ýÎÿçÿN¿.*3ˆ° /´+°/±&33´+² +³@ +°4/°Ö´)+²) +³@ +°)±+±%+22´+² +³@ +±5+±)± 99°³ 1$9± °9°±9901.#'67./7#"&547#5!##27#OQ,!ES"q=N &HOØ=3& !&')Þ3Å  J *0E-0B (R8,33ýSE $ #a0 þ©   ÿåÿU±.(1° /´))+°/°3´+°2/°Ö´)+°2²) +³@ +°)±(+°2´'+°'±- +´$+²$- +³@$ +±3+±)± 99°(³ /$9±) ²999°²&199901%.#'7&'#5!!3#'2>54.'$  JP,! cÌþÊ  #433–#bDLgC   >!)0Ô33= (&4Gþ¾àYi ÿñþò.BMǰ/´ +°-/´C+°*/´>+°2/°53´3+°N/°0Ö´L+°62²0L +³@02 +°L±F+´*+°*±+±$22´+°2² +³@5 +±O+±L0± 99°F²-999°*± 99°²>999± ° 9±*C³$FL$9°>±HI99°2°K901&'#5.#'67򂂮.'#"&=#5!!322654'#"'\# J3%80/X25"3O+!B]€ƒGVx  _104*þ= "12!)þæC1     ¼ <(8)0$î3#'0F/U4[2 @].á33  7;K&†ÿçÿ7a.H °"/´)+²)" +³@)% +°0/´+°/´>+°7/°:3´8+°I/°%Ö´&+°&±4+´+²4 +³@47 +°±,+´+°±H+±22´G+°B2²GH +³@G: +³DGH+´ +° /´D+±J+±,@  ")06;$9°°9° °>9°H° 9±GD°@9±)"° 9°0³ ,D$9°°.9°²4999°>°A9°7±@9901%.#'67&547".'32?#"&5332654'#".547#5!!327#ÜKKQ,!DY #T[)$*%*`4jz3aO"@(1'2KåzþÀK923%( >!)0F../]X*. B!-"$,!@RÒ¥ˆ¼6'$&1/a1337'!>_;HTÕÿÇÿZš'Aê°/´+°0/° 3´1+°2°B/°:Ö´?+°?±.+´ +². +³@.0 +° ±+°2´+°± +´+°4 Ö´+²4 +³@ +±C+°6º—À*+ °A°À±7ù°6À³67A....³67A....°@±?:°<9°.°=9° ±')99°µ&+$9°±99°4°29±°9017523!32654#"'632#5./67.5#5!654'"&5473G$B>.I/þÓ;d&!"-33  !d[[š3G!*a!#/š%l32533##dMKQ,!MdY$-H, )F>)3& 3__3»* B *0L2c+w4<>3^+1:('Êc3ýÎÿßÿ.U.:>m°%/´2+°;/´<+°?/°-Ö´(+°2°(±:+°2´9+°9±"+´5+±@+±(-± +99°:µ %*2$9±2%±9901%.#'67. '332654&#"&54>32#5!`+JQ,!-3/#  3 ")=(BLF57 + 8&Kc503þv  >!)0.".#=#DBK^b6"\IFa!#'" '}]AiþôÍ33ÿ[ë†-2´°/´+°'/´$+°/° 3´,+°2², +³@ +², +³@, +°3/°)Ö´"+°"±+´+°± +±.22´ +°2² +³@ +±4+±")°9°@ &'+,0$9± °9±°9±$²)9990133##5.#'67./67654&#"327"54624\%jI4QQ4P, XV~Q2JL§8P)YïX3ý`3 *0@*=@ 8<"*$4M2DJþe&ÿè«. &p°/´ +² +³@ +°/° 3´+°'/°Ö´ +²  +³@ +² +³@ +° ±+±$22´+±(+± µ !$901"##5!!632#7./6754&5'g3HÃþ·LP12 &5 cRUK>˜}* 33 pþ( +R#E ä9 &-ó5+05¡²+°3°5/°3´+° Ö´'+°6/°$Ö´ +° ±+±,22´+°12°±+±322´+² +³@ +±7+± $° 9°³"').$9±°9±5@  $*,01$9°°)9015%"75!##5.'#5./7&54632&7675#’0{.€þä#y«g3†C3GkMp^),*' ŸyUxV3gwÞ: O4ò >¯ DJ3þX/{ þõVGK)[F=8Y323>üD'@s$þk>j3  !$z 94 ))&)H2 Ò#/š"°>33-&5þ¾"*!L, !2% ,,ÿØÿ˜Ú.$,q°/´+°/°3´+² +³@ +°-/°Ö´ +° ± +²%222´+² +³@ +²  +³@  +±.+± ´*$901767.#"&54>325!5!##5.#7¦JfA&'"!4#4,b3þP3Q,# KEN0?C , '&D/F"fÌ33ý3 *q   ÿÉ s&1s°/´'+°//´+°$ Ö´!+²$! +³@$& +²!$ +³@! +°2/°&Ö² 222´%+° 2²%& +³@%# +±3+±'²999°/°-901%.#'6754&''654&#"'>32533##267&#"‚MKP*!Md,»$%.# n6…F3VV3þÏ # S34 ?»* B"(0N0FHÁ"&!$ $1P‚ÑE3ýÎï ,+R)!ÿçÔ.#(ˆ²+°3°/°3´+°/±$33´+°)/°Ö±22´+°$2² +³@ +°±+±'22´+² +³@ +±*+±°9±µ #%$9°°'9015.#'675!5!##5.'#675s.{.€bRp'!~”þ½íf4…D3-z%ˆ3on: M6ò >úUH6b++33þX/z þõ >X,J”L+ÿéÿYA.=AŸ°;/´+°/´ +°02°>/´?+°B/°0Ö´1+°1± +´+°±$+°2´#+°#±7+´+±C+± °)9°$· (+4;$9°#±999±;°79°² 9999° ²199901%4632&#"3267#5.#'67.'32654'#"&'5!…  Já)4! K%3!%(#2M,!'*:_B*9%”T,P"5R3O»XG   ®#00:2G #!9 &Rþñ3!)0) LukD“¥Q?3Z7Â33ÿéÿðÕ.<«²+°5/´0+°/±33´+°=/°8Ö´.+²8. +³@8 +°.±+°2´+°± +´+² +³@ +±>+±.8°9°µ25;$9°°9°°9±5²'999°0²)3999°³,8$9017574'#32%#5!##5./67.#"327#"&54674¾G$Ex#µ '*:þòeìa3  !'l$c +& ·#/š&Â4,#)¢3309;þ¼"*#CG3*'(ÿèÿc .@EPô²+´+² +³@@ +°° Ö´+°-/´(+°6/±9H33´7+°Q/°Ö´ +° ±0+´&+²0& +³@06 +°&±@+±C22´?+°?±F +´<+²99°6³$0NBè93hO/û82NàýŸ +0L1C+P,L/‰&!"33ým¬+}ÿôþ÷à. F¾°0/´=+²0= +³@0) +°0°- Ö´@+°#/±&33´$+°G/°5Ö´:+°:±+´+² +³@# +°±)+³ B$2´(+²() +³@(& +±H+±:5°79°²!"8999±)· 0=$9±=-°B9±#@¶ 57:C$901%55>754&#".547.'5#5!##5.#"#".547326325.#O/½=79.±0O2`#B2TB.Š ALGì83B!=/E#-DH 1 47R,+}·73Nàþ27 €C+O,G1ˆ$$"33üü5' ,.%0 .<) *+,ÿßÿ˜ .4¶°/´+°/°3´$+°(2°./°13´/+²./ +³@.4 +°5/°!Ö´+°±+´+°±4+² ,222´3+²34 +³@31 +²43 +³@4. +±6+±³ $$9°±&99°4±(99±° 9°²!,999°$°&901%.#'6754&#"4&#3"&546326325!5!##ŒMKQ+!Md@%'." 5.54&#"&54632675•.{,„þ;f4H"^¥Y&©Ù_:&: M$B0d/3gnq: M6ò @ª33þX66 [p!ºH9!(# $<#$*9+KQ5L+ÿçÿ'ç.26V°/´&+°3/´4+°7/°#Ö´+°±2+±22´1+°)2±8+±#°!9°2¶  &+$901%.#'67&/32>54&#"&54632&'#5!K # JR+!EZu…_:&: M$B0d/6l•¥Y&&3þœà   >!)0F/X,9!(# $<#$*9+KZ9o2[p!*èÔ33ÿ™›„_²+´+² +³@ +°° Ö´+°/´N+°$/´%+°%°W Ö´X+°-/´8+°R Ö´]+°I/´F+²FI +³@FD +°`/°Ö´+³0+´5+°±(+´>+°>± +± C22´+±EI22² +³@H +°±Z+´U+°U±P+´+±a+±0°9±5±299°(@ $%-3;A$9±Z°L9°U±N99°P²WX]999± ° 9±³!C$9°N±99°$°9°X°L9°%±A99°W°&9°R°Z9°-°J9±8]±(>99°I²03*999°F±;29901#".'#5.#"#"&547326325./>54'"&547326733#3274#"3"54632ƒK+( 4CQLZ.EG 7 46³86q4)$1( ,(54'"&547326733#67O/_4CQLZ.EG 7 46³86q4)$1( ,($9°Cµ(-1;?$9°8²6G999°4²0999°°90127#".'73254'#"'732654&'.#"632'654#"&546Î#0%s/O;8RGE/ -/C%M 6$,E-/()"9$J[OY…Y6#80B9]ªp R.T5B%O *"%Q[%`;+1>#J .Fÿ®{\€°/´+² +³@ +°° Ö´+°/´L+°U/´T+°5/´)+³&)5+´8+°)°Z Ö´P+°!/°F3´>+°D2²>! +³@>B +°]/°Ö´+³;+´$+°±3+´,+°,±+±A22´+±CG22² +³@F +°±W+´R+°R±N+´+±^+±;°9±$°9°3·!)/08>$9°,± 99±W°J9°R±L99°N³TUZ$9± °9±±99°L±/99°U³0J$9°T°9°8±RW99°P±,99°5°H9±Z&°;9°)°$9°!°A901"&'#5.#"#"&54732632&#"32632'7674#"#"&54632533#3274#"3"54632„KT)3C@YM.DG 3 28V^!F O",E**8+ N  WC9M.3ññ  6 *>0#$,96G##þ¬6' W6), *;) *<›7#)"!E( 6)%1^5HÇM3‰G,X'$;(<ÿ®{{PO²+°/´+² +³@ +°° Ö´+°6/´*+³'*6+´9+°"/°G3´?+°E2²?" +³@?C +°Q/°Ö´+³<+´%+°±4+´-+°-±+±B22´+±DH22² +³@G +°±+´O+²O +³@OL +°O° Ö´+°/´+±R+±<°9±%°9°4·"*019?$9°-± 99±O°K9±°9± °9±9@ 01ILO$9°6²- K999±*'±%<99°"°B901%&547#5.#"#"&54732632&#"32632'7674#"#"&54632533#67O/^3C@YM.DG 3 28V^!F O",E**8+ N  WC9M.3ÏÏ@7 g"þ†6' W6), *;) *<›7#)"!E( 6)%1^5HÇM3$Z$C+ÿ¾{e™²+²+²+°/´!+° Ö´%+² % +³@  +°/´U+°^/´]+°>/´2+³/2>+´A+°2°c Ö´Y+°*/°O3´G+°M2²G* +³@GK +°f/°Ö´+³-+´D+°D/´-+°±<+´5+°5±+±'J22´+±LP22² +³@O +°±`+´[+°[±W+´+±g+±-²/9A999°<@ !*28>G$9°5°9°°#9±`°S9°[±U99°W³]^c$9± ±99±%±#'99±U°89°^²9S999°]°9°A±[`99°Y±5(99°>°Q9±c/°D9°2°-9°*°J901"&'#54#.#"#"&54632632&#"32632'7674#"#"&54632533#3274#"3"54632„KT)3"- .$#.;C/1) (V^!F O",E**8+ N  WC9M.3ññ  6 *>0#$,96G##þÞ(< ,4/7,$F1›7#)"!E( 6)%1^5HÇM3‰G,X'$;(<+ÿ¾{{Yh²+°3²+²+°/´"+° Ö´&+² & +³@  +°?/´3+³03?+´B+°+/°P3´H+°N2²H+ +³@HL +°Z/°Ö´+³.+´E+°E/´.+°±=+´6+°6±+±(K22´+±MQ22² +³@P +°±+´X+²X +³@XU +°X° Ö´+°/´+±[+±.²0:B999°=@ "+39?H$9°6°9°°$9±X°T9± ³$9±&±$(99±B"·9:RUX$9°?²6)T999±30±.E99°+°K901%&547#54#.#"#"&54632632&#"32632'7674#"#"&54632533#67O/^3"- .$#.;C/1) (V^!F O",E**8+ N  WC9M.3ÏÏ@7 g"þ¸(< ,4/7,$F1›7#)"!E( 6)%1^5HÇM3#`%gÿçÿº.kˆ² +´+²+´+² +³@ +°)/´0+²0) +³@0, +°a/´M+°7/´ +³V 7+°53´U+°Q/°3´[+°E2°>/°A3´?+°l/°,Ö´-+°-± +´ +° ±; +´+²; +³@;> +°±3+´&+°&±+´i+°i±X+´S+°S±O+´^+±m+±3@ #)07=B$9°&°9°±E99°i²999°X³GKfk$9°S±Ma99°O²UV[999± ±k99°°9±a0±i99°M±&399±V7°f9° ±Kg99°U°^9°Q´"#;X$9°[±GI99°>°901.#"#"&5332632.547".'32?#"&5332654'#".547#5!!3273274#"3"54632#".'ïA t"IE3X!y '$ #T[)$*%*`4_…3iG"@(1'2Kå(þK94 )7 *>0#$,A4   --4dU†4 r]X*. B!-"$,!@RØŸƒÁ6'$&1/a1337'! B3X'$;(<-,Q ,M6A…ÿçÿºÕ.[q² +´+²R+²+´+² +³@ +°)/´0+²0) +³@0, +°7/´ +°/´E+°>/°A3´?+°\/°,Ö´-+°-± +´ +° ±; +´+²; +³@;> +°±3+´&+°&±+´Y+°Y±T+´O+²OT +³@OL +°O°Q Ö´R+°R/´Q+±]+±3@ #)07=B$9°&°9°±E99°Y²999°T´GIHW[$9±OR°K9± ±[99±R±Q99±70´&3OY$9° ²5TW999°µ#;ILV$9°E±HK99°>±G9901.#"#"&5332632.547".'32?#"&5332654'#".547#5!!32767&547ïA t"IE3X!y '$ #T[)$*%*`4_…3gI"@(1'2KåîþLK94 ,8/]--4eT†4 s]X*. B!-"$,!@RØŸ„À6'$&1/a1337'! #`%WU a£"K5A…ÿåÿõÂ.JN ²+° /´+° Ö´+°/´9+°9°$ Ö´)+°C/´B+°=/´H+°/´/+°L/´M+°O/°Ö´+°±+°2´+°22°±E+´@+°@±;+´+±P+±°9°´ ,/$9±E°69°@±999°;²BCH999± °9±$9²'999°C³"&6$9°B²,5999°=³3E$9°H±29901#"&'#4#"#"&54732632&#"327#"&546323274#"3"546327!5!©L*)'.\Š =K, Vv'&w !)•7. 5* >0#$,ý#Ý97F!#þõr]I4<*3$#m'$#*8Œ. ) &4X'$;(9’3ÿåÿõ¡.9=¿² +°3° /´+° Ö´+°+/´&+°!/´1+°;/´<+°>/°Ö´+°±+° 2´ +°42° ±+´+±?+±°9°´ .1$9±±799± °9± °9±&+²)999°!@ (.48$901%&547#4#"#"&54732632&#"327#"&5463267!5!b/^.\Š =K, V"s'&w !)•7. @7?ýD¼ˆ>G a£"þÍr]I4<*3$#m'$#*8Œ. :›?3ÿœ†]h²+´+² +´+² +³@ +°/´L+°"/´#+°#°U Ö´V+°4/°P3´/+°[2°*/°F3´:+°D2²:* +³@:B +°^/°Ö´+³7+´-+°±'+´<+°<±+±A22´+±CG22² +³@F +°±X+´S+°S±N+´+±_+±7°9±-±#99°'@ "149:?$9±X°J9°S±L99°N²UV[999± °9±³ A$9°L±99±V"±?99±U#±J99°4±SX99°/°H9°*²'7<99901#"&'#5.#"#"&547326325&/67654&#"327#"&546233#3274#"3"54632„K+*'4C>LZ.EG 1 46vš,p'@7) ? (V~Q]$iJ4ðð-6 *  >0#%,94I"$þ5( M@*+ .;) +B›8;"*$3-!2DJ=7Q(ZïX3Š (PX'$;(<ÿ{†R"²+´+²+°3´+² +³@ +°(/´)+°:/´5+°0/°L3´@+°J2²@0 +³@@H +°S/°Ö´+³=+´3+°±-+´B+°B± +±!G22´ +±IM22² +³@ L +° ±+´+±T+±=°9±3±)99°-@ (7:?@E$9±±P99±±!99±(µ"G$9°)²E999°:²NQ999°5°P9°0²-=B99901%&547#5.#"#"&547326325./67654&#"327#"&546233#67=/^4C>LZ.EG 1 46 ;/C$,p'@7) ? (V~Q]$iJ4ÏÏ@7ˆCB g"þg5( M@*+ .;) +B!!58;"*$3-!2DJ=7Q(ZïX3eÿûÿ·.<¯°/´+°/´+°&/´8+° /´ +°./°13´/+°=/°*Ö´5+²5* +³@51 +²*5 +³@*. +°5±+´ +±>+±5@  &-2$9±³$9°°9±8&°9° ± #99° ²*5;99901%&#"3262&'#"&4632654#"#".5467#5!!32>F$ $%3@CW6(0M9<("/24:3;-,9 †!þ +0&0\LD4_[DNBA9908?JV'?-:#&K22O&7(/(ÿîÿþÓ.K8²+° 3´+³+´"+°/´;+°D/´C+°?/°(3´I+°42°-/°03´.+°L/°Ö´+°±++´2+²2+ +³@20 +²+2 +³@+- +°2±&+´ +° ±F+´A+°A±=+´+±M+±°9±2+²*999°&°"9° ² $(999°F³ 49$9°A±;99°=²CDI999±° 9±"°$9°´ &*$9°;²+999°D²92999°C±99°?±7F99°I°5901#".'&'"#".54732632&547'#5!!673274#"3"54632°A4!, .(5'm '0!1-$#p #* ƒd.žåýìe•,  6 *>0#%+9,Q0 1C^P "@*/:!3:jS³2"33ê†!F+X'$;(<ÿïÿù›.<ÿ²+²+° 3´ +°/´#+°-/°03´.+°=/°Ö´+°±++´2+²2+ +³@20 +²+2 +³@+- +°2±&+´ +° ±+´+°° Ö´+°/´+±>+±°9±2+² *999°&²"#999° ² $(999°´ 457$9±°99°°:9±± 99±# °$9°-@  &*$901%&547.#"#".5473262&547'#5!!6767S/[ .8$n" '0!1-$!oF* ‚d.ž¬þ%e•, +8ˆCB fž"1C^P "@*/:!3:gV³2"33ê†! #€ÿ™5WP²+´+² +³@Q +°°U Ö´+°M/´9+°B/´A+°=/´G+°/2°4/´1+°' Ö´"+°X/° Ö´+°±+´*+°*±Q+²0222´P+°42²PQ +³@P3 +°P±D+´?+°?±;+´J+±Y+± ° 9°± 99°*°9°Qµ"$$9±DP°79°?±9M99°;³ABGL$9±U°9±M³ $9°9± 99°B²7O999°A²J999°=°D9°G±599°4µ*.0%$9°'°$901%"&547326325./7&54632&#"75!#3274#"3"54632"&'#5.#"yyUDU™F`.EF 3 :FkMq_<+( $y$ñ  6 *>0#$,KT)3D =œ +°/°3´+°E/°;Ö´5+°5±'+´+°± +´+² +³@ +²  +³@  +³ +´-+°-/´+±F+±5;°99±'²28>999°-´"$)/$9° ³ B$9°°9°± 99±$±"&99°±99°)±'+99°2µ-9;B$9°>± 99017327&#"74'!5!#&'#"&4632654'.#"&546323>×#&Ã$þk>j D.-)=52$.6&6 o& )6')H2 § ý>33,'2*(!EbQE'+H,'"+Q !2!+,,ÿáÿä.=˰;/´4+°./´+° /´+°!/°$3´"+°>/°Ö´ +° ±+´1+°1±+´'+²' +³@'$ +²' +³@! +±?+± °9°² 999±1@  *+69;$9°'°%9±4;°99°.²,6999°°+9° ´*$9°±'990174632'.#"&54>323>54'!5!#&#"327'#"&Þ;,  :1 ))&)H2 $þk>j(#%" …'o"*E¼(39- !2% ,,>33-&> SªŠ'ÿá(.+•°/´)+°/´%+°/°3´+°,/°!Ö´+°±+´ +² +³@  +² +³@ +±-+±!°9°µ%$9° ² 999±)³ $9°°!9°%± 99014'!5!#'7".#"&54>323>š$þk>jd†ý:D  ))&)H2 ¨>33-&1,Ge8²g,, !2% ,,ÿáÿü.G²-+´3+°9/´:+°@/° 3´+°/´+°/°3´+°H/°/Ö´0+°0±+´+°±+´C+°C±+´"+°(2²" +³@ +°"±5 +´*+²*5 +³@* +°5°= Ö´&+±I+±° 9°° 9°C±99°@ -39:@EF$9°=² $7999±93±*599°:²(7F999°@²&E999°´$/0$9°°9°±"99017467&#"&54>323>54'!5!##"73254'#5>54&#"3&Å80?' ))&)H2 $þk>j!D"4ZIÝj0(˜Wp2 89,O*51]ý$? . !2% ,,>33-&($0426BG‹—C) 1(%'4 ÿëÿþQ.Z|²+° 3´ +³ +´#+°/´K+°T/´S+°O/°)3´Y+°D2°/ Ö´9+°=/°@3´>+°[/°7Ö´2+°2±+´+°±;+°,2´B+²B; +³@B@ +²;B +³@;= +°B±'+´ +° ±V+´Q+°Q±M+´+±\+±27°59°°49°±/999°;°9°B± +99°'±#99° ² %)999°V³ DI$9°Q²KX999°M±ST99°°Y9±° 9±# °%9°´ '+$9°K²,999°T³-5B$9°S´46I$9°O²2;V999°/±7G99°Y°E901#".'.#"#".54732632&547'5&#"&46325!5!!673274#"3"5462$K*!, /7%n# &/!24$o! , ƒd.<6!(9(5<þífýàe–, -7 *>0F-96G1 5AUY "@*81!3:b[³23vR3L’33ê†! 93X'$;(:ÿëÿù .N0²+²+°3´#+°/´&+°2/´<+°@/°C3´A+°O/°:Ö´5+°5±+´ +° ±>+°/2´E+²E> +³@EC +²>E +³@>@ +°E±*+´ +° ±+´+°° Ö´+°/´+±P+±5:°89°°79° ±2<99°>°9°E±#.99°*±&99° ²(,999°´ GHJ$9±°L9±± 99±&#°(9°2@  *.8:>EJLM$9°<±GH9901%&547.#"#".54732632&547'5&#"&46325!5!!6767Ä/\ 9%m#(. 24"q $) ƒd.<6!(9(5<þí!þ%e–, +8ˆK: d ,4@UY"@*81!3:b[³23vR3L’33ê†! Œ ÿ™¦sMXP²+´+² +³@ +°° Ö´+°/´=+°F/´E+°A/´K+°22°K°N Ö´*+°8/´5+²58 +³@53 +°8°V Ö´0+°Y/°Ö´+°±+±222´+±4822² +³@7 +°±H+´C+°C±?+´+±Z+±±,99°µ*0NT$9±H°;9°C±=99°?²EFK999± °9±±99°=²$999°F±%99°E±;99°A²'HR999°*±,999°K°#9°N°-9°V°T901#"&'#5.#"#"&547326324&''654&#"'>32533#3274#"3"54632%267&#"A4*)3CI LZ.EG-46,»$%.# n6…F3ññ)7 * >0#$,ýÄ # S34 ?9,Q##þ—5( M@!4 -<) +)HÁ"&!$ $1P‚ÑE3‰<3X'$;);Q ,+R)! ÿ™}s@K²+°3´+² +³@ +°° Ö´+°,/´A+°:/´7+²7: +³@75 +°:°I Ö´2+°L/°Ö´+°± +±!422´ +±6:22² +³@ 9 +° ±+´+°° Ö´+°/´+±M+±±.99° µ,2AG$9±°=9°°>9±°9°°!9±,@ &.;=E$9°A²%/4999°I°G901%&547#5.#"#"&547326324&''654&#"'>32533#67267&#"?/W3C:LZ.EG,46,»$%.# n6…F3ÈÈC-þ # J%52 ?ˆCB g"þo5( M@!4 -<) +)IÁ"&!$ $1P‚ÑE3œ%€ ,+H()! ÿ¾¦sWb^²+²+²+°/´#+° Ö´'+² ' +³@  +°/´G+°P/´O+°K/´U+°<2°U°X Ö´4+°B/´?+²?B +³@?= +°B°` Ö´:+°c/° Ö´+°±+±)<22´+±>B22² +³@A +°±R+´M+°M±I+´+±d+± ²./4999°·#1:\^`$9±R°E9°M±G99°I²OPU999± ± 99±'±%)99±G°.9°P±/99°O±E99°K²1R\999°4±6C99°U°-9°X°79°`°^901#"&'#54#.#"#"&5463263254&''654&#"'>32533#3274#"3"54632%267&#"A4*)3!,'(#-0#$,ýÄ # S34 ?9,Q##þÞ'= &*/6-$F1ÜHÁ"&!$ $1P‚ÑE3‰<3X'$;);Q ,+R)! ÿ¾‚sIT"²+°3²+²!+°/´%+° Ö´)+² ) +³@ +°6/´J+°D/´A+²AD +³@A? +°D°R Ö´<+°U/°"Ö´+°± +±+>22´ +±@D22² +³@ C +° ±+´+°° Ö´+°/´+±V+±"²016999° ·%3999°R°P901%&547#54#.#"#"&5463263254&''654&#"'>32533#67267&#"D/\3!,'(#-0#$,A4))4#:/ #*.) -z2" H1ƒ6`-+33Š<3X'$;(;.,Q"!þš5 ;'+* (&3{ >`!ÿúÿ™k.9@ò²+²-+´+²- +³@-$ +°°) Ö´+°:/´ +°/°3´+°A/°2Ö´7+°7±$+² :222´#+°2²#$ +³@# +²$# +³@$ +°#±+´+°° Ö´+°/´+±B+±72°49°$³ -5=$9±°9°°9±)°9°°9±:@ !"247@$901726325.#'675!5!#67&547#5.##".547„ƒ  £@"z˜þqÊA1/Y4#:/ #*.) -{2" H2„4`-+33œ %€*1T d ,þp5 ;'+* (&3{ ?`!ÿçÿN.Q"°/´(+° Ö´,+², +³@ +° /´A+°J/´I+°E/´O+°8/°;3´9+°R/°&Ö´+°±.+²6222´ +°<2² . +³@ ; +². +³@.8 +° ±L+´G+°G±C+´+±S+±&°49°.µ #(3$9±L °?9°G± A99°C²IJO999±°&9°,±*.99°(°/9° °9±JA³2 ?3$9°I²4999°E°L9°O±=99°8°69015#"&'#4&#.#"#"&46326325.#'675!5!#3274#"3"54632g~E0oªA4*)2- 1%$ .;J(3' *š9!~”þ½gñ  !6 *>0#$,:$eì8,Q##þ­<)  +607X>0,.ˆ6b++33‰G-X'$;(<ÿçÿ+.<C²+²+²+°/´#+° Ö´'+² ' +³@ +°=/´0+°2/°53´3+°D/°!Ö´+°±)+² 0=222´ +°62² ) +³@ 5 +²) +³@)2 +° ±+´+°° Ö´+°/´+±E+±!°.9°)µ #-@$9±°99°°:9± °9°°!9°'±%)99°#°*9°=@ -.79C$901%&547#4&#.#"#"&46326325.#'675!5!#67'í/]2- 1%$.;J(3' *B!~”þ½DÎ"TÃ,}%ˆˆ1T d ,þ‡<)  +607X>0,4‚4b++33 %~é @X,ÿçÉ.QU-²+°/´+´ +°/´@+°%/´5+°I2°5´J+°D/´O+³0OD+´++°R/´S+°V/°Ö´+°±(+´3+°3±"+°2´+°;2°±L+´G+°G±B+´+±W+±°9°(°9°3±99°"µ %+-9$9±L°>9°G±@99°B²IJO999±°"9±%@±99°J°9°5±>99°Dµ#73274#"3"54632%5!°A4'(- -! P9;$1C1b7aD0;3% 95;1-6 *  >0#%+ý7â9,Qù#"J5214B "èU>0!+$+ 3>8$PX'$;(:“33ÿçÿù¬.EIð² +°3°/´+´"+°'/´7+°2/´-+°F/´G+°J/°Ö´+°±*+´5+°5±$+° 2´ +°>2° ±+´+±K+±°9°*°9°5±99°$µ"'-/<$9° °=9±±A99± °9°±$99±'"²D999°7²999°2·*0%?AB$9°-³/<=>$901%&547#.#"#".547326325#"&54632&#"32>7675!n/^- -! P9;$1C1b7aD0;3% 9&%%1A6ýyň1T d ,þØ#"J5214B "èU>0!+$+ 3(E*L4N33ÿöÿ= .MTO°/´+² +³@ +°° Ö´ +°*/´)+°2°/´=+°F/´E+°A/´K+°4/±7N33´5+°U/°Ö´+°±-+´'+²-' +³@-4 +°'±+±S22´+°82² +³@7 +°±H+´C+°C±?+´+±V+±°9°-²23999±'µ)*/N$9±H°;9°C±=99°?²EFK999± °9±*±99°)°9±=±'-99°F²;S999°E°9°A±#H99°K²9/Q999°4°2901#"&'#5.#"#"&5473263254&#""&547.'5#5!#3274#"3"54632%5‡L)(*3C DYM.EF :56`#/*U+F‹ AMLªñ  !6 *>0#$,þ ?59.97F##þ;5( W6+* *;) +ø‚5+P,\-‰%""33‰G-X'$;(<•73Nàÿöÿ={.@G²+²+²+°/´+² +³@ +°° Ö´+°,/´++°2°6/±9A33´7+°H/°Ö´+°±/+´)+²/) +³@/6 +°)± +±!F22´ +°:2² +³@ 9 +° ±+´+°° Ö´+°/´+±I+±°9°/²45999± )µ+,1A$9±°=9°°>9±°!9±,²999°+°9°6¶%/F$901%&547#5.#"#"&5473263254&#""&547.'5#5!#675=/[3C DYM.EF :56`#/*U,E‹ AML…Ì?5þS?59.ˆCB g"þ5( W6+* *;) +ø‚5+P,[.‰%""33$}E73Nàÿéÿ™úsjv‚ɲ+´+² +³@ +°° Ö´+°/´Z+°./°c3´+°p2°°6 Ö´;+°.´b+°^/´h+°N2°h°k Ö´)+°D/±Sy33´E+°Q2²ED +³@EO +°D°t Ö´L+°ƒ/°>Ö´4+²>4 +³@>D +°4±+´+°±+±N22´+±PT22² +³@S +°±e+´`+°`±\+´+±„+±4>°C9°µ.89Awz$9°³+FI$9°µ)Lkr$9±e°X9°`±Z99°\³bch$9± °9±±99°Z²#999°;²$X999°.°99°b±W99°6°&9°°`9°^²4>e999°)²+2U999°h±"w99°k±A}99°t±Ir99°D°G901"&'#5.#"#"&547326324&''654&#"#".#"327#"&54674'#5!>32533#3274#"3"54632%267&#"4'#32áKT)3E?LZ.EF.46+»$%!/,#G7 *& e‹M#…F3ññ  7 *>0#$,ýÄS34 ?[#µ '*:96G##þ—5( M@%0 ,<) +)GÁ"' $":))3+'(-33 %‚ÑE3‰$')X'$;(9O)!R) 64,#)ÿéÿ™Ñs^jv²+°3´+² +³@ +°° Ö´+°3/´u+°d2°u°; Ö´@+°,/´_+°I/±Xm33´J+°V2²JI +³@JT +°I°h Ö´Q+°w/°CÖ´9+²C9 +³@CI +°9±+´+°± +±!S22´ +±UY22² +³@ X +° ±+´+°° Ö´+°/´+±x+±9C°H9°µ3=@Fkn$9°´/0KN$9° µ,Q_f$9±°\9±°9°°!9±@¶&'$9±;3²)999°u°]9°,µ079CZ\$9°_´%FSkq$9°h±Nf99°I°L901%&547#5.#"#"&547326324&''654&#"#".#"327#"&54674'#5!>32533#67%267&#"4'#32“/W3F>YM-DH :38. »$% /,#G7 *& e‹K#†F3ÈÈE+þI&24!?Z#µ '*:ˆ1T d ,þo5) W6%0 ,<) +)L Á"' $":))3+'(-33 %‚ÑE3œ`Á)!H()!54,#)ÿçO. 5;î²+°/´+°/´%+°./´-+°)/´3+³:3)+´+°/°3´+°0#$,þ09twY2"ö,Q##þþY6~4^6&33‰<3X'$;(<- \'ð"ÿçÿù'.#/¤² +°3°-/´'+°"/´+°/°3´+°0/°$Ö´*:+°*± +±!22´ +°2² +³@  +² +³@  +° ±+´+±1+±±99±- °9°'± 99°"@ !$901%&547#5.#'675!5!#67%54632#"&é/X3œF$€™þ¼@ÉB/þ}9twF&ˆCB g"þ×Y4€4^6&33œ%~… \'ð"þâÿñÿyÿ.в+´"+²+° /´+°@/´1+²@1 +³@@D +°-/´J+³jJ-+´`+°[/°S3´p+°u2°y/°|3´z+°€/°mÖ´^+° Ö´+°^±b+´g+°g±>+´4+°4±O+°w2´~+°2²O~ +³@Oy +³&~O+´+²& +³@| +°&° Ö´ +±+±^°9°b´[Gdjp$9°g´;BD/e$9°>¶-1:@JXs$9°4±VW99°O@ "*NSu$9°±)99±° 9°"³:$9°@µ &*4;$9°1±/G99°-³)N~$9°j°9±`J°O9°[´Xegms$9°p°w901%#".'732654'#"'732>54&'.#"632'>54##"&54632754&#".#"3254'7#"&546326325!5!#ñ P+@uL.3Sz7%  #;%!, 4B  H"%!/+3''=. 1-=C0; .þd?1d'  ):X}r% E—f$ - @I'D/   "C  "IDF(D!/&9-%C 1 F33þëDÿñaäJXÛ²+´+°&/´/+°6/´<+°/°V3´+°N2°Y/°)Ö´*+°*± +´L<+°L±?+´+°2 Ö´#+±Z+± *³$9°L±99°2@ /&8<@TV$9±#?°!9±6/±#299°<²!48999°±:>99°´AT$9°@ )*?@JS$9°°901#"'732654ᘀ>32>7#"&'732654'#"'673264'.'32>7#"&É(  66 M%&1 )E$M9t¾&2 1Hh8?"  '1"     1 &!,A&A (~"Y/Tݵ7xnG/ *,d%P   ( + ÿíÿ™³…i‘²+´+² +³@ +°° Ö´+°/´Y+°./°b3´)+°)°8 Ö´3+°.´a+°]/´g+°>/°S3´C+°Q2²C> +³@CO +°>°# Ö´G+°j/°Ö´+°±;+´&&+°&±+±N22´+±PT22² +³@S +°±d+´_+°_±[+´+±k+±²56999°;²38999°&³0E$9°³ ,.$9±d°W9°_±Y99°[²abg999± °9±±99°Y±99°3°9°.°W9°a²,5999±])´+06_d$9°g²;U&999°#±EN99°>°@9±CG°A901#"&'#5.#"#"&547326324&#"327#"'#"'732654&#"563263533#3274#"3"54632šA4*)3E JYM.EF 2 56P%!, <" 4#I5N3ññ  !6 *>0#$,9,Q##þ—5) W6), .<) +Ms/6 +:')11=8k_  $ÀW3‰G-X'$;(<ÿíÿ™‰…[W²+°3´+² +³@ +°° Ö´+°0/´++°+°: Ö´5+°@/°U3´E+°S2²E@ +³@EQ +°@°% Ö´I+°\/°Ö´+°±=+´(&+°(± +±!P22´ +±RV22² +³@ U +° ±+´+°° Ö´+°/´+±]+±²78999°=²5:999°(³2G$9° ³.0$9±°Y9±°9°°!9±5³$9±:0³.7$9±%+@ -28=GPWYZ$9°@°B9±EI°C901%&547#5.#"#"&547326324&#"327#"'#"'732654&#"563263533#67J/V3E LYM.EF 2 56P%!, <" 4#I5 N3ÇÇC,ˆ>G fž"þo5) W6), .<) +Ms/6 +:')11=8k_  $ÀW3œ›ÿíÿ¾³…r²+²+²+°/´"+° Ö´&+² & +³@  +°/´b+°7/°k3´2+°2°A Ö´<+°7´j+°f/´p+°G/°\3´L+°Z2²LG +³@LX +°G°, Ö´P+°s/°DÖ´/&+³/D+´+°/´+°/±+±(W22´+±Y]22² +³@\ +°±m+´h+°h±d+´+±t+±/µ"9N$9°´$57$9±m°`9°h±b99°d²jkp999± ±99±&±$(99±999±f2´49?hm$9°p²D^/999°,±NW99°G°I9±LP°J901#"&'#54#.#"#"&546326324&#"327#"'#"'732654&#"563263533#3274#"3"54632šA4*)3"- .$# .;C/1) (P%!, <" 4#I5N3ññ  !6 *>0#$,9,Q##þÞ&> ,4/7,$F1s/6 +:')11=8k_  $ÀW3‰G-X'$;(<ÿíÿ¾…eg²+°3²+² +°/´$+° Ö´(+² ( +³@ +°9/´4+°4°C Ö´>+°I/°^3´N+°\2²NI +³@NZ +°I°. Ö´R+°f/°FÖ´1&+³1F+´!+°!/´+°1± +±*Y22´ +±[_22² +³@ ^ +° ±+´+°° Ö´+°/´+±g+±1µ$;P$9° ´&79$9±°b9°°c9± ³!$9±(±&*99°$°9°>°9±C9³7@$9±.4@ 6;AFPY`bc$9°I°K9±NR°L901%&547#54#.#"#"&546326324&#"327#"'#"'732654&#"563263533#67R/]3"- .$#.;C/1) (P%!, <" 4#I5 N3ÎÎA5ˆCB g"þ¸&> ,4/7,$F1s/6 +:')11=8k_  $ÀW3%~ÿÎÿ™Ás\fnw|©²+´+² +³@ +°° Ö´+°/´L+°1/°U3´j+°`2´T+°P/´Z+°@2°Z°] Ö´,+°9/±Ez33´:+°C2²:9 +³@:A +°9°d Ö´>+°}/°6Ö´g+²6g +³@6: +°g±+´+°± +± @22´+±BF22² +³@E +°±W+´R+°R±N+´+±~+±g´18lqw$9°³.x{$9° ¶,;]bz$9±W°J9°R±L99°N²TUZ999± ° 9±±99°L²%999°1²&J999°T°9°j°(9°P²RWl999°,².Go999°Z²$6g999°]°q9°dµbmtuwx$9±>9°<901#".'#5.#"#"&547326324&''654.#"#".547#5!632533#3274#"3"54632%267&#"327'654.'"767#¨K*) 3F>LZ.EG.38,»$%V+ $4«Þ†F3óó  6 *>0#$,ýÁ0)S24?þû1b1  '96Gþ“5( M@!4 .<) +)GÁ"'  (4 ,K$3‚ÑE3‡ 1'X'$;(LZ.EG.38,»$%X* $4«Þ†F3ÒÒ<>þ0)J%24?þû1b1  'ˆCB b¢,þr5( M@!4 .<) +)HÁ"' )7 ,K$3‚ÑE3ž%~(8H()E%Y(  ÿ×ÿÿ. CK²+°!/´+°/´'+°2/´:+°. Ö´G+°@/± D33´A+°L/°=Ö´D&+²=D +³@=@ +°=°$ Ö´+°D±++°.2´+°±I +´ +² I +³@ C +±M+±D´!'0$9°+³)G$9°²K999° ± 99±!°9°°9°²$999°'°)9°2²+,999±:.±/99±@G´ 057=$90173267&#"&'#"&5463265'&5&'#"&'6732654'#5!!3254'Ï(#è -$A71%-7'9X)"<6 " $Ø7þò8$=¼  ""1 7)'HM'-"$-'/ j‚3!(@* 33$H8$ÿ×ÿû1.7AÞ²2+°5/´.+°(/´+° /´+°/±833´+°B/°Ö´++°+°8 Ö´&+°/´8&+²8 +³@ +°+±=+´!+²!= +³@! +±C+±8° 9±=+@ $%(.035;A$9°!°9±52°19°.°39°(³+&0$9°°%9± ±$99°´ !;$90174632'.'#"&'6732654'#5!#&#"327'#"&3254'"'Ý:. #7"<8 #ØZz%##" …'o:3#8$=Ô&42.'‚3!E# 33" 4 XªŠ6G$H8$ÿ×6. (›°/´+° Ö´$+°/±!33´+°)/°Ö´!&+²! +³@ +°!±&+´+²& +³@ +±*+±!±99°&´$9°± 99±°9°±99±$´ $901?&'#"&'6732654'#5!#3254'Í‘Y)"<8 % $Ø7W)!d§Ê8$=èj k‚3!*@* 33D6,G~8Å$H8$ÿ×.HP*²+´+°/´ +°. Ö´-+°&/±Lé³7L&+´?+°E/±I33´F+°Q/°Ö´+°±0+´++³0B+´I&+²BI +³@BE +°+±N+´+³N+´ +²  +³@ H +°°# Ö´+±R+±°:9°B±7<99±+0°59±NI@  &.-3$9±#± 99±± 99± .± 99±&-²#0999°7°9°?²3999±EL´5:54&#"3&5467&'#"&'6732654'#5!!3254'·#."4ZI.PDM0)—Wp278-F )2]17/"<8 " $Ø7þò8$=û"/ ,527B%A‚YŒ—D) 1%'4NG >‚3!(@* 33$H8$ÿìÿ\¸.Yb5²+´+²+´ +² +³@ +°(/°3´8+°I2°R/´Q+°#/´_+°M Ö´W+°@/±CZ33´A+°c/°Ö°12´+°±+±a22´+°D2² +³@C +°±T+´O+°O±K+´+±d+±³2>?$9°µ(4;Z$9±T°G9°O±I99°K²QRW999± °9±(²999±R8´ &04$9°Q³1G2$9°#²OTa999±_M±E]99±@W°>901#"&'#5.#"#"&54732632.#"#".'73267.'5#5!#3274#"3"54632%6325ŸA4*)3C ILZ.EF ?29 :(2  ,- B_8Ìñ)7 *>0#$,ýÔ@5"'29,Q##þZ6' M@*+ ';) * N4?4  " EK7"33‰<3X'$;(<•84E®ÿìÿ\“.EN9²+´+²+´+² +³@ +²+°*/´3+°%/´K+°;/±>F33´<+°O/°Ö°,2´+°± +±!M22´ +±@22² +³@ > +° ±+°2´+°° Ö´+°/´+±P+°6º ½Á~+ °@.°.°@±ù°±Bù³@B....°B.°@±³-9:$9° µ*/6F$9±°C9±°!9±*´$9±%3¶"(,-CM$9°K°I9°;°9901%&547#5.#"#"&54732632.#"#"'73267.'5#5!#676325U/[3C ILZ.EF ?29 :(20A,- B_8§Ìcþ@5"'2ˆ1T g"þ36' M@*+ ';) * N4?4j" EK7"33#zA84E®ÿ×ÿ™;seoy~¾²+´+² +³@ +°° Ö´+°/´U+°^/´]+°./´s+°5 Ö´=+°.°Y Ö´c+°J2°c°f Ö°:3´*+°C/²Opz333´D+°M2²DC +³@DK +°C°m Ö´H+°/°@Ö´p&+²@p +³@@D +°p±+´+°±+±J22´+±LP22² +³@O +°±`+´[+°[±W+´+±€+±p@°39°±.u99°³,{}$9°¶*Efkz$9±`°S9°[±U99°W³]^c$9± °9±±99°U²#999°^²$S999°]°9°5°&9°.²[`i999±=Y°Q9°*°,9±cs±8"99±mf´@3ku}$9±HC°F901"&'#5.#"#"&547326324&''654.#"#".'#"&'6732654'#5!632533#3274#"3"54632%267&#"'3254'"'3#6"KT)3EI LZ.EF.46- »$%'54 "<8& $Ø7!…F3ññ  6 *>0#$,ýÄ0)S43>ú8$=`' 96G##þ—5( M@%0 .<) +)K Á"' $(‚3!,@* 3‚ÑE3‰G,X'$;(ú8$=`' ˆ>G fž"þp5( M@%0 .<) +)GÁ"' $(‚3 (@* 3‚ÑE3›ü(8H()($H8$ÿ×ÿ¾6sq|„‰Ͳ+²+²+°/´"+° Ö´&+² & +³@  +°/´^+°j/´i+°7/´€+°> Ö´F+°7°d Ö´o+°S2°o°r Ö°C3´3+°L/²X}…333´M+°V2²ML +³@MT +°L°z Ö´Q+°Š/°IÖ´}&+²I} +³@IM +°}±+´+°±+±(S22´+±UY22² +³@X +°±l+´g+°g±b+´+±‹+±}I°<9°µ57r‚…†$9°³.3NO$9°·"-0Qvxz$9±l°\9°g±^99°b²ijo999± ±99±&±$(99±^°-9°j².\999°i°9°>°09°7²glv999±Fd°Z9°3°59±o€±A,99±zr´I74#"3"54632%267&#"'3254'3#6K*83"-1$# -0#$,ý # S33!?ñ8$=V! 96G$$þÜ$@ +5/6-$F1ÜL Á"),%(‚3!,@* 3 ‚ÑE3‰F,'#'$;(9O ,+R)!+$H8$ ÿ×ÿ¾ saltyɲ+°3²+² +°/´$+° Ö´(+² ( +³@ +°9/´p+°@ Ö´H+³5p9+´b+°E2°N/²Zmu333´O+°X2²ON +³@OV +°N°j Ö´S+°z/°KÖ´m&+²Km +³@KO +°m±!+´+°± +±*U22´ +²W\222² +³@ Z +° ±+°2´+°° Ö´+°/´+±{+°6º ¨Áy+ °\.°.°\±ù°±^ù³\^....°^.°@±mK°>9°!µ79bruv$9°³05PQ$9° @ $/2Sfhj$9±°_9± ³!$9±(±&*99°$°9°@²/2999°9±_f99±5H°79±bp²C.U999°j´K>hrx$9±SN°Q901%&547#54#.#"#"&5463263254&''654&#"#".'#"&'6732654'#5!632533#67267&#"'3254'3#6Î/W3"-1$# -²+²+²+°/´"+° Ö´&+² & +³@  +°1/°3´:+°K2°T/´S+°,/´a+°O Ö´Y+°B/±E\33´C+°e/°Ö´+°±(+±c22´+°F2²( +³@E +°±V+´Q+°Q±M+´+±f+±²1:\999°(¶ "/=_$9±V°I9°Q±K99°M²STY999± ±99±&±$(99±T:³)/6$9°S³3I4$9°,²QVc999±aO±G_99±BY°@901#"&'#4&#.#"#"&546326325.#"#"'73267.'5#5!#3274#"3"54632%6325ŸA4*)2- 1#! -0#$,ýÔ@5"'29,Q##þÓ:*  +6"06-+?0¢N4?4j" EK7"33‰<3X'$;(<•84E®ÿìÿ²–.NWÿ²+°3²+² +°/´$+° Ö´(+² ( +³@ +°3/´<+°./´T+°D/±GO33´E+°X/°!Ö´+°±*+± V22´ +°H2² * +³@ G +° ±+´+±Y+±!²354''4&#"3&546327%5!žw=—‚"h¹~G29S&+H$+#!&A[G6H&B22þ5üGDiY‡$j|"F"!0&8%`'2-$02T5FKV!_’33ÿÓÿÈ!.26§° /´ +°/°3´)+°/´$+°3/´4+°7/°Ö´+°±+´'+°'±+´.+±8+±°9°³$$9°'°9±.´ )+1$9± ±.99°°9°)³',$9°±9901%47./32>54&#"&54>32632'&5!¨ *o¢\&Dý?[>&: L%/,#<(6k :þ+NÀ@/L$Xs!U¢?!(# $=4!3 "*W6 39OW ,33ÿçN.*.5Û²+°/´+°#/´"+°+/´+³(++´+°/°3´+°6/°Ö²+/222´+°2² +³@ +² +³@ +°±%+´ +° ±+´+±7+±%°9° ±99°²"#(999±± 599±#³ /$9°"³ .2$9°±%099°+±-9901#"&'#5.#'675!5!#3274#"3"54632%'5A4*)3žA!~”þ½gñ  !6 *>0#$,þõ9Vˆ0 %ˆ9,Q##þþY4‚4b++33‰G-X'$;(<7@>e X,ÿçÿù&.!(€² +°3°/´+°/°3´+°)/° Ö²"222´ +°2² +³@  +² +³@  +° ±+´+±*+±±99± @ !#($901%&547#5.#'675!5!#67''ç/X3žA!~”þ½?ÉB/½9Vˆ0 %ˆˆ3R g"þ×Y4‚4b++33œ%}è@>e X,ÿçN.*29Û²+°/´+°#/´"+°3/´+³(3+´+°/°3´+°:/°Ö±322´+°2² +³@ +² +³@ +°±%+´ +° ±+´+±;+±%°9° ±99°²"#(999±´ +.29$9°°/9°#² 999°"² 6999°°%9°3°901#"&'#5.#'675!5!#3274#"3"54632.'75A4*)3žA!~”þ½gñ  !6 *>0#$,þ`:,n6-z%ˆ9,Q##þþY4‚4b++33‰G-X'$;(<þÀ&Q . I7Q >X,ÿçÿù).%,~² +°3°&/´+°/°3´+°-/° Ö±&22´ +°2² +³@  +² +³@  +° ±+´+±.+±±99±& @ ",$901%&547#5.#'675!5!#67.'7ë/[3žA!~”þ½BÌ?5þç`:,n6,}%ˆˆCB g"þ×Y4‚4b++33$}&Q . I7Q @X,ÿíÿ¾¢.KO.°/´#+²# +³@ +°° Ö´&+° /´;+°D/´C+°L/´/+³I/L+´?+°1/°43´2+°P/°Ö´ +° ±+³(/L$2´+°52² +³@4 +² +³@1 +°±F+´A+°A±=+´+±Q+± °9°´-N$9±F°99°A± ;99°=²CDI999±#°(9°&°)9° ² 999±D;µ,9 $9°C´-8O$9°?±F99°L±6N9901%'%#"&'#5.#"#".547326325.#'675!5!#3274#"3"54632%~ˆ0 %ˆ A4*)3CI /D#-DG =19žB!~”þoµñ 6 *>0#$,þõ9Vüe X,ˆ,Q##þ¼4& ,-&- /;( *%3ƒ4b++33‰<X'$;(<7@ÿíÿ¾.6:Aÿ²+² +°/´+² +³@ +°° Ö´!+°7/´*+°,/°/3´-+°B/°Ö´+°± +³#*7;$2´ +°02² +³@ / +² +³@ , +° ±+´+°° Ö´+°/´+±C+±°9° ´(9>$9±°39°°49±°9±°#9°!°$9°7@'(13:19C!~”þo’Î6@Ã9Vˆ0 %ˆˆ1T d ,þ–4& ,-&- /;( *%3ƒ4b++33 %~é@>e X,ÿÝÿ,T.*1ž²#+°/´+°+/° 3´+° 2°/° 3´ +°2/°#Ö±+22´"+° 2²#" +³@# +°"±+´+² +³@ +±3+±"³$9°°9±#±$199°°9°+µ'*.$901'7675!5!##"'72>54&+#5.+"7¦¦ýïz™þ®wò9F0/")( \23›@ùœ)‰Ô{({ï`*.33.(L1#B%'7LþfX/‡JX/ÿ,w„/±²+°/´+°/´*+°/´ +²  +³@ +°0/°"Ö´'+°'±+´+°±+° 2´+° 2² +³@ +±1+±'"°$9°µ%-$9±° 9°°9±*±99°³"%$9° ±$-9901'733##5./>4'"&5473267Z¦¦þÀW$Ld3TT3¯:3:*4(%1( &'=Ô{({R5FaÝV3þR,‡1-45)*%/DJ+ÿ,t{.¯°&/´+³&+´)+°/° 3´+° 2² +³@ +² +³@ +°//°,Ö´+°±$+´+°±+°2´+° 2´ +±0+±$µ !)$9± ±99±&)±99±±,99°°901'72533##&#"32632'7674#"#"&546W¦¦þQ9M.3CC3V^!F O",E**8+ N  WÔ{({Ý5HÇM3þ`›7#)"!E( 6)%1^ÿçÿ,Q.*‰²+°(/´+°/±33´+°+/°Ö´+² +³@ +°±+°2´+² +³@ +±,+±±#99°²"$(999±(²#999°°9°±9901'727#'47#5!##5./7##"&3¦¦þa& !&')Þ3fOØ=3„JN&HÔ{({? $ #a0 133þAAZ (R8 ÿ,2 <FÔ²;+°3´?+°!/´,+°4/´+°/´D+°G/°&Ö´'+°'±6+´+°±/+´+³ /+´F+°F/´ +±H+±'&°:9°6°;9°°9°F¶!,4B$9° ³1$9±4,°/9°°9°²16999°D±899°?³ &'$9°;°:901'7>32#"'326?#".'732654'#"547&'7&#"325¦¦þk I4M.',59(#)\H>g@&3"5R0<3% =!o#>(ä5<$UÔ{({TE)+) W<P-JcM|ƒB @ykAE.0,"4”!W>&1 5ÿåÿ,ê. "ô°"/´+°/°3´+°#/°Ö´+°2² +³@ +°±+° 2´+² +³@ +±$+°6ºíWÂÈ+ ° .° À±ù°À° ³ +ºñàÁ”+ °³+³+² Š Š#9°9² Š Š#9¶ .......µ ......°@±° 9°±99±"°9°± 9901'7%2>54.'&'#5!!#̦¦þ‘#bDLgcÌþÊ=2-* W{/Ô{({áYi þŒÔ33=&(0‚^ÿñÿ,.9D¨°/´+°"/´:+°'/°*3´(+°E/°%Ö´C+°+2²C% +³@C* +²%C +³@%' +°C±=+°2´+°±+´+±F+±C%±99°=°"9°± 99°°79°°9±° 9±':³B$901'7.+532654./#"&=#5!!;26722654'#"'|¦¦ %80?R/."C`z;GVx _104*þ= "12 NþæC1 Ô{({Ë <(3/)$7='4[2@].á33 @ZK&†ÿçÿ,˜.I²+°6/´C+²C6 +³@C; +°/´-+°!/´+° /°3´ +°J/°;Ö´=+°=±+´*+²* +³@ +°*±F+´3+°3±+´+³+´+±K+±=°A9±F*¶ '06C$9±3°9°°9°± 99°°9±6°9±C³3F$9°-±AH99°!²*0999°²?@999° ±'9901'7".547#5!!32?&547#".'32?#"&'&5332654'z¦¦þQ'2KåzþÀK9# 0 #0C( $*%*`4Hƒ3m9"@(Ô{({¤1/a1337'!>_;HTjN]X ! B!-"$,!@RŽx+F! c…6'$&ÿçÿ,†"+ˆ°#/´+°/°3´ +°2² +³@ +³@ +²  +³@  +°,/°Ö±#22´+° 2² +³@ +°±+° 2´+°2² +³@ +±-+±±9901'7675!5!33##5'&'#5.+"7q¦¦ýp¡þºz63VV364–?÷#q#)ˆÔ{({ïa,+3þÎ@ÜX3þ=$£W2„;V1ÿ,ë:H^² +°/´+° Ö´R+°W/´[+°6 Ö´1+°L/´D+°)/´=+°_/°Ö´+°±:+´.+°.± +°%2´ +±@N22° ±T+°I2´+°G2±`+±°9°:²999°.±99° ²46=999±T µDY$9°±99±R°%9±Wµ OTY$9°6°9°[±499°1°N9°L·.3:@GI$901'7#"&'#4&#&+&547;636;24&#""327#".546327>32'4&#"2654&#"5326¡¦¦0g*\3B^#H}/69 ":, %n  "#! Ÿ*5'2*,=35a.W83%'/Ô{({Þ40gBÈL3šE9 C<9*#S x $ $>Ba1>-44'xE67!,3%ÿÇÿ,š'5ܰ/´+°/´+°$/° 3´%+°2°6/°.Ö´3+°3±"+´ +²" +³@"$ +° ±+´+°( Ö´+²( +³@ +±7+°6º—À*+ °5°À±+ù°*À³*+5....³*+5....°@±3.°09°"°19± ´$9°(°&9±±99°°901'723!32654#"'632#"&5#5!654'"&5473|¦¦¦6A/þÓ;d&!"-:c4,'d[[š3G!*aÔ{({\F63þ´6ŒD$"1'6vS?'O3 2 ?/) .ÿôÿ,ªT(4©°/´)+°/° 3´+°2°5/°"Ö´+³3"+´+°/´3+²3 +³@ +°±+´.+° 2°.±,+´ +² , +³@ +±6+±"°9±µ $%)$9°.²999±)² .99901'73##"&54>7>54'#53&5472654'|¦¦þé/2Ư2@fHFV2 ʬP6&(:4I<"G0Ô{({‹,N73Pr^HZD N=%3]G54#"'62|¦¦ú,'xØþÓ 35% *>.9dÔ{({¯?'’33þq 6Y1&"!=8€[?ÿ,]‘(u²"+° /´+°&/°3´+°2²& +³@ +°)/°Ö´+°±"+°2´!+°2²!" +³@! +±*+±"² 999±&±9901'7327+"&54>32533##4&#"@¦¦þ, )F>)3& 3__3Y$-HÔ{({5>3^+1:('Êc3þW+w4ÿßÿ,U.'+â°/´+² +³@ +°2°%/´+°(/´)+°,/° Ö´+°±"+´+±-+°6ºÁ4ó¨+ °.°À±ù°À°³+³+³+°³+² Š Š#9²9°9°9³....µ......°@± °9°"µ$9±%² 99901'7&54>32#"&5/332654&#"%5!¦¦þÏ + 8&KceTÀ83XYBLF57þãvÔ{({ '" '}]\|V­š\IFa!w33ÿ,]†4®²+°/´+°-/´%+° /°3´3+° 2²3 +³@3 +°5/°0Ö´#+°#±+´+°±+° 2´+° 2² +³@ +±6+±#0°9°µ)*23$9±°9±° 9°°9± %²099901'733##5./67654&#"32727+"&5462@¦¦þ×\%jI4QQ4";,C&,n'B7)!> (V~QÔ{({S8P)YïX3þI% 58<"*$3- 2DJÿéÿ,-.}²+° /°3´+°/° Ö´+² +³@ +²  +³@ +°±+´+°° Ö´+°/´+±+± ° 9±°9°±9901'7'&547'#5!!67¦¦ãƒd.OÊþ¸e–,.Ô{({ªLcb[³2"33ê†!Q~UY-ÿ,:5")~²+°/´+° Ö´+°*/°Ö´+°±+± #22´+² +³@ +±++±°9°³ %$9°°9±¶ !#)$9°° 901'7"753##5./7&54632&¦¦þU#y…R3GkMp^),*' ŸyU-J1&Ô{({® DJ3þVGK)[F=8Y325!5!##5.#"0¦¦þ4#4,b3þP3"4'"Ô{({0&D/F"fÌ33þÃ.:& ,  ÿ,{s"0u²+° /´#+°./´+° Ö´ +²  +³@ +°1/°Ö° 2´+° 2² +³@ +±2+± ³"'$9°#³ $9°.°*901'7>32533##4/.''654&#"72767&#&#"]¦¦ýŽ n6…F3VV3 »$%.% # 3#2$ ?Ô{({O1P‚ÑE3þ:. Á"&!$ 9 ,+2&(!ÿçÿ,Y..² +°,/´+° /´&+°/°3´+°//° Ö°"2´ +² +³@  +° ±+´)+±0+± ³,.$9°)°9±, ±"99°±.99° µ )$9°&°#901'73254&##5./67&'#5!!6;2#"'¦¦q I<38b($fNrþ3>(69vK Zr8Ô{({È #1?þZFA_ %M#6@33*8&1,'aNaP'% ÿçÿ, ._²+°/´ +°/°3´+°/°Ö± 22´+² +³@ +² +³@ +±+±°9±± 9901'7.+'675!5!##¦¦öš9!~”þ½·A3H''%ˆÔ{({.ˆ6b++33þ$X,ÿéÿ,A./3°/´&+°-/´+° /´+°"2°0/´1+°4/°"Ö´#+°#±+´+°±)+´+±5+±)· &-$9±-&°9°°)9° ² +999°² #99901'74632&#"3267#".'32654'#"&'5!¦¦þ„)4! K%3!%`K9bC:"9%”T,P"5R3O»XÔ{({$#00):2G #!9 @s1Jm_:“¥Q?3Z7Â33ÿèÿ].%t²+°/´+° /± 33´ +°&/°Ö´+² +³@ +°±+°$2´+² +³@ +±'+±³$9± ²$99901'7.'5#5!##54&#"#"&5475@¦¦þh>NBè93`#B2U)D>=79.á{({:&!"33þ­C+P,],‰–82Nàÿáÿ,J.%K²+° /±33´+°&/°Ö°$2´+² +³@ +² +³@ +±'+± °$901'7670/.+5!##5.'-¦¦ýß9Y KUÜ?3)“9?Y7;G&4Ô{({Ï9C 233þLCR F7""5jÿçÿ, .)€²+°'/´!+°/´+°/° 3´ +°*/°Ö´$:+°$±+±22´ +²  +³@ +² +³@ +±++± °9±!'°9°³$901'7675!5!##5.+".54632#"&¦¦ýò€™þ¼¾G3™>Q9twF&Ô{({í^6&33þY/†* \'ð"þâÿßÿ,.3¨²!+° /´+°//°%3´+°2°/°3´+°4/°Ö´+°±,+´)+°)±!+°2´ +² ! +³@  +²! +³@! +±5+±,² 999°)°9°!°9° °9±/³,$9°°901'7;27#"&46326325!5!##4&#"4&#c¦¦ýË0&;GG;1.+&þS.N3@'." Ô{({Ñ)90Q€R0+ ‡33þY&&3)ÿíÿ,Ž…<¶²,+°;/´6+°6° Ö´+°/°)3´+°'2² +³@% +°°0 Ö´+°=/°Ö´3&+°3±,+°$2´++°&2²+, +³@+) +±>+±3±99°,±9;99± ;± 999±06µ $8$9°°9±°901'7#"'7;>54&#"56;263533##4&#"327#"q§¦þ1 4#I5N3QQ3P%!, <Ô{({')-1=8k_  $ÀW3þ^s/6 +ÿéÿ,D.Q² +°/± 33´+°/° Ö±22´ +² +³@ +² +³@  +± +± ²99901'7&'#5!##5./6&'5&¦¦þr-~"ÖF3BdE*÷I;0|UÖLŠÔ{({C#A33þ@]G:%3(?+7qc{šÿìÿ,Ž. ,f²+°!/´*+°/´ +°/±33´+°-/°Ö° 2´+² +³@ +±.+±*´ #$$9° °9°°901'76325.'5#5!##5.#"#"'7326q§¦ýå@5"'2Ä B_853 :(20A,-Ô{({§84E®¸K7"33þõN4?4j" Eÿçÿ,ç.#'S°/´+°$/´%+°(/°!Ö´+°±+´+±)+±!°9°µ $9°°901'72&/32>54&#"&546'5!|¦¦¾6l•¥Y&©Ù_:&: M$B0dÆàÔ{({—Z9o2[p!ºH9!(# $<#$*9+K33ÿçÿ,J.3>³²7+´<+°/´&+° /° 3´ +² +³@  +°?/° Ö´!+°!±+´+² +³@ +² +³@ +³4+´:$+°±++´+±@+±:µ&7<$9°+³/$9±7<±99± &² -99901'7"&=#5!!>7#".'32>54'4632#"&-¦¦þÂ%á.þæ R(4wY=a9'3.EN#)=#(0 Ô{({™6(°33¬X(p"YoIg€]$TY2$6-2(+þÛ4 ÿéÿ,Ú. ,§²+´+°/´+°#/´(+°/°3´+°-/°Ö´+² +³@ +² +³@ +³+´$+°±!+´*+±.+±´&$9°!³ %($9±± 99±#±%*99°(°&9014632#"&'7%"&5#5!!>54#"'632u"G¦¦þÀ#4ZºþÕ.M#"(LY2"e{({¬/7•33þh]d# "mL³ÿëÿ,9. ,²+°/´+°/±33´+°-/°Ö´$+°±+°+2´+² +³@ +² +³@ +±.+±±99°± *99±°9°²+9990174632#"&'7&+5!##5&/67u"¦¦¦þxeU ÒI3C°,=,E$Q(/(" !O2"þó{({K]23þLp/8B–*5G# "fÿçÿ,#. \² +°/´+°/°3´+°!/° Ö²222´+² +³@ +²  +³@  +±"+± ³ $901'7'.+'675!5!##¦¦ù9Vˆ$ %ˆš9!~”þ½·A3Ô{({I@>e X,X.ˆ6b++33þÿçÿ, . %b²+°/´+°/°3´+°&/°Ö±22´+² +³@ +² +³@ +±'+±°9±³%$901'7%.'77.+'675!5!##¦¦þ²`:,n6š9!~”þ½·A3H''%ˆÔ{({Ò&Q . I7 .ˆ6b++33þ$X,þWÿÞ.=AÞ°!/´6+°$ Ö´3+²$3 +³@$ +°/´+°;/´+°>/´?+°B/°)Ö´.+°.±+´+°±+°82´+° 2°±+´+±C+±.)°+9°²$,3999°°9°³!6$9±³>?$9°°9±3!°89±6@ ),.$9°± +9901'&54632>32'654&#"#5&#"#".5473263254#"753Û$i.$. +"0$"531;V$6 ()R 3)%CÍ«ð #3g;- 9+#Bõ2* "2+)A(2  Ø/Hì33þÿóg/¤² +´+°/´+°) Ö´(+°!/´+°0/°Ö´+°±++´&+°&±+´+° Ö´+±&¶ ()$9°°9±±99±)±99±!(²+999°±99012#".'73254'#5>54&#"3&54>¦5e"4YJ.PDM0(˜Wp2 88-F )2]$5)g9)327B%A‚Y‹—C) 1%'4N!1 þaÿþ,"j°/´+°/´+° 2°#/° Ö´ +° ± +´+°±+´+± °9°³$9±² 999°° 9012#".'732654&#"&546s0A\G+N8,3 2L*+>*+3,M9AM*?L?DN64*!.Bþaÿäÿ¹R*™° /´ +° Ö´+² +³@ +°%/´+°+/°Ö´+°±+´(+°(± +°"2´ +±°9°²999°(²999° ³ *$9± °"9±% ´$901%&54632#5&#"#"&5473263254#"þ÷]*34'2  )M.,#1',7š)^6&þî)# C4$6 3+"µ(= þÿÞÿ Œ*²° /±33´ +°2°%/´+°+/°Ö´+°±+´(+°(± +°"2´ +°6º ½Àè+ °.°.°±ù°±ù°.³....°@±°9°±99°(°9° ±*99± °"9°%´$901%&54632#5&#"#"&5473763254#"þÍf1<31; :I,8'/='$C¹ 2f14þ·2*W.2: ;(1Ù0I ÿá<.#ް /´!+°/´+°/°3´+°$/°Ö´+°±+´ +² +³@  +² +³@ +±%+±°9°³ $9° °9±! ²999°°9°± 99014'!5!##".#"&54>323>š$þk>j6:D  ))&)H2 ¨>33-&"E,, !2% ,,þ‘ÿRÿÚ„O°/´ +² +³@ +²  +³@  +°/° Ö´+°±+°2´+±² 99901&#"&546323#YId6(KE#3M.33e7 /J'69:ŒýÎþíÿ~ÿÑ̰/°Ö°2´ +± ° 901'.#'673#bF(B,D<Md33” ) 2L/0/N0þ²þÔ!ÿ²Š°/° Ö±22´ +01'56753#5.'ìI"5v0{33  !è&,š )L!þ—!þnÿßÿÏ?.œ°/´+² +³@ +°/´+°/´+°//°$Ö´)+°)± +´+°±+°2´+±)$°&9° °'9±µ",$9±°9±±$)99°³ &'$9°±9901'25#"&54632"2?#5&#""547326¬!'# '4##>U$-- ]_sX'. 0',/#šþFÿkÿáî'Ô²+´+² +³@' +°° Ö´+² +³@$ +²+²+°(/°Ö´+°±'+°#2´&+°6º 6Àý+ °.° .°± ù° ±ùº Á>+ ° ³ +² Š Š#9± ..´ .....°@±°9°'±99± °9°°#901.##"&54732?6323#R    %,1D.*"$ B 33`   O90% %(1  þ}ýÎÿ‡ÿ*Œ"o°/´+² +³@ +°° Ö´+² +³@ +°#/°Ö´+°± +° 2´ +± ³!$9±°9°± 9901463263253#4&#."##"ýÎK'3' (32-+F% .BX=0eã7- C",/ÿÉÊPÀ° /´+°!/°3´&+°A/´4+²A4 +³@AF +°0/´L+°Q/°?Ö´7+°7±)+´+° Ö´+±R+±7?±0999°· #&,-P$9±)°9±!±99°&²#;999°Aµ)-79<$9°4±2I99°0²,P999°L°901#".'732654'""""'732654&'.#"632'>54##"&54632&25F43aF83 ©T$   #7$%%*+3 < G#&Ê5Y2 !#@:WfXqÐ# -(>IL. ".B  !Jÿíÿ™Ð)]k[²+´ +² +³@ +° 2°° Ö´#+°4/´/+°/°> Ö´9+°D/± 33´I+±^22°) Ö´M+°X/´g+°b/´+°l/°Ö´+°±A+´,&+°[ Ö´e+°,±+±%T22´ +°^2° ± +°_2´ +°2² +³@  +±m+±²;<999°[²9>999±eA°K9°,² 6999°·#24Xbg$9± °%9±9#²999±>4±2;99±)/µ163247#5!##"'6732>54#"#".MŸþ»,/'04?šü;mwXbpYB2 &@28K %'3Ž:P%7(/(D4«=?S633þÆ]dP$CJV?@ ;ÿÓ.$/™²+´++°/´+°/±%33´+°0/°Ö´ +° ±+°2´&+²& +³@ +°&±.+´+². +³@ +±1+± ° 9°³  )$9°&±+99±+´  )$901726=&#"&46325!5!##"'>73265¿(<6!(8)5<þÕ;X65YB %…0"B3\(evR3L™33þÆ:Q'PŸþ¤*2 GG:ÿßÿÍœ.7BÓ²>+´0+°/´+° /°3´+° 2°&/±)833´'+°C/°Ö´+°± +´ +° ±+°$2´9+²9 +³@& +°9±A+´++²+A +³@+) +±D+± ²999° ±299°² 5<999°9±0>99±>³25<$9± ² $999°°901%26=4&#"4&#3"&546326325!5!##"'>73265M%@&&." 5.73254'33265Z%4 "<8 " $ØÒW 65YBG8$=50"C2\+È (‚3!(@* 33þÆ:Q'P Ÿ$H8$þÖ*4DJ:ÿìÿͤ.3<G”²C+´.+° /´+°/´9+°$/²'4=333´%+°H/°Ö°;2´>+°>±F+´)+²)F +³@)' +±I+±>±.C99± C³02A$9±´ ;$9°9°79°$°"901%26=.#"#".'73267.'5#5!##"'67632533265U% :(2  ,- B_8¸X 64YA Ï@5"'230"C3*,ˆN4?4  " EK7"33þ”;Q'PÑ84E®þq*2 GHlÿçÿË^.4¬°/´++°2°/´$+°0/°33´1+°5/°!Ö´+°±+´'+°'±.+´+². +³@3 +². +³@.0 +±6+±!°9°µ $)$9°'±+99°.° 9°° 9±+² 999°³!'$901#"'&/32>54&#"&54632326=!5!# 65.#¥Y&©Ù_:&: M$B0d/6l8 C3þwWt;Q' [p!ºH9!(# $<#$*9+KZ9D-GH‡33K.+„° /´+°/´ +°/°3´+°,/°Ö´+² +³@ +² +³@ +°±+´#+±-+±µ  ($9± °9°±#99° ²99901%>54#"#".547#5!!32>327028K %';mþ -/'04?  KAhV?@ ;)T622S%7(/(D4+'#ÿÝIÕ$9̰/´+°&/°3´'+°2°-/°*3´7+°2°:/°0Ö´5+°5±+´+² +³@& +°±#+´+°2°´(+°(/²( +³@ +°(° Ö´+±;+±50°29°°39±#@ !*-7$9±(°9°°9±&²9990123#32654'7#"&54>54#!5!4#"#"&547326ôE5g~2HH28,u#<—J(5L\LBþóV:NWJ0zS¥=:31 >218#9+01S1'$T>CL3F31B 6 5þcÿÿÇ"M²+´!+²+°/´+°#/°Ö´+±² 999±!² 999°±9901274'7&'#"&5463267&#"þÄ5 2  "(0M9<("/"& " $-"BA99:Qÿ•¼¹. $‡°/´+°/´+°/´+°!/´"+°%/°Ö´+°±+´+±&+±²999°±99°°9±°9°³ $9°± 99°° 901#"./&'73274#"3"5462%5! K*) "  -6 *>0F-þõ$96G 4 3X'$;(:“33ÿ³ÿù‘.Y²+°/´+°/°Ö´+² +³@ +°° Ö´+°/´+±+±° 9±° 9017&=47'6753S/c F@m¬ˆ1T d ! 3¡f33ÿï¾°.'r°/´%+²% +³@ +°/´+°/±33´+°(/°Ö°2´+² +³@ +±)+±%°9°´  $9°°9°° 9016325#.'5#5!##5.#"#"'7326Û!)ç*03U/Á+4/"*)6% &“9‰i;(33þÃbA,4,Z 9ÿÿÿöÿÆBe'˜x1{ÿÿÿëÿËe&|˜k6ÿÿÿöÿié„'^ ÿâdÿÿþ|eZ„&£pÿÿÿ`Cƒ'pé§ÿÿÿ@a„'p¨ÿÿþ`eã„&èZ¤ÿÿÿ&f‰„&p/ÏUÿÿÿåÿ Že'˜e '©ÿïwÿ(eR4°5/´,7+°'/±é°/´?+°D/´7+° /´7+°/° 3´7+°S/°QÖ°2´G+°2²QG +³@Q +°G±9+´)+³)9+´=+°=/´+°)±+´ +²  +³@ +°°A Ö´+±T+±GQ±M99°=±K99°9°J9°²;D999±)±?99°A± '99° ±,599°°$9±,5°39°'²2JK999°²%;M999°±$=99°?±GQ99±D±99° °9°°901&543!5!5!#!"632":>7#"32>7#".'47&543254&#".54oF:þˆ KþÀ?18Ä4H&#2  #3;=8( &)D(P@:•/\"8p(?43F>7^HH¥7v#  L2' <*@.* >h=.O`;"R"0'>ke;C²+°+3² +°3´ C+²>+´7+²+´0 +´07+´ +´7+°D/°5Ö´+³95+´@+°±<+´+°³&+´ +° /´&+°±+° 2´+² +³@ +² +³@ +±E+±@°79° µ0>B$9°<°.9°³#(+$9°&±99°°*9±0°*9°°(9°³#&5$9°²7999°>² B9990123275#53###"'3274'4632.'#".547&5464#"6¯=D3)SFeüPGKNF>&)b  *&2@,61/eAHo:587ZC/5,%xIIýäV /O"* )-.4!@*HC1C3;n'1&"ÿöÿée7­²+° 3´C+°2/´+²2 +³@25 +²2 +³@ +°/´7+² +³@ +°8/°Ö°%2´<+² +³@ +°±0+´+°± +°2´ +² +³@ +±9+±°(9°0µ!",5$9°° 901463!5!5!##!"32?2'#"54632327654#""&+/žýë³UIþ{@D!'5$a5{w&#*; 0!7k‡\IIýåw63, $X,tB .# rÿöÿÿ«e‡²+±33² +°3´ C+° 2´ +°3±é°/°Ö´+² +³@ +³@ +°±+°2´+² +³@ +±+±°9°±99±±9901.547#5!5!50!#0##"=ZQ…âýëµWIÑ)6V6M—:4KhIIýäj5(%ƒ-ÿöbeZ²+°3´C+°2² +³@ +´  +´7+°/°Ö°2´+² +³@ +² +³@ +±+0150!##5'%&'"'>325 lVIþï+b"’+Æ,ˆIIýåÕœ9•lM7 Sêÿþ¾e2;·²+±533´C+°2°/°3´7+°3275#53##5'7''67&74#"6w*27GE‡32&#"4#"6v AMäNI   .9'M= B -‰=*27GEd'-#*,1*9- 1Z"ŽIIýåC  >*Z.+  9F;7&29/E3EF1"%2˜++ * ÿöÿìôe*.в+²+°3´C+² +³@ +´% +´%7+´ +´7+°//°*Ö´+°±+´!+²! +³@ +³@ +°!±+±22´+² +³@ +±0+±±%99°!±99°±,.99±%°9°°9°´ !+-$9°± *99°°90132654.'5!5!5!##5'%5##".5'c „=  NýþFGõ-"Ô#C4:i<#ëJJJÉY´"   pIIý匡8º†(6"=3XrX GJJJÿöe&. ²$+±+33´%C+²$% +³@$ +´ $ +´ 7+´' $ +´'++°//°"Ö´-+²"- +³@"$ +°-±+°*2´+² +³@ +±0+±-"± 99°³ $9± ±*99±' ²-99901##'7&#"#"'.'732=!5!25!6PGÁ2·ZI% A2 4_%11 @_9 G<þâþƒCl7þäýå¡5’M $/Ju&58%X!ˆ',(.‰I¦24Ãdÿöÿõye,¥²+²*+°3´+C+´&+ +´&7+´+ +´7+°-/°(Ö´+²( +³@ +²( +³@(* +°± +´+±.+±(±99° ´ $9±³  $9°&² 999°°!9°±"#9901!632'654&#"#"'.'732=!5!yþã#)<\8/7X1 ,+ ?- Š41%,8M9 G<þâƒpS84X/1K=&',¿+5(6!N$p',(.”Iÿöäe=¾²+°3´C+°1/´!7+³!1+´7+°1° Ö´7+°>/°Ö´+² +³@ +² +³@ +°±;+´4+°4±.+´$+±?+±± 99°;° 9°4±=99°.³!'78$9°$°&9±±4;99±!°9°°901#"'.'732=!5!!3632'>74&#".547B; /[,11 @_9 G<þâîþxz$:\B=.!)2IBq158%X!ˆ',(.‰IIŒmUbk' !,'N$0>Z*ÿöÿìÎe:Ö²+°!3²$+´ +²+°3´C+´05$ +°3´07+° 2°;/°-Ö´8+°' Ö´! +°8±+°2´+° 2² +³@ +² +³@ +°±+´+±<+±!8´$*05$9°±2399±² 999±´'*$9°5· -38$9°0°29017267!5!!632'>54&#"#5#"&54?.54632&#"Ó"Hþ£ØþÌ8H6Zw;+?/4FG£% q@/.XE')9&,06¼*II¬NX<]|-*b ,tþþM? A )M+Ad N4$'<ÿöÿ e"Lü²+±#33´C+² +³@ +°/´0 +´6H +´67+´) +´7+´>C +´>7+°M/°Ö°2´$+²$ +³@$ +²$ +³@ +°$±9+´E+°E±+±3K22´+² +³@ +±N+±9$³$9°E²0999°²6>A999±0±99°6±399°H°49°±9K99°C°A9°>² @99901"&54?&'&5732=#5!##5#"'32675#"&54>32&'"32675^pRœ\; .-áUGþß  O% 5W4%+7C;L"2*6K( Aq?*$!ú< ","-‰IIýåx‡ —+ 4='A#31D8&8 E4 "Àÿöÿ½Ie3в+²'+²+± 33´C+´- +´-7+´ +´C+°4/°Ö´ &+² +³@ +° ° Ö´2+°2/´+° ±+°2´+² +³@ +±5+±2°9± °9°µ (+-$9±-² (999°°+9°±299°°9°°901"327!;'.547#5!##5#"&54?#".54ê8-(Sxþì(EK)Ë<NSPG£%q¦1)0G B'#N (!.I!A5%IIýämM? >)O 0%:ÿöÿÉge)-IJ+²+²+°3´C+´'  +´'C+°2´ +°3´7+°./°Ö´ +² +³@  +² +³@ +° ±+±+22´+² +³@ +² +³@ +±/+± ²!"999°µ%'*$9±'°9° ±%*99°³+,$901747#5!#32675!5!##5#"&'4?#"&75ŒC¦aW%;(3f#þ&qPG¡ py3N5úC;GGQVAÂIIýäzM2 >*:A ÿö3e)±²+²+°3´C+´ +´7+´  +°$3´ 7+°2° °! Ö°3±"é°2°*/°Ö´'+°'±+°2´+° 2² +³@ +°2² +³@ +±++±'³"$$9±°9°"³'$9°° 9017267!5!#632&#"#5#"&54632&#"Ó"Hþ£=™7D  4FGI*>jZC)'9&-1?¼*II¬MN tþþ©#d+±±999±9±<99°°9±'4²999°° 9° ² #$99901#"&54>32&'"3267#".'&57326=#5!!#3267m7?;L"2*6K2 =“?7^@7#; .áwþ±J65W4%™+1D8&8 E3#!Ú<#4QJ0; ","‰II—224='@$ÿöÝ&e[² +°3´C+²  +³@  +°/° Ö´+² +³@ +°´ +°/² +³@ +±+± °901##"'&54735#5!&U!45'9“0þõ456™Iÿöy³e$Œ²+°3´C+° /´7+°/´"C+°%/°Ö´&+² +³@ +°° Ö´&+°/°3´&+² +³@ +° 2±&+± ° 9°² 999°"°9°°901"3267#".547.547#5!!;ê 8+'%ˆ"yJ0H":,0N½þë,>(K)B'%:TF /' 61 O&II,-IÿözÒei²+´C+°/´7+°/° 3´7+°/°Ö´+² +³@ +± 22² +³@ +±+±°9±³$901!5!47#5!#3267#"&Òþ$ÜþºC¦©Ÿ%;&9f z>6KIþ•C;GGQa=qWGÿöÿ²¸e,À²+°3² +°3´C+´) +´)7+´ " +´ 7+°-/°,Ö´+°±+´$+²$ +³@ +³@ +°$±+± 22´+² +³@ +±.+±±)99°$²999±)±99°° 9°"±$99° ± ,99° °90132654'5!5!5!##5#"&547%5##"&'c @Z' TýÕÂPG¢&qŽ# 9(L›É5z^!7n pIIýäcN?=( €³(6//´xÿöt"e}²+´C+°/´7+°/´7+° /°Ö´+°± +´+² +³@ +°2²  +³@  +±!+± °9±± 99°±99°°901!5!32654.'5!##"&'"ýÔ,þA;W'   #C4Pˆ*Iœ:ra!$%# H(6"=3«ÿöÿze@ò²+°3´C+°3/´8+°)/°%3´"+° Ö´++°$2° Ö´C+°/´7+°A/° Ö´1+²  +³@  +°±+´+³+´++°02²+ +³@+ +°$2²+ +³@5 +±B+± °89°µ-3<=$9°±99±+± 199±83²-<999°)°9±"° 9±°9°° 90172654#"#"&546;5!5!##"263227"#"'&'"'4632å)M#K,p#½þÐ#¬å@(W%2 +&‡`+Mh—!  S6+3Š.]II¤J'Qz+N?-oXÿöPe+S²+´C+°/´"7+°/´ +°(/´7+°,/±-+± ³%$9°(²+999°°901!5!632327#".'#"&'732654&#"ýèþ`G+…+ "#  bH6Y5/U(499/3IÊ$’ QEW+)9/=,/H ÿöÿÿ1e'w² +²+° 3´C+´  +´7+°(/°Ö´+² +³@ +°± +±22´ +² +³@ +±)+± ²$%999± ±%9901463!5!5!###"&'4?5#".).8 þ\;PG]& rÇë!%841Jq>1HeIIýã ,@ ?)_ NC34@¢)ÿËŽe@Ô² +²+²+± ,33´C+°:2´  +´ 7+´02  +´0+°A/°7Ö´.+°.±)+´=+°=± +°2´ +² +³@ +² +³@  +±B+±).¶'12:?$9°=´ $9° ´$9± ±99°±99°2µ%'?$9°0±)=9901%2>75#53##57#"&'4?#".'3254&#"37".54632)+8=eüPG32£#ry3bA(*-Ÿ7)B:-= U9HZÂ-Å 8(ÒIIýäÝ*OM= ?) :.CG x*5-/C&#0=`DAÿöÿ€òe/ʲ+²+° 3´C+´* +´*7+²* +³@ +´  +´7+°0/°Ö´+² +³@ +°±+´ +²  +³@ +° ³ +´+°/´+±1+±±&'99°²"$999°°*9° ³$9±*°9°°9° ±990146;5!5!##"34'432#'#"&'4?".)B4»þœüQê)ÈB+ N_ƒ rÓFl>& -=U]II¤+ B001c9>6?) e(92(ÿ¹Lg?Cí²0+±333´1C+°2²01 +³@0 +³@06 +´,60 +´C+´%'60 +´%++°D/°Ö´ +³ +´)+° ±+´+°82°±6+±.@22´5+²56 +³@53 +²65 +³@60 +±E+±) ±99°²#999°±,99°6µ&'>C$9±,²@C999°'² .A999°%±#99°0± 9901"&'4?#".547.54632#4.#"6;"3275#53##55pœ)0,@ 2+1K),FH,?,("Â9.Cs`öOG§ ~)#G=)J.% 2/V*1GI&,Q DRoóIIýåiN&ÿöÍse ]² +±33´ C+°/´ 7+°/°Ö´+² +³@ +°±+´+² +³@ +±+±°901##"&=#5!26=#s,P3(FKf3RØ;9X(U@³II°"/ÿö"e •²+±33´C+°/´7+² +³@ +°/´ 7+°!/°Ö´+² +³@ +°±+°2´+° 2² +³@ +°2±"+±°9±°9°²999° ± 99017"&=#5!#632&#"#5'3275#ÚKf3,•D/ 43G.¨;,78ÖÔU@³II‘>L &/þÙð"˜"//ÒÿöuTeP²+´C+°/´7+°/´ 7+° /° Ö´+±!+±°9°´$9° °901!5!#"&54632&#"67'27'Tþ¢^7,EgYC*&9! ­ ä8+&¡Iþ@ZGEc N} #,4s)ŸÌe#“²+°3´ 7+°2°/´7+°2² +³@ +°$/°Ö´!+°!±+´+°2² +³@ +°±+´#+°2±%+±!°9°± #99°°9±°9°±9901#53&546323##"&546;54#"Ìssþi J2#$··_ (+3I£38 *¬Ga o !—2.ÿöoeg²+° 3´C+°/´ 7+°2² +³@ +°/°Ö´ +°2²  +³@ +°2² +³@ +³@ +±+± °90146;5#5!#3##"'& (fyÌÌÌ/0% ÉIIÉGO7:ÿö¨“ef²+°3´C+° /´7+°/°Ö´+² +³@ +°2² +³@ +±+±±99± ° 9°´$901327#"&'22654'#5!#þ=6 <'RGBK^~)57мð^W!)S_:v`,"5$IIÿöÿÙÜe ~² +±33´C+²  +³@  +´ +´7+°!/° Ö°2´+²  +³@ +°±+°2´+² +³@ +±"+± °9°´$9017275#"&=#5!##5#"&'4?×;4Ö;/Kf3æOG£%r¾ø7íÓ"/GV?ÖIIýê…N?@)[ÿöÿËÅe3ʲ$+² +±33´C+´$ +´7+´ $ +´C+°4/° Ö°.2´+² +³@ +°±$+±122´#+°2²#$ +³@# +°#±+´+±5+± °-9°$³&)+$9±#²999±$³%&$9°±1299° ³"$9°°9013275#"&=#5!!632'>54&"#5#"&'47%5p;,78ÖjKf3ÏþÈE@8Sv@$K7.GG£ r .I"//õþ•V?ÖIIµAZ@U.f%)$>þö|M6?) "ÿöõe z²+´C+°/´+°/°3´7+°2°!/° Ö´+°±+´+² +³@ +°2±"+±±99°±99±± 99°°901!5!".54632>7"'67&'"õþÿþ{4$JN9aJX@&8+)d A 1*+HIþœ:=(Ad2E]F&Gj4!+.+ÿöFfe.:i²+´C+°/°3´67+°2°&/°23±é°2°;/°Ö´4+°4±#+´ +±<+±#4µ/$9±&6³ $901!5!>32#"'#"&5463232>54&#"#.#"32>fýpþâN'ER ?,\&'^ESXEVO:* #0  G3(SS( Iÿ"/aR;:$W\gSJi²'L% <:  )@js+ÿöÿ™fe2>k²+´C+°/°3´:7+°"2°*/°63± é°2°?/°Ö´8+°8±'+´+±@+±'8· 3$9±*:³$9017'!5!>32#"'#"&5463232>54&#"#.#"32>óJJJ½ýpþâN'ER?,\&'^ESXEVO:* "1  G3(SS( -JJJ9Iÿ"/aR;:$W\gSKh²'L% =9  )@js+ÿöuTeN²+´C+° /´7+°/´7+°/° Ö´+±+± °9°²999°°901!5!267#"&54632&#"Tþ¢^(M E:EgYC)'9&-1?IþW-U0ZGEc N8$&9ÿöÿÿ§e)¨²+²+±33´C+´  +´+´$ +´$7+°*/°Ö´!+²! +³@ +°!±+´&+² +³@ +±++±!² 999°²999°²999± °9°° 9°$±99°°901#%72>7#".547#5!&#"32>V+wN°0þë,.'N>27+)i±wC&' 6CT†˜2ñ4'B,) /.IIKK&  ÿö¥He X²+°3´C+°/´7+°/°Ö´ +²  +³@  +° 2² +³@ +±+±° 9°± 99017"&=#5!#'327'ÚKf3RÅÅ*®;,<$Ç¥U@âIIÐ}*˜"/)Ñÿöe r²+°3´C+° /´7+° Ö´7+°!/°Ö´+² +³@ +°2² +³@ +±"+±² 999± °9±±9901"'&/732=!5!#3#B#D"D1V[‚9 F<þâ ¦¬¤J*0S& 5Uƒ¹',(.‰IIŒGÿöÿ–Ne$²+° 3´C+°/´C+°#/´7+°%/°Ö°2´ +² +³@ +°´&+° ±+´"+²" +³@" +°2±&+± °9±± 99±°9±#°9013!!".547.543!5!5!#!"w+¤þ}FsI#/D1#D'Q<þ@XPþpJI3"=V= )0K*?0WA]II¤ÿöÌe&*²+´C+°/´7+°'/±(+±°901!5!4>32"&'46?&'&#"#"'&Ìþ*Öþ\]\#;--3Ë p%×?$#*(BIé 8@>k8 /oI D!c ÿöÿ»êe-¦² +²++°3´,C+´ , +´7+´$ , +´7+°./°Ö´+°± +°)2´ +² +³@  +² +³@ + +±/+±°9° · &$9± ± 99°°9°$´"&')$9°°!901%'32##5#"&'4?#"&54632&#"?!5!¡7+"öPG„&r•EcZB 09! ­ þ£ôÚs*7TýäcE?>) Kf=Ec M} Iÿè<e:β+±!33²6+± 33´7+° 2´ )! +´ 7+°22²) +³@), +°;/°Ö´8+°8±3+´ +°)2²3 +³@3/ +° ±+± '22´+² +³@ +² +³@ +±<+±8°9°3³#$:$9° °,9°±!99±)±'99° °/9°6±9901&5463235#53##5#"&'47%5##"&546;54#" J20@µeüPG”  pÿµ_ (,1Â%397.¬ÉIIýä”I   >( ~(a o —2.ÿöÿÍe$£²+²+² +± 33´ C+´ +°3´7+² +³@" +°%/°Ö´+°2² +³@ +³@ +°±+±22´+² +³@ +±&+±°"9°²999±²999°°9015#46;5#5!##5#"&'47%5##"&lÉ• (f OH¤&rÉ_SÉÉ. ÉIIýäP?@)ƒ=Onÿöÿ»êe*¤²(+°3´)C+²() +³@( +´$( +´C+´( +´7+°+/°Ö´!+°!±+°&2´+² +³@ +² +³@( +±,+±!± 99°@  $$9±$°9°±!&99°°901##5#"&'4?#"&54632&#"327!5!êPG…&r•EcYC%+9&& :,C;þ£ôýåbE??) Jf=Fb M +6;Iÿølh 5¢²/+°3²)+±,33´*C+° 2°6/°Ö´+°±+´#+°#±/+±'22´.+²./ +³@., +²/. +³@/) +±7+±°9°³ $9°#²%1999°/±2499±)/@  #'04$9014#">"&'47%.''7&546325#53##59.5 8q Â)ˆ.œCB<-K:d\MäPG£&ø(#'    þ?*QT9c4B25;*7>.ÜIIýä©M@ ÿöÿ´äe7DR²#+´E++²#E +³@# +²+²+°3´C+´K  +´K++°K° Ö°M3´C++´ >  +°23´ ++°-2°S/°&Ö°*2´P+°52°P± +±H22´+± @22² +³@ +²  +³@  +°±+°:2´+°2±T+±P&°(9° ±-099±´ 8>$9°°9±E#°!9°K´HP$9°°A9°²(I999°C°89°>¶ 5:0@$9° °/9012675!5!!632'>54&#"#5#"&547&54632&#"%654.#"6322675"'Ó#Gþ£îþ¶9G9W54vC"P-!5EG1MFg87XD".+6&370"! 5E7Cþ¯#G-N2$ÎIInGP58C):Xm+[,&h¹i0W9:>*A;\ F.$'/8' h}Gç$- ,"0ÿöÿ9¥eZ{²5+´(+°(°B Ö´G+²*+²I+²+°3´C+°]M² +° 3´ C+°/°3´L7+°Y/´T+°D/´57+°=*] T,#7)  ©JJJ*'RII™$6%þeP!/AYW$3X 4F# ]þ‘&c6:''-9 ÿöÿn›e9 ²)+°,3´*C+°/´7+² +³@ +³@9 +° /´17+°1°4 Ö´7+°//´&7+°:/°Ö°#2´+°/2°´ +°/°±9+°2´8+°8°. Ö´'+°'/´.+².' +³@., +²'. +³@') +±;+±°9°° 9°'´ 1$9°9°49±8.°9±±99° °9±1±99±/4±99°&±#9901'#"'#"&54735&'732674&#"#"&546;5!5!#!32632#QJJJ0G@+'j&:f(0i­16 J-`1»þ=sþþ5J =HŸJJJä ¯6lU.;6{ g0+YII JE.þšÿöÿmše5I9² +° 3´ C+°/´;C+²; +³@ +°6/´G+°@/´,7+°3/´7+°0 Ö´7+°/´7+°J/°%Ö´D+° Ö´9&+°D±+±.=22´+°° Ö´+°/´+² +³@ +² +³@ +³@ +±K+±D ±"'99°9°B9°·,3;@HI$9°°9±°9±;°9±G6±"=99°@±%D99°,²'>B999°3°.9°0°)9°±*99±±99°±9901'%46;5!5!#!2632#5#"&'47.547&'73254'"#"&"3275#"';PJJJþ¯1»þ=sþþ6 U ?HeU.g$%/40i­h!J-`o7H~ÿöÿ‰¬e:ý²++°/3²%+°(3´&C+°2/´97+´ +& +´ 7+´!+& +´7+´+& +´7+°;/°Ö´/+°/±++²#,222´*+²*+ +³@*( +²+* +³@+% +±<+°6ºœÂ1+ °.°À±,ù°-À³,-....±-..°@±/°9°+± 99± +²45999±±99°!² 999°²#999°°901%4'5%5#"'#"'732654#"'6323275!5!##5#"'732FP("^B_e/`036e-0U%3 O[JPQ5+7-u7"GH ³IIýäo+*4D°8188ÿöÿ9ƒe1F²,+°/3´-C+°/´>++°/´47+°B/´7+²B +³@ +°/´)7+°G/° Ö´2+² 2 +³@ , +°2±&+´+° Ö´<+°±*+´1+²1* +³@1/ +°1³1 +´+°/´ +±H+±2°9°&°49°<±D99±³78>$9°*°B9°1´ A$9±>³;$9°4°9°B´2 78A$9°°9°³ $&D$901"34'432#'#"&547#"&546?&546;5!5!#32?3267'"'A(ÇC#+J`%wDG< ,L6'5B4ºþ‡Qþ>E-BGS" 7\-ÅB Ex*!B)0o%JhJ0!G1,T=U]II¤þì< %*1 +.dS0f&ÿöÿµ·e0Ö² +° 3´ C+°//´!7+°/´7+°/´7+°1/°Ö´+³+´+°/´+² +³@ +°±+´+² +³@ +°³#+´(+±2+±°9±#³/$9°±-99°³%*,$9±!/±*-99°±%(99°±99°°901747&54;5!5!##"632&#"327432'#"M"FdŽþÛÁT½( # ##+?K A %;?F¥º('(<\SIIš ' J)IJ31g#yÿöÿ)~eQ6²L+°O3´MC+°/´=7+°/´1+°A/°(3´7+²A +³@ +³+A+´#++°/´I7+°R/° Ö´.+°.±F+´+²F +³@FL +°F° Ö´;+°±J+°@2´Q+²QJ +³@QO +°Q³Q +´+°/´ +±S+±.±#(99°F°9°;±1'99±²9=999°J±A99°Q³ $9±=³;$9°1°9°A²89@999°+²'.999±#± 99°±F9901"3&5432#'#".547".54632'&#"3>33267'".546;5!5!#O(ÇE+ ')Ta†&' %P:A-< > l ;†.;^. Xz:O?£þˆEx*!B/0"TY7¼ 0!%H*.@#&;  +L@,eo &A>#327'".546;5!5!# (ÇB+ 13Z&¢.:r";",A  /'8F§Xz;A6ºþ3_Kx*!B00"TXQ_N +# a' "3 1ua%&@>$f7* !>]IIýäoç e¤ÿö…e/Ú²+² +±33´C+± À/´-++´(# +´(7+´  +´ 7+°0/°Ö´*+³*+´+°/´+² +³@ +°*± +´+°±+°2´+² +³@ +±1+±*°9° ´!#(-$9°±%&99±(-²999°#±!99°±99017"&547&546;5!5!##57##"632&#"327úFZLMLVþÞGGMe²—Ì -"<& d/)G\#F95O6(]IIýä’=2Å4¤#HE$;ÿöÿ‰ôe'3Ò²"+°%3´#C+°/´1+°+/´6+°/´7+°4/°Ö´+² +³@" +°±+´.+°.± +´'+²' +³@'% +°'³' +´+°/´ +±5+±.°9°²+1999±' µ ()$9±1±99°+°9°±99°² 99901"34'432#'#"&547&546;5!5!#'&#"326·)ÈB+ 11S H<;F/™B4»þœüQ"$'$&/%<x+ B00[\3T.A(,=U]II¤þ{N#%.ÿöÿ84e-¤²++°3´,C+°/´7+°/´7+°"/´7+°/´(7+°./°Ö°%2´&+°2² +³@+ +°± +°)2´+°2² +³@ +±/+± ³"$9±±99±"° 9°± 9901##"327#"327#"&546;5"&546;5!5!4€Ï'0®h16).Ï*-®e19Vul”`9“,qa8“þŠ>¤"Y:3'”!Z;3N[H3Q:VL3R]Iÿöÿ94eAز+°3´C+°?/´*7+°%/´7+° /´7+°/´7+°B/° Ö´+° Ö´'+²' +³@ +°±+´+² +³@ +°° Ö´$+³-+´;+±C+±³ *?$9°°59°-±3699±;° 9±%*²6;999± °#9°± !99014>;5#".546;5!5!##"327#"32674.'7#"&)'91Š ;oFa8“þŠ>€Ï(5´]1A MÙUUPJ;9 EV2Y“%#5 A+L+5P]II¤#Y:3š9*. + +8Yÿöÿ9eBѲ+° 3´ C+°2/´$7+° /´:7+²: +³@: +°>/´7+°/´7+°C/°5Ö°2´"+°2²5" +³@5 +°"±;+°2´+° 2²; +³@ +³';+°3´/+°2±D+±;"³$2>$9°'³)*$9± $²*/5999±>±<99°±99014>;5!5!##"32654'7#"32654'7#"&54>;5#".)#71Šþ qÙ 5¥P6;9$%DÙU¥J<;9 }PZ’'91Š#DU:B%5 ]II¤X,%%;!ª9X + <:YI#5 M Fÿöÿnte4÷²$+°'3´%C+°/´7+² +³@ +³@4 +°/´,7+°,°/ Ö´7+°*/´!7+°5/° Ö°2´+°*2°´  +° /°±4+°2´3+°3°) Ö´"+°"/´)+²)" +³@)' +²") +³@"$ +±6+± °9°°9°"³$9°4°/9±±99°±99±,°9±!*°901%#"'#"&54735&'73254&#"#"&546;5!5!#!2632#×G@+'j&:f(0i­h J-`1»þ=~rþþ6T ";Hq ¯6lU.;6{.#g0+YII I=6þšÿöÿ9_eN5²@+´,+°D Ö´(+².+²7+²+°3´C+°5/´;+´!@ +´!+´@ +´+° Ö°L3´+´ @ +´ +°O/°GÖ° 2´%+°%±>+°2´/+°2³/>+´+°/´+² +³@ +² +³@ +±P+±%G°I9°@ !*5;BD$9°>±@99°±,99±D;°>9°@°/9±,(°89±!³#%GI$9°°9°°9°°K9± ° 901%254#"#"&546;5!5!##32632#"'327632#"'732654#"#"&547&'7xoC4v%¼þ?i`ö'<U%iO7:I!#"& 'C)£¬16§A/@'+ 4vaC1.ªžSd+ ]II™K6>]A 5'1(Æ;n4, f-8Y 9pÿöÿ9_eIR,²+° 3´C+°O/´%+°/´1++°5/´<+°G/´+°° Ö´A+° /´+°S/°.Ö´+°±"+´Q+°Q±+°22´ +°2²  +³@ +² +³@ +³@ +³M +´(+°(° Ö´?+°?/´+±T+±"° 9°Q¶+57632#"&54632#"&546;5#"&'732654#"#"&>54#"º.¼þ?i`ö = .&1ÒYb@G(1JfL\«SB•#\¡R1LŠH:5 5u*1-ŒWII“65:'‰A2? $*.<'/BqR6D'j\ PY#Nþ)#!ÿöÿÇe 4² +´!+² +°33².+±133´/C+´ !/ +°3´ 7+²  +³@  +´!/ +´C+´+ !/ +´+7+°5/°$Ö°)2´+²$ +³@$. +°$´&+°±+´+° 2² +³@ +°±,+´ +° ±4+°2´3+²34 +³@31 +±6+±$°(9±² !999°°9± ±$99±°(9° °)901!3#!"##"&'46;5#.54>7&43!5!5!##w( »iþð» \#™B=DVSDQ<þ@VHp=og¤þõ7l &/"-=9oC5 B‚]IIýäÿöÿ¼âe(:÷²+²+²+±,33´C+± À/´)++´'4 +´'7+´/ +´7+°;/° Ö°2´+°12² +³@  +°±+´.+°.°8 Ö´$+°$/´8+°.±+°+2´+² +³@ +±<+± ° 9°´ "4$9±.$°99°8°9°°)9±')¶ "+8$9°4± 799±/°9017.5467&54;5!5!##5#"'2254+"27#!"32pW\ ,DU;#<:çþ¬ìPG^5qCQ/Xb6VO¹þí "Š98# ” M0 0"7O)*1 6@:]IIýäƒ#+^<ss2¤ +9O' ÿöÿ¬*e4Q²2+°3´3C+°#/´"+°9 Ö´8+°/°O3´ 7+´A+°F2°/´/7+°R/°>Ö´5+°5±K+´J+°J±(+´+°2°´,&+°,/², +³@,2 +°±0+´+²0 +³@ +³0+´+±S+±K5²9AO999°J²C8M999±(²*FG999°0² 999°°#9°±"99±"@ (5>GJM$9°A²*C999± °9°/°,901#!"632'654.#"3".547&546;5!5!".54632>7'67&#"*Wþì,6!5J#9,4)8U=XK 0f`=AJçýk4ý$p(=B0S:H03-&B A&*+¤ > )((- ?#5?-O25:J;)]Iþ)4s8$:Y-@P9D Q.%"*1ÿµÿiåe7Aù²5+°3´6C+°#/´@++°/´7+°/´ 7+°/´27+°B/°&Ö´=+°=±/+´&+°2²/ +³@/5 +°´++°+/°±3+´+²3 +³@ +³3+´ +±C+±/=°?9±+³#-:@$9°3µ  8$9°°9°±99±´ &8=$9°³ +:$9° ±-99°°9°2°/901#!"632'654&#"&'#"&54>747&546;5!5!&'26åSþí,6!¯::-0:8U :'- #> 1F $.8QG 3<:I;)]Iý— + ""//ÿöe09¾²+°#3².+±233´/C+´ / +´ ++´*/ +´*7+´6/ +´6++°:/°,Ö´4+²,4 +³@,. +°4±+°12´+² +³@ +±;+±4,³#$9°³ "$9± ± 99°² 19999±*°9°6²&'499901##5'7&'"'632&#"#"'&/732=!5!!632PG£5¥DZZ3 [" A2 " ! 1V[‚9 G<þâ—þãDlýä·‰)‰ JN $/1-& 5Uƒ¹',(.‰IþŸdVTÿöþõ+e=ì²+´97+²7+²!+°$3´"C+° /´C+´,9" +´7+², +³@,0 +´'9" +´7+°>/°Ö´*+²* +³@! +°*± +´;+°;±+´&+²& +³@&$ +°&³&3+´.+°./´3+±?+±;°9°&³05$9°3°9± °9°9± 99±,°59°'±399012>7#".5467&'&'&'".546;5!5!##"34'432#"« '*E*Q=D7 Xz:B4»þœüQê)ÈB+GTD6 <*?+:E $ &A>#=U]II¤+ B008U;6$ÿö -eJ²+´C+° /´7+°/°Ö´+±+±±99± ² 999°±9901#5327#"&'5ëõõ$15'zwIþîH 'E5ÿöyîe+g²+´C+°/°3´'C+°2°/± 33´7+°,/°Ö´$+²$ +³@ +±-+±$°9±'°9°³$$901!5!47#5!#3267#"&'#"&%#327>¤ýR®ýèC¦zW&:&6j |>+B ZK1O\µ%;&03()Iþ•C;GG R`@{R*E@¾Q*"Qÿö•e- ²++±33´,C+²+, +³@+ +´ + +´7+° Ö´'7+°./°)Ö´+²) +³@)+ +°± +±22´+² +³@ +±/+±)³ $9° ´ $9±'°9±+±#$99015#%##5#"&54?#''&/732=!5!þ¢?PGB%t¬ #D4_%1U\‚9 G<þâŸl°Œ°ýêÑ @ ?) S%*Iu'5Uƒ¹',(.‰Iÿ<ìY ˆ²+²+°3´C+° 2°/´+°!/°Ö´+°±+´+² +³@ +² +³@ +±"+±°9°²999°³ $9±±99°°901#&54>323###53654'.#"UH' / O‹WWHWYI$ %e#B,0›IIýäI %/D6!<þcìE†²+²+°3´C+°2°/´+°/° Ö´+°±+´+°2² +³@ +² +³@ +±+± ° 9°²999°°9±± 99°° 901.#"#&54>323###5O8»K=6!H#E/A•mIWWHWeDiC%-#42:MIIýäIÿ< ƒ,®²+² +°3´ C+°2°*/´%+³%*+´+°-/°Ö´+°±+° 2´+² +³@ +² +³@ +±.+±±99°³"$9°³ $9± ±99°³ "$9°*°(9±%°'9013###53654'.#"#&5462&54632&#"pWWHWZJ# %3J&6dj Q6"0 6-ÉA IýäI (.E3$9(#L5PF 67 ;Pþc .´²+²+°3´C+°2°"/´+°/´ +°//°*Ö´%+°%±+´+² +³@ +² +³@ +°° Ö´+±0+±%*°(9° ²"'999±±99±±'(99°"´ %*$9°°9± °9012.54632&#"3###53.#"#&54>ö8g?N!#\9!) $QWHWZ ÂU7E"I 46C;!2-58 ; # G[IýäI5{>,+-+? ÿÿÿ<Gq'píAÿÿþcq'p¾Bÿö@^² +²+° 3´C+°2°/´+² +³@ +°/° Ö´ +² +³@ +° ° Ö´+² +³@ +±+± °9± °9±±9901&#"3###53&54>2óv=5]WHWU%If^X4) e¾M0,IýäI/ :;#'P;4 ÿö¼h² +²+° 3´C+°2°/´+² +³@ +°/° Ö´ +² +³@ +° ° Ö´+² +³@ +±+± °9± °9±°901#&#3###53&54632¼OÆŸFF]WHWUw]6s^Y:eÆO3(IýäI#(Oh(:J<ÿö›f~²+²+° 3´C+° 2°/´+°/°Ö´+² +³@ +°° Ö´+² +³@ +±+±°9±° 9±±99°±9901#&$#"3###53&54632›`jþëp4]>]WHWUœr’DeP{A+'IýäI)Sf)ðe1;Ô²+²5+´,C+´" , +´"7+´, +´7+°bc  &2A- 9@UeBE86M/97…'O>+O"',. /UEIC1C0KH77N#" ÿöÿà e4™²+´C+°/´"+°1/´7+°° Ö´++° /´7+°5/°Ö°2´ <+²  +³@ +°2° ±)+´+±6+± °"9°)µ%1$9°°9±"±%99°1°)901!5!463!!"3272632'#"546322>54#"#". ýìþ!&þ|>)!'ˆa5{w&B 420O$IÝG54+j!X+tC )# FLÿö eP²+´C+° /° 3´ 7+°/°Ö´+² +³@ +° 2² +³@ +±+±° 901!5!.547#5!#"ýèÑ[P…åÔ)6T8Iý¦M84HH4(#x.ÿö:Åe"²+´C+° /´7+°/±+01!5!'%&#"'>32Åþ1Ïþí+e"’+ÆQKIþqœ9•pM7 S@N#ÿÿ.e&0‡²+´7+²*+´C+°1/°Ö´,+°,±+´+°° Ö´'+°'/°3´+±2+±,±%99°³ */$9±'±99±*¶/$901463273267#"&547'7''67&74&#"6‰K,8FF\S*‚!:"J%B+4Dª(êO’.ˆ<®+!1ù84<0C4J'@96<-@/j(%B4&%VAy6G9G:,. +ÿÿK×e#K²+´C+°$/°Ö´+°±+´+±%+±³ $9°±99°°90146327'7''>7.74#"6eA57HF‡<þÓ(Ù€™. /#<­8. 1ý0880D4j QŸ7]II¤ 0 vI, ?& / h>-þ=ÿ²ÿ„½°/´+°/°Ö´+01''%|þæ-Gm»8Óÿÿÿ&f/„&U^PØÿöÿ“e7·²*+²+°3´C+´4#* +´47+´* +´7+°8/° Ö°2´+°2² +³@  +°±-+´(+° Ö´+² +³@ +±9+± °9°µ#+02$9°-±*/99±4*² (999°#°9°°9°°9017.547.543!5!5!#!"632'674''7&#"p(+B1*!.@,:þ€ FþÂ9*@!>?&R9A<‰:-4€(C"*0,0H);7M <]II¤ 9!B-WO+::(‹,€"ÿ&fÿî„$° /´+°/°Ö´&+± ° 901&54>32&#"Y 1#**-%fsG, : Z/þ!ÿ.ÿå°/°3´ +°/±°901#'#73^{ŠaËCÒ””ØxfQ\'™²+´+² +³@ +°° Ö´+² +³@ +°2°(/° Ö´ +° ±+´+°°! Ö´+°/´!+°±+´+±)+± ²999±!°9°°$901#4&#"#"&=32632#54&#"&=332ê?" p!?B.U5Eg?1B (f#N,/'-9%R2  4$ÿ  {+«²+²+°3´C+°2°"/´7+³ "+´+°,/°Ö´'+°'±+±22´+°2² +³@ +² +³@ +±-+±'°*9°³")$9°°9±±)*99°"±99° ± 99±° 9014632>32&'"3###53654&#"#&óeOJ= I/&5AWWHWYR= / /N)Ð0W,(( ; I>%IýäI >N+;4ÿÿþ|e„&^(£ÿÿþ|e*„&U<£ÿÿþ|eu„'^–ÿØZÿÿþ`e%„&¤^F ÿÿþYe>„&UP¤ùÿÿþYe„'^ ÿØ]ÿöÿ7ðe:E¿²8+±;33´9C+°"/´47+°/´CC+³>C+´7+°F/°6Ö´<+²6< +³@68 +°<±+´+°±D+´+²D +³@ +±G+±<6²) >999°±(99°³?@$9°D´ $9±4± @99±C>±/099°8°1901##"327#'#7.547#'"'.'732=!5!3>;5ð‚Ï)4+?8^/BGb³^{‹`È4=.¢#D/[,13"BZ9 G<þâúýl­N2”µJ'-E#S)bÓ““Õ&2P1%*Bq15;)Y#‚',(.‰IIŒ=5Llÿöee,d²+² +° 3´ C+´" +´7+²" +³"' +°-/°Ö°2´+² +³@ +² +³@ +±.+±"°9014>325!5!##5"&'46?&'&#"#".'&(]\#9,01þ,oTGÉ p%×?$ *5| 9:ïIIýäéi8/oI D!3$ ÿÿÿöÿ ²e'©‘uÿÿÿöÿ Be&{©:ÿÿÿöÿ e&|©ÿÿÿöÿ me&}©‚ÿÿÿöÿ $e&~©cÿÿÿöÿ þe&‚©­ÿöÿ4¯e<³²-+°03´.C+° /´:7+°:°6 Ö´$7+°3/´*7+°=/°Ö´+³2+´++°+/´2+²2+ +³@20 +²+2 +³@+' +³@+- +±>+±+° 9°2± :99°°9±6 °9°:±899°3²999°*±'9901'#'#7.'73254#""&546;5!5!##327632[JJJ/1 µ^{‹_É-]E91 ;,W@o($6t%¼þ?¹°ö 6'-*ŸJJJ™0E&Ö““Ø :GG0."D(Lm" ƒ8']II¤%H Hÿöÿ7}e(GÛ²/+±233´0C+°/´+°H/°FÖ´+³F+´,+°,/´+², +³@,/ +°±+´'+°'±+´4+°4±"+´9+²9" +³@92 +±I+±F,±.B99±±)A99°´=@$9°'± ?99°° 9°4² %>999±µ"')9$9°/´%,4$901"327.54>75!"327654&#"%.547#5!##'#7.54-(1"xW6þø"C !Ï,6þç)8"W‡… fK`³^{‰aÃ@Y* .o3+('* oN7¬a9A@]48IIl (|ZAÔ““Ð`LJÿöÿzÅe3F²+°3²+±733´C+´&+ +´&+´? +´++°° Ö´EC+´: +´7+°G/° Ö´<1+² < +³@  +°<±+´9+³9+´+°#2°9±+±622´+² +³@ +±H+±< °+9°µ &/0B$9°±E99±9³$4$9±+&´ /$9°±99±?°9±:E±6<99°° 90172674#"#"&546;5!5!##5'7&'"'46327675##"32>7632å)L#K,p#½þÐÏPG-½] ‡_+Li—!  ¬`>ÁåE '%S6+3Š.]IIý䔦9Î !z+H ?,pXµ 0Ú¤K ÿöÿ74e$g²"+°3´#C+°/´C+°%/°Ö´+² +³@" +°± +´+² +³@ +±&+±°9° ´ $901##"327#'#7.546;5!5!4€Ï"-,@6^0AFb²^{Š`Æ)K?&^<“þŠ>µ1/.G!S)aÓ““Ô#9X4?xlIÿöÿ9e(›²#+°&3´$C+°/´C+°/´ 7+°)/°Ö°2´ +² +³@# +° ±+´+³(+´!+°!/´(+²(! +³@(& +±*+±! ´$9°²999±²99901#'#73"3254'7#".546;5!5!#ì^{Š`ÉEr%0':2†75ItQ?oHcBŠþ qÇ““ØK?",C!f6'0(hO]8nG@dxIIÀÿöÿ-_e9­²(+°+3´)C+° /´7+°/´47+°4°7 Ö´7+°./´%7+°:/°Ö´+³-+´&+°&/´-+²-& +³@-+ +²&- +³@&" +³@&( +±;+±-±799±±99±74°9°.°9°%°"901#'#737#".'73254'"#"&546;5!5!##32632K^{Š`ÊCš'3.2hOA#1U‡2oB6t%¼þ?i`öN&,Ó””ر(?& 5JO6.immƒ8%]II¤%Dÿöÿ-e)2²²+°3´C+°//´!7+°/´ 7+°3/°Ö´+² +³@ +°±+´1+°1± +´+² +³@ +°±- +´$+±4+±°9°°9°1³'$9° °9°²!*/999°$°9±!/±9901#'#734>;5!5!##".54632#"&>74#" ]{ŠaÊDþÚ?*•þ› tÑ(2UM<-1ObPg¡6(1-Ó””Øÿ5@-eII¬=,=g 1*AE5CN—O#:31ÿçÿþ±eo² +° 3²+°3´C+´  +´7+°/°Ö´+² +³@ +² +³@ +±+±° 9± ² 999±±9901#"'&''7&'732=!5!#\I6 %†18<Ç,Ë–9 G<þâ»U1A8¢58Mˆ8„Õ',(.‰IIÿöŠe'‘²+°3´+²+°3´C+´ % +°3´ 7+°2°(/° Ö´+°±+±22´+² +³@ +² +³@ +±)+±³ $9±%³  $9° °901".54632675!5!##5'75'67&#"p4$JN9`KX@CDþ”PG”-Á/^ A9"+H:=(Ac3E]FAwIIýä»c9{Rp)!$$5+ÿþ’eG¢°;/°3´++°/´!7+°H/°Ö´+°±+´E+³E+´$+°E±8+´0+±I+±±99°³!$9±E±&99±8$· '+34?A$9±+;µ')BC$9°µ$&$9014#"6.5467''>7.54632632'>54&#"'67&'"8.$1m >B=™- /#<A58GF] 57#4 ?+6),+0 A4(+ò++(þ}*o)4+I9 *089/D4G )% /K#+'+ ' ;&=ÿö .e!(š² +±"33´ C+°/´7+°/´7+°/´&7+°)/° Ö´+² +³@ +°±'+´+²' +³@ +±*+±'µ"$9±°9°± 99°²#999± &°901327'"&=#5!##"327#"&'>;5p<+>"ÇjKf38Ð*1lF^1ARzX'•ÇG,”>#-)Ðþ¿V?áII°A/DdT)rlN!vÐ-;hÿöe)/·² +±*33´ C+°%/´7+°/´7+°/´-7+°0/° Ö´+² +³@ +°±+´"+³"+´.+°./´+². +³@ +±1+±.µ(*$9°± 99±²"(999°´ +$9± -°901327'"&=#5!##"32654'7#"&'6;5p;,<$ÇjKf3#rÙ%0';2DA75JuQV{'‘Á1`Š="/)Ñþ¿V?âII½@",C!258$1)hP[[QwÌVvÿöÿ78e 2¡²+±33´C+°(/´!++°/´ 7+°/´7+°3/°Ö´+² +³@ +°±+´+² +³@ +±4+±¶ !(+$9±!(°.9°°$9° ±#199°² 999±° 901>;5327'"&=#5!##"327##'#7.'ƒÇG,”þ ;,<$ÇjKf3B‹Ð(4,@4]2A!S) µ^{Š`ÉPv(Ò-;5!ù^{‹_É”0':Kf3#rÙ%0';2DA75J`Hþ,;,6#ÂÔL/Šþ$½““Ö“V?âII½@",C!168$1)hHY%"/"Ì–&0vÿô$Ée .P°/´!7+°//°Ö´+°±+´$+°+2±0+±±99°³ !$9°$² &*999014&#"6"&'4?''>7&5463275+r•€ ;b.2C( b@^O4^s`1H–-? ÿöÿ‰Oe/5é²+´5++²5 +³@ +² +° 3´ C+´2 +±"33´7+´ +´7+°6/°Ö°2´%+²% +³@ +°´&+°%±!+´3+°3±0+´+°±+´+² +³@ +³+´+°/´+±7+±%°9±3!±*+99±25±%99°°9°°90174>7&43!5!5!#!"!###"&=.5#2)DQ<þ@YQþ( xGH=)+7B%4/53H #::Œ5 B‚]II¤=þrG*04)‹0"-P11FT?‡…"ÿöÿhCe@ÿ²+° 3´ C+°!/°3´,7+´0++²!0 +³@! +°3/´7+°/´7+°A/°?Ö°2´8+°2²?8 +³@? +°8±)+´#+°#±+´+°±+°02´+° Ö´ +²  +³@ +±B+±8?°9°)°9°#±;<99°´!',3$9°²&.999°°9±0!±.?99±3,°19°±99°°901&5463!5!5!#!"632#5'47&#"&54632635&#".54mE HþJMPþ -AA]†G;@4K3{@50.""BZ&@9 G5.>VE;!]II¤/!þvîX#.D+OS.<' 1!7.08šW=ÿöÿ‰Oe6å² +° 3´ C+°/´*7+²* +³@ +°%/´ +°//´C+°/´7+°7/°Ö°2´2+²2 +³@ +°´&+°2±+´'+°'±+±-22´+°2² +³@ +±8+±2°9±±/599°'°49°² #999±%*²'-999° ²"2999±/°9°°90174>7&43!5!5!#!"!#5#"&5432&#"32675#&)DQ<þ@YQþ( UH"93m=1”/"“37Gÿö.¿ek²+°3´C+°/±é°/°Ö±é² +³@ +°2°° Ö± é° /±é²  +³@  +±+±°9°°9±°901!'".547&=#5!!¿þã D3:FM; :ÉþÆVL Q"5:f,D‘II‘ "ÿöÿ‰Oe1˲+²+° 3´C+´( +´C+²( +³@+ +´# +´7+°2/°Ö°2´ +² +³@ +°´%&+° ±++°2´*+²*+ +³@* +³"*++´+°/´"+±3+± °9±%µ -/$9±² ,999°(°9°#°901"&'4?!3.54>7&43!5!5!#!"!#5\rõþñBr%53H DQ<þ@YQþ( xGŒ& ?( u/"Uw1FT?5 B‚]II¤=þr÷B? ÿöÿbe5Ó².+°13´/C+°/´7+² +³@ +°/´C+°4/´+7+°6/°$Ö°)2´+²$ +³@$. +°$´&+°±+´+°2² +³@ +°±,+´3+²3, +³@3 +°02±7+±$°(9±²999°° 9±³$$9±°(9°4°)901!3##"&'4>?5#3.54>7&43!5!5!#!"w( ¶¶ \  $™Bl+52H!DQ<þ@ldþp=oH7l &/"Pu1CP>5 B‚]II¤ÿöHe[² +°3´C+°/´7+°/° Ö°2´+² +³@ +°2²  +³@ +±+± °9± °90127'7#"&=#5!#×>3ö*Ë Kf3RØ;9¥DrU@³II°"/ÿÿÿöÿ³²e'˜¸uÿÿÿöÿtðe'˜€ÿß•ÿÿÿöÿÎþe'˜Ì9‚ÿÿÿöÿ#Be'©` áÿÿÿëÿ#e&â©8 ÿÿÿöÿ#me'©© '˜±2}ÿÿÿöÿ#$e'©‰ '˜‘~ÿÿÿöÿ%þe'©© ‚ÿÿÿöþÙðe'©cÿ¿ÿÿÿöÿ#²e'©› '˜£2uÿöþèOe39²$+´9++²$9 +³@$ +²+°3´C+´6 +±(33´7+´  +´ 7+°:/°Ö° 2´++²+ +³@ +°´&+°+±'+´7+°7±4+´!+°!±+´+² +³@ +³+´+°/´+±;+±+°9±7'±./99°4°9°!°9±°9°°9±69±+99°°9± ° 901'3%4>7&5463!5!5!#!"!###"&=3.5#2÷ »Wþ¶D'*<þ@YQþ( xGH=)+7Br%53H #::ø Í×5 BA"]II¤=þrG*04)‹/"Vv1FT?‡…"ÿöþèOe7Û²+²#+°&3´$C+´ .$ +´ C+² . +³@ 1 +´ )$ +´ 7+°8/°Ö°2´+² +³@# +°´+&+°±1+° 2´0+²01 +³@0& +³(01+´!+°!/´(+±9+±°9±!+· 35$9°1°9°(°9± ²2999°.°9± )°901'3'"&'4?!3.54>7&5463!5!5!#!"!#5÷ »WrõþñBr%53H D'*<þ@YQþ( xGŒ& ø Í3?( u/"Uw1FT?5 BA#]II¤=þr÷B? ÿöþèCeD² +°3´ C+°%/°3´07+´4++²%4 +³@% +°7/´7+°/´ 7+°E/°CÖ°2´<+°2²C< +³@C +°<±-+´'+°'±!+´ +° ±+°42´+° Ö´+² +³@ +±F+±„$0)¡_=ÿöþèOe>ï²+°3´C+°/´/7+²/ +³@ +°*/´$+°4/´C+°/´ 7+°?/°Ö° 2´7+²7 +³@ +°´&+°7±"+´,+°,±+± 222´+°2² +³@ +±@+±7°9±"±4<99°,°;9°´$'$9°±99±*/²",2999°$²&7999±4°9°° 901'3%4>7&43!5!5!#!"!#5#"&5432"&#"32675#.÷ »Wþ¶DQ<þ@YQþ( UH"93m=1”/"yP1'ÿö1e$®²+² +± #33´ C+´ +´)+´  +´7+´ +´7+°%/°Ö´+² +³@ +³+±é°±+°"2´+° 2² +³@ +±&+±± 99± °9°²"999°±99017#537"&=#5!#632&#"#5'3275#ÓeeKf3.—D/43G.¨;,78Ö.cCU@³II‘>L &/þÓö"˜"//Òÿö&e$Œ²+´C+°/´)+³!+´ 7+°/´7+°%/°Ö±é°±+´+² +³@ +² +³@ +±&+±°9°± !99± ±99°±$99°°9017#53!5!32654.'5!##"&'»ee_ýÜ$þO9S'   “# :(I‡2c›Iœ?s[!$%# H(6./¢’þ¿þâÿùÿö8²+° /´+°/°Ö´+±± 99± ³ $901#"&##"&5463267 +W t5#//  E<Y]=&%( fþ`þÔÿw%'x²+´ +° ´*+° /´+°/´%+°(/°Ö´"+°"±+´+±"³ $9°³&'$9±±99°%°9° °90127#".'./&54676;53#";þñ(  ()  % œ,³5#¯¶   "! *( 4`' ,þTþÔÿ‚ÿûT²+° /´+°/´+°/°Ö´+² +³ +°±+´ +±° 9±°901326=3#"&5432#þ…V-!;-6BkR$<$K4)š™5Di/EÿöZq²+°/´+°/´+°/°3´++°/°Ö´+² +³@ +°±+°2´+² +³@ +±+±° 9°° 901#".'6532=35!5!## D*#.)ÌþgdŠA›V  B %M¥ãAAýÀþ1þÔÿ|%а/´+°/°3´+² +³@ +° /°Ö°2´+°6ºÁ*ó×+ °.°À± ù°À°³+² Š Š#9²...´.....°@±° 901".'#"54632353'32=û!/  <¯1Bœ (GþÔ2*)3xã.@ª*H4þ@þÔÿx"H°/´+°/± é°/° Ö´+°2±+± ²999±²999° ° 901#"&'>753"&#"32>72ˆF.&4qN-(ZA;%\+Ù?J)&9-8\T!1þ>þÔÿu%$c° /´+² +³ +°/´"+³+´+°%/°Ö°$2´+°2² +³ +±±99±"±9901'#".54232>54&#"#"5432327‹ LL?.S(d$).H3+)0C@%,-=,<$% 2!: $ kþ[þÔÿ“6d° /´+°2² +³@ +°/°Ö´+² +³@ +°±+´+°± +´+²  +³@  +±° 9015654&#"&54>353ò&8 i<=20=32Ñ=O >"$  5þÔnY)!RR$6Oþ³þêÿ¹ÿÙ '°/´*+² +³@ +° /°Ö´+01#".'3s,VjHµ.2tIvþ¿þÔÿû@`²+´ +°/´+°/°Ö´+² +³@ +°2² +³@ +°2±± 99± ±99°± 9901'#"&##"&54632675! f r5"0- ƒ8?4/H N9$ ( Gþ”;;þBþÔÿ°X #p°/´+³+°3´+° 2°/´ +° /´+°$/°Ö´ +²  +³  +° ±+´+± ²999± °901&'5327%326=3#"&5432#PcSVbfRZ\þÕW,#;O2CjR&þû%$2)(·(B4)‚†LAi/D  þgþÔÿÕX V°/´+° /´+² +³ +°/° Ö´+² +³ +± °9±±99° ± 9901#"'5327'"&547332>2+iYN^fQZ]«3P 3#! þû''8)(Wf+)MP/0(&þ˜þÔÿä=<°/´+°/´+² +³@ +°/±+´+±±9901#"&'35!q?’#9-.òLO-˜X&9Ý66þ¿þÔÿû•$]°/´+°/´+°/´ +°%/°$Ö´+²$ +³@$ +±22±$± 99±°9° ³ "$9015!5!0#"&##"&5463267þÃ8þÄ8v  q5"0- À11l00Á13 N9$ ( GþRþÔÿ»ž!o°/´+°/´+°/´ +°/´+°"/°Ö°2´+² +³@ +°2³ +°±+´+±°9± °9015!5!326=3#"&5432#þVeþ—eþÎM6!;P1HeR&¼11p11nJ2+dhLBo$E  1ϺX .°/´+´+° /°Ö´+´+± +014632#"&10% !$%% 1(00ÿôþ晣 *3Y8²4+°L3°2/´-+³0-2+°33´/+°+2°/´+³ +°3´+°2°S/´;++°B2°=/°@3´>++°!/°3°/´(+°Z/°8Ö´V+²8V +³@8= +°V±%+´+²% +³ +°±;+´B+°B±+°L2´ +² +³ +° ±P+´E+²EP +³@E@ +±[+±%V³ +3$9°±4Y99°;°29°Bµ(-S$9°°19±P ³/0$9±S4±8E99±!± %9901327#"'#"54?654'&#"#".54632327"'7&'&54675!5!!5>54&#"ˆcOT]cQP_>  (_ @JKAþÂXZT]^«ZM>>|^þÙ¥þÂ_|2%,(zBMl**=! 9""£3 # L.3,KJûê" 8##ö1aN’’AA’‘O0G) @45Jfq?45ÿóú5X x°/°3´++² +³@ +° /´+°/° Ö´ +² +³@  +² +³@  +° ³ +´+°/´+±+± ° 9° ±99014632"&#+5;+,00!H k@``‰YYE$!&00ýûFAAÿùÿ@ý™ =G[)²5+´+°/´++°/± 33´+°22°H/´Q+°A/´#+°\/°;Ö°2´+°G2²; +³@;< +°;´+°E2°± +´0+³>0 +°3´(+²(> +³@(* +°0±K+´N+°N±V+´Y+±]+±;°79± ·#.5A$9°>² ?999±K(°+9±VN°H9±±99°5± 99±± 099°°.9±#A´KMNVY$901#"'5327'4&##3263>7%4>32!!#"&/47#5!.#"%"&547332>53@kL[]cVX^8Z,kaA±6Fþ€zajJ"þ &=kFTv8Bþ¿LEt'L4ަOG^v7R/ ÞBUI-$3 V˜((A('ú7[î5ËÒ!WYA%EO9&5ZW2AZn"Dk65 в†$Ajn+=5KX=I<.' BWÿùþ«ý™ &GQeI²?+´+°/´+° /´++°/±33´!+°F/± 433´G++±2H22°R/´]+°K/´-+°f/°EÖ°'2´ +°Q2²E +³@EF +°E´!+°O2° ±+´:+³H:+°&3´2+²2H +³@24 +°:±U+´X+°X±`+´c+±g+± E°A9±!@  -8?K$9°H´ I$9±U2°59±`X°R9±±99° ± 99°± 99°?±99±±:99°!°89±-K´UWX`c$901#"'53275#"'5327'4&##3263>7%4>32!!#"&/47#5!.#"%"&5473326534iYP\cUX^lLY]cUX^,Z,kaA±6Fþ€zajJ"þ &=kFTv8Bþ¿LEt'L4ަOG^v7R/ ÞBU&%)MVþÒ''A('V((A('ú7[î5ËÒ!WYA%EO9&5ZW2AZn"Dk65 в†$Ajn+=5KX=&8 ?F BWÿùµ ALï²<+´+°/°3´I+°@/±1B33´A++°/2°/´ +°)/´#++°M/°?Ö°!2´B+°/2²?B +³@?@ +°B±+´7+²7 +³@7% +³@71 +°7±+´+°± +´+±N+±Bµ#)5=&'#"&54>54'4&+532676·&6+;‚ž@cAN/7 '$+$BJ;&  &8\>]p%ú "3[9'ÔAþºFýÀi JE>&:*C$ ‹&WI]7/$;" 2#"&'67&'###535463235#&œ98F5̈^(8U?C¤K$>! c/nÖ“wu@}}kc52 |-{© %òL:c„Aó8'!f# 'bpLT[gnýÀ@A:ƒg*P5¢œ³ÿöÿÁ«¥ B²@+°,3´7+²7@ +³@7< +°7° Ö´+²+² +°1/´+°/² *.333´++°(2°/°/´$+°C/° Ö´0+°° Ö´+°/´ +² +³@ +°±+´+°±+´0+°=2°0±-+°2´,+°'2²,- +³@,* +±D+± ²999°±499± ±799°°@9±0±:;99°-±$99±17°9°°90162#"&543567&'#5!4&#"#4>323####"32>2#"&8&}-{©þM“wZÆ2JC*@"C.am¯¯@_|˜:¤K$>! X:pÔ+%/œ³þ|T[gnAf>H$?<$gƒ:AýÀ@ó8V!f# *_pÿÿÿùÿfã'iÉ&ƒe¾zÿÿÿùþíã'j¶&ƒe¾zÿÿÿöÿÁ§¡'kŠ&‚eµ]ÿÿÿùÿúhÕ'lM&:e,–ÿÿÿùÿÞßµ'e¾zBÿÿÿùÿähÕ'n&:e,€ÿùSX Qɲ+°F/±33´G++°2²FG +³@F +° /´+°R/°@Ö´N+°N±)+±+°2´+°±+´+² +³@ +°³+´+°/´+±S+±N@°69°)°P9°² .1999±° 9°°9°°9±F³NP$9°G° 9014632"&26?5!#####"&54>=&'#"&54>54'4&+532676O00!H þD6+;²ž@“AN/7 '$+$BJ;&  &8\>]$!&00¯ "3[9'ÔAþºFýÀi JE>&:*C$ ‹&WI]7/$;" %1 %œ,³5% ¯È''Z''W  ", %(E#(þ¿þÔÿ÷€5° /´+°/°Ö´+±² 999± ³ $901'#"&##"&5463267'7 D< r53/!¬4£5@./1P4& Vþk‚þ_þÔÿþE° /´+°/°Ö´+² +³ +°±+´+±± 99°°901%32=3#"&5432'7þŒN3?:O3>gJ'Dr4¯5"?M|{D9X-= þµ‹þaþÔ0š(v°/´+°/´&+°!/´+±é°)/°Ö´#+°#±+´+±#°9°³$9°³'($9±±99°&°9°!°901'7'3270#".'.546;53#";03‘5°?  *  1#,"œ,³5"¯þêuW    +"J#)þÝ ÿ@Y$°/´+´+°/°Ö±é±é01462þÝ0 þüÿÿTÿ¶ 4°/´+° /±é° /°Ö°2±é±é°´ +° /013#5265#þüX/)-JI+/*ýèRCÚ~²+´ +²+´+² 222²+´ +²+´+°2°/°Ö´ +² +³@ +° ± +´ +° ±+´+² +³@ +015!##5##5##5ýè[!HŸH¡H£77CCQQCC{} P°/´ +°/´+°/°Ö´ +° ±+´+±+± ²999± ²99901462#"&73264&"$4#$$ @$#4$$2O^‹(°/´+´+°/±+´+±+015!2,P::;Ø'°/´ +°/°Ö´+´+±+013#;;ØÔØ,D°/´+² +³@ +² +³@ +°/°Ö´+°2² +³@ +± +0133##;ññ;y;xØ,D°/´+² +³@ +² +³@ +°/°Ö°2´+² +³@ +± +01%#5#5353,;ññ;Øy;xÿÿ Ä&ó #ó""|ø#|2ÿø"|ø|¨ÿøLÿ&†ÙQ²+²+°3°/± é°/°Ö±é°±+°2±é±+±²999± °9°±9901%3#"'53232=#3.XMG @þvXe…Tüº58Q;1jý±Ùã  /²+°3²+´  +´+° /± +± ° 901%##3#/O¸7[»k¸^HHMžž ýóÖåå6Ä o²+´7+²+´7+´ +´7+°/°Ö´&+°2°±+±é° Ö± é±+± ° 9±°9°° 9°° 901%+32'4+32254&+Ä[FíÕTNOfn`rr`>U,)”–CS S2O$(‘I—êO(-¤!ÿéðe²+±é² +³@ +²+± é²  +³@ +°/°Ö´<+°±+±é±+±² 999°°9± ±990164>32#.#"32673#".!4eDVjT <;HRXH>:T q`Cd3ÓZ\Z9[W5-k`\m32#.#"t%J2BX•à: 7wjŒ&8\:ZxSB;N`#CB)NDFþã`lr[Yu$3+<ÆžöŸžzpS83>+6á  x²+°3²+´7+´ +´7+°!/°Ö´&+°2°± +°2´&+´1+° Ö±é±"+± °9±°9°°9°°901#&=4+#32'4&+326‰9 \P¢NòMXQ01——01^:%1.XÜ LD[R3 ¥&!ÿéÉ)²²!+´++²! +³@& +² +´+² +³@ +°*/° Ö´&+°& Ö´'+°±+´&+° Ö´+±++°6ºï{Â++ °°À±ù°À³....³....°@±² !999±± 990172654&/&54632#&#"#".'3úE<,2ƒjkV[jJ|5<&/„6<-W:%FA(JA*<$$ #cGY[Mj0(! #J156!)N53J° @²+²+´7+°2°/°Ö´&+² +³@ +² +³@ +± +01##5! N¨œÇþ9ÇFF6ÿéÉ @²+´++² +°3°/°Ö´ &+° ±+´&+±+± °9013#"&533265{No[]lNA:=? þOdbQqþ59;3Ó !²+²+°3°/±+±°901!#33\¼[‘ˆZ þN²Ÿ u²+±33²+² 333° /±+°6º=ÙïŒ+ °.°À±ù°ÀºÂDï+ °.±°À± ù° À² ...¶ .......°@01!# #333ZolZ†ZYmZpWY–þj þo‘þo‘Ý &²+°3²+° 3° /± +±± 9901#'#373$¹f†‡Z°¯e}c þóÐÐ ÃÃå 3²+²+°3° /°Ö´<+± +±°9±°901%#5373"SÊb’Ž^ÎÎÎ?ðð® 2²+´7+² +´7+° /± +±°9°°901!!5!5¬þÑ1þp1þã HþFFF µ m²+°3´ 7+²+´7+°2´ +´7+´  +´7+°/°Ö°2´ &+°2²  +³@  +³@ +³@  +±+01%##!!3#!!=#Z½=V×Çÿòò þ¥F`”” F˜F£FÛìì!ÿè) #…²+²+´7+²+´7+°$/°Ö°2´&+°±"+´ &+° 2±%+±±99°"µ$9° ± 99±±99°µ  $9°± 9901?&546327#"'7&#"%32654#79”qaE= ==’qfI4J1ETbIþï9ETa=OgzŸ<@BMrz C9’'*qaNÕþ×2raS6ÿéÂ&² +²+´!++² +±é´& +´+°'/° Ö´&+°±#+´&+°° Ö´1+°/´1+±(+±µ !&$9°#°9±&!±99°°9°°9012654#"#4632#"'53254&#õ;(eoNnPOf  0^O*.  gA@:&%Kaþ‘?^U<*6 M"_`N m5+6À T²+²+´  +´7+´ +´7+°/°Ö´&+± 22°±+± é±+± ° 9017#332#'3264&+„NN”K]XA£…)64+…‚‚ QWGBZF-T- â €² +´ 7+²+´7+´  +° 3´+°2°/° Ö°2´ &+°2² +³@  +² +³@  +° ±+´&+±+± °9°°9°°9017#53532+732654+37--ÐdwwdÐNwHP˜wuò4çòŽò¬`aÀ¡4’ M²+´7+²+°/°Ö°2´&+° 2² +³@ +² +³@ +±+±±99017!!55737þ­::NppFFÂ(>( ØM;N6ÿé7jc²+´7+²+° 3´+°/° Ö´&+°±+´&+°±+´+±+±°9±°9°°901#"&5332653254'bt\^qNF;>DN! j!(IþËOdcPqþ49;2q!ÿéL=%²+´ 7+²+´C+²+°&/°Ö´1+°±#+´ 1+³ #+´ +±'+±#²999°² 999± °9± ³  $9°± 99012>54'7#"&4632"32654&Ý 2P,sq“’q+>#¦NecQS`eâ '(D Hat¡žöŸu\[vq^]vYÿò®.19@Lþ²+±33´H7+°?2²+´+° /´+°C/±;33´"C+±+222°6/±'é°M/°Ö´E+°E±A+°#2´=&+°82°=±:+°22´1+°*2°±+´.&+°2². +³@ +°.´ +° /±N+±AE±H99°=°9°:±'99±²999±. °09±°9± H³ $9°³0EK$9°C°.901%#"'73254+732654+#"'#"&546;5463232%54&"5#32%5#"3265&®I57!G,85  wÄv%dHPgL6rYRmR$$þÍChBííxuþÇ'{/)!-Y079* @#øNNcNHaXrtVe/À6LN7]³²_.<1"9Yÿ&w/<DKV²+´++²+° /´7+°&/°"3´T++°J2³T&+°$3´++°P/±F33´,++±5=22°A/´1++°W/°)Ö´R+° Ö´1+°R±N+°-2´H&+°C2°H±E+°=2´ 1+°42² E +³@ +° ±+°2´&+°92² +³@ +±X+±N³&T$9°H°$9°E±1"99± ±99°°;9±°9±&±99±T°;9°P³)9LR$901%#!"3!!"&5463!254+53254#&##"'#"&546;5463232%54&"5#32%&=#"326wmþ %66%Rý¡FY[Dí5.>:29)7±f&R@M`D*kOJed4M%'þÉÓ +?@+ Q ŽG9 FS)Yÿº.&.4@Jå²+´37+²+±>é°/´I++°D/´ 7+°9/±/33´C+±$'22°+/±!é°K/°Ö´;+°;±5+²8222´1+°-2´F&+°1±/+°'2´1+°$2°±+´+±L+±5;°9°1°9±/F· !+3DI$9°°A9°° 9±DI± 99±93µ5;$9°°%901%#"&54632>54&##"'#"&5434632%54&"#32%4&5#"3264&#"32ºð©V…fFLŒE[bBÄv& D*GQéib[dj„þÁDfCííxuþË'{.)#,>`+d_&jgœÉA=22>3#€T?ZþúM$4cN©hz~dz5MO6IªQD_-;3þû  Yÿ½.'/5FR²+´4++²+±Pé°/´E+°A/°83´++° 2²A +³@A< +°K/±033´C+±%(22°,/±"é°S/°Ö´M+°M±G+²J222´2+±.C22°2±=+´<+°<±0+°(2´1+°%2°±+´1+±T+±GM°9°2°9°=´",4$9°<³+ E$9±0± 899°±699±AE±99°° 9±K4µGM$9°°&901%#"54632632654&##"'#"&5434632%54&"#32&#"#5.#"324&5#"326½Ý¢øT6\!LQ$GULÄu'C*GQéhc[dm„þ¾DfCííxuu8%D3H sþŸ'{/(#,aœÅ.989JJzMUþúJ#2dM©hz}e{€5MO6I¬Ó6"'=T=#_,<3Yþ†º.'S]dn{…²0+°43´M+°D2°+/°93´+°e2°j/°ƒ3´?++°R2°/±33´c++± o22°w/±_33´7+±X22°T/´#7+°†/°Ö´y+°y±-+´|+°P2°|±u+±r22´a&+°W2³au+´)+°a±I+´H+°H±^+°Y2´1+°&2³m^+´<+°§Pa]+QQJ<,_+1J¨N7>G÷·7&J _-@YÿóÄ.@NW^l0²9+²05333´_++±]22²9+´AC+°h/±HY33´>C+±(S22°>° Ö±é°O/°$3±é°2°m/°<Ö´j+°j±b+²>eg222´[+°R2°[±X+°T2´J<+±(é°J±D+´-&+°-±+° 2± é°2² +³@ +±n+±bj°99°[°79°X±599°J±299°(°H9°D±0A99°-±$99°±99° ° 9±A@ -27² 999012632#"'532654&+527654'&#"3232#"'#"'#"&543462654'&'"354&5#32%2654&547#"Aj<°dO_IK]C7&%4,'9G1D3EU7E7³]OQ)Y5u'aFRéfˆ%.8 N$þö5GúAAú{þp#+'{1.<.j*2ºq@MJ-$)2L 4<#)N§P`\'5PPeK©`‚þ=+@ *:9¨N7>G÷·7&J _-@Yÿ%S-HR\cqU² +´++²+°/´7+°=/±5933´d++±Ia22°m/±N]33´B++±/[22³$Bm+´#7+°V/°*3´E++°2°r/°@Ö´o+° Ö´1+² +³@ +°o±g+²Bjl222´_+°Z2°_±c+°S2´Q&+±.é°Q±L+´2&+°2±+°'2´<+°2±s+±g³ =d$9°_°;9°c±E999°Q±G799±L.±5I99°2³ *$9°°#9°°9± °9±d=°;9°#·27@Lgo$9°m²Qj999±VB²'G999012#!"3!!"&5463!27654&+53254&#"32#"'#"'#"&543>3262654+'4&#"3#3252654&547#"Ui‘59F+mýŸ%6[/üÄGX[DYS3# 3*Hi?B8:.¨\AD)*dc)R?NÐ`Rw-B .{O:1.ÔÔlhþ¡%i(-OPT^o$-#CHJA@S K%3G?,3!5Œ?UHH<G÷·Ì  ñ7&J _-@Zÿ"P2FR[bo ²B+±8>33´c++±Ga22°/´#7+°k/±L]33´C+±1W22°S/°,3´C+° 2°p/°Ö´+°±E+´m+°m±i+±f22´_&+°V2°_±\+°X2±Pé±0M22°P±J+´4+°4±(+´ +±q+±E°9°m°9°i±Bc99°_°@9°\³#>$9°P±;99°J± 899°4°,9±kcµ (4@E;$9°±99°S°9°°9014632632#".54767!2>54'&#"32#"&'#"'#"&542654+"354&5#32%2654&=#"ãj]848BzŒSN>n ¼på¬]=4d–‘|ÇšU;:fG5.6µ+0P'EY4t)aFTÐ*1x-'ù6EøBBø}{þp$*&z/Ld}2gYRf¢nH!9uÃUC>F5ruÕlk-^ŸlbA@2+2 §L146#&3QQeL©þð;-_ =0K¨N7=H÷·6' Q _.?Zþ|P2P\eqx…j²L+±BH33´y++±Qw22°/´f++°/´-7+°/±Vs33´C+±;a22°]/°63´C+° 2°†/°"Ö´)+°)±O+´ƒ+°ƒ±+±|22´u&+°`2°u±r+°b2±Zé±:W22°Z±T+´>+³o>T+´+°/´o+°>±2+´ +°i Ö´+±‡+±O)°&9°ƒ°'9°±Ly99°u°J9°r³-H$9°Z±E99°±BQ99°T± 99°o°69±i>³fl$9±f³io$9°-°9°L±l99±yµ 2>JOE$9°±")99°]°9°°'9014632632#"&547#".54767!2>54'&#"32#"&'#"'#"&542654+"354&2654&#"5#32%2654&=#"ãj]848BzŒSN4 !aCB_°å¬]=4d–‘|ÇšU;:fG5.6µ+0P'EY4t)aFTÐ*1x-'ù6EøBº(87)'88þ¯ø}{þp$*&z/Ld}2gYRÎy*+7C``C(9uÃUC>F5ruÕlk-^ŸlbA@2+2 §L146#&3QQeL©þð;-_ =0K¨N7=HüÚ9()78(':/·6' Q _.?ZþRP2NZco†“™²J+±@F33´‡++±O…22°/´p++°x/´d+°/´+7+°/±T33´C+±9_22°[/°43´C+° 2°”/° Ö´'+°'±M+´‘+°‘±+±Š22´ƒ&+°^2°ƒ±€+°`2±Xé±8U22°X±+´}+°}±R+´<+³{54'&#"32#"&'#"'#"&542654+"354&2654&#"2654'#"&'5#32%2654&=#"ãj]848BzŒSNˆ6Hk”j w˜å¬]=4d–‘|ÇšU;:fG5.6µ+0P'EY4t)aFTÐ*1x-'ù6EøB¨!#" /D9*)8 CþÇø}{þp$*&z/Ld}2gYRÖz]>JjjJ 9uÃUC>F5ruÕlk-^ŸlbA@2+2 §L146#&3QQeL©þð;-_ =0K¨N7=Hý!""! qD. *>8(.DY·6' Q _.?Yþˆº.'FPWd.²++´0+°:/´?+°D/´4+°/±33´V++± X22°`/±R33´7+±K22°G/´#7+°e/°Ö´b+°b±^+±[22´T&+°J2°T±(+°<2´2+°2±Q+°L2´1+°&2°±A+´7+°-2°7±+´1+±f+±^b±X99°T°9±2(´#=GV$9±Q·+045:?CD$9°A± 99°7² .999±D?²<7=999±04²-(.999±V° 9°`³ $9012#"'53254+#"'#"&546;546324632&#";2#"'73254+"&"354'&5#32%26545'5#"Ph+)R"as+Äw%`FRfK8n]QnÏZFo>)/U]DC€YFn@*-W^E>;K3Cí! Aíxuþ| /'{0WSJM1/ FjWíMM^KHYRnoQþ5::A.27*g:9A-16(6J52&$ë®/!SY,;Yý»º.'OY`mxx²++´0+°?/´n+°t/´H++°M/´4+°/±33´_++± a22°i/±[33´7+±T22°P/´#7+°y/°Ö´k+°k±g+±d22´]&+°S2°]±A+´v+³2vA+´(+°(/°E3´2+°v±Z+°U2´1+°&2°±q+°J2´;+´7+°-2°;±+´1+±z+±gk±a99°]°9±A(´#FP_$9±v2°C9±Z@ +045?HLMnt$9°q³ >s$9°;³ .9$9±tn±A;99°H±C999°M²E7F999±04²-(.999±_° 9°i³ $9012#"'53254+#"'#"&546;546324632&#";2"&547&'73254+"&"354'&5#32%26545'5#"2654&"Ph+)R"as+Äw%`FRfK8n]QnÏZFo>)/U]DC€@.$#jH"9+*-W^E>;K3Cí! Aíxuþ| /'{0é+*>*+WSJM1/ FjWíMM^KHYRnoQþ5::A.27*gC%>3%$H45# --16(6J52&$ë®/!SY,;ýŸ*++*Yý¦º.'OY`mu„¯²++´0+°>/´w+°~/´t+°p/´H+°M/´4+°/±33´_++± a22°i/±[33´7+±T22°P/´#7+°…/°Ö´k+°k±g+±d22´]&+°S2°]±A+´ƒ+³2ƒA+´(+°(/°E3´2+°ƒ±Z+°U2´1+°&2°±n+´{+°{±y+´;+°;°7 Ö´J+°J/´7+°-2°;±+´1+±†+±gk±a99°]°9±2(´#FP_$9°ƒ°C9°Z°9°@ +045>HLMprtv~$9°n² w999±{J± 99°y±.999±ptµA;y{ƒ$9°H±C999°M²E7F999±04²-(.999±_° 9°i³ $9012#"'53254+#"'#"&546;546324632&#";2#"&547&'73254+"&"354'&5#32%26545'5#"4#"322654'#"&'Ph+)R"as+Äw%`FRfK8n]QnÏZFo>)/U]DC€/;K3Cí! Aíxuþ| /'{0$+..+OJ2 *!- WSJM1/ FjWíMM^KHYRnoQþ5::A.27*g:*I8RR83* /-16(6J52&$ë®/!SY,;þ ,,-V2%!/,%Yþ†º.'PZanE²++°A3´0+°!gafO$:XI&!(°J52&$ë®/!SY,;Yý»º.'Zdkxƒ²++°K3´0+°@/´y+°/´R+°X/´4+°/±33´j++± l22°t/±f33´7+±_22°[/´#7+°„/°Ö´v+°v±r+±o22´h&+°^2°h±I+´N+°N±)+´2+°2±e+°`2´1+°&2³e+´D+°D/´+°±|+°U2´<+´8+°-2°<±+´1+±…+±rv±l99°h°9±)Nµ#KL[j$9±eD°F9±µ+04RX$9°|· 5@Wy~$9°<±.:99±y±D<99°R±F:99°X°89°4²(IN999°0±-.99°+±)L99±j° 9°t³ $9012#"'53254+#"'#"&546;546324632&#";2#"'&547.54732654+"'"354'&5#32%26545'5#"2654&"Ph+)R"as+Äw%`FRfK8n]Qn»]Ep@+/U`FC6PD4%#54$%b}<-1N?V%FF?7$:3Cí! Aíxuþ| /'{0+*>*+WSJM1/ FjWíMM^KHYRnoQýýp?D$9±}+°?9°z±-(99°W²;;::85M‡<3+g5EMææNNææM=+BºJ52&$ë®/!SY,;þ«0v33WO$WN%PT;:K>3;"!= JW=1 !)Ab*< $.:©3Cí! AíxuÐ)7H ý¤ /'{0M02WSJM1/ FjWíMM^KHYRnoQý¨2E¤X>><<>=99VHfK9<0.Läá 0."áäM=+@ºJ52&$ë®è2!Ldé/!SY,;þsttYýü .'v€‡’Ÿ¤ã°5/´:+°E/°k3´‹+° 2°¢/´e+°`/±OX33´q+±+u22°/±33´†++± “22°›/±‚33´7+±{22°w/´#7+°¥/°mÖ´£+°£° Ö´+°/´+°£±¡+´h+°h±]+´\+³„\]+´™&+°™/±–33´„&+°z2°\±+°|2´1+°&2°T Ö´S+°±I+´ˆ+°ˆ±+´C+³+´1+°C±=+´1+±¦+±£°c9°¡³e“k$9°™±`q99±]h°9±\„°s9°T´#uw†$9±S°(9±ˆI´ + 7O$9°·58:EM‹$9±C±-A99±:5°79°E°89°‹³ST\]$9°¢@ =C1Imˆh£$9°e±Ac99°`µ-M(s$9±†° 9°›³ $9012#"'53254+#"'#"&546;54632>32#"'732654'&'#"'&54767&#"#54&#"#54#"632#"547632632"354'&5#323254'#"26545'5#"4"Ph+)R"as+Äw%`FRfK8n]QnKD%}G*&25X40%(?>>çJ52&$ë®þÀ3X2(?/!SY,;þnv:<YÿòŒ.NYcjw0²1+²=+² "9333´k++±Oi22°s/±5e33´CC+±L^22°/³+Z$3´7+±H22°x/°@Ö´u+°u±q+±Dn22´g&+°]2°g±d+°_2´71+°K2°7±1+°2´0&+°0±&+´W&+°W±R+´<+°±+´ &+±y+±qu±=k99°g°;9°d±H999±W&°+9°Rµ")$9°²999°± 99±k1°9°s¶&;@RW$9°C± 99°²)T999°°9014632632'654'&#"&#"#"'&5467&#"#54&+#"'#"&546;54632322654'"354'&5#32%26545'5#"D­~M!yOG‹-l8+°2´=&+°=±5+´U&+°U±[+´/<+°/±'+´&+±{+±s³$Jo$9°k°H9°h±F99±U5°99°[¶ % 2,7$9°/±*99±°!9±oJ²=>H999°u¶'/5MU[$9°P°9°_²,7]999°° 901232>32632)"3!!"&5463!254&#"#"&547&#"#54&+#"'#"&546;54632654'%"354&5#32%265'5#"äJe(MxI9(+`oˆþÛüN#:6'Ëû(EYYE­ëeT+?kHKfp#M_K( ³f'R@L^E-jp5/.3adýÙ-;Ï;;Ïjeþ¨$l*-]G>\, wþê)!$DG@BLÓ\x#l7KvrOpTTIæŒ)Ì==QA?LJZþð7MM7PTHo8, *8¿ ’(GI$0Yÿ1å-]gov‰²+´*++²'+°"/´++°V/°R3´w+°u2°@ Ö°J3´aC+°0/´1++°}/±Oq33´\++±l22°i/±9G33´++± 22°‚/°YÖ´+°& Ö´1+°±{+°2´s+°k2°s±p+°m2´P&+°2°P±K+° 2´J&+°J±C+´^&+°^±c+±=é°=±,+°42´1+°2², +³@,0 +±ƒ+±{³)Vw$9°s°T9°p±R99±^C± G99°c³@;E$9°=±999°,²*999°± !99±°&9±w@²,T999±10¶=CY^c$9±\}± 499°i´5;Ee$9°°9014632254632632#!"3!!"'&5463254&+53264.#"#"&547&#"#54&##"'#"&546;2654'$"3545#32%265'5#")kMIe¤aY&9nùQQàü Y6#Èû-B0-[Dõ›3!74$3=A0'\hQN_s&ÁL²g%Q@L]E.«2\6S/Bþ2X;ÎÎieþ©&l*‰H\^F Og©Z]—A*E(&@=GV!2D,D-TcRmlSrOŽù¡Ì==PB?LT4BB4QPX’;+ +ˆ ‘(!GJ$1YÿŒ-OYcls~b²7+°33´t++°r2²+°*3´P++°/´b++°]/´ 7+°z/±/n33´=C+±Fh22°d/±&33´BC+±L22°/°:Ö´|+°|±x+°>2´p&+°g2°p±m+°i2´11+°E2°1±++°I2´*&+°*±!+´W&+°W°_ Ö´ <+° /´_<+°W±S+°Z2´<+°±+´&+±€+±x|±7t99°p°59°m±B399±_!°&9±SW@ LN$]b$9°²999±]b± 99±zP@ !5:SW|$9°=°I9°d²$U999°B°N9012#"&54632>54&#"#"&5467&#"#54&+#"'#"&546;5463232463262654'4&#"32"354&5#32%265'5#"uƒ”gÁwV‰iFE‹ F`lh"-JtOSpK6,XnL/!(Äv&`HPfK8rYSl1$#­~<2772>ov>§_-a\&kü¶4AíDDíxuþ|#,'{/-·‘܈A=22:+0Ëps‹ '‘DV‹ˆYK…) uYþê¨#8øQQcNJ_XquTq†&&þb>rcU€B^Ö  žN76Lõ·7&X_-@YÿŽ-Xct}ƒ‘™²Q+°M3´„++°‚2²8+°E3´\++°/´k+°g/°o3´"++°&2²g" +³@gs +°/±J~33´WC+±y22°u/±/A33´C+±22°’/°TÖ´+°±Œ+±‡22´&+°x2°±~+°z2´K1+°2°K±F+° 2´E&+°E±<+´Y&+³iY<+´&+°/´i&+°Y±t+´s+°s±`+´4<+°4±,+´1+±“+±Œ±Q„99°°O9°~±M99±Yi°A9°t³"?g$9°s¶8\bk$$9°`°19°4´&/mo$9°,°(9±gk±(99°"°$9±\@ ,<4OTY`‡$9°W° 9°u²1?b999°°9014632247632632#"54763263267654&#"#"'&5467&#"#54&+#"'#"&546;327654'.#"327&#"#"354&#32%2654&547#"BrYS664 !]R|=17a’H?sxÄü.(3[#LR#8# ki$.I678ovd4H sI8&Bý74AíDDíxuþ|!.'{0dXq:;TvD=&&dW‘ÄŠ“289J:f^Vs„ '‘DTEHGCWK…) vXþê¨)2þïQQcNJ_lB^7-n33´LC+±Vh22°d/±#533´Q7+±22°€/°Ö´+°±J+´}+°}±y+°M2´p&+°g2°p±m+°i2´@1+°U2°@±:+°2´9&+°9±1+´Y&+°Y±`+´)<+°)±+´ +±+±J±99±y}±Ft99°p°D9°m±QB99±:@± 99±Y1°59°`´-%3$9°)°#9°°9±{t@ 1)DIJY`$9°L²999°d²%3b999°Q±9901463262! '&4767! 7654'&#"#"'&547&#"#54&+#"'#"'&46;5463232327654'%"354&5#32%26='5#"æ¡~J%"êPKü¦þ[Ë÷43Ié¸{ È¬?@R!!7$5:TQ:7ƒ-VdL/"'Ät)bK*$gL6sYS662&8<87ový§3CîFFîyuþ}!-&z/6tƒ%%_\þ0`uU?8P2vtøePs`©hNO 0ME;XGNIE_—c tZþê¨$7øQQ62’`Wr:;TlEd92>tcU„P75O÷·5#X_.?Zþ|2ep{„‹—³²G+²S+±:O33´Œ++±iŠ22²+°/´q++°/´(7+°“/±K†33´YC+±c€22°|/±0B33´^7+±22°˜/°Ö´$+°$±W+´•+°•±‘+°Z2´ˆ&+°2°ˆ±…+°2´M1+°b2°M±G+°2´F&+°F±>+´f&+°f±+´y+°y±m+´6<+°6±,+´ +³ ,+´t+°t/´+±™+±W$±!"99±‘•±SŒ99°ˆ°Q9°…±^O99±GM±(99±f>°B9°µ:@io$9°y±299±6m±099°t´ qv$9±q³sy$9°(±t99°S± v99±“Œ@ ,>6QVWfm$9°Y²$999°|²2@o999°^±"9901463262"'&547! '&4767! 7654'&#"#"'&547&#"#54&+#"'#"'&46;5463232327654'264&#""354&5#32%26='5#"æ¡~J%"êPK£,>_†0/ ÃþÜþ[Ë÷43Ié¸{ È¬?@R!!7$5:TQ:7ƒ-VdL/"'Ät)bK*$gL6sYS662&8<87ovB(77('99üŒ3CîFFîyuþ}!-&z/6tƒ%%_\ÈsS5C`0/D"8`uU?8P2vtøePs`©hNO 0ME;XGNIE_—c tZþê¨$7øQQ62’`Wr:;TlEd92>tcUý\9P88(':(P75O÷·5#X_.?Zþl2eoz‰’™¤ɲH+²T+±9'/õP75O÷·7&X_.?Yþ„º.'LV]j²(+°-3´A+°82²A( +³@A= +°/±33´\++± ^22°f/±X33´7+±Q22°M/´#7+°k/°Ö´h+°h±d+²Ia222´Z&+°P2´D+°Z±=+´<+°<±W +°R2´1+°&2°±5+´0+°0± +´1+±l+±dh±^99°D°9±=Z·#(AFGM\$9°<°+9°±-899°5´ 23$9±\° 9°f³ $9012#"'53254+#"'#"&546;546322632'654&#"#54&#"&5476"354'&5#32%26545'5#"Ph+)R"as+Äw%`FRfK8n]QnÜ%<SP\y X=2%C+0:\'w/.e3Cí! Aíxuþ| /'{0WSJM1/ FjWíMM^KHYRnoQþ©'DnLŠ93)l4C0ææ.H4j'29ˆL87èJ52&$ë®/!SY,;Yþ„º.'PZan{d²++°/3´H+°@2²H+ +³@HD +°6/°O3´e+´=kD+ +´=+°/±33´`++± o22°w/±\33´7+±U22°Q/´#7+°|/°Ö´y+°y±u+±r22´^&+°T2°( Ö´L+°^±D+´C+°C±[+°V2´1+°&2°°b Ö´:+°:/´b+°±+°g2´1+´3+±}+±(y±o99±Lu°9±D^·#+HNOQ`$9°C°-9±b³ /@$9°³ 6>$9±e6°N9°k³(3L:$9±+H°-9±`° 9°w³ $9012#"'53254+#"'#"&546;546324632632#"'&546;&#"#54&#"&"354'&5#323254'&#"26545'5#"Ph+)R"as+Äw%`FRfK8n]QnþlbML!'XW?=NB<G: !;a=- 1SuÌ3Cí! Aíxub N /þ /'{0WSJM1/ FjWíMM^KHYRnoQýîOl:::9VJg.&5?T!Oäç ,%'0k#56.J52&$ë®þÅ/f /!SY,;YýöÔ.'akr~‹–²3+°73´(+°Z2²(3 +³@(^ +°@/´E+°Q/°.3´v+°/±33´q++± 22°‡/±m33´7+±f22°b/´#7+°Œ/°Ö´‰+°‰±0+´++°+±…+±‚22´o&+±-e22°o±^+´]+°]±l+°g2´1+°&2°T Ö´s+°±x+´N+°N±I+´=+°=° Ö´1+°/´1+±+±0‰±99±o…±.99°^±(399°]´#5bq$9±sl²7ZB999°°C9°x@  @EQXv|$9°N±9L99±E@°B9°Q°C9°v°-9°(@ +09=ILNT|$9°3°59±q° 9°‡³ $9012#"'53254+#"'#"&546;54632"&54632632#"'7327654&'#"&54767&#"#54&"354'&5#323254'&#"26545'5#"Ph+)R"as+Äw%`FRfK8n]Qnþá0>Os`PJ!'O$P')rX;2&,?))+! <<3?""5BZ=,63Cí! Aíxu/?%2þM /'{0WSJM1/ FjWíMM^KHYRnoQþlJ3k'46ŒNp22R 7:T_‰#434D/O !H\T8;/0Méé!,%J52&$ë®þ¾3\2&>/!SY,;Yþº.'.8?GT\²-+´U++°*/´F+°/±33´>++± H22°P/±:33´7+±322°//´#7+°]/°Ö´R+°R±N+±K22´<&+°22°<±*+´Y+°Y±9+°42´1+°&2°[ Ö´D+°±G+´)+°)±+´1+±^+±NR±H99°<°9±[Yµ-/>#F$9±D9°B9±)G± 99°°9±UF±DY99°-°B9±>° 9°P³ $9012#"'53254+#"'#"&546;54632!5432"354'&5#324'326545'5#""654Ph+)R"as+Äw%`FRfK8n]QnDþ“¹´þô3Cí! AíxuXNdšþ$ /'{0f+,WSJM1/ FjWíMM^KHYRnoQý㪧ÉèJ52&$ë®þël!']Wˆ/!SY,;‘M8kU[@YýÀº.'9CJR_gqr²1+´`++°(/´h+°m/´R+°/±33´I++± S22°[/±E33´7+±>22°:/´#7+°r/°Ö´]+°]±Y+±V22´G&+°=2°G±.+´d+°d±++´o+°o±D+°?2´1+°&2°f Ö´O+°±R+´4+°72°4´k+°k/° 3°4±+´1+±s+±Y]±S99°G°9±+d³#:I$9°o²-Q`999°f°19°D°m9°O²(Mh999°°l9±4k± 599°°9±mh±7+99°R³.45-$9°`±Od99°1°M9±I° 9°[³ $9012#"'53254+#"'#"&546;54632"&547#5432#"354'&5#324'326545'5#""654264&"Ph+)R"as+Äw%`FRfK8n]Qn<2K ¹´"J¿3Cí! AíxuXNdšþ$ /'{0f+,2,,<++WSJM1/ FjWíMM^KHYRnoQüiK20#§Éƪ$/3J(J52&$ë®þël!']Wˆ/!SY,;‘M8kU[@þ6*<-,* Yý¦º.'9CJR_go†²1+´`++°(/´p+°x/´n+°j/´Q+°/±33´I++± S22°[/±E33´7+±>22°:/´#7+°€/°Ö´]+°]±Y+±V22´G&+°=2°G±.+´d+°d±++´}+°}±D+°?2´1+±&u22°f Ö´O+°´h+°h/°±R+´4+°72°4´s+°s/° 3°4±+´1+±+±Y]±S99°G°9±}+´#-:I$9°f´1`Qlz$9±ODµ(Mjnpx$9±4s± 599°°9±jnµ7+su{}$9°Q³.45-$9°`±Od99°1°M9±I° 9°[³ $9012#"'53254+#"'#"&546;54632"&547#5432#"354'&5#324'326545'5#""6544#"322654'#"&'Ph+)R"as+Äw%`FRfK8n]QnH9R%{¹´'%R¸3Cí! AíxuXNdšþ$ /'{0f+,Q,--,+%2 +!, 4WSJM1/ FjWíMM^KHYRnoQüOQ98(§Éƪ(89QBJ52&$ë®þël!']Wˆ/!SY,;‘M8kU[@þ,,-V2%".+$3Yÿ#Y2<DM^в&+°"3´N++°E2°/´C+°Y/±I33´0C+±A22°>/´67+°_/° Ö´+°±*+´\+°\±W+²1QT222´K&+°@2°K±H+°B2´1+°;2°±+´1+±`+±\*°9°W±&N99°K°$9°H²"999±YN¶ $*-$9±6>°9012# '&54732>54&+#"'#"'&5<546;5476;&"35426=#'26=&5<=#"¡KmN‡­cþúއj:_syáR‘vDB1+iZc:([=*)jH799OW78•fBív:<í=Ú"2&3H/LvMY‹V,„}Ó¶…$p£µjp"BnG0NhQQ32? FcT:;8:UšQ65þŸnKKl4"! 8.'?YþPY2GOXbs%²1+°-3´c++°P2²+° /´Y++°/´ C+°n/±(T33´;C+±L22°I/´A7+°t/°Ö´+°±5+´q+°q±l+²54&+#"'#"'&5<546;5476;&"35426=#264&#"26=&5<=#"¡Kmx-<0.EB_ NOþúއj:_syáR‘vDB1+iZc:([=*)kG799OW78•fBív:<í==(88('99þ"2&3H/LvMŸ^S6A20aB$„}Ó¶…$p£µjp"BnG0NhQQ32? EdT:;8:UšQ65þŸnKKlþ]8P89N9¤4"! 8.'?Yþ,Y2=ENYivb².+°*3´j++°F2° /´Z++°b/´O+°/´C+°q/±%J33´4C+±B22°?/´97+°w/°Ö´+°±1+´t+°t±o+°52´L&+°A2°L±I+°C2´'1+°<2³g'I+´+°/´g+³W'I+´e+°e/´W+°'±R+´_+°_±"+°]2´1+´+±x+±t1°9°o±.j99°L°,9°´*>F$9°I°9±R'´ OTZb$9°_°9±O·QW]_eg$9°²RT999°.°9±qjµ",1$9±9?°9012#"&547#"$54732>54&+#"'#"&546;5463&"35426=#264&#"2654'#"&'265&=#"¡Km}/?kJIk=BõþÚj:_ûÒR‘vDD/+iZc:([+°>±W+±7R22´1+°&2´K+°±++´0+° Ö´1+±v+±Dh±^99±rd°9±nZ³Aµ#:GM\$9±+¶ (-.4$9±:k¶+07>DJp$9°G°-9±\° 9°f³ $9012#"'53254+#"'#"&546;546322654'7#"&=4#"#"&54632"354'&5#32%26545'5#"2654'Ph+)R"as+Äw%`FRfK8n]Qn=%0Z%r!%I>Np OH;:t(J52&$ë®/!SY,;þpC&`3T&9Yý¸º.'S]dq{…‡²N+°.3´A+°7/´r+°H/°w3´|+°(2°/±33´c++± e22°m/±_33´7+±X22°T/´#7+°†/°Ö´o+°o±k+±h22´a&+°W2°K Ö´ƒ+°a±+´E+°E±^+±>Y22´1+°&2´R+°°z Ö´:+°:/´z+°±++´0+°42° Ö´1+°0´u+°u/±‡+±Ko±e99±ƒk°9±a³HC|$9°Eµ#ANTc$9±z² <999°+· (-.7rw$9°°29±Hr±:499°|±2<99°A¶+0>EKQ$9°N°-9±c° 9°m³ $9012#"'53254+#"'#"&546;546322654'7#"&547&=4#"#"&54632"354'&5#32%26545'5#"264&#"%2654'Ph+)R"as+Äw%`FRfK8n]Qn=%0Z%r;?K32K)Mp OH;:t(J52&$ë®/!SY,;ýœ+<+*>*ÔC&`3T&9Yý™º.&R[bmu…§²M+°-3´@+°6/´v+°~/´t+°G/´†+°'2°†´p7+°/±33´a++± c22°i/±]33´7+±W22°S/´"7+°/°Ö´k+°k±g+°2´_&+°V2°J Ö´+°_±‰+´D+°D±\+°X2´1+°%2³=\+°93´Q+´ƒ+°±n+´{+°12°{±*+´/+°32°/´y+°y/°*° Ö´1+±‘+±Jk±c99±g°9±‰_³GB†‹$9°Dµ"@MSa$9±Qƒ°9°±;€99°n@  ',-6rv~$9±ptµ93y{ƒ$9±†G±1;99°@¶*/=DJP‹$9°M°,9±a°9°i³ $9012#"'53254+#"'#"&546;546322654'7#"&547&=4#"#"&54632"354&5#32%265'5#"4#"322654'#"&'%2654'PhWO"as+Äw%`FRfK8sXQn=%0Z%rFCR89R>Ap OH;:t(J54Hë®4$SY,;ýÿ++.U3$".,$3ôC&`3T&9Yÿò¸/3:DMSaR² +´/++°42²+°3´T++°R2² +´ +°]/±N33´C+±(E22³A]+°3±1é°92²A1 +³@A +°;/°H3´7+°#2°b/°Ö´_+°_±\+±W22´O&+°L2°O±N+°E2´1+°'2°±+´-1+²- +³@ +³-+´>+°-±0+°A2±:é°2°:±4+´ +° ´+°/±c+±\_±T99°O°9°N±#99±-°/9±0>°9±/T°9°1´-W_$9°]°Z9±A±599°;±>9901463263!5654+#"'#"&546;546323235.5#"54&54&"#32%2654&547#"s\>š¼'.ý@LqÄu'aGQfM6sXT56K58 Þaû;@7¡+Y>2þZBj !ííxuþ}!-'{0?^¤}ýß*b_øQQcNK^Xs;EOYbhvº²#+°3´i++°g2²U+±?é°:2²+° 3´:++²+´+°/´P++°r/±c33´)C+±3Z22³L)r+°3±<é°D2²L< +³@L +°F/°]3´7+°.2°w/°&Ö´t+°t±q+±*l22´d&+°a2°d±c+°Z2´1+°22°±+´81+²8 +³@ +³8+´I+°8±;+°L2±Eé°2°E°X Ö´+°/´X+°E±?+´ +° 2° ´S+°S/° ´+°/±x+±qt±#i99°d°!9°c±.99±8°:9±;I°9±E°9±?X²PU999± ° 9±#P³ SW$9±?i°!9°<´&8lt$9°r°o9±)L±@99°F±I9901463263##"&547!5654+#"'#"&546;546323235.5#"54&264&#"54&"#32%2654&547#"s\>š¼'.!$`CB_$þ]LqÄu'aGQfM6sXT56K58 Þaû;@7¡+Y>2÷'98('9:ý‰Bj !ííxuþ}!-'{0?^¤}ýß-:C``C:-*b_øQQcNK^Xs;2²#+°3´w++°u2²+´+°/´X++°`/´O+°/±q33´)C+±2h22³J)+°3±;é°B2²J; +³@J +°D/°l3´7+°.2°„/°&Ö´+°±~+°*2´r&+°o2°r±q+°h2´1+°12°±+´71+²7 +³@ +³7+´G+°7±:+±J22±Cé°2´e+³cC:+´V+°C±Q+´]+°]±>+´ +° 2° ´[+°[/° ´+°/±…+±~±#w99°r°!9°q±.99±7°99±:G±D99°e°9±QV²X`999± ° 9±#O· QV[]ce$9°±ST99±9w°!9°;´&7z$9°°|9±)J±?99°D±G9901463263##"&547!5654+#"'#"&546;546323235.5#"54&2654&"2654'#"&'54&#"#32%265&547#"s\>š¼'.++jJHm.þ{LqÄu'aGQfM6sXRmK58 Þaû2¡+Y>/Æ0""0"326=!5654+#"'#"&546;546323235.5#"54&2654'&#"254&"#32%2654&547#"s\>š¼'.RHniE=3H,Ÿ#ýˆLqÄu'aGQfM6sXT56K58 Þaû;@7¡+Y>2$?.JVwýàBj !ííxuþ}!-'{0?^¤}ýü#zE<%!6!, A4:*b_øQQcNK^Xs;9°O°?9°b³FALG$9±†5°G9°ƒ±7299°_²DI]999±:Z±š½),ý>LpÄu'aFRfM6sXRmNj ÞÜB3{oXV"ªLK\r$U:0@EONGe,= '/?ù„1T0+Y>þ(D32Dííxu¹3223ýÄ .'{/Ñ eS=[Ÿwþýô)^]êMM_HGYUjnQZK3"þ¢3D¤Z{;;::jP‡<3,f4FMææNNææM=+B/Ö BtB.4!6A?4NO5F­þ«&+°|±1+°82±7é°2°t Ö´s+°7±i+´œ+°œ±2+´ +°c2° ´ +° /° ´ +° /±«+±Z]±Q99°L°9°Ž³&FO$9±¨K°ƒ9°²…‹¦999±ˆ¤³€‘$9±.±0“99±t>³;x•$9±s1°—9±œi±`p99°2´flnž¢$9±žf°¨9°¦µciŽœˆ $9°™±ƒ¢99±pl°—9°`°“9±0O°9°´.T]$9°[°W9±!A± 399°F±>9901%.54632673!5654+#"'#"&546;54632323!5#4&#"%54&#"#32%2654&5465#"2#"&54632&#"#74&#"#54#"632#"&546326326"3254'&4#"2S_ƒ^>š½),ý>LpÄu'aFRfM6sXRmNj Þ„1T0+Y>þ(D32Dííxuþ} .'{/XyLB6=I<K\A3#!,Df,> %0>A3>>oYQ&]Q(« +:Ký“24fÑ eS=[Ÿwþýô)^]êMM_HGYUjnQZK3"Ö BtB.4!6A?4NO5F­1!H  X,;RsVJdJ:BZMæã!0/"ãæM=+A03DZJ[z;:==™2!Ld!l32#"'732654&'#"&5467&#"#54&#"#54#"632#"&5463263254'#"4#"3S_ƒ^>š½),ý>LpÄu'aFRfM6sXRmK76 Þ„1T0+Y>þ(D32Dííxuþ} .'{/ßO E%EUlW52$*E.<$0A2"!-Fd-> %0>A2>>nYS(T: !1ýü253Ñ eS=[Ÿwþýô)^]êMM_HGYUjnQ,+N3"Ö BtB.4!6A?4NO5F­1!I  X,;Q>%V qP_‡!5dD.M #R58`,$èä!21"äèO>-A13E[K\|>>ò2X5%@uv:< Yþ¹-28BKQ`gow²f+´p++°c/´n+°/´17+°32° Ö°3´P+°R2°´+°\/±L33´!7+±*C22³B!\+° 3´7+°72²B +³@B +°G/°<3´&+°2°x/°Ö´^+°^±[+±"U22´M&+°J2°M±L+°C2´1+°)2°±+´/<+²/ +³@ +³/+´?&+°/±c+´t+°t±2+°92±8é±n22°8±v+´l+°l±3+´ +³b 3+´o+°o/´b+° ´ +° /±y+±[^±R99°M°9°L±&99±/°19±c?±<99±82°p9°v°f9°l°j9±pn±lt99°f°j9±1P°9°´/U^$9°\°X9±!B± 499°G±?9901%.54632673!5654+#"'#"&546;54632323!5#4&#"%54&#"#32%2654&5465#"!54324'3'"654S_ƒ^>š½),ý>LpÄu'aFRfM6sXRmK76 Þ„1T0+Y>þ(D32Dííxuþ} .'{/²þ“¹´=Mdš,,Ñ eS=[Ÿwþýô)^]êMM_HGYUjnQ,+N3"Ö BtB.4!6A?4NO5F­1!I  X,;þèª§ÉÆl (]W÷M8kU[@ YýÀ¹-28BKQ`rz‚²j+´{++°a/´ƒ+°‰/´z+°/´17+°32° Ö°3´P+°R2°´+°\/±L33´!7+±*C22³B!\+° 3´7+°72²B +³@B +°G/°<3´&+°2°Ž/°Ö´^+°^±[+±"U22´M&+°J2°M±L+°C2´1+°)2°±+´/<+²/ +³@ +³/+´?&+°/±g+´+°±2+°92±8é±y22°8°Œ Ö´d+°d/´Œ+°8±+´w+°w±3+´ +³m 3+´z+°z/´m+°p2°m´†+°†/° ´ +° /±+±[^±R99°M°9°L±&99±/°19±g?±<99±8d±f{99±Œ°j9°w³auƒ‰$9±3†°n9±‰ƒ±pd99°z³gmnf$9°{±w99°j°u9±1P°9°´/U^$9°\°X9±!B± 499°G±?9901%.54632673!5654+#"'#"&546;54632323!5#4&#"%54&#"#32%2654&5465#""&547#5432#4'3'"6542654&#"S_ƒ^>š½),ý>LpÄu'aFRfM6sXRmK76 Þ„1T0+Y>þ(D32Dííxuþ} .'{/32K ‘¹´ IMdš,,2-,**Ñ eS=[Ÿwþýô)^]êMM_HGYUjnQ,+N3"Ö BtB.4!6A?4NO5F­1!I  X,;ýnL10#§Éƪ"13Jzl (]W÷M8kU[@þ6*,-<* Yý¤¹-28BKQ`ow…•J²i+´x++°b/´†+°Ž/´…+°‚/´w++°/´ 7+°32°$ Ö°(3´L+°R2°´+°\/± N33´.7+±G22³?.\+°3´ 7+°72²? +³@? +°C/°93´+°2°–/°+Ö´^+°^±[+±/U22´O&+°F2°O±N+°H2´"1+°2°"±+´ <+² +³@ +³ +´<&+° ±f+´|+°|± +°?2±8é²v“222°8´d+°d/°8±~+´t+°t±+´‹+°‹±3+´+³l3+´w+°w/´l+°l°o Ö´‰+°‰/´o+°´+°/±—+±[^±(R99°O°&9°N±$99± ° 9±f<±999±8d±ex99°~²bi999°t´r‚…†Ž$9±w°a9±3‰°m9±Ž†±oc99±‚…µnd‰‹‘“$9°w³flme$9°x±t|99°i°r9± L°&9° ´ +U^$9°\°X9±.?±499°C±<990123235.54632673!5654+#"'#"&546;5465#"54&%"354&25#'2654&5465#""&47#5432#4'3'"6544#"32654'#"&' RmK76 Þ_ƒ^>š½),ý>LpÄu'aFRfM6s»„1¡+Y>0ýá2DíD1uí– .'{/irR'‡¹´'FMdš,,Z,--$4 +! + 4-nQ,+N3"t eS=[Ÿwþýô)^]êMM_HGYUjþ0Ö Bt4!6A‡.O54NþbÁ­1!I  X,;ýRRr(§Éƪ(rDl (]W÷M8kU[@þoXXV3$!.*$3 Yýí¹-28BKQ`t|„Žò²i+´++°o/´ˆ+°/´a+°f/´{+°/´ 7+°32°$ Ö°(3´L+°R2°´+°\/± N33´.7+±G22³?.\+°3´ 7+°72²? +³@? +°C/°93´+°2°/°+Ö´^+°^±[+±/U22´O&+°F2°O±N+°H2´"1+°2°"±+´ <+² +³@ +³ +´<&+° ±f+´ƒ+°ƒ± +°?2±8é°2°r Ö´…+°8±}+´y+°y±e+°u2´l+³3le+´+°l±+´+±+±[^±(R99°O°&9°N±$99± ° 9±f<±999±}8¶aio{ˆ$9°y±wŠ99°e°c9±ˆ°r9°a°c9±{±yƒ99°i°w9± L°&9° ´ +U^$9°\°X9±.?±499°C±<990123235.54632673!5654+#"'#"&546;5465#"54&%"354&25#'2654&5465#"267!5432#"&54674'3'4#"63254&#" RmK76 Þ_ƒ^>š½),ý>LpÄu'aFRfM6s»„1¡+Y>0ýá2DíD1uí– .'{/ã\#þй±fU3QCÀMdšt)+,€U/#4*":-nQ,+N3"t eS=[Ÿwþýô)^]êMM_HGYUjþ0Ö Bt4!6A‡.O54NþbÁ­1!I  X,;þ$)2£ÊÈ¥NX'%Âm )`U·BN9lWíYþƒº.&/6BmT°R/´I+°_/°X3´j+°C2²_j +³@_\ +°/±33´5++± 722°>/±133´7+±+22°'/´"7+°n/°gÖ´b+³@bg+´+°/´@+°b±\+´[+³3[\+´<&+°³ $9012#"'53254+#"'#"&546;54632'"354&5#32%26='5#"23254'7#"&=4#"#54#"&546326PhWO"as+Äw%`FRfK8sXQnÈ3CíCCíxuþ| /'{0DJ\R]`%zžIQWGHT.5V&q[J[WSJP] FjWíMM^KGZUkoQ‘J54Hë®/!SY,;ORFBa„b*0;‚Á^N9VOååOI4f*3=†Nm::Yý½º.&/6Bv§°W/´w+°|/°n3´I++°h/°a3´s+°C2²hs +³@he +°/±33´5++± 722°>/±133´7+±+22°'/´"7+°€/°pÖ´k+³@kp+´+°/´@+°k±e+´d+³3de+´<&+°³ $9012#"'53254+#"'#"&546;54632'"354&5#32%26='5#"23254'7#"&547&=4#"#54#"&546326264&"PhWO"as+Äw%`FRfK8sXQnÈ3CíCCíxuþ| /'{0DJ\R]`%z=;J32K#_WGHT.5V&q[J[`,,<++WSJP] FjWíMM^KGZUkoQ‘J54Hë®/!SY,;ORFBa„b*0;‚r1'E3JK23%#9VOååOI4f*3=†Nm::ýñ*<,,<*Yýº.&XahtzŠȰ;/´{+°ƒ/´z+°w/´-7+°K/°D3´V+°'2²KV +³@KH +°/±33´g++± i22°p/±c33´7+±]22°Y/´"7+°‹/°SÖ´N+³rNS+´+°/´r+°N±H+´G+³eGH+´n&+°n/°3´e&+°\2°G±A+´++°b Ö°^3´1+±%ˆ22°´=+°=/°+±/+° 2´4+°82³€4/+´u+°u/´€+°/´1+°4´~+°~/±Œ+±nNµKPQVi$9°H°9±Ge±'X99°A´("Yg$9±+°?9°u@  -12;x{ƒ†$9°€±6:99±wzµ=8~€†ˆ$9°-³6?PQ$9°Kµ*/4ANS$9°V±1X99°°29°g°9°p³ $9012#"'53254+#"'#"&546;5463223254'7"&547&=4#"#54#"&54632"354&5#32%26='5#"4"22654'#"&'PhWO"as+Äw%`FRfK8sXQnþý–[R]`%zDGRpS3YWGHT.5V&q[J[V3CíCCíxuþ| /'{0{XX*%2 +!+ 4WSJP] FjWíMM^KGZUkoQþªRFBa„b*0;‚x0)Q8RR8C)&{9VOååOI4f*3=†Nm:!J54Hë®/!SY,;þ++-U2$".+$2Yýêº.&/6B|„ ²y+°C3´n+°g2°U/´ƒ+°/´Z+°`/°j3´K+°/±33´5++± 722°>/±133´7+±+22°'/´"7+°…/°vÖ´q+³@qv+´+°/´@+°q±k+´j+³3jk+´<&+°³ $9012#"'53254+#"'#"&546;54632'"354&5#32%26='5#"23254'7#"&543267#"&=4&#"#54#"&5463264#"32PhWO"as+Äw%`FRfK8sXQnÈ3CíCCíxuþ| /'{0FKYR]`%}—ˆ6Num/IQ%2GHV-4V&qZKO($þW.R3WSJP] FjWíMM^KGZUkoQ‘J54Hë®/!SY,;PQH3jc,0>˜’´+(D5!' ]M!;3QææQJ3g,4;ŠPm++þ0 Yþ†º.&/6BWm'²X+°C3´c+°M2°/±33´5++± 722°>/±133´7+±+22°'/´"7+°n/°kÖ´f+³@fk+´+°/´@+°f±<+°2´3&+°*2°3±`+´[+°[±U+´P+°P±0+°,2´1+°%2°±K+´F+° Ö´1+±o+±³ $9012#"'53254+#"'#"&546;54632'"354&5#32%26='5#"2'654&"&546!2'654&#"&546PhWO"as+Äw%`FRfK8sXQnÈ3CíCCíxuþ| /'{0SmƒcNpKcƒqþ¾Sl„aM98IcqWSJP] FjWíMM^KGZUkoQ‘J54Hë®/!SY,;PpTƒ33$]9PP9`!35RrpT‚43"_:OO:`!34‚RrYý¶º.&/6Bbx‚~²c+°C3´n+°X2°M/´y+°/±33´5++± 722°>/±133´7+±+22°'/´"7+°ƒ/°vÖ´q+³@qv+´+°/´@+°q±<+°2´3&+°*2°3±k+´f+°f±`+´[+°[±0+°,2´1+°%2°° Ö´P+°P/´+°±V+´F+°J2° Ö´1+°F´|+°|/±„+±³ $9012#"'53254+#"'#"&546;54632'"354&5#32%26='5#"2#"&5467'654&"&546!2'654&#"&546264&#"PhWO"as+Äw%`FRfK8sXQnÈ3CíCCíxuþ| /'{0SmIIK32K9(cNpKcƒqþ¾Sl„aM98Icq(,,**WSJP] FjWíMM^KGZUkoQ‘J54Hë®/!SY,;PpT_7"Q3JK2-C $]9PP9`!35RrpT‚43"_:OO:`!34‚Rrýê+<,,<+Yýœ¼.&/6Bcy‘œ²d+°_3´o+°T2°I/´‚+°Š/´€+°/±33´5++± 722°>/±133´7+±+22°'/´"7+°’/°wÖ´r+³@rw+´+°/´@+°r±<+°2´3&+°*2°3±l+´g+°g±\+´W+°W±0+°,2´1+°%2°° Ö´L+°L/´+°±R+´b+°z Ö´‡+°R° Ö´1+°F2°´…+°…/±“+±³ $9012#"'53254+#"'#"&546;54632'"354&5#32%26='5#"#"&5467'654&"&546322'654&#"&5464#"322654'#"&'PhWO"as+Äw%`FRfK8sXQnÈ3CíCCíxuþ| /'{0‹*7R9:R9)cNpKcƒqRSmý¬Sl„aM98Icqa+..+*$4+ - 6WSJP] FjWíMM^KGZUkoQ‘J54Hë®/!SY,;þZ G09QQ90G $]9PP9`!35RrpTZpT‚43"_:OO:`!34‚RrþR++.V4$!0-#5WþýŽ-,6@²0+±*33´'++²+´?++²'0 +³@') +°/´5++´:) +´7+°/´!7+°A/°Ö±<é´&+°<±8+´+°± +±$é° Ö´2+²2 +³@ +°$±'+´*1+°2°*´-+°-/±B+±8<±99°±!99±2 ±&99°$°9°'´/045$9±*-°+9±5³-2$9±'?° 9°:¶ $7<$9°°901"&547#5654&#"632#"&5463233#4&"26$4&"32Ž_†_dYt`[‹UGWWF]c«‰¥>ËPC7P89N8þ!3P23')`C``C6*:9‡f‡YGcJIa„i¾²„v>Ýýà*6(88('99ùV;=+)<WþÔŽ--8HRQ²+´I++²4+´C+²+²+°/´9++°A/´.+°N/´+7+°$/´ 7+°S/°Ö±Pé´'&+°P±L+´+°±!+± é³F !+´+°/´F+²F +³@ +³6 !+´D+°D/´6+° ±1+´>+°>±+´1+°2°´<+°DF$9±I°9°N¶ !)KP$9°+°'9± $±9901%#"&5463233##"&547#5654&#"6322654&"2654'#"&'264&"´WF]c«‰¥>ËP-,jKIk.NYt`[‹UGW#""0"!/D:)(: Dþf)23P23Ia„i¾²„v>Ýýà4CJklIC4:9‡f‡€YGcþ " "pC/!*=8(.D326=!5654&#"6322654'&'&#"%264&"´WFc3*RW‹„¢>ËPMEg\B75J'LjþÀYt`gE:UGW×!;#- 9#þÀ)23P23IaK@b^b´‚v>ÝýÜzD=)"0-+"(G:9‡f‡K@NGcþ^ ñ)53]_yTD'pO=r|S^QIn|M]' %DH€KäQpGPAO32ƒcV4-‡FfYÿ1F2Bê² +´++²+°/´++°,/´97+°/´7+°$/´@++°C/°0Ö´5&+°5° Ö´&+°/´ &+°5±;+´(<+°(±+°"2´<+°2² +³@ +±D+±; µ ,239$9±(²@999°²999± °9±9,±99±²(;999°$´'05<$9°@°3901#!"3!!"&5463!254+53254#"#"'&54732=47632F-"ObGþv&77&%ýÎEY\BŠcpEEp=037Ye>7˜#l"'Cp37\^~)B iCR%! %CGA=MTZGQ_KLAM34EA`ªF84|A/6ŠNH36SYÿ•21<²² +´,7+°/´;++°5/´7+°/±é°=/°#Ö´(1+°(± +´7<+°7±.+´<+°±+´&+±>+± (°%9°7² &,999°.±599°±;99°²2999±5;± 99±,µ#(/$9°°&9012#"'&5463267654&#"#"&54732=464&#"32šv…lyÂO54&#"#"&54732=46.#"327&#"#"#šv…w~ÇùT6\!LR#;LYWF1vamƒ¥(}(-Nrv4G uG5&B.´‡Ì˜.989J<½gfcaP_tšuÒT=BœP=F²^Z€ýB'=.6"Yþ†Ž2)L²-+´9+°?/°33´J+°/° 3´'7+°/´++°M/°Ö´#1+°#±B+´G+°G±)+´&+°±L+´<+°<± +´+³1 +´6+°6/´1+±N+±B#± !99°G±'99°)°D9°²?EJ999±6<¶ -34 $9±J?°49°9µ*16+°K/´W+°/° 3´'7+°/´++°]/°Ö´#1+°#±O+´T+°; Ö´3+²3; +³@36 +°T±)+´&+°±Y+´H+°H±A+´-+°-± +´+±^+±O#³ !'$9±)3±>Q99°³1KRW$9±AH¶ *0? $9±15°;9±DWµ-AHOTZ$9°*°R9°°Q9°'° 9°µ #$9°°!9014632'654'&#"#"'&547673252+"3!!"&546;254&#"#"'&54732=46ÐqYzA9\H*„)-S{:9dqB=',R2‡(.M…ÙGSiZ«33gþ‘/=?-¨Ž2*"L9E''l#N0#BB_ZtWLvZˆ$0;§Q8?»MY=>-ý#CCX>K:?Sk J0"AM_ZtWLvZˆ$0;§Q8?»MY=/)*3%96+6X'5>Q?p2/$J%8L06DYýéŽ2)Yb)°5/´\+°a/´;+°K/´W+°E/´-+°Q2°/° 3´'7+°/´++°c/°Ö´#1+°#±O+´T+°T±)+´&+°8 Ö´Z+°±Y+´H+°H±C+´1+° Ö´+±d+±O#± !99°T±'99±)8°Q9°Z²KRW999±Y±;a99°H±5\99°C¶ -? ^$9±a\³8Z?^$9±EWµ*1CHOT$9°-°R9±'° 9°µ #$9°°!9014632'654'&#"#"'&547673254632#"&5463267654#"#"'&5473253254&#"ÐqYzA9\H*„)-S{:9dqB=',R2‡(.M…bN=S,*HO€8_L-&,4 .iDRAL-)v"S3,K6Q<:',_ZtWLvZˆ$0;§Q8?»MY=Gý² +´++² +±-é² +³@ +´:  +°C3´++°2°´+°?/°3´7+°42°H/°$Ö´)1+°)±1+´&+°±+´8+²8 +³@ +°8± +°;2±é°B2°±D+´1+°±+´ 1+±I+±1)²& '999±°49°8°:9° °9±D°9±°9±?:µ$)18$9°°'9012!!3!5#"'#5654&#"#"'&5473276546323546"!54&ÓlŒþ]3Pý)6,`LV9J& 5:]m@9¥2‡#*L_ }aZ=>€’nN\PY.}gwÝýàº($\7H>5NP_>@XOrÔR2B§N@Lg$Œ_x66[G"Of~HbP99PbYþó«2JS]T²+° 3´++²,+°Y3±9é² +³@ +°/´T++´F, +°O3´++°2°´+°K/°#3´7+°@2°^/°0Ö´51+°5±=+´(&+°(± +´D+² D +³@  +°D±+°G2±é°N2°±P+´1+° Ö´\+°±+´ 1+° 2° ´W+°W/±_+±=5²2,3999± (°@9°D°F9°°9±±K99±\P°9±²TY999± W° 9±,T³ W[$9±°(9±KFµ '05=D$9°°39012!!3##"&547!5#"'#5654&#"#"'&5473276546323546"!54&264&#"ÓlŒþ]3P''/.FB_'þF6,`LV9J& 5:]m@9¥2‡#*L_ }aZ=>€’nN\PYç(88('99.}gwÝýà-=B10aB=-º($\7H>5NP_>@XOrÔR2B§N@Lg$Œ_x66[G"Of~HbP99PbýP8P89N9YþÔ«2@ISc‘²+° 3´++²%+±0é² +³@ +°/´T++°\/´K+´<% +°E3´++°2°´+°A/°3´7+°72°d/°(Ö´-1+°-±4+´"&+°"±+´:+²: +³@ +°:±+°=2±é°D2°±F+´1+³aF+´+°/´a+³RF+´_+°_/´R+°±M+´Y+°Y±+´ 1+° 2° ´W+°W/±e+±4-²*%+999±"°79°:°<9±±A99°F°9±M´JPT\$9± W° 9±%K· MRWY_a$9°±OP99±°"9±A<µ!(-4:$9°°+9012!!3##"&547!5#5654&#"#"&5473276546323546"!54&2654&"2654'#"&'ÓlŒþ]3P++jKIk.þdöLV9FJp\i}¥2‡SF_ }a[z€’nN\PY¼0""0";/E9*(: B.}gyßýà2EJklIC4º($\6InSPa|£vÔR2B§V„g$Œ_xoXG"Of~HbP99Pbý¡" ’C/*=8(.DYÿ«2R[kF²+° 3´++²4+±Aé² +³@ +°/´\++°e/´++´$N4 +°W3´$++°2°$´&+°S/°+3´7+°H2°l/°8Ö´=1+°=±E+´0&+°0±(+´L+²(L +³@(% +°L±+°O2±é°V2°±+±hé°h±X+´1+°±+°2´ 1+±m+±E=²:4;999±(0°H9°L°N9°°"9±h±S99°X±e99°±\99°±_99±e\±99±&$°09±SNµ(/8=EL$9°°;9012!!3##"'&54>326=!5#"'#5654&#"#"'&5473276546323546"!54&2654'&'&#"ÓlŒþ]3PQIobF:6K*G~ ýt6,`LV9J& 5:]m@9¥2‡#*L_ }aZ=>€’nN\PYu#?"4 9 '.}gyßýàzD=(!2!.*'2=º($\7H>5NP_>@XOrÔR2B§N@Lg$Œ_x66[G"Of~HbP99Pbý_Yÿó‹22®²+°3´C+°%2°/´7+°/´+7+°3/°Ö´"1+°"±'+´&+°± +°2´1+°.2² +³@  +±4+±'"² 999± ³+1$9±°9°²999°´"'1$9°±(.99°+° 901%#"'532654+53254#"#"&547325'4632‹mM;:.B.@v##vœ~y^mƒ¥)~ZI…|a^€0#S“HXI1*YHO_ÆP_| wÒT8?¤V…º^axTO)@ Yþï‹2;Eõ²?+°#3±é°.2² +±é°/´D++°/´7+°/´47+°F/°&Ö´+1+°+±0+´ &+° ± +´A+°A±+±<22´1+°72² +³@ +°´+±G+±0+²(#)999±A ² 999°´4:$9°°9±?D± 99± °9±² 999°´&+0:$9°±1799°4°)901%#"&547&'532654+53254#"#"&547325'46324&"26‹L=_CB_( 3I.@v##vœ~y^mƒ¥)~ZI…|a^€0#SQ8P89N9“U.0OB``B>.I1*YGP_ÆP_| wÒT8?¤V…º^axTO)@ þ•(99('99YþÊ‹2;GV-²#+°?3´.7+°2² +°/´T++°M/´E+°/´7+°/´47+°W/°&Ö´+1+°+±0+´ &+³ 0+´Q+° ±O+´B+°B±<+´J+°J±+±H22´1+°72² +³@ +°´+±X+±0+²(#)999±Q ²  999±BO°9°<µ4LMT$9°J°9°±:99±#Eµ HJOQ$9°.± 99°² 999°´&+0:$9°±1799°4°)901%"&547&'532654+53254#"#"&547325'46324&#"3264'"&'326‹QEk”j5 ::.@v##vœ~y^mƒ¥)~ZI…|a^€0#S‰#"!";:R9 C./D“Y-6XJkkJL4Q 1*YGP_ÆP_| wÒT8?¤V…º^axTO)@ þ¼"!"#!*=8(.DDYÿ§2@JÞ²*+´I7+²+±é°"/´D7+°5/±6é°>/´C+° 2°K/°Ö´ 1+° ±+´<+³A+´&&+°&/´A&+°±0+±é°2°±:é°:/±L+±& ³  $9±:·"*.5DFI$9±0°9±ID±&.99±±099±65²999°>´ @$9°° 901%#"'&547325'4632#"'&547632654'&+532654'&#"3254&#"#ycqB;¥)~(-N…€c^DLMSRS‚HAP?-=B8C 7833/9..8“.\0UR-bÐcxUNtÔR;E›R>G¬h]~19X{)3‰€EE#B9,.Q7*(VF25$$Æþ_"Yÿéã3V&² +°*3´7+°72²+´N++² +³@R +´JR +´J+´R +´++°#/´=7+°W/°.Ö´31+°3±9+´&&+°&±+´L<+°L±+°!2±Fé°A2²F +³@ +°F±P+±Sé°S±+´&+±X+±93²0*1999±L²#=999°±I99°F²CN999±SP°9°² 999±J²L999±²&9F999°¶%.3:C$9°#°A9°=±19901%2654'7#"'#"546372654+532654#"#"'&547325'4632#'"3253ÞRg‰,©CGrp0H®Ð,C"R//"0Œ—9;cqB=¥)~(-N……m6`BJ,<)>#vÒX :wX²?9UÑsRVT]i-8B/"NÕA\>AUOsÔR9ER>G¶Pj}B-_6"(HŸXþ¨2-3Yþñã3_i`²+´W++²3+°e3±@é°2² +²+°/´a++°S/´+°%/´&++°,/´F7+°j/°7Ö´<1+°<±B+´/&+°/±+´U<+°U±"+°*2±Oé°J2²"O +³@"& +°O±Y+±\é°\±+´h+°h±+´&+°c Ö´ +±k+±B<²93:999±U²,F999°"±R99°O²LW999±\Y°9±h°9°c´ $9±a³ ch$9±W3° 9±S@²U999±%²/BO999°&¶.7#vÒX WN98P8:wX²?9UјQ/aB10aB:+;]i-8B/"NÕA\>AUOsÔR9ER>G¶Pj}B-_6"(HŸXþ¨2-3þú9'(99('YþÍã3Xds˜²+´Q++²0+°_3±;é°2² +²+°/´f++°m/´Y+°M/´+°#/´$++°*/´A7+°t/°3Ö´81+°8±=+´-1+°-±+´O<+°O± +°(2±Ié°D2² I +³@ $ +°I±S+±Vé³VS+´r+°V±p+´b+°b±\+´j+°j±+´&+°h Ö´ +±u+±=8²506999±O²*A999° ±L99°I²FQ999±S°9±rV°9±bp°9°\µefm$9°j° 9±Y· \bhjpr$9±Q0° 9±M;²O999±#²-=I999°$¶,38>F$9°*°D9°A³6TU$901%2654'7#"&547&'#"546;254+532654#"#"&54732=4632+"32532654&#"2654'#"&'ÞRg‰,©o]hLJk3:H®Ð+C7R''#/Œ—x_mƒ¥)~YJ„†lV‚J,=(>#vÒX>i!#!"^D8+)8 :wX²?9UÑœQ4jLikJH50]i-08B.#NÕA`{¡vÔR9EW€¶Pj}JC_5"*FŸXþ¨5]º!" "pC/ ,;7).Yÿã3bly²3+±>é°U2²+°3´U++´]7+²] +³@]Y +°/´f++°k/´7+´Q3Y +´Q+´&%3Y +´&+°,/´E7+°m/°6Ö´;1+°;±A+´01+°0±+´S<+°S±"+°*2±Mé°H2²"M +³@"& +°M°c Ö´ 1+° /´c1+°M±W+±Zé°Z±`+´&+±n+±A;²839999±S²,E999°"²PU999° ±J99±Wc±k99°Z²f999°`µbh$9±kf± 99±>°9±Q]²S999±%³06AM$9°&´/;J`$9°,±BH99°E±9b9901#".5463267#"'#"546;2654+532654#"#"&547326=4632+"325332654'3254&#":K^^À‚5bFhDGC=G@p0B´Ð,MU$'"0ŒIN{\mƒ¥)~YJD@‹gT„J+=(>#]ëXA7Gd‰þ©\'j^-b3'•aï•<)138-0€.SUd/4@,!LbPd]~ wÒT9EVRWkaxKA[2!)@–Nþ²>PzO®;ýƒ $Yÿ"„3ka²+°<3´7+°I2²!+´d++² +³@h +² +²+° /´7+´`(!h +´`+´/.!h +´/++°5/´P7+°l/°Ö´&+°±@+´E<+°E±K+´9&+°9±#+´b<+°b±*+°32±Yé°T2²*Y +³@*/ +°Y±f+±ié°i±+´&+±m+±@°9°E°9°K²BLK,:&##\ìW>:~Q²>:TØþô|]^~Œ4znïnPŒT]i,') B.#NcKh_|UPrÔR9ES=G©]cBB%I_6")GŸXþ¨?SYþ¡„3u€ ²(+°F3´7+°S2²,+´n++²( +³@r +²+°/´v++°/´$7+´j3,r +´j+´:9,r +´:++°@/´Z7+°/°Ö´ &+° ±J+´O<+°O±U+´C&+°C±.+´l<+°l±5+°>2±cé°^2²5c +³@5: +°c±p+±sé°s±+´~+°~±+°x2´&+´ +±‚+±J °9°O°9°U²LFM999±l.³$@Z$9°5²3fn999°c±,`99±sp°*9±~¶ (&$9±v°x9°$³ ~$9°,² y{999±j²*.l999°3±0D99°9²CUc999°:· BJO`$9°@±V^99°Z²M99901%2654'7#"&547! '$47! 7#"'#"546767654'򂂮#"#"'&54732=47632#"#"'"3253264&#"ŠJeŽ0©2A_DB_ÄþöþÁÆþõx8eû·Œ¶q0G¯Ï,//3C7#.Œ“v_qB?¨'}'-O…HDeM>LK,:&##\ìW>ƒ)77)(89:~Q²>:TرvT9D`bBG^~Œ4znïnPŒT]i,') B.#NŸw_|UPrÔR9ES=G©kd=8%I_6")GŸXþ¨?Sþ«7R67('9Yþu„3v’Ó²)+°G3´7+°T2²-+´o++²) +³@s +²+°/´‚++°/´%7+³w%+´‹+´k4-s +´k+´;:-s +´;++°A/´[7+°“/°Ö´!&+°!±K+´P<+°P±V+´D&+°D±/+´m<+°m±6+°?2±dé°_2²6d +³@6; +°d±q+±té³tq+´+°t±Ž+´+°±z+´ˆ+°ˆ±+´&+°… Ö´ +±”+±K!°9°P°9°V²MGN999±m/³%A[$9°6²4go999°d±-a99±q°+9°t°9±z@  )'‚‹$9±%w@  z…‡Ž$9°-² |}999±k²+/m999°4±1E99°:²DVd999°;·!CKPa$9°A±W_99°[²N99901%2654'7#"'&547# '$47! 7#"'#"546767654'򂂮#"#"'&54732=47632#"#"'"32532654&"2654'#"&'ŠJeŽ0©Œ6FiKL45µõþÁÆþõx8eû·Œ¶q0G¯Ï,//3C7#.Œ“v_qB?¨'}'-O…HDeM>LK,:&##\ìW>l""0"!0B9*(: D:~Q²>:TØ»w]>Ki45K;^~Œ4znïnPŒT]i,') B.#NŸw_|UPrÔR9ES=G©kd=8%I_6")GŸXþ¨?Sþí"! "pB0 +:8(.DYÿòç2/ž²(+²+°3±é°,/°#3±é°2°0/°Ö´ 1+° ±+´1+°±(+´'&+°'± +´1+±1+± ² 999±(°9°'°9° ²999±(°9°,¶  $9°° 901%#"&54732=4632632'654&#"#4&#" x_l„¥2‡YJ„}Wo63kq¬)…cT0@ON6=@Ð`}£vÐV2D¥Wƒ¹^YUU wÒS97¹YrM3þšf5ItPYÿó?24AÀ²+²$+° 3±/é°52°Cx_l„¥2‡YJ„}ABB9O<.1#S­ƒmoXg‚H…þ¡_6OuOP`}£vÔR2B§Wƒ¹^X‚þ`L6'V:9OYÿÀ2DP²=+²+°03±é°H2²(+°!/´&++°N/´6++°A/°83´C+°2°Q/°Ö´ 1+° ±+´1+°±=+´<1+°<±3+´E+°E±J+´-+°-±)+´+±R+± ² 999±=°9°<°9±E3°9°Jµ!&0#86$9°-±+99±&!°#9°°$9±N@  )+-3DEJ$9±A6±99°° 901%#"&547326=4632632#"'732654'#"&5463&#"#4&#"3254'&#" x_l„¥2‡YJE?vUz*' Fpƒ§†SD9@g}„^\V[t_h=LQI5==Î72r'GUÐ`}£vÐV2D¥WƒY`^X[Y‚ ¦€‘Ì.@,£t½'<:k‚m]c‡ü]+=. þÿ$3jN]s65@d_~WOsÒT2D¥P@J³dj<4ÈNž9À¥+ Yþÿ22=J²+±D33´6++²+±,é° /´>++°/±é°K/°#Ö´(1+°(±.+´1+°±+±3é³H3+´ +° /´H+² H +³@  +°3±7+´1+°° Ö´A+°A/´+±L+±.(²%&999± ±699°±99±3H°<9°7² >E999±A°9±>³ AH$9±,°9±6¶#(./3$9°±&<99012##"&547#567654#"#"'&54732=476354'&'2654&'#錜^EB_¶/\Ac='&y^qB=¥2‡(/L„ZOè]?ü]+=)8. $ /9. þÿ*4D_aB3+$3jN]s65@d_~WOsÒT2D¥P@J³dj<4ÈO›;À¥+ ýu7)#55#'9YþÓ21<GX+²+°C3±+é°62²+²+° /´H++°Q/´=+°/±é°Y/°"Ö´'1+°'±-+´1+°± +´V+² V +³@  +°V±+±2é³F2+´T+°T/´F+°;2°2±@+´N+°N±6+´1+°2°´K+°K/±Z+±-'²$%999±V ³5$9±F° 9°2³=CHQ$9±N@° 9±K°9±=· @EKMTV$9°+°9°¶"'.25$9°±%;99012#"&547#567654#"#"'&54732=476354'&'2654&#"2654'#"&'錜--i–j/–/\Ac='&y^qB=¥2‡(/L„ZOè]?ü]+=!#""0C9*)8 B. þÿ3FKijJE4$3jN]s65@d_~WOsÒT2D¥P@J³dj<4ÈO›;À¥+ ý¹!"!0"pB/*:7)/BWÿ#;27–²,+´C+°/´7+°%/±é°8/°Ö´+°±/+´4<+°4±+´)&+°)±!+´ &+±9+±/±99±4´,12$9±!)°9±%· !)/4$9°±29901%26=47632#"'&547327654'&#"#"&547ãDL@A_w>3w‡ëÏ”˜g:]…}°¶vu$-TCDzao€©-„#)@hN^_=>eU€º–†ŒÌ¬…*x•«vpnn´ZAOpTP`y¢{ÉU5B£P>JWþi;2BLâ²7+´C+°/´C++°/´(7+°0/±é°M/°Ö´$+°$±:+´?<+°?±+´4&+°4±+´J+°J±,+°E2´ &+´+±N+±:$±!"99±?´(7<=$9±J°9°,³0$9±C³EJ$9°(±F99°7²GH999±0· $,4:?$9°±"=9901%26=47632#"&547#"'&547327654'&#"#"&547264&"ãDL@A_w>3‡4G^DB_KTÏ”˜g:]…}°¶vu$-TCDzao€©-„#)÷(88P89@hN^_=>eU€Ä† W:D_aB†ŒÌ¬…*x•«vpnn´ZAOpTP`y¢{ÉU5B£P>Jþl8P88('9Wþ@;2AL]²6+´C+°/´M++°V/´B+°/´'7+°//±é°^/°Ö´#+°#±9+´><+°>±+´3&+°3± +´[+°[±Y+´K+°K±E+´S+°S±++°P2´ &+´+±_+±9#± !99±>´'6;<$9±[3°9±KY°9°E´/MV$9°S°9±B´KP[$9°'µEHJRY$9°6°9±/· #+39>$9°±!<9901%26=47632"&547#"'&547327654'&#"#"&5472654&#"2654'#"&'ãDL@A_w>3Ž8Hk”j :CÏ”˜g:]…}°¶vu$-TCDzao€©-„#)á"#!!0C9*(: C@hN^_=>eU€Ë‡]@JjjJ †ŒÌ¬…*x•«vpnn´ZAOpTP`y¢{ÉU5B£P>Jþ³"" 2!pB/ *:8(.CYþ„Ž2"FP²A+°)3´4+°;/°.3´G+°#2°/°3´7+° /´++°Q/°Ö´1+°±>+´N+°N±+°J2´1+´8+°±1+´E+°E± +´+°& Ö´++±R+±>°9°N²999°³6;GL$9°8±4A99±&E¶ ().$9±4G¶&+18>DL$9°A°(9±°9° µ  $9°°9012'654&#"#"&54732=462654'7#"&=4#"#"&54632!2654'št€\H*„\M{w`l„¥2‡[H„qœ$2[%sMC>Np NH;CY^$9°@±*ÔC&a3T'8Yý›Ž2"NTcm²I+°)3´<+°2/´V+°]/´T+°C/´d+°#2°d´Q++°/°3´7+° /´++°n/°Ö´1+°±F+´k+°k±+°g2´1+´@+°±9+´M+°b2°M´5+°5/°M±`+°72´R+°R±O+´Z+°Z± +°X2´+°& Ö´++° ´/+±o+±F°9°k²999°³>Cdi$9°@±iKJ65.þeõL+,:8-+I!m@AVW€€LFÚEGþ]3O,+þ+N]PXÒ!"0"!/D;)(: CwKj65JC4º($\9%&%$9R"<6zX99tVG"Oi?<9?lyßýà2cO99Pbý¡" "pC/*;8(.DYÿB-=FT'²+´++² +³@ +°/´J+°Q/´++´!9 +°B3´!++°2°>/°(3´7+°42°U/°1Ö´,+°,±$+´7+²$7 +³@$! +°7±+°:2´&+°A2°±+±Gé°G±C+´<+°±+´ <+° ´&+°/±V+±$,³./45$9°7°99±G±>99°C°Q9°±J99°±N99±QJ³GN$9°°9±!°/9°9±".99°>³$,17$9012!!3#".5476326=!5#5654'&#"&547623546"!54&327654&#"gmŒþW9RdMm'SL1T46 °.ýqõL+,:8-+I!m@A¬€€‘pOaUX-b09h+5-|gyßýÜ~F72: F3<º((X9%&%$9R"<6zW99tUH!Of}GcO99Pbý  Yÿ?.?H[F²+´.++°7/´P+°L/°V3´<++°2²L< +³@LZ +° /°,3´"++°D2´ +°/°@3´7+°'2°\/°Ö´+°± +´ +² +³@ +° ±+°#2±.é°C2°.±9+´N&+°N±[+´Z+°Z±E+´,<+°,±/+°2´2&+±]+± ²999° °"9±N9°'9°[±<@99°Z²(P>999±,E²VW999°/±T99±LP±999°<°>9± .°9±" °9°³  $9°±0199012675!5#5654'&#"&547632354762!!3+"546326"!54&4&#"327674&"#@+E /ýzõL+,:8-+I!m@AVW€€LFÚEGþ]3Orc} ùS7[#‰N]PX5H¡L1,*4&C5$/<º($\9%&%$9R"<6zX99tVG"Oi?<9?lyßýÙwF</889ÿcO99PbýŠ'=("\þ„>.(LU*²,+°03´E+°<2²E, +³@EA +°/´ +²  +³@ +°/°3´'+°Q2´+°M/°3´7+°!2°V/°Ö´+°±+´%+²% +³@ +°%±+°2± é°P2° ±)+´H+°H±A+´@+°R Ö´1+°@± +°92´1+´4+±W+±³!"$9°%°'9±AH´,JKM$9±@R°.9± ³067<$9± °9±'°9°M³%$9014632!!3!5#5654&"&5476234632632'654&#"#54&#"&"!54&h’miFHþ_1Pý*ôLVtUI!mA>¬A@~¤aMUQN//y X=2%C+0:\'w]O\PXPey8>hŒtÑýï´)[9HH6P":4xU:587UF!þBPkCD67MŠ93)l4C0ææ.H4j'29+^O88O^\þ„R.(NWc‘²,+°/3´G+°?2²G, +³@GC +°6/°M3´[+´¬A@~}bML!'°z"(F5?F< !;a=. /=Ru„O\PXÔ N 00Pey8>hŒtÑýï´)[9HH6P":4xU:587UF!þBOl::rWH27N;?T!Oäç ,J2l"56.^O88O^ý, .f4\ýöG.(_ht¿²5+°93´)+°X2²)5 +³@)\ +°B/´G+°P/°/3´l+°/´ +²  +³@ +°/°3´'+°d2´+°`/°3´7+°!2°u/°Ö´+°±+´%+²% +³@ +°%±+°2± é°c2³1 +´,+° ±\+´[+°[±e+°D2´1+³ie+´S+°S/´i+°±n+´N+°N± +´1+°°? Ö´J+°J/´?+±v+±³!"$9°%°'9±\ µ)./5`$9°[°79±eS±9X99±i³EPVl$9°n²BGr999°N±;L99±GB°D9°P°E9°l°.9°)@ ,1;?JLNSr$9°5°79± °9±'°9°`³%$9014632!!3!5#5654&"&547623"&547632632#"'732654'#"&5467&#"#54&"!54&3254'&#"h’miFHþ_1Pý*ôLVtUI!mA>¬A@~·0>Pr00OI!'O‚$O()sW<2&+@RL w4?B6AZ=,(O\PXg >%2Pey8>hŒtÑýï´)[9HH6P":4xU:587UF!þÀJ3l&46ŒP7722R 9:S^Š#4eFp !¤S9:`Méé"+%^O88O^ý%1\4$>Zÿ*Ò CK²'+´++²+±:33´/++°D2°/´!++´)?' +°H3´)+°2°)´*+°L/°Ö´+°±6+´1+°1±,+´=+²,= +³@,) +°=±'+°@2´1+°G2°±I+´1+°±%+°2´ &+±M+±°9°6°9±,1²34:999°=°?9±'±99°I²!999±)°49±?*°39°/µ,16=$9°² 999012!!3#"&# '&47!23276=!5#5654&"&5476323546"!54ül‹þX8O‚YÊÉþÏ¿íA<6ש­²QvýxõLVvUI nB>WV€€‘½šbUtc‡g»ýð|+l‡`s%bLûuYT ª'!W5FC5N!95sT62hTE JdsD[K77MZþ7× MU`l²1+´++²!+±D33´9++°N2°/´V++°/´+++´3I1! +°R3´3+°2°3´4+°a/°Ö´$+°$±@+´;+°;±6+´G+²6G +³@63 +°G±1+°J2´1+°Q2°±S+´1+° Ö´^+°±/+°2´ &+°2° ´Y+°Y/±b+±$°!9°@°"9±6;²=>D999°G°I9±1±(99°³+N$9±^S°9±/³V[\$9°Y° 9±V³Y^$9°+² [\999±3°>9±I4°=9°9µ$6;@G$9°!² "999012!!3#"&547#"&# '&47!23276=!5#5654&"&5476323546"!542654&"ül‹þX8OGL`CB_2IÉþÏ¿íA<6ש­²QvýxõLVvUI nB>WV€€‘½šbU’(87R7:tc‡g»ýð[01XC`aB.%l‡`s%bLûuYT ª'!W5FC5N!95sT62hTE JdsD[K77Mý8()77)&:ZþÒ NVbs¤²2+´++²"+±E33´:++°O2°/´c++°l/´W+°/´,++´4J2" +°S3´4+°2°4´5+°t/° Ö´%+°%±A+´<+°<±7+´H+²7H +³@74 +°H±2+°K2´1+°R2°±T+´1+³qT+´+°/´q+³`T+´o+°o/´`+°±Z+´i+° 2°i±0+°2´ &+°2° ´f+°f/±u+±% °"9°A°#9±7<²>?E999°H°J9±2±)99°³,O$9°T°9±Z´W]cl$9±W·Z`fhoq$9°,± ]99±4°?9±J5°>9°:µ% 7WV€€‘½šbU{""""1B9)(: Btc‡g»ýðc/6cKi54K;.l‡`s%bLûuYT ª'!W5FC5N!95sT62hTE JdsD[K77MýV"" "oA0!*:8(/BWþïê-HR]+²)+°3²:+°M3´S7+°2° /´I++°/´7+°°4 Ö´Y++°//°%3´AC+°E2°^/°=Ö±[é´2+°[±V+´7<+°7±*+´)1+°)±+´P+°P±+±"K22´&+°2² +³@ +°´ +±_+±V[±4:99°7±/A99±)*°C9±P²999°´ %E$9° °9±:I± 99±S)°9°µ7=V[$9°Y°29°°9±/4²"C99901#"&547.'532654+53254&#"'4'&#"632#"&547632632264&"2654&"ê."PI<_DB_% v-=oKIqT;GhP4.:]t^I[dLX]IP‡xHB‘TAK°(88P89ýú&61R45Š)@ iU.2MD^`B=.S3*YGP-0>8þ’m8!‚_F]ILd‹kŠZ`NN'-ýX8P99('9 <',<:+(>WþÊê-GSdoh²(+°3²N+°93±é°e2²+° /´T++°]/´H+°/´7+°°3 Ö´k++°./°$3´@C+°D2°p/°<Ö±mé´1+°m±h+´6<+°6±)+´(1+°(±+´b+°b±`+´Q+°Q±K+´Z+°Z±+±!W22´&+°2² +³@ +°´ +±q+±hm±3999°6±.@99±()°B9±b²999±Q`° 9°K´$DT]$9°Z° 9°±99±NHµ WY`b$9±(°9°µ68þ’m8!‚_F]ILd‹kŠZ`NN'-ý¤"! "pB0+:7)/C-<',<:+(>Yÿò¾.*3:GRß²$+± 33´H7+±922°N/±533´B7+± /22°;/°+3±é°2°S/°'Ö´Q+° Ö´>&+°Q±L+°C2´7&+°.2°7±4+°02´1+° 2°±+´&+±T+±>Q°)9°L³;$H$9°7²"F999°4± 99±±99±NH³"'$9°B°)9°;±>99°°901463263232#"'53254+#"'#"&547&%"354&5#32"6;547&265'5#"f`DQ#vSm6QfSQ#bs,cav'cIQJ=¢3BíDDíxuþŠ#476 K#-&6I˜@VFFuUWMUa J k`p‹QQbO['©O66Lô¶ª+!C &AþV5%[3.jYÿóÆ.3=DQ^² +± 33´R++±C22°/´+°Z/±?33´LC+±<22°E/°73´*7+°.2°_/°#Ö´\+°' Ö´H&+°\±X+±MU22´A&+°;2°A±>+°42´1+°22°±+°2´<+°2² +³@ +±`+±\'°%9±XH³*E R$9°A²,P999°>±.99±± 99°°9±R ° 9°² 999°³#U\$9°Z°9°L°%9°E²',H999012#"'5324+53254+#"'#"&547&54632632'4&#"35#32"6;547&26545'5#">5S''‹:#;@*61/*xÄv'cIQG:`CW&qU65QC37 ììwuþ‰$386 K3&1L4+A 3jCH>&!÷PP`PY)XAUFF:9W6P)+5]·²-#C $EþN6 X_-AZÿ1­2?HP]gV²+´(7+²&+°#/´ ++°=/°93´^7+°I2³.^=+°;3´/++°d/±4M33´XC+±D22°@/´ ++°2° ´Q+°h/°&Ö°2´&+°T2° Ö´f+°±Y+°a2´D&+°N2°D±L+°E2´61+°2²6L +³@6! +°6±++°22´<+°2²+ +³@+. +±i+±f&°9±Y¶(=QV^$9°D² ;\999°L± 999±+6±)99°°9± °%9±.=±+99±/^°9°d²f999°X±V99°@²T\999°Q° 9017467&5463263232#!"3!!"&463!254+53254+#"'#"&"354&26=#"6;547&265'5#"Z)7\>T(oMme„118+ýÌ(:bŠýiG\_D%-+3,.9ZiUt%hBP§.BâE+5;à’!1%"4 P"6(xì 8 M:KDA\In@ C,A%!CEH€N2'A")UjAAN@:,*:þ¹D7{O&-=þ² =@HYÿÀ.5>ER_j²+´D++²!+±Vé°/´i++°c/´7+°]/±@33´MC+±:22°F/°63±,é°02°k/°%Ö´S+°) Ö´I&+°S±[+± N22´B&+±9e22°B±?+±;`22´1+°42°±+´&+±l+±IS°'9°[²,FV999°B³.QY$9°?µ0ci$9°°9±ci± 99±]Dµ%SY$9°M°'9°F±)I99°,°.9012#"'&547632654&+#"'#"'&547&54632632'"354&5#32"6;547&3265/5#"4&#"32Xaw§L>S@.?H>R£>8,Äv' B+J+(J1+°B2²\> +³@\X +°>´U&+°U/°>±4+´3&+°3±%+°,2´&+°2²% +³@%( +±s+±o±OP99°k±R99±`H± L99°\³E Jd$9°U±@<99°>± 899±34°9°%³ $9±X!·%BUjko$9±m(³@H`$9°Y±P99±LR¶,>J\^$9° ° 901%#"547632632632#"'53254+53254&#"'4&#"#"#"&547&#"6324+53254'3276264&"šPJ¦ofžŠ8-W†A4T>G%MaMJ"Kfs9*‚S7E[OP;KKPgGhjs LvR` UBN^a "XWŒ%@&" þ$/+J.-£O_ô›YQJK+2O%%! nDLIN[HU.9<9þp5@5@Zb@TŽu]6=pF_]IEK> <”E5A-?P54(*>Zþíw.]h{…­²<+²+±Nc33´|++±,x22²(+°"/´^++°1/´27+°l Ö´m++°1° Ö±[é°U/±8A33´ 7+± 22°†/°Ö´ƒ<+°ƒ±+´+°±Q+´t+°t±p+´G1+°K2²pG +³@pl +°G´i&+°i/°G±=+´<&+°<±&+´f+°f±.+±5`22´&+°2². +³@.1 +°.´+±‡+±ƒ±XY99°±[99±tQ± U99°p³N Sx$9°i±IE99°G± A99±<=°9±f&²()*999°.³,"8$9°±99±^±&99±|<±)99°l¶*.Kƒ$9±1³IQt$9°m±Y99±U[¶5GSpr$9° ° 901%#"547632632632#"'&547'53254+53254&#"'4&#"#"#"&547&#"632264&#"4+53254'3276264&"šPJ¦ofžŠ8-W†A4T>G%MF9^EC/0'(^fs@1‚S7E[OP;KKPgGhjs LvR` UBN-(88()79þXa "XWŒ%@&" þ$/+J.-£O_ô›YQJK+2O%%! nP(1JD_02A>.[#N[HU.9<9þp5@5@Zb@TŽu]6=pF_þF8P87)'9]IEK> <”E5A-?P54(*>ZþÊw.^j{Ž˜Û²=+²+±Oe33´++±-‹22²(+°#/´k++°t/´_+°2/´37+° Ö´€++°2°” Ö±\é°V/±9B33´ 7+± 22°™/°Ö´–<+°–±’+´+°±R+´‡+°‡±ƒ+´H1+°L2²ƒH +³@ƒ +°H´|&+°|/°H±>+´=&+³&=>+´y+°=±w+´h+°h±b+´q+°q±/+±6n22´&+°2²/ +³@/2 +°/´+±š+±–±YZ99°’±\99±‡R± V99°ƒ³O T‹$9°|±JF99°H± B99±=>°9°y²*+(999±bhµ-#9kt$9±/±99±_µ&npwy$9±=±*99°¶+/L’–$9±”2³JR‡$9°€±Z99±V\¶6HTƒ…$9° ° 901%#"547632632632#"&547&'53254+53254&#"'4&#"#"#"&547&#"6322654&#"2654'#"&'4+53254'3276264&"šPJ¦ofžŠ8-W†A4T>G%MM=45KJk1(|fs9*‚S7E[OP;KKPgGhjs LvR` UBN#$"!0B9*)8 Dþsa "XWŒ%@&" þ$/+J.-£O_ô›YQJK+2O%%! nX$6RL45kJG4`(N[HU.9<9þp5@5@Zb@TŽu]6=pF_þ“#" "pB0+:7).D€IEK> <”E5A-?P54(*>Zþùa '2ϲ+± -33´++°2² +³@ +°/´(++´ +±é°3/°$Ö´+°±+°2´&+´0+²0 +³@ +°±+´ 1+° 2° ´++°+/±4+±$°"9°²!999°0±99±²(-999± +° 9±(± 99±²"$99901233##"&547!5!2654&"&5476264&#"®Lm8âP&#_DB_"þG0KC^D N 9;Z)77)(78plKL*Ýýà,8E^`C7-CG/.?A.M35ýÌ7R78('9ZþÒa &1B²-+±é°2²+° 3´++² +³@ +°/´2++°;/´'+´- +±é°C/°#Ö´+°±+´&+°/2³@+´+°/´@+²@ +³@ +°´>+°>/°±*+´8+°8±+´ 1+° 2° ´5+°5/±D+±#°!9°² 999±@±99±>°9°*±2;99°8°9± 5° 9±-'µ 57>@$9±²!#99901233#"&547!5!2654&"&54762654&#"2654'#"&'®Lm8âP3/j–h/þ6G0KC^D N 9;F!"!"0C8+)9 DplKL*Ýýà5EKijJG3CG/.?A.M35þ" 2"pB0 +97(.DZÿ/a $¬² +°"3´ ++°2² +³@  +°/´$++´  +±é°%/°Ö´&+°±+´+² +³@ +³@ +°±!+°2´1+±&+±°9°²$999°± 99°!°#9±$°9± ²99901%33!57!5!2654&#"&5476325#d6ãPþçýöG.KC-.DP 9:NHn­=ÆÄ\%Ýý)¨CH.,@A-O55eþiŒŒZþ$a +/9ø²+°-3´++°2² +³@ +° /´0++°6/±,é°,´++°2´) +±)é°:/°%Ö´ &+° ±+°2´+´8+²8 +³@ +³@ +°±,+°2´1+° 2°´3+°3/±;+± %°#9°²")/999°8±99°°9°,´ .056$9±3°9±60± 99±,°9±²#%99901%33##"&547#57!5!2654&#"&5476325#2654&"d6ãP&%`CB_$ÃçýöG.KC-.DP 9:NHn­=Ư)78P89Ä\%Ýý,;CaaC:-)¨CH.,@A-O55eþiŒŒþô7)(77P8Zþa ,0;L=²+°.3´++°2² +³@ +° /´<++°E/´2+°/±733´0++´* +±*é°M/°&Ö´!&+°!±+´+³J+´+°/´J+²J +³@ +³@ +°°: Ö´H+°H/´:+°±4+´B+°B±-+°2´1+° 2°´?+°?/±N+±!&°$9°²#*999°°09°J±99±H°9±4:³/ /´H+³WH>+´*+° /´ +°2² +³@  +°/´7+°]/°Ö´+³@+´E+°E/´@+°±;+´K+²;K +³@;6 +°K±+´0+°0±+´&+°42² +³@ +°±' +´Z+°Z±+´1+°°! Ö´S+°S/´!+±^+±E°C9±@²>B999°;²=H999°K²M999±0°N9±°9±Zµ$+-PW$9°S°U9±>7·0!CEKSZ$9°W°U9± ²99901233!5!264&#"&5464632#"&5>;&#"!532654&"&546323&2654'&#"«Lm7áPüùH.LC/0CO s|tXWwO?4MK> !5?O*þ,¡,(6*CN62LQ#*$!+&ug–(Ðýð@FZ=;. Keý¿Xt€YD][3@UTAL"&5+%%5HE17))6(# 2#"2WýÿŠ gqÒ°0/´-+°*/´4+°M/°?3´N+°e2´K+´m+°U/´`+°G/´+° /´ +°2² +³@  +°/´7+°r/°\Ö´W+³,W\+´2+°2/´,+²,2 +³@,. +°W±+´+°±R+´c+²Rc +³@RM +°c±+´I+²I +³@IL +°I±+´&+² +³@ +³B+´k+°±+´1+³=+´o+°o/´=+³9+´&+±s+±,\°Z9°W±*499°°Y9°²U`999°R°9°c°e9°±99°I°f9±B°9±k±G99°o²)?E999°±#599±*-°29±Um@ &=9IRBY\cko$9°`²;hq999°G±#E99± ²99901233!5!264&#"&54764632#!"3!!"543!27654'#"&5467&#"!532654&#"#&5476323&%"3254'«Ml7áPüùH/KC//DO 99UiN*(0@RfLýð$$·ýA__).3l+71'!‰Bþ=™("C =(*-.LJ)%6 ug–(Ðýð@FZ=;. L22ýßLa RALg8;WV.&1. „?-.C sR$0 8 -A,$ _#5:+ Wþ› t~"²p+´K+°./´++°'/´2+°R/°D3´S+°j2´z+´P+³9SR+´:+°Z/´e+°@ Ö´+° /´ +°2² +³@  +°/´7+°/°bÖ´]+³)]b+´0+°0/´)+°]±+´+°±W+´h+²Wh +³@WR +°h±m+´N+²Nm +³@NQ +°N±+´&+² +³@ +°°x Ö´G+°G/´x+°±+´1+³B+´|+°|/´B+³=+°63´+°#2²= +³@=: +±€+±)b°`9°]±'299°°_9°²Ze999°W°9°h°j9±Nm²k999±G°9°°p9°x°K9°|±DI99°±@t99±=B±&399±²!,-999±'+°09±PR±#699±:z²!_`999°Z@ =BGNW]bhmx$9±e@°u9°°I9± ²99901233!5!264&#"&54762#!"3!!"543!2654+53254&##"&547&#"!532654&#"#&546323&54632"32=4«Ml7áPüùH/KC//DO 99¥=\%&.'ý}%%Ôý'^^ 1c.;Z"8GEþ:ž'!+ = P0/FIjM(-7 81)ug–(Ðýð@FZ=;. L22þM?3. 7)8:YV&0(‰?/b>4F +%! )9>-& 1Ka9+9? *Wýç½ fqyȲ'+´M+°2/´t+°x/´9+°U/°D3´V+±!l22´S+°]/´+° /´ +°2² +³@  +°/´7+°z/°dÖ´_+°_±+´+°±Z+´+²Z +³@ZU +°±$+´P+²P$ +³@PT +°P±G+°62´j+³jG+´&+°/´&+² +³@ +°G´r+°j±+´1+°n Ö´B+°±=+´.+±{+±_d°b9°°a9°²]999°Z°9°°!9°$±99°P°"9±G°9±j±'M99±nr·2D9glKtx$9±B²+@v999°°;9±xt°69°9°;9±]V@ $.=BGPadjn$9°²@gp999°M±+K99± ²99901233!5!264&#"&547623&54632#"'&54632654&'#"&54767&#"!532654&#"#&546"3254'&3254#"«Ml7áPüùH/KC//DO 99?8KW nY+-5 NX7>c++8J+j/*# x1> !5*;)GQ<þ»WþSŠ gp§²(+´O+²9+°./´@+°V/´W+±!o22°W´H+°V´T+°^/´+° /´ +°2² +³@  +°/´7+°q/°4Ö´;+°;±+´+°`2°´e+°e/°±[+´+°±$+´R+°R±+´&+² +³@ +³J+´m+°±+´1+°h Ö´F+³B+´,+±r+±;³89VW$9°e°9°°c9°[´]^b$9°²!999±R$²".@999±²TU999°m±(O99°h±HM99°°*9°F°D9±^W@ $,4;BFJRcehm$9°²Djk999°O±*M99± (°89± ²99901233!5!264&#"&547623&547632!".547673 54'#"5467&#"!532654&"&5464'#"32«Ml7áPüùH/KC//DO 99*<2/0GY,€þ~JwjG) %.:4evQU. id6,(3CBþ‘z', :=» G.1ug–(Ðýð@FZ=;. L22þ%:*$$1J23EƒÓ$:\=1*:_/?V,žD~m3JE3[)! -=[*Q<Wý©ƒ r{…²+´R+²<+°*/´|+°1/´C+°Y/´Z+±pz22°Z´K+°Y´W+°`/´k+° /´ +°2² +³@  +°/´7+°†/°7Ö´>+°>±+´+³c+´h+°h/´c+°±^+´n+²^n +³@^Y +°n±+´U+°U±+´&+² +³@ +³M+´x+°±-+´ƒ+°ƒ±+´1+³I+´s+°s/´I+³+°E3´'+°#2±‡+±>±;<99°h°9°c°f9±^³`ek$9°n²p999±U²1Cq999±M²WX999±-±R99±ƒx°/9°s´KPuz$9°²!*|999°I±G€99°°%9±1|³-'ƒ$9°C²/€999°K°%9±`Z@ 7>EI#UMfhnsx$9°k²Guv999°R±!P99± °;9± ²99901233!5!264&#"&54764632#"&547#".547673 54'#"5467&#"!53264&#"&546323&%4'#"32264&"«Ml7áPüùH/KC//DO 99{`GX,HHI42L?VJwjG)%/:4evQU/ id6,(3CAþz& :>-*<3 G/1,,<+*ug–(Ðýð@FZ=;. L22ýÛHgE„Z5!P4IK2 $:\=5&<_/?V,žC~m3JD4[) ,-=:*$&+Q<þã+<,,*Wý‰ƒ r{ƒ“?²+´R+²<+°*/´„+°/´‚+°1/´C+°Y/´Z+±pz22°Z´K+°Y´W+°`/´k+° /´ +°2² +³@  +°/´7+°”/°7Ö´>+°>±+´+³c+´h+°h/´c+°±^+´n+²^n +³@^Y +°n±+´U+°U±+´&+² +³@ +³M+´x+°‘2°x´-+°-/°±+´1+³I+´s+°s/´I+°I°Š Ö´|+°|/´Š+³E+´#+°‡ Ö´'+±•+±>±;<99°h°9°c°f9±^³`ek$9°n²p999±U²1Cq999±M²WX999±x²/R999°s·*KP~€‚„$9°±!Œ99±I|°G9°Š°%9±1‚·-'|€‡‰‘$9°C±/~99°K°%9±`Z@ 7>EI#UMfhnsx$9°k²Guv999°R±!P99± °;9± ²99901233!5!264&#"&54764632#"&547#".547673 54'#"5467&#"!53264&#"&546323&%4'#"324#"322654'"&'«Ml7áPüùH/KC//DO 99{`GX,VKR8:Q6?JwjG)%/:4evQU/ id6,(3CAþz& :>-*<3 G/1'+--+*$4+@+ 4ug–(Ðýð@FZ=;. L22ýÛHgE„a6%W9QP:'$:\=5&<_/?V,žC~m3JD4[) ,-=:*$&+Q<»,,-V3$!,* $3Zÿ0a.S^>°'/´$7+°/´-++°L/´M++±W22°M±7é°L´J+°/± é° °? Ö´\7+°B/±é°_/°*Ö´!&+°!±+´+°±Q+´&+²Q +³@QL +°±+´F&+°F±;+´T+°T±Y+´5+°5±1+´&+±`+±²-999°Q± 99°°9±F°9°;±JK99°T°9°Y³.7?$9°5±399±1±%&99±$°*9±M@ 15;FTY$9°\°39±? °901"#&546323&547632)"3!!"&5463!2654'#"'&54763&'#"!5!2654&3254'#"¤-D HrGC564—+UTpœF×þüü¡V2$Tû¢AYYA‚HUb®E*&21J0JQ;@;ý;*B:ÿ'#i2KZ3)F`..A?4MqIFgÕÜD!&FO>=JeNo<½72FI8713OU0)E**(2I*=lD&@Zÿ1.cp²'+´4++²2+°//´,++°\/´]+°2°]°g Ö´K++°\´Z+°;/±<é°/± é³C +°k3±é°R/´7+°q/°2Ö´)&+°)±+´+°±b+´&+²b +³@b\ +°±+´V&+°V±M+´d+°d±i+´H+°H±8+´#+°2°#´?&+°?/²?# +³@?; +±r+±²'4999°b± 99°°9±V°9°M±Z[99°d°9°i²JKO999°H³EF$9°?²&5C999±#8²!-.999±',°19±Z\±8#99±<;´!L$9°@ ?HMVbdi$9± ±NO9901"&5476323&547632632#!"3!!"&463!2654+53254'&#"#"&467&+"!5!276543254'"#"ÑZD H: FG]**J5ûðV2$†ûpBXYA),%"(1)QelJ(ON>@=ý;)#"À9(U1,6X3'D01\€2OqIGc#/CKD5IC!&EOzI!9J7*:Qjd’e%26MW1%?(**BwE Zÿ¨.R^hM²C+°13´D+± V22²C+´A+°/´b++°g/´#++°L/´7+³\L+´7+°9/±é°i/°Ö´N+°N±I+´+²I +³@IC +°± +´=+°=±4+´S+° Ö´_<+°S±X+´.+°.±(+´+±j+±N°Q9°I±P99°° 9±= ° 9°4±AB99±S±999±X_¶1V7\bg$9°.²,d999°(°&9±gb³_&d$9±DA°@9°L@  (.4=QSX$9°\±,Z99±97°901746323&547632#".547632654'&'#"&5463&#"!5!27654&"&%3254'&#"3254&#"ïpOI766ž.„HZM~!yB=WW‡1`GI,2>€ Y %I`ZV\w\ of@A =ýG/(&D`FKß81s&FV Z0LX+S·Nk22Ia%Gm®]2I8\S~žji;&51%[”VL^„`L†—\=\þy 2gr}Ÿ²A+´B++°Z2².+´m++²A+´?+²$+°/´s++° /´!++°I/´T7+³hTI+´5+°7/±aé°~/°Ö´+°±P+´K+°K±F+´X+²FX +³@FA +°X±]+´;+°;±1+´k+°k±+°52´{+°{±o+´++°+±v+°%2´+°f2±+±P±99°K°N9°F±MT99°X°Z9±;]² ![999°1±?@99°k±7a99°±.m99°{² hq999±+o²)d999°v³sx$9± s³u{$9°!± v99°.±x99±m?°>9±IB@ +%;1NPX]fko$9°h±)q99±75°d9°a°901"&547#".54767327654'&'#"&54763&#"!532654&"&5476323&547632"3254'&264&#"œ/?`†_šéˆØÂK:ýJý0NE`GJ 9:OH766,„GZN~ êþÐGRfp#ˆ(88()79JS7C_`B+Ak¨pSM1^$oBGc“[81N¼Q(/8Hiƒo\cDC9CDgG5D2DG./BD/O5522IX'Eh®]2H9ñ‘Z`L†—\=ýP7P98)'8\þP2hs~Õ²C+´D+°[2²0+´n++²C+´A+²&+°/´++°ˆ/´t+°/´#++°J/´U7+³iUJ+´7+°9/±bé°/°Ö´+°±Q+´L+°L±H+´Y+²HY +³@HC +°Y±^+´=+°=±3+´l+°l± +´+°±p+´-+³}-p+´‹+°‹/´}+°-±w+´…+°…±‚+°'2´+°g2±‘+±Q±99°L°O9°H±NU99°Y°[9±=^²#\999°3±AB99°l±9b99± ´ 07in$9±p‹°r9±-}¶+etzˆ$9±…w°9±t´ }‚$9°#´ w|„‹$9°0±z99±nA°@9±JD@ -'=3OQY^glp$9°i±+r99±97°e9°b°901#"'&547#".54767327654'&'#"&54763&#"!53264&"&5476323&547632"3254'&2654&#"2654'#"&'’3CiKH75 ‘ÒˆØÂK:L^BD/O5522I_&Cp®]2H9ñšc`L†—\=ý—!"!0"pB0 *:7(/CZÿ0È-R\doW²+´ +°/´++°"/°&3´X++°l2°f/´-++°J/´c+°_/´C+°?/°73´O+°2°p/°Ö°+2´1+°j2°L Ö´a+°±]+´F+°F±;+´:<+°:±4+´1+°2²4 +³@ +°´Z+°Z/°±+´+±q+±]¶ ACJ_c$9°F²&?O999°;±-n99°:±0Q99°4¶"$SVXe$9±Z³ $9± °9±fX¶+V$Z$9°-±S99°c²:;999°_³4FL$9°C°A9±O?°Q9012#!"3!%"543!2654'#"'#".54!2327654&#"#54&#"632#"546326"3254&%4#"32"32“Td•44PýêDD¾ý5‡‡$1EVP=d#=½0FA"#sÅA5qSR?T.8#%-uy`6,¬*FD)þ+6987- $]^=H«-^R1 ™Q00*)ChgF1W"*:F]`-!Š n27mTP6;5-0vQU??þ®#==$¡214z 2"Zÿ0ã-`jr}–²+´+°/´++°0/°43´f++°z2³$f0+´%+°t/´;++°X/´q+°m/´Q+°M/°E3´]+°2°~/°Ö°92´&+°x2°Z Ö´o+°±k+´T+°T±I+´H<+°H±B+´1+°-2²B +³@ +°´h+°h/°±!+°(2´ +° 2²! +³@!$ +±+±k¶OQXmq$9°T²4M]999°I±;|99°H±>_99°B¶02adfs$9±h±+99°!±99° ° 9±°9±$0±! 99±%f³ 29x$9°t´ (-dh$9°;²*+a999°q³HI$9°m³BTZ$9°Q°O9±]M°_9012#!"3!!"5463!2654+53254/#"'#".54!2327654&#"#54&#"632#"546326"3254&%4#"32"32“Td7/I 9)ýp;;çý~I5™&)$)9?!P=f!=½0FA"#sÅA5qSR?T.8#%-uy`6,¬*FD)þ+6987- $]^=H«-^R-"8+:5*@*+Ai/7,?0"6:F]`-!Š n27mTP6;5-0vQU??þ®#==$¡214z 2"Wÿè.IR^gqs²%+´m7+² +´J++° /´S++°Z/´++°p/´)+°A/´_+°d/´;+°7/°03´F7+°2°r/°CÖ´f+°' Ö´h&+°f±b+´>+°>±4+´31+³34+´\<+°3±.+´&+°2°´M+°M/°±+´+±s+±bh´;A_9d$9°>²%7F999°4±)m99°°H9±\3²*#o999°.· 0JPSZ$9±M²V999°°9±ZS³V\$9±m ±99±pJµ'#MPh$9°)°9±_A²43999°d³.C>$9°;°99°7°H9012#".547632654'#"&'#"54;27654#"#54#"632#"5463262654"2654'&#"2654#"327!"U` ÄlN%,1_GH,1A} .nT8/J W£×ÝòH:CvtP‘a.7D1sub&¸*Œ*2#;.(.QQþ !981)$­>þëk.fWF"óX… :'4.&3M”!6M6'p}€#)Elphdx$ ;/2EˆX_NNþ'=='ù %è$53?à zWÿê.IR[lu«²%+´t7+²!+´J++° /´c+°_/°g3´++°2²_ +³@_k +°n/´++°A/´S+°X/´;+°7/°03´F7+°2°v/°CÖ´Z+°' Ö´p&+°Z±V+´>+°>±4+´31+³a34+´&+°/´a&+°3±l+´k+°k±.+´&+°2°´M+°M/°±+´+±w+±Vp´;AS9X$9°>²%7F999°²+nt999±3a°H9°lµ,#P_m$9°k¶ !0Jc$9±M.±g99°²e999°°9±_c±99°°9±t!±99±nJµ'#MPp$9°+°9±SA²43999°X³.C>$9°;°99°7°H9012#"54632632654&'#"'#"5476?654#"#54#"632#"5463262654"%2654#".#"327&#"#"32U` ZlnaŽùS7\!LQ#0=2S9f W£×Q0rÜÅvtP‘`/6D1stc'¸*Œ*þ,!98ë4G tG6%CNÔ¬>,+­.fWF" „]‹NF.989J1K]þ3x,]óÜSr@6tP‘`.7C2sx_~8.}Ta[Iq¡ßK^Øo™'>;\~7.©)FG(þ/ 79.£à–´ûÍ0 89-kXQ0*C9Q3&YL…%E6@muos$ ?01B(þÓ [†DA6@muos$ ?01B„XeLLlWh1'B/ 6KÊ[1,LLþ (>>'h";:<õ@3h";:Wÿ'â-•¨±I°/´7+° /´++³L +´++°#/°'3´“++°§2°{/´R++³ŸR{+´-++°-°® Ö´j+°2°H/´œ+°˜/´C+°C°d Ö°A3´ª+°`/²7?Y333´o7+²sŠ222°²/°lÖ´¬+°P Ö´}&+°¬±°+´g+°g±]+´\1+°\±V+´v&+°v±‡+´š+°+ Ö´£&+°‡° Ö´&+°A2°š±–+´F+°F±;+´:<+°:±4+´1+° 2²4 +³@ +°´”+°”/°±+´+±³+±°}´djbª®$9°g±`o99°]³RL{$9°\°q9°V²Ssz999±š°J9±–´CH˜œ$9°F³' ?Š$9°;±-§99°:±0Œ99°4µ#%Ž‘ž$9±”³ $9± °9±{“@  +P%}‘”£$9±RŸ±Ž99°-±\]99±œ®³;:J$9°ª@ 4Fglv…‡V–š¬°$9°˜°E9°d°b9±`C°q9°o°Œ9012#!"3!!"5463!2654'#"'#"'&54!2327654&#"#54&#"632#"'!"'&54;2654&#"#54#"632#"54632632+"32767&546326"254%4#"32"32"3254­Td–44PþTT¨ýK•TA 2DVQ=e ?»]/M!sÅA4rSR?T-8E14Sþ"x,]óÜSr@6tP‘`.7C2sx_~8.}Ta[Iq¡ßK^Ùn˜)z`~6,Ç8)Šþ6978.¡$]^=HªûÕ0 89-^R/"™Q00.+Fm8;?1W"*:F]`CŠ n27mTP6;5Z9þº [†DA6@muos$ ?01B„XeLLlWh1'B/ 6LË RT??þ®$==Ä214z 2"A";:Wÿ'û-𣬶¿°/´++°/´+³Y+´Ž++°0/°43´ ++°µ2³$ 0+´%+°ˆ/´_++³®_ˆ+´:++°:°¼ Ö´w+°U/´©+°¤/´P+°P°q Ö°N3´¸+°m/²DLf333´|7+²€—222°À/°yÖ´º+°] Ö´Š&+°º±¾+´t+°t±j+´i1+°i±c+´ƒ&+°ƒ±+°82´&+°±2°” Ö´§+°±«+´S+°S±H+´G<+°G±A+´1+°-2²A +³@ +°´¡+°¡/°±!+°(2´ +° 2²! +³@!$ +±Á+±¾Š´qwo¸¼$9°t±m|99°j³_YˆŽ$9°i°~9°c²`€‡999±”°’9°§°W9±«µNPU¤©$9°S³4L—$9°H±:µ99°G±=™99°Aµ02›ž­$9±¡±+99°!±99° ° 9±°9±$ޱ! 99±% µ 28]б$9°ˆ²-ž¡999°®± (99°_°›9°:³*+ij$9±©¼´GHW$9°¸@ AStyƒc”§’«º¾$9°¤°R9°q°o9±mP°~9°|°™9012#!"3!%"5463!254+53254/#"'#"'&54!2327654&#"#54&#"632#"'!"'&54;2654&#"#54#"632#"54632632+"32767&546326"254&%"3254"32"3254­Sd9/G8)ý‹7UÌý&–Z<€'$+%)8@ P=f >»]/M!rÆB4qSS?T-7E06Sþ"x,]óÜSr@6tP‘`.7C2sx_~8.}Ta[Iq¡ßK^×o˜)y`€5+¬*Œ*ýô!67/¢$º=E«ûÖ0 89-^R+$9*:5+?,Ek2>',?0"=:F]`CŠ n18mTP7:5Z9þ» [†DA6@muos$ ?01B„XeLLlWh1'B/ 6KÈ RT??þ®#==#Ó432ß2"A";:Wÿ.ƒ˜¢¬µ)²$+°C3´¦7+² +´„++°$´x++° /´Ž++°”/´++°r/°¨3´I++±(*22°?/°a3´™+°²2°ž/°­3´9+°[2°W/².5P333´f7+²j€222°¶/°cÖ´°+°G Ö´t&+°°±´+´^+°^±T+´S1+°S±M+´m&+°m±&+´£+°£±œ+´<+°<±2+´11+³12+´–<+°1±,+´&+°2°´‡+°‡/°±+´+±·+±´t´[aY®²$9°^±Wf99°T³ICrx$9°S°h9°M²Jjq999±&m±|}99°£±A 99°œ´9?™7ž$9°<²$5€999°2°¦9°°‚9±–1²"*¨999°,@ .„‰‹Ž”$9±‡²‘999°°9±”޳‘–$9±x ±99±r„·&G"t‡‹£$9°I±‰99±™?µ12AST$9°ž@ ,M^cm|<°´$9°9±7Y99°W²h}‚999012#".547632654'#"'#"54763254#"#54#"632#"'!"'&54;2654&#"#54#"632#"54632632+"327676763262654#"2654&#"2654#"327"3254®V`ÃaF.8/`GI,2@~ ,lV8d!W£Öò; ÅusP“a.6B2<Zþ.x,]óÜSr@6tP‘`.7C2sx_~8.}Ta[Iq¡ßK^ßmš$A7[&·,HE*3!£c ]ý0 89.eXF"óR‚:%5/%0P”!6M]p}€‡lphdx$ :02E+þÍ [†DA6@muos$ ?01B„XeLLlWh1'B/ 7OÔX+'NNþ'=='ù%è$53&Ãz ";:WÿçB-x‚Œ•в>+²2+±"M33´|++°ƒ2°R Ö´++°/´X++°‰/°b3´G++°p Ö´’+°Ž/´j+°B/³)9_f$3´7+³u$2°–/°rÖ´+°V Ö´ &+°±”+´m+°m±c+´b1+°b±\+´&+°±†+´J<+°J±>+±=é°=±5+´y&+°y±+´.<+°.±%+´ &+±—+±” ´hjpŽ’$9°m±fu99°c³RX$9°b°w9°\²Y999±†·DEGMP‹$9°J±B99±=>°9±y5±999°³2+7$9°.±)99°%±"#99±>°#9±|´ JV†Œ$9°Xµ.5Py‹$9°‰±%E99°’° 9°G°9°Ž¶\mr”$9°j±h99°B³+7w$9°°9012+"32767>32632632'654'&#"#"&547&#"#4&#"632#"&'!"'&54;2654&#"#54#"632#"54632627654'2654&#""3254Ta[Iq¡ßK^Åh‘6“t†HBK.2fyž‹-l??Z$/K06\Vk(?XZc@Ux_H[aJK^ ƒþ†x,]óÜSr@6tP‘`.7C2sx_~8. >nouýÊT31*+5ý.0 89-lWh1'B/ *32632632#"&4632654'&#"#"&547&#"#4&#"632#"&'!"'&54;2654&#"#54#"632#"54632627654'264&#"2654&#""3254Ta[Iq¡ßK^Åh‘6“t†HBK.2fyžVF_DA`_BQ??Z$/K06\Vk(?XZc@Ux_H[aJK^ ƒþ†x,]óÜSr@6tP‘`.7C2sx_~8. >nouq)77)(78ü€T31*+5ý.0 89-lWh1'B/ *32632632"&54632654'&#"#"&547&#"#4&#"632#"&'!"'&54;2654&#"#54#"632#"54632627654'2654&#"2654'#"&'$2654&#""3254Ta[Iq¡ßK^Åh‘6“t†HBK.2fyž[Sj”khM W??Z$/K06\Vk(?XZc@Ux_H[aJK^ ƒþ†x,]óÜSr@6tP‘`.7C2sx_~8. >nouf"$"!^C9*)8 üÔT31*+5ý.0 89-lWh1'B/ *+°:/°33´I7+°M2°k/° Ö´+°±F+´^+°* Ö´g&+°^±b+´A+°A±7+´61+°6±0+´P&+°2°P´U+°U/°P±+´&+±l+±F± 99±bg´>D[`<$9°A²&:I999°7±,i99°6²K999°0¶$-!MRXd$9±PU±99±i&°9°eµ*$UX$9°,°9°`µ 67$9°[³0FPA$9°>°<9°:°K9°I°901# '&547327654'&'#"&'#"'&54;2654&#"#54#"632#"546326322654""3254#"32ËR]©wµþÿ›°^@Y–†á’j—AR9.N L®c-GóÚStA6sP’_-7B2sva7,~UaŠ*Œ)þ- 79/£ß”µq[›F1qúž…*zzÛo`&6xe#9Q0)YL…DA5Amuos$ ?02A„YdLLkX8û)>>(h";:<õ@3YþCz2[dmw~¬²0+°+3´}++°\2° /´n++°/´7+°y/´6++°N/´j+°e/´H+°D/°=3´S7+°W2°/°Ö´+°±P+´h+°4 Ö´{&+°h±l+´K+°K±A+´@1+°@± +´u+°u±:+´Z&+°(2°Z´_+°_/°Z±"+´&+°q Ö´+±€+±P±99±l{´HNejF$9°K²0DS999°A±6}99°@²U999° ³.7bx$9°u´+=W\$9°:°s9±Z_³ &n$9°q±r99±n³ qu$9°²rs999°0°9°}°9°yµ"(4._b$9°6°&9°jµ@A$9°e³:PZK$9°H°F9°D°U9°S°901#"&547# '&547327654'&'#"&'#"'&54;2654&#"#54#"632#"546326322654""3254264&"#"32ËR]kX_DB`BLþÿ›°^@Y–†á’j—AR9.N L®c-GóÚStA6sP’_-7B2sva7,~UaŠ*Œ)þ- 79(88P89ǣߔµq[xG.bE^aB& qúž…*zzÛo`&6xe#9Q0)YL…DA5Amuos$ ?02A„YdLLkX8û)>>(h";:<üç8P88('9$@3Yþz2\eny€‘ײ1+°,3´++°]2° /´++°Š/´o+°/´7+°{/´7++°O/´k+°f/´I+°E/°>3´T7+°X2°’/°Ö´+°±Q+´i+°5 Ö´}&+°i±m+´L+°L±B+´A1+°A±+´+°±+´x+°x±;+´[&+°)2°[´`+°`/°[±r +´‡+°‡±#+´&+°„ Ö´+±“+±Q±99±m}´IOfkG$9°L²1ET999°B±799°A²V999°²/8z999°³>Xc$9±x±],99±[`¶ 'ouŠ$9°‡°9±o·rw„†$9°±u99°1°9°°9°{µ#)5/`c$9°7°'9°kµAB$9°f³;Q[L$9°I°G9°E°V9°T°901#"'&547# '&547327654'&'#"&'#"'&54;2654&#"#54#"632#"546326322654""32542654&#"#"322654'#"&'ËR]vaiKH754=þÿ›°^@Y–†á’j—AR9.N L®c-GóÚStA6sP’_-7B2sva7,~UaŠ*Œ)þ- 79 "#""Á£ß”µ1B8*)9Dq[F3nKi54K3)qúž…*zzÛo`&6xe#9Q0)YL…DA5Amuos$ ?02A„YdLLkX8û)>>(h";:<ý-"" 2!Þ@3þ%A0!*;9(.CYþñ/Q\g1²+²,;W333´LC+±]22²L +³@LP +² +°/´R++°4/°#3´A7+±E22°h/°=Ö´8&+°8±0+´d&+°d±`+±(é°(±+´I&+°I±O+´1+³O+´Z+°±+´ &+°U Ö´+±i+±08±:;99°d°49°`´,%AC2$9°(±#E99±OI±99°°9±Z°9°U´ $9±R³UZ$9°L² :999°4@  (08=H`bd$9°A±C9901%3254'7#"'&547&'"'&=4'&#"#"'&547&#"&54763263232653264&#"2654'»4)~3–_M`CB0/-',ÀAI9:K!/F28PW4.z #T5/j2„AOŽ;11^i’YD.3P)77)(79üº/3bjÆ5UÍ­G2[Ç M0\D_0/DB0'M59\qN55 (GTIPND[™` JCVO2\¼oQd&&|awDZQ9^ý7R88)&:gBz[Mˆ?-=YþÌ/Q]nyf²+²,;X333´LC+±o22²L +³@LP +°/´^++°g/´R+°4/°#3´A7+±E22°z/°=Ö´8&+°8±0+´v&+°v±r+±(é°(±+´I&+°I±O+´1+°°l Ö´+°/´l+°±j+´[+°[±U+´d+° 2°d±+´ &+°a Ö´+±{+±08±:;99°v°49°r´,%AC2$9°(±#E99±OI±99±°9°l°9±U[µ^g$9±Rµacjl$9°L² :999°4@  (08=Hrtv$9°A±C9901%3254'7#"'&547&'"'&=4'&#"#"'&547&#"&547632632326532654&#"2654'#"&'2654'»4)~3–gViKH75B,ÀAI9:K!/F28PW4.z #T5/j2„AOŽ;11^i’YD.3P!##"1B8*)9DüÒ/3bjÆ5UÍ­G2[Ç©J5eKi54KW6M59\qN55 (GTIPND[™` JCVO2\¼oQd&&|awDZQ9^ý[!#!!pA0!*;9(.C(gBz[Mˆ?-=Yÿ2[fq-²+°3´L7+°U2²++°:3´g++²L +³@LP +°/´e++°_/´ ++°3/°"3±@é±D22°r/°<Ö´7+°7±/+´n&+°n±j+±'é°'±+´I&+³ I+±aé°I±O+´R&+°R±Y+´&+±s+±/7±9:99°n°39°j´+$@B1$9°'±"D99±OaµL _e$9°R±\99°Y´[$9±_e± 99±g±999±3L@$'/7Ö´9+°9±1+´x&+°x±t+±)é°)± +´K&+³ K +´a&+°K±Q+´T&+³lTQ+´m+°m/´l+°T±[+´&+±}+±19±;<99°x°59°t´-&BD3$9°)±$F99±ma²N 999°Q²c999±Tl°9°[¶]eh$9±^c± 99° °9±q±;99±5N@ !&)19>J[tvx$9°B±D]9901#"5463263267#"'#"'&=4&#"#"'&547&#"&54763263232653327654'"327.#"#54&%2654'jBTnyÑøS7`QR#0#3f!*,.XAFoO"-H28PW4.z$T60j0„APA'%nfIOQ=.?O3+c%zþ¯0ŸuG$'B8ýÞ/3bj/,˜^Ö”£.901J7?V*47WxLf &‘ETIPND[–cJCW˜L-]»nSg**8=e}?YR3\þ¤5PX+8»Dý¯=.&)%‹gBw^P…?-=Yÿ)2]h+²#+²4C333±Ué°2²#+´^++² +²+° /´C+°d~@YR3^þ¢4Q gBu`P…>.=Yþ|2gr}y²-+²'>M333±_é°2²-+´s++²+°/´h++°/´#C+°F/°53±Sé²W222°~/°Ö´+°±O+´J&+°J±B+´z1+°z±v+±:é°:±1+´\&+°\±b+´e&+°p2°e´+°/°e±+´&+³ +´k+°k/´ +±+±O±99±BJ±LM99°z°F9°v´>7SUD$9°:±5W99°1±#99±b\°-9±e±+99°k¶ )'$9±h³ jp$9°#±k99°-± m99°s°L9°_°+9°F@127:BJO[vxz$9°S´Ucd$901%2654'7#"&547# '$47!2767#"'#"'&=4&#"#"'&547&#"&54763263232653264&#"2654'µIS}3–¥f^EB_§ãþ޼þï[;Oü¢KÝc§b g$mZBCoN#-G16SM65z$T5.f/„APA&%nfJOQ=.AM31)77)(89üç/4chAsU©K2[Çàw(oE^`C ,Or+—…*t‡ÿ]=WLN9:WyLf 'FVGPGEa–cJCW”N/\¼nSg++8>d~@YR3^þ¢4Qþ}8R78(':ygBu`P…>.=Yþi2iu†‘¤²/+²)@O333±aé°2²/+´‡++²+°/´v++°/´j+°/´%C+°H/°73±Ué²Y222°’/°Ö´!+°!±Q+´L&+°L±D+´Ž1+°Ž±Š+±<é°<±3+´^&+°^±d+´g&+°g°„ Ö´+°/´„+°g±‚+´s+°s±m+´|+°|±+°y2´&+´ +±“+±Q!±99±DL±NO99°Ž°H9°Š´@9UWF$9°<±7Y99°3±%99±d^°/9±g±-99±ms@  )+v$9±j³ y„$9°%´ms{‚$9°/± p99°‡°N9°a°-9°H@!349Li54L.Oq,—…*t‡ÿ]=VLN9:WyLf 'FVGPGEa–cJCW”N/\¼nSg++8>d~@YR3^þ¢4QþÚ#! "oB0*;8(/C‹gBu`P…>.=Wþó>-LWcm=²9+²J+±-^33´d7+±P22²+°/´X++°j/´D++°>/±$433´7+± 22°n/°Ö±lé°l±g+´G1+°G±9+±8é°8±0+´M&+°M±T+´)<+° Ö´a+°)±[+° 2´+°2±o+±l±AB99°g±DJ99°G±>99±89°9±M0±499°µ &-2PV$9±aT± $99±[)´X^$9±JX´[a$9±d9°9°j· )0BGMT$9°D°9°>³&2V$9°° 90174632632632#"'&47632654'&#"#"&547&#"#4'&#"632#"&%327654'2654&#"2654&"Wž‚‡FBJ.2gyžNH^DC0//0C I>@Y"!.L08[Yf~(@WZ91;V>7_HZ_LWcÃ=78pt|)67()78ü¡)43T55錸NN&&ªyžO0WD_0/ˆ/0C‰\BE %‘D`CJb¦]A8þp9#GA[F^HLd]De<0=rcRýÓ7)(87)'9<+,;:X<WþÌ?-MXct~²:+²K+±._33´u7+±Q22°/´d++°m/´Z+°{/´E++°?/±%533´7+± 22°/°Ö±}é°}±x+´H1+°H±:+±9é°9±1+´N&+°N±U+´*<+°b2³r*U+´+°/´r+°*´p+°p/°*±\+´j+°2°j±!+´&+°2°´g+°g/±€+±}±BC99°x±EK99°H±?99±9:°9±N1±599°µ '.3QW$9±rU°%9°p° 9±\*¶Y_dm$9±KZµgipr$9±u:±99°{·!*1HNUC$9°E°9°?³'3W$9°° 90174632632632#"'&547632654'&#"#"&547&#"#4'&#"632#"&%327654'2654&#"2654'#"&'2654&"Wž‚‡FBJ.2gyžNOiKH7545KG>@Y"!.L08[Yf~(@WZ91;V>7_HZ_LWcÃ=78ptW2!##<1B9*)9 Bü³)43T55錸NN&&ªyªJ6`Ki54KL45>“\BE %‘D`CJb¦]A8þp9#GA[F^HLd]De<0=rcRþ!#!‘A0 +:9(/B*<+,;:X<Wÿóà.FNY4²+°53´++°2²+´O7+°*/´M+°U/´A+°;/±$133´7+± 22°Z/°Ö±Wé°W±R+´D&+°D±6+±5é°5±-+´K+°K±G+´(&+°(± +´&+²  +³@  +°±+´&+±[+±W±>?99°R±A99°D±;99±56° 9±K-± 199°G² */999°(²$&999± °9±M*²DRW999°U´ (?$9°A²-GK999°;³ '/I$9°² 99901"&547632632632335!27654'&#"#"&547&#"#4'&#"6324'322654&" \ZIPƒŽ<6£;:0SrLGJËLý-K4559YFQKHPRA^Y5/=W<6^GW]xMSQOý<)22R43 ˆn‡[cRR#"[VvoTÝýáC:;K[AGI¦edOWIB8þp:"HBZF]ILdSK/3Gz“<+,==+,<Wþ÷à.PZbm©²'+±B33´(++°2²+´c7+²(' +³@( +°!/´Q++´7a +´7++´Ni +´N+°H/±0>33´ 7+± 22°n/°Ö±ké°k±f+´&+°±C+±Bé°B±:+´_+°_±[+´4&+°4±,+´&+³X,+´$+°$/´X+²$X +³@$' +°±+´&+°2°´T+°T/±o+±k±KL99°f±N99°± H99±BC° 9±_:± >99°[²7<999°4²02999±,$°&9°X°9°°V9°²!QU999±T°9±Q³$TX$9°'±UV99±a7²fk999°i²,L999°N´4:[_$9°H³ 2<]$9° °901%#"54763263263233##"&547!5!2654'&#"#"&547&#"#4'&#"632264&"4'322654&"µ]K¶IPƒŽ<6£;:0SqMGJËL$$_EB_#þOJj59YBRFDPNA^Y5/=W<6^GW‡)77R68þ¹KRPMý>)22R43£Ldö‡[cRR#"[UsqVÝýà-9E^aB8.CvJ[AGBfNifLiCB8þp:"HBZF]þN7R77)'9þ[-2Vt‹<+,==+,<WþÔã.P[ct²'+±B33´(++°2²+´u7+²W+´C+°!/´d++°m/´Q+°7/´b++°{/´N+°H/±0>33´ 7+± 22°€/°Ö±}é°}±x+´&+°±C+±Bé°B±:+´`+°`±\+´4+°4±$+´r+²$r +³@$' +°r±,+°p2´&+´Z+°±T+´j+°j±+´&+°2°´g+°g/±+±}±KL99°x±N99°± H99±BC° 9±`:± >99°\²7<999°4²02999±r$°&9±Z,±!99±T³QWdm$9°j° 9±g°9±Q·$TYgipr$9±b7²x}999°{²,L999°N´4:\`$9°H³ 2<^$9° ²99901%#"54763263263233#"'&547!5!2654'&#"#"&547&#"#4'&#"6322654&#"4'322654'#"&'2654&"µ]K¶IPƒŽ<6£;:0SqMGJËL+.k”55.þeJj59Y@QEDPNA^Y5/=W<6^GWx!#!!þ¹JRPLa0C:)(; Cü )22R43£Ldö‡[cRR#"[UsqVÝýá6BJk67HE2CvJ[AGAgNghFkCB8þp:"HBZF]þ›"!2"±\,2VtþSB0!)<9'.D"<+,==+,<Wÿà.Zbnyˆ²J+±-33²+´o7+°J´++°/2²J +³@ +°/´c++°i/´'++´>a +´>++´Uu +´U+°O/±7E33´7+± 22°z/°Ö±wé°w±r+´X&+°X±J+±Ié°I±A+´_+°_±[+´;+°# Ö±lé°;±3+´&+²3 +³@3. +°±+°,2´&+±{+±w±RS99°r±U99°X±O99±IJ° 9±_A± E99°[² >C999°#°99°;±799±3l°i9°²c999°±*f99±ic±#*99±a>²Xrw999°u²3S999°U´;A[_$9°O³ 9C]$9°° 901"&54763263263233##".5476326=5!2654'&#"#"&547&#"#4'&#"6324'322654&#"%2654&" \ZIPƒŽ<6£;:0SqMGJËLSJn4eKO.5C€"ýyJj59Y?QDCNKA^Y5/=W<6^GW]uJPNLü#?Z&$@Yül)22R43 ˆn‡[cRR#"[UsqVÝýá|C<:(:-$3<CvJ[AG@iLhdJlBB8þp:"HBZF]ILdE\,2Vrþô<+,==+,<Wÿòá.aow‚œ²9+°S3´:++°2²+°%3´x7+°b2²9+´7+°I/´v++°~/´_+°i/´,++°Y/²0BO333´ 7+² 222°ƒ/°Ö±€é°€±{+´&+°±T+±Sé°S±K+´t+°t±p+´F+°F±>+´&+²> +³@>9 +°±+´3+²3 +³@38 +°3±(+´l+°l±e+´"+±„+±€±\]99°{±_99°± Y99±ST° 9±tK± O99°p³HIM$9°F²BD999±>°9±3°9±el´%,0.$9±vI³({€$9°~¶3>"el]$9°_µFKgpt$9±,i°.9°Y³ DMr$9° °901%#"5476326326323&547632#"&547632&#"!5!2654'&#""&547&#"#4'&#"6322654'&#"%4'322654&"µ]K¶IPƒŽ<6£;:0SqMGJâ-ZX~…WWr]Sh58^=lgƒF #üÓJj59Y?PŠNMA]Y5/=W<6^GW`9J!<:G!üïJPNLý?)22R43£Ldö‡[cRR#"[UsrUHj‰YVba…gŒ€Pa@AIŒjr; 2CvJ[AGBgOjeNlBB8þp:"HBZF]°W=9>Y?7)+ü\,2VuŠ<+,==+,<Wÿ0k.y„Ž™ ²l+²+´7+°& Ö´4+°./±+é°O/´Q+°2°Q° Ö´?+°`/´ˆ+°•/´w+°z/´D+°q/²FYg333´ 7+² 222°š/°Ö±—é°—±’+´&+°±l+±ké°k±c+´…+°1 Ö±(é²(1 +³@(, +°…±Š+´]&+°]±U+´&+²U +³@UO +°±+´J+²J +³@JN +°J±A+´}+°}±+´=+°=±9+´!+±›+±—±tu99°’±w99°± q99±kl° 9±…1± g99°(±`e99°Šµ&4_ˆŒ$9°]²Y[999±U°9±J°9±}A±F99°±?D99°=³5%;$9±+.°09±&°19±O°M9±`Q±’—99°ˆ²!9999°•µ=A}u$9°w·JU]c…Š$9°z±;ƒ99°D°9°q³ [eŒ$9° °901%#"5476326326323&547632#!"3!!"&4763!27654'#"5463&#"!5%27654'&#""'&547&#"#4'&#"632%"3254'&3254'2654&"µ]K¶IPƒŽ<6£;:0Sm˜JÕ-„IY£Hé8;Yûê>&Õû6Q+)3<+'º±v]o`ECC2üáG768:UCUˆ()OA]Y5/=W<6^GWŠFUir%ûé*&MK 2ýÛ)22R43£Ldö‡[cRR#"˜l_MIMQ-zß[CH+KFf:6; 43а\r6:9a=]&8/.HU78CVF`./BYFB8þp:"HBZF]‹NCsF;0,=iX! GþË<+,==+,<Wÿ3„.˜¥°F²c+²t+´¦7+°c° Ö´+°/´++°G/´H+°‡2°H°‘ Ö´5+°W/°&3´œ+°(2°¬/´n+°0/°•3´++´<+°h/²>O^333´z7+²~‚222°±/°vÖ±®é°®±©+´q&+°q±c+±bé°b±Z+´™+° Ö´<+² +³@ +°™±ž+´S+°S±L+´…&+²L… +³@LG +°…±Š+´B+²BŠ +³@BF +°B±8+´Ž&+°Ž±“+´2+°2±#+°,2´+° 2²# +³@#( +±²+±®v±kl99°©±nt99°q±hz99±bc°|9±™±^~99°°\9°žµW€œ¢$9°S²OQ‚999±…L°‡9±Bаˆ9±Ž8±>99°“±5<99°2±099°#± 99°° 9±°9±t°9±‘G²E#999±WH²q©®999°œ° 9°¬µ28lvŽ“$9°nµ BL,…Š$9°0³ZS™ž$9±<±¡¢99°h²Q\|999°z°€90123232#!"3!!"&463!2654&+532654&+#"&54763&#"!5!2654&#"#"&547&#"#4'&#"632#"5476326326323&54763254'#"%3254'&'2654&"–LJBX88!!7û’FFØû8RO;}!S/ _ZQbA@Ok\DEC/üâHlsT=')@?TJA]Y5/=W<6^GW]K¶IPƒŽ<6£;:0Sm˜JÕ.XY†51n&=Xü*#J$ ýØ)22R43-<0)D[K8,+,2D?d871=*%37AaqiSN>=1=>Y9^%9`GSp>KG57dEPBB8þp:"HBZF]ILdö‡[cRR#"˜kbLGQtRSþÄ7FƒK;P&-Dq(&"!þÄ<+,==+,<Wÿd2z†˜£ø²P+±=l33´Q+±~22²+´™7+²P+´N+°(/´Š++°/´0++°a/´—++°Ÿ/´x+°„/´D+°r/²FZh333´ 7+² 222°¤/°Ö±¡é°¡±œ+´&+°±m+±lé°l±d+´•+°•±‘+´^+°^±V+´&+²V +³@VP +°±+´J&+²J +³@JO +°J±@+´{+°, Ö±‡é°{±€+´:+°:±5+´$+±¥+±¡±uv99°œ±x99°± r99±lm° 9±•d± h99°‘²af999°^²Z\999±V°9±J°9±{,±F99±€‡¶(=~D„Š$9°:² 8Œ999°5°39±Š³,‡3Œ$9±aQ±$599°—´@{œ¡$9°Ÿ¶:JV€v$9°x´^d‘•$9°„±8‚99±rD´ \f“$9° °901%#"5476326326323&54632#".547632654&'#"&54763&#"!5!27654'&#"#"&547&#"#4'&#"6323254'&#"3254&#"4'322654&"µ]K¶IPƒŽ<6£;:0SqMGJ¾/¦‚K}#xB?XW‡1_GH-1Jg[NC_ZV\;:^"lf>? 5üøJ5559Y@SCBQMA]Y5/=W<6^GWÖ82r& FU Y0MX,Rý"JPNLý?)22R43£Ldö‡[cRR#"[UsuUFu…²L9\U|œli:&4.([”Yƒ:Ff}i[aDC=ABe>;B0@<=J[AGAgJjeHlBB8þp:"HBZF]+7J‘Z?aþi#Ÿ\,2Vr<+,==+,<Yÿò.[dnu‹²:+²+± J33´t++±\v22°p/´++°|/´D++°D°e Ö´+C+°4/³$2?$3´T7+²PX222°€/°LÖ±~é°~±y+´G1+°G±:+±9é°9±.+´l+³l.+´r&+°l±h+´(&+°(± +´1+°±+´&+°2°´_+°_/±+±~L±AB99°y±DJ99°G±?P99±9:°R9°.°T9°°49°l°09±hr³+eVj$9°(²&X999° ±t99°°Z9°¶ \bo$9±_°9±pt·G _by~$9°²L}999°|°B9°e± 99±4D·(.Rhjl$9°T²&VZ999012#"&'#"'&54;2654&"#54&'"#"&547&#"#"#4'&#"632#"54763263263262654"2654'#"32%2654&"MPg=>Q:.N M­d-J÷ÚStDh?QQ@>(ÿ#:=$Œ@3<+,;:X<Yÿ0„4t~‡™²M+²]+´7+°M° Ö´+°/´ +°%/´++°°u Ö´ +°‰/´)+³–)‰+´W++°A/´€+°R/°G3´c++°c°k Ö±go33´:+°12°š/°_Ö±˜é°˜±“+´Z1+°Z±M+±Lé°L±C+´†+³'†C+´‹&+° 2°‹´+°/°†±‚+´>+°>±6+´51+°5±.+´s&+°2²s. +³@s +°s´x+°x/°s±+´+±›+±˜_±TU99°“±W]99°Z±Rc99±LM°e9°C°g9°'°G9±†°E9°‹±A99°‚´@i€„$9°>³%:<$9°6°)9°5°m9°.·#* ouz|ˆ$9±sx³$9± °9±‰u@ 'Z#x|‹“—˜$9°–³U_z$9±W)²56999±R€·>CE.ems„$9°:°<9°c°i901#"3!%"'&5463%2654'#"&'#"54?>54&#"#54&#""&547&#"#4'&#"632#"547632632632632264&#"$2654';22654&"íBUiPýöPP±ýB5(.S82EZT9/J QªØóÝ3V=E15@QQ@ 8JhJ6;-/[71eJ;lP75‹****þ4#A9²Ö­ˆ«üb)43T440 `GPf*+A30;F1[#+6I2'dt8).9G6A==E362DD26-"#;þp9$ Š]F]ILdö‡[bV[!!KM/.T1ï%6$$6%ê"46˜C3#<+,;:X<Yÿ/Ÿ4‚Œ•§Z²a+²q+´ž7+°a° Ö´ +°/´++°9/´›++°›°ƒ Ö´3+³&›9+´'+°—/´=+³¤=—+°T3´k++°2°. Ö´+°f/°[3´w++°w° Ö±{33´N+°E2°¨/°sÖ±¦é°¦±¡+´n1+°n±a+±`é°`±W+´”+°; Ö´™&+°2°™´+°/°”±+´R+°R±J+´I1+°I±B+´&+°02²B +³@ +°´†+°†/°±#+°*2´+° 2²# +³@#& +±©+±¦s±hi99°¡±kq99°n±fw99±`a°y9°W°{9°;°[9±”°Y9°™±U99°´ T}Ž’$9°R²NP999°J±9=99°I°9°B·37>ƒ‡Š–$9±†±.99°#³ !$9°°9±°9±q°9±ž3±#99±'ƒµ7;…™¦$9°—· *0n†Š¡¥$9°.²s‡ˆ999°¤°i9±=± ?99°k²IJ999°f·RWYBy’$9°N°P9°w°}90123#!"3!!"&463!254+53254'&##"'&'#"54?67654&#"#54&#""&547&#"#4'&#"632#"5476326326326264&"$2654';22654&"GRj ,2 %8)ýOOÙý:PQ9‹'%)%(9=T8.%$RªÙôÜK5GE15>QQ@ 3GdH2;-/[71eJ:œ**8++þ0$@8¯Õ¯Š ©üg)43T444aP0#-:5+?,*A8b;',?0!$,6I*dt @.9F7D@=E0<2HH2<*"#;þp9$ Š]F]ILdö‡[bV[!!KMþ/%6$%%æ$9:–C3#<+,;:X<Wÿòå-fr~Šd²V+°83²+²,H333´C+±o{22°…/´a7+°[/³$4>O$3´7+³ $2°‹/°Ö±ˆé°ˆ±‚+´d1+°d±V+±Ué°U±K+´w&+°w±s+´D<+°D±9+±8é°8±0+´k&+°k±g+±(é°(± +´&+±Œ+±ˆ±^_99°‚±a99°d±[99±UV° 9±wK°Q9°s´ HBM$9°D±>99±89°9±k0±499°g³,&2$9°(±$99° ±99±V°9°…@ 0D(Kgkdsw$9°a² _999°[· &2BMiu$9°± 9901"&547632632632632632'>54'&#"#"'&547&#"#4'&#"#"#"&547&#"#"#4'&#"632%4'3276%4'32762654&#"\^JP†…HAœ6A@OpKBœI53]o¨‹<5E>?\ p39WP:9y A`Y/-9n39WXiy%=UZ91;Y99_HZ_Gmv 8:ýZpt 9;ý*34),35 ‰m‡[bPP&&PP´o»]%€M]BD t‰[EMIH\˜b =6þl9! p[EMƒa›g C6þp9#DD[F^HLdí†SOŠ:288-?‡RS†<088,d9+*74,+:Wþóë-p|ˆ” §²`+°B3²+²6Rƒ333´•C+²'y‘222²+°!/´}++°›/´k7+°e/³.>HY$3´7+³ $2°¡/°Ö±žé°ž±˜+´n1+°n±`+±_é°_±U+´&+°±‰+´N<+°N±C+±Bé°B±:+´u&+°u±q+°$2±2é´†+°2±*+´&+°2°´€+°€/±¢+±ž±hi99°˜±k99°n±e99±_`° 9±U°[9°‰´ RLW$9°N±H99±BC°9±u:±>99°q³60<$9°†±.99±*2³(!}ƒ$9°€°9±}³$€†$9±•`°9°›@ :N2Uqun‰$9°k²*i999°e· 0?\ p39WP:9y A`Y/-9n39WXiy%=UZ91;Y99_HZ_Gmv 8:¤)79'(88üÞpt 9;ý*34),35 ‰m‡[bPP&&PP´o¤F0ZD_aBC`@Š]BD t‰[EMIH\˜b =6þl9! p[EMƒa›g C6þp9#DD[F^HLdí†SOŠ:288-þ•7)(88('9ª‡RS†<088,d9+*74,+:WþÊå-r~Š›§³÷²e+°G3²+±;W33´¨C+±{¤22²…+´+++°$/´‹++°”/´+°®/´p7+°j/³3CM^$3´ 7+³ $2°´/°Ö±±é°±±«+´1+°±e+±dé°d±Z+´ &+° ±œ+´S<+°S±H+±Gé°G±?+´w&+°w±s+±7é³™7s+´'+°'/´™+³ˆ7s+´—+°—/´ˆ+°7±‚+´‘+°2°‘±/+´&+° 2°´Ž+°Ž/±µ+±±±mn99°«±p99°± j99±de° 9± Z°`9°œ´ WQ\$9°S±M99±GH°9±w?±C99°'´;Au{$9°s°59±—™°39°ˆ°9±‚7¶+-$…‹”$9±…µ' Ž—™$9±+e°9±®¨@ 7?SZswœ $9°p²/n999°j· 5AQ\už$9° ±9901%#"547632632632632632#"&547632654'&#"#"'&547&#"#4'&#"#"#"&547&#"#"#4'&#"6324'32762654&#"2654'#"&'4'32762654&#"¼_LºJP†…HAœ6A@OpKBœI53]o¨VR45KJk54L P>?\ p39WP:9y A`Y/-9n39WXiy%=UZ91;Y99_HZèmv 8:‡"$"!0B9*)8 Düÿpt 9;ý*34),35£Ldö‡[bPP&&PP´o£Q7`L45kJK54H‰]BD t‰[EMIH\˜b =6þl9! p[EMƒa›g C6þp9#DD[F^ †SOŠ:288-þÜ"" "pB0+:7).DÓ‡RS†<088,d9+*74,+:YþïM.*5¼²0+´7+²+°/´+++° /±é°/´&7+°6/°#Ö°2´1+°±+´3+°3±.+°2´ +´1+°(2±7+±#°9±3² 999°.¶& $9° °)9±0+± 99°° 9° ²999±²#()99901";2#"'&547&'732654+"&54632&264&#"JA_yhÂSC_DD.0"yH1BB`ybWr‹fªY1D>)77)(89æ31N–Z/1SD^02@7-L5J31IPKSY]5JýK7R89('9YþÈM.*6Fø²1+±é²+°/´8++°@/´++° /±é°/´&7+°G/°#Ö°2´1+°±+´E+°E±C+´4+°4±.+´=+°=±:+°2´ +´1+°(2±H+±#°9±E°9°C± 99°4±&99°.¶78@$9±:=° 9° °)9±1+µ :>?XZ~h(87)'89þýaB.' QSmwSS¦w‰U,gC`Y>>>=ZW>?~þ…8()78(&:YþÔš.+:Ó²&+´++²+² +°/´,++°4/´ +°/´7+°;/°Ö´+°±+´8+°8±6+´)+°)±#+´1+°1±+°/2´+´ +±<+±°9°8°9±)6±99°#´,34$9°1° 9±& µ /168$9°° 9°±9901.5462#"&544&#"3262654&#"2654'"&'Ic¨î«tfkJIk-YX}~WX€z##!!/D:R9 C Ÿkv§§v‘U2pIllI=KX}}XW}}þÍ#! "pD.*=8(.DZþó 4:Cß²@+±&33´7+°22² +²+°/´<++° /´+7+°D/°(Ö´#+°#±+´/<+°/±5+±8é°8±+´B+°B±+°=2´&+´ +±E+±#²%&+999±5/°9°8°9±B°9°´ $9±@<± 99°± %99° ¶#(.$9°+²6799901%2654'7#"&547&'#"&=4&#"&5463232653264&"KY}(£dV0/DB`$R'9qm~H?M\„*žnfsNE:JTURP88P8=yW¥G;WÍ™Q/aA20aB8,=X„`hCd„[B8VÃ}¨“rUFQN;^þ¢8Qþù8P88('ZþÏ 49EU²+±%@33±1é°2² +²+°/´F++°N/´:+°/´*7+°V/°'Ö´"+°"±+´.<+°.±4+±7é°7±+´S+°S±Q+´C+°C±=+´K+°K±+°I2´&+´ +±W+±"²$%*999±4.°9°7°9±S°9±=CµFN$9°K° 9±:· =CIKQS$9°1± $99°¶"'-$9°*²5699901%2654'7#"&547&'#"&=4&#"&54632326532654&#"2654'#"&'KY}(£j\kJIk3E9qg„J=M\„*žnfsNE:JTUg!#! /D9*)9 C=yW¥G;WÍŸQ3jJjjJI42XehDc„[B8VÃ}¨“rUFQN;^þ¢8Q»!"! qC/#*>9(.DZÿ 3GRê²4+²&+° 3´B7+°2²B& +³@BG +°/´Q++°K/´7+°./´:7+°S/°6Ö´1+°1±)+´?<+°?±+´M1+°M±E+´1+°±+´ &+±T+±)1²34:999±M±&B99°E°9°³$KQ$9°µ  H$9±KQ±99±B&±399°.¶ $)16>$9°:° 901%327654'7#"'&54>3267#"'&'#"&=4'&#"&547632326534&#"32‹Y:M+'*¢myºN>R6L,E;M@66B81; +cˆ$$?M\%ž=Ctg92RA:MQ?_-a7($jÌ7N=9P®<?J=O/+„*ž:Bqhq“9KTÉ/4T$s,.M#HPFZ*$06Y$qXJFNW",E2Ö6M@9NžB:OÊoLSSS=>_bC\B=U•?7O¾tOU‰qRJ9Pü G5d/2=‡K79(AUCB(9N6_,1?}SnaL5X,"ææ .Zý½ 44mvk²_+°i3´T+°D/´n+°M/´e+°52°/°3´/7+°2°/´)7+°w/°%Ö´ +° ±+´-<+°W2°-´\+°\/°-±P+´c+°c±2+±é°±h+´k+³Gkh+´u+°k±+°82´ &+´=+°A2°=´q+°q/±x+± ²"#)999±P-µ/TYZ_$9±2²Me999±kh°K9°u²I999°@ 5 :;?Dnr$9±Mn³GAZr$9°e²?IY999°T¶8=KPW\b$9°_°:9°±#;99°/°"9°¶  %,$9°)² 3499901%327654'7#"'#"'&=4&#"&547632326532654'7#"&547&'#"&=4&#"&54632326=3264&"‹V8O.'}(£?Esv;9qn>?J=O/+„*ž:Bqhq“9KTÉ/4T$sCCI42K#7 PFZ*$06Y$qXJFNW",E2J,,<++Ö6M@9NžB:OÊoLSSS=>_bC\B=U•?7O¾tOU‰qRJ9Pü G5d/2=‡b7#M3JK23#$AUCB(9N6_,1?}SnaL5X,"ææ .Ô*<,,<*Zý¢ 4/go~ž²Y+°c3´N+°?/´p+°x/´n+°G/°j3´_+°02°/°3´*7+°2°/´$7+°/°!Ö´+°±+´(<+°Q2°(´V+°V/°(±J+´]+°]±-+±é°±b+´e+°e°| Ö´A+°A/´|+°e±h+´u+°u±+°32´ &+´8+°<2°8´s+°s/±€+±²$999±J(µ*NSTY$9±-²G_999±Ab°E9±|e±C99°h@  06?5lpw$9°±:>99±Gn¶A/±:K33´X+°a2°e/´k+°/°3´7+° 2°"/´.7+°t/°*Ö´%+°%±+°M2´2<+´H+°2±A+´U+°U±+±é°±[ +´^+°^±h+´r+°r±+´&+°°7 Ö´n&+°n/´7&+±u+±%³"'(.$9±A2³EJKQ$9°U±99±²>X999°^°<9±rh´ :a$9°n²e4999°°c9±X>±>PHU;M8\,1:N9:J&r&21#Ýè"(kD03C¯$.!7<Zýà 43s|… ²Z+°43´N+°y2²e+°>/´}+°G/°T3´a+°j2°n/´t+°/°3´7+° 2°"/´.7+°†/°*Ö´%+°%±+°V2´2<+´Q+°2±J+´^+°^±+±é°±d +´g+°g±A+°q2´„+´{+°„±+´&+°w Ö´7&+°;2°7´€+°€/±‡+±%³"'(.$9±J2³NSTZ$9°^±99±²Ga999°g°E9±„A² C999°{±j99°w¶>n4}‚$9°±9l99±G}³A;€ƒ$9°aµC9ES‚$9±tn´QV^Jl$9°N±7q99±Z°(9°°'9°"¶%*1$9°.²99901%2653327654'7#"'#"&=4&#"&5476322#"&547&'#"&54'&#"&547632326=3327#"&546264&#"264&"³:JT+,7M.)}(£BEpv;9qf…J=L]„*ž:BqgrW?EEEI42KO KGM :-2V q*+J],$"+EC+^+/?D2"!3;,,<**SI:Pþ°8%&?:NžB:OÊqLQSSwcbC\}W•?7O¾tOUŠpRSXFt<"P3JK2+ ->PHU;M8\,1:N9:J&r&21#Ýè"(kD03C¯$.!7<þ§*<--<*Zý£ 4/mv~Ö²T+°03´I+°s2²_+°:/´€+°‡/´}+°B/±Oy33´[+°d2°h/´n+°/°3´*7+°2°/´$7+°Ž/°!Ö´+°±+°Q2´(<+´L+°(±E+´X+°X±-+±é°±^ +´a+°a±k+´u+°{2³Œuk+´<+°99°u´:d‰$9°w@ 0 hnsy}€‡$9°q±9599°„°f9±B}µ<7‚„ŠŒ$9°[³>5@N$9±nh´LQXEf$9°I±3k99±T°9°*°9°¶ !'$9°$²./99901%32654'7#"'#"&=4&#"&54632326532"&547&'#"&54'&#"&54632326=3327#"&546264&#"4#"322654'#"&'‹V8JZ}(£‰nv;9qhƒJ=M\„*žnhq“9KTì>FNMRrR&@ KGM :-2V qVI],$"+EC+^+/?D2"!3W,--,PJ3 +! + Ö6MtSžB:OÊs›SSwcbC\|X•?7O¾yŸ‰qRJ9PýÚXE:)S9RR96)+>PHU;M8\,1:PqJ&r&21#Ýè"(kD03C¯$.!7<ø++-V3%"/,%Zþ 44;CK ²:+´D++°7/´B+°/°3´/7+°2°/´)7+°L/°%Ö´ +° ±+´-<+°-±2+±é³H2+´7+°7/´H+°±J+´@+°@±C+´6+°6±+´ &+±M+± ²"#)999±2-°9±H7°9±J²:BD999°@³ >$9°C° 9±DB±@H99°:°>9°°#9°/°"9°¶  %,$9°)² 3499901%327654'7#"'#"'&=4&#"&54763232653!54324'3'"654‹V8O.'}(£?Esv;9qn>?J=O/+„*ž:Bqhq“9KT+þ“¸µ=Ne›,,€Ö6M@9NžB:OÊoLSSS=>_bC\B=U•?7O¾tOU‰qRJ9Pýª§ÉÆl!']W÷L9kVZ@ZýÀ 44FNVbF²>+´O++°5/´W+°]/´N+°/°3´/7+°2°/´)7+°c/°%Ö´ +° ±+´-<+°-±2+±é°R2°´;+°;/°±8+´`+°`±U+´K+°K±Z+°G2´D+°@2°D±+´ &+±d+± ²"#)999±2-°9±;°9±`8²:MO999°U°>9°K¶5 IW]$9°Z° 9°D°B9±]W±D899°N³;AB:$9°O±KS99°>°I9°°#9°/°"9°¶  %,$9°)² 3499901%327654'7#"'#"'&=4&#"&54763232653"&547#5432#4'3'"6542654&#"‹V8O.'}(£?Esv;9qn>?J=O/+„*ž:Bqhq“9KT°2K ޏµ#INdš,,€0++++Ö6M@9NžB:OÊoLSSS=>_bC\B=U•?7O¾tOU‰qRJ9PûšK20#§Éƪ"13Jzl!']W÷M8kVZ@þ6*,-+Zý§ 4/AIQYhz²9+´J++°0/´Z+°b/´X+°T/´I+°/°3´*7+°2°/´$7+°i/°!Ö´+°±+´(<+°(±-+±é°M2°´6+°6/°±3+´f+°f±P+´F+°F±R+´_+°_±I +´<+°?2°<´]+°]/°<± +´ &+±j+±²$999±-(°9±6°9±f3°59°P´9JHVc$9°F@ 0DTXZb$9°R°a9°_° 9±<]°=9±TXµ?3]_df$9°I³6<=5$9°J±FN99°9°D9°°9°*°9°¶ !'$9°$²./99901%32654'7#"'#"&=4&#"&5463232653"&547#5432#4'3'"6544#"322654'"&'‹V8JZ}(£‰nv;9qhƒJ=M\„*žnhq“9KT«9S$~¸µ"%RNdš,,€U,--,*#3 ,@+ 4Ö6MtSžB:OÊs›SSwcbC\|X•?7O¾yŸ‰qRJ9PûR97'§Éƪ(68S“l!']W÷M8kVZ@þž,,-V4$!/+$4Zýì 44JR[c?²=+´U++°E/´^+°b/´5+°9/´Q+°/°3´/7+°2°/´)7+°d/°%Ö´ +° ±+´-<+°-±2+±é°Y2°´:+°:/³H2+´\+°±S+´O+°O±9+°K2´@+°@±+´ &+±e+± ²"#)999±2-°9±H:°9±S\¶=C5QU^b$9°O´ M`$9°9±7 99±b^°H9°5°79±UQ±OZ99°=°M9°°#9°/°"9°¶  %,$9°)² 3499901%327654'7#"'#"'&=4&#"&54763232653265!5432#"#"&54674'3'4#"63254#"‹V8O.'}(£?Esv;9qn>?J=O/+„*ž:Bqhq“9KTeV"þѹ±cQ3SH»Ib—s)!SR2K9Ö6M@9NžB:OÊoLSSS=>_bC\B=U•?7O¾tOU‰qRJ9PüL'4¢ÌÈ¥MY%$Æm '`U·@%CkVð\ÿ#§3BÓ² +±-33±:é°2² +° /´++°'/´27+°C/°Ö´+°±/+´*+°*±#+´7<+°7±=+´@<+°@±+´&+±D+±/°9°*°9°#²,-2999±=7²  999°@°9°³$9±: ±,99°'@ #*/6$9°2³>?$901%2654'7! 47!2767#"&'#"&=4&#"&5463232653´KYy&¢Ã˜þÈýH^@WxÍumD.0:k ,~bˆI>N[%žxuk:5QB:KSS=yW¥G:NÕþÞrYó—…'w~þP(#U3'ZƒahFaƒ\—C:X¾… OImUCTN;^þ¢8Q\þ|§3MX²++±&833±Eé°2°/´N++°/´!++°2/´=7+°Y/°Ö´+°±:+´5+°5±.+´B<+°B±H+´K<+°K±+´W+°W±Q+°2´ +°2±Z+±:°9°5°9°.²78=999±HB²!+999°K°)9±W°9°Q¶ $&$9±N³ QW$9°!±V99°+± T99°E±$799°2@ ).5:A$9°=³IJ$901%2654'7#"&547# 47!267#"&'#"&=4&#"&54632326532654&#"´KYy&¢z1C/0DB_ŒÊýO^@WqÀñI.0:k ,~bˆI>N[%žytk:5QB:KSSƒ(87)'9:=yW¥G:NÕÞxU8D/0`C)ó—…'w~þPFZ3'ZƒahFaƒ\—C:X¾„¡OImUCTN;^þ¢8Qþ9()79N:\þR§3KVf=²*+±%733±Cé°2°/´W++°_/´L+°/´ ++°1/´<7+°g/°Ö´+°±9+´4+°4±-+´@<+°@±F+´I<+°I±+´d+°d±O+´\+°\±+°Z2´&+´ +±h+±9°9°4°9°-²67<999±F@² *999°I°(9±d°9°O@ #%TW_$9°\° 9±L³ Zd$9° ´OT\b$9°*² QR999°C±#699°1@ (-49?$9°<³GH$901%2654'7#"&547# 47!267#"&'#"&=4&#"&54632326532654&"2654'#"&'´KYy&¢…4FiKJj ‡ªýO^@WqÀñI.0:k ,~bˆI>M\%žytgsQB:KSTk"#.#!/D9*(9 C=yW¥G:NÕçx]=JjjJ!ó—…'w~þPFZ3'ZƒahG`„[—C:X¾„¡“rUCTN;^þ¢7RþÈ"""!qC/ +=9'.D\þö3.DP\,²+±"W33±.é°92²+²+° /´Q++°?/´E7+°/°K3´'7+°2°]/°$Ö´+°±+´++°+±2+´51+°5±B+´N&+°N°Z Ö´+°/´Z+°N±H+±é³TH+´+±^+±²!"'999±2+°9°5°9±N°9°Z°99°H· ?EKQW$9°T°;9°°<9±Q³TZ$9°.±!99°?±+99°E²$999°²W–D:X¾… t:¬@W,.8Qþ?%‚b,dHKcþì=+)<9+*?þ9('9:&':\þÒ3.AMXhR²+°!3±-é°62²+²+° /´Y++°a/´N+°Q>,CE=K\ƒ&¡AEtµI@7''MqFa9..Œag@*89)(01S`+c7(%j.*RdDÇ•¬#B719h!NMÛeI^†Z ::QÅzQZþþSBP+,6PþŸ8GN>MIfFHfþì=+*;:*+>þP  Zÿ'Ë2MY²'+±#433´?C+°H2°/´++°/´O7+°T/°.3´++±922°Z/°Ö´+°±6+´1+°1±*+´<+°<±B+´E1+°E±+´W1+°W±J+´ 1+±[+±6°9°1°9°*²349999±B<²'999°E°%9±W°#9°J´H!Q$9±?'±!399°°%9°Oµ*16<$9°T´ +;K$9°²CD99901%"&54632! '&54767! 7#"'#"&=4&#"&54632326533275&2654&#"ÿE]bNf1'ªþþ®·¾ =64²¥,Už82ŠK@gdt@=JXƒ&¡}q¼LA6KPuJ¦FHV;;*(5ÓfGKdUEkÿ~†y|úUC0:EØpešTO{ghGa‡Y ::QÅ€¤þüUCSX9Tþš=FÒ"&G=+*>=*)!Zþ|Ë2Xdna²2+±.?33´JC+°S2°/´f++°/´*++°/´Z7+°_/°93´++±!D22°o/°Ö´&+°&±A+´<+°<±5+´G+°G±M+´P1+°P±+´b1+³mb+´+°/´m+°b±h+´+°U Ö´ 1+±p+±A&°!9°<°"9°5²>?D999±MG²2*999°P°09±m°9°b°.9°h@  SZ_,ej$9°U°\9±f³gm$9°*±h99°2± j99°J±,>99°°09°Zµ&50:EØpešTO{ghGa‡Y ::QÅ€¤þüUCSX9Tþš=FÒ"&G=+*>=*)!ý…9P88('ZþcË2Zfr„²3+±/@33´KC+°T2°/´t++°{/´g+°/´+++°/´[7+°a/°:3´++±!E22°‚/°Ö´&+°&±B+´=+°=±6+´H+°H±N+´Q1+°Q±+°2´d1+´€+°d±j+´x+°x±v+´+°³ +´W1+°W/´ 1+±ƒ+±B&°!9°=°"9°6²?@E999±NH²3+999°Q°19±€°9°d±/}99°j@  T[a-pst{$9°x±^99±g³v€$9°+´jpx~$9°3± m99°K±-?99°°19°[µ&6=BH$9°a´ 7GX$9°²"OP99901%"&54632"&547#".54>73 7#"'#"&=4&#"&5463232653326='2654&#"2654&#"2654'#"&'ÿE]dL__„5Hj”k ‰º|е~H",+6'#dµàŠUž82ŠK@gdt@=JXƒ&¡}q¼LA6KPuJUi E+;;*(53-#$"!\E9*(9 ÓfGKd‘té~\>JjjJ& Iq©l@h@4//1X5uªa-šTO{ghGa‡Y ::QÅ€¤þüUCSX9Tþš=Fpb)G=+*>=*+>ýü"""!pC.!+<9'-Wÿò’.8HS÷².+°$3²+°3´J7+°<2°O/´6++°E/±é°1/±!)33´7+± 22°T/°Ö±Ré°R±L+´&+°±.+±-é°-±%+´$1+°$±+´9&+°9±@+´1+±U+±R±3499°L±699°±199±-.° 9°%° 9°$°9±@9´!$9±OJ¶94@$9°6°B9±E°9°1± 9901%#"54632632632#"&54632&#"#4&#"#4#"632327654'&+"2654&#"±]Hµ ˆxB;s‰*A€ƒ´7:,+Wÿ 2JVa7²@+°63²+°)3´X7+°N2²+°/´C+°]/´H++°T/´0+°C/±2;33´7+± 22°b/°Ö±`é°`±Z+´&+°±@+±?é°?±7+´61+°6±,+´K+°K±P+´&+°&±"+´+±c+±`±EF99°Z±H99°±C99±?@° 9°7° 9°6°9±K,°9°Pµ)20$9°&±$99±°9°°9±]X@ "&,KFP$9±TH±$R99±C0² 99901%#"54632632632#"'7327654'#"&54763&#"#4&#"#4#"6323254'&#"2654&#"±]Hµ ˆzE3y{6;m›Lq€MU‰UD8@k?:‚^[Od=>X"c=NPN<;JU¦VpYš9/r&AYü–P32(*3£Jg÷‰¼QQQU… ¥‚`j.E*SJnÉ%8HiƒuV[GH?N=þ¡_;LL;þ¡_‡ŒWF`)6P—XAhË;*+>:,+WÿòJ/ep0²[+±,Q33²+°.3´g7+°32°7/±&é±!#22°/°3±Gé°l Ö´c++°^/±MV33´7+± 22°q/°Ö±oé°o±i+´&+°±[+±Zé°Z±R+´Q1+°Q±?+´&+°±5+°I2´*+°2±r+±o±`a99°i±c99°±^99±Z[° 9°R° 9°Q°9°?°09°°19°5·&.3:BM$9±g[°09°7±*199°&²io999°l³?a$9±c°9±^G² 99901%#"54632632632#"/&#"32?632#"'73254#"#"#"&54632323254'&#"#4&#"#4#"6322654&#"±]Hµ ˆxB;xo?4—WAMA."#. ,$*= \O1'_dT.DG//7=.1D^PK>=HU¦VpYÐP32(*3£Jg÷‰¼MMKL"+K.G'#3O K-(B..H'&I>þ¡_>JJ>þ¡_‡ŒWF`°;*+>:,+WþìJ/lxƒt²b+±6X33²+°s3´z7+°:2²,+°1/´m++°>/±&é±!#22°/°3±Né° Ö´j++°e/±T]33´7+± 22°„/°Ö±‚é°‚±|+´&+°±b+±aé°a±Y+´X1+°X±4+´v+°F Ö´&+°v±<+°P2´*+°2°p Ö´.+±…+±‚±gh99°|±j99°±e99±ab° 9°Y° 9°X°9±F4°79°v±8699±p@ &1:>AILTms$9±.<°,9±m±.499±zb°79°>±*899°&²|‚999°³Fh$9±j°9±eN² 99901%#"54632632632#"/&#"32?632#"&547'73254#"#"#"&54632323254'&#"#4&#"#4#"6322654&#"2654&#"±]Hµ ˆxB;xo?4—WAMA."#. ,$*<._CB_,'_dT.DG//7=.1D^PK>=HU¦VpYé(87)(89ünP32(*3£Jg÷‰¼MMKL"+K.G'#3N.DB``BC/ K-(B..H'&I>þ¡_>JJ>þ¡_‡ŒWF`þF8')77)'8 ;*+>:,+WþÈJ/cm}ˆ˜²K+±#A33²Y+´(7+²+°/´n++°v/´e+°//´C+°2° /° 3±8é°„ Ö´S++°N/±=F33´^7+±b22°‰/°[Ö±‡é°‡±+´V&+°V±K+±Jé°J±B+´A1+°A±!+´{+³2{!+´&+°{±g+´s+°s±*+±:q22´+°2´+±Š+±‡[±PQ99°±SY99°V±N^99±JK°`9°B°b9°A°9±2!²#%&999±{±lx99°g@  (,/5=djnv$9°s²8 999±*°9±Ye¶!iqsy{$9±(K²%~999°/²*&999°²V‡999°„³2Q[$9±N8²`99901>32#"&#"32632#"&547&'73254#"#"&546323254&#"#4&#"#4#"632#"546326322654&"2654'#"&'2654&#"šyDZA. ' #. * 0JC7iKJk9 .udT.DG/ * 7h4D^PK>=HU¦TrY]Hµ£…xB;xo2!#.#þ¡_>JJ>þ¡_‡ŠYF`FJg÷‹ºMMýM!!!’D. +=9'.D/;*+>:,+Yÿ-ë/y…c²C+°:3²S+´z7+² +° /´++°´+°"/±é°u2°o/°j3±,é³€,o+´L++°F/±6>33´[7+²_c222°†/° Ö´+°±W+±ƒé°ƒ±}+´O&+°O±C+±Bé°B±;+´:1+°:±*+´r&+°r± +°42´+°g2±‡+±W°9°ƒ²IJ999°}±LS99°O±F[99±BC°]9°;² _999°:°a9± rµ',6cj$9±°9°S°9±zC± 99±"´)Ox}ƒ$9°o²WJr999±L€± 99±F,²4ag999°[°901%2! '&476732767654#"#"#"&46323232654#"#4&"#4#"632#"'&547632632632#"/"#"323722654&#"{/AvG¬bþþþɪä89]Apª¼v¿X•D„A.0@C05"œD^QI|FW¦T<5\EY/.K_.&NRˆvB6•\=J;+9 6ü4'32()33¥R3Š4! VvW>=E)uyb•]: (e/QfP'RI>þ¡_>JJ>þ¡_‡GBZF`FJ43OCe‰\`MMKL")T5_l<)+><*+=YþFë/‰•¬²L+°C3²\+´Š7+²+° /´ƒ++°/´#++°#´+°+/±é°}2°w/°r3±5é³5w+´U++°O/±?G33´d7+²hl222°–/°Ö´+°±`+±“é°“±+´X&+°X±L+±Ké°K±D+´C1+°C±+´‰+°3 Ö´z&+°‰±)+°=2´+±o22°´…+°…/±—+±`°9°“²RS999°±U\99°X±Od99±KL°f9°D²#h999°C°j9±‰3°9°z° 9°)@ 05?lr‚ƒ†‡$9±ƒ³…ˆ$9±#±†‡99°\±&99±ŠL±)99±+´2X€“$9°w²`Sz999±U±99±O5²=jo999°d°901%2"'&547! '&476732767654#"#"#"&46323232654#"#4&"#4#"632#"'&547632632632#"/"#"32372264&"2654&#"{/APP/.Š./šþýþɪä89]Apª¼v¿X•D„A.0@C05"œD^QI|FW¦T<5\EY/.K_.&NRˆvB6 _y;+9 6UP77P9üÂ'32()33¥R3r80]B1001B-" VvW>=E)uyb•]: (e/QfP'RI>þ¡_>JJ>þ¡_‡GBZF`FJ43OCe‰\`MMKLPO5_ýä8P88Px<)+><*+=Yþë/u€›á²I+°@3²W+´‘7+²)+° /´++°‰/´v+°/´#++°#´+°//±sé°2°n/°–3±4é°4±ké°n´Q++°L/±54#"#"&463232654#"#4&"#4#"632#"&54632632632#"&#"3262654&"2654'#"&'2654&"{0@eSiKIk pþýеzE299]Ap©¼w„¨šUAA & 0@C0 ( "œD^QI|FW¦Sr\DZ_IZY¤„vB6 _y;+ 0  .L"#.#!/D8+(9 Cü³'32P43¥R3€74eJjkI7/ Fn©o\tG)uyb•]: (8(/QfP(RI>þ¡_>JI?þ¡_‡‰ZF`FKfŠmŒ¹MMKLPO4`,þ*"#"!pB/ +<9'.CÚ<)+><*+=Wþ†..5BOZ+°9/´F++°M/´@++³@M+°(3´P++°V/´+°/±.33´++±"22°[/°Ö±Yé°Y±S+´&+°±+±é°±2+´11+³C12+´<+°¢'|_QnPK°z®=>><°<=þ¢T9;))R;:Sý)23'(54êE<þ¸HF?TC./AGb넲HHGGQJpÇO:@ŸVnþ¸HUW<;;7+±:B22°]/°7Ö±[é°[±U+´0&+°0±%+±$é°$±+´1+°±+´F<+°F±L+±Oé°O±+´&+±^+±[7±*+99°U±-399°0±(:99±$%°<9°°>9°°@9°°B9±LF°9°O°9°² 999±I%±RS99°X·+07FU[$9°-³E$9° ±<@99°>²MN99901%2654'7#"'#"'&=4&#"#4&#"#4#"632#"'&54632632632326532654&#"LY}(£@Erx:7sgBALAnPK>=HU¦VpY]Ha.& ˆxB;xo?4fhuME;ITUúP32(*3=yW¥G;XÌwOWXX?>ghH`ˆþ¡_>JJ>þ¡_‡ŒWF`FJgOCe‰¼MMKO”uUFQM<^þ¢7R;*+>:,+Wþíû4Zcn^².+°$3²+±<_33±Ré°2² +²+°/´\++°j/´6++°)/±!133´G7+±CK22°o/°@Ö±mé°m±g+´9&+°9±.+±-é°-±%+´$1+°$±+´O<+°O±U+±Xé°X±+´b+°b±+°]2´&+´ +±p+±m@±3499°g±6<99°9±1C99±-.°E9°%°G9°$°I9°°K9±UO°9°X°9±b°9°¶ \_$9±\± 99±R.² de999°j·49@Ogm$9°6³N$9°)±EI99°G²VW99901%2654'7#"&547&'#"'&=4&#"#4&#"#4#"632#"'&5463263263232653264&"$2654&#"LY}(£g]/.FB`'X)7sgBALAnPK>=HU¦VpY]Ha.& ˆxB;xo?4fhuME;ITUVP88P8ùóP32(*3=yW¥G;XÌœQ+hB10aB<-@X?>ghH`ˆþ¡_>JJ>þ¡_‡ŒWF`FJgOCe‰¼MMKO”uUFQM<^þ¢7Rþó8P88('Ð;*+>:,+WþÍû4Wcs~²,+±"33²+±:^33±Oé°2² +°/´d++°l/´X+°z/´4++°'/±/33´D7+±@H22°/°=Ö±}é°}±w+´7&+°7±,+±+é°+±#+´"1+°"±+´L<+°L±R+±Ué°U±+´q+°q±o+´a+°a±[+´i+°i±+°g2´&+´ +±€+±}=±1299°w±4:99°7±/@99±+,°B9°#°D9°"°F9°°H9±RL°9°U°9±q°9±[aµdl$9°i° 9±Xµ gioq$9±O,² tu999°z·27=Lw}$9°4³K$9°'±BF99°D²ST99901%2654'7#"&547&'#"&=4&#"#4&#"#4#"632#"&54632632632326532654&#"2654'#"&'2654&#"LY}(£j^iKJj3E#7sgƒLAnPK>=HU¦TrY]H[Z£…xB;xo?4fhuME;ITUj###"0C8*(:CùÕP32(*3=yW¥G;XÌ O4kKjkJH64X~fhH`ˆþ¡_>JJ>þ¡_‡ŠYF`FJgŠm‹ºMMKO”uUFQM<^þ¢7R½##!!pB0 +<8(/C);*+>:,+Wþýû4hs~Y²(+²"4<333´c7+°2²M+´u7+°/´l++°r/´++°z/´G++°A/±0833±Ué² X\222°/°QÖ±}é°}±w+´J&+°J±=+±<é°<±5+´41+°4±++±`é³`++´i<+°`±f+´<+°±+´&+±€+±}Q±DE99°w±GM99°J±AU99±<=°W9°5±XY99°4°Z9°+°\9±fiµ(clr$9°°&9°´  n$9±rl±99±u(° 9±zc@ &+EJQ`w}$9°G²,_999°A±WZ99°U² gh99901%327654'7#"'&54>3267#"#"'#"&=4'&#"#4&"#4&#"632#"'&5476326 632326533254'&#"$2654&#"zT8Q-)x#b&ƒáaHaDZ2VKag0)9lBBnk{#'@5:,+Zÿ1¤3s}S²>+°43²'+±"N33±eé°n2° /±é°´ +°z/´H++°B/±/933±Vé³Z^$2°~/°Ö´+°±R+±}é°}±w+´K&+°K±>+±=é°=±5+´41+°4±*+´b<+°b±h+´k<+°k±q+´&+±+±R°9°}²EF999°w±HN99°K±BV99±=>°X9°5°Z9°4°\9°*² ^999±hb°'9°k°%9°q²"s999±'°9±e>±tu99°z·*FKRb%w}$9°Hµ+aq$9°B±X\99°V³ijs$901! '$'&54767! 767#"'#"&=4'&#"#4&#"#4&#"632#"'&5476326326323265332654'2654&#"þF`™€ÿœþŸþm~þù‚š#=68 —yüG—}YÏ“(Brky%(A9PN;:JVZLU:6[EZ^IY1)MS‡„5/…ƒ*/qhtJA;VZþ|¤3{…²F+°<3²/+±*V33±mé°v2° /´}++°/±&é°Œ/´P++°J/±7A33±^é³bf$2°/°Ö´ +° ±Z+±é°±‰+´S&+°S±F+±Eé°E±=+´<1+°<±2+´j<+°j±p+´s<+³ sp+´„+°s±+´+°±y +´&+±‘+±Z °9°²MN999°‰±PV99°S±J^99±EF°`9°=°b9°<°d9°2²&f999±pj°/9° °-9°s°9±„µ v{*$9±}³ ~„$9°&±99°/²#999±mF±†‡99°Œ·2NSZj-‰$9°Pµ 3iy$9°J±`d99°^³qr{$901#"&547! '$'&54767! 767#"'#"&=4'&#"#4&#"#4&#"632#"'&5476326326323265332654'264&#"2654&#"þF`¬^_CB` ¾þ.þm~þù‚š#=68 —yüG—}YÏ“(Brky%(A9PN;:JVZLU:6[EZ^IY1)MS‡„5/…ƒ*/qhtJA;VZþp¤3‚ާá²Q+°G3²<+±7`33±té°}2° /´++°—/´ƒ+°/±0é°0´+°¤/´Z++°L/±CU33±ié³em$2°¨/°Ö´(+°(±c+±§é°§±¡+´]&+°]±Q+±Pé°P±H+´G1+°G±?+´q<+°q±w+´z<+°z± +´œ+°œ±š+´Œ+°Œ±†+´”+°”±€+°’2´&+´+±©+±c(²#999°§²W X999°¡²Ze`999°]°U9°Q°f9°P°g9°H°i9°G°k9°?²0m999±wq°<9°z°:9±œ °9±Œš° 9°†¶}7‚—$9°”± 99±ƒ³ ’œ$9±0µ†Œ”š$9°<²-‰999±tQ±žŸ99°¤·?X]cq:¡§$9°Zµ(@p€$9°L³#$gk$9°i´ xy‚$901"&547! '.54>7!2>7#"'#"&=4&#"#4&#"#4&#"632#"&546 6326323265332654'2654&#"2654'#"&'2654&#"þF`†3Fj”k Âþþm~h¢ŒZ3 -"6(3X‡˜bG—¢¼°Wd=2(BrkyO?6;VWÿòG.[epW² +°3²+± .33´N7+°C2°V/´\7+³l\V+´(++°/²#a333´97+²5=222°q/°2Ö±oé°o±i+´+&+°+± +±é°±+´1+°±+´@+°@±G+´J1+°J±Y+´d&+°d±_+±é±r+±o2±%&99°i±(.99°+±#599± °79°°99°°;9°°=9±G@° 9°J° 9±dY°9°_²NV999°±QR99±N ±fg99°V´+@ io$9°l²2&999±(\³?R$9°´7;Y_d$9°9±HI99012#"'#"&=4&#"#4&#"#4#"632#"'&5463263263232765332767#"&5462654&"2654&#"„ZiNP„H?hfqM@:FPK>=HU¦VpY]H_0& ˆxB;xo?3màK<9%&Q>6A]61$($E[bH*::R34ù‡P32(*3.g†]eRQ{ihG^J;þ¡_>JJ>þ¡_‡ŒWF`FJgOCe‰¼MMKKþûU@W,.8Qþ?%G=`"dHKcþì=+*;9V>á;*+>:,+WþóB.cmw‚­²++°!3²s+±933´Y7+°N2²+²+° /´n++°a/´d7+³~da+´3++°&/².i333´D7+²@H222°ƒ/°=ֱ鰱{+´6&+°6±++±*é°*±"+´!1+°!±+´K+°K±R+´U1+°U±+´l&+°l°v Ö´+°/´v+°l±g+±é³qg+´ +±„+±=±0199°{±3999°6±.@99±*+°B9°"°D9°!°F9°°H9±RK°9°U°9±l°9°v°Y9°g· adjns$9± q±\]99±sn³ qu$9±Y+²xy999°a´6K{$9°~²=1999±3d³J]$9°&´BFgl$9°D±ST99014632#"&547&'#"&=4&#"#4&#"#4#"632#"'&5463263263232765332767#"&2654&"264&#"2654&#"×bK¾n]0/DB_zA?hfqM@9GPK>=HU¦VpY]Ha.& ˆxB;xo?3màK<9%&Q>6A]61$($E[ª*::R344(88('99ùzP32(*3€KcôºV-gA20aB4)JQ{ihG^K:þ¡_>JJ>þ¡_‡ŒWF`FJgOCe‰¼MMKKþûU@W,.8Qþ?%G=`"d=+*;9V>þ8P89N9;*+>:,+WþÐB.]grŒײ*+° 3²n+±833´U7+°L2²+²+° /´t++°{/´i+°[/´^7+³ˆ^[+´2++°%/²-c333´B7+²>F222°/°;Ö±‹é°‹±…+´5&+°5±*+±)é°)±!+´ 1+° ±+´I+°I±O+´R1+°R±+´f&+° Ö´€+³~f+´q+°f±k+´x+°x±a+±é³va+´ +±Ž+±‹;±/099°…±2899°5±->99±)*°@9°!°B9° °D9°°F9±OI°9°R°9±€°9±qf°U9°k@ [^cd st{$9°x°9±va°W9° °X9±ni· kqvx~€$9±U*²‚ƒ999°[´5I…‹$9°ˆ²;0999±2^³HX$9°%´@Daf$9°B±PQ99014632#"&547&'#"&=4&#"#4&#"#4#"632#"&54632632632326533267#"&2654&"2654&#"2654'#"&'$2654&#"×bK¾sciKIl(j9?hfqM@9GPK>=HU¦TrY]H[Z£…xB;xo?3màK<7MQnGYk J(E[ª*::R34 0#$" ^D:*(9 ùÔP32(*3€Kcô½W2pKikIA1 BQ{ihG^K:þ¡_>JJ>þ¡_‡ŠYF`FJgŠm‹ºMMKKþûU@WX:Qþ;H‚b+d=+*;9V>þi"""’C. +=9(/ä;*+>:,+Wÿ.3nyƒŽ’²*+²$4<333´c7+°m2²M+´…7+°/´}+°‚/´+°Š/´G++³oGŠ+´7+°0/²8At333´]7+² UY222°/°Qֱ鰱‡+´J&+°J±=+±<é°<±5+´41+°4±-+´`<+°`±+±zé°z±f+´i<+°i±+´w&+°w±+´&+±+±Q±DE99°‡±GM99°J±AU99±<=°W9°5°Y9°4°[9°-°]9±fz´*c}‚$9°i±(99°°9°w° 9°µ "$mr$9±‚}± 99±…*°"9±c³(J‡$9°Š³-EQ`$9°o°9°G±.99°0µW[_rw$9°]±gh9901#"'&547632#"'&54763267#"'&'#"&=4#"#4&"#4&#"632#"'&5476326326323265332'2654&"3254&#"$2654&#"ã F(D,,0/Jh.#'<ð±UOlQ8KOLk‚1AN>7@5vh„s4NPNvJU[KV:6Y]HZ1*NRˆ…5/„‚,.ÃU@:MS>9@­l*88P21þ){1‰6€ûmP32(*3+34EJ32bInof“«!E7 6Gh)0W~_c¨P2þš_;NN;þ¡_BGICYF`FJgRF_‰\d\]\XØ}?TL9Xþ¨>(%Ù=+)?<+*?þc#( —;*+>:,+Wþ„..7juz¨°;/´z+°x/´h+°c/±U\33´A+±EI22²cA +³@c` +°X2°/°*3´k++°q/´+°/±033´++± $22°{/°Ö±té°t±n+´&+°±+±é³y+´=+°=/´y+°±v+´8+°8±`+´_+°_±4+´31+°3±Y+´X+°X±-+´(&+°R Ö´M+±|+±t± 99°n±99°±99±y°f9°²;h999±8v±Ac99°`± 99°_°C9±34²"E\999±XY°G9°R¶$*0IO+P$9±z;°P9°x±=899°h²MRf999±Ac±CG99±k´+34$9°q² 999°±(-99°±"9901"#4#"632#"'&54632632632'654&#"#4&#"547632632632'654&#"#54#"#54#"6322654&#"4"2ê¢'|_QnPKcA2|65\U"VULN/*s#T91?EPMGd-= %/?þD)23'(54¢ffêE<þ±OF?TC./AGbOA[„²HHGGQJpÇO:@ŸVnþ±O;;::85M†=3+g5EMææNNææM<,A!9*):9R;þ«¢'|_QnPKW{#&E5>I<L[B3#!,Df+@ &/?A3>>65]Q&\R(«-;K üy)23'(54[2424êE<þ±OF?TC./AGbOA[„²HHGGQJpÇO:@ŸVnþ±O*A03DZJX?>;:==™2!Ldé9*):9R;þ«32#"'732654'&'#"'&5467&#"#54&#"#54#"632#"&5476326323254'#"2654&#"4#"3ê¢'|_QnPKTF%FT36Z52%*=N# p3D/;$0B1!"-Fd-? %0>B2>=56\T(YN¬: !1ý)23'(54#343êE<þ±OF?TC./AGbOA[„²HHGGQJpÇO:@ŸVnþ±O?>>ò2X5%@9*):9R;þnv:<Wÿò .)3<Gñ² +°3´3++²!+´>7+°C/´++° /±-33±é±%22°±6é°H/°#Ö±Fé°F±@+´&+°±+±é°± +´;1+°;±4+±/é°/±*+´1+±I+±F#±99°@²%!999°°9°°&9°°'9° °9°;°9°4±399°/°-9±C3µ#;@F$9±6²/4999° °'901263 !4&#"#4#"632#"546 >54'4#"62654&#"í@f<©ýØW=;DU¦U;6Y]Hµ 2jœ=(.UVG6)-ÓüFP32(*3.7,cþÓþÿV;RH<þ¡_„G@YF`FJg÷‰¼M"+þÀÊd?LYA+j29jº…“;*+>:,+Wþö .4>GR]W²M+´57+²,+´T7+²+±33´>++°/´H++°Y/´&++°/± 833±é±022°±Aé°^/°.Ö±\é°\±V+´)&+°)±+±é°±+´F1+°F±?+±:é³P:?+´+°/´P+°:±5+´1+° 2°´K+°K/±_+±\.±#$99°V²&0,999°)° 9°°19°°29°°9°F°9°±>A99°P±99°:°89°5²HM999±K° 9±,H³ KP$9±Y5µ).$FV\$9±A&²:?999°°2901263 ##"&547!4&#"#4#"632#"546 >54'4#"6264&#"2654&#"í@f<©%%`CB`%þøW=;DU¦U;6Y]Hµ 2jœ=(.UVG6)-Ób(77('99ü P32(*3.7,cþÓþÿ,;C`aB9.V;RH<þ¡_„G@YF`FJg÷‰¼M"+þÀÊd?LYA+j29jº…þl9P88(':;*+>:,+WþÔ¡.4=EQ`ks²++´b7+²+²L333´=++°/´R++°Z/´F+°g/´%++° /±833±0é±22°0±@é°l/°-Ö±jé°j±d+´(&+°(±+±é°±+´D1+°D±+´^+°^±>+±:é°\ Ö´O+°82°:±I+´W+°W±5 +´1+° 2°´U+°U/±m+±j-±"#99°d±%+99°(± 099±°29°°9°D°9±^²=@999±>\°9±:O´FLRZ$9°I°Y9±U° 9±+F· IOUW\^$9±g=µ(-#Ddj$9±@%²:>999° °2901263 ##"&547#4&#"#4#"632#"54632>54'4#"62654&#"2654'"&'2654&#"í@f<©+,jJIk,íW=;DU¦SsY]Hµ£…ˆ2k›=fEVGDHÓQ""""/C9R9 Dü"P31)*3.7,cþÓþÿ4CJklIE2V/°3±Gé°-/±.é°E/°63´ C+°2°Q/°Ö´+°# Ö´<+°±A+´N&+°N±J+´:<+°:±)+°22´1+°2²) +³@)- +±R+±A³&$9°N± E99°J³ >8C$9°:±699°)±'99°²999±°#9±G>²)999±.-´:AJN$9°E¶28CL$9° ° 901&547632632#!"3!!"&5463!254&+532654'&#"#"&547&#"2654' ?*$ŒZRpS9JTå²1+²"+´?++°/´N7+°S/´ 7+°/°*3´;C+°72°U/°3Ö´.&+°.±&+´I&+°I°K Ö´<+°/´K<+°I±B+±é°±+´&+±V+±.±0199±K&°*9°I°79°B@ "9(NPS$9°²;999±SN±99±?"°09°·&(.3E$9°;°9901%#"'&54763267654'&#"#"'&547&#"&5476326322654&'3254&#"ºt{ÀP>TA-CJ

[Ÿe DD[“I5[½=8®""cZþÔW>C{"%=A=•É $Wÿº-;GX²(+²+´<++²+°:/´O++°K/°S3´++²K +³@KW +°/°!3´2C+°.2°Y/°*Ö´%&+°%±+´F&+° Ö´M+°F±X+´W+°W±?+±é°± +´6&+±Z+±%±'(99±M°!9°F°.9°Xµ2!9€-:79U¢¹jEF'NO@SBEA>[Ÿe DD[“I5[½=8®""cZŠ»‘šDW>C{"%=A=•Ô%=,8%WÿòE-Q\g ²C+²+²&7333´]++°R2°/²-=H333´7+² 222°h/°Ö´ &+° ±+´f&+°f±`+±Né°N±C+±Bé°B±:+´[&+°[±U+±3é°3±)+´$&+±i+± ± 99°f±99°`³J$9°N±H99±BC°9±[:±>99°U´7/=<$9°3±- 99°)±&'99±]C±' 99°@  $)/3:NXc$9°±9901"&547&#"&547632632632632'654'&#"#"&547&"#4'&#"%2654&'!2654&' [h|!-W>=p1‹LW—M28Zw;=ŒN28[€PEŠ.l=>Y-9#59UZi{!V-3T4..(7%4;94:B/1@ýç3/±V33´]7+°f2°/²6EO333´ ++²222°o/°Ö´+°, Ö´#&+²#, +³@#' +°±Y+´m&+°m±i+´S&+°S±K+±Jé°J±A+´d+°d±`+´:&+°:±2+´+±p+±Y#³ /$9°m± 99°i´QVW[$9°S±O99±JK°9±dA±E99°`µ08>C$9°:±699± &°,9±]>²JK999°@ 28:AQSYbk$9° ±9901"&547632632632632#!"3!!"&5463!254'&#"#"&547&#"#4&#""&547&2654'!2654'PJcb,€>I‰<%+^v>5‘9(.[wFCüˆ$97&‘ûbEYYEsô76U`-2MK`g0'-V[:b.2˜`hÀ,1]aýý,1]aèfJz50MšZBQ""LL""TOm‹“' %DH@AKÖS?> NvI9AtOwK /þá/8 PtFI‰9.,WhLHtC,6W@@bMûò$<9&·û;DYcEø0II)( *¿"W/0JH00`:VV[:#3,1IJ./]Æ+14$d2ýÊ+/Z&8èfJ~6+MšZBR!!ON""[[IW)%DI?>N5*JM1"[UqG;?::MwO0.þÚ&,2o:G;>9:MqSþ»GfYKnqw$9°B²4< 999±qw±,499±yF° 9±b@  $8BI^h|‚$9°±9901"&547&#"&547632632632632#"'&54>3267654'&#"#"&547&#"#4'&#"%2654&'4&#"32%2654&' Zi|!-Z<k'4$!49TYj{!+.-0T/01(4##6::4:B05Úp/W<0#gý 4;C/1A ‚bžd DD[—L.[½?=§))LL))i^Á†Ž%D"-27_agqIS %QMATAEz`c .þ†u0 ! $PQAWDIMY@Dz"&<+°>±5+´$&+±ˆ+± ± 99°…±99°³V$9°Z±T99±NO°9±mE°I9°h°9°x¶B-^dGj$9°w²(o/999°a°:9°>´18 qs$9°5°39±jo²*3q999°-°/9±|B° 9±^@  $>EZd‚…$9°±9901"&547&#"&547632632632632#"54632632654&#"#"&547&#"#4'&#"%2654&'"327&#"#'4&%2654&' Zi|!-Z<."9.ý›4;C/1A ‚bžd DD[—L.[½?=§))LL))g]Œ¹Œ˜€-:/1M—¯q“ %QMATAEz`c .þ†u0 ! $PQAWDIMY@Dz"&*$`@D{#!{F Zÿ,î2doz3²V+²+±I33´p++°e2°(/´7++°/²?P[333´7+² 222°{/°,Ö´3+°3±+´ &+° ±+´y&+°y±s+´a<+°a±V+±Ué°U±L+´n&+°n±h+´E<+°E±;+´$&+±|+±3°09° °19°± 99°y±99°s³]$9°a±[99°V±(799°U°9±nL±P99°h³IAN$9°E±? 99±pV° 9°@  $,3;ELakv$9°²199901"&547&#"&547632632632632! '&4767! 7654'&#"#"&547&#"#4'&#"%2654&'!2654&'­Yj{!+W>=n/ŒLW—M2:Yw:;L2:YzSO‡Àþ þOÇÞ:8Z×µ½³ƒ=n/ŒLW—M2:Yw:;L2:YzSO˜a_DB` ±þåþOÇÞ:8Z×µ½³ƒ+°>±+´ &+° ±+´Ÿ&+°Ÿ±™+´l<+°l±c+±bé°b±Z+´x&+°x±r+´T<+³“Tr+´,+°,/´“+°T±}+´‹+°‹±L+°‰2´!&+´&+±¢+±>°;9° °<9°± 99°Ÿ±99°™³i$9°l±g99°c±0F99°b°9±xZ±^99°,´W\ou$9°r±.Q99±T“³Oƒ$9°}´)z€†Ž$9°‹°#9±0z³,&‰“$9°Fµ.2}ƒ‹‘$9°²#D€999±–c° 9°@  !8>LTZluœ$9°²<99901"&547&#"&54632632632632#"&547!".546732>54&#"#"&547&#"#4&#"%2654&'2654&#"2654'#"&'2654&'­Yj{!+Yyn/Œµ…M2:Yw:;L2:Yx¤„3BiKIk ¹þæo²µŠzO-/:8Z+Ir~¦ cÜÃ~I\*.LsPZi|!-0YU\3'/Ks=3=D/1Ae"##!/D8*(9Dü°499901"&547&#"&547632632347632!5654'&#"4&"!2654&' Zi|!-Z<:«))Z\|oOeFGDCdþ¹0K€eAE #SMCWDIPDd24Cþû`@D{#!{F Wþ÷þ2ENYd@²5+±)T33´+°M2²+°3´Z++°//´O++°/°<3´7+±$22°e/°Ö´ &+° ±+´c&+°c±]+±Bé°B±8+´1+²8 +³@85 +°±+´M1+°M±2+´W+°W±N+´)1+°,2°)´R+°R/±f+± ± 99°c±99°]³>$9°B±<99±8°9±W2±4I99°N´$H/OT$9±)R°*9±O³,2RW$9±Z5± 699±@  8B]`c$9°²HI99901"&547&#"&547632632347632##"&547!5654'&#"4&"!264&#"%2654&' Zi|!-Z<:«))Z\|mPeFGDCdþ¹,:C``C8.0K€eAE #SMCWDIPDd24Cþüþü7R78('9ý`@D{#!{F WþÔþ2<EQ`kn²/+±#L33´+°D2²+° 3´a++°)/´R++°Z/´F+°/±5@33´7+°2°l/°Ö´ &+° ±+´j&+°j±d+±:é°:±2+´1+²2 +³@2/ +°±+´D1+°D±,+´^+°^±\+´O+°O±I+´W+°W±E+´#1+°&2°#´U+°U/±m+± ± 99°j±99°d³7$9°:±599±2°9±^,±.99±O\°@9°I´ )RYZ$9±#U°$9±F·&,IOUW\^$9±a/± 099±@  2:dgj$9°°901"&547&#"&546326323462##"&547!5654&#"4&#"!2654&#"2654'"&'2654&' Yj|!-Xzp1‹³‡M28Zzž3“È/,jJIk-þ^Lua(/KrS`CB^Ch""""/C9R9 Cüñ33265!5654&#"4&#"!"32654&%2654&' Zi|!-Xzp1‹³‡M28Zzž3“È¡{'NG,.-$Cgý+4;C/1A ‚bžd ‡\—L.[½‡œ))³kPdމbþ¹t‹1 -*#6=2K~f… œJXŒPDdeDþþ¥ œ`@D{#!{F Wÿòþ.=Fɲ0+²+±%33´>++°+/±433´7+±22°G/°Ö´ &+° ±+´E&+°E±A+±:é°:±0+´/1+°/±(+´"&+±H+± ± 99°E±99°A³6$9°:°49±/0°9°(²%&999±>0±& 99°+· "(:C$9°°901"&547&#"&547632672632'654&#"#4&#"'2654' [h|!-W>=p1‹LW—N27\3:63msHC\O&ƒeR0@Q_867%4;T332#"&#"2654&'h [ 5VN'f_EI‘UPd0D')0 X 9j?O;PS54:(2'!6:SZix#'Z</2!#$%&#EþŸ_8'' #SMCWDI‚b¥] DD[—L.[½=8®''[*3)S2<)&¦`@D{#!{F Yÿ0´.kvF²+´7+²+° /´ ++°>/°33´t+°/°3±fé°i2°b/°_3±!é°E/±/733±Pé±TX22°w/°MÖ´H+° Ö´&+² +³@ +°H±A+´q&+°q±l+´;&+°;±4+´3+°3±+±dé°d±+°+2´&+°\2±x+±A³JK$9°q±EP99°l³>9RC$9°;±7T99±34°V9±d·!/X_i$9± °9±>°K9°t²J999±bf¶AHM;lq$9±E!µ+9CV\o$9°P°R901%#!"3!!"&463!254&#"#"&54632;232>54.#"#4#"#"&547&#"&54632632632#"&#"32632%4&'326´N>üâ$98%üVDY[Bør#@*=='6 -;MqITaJHc\GdZ$€œrE&(Xp;6«9\@D1 ? )' C 3Aýr:&]5+-0„  56þçsQrLmnKlVeG~5.Jžk„MM>.0?"!Jd0\8k2GE\ÿ#à2w‚|²N+°\3´x++°# Ö´$++²+² +°/´++°)/´7+°2°q/´57+°5´t++°U/±9D33´b7+±fj22°ƒ/°Ö´+°±^+´Y&+°Y±Q+´&+°±{+±Jé°J±?+´><+°>±/+´v&+°v±'+±722±é± n22±„+±°9°^°9±QY±[\99°±Ub99°{³NFdS$9°J³Df$9±>?°h9±v/±#$99°'µ,29jq$9°°9±N° 9°#±>?99°x±[99±)$°9°³JQ{$9°qµ/Y^v$9±U5µ7FShn~$9°b±d9901%2632! '$47! 7654&+53254#"#"&546323254#"#4'&#"#"&547&#"&547632632632#"&#"2654&'÷ T 1P=:uþzþžŸþúHBBãP„cC9'—VC S +:<) \ 9€M?OS468'5$"6;RZiw!'\<;p0Œ]X„P08[{CD¯R?SM3 Q 3ýé4:B01?úB.KEb*&?fV”€(r{þÜZ9&,#D7*>+)='?$EþŸ_7'( $ROAXBJ‚b¦\ DB]—L.\¼‚SN''[\$I/=%#Ã_AE{""xH Wÿh/cmx9²+°3´n++°2/´g++°l/´97+°B/±*é°&/°#3±Jé°/±PZ33´7+±22°y/°Ö´ &+° ±+´w&+°w±q+±`é°`±U+´T<+°6 Ö±dé°T±F+±(é°(±>+°M2±/é° 2±z+± ± 99°w±99°q³\$9°`±Z99±T6°9±(F³29gl$9°>·#+99±n² TU999±&*´F`qw$9°J± 99°´ \t$9°°901"&547&#"&547632632632#"&#";2#"'&54632654&+&#"547632654&#"#4'&#"3254&#"%2654&' Zix#'Z<=p1‹LW—S//`=p1‹LW—S//`GSbl„²+° 3´c++²)+±N33´>++°$/´T++°\/´H+°/±.933´7+±22°±Aé°m/°Ö´ &+° ±+´k&+°k±f+±3é°3±*+´F&+°F±'+´`+°`±?+´;<+³Q;?+´^+°^/´Q+°;±K+´Y+°Y±6+´1+°!2°´W+°W/±n+± ± 99°k±99°f³0$9°3±.99±F*°9±`'²)>A999±?^°9±;Qµ$9HNT\$9°K°[9±W°9±H·!'KQWY^`$9±c)° 9±A>@  3;Ffhk$9°±099°°901"&547&#"&5463263263 ##"&547#4&#"%54'4#"62654&#"2654'"&'2654' Ziy!*Yyp1‹µ…S//`@zD¦/,jJIk,é^T 0CrÂ=dGXGK$ÕL##""/D9R8Dý4;r0B cže †]—L.[½¤ 7(`þÓþÿ4CJklIE2 Zl '’MY‹NÀÊdVš5+jK326=!4&#"%54'4#"6"327654'&%2654' [hy!*W>=p1‹LW—S//`#2 .)ý–33´7+°2°]/°/Ö´4+°4±+´ &+° ±+´Q&+°Q±K+±Dé°' Ö´[+°D±;+°U2´&+´!+±^+±4/°19°°29± ± 99°Q±99°'·+8@HN$9°K°)9°[±>99°D°$9°;³#SX$9±+S³'!U[$9°8³)VXZ$9°°9°H° 9°@  /4;DN$9°±29901"&547&#"&547632632"'&547#"'&54732654&#"'2654&'264&#"¨Zh{!,[<;o/Œ[]€O27\ƒLF/A_†0/OUî’’E??ÌÀäuc'5#"6:S4;B01@r(88('99 ‚bŸc DB]—L.\¼€QR))d\ÉxS7D`0/E‡‡å¤x'g—¾usưp™ %QKEWDID`@Ez#!zG þn8P88P8Vþ5W2@KWg]²+° 3´A++°!/´X++°`/´L+°(/°]3´3++°/°93´7+°2°h/°+Ö´0+°0±+´ &+° ±+´J&+°J±D+±>é³e>D+´$+°$/´e+³U>D+´c+°c/´U+°>±O+´]+°]±6+°[2´&+´+±i+±0+°-9°°.9± ± 99°J±99°$¶(3AG$9°D±&;99±Uc±999±O>µ!LRX`$9±(L¶$OU[ce$9°3±&R99°°9°A° 9°@  +06>G$9°±.9901"&547&#"&54632632#"&547#"54732654&#"'2654&'2654&#"2654'#"&'¨Zh{!,Yyo/Œ¶‚O27\€•‰4HkJIk@HìþÚE??ɽçuc'/KrQ3p0MW˜N28Z‚PFŒ.n€Z)7%4:®$2Z$s!'H>Np OG;@ZF/Y³jP\''[Ri²Z1FŽX€&RE=RAFþ²T/c6'=ŠH3=V@7uB[D_bF]wS?:tX?BxvD—þÏ&9&$`3Tý¶º--Ydny޲T+°43´G+°=/´e+°N/´r+°.2°r´j++°/±33´Z++°/°$3´++°2°z/°Ö´ &+° ±+°Q2´c&+´o+°c±v+´K+°K±D+´X+°X³X*+±]é°]/±*é°X°m Ö´@+°@/´m+°X±!+°g2´&+°1 Ö´6+°:2°!´:+±{+± ± 99°o°9°c°9°v´INrx$9°KµGTZ`$9°]°&9±@D±$99±m*°B9°1@ .348=ej$9±je±@:99±rN±8B99°G¶16DKQWx$9°T°39±Z± 99°¶ !*`$9°°901%"&547&#"&547632632'654&#"2654'7#"&547&=4#"#"&546322654&'264&#"327654'Xj{ -X=>p0MW˜N28Z‚PFŒ.n€Z)7%4:®$2Z$s==K32K,Mp OG;@ZF/Y³jP\''[Ri²Z1FŽX€&RE=RAFþ²T/_6'=†i3$I3JK29&%c7uB[D_bF]wS?:tX?BxvD—ýš+<,,<+5&9&$`3Týº-(S^fv€²N+°/3´B+°8/´g+°o/´e+°a/´)+°z2°/± 33´T++°/°!3´++°2°/°Ö´ &+° ±+°K2´]&+´w+°]±}+´F+°F±?+°;2´R+°R³R&+±Wé°W/±&é°?´t+°R±_+´l+°32°l±+°j2´&+°, Ö´1+°´5+±‚+± ± 99°w°9°]±I99°}´DHz$9°FµBNTZ$9°W°#9±t?±!99°R±=r99°&°q9°_@ )./8cgo$9±ae·;5IHjlrt$9°)±3=99°B¶,1?FKQ$9°N°.9±T± 99°¶ &Z$9°°901%"&547&#"&54632632'654&#"2654'7#"&547&=4#""&546322654&'4#"322654'#"&'32654'Xj{ -X{p0¸„N28Zv¢Œ.n‚X).Ls³%1Z$sC@S79S;>p OGvDw]Ek¼5:tY>AxuD—þ++-U3#".,$2N&9D%`3WÿòŽ4FQá²+²$+± 233´G++°2°+/±33´87+±<@22°R/°4Ö´/&+°/±'+´P&+°P±J+± é° ±+±é°±+±Dé°D±+´&+±S+±'/±1299°P±+899°J³$:)$9° ±<99±°>9°°@9±D² 999±G°19°+@  '/4>CM$9°8±:9901%2654'7#"&=4#"#4&#"#"&547&#"&5476326326322654&'¡PP‘+³4=}nzŠ}ZfD?7%4;T[h|!-W>=p1‹LW—M2;fš96np|Jü¬3=p1‹LW—M2;fš96np|J}(87)'99üV3/$9°'±"@99±°B9°°D9±b°9°N¶SU]$9°Z° 9±*L¶ PXZ`b$9±e± 699°1@ '-49BGk$9°<±>9901%2654'7#"&547.=4#"#4&#"#"&547&#"&546326326322654&"2654'#"&'2654&'¡PP‘+³``jKIk3LTŠ}ZgC?.LrQZi|!-Yyp1‹µ…M2;fš96np|Jb0""0";/D9*': Cü_4;C/1A<|b£@7VƲI3mKijJI4„cZ•‰þŸa;N #šIY‹cžd †]—L.[½¤)+LOznhJ\À"!!’B/ +=9'.C+`@E|!!{F Wÿ–2Xdo&²+´]7+²+°&3´7+²6+°D3±eé° /´c++°=/±#,33´J7+±NR22°p/°FÖ´A&+°A±9+´n&+°n±h+±2é°2±'+±&é°&±+±_é°_± +±Vé°V±+±é±q+±9A±CD99°n±=J99°h³6.L;$9°2±,N99±&'°P9±_±#R99° °9°V² ]c999°µY$9±]c±99±e±C99±=@  29AFPUhkn$9°J±L9901%2654'7#"'&54763267#"'&=4#"#4'&#"#"&547&#"&5476326326324'&#"32%2654&'¡PQ‘,¹v|½O?S>2@B@R E1+?v=6Š}Z:4G22'!6:SZi|!-Z<=p1‹LW—M2;fš96np|J†A^D12ùä3=p1‹LW—M2;fš96np|J†A^@_ )77)(89ú3/²'/X333´I7+²MQ222°ˆ/°FÖ´A&+°A±:+´†&+°†±€+±4é°4±++±*é°*±$+±Ué°U±+´&+°±+´\1+²\ +³@ +°\±+´z+°z±x+´j+°j±d+´r+°r±]+´&+° 2°´p+°p/±‰+±:A±CD99°†±>I99°€³71K<$9°4±/M99±*+°O9°$°Q9±U²!999±z°9±jx° 9°d³Xmu$9°r° 9±p°9±7a· djprxz$9±}°C9±>]@ $4:AFOTU€ƒ†$9°I±K99014632#"&547!532654'7#"&=4#"#4&#"#"&547&#"&54632632632"!4&2654&#"2654'#"&'2654&'õbc/.k”j.þÓŠþ¬PP‘+³4=}nzŠ}ZgC?.LrQZi|!-Yyp1‹µ…M2;fš96np|J†A^@_ ""!!/C8*)9 Cú4;C/1A@bŒ†aþ¹4EJjkIG2A|b£@7VÆ€MYŽwZ•‰þŸa;N #šIY‹cžd †]—L.[½¤)+LOznhJ\ªbBþÿBaý ""!!pB/ +<8(/B!`@E|!!{F WÿÔ4\eq|e²+°/3´++°a2²<+±&I33´r++°2° /´f++°l/´++°C/²,4]333´N7+²RV222°}/°KÖ´F&+°F±?+´{&+°{±u+±9é°9±0+±/é°/±)+±Zé°Z±+´#&+°#±+´a1+²a +³@ +°a°o Ö±é°/±oé°a±b+°2´&+±~+±?F±HI99°{±CN99°u³<6PA$9°9±4R99±/0°T9°)°V9±Z² !&999±ba¶ fil$9±lf³io$9±r°H9±C@ #)9?FKTYZux{$9°N± P99014632#".54>3265!532654'7#"&=4#"#4&#"#"&547&#"&54632632632"!4&2654&#"%2654&'õbc—y4eL9±eµAHbgh$9±]^°K9±VE¶ MSTY$9°Q°9±n#²/999°*@ &-2>Ds$9°6±89901%2654'7#"&=4#"#4&#"#"&547&#"&547632632>322632'654&#"#54&#"&5476%2654'¡QP‘,²yum|Š}ZcG484:UZi€%4Wtp1‹LTŒOGM[7<3d0o~Já%; RN./y X=1%D*1:\'w/.ýÝ4;o,IVr_š<5Q»—‡qU‚þ±O=E )N@?RAFz_“_~ZF/X´hR\,,/oj`FXV&D78KŠ93)l3D0ææ/H4j'29ˆL87PY>ƒMx;—Wþ„2Go|†²N+°J3´_+°g2²_N +³@_c +°U/°n3´s+´\ycN +´\+°#/± 033´}++°2°*/±33´6++±:A22°‡/°2Ö´-&+°-±&+´…&+°…±€+±é°±+±é°±H+´k+°k±+°c2±Eé´b+°E±Y+´p+°p±u+´R+°R±+´&+±ˆ+±&-±/099°…±*699°€³#8($9°±:99±°>9±kµAJKmn$9°b°L9±pY±N_99°uµ U]$9±sU°m9°y³HRkY$9±N_°L9±}#²/999°*@ &-2>D‚$9°6±89901%2654'7#"&=4#"#4&#"#"&547&#"&547632632>32462632#"'&546;&#"#54&#"&%3254'&#"2654'¡QP‘,²yum|Š}ZcG484:UZi€%4Wtp1‹LTŒOGM[7<3d0o~Jþ^b˜!'XW?=NC;H: =a=- 0Rt¤ N /ü©4;o,IVr_š<5Q»—‡qU‚þ±O=E )N@?RAFz_“_~ZF/X´hR\,,/oj`FXþïOl:::9VKf.&5?T!Oäç ,%'0l"56Z/f Y>ƒMx;—Wýö2G—»²S+°W3´H+°z2²HS +³@H~ +°`/´e+°q/°N3´…+°#/± 033´Ž++°2°*/±33´6++±:A22°˜/°2Ö´-&+°-±&+´–&+°–±‘+±é°±+±é°K2°´P+°P/°±~+´}+°}±+±Eé°‚2°E´t+°t/°E±‡+´n+°n±+´&+³]+´i+°i/´]+±™+±&-±/099°–±*699°‘³#8($9°±:99±P°>9°~µAHMNS$9°}°U9±Et²Wbz999°‡´`ceqx$9°n´ Yl$9°i°9±e`°b9°q°c9°…°M9°H@ KPY]ilnt‹$9°S°U9±Ž#²/999°*@ &-2>D“$9°6±89901%2654'7#"&=4#"#4&#"#"&547&#"&547632632>32"&54632632#"'7327654&'#"&54767&#"#54&3254'&#"2654'¡QP‘,²yum|Š}ZcG484:UZi€%4Wtp1‹LTŒOGM[7<3d0o~Jþ¿0>Ps`PI!)Lƒ$M))rX;2&+@())" ;<4?"#4BZ=,Ü>%2üï4;o,IVr_š<5Q»—‡qU‚þ±O=E )N@?RAFz_“_~ZF/X´hR\,,/oj`FX“J3l&46ŒNp22R 78V_‰#434D0N $I[S9;/0Méé!,¶1\4$>Y>ƒMx;—Wþ2GNV_iI²L+´Y7+°Q2°I/´U+°#/± 033´`++°2°*/±33´6++±:A22°j/°2Ö´-&+°-±&+´h&+°h±c+±é°±+±é°±I+´^+°^±+±Eé°E±W+´S+°S±V+´H+°H±+´&+±k+±&-±/099°h±*699°c³#8($9°±:99±°>9°I±A99±E±UY99°W°L9°S°Q9±HV² 999°°9±YU±S^99±`#²/999°*@ &-2>De$9°6±89901%2654'7#"&=4#"#4&#"#"&547&#"&547632632>32!5432#4'3'4#"62654'¡QP‘,²yum|Š}ZcG484:UZi€%4Wtp1‹LTŒOGM[7<3d0o~Jzþ“¹´B?]Šr&uüå4;o,IVr_š<5Q»—‡qU‚þ±O=E )N@?RAFz_“_~ZF/X´hR\,,/oj`FXþ:§ÉÆf'eP·< CjP0Y>ƒMx;—WýÂ2GYajs}²Q+´d7+°\2°H/´k+°p/´a++°#/± 033´t++°2°*/±33´6++±:A22°~/°2Ö´-&+°-±&+´|&+°|±w+±é°±+±é°±N+´i+°i±+±Eé³rE+´K+°K/´r+°E±b+´^+°^±a+´T+°W2°T´n+°n/°T±+´&+±+±&-±/099°|±*699°w³#8($9°±:99±°>9°N±A99±rK²M`d999±bE°Q9°^³H\kp$9°a°o9±Tn³ U$9°°9±pk±WK99°a³NTUM$9°d±^i99±t#²/999°*@ &-2>Dy$9°6±89901%2654'7#"&=4#"#4&#"#"&547&#"&547632632>32"&547#5432#4'3'4#"6264&"2654'¡QP‘,²yum|Š}ZcG484:UZi€%4Wtp1‹LTŒOGM[7<3d0o~J 2K’¹´I?^‹r&v7,-<**üÓ4;o,IVr_š<5Q»—‡qU‚þ±O=E )N@?RAFz_“_~ZF/X´hR\,,/oj`FXýlK2-$§Éƪ#.3Jxf'^P°< CcOþÐ+<,,<+ZY>ƒMx;—Wý©2CU]em|†ƲM+´`7+°X2°D/´n+°v/´l+°h/´\++°!/± .33´}++°2°(/±33´3++±7=22°‡/°0Ö´+&+°+±$+´…&+°…±€+±é°±+±é°±J+´d+°d±+±Aé³GA+´z+°A±^+´Z+°Z±]+´P+°S2³sP]+´f+°f/´s+°P´q+°q/°P±+´&+±ˆ+±$+±-.99°…±(399°€³!5&$9°±799±°:9°J±=99±zG°I9°A²\`w999°^±Mj99°ZµDXhlnv$9°f°u9±qs± 99°P±Q99°°9±hlµSGqsxz$9°\³JPQI$9°`±Zd99±}!²-999°(@ $+0:@‚$9°3±59901%2654'7#"&=4#"#4&#"#"&547&#"&54632632>32"&547#5432#4'3'4#"64#"322654'"&'2654'¡PQ‘,²yum|Š}ZcG4/BsPZi€%4Wtp1‹±{OGM[3qd0o~J9S%~¹´!#S?]Šr&)&uV+..+*%2 +@, 5üÝ3ƒMx;—Wýì2G]env€޲P+´h7+°`2°V/´q+°u/´H+°L/´d+°#/± 033´w++°2°*/±33´6++±:A22°/°2Ö´-&+°-±&+´&+°±z+±é°±+±é°±+±Eé³mE+´M+°M/´m+°°[ Ö´o+°E±f+´b+°b±L+°^2´S+°S±+´&+±‚+±&-±/099°±*699°z³#8($9°±:99±°>9°M±A99±Eo°h9°f´HPVdu$9°b²`qs999°L² J999°S±99±uq°[9°H°J9±hd±bm99±w#²/999°*@ &-2>D|$9°6±89901%2654'7#"&=4#"#4&#"#"&547&#"&547632632>32267!5432#"#"&54674'3'4#"63254#"2654'¡QP‘,²yum|Š}ZcG484:UZi€%4Wtp1‹LTŒOGM[7<3d0o~J?T!þÖ¸±cQ3SJµ?]Šr%uMT*I5ý"4;o,IVr_š<5Q»—‡qU‚þ±O=E )N@?RAFz_“_~ZF/X´hR\,,/oj`FXþ $/¤ÌÉ£MZ&$ Ái&_P²<!DdPî  Y>ƒMx;—Zÿ#2cn²4+²C+±&P33´d++°2²+°/´ ++°J/±.933´X7+² \`222°o/°Ö´+°±R+´M&+°M±F+´m&+°m±g+´?<+°?±4+±3é°3±++´1+°±+´ +±p+±R°9°M°9°F±OP99°m±JX99°g³C;ZH$9°?±9\99°4± 99°3°^9°+°`9±² $999±d4°O9°J@  +,?FMR^cj$9°X² Z99901%327654'7! '.547!2767'#&'&=4&"#4'&#"#"&547&#"&547676326326322654&'˜R>N( …+¤þó¯þ•þñ€u±ŠHo4Z&šzËz´q g?=HvX:3E35$!69TWi{ ,[vn0Š$OLbL28h˜92m_yý5;B10?âBcM@T•B9VÌþÏqG?mªqœ*‚€þæX.!VMIkZ?W(*8þŸaC$" $RMCXBJƒažd ˆ[–M.\¼<4W0,))JJ€aþë^BFy#!{F Zÿ#2`k²1+²@+±#M33´a++°2²+°/´++°G/±+633´U7+² Y]222°l/°Ö´+°±O+´J&+°J±C+´j&+°j±d+´<<+°<±1+±0é°0±(+´1+°±+´ +±m+±O°9°J°9°C±LM99°j±GU99°d³@8WE$9°<±6Y99°1±99°0°[9°(°]9±² !999±a1°L9°G@  ()N( …+¤þì´þ’þñ|àx•o4Z–w· g?=HvX:3E35$!69TWi{ ,[vn0Š$OLbL28h˜92m_yý5;B10?âBcM@T•B9VÌþÎpG`uäœ*‚€þæX.MIkZ?W(*8þŸaC$" $RMCXBJƒažd ˆ[–M.\¼<4W0,))JJ€aþë^BFy#!{F Zþk2my‰”›²7+²C+±*P33´Š++°d2°/´z++°‚/´n+° /´&++°J/±2;33´U7+²Y]j222°•/°Ö´+°±R+´M&+°M±F+´“&+°“±+´@<+°@±7+±6é°6±.+´a1+°a± +´‡+°‡±g+´l+³lg+´q+°q/´+°l° Ö´}+°}/´+±–+±R°9°M°9°F±OP99°“±JU99°³C=WH$9°@±;Y99°7± &99°6°[9°.°]9±‡ ° 9°q@ dij(wz‚$9± n³ }‡$9°&µ qw…$9°C²#t999±Š7°O9°J@ ./@FMR[`gl$9°U²Wi99901#"&547!".5473 7'#.=4&#"#4&#"#"&547&#"&5463263263232654'72654&#"2654'#"&'2654&'Ž9MjJKj ¹þÖ]ˆ£u€XT1o4Z-JQrm“‚U· dH;8@XiI3/KsPWi{ ,Yxn0аˆL28h˜92m_yR>IM…+¤ª"#"!/D9*(9 Düv5;B10?3`@JjiK5 $2I\{Jœ*‚€>hO?, •lZ?WN<þŸa?J œJXŒƒažd ‡\–M.\¼ƒ ))JJbjCb„]•B9VÌËþÝ!""!qD.!+=9'/CŠ^BFz"!{F Yþö8.",³²(+´7+° 2²+°3´ ++²  +³@  +°/´$++°/´7+°-/°Ö´ 1+° ± +´<+°±+´++°+±+´&+°2°´&+°&/±.+±+°9°´$($9±&°9±($±9901"&547!3347632#"!4&264&#"–B_$þ@P«GHbeHF$$_”A^CaN98('9þö`C:-&þÿcEFCBbþ¹-:C`ðbBþÿBaýR9P88('YþÔ8. +;Ʋ +°3´++°2² +³@ +°/´,++°4/´!+°/´7+°/°Ö´1+°±1+´,+°,±+´9<+°9±%+´$+°$±:+´&+°2°´+°/±?+±9°/9°%²).999°$² 5999°:³ $901%!335476322632'654&#"#54&#"&5476"!54&8ý!P«GHbfGFþ…%; RN./y X=2%C*1:\'w/.ÙA^Cbþ.óbBCA@`þ³&D78KŠ93)l4C0ææ/H4j'29ˆL87ç]AõöA\Yþ„:.7@L²+°3´/+°'2²/ +³@/+ +°/°63´D+´$J+ +´$+°/´++°<2² +³@ +°8/´ 7+°M/°Ö´1+°±+´3+°3±+´<<+°<±++´*+°*±!+´A+°A±=+´&+°2°´F+°F/±N+±3°69°<²/5999±*+°9±A!³ '8$9°=³%DJ$9°F°H9±D°59°J³3!$9±/°901%!335476324632632#"'&546;&#"#54&#"&"!54&3254'&#"8ý!P«GHbfGFý•bMK!'XW?=NB;G: =a=- 0SuxA^Cb M //þ.óbBCA@`ýøOl:::9VJg.&5?T!Oäç ,%'0k#56-]AõöA\ý-/f4Yýön.HQ]6²+°3´+°A2² +³@E +°'/´,+°8/°3´U+°/´++°M2² +³@ +°I/´ 7+°^/°Ö´1+³+´+°±+´M<+³EM+´D+°M±;+´R+°R±N+´&+³5N+´W+°W/´5+³0N+´$+±_+±³$9±DM°9±R;²)A999°W¶ *',8I?$9°N± 399±,'°)9°8°*9°U°9°@  $035;[$9°°901%!33547632"&54632632#"'7327654&'#"&54767&#"#54&"!54&3254'&#"8ý!P«GHbfGFþ0>Ps`PI!)Lƒ$M))rX;2&*@)))" ;<4?""5BZ=,ÝA^CbC>%2þ.óbBCA@`þvJ3k'46ŒNp22R 78V_‰#434D0N $I[S9;/0Méé!,$]AõöA\ý&1\4$>Yþ8.&/²²+´)7+°!2°/´%+°/´++°2² +³@ +°/´ 7+°0/°Ö´1+°±+´<+°± +´.+°.±'+´#+°#±+´&+°& Ö´+±1+±'.³ %$9°#°!9±)%±#.9901%!33547632!5432"!54&4'3'4#"68ý!P«GHbfGF%þ“¸µÎA^CbI?]‹r%vþ.óbBCA@`ýC§ÉÆ­]AõöA\ýSf&_O°<!BcOYýÀ8. )1:Eþ²+´47+°,2°/´;+°A/´1++°/´++°%2² +³@ +°!/´ 7+°F/°Ö´1+°±+´%<+°%±+´9+°9±+´D+°D±2+´.+°.±&+°>2´&+°1 Ö´+°&´+±G+±D´ !04$9°2°9°.³,;A$9±&°9±A;±99°1³$9°4±.99901%!33547632"&547#5432#"!54&4'3'4#"62654&#"8ý!P«GHbfGF2K ‘¸µ IŠA^CbP>]Šr%u6++**þ-ôbBCA@`üsK20#§Éƪ"13J']Aö÷A\ýSg(cO´< CgNþÔ*,-<*Yý¬8. '/7=M²+´27+°*2° /´>+°F/´=+°:/±33´.+°/´++°#2² +³@ +°/´ 7+°N/°Ö´1+°±+´#<+°#±+´6+°6±+´K+°K±0+´,+°,±9+´C+°C±$+°A2´&+°/ Ö´+°$´+±O+±K°9°0µ .2H$9°,µ *:=>F$9±$°9±:=µACIK$9±2.±,69901%!3354632"&547#5432#"!54&4'3'4#"64#"32654'#"&'8ý!P«Žcd¥:R!{¸µ"R†A^CaO>]Šr%)'uX,--%2 +!, 5þ-ôa†`ü_Q93'§Éƪ(28R;]Aö÷A\ýSg(eP·Fò²+´87+°02°/´A+°E/´+°/´4+°/´++°)2² +³@ +°%/´ 7+°G/°Ö´1+°±+´)<+°)±+´=+³"=+´?+°=±6+´2+°2±*+´&+° Ö°.3´+±H+±6?·% 48E$9°2²0AC999°°9±EA°"9°°9±84±2=9901%!33547632267!5432#"#"&546"!54&4'3'4#"63254#"8ý!P«GHbfGFåU!þÖ¸²cQ3RH!A^CbS?]Šr%vLS*I4þ-ôbBCA@`ý)$.¤ÌÉ£MZ&$ q]Aö÷A\ýPi(_P²<"CdQï Xþêj-6@˲=+°,3´7+²+° /´8++°/´7+°$/´4C+°A/°.Ö´)+°)±+´?+°?±+±!:22´&+°2´ +±B+±).°,9°°+9°?²999°µ $4$9° ±99±=8± 99°²+999°³).$9°°9°$°901"'&547&'532654+53254&#"&545476322654&"j/ML@//ˆ//* )W,?qKJrV;l~9F;PO’[…ÕN98P9Š&G `W.1PB1001B?.R 9+YGP-0‰oc{yXWWýW9'(89'&YþÉj-/9Iö²6+°(3´++²+° /´:++°B/´1+°/´7+°"/´-C+°J/°*Ö´%+°%±+´G+°G±3+´?+°?±+±=22´&+°2´ +±K+±%*°(9°°'9°G²999°3@ "-8:B$9°?° 9°°9° °9±61µ =?EG$9°²'999°³%*$9°°9°"°901"&547&'532654+53254&#"&546322654&"2654'#"&'j/MSCj”k1 /|,?qKJrV;k9F;¡[…Þ0##0"3&b8*ñ¬*4[..7 =47vNO$?3-8‚bR 3:‰of}€Ð #Yÿ-5Ió²4+°/´D+°@/°63´+°2²@ +³@@: +°$/±%é°./´C+°J/°Ö´1+³1+´B+°1±;+´:+°:± +´1+°° Ö´*<+°*/´<+²* +³@*% +±K+±1°49±;B±399°:²D999°*µ .F$9±@D±99°°9±$4² 3999°%² 1999°.°90174632#"54632632654&+5327654'&#"&"#'4'&#"327&#"Y¡]CR*8_UÎC.NAE&_A773+,7.9l|9F;^7;„^=+ñ¬*4[..7 =47ˆJCy+856E+FAbR 3:‰of}€Ö! &:-3Xÿm.2°² +°/±é° /´7+°/´7+°/±'é°3/°"Ö´+°± +±22±é±+/22² +³@ +³@  +±4+±"° 9° ³'$9°±-199±°9° ² 999° °9°°19°±"/99°°-9°°+901#"'73254+5324+53254#"&5454632mlJiA&+SekZYlkKJl‹o?8:I; ‘TBM>>>>:Hc5A*cYG†GP\GCmf}y°'/NXRO!Xþm.<Hô²"+°/´=++°C/± é°/´7+°/´7+°/±)é°I/°$Ö´+°±+´F+°F± +²@222±5é±-122² 5 +³@  +³@  +° ´9+±J+±$°"9°±!99°F±99° µ )=C$9°9²/37999±C=±999° ²7999°"² 5999°°!9°°39°±$199°°/9°°-901"&547&'73254+5324+53254#"&5454632'2654&#"·B_1&+SekZYlkDCl‹o?8:I; ‘TBM>>>>Q>//E(87)(89þaBE0 A*cYG†GP\GCmf}y°'/NXRO!`Z0/QB10C8()67('9Yýõm.7BR0²!+°/´C++°K/´8+°>/± é°/´7+°/´7+°/±'é°S/°#Ö´+°±+´P+°P±N+´@+°@±;+´H+°H± +²F222±2é±*.22² 2 +³@  +³@  +° ´6+±T+±#°!9°° 9°P±99°N°9°@°9°;´' CK$9°H°9° °49°6±,099±>8µ6FHNP$9° ²4999°!² 2999°° 9°°09°°.9°°,9°°*901"&547&'73254+5324+53254#"&=4632'2654&"2654'#"&'ð”kF&+SekZYlkKJl‹lz:I;£ŽYŠ>>>>YF¶#$.#!/D9*(8DýõjJW7A*cYG†GP\†qf}y­ZJXRO!`a-7XJI"""!qD.!+=8(.DXÿm.9GÛ² +°6/´:++°A/´++° /´7+°/´7+°/±'é°H/°"Ö´+³"+´D<+°±+± 22±+é±/222²+ +³@ +³@ +±I+±"° 9±D°9°´'6=$9°+±-199±A:´3=D$9°± 99± °9°±1299°±"/99°°-9°°+9014>32654+5324+53254#"&5454632#"'&2654'&#"–4H' ˜kZYlkDCl‹o?8:I; ‘TBM>>>>`JY`>6Í#;#=<!. CYG†GP\GCmf}y°'/NXRO!À9,*$ Yþûp.?N²+°/´M+°I/°B3´#+°'2²I# +³@ID +°./´1++°7/´:7+°<2°/± é°O/°Ö´+³+´K+°±E+´D+°D±4+°>2±é±22²4 +³@4. +³@47 +°´+<+°+/±P+±°9±EK±#99°D´%1:M$9°4µ ')2@$9±+±99±IM²@)999°#²%+999±.°9°1°9°7±99°:±99°°901"&54632#"'&547632632654+523254+5203254&#"#4'&#"32‹l|:I;¢TBM>>>AbShI9N'.N@DrZˆkDˆ5-268Wãˆoh{€~®'/NXRO#Li?5 C1-/HYGECGQ\ý†7M,(=YÿæÁ3Lú²+°'3´G7+²G +³@GB +°° Ö´=++°/±é°!/´-C+°M/°)Ö´$+°$±+´:<+°:±+°2±4é°02²4 +³@ +°4±@+±Cé°C±J+´+±N+±$)°'9°°&9°:±!-99°±899°4² 2=999±C@° 9°J²L999±=°&9±Gµ $)4:$9°²2J999°!°09°-°L901#"'#".54767654'&+53254&#"&5476323265332654'M[?Cyp0J»3ZDT.)% 93$yG1w~7F;ST‹T‰=:.[(T bY!/Piˆ3'™fuPVQ]1%Q "OL%'€xor‚|’TVLAi CNYSNþ²108yV­AYþñÁ3T`7²[+°03´O++° Ö´E++²+²+° /´U++°#/±$é°*/´5C+°a/°2Ö´-+°-±+´B<+°B±+°'2±<é°82²< +³@# +°<±H+±Ké°K±+´^+°^±R+´+°X Ö´+±b+±-2°09°°/9°B±*599°±@99°<²:E999±KH°9±^°9°X´ OT$9±U³X^$9±E[±/99±#Oµ-2RgFDK !YOCþ¼1/6Ý  YÿÅ3]qp²+°%3´7+²#+°>3´T+² +³@Y +°/´c+°^/°h3´+°2²^ +³@^l +´0/>Y +´0C+°8/´CC+°r/°@Ö´;+°;±'+´Q<+°Q±,+°52±Ké°G2²,K +³@,/ +³K,+´a+°K±W+±Zé³lZW+´m+°m/´l+°Z±+´&+±s+±;@°>9°'°=9°Q±8C99°,±)O99°²#IT999±Wa±^99±lm³c$9±Z¶eh$9±^c±99°°9±T±=99±/¶';@KQ$9°0±I99°8°G9°C°901%2654'7#"5463263267#"'#"'&54?654'#5327654&#"&5463232653"327.#"#54'&¾Sfˆ*¬EG|MSÙG0VFH?"]p0WK?=5eTC)†H0H0w~7F;¦ŒLBO=:.[*U_„Y!È*Œd@ <GmU­AK YOCþ¼1/6¡:+%(Yþ„Á2Lqu²M+°R3´f+°]2²fM +³@fb +° /±%33´=+´G++²G +³@GB +°7/´+°/´C+°/´+7+°r/°'Ö´"+°"±+´:<+°:±n+´i+³4in+±é°/°3±4é°/2²4 +³@ +°i±@+±Cé³bC@+´a+°C±J+´+³UJ+´Z+°Z/´U+±s+±"'°%9°°$9°:±+99°±799°n² 1=999±@i±kl99°b² Mf999±aC°P9°Z¶GRWLX$9±= °$9±7G² :999±²"'4999°²1J999°°/9°+°L901#"'#".54?654'&+53254#"&5476323265332654'2632'654&#"#54&#"&5476K]CFro1DÂ1YESC)%=44ixu€7F;SUŠ7aE=!<#<(Ud€Y!/Piˆë&: QP\x W=2%C+09['w/.2$‘`mOQLR/"OIIDxrjkzyˆPR>+b ,##6NP>þÂ//3rQ¥>þ&DnLŠ93)l4C0ææ.H4j'29ˆL87Yþ„Á2Lt²P+°S3´l+°d2²lP +³@lh +°Z/°s3´x+´a~hP +´a+° /±%33´=+´G++²G +³@GB +°7/´+°/´C+°/´+7+°‚/°'Ö´"+°"±+´:<+°:±M+´p+±/422°p±é°/°3²p +³@ +°p±@+±Cé°C°g Ö´h+°h/´g+°C±^+´u+°u±J+´+°z Ö´W+±ƒ+±"'°%9°°$9°:±+99°±799°M± =99°p°19°@³Plrs$9±Ch± R99±^g°S9°u²Gd999°z´TZLb$9±xZ°r9°~³MWp^$9±Pl°R9±= °$9±7G² :999±²"'4999°²1J999°°/9°+°L901#"'#".54?654'&+53254#"&5476323265332654'463262#"'&546;&#"#54&#"&%3254'&#"K]CFro1DÂ1YESC)%=44ixu€7F;SUŠ7aE=!<#<(Ud€Y!/Piˆþ;bLM!'®?=NB;H: ;b=- 1St¤!M 02$‘`mOQLR/"OIIDxrjkzyˆPR>+b ,##6NP>þÂ//3rQ¥>ýKOl:::9VJg.'4>U!Oäç ,%&1k#56Z/fYýöÁ2L…‘ã²X+°\3´M+°~2²MX +³@M‚ +°e/´j+°u/°S3´‰+° /±%33´=+´G++²G +³@GB +°7/´+°/´C+°/´+7+°’/°'Ö´"+°"±+´:<+°:±U+´P+³PU+°3±4é°/2²4 +³@ +°P±@+±Cé°‚ Ö´+°C±x+´†+°†±‹+´r+°r±J+´+°b2°´m+°m/±“+±"'°%9°°$9°:±+99°U²8999°°79°P± =99°4°S9°‚²MRX999±@°Z9°C° 9±†x²\g~999°‹·GehjuL|$9°r²^p999±je°g9°u°h9°‰°R9°M@ PU^bmprx$9°X°Z9±= °$9±7G² :999±²"'4999°²1J999°°/9°+°L901#"'#".54?654'&+53254#"&5476323265332654'"&54632632#"'732654&'#"&54767&#"#54&3254'&#"K]CFro1DÂ1YESC)%=44ixu€7F;SUŠ7aE=!<#<(Ud€Y!/Piˆþ§0?Ps`PI!)M‚$M)*sX:2&+@Q)" <<3@##3B[=,Ü ?%32$‘`mOQLR/"OIIDxrjkzyˆPR>+b ,##6NP>þÂ//3rQ¥>ýÉJ3l&46ŒNp22R 79U^Š#4fE0N !H\T8910Méé!,¶2\3%>YþÁ2LS[cq²R+´\++°O/´Z+° /±%33´=+´G++²G +³@GB +°7/´+°/´C+°/´+7+°d/°'Ö´"+°"±+´:<+°:±+°2±4é°/2²4 +³@ +°4±@+±Cé°_2°C´O+°O/°C±b+´X+°X±J+´+³NJ+´[+°[/´N+±e+±"'°%9°°$9°:±+99°±799°4± =99±CO° 9°b´GRZ\$9°X±VL99°[°9±\Z±X`99°R°V9±= °$9±7G² :999±²"'4999°²1J999°°/9°+°L901#"'#".54?654'&+53254#"&5476323265332654'!54324'3'"654K]CFro1DÂ1YESC)%=44ixu€7F;SUŠ7aE=!<#<(Ud€Y!/Piˆ“þ”¸´=Ldš+,€2$‘`mOQLR/"OIIDxrjkzyˆPR>+b ,##6NP>þÂ//3rQ¥>ý@ª§ÉÆl (]W÷M8kVZ@YýÂÁ2L^fnyIJV+´g++°M/´o+°u/´f+° /±%33´=+´G++²G +³@GB +°7/´+°/´C+°/´+7+°z/°'Ö´"+°"±+´:<+°:±+°2±4é°/2²4 +³@ +°4±@+±Cé°j2°C´S+°S/°C±P+´w+°w±m+´c+°c±J+´+³YJ+´f+°f/´Y+°\2°Y´r+°r/±{+±"'°%9°°$9°:±+99°±799°4± =99±CS° 9±wP²Reg999°m²GV999°c´MaLou$9°f±t99±Jr°Z9±uo±\P99°f³SYZR$9°g±ck99°V°a9±= °$9±7G² :999±²"'4999°²1J999°°/9°+°L901#"'#".54?654'&+53254#"&5476323265332654'"&547#5432#4'3'"6542654&"K]CFro1DÂ1YESC)%=44ixu€7F;SUŠ7aE=!<#<(Ud€Y!/Piˆ2Kޏ´JLdš+,€2*+<+*2$‘`mOQLR/"OIIDxrjkzyˆPR>+b ,##6NP>þÂ//3rQ¥>ûÈK2/"§Éƪ#.3Jxl (]W÷M8kVZ@þ7*,,*Yý¤Á2IZbjp€è²R+´c++°J/´q+°y/´p+°m/´b++° /±$33´;+´D++²D +³@D@ +°6/´+°/´C+°/´)7+°/°&Ö´!+°!± +´9<+°9±+°2±2é°-2²2 +³@ +°2±>+±Aé°f2°A´O+°O/°A±M+´~+°~±i+´_+°_±l+´v+°v±G+´+³UG+´b+°b/´U+°X2°U´t+°t/±‚+±!&°$9° °#9°9±)99°±599°2± ;99±AO°9±~M°N9°iµRDca{$9°_¶J]Impqy$9°l°9±Gt°V9±yq°L9±mpµMXtv|~$9°b³OUVN$9°c±_g99°R°]9±; °#9±6D² 9999±²!&2999°²/G999°°-9°)°I901#"'#"&546;2654&+53254#"&54632+"3265332654'"&47#5432#4'3'"6544#"32654'#"&'K]Žmo1DÂt[*)Cx4ixu€7F;¨Š7aE=!="<sd€Y@+Piˆ9S(ƒ¸µ#'RLešœ,,€V+..%2 + - 52$‘`qœLR+7).IIDxrjkzy‡£>+b ,#$; #NP>þÂ4]rQ¥>ûªRr(§Éƪ(98S–l (]W÷M8kVZ@þoXXV2%!.+$3YýìÁ2I_gpx¬²R+´j++°Z/´s+°w/´J+°O/´f+° /±$33´;+´D++²D +³@D@ +°6/´+°/´C+°/´)7+°y/°&Ö´!+°!± +´9<+°9±+°2±2é°-2²2 +³@ +°2±>+±Aé°A°o Ö´O+°O/´o+°A±]+´q+°q±h+´d+°d±N+°`2´U+°G Ö´+±z+±!&°$9° °#9°9±)99°±599°2± ;99±O>°9±hq@ JRXDfjsw$9°d³Ibu$9°N°L9±ws°]9°J°L9±jf±do99°R°b9±; °#9±6D² 9999±²!&2999°²/G999°°-9°)°I901#"'#"&546;2654&+53254#"&54632+"3265332654'267!5432#"#"&54674'3'4#"63254#"K]Žmo1DÂt[*)Cx4ixu€7F;¨Š7aE=!="<sd€Y@+Piˆ#W"þѸ±cQ3RG¼Mdšt)#€US4M:2$‘`qœLR+7).IIDxrjkzy‡£>+b ,#$; #NP>þÂ4]rQ¥>üv'7£ÊÈ¥MY$$Èm )`U·B%ClWñZÿ)W3Y#²+°53´T7+²T +³@TP +°° Ö´J++°/´+°$/±(é°//´:C+°Z/°Ö´ +° ±7+´2&+°2±+´H<+°H±!+°,2±Bé°>2²!B +³@!' +°B±N+±Qé°Q±W+´&+±[+±7 ± 99°2°59°°49°H²$/:999°!²F999°B²@999±QN°9°W³Y$9±J°49±$Tµ27BH$9°(´ @W$9°/°>9°:± Y9901! 473 7#"'#"54767654+#5327654&#"&54632#"3265332654'®L]ýý„`9VR—É~hp;e.H;S,)K% B&G0x~7F<®GAN=:JL #2AbƒV=8E\Š3'eþí–†*yyq§e0”N]iQ 'O8%'€xor„z¯")Bi CWZRNþ²BU}Pµ<Zþ|W3isÙ² +°B3´d7+²d +³@d` +° °$ Ö´[++° /´k++°/´++°//±5é°3´]7+²] +³@]Y +°°# Ö´T++° /´o++°w/´c+°/´++°N/´*+°0/±1é°8/´CC+°/°Ö´+°±@+´;&+°;±&+´Q<+°Q±-+°52±Jé°F2²-J +³@-0 +°J±W+±Zé³ZW+´|+°Z±f+´t+°t±`+°r2´&+´+±€+±@±99°;°>9°&°=9°Q±8C99°-±)N99°Jµ#HMT$9±W°!9°Z°9±f|@ ]blow$9±c³r|$9°´fltz$9°#±i99±T°=9±N]²&!Q999±0*²;@J999°1´H`$9°8°F9°C±b9901#"&547# 47! 7#"'#"&546;2654+532654&#"&54632+"3265332654'2654&#"2654'#"&'®L]‡4GjJIk |œý„`9V*qm;e.H¼if+(BRS5;5G0x~7F<®O‡=:.S1BbƒV=8E\Š"##!/D8*)9 D3'œfáx^=JjjJ%í–†*yyþV‘N]09+6&O ,%'€xor„z¯P=Y G$@YSNþ²BU}Pµ<ý ""!!qD.!+=9'.DZÿ 23Ÿ²'+°/±é°/±é° /´-7+° 2°4/° Ö´+°±)+´$+°$±+´&+° Ö´0&+±5+±)± 99°$°'9°µ&-$9±'²&999°´ $)$9° °09°-° 901%#"&54732654&+53254#"&547632Á).Y[нÃd:XfV}bŽM5CCzšt>3:K9EQšl|ÚhBwDFôѾ*sȲ^QdV6QX_ƒRBbdƒ‡…{Vddb2&+Zþ.2>Jë²2+° /´?++°/±é°%/±&é°+/´87+°2°K/°Ö´+°±4+´/+°/±+´H+°H±!+°B2´&+°) Ö´;&+°!´+±L+±4±99°/°29°°19°H³%&$9°)¶ +8?E$9±?³BH$9°±E99±%2²!1999°&´/4$9°+°;9°8°901%#"'&547#"&54732654&+53254#"&5476322654&#"Á).aW/.FD./¾Âd:XfV}bŽM5<3:H/°Ö´1+°±%+´(1+°(±+´;+°;±0+°52´1+´+±?+±%²999°(°9±;°9°0´ ,2$9±3³6;$9°!°901#"&547&'#"'&5467327653327654'264&#"ôM_fX//DB`!Q%5lrID_N&ƒfQ2P$$6R1/„$(88('99.$–d–S-dB10aB6+>TUPsg˜%=?­Vr+*/`þ 3)(@;Rª=ýE8P88('9YþÏ .-9IÞ²+°43±é°(2²+²+° /´:++°B/´.+°J/°Ö´1+°±"+´%1+°%± +´G+°G±E+´7+°7±1+´?+°?±++°=2´1+´+±K+±"²999°%°9±G °9±7E°(9°1´ -:B$9°?°9±.· 17=?EG$9°°901#"&547&'#"&54673265332654'2654&#"2654'#"&'ôM_m^iKIl1B5lo_N&ƒfQ.BPJ4Nd„#$"!/D9*)7D.$–džO4lJjkID62T£uf™%=?­VrR2`þ 5OyTª=ý‘"""!qD.!,<9(.DYÿ¡.4?£²+°3±,é°2° /´>++°8/´7+°@/°"Ö´(1+°(±+´:1+°:±/+´2&+°2±+±é±A+±(°%9°:²&,999°/±899°2² >999°µ5$9±8>±99±,°901%2654'7#".543267#"'#"'&5467326534&#"32–Sa~'®p}»8aE®CAN D69Hx'+yuHD`L(ƒ,/R4LOBa+b7(%jFmW¦B;aܺ’¢;+d0.p!XXTPta–#>A P:>N4[þ¥2QÜ  Yþÿ¡.5Hв+°3±-é°2° /´;+°6/°@3´+°2²6 +³@6D +°I/°#Ö´)1+°)±+´9+°9±0+´3&+°C2°3´E+°E/°3±+±é±J+±)°&9°9²'-999°0±699±3E³ ;$9°¶=@$9±6;²=999°°9±-°901%2654'7#"5463263267#"'#"'&546732653"327.#"#'4&–Sa~'®w€°ØD1U IL=&:Mx'+yuHD`L(ƒ,/R4LOBÇ&‡`@ 92FmW¦B;aÜ»– z,5%'F+\!XXTPta–#>A P:>N4[þ¥2Q£:,)- Yþ„ .)N̲*+°/3´C+°:2²C* +³@C? +° /°3´7+°#2°O/°Ö´1+°±K+´F+°F±+´ 1+° ±?+´>+°>±'+´1+³2'+´7+°7/´2+±P+±K±99°F± 99°±HI99° ² *C999±>?°-9°7¶#/4)5$901#"'#"'&54767327653327654'2632'654&#"#54&#"&5476ôKaEHvr25lqJD*.U&ƒfQ0 PJ4R1/„í%: RO\x W=2&B+19['w/..“^oNQPPPMkYKO#98©Rk'(.Mþ³3J=8N¤7þ 'DnLŠ93)l4C1ææ.G5j'29ˆL87Yþ„ .$IU²C+°F3´8+°02²8C +³@84 +°(/°>3´T+´.N4C +´.+°/°3´7+°2°V/° Ö´1+°±@+´;+°;±+´1+°°3 Ö´4+°4/´3+°±++´Q+°Q±+´1+°J Ö´%+±W+±@° 9°;°9°µ8=>C$9°4°9±3°E9°+°F9°Q²0999°J´"(!G.$9±T(°=9°N³%;@+$9±C8°E901#"'#"&54673265332654'7#"&5463&#"#54&#"&54632624'&#"32 ’qr25lm’`M&ƒfQ.BPJ4Me„(Ka,NB4@M>!:b=- />SubLM!'®?=@"/ Ms›PP˜pc“ 98©RkM0Mþ³3JrQ¤79“ý»KfO:BQ!Oäç ,J2k#56‹Ol:::9a!5/Yýö¨.)co0²5+°93´*+°\2²*5 +³@*` +°B/´G+°S/°03´g+° /°3´7+°#2°p/°Ö´1+°±2+´-+°-±+°`2´ 1+´_+° ±V+´d+°d±i+´P+°P±'+´1+°°? Ö´K+°K/´?+±q+±-2°9°µ /05$9°_± 799±dV²9D\999°i@ #BEGS)Z$9°P±;N99±GB°D9°S°E9°g°/9°*@ -2;?KNPVm$9°5°7901#"'#"'&54767327653327654'"&54632632#"'7327654&'#"&54767&#"#54&3254'&#"ôKaEHvr25lqJD*.U&ƒfQ0 PJ4R1/„þ¶0?Ps`PI!)M€&M))rX:2&+?))*" ;<3@""5BZ=,Ü ?%3.“^oNQPPPMkYKO#98©Rk'(.Mþ³3J=8N¤7ýÎJ3k'46ŒNp22R 78V_‰#434D0N !I[T8;/0Méé!,¶2\3%>Yþ .)08@½²/+´9++°,/´7+° /°3´7+°#2°A/°Ö´1+°±+°,2´ 1+´=+° ±?+´5+°5±8+´++°+±'+´1+±B+±² 999°=° 9±? ²/79999°5³#)3$9°8°9±97±5=99°/°3901#"'#"'&54767327653327654'!54324'3'"654ôKaEHvr25lqJD*.U&ƒfQ0 PJ4R1/„wþ“¹´=Me›ž+,€.“^oNQPPPMkYKO#98©Rk'(.Mþ³3J=8N¤7ýEª§ÉÆl (]W÷M8kU[@YýÀ .);CKT ²3+´D++°*/´L+°Q/´C+° /°3´7+°#2°U/°Ö´1+°±+°02´ 1+´H+° ±-+´S+°S±J+´@+°@±C+´6+°92°6´O+°O/°6±'+´1+±V+±² 999°H° 9±S-²/BD999°J°39°@¶#*)>LQ$9°C±P99±6O°79±QL±9-99°C³067/$9°D±@H99°3°>901#"'#"'&54767327653327654'"&547#5432#4'3'"654264&"ôKaEHvr25lqJD*.U&ƒfQ0 PJ4R1/„ 2K ¹´"IMe›ž+,€1--<**.“^oNQPPPMkYKO#98©Rk'(.Mþ³3J=8N¤7ûËK20#§Éƪ"13Jzl (]W÷M8kU[@þ6*<--<*Yý§ .$6>FN^G².+´?++°%/´O+°W/´M+°I/´>+° /°3´7+°2°_/° Ö´1+°±+´1+°B2°´++°+/°±(+´\+°=2°\±E+´;+°;±G+´T+°T±"+´1+³1"+´>+°>/´1+°1°4 Ö´R+°R/´4+±`+±² 999±+°9±\(±*?99°E³.Y$9°;·%$9IKMOW$9°G°9±1R°29±IMµ4(RTZ\$9°>³+12*$9°?±;C99°.°9901#"'#"&54673265332654'"&547#5432#4'3'"6544#"322654'#"&'ôKa’qr25lm’`M&ƒfQ.BPJ4Me„9S$„¹´%R Mdš,+€Z+..+*$3 + - 5.“^s›PP˜pc“ 98©RkM0Mþ³3JrQ¤7û²R97'§Éƪ(68S“l (]W÷M8kVZ@þž,,-V4$!/,$4Yýì .)?GPZ²2+´J++°:/´T+°Y/´*+°./´F+° /°3´7+°#2°[/°Ö´1+°±+´ 1+° °O Ö´/+°//´O+³= +´Q+° ±H+´D+°D±.+°@2´5+³'5.+´1+±\+±² 999± /° 9±HQ@ #28*FJTY$9°D²B)V999°.±,99±YT°=9±JF±DO99°2°B901#"'#"'&54767327653327654'265!5432#"#"&54674'3'4#"63254&#"ôKaEHvr25lqJD*.U&ƒfQ0 PJ4R1/„@^#þѺ°cQ3SBÁIc—r* €U.#5*":.“^oNQPPPMkYKO#98©Rk'(.Mþ³3J=8N¤7üƒ(.¢ÌÈ¥MY'% Àm '_V·@&BkVí  Wÿ#6/9в,+°(3´C+° 2°/±$é°:/°Ö´ +° ±0+´6<+°6±+´1+°±+´<+±;+±0 ±99±6´$,34$9°°*9°³&($9±,°&901%2653327654'7!"'&547327#"'#"'&5467í3KP!1U32€'«i~þÿö…|J:;jvÓÛj05y'+zvGDbN&„+2IY÷²3+°/3´C+° 2°/´J++°R/´@+° /±+é°Z/°#Ö´(+°(±6+´<<+°<±+´1+°±+´W+°W±B+´O+°O± +´<+°2°´M+°M/±[+±6(±%&99±<´ +39:$9°°19±W°9°B@ -/HJR$9± @³MW$9°+µBEHOU$9°3°9°°-901%265332654'7#"&547#"547327#"'#"&54672654&#"2654'#"&'í3KP@/Rh€'«„6IjKIj ;JçþðJ:;ëÈÛj05y'+zrbN&„_Å0"#!:0C9*(9 B+±%-²/999°$° 9±3:´  $9±0%°/9°7³-$9°°9°)° 901.547632632#"&547632&#"#4&#"%2654'&#"N_HGu30.AŠ…Z[6>lY^:;e aL3*V:?kD=‡`^V5.UNK5R41„:<% F-.'”dw¦O%~TUƒ”ei1?-VOvÆ'7FlˆB;UZHL8K<þ¡_6QB;S©=VEXA34E2).YÿÄ24?¥²+°/´8++°>/´7+°//°&3±é° 2°@/°Ö´21+°2±+±5é°5±++´*1+°*±#+´<+±A+±2°9°5²/4999±*+´ 8>$9°#² :999±>8±99±/´ #*$901.547632632#"'&54>3267654&#"#4&#"3254'&#"LaHGuk98zƒKCvxÏL­# YÿÄ21Eç²+°/´7+°2/°<3´+°2²2 +³@2@ +°,/°#3±é° 2°F/°Ö´/1+°/±+´5+°5±(+´'1+°'°@ Ö´A+°A/´@+°'± +´<+±G+±/±199°5±,99°(±299°A° 9°'²7999± @³ #9$9±27²9999°°9±,´  '$901.547632632#"54632632654&#"#4&#""327.#"#5&'&LaHGuk98zƒKCs|¾ßJ1WGI!Šc_†:+%(Yÿòõ-:D˲0+²$+±33±;é°4/±+33´C+± 22°E/°Ö´81+°8±0+´/1+°/±'+´C1+°C±>+± é° ±+´&+±F+±08²:999°/° 9±C'± +99°>³ $)$9° ±99°±99±;0±:99°4@  ') 8A$9°° 901.547632632632'654&#"#"&547&#"#4&#"%2654&'N_HHtn63Q28awžŠ.m€Y&4##6:TYiw!!@OPK4Q1/‰2;A0o%–dwRSSS))ªy»]/M•YŠ $RNBWDI‚b£_ I>þ¡_5P@;S®>\>Dx!J“šZÿ0ú-HPû²+´$++²"+°/´++°2/°3´O++°9/±+B33´ ++±22°Q/°Ö´E&+°! Ö´1+°E±>+´=&+°=±5+´M<+°M±I+±/é°/±(+´1+±R+±>µ$BH$9°=°9±M5± 999°I³ 2-7$9°/³+%$9±(±99±°!9±O2²=>H999°9·(/5EK$9° ° 901%.54632632632#!"3!!"&5463!2654&#"#"&547&#"#'4&#"%4'32Jb”ln83Z/7^{ŸŸ{ý0#66#Þü@__@Ì_zy`anJRch+?PNL3MbJ=v`ecbazRePP ˜x|¡$ +DR=:J|a\lStJldRpVD=úú4LSGF_ }j<>hqZÿ0ô.U]'²+´++²+°/´ ++°+/°A3±\é°/±é°2/±$;33´K++±GP22°^/°DÖ´>&+° Ö´ 1+°>±7+´6&+°6±.+´Z&+°Z±V+±(é°(±+±é°T2°±!é°!/²! +³@! +±_+±7 µ;@AG$9°6°I9±Z.±2K99°V³+&M0$9±!(³$P$9±² 999± °9±\+´67@$9±´(.VZ$9°2¶&0>DITX$9°K°M901#!"3!!"&5463!2654&+53254&#"#"&547&#"#'4&#".54632632>324'32·$UAü²Y6#×üD[\C?%7*/)Gd?: YgIQ]h.S N3/6?g&4##6:T]50G56@OPK4Q1/‰29@/.?^'i_,c%˜bwRSSS%%f_‘¿‹#B2236pgWdKV $PQ?SBEA>[P)I>þ¡_5P@;S®>V54'&#"#"'&5467&#"#4&#"%2654&'"327&#"#'4'&LaHHtn65Ž[.3`†PHw~¹ÝH2WCK;T6?g&4##6:T]50G56@OPK4Q1/‰29@/.?"(ŽfA1 <%˜bwRSSS%%f_‘ºŠ“{,602F?°YdKV $PQ?SBEA>[P)I>þ¡_5P@;S®>VPOJ4R1.†„ror7%—cxQSSS%%f_éwdqƒÿ–†+pÝp_ScÇeMN 'MOCYAJ‚b¦bJ=þ¡_6O@:T¯=­ˆQLš5,Zþ|›2[eo=²Q+²D+°3±bé°/´g++°#/´27+°U/±:K33´C+± 22°p/°'Ö´,+°,±+´Y<+°Y±Q+´P&+°P±G+´`1+°`±\+±@é° Ö´n+°@±6+´&+°i Ö´+±q+±,±)*99±QY²[999°P° 9°G±#299°`° 9°µ POJ4R1.†„ror7dN98('9%—cxQSSS%%f_¼rS7D/0`C+q‚–†+pYbCScÇeMN 'MOCYAJ‚b¦bJ=þ¡_6O@:T¯=­ˆQLš5,þ 9P88('ZþW›2U^iy†²L+²@+°3±\é°/´j++°r/´_+° /´17+°P/±8G33´C+± 22°z/°&Ö´++°+±+´S<+°S±L+´K&+°K±C+´Z1+°Z±V+±=é³w=V+´+°/´w+³g=V+´u+°u/´g+°=±b+´o+°o±5+°m2´&+´+±{+±+±()99±LS²U999°K°9°C± 199°Z± G99°´ @EX\$9°V±:99±uw°89°g°9±b=µ_ejr$9± _³mw$9°1´bgou$9°@²de999±\L°U9°P@ &+5:=CESX$9°± )9901.54632632632#"&547#".547327654&#"#"&547&#"#4&#"%4'3262654&"2654'#"&'¦L`‘sn65X03_z¡Š5HiKIl …¤tÊ­{F_8N?nš²eñž¾|_""0KrQYj|4>POJ4Nc†„ror3<‚##0"!/D9*(8D%—cx¤SS%%Á…½r]>KjkJ!$#Ns¨g–†+pYbCScÇfš #šIZŠ‚b¦bJ=þ¡_6OxV¯=­ˆQLš]þp#! "pD. +<8(.DYÿòõ.2<½²+²+°'3´++°72°,/±#333±é± 22°=/°Ö´01+°0±(+´'1+°'± +´&+²  +³@  +°±+´71+°7±8+´&+±>+±(0²2999°'° 9° ° 9°°9±87°9±±299°,´ 0$901.547632632347632!5654&#"#4&#""!4'&M`EJui;7itHC@²FHdcHFüõgdS/APH7Q3-‰ÑB_C0.%–dwOW]]TOtUÿcEFCBbþ¹/F¦WtS4þ¡_5P@¼bBþÿA20Yþùö.=GQ ²+²(+²2M333´++°B2°"/´H++°7/±.>33±é± 22°R/°Ö´;1+°;±3+´21+°2±++´&+²+ +³@+( +°±+´B1+°B±%+´P+°P±C+´&+°2°´K+°K/±S+±3;²=999°2° 9°+° 9°°9±P%°'9°C´>"HM$9±K°9±H³%KO$9±(±)=99°7´ +;$901.547632632347632##"&547!5654&#"#4&#""!4'&264&#"M`EJui;7itHC@²FHdcHF!"_CB_!þgdS/APH7Q3-‰ÑB_C0. (88('99%–dwOW]]TOtUÿcEFCBbþ¹+9C``C8,6C¢WtS4þ¡_5P@¼bBþÿA20ýV8P88P8YþÔõ.8@L\)²+²$+².G333´++°=2°/´M++°U/´A+°3/±*933±é± 22°]/°Ö´61+°6±/+´.1+°.±'+´ &+²' +³@'$ +° ±+´=1+°=±!+´Z+°Z±D+´R+°R±>+´&+°2°´P+°P/±^+±/6²8999°.°9°'° 9° °9±Z!±#:99°Dµ9JMU$9±P°9±A·!DJPRXZ$9±$±%899°3´ '6$901.5463263234632##"&547!5654&#"#4&#""!42654&#"2654'#"&'M`’ri;7ip@²ŽdcŽ-,kJIk-þ2gdS0@PJ5Nc‰„_Ch""!!/D9*(9 C%•ex¥]] wUÿc‹†aþ¹4CIllID36C¢WtS4þ¡_6OxV®>¼bBþÿBþ" !pC/+<9'.DYÿõ.>FRê²+²*+°43´++°C2°/´G++°M/´$++°9/±0?33±é± 22°S/°Ö´<1+°<±5+´41+°4±-+´ &+²- +³@-* +° ± +°2±Pé°B2°P±D+°)2´&+±T+±5<²>999°4°9°-° 9° °9±DP´$'J$9±MG³ 'JP$9±*±+>99°9´ -<$901.5463263234632#".54>3265!5654&#"#4&#""!42654&#"M`’ri;7ip@²ŽdcŽ’v&LD*9M*B{ ý@gdS/APJ5Nc‰„_CÄ#?X,!¼bBþÿBýÀYÿõ.@H[)²+²,+°63´++°E2°/´N+°I/°S3´!+°%2²I! +³@IW +°;/±2A33±é± 22°\/°Ö´>1+°>±7+´61+°6±/+´ &+²/ +³@/, +³ /+´L&+° ±+´E1+°E±X+´W+°W±++°F2´&+±]+±7>²@999°6°9°/° 9°°9±E±!I99±WX²#N999°+³%BP$9±IN±(99°!°#9±,±-@99°;´ />$901.5463263234632# 54632632>5!5654&#"#4&#""!4"3274&#"#5.M`’ri;7ip@²ŽdcŽ_œdþõU6_O*G ýDgdS/APJ5Nc‰„_Cþ{-¤qL+&C7%–dx¥]] wUÿc‹†aþÇX}9.9345$1&6C¢WtS4þ¡_6OxV®>¼bBþÿBþ$@)*&"YÿðÊ.=¨²,+²+°73´C+°/´ 7+°0/°&3±é°2°>/°:Ö´41+°4±,+´+1+°+±+°#2´1+° 2±?+±,4²67999°+°9°³$9°°9±,°69°±99° ²4:999°0± 9901267632#"'5;2654+53254&#"#4&#".5476]5fA?qEHnk>D21PI6Q1/‰-N_HG.:&+$,S"&$ a£I2+ZGR+0&%>þ¥_7N@;S®>8%–dvTSYþêÊ.FRç²5+²M+°@3±"é²+°/´G++°(/´)7+°9/°/3±é°2°S/°CÖ´=1+°=±5+´41+°4±+´P+°P±%+±,J22´1+° 2´+±T+±5=²?@999°4°9±P² 999°%µ")/($9°±99±MG±99±"5±?99°(± 99°)²=C999°9± 9901267632#"&547&'532654+53254&#"#4&#".54762654&#"]5fA?D21PI6Q1/‰-N_HG0(87)'89.:&+$,S"&$ aW/2NC`aB=-S3*ZGR+0&%>þ¥_7N@;S®>8%–dvTSüÿ8()78(&:YþÆÊ.@IY²1+°;3²F+±é²+°/´J++°R/´A+°%/´&7+°5/°,3±é°2°Z/°>Ö´81+°8±1+´01+°0±+´W+°W±D+´O+°O±"+±)M22´1+° 2´+±[+±18²:;999°0°9±W²999°D@ &,%GJR$9±"O°9°° 9±FAµMOUW$9±1²:999°%±99°&² 8>999°5± 99012>32#"&547&'532654+53254&#"#4&#".546264&"2654'#"&']5f@a‹/NSFiKJk6 z/=qEHnj?DcPI6Nc‰-N_’$#0""0B9*': C.:&'9UN'F a]-6XKjkJK6V 2+ZGR+0L=þ¥_7NyU®>8%–dw¦ýK#.! 0"pC/,<9'/CYÿë.ERÛ²$+´F7+²+°/´M++°./±/é°?/°63±é°2²? +³@?; +°S/°Ö´C1+°C±;+´:1+° Ö±Ié°:±*+´1+°2°´3<+°3/²3 +³@3/ +±T+±;C²E999±: ° 9±3I¶$(6O$9±FM± (99±.²*E999°/°9°?³ C$901.54763267632#"'&547632654&+532654&#"#4&#""3254'&N_HGu365 B„ %Yÿ"t2?À²0+°:3°/´++°!/±"é°4/°*3±é°2°@/°Ö´+°±=+´71+°7±0+´/1+°/±+°'2´ &+° 2±A+±=±99±07²9:999°/²999°±!99° ° 9±!0² 9999°"° 9°4¶ '7=$9°°9012632! '&473 54+5327654&#"#4&#".5465d9¢cAMMMþ-þÿ—°T@Lš…à…p6+0&%UCG8APH7Mcˆ-L`Ž.2%X/5bo$+|þól}£‚,n‹áj[ÉtR2=E %Aþ _5PyU®>8%—cw¦Yþ?t2LT ²=+°G3°/´N++°/´)++°./±/é°A/°73±é°2°U/° Ö´%+°%±J+´D1+°D±=+´<1+°<±+´T+°T±++±4O22´ &+° 2´+±V+±J%±"#99±=D²FG999°<²)999±T°9°+¶./7$9°° 9±N³PS$9°)²QR999°=°9°.² +F999°/° 9°A¶ %4DJ$9°°#9012632"'&547# '&473 54+5327654&#"#4&#".546264&"5d9¢cAMPPiX0.Š./9Tþÿ—°T@Lš…à…p>30&%UCG8APH7Mcˆ-L`ŽN98P8.2%X/5bo$-zuI.aB2//1C'!l}£‚,n‹áj[ÉtR2=E %Aþ _5PyU®>8%—cw¦üS9P88PYþt2FQa-²7+°A3°/´R++°Z/´G+°/´%++°*/±+é°;/°23±é°2°b/°Ö´"+°"±D+´>1+°>±7+´61+°6±+´_+°_±J+´W+°W±'+±/U22´ &+°2´+±c+±D"± 99±7>²@A999°6²%999±_°9°J·+2*ORZ$9°W°9°'° 9±G·JOUW]_$9°%²LM999°7°9°*² '@999°+° 9°;¶"/>D$9°° 9012632#"&547# $5473 54+532654&#"#4&#".5462654&"2654'#"&'5c9¢gŠPPmaiKIk,FþðþÁT@Lï~p>32IUCKuPJ5Mcˆ-L`%#$.#!/D:*(8 C.3$Xj\o$-zƒB3nJjjJ4*øó£‚,n‹ÓÓÉtR>0=EI=þ _6OyU®>8%—cx¥üš"""!qC/ +=9'.DYÿòw.GIJ+² +±#33±6é°A2°/°3´.7+±*22°H/°&Ö´ 1+° ±+´<+°±+´3<+°3±:+±=é°=±E+´+±I+± ²"#*999°°,9°°.9±:3° 9°=° 9°E²G999±6°"9°· &,2E$9°.²;2°X/°6Ö´01+°0±'+´&1+°&±+´C1+°C±I+´L<+°L±+´V+°V±+°Q2´&+´ +±Y+±'0²239999°&°<9°°>9±IC°9°L°9±V°9°´ $9±P± 99±F'± 299°,·06?H99901#"&547&'#"&=4&#"#4&#".546326323265332654'2654&"2654'#"&'ËM_jbiKIk.F4m_’d@1>RI5Nc‰-M`’rq33m`eB/>TI4Oj‹#$.#!/D:*(8 C.$–d›Q1pJjjJG25T|Z’3232653Qb{"¨þâºþ|þ4ÅÎW9H϶Žö†Ëe!%w(*weXE7JOJ4S^…+L`EIvy*b?j|ZC3GS!:vY©E3232653264&#"Qb{"¨”d`CB_Ÿþ®þ)¾É49Hɰš sÉd!%w(*weXE7JOJ4S^…+L`EIvy*b?j|ZC3GS!_'98('9::vY©E7#"'#"&=4&#"#4&#".54632>32326532654&#"2654'#"&'Qb{"¨Œ5GkJIk Ÿþ®z³¿„zI+&19H*Fr{¬ jihŸYnQ$!%w(*weXE3NOJ4Pa…+L`‘sy*a?j|ZC3GS@j"#!!/D9*': D:vY©EJjkI%',Jh“^[lN$v{PY@&0" [Zn\ @GM1þš_6OyU¬?9%—cy¤\+1uf–YÿòU.:Hʲ0+°&3²+°3±;é°C/±é°+/±"433´ C+±22°I/°Ö´81+°8±0+´/1+°/±'+´&1+°&±+´F&+°F±>+´1+±J+±08²:999°/° 9°'° 9°&° 9±>F´" $9±;0°:9°C³8$9°° 9°+± 9901.547632632632#"&547632&#"#4&#"#4&#"%2654'&+"LaHGuk93sz0?Œ‚\[7>jY_;;daL3*U;UN&%:8CPK4Q1/‰M:;% D/-%˜bvTSTTT&~ ZS€‹ed,C(NMnÆ'9Dm‡zX\’8K<þ¡_7(&K:þ¡_5P@;S®> WDXA31H4),Yÿó.=GѲ+´F7+²0+²+°/´A7+°)/± 33±7é±:22°H/°3Ö´-1+°-±%+´$1+°$± +±>é°>±+´1+°±+´1+±I+±%-²/07999°$°99° °:9°>° 9°²;F999°²8$˜cvTS]]]]ýT!%Yÿ,ª2G½²=+±233°/´$++°A/±.833±é± 22°H/°Ö´+°±+´E<+°E±=+´<1+°<±3+´21+°2±*+´&+±I+±±99±=E²G999°<° 9°3³ $$9°2° 9°*°9±A=· * G$9°°901.54763262632# 4732>54'&#"#4'&#"#4&#"¦MaIGui;7Þ;9nMF?o¦Àwý:e9V`µÞ’i¦`718Y:FP&%98DPK3S1.‡$˜cuUS]]]^b]}ggAê–†1twx©](7XˆY^FML<þ¡_7(&L9þ¡_5P@:T®>Yþ|ª2PZ ²F+±;33°/´Q++°!/´-++°J/±7A33±é± 22°[/°#Ö´(+°(±+´N<+°N±F+´E1+°E±<+´;1+°;±+´Y+°Y±3+°S2´&+´+±\+±(±%&99±FN²P999°E° 9°<³ !-$9°;° 9±Y²7999°3±99±!Q³SY$9°-²TX999°F±V99°J· #(3 P$9°°&901.54763262632#"&547# 4732>54'&#"#4'&#"#4&#"264&#"¦MaIGui;7Þ;9nMFz.@`CB_Áý:e9V`µÞ’i¦`718Y:FP&%98DPK3S1.‡*'98('9:$˜cuUS]]]^b]}ËoT6C``C"ê–†1twx©](7XˆY^FML<þ¡_7(&L9þ¡_5P@:T®>þ”9P89N:YþOª2LXh-²C+±933°/´Y++°a/´M+° /´-++°G/±5>33±é± 22°i/°"Ö´'+°'±+´J<+°J±C+´B1+°B±:+´91+°9±+´f+°f±P+´^+°^±2+´&+°\ Ö´+±j+±'±$%99±CJ²L999°B°9°:³ -$9°9° 9±f°9°Pµ 5VYa$9°^°9± M³\f$9°-´PV^d$9°C±S99°G· "'2L$9°°%901.5463262632#"'&547# 4732>54&#"#4&#"#4&#"2654&#"2654'#"&'¦Ma“ri;7Þ;9ny™‰2DkJH75 t¨ý:e9VAp¦»s„ÅœQlV:FPL87EPK3Oc‡"#"!/D9*': C$™bw¦]]]^¸„Õq\þØ""!!pB/#,<9'.CYÿòü.%.–²+²+´%++° /°3±é°2°±(é°//°Ö´1+°±+´-+°-±&+±!é°!±+´&+±0+±²999°-°9°&±%99°!°9±%°9°(´!-$901>3 !4'&#".54763254'4#"6,XY ýã&%9Q3-‰-M`EJu€Ó=',XVG7'.ÓÑ6'þÓþÿ`6(&@8%–dwOWþ¾Îe>KWC)n3=i¹…Yþöý.&09Có²+²?+±'é²+°3´0++° /´;++°/°*3±%é°2°%±3é°D/°!Ö´1+°±+´8+°8±+´B+°B±1 +±,é°,±'+´&+° 2°´=+°=/±E+±²%999°8°9°±0399°B±99°,±*:99°'² ;?999±=°9±;³ =B$9±'°9°3´!,8$901>3 ##"&547#4'&#".54763254'4#"6264&#",XY $%_DB_$þ&%9Q3-‰-M`EJu€Ó=',XVG7'.Ó8N98('9Ñ6'þÓþÿ,;C``C:-`6(&@8%–dwOWþ¾Îe>KWC)n3=i¹…þk9P88('YþÐý.#,4@O)²;+°3±$é²+°3´,++° /´B++°I/´5+°/°'3±"é°2°"±/é°P/°Ö´1+°±+´3+°3±+´N+°N±-+±)é³>)-+´L+°L/´>+°)±8+´F+°F±$+´&+° 2°´D+°D/±Q+±²"999°3°9±N²,/999±-L°9±)>µ '5;AI$9°8°B9±D°9±;5µ DFLN$9±$°9°/´)3$901>3 ##"&547#4&#".5463254'4#"62654&#"2654'#"&'+YY /0kIJk1æM7Nc‰-M`’r€Ó=eFVGDHÓL##""^D9*(9 Ñ6'þÓþÿ4HJjjJH4`7MxV®>8%•ex¥þ¾ÎeU™5)nX¹…þ¶""""pC.!,<9(/Yÿü.-7@NÙ²%+²+´7++° /´A++°H/´++°/°13±,é°2°,±:é°O/°(Ö´"1+°"±+´?+°?±+´K1+°K±8+±3é°3±.+°2´&+±P+±"²$%,999°?°9±8Kµ7:AH$9°3± 199°.±D99±HA³DK$9±7°$9°:´"(3?$901>3 #"'&54>326=!4'&#".54763254'4#"62654'&#",XY MEh^A65I*?sþ.&%9Q3-‰-M`EJu€Ó=',XVG7'.Ó":%>!8!Ñ6'þÓþûzD=(!2 .,%(G`6(&@8%–dwOWþ¾Îe>KWC)n3=i¹…þxWÿ%”21:B̲$+°3²+´:++°/´7+°/°53±*é°/2°*±=é°C/° Ö´+°±'+´!<+°!±+´A+°A±;+±7é°7±2+°2´&+±D+±'± 99±!²#$*999°A±,99°;²/:999°7°59±:°#9°=¶! '7,A$9±*° 901#".54732>5!4&#".54632>3 54'4#"6”Uˆ”W™à£QY:JHÆ@{~Mþ0L6Ocˆ,N`”q€6,XY L=eEVGEGÓ ;T,3rŠ—…2l~w¦b+ >+`6NxV¯=8%•ex¥]6'þÓ¾¾ÎeT›4)n€Y¹…Wþ=”2:CKW$²-+°3²#+´C++°/´U++°/´7+°'/°>3±3é°82°3±Fé°X/°Ö´+°±0+´*<+°*±#+´J+°J± +´R+°R±D+±@é°@±;+°"2´&+°2°´L+°L/±Y+±0±99±#*²,-3999°J±599° ²CF999°R± 899±@D°>9°;³OU$9±U³ LR$9°± O99°-°9±C#°,9°F¶*0@5J$9±3'°901#"&547#".54732>5!4&#".54632>3 54'4#"64&#"326” PZ_DB_FY™à£QY:JHÆ@{~Mþ0L6Ocˆ,N`”q€6,XY L=eEVGEGÓ½7)(89'(8 O3-dC`aB,# 3rŠ—…2l~w¦b+ >+`6NxV¯=8%•ex¥]6'þÓ¾¾ÎeT›4)n€Y¹…þ)77)'98Wþ—29BJUdn²(+°63²+´B++°/´c++°[/´S+° /´7+°"/°=3±.é°32°.±Eé°e/°Ö´+°±++´%<+°%±+´I+°I±+´`+°`±C+±?é³P?C+´^+°^/´P+°?±K+´X+°X±:+°2´6&+°2°6´V+°V/±f+±+±99±%²'(.999°I±099°° 9°`²BE999±C^°39°P°9°?´=NS[b$9°K±Mc99°X±899± S·KPVX^`$9°²MN999°(°89±B°'9°E¶%+?0I$9±."°901"&547#".54732>5!4&#".54632>3 54'4#"64&"3264'#"&'26—i–j;K™à£QY:JHÆ@{~Mþ0L6Ocˆ,N`”q€6+YY TcO=eEVGEGÓˆ$.#!#:9*(8C^DþÌKiiK3-3sÁŠ—…2l~w¦b+ >+`6NxV¯=8%•ex¥]6'þÓþòS31¾ÎeT›4)n€Y¹…þ8"""#!!,<8(.DDZÿ#L2/œ²+°#3°/´7+°/°3´-7+°)2°0/°Ö´ +° ±&+´ <+° ±+´&+°±+´&+±1+±& ± 99± ´"#)$9°°+9°°-9±¶ "&+$9°-° 901%#"54732654&#"#4&#".54632632LþýÕñþ×O@HγØiZ.BOJ4Ob†,M_‘sj:8hzáÎð çŸ}'kŠÅèͰj–T3þ¡_6OwW¯=8%–dx¥]]ÂZþZL2?Kã²5+°3°/´@++°/´)7+°9/°03±é° 2°L/° Ö´%+°%±+´=<+°=±5+´4&+°4±+´I+°I±-+´&+°C Ö´+±M+±%±"#99±5=´)?$9°4°9±I°9°C³ 0$9±@³CI$9°)±F99°5°9°9¶ %-?$9°°#901.54632632#"&547#"547327654&#"#4&#"2654&#"¦M_Žvj:8hIB†0@aCA` DIõþâO@H}{ѲqpiZ.BOJ4R3,†À(87)(78%–dw¦]]h^‡ÑwT8C`aB çŸ}'kŠÄutff±j–T3þ¡_6O@9U¯=þs8()78('9Zþ<L2;FV²2+°3°/´G++°O/´=+°/°R3´'7+°6/°-3±é° 2°W/°Ö´$+°$±+´9<+°9±2+´1&+°1±+´T+°T±R+´E+°E±?+´L+°L±*+°J2´ &+´+±X+±$±!"99±29´';$9°1°9±T°9±ER±- 99°?³GO$9±=³JT$9°'´?BEL$9°2°9°6¶ $*;$9°°"901.54632632#"&547#"54732654&#"#4&#"2654&#"2654'#"&'¦M_‘sj:8hz„5GiKIl ;?òþßO@HüÍ´ßiZ.BOJ4Ob†£2!#"JjkI!  éŸ}'kŠÅèίj–T3þ¡_6OwW¯=þÅ!""’D.!+<8(.DVþ†Þ9O[&²:+´E+° /´P7+°/°3´)++°-2°4/±é°\/°&Ö´&+°±+´&+°°6 Ö´7+°7/´6+³M+´H+°±+´Y&+°Y±1+´&+°±S+´ &+³= S+´B+°B/´=+±]+±²"#)999±M7°+9±H°49°Y³3K$9°1±-J99°¶ :?@EW$9°B°P9±P ³"#$9°¶ &+W$9°)°9°4²67999012#"'&547#4&#".546326323654&"'>2'654&#"&54672654'&'yD] `9838[^.(D@TKG4JaU@=I\Špr3@ 3F6@ R›Vp‡fP:9Ng†t›6=))LE<Q@('VTg[BGM@a[‘I;þ¿J5JrQO|/"]qœYY# ''7DýoU‚43#^:OO:`!35RrT^AS@AO@_Yý¸á9Zeo`²:+´P+°D/´f+° /°$3±[é°/°3´.7+°*2°5/´7+°p/°'Ö´1+°±+´1+°±+´b&+³Sb+´X+°X/´S+°b±G+´n+°n±^+°h2´&+³^+´2&+°2/´&+°^°M Ö´=+°^´A+±q+±³#$*+$9°°,9±X°89±bS²7.999°G°V9°n²PU999°2@ 0 5:DJK[`fk$9°M±?99±Pfµ=AGVXk$9±[ ²#999°µ',`$9°.±099°5³278$9012#"'&547&#"#4&#".54762632654&#"'62#"&5467'654&#"&54672654'264&#"FN-shMS41|.;HPL3M22'&F7KbIJâ35qM8$/<6-6iTmHLI42K5'bM98Icq{/:dqQ,,**[K68]°S€FAZ†h D:þ³M3K9:PL?>1"^sMNJJ/!8:-UüþpT]6!S3JK2,@ #^:OO:`!34‚Rr\Y8~QVv6+3ý+<+*>*Yýœá6W`hx–²7+´M+°A/´i+°q/´g+° /°!3±Yé°/°3´'7+°+2°2/´7+°y/°$Ö´1+°±+´1+°± +´_&+³P_ +´U+°U/´P+³D_ +´v+°_±[+´&+³[+´/&+°//´&+°[°J Ö´:+³n:J+´a+°a/´n+°:°> Ö´l+°l/´>+±z+±² !'999°°)9± U°59±DP²4+999±v_²SR999°/@ -27AGHMX]cegiq$9°a±Y99°J°<9±Mg@ >D:SUclntv$9±Y ² 999°µ $)]$9°'±-99°2³/45$9012#"&547&#"#4&#".54632632654&#"'62#"&5467'654&#"&54>2654'4#"322654'#"&'FN-shMPh|.;HPL3MdRA7Kb”pq35qM8$/<6-6iTmHWP9:R>.bM98IcpM^:dq³,--,*#4*! + 5[K68]°S€‡Z†h D:þ³M3KsPQz1"^rœJJ/!8:-UüþpT\8$^9QQ93J #^:OO:`!34‚Rr\Y8~QVv8ýš++.V5#"/,$4Yþ÷X &2ç²+² "-333´++²+´+² +³@ +°/´'++´" +´++°3/°$Ö´+°±+´+² +³@ +°±+´0+°0±+´ &+° 2° ´*+°*/±4+±³!"$9°°9±0°9°²'-999± *° 9±'± 99±°!9°³$$9012!3##"&547#5654&#"&5462654&#"0]{N"#_CB`#ÄLW:9,+Io€Ý(87)(89upYH#ßýà.8C`aB8.#'_8O&%+°±)+´6+°6±+´ &+° 2° ´4+°4/±B+±² !999°°9±>°9°)³/19$9± 4° 9±'µ 46<>$9±° 9°³#$9012!3##"&547#5654&#"&5462654&#"2654'#"&'0]{N++jKIk,§LW:;UIo€¯2!#";0D9*(9 BupYH#ßýà2DJjkIB4#'_8ON9O$:8xTuþ!""‘B/!+<9'.CYÿW -=Þ²+°)3´++²+´+² +³@ +° /´.++°7/´++´") +´++°>/°+Ö´&+°&±+´+² +³@ +³:+´1+°/´:1+°±+°2´ &+±?+±&³"()$9±:°9°³ .1$9±7.²:999±°(9°"³&+$9012!3#"'&54>326=!5654&#"&5462654'&'&#"0]{NPHm`905I'LhþjLW:9,+S)o€z";#. 9#upYH#ßýÜzD=)"0-*#)F*'X8O&%9Z 68xUtýÐ YþÿW 7J²&+°33´++²&+´'+²'& +³@' +°/´=+°8/°B3´+°2²8 +³@8F +´,3 +´++°K/°5Ö´0+°0±+´;+°;±)+´+²) +³@)& +°±G +´F+°F±+°$2´ &+±L+±0³,23$9±);°9°±899°F±=99°±?99° ° 9±=° 9°8² ?999°°9±'°29°,³)05$9012!3#'.547632632676?!5654&#"&546"3274&#"#'4&0]{N]Qr3GC"$%-SCUþeLW:9,+Io€ç%e?"!9.upYH#ßýî$mA8 2%012Q !#'_8O&%(/V]EC€YFn@)-X]D>)/U]DC€66$#64$% D/+-W]D?;KÍ,+**|mVF!Îýò#%Z6MH6R!95{Qnþ9;A.27*g= $C3%$$%30% 2-16(6þ–*++*YýŸZ BJY‚²+´#+°1/´L+°S/´I+°E/´;++°@/´'+° /´+´ +² +³@  +°/´++°Z/°Ö´+°± +´+²  +³@ +°±4+´X+³%X4+´+°/°83´%+°X±+´ &+² *.222³P +´C+°C/´P+° ´=+°=/° ´N+°N/±[+± ²999°°9±4°99±X%°69°C@ #'(1?@;GLS$9±NP°,9° °!9±EIµ4.NPVX$9°;±6,99°@²8*9999±#'² !999± °9± °9°³ $9012!3!5654&#"&5464632&#";2#"&547&'73254+"&4#"322654'#"&'0\|NþL\59WIo3[Eo>)/U]DC€<GHK!B@|mVF!Îýò#%Z6MH6R!95{QnþGP9Z3)A{I7@##@8H{A+1Z8Q]-;,1UC`@ÿ6'T0-W]Yþ„ QZi²+°"3´J+°<2°0/´-+°(/´6+°D/´W+° /´+´ +² +³@  +°/´++°[/°Ö´+°±+°22´M+´++°M± +´+²  +³@ +³F +´U+°±Y+´A+°A±+´ &+³9 +´%+±\+±³$9± +°P9°F³)5O$9±U²HJ999°Y²CD 999°A´"6<(?$9±% ±./99±-0°29±6(°39°D°P9°W°O9°J·%9?AFMR$9°° 9° °9± °9°³ $9012!3!5654&#"&5464632632+"3!!"&4632654&#"#"&547&#"&%32540\|NþL\59WIoƒqU3GLhrWâ22¦þR.@@.à?RB0 'BfA- 6ND\ "97|mVF!Îýò#%Z6MH6R!95{QnýëIPfQXt $50R0V@2G&C4EE4A%1,J--¬/DD7Yþs ]d©²+°Z3´@+°N2°-/´*+°%/´4+°G/´d+°:/´;+° /´+´ +² +³@  +°/´++°e/°Ö´+°±V+°02´Q+´(+²(V +³@(+ +°Q± +´+²  +³@ +³J +´b+°±^+´D+°D±+´ &+° °" Ö´7+°7/°>3´"+°2²7" +³@7: +±f+±V³$9± (²3ST999°J±&99°±NZ99°b°L9°^±\G99°D°B9°³%4@$9± 7° 9±%*°09±G4°T9°d²7"S999±;:´ DJ^b$9°@µBLQV`$9°°\9° °9± °9°³ $9012!3!5654&#"&5462#!"3!!"&54632654+53254#"#"&547&#"&54763264'20\|NþL\59WIoùD\,,P>þÜ11¨þP+AA+$88-c (<-.6/1J4U=5J= *2\|mVF!Îýò#%Z6MH6R!95{Qnþ„66D B:@ $40'&3)541; ,@0GD3B,8-C1/eG+(¬>:=Yýæt MW`m²J+°3´?+°12°"/´Z+°_/´(+°8/´S+° /´+´ +² +³@  +°/´++°a/°Ö´+°±G+´B+°B± +°%2´+°X2²  +³@ +°°Q Ö´;+°;/´Q+°±U+°\2´5+°5±+´ &+° ° Ö´.+°./´+±b+±G³$9± B±DE99±;²?J999±UQ·("83L=Z_$9°5²+1999±_Z±%+99±8(°E9°S°D9°?¶.5;BGN$9°J°L9° °9± °9°³ $9012!3!5654&#"&5462#"&54632>54&#"#"&547&#"&5463263254&3254&#"0\|NþL\59WIoßWdMQ};aM/1Z (:F;AJ3:CC 5L8%SzV7!)%@<&jX52&5|mVF!Îýò#%Z6MH6R!95{Qnþ„{_}^e)'!% ŠF@V;[6QKP6Z),;xRnTP$PP%Nþ– Yýæq QYh§²N+°3´B+°22°!/´g+°c/°\3´'+°+2²c' +³@c_ +°;/´X+° /´+´ +² +³@  +°/´++°i/°Ö´+°±J+´E+°E±>+°$2´V+°V° Ö´ +° /´+°>´e+²>e +³@> +°V±`+´_+°_±R+´7+°7±+´ &+° ° Ö´/+°//´+±j+±J³$9± E°H9°>°G9°²BN999±`Vµ;'T@Xc$9°_³!)Pg$9°R°49°7´+2Z\$9°°-9±cg±$-99°'±)H99±X;°G9°B¶/7>EJT$9± N°9± °9°³ $9012!3!5654&#"&5462#"&54632632654&#"#"&547&#"&54763264'32&#"#5&#"320\|NþL\59WIoÜWd¤o:Y3"-%1TM;)$&:=IH7JL*a4Œ6BAC@'$%-R8|mVF!Îýò#%Z6MH6R!95{Qnþƒ{_wÈ*)',H>X],:+0TA_BQ8Z1/B}*$uáT0/UX“ $Yþ„u ?þ²+° 3´4+°+2²4 +³@40 +° /´+´ +² +³@  +°/´++°@/°Ö´+°±<+´7+°7± +´+²  +³@ +°±0+´/+°/±+´ &+° °# Ö´(+°(/´#+±A+±<³$9± ´49:$9±/0°9°³ %&+$9± °9± °9°³ $9012!3!5654&#"&5462632'654&#"#54&#"&54760\|NþL\59WIo"%: RO\x W=2&B+19['w/.|mVF!Îýò#%Z6MH6R!95{Qnþ„'DnLŠ93)l4C1ææ.G5j'29ˆL87Xþ„‡ >JP²9+°<3´.+°&2².9 +³@.* +°/°43´I+´$C*9 +´$+°/´+´+² +³@ +°/´++°K/°Ö´ +° ±6+´1+°1±+´+² +³@ +°±*+´)+°)±!+´F+°F±+´&+³?+´+±L+±6 ± 99°1±99°±3499°².9999±)*°;9°!°<9°F°&9°±I99°?²$=C999±I°39°C³16!$9±9.°;9°° 9±° 9°³ $901%!5654&#"&54632!3#"&5463&#"#54&#"&54632624'&#"32WþLW:;UIo€W\|N0NB5?P;!:a>- 0=StbML!'®|@ 00!M#%Z7LH6R!94{RnmVF!ÎýJgO:AR!Oäç ,I3k#56‹Ol::t`5/YýöÆ S_x²&+°*3´+°L2²& +³@P +°3/´8+°C/°!3´W+° /´+´ +² +³@  +°/´++°`/°Ö´+°±#+´+°±P+´O+³OP+´ +° /´+²  +³@ +°O±F+´T+°T±+´ &+³Y +´@+° ±;+´0+±a+±#±99°±99° ³ !&$9°P°9±O°(9±TF²*5L999°¶368CJW[$9±@Y±,>99±83°59°C°69°W° 9°@ #,0;>@F]$9°&°(9° °9± °9°³ $9012!3!5654&#"&546"&54632632#"'732654&'#"&54767&#"#54&3254'&#"0\|NþL\59WIoÅ0?Ps`PI!)M€&M)*sX:2(*@Q*" ;<3@"#4A[=,Ü ?%3|mVF!Îýò#%Z6MH6R!95{QnþGJ3l&46ŒNp22R 79U^Š#4fE0N !I[T8;/0Méé!,¶2\3%>Yþ‹W 7 ²"+°%/´ +°+/´+° /´+´ +² +³@  +°/´++°8/°Ö´+°±5+´.+°.± +´+²  +³@ +°±(+´+²( +³@(% +°±+´ &+°#2° ´!+°!/±9+±5³$9± ²23999°(±+99°° 9± %±&299°+³(.5$9± "°9± °9°³ $9012!3!5654&#"&546233!5654&#"&5460\|NþL\59WIo1>U‰Aþ×23"!31QV|mVF!Îýò#%Z6MH6R!95{QnþL; :þ 8 .*02'S8OYýÃ] @KR²"+°*/´A+°F/°<3´!+°6/´+° /´+´ +² +³@  +°/´++°L/°Ö´+°±>+´9+°9± +´+²  +³@ +°±3+°-2´+´I+²3I +³@30 +°±+´ &+±#'22° ´!+°!/° ´D+°D/±M+±>³$9± ²;<999°3±699°I± /99±²*AF999± D°%9±FA±-'99°!´$%/1;$9°6³39>$9± "°9± °9°³ $9012!3!5654&#"&546233##"&547#5654&#"&546264&#"0\|NþL\59WIo1>U‰AJ32KR23"!31QV,,*+|mVF!Îýò#%Z6MH6R!95{QnþL; :þ".2KK2-# 8 .,02'S8Oþl*<-,*Yý§^ @IY€²"+°*/´J+°R/´G+°C/°<3´!+°6/´+° /´+´ +² +³@  +°/´++°Z/°Ö´+°±>+´9+°9± +´+²  +³@ +°±3+´+°- Ö´W+²-W +³@-0 +°±+´ &+°#2°A Ö´O+° ´!+°!/° °' Ö´M+°M/´'+±[+±>³$9± ²;<999°-±699±W3°/9°± T99°A³*EJR$9± M°%9±CGµ-'MOUW$9°!´$%/1;$9°6³39>$9± "°9± °9°³ $9012!3!5654&#"&546233##"&547#5654&#"&5464#"3262654'#"&'0\|NþL\59WIo1>U‰A$R89S%?23"!31QV.+..*$4+ - 6|mVF!Îýò#%Z6MH6R!95{QnþL; :þ'78SR96( 8 .,02'S8OþÑ,,-p4$!/,#5YýæW DMa²"+°'/´G+°L/´-+°2/´ +´3+°:/´+° /´+´ +² +³@  +°/´++°N/°Ö´+°±B+´=+°=± +´+²  +³@ +°±5+´+²5 +³@52 +³E5+´*+°*/´E+°±+´ &+°#2° ´1+°1/°!3±O+±B³$9± =°@9°³:?$9±E° 9°µ'-/GIL$9±LG±*E99°-°/9°2°@9± 3°?9°:³5=B$9± "°9± °9°³ $9012!3!5654&#"&546233#"&5463267!5654&#"#"&5463254&#"0\|NþL\59WIo?T  A`N5VE/V! ÿ-2# 01"LW£X..$4|mVF!Îýò#%Z6MH6R!95{QnþL<,<þ‘L],& &, >!-,6.!V9Oþ¬Yþ‹f ;D@²+´<+°$/´:+°@2´%+°*/´5+° /´+´ +² +³@  +°/´++°E/°Ö´+°±2+´-+°-± +´+²  +³@ +³8 +´'+°'/´8+²'8 +³@'$ +°±;+´@+°@±+´ &+° °# Ö´A+°A/´#+±F+±-2±99°'´/05$9±8 °:9°°9±@±<99±:%°/9°*³'-28$9± °9± °9°³ $9012!3!5654&#"&5464632!5654&#"&5463237"354&0\|NþL\59WIoLZED./ýþ11"$22RW<>RfŸ'6¿9|mVF!Îýò#%Z6MH6R!95{QnýäE[./>Õ 9!-*!11'S9NL;!ý;(šœ)8YýÂg FOY—²+´G+°)/´P+°//°#3´E+°K2°E´U+°;2°/´0+°5/´@+° /´+´ +² +³@  +°/´++°Z/°Ö´+°±=+´8+°8± +´+²  +³@ +³C +´2+°2/´C+²2C +³@2/ +°±F+´K+°K±,+´W+°W±+´ &+° °# Ö´L+°L/´#+°&2°#´S+°S/±[+±8=±99°2´:;@$9±C °E9°°9±W,°.9°´)GPT$9± S°$9±UP±,&99±E0°:9°5³28=C$9± °9± °9°³ $9012!3!5654&#"&5464632##"&547!5654&#"&5463237"354&264&"0\|NþL\59WIoLZED./I42KþØ11"$22RW<>RfŸ'6¿9,,<+*|mVF!Îýò#%Z6MH6R!95{QnýäE[./>Õ#.3JK2/" 9!-*!11'S9NL; ý;(šœ)8þ3+<,,*Yý£m ENVe¾²+´F+°(/´W+°_/´U+°./°"3´D+°J2°D´Q++°.´/+°4/´?+° /´+´ +² +³@  +°/´++°f/°Ö´+°±<+´7+°7± +´+²  +³@ +³B +´1+°1/´B+²1B +³@1. +°±E+´J+³+JE+´c+°J±+°O2´ &+´\+° °" Ö´K+°K/´"+° °% Ö´Z+°Z/´%+±g+±7<±99°1´9:?$9±B °D9°°9±cJ°-9°·(FQSUW^$9± Z°#9±QUµ+%Z\ac$9°.°:9±D/°99°4³17RfŸ'6¿9,--,+&2 ,@+ 4|mVF!Îýò#%Z6MH6R!95{QnýäE[[@Õ)98SS89) 9!-*!11'S9NL; ý;(šœ)8þ–++-V2&!0,%3Wÿ"ñ2)ò+°%3´++²+´+² +³@ +° /´7+´% +´++°*/°Ö´+°±'+´"+°"±+´+² +³@ +°±+°2´ 1+±++±'°9°"°9°²$%999°² 999±°$9°µ"'$9012!3! $547! 75!5654&"&546Ê^zPþˆÿþíd9V¾8 þlMWt,+K!o€uoZH#ßýÓÑóò¦…'y‹þbŠ #%a8O&%9T":8xUtWþ5ñ25? ²%+°13´++²%+´&+°/´6++°/´!7+°+/´++°@/°Ö´+°±3+´.+°.±(+´+²( +³@(% +°±+´>+°>±#+°2´ 1+° 2° ´9+°9/±A+±3°9°.°9°(²01999°²!999±>°9°#³ 6;$9± 9° 9±6³ 9=$9°!± ;99±&°09°+µ(.3$9012!3#"&547# $547! 75!5654&"&546264&#"Ê^zPKR_DC^(.ÿþíd9V¾8 þlMWt,+K!o€Û(88('99uoZH#ßýÓZ4.`D^_C(&óò¦…'y‹þbŠ #%a8O&%9T":8xUtý8P89N9Wþ ñ25AQ4²&+°13´++²&+´'+°/´B++°J/´6+°/´!7+°,/´++°R/°Ö´+°±3+´.+°.±)+´+²) +³@)& +³)+´O+°±M+´?+°?±9+´G+°G±$+°2´ 1+° 2° ´E+°E/±S+±3°9°.°9°)²01999°²!999±O°9±9?²BJ999°G° 9±6· 9?EGMO$9°!± <99±'°09°,µ).3$9012!3#"&547# $547!26=!5654&"&5462654&#"2654'#"&'Ê^zP`^iKIk *ÿþíd9V¾š«þlMWtWK!o€Ç#"!!0C8+(9 CuoZH#ßýÓ]93lJjjJ7.óò¦…'y‹þbJ@ #%a8OL8T":8xTuýH""!!qB0+;8(/CYþ„ ?I3²9+°!3´-+°'/°33´+°@2° /´+´ +² +³@  +°/´++°J/°Ö´+°±6+´G+°G±C+´1+°1° Ö´ +° /´+²  +³@ +°1±*+´>+°>±+´ &+³ +´#+±K+±6±99°G±99° ²4@E999°C±/399°²-9999±>² '999°°!9±-¶#*16=E$9°9° 9° °9± °9°³ $9012!3!5654&#"&5462654'7#"&=4#""&54632!2654'0\|NþL\59WIo$2Z$s!'H>No OHvCv^D38þþ$S4%|mVF!Îýò#%Z6MH6R!95{QnýDT/c6'=ŠH3=V@7uB[D_bF]w')B:tC&`3T&9Yý¶{ ENXв@+°!3´4+°*/´F+°;/´O+°2°O´K++° /´+´ +² +³@  +°/´++°Y/°Ö´+°±=+´V+°V±R+´8+°8° Ö´ +° /´+²  +³@ +°8±1+´D+°D°M Ö´-+°-/´M+°D±+´ &+³ +´#+°'2°#´I+°I/±Z+±=±99°V±99° ²;OT999°R±6:99°²4@999±MD°/9°µ !*FK$9°±%J99±KF±-'99±O;±%/99°4¶#18=CT$9°@° 9° °9± °9°³ $9012!3!5654&#"&5462654'7#"&547&=4#""&54632264&"%2654'0\|NþL\59WIo $2[%s=>I42K+Np OIvCw]Ek`,-<**þ¼$S4%|mVF!Îýò#%Z6MH6R!95{QnýDU.b7'>‰i3#J3JK29&&b7uB[D_bF]wT>:tÖ+<,,<+ÖC&`3T&9Yýœ{ EM]g˜²@+°!3´4+°*/´N+°V/´L+°;/´^+°2°^´H++° /´+´ +² +³@  +°/´++°h/°Ö´+°±=+´e+°e±a+´8+°8° Ö´ +° /´+²  +³@ +°8±1+´D+°[2°D´-+°-/°D±+´ &+³F +´S+°%2³ +´#+°'2°#´Q+°Q/±i+±=±99°e±99° ²;^c999°a±6:99°²4@999±D@  !*/HJLNVY$9±HLµ-'QSY[$9±^;±%/99°4¶#18=Cc$9°@° 9° °9± °9°³ $9012!3!5654&#"&5462654'7#"&547&=4#""&546324#"322654'#"&'%2654'0\|NþL\59WIo $2[%sBCQ9:R‰n1)N9QQ9H))Z7uB[D_bF\xT>:tn++.V4$!0-$4òC&`3T&9Yþ„Ž F<°*/´!+°7/°03´C+±&22²7C +³@74 +° /´+´ +² +³@  +°/´++°G/°?Ö´:+³:?+´+°/´+°:±4+´3+³ 34+´+²  +³@ +°3±-+´+°±+´ &+³# +´(+±H+±:°9°4µ<=C$9° °E9±3±99°-°09±²!%*999°#°&9±!*°<9°7µ#(-:?$9°C±%E99° °9± °9°³ $9012!3!5654&#"&54623254'7#"&=4#"#54#"&54763260\|NþL\59WIo,HWQZ]$wšFPTDFS-3S%n).LW|mVF!Îýò#%Z6MH6R!95{Qnþ…RFBa„b*.9‚Á`L9VPääPI4f*2<†J7:::Yý¹Ž OX‚°//´P+°U/´!7+°@/°93´L+±&22²@L +³@@= +° /´+´ +² +³@  +°/´++°Y/°HÖ´C+³CH+´+°/´+°C±=+´<+³ <=+´+²  +³@ +°<±6+´+°°W Ö´2+°2/´W+°±+´ &+³# +°R3´(+´,+±Z+±C°9°=µEFL$9° °N9±<±99°6°99±W°49°´!%/PU$9°#²&*T999±UP±2,99°!³*4EF$9°@µ#(6CH$9°L±%N99° °9± °9°³ $9012!3!5654&#"&54623254'7#"&547&=4#"#54#"&5476326264&"0\|NþL\59WIo,HWQZ]$wE7K32K,STDFS-3S%n).LWF,-<**|mVF!Îýò#%Z6MH6R!95{Qnþ…RFBa„b*.9‚}.$D3JK2:&&x9VPääPI4f*2<†J7:::ýì+<,,<+YýŸ‘ NVdª°//´X+°_/´U+°Q/´!7+°@/°93´K+±&22²@K +³@@= +° /´+´ +² +³@  +°/´++°e/°HÖ´C+³CH+´+°/´+°C±=+´<+³ <=+´+²  +³@ +°<±6+´+°°c Ö´2+°2/´c+°±+´ &+°\2° ´O+°O/³# +´(+° ±Z+´,+±f+±C°9°=µEFK$9° °M9±<±99°6°99±c@ !%/4QSUW_$9°O²&X^999°#°*9±QUµ2,Z\ac$9°!³*4EF$9°@µ#(6CH$9°K±%M99° °9± °9°³ $9012!3!5654&#"&54623254'7#"&547&=4#"#54#"&5463264#"322654'"&'0\|NþL\59WIo,HWQZ]$wADS79S5RTDFS-3S%n[HWu+..+OJ2 +@+ |mVF!Îýò#%Z6MH6R!95{Qnþ…RFBa„b*.9‚y/)O7SR8C*'w9VPääPJ3f*2<†Ol::þT++.U2%!/,%Yýí† S[w²P+°3´E+°>2°+/´Z+°V/´0+°7/°A3´!+° /´+´ +² +³@  +°/´++°\/°MÖ´H+³HM+´+°/´+°H±B+´A+³ AB+´+²  +³@ +°A±.+´X+°X±:+´+°±+´ &+³# +´(+±]+±H°9°BµJKP$9°A°R9°.°9°±>99±:³+0VZ$9°´!%27T$9°#±&599±VZ°.9°0±2K99±!7±5J99°Eµ#(:HM$9°P±%R99° ±&99± °9°³ $9012!3!5654&#"&54623254'7#"&5432>7#"&=4&#"#54#"&5463264#"320\|NþL\59WIo'GVUS\$x‘‚3Joe GL"1EDS,1S%lXFI)$ñT,P0|mVF!Îýò#%Z6MH6R!95{QnþƒRG2ld*/>–´+'D4 ]M!93OææOI2h*3<‡Mo,,þ3YþSƒ T`²+²&1Q333´?+°F2²? +³@?C +²2+°,/´7+° /´+´ +² +³@  +°/´++°U/°/Ö´4+³4/+´+°/´+°4±N+´I+°I±C+° 2´B+´+²C +³@C +°B±<+´+°±+´ &+³# +´(+±V+±4±199°N±299°I±99°C³FKLQ$9°B²RS999°°79°<²,?999±²!%9999°#°&9±?7·#(/4!LN$9°±%S99° °9± °9°³ $9012!3!5654&#"&54623254'7#"&547327'&=4#"#54#"&5476260\|NþL\59WIo\+³>9+´+°/´+°>±X+´S+°S±M+° 2´L+´+²M +³@M +°L±F+°22´+´f+°±+´ &+³# +´(+°b Ö´,+±j+±>°;9°X²<999±MS´UV[$9°L±]99°±6A99°F±I99°f°49±µ!%/C_d$9°b²&*c999±6_³2,bf$9°A²4cd999°P@ #(*9>!VX$9°[±%]99° °9± °9°³ $9012!3!5654&#"&54623254'7#"&547#"&547327'&=4#"#54#"&546326264&"0\|NþL\59WIoT@ ü,,<++|mVF!Îýò#%Z6MH6R!95{Qnþ„G:8PnM'*4szEW3JK2 x˜WI>C‚dB 1E@ÁÁ@;*Y -2rE[--ýß*<-,*Yý‡{ ^fvÕ²[+²&;333´P+°I2²P[ +³@PM +²<+°//´g+°o/´e+°6/´A+° /´+´ +² +³@  +°/´++°w/°9Ö´>+³>9+´+°/´+°>±X+´S+°S±M+° 2´L+´+²M +³@M +°L±F+´+³tF+´2+°2/´t+°±+°_2´ &+´l+° °, Ö´j+°j/´,+³# +´(+±x+±>°;9°X²<999±MS´UV[$9°L±]99°±6A99°2±I99°F°49±t±cq99°·!%/Caego$9°l±&*99±6e·2,_cjlrt$9°A±4a99°P@ #(*9>!VX$9°[±%]99° °9± °9°³ $9012!3!5654&#"&54623254'7#"&547#"&547327.=4#"#54#"&5463264#"322654'#"&'0\|NþL\59WIoT@ ,--,+$4 , , 4|mVF!Îýò#%Z6MH6R!95{Qnþ„G:8PnM'*4s…E#]8SS8$#x˜WI>C‚dBDD1E@ÁÁ@;*Y -2rE[--þ=,,-U3$!/,$3Yþ÷w-*3=î²+±&33´++°/2²+´+°/´4++° /´++°+/´ 7+°>/°(Ö´#+°#±+´+² +³@ +°±+´/1+°/±+´;+°;±0+´+°7 Ö´+±?+±#²%&999°°9±;°9°7² +999±0°9±4²8999±°%9° ³#($9012354632##"&547!5654&#"&546%"!54&264&"0[{¶„haŒ3#_DB`$þ-LW:;UK!o€±A[?e(88P89uqXH#ühˆŠ`þ½.8D_aB9-#'_8OM:R$78xTuqdCþþBeýT8P88('9YþÖw-)2>N²+²%9333´++°.2²+´+°/´?++°G/´3+°/´++°*/´ 7+°O/°'Ö´"+°"±+´+² +³@ +°±+´.1+°.±+´L+°L±6+´D+°D±B+°/2´+° 2±P+±"²$%999°°9±L°9°6µ* TèaCôöBþ?3&'2›:8y=%19Xþˆw-"AJ²&+´++°5/´:+°?/´/+° /´!+°F2´ +°/´++°B/´++°K/°Ö´+°± +´+²  +³@ +°±"+´F1+°F±#+°72´-+°-±G+´+³2G+´<+°(/V]EC€YFn@)-X]D>99°E@ +/&9C0HKTY$9°W°49°P°)9±YT±<699°C±>499°H²@2A999±+/²(#)999± &°9±! °9°² 999014632!5654&"&54763234632&#";2#"&547&'73254+"&"!54&264&#"ž„hdEDüüLWt++K!o@?X^;=¶i[Eo>)/U]DC€77I42K#F0*-W]D>;K‡B^?^,,**DfƒBA`þÆ"$^7L$$;Q"64|P9678TF!Ä9;A.27*g> %C3JK20& 2-16(6aCôöB`ü+<+*>*Yýw-GOWg•²#+´(+°6/´X+°`/´V+°R/´@7+°E/´,+°/´+°L2´ +°/´++°I/´++°h/°Ö´+°± +´+²  +³@  +°±+´L1+°L±9+´e+³*e9+´ +° /°=3´*+°e±P+´]+°]±M+´+°[ Ö´3+°3³3/+´B+°B/´/+°%2±i+± ²999°°9±9 °>9±e*±;I99°P@ (,-6@DEH#TX`$9±[]°19°M°&9±RVµ93[]ce$9°@±;199°E²=/>999±(,²% &999±#°9± °9°³ $9014632!5654&#"&5463234632&#";2#"&547&'73254+"&"!544#"322654'#"&'ž„hb‹üüLX9;UK!o€WZ|¶i[Eo>)/U]DC€@;Q89S/7+*-W]D>;KÉ„^?@,--,*$3 +!, 5Dfƒƒ`þÆ"$^6MJ9P#63}QnmVF!Ä9;A.27*gC)J8RR8?) --16(6aCôöBüË++-U2$".,$2Xþ„”-"OXaO²7+°;3´*+°G2°#/´Y+° /´!+°T2´ +°/´++°P/´++°b/°Ö´+°± +´+²  +³@ +°±3+´.+°.±"+´T1+°T±&+´`+°`±\+´L+°L±U+´+°°? Ö´D+°D/´?+±c+± ²999°°!9±T"±0199±`&±*799°\µ#9IP($9°L±G;99°U°B9°D°A9±Y#±0B99°*¶&.3?DL^$9°7°99° °9±! °9°² 999014632!5654&"&5476323"&547&#"&547632632'654&#""!54&2654'ž„hdEDüüLWt++K!o@?X^;=¶Ù=II6%$K*a17P3FL53qWã22¦þR.@@.á>RA0'AfA,VB^?^P#:7DfƒBA`þÆ"$^7L$$;Q"64|P9678TF!1,I--jN(#32RXt $50R0V@2G&C4EE4A%+aCôöB`ýÁ0DD7XþŽ-"env¸²#+°b3´H+°V2°5/´2+°-/´<+°O/´u+°B/´C+° /´!+°j2´ +°/´++°f/´++°w/°Ö´+°± +´+²  +³@ +°±^+°82´Y+´0+²0^ +³@03 +°Y±" +´j1+°j±R+´s+°s±o+´L+°L±k+´+°°* Ö´?+°?/°F3´*+°&2²?* +³@?B +±x+± ²999°°!9±j0³.;[\$9±sR²TVb999°o³dfO$9°L°J9°k³#<-H$9±?°(9±-2°89±O<°\9°u²?*[999±CB´(LRos$9°Hµ&JTY^q$9°#°d9° °9±! °9°² 999014632!5654&"&54763232#!"3!!"&54632654+53254#"#"&547&#"&5476326"!54&4'32ž„hdEDüüLWt++K!o@?X^;=¶PE[++N?þÜ11§þP+AB*%67-c)<.-7/2J5T=5I= B^?^,+1-/DfƒBA`þÆ"$^7L$$;Q"64|P9678TF!P66E B:@ $40'%4(541; .>0GE2B,8-B1.fG+(èaCôöB`ýl>:=Xýæ¡-"V_ir‰²S+°#3´H+°92°*/´l+°q/´0+°A/´e+° /´!+°[2´ +°/´++°W/´++°s/°Ö´+°± +´+²  +³@ +°±"+´[1+³K["+´P+°P/´K+°[±D+´c+°c°j Ö´-+°-/´j+°c±g+°n2´=+°=±\+´+³6\+´&+±t+± ²999°°!9±-K±MN99±jD°H9°c°S9°g@ 0*A;UWFlq$9°=²3#9999±ql±-399±A0°N9°e°M9°H¶&6=DKP`$9°S°U9° °9±! °9°² 999014632!5654&"&54763232#"&54632>54&#"#"&547&#"&546326"!54&3254&3254&#"ž„hdEDüüLWt++K!o@?X^;=¶HWdMQ};aM/1Z (:F;A!'5:CC 5L8$TzV7!B^?^N%@<&jX52&5DfƒBA`þÆ"$^7L$$;Q"64|P9678TF!P{_}^e)'!% ŠF@V;[2),KP6Z),, /?TtaML"'®|þûC]?^„ 00!M"$^7LI7T"64{QomVF!ôfƒƒ`ýíJgN;DO!Oäç ,J2k#56‹Ol::t\aCôöB`ýD5/Xýö -'^j…²3+°73´(+°W2²(3 +³@([ +°?/´D+°O/°.3´b+°/´+°#2´+°/´++°/´++°k/°Ö´ +° ±0+´++°2°+´+°/²+ +³@ +°+±+´#1+°#°Z Ö´[+°[/´Z+°#±R+´_+°_±d+´L+°L±$+´+³G$+´<+±l+± ² 999±+0°9°³(-.3$9±#[°59±_R²7AW999°d¶?BDOU$9°L±9J99±D?°A9°O°B9°b°-9°(@ +09Xþ‹w-'D.²/+°2/´-+´3+°8/´(+°/´+°#2´+°/´++°/´++°E/°Ö´ +° ±+´+² +³@ +°±+´#1+³;#+´B+°B/´;+°#±5+´++²5+ +³@52 +°+±$+´+°02°´.+°./±F+± ² 999°°9±#;±?@99°5±(899°+²-999±-3°?9°8³+5;B$9±/° 9±° 9°² 99901%!5654&"&54632354632'"!54&233!5654&#"&546wüüLWtVK!o€WZ|¶„hb‹éC]?^Â>U¦Bþº12"!31RX"$^7LI7T"64{QomVF!ôfƒƒ`žaCôöB`ý¤L;*þ™'2!-*02'S8OYýÃz-(NY‰²0+°8/´O+°=/±2T33´.+´?+°D/´)+°/´+°$2´+°/´++° /´++°Z/°Ö´ +° ±+´+² +³@ +°±+´$1+³G$+´L+°L/´G+°$±A+´,+²A, +³@A> +°,°W Ö´;+°;/´W+°,±%+´+±1522°´/+°//°´R+°R/±[+± ² 999°°9±$G±IJ99°A±)D99±,;³ .=$9±%W²8OT999±R°39±=O²5;J999±.?°I9°D³,AGL$9±0° 9±° 9°³ $901%!5654&#"&54632354632'"!54&233##"&547#5654&#"&546264&#"wüüLX9:VK!o€W[{¶„hb‹éB^?^Â>U¦BJ32Km12"!31RX*,,*+"$^6MI7T"63|QomVF!ôfƒƒ`žaCôöB`ý¤L;*þ™$,2KK2-#'2!--02'S8Oþl*<-,*Yý¤z-(NTc¨²0+°8/´U+°]/´T+°Q/´/7+³>/Q+°23´?+°D/´)+°/´+°$2´+°/´++° /´++°d/°Ö´ +° ±+´+² +³@ +°±+´$1+³G$+´L+°L/´G+°$±A+°;2´,+´a+²Aa +³@A> +°,±%+´+±1522³Z%+´P+°P/´Z+°´/+°//°´X+°X/±e+± ² 999°°9±$G±IJ99°A±)D99°a³ .=$9±P,´8QU\_$9±X°39±QTµ;5XZ_a$9°>°J9±/?°I9°D³,AGL$9±0° 9±° 9°³ $901%!5654&#"&54632354632'"!54&233##"&547#5654&#"&5464#"32654'"&'wüüLX9:VK!o€W[{¶„hb‹éB^?^Â>U¦B#'S89R'[12"!31RXG,--$4 ,@+ 4"$^6MI7T"63|QomVF!ôfƒƒ`žaCôöB`ý¤L;*þ™(98SS89('2!-+ 02'S8Oþ¢XXV3$!.*$3Yþw-(/7@þ²-+´:7+°22°*/´6+°/´+°$2´+°/´++° /´++°A/°Ö´ +° ±+´+² +³@ +°±+´$1+°$±* +´?+°?±8+´4+°4±%+´+°7 Ö´)+±B+± ² 999°°9±8?³ -6$9°4°29±:6±4?99±-° 9±° 9°³ $901%!5654&#"&54632354632'"!54&!5432#4'3'4#"6wüüLX9:VK!o€W[{¶„hb‹éB^?^Œþ“¹´B?]‹r&v"$^6MI7T"63|QomVF!ôfƒƒ`žaCôöB`ü¨§ÉÆf&_O°< CcOYýÃw-(:BKUP²2+´E7+°=2°)/´L+°Q/´B++°/´+°$2´+°/´++° /´++°V/°Ö´ +° ±+´+² +³@ +°±+´$1+°$±/ +´J+°J±,+´S+°S±C+´?+°?±%+°N2´+°B Ö´5+°%´8+±W+± ² 999°°9±S,´ .AE$9°C°29°?³)=LQ$9°B°P9±5%°69±QL±8,99°B³/56.$9°E±?J99±2° 9±° 9°³ $901%!5654&#"&54632354632'"!54&"&547#5432#4'3'4#"6264&"wüüLX9:VK!o€W[{¶„hb‹éB^?^2K’¹´J?]‹r&v9,,<++"$^6MI7T"63|QomVF!ôfƒƒ`žaCôöB`ûÛK2-#§Éƪ$,3Jwf&_O°< CcOþÒ*<-,*Yý¦w-(9AIQas²2+´D7+°<2°*/´R+°Z/´P+°L/´@++°/´+°$2´+°/´++° /´++°b/°Ö´ +° ±+´+² +³@ +°±+´$1+°$±/ +´H+°H±,+´_+°_±B+´>+°>±J+´W+°W±%+°U2´+°A Ö´5+°%´8+±c+± ² 999°°9±_,°.9°B·*2 @DN\$9°>´H99±2° 9±° 9°³ $901%!5654&#"&54632354632'"!54&"&547#5432#4'3'4#"64#"322654'#"&'wüüLX9:VK!o€W[{¶„hb‹éB^?^;pS&¹´$&D?]‹r&)'vV,--,+&2 +!, 4"$^6MI7T"63|QomVF!ôfƒƒ`žaCôöB`û¾R87)§Éƪ)78Bf&_O°+°'2´&+±C+±6±99±+1²34999°°9°±!99±>=° 9±!°9±)°39°.µ+16$9± 9°9012354632# 467!2>7!5654&#"&546%"!54&Ð[z¶ƒgcŒ'1SIz]Mýc&4;.$ZSg€N@ ýGKW9:UH!n€°@[?_uqXI"üi‡‰aþ¾,C- ìamN(A_TþW8)#%a7PL8V#78xTuqeBþþEbZþA2>GQ'².+°:3´++°C2².+´/+°/´H++°/´'++°4/´++°?/´ 7+°R/°Ö´%+°%±<+´7+°7±1+´+²1 +³@1. +°±+´C&+°C±+´P+°P±E+´ +°2±S+±<%±!"99±17²9:999°°9°±'99±P°9°Eµ -?J$9° °K9±H³KO$9°'±M99°.°9±/°99°4µ%17<$9± ?°"9012354632#"&547# 467!2>7!5654&#"&546%"!54&264&#"Ð[z¶ƒgcŒET`CB_F¦ýc&4;.$ZSg€NA ýGKW98WH!n€°@[?c(87)(89uqXI"üi‡‰aþ¾[3/_D`aC)#ìblN(A_TþW8)#%a7PR2V#78xTuqeBþþCdüž8R78P9Zþ2>GRb_².+°:3´++°C2².+´/+°/´S++°[/´H+°/´'++°4/´++°?/´ 7+°c/°Ö´%+°%±<+´7+°7±1+´+²1 +³@1. +°±+´C&+°C±+´`+°`±^+´P+°P±K+´X+°X±D+°-2´&+°2°´V+°V/±d+±<%±!"99±17²9:999°°9°±'99±`°9±KP´ ?S[$9°X°9±H·KPVX^`$9°'³MN$9±/°99°4µ%17<$9± ?°"9012354632#"&547# 467!2>7!5654&#"&546%"!54&2654&"2654'#"&'Ð[z¶ƒgcŒNajJKjC‘ýc&4;.$ZSg€N@ ýGKW9:UH!n€°@[?_ ""0#$.C9*(: CuqXI"üi‡‰aþ¾c13mKiiK5.ìamN(A_TþW8)#%a7PL8V#78xTuqeBþþEbüæ""""rD/!+<9(/DYþ„Œ-(MWE²H+°/3´;+°B/°53´N+°)2°/´+°$2´+°/´++° /´++°X/°Ö´ +° ±+´+² +³@ +°±E+´U+°U±+´$1+°$±Q +´?+°?±8+´L+°L±%+´+°°1 Ö´,+°,/´1+±Y+± ² 999°°9±U°S9°$²=BN999°?±;H99±L8± 99°%³)./5$9±;N¶,18?EKS$9°H°.9°° 9±° 9°³ $901%!5654&#"&54632354632'"!54&2654'7#"&=4#"#"&54632!2654'wüüLX9:VK!o€W[{¶„hb‹éB^?^+%0Z%r!%I>Np NG;:tC&`3T&9Yý¸…-(T^h²N+°/3´B+°8/´U+°Z/´)+°_2°/´+°$2´+°/´++° /´++°i/°Ö´ +° ±+´+² +³@ +°±K+´f+°f±+´$1+³b$+´F+°$±?+´S+°S°] Ö´;+°;/´]+°S±%+´+°°1 Ö´,+°,/´1+°52°1´X+°X/±j+± ² 999°°9±f±Id99°b²DH_999±F$±BN99±;?°9°S° 9°]°=9°%µ)./8UZ$9°,°39±ZU³;5IH$9°)±3=99°B¶,1?FKRd$9°N°.9°° 9±° 9°³ $901%!5654&#"&54632354632'"!54&2654'7#"&547&=4#""&54632264&#"%2654'wüüLX9:VK!o€W[{¶„hb‹éB^?^#%1Z$s==I42K*Kp OHvCv^D39^,,**þ½&S5%"$^6MI7T"63|QomVF!ôfƒƒ`žaCôöB`üØT/c6'=Ši3$G3JK29%%b7uB[E^bF]w'*A:tÔ+<++<+ÔD%`3T&9YýœŒ-(S[ku«²N+°/3´B+°8/´\+°d/´Z+°I/´l+°)2°l´V++°/´+°$2´+°/´++° /´++°v/°Ö´ +° ±+´+² +³@ +°±K+´s+°s±+´$1+°$±o +´F+°F±?+°;2´R+´i+°R±%+°T2´+´a+°32°°1 Ö´,+°,/´1+°52°1´_+°_/±w+± ² 999°°9±s±Iq99°$²DHl999°F±BN99±i?± 99°R±=g99°%¶)/8.X\d$9±VZµ;5_agi$9±lI±3=99°B¶,1?FKQq$9°N°.9°° 9±° 9°³ $901%!5654&#"&54632354632'"!54&2654'7#"&547&=4#""&546324#"322654'#"&'%2654'wüüLX9:VK!o€W[{¶„hb‹éB^?^+%0Z%rB@R8:R=@p NGvDw]Fjy,--,*$3 +! + 5þÓ$S5&"$^6MI7T"63|QomVF!ôfƒƒ`žaCôöB`üØT/c6'=Šp0(N8RQ9K(*W7uA\D_bF\xT>:tn++.V4$"/,$4òC&`3T&9Yþƒ‹-(S^°8/´/+°E/°>3´Q+°)2²EQ +³@EB +°/´+°$2´+°/´++° /´++°T/°Ö´ +° ±M+°2´H+°H±+´+°±+´$1+³A$+´B+°B/´A+°$±;+´-+°-±%+´+°°6 Ö´1+°1/´6+±U+±M ³ $9±±K99°B²EJQ999°°S9°A°)9±;$±*>99°-± 99°%³/348$9±/8°J9°Eµ,16;HM$9°Q±3S99°± 499±° 9°³ $901%!5654&#"&54632354632'"!54&23254'7#"&=4#"#54#"&547632wüüLX9:VK!o€W[{¶„hb‹éB^?^þÝ–[Q]`&zžIQXEIT.6V%r,-M["$^6MI7T"63|QomVF!ôfƒƒ`žaCôöB`þRFBa„b*0;‚Á^N9VOååOJ3f*3=†M68:Yý»“-(]h®°>/´^+°d/°U3´/++°N/°G3´Z+°)2²NZ +³@NK +°/´+°$2´+°/´++° /´++°i/°Ö´ +° ±W+´R+°R± +´+² +³@ +°±+´$1+³J$+´K+°K/´J+°$±D+´-+°-°f Ö´@+°@/´f+°-±%+´+°°6 Ö´1+°1/°a3´6+´:+±j+±W ³ $9±R±U99°K²NTZ999°°\9±D$±)G99±-@± 99°f°B9°%µ/34>^c$9°1±8=99±d^±@:99°/²8BT999°Nµ,16DRW$9°Z±3\99°± 499±° 9°³ $901%!5654&#"&54632354632'"!54&23254'7"&547&=4#"#54#"&5463262654&"wüüLX9:VK!o€W[{¶„hb‹éB^?^ÑK[Q^a'zG6$#jH(WXEIT0V&qXM\R+*>*+"$^6MI7T"63|QomVF!ôfƒƒ`žaCôöB`þRFBa„b*0;‚{0$C3%$H48%&z9VOååO%&2f*3>…Kp::ýî*++*Yý¢‹-([csǰ=/´d+°l/´b+°^/°T3´/++°N/°G3´Y+°)2²NY +³@NK +°/´+°$2´+°/´++° /´++°t/°Ö´ +° ±V+°2´Q+°Q±+´+°±+´$1+³J$+´K+°K/´J+°$±D+´-+°-°q Ö´@+°@/´q+°-±%+°\2´+´i+°82°°6 Ö´1+°1/´6+°:2°6´g+°g/±u+±V ³ $9±±T99°K²NSY999°°[9°J°)9±D$±*G99±-@± 99°q°B9°%¶/4=3`dl$9±^bµ@:gioq$9°/²8BS999°Nµ,16DQV$9°Y±3[99°± 499±° 9°³ $901%!5654&#"&54632354632'"!54&23254'7#"&547&=4#"#54#"&546324#"322654'#"&'wüüLX9:VK!o€W[{¶„hb‹éB^?^þÝ–[Q]`&zC@Q9:Q1QXEIT.6V%r\J[—+--+*$4*! + 4"$^6MI7T"63|QomVF!ôfƒƒ`žaCôöB`þRFBa„b*0;‚w1(M9QP:B((v9VOååOJ3f*3=†Nm:þ,,-U3$".,$3Yýê¢-(bj‡²_+°)3´T+°M2°9/´i+°e/´>+°F/°P3´/+°/´+°$2´+°/´++° /´++°k/°Ö´ +° ±\+´W+³W\+´+² +³@ +°W±+´$1+°Q Ö´P+°$±<+´g+°g±I+´-+°-±%+´+³1%+´6+±l+±\ ³ $9±W±Z99°Q²TY_999±P°a9±g<±)M99±-Iµ 9>ei$9°%µ/34@Fc$9°1°D9±ei°<9°>±@Z99±/F±DY99°Tµ,16IW\$9°_±3a99°± 499±° 9°³ $901%!5654&#"&54632354632'"!54&23254'7#"&5432>7#"&=4&#"#54#"&5463264#"32wüüLX9:VK!o€W[{¶„hb‹éB^?^ÂKYR]`%}—ˆ6MtnIQ$3FIV-4V&qZKO(%ýW-Q3"$^6MI7T"63|QomVF!ôfƒƒ`žaCôöB`þQH3nc,0>˜’´*)D5  ]M!;3QææQJ3g,4;ŠPm++þ0 Yþ†ž-(=S²>+°)3´I+°32°/´+°$2´+°/´++° /´++°T/°Ö´ +° ±Q+´L+³LQ+´+² +³@ +°L±+´$1+°$°A Ö´F+°F/´A+°$±;+´6+°6±%+´+³1%+´,+±U+±Q ³ $9±L°9°µ>CDINO$9±%6· )./389$9±>° 9±° 9°³ $901%!5654&#"&54632354632'"!54&2'654&"&546!2'654&#"&546wüüLX9:VK!o€W[{¶„hb‹éB^?^Sm‚cMpLd„qþ¾Sm…bN98Icq"$^6MI7T"63|QomVF!ôfƒƒ`žaCôöB`þpTƒ33$]9PO:`!34‚RrpT‚43#^:OO:`!34‚RrYý»¡-(I_kr²J+°)3´U+°?2°4/´`+°/´+°$2´+°/´++° /´++°l/°Ö´ +° ±]+´X+°X± +´+² +³@ +°±+´$1+°$°M Ö´R+°R/´M+°$±G+´B+°B±8+´i+°i±%+´+³=%+´,+°,°0 Ö´c+°c/´0+±m+±] ³ $9±X±[99°´JOPUZ$9±8B³ @E$9°i±)D99°%µ4:;?`f$9°=°.9±U`@ ,08EGMO[]f$9±J° 9±° 9°³ $901%!5654&#"&54632354632'"!54&2#"'&547'654&"&546!2'654&#"&5462654&#"wüüLX9:VK!o€W[{¶„hb‹éB^?^SmCM$#64$%VcNpKcƒqþ¾Sl„aM98Icq3,+**"$^6MI7T"63|QomVF!ôfƒƒ`žaCôöB`þpTX8 U3%$$%3[ $]9PP9`!35RrpT‚43"_:OO:`!34‚Rrýï*++*Yýœ¥-(H^fv•²I+°)3´T+°>2°3/´g+°o/´e+°/´+°$2´+°/´++° /´++°w/°Ö´ +° ±\+´W+°W±+´+°±+´$1+°$°L Ö´Q+°Q/´L+°$±F+´A+°A±6+´t+°t±%+´+°°, Ö´<+°acego$9±<_°.9±Te@06,DFLNZ\ajlrt$9±I° 9±° 9°³ $901%!5654&#"&54632354632'"!54&2#"&5467'654&"&546!2'654&#"&5464#"322654'#"&'wüüLX9:VK!o€W[{¶„hb‹éB^?^SmF[P9;Q<+dNpKcƒqþ¾Tk„aM98Jd‚r[+--+)#4*! + 5"$^6MI7T"63|QomVF!ôfƒƒ`žaCôöB`þpTZ9!b9QP:1I $]9PP9`!35RroU‚43"_9PP9`!34‚RrþR++.V5#"/,$4Wþ÷³-:EO;²0+´GC+²+² !@333´++² +³@ +°/´;++´*L0 +´*++°&/°3´77+°2°P/°3Ö±Né°N±I+´-&+°-±"+´!<+°!±+´&+° Ö´C+²C +³@ +°±+´ 1+° 2° ´>+°>/±Q+±N3°(9°I±*099°-±&799±!"°99°±99±C±99±²;@999± >° 9±0;³ >C$9±G°9±L´(-3IN$9°*±99°&°9901233##"&547#5>54'&#"#4&#"632#"&5476326264&#"2654&"Øz€GØP%#_DB_#†1H(+O654&#"#4&#"632#"&5463262654&#"2654'"&'2654&"Øz€GØP.,jJIk,k2GWK5=SfG² ]GU]IX[£‰…?5€##""/C9R9 DýR20R3-›…wUßýà4CJklIE2'$ˆJTuB7þ“m9@ãF_JKbƒh“¼JJýZ#! "pC/*=8(.D%6+,<;,+Wÿ³-BR\6²+± )33´++²8+´TC+² +³@ +°/´C++°L/´++´2Y8 +´2++°./°%3´?7+°2°]/°;Ö±[é°[±V+´5&+°5±*+´)<+°)±+±Oé°O±!+´&+²! +³@! +°±+°2´ 1+±^+±[;°09°V±2899°5±.?99±)*°A9±O±%99°!°9°²C999°±F99° ° 9±LC²O999±T°9±Y´05;V[$9°2±!99°.°A901233##"'&54>326=!5>54'&#"#4&#"632#"&54763262654'&'&#"$2654&"Øz€GØP{k918L(Okþ©1H(+O6$/ ;%ýuR20R3-›…wUßýàw„)#/,*#/@'$‰IR7@B7þ“m9@ãF_JKbƒh\fJJý÷7*,<;,+Wþ†Å-0S^}²4+´@+°F/°:3´Q+° /°3´+² +³@ +°°T Ö´%++°Z/´++°/°3´-7+°2°_/°)Ö±]é°]±W+´"&+°"±+´<+°±I+´N+°N±S+´C+°C° Ö´&+°/´&+² +³@ +°C±+´ 1+° °8 Ö´=+°=/´8+±`+±])°9°W±%99°"±-99±°/9±NI±99°³FKLQ$9°S°9±C³4:;@$9±QF°;9°@µ18=CIN$9°4°L9± %°K9°T° 9±Z´")W]$9°±99°°/901233!5>54'&#"#4&#"632#"'&54763264632'654&#"#"&5473252654&#"ØyGØPþW2G(+O5=SgF³]GU\Ja,&JS„@5L=T+%r.b5/GS@IYt,[2-Mýo)21()32-–tRÑýï&#„HP5=?5þc7=ÛD\HK^J=]ŠYcIIýA?S=5Q}:,)j5Iv3?SkO‡;+-c6Mm7*+99T8Wþ·-0do£²1+´K+°?/´<+°8/´E+°R/´_+° /°3´+² +³@ +°°e Ö´%++°k/´++°/°3´-7+°2°p/°)Ö±né°n±h+´"&+°"±+´<+°±V+´[+°B Ö´:+°[±a+´O+°O° Ö´&+°/´&+² +³@ +°O±+´ 1+°=2° °4 Ö´H+°H/´4+±q+±n)°9°h±%99°"±-99±°/9±[B±99±:µ8ERXY_$9°a°9±O³17FK$9±8<°B9±K_µ4HOV[b$9°1°Y9± %°X9°e° 9±k´")hn$9°±99°°/901233!5>54'&#"#4&#"632#"'&54763262+"3!!"&546;254&#"#"'&54732=46%2654&#"ØyGØPþW2G(+O5=SgF³]GU\Ja,&JS„@5¡HRiZ«33gþ’/?@.¦1*#K9E''k#L%BBý%)21()32-–tRÑýï&#„HP5=?5þc7=ÛD\HK^J=]ŠYcIIýÓcO^v=/)*3™0D*.)5?+, Ö´F+°F/´>+²>F +³@>A +°d±i+´Y+°Y° Ö´&+°/´&+² +³@ +°Y±+´ 1+° °8 Ö´M+°M/°T3´8+°42²M8 +³@MP +±y+±v)°9°p±%99°"±-99±°/9°_°9°F°9±>µ54'&#"#4&#"632#"'&54763262#!"3!!"&546;2654+53254#"#"&54732=46%2654&#"ØyGØPþW2G(+O5=SgF³]GU\Ja,&JS„@5¶@U//C.þÿ44kþŽ-??-ý'@@\?J:?Tl J1"@Lý)21()32-–tRÑýï&#„HP5=?5þc7=ÛD\HK^J=]ŠYcIIýÓ96DC0I>/)*3%2=+6X'5>Q?p2/$J%8L06DH7*+99T8WýéÈ-0^gr±°54'&#"#4&#"632#"'&54763264632#"&54632>54#"#"'&5473253254&#"2654&#"ØyGØPþW2G(+O5=SgF³]GU\Ja,&JS„@5O=R,*GO7`L,*V?:Y{_l(% '4DŒv2@N75G‹:4*`0%(hü 7*+99T8Wþ†À-0aiqxƒü²^+°13´R+°K2°?/°;3´w+°h2°s/´D+°Y/´p+°l/´T+° /°3´+² +³@ +°°y Ö´%++°/´++°/°3´-7+°2°„/°)Ö±‚é°‚±|+´"&+°"±+´<+°±[+°B2´n+´u+°n±j+´V+°V±+´&+² +³@ +³O+´N+°±+´ 1+° °4 Ö´I+°I/´4+°82°4´b+°b/±…+±‚)°9°|±%99°"±-99±°/9±n[±99±ju³YTlp$9°V³?R^w$9°°D9°O°9±N°`9°@ 1;=EKdfhr$9± b°69±w?°=9°s³8Bbf$9°D±6d99°p±NO99°l³IV[4$9±^R°`9±y ° 9±´")|‚$9°±99°°/901233!5>54'&#"#4&#"632#"'&54763262#"'#"&54;27654#"#54#"#"5463264#"32%4#"32#"322654&#"ØyGØPþW2G(+O5=SgF³]GU\Ja,&JS…?5È9C%%8'D4sHE¦Ž0&$GF=Z% D/"NOAO%"“)(()þµ  ÁaWtý,)21()32-–tRÑýï&#„HP5=?5þc7=ÛD\HK^J=]ŠYcGGýÓE87")'8662Y(C>MJAH!+W:?++þè$$*Á  c$‹7*+99T8Wþá-0w}…Ž™²o+°s3´c+°\2°?/´<+°8/´C+°N/°R3´}+°2°‰/´V+°j/´„+° /°3´+² +³@ +°° Ö´%++°•/´++°/°3´-7+°2°š/°)Ö±˜é°˜±’+´"&+°"±+´<+°±A+°T2´:+°‹2°l Ö´‚+°:±~+° 2´g+°g±+´&+³`+´_+°±+´ 1+°Z Ö´v+²vZ +³@v= +°°x Ö´K+³G +´4+±›+±˜)°9°’±%99°"±-99±°/9±:‚±99°~´Cej€„$9°g´8Rco$9°°V9±_`±q99°°†9°Z´NP\s{$9±K²17D999±8<°A9±‰}·G4KTPx{‹$9°V°I9±„j²1`_999°cµZglqv€$9± ° 9±•´")’˜$9°±99°°/901233!5>54'&#"#4&#"632#"'&5476326#!"3!!"543!2654'#"'#"54727654#"#54#"#"546326324"2%4#"32"322654&#"ØyGØPþW2G(+O5=SgF³]GU\Ja,&JS„@5*7I4þ¬//Æþ1cc]+#4&A?d“¥~zGJ6]80!PR?\Y9E6RRþ²Á`<7[hýd)21()32-–tRÑýï&#„HP5=?5þc7=ÛD\HK^J=]ŠYcIIý' @-5J3FJ0,#*67AJL>>85A 8)R6;55A7p%%!­[q7*+99T8Wýýá-0ƒ‰‘š¥Œ²€+°13´t+°m2²t€ +³@tp +°A/´M+°^/°b3´‰+°™2°‰°S Ö´R+°“/´f+°{/´+° /°3´+² +³@ +°°› Ö´%++°¡/´++°/°3´-7+°2°¦/°)Ö±¤é°¤±ž+´"&+°"±+´<+°D Ö´I+°±}+´Ž+°d Ö´—+°Ž±Š+´x+°x±+´&+² +³@ +°°q Ö´p+°±+´ 1+³4 +´k+°k/´4+°[2³O +°V3´=+°92²O= +³@OR +±§+°6ºú÷À3+ °Y°XÀ±6ù°7À³67XY....³67XY....°@±¤)°9°ž±%99°"±-99±I±/F99±d}°G9±Š—µ{vŒ$9°x³bt€™$9°q°f9°²AM‚999°p°9°±`’99°k³1^m†$9±= °;9±^M±=O99±‰R°;9°S±:`99°“³V[d—$9°f±9†99°{±Ii99°°D9°t´4kx}Œ$9°€±G‚99± %°F9°›° 9±¡´")ž¤$9°±99°°/901233!5>54'&#"#4&#"632#"'&54763262#"&5473 54+53254/#"'#"54727>54#"#54#"#"5463264#"3%4#"32"322654&#"ØyGØPþW2G(+O5=SgF³]GU\Ja,&JS„@5s8E &%5lB·«ÌM+E`•X'#*4+A.s“¤0^3IGD@Y7/"QRAP%•'))þÜ¿_A7[gýˆ)21()32-–tRÑýï&#„HP5=?5þc7=ÛD\HK^J=]ŠYcIIýÓ>5*.F&\´’mV';sOw9Q1!*18:MY1*54'&#"#4&#"632#"'&54763262#"'&54632654'#"'#"5476327654#"#74'0#"5463264#"32%4#"323254#"'#"322654&#"ØyGØPþW2G(+O5=SgF³]GU\Ja,&JS„@5l:B w65J/,5S,S 36)F/q“¤6Y/#$CI7\*=0#RS@b˜)(()þ·äQ/Q/)+YaZdý)21()32-–tRÑýï&#„HP5=?5þc7=ÛD\HK^J=]ŠYcIIýÔF;*šF21$,#-M&0.9NL0@B<54'&#"#4&#"632#"'&54763262#"'53254+53254#"&5>%2654&#"ØyGØPþW2G(+O5=SgF³]GU\Ja,&JS„@5…=X6G170<@AA@SAM(<)kýb)21()32-–tRÑýï&#„HP5=?5þc7=ÛD\HK^J=]ŠYcIIýÓ;4C/= @20>)4SB@T]M^rH7*+99T8Wý½·-0`it³²1+´V+°A/´a+°f/°\3´K++°P/´Q+° /°3´+² +³@ +°°j Ö´%++°p/´++°/°3´-7+°2°u/°)Ö±sé°s±m+´"&+°"±+´<+°±^+´Y+°Y±+´&+² +³@ +³D+´h+°±+±MT22´ 1+°>2´:+°42²: +³@P +° ´d+°d/±v+±s)°9°m±%99°"±-99±°/9°^±99°Y°\9±D±[99°±HI99°h°F9°µ1AKVae$9°d±8<99±fa±D>99°K³FH<[$9°P±:I99°Q±8Y99°V°49±j ° 9±p´")ms$9°±99°°/901233!5>54'&#"#4&#"632#"'&54763262#"&547&'53254+53254#"&5>264&"2654&#"ØyGØPþW2G(+O5=SgF³]GU\Ja,&JS„@5Œ=X6")4SB@T_K]sýò*<,,<*V7*+99T8Wý¤½--[apzé².+´Q+°=/´b+°j/´a+°^/°W3´F+°K/´L+° /°3´+² +³@ +°°r Ö´$++°w/´++°/°3´*7+°2°{/°'Ö±zé°z±t+´!&+°!±+´<+°±Y+´T+°T±+´&+² +³@ +°°n Ö´?+°?/´n+°±+°\2´ 1+°H Ö°O3´6+°12²H6 +³@HK +°´g+° °: Ö´e+°e/´:+±|+±z'°9°t±$99°!±*99±°,9°Y±99°T°W9±?±V99°±AD99±Hn·=.FQ^abi$9±g²48<999±^aµ?:egln$9°F³AC8V$9°K±6D99°L±4T99°Q°19±r ° 9±w´!'tz$9°±99°°,901233!5>54&#"#4&#"632#"&5463262"&547&/3254+53254#"&5>4#"32654'"&'2654&#"ØyGØPþW2GWK5=SgF³]FV]IX[£‰„@5…=X 6 GSpS& H<@AA@SAM(<)k¸,--%3 ,@+ 4üÑP31()3-•‚tRÑýï&#„HRp?5þc7=ÛD\HJ_~f¶IIýÓ;4-C-)Q8SS85)C60>)4SB@T]M^rþ.XXV2%!.*$3p8)*:9TWýçÀ--7gq²²e+´Z+°B/´k+°p/´I+°Q/´R+° /°3´+² +³@ +°°/ Ö´$++°4/´++°/°3´*7+°2°r/°'Ö±7é°7±1+´!&+°!±+´<+°±+´&+² +³@ +³]+´b+°b/´]+°°F Ö´h+°±+´ 1+°82° ´V+°V/° °? Ö´M+°M/´?+±s+±7'°9°1±$99°!±*99±°,9°b±99°F°`9±h]±_99±·IQRZekmp$9°V°K9°M°;9±pk°F9°I°K9°Q³?M_`$9°R²;]b999°Z°89±/ ° 9±4´!'17$9°±99°°,901233!5>54&#"#4&#"632#"&5463262654&#""'&54632654&+532654'&#"&546323254&#"ØyGØPþW2GWK5=SgF³]FV]IX[£‰„@5þcP31()3%"mO0)6G+`$7$))1"@N(=*o\C_ý-".'!5-•‚tRÑýï&#„HRp?5þc7=ÛD\HJ_~f¶IIþ8)*:9Tþ!= )'Nj* '0,&>=* QA?SZN\pEþ  WþˆÎ--7]n²Y+°I/°D3´U+°82° /°3´+² +³@ +°°/ Ö´$++°4/´++°/°3´*7+°2°^/°'Ö±7é°7±1+´!&+°!±+´<+°±M+´R+°R±X+´[+°2°[´&+°/²[ +³@ +°[±+´ 1+° °@ Ö´;+°;/´@+±_+±7'°9°1±$99°!±*99±°,9±RM±99°³IOPU$9°X°9°[°G9°³8=>D$9±UI°G9°Y³=@MP$9°$±>O99±/ ° 9±4´!'17$9°±99°°,901233!5>54&#"#4&#"632#"&5463262654&#"2654'7#"&'#"'&547326=3ØyGØPþW2GWK5=SgF³]FV]IX[£‰„@5þcP31()3t0:Y$x-2O > LN./y W=1$C+-•‚tRÑýï&#„HRp?5þc7=ÛD\HJ_~f¶IIþ8)*:9TþFG3e)59‡M68 =67KŠ95(i3D/ää.Wý½Î--7dm¬²`+°G/´e+°P/´\+°82° /°3´+² +³@ +°°/ Ö´$++°4/´++°/°3´*7+°2°n/°'Ö±7é°7±1+´!&+°!±+´<+°±T+´Y+°Y±_+´b+°2°b´&+°/²b +³@ +³Jb_+´l+°b±+´ 1+° °@ Ö´;+°;/°g3´@+´D+±o+±7'°9°1±$99°!±*99±°,9±YT±99°³PVW\$9°_°9°J°N9±lb°L9°µ8=>Gej$9°;±Bi99±Pe²JDi999°\²BLN999°`³=@TW$9°$±>V99±/ ° 9±4´!'17$9°±99°°,901233!5>54&#"#4&#"632#"&5463262654&#"2654'7#"&547&'#"'&547326=3264&"ØyGØPþW2GWK5=SgF³]FV]IX[£‰„@5þcP31()3t0:Y$xI?I42K$+ LN./y W=1$C+D,,<++-•‚tRÑýï&#„HRp?5þc7=ÛD\HJ_~f¶IIþ8)*:9TþFG3e)59‡e6&H3JK24$#=67KŠ95(i3D/ää.Ô*<,,<*Wý¢Î--7ck{ß²_+°G/´l+°t/´j+°P/°f3´[+°82° /°3´+² +³@ +°°/ Ö´$++°4/´++°/°3´*7+°2°|/°'Ö±7é°7±1+´!&+°!±+´<+°±S+´X+°X±^+´a+°2°a´&+°/²a +³@ +°a°y Ö´J+°J/´y+°a±+´ 1+³d +´q+° °@ Ö´;+°;/´@+°D2°@´o+°o/±}+±7'°9°1±$99°!±*99±°,9±XS±99°³PUV[$9°^°9°J°N9±ya°L9°@ 8=>Gfhjlt$9±qd°B9±PjµJDoqwy$9°[²BLN999°_³=@SV$9°$±>U99±/ ° 9±4´!'17$9°±99°°,901233!5>54&#"#4&#"632#"&5463262654&#"2654'7#"&547&'#"&547326=34#"322654'#"&'ØyGØPþW2GWK5=SgF³]FV]IX[¤ˆ„@5þcP31()3t0:Y$xJIR8:R0% LK`y W=1$C+i+--+)$3*! + 5-•‚tRÑýï&#„HSo?5þc7=ÛD\HJ_~f¶IIþ8)*:9TþFG3e)59‡h5(R8RQ9@(=kMŠ95(i3D/ää.o,,-U3$".,$3WýéÎ--7gp¼²c+°D/´k+°o/´H+°O/°S3´8+°_2° /°3´+² +³@ +°°/ Ö´$++°4/´++°/°3´*7+°2°q/°'Ö±7é°7±1+´!&+°!±+´<+°±W+´\+°\±F+´h+°h±b+´e+°e° Ö´&+°/´&+² +³@ +°e±+´ 1+° °@ Ö´;+°;/´@+±r+±7'°9°1±$99°!±*99±°,9±\W±99°F°Y9°h²SZ_999±b°9°´DHQko$9±eµ8=>KOm$9°;°M9±ok±FK99±8O±MQ99°c³=@WZ$9°$±>Y99±/ ° 9±4´!'17$9°±99°°,901233!5>54&#"#4&#"632#"&5463262654&#"2654'7#"543267#"'#"'&547326=33254#"ØyGØPþW2GWK5=SgF³]FV]IX[£‰„@5þcP31()3o0;P#tLQy‘s.S -A I!GP.0r$Q8/,D%”-".P--•‚tRÑýï&#„HRp?5þc7=ÛD\HJ_~f¶IIþ8)*:9TþCF3m'1A”{_iJ==119;Lˆ64$i3H-éé1‘ WýâÁ--7ixä²e+±>[33°D/´w+°s/°l3´H+°L2²sH +³@so +°R/°V3´8+°a2° /°3´+² +³@ +°°/ Ö´$++°4/´++°/°3´*7+°2°y/°'Ö±7é°7±1+´!&+°!±+´<+°±Y+´^+°^±F+´u+°u±d+´g+°n2°g³g+´&+°/´&+² +³@ +°g´p+°p/°g±+°P2´ 1+° °@ Ö´;+°;/´@+±z+±7'°9°1±$99°!±*99±°,9±F^²[999°u²V\a999°±Hs99°d°9±gp³DTJw$9±¶8=>LRjl$9±sw±Fj99°H±JN99±8R±PT99°e³=@Y\$9±/ ° 9±4´!'17$9°±99°°,901233!5>54&#"#4&#"632#"&5463262654&#"2654'7#"543263267#"'#"&547326=3&#"#5&#"32ØyGØPþW2GWK5=SgF³]FV]IX[£‰„@5þcP31()3b3>UwKQ{’R,%5!%*KJP\vW<0!.<(-(#T=-•‚tRÑýï&#„HRp?5þc7=ÛD\HJ_~f¶IIþ8)*:9Tþ>G5j*/A“{bjS@&,44nN„70*f5H/!ææ3"Wþ„Â--7\Z²8+°=3´Q+°H2²Q8 +³@QM +° /°3´+² +³@ +°°/ Ö´$++°4/´++°/°3´*7+°2°]/°'Ö±7é°7±1+´!&+°!±+´<+°±Y+´T+°T±M+´L+°2°L´&+°/²L +³@ +°L±+´ 1+° °@ Ö´E+°E/´@+±^+±7'°9°1±$99°!±*99±°,9±TY°9°´8QVW$9°M°9°L°;9°³=BCH$9±/ ° 9±4´!'17$9°±99°°,901233!5>54&#"#4&#"632#"&5463262654&#"2632'654&#"#54&#"&5476ØyGØPþW2GWK5=SgF³]FV]IX[£‰„@5þcP31()3œ%: RO\x W=2&B+19['w/.-•‚tRÑýï&#„HRp?5þc7=ÛD\HJ_~f¶IIþ8)*:9T€'DnLŠ93)l4C1ææ.G5j'29ˆL87Wþ„Ä--7_k¨²;+°>3´W+°O2²W; +³@WS +°E/°^3´c+´LiS; +´L+° /°3´+² +³@ +°°/ Ö´$++°4/´++°/°3´*7+°2°l/°'Ö±7é°7±1+´!&+°!±+´<+³8+´[+°±S+´R+°2²SR +³@S +³RS+´&+°R±I+´`+°`±+´ 1+° °B Ö´e+°e/´B+±m+±7'°9°1±$99°!±*99±8°,9±S[´;]^$9°°=9±IR°>9±`°O9°´?EMci$9°e°g9±cE°]9°i³8B[I$9±;W°=9±/ ° 9±4´!'17$9°±99°°,901233!5>54&#"#4&#"632#"&5463262654&#"463262#"'&546;&#"#54&#"&%3254'&#"ØyGØPþW2GWK5=SgF³]FV]IX[£‰„@5þcP31()3ªbML!'®?=NB;G: =a=- 0Su¥ M //-•‚tRÑýï&#„HRp?5þc7=ÛD\HJ_~f¶IIþ8)*:9TþÅOl:::9VJg.&5?T!Oäç ,%'0k#56Z/f4WýöÄ--7q}à²C+°G3´8+°j2²8C +³@8n +°P/´U+°a/°>3´u+° /°3´+² +³@ +°°/ Ö´$++°4/´++°/°3´*7+°2°~/°'Ö±7é°7±1+´!&+°!±+´<+³;+´@+°@/´;+°±n+´m+°m±+´&+² +³@ +³r+´d+°d/´r+°±w+´^+°^±+´ 1+° °M Ö´Y+°Y/´M+±+±7'°9°1±$99°!±*99±;±,>99°n´8=C$9°m°E9±d±Gj99°r±R99°²Sau999°w³PUh{$9°^±I\99±UP°R9°a°S9°u°=9°8@ ;@IMY\^d{$9°C°E9±/ ° 9±4´!'17$9°±99°°,901233!5>54&#"#4&#"632#"&5463262654&#""&54632632#"'7327654&'#"&54767&#"#54&3254'&#"ØyGØPþW2GWK5=SgF³]FV]IX[£‰„@5þcP31()3ð0?Ps`PJ!'O$P')sW;2&,?))+! <<3?"#3BZ=-Ý?%2-•‚tRÑýï&#„HRp?5þc7=ÛD\HJ_~f¶IIþ8)*:9T½K2k'46ŒNp22R 7:T^Š#434D/O !H\T8;/0Méé -¶2\2&=Wÿ/±-26@²(+´8C+² +±433´++² +³@ +° /´6++´"=( +´"++°/°3´/7+°2°A/°+Ö±?é°?±:+´%&+°%±+´<+°±+´&+² +³@ +³@ +°±3+°2´ &+±B+±?+° 9°:±"(99°%±/99±°19°±699°± 99°3°59±6 ° 9±8 °9±=´ %+:?$9°"±99°°1901233!57#5>54'&#"#4&#"632#"&54763265#$2654&"Øz€GØNþé–3F(+O6BNXY²4+´PC+²+±%@33´++² +³@ +°/´C++°/± I33´B++´.U4 +´.++°*/°!3´;7+°2°Y/°7Ö±Wé°W±R+´1&+°1±&+´%<+°%±+´&+° Ö´L+²L +³@ +³@ +°±?+°2´ &+° 2° ´F+°F/±Z+±W7°,9°R±.499°1±*;99±%&°=9°²!B999±L²999±?³ACI$9± F° 9±C± 99°B°9±P°9±U´,17RW$9°.±99°*°=901233##"&547#57#5>54'&#"#4&#"632#"&54763265#2654&#"2654&"Øz€GØN!#/.GB_#Úé–1H(+O6JZd²1+´\C+²+±"<33´++² +³@ +°/´K++°S/´?+°/± E33´>++´+a1 +´+++°'/°3´77+°2°e/°4Ö±cé°c±^+´.&+°.±#+´"<+°"±+´&+³X+´+°/´X+°2²X +³@ +³@ +°±B+´P+°P±;+°2´ &+° 2° ´N+°N/±f+±c4°)9°^±+199°.±'799±"#°99°±99°±>99±X³HU$9°B´=?EKS$9°P°9± N° 9±?µ NPVX$9°>°9±\°9±a´).4^c$9°+±99°'°9901233#"&547#57#5>54&#"#4&#"632#"&5463265#2654&#"2654'#"&'2654&"Øz€GØN/.j”k.¾é–2GWK5=SfG² ]GU]IX[£‰…?5çIƦ##"".D9*(9 CýR20R3-›…wUßý4DIkjJF2)¨'$ˆJTuB7þ“m9@ãF_JKbƒh“¼JJýGŒŒ¾""""pC. *=9'/Bö6+,<;,+Wþ€³--7p™²_+´U+°>/´C+°@ Ö´A++°H/´m+°i/´M+° /°3´+² +³@ +°°/ Ö´$++°4/´++°/°3´*7+°2°q/°'Ö±7é°7±1+´!&+°!±+´<+°±\+´W+°W±+´&+² +³@ +³K+°A3´k+°±E+±S22´;+°2´a+±r+±7'°9°1±$99°!±*99±°,9°\±99°W°Z9±K±Y99°°@9±Ek@ >CHMQU_dm$9±@>°Y9±AC±;E99±mH±JW99±Mi°K9°U°a9±/ ° 9±4´!'17$9°±99°°,901233!5>54&#"#4&#"632#"&5463262654&#"2#"/3254+"&4632325&#"&'4632#"#'"#"3632ØyGØPþW2GWK5=SgF³]FV]IX[£‰„@5þcP31()3¦#7CI<-/J:%:!36 %X’ :"q_ž6%//-•‚tRÑýï&#„HRp?5þc7=ÛD\HJ_~f¶IIþ8)*:9Tþª2!2D,@4)š6_X\^ni",Zÿ,X2DP² +°+3´++²:+´EC+² +³@ +° /´++´4K: +´4++°0/°'3´A7+°2°Q/°Ö´+°±=+±Né°N±H+´7&+°7±,+´+<+°+±$+´1+²$ +³@$ +°±+°2´ &+±R+±=±99°N°29°H±4:99°7±0A99±+,² C999°$°9°°9±E °!9±K´27=HN$9°4³$$9°0°C9°A°901233! '&47! 7675!5>54&#"#4&#"632#"&54763262654&#"|{€HÚOŽrþÂþ¢š¬Z?R—‡4 x‚þ¤1HVK6=SfF³_GT\JX[KR…?5þŠ*1/*)32-š†xTàýߊ* er–†$uƒð`UR'$‰IUtA8þ“m9@ãF_JLa„gŽ[fJJþ6+-;;,*8ZþCX2MUaz²)+°43´++²C+´VC+²) +³@ +°/´O++°/´#++´=\C +´=++°9/°03´J7+°2°b/°Ö´+°±F+±_é°_±Y+´@&+°@±5+´4<+°4±-+°2´1+²- +³@-) +°-° Ö´U+°±+°'2´ &+° 2° ´Q+°Q/±c+±F±99°_°;9°Y±=C99°@±9J99±45²#L999°±099±U-°9°°9°µ NORS$9±O³ QT$9°#²RS999°C° 9±V)°*9±\´;@FY_$9°=³-$9°9°L9°J°901233"&547# '&47! 7675!5>54&#"#4&#"632#"&5476326264&"2654&#"|{€HÚOBQ_†_UÑþ¢š¬Z?R—‡4 x‚þ¤1HVK6=SfF³_GT\JX[KR…?5jP88P8ýX*1/*)32-š†xTàýß^//^C``C+#er–†$uƒð`UR'$‰IUtA8þ“m9@ãF_JLa„gŽ[fJJüY8P88P~6+-;;,*8ZþZ2O[jv¸²++°63´++²E+´kC+²+ +³@ +°/´]++°e/´P+°/´%++´?qE +´?++°;/°23´L7+°2°w/°Ö´!+°!±H+±té°t±n+´B&+°B±7+´6<+°6±/+´1+²/ +³@/+ +³i/+´+°/´i+³Y/+´g+°g/´Y+°±S+´b+°b± +°)2´ &+° 2° ´_+°_/±x+±H!±99°t°=9°n±?E99°B±;L99±67²%N999°±299°/°9°i°9±Y°\9°SµPV]de$9°b° 9±P· SY_agi$9°%² V999±k+°,9±q´=BHnt$9°?³!/$9°;°N9°L°901233#"'&547# '&47! 7675!5>54&#"#4&#"632#"&54763262654&#"2654'"&'2654&#"|{€HÚOH_kJK54U»þ¢š¬Z?R—‡4 x‚þ¤1HVK6=SfF³_GT\JX[KR…?5""##^C:R: ýw*1/*)32-š†xTàýßd/3kJk54L6.er–†$uƒð`UR'$‰IUtA8þ“m9@ãF_JLa„gŽ[fJJü " !#pC/!)<8(/œ6+-;;,*8Wþ„Î-0U_j‰²O+°73´C+°=/°I3´1+°V2° /°3´+² +³@ +°°` Ö´%++°f/´++°/°3´-7+°2°k/°)Ö±ié°i±c+´"&+°"±+´<+°±L +´]+°]±Y+´G+°G±+´&+² +³@ +°°T Ö´@+°@/´T+°±+´ 1+° °9 Ö´4+°4/´9+±l+±i)°9°c±%99°"±-99±°/9±Y]´EIJ$9°G±CO99±@°9±T³167=$9±C1¶49@GLS[$9°O°69±` ° 9±f´")ci$9°±99°°/901233!5>54'&#"#4&#"632#"'&54763262654'7#"&=4#""&54632!2654'2654&#"ØyGØPþW2G(+O5=SgF³]GU\Ja,&JS„@5¿$2Z$s!'H>No OHvCv^D38þþ$S4%þ8)21()32-–tRÑýï&#„HP5=?5þc7=ÛD\HK^J=]ŠYcIIü“T/c6'=ŠH3=V@7uB[D_bF]w')B:tC&`3T&9ˆ7*+99T8Wý¹Î-0\eozȲV+°73´J+°@/´]+°1/°f3° /°3´+² +³@ +°°p Ö´%++°v/´++°/°3´-7+°2°{/°)Ö±yé°y±s+´"&+°"±+´<+°±S +´m+°m±i+´N+°N±+´&+² +³@ +°°[ Ö´G+°G/´[+°[°d Ö´C+°C/´d+°±+´ 1+° °9 Ö´4+°4/°_3´9+´=+±|+±y)°9°s±%99°"±-99±°/9±im´LPQ$9°N±JV99±G°9±d[°E9°µ167@]a$9°4°;9±1]¶;=CEPQa$9°J¶49GNSZk$9°V°69±p ° 9±v´")sy$9°±99°°/901233!5>54'&#"#4&#"632#"'&54763262654'7#"&547&=4#""&54632264&"%2654'2654&#"ØyGØPþW2G(+O5=SgF³]GU\Ja,&JS„@5¿$2Z$sC3I42K0Bo OHvCv^D38O,,<**þÍ$S4%þ8)21()32-–tRÑýï&#„HP5=?5þc7=ÛD\HK^J=]ŠYcIIü“T/c6'=Šo1&@3JK2>%)X7uB[D_bF]w')B:tÓ+<,,<+ÓC&`3T&9ˆ7*+99T8Wý™Î--7bjz„é²]+°>3´Q+°G/´k+°s/´i+°X/´{+°82°{´e7+° /°3´+² +³@ +°°/ Ö´$++°4/´++°/°3´*7+°2°…/°'Ö±7é°7±1+´!&+°!±+´<+°±Z +´‚+°‚±~+´U+°U±+´&+² +³@ +°°a Ö´N+°N/°J3´a+´x+°±+´ 1+³c +´p+°B2° °D Ö´n+°n/°;3´D+°@2±†+±7'°9°1±$99°!±*99±°,9±~‚´SWX$9°U±Q]99±N°9±ax°v9°@ 8=>GLegiksu$9±eiµJDnpvx$9±{X±BL99°Q¶;@NUZ`€$9°]°=9±/ ° 9±4´!'17$9°±99°°,901233!5>54&#"#4&#"632#"&5463262654&#"2654'7#"&547&=4#""&546324#"322654'#"&'%2654'ØyGØPþW2GWK5=SgF³]FV]IX[¤ˆ„@5þcP31()3Ž%1Z$sFAQ89S@Bo OHvCv^Ejx,--,*$3 +!, 5þÔ$S4%-•‚tRÑýï&#„HSo?5þc7=ÛD\HJ_~f¶IIþ8)*:9Tþ@T/c6'=Št.)N8RR8L*)X7uB[D_bF]wT>:tq++.U4#".,$3ôC&`3T&9Yÿ0v/Cï²+´++²+°/´ ++°/±é±Aé°>/°;3±!é°$2°*/´4C+°D/°2Ö´-&+°-° Ö´&+°/´ &+°-±+±@é°@±+°&2´<+°82±E+±-°09± ±/99°@°9°·!*4;$9°± 99± °9±³/0$9°A±199±>°-9°!°9°*²&2899901%2+"3!!"&46;254#"#"&46323254.#"&4632#"&#"3266?ŽÕ$97&UþžEYZD®o9C+AB,J 00=$ly,J0«ˆ>cFE5 P .+ ZôE8x' %DH€H90DXC' hcMnkò…A14BFhÿ*2Zò²V+²6+´7++²+°$/±0é°/>G5D/9gÿ"2Eв2+²+²+°/±é°/±Eé°?/°<3±$é°,/´7C+°2°F/° Ö´+°±4+´/+³2/4+´1+°/± +´A<+°A±+°*2´<+°92±G+±4°9°2°9±A ±99°µ$,7<$9±2°19±?E´  /4$9±,$°99°7°901%2#"&5476732>54&+"&5476;232654#"&54632#"&#"3}>KZ‡Nµ»9=[[J7eH4'@5>,'4V–or*A.‹â?/GD # bECe/ôËpCPN'pǾ\NB.$*G8J& ]ŒxX†…‡¦¨6Z0! gþ'2O[²<+²+²+²#+° /´P++°'/±Oé°I/°F3±.é°6/´AC+°2°\/°Ö´+°±>+´9+³<9>+´;+°9±+´Y+°K2°Y´*<+°*/°Y±#+±4S22´<+°C2´+±]+±>°9°<°9±Y±99°#@ '.6AFPV$9±$9±6.°C9°A°901%2#"&547&'&5476732>54&+"&5476;232654#"&54632#"&#"32654&#"}>KaR/.FB_™\o9=[[J7eH4'@5>,'4V–or*A.‹â?/GD #(87)(78 bEd>/^B10aB2&duâpCPN'pǾ\NB.$*G8J& ]ŒxX†…‡¦¨6Z0! ýË7()78('8gþ2DO_?²4+²+²+° /´P++°X/´F+°K/´7+°"/±Dé°?/±(é°./´9C+°2°`/°Ö´+°±6+´1+³416+´3+°1± +´]+°% Ö´A<+°]±[+´N+°N±H+´U+°U±+±,S22´<+°;2´+±a+±6°9°4°9±]%±99±HN@ !"(.9?D PX$9°U³)>$9±KF¶ SU[]$9°±99±"4°39±?D´%16$9±.(°;9°9°901%2#"&547.546732654&+"&546;2654#"&54632+"32654&#"2654'#"&'}>KiZiKIl&£ª+8=[’’XŒ4'@5>H?V–or*A.‹â?/WD$0"#"(-VVG7'.Óc(87)(89þö`C:-û3þÓþÿ-:C`N½Îd/° Ö´!+°!±+´;+°;±+±é°±&+´3+°3± +´&+°2°´1+°1/±?+±;²999°± 899°¶#)+.6$9°&°(9±1°9±)#µ139;$9±±!99° °901#"&547#5! #'54'4#"62654&"2654'#"&'zjJIl1ë )/R>eFVGDHÓP""0"!/D9*(8DzIkkID6û3þÓþÿ5y½ÎdSš5(nX·…þµ" "pD.!,;8'.DYÿ~.'0@¬°/´8+°1/´+°/´'++°/2°*/± é°A/°Ö´/&+°/±+´4&+°4±(+´#&+°#±+°2´ +±B+±(4µ '*18$9°#± !99°±<99±8°9°1²4999±*'°#9° ± !990126=!5! #"'&'&54>%54'&'4#"6"327654&'&WKgþ%PHm P/16I|"='-^dK:'/Û$!=#9-<2*-%1Eü1þÓþùzC<"#,+p»¹&c>HVE'm1=k¹ŠþÈ  Wÿv.'0Aç²+´'++°/´8+°4/°<3´+°2²4 +³@4A +°*/±é°B/°Ö´/+°/°6 Ö´+°/´6+°/±A+´@+°@±(+±#é°#±+° 2´&+±C+±A6²*'999°@±899°(°9°#²!<999°± :99±48² :999°°9±'±99°*±#/99°°!901463263267675!5! 3+"54'4#"64&#"327&#"#hF/[(-VVG7'.ÓG/;Š`G 6"9€+;00I û3þÓó$eE>B½ÎdDz+° 3´ +°2²  +³@  +°/´5++°8/±é°?/°Ö°(2´=+´#+°=±+´+°/2³6+´1<+°±,+´&+°° Ö´+°/´+±@+±=µ %&58$9°6± 99±,1³ $9±85±1=99°°/901%!5! 2632'654&#"#54&#"&5476%54'4#"6týå þ‘%: QP\x W=2%B+19['w/.u<&,WVG7&-Ñõ)þÛþ÷'DnLŠ93)l4C0ææ.G5j'29ˆL87S¶Éb>GV>k29h²‚YþˆŒ.,6?L²+°)3´+°2² +³@ +° /°$3´C+´I +´+°/´6++°9/±é°M/°Ö°&2´>+´!+°>±+´+³7+´2<+°±+´@+°@±-+´&+°° Ö´E+°E/´ +±N+±>µ#$)69$9°±+99°°09±@2±99°-³ CI$9°E°G9±C °#9°I³ !&$9±°+9±96±2>99°°0901%!5! 2#"&546;&#"#54&#"&546326754'4#"63254'&#"týå ¦QmE=/:@6 6X6'+6IjWFE#¨<&,WVG7&-ÑcE*õ)þÛþôrTHfO7=T"Oàä +J1e(2:ƒLn;9V¶Éb>GV>k29h²‚þ;.dWýõÛ.=GP\?°/´+°&/°<3´T+°6/°.3´ +°2°/´G++°J/±é°]/°Ö°2´O+´9+°O±2+´1+°1±H+´C<+°C°Q Ö´)+°)/´Q+°C±>+´&+°$2°´V+°V/°±+´+±^+±2Oµ 6;Q¶&,TZ$9°V°X9°±"99±°9°&°9°T²12;999°6@ $)"9Z$9° ° 9±JG±CO99°°A901%!5! 4632632#"'732654&'#"&5467&#"#54&#"&54'4#"63254'&#"týå ýãVFA#Fs!DI23O2. (:G% j/8GV>k29h²‚þ42[5%>Yÿò‘.+«²+²+° 3´++² +³@ +°%/°3±é° 2°,/°Ö´)1+°)±!+´ 1+° ±+´&+² +³@ +°±+´1+±-+±!)²+999° ° 9°° 9°°9±±+99°%´ )$901.54763263233!5654&#"#4&#"M`EJui;7itHC@áPþYgdS/APH7Q3-‰%–dwOW]]TOtUàýß6C¢WtS4þ¡_5P@Yþù‘.7Aø²+²!+²,=333´++²! +³@ +°/´8++°1/°(3±é° 2°B/°Ö´51+°5±-+´,1+°,±%+°2´&+´@+²%@ +³@%" +°±+´1+°2°´;+°;/±C+±-5²7999°,° 9°%± (99°@±!99±²8=999±;°9±8³;?$9±!±#799°1´ %5$901.54763263233##"&547#5654&#"#4&#"264&#"M`EJui;7itHC@áP##/0DB_!„gdS/APH7Q3-‰»)77)'99%–dwOW]]TOtUàýß*:D/0`C8,6C¢WtS4þ¡_5P@î7R79N9YþÔ‘.3?N7²+°)3²:+´7+²+²+°/´@++°H/´4+°./°%3±é° 2°O/°Ö´11+°1±*+´)1+°)±"+´ &+°=2³L "+´+°/´L+²L +³@ +° ´J+°J/° ±7+´E+°E±+´1+°2°´C+°C/±P+±*1²3999°)°9°± %99±L"±99±7 ³@GH$9±C°9±4·7=CEJL$9±:± 399°.´ "1$9°±9901.5463263233##"&547#5654&#"#4&#"2654&#"2654'"&'M`’ri;7ip@áP,,jJIk,kgdS0@PJ5Nc‰©##""/C9R9 D%•ex¥]] wUàýß4CJklIE26C¢WtS4þ¡_6OxV®>£#! "pC/*=8(.DYÿ‘.8Dï²+²$+°.3´++²$ +³@ +°/´9++°?/´++°3/°*3±é° 2°E/°Ö´61+°6±/+´.1+°.±+´B<+°B±'+´ &+²' +³@'$ +° ±+°#2´1+±F+±/6²8999°.°9°± *99± '´9?$9°±!<99±?9³!3265!5654&#"#4&#"2654&#"M`’ri;7ip@áP‰r2^E6J)>sþ¥gdS/APJ5Nc‰Z!:S)!8O%–dx¥]] wUàýßsŒ:( .,%(K6C¢WtS4þ¡_6OxV®>åYÿ,32<Ò²+²(+°23´++°/´"++°7/°.3±é° 2°=/°Ö´+°±+´:<+°:±3+´21+°2±++´1+²+ +³@+( +°±'+°2±é±>+±±99±3:²<999°2° 9°+²" 999°°9±(±)<99°7¶ +:$9°²99901.54763263233! $547!27675!5654&#"#4&#"§L`GFxi99htŒBÞTýñþŽþºZ3E’‘J±~”þ¬gdS/@QI5R^‡%—cuUS]]¤sUãýÙÑìþ–†2n|Ýed'D6C¢WtT3þ¡_6O|R®>YþP42GR0²+²3+°=3´++°/´H++°!/´-++°B/°93±é° 2°S/°$Ö´)+°)±+´E<+°E±>+´=1+°=±6+°2´1+²6 +³@63 +°6´P+°±2+°2±é°2°´K+°K/±T+±)±&'99±>E²G999°=° 9°6³ !-9$9°P±99±2µHMN$9±K°9±!H³KP$9°-²MN999°°9±3±4G99°B¶ $)6E$9°²'99901.54763263233"&547# $547!27675!5654&#"#4&#"2654&"§L`GFxi99htŒBÞTNUa„af‰þŽþºZ3E’‘J±~”þ¬gdS/@QI5R^‡½'98P88%—cuUS]]¤sUãýÙI2/`BaaB%$ìþ–†2n|Ýed'D6C¢WtT3þ¡_6O|R®>þi9'(88('9Yþ#:2KWfc²+²7+°A3´++°/´Y++°`/´L+°!/´1++°F/°=3±é° 2°g/°&Ö´++°+±+´I<+°I±B+´A1+°A±:+´ 1+²: +³@:7 +°:° Ö´e+° ±+°62±é³]+´O+°O/´]+°° Ö´[+°[/´+±h+±+±()99±BI²K999°A°9°³ !1=$9°:°9°e°9° °b9°O´UXY`$9°°9±!L·OU[]ce$9°1±R99°°9±7±8K99°F¶ &+:I$9°²)99901.5463263233#"&547#".54732>7!5654&#"#4&#"2654&#"2654'#"&'§L`‘ti99hqBÞTXfkJIkX…©ó½_Z3E:f ¶wGbþ¬gdS/@QI5Oa‡°!#! ^D9*(9 %—cy¤]]¢uUãýÙO31sJjkI3. -lÃŽ–†2n|d•^9<(6C¢WtT3þ¡_6OyU®>þ¬!"! pB/#+<9'/WE. $,ž²+´$++± 22°'/°3±é°2°-/°Ö´++°+±%+±!é°!±+±é°±+±é°± +´&+±.+±%+±$99°!°9±°9°±99°°9±'$³!+$9°±9901)5!263 54'4#"65&'4#"6Eü¤EB¦ K=eEVH3RÍþÞ—>fEVGDHÓû3ttþÓ¾¾ÎeT›4)n=Øx{ÄÊdSœ4)nX¹…Wþ÷G.&09Aó² +°3´9++±%22°/´/++°fEVGDHÓfC`aB9-û3ttþÓþÿ.q¾ÎeT›4)n=ØxþÜ)77)(88ÑÄÊdSœ4)nX¹…WþÔE.&2BKS² +±*33´K++±%22°/´@++°8/´0+°N/°!3±é°2°T/° Ö´R+°R±L+±Hé°H±C+±%é°%± +´=+°=±+±é°±'+´5+°5±+´&+°2°´3+°3/±U+±LR±K99°H°F9±%C°9±= ² !999°±:99°¶*-08@$9±3°9± 0µ 35;=$9±NK³HR$9°±F9901!##"&547!5!263 54'4#"64&#"3264'#"&'326%5&'4#"6E++jJIk-ýM¤EB¦ K=eEVH3RÍ„#""#:9)(9D./Dþ —>fEVGDHÓ2EJklID3û3ttþÓ¾¾ÎeT›4)n=Øxü! "#! *=9'.DCéÄÊdS›5)n€Y¹…WÿE.#+4@Hݲ+´4++±*22°/´8++°>/´++°C/°&3± é° 2°I/°Ö´G+°G±A+±1é°1±,+±*é³*,+´51+°*±$+± é° ±+°2´&+±J+±AG± 499°1°/9±,° 9±$5µ #&8>$9° ±99°±;99±>8±99±C4³ 1G$9° ±/9901265!5!263 #".54>%54'4#"65&'32654&#"4#"6 =sü]¤EB¦ Šr2]D5J=eEVH3RÍþÞ—>fE©O)#;S'%7þ­GDHÓ"-$(Kû3ttþÓþÿsŒ:(!.e¾ÎeT›4)n=Øx{ÄÊdSœ4ÏänX¹…Zÿ",2"*“²+´"++°/´7+°%/±é°+/°Ö´ +° ±+´)1+°)±#+±é°±+°2´<+±,+± ° 9°° 9±#)³"$9°°9±%"³ )$9°± 9901# 47!2>=!5! 54'4#"6,2ZnBþj9H8N>gJþ#R=dFVFEHÓþò8R0ô§udšþT@0 û3þÀÊdVš5+j|Yº…Zþ),2$.7Cë²+´.++°/´8++°/´7+°1/± é°D/°Ö´#+°#±+´61+°6±/+±*é³A*/+´+°/´A+°*±%+°2´ <+°2° ´;+°;/±E+±#° 9°°!9±6±.199°A³ $9°*°(9°%³8>$9±8²;A999°±>99±1.³#*6$9° ±!(99012>=!5! #"&547#"# 47%54'4#"62654&#"ñ>gJþ#TR//EB_ þq9H87=&.VVF9'-Óa(87)'99–@0 û3þÓþòd71[B10aB/'ô§udšþT×ÀÊd=NYA+j29jº…ý 8()78('9Zþ,2(0<Kû²+´(++°/´>++°E/´1+°+/± é°L/°Ö´+°±+´/1+°/±+´J+°J±)+±%é°%±4+´B+°B± +°2´ <+°2° ´@+°@/±M+±°9°°9±J³(+$9°)± G99°%¶#17:=E$9°4°>9°B±99±1@ 7@BHJ$9±+(³%/$9° ±#99012>=!5! "&547$47%54'4#"62654&#"2654'#"&'ñ>gJþ#[[k”j#þt9H87=dFVFEHÓP"#!!^D8*(9 –@0 û3þÓþòh75hJjkI:1î§udšþT×ÀÊdVš5+j|Yº…ýê""!!pC.!+<9'/Yþ€Š.-7@J° /°3´A+°2°/´'+°/´7++°:/±é°K/°Ö´?+³H?+´#+°#/´H+°?±D+´+°±+´,+°32°,´8<+°8/°,±.+´&+°° Ö´ +° /´+±L+±D?³ AF$9°³'7:$9°8°9±,°19°.³  $9±A¶ #+F$9°'° 9°° 9±:7±3?99°°1901%!5! 2654'7#"&5'4#"#"&54763254'4#"62654'týå n"+R"g"C9Ef G?87;57U<21d<&,WVG7&-Ñ›!K/!õ)þÛý´V0e7(?ŒI5>XA:vD\DcfF_;=)(D:w–¶Éb>GV>k29h²‚ýäF&b5U';Yý¶‘.3=FPZ)°/´G+°M/°'3´+°Q2° /´-+°/´=++°@/±é°[/°Ö´E+°X2°E´*+°*/°E±T+´$+°$±+°2´O+±1922°O´><+°>/°O±4+´&+³J4+° 3´+°2±\+±TE³'"QV$9°$³ -=@$9°>°9°°79°O°9°4´ GM$9°J² L999±MG±99°±99° ¶ $*1V$9°-° 9°° 9±@=±9E99°°7901%!5! 2654'7#"&547&5'4#"#"&5463254'4#"62654&"%2654'týå g#*R"g86K32K36f G?87:jV<21]<&,WVG7&-Ñ--<*)þî!K/!õ)þÛý´V0e7(?Œn2&C3JK2A%*V:vD\DcfF\{)(D:w–¶Éb>GV>k29h²‚ý+-+>*ÓF&b5U';Yýš.1:BJZd€°/´K+°S/´I+°E/°&3´+°[2°/´,+°/´:++°=/±é°e/°Ö´A+³bA+´)+°)/´b+°A±^+´#+°#±+°2´0+°72°0´;<+°;/°´X+°0±2+´&+³C2+´P+°° Ö´ +° /´+°° Ö´N+°N/´+±f+±^A³&![`$9°#³,:=$9°;°9±X°59°0±U99°2@   EGIKS$9± C°9°P°9±EIµNPVX$9°±99°¶ #)/`$9°,° 9°° 9±=:±7A99°°5901%!5! 2654'7"&547&=4#"#"&5463254'4#"64#"322654'#"&'%2654'týå n"+R"g4DRpT<6g G?87;jW@_d Ö´+±S+±ME°9°9²+H999°$µ)/5J$9°2±&99±> µ!;@$9±+;³$>B$9°H²)@999°Oµ/$9°°9014632632327654'7#"&547#"'#"'&>54&#"264&#"327.54#"ZaTc-7}W;:’%[BIV=g}`_DB_C"6N¤]^ç=QFDE&(99('99ý’{-:Da.8=cNNED]µKBGn{N3cœ¤Z*jC``C0$#!Z[IuKQf91D®þ´8P89N9yŠX§kZþÔþ-(3>N[#²&+°"3´R7+°2²+°/´?++°G/´4+°Y/°/3´C+±22°\/°Ö´O&+°O±W+´2&+°2± +´L+°L±,+´ 1+° ±7+´D+°D±+´&+°B Ö´+±]+±WO°9°2²&R999° ´$)/T$9°L± "99°,±I99° ±:<99°7µ49?G$9°D°9°B°9±&4· 754&#"2654&"2654'#"&'327.54#"ZaTc-7}Ys’%a…V=g„fkIJk"< 6N ¿ç=QFDAGm""0"!/D:)(9 Dý«{-:Da.8=dŒNN`µK’e{N3cœ«X2pIllI70 !±EuKQfbL®þÿ" "pD. *=9'/C&yŠŽX§kZÿý-/:GQæ²+°3´-C+°>2°/´K++°P/´7+°E/°03´"C+±&22°R/°Ö´;&+°;±C+´3&+° Ö±Hé°3±8+´)1+°)±+´&+±S+±C;°"9±3 ²$>999±8H@ &-05+@M$9°)°9°²999±PK± 99°° 9±-°9°E¶)$5$9°"°9014'7#".4>3267#"'#"&54632632326">54&327.54#"3254&#"°V=fÀÆ,OE):O.J… k,kf@%5O¡¾`Ue+7}Xt’#d‚þ•AG„?OEþ{+:Da.8?_&\U)c1{N3aÙæþõ 3F/7.H}." «™dŒNN‹`³IŠcK©*mLQf§y„ˆX§jþ $Wþˆ-GR_hnwf² +´`+°*/±7=33´/+±mo22°t/±3j33´C+±$d22°/°3´7+°V2°]/°N3´++±22°x/°Ö´S1+°S±[+´Q&+°v2°Q´@+°@/°Q±s+°D2´l+°c2°l±i+°e2´5+± #22°5´K1+°K/°5±+´1+³(+´1+°1/´(+±y+±[S°9±Q@²V999°s²=Xo999°l³:HN$9°K¶ 7 `$9±5i±,-99°1²*/999°°9±/*±,:99°t²(-@999±°9°]µ H$9°°901463263232654'7#"'#"&232#"'53254+#"&'#"&546;546'>54&#"%327.54#""354&5#2'265'#"WcSc-6€Xv’%`†U=hƘA%4OžÄC8K5Hk8F†":/19G4N>QFEAHþì{.:Fa-8ì%ˆ((ˆˆòEJ^…JJƒZ­G‡btJ0]“‹¢ ¥·N9<3z< ?3¤!B53?;LykHN_[I¤¬v€‡Sœcþ>-  ,”l"?4<Wþˆ-*7hqx¥°Z/±BV33´y+°w2´G+°L/´M+°~/±Rs33´_+±8m22°i/´d+°/°3´7+°.2°5/°&3´++±22°‚/°Ö´+1+°+±3+´)&+°€2°)´]+°]/°)±}+°`2´u+°l2°u±r+°n2´T+± g22°T´#1+°#/°T±+´1+³?+´I+°I/´?+°;2°?´P+°P/²P? +³@PL +±ƒ+±3+°9±)]².999°}²0Zy999°u´ &X$9°#¶ Vdiw$9±Tr°D9°P³BEG$9±I±=99±GZ±DX99±Ly³?IE\$9°M±=€99°~±;]99±°9°5µ  $9°°901463263232654'7#"'#"&>54&#"%327.54#"2#"'73254+53254+#"'#"&46;54632'"354&5#32#265'#"WcSc-6€Xv’%`†U=hƘA%4OžÄê>QFEAHþì{.:Fa-8¯$92$& ))<ƒI;/7C4 L<8H† (‘))‘JG÷KJ^…JJƒZ­G‡btJ0]“Š£ ¥>kHN_\H¤¬v€‡Sœcýé&& !&.' ¤..Bf> ;KN8 [/# ".šq!C8AWýý-*7nv}ˆ¹²8+°I3´r+°E/´Q+°b/°f3´z+°2³Yzb+´Z+°‡/±_|33´k+±;u22°/°3´7+°.2°5/°&3´++±22°‰/°Ö´+1+°+±G+´L+°L±3+´)&+°~2°)´i+°i/°)±ƒ+°l2´w+°u2°w±#+´ 1+±;`22° ´|+°|/°o3° ±+´1+³B+´V+°V/°]3´B+°>2²VB +³@VY +±Š+±G+±599±i3°I9°)³.J$9°ƒ²0f999°w³ &d$9°#@  8EQbrz$9±V °9°±@99±bQ°B9°z±Vd99°Z²A@h999°‡µGL>i~ƒ$9±8r°J9±°9°5µ  $9°°901463263232654'7#"'#"&>54&#"%327.54#"232# 4732>54+53254+#"'#"&46;464&#"3325'3254&5#"WcSc-6€Xv’%`†U=hƘA%4OžÄê>QFEAHþì{.:Fa-8ó:M(&_|Bþtn!^.^wU%JI-*(@…='9,7H1I‚' #(’’,G’–2JJ^…JJƒZ­G‡btJ0]“Š£ ¥>kHN_\H¤¬v€‡Sœcþ{V=Y/`DŠZ%KfHb6 &)1) ¯//E`E>T‰".4%B:8y=$19Wýé-*7_hnxްI/´{+°€/´O+°8/°Z3´w+°m2°s/±Xi33´=+±Cd22°`/´?+°/°3´7+°.2°5/°&3´++±22°‚/°Ö´+1+°+±3+´)&+°)°u Ö´;+°;/´u+°)±o+±=M22´k+±cy22°k±#+´ 1+±CX22° ´i+°i/°e3° ±+´1+³E+´V+°V/´E+±ƒ+±3+°9±);².999±ou±8099°k´ &]$9°#@  ?IOZ`m{€$9± i°}9°V±R99°°9±€{³My}R$9±w8°]9°s²EV;999±°9°5µ  $9°°901463263232654'7#"'#"&>54&#"%327.54#""&547632#"'&543267654'#"&'"354&#32'4&5#"323254&#"WcSc-6€Xv’%`†U=hƘA%4OžÄê>QFEAHþì{.:Fa-8F19–†@#œUNm5*8x.[ )Zƒ!;.”&ˆ))ˆDBÅG/+A]12&6J^…JJƒZ­G‡btJ0]“‹¢ ¥>kHN_[I¤¬v€‡SœcüþD4q“,)> ‹lG>(< 7-.O­ !?/.’i045:Wþƒ-*7bmu|†«²_+°83´n+°C2°W/±LQ33´…+±lz22°/±ev33´\+±Er22°/°3´7+°.2°5/°&3´++±22°‡/°Ö´+1+°+±Z+´ƒ+°ƒ±3+´)&+°)°x Ö´}+°}/±\€33´x+°q2°)±|+°s2´j+°j±#+´ 1+° °H Ö´c+°c/´H+° ±+´1+³;+´@+°@/´;+±ˆ+±ƒZ±599°3±W…99±)}³.U$9±|x· &QR_0$9°j²Oa 999°#´ELl$9± c±8C99±@H²=>999°°9±…W±>U99°²HZO999°\±@;99°n°a9±°9°5µ  $9°°901463263232654'7#"'#"&>54&#"%327.54#"2'654&#"32#"&5"'&'#"&547>3264+32'"354#3254&5#"32WcSc-6€Xv’%`†U=hƘA%4OžÄê>QFEAHþì{.:Fa-8\[ld$JH;S!84:J A29—G>_)JH1/ë)‘‘HIÐG1+J^…JJƒZ­G‡btJ0]“‹¢ ¥>kHN_[I¤¬v€‡Sœcþ{jZ}<#-i54&#"%327.54#"#"'532654&+532654&#"3232#"'&'#"'#"&547>326324&#32'"354#3254&5#"32WcSc-6€Xv’%`†U=hƘA%4OžÄê>QFEAHþì{.:Fa-8G1?.' "")U14&-}@6NO@29—G>\ ,sB;Iô.32/ë)‘‘HIÐG1+J^…JJƒZ­G‡btJ0]“‹¢ ¥>kHN_[I¤¬v€‡Sœcýþ+ D,5 ;!2!)q6AA88C4o?PDD"Ã!cþ.Mll924<Wýý-*7}„Š™ò²H+±8z33´^+°‡2°A/´M+°j/±nr33´„+±Ž˜22°”/±€‹33´w+±b‰22³Vw”+´U+°/°3´7+°.2°5/°&3´++±22°š/°FÖ´K+³+KF+´1+°/´+1+°K±u+´–+°–±+°w2´+°‰2°°) Ö´3&+°3/´)&+°±Š+°‹2´b+°2°b±#+´ 1+° °g Ö´~+°~/´g+° ±+´1+°Q Ö°[3´?+°;2±›+±uK±HI99°–±599°3±r˜99±)³.p$9±Š· &Mnz0$9°b³A l|$9°#³ej$9±g ±8^99°Q²U999°°=9±„j°?9°U·Qglpu~–$9°”°=9±wV±KF99°^²[;|999°H°I9±°9°5µ  $9°°901463263232654'7#"'#"&>54&#"%327.54#"2!".547!27654&+5327654&#"3232#"'#"'#"&547>3264+2'4#"3#2'4&5#"32WcSc-6€Xv’%`†U=hƘA%4OžÄê>QFEAHþì{.:Fa-8‚Fg44þ†jŸz?E):ŠpR…"H0+)4t;2<GF8.3ŒA:S!0=L`˜FDŒŒŒÄE/*J^…JJƒZ­G‡btJ0]“‹¢ ¥>kHN_[I¤¬v€‡Sœcþ|G;FKÀ!J\aY LNþí%W*5$&/o5AII==C3n?QGHþþ7nµPV: o657?Wþè-*7S0°B/´C+°=2²CB +³@C? +°J/´8+°/°3´7+°.2°5/°&3´++±22°T/°Ö´+1+°+±3+´)&+°)±Q+´L+°L±#+´ 1+° °; Ö´G+°G/´;+²G; +³@GB +° ±>+´A+° Ö´1+±U+±3+°9°)².999°Q°09°L´ &O$9°#µ 8IN$9± G°=9±>;°9°°9±JC²;OQ999±°9°5µ  $9°°901463263232654'7#"'#"&>54&#"%327.54#"233!532654&"&546WcSc-6€Xv’%`†U=hƘA%4OžÄê>QFEAHþì{.:Fa-8 3JuBþÚ+&4' DMJ^…JJƒZ­G‡btJ0]“‹¢ ¥>kHN_[I¤¬v€‡Sœcþ[I20,þ¡3/"#4IWþ-*7^g…°G/´_+°M/°A3´N+°=2²NM +³@N? +°N´d+°U/´8+°/°3´7+°.2°5/°&3´++±22°h/°Ö´+1+°+±3+´)&+°)±\+´W+°W±#+´ 1+³J #+´f+²Jf +³@JM +° °; Ö´R+°R/´;+° ±>+´A+°D2°A´b+°b/°>° Ö´1+±i+±3+°9°)².999°\°09°W´ &Z$9°#µ 8TY$9±fR°L9° °=9±>;´G_cd$9°b°9±A°B9±d_±JD99±UN²;Z\999±°9°5µ  $9°°901463263232654'7#"'#"&>54&#"%327.54#"233##"&547!532654&"&546264&"WcSc-6€Xv’%`†U=hƘA%4OžÄê>QFEAHþì{.:Fa-8 3JuBI42KþØÚ+&4' DMÙ,-<**J^…JJƒZ­G‡btJ0]“‹¢ ¥>kHN_[I¤¬v€‡Sœcþ[I20,þ¡#/3JK2.$3/"#4Iþm+<,,<+Wýü-*7_gw³°G/´h+°p/´f+°M/°A3´N+°=2²NM +³@N@ +°N´b+°U/´8+°/°3´7+°.2°5/°&3´++±22°x/°Ö´+1+°+±3+´)&+°)±]+´X+°X±#+´ 1+°d2°J Ö´u+²Ju +³@JM +° °; Ö´R+°R/´;+° ±>+´A+³mA>+´`+°`/´m+°>° Ö´1+°k Ö´D+±y+±3+°9°)².999°]°09°X´ &[$9°J´8 UZ$9°#°9°R°L9± u±=r99±`;µGbfhp$9±m>°9±A°B9±bfµJDkmsu$9±UN²;[]999±°9°5µ  $9°°901463263232654'7#"'#"&>54&#"%327.54#"233##"&547!532654&#"&5464#"322654'#"&'WcSc-6€Xv’%`†U=hƘA%4OžÄê>QFEAHþì{.:Fa-8 2KuB(S89S(þåÚ+&& DLý+..+*%2 + - 5J^…JJƒZ­G‡btJ0]“Š£ ¥>kHN_\H¤¬v€‡Sœcþ[I20,þ¡(:8RR8:(3/"#5HþÒ++.U2%!/-$3Wþ„-*7bkM²D+°H3´8+°T2°\/´c+°/°3´7+°.2°5/°&3´++±22°l/°Ö´+1+°+±3+´)&+°@ Ö´;+°)±_+´j+°j±#+´ 1+°f Ö´Y+° ±Q+°2´L+°L±+´1+±m+±@+±599±;3°9°)±.99°_²0=>999°j²D8999°f@  &FV\a $9°#°9°Y±HT99° °O9°Q°N9°L°9±c\±O=99°8¶;@LQY_h$9°D°F9±°9°5µ  $9°°901463263232654'7#"'#"&>54&#"%327.54#""&547632632'654&#"#"&547&2654'WcSc-6€Xv’%`†U=hƘA%4OžÄê>QFEAHþì{.:Fa-8|7IL*b1HH K!B@J^…JJƒZ­G‡btJ0]“‹¢ ¥>kHN_[I¤¬v€‡Sœcþ>P9Y4)A{I7@##@8H|@+2Y7R]-=[UC`@ÿ6'T0-W]Wþ-*7ox‰²;+°?3´h+°Z2°N/´K+°F/´T+°b/´u+°/°3´7+°.2°5/°&3´++±22°y/°Ö´+1+°+±3+´)&+³k)3+´8+°8/°P3´k+´I+°)±d+´s+°s±#+´ 1+°w Ö´_+° ±W+°2´C+°C±+´1+±z+±3+°9±k8±.99°)°9±dI´G0Smn$9°sµ &;fh$9°wµ=ab $9°#±T99°_³?FZ]$9±CW²LM999±KN°P9±TF°Q9°b°n9°u°m9°h·CW]_d8kp$9°;°=9±°9°5µ  $9°°901463263232654'7#"'#"&>54&#"%327.54#"4632632+"3!!"&4632654&#"#"&547&#"&%3254WcSc-6€Xv’%`†U=hƘA%4OžÄê>QFEAHþì{.:Fa-8ÒqU3GM43rWâ22¥þS.@@.á>Q@1 'BfA- 6NE\ $:8J^…JJƒZ­G‡btJ0]“‹¢ ¥>kHN_[I¤¬v€‡SœcýâIP32RXt $50R0V@2G&C4EE4A%1,I--¬0DD7Wþ-*7z‚®²8+°w3´]+°k2°J/´G+°B/´Q+°d/´+°W/´X+°/°3´7+°.2°5/°&3´++±22°ƒ/°Ö´+1+°+±3+°s2´)&+°E2´n+°)´M+°M/²)M +³@)H +°)±g+´+°±#+´ 1+°{ Ö´a+° ±T+±[22´?+°;2²T? +³@TW +°?±+´1+±„+±3+°9±nM°9°)±.99°g´0CPpq$9°¶ &ikw$9°{³dy $9°#±_99± a³8BQ]$9±?T±=99±BG°M9±dQ°q9°²T?p999±XW´=ag{$9°]µ;_ins}$9°8°y9±°9°5µ  $9°°901463263232654'7#"'#"&>54&#"%327.54#"2#!"3!!"&54632654+53254#"#"&547&#"&54763264'32WcSc-6€Xv’%`†U=hƘA%4OžÄê>QFEAHþì{.:Fa-8VE\,,P>þÜ11§þP+AB*%67-c)<.-702J5T=5I<" +1-/J^…JJƒZ­G‡btJ0]“‹¢ ¥>kHN_[I¤¬v€‡Sœcþ{66D B:@ $40'%4(541; .>0GE2A-8-B1.fG+(¬>:=Wýæ-*7ku~²h+°83´]+°O2°?/´x+°}/´E+°V/´q+°/°3´7+°.2°5/°&3´++±22°/°Ö´+1+°+±3+´)&+°e Ö´`+°)±Y+´o+°o°v Ö´B+°B/´v+°o±#+´ 1+°s Ö°z3´S+° ±L+°2´;+°;±+´1+±€+±e+±599±`3°9°)².c999°B°b9°Y°09°v°]9°o² h999°s@ &?EQV[j x}$9°#°9°S²8HO999±;L°9±}x±BH99±VE°c9°q°b9°]¶;LSY`el$9°h°j9±°9°5µ  $9°°901463263232654'7#"'#"&>54&#"%327.54#"2#"&5463267654&#"#"&547&#"&5463263254&3254&#"WcSc-6€Xv’%`†U=hƘA%4OžÄê>QFEAHþì{.:Fa-8kHN_[I¤¬v€‡Sœcþ{z`\e*& & JE>?WP6Z),;xRnTM&PP&Mþ– Wþ„-*7Š“ŲD+²HLP333´8+²\js222°{/±cn33´‹+°‚2°/°3´7+°.2°5/°&3´++±22°”/°Ö´+1+³@++´;+°+±~+´’+°’±3+´)&+³Ž)3+´w+°)±o+´n+°n±f+´‰+°‰±#+°h2´ 1+° ±…+´`+°`±+´1+°°T Ö´Y+°Y/´T+±•+±~+±=>99°’³5D8$9°3°€9°ŽµFu{‹$9°)±.99°w±Hs99°o°09°n´ &J$9°f° 9°‰²Lj999°#°9° ³Nc‚‡$9°…°^9°`²P\999°±W99°Y°V9±‹{±W=99°8@ ;@JTY`fw~‡$9°D±FN99±°9°5µ  $9°°901463263232654'7#"'#"&>54&#"%327.54#""&547632632632632'654&#"#"&547&#"#54&#"#"&547&2654'2654'WcSc-6€Xv’%`†U=hƘA%4OžÄê>QFEAHþì{.:Fa-8n6G;%O07_4IO_8=S1.P%@7>:?"69>A Ø ??þ¬>?J^…JJƒZ­G‡btJ0]“‹¢ ¥>kHN_[I¤¬v€‡SœcþBS:h(&6†H8@ >> @9G†6((f8U6q:\UAj:+üú,6q:,1VAi;þ÷;&[0-^a;'\/-^bWþ-*7Ž–ž÷°_/´\+°X/´d+°ˆ/°q3´+°•2°8/²jx333´D+²HLP222°/°3´7+°.2°5/°&3´++±22°Ÿ/°Ö´+1+°+°; Ö´@+°@/´;+°b Ö´Z+²Zb +³@Z] +°+±‹+´›+°›±3+´)&+³—)3+´…+°)±}+´|+°|±t+´“+°“±#+´ 1+° ±+´n+°n±+´1+°T2°´g+°g/± +±‹Z³>X=d$9°›³5D8$9°3´Fˆ™$9°—°9°)³.ƒ$9°…°H9°}°09°|´ &J$9±“t´L vx$9°#°9° ³Nq‘•$9°°e9°n´PWjl$9°°9±X\°b9±ˆd²>|}999°°=9°8@ ;@JTgnt…‹‘™$9°D±FN99±°9°5µ  $9°°901463263232654'7#"'#"&>54&#"%327.54#""&547632632632632#!"3!!"&543!254&#"#"&547&#"#54&#"#"&547&4'32%4'32WcSc-6€Xv’%`†U=hƘA%4OžÄê>QFEAHþì{.:Fa-8s.>B"[*3[&?T"d1@N0.k^ý¼88üø/?n>œE6 4A./?6 5C; 3A.0=7 6886þp6776J^…JJƒZ­G‡btJ0]“‹¢ ¥>kHN_[I¤¬v€‡SœcþI>.P!(7f:.67794I]i)&3/*U™7J,L1KJ2M*&ºº&-J1JH3K+{1-&8GH0-'6HWþ-*7œ¤«2°c/´`+°[/´i+°~/±‰–33´£+°ª2°p/´q+°8/²v…Ž333´D+²HLP222°/°3´7+°.2°5/°&3´++±22°¬/°Ö´+1+°^2³;++´@+°@/´;+°+´f+°f/²+f +³@+a +°+±™+´©+°©±3+´)&+°)°’ Ö´¥+°¥/´’+°)±Š+´‰+°‰±+´¡+°¡±#+´ 1+³ #+´z+° ±+´1+±RV22°´m+°m/°t3²m +³@mp +±­+±™+³=>[i$9°©´58D›$9°3²F–§999±)¥µ.HŽ$9±Š’°09°‰³ &J$9°°9°¡³L ƒ$9°#°9° ³N~Ÿ£$9°z²Pvx999°³Zj$9±m°T9±[`°f9±~i°>9°£²Vm=999±qp@ ;Tz’™¡¥©$9°8@ @JRxƒ›Ÿ§$9°D±FN99±°9°5µ  $9°°901463263232654'7#"'#"&>54&#"%327.54#""&547632632632632#!"3!!"&5463!2654+53254#"#"&547&##'4&#"#"&547&4'32%4'2WcSc-6€Xv’%`†U=hƘA%4OžÄê>QFEAHþì{.:Fa-8e/>:!S*3Z)?U!\5B®++ 9ýZ#6üã0;B/—0)*x .0.@55=? -1.>4 1:83þq55jJ^…JJƒZ­G‡btJ0]“‹¢ ¥>kHN_[I¤¬v€‡SœcþI>.S"$6g;-666j:92#"&3-,(-1-8361G,'*L1K/&¸¸)-M.('K2G1{>$%=GG>$#?GWýì-*7Š’›¤ °?/´–+°š/´E+°V/´‘+°œ2°‘´l+±`y22°s/²O\e333´+²8ƒ‡222°/°3´7+°.2°5/°&3´++±22°¥/°Ö´+1+³{++´v+°+±o+´£+°£±3+´)&+³Ÿ)3+´i+°)±a+´`+°`±Y+´+°°“ Ö´C+°C/´“+°±#+´ 1+° ±‹+°˜2´S+°S±L+´;+°;° Ö´1+°/´1+±¦+±o+±xy99°£³5s$9°3±q¡99°Ÿ´glœ$9°)±.99°i±eƒ99°a°09°`´ &…$9±YC°]9°“± 99°±\‡99°#±[99° ·?EV‰‘–š$9°‹°Q9°S³8IO$9°°9±š–±CI99±‘V°x9°s@ ;LSYiov{…¡$9°±‰99±°9°5µ  $9°°901463263232654'7#"'#"&>54&#"%327.54#"2#"'&5432>54&#"#"&547&"#54&#"#"&547&#"&54763263263264'323254#"%2654'WcSc-6€Xv’%`†U=hƘA%4OžÄê>QFEAHþì{.:Fa-8¶U_GKw5(:l,'4 ,;BA?26=9=A38>@ 6GG%[1‚3?B*&V1#=<>;Ž:;]1þÃ==J^…JJƒZ­G‡btJ0]“‹¢ ¥>kHN_[I¤¬v€‡Sœcþ€b~Y_,?  ~FH`6p8[U>j9-ýú/7p<]WBj:T:^3&@},'n!!99á\.+_^†t;'].-^bWþ„-*7]²8+°=3´R+°I2²R8 +³@RN +°/°3´7+°.2°5/°&3´++±22°^/°Ö´+1+°+±3+´)&+³U)3+´Z+°Z/´U+°)±N+´M+°M±#+´ 1+° ±F+´A+°A±+´1+±_+±Z+±599±)U².999°Nµ08RWX$9°M³ &;$9°#´ =I$9° ±CD99±AF°9°°9±°9°5µ  $9°°901463263232654'7#"'#"&>54&#"%327.54#"2632'654&#"#54&#"&5476WcSc-6€Xv’%`†U=hƘA%4OžÄê>QFEAHþì{.:Fa-8Q%: RO./y W=2%C+19['w/.J^…JJƒZ­G‡btJ0]“‹¢ ¥>kHN_[I¤¬v€‡Sœcþ{'D78KŠ93)l4C0ææ.G5j'29ˆL87Wþ„-*7_k|²;+°>3´W+°O2²W; +³@WS +°E/°^3´c+´LiS; +´L+°/°3´7+°.2°5/°&3´++±22°l/°Ö´+1+°+±3+´)&+³[)3+´8+°8/´[+°)±S+´R+°R±#+´ 1+³` #+´I+°I/´`+° ±+´1+³B+´e+°e/´B+±m+±8+±599±)[³.^$9°Sµ 0;W]$9°R²&=999°I²> 999°#°9°`°O9±e µ?EMci$9°°9±cE°]9°i³8B[I$9±;W°=9±°9°5µ  $9°°901463263232654'7#"'#"&>54&#"%327.54#"463262#"'&546;&#"#54&#"&%3254'&#"WcSc-6€Xv’%`†U=hƘA%4OžÄê>QFEAHþì{.:Fa-8ŸbML!'®?=NB;G: kHN_[I¤¬v€‡SœcýÀOl:::9VJg.&5?T!Oäç ,%'0k#56Z/f4Wýö-*7q}–²C+°G3´8+°j2²8C +³@8n +°P/´U+°a/°>3´u+°/°3´7+°.2°5/°&3´++±22°~/°Ö´+1+°+±@+´;+°;±3+´)&+°=2°)±n+´m+°m±#+´ 1+³r #+´d+°d/´r+° ±w+´^+°^±+´1+°M2°´Y+°Y/±+±@+±599±)3³.>$9°n²08C999°m´ E&$9°d° 9°#´GRj$9± r³Sahu$9°w²PU{999°^²I\999°°9±UP°R9°a°S9°u°=9°8@ ;@IMY\^d{$9°C°E9±°9°5µ  $9°°901463263232654'7#"'#"&>54&#"%327.54#""&54632632#"'7327654&'#"&54767&#"#54&3254'&#"WcSc-6€Xv’%`†U=hƘA%4OžÄê>QFEAHþì{.:Fa-810?Ps`PI!'O€&M)*sX:2(*@))*" <<3@"#4AZ=-Ý?%2J^…JJƒZ­G‡btJ0]“‹¢ ¥>kHN_[I¤¬v€‡Sœcþ>K2k'46ŒNp22R 79U^Š#434D/O !H\T8;/0Méé -¶2\3%=WþÓ-*7R3°B/´=+²=B +³@=? +°H/´8+°/°3´7+°.2°5/°&3´++±22°S/°Ö´+1+°+±3+´)&+°)±P+´K+°K±#+´ 1+³; #+´E+°E/´;+²E; +³@EB +° ±>+´A+³A>+´1+±T+±3+°9°)².999±KP°09°E@  &8 MN$9°#°9°;°=9±> °9°°9±=B±CM99°H³;EKP$9±°9°5µ  $9°°901463263232654'7#"'#"&>54&#"%327.54#"233!5654&#"&546WcSc-6€Xv’%`†U=hƘA%4OžÄê>QFEAHþì{.:Fa-8´?S¦Aþº23!"32RXJ^…JJƒZ­G‡btJ0]“Š£ ¥>kHN_\H¤¬v€‡SœcþPL<#1þ™ 7 /, /3'S8PWþ -*7]g‘°G/´^+°c/°Y3´>+°>´L+°A2²>L +³@>@ +°S/´8+°/°3´7+°.2°5/°&3´++±22°h/°Ö´+1+°+±3+´)&+°)±[+´V+°V±#+°J2´ 1+³; #+´P+°P/´;+²P; +³@PM +°#´e+° ±>+´A+°A°D Ö´a+°a/´D+³A>+´1+±i+±3+°9°)².999±V[°09°P@  &8 XY$9°#°9°;°=9°e°L9±> ´G^bc$9°a°9±A°B9±c^±JD99±>L±NX99°S³;PV[$9±°9°5µ  $9°°901463263232654'7#"'#"&>54&#"%327.54#"233##"&547#5654&#"&546264&"WcSc-6€Xv’%`†U=hƘA%4OžÄê>QFEAHþì{.:Fa-8´?S¦AJ32K x23!"32RX1,,<+*J^…JJƒZ­G‡btJ0]“Š£ ¥>kHN_\H¤¬v€‡SœcþPL<#1þ™$/2KK20# 7 /, /3'S8Pþh+<,,*Wýï-*7\dt¢°G/´e+°m/´c+°_/°X3´>+°R/´8+°/°3´7+°.2°5/°&3´++±22°u/°Ö´+1+°+±3+´)&+°)±Z+´U+°U±#+´ 1+³; #+´O+°O/°I3´;+´r+²Or +³@OL +° ±>+´A+°D2³jA>+´]+°]/´j+°A´h+°h/³A>+´1+±v+±3+°9°)².999±UZ°09°O@  &8 WX$9°#°9°r±=K99± ;³Gaop$9°]´_cem$9°>°F9±h±B99±_cµIDhjpr$9°>´ABKMW$9°R³;OUZ$9±²?@999°5µ  $9°°901463263232654'7#"'#"&>54&#"%327.54#"233#"&547#5654&#"&5464#"322654'#"&'WcSc-6€Xv’%`†U=hƘA%4OžÄê>QFEAHþì{.:Fa-8´?S¦A &SpS&\23!"32RXH,--,+%3 +!, 4J^…JJƒZ­G‡btJ0]“Š£ ¥>kHN_\H¤¬v€‡SœcþPL<#1þ™)78RR87) 7 /, /3'S8PþÐ++.V3%"/,$4Wþ>-*7cl°E/´f+°k/´K+°P/´=+´Q+°X/´8+°/°3´7+°.2°5/°&3´++±22°m/°Ö´+1+°+±3+´)&+°)±`+´[+°[±#+´ 1+³d #+´H+°H/´d+°#°S Ö´;+²S; +³@SP +° ±O+°>2´A+° Ö´1+±n+±3+°9°)².999±[`°09°H· &8 ]^$9°S°9°#°9±;d°=9° ±Kk99°O³Mfh$9°°9±kf²Hdh999°K°M9°P°^9±=Q°]9°X³;S[`$9±²?@999°5µ  $9°°901463263232654'7#"'#"&>54&#"%327.54#"233#"&5463267!5654&#"#"&54763254&#"WcSc-6€Xv’%`†U=hƘA%4OžÄê>QFEAHþì{.:Fa-8Â?T  A;1B3WD.W! ÿ-1#!/1#K+,£X--$4J^…JJƒZ­G‡btJ0]“‹¢ ¥>kHN_[I¤¬v€‡Sœcþ\M<(-þ¡Y,$-' !') >",, 5.!U;''þ¯Wþ-*7>FN²=+´G++°:/´E+°/°3´7+°.2°5/°&3´++±22°O/°Ö´+1+°+±3+´)&+°)±:+°02´K+°K±M+´C+°C±F+´9+³ 9F+´#1+°#/´ 1+°9±+´1+±P+±3+°9°)².999±MK· &= E$9°#±A99±9±99±GE±CK99°=°A9±°9°5µ  $9°°901463263232654'7#"'#"&>54&#"%327.54#"!54324'3'"654WcSc-6€Xv’%`†U=hƘA%4OžÄê>QFEAHþì{.:Fa-8°þ“¹´=Ldš+,€J^…JJƒZ­G‡btJ0]“‹¢ ¥>kHN_[I¤¬v€‡Sœcýµª§ÉÆl (]W÷M8kVZ@WýÀ-*7HPYch²A+´S++°9/´Z+°_/´P+°/°3´7+°.2°5/°&3´++±22°d/°Ö´+1+°+±3+´)&+°)±>+´X+°X±;+´a+°a±#+´ 1+°Q Ö´M+° ±P+´D+°G2°D´]+°]/°D±+´1+±e+±3+°9°)².999°>°09±;X³ &$9°a³ =OS$9°Q²9A999°#±_99°M±KZ99° ±8^99±D]±E99°°9±_Z±G;99°P³>DE=$9°S±MX99°A°K9±°9°5µ  $9°°901463263232654'7#"'#"&>54&#"%327.54#""&547#5432#4'3'4#"6264&"WcSc-6€Xv’%`†U=hƘA%4OžÄê>QFEAHþì{.:Fa-8tfK!’¹´ kHN_[I¤¬v€‡Sœcü;J31"§Éƪ$/30l (]W·@%CkVþÐ*<-,*Wý¤-*7GOW]l˜²@+´P++°9/´^+°f/´]+°Z/´O++°/°3´7+°.2°5/°&3´++±22°m/°Ö´+1+°+±3+´)&+°)±=+´T+°T±;+´j+°j±#+°V2´ 1+´L+° ±O+´C+°F2³cCO+´Y+°Y/´c+°C´a+°a/°C±+´1+±n+±3+°9°)².999°=°09°T² &999°;°9°j± <99°#¶9@PNg$9°L´JZ]^f$9° °e9°O°89±Ca±D99°°9±f^°:9±Z]µ;Fachj$9°O³=CD<$9°P±LT99°@°J9±°9°5µ  $9°°901463263232654'7#"'#"&>54&#"%327.54#""&47#5432#4'3'"6544#"32654'"&'WcSc-6€Xv’%`†U=hƘA%4OžÄê>QFEAHþì{.:Fa-8ˆrS(ƒ¹³"'BLeš,+U+--%2 ,@, 5J^…JJƒZ­G‡btJ0]“Š£ ¥>kHN_\H¤¬v€‡SœcüRr(§Éƪ':9Dl (]W÷M8kU[@þoXXV2%!.+$3Wýì-*7MU^fP²@+´X7+°P2°H/´a+°e/´8+°54&#"%327.54#"267!5432#"#"&54674'3'4#"63254#"WcSc-6€Xv’%`†U=hƘA%4OžÄê>QFEAHþì{.:Fa-8T!þÖ¹²dP3TJµ>]Šq&vNT*I5J^…JJƒZ­G‡btJ0]“‹¢ ¥>kHN_[I¤¬v€‡Sœcüñ$/¤ÌÉ£L[&$ Ái'_P²<!DdQï Zÿ/þ-*6:Gè²'+´>7+°2²!+°/´:++°E/°13´C+±22°H/°Ö´;&+°;±C+´5&+°5±.+´ 1+° ±7+´1+²7 +³@7 +°±+´&+±I+±C;°9°5²'>999°.¶%!:@$9° °99±7±99°°9±:° 9±>'´%89$9°Eµ+$9°°9014632632327654'73!57&'&'#"'&>54&#"5327.54#"ZaTc-7}W;:’%[BIV=g—þ$Ô# 6N¤]^ç=QFDE&xL¯þo{-:Da.8=cNNED]µKBGn{N3cœ¹Uñ)¥ !Z[IuKQf91D®þì‹ ÉyŠX§kZþ'þ-6BFS_4²3+´J7+°2²-+°%/´T++°*/±Z33´F++°Q/°=3´C+±22°`/°Ö´G&+°G±O+´A&+°A±(+´]+²(] +³@(+ +°]±:+´ 1+° ±C+´1+°!2°´W+°W/°±+´&+±a+±OG°9°A²3J999°(²1FL999°]´*-7=$9°:±99° ³%ETZ$9±W²999°°9±*T±!(99°F°,9±J3´1DE$9°Qµ7$9°°9014632632327654'73##"&547#57&'&'#"'&>54&#"5327.54#"2654&#"ZaTc-7}W;:’%[BIV=g—%#//EB_#¹Ô# 6N¤]^ç=QFDE&xL¯þo{-:Da.88(98)(8:=cNNED]µKBGn{N3cœ¹Uñ,9B10aB9,)¥ !Z[IuKQf91D®þì‹ ÉyŠX§küò7()78(&9Zþþ--8<IUec²++´@7+°2²'+° /´V++°^/´J+°$/±P33´<++°G/°43´C+±22°f/°Ö´=&+°=±E+´7&+°7±"+´c+²"c +³@"% +°c±1+´ 1+° °[ Ö´M+°M/´[+° ±9+´1+°2°´Y+°Y/°±+´&+±g+±E=°9°7²+@999°"°B9°cµ$).4<$9°1@  ' JPSV^$9°M°;9° °9±Y²999°°9±$Jµ"Y[ac$9°<°&9±@+´):;$9°Gµ .$9°°901463263232654'73#"&547#57&'#"&>54&#"5327.54#"2654&#"2654'#"&'ZaTc-7}Ys’%a…V=g—.+j”k+›Ô%6N ¿ç=QFDAGxL¯þo{-:Da.8$"#"!/D9*(9 D=dŒNN`µK’e{N3cœ¹Uñ3BIkjJD1)¥!±EuKQfbL®þì‹ ÉyŠŽX§ký@!""!pC.!*=9'.CYÿòÚ-=GÖ²)+±833±>é°2°/±é°1/°!3´7+°2°H/°:Ö´5+°5±-+´E&+°E±A+´%<+°%±+°2± é°2² +³@ +±I+±-5±7899°E°19°A´)#/$9±%³!$9° ° 9±>)°79°² 999°¶ %-5:AE$9°1³#/C$9°°901263 #"'53254/53232654#"#"'&547&#"&54762654'„%T>|99hI>4Le\-3.¹/Ka/6Y^5/ƒ$)V;8o+ŒG@47];-)®ddIN MWKL",odŽ[DNMC]‘hHDX“I5e³:8±þ_CyTH…E]Zþÿn2NYô²2+°A3±Oé°/´++° /±!é°:/°*3´G7+°2°Z/°Ö´+°±C+´>+°>±6+´W&+°W±R+±.é°.±+°&2´ <+°2² +³@ +±[+±C°9°>°9°6±@A99°W°:9°R¶2,GJ8$9±.±*M99° °9±O2² @999±! ´.6RW$9°:·,8>CT$9°G±J99012#"'&5473 54/5323254'&#"#"'&547&#"&547632>322654'ZMzM%P¡y»ôŸ¬|7l•‹Óˆj,,g?4HO+c37VX80†*(V;7n,‹EÏ#\ l.Ê57`4K:-([A-07 ~¥N9~Ší±6u”ÎwkïfTtE"`–ZENMD\”cHCY“I5d´99±þ^D~RrAF\Zÿp/7AL̲+².+´@7+²+°/´E++°K/´ ++°/´ 7+°M/°Ö´&+°±1+´>&+° Ö´B&+°>±8+´+&+°+±%+±é±N+±±99±>B± 99°8¶ .5EGK$9°+²#)999±KE±#99±@.°9°@ %)+1:$901"&547632#"'&5432654'&'#"&54767.4'"323254'&#"£sˆa6yWV‘KIFp;5JPq /O+±±99±:°9±%*²-5999± 0° 9±"¶ '028:$9012!!3##"&547!46"!542654&"2654'#"&'TmþZ]P.+jJIl.þ@—²˜^R ""0"!/D9*(8D-}f›nßýà2EJklIC4J_„GdN@@Oþ" "pD. +<8(.DYÿW- (6»²+´++² +³@ +°/´)++°0/´++´% +´++°"/´7+°7/°Ö´1+°$2°±+´31+°3±&+´<+°±+°2´ 1+±8+±±"99°3°!9±&±099°³),$9±0)³,3$9012!!3#"'&54>326=!46"!542654'&#"TmþZ]PMEh]A65I)?týL–³˜^RU";%? 8!-|g›nßýÜzD=(!2 .,%(GJ_„GcO@@OýÂYþˆW-?HOX'²+´@+°//±"533´N+±'P22°U/±+J33´;+±D22° /´+² +³@ +°/´++°/´7+°Y/° Ö´1+°2°±8+´W+°W±T+°<2´L+°C2°L±+´<+°±I+°E2´-+°2°-±+´ 1+³ +´)+°)/´ +±Z+±8°9±TW³5P$9°L°29±³/@N$9±-²"$'999±N/±$299°U² %8999012!!3!46"!54232#"'53254+#"&'#"&546;546"354&5#32'265'#"TmþZ]Pý—²˜^R58K2&%l 9F‡!:019F4N6&‰((‰DEñF-xe—iÑýï@^F_M@@MþxN96z< ?3¤ !B53?;L=. ,”l?4<Yþ†W-BJSZcm°3/±/33´[+°Y2´+°"/´#+°`/±(U33´8+±O22°K/´=+° /´+² +³@ +°/´G++°D/´7+°d/° Ö´1+°F2°±6+´b+°b±_+°92´W+°N2°W±H+´<+°±T+°P2´-+°A2°-±+´ 1+±22° ´&+°&/²& +³@&" +° ´ +° /±e+±6°D9°b°9°_²3C[999°W°19±H³/=KY$9±-T°9°³($9± °9±3±199±"[²5999°#±b99°`²&6999012!!3!462#"'7324+53254#"&"##"'#"&46;54632"!54"354&5#32#265'#"TmþZ]Pý—%;5$%''…I81:F5O=:$$þä˜^R8'((GFöK-xe—iÑýï@^ýD' $ !(1,( ¦,,Ch@ Yýüg-PW^ht°&/´2+°G/°C3´g+°[2³:gG+´;+°c/±@]33´M+±V22°T/´+°*2° /´+² +³@ +°/´++°/´7+°i/° Ö´1+°2°±(+´-+°-±J+´e+°e±_+°N2´X+°V2°X±+´<+°±]+°Q2´A+°2°A±+´ 1+° °! Ö´7+°7/°>3´!+°2²7! +³@7: +±j+±J-°9°e²*+999°_±G99°X°E9±µ&2CT[$9± 7°9±:G²!7E999±;g°9°cµ(-J_e$9±T°+9012!!3!46"!54232# 4732>54+53254+#"'#"&546;>4&#"325#4&5#"32TmþZ]Pý—²˜^RF;N‚%$6Xa2þtn&a.]xT%HH,&$;†='8+:I2J%HŽŽ,DŽ:I-/-xe—iÑýï@^F_M@@MþyT?Z//&: ‹['KfGa6 %'5'°//J.1F>SŠ"-UD96tD6:9Yýés-=FLV_L°(/´Y+°^/´-+°/°83´U+°K2°Q/±6G33´+±"B22°>/´+° /´+² +³@ +°/´++°/´7+°`/° Ö´1+°2°±+´S+°S±M+±+22´I+±AW22³IM+´<+°I±G+°C2´6+°"2°6±+´ 1+° °$ Ö´4+°4/´$+±a+±°9°S°9°M±99°°;9±I³->K^$9°G³(8Y$9°6±0[99±^Y²+W0999±U°;9°Q²$4999012!!3!46"!54"&547632#"&543267654'#"&'"354&#32'4&5#"323254&#"TmþZ]Pý—²˜^R_1:–†A"œUMn9_y.[ )Z‚";-“'‰))‰EBÅG0*A]02&5-xe—iÑýï@^F_M@@MüûD4q“,)> ‹lG>%%< 7-.O­ !?0.’i045:Yþƒs-@MU\f\²=+°3´N+°"2°5/±+033´e+±LZ22°a/±CV33´:+±$R22° /´+² +³@ +°/´++°/´7+°g/° Ö´1+°2³8 +´c+°±]+±:`22´X+°Q2°X±+±SV22´<+´J+°D2°±A+´'+°'±+´ 1+° ° Ö´+°/´+±h+±]c±599°X±399°µ01=NZ$9°J±.?99°°$9°A±+L99°'±"99°°9°°9±e5±399°a²'8.999°:±99°N°?9012!!3!46"!542'654&#"32#"&5"&'#"&547>3264+32'"354#3254&5#"32TmþZ]Pý—²˜^R®Zme$JH;S!74:J:@1;—H=_)JH0/ë)‘‘IHÐG0+-xe—iÑýï@^F_M@@MþxkY}<#-i326324&#32'"354#3254&5#"32TmþZ]Pý—²˜^Ru1?.'!"!)U15%-}@60NO>29—G>\ ,sB;Jõ/210ë)‘‘HIÐF/,-xe—iÑýï@^F_M@@Mýû, D,5 ;!2!)q6A'A88C4o?PDD#Â!bþ.Mll924<Pýüs-[bhnx§°-/´7+°/±TX33´w+±am22°s/±^i33´+±Lg22³As+´@+°e/°H3´+±#222° /´+² +³@ +°/´++°/´7+°y/° Ö´1+°2°0 Ö´5+°±+´u+°u±o+°2´k+°g2°k±+±ci22´<+´`+°L2°±\+´Q+°Q±+´ 1+° °+ Ö´;+°;/°E3´++°'2±z+±5°29±u°39°o±99°k±Z99°´Xem$9°`³!-7V$9±\±OT99°Q°#9°±@A99± ;°)9±w±+Z99°@µ;V\ou$9°s°)9±A±0599°e²!'E999°°39012!!3!46"!54"&547>32632!"&547!27654'&+532654&#"3232#"'#"'%4+2'4#"3#32'4&5#"32TmþZ]Pý—²˜^Ræ-2‰>9O 1n=3900þ‘×ÝC(8}hS€ D/*'2r:29B@GIZ“B@……CA¼A-'-xe—iÑýï@^F_M@@MýD3o?QDF&?EJÁ–³a["KOþî&T9/#%-q5BDD99w5j³NS=m435>Yþ†W-9ï²+´&+°,/° 3´7+° /´+² +³@ +°/´++°/´7+°:/° Ö´1+°2°±/+´4+°4±9+´)+°)° Ö´<+°/´<+°)±+°#2´ 1+´+±;+±/°9°4°9°´,127$9±)² !999±7,°!9°&µ#)/4$9°°29° °19012!!3!46"!544632'654&#"#"&547325TmþZ]Pý—²˜^RL=S+&s-b6/GS@IXt,\4,M-xe—iÑýï@^F_M@@Mýæ?S=5Q}:,)j5Iv3@RjP‡;+-c4OmYþW-I²+´1+°%/´"+°/´++°8/´D+° /´+² +³@ +°/´++°/´7+°J/° Ö´1+°2°±<+´A+°( Ö´ +² ( +³@ # +°A±F+´5+³5F+´<+°/´<+°5±+°.2´ 1+´+±K+±<±99± A°9°µ+8>?D$9±5²,999±"°(9±1Dµ.59012!!3!46"!542+"3!!"&546;254&#"#"'&54732=46TmþZ]Pý—²˜^R¯GSiZ«33fþ’/>?.¨Ž1*$L9E''l"L/#AD-xe—iÑýï@^F_M@@MþxdN_u=/)*3™0D)/)5?+,>-þ @@T?J:?TlI0"AL9@T-xe—iÑýï@^F_M@@Mþ .B0I>/)*3$9/26X'5>Q?p2/$J%8L06D9Yýé]-DM4°"/´G+°L/´(+°5/´B+°//´+°;2° /´+² +³@ +°/´++°/´7+°N/° Ö´1+°2°±9+´>+°>±%+´E+°E±D+´2+°2° Ö´<+°/´<+°2±+´ 1+°2° ´-+°-/±O+±9°9°>°9°%°9°E³5;$9°°<9012!!3!46"!544632#"&5462>54#"#"'&5473253254&#"TmþZ]Pý—²˜^R*O=S,*GP7`MX^(:hDRAL-)v!R/I6R<:'--xe—iÑýï@^F_M@@Mýå>V?:Y{_l(% '#’GŒv2?O74H‹:4*`2#(hü YþW-3á²+°!/´"+°2°)/´+° /´+² +³@ +°/´++°/´7+°4/° Ö´1+°2°±1+´,+°,±+´<+°±&+´+²& +³@&! +°±+´ 1+°2° ´+°/±5+±1±99°,°/9±²).999±&°9±)"²/1999012!!3!46"!54233!532654&#"&546TmþZ]Pý—²˜^R;2KtCþØ-'' DN-xe—iÑýï@^F_M@@MþJ2/:þ‘5.##4IYýÂW->G4²+°&/´?+°,/° 3´-+°2°-´D+°4/´+° /´+² +³@ +°/´++°/´7+°H/° Ö´1+°2°±<+´7+°7±+´<+°±)+´F+²)F +³@), +³1F)+°+3´+°F±+´ 1+±#22° ´+°/° ´B+°B/±I+±<±99°7°:9±²49999±F°9°³&?CD$9± B°!9±D?±)#99±4-²:<999012!!3!46"!54233##"&547!532654&#"&546264&"TmþZ]Pý—²˜^R;2KtC I42KþÞØ-'' DNÔ,,<**-xe—iÑýï@^F_M@@MþJ2/:þ‘#.3JK2-$5.##4Iþm+<,,<+Yý§^->FVc²+°&/´G+°O/´E+°,/° 3´-+°2°-´A+°4/´+° /´+² +³@ +°/´++°/´7+°W/° Ö´1+°2°±<+´7+°7±+´<+³)+´T+²)T +³@), +°±1+´+°±+´ 1+°2°? Ö´L+° ´+°/° °# Ö´J+°J/´#+±X+±<±99°7°:9±)²49999±1°+9±T²CQ999°?´&AEGO$9± J°!9±AEµ)#JLRT$9±4-²:<999012!!3!46"!54233##"&547!532654&#"&5464#"322654'#"&'TmþZ]Pý—²˜^R;2KtC$R89S%þêØ-'& DNû+..+*$4+ - 6-xe—iÑýï@^F_M@@MþJ2/:þ‘'78SR96(5.$#5HþÔ,,-V4$!/,#5Yþ„W-BK²#+°'3´+°32°+°>±+°52´ 1+´!+±Z+±°9°K°9±D'´%1MN$9°S²FH999±³APU$9±>W´28$<$9±!±*+99±),°.9±2$°/9°A°N9°U°M9°H·!5<>DKP$9°°9012!!3!46"!544632632+"3!!"&4632654&#"##"&547&#"&%3254TmþZ]Pý—²˜^RÛpU4FLhrWâ22¥þS.@@.à>R@0 'A23B- 6OE\ #;6-xe—iÑýï@^F_M@@MýßIPfQXt $50R0V@2G&C3FE4A%1,I--¬1DD7YþW-Yaƒ²+°V3´<+°J2°)/´&+°!/´0+°C/´`+°6/´7+° /´+² +³@ +°/´++°/´7+°b/° Ö´1+°2°±R+´M+°, Ö´$+²$, +³@$' +°M±+´<+³^+´F+°F/´^+°±Z+´@+°@±+±3:22´ 1+´+°2² +³@6 +±c+±R°9±M,°9±F$´"/OP$9°^²HJV999°³CX\`$9±@Z°>9°³!0<$9°°9±!&°,9±C0°P9°`²3O999±76´@FZ^$9°<µ>HMR\$9°°X9012!!3!46"!542#!"3!!"&54632654+53254#"#"&547&#"&54763264'32TmþZ]Pý—²˜^R©D\,,N?þÛ11¨þP+@@+$77-c (=-.601J4U=5J= *2-/-xe—iÑýï@^F_M@@Mþx66D B:@ $4.)&3(541; ,@0GD3A-8-C1/eG+(¬>:=YýæW-JT]U²G+°3´<+°.2°/´W+°\/´$+°5/´P+° /´+² +³@ +°/´++°/´7+°^/° Ö´1+°2°±D+´?+°?±8+´N+°N°U Ö´!+°!/´U+°N±+´<+°±R+°Y2´2+°2±+°+2´ 1+´+±_+±D°9±!?²AB999°8°9°U°<9°N°G9°°:9°·$5IKPW\$9°R°09°2²'.999±\W±!'99±5$°B9°P°A9°<¶+28?DK$9°G°I9012!!3!46"!542#"&5463267654&#"#"&547&#"&5463263254&3254&#"TmþZ]Pý—²˜^RWeNQ};aN.1Y /H:AJ3:CC 5K7$SzV5")%@<&jW62%6-xe—iÑýï@^F_M@@Mþx{_~]e)' & IAB?W;[6QKP6[(,;xRnTP$PP%Nþ– $þ€ -`go‘²#+²'+/333´+²;IS222°Z/³5BM$3´n+°f2° /´+² +³@ +°/´++°/´7+°p/° Ö´1+°2³ +´+°/´+°±]+´l+°l±h+´W+°W±N+´M+°M±E+´e+°e° Ö´<+°/´<+°e±+´ 1+³? +´a+°a/´?+° ±8+´3+±q+±±99±l]±#99°hµ%ZU_$9°W±'S99°N°9°°)9±E°I9°e°+9°a³-B=G$9°±/;99± ?±5699±nZ±699°@ )38?EW]cj$9°#±%-99012!!3!46"!54"&547632632632632'654&#"#"&547&#"#54'&#"#"&547&4'32%4'32TmþZ]Pý—²˜^RþÒ2B:&L.4Z/CIX59O0)L$9F2:A05<< 2=:B/6:; ô:798þ…89:7-xe—iÑýï@^F_M@@Mþ;T8e*(6‡I9@ << @:H‡6)*d6V9n9^X?i;*ÿü:m8`X@j:¨[.+¼^[.,]_0þ |-krz´°4/´1+°-/´9+°]/°F3´y+°q2°d/²?MV333´+²"&222° /´+² +³@ +°/´++°/´7+°{/° Ö´1+°2³g +´+°/´g+°7 Ö´/+²/7 +³@/2 +°±`+´w+°w±s+´Z+°Z±R+´Q+°Q±+´<+°p2°´I+°I/°±l+´C+°C±+´ 1+³< +´)+±|+±/³-9ij$9±w`²bd999°s²]999°Z³VX$9°R°9°Q° 9±I±"M99°l³$:FK$9°C³,&?A$9±14°69°-°79±]9²QRj999°y°i9°d@ )< CIZ`glnpu$9°±$99012!!3!46"!544632632632632#!"3!!"&463!254&#"#"&547&#"#54&#"#"&547&#"&%4'2%4'32TmþZ]Pý—²˜^Rþ2bG%!SŠ22dþŒ2332-xe—iÑýï@^F_M@@MýÝEW66hK\g*%2/P44L,K1II1L*'¹¹$-I/KI1L)?,Q '6S1,%8GH/-&6G:þ†-w‡Þ°@/´=+°8/´G+°q/±Ze33´†+°~2°M/´N+°/²Saj333´#+²'+/222° /´+² +³@ +°/´++°/´7+°ˆ/° Ö´1+°2°C Ö°3´;+°2°±t+´„+°„±€+´n+°n±f+´e+°e±+´<+°°| Ö´]+°]/´|+°±x+´W+°W±+´ 1+³J +°Q3´5+°12²J5 +³@JM +±‰+±;³9F$9±„t²#v999°€²%q999°n³'jl$9°f°9°e°)9±]°+9°|°_9°x±-Z99°W²/SU999±J±8G99±5 ²3>?999±8=°C9±qG°9°†²5J999±NM@ 3W]ntx|€„$9°@ )1U_lvz‚$9°#±%-99012!!3!46"!54"&547632632632632#"3!!"&5463!2654+53254#"#"&547&##54&#"#"&547&4'32%4'32TmþZ]Pý—²˜^RþÖ*:5 K'.S':PT1;Ÿ((<0ý44Öý#+:>,b)$&m *:*,:0 2:9 +;*,8.Ý.530þ0330-xe—iÑýï@^F_M@@MþHB,T"$6h<.776l;<2E*%30()6+.8471I0OM2K/*¹¹*.L0OM2I1}>$$>II=&&=IYþ‹W-0í²+°!/´+´"+°'/´+° /´+² +³@ +°/´++°/´7+°1/° Ö´1+°2°±.+´)+°)±+´<+³$+´+²$ +³@$! +°±+´ 1+°2° ´+°/±2+±.±99±)´'+,$9°$°&9±°9±"°+9°'³$).$9012!!3!46"!54233!5654&"&546TmþZ]Pý—²˜^R>U¥Aþ»12D32RX-xe—iÑýï@^F_M@@MþL;#2þ™U¥A&S79S&]12"#22RXJ,--,*%2 +!, 5-xe—iÑýï@^F_M@@MþL;-þ™)78RR87)$5!-)"02'S8OþÐ,,-V2%".,$3YþRW-A)²+²(+°"/´.+°1/´+°7/´+° /´+² +³@ +°/´++°/´7+°B/° Ö´1+°2°±%+´*+°*±?+´:+°:±+´<+°±4+´+²4 +³@41 +°±+´ 1+°2° ´0+°0/°3±C+±%±99±?*±'99°:°(9°°=9°²7<999±4²".999±1.°=9°±2<99°7µ%*4:?$9± °'9012!!3!46"!54233#"&547327#5654&#"&546TmþZ]Pý—²˜^R,3A‰AÏŒ¡=(6MCgÕ##$(BC-xe—iÑýï@^F_M@@Mþ>2. þÊx‡‚`I?Qq81D3"!*,!K0@Yý‰]-KUr²+²2+°'/´L+°,/°P3´8+°;/´+°A/´+° /´+² +³@ +°/´++°/´7+°V/° Ö´1+°2°±/+´4+°4±I+´D+°D±+´<+°±*+°>2´S+´+²* +³@*; +°S±+´ 1+±$22° ´:+°:/°3° ´O+°O/±W+±/±99±I4±199°D°29°°G9°²AF999±S*²,8999±³'LPQ$9±O:°"9±,L±*$99°8°"9°;°G9°±DI$9± °19012!!3!46"!54233#"&547.547327#5654&#"&546264&"TmþZ]Pý—²˜^R,3A‰A5;J32K‰™=(6MCgÕ##$(BCæ,,<+*-xe—iÑýï@^F_M@@Mþ>2. þÊ<$F3JK2, †€`I?Qq81D3"!*,!K0@þ#+<,,*Yý…W-IO^†²+²1+°'/´Q+°X/´O+°L/´6+°9/´+°?/´+° /´+² +³@ +°/´++°/´7+°_/° Ö´1+°2°±.+´3+°3±G+´B+°B±+´<+³*+°93´]+°±<+°,2´+°M2°±+´ 1+±$22°K Ö´U+°"2° ´8+°8/°3° ´S+°S/±`+±.±99±G3±099°B°19°°E9°*²?D999±]²6Z999°K³'PQX$9±LOµ*$SU[]$9°6±",99°9°E9°±:D99°?µ.3Õ 9!-+ 11'S9NL; ý;(šœ)8YýÂW-BKU`²+´C+°%/´L+°+/°3´A+°G2°A´Q+°72°+´,+°1/´<+° /´+² +³@ +°/´++°/´7+°V/° Ö´1+°2³9 +´4+°±.+´?+².? +³@.+ +°?±B+´G+°G° Ö´<+°/´<+°G±(+´S+°S±+´ 1+±"22° ´H+°H/° ´O+°O/±W+±.4´67<$9°?±A99±S(°*9°´%CLP$9± O° 9±QL±("99±A,°69°1³.49?$9012!!3!46"!544632##"&547!5654&#"&5463237"354&264&"TmþZ]Pý—²˜^R[EC./I42KþÛ12"#33SW<=Tf '6¾8,,<+*-xe—iÑýï@^F_M@@MýØD\./>Õ#.3JK2/" 9!-+ 11'S9NL; ý;(šœ)8þ3+<,,*Yý§W-AJRb{²+´B+°$/´S+°[/´Q+°*/°3´@+°F2°@´M+°62°*´++°0/´;+° /´+² +³@ +°/´++°/´7+°c/° Ö´1+°2³8 +´3+°±-+´>+²-> +³@-* +°>±A+´F+°F° Ö´<+°/´<+³'FA+´`+°F±+´ 1+±!22°K Ö´X+° ´G+°G/° ´V+°V/±d+±-3´56;$9°>±@99±`F°)9°Kµ$BOS[$9± V°9±MQµ'!VX^`$9±@+°59°0³-38>$9012!!3!46"!544632##"&547!5654&#"&5463237"354&4#"322654'#"&'TmþZ]Pý—²˜^R[EA_$$R89S$þñ12"#33SW<=Tf '6¾8+..+*$3 + - 4-xe—iÑýï@^F_M@@MýØE[[@Õ'78SR97' 9!-+ 11'S9NL; ý;(šœ(9þš,,-V4$!/,$4Yþ†X-?GH²+³+°<3´'+°.2°!/°*3´+°F2°´7+°B/´2+° /´+² +³@ +°/´++°/´7+°H/° Ö´1+°2³9 +´D+°±@+´5+°5±++´*+°*±+´<+°±$+´+²$ +³@$! +°±+´ 1+°2° ´+°/±I+±D°09°@²27999°5±<99°+°9°*°>9±±'99±$°9±!°"9°B²459999°2²$0999±'°>9012!!3!46"!54233!5654&#"#54#"632#"5463264#"32TmþZ]Pý—²˜^R1OR$l@þíK0,>BbU/9=0ufYN( ²0//0-xe—iÑýï@^F_M@@MþygXD51þ“'9_4DDóóDgCdCŸ`|))þù:98YýÀ^-KT\¸²H+°3´9+°22²9H +³@95 +± +22²+°&/´L+°Q/°C3´++´[+´=W5H +´=+° /´+² +³@ +°/´++°/´7+°]/° Ö´1+°2°°Y Ö´E+°E/´Y+°;2°±U+´@+°@±6+´5+°5±+´<+°±/+°+2´+³S/+´)+°)/´S+²)S +³@), +°±+´ 1+°2° ´+°/° °# Ö´O+°O/´#+±^+±UY²=C999°@±H99±56±J99±±299±S±Q99°²&LP999± O°!9±QL±)#99°[°-9±W³@EUY$9°=²/;999±9°J9012!!3!46"!54233##"&547#5654&#"#54'"632#"546326264&"4#"32TmþZ]Pý—²˜^RQW'xAI42KMO5-DCh_&2:@2zn[S,"--<**þb5665-xe—iÑýï@^F_M@@MþxfXF3.þ™$/3JK2/$$7a3GGïïEn?42A`{++ýõ*<--<*<;:Yý¦^-KSckÖ²H+°3´9+°22²9H +³@95 +± +22²+°&/´T+°\/´R+°C/°N3´j+´++´=f5H +´=+° /´+² +³@ +°/´++°/´7+°l/° Ö´1+°2°°h Ö´E+°E/´h+°;2°±d+´@+°@±6+´5+°5±+´<+³)+´a+²)a +³@), +°±/+´+°±+´ 1+°2°L Ö´Y+° ´+°/° °# Ö´W+°W/´#+±m+±dh²=C999°@±H99±56±J99±)±299±a°+9°/°_9°²P^999°L´&NRT\$9± W°!9±CRµ)#WY_a$9°j°-9±f³@Edh$9°=²/;999±9°J9012!!3!46"!54233##"&547#5654&#"#54'"632#"5463264#"322654'#"&'4#"32TmþZ]Pý—²˜^RRV'xA&R89S'9O5-DCh_&2:@2zn[S,"+..+*$4*!- 5þu5665-xe—iÑýï@^F_M@@MþxfXF3.þ™)78RR88($7a3GGïïEn?42A_|++þ\,,-V3$".,$3!<;:YþW-%-ײ+´&++°/´$+° /´+² +³@ +°/´++°/´7+°./° Ö´1+°2°±+´*+°*±+´<+°±,+´"+°"±+´ 1+³ +´%+°%/´+±/+±±99±±$&99°,°9°"° 9±&$±"*99°° 9012!!3!46"!54!54324'3'"654TmþZ]Pý—²˜^R þ“¹´=Meš+,€-xe—iÑýï@^F_M@@Mý²ª§ÉÆl!'`WúM8nV]@YýÀW-(09B*² +´3++°/´:+°?/´0+° /´+² +³@ +°/´++°/´7+°C/° Ö´1+°2°±+´8+°8±+´<+°/2°°A Ö´+°/´A+°±1+´-+°-±+´ 1+°0 Ö´#+°&2°#´=+°=/±D+±±99±±399±1A° 9°-³+:?$9°0°>9±=°$9±?:±&99°0³#$$9°3±-899° °+9012!!3!46"!54"&547#5432#4'3'4#"6264&"TmþZ]Pý—²˜^R§2K ¹´"INe›u)"1--<**-xe—iÑýï@^F_M@@Mü8K20#§Éƪ"13Jzl!'`Wº@#EnUþÔ*<--<*Yý¦W-(08@PH² +´3++°/´A+°I/´?+°;/´0+° /´+² +³@ +°/´++°/´7+°Q/° Ö´1+°2°±+´7+°7±+´<+°/2³N+´+°/´N+°±1+´-+°-±9+´F+°F±+´ 1+°0 Ö´#+°&2°#´D+°D/±R+±±99±N°9°°39°1³ =KL$9°-µ+;?AI$9±D°$9±;?µ&DFLN$9°0³#$$9°3±-799° °+9012!!3!46"!54"&547#5432#4'3'4#"64#"322654'#"&'TmþZ]Pý—²˜^R£9R&ƒ¹´ &SNe›u),*X,--,+%2 +!, 5-xe—iÑýï@^F_M@@MüQ97)§Éƪ)78R”l!'`Wº@M8nUÅ,,-V2%".,$3Yþ„f-:D²5+°3´)+°#/°/3´+°;2° /´+² +³@ +°/´++°/´7+°E/° Ö´1+°2°±2+´B+°B±>+´-+°-±&+´9+³9&+´<+°/´<+°9±+´ 1+° ° Ö´+°/´+±F+±B2°9°>´/0+$9°±)599±9³#$9±)¶&-28@$9°5°9012!!3!46"!542654'7#"&=4#""&54632!2654'TmþZ]Pý—²˜^RÕ$2Z$s"'G>Np NHvCw]Fjþý%T3%-xe—iÑýï@^F_M@@Mý8T/c6'=ŠF5=V@7uB[D_bF]wS?:tC&`2U&9Yý¸f-AKUY²<+°3´0+°&/´B+°G/´+°L2° /´+² +³@ +°/´++°/´7+°V/° Ö´1+°2°±9+´S+°S±O+´4+°4±-+´@+³@-+´<+°/´<+°@°J Ö´)+°)/´J+°@±+´ 1+° ° Ö´+°/´+°#2°´E+°E/±W+±S9°9°O´672$9°±0<99±J@°+9°µ&BG$9°°!9±GB³)#76$9°±!+99°0¶-49?Q$9°<°9012!!3!46"!542654'7#"&547&=4#""&54632264&#"%2654'TmþZ]Pý—²˜^RÕ$2Z$s=;I42K*Jp NHvCw]Fj]++++þ¾%T3%-xe—iÑýï@^F_M@@Mý8T/c6'=Ši3#H3JK29%%b7uB[D_bF]wS?:tÔ*>*+<+ÔC&`2U&9Yý™f-@HXbo²;+°3´/+°&/´I+°Q/´G+°6/´Y+°2°Y´C7+° /´+² +³@ +°/´++°/´7+°c/° Ö´1+°2°±8+´`+°`±\+´3+°3±,+°(2´?+³?,+´<+°/´<+°,´V+°?±+°A2´ 1+´N+° ° Ö´+°/´+°#2°´L+°L/±d+±`8°9°\´561$9°±/;99±?@ &*EIQT$9°N±!%99±CGµ(#LNTV$9±Y6±!*99°/¶,38>^$9°;°9012!!3!46"!542654'7"&547&=4#""&546324#"322654'#"&'%2654'TmþZ]Pý—²˜^RÕ%1Z$sEESpS?Ep NHvCw]Ek|,--,+$4 +!, 4þÐ&T3$-xe—iÑýï@^F_M@@Mý8T/c6'=Šp2'P8RR8J*'\7uB[D_bF\xT>:tq++.U3$".,$3ôC&`2U&9Vþùn.%-ä²+²+°!3´++² +³@ +°/´'++° /±é°./°Ö´+°± +´+° Ö´-+²- +³@ +°±+´!1+°$2°!´)+°)/±/+±³ $9° °9°-°9°°9°´&'*+$9±!)°"9±'³$),$9°±*+99°±99° ³ $901"&547#5654&#"&546323#264&"†_!‡z[^:;#´¦|{œOÞP##ÊP88P9þù`C8,3G“]z>@] 6=KÉ~¦¢}?àýß,8C8P89NVþÔn.%1A ²+²,+´ 7+² +²#+°/´2++°:/´&+°/±é°B/°Ö´+°± +´+³? +´+°/´?+²? +³@ +°±)+´7+°7± +´#1+°2°#´5+°5/±C+±³$9° ±99±?±/<99°)´&,2:$9±#5°$9±&·)/57=?$9± ,± 99°³ $9°±!"9901#"&547#5654&#"&546323#2654&#"2654'#"&'njJIk-oz[]v#´§{zOÞP++µ##""/D9)(9DwJklID33G“\{}^ 6=KÉ|¨£|?àýß2G#! "pC/ *=9'.DVÿn.)4Ͳ+²+´++°#/´0++°*/´++° /±é°5/°Ö´+°±'+´-1+°-± +´+²  +³@  +°±+°2´ 1+±6+±'³ $9± -±99°²#*0999°±299±*0³'-2$9±±99° ³ $9°±9901265!5654&#"&546323#".546"3254&B>uþ¦z[]v#´§{zOÞP‹r6[AdF 9Z1JS,$&F3G“\{}^Ÿ7=LÈ|¨£|?àýßrŒ=+/3D!Yÿ"21¬²"+²+´/++°/´7+°/±(é°2/°Ö´ &+° ±$+´+°±+´,&+², +³@ +°,±/+°2´&+±3+±$ ° 9°° 9°µ!"(.$9±/±!99°µ $,$9°(² 0199901%#"547327675!5654&#"&5476323 }«`öþØaCX€~×t]` þ¨x^]t#µTS|{NOQßNHh/Þ™ƒ+r¾xw+,:3G“]z|_ 6=MÇ}TSQR|Œ@åYþ?2=E ².+²!+´;++°/´?++°/´7+°(/±4é°F/°Ö´&+°±0+´++°+±%+´8&+²%8 +³@%" +°%° Ö´E+°8±;+° 2´&+°2°´A+°A/±G+±0°9°+°9° µ(-.4$9°%±:99±;8µ>?BC$9±?³ AD$9°²BC999°.°9±;!±#-99°(µ%+08$9°4²<=99901%#"'&547#"547327675!5654&#"&5476323264&" S\/.FD.0$6öþØaCX€~×t]` þ¨x^]t#µTS|{NOQßNËN98P8S:-eC1//2B$!Þ™ƒ+r¾xw+,:3G“]z|_ 6=MÇ}TSQR|Œ@åü[9P88PYþ 2=HY=²*+²+´7++°/´I++°R/´>+° /´7+°$/±0é°Z/°Ö´&+°±,+´'+°'±!+´4&+²!4 +³@! +³W4!+´+°/´W+³U4!+´F+°4±A+´O+°O±7+°2´:&+°2°:´L+°L/±[+±,°9°'°9°µ $)*0$9°!± 699±A4´>DIR$9°O°<9± >·AFLNUW$9°±CD99°*°<9±7±)99°$µ!',4$9°0²8999901#"'&547#"547327675!5654&#"&54763232654&"2654'#"&' 54LK45!!öþØaCX€~×t]` þ¨x^]t#µTS|{NOQßN Xf·!#.$#/C;(): CþÌK5445K0)Þ™ƒ+r¾xw+,:3G“]z|_ 6=MÇ}TSQR|Œ@åýÛW<2r"!"#pC/")<8(.DVþ„.>I*°&/°23´+°B2°,/´9+°/´ +²  +³@ +°/´7+°J/°Ö´+°±5+´?+°?±F+´0+°0±)+´=+°=° Ö´+°/´ +² +³@ +°=± +´1+°°# Ö´+°/´#+±K+±5²999±F?´.23$9°0±,999°° 9± =³ !&$9±,¶#)05Lo LHtA98_Cjþ¿#P1!Š`z£žyŠ=Óýí1EŽZxy\3þU.d6)>ŒNmWB7uCZDbdG^<;PC:t_&9%!#`2Vý»†.HS^°+/´I+°=/°N3´W+°2°6/´C+°/´ +²  +³@ +°/´7+°_/°Ö´+°±?+´T+°T±[+´:+°:±3+´G+°G° Ö´+°/´ +² +³@ +°G°Q Ö´/+°//´Q+°G± +´1+°°# Ö´+°/´#+°'2°#´L+°L/±`+±?²999±[T´8<=$9°:±6C99°° 9±QG°19° µ !+IO$9°°N9°L°%9±=I±/'99°W±%199°6¶#3:?F]$9°C° 9°±!99° ±99°³ $901%.5463233!5654&"2654'7#"'&547&=4#""&5476322654&"327654' Pd§{yžOÞPþVz¶xÆ$0Y%q9;%#54$%'Fo LHtA98_Cj\,+>*+þ#P1!Š`z£žyŠ=Óýí1EŽZxy\3þU.d6)>Œf5$F1'$$%37%'`7uCZDbdG^<;PC:tÑ*++*0&9%!#`2Vý„.EM]g‹°*/´N+°V/´L+°H/°:3´++°a2°4/´@+°/´ +²  +³@ +°/´7+°h/°Ö´+°±=+´^+°^±d+´8+°8±1+°-2´D+°D° Ö´+°/´ +² +³@ +°1´[+°D± +°F2´1+´S+°%2°°# Ö´+°/´#+°'2°#´Q+°Q/±i+±=²999±d^´6:;$9°8±4@99°° 9±D[±/X99° @  !*HJLNV$9±HLµ-'QSY[$9°±%/99°4¶#18=Cf$9°@° 9°±!99° ±99°³ $901%.5463233!5654&"2654'7#"&547&=4#""&546324#"322654'#"&'32654' Pd§{yžOÞPþVz¶xÆ$0Y%q@?S89R;;o LHtAs]Ehu+--+*$4 +!, 4þ˜#"P1!Š`z£žyŠ=Óýí1EŽZxy\3þU.d6)>Œm3(M8RQ9J))W7uCZDbdG^wS@:tm++-U2$".,$2N&9B'`2Vÿ/n.!­²+²+°3´++² +³@ +°/´!++° /±é°"/°Ö´+°±+´+² +³@ +³@ +°±+°2´1+±#+±´!$9°°9°° 9±!°9±±99° ³$901!57#5654&#"&546325#nþ*é½z[]v#´§{zOÞ.Æ!ý)¨3G“\{}^Ÿ7=LÈ|¨£|?àýSŒŒVþ&n.'+3þ²+² +°)3´!++²! +³@!# +°/´-++°/°%3´+++°/±é°4/°Ö´+°±+´+° Ö´3+²3 +³@ +³@ +°±"+°(2´%1+°2°%´/+°//±5+±³$9°±!+99°3°9°± 99°"µ*,-01$9±%/°&9±-²0999°+° 9±! ± 99°³$901"&547#57#5654&#"&546323#'5#264&"n_†_#µé½z[]v#´§{zOÞP$$O.ÆyP88P9þÉC``C:,)¨3G“\{}^Ÿ7=LÈ|¨£|?àý+pŒŒþõ8P89NVþn.(,6F'²+² +°*3´"++²" +³@"$ +°/´7++°?/´-+°/±&233´,++°/±é°G/°Ö´+°±+´ +³D +´+°/´D+²D +³@ +³@ +° ±0+´<+°<±#+°)2´&1+°2°&´:+°:/±H+±³$9°²",999± D³ 45A$9°0µ+-27?$9±&:°'9±-µ:++°@/´++°Q/°Ö´ +°* Ö´!&+° ±+´&+°±;+´N+°N±G+´5&+°5±1+´+±R+±!µ -$9±GNµ.8@>$9°5±399±1±%&99±$°*9±K@  135;CGN$9°>°9±@° 901%#"&547327654632#!"3!!"&5463!2654'#"&5467&#"2654'&#"ãhM`t’%pR@M‚]–BVvˆyýù$99$ÿüõEXYD]l\ jRF^yW0A@XÞ4; Fb4ûHV€c«G6:yB_HpSfi xYry' %CI?@J]Va!)UuQCXy$J=ÄL:--M?'0Zÿ0$2Q]1²+´'+²%+°!/´++°J/°;3±é°R2°//´0+°6/± é°A2° ´Y++°C/´ ++°^/°MÖ´+°$ Ö´&+²$ +³@ +°±+´G&+°G±>+´\+°\±U+´8&+°8±++°32´<+°2²+ +³@+/ +±_+±µ'JOP$9±U\³ ;CA$9°8± 699°+±(99°°9±°$9±J°+9±0/±>99°6@ 8FGMU\$9°Y°W9± C°P9013276546322#!"3!!"&5463!2654&+53254&##"&5467&#"#"&5472654'&#"¡S?M‚]œ<0cF+*L6ýo%87&üîFYZE…+.@ jRF^yWU@XiL_u’%p 49 FbIB^HoSfi%F)@?6M&!%DH@?G'&1+°>±E+±2é°2±&+´Q&+³WQ&+±é°/±Wé°Q±I+´1+°±+´ &+±a+±E>²5;<999±IQ@ *#.,U[]$9°²999±U[±99±MF@ &129>E$9°*°9±.°<9014632#"'&5432>54'#"&5476323&#"#"'&54732652654'&#""3254'Ä‘lMBF$k†~¸F:L¿;CJN]9>`PjFDe;PMfvYrB=¤(|^#&8<Y=F P;9< :=4'"^5Mdz#= —s²rs%Ef #,&•g’$0/aHNgPjIG6_KWoUOuÒT+´!<+°!±+´+² +³@ +°±+´&+±I+±;²389999±B'±,99°>² $*999°!² 999±°9±E$°09°,@ !*/6;@$9°³ 9$901%26=4632632335!2654&#"#"&'547&#"#"&5474'326LD4 mX!'\n–IÊLüåOHmsT G[GDVRGgr^mƒ¢*|[ŠLR*%&)=VV`c‚#"®utSÝýáCvJ[ˆJRMmkJTJgGs]s¢wÐVJþÿ8P88P8”?.V-1R,AYþÔž2GQZik² +°3´!++°2²=+±é²N+´C+°/´\++°c/´I+°//±Ué°6/°(3±é° 2°j/°@Ö´E1+°E±+±:é°:±2+´R&+°R±W+±,é°,±+´h+²h +³@ +°h±%+´+°±K+´`+°`±+´&+°2°´^+°^/±k+±E²=BC999±R2±699°W² /4999°,² (*999±h°9°%°e9°´HNP[$9°K´IM\c$9±^°9±=I·KP^`fh$9±U/°:9°6@ %*,29@EY$9°³ C$901%26=463263233##"&547!5!2654&#"#"&547&#"#"&5472654&"3254'2654'#"&'LD4 mX!'\n–IÊL--jJIk.þOHmrU I\HEYSGgr^mƒ¢*|ZÍ0""0"þ@,%OLTÎ\D9*(9 =VV`c‚#"®utSÝýá5CJklIE2CvJ[ˆJRNonLTKgGs]s¡xÐV326=5!27654'&#"#"&547&#"#"'&547%2654'2654'&#"2LD4ULlX!'\qLGIÊLPHnaC95K)E|ý.OI6669X I/-HFXSGgr^qB=¢*|(-A&)LT,v#>&?!>7=WU`eC=#"[TèSÝýý#zD=)"1 /,&0>C;:KYCGLVG86kKVKgGs^rUOuÐVJ’?/V-1R-Aþv Zÿò 2`nx\²5+´6++°2²T+°!3±é°a2²5+´3+°F/´o7+°h/´(++°?/±,M33´ 7+±22°y/°XÖ´]1+°]±+±Qé°Q±I+´v&+°v±r+±Cé°C±;+´&+²; +³@;5 +°±+´/+²/ +³@/4 +°/±%+´k+°k±d+´+±z+±]²TZ[999±vI±M99°r² FK999°C² ?A999±;°9±/°9±dk´!(,*$9±oF²%Qk999°h@/;CIPXd]rv$9°(°*9°?²AKt999° ± [9901%26=476326323&547632#"'&54632&#"!5!27654'&#"#"&547&#"#"'&5472654'&#"%2654'MD5TLmW!'\qLHIá-[Y|YX3;_R65p\=lgƒF #ü‹PI655;WI]ED]UHgr^qB=£)|)-Õ8K!<9H !ü£$*MU.=WU`fB=#"[VrtSHjŠXVba…fBK?>SaIis: 2C;9LZBGLVJonIXLfHs]sUOuÐVZ>6*+‘C-V-1R-C\ÿ0,2}ˆ”¸²q+±é°$ Ö´1+³Lq+°=3´M++°2´ƒ+´J+°+/´(++°_/´“++°~/´B+°i/±DV33±é± 22°•/°uÖ´z1+°z±+±né°n±c+°.2´+´&+²&c +³@&) +°±Œ+´Z&+°Z±R+´+²R +³@RL +°±+´G+²G +³@GK +°G±?+´+°±…+´;+°;±6+´+±–+±z²qwx999±c²gi999±Œ&µ $1]Ž“$9°Z² VX999±R°9±G°9±?±D99°…±=B99°;³2#9$9±$(°.9±“_µ?6n$9°~@;GRZcmuz…‡Œ9$9°B°9°i²XgŽ999°± x9901%26=476326323&547>32#!"3!!"&5463!27654&'#"5463&#"!5!27654'&#"#"#"'&54767&#"#"'&547"3254'&2654'32PD3UMmW!'\pKHHÕ- “\M~ ç7IV1@)&=C¹±v]!nc†F1ü˜NK565:Y@X=@)*I32r]qC=¤)|'/ÿGVkq&ü9"(JL(!=VV`eC=#"QLgaKBTC4F^D6à\CG+:C@90<54BMN43а[s6w];`0C12BP8<)G#"G)?Zÿ/D2‡”¡ø²c+±pé³pc+´+³Dpc+°23´F+±‚‹22´B+°/´+°U/°#3´•++´%+°-/°‘3´++°:2°\/±Yjc@Ajü PI655:X AYA@XLHgr^qB=£)|)-MD5TLmW!'\rKHIÔ.°…9.o&D,'üÝ#(##-+2@2T8ZK;W/>A2/9Q2=*&37Bas=5LD?G1@AS6*>32EQ8=5XDeaBe2iHs^rUOuÐV32654'&'#"&54763&#"!5%27654'&#"#"'&547&#"#"'&547%3254'&#"2654'&#"2654'MD5TLmW!'\qLHI½/RR‚M}#xB?YW‡]B86J'IiZ"%I`YV[98a"lf>?!4ü©WI655;WI^DG+/UHgr^qB=£)|)-K81r% EV¤3%: :1ü_$*MU.=WU`fB=#"[VäRGn„YZK:\T}ki)#/-.(Z•T>H8He}h[_ED=ABe>;B0D98LZBGLVIn49HXLfHs]sUOuÐV+°>/´9+±e+±R$³!"($9±+°P9° ±0J99±EF°39°>@ 5;U!?kI/0r^qB=¢*|(.MC5HG+%; TO./y W<2%C+0:\(w/0Z6Pp8E.ª[BG@;UR<<D/0Fm\jSJnÆN6@“N;FQRZ]?>ýÒ&D78KŠ93)l4C0ææ.H4j'29ˆN67bH4M97Yþ„ñ//Vdql²3+°53´N+°F2²N3 +³@NJ +°U!?kI/0r^qB=¢*|(.MC5HGÿb˜"'®?=NB;H: ýOl:::9VJg.'4?T!Oäç ,%&1k#56¨H4M97ý²/fYýöñ//iwƒ•²;+°?3´0+°b2²0; +³@0f +°H/´M+°Y/°63´{+°/°3´(7+°o2°j/´7+°/´7+°!2°„/°Ö´$1+°$±8+´3+°3±++±é³f++´e+°± +´m1+°m°x Ö´\+°\/´x+°m±}+´V+°V±t+´1+³Et+´Q+°Q/´E+±…+±8$°!9°3²("999°+³056;$9±e°=9±m\±?b99°x±J99°}@ HKMYjo`$9°V²AT999°t±rv99±MH°J9°Y°K9°{°59°0@ 38AEQTV\$9°;°=9±j(¶$ ,$9°°9±°"9012#"'&547632&#"#"'&547326=476"&54632632#"'7327654&'#"&54767&#"#54&"3267654'&3254'&#"³‘­9?bX3/=>U!?kI/0r^qB=¢*|(.MC5HG0?Ps`PI!)M‚$M)*sX:2&+@))+! <<3@##3BZ=-P6Pp8Eº?%2.ª[BG@;UR<<D/0Fm\jSJnÆN6@“N;FQRZ]?>ý•K2l&46ŒNp22R 79U^Š#434D/O !H\T8910Méé -ŸH4M97ý«2\3%=Yþñ//6DLT²5+´M++°2/´K+°/°3´(7+°<2°7/´7+°/´7+°!2°U/°Ö´$1+°$±++±é³2++´Q+°± +´:1+°:±S+´I+°I±L+´1+°1±A+´1+±V+±+$²!"999±: ±KM99°S²5999°I°G9°L³7<$9°1°9°A±?C99±MK±IQ99°5°G9±7(¶$ ,$9°°9±°"9012#"'&547632&#"#"'&547326=476!5432"3267654'&4'3'"654³‘­9?bX3/=>U!?kI/0r^qB=¢*|(.MC5HG"þ“¹´B6Pp8EBLdš+,€.ª[BG@;UR<<D/0Fm\jSJnÆN6@“N;FQRZ]?>ý ª§ÉbH4M97ýØl (]W÷M8kVZ@Yý¿ñ//AOW_hU²9+´X++°0/´`+°e/´W++°/°3´(7+°G2°B/´7+°/´7+°!2°i/°Ö´$1+°$±++±é°±6+´\+³ \6+´E1+°\±3+´g+°g±^+´T+°T±W+´<+°?2°<´c+°c/°<±L+´1+±j+±+$²!"999±gE´5VX$9°^°99°Tµ0GR`e$9°W²Bd999±U!?kI/0r^qB=¢*|(.MC5HGÈ2K"“¸µ" I6Pp8EMe›,,2,-<**.ª[BG@;UR<<D/0Fm\jSJnÆN6@“N;FQRZ]?>û‘K2/%§Éƪ%/3J£H4M97ýØl (]W÷M8kU[@þ4+<,,<+Yý¤ñ/(9EMU[kв1+´N++°)/´\+°d/´[+°X/´M++°/°3´"7+°?2°:/´ 7+°/´7+°2°l/°Ö´1+°±%+±é°±.+´R+°R± +´=1+°i2°=´,+°,/°=±T+´J+°J±M+´4+°72³a4M+´W+°W/´a+°4´_+°_/°4±B+´<+±m+±%²999±=,°-9°Tµ1LNf$9°J¶)HX[\d$9°W± ?99°M°:9±4_±599°B°D9±d\°+9±X[µ,7_agi$9°M³.45-$9°N±JR99°1°H9±:"¶ &$9° °9±°9012#"&54632&#"#"&547326=46"&47#5432#"32654'&4'3'"6544#"32654'#"&'³®}]Tf|T!?kGaq_k…¢*|[HC5´9S'„¹´!'R 6Pp9I,Mdš,+€W+..%2 *! + 2.ª`„wYSwD_Fm\jšqÆN6@“S|QRZ\~ûvRr(§Éƪ(98S¾H4N8L*ýØl (]W÷M8kVZ@þoXXV2%"-*%2Yýìñ/(4JRZbI²=+´S+°E/´]+°a/´5+°:/´Q+°/°3´"7+°.2°)/´ 7+°/´7+°2°c/°Ö´1+°±%+±é°±:+° 2´W+´,1+°,°[ Ö´H+°H/´[+°W±Y+´O+°O±9+°K2´@+°1 Ö´<+±d+±%²999±[,°9°Y@ =C5SQ]a$9°O´ ).M_$9°9±799°1°39±a]°H9°5°79±SQ±OW99°=°M9±)"¶ &$9° °9±°9012#"&54632&#"#"&547326=46"32654'&267!5432#"#"&54674'3'"6543254#"³®}]Tf|T!?kGaq_k…¢*|[HC5à6Pp9I~P)þϹ±cQ3RH¼Pgžž,+WS6U4.ª`„wYSwD_Fm\jšqÆN6@“S|QRZ\~ÌH4N8L*ý,6£ÊÈ¥MY$$Ån ")^XûM;nX]AþrYÿ#=2Q_â²E+°23±é°R2²+°/±&é°Y/±:é°>/´7+°`/°Ö´ +° ±I+´N<+°N±+±Bé°B±6+´]1+°]±U+´.<+°.±*+´&+±a+±I °9°N°9°²EKL999±6B±&99±U]³2><$9°.± ,99±Y@  *,.6ABIN$9°:° 9±>±L9901%26=47632!".547673 7654'#"'&5476323&#"#"'&547%2654'&#"ð8F Q8;<>YCsh=9#= HKsœ`|;wÂX@F Q8;<ÿ(99('9:>YCsh=9#= HKs›^(pA10`B;wÂX@54'#"&5463&#"#"&547%2654'&#"2654&#"2654'#"&'ð8<’mSƒ"jw{1AkJIkqå­_3<3ZF Rr<ñ"#!!/D8*(9 C>YCseyF8 ’t¡^Z;JjkI%";wÂ_sJ4rvWbB E~VŽ11e–jPl’6^LVp¢wÒTMq OIvCw]E38þþ$S4%.ª`„wYSwD_Fm\jšqÆN6@“S|QRZ\~ÌH4N8L*ý^U.c6'>‰F5=V@7uB[D_bF]w')B:tC&`3T&9Yý¶ñ/(4`is—²Z+°;3´N+°D/´a+°U/´j+°52°j´f++°/°3´"7+°.2°)/´ 7+°/´7+°2°t/°Ö´1+°±W+´q+°q±%+±é°± +´,1+³R, +´m+°m/´R+°,±K+´_+°_°h Ö´G+°G/´h+°_±1+°c2´<+°8 Ö´=+°1´A+±u+±W³"$9±%q°U9°±jo99°m±PT99° ±NZ99±K,°9°G°9±h_°I9°8@  ).35:;?Dae$9±fa±GA99±jU±?I99°N¶8=KRW^o$9°Z°:9±)"¶ &$9° °9±°9012#"&54632&#"#"&547326=46"32654'&2654'7#"&547&=4#""&54632264&"%2654'³®}]Tf|T!?kGaq_k…¢*|[HC5à6Pp9I8$1Z$s=>I42K+Mq OIvCw]E38`,-<**þ¼$S4%.ª`„wYSwD_Fm\jšqÆN6@“S|QRZ\~ÌH4N8L*ý^U.c6'>‰i3#J3JK29&%c7uB[D_bF]w')B:tÖ+<,,<+ÖC&`3T&9Yý›ñ/(4_gw®²Z+°;3´N+°D/´h+°p/´f+°U/´x+°52°x´b++°/°3´"7+°.2°)/´ 7+°/´7+°2°‚/°Ö´1+°±W+´+°±%+±é°± +´,1+³R, +´{+°{/´R+°,±K+´^+°u2°^´G+°G/°^±`+´m+°m±1+°k2´<+°8 Ö´=+°1´A+±ƒ+±W³"$9±%°U9°±x}99°{±PT99° ±NZ99±K,°9°G°9±`^@ ).5;DI:dhps$9°m±3?99±bfµGAkmsu$9±xU±?I99°N¶8=KRW]}$9°Z°:9±)"¶ &$9° °9±°9012#"&54632&#"#"&547326=46"32654'&2654'7#"&547&=4#""&546324#"322654'#"&'%2654'³®}]Tf|T!?kGaq_k…¢*|[HC5à6Pp9I8$1Z$sBER89S‰n1)P8QP9J()[7uB[D_bF\xS?:tp,,-V3$!/,$3óC&`3T&9Yþˆñ/(4`kC²8+´J+°R/°@3´^+°a2°g/´G+°/°3´"7+°.2°)/´ 7+°/´7+°2°l/°Ö´1+°±V+´[+°[±%+±é°±`+´N+° Ö´,1+°N±D+´j+°j±1+´<+°c Ö´<+±m+±V³"$9±%³RXY^$9±D,°9°j²8J999°c@  ).@aeH$9°1°39±g^¶^?.2/)98O#=*I;)'94M‡;1/[5Nddf!+XYþñ/(4xƒ„²A+´j+°R/´O+°K/´W+°q/°b3´8+°~2°/°3´"7+°.2°)/´ 7+°/´7+°2°„/°Ö´1+°±t+´5+°U Ö´M+²MU +³@MP +°5±%+±é°±:+´n+³ n:+´,1+°n±d+´|+°|±€+´_+°_±1+´<+°[ Ö´G+±…+±t³"$9±%µ8KWqvw$9±|,²A999°€@ ).JXbjh$9°_±C99°[°39±OR°T9±WK°U9±j8@ 5=CG[]_dnty$9°A°w9°°v9±)"¶ &$9° °9±°9012#"&54632&#"#"&547326=46"32654'&32=&547632#!"3!!"&463!2654'#"54767&#"#"&547"3254'&³®}]Tf|T!?kGaq_k…¢*|[HC5à6Pp9Iþ"0%=609n7%&_Oþ±44öþ.>?-K7D->5a/'BF4ANh!L‹$3-8.ª`„wYSwD_Fm\jšqÆN6@“S|QRZ\~ÌH4N8L*þ'9R ;$C/1:LS%!4,R2<559Ja1*( ."C08QCs1.(%1$.J"Yþñ/(4‡‘·²A+´x+°X/´U+°Q/´^+°€/°q3´8+°2³e8€+´f+°/°3´"7+°.2°)/´ 7+°/´7+°2°’/°Ö´1+°±ƒ+°[2´5+´S+²Sƒ +³@SV +°5±%+±é°±:+´}+³ }:+´,1+°}±s+´‹+°‹±+´n+°n±1+´<+³b1+°i3´M+°G2²bM +³@be +±“+±ƒ³"$9±%µ8Q^€…†$9±‹,±99°· ).Aqxv$9°n²Cl999°1²3P_999±Mb°I9±QU°[9±8€±Kb99°f³Is}‹$9°x@ :5=GClnv|ƒˆ$9°A°†9°°…9±)"¶ &$9° °9±°9012#"&54632&#"#"&547326=46"32654'&32=&547632#"3!!"&5463!2654+53254&'#"5467&#"#"&547"3254'³®}]Tf|T!?kGaq_k…¢*|[HC5à6Pp9Iþ&0&870<^&3)4:$þY55ýýû.@@. (K6bD2&!H6ANh"MŠ'60:.ª`„wYSwD_Fm\jšqÆN6@“S|QRZ\~ÌH4N8L*þ(6P <"B,4 8#6% 5-(*2#17Pf6O $C29UBs1.)*-%,IYýçñ/(4t‡œ²?+´f+°I/´†+°‚/´N+°m/´8+°8°u Ö´^+°/°3´"7+°.2°)/´ 7+°/´7+°2°ˆ/°Ö´1+°±p+´5+°5±%+±é°°j Ö´:+°:/´j+°± +´,1+°~2³„, +´L+°L/´„+°,´a+°a/°,±x+´[+°[±1+°V2´<+´E+±‰+±p°9°5°9°%µ"8mrs$9±,„²?f‚999°x@ .IN^duz€†$9°[´ A)RY$9°1±399±‚†±LR99±fu@ :;AEV5[aYjpz$9°?°s9°°r9±)"¶ &$9° °9±°9012#"&54632&#"#"&547326=46"32654'&32=47632#"&543267654&'#"&5467&#"#"&5472654'#"4#"32³®}]Tf|T!?kGaq_k…¢*|[HC5à6Pp9IýÌ9.I75Ek5H()UWv4Q}#'. ..D4.>C7".LO:I[h Hš )9JI0J/.ª`„wYSwD_Fm\jšqÆN6@“S|QRZ\~ÌH4N8L*ýä5Q[OB,'R 24JvKL+'A353(C  >bE/B[;*U9LlP4-,Ú:)+=*=¤YþRñ/(4py„²8+´\+°@/´K+°c/´n+°s2°n´T+°/°3´"7+°.2°)/´ 7+°/´7+°2°z/°Ö´1+°±C+´H+°H±f+´k+°k±%+±é°±p+´`+³ `p+´,1+°`±W+´q+°q±u+´Q+°Q±1+°M2´<+´=+±{+±C°9°H±99°f±"E99°k°F9±%³chin$9±W`±@K99±q,²8999°u¶ ).T\Z$9°Q²:O999°1°39±\n@ :=5HMCQWO`fkw$9°8±Fi99°±Eh99±)"¶ &$9° °9±°9012#"&54632&#"#"&547326=46"32654'&4632#"&5473 54'#"&5467&#"#"&5473253254'"³®}]Tf|T!?kGaq_k…¢*|[HC5à6Pp9IþÂS>b:M¬ª£ÅE%7«3@1*9?-!&7A2ZCq6,*K*@J4Q+Yý¢ñ/(4{„Ò²8+´g+°D/´…+°K/´V+°n/´y+°~2°y´_+°/°3´"7+°.2°)/´ 7+°/´7+°2°/°Ö´1+°±N+´S+°S±q+´v+°v±%+±é°±{+´k+³ k{+´,1+°k±b+´|+°|±G+´+°±€+´\+°\±1+°X2´<+´=+°ˆ Ö´A+±‘+±N°9°S°9°q³"PQ$9±%³nsty$9±bk±KV99±|,²8999°G°g9°´I_e~$9°€³). ‚$9°\µ:DZ…Š$9°1±3?99±K…³GAˆ$9°V±IŠ99°n°?9±gy@ :=5SXN\bZkqv‚$9°8±Qt99°±Ps99±)"¶ &$9° °9±°9012#"&54632&#"#"&547326=46"32654'&4632#"&547#"&5473 54'#"&5467&#"#"&5473253254'"264&#"³®}]Tf|T!?kGaq_k…¢*|[HC5à6Pp9IþÃS=b9LBQI42K2G¡ÆD"6¬6?1)9A-"'7B0;F]D-"91:$?—+++*.ª`„wYSwD_Fm\jšqÆN6@“S|QRZ\~ÌH4N8L*þ9DE L9]5W3JK2ˆˆVJ"=?wn¦24N8)2O .%F0?ZBo5))L(DL6S.þ€*>+,*Yý…ñ/(4}†Œœæ²8+´i+°F/´+°•/´Œ+°M/´W+°p/´{+°€2°{´`+°/°3´"7+°.2°)/´ 7+°/´7+°2°/°Ö´1+°±P+´U+°U±s+´x+°x±%+±é°±}+´m+³ m}+´,1+°m±c+´~+³I~c+´š+°~±‚+´]+°]±ˆ+´’+°’±Y+±122´?+°C2´<+±ž+±P°9°U²"999°s±RS99±%³puv{$9±cm±MW99±I,°9°~±899°š±Ki99°‚@ ).`€g„—$9°]·:F[‰Œ•$9±’ˆ±3A99±MŒµIC’˜š$9°W°‰9°p°A9±i{@ :5UYP]c[msx„$9°8±Sv99°±Ru99±)"¶ &$9° °9±°9012#"&54632&#"#"&547326=46"32654'&4632#"&547#"&547! 54'#"&54767&#"#"&5473253254'"4#"32654'#"&'³®}]Tf|T!?kGaq_k…¢*|[HC5à6Pp9IþÃS=b9LLOQ9:Q'/¡ÆD"176?1)91"'7B0;F]D-"91:$?¨+--$4*!, 4.ª`„wYSwD_Fm\jšqÆN6@“S|QRZ\~ÌH4N8L*þ9DE L9`5%Y9QP:)ˆˆVJ"7Gà£24N8).*( .%F0?ZBo5))L(DL6S.þ¸XXV3$".,$3YþùK./6@KO²!+² F333´+++°02´+°/´A++°5/°-3´C+°=2²5 +³@ +°/´&7+°7/´7+°L/°#Ö´+°±+´)+²) +³@ +³)+´:+°)±,+°=2±6é°2°6°I Ö´+°/´I+°6±0+´ +° 2° ´D+°D/° ´+°/±M+±³ !%&$9°°+9±,:°9±6°9±0I²AF999± ° 9±!A± 99±+° 9°5³#)$9±±199±7&±:9901463263##"&547!5654&"&546235.5#"54&264&#"[?š¶(4"#`CB_#þILVvUI$j€®A@ üaü;@8¡+Z=/ó)77)'88‘?^¤}ýÞ.7C`aB7.#'_8OL8T":9wVt;:UD&h÷ç# #¥6"6E‹/ýT7R78('9YþÔJ-.4=IYc²+² !D333´*++°/2²+´+°/´J++°R/´>+°,/°33±;é°2²;, +³@; +°/´&++°6/´7+°Z/°#Ö´+°±+´(+²( +³@ +³(+´8+°(±++±;22±4é°2´W+°4±A+´O+°O±/+´ +° 2° ´M+°M/° ´+°/±[+±³ !%&$9°°*9±+8±599°W°9°4°T9°A³GJR$9± ° 9±>µ MOUW$9±*° 9°,³#($9±;±099±6&±89901463263##"&547!5654&"&546235.5#"542654&#"2654'#"&'\>š¶(4,,kJIk-þeLWtVI$j€® üaü‚2ƒ<,Z=°""!!/D9*(9 C?^¤}ýß4CIllID3#'_8OL8T":9wTuuTE&‚høè"D‚¦7"6E‹ýÐ" !pC/+<9'.DYÿW06;COD²+°&3´0++°72²+´+° /´D++°J/´++°2/°:3±Aé°2²A2 +³@A +°!/´+++°73#".54>3265!5654&"&5463235&546"542654&#"“M;>uI 6‹q1_F6J'DeýhLWtVIo€WV€åÇS²W™„!&}„";R) ;P/X[mY?ýÚr:'-)$,G/"X8OL8Q%:8xTuuTH#ƒ±/±1D33´m+±6o22°t/±:i33´J+±*c22°/´$++°O2´+°S/°3´ ++°[2² S +³@ +°/´++°U/´++°x/°Ö´+°±+´"+²" +³@ +³"+´X+°"±G+´v+°v±%+°[2±Té°2³kT%+´s+°s/°K3´k+°b2°T±h+°d2´<+°)2°<±O+´ +° ´ +° /° °/ Ö´8+°8/´/+±y+±²999°°$9±sv³DUo$9°%°A9±hT³&>_m$9±O<²136999±m>±3A99°t²/4G999±&°9±$°9°S³"$9± ± P99±U±X9901%.5463263!5654&'"&546323232#"'53254+#"&'#"&546;54675#"54&"354&5#32'265'#"ä_\>šµ)4ý)LW::VI$j€WV‚ ü[9K2&%l 9F†":/19F4Mý‚2¡+[<0†&‰((‰DEñFÏ eU>[ zýë%$]7KH7T<6ySpqRD#RN96z< ?3¤!B53?;LRß!A}˜5!4D‰.ýÙ. ,”l?4<YþˆT.%+5enu~ÿ°W/±?S33´v+°t2´D+°I/´J+°{/±Op33´\+±6j22°f/´a+°/´$++°&2´+°*/°3´ ++°22² * +³@ +°/´++°,/´++°/°Ö´+°±+´"+²" +³@ +³"+´/+°"±Z+´}+°}±%+°22±+é°2³r+%+´z+°z/°]3´r+°i2°+±o+°k2´Q+°d2°Q±&+´ +° ´ +° /°M3´9+°<2² 9 +³@ I +° °= Ö´F+°F/´=+±€+±²999°°$9±z}³,Wv$9°%°U9±o+³Saft$9°Q°A9°&²?BD999± F°;9±DW²=AU999±Iv²FBY999°J²<;}999°{±9Z99±a°9±$°9°*³"$9± ± '99±,±/9901%.5463263!5654&'"&546323!5#"54&2#"'73254+53254+#"'#"&46;54632'"354&5#32#265'#"ä_\>šµ)4ý)LW::VI$j€WV‚ ü‚2¡+[<0C%83#( ));ƒJ:.9D4 L=7H† (‘))‘JG÷KÏ eU>[ zýë%$]7KH7T<6ySpqRD#ß!A}˜5!4D‰.ý„%& @'.% ¤..Bf> 9±v]²@Q_999°U°>9°ƒµFKšµ)4ý)LW::VI$j€WV‚ ü‚2¡+[<0‡:N~'&_{Cþtm"_­¬U)'>†>'8+8G2Iƒ( #(““,H“–2JÏ eU>[ zýë%$]7KH7T<6ySpqRD#ß!A}˜5!4D‰.þWT‰".3&B:8y=%19YýçY.%+5]flvݰG/´y+°~/´N+°6/°X3´u+°k2°q/±Vg33´;+±Ab22°^/´=+°/´$++°&2´+°*/°3´ ++°22² * +³@ +°/´++°,/´++°€/°Ö´+°±+´"+²" +³@ +³"+´/+°"±9+´s+°s±%+°22±+é°2³i+%+´m+°m/±;K33´i+±aw22°+±g+°c2´V+°A2°V±&+´ +° ´ +° /° °C Ö´T+°T/´C+±+±²999°°$9±ms²,6999°%°[9±+i´NX^k~$9°g²=Gy999°V±P{99±~y³Kw{P$9±u6±S[99°q²CT9999±=°9±$°9°*³"$9± ± '99±,±/9901%.5463263!5654&'"&546323!5#"54&"&547632#"'&546326764&'#"&'"354&#32'4&5#"323254&#"ä_\>šµ)4ý)LW::VI$j€WV‚ ü‚2¡+[<0019–†@#œUOl2-9M,y-7(ƒ!;/”'‰))‰DCÅG/+A]01&6Ï eU>[ zýë%$]7KH7T<6ySpqRD#ß!A}˜5!4D‰.ü™D4q“,)> ‹lG@'!5/3L-­ "?0.’i045:Yþƒj.%+5`lt{…ó²]+°63´m+°A2°U/±JP33´„+±ky22°€/±cu33´Z+±Cq22°/´$++°&2´+°*/°3´ ++°22² * +³@ +°/´++°,/´++°†/°Ö´+°±+´"+²" +³@ +³‚"+´X+°X/´‚+°"±|+±Z22´w+°p2°w°/ Ö´+°/´/+°w±%+°22±+é²di222°+´{+°{/°r3°+±a+´F+°F±&+´ +° ´ +° /³> &+´9+±‡+±X²999±‚²$U„999±/|°S9±%wµ,P]my$9±+{±M_99°a±CJ99°F±6A99°&°<9° °;9±„U±999°m°_9±]°9±$°9°*³"$9± ± '99±,±/9901%.5463263!5654&'"&546323!5#"54&2'654&#"32#"&5#"&'#"&547>3264+2'"354#3254&5#"32ä_\>šµ)4ý)LW::VI$j€WV‚ ü‚2¡+[<0ïZmd%JH;S‚"749%$<@1;˜G>_(KI`ë*‘‘IHÐG0+Ï eU>[ zýë%$]7KH7T<6ySpqRD#ß!A}˜5!4D‰.þkY}<#-i^g333´Œ+±C—22´~+°“/±zˆ33´l+±V„22°J Ö´K+°/´$++°&2´+°*/°3´ ++°22² * +³@ +°/´++°,/´++°™/°Ö´+°±j+´•+°•±+±l22´Š+°ƒ2³"Š+´+°/´"+²" +³@ +°´/+°Š±%+°22±+é°2°Ž Ö°…3´|+±Vz22°+±w+´[+°[±&+´ +° ´ +° /³F &+°O3´;+°62²F; +³@FJ +±š+±j²999±²$g—999±Š"°e9±Ž/µ,co€Œ$9±|%±aq99±w+²Y^~999°[±Rs99°&²>@C999± F°99±Œc±@e99±J~@ ;FA[ajw•$9±K“°99±€l²O6q999±o°9±$°9°*³"$9± ± '99±,±/9901%.5463263!5654&'"&546323!5#"54&#"'532654&+532654&#"3232#"&'#"'#"&547>326324&#32'"354#3254&5#"32ä_\>šµ)4ý)LW::VI$j€WV‚ ü‚2¡+[<0¶1?.' "")O05)0}@61NO?2:—H=\ ,z@:Fõ.32/ë)‘‘IHÐG0+Ï eU>[ zýë%$]7KH7T<6ySpqRD#ß!A}˜5!4D‰.ý™, D,5 ;!2!)q6A(A88C4o?PDD#Â!cþ.Mll924<YýýZ.%+5{‚ˆŽ˜;²>+±BS33´…+°h2°L/´X+°6/±tx33´—+±22°“/±~‰33´;+±l‡22³a;“+´`+°/´$++°&2´+°*/°3´ ++°22² * +³@ +°/´++°,/´++°™/°Ö´+°±Q+´V+°V±+´"+²" +³@ +³•"+´9+°9/´•+°"±+°;2´‹+±/‡22°‹´+°/°‹±%+²2ƒ‰222±+é°2´€+°l2°+±|+´q+°q±&+´ +° ´ +° /° °J Ö´\+°\/°e3´J+°F2±š+±Q±99°V°9°9±ST99±•²$6—999±‹°z9°%´,>Xx$9°€²@Lv999±|+±ot99°q±Bh99°&±`a99± \°H9±—6°J9°`¶\9vz|•$9°“°H9±;a±QV99°…²@Fe999°>°T9°°9±$°9°*³"$9± ± '99±,±/9901%.5463263!5654&'"&546323!5#"54&"&547>32632!".547!27654&+532654&#"3232#"'#"'%4+2'4#"3#32'4&5#"32ä_\>šµ)4ý)LW::VI$j€WV‚ ü‚2¡+[<0Ç-5Ž@:S!0sA2:55þ†jŸz?E(:ŠrR„"G0,)4u;2<FESK`™ED‹‹FEÂF0+Ï eU>[ zýë%$]7KH7T<6ySpqRD#ß!A}˜5!4D‰.üŸD2n?QGH%?FJÀ!J\cW LNþí%W*50$&/o5AII==v7nµPV: o657? Yýée.%+5emswˆ:²>+°A3´n+°T2°G/´~+°z/´L+°6/°b3´‡+°v2°\ Ö´f+°ƒ/±kt33´;+±Vq22°/´$++°&2´+°*/°3´ ++°22² * +³@ +°/´++°,/´++°‰/°Ö´+°±+´"+²" +³@ +³…"+´9+°9/´…+°"±€+°;2´u+°q2°u°/ Ö´+°/´/+°u±%+°22±+é²Vl222³|+%+´J+°J/´|+°+´t+°t/°r3°+±i+´Y+°Y±&+´ +° ´ +° /° °D Ö´R+°R/´D+±Š+±9³$9±…²$6‡999±/€°d9±Ju´>,bn$9±+|³@L_z$9°iµAG\fx~$9°Y±OT99°&°B9±z~±JO99±‡\°d9±ƒf¶DRY9_€…$9±n;°@9±>°9±$°9°*³"$9± ± '99±,±/9901%.5463263!5654&#"&546323!5#"54&"&547>3262#"&5432>54#"32#"&'#"'%2654+'"3424#"32%4'#"32ä_\>šµ)4ý)LX9:VI$j€WV‚ ü‚2¡+[<0¿39—G>]%¸fŸv7bz/^':€^‚E20 :!R (IŒ '’’’—W9W9þ™G0,Ï eU>[ zýë%$]8LH7T<6ySpqRD#ß!A}˜5!4D‰.ü™C5r@RFF{cº)%@ŠB™Sm1C%+99E 0hú1#T‘s” Û!5=YþP`.$*4^bgpв\+´a+²A+°;/´F+°N/°R3´f+°l2°i/±Kc33´X+±5_22°/´#++°%2´+°)/°3´ ++°12² ) +³@ +°/´++°+/´++°q/°Ö´+°±+´!+²! +³@ +°!±>+´C+°.2°C´+°/°C±U+´k+°k±$+°12±*é²bd222°*´o+°o/±Yh33°*±c+°_2´K+°52°K±%+´ +° ´ +° /° °8 Ö´I+°I/´8+±r+±²999°°#9±UC°@9°k²+A999°$±Rl99±*o°P9°c³;FN\$9±fN°P9°i´>CI8U$9±\±@99±#°9°)³!$9± ± &99±+±.9901%.5463263!5654&"&546323!5#"54&#"&54732654##"'#"&546;>32&"#32'#"32654ä_\>šµ)4ý)LWtVI$j€WV‚ ü‚2¡+[<0/8Ežk¿F*?¢iSD<62!)'3>+A10C=jnn64§ 9$Ï eU>[ zýë%$]8LH7T<6ySpqRD#ß!A}˜5!4D‰.ýŸ?5ZjŒp^ZIRYrKA?>R%&=)*:2GF3@@9ZZXYý›^.%+5jns|‡,²i+°L3´m+²M+°@/´}+°G/´R+°[/°_3´r+°t2°z/±Vo33´e+±6k22°/´$++°&2´+°*/°3´ ++°22² * +³@ +°/´++°,/´++°ˆ/°Ö´+°±+´"+²" +³@ +°"±J+´O+°/2°O´+°/°O±b+´|+°|±%+°22±+é²np222°+´w+°w/±fy33°+±C+´…+°…±o+°k2´X+°62°X±&+´ +° ´ +° /° °= Ö´€+°€/°T3´=+°92±‰+±²999°°$9±bO°L9°|²,M999°%±_t99±+w°]9°C²GRh999°…²E[r999°o°i9°X²@}‚999°&°V9° °;9±G}³C=€…$9°R°‚9°[°;9°r±T]99°z³JO9b$9±i°9±$°9°*³"$9± ± '99±,±/9901%.5463263!5654&#"&546323!5#"54&#"&547#"&5473264#"##"'#"&546;4624"#32'2654'#"264&#"ä_\>šµ)4ý)LX9:VI$j€WV‚ ü‚2¡+[<0-8EMLI43J}±E'>•gWŽD:62!(&2=*B`A:npp87É :',,*+Ï eU>[ zýë%$]8LH7T<6ySpqRD#ß!A}˜5!4D‰.ý=5T4!S3JJ3 ‰q^WGT[rM‚>R%'=():2GF3CC6]\þÚ,<+*, Yý…^.%+5kotzƒ“B²j+°L3´n+²M+°@/´„+°Œ/´z+°G/´S+°\/°`3´s+°{2°/±Yp33´f+±6l22°/´$++°&2´+°*/°3´ ++°22² * +³@ +°/´++°,/´++°”/°Ö´+°±+´"+²" +³@ +°"±J+´O+°/2°O´+°/°O±c+´ƒ+°ƒ±%+°22±+é²oq222°+´~+°~/±g€33°+±C+´‘+°‘±p+°l2´Y+°62°Y±‡+°W2´=+°92°=° Ö´&+°&/´ +°v Ö´‰+° ´ +° /±•+±²999°°$9±cO°L9°ƒ²,M999°%±`{99±+~°^9°C±Si99°‘³EG\s$9°p±jŽ99°Y´@wz„Œ$9± &°;9±GzµC=‡‰‘$9°S°w9°\°;9°s°^9°´JOW9c$9±j°9±$°9°*³"$9± ± '99±,±/9901%.5463263!5654&'"&546323!5#"54&#"&547#"&547327654##"'#"&546;4624"#324#"3'2654'#"2654'#"&'ä_\>šµ)4ý)LW::VI$j€WV‚ ü‚2¡+[<0-8ETOR9:Q }±E':OEdMDTG:62!(&2=*B`A:npp87R,--ï :%2 , , 5Ï eU>[ zýë%$]7KH7T<6ySpqRD#ß!A}˜5!4D‰.ý<5X6"U9QP:&‰q^WDWa93(GA?Q%'=():2GF3CC6]åXXæ \þÄ2%!/,$3YþˆJ.%+5Td²9+´>+°H/´M+°R/´B+°/´$++°&2´+°*/°3´ ++°22² * +³@ +°/´++°,/´++°U/°Ö´+°±+´"+²" +³@ +³"+´/+°"±%+²26J222±+é°2´@+°+±&+´ +°O Ö´E+°;2° ´ +° /±V+±²999°°$9±%/°9°@°K9±O+¶9>BCHMR$9± &°<9±RM²JEK999±>B²;6<999±9°9±$°9°*³"$9± ± '99±,±/9901%.5463263!5654&'"&546323!5#"54&4632&#";2#"'73254+"&ä_\>šµ)4ý)LW::VI$j€WV‚ ü‚2¡+[<00[Eo>)/U]DC€XFo@+-W]E>;KÏ eU>[ zýë%$]7KH7T<6ySpqRD#ß!A}˜5!4D‰.ý¢9;A.27*g:9A-16(6Yý¼J.%+5]gŸ²9+´>+°L/´^+°c/´V++°[/´B+°/´$++°&2´+°*/°3´ ++°22² * +³@ +°/´++°,/´++°h/°Ö´+°±+´"+²" +³@ +³"+´/+°"±%+²26S222±+é°2´@+³O+%+´e+°+±a+´I+±;E22°I´X+°X/³ Ia+´ +±i+±²999°°$9±%/°9°@°T9±e+°Q9°X@ >B9LVC[^b$9°a°G9° ²&'<999±c^±OI99°V±QG99°[²SET999±>B²;6<999±9°9±$°9°*³"$9± ± '99±,±/9901%.5463263!5654&'"&546323!5#"54&4632&#";2#"&547&'73254+"&264&"ä_\>šµ)4ý)LW::VI$j€WV‚ ü‚2¡+[<00[Eo>)/U]DC€54J32K@0+-W]E>;KÌ,,<+*Ï eU>[ zýë%$]7KH7T<6ySpqRD#ß!A}˜5!4D‰.ý¢9;A.27*g>$A3JK21" 1-16(6þ—+<,,*YýŸJ.%+5]et̲9+´>+°L/´f+°n/´d+°`/´V++°[/´B+°/´$++°&2´+°*/°3´ ++°22² * +³@ +°/´++°,/´++°u/°Ö´+°±+´"+²" +³@ +³"+´/+°"±%+²26S222±+é°2´@+°+°r Ö´O+°O/´r+°+±^+´k+°k±i+´I+±;E22°I´X+°X/³ Ii+´ +±v+±²999°°$9±%/°9°O°T9±r+°Q9°^@ >BCL9Z[Vbfm$9±ik°G9° ²&'<999±`dµOIikpr$9°V±QG99°[²SET999±>B²;6<999±9°9±$°9°*³"$9± ± '99±,±/9901%.5463263!5654&'"&546323!5#"54&4632&#";2#"&547&'73254+"&4#"322654'"&'ä_\>šµ)4ý)LW::VI$j€WV‚ ü‚2¡+[<00[Eo>)/U]DC€=;Ké,--,*%2 ,@+ 5Ï eU>[ zýë%$]7KH7T<6ySpqRD#ß!A}˜5!4D‰.ý¢9;A.27*gA*I7SR8=) --16(6þü++.U2%!/,$3YþˆJ.%+5W_u²9+´>+°J/´^+°Z/´N+°V/´B+°/´$++°&2´+°*/°3´ ++°22² * +³@ +°/´++°,/´++°`/°Ö´+°±+´"+²" +³@ +³"+´/+°"±%+²26L222±+é°2´\+°@2°+± +´ +³F +´R+°R/´F+°;2±a+±²999°°$9±%/°9±R+@ 9>BCJNVXZ^$9° ²&'<999±Z^±LP99°N±FR99±>B²;6<999±9°9±$°9°*³"$9± ± '99±,±/9901%.5463263!5654&'"&546323!5#"54&4632&#"32#"5432654'&#"4#"32ä_\>šµ)4ý)LW::VI$j€WV‚ ü‚2¡+[<01_Bn>(/U]8O6IA3A•vk9G†ÂM1L2Ï eU>[ zýë%$]7KH7T<6ySpqRD#ß!A}˜5!4D‰.ý¦6:A.23?3<J::+ nYþ„J.%+5]l­²9+´>+°J/´k+°g/°`3´N+°R2²gN +³@gc +°[/´B+°/´$++°&2´+°*/°3´ ++°22² * +³@ +°/´++°,/´++°m/°Ö´+°±+´"+²" +³@ +³"+´/+°"±%+²26L222±+é°2´i+´@+°+±d+´c+°c±&+´ +°T Ö´F+°;2° ´ +° /±n+±²999°°$9±%/°9±+@°N9°d°g9°c¶>B9J[Pk$9°T³CRZ^$9± &°<9±gk±LT99°N²FPW999±>B²;6<999±9°9±$°9°*³"$9± ± '99±,±/9901%.5463263!5654&'"&546323!5#"54&4632&#";2#"54326325654&+"&&#"#5&#"32ä_\>šµ)4ý)LW::VI$j€WV‚ ü‚2¡+[<01\Em?'-XbGE4KE3@“Q0&-2@:Lð /'#TAÏ eU>[ zýë%$]7KH7T<6ySpqRD#ß!A}˜5!4D‰.ý¤78@*17+:/=O@34” #Yþ†J.%+5_²9+°P3´>+°J/´W+°]/´B+°/´$++°&2´+°*/°3´ ++°22² * +³@ +°/´++°,/´++°`/°Ö´+°±+´"+²" +³@ +³"+´/+°"±N+´S+°S±%+°22±+é°2³@+%+´6+°6/´@+°+± +´ +° °F Ö´Z+°Z/´F+°;2±a+±²999°°$9±SN±,99°%±PQ99±Z+¶9>BCJW]$9° ²&'<999±]W°F9°B±NS99°>²;6<999°9°Q9°°9±$°9°*³"$9± ± '99±,±/9901%.5463263!5654&'"&546323!5#"54&4632&#";2#"'&54732654+"&ä_\>šµ)4ý)LW::VI$j€WV‚ ü‚2¡+[<0:^Dp@*/V`FC6P?1BoL];-1Ed:%GG@[ zýë%$]7KH7T<6ySpqRD#ß!A}˜5!4D‰.ý¢8!,4hlG":X/B!(6Yý½J.%+5gs˲9+°X3´>+°M/´h+°n/´_+°e/´B+°/´$++°&2´+°*/°3´ ++°22² * +³@ +°/´++°,/´++°t/°Ö´+°±+´"+²" +³@ +³"+´/+°"±V+´[+°[±%+°22±+é°2³@+%+´6+°6/´@+°+±Q+´q+°q±&+°b2´ +´F+°;2³k &+´J+° ´ +° /±u+±²999°°$9±[V±,99°%±XY99±qQ±Se99°&·9B>M_Chn$9°k°H9° °<9±nh±QJ99°_±SH99°e°F9°B±V[99°>²;6<999°9°Y9°°9±$°9°*³"$9± ± '99±,±/9901%.5463263!5654&'"&546323!5#"54&4632&#";2#"'&547.54732654+"&2654&#"ä_\>šµ)4ý)LW::VI$j€WV‚ ü‚2¡+[<0:^Dp@*/V`FC6P:5I43%$f;-1Ed:%GG@[ zýë%$]7KH7T<6ySpqRD#ß!A}˜5!4D‰.ý¢8+°M/´o+°w/´m+°i/´^++°d/´B+°/´$++°&2´+°*/°3´ ++°22² * +³@ +°/´++°,/´++°/°Ö´+°±+´"+²" +³@ +³"+´/+°"±U+´Z+°Z±%+°22±+é°2³@+%+´6+°6/´@+³P+%+´|+°+±g+´t+°H2°t±r+´J+±;F22°J´a+°a/°r° Ö´ +±€+±²999°°$9±ZU±,99°%±WX99±|+°R9°g@ 9BCM^cd>kow$9±rt±'&99° °<9±imµPJrtz|$9°^±RH99°d°F9°B±UZ99°>²;6<999°9°X9°°9±$°9°*³"$9± ± '99±,±/9901%.5463263!5654&'"&546323!5#"54&4632&#";2#"&547.54732654+"&4#"322654'#"&'ä_\>šµ)4ý)LW::VI$j€WV‚ ü‚2¡+[<0:^Dp@*/V`FC6PGAR89S,ay;-1Ed:%GG@[ zýë%$]7KH7T<6ySpqRD#ß!A}˜5!4D‰.ý¢8šµ)4ý)LW::VI$j€WV‚ ü‚2¡+[<0T9:ž:99:OP:8õfJJfIÏ eU>[ zýë%$]7KH7T<6ySpqRD#ß!A}˜5!4D‰.ý[Q8888QO8887ÌIfHHfYýÇJ.%+5KWcš²9+´R+°C/´X+°^/´L+°/´$++°&2´+°*/°3´ ++°22² * +³@ +°/´++°,/´++°d/°Ö´+°±+´"+²" +³@ +³"+´/+°"±%+°22±+é°2³U+%+´6+°6/´U+°+±G+´a+°a±&+´ +°O Ö´<+°<°@ Ö´[+°[/´@+° ´ +° /±e+±²999°°$9±6/±,99±+U°89±aG²ILR999°O´9C>X^$9±^X²GI@999°L°>9°R±<699±9°9±$°9°*³"$9± ± '99±,±/9901%.5463263!5654&'"&546323!5#"54&462#"'&547.2654&#"2654&#"ä_\>šµ)4ý)LW::VI$j€WV‚ ü‚2¡+[<0pœ97>JJ32&$C_¾5KK54LL++++Ï eU>[ zýë%$]7KH7T<6ySpqRD#ß!A}˜5!4D‰.ý[Mn76NV8T3J&$3( i7J54JK34KÊ*,-+Yý¬J.%+5ITZj¤²9+´P+°B/´[+°c/´Z+°W/´J+°/´$++°&2´+°*/°3´ ++°22² * +³@ +°/´++°,/´++°k/°Ö´+°±+´"+²" +³@ +³"+´/+°"±%+°22±+é°2³S+%+´6+°6/´S+³E+%+´h+°+±&+´ +°?2°M Ö´;+°V Ö´`+° ´^+°^/° 3±l+±²999°°$9±6/±,99±ES°89±h+°G9°V¶9JPBW[c$9°M°=9±WZ¶E?G^`fh$9°J°=9°P±;699±9°9±$°9°*³"$9± ± '99±,±/9901%.5463263!5654&'"&546323!5#"54&462#"&547.2654&#"4#"32654'#"&'ä_\>šµ)4ý)LW::VI$j€WV‚ ü‚2¡+[<0pœp@YQ9:QA\¾5KK54LL«+--$4*! + 3Ï eU>[ zýë%$]7KH7T<6ySpqRD#ß!A}˜5!4D‰.ý[MnmNU9#^9QP:/& g9J54JJhK‘XXV3$"-+$3Yþ„`.%+5hoæ°9/´n+°k/´f+°a/±SZ33´?+±CG22²a? +³@a^ +°V2°/´$++°&2´+°*/°3´ ++°22² * +³@ +°/´++°,/´++°p/°Ö´+°±;+´m+°m±+´"+²" +³@ +°"°6 Ö´i+°i/´6+°"±^+´]+³/]^+´+°/´/+°]±%+°22±+é°2³W+%+´V+°+±&+´ +° ´ +° /° °K Ö´P+°P/´K+±q+±;±99°m±d99°³9fkn$9±i²$?a999±]/°A9°%³,CZ$9±V+°E9°&³GMNS$9±n9°N9°k±;699°f²KPd999±?a±AE99°°9±$°9°*³"$9± ± '99±,±/9901%.5463263!5654&'"&546323!5#"54&#"547632632632'654&#"#54#"#54#"6324#"32ä_\>šµ)4ý)LW::VI$j€WV‚ ü‚2¡+[<0–A3|65]U" TULO/*s#T91@DPMHd,? &/?B3443Ï eU>[ zýë%$]7KH7T<6ySpqRD#ß!A}˜5!4D‰.ý3D¤X?>;;::85M‡<3+g5EMææNNææM=+A4šµ)4ý)LW::VI$j€WV‚ ü‚2¡+[<0áW{#&F5=I<L[B4"!,Df+@ %0?A3>>65]Q&\R(«-;K ý«15fÏ eU>[ zýë%$]7KH7T<6ySpqRD#ß!A}˜5!4D‰.þtUG25I;BZMæã!0/"ãæM>*A03DZJX?>;:==™2!Ldl+±—+±“z²o999°²qw999°t±l~99±i±$€99±`/³,d‚$9°%°69±„+²9D[999°‰´EGBRY$9°&±;N99±GB°D9°R°E9°‡³_`hi$9°‘@ JP>Vz„t‰“$9°q±No99°lµ;Y6€‹Œ$9±~°9±$°9°*³"$9± ± '99±,±/9901%.5463263!5654&'"&546323!5#"54&>32#"'732654'&'#"'&5467&#"#54&#"#54#"632#"&5476326323254'#"4#"3ä_\>šµ)4ý)LW::VI$j€WV‚ ü‚2¡+[<0"E%EU36Z70$+=M$ q2D.<$0B1"!-Fd-? &0?C2=>56[T(ZO«; 1ýü343Ï eU>[ zýë%$]7KH7T<6ySpqRD#ß!A}˜5!4D‰.ýÙ%V qP]BG!5dD)*'&,(38`-#èä!21"äèO?,B03E]I[>?>>ò3X2(@uv:<Yþ‹J.%+5Or²=+°@/´;+´A+°F/´6+°/´$++°&2´+°*/°3´ ++°22² * +³@ +°/´++°,/´++°P/°Ö´+°±+´"+²" +³@ +³"+´/+°"±M+´H+°H±%+°22±+é°2³C+%+´9+²C9 +³@C@ +°+±<+´?+° 2°?´&+°&/°?´ +° /±Q+±²999°°$9±%Hµ,6FJK$9°C°E9±9+°;9±;A°J9°F³9CHM$9±=°9±$°9°*³"$9± ± '99±,±/9901%.5463263!5654&'"&546323!5#"54&233!5654&"&546ä_\>šµ)4ý)LW::VI$j€WV‚ ü‚2¡+[<0->U¥Bþº12D21QVÏ eU>[ zýë%$]7KH7T<6ySpqRD#ß!A}˜5!4D‰.ý¢L;-þ™$5!-*!02'S8OYýÂJ.%+5[eµ²=+°E/´\+°a/°W3´<++³Kšµ)4ý)LW::VI$j€WV‚ ü‚2¡+[<0->U¥BJ32Kj12"!31QV',,<+*Ï eU>[ zýë%$]7KH7T<6ySpqRD#ß!A}˜5!4D‰.ý¢L;-þ™#.2KK2/"#6!-,02'S8Oþj+<,,*Yý¬N.%+5[apײ=+°E/´b+°j/´a+°^/±?J33´<+´L+°Q/´6+°/´$++°&2´+°*/°3´ ++°22² * +³@ +°/´++°,/´++°q/°Ö´+°±+´"+²" +³@ +³"+´/+°"±Y+´T+°T±%+°22±+é°2³N+%+´9+°+±H +´n+²Hn +³@HK +°n±<+´?+± B22³g?<+´]+°]/´g+°?´&+°&/°?´e+°e/° 3±r+±²999°°$9±%Tµ,6QVW$9±n+±;J99±]9´E^bil$9±?e°@9±^a¶HBWegln$9±šµ)4ý)LW::VI$j€WV‚ ü‚2¡+[<0->U¥B R8:R"V12"!31QVH+..$4+@, 5Ï eU>[ zýë%$]7KH7T<6ySpqRD#ß!A}˜5!4D‰.ý¢L;-þ™(28RQ92($5!-+ 02'S8Oþ©XXV3$!.+$3YýæJ.%+5aj»²=+°B/´e+°i/´I+°N/´;+´O+°V/´6+°/´$++°&2´+°*/°3´ ++°22² * +³@ +°/´++°,/´++°k/°Ö´+°±+´"+²" +³@ +³"+´/+°"±^+´Y+°Y±%+°22±+é°2°+°b Ö´E+°E/´b+³Q+%+´9+²Q9 +³@QN +°+±M+°<2´?+° 2°?´&+°&/°?´ +° /±l+±²999°°$9±%Yµ,6V[\$9±9b°;9°&µBIKegi$9±ie±Eb99±NI°\9±;O°[9°V³9QY^$9±=°9±$°9°*³"$9± ± '99±,±/9901%.5463263!5654&'"&546323!5#"54&233#"&54763267#5654&#"#"&54763254#"ä_\>šµ)4ý)LW::VI$j€WV‚ ü‚2¡+[<0-?T ŸB`N5V* (X! ÿ,1# 01#K++¤1%0R4Ï eU>[ zýë%$]7KH7T<6ySpqRD#ß!A}˜5!4D‰.ý L<%5þ‘L]-(" '*'6",,6.!V:''þ¯YþRK.%+5_§²=+°F3°A/´L+°O/´;+´P+°U/´6+°/´$++°&2´+°*/°3´ ++°22² * +³@ +°/´++°,/´++°`/°Ö´+°±+´"+²" +³@ +³"+´/+°"±D+´I+°I±]+´X+°X±% +°22±+é°2°+±R+´9+²R9 +³@RO +°9±N+°<2´?+° 2°?´&+°&/°?´ +° /±a+±²999°°$9±]I²F,999°X°G9°+³6UZ[$9±9R²;AL999±OL°[9±;P°Z9°Uµ9DIRX]$9±=°9±$°9°*³"$9± ± '99±,±/9901%.5463263!5654&'"&546323!5#"54&233#"&547327#5654&#"&546ä_\>šµ)4ý)LW::VI$j€WV‚ ü‚2¡+[<0j3A‰AÏŒ ='6‡pÕ##$(ABÏ eU>[ zýë%$]7KH7T<6ySpqRD#ß!A}˜5!4D‰.ý°>2. þÊx‡‚XJ?QhrD4"!*, L/AYý‰K.%+5irê²=+°P3°F/´j+°K/°n3´V+°Y/´;+´Z+°_/´6+°/´$++°&2´+°*/°3´ ++°22² * +³@ +°/´++°,/´++°s/°Ö´+°±+´"+²" +³@ +³"+´/+°"±N+´S+°S±g+´b+°b±% +°22±+é°2°+±I+´q+°\ Ö´9+²\9 +³@\Y +°q±X+°<2´?+± C22°?´&+°&/°?´m+°m/° 3±t+±²999°°$9±gS²P,999°b°Q9°+³6_de$9±q\²;VK999±&9³Fjno$9±mX°A9±Kj±IC99°V±AL99°Y°e9±;Z°d9°_µ9NS\bg$9±=°9±$°9°*³"$9± ± '99±,±/9901%.5463263!5654&'"&546323!5#"54&233#"&547.547327#5654&#"&546264&"ä_\>šµ)4ý)LW::VI$j€WV‚ ü‚2¡+[<0j3A‰A77I42K…–='6‡pÕ##$(ABà,-<**Ï eU>[ zýë%$]7KH7T<6ySpqRD#ß!A}˜5!4D‰.ý°>2. þÊ=%D3JK2, …XJ?QhrD4"!*, L/Aþ#+<,,<+Yýƒ[.%+5iq²=+²Q+°F/´r+°z/´p+°K/°l3´V+°Y/´;+°_/´6+°/´$++°&2´+°*/°3´ ++°22² * +³@ +°/´++°,/´++°‚/°Ö´+°±+´"+²" +³@ +³"+´/+°"±N+´S+°S±g+´b+°b±% +°22±+é°2°+±I+´+°\ Ö´9+²\9 +³@\Y +°±X+°<2´?+° 2°j Ö´w+°A2°?´ +° /°?°C Ö´u+°u/´C+±ƒ+±²999°°$9±gS²P,999°b°Q9°+³6_de$9±\±VK99°9±;|99°j³Fnrz$9°X±'&99±KpµICuw}$9°V±AL99°Y°e9°;±Zd99°_µ9NS\bg$9±=±P99±$°9°*³"$9± ± '99±,±/9901%.5463263!5654&'"&546323!5#"54&2353#"&547.547327#5654&#"&5464#"322654'#"&'ä_\>šµ)4ý)LW::VI$j€WV‚ ü‚2¡+[<0j2B‰A2BQ9:Q–?%6‰qÕ##$(AC ,--,+%2 +!, 4Ï eU>[ zýë%$]7KH7T<6ySpqRD#ß!A}˜5!4D‰.ýÃ?1.òþÞ<(N9RQ:0&€xZGšµ)4ý)LW::VI$j€WV‚ ü‚2¡+[<0V[EC./ýþ23!#33SW<=Tf '6¾8Ï eU>[ zýë%$]7KH7T<6ySpqRD#ß!A}˜5!4D‰.ývD\./>Õ"6 .*!11'S9NL;ú;(—™)8YýÃJ.%+5ajtà²9+´b+°D/´k+°J/°>3´`+°f2°P/´[+°/´$++°&2´+°*/°3´ ++°22² * +³@ +°/´++°,/´++°u/°Ö´+°±+´"+²" +³@ +³S"+´X+°X/´S+³"+´/+°"±M+´^+²M^ +³@MJ +°^±%+°22±+é°2°+°f Ö´a+°a/´f+°+±G+´r+°r±&+´ +±=A22° ´g+°g/° ´n+°n/° 3±v+±X²999±S²$UV999±/"±P[99±^M²,`999±rG°I9°&´9Dbko$9± n°?9±Jk³AGVo$9°`±KU99°P³MSX^$9±9°9±$°9°*³"$9± ± '99±,±/9901%.5463263!5654&'"&546323!5#"54&4632##"&547!5654&#"&5463237"354&264&"ä_\>šµ)4ý)LW::VI$j€WV‚ ü‚2¡+[<0V[EC./J32KþÛ23!#33SW<=Tf '6¾8,,<++Ï eU>[ zýë%$]7KH7T<6ySpqRD#ß!A}˜5!4D‰.ývD\./>Õ$,3JK2-#$4 .*!11'S9NL;ù;(–˜)8þ5*<-,*Yý§J.%+5ajr‚²9+´b+°D/´s+°{/´q+°J/°>3´`+°f2°`´m++°V2°P/´[+°/´$++°&2´+°*/°3´ ++°22² * +³@ +°/´++°,/´++°ƒ/°Ö´+°±+´"+²" +³@ +³S"+´X+°X/´S+³"+´/+°"±M+´^+²M^ +³@MJ +°^±%+°22±+é°2°+°f Ö´a+°a/´f+³G+%+´€+°+±&+´ +±=A22³x &+´k+°k/´x+° ´g+°g/° ´v+°v/° 3±„+±X²999±S²$UV999±/"±P[99±^M²,`999±€f°I9°kµDb9os{$9± v°?9±mqµGAvx~€$9±`J±KU99°P³MSX^$9±9°9±$°9°*³"$9± ± '99±,±/9901%.5463263!5654&'"&546323!5#"54&4632##"&547!5654&#"&5463237"354&4#"322654'#"&'ä_\>šµ)4ý)LW::VI$j€WV‚ ü‚2¡+[<0V[EC./%%R89S$þð22"#33SW<=Tf '6¾9,--,*$3 , - 4Ï eU>[ zýë%$]7KH7T<6ySpqRD#ß!A}˜5!4D‰.ývE[./>Õ(68SR97'$4 .*!11'S9NL;ù;(–˜(9þš,,-V4$!/,$4YþJ.%+5<DL]²;+´E++°8/´C+°/´$++°&2´+°*/°3´ ++°22² * +³@ +°/´++°,/´++°M/°Ö´+°±+´"+²" +³@ +³"+´/+°"±%+°22±+é°2³I+%+´8+°8/´I+°+±K+´A+°A±&+´ +°D Ö´7+° ´ +° /±N+±²999°°$9±8/±,99±K+²;CE999°A°?9±EC±AI99°;°?9°°9±$°9°*³"$9± ± '99±,±/9901%.5463263!5654&'"&546323!5#"54&!54324'3'"654ä_\>šµ)4ý)LW::VI$j€WV‚ ü‚2¡+[<0wþ“¹´=Mdš+,€Ï eU>[ zýë%$]7KH7T<6ySpqRD#ß!A}˜5!4D‰.ýPª§ÉÆl"&_WùM8mV\@YýÂJ.%+5GOWa¨²?+´P++°6/´X+°]/´O+°/´$++°&2´+°*/°3´ ++°22² * +³@ +°/´++°,/´++°b/°Ö´+°±+´"+²" +³@ +³"+´/+°"±%+°22±+é°2³T+%+´<+°šµ)4ý)LW::VI$j€WV‚ ü‚2¡+[<0ü2K“¹´J Mdš+,€6,,<+*Ï eU>[ zýë%$]7KH7T<6ySpqRD#ß!A}˜5!4D‰.ûØK2/"§Éƪ$-3Jxl"&_WùM8mV\@þ7+<,,*Yý¦J.%+5GOW_oÖ²?+´P++°6/´`+°h/´^+°Z/´O+°/´$++°&2´+°*/°3´ ++°22² * +³@ +°/´++°,/´++°p/°Ö´+°±+´"+²" +³@ +³"+´/+°"±%+°22±+é°2³T+%+´<+°šµ)4ý)LW::VI$j€WV‚ ü‚2¡+[<0ó9S'„¹´ &SMdš,+€W+..+*%2 *!- 5Ï eU>[ zýë%$]7KH7T<6ySpqRD#ß!A}˜5!4D‰.û¼R88(§Éƪ)78R”l"&_WùM8mV\@þ,,-V2%".,$3Yÿ,ç2;AJ*²+°$3´.++°<2²+´+°/´++°0/°@3±Jé°92°/´)++°E/´67+°K/° Ö´+°±&+´!+°!±+´,&+², +³@ +³3,+´G+°,±/+°B2±Aé°82°A±<+°2´+°´;+°;/±L+±&± 99±!²#$)999°3°.9±G,±99°/°69±°9±.°#9°0³!&,$9±J³ :=$9±E)±3G99°6²;99901# 4673 5!5654&"&5463235.5463265#4&"ç+R`qDýƒ%59.$P›Ê‡ÅýuLWtVI$j€WV„"üa\>š¶(„2T.>+Z=!ýâ.G.êcjO(A_Tv¨`+“$%`8OL8Q%:7yTuvSB'€hW?^¤}þ"æ!E€U /7"6EYþGì2AGP[ˆ²+°%3´/++°B2²+´+°/´Y++° /´++°1/°F3±Pé°:2° /´*++°K/´77+°\/° Ö´+°±'+´"+°"±+´-&+²- +³@ +³4-+´M+°-±0+°H2±Gé°92°G°V Ö´+°/´V+°G±B+°2´>+°2°>´Q+°Q/°>´<+°š¶(4V[O„2T.>+Z='8P8:&'9þêBaaB)$ êcjO(A_Tv¨`+“$%`8OL8Q%:7yTuvSB'€hW?^¤}ýßJ:.õæ!E€U /7"6EýÝ(88(&98Yþ ê2BHQ]n¡²+°&3´0++°C2²+´+°/´l++°d/´[+° /´++°2/°G3±Qé°;2°!/´+++°L/´87+°o/° Ö´+°±(+´#+°#±+´.&+². +³@ +³5.+´N+°.±1+±I22±Hé°:2´i+³gH1+´X+°H±R+´a+°a±C+°2´?+°2°?´^+°^/°?´=+°=/±p+±(±99±#²%&+999°5°09±N.± 99°1°89°i°9±RX²dl999°a°A9± [·RX^`gi$9°±U99°°A9±0°%9°2³#(.$9±!Q³ 99901#"&547# 4673 5!5654&"&5463235.54632635#4&"4&#"3264'#"&'326êkIJkI|ýƒ%59.$P›Ê‡ÅýuLWtVI$j€WV„"üa\>š¶(4`cM„2T.>+Z=ë!""!;;()9 C/-DþÔIkjJ4,êcjO(A_Tv¨`+“$%`8OL8Q%:7yTuvSB'€hW?^¤}ýßO;3æ!E€U /7"6Eþ!""! (<8(.CDWþí3;Dز +°3²A+°+3±é² +°/´=++°/°$3±5é°12°E/°-Ö´(&+°(± +±é°±+±9é°9±+´C+°C±+´&+°? Ö´ +±F+± (²*+1999°°39°°59±C°9°?´ $9±A=± 99± ± *99°¶(-38$9°5°901%2654'7#"'&547.=4#"#4&#"&547632632264&" NM+®`P/.FD.0(KT“yVP?O.)-¡@Cs€74jo„INP88P8={b¢@7TDzJ/]B1002A>.†aZ“‰þ¢^?LC=R§B;YÊvPVLL{jeJ^þó8P88('WþÊ36BRñ²+²=+°'3±é°/´C++°K/´7+°/°!3±0é°,2°S/°)Ö´$&+°$±+±é°±+±4é³4+´P+°4±:+´H+° 2°H±+°F2´&+´ +±T+±$²&',999°°.9°°09±P4°9°:¶@CK$9±=7µ FHNP$9±² &999°¶$).3$9°0°901%2654'7#"&547&=4#"#4&#"&546326322654&#"2654'#"&' NM+®eViKJj7Œ“yVP?LZ-¡‡o€74jo„Ie###"/D9)(9D={b¢@7TÇ·H5eKjkJL65ÁZ“‰þ¢^?L|V§B;YÊx¤LL{jeJ^À#"!"pC/ *=9'.DWÿ 3@Kز$+²+°/3±é° /´J++°D/´7+° /°(3±9é°52°L/°1Ö´,&+°,±$+±#é°#±+´F&+°F±+±=é°=±+´<+±M+±$,²./5999°#°79±F± 999±=³ DJ$9°µA$9±DJ±99±$±.99° ¶,17<$9°9°901%2654'7#"&5463267#"&=4#"#4&#"&5476326324&#"32 NM+´py±T„dEA;P 80,7mv“yVO@O.)-¡@Cs€74jn… ' \+_4(#g=|a¢@7Wë»” B<223)^uZ“‰þ¢^?LC=R§B;VÍvPVLLzkeG.3Ó  Wÿ 3AV²%+²+°03±é° /´E+°T/°I3´+°2²T +³@TO +°!/°)3±:é°62°W/°2Ö´-&+°-±%+±$é°$±+´B+°B±+±>é°N2°>´P+°P/°>±+´<+±X+±%-²/06999°$°89±B±!:99°±T99±>P² E999°µG$9±TE±99°°9±%±/99°!¶-28=$9°:°901%2654'7#"5463263267#"&=4#"#4&#"&547632632327&#"#"#'4&#" NM+´ry´ÚG1TEI0,7mv“yVO@O.)-¡@Cs€74jn… 'þüY3]F.!8.(=|a¢@7Wë½” |,911G57uZ“‰þ¢^?LC=R§B;VÍvPVLLzkeG.3 !2:'#Wþˆ30XagpI²1+´Y+°H/±;N33´f+±@h22°m/±Dc33´T+±5]22°/°3´*7+° /°3´#7+°2°q/°Ö´&+°±+±é°±Q+´o+°o± +±Uk22±'é´d+°\2°'±b+°^2´F+°42°F±-+´&+°B Ö´9+±r+±²999°°!9°Q°#9°o° 9° ±Nh99°d°K9±b'³1HYf$9°F²*0999°B²;=999±fH±=K99°m²9>Q999±*²999° ¶ !&-$9°#°0901#"&=4#"#4&#"&5463263232654&'232#"'53254+#"&'#"&546;546"354&5#32'265'#"YN`vsjy“yVP?K[-¡‰m84jn…IBNMN?k9I5Hk9F…":/29G4N7&‰((‰DEòF3"Š`€—ˆoV‹þ³M=FtS¡<9PÅr›HHsfbFWt^NnþM:<3z< ?3¤!A63?;L=. ,”r?4<Wþ†30cls~ްS/±;O33´t+°r2´@+°E/´F+°{/±Kn33´Y+±1h22°d/´^+°/°3´*7+° /°3´#7+°2°/°Ö´&+°±+±é°±V+´}+°}± +±Zw22±'é´p+°g2°'±m+°i2´M+°b2°M±-+´&+°B Ö´8+°42°8´I+°I/²I8 +³@IE +±€+±²999°°!9°V°#9°}° 9° ±St99°p°Q9±m'³O^dr$9°M³*=0$9°I³>;@$9±8-°69±@S±=Q99±Et²8B>999°F³6Vw}$9°{°49±*²999° ¶ !&-$9°#°0901#"&=4#"#4&#"&5463263232654&'2#"'73254+53254+#"'#"&546;54632'"354&5#32#26545'#"YN`vsjy“yVP?K[-¡‰m84jn…IBNMN?M%:4$% '';„H;09F3N=9$$‡)((IFöK3"Š`€—ˆoV‹þ³M=FtS¡<9PÅr›HHsfbFWt^Nnýr'$ #&/ % ¦--D32A 54+53254+#"'#"&546;4654'&#"327'4&5#"32YN`vsjy“yVP?K[-¡‰m84jn…IBNMN?ZT’SE96sD6rWýå30[djt}i°B/´w+°|/´I+°1/°U3´s+°i2°o/±Se33´6+±<`22°\/´8+°/°3´*7+° /°3´#7+°2°~/°Ö´&+°±+±é°±4+´q+°q± +±'é³k' +±6F33´g+±_u22°'±e+°a2´S+°<2°S±-+´&+°O Ö´>+±+±²999°°!9°4± #99± q±1s99±gk°Y9±e'·8BIU\iw|$9°S´*0Ky$9°O°9±|w±FK99±s1°Y9°o²>O4999±*²999° ¶ !&-$9°#°0901#"&=4#"#4&#"&5463263232654&'"&547632#".5463267654'&'#"'&'"354&#32'4&5#"323254&#"YN`vsjy“yVP?K[-¡‰m84jn…IBNMN?þè28–…A"ŸWMm"C4J/}+$ƒ/”'ˆ''ˆDCÆG0*B\01&53"Š`€—ˆoV‹þ³M=FtS¡<9PÅr›HHsfbFWt^Nnü…D4q“,)> ‹nF@$!":2-+)­"?0-’i035:Wþƒ30\fnuv²Y+°13´g+°<2°Q/±EK33´~+±es22°z/±_o33´V+±>k22°/°3´*7+° /°3´#7+°2°€/°Ö´&+°±+±é³T+´|+°±v+±Vy22´q+°j2°q± +±'é³u' +°l3´d+°'±]+´A+°A±-+´&+°9 Ö´4+±+±²999°T°!9±v|² #Q999°q°O9° ³KYgs$9±d'±H[99°]±E>99°Aµ*1<0$9°9±6799±~Q±7O99°z²ATH999°V±9499°g°[9±*²999° ¶ !&-$9°#°0901#"&=4#"#4&#"&5463263232654&'2'654&#"32#"&5#"'&'#"&547>3264+2'"354#3254&5#"32YN`vsjy“yVP?K[-¡‰m84jn…IBNMN? [me$JH;U!84:%$ @2:—H>_(KI`ì)‘‘IHÏG0,3"Š`€—ˆoV‹þ³M=FtS¡<9PÅr›HHsfbFWt^NnþkY}<#,j22´x+°‹/±t33´f+±O}22°E Ö´F+°/°3´*7+° /°3´#7+°2°‘/°Ö´&+°±+±é°2°´d+°d/°±‡+°f2´ƒ+°|2°ƒ± +±'é±Ot22°'´†+°†/°~3°'±q+´T+°T±-+´&+°A Ö°J3´6+°12²A6 +³@AE +±’+±²999±d°!9°‡±a99°ƒ²# _999° ²]iy999±'†±[k99°q±RW99°T´*M0m$9°A²9;999±6-°49±…]±;_99±Ex@ 6A326324&#2'"354#254&5#"32YN`vsjy“yVP?K[-¡‰m84jn…IBNMN?¿1?.' "!([2}~@6NO?2:—H>[ ,kB@Mô/3bì*’’’ÐH1+3"Š`€—ˆoV‹þ³M=FtS¡<9PÅr›HHsfbFWt^Nný…- D,5 ; 2"Rq6AA88C4o?PDD"Ã!bþ.Mll914<Wýü 30w…‹•ذG/´S+°1/±pt33´”+±~Š22°/±z†33´6+±h„22³]6+´\+°‚/°d3´9+±=N22°/°3´*7+° /°3´#7+°2°–/°Ö´&+°±+±é°L Ö´Q+°±4+´’+°’±Œ+±622´ˆ+°„2°ˆ± +±'é³…' +°†3´h+°{2°'±x+´m+°m±-+´&+±AE22°´W+°W/°a3±—+±L³$9±Q±!N99±’4°O9°Œ² #1999°ˆ°v9±… ´9St‚Š$9°'°G9°h±;r99°x´*kp~$9°m³=d0$9°-±\]99±W°C9±”1±Ev99°\¶W4mrxŒ’$9°°C9±6]±LQ99°‚²;Aa999°9°O9±*²999° ¶ !&-$9°#°0901#"&=4#"#4&#"&5463263232654&'"&547>32632!".547!27654'&+532654&#"3232#"'#"'%4+32'4#"3#32'4&5#"32YN`vsjy“yVP?K[-¡‰m84jn…IBNMN?þm.4ŒB:R"2q@3<22þ„kŸz?F+;‰lV„E0,'5v<3;DFTJ./™DC‰‰EDÂD.)3"Š`€—ˆoV‹þ³M=FtS¡<9PÅr›HHsfbFWt^NnüŠD3o>REG&?EJÁ!I‚]a["MMþî%U9-#%-q5BEE99w5j³NS=m435>Wýé30aipu}†­²9+°=3´j+°P2°C/´|+°x/´H+°1/°^3´…+°t2°X Ö´b+°/±gq33´6+±Rm22°/°3´*7+° /°3´#7+°2°‡/°Ö´&+°±+±é³4+´ƒ+°±~+°62´r+°m2°r± +±'é³z' +´F+°F/´z+³q' +°n3´h+°'±e+´U+°U±-+°N2´&+´@+±ˆ+±²999°4°!9±~ƒ² #1999°r°`9° ³9^jt$9±h'³;H[x$9°e¶*CXRv|$9°U´=KP0$9±x|±FK99±…X°`9±b¶@NU4[~ƒ$9±j6°;9±*²999° ¶ !&-$9°#°0901#"&=4#"#4&#"&5463263232654&'"&547>32632#"&5432>54#"32#"&'#"'%2654+'"34&324#"32%4'#"32YN`vsjy“yVP?K[-¡‰m84jn…IBNMN?þW1:—G>^#][h v7az/](9^ƒF2. :!R*HŒ '‘##‘HI˜X9X9þ˜G/,3"Š`€—ˆoV‹þ³M=FtS¡<9PÅr›HHsfbFWt^Nnü…D4r@RFF|bº)%@ˆC™Sm1C%+99E 0hú1#+)‘s” Û)5=WþP30^chqn²\+´a+²?+°8/´E+°N/°R3´g+°i2°o/±Kd33´X+±1_22°/°3´*7+° /°3´#7+°2°r/°Ö´&+°±+±é°±<+´A+°A±U+´q+°q± +±'é³k' +±Yn33´e+°c2°'±d+°_2´K+°12°K±-+´&+°I Ö´4+±s+±²999°°!9±A<±# 99°U°>9°q°?9°k±RZ99±e'°P9°dµ*E8N\$9°K±099±gN°P9°o´9°*²999° ¶ !&-$9°#°0901#"&=4#"#4&#"&5463263232654&'#"'&547327654##"'#"&546;>32&#"#32'274&5#"YN`vsjy“yVP?K[-¡‰m84jn…IBNMN?57EZIg|[gG+?WMcL=KB<61!'(4>+C/1C?51jj35Æ 93"Š`€—ˆoV‹þ³M=FtS¡<9PÅr›HHsfbFWt^NnýŒ>5`6.@Fv_YIR^93)F>>R$%<*+;0GD3==;Z%(XWýœ30dinw̲c+´g+²H+°;/´x+°B/´M+°U/°Y3´m+°s2°p/±Rj33´_+±1e22°/°3´*7+° /°3´#7+°2°‚/°Ö´&+°±+±é°±E+´J+°J± +±'é³r' +´\+°\/´r+³o' +±`u33´k+°i2°'±>+´€+°€±j+°e2´R+°12°R±-+±P{22´&+´8+°42±ƒ+±²999°°!9°E°#9°J° 9°\°G9° °H9±or±Ys99±k'°W9°>²BMb999°€µ*@Ugm$9°j±c099°R³;x~$9°-±6}99±Bx³>8{$9°M±}~99°U°69°m°W9°p´EJP4\$9±c°G9°*²999° ¶ !&-$9°#°0901#"&=4#"#4&#"&5463263232654&'#"&547#"&54732654##"'#"&546;4624#"#32'#"3274&2654&"YN`vsjy“yVP?K[-¡‰m84jn…IBNMN?A8FMJJ42K}±F)?“gWŽG962!'&4=*A`A;75mm76§ :&ß,-<*)3"Š`€—ˆoV‹þ³M=FtS¡<9PÅr›HHsfbFWt^Nný‹=5T4!R4IK2 Šp_XIR[pLA@@P%'=();2FD4@@7]]\ ,þ‰),,<*Wý‚30ejow€²d+´h+²H+°;/´+°‰/´v+°B/´M+°V/°Z3´n+°|2°y/±Sk33´`+±1f22°/°3´*7+° /°3´#7+°2°/°Ö´&+°±+±é°±E+´J+°J± +±'é³{' +´]+°]/´{+³x' +°a3´l+°j2°'±>+´+°±k+°f2´S+°12°S±p+´†+°†±-+°Q2´&+´4+°4°8 Ö´„+°„/´8+±‘+±²999°°!9°E°#9°J° 9°]°G9° °H9±x{±Z|99±l'°X9°>²BMc999°³@Vhn$9°k´*d0Š$9°S¶;rtv‰$9°p°ˆ9°†°69±Bv·>8pt„†‹$9°M°r9°V°69°n°X9°y´EJQ4]$9±d°G9°*²999° ¶ !&-$9°#°0901#"&=4#"#4&#"&5463263232654&'#"&547#"&547327654##"'#"&546;4624#"#324#"32#"3274&2654'"&'YN`vsjy“yVP?K[-¡‰m84jn…IBNMN?A8FLTR89R }±F)?“gNBUG872!'&4=*A`A;75mm76b,--,þ÷ :&Þ%2 ,@+ 53"Š`€—ˆoV‹þ³M=FtS¡<9PÅr›HHsfbFWt^Nný‹<6R6"_8QQ8( Šp_XIR[p'H@@P%'=();2FD4@@7]¼,,-F\ 2þh2$!/,#3Wþˆ30SZM²;+´L+²C+°F/´A+°4 Ö´Y+°V/´Q+°/°3´*7+° /°3´#7+°2°[/°Ö´&+°±+±é°±8+´X&+°X± +±'é³T' +´1+°'±I+´?+²I? +³@IF +°?±B+´E+°- Ö´&+±\+±²999°°!9°8± #99°X°O9±T ³4QVY$9°'°L9°1°;9±?I´*0A$9±YF°G9±VA²81T999°Q²?IO999±*²999° ¶ !&-$9°#°0901#"&=4#"#4&#"&5463263232654&'#"'&5463233!5654&#"6324#"32YN`vsjy“yVP?K[-¡‰m84jn…IBNMN?t=0D"n^X67iCþô9G;5H &0=?12213"Š`€—ˆoV‹þ³M=FtS¡<9PÅr›HHsfbFWt^Nnüü1A2,@^|;P@-D29rWýÆ30]gn°²;+´V+²C+°K/´^+°c/±EO33´B+°4 Ö´m+°j/´[+°/°3´*7+° /°3´#7+°2°o/°Ö´&+°±+±é°±8+´l&+°l± +±'é³h' +´1+°'±S+´?+³e?S+´M+°M/´e+²Me +³@MP +°?±B+´E+°H2°- Ö´&+°E´a+°a/±p+±²999°°!9°8± #99°l°Y9±h ³4[jm$9°'°V9°1°;9±SM°O9°e±*99°?´0AKc$9°B²J^b999±E-°F9±4^³HMae$9±mc°Q9±jB²81h999°[²?SY999±*²999° ¶ !&-$9°#°0901#"&=4#"#4&#"&5463263232654&'#"'&5463233#"&547#5654&#"632264&"4#"32YN`vsjy“yVP?K[-¡‰m84jn…IBNMN?t=0D"n^X67iCJfK19G;5H &0=¹,,<+*Ù12213"Š`€—ˆoV‹þ³M=FtS¡<9PÅr›HHsfbFWt^Nnüü1A2,@^|;P@-DþÎ+<,,*9rWý¦30[cszIJ:+´T+²A+°I/´d+°l/´b+°4/°^3´y+´?++°v/´Y+°/°3´*7+° /°3´#7+°2°{/°Ö´&+°±+±é°±7+´x&+°x± +±'é³t' +´1+°'±K+´q+°q±Q +´=+°=±@+´C+°\ Ö´i+°@°- Ö´&+°C°F Ö´g+°g/´F+±|+±²999°°!9°7± #99°x°W9±t ³4Yvy$9°'°T9°1°:9°K±NO99°q°M9°=·*0?I`n$9°\³^bdl$9°@°H9±Cg°D9±4bµFKgioq$9°y³CDMO$9±v?²71t999°Y²=QW999±*²999° ¶ !&-$9°#°0901#"&=4#"#4&#"&5463263232654&'#"&5463233#"&547#5654&#"6324#"322654'#"&'4#"32YN`vsjy“yVP?K[-¡‰m84jn…IBNMN?t=0?Bp\VoiC&SpS&,9F<3J &0=à,--,+%3 +!, 4Ð12213"Š`€—ˆoV‹þ³M=FtS¡<9PÅr›HHsfbFWt^Nnüü1AWG_{uW=**þ™)78RR87)0&P>P@-DÐ,,-V2%".,$3!9rWþˆ30O²4+´9+°C/´H+°M/´=+°/°3´*7+° /°3´#7+°2°P/°Ö´&+°±+±é°± +±'é³1' +°E3´;+°'±-+´&+³@-+´J+°J/´@+°62±Q+±²999°°!9° °#9±;'°F9°J@ *490>CHM$9°-°79±MH²E@F999±9=²617999±*²999° ¶ !&-$9°#°0901#"&=4#"#4&#"&5463263232654&'4632&#";2#"'73254+"&YN`vsjy“yVP?K[-¡‰m84jn…IBNMN?¹\En>(/U^EC€YFn@*-W]D>;L3"Š`€—ˆoV‹þ³M=FtS¡<9PÅr›HHsfbFWt^NnýŽ9;A.27*g:9A-16(6Wý¿30XaW²4+´9+°G/´Y+°^/´Q+°V/´=+°/°3´*7+° /°3´#7+°2°b/°Ö´&+°±+±é°± +±'é³1' +°N3´;+°'±J+´`+°`±-+´&+³D-+´\+°\/´D+±6@22°D´S+°S/±c+±²999°°!9° °#9±;'°O9±`J°L9°S@ *49=>GQ0VY]$9±-\±7B99±^Y±JD99°Q±LB99°V²N@O999±9=²617999±*²999° ¶ !&-$9°#°0901#"&=4#"#4&#"&5463263232654&'4632&#";2#"&547&'73254+"&264&"YN`vsjy“yVP?K[-¡‰m84jn…IBNMN?¹\En>(/U^EC€42I42K@.*-W]D>;LÌ,,<**3"Š`€—ˆoV‹þ³M=FtS¡<9PÅr›HHsfbFWt^NnýŽ9;A.27*g; &>3JK2-# 1-16(6þš+<,,<+Wý¢30X`py²4+´9+°G/´a+°i/´_+°[/´Q++°V/´=+°/°3´*7+° /°3´#7+°2°q/°Ö´&+°±+±é°± +±'é³1' +°N3´;+°'±J+´n+°n±Y+´f+°f±-+´&+°d Ö´D+°D°@ Ö´S+°S/´@+°62±r+±²999°°!9° °#9±;'°O9±nJ°L9°Y@*49=>GQUV0]ai$9±fS°B9°d°79±[_µJDdfln$9°Q±LB99°V²N@O999±9=²617999±*²999° ¶ !&-$9°#°0901#"&=4#"#4&#"&5463263232654&'4632&#";2#"&547&'73254+"&4#"322654'#"&'YN`vsjy“yVP?K[-¡‰m84jn…IBNMN?¹[Fn>(/U^EC€-EQ9:Q%E0*-W]D>;L-,,-+%2 , + 53"Š`€—ˆoV‹þ³M=FtS¡<9PÅr›HHsfbFWt^NnýŽ::A.27*g8)P9QP:7( 2-16(6þþ,,-U2%!/,$3Wþ†30Y?²4+°K3´9+°E/´Q+°W/´=+°/°3´*7+° /°3´#7+°2°Z/°Ö´&+°±+±é°±I+´N+°N± +±'é°'°; Ö´2+°2/´;+°'±-+´&+³A-+´T+°T/´A+°62±[+±²999°°!9°I± #99± N°K9°2°L9±T;@ *490>EQW$9°-°79±WQ°A9°=²1IN999°9±6799°4±2L99±*²999° ¶ !&-$9°#°0901#"&=4#"#4&#"&5463263232654&'4632&#";2#"'&54732654+"'YN`vsjy“yVP?K[-¡‰m84jn…IBNMN?À]Dq@*/V`FC6P?1BnM];-1‡['EEA5%3"Š`€—ˆoV‹þ³M=FtS¡<9PÅr›HHsfbFWt^NnýVp!,4hgN$:XDI (Wý½30`iˆ²4+°R3´9+°H/´a+°f/´X+°^/´=+°/°3´*7+° /°3´#7+°2°j/°Ö´&+°±+±é°±P+´U+°U± +±'é°'°; Ö´2+°2/´;+°'±K+´h+°h±-+´&+³E-+´d+°d/´E+±6A22°E´[+°[/±k+±²999°°!9°P± #99± U°R9°2°S9±hK²=M^999°[@ *49>HX0]ae$9°d°C9°-°79±fa±KE99°X±MC99°^°A9°=²1PU999°9±6799°4±2S99±*²999° ¶ !&-$9°#°0901#"&=4#"#4&#"&5463263232654&'4632&#";2#"&547.54732654+"'264&"YN`vsjy“yVP?K[-¡‰m84jn…IBNMN?À]Dq@*/V`FC6P97I42Kh‚;-1‡['EEA5%¦,,<**3"Š`€—ˆoV‹þ³M=FtS¡<9PÅr›HHsfbFWt^NnýVp+´v+°v±b+´o+°o±-+´&+³8-+´m+°m/´8+°8°4 Ö´O+°O/´4+°Z2±z+±²999°°!9°C± #99± H°E9°U°F9±v>°@9°b@*1;LQRX]a0fjq$9±oO°69°m°[9±dhµ>8motv$9°L±@699°R°49°a±CH99°]²UZ[999°X°F9±*²999° ¶ !&-$9°#°0901#"&=4#"#4&#"&5463263232654&'2#"&547.54732654+"&54632&#"34#"322654'"&'YN`vsjy“yVP?K[-¡‰m84jn…IBNMN? 6P;DQ89S&d€;-1Ec:'EEA@-ó>IE8 4A56?67NDa>9P169873"Š`€—ˆoV‹þ³M=FtS¡<9PÅr›HHsfbFWt^NnþfRTj%+65,*5G?8E.G6FE7D26/H!-.lN)%±<#@FWþ30rz¼°C/´@+°+²>l +³@>A +°g± +±'é³w' +´`+°`/´w+°'±s+´Z+°Z±-+´&+³8-+´M+°M/°T3´8+°42²M8 +³@MP +±|+±²999°°!9°l°#9°g° 9± >³þÛ00©þO,BB,$55+a!(>.-8/1I5VsK:#")0+.3"Š`€—ˆoV‹þ³M=FtS¡<9PÅr›HHsfbFWt^Nnþ76A?:A#72'(2&38/9,?1HF3A-9+@5/gCX­<8;Wþ?30ahpx°8/´o+°k/´=+°L/´h+°R/°E3´^+°12°/°3´*7+° /°3´#7+°2°q/°Ö´&+°±+±é°± +±'é³U' +´Z+°Z/´U+°'°m Ö´;+°;/´m+³O' +´f+°'±b+´I+°I±-+´&+°B Ö´4+±r+±²999°°!9°Z± #99±;U°X9°O°W9±fm±^Q99°b@ *=8`Liko$9°Iµ1?E0G$9±ko°;9°=±?X99±hL°W9°R¶4BIOUZd$9°^°`9±*²999° ¶ !&-$9°#°0901#"&=4#"#4&#"&5463263232654&'2#"&5432>54&#"#"&547#"&54763264'24#"32YN`vsjy“yVP?K[-¡‰m84jn…IBNMN?IU@Ck3Pia .8/5D.4;6+:A(U,u*64jD.@23"Š`€—ˆoV‹þ³M=FtS¡<9PÅr›HHsfbFWt^NnþgPjOT&$=/j73F7F0HC5I6A-J(,9i !c¹B)(CDˆ Wýå30iq€¡²f+°13´Z+°J2°8/´+°{/°t3´=+°A2²{= +³@{w +°S/´p+°/°3´*7+° /°3´#7+°2°/°Ö´&+°±+±é°±b+´]+°]± +±'é³n' +´V+°V/°:3´n+´}+°'±x+´w+°w±j+´O+°O±-+´&+°G Ö´4+±‚+±²999°°!9°b± #99± ]±_`99±}V±Zf99±'n°X9°x´=Slp{$9°w³?8h$9°j°L9°O·*1AJ0rt$9°G±C99±{±:C99°=±?`99±pS°_9°Z¶4GOV]bl$9±*²999° ¶ !&-$9°#°0901#"&=4#"#4&#"&5463263232654&'2#"5463263267654&#"#"&547&#"&54763264'32&#"#5&#"32YN`vsjy“yVP?K[-¡‰m84jn…IBNMN?WfKNt™1#-'5$N;*%&:=HG7IK*a4Œ6C@C@(%$-Q:3"Š`€—ˆoV‹þ³M=FtS¡<9PÅr›HHsfbFWt^Nnþ{_z`eS',E@:>X^+:+0SB_BP9Y2/B}&(uáS1.VX“  $WþS30gog°7/´C+°R/´n+°Y/°J3´d+°12°/°3´*7+° /°3´#7+°2°p/°Ö´&+°±+±é°±;+´@+°@± +±'é³\' +´a+°a/´\+³U' +´l+°'±h+´N+°N±-+°F2´&+´4+±q+±²999°°!9°;± #99°@°=9± a°>9±U\±^_99±l'²WYd999°h¶*7CRf0$9°N³J1L$9±RC°_9°n°^9°Y@ 4@F;NU\aj$9°d±>f99°°=9°*²999° ¶ !&-$9°#°0901#"&=4#"#4&#"&5463263232654&'2#"'&54732654'&#"#"&547&#"&5463264'32YN`vsjy“yVP?K[-¡‰m84jn…IBNMN?(GV—{‚RP*1%†hbw3 6 13>9,=B'UhJ)63543"Š`€—ˆoV‹þ³M=FtS¡<9PÅr›HHsfbFWt^NnþkOt‚JI€YH;Pbuc[6(&6K.('G6J6B-L+'8iG]º?)%CIWý›30sz„¯°M/´{+°U/´`+°m/´z+°1/°f3´=+°A2°/°3´*7+° /°3´#7+°2°…/°Ö´&+°±+±é°±X+´]+°]± +±'é³4' +´9+°9/´4+³p' +´x+°'±Q+´ƒ+°ƒ±t+´j+°j±-+±c}22´&+´I+´E+±†+±²999°°!9°X± #99°]°Z9± 9°[9±'4±6799°x±1=99°Q²U`r999°ƒµ*?Smv$9°t°09°j¶MfAh{€$9°-°G9±U{³QI~‚$9°`°€9°m±G799°z°69°1@ 49EX]cjpv$9°=±?[99°°Z9°*²999° ¶ !&-$9°#°0901#"&=4#"#4&#"&5463263232654&'"&547632632#"'&547#"&54732654&#"#"&547&4'2264&#"YN`vsjy“yVP?K[-¡‰m84jn…IBNMN?z-=@$S21M*2J()TM$#73$& ‚¡)/%…kbx:3 9B.3<: w84l3-,**3"Š`€—ˆoV‹þ³M=FtS¡<9PÅr›HHsfbFWt^NnýÏC.M*%8gG.-67K{BU4%$$&3"”}WINZgp$9°nµ*J0y‡$9°d·`@bw{}…$9±‚u±IE99±O{·LGuy€‚ˆŠ$9°Z°w9°g±E799°t°69°1@ 49CRW]djp$9°<±>U99°°T9°*²999° ¶ !&-$9°#°0901#"&=4#"#4&#"&5463263232654&'"&54632632"&547#"&54732654&#"#"&547&4'24#"322654'#"&'YN`vsjy“yVP?K[-¡‰m84jn…IBNMN?z,>@$SeK*2GTWRSpT€ž)/%†jbx;2 9A/3<: w84lR+..+*$3 + - 53"Š`€—ˆoV‹þ³M=FtS¡<9PÅr›HHsfbFWt^NnýÏC.M*%8gG[kM|B&Z7RR7)!•|WI326=!53476"!42654'&#" NM+®utlw“yVP?LZ-¡‡o€74jo„I¹dMEg^A76J)?rýžÇFH¥„_D²!;%=!8!={b¢@7TdžŸtZ“‰þ¢^?L|V§B;YÊx¤LL{jeJ^ñ†aþÖ#zD=("1 .,%*EAÿcEFHbBþÿBýÀWþ„30V²1+°63´K+°B2²K1 +³@KG +°/°3´*7+° /°3´#7+°2°W/°Ö´&+°±+±é°±S+´N+°N± +±'é°'°F Ö´G+°G/´F+°'±?+´:+°:±-+´&+±X+±²999°°!9±NS± #99° ³1KPQ$9±'G°49±?F¶*6<0=$9±*²999° ¶ !&-$9°#°0901#"&=4#"#4&#"&5463263232654&'2632'654&#"#54&#"&5476YN`vsjy“yVP?K[-¡‰m84jn…IBNMN?þù%; QO./y X=2%C*1:\'w/.3"Š`€—ˆoV‹þ³M=FtS¡<9PÅr›HHsfbFWt^Nnþ&D78KŠ93)l4C0ææ/H4j'29ˆL87Wþ„30WcT²4+°63´O+°G2²O4 +³@OK +°=/°V3´[+´DaK4 +´D+°/°3´*7+° /°3´#7+°2°d/°Ö´&+°±+±é°±1+´S+°S± +±'é°I2°'´K+°K/°'±A+´X+°X±-+´&+³:-+´]+°]/´:+±e+±²999°°!9± Sµ #3OUV$9°K°49°'°59°A°69°X°G9°]¶*7=0E$9±[=°U9°a³1:SA$9±4O°59±*²999° ¶ !&-$9°#°0901#"&=4#"#4&#"&5463263232654&'46262#"'&546;&#"#54&#"&%3254'&#"YN`vsjy“yVP?K[-¡‰m84jn…IBNMN?þ2b˜!(®?=NB;H: ;b=- 1St¤!L1/3"Š`€—ˆoV‹þ³M=FtS¡<9PÅr›HHsfbFWt^NnýGOl:::9VJg.'4>U!Oäç ,%&1k#56Z/f!4Wýö30kwi²=+°A3´1+°d2²1= +³@1h +°J/´O+°[/°73´o+°/°3´*7+° /°3´#7+°2°x/°Ö´&+°±+±é°±9 +´4+°4± +±'é°h Ö´g+°'±^+´l+°l±q+´X+°X±-+´&+°G2°´S+°S/±y+±²999°°!9±h4´# 67=$9±g °?9±l^²ALd999°q·*JMO[0b$9°X²CV999±OJ°L9°[°M9°o°69°1@ 49CGSVX^u$9°=°?9±*²999° ¶ !&-$9°#°0901#"&=4#"#4&#"&5463263232654&'"&547632632#"'7327654&'#"&54767&#"#54&3254'&#"YN`vsjy“yVP?K[-¡‰m84jn…IBNMN?þ°/?Ps10PI!'O$P')rX;2&,@))+! <;3@"#4AZ=.Þ?%13"Š`€—ˆoV‹þ³M=FtS¡<9PÅr›HHsfbFWt^NnýÅK2k'46ŒM9822R 7:T_‰#434D/O $I[T8;/0Méé!,¶2\3%=Wþ‹30K²8+°;/´6+´<+°A/´1+°/°3´*7+° /°3´#7+°2°L/°Ö´&+°±+±é°±I+´D+°D± +±'é°'±>+´4+²>4 +³@>; +°4±7+´:+³-:7+´&+±M+±²999°°!9°I± #99± D°G9°'²1AF999±4>°69°7³*0$9±6<°F9°A³4>DI$9±*²999° ¶ !&-$9°#°0901#"&=4#"#4&#"&5463263232654&'233!5654&#"&546YN`vsjy“yVP?K[-¡‰m84jn…IBNMN?Ê>U¥Bþº12"!32QV3"Š`€—ˆoV‹þ³M=FtS¡<9PÅr›HHsfbFWt^NnýŽL;#9þ‘ 9!-,02'S8OWýÂ30V`u²8+°@/´W+°]/°R3´7+³F7]+°:3´G+°L/´1+°/°3´*7+° /°3´#7+°2°a/°Ö´&+°±+±é°±T+´O+°O± +±'é°'±I+´4+²I4 +³@IF +°4°_ Ö´C+°C/´_+°4±7+´:+°=2°:´Z+°Z/³-:7+´&+±b+±²999°°!9°T± #99± O°R9°'²1LQ999±4C±6E99±7_¶*0@W\$9±-Z°;9±]W±C=99±7G°Q9°L³4IOT$9±*²999° ¶ !&-$9°#°0901#"&=4#"#4&#"&5463263232654&'233##"&547#5654&#"&5462654&"YN`vsjy“yVP?K[-¡‰m84jn…IBNMN?Ê>U¥BJ41Lj12" 42QV&,-<**3"Š`€—ˆoV‹þ³M=FtS¡<9PÅr›HHsfbFWt^NnýŽL;#9þ‘#.3JL1-$ 9!-/02'S8Oþj*,,<+Wý§30V\l²8+°@/´]+°e/´\+°Y/°R3´7+³F7Y+°:3´G+°L/´1+°/°3´*7+° /°3´#7+°2°m/°Ö´&+°±+±é°±T+´O+°O± +±'é°'±C+°I2´j+°42²Cj +³@CF +°j±7+´:+³b:7+´W+°W/´b+°:°= Ö´`+°`/´=+³-:7+´&+±n+±²999°°!9°T± #99± O°R9°'²1LQ999±jC±6E99°W·*0@Z]e$9±-`°;9±Y\µC=`bhj$9±7G°Q9°L³4IOT$9±*²999° ¶ !&-$9°#°0901#"&=4#"#4&#"&5463263232654&'233##"&547#5654&#"&5464"22654'#"&'YN`vsjy“yVP?K[-¡‰m84jn…IBNMN?Ê>U¥B$R89S%\12"!32QVKXX*#4 , + 53"Š`€—ˆoV‹þ³M=FtS¡<9PÅr›HHsfbFWt^NnýŽL;#9þ‘'78SR96( 9!-+ 02'S8OþÑ,,-V5#!/+$4Wýæ30[dd²8+°=/´_+°c/´D+°I/´6+´J+°Q/´1+°/°3´*7+° /°3´#7+°2°e/°Ö´&+°±+±é°±Y+´T+°T± +±'é°'±L+´4+²L4 +³@LI +³\4L+´@+°@/´\+°4±H+°72´:+°- Ö´&+±f+±²999°°!9°Y± #99± T°W9°'²1QV999±4\°69°H@ *0=D_ac$9±c_²@\a999±ID°W9±6J°V9°Q³4LTY$9±*²999° ¶ !&-$9°#°0901#"&=4#"#4&#"&5463263232654&'233#"&54763267!5654&#"#"&5463254#"YN`vsjy“yVP?K[-¡‰m84jn…IBNMN?­?T  B`N5V+(W! ÿ-1#!/1#KW£1%/Q43"Š`€—ˆoV‹þ³M=FtS¡<9PÅr›HHsfbFWt^NnýŒL<*<þ‘L]-(" '( >",,6.!V9Oþ¯WþR30\T²8+²C+°2°:´i+°i/³-:T+´&+±p+±²999°°!9°I± #99±cN°K9° °L9±'^±`a99°D±1[99±mX±FR99±T4·*0Afjk$9°i°<9±Ff±D>99°R±2°:´l+°l/³-:Q+´&+±z+±²999°°!9°H± #99±`M°J9° °K9±'[±]^99°D±1X99°U±FR99±4v²Os6999°d@ *0Aehiq$9±ln°<9±ehµD>lntv$9°O±Tf '6¾83"Š`€—ˆoV‹þ³M=FtS¡<9PÅr›HHsfbFWt^NnýbE[./>Õ 9!-*!11'S9NL;!ý;(šœ)8WýÂ30\enв4+´]+°?/´f+°E/°93´[+°a2°[´k+°Q2°E´F+°K/´V+°/°3´*7+° /°3´#7+°2°o/°Ö´&+°±+±é³S+´N+°±H+´Y+²HY +³@HE +°Y± +±'é³\' +´a+°'±B+´m+°m±-+´&+³9-+´b+°b/´9+°<2°9´i+°i/±p+±²999°S°!9±HN´# PQV$9°Y°[9±ma°D9°b@ *4?]0fj$9±-i°:9±kf±B<99±[F°P9°K³HNSY$9±*²999° ¶ !&-$9°#°0901#"&=4#"#4&#"&5463263232654&'4632##"&547!5654&#"&5463237"354&264&"YN`vsjy“yVP?K[-¡‰m84jn…IBNMN?¡ZFC./K32KþÛ13"#22RW;>Tf '6¾8,-<**3"Š`€—ˆoV‹þ³M=FtS¡<9PÅr›HHsfbFWt^NnýbE[./>Õ#.3JK2-$ 9!-*!11'S9NL;!ý;(šœ)8þ3+<,,<+Wý©30\em|›²4+´]+°?/´n+°v/´l+°E/±9h33´[+°a2´F+°K/´V+°/°3´*7+° /°3´#7+°2°}/°Ö´&+°±+±é³S+´N+°±H+´Y+²HY +³@HE +°Y± +±'é³\' +´a+°'±B+´z+°z±f+´s+°s±-+´&+³9-+´b+°b/´9+°<2°9´q+°q/±~+±²999°S°!9±HN´# PQV$9°Y°[9±za°D9°f@ *4?]0jnu$9±-q°:9±El¶Tf '6¾8+--+*$4 ,@+ 43"Š`€—ˆoV‹þ³M=FtS¡<9PÅr›HHsfbFWt^NnýbE[./>Õ(58RQ97& 9!-+ 11'S9NL;!ý;(šœ(9þœ,,-V3$!.+$3Wþ307?Gû²6+´@++°3/´>+°/°3´*7+° /°3´#7+°2°H/°Ö´&+°±+±é°± +±'é³3' +´D+°'±F+´<+°<±?+´2+°2±-+´&+±I+±²999°°!9° °#9±F'²6>@999°<³*0:$9°?°9±@>±9±XS±@499°J³7=>6$9°K±GO99°:°E9±*²999° ¶ !&-$9°#°0901#"&=4#"#4&#"&5463263232654&'"&547#5432#4'3'"654264&"YN`vsjy“yVP?K[-¡‰m84jn…IBNMN?2K¸µINdš,,€3,,<+*3"Š`€—ˆoV‹þ³M=FtS¡<9PÅr›HHsfbFWt^NnûÄK2-$§Éƪ#.3Jxl!']W÷M8kVZ@þ7+<,,*Wý©30BJRZj|²:+´K++°1/´[+°c/´Y+°U/´J+°/°3´*7+° /°3´#7+°2°k/°Ö´&+°±+±é°± +±'é³O' +´7+°7/´O+°'±4+´h+°h±Q+´G+°G±S+´`+°`±-+´&+³=-+´J+°J/´=+°@2°=´^+°^/±l+±²999°°!9° °#9±h4°69°Q´:KIWe$9°G@ *1E0UY[c$9°S°9±=^°>9±UYµ@4^`fh$9°J³7=>6$9°K±GO99°:°E9±*²999° ¶ !&-$9°#°0901#"&=4#"#4&#"&5463263232654&'"&547#5432#4'3'"6544#"322654'#"&'YN`vsjy“yVP?K[-¡‰m84jn…IBNMN? 9S$¸µ"QNdš,,€X,--,*$3*! + 43"Š`€—ˆoV‹þ³M=FtS¡<9PÅr›HHsfbFWt^Nnû«R86'§Éƪ&78R‘l!']W÷M8kVZ@þ ,,-V4#"-+%2Wýá30EMVaG°4/´Z+°_/´;+°@/´L+°P/´C++°/°3´*7+° /°3´#7+°2°b/°Ö´&+°±+±é°± +±'é³U' +´@+°@/´U+³9' +´W+°'±N+´J+°J±?+°F2´1+³-1?+´&+±c+±²999°°!9° °#9±NW´C;LP_$9°J¶*4H0Z\$9°?±=99±Z4±7699°_²9W\999°;°=9±PL±JU99°C°H9±*²999° ¶ !&-$9°#°0901#"&=4#"#4&#"&5463263232654&'#"'.543265!5432#4'3'4#"63254&#"YN`vsjy“yVP?K[-¡‰m84jn…IBNMN?“aN 0JsbþÆ¿·é±:22°E/°Ö´+°±6+´1&+°1±)+±(é°(±"+±Bé°B±+´&+±F+±6±99±)1²34:999°(°<9°"² >999±B³$9±)°39°%@ "16±9901%2654'7# '&547! 7#"'&=4#"#4&#"&547632632ÁONŽ+¯g¸îþÕ·ÓH:>¾¢ 6¬n>6”yVOAN/',¢@Fr€73lk†I={b¢@7VÓ~¿r9r„þž~"i…çr`KFsZ“‰þ¢^@KC?E999°3°G9°-²%I999±Y°9°S¶ )'$9±%´ SY$9°)± V99±4°>9°0@ !-¾¢ 6¬n>6”yVOAN/',¢@Fr€73lk†Iu(87)'89={b¢@7VÓÍzT9B10aB/r„þž~"i…çr`KFsZ“‰þ¢^@KC3±é°/´X++°`/´N+°/´&7+°0/°83±Gé±C22°h/°Ö´ +° ±@+´;&+°;±4+±3é°3±-+±Jé³J-+´e+°J±P+´]+°]±+´&+°[ Ö´ +±i+±@ ±99±4;²=>C999°3°E9°-³&FG$9±J°9±Pe@  (*VX`$9±N³ [e$9°&´PV]c$9°*± S99±4±=99°0@  -;@EI$9°G±9901%2654'7#"&547#".5473 7#"&=4#"#4&#"&54632622654&#"2654'#"&'ÁPMŽ+¯5GkJIk „¥’öÀmH:>@pž¶i6¬mu”yVOAKY,¢‰o€73Ø…IH2!#!;/D9*(9 C={b¢@7VþZ{]>JjkI$;vÄž~"i…]•eDŽvZ“‰þ¢^@K{W¦C;VÍx¤LL|ieI_þÒ!"!’C/"+<9'.DWþ„30U_²O+°73´C+°=/°I3´1+°V2°/°3´*7+° /°3´#7+°2°`/°Ö´&+°±+±é°±L+´]+°]± +°Y2±'é´G+°'±@+´T+°T±-+´&+°4 Ö´9+±a+±²999°°!9±]L± #99° ´EIJV[$9°G±CO99±4T¶*067=$9±C1¶49@GLS[$9°O°69±*²999° ¶ !&-$9°#°0901#"&=4#"#4&#"&5463263232654&'2654'7#"&=4#""&54632!2654'YN`vsjy“yVP?K[-¡‰m84jn…IBNMN?%1[%s"%J>Mp OIvCw]D39þý$R4%3"Š`€—ˆoV‹þ³M=FtS¡<9PÅr›HHsfbFWt^NnüÂT/b7'=ŠF5=V@7uB[D_bF]w'*A:tB'a3T&9Wý¸30\eo`²V+°73´J+°@/´]+°1/°f3°/°3´*7+° /°3´#7+°2°p/°Ö´&+°±+±é°±S+´m+°m± +°i2±'é´N+°'±G+´[+°[°d Ö´C+°C/´d+°[±-+´&+°4 Ö´9+°=2°9´`+°`/±q+±²999°°!9±mS± #99° ´LPQfk$9°N±JV99±d[°E9°4@ *1067;@]a$9±1]¶;=CEPQa$9°J¶49GNSZk$9°V°69±*²999° ¶ !&-$9°#°0901#"&=4#"#4&#"&5463263232654&'2654'7#"&547&=4#""&54632264&"%2654'YN`vsjy“yVP?K[-¡‰m84jn…IBNMN?%1[%s=;I42K*Jp OIvCw]D39],,<**þ¾$R4%3"Š`€—ˆoV‹þ³M=FtS¡<9PÅr›HHsfbFWt^NnüÂT/b7'=Ši3#H3JK29%&a7uB[D_bF]w'*A:tÔ+<++<+ÔB'a3T&9Wý30[cs}}²V+°73´J+°@/´d+°l/´b+°^/´1+°t2°/°3´*7+° /°3´#7+°2°~/°Ö´&+°±+±é°±S+´{+°{± +°w2±'é´N+°'±G+°C2´Z+´q+°Z±\+´i+°;2°i±-+´&+°4 Ö´9+°=2°9´g+°g/±+±²999°°!9±{S± #99° ´LPQty$9°N±JV99±Zq°E9°\@ *107@6`dlo$9±^b·C=QPgioq$9°1±;E99°J¶49GNSYy$9°V°69±*²999° ¶ !&-$9°#°0901#"&=4#"#4&#"&5463263232654&'2654'7#"&547&=4#""&546324#"322654'#"&'%2654'YN`vsjy“yVP?K[-¡‰m84jn…IBNMN?%1[%sBBS79S:@p OIvCw]Ek|,--,*#4 +!, 4þÐ$R4$3"Š`€—ˆoV‹þ³M=FtS¡<9PÅr›HHsfbFWt^NnüÂT/b7'=Šn1)M7SR8H*(Y7uB[D_bF\xT>:tm++-U3#".,$2ïB'a3T&9Wþƒ30\;°@/´7+°M/°F3´Z+°12²MZ +³@MJ +°/°3´*7+° /°3´#7+°2°]/°Ö´&+°±+±é°V Ö´Q+°±J+´I+°I± +±'é°'±C+´5&+°5±-+´&+°9 Ö´>+±^+±V³$9±Q°!9±Jµ #MSTZ$9°I±1\99±' °F9°C°29±95¶*0;<@$9±7@°S9°Mµ49>CQV$9°Z±;\99°°<9°*²999° ¶ !&-$9°#°0901#"&=4#"#4&#"&5463263232654&'23254'7#"&=4#"#54#"&547632YN`vsjy“yVP?K[-¡‰m84jn…IBNMN?þÝ”]P^`%{ŸIQWFHU0V&r--M[3"Š`€—ˆoV‹þ³M=FtS¡<9PÅr›HHsfbFWt^NnþRFBa„b*0:ƒÁ^N9VOååO%&2f*3=†L78:Wý½30en‚°E/´f+°k/°]3´7++°V/°O3´c+°12²Vc +³@VS +°/°3´*7+° /°3´#7+°2°o/°Ö´&+°±+±é°_ Ö´Z+°±S+´R+°R± +±'é°'±L+´5&+³H5L+´m+°5±-+°h2´&+°9 Ö´>+°B2°-´B+±p+±_³$9±Z°!9±Sµ #V\]c$9°R±1e99±' °O9°L°29±m5²*J999°9·70;LZ_$9°c±;e99°°<9°*²999° ¶ !&-$9°#°0901#"&=4#"#4&#"&5463263232654&'23254'7#"&547&=4#"#54#"&547632264&"YN`vsjy“yVP?K[-¡‰m84jn…IBNMN?þÝ”]P^`%{==J42K#aWFHU0V&r--M[|--<**3"Š`€—ˆoV‹þ³M=FtS¡<9PÅr›HHsfbFWt^NnþRFBa„b*0:ƒp3%G4IK21%"‚9VOååO%&2f*3=†L78:þ+*<,,<*WýŸ30dl|¢°E/´m+°u/´k+°g/°\3´77+°V/°O3´a+°12²Va +³@VS +°/°3´*7+° /°3´#7+°2°}/°Ö´&+°±+±é°^ Ö´Y+°±S+´R+°R± +±'é°'±L+´5&+°5°z Ö´H+°H/´z+°5±e+´r+°r±-+°p2´&+°9 Ö´>+°-´B+±~+±^³$9±Y°!9±Sµ #V[\a$9°R°c9±' ±1O99±z5°J9°e@ *70LY^$9°a±;c99°°<9°*²999° ¶ !&-$9°#°0901#"&=4#"#4&#"&5463263232654&'23254'7#"&547&=4#"#54#"&5463264#"322654'#"&'YN`vsjy“yVP?K[-¡‰m84jn…IBNMN?ÙK\P^`%{CES89S3WWFHU.5V&r]J[€+..+*%2 + - 53"Š`€—ˆoV‹þ³M=FtS¡<9PÅr›HHsfbFWt^NnþRFBa„b*0:ƒx0)O8RR8A*&z9VOååOI4f*3=†Nm::þT++.U2%!/-$3Wýê30jrn²g+°13´\+°U2°A/´q+°m/´F+°N/°X3´7+°/°3´*7+° /°3´#7+°2°s/°Ö´&+°±+±é°d Ö´_+°±Y+´X+°X± +°D2±'é´o+°'±Q+´5+°5±-+´&+°9 Ö´>+±t+±d³$9±_°!9±Yµ #\abg$9°X°i9±o ±1U99±5Q³AFmq$9°9@ *0;Q_d$9°g±;i99°°<9°*²999° ¶ !&-$9°#°0901#"&=4#"#4&#"&5463263232654&'23254'7#"&5432>7#"&=4&#"#54#"&5463264#"32YN`vsjy“yVP?K[-¡‰m84jn…IBNMN?çKYR]`&}™‡6MtnIQ$3FIV,5V&qZKP($ýW.R33"Š`€—ˆoV‹þ³M=FtS¡<9PÅr›HHsfbFWt^NnþQH3nc,0>˜’´*)D5  ]M!;3QææQJ3g,4;ŠPm++þ0 WþO30kl²h+²1+±m+±²999±JE±!G99±`e°H9°Z´# bch$9° °j9±'Y³1BNV$9±95¶*0;EJS`e$9°h²;Hj999±*²999° ¶ !&-$9°#°0901#"&=4#"#4&#"&5463263232654&'23254'7#"&547327"&=4#"#54#"&546326YN`vsjy“yVP?K[-¡‰m84jn…IBNMN? =NBMO fe i¨Ô++$ZŽ_–VA!3"Š`€—ˆoV‹þ³M=FtS¡<9PÅr›HHsfbFWt^NnýÿF;7RoQ%(1wZ{4ˆ‰ZF2°- Ö´&+±‚+±²999±TO±!Q99±jo°R9°d´# lmr$9° °t9±'c³1LX`$9±5H°J9°y@ *0;<@EZv|$9±Lv³HBy~$9°X²J{|999°Z°@9°7²cdl999°g·49>OT]jo$9°r²;Rt999±*²999° ¶ !&-$9°#°0901#"&=4#"#4&#"&5463263232654&'23254'7#"&547#"&547327"&=4#"#54#"&5463262654&"YN`vsjy“yVP?K[-¡‰m84jn…IBNMN? =NBMO fSOI42K 5D¨Ô++$ZŽ_–VA!,,<**3"Š`€—ˆoV‹þ³M=FtS¡<9PÅr›HHsfbFWt^NnýÿF;7RoQ%(1wuEV3JK2 ˆ‰ZF+°€ Ö´B+±Ž+±²999±UP±!R99±kp°S9°e´# mns$9° °u9±'d³1LYa$9±^H°J9±5а‡9°x@ *07;E[y|}…$9°‚±<@99±L|µHB€‚ˆŠ$9°Y±Jy99°[°@9°7²dem999°h·49>PU^kp$9°s²;Su999±*²999° ¶ !&-$9°#°0901#"&=4#"#4&#"&5463263232654&'23254'7#"&547#".547327"&=4#"#54#"&5463264#"32654'#"&'YN`vsjy“yVP?K[-¡‰m84jn…IBNMN? =NBMO fiRQ9:R#0l§i++$ZŽ_–VA!+..$4+ - 43"Š`€—ˆoV‹þ³M=FtS¡<9PÅr›HHsfbFWt^NnýÿF;7RoQ%(1w‡D$Z9QQ9%6~]ZF' +´C+°C/´>+°'±-+´&+³4-+´9+°9/´4+±]+±Y³$9±T°!9°N· #FKLQVW$9±9'@ *0167<@A$9±*²999° ¶ !&-$9°#°0901#"&=4#"#4&#"&5463263232654&'2'654&"&546!2'654&#"&546YN`vsjy“yVP?K[-¡‰m84jn…IBNMN?SmƒcNpKcƒqþ¾Sl„aM98Icq3"Š`€—ˆoV‹þ³M=FtS¡<9PÅr›HHsfbFWt^NnþpTƒ33$]9PP9`!35RrpT‚43"_:OO:`!34‚RrWý³30QgsL²R+°13´]+°F2°;/´h+°/°3´*7+° /°3´#7+°2°t/°Ö´&+°±+±é°e Ö´`+°± +±'é°I2³U' +´Z+°Z/´U+°'´N+°N/°'±>+´q+°q±-+´&+°D Ö´4+°82°4´k+°k/±u+±e³$9±`°!9°Z· #RWX]bc$9±>'±GL99°q°K9°D@ *16;0BAFhn$9±]h@ 48>LNUWcen$9±*²999° ¶ !&-$9°#°0901#"&=4#"#4&#"&5463263232654&'2#"&5467'654&"&5476!2'654&#"&5462654&#"YN`vsjy“yVP?K[-¡‰m84jn…IBNMN?SlKKI42K9)cMpLd„88þ¿Sm…bM98Jcq),+*+3"Š`€—ˆoV‹þ³M=FtS¡<9PÅr›HHsfbFWt^NnþpT`7#R3JK2-D $]9PO:`!34‚Q:9pT‚43#^:OO:`!34‚Rrýç,+++Wý 30Qgol²R+°M3´]+°B2°7/´p+°x/´n+°/°3´*7+° /°3´#7+°2°€/°Ö´&+°±+±é°e Ö´`+°± +±'é°E2³U' +´Z+°Z/´U+°'´J+°J/°'±:+´}+°}±-+´&+°42°? Ö´P+°-°h Ö´u+°´s+°s/±+±e³$9±`°!9°Z· #RWX]bc$9±:'°H9°}´*BGM$9°?@ 170=54&"&546!2'654&#"&546YN`vsjy“yVP?K[-¡‰m84jn…IBNMN?!Ha(FdpBUŒo>7+/6bxHFt`6Ab=Gr^þæFYnQ@./=Sn_3"Š`€—ˆoV‹þ³M=FtS¡<9PÅr›HHsfbFWt^Nnþ^F9Z<(?mIKXI;=Y30U:0?A1S,.lI^`Gl.,!M/CB0N ,/kEbWý²30bx‚޲c+°13´n+°X2²J+°;/´y+°B/´Q+°/°3´*7+° /°3´#7+°2°ƒ/°Ö´&+°±+±é³G+´L+°±v+´q+°q± +±'é³f' +´k+°k/´f+°'±`+´[+°[±>+´+°±V+´4+°82³V-+´&+±„+±²999±LG°!9°°I9°v°J9± q· #chinst$9±fk±BQ99±>¶*0@Y]^$9°-¶16;Xy~$9°V±{|99±By³>8|€$9°Q±@~99°n@ 6GL4^`fhtv$9±c°I9°*²999° ¶ !&-$9°#°0901#"&=4#"#4&#"&5463263232654&'2#"&547#".54732>54&"&546!2'654&#"&546264&#"YN`vsjy“yVP?K[-¡‰m84jn…IBNMN?!HaQQI42K @TUŒo>7+/6bxHFt`6Ab=Gr^þæFYnQ@./=Sn_Ô++,+3"Š`€—ˆoV‹þ³M=FtS¡<9PÅr›HHsfbFWt^Nnþ^FtBX3JK2 ?mIKXI;=Y30U:0?A1S,.lI^`Gl.,!M/CB0N ,/kEbýç*>+,<+WýŒ30Fx~ޝ²1+°G3´<+°n2²`+°Q/´+°‡/´~+°X/´g+°/°3´*7+° /°3´#7+°2°/°Ö´&+°±+±é³]+´b+°±D+´?+°?± +±'é³4' +´9+°9/´4+°'±v+´q+³Tqv+´Œ+°q±z+´„+°„±-+°l2´&+°‚ Ö´N+°-´J+±+±²999±b]°!9°°_9°D°`9± ?· #16754&"&5464#"32654'#"&'YN`vsjy“yVP?K[-¡‰m84jn…IBNMN?þ¾FYnQ@./=Sn_¨HaeRQ9:Q0=UŒo>7+/6bxHFt`6Ab=Gr^+--$4*! + 43"Š`€—ˆoV‹þ³M=FtS¡<9PÅr›HHsfbFWt^Nnþ`Gl.,!M/CB0N ,/kEb^F„A$\9QP:&?mIKXI;=Y30U:0?A1S,.lI^þXXV3$"-+$3Zÿ1a.Dö² +´/+²-+°(/´%7+°?/´+´@+´=+°/± é°6/´7+°E/°Ö´&+°, Ö±"é°±B+´&+²B +³@B? +°±+´9<+²9 +³@9> +°9±3+±é±F+±B"µ /$9°°9±9°9°3²0999°±&'99± %°,9±?/°9±=°9°·39B$901"&546323&547632#!"3!!"'&5463!2654&#"!5654&#3K<$c~KQ=A§9NGwKDƒ{ý­U2#>üµA/-ZCM[`gSRh2þbDNT:-A=.iLf.2R2>hjA=TP{D %F'&>=D~eVqVK=3;$J-=Zÿ0c.M&²+´+²+°/´7+°4/´K+´5+´2+°$/±%é°:/±Eé°,/´7+°N/°BÖ´=&+° Ö±é°=±7+´I&+²7I +³@74 +°I±+´.&+². +³@.3 +°.±!+°)2´ <+°2²! +³@!% +±O+±7µ:?@E$9°I°K9±.°L9°!² 999° ²999±°9±4°@9±K2² !?999±%$´7=BI$9°:±.99°E±)99014632#!"3!!"'&5463!2654+532654&#"!5654&#"&546323&J‘zpž55dRýcU2#>üµA/-[B”1IF..)rJ¾2þbDN23K<$c~KQ=A§4;s€pMJ')HGIC &F'&?R>,BC>Q N1,g^X797þ]HSrSF!m@BS[z­Až¥_&j`+d.°•ÁŒš"C737phhi‡<>VACL+e7NJ7V$<9}T<=sZH"N…zžýO $Yÿò˜.Bõ²=+°3²0+°!3´++²0+´1+²0+´.+°7/±é°&/°3± é°2°C/°?Ö´:+°:±3+´+²3 +³@30 +°±+´*1+°*±"+´!1+°!±+´&+±D+±3:²<=999°°9±*°9°"² ./999°!°9°²999±.1°9°°<9°7·*3:?$9±&°90123&547632632'654&#"#4&#"!5654'&#"&5476.\y­AGHtk:6jsEF\O&‚eS.@QK3S1. 9þ]H)'<9SF!m@BztYH"N…tPT]]RTqi—%;?¯XsT3þ¡_5P@DM2$ e8'&J7U%<9}T<=Yÿòý.HU!²++°3´C++² +°83±Ié²++´,+²++´)+°2/±>é³P>2+±é°!/°3±é°2°V/°:Ö´5+°5±.+´A+².A +³@.+ +°A±F+´%1+°%±+´1+°±+´T&+°T±L+´ 1+±W+±.5²78>999°A°C9±%F°D9°²)*999°°9±LT´ $9±I)°79±2C@ %.5:AFLST$9°P°N9±>°9°!°9012632#"&547632&#"#4&#"!5654'&#"&5476323&5462654'&#"T3`A‡…\[6=mY_;:eDM2$ e8'&J7U%<9}T<=tYH"N…t¤þ`M4)+*vNYÿ›.[ic²V+²I+°:3´++²,+´\7+²I+´J+²I+´G+²$+°/´!++°P/±é³cP+´4++°?/°63± é°2°j/°XÖ´S+°S±L+´+²L +³@LI +°±+´C1+°C±;+´:1+°:±0+´f&+°f±_+´)+°)±%+´&+±k+±LS²UV999°°9±C°9°;² GH999°:°9±f0±699°_´!,4$9°)±'99±!°9°,°9±\G°U9±P@ %)0CLSX_f$9°c±'a99±?4±990123&54763267632#"'7327654'#"'&54763&#"#4&#"!5654'&#"&54762654'&#".\y­AEHut1:33ªKvAAVWŠQK=@kB>‡`^V30=B] v>UPI4Q01 9þ]H)'<9SF!m@BL;:' FZztYH"N…tPTO%~ UT„”ei1?-VNwÆ'8Em‡BDM2$ e8'&J7U%<9}T<=þ»UFWBfF2).Yÿ÷¸.)2Ͳ+² +´++° 2² +´+°/±é°,/± é°3/°Ö´+°±+´+² +³@ +°±+´1&+°1±*+´%<+°%± +´ 1+±4+±²999°°9±*1± )99°%°#9±°9°´1$9°±%*99± ,°#901235! !5654'&#"&547654'4#"6.\y«ü¹H)'<9SF!m@Bž=25ZnG9&-ÔztYJ ¸3þÓþÿ#g8'&J7U%<9}T<=þÇÀÊd9RWC+j29j´ƒYþú¸.+5>G/²&+²+± D33´++°,2²+´+°/´@++° /±é°8/± é°H/°(Ö´#+°#±+´+² +³@ +°±+´=&+°=±6+´1<+³G16+´+°/´G+°1±,+´ 1+°2° ´B+°B/±I+±#²%&999°°9±=±5899°G± 99°1³/?E$9°,²@D999± B° 9±&@³BF$9±°%9° ´#(=$9°±1699± 8°/901235! #"'&547!5654'&#"&547654'4#"62654&".\y«!!//ˆ//!ýÜH)'<9SF!m@Bž=25ZnG9&-Ô;N98P9ztYH"¸3þÓþÿ,7B1001B7,$ e8'&J7U%<9}T<=þÇÀÊd9RWC+j29j´…þk9'(89NYþÔ¸.(19EUB²$+°@3²+° 3´++°)2²+´+°/´F++°N/´:+°/±é°4/± é°V/°&Ö´!+°!±+´+² +³@ +°±+´8&+°8±+´S+°S±2+´.<+°.±=+´K+°K±)+´ 1+°2° ´I+°I/±W+±!²#$999°°9±8°19°S±499°2± P99°.¶,:@CFN$9± I° 9±$:·=CIKQS$9±°#9°´!&8$9°±.299± 4°,901235! ##"&547!5654&#"&54654'4#"62654&#"2654'#"&'.\y«,,jJIk,ýõHR:9SF!mŽž=xInGEGÔO##""/D9)(9DztYH"¸3þÓþÿ4CJklIE2$ e8MJ7U%<9}SzþÇÀÊdN 7+j|Y´…þµ#! "pC/ *=9'.DYÿ¸..7?K²*+²+´++°/2²+´+°/´@++°F/´++°$/±é°:/± é°L/°,Ö´'+°'±!+´+²! +³@! +°±+´>&+°>±+´I1+°I±8+´4<+°4±/+°2´ 1+±M+±!'²)*999°°9±8I´ 7:F$9°4²2@999°/±C99±F@³CI$9±°)9°$´!',>$9°±4899± :°2901235! #".54>326=!5654&#"&54654'4#"62654&#".\y«‰p3]E5J)?sýHR:9SF!mŽž=xInGEGÔ":T)!8OztYH"¸3þÓþûqŠ:( .,%+D$ e8MJ7U%<9}SzþÇÀÊdN 7+j|Y´…þsWÿ&.2;õ²7+²++´++²++´,+²++´)+°/´7+°1/±é°$/´ 7+°54&"!5654&#"&546Ô\x¬Ažy}£Z¤×…ýƒr5^0s»‘Ox°mD0þ]GS98SDoƒzsZJ N…yŸÂ‡v¯h2ñ•†*q€þU+X–dcšvZH‰2$ e8MK6T&<9}SzWþu.2EOH²A+²5+´++²5+´6+²5+´3+°/´G++°/´&7+°;/±é°./´ 7+°P/°Ö´$+°$±C+´>+°>±8+´+²8 +³@85 +°±+´0<+°0±+´N+°N±++´1+°I Ö´+±Q+±C$°!9°>°"9°8²@A999°°9°±&99°0°9°².34999°N± 99°I²-999±G³IN$9°&°9°A²KL999±3°@9°;@ $+08>C$9± .°"90123&54632#"&547# 47!2>54&"!5654&#"&5462654&"Ô\x¬Ažy}£.?`CB`yŸý’r5^!t¿—Sx°mD0þ]GS98SDoƒÐN97R7zsZJ N…yŸÂ‡ÃqT6C_`B!ñ•†*q€þU+X–dcšvZH‰2$ e8MK6T&<9}Szý=9')77)'WþK.2DP`f²@+²5+´++²5+´6+²5+´3+°/´Q++°Y/´E+°/´&7+°;/±é°./´ 7+°a/°Ö´$+°$±B+´=+°=±8+´+²8 +³@85 +°±+´0<+°0±+´^+°^±H+´V+°V±++°T2´1+´+±b+±B$°!9°=°"9°8²?@999°°9°±&99°0°9±^³.34$9°Hµ -NQY$9°V°9±E³T^$9°&´HNV\$9°@±K99±3°?9°;@ $+08=B$9± .°"90123&54632#"&547# 47!2>54&"!5654&"&5462654&#"2654'#"&'Ô[y¬Ažy}£Œ2FjKIk lý’r5^!t¿—Sx°mD0þ]GSrRDoƒä"#!!/D9*(9 CzsZJ N…yŸÂ‡Êr];KijJ$ñ•†*q€þU*Y–dcšvZH‰2$ e8MJ7T&<9}Szýƒ""!!pC/!*=9'.DYþ„{..T^S²N+°53´A+°H/°;3´U+°/2°)/´+´*+´'+°/´ C+°!/´7+°_/°Ö´+°±K+´\+³\K+´,+°,/´+², +³@,) +°\±+´$1+°$±X+´E+°E±>+´S+°S±+°22´<+´7+±`+±,² 999°°9±$³HUZ$9°X°C9°E±AN99°>±('99°S±!99°´45;$9±AU¶27>EKRZ$9°N°49°)±99±'±99°·$,$901"&546323&54632'654&#"!5654&2654'7#"&=4#"#"&54632!2654'-9SF!mT\y­A¡wsž´!‚kSVrD1þ]HRg$2Z$s!%J>MpNG;/´\+°O/´f+°/2°f´a++°)/´+´*+´'+°/´ C+°!/´7+°p/°Ö´+°±R+´m+³mR+´,+°,/´+², +³@,) +°m±+´$1+°$±i+´L+°L±E+´Z+°Z°c Ö´A+°A/´c+°Z±+±2^22´<+´7+´;+±q+±,² 999°°9±$³Ofk$9°i°J9°L±HU99°E±('99±ZA±!99°c°C9°@ /459>\`$9±a\±A;99±fO±9C99°H¶27ELRYk$9°U°49°)±99±'±99°·$,$901"&546323&54632'654&#"!5654&2654'7#"&547&=4#"#"&54632264&"%2654'-9SF!mT\y­A¡wsž´!‚kSVrD1þ]HRg$2Z$s>=J32K+KpNG;/´b+°j/´`+°\/´/+°r2°)/´+´*+´'+°/´ C+°!/´7+°|/°Ö´+°±Q+´y+³yQ+´,+°,/´+², +³@,) +°y±+´$1+°$±u+´L+°L±E+´X+°o2°X´A+°A/°X±+°22´<+³g+´Z+°Z/´g+°´7+°7°; Ö´e+°e/´;+±}+±,² 999°°9±y°O9°$²rw999°u±JN99°L±HT99°E±('99±XA±!99°Z@ /5>C4^bj$9°°99±\`·A;ONegmo$9°/±9C99°H¶27ELQWw$9°T°49°)±99±'±99°·$,$901"&546323&54632'654&#"!5654&2654'7#"&547&=4#""&546324#"322654'#"&'%2654'-9SF!mT\y­A¡wsž´!‚kSVrD1þ]HRg%1Z$s=GR89S6EpNGvDx]Ek…+..+*$4*!- 4þÆ%R5%6I6T":4|RvpXG N€vš¥uÃH;9™WzsVG….!c7KýŠT/c6'=Šj1)Q8RR8E*']7uB[D_bF]wT>:tm++-U2$".,$2ïC&a3T&9Vþ*Ê/EQ]$²+´)++°/´R++°$/±X33´++°C/´F++°//±0é°L/´=7+°7/´7+°^/°Ö±Oé°2°O´'&+°'/°O±!+´[+°[°@ Ö±Ié°I/±@é°[±3+±,U22´<+° 2´+°2²3 +³@30 +±_+±O'°;9°I³)=C$9±@!±#799°[°9°3²*999°± 99±$R±!99±°'9±FC±, 99±0/´ @IO$9±=L²3;999014632#!"3!##"&547#"&543!254+53254'&#"632#"&2654&#"2654&#"V¶‘nQkFI-1Rþù&99&§&#/.FB_!ŽDZ¡ÿoZ((W[BIXBH,?>XZBPZ¨*+! ,-8(87)(89%€Š$0_O [<+0&@%C,8B10aB9+I?ˆVSJH:',M8U=?Mm*)!*(!+ýÉ8()78('9VþÊ/COZj;²+´(++°/´[++°c/´Q+°#/±V33´++°A/´D++°./±/é°J/´;7+°6/´7+°k/°Ö±Mé°2°M´&&+°&/°M± +´h+³ G+±>é°h±S+´`+°`±++±2^22´ <+°2´+°2²+ +³@+/ +±l+±M&°99°G³(;A$9±h ±"699±S>·)Y[cf$9±+± 99±#Qµ ^`fh$9±°&9±DA±+ 99±/.´ >GM$9±;J²29999014632#!"3!##"&547#"&543!254+53254.#"632#"&2654&#"2654&#"2654'#"&'V¶‘L‚\FIgIþù&99&§.+iKIl,tDZ¡ÿoZ((WOd3]†,?>XZBPZ¨*+! ,. 0#$"Ö±‰é°P2°‰´ &+° /°‰±ƒ+±8é°8±%+°,2´I<+°E2°I±+°V2±}é´&+°i2² +³@ +°}±w+´n<+°n±[+°b2´ <+°2±+±‰ °39°ƒ³"5M;$9°8°09°%³#(AL$9°I°G9±²T999±w}³Xkq$9°n°f9°[³Y^$9° ° 9±S°9°M± V99±€;³% I[$9±)(@ 8>Gnw}ƒ‰$9±5†µ,3Ebi$9014632#!"3!!"'!"&543!254+53254.#"632#"&54632#!"3!&543!254+53254.#"632#"&2654&#"!2654&#"î¹I„^GI.3Oþß%88%Àþ5K.ýøEY¡ÿoZ((WOd3]†*A>XZBPZ¸Jƒ]FIhHþù&99&ç nY++VNe2]‡,?>WZBPZ©+,! -.ý‰*+! ,-%Ž&U;O [:,0( %D++H@‹TSJH$2WI8U=?MmW€%V;O [BT'!%'‹TSJH#3WI8T>?Mm**!*)!+)!*(!+Vþ&c2˜¤βZ+°3´-++°e2°/´Ž++°(/±#33´`++°2°`±“é°G/°3´™++°‚2°3/°j3±4é°l2°Ÿ/°ˆ3´A7+°y2°;/°s3±Né°2°¥/°JÖ±¢é°]2°¢´+&+°+/°¢±œ+±Dé°D±0+°72´V<+°R2°V±+°c2±‹é´&+°w2°‹±!+´–+°–°| Ö´…<+°…/´|<+°–±h+°o2´ <+°2°‘ Ö´+²‘ +³@ +±¦+±¢+°?9°œ³-AZG$9°D°;9°0³.3NY$9°V°T9±²&'a999±…‹³ey$9±|!±#s99°–°9°‘´flk$9±h± 99±“ޱ!99±`(°&9°Z±+c99±™G³0 Vh$9±43@ DJT|…‹œ¢$9±AŸµ7?Row$9014632#!"3!##"&547#"'!"&543!254+53254'&#"632#"&547632#!"3!&543!254+53254'&#"632#"&2654&#"264&#"2654&#"î¹lRmGI.3Oþß%88%À1%aCB_$žK.ýøEY¡ÿoZ((W[BIXBH*A>XZBPZdX‹mRkFIhHþù&99&ç nY++V\AHXBI,?>WZBPZ©+,! -.-)77)'88üƒ*+! ,-%Ž'0_O [:,0( %D,;C`aB:-++H@‹TSJH:',M8U=?MmW†FA'0_O [BT'!%'‹TSJH9'+N8T>?Mm**!*)!+ýÅ7R78('9;)!*(!+Vþc2|ˆ‘¡­ѲW+°3´,++°b2°/´’++°š/´Š+°'/²"Ž333´]++°2°E/°z3´¢++°}2°2/°g3±3é°i2°¨/°ƒ3´?7+°t2°:/°p3±Ké°2°®/°HÖ±«é°Z2°«´*&+°*/°«±¥+±Bé°B±/+°62´S<+°O2°S±+°`2±†é´&+°s2°†± +´Ÿ+°w2°Ÿ´€<+°€/°Ÿ±Œ+´—+°—±e+±l•22´ <+°2´+°2±¯+±«*°=9°¥³,?WE$9°B°:9°/³-2KV$9°S°Q9±²%&^999±€†´btuz$9±Ÿ ±"p99°Œ@ cih’š$9±e± 99±'е •—Ÿ$9°]°%9°W±*`99±¢E³/ Se$9±32@ BHQw€†¥«$9±?¨µ6=Ols$9014632#!"3!##"&547#"'!"&543!254+53254.#"632#"&54632#!"3!&543!254+53254.#"62#"&2654&#"264&#"2654'#"&'2654&#"î¹I„^GIiGþß%88%À+-jJIl.’K.ýøEY¡ÿoZ((WOd3]†*A>XZBPZ¸Jƒ]FIhHþù&99&ç nY++VNe2]‡,~VZBPZ©+,!..0""!?Mm*)!*)!+þ"0!!0’D. *=9'.D])!*(!+Yÿ37ALì°/´B++°$/´17+°8/´7+°M/°(Ö´-+°-±5+´;<+° Ö´J+°;± +´ 1+° ±?+´&+³?+´E+°E/´+±N+±-(°9°²*+999°5°9°J°9°;³"1$3$9° °H9° µ =BG$9°E±899±$B¶  G$9°1°9°8³(5=$9°°+9012#"'&547&'732654'#"'&547327&546"654&2654&"ÔP]38b 6J//EC/0V++0?\mJ)*\X'IJGjG=.L: l,9ý^8')77)'8Zþì32<HX%°/´I++°Q/´=+° /´+7+°3/´7+°Y/°#Ö´(+°(±0+°2´6<+° Ö´V+°6°F Ö´T+°T/´F+°6±+´1+°±@+´N+°N±:+´&+°L Ö´ +±Z+±(#°9°²%&999±V0² +999°T°.9°6°9°°9±F¶ 8=CIQ$9°@±399°N°9± =@  CLNTV$9°+°9°3´#(08$9°°&9012"&547&'732654'#"&5473263&546"654&2654&#"2654'#"&'ÔQ\yTFck”j\/+09(.CGþˆƒ2)OYahqh²K+´[+°@/±/<33´i+±4g22°n/±8c33´F+±*^22° /´++°/´"++°P/´++°r/°Ö´+°C Ö´p+°±m+°G2´e+°]2°e±' +´S<+°S±b+°_2´:+°N2°:° Ö´1+°/´1+°:±W+´&+°-2°´6+°6/±s+±p° 9°m³@i$9°e±>99°S@  "%C$9±³ $9°"°9°P´'U$9°°9012#"'732654'#"&5473263&5462#"'53254+#"'#"&546;54632"654&"3545#32'265'#"ÔO`|S_>m3,/>!3a‹[3GWF 2o~6Fj ,ž3@(IGöJ.]OJd3 6DO6B uZgF''ZBOGEFbý@;3x5B7 ¤AAB32? 9LM8 |9-I6 e+5ýß0# "l q C7BPþˆƒ2)3cls|¯°U/±=Q33´t+°r2´B+°G/´H+°y/±Mn33´Z+±4h22°d/´_+° /´++°/´"++°*/´++°}/°Ö´+°X Ö´{+°±x+°[2´p+°g2³'px+´-<+°p±m+°i2´O+°b2³Om+´1+°/´1+°O±1+´&+±7:22²1 +³@1G +°´K+°K/°´D+°D/±~+±{° 9°x´Ut$9°'°S9±-p· "%dr$9°±Q_99°m°/9°°9°O²*?999°1²=@B999±D°99±BU²;?S999±Gt²D@W999°H²:9{999°y±7X99±³ $9°"°9°*´'/$9°°9012#"'732654'#"&5473263&546"654&2#"'73254+53254'##"'#"&46;54632'"354&5#32#265'#"ÔO`|S_>m3,/>!3a‹[3GWF 2oP/>,ž3#$93#% **8 ƒJ:07D4L=8H† (‘))‘JGøL.]OJd3 6DO6B uZgF''ZBOGEFbD9-I6 e+5ý„&& @'.1 ¤..Bf> ;KN8 [/# !/šq#C8A'ýúž2)3lsz‚±°B/´N+°b/°^3´‚+°w2³U‚b+´V+°/±[y33´i++±7r22°p/´4+°G2° /´++°/´"++°*/´++°ƒ/°EÖ´J+°J± +´+³f+° 3´+°±{+²'j~222´t+°r2´-<+°t±+´1+°±y+°m2´\+°72°\±R+°Y2´>+°:2²R> +³@RU +°>° Ö´1&+°1/´&+±„+±f°G9°²H999°{±b99°tµ "%`$9°-°9±·/4BN^pw$9±\y±*99±R°<9±Ub²>R`999±V‚±<{99°³EJ:f$9±4p°H9±³ $9°"°9°*´'/$9°°9012#"'732654'#"&5473263&546"654&232#"&54732>54+53254+#"'#"'&546;>4&#"3327#4&5#"2ÔO`|S_>m3,/>!3a‹[3GWF 2oP/>,ž3p7Gw! XvD³±f VfI‹/ZI%$:{9#3+A1Cv#=}}!=}<AR.]OJd3 6DO6B uZgF''ZBOGEFbD9-I6 e+5þX;\./2E„‹])E€†8%-!&7&°//%&,2H=U.RE*EsC5rþ¨2)3]dlr|™°R/±IN33´{+°c2°w/±`m33´W+±Ai22°e/°?3´Z+°42° /´++°/´"++°*/´++°}/°UÖ´y+°y±+´+°±v+°W2´o+°h2°o±'+´-<+³r-'+°j3´b+°-±+´1+°±^+´F+°F±<+´7+³7<+´1&+°1/´&+±~+±² R{999±ov²P999°'°9°r· "%NZe$9°-°9°°L9°b±/\99°³ADI$9°^±*99°F±4?99°1°:9°<°99±{R°:9°w³FPUL$9°W±<799°e°\9±³ $9°"°9°*´'/$9°°9012#"'732654'#"&5473263&546"654&2'654&#"3232#"&'#"'#"&547>3264+2"354#254&5#"32ÔO`|S_>m3,/>!3a‹[3GWF 2oP/>,ž3 S^ZC>8Ip71&GC5-2†<9S&ABXÓ$‚‚‚º@+'.]OJd3 6DO6B uZgF''ZBOGEFbD9-I6 e+5þnX}?$/ij999°²bg999°x±*99°d±]@99°1±MN99°R±KP99±H°F9±‘4°M9°U@ 7HRNdjnx‰$9±V°F9±p9²>DZ999±³ $9°"°9°*´'/$9°°9012#"'732654'#"&5473263&546"654&"&547>32632#"'53254+532654&#"3232#"&'#"'"3544'&#32'5#32'4&5#"32ÔO`|S_>m3,/>!3a‹[3GWF 2oP/>,ž3þ‚+0ƒ=7M)Z<-;##1'-* A,i m61&?Bl$Œ+,*Œ@?µ?,%.]OJd3 6DO6B uZgF''ZBOGEFbD9-I6 e+5ü™I3r@UGG B>?*: :.95 $Wt6F,G==G/ OË$ noq657AýüÊ2)3u{ƒ‰“ô°A/´K+°l/±dh33´’+±‚ˆ22°Ž/±~„33´q++±\z22³SqŽ+´R+°X/°x3´7+±Ft22° /´++°/´"++°*/´++°”/°DÖ´I+°I±+°o2´+´+°±Š+°q2´†+°z2°†±'+´-<+°-±„+°v2´+±\22° Ö´1+°±|+´a+°a±O+°V2´?+°;2²O? +³@OS +³?O+´1&+°1/´&+±•+±I°F9°°G9°° 9°Š³l’$9°†±j99±-'@  "%htxˆ$9°„±AK99±±4/99°²_d999°|±*99°a±X799±?°=9±’l²?fj999°RµOao|Š$9°Ž±=99±qS±ID99°X²;V4999°7°G9±³ $9°"°9°*´'/$9°°9012#"'732654'#"&5473263&546"654&>32!"&547!27654+53254#"3232#"'#"'#"&547>324#"34+2'#32'4&5#"32òO`|S_>m3,/>!3a‹[3GWF 2oP/>,ž3jL(/(6 þļ¸<$3DZEl"T%)c2,1 96,(.v73E 83n€> J€n86£ 7$ .]OJd3 6DO6B uZgF''ZBOGEFbD9-I6 e+5ýÖ)#BLCÁ›®b]'MKþî&S:@>G+r4G??66J1q=SLOt2ckl302<Wþèƒ2)3Q%°B/´C+°=2°J/´7+° /´++°/´"++°*/´++°R/°Ö´+°±4+´M+°M±'+´-<+°-±G+´;+²G; +³@GB +°;° Ö´1+°/´1+°;±>+°12´A+´&+±S+±° 9°4±99°M±P99±-'@  "%7JO$9±G²/=999±>;±*99±JC²;4P999±µ ?@$9°"°9°*´'/$9°°9012#"'732654'#"&5473263&546"654&463233!532654&#"&ÔO`|S_>m3,/>!3a‹[3GWF 2oP/>,ž3þÐN52&$uBþÙ+&' D.]OJd3 6DO6B uZgF''ZBOGEFbD9-I6 e+5ýy4I$#4-8þ’6,"#Wþƒ2)3\fc°G/´]+°M/´N+°=2°U/´7+° /´++°/´"++°*/´++°g/°Ö´+°±4+´X+°X±'+´-<+°-±J+°2´d+²Jd +³@JM +°J´1+°R Ö´;+°d±>+°12´A+°D2´&+°A´`+°`/±h+±° 9°4±99°X±[99±-'@  "%7UZ$9±dR±/L99°±=99±>;µ*G]ab$9±A`°B9±M]³DJAa$9°N°B9°U²;4[999±µ ?@$9°"°9°*´'/$9°°9012#"'732654'#"&5473263&546"654&463233##"&547!532654&#"&264&"ÔO`|S_>m3,/>!3a‹[3GWF 2oP/>,ž3þÐN52&$uBJ32KþÜÙ,&' D&,,<++.]OJd3 6DO6B uZgF''ZBOGEFbD9-I6 e+5ýy4I$#4/;þ’$-3JK2/"3/"#ý*<-,*Wýýƒ2)3[cs¦°F/´d+°l/´b+°L/°@3´M+°<2°M´^+°T/´7+° /´++°/´"++°*/´++°t/°Ö´+°±4+´W+°W±'+´-<+³I-'+´q+²Iq +³@IL +°-±Q+´:+°:° Ö´1+°/´1+°:±=+°12´@+°C2³i@=+´\+°\/´i+°=´&+°@´g+°g/±u+±° 9°4±99°W±Z99±I'· "%7TY$9°-°9±q°K9°´/<`n$9±\:¶*F^bdl$9±@g°A9±^bµICgioq$9±TM²:4Z999±µ >?$9°"°9°*´'/$9°°9012#"'732654'#"&5473263&546"654&463233##"&547!532654&#"&4#"322654'#"&'ÔO`|S_>m3,/>!3a‹[3GWF 2oP/>,ž3þÐN53IuB$&S89R&þîÙ+&' DC,--,+$4 +!, 5.]OJd3 6DO6B uZgF''ZBOGEFbD9-I6 e+5ýy4IH3/;þ’)78SS87)3/"#™++-V4$".,$4Wþ„ƒ2)3]fp²@+°D3´4+°P2°W/´^+° /´++°/´"++°*/´++°g/°<Ö´7+°7° Ö´+°/´+°7±Z+´e+°' Ö´-<+°e±a+´T+³Ta+´1+°/´1+°T±M+´H+°H³H+´1&+°1/´&+±h+±<° 9±Z7´9:$9±e'³ 4@$9°-´"%\$9°²W^c999°a²/BR999°±P99°T²*D999°1±JK99±^W±K999°4¶7m3,/>!3a‹[3GWF 2oP/>,ž3å3BD$Y-6[3:P0+Z#EG3=D78@@ D ?=.]OJd3 6DO6B uZgF''ZBOGEFbD9-I6 e+5ýÚQ9Y5(BzH8??7IzB)4Y6T7i8\V>c:þ8%O5+Y]Wýý2)3nv™²k+°43´_+°Q2°C/´@+°+°±'+´-<+³s-'+´[+°[/´s+°-±o+´U+³Uo+´1+°/´1+°U±N+´7+°7° Ö´1&+°1/´&+±x+±F° 9±[>¶<Ide$9±s'³ _k$9°-´"%]$9°³Xmqu$9°o°/9°±S99°Uµ*4;JQ$9±7±AB99±<@°F9±uX°d9°_·7SN[Ubgq$9±³ $9°"°9°*´'/$9°°9012#"'732654'#"&5473263&546"654&2+"3!!"&546;27654&#"#"&547&#"&54763264'32ÔO`|S_>m3,/>!3a‹[3GWF 2oP/>,ž3'Pd57Pö66ªþN-??-õ;(&F8 7R0 <@@<.]OJd3 6DO6B uZgF''ZBOGEFbD9-I6 e+5þfQZ24'-57+*5#"D9G6A9JI:?981J +.jN+$±8&*4MWýÿŒ2)3t|ѲF+°J3´;+°n2°Z/´W+°S/´`+°4/´{+°g/´h+° /´++°/´"++°*/´++°}/°BÖ°2´=+°] Ö´U+°2°=±'+´-<+³y-'+´7+°7/´y+°-±u+´r+°r° Ö´1+°/´1+°r±c+°l2´P+°L2°P° Ö´1&+°1/´&+°X2²1 +³@1g +±~+±=]° 9±7U¶?@S`$9°'°F9°y² ;999°-´"%9$9°³4Hw{$9°u°/9°±p99°r²*J999°1²Ran999±c°N9±SW°]9±4`°@9°{²?Pc999±hg´7Nruy$9°;¶9=BLlpw$9°F°H9±³ $9°"°9°*´'/$9°°9012#"'732654'#"&5473263&546"654&"&547&#"&547632632#!"3!!"&5463!254&+532654#"74'32ÔO`|S_>m3,/>!3a‹[3GWF 2oP/>,ž3–5>> •G`=7L:$(C©++ŒþÓ88°þG-?@,-Y !_(4D6A:=.]OJd3 6DO6B uZgF''ZBOGEFbD9-I6 e+5üæF7G2hJ!+0iJ-&k@:h(-47*)70:;:=7F}6*%;Gþl$2)3{ƒ‹Á²@+²DHL333´4++²Xeo222°^/±iu33´‚+°Š2° /´++°/´"++°*/´++°Œ/°<Ö´7+°7±x+´ˆ+° Ö´+°ˆ±„+´r+°r±j+´i+°-2°i´'<+°'/°i±a+´€+°€³€+´1+°/´1+°€±|+´[+°1 Ö´&+°[±U+´P+±+±x7±9:99±ˆ²4@z999°° 9°„µBu†Š$9°r²Dp999±j'± 99°i´"%F$9±€a´/Hce$9±|µ*J^~‚$9°1°Y9°[°L9°°S9°U°R9±‚^±S999°4@ 7m3,/>!3a‹[3GWF 2oP/>,ž3þY,84%E(.Q'7>L*/F)&F#2:,08.232 *</7.243 ·//0.þ¶1.0/.]OJd3 6DO6B uZgF''ZBOGEFbD9-I6 e+5ýÎW5g,-:‹M:A77A9N‰<.,f5W-þù;mm3,/>!3a‹[3GWF 2oP/>,ž3þ•&/9#N"+M3BP$3C'($,[þ%))|ý~)44)Øz5*&6)+3( '@,'6)+3(¥())(þ¸(()'.]OJd3 6DO6B uZgF''ZBOGEFbD9-I6 e+5ýÒ?*M#09k>.92289KT8B& =4)+82L,K1QO3L+&ÃÃ%-I1PN3J,w-+$4EF.)$3D ýìú2)3”œ¤3²@+²DHL333´4+²p~‡222°]/´Z+°U/´d+°w/±‚Ž33´›+°£2°j/´k++° /´++°/´"++°*/´++°¥/°`Ö°<2´X+°72°X±+´+°°¡ Ö´‘+°‘/´¡+°±+´‹+°‹±ƒ+´‚+³-‚ƒ+´'<+°'/´-<+³‚ƒ+´1+°‚±z+´™+°™±•+°12´t+´&+°t±g+°n2´R+°N2²gR +³@gj +±¦+±X°:9°‘²9Vc999°² 4“999°¡°@9°´BŽ$9°'²D‡‰999°‹°9°ƒ³ "%$9°-°9°°F9±z‚°/9°°9°™´*H|~$9°•±Jw99°t²Lpr999°°d9°g°U9°R²P[\999±UZ°`9±wd°:9°›²Rg9999±kj@ <7Ptz‹‘•™¡$9°4¶Nr|‰“—Ÿ$9°@²BFJ999±³ $9°"°9°*´'/$9°°9012#"'732654'#"&5473263&546"654&"&547632632632632#"3!!"&5463!2654+53254#"#"&547&#"#54&#"#"&547&4'32%4'32èO`|S_>m3,/>!3a‹[3GWF 2oP/>,ž3þ‘%-.F!)I!1BD)2‹4-ýê))sý‡)05(  ["3'(2&'8.#4&)1&›$*(&þÅ&((&.]OJd3 6DO6B uZgF''ZBOGEFbD9-I6 e+5ýÕA+Q%*;i=0933q964I%$;4+)9**A/51G0TS1I/)¿¿+-K/VR3D4z;"";FF;#"?D$9±³ $9°"°9°*´'/$9°°9012#"'732654'#"&5473263&546"654&2632'654&#"#54&#"&5476ÔO`|S_>m3,/>!3a‹[3GWF 2oP/>,ž3ü%; RO\y X=2%C*1:\'w/..]OJd3 6DO6B uZgF''ZBOGEFbD9-I6 e+5þ&DnLŠ93)l4C0ææ/H4j'29ˆL87Wþ†ƒ2)3\iz²Y+°43´M+°E2²MY +³@MI +°:/°S3´`+´BfIY +´B+° /´++°/´"++°*/´++°j/°UÖ´P+°2°P´+°/°P±I+´H+°H°- Ö´'<+°'/´-<+°H±>+´]+°]° Ö´1+°/´1+°]±b+´7+°2°7´1&+°1/±k+±PU° 9°'¶MRSY$9°I²" 999°-³%[$9±>°/9°²4E999±1]µ*:C`f$9°b°d9±`:°R9°f³7PU>$9±YM°[9±³ $9°"°9°*´'/$9°°9012#"'732654'#"&5473263&546"654&2#"'&54763&#"#54&#"&54763263254'&#"ÔO`|S_>m3,/>!3a‹[3GWF 2oP/>,ž3:PjD;4!8 4V6&*5Hf**FD"VD(.]OJd3 6DO6B uZgF''ZBOGEFbD9-I6 e+5þuSHg,(38)2"Nâå-L0c*4:…M77:9ë1f ýö¢2)3kwв7+°;3´d+°\2°D/´I+°S/°j3´o+° /´++°/´"++°*/´++°x/°4Ö´g+°g±+´+°i2°±`+´_+³'_`+´-<+°_±V+´l+° Ö´1+°l±q+´Q+°Q±L+´@+³@L+´1&+°1/´&+±y+±± j99°`´7d$9°'°99°_± 99°V²"%999°-°9±l³/;F\$9°±G99°q·*DISZou$9°Q±=O99±ID°F9°S°G9°o²_`i999°d@ =@L4QVOgu$9°7°99±³ $9°"°9°*´'/$9°°9012#"'732654'#"&5473263&546"654&4632632#"'732654&'#"&54767&#"#54&#"&%3254'&#"ÔO`|S_>m3,/>!3a‹[3GWF 2oP/>,ž3þWF@#Ft FH23O2/"%:I' k/80;P6(+8Ge~8"+.]OJd3 6DO6B uZgF''ZBOGEFbD9-I6 e+5ýXNp22R nWbBD#4hC.O! ¤U7820Méé -L1f,4=P2\3%?þ¶2)3bR°P/±?H33´[++±4_22²P[ +³@PK +°C2° /´++°/´"++°*/´++°c/°XÖ´S+°S±+´+°±L+´K+³'KL+´-<+°K±D+´C+°C° Ö´1+°/´1+°C±<+´7+³7<+´1&+°1/°:3´&+±d+±² UV999°L´P[$9°'°]9±-K· "%H_$9±D°/9°±a99°C±*99°1±4?99°<°99±[P±]a99±³ $9°"°9°*´'/$9°°9012#"'732654'#"&5473263&546"654&2'654&#"#54&#"#54&#"&546326326ÞO`|S_>m3,/>!3a‹[3GWF 2oP/>,ž3DTc>6+ :'=:&*3CaTE8"";;"".]OJd3 6DO6B uZgF''ZBOGEFbD9-I6 e+5þpL98&m0F2éé,Jéé.I0i(59‹Mq3333!þwÇ2)3it†²b+±4f33´W++±EN22²Wb +³@WS +°I2°:/´o++´AjSb +´A++° /´++°/´"++°*/´++°u/°_Ö´Z+³Z_+´+°\2°Z±S+´R+³'RS+´-<+°R±J+´I+°2°I´1+°/°I±=+´m+°m±1+´&+°±q+´7+±v+±Z± ]99°S´Wb$9°'°d9±-R· "%Nf$9±J°/9°I±h99°=±*99°m±4E99±1´:ACjo$9°q°s9±o:°\9°j³7Z_=$9±bW±dh99±³ $9°"°9°*´'/$9°°9012#"'732654'#"&5473263&546"654&2#"&54>323&#"#54&#"#54&#"&546326326"3254'&ÔO`|S_>m3,/>!3a‹[3GWF 2oP/>,ž3K`=3-41"$#26"8"&-D _MB5 #2<*‚+: .]OJd3 6DO6B uZgF''ZBOGEFbD9-I6 e+5þ{TCqO5(H3,"ëë//ëë1L0l'69Nt5555 3McýÃÓ2)3xƒ°²7+±;?33±qé±`i22²q7 +³@qm +°d2°I/´N+°X/°w3´|++° /´++°/´"++°*/´++°„/°4Ö´t+°t±+´+°±m+´l+°l±e+´d+³-de+´'<+°'/´-<+°e° Ö´1+°d±[+´y+°y±~+´V+³~1+´&+°V±R+´E+±…+±´ 7qvw$9°m±99°l±999±e'¶ "%;i$9°-°9±d±/=99°[°9±y´*?K`$9°1¶ILNX^|€$9±V~±AT99±NI°K9°X°L9°|°v9°q@ AER4V[^Tt€$9°7±9=99±³ $9°"°9°*´'/$9°°9012#"'732654'#"&5473263&546"654&4632632632#"'732>54'#"&5467&#"#54&#"#54&#"&%3254'#"ÞO`|S_>m3,/>!3a‹[3GWF 2oP/>,ž3þG@0867e;!I/-' 0.[*.,("(737$)B[å) ".]OJd3 6DO6B uZgF''ZBOGEFbD9-I6 e+5ýBQ2233X A@T:sS'=$@T)u$ ´`;>e 0þþ0Nþþ1P0x%/´9+°D/´4+° /´++°;2°/´"++°*/´++°O/°Ö´+°°G Ö´L+°L/´G+°±'+´-<+³A-'+´7+²A7 +³@A> +°-±+´1+°±:+°12´=+´&+±P+±L° 9°G°9°'µ4DIJ$9°A´ "%$9°-°9±7±/999°°9°:±*99±9>±?I99°D³7AGL$9±³ $9°"°9°*´'/$9°°9012#"'732654'#"&5473263&546"654&233!5654&#"&546ÔO`|S_>m3,/>!3a‹[3GWF 2oP/>,ž3ù>U§Aþº23"!31QX.]OJd3 6DO6B uZgF''ZBOGEFbD9-I6 e+5ýùL;-þ™"4!..02'S7PWþƒ2)3Ydo°C/´Z+°H/°=3´9+°O/´4+° /´++°;2°/´"++°*/´++°e/°Ö´+°°R Ö´W+°W/´R+°±'+´-<+³L-'+´7+²L7 +³@LI +°-±F+°2´b+°2´1+°b±:+°12´=+°@2´&+°=´]+°]/±f+±W° 9°R°9°'µ4OTU$9°L´ "%$9°-°9±7F²/9H999±:µ*CZ_`$9±=]°>9±HZ³@FU_$9°9±JT99°O³7LRW$9±³ $9°"°9°*´'/$9°°9012#"'732654'#"&5473263&546"654&233##"&547#5654&#"&5462654&"ÔO`|S_>m3,/>!3a‹[3GWF 2oP/>,ž3ù>U§AJ32Km23"!31QX+*+<+*.]OJd3 6DO6B uZgF''ZBOGEFbD9-I6 e+5ýùL;-þ™"-2KK2-""4!.,02'S7Pþm*,,*Wýýƒ2)3Yaq°°C/´b+°j/´`+°\/´:++°O/´4+° /´++°;2°/´"++°*/´++°r/°Ö´+°°R Ö´W+°W/´R+°±'+´-<+³L-'+´7+°o2°7´F+°F/²F7 +³@FI +°L° Ö´1+°-±:+°12´=+³g=:+´Z+°Z/´g+°:´&+°=°@ Ö´e+°e/´@+±s+±W° 9°R°9°'µ4OTU$9°L´ "%$9±-F°9±7²/9H999°³^lm$9°Z¶*C\`bj$9±=e°>9±\`µF@egmo$9°:µ=>HJTU$9°O³7LRW$9±³ $9°"°9°*´'/$9°°9012#"'732654'#"&5473263&546"654&233##"&547#5654&#"&5464#"322654'#"&'ÔO`|S_>m3,/>!3a‹[3GWF 2oP/>,ž3ù>U§A%Q9:Q%^23"!31QXK,--,+%2 +!, 5.]OJd3 6DO6B uZgF''ZBOGEFbD9-I6 e+5ýùL;/þ™(89RQ:8("4!.,02'S7PþÐ++-V3%".,$4Wþƒ2)3:BJ"²9+´C++°6/´A+° /´++°/´"++°*/´++°K/°Ö´+°±6+´G+°G±'+´-<+°A2°-±I+´?+°?° Ö´1+°/´1+°?±B+´5+³15B+´&+±L+±° 9°6±99°G°9±-'¶ "%C$9±I°99°²/=999±B?±*99±CA±?G99°9°=9±³ $9°"°9°*´'/$9°°9012#"'732654'#"&5473263&546"654&!54324'3'"654ÔO`|S_>m3,/>!3a‹[3GWF 2oP/>,ž3Aþ“¹´=Mdš+,€.]OJd3 6DO6B uZgF''ZBOGEFbD9-I6 e+5ýPª§ÉÆl"&]W÷M8kVZ@WýÃ2)3EMVbq²=+´P++°4/´W+°]/´M+° /´++°/´"++°*/´++°c/°Ö´+°±:+´U+³'U:+´-<+°U±7+´`+°`±N+´J+°J° Ö´1+°/°93´1+°H2°J±M+´@+°C2°@´Z+°Z/³1@M+´&+±d+±° 9°:²999±7U´ "%$9°-°9°°P9°`°L9°N±=/99°°9°J´*4W]$9±@1°A9±]W±C799°M³:@A9$9°P±JU99°=°H9±³ $9°"°9°*´'/$9°°9012#"'732654'#"&5473263&546"654&"&547#5432#4'3'4#"62654&#"ÔO`|S_>m3,/>!3a‹[3GWF 2oP/>,ž3,2K‘¹´I Mdšu)"6++++.]OJd3 6DO6B uZgF''ZBOGEFbD9-I6 e+5ûÙK2-#§Éƪ".3Jwl (]W·@%CkUþÔ*,-+Wý¦ƒ2)3EMU]m˜²=+´N++°4/´^+°f/´\+°X/´M+° /´++°/´"++°*/´++°n/°Ö´+°±:+´R+³'R:+´-<+°R±7+´k+°k±T+´J+³JT+´1+°/°93´1+°J±M+´@+°C2³c@M+´V+°V/´c+°@´a+°a/°M°1 Ö´&+±o+±° 9°:²999±R'± 99°7²"%999°-°9±Tkµ=/NLZh$9°°9°J·*4HX\^f$9±@a°A9±X\µC7acik$9°M³:@A9$9°N±JR99°=°H9±³ $9°"°9°*´'/$9°°9012#"'732654'#"&5473263&546"654&"&547#5432#4'3'"6544#"322654'#"&'ÔO`|S_>m3,/>!3a‹[3GWF 2oP/>,ž3&9S&ƒ¹´ &SMdš,+€W+..+*%2 *!- 5.]OJd3 6DO6B uZgF''ZBOGEFbD9-I6 e+5û¼R87)§Éƪ)78R”l"&]W÷M8kVZ@þ,,-V2%".,$3Wþˆƒ2)3MB²;+³;5+´D+°>/´9+° /´++°/´"++°*/´++°N/°Ö´+°°G Ö´L+°L/´G+°±'+´-<+°-±A+´7+³7A+´1+°/´1+°92² +³@> +°7±:+´=+°2°=´1&+°1/±O+±L° 9°G°9°'´4IJ$9°-¶ "%D$9±A±/599°°9°7±*99±9>±?I99°D³7AGL$9±³ $9°"°9°*´'/$9°°9012#"'732654'#"&5473263&546"654&233!5654&#"&54ÔO`|S_>m3,/>!3a‹[3GWF 2oP/>,ž3þã¢i*wCþßSJ87G`~.]OJd3 6DO6B uZgF''ZBOGEFbD9-I6 e+5þlRM),þ—1-T7JL8a"46‚QWýÃ2)3Xb ²;+³;5+´O+°C/´Y+°^/°U3´:++° /´++°/´"++°*/´++°c/°Ö´+°°R Ö´W+°W/´R+°±'+´-<+°-±L+´7+³`7L+´F+°F/´`+²F` +³@FI +°`³`+´1+°/´1+°92°7±:+´=+±@22°=´1&+°1/°=´\+°\/±d+±W° 9°R°9°'´4TU$9°-¶ "%O$9±F°59°L±/H99°`°9±7²*^999°1²CY]999±=\°>9±^Y±F@99°:´=>HJT$9°O³7LRW$9±³ $9°"°9°*´'/$9°°9012#"'732654'#"&5473263&546"654&233##"&547#5654&#"&54264&"ÔO`|S_>m3,/>!3a‹[3GWF 2oP/>,ž3þã¢i*wCJ32KFSJ87G`~,,<++.]OJd3 6DO6B uZgF''ZBOGEFbD9-I6 e+5þlRM),þ—$,3JK2-#1-T7JL8a"46‚Qþg*<-,*Wý§Œ2)3W_o´²;+³;5+´O+°C/´`+°h/´^+°Z/°T3´9++° /´++°/´"++°*/´++°p/°Ö´+°°Q Ö´V+°V/´Q+°±'+´-<+°-±F+°2´m+²Fm +³@FI +°F´1+°92°m±L+´7+°7±:+´=+°2°=´1&+°1/°X Ö´e+°=°@ Ö´c+°c/´@+±q+±V° 9°Q°9°'µ4OST$9°-¶ "%N$9±mF²/5H999°L°k9°±j99°7²*\999°X´CZ^`h$9±=c°>9±Z^µF@cekm$9°9´=>HJS$9°O³7LQV$9±³ $9°"°9°*´'/$9°°9012#"'732654'#"&5473263&546"654&233##"&547#5654&"&544#"322654'#"&'ÔO`|S_>m3,/>!3a‹[3GWF 2oP/>,ž3þã¢i*wC%S89S%:SKnG`~µ+..+*$4*!, 5.]OJd3 6DO6B uZgF''ZBOGEFbD9-I6 e+5þmQM),þ—(68SR96(1-T7JL8a"46‚RþË,,-V4$".,$4#þ}Ô2)3_c°C/´:++°P/°I3´\++°42²P\ +³@PM +° /´++°/´"++°*/´++°`/°XÖ´S+°S±+´+°±M+´L+³'LM+´-<+°L±F+´8+³8F+´1+°/´1+°8±1+´&+°±< +´A+±a+±² UV999°M´P\$9°'°^9°L°9°-¶ "%4I$9±F°/9°°9°8±*99°1²:>C999°°?9±:C°U9°Pµ7^99° °?9±³ $9°"°9°*´'/$9°°9012#"'732654'#"&5473263&546"654&23254'7#"&=4#"#54#"&5476326èO`|S_>m3,/>!3a‹[3GWF 2oP/>,ž3£BPBOT$mŒBEJ:CG',L#f%(FJ.]OJd3 6DO6B uZgF''ZBOGEFbD9-I6 e+5þYEBa„b,3=…ÈeN9VOëëOM0g+7AˆM7=99#ý½Ô2)3hv¤°H/´i+°p/´:++°Y/°R3´e++°42²Ye +³@YV +° /´++°/´"++°*/´++°w/°aÖ´\+°\±+´+°±V+´U+³'UV+´-<+°U±O+´8+°t2³8O+´1+°/´1+°8´K+°K/°8±1+´&+°C2°±< +°l2´A+´E+±x+±² ^_999°V´Ye$9°'°g9°U°9°-¶ "%4R$9±O°/9°K°9±8²*M999°1³:>pr$9°³?Hin$9±pi´KE_lt$9°:²CM^999°Yµ7g99° °?9±³ $9°"°9°*´'/$9°°9012#"'732654'#"&5473263&546"654&23254'7#"&547&=4#"#54#"&54763262654'#"'èO`|S_>m3,/>!3a‹[3GWF 2oP/>,ž3£BPBOT$m;0K32K.;J:CG',L#f%(FJ-:  7*.]OJd3 6DO6B uZgF''ZBOGEFbD9-I6 e+5þYEBa„b,3=…{1%>3JK2:&/k9VOëëOM0g+7AˆM7=99ýë*<  <*#ýÛ2)3hp€Ò°H/´q+°y/´o+°k/°_3´:7+°Y/°R3´e++°42²Ye +³@YV +° /´++°/´"++°*/´++°/°aÖ´\+°\±+´+°±V+´U+³'UV+´-<+°U±O+°K2´8+³8O+´1+°/´1+°O´~+°8±1+´&+±Cv22°´i+°i/°±< +´A+°A°E Ö´t+°t/´E+±‚+±² ^_999°V´Ye$9°'°g9°U°9°-¶ "%4R$9±O°/9°°9°~±*99°8±M{99°1²:>m999°iµ?Hkoqy$9±koµKEtv|~$9°:²CM^999°Yµ7g99° °?9±³ $9°"°9°*´'/$9°°9012#"'732654'#"&5473263&546"654&23254'7#"&547&=4#"#54#"&54763264#"322654'#"&'èO`|S_>m3,/>!3a‹[3GWF 2oP/>,ž3£BPBOT$m:AR79S8=J:CG',L#f%(FJG+--+)$2 *! + 4.]OJd3 6DO6B uZgF''ZBOGEFbD9-I6 e+5þYEBa„b,3=…z1)N7SR8I)+p9VOëëOM0g+7AˆM7=99þL++-U2$".+$2Yþí™-!*—²+°&3² +°/´"++°/´C+°+/°Ö´+°±+´)+°)±+´ +° 2° ´%+°%/±,+±±!99°)±99°¶ "&$9±"± 99°² 99901.54632"&5467'654&#"264&"Re¥z}¡cf`†_@/’~\[|RBÅ(88P9: c}­«ˆT)nBa`C7U4–]„„]Omý8P89N9YþÏ–-!-=Ö²(+°3´++² +°/´.++°6/´"+°/´C+°>/°Ö´+°±+´;+°;±9+´++°+±%+´3+°3±+´ +°1 Ö´ +±?+±°9°;°!9±+9±99°%³.6$9°3° 9±("µ 139;$9°± !99°² 99901.54632#"&5463654&#"2654&#"2654'#"&'Re¥z}¡nXjKIklO|~\[|RB™!#! /D9*)9 C c}­«T5gKijJMg>Ž]„„]Om«!"! qC/#*>9(.DWþƒ–-.w°$/´++°/´++°//°Ö´+°±,+´'+°'±!+´+°±+´ +±0+±!'@  )*$9±³ $901%.54632'>54&"2'654&#"&546Qh©x}¡jP AS¶|RBITn‡cM85Jd „rŠ^x¤ |]Š8jJZ}}ZLjCrU‚76$]8NO7_!76ƒRuWý½–-9Bβ5+´*+°/´:+°/´++°C/°Ö´+°±2+´-+°-±"+´A+°A±'+´8+°8±+´ +³ +´=+°=/´+±D+±"-´/0$9°A²*5999°'· $% :>$9°=°9±*:µ"028>$9±5³ $901%.54632'>54&"#"&547'654&#"&54632264&"Qh©x}¡jP AS¶|RBÏ&3J32KBbN97JcqRSm^,,<++Š^x¤ |]Š8jJZ}}ZLjþm A,3JK2L$#^:OP9`!34‚RrpTS÷*<,,<*Wý›–-9?Oä²5+´*+°/´@+°H/´?+°/´++°P/°Ö´+°±2+´-+°-±"+´M+°M±'+°:2´8+´E+°8±+´ +³ +´C+°C/´+±Q+±"-³0$9°M³*/5$9°'@ $% =@H$9±*?@ "028:CEKM$9±5³ $901%.54632'>54&"#"&547'654&#"&546324"22654'#"&'Qh©x}¡jP AS¶|RBÆ,;Q98SZ bM:7JcqRSm@!;;^E38I'Z$sþcT3!×E5=+,?7tB[>.67/A[=<')A:u.(-c6'=`2U&& Yþàw.NYø²+²+± '33±7é°@2°/´X++°S/´7+°/°!3´07+±,F22°Z/°*Ö´$1+°$±+´<+°±+´4<+³4+±Ué°4±:+±=é°=±C+´I+±[+±$³&',-$9°°.9°°09±:Uµ7SX$9°=±O99°C´ EF$9±SX± 99±7°&9°·$*.3CI$9°0²;TI4Oj‹(O]=h†”:0!b[(jþà=+57?/5`ST|Z’ËPýÞ3P23')2ÔDccD&88&ý:9‡f‡Q GcJIa„i¾²„w?ßþ}*<=+)<<Yÿóhé>¶²'+°3±4é° /´;C+°/´C+°?/°+Ö´01+°0±6+´#&+°#±+´+° Ö´ +°±+´+±@+±60²-'.999±#³ ;$9± °9°±99±4'°9° µ#+07$9°;°.9°°-901"&5473327654'3'654'&#"#"'&547325'47632h\„\H""IÚ¤4Ž)/Q{9@\OYéFP²+´C++²C +³@CE +´7E +°G3´++°A2°´+°%/°K3´17+°<2³1%+´C+°Q/°.Ö´)+°)±!+´5+²!5 +³@! +°5±+°82±Cé°O2°C±G+´A<+°A±D+´&+° Ö´ +°±+´+±R+±!)²+,1999°5°79°°9±GC±=<99± °9°±99±C°,9±7°+9°%³!).5$901"&5473327654'3!5#"'#5654'&#"&54632354762!!354&#"\„\I##HÜý)6,_L+,:8-+I!m€WV@A€LFÚEGþ]3OþÏXMN/.ÔEbbE ''ýº($\9%&%$9R"<6zVt:;UG"Oh@<+°f±^+´D<+°D±5+´41+°4±$+°+2´&+°X2²$ +³@$' +°$° Ö´ +°±+´+±m+±^f±@H99°D±:P99±45°R9°´ /T$9°$°\9± °9°±99±'¶$DL^ef$9°b°>9°(°\9±:@²+RX99901"&5473327654'3#"'5327654+53254'&#"'4'&#"632#"'&5476326324'&#"326Ä\„\I"$HÚ45I;6U+ oYWq1%9D29P3-V=:VUYÿòéT_jq=²$+°3´p++°]2°l/´*++°D/´i+°d/´=+°9/°23´J7+°N2°/´C+°r/°FÖ´g+°( Ö´n+°g±`+´@+°@±6+´51+°5±/+´Q&+°2° Ö´ +°Q´U+°U/°Q±+´+±s+±`n´=D;di$9°@³$9Jp$9°6°*9°5°L9°@ "+2NWY]k$9± U°S9±Q±99±lp´(UY"$9°*±SW99°i±5699°d³/FQ@$9°=°;9°9°L901#"'&5473327654'3#"'&'#"'&54;27654&#"#54#"632#"5476326324#"3264'&#"32#"32/.AB./H##IÔ)(;1%& Mºd(DøÛP6?@5sP“]/6"!2t@;]~7.|W`=?GEG(þ"89.£æÀÔD2112D )'ý˜9)(&YL…"E6@muos$ @/0"!„]1/LLlWQ0*C>>(";@3YÿòÙéhr#²$+²5D333´WC+°b2²W$ +³@W\ +°=/°,3´J7+±Ng22³J=+´C+°s/°FÖ´A&+°A±9+´m&+°m±i+±2é°2±'+´S&+°S±[+´^1+°^±d+´&+° Ö´ +°±+´+±t+±9A±CD99°m°=9°iµ56.JL;$9°2±,N99±[S°$9°^° 9°³bfg$9±±99±W$²Cop999°=@ ' 29AFRdikm$9°J±Lf9901#"'&5473327654'3#"'#"&=4'&#""'&547&#"&5476326323276533254'74'276Ù/.AB./H##IÙ8=mW0%))`Š9:K!5"47ž82z #O54j2„AOŽ;11^hJI,*G.P*~3–üAbj:`ÔD2112D )'þ)tOUK#rXqN55 .NJ6VINIBb™` DC\O2\¼oQd&&>=bwB/-+)6^þ¢5'.Í­G2[ôz[MˆGb9.WÿòéPZe0²1+²%+±@33´X++°c2°^/´:++°5/±,33´F7+±JN22°/´C+°f/°CÖ±aé°a±[+´=1+°=±1+±0é°0±(+´U&+°U±Q+´"<+°"±+´&+° Ö´ +°±+´+±g+±aC±7899°[±:@99°=±5F99±01°H9±U(±,J99°Q³%L*$9°"±N99°±99±± 99±X1°9°^·"(=CQU8$9°:°9°5³*HS$9°F°L901#"&54732654'3'654&#"#"&547&#"#4&#"632#"&546326326324'326%4&#"326]BA]I1H2HØ‹.l€W"!/KkXWhz(?XZf?Tw_HZ`KVdž‚‡FB8@CVv¡þÀpt<84<ýn3*+45*)4ÔCddC&87' þ+½[.K˜Z‰ %FcŠŠ\›cB7þp5D‰ZF^HKef‹¹NN&&«¢rcRƒEdg,;:X<<Yÿò&éA®²+´#7+°*/±=é°7/´27+³27+´C+°B/°.Ö° 2´;1+°;±+´ +°' Ö´1+°42° ±+´+±C+±;.°!9°¶#)*27>$9± '°59±±99±*#² !999±7=²4.599901#"'&5473327654'3#"'7327654+"'&547632&#";2&/.AB./H$"HÙJAe«Y1B@,6ybZ87JAfªY1DŽ?+6yhT59ÔD2112D )) ý¿W-(]5J3I)(JW-(]5J3N#*Yÿóré'6²+±4é°,/´%7+³%,+´C+°7/°!Ö´0+°0±(+´+° Ö´ +°±+´+±8+±0³%,4$9±±99±,4±!9901#"'&5473327654'3#"&5476324'&#"326r/.BA./H##HØUTyw¨TUvxªJ?@YW@>>?XZ~ÔD2112D )) þ2uUT¨vwSS¦wY>>>=ZW>?~WÿðãéPÚ² +±.33±=é°H2°'/´47+³4'+´C+°Q/°0Ö´++°+±#+´9<+°9±A+±Dé°D±L+´&+° Ö´ +°±+´+±R+±#+²-.4999±A9° 9°D°9°³HNO$9± °9°±99±= °-9°'¶#+08L$9°4²BCN999°°O901"&5473327654'3#"'#"&=4&#"&547632327653327654'7ã/.„\I"$HØ?Esw:9qm~H?O/+„*¡2°Q/´h7+°)/°`3´67+°X2³6)+´C+°l/°2Ö´-+°-±%+´:+°:±B+´E1+°E±U+´d&+°d±\+±é° Ö´ +°±+´+±m+±%-²/06999±B:±!"99°E° 9±dU°9°´IQX`h$9± \±LM99±±99±I°/9°Q±: 99°h²-2%999°)²MU999°6±CD9901#"'&5473327654'3#"'"'&54'&#"&54763232765332767#"'&546324'&#"3276 /.AB./H##IÕLP„‘F?Ð87 bR*##¡3?{‡)%$?9%&P?6A[8/ &'%F-,bK^6-`)*'+ÔD2112D )'þV‡\eRQ>=iŠ%aK>W–D:VÀzN]t:¬>-,,.8Qþ?%G=`!20JLbMC(+,!WÿòéQ_ ²1+°&3²A+°3´\7+°V/´9++°4/±#,33´F7+±JN22³F4+´C+°`/°CÖ±Yé°Y±R+´=&+°=±1+±0é°0±'+´&1+°&±+´&+° Ö´ +°±+´+±a+±YC±6799°R±9A99°=±4F99±01°H9°'°J9°&°L9°³#N$9±±99±\1°9°V²=C7999°9±99°4±HL9901#"'&5473327654'3'654'&#"#4'&#"#4#"632#"546326326324'&#"3276/.BA./I"$H×¢'|+0UnP'&<9LU¦Vp+,./Hµ ˆxB;xo?3lqF>ü6)+22*)ÔD2112D ') þ7ÍW=C¦Y8=‡þ¡_A$#FBþ¡_‡ŒWF01EL23÷‰¼MMKKTNî,:,*>Wÿò•éIWײ-+±<33´T++°5/°#3´B7+°F2°/´C+°X/°>Ö´9&+°9±1+´R&+°R±J+±)é°)±+´&+° Ö´ +°±+´+±Y+±19±;<99°R±5B99°J³-%D3$9°)±#F99°±99±±99±T-±;99°5¶)19>N$9°B°D901#"'&5473327654'3'654'&#"#"'&547&#"&5476326324'&'3276•/.AB./H##IÛŒ.m?@Z$9 4;T]51y#(W>=p1‹LW—M36[ƒNGþ¿ !.6 u6ÔD2112D ))þ&»]/L–[CE -TBBWCJD>b¡a BA`—L.[½nU`**_V¡B=> $=>> 5-Wé%.—²+´++°&2² +³@ +°*/´!7+³!*+´C+°//°Ö´1+°±+´.1+°.±&+´1+° Ö´ +°±+´+±0+±.±!*99± °9°±9901"&5473327654'3!335476324&#"\„\H""IÛý Q«FHceHFP`CB^ÔEbbE''ý&þýcEFCBbþüC`bBÿYÿóBé;̲+°/3´7+°"/´#C+°)/´4C+°/´ C+°->qZYrV;j€9F;£Ž[…/MÔDccD&88&ý¯GYI2+XIO-0kh{Ž®WL&G YÿòyéD¦² +°3±/é°:2°/´C+°E/°$Ö´+1+°+±3+±6é°6±>+´1+° Ö´ +°±+´+±F+±3+²( )999°6°9°³:@A$9± °9°±99±/µ$)4@$9°±(A9901"&5473327654'3#"'#"'&54767327653327654'7y/.„\I"$HÙEHvr25lrID*-V&ƒ03T2T$$5R1/„(T/)ÔD21bE ') þ1wQUSTUPs^KR)=?­U7<+)0`þ 3)(@;Rª=='RLYÿòyéC®²)+±433°#/°-3´@7+°<2³@#+´C+°D/°8Ö´11+°1±)+´(<+°(±+´&+° Ö´ +°±+´+±E+±)1²34<999°(°>9°³#@$9± °9°±99±#)´38>$901"&5473327654'3'654'&#"#4&#"&'&547632632y/.„\I"$HÙ)-V%‚12T3RH6Q3-‰-T/*EJuq33mtHCÔD21bE ') þ8^LR);@®V:;&&4þšf4J@+±² !&999°)°+9±<±0899± °9°± 99±+± 99°³#)$901"&54732654'3!5654&#"&5463235463254&#"Q\„]H2H2IÚüüLW:9WK!o€W[{¶„haŒJaBA[ÔDcdC '78&ý*(W8OO5V#78xTurWH#ühˆ‰aþþþDcdCþWÿóŠéP\²+°)3´M++²=+´ZC+²M +³@MO +´5T=O +´5++°//°$3´C7+°G2°/´C+°]/°?Ö±Wé°W±Q+´9&+°9±*+´)<+°)± +´K&+² K +³@  +°K±N+´1+° Ö´ +°±+´+±^+±W?°39°Q±5=99°9±/C99±)*°E9° °G9°K°M9±±99±Z°9±TM´9?3QW$9°5± K99°/°E901#"'&5473327654'3!567654'&#"#4'&#"632#"547632632334&#"276Š/.AB./H$"H×þW9!(+O5S81B]90]J(*0/K¯JSADQ‚A7GØPü¯0)*20TÔD2112D )) ý!/)CC?R7@%$7þšm< G;aF02GH32ë\fIIYI~vVßþ},<<+*8YÿíZéIç²+°63´7+°$/´FC+°A/±)é°0/´;7+³;0+´ C+°J/°8Ö´3+°3±'+±Dé°D±!+°-2±é°=2° Ö´ +°±+´+±K+±38°69°'±599°D°9°@ #$)*0;@G$9± °9°± 99±±599°$±99°F°&9°A±3899°)°'9°0°=901"&54732654'3#"/32654+"&46;2654&#"&54632+";2Z\„\I2H2HÖ(,WVG7'.ÓÔD21bE ') ý!û3þÓ¾¾Îd&54#"32Ö^AB\I2H2Hس’Y (_™ÆaTc-7}Vv†d‚V=gþÑFDAG†8Tá~a.8˜p'ÔCdcD &87' þO­ ·”dŒNNŠ\°`•i{N3cQfbL›Ex¯eŸ§k+±%±'(99±7¶ "-2:$9±± 99±:°'9°4³%*$9°° 901#"&54732654'3#"&54632&#"&546324'&#"326¦^AB\I2H2HÚ€^X\x^;mjb3y±Ž¦R>:V:59LÔCdcD &87' þbwc\zJŠbŠJ1_­¬¹ªQ+M6?VVYÿóié5ƒ²*+°3°#/´2C+°/´C+°6/°.Ö´'+°'±+´&+° Ö´ +°±+´+±7+±'µ#)*2$9± °9°±99±#*±.9901"&5473327654'3'654'&#"&'&547632i/.„\I"$HÓ10Y >=\];<‘!Z./RSzOPÔD21bE ') þ$[IH$:6 ]CAAB^¢4:#IJZUVUVY0é'1 ²+´$++²$ +³@$& +´#1& +´#++°-/´7+°/´C+°2/°Ö´$1+°02°$±(+´"<+°"±%+´1+° Ö´ +°±+´+±3+±($°9± °9°±9901"'&5473327654'3!4632!!354'&#"0\„./H$"IÙý–eqFEþZ]Pþ§*/OJ`ÔEb12D )'ýJ_„@?d›lÝþÓAL15`RAVÿ0¡éZi ²+´0++°*/´'++°K/´f++°6/±7é°^/´D7+°>/´S7+³S>+´C+°j/°OÖ±bé°#2°b´.&+°./°b±[+±Gé°G±3+°:2´<+°W2° Ö´ +°±+´+±k+±b.°B9°[³0DK$9°G°>9°´167S$9± 3°Y9°±()99°±99±'°.9±fK±399±76´GOY[b$9±D^²:BW99901#"'&5473327654'3#!"3!!"'&543!254+53254'&#"632#"'&5476324&#"3276¡/.BA./I"$H×-1Rþù% %§þLE,-¡ÿoZ((W[BIXBH,?>X-.AS-*dVnQkFIþ}*"" ÔD2112D ') ý·<*0" D#$A‹TSJH:',M8T>A%&:5U†F>$0_O !* "ZÿóZé;Eò²+´!++°(/´47+°?/´97+³9?+´ C+°F/°+Ö´1+°1±6+´B<+°B±$+´1+°±<+´&+° Ö´ +°±+´+±G+±1+°9°6²-.999°B´!&(4$9±$±D99°±9?99± °9°± 99±(!³$$9°4°9°?´+16D$9°9°.9° °-901"&54732654'3#"'732654'#"&5473&546324&#"6Z\„\I2H2HÙyT^?m1+0@] 6=KÉ~¦¢}?ÞYÿóÌé=IÔ²)+°3±4é°G2°B/±é°"/´;7+³;"+´C+°J/°,Ö´11+°1±7+±&é°&±+´E1+°E±>+´<+° Ö´ +°±+´+±K+±71².)/999±E¶ ";BG$9°>°@9±± 99±B4¶%&,18$9°° 9±;"°/9°°.901#"&54732654'3#"&54632&#"#"&547326=46324'&#"326Ì^AB\I2H2HÛ{_UezV#?kFbr^mƒ¢*|[HE3_“«RD6Pp7KÔCdcD &87' þd‹~\WJiGs^r¢wÏW +°/´*++°K/´97+°/´C+°S/°'Ö´"+°"±+´-+²- +³@ +³5-+´N+°-±0+°G2±Fé°;2°F±@+´+° Ö´ +°´>+°>/°±+´+±T+±"²$%*999°5°/9±0N°99± °9°±99±/±$99°1³"'-$9±R±=A99±K*±5N9901"&5473327654'3!5654&#"&5463235&'&547632635#4'&"$\„\I""IÚý)LV;9,+I$j€WX€ ü\;I-.?š½(-J;@8T:+,@ÔEbbE ''ý*(W7P&%9T":9wUttUE&‚,8[>/0¤}þ è# #‚W"$3$$WÿðàéPв)+²+°53±Hé°%/°.3±?é°;2³?%+´C+°Q/°7Ö´2&+°2±)+±(é°(±"+±Dé°D±L+´&+° Ö´ +°±+´+±R+±)2²45;999°(°=9°"°?9±D³HNO$9±±99±H)°49°%¶"27=CL$9°?°N9°°O901#"'&5473327654'3#"'&=4#"#4'&#"&547632632327654'7à/.BA./H##HÙ3+²+> +³@+( +°>±C+´"1+²"C +³@"' +°"±+´<+° Ö´ +°±+´+±K+±+2²45;999°>°@9±"C°A9°³F$9± °9°±99±@&±499°/·"+27>C$901"&5473327654'3'654&#"!5654'&#"&5476323&54632U\„\I##IÚ´!‚jTVr8þ]H)'<8TF!m@BS_v­A¢vrPOÔEbbE ''þ)ÉK>=™Y€vZB@M1*_8'&H9U%<7T<=vWH"Pƒ|œTSRÿn‡&0°/´++°/°Ö´ &+±+± ° 9±°901#"54767332‡ =ÐGA†-2Rïg›Š=þö²· ÿx$+e°/±é°,/°Ö´*1+°*± +´&+°# Ö´&+°±+±é±-+±*°!9±& ³($9±°9°°9012654'&'&'&'3#"'&547676?3¯/E,(+,O0U,:;QA04'G*+¶7+3>97FPV«FpQOzA=O./"?0  96 þ³$4>¡°/´6++°:/´++°?/°Ö´1+°±)+± 22´,&+´=+°2°,±!+±3é³83!+´+±@+±°9°)°9°=³ %$9±!,³05:$9°8²16999±:6² 999°°901#"'&547&547676?332654'&'&'&'3264&#"L+<0.ED./'G*+Q/E,(+,O0U,N98('9ÄR4B2//1C3+j0  967+3>97FPV«FpQOzA=CþÛ9P88(' ýâË$1=Mذ/´>++°F/´2+°8/´++°N/° Ö´1+°±%+´)&+° Ö´K+°%° Ö´+°)±+±0é°C2°0´5+°5/°0±A+´+±O+± °9±K%²# 999°±I99°)°H9°¶-28;>F$9°5°.9°0°9±82¶  ACIK$9°°901#"&547&547676?332654'&'&'&'32654&#"2654'#"&'Q4FhLJj&|'G*+Q/E,(+,O0U,b###"/D8*(9D¾\=JjjJ>/g0  967+3>97FPV«*FpQOzA=>Ú##!"pC/!+<8'.Dÿÿ÷ 8²+´C+² +³@ +°/°Ö´<+² +³@ +±+01#533÷ÛˆSIØÿÿ5Ì&à|Âÿÿ+ÿéûÅ'yˆ<=?:²+´+°/´+°/°Ö´+°±+´+± +01)!!?ýþ8þnþ6’þn+ÿñÝ£T²+´+°/´ +°/° Ö´+°±+´ +±+±³ $9±³ $901264&"6  `«ò««òàÊÊÊþâÃò««ò«þMÊÊþâÊÿéøÙ &‹²+±é² +±é²+°/´C+°'/°Ö±é°°" Ö´+°/´"+°±+±é±(+±"°9°³ $9°±99±±99° °9°±"9901"32654&'2#"&5467&546;#"6 FPPFEQOHq}np}/)4MEêÊ08(Îm¾mm\anM•ˆ”•„Kw$%K54&#"##"=ZQ…’þ;XÐ\8G6ZwC!Q/3FI)6V6M˜92KhIH«MX<^{/h0!+rþüj5(%ƒ-ÿÿÿöÿ Be'V8ÿòáÿÿÿëÿ,e'Vÿþâÿÿÿöÿ me'Vvÿò'˜±2}ÿÿÿöÿ-e'˜‰ mÿÿÿöÿÇ3e'˜±2úÿÿÿöÿÇme'˜±2ûÿÿÿöÿÇ&e'˜Å2üÿÿÿöÿÇ"e'˜±2ÿÿÿöÿÇ"e'˜§2ÿ`Nƒ!}²+² +°3´ C+°2°/´+° 2°"/°Ö° 2´+°2² +³@ +² +³@ +°´&+°/±#+± °!9°²999°± 9901'###53'73&54>32&#"JJJ(MHWWí=ûY 1#**-%#JJJ½ýäIã;þâsG, : Z/ÿ"G„%‰²+² +°3´ C+±$22°/´+°2°&/°Ö´+² +³@ +² +³@ +°°! Ö´&+°/´!&+±'+±!°9± ´ $9°±9901'###53%7'73&54>32&#"3ýJJJ9WHW?þíÈV>‹Y 1#**-%$JJJ¾ýäIs325 iþ­:HBS€6i.#  Iþï+g"’+!£",ˆII²PRBXˆ.eJ!,  ïÕœ9•pM7Hê îÐàwxÿöw„ÿìw‹ÿöw’ÿöw•ÿöw˜ÿöw¡ÿöw£ÿöw¤ÿìw¦ÿìw§ÿìw¨ÿìw©ÿìwªÿìw«ÿìw¬ÿìw­ÿìw®ÿìw¯ÿìw°ÿìw±ÿìw²ÿìw³ÿìw´ÿìwµÿìw¶ÿìw·ÿìw¸ÿìw¹ÿìwºÿìw»ÿìw¼ÿìw½ÿìw¾ÿìw¿ÿìwÀÿìwÁÿìwÂÿìwÃÿìwÄÿìwÅÿìwÆÿìwÇÿìwÈÿìwÉÿìwÊÿìwËÿìwÌÿìwÍÿìwÎÿìwÏÿìwÐÿìwÑÿìwÒÿìwÓÿìx–ÿñx£ÿö€xÿØ€„ÿö€‹ÿØ€’ÿØ€•ÿØ€–ÿ‘ÿØ€¡ÿØ€£ÿö€¤ÿ쀦ÿ쀧ÿ쀨ÿ쀩ÿ쀪ÿ쀫ÿ쀬ÿ쀭ÿ쀮ÿ쀯ÿ쀰ÿ쀱ÿ쀲ÿ쀳ÿ쀴ÿ쀵ÿ쀶ÿ쀷ÿ쀸ÿ쀹ÿ쀺ÿ쀻ÿ쀼ÿ쀽ÿ쀾ÿ쀿ÿì€Àÿì€Áÿì€Âÿì€Ãÿì€Äÿì€Åÿì€Æÿì€Çÿì€Èÿì€Éÿì€Êÿì€Ëÿì€Ìÿì€Íÿì€Îÿì€Ïÿì€Ðÿì€Ñÿì€Òÿì€Óÿì‚xÿâ‚„ÿ΂‹ÿâ‚’ÿâ‚•ÿₘÿâ‚¡ÿâ‚£ÿ삤ÿØ‚¦ÿØ‚§ÿØ‚¨ÿØ‚©ÿØ‚ªÿØ‚«ÿØ‚¬ÿØ‚­ÿØ‚®ÿØ‚¯ÿØ‚°ÿØ‚±ÿØ‚²ÿØ‚³ÿØ‚´ÿØ‚µÿØ‚¶ÿØ‚·ÿØ‚¸ÿØ‚¹ÿØ‚ºÿØ‚»ÿØ‚¼ÿØ‚½ÿØ‚¾ÿØ‚¿ÿØ‚ÀÿØ‚ÁÿØ‚ÂÿØ‚ÃÿØ‚ÄÿØ‚ÅÿØ‚ÆÿØ‚ÇÿØ‚ÈÿØ‚ÉÿØ‚ÊÿØ‚ËÿØ‚ÌÿØ‚ÍÿØ‚ÎÿØ‚ÏÿØ‚ÐÿØ‚ÑÿØ‚ÒÿØ‚Óÿ؇xÿö‡„ÿ쇋ÿö‡’ÿö‡•ÿö‡˜ÿö‡¡ÿö‡£ÿö‡¤ÿ쇦ÿ쇧ÿ쇨ÿ쇩ÿ쇪ÿ쇫ÿ쇬ÿ쇭ÿ쇮ÿ쇯ÿ쇰ÿ쇱ÿ쇲ÿ쇳ÿ쇴ÿ쇵ÿ쇶ÿ쇷ÿ쇸ÿ쇹ÿ쇺ÿ쇻ÿ쇼ÿ쇽ÿ쇾ÿ쇿ÿì‡Àÿì‡Áÿì‡Âÿì‡Ãÿì‡Äÿì‡Åÿì‡Æÿì‡Çÿì‡Èÿì‡Éÿì‡Êÿì‡Ëÿì‡Ìÿì‡Íÿì‡Îÿì‡Ïÿì‡Ðÿì‡Ñÿì‡Òÿì‡Óÿì‹–ÿñ‹£ÿöŽxÿØŽ„ÿöŽ‹ÿØŽ’ÿØŽ•ÿØŽ–ÿ⎘ÿØŽ¡ÿØŽ£ÿöޤÿ쎦ÿ쎧ÿ쎨ÿ쎩ÿ쎪ÿ쎫ÿ쎬ÿ쎭ÿ쎮ÿ쎯ÿ쎰ÿ쎱ÿ쎲ÿ쎳ÿ쎴ÿ쎵ÿ쎶ÿ쎷ÿ쎸ÿ쎹ÿ쎺ÿ쎻ÿ쎼ÿ쎽ÿ쎾ÿ쎿ÿìŽÀÿìŽÁÿìŽÂÿìŽÃÿìŽÄÿìŽÅÿìŽÆÿìŽÇÿìŽÈÿìŽÉÿìŽÊÿìŽËÿìŽÌÿìŽÍÿìŽÎÿìŽÏÿìŽÐÿìŽÑÿìŽÒÿìŽÓÿì’–ÿñ’£ÿö”xÿû”„ÿ┋ÿû”’ÿû”•ÿû”˜ÿû”¡ÿû”£ÿû”¤ÿö”¦ÿö”§ÿö”¨ÿö”©ÿö”ªÿö”«ÿö”¬ÿö”­ÿö”®ÿö”¯ÿö”°ÿö”±ÿö”²ÿö”³ÿö”´ÿö”µÿö”¶ÿö”·ÿö”¸ÿö”¹ÿö”ºÿö”»ÿö”¼ÿö”½ÿö”¾ÿö”¿ÿö”Àÿö”Áÿö”Âÿö”Ãÿö”Äÿö”Åÿö”Æÿö”Çÿö”Èÿö”Éÿö”Êÿö”Ëÿö”Ìÿö”Íÿö”Îÿö”Ïÿö”Ðÿö”Ñÿö”Òÿö”Óÿö•–ÿñ•£ÿö–xÿö–„ÿì–‹ÿö–’ÿö–•ÿö–˜ÿö–¡ÿö–£ÿö–¤ÿì–¦ÿì–§ÿì–¨ÿì–©ÿì–ªÿì–«ÿì–¬ÿì–­ÿì–®ÿì–¯ÿì–°ÿì–±ÿì–²ÿì–³ÿì–´ÿì–µÿì–¶ÿì–·ÿì–¸ÿì–¹ÿì–ºÿì–»ÿì–¼ÿì–½ÿì–¾ÿì–¿ÿì–Àÿì–Áÿì–Âÿì–Ãÿì–Äÿì–Åÿì–Æÿì–Çÿì–Èÿì–Éÿì–Êÿì–Ëÿì–Ìÿì–Íÿì–Îÿì–Ïÿì–Ðÿì–Ñÿì–Òÿì–Óÿì—xÿâ—„ÿΗ‹ÿâ—’ÿâ—•ÿâ—˜ÿâ—¡ÿâ—£ÿì—¤ÿØ—¦ÿØ—§ÿØ—¨ÿØ—©ÿØ—ªÿØ—«ÿØ—¬ÿØ—­ÿØ—®ÿØ—¯ÿØ—°ÿØ—±ÿØ—²ÿØ—³ÿØ—´ÿØ—µÿØ—¶ÿØ—·ÿØ—¸ÿØ—¹ÿØ—ºÿØ—»ÿØ—¼ÿØ—½ÿØ—¾ÿØ—¿ÿØ—ÀÿØ—ÁÿØ—ÂÿØ—ÃÿØ—ÄÿØ—ÅÿØ—ÆÿØ—ÇÿØ—ÈÿØ—ÉÿØ—ÊÿØ—ËÿØ—ÌÿØ—ÍÿØ—ÎÿØ—ÏÿØ—ÐÿØ—ÑÿØ—ÒÿØ—Óÿؘ–ÿñ˜£ÿöž–ÿñž£ÿö –ÿñ £ÿö¡–ÿñ¡£ÿö¢–ÿñ¢£ÿö§¨ÿ춨ÿì·¨ÿöÒ¨ÿö2^MœüS€¯Ôå +A É $Ò Ä² ¤ b T š ê  4 n $‰ Â Ý Vé ’m HË  l ~  p 6  æÈ º ¬œŠ ^ P!$" B$z&  'ô*:-ä9DCopyright 2002, 2003, 2005, 2008, 2009, 2010, 2012 GNU Freefont contributors.Copyright 2002, 2003, 2005, 2008, 2009, 2010, 2012 GNU Freefont contributors.FreeSansFreeSansRegularRegularGNU: FreeSans Normal: 2012GNU: FreeSans Normal: 2012FreeSansFreeSansVersion 0412.2268 Version 0412.2268 FreeSansFreeSansGNUGNUhttps://savannah.gnu.org/projects/freefont/https://savannah.gnu.org/projects/freefont/This computer font is part of GNU FreeFont. It is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This font is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this font. If not, see http://www.gnu.org/licenses/ As a special exception, if you create a document which uses this font, and embed this font or unaltered portions of this font into the document, this font does not by itself cause the resulting document to be covered by the GNU General Public License. This exception does not however invalidate any other reasons why the document might be covered by the GNU General Public License. If you modify this font, you may extend this exception to your version of the font, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version.This computer font is part of GNU FreeFont. It is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This font is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this font. If not, see http://www.gnu.org/licenses/ As a special exception, if you create a document which uses this font, and embed this font or unaltered portions of this font into the document, this font does not by itself cause the resulting document to be covered by the GNU General Public License. This exception does not however invalidate any other reasons why the document might be covered by the GNU General Public License. If you modify this font, you may extend this exception to your version of the font, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version.http://www.gnu.org/copyleft/gpl.htmlhttp://www.gnu.org/copyleft/gpl.htmlvëa?@O<V9NormalNormalNormalNavadnoNormálne1KG=K9NormalNormalOdmiana ZwykBaNormalnormalusisvidjsMediomenengahNormál 8 > . > ( M /µµÃ±¯±MittelNormalNormaaliGemiddeldnormaloby ejnéNormal=>@<0;5=ArruntaÿP2€  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`a¬£„…½–膎‹©¤ŠÚƒ“òóˆÞñžªõôö¢­ÉÇ®bcdËeÈÊÏÌÍÎéfÓÐѯgð‘ÖÔÕhëíjikmln oqprsutvwêxzy{}|¸¡~€ìîº   ýþ  ÿøù !"#$%&'()*+,-.ú×/0123456789:;<=âã>?@ABCDEFGHIJKL°±MNOPQRSTUVûüäåWXYZ[\]^_`abcdefghijkl»mnopæçqrstuvwxyz{|}~€‚ƒ¦„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—Øá˜™š›œžŸ ¡¢£¤¥¦§ÛÜÝàÙߨ©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abŸcdefghijklmnopqrstuvwx›yz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ                           ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~  € ‚ ƒ „ … † ‡ ˆ ‰ Š ‹ Œ Ž ‘ ’ “ ” • – — ˜ ™ š › œ ž Ÿ   ¡ ¢ £ ¤ ¥ ¦ § ¨ © ª « ¬ ­ ® ¯ ° ± ² ³ ´ µ ¶ · ¸ ¹ º » ¼ ½ ¾ ¿ À Á Â Ã Ä Å Æ Ç È É Ê Ë Ì Í Î Ï Ð Ñ Ò Ó Ô Õ Ö × Ø Ù Ú Û Ü Ý Þ ß à á â ã ä å æ ç è é ê ë ì í î ï ð ñ ò ó ô õ ö ÷ ø ù ú û ü ý þ ÿ                           ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~  € ‚ ƒ „ … † ‡ ˆ ‰ Š ‹ Œ Ž ‘ ’ “ ” • – — ˜ ™ š › œ ž Ÿ   ¡ ¢ £ ¤ ¥ ¦ § ¨ © ª « ¬ ­ ® ¯ ° ± ² ³ ´ µ ¶ · ¸ ¹ º » ¼ ½ ¾ ¿ À Á Â Ã Ä Å Æ Ç È É Ê Ë Ì Í Î Ï Ð Ñ Ò Ó Ô Õ Ö × Ø Ù Ú Û Ü Ý Þ ß à á â ã ä å æ ç è é ê ë ì í î ï ð ñ ò ó ô õ ö ÷ ø ù ú û ü ý þ ÿ                           ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~  € ‚ ƒ „ … † ‡ ˆ ‰ Š ‹ Œ Ž ‘ ’ “ ” • – — ˜ ™ š › œ ž Ÿ   ¡ ¢ £ ¤ ¥ ¦ § ¨ © ª « ¬ ­ ® ¯ ° ± ² ³ ´ µ ¶ · ¸ ¹ º » ¼ ½ ¾ ¿ À Á Â Ã Ä Å Æ Ç È É Ê Ë Ì Í Î Ï Ð Ñ Ò Ó Ô Õ Ö × Ø Ù Ú Û Ü Ý Þ ß à á â ã ä å æ ç è é ê ë ì í î ï ð ñ ò ó ô õ ö ÷ ø ù ú û ü ý þ ÿ                           ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~  € ‚ ƒ „ … † ‡ ˆ ‰ Š ‹ Œ Ž ‘ ’ “ ”²³ • – —¶·Ä ˜´µÅ ™‚‡ š › œ« ž Ÿ   ¡ ¢ £ ¤ ¥Æ ¦ § ¨ © ª « ¬ ­¾¿ ® ¯ ° ± ² ³ ´ µ ¶¼ · ¸ ¹ º » ¼ ½ ¾ ¿ À Á Â Ã Ä Å Æ Ç È É Ê Ë Ì Í Î Ï Ð Ñ Ò Ó Ô Õ Ö × Ø Ù Ú Û Ü Ý Þ ß à á â ã ä å æ ç è é ê ë ì í î ï ð ñ ò ó ô õ ö ÷ ø ù ú û÷ ü ý þ ÿ                           ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N OŒ P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~  € ‚ ƒ „ … † ‡ ˆ ‰ Š ‹ Œ Ž ‘ ’ “ ” • – — ˜ ™ š › œ ž Ÿ   ¡ ¢ £ ¤ ¥ ¦ § ¨ © ª « ¬ ­ ® ¯ ° ± ² ³ ´ µ ¶ · ¸ ¹ º » ¼ ½ ¾ ¿ À Á Â Ã Ä Å Æ Ç È É Ê Ë Ì˜ Í Î Ï Ð Ñ Ò Ó Ô Õ Ö × Øš Ù™ï Ú Û Ü Ý Þ ß à¥ á â ã’ ä å æ ç è é ê ë ì í î ïœ ð ñ ò ó ô õ ö ÷ ø ù ú û ü ý þ ÿ§     ”• !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz¹{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDÀÁEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„ softhyphenmicromiddotssharpAmacronamacronAbreveabreveAogonekaogonek Ccircumflex ccircumflex Cdotaccent cdotaccentDcarondcaronDcroatEmacronemacronEbreveebreve Edotaccent edotaccentEogonekeogonekEcaronecaron Gcircumflex gcircumflex Gdotaccent gdotaccent Gcommaaccent gcommaaccent Hcircumflex hcircumflexHbarhbarItildeitildeImacronimacronIbreveibreveIogonekiogonekIJij Jcircumflex jcircumflex Kcommaaccent kcommaaccent kgreenlandicLacutelacute Lcommaaccent lcommaaccentLcaronlcaronLdotldotNacutenacute Ncommaaccent ncommaaccentNcaronncaron napostropheEngengOmacronomacronObreveobreve Ohungarumlaut ohungarumlautRacuteracute Rcommaaccent rcommaaccentRcaronrcaronSacutesacute Scircumflex scircumflexTcedillatcedillaTcarontcaronTbartbarUtildeutildeUmacronumacronUbreveubreveUringuring Uhungarumlaut uhungarumlautUogonekuogonek Wcircumflex wcircumflex Ycircumflex ycircumflexZacutezacute Zdotaccent zdotaccentlongsuni0180uni0181uni0182uni0183uni0184uni0185uni0186uni0187uni0188uni0189uni018Auni018Buni018Cuni018Duni018Euni018F Epsilonlatinuni0191uni0193uni0194uni0195uni0196uni0197uni0198uni0199lbar lambdastrokeuni019Cuni019Duni019EObarOhornohornOioiuni01A4uni01A5uni01A6uni01A7uni01A8uni01A9uni01AAuni01ABuni01ACuni01ADuni01AEUhornuhornuni01B1uni01B2uni01B3yhookuni01B5uni01B6Yoghuni01B8uni01B9uni01BAuni01BBuni01BEwynnuni01C0uni01C1uni01C2uni01C3DZcaronDzcarondzcaronLJLjljNJNjnjAcaronacaronIcaronicaronOcaronocaronUcaronucaronUdieresismacronudieresismacronUdieresisacuteudieresisacuteUdieresiscaronudieresiscaronUdieresisgraveudieresisgraveeturnuni01DEuni01DFuni01E0uni01E1uni01E2uni01E3uni01E4uni01E5Gcarongcaronuni01E8kcaronOogonekoogonekuni01ECuni01EDuni01EEezhcaronjcaronDZDzuni01F3GacutegacuteWynnuni01F8uni01F9 Aringacute aringacuteAEacuteaeacute Oslashacute oslashacute Adblgrave adblgraveAinvertedbreveainvertedbreve Edblgrave edblgraveEinvertedbreveeinvertedbreve Idblgrave idblgraveIinvertedbreveiinvertedbreve Odblgrave odblgraveOinvertedbreveoinvertedbreve Rdblgrave rdblgraveRinvertedbreverinvertedbreve Udblgrave udblgraveUinvertedbreveuinvertedbreve Scommaaccent scommaaccentuni021Auni021Buni021Cuni021Duni021Euni021Funi0220uni0224uni0225 A_dotaccent a_dotaccentuni0228uni0229uni022Auni022Buni022Cuni022Duni022Euni022Funi0230uni0231uni0232uni0233dotlessjuni0238uni0239aturnascript ascriptturnbhookcturnccurldtaildhookerevschwa schwahook epsilonlatinepsilonlatinrevepsilonlatinrevhookepsilonlatinrevclosed jdotlessbarghookgscript Gsmallcap gammalatinramshornhturnhhookhenghookibar iotalatin Ismallcap lmidtildelbeltlrthooklezhmturnedmlonglegturnedmhook nhookleftnrthook Nsmallcapobar OEsmallcap omegaclosedphilatinrturnrlonglegturned rhookturnedrlonglegrhook rfishhook rfishhookrev Rsmallcap Rsmallcapinvshookeshdotlessjstrokehook eshshortreveshcurltturntrthookubar upsilonlatinvhookvturnwturnyturn Ysmallcapzrthookzcurlezhezhcurl glottalstopglottalstoprevinvglottalstopinvcstretch bilabialclick Bsmallcap epsilonclosed Gsmallhook Hsmallcap jcrosstailkturn Lsmallcapqhookglottalstopbarglottalstopbarrevdzaltonedezhdzcurltsteshtccurluni02A9uni02AAuni02ABuni02ACuni02ADuni02AEuni02AFhsuper hhooksuperjsuperrsuper rturnsuperrturnrthooksuper Rturnsuperwsuperysuperprimemod dblprimemod quoteleftmod apostrophe apostropherev ringhalfright ringhalfleftglottalstopmodglottalstopreversedmodfrontedbackedraisedloweredverticallinemodmacronmodifier acutemodifier gravemodifierverticallinelowmod macronlowmodgravesubacutesubcolontriangularmodcolontriangularhalfmodringhalfrightcenteredringhalfleftcentered tackupmid tackdownmidplusmodminusmoduni02DEuni02DF gammasuperlsuperssuperxsuperglottalrevsuper toneextrahightonehightonemidtonelow toneextralowuni02EAuni02EBuni02ECuni02EDuni02EEuni02EFuni02F0uni02F1uni02F2uni02F3uni02F4uni02F5uni02F6uni02F7uni02F8uni02F9uni02FAuni02FBuni02FCuni02FDuni02FEuni02FF gravecomb acutecombcircumflexcomb tildecomb macroncomb overlinecmb brevecomb dotaccentcmb dieresiscmb hookabovecombringcmbhungarumlautcmb caroncombverticallineabovecmbdblverticallineabovecmb gravedblnospcandrabinducmbbreveinvertedcmbcommaturnedabovecmb commaabovecmbcommareversedabovecmbcommaaboverightcmb gravebelowcmb acutebelowcmblefttackbelowcmbuni0319uni031Ahorncmbringlefthalfsubnospuptackbelowcmbuni031Euni031F minusbelowcmbhookpalatalizedbelowcmbhookretroflexbelowcmb dotbelowcombdieresisbelowcmb ringbelowcmb commasubnosp cedillacmb ogonekcmblinevertsubnospbridgebelowcmbdblarchinvertedbelowcmb caronbelowcmbcircumflexbelowcmb brevebelowcmbbreveinvertedbelowcmb tildebelowcmbmacronbelowcmb lowlinecmb dbllowlinecmbtildeoverlaycmbstrokeshortoverlaycmbstrokelongoverlaycmbsolidusshortoverlaycmbsoliduslongoverlaycmbringrighthalfsubnospbridgeinvertedbelowcmbsquarebelowcmbseagullbelowcmb xabovecmbtildeverticalcmbdbloverlinecmb gravetonecmb acutetonecmbperispomenigreekcmb koroniscmbdiaeresistonosnospypogegrammenigreekcmbuni0346uni0347uni0348uni0349uni034Auni034Buni034Cuni034Duni034Euni034Funi0350uni0351uni0352uni0353uni0354uni0355uni0356uni0357uni0358uni0359uni035Auni035Buni035Cuni035Duni035Euni035Funi0360uni0361uni0362uni0363uni0364uni0365uni0366uni0367uni0368uni0369uni036Auni036Buni036Cuni036Duni036Euni036Funi0374uni0375 ypogegrammeniuni037buni037cuni037duni037Etonos dieresistonos Alphatonos anoteleia EpsilontonosEtatonos Iotatonos Omicrontonos Upsilontonos OmegatonosiotadieresistonosAlphaBetaGammauni0394EpsilonZetaEtaThetaIotaKappaLambdaMuNuXiOmicronPiRhoSigmaTauUpsilonPhiChiPsi IotadieresisUpsilondieresis alphatonos epsilontonosetatonos iotatonosupsilondieresistonosalphabetagammadeltaepsilonzetaetathetaiotakappalambdauni03BCnuxiomicronrhosigma1sigmatauupsilonphichipsiomega iotadieresisupsilondieresis omicrontonos upsilontonos omegatonostheta1 UpsilonhookUpsilonhooktonosUpsilonhookdiaeresisphi1 pisymbolgreekuni03D7uni03F0rhosymbolgreek sigmalunateuni03f3uni03f4uni03F5uni03f6uni03f9uni03fduni03feuni03ffIecyrillic_grave Iocyrillic Djecyrillic Gjecyrillic Ecyrillic Dzecyrillic Icyrillic Yicyrillic Jecyrillic Ljecyrillic Njecyrillic Tshecyrillic KjecyrillicIicyrillic_graveUshortcyrillic Dzhecyrillic Acyrillic Becyrillic Vecyrillic Gecyrillic Decyrillic Iecyrillic Zhecyrillic Zecyrillic IicyrillicIishortcyrillic Kacyrillic Elcyrillic Emcyrillic Encyrillic Ocyrillic Pecyrillic Ercyrillic Escyrillic Tecyrillic Ucyrillic Efcyrillic Khacyrillic Tsecyrillic Checyrillic Shacyrillic ShchacyrillicHardsigncyrillic YericyrillicSoftsigncyrillicEreversedcyrillic IUcyrillic IAcyrillic acyrillic becyrillic vecyrillic gecyrillic decyrillic iecyrillic zhecyrillic zecyrillic iicyrilliciishortcyrillic kacyrillic elcyrillic emcyrillic encyrillic ocyrillic pecyrillic ercyrillic escyrillic tecyrillic ucyrillic efcyrillic khacyrillic tsecyrillic checyrillic shacyrillic shchacyrillichardsigncyrillic yericyrillicsoftsigncyrillicereversedcyrillic iucyrillic iacyrilliciecyrillic_grave iocyrillic djecyrillic gjecyrillic ecyrillic dzecyrillic icyrillic yicyrillic jecyrillic ljecyrillic njecyrillic tshecyrillic kjecyrilliciicyrillic_graveushortcyrillic dzhecyrillic Omegacyrillic omegacyrillicuni0462uni0463uni0464uni0465uni0466uni0467uni0468uni0469uni046Auni046Buni046Cuni046Duni046Euni046Funi0470uni0471 Fitacyrillic fitacyrillicuni0474uni0475uni0476uni0477uni0478uni0479uni047Auni047BOmegatitlocyrillicomegatitlocyrillic Otcyrillic otcyrillicthousandcyrillictitlocyrilliccmbpalatalizationcyrilliccmbdasiapneumatacyrilliccmbpsilipneumatacyrilliccmbuni0487uni0488uni0489uni048auni048buni048Cuni048Duni048Euni048Funi0490uni0491uni0492uni0493uni0494uni0495uni0496uni0497uni0498uni0499uni049Auni049Buni049Cuni049Duni049Euni049Funi04A0uni04A1uni04A2uni04A3uni04A4uni04A5uni04A6uni04A7uni04A8uni04A9uni04AAuni04ABuni04ACuni04ADuni04AEuni04AFuni04B0uni04B1uni04B2uni04B3uni04B4uni04B5uni04B6uni04B7uni04B8uni04B9uni04BAuni04BBuni04BCuni04BDuni04BEuni04BFuni04C0uni04C1uni04C2uni04C3uni04C4uni04C5uni04C6uni04C7uni04C8uni04C9uni04CAuni04CBuni04CCuni04CDuni04CEuni04CFuni04D0uni04D1uni04D2uni04D3uni04D4uni04D5uni04D6uni04D7uni04D8uni04d9uni04DAuni04DBuni04DCuni04DDuni04DEuni04DFDzeabkhasiancyrillicuni04E1uni04E2uni04E3uni04E4uni04E5uni04E6uni04E7uni04E8uni04E9uni04EAuni04EBuni04ECuni04EDuni04EEuni04EFuni04F0uni04F1Uhungarumlautcyrillicuhungarumlautcyrillicuni04F4uni04F5uni04f6uni04f7uni04F8uni04F9uni04fauni04fbuni04fcuni04fduni04feuni04ffuni0510uni0511uni0512uni0513uni051auni051buni051cuni051duni051euni051funi0524uni0525uni0526uni0527uni0531uni0532uni0533uni0534uni0535uni0536uni0537uni0538uni0539uni053Auni053Buni053Cuni053Duni053Euni053Funi0540uni0541uni0542uni0543uni0544uni0545uni0546uni0547uni0548uni0549uni054Auni054Buni054Cuni054Duni054Euni054Funi0550uni0551uni0552uni0553uni0554uni0555uni0556uni0559uni055Auni055Buni055Cuni055Duni055Euni055Funi0561uni0562uni0563uni0564 echarmenianuni0566uni0567uni0568uni0569uni056A iniarmenianuni056C xeharmenianuni056Euni056Funi0570uni0571uni0572uni0573 menarmenianuni0575 nowarmenianuni0577uni0578uni0579uni057Auni057Buni057Cuni057D vewarmenianuni057Funi0580uni0581 yiwnarmenianuni0583uni0584uni0585uni0586echyiwnarmenianuni0589uni058A dramarmenian afii57799 afii57801 afii57800 afii57802 hiriqhebrew tserehebrew segolhebrew patahhebrew qamatshebrew holamhebrewuni05BA afii57796 dageshhebrew afii57839 afii57645 rafehebrew afii57842 shindothebrew sindothebrewsofpasuqhebrewupperdothebrewuni05C5uni05C6uni05C7 alefhebrew bethebrew gimelhebrew dalethebrewhehebrew vavhebrew zayinhebrew hethebrew tethebrew yodhebrewfinalkafhebrew kafhebrew lamedhebrewfinalmemhebrew memhebrewfinalnunhebrew nunhebrew samekhhebrew ayinhebrew finalpehebrewpehebrew tsadifinal tsadihebrew qofhebrew reshhebrew shinhebrew tavhebrew vavvavhebrew vavyodhebrew yodyodhebrew gereshhebrewgershayimhebrewuni0700uni0701uni0702uni0703uni0704uni0705uni0706uni0707uni0708uni0709uni070Auni070Buni070Cuni070Duni070Funi0710uni0711uni0712uni0713uni0714uni0715uni0716uni0717uni0718uni0719uni071Auni071Buni071Cuni071Duni071Euni071Funi0720uni0721uni0722uni0723uni0724uni0725uni0726uni0727uni0728uni0729uni072Auni072Buni072Cuni072duni072euni072funi0730uni0731uni0732uni0733uni0734uni0735uni0736uni0737uni0738uni0739uni073Auni073Buni073Cuni073Duni073Euni073Funi0740uni0741uni0742uni0743uni0744uni0745uni0746uni0747uni0748uni0749uni074Auni074duni074euni074finvcandrabindudevacandrabindudeva anusvaradeva visargadeva shortadevaadevaaadevaidevaiidevaudevauudeva rvocalicdeva lvocalicdeva ecandradeva eshortdevaedevaaideva ocandradeva oshortdevaodevaaudevakadevakhadevagadevaghadevangadevacadevachadevajadevajhadevanyadevattadevatthadevaddadevaddhadevannadevatadevathadevadadevadhadevanadevannnadevapadevaphadevabadevabhadevamadevayadevaradevarradevaladevalladevallladevavadevashadevassadevasadevahadeva oesigndeva ooesigndeva nuktadeva avagrahadeva aasigndeva isigndeva iisigndeva usigndeva uusigndevarvocalicsigndevarrvocalicsigndevaecandrasigndevaeshortsigndeva esigndeva aisigndevaocandrasigndevaoshortsigndeva osigndeva ausigndevavirama epristhamatra awsigndevaomdeva udattadeva anudattadeva gravedeva acutedevalongecandradeva uesigndeva uuesigndevaqadevakhhadevaghhadevazadeva dddhadevarhadevafadevayyadeva rrvocalicdeva llvocalicdevalvocalicvowelsigndevallvocalicsigndevadandadbldandazerodevaonedevatwodeva threedevafourdevafivedevasixdeva sevendeva eightdevaninedevaabbreviationsigndevaellipsisdotdeva acandradevaoedevaooedevaawdevauedevauuedevazhadeva heavyyadevaggadevajjadevaglottalstopdevadddadevabbadevabn_candrabindu bn_anusvara bn_visargabn_abn_aabn_ibn_iibn_ubn_uubn_ribn_libn_ebn_aibn_obn_aubn_kabn_khabn_gabn_ghabn_ngabn_cabn_chabn_jabn_jhabn_nyabn_ttabn_tthabn_ddabn_ddhabn_nnabn_tabn_thabn_dabn_dhabn_nabn_pabn_phabn_babn_bhabn_mabn_yabn_rabn_labn_shabn_ssabn_sabn_habn_nukta bn_avagraha bn_aakaarbn_ikaar bn_iikaarbn_ukaar bn_uukaar bn_rikaar bn_rrikaarbn_ekaar bn_aikaarbn_okaar bn_aukaar bn_hasanta bn_half_ta bn_aumarkbn_rrabn_rhabn_yyabn_rribn_lli bn_likaar bn_llikaarbn_zerobn_onebn_twobn_threebn_fourbn_fivebn_sixbn_sevenbn_eightbn_nine bn_asamira bn_asamiba bn_rupeemark bn_rupeesign bn_currency1 bn_currency2 bn_currency3 bn_currency4bn_currencyless bn_currency16 bn_issharuni09fbadak_bindi_gur bindi_gur visarga_gura_guraa_guri_gurii_guru_guruu_guree_gurai_guroo_gurau_gurka_gurkha_gurga_gurgha_gurnga_gurca_gurcha_gurja_gurjha_gurnya_gurtta_gurttha_gurdda_gurddha_gurnna_gurta_gurtha_gurda_gurdha_gurna_gurpa_gurpha_gurba_gurbha_gurma_gurya_gurra_gurla_gurlla_gurva_gursha_gursa_gurha_gur nukta_gur aamatra_gur imatra_gur iimatra_gur umatra_gur uumatra_gur eematra_gur aimatra_gur oomatra_gur aumatra_gur virama_gur uudatsign_gurkhha_gurghha_gurza_gurrra_gurfa_gurzero_gurone_gurtwo_gur three_gurfour_gurfive_gursix_gur seven_gur eight_gurnine_gur tippi_gur addak_guriri_gurura_gur ek_onkar_guryakashsign_gur anusvara_mal viasrga_mal a_vowel_mal aa_vowel_mal i_vowel_mal ii_vowel_mal u_vowel_mal uu_vowel_mal r_vocalic_mal l_vocalic_mal e_vowel_mal ee_vowel_mal ai_vowel_mal o_vowel_mal oo_vowel_mal au_vowel_malka_malkha_malga_malgha_malnga_malcha_malchha_malja_maljha_malnya_maltta_malttha_maldda_malddha_malnna_malta_maltha_malda_maldha_malna_malnnna_malpa_malpha_malba_malbha_malma_malya_malra_malrra_malla_mallla_malllla_malva_malsha_malssa_malsa_malha_malttta_mal avagraha_malaa_mali_malii_malu_maluu_mal r_voc_mal rr_voc_male_malee_malai_malo_maloo_malau_mal candrakalareph_mal au_length_malrr_vocalic_malll_voc_skt_mal l_voc_mal ll_voc_malzero_malone_maltwo_mal three_malfour_malfive_malsix_mal seven_mal eight_malnine_malten_malone_hundred_malone_thousand_malone_quarter_mal one_half_malthree_quarters_maldate_mal nn_chil_mal n_chil_mal rr_chil_mal l_chil_mal ll_chil_mal k_chil_maluni10A0uni10A1uni10A2uni10A3uni10A4uni10A5uni10A6uni10A7uni10A8uni10A9uni10AAuni10ABuni10ACuni10ADuni10AEuni10AFuni10B0uni10B1uni10B2uni10B3uni10B4uni10B5uni10B6uni10B7uni10B8uni10B9uni10BAuni10BBuni10BCuni10BDuni10BEuni10BFuni10C0uni10D0uni10D1uni10D2uni10D3uni10D4uni10D5uni10D6uni10D7uni10D8uni10D9uni10DAuni10DBuni10DCuni10DDuni10DEuni10DFuni10E0uni10E1uni10E2uni10E3uni10E4uni10E5uni10E6uni10E7uni10E8uni10E9uni10EAuni10EBuni10ECuni10EDuni10EEuni10EFuni10F0uni10F1uni10F2uni10F3uni10F4uni10F5uni10f9uni10fbuni10fcuni13A0uni13A1uni13A2uni13A3uni13A4uni13A5uni13A6uni13A7uni13A8uni13A9uni13AAuni13ABuni13ACuni13ADuni13AEuni13AFuni13B0uni13B1uni13B2uni13B3uni13B4uni13B5uni13B6uni13B7uni13B8uni13B9uni13BAuni13BBuni13BCuni13BDuni13BEuni13BFuni13C0uni13C1uni13C2uni13C3uni13C4uni13C5uni13C6uni13C7uni13C8uni13C9uni13CAuni13CBuni13CCuni13CDuni13CEuni13CFuni13D0uni13D1uni13D2uni13D3uni13D4uni13D5uni13D6uni13D7uni13D8uni13D9uni13DAuni13DBuni13DCuni13DDuni13DEuni13DFuni13E0uni13E1uni13E2uni13E3uni13E4uni13E5uni13E6uni13E7uni13E8uni13E9uni13EAuni13EBuni13ECuni13EDuni13EEuni13EFuni13F0uni13F1uni13F2uni13F3uni13F4uni1400uni1401uni1402uni1403uni1404uni1405uni1406uni1407uni1408uni1409uni140Auni140Buni140Cuni140Duni140Euni140Funi1410uni1411uni1412uni1413uni1414uni1415uni1416uni1417uni1418uni1419uni141Auni141Buni141Cuni141Duni141Euni141Funi1420uni1421uni1422uni1423uni1424uni1425uni1426uni1427uni1428uni1429uni142Auni142Buni142Cuni142Duni142Euni142Funi1430uni1431uni1432uni1433uni1434uni1435uni1436uni1437uni1438uni1439uni143Auni143Buni143Cuni143Duni143Euni143Funi1440uni1441uni1442uni1443uni1444uni1445uni1446uni1447uni1448uni1449uni144Auni144Buni144Cuni144Duni144Euni144Funi1450uni1451uni1452uni1453uni1454uni1455uni1456uni1457uni1458uni1459uni145Auni145Buni145Cuni145Duni145Euni145Funi1460uni1461uni1462uni1463uni1464uni1465uni1466uni1467uni1468uni1469uni146Auni146Buni146Cuni146Duni146Euni146Funi1470uni1471uni1472uni1473uni1474uni1475uni1476uni1477uni1478uni1479uni147Auni147Buni147Cuni147Duni147Euni147Funi1480uni1481uni1482uni1483uni1484uni1485uni1486uni1487uni1488uni1489uni148Auni148Buni148Cuni148Duni148Euni148Funi1490uni1491uni1492uni1493uni1494uni1495uni1496uni1497uni1498uni1499uni149Auni149Buni149Cuni149Duni149Euni149Funi14A0uni14A1uni14A2uni14A3uni14A4uni14A5uni14A6uni14A7uni14A8uni14A9uni14AAuni14ABuni14ACuni14ADuni14AEuni14AFuni14B0uni14B1uni14B2uni14B3uni14B4uni14B5uni14B6uni14B7uni14B8uni14B9uni14BAuni14BBuni14BCuni14BDuni14BEuni14BFuni14C0uni14C1uni14C2uni14C3uni14C4uni14C5uni14C6uni14C7uni14C8uni14C9uni14CAuni14CBuni14CCuni14CDuni14CEuni14CFuni14D0uni14D1uni14D2uni14D3uni14D4uni14D5uni14D6uni14D7uni14D8uni14D9uni14DAuni14DBuni14DCuni14DDuni14DEuni14DFuni14E0uni14E1uni14E2uni14E3uni14E4uni14E5uni14E6uni14E7uni14E8uni14E9uni14EAuni14EBuni14ECuni14EDuni14EEuni14EFuni14F0uni14F1uni14F2uni14F3uni14F4uni14F5uni14F6uni14F7uni14F8uni14F9uni14FAuni14FBuni14FCuni14FDuni14FEuni14FFuni1500uni1501uni1502uni1503uni1504uni1505uni1506uni1507uni1508uni1509uni150Auni150Buni150Cuni150Duni150Euni150Funi1510uni1511uni1512uni1513uni1514uni1515uni1516uni1517uni1518uni1519uni151Auni151Buni151Cuni151Duni151Euni151Funi1520uni1521uni1522uni1523uni1524uni1525uni1526uni1527uni1528uni1529uni152Auni152Buni152Cuni152Duni152Euni152Funi1530uni1531uni1532uni1533uni1534uni1535uni1536uni1537uni1538uni1539uni153Auni153Buni153Cuni153Duni153Euni153Funi1540uni1541uni1542uni1543uni1544uni1545uni1546uni1547uni1548uni1549uni154Auni154Buni154Cuni154Duni154Euni154Funi1550uni1551uni1552uni1553uni1554uni1555uni1556uni1557uni1558uni1559uni155Auni155Buni155Cuni155Duni155Euni155Funi1560uni1561uni1562uni1563uni1564uni1565uni1566uni1567uni1568uni1569uni156Auni156Buni156Cuni156Duni156Euni156Funi1570uni1571uni1572uni1573uni1574uni1575uni1576uni1577uni1578uni1579uni157Auni157Buni157Cuni157Duni157Euni157Funi1580uni1581uni1582uni1583uni1584uni1585uni1586uni1587uni1588uni1589uni158Auni158Buni158Cuni158Duni158Euni158Funi1590uni1591uni1592uni1593uni1594uni1595uni1596uni1597uni1598uni1599uni159Auni159Buni159Cuni159Duni159Euni159Funi15A0uni15A1uni15A2uni15A3uni15A4uni15A5uni15A6uni15A7uni15A8uni15A9uni15AAuni15ABuni15ACuni15ADuni15AEuni15AFuni15B0uni15B1uni15B2uni15B3uni15B4uni15B5uni15B6uni15B7uni15B8uni15B9uni15BAuni15BBuni15BCuni15BDuni15BEuni15BFuni15C0uni15C1uni15C2uni15C3uni15C4uni15C5uni15C6uni15C7uni15C8uni15C9uni15CAuni15CBuni15CCuni15CDuni15CEuni15CFuni15D0uni15D1uni15D2uni15D3uni15D4uni15D5uni15D6uni15D7uni15D8uni15D9uni15DAuni15DBuni15DCuni15DDuni15DEuni15DFuni15E0uni15E1uni15E2uni15E3uni15E4uni15E5uni15E6uni15E7uni15E8uni15E9uni15EAuni15EBuni15ECuni15EDuni15EEuni15EFuni15F0uni15F1uni15F2uni15F3uni15F4uni15F5uni15F6uni15F7uni15F8uni15F9uni15FAuni15FBuni15FCuni15FDuni15FEuni15FFuni1600uni1601uni1602uni1603uni1604uni1605uni1606uni1607uni1608uni1609uni160Auni160Buni160Cuni160Duni160Euni160Funi1610uni1611uni1612uni1613uni1614uni1615uni1616uni1617uni1618uni1619uni161Auni161Buni161Cuni161Duni161Euni161Funi1620uni1621uni1622uni1623uni1624uni1625uni1626uni1627uni1628uni1629uni162Auni162Buni162Cuni162Duni162Euni162Funi1630uni1631uni1632uni1633uni1634uni1635uni1636uni1637uni1638uni1639uni163Auni163Buni163Cuni163Duni163Euni163Funi1640uni1641uni1642uni1643uni1644uni1645uni1646uni1647uni1648uni1649uni164Auni164Buni164Cuni164Duni164Euni164Funi1650uni1651uni1652uni1653uni1654uni1655uni1656uni1657uni1658uni1659uni165Auni165Buni165Cuni165Duni165Euni165Funi1660uni1661uni1662uni1663uni1664uni1665uni1666uni1667uni1668uni1669uni166Auni166Buni166Cuni166Duni166Euni166Funi1670uni1671uni1672uni1673uni1674uni1675uni1676uni1677uni1678uni1679uni167auni167buni167cuni167duni167euni167funi18b0uni18b1uni18b2uni18b3uni18b4uni18b5uni18b6uni18b7uni18b8uni18b9uni18bauni18bbuni18bcuni18bduni18beuni18bfuni18c0uni18c1uni18c2uni18c3uni18c4uni18c5uni18c6uni18c7uni18c8uni18c9uni18cauni18cbuni18ccuni18cduni18ceuni18cfuni18d0uni18d1uni18d2uni18d3uni18d4uni18d5uni18d6uni18d7uni18d8uni18d9uni18dauni18dbuni18dcuni18dduni18deuni18dfuni18e0uni18e1uni18e2uni18e3uni18e4uni18e5uni18e6uni18e7uni18e8uni18e9uni18eauni18ebuni18ecuni18eduni18eeuni18efuni18f0uni18f1uni18f2uni18f3uni18f4uni18f5uni1d00uni1d01uni1d02uni1d03uni1d04uni1d05uni1d06uni1d07uni1d08uni1d09uni1d0auni1d0buni1d0cuni1d0duni1d0funi1d18uni1d19uni1d1auni1d1buni1d1cuni1d20uni1d21uni1d22uni1d9buni1d9duni1d9euni1d9funi1da4uni1da5uni1da6uni1dabuni1dacuni1daduni1daeuni1dafuni1db0uni1db1uni1db2uni1db7uni1db8uni1db9uni1dbcuni1dbduni1dbeuni1dbfuni1E00uni1E01 Bdotaccent bdotaccent Bdotbelow bdotbelow Blinebelow blinebelow Ccedillaacute ccedillaacute Ddotaccent ddotaccent Ddotbelowuni1E0D Dlinebelowuni1E0Funi1E10uni1E11Dcircumflexbelowdcircumflexbelow Emacrongrave emacrongrave Emacronacute emacronacuteEcircumflexbelowecircumflexbelow Etildebelow etildebelow Ecedillabreve ecedillabreve Fdotaccent fdotaccentGmacronuni1E21 Hdotaccent hdotaccentuni1E24uni1E25uni1E26uni1E27uni1E28uni1E29uni1E2Auni1E2Buni1E2Cuni1E2Duni1E2Eidieresisacuteuni1E30uni1E31uni1E32uni1E33uni1E34uni1E35uni1E36uni1E37uni1E38uni1E39uni1E3Auni1E3BLcircumflexbelowlcircumflexbelowuni1E3Emacute Mdotaccent mdotaccentuni1E42uni1E43uni1E44uni1E45uni1E46uni1E47uni1E48uni1E49Ncircumflexbelowncircumflexbelowuni1E4C otildeacuteuni1E4Euni1E4Funi1E50uni1E51uni1E52 omacronacutePacutepacute Pdotaccent pdotaccent Rdotaccent rdotaccent Rdotbelowuni1E5Buni1E5Cuni1E5D Rlinebelowuni1E5F Sdotaccent sdotaccent Sdotbelow sdotbelowuni1E64uni1E65ScarondotaccentscarondotaccentSdotbelowdotaccentsdotbelowdotaccent Tdotaccent tdotaccent Tdotbelow tdotbelowuni1E6Euni1E6FTcircumflexbelowtcircumflexbelowUdieresisbelowudieresisbelow Utildebelow utildebelowUcircumflexbelowucircumflexbelow Utildeacute utildeacuteUmacrondieresisumacrondieresisVtildevtilde Vdotbelow vdotbelowWgravewgraveWacutewacute Wdieresis wdieresisuni1E86uni1E87uni1E88uni1E89uni1E8Auni1E8Buni1E8Cuni1E8D Ydotaccent ydotaccent Zcircumflex zcircumflexuni1E92uni1E93uni1E94uni1E95uni1E96uni1E97uni1E98uni1E99arighthalfringuni1E9Buni1e9cuni1e9duni1e9euni1e9f Adotbelow adotbelow Ahookabove ahookaboveAcircumflexacuteacircumflexacuteAcircumflexgraveacircumflexgraveAcircumflexhookaboveacircumflexhookaboveAcircumflextildeacircumflextildeAcircumflexdotbelowacircumflexdotbelow Abreveacute abreveacute Abrevegrave abrevegraveAbrevehookaboveabrevehookabove Abrevetilde abrevetildeAbrevedotbelowabrevedotbelow Edotbelow edotbelow Ehookabove ehookaboveEtildeetildeEcircumflexacuteecircumflexacuteEcircumflexgraveecircumflexgraveEcircumflexhookaboveecircumflexhookaboveEcircumflextildeecircumflextildeEcircumflexdotbelowecircumflexdotbelow Ihookabove ihookabove Idotbelow idotbelow Odotbelow odotbelow Ohookabove ohookaboveOcircumflexacuteocircumflexacuteOcircumflexgraveocircumflexgraveOcircumflexhookaboveocircumflexhookaboveOcircumflextildeocircumflextildeOcircumflexdotbelowocircumflexdotbelow Ohornacute ohornacute Ohorngrave ohorngraveOhornhookaboveohornhookabove Ohorntilde ohorntilde Ohorndotbelow ohorndotbelow Udotbelow udotbelow Uhookabove uhookabove Uhornacute uhornacute Uhorngrave uhorngraveUhornhookaboveuhornhookabove Uhorntilde uhorntilde Uhorndotbelow uhorndotbelowYgraveygrave Ydotbelow ydotbelow Yhookabove yhookaboveYtildeytildeuni1F00uni1F01uni1F02uni1F03uni1F04uni1F05uni1F06uni1F07uni1F08uni1F09uni1F0Auni1F0Buni1F0Cuni1F0Duni1F0Euni1F0Funi1F10uni1F11uni1F12uni1F13uni1F14uni1F15uni1F18uni1F19uni1F1Auni1F1Buni1F1Cuni1F1Duni1F20uni1F21uni1F22uni1F23uni1F24uni1F25uni1F26uni1F27uni1F28uni1F29uni1F2Auni1F2Buni1F2Cuni1F2Duni1F2Euni1F2Funi1F30uni1F31uni1F32uni1F33uni1F34uni1F35uni1F36uni1F37uni1F38uni1F39uni1F3Auni1F3Buni1F3Cuni1F3Duni1F3Euni1F3Funi1F40uni1F41uni1F42uni1F43uni1F44uni1F45uni1F48uni1F49uni1F4Auni1F4Buni1F4Cuni1F4Duni1F50uni1F51uni1F52uni1F53uni1F54uni1F55uni1F56uni1F57uni1F59uni1F5Buni1F5Duni1F5Funi1F60uni1F61uni1F62uni1F63uni1F64uni1F65uni1F66uni1F67uni1F68uni1F69uni1F6Auni1F6Buni1F6Cuni1F6Duni1F6Euni1F6Funi1F70uni1F71uni1F72uni1F73uni1F74uni1F75uni1F76uni1F77uni1F78uni1F79uni1F7Auni1F7Buni1F7Cuni1F7Duni1F80uni1F81uni1F82uni1F83uni1F84uni1F85uni1F86uni1F87uni1F88uni1F89uni1F8Auni1F8Buni1F8Cuni1F8Duni1F8Euni1F8Funi1F90uni1F91uni1F92uni1F93uni1F94uni1F95uni1F96uni1F97uni1F98uni1F99uni1F9Auni1F9Buni1F9Cuni1F9Duni1F9Euni1F9Funi1FA0uni1FA1uni1FA2uni1FA3uni1FA4uni1FA5uni1FA6uni1FA7uni1FA8uni1FA9uni1FAAuni1FABuni1FACuni1FADuni1FAEuni1FAFuni1FB0uni1FB1uni1FB2uni1FB3uni1FB4uni1FB6uni1FB7uni1FB8uni1FB9uni1FBAuni1FBBuni1FBClenisprosgegrammenipsili perispomenidialytikaperispomeniuni1FC2uni1FC3uni1FC4uni1FC6uni1FC7uni1FC8uni1FC9uni1FCAuni1FCBuni1FCC psilivaria psilioxiapsiliperispomeniuni1FD0uni1FD1uni1FD2uni1FD3uni1FD6uni1FD7uni1FD8uni1FD9uni1FDAuni1FDB dasiavaria dasiaoxiadasiaperispomeniuni1FE0uni1FE1uni1FE2uni1FE3uni1FE4uni1FE5uni1FE6uni1FE7uni1FE8uni1FE9uni1FEAuni1FEBuni1FECdialytikavaria dialytikaoxiavariauni1FF2uni1FF3uni1FF4uni1FF6uni1FF7uni1FF8uni1FF9uni1FFAuni1FFBuni1FFCoxiadasiaenquademquadenspaceemspacethreeperemspacefourperemspace sixperemspace figurespacepunctuationspace thinspace hairspacezerowidthspacezerowidthnonjoinerzerojoinuni200Euni200F hyphentwo hyphennobreak figuredash quotedashdblverticalbar underscoredbl quotereversed quotedblrevtrianglebulletonedotenleadertwodotenleader hyphendot lineseparatorparagraphseparatorlrerlepdflrorlouni202Fpertenthousandprimesecond primetripleprimerev primedblrevprimetriplerevcaret referencemark exclamdbl interrobangoverlineuni203Ftie caretinsertasterism hyphenbulletuni2045uni2046uni2047uni2048uni2049uni204Auni204Buni204Cuni204Duni204Euni204Fclosureuni2051uni2052uni2053uni2054uni2055uni2056uni2057uni2058uni2059uni205Auni205Buni205Cuni205Duni205Euni205Funi2060uni2061uni2062uni2063uni2064 zerosuperioruni2071 foursuperior fivesuperior sixsuperior sevensuperior eightsuperior ninesuperior plussuperior minussuperior equalsuperiorparenleftsuperiorparenrightsuperior nsuperior zeroinferior oneinferior twoinferior threeinferior fourinferior fiveinferior sixinferior seveninferior eightinferior nineinferior plusinferioruni208B equalinferiorparenleftinferiorparenrightinferioruni2090uni2091uni2092uni2093uni2094uni20a0 colonmonetarycruzeiroliramillnairapesetarupeewonsheqeldongEurokiptugrikdrachmapfennigpesoguaraniaustralhryvniaceditenge indian_rupeeleftharpoonaccentrightharpoonaccentuni20D2uni20D3uni20d4uni20d5uni20D6uni20D7uni20d8uni20d9uni20dauni20DBuni20DCuni20DDuni20DEuni20DFuni20E0uni20E1uni20e4uni20E5uni20E6uni20E7uni20E8uni20E9uni20EAuni20EBuni20ECuni20EDuni20EEuni20EFuni20F0 accountofaddresssubjectCbb centigradeCLcareofcadaunaEulerscruple fahrenheitHscript HblackletterHbbplanck planckover2piIscriptIfrakturLscriptlitrelbbarNbbnumero recordright weierstrassPbbQbbRscriptRfrakturRbb prescriptionresponse servicemark telephoneversicleZbbOhmmho Zblackletteriotaturn degreekelvinangstromBscript Cblackletter estimatedescriptEscriptFscriptFturnMscript alephmathbethmath gimelmath dalethmathuni2139uni213auni213buni213cuni213euni213funi2141uni2142uni2143uni2144uni2145uni214auni214buni214duni214eonethird twothirdsuni2155uni2156uni2157uni2158uni2159uni215A oneeighth threeeighths fiveeighths seveneighthsuni215Funi2160uni2161uni2162uni2163uni2164uni2165uni2166uni2167uni2168uni2169uni216Auni216Buni216Cuni216Duni216Euni216Funi2170uni2171uni2172uni2173uni2174uni2175uni2176uni2177uni2178uni2179uni217Auni217Buni217Cuni217Duni217Euni217F arrowleftarrowup arrowright arrowdown arrowboth arrowupdn arrowupleft arrowuprightarrowdownright arrowdownleftuni21a4uni21a5 arrowbarrightuni21a7 arrowhookleftarrowhookrightuni21b4carriagereturnharpoonleftbarbuparrowleftbothalfharpoonupright harpoonupleftharpoonrightbarbuparrowrightbothalfharpoondownrightharpoondownleftuni21C4uni21C5uni21C6uni21c7uni21c8uni21c9uni21cauni21CBharpoonrightleft arrowdblleft arrowdblup arrowdblright arrowdbldown arrowdblboth arrowdblbothvuni21dcarrowsquiggleright universal complement existentialnotexistentialemptyset Delta.mathgradientelement notelementuni220Asuchthat notcontains ownersmalluni220euni2210uni2213dotplus slashmath backslashmath asteriskmath ringoperatoruni2219uni221buni221c proportionaluni221fangleuni2221uni2222dividesnotbarparallel notparallel logicaland logicalor intersectionunionuni222Cuni222Duni222E surfintegral thereforebecauseratio proportionuni2238uni2239uni223auni223bsimilar reversedtildelazysinv wreathproduct notsimilaruni2242 asymptequalnotasymptequal congruentapproxnotequalnotapproxequaluni2249uni224auni224buni224cequivasymptotic approachesuni2251uni2252uni2253uni2254uni2255 ringequaluni2258uni2259uni225auni225bdefinesuni225duni225euni225f equivalence notidenticalstrictequivalenceuni2266uni2267muchless muchgreaternotequivasymptoticnotless notgreater notlessequalnotgreaterequaluni2272uni2273uni2276uni2277precedesfollows precedesequal followsequaluni227euni227f notprecedes notsucceedssubsetsuperset notsubset notsuperset reflexsubsetreflexsuperset notsubseteqlnotsuperseteqluni228Cuni228duni228e squareimagesquareoriginal subsetsqequalsupersetsqequalintersectionsqunionsq circleplus circleminuscirclemultiply circledivide circledot circleringcircleasterisk circleequal circlevertbar turnstilelefttacklefttackdown perpendicular assertion truestatesatisfy triangleright trianglelefttriangleftequaltriangrightequalxornandnornarylogicaland narylogicalornaryintersection naryuniondotmathuni22C6bowtierevasymptequalcurlyorcurlyanduni22d6uni22d7uni22d8uni22d9preceedsnotequalfollowsnotequalnotsubsetsqequalnotsupersetsqequaluni22e6uni22e7uni22e8uni22e9uni22eeuni22efuni22f0uni22f1uni2300 ceilingleft ceilingright floorleft floorrightlogicalnotreversed integraltp integralbtfrown slurbelow angleleft anglerightuni239Buni239Cuni239Duni239Euni239Funi23A0uni23A1uni23A2uni23A3uni23A4uni23A5uni23A6uni23a7uni23a8uni23a9uni23aauni23abuni23acuni23aduni23aeuni23b2uni23b3uni2400uni2401uni2402uni2403uni2404uni2405uni2406uni2407uni2408uni2409uni240auni240buni240cuni240duni240euni240funi2410uni2411uni2412uni2413uni2414uni2415uni2416uni2417uni2418uni2419uni241auni241buni241cuni241duni241euni241funi2420uni2421blankbblankuni2424uni2425uni2426uni2460uni2461uni2462uni2463uni2464uni2465uni2466uni2467uni2468uni2469SF100000uni2501SF110000uni2503uni2504uni2505uni2506uni2507uni2508uni2509uni250Auni250BSF010000uni250Duni250Euni250FSF030000uni2511uni2512uni2513SF020000uni2515uni2516uni2517SF040000uni2519uni251Auni251BSF080000uni251Duni251Euni251Funi2520uni2521uni2522uni2523SF090000uni2525uni2526uni2527uni2528uni2529uni252Auni252BSF060000uni252Duni252Euni252Funi2530uni2531uni2532uni2533SF070000uni2535uni2536uni2537uni2538uni2539uni253Auni253BSF050000uni253Duni253Euni253Funi2540uni2541uni2542uni2543uni2544uni2545uni2546uni2547uni2548uni2549uni254Auni254BSF430000SF240000SF510000SF520000SF390000SF220000SF210000SF250000SF500000SF490000SF380000SF280000SF270000SF260000SF360000SF370000SF420000SF190000SF200000SF230000SF470000SF480000SF410000SF450000SF460000SF400000SF540000SF530000SF440000upblockuni2581uni2582uni2583dnblockuni2585uni2586uni2587blockuni2589uni258Auni258Blfblockuni258Duni258Euni258Frtblockltshadeshadedkshadeuni2594uni2595uni2596uni2597uni2598uni2599uni259Auni259Buni259Cuni259Duni259Euni259F filledboxsquare boxrounded boxnestedsquarehorizontalfillsquareverticalfillsquareorthogonalcrosshatchfillboxleftdiaghatchboxrtdiaghatchboxcrossdiaghatchsquaresmallsolidwhitesmallsquare filledrect rectanglefilledvertrect vertrectanglefilledparallelogram parallelogram trianglesolidtrianglesmalltrianglesld smalltriangleblackrightpointingtrianglewhiterightpointingtrianglesmalltrianglerightsldsmalltrianglerightblackrightpointingpointer triagrtopentriangledownsld triangleinvsmalltriangleinvsldsmalltriangleinvblackleftpointingtrianglewhiteleftpointingtrianglesmalltriangleleftsldsmalltriangleleftblackleftpointingpointer triaglfopen diamondsolid diamondrhombdiamondrhombnestedfisheyecircle dottedcirclecircleverthatchbullseye circlesolid circleleftsldcirclerightsldcirclebottomsld circletopsld circlenesld circlenwopensemicircleleftsldsemicirclelertsld bulletinversewhitecircleinverseinvsemicircleupinvsemicircledn nwquadarc nequadarc sequadarc swquadarctoparc bottomarc trianglesesld triangleswsld tranglenwsld trianglenesld whitebullet squareleftsldsquarerightsld squarenwsld squaresesldsquarevertbisect triangledottriangleleftsldtrianglerightsld largecircleuni25f0uni25f1uni25f2uni25f3uni25f4uni25f5uni25f6uni25f7uni25f8uni25f9uni25fauni25fbuni25fcuni25fduni25feuni25ffuni262Cuni262Duni2639 smilefacespade heartopen diamondopenclubspadesuitwhiteheartdiamond clubsuitwhiteuni2669 musicalnotemusicalnotedbluni266Cuni266Duni266Euni266Funi2740uni2A00uni2A01uni2A02uni2A03uni2A04uni2A09uni2D30uni2D31uni2D32uni2D33uni2D34uni2D35uni2D36uni2D37uni2D38uni2D39uni2D3Auni2D3Buni2D3Cuni2D3Duni2D3Euni2D3Funi2D40uni2D41uni2D42uni2D43uni2D44uni2D45uni2D46uni2D47uni2D48uni2D49uni2D4Auni2D4Buni2D4Cuni2D4Duni2D4Euni2D4Funi2D50uni2D51uni2D52uni2D53uni2D54uni2D55uni2D56uni2D57uni2D58uni2D59uni2D5Auni2D5Buni2D5Cuni2D5Duni2D5Euni2D5Funi2D60uni2D61uni2D62uni2D63uni2D64uni2D65uni2D66uni2D67uni2D6Funi2e16uni2E17uni2e18uni2e1auni2e1buni2e1euni2e1funi2e28uni2e29uni2e2auni2e2buni2e2cuni2e2duni2e2euni2e30uniA500uniA501uniA502uniA503uniA504uniA505uniA506uniA507uniA508uniA509uniA50AuniA50BuniA50CuniA50DuniA50EuniA50FuniA510uniA511uniA512uniA513uniA514uniA515uniA516uniA517uniA518uniA519uniA51AuniA51BuniA51CuniA51DuniA51EuniA51FuniA520uniA521uniA522uniA523uniA524uniA525uniA526uniA527uniA528uniA529uniA52AuniA52BuniA52CuniA52DuniA52EuniA52FuniA530uniA531uniA532uniA533uniA534uniA535uniA536uniA537uniA538uniA539uniA53AuniA53BuniA53CuniA53DuniA53EuniA53FuniA540uniA541uniA542uniA543uniA544uniA545uniA546uniA547uniA548uniA549uniA54AuniA54BuniA54CuniA54DuniA54EuniA54FuniA550uniA551uniA552uniA553uniA554uniA555uniA556uniA557uniA558uniA559uniA55AuniA55BuniA55CuniA55DuniA55EuniA55FuniA560uniA561uniA562uniA563uniA564uniA565uniA566uniA567uniA568uniA569uniA56AuniA56BuniA56CuniA56DuniA56EuniA56FuniA570uniA571uniA572uniA573uniA574uniA575uniA576uniA577uniA578uniA579uniA57AuniA57BuniA57CuniA57DuniA57EuniA57FuniA580uniA581uniA582uniA583uniA584uniA585uniA586uniA587uniA588uniA589uniA58AuniA58BuniA58CuniA58DuniA58EuniA58FuniA590uniA591uniA592uniA593uniA594uniA595uniA596uniA597uniA598uniA599uniA59AuniA59BuniA59CuniA59DuniA59EuniA59FuniA5A0uniA5A1uniA5A2uniA5A3uniA5A4uniA5A5uniA5A6uniA5A7uniA5A8uniA5A9uniA5AAuniA5ABuniA5ACuniA5ADuniA5AEuniA5AFuniA5B0uniA5B1uniA5B2uniA5B3uniA5B4uniA5B5uniA5B6uniA5B7uniA5B8uniA5B9uniA5BAuniA5BBuniA5BCuniA5BDuniA5BEuniA5BFuniA5C0uniA5C1uniA5C2uniA5C3uniA5C4uniA5C5uniA5C6uniA5C7uniA5C8uniA5C9uniA5CAuniA5CBuniA5CCuniA5CDuniA5CEuniA5CFuniA5D0uniA5D1uniA5D2uniA5D3uniA5D4uniA5D5uniA5D6uniA5D7uniA5D8uniA5D9uniA5DAuniA5DBuniA5DCuniA5DDuniA5DEuniA5DFuniA5E0uniA5E1uniA5E2uniA5E3uniA5E4uniA5E5uniA5E6uniA5E7uniA5E8uniA5E9uniA5EAuniA5EBuniA5ECuniA5EDuniA5EEuniA5EFuniA5F0uniA5F1uniA5F2uniA5F3uniA5F4uniA5F5uniA5F6uniA5F7uniA5F8uniA5F9uniA5FAuniA5FBuniA5FCuniA5FDuniA5FEuniA5FFuniA600uniA601uniA602uniA603uniA604uniA605uniA606uniA607uniA608uniA609uniA60AuniA60BuniA60CuniA60DuniA60EuniA60FuniA610uniA611uniA612uniA613uniA614uniA615uniA616uniA617uniA618uniA619uniA61AuniA61BuniA61CuniA61DuniA61EuniA61FuniA620uniA621uniA622uniA623uniA624uniA625uniA626uniA627uniA628uniA629uniA62AuniA62B lowcircumflex colonmodifier shortequalsSaltillosaltillouniA7AAffffiffllongs_t m_n_armenian m_e_armenian m_i_armenian v_n_armenian m_x_armenianyodhiriqhebrewuniFB1EyodyodpatahhebrewayinaltonehebrewuniFB21uniFB22uniFB23uniFB24uniFB25uniFB26uniFB27uniFB28uniFB29shinshindothebrewshinsindothebrewshindageshshindothebrewshindageshsindothebrewalefpatahhebrewalefqamatshebrewalefdageshhebrewbetdageshhebrewgimeldageshhebrewdaletdageshhebrewhedageshhebrewvavdageshhebrewzayindageshhebrewtetdageshhebrewyoddageshhebrewfinalkafdageshhebrewkafdageshhebrewlameddageshhebrewmemdageshhebrewnundageshhebrewsamekhdageshhebrewpefinaldageshhebrewpedageshhebrewtsadidageshhebrewqofdageshhebrewreshdageshhebrewshindageshhebrewtavdageshhebrewvavholamhebrew betrafehebrew kafrafehebrew perafehebrewaleflamedhebrewunifff9unifffaunifffbunifffcuniFFFDuni10380uni10381uni10382uni10383uni10384uni10385uni10386uni10387uni10388uni10389uni1038auni1038buni1038cuni1038duni1038euni1038funi10390uni10391uni10392uni10393uni10394uni10395uni10396uni10397uni10398uni10399uni1039auni1039buni1039cuni1039duni1039funi103a0uni103a1uni103a2uni103a3uni103a4uni103a5uni103a6uni103a7uni103a8uni103a9uni103aauni103abuni103acuni103aduni103aeuni103afuni103b0uni103b1uni103b2uni103b3uni103b4uni103b5uni103b6uni103b7uni103b8uni103b9uni103bauni103bbuni103bcuni103bduni103beuni103bfuni103c0uni103c1uni103c2uni103c3uni103c8uni103c9uni103cauni103cbuni103ccuni103cduni103ceuni103cfuni103d0uni103d1uni103d2uni103d3uni103d4uni103d5uni10480uni10481uni10482uni10483uni10484uni10485uni10486uni10487uni10488uni10489uni1048auni1048buni1048cuni1048duni1048euni1048funi10490uni10491uni10492uni10493uni10494uni10495uni10496uni10497uni10498uni10499uni1049auni1049buni1049cuni1049duni104a0uni104a1uni104a2uni104a3uni104a4uni104a5uni104a6uni104a7uni104a8uni104a9uni10900uni10901uni10902uni10903uni10904uni10905uni10906uni10907uni10908uni10909uni1090auni1090buni1090cuni1090duni1090euni1090funi10910uni10911uni10912uni10913uni10914uni10915uni10916uni10917uni10918uni10919uni1091auni1091buni1091f bn_initekaar bn_initaikaarbn_reph bn_kaphala bn_nnaphala bn_taphala bn_thaphala bn_thaphala1 bn_dhaphala bn_naphala bn_below_ba bn_bhaphala bn_raphala bn_laphala bn_half_ka bn_half_kha bn_half_ga bn_half_gha bn_half_nga bn_half_ca bn_half_ca1 bn_half_cha bn_half_ja bn_half_jha bn_half_nya bn_half_tta bn_half_ttha bn_half_dda bn_half_ddha bn_half_nna bn_half_tha bn_half_dha bn_half_da bn_half_na bn_half_pa bn_half_pha bn_half_ba bn_half_bha bn_half_ma bn_half_ya bn_half_ra bn_half_la bn_half_sha bn_half_ssa bn_half_sa bn_half_ha bn_half_rra bn_half_rha bn_half_yyabn_half_asamirabn_half_asamiba bn_khaphala bn_phaphala bn_baphala1 bn_maphala bn_maphala1 bn_yaphalabn_k_rabn_k_ra1bn_kh_rabn_g_rabn_gh_rabn_c_rabn_ch_rabn_j_rabn_tt_ra bn_tth_rabn_dd_ra bn_ddh_rabn_t_rabn_t_ra1bn_th_rabn_d_rabn_dh_rabn_n_rabn_n_ra1bn_p_rabn_ph_rabn_b_rabn_bh_ra bn_bh_ra1bn_m_rabn_y_ra bn_ssa_mal_rabn_ss_rabn_s_rabn_s_ra1bn_h_ra bn_asamir_ra bn_asamib_ra bn_k_ss_rabn_k_kabn_k_tta bn_k_tt_rabn_k_tabn_k_ta1 bn_k_t_ba bn_k_t_ba1 bn_k_t_ra bn_k_t_ra1 bn_k_t_ra2bn_k_nabn_k_mabn_k_labn_k_ssa bn_k_ss_nna bn_k_ss_mabn_k_sabn_g_gabn_g_dabn_g_dha bn_g_dh_babn_g_labn_g_nabn_g_mabn_gh_na bn_nga_mal_kabn_nga_mal_k_rabn_nga_mal_k_ssabn_nga_mal_k_ss_rabn_nga_mal_kha bn_nga_mal_gabn_nga_mal_ghabn_nga_mal_gh_ra bn_nga_mal_mabn_nga_mal_ma1bn_c_cabn_c_cha bn_c_ch_ba bn_c_ch_rabn_c_nyabn_c_nabn_j_ja bn_j_j_babn_j_jhabn_j_nyabn_ny_ca bn_ny_chabn_ny_ja bn_ny_jha bn_tt_tta bn_tt_tt_rabn_tt_mabn_dd_ga bn_dd_ddabn_dd_ma bn_nn_tta bn_nn_tt_ra bn_nn_ttha bn_nn_dda bn_nn_dda1 bn_nn_dd_ra bn_nn_dd_ra1 bn_nn_ddha bn_nn_nnabn_nn_mabn_t_ta bn_t_t_babn_t_thabn_t_nabn_t_mabn_t_ma1bn_t_labn_d_gabn_d_ghabn_d_da bn_d_d_ba bn_d_d_rabn_d_dha bn_d_dh_babn_d_nabn_d_bha bn_d_bh_ra bn_d_bh_ra1bn_d_mabn_dh_nabn_dh_mabn_n_tta bn_n_tt_ra bn_n_tthabn_n_dda bn_n_dd_ra bn_n_ddhabn_n_ta bn_n_t_ba bn_n_t_ra bn_n_t_ra1bn_n_thabn_n_da bn_n_d_ba bn_n_d_rabn_n_dha bn_n_dh_ba bn_n_dh_rabn_n_nabn_n_mabn_n_ma1bn_n_sabn_p_ttabn_p_tabn_p_pabn_p_mabn_p_nabn_p_labn_p_sa bn_ph_ttabn_ph_labn_b_jabn_b_da bn_b_d_rabn_b_dhabn_b_nabn_b_bhabn_b_labn_bh_labn_m_tabn_m_thabn_m_dabn_m_nabn_m_na1bn_m_pa bn_m_p_ra bn_m_p_labn_m_pha bn_m_ph_rabn_m_bha bn_m_bh_ra bn_m_bh_ra1bn_m_mabn_m_ma1bn_m_labn_m_la1bn_m_sa bn_m_s_rabn_l_kabn_l_gabn_l_tta bn_l_tt_rabn_l_dda bn_l_dd_rabn_l_tabn_l_dabn_l_dhabn_l_pabn_l_pha bn_l_ph_rabn_l_mabn_l_la bn_ssa_mal_cabn_ssa_mal_cha bn_ssa_mal_ta bn_ssa_mal_na bn_ssa_mal_ma bn_ssa_mal_labn_ss_ka bn_ss_k_ra bn_ss_k_ra1 bn_ss_tta bn_ss_tta1 bn_ss_tt_ra bn_ss_tt_ra1 bn_ss_ttha bn_ss_nnabn_ss_pa bn_ss_p_ra bn_ss_pha bn_ss_ph_rabn_ss_ma bn_ss_ma1bn_s_ka bn_s_k_ra bn_s_k_ra1bn_s_khabn_s_tta bn_s_tta1 bn_s_tt_ra bn_s_tt_ra1bn_s_ta bn_s_t_ba bn_s_t_ra bn_s_t_ra1bn_s_thabn_s_nabn_s_na1bn_s_pa bn_s_p_ra bn_s_p_labn_s_pha bn_s_ph_rabn_s_mabn_s_ma1bn_s_labn_s_la1bn_h_nnabn_h_nabn_h_mabn_h_labn_h_la1bn_rr_gabn_k_babn_g_babn_gh_babn_c_babn_ch_babn_j_babn_tt_babn_dd_babn_nn_babn_t_babn_th_babn_d_babn_dh_ba bn_dh_ba1bn_n_babn_n_ba1bn_p_babn_b_babn_bh_babn_m_ba bn_m_b_rabn_m_ba1 bn_m_b_ra1bn_l_ba bn_ssa_mal_babn_s_babn_s_ba1bn_h_babn_h_ba1 bn_kh_r_ukaarbn_kh_r_uukaar bn_g_ukaar bn_g_r_ukaar bn_g_r_uukaar bn_g_l_ukaar bn_g_l_uukaar bn_j_r_ukaar bn_j_r_uukaar bn_t_r_ukaar bn_t_r_uukaar bn_th_r_ukaarbn_th_r_uukaar bn_d_ukaar bn_d_r_ukaar bn_d_r_uukaar bn_dh_r_ukaarbn_dh_r_uukaar bn_n_ukaar bn_n_uukaar bn_n_rikaar bn_n_t_ukaarbn_n_d_r_ukaarbn_n_d_r_uukaar bn_p_r_ukaar bn_p_r_uukaar bn_p_l_ukaar bn_p_l_uukaar bn_b_r_ukaar bn_b_r_uukaar bn_b_l_ukaar bn_b_l_uukaar bn_bh_r_ukaarbn_bh_r_uukaar bn_m_r_ukaar bn_m_r_uukaarbn_m_p_r_ukaarbn_m_p_r_uukaar bn_r_ukaar bn_r_uukaar bn_l_g_ukaarbn_ssa_mal_ukaarbn_ssa_mal_r_ukaarbn_ssa_mal_r_uukaarbn_ssa_mal_l_ukaarbn_ssa_mal_l_uukaarbn_ss_p_r_ukaarbn_ss_p_r_uukaar bn_s_ukaar bn_s_uukaar bn_s_rikaar bn_s_t_ukaar bn_s_r_ukaar bn_s_r_uukaarbn_s_p_r_ukaarbn_s_p_r_uukaarbn_s_p_l_ukaarbn_s_p_l_uukaar bn_s_l_ukaar bn_s_l_uukaar bn_h_ukaar bn_h_rikaarbn_asamir_ukaarbn_asamir_uukaarbn_asamib_ukaarbn_asamib_uukaarbn_asamib_r_ukaarbn_asamib_r_uukaar bn_k_hasanta bn_kh_hasanta bn_g_hasanta bn_gh_hasantabn_nga_mal_hasanta bn_c_hasanta bn_ch_hasanta bn_j_hasanta bn_jh_hasanta bn_ny_hasanta bn_tt_hasantabn_tth_hasanta bn_dd_hasantabn_ddh_hasanta bn_nn_hasanta bn_t_hasanta bn_th_hasanta bn_d_hasanta bn_dh_hasanta bn_n_hasanta bn_p_hasanta bn_ph_hasanta bn_b_hasanta bn_bh_hasanta bn_m_hasanta bn_y_hasanta bn_r_hasanta bn_l_hasantabn_ssa_mal_hasanta bn_ss_hasanta bn_s_hasanta bn_h_hasanta bn_rr_hasantabn_rra_mal_hasanta bn_yy_hasantabn_asamir_hasantabn_asamib_hasanta bn_post_k_raglyph569glyph570glyph571glyph572glyph57487 bn_baphala bn_below_ba2glyph578glyph579glyph580glyph581glyph582glyph583bn_ssa_mal_ra.001bn_yaphala.002bn_d_yabn_n_ya bn_la.001 bn_ssa_mal_yabn_ss_yabn_s_yaglyph593bn_h_yaglyph595 bn_ss_tta.002glyph597glyph598 bn_uukaar.1glyph600 deva_tta.nuktdeva_ttha.nuktdev_ii_anusvara.abvsdev_e_candra.abvsdev_o_candra.abvsdev_au_ra_candra.abvsdev_ai_ra_candra.abvsdev_ra_candra.abvs dev_cha.nuktdev_ha_rrvocalic.blwsdev_ka_ssa.akhndev_ja_nya.akhndev_ta_ta.pres dev_ta.vatudev_sha_ca.pres dev_sha.vatudev_sha_va.pres dev_za.vatu dev_sa.vatu dev_ra_u.blwsdev_ra_uu.blwsdev_ka_na.presdev_kha_na.presdev_gha_na.presglyph269 dev_ka.half dev_kha.half dev_ga.half dev_gha.half dev_ca.halfUNUSED_dev_ja_na dev_ja.half dev_jha.half dev_nya.halfdev_ta_na.presdev_tha_na.presdev_da_na.presdev_dha_na.pres dev_nna.half dev_ta.half dev_tha.halfdev_da_da_half.pres dev_dha.half dev_na.halfdev_na.half.nukt dev_pa.half dev_pha.half dev_ba.half dev_bha.half dev_ma.half dev_ya.halfdev_pa_na.presUNUSED_dev_ka_na dev_la.half dev_lla.half dev_llla.half dev_va.half dev_sha.half dev_ssa.half dev_sa.half dev_ha.halfdev_na_half_na.halfdev_ba_na.presUNUSED_dev_ba_nadev_ma_na.presdev_va_na.presdev_sha_na.presdev_ka_ka.presdev_nga_ka.presdev_nga_kha.presdev_nga_ga.presdev_nga_gha.presdev_nya_ja.presdev_da_gha.presdev_da_da.presdev_da_dha.presdev_da_ba.presdev_da_bha.presdev_da_ma.presdev_da_ya.presdev_da_va.presdev_tta_tta.presdev_tta_ttha.presdev_ttha_ttha.presdev_da_da_half_ga.presdev_da_da_half_dda.presdev_da_da_half_ddha.presdev_ha_half_ma.presdev_ha_half_ya.presdev_la_half_ha.presglyph335dev_sa_half_ta_half_ra.presglyph337dev_rra_ra.halfdev_ca_ca.halfdev_sa_na_half.presglyph341glyph342glyph343glyph344glyph345glyph346glyph347glyph348glyph349dev_ka_ssa.akhn.halfdev_ja_nya.akhn.halfdev_ta_ta.halfdev_ta.half.vatudev_sha_ca.halfdev_sha.vatu.halfdev_sha_va.halfdev_ha_rvocalic.blws dev_rakaardev_ra_anusvara.rphfdev_ha_ra.blws dev_ra.rphfdev_rakaar.blwfdev_kash_au_markdev_ii_ra.abvsdev_e_anusvara.abvs dev_e_ra.abvsdev_e_ra_anusvara.abvsdev_ai_anusvara.abvsdev_ai_ra.abvsdev_ai_ra_anusvara.abvsdev_sa_tta.half.vatudev_na_half_na.pres dev_nga.half dev_tta.half dev_ttha.half dev_dda.half dev_ddha.half dev_da.half dev_nga.vatu dev_cha.vatu dev_jha.vatu dev_tta.vatu dev_ttha.vatu dev_dda.vatu dev_ddha.vatu dev_ra.vatu dev_la.vatudev_sha_half_la_half.presdev_ssa_half_ta.presdev_ssa_half_ttha.presdev_ssa_half_ta_ra.vatudev_ssa_half_ttha_ra.vatudev_sha_half_na_half.presdev_sa_half_ta_half_EMPTY.presdev_da_half_ma_half.presdev_ta_half_na_half.presdev_ha_half_nna.presdev_ha_half_la.presdev_ha_half_va.presdev_pa_half_ta_half.presdev_ha_half_na.presdev_ha_half_ma_half.presdev_pa.half.vatudev_nga.half.nukt dev_ha.nukt dev_da.nuktdev_tta.nukt.haln dev_ttha.halndev_dddha.haln dev_rha.halndev_da.nukt.halndev_ha.nukt.halndev_nga.nukt.halndev_ha_half_nna.halndev_ha_half_na.halndev_ha_half_la.halndev_ha_half_va.halndev_pha_virama.nuktdev_ja_virama.nukt gur_ra.blwf gur_va.blwf gur_ha.blwfgur_ya_halant.pstfglyph152glyph153glyph154glyph155glyph156glyph157gur_ra_umatra.blwsgur_ha_umatra.blwsnounicode_3_1_3glyph161gur_ra_uumatra.blwsgur_ha_uumatra.blwsnounicode_3_1_30gur_na_uumatra_tippi.abvsgur_aamatra_bindi.abvsgur_u_addak.pstsgur_uu_addak.pstsgur_oo_addak.psts gur_ka.nukt gur_gha.nukt gur_nga.nukt gur_ca.nukt gur_cha.nukt gur_jha.nukt gur_nya.nukt gur_tta.nukt gur_ttha.nukt gur_ddha.nukt gur_nna.nukt gur_ta.nukt gur_tha.nukt gur_da.nukt gur_dha.nukt gur_na.nukt gur_pa.nukt gur_ba.nukt gur_bha.nukt gur_ma.nukt gur_ya.nukt gur_ra.nukt gur_va.nukt gur_ha.nukt gur_a.nukt gur_aa.nukt gur_i.nukt gur_ii.nukt gur_u.nukt gur_uu.nukt gur_ee.nukt gur_ai.nukt gur_oo.nukt gur_au.nuktgur_aa_bindi.abvsgur_va_umatra.blwsgur_va_uumatra.blws gur_ra.blws gur_ha.blws gur_va.blwscyrillic_cresc cyrillic_dotcyrillic_titlo ucas.ringucas.horizlineucas.shortvertucas.righttack ucas.lefttackcyrillic_ukrainian_yi_yi_ligEngsamisc.asc.bsc.csc.dsc.esc.fsc.gsc.hsc.isc.jsc.ksc.lsc.msc.nsc.osc.psc.qsc.rsc.ssc.tsc.usc.vsc.wsc.xsc.ysc.zsc.ae sc.oslash sc.ssharpsc.thornsc.eth sc.lslashsc.uhornsc.ohornmal_k1u1mal_k1u2mal_k1r1mal_k1r2mal_k1l1mal_k1k1 mal_k1k1u1 mal_k1k1u2 mal_k1k1r1 mal_k1k1r3 mal_k1k1r3u1 mal_k1k1r3u2mal_k1t1 mal_k1t1u1 mal_k1t1u2 mal_k1t1r3 mal_k1t1r3u1 mal_k1t1r3u2mal_k1nh mal_k1nhu1 mal_k1nhu2 mal_k1th1 mal_k1th1u1 mal_k1th1u2 mal_k1th1r1 mal_k1th1r2 mal_k1th1r3 mal_k1th1r3u1 mal_k1th1r3u2mal_k1n1 mal_k1n1u1 mal_k1n1u2mal_k1m1 mal_k1m1u1 mal_k1m1u2mal_k1r3 mal_k1r3u1 mal_k1r3u2mal_k1l3 mal_k1l3u1 mal_k1l3u2mal_k1sh mal_k1shu1 mal_k1shu2 mal_k1shr1 mal_k1shnh mal_k1shnhu1 mal_k1shnhu2 mal_k1shm1 mal_k1shm1u1 mal_k1shm1u2 mal_k1shm1r1mal_k1s1 mal_k1s1u1 mal_k1s1u2 mal_k1s1r1 mal_k1rhrh mal_k1rhrhu1 mal_k1rhrhu2mal_k2u1mal_k2u2mal_k2r1mal_k3u1mal_k3u2mal_k3r1mal_k3r2mal_k3k3 mal_k3k3u1 mal_k3k3u2 mal_k3k3r1mal_k3k4 mal_k3k4u1 mal_k3k4u2 mal_k3k4r1 mal_k3th3 mal_k3th3u1 mal_k3th3u2 mal_k3th3r1 mal_k3th3th4mal_k3th3th4u1mal_k3th3th4u2mal_k3th3th4r1mal_k3th3th4r3mal_k3th3th4r3u1mal_k3th3th4r3u2mal_k3n1 mal_k3n1u1 mal_k3n1u2mal_k3m1 mal_k3m1u1 mal_k3m1u2mal_k3r3 mal_k3r3u1 mal_k3r3u2mal_k3l3 mal_k3l3u1 mal_k3l3u2mal_k4u1mal_k4u2mal_k4r1mal_k4r2mal_k4n1 mal_k4n1u1 mal_k4n1u2mal_k4r3 mal_k4r3u1 mal_k4r3u2mal_ngu1mal_ngu2mal_ngk1 mal_ngk1u1 mal_ngk1u2 mal_ngk1r1mal_ngng mal_ngngu1 mal_ngngu2 mal_ch1u1 mal_ch1u2 mal_ch1ch1 mal_ch1ch1u1 mal_ch1ch1u2 mal_ch1ch2 mal_ch1ch2u1 mal_ch1ch2u2 mal_ch1ch2r1 mal_ch1ch2r3mal_ch1ch2r3u1mal_ch1ch2r3u2 mal_ch2u1 mal_ch2u2 mal_ch2r1 mal_ch2r3 mal_ch2r3u1 mal_ch2r3u2 mal_ch3u1 mal_ch3u2 mal_ch3r1 mal_ch3r2 mal_ch3ch3 mal_ch3ch3u1 mal_ch3ch3u2 mal_ch3ch3r1 mal_ch3nj mal_ch3nju1 mal_ch3nju2 mal_ch3r3 mal_ch3r3u1 mal_ch3r3u2 mal_ch4u1 mal_ch4u2 mal_ch4r1 mal_ch4r2 mal_ch4r3 mal_ch4r3u1 mal_ch4r3u2mal_nju1mal_nju2 mal_njch1 mal_njch1u1 mal_njch1u2 mal_njch1r1 mal_njch2 mal_njch2u1 mal_njch2u2 mal_njch2r1 mal_njch3 mal_njch3u1 mal_njch3u2mal_njnj mal_njnju1 mal_njnju2mal_t1u1mal_t1u2mal_t1r1mal_t1r2mal_t1t1 mal_t1t1u1 mal_t1t1u2mal_t1r3 mal_t1r3u1 mal_t1r3u2mal_t2u1mal_t2u2mal_t3u1mal_t3u2mal_t3r1mal_t3t3 mal_t3t3u1 mal_t3t3u2mal_t3t4 mal_t3t4u1 mal_t3t4u2mal_t3m1 mal_t3m1u1 mal_t3m1u2 mal_t3m1r1mal_t3r3 mal_t3r3u1 mal_t3r3u2mal_t4u1mal_t4u2mal_t4r1mal_t4r3 mal_t4r3u1 mal_t4r3u2mal_nhu1mal_nhu2mal_nht1 mal_nht1u1 mal_nht1u2 mal_nht1r3 mal_nht1r3u1 mal_nht1r3u2mal_nht2mal_nht3 mal_nht3u1 mal_nht3u2 mal_nht3r1 mal_nht3r3 mal_nht3r3u1 mal_nht3r3u2mal_nht4 mal_nht4u1 mal_nht4u2 mal_nht4r1mal_nhnh mal_nhnhu1 mal_nhnhu2mal_nhm1 mal_nhm1u1 mal_nhm1u2 mal_th1u1 mal_th1u2 mal_th1r1 mal_th1r2 mal_th1th1 mal_th1th1u1 mal_th1th1u2 mal_th1th1r1 mal_th1th1r2 mal_th1th1r3mal_th1th1r3u1mal_th1th1r3u2 mal_th1th2 mal_th1th2u1 mal_th1th2u2 mal_th1th2r1 mal_th1n1 mal_th1p4 mal_th1p4u1 mal_th1p4u2 mal_th1p4r1 mal_th1m1 mal_th1m1u1 mal_th1m1u2 mal_th1m1r1 mal_th1r3 mal_th1r3u1 mal_th1r3u2 mal_th1l3 mal_th1l3u1 mal_th1l3u2 mal_th1s1 mal_th1s1u1 mal_th1s1u2 mal_th1s1r1 mal_th1s1r2 mal_th1s1th2mal_th1s1th2u1mal_th1s1th2u2mal_th1s1th2r1 mal_th1s1n1 mal_th1s1n1u1 mal_th1s1n1u2 mal_th1s1m1 mal_th1s1m1u1 mal_th1s1m1u2 mal_th1s1m1r1 mal_th1s1r3 mal_th1s1r3u1 mal_th1s1r3u2 mal_th2u1 mal_th2u2 mal_th2n1 mal_th2n1u1 mal_th2n1u2 mal_th2m1 mal_th2m1u1 mal_th2m1u2 mal_th2m1r1 mal_th3u1 mal_th3u2 mal_th3r1 mal_th3r2 mal_th3th3 mal_th3th3u1 mal_th3th3u2 mal_th3th3r1 mal_th3th3r2 mal_th3th4 mal_th3th4u1 mal_th3th4u2 mal_th3th4r1 mal_th3th4r2 mal_th3th4n1mal_th3th4n1u1mal_th3th4n1u2 mal_th3th4m1mal_th3th4m1u1mal_th3th4m1u2mal_th3th4m1r1 mal_th3th4r3mal_th3th4r3u1mal_th3th4r3u2 mal_th3r3 mal_th3r3u1 mal_th3r3u2 mal_th4u1 mal_th4u2 mal_th4r1 mal_th4r2 mal_th4n1 mal_th4n1u1 mal_th4n1u2 mal_th4m1 mal_th4m1u1 mal_th4m1u2 mal_th4m1r1 mal_th4r3 mal_th4r3u1 mal_th4r3u2mal_n1u1mal_n1u2mal_n1r1mal_n1r2 mal_n1th1 mal_n1th1u1 mal_n1th1u2 mal_n1th1r1 mal_n1th1r2 mal_n1th1r3 mal_n1th1r3u1 mal_n1th1r3u2 mal_n1th2 mal_n1th2u1 mal_n1th2u2 mal_n1th2r1 mal_n1th2r2 mal_n1th3 mal_n1th3u1 mal_n1th3u2 mal_n1th3r1 mal_n1th3r3 mal_n1th3r3u1 mal_n1th3r3u2 mal_n1th4 mal_n1th4u1 mal_n1th4u2 mal_n1th4r3 mal_n1th4r3u1 mal_n1th4r3u2mal_n1n1 mal_n1n1u1 mal_n1n1u2 mal_n1n1r1 mal_n1n1r3 mal_n1n1r3u1 mal_n1n1r3u2mal_n1m1 mal_n1m1u1 mal_n1m1u2 mal_n1m1r1 mal_n1m1r3 mal_n1m1r3u1 mal_n1m1r3u2mal_n1r3 mal_n1r3u1 mal_n1r3u2mal_n1rh mal_n1rhu1 mal_n1rhu2mal_p1u1mal_p1u2mal_p1r1mal_p1r2mal_p1t1 mal_p1t1u1 mal_p1t1u2 mal_p1th1 mal_p1th1u1 mal_p1th1u2 mal_p1th1r1 mal_p1th1r2mal_p1n1 mal_p1n1u1 mal_p1n1u2mal_p1p1 mal_p1p1u1 mal_p1p1u2 mal_p1p1r1mal_p1p2 mal_p1p2u1 mal_p1p2u2mal_p1r3 mal_p1r3u1 mal_p1r3u2mal_p1l3 mal_p1l3u1 mal_p1l3u2mal_p1s1 mal_p1s1u1 mal_p1s1u2 mal_p1s1r1 mal_p1s1r3 mal_p1s1r3u1 mal_p1s1r3u2mal_p2u1mal_p2u2mal_p2k1 mal_p2k1u1 mal_p2k1u2mal_p2t1 mal_p2t1u1 mal_p2t1u2 mal_p2th1 mal_p2th1u1 mal_p2th1u2 mal_p2th1r1mal_p2n1 mal_p2n1u1 mal_p2n1u2mal_p2p1 mal_p2p1u1 mal_p2p1u2mal_p2m1 mal_p2m1u1 mal_p2m1u2mal_p2r3 mal_p2r3u1 mal_p2r3u2mal_p2l3 mal_p2l3u1 mal_p2l3u2mal_p2s1 mal_p2s1u1 mal_p2s1u2 mal_p2s1r1 mal_p2rhrh mal_p2rhrhu1 mal_p2rhrhu2mal_p3u1mal_p3u2mal_p3r1mal_p3k3 mal_p3k3u1 mal_p3k3u2 mal_p3k3r1 mal_p3ch3 mal_p3ch3u1 mal_p3ch3u2 mal_p3ch3r1 mal_p3th3 mal_p3th3u1 mal_p3th3u2 mal_p3th3r1 mal_p3th4 mal_p3th4u1 mal_p3th4u2 mal_p3th4r1 mal_p3th4r2mal_p3n1 mal_p3n1u1 mal_p3n1u2mal_p3p3 mal_p3p3u1 mal_p3p3u2mal_p3p4mal_p3r3 mal_p3r3u1 mal_p3r3u2mal_p3l3 mal_p3l3u1 mal_p3l3u2mal_p4u1mal_p4u2mal_p4r1mal_p4r2mal_p4r3 mal_p4r3u1 mal_p4r3u2mal_m1u1mal_m1u2mal_m1r1mal_m1r2mal_m1n1 mal_m1n1u1 mal_m1n1u2mal_m1p1 mal_m1p1u1 mal_m1p1u2 mal_m1p1r1 mal_m1p1r3 mal_m1p1r3u1 mal_m1p1r3u2mal_m1m1 mal_m1m1u1 mal_m1m1u2 mal_m1m1r1mal_m1r3 mal_m1r3u1 mal_m1r3u2mal_m1l3 mal_m1l3u1 mal_m1l3u2mal_y1u1mal_y1u2mal_y1r1mal_y1k1 mal_y1k1u1 mal_y1k1u2 mal_y1k1r1 mal_y1k1k1 mal_y1k1k1u1 mal_y1k1k1u2 mal_y1ch1 mal_y1ch1u1 mal_y1ch1u2 mal_y1th1 mal_y1th1u1 mal_y1th1u2 mal_y1th1r1 mal_y1th1th1mal_y1th1th1u1mal_y1th1th1u2mal_y1th1th1r1mal_y1n1 mal_y1n1u1 mal_y1n1u2mal_y1p1 mal_y1p1u1 mal_y1p1u2 mal_y1p1r1mal_y1m1 mal_y1m1u1 mal_y1m1u2 mal_y1m1r1mal_y1y1 mal_y1y1u1 mal_y1y1u2mal_r3u1mal_r3u2mal_r3r1mal_l3u1mal_l3u2mal_l3r1mal_l3k1 mal_l3k1u1 mal_l3k1u2 mal_l3k1r1 mal_l3k1k1 mal_l3k1k1u1 mal_l3k1k1u2mal_l3k3 mal_l3k3u1 mal_l3k3u2 mal_l3k3r1 mal_l3ch1 mal_l3ch1u1 mal_l3ch1u2 mal_l3th1 mal_l3th1u1 mal_l3th1u2 mal_l3th1r1 mal_l3th1th1mal_l3th1th1u1mal_l3th1th1u2mal_l3p1 mal_l3p1u1 mal_l3p1u2 mal_l3p1r3 mal_l3p1r3u1 mal_l3p1r3u2mal_l3p2 mal_l3p2u1 mal_l3p2u2mal_l3p3 mal_l3p3u1 mal_l3p3u2mal_l3m1 mal_l3m1u1 mal_l3m1u2mal_l3l3 mal_l3l3u1 mal_l3l3u2mal_v1u1mal_v1u2mal_v1r1mal_v1r3 mal_v1r3u1 mal_v1r3u2mal_v1l3 mal_v1l3u1 mal_v1l3u2mal_v1v1 mal_v1v1u1 mal_v1v1u2mal_z1u1mal_z1u2mal_z1r1 mal_z1ch1 mal_z1ch1u1 mal_z1ch1u2 mal_z1ch1r1 mal_z1ch2 mal_z1ch2u1 mal_z1ch2u2 mal_z1ch2r1mal_z1n1 mal_z1n1u1 mal_z1n1u2mal_z1m1 mal_z1m1u1 mal_z1m1u2 mal_z1m1r1mal_z1r3 mal_z1r3u1 mal_z1r3u2mal_z1l3 mal_z1l3u1 mal_z1l3u2mal_z1z1 mal_z1z1u1 mal_z1z1u2 mal_z1z1r1 mal_z1z1r3 mal_z1z1r3u1 mal_z1z1r3u2mal_shu1mal_shu2mal_shr1mal_shk1 mal_shk1u1 mal_shk1u2 mal_shk1r1 mal_shk1k1 mal_shk1k1u1 mal_shk1k1u2 mal_shk1k1r1 mal_shk1r3 mal_shk1r3u1 mal_shk1r3u2mal_sht1 mal_sht1u1 mal_sht1u2 mal_sht1r1 mal_sht1r2 mal_sht1r3 mal_sht1r3u1 mal_sht1r3u2mal_sht2 mal_sht2u1 mal_sht2u2mal_shnh mal_shnhu1 mal_shnhu2mal_shp1 mal_shp1u1 mal_shp1u2 mal_shp1r1 mal_shp1r3 mal_shp1r3u1 mal_shp1r3u2mal_shp2 mal_shp2u1 mal_shp2u2mal_shm1 mal_shm1u1 mal_shm1u2 mal_shm1r3 mal_shm1r3u1 mal_shm1r3u2mal_s1u1mal_s1u2mal_s1r1mal_s1r2mal_s1k1 mal_s1k1u1 mal_s1k1u2 mal_s1k1r1 mal_s1k1k1 mal_s1k1k1u1 mal_s1k1k1u2 mal_s1k1k1r1 mal_s1k1r3 mal_s1k1r3u1 mal_s1k1r3u2mal_s1k2 mal_s1k2u1 mal_s1k2u2mal_s1t1 mal_s1t1u1 mal_s1t1u2 mal_s1t1r3 mal_s1t1r3u1 mal_s1t1r3u2 mal_s1th1 mal_s1th1u1 mal_s1th1u2 mal_s1th1r1 mal_s1th1r2 mal_s1th1r3 mal_s1th1r3u1 mal_s1th1r3u2 mal_s1th2 mal_s1th2u1 mal_s1th2u2 mal_s1th2r1mal_s1n1 mal_s1n1u1 mal_s1n1u2mal_s1p1 mal_s1p1u1 mal_s1p1u2 mal_s1p1r1 mal_s1p1r3 mal_s1p1r3u1 mal_s1p1r3u2mal_s1p2 mal_s1p2u1 mal_s1p2u2mal_s1m1 mal_s1m1u1 mal_s1m1u2 mal_s1m1r1mal_s1r3 mal_s1r3u1 mal_s1r3u2mal_s1l3 mal_s1l3u1 mal_s1l3u2mal_s1s1 mal_s1s1u1 mal_s1s1u2 mal_s1s1r1 mal_s1s1r3 mal_s1s1r3u1 mal_s1s1r3u2 mal_s1rhrh mal_s1rhrhu1 mal_s1rhrhu2 mal_s1rhrhr3mal_s1rhrhr3u1mal_s1rhrhr3u3mal_h1u1mal_h1u2mal_h1r1mal_h1n1 mal_h1n1u1 mal_h1n1u2mal_h1m1 mal_h1m1u1 mal_h1m1u2 mal_h1m1r1mal_h1r3 mal_h1r3u1 mal_h1r3u2mal_h1l3 mal_h1l3u1 mal_h1l3u2mal_lhu1mal_lhu2mal_lhlh mal_lhlhu1 mal_lhlhu2mal_zhu1mal_zhu2mal_zhk1 mal_zhk1u1 mal_zhk1u2 mal_zhk1k1 mal_zhk1k1u1 mal_zhk1k1u2 mal_zhch1 mal_zhch1u1 mal_zhch1u2 mal_zhth1 mal_zhth1u1 mal_zhth1u2 mal_zhth1th1mal_zhth1th1u1mal_zhth1th1u2mal_zhn1 mal_zhn1u1 mal_zhn1u2 mal_zhn1n1 mal_zhn1n1u1 mal_zhn1n1u2mal_zhp1 mal_zhp1u1 mal_zhp1u2mal_zhm1 mal_zhm1u1 mal_zhm1u2mal_zhv1 mal_zhv1u1 mal_zhv1u2mal_zhs1 mal_zhs1u1 mal_zhs1u2mal_rhu1mal_rhu2mal_rhrh mal_rhrhu1 mal_rhrhu2mal_l4 mal_n1th4r1mal_k1xxmal_k2xxmal_k3xxmal_k4xxmal_ngxx mal_ch1xx mal_ch2xx mal_ch3xx mal_ch4xxmal_njxxmal_t1xxmal_t2xxmal_t3xxmal_t4xxmal_nhxx mal_th1xx mal_th2xx mal_th3xx mal_th4xxmal_n1xxmal_p1xxmal_p2xxmal_p3xxmal_p4xxmal_m1xxmal_y1xxmal_r3xxmal_rhxxmal_l3xxmal_lhxxmal_zhxxmal_v1xxmal_z1xxmal_shxxmal_s1xxmal_h1xxmal_r4mal_y2mal_y2u1mal_y2u2mal_v2sc.i_dot zeroslashedsquareoperatorcircleoperatorcyrillic_serb_be grave_cap acute_capcircumflex_cap caron_caphungarianumlaut_cap gravedbl_cap caron_side dapostrophe lapostrophe tapostrophefit.0fit.1fit.2fit.3fit.4fit.5fit.6fit.7fit.8fit.9dev_93f_902.abvsdev_940_902.abvs dev_i_ra.abvsdev_i_ra_anusvara.abvsdev_candrabindu_combdev_ka_half_ta_half.presdev_tta_nukt.rkrfdev_ttha_nukta.rkrfdev_dda_nukta.rkrfdev_ddha_nukta.rkrf dev_qa.half dev_khha.half dev_ghha.half dev_za.half dev_fa.halfdev_o_ra_anusvara.abvsdev_au_ra_anusvara.abvsindic_question indic_exclam dev_ka.vatu ÿÿPX5ƒ„„…‹ŒŒ‘•––—œž£¤¤¥«¬¬­­®±²µ¶¶·¼½½¾ÃÄÅÆÕÖרêëëììíïðóôõöö÷÷ø-./0abcdpqrs‘¯°°±ÇÈÈÉÉÊÊËabbc¢£¼½½¾ÃÄÅÆñòòóôõûüÒÓÓÔÖ×àááâãäåææç=>XY[\^_•––——˜˜™œ¤¥¨©©ª¬­³´½¾¿ÀÌÍÎÏ    6789_``aabbcdeefghpqsttuuv€‚„……†ÊËËÌÎÏÐÑáâçè   % & ' ( / 0 7 8 ? @ B C C D I J Q R û ü   b c e f f g g h h i k l<=HIIJJKtuuv$%%&EFHIJKKLVWWX[\\]`aabfgghhiijoppqqrrsstuv€€‹ŒŒŽŽ’““”¦§§¨¨©©ª±²²³º»»¼½¾¾¿ÊËËÌÐÑÑÒÔÕÕÖãääåëììíóôôõõöö÷÷øøù  !"##$$%%&())*+,,-233445569::;EFFGHIIJJKKLOPRSUVVWWXXYjkmnˆ‰‹ŒÁÂÈÉÉÊÒÓÔÕÕÖØÙÙÚÚÛàáâããääåæçèéøùùúþÿÿ  !:;;<<==>@AIJQRSTTUVWWXXY^_uvvw’““”Ÿ  ¡ÈÉÍÎÏÐÐÑÕÖÖ×ùúGHHI¡¢¢£$%%&RS^_abmnnopq|}~×äææèéëìîî\^––˜˜ ¡¤­­®®¯±²³¾¿ Ü DFLTŒarmnœbengªbng2Ìcyrlîdev2devaRgeor”gjr2žgrek¨gujr´gur2¾guruÔhebrêlatnmlm2pmly2|mlym†phnx syrcªtml2´ugar¾xpeoÈÿÿ(9ÿÿÿÿ  )-037ÿÿ  )-037MKD SRB ÿÿ(ÿÿ# SAN &ÿÿ  $&*48ÿÿ  $&+48 SAN &ÿÿ  $&*48ÿÿ  $&+48ÿÿÿÿÿÿ(ÿÿÿÿ '.1ÿÿ '.1IWR JII ÿÿÿÿ.CAT @ISM HLSM HNLD PNSM HSKS HTRK Xÿÿ (5ÿÿ!ÿÿ%ÿÿ"ÿÿ6ÿÿÿÿÿÿ ,/2ÿÿÿÿÿÿÿÿÿÿ:aalt^abvsdabvsjakhnpakhnvakhn|blwf‚blwfˆblwfŽblwf”blwsšblws blws¦blws¬c2sc²c2sc¸ccmp¾ccmpÄccmpÌdligØdligÞfracähalfêhalfðhalföhalnühalnhalnhlighliginitliga liga&liga,liga2locl8locl>loclDnuktJnuktPpnumVpres\presbpreshpresppstfvpstf|pstf‚pstsˆpstsŽpsts”rphfšrphf smcp¦smcp¬vatu²vatu¸zero¾/ 4%6'18,!39  (7."< $ # 0+:*2=-5;&)>~†Ž–ž¦°¸ÀÈÐØâêòú "*2:BJRZblz‚Š”œ¤¬´¼ÄÌÔÜäìôü $,4<HPX`hpx&œºØö(2®².z¬¼Àltx| Œ Š ¨¸îþ Ø ú   Z ¢ ä ü L X^þˆ¾Zdj|š6‚®x ¶!"è"î$è%%$%€%®%Ú'+ê,H.B.R/¤5dN"N„ñ¤óËñv d $*06<BHNT C¬Ê´È²¯ï©í§ë¦±«°¥¯¤®£ °¯÷¥LM yy/O ô-õM,L6",b¾q¾c¾r¾28RXÎ ,>Pbt†˜ª¼ Ä©„¥ Ö©Œ¥ î©¥ ©–¥ .©¥ Å©¤¥ ש¬¥ ï©°¥ ©¶¥ /©½¥ $(,28DHLRX&8Z|žÀâ  "¬ $¦ £ ¤  <¬ >¦ :£ 8¤  N¬ P¦ L£ J¤  #¬ %¦ !£ ¤  =¬ ?¦ ;£ 9¤  O¬ Q¦ M£ K¤  ,¬ .¦ *£ (¤  -¬ /¦ +£ )¤„Œ–¤¬¶ÄÅ SàLóJ"ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñôòöóõ÷ùø D]¡¡¨¨²²ººÀÀcc rr!aòJ"ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòöóõS÷ùø $=ˆˆ’’šš  òòbb qq!B 0 _¶_¸ `¶`¸ a¶a¸GOW6 "(AIO@IL?O>L=IIBWAË ¦&Pf c ¡ c " i ¡ i d ¡ d e ¡ e " j ¡ j g ¡ g k ¡ kOA²¥ÖËËöBHNTZ`flrx~„Š–œ¢¨®´ºÀÆÌÒØÞäêðèéoèoéïãðãñãòãóãôãõã÷ãøãùãúãûãýãÿãããããããã ãôàðæúææUX[t HÛJÞø uûï6 , G¹E·D±CÂFÂÀÊÓαÂ",6@J^hr|†¤®¸´˜µ˜¶˜€˜˜©·˜á˜â˜¸˜¹˜‚˜Ž˜©º˜»˜˜ ˜qrsux{|}~‚‡‹• " ë©“ì©zqxU©ŒR©Œ6 (?©v©L©€©©„©v€„$-`jt~ˆ’œ¦°ºÄÎØâìö (2<FPZfpz„Ž˜¢¬¶ÀÊÔÞèòüú©û©ü©ý©a©þ©©©©b©c©d©e©©© ©f© © ©©©©©©©>© j>©©©©©©©©©v©w©x©y©z©J©K©N©O©P©qvx„†•´·#ºº'ëì(ïñ*6",tRuRrRsR¸¹áâîRB$.8MRR_jsntnqr®",6@JT^hr|†š¤RgRhRiRjRkRlRmRîRnRoRðRóRòRquwy{|}~€ŒŽ’”·2$>HRdnxŠ”ž¨Òäq$qö„ø„)x x „„`„ |„„!„"„ $u p#„ñ‘ïv r|q{ (t's&r%q 3|2{/Š*t„úý  abfö $.8B\fpª´@ ÷„퀄7~6}5s:•<"(.4~}„{‘zŽy9‹8Š4|$*06<w1‘0‹.‰-ˆ,ƒ+‚ f ”û  cf’2>T[U^^U^çU]{U^|U^æU]&.6|¨^{§^^¤^[£^ç¤]æ¨]£¤§¨U‚(2DV`SUnUXU ZUY^ \^]Uå] S^è]]¤Z£^›œ£¤§U6  õžôTRQŸê Œ•Š &0:DNXblv€…©†©ƒ©„©Š©Œ©©‹©‰©ˆ©‡© ¸¹áâyz{}€‚ ~}" þyê +Š &0:DNXblv€É êøùúüý+Â%PZdnx‚Œ– ª´¾ÈÒÜæðú",6@JT^hr|†š¤®¸ !"#$&'()*+,-./1023456789:;<=>?@ABCê  +,#V>HR\fpz„Ž˜¢¬¶ÀÊÔÞèòü$.8BLJLMNOPQRSTUVXYZ[]^_`bcdefhjkêíïñô÷ù  ,,yy*  DEIëÿš:d®àê,NhФ¾TÖ"T^ØJ|ÖXz„ $³±°ý¯ú­ù  &,28>D|xwvýsVoùnRmôlê &,ƒ‚ýü~û}ì„ý$*06<‹íŠì‰ëˆk‡y†J…ê ”ý’Pðï˜ó—ò•ñ œò›ñšð™ïŸžRô¢¡ö ì$*06<¬«øª÷¨T¦ö¥õ¤R£ô ÁÀý$*06<¿½`¼¹ü¸Y¶ûµí´ì"(.4:@FLRX^djpv|ÖÔÓýÒZÐüÏYÍûÌúÊVÈùÇ÷ÆTÅöÄõÃRÂô"(.4ÝÜÛýÚÙþØù×ô ßÞô &,æåãüâYáûàñç &,28>DJPV\bhntúfù÷õó`òñ^ðÿïÜî]íþëýêûéúèù$*06<BHNTZ`fl^ÿþüûùTÿöþRýôüìûê &,  ý ù ð ï $*06<BHNT^ÿ]þøõRôJê"(.4:@FLRX^djpv|421^0ÿ/Ü.]-þ+ý*ú(V&ù$R"ô!ëJê 987ý6ø;ì{zø!"#$')*,.01234567:;<=>?yÎ:z„– ª´¾ÈÒÜæø  *4FPbl†˜ª¼Îàò(:L^p‚”¦°ÂÌÖàêô"4FXbt†˜ª¼<É [=É>É?É@ÉAÉBÉCÉDÉEÉ fGÉHÉJÉLÉMÉNÉOÉ €SÉ ‚TÉUÉ–•WÉ ˜— š™ ZY ]\ a` cb ed hg ji rq vu zy |{ „ƒ Ž œ›qÉ _^‘É–É®É·ÉºÉ nÉÉÎÉ po ts xw ~} †… ˆ‡ Œ'É  ’‘ ”“:êìíïðñôöøùûüýþ +,LMQVXYZ]_`bdfjo•­¶¹ÈÍÏÜæîü&./4Z*6BNÓ jIÔ jIÖ jI× jIØ jIÚ jIûý Â%PZdnx‚Œ– ª´¾ÈÒÜæðú",6@JT^hr|†š¤®¸žŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁê  +,# þæ(V`jt~ˆ’œ¦°ºÄÎØâìö (2<FPZdnx‚Œ– ª´¾ÈÒܾe¿eÀeÁeÂeÃeÄeÅeÆeÇe¦eqere§e¨e©eªese«e¬e­e®e¯e°e±e²e³e´eµe¶eue·e¸e¹eºe»e`e¼ebe½e:OQ_aa%cd&*  o‘o’o^ad“o]Z &@ËožjšiÍoÊjÉiÌoŸj›i‘’, "È8¡j€¢8;Wf*  £¤¥>?B DT€ž®¾êú 2ʲʲ*ʸʯ'ʸʤ'ʧʨ  ʹʯ ʹʩʹʦ-ʨʯ*ʨʩ¹Ê²Ê²7ʥʥ ʩʩʥʥʖʖ~Ê–Ê–åʲʲ«Ê–Ê– –˜¥§¬³µ¸¹¨<‚¶ÂØî.:Z˜Öì`žÜ$DP„Äø6’ (08@#ʸʯʩ ʤʠÿÊ–þÏ $,OÊ©Dʧ@Ê™<ʘRʯ_Ê©kÊšgÊ–sÊœpÊ›ˆÊŸ„Ê "¢ÊŸŸÊ›Êœ—Êœ©Ê ºÊ¯·Ê£´Ê¢&.6ÞʯÛʤ×Ê£ÐÊ¢ÏÊ¡ÉÊ &.6ʹöʯòÊ®ñÊ©íʦåʥʯʩ%ʨ ʧ>ʯ;Ê© (08@tʲjʯcÊ©]ʨVʧQʦIÊ¥&.6“ʹŠÊ¬†Ê«ƒÊ©~Ê¥{Ê &.6µÊ¹¬Ê¯©Ê«¦Ê©ŸÊ œÊ– (08@ÖÊ®ÓÊ­ÐÊ©ËʨÇʧÃʿʘòʯëÊ«èÊ©%ʲ $,FʯCÊ­@ʬ3Ê¥,ʘýÊ´ $,ʯ ʹʩ ʥʖ $,pÊ·fʯcÊ©_Êœ[Ê›&.6šÊ¬Ê¤Ê¡…ʠʯzÊ– $,4<DLTÔʯÑʬÇÊ©Ãʦ»Ê¥µÊ ²Ê—Þʹ§Ê–ñʯîÊ©–˜™š›Ÿ ¢¤¥¦§¨©«¬­¯²³´µ·¸¹ºZ*6BNçÊ jâÊ jãÊ jäÊ jåÊ jæÊ j–¤©±³´ò$Nblv€Š”ž¨²¼ÆÐÚäø  4>HR\fp„Ž¢¶ÀÊÔÞèçÊ j*Ê+Ê,Ê-Ê.Ê/Ê0Ê1Ê2Ê3Ê4Ê5Ê6Ê7ÊâÊ j8Ê9Ê:Ê;Ê<ÊãÊ j=Ê>Ê?Ê@ÊAÊBÊCÊäÊ jDÊEÊåÊ jFÊæÊ jGÊHÊIÊJÊKÊLÊMÊ–©«º(ʳ&6@JT^hr|†š¤®¸ÂÌÖàêôþ (X(ý((²(Ú(ù(I(R(m(Û(ø( ³X³ý³³²³Ú³ù³I³R³m³Û³ø³–˜¥«¬­¯³¶·¹º*,9>?@BFIJLM*M ª´¾ÈÒÜæðú",6@JT^hr|†š®ÂÖêþ&:NbvŠž²ÆÚî*>RfzŽ¢¶ÐÚäîø  *4>HR\fpz¼Öèòü NUNbN}N‹N’N¬N¾NÄNúN4NBNqNN¯N×NáNöNONjN NØNõNʱN ʱ NʱNLʱLNwʱwNÌʱÌNÔʱÔNêʱêNʱN1ʱ1NNʱNNZʱZN`ʱ`NgʱgNnʱnN—ʱ—NïʱïN=ʱ=NtʱtN‚ʱ‚NŠÊ±ŠN—ʱ—N¯Ê±¯N¸Ê±¸NÀʱÀNÎʱÎNâʱâNèʱèN.¹±¥U±b±}±‹±’±¬±¾±Ä±ú±4±B±q±±¯±×±á±ö±$*06<¯«© å ¥›ÿÿ–:«0›)ÿ «›O±j±  ±“« رʫõ±M–˜™œž ¢£¥§¨©«¬­®¯¶·¸¹ºÿHsÉÐå%IV]cj“ë:pz…“§µ»ÊÞå*,-0124679;<=>?@ABCFHIJKLMâðæ"DfxФÆèú.Hbt–¨Êì0B\~ Öð.\’¬Æè.@Rd†˜ª¼Îàú &@Rl† ºÌÞð&8Rdv¢´Îàò   8 J \ n € ’ ¤ ¾ Ð â ô  2 L ^ p ’ ¤ ¾ Ø ò   8 R d ~ ¢ ¼ Þ  , > P b | Ž °  ä þ  * < V h ‚ ” ¦ ¸ Ê ì þ*<NhzŒž¸ÊÜî,>XrŒ®ÀÒäö4F`r„ž°ÂÜö"<Vh‚”®ÀÒäö,>Pj„–°ÂÔî4FhzŒž¸ÊÜî4FXj|ž°ÊÜö4FXr„–¨ºÔæø .@Rdvˆš¬¾Ð ýÃüÂûÁúÀ7Â6Á5À ;Ã:Â9Á8À ^Ã]Â\Á[À fÁeÀ oÁnÀ|Â{ÁzÀ ƒÃ‚ÂÁ€À ‘ÃÂÁŽÀ –Á•À ¨Ã§Â¦Á¥À °Á¯À³Â²Á±ÀÃÂÂÁÁÀ ÈÁÇÀ äÃãÂâÁáÀ ÁÀ ÃÂÁÀ :Ã9Â8Á7À HÃGÂFÁEÀ zÃyÂxÁwÀ ›ÁšÀ¾Â½Á¼À àÃßÂÞÁÝÀ çÃæÂåÁäÀ$*0OÁOÀOþÂýÁüÀ! ÁÀ $Á#À$Â#Á"À üÁûÀ "(RÁRÀRÁÀ$*0WRÁVRÀURNÂMÁLÀZÂYÁXÀyÂxÁwÀ ¦Ã¥Â¤Á£ÀíÂìÁëÀÂÁÀ ÁÀ ÁÀ  Á À Á À ÃÂÁÀ ÁÀ ÁÀ ÁÀ ÁÀ "Á!À&Â%Á$À )Á(À-Â,Á+À1Â0Á/À 4Á3À?Â>Á=ÀCÂBÁAÀGÂFÁEÀKÂJÁIÀ NÁMÀ QÁPÀ TÁSÀ WÁVÀ ZÁYÀ aÁ`À dÁcÀjÂiÁhÀ mÁlÀ rÁqÀvÂuÁtÀ yÁxÀ Á~À‡Â†Á…À ŠÁ‰À ÁŒÀ ”Á“ÀšÂ™Á˜ÀžÂÁœÀ ¡Á À ¤Á£À «ÁªÀ ®Á­À ¶ÁµÀ ¹Á¸À½Â¼Á»À ÀÁ¿À ÆÁÅÀ ËÁÊÀ ÎÁÍÀÓÂÒÁÑÀ ÖÁÕÀÚÂÙÁØÀ ÝÁÜÀ àÁßÀ éÃèÂçÁæÀ ìÁëÀðÂïÁîÀõÂôÁóÀùÂøÁ÷À üÁûÀ ÿÁþÀ ÃÂÁÀÂÁÀ  Á ÀÂÁ À ÁÀ ÁÀÂÁÀ $Ã#Â"Á!À )Ã(Â'Á&À ,Á+À0Â/Á.À 3Á2À 6Á5À =Á<ÀAÂ@Á?À DÁCÀ MÃLÂKÁJÀ PÁOÀ UÃTÂSÁRÀYÂXÁWÀ \Á[À)Â_Á^À bÁaÀfÂeÁdÀ iÁhÀmÂlÁkÀ pÁoÀ sÁrÀ vÁuÀ }Á|À ‚ÀÁÀ …Á„À‰ÂˆÁ‡À ŒÁ‹À ÁŽÀ ’Á‘À–•Á”À ™Á˜À žÁÀ ¡Á À¥Â¤Á£À ¨Á§À «ÁªÀ ®Á­À ±Á°À ´Á³À¸Â·Á¶À »ÁºÀÂÂÁÁÀÀÆÂÅÁÄÀÊÂÉÁÈÀ ÏÃÎÂÍÁÌÀ ÒÁÑÀ ÕÁÔÀ ÙÁØÀ ÜÁÛÀ ãÁâÀ êÁéÀîÂíÁìÀ ñÁðÀõÂôÁóÀ øÁ÷À ûÁúÀÂÁÀ ÁÀ ÁÀ  Á ÀÂÁÀ ÁÀÂÁÀÂÁÀ(Â'Á&À +Á*À/Â.Á-À 2Á1À6Â5Á4À 9Á8À <Á;À ?Á>À BÁAÀ EÁDÀ HÁGÀ KÁJÀ QÁPÀ TÁSÀ^Â]Á\ÀbÂaÁ`À eÁdÀiÂhÁgÀ lÁkÀ oÁnÀsÂrÁqÀ vÁuÀ}Â|Á{À€ÁÀ „ÁƒÀ ‰ÃˆÂ‡Á†À ŒÁ‹À ÁŽÀ ’Á‘À–•Á”À ™Á˜À œÁ›À ŸÁžÀ ¢Á¡ÀªÂ©Á¨À®Â­Á¬À ±Á°À ´Á³À ·Á¶À ºÁ¹À ¿Ã¾Â½Á¼À ÂÁÁÀÆÂÅÁÄÀ ÉÁÈÀÍÂÌÁËÀ ÐÁÏÀ ÓÁÒÀ×ÂÖÁÕÀ ÚÁÙÀ ÝÁÜÀáÂàÁßÀ äÁãÀ çÁæÀ êÁéÀ ðÁïÀôÂóÁòÀ ÷ÁöÀ úÁùÀ ÿÁþÀ ÁÀ ÁÀ  Á À  Á À ÁÀ ÁÀ ÁÀ ÁÀ ÁÀ "Á!À 'Á&À QÁPÀð–—˜™š›œžŸ ¡¢£¤¥¦§¨©«¬­®¯°±²³´µ¶·¸¹ºÿ   #'*.2<@DHLORUX_bgkpsw}„ˆ‹’—›Ÿ¢©¬´·º¾ÄÉÌÐÔ×ÛÞåêíòöúý   %*-14;>BINQVZ]`cgjnqt{~ƒ†Š“—œŸ¢¦©¬¯²µ¹¿ÃÇËÐÓ×Úáèëïòöùÿ  %),037:=@CFIOR[_cfjmptz~‚…Š“—š §«¯²µ¸»ÀÃÇÊÎÑÔØÛÞâåèîñõøý  %OZ*6BNçÊ jâÊ jãÊ jäÊ jåÊ jæÊ j–¤©±³´*  OÊNÊRʰ±¶ àÎDFLTŒarmn˜beng¤bng2²cyrlÀdev2Ðdevaâgeorôgjr2grek gujrgur2$guru0hebr@latnhmlm2tmly2~mlymŒphnxšsyrc¦tml2²ugar¾xpeoÊÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿIWR JII ÿÿ ÿÿ ÿÿ ÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿabvmnabvmtabvmzblwm€blwm†blwmŒblwm”kernšmark mark¦mark®mark¸markÀmarkÈmarkÔmkmkÜmkmkâmkmkè     .:BJRZdlt|„Œ”œ¤¬¶¾ÆÎØâ¾xÈDhºPrP |p "ˆ'ü+Š+Ä6`:¨CòE`IRIžJ¶SÀZ[ˆ¨†®  &,28>DJPV\bhnteIUeeÑeeeÿ°eÿMeÿ“eye<eoeÿËIÿéIIdjnopœ¢£¤¦§¨UZ]]þãe>þD >DJPV\bhntz€†Œ’˜ž¤ª°¶¼ÂÈÎÔÚàæìllT:n”rl@lDŠ läløl:lŒlÿBÿ°eÿVlÿˆl”‚l<ldl¾lPl‚D DþlllHlÿœ:ÿØ:ÿâ:b:`dijlmnop›œ¡¢£¤¥¦§¨«BCDGHIUZ]n^ÿBezæª {øþ "(.4:@FLRX^djpv|‚ˆŽ”𠦬²¸¾ÄÊÐÖÜâèîôú $*06<BHNTZ`flrx~„Š–œ¢¨®´ºÀÆÌÒØÞäêðöü &,28>DJPV\bhntz€†Œ’˜ž¤ª°¶¼ÂÈÎÔsf'fyfÉf¿fdêf‡f¤fÃg¿fþf f#feqfhfYf»e d c¦ffâfJf¬ffêfíf‹ff¡føf¾fâgbfbfJf f fˆf6f–fTf”fˆfªaÃg¿fqf e¨g–eâgþdàdêf½g£aÿºe^ºa¹g[i_d˜i¡e#aeg4cžge.e:cœc«^±d ^ýgýdúd§iŽgÌcg¶gš^½g·ekj÷d÷a«agúd¥aWcªh›gªgžjúdôa÷dýd÷d c”e©e·c¢g d¢d¨gŠgjùe÷aòda‹aôdgacehkkq•šš-´½.ÖÖ8áâ9ää;éê<óö>B*=CQQWTTX__YghZjn\qtay{e}~h€Žjqqyz\]^–¡¢£¤­¯°±çèSUYZ[\]^Z`flrx~„Š–œ¢¨®´ºÀÆÌÒØÿ‹kÿ¥eÿ¦eÿËeÿŽgÿÄeÿµfÿ¹fÿËaÿeÿjeÿ’GÿÁeÿÉeÿºeÿÀeÿºeÿ·eÿ·eÿºeÿÀeÿ·e¢,¼ k®´ºÀÆÌÒØÞäêðöü &,28>DJPV\bhntz€†Œ’˜ž¤ª°¶¼ÂÈÎÔÚàæìòøþ "(.4:@FLRX^djpv|‚ˆŽ”𠦬²¸¾ÄÊÐÖÜâèîôú $*06<BHNTZ`flrx~„Š–œ¢¨®´ºÀÆÌÒØÞäêðöüp÷€8—œÿÿ|÷¢¢÷Þ…ÿúÂüzÿò0´PL& 8H Kÿþ  „ €ÿþ>ÿöÐ÷òÊÃ÷$„ŇÿÛ¤è¨÷ÊÊQpp)s†„²íÔv㘜"ÀJÿôVÿé$ÒÃÿ‘FðfVpN).ÿ·onllrsovp÷ÿÿ8—™ÿÃzÙŸÿÿ0“Tÿÿ6ÿJ4%ÿJp)kÿøœãÂÿÿ™ÿþMÿõ_wÿÿ©ÿçLÿÉ|ÿÄQÿ­¶Îÿ§6ÿ®WËŶÇÿ§?ÿ.'ÿ31ÿ3÷ÿhˆÿ0šÿ0iM†LWmÿÿ”ÿ¶`ÿ¶–*»îuìÿ‡äÿlÿ4ÿ4f:ÿ4ÿ4vÿ4:ÿ4eR; 4ÿ4 ÿ>ÿ‘÷ÿ‹Úÿšÿ”äÿŽiÿ­·ÿÔbßDÿ ÿ*€ÿ Dÿ éq•——%šœ&¥¨)´»-óö59*<:JKMQQOTTPgnQqtYy{]}~`‚bŽŽdquej žŸ ©²³¾¿RV .4:@FLRX^djÿHÿèÿsÿÞÿmÿÑÿƒUÿkÿéÿ%ÿéÿ%ÿéÿoSÿ{ãÿ„¾ÿ ÿö&0  ÿ’ÿtÿÿ¾˜R $ÿ=ÿòÿ`ÿóÿ[ÿóÿƒz@6F %LRX^djpv|‚ˆŽ”𠦬²¸¾ÄÊÐÖÜâèîôú $ 5Š5 5j585Æ5¬5ä5B55N5v5`585è5 5Æ5Š5ø5 55ä5ˆ5H5”5i5R5™5y5U5ž5v5w55¢5¢5R5–ºËˆ06&> #HNTZ`flrx~„Š–œ¢¨®´ºÀÆÌÒØÞäêðöüVÿê*ÿêÿê«ÿêWÿêÁÿêeÿê·ÿêiÿê«ÿê½ÿêùÿêeÿê—ÿê—ÿê9ÿê£ÿêïÿêýÿêýÿêÿêËÿêÙÿê ÿêùÿêÑÿêCÿê?ÿêÿê£ÿêËÿêMÿêÿêQÿêÙÿê–³¶ºÏÐ ÿœHÿœÞ|Nˆ H’˜ž¤ª°¶¼ÂÈÎÔÚàæìòøþ "(.4:@FLRX^djpv|‚ˆŽ”𠦬²¸¾ÄÊÐÖÜâèîôú $*06<Æ€˜€È€X€*€&€à€&€N€ô€€ô€ô€ô€à€à€€þ€ô€¤€þ€à€þ€Ö€ô€ê€ô€Ö€ê€ô€D€Ö€€:€Ö€þ€þ€Ì€|€ê€b€ô€€þ€þ€&€X€€€ô€ô€à€ê€@€ô€¤€þ€à€þ€Ö€,€ê€Ö€à€÷€D€Ö€à€Ì€Æ€f€Ð€:<@ADdff&qu'‚‚,¦À-7klm$ÿ\€ÿz€ÿz€ÿz€\Fd 'PV\bhntz€†Œ’˜ž¤ª°¶¼ÂÈÎÔÚàæìòøþ "(.4.€8€V€`€B€V€8€B€8€L€.€.€.€V€.€.€.€V€.€.€.€B€8€€L€j€€`€ˆ€8€L€L€8€.€œ€B€.€L€L€Ddqu!‚‚&€ ÿ`€ÿ?€Ü®þ Tª°¶¼ÂÈÎÔÚàæìòøþ "(.4:@FLRX^djpv|‚ˆŽ”𠦬²¸¾ÄÊÐÖÜâèîôú $*06<BHNTZ`flrx~„Š–œÆÿö˜ÿöÆÿöäÿöþÿöÆÿö†ÿö¼ÿö0ÿöàÿö&ÿöPÿöþÿöÿöþÿöôÿöÖÿöàÿöàÿö@ÿöôÿöÿöÿöôÿöàÿöþÿöàÿö,ÿöêÿöôÿöÖÿöêÿöþÿöDÿöÌÿö:ÿövÿöÖÿöþÿöÿöÂÿö–ÿöxÿöêÿöbÿöôÿöôÿöþÿöþÿöÿöHÿö0ÿöXÿöþÿöÿöÿöÖÿöàÿöôÿö@ÿöôÿöšÿöôÿöàÿöþÿöàÿö,ÿöôÿöÖÿöÖÿöþÿöDÿöÖÿöÌÿöÌÿöÆÿöpÿöÐÿöÚÿöôÿöÆÿö†ÿö¼ÿö˜ÿö:=@dgh)qu+‚„0¦Á3ÄÈOop……’”ŸÉÍ^djpv|‚ˆŽ”𠦬²¸¾ÄÊÐÖÜâþÞÿöþÞÿöÿ ÿöÿ`ÿñÿ`ÿ`ÿñÿ`ÿñÿ`ÿñÿ`ÿñþòÿñÿ$ÿñÿ`ÿñÿ`-ÿ`KÿUÿ`7ÿ`‡ÿ`‘ÿ`wÿ`Ÿÿ`wÿ`ÿ`•:.B  ‚ÿ´‚ÿ´‚ÿ¾‚hklm78 ÿ€ÿµ€ÆžÎ R¦¬²¸¾ÄÊÐÖÜâèîôú $*06<BHNTZ`flrx~„Š–œ¢¨®´ºÀÆÌÒØÞäêðöü &,28>DJPV\bhntz€†ŒŒÿìŒÿì@ÿìxÿìnÿì–ÿì‚ÿì–ÿììÿìÿì‚ÿìZÿììÿìdÿì<ÿìFÿìFÿì‚ÿìPÿì<ÿì ÿìŒÿìdÿìdÿìÿìxÿì ÿì2ÿì(ÿìxÿìÿì<ÿìZÿìÿìxÿìZÿì‚ÿìnÿìFÿìPÿìZÿì(ÿì<ÿì<ÿì<ÿìxÿìxÿì–ÿì‚ÿììÿØFÿÎöÿØdÿì2ÿº<ÿì‚ÿìZÿØFÿÎŒÿìZÿìZÿÎÿìnÿì(ÿì2ÿØ(ÿìÿì2ÿÎPÿì<ÿâdÿìnÿìZÿØŒÿì–ÿìTÿºnÿÎnÿØ–ÿØ‚ÿì–ÿìŒÿì:=@dqu)‚ƒ.¥Á0ÄÈMij þ´ÿìþ´ÿìâÆì v|‚ˆŽ”𠦬²¸¾ÄÊÐÖÜâèîôú $*06<BHNTZ`flrx~„Š–œ¢¨®´9]Cq]"{]"W·9·u99ÿœé··£·)Õ·éÁ•ÅkßÏ »Õ·9Á·Sa‰‰9·…%£ÿœC ')* ,= >Xntz€†Œ’˜ž¤ª°¶¼ÂÈÎÔÚàæìòøþ ~//jMCj8$ý~BC~CLCLCB9BM~/9&6  eÝÄÝø ×ßââ *06<BHNTZ`---------î& <z€†Œ’˜ž¤ª°¶¼ÂÈÎÔÚàæìòøþ "(.4:@FLRX^djpv|‚ˆŽ”𠦬²¸¾ÄÊÐÖÜ,,öž;fª;<jÈöN;,¿;, ,PÂ…qÖÕÇ,††††,,¢6¾¾@«ÈðJ,,ú""@ÂŒrf6ïýÿ KKUX[u!×ßââ *06<BHNTZ`,,,,,,,,,R<\ @‚ˆŽ”𠦬²¸¾ÄÊÐÖÜâèîôú $*06<BHNTZ`flrx~„Š–œ¢¨®´ºÀÆÌÒØÞäêðöü &,28>DJPV\bhntz€†Œ’˜ž¤ª°¶¼ÂÈÎÔÚàæìòøþ "(.4:@FLRX^djpv|‚ˆŽ”𠦬²¸¾ÄÊÐÖÜâèîôú $*@XuXŠ,XZXÞ2ðXiXh2,XNXÞ26XnX72kX,X2ªX;X)26XpX92@XgX?2iX.XúXGXÄ2X]XÞ26XáXÈ26XqX526X\XG2lXÈXWXy2@XhX:2;X‚XR2XgX«XhX §XFX6XkXa26XoX82XNXÞ2†XcX2|X X2ÚXnXÒXeXËX`X,XuXM2†X¥Xè܆XuXè܆X£X†XiX,XuX,XuX,XuXXaXXuXXMX,XkX¾XaXXWXJXkX«XMXXMXXaX†XíX,XWXXaX,XuX,XkX"XkX,XkX,XkXXMXªXkXXX–XÿÿX2ÖX2®Xý2àXkXª^X÷X…2ï KKUuàãæ,X,ÚXÜ–þ Q¤ª°¶¼ÂÈÎÔÚàæìòøþ "(.4:@FLRX^djpv|‚ˆŽ”𠦬²¸¾ÄÊÐÖÜâèîôú $*06<BHNTZ`flrx~„wØuØHٌؓØrØrØSØTØ5ØCØÆØ^ØÃØKØØCØoسØqØ…Ø`ØHØyØ6Ø;Ø£ØSØTØ6ØŸØ™ØÜØ»ØnØWØiØuØ!ðê!Þ!G!!!í! !ò!!7! !! !&! !Í!å!§£ô! !!N!M!z!e!þ!ö! !7! !ø!vä‹ÏI!F! !ѰWêuÚGú£  vvxz}~ƒŒŽ¬®Ã/ÈËEÍÎIÓÕKäåNììP£¤§©«²´áãäõö÷øÐ>DJPV\bhntz€†Œ’ÿ]ÿLÿXÿVÿTÿ3ÿYÿZ.ÿ^=ÿ@.ÿ<#ÿ:%ÿ_8ÿc8ÿ 0&6 ÿXèÿX·ÿW¾¥÷øùþÑ{RF° çÐÖÜâèîôú $*06<BHNTZ`flrx~„Š–œ¢¨®´ºÀÆÌÒØÞäêðöü &,28>DJPV\bhntz€†Œ’˜ž¤ª°¶¼ÂÈÎÔÚàæìòøþ "(.4:@FLRX^djpv|‚ˆŽ”𠦬²¸¾ÄÊÐÖÜâèîôú $*06<BHNTZ`flrx~„Š–œ¢¨®´ºÀÆÌÒØÞäêðöü &,28>DJPV\bhntz€†Œ’˜ž¤ª°¶¼ÂÈÎÔÚàæìòøþ "(.4V;|YNNh’îY.©ÿþ[ˆ/ˆ_P:hIÔFY=ÿÿˆÿ8njÿ8d’ ÿ8ÿ8eò¢òñeí_îXXXXXXnXXXX’’•’††ƒ††mmnmW)°ÿÿÿÿÿÿÿÿqo÷÷÷÷iiXXXÿÿbXÿÿXÿÿ•…’—†’m†ƒ†8Ðm÷m÷l m÷m÷S€P<ZF¼Yà´ÿðˆ ˆ ÿ8hò^ƒlXÿ8%øÿ8þöô–ÿ8ûÿ8ûÿ8Žd’ÿ8,ÿ8ÿ8  ²ÿ8ñó±ÿ8ñ’ûßõíí)ÿi¬þÕ4ÿÿü%Ö%ùöáñRðúíÆ,$=D]‚ˆ4Š‘;”˜C›ŸH¡¨Mª±U´¸]»¿bÁÅgÔÙlÜÝrêïtòóz|*3„89ŽHHPR‘WW”ZZ•]^–be˜ggœqrttŸ‘” ðð¤óü¥þÿ¯±  ¶·¸))¾22¿77À=>Á@@ÃDHÄuuÉØòÊøùå¹¼¿ÃÆÊ ÌÖÜßèèêìðñ!öù#üý'ÿÿ)*+  ,  -1ÆÌÒØÞäêðöü &,28>DJPV\bhntz€†Œ’˜ž¤ª°¶¼ÂÈÎÔÚàæÿKÿ]ÿÿÿXÿbÿþÿTÿ\ÿ\ÿ[þòÿ(ÿ ÿÿ#ÿ ÿ"ÿZÿXÿYÿVÿWÿZÿÿþÑþÒÿ ÿ ÿþÿÿþìÿZÿ"ÿFþÝÿýþöÿÿþÐÿÿþöÿÿþòÿÿþòÿÿþàÿÿþÏÿÿþÏÿÿþÏÿÿþÏÿÿÿÿÿÿÿ@fF kØÞäêðöü &,28>DJPV\bhntz€†Œ’˜ž¤ª°¶¼ÂÈÎÔÚàæìòøþ "(.4:@FLRX^djpv|‚ˆŽ”𠦬²¸¾ÄÊÐÖÜâèîôú $*06<BHNTVÿü3ÿÿ’Åÿü¿cÿÿÔ:o0ºnÿþXÿüXÿüXÿüXÿüXÿüXÿü=ÿÿ=ÿÿ=ÿÿ=ÿÿ’’—’ÃÿüÃÿüÃÿüÃÿüÃÿüÄÄÄÄaÿÿàààààà:DDDrp‚‚66666¿¿¿¿xÿþxÿþXÿüàXÿüà=ÿÿD=ÿÿD=ÿÿD=ÿÿD•†’‚•†’nÃÿü6Ãÿü6Ãÿü6ĿĿĿĿĿaÿÿxÿþº·³ÿý’ÿÿiQÿý>ÿÿk$(,28<DHLRX\‚ƒ„…†‡Š‹ŒŽ‘”•–—˜›œžŸ¢£¤¥¦§ª«¬­®¯°±´µ¶·¸»¼½¾¿ÁÂÃÄÅÔÕÖרÙÜÝêëìíîïòó*+,-./012389ruØÜàæìðËÿjÿÿ.ž ¡DJPV\bhntz€†Œ’˜ž¤ª°¶¼ÂÈÎÔÚàæìòøþ "(.4:@FLRX^djpv|‚ˆŽ”𠦬²¸¾ÄÊÐÖÜâèîôú $*06<BHNTZ`flrx~„Š–œ¢¨®´ºÀÆÌÒØÞäêðöü &,28>DJPV\bhntz€†Œ’˜ž¤ª°¶¼ÂÈÎÔÚàæìòøþMÙ4Ù}ÙRÙNÙNÙÙhÙŽÙÙYÙŒá©×táˆÙ(ÙˆÙXÙOÙ=ÙhÙIÙÔÙPÙYÛAÙ«Ø{رØûdÌoç€çhÌgç–  ¶ö†œ ûhøîùná‹Ù6Ù°ƒOÙOÙ’ÙÙo+8ÙÐhÙPæ<æ^èFäYÛ¸ÌYÙÿ°¯ÝˆÙ ˆÙ ?ÐhÙ hÙúGÙ$Ù ö…Ù AÙm%ø þöôþeûgç–2    Ûù#ôçuÙù çôçþ綘¸‘Äô Ú  ð í í ) ÿ f  þ a4 % Ñ % ô õ ã  ñ R ð úð Æ (   .$=D]ˆˆ4šš5¡¡6¨¨7°°8ÆÇ9ÚÛ;ðñ=óó?  @A45CHHEPRFVWIZZK]^LbeNggRqrSttUvvVy|Wª«[àà]ðð^óõ_÷øbûüdþÿfhi  lmn22t47u::y=>z@@|DH}uu‚ØóƒøùŸbb£·àçééíïóõ"úû%þþ'(*, ü ý9 ;  ? A  B  C  DE"(.4:@FLRX^djpv|‚ˆŽ”𠦬²¸¾ÄÊÐÖÜâèîôú $*06<BHNTZ`flrx~„Š–œ¢¨®¢ÿ^ÿOÿUÿR>ÿX>ÿRAÿUÿUÿUÿÿUÿ/ÿUÿU#ÿU ÿ:ÿU,ÿX,ÿSÿ[ÿXÿRÿUþÐÿBÿBÿ=ÿXÿ&ÿUÿ0ÿÿ3ÿ>ÿsÿ=ÿ[þîÿþÒþÒþÒþÖTþþþñþóþíþúÿ þþÿþòþÿþþþëþ÷þöþöþÜòþ±òþöþÍÿÉþÛþ¸ÿÿÌÿ2X` "FLRX^djpv|‚ˆŽ”𠦬²¸¾ÄÊÐÖÜâèîôú çÙT٘ș/¸¥Ò²ä²jÔ²šž´²ûh•pu†{£š¤÷¶i Ÿ  2288D]ÏÏ  ]]uuææ ìì!¸¾ ÿy øÖ& Y´ºÀÆÌÒØÞäêðöü &,28>DJPV\bhntz€†Œ’˜ž¤ª°¶¼ÂÈÎÔÚàæìòøþ "(.4:@FLRX^djpv|‚ˆŽ”𠦬²¸¾ÄSSS l SSSmb SQ/=yvhUhThXh~hip’hõhNŒ/h©hnh…h6h„h]hKl>hfoF­ÖhJvWÇ5hø  „MÐ kB}BÜRfR– û °ò‡0ýö0fïïåí’[÷Úáòñô i±öÖ4 #Û"øòãþï5Só ùHç$= D]$uu>Øñ?רÙÚÛúû þ ÿ        V\bhntz€†Œ’˜ž¤ª°¶¼ÂÈÎþâÿþó þ^÷þ¤Aþ¤dþûnÿ1;ÿQ(ÿ<ÿ ÿÿ ÿÿ ÿÿ(ÿ(ÿ(ÿ(ý¼(þ–dÿ(þ\ÿ@8ÿìÿö§§¶¶··ÒÒ¨§¶·ÒüX¶ÿìÿöÿìÿöÿØÿâÿÎÿìÿöÿûÿâÿûÿñÿöÿìÿØÿöÿâÿöwwxx€€‚‚‡‡‹‹ŽŽ’’””••––——˜˜žž ¢ xx„„‹‹’’••––˜˜¡¡££¤¤¦Ówx€‚‡‹Ž’”•–—˜ž ¡¢F@ÿÄÿØÿìÿìÿâÿØÿâÿìÿâÿöÿâÿâÿìÿçÿñÿâÿØÿÎÿÉÿâÿÎÿâÿöÿâÿÎÿìÿâÿâÿöÿöÿÎÿìÿìÿöÿìÿâÿØÿÎÿÉÿØÿÎÿìÿìÿöÿØÿâÿâÿâÿìÿìÿØÿöÿìÿìÿâÿâÿØÿÓÿÎÿìÿìÿØÿâÿâÿØÿìÿìÿâÿâÿØÿìÿâÿâÿÎÿâÿìÿÓÿìÿâÿØÿÓÿÎÿØÿìÿâÿâÿâÿöÿâÿìÿØÿÎÿØÿìÿâÿØÿØÿâÿÎÿìÿâÿØÿÎÿÉÿØÿìÿÓÿâÿØÿâÿöÿìÿìÿÉÿÎÿÎÿöÿÄÿÝÿÝÿçÿÓÿìÿöÿØÿÓÿÎÿØÿâÿâÿìÿâÿâÿìÿÎÿØÿìÿÎÿâÿâÿìÿØÿñÿìÿØÿÓÿÉÿÄÿØÿâÿìÿØÿØÿöÿØÿìÿâÿØÿâÿØÿçÿâÿØÿÎÿÉÿØÿØÿìÿìÿöÿâÿìÿöÿìÿØÿâÿâÿöÿÎÿâÿâÿâÿâÿìÿìÿâÿØÿÓÿÄÿØÿìÿØÿÎÿâÿØÿØÿØÿâÿÄÿâÿâÿìÿØÿâÿìÿØÿÓÿÎÿâÿØÿìÿØÿìÿÎÿìÿìÿöÿñÿöÿâÿâÿØÿöÿÎÿöÿöÿöÿöÿìÿöÿöÿöÿìÿìÿìÿöÿØÿöÿâÿØÿÉÿâÿÎÿìÿìÿØÿöÿØÿìÿöÿÎÿöÿìÿöÿçÿìÿâÿÝÿØÿÎÿöÿØÿØÿØÿìÿØÿâÿØÿØÿìÿØÿØÿØÿâÿØÿçÿìÿâÿÝÿØÿÄÿÎÿÎÿÎÿâÿâÿÄÿØÿìÿâÿÎÿÄÿØÿÎÿâÿØÿÎÿÉÿÄÿÎÿØÿâÿâÿöÿìÿØÿìÿâÿÎÿØÿâÿØÿâÿØÿÎÿÎÿÉM$$%%&'(())**+,--..//01 22 33 44 55 66 779:;;<<==‚‡ˆˆ‰‰ŠŽ‘’’”˜ šš ŸŸ  ÂÂÄÄÆÆÈÈÊÊÌÌÎÎÐÐÒÒÔÔÚÚÜÜÞÞààââääøøûûýýÿÿ       "" $$&&88::??yy¶¶ | | „ „ ˜ ˜ Ð Ð Ú Ú Ü Ü ä ä æ æ 6 6 l lˆ$$&&(())**++,,--..//01224466779:;;<<==DDFGHHII JJMM PQ RRSSTTUUVV WW XXYZ[[ \\]] ‚ˆ‰‰ŠŽ‘”˜ššŸŸ¢¨©©ª­²²³³ ´¸ºº»¾¿¿ÁÁÂÂÃÃÄÄÅÅÆÆÇÇÈÈÊÊËËÌÌÎÎÏÏÑÑÔÔÕÕ××ÚÚÛÛÜÜÞÞààááââããääååøøûûýýÿÿ       !! ""## $$%% &&++--//11338899::;;<< ==>> ??@@ ˜ ˜ » » Ñ Ñ Ú Ú Û Û Ü Ü Ý Ý ä ä å å æ æ ç ç 6 6 l l m m=> @A `$%&'()*+,-./012345679:;<=‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’”•–—˜šŸ ÂÄÆÈÊÌÎÐÒÔÚÜÞàâäøûýÿ "$&8:?y¶ | „ ˜ Ð Ú Ü ä æ 6 ltÐÒÿöÿöÿìÿñÿöÿöÿçÿöÿöÿñÿöÿìÿçÿìÿñÿñÿöÿûÿöÿñÿöÿûÿìÿçÿñÿöÿûÿûÿûÿöÿûÿìÿöÿìÿûÿìÿûÿìÿöÿöÿöÿöÿìÿöÿìÿñÿìÿöÿìÿûÿûÿñÿìÿñÿìÿöÿñÿöÿûÿìÿìÿöÿâÿñÿñÿìÿñÿöÿñÿûÿñÿìÿìÿçÿìÿöÿçÿñÿçÿñÿìÿìÿöÿöÿìÿöÿìÿÝÿñÿìÿöÿûÿöÿûÿöÿöÿâÿìÿØÿìÿöÿìÿìÿöÿñÿìÿìÿöÿìÿöÿöÿñÿöÿñÿìÿìÿñÿñÿâÿìÿìÿìÿìÿìÿìÿìÿìÿìÿöÿìÿâÿìÿöÿâÿìÿçÿìÿ°ÿ°ÿrÿìÿÎÿ°ÿ°ÿÎÿÎÿÎÿÄUDDEFGGHHIIJJKKLLMMNN OOPQRSTTUU VV WW XXYZ [[ \\ ]]¢§¨¨©©ª­³³´¸ºº»¾¿¿ ÁÁ ÃÃÅÅÇÇÉÉËËÍÍÏÏÑÑÕÕ××ÙÙÛÛÝÝááããååùù     !! ## %% ''++--//113399 <<>>@@vv … …  » » Ñ Ñ Û Û Ý Ý å å ç ç m m ==>>@AEDDFHIIJJKL MMOO PQRRSS TTUU VVWWXX YZ[[\\]] ¢¨©­¯¯ ³³´¸»¾ ¿¿ÁÁÃÃÅÅÇÇËËÏÏÑÑÕÕ××ááããååññ    !!##%%++ -- // 11 33 99<< >> @@ 55 Ñ Ñ Û Û Ý Ý å å ç ç m m=AiDEFGHIJKLMNOPQRSTUVWXYZ[\]¢£¤¥¦§¨©ª«¬­³´µ¶·¸º»¼½¾¿ÁÃÅÇÉËÍÏÑÕ×ÙÛÝáãåù !#%'+-/139<>@v … » Ñ Û Ý å ç m=>@Avf| +X^djpv|‚ˆŽ”𠦬²¸¾ÄÊÐÖÜâèîôú $*06<BHNT РвlŠ*:H:²Ðî&øbîX\p¨¨äž”ŠÆŠ ÿêžÿþä0ž¨îDŠ0¼ÿê žÿô”Š>¼Š€b²vvX”lžvžŠ>&²0¼v¨lvв€”vžDÞ & þÿÿý¢N¬ ¨RX^djpv|‚ˆŽ”𠦬²¸¾ÄÊÐÖÜâèîôú $*06<BHNTZ`flrx~„Š–œ¢¨®´ºÀÆÌÒØÞäêðöü &,28>DJPV\bhntz€†Œ’˜ž¤ª°¶¼ÂÈÎÔÚàæìòøþ "(.4:@FLRX^djpv|‚ˆŽ”𠦬²¸¾ÄÊÐÖÜâèîôú $*06<J†hšJ¸ÿÌþÌÆ&@:JÌ0@|Ö&†^^rš^@Ö:|hJ®®h®¸ÿþÌÿÌ@ÿ¤h(ÿ|ÿ¤ÿ¤ÿ¸ÿ¤ÿ6šÿ@þÿê†ÿr†ÿ6šÿ^†ÿ6®ÿ^ÿšÿ¤ÿhšÿ¤ÿ†ÿ¤¸ÿršÿJÿ¤¤ÿ¤†ÿ¤®ÿhšÿ^šÿ†ÿ|¤ÿ¤JÿÌ^ÿ@ÿT^ÿÂÿT^ÿšÿJÿ†JÿÖ¤¤ÿ|ÿÌrÿÌhÿ6ÿôÿ¤0ÿ|hÿr@ÆÆôÿ|bÿ"TþÈžÿ@Öÿr@ôÿ^:ÿTÂÿ|Nÿ||ÿ|ÿ|†þúNÿ|¤ÿ|®ÿ@TTÿ¤rÿ¤ÿ@^ÿ^ÿ|66ÿTrÿ¤rÿ†ÿ|:ÿ|šÿ¤^ÿ¸JÿÖ@ÿr|ÿ"¤¤ÿ®rÿ|ÿ||ÿôrÿÌ&ÿ¤Dÿ|®ÿ¤Dÿ|,ÿô^ÿš¤ÿ|b²ÿ®ôÿ|†ÿô¤ÿô†ÿ|Nÿ@¤ÿ|®ÿDÿ|hÿ@Jÿ|šÿÖhÿ^,ÿ|rÿôÿTÿ|rÿ^|ÿJ|ÿhhÿrrÿ¤šÿh|ÿr|ÿ|ÿ"¤ÿ¤¤ÿ¤®ÿ®hÿ@@@@@¨êëìíîïðñòóôõö÷øùúûüýþÿ GKLMNOPQRSTUWXZ[]^_abcdefhijklnqrstuvxyz|€‚ƒ„…‡‰Ž‘”–—™šœŸ¢«¬°²³·¹º»¾ÀÁÐÑÒÓÔÚÛßãäìðñôöûü   $%,36<=>?@ABCEFIKNPQRSTVX—˜™š$ÿ¾7ÿÈÿPÿÈ_ɉo1ÃÞYïËÅÚÞplee-the-bear-20251226/bear-engine/doc/examples/14-gui/hourglass.png000066400000000000000000000150171512343254000246560ustar00rootroot00000000000000‰PNG  IHDR9Aki )bKGDùC» pHYs  šœtIMEÝ 7.v T®tEXtCommentCreated with GIMPWwIDAThÞå›{´¥Euà»ê{sî=羺ûÞ¦º°!m7 ¦ A ‰2š`Bt’8.ÇÄ,åkI_$fåáÒ‘ñ91ŽÉ¨Kd£¸’¨#´ ¤Á~Ýî¾}ßçõ=ªjÏç6i ’Çšúç®SU·¾ý«½wU}õí-w}":«,ܽ#ͯŽÈŒ´ Ä©ÅOY¬ `„àYœCÄYŠ!qj¨dIÄâR‰APKð Æ"¢ Šª¡ôõ‚!'bq¥ÃFe¥c(+OY)E©4UP,>TÀU¼bâçýU¹û¥og'€}Å Ãa#‚1‚1-ÁNAE xCWBU¡àÔàTñ^qz¹’ؘåÅŠ´!aÔÒÏ=E%ôú%Â9ÃÜRElRú}G–%Á<¸ €!E4:øíˆµ”eÀ«ïÀ{%ˆà*E‚ÁE…“^pµ[þޝD±òRiwx'DXk0xld0€Š ( ï@=ˆQ²ØR:‡1† °°ìˆ#è9ƒHDð^p•#Š"æ+âÄRyKî ¯@z^_IcEŒÅ{"8ï0ï eÈ2Á0xJ7°ˆ çÚu ÎCPÄWô"ôKCYB”ò2 ý@šY$@)ˆJ bWøG5âƒ'CšÄfôûÝ^Ÿ$6D±ALD?w¥à/,sëWJŒ€b”ª4 ÈBU0 €B‰‚\E1PBP(< ( êçJY EA¡Zi@@rF€ÎAdÁðA©×,®ô¸ ŒµUÊJ(}ŽÁ0ÜjཧÛ-I!"Ç|;PK"z½’$‹È œ£àQ PVB¥àœ`D)+]ñ?‹¯ÎC¥à¼4(! d÷~²Ó“»‹Rw%âÕP:ð¥*¢‚($‰¡ðk!Š‹HðŠ¥¨¦íKŨAŒE–ÝÅãUÍTõVUÍVªjƘµÇÚs›æçç¯,ËòEÞûKœs;BÏöÞ?Ë97UE Ðét†UµÉ –K/½4ú“?ù“©êƪª.9V/"#‘óôN§s*`^úÒ—N=Fæ)æÇ¾ßÐÐPODÚ@}rrrçŠÌœä}Àï}·ÙlN[ V4íŒ1ËI’تªÒ4M#cL¦ª‰÷ÞŠÈ)"c–£(JOrxx89zôè\’$‘1fÀòòòäW\ñÏdMÓÔxöŠÌ'ù UýÙ$I–Š¢(€¥$I²ãüã‡Î¹™²,}Áöz=±ÖVƉãXT5‹ã؇ú'øÚ×¾Ö9r$ÛºuëÐ=VÉ%— ?ÑÇJQ'ÓÀÏß8QÈeÉ€~’$é›ßüæ´,Ëè8¿<,"ÒjµŠ‚o6›ðUUUÆ¿¸¸¸ Ñh,ä?øÁ$Itá…zàÈJõøË_þò¸Ûíþ3˲l2ÏóË')"¸øU}äºë®›Òã¿[UËn·›WU%eYªªR«ÕðÞ›ÑÑQáé•ôª«®²EQÌ‹HñññáË/¿|uUU?xŒŒQžçeš¦—w®È̉n!þK»ÝþA–e«ßò–·DÙ_¾Ùh4jišæI’ˆ÷>ʲ,íã™ÖS)ªê7nÜ8Ÿ¦éⱺ~ô£ëŒ1:66öÈñ}W¯^=Õjµö¯Z‘•†‘EU}°Õj콟»þúëǶlÙòè2~×]wÝ⦅õÞ HQ’e™8ç’§YÅx³Ù<""à¹Ï}îèÅ_¼ù3ŸùÌ×W| 8räÈáÅÅÅ3Tuˆ,þ¸qåIfvð{ï|ç¯ÌwÞó'~ø«EQI£QgãÆõ¬ZµiÃi§½êN î­^¯¯ÍfMVÌç+' ¹°°ŽŽVÇ~OOϾpjj|·ˆìûð‡_xcU…þöíÏOï»ïoß6>>ÄÖ­/å´Ó.['"Ÿ6ä è~èC¿ý¦¸GwìxŽÜwßß²víÆÆ4›±NM)gœñsôz=jµ5,-í§Ù̘™¹áá&ý¾cddø-N§BÌÑ£3¤iåå6"§Ÿþ,¾öµo°qã©=:Ïèè ³¬_éøáÃÓ/úÞ÷n;err-û÷Õ©©-â\NQ,‘¦£\}õŸ½KD®{2†'…Ìón–¦õ›n¸áŠßJX¿þtÚíDQÎÆkY·n‚$ÙÄ)§lÅ9%Š"D”……/â}9x‹÷µZʾ}3¤i‚1ç`y¹‡11UU’¦5FGÇxøá²~ý¹Üyçn††ÚX3?¿Äڵ率ÚµVã7þôÐÄĦ"R>ƒy²YÖȽw¿{íµÿã¯Cæç÷Ñl®Ç˜Ò´Æ¡C3´ÛqàÀt: ´ÛK8WE£”eÅêÕãt:=z½.ããk0&¢Óé#bH’”ÁÉMÈóЇz‘aœs u©×[,.z¦¦Î%„Š}ûöÐhÔôW~åíû'&6÷TŸä`ó÷·Zk^ùÚ×~ô{")33ÇÂâb‡ååcr&&k»4›-úý>ÎÑnwé÷ûLN®¡Ù<‰,³$I<¸™Ÿ'ŽcŠ¢¤Ù CC-ªªËôô÷Ed„³Ï¾Œ~–üÇ»¨ªRí×þðÈÆç?GD¦Ÿª¯Ë‰­~½á¢è}õÏÿü­ç†°_“i4êlÞ|2Þ· lÞ|N‹µkO¢Ýþ*³³›Ä¹œv» (Öj­gtô4ú YÖ ª3Ï|É×ëõÑ7ý$fù/ùO‹Ó¬dÙø[xàÏßsäÈßamFQ„P¡Q¯¯&„.½^“O¾„-[^ö¶vûÈ4›“úLÈcž‰Akµ ‘kµ)¬ÝÀÂÂ2iZ§ßwÌÍÍÓ릧Q#¬Y³ãË"rã3øŒA>:¸ÑçmÜxËË5”¥26¶‰U«Váœpúé¿À#|óÏx†Ë3 yòÉ¿xO¿_ÇÌa >Ü¥Ýî°¸Ø!8ï¼ß¼ëß5äà€ïÕ{h4†Pµ¬^=ÅÜÜ,EQjÅüK”è™\UG¢(.z½nšç}Ù·o†V+åÌ3O§ßŸ•Ÿ÷ªªF¹·š‘×ÏÌŒ½À9½'„@£Ñ`x¸A§ãPeû¾ðé¯ÇqüÛÏ´&åÒ oæDäfàð'?ùêw8ðýëFFÆõ¼ó®üßçœsåo‰ÔÆ~ðƒ¼bÓ¦MBx·µößþ¢ª¢ª·‹ÈÇÇÇÇý—¾tãeIâ¯k4@!çœsõÛº]ÿ,àð©§žúéûï¿Ñs‹ª^¸2Aÿ6!Uõ"à“À‹>ñ‰O¼ø `gggçî¿WïÀ½dYJšÖøÜç~g³µöˆª¦QÞ²e˯½öÚÿZůÿke¬;EU/RÕ[Þ÷®w½ë‚7¾ñ[—––Î*ŠâGµ›o~ݶ?ýÓ_ÔÛn{ý¶Ç¦œ L¨êUýUý¿:láBUý?ÓÓÓ7]yå•ÛŸóœçl:tèÐyeYN7õ²,/!œúÇ|Ùùÿø¯?¡ÏµZ­ÇÞ뎨ê®À^ø/º…„Ry÷ìììðË^ö²÷\~ùå þð‡7ŽwEäïW>«Å"riasERÅߎŽL 7žpÜ¥¥%·r÷:•¦é¡•»Ô7«êð{ªz%ð6)žQíyï‡Tõö›nºéU;wî<[U_Üét®TÕ©ãú\R–åuÞûß/ËòÚ^¯7v¬íúëÏ}ÏS0ÿÌÍÍýÌãÔ?WUÿZU‡žIó\§ªwlß¾ý’/ùËÏév»/QÕ‰cíwß}wä½užç¯é÷û飯ê÷¼÷šî§>õýÜç~ëÎ']›{¶ª¾Ö9wê〶TõU]÷Sß'CëUõ†3Î8ã»ví²Æ˜™V«õÝã^ !üŽsÎUU5’e™³ÖÞ%"·—ß»¸¸°mh¨!n¸êª¿ºþ‰žÕívëišž¦ªçGQô1ñmﮑý?Èüüe—]ö¦|àk7oÞ¼WDöüÓ»cÿÜ8ŽÕZÛuÎYkmZE?˲w}ñ‹¯ÒÉÉU[™Ý}ðàA&&Fˆ"«ËË9ÿüŸ?ÿ´ÓÞ¸ë L¶^Åkíº8Ž?ù8íMàÓÀ/?}JŸ n¾ùæïlذá¾3Ï<ÓÔjµ8Îÿ~És÷¾ïœ3@ªªÇñ®(Šn¸ýöWh¢è’çCC#TU…sÕõ¿þ럾቞ëœ;ED¶ªj/Š¢¯>Ž\/‘7ÿD‡Uݰ¸¸ø¬k®¹æoÎ>ûìF–e÷×öBçÜŽ²,—ÇqE‘clUU÷ÜqÇkvgY¢U•3>>ÆÚµ“Ôëql‰"óK?þB;Ú !lPÕÓŽ³¬Ñ•sñßëV>J=}ÈÂoßrË-ŸŸžžîE±çXtE»Ý> øï}áœK«ªJʲ´ª_«Õ¹ýö—ïNÓdkU25µ !Š Ýî2¬^½jç­·þ§óŸäù½Â#Þû‹¼÷«Wê–skV&ú¿×>mÈv»=º°°ð³×\sÍ€Žˆt޵Åq|y»ÝöµZMEÄGQ”eY¶EQ7I’{o¿ý?»^O¶ª£ªJ²ÌÐé,dž¥¥Yò¼ƒˆ½ñSŸºzÇÉ`­Ýc­U "rÞŠ†½ˆPUUÃóu`óÊ^zâ>Ùëõ~÷k_ûÚüòòò‡®¸âŠV½^Ÿ]™É¡²,ßÇqT º´4½)Ï|ÍÞ½Ȳefg¿«cc™„`¨×-ƒ×¬!æçHÓ!Ž™!„ÀÒR11Î]ÿú×ñ†'ãÒZ­Öé÷ûÛjµÚ"2«ª=UÝhŒù~á…"òlyÏ Aªj¤ª7?ïyÏ{ëW¾ò•Yý•a³1æEªÁcîÝû­—OOßÿóÝn›õë×03³›z}çºdÙÐ#Ž- ËœtÒóó] ZUU·V«Å­V‹³Î:kι Àð=UÝr¢«ë¹Ÿýìg¿ ø}ûö~|Ã7þê,,ÌnÊó%–—çh·—HÓ„zÝÐëÍ11ÑBD1¦¤VËX^n“$1õzv»Íèh‹¢è366Æøø8Ö¬5ŒOÐëµI¡^ÏäÁïßúÞ÷þò½++ê¼÷þpQ‹££££@røðaœsK¯{Ýë&nºé¦ï‰È¹Or%f4Û³gO¾cÇŽ3ï½÷Þ‰mÛ¶ÜpÃåÛj5¿½ßß/!ä„ÐcxxU!Š"ŽùµZŒ1ãã-:.ƵZA$ŒÐét©Õê¬];E¿ßEÄ04Tã”SÖ‚Òëuh6›ŒOÈÑ£³g½÷½/Ü–ç‹wEQ%Iâ’$y`xx¸øØÇ>6œe™œsÎ9É_üÅ_=Q¼kôÄWýµhÕªUSßüæ7uçΫ¾óï,®^=±ÛûG>LY&McªƹŠññ&EÑÇ{K¯7ðQçÝnZ­NE ³¸xˆùù4 òÜá}LQäyÎêÕˆÎåX »ß÷¾—n{Ã>ÿý•Ø¢UÖZ»iÓ¦‘~¿_lß¾}dnn®þ¤ûäß‚‡ëQ?Š„JYý¤ÿxåÃ÷|ìÿ¶«U›ZuíÔkùBaÖ^Pjzv§½,ëÖO1stŽ,nÑíöHC’DŒŽŽ²´¼HšF¤IÅ¥eÒ$Á%Ž#––;$qF¯—ƒ*yáQ„#G`~a™~?§ÙlÒíö16aq©ÃæIûÞ²,mZ[ÕÜýï1µî”t|¤ÞCÍï?ðíùóá•—í¹÷/oåR.ÀßöŠw³åžO™»Ë•Ȫ2d‘ƃŒœcŽ™³!Ž UYáW"ömdqÎcÄP:%ŽÕá‚ǹA°¾Š¢^^)*%M€ . ^èJ­Q•² ÄQ„óàœ¤fTŠS°&B5à}@$ƽ¾#ŽB&1ƒŒ"Ïù×¼WwEy®çûHˆcC^)¾äS”ê™Á;GP0!€1‚ a>a#ƒ$Õ@ÔŠ2€QG°@’DtÛqbQcqê(1”!`èwÖÒ8¦_ÊÒ#fðe:.Pª#McÒ,ei91h0tûŽ4‰p•G¤iö|èïŠú}È%@SU0ЊC¿€ÁUŠ×€¨`£ÁÌc)«©…ˆ"KYuз³b­!xav¾ ˺½ $ bÉÈ¥ta»UŒŠBé—"–(Jj,&5háèõ*œ:²8¦Ó¯¨‚RKc*_aÄ"ÖÐ-¯šÑrOIbAKOék@Ô+U¥ØÄ" y Ö®t(ðN+÷oÆ ²vBP¢Œ‚÷ˆç…Ø@¿òx§k¨JO’ª* Ç&L-Á{¼Öâ*%‡0Hrq„`ˆ¢ˆ(J ¥c¹SrF"KYUX±D6¢¨*Ô‡d„¼§à±]É®dÍdAð>àüà¯`#ƒ2Èv¤k->(I8–i# ±N /** * This global variable is observed in the main loop in order to exit the * program as it becomes true. */ bool g_quit(false); /** * The font manager handles the loading of the fonts and their use at various * sizes. One can do without it but it is really easier with. */ bear::visual::font_manager g_font_manager; /** * Sets g_quit to true. */ void quit() { g_quit = true; } /** * Initializes the visual and input modules of the engine. */ void init() { bear::visual::screen::initialize( bear::visual::screen::screen_gl ); bear::input::system::initialize(); } /** * Releases the visual and input modules of the engine. */ void release() { bear::input::system::release(); bear::visual::screen::release(); } /** * Creates a sprite given an image file name and a region in this image. * \param file_name The path to the image file of which the sprite is a part. * \param clip The part of the image to use for the sprite, relatively to the * top-left corner of the texture. */ bear::visual::sprite load_sprite ( std::string file_name, const bear::visual::sprite::clip_rectangle_type& clip ) { // Open the image file. std::ifstream f( file_name.c_str() ); if ( !f ) std::cerr << "Cannot open file \"" << file_name << "\" from current directory.\n"; // the engine uses the graphic module of libclaw to load the images. This // constructor builds a 32 bits color image from files such as PNG, JPEG, TGA, // Bitmap. claw::graphic::image image( f ); // Then we create a texture from the loaded image. bear::visual::image texture( image ); // And we build a sprite from this texture. return bear::visual::sprite ( /* The texture of which the sprite is part of. */ texture, /* The part of the image to use for the sprite. */ clip ); } /** * Creates a sprite from the widgets sprite sheed given a region in this image. * \param clip The part of the image to use for the sprite, relatively to the * top-left corner of the texture. */ bear::visual::sprite load_widget_sprite ( const bear::visual::sprite::clip_rectangle_type& clip ) { return load_sprite( "sprites.png", clip ); } /** * Applies the default border and fill colors to a widget. */ void apply_skin( bear::gui::visual_component& widget ) { widget.set_top_left_border_color( bear::gui::color_type( "#a0a0a0" ) ); widget.set_bottom_right_border_color( bear::gui::color_type( "#1b1b1b" ) ); widget.set_background_color( bear::gui::color_type( "#3b3b3b" ) ); } /** * Applies the border and fill colors to a widget such that it appears with a * hollow effect. */ void apply_hollow_skin( bear::gui::visual_component& widget ) { widget.set_top_left_border_color( bear::gui::color_type( "#1b1b1b" ) ); widget.set_bottom_right_border_color( bear::gui::color_type( "#a0a0a0" ) ); widget.set_background_color( bear::gui::color_type( "#3b3b3b" ) ); } /** * Loads a font given its name. * \param font_file_name The patht to the true type font file to load. */ void load_font( const std::string& font_file_name ) { // Open the font file. std::ifstream f( font_file_name.c_str() ); if ( !f ) std::cerr << "Cannot open file \"" << font_file_name << "\" from current directory.\n"; // We pass the font file to the font manager and let it handle the loading. // The first argument is a unique identifier for the font. Here we use the // file's name. g_font_manager.load_font( font_file_name, f ); } /** * Returns the font to use to display the texts in the widgets. */ bear::visual::font get_default_font() { const std::string font_file_name("FreeSans.ttf"); if ( !g_font_manager.exists( font_file_name ) ) load_font( font_file_name ); return g_font_manager.get_font( font_file_name, 16 ); } /** * Creates a button with a given label. * \param label The label to display in the button. */ bear::gui::button* create_button( const std::string& label ) { // The widgets must be dynamically allocated when they are inserted into // another widget. bear::gui::button* result ( new bear::gui::button ( // The font to use to display the label of the button. get_default_font(), // The label in the button. label ) ); // This sets the spacing between the label and the edges of the button. result->set_margin( 10 ); apply_skin( *result ); return result; } /** * Creates a button which sets g_quit to true when it is clicked. */ bear::gui::visual_component* create_quit_button() { bear::gui::button* const result( create_button( "Quit" ) ); // When the button is clicked, it calls the callbacks passed to // bear::gui::button::add_callback(). Here we tell him to call quit(). result->add_callback( bear::gui::callback_function_maker( &quit ) ); return result; } /** * Creates a box with a tick mark which can be toggled. Also known as a * "checkbox". */ bear::gui::visual_component* create_checkbox() { const bear::visual::sprite sprite_on ( load_widget_sprite ( /* The part of the image to use for the sprite, relatively to the top-left corner of the texture. Values are: left, top, width, height. */ bear::visual::sprite::clip_rectangle_type(55, 0, 23, 20) ) ); const bear::visual::sprite sprite_off ( load_widget_sprite ( bear::visual::sprite::clip_rectangle_type(32, 0, 23, 20) ) ); bear::gui::checkbox* result ( new bear::gui::checkbox( sprite_off, sprite_on, get_default_font() ) ); result->set_text("You can click me!"); return result; } /** * \brief Creates radio button: a box with a tick mark which can be exclusively * selected among the radio buttons of the group in which it will be * inserted. * \param label The label to display next to the button. */ bear::gui::radio_button* create_radio_button( std::string label ) { const bear::visual::sprite sprite_on ( load_widget_sprite ( /* The part of the image to use for the sprite, relatively to the top-left corner of the texture. Values are: left, top, width, height. */ bear::visual::sprite::clip_rectangle_type(88, 15, 15, 15) ) ); const bear::visual::sprite sprite_off ( load_widget_sprite ( bear::visual::sprite::clip_rectangle_type(88, 0, 15, 15) ) ); bear::gui::radio_button* const result ( new bear::gui::radio_button ( sprite_off, sprite_on, get_default_font() ) ); result->set_text(label); return result; } /** * \brief Creates a group of mutually exclusive choices. */ bear::gui::visual_component* create_radio_group() { bear::gui::radio_group* result( new bear::gui::radio_group ); result->set_size ( std::numeric_limits::max(), std::numeric_limits::max() ); const bear::gui::size_type margin(10); result->add_button( create_radio_button("Option 3"), margin ); result->add_button( create_radio_button("Option 2"), margin ); result->add_button( create_radio_button("Option 1"), margin ); result->fit( 10 ); apply_skin( *result ); return result; } /** * \brief Creates a component which displays a sprite. */ bear::gui::visual_component* create_picture() { const bear::visual::sprite sprite ( load_sprite ( "hourglass.png", /* The part of the image to use for the sprite, relatively to the top-left corner of the texture. Values are: left, top, width, height. */ bear::visual::sprite::clip_rectangle_type(0, 0, 57, 65) ) ); bear::gui::picture* const result( new bear::gui::picture( sprite ) ); apply_skin( *result ); return result; } /** * This function object calls bear::gui::multi_page::next() on a given * multi_page instance. */ class next_page { private: /** The instance on which we call the function. */ bear::gui::multi_page& multi_page; public: explicit next_page( bear::gui::multi_page& m ) : multi_page(m) {} void operator()() { multi_page.next(); } }; /** * This function object calls bear::gui::multi_page::previous() on a given * multi_page instance. */ struct previous_page { private: /** The instance on which we call the function. */ bear::gui::multi_page& multi_page; public: explicit previous_page( bear::gui::multi_page& m ) : multi_page(m) {} void operator()() { multi_page.previous(); } }; /** * Creates an object which displays a long text and which can be scrolled up and * down with two buttons. */ bear::gui::visual_component* create_multi_page() { const bear::gui::size_type margin( 10 ); bear::gui::button* const previous( create_button( "Previous" ) ); previous->set_bottom_left( 0, 0 ); bear::gui::button* const next( create_button( "Next" ) ); next->set_bottom_left( previous->right() + margin, previous->bottom() ); bear::gui::visual_component* const result( new bear::gui::visual_component ); result->set_size ( previous->width() + next->width() + margin, 800 ); result->insert( previous ); result->insert( next ); bear::gui::multi_page* const multi_page ( new bear::gui::multi_page( get_default_font() ) ); apply_hollow_skin( *multi_page ); multi_page->set_bottom_left( previous->left(), previous->top() + margin ); const bear::gui::size_type page_size( next->right() - previous->left() ); multi_page->set_size( page_size, page_size / 2 ); multi_page->set_text ( "Click the buttons below to scroll this very long text. " "This component will help you to present long textual descriptions to the" " player." ); result->insert( multi_page ); result->fit(); previous->add_callback ( bear::gui::callback_function_maker( previous_page( *multi_page ) ) ); next->add_callback ( bear::gui::callback_function_maker( next_page( *multi_page ) ) ); return result; } /** * \brief Creates radio button: a box with a tick mark which can be exclusively * selected among the radio buttons of the group in which it will be * inserted. * \param label The label to display next to the button. */ bear::gui::visual_component* create_slider() { const bear::visual::sprite bar ( load_widget_sprite ( /* The part of the image to use for the sprite, relatively to the top-left corner of the texture. Values are: left, top, width, height. */ bear::visual::sprite::clip_rectangle_type(78, 22, 1, 3) ) ); const bear::visual::sprite marker ( load_widget_sprite ( bear::visual::sprite::clip_rectangle_type(78, 0, 10, 22) ) ); bear::gui::slider* const result ( new bear::gui::slider( bar, marker, -1, 2, 0 ) ); result->set_size( 100, 24 ); return result; } /** * \brief Creates a component displaying a non editable text. */ bear::gui::visual_component* create_label() { bear::gui::static_text* const result ( new bear::gui::static_text( get_default_font() ) ); result->set_auto_size( true ); result->set_text( "This text cannot be edited" ); return result; } /** * \brief Creates a component in which the user can enter some text. */ bear::gui::visual_component* create_text_input() { bear::gui::text_input* const result ( new bear::gui::text_input ( get_default_font(), bear::gui::color_type("#C00000") ) ); result->set_width( 200 ); result->set_text( "Enter some text here" ); apply_hollow_skin( *result ); return result; } /** * Creates a window with the widgets, then call the game loop. */ void run_example() { // Here we create the window; it will be immediately visible. // The engine does not support multiples windows yet, so be careful and be // sure to create only one of them. // // As soon as the screen is created, a render thread is created bear::visual::screen s( claw::math::coordinate_2d(640, 480) ); bear::visual::sprite cursor ( load_widget_sprite ( /* The part of the image to use for the sprite, relatively to the top-left corner of the texture. Values are: left, top, width, height. */ bear::visual::sprite::clip_rectangle_type(0, 0, 32, 32) ) ); bear::gui::visual_component root; root.set_size( s.get_size() ); bear::gui::horizontal_flow* frame( new bear::gui::horizontal_flow( 20, 20 ) ); root.insert( frame ); frame->set_bottom_left(40, 115); frame->set_size( s.get_size() - 2 * bear::visual::size_box_type(40, 115) ); apply_skin( *frame ); frame->insert( create_multi_page() ); frame->insert( create_radio_group() ); frame->insert( create_picture() ); frame->insert( create_checkbox() ); frame->insert( create_slider() ); frame->insert( create_label() ); frame->insert( create_text_input() ); frame->insert( create_quit_button() ); // The bear::input::input_status class maintains a state of the inputs and can // notify instances of bear::input::input_listener of the changes. // Since bear::gui::visual_component is a bear::input::input_listener, it fits // perfectly. bear::input::input_status input; while ( !g_quit ) { // update the state of the input devices. bear::input::system::get_instance().refresh(); // check the changes in the inputs. input.read(); // notify the frame about the state of the inputs. input.scan_inputs( root ); s.begin_render(); { // bear::gui::visual_component::render builds the // bear::visual::scene_elements to display the widgets on the screen. bear::gui::visual_component::scene_element_list widget_display; root.render( widget_display ); // Once we have these elements, we can render them individually. for ( bear::gui::visual_component::scene_element_list::const_iterator it ( widget_display.begin() ); it != widget_display.end(); ++it ) s.render( *it ); // Then we need to render the mouse's cursor. const bear::visual::position_type cursor_position ( bear::input::system::get_instance().get_mouse().get_position() ); s.render ( bear::visual::scene_sprite ( cursor_position.x, cursor_position.y - cursor.height(), cursor ) ); } s.end_render(); } g_font_manager.clear(); } /** * Initializes the engine then runs the example. The engine's modules will be * released before leaving. */ int main( int argc, char* argv[] ) { init(); run_example(); release(); return 0; } plee-the-bear-20251226/bear-engine/doc/examples/14-gui/sprites.png000066400000000000000000000056211512343254000243400ustar00rootroot00000000000000‰PNG  IHDR€ Ú"p%bKGDùC» pHYs  šœtIMEÞ(1à–Ö IDATxÚí›{T“÷Ç¿¿$Ñ2AfE‘´è4 ;³x9UYu;ÞN­‹Õ]Ngí´N˜ÇzÙ©6¶S{œ²µ£§NY;]…¶0è:Xµ±­\ˆ\ ‘‹„@Þä}Ÿý‘pS”X%ísÎ{€—÷}^ò{>¿çÊË䈅Cˆ®Æ†“еUqÆÒÂ8Ÿ)§ÃsJ¼žÈ ðÀ pq ¶K`¬$Š…_-ì{¿1s¹²±¢:ÆÔÒ'¼Œ7æl@Xp¾Ïâ“I®þ< €À+&¢Hw@0œ ÆßÅšëÔo|•óÇ ?[ÿß•/œà»ìË) __nÅÌ <€Ž¬•ò땵‡J>½8S¥…ˆ¼G«;½'©¼;k䬳]&ŸáÉçg_šïK'b– b»'̱V6+Ðe8d±Ÿ»^Y{HSÖ ø­ë•»÷©aÓëy‚M'0N©6®9¼y“lFÇñ”Ò†–Chè ËC€——Ž?Î^|ñE·A 9“›v #¶¹Óù{xÙHÒPè¬ÙÞŒDËØÚÌc°è¯Ïêã› ÈûP@6‚1s¹2çàÉ™UÆQ•ãK| M'ÝpàmõÕäÂÊ…u93«› ÌàäÀÏÏÏ­pCìù_õ1]ÛúÛ.ÒMbÊݯxë¥ýŠ¡ÐÝž³WÑåiU k^¼ùÚA4iwÍxyý.‰Øú1Àó€Íî+ªcTZˆ”ZãÒ~;@š¤“_>³Ô¤/-+AÍÐoánÜ.â±ßJ!¯'dBË)”òwtðØäÜê1€È~0f/ D@§÷$çá³5IÇGD«Þ5W4Ðɇª‹»kã7ìHçdZ?D»ö4´­»æî½Éõw»zv{ô=Ç칄wgÜ‘í;”ý9}ñe¹HìFÈóÒ%d{ø8‘ÃÜH‹B]b2<ÆÊÐü š,üõW°à-Ú}‡Øý<`wýúû²7yXg» €ÑÉ´ÌhÒ_“Ý0ã¬[x `ÿ»–Î1¡kƒ§¦È!þÁÀ»Ð˜#ƒ©àŒ˜…€ék4j=am¿#]vWßÛ8é=G/À€€°à|ùI2ŸôA½€ÄŸ»š‹O&=ùüìKS}:BoÞ$ƒÄŸ»ñQŸ&«¿t9$«—\Q:Àp‡€…×YYtµ`*V@»à"_W ýÓ>I†Øh;2\@ó5 JÊ}Õ“# Ñì¨ÿíÉøî €ê¿.“çÈ6 ftO¹šüì1H[z@øs¶\M~öØùד¢Ñ´áêultÕúHœ½ÐÝ}‚{‘ªÓ­‡5ቧýÞ HÌߦ@ç7 ðRÀ¨YªÁs]ÈÏ–½Ó¶Æt~ˆÁs Çê®ÿpÀ¢RT‹=SÚÐrha]ÎL“>¼xäø êñÑ*}ñe¹IMV§*²Š‘õ:6ºª |W g$R ;©¦…ÖÈ%#Æ‚‘7 ’ØÝ·© è2AXðy¦fnx6Ý('|‹½ïÁ¨.À÷¯2­P¡±ÕMP†–•Çø(ø32‘¸aÆYù®rû߀á A}c š[y”o:œ,ñðxûd ‹/êêyØ<#Ž>½d›Ú¹Ø‚ž>tÏîïû»Û¬Å‡iËÑXQ SKúŒƒ ŸÅ'AêùyàêcD±¨ŠÂ€‰?g3êåws‹tÚ_ :ꎫGr™ˆãñ¬R†//ø¨™\ôž}Bç„îÎ"@ä ˆº«­wçƒ<¾?Ýãàœƒ'o íWâ¢'¨žÑ¥†%ÂS&À¢; ÁR€Þ"óÁ`(  &ðš¢`Ç\…³÷tè›aäjÒÜF÷¶é žŸ€'~d€§#`wuÿË'DûÉ ¶M¿è´nSI$Ä^…€ÕþêSÚ: Kƒ?€&Ü2Ö4KvÂ;üÐØŽf9ÌV´}óOÑÔå­¿o9àù@†€¡‚ ¸û2δX>;Ór7·y}Ô>xܼY÷Oã`Yù<Þä ºø<goè˾¼Ý,²¬ˆ¾ y bqQá,jZ¬øóaJ¬©jôŽƒ¥Ïm]¯Üµï4 ²ÀC ØÍ¬`îDsE'^»ì'.ƒ1FÛ·o§{‘ÖÖVZ´h‘зD´¯ z¸KÚ!W½ ”òrï©Ùx1 ‚¾ð%:åI”æE5ÉŒöý==¦ÌåÊÏæƒO ¥!¢Pª˜ET÷ª@×ß'R/ Ê&ºDtz,Qº”êG]ÎŽŸ …rØp/< BÙ£#¬K©æ]í[Úk|Ðì—çlŸ "¢i¤ž­¡+sj:JT»‹HLt>€è´/Ѽ‰>dDDÁ%;¦ÓæIÈy`A{³è»Hó‰„ÞMô\{ñ·UÖ'²…ÈÄt÷KzÇÁ€åz,m º÷ýöžïø§›˜ ¤nSÆ'äø ˆI¤?mýE7_Û3.œ³f‹€6=`¸˜Í€¥ à8€ã‰¤XÀ?B÷ºr,¹ß ‡sÇÐY¹x4Ãék{ÆÁ‘EK‘æõ ˆÄÀHGŠ€#ÀÆÛ“H3/ÂÍ6}òüt·ŽƒA@ii)V­Z…ÔÔT˜L¦ï=Aùè«Þc0é3Œ^•ÐutfÀдr€Ñ X0÷©WŽƒLëëë)<<\€ý¥‘ÁÁÁ¹+V¬ uëÖQQQÙl¶û–>ìrK°D{ ÐÛ Úψ‰ˆ‹Ú"¢P푹·VƒV¯^}‹ÑºCT*Ý:þ|Z³f™™If³ùž xD{hvÞ{rÐáM¯®#¢Pzc”†¶èuð´D{½ípÔ~´îœb ½4xskH0 ´víZÁÃÃÙ´R,oŽŽ¦øøxR(Âí¼Ã x„ ÖËÿ&åþjiÌÕÑ4"šFB>îþ^{d®æœb ½ÿcÐbÈ]À]@ |}}sccc)!!N:Eµµµ=@Ü‚GE{@þJò²ãÁ—ì˜NÚ#óJ;ϽööȼҒÓ);ü+AÈs©ñáx5lË–-hnn¦ÔÔÔb«Õy§]êd"#‹ãã'NœBË–-cÁÁÁHJJ¢ììì~¯¡=J’ …241~#'ðö‰²;ÇÁIíüûØÊUŠÅâ­aaa4gÎ â<’žàA"‘¨\„é÷#>;é!”Z¬ý½Ü'ÿåó@Þ7ßIEND®B`‚plee-the-bear-20251226/bear-engine/doc/examples/15-physics/000077500000000000000000000000001512343254000230345ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/doc/examples/15-physics/CMakeLists.txt000066400000000000000000000031341512343254000255750ustar00rootroot00000000000000cmake_minimum_required(VERSION 2.8) #------------------------------------------------------------------------------- # Find the root directory of the source of the Bear Engine. This directory # contain the bear-engine and bear-factory project directories. if( NOT DEFINED BEAR_ROOT_DIRECTORY OR NOT IS_DIRECTORY "${BEAR_ROOT_DIRECTORY}/bear-engine" ) message( FATAL_ERROR "I can't find the Bear Engine. Please set BEAR_ROOT_DIRECTORY to the path of the engine's root:\n cmake . -DBEAR_ROOT_DIRECTORY=/home/joe/dev/bear\nCurrent path is \"${BEAR_ROOT_DIRECTORY}\" and it doesn't contain a bear-engine directory." ) endif() # The engine comes with some CMake scripts to ease its configuration and usage. # These scripts are in the directory below and must be assigned to # CMAKE_MODULE_PATH in order to be found by the upcoming include() instructions set( CMAKE_MODULE_PATH "${BEAR_ROOT_DIRECTORY}/cmake-helper" ) # This will sets the variables of the source directories, required by the CMake # package below. include( "bear-config" ) #------------------------------------------------------------------------------- # Include Bear Engine's CMake package to find the libraries, the link paths and # the and include paths required by the engine. find_package( bear ) include_directories( ${BEAR_ENGINE_INCLUDE_DIRECTORY} ) #------------------------------------------------------------------------------- # Now we can describe our project. set( TARGET_NAME ex-physics ) file( GLOB SOURCES *.cpp ) add_executable( ${TARGET_NAME} ${SOURCES} ) target_link_libraries( ${TARGET_NAME} ${BEAR_ENGINE_LIBRARIES} ) plee-the-bear-20251226/bear-engine/doc/examples/15-physics/main.cpp000066400000000000000000000434751512343254000245010ustar00rootroot00000000000000/** * \file * * This example program demonstrates the physics part of the Bear Engine in an * Asteroid clone. * * A spaceship is controlled by the player and several asteroids are floating * around. The player can accelerate by pressing the up arrow and can rotate by * pressing the left and right arrows. Pressing the space bar will make the * space ship to shoot lasers that can break the asteroids. */ #include "input/input_listener.hpp" #include "input/input_status.hpp" #include "input/mouse.hpp" #include "input/system.hpp" #include "time/time.hpp" #include "universe/collision_info.hpp" #include "universe/physical_item.hpp" #include "universe/world.hpp" #include "visual/scene_sprite.hpp" #include "visual/screen.hpp" #include /** * \brief Returns a random number in range [0, 1]. */ double random_number() { return (double)std::rand() / RAND_MAX; } /** * Creates a sprite from the file sprites.png located in the current directory * and from a region in this image. * \param clip The part of the image to use for the sprite, relatively to the * top-left corner of the texture. */ bear::visual::sprite load_sprite ( const bear::visual::sprite::clip_rectangle_type& clip ) { // Open the image file. std::ifstream f( "sprites.png" ); // the engine uses the graphic module of libclaw to load the images. This // constructor builds a 32 bits color image from files such as PNG, JPEG, TGA, // Bitmap. claw::graphic::image image( f ); // Then we create a texture from the loaded image. bear::visual::image texture( image ); // And we build a sprite from this texture. return bear::visual::sprite ( /* The texture of which the sprite is part of. */ texture, /* The part of the image to use for the sprite. */ clip ); } /** * \brief The game items are the items living in the world. * * The class extends bear::universe::physical_item, thus having a mass, a * position and dynamic properties (speed, acceleration, angular speed, etc.). * Physical items evolve in a bear::universe::world. */ class game_item: public bear::universe::physical_item { public: /** \brief Teels if this item is flagged as dead. */ bool m_dead; public: /** * \brief Constructs the item with the default values. */ game_item() : m_dead( false ) { } /** * \brief Returns the sprite to use to display this item. * \return A sprite whose rotation matches the physical angle of the item. */ bear::visual::sprite get_display() const { bear::visual::sprite result( get_display_sprite() ); // bear::universe::physical_item::get_system_angle() returns the angle // between the x-axis of the world and the local x-axis of the item. result.set_angle( get_system_angle() ); return result; } /** * \brief Tells if this item is dead. * * Dead items are removed from the world between two iterations. */ bool is_dead() const { return m_dead; } /** * \brief Flag this item as dead. * * Dead items are removed from the world between two iterations. */ void kill() { m_dead = true; } private: virtual bear::visual::sprite get_display_sprite() const = 0; }; /** * \brief The laser is the projectile thrown by the ship. * * It lives up to 2 seconds and dies on any collision. */ class laser: public game_item { public: /** \brief The sprite to use to display the laser. */ bear::visual::sprite m_laser_sprite; public: /** * \brief Constructs the laser with the default values. */ laser() { // The laser is a small square. Since physical items have their bounding // boxes aligned with the axis, even if the item has a rotation, having a // square laser leads to better game results. set_size( 8, 8 ); set_mass( 1 /* kg */ ); // The friction of the physical item represents the energy kept by the item // when moving in an empty area. It is a factor applied to its speed. Since // we do not want the laser to slow down in space, we set the factor to one // to keep the speed. set_friction( 1 ); m_laser_sprite = load_sprite ( bear::visual::sprite::clip_rectangle_type( 412, 57, 7, 8 ) ); } private: bear::visual::sprite get_display_sprite() const override { return m_laser_sprite; } /** * This function is called by the world to tell the items that a given amount * of time has elapsed since the last call. */ void time_step( bear::universe::time_type time_in_seconds ) override { game_item::time_step( time_in_seconds ); // bear::universe::physical_item::get_age() returns the duration in seconds // since the item has been added in the world. if ( get_age() > 2 ) kill(); } /** * This function is called by the world after the movement of the items, for * each other item intersecting this one. * \param info The details about the collision and the other item. */ void collision( bear::universe::collision_info& info ) override { kill(); } }; /** * \brief The ship is the item controlled by the player. * * It is controlled using the keyboard, as follows: the up arrow adds a force * pushing toward the front of the ship; left and right arrows make the ship to * turn in the corresponding direction. Pressing the space bar make the ship to * shoot a laser. */ class ship: public game_item, public bear::input::input_listener { private: /** The sprite to use to display the ship. */ bear::visual::sprite m_ship_sprite; /** Tells if the main engine is activated, in which case the ship is pushed forward. */ bool m_engine_is_activated; /** Tells if the left and right jets are activated, in which case the ship rotates respectively to the right or to the left. */ bool m_left_jet_is_activated; bool m_right_jet_is_activated; public: ship() : m_engine_is_activated( false ), m_left_jet_is_activated( false ), m_right_jet_is_activated( false ) { set_size( 45, 45 ); set_mass( 1000 /* kg */ ); set_friction( 1 ); m_ship_sprite = load_sprite ( bear::visual::sprite::clip_rectangle_type( 412, 0, 38, 56 ) ); } void stop_in_world_center() { if ( !has_owner() ) return; set_center_of_mass( get_owner().get_size() / 2 ); set_speed( 0, 0 ); set_system_angle( 3.14159 / 2 ); set_angular_speed( 0 ); } private: void time_step( bear::universe::time_type time_in_seconds ) override { // items with the is_artificial() property set to true do not interact with // the other items in the collision detection. Here we turn it on for the // ship when it has been destroyed, until the center of the screen becomes // asteroid-free and we can safely make it appear without causing a new // collision. if ( is_artificial() ) restore_if_no_collision(); else update_cinetics( time_in_seconds ); } void restore_if_no_collision() { const bear::universe::rectangle_type region ( get_center_of_mass() - get_size(), get_center_of_mass() + get_size() ); // Get all items of the world overlaping the area of the ship. bear::universe::world::item_list items; get_owner().pick_items_in_rectangle( items, region ); // If there is a single item there, it is the ship. We can safely restore // it. if ( items.size() == 1 ) { set_artificial( false ); m_ship_sprite.set_opacity( 1 ); } } void update_cinetics( bear::universe::time_type time_in_seconds ) { if ( m_engine_is_activated ) { const bear::universe::force_type force_in_newtons( 5000000, 0 ); add_internal_force( force_in_newtons * time_in_seconds ); } if ( m_left_jet_is_activated ) add_angular_speed( -0.05 ); if ( m_right_jet_is_activated ) add_angular_speed( 0.05 ); } void collision( bear::universe::collision_info& info ) override { m_ship_sprite.set_opacity( 0 ); set_artificial( true ); stop_in_world_center(); } void shoot() const { laser* laser_shot( new laser ); // The laser must go in the direction toward the ship. laser_shot->set_system_angle( get_system_angle() ); // Its position is initially just in front of the ship. laser_shot->set_center_of_mass ( get_center_of_mass() + get_x_axis() * get_height() ); // And it goes a little bit faster than the ship. laser_shot->set_speed ( get_x_axis() * std::max( 200.0, 2 * get_speed().length() ) ); get_owner().register_item( laser_shot ); } bear::visual::sprite get_display_sprite() const override { return m_ship_sprite; } bool key_pressed( const bear::input::key_info& key ) override { if ( key.is_up() ) m_engine_is_activated = true; else if ( key.is_left() ) m_right_jet_is_activated = true; else if ( key.is_right() ) m_left_jet_is_activated = true; else if ( key.get_code() == bear::input::keyboard::kc_space ) shoot(); } bool key_released( const bear::input::key_info& key ) override { if ( key.is_up() ) m_engine_is_activated = false; else if ( key.is_left() ) m_right_jet_is_activated = false; else if ( key.is_right() ) m_left_jet_is_activated = false; } }; class asteroid: public game_item { private: const double m_scale; static constexpr double m_decoration_scale_max = 0.5; bear::visual::sprite m_asteroid_sprite; public: asteroid() : asteroid( 1 ) { } private: explicit asteroid( double scale ) : m_scale( scale ) { pick_random_sprite(); m_asteroid_sprite.set_size( m_asteroid_sprite.get_size() * scale ); const bear::universe::size_type size ( std::min( m_asteroid_sprite.width(), m_asteroid_sprite.height() ) - 20 ); set_size( size, size ); set_mass( scale * scale * 10000 /* kg */ ); set_friction( 1 ); set_speed( -100 + random_number() * 200, -100 + random_number() * 200 ); } bear::visual::sprite get_display_sprite() const override { return m_asteroid_sprite; } void pick_random_sprite() { bear::visual::sprite::clip_rectangle_type clip_rectangle; switch( std::rand() % 4 ) { case 0: clip_rectangle = bear::visual::sprite::clip_rectangle_type( 0, 0, 120, 97 ); break; case 1: clip_rectangle = bear::visual::sprite::clip_rectangle_type( 121, 0, 98, 95 ); break; case 2: clip_rectangle = bear::visual::sprite::clip_rectangle_type( 220, 0, 101, 83 ); break; case 3: clip_rectangle = bear::visual::sprite::clip_rectangle_type( 322, 0, 89, 81 ); break; } m_asteroid_sprite = load_sprite( clip_rectangle ); } void time_step( bear::universe::time_type time_in_seconds ) override { game_item::time_step( time_in_seconds ); const float fadeout_age_in_seconds(2); if ( ( m_scale <= m_decoration_scale_max ) && ( get_age() > fadeout_age_in_seconds ) ) { if ( m_asteroid_sprite.get_opacity() == 0 ) get_owner().release_item( this ); else { const float fadeout_duration_in_seconds(1); m_asteroid_sprite.set_opacity ( ( ( fadeout_age_in_seconds + fadeout_duration_in_seconds ) - get_age() ) / fadeout_duration_in_seconds ); } } } void collision( bear::universe::collision_info& info ) override { if ( ( get_age() < 3 ) && ( dynamic_cast( &info.other_item() ) != NULL ) ) return; bear::universe::world& world( get_owner() ); world.register_item( create_small_asteroid() ); world.register_item( create_small_asteroid() ); kill(); } asteroid* create_small_asteroid() const { asteroid* const result( new asteroid( 0.75 * m_scale ) ); const bear::universe::position_type center ( get_left() + random_number() * get_width(), get_bottom() + random_number() * get_height() ); result->set_center_of_mass( center ); return result; } }; class game: public bear::input::input_listener { private: typedef std::vector item_collection; private: bool m_quit; const claw::math::coordinate_2d m_screen_size; bear::visual::screen m_screen; const bear::universe::size_box_type m_camera_position; bear::input::input_status m_input; const bear::universe::size_box_type m_world_size; bear::universe::world m_world; ship* m_player_ship; public: game() : m_quit( false ), m_screen_size( 1024, 575 ), m_screen( m_screen_size ), m_camera_position( 50, 50 ), m_world_size( m_screen_size + 2 * m_camera_position ), m_world( m_world_size ), m_player_ship( new ship ) { m_world.set_gravity( bear::universe::force_type( 0, 0 ) ); m_world.register_item( m_player_ship ); m_player_ship->stop_in_world_center(); add_asteroids(); } ~game() { for ( game_item* item : get_game_items() ) delete item; } void run() { bear::systime::milliseconds_type last_update ( bear::systime::get_date_ms() ); const bear::systime::milliseconds_type time_step( 1000.0 / 30 ); while ( !m_quit ) { const bear::systime::milliseconds_type now ( bear::systime::get_date_ms() ); if ( now - last_update < time_step ) bear::systime::sleep( time_step - ( now - last_update ) ); update_inputs(); update_world( double( now - last_update ) / 1000 ); last_update = now; render(); } } private: void add_asteroids() { for ( std::size_t i(0); i != 4; ++i ) add_asteroid(); } void add_asteroid() { asteroid* item( new asteroid ); do { item->set_center_of_mass ( random_number() * m_world_size.x, random_number() * m_world_size.y ); } while( item->get_bounding_box().intersects ( m_player_ship->get_bounding_box() ) ); m_world.register_item( item ); } bool key_pressed( const bear::input::key_info& key ) override { if ( key.is_escape() ) m_quit = true; } void update_inputs() { // update the state of the input devices. bear::input::system::get_instance().refresh(); // check the changes in the inputs. m_input.read(); // notify the listeners about the changes in the inputs. m_input.scan_inputs( *m_player_ship ); m_input.scan_inputs( *this ); } void update_world( double time_step ) { bear::universe::world::region_type region; region.push_back ( bear::universe::rectangle_type ( 0, 0, m_world.get_size().x, m_world.get_size().y ) ); m_world.progress_entities( region, time_step ); remove_dead_items(); loop_entities_over_world(); if ( get_game_items().size() == 1 ) add_asteroids(); } void remove_dead_items() { for ( game_item* item : get_game_items() ) if ( item->is_dead() ) { m_world.release_item( item ); delete item; } } void loop_entities_over_world() { const bear::universe::rectangle_type inside ( m_camera_position / 2, m_camera_position * 3 / 2 + m_screen_size ); loop_entities_out_of_region( inside ); } void loop_entities_out_of_region( bear::universe::rectangle_type region ) { for ( game_item* item : get_game_items() ) loop_entity_out_of_region( *item, region ); } void loop_entity_out_of_region ( game_item& item, bear::universe::rectangle_type region ) { const bear::universe::size_box_type offset ( ( m_world_size - region.size() ) / 2 ); if ( item.get_horizontal_middle() < region.left() ) item.set_horizontal_middle ( region.right() - offset.x + item.get_horizontal_middle() ); else if ( item.get_horizontal_middle() > region.right() ) item.set_horizontal_middle ( offset.x + item.get_horizontal_middle() - region.right() ); if ( item.get_vertical_middle() < region.bottom() ) item.set_vertical_middle ( region.top() - offset.y + item.get_vertical_middle() ); else if ( item.get_vertical_middle() > region.top() ) item.set_vertical_middle ( offset.y + item.get_vertical_middle() - region.top() ); } void render() { m_screen.begin_render(); for ( game_item* item : get_game_items() ) if ( item != (game_item*)NULL ) render_item( *item ); m_screen.end_render(); } void render_item( const game_item& item ) { const bear::visual::sprite sprite( item.get_display() ); const bear::visual::position_type position ( item.get_center_of_mass() - m_camera_position - sprite.get_size() / 2 ); m_screen.render ( bear::visual::scene_sprite ( position.x, position.y, sprite ) ); } item_collection get_game_items() { bear::universe::world::item_list items; const bear::universe::rectangle_type region ( 0, 0, m_world_size.x, m_world_size.y ); m_world.pick_items_in_rectangle( items, region ); item_collection result; for ( bear::universe::physical_item* item : items ) { game_item* casted_item( dynamic_cast( item ) ); if ( casted_item != NULL ) result.push_back( casted_item ); } return result; } }; // class game /** * Initializes the visual and input modules of the engine. */ void init() { bear::visual::screen::initialize( bear::visual::screen::screen_gl ); bear::input::system::initialize(); } /** * Releases the visual and input modules of the engine. */ void release() { bear::input::system::release(); bear::visual::screen::release(); } /** * Launches the game. */ void run_example() { game game_instance; game_instance.run(); } /** * Initializes the engine then runs the example. The engine's modules will be * released before leaving. */ int main( int argc, char* argv[] ) { std::srand( std::time( NULL ) ); init(); run_example(); release(); return 0; } plee-the-bear-20251226/bear-engine/doc/examples/15-physics/sprites.png000066400000000000000000000611041512343254000252350ustar00rootroot00000000000000‰PNG  IHDRÃb,±¸!bKGDÿÿÿ ½§“ pHYs  šœtIMEÞ"õùõî IDATxÚì½yœeWU/þ]{Ÿùܹæ¡ç B ÝÕ¡ÃLR (* È”NâEž~À‡úóÁ{â{Š>E$"tEÙt%„L']M „H†®žªªkºuç{Î=Ã^ï[Twz¸·ªºSÝÉþ|’|*÷L{ïµÖw­µ×@xޝÛv9X<‡Á—¸Àeìð%&ñ™[wß—Ç3ã¼o¾~‡%Uøb€®p €ç¸S!zí?þ¨q¾Îkçð¶í}ÀÀ¼}SÞ52:öå§ ½îÞöóýoü'€ïÑ×wíÞ{ènn޽{÷¾ÀÂöíÛÿål<Ÿ.Ô…{ÛõWÚ!k—3ó•< Àó\ µô:f0DzbE~ÈÀßö>{ë׿>CŠkY ‘€ÒäK¾ÀË\@œäòû ÓGw|óÁI>Oçš‹_ÌË„ æÜ”¸läŽû~v!Óî × u“À'¼ú—<à« ú÷Î{çŸc`dtŒŸNü=66ö,fÞ•H$Ö{ž—°eëÖ­GžÃÆÍ×nëŒI<€Ë| €ç¸@ú8&c orÊ2t]“²Ç1ôÛÔ)E‡ç‡åBÍÓ‹U?‚½dqþ€ÏîûÊ3ÐóÔÔ™…CôB/Züçeì%—Æ®eLئ޴ŒYMJk|zÁŠ•JøÚÈèØ«Ï;Æð¶g3èA!hæ²uÝ=Š/<™H Ì*ãùJ}3€É‘ѱÁ ˜– À‡¸‚¨Ö“I”RŽ¥—=_«ûa½â5:³µä– _°;ôm]qÀ Ü:º÷‚#„±±1 3ó„ïéëë+&“Éb±8uôèѱ«®ºêÕ«O{ç è ­ˆžGÌ—-ZxW éÞÄ“@)©hú¼¥k)CÓ,ÇÒçL]³ˆ0ÀܼîTCòk^_¨za¹î¯DK-Œ/øôÈèØè3ÐtÎÀŒ2¦ù9Ìôr×xùRð#–©vL=›r¬S“= ,$ˆ•*ì?š7˜á2ðé[GÇ~ý<[‹¿ðÞ\ÒÉw¥ÝŽ uÏ… Æ£ó•H©N92:ö¾ ƼnéÙ|nQŽ!i›3})ƒ€ì Â9ðÂhºR÷ÝJ½Aa¬rK~ìèkR¨¯†±œ¤øB°ï¹ç2 ãÅJ©[Óé´ÞÛÛk3n„GyDÅq<´}ûö‡.h0¼ñú­—±’W|šç<ϰîDWÊ1צ¡ÉIÓÐ|S—–¡7S/ëšì#{Ì\cK5?,Ô¼JÍ6‹'ü¨!€OøÔÈèØž­Õ?f†b33/‚ßµ'Zû¦®O&,=‘pŒ²¥ë©?Ù¢xöÀôB€àƒ#£cÿó6ñ ¤µ¡ü o'˜2îƒ×£ðò2œ$bhrÖµ ™0ж €eYG~Nš-{ö;FFÇþaíáÖKñ° š»t°«ëBt‘ž8òåúø|¹¶ÀôÈèXßyk ¾|;‘äa4­Á^èH9“]©D†Áî2;_®7DÕkT«~ÐÏÌÚ’ß-ã7Y£;(R ŒŽ©µ „Dô&!ÄßwttT;;;ÓÌ삳Ró3…Âî/sá?¾è›ÙrÇ _ñç×½û>{Þ€áÍ×uF‚Ÿ-š‘›ÏCÓµy%íxÐk‚™Õ-C;jših2ëZÆŒeh’ˆ™!y"3Ηk‰BÍ¢(î¥'€ñQŸˆ9¾åó·ß_{îNêÛ ÄAY0]ÇàpñR”R,$m#°MÃHÚf gµ¾£âãSùÒæÅ?idtìkZ oûSýa.iÏw¥OZDÁ£Sóå(VþïÈèØ{Ï3/‡`F>àW›Þ m~°#Åš&»VO¡^oDÅJÝ×*^Êc•Z")«¾à[¬âo ©•˜•Ý·&€ñ¾ûî“D´žˆn1MsÇÀÀ@CÓ´NŽ#pEåÿ¼mná;_ˆýƒ÷“‚„@¡“°û˜Yž=E*ˆÔ‘rÍÏVüF-¢¾ÇåosÜ à«Äô5%ø1ˆÔÈîsëN£ tÃ0ÞCDêêêšÍ¦Ó½*Ž4ÿàÃG »ÿÍ(~ï’€ „€!Å!C k ª¢¾»çjuÅxíÍw®¦LXM†ý¿~ghòˆeè¡É^ËЂÅó¼ i>®ÍsŒBDõF0S¬x(Ö¼.KøK~dtß‘zãðvX0 ˆ…Ƥ®Fó¼ï:Û—0-Èw,cƱô\ʶ RÒ:>‡DÀL¡z¸PõÖ”âçþóûÖ\(ÿM×lݨ„8@ …Ÿ[ו{:¸H—Ž|¹6>_®o032:Ö»¶éÿ*“ºT0>à*àÚæl.¥!wN=X0]ªyNÍ µF°€XB>ø2ˆ¾(º× ¥˜ nÝ}öÝ©cûö]àËìëïéeöknñ{ߨ,|{Ä sëZÃÔÄœ)…cˆO.šoÄÓ••·Þ5~ÉšÛ†·u*Ð3ã¢þ· ]ö1#ÅO3Æ]b1VË^£^ªùõrÍß(ÄãKø wíÝw÷ù>Ï®ßJPB tŠPÛsý®ðòð»¦>a›zgʵæu)À¬=•BDjr¾8[ñ‚^={d÷Þ£kË*Üö€>˜IØs=™D×Ó—ÂG§æ‹Q¬º|ddtìwלå~Ý „³þÿø#Ф(õw¤<ÇÔ{Ÿj1Ød?*Wý Qõü¨R2ŠÙ^oQð5¾ŽXÜFR5Ä#£cñj˾ûïO« Qè홦ƒE £_2«÷Ï5Ò;.¯E¶ÃÓÕïõ^ÂÄú©i¸/ïå½XýþÍwøÇ5†;‡‡¾ ಠûHw&±ÏŒ¥Ì\(Õ¼ Póª5?ܲ$ð¦ àS úäÈî½ÿu^X~×\E,” üFD–%/g¦k¨éö|!€Äàئ~Ø1ŒlÊ5 Më³µÖÔ#"òÍj^v8 ÆsGn+®0:ÀÌ·ôwî×åÓÇEºtÄJÍ>29ß-ˆ@‚¯ØuÛ¾Ÿ¬kp›ÆD/ãs @&áLöd)'×ÚZ.cDÑÑRÕOW½ ⸠xüˆŠìðe!ð­XÑ,ã‘ѱh5Þÿ3æÄþ?ùÝC½ŽúÂ*Ëî++V÷¶rIKÇë @éÈø‡ž³ŽôÓ¨•PMß_ô ;®v½ñ³jUÖeå̺ýJ€ ösëºCfÎ<'_l&š*Têz¡âù(Z·ø?±ktßìÚrýl—  (ÚâëÐLt£'8 ¦®Mº¦žH8fÙÖõˆÓ`¬y—8UƧóQÆY?ÖuýùŸùö=OyÙ¶®ÛÚO,&/[×VÌçMnpS°òqk,„( †„ˆý(º¤Éä˵ýóåú¬wéÎá! >`'`hZq 3Rtóy"“@„XñD©æ¥k~P«7ÂÞæþ=>ƒø"dä¶}Þj¼÷k¿k?tåµÀNð³:Ò¬ `>N*&øÀ.÷@pNod?*ø3ÅP}ä­wÿÙá‡\Ö›II'¬g¬ÂÖ„/«ƒù²—*Tëq«®%7ðqØOíúúOžü¦—_Iš& bêðR;÷ë{Âò#RκŽ!]Ã[o¦;œàwréÒþé<¢X¥Ü^iÔ®ÿ÷»ÿë)ºÛ9<ôG>”q­éžlrMž—IAóº&+DäJA )DEái‚b"’D” ŽY Toöƒp}ËAᣓó…(VÝþfdtì¿=% ÊõÛˆt€~À?  w¥3¹¤Ý©˜óUY ÊWk>UW©7zÐñK#£coXwÝù¸¥'K¯ïÊR.é¨ ÃÀ Šc"4ý…üÃî¦3=Çyþ¾/¡ îÞyçÊS †;‡‡^à_¥ ùKºÒŠOíç}fœJÃ!„Q<>_©'ŠUÏbæÔ`¼‹ Ÿ¸u÷ØçÏå7½åš­— !>fÏÇÁO“¢–°ºmèfÒ6DÔ… (*V\ŸÎkJ±à3#£c¿öƒáÃÌ|Éæ¾ŽqC“›WŽ÷ÇýëØh-!»PR¾3•p˜Ù^†BX-TCg[½'ŠÕÌ£SùA zî­·í}àœîǵC:.ãï\CDpL}¾?—‚Ôy!EH,ò|Íóƒâá¹b=ïÖÝ{¼Òg÷\o™ôÙKE¯)Qµ $âºÕ,][ ¢¤°¤%)DM âE‹ÍF³j TÌGÂ(6ƒ0r¢Xåƒ(îbæ4ˆN*(¤ùδk3³³lå#V“óåú@; œ/×›/×/0;2:Ös.öâ¦á­B iCñû|€šó¯öæ’¥„mœ¥@Ác^ ñT[Œóåúä|¹6àޑѱ+}æm߇À}ræ¹n*Ç“2žteTÖ;™XA€HpÓHmaî1óÂæ½‘Øtó÷›XÉ<—Ï¬× ýw0þÌе‰Í½¹Áµ9z,ÏqqÖ]ȼ”"‚\š×u2ké@FªWêÒB¹^©6‚K–œ/2€O‰OîÚ}ßÞU¯Ê!F^€*?·¾ÛP¬ÌóÖõ¹Ìá‡Ñä¡™Bß"3¾KhâcŸûÎ}çt v½À‡Ó®u´7›l»‹mè3IÇ\6X4ÍDž‹bU¢¸+ŠU5Œb?ŒâAMÊJgÚ1™›S+¯qÐk„ÛQš/D±êbàoo{ÏYÞ‹ÀÏgÐç¬'"¤s¢7—L1ßgµ@ˆbSÓæ#¥‚X©À´$Àåœ$•>2«3à»}¥ÏüÇ«·½ªÃñ›˜˜A¨×cUñcÄ– Ç– "J-‚¢<ˆ¨…GÔÃûn¾kü5ç _÷’çj¶¡‡‹©SšýOÐ-qû¢)eQ“"‘‘–&e^¢!¥°t0O´nˆˆ£X¬ù Ók„Dd®wEóû …š«^¥î‡›—¤j”|‚‰>qëî½W‰ùÀGÓ®u¤7›<_΀ù˜ @-K­H·©7‚ƒGæJÇ„ôÂ(ü×¹óÇç wý„—oêÍ4umc»÷gÎ]ë΂` VÌÇB_Áóê³ÅªÏÌ-çáűš~dj¾WAÏ»utå®»'­ÿµC ê`æ?p3 K­Ðß™ -]ï> Ê¿""6 m.i¦ Ê.äqÇSaa¬dÆžbîoV1ñ9ÇbÍŸœ)T<22:véJŸ÷Ù—lþÇM®ñŠGëðb.ÖbvH‚„a3Ga¤s4ïHÉš ž%öN6WïûsuÌ;nºûÀ¾s †;‡‡nðŽ„mL t¤Ïª{ôÑ:) ‚()‰Rš&ç4)|)Ȩ€³R7ÕAXª5"/ÃÍm¤œU `Ðd¡\³ª¾FÑ ‘ú1†øÔ­£ËoN¼sxènf¼hCwfÊ6õ~¬Í¡ðÄQ&TׄȺìÕ¤˜¯ù»C+YëBÅl¦X¹hñ]ѺóÖ;xÖñ¦W^™Q‘,¨_¶®[o÷,žèÍ%ŠÌ8/"»c¥¦ç˵^jc»*õýs¥Ú¬²»ôæ_ÞFq]Ø¿À-‚(îL9)·ç„¶J«‚¤K1“r-MÒ©ÏraxaÏqœmQ%ŠÕYçSATxr>TJ¥™ñæ[oû ÁðWSºüø £1"fÔbá&£Ü+ÞP÷<\«?ú“>Õð$üú¼%HÚÅ‚(»H%ÇY‹3~4ùp%˜xë]ãËrã.KPÜxí¶&šVÌ|Ùº®Y€Îšß^šîL'|gÊ<çUS5?´ü ¨G1®!\!ŽÕx¾Rï(V=Ž•Ê,ÆÛ¥ä_þìì«·óÌ×ÿâiùQÄÌÁ³Ö÷Š9±¦Ê˜šíî ¢IC—®.E¬k2Фì3-¡ ¯Pñjaw¬  sÅÊá|Å[@±RÛn½ã‡g½KÉÎá¡÷øHʱ&ûrɶ»ÚkRìÏ%ó*'±êãõFÐrÐRw)€ŽŒŽ½{åÖàv’7Cáã^FDì˜úB_.Åš¤ÎU6 ]“ÓIÛ MŠžvŸOMæ¨Í« @²ÏÉÊö¨15™/÷¯†òé+2Y‘ÊxvÖN3(–‰”pŸ³c®ïíï—2•é !UËÅÒ]ßäÂè¿…áÂ\§ò=h‘7eKi‚2D¤s£J¢øûóµ ŠñÚ›ïÿs†;‡‡¾à¹¤3Ñ•vϪU(¥8Ø™t6>ÕçUD€b>PõÛ Â$îZ$‚(:’/×e©æå²|~dtì-mîí¯øbÂ6 v¤7=…ëÎÔ>"`Aפ¯k2«kb^—²›Ö™Î1‰*^>ˆâž•¢ âÉ|i¦\oô¨ðÜ]£cãg ÷1cëÆžÌaËÐ×·{¿k%×2Ò8s¥ZE)n¹y¬x摉¹žæ±¼rdôÞe+*7^{UŠI½ÀŸ,ÈÔ{rɹ”m®_åüNED$ͦº&{V ²5?8ZóƒS+³T(bæ,fÁMïŠh‡7„ è±ÉùbØ,žþ®‘ѱ¿[ÇO޼jké’„^¶úÖ½¿öß•{ÙÖ.Õð–ÄwHÓAšoÿƒÅ;¿æTîû®׫&×kEÙR†‚¨C(߈g~Zn”lAÏzãûÛZUjŸI·mh @í²uÝ‘b>« § q —r6­%¦õ‚h¡R÷skU¨ÔÁôá¹R/ßû…6…ðWxÍ@G*Ÿ´Í§ªlà˜F]×dÍЄ-„È-×#@DªXõ§a8°"@ž-”j~Ø`–‰¯¸u÷¾™³1ù·\¿ÍŠªÌì?kC)Åf{BèθÑE8φR<3Wªõ´ãYâ.[V¹ºÃÛ7¼ÀAÄIÛZèëHH02«¨*""!h.e›lèZÏ*ž;z³Åj€'÷ôd"T:R.K!ÒJñBŵ ŽsA¤òqwò1-E+{‹ò@Íaæ_oûq[•iî½÷^ÀzMן¼ÚK:Ãj˜{Áu—pØ Žc•R’™å©ÆD¤‘Dš† *÷ÝY*Þþ•Ð;ð³ÞØ« éU›’\G“‰û¼r#æ1ðÏo½k|¾eëÝ¿bóÀ]r½Ù䌩kÝgÝâT°M=»–V—"_õ©Ï™Ÿ(CöT޹r=„QÀ'Ÿº§½ýíÿg0Ó`g¦ œëW-ºkN¹R–¡M§\³[6}Ú+|Ù¦žŠcu8RË?Cd†Ì¸ª~P‹bÕI _|ΖÁ‘ŸŒO®zQ„çnøu¯J;ÖTb *IÇêÅlÞÝ‚ò’ ÂxÅ-ó¼kéRÍ›WÌ]Wlèx`|êÛí˵þÛ<ÛÔµr.UÌ¥œîÕ j‚ ¸Ù’̬¥«[Zíãù ŠS'X;^6å„RˆÌ"mØRŠ´©IÃ6µ´k™ÂÐä”ThuÍM]s+^c6V*«±ŒŸú^«¹wïÞN)å;u]ÿB.›½dýE'¬ýªáG*Ž¡”bß÷§«Õ*J¥Ò|EšRjžˆlf¥8Žˆ”‚9¸9™yÙ/%3/ýÅ-• żÄœ©†±ŸDìÕ¢øu1hûµ(|áÛ%´T_µ-ÿñÎá¡\$Íe“ö9©†Ak0¢Ÿ€AMÊÃ'0q±;›8rÌ]“ãOUš‰Wê~ÓÍ$Ô—ÚÜß—–¡°ŠN¼()AhRL8¦¾@§Ø[×2Äj.3#°78†~+ 'Åp7ôd…®É?G¬¾ñ–k¯´ÎÂ6ÞÄ dö²ÎwL]ËóyT¶íÄ‘°ÍuRÐ\ëûÂrCOv1ÐŽßuãµÛ¯\ÆkŸ§˜qQ_GØ,¬½*ÈDˆ¥ RÒ2:SNÎÔµî³%ÓèP\¢™„SׄxÈñ¢òÎÌR“bk™ý̨·¸ÞÔŸ{üxò7]{Uª ^ü„뺰iÓ¦J.—sà pBßjµÚÌÂÂBåèѣ充…Áz½žfæõõz=Q,×MOOcnnn¦R©Ô<¯>úž k•ˆL;›ûù7§.þë¯tløƒNç®{}è lê¸t°/¶¤xnîŠíïºïþuìٳ猆ŸÖæzßÂÌèÈJµÝÆXaHßÜ´^’5?8Ž¥®´ ›,C‡eè9SõFhÖý ˆ™ûÎÕ,‚0>ÀÌanä¶i×Ci×r–Á°¼| EÑ”®Ë„¡‰H“2Фìx=° }¾P­+fØKÉC“â°&ÅúÕ–ÌŒ¤kn’Æ«^°iÙ$ÉHoêɖƧÊQ¬^$HÞúÚ>çM_ùÁOÂÕøÎ7¿h« `k9¥Ú_ËÐ83ëÙ¤ÃsÅZËì/…èîÎ$öÏ•j[˜ø64S¨ÚŠWª˜Š@uÇ2j®©g0Ï~l%ms¡â52â”cÏêšh)¦ƒÀ¦¡ËCaohIá2ô×2&k~0 Hý¿ÝâÞ^ÚÛÛ{4Š¢MžçÍ4 ³ÑhŠ=ÇþkÄq<8}tF™–a†^2 34 C3MRÖSúú‹û{ßö¾o}oP¹÷_Üñïù|÷¦ß3]iÚî¹çž®¾úêÒŠ,ÃÃCÜTÚµ)Ç2Z'l 3åŒgö¤mèGA(¶C´Fs½K/,ΣܙN0ð¤ö~ÇÔ;ºÒn_WÊ· }@ålW±êu6 ˆ¾¸ŒÛ_ÇÌȸV½Ý ¨ºv4a™•LžìL»qGÚY—²Í¬©ë]Rˆf¼ô¢IÑ™K:êK­µ„mêgKh0®elNÚÆÁ•Ð¥7vgAäø×6ÿâ†á!m5¾QZb'¤cj±$\Û oZ€ó|¢î¤clçžÎ”»Qr@çÎá¡¶ùÊPàúJ¾›€Xy®iÌw¦]éšz/ç,gÙ1õN"*&óˆ¥Ë–ƒ€mèv;tÖ—M3ˆ~kçðP_‹¼ÏÎÎV¦§§¹\.÷7"JΔÂf:¾øÙ¯ïùÞØÔÔ‘kzj&;3=›ž™žIÎÍÍÍ ùje!?Ôkdo{IjÓ~ô’«Þþߨ#—ûÇq¾æ8Îí–e½Ïž=;î¹çžÁ{î¹ÇiÛ2¼ùç¯4ãÿK1c]WíèNi×zT q±€¡I¤ÈB¬x¿×r^Uâ8^ODç!³ŠÍRУ)§“ÙÓ™bsÒ1‘v­¨EõFûp­j¢,¡\÷+2Dü¯íÜ{ÃðÐ¥:4MÎI!Ö·Û@6ažcƒ‹·¥ŽÏ´ùŽ\Ò-.TêUfN¢£¦®õŸM33àXÆ&"q¤âù}ÌXˆI):7tg§Í:ó{˜Þ9|Õ_ŒŒÞ·Òþo71€´ë,K€jRpAË·t-ªx–MxÅ,7öfÅ£“s ¢ß¹ñÚíŸÞuûÞV£K‹@Å.)hÑΈQlz!a6=Œs¯É3`ä’N^“´±]6² Í*Õ8$¢–¼~š&ºSŽ5Y®ûþÀ›Z‘QQu!Ú¦o!%öÜ=æÜ߃¹8Ž]=“—]q‰{Ñ%«ë6 v›¦¡›–i™¶éš6eYV§®ë캮‘J¥¢(Ьr¹üÎjµú~¥Ô]qÿËž={¾'¥<¸}ûöZK‚ Å'mB jYÛ0u9aÚÅ|‚F![\Ë@Â6²Ì8Xo„¹ ŠfA´å$¥‚×$R23ºÒn/Ÿ>·çDfÕt)ÓŽDƵòõFH~#*Q´Z‰ý“(^'ˆ°k÷¾;ÛÔhohZ$–j™Á–¡/ ä LGÒ)å+õZÂ1å¹8kelC['„=]Ç\ IDATªyYfË¡3C—½ƒ]éÃGæŠƒÌø?€šÞy핟¹ýþeuºxÍ/•Èã%`Ž’Ž‘XŽ‹Ô4tw9KHT¼`‚OÜ/lS5qN+MÑ2è©«'›|l¶X½ˆ‰G´š¦Q€H)¢­¸B%ˆØÔµù„cê‚ÐÃOqéB)¨oY4¤4MŒcÞØ*õfF¹î+oÜyݶŒìÞ÷ð™äæJtM×Ù0uºY.U7Þsç^|ÿŽ{»À\ÜÐ?wÉe[ä¥Ï¾(îìéÈZ¶)S©d7ƒ}]×K¶m§]×­e³Ùj­V{NµZ}™Qý&€]gÃ× ­ã­Ì äR&·¾! ™„}Ú$ÕÅß6:¦ÇÔS” J#ŒÊ~‘„)XÃVc;@x’¹w؆»y¾8YóÛk„A¬¸w¹S.V={±~ér y¿aÑEÚvt¤&è°bÃrLJç’NI ʞýƒ¡ÉÞL™-V½3›Ë¾Ž©¯ïͦöO*›˜ù3 9ûöW>ïÛŸþNû…½ùä ´Í#Jñ¦åÌÉÒµ"€¶Ó~ü :T÷ƒ §baʱêk¹þð±Ñ‘r6ªÞlÅÝ;‡‡>>2:ö[-a³ˆ…­u0Ô59—vm!Å"žÇ|€mÉj½u ˆº² ûH¡ê­Óß¡ÙæíÜxçAí˜k'=st.=51ƒÛ¿}74]›[¿i ü®ßGhÚz"ŽãþJ¥‚J¥â2sÁ²,J$¡mÛ‡§§§ À.Ñ @gÚâÖ¥ë)í†&3sÒÐä@Ê1û{² §+åî·uùth 5àZF®+ãöveã¶¡M1ÃoW…®xÂâŸmE‘ÞøŠ¡€KQÕ4´¶5Ç2Ü• I)( àœ÷Ó¥èÎ%mˆªËÑX™´kméH¹‹çß byõ2?çFNXÎ2¥Y¤k²í(o"*–j~çéAߘ㳜S¼ZC)–»³PM¢|çÎá¡m­ºIÃX9mÒ~Uºø©boé3CµNr@O&áQ`xçðÐŽ§â»/Ù)ˆ×ö“©DªV©xž/‰èº35t]Ï(¥\ÏóÌZ­æ ÙÂìô47\7ôb/PîÎ$2­~T.é–£ž d„´Å\FõóV3c@6'«¿7—$S—-W9!AõŠ×ØlÄm!ÇôH¹Ö‚R¬µùÍÊ2Îo}E ‘Í%X*PËaÄ®”³>ãÚ3Í?éŽ×n{ö2>eÌ*e[ËJ×0 yp9í”Ê5¿‚Óä”2®mœWA9BPwo&yŒZ)ÍÕt“Æ*ÙææÓ…$ƒ¤ N)E[mÈu¦ÙÅ??v®ÀO)…8ŽÁ̾ãÚ~gw‡¿aóºÚU/Ü:û+oyÕÔ{?øÛ¹Î”`¦i Ó4c×ug\×­&“É™D"á3³$¢3Ðc„ôw$KJqK‡ò)ÇzX“âR<3VºÝf©–…b½Îh#€‡oýÖýÕ6ßõFf íXmjk’ ç»f,erI§¼P©—”â4ÚÌÁUÌèíHvD*ÎW¼ DwÝ8¼mÛ®Ñ}[¹çuCo Û<¨˜—ÕÄ×ÐdÛÕW”â£õ XwºÙš‡%ÑÆóm‹;ÒÎÆBÍ› £¸kçðÐßŒŽ½ó4—/@¬T„sý¹rÇМªßžîÓ‘t“ùr½¦oÝ9<ôª‘ѱožï‹£˜â8ÇVŽkÃvmtvç.ú¹Í¸èÒjã–õ`ÆÀbE!HÌ[–U•Ræ…]q÷×jµ©r¹|¨^¯W„_~þóŸÿéÓ‚áÎá¡·X¯ 1“qíVó MN9¦~)ã™±rª¤‰X©ÁVkJUß^¼´-«ðm×\­…_pèZ†ÝnðŒk‰ ÅE$ˆR)·\¨ÔËQ¬Rm¢b}°+ëšYX¨7ƒFoÞþÂ]£{Ï\¶£H+¹\!f›FO.Çuje—€Bµ.ÎÔ)µ ó|Ü⦻4ƒ‡'çYýæÎk‡>5rûØ)Úûð@PÌeà¬ÕæX)…ÅÊ_‚DH„5çV±L=¨xS-D˜9ÕMNLçË€f³ß*ò'%MÓBfãfé5½UÇJaý¦°«·Óß|ñ†`ËÅió%CË6»˜!™9f…†iÙEö…®â…è‚@ú¾_,—Ë?­V«5f¾ÀW¯¾úêû®Ó¼ûãÌŒÁ®t¨ŸQ( …lÒI3?…«1¼0°[%ÑL©MÇma(Â×@Â6'™[‹"["€#ÓÐÅ…´î¤rI§R¨ÔKa³T›€¨œõÝ™èàt¡à‡ÑýÆk¶_·ë޽¥3Üúó¬é„%—E*ˆò‚hs;üç7¢ƒ±:ýž3àÙ†žXòÜ…š$ ]Õ¥mXËØ‚Plt&]0³‹gƪŒ Œ[NЕ”êìÚ½ï6_õ–cI»"M“bBràò'³IÇÐ5YIJΑÚЕ†&˶³à[ozåVëÔ^˜m¯k*$Æ~V¼¬õ4 Ùh”T(Õý®Ó Ív&ÊR¾.×ýzÍŒBÅÛ0S¨n˜)T*…ª÷X;ôº2AMs®enÏ…çlÒ59 ·sxè§¶ 8Žã³uXó‚¢ JDÓì’k‘ø™Ži´ýmJ±Ó›M+¢ñozÙóOfõ>âyÞ€iš‰îîîDggg1N{¶mW ÃhH)#þ1Zff0sCJ)ýl.Û¦¼eÙ^&“]èîíÓr]Ý}&”LŒw”î½Ý›ù›ú£xÓôýù~÷¡¿ÿÓoÊtçkvìØñ[§“Z†7¼b«ƒ¬˜1Й9c‚=3Б²gˆð´ t9ûî:(?ˆZncS¬z¹Å”Š]Æë~Ìœrͨ]ßµ ÷v¸¹„- U!ˆ¢,Ú\„Ô†îLáÀLÁ‹bõ*‰?ðG§¸ø&H»Vz¹ËÙnS©îUqêäüzʵælC_¿´Æ©b>ê5ÂÁ'Jd5‡0Š“¡ÃÐÏžlgfN:Ö!×ÒÀè "u4Œ¢–,Å,7ödèá‰y%ˆ~ãÆk·}j×íûÆŽÛ…<*ÍÚ«KØ ökÀ=_ ŒX†Tý í̶¤cvºÌaÜ©iñïøðqëLôÁ©©©?O¥RƒÙlöÇMt$Ò¶žH&…áL£Ñp}߯EQ$”RJ!¤”Ó4 ]×}Ó4“$eH@… £1}8ç§ãÊýÿY¬îû5{0Kò,ÍŠ´ªìû£m—lj©ªÐ“Àbñq­#RЃf’¶ñ¨&å²L}"3žÒ¥#R|€[Z!D" ì5d€¶«Î¼€fú@ýíd0Z†f\ÈûÀ€•MZ²Xõ‚0Êq›€(„È®ëÊLŒÍÑ;N †øeÅŒŒk³Z†fL]¶\û2R|¤Þ׉'u]aئ~8íÚ)f>ÎýI+ŸsaÎ )åL.åá‰@­lÂ2g‹Õ:€–¢g‰®Þlrÿl±º…‰nÉÑî„|Ó2Tg%x¦æ…y"8_h_Óä 5פ­®)J±Ö—MŇf Àÿ¼ùš¡}öŽ±Ú±ß·oßþ¿°gϞߨÖj¯O¨ð’œ¥'íþ Žt“=ަÁuÝDÇù0 •®ëRJÙÉD )«0?Ûæ§Ù?ð_^yï÷´ÚÞ;jRÈNÍ0Ât&í=TlKa|—âß=…–Ëë†7\³m3€·0#ìïHÛg² uMθ–qq»ìKÂ(ž(Ö}Çj ;“œ'j¹RÄ?¼ êj]æP¾Þ7 "ŒŒîûJ›û°sÑ"1Ú=÷Ñ¥˜$Z{Q¤Jq‚$7‹†¯¬³73ôlÂî,Õ½ ¯µ]挞p³NŸÜE:ôKàšÆc ^VÿA]ãÌh9U´®;“8Pñšßˆú@Ð4!¦³I›Ñú“Ñ‚ÄG¢Xë2o”qíC–©m8É'å2 ëP¡êoh•U:’ÎæBÕ› £¸gçðÐ-#£c¿ñ8X¹^Þ­Ûˆ•J,v_M¥*¨ûs>5Ôbf؆xAûõçSï± ý¨„}±Àüþ‰×ìØ±ã–*óg¿ùë¯>Ú?³bàµoH>ÿZ˜ë/"HÍ R¦iB‚…D\-Öù£²qôªŽÝÕ(ï­r¥Ð«é†J$’¾)¨¢ $+¡ªÃXûÝÞÖ¶Gî8ÊôÏÐv2Ÿ¾Û4sIÛæöb¥&ò•úd¾ê *Å}D$*5Q„g £ÙV¯­Öᢶ¾g¯z3#íZ^û¿&]¤j¾R›(VýBÝ Q{JqÈÌ1VÔº‰ÉµLc9óÍWêÎâþ|á—Ü)×Ê.w=M]k»ç¡ Ú”v¬u½¹D½#é<Ö™rzQß)x½V®yÉÓ N)D~µ7SÚl'B€¡i,M›jg7vgÁÌ À;nÞzձ߾òµŸF‹×¤@ˆWsu?˜Ãiê¯aW©âåñ zsI‰¦"ø¾‡‡Nz6ý1"U{è~Ç„º|æó—=ò—¿W-ÞñÕzãè!4]1s#˜>Tôƒ`îËÿXøÛ?òŽüéo7*ßýŠcÄA.•LÕsŽUv%uIBV1ð³J u¢ÿ±,kø uÛ0€ç¡Ô™v;Oç®aFØ™vbfdZ^ ÅS¥ºÏA_÷*VÜYõû]ËØòtB"ªa´¥UwTÙó‹W¶EzÃðÐ%:5)òšëÚqÏ1X†¶ær±¼F8 Ææ(ŽF1ª>+!hÊ6tDZ ]-»|žç‡mŸŸQX®ùÍÃ<¡FNqÙë3r ;Z–‹€mêsh#¥â^NiR¤N÷æ(Žk HžlúRÐ\&áDRˆ¾§bÏ3IÛ™)TJ­Î_ê9V»” ¾ƒãÝ¥ QV¼ˆW½†u ~^Ó'î†.{ (c±ð~[@ªkÝ Ûœ¨zAþÀ¯xMïK6¿ÒÕD^ Ñ©lW³G;&þæ£äö—r¯|“Š sQù‡wËê½ß­JAš®«d:]²ˆª’ x‰¡•â|9ŒKo¿ûÀ?-KùZ²mŸc}¹TI¦Š3KZGQ;Úèøl©ÚFñÀ©JÕol‰c>z‚0©.TêU¼ÆL½úQ¬ÆA8B¸ Š>7Â(ž§‘PŠËõ ¸Í”Šc.ÒŒkí a]“S´ 9Ë#®x {‰ f Öü ×¢Ò ¼0lÛ_äá¤j–0{dä¶:ñ÷ÃC×€cèã îY®á!…Øx6V ÑÝ“Ix†®å'¬Á0éX:Ó‰ÜS„‹ß‘É%íJ;$Ü‘t¶º6 »sxè7—ü4¿Ø3®¶j® Fèä]í£X™ŠyÍVöa†4tY\¦7½Ù¤±xL𶆷=©î-+ú…nSrBRÅT×4é‰DJ«>poסÿý;8úñ˜Þ­9®ã¦n=kuWP— äx ¢i‚FU[#zï²=‹VáoèÓ¥œN;ÖiÏ\K߯kZ[2‚(6Ää;¯Ö"*=aMªé0Ry°§ê5¬…J}óÌBeÝL±R.Tëûƒ0ž¼ÐÀЖA&ãƒÌÊ0wëî}í6ò}â‹´íÔ×Ôݵ¦ÒÖü`§èP@DâØYP¨Ä±jKà€…rýXôà'OqÙb©Y®‹ÔÒµifÖÎÁç²®Õ—uíCº&tg“UÛÐ61óSž I9èXZË銙óñžK-ÀjÊU(RŽiÌŸÔð}¯17ß·&‰Ó0—¿/Ôt¬éEùþî')Y‰ð%Y©Ut¦\Zé ᛂjºaŽëj©Tª–q¬JJIƒbF†OÁkÓ^T¨Çêg7ß5þõ!@ef v¤BušZ{RÐtÒ±6´û’0Š[³"éª×—Ü眈¡‹Â%DjÐÔ5Ð ü0j9ú©Xõ:×£­F¾7\?Ô' s·U‹ÏÒ5g-]XóƒÓÒBÄååBz°@Dm¦V_ñüæ7)q*é J1²Éö;…¦®eÎÕ"sÓu¶!›°×ÖØ·Þ”@3 e¯$⥉áyX–¿ú´„ac±ô ²LúAÔ¿P©WaTY‹V¢&„¶‚¢ l<Ñhá8þ<Àé+:;†Šú†jIëòMÇQf2L@FiMĶ t©/dÄh¬…RýöŠæºsxèOèŽeLY¦¶î -—h_ ”šÐJKšJÂ6Tš%±N:’¶9Ãà -%c2ŽÕºV¼¤‹|Ë2þ­-9­ðfH¹Ö¼RíU149`ãZZ´ŠÌ8½5 úÑìÒVlà‡QÛ…³ë~0ÍŒDx`äŽûžTŽmçðÐ5`›ú8€eÕ"mFüi5ÆYø 1]o„ƒ­*;³¥ŠZlàûõÏŽÞ?}<¢8–º\½ÂJ‚³ í°DëOF_Ìè(T½8íX¶©oXCëW¼†¿ÜtšXqy¾T³(€>·ô·ƒ·à%]—W¥µ¥š3Ë9ÇæÌJcÒÉÅ=lÌØ†jˆVÖjA!P¼çmw­hŸü¶bƺÎôóLc¥új»µP©–V3åXEæ'΢â8ž9Å3Ë Ë¸àR1üFl´LxÌ(^#£cßmóUobf¤œö[9¦î¬%)ÐBÙÂ…FÅG—a …Aí~ÓBåqé-§¸ìfH¯ ŠT 1º0ºÚ¯Hª7âVÙF•òe¯©<¿ÿ„ŸóD@Ôf§V,ê„e:8+T M®¥YÊk„y?—•I@<½Pñ$üËÈèÞã¢Ý…צ]Ī! ëœ±6×ìÔÕ =]oœàž7òµT0ßÊ{ŠýÉzDRà}+VZTK´2Efžn{UšçZ§ÿAÓ¶©­[*P‚H9ÜÔœŽ•å3#éX§ ò9_G# [w‘Ö|gñö;í¼ã†kvè^¢ aF›L]·t-±¦¼cÍ~‚$ù§ñ¦°$ŠsÛnõ Чˆ¨MW$y/h®SŒÏŸj+šQ¤N}¹s7 Íxº—¦¦UزÀÎWêu"˜öŽìÞ÷Љ?@«U§q)©ÓÐå©bâ„eÎkRdÖʺF±*—ë {¹V¡F³¥ºß   ¥Þ}ãËŸ{܃J?•/Ó‹š§"*6MG²ƒ*–ô3Ê&AÀx5¨)Æ—oúÞøc«†?Yt1‚jQkâv…UGÒ%>VÄ dÝã&0Ù„íu&ýÝY÷±žlò@O69Ù›KÍ[†vÁiÃD?Œ2- €%|©½(R½–q”™Ûb>S—sh±âǹ†&{2®]‚êüäZ¢‘ÂKØæŒehm7¾õaÛõv«^cÍ3’{G¾;V8ñ÷×n{1iÚA–]•Ä6´*žæ£ÔžUÌkÇ¢÷Ÿ +›)µêAAÌ@²i6ˆ(DJФ ßÔµÇ2׊^ÃÌA±æ…DXn*R4•//Mò‡Fîøáü®ïþ˜—<_‡þkݘ~™µðýÌL~¯•¬2¼Ø5ˆ`VUô3ºþ½ˆ+Ó^ä Rü§\ºâ ÀOˆè•5?è5gVœÃ(îÖÚô§KA¹„}`¡âm:áZ¦6)¥x’PФØ|’º ™Z)ÞϪÅl‹|â/¶G鸛#BÓ°×âês“V:²I§X¬x*VÊm.…º&«)Ç’‚Ðß.éÀ^…ípP¨xÇÚiÝrŠ‹šQ¤Žµì./Ì ]Ó:ŸÖ]b3^#h¹ÍYÝ[`p/€Ã#£cwœä’ÇÚ8uµL%­ [Mv9¦~H¹BPšˆBPU—2¹†ö1ªø9¥xyîQʵƬFý‚èàÈè¾??ñš½÷ü 9ø–÷h˜:`Šÿú1Ž><^Ô~04µŸ w0Ö›5Ö9MÅÖâ“¿‡­ýÃMw˜]‰kßa´€úxEJU±Œ~_º&7%móáŠß¸ô8)ViÇ2ð4^#ìlUÃõüÇù>òÅÝcíZ¿f•t¬¨ÍbÄUCÓÒk9OXerI»¼Pñ* ×2 Ž©÷«fäWûRA©Y0úÚIkeF¥ê72D„øÔQ¾7*fä’NËŒÊ$"kõBÆu¬s”Z±æF¥ÞˆZB"ÂL¡v ¿ÞŠËš–¡â–]×m«hñlX"üt0k…£`/ˆ žö® h¦>]¨¸‹G8ï>Ù5W½àE {÷îýp}ýůÌnÝñ¢d1??úÓDù}VñGCž{@¯êºFš¦U$‘¡B4ÏÁª!—çQIjÚ_­Öü5ØÇ ðƒ(j¥X{« €e%»–~©¡ËýÍ 4ÄD AÂdð žæ£E-W)Õ|·¹WíY…;‡·¿`Í2ô£ôµÃ„†®åÞ°ÖבˆRÙ„]¡!õ¯$JÞ"nW&T½F õîüüèØ“Žn¼nèùÌ0M];L§¨Ú2Íñº|\ŸëH963'žf,3S÷ƒþV…vÝ&£X ¡2²{ìó§ð0äKFF­Ö'õaÂÒe@D-)ôkÙ’ožúVÛiDOðžš/V‹±â~"|wdtì”9Û·oÿðž={ ïÈä:^š¾êeý놩â?òQþá²þŸ’x¿¨ylA×µN]Ó#MÊš$–º àÑJƒ$Ñ_ßüÝGW­u˜¶ë¶}ì‚„ƒŠ§O¢bå.·ÃÉ¢;kËñÿï™fÀDT Âhs+Œ-ˆPªûÔ¼O´Ù²‰«ÎX‚Û+¿×Ô­óe=…h–][‰Ü!¼ ŒÛÜG,T3V ТxD-åš-6òÝ,ˆ‚‘ѽ?nóU¯]L©h«ÚeCײO§ó)¥PŽcÕÓŽ»ˆ™ËµFÐ)ˆøò).{bFG®b•ò•âì\©VêL9"Ê^è{C„Y¯ÑºUDÑ!?7FFÇ>rÊu$Ê‹&­¢!P÷ƒC“EK×:çe­È¨êùH©¾||tt¡¬ˆÈð·#£{nõÆ;v|ú¾ûîûîìììcžç½Ì¯V¶¦Òi3ýüa+ý‚WÀ;ð³bíÁ½ì=ò€åø™˜¨a׳¾ýê¿ú§Æj.Â10ÜG õ^#$Û/3­a¡ê/«‘ïÎk‡.Ð¥ibA“b ÷¡©kEf~Zõœôƒ°@DmÕ_-Õü²hÞóí/~kìTµLm¡„¡c®ÞQ93§çJµJgÊ‚ºNg%1«q¯u8¦!œ<ßö¦\–­B3…*üáÓ‚¦Fy+bÅn;mœˆÈ(U}S¦œ²&Eú|ZËÅL‚bÍrb™ç„ Öf«^Ð/ÍùÐþàÆk‡h×íc- ™«®ºjÀïïÙ³çÕžç½Îó¼W¥R)=‘L†ÖÀ¦Œµáðu¯«ÖÚGQ¡R÷:õO«ëQz ¨5‚®3o|ûéÏŒÓR#Œ«­1Pñü…æ}ôÿÚûò(9¯êÎß}ßW{WUïÝêÖjY¶q0à–À“9 K ç0ÌÂ"2'! ™É„Ì$ÈINÈar’œ „cÖ¨Bƒ J1Û «d«m,kWw×^ß¾½w窖[BKWoê–êw$µºº¿õ¾w÷Þwß½ŸéòBíi:åt»Ž–NÆb·šL¼0ê*òADhZîüÃß_•´€ß Δ›;½0:³Â·ž­´ìÁPÊÓ—’?ça³e{'Ë «1×°o BélD"$BÅñüE׉U೦ëo!âz­ßýÌWK^'ú’u¹~CÈ6mÏWÌÞFzŸ‘b£e{qÑöè–™`3u3Õ©êóŽÏ:Ýáe^âA¿[¯×ÿjnnrY÷]ÇFà™û2/¼É-·ïPJ>¶Òïb¾6é“„rQêÃ(C+¥yg")·.îWÛ|à@ñØçº¼Ò|aî®Ö5˜‚Ä-E† Au¥”⦄ãT¡Xzäj¿7],}ÀNÍÖ'"©*+LZÝp¶Y^0Û´½“s ³UnÚ·™Žßï‡ÑŒ|&¹! ZÓñ¢Å×!k˜ZÇãùèC»‹±N뢮 •5]¿Ž+Ô!]Ÿãœƒ–íÚXFš¶èTÂHø~¡XúÈrïkÏž=õûï¿ÿ/=Ïû“r¹ü¡r¹\k6›L€kÔ«†e´Žî¾ï¾Y2dM<,kºI IDAT Ž&}Š ô°"ð‚H[ìÚ‡é^L%晴ï›÷Ý×.Ì-„•ˆëÝö–톼N«ê¯‚HÎQWá®–íÚ¢-œë)…bé/¼ˆôggj¥¸¹’÷ODp¼`<£ò—¯T"v„‰Q D-×[A$ÏJÅÏ8-ˆZD„Ëû–®€Ç^±½`Ñ^¡U–· ˜ðG‹<ì`8¾IDÜåýÁóÃ1×ôÓÅÖSèxa=ŒÔ²ÚoI©ŒŠa爈Aøí•¼Á—½ìeßdæ·7›Íw—Ëå/”ËåX¥RÉišööÕx!:LõÛsû÷N!”r’3ú®ónùÊ+?‹«ÎÅF¾]…HãõK'jJñºŽ¨MŽÌf’ñÚÍ./»+æMÄMÛ›÷V>´˜c ÅÒÛ÷$Æ|öB-Ú59Ôì¾ìÛ¼†Ê¥“+â金<Ó°ÜþŽg‘çŽ[Ýù'Ò„¨ A¶® "¢¬ Ð5QÕ„¸ø€€çÿ\ÏìÎ+lYQÇ@ùâôáÒbËHþ}ðBÍÈïìz ˆ4ÃõÓº&Zq]èÖý&Ãaf¡­Šû>¿Nh¹~~©û ;÷*皦¥|¶p¸ôÍ•¾×ûï¿?ð=úxµZý1y{öìùaß#à…Q¤æ„ k’a(åªÌ¸)Še¡bØ~(Y¹ºÐFbšðâ1Í‚\,ÊNóYé‡Ñ¢B‚HŽ?ÄÝ•`èuž™¥Þ«åú¹¸®5cº6„›DPn°ÈÊòχÇê®n‚‚B±th±Ç—þÓþ½S_gðϘ©7wMµ˜±ª ™dlXz ¸Ž2m4lÏñÃh+]¦dü£+æq%¹½UáyŒ/…4 `Û Ç]zMQ3ìj»§ï\´LŠ¥ïß;õrÉü¦™ºYÞ<œó©Ëõ4úZ¶W̦]!(µ˜ùÅ O*%¤b#i+f=A×E ¼²¨Tl¶¯Ѳvx¬µloŒˆ,"þÕ·/{ÙË~\µXŠ“á“DôBÛ²ÙTâzÖe~¶nÊl*q*“Š3#¹!¨nºžc{Áä|vZ 9fŒ "²uM›é"¡ 1×µY]ZgÃ4]ËúB;Ìr>’Ò—J%ÃH +æJ$•IÕ§”]¬7Dò$3ï$¢ê#ǺM¼x1ƒ‘ŒÅÜ%¿+¢tËöœ¡\ºkå°‘I®‚1ÞM|¯e{~'yàÓÝ^¯P,ýüþ½S?J½àÄL½uû¦![1gVãÙûR‰ÄÒç à‡ÑÙ¦íõ˜¤eœ§kÒ$¨n¼ÂºáØlàã…Ã¥ïw©ßJˆîµ<ÿžºéÎçÓÃÌÝí!TÌæãÍä2I%„H,z¿Ç—Rr(•R¡TAFºÊà´ßu5›JÄ1= ±Bc h9^‹ÁË “3uC#" Œ¿:P<~a±î9ììø¿u^CDLöíW¦OÞ蹿PÀǼÅóÃøõÈp>`yÁD\×L]×6Á²½°i¹þ0€Á+… èùÉš‰¤ÜÉ‹û¯ocf€È‰ibF×´„®‰¡˜.ÊQ¤†¤â@*Õˆ¤Ò¤R£Ì¼D uëæïpÑ÷¼ÔF¾<&ˆ^;×´ÄX_H„%…ÉÚÜ?ŸË$ǰ7_ ®Ên"GD¤–KÝ„H¯@ˆ÷ìß;u.ŒääɹzmÇØ`L1¯x‰BÈ^†Üê ÛõýPnY«t—‘梉P…åÖÅ‚Üÿ«{yuÞôÀÔ¯ ¢¯”[ÖP*¡73ÉD×u`½0^0Ó´„ä "]’p¨XH©D‘çQÈÌ£-Ô;PЇ›–gõ¥â^2®‡ºË-Ý&/ha4±Ìð(LǯºA8!ˆN³áýùbÝ}Èø‰Kšø?c4X0ÀÔ“àEQu1¯Iªäû,}…͈ÈuüðÜ\Ã"Ëõ7Kóh©MnéHª^n¶\?Õ0Ým¦ë÷9~0è‡ÑN©Ôviº”—zß0\Ïl[v]n©h[ƒÿÀ©†éL6m·Že$øA8æQý& ‘ ºK”RÕü ÚÀ.KßX²G默^ ©4+Ý&o,Ò˜é/7-M)®uç ÊÓ妕 B¹i#ì(7l¯¢ÚYΊ¥#K9Çô‘Ò·Aø3A»P3a$%Ì[r¼pSÓvµ¦éچ㖸–8-Ûs›¶wýhÀè|ÂÑÆdŸåúyÃñ-?”€`©†EÉ–å™å!HÅÞlÚ¯?ú{ÓÇ~ »˜co€˜ÀÉ|Œž„óR{Ù®2T‘8®-æe¥ã± ÑÆè°M„Ð ¢™rÃô:$˜ÁFó?”[`ºx¬ëý5ÓÅÒIo‚šs sÈö‚&É¥½KÒ[ŽŸ”Šoº$*¥¸¥”éæ˜†åFéôr®ýO_;êêv‘퓳uã9Zb&Ùªa÷I©ÖªÕ-w¶e»Û°[w]Å+Ä\Ë7·¬5¦ÂáÒ{üs¤Tv¶n: øKÐ=m‹x4”*ëúÁã#J©AA¤-ªK ‚HŽ7m7püÐVŠnù¬½NèÑòt©ša×#)ó¾Q(–îò÷2pî[¯Hï8ôó©Û =âDp@xɺ!ÃO|­äp$ó€¹ëZ²JÍ®÷‰Aø¡o¢“å¦ÕFr|#ÉÐñ‚sa¤ÆX…béËÖ!¬¿•€›ž?Þ0-yÌÓ|Ti ¯sDÎp¼”å^I§ÝeQ Ç3U[·/ a$›5Óh¿þ¯K2íÛë¯ó Ä!ˆ5¬ƒv8—Çá?Š®kõGR­›}gÔ^\?'•:á‡Ñœå¡áøg+M{¶e»›™yÃf@^ÚÈ·ûËñ}>ÆŒ¾ó5ƒ#©ì¥ž+Õ&× ÂÆG'ݼ«°y(e-å€úô‘Ò+q…béöå†u—éøO­Îœ!j˜ÞN7ŸZ(?ª5ÃkÙÞ¬PÒÆÚéÂlÓäëäîŽmñ›‚È,7­¼í­å†—éù&Ý lÙžã‘Í€w­ýœ(ÇZ~¸üB)DffD@ŠŠÇ¿¿„Ó”4Âø‹9µ=EçÔK9^Z£˜¿½þȶ\÷ÅER ÞÈAqQ)GòälÝ fëÆæªáìlÙÞ˜ã1/·(æ eÕ^e‚;–ëoɱO/÷|…bé­Š~ Ì5,ƒ™ý%N ˜®Ÿö‚Ð "é*Å€p£#^Ð%6L—;!Ò\É{9p¸t  Ww¼ø»\?<¹:c 0ÿ.ÃñO‘ò‚ð¹rÃÊGRnÈ Sa$O{A´¥3Îß»Rç-)}ÀŸQâB͈GR7X'@)nÙž°½ ð‚È ¥ô¤â€q{ëD²iºAšV@Y;^X3]@MïØÿò=]Ÿ3Rô7 .0BÀö˜Àó‰Wö}j½‘á“à‡²µ_w@ãFÞ¼†O5,w%W"Qe=  @:€g>yäñéÝ%û‰è©–ímª›NKL¨!¢¾–íåë–kš®ï{Aä‘t±çA(«Ýæ&¢°e_¬Eú±•¾ŸBñØ£ üát¹¹-ˆäì*ޱå†U5ÿ¶¥f¯Ì5ÌùjN¹òò(ý€ÏERåf–»”õÃUˆfôÙ®ŸkYžk8~hº~h{¾ëúaä‘FÊm9ÓJäH0¼™†™î1øãOKÍÂמè:´ùä«Ò&ÚKïð>͑صÆ~)Áá;D€†Þõ{snÐ:œë‡?2ÿnºÉ°“UÖt¼°j:Þ`ËñsgüìJ]ã”æöïú/BÐ#å–=éÍ\:‘ëv/Õüýõ‚^‚ˆfFûû²ÀÆRªnvµ•!ˆ¢j(Õ&A4W(–¾·÷4],}dÿÞ©ÍDøÓçfꃻ&‡*š#«q-näyÃÀ9Ãõ7 "p ßµ×Ð$ÿ†ÔèÃñv¥â±òP.=ÈÌúÖFB©€HÁgˆ‘« ¡KÅC+‘ÍÞ°œšF“‚è…béË9ßû2Oø½õ6†.ñ §”~žN‘º^ˆ%ŠTlí…Ø^ð´áÞ6p*×·_ë`]f>“jê‚¶ð¥i¹3~Ø^ ßhäG@Ëöæéø9ËñB_ÊÑËšiž&à‹ xdº‹ú–+ý{§2ã5}ÉøÌÄp®_,£fa.('ã±53’‚HÎ6-75˜MSL¹¥ŒCËõ/8~8ÑÅ5ÏŸ˜©M ¢3…biÛÊé€)]]Ã1ÅÜ·¾Ç= ˆf¤ŒÕ²‘ª†=[3œq_)K¿¸vs†_“K'ç&†rýØ`™·]Œõòs3µ<If¾gúÈñ“¸Iq…x7=IÄ¿lûÁX2~ípx$U¶Ú²³1MœéK%´D\›\O¯a:Í ’†‘ "y²i{C–ëÕÝ º@Ûéˆö¦÷ƒ†À#…C%ó†)-Æ[@8bzþ‹«†37šÏh–T,’ìt–›WÝy'@Yn È·l¯<З҄ L—c ^Q×DÝtbCæÃk)§B±´{ÿÞ©§#©î8q¡VÛ99¤)Å©u7öÙ†í›5Óvl/¼Md'búl"¦kq]IÆcd\óbš6``9D)YUÃÉüÁNš·èž–ãÝ–JÄ*CÙô b¾©:ºÁëÔMx÷ÍL„Wö ˜z ³éÄɉÁÜŽ.= r6•éDl@1'WH VµåzRÉuÝ!CA±:Ýrüœå ÓñǾ¼ôÑ7z”€ƒŠÇ~¼žîÿÞ©xT1oÚ4˜«ô¥ò̼”5a{0›uM¬z;"©T³Ú²ÓDg ]ŸÉ÷%© +]17*M+»ØÍöDä=}®â1s¿‚Øþ‰â§×RNoü÷{„0TÀP*›Ù>>0ªÔW¢]%åéªag›–7BòjF»öv›…ÍdL«%âz"®kùT<6›ŒÇXÓh Œ<3_sA¸i¹æšÖ€ïŠ¥¯éœÙ7õïÀø€hÛ耓JÄÚ:ê:÷¼Aˆ†ã_8WmM¢3êw¥2ð>üèÑþh]á+¦&!pN×´³·O mYâúI&Œ¾T,Á¼ô’m2ª†-;I$ël°hÚ~h¶—2\OER]úð&œ>\*®÷Á°ïÔ€v%•-#ýn&_Rû*]ˆò@6•_ÍîD@Óò.øat1¼ÉÌȤ•¾d<¿XÏÖõÃ3¦ëo]ìuý :wr®¾™ˆ~R(–î¸rú•½/ÎJh32ÙTâôäp~Û¯Ó.T ³5Ó‰ÕL'’R-0þ¾ÐC…â±OÀƒ¯œºK)ÜIÀ½h§ÖßàE—ë …D©i¢’ŒëFBדq]L&ô¹dLWº&&#IõôÙJS1xe§ÊÒZÏ™wø£¸®57 æ4"dt!\M‘”#Î žŽ7•0³{b¦I¥²^_(–>…›t³RŒls—†aF˜NÆjÙTB]wÖnV[6:w×KøGáO…>Ø |àG5-:ø_ý× W¿sÿÞ©wøMsÛh¿ŠëZž»—;2ÉØ\6•æUjÌÌN¹iK"d/ûÜÏ¥“V:ë¿Þµ‰€šáV")G;YÎ׌²éú£þg¡Xú?7LNìÞâS ˆálú'#ý™]k¥h… ÏtüfÓr]Ãõw,0+>Ð Åc‹Ú¹ÿ÷õ³À ‹»ñ.vx!€Û®4®:„"ã1íBL××w¸P(–&o„~á5?§ ;Îç™ù—1ÝÑ5‘Ö„pbºæë‚ÒBèšð4A1!„ˆiÂBr`^ðpë…'‰ˆ+Mk¦jØDôÿ ÅÒÏâÀÕÈð‡Ì|÷“#'HÐÎP\HÄõs¹t2DÛ¯šÃß`"$"ð"BŸ|  GÖ[ès„ø ÞŽÇÊ›GòA”Y‚ÌlÚIèÚðjLrËõO;~¸í*×¶²é Ó®Dô¼âÌ5¬Ÿ"Ôk§óÔÙJ ÐD¡xlæÆÊi÷Ïü=fÆø`îGý™äÝ«9¢H>W5œdÃrû@È-˜Ÿヅ#+›iø¦½÷Mˆ0øn;ÜÙ!Ê˳«_\(–¾{£äðæ½SÛð.f¾<€AÃ`ĉº&\]1]Ð5aèšMPŸ® G‚IPF"Ò5¢8€4_¦?בT3µ8€€—Š¥Ò­L†ÓÞ˜Ï$ÏL æ&Wja˜ˆéâ'ÙT"é“W2+nTL›ÀXs"ììÓi:~P5ì`Ðt='ˆäæËBŸs‚ù`áÈñGoÆAñà/ÞÛÇa쫊ùß ô¥fDzƒXBB ªæÒ)±ÌŽÚW€_nZ®QðˆZƒ})躖8b†§˜ÁÌ:3ÌðB)Ëó¥î/Ïžškl!¢ïŠ¥{×…á²o÷ÏùëÌŒ­£ýO§ñ;WR9Q¥j:ZÃtZa$w,0Ÿð¡þLýCï?øÜš;5oÞ7µ‹™'T¤ŸþÚw‚.‡_¼Gç ñ"0`S‡´G;µ‘G:FÁíq«iÂÓ…šFi]ALÓ\Mˆ˜¦‰X;ÔJB¥cšfk1õ¡­fØUg«Í†éc|¤P,ýn\… w¿àï@B×fwŒê ¬X Јf²é¸HÆãýÌœ©Tµf8)¬a‹%!( #ùtÓöÆ,ǯ:Ax'á§*ù}Dè¤}þ㇎Vo…ñ¦½Swðeż}| [̦³ÜeÃYŒÇfóéÄV¨" pƒðlËñ¯ÛdVb6“Š(f–JYJ™U’i©Ø”JÚ–ü¢ ¥sU£bµk3þv¡Xzhyò¯ð03cûØà™d\ߺ¬9AÚ^0W3œÈôüí ŒAÀCJð{?qèøz¸¾l^ý3:ñQÁb‚ÁÃ’Ü`tQ30Ô!ÊAÓÈ×5Ašñ˜&L]R¢¯r‘&(¥ Áº®yš @xAõ‰%†]Ý œ==×&‚!»>Y,Uni2€ýLíá ƒ˜;Ƙ®­FßV_*a%bZP5œ Zåý:‚ žmÙ^Òtƒú­ú\ÒD~`ê—A˜fpbËpÞêK%˜¹«-Ìä3©V*¡\ÏŠ¥+ý‡9PŒ€ÁÜÉnM6-·._71«“ŒaÈ]~•n ‡Èzê\™djxºødm]ÉjïÔox?3G;'†k1Mt5W‰R©“Õ–iXn’qIôýíâ±#èaå"0¿p_–#›÷ |e` ̃Üþ¾ím2Hb]¾®‰¤&„ŒiÂÒ4!4!Rº&l]AMW×…DéK“x®vuNÎÖà ’yÿ½P,ýí­$ZÄ${ ÀË36 æžèKݱ1lÆêlL»$ëÓñâ†ãÑU²>&ÐÊǾ՛¦ <Ä}S¿OŒ¿Ò9[GúýD\èVüXƒ¹ 낲—2+f¸Ì,Ccæ3û̈LíïH¥ÅP¬T’´J"ºbõ¤Uƒã‡gÏ”[ˆè‰B±ôÒui¼ìÛýç`~Àîí#®&躃T¯›Žj˜Žã…rë‚yñ4€¿»s྇þøÓäÞLXsYŽ1óµ½Èù°ë€±Ž79Ú‰Ö ƒ‘šaLJ"¡iÂÑ5ê‚’š¦I]¾&(®‘ˆÇtakBh ôAóº·n9çfêæfAôCNâÞé/–ä­ôÎiq q÷;‰ù3€¾DüÂÖÑþÜz®~!EAjÙÞ°éúWÊút$àKz,:ø±/×êM¿kDbà×S1½¶y$ׄÈv{Ž˜®ÍfS‰!Åì333CgpL)6¥â¨½–Çy©Ø’Š}f ÎÒ%k•KóêV :SnT?ð«…béãëXVð+»6(ÂO¯½ AÊñ‚ó5ÓeÃö¶ˆç0ðAbñžGž8Õù뿺÷¥©r„Û^äX‡ ÇÑ^“ówHÀq]_ׄ® ÒtM3t Hdbºfi±F¤Ÿ­¶ ÷Ø×);wKº˜d? à[ ˆš;'†"Ñ^,^B¸`Ø~Ìp}ó*¡Ï@øáÅÒÓ½iÕ…‚ý·/I")aæ}¹trnÓ`.O„®Š*0³Šéš§»ªÍ† úžïKzcˆn‘0ž:W‰ŠXäþéÈæz–׃{§¾ÊÀ+5AÍ]“Ã`F? NW ;Ù°œ„RíÏ:8ðC…âñƒ½Ñ¾qñàÞ=ƒ 5OŽ£—%c àçI”ÛÔš&|]£€ˆà2K„ÏŠ¥ÿp+¾¿®TÏ÷íN æãîbæhËHÿé¾d|玡خÿÌ™JëŽN£ÕyœðYì…>WÂã¸o@_VŠïíï«ç3¹¥$ÔlÄë–ëŸ>W5¶áë…béåÄ›ÿ.€{cºÖíÏø•–ãyA¸ý²=ï‰ ¼÷£‡J~o„ß¼xÓ/Ý£‘—#`ŒÁ¢°»À|'@£D8ÊÀþébéô­øžh‰ícÞÂÌèKŸØ4”ݪßvN ËýÑlݼ»ã~À§òàâwz¡Ï•W°¯ðifd'†rF&9 ˜ÅM=Aˆpj®Qõ‚p„×oœJû÷N°}Â>JÀ{K?êèzX&Àþ¦^ ÂÃ×´ÚŽMƒkØè—ˆPnZÏÔ û"o,.}²'ÒUW°¿ à!"r·Žä½Tbi%Û6 h>}¶œ&"t=sà+G½ #«_˜J"ÂdøÒbéz#¸‡V˜ àÁîÛÂDO ‡¶· 41}ÕË" "u¾Ö:Órü퀉_5}øø¡ž8׌ßàíq]4·Œ ®‰üÍú¬†ãŸ¹P7¶Ò¶ꡇÖË q8rül¡XÚà+2'gë“uËyf5»? ¢àL¥9kÌ!°»G„k àó~(ûg¦ÏÌÎMi)¡a:™Îh~¨'øzè‘á5ѱ˜·º´ï8]®Ï ¢ï-ˆœ“³õ–í"†º}ú©›·žPøV)bÐÛˆè_MÇ­¶M„›. C)n¸A˜rÒ}´'ùzè‘ábñoÜG€ïúÑØSç*J*^±R>DÔzv¦æ{a4À&Ðæéâ“'z"¼1˜n©þ-!¨R7œÁ†å™†ÅËûëx€ ÿ "A0ÏQ À§¿øCÙ“z=ôÈp±„ø$Ú¥¯¾ËÌýÏœ¯ Y®ÿì DM›?9_å0’ªÐäx,®•{â»Áb±ô8€ß'"*7Ì´åMZG/':ñ<ÑEDÔP”jùA¸~èÙ^Ð2¿Õ°\§f8¨›Î@/DÚC·VMsÍ'Y03ò™äéÉ¡ü˜bNv{fn<{¡&sÀ©Â;>uø_ÞèÖæœêšÖÚ:š—qMäÕ´—‘.=?šmføJ)HűH©3{ÌIÅBJ•TÌB*¶³’RéR©¬T ÅìK¥H*N°â‰â1´ïÓÅc=ϰ‡zd¸d%ùj_]õÛ6 Ú½¾)¹öìl5Þ©–ðýB±ôžÈÖ~ö/¥BN3óÒÉxeóp>%ˆ–T®èÒa¹ ”©à(ÅR*%¤ä´b¥˜áJŬXé‘ä 3;R)_2“R*)§¤T¡b–R±¦”Šuv‚0ÚÔþjdPûófûgüÏ…âñ§zR._55‰ï˜d†»cl ’XD‹™ ’s'gë9´L>V(–^Ñ×:ö÷Ý7 ¦Góý}©ê¦lãÒ’mW$ºö·>3<¥˜¥’1©8¥˜]f¥bHÉIÅ*¦˜)YJV1)UF1C)ö¥bH¥âJu:j‚y’`P›äZ ‹Ägt~Öh ê·Ô ¦Ì©Ö'>Þó{è¡G†«â%> àµÌŒá|æ'£ù¾ÛÕUÚù¡ó%Uõ/|öL¥q{§ªÌß—~«'¦ DˆL½„i4œËD̬d›Ø4©8¥”Ò”â@*VŠU\*.¤aÇs›':·Ctµ?«Ï“[‡ìZíߥ& n%)l|䫽µäzèaa[Yî¾ÄGd‰Ðºm|ÈÓ51F Çê|­uW;#‘ßU(ÿÓžˆ6¢‡8õ‡þìb½ZB4O^b3 j. ºÚó€ æ&„hŤÖüØ¿zo¶‡z¸iȼÿNÁ™ì1/Qбe$ÿl(•šk˜wt2ø~çÀáÒßõij¡ ñm6£½v7Orí¯-Hnz³päÛ½°e=ôpk’áERÜ;õnþhak^7],=ÜM=ôÐC·¶=ˆÝ¯øƒ|o+KGzb顇z衇z衇zXCüßÀöLõ«Z€IEND®B`‚plee-the-bear-20251226/bear-engine/doc/examples/15-physics/sprites.spritedesc000066400000000000000000000006651512343254000266230ustar00rootroot00000000000000sprite_sheet "sprites" 512 x 512 margin 1 sprites_img "sprites.xcf" "ship" autosize * 0.5 with sprites_img "ship" ; "asteroid 1" autosize * 0.5 with sprites_img "asteroid 1" ; "asteroid 2" autosize * 0.5 with sprites_img "asteroid 2" ; "asteroid 3" autosize * 0.5 with sprites_img "asteroid 3" ; "asteroid 4" autosize * 0.5 with sprites_img "asteroid 4" ; "laser" autosize * 0.5 with sprites_img "laser" ; plee-the-bear-20251226/bear-engine/doc/examples/15-physics/sprites.spritepos000066400000000000000000000002041512343254000264730ustar00rootroot00000000000000asteroid 3: 0 0 120 97 asteroid 4: 121 0 98 95 asteroid 1: 220 0 101 83 asteroid 2: 322 0 89 81 ship: 412 0 38 56 laser: 412 57 7 8 plee-the-bear-20251226/bear-engine/doc/examples/15-physics/sprites.xcf000066400000000000000000003402541512343254000252370ustar00rootroot00000000000000gimp xcf fileùBB+G gimp-commentCreated with GIMPgimp-image-grid(style solid) (fgcolor (color-rgba 0.000000 0.000000 0.000000 1.000000)) (bgcolor (color-rgba 1.000000 1.000000 1.000000 1.000000)) (xspacing 10.000000) (yspacing 10.000000) (spacing-unit inches) (xoffset 0.000000) (yoffset 0.000000) (offset-unit inches) ÂTl€ÝS48…laserÿ     `y(xŒœý@877þ86þ@þ366þ7 6ü46 6ý366þHssýq:66þ66ý;ûÿÿþÞ66ú:766hÿÿ÷=665766cÿÿö:6657668éÿÿþÇ66ý0366þ8QQýN766 6þ56 6þ+66þ563ý5@ý¿¹ººý¼»þ¹»»ýº¿þ³»»þº »ü¹» »üº¹»»þÁÐÐùϽ»»º»»ý½þÿÿþô»»ú¹¼»»Íÿÿ÷½»»¼¼»»Êÿÿö½»»¼¼»»¼÷ÿÿþí»»þ¿»»þ¼ÄÄþû» »üº» »û¹ª»»þ¼þ¼»»ýº€»ý¹¿ýÿöôôþóþ÷õõþÿþÿõõþôþôõõüóõ õýòõõþöøøõýôõõÿþþõõþóõõþ÷ÿÿûöõõøõõþ÷ÿÿõýøöõõþþÿÿþýõõýï÷õõöõüôõ õüôõ õû÷ÿõõþòõõýöÿþî÷÷ýöÿý7FFýE)ý!Öÿÿý«ý Õÿÿþ‘þuÿÿúý,Üÿÿü˜(ÿÿþο¿ôÀßÿÿãZÿÿßúÿÿößýÿÿfÿÿÀÿÿ÷Ûÿÿ"fÿÿÁÿÿößÿÿ"TÿÿèèÿÿþÒÿÿýÿÿþìÇÇ÷ÈðÿÿÙÑÿÿûiÿÿùú!Çÿÿþýµÿÿüø‰þýÄ¿ asteroid 4ÿ     1'Ä¿#lhltÄ¿_/;(ç(÷8©;†KL?Y¦`qlXým[\\þeƒƒþe\\þZþ[\\ý`€ƒƒý‚a\\\ý]tƒƒý‚a\\þUþ[\\þjƒ ƒý_\\þ]"\ýbƒ ƒý€^\\þm$þ]\\ý^xƒƒý~]\\þU&þ^\\þoƒƒý|]\\*þ@\\ýf‚ƒƒýx]\\-\ú^ƒƒt\\þ].þZ\\ü]wr\\þ]0ýU]\\þ[3þ]\\þZ5þ]\\þ[7þY\\þ^#ü^]\7ýU]\\4ûm^\]\\0ûf^\[\ \-üZ\[\ \ü^hx(] \û]hv€ƒƒ%ý[]\ \û]et€ƒƒ!ýZ]\ \üdp}ƒ ƒûb]\]\ \übp}ƒ ƒ \û_lz‚ƒƒþ[\\û_lyƒƒ\û]iwƒƒ\û]hu~ƒƒþ[\\ý]ƒƒ\þgƒ ƒ\þxƒ ƒþU\\þ‚ƒ ƒþ^\\þbƒ!ƒþ]\\þtƒ!ƒ\þ€ƒ!ƒ\þ`ƒ"ƒ\þoƒ"ƒ\þ}ƒ"ƒþ[\\þ^ƒ#ƒ\þhƒ#ƒ\þ{ƒ#ƒþb\\ý]‚ƒ#ƒþ[\\þeƒ$ƒ\þvƒ$ƒý@]\\þƒ$ƒþ]\\þaƒ ƒú„†Š‘–þ]\\þrƒƒû„ˆŽ•™™\þ~ƒƒû„‹‘˜™™þ[\\þ_ƒƒþ—™ ™þ[\\þlƒƒþ…™ ™þ[\\þ}ƒƒþ™ ™þ`\\ý]‚ƒƒþ—™ ™þ]\\þgƒƒþ…™ ™\þxƒƒþ™ ™þf\\ƒþ—™ ™\þdƒƒþ…™ ™\þuƒƒþ™ ™þ€\\þƒƒþ—™ ™þ^\\þaƒƒþ…™™þ]\\þqƒƒþŽ™™\þ~ƒƒþ˜™™þ^\\þ^ƒƒþ…™™ýIEDDþJ``ýaKDDþEDDýF]``ý_HDDþGþGDDþU``ý_FDDþGþIDDýN_` `ý^GDDýEF"þEDDýG_` `ý^EDDýEI$þEDDýEZ``þ[DDýEU&þBDDþQ``þ[DD*þ@DDýJ_``þXDDþE,þCDDû\``UDDþE.þEDDýWTDDþE0þ@D DþE3DþB5þFDDþC7ýCEDDþC#üCED7ýDEDD4þIDD0þ3D D-ýFED DüENX(þFD DûENV]``%þ@D DûJU]_``!ýKED DûIS]a``ý;FD DûGS]a` ` DûFPY_``þCDDûFOZ_``þEDDúENW__``DúENU]_``þIDDþ_``þEDDþK` `þEDDþW` `þUDDþ_` `DþG`!`DþU`!`Dþ^`!`þGDDþF`"`þCDDþQ`"`Dþ]`"`þ@DDýE_`"`DþN`#`þEDDþZ`#`þ;DD%`þCDDþK`$`DþV`$`þ@DDþ_`$`þEDDþH`!`ûaejoþCDDþS``ûadhmppDþ]``üfjoppþCDDþF``þnp pDþP``þbp pDþ\``þfp pþ@DDþE``þnp pþCDDþL`` pDþY``þfp pþMDDþ_``þmp pþEDDþI``þap pþEDDþU``þgp pþ€DDþ^``ý_op pþCDDþF``þappDþS``þhppDþ\``þoppþCDDþE``þbppý$544þ:IIþ944þ5þ544ý5GIIþ744þ3þ644þAIIþ644ý59þ744þ;I Iþ644þ."þ544ý7HI IýG544þ$$þ544ý5EIIýF544þU&þ944þ>IIþD44þ3)ý@544þ9IIþD44þ3,þ344ú5FIIA44þ3.þ544ýA@44þ50þ+4 4þ53þ5446ý2544þ57ù743456#ü63473ý43444þ$5540ý354 4-ý234 4ü5:B(þ655 4ü:BHII%ü7554 4ü:AHII!ý-34 4ü8?GI Iþ;55 4ü7?GI I 4û5IIþJU U4þFIIþNU Uþ544IþTU U4þ;IIþJU U4þCIIþMU Uþ344þHIIþTU U4þ9IIþJU U4þAIIþOU Uþ544þGIIþTU Uþ644þ6IIUþ544þ?IIþPUUþ344þEIIþTUUþ644þ5IIþJUU}üU™7øU™Õýÿÿ3úDˆÌüÿÿ0úD€»õÿÿ,ú3w»óÿ ÿüøÍÀ(û!fªéÿ ÿøúÍÀÍõÿÿ$ûfªæÿ ÿúþÖÀÍôÿÿ!ûU™Ýÿ ÿûÜÂÆëÿÿú MˆÌüÿ ÿûåÂÆèÿ ÿü@´óÿ ÿûõÏÈäÿÿýŸÿÿúùÖÌßýÿÿþYÿÿúüØÇÚûÿÿþ¹ÿÿúþßÈÐöÿÿùùÿÿþßÿÿþYÿÿþÓÿ ÿþ§ÿÿþ¿ÿ ÿýðÿÿþÛÿ ÿþDÿÿþßÿ!ÿþ’ÿÿþÀÿ!ÿýáÿÿþÏÿ!ÿþ/ÿÿýíüÿ!ÿþ}ÿÿþÄÿ"ÿþËÿÿþÆÿ"ÿùþÿÿøôÿ"ÿþiÿÿþËÿ#ÿþ¶ÿÿþÁÿ#ÿù øÿÿþçÿ#ÿþTÿÿþ×ÿ$ÿþ¡ÿÿþ¾ÿ$ÿýíÿÿþ×ÿ$ÿþ?ÿÿþãÿ ÿúîÊÀÊéþŒÿÿþÁÿÿú÷ÒÁÄâÿÿþÜÿÿþÊÿÿûÑÀÏóÿÿþ*ÿÿýðúÿÿýþåÿ ÿþxÿÿþÆÿÿþÓÿ ÿþÆÿÿþÄÿÿþÀÿ ÿùýÿÿûïÿÿýýèÿ ÿþcÿÿþÏÿÿþÑÿ ÿþ±ÿÿþ¿ÿÿþÀÿ ÿý öÿÿþâÿÿýüéÿ ÿþNÿÿþÛÿÿþÏÿ ÿþœÿÿþ¿ÿÿþÁÿ ÿýéÿÿþÔÿÿýûíÿ ÿþ9ÿÿýèýÿÿþÍÿÿþ‡ÿÿþÂÿÿþÂÿÿþÕÿÿþÊÿÿýùïÿÿþ&ÿÿýôöÿÿþËÿÿ>þ\9þZ\\6þZ\\2ý^]\ \.ýU[\ \þ_)ýU]\ \ú_m|ƒƒ%ûm^\]\ \û_m|‚ƒƒ"ûf^\[\ \û^hx‚ƒƒüZ\[\ \û]hv€ƒ ƒ] \û]et€ƒƒü^][\ \üdp}ƒƒýZ]\ \übp}ƒƒûU^\]\ \ü_m|ƒƒ ûU^\]\ \û_m|‚ƒƒû€Z\[\ \û^hx‚ƒ"ƒþZ\ \û]hv€ƒ&ƒü^]\ \û]et€ƒ*ƒ \üdp}ƒ.ƒ\übp}ƒ2ƒ\ü_m|ƒ6ƒú\_m|‚ƒ9ƒþ‚ƒvƒý…‡ƒ7ƒû„ˆŽ•™™þ“ƒ1ƒú„†Œ“˜™™þ”ƒ,ƒû…Š‘–™ ™þ”ƒ'ƒü‡Ž”™™þ–ƒ!ƒû†Œ“˜™™ý—‚ƒƒû„‰‘–™™þ—ƒƒý‘˜™"™ƒþ‹™$™ƒþ—™$™ƒþˆ™%™ƒû†‹“”ƒ ƒþ–™%™ú„†Œ“˜™™ý—„ƒ ƒþ†™1™ý—„ƒƒþ’™2™ý˜…ƒƒ5™ý—…ƒƒþ™6™þ…ƒƒþ˜™6™ý˜…ƒƒþ‹™9™þ…ƒƒþ—™9™û˜†ƒˆ™<™ý‡–™j™>þG9ýECDD6ýFEDD2 D.ý@BD DþG)ýDED DúGP[_`%þID DûFP[_``"ü3DED DúENX__``ýFED DûENV]` `þFD DûJU]_``þBD DûIS]a``ýKED DûGS]a``þ9D DûGP[_`` þUD DûFP[_``ü€FED DúENX__`!`ýFED DûENV]`&`þDDûJU]_`)` DûIS]a`-`DûGS]a`1`DûGP[_`5`úDFP[_`9`_w`þd`7`ûadhmppþk`2`ücglppþl`,`ûaejop pþl`'`üdhmppþm` `úabgloppýn_``ûadjoppþo``ýjop"p`þep$p`þop$p`þcp%p`úbfkla` `þnp%púacgloppýma` `þap1pýnb``þlp2pýoa``þap4pýoa``þgp5pýoa``ýaop7pþa``þep9pþb``þop9pûob`dpþ69ú743445ü255442ü35544.ü+434 4þ6)3ý434 4ú6=DHI%þ$55 4û5=DHII"3 4û5:BGIIý234 4ü:BHI Iü6554 4ü:AHIIý954 4ü8?GIIý-34 4ü7?GIIþ955 4û6=DHII þ+55 4û5=DHIIý234 4û5:BGI"Iü2554 4ü:BHI&Iû3554 4ü:AHI*I 4ü8?GI.I4ü7?GI2I4û6=DHI5Iú45=DHI9IþGIvIýJLI7IûJMOSUUþQI1IûHJNQUUþRI,IûKMQSU UþSI'IüLORUUýRJIIûJKNQUUþTIIûJMQSUUþTIIþQU#UIþMU$UIþTU$UIþKU%UIúKMQQHI IþRU%UûIJNQUUþTI I2UýTJIIþRU2UýTJII5UýTJIIþNU6UþJIIþJU8UþKIIþMU9UþKIIþTU:UüKIKU;UüTKRUjU=ý/9ú%g©êÿ5û3oªêÿÿ2ûfªæÿÿ.ú I‹Íýÿ ÿþî)úU™Õýÿ ÿúîÆÂâÿ%úDˆÌûÿ ÿúñÆÂÜýÿÿ"ú44ý5$UýTJIIþ<44UþJIIþ944UþKIIþ644þ3UþLIIþ644UþLIIýG544þ2UþMIIýH544ü3UUþNIIþE44þ6ùq³åè®$8ÿýð87ÿýñ/6ÿýå5ûÈÁÜÁÿÿýÑ4ÿýþÃÿÿýÉ 3ÿýúËÿÿý´2ÿýõÓÿÿý¢1ÿýíÞÿÿþ‚1ÿýâéÿÿþn0ÿýÚðÿÿýýU/ÿýÏøÿÿýùD. ÿýÆýÿÿýñ0- ÿþÁÿÿýå , ÿþÀÿÿýÛ+ ÿýþÃÿÿýÉ * ÿýúËÿÿý´) ÿýõÒÿÿý£(ÿýíÝÿÿþ„(ÿåÿþo'ÿýÛïÿÿýýU&ÿýÐ÷ÿÿýùE%ÿýÈüÿÿýñ0$ÿþÁÿÿýå #ÿþ¿ÿÿýÛ"ÿýþÂÿÿýÊ !ÿýüÏÿÿý® ÿýöØÿÿþ— ÿýîáÿÿþ~ÿýçëÿÿþeÿý×óÿÿýüOÿýÐ÷ÿÿýùEÿýÉûÿÿýñ1ÿþÂÿÿýæ ÿþ»ÿÿýÛÿþÁÿÿýÊ ÿýüÇÿÿýµÿýöÑÿÿý¤ ÿýñÙÿÿþ‡!ÿýçäÿÿþqþÔÿ ÿýÜîÿÿýþ]ýíÔÿ ÿýÌôÿÿýùFüÿõËÿ ÿýÊûÿÿýò1ÿýùÇÿ ÿþÂÿÿýê%ÿýüÃÿ ÿþ¿ÿÿýÜÿýýÂÿÿýþ»ÿÿýË ÿþÀÿÿýýÇÿÿý¼ÿýÁþÿÿýùÍÿÿý¥ ÿýÄûÿÿýòØÿÿþˆ ÿýÃüÿÿýãâÿÿþq ÿýÊöÿÿýàëÿÿýþ^ ÿýÐòÿÿýÔôÿÿýúF ÿýÖíÿÿýÊûÿÿýò2 ÿýÝçÿÿýÄþÿÿýê% ÿýãáÿÿþ¿ÿÿýÜÿýãàÿÿþ»ÿÿýË ÿýîÔÿÿýýÆÿÿý½ÿýñÑÿÿýùÍÿÿý¦ÿýõËÿÿýò×ÿÿþŠÿýùÆÿÿýèâÿÿþrÿýüÂÿÿýáêÿÿýþ^ÿýþÀÿÿýÖôÿÿýúGÿþÀÿÿýÎùÿÿûò2ÿÿýÁþÿÿýÅþÿÿýê&þ[\\þkƒƒþ™™\þ{ƒƒþ—™™ þY\\þ]ƒƒþ…™™ \þgƒƒþ™™ \þxƒƒþ˜™™ þU\\þ‚ƒƒþ†™™ þ[\\þcƒƒþŽ™™ þ[\\þrƒƒþ˜™™ \þ€ƒƒþ†™™ þ^\\þ_ƒƒþ™™ \þnƒƒ™ \þ~ƒƒþ…™™ þ]\\þ]ƒƒþ™™ þ[\\þiƒƒþ‚™™ þ[\\þ{ƒƒþ†™™ þ`\\þ]ƒƒþ™™ þ]\\þfƒƒþ„™™ \þwƒƒþ‡™™þU\\þƒƒþ’™™þ[\\þbƒƒ™þ[\\þtƒƒþ‡™™\þ€ƒƒþ’™™þ^\\þ_ƒƒ™\þmƒƒþ‡™™\þ|ƒƒþ“™™þ[\\ý]‚ƒƒ™þ]\\þhƒƒþˆ™™\þyƒƒþ’™™þb\\þ‚ƒƒ™\þdƒƒþ‰™™\þuƒƒþ“™™ý@]\\þƒƒ™þZ\\þ`ƒƒþ‰™™þ]\\þqƒƒþ“™™\þ€ƒƒþ„™™þ]\\þ^ƒƒþ‹™™\þlƒƒþ•™™\þ|ƒƒþ„™™þ`\\þ]ƒƒþ‹™™þ[\\þfƒƒþ•™™þ[\\þxƒƒþ„™™þf\\ƒþ‹™™þ]\\þdƒƒþ•™™\þuƒƒþ–™™ý€\\þƒƒþ„™™ý^\\þ`ƒƒþŒ™™ý[\\þoƒƒþ“™™þ\\þ~ƒƒþ˜™™þZ\\þ^ƒƒþ‡™™\þkƒƒþ™™\þ{ƒƒþ—™™\þ‚ƒƒþ„™™þ]\\þsƒƒþ™™þ[\\þ|ƒƒþ”™™þU\\ý]ƒƒþ„™™þ\\þaƒƒþ‰™™\þfƒƒþ™™\þqƒƒý„—™™\þzƒƒþ†™™þU\\ý]ƒƒþ™™þ]\\ý`‚ƒƒþ–™™\þeƒƒþ„™™\þoƒƒþŠ™™\þyƒƒý˜™™þEDDþO``þippDþZ``þopp þ@DDþ_``þbpp DþK``þipp þEDDþX``þopp þUDDþ_``þbpp þEDDþI``þipp þCDDþU``þopp Dþ^``þbpp DþG``þipp þEDDþQ``þopp þCDDþ\``þbpp þFDDýE_``þjpp DþN``ý_opp DþZ``þcpp þ@DD`þjpp þCDDþK``p DþW``þbppþUDDþ_``þjppþEDDþG``þappþEDDþT``þcppDþ]``þkppþCDDþE``pþCDDþO``þdppDþ[``þkppþ@DDþE``pþEDDþN``þdppþEDDþZ``þmppþ;DDþ_``þappDþJ``þdppDþW``þlppþ@DDþ_``þappþFDDþH``þdppþCDDþR``þlppDþ]``pDþF``þdppþEDDþO``þmppþEDDþZ``þappþ@DDþE``þeppDþM``þmppDþX``þappþMDDþ^``þeppþFDDþI``þmppþCDDþV``þoppý€DDþ_``pýCDDþG``þeppýEDDþR``ý_lppþDDþ]``þoppþEDDþE``þdppþCDDþP``þjppDþZ``þnppD `þappDþU``þhppDþ[``þlppDýE_``ýaoppýADDþF``þdppþEDDþK``þjppDþS``þoppDþY``þbppþ@DDýE]``þhppþFDDþG``þmppþCDDþJ``þappþEDDþQ``þdppþEDDþX``ü_hoppþ344þ=IIþNUU4þEIIU þ344þHIIþKUU 4þ:IIþOUU 4þBIIU þ+44þHIIþKUU þ344þ8IIþPUU 4þ@IIU 4þHIIþKUU 4þ6IIþOUU þ544þ>IIU þ344þFIIþKUU þ644IþPUU þ344þ;IIþHUU 4þEIIþJUU þ044þJIIþQUU 4þ8IIþTUU 4þAIIþKUUþ+44IþRUUþ544þ6IIþTUUþ544þ@IIþKUU4þHIIþPUUþ244þ6IIUþ344þ>IIþLUU4þFIIþQUUþ744IUþ344þ:IIþKUU4þDIIþRUUþ;44IþHUU4þ8IIþMUU4þCIIþRUUþ@44þHIIUþ544þ6IIþMUUþ544þ@IIþSUU4þGIIþJUUþ244IþLUUþ344þIIýJTUUþ544þDIIþJUUþ+44þGIIþOUUþ644þ6IIþRUU4þ9IIþTUUþ344þ=IIþLUU4þDIIýNTUUþsÿÿþÈÿÿþÃÿÿþÀÿÿþÃÿÿýøðÿÿ ùüÿÿüìÿÿþÉÿÿ þ^ÿÿþÒÿÿþÄÿÿ þ«ÿÿþÀÿÿýöóÿÿ ýñÿÿþÞÿÿþÈÿÿ þFÿÿþáÿÿþÅÿÿ þ”ÿÿþÀÿÿöÿ ýåÿÿþÑÿÿþÆÿÿ þ1ÿÿýîüÿÿþÇÿÿ þ‚ÿÿþÂÿÿôÿ þÐÿÿþÇÿÿþÅÿÿ þ!ÿÿý÷ôÿÿþÈÿÿ þmÿÿþÊÿÿýóöÿÿ þ»ÿÿþÁÿÿþÄÿÿ ùúÿÿþèÿÿþÊÿÿ þXÿÿþÕÿÿýîúÿÿ þ¦ÿÿþ¿ÿÿþÃÿÿýðÿÿþÙÿÿþËÿÿþCÿÿþâÿÿýíúÿÿþ‘ÿÿþÀÿÿþÂÿÿþàÿÿþÍÿÿþÍÿÿþ.ÿÿýïúÿÿýêüÿÿþ}ÿÿþÄÿÿþÂÿÿþÊÿÿþÅÿÿþÏÿÿùþÿÿùïÿÿýêüÿÿþhÿÿþÍÿÿþÁÿÿþ¶ÿÿþÀÿÿþÑÿÿý øÿÿþäÿÿýåþÿÿþSÿÿþÙÿÿþÀÿÿþ¡ÿÿþ¿ÿÿþÓÿÿýíÿÿþÕÿÿýãþÿÿþ>ÿÿýæþÿÿþÀÿÿþŒÿÿþÀÿÿþÔÿÿþÜÿÿþÊÿÿþàÿÿþ)ÿÿýóøÿÿþ¿ÿÿþwÿÿþÇÿÿþØÿÿþÅÿÿþÃÿÿþÝÿÿùýÿÿûíÿÿþ¿ÿÿþbÿÿþÑÿÿþÛÿÿþ°ÿÿþÀÿÿþÛÿÿý öÿÿþàÿÿþ¿ÿÿþMÿÿþÝÿÿþÞÿÿþ›ÿÿþ¾ÿÿýùæÿÿüéÿÿþÒÿÿýÑüÿÿý9ÿÿýêýÿÿþ¿ÿÿý†ÿÿþÃÿÿýûÔÿÿýÕÿÿþÈÿÿýáóÿÿþ%ÿÿõÿþÂÿÿþrÿÿþÊÿÿþÆÿÿþ¼ÿÿþÃÿÿýíèÿÿþïÿÿþåÿÿýÇþÿÿþâÿÿþ½ÿÿþÀÿÿþxÿÿþÂÿÿýøÙÿÿýÝÿÿýõÓÿÿýÛöÿÿü'ðÿÿèÿþÀÿÿýNýÿÿýÓøÿÿýþËÿÿþÿÿþÂÿÿýèíÿÿýªÿÿþÂÿÿþÈÿÿý ÓÿÿýúÐÿÿþÂÿÿý!ìÿÿýêåÿÿýôßÿÿýEüÿÿý×õÿÿýÖúÿÿþwÿÿþÄÿÿþ¿ÿÿý§ÿÿþÄÿÿüûÁïÿÿ¶™û…–™:™ƒü„ˆ“™6™þƒƒý†™3™þ„ƒƒ3™þŽƒ ƒ3™ ƒ2™þƒ ƒ1™þ˜ƒ ƒ1™þ‹ƒ ƒ0™þ˜ƒ ƒ0™þŠƒ ƒ/™þ–ƒ ƒ/™þ‰ƒ ƒ/™ƒ/™þ”ƒ ƒ0™þ“ƒ ƒ1™þ•ƒ ƒ2™ý•„ƒ ƒ3™ý–„ƒƒ4™ý˜„ƒƒþ’™4™ý˜†ƒƒý‡˜™6™ý˜…ƒƒþ’™9™û˜…‡—™Ù¶pûjbgmp:p`ýdlp6pþi``ýcjp3p `3pþh` `3p `2pþf` `2p `1pþf` `0pýoa` `0pþe` `/pýo_` `/pþd` `/pþa` `/pýla` `0pýla` `1pþm` `2pþm` `3pýob``4pýoa``ýakp5pþb``ýdop7pþb``þjp9pûoadopÃp¶UûQJOTU:UIüHMQU6UþOIIýJPU3UþJII3UþOI I3U I2UþMI I1UþTI I1UþMI I0UþTI I0UþMI I/UþTI I/UþMI I/UþJI I/UþRI I0UþQI I1UþSI I2UþTI I3UýTJII4UýTJIIýHPU4UýTJIIýLTU7UþJIIþRU:UýJLUÄU¶ÿûÊËÁçÿ9ÿýüÜÿÿûâÁÒýÿ5ÿþÄÿÿüìÄÆÿ2ÿýûÞÿ<ÿþÂÿ<ÿýøåÿ<ÿþÀÿ<ÿýôìÿ<ÿþÀÿ<ÿýòíÿ<ÿþÀÿ<ÿýìôÿ<ÿþÀÿ<ÿýûëÿ=ÿýÖíÿ=ÿýÕíÿ=ÿýÞåÿ=ÿýåßÿ=ÿýêÙÿÿþýÿ3ÿýïÓÿÿýåÍÿ4ÿýôÎÿÿýÂòÿ6ÿùõËÿÿçËÿ9ÿûùÇÂðÿ;ÿþüÿ…ÿ™þƒƒþx\\þY™™þƒƒþt\\þ]™™þ‘ƒƒþo\\™þ“ƒƒþi\\™þ”ƒƒû‚e\\™™ý”„ƒƒýc\™™ý•„ƒƒþ_™™þ–ƒƒþ€™™ý˜„ƒƒþ~™ ™ý˜†ƒƒþp™!™þ–ƒƒþ_™!™þƒƒý~\™!™þ…ƒƒúm\ƒ‡”™™ƒú^\ƒƒ‰™™þ’ƒƒù}\\ƒƒ…™™þ‡ƒƒül\\ƒƒ™þ„ƒƒû‚]\\ƒƒþ“™™þ–ƒƒþ}\\ƒþ™™þ‹ƒƒþk\\ƒþ‡™™þ„ƒƒþ]\\ƒ™þ—ƒƒþ|\\ƒþ˜™™þƒƒþh\\þ[ƒƒþ“™™þ‡ƒƒþ]\\ƒþ‹™™ƒþ{\\þƒƒþ†™™þ’ƒƒþg\\þƒƒþ„™™þ‰ƒƒþ]\\þƒƒý‰˜™™þ„ƒƒþy\\üƒ‚’™™þ–ƒƒþg\\û]‰™™þ‹ƒƒþ]\\üZ™™þ„ƒƒþx\\™þ˜ƒƒþe\\þ[™þƒƒþ\\þ[™þ‡ƒƒþw\\™þ„ƒƒþd\\™þ“ƒƒþ‚\\þY™þ‡ƒƒþu\\™þ‚ƒƒþa\\þ[™þ–ƒƒþ\\þZ™þ‹ƒƒþt\\™þ…ƒƒþ`\\þ[™þ˜ƒƒþ€\\þ[™þƒƒþt\\™þ‡ƒƒþa\\þ]™ƒþ€\\þf™þ’ƒƒþr\\™þ‰ƒƒþ_\\þ]™þ„ƒƒþ€\\þ`™þ–ƒƒþp\\þ[™þ‹ƒƒþ_\\™þ„ƒƒþ~\\þf™þ—ƒƒþn\\þ[™þƒƒþ_\\ ™þ‡ƒƒþ~\\þ@™þ„ƒƒþl\\ ™þ‘ƒƒþ^\\þZ ™þ‰ƒƒþ~\\þ€ ™ƒþk\\ ™þ•ƒƒý‚^\\þ] ™þƒƒþ}\\ ™þ…ƒƒþj\\ ™þ—ƒƒþ]\\þ^ ™þƒƒþz\\ ™þ‡ƒƒþh\\þ] ™ƒþ]\\þY pýh_``þXDDþCppþj``þUDDpþj``þQDDpþk``þNDDpþl``û_KDDppýl_``ýHDppþn``ý_Gppþn``þ^ppþo``þ]p!pþb``þQp!pþn``þFp!pþi``ü]Dop pþa``úPD`clppþ_``úED``dppþk``ù]DD``appþe``üODD``pþa``û_EDD``þlppþn``þ[DD`þgppþf``þPDD`þcpp`ý_EDD`pþo``þ[DD`þoppþh``þMDDþE``þkppþc``DþG``þepp`þZDDþ``þbppþl``þLDDþ``þbppþe``DýA``ýdopp`þYDDùC`alppþl``þKDDúCdoppþf``þ_DDpþb``þXDDpþo``þKDDþEpþh``þ_DDþ@pþb``þWDDp`þKDDpþk``þ_DDþCpþd``þWDDpþa``þIDDpþm``þ_DDþKpþe``þUDDþEpþa``þGDDþCpýo_``þ^DDþIpþj``þTDDpþb``þFDDþCpþa``þ^DDþMpþk``þSDDpþd``ý_FDDpþa``þ]DDþ@pþn``þSDDpþh``þEDDpþb``þ]DDþ3pþo``þQDDþCpþj``þFDDþCpþb``þ]DDþ@p`þPDD pþk``ý_EDDþC pþe``þ\DDþ€ p`þODD pþm``ý_EDDþF pþh``þ[DD pþa``þNDD pþo``þEDD pþj``þ[DD pþc``þMDDþC pþa``ý_EDDþF UþOIIþB44þ7UUþPIIþA44þ5UUþQIIþ>44UþQIIþ;44UþRIIûH944UUþSIIüH84UUýSJIIýH6UUþTIIþHUUþTIIþFU UýTJIIþ>U!UþTIIþ6U!UþNIIýF4U!UþJIIú=4IKQUUþTIIú54IIMUUþPIIùF44IIJUUþMIIü<44IIUI4IþQUUþRIIþF44IþNUUþMIIþ;44IþLUUþJII4IUþTIIþF44IþTUUþOIIþ<44þ3IIþQUUþKIIþH44þ6IIþNUUIþD44ý3IIþKUUþRIIþ:44þIIþJUUþLII4þIIýMTUUþHIIþD44ù3IIQUUþSIIþ:44û5MUUþMII4ü5UUþJIIþB44UþTIIþ944þ3UþOIIþH44þ7UþKIIþA44UIþ844UþQII4þ7UþLIIþC44UIþ844þ5UþRIIþH44þ-UþNIIþA44UþJIIþ844þ3UþTIIþG44þ7UþOIIþ@44UþKIIþ644UIþH44þ3UþQIIþ?44þ3UþMIIþ644þ5UþJIIþG44þ@UþSIIþ?44UþMIIþ644þ3UþJIIþG44þ3UIþ>44þ3UþPIIþ544þ5UþKIIþG44þ@UIþ>44þ3 UþQIIþ644þ3 UþLIIþF44þ3 UIþ=44 UþSIIþ544þ3 UþNIIþE44 UþKIIþ;44þ5 UI4 UþPIIþD44 UþJIIþ:44þ3 UþJIIþH44þ3 ÿýÄûÿÿþÀÿÿýÝÿÿýÆúÿÿþÀÿÿþÌÿÿýÊöÿÿýþÄÿÿýÐòÿÿýúÌÿÿýÖìÿÿýó×ÿÿýÝæÿÿýìåÿÿýãàÿÿýâîÿÿýêáÿÿþÑÿÿýïÔÿÿþËÿ ÿýôÎÿÿþÂÿ!ÿþäÿÿýùòÿ!ÿþÃÿÿüÈÿôÿ ÿþÇÿÿúÅÿïÄÙÿÿýúñÿÿöÿþÁÿÿþÍÿÿþÆÿÿþÕÿÿþÀÿÿþÇÿÿýùøÿÿþâÿÿýñ÷ÿÿþÕÿÿþÜÿÿþÄÿÿþÁÿÿþÀÿÿþÊÿÿþÃÿÿþÑÿÿýîúÿÿþÜÿÿýíüÿÿþÂÿÿþÛÿÿýýòÿÿþÄÿÿþÍÿÿþ†ÿÿþÏÿÿþÆÿÿýêüÿÿþ/ÿÿþÀÿÿýûïÿÿþÃÿÿýÕÿÿþÆÿÿþÎÿÿþÐÿÿý€ÿÿþÐÿÿþÀÿÿýêýÿÿø'ÿÿüÀ÷ÿÿþâÿÿþÀÿÿùÐÿßÓÿÿþÝÿÿþÓÿÿúyÀöÿÿþÀÿÿ÷ãþÿÿþ"ÿÿþÐÿÿþÀÿÿþÊÿýíüÿÿþ×ÿÿþsÿþÄÿÿþßÿÿýýÿþÅÿÿþ¿ÿÿþÃÿýûîÿÿþÛÿÿþlÿþÏÿÿþÛÿÿýüÿþÀÿÿþ¿ÿÿþ¼ÿþßÿÿþáÿÿþeÿþßÿÿþ×ÿÿýùÿþÀÿÿþÀÿÿþ¶ÿþÏÿÿýþåÿÿþ_ÿýïûÿÿþÓÿÿý÷ÿþÅÿÿþÀÿÿþ¯ÿþÅÿÿýüèÿÿþXÿýüíÿÿþÒÿÿýô ÿþÐÿÿþÁÿÿþ©ÿþÀÿÿýûìÿÿþRÿþÝÿÿþÍÿÿýðÿþßÿÿþÂÿÿþ¢ÿþÀÿÿýùïÿÿþKÿþÎÿÿþÊÿÿýìÿýðúÿÿþÂÿÿþŸÿþÅÿÿýøñÿÿþHÿþÄÿÿþÆÿÿýëÿýûîÿÿþÆÿÿþ• ÿþÑÿÿóÿþA ÿþÀÿÿþÅÿÿýä ÿþÜÿÿþÈÿÿþŽ ÿþàÿÿýñøÿÿþ7 ÿþÀÿÿþÄÿÿýÞ ÿþÍÿÿþÊÿÿþˆ ÿýðúÿÿýíúÿÿþ1 ÿþÆÿÿþÂÿÿþÖ ÿþÄÿÿþÎÿÿþ ÿýýëÿÿýìüÿÿþ( þbó\m\\€\\]\\þ^\\þ]\ \þ[\\þf\\í\\]\\€\\\^\þ]þ[²þ;óCIDD€DDCDDþCD DþCDDþBDDþ3DDíDDFDD€DDDDDþCþC²þ;ó5$4444544þ644þ344þ344í4424444434þ5þ5²þ ó½ÿ¦ÿÿŒÿÿþ9ÿÿþ³ÿÿþÞÿÿþÒÿÿþ£ÿÿáIÿÿìÿÿ™ÿÿBÿåÿ“ÿ<àŒþ5²ýU]\\ý]ƒƒü„˜™ ™þZ\\ý_‚ƒ!ƒü†˜™™ þ^\\þdƒ#ƒü„†‘™™ \þmƒ%ƒþ’™™ \þxƒ$ƒþ˜™™ ý`]\\þ~ƒ"ƒþ…™™ \ý^ƒ!ƒþ‰™™ þ^\\þcƒ!ƒþ‘™™\þkƒ ƒþ˜™™\þwƒƒþ„™™þf\\ý]}ƒƒþ‡™™þY\\ý_ƒƒþ‡™™þ^\\þaƒƒþŽ™™þ]\\þhƒƒþ–™™\þtƒƒþ…™™þ@\\þ|ƒƒþ‹™™þU\\ý]ƒƒþ”™™\þ`ƒƒ™þ]\\þgƒƒþ‡™™\þrƒƒþ’™™þ€\\þzƒƒü—™™þZ\\ý]€ƒƒü…™™þY\\þaƒƒý™þZ\\þgƒƒþ•\þpƒƒþ†\þzƒƒýb[\\ý^ƒƒþZ\\þ`ƒƒþ[\\þfƒƒþ]\\þnƒƒ þ]\\þxƒƒ ýU]\\þ~ƒƒ!þZ\\þ_ƒƒ"þ[\\þcƒƒ#þ]\\þkƒƒ$þ]\\þwƒƒ$ý`]\\þ~ƒƒ%\ý^‚ƒƒ&\þbƒƒ'\þjƒƒ(\þuƒƒ(þf\\ý]}ƒƒ)þY\\ý^ƒ ƒ*\þaƒ ƒ+þ]\\þhƒ ƒ,þ]\\þrƒ ƒ,ý@]\\þ{ƒ ƒ-þ`\\ý^ƒ ƒ.\þaƒ ƒ/þ]\\þhƒƒ0\þpƒƒ0ý@]\\þ|ƒƒ1þZ\\ý]€ƒƒ2þY\\þ`ƒƒ3\þeƒƒ4\þoƒƒ4þ€\\þyƒƒ5ýb[\\ú]€ƒ‚€5þ_\\]\7þ]\\8\9\;Uþ9DDþ]``üagop pþBDDýG_`!`üajopp DþJ`$`ýcjpp þEDDþP`%`þjpp þEDDþW`$`þopp ý@EDDþ\`"`þapp þGDDýF_`!`þdpp þCDDýJ_` `þippþCDDþO` `þoppþEDDþU``þappþ3DDþ]``þdppýCEDDýF_``þcppDýH_``þippþEDDýN_``ý_nppþCDDþU``pý@CDDþ[``þeppþGDDýE^``þlppþGDDýGa``þoppDþK``þdppDþS``þlppþ€DDþ[``üoppþKDDýE^``übppþFDDýHa``ýipDþK``ý_mDþS``þbþEDDþZ``ý;EDDýE_``þEDDþF``þEDDþJ``þCDDþP`` DþX`` þ9DDþ]``!þBDDýE^``"þEDDþI``#DþO``$DþW``$ý@EDDþ]``%þGDDýF_``&þBDDþH``'DþN``(DþU``(ý3CDDþ[``)ýCEDDýE_` `*þBDDýI_` `+þEDDýM_` `,DþU` `,þ@DDþZ` `-þ@DDýE^` `.þGDDþF` `/þEDDþL``0DþS``0þ@DDþ[``1þKDDýE^``2þFDDýG_``3þCDDþK``4þEDDþQ``4ý€CDDþY``5ý;EDDúE^`_]5þADD7D8þCDD9þCDD;ýU@ý9544þFIIüJOTU Uþ144þ6I"IýJPU U þ344þ8I#IüHJQUU þ544þIIþK4þCIIþ;44ý5HIIþ744þ5IIþ344þ9IIþ544þ>II 4þDII ý9544ý5FII!þ144þ6II"þ544þ9II#4þ=II$4þAII$þ@44ý5GII%þ344I&þ544ý7HII'þ344þII54þDII5þ;44ûGIHH5þ544547þ2448þ34494;+ý ÌÿÿýüËÿÿûýÒÂòÿ ÿýêÿÿýîáÿ ÿû÷ÊÆùÿÿ ý<ùÿÿýÙôÿ"ÿûðÄÊûÿÿ þoÿÿþËÿ%ÿþËÿÿ þœÿÿþ¿ÿ#ÿýüòÿÿ ýÉÿÿýýÊÿ"ÿþÕÿÿ ýåÿÿýóÜÿ!ÿþÀÿÿ ý9øÿÿýßôÿ ÿþÉÿÿþgÿÿýÉýÿÿýüñÿÿþ˜ÿÿþ¿ÿÿþÖÿÿýÀÿÿýþÆÿÿþÀÿÿýãÿÿýôßÿÿþÄÿÿý1öÿÿýãíÿÿþÅÿÿþ]ÿÿýÍûÿÿýñäÿÿþÿÿþÀÿÿýÑüÿÿý½ÿÿþÅÿÿþÀÿÿýÝÿÿý÷ÖÿÿýøÙÿÿý/ôÿÿýåëÿÿýÜöÿÿýRþÿÿýÒùÿÿþÀÿÿþˆÿÿþÁÿÿýýÎÿÿý´ÿÿþÂÿÿûçîÿÿýÚÿÿýúÑÿÿüÅÿÿý(ðÿÿýêëÿÿýÇÿýOýÿÿýÓøÿÿýñåþ€ÿÿþÈÿÿþÌý«ÿÿþÁÿÿý ÔÿÿýúÔÿÿý%ïÿÿýíâÿÿýFüÿÿýØõÿÿþyÿÿþÅÿÿý¨ÿÿþÀÿÿ ý ÌÿÿýýËÿÿ!ýêÿÿýïàÿÿ"ýCûÿÿýÝòÿÿ#þqÿÿýÈþÿÿ$þÿÿþ¿ÿÿ$ýÉÿÿýýÉÿÿ%ýåÿÿýóÛÿÿ&ý:ùÿÿýßðÿÿ'þiÿÿýÌüÿÿ(þ™ÿÿþ¿ÿÿ(ýÁÿÿýþÆÿÿ)ýãÿÿýö×ÿ ÿ*ý2öÿÿýäìÿ ÿ+þ]ÿÿýÎûÿ ÿ,þ’ÿÿþÀÿ ÿ,ý¾ÿÿþÃÿ ÿ-ýäÿÿýôÙÿ ÿ.ý/õÿÿè ÿ/þ`ÿÿýÌùÿÿ0þŠÿÿþÁÿÿ0ý¾ÿÿþ¿ÿÿ1ýÛÿÿýúÐÿÿ2ý(ñÿÿýêæÿÿ3ýPþÿÿý×öÿÿ4þ‚ÿÿþÄÿÿ4ý²ÿÿþÀÿÿ5ý ÔÿÿúûÎôÜÍ5ý+òÿÿùÿ7ýGüÿÿ8þ}ÿÿ9ùgÞüÿôÖ:ý ð™þ—™<™ü˜ƒ”™;™û‹ƒƒ—™:™ƒþ„™9™þ‘ƒƒþ‰™8™þ„ƒƒþŒ™6™þ”ƒƒþ™5™þ‡ƒƒþ–™3™þ—ƒƒý„—™2™þŠƒƒþ†™2™ ƒþ‰™0™þƒ ƒþ™/™þ„ƒ ƒþ“™-™þ‘ƒƒþ–™,™þ†ƒƒý„˜™*™þ–ƒƒþ‡™*™þ‡ƒƒþŒ™(™þ—ƒƒü…„‹™%™þ‹ƒƒþ”™#™þ˜ƒƒþ˜™™÷˜”‘‰†„„ƒƒþ‰™™ø•’Ї…„ƒ$ƒþ’™™ø–”‹ˆ†„ƒ.ƒ÷•”’‰†…„ƒ2ƒþ‚ƒ4ƒõ„‚~ysnia^\ƒ*ƒ‚ø€|vpke_\ \"ƒ‚ø}xtoha^\\ƒ÷€|xrme`^\\ƒ÷‚~|vphd_\\]\ú]^_Zƒƒ÷}xtmga^\\ù[\]^ZUø|xpke`]\\[ù\]]ZXf \ü^[@\[\û]ZXm$\þ`-\ü]\€vðpþnp:754I*IHùDB?;:64 4"IöHGGEA>:7544IHøEBA=:6544IöHGGDB?:86445ü34455ý-IIHøGEA=:754453ý59øEB?;:6544ü34455ü2134ø345467@45û321$$ 4ù35522@-4ý63wðÿþëÿ<ÿüñèÙÿ;ÿûÀÿäëÿ9ÿùüäÿÿÒøÿ8ÿþÈÿÿþÁÿ8ÿþÑÿÿþÁÿ6ÿþÔÿÿýüËÿ5ÿþÅÿÿýïßÿ3ÿýåúÿÿýÝðÿ2ÿþ¿ÿÿýÌüÿ0ÿýôïÿ ÿþÀÿ0ÿþÁÿ ÿþÃÿ.ÿýýßÿ ÿý÷Ôÿ-ÿþÊÿ ÿýéæÿ,ÿþÎÿÿý×õÿ*ÿýÜþÿÿþÃÿ*ÿþÃÿÿû¿ÿÿþÿ%ÿýíöÿÿûüÑâÀÿ%ÿþ¿ÿÿýöÝÿ#ÿýñèÿÿýÜ÷ÿÿöñÖÊÂÀÆÒâùÿÿþÀÿÿöûâÍÂÀÂÍâ÷ÿ"ÿýýÎÿÿöþéÖÆÀÁÆÖïÿ,ÿõçåÜÍÂÀÄÍâ÷ÿ1ÿþïÿ3ÿõüßÎÁµ¶ºÅÕéÿ+ÿöóÜÍÂÀÂÊÖïÿ+ÿõþéÖÆÁÀÄÍâ÷ÿ+ÿõúâÍÄÀÁÆÖéøÿÿþúÿÿöðÖÊÂÀÂÍÜïÿÿõî̳™€fD+ÿÿõüâÒÆÁÀÆÒâ÷ÿÿõüÝĪ‘wU<" øÄÀÂÊÖéùÿÿõòÕ»¢ˆfM3ÿõöÛÁ¤ŠoS9ÿõûÝ»¢ˆoU3$ÿõúãŬt[=$-÷¼¡…lN4v™þ“ƒƒþz\\™þŠƒƒþf\\þ[ ™þ‚ƒƒý‚]\\þ_ ™þ•ƒƒþy\\þ]™þŒƒƒþg\\™þ†ƒƒ\þX™þ˜ƒƒþw\\™þƒƒþe\\þ]™þˆƒƒþ\\þ`™ƒþu\\™þ’ƒƒþd\\þ]™þ‹ƒƒþ‚\\þY™þ„ƒƒþu\\þ[™þ•ƒƒþa\\™þƒƒþ\\þ`™þ…ƒƒþt\\ ™þ˜ƒƒþb\\þ[ ™þƒƒþ\\þU ™þˆƒƒþt\\ ™ƒþ_\\þ[ ™þ“ƒƒþ€\\þ` ™þŠƒƒþq\\™ú˜•„ƒƒþ`\\þ]÷™”’‰†„„ƒƒþ€\\ý]U#ƒþp\\#ƒþ_\\þ]"ƒþ~\\þ@"ƒþo\\þ["ƒþ^\\!ƒþ~\\þ€!ƒþm\\þ[!ƒþ]\\ ƒþ|\\þ[ ƒþk\\ ƒþ]\\þZƒþ{\\ƒþi\\þ[ƒþ]\\þ]ƒþz\\þ[ƒþg\\ƒ\þ_ƒþz\\ƒþg\\ƒý‚]\\þ^ƒþx\\ƒþe\\þ[ƒþ‚\\ƒþw\\ƒ‚ø}xtoha^\\þ[ ƒ÷}ytmf`^\ \þZ÷‚~|vphd_\\\ý[]\ø[\\]]ZZ# \÷]\[\\^ZU,ö\[[\\]ZXm6pþk``þZDDpþe``þMDDpþ_``DþB pþm``þYDDpþg``þLDDpþc``þ^DDþFpþo``þXDDþEpþj``þJDDþCpþc``Dþ@p`þXDDpþl``þIDDþEpþe``þ_DDþ@pþb``þUDDpþn``þHDDpþg``þ^DDþ@pþb``þUDD pþo``þGDD pþi``þ^DDþ@ pþc``þTDDþE pþa``þGDDþC pþl``þ^DDþ@ pþd``þSDDpûomjg``þGDDþFøomkgdba``þ]DDþU#`þSDD#`þFDD"`þ]DDþ@"`þQDD"`þFDD!`þ[DDþ€!`þQDDþE!`þEDDþB `þ[DDþC `þODD`þ_DDþF`þZDD`þNDD`ýaEDDþF`þYDDþE`þLDDþC`DþB`þYDD`þKDDþE`þ_DD`þXDD`þKDD`þ_DDþG`ý_WDD`÷_]ZUQNHEDDþC `ø][XUPKHD DþK÷_\[VSNIEDDþCD DFþK# DEDþ9,DEüFEI6UþQIIþC44UþMIIþ944UIþH44þ3 UþTIIþD44þ5UþNIIþ944UþJII4þ5UIþC44UþPIIþ:44þ3UþLIIþH44þ5UIþC44UþQIIþ744þ3UþMII4þ3UþJIIþA44þ5UþSIIþ744þ5UþNIIþG44þ0UþJIIþ@44UIþ744þ3 UþPIIþH44þ+ UþLIIþ@44 UþJIIþ744 UþSIIþF44þ@ UþLIIþ>44þ3UúTSQNJIIþ644þ5÷URPOMKJHIIþG44þ+#Iþ>44#Iþ644þ2"IþH44ý5@"Iþ=44"Iþ544!IþF44þ3!Iþ<44þ5!I4þ5 IþE44þ3 Iþ<44 Iþ544þ2IþE44þ3Iþ;44þ5I4IþD44Iþ;44þ3IýJ544þ3IþC44Iþ:44þ3I4þ3IþD44þ5Iþ944IþH44þ3IþA44IöHGGEA>:7544þ5 IDúA<:654 4ý3-GùDB?:8644þ24ü5424þ3445ý2-# 45ú34559,45û321$6ÿþÒÿÿþÁÿÿþÒ ÿþ¿ÿÿþÑÿÿþ{ ÿþÛÿÿùåþÿÿþ# ÿþåÿÿþÂÿÿþÌÿþÁÿÿþÔÿÿþuÿþÌÿÿþàÿÿýþÿýóùÿÿþ¿ÿÿþÅÿþÈÿÿþÙÿÿþnÿþÃÿÿþÝÿÿýüÿýüìÿÿþ¿ÿÿþ¿ÿþÓÿÿþÝÿÿþhÿþ¿ÿÿþÜÿÿýúÿþÙÿÿþ¿ÿÿþ¸ÿþãÿÿýþâÿÿþaÿþÁÿÿþÖÿÿýøÿþËÿÿþÀÿÿþ± ÿýóøÿÿýþåÿÿþZ ÿþÈÿÿþÒÿÿýõ  ÿþÃÿÿþÀÿÿþ« ÿýýëÿÿýüéÿÿþT ÿþÔÿÿþÏÿÿýñ ÿþ¿ÿÿþÂÿÿþ¤ÿúñÚÊÁàÿÿýüíÿÿþMöôÜÍÂÀÆÒâùÿÿþÌÿÿýíþùÿ!ÿþÄÿÿþž"ÿýøðÿÿþG"ÿþËÿÿýé"ÿþÄÿÿþ—!ÿýöôÿÿþ@!ÿþÇÿÿýä!ÿþÇÿÿþ‘ ÿýò÷ÿÿþ: ÿþÅÿÿýß ÿþÉÿÿþŠÿýîùÿÿþ3ÿþÃÿÿþÚÿþÌÿÿþƒÿýëûÿÿþ,ÿþÂÿÿþÔÿþÏÿÿþ}ÿýèýÿÿþ#ÿþÁÿÿþÎÿþÒÿÿþwÿùäþÿÿþÿþÀÿÿþÇÿþÖÿÿþpÿþßÿÿýüÿýû¿ÿÿþÄÿõýéÖÆÁÀÄÍâ÷ÿÿþjÿõúàȾ¹¸¿ÆØðÿ ÿýä÷ÖÊÂÀÂÍÜïÿÿýü=ÿüî»GÿöñÕ»™€fM3#ÿõýæÌª‘w^D" ,öÝ»¢ˆoU36üüüüb_1/ð asteroid 3ÿ      &m3ðÂmOÝ;ÝGðÂm›xèú‰’A£ðªU¬ º²È?ÒéÚ<Ü<ÜLܽÝ3úùb^][[\2ýZ^\\,ù€_]\[]\ \'ùU][\\]\\&ýU]\\ù_hrzƒ$þU\ \úbkr{ƒƒ%\ù]emv}‚ƒ ƒ$þ]\\üj|ƒƒ$þ]\\þ_ƒƒ#þ^\\þxƒƒ#þ[\\þaƒƒ"þ]\\þ|ƒƒ"\þgƒƒ!\ý]ƒƒ þf\\þlƒƒ \þ^ƒƒþU\\þtƒƒþ[\\ý`‚ƒƒþ_\\þxƒƒ\þcƒƒþ[\\þ|ƒƒ\þhƒƒ\ý]ƒƒþm\\þmƒƒþ]\\þ]ƒƒþ`\\þtƒƒ\þ_ƒƒþ]\\þzƒƒ\þaƒƒþ]\\þ~ƒƒ\þhƒ ƒ\þƒ ƒý`[\\þoƒ!ƒþ]\\þ]ƒ"ƒþY\\þuƒ"ƒþ[\\þ_ƒ#ƒþ_\\þzƒ#ƒ\þbƒƒû†—†ƒƒþ^\\þ~ƒƒþ„™™ü•‹„ƒƒþ€\\þjƒƒþ˜™™ü–Ž…ƒƒ\ý]ƒƒþ™ ™ü˜†þ]\\þoƒƒþ‹™™þ]\\þ^ƒƒþ†™™\þwƒƒý„˜™™\þbƒƒþ–™™þ[\\þ{ƒƒþ™™\þeƒƒþ‰™™þ[\\þƒƒþ…™™ þU\\þjƒƒý„—™™ þ]\\ý]ƒƒþ”™™ þb\\þqƒƒþŽ™™ þ]\\þ^ƒƒþˆ™™ þX\\þwƒƒý…š™™úù;DDEDD2DþEDD,û€AEED D'ûUFECDD&ýDEDDùFMTZ]`$þUD DùINUZ_a``%þCDDùEJPV]_` `$þFDDüN[_``$DýF_``#DþX``#DþH``"þEDDþ[``"DþM``!þEDDþ^`` þ3DDþO`` DýE_``DþT``þEDDþF``þBDDþX``þEDDþI``þEDDþ\``DþM``Dþ_``þIDDþP``DýE_``þ@DDþT``DþG``þFDDþY``þEDDþI``þFDDþ\``DþL` `þEDDþ^` `ý@CDDþQ`!`þCDDþE`"`þCDDþU`"`þCDDýG_`"`þADDþY`#`DþI``ûcnic``Dþ]``ýaoppülfa``þ€DDþN``þnppüoia``Dþ_``þip püoicþFDDþR``þeppDþE``ýboppþGDDþW``þnppDþG``þmppDþZ``þhppDþJ``þdppþEDDþ^``þapp þUDDþN``þopp þCDDþE``þlpp þ;DDþS``þhpp þCDDþa``ýcopp þFDDþX``ýaoppúù;35544254þ544-ù5334554 4'ûU23544&þ344ù6:@DHI$þU4 4ø58I!I4#Iþ744þAI"I4þ7I#Iþ544þDI#I4þ7IIûKSPKIIþ544þFIIþJUUüTSNII4þIIþLUUþ344ý5JIIþJUUþ344þCIIþSUU4þ7IIþSUUþ344þEIIþOUU4þ8IIþLUUþ344þGIIþJUU þU44þ;IIU 4IþRUU þ;44þ>IIþPUU þ344þ5IIþMUU þ544þCIIUúù þZ6÷U_]\\]\\0úfZ\\]\\+ú]^][[\ \%ú`[[\]\\þ^ùU_]\\]\\øakt|‚‚ƒýfZ\\ù^emv}‚ƒƒú[^][[\\ú^gpx€ƒ ƒ ýZ^\\ùahr|‚ƒƒù€_]\[]\\ù]dmt|‚ƒƒýUZ\\ù^eox}‚ƒƒ\ù_hpx€‚ƒ%ƒ \ø]akt|‚ƒ+ƒ\ø]dmv}‚‚ƒ1ƒú^dnw~ƒtƒù„†Œ’–ƒ/ƒ÷†‰Œ”——˜™™'ƒ÷†‰Œ”——˜™™ƒ÷†‰Œ’—˜˜™™ƒ÷†‰Œ’—˜˜™ ™ƒû†”–˜™)™ƒþŒ™,™ƒþŒ™,™ƒþ™,™ƒþŽ™,™ƒþ™,™ƒþ™,™ƒþŽ™,™ƒþ™,™ƒþ‘™,™ƒþ™,™ƒþ‘™,™ƒþ’™,™ƒþ’™,™ƒþ’™,™ƒþ’™-™ý’ˆƒ ƒþ’™0™ü—„ƒƒþ“™3™ü˜†ƒƒþ“™6™ü˜”‰ƒƒþ“™:™û–Œ„•™<™þ˜™®™>þK6üUAEDD1ýMFD D+ûFDDEDD%þ@DDþFüUAEDDøHPU[_``ýMFDDùEJPV]_``ûIDDEDDøFMSZ]__` ` DþEDDúHNU[_``û€AEEDDúIPU[_``ý9FDDùEJQX]_``DúGNSZ]`&` DúHPU[_`,`DùIPV]__`1`ùEJQW[_`s`ùacegkm`/`ùbegilopp'`ùadgilopp`øadgjloopp`øadgjloop!p`ûclonp)p`þgp,p`þgp,p`þhp,p`þgp,p`þgp,p`þhp,p`þhp,p`þhp,p`þip,p`þip,p`þjp,p`þip,p`þkp,p`þkp,p`þkp,pünkc` `þlp/poýha``þjp3püoic``þlp7pýle``þlp:pûmgalpþ-6÷U53455440ú3245344+þ.554%ú0244344þ5ùU5345544÷57;AEGIIù32455344ù5:=BGHIIû735544ú:?EHHI I 54þ544ú7:ADHIIú5334544ù8=AEGHIIù92455344ù5:>BGHII4ù6:?EHHI%I 4ú7;ADHI,I4ú8=BGGI2Iù59?CFHIsIùHKNPQSI/IùJMOQRTUU'IùJKOQRTUUIøJKOQQTTUUIøJKOQQTTU!UIúKRUSTU(UIþNU,UIþOU,UIþNU,UIþOU,UIþPU,UIþOU,UIþOU,UIþOU,UIþPU,UIþPU,UIþPU,UIþPU,UIþQU,UIþQU,UIþQU-UýQKI IþQU0UüTNJIIþRU3UüTQKIIþRU7UýRMIIþRU9UúTSOHRUíU>þ6÷+U€ªÌðÿ0ø 3^ˆ³Ýúÿÿ+ùDf‘»æÿ ÿ%ø8bгÜüÿÿþôø+U€ªÌðÿÿ÷ýâÊÀÄÖïÿø 3^ˆªÕùÿÿøöÖÆÀÆÜùÿÿø5443þ+IýG;44ü545IýD:44ý52IýB744ü343IüHA6445þ.IüHA64 4þ+!IüG=544þ5$IýE;4 4þ6 &IüJD94 4þ8*IýB744ü348,IüG?644ý3./IüH?544û343I1IüG>5444IüHE;448IýE:44:IúHB844IÿüÝÀßÿ>ÿýÖÁÿÿùËÛìÇÉúÿ=ÿûñÄÍþÿ=ÿüåÀßÿ>ÿüÖÁìÿ=ÿûøÊÆùÿ=ÿüçÀÛÿ>ÿüÝÀâÿ=ÿûýÒÂóÿ=ÿüñÂÔÿ=ÿýëýÿ=ÿþÒÿ=ÿþÀÿ=ÿþàÿ>ÿþÝÿÿû¿ÈÈùÿ0ÿþ¿ÿÿþ¿ÿÿûöÆÊüÿ-ÿþÕÿÿþÀÿÿüçÁØÿ+ÿýþåÿÿýÁþÿÿüÜÀêÿ)ÿþÁÿÿýÆüÿ ÿû÷ÆÊúÿ&ÿþÍÿÿýÅüÿÿûñÄÍþÿ#ÿúúïÿÉúÿÿüåÀßÿ"ÿüÄÊùÿÿüÖÁëÿÿýÖôÿÿûöÅËüÿ=ÿþðÿÿÀý]@,\ý[^*\ü]\Z'\þ`$þ_\\ý]b!ûƒp^\\]þUƒü~m]\\ý[^ƒü‚|h\\ý[Z ƒýxg\ \þ_ ƒüvb\\ü]\]ƒü‚r`\\ü[\Uƒüm^\\ý]f ƒü~m]\\ü]\^ ƒû‚|h]\\þYƒü‚xe\ \þ`ƒü‚va\ \þYƒü€o^\\ü[ƒ!ƒü~m^\\ý]ƒ#ƒû‚|j]\\þ`ƒ&ƒü‚xd\\þ]ƒ)ƒþo\\*ƒþ`\\þ[ƒ(ƒþ\\þZƒ(ƒþu\\þƒ(ƒþg\\þƒ(ƒ\ý]ƒ'ƒþ|\\ü[ƒ'ƒþm\\(ƒþ_\\ü]ƒ&ƒþ€\\ü`ƒ&ƒþt\\þ]'ƒþd\\þ]&ƒþ‚\\þXý–Šƒ#ƒþy\\™ý’‡ƒ ƒþj\\þ[™ü—…ƒƒý‚^\\þ[™ü–Œ„ƒƒþ~\\þU ™ü˜“†ƒƒþp\\ ™ý˜Žƒƒþ`\\ ™þ–ƒƒþ\\þZ ™þŽƒƒþw\\ ™þ†ƒƒþe\\ ™ƒ\þ] ™þ”ƒƒþ|\\þ[ÀýF@,DýED*DþE'DýE@$þGD Dþ;!û`_SFDDýEU`ý\PD D`ý[NDDEþF`ü_ZMD DþB `ü_VIDDýEF`ü_UGD Dþ@`ü\NFDDýF3 `ü\PED D `ý[ND DþF`ýZKD DþH`ü_VHDDýE@`ü]QFDDC"`ü\PFDDýE`$`ü[OEDDþH`'`ýXJDDþE`)`þQDDþE`)`þGDDþC`(`þ_DDþK`(`þXDDþ`(`þKDDýE`(`DýF`'`þZDDüC`'`þPDD'`ý_FDDüE`&`þ^DDü@`&`þTDD'`þIDDþE&`þ_DDþFýme`#`þZDDpüolb` `þNDDþEpýja``ý_EDDþEpüoga``þ]DDþU püolb``þRDD pýoh``þGDDþE pþn``þ_DDþK pþi``þWDD pþb``þLDDþE p`DþF pþl``þZDDþCÀý5@,4ý53*4þ7'43þ5$þ744ý5;!üIH?443þ+IüG=544ü545IüE:544ý52 IýE:44ü343 IüHB8445þ.IüGA64 4þ+IüG=5445þ3 IýG=4 4þ3 IýE:44ý53IýE944ü348IüHB744ý53IýG>4 4ü7I!IüH>544þI#IüHF;44þ8I'IýD744*Iþ=44þ3I)Iþ544þ5I(IþH44þ-I(IþC44ý5I(Iþ944ý3I'IýH544þI'IþE44ü3I'Iþ=44ü3I'Iþ644'IþF44ü@I&IþA44þ3'Iþ744þ3'I4þ5ýSNI#IþD44UýQKI Iþ<44þ3UýQJIIýH544UþOIIþF44þU UýQLIIþ?44þ3 UþOIIþ744 UþSIIþH44þ- UþOIIþA44þ5 UþJIIþ:44þ3 UþVIIýH544 UþRIIþE44þ3ÀýM,ûÿå‘<*ÿü×€%'ÿüÕw$þéÿÿûüÄf !ûüÒÂóÿÿû÷³Uÿû÷ÊÆùÿÿûî¢DÿûïÄÍýÿÿüã‘3ÿüæÁÒÿÿüÕ€# ÿüÜÀàÿÿüÌoÿüÖÁêÿÿûü»^ ÿû÷ÁÀòÿÿûöªM ÿûöÊÆúÿÿûí™< ÿûïÄÍþÿÿüáˆ(ÿüåÁ×ÿÿüÕ€ ÿüÜÀâÿÿûýÄoÿûüÌÄóÿÿúó£*ÿ ÿûüÒÎùÿÿüú]ÿ#ÿû÷ÌÓýÿÿýø ÿ&ÿüåÀÙÿÿþkÿ)ÿþÄÿÿþwÿ(ÿýþæÿÿþWÿ(ÿþ×ÿÿýûÿ(ÿþ¿ÿÿýÂÿ(ÿþÕÿÿýwÿ'ÿýêýÿÿý,ÿ'ÿþÃÿÿüßÿ'ÿþÆÿÿü•ÿ&ÿýûòÿÿüJÿ&ÿþÏÿÿûõÿ&ÿþÀÿÿþ³'ÿþÝÿÿþh&ÿþãÿÿýþüÄÍþÿ"ÿþÀÿÿþÑÿüåÀàÿ ÿþÌÿÿþ†ÿüÖÁíÿÿýóøÿÿþ;ÿûøÊÆùÿÿþÈÿÿýë ÿüçÀÛÿÿþÃÿÿþ¤ ÿýØÂÿÿýþéÿÿþY ÿþÇÿÿþ×ÿÿýû ÿþÂÿÿþ¿ÿÿþ ÿþäÿÿþÔÿÿþw ÿþßÿÿýêýÿÿþ, ÿþÁÿÿþÃÿÿþß \þaƒƒþ–™™ þZ\\þ|ƒƒþ’™™ þ]\\þeƒƒþŒ™™ \þƒƒþ†™™ý@]\\þkƒƒþ…™™þ]\\ý]ƒƒþ—™™þU\\þrƒƒþ’™™þ[\\þ^ƒƒþŒ™™þZ\\þxƒƒý‡˜™™ý’…\þaƒƒý„˜™™û•†ƒƒþ[\\þ}ƒƒþ–™™ý—‡ƒƒ\þgƒƒþ‘™™ý—ˆƒƒ\ý]€ƒƒþŠ™™ý–‰ƒƒþU\\þmƒƒþ†™™ý˜Šƒƒþ]\\ý]‚ƒƒý„˜™™þ—ƒ ƒþU\\þtƒƒþ–™™þ’ƒ ƒ\þ_ƒƒþ™™þƒ ƒ\þyƒƒþ‰™™þˆƒ ƒ\þbƒƒý…š™™þ…ƒ ƒý[\\þ}ƒƒþ‘™™þ˜ƒ ƒþ\\þfƒƒþŒ™™þ—ƒ ƒ\ý]€ƒƒþ‡™™þ“ƒ ƒ\þnƒƒþ„™™þŽƒ ƒ\ƒ™þ‰ƒ ƒ\ƒþ—™™þ…ƒ ƒ\þ~ƒƒþ•™™þŒƒ ƒ\þvƒƒþ™™þ‡ƒ ƒþ]\\þmƒƒþŒ™™þ†ƒ ƒþ_\\þcƒƒþ‡™™ý˜…ƒƒþf\\þ]ƒƒþ„™™þ—ƒƒþ\\þƒƒþ˜™™þ’ƒƒþ\\þ|ƒƒþ—™™þŒƒƒþ\\þtƒƒþ“™™õŽ‘’’”•]\\þjƒƒþ™$™ýX\\þaƒƒþ‹™$™\ƒþ†™$™\þ€ƒƒ%™\þzƒƒþ˜™#™\þqƒƒþ–™#™þ^\\þgƒƒþ“™#™þU\\þ^ƒƒþ™#™þ]\\ƒþŠ™#™\þƒƒþ‡™#™\þwƒƒ$™þ[\\þmƒƒ$™\þcƒƒþ—™"™þm\\þ]ƒƒþ•™"™\þƒƒþ™"™þ]\\þ~ƒƒþŠ™"™þ[\\þuƒƒý„’™!™\þjƒƒý†–™™þ]\\þbƒƒþ‰™™\ý]‚ƒƒý†š™™\þƒƒýˆ˜™™þ]\\þ{ƒƒþŽ™™þ[\\þrƒƒþ’™ ™\þgƒƒþ…™!™þY\\þ_ƒƒþ˜™ ™\þ‚ƒƒþ˜™ ™\þ€ƒƒþ•™ ™þ]\\þxƒƒþ™ ™þ[\\þoƒƒþ™ ™\þeƒƒþˆ™ ™þ`\\þ]ƒƒþ„™ ™ DþI``ýanpp þFDDþ[``þlpp DþK``þgpp Dþ]``þbppþ@DDþO``þappþEDDýE_``þnppDþS``þkppþEDDýF_``þeppþBDDþX``ýcoppüolaþCDDþI``ýaoppûlb``þCDDþ[``þnppýoc``þCDDþK``þjppýoe``þCDDþ^``þgppýne``þUDDþQ``ýboppýne``þCDDýE_``pþn` `þGDDþU``þoppþk` `DýF_``þhppþh` `þGDDþY``þeppþc` `DþG``ýboppþa` `ýEDDþ\``þjppþo` `þDDþM``þgppþo` `þCDDþ_``þcppþl` `DþR``pþh` `Dþ^``pþd` `Dþ^``þoppþb` `þCDDþ]``þlppþg` `þCDDþX``þippþd` `þCDDþQ``þeppþb` `þADDþJ``þcppýoa``þ3DD`þappþn``þDDþ_``þqppþk``þDDþZ``þnppþf``ýEDDþU``þlppõghijillmEDDþN``þip$pýFDDþF``þfp$pDþ_``þcp$pDþ^``%pDþY``%pDþS``þop#pDþK``þlp#pDþF``þip#pD`þfp#pDþ]``þbp#pDþX``þap#pþEDDþP``$pþGDDþI``þop"pþIDDþE``þmp"pDþ_``þhp"pDþ[``þfp"pDþV``ýakp!pþEDDþN``ýbmppþFDDþG``þeppDþ_``þbppDþ_``ýdoppDþZ``ýgoppDþU``þlp pDþK``þap!pþ@DDþF``"pD`"pDþ]``þmp pþCDDþY``þip pþCDDþQ``þhp pþBDDþJ``þep pþ@DD`þap p 4þ7IIþTUU þ244þEIIþQUU 4þ9IIþOUU þ344þGIIþLUUþ@44þ=IIþTUUþ344þHIIþTUUþ344þ?IIþQUUþ344þ5IIþNUUþ144þDIIþKUUýQI4þ8IIþJUUþSIIþ544þFIIþSUUýTKII4þ:IIþPUUýSMIIþ344þGIIþMUUýTMIIþ+44þÿþÆÿ=ÿýðäÿ=ÿýÑüÿ=ÿþ¿ÿ=ÿýùÖÿÿúõÃÀËäÿ0ÿýâñÿÿþÖÿÿøúâÊÀÄÖ÷ÿ*ÿþÃÿÿþÄÿÿùôÖÄÀÊóÿ&ÿþÄÿÿþ¿ÿ ÿýå÷ÿ&ÿýðçÿÿþÇÿ ÿþÂÿ'ÿýäöÿÿþÝÿ ÿýÝûÿ'ÿþÈÿÿýøûÿ ÿþÉÿ'ÿþÌÿÿþÛÿ ÿþÏÿ'ÿýúÜÿÿþÇÿ ÿýþÔÿ'ÿþÄÿÿþ¿ÿ ÿþËÿ'ÿýíïÿÿþÅÿ ÿýûÞÿ'ÿþÀÿÿþ×ÿ ÿþÃÿ'ÿýÝúÿÿÃôÁÀ¿ÀÂÆÌÑ×âôÿ'ÿþÎÿ<ÿþÇÿ<ÿý÷âÿ<ÿþ¿ÿ<ÿýåõÿ;ÿýÆ×ÿûÿýûÂÿ;ÿýÊØÿ:ÿýÐÒÿ:ÿýÏÓÿ:ÿýÖÍÿ:ÿüâÄüÿ9ÿüáÆýÿ9ÿüèÂúÿ9ÿüïÀõÿ7ÿúìÔÅ¿íÿ1ÿ÷òÖÆÀÂÍâúÿ4ÿüÓáüÿ:ÿýÈøÿÿ ™û“–—™8™ý•…ƒƒú†Œ‘•–™.™û˜™’…ƒ ƒù„ˆŒ’——™™õ˜——’ŽŠ†„ƒ†ƒƒú†‹•˜™™—ú’Ž‹‰„ƒ$ƒú†Œ’•˜™™ø˜•“ŽŠ‡„ƒ1ƒú†ŠŒ†…ƒ—ƒ pülkop9pýma``úbejlnp/püola` `ûdgjop põopolieb``b``úbfiloppùolifda`$`úcgkmoppùmkieba`1`úbggba`—` UQþRU9UýQJIIùJNQSTTU/UþQI IûKOQTU"UúTQONJIIJûNQSTUUùTQONKJI#IùJKNQSTUUøVTTQOMKI2IúLMOLJI—I ÿùôÀ¿ÄÖôÿ6ÿüøÀêÿÿøþäÌÀÂÑíÿ-ÿûð÷Àìÿ ÿøøÜÆÀÆÖøÿÿõñÖÆÀÂÍâøÿåÿÿøúâÊÀÂÒôÿÿ÷ôÖÆÀÂÊÖïÿ#ÿøúÜÇ¿Å×õÿÿ÷ëÔÆ¿ÂÍàùÿ0ÿùþâËÉÛôÿ—ÿ ™þ‹ƒƒþm\\ ™þ„ƒƒþ^\\þ] ™þ˜ƒƒþ€\\þU ™þ’ƒƒþt\\þ] ™þ‰ƒƒþd\\þ] ™þšƒƒ\þX ™þ•ƒƒþy\\ ™þƒƒþj\\þ[ ™þ†ƒƒý‚^\\þ[ ™þ˜ƒƒþ~\\þU ™þ•ƒƒþp\\þ] ™þŒƒƒþa\\þ[ ™þ…ƒƒþ\\þZ™þ—ƒƒþw\\ ™þ’ƒƒþg\\þ[ ™þ‰ƒƒ\þ] ™þ„ƒƒþ|\\þ[ ™þ˜ƒƒþl\\ ™þƒƒþ_\\ ™þ‡ƒƒþ€\\þU ™þ˜ƒƒþt\\ ™þ•ƒƒþc\\ ™þŒƒƒ\þX ™þ…ƒƒþz\\þ[ ™ƒþi\\þ[ ™þ’ƒƒþ]\\þ^ ™þŠƒƒþ}\\þU ™þ„ƒƒþq\\þ] ™þ–ƒƒþ`\\þ[ ™þƒƒþ\\þU ™þ‡ƒƒþw\\™ƒþg\\þ[™þ”ƒƒþ]\\þ[™þƒƒþ}\\þ[™þ„ƒƒþl\\™þ—ƒƒþ_\\™þ“ƒƒþ€\\þU™þ‹ƒƒþt\\™þ„ƒƒþc\\™þ—ƒƒ\þX™þ‘ƒƒþz\\™þˆƒƒþi\\þ]™ƒþ^\\þ^ý™•ƒƒþ~\\þUý™Žƒƒþq\\þ]ý™…ƒƒþ`\\þ[þ˜ƒƒþ\\þUþ’ƒƒþw\\þŒƒƒþf\\þ]þ„ƒƒþ]\\þ[ƒþ|\\ƒþm\\þ[ƒþ_\\þ[ƒþ€\\þUƒþt\\ƒþd\\þ[ƒ\þ^ƒþ{\\ƒþj\\ƒþ^\\ƒþ~\\þUƒþp\\ƒþa\\ƒþ\\þU pþg``þPDD pþa``DþE pþo``þ^DDþ9 pþk``þTDD pþd``þIDDþE p`þ^DDþF pþn``þZDD pþh``þMDDþE pþc``ý_EDDþE p`þ]DDþU pþl``þSDD pþg``þFDD pþa``þ_DDþKpþo``þWDD pþk``þKDD pþd``DþF pþa``þ[DDþC pþn``þPDD pþh``ý_FDD pþc``þ^DDþ9 pþq``þUDD pþm``þIDD pþg``þ^DDþF p`þZDDþE pþo``þNDDþE pþl``ý_EDD pþf``þ\DDþU pþa``þSDDpþo``þGDDpþi``þ_DDþG pþc``þWDDpþo``þKDDpþn``þ_DDpþh``þ[DDþCpþa``þPDDp`þFDDpþk``þ^DDþ9pþf``þUDDpþa``þIDDpþo``þ^DDþFpþj``þYDDpþd``þNDDp`ý_EDDýpm``þ]DDþUýph``þSDDýpb``þGDDþo``þ^DDþGþj``þWDDþe``þLDDþCþa``þ_DD`þ[DD`þQDD`ý_FDDþC`þ^DDþ9`þUDD`þJDDþC`þ_DD`þYDD`þNDD`ý_EDDþC`þ\DDþU`þSDD`þGDDþC`þ^DDþG UþNIIþ=44þ3 UþHIIþ544 UþTIIþF44þ9 UþQIIþA44þ3 UþLIIþ744þ3 UþTII4þ5 UþSIIþD44 UþOIIþ<44þ3 UþKIIýH544 UIþF44þU UþRIIþ?44þ5 UþNIIþ644þ3 UIþH44þ- UIþA44 UþQIIþ;44þ3 UþMIIýH544 UIþF44þ3 UþTIIþ>44þ5 UþOIIþ644þ3 UþKIIþG44þ9 UIþ@44 UþQIIþ844 UþOII4þ5 UþKIIþC44 UþTIIþ;44 UþSII4þ3 UþLIIþG44þU UIþ?44þ5 UIþ644þ3 UþQIIþH44þ9 UþKIIþA44UIþ:44þ3UþRII4þ3UþNIIþE44þ3UþJIIþ>44þ5UIþ544þ3UþQIIþG44þ9UþMIIþ@44UIþ944þ3UþTII4þ5UþQIIþC44UþLIIþ;44þ5UIþ544þ3ýURIIþF44þUýUNIIþ?44þ5ýUJIIþ644þ3þUIIþH44þ9þRIIþA44þNIIþ;44þ5þJII4þ3IþE44Iþ=44Iþ644þ2IþH44þ9Iþ@44Iþ844þ5I4þ3IþC44Iþ<44þ5Iþ544þ2IþG44þUIþ?44Iþ744þ5IþH44þ9 ÿþÈÿÿþÆÿÿþ• ÿýúóÿÿýúòÿÿþJ ÿþÒÿÿþÏÿÿýõ  ÿþ¿ÿÿþÀÿÿþ³ ÿþÓÿÿþÝÿÿþh ÿýïüÿÿþàÿÿýþ ÿþÈÿÿþÀÿÿþÒ ÿþÁÿÿþÍÿÿþ† ÿþáÿÿýóøÿÿþ; ÿþâÿÿþÈÿÿýì ÿþÁÿÿþÂÿÿþ¥ ÿþÇÿÿýþèÿÿþZÿýûðÿÿþ×ÿÿýûÿþÓÿÿþ¿ÿÿþà ÿþ¿ÿÿþÕÿÿþx ÿþÑÿÿýêýÿÿþ, ÿýôùÿÿþÅÿÿþß ÿþÈÿÿþÆÿÿþ– ÿþÁÿÿýûòÿÿþK ÿþÝÿÿþÑÿÿýõ ÿþâÿÿþÀÿÿþ´ ÿþÂÿÿþÛÿÿþl ÿþÆÿÿþàÿÿýþ ÿýüìÿÿþÁÿÿþÔ ÿþÔÿÿþÊÿÿþ‰ ÿþ¿ÿÿýöøÿÿþ< ÿþÏÿÿþÊÿÿýì ÿýôùÿÿþÂÿÿþ¥ ÿþÊÿÿýþéÿÿþZ ÿþÀÿÿþ×ÿÿýû ÿþÝÿÿþ¿ÿÿþÃÿþåÿÿþÓÿÿþxÿþÃÿÿýîýÿÿþ-ÿþÅÿÿþÄÿÿþßÿýýíÿÿþÆÿÿþ–ÿþÖÿÿýúñÿÿþKÿþ¿ÿÿþÏÿÿýõ ÿþÎÿÿþÀÿÿþ´ÿýôùÿÿþÝÿÿþiÿþËÿÿþàÿÿþÿþÀÿÿþÁÿÿþÓÿþÛÿÿþÌÿÿþ‡ýÿæÿÿýôøÿÿþ<ýÿÃÿÿþÈÿÿýìýÿÄÿÿþÂÿÿþ¥ýþëÿÿýþéÿÿþZþØÿÿþØÿÿýûþÀÿÿþ¿ÿÿþÄþÌÿÿþÔÿÿþyþöÿÿýîýÿÿþ-ÿþÄÿÿþàÿþÆÿÿþ—ÿýûñÿÿþLÿþÑÿÿýõ ÿþÀÿÿþµÿþÜÿÿþjÿþäÿÿþÿþÁÿÿþÓÿþËÿÿþˆÿýôøÿÿþ=ÿþÊÿÿýìÿþÂÿÿþ¦ÿþèÿÿþ[ÿþØÿÿýû\þ‚ƒƒ!™\þ}ƒƒþ˜™™\þuƒƒþ–™™þ[\\þlƒƒþ“™™þZ\\þbƒƒþ™™þU\\þ]ƒƒþŠ™™þ]\\þ€ƒƒþ†™™\þzƒƒ ™þ]\\þsƒƒþ—™™þ^\\þiƒƒý‰–™™þY\\þ_ƒƒýˆ•™™\ƒü†’š™™\þ€ƒƒü„š™™\þxƒƒþ™™þ]\\þoƒƒý‰–™™þZ\\þeƒƒýˆ–™™þ]\\þ]ƒƒý‡”™ ™ \þ‚ƒ ƒü„˜™ ™ \þ~ƒ"ƒü„—™™ \þwƒ%ƒý‹—™™ þ[\\þhƒ'ƒýŠ•™™ \þgƒ(ƒý†”™™ þ]\\ý`€ƒ(ƒû…’š™ þX\\ý]wƒ)ƒý„ þ^\\þlƒ*ƒ \ýd‚ƒ(ƒþ]\\ý]{ƒ'ƒþX\\þpƒ&ƒým[\\þeƒ%ƒþ[\\ý`€ƒ#ƒ\ý]tƒ"ƒýY[\\þlƒ!ƒ\ýbƒƒþZ\\ý^xƒƒþ^\\þoƒƒý`]\\ýe‚ƒƒ\ý^ƒƒ\ý]tƒƒýU]\\þgƒƒþ]\\ý`ƒƒ þ[\\ý]xƒƒ!ýa[\\þnƒƒ"þU\\ýc‚ƒƒ$þ]\\ý^}ƒƒ%\þpƒƒ&þ`\\þhƒƒ(\ý_€ƒ ƒ)\ý]xƒ ƒ*þ^\\þkƒ ƒ,\ýcƒ ƒ-ý[]\\ý]{ƒƒ.þX\\þpƒƒ/ým[\\þeƒƒ1þ[\\ý`€ƒƒ2\ý]tƒƒ3þ[\\þjƒƒ5\ûbƒƒ5þ]\\ü^xƒ6þ^\\þo7þ@\\:\;þZ\\<üU]\=]Dþ_``þoppDþ[``þoppDþW``þmppþCDDþO``þlppþEDDþG``þgppþUDD`þeppDþ^``þappDþ[`` pDþU``þoppDþL``ýeoppþCDDþG``ücloppDþa``ýbjppþCDDþ^``üajoppþCDDþY``þhppþCDDþR``ýeoppþBDDþK``ýcmppþFDDþE``ýblp p Dþ_` `üajop p Dþ[`"`üahopp þEDDþU`%`ýfopp þCDDþM`'`ýdnpp þADDþM`(`ýblpp DýG]`(`ûajqp þFDDþW`*`þh þCDDþO`*` þEDDýI_`(`þFDDýEZ`'`þFDDþS`&`ýIEDDþJ`%`þEDDýF]`#`þGDDþU`"`þ@DDþO`!`þEDDýG^``þFDDýEZ``þBDDþQ``þ@DDþJ``þCDDþ\``þADDþU``þ@DDþL``DýH^`` þEDDýEX``!þIDDýR_``"þUDDýJ_``$þFDDýF]``%þGDDþS``&ý@EDDþM``(DýF]` `)þBDDþX` `*þCDDþO` `,þEDDýI_` `-þBDDýEZ``.þFDDþS``/ýIEDDþJ``1þEDDýF]``2þGDDþU``3þIDDýN_``5þEDDûG_``5þEDDüEZ`6þBDDþQ7þ@DD:þCDD;þEDD<ü@DD=D4I!U4þFIIþTUU4þCIIþTUU4þIIý@344þ9IIþ344ý5FII4þAIIþ+44ý:HIIþ544ý6HII 4þBII!þ144þ=II"þU44þ7II$54þFII%þ244þ?II&þ@44ý;JII(4ý6HI I)þ344þBI I*þ644ý7ý@544:þ344;þ544<ü+44=5þØÿÿþÛÿÿþîÿÿþ¬ÿÿþÆÿÿþÕÿÿþ€ÿÿþ¿ÿÿþÅÿÿþTÿÿþÇÿÿþ¿ÿÿþ%ÿÿþâÿÿþÃÿÿùöÿÿýòÿÿþÑÿÿþÌÿÿþÓÿÿþèÿÿþžÿÿþÂÿÿýþôÿÿþqÿÿþÁÿÿþÎÿÿþDÿÿþÏÿÿüÒÊþÿÿþÿÿþíÿÿüÚÂ÷ÿÿþéÿÿþèÿÿüéÀïÿÿþ½ÿÿþÌÿÿüóÁåÿÿþÿÿþÀÿÿüúÄÛÿÿþcÿÿþÃÿÿýÒÊÿÿþ6ÿÿþ×ÿÿüØÄûÿÿù ýÿÿ÷üÿÿüãÁôÿ ÿ þÜÿÿþÞÿ ÿüòÁçÿ ÿ þ¯ÿÿþÇÿ"ÿüùÄÝÿÿ þ‚ÿÿþ¿ÿ$ÿüýÊÍÿÿ þWÿÿýÎüÿ&ÿüɼüÿÿ þ'ÿÿýËçÿ'ÿüâÁõÿÿ ýÌÿÿýåÊÿ(ÿûìÀíÿ ýáÿÿüù¶ýÿ(ÿýøÄ ý·ÿÿýÉðÿ)ÿ üwýÿÿýàßÿ(ÿýBéÿÿý÷Ãÿ'ÿýÈÿÿýÂùÿ%ÿý‘ÿÿýÖâÿ$ÿý\õÿÿýíÌÿ#ÿý/ÛÿÿüþÀýÿ!ÿý¸ÿÿýÇòÿ ÿüoúÿÿýåÔÿÿý>çÿÿýøÁÿÿýÄÿÿýÄõÿÿýšÿÿýÒàÿÿýPðÿÿýòÇÿÿý'ÓÿÿüþÀüÿÿý ¨ÿÿýÐéÿÿýfùÿÿýçÒÿÿ ý;åÿÿýûÀÿÿ!ý»ÿÿýÅôÿÿ"ü€ýÿÿýÞÛÿÿ$ýMîÿÿýóÆÿÿ%ý$ÑÿÿýÂúÿÿ&ýœÿÿýÑèÿÿ(ý^öÿÿýìÍÿ ÿ)ý2ÞÿÿüüÀþÿ ÿ*ý·ÿÿýÉðÿ ÿ+üwýÿÿýßÙÿ ÿ-ýIíÿÿý÷Ãÿÿ.ýÈÿÿýÂùÿÿ/ý‘ÿÿýÖâÿÿ1ý\õÿÿýíÌÿÿ2ý/ÛÿÿüþÀýÿÿ3ý¬ÿÿýÊîÿÿ4üoúÿÿûåÔÿÿ5ý?çÿÿüøÁÿ6ýÄÿÿþÄ7ýˆÿÿ:ýPðÿÿ;û0Üÿÿ;ü ¨ÿ=f™þ•ƒƒ™þ•ƒƒ™þ“ƒ ƒ™þƒ!ƒ™þƒ"ƒ™þŒƒ#ƒ™þŒƒ$ƒ™þ‹ƒ%ƒ™ý˜Šƒ&ƒ™ý˜‡ƒ'ƒ™þ‡ƒ(ƒ™ý˜†ƒ)ƒ™ý—„ƒ*ƒ™ý—„ƒ+ƒ™ý–„ƒ,ƒ™þ•ƒ.ƒ ™þ•ƒ/ƒ ™þ“ƒ0ƒ ™þƒ1ƒ ™þƒ2ƒ ™þƒ3ƒ™þŒƒ4ƒ™ý˜‰ƒ5ƒ™þˆƒ7ƒù‹—™™˜†ƒ5ƒý€tƒƒüŠ—‡ƒ2ƒù‚zk^\\ƒ5ƒü|m_\\2ƒü€te\\.ƒû‚xh^\ \ý]\ƒ*ƒü|m`\ \û]Zƒ&ƒü€te\ \û]\^@#ƒû‚|m_\ \]þX"ƒý~]\ \ý]Z !ƒý|]\\û]\Z@ ƒýx]\\ý]Yƒþu\\ýZ€ƒþo\\þ]ƒþk\\þ]ƒý‚h\\þZƒþf\\ý]Yƒþd\\þ^ƒý‚a\\þUƒý`\\ý[Uƒý€_\\ý[mƒý~^\\ý]U ƒý|]\\#ƒýy]\\$ƒþt\\þ[$ƒþr\\þ[%ƒþo\\'ƒþk\\þZ' ƒý‚h\\) ƒþe\\þZ) ƒý‚a\\+ ƒý‚a\\þU+ ƒý_\\þ],ƒý€^\\þm-ƒý~]\\þU.ƒý|]\\1ýf‚ƒƒýx]\\2ù\^ƒƒt\\þ]2\ü]wr\\þ]3\þ[4\þZ5pýma``pþm``pþl` `pþi`!`pþj`"`pþf`#`pþe`$`pþe`%`pýoe`&`pýoc`'`pþb`(`pýob`)`pýoa`*`pþo`,`pþn`-`pþm`.` pþm`/` pþl`0` pþi`1` pþh`2` pþi`3`pýoe`4`pýoe`5`þoppþc`7`ùfoppoc`5`ý]U``üfnc`3`úZQEDD`4`ûa[PGDD2`ü]UJDD.`û_XNED D+`ü[PGD D'`ü]UJD Dþ@$`ü[OED DýCF"`þ[D D !`þ[D DýF@ `þXDDýE@`þVDDüCF€`ý_RDDþF`þODDþE`ý_MDDþF`ý_KDDþF`ý_JDD`ý_HDDþG`ý^GDDþ@`ý^FDDþI`ý]EDDþU `ý\EDDþE"`þYDDþE#`þUDDþC$`þSDD&`þQDD'`þPDDþF' `ý_LDDþB( `ýaKDD* `ý_HDDþG* `ý_FDDþG+ `ý^GDDýEF,`ý^EDDýEI-`þ[DDýEU.`þ[DD1ýJ_``þXDDþE1Dû\``UDDþE2DýWTDDþE3DþE4DþB5UþRIIUþQIIUþRI IUþQI!IUþOI"IUþOI#IUþMI$IUýTLI%IUþMI&IUþKI'IUýTKI(IUýTJI)IUþJI*IUýSJI+IUþSI-IUýTJI-I UþQI/I UþQI0I UþQI1I UþOI2I UþNI3IUþMI4IUþLI5IUýTKI7IþNUUþKI5IýHAIIüMSKI2IùHE<544I5IüD=7442IûHA:544.IûGB:54 4*IûJD=64 45'IûHA:54 45ý3@#IûHD>64 4þ5"IýF54 45 !IþD44û542@ IþB443IþB44þ2Iþ?44þ5Iþ=44þ5IýH;44þ2IýH844þ3Iþ844þ3IýH644þ9IýH644þ+IýH644þ$IýF544þU IþG44#IþD44þ3#IþA44þ5$Iþ?44þ3%Iþ=44þ3&Iþ;44þ5'Iþ;44ý53( Iþ944þ5) Iþ744þ3* Iþ644ý59+ Iþ644þ.,IýG544þ$-IýF544þU.IþD44þ30þ9IIþD44þ31ù45FIIA44þ324ýA@44þ534þ5446ÿýÃûÿ;ÿýÀþÿ;ÿý»þÿ;ÿþÀÿ;ÿýýÁÿ;ÿýúÅÿ;ÿýöÊÿ;ÿýòÐÿ;ÿýñÑÿ;ÿýçÝÿ;ÿýàãÿ;ÿýÚéÿ;ÿýÓïÿ;ÿýÍôÿ;ÿýÈøÿ;ÿýÆúÿ;ÿýÂüÿ;ÿýÀþÿ;ÿþÀÿ;ÿýýÁÿ;ÿýú¾ÿ;ÿý÷Êÿ;ÿýóÏÿ5ÿþÞÿÿýíÖÿ6ÿøýÊÓÿÿçÜÿ4ÿöøÍÀÿÿþËÇÝÿ2ÿûåÉÑöÿ6ÿûèÂÆéÿ6ÿúøÍÀÖýÿ5ÿúþÖÀÍõÿ ÿýâ™ÿ)ÿûèÂÆêÿ ÿùñªf"ÿ%ÿúøÍÀÖýÿÿúý̈<#ÿûåÂÇïÿ ÿûë¨c"ÿýÇùÿÿûñªf" !ÿýÂüÿÿúýÌ€3 ÿýÀþÿÿûá™Uÿýþºÿÿûý…3ÿýûÃÿÿýöMÿý÷Èÿÿýñ?ÿýóÎÿÿýê3ÿýíÕÿÿýâ(ÿýæÜÿÿýØÿýßãÿÿýÈÿýØêÿÿý» ÿýÑðÿÿý­ÿýËõÿÿý ÿýÃûÿÿý!ÿýÀþÿÿþw#ÿþÀÿÿýýj$ÿýýÁÿÿýúZ%ÿýúÄÿÿýöK&ÿýöÊÿÿýð>' ÿýñÐÿÿýé2( ÿýë×ÿÿýÜ") ÿýáâÿÿýÒ* ÿýÚèÿÿýÇ+ ÿýÓîÿÿýº ,ÿýÌôÿÿý«-ÿýÇùÿÿýœ.þõÿÿýÂüÿÿý‹/ýØáÿÿýÀþÿÿþw1ùÿòÇÿþÀÿÿýýh2ÿüü¿Àÿÿýû`3ÿýóC4þùÿÿýì65üƒû‚xh^ƒ7ƒü~rc\\4ƒü€te\\0ƒû‚xh^\ \-ƒü|m_\ \ü[\_ƒ(ƒü€te\ \û]\^U%ƒû‚xh^\ \ý]Y"ƒü|m_\ \ü[\Z ƒü€te\ \û]\^U ƒû‚xh^\ \]ƒü|m_\ \]þZƒü€te\ \û]\^Uƒû‚xh^\ \] ƒü~rc\ \ý[Uƒü€uf\ \ü[Z["ƒû‚yj^\ \ý]`&úƒ‚}n`\ \]þU)þe\ \û]\^U-\û]\]a1\ý]Z5\û]\^@8ý]a*ü\]]\\4þZ\\þ[.þZ\\*ý^]\\þZ$ýU[\ \ú_l{r\\þUýU]\ \ü_m|ƒƒþo\\]ûm^\]\ \û_m|‚ƒƒþj\\þ@ûf^\[\ \û^hx‚ƒ ƒþf\\þ[üZ\[\ \û]hv€ƒƒþc\\] \û]et€ƒƒþ_\\þ]ü^][\ \üdp}ƒƒý‚_\\þ]ýZ]\ \übp}ƒ ƒý€^\\þ^ü`û_XNE`6`û_]RHDD4`ü]UJDD0`û_XNED D,`û_[PGD DýEA`(`ü]UJD Dþ9%`û_XNED DýEC!`û_[PGD DýED `ü]UJD Dþ9 `û_XNED DýEF`ü[PGD D`ü]UJD Dþ9`û_XNED DûEDEF `û_]SJD DüCDU`ü^WKD DüCDI"`üYNFD DüEDH&`ü[QHD DýFU)þJD Dþ9- DýEI1D6Dþ@8ýEI*þGDDýCG3ýECDD/ýFED DþG)DþB$ý@BD DúGNY_SDD ýDED DûGP[_``þRDDýEFþID DûFP[_``þNDDþ@ü3DED DúENX__` `þKDDýFED DûENV]``ý_JDDþE þFD DûJU]_``ý_GDDþCþBD DûIS]a``ý_FDDþEýKED DûGS]a``ý^EDDüIûGB:5I7IüG?8444IûHA:5440IûGB:54 4-IüE=74 4ý35I(IûHA:54 45þ9%IûGB:54 4û3437"IüE=74 45 IûHA:54 45þ9 IûGB:54 4û343.IüE=74 4ü355IûHA:54 45þ9IûGB:54 4ý3. IüG?74 4ü32UIûHA954 4û3447"IûHD;54 4û5458&IüE=64 4û533U)ý:54 45þ9- 4ý31145645ý3@8ý31*ø64344323ü74344þ2.ü2554 4þ6)ü35544þ1$ü+434 4ú674 4üHA:4 43ý4; 4ý374ý32#45þ3&4ý37 ÿþ¿ÿÿþÄÿþÓÿÿþy ÿûôÊÀüÿÿþ1 ÿúùɸËùÿÿýØÿûÖÀÍôÿÿýü8ÿûîùÚÿ ÿýðcûɸÌùÿ ÿûßšT  ÿûå™Uÿúø»w3"ÿúþ̈D &ûå™U €€€€þ]\\þ[4ûU^Y\\þ^1ûU^\]\\þFDDþC4ú9DCEDDþC1þUDDý2544þ54ö957434561þ+554ýBéÿÿýê57ù˜Õψ7ý\]\ \ü_m|ƒ%ƒþ}\\ýZ\\û_m|‚ƒ)ƒþ{\\` DûGP[_`$`þ[DDýEDDûFP[_`)`þZDDH5 4û6=DHI$IýF544ý544û5=DHI)IþE448€____xa<0²£ asteroid 2ÿ     $2%Þ²£Þ"4 4,²£ÞRë‰ôþ+ý³% *B.)¾ý]\;ü]\\9þ]\\8þm\\7þ[\\þ^4ý^[\\ýjƒ3\û`~ƒƒ1ý^]\\þrƒƒ0þU\\ýd€ƒƒ/þ]\\ý^xƒƒ-þ[\\þhƒƒ,þ[\\ý_|ƒƒ*ý^]\\þoƒ ƒ(þU\\ýb€ƒ ƒ'þ]\\ý]vƒ ƒ%ýU[\\ýeƒƒ$\ý^|ƒƒ"þ]\\þmƒƒ þ€\\ýb~ƒƒþ[\\ü]r‚ƒƒþm\\ýeƒƒþ]\\ý^wƒƒýY[\\þjƒƒþ[\\ý`|ƒƒ[\þlƒƒþU\\ýd€ƒƒþ[\\ý^vƒ ƒþ[\\ýfƒ!ƒ\ý_|ƒ#ƒý^]\\ýl‚ƒ$ƒ þU\\ýa~ƒ&ƒ þ]\\ý]tƒ(ƒ ýU[\\ýfƒ)ƒ þ[\\ý]yƒ+ƒý^]\\þjƒ-ƒþ€\\ý`~ƒ,ƒý†•þ_\\þrƒ,ƒû…’™™þ`\\ýb€ƒ+ƒý„™™þ^\\ý^xƒ+ƒý„™™þ\\ýh‚ƒ+ƒþ™™\ý^zƒ+ƒý‹˜™™\ýn‚ƒ*ƒý‹˜™ ™\þƒ*ƒýˆ—™ ™\*ƒý‡—™ ™\þ‚ƒ&ƒý†”™™þ[\\þƒ$ƒý…“™™\þ€ƒ"ƒý…“™™þ]\\þ}ƒ ƒý„’™™þ[\\þ{ƒƒþ™™þ[\\þxƒƒþ™™\þuƒƒý„‹™™þ[\\þrƒƒý‰—™™þ[\\þoƒƒýˆ–™™þZ\\þkƒƒþ•™ ™þZ\\þgƒƒþ‡™!™þ[\\þcƒƒþ‡™!™þX\\þ_ƒƒþ‡™!™þU\\þ^ƒƒþ‡™!™þ\\ƒþ‡™!™þ\\ƒþ‡™!™þ\\þƒƒþ‡™!™ý]\\þƒƒþ‡™!™¾ýFD;D:þFDD8þIDD7þEDDþF4þCDDýN_3DûH\``1þCDDþU``0þUDDýJ^``/þFDDýEX``-þIDDýM^``,þCDDýG[``*DþQ` `(ýUEDDýH^` `'þEDDþV` `%ý@EDDýL_``$þCDDýF[``"þFDDþO`` ý€EDDýG\``þCDDýU_``þIDDýK_``þFDDüEY_``þ@DDýN_``þEDDýG[``þ@DDýPa``þUDDýI^``DýEV` `þIDDýK^`!`DýG[`#`DýN_`$` ýUEDDýI]`&` þEDDþU`(` ý@EDDýK^`)` þBDDýEY`+`þBDDþN`-`ý€EDDýH\`,`ýbmþADDþU`,`ûalppþ@DDýH^`+`ýaippDýEX`,`þjppþDDýL_`+`þgppþCDDþY`+`ýeoppDýQ_`*`þfp pDþ\`)`ü_bop pD*`ýdnp pDþ_`&`ýblppþEDDþ^`$`ýalppDþ^`#`þlppDþ]`!`þkppDþZ``þjppþEDDþX``ýagppDþW``ýfoppDþS``ýdoppþCDDþQ``ýdmppDþN``ýalp pþFDDþM``þdp!pDþI``þdp!pþFDDþG``þdp!pþ@DDþE``þdp!pþDD`þdp!pþDDþa``þdp!pþDDþ_``þdp!pýEDDþ_``þdp!p¾ý.5;ü5449þ6448ý$5447ý5344þ54þ644ý;I34û6GII1þ644ü5AHII0þ+44ý8HII/þ344ý5BII-þ744þ:II,4ý6EII*34ý>HI I(ýU344ý7FI I'þ644ý5BI I%ý+544þ:II$þ544þDII"ý.544ý>JII!þ544ý7GIIþ744þAIIý$544ý9HIIþ344ý5EIIþ344ýIIþ+44ý7GIIþ244ý5BI Iþ744ý9HI!I4ý6EI#I34þ;I%I ýU344ý7GI&I þ644þAI(I ý+544ý8HI)I 4þCI+Iý9344þÿÿþÒÿÿþÂÿ!ÿþ-ÿÿþÝÿÿþÂÿ!ÿþÿÿþéÿÿþÂÿ!ÿþ ÿÿþøÿÿþÂÿ!ÿýúÿÿþöÿÿþÂÿ!ÿýêÿÿþèÿÿþÂÿ!ÿýÚÿÿþÜÿÿþÂÿ!ÿýÉÿÿþÒÿÿþÂÿ!ÿýU\\ü]Z@5þ]\\]þ\2 \ü]\Z/\ü[^f+\ù]pƒ}m^\ \þU(ü\fƒƒü‚vd\ \þX%þxƒ ƒüxh]\ \þ^"ƒü}o_\ \ü[]mƒürb\ \]þ`ƒû‚xg]\\ü]\[ƒü|m^\ \ü[^fƒü~pa\\û]\\[ƒü‚ve\ \ü[\X"ƒü|k]\ \þ^ $ƒû‚}o_\ \ü[]m(ƒütc\ \]þ`,ƒýxg\ \ü]\[/ƒü|m^\ \ý[^ƒ1ƒü€r`\\5ƒû‚ve]\\8ƒû‚|k]\\<ƒü~p`ƒIƒúŒ”‡„ƒ7ƒý˜™™ü“Œ†ƒ0ƒý„‹™ ™û–‘‰„ƒ*ƒý‰—™™ü”†ƒ$ƒý†•™™ü•„ƒƒý‡•™™þƒƒ™þ„ƒƒ™þ’ƒƒ ™þ„ƒ ƒ… ƒ ™þ“ƒ ƒþ‡™™û—‘Іƒƒ!™þ…ƒ ƒþ…™™û”Žˆ„ƒƒ!™þ“ƒ ƒþ˜™ ™ü—‘‹™!™þ…ƒƒý„—™2™þ“ƒƒþ•™4™þ…ƒƒý„•™5™þ”ƒƒþ“™7™þ‡ƒƒþ™8™þ•ƒƒþ™:™ü‡ƒ‹™;™ý–‰™W™ýUDDýC@5 DþG2 DþF/DüED3+DúS^[QFD Dþ9(üDK^``ü_VJD DýEF%ýZ_``û_ZNED D# `û_]QFD DýFI`_ýUGD Dþ@`ü_XMD DþC`ûa[PED DüED3`ü\SFD DþI`ü_VJD DýEF"`ý[PD D %`ü]QFD DýFI(`ü_UJD Dþ@+`ü_ZMD DþC.`û_[PFD DýED`1`ü]UHDD5`ü_VJDD8`ü_[PDD<`ü\SG`H`ùaglgca`7`ýgoppúolgca`0`ýfop pûojda`*`ýdoppümgc`$`ýcmppünja``ýdnppþj``pþb``pþl`` pþa` `b ` pþk` `þcppûmjea``!pþa` `þbppûmhda``!pþk` `ýaop püojep!pþb``ýaop2pþl``ý_mp4pþb``þlp5pþl``þlp7pþc``ý_jp8pþl``þip:püc`fp;pýndpWpû+4544ý3@5þ244ü3532 4ü542/45þ3+4û?IE<4 4ý39(ü48HIIüGB84 45&þEIIüHE:4 4ü353"IüG>544û545$IüHA74 4ü355IüHB:4 4ü547IüE=54 45þ3IüG?64 4ü547IüGB:4 45"IüD;544ü353 %IüG>644û545$(IüHA74 4ü355+IûHE:544ü547.IüHE=4 452IüHA6445IüHB:449IüD;544ÿûÜÀÖþÿ=ÿûäÂÊùÿ=ÿûôÊÂêÿ=ÿþüÿÿøèÁ×ÁÃÝþÿ5ÿüéÂùÿÿúôÒÁÄãÿ/ÿüðÀôÿ ÿúéÊÀÒ÷ÿ(ÿüöÀîÿÿùûÜÂÄÜþÿ!ÿüýÄâÿÿüãÅÛÿÿýÂãÿÿþÌÿ>ÿþÐÿ=ÿþÎÿ>ÿþÒÿ ÿüÊÉêÿ+ÿþÒÿ ÿöÃþÿÿéÊÀÊïÿ'ÿþÍÿ ÿýËúÿÿùüÜÄÁÖüÿ"ÿþÐÿ ÿýØñÿ ÿüíÊ¿ÿ!ÿþËÿÿýÝíÿ2ÿþ×ÿÿýëçÿ4ÿþÉÿÿýîÛÿ5ÿý×þÿÿýôÔÿ7ÿþÇÿÿýûÊÿ8ÿúÛýÿþÄÿ:ÿüÆÿÀÿ;ÿýÜÀÿWÿRþ@/\þ[,\ü[\[)\þ^& \ý]m"ütc\ \]þYƒû‚xh]\ \ƒü}o^\\þU ƒüq`\\þ] ƒütb\\þXƒþ`\\ƒþy\\ƒþa\\ƒþ}\\þ[ƒþc\\ƒþ\\þ]ƒþg\\þ€ƒþ€\\ƒþi\\ý[Uƒþ‚\\þ]ƒþo\\þbƒþ^\\þ]ƒþq\\þ^ƒþ^\\þ]ƒþu\\þXþ†ƒƒý‚_\\ý™‹ƒƒþx\\þZý™“ƒƒþa\\þ]™þ„ƒƒþ{\\þ^™þ‰ƒƒþd\\™þ’ƒƒþ\\þ[™ƒþf\\þ€™þˆƒƒþ€\\þ[™þ’ƒƒþi\\þf™þ‚ƒƒþ\\™þ…ƒƒþm\\þf ™þƒƒý‚]\\þ[ ™þ—ƒƒþp\\þU ™þ„ƒƒý‚]\\þ] ™þŒƒƒþu\\þ[ ™þ•ƒƒþ_\\ ™þ„ƒƒþx\\þY ™þ‹ƒƒþ`\\þ] ™þ”ƒƒþz\\þZ ™þ„ƒƒþc\\ ™þŠƒƒþ}\\þ[™þ“ƒƒþe\\ Rþ@/DþI,DýE@) D' DýFI"ü_UID DþC`û_YMEDDýEG`ý]QD D `ü]TGDDþC `ü_UHDDþF`ý_GDDþE`þYDDþG`þHDD`þ[DDþE`þHDD`þ]DDþE`þKDDþ€`þ^DDþC`þMDDýCU`þ_DDþE`þQDDþ;`ý_EDD`þSDDþC`ý_FDDþC`þUDDþEþc``þEDDþEýpe``þXDDþEýpl``þGDDp`þZDDþCpþd``þJDDþCpþk``þ\DDþEp`þKDDýC€pþc``þ^DDþCpþi``þNDDþ3pþ_``þ^DDþCpþc``þQDDþM pþi``ý_EDDpþo``þSDDþG pþb``þEDD pþg``þUDDþ@ pþo``þGDDþE pþa``þXDDþF pþg``þHDD pþl``þYDDþF pþa``þIDD pþe``þ]DDþEpþl``þLDD Rþ@/û4547,4ý57)4ü353& 4ý5$"üHA94 4ü357IüHD:4 4þ3IüG>544þ3 IüH?744þ5 IüHA744þ5Iþ644þ5IþD44þ6Iþ744IþE44Iþ744IþG44Iþ:44IþH44þ5Iþ<44ý3+Iþ544Iþ=44þ;Iþ544þ3Iþ?44þ6IþH44þ5Iþ@44þ1þJIIþ644ýUMIIþC44þ7ýURIIþ644UþHIIþE44þ6UþMIIþ844UþQIIþF44þ3UIþ944þ3UþLIIþG44þ5UþPIIþ;443UþHIIþ544UþJIIþ=44þ3 UþOIIþH44þ3 UIþ?44þ9 UþJII4þ5 UþNIIþA44þ7 UþRIIýH644 UþKIIþB44þ3 UþOIIþ644 UþSIIþD44þ2 UþJIIþ944 UþMIIþF44þ5UþSIIþ:44 Rþ/ûìª^,ÿû÷»o)ÿûÕˆ<% ÿûá™M"üÒÀÝÿÿûõ³fÿûäÈÚþÿÿüø§ÿûíÆÄòÿÿýÖÿû÷ÑÉìÿÿþŒ ÿûüÒÀßÿÿý÷ÿýôêÿÿþ ÿþÀÿÿýý/ÿýùâÿÿþ±ÿþÄÿÿþ;ÿýüØÿÿþÃÿþÉÿÿþJÿþÒÿÿýÒÿþÑÿÿþ[ÿþÉÿÿýßÿýÚýÿÿþkÿþÄÿÿýê ÿýãøÿÿþ|ÿþ¿ÿÿýðÿýìóÿÿþŒÿþÂÿÿýõýÌôÿÿïÿþ˜ýÿ¿ÿÿþÂÿÿýú%ýÿÙÿÿýõèÿÿþ¨ÿþâÿÿþÃÿÿþ9ÿþÀÿÿýüÜÿÿþÁÿþÐÿÿþÇÿÿþFÿýüìÿÿþÓÿÿýÐÿþÃÿÿþÐÿÿþWÿþÉÿÿþÌÿÿýÚÿýøóÿÿýÙýÿÿþgÿþÇÿÿþÆÿÿýæ ÿþÄÿÿýßúÿÿþx ÿýðùÿÿþÁÿÿýï ÿþÎÿÿýåõÿÿþ‡ ÿþÁÿÿþ¿ÿÿýö ÿýèþÿÿýðîÿÿþ˜ ÿþÔÿÿþÀÿÿýü( ÿþ¿ÿÿý÷æÿÿþ¨ ÿþÝÿÿþÂÿÿýþ3 ÿþÝÿÿýüÝÿÿþ¹ ÿþ¿ÿÿþÆÿÿþCÿþÔÿÿýþÔÿÿýÊý[\\þ~ƒƒþ‡™™þ‡ƒƒþ‡™™þ\\þ}ƒƒþ‡™™þ–ƒƒþ‡™™ý[\\þzƒƒþ‡™™þ‰ƒƒþ‡™™ý[\\þwƒƒþ‡™™þ–ƒƒþ‡™™ý]\\þrƒƒþ‡™™þ‰ƒƒþ‡™™ý[\\þoƒƒþ‡™™þ•ƒƒþ‡™™ý[\\þkƒƒþ‡™™þ‰ƒƒþ‡™™ý^\\þgƒƒþ‡™™þ–ƒƒþ‡™™ýZ\\þdƒƒþ‡™™þ‹ƒƒþ‡™™ýZ\\þ`ƒƒþ‡™™þ—ƒƒþ‡™™ýZ\\þ^ƒƒþ‡™™þ‹ƒƒþ‡™™ý€\\þ]ƒƒþ‡™™þ˜ƒ ƒþ‡™™\ƒþ‡™™þ‹ƒ ƒþ‡™™þ[\\ƒþ‡™™ ƒþ‡™™\þƒƒþ‡™™þ’ƒ ƒþ‡™™þ]\\þ€ƒƒþ‡™™þ˜ƒ ƒý…˜™™\þ}ƒƒþ‡™™þ‹ƒ ƒþ’™™\þzƒƒþ‡™™þ˜ƒ ƒù‡˜™]\\þxƒƒþ‡™™þ‹ƒ ƒú…’[\\þtƒƒþ‡™™þ—ƒƒþ]\\þpƒƒþ‡™™þ‰ƒ ƒþ[\\þlƒƒþ‡™™þ–ƒ ƒþ[\\þhƒƒþ‡™™þ…ƒ ƒþ[\\þeƒƒþ‡™™þ”ƒ ƒþY\\þaƒƒþ‡™™þ…ƒ ƒþY\\þ`ƒƒþ‡™™þ“ƒ ƒþU\\þ]ƒƒþ‡™™þ…ƒ ƒ\ƒþ‡™™þƒ ƒþ’\þ‚ƒƒþ‡™™þ„ƒƒû…‡™þ[\\þƒƒþ‡™™ú“‘”–™™\þ€ƒƒþ‡™!™þ]\\þ}ƒƒþ‡™!™þ[\\þ{ƒƒþ„™!™þ[\\þxƒƒþ‰™ ™þ]\\þuƒƒþ™™þ[\\þrƒƒþ–™™þ[\\þoƒƒþ…™™þZ\\þjƒƒþˆ™™þZ\\þgƒƒþ™™þ[\\þcƒƒþ–™™þX\\þ_ƒƒý„˜™™þU\\þ]ƒƒþ‡™™\ƒþ™™\ƒþ”™™\þƒƒý‚˜™™\þtƒƒþ‡™™\ý]~ƒƒþ™™þf\\þ^ƒƒþ”™™þ_\\þeƒƒþ—™™\þvƒƒþ†™™þ]\\þ€ƒƒþ™™þU\\þ_ƒƒþ“™™þ[\\þgƒƒý„—™™ýކ\þxƒƒü…‘–™ ™ý•‰ƒƒ \ý]€ƒƒû…Š‘˜™™ý•‰ƒƒ þa\\ýa‚ƒ!ƒû„‰‹…ƒƒ þZ\\þkƒ-ƒ þ]\\þyƒ,ƒ þ€\\ý^ƒ+ƒ þ^\\þaƒ+ƒ þ[\\þlƒ*ƒ\þ|ƒ)ƒþf\\ý]ƒ(ƒþZ\\þcƒ(ƒþDDþ]``þdppþc``þdppýEDDþ[``þdppþn``þdppþDDþY``þdppþc``þdppýEDDþW``þdppþn``þdppýCDDþU``þdppþc``þdppþDDþR``þdppþo``þdppýCDDþO``þdppþd``þdppþDDþL``þdppþo``þdppýFDDþJ``þdppþe``þdppþDDþG``þdppýo_``þdppýKDDþF``þdppþe``þdppý€DDþ_``þdppþa``þdppDþ_``þdppþe` `þdppþCDDþ^``þdppþo` `þdppDþ_``þdppþj` `þdppDþ]``þdppýoa` `þappþCDDþ]``þdppþe` `þkppþEDDþY``þdppþo` `ùdopCDDþX``þdppþd` `ükDDþU``þdppþn``þEDDþS``þdppþd` `DþO``þdppþn` `þBDDþM``þdppþb` `DþK``þdppþl` `þFDDþI``þdppþb` `þCDDþF``þdppþk` `þUDD`þdppþb` `D`þdppþi` `þjD`þdpp`úabdgpþEDDþ^``þdppúkhikmppDþ^``þdp!pDþ]``þdp!pDþZ``þap!pþEDDþX``þdp pþCDDþW``þjppDþS``þmppþCDDþQ``þappDþN``þdppþFDDþM``þhppDþI``ý_lppþFDDþG``þappþ@DDþE``þdppD`þippDþa``þlppDþ_``ýaoppDþU``þbppDþ]``þgppþMDDþE``þlppþADDþL``þoppþCDDþU``þbppDþ]``þfppDýGa``ý_kppþCDDþL``ý_oppüohaDþY``üajmp pýmd`` DýE^``ûaejoppümda`` þIDDýH_` `ú_adha`` þFDDþN`-` þCDDþZ`,` ý€CDDýE_`+` þBDDþI`+` þBDDþP`*`Dþ[`)`þ3DDýE_`(`DþI`(`ý544þGIIþLUUþLIIþLUUþ44þFIIþLUUþSIIþLUUþ44þCIIþLUUþKIIþLUUý344þAIIþLUUþTIIþLUUþ44þ@IIþLUUþKIIþLUUý544þ?IIþLUUþRIIþLUUþ44þ=IIþLUUþMIIþLUUý544þ:IIþLUUþTIIþLUUý244þ8IIþLUUþMIIþLUUý544þ8IIþLUU IþLUUý-44IþLUUþMIIþLUU4IþLUUþTI IþLUU4þHIIþLUUþNI IþLUUþ344IþLUU IþLUU4þHIIþLUUþRI IþLUU4þGIIþLUUýTJI IþJUUþ344þFIIþLUUþNI IþQUU4þDIIþLUU IùLTU544þBIIþLUUþMI IüP44þAIIþLUUþTII4þ?IIþLUUþMI Iþ344þ>IIþLUUþSI I4þI*I4þFI)Iý3544*Iþ544þ8I(Iý¸ÿÿþÊÿÿþÂÿÿþÃÿÿþÂÿÿý§ÿÿþÄÿÿþÂÿÿýßüÿÿþÂÿÿý—ÿÿþÁÿÿþÂÿÿþÂÿÿþÂÿÿý†ÿÿþ¿ÿÿþÂÿÿýäúÿÿþÂÿÿývÿÿþÀÿÿþÂÿÿþÁÿÿþÂÿÿýeÿÿþÃÿÿþÂÿÿýè÷ÿÿþÂÿÿýTÿÿþÈÿÿþÂÿÿþÀÿÿþÂÿÿýDÿÿþÐÿÿþÂÿÿýìôÿÿþÂÿÿý3ÿÿþÙÿÿþÂÿÿþ¿ÿÿþÂÿÿý"ÿÿþåÿÿþÂÿÿýðñÿÿþÂÿÿýÿÿþóÿÿþÂÿÿþ¿ÿÿþÂÿÿøýÿÿþûÿÿþÂÿÿýôíÿÿþÂÿÿþðÿÿþíÿÿþÂÿÿþÀÿ ÿþÂÿÿþßÿÿþàÿÿþÂÿÿýöéÿ ÿþÂÿÿþÎÿÿþÕÿÿþÂÿÿþËÿ ÿþÂÿÿþ¾ÿÿþÍÿÿþÂÿÿý÷èÿ ÿýÏõÿÿþ®ÿÿþÆÿÿþÂÿÿþÀÿ ÿýäÍÿÿþœÿÿþÂÿÿþÂÿÿýóïÿ ÿøþÂòÿŒÿÿþÀÿÿþÂÿÿþÁÿ ÿúßË{ÿÿþÀÿÿþÂÿÿýè÷ÿ ÿûýkÿÿþÁÿÿþÂÿÿþÁÿ ÿþZÿÿþÇÿÿþÂÿÿýßüÿ ÿþIÿÿþÍÿÿþÂÿÿþÅÿ ÿþ8ÿÿþÖÿÿþÂÿÿýÙþÿ ÿþ(ÿÿþáÿÿþÂÿÿþËÿ ÿþÿÿþíÿÿþÂÿÿþÏÿ ÿþÿÿýüþÿÿþÂÿÿþÓÿ ÿþéþõÿÿþòÿÿþÂÿÿþÈÿÿýþËþåÿÿþåÿÿþÂÿÿýüßÿÿøþéØÊÂÁÿþÔÿÿþÙÿÿþÂÿÿùÐÁÉÔçúÿÿþÃÿÿþÏÿÿþÂÿ!ÿþ³ÿÿþÈÿÿþÂÿ!ÿþ¢ÿÿþÃÿÿýÒüÿ ÿþ‘ÿÿþÀÿÿþÀÿ ÿþÿÿþ¿ÿÿýþÈÿÿþpÿÿþÁÿÿýïâÿÿþ_ÿÿþÄÿÿýÕøÿÿþOÿÿþÊÿÿþÁÿÿþ>ÿÿþÒÿÿþÄÿÿþ-ÿÿþÝÿÿýôÝÿÿþÿÿþéÿÿýÚõÿÿþ ÿÿþ÷ÿÿþÂÿÿþúÿÿþ÷ÿÿþÃÿÿþêÿÿþèÿÿý÷ÙÿÿþÚÿÿþÜÿÿýßòÿÿþ¿ÿÿþÀÿÿþÀÿÿþuÿÿýþÆÿÿþÁÿÿý ÚÿÿýëâÿÿýøÖÿÿý+õÿÿýÔúÿÿýäîÿÿþgÿÿþÂÿÿþÆÿÿþ¥ÿÿýýÍÿÿþÀÿÿýÞÿÿýëèÿÿýûÒÿÿý5ùÿÿýÏüÿÿýæíÿÿüöÄÊþtÿÿþÃÿÿüÏÇçÿ ÿúØÀéÿÿý±ÿÿýûÑÿÿúòÍÀÊíÿÿüàÀåÿÿ ýäÿÿýçñÿ ÿùûÖÁÀÍýÿÿ ý>üÿÿýÊþÿ,ÿ þÿÿþÀÿ,ÿ ý½ÿÿýø×ÿ+ÿ ýëÿÿýáòÿ*ÿ ýIþÿÿþÆÿ*ÿþŽÿÿþÂÿ)ÿýÇÿÿý÷Ùÿ(ÿý"ðÿÿýÛõÿ'ÿÀ™ýˆ˜™<™ƒþ’™;™ƒþ™:™ƒþ„™;™ƒþ•™;™ýƒ™<™þ†™=™þ—™}™þ‹™<™ý’ƒ™;™ü—ƒƒ™;™ü…ƒƒ™:™þ‹ƒƒ:™þ“ƒƒ9™ý˜„ƒƒ9™þ‡ƒƒ8™þƒƒ7™þ”ƒƒ™û”‰„‘™,™þ„ƒƒ™ý–‰ƒƒý†—™)™þ‰ƒƒü–Œ„ƒƒþ’™'™þŽƒƒþŠ™%™ý•„ƒƒý†—™#™þ„ƒƒþŽ™!™þŠƒƒþˆ™™þ’ƒƒý„’™™þ—ƒƒþŠ™™þ†ƒ ƒý„–™™þ‹ƒ#ƒþ‘™™þ’ƒ%ƒþ†™™þ—ƒ'ƒý„•™™þ…ƒ)ƒþ‹™™þƒ+ƒý…–™ ™þ”ƒƒÀpþdp=p`þkp;p`þip:p`þbp;p`þlp;pý`fp44ý39UþKIIþH44þ3UþPIIþ?44ý5-UþTIIýJ544þ5 UIþ@44þ5 UþOIIþ644 UþTIIþC44þ3 UþJIIþ744þ3 UþNIIþC44 UþSIIþ844 UþJIIþE44ü3U UþLIIþ944 UþRIIþG44þU UIþ;44ý3U UþLIIþH44þ3U UþRIIþ944 UIþ544þ5U UþLIIþ=44 UþPIIþH44ý5U UþTIIþ944ýUU UþJIIþD44ü3UUþMIIýH644þ3UþRIIþA44þ5UþTIIþH44þ3UþJIIþ;44þ+UþNIIþH44þ3UþSIIþ844UýTJIIþD44þ2UþKIIýH644UþPIIþ@44þ9UþSII4þ3UþJIIþ;44þ@UþKIIþF44ýUPIIþ744 þTIIþA44þ5þJIIýH544 Iþ=44þ9 IþH44 Iþ:44þ@ IþE44þ5 Iþ644 IþA44þ2 Iþ544þ5 Iþ<44þ- IþH44þ5Iþ844IþE44þ5Iþ644Iþ@44þ7I4þ3Iþ;44þ9IþG44þ3Iþ844þ5IþB44I4Iþ?44þ.IýH544Iþ944þ+IþF44Iþ644þ5IþA44þ2ÿýýéÿÿþÉÿÿþRÿþÁÿÿþÎÿÿýÙÿþÌÿÿýÖþÿÿþcÿýúïÿÿþÇÿÿýä ÿþÅÿÿýßûÿÿþsÿþÆÿÿþÂÿÿýîÿýô÷ÿÿýèõÿÿþƒ ÿþÊÿÿþÀÿÿýô ÿþÂÿÿïÿþ” ÿýëüÿÿþ¿ÿÿýú# ÿþÑÿÿýôéÿÿþ¤ ÿþÀÿÿþÁÿÿýý1 ÿþãÿÿýúáÿÿþµ ÿþÙÿÿþÅÿÿüAÿ ÿþ¿ÿÿýüÖÿÿüÉÿ ÿþÖÿÿþÈÿÿýNÿ ÿþâÿÿþÔÿÿýÐÿ ÿþÀÿÿýÔþÿÿþ#ÿ ÿþÐÿÿþÑÿÿþSÿ ÿýöùÿÿýçöÿÿþ5ÿ ÿþÀÿÿþÃÿÿýëÿ ÿýÌýÿÿþÔÿÿýjÿ ÿýåïÿÿýüØÿÿüÑÿÿýüÑÿÿþÂÿÿüAÿÿþ¿ÿÿýðëÿÿþ®ÿýÎýÿÿþÀÿÿý÷"ÿýíçÿÿýÞúÿÿþ†ÿýþÊÿÿþÊÿÿýå ÿþÁÿÿþÎÿÿþ_ÿýÚöÿÿýûÞÿÿýÈÿýòàÿÿþÀÿÿýþ8ÿþÆÿÿýìðÿÿþ¢ÿþÅÿÿþÃÿÿýóÿýÝôÿÿýÙüÿÿþ|ÿýöÚÿÿýþÑÿÿýÞÿþÁÿÿþÇÿÿþTýÿÈÿÿýõåÿÿþ¿ýäïÿÿþ¿ÿÿýû+þÑÿÿýåõÿÿþ— ÿþÄÿÿýì ÿýÑþÿÿþp ÿýýÖÿÿýÓ ÿþÃÿÿþD ÿýòêÿÿþ´ ÿþ¿ÿÿýø$ ÿýäöÿÿþ‘ ÿþÄÿÿýì ÿþÊÿÿþjÿýûÜÿÿýËÿþÄÿÿýþ:ÿýíîÿÿþ¨ÿþÀÿÿýõÿýÚûÿÿþÿþÐÿÿýà ÿþÉÿÿþZÿýúáÿÿýÂÿþÀÿÿýý1ÿýèóÿÿþÿþÃÿÿýðÿýÕýÿÿþvÿýþÓÿÿýÙÿþÅÿÿþOÿýôæÿÿþ¸ÿþ¿ÿÿýú)þ]\\þqƒ'ƒþ]\\þ}ƒ&ƒþ`\\ý^ƒ%ƒþ_\\þeƒ%ƒ\þrƒ$ƒ\ý]~ƒ#ƒþU\\ý_‚ƒ"ƒþZ\\þfƒ"ƒþ]\\þuƒ!ƒþ[\\þ€ƒ ƒþZ\\þ`ƒ ƒ\þgƒƒþ[\\þwƒƒý€[\\ý]ƒƒþY\\þbƒƒ\þkƒƒþ[\\ýuƒƒý@[\\ù^dmt|‚ƒƒý^]\ \ú_gpx~ƒ ƒý\]\\ø]alt|‚ƒƒûa[\[\\ø`foy~‚ƒ"ù@Z^][[\\þ])ùUZ]\[]\ \1úZ^]\]\\7üUZ]\\>þZ?þEDDþS`'`Dþ\`&`ý@CDDýF_`%`þADDþJ`%`þEDDþU`$`Dþ]`#`þ@DDýE_`"`þFDDýM_`!`DþW`!`Dþ]` `þKDDþG` `þCDDþL``þEDDþX``þ€DDýE_``þCDDþG``þCDDþP``þEDDýW_``þ@DDøEIPU[__`` DùEMSX\_` `þCDDùIPW[^_``ûIDDCDDøEKRX\``"þ@DDþEDDþE)ûDFEEDD1þKD D7ûUDFEDD>þK?þ344þ@I'Iþ344þFI&Iý@344ý5HI%Iþ544þ:I%Iþ344þ@I$Iþ344þFI#Iþ+44þ6I#Iþ244þ9I"I4þAI!I4ý5GI Iþ-44ý6HIIþ244þ;IIþ544þCII4þHIIþ744þ7IIþ544þ;IIþ544üAHHIIþ@44ù58=AEGIIþ34 4ù6:?BGHI Iþ244ø59=AFHHIIû134344ø6:?DGHI"þ@554*ù3233454 41ú-3553447û+55344>þ-?þUÿÿþÄÿ'ÿþšÿÿþÄÿ&ÿýÐÿÿýôßÿ%ÿý+õÿÿýÖùÿ$ÿþdÿÿþÀÿ$ÿþ¤ÿÿýþÈÿ#ÿý Ùÿÿýïäÿ"ÿý3ùÿÿýÑûÿ!ÿþqÿÿþ¿ÿ!ÿý°ÿÿýýÍÿ ÿýáÿÿýêéÿÿý=üÿÿýÏüÿÿþ~ÿÿþ¿ÿÿý»ÿÿýûÒÿÿýçÿÿýåíÿÿýHþÿÿýÊþÿÿþ‘ÿÿü¿ÔðÿÿýÆÿÿøøÜÆÀÄÖôÿÿýíÿ ÿøïÒÂÀÊâüÿ ÿý=íÿÿøïϽ¸»Çéÿÿúx¹ßýÿÿ÷ýàÆº¹ÁÒ÷"÷"Df‘»Ýþÿÿþú)ø3Uw¢Ìóÿ ÿ1øÿøðÖÆÀÆÖôÿ>ÿøéÍÂÀÊâýÿ=ÿøøÜÆÀÂÒòÿ$ÿù3^ˆªÌ÷ÿÿøïÒÂÀÆÜüÿÿø"Do™»ÝÿÿøúâÍÁÂÍèÿÿ ø3U€ªÌõÿÿøïÖÆÀÆÖöÿÿøDfˆ³Ýýÿÿ÷ûâÍÂÁÍâþÿ ÿø+Uw™ÄòÿÿøøÜÆÀÄÖôÿÿø44þ5#IþH44%Iþ:44þ@$IþE44&Iþ644'IþA44þ2&IýH544(Iþ<44þ7'IþG44þ5(Iþ844*ýHC44*4þ3*4þ5*4,4þ2,ÿýçöÿÿþ’ÿþÆÿÿýëÿþÐÿÿþkÿýüØÿÿýÑÿþÂÿÿþBÿýñëÿÿþ¯ÿþÀÿÿý÷" ÿýÞùÿÿþ‡ ÿþÊÿÿýå  ÿþËÿÿþ` ÿýúÝÿÿýÉ ÿþÀÿÿýþ8 ÿýíðÿÿþ£ ÿþÁÿÿýó ÿýÙüÿÿþ| ÿþÏÿÿýß ÿþÉÿÿþY!ÿý÷âÿÿþ¿"ÿþ¿ÿÿýü/"ÿýäòÿÿþ#ÿþÁÿÿýñ#ÿýÒþÿÿþq$ÿýýÖÿÿýÔ$ÿþÄÿÿþI%ÿýòêÿÿþµ&ÿþ¿ÿÿýø$&ÿýßùÿÿþ'ÿþÇÿÿýç'ÿþÌÿÿþf(üÿûÜÿÿýË(ýâÁÿÿýþ;)ÿþ©*ÿýõ*ÿýùT+ûûå»G,YQ,(ʦ asteroid 1ÿ     0$4ëʦ5myʦ5CBöFçU¿UÏd¼mLyç~¢…Ë‹9] þ`\\þ]\\\þ@\\þ]\\þ_ƒƒ\þpƒƒþU\\þƒƒ\þ_ƒƒ\þoƒƒ\þ~ƒƒþ[\\þ_ƒƒ\þnƒƒþ[\\þƒƒþZ\\þ^ƒƒþ[\\þlƒƒ\þ}ƒƒþ^\\þ^ƒƒþ]\\þlƒƒ\þ}ƒƒþ]\\ý]‚ƒƒ\þkƒƒ\þ|ƒƒ\þ]ƒ ƒþ[\\þhƒ ƒ\þzƒ ƒþZ\\þ]ƒ!ƒþ[\\þhƒ!ƒþ[\\þ{ƒ!ƒþX\\þ]ƒƒû„†ˆ‰þ]\\þgƒƒü‹˜—™™\þyƒƒþ•™™\ý]‚ƒƒ™\þfƒƒþˆ™™\þxƒƒþ‘™™þa\\þ]ƒƒþ—™™\þeƒƒþ…™™\þwƒƒþŠ™™þU\\ƒþ“™™þ[\\þfƒƒþ—™™\þwƒƒþ†™ ™þ[\\þ‚ƒƒþ™ ™þ[\\þcƒƒþ–™ ™þ[\\þwƒƒþ˜™ ™þ]\\þƒƒþ‰™ ™þ]\\þdƒƒþ’™ ™þ]\\þuƒƒþ—™ ™þU\\þƒƒþ…™ ™\þaƒƒþŒ™ ™\þtƒƒþ•™ ™þm\\þƒƒ ™\þ`ƒƒþ‡™ ™\þtƒƒþ‘™ ™þU\\þ€ƒƒþ–™ ™þ[\\þaƒƒþ„™ ™\þrƒƒþŠ™ ™ þ@\\þ€ƒƒþ“™ ™ þZ\\þ_ƒƒþ˜™ ™ þ[\\þqƒƒþ†™™ þU\\þ€ƒƒþ™™ þ^\\þ`ƒƒþ–™™ þ]\\þoƒƒ™ \þ€ƒƒþˆ™™ þ]\\þ_ƒƒþ™™ \þoƒƒþ˜™™ þ@DDþFDDDþ@DDþEDDþG``DþS``þUDDþ]``þCDDþG``þCDDþR``þEDDþ]``DþF``DþP``þCDDþ\``þFDDþF``þEDDþP``Dþ]``þCDDýE_``þCDDþN``Dþ\``DýE_``þCDDþP``þCDDþ\``þGDD!`DþN` `Dþ[` `Dþ_` `þEDDþM`!`DþY`!`þFDD`aýdeþCDDþK``üfnoppþCDDþZ``þmppþGDD`pDþK``þdppDþY``þippþIDDþ_``þoppþEDDþK``þappDþX``þfppþGDDþ_``þlppþCDDþJ``þoppþCDDþW``þbp pþIDDþ_``þhp pDþI``þnp pDþU``þap pþFDDþ_``þdp pþEDDþI``þkp pDþU``þop pþ9DDþ_``þbp pþCDDþI``þgp pþCDDþU``þmp pþIDDþ^`` pDþG``þcp pDþT``þip pþUDDþ^``þop pþEDDþG``þap pDþS``þep p þ@DDþ^``þlp p þCDDþG``p þCDDþS``þapp þUDDþ]``þipp DþF``þnpp DþR``p þEDDþ]``þcpp þFDDþE``þkpp DþQ``p þ044þ.444þ@44þ544þ6IIþ344þ?IIþU44þFIIþ244þ6IIþ344þ?II4þGIIþ244þ5IIþ344þ>IIþ344þFIIþ244þ5IIþ344þ>IIþ344þFIIþ244þ5IIþ344þIIþKUU þU44þGIIþPUU þ344þ5IIþSUU 4þ?IIþTUU 4þGIIþKUU þ344þ6IIþQUU 4þ>IIþSUU û™æýÿÿýÖÿÿþŠÿÿýëÿÿþ?ÿÿýîúÿÿþ•ÿÿþÂÿÿýçÿÿþËÿÿþ=ÿÿýîúÿÿþÿÿþÃÿÿýãÿÿþÉÿÿþ8ÿÿýñøÿÿþ‹ÿÿþÅÿÿýßÿÿþÇÿÿþ3ÿÿýôöÿÿþ†ÿÿþÆÿÿþÚÿÿþÆÿÿþ.ÿÿýöôÿÿþÿÿþÈÿÿþÕÿÿþÄÿÿþ)ÿÿý÷óÿÿþ}ÿÿþÊÿÿþÐÿÿþÃÿÿþ$ÿÿýùðÿÿþxÿÿþËÿ ÿþËÿÿþÂÿ ÿþ"ÿÿýûêÿ ÿþsÿÿþÎÿ!ÿþÆÿÿþ¿ÿ!ÿùþÿÿüêÿÿûùéÜÒþnÿÿþÏÿÿùÎÈÑÜéúÿÿþÁÿÿþÀÿÿþÃÿÿùýÿÿþçÿÿýþéÿÿþiÿÿþÒÿÿþÛÿÿþ¼ÿÿþÀÿÿþÀÿÿùüÿÿþãÿÿþÍÿÿþdÿÿþÖÿÿýôøÿÿþ·ÿÿþ¿ÿÿþËÿÿýúÿÿþâÿÿþÀÿÿþ_ÿÿþØÿÿþÝÿÿþ²ÿÿþ¿ÿÿþåÿ ÿýøÿÿþÞÿÿþÂÿ ÿþZÿÿþÛÿÿþÇÿ ÿþ­ÿÿþ¿ÿÿýûðÿ ÿý öÿÿþÙÿÿþÓÿ ÿþUÿÿþÝÿÿþ¿ÿ ÿþ¨ÿÿþ¿ÿÿþÓÿ ÿý óÿÿþ×ÿÿýîüÿ ÿþPÿÿþáÿÿþÇÿ ÿþ£ÿÿþÀÿÿþÂÿ ÿýðÿÿþÒÿÿþãÿ ÿþKÿÿýåþÿÿþÝÿ ÿþžÿÿþÀÿÿþÀÿ ÿýïÿÿþÐÿÿþÊÿ ÿþFÿÿýèýÿÿý÷õÿ ÿþ™ÿÿþÁÿÿþÍÿ ÿ ýëÿÿþÏÿÿþÀÿ ÿ þAÿÿýëüÿÿþÙÿ ÿ þ”ÿÿþÂÿÿýèþÿ ÿ ýçÿÿþÍÿÿþÃÿÿ þ<ÿÿýíúÿÿþÅÿÿ þÿÿþÃÿÿýýíÿÿ ýãÿÿþÊÿÿþÖÿÿ þ7ÿÿýïúÿÿþ¿ÿÿ þŠÿÿþÄÿÿþÐÿÿ\þƒý„‡ƒ/ƒô†ˆ‰‹Ž’”––—˜™™)ƒü…’•˜˜þš™ ™(ƒý„—™™ ƒý…„ƒƒý„—™™öŒ’”––˜™˜™™ú˜–’ˆƒƒý„—™'™ùš—”ˆ…ƒ ƒý„—™.™ù˜—”‰„ƒƒý„—™6™ø—’‹†ƒ„—™;™þ˜™ê™—þ˜™-™þ†ƒ ƒþŠ™,™þ’ƒƒþ—™+™ý—„ƒ ƒþ†™,™þ‰ƒƒþ“™+™þ–ƒƒ,™ý˜†ƒƒþŒ™+™þ‘ƒƒþ—™*™þ˜ƒƒþ†™+™þ‰ƒƒþ“™*™þ•ƒƒý„˜™)™ýš…ƒƒþ™#™Dþ`ýab`/`óadefijlmoppopp)`øakmnooqp p(`ýaopp `a`ýaoppõgjjlmooppoppûolhd``þop(púnlhea` `þop/púolhda``ýaop6pøojfb`anp;pþopùpþop-pþb` `þfp,pþk``þnp+pýoa` `þbp,pþe``þlp+pþm``,pýob``þgp+pþj``þop*pýna``þcp+pþe``þlp*pþm``,pþb``þip#p4þIJ0I÷JKMNOQRSUU)IúJQSTTUU(IþHUU'IýJTUUøOQQRSUTUUüQNKIIýJTU'UùTSRPMJI IþTU/UúSRNKJIIýJSU6UøTQNJIJTU7UþTU-UþLI IþMU,UþQIIþTU+UþTIIþJU,UþMIIþQU+UþTIIþJU,UþJIIþNU+UþQIIþTU*UþSIIþLU+UþMIIþRU*UþRII+UýTJIIþPU#Uþÿýòßÿ/ÿóéÜÒÊÂÀÁÄÊÖé÷ÿ+ÿøô¿ÂÈÒÝíÿ6ÿýóÓÿÿýðùÿÿýöÎÿÿõÆÁÀÁÄÊÒÜé÷ÿÿùéÊÀÄÜüÿÿýôÑÿ'ÿùïÐÁÂÔôÿ ÿýøËÿ.ÿùéÍÁÄÖ÷ÿÿýöÍÿ4ÿöúÜÆÀÊâÿ÷Ìÿ;ÿýäÛÿèÿþæÖ Öþ×ÿ,ÿýôåÿ ÿþËÿ,ÿþ¿ÿÿþÉÿ+ÿýÝùÿ ÿýäýÿ*ÿýþÐÿÿþ¿ÿ+ÿþÅÿÿýúéÿ*ÿýñéÿÿþÇÿ+ÿþÀÿÿþÎÿ*ÿýÙûÿÿýÞþÿ)ÿýþÒÿÿþÀÿ*ÿþÃÿÿýõðÿ)ÿýïëÿÿþÃÿ#ÿ\ý]^)\)\þ^'\(ƒþw\\'ƒþg\\þ_%ƒý^\\&ƒþx\\þ]$ƒþh\\þ_#ƒý‚^\\þ]#ƒþx\\#ƒþh\\þ_!ƒý‚^\\þ]!ƒþx\\þ[ ƒþf\\ ƒý^\\ ƒþx\\þ]ƒþh\\ƒþ^\\þ€ƒþy\\ƒþh\\ƒþ^\\þ€ƒþy\\þ[ù‰Œ‘“’ƒƒþg\\þZ™þŽƒƒþ^\\þ€™ý˜†ƒƒþy\\þ]™þ—ƒƒþg\\þZ™þƒƒý‚^\\þU™þ‡ƒƒþ{\\™þ—ƒƒþf\\þZ ™þƒƒþ^\\ý[U ™þˆƒƒþ{\\þ[ ™þ˜ƒƒþh\\þ^ ™þ’ƒƒþ^\\ý[U ™þˆƒƒþ{\\þ] ™ý˜„ƒƒþi\\þ^ ™þ’ƒƒý‚^\\ý[U™þˆƒƒþz\\™ý—„ƒƒþi\\þ[™þ’ƒƒý‚^\\þU™þ‰ƒƒþ|\\þ[™þ„ƒƒþj\\þ[ ™þ“ƒƒý‚_\\þU ™þ‹ƒƒþ|\\ ™ý˜„ƒƒþj\\þ_ ™þ•ƒƒý‚_\\þU ™þŠƒƒþ|\\ ™ý˜„ƒƒþj\\þ_ ™þ•ƒƒþ_\\þU™þŠƒƒþ{\\þ]™þ’ƒƒþj\\þ_™þ’ƒƒþ_\\þU™þ’ƒƒþ|\\™þ’ƒƒþk\\þ]™þ’ƒƒþ_\\þf™þ’ƒƒþ}\\þ[™þ’ƒƒþl\\þ]™þ’ƒƒþ_\\þf™þ’ƒƒþ|\\þ]™þ’ƒƒþl\\þ[™þ’ƒƒþ_\\üf™™þ’ƒƒþ}\\™þ’ƒƒþl\\ý[™™þ’ƒ ƒþ_\\fD*DþC(DþB'DþC'`þWDD'`þKDDþB%`þEDDþC%`þXDDþE$`þMDDþB#`ý_EDD$`þXDD#`þMDDþB!`ý_EDD"`þYDDþC `þMDDþG`ý_EDD `þXDDþE`þLDDþG`ý_FDDþ€`þYDD`þLDDþG`þFDDþ€`þYDDùdgijjk``þLDDþEpþh``þFDDýE€pþb``þYDDþCpþn``þLDDþEpþh``ý_EDDýEUpþb``þYDDþEpþn``þLDDþE pþi``ý_FDDþU pþd``þZDD pþo``þLDDþC pþi``ý_FDDþU pþd``þZDD pýoa``þNDDþC pþk``ý_FDDþUpþc``þYDDþCpýoa``þNDDþCpþl``þ_DDþUpþd``þ[DDþEpýoa``þNDDþC pþl``þFDDþU pþe``þ[DD pýqa``þNDDþA pþl``þEDDþU pþg``þ[DD pýoa``þNDDþA pþm``þEDDþUpþe``þYDDþCpþj``þNDDþApþj``þEDDþUpþj``þ[DDþEpþj``þODDþFpþj``ýaGDDþ3pþj``þ[DDpþj``þNDDþFpþj``ýaGDDþ3pþj``þ[DDþCpþj``þNDDpþj``ýaGDDü3ppþj``þ\DDüEppþj``þODDþppþj``ý_FDD34ü354)4)4þ9'4þ5'IþA44þ5&Iþ:44þ3%Iþ544þ5%IþB44þ3$Iþ;44þ3#IýH544$IþD44þ3"Iþ;44þ3!IýH544"IþB44þ5 Iþ944þ2IýH544 IþB44Iþ;44þ2IýH544IþD44Iþ;44þ2Iþ544IþD44þ3ùLONPRQIIþ944þ7UþPIIþ544UþJIIþC44þ3UþTIIþ:44þ7UþPIIýH644þUUþJIIþC44þ5UþTIIþ:44þ7 UþPII4þU UþLIIþE44 UþTIIþ:44þ6 UþPII4þU UþKIIþE44 UIþ;44þ6 UþQII4þUUþMIIþD44þ3UýTJIIþ;44þ7UþQIIþ544ý5UUþMIIþD44þ3UþJIIþ<44þ7 UþRIIþ644ý5U UþLIIþD44þ5 UþHIIþ;44þ5 UþRIIþ644þU UþMIIþF44 UþJIIþ;44þ5 UþTIIýJ644þUUþNIIþE44 UþQIIþ;44þ5UþQIIýJ644þUUþQIIþE44þ3UþQIIþ=44UþQIIþ644þ3UþQIIþE44þ3UþQIIþ<44UþQIIþ644þ3UþQIIþE44þ5UþQIIþ<44þ3UþQIIþ644ü3UUþQIIþF44UþQIIþ<44ý3UUþQIIýH6443ÿüä¥1)ÿýòE(ÿýï'ÿý½&ÿþ¿ÿÿþa&ÿýýÒÿÿýô#%ÿýÝöÿÿý½$ÿþÀÿÿþh$ÿýýÑÿÿýô##ÿýÞöÿÿý¾"ÿþÀÿÿþi"ÿýýÑÿÿýô#!ÿýÞöÿÿý¾ ÿþÀÿÿþj ÿýýÑÿÿýô$ÿýßöÿÿý¿ÿþÀÿÿþkÿýýÐÿÿýõ$ÿýâôÿÿýÄÿþÀÿÿþlÿýýÐÿÿýõ$ÿýâôÿÿýÄÿþÀÿÿþmùÓÉÃÀÀ¿ÿÿýüÎÿÿýõ%ÿþÂÿÿýâôÿÿýÅÿýðçÿÿþ½ÿÿþnÿýÎþÿÿýýÐÿÿýõ%ÿþÂÿÿýÞóÿÿýÅÿýõßÿÿþÁÿÿþoÿýÎþÿÿýýÊÿÿýõ% ÿþÀÿÿýãóÿÿýÆ ÿýøÛÿÿþÁÿÿþp ÿýÒýÿÿýýÊÿÿýõ& ÿþ¿ÿÿýãóÿÿýÆ ÿýùÙÿÿþÁÿÿþq ÿýØùÿÿýþÌÿÿýö& ÿþ¿ÿÿýäóÿÿýÆ ÿýûÕÿÿþÂÿÿþrÿýÝ÷ÿÿýþÌÿÿýø*ÿþÀÿÿýäòÿÿýÇÿýýÑÿÿþÂÿÿþsÿýÞöÿÿýþËÿÿýø* ÿþÀÿÿýçðÿÿýÇ ÿýýÐÿÿþÂÿÿþt ÿýâóÿÿþËÿÿýø+ ÿþÁÿÿýçïÿÿýÈ ÿýþËÿÿþÂÿÿþu ÿýçïÿÿþËÿÿýø+ ÿþÃÿÿýèïÿÿýÈÿýþÍÿÿþ¿ÿÿþvÿþÀÿÿþÊÿÿýø+ÿþÀÿÿýèïÿÿýÈÿþÀÿÿþ¿ÿÿþwÿþÀÿÿþÈÿÿýø,ÿþÀÿÿýèîÿÿýÍÿþÀÿÿþÄÿÿþxÿþÀÿÿþÈÿÿýø,ÿþÀÿÿýèîÿÿýÎÿþÀÿÿþÄÿÿþyÿþÀÿÿþÈÿÿýø-ÿþÀÿÿýèîÿÿûÎÿÿþÀÿÿþÄÿÿüzÿÿþÀÿÿþÇÿÿüù-ÿÿþÀÿÿìÿþ΀€€€ þ[\\þ~ƒƒþ„™™ \þ^ƒƒþ‹™™ \þmƒƒþ“™™ \þ~ƒƒþ˜™™ þ^\\þ^ƒƒþ†™™ þ]\\þmƒƒþ™™ þ[\\þ~ƒƒþ–™™þ]\\ý^‚ƒƒ™þ]\\þkƒƒþ‹™™\þ}ƒƒþ“™™\ý]‚ƒƒþ˜™™\þiƒƒþ…™™\þ|ƒƒþ™™þZ\\þ]ƒƒþ–™™\þiƒƒ™\þzƒƒþ‡™™\ƒþ™™þ[\\þhƒƒþ—™™\þ{ƒƒþ„™™\ƒþ‹™™\þhƒƒþ•™™\þyƒƒþ˜™™þa\\þ]ƒƒþ†™™\þeƒƒþ™™\þxƒƒþ–™™þU\\þ]ƒƒþ˜™™þ[\\þeƒƒþ‰™™\þwƒƒþ’™™þ[\\þ‚ƒƒþ—™™þ[\\þcƒƒþ„™™þ[\\þwƒƒþŠ™™ý]\\þ‚ƒƒþ‡™™ý]\\þcƒ ƒý…˜™™ý]\\þuƒ!ƒý„–™™þU\\þƒ"ƒý„•™™\þbƒ%ƒþ’™™\þuƒ&ƒþ™™þ]\\þƒ'ƒþŒ™™\þ}ƒ(ƒþŠ™™\ý]ƒ(ƒýˆš™ ™þZ\\ý^ƒ(ƒý†˜™ ™û—’Z\\ý_ƒ(ƒý„˜™™÷—‰„ƒƒ\\ý`‚ƒ(ƒø„•™—‰„ƒƒþ[\\ýf‚ƒ)ƒþ„ƒƒþ]\\þeƒ4ƒ\þkƒ3ƒþf\\þnƒ2ƒþf\\þrƒ1ƒþ^\\þwƒ0ƒþ^\\ý]|ƒ/ƒþZ\\ý]~ƒ.ƒ þZ\\ý^€ƒ,ƒþ† þ[\\ý`ƒ+ƒþŽ \ý_ƒ+ƒ þ[\\þaƒ+ƒ þ]\\þeƒ*ƒþ]\\þiƒ)ƒþU\\þkƒ(ƒþU\\þpƒ'ƒýb]\\þuƒ&ƒþa\\þyƒ%ƒþ]\\ý]|ƒ$ƒþ]\\ý]~ƒ#ƒþ[\\ý^ƒ"ƒ þCDDþ^``p þBDD`þgpp þCDDþQ``þlpp Dþ[``p þCDDþE``þcpp þCDDþQ``þjpp þEDDþ\``þnppDýE_``pDþO``þeppDþ[``þlppþGDDþE``þoppþEDDþN``þappDþZ``þhppDþE``þmppþEDDþL``pDþY``þdppþGDD`þjppþCDDþL``þoppDþY``pþGDD`þeppDþM``þmppDþY``þoppþIDDþ_``þbppþEDDþL``þhppDþX``þnppþGDDþ_``þappþCDDþK``þdppþCDDþX``þkppþIDDþ_``þoppDþJ``þappDþW``þfppýFDDþ_``ýcoppýEDDþI` `ýboppþDDþW`"`þoppþ9DDþ^`"`ýamppþCDDþI`%`þlppþCDDþU`&`þjppDþ^`'`ýgoppDþ]`(`þgppDýE^`(`ýdop pþEDDýE^`(`þap püojDDþG`)`þappüoie``þCDDþH`*`úmooie``þEDDýJ_`(`a `DþL`4`DþN`3`þ3DDþP`2`ýMEDDþS`1`þCDDþX`0`þBDDþ[`/`þEDDýE]`.` þBDDýE^`,`þb þEDDýF_`+`þi þEDDýG_`+` þCDDþI`+` DþJ`*`DþL`)`þUDDýO_`'`þUDDþS`'`þ;DDþW`&`þIDDþX`%`þFDDþZ`$`þFDDýE]`#`DýE^`"` þ344þFIIþJUU þ344þ5IIþNUU 4þ=IIþRUU þ344þFIIþTUU þ244þ5IIþKUU þ344þI2Iþ344þ?I1Iþ644þCI0Iþ944þDI/Iý7544þGI.I 4ý5GI,IþJ þ544þ5I,IþO 4ý6HI+I þ544ý8HI*I 4ý8HI)Iþ344þ:I)IýU544þ44UþQIIþKIIþ644UþQIIûJRUQIIþF44UþQIIýMTUUþMIIü<44UUþQIIþTUUþJIIüH64UUþQIIþOUUþRIIýF4UUúQIILTUUþLIIþU%UþQIIýH5U%UþJIIýA4U$UþSIIüH64U$UþJIIüD44U#UþQIIü644U#UþJIIþE44#UþRIIþ844#UþJIIþF44"UþQIIþ;44þ5U!UþKIIþH44þ2U UþRIIþ=44þU UþJIIþH44ý5UUþQIIþ?44ý@UUþJIIþH44UþRIIþB44ü.UUþJIIþ644þ5UþRIIþD44þ.UþKIIþ644øKNNQRTTUUþRIIþE44þ5I÷JKNNQRTTU UþKIIþ844IôJKNNQRTTUURIIþG44þ54Iþ;443IþG443Iþ>443I42Iþ?44þ31IýH544þ31IþB44þ.1Iþ6440IþC44þ.0Iþ644 /IþF44þ5/Iþ744 .IþH44þ5 .Iþ<44 ÿþÀÿ ÿþÁÿÿþ{ÿÿþÀÿ!ÿþÇÿÿþùÿÿþÀÿÿýáûÿÿýçêÿÿþÀÿÿûôÁû¿ÿÿþÅÿÿþÀÿÿùÍáÿÿûÔÿÿþÇÿÿþÀÿÿýìÆÿÿýÝöÿÿýíëÿÿþÀÿÿüþÂîÿÿþÀÿÿþÆÿÿúÀÿÿåÉÿÿýüÓÿÿþÅÿÿûÀùÀöÿ ÿýâóÿÿþíÿÿýÆÔÿ ÿþÁÿ=ÿýþÎÿ=ÿýåñÿ=ÿþÃÿ>ÿþÆÿ=ÿýíêÿ=ÿþÉÿ>ÿþÇÿ=ÿýíéÿ<ÿýîòÿ<ÿþ¿ÿ<ÿýîòÿ<ÿþ¿ÿ<ÿýïñÿ<ÿþÀÿ<ÿýïñÿ<ÿþ¿ÿ<ÿýðñÿ<ÿþ¿ÿÿþßÿ%ÿðÿþÂÿ%ÿþÀÿÿýìøÿ$ÿýóîÿÿþ¿ÿ%ÿþ¿ÿÿýóïÿ$ÿýóíÿÿþÀÿ%ÿþ¿ÿÿýùæÿ$ÿýóíÿÿþÄÿ%ÿþÀÿÿýþÚÿ$ÿýôíÿÿþËÿ%ÿþÀÿÿþÌÿÿþÂÿ ÿýöèÿÿþ×ÿÿþLÿ ÿþÀÿÿþÄÿÿýÔÿÿýõêÿÿýßûÿÿý`ÿÿþÀÿÿþÁÿÿüàÿÿýõéÿÿýé÷ÿÿüpÿÿþÁÿÿþÁÿÿûì ÿÿýöéÿÿýôîÿÿþƒÿþÁÿÿþÃÿÿýöÿýöèÿÿýûãÿÿþ—öÜÍÄÀÁÆÒâúÿÿþÁÿÿþÅÿÿýü"ÿõïÜÍÄÀÁÆÒâúÿÿýöèÿÿýþÙÿÿþ«ÿôïÜÍÄÀÁÆÒâúÁÿÿþÌÿÿþ5ÿùÿþÎÿÿþ¿3ÿþÖÿÿþJ3ÿþÇÿÿþÏ2ÿýáüÿÿþ^2ÿþÁÿÿýá1ÿýìõÿÿþr1ÿþÀÿÿýì 0ÿýôîÿÿþ„0ÿþÁÿÿýö/ÿýûâÿÿþ˜/ÿþÅÿÿýü".ÿýþÙÿÿþ¬ .ÿþÍÿÿþ5 .ÿþÌÿÿþÀ þ[ý\fý\]\þ^\þf\\þ`\\þfþ}\\þ[ýƒl\\þZƒþ`\\ùUƒƒ~\\ƒþl\\ýZƒƒþ_\\þƒƒþ~\\þUƒƒþ]\\þUƒƒþu\\þƒƒý‚^\\ý]ƒƒþx\\ýaƒƒþ`\\ƒþ|\\ù]ƒƒc\\ýƒ~\\ýƒg\\þ\\þ]þm\\\\þ@\\þf\\þ]\ý\Zþ\þ] þDýD3DDþCDþ3DþCDþBþGDDýC3þ\DDþEý`ODDþFü`_FDDøCU``[DD`þPDDýF``ý_GDDþ``þ]DDþU``ýaEDDþU``þWDDþ``þ_DDýC``þXDDýI``þHDD`þZDDùF``IDDý`]DDþGý`LDDþ^DDþODDDþCDþ@DþEDþMDþEDþFDDþDþE þ3ý43ý434þ24þ34þ34þ3þ6443þF44þ5ýI=44þ2ýIH44ø3+IIF44Iþ>44ý2IIýH744þIIþG44þ+II4þ+IIþA44þIIþ544ý3IIþD44ý1IIþ644ù3IIE44ù6II944þ3ýIG44þ6ýI:44þI44þ2þ>44þ544þ54þ@4þ54þ34þ54þ.ý45ý45þ5þ6 þ-ýÏýÿ|üÿù.ÿýÏÿþ}ÿýû2þêÿÿýÐþÂÿÿþ~ýÿÄÿÿýû3üÿéêÿÿøÐÿÿÁÿÿüÿÿþÆÿÿüû3ÿÿýíîÿÿý¦ÿÿþÌÿÿýñÿÿùëúÿÿûÿÿþ¿ÿÿýÛÿÿýñòÿÿýÿÿþÀÿÿøöÿÿùçÿÿù•ÿÿÃÿÿøû!ÿýÝÿÿþ©ýÿÊÿÿýþ/ýÿÐÿÿþ¼þÓÿÿþGþÇÿÿþÎþýÿÿþ[ÿýàÿþoÿýë ÿþ‚üÿöýÿ–ýü"þªþ4þ[\\ý_‚ƒ!ƒþ[\\ý`‚ƒ ƒ\þcƒ ƒ\þgƒƒ\þhƒƒýU[\\þnƒƒþU\\þrƒƒþU\\þwƒƒþX\\ý]zƒƒþ]\\ý]~ƒƒþ^\\ý]€ƒƒ\ý^ƒƒ \ý_ƒƒ!þ]\\þbƒƒ"þ]\\ýe‚ƒƒ#\þgƒƒ#þU\\þmƒƒ$þf\\þoƒƒ%þ[\\þuƒƒ&þ^\\þxƒƒ'þ]\\ý]}ƒƒ(þZ\\ý]€ƒƒ)þ[\\ý^€ƒ ƒ*þ]\\ý_ƒ ƒ+þ]\\þ`ƒ ƒ,\þbƒ ƒ-\þfƒ ƒ.þ[\\þhƒ ƒ.þ€\\þmƒƒ/ýU[\\þrƒƒ0ýb]\\þwƒƒ1ýY]\\þyƒƒýr1ýX]\\ø}ƒƒxe\\2\ü^o^\\4þ]\\5\þ[5\ü][Z7ú`\]]mþCDDýG_`!`þEDDýH_` `DýIa``DýL_``þEDDþM``þUDDþR``þ9DDþS``DþX``þEDDþ[``DýE]``þCDDþ]``Dþ_`` þEDDýF_``!þCDDýIa``"DþJ``#DþL``#þUDDþQ``$ý3EDDþQ``%þIDDþW``&þCDDþX``'þFDDþ\``(þEDDýE]``)þCDDýE^` `*þFDDýF^` `+þCDDýH_` `,DýIa` `-þEDDýK_` `.þEDDþM` `.þ€DDþP``/þUDDþU``0þ;DDþW``1þ@DDþZ``ý^U1þFDDø]``ZJDD2þBDDüEQFDD4þFDD5 D6þEDDýCF7ú@DEEIþ244þ7I"Iþ544þ6I!I4þ8I I4þ9II4þ:IIþU44þ=IIý9544þ?IIþ344þCIIþ144þDIIþ244þGIIþ244ý5GII4ý5HII 4ý6HII!þ344þ7II"þ344þ8II#4þ:II#þU44þ=II$þ344þ>II%þ744þCII&ý6344þBII'þ644þEII(ý7544þGII)þ544ý5HI I*þ244þ5I I+4þ6I I,þ344þ8I I-þ544þ8I I.þ544þ;I I/þ344þ=II/ý+544þ?II0ý;544þAII1þ344þDIIþA1þ544÷5GIIE:442þ344ý5=444þ3445þ34464þ27ú5434$ýLûÿÿýîáÿ!ÿý\þÿÿýçäÿ ÿþuÿÿýßëÿÿþŠÿÿýÔôÿÿýœÿÿýÎøÿÿý­ÿÿýÅýÿÿý ÂÿÿþÁÿÿýÏÿÿþ¿ÿÿýÞÿÿýþÂÿÿý)ìÿÿýúÊÿÿý.ïÿÿýùÍÿÿý@÷ÿÿýò×ÿÿ ýNûÿÿýìßÿÿ!þnÿÿýÝèÿÿ"þ|ÿÿýÚïÿÿ#þŽÿÿýÐ÷ÿÿ#ý¬ÿÿýÆýÿÿ$ý¶ÿÿýÄþÿÿ%ýÍÿÿþ»ÿÿ&ýÕÿÿþÀÿÿ'ý!åÿÿýü¿ÿÿ(ý%éÿÿýúÊÿÿ)ý5óÿÿýöÑÿ ÿ*ýBøÿÿýñÙÿ ÿ+ýXýÿÿýçãÿ ÿ,þiÿÿýàëÿ ÿ-þ‚ÿÿýÕôÿ ÿ.þ‘ÿÿýÎøÿÿ.ý©ÿÿýÅýÿÿ/ý¸ÿÿþÁÿÿ0ý Ìÿÿþ¿ÿÿ1ý×ÿÿþÀÿÿýÙÁ1ýâÿÿ÷ýÆÿíÁÖÿÿ2ý2ñÿÿüöÄóÿÿ4ý7ôÿÿ5ýKûÿÿþ»5ýYùÿÿüí”37úSUJ ƒýˆ‡ƒ§ƒõ|h\\^dmt|€ƒ1ƒüp_\\0ƒýxd\ \-ƒü~j]\ \*ƒüp_\\÷YmZ]\\[ƒ'ƒýxd\\ý^U%ƒüo^\\þ[ "ƒü‚ra\\þ_ ƒýye\\ý[Uƒü~m]\\þXƒü‚va\ \þ€ƒý|e\\ü[]`ƒü€m^\\þXƒývb\\ý^€ƒý|h\\ý]U ƒüp_\\þY" ƒýxd\\ý^U$ƒü}h]\\ý]Z'ƒüp_\\þ_*ƒýxd\\ý]m,ûƒ}k]\\þX/þa\\þZ2\ü[]`4\þ_7\ý^€9ý\U½ `ýcb`§`õ[NDDEIPU[]`1`ü_SFDD0`ýXJD D-`ý\NDD*`ü_SGDD÷FIDFEDD`&`ü_XID DþU%`ü]REDDýE@ "`ü_UGDDþA `ü_[KDDCþ@`ü\PEDDE`ýWHDDýC€`ü_[JDDýE@`ü]PEDDýEF`ü_VHD Dþ€`ý[ND D `ü_SFDDþF" `ýXID DþU$`ý]ND DþK'`ü_SEDDþA*`üaXIDDýFI,ü`]PDDE0þFDDþF2DýE@4DþA7Dþ€9D¾ IýLKIiIH;IõE:5458=ADHI1IüH?644/IüHB84 4-IýG;44*IüH?644ö53$55344I&IüHB8445þU%IüG?544ü347 #IýA6445 IýE944ý3+IýG=443þ1IýB74 4IýD:44ý3@IüH=544ý35IýB744þ3IüE:544ý53 IüH?544ý53" IüHB7445þU$IýG:44ý5-'IüH?6445+IýB8445þ$,ûIG;5443þ1/þ644þ224ý3@44ý3574þ3:ý43½ ÿýØàÿiÿð:ÿôõÄÍýÿøÜÆÀÂÍÿ1ÿüÒÂðÿ8ÿüêÀÜÿ8ÿûúÁ¾÷ÿÿþôÿ/ÿü×Âîÿÿõèˆ("Mw™»ÿ&ÿüíÀÜÿÿûùªD$ÿûþÐÃôÿÿüÚz "ÿüÚÁèÿÿüëˆ+ ÿûî¹ÉýÿÿûþÁ_ ÿûüÊÆ÷ÿÿüÚwÿüà¶Ûÿÿû÷¦EÿüôÂÖÿÿûþ»UÿûþÍÆöÿÿüÞwÿüãÀßÿÿûô™<ÿûõÄÍýÿÿüÄf ÿüÒÂñÿÿüçˆ(" ÿüéÀÝÿÿûùªD$ÿûùÆÍüÿÿüÎf'ÿü×Âïÿÿüëˆ+*ÿüëÀÜÿÿûûªM,ûúÆÊùÿÿüÚw/þèÿÿüò™32ÿûþ»U4ÿüç‹+7úÿô™<9ý^½-ƒý]\\ -ƒþo\\ ,ƒý‚]\\þ[ ,ƒþr\\þf ,ƒþ^\\þ[ +ƒþw\\þb +ƒþ_\\þ[ *ƒþ{\\þY *ƒþa\\þ])ƒþ}\\þ[)ƒþe\\þ[÷\_emt|‚ƒƒþ€\\þ[\ù_emv}‚ƒƒþj\\\ù`epy~‚ƒƒþ\\\ù`hpx}‚ƒ ƒþo\\Zû]\[]\\ù]ahpx~ƒƒý‚]\\þ]øf^[\[\]\\ú_fnwm\\þmù@Z^][[\\(û^[\]\\þ[.Zû]\[]\\ý]`5÷@Z]]\]\]U-`þ^DD -`þQDD ,`ý_EDDþC ,`þTDDþ3 +`ý_EDDþE +`þWDDþ; +`þGDDþE *`þZDDþC *`þHDD)`þ]DDþCþ_`'`þKDD÷DEJPU[__``þ^DDþCDøEJPV]__``þNDDþCDúFJRX\``þ_DDþCDøGNSX]__` `þQDDûKFEEDDøEHNSX\_``ý_EDDþEþ3CCýDCDDúEKPWQDDþIþ@DDþEDD(þCDDþI.ûKFEEDDýE@5ü@EEDDýCFU-IþH44þ3 -Iþ=44 -I4þ3 ,Iþ@44þ3 +IýH544þ3 +IþA44þ; +Iþ644þ3 *IþE44þ7 *Iþ744þ3)IþF44þ7þHI'Iþ944ø46:=ADHI IþF44þ54ù6:=BGGIIþ;444ù5;>DGHIIþH44þ34ù6:?BGHI Iþ>44ù-2334544ù7:?BGHII4þ5ù36234544ú68>C<44þ$þ@554þ5'ú6244544þ7.ù-2334544þ05ý@744ü34.U-ÿþÛÿÿþK -ÿþÄÿÿýÓ ,ÿýäûÿÿþ_ ,ÿþÀÿÿýá +ÿýíõÿÿþs +ÿþ¿ÿÿýï *ÿýöëÿÿþ† *ÿþÁÿÿý÷ )ÿýüâÿÿþš)ÿþÈÿÿýþ*þâÿ'ÿþÖÿÿþ­÷ÿïÖÆÀÂÒñÿÿþÏÿÿþ5ÿøïÖÆÀÆÖôÿÿþËÿÿþÁ ÿ÷úÜĸ¹ÁÒõÿÿý×þÿÿþPþçÿÿøéÍÂÀÆÜûÿ ÿþÄÿÿýÓø3Uw¢Ìóÿÿ÷úâÍÂÀÊâýÿÿýäúÿÿþ`ø&Lr—½âÿÿúïÕÅ¿Çÿÿýæ÷"Df‘»Ýýÿÿþt'ø8^„ªÏôÿ ÿýÑ.ø3Uw¢ÌòÿÿýÉ5÷%Jq“|E U||||eS2)Lqshipÿ     \D#‘2Lq‘JÀ Lq‘fªz­)À€ýÕ¿:úÆÊËËÌ8ËûÌËËÒ5öÆÌËËÓñÛËÌ4Ë÷ÍçòòðËËÊ1þÌËËý×ñòòüÝËË/þÿËËýÏêòòûñÌËÉ-þÍËËþÝòòüßËË+þÆËËýÐíòòûñÍËÊ)Ëþãò òûíÏËË'ùÆÊËËÔïòòøêÕé¾ËÌ&ÊüËÍçòòüïÞÌÉÉüª¡¢%ùÎÊËË×ñòòýçÑÉÉûÄ¡¡£"ù¿ÌËËÏëòòüîØËÉÉûÌ«¡¡!úÍÌËËÜòòüñâÎÉÉ÷ÍØÝÞÖ¡¡¢þÆËËýÏíòòüì×ÊÉÉüÊÑÙÞÞü´¡¡þÌËËýãñòòüðÞÌÉÉüÌÓÛÞÞûÚ¢¡ þÑËËýÕïòòýèÒÉÉüÌÕÝÞ Þû¼¡ ’Ì÷ËÍçòòïÚÊÉÉýÙØÞÞûܤ¡¡øÌËÔòñåÐÉÉùËÞôÿÿèÞÞûË¡¡™ËüÑÖÈÉÉüÍäùÿÿþòÞÞü¤¡ ÷¼¥¡ÇÉÍàúÿÿþýÞÞûÊ¡¢£ù¢ª×êììÿÿÞüª¡¢üÀ¿ÏììþûÿÿþäÞÞûÓ¡¡ŸüÀ¿ÅììþõÿÿþîÞÞü­¡¢øÂ¾¿ëììïÿÿþøÞÞûÕ¢¡£¿þáììÿüýóåÞÞü·¡¡¿þÑììøýÿÿþöêàÞÞûÛ¢¡¡¿þÄììüòîâÞÞû·¡ ¿ú¶¿½åáÞÞûÜ¢¡ ¡þÑÞÞûÝÏ×ÝÞÞûÅ¡¡ªü ¡»ÞÞýÝÐÉÉýÐÛÞÞü£¡¡ü ¡©ÞÞþÒÉÉüÌÖÝÞÞûÇ¡¡¢øŸ¡¢ÞÞÝÓÉ ÉýÐÚÞÞü¨¡¢¡ÖþÊÉÉüÊÔÝÞ ÞûÓ¡¡ž¡þ¸ÉÉúÊàòèÑÉÉýÎÙÞ Þü¯¡¡¡þªÉÉý×ñòòüðÞÌÉÉüÊÓÜÞ Þþס¡¡þ¢ÉÉýÎìòòýì×ÉÉýÍ×ÞÞü³¡¡û€¡¡ÅÉÉýËåò òýäÐÉÉýÑÝÞÞûØ¢¡ ¡ú¹ÉÉÜñòòüïÜËÉÉýËØÞÞü·¡¡øÿËÆ®®Õïòòüê×ÊÉÉüÊÑÛÞÞûÜ¡¡£ùÍÊËË×ñòòýåÏÉÉøÖÜÞ¡¡¢ ùÈÌËËÐíò òûêÞâìò òüïÚÌÉÉøÎÚ¢¡¡ ŸÌËýÍåòòüñêÝ××üÛåîò òýêÓÉÉýŬ¡¡þ’þÑËËýØñòòûñçÜØ× ×ûØÝèðò òüñâÏÉÉûÄ¢¡ ûÊËÒíòòüðåÚ××ûÙàêñò òüîÚÊÉÉû¼¡¡¦ËþéòòüïåÛ××üÚãíò òöçÓÈɧ¡·ÍªËùéòòîáØ××üÜæðòòùñ߯°ËËÌÌËýãà××þÁ× ×ûØÞêñòòýæÑËËþÔ××úKMe–É× ×üÙâìòòüïßÍËËþÔ××þKJJûPo£Ï××ûØÚãîòòúíØËËÔ××þKJJûU{°Ö××ûÖÝçðòòËþÔ××þKJ Jû^‰½Ù××÷ØàêòòËËÔ××þKJ JúLh–ËÙ××ûÚËËÔ××þKJJúQu¦ÕÙ××ËþÔ××þKJJü’òÞ××ËþÔ××þKJJüzòà××ËþÔ××þKJJü}òâ××ËþÔ××þKJJúU€´ÜØ××ËþÔ××þKJJúNo ÒØ××ûÖËËÔ××þKJ JûaŽÃÙ××øÚâëòËËÔ××þKJJûW|´Ù××üØàêòòËþÔ××þKJJûPn¢Ñ××ûØÝçðòòúðäËËÔ××ùKJKa“È××ûØÛåîòòýéÖËËýÕ¿:úÆÊËËÌ8ËûÌËËÒ5öÆÌËËÓñÛËÌ4Ë÷ÍçòòðËËÊ1þÌËËý×ñòòüÝËË/þÿËËýÏêòòûñÌËÉ-þÍËËþÝòòüßËË+þÆËËýÐíòòûñÍËÊ)Ëþãò òûíÏËË'ùÆÊËËÔïòòøÔzOWŸÉÌ&ÊüËÍçòòüêŸWMMü@>>%ùÎÊËË×ñòòüÅmNMMûK>>;"ù¿ÌËËÏëòòüãŽRMMûNA>>!úÍÌËËÜòòüï±bMMúOQRSQ>>þÆËËýÏíòòüÖOMMýORSSüE>>þÌËËýãñòòüì¤YMMüNQRSSþQ>>þÑËËýÕïòòüËrNMMþPS SûG>>IÌ÷ËÍçòòã‘SMMüNqVSSü?>>øÌËÔòðºeMMùQ³ÌÌvSSûM>>3ËüÁ‚OMMüYŒ½ÌÌþSSü?>=÷¦J>MM[‹ÁÌÌþÂSSûL>>=ùA[º½¾ÌÌSü@>>ü˜™§½½þÉÌÌþfSSûP>>@ü˜™ž½½þÃÌÌþSSüB>>™½þ¿ÌÌþ´SSûO>>?™þµ½½Ìü jSSüE>>üš™§½½øÊÌÌÇ­~YSSûR=>@ü𙽽üªbSSûE>>@ù’˜’gTSSûR>>?ü?>OSSûRNPRSSûK>>9ü?>FSSýRNMMþOSSü?>>ü?>@SSþOMMýNPSSûK>>:>SþPM MýOQSSü@>>>ýQPMMýPRS SûN>><>þFMMùPªñÄnNMMýNRS SüB>>ü=>BMMý‡ëòòüì¤ZMMüNQRS SþQ>>ü=>>MMýfÛòòüÛ„PMMüNQTSSüD>=>þKMMýU¿ò òüñ¾iMMýPRSSûQ>>=ø?>FMNšðòòüèšVMMýNQSSüE>>øÿ˺lIyåòòüÓOMMýORSSûR>>=ùÍÊËË×ñòòüñ¹fMMøQSSJ>>@ ùÈÌËËÐíò òûêÞâìò òüå•VMMøOR?>>?@ÌËýÍåòòüñêÝ××üÛåîò òüÒyOMMýLB>>þIþÑËËýØñòòûñçÜØ× ×ûØÝèðò òüï±aMMûL?>>ûÊËÒíòòüðåÚ××ûÙàêñò òüãRMMûH>>@ËþéòòüïåÛ××üÚãíò òöÈtMM@>‰ÍªËùéòòîáØ××üÜæðòòùî¨^mËËÌÌËýãà××þ¿× ×ûØÞêñòòýæÑËËþÔ××ú=?ZÈ× ×üÙâìòòüïßÍËËþÔ××þ=<<ûCežÏ××ûØÚãîòòúíØËËÔ××þ=<<ûIq¬Ö××ûÖÝçðòòËþÔ××þ=< <ú=R€ºÙ××÷ØàêòòËËÔ××þ=< <ú?\ÊÙ××ûÚËËÔ××þ=<<úCk¡ÕÙ××ËþÔ××þ=<<üŠòÞ××ËþÔ××þ=<<üqòà××ËþÔ××þ=<<ütòâ××ËþÔ××þ=<<úHv°ÜØ××ËþÔ××þ=<<ú@dšÒØ××ûÖËËÔ××þ=< <ú=U‡ÂÙ××øÚâëòËËÔ××þ=<<ûJr¯Ø××üØàêòòËþÔ××þ=<<ûCdÑ××ûØÝçðòòúðäËËÔ××ù=<>UŒÇ××ûØÛåîòòýéÖËËýÕ¿:úÆÊËËÌ8ËûÌËËÒ5öÆÌËËÓñÛËÌ4Ë÷ÍçòòðËËÊ1þÌËËý×ñòòüÝËË/þÿËËýÏêòòûñÌËÉ-þÍËËþÝòòüßËË+þÆËËýÐíòòûñÍËÊ)Ëþãò òûíÏËË'ùÆÊËËÔïòòøÍa0A—ÉÌ&ÊüËÍçòòüè7**ü#"#%ùÎÊËË×ñòòü»Q+**û)""!"ù¿ÌËËÏëòòüày1**û)$""!úÍÌËËÜòòüï£C**+ú,+""#þÆËËýÏíòòüÐg-**þ+,,ü%""þÌËËýãñòòüê“:**ý+-,,û+!"!þÑËËýÕïòòüÂV+**ü+,+, ,û'""$Ì÷ËÍçòòà}1**ý*,,"øÌËÔòï¯F**ù) ,,û("!Ëü¾i-**ü'þ,,"÷¦0"**%þ,,û(""ù!,ü$"!þ þ%,,û*"" þþ,,ü$""þþ,,û*""!ü$,,ü%"#þû *,,"ü ',,û%""@ü$,,û+""#"þ*,,+,û'"""þ',,þ-**+,ü!"""þ$,,þ+**ý,+,,û'""#",þ+* *ý,+,,ü#"!"+ *þ+**þ-, ,û+""&ü#"'**ù,›ñºS+**þ+, ,ü#"#ü!"%**ü+pêòòüê“:**+ ,û+""$ü!""**ýHÕòòüÕl-**þ+,,ü%"""*ý3´ò òüñ³L**þ+,,û+""#"ú&*+‡ïòòüæ‡5**,ü%""øÿ˶Z-`âòòüÌg-**+þ-,,û+""#ùÍÊËË×ñòòüð¬H**,þ'"" ùÈÌËËÐíò òûêÞâìò òüãƒ4**ý+,""þ ÌËýÍåòòüñêÝ××üÛåîò òüË^,**þ#""þ$þÑËËýØñòòûñçÜØ× ×ûØÝèðò òüï£B**"þ!ûÊËÒíòòüðåÚ××ûÙàêñò òüà|0**û(""&ËþéòòüïåÛ××üÚãíò òö¿Y+*""|ͪËùéòòîáØ××üÜæðòòùí˜A[ËËÌÌËýãà××þÂ× ×ûØÞêñòòýæÑËËþÔ××úUXn›Ë× ×üÙâìòòüïßÍËËþÔ××Uû[w§Ð××ûØÚãîòòúíØËËÔ××Uûa‚µÖ××ûÖÝçðòòËþÔ×× UúVhÀÙ××÷ØàêòòËËÔ××UúWqœÌÙ××ûÚËËÔ××Uú\}¬ÖÙ××ËþÔ××Uü™òÞ××ËþÔ××Uü‚òà××ËþÔ××Uü†òâ××ËþÔ××Uú_†·ÜØ××ËþÔ××UúXw¤ÔØ××ûÖËËÔ×× UúVj“ÆÙ××øÚâëòËËÔ×× Uûaƒ¶Ù××üØàêòòËþÔ××UûZw¦Ò××ûØÝçðòòúðäËËÔ××UûVj˜É××ûØÛåîòòýéÖËËý :ú ŒùóU8ø@Ûÿûÿî5öŸþÿÖ×Îÿ†4ôYèÿø¿úÿßýô1ù²ÿÿÐÝÿÿüÅÿ”/øqóÿîÃþÿÿûßúù!-ù.ÆÿÿÅêÿÿüÂÿ¢+ù ˆúÿåÉÿÿûçöý+)ù@ÛÿýÂöÿÿúùÆåÿY'ù þÿÚÓÿÿøÚÀËÄÐÛ&ù[éÿø¿úÿÿöôÂÒþÿÿÂÿ—%ù³ÿÿÐÝÿÿüÒÃóÿÿûåûû'"øróÿîÃþÿÿüëÀÜÿÿûä¿ÿ­!ù.ÐÿÿÅêÿÿûûÈÆúÿÿöþÖ¿ÙÿçõþBù úÿåÉÿÿüâ¿èÿÿûøËÁæÿÿü¿ÿËùAÜÿýÀôÿÿûöÄÐþÿÿûîÄÇóÿÿûñîÿNù¦þÿÔÓÿÿüÖÁðÿÿûÝÀÐûÿ ÿûÆÿÕõßÿöÃúÿìÂÙÿÿûýѾÞÿÿûûÚÿw÷UÿÙäüÌÈùÿÿùöÉÂéÿÒÿÿûÍÿì úJÿÇ¿åÿÿûìÃÈôÿÿþÀÿÿü×ÿyöÎöøÿå»ÏûÿÿþÍÿÿûÍþðùÐ̳ÙþâÿÿþóÿÿüÆÿ™ü•ÿÀÿÿþéÿÿþáÿÿûÝýû üYÿÊÿÿþÌÿÿþÃÿÿüÈÿ¤øýóüÿÿÌÿÿþÃÿÿûçóý=ùÌÿÕÿÿêÿÿûùÍ¿ÛÿÿüÀÿÇüˆÿÀÿÿøëÿÿÛÀËôÿÿûôñÿDöDÿÊÿÿêµÃæÿÿû¿ÿÍùðÁ½ÜþÿÿûõáÿfüÙÿÎÿÿûÊпãÿÿûÆÿä üŸÿ¹ÿÿýÔÏÿÿûþÌÅ÷ÿÿûþÝÿ€üaÿ¾ÿÿüÞÈþÿÿüîÀÙÿÿûÐÿó÷%ÿßÿÿãÃûÿ ÿüÓÂóÿÿüÊÿ™úæÿÚÂøÿÿþíÿÿüôÂÔÿ ÿûÛüù"ü©ÿÅÿÿùæÆþÏÂðÿÿüÚÁîÿ ÿüÂÿªülÿÁÿÿüö½ôÿÿûöÄÏýÿÿûõÄÑþÿÿûå÷þ1ü.ÿÛÿÿýÆãÿÿüã¿âÿÿüâÀèÿÿüÀÿ»ûîþíÿÿýØÐÿ ÿûþÏÃõÿÿûûÉÊüÿÿûîðÿ;ø³ÿÇÿîÂüÿÿüòÂÒÿÿüæ¿æÿÿüÀÿÅø^ÕÁ¹½íÿÿüÜ¿åÿÿõýÌÇøÿÿõâÿPù8ÂÿÿÎÞÿÿûýËÆ÷ÿÿ÷íÀÝÿ·ÿÛ4 ùŸþÿçÄÿ ÿùýÐÀÀÙþÿ ÿüîÁÖÿÿøÑÁàÿþŸørñÿöÂöÿÿûúÌÁéÿÿûëÅÃåÿ ÿüÛÀéÿÿùìÂöÿÙùÑÿÿÆâÿÿûõÈÄïÿ ÿûÞÁÊñÿ ÿûûÈÈúÿÿûçÙÿtû‚ÿßÈÿÿûðÄÈôÿÿúúÑÀÓúÿ ÿüëÀÝÿÿûÎÿïü™ÿÂÿÿûêÁËùÿÿûóÉÀÝÿ ÿö×ÁíÿÐþœGö™ÿÂÿÿß¾ÑýÿÿûçÃÄèÿÿïùÇÁ¿ÿÿä†(™ÿ·¿ÙÿÿýâþÿÿúþÙÀËôÿÿüåÁÜÿÿúÅf™ÿÂÿÿùïâÀ½ÖüÿÿúùÏ¿ÕüÿÿöþÓÂðÿÿ™ÿÂÿÿþïÿÿùþغºÕüÿÿûïÇÂâÿÿù÷ÅÌ™ÿÂÿÿþïÿÿùùη¹ÔúÿÿûâÃÇïÿÿü™ÿÂÿÿþïÿ ÿùðǵºÒùÿÿöüÖ¿Îøÿ™ÿÂÿÿþïÿ ÿùç´ºÑ÷ÿÿúõÌ™ÿÂÿÿþïÿÿøþÙ¿µ¼Ïöÿÿü™ÿÂÿÿþïÿÿûùÀøÀÿÿü™ÿÂÿÿþïÿÿüÀÿÀÿÿü™ÿÂÿÿþïÿÿü¿ÿ¿ÿÿü™ÿÂÿÿþïÿÿøûÒ¼·¾Öüÿÿü™ÿÂÿÿþïÿÿùß¿´½Öüÿÿûí™ÿÂÿÿþïÿ ÿùíÅ´»Öüÿÿ÷÷ÌÀØý™ÿÂÿÿþïÿÿùùηºÖüÿÿúý׿Ïöÿÿü™ÿÂÿÿþïÿÿùþÚ»»×üÿÿûäÂÆíÿÿúß¿™ÿÂÿÿøïÿê½ÖýÿÿûðÇÁáÿÿûòÂÒþÿ@þÏ ûËÌ˪þÌËËýÊËüñæÒËËþÈòüïßÍËËúÌÈâìòòýëÙËËþÆ××üÛåîòòüÓËÍ××ùØÝè×ËË××üÎËË××úÙàÖËË××óØÝèñòòÖËÌÛåîòòùðãÏËËÈòòýêÕËËùÍòïÝÍËËúÍÿÑËËþÄËÌ@þÏ ûËÌ˪þÌËËýÊËüñæÒËËþÈòüïßÍËËúÌÈâìòòýëÙËËþÆ××üÛåîòòüÓËÍ××ùØÝè×ËË××üÎËË××úÙàÖËË××óØÝèñòòÖËÌÛåîòòùðãÏËËÈòòýêÕËËùÍòïÝÍËËúÍÿÑËËþÄËÌ@þÏ ûËÌ˪þÌËËýÊËüñæÒËËþÈòüïßÍËËúÌÈâìòòýëÙËËþÆ××üÛåîòòüÓËÍ××ùØÝè×ËË××üÎËË××úÙàÖËË××óØÝèñòòÖËÌÛåîòòùðãÏËËÈòòýêÕËËùÍòïÝÍËËúÍÿÑËËþÄËÌ@þ ûö¤Eùüÿÿãƒ'üç¿ÝÿÿüÃcÿÞÒÂðÿÿõŸ*ÀÙþÿÿöÄÎýÿïÿÿëÅÃåÿÿäÛÿ=ÿÿùÝÁÉÍÿDÿÿüÍÿDÿÿùûÒ¿ÌÿDÿÿóÞÁÈñÿüÓÿAÅÃåÿÿùßÀèÿûÿÿüñÁÔÿÿéÝGýÌÅöÿÿô¡BåÿÿþÁb ûÿà#ËýÝÚ××üºÖ××üÙâíòòüïÜÌËËúéòðæÜ× ×ûØÞèðòòüìÒ½ËËúÄËËéòòýèÝ××üÝæðòòöïÝÌɪ¢ÃËÌüÊËØòòüêߨ××üÚãìò òöåÐÈÉÉÁ¡¡¢ËýÍåòòüìßÙ× ×ûØàêñò òüìØÊÉÉûÈ¥¡ þÌËËýÑíòòýîâ××üÞçñò òüñàÌÉÉüȲ¢¡¡ ËýÙñò òùîãÙÜåîò òýçÒÉÉüÊÕ¦¡¡þ¢ þÕËËýÌãòòüîØÊÉÉ÷ÏÚÞÉ¡¡ ÿ ùÑË˼·ßòòüñàÎÉÉýËÕÞÞü¤¡¡ù¢¡¶ÉÌéòòüèÓÊÉÉýÐÛÞÞûÅ¡¡ª¡þÃÉÉýÐïò òüïÚËÉÉýÌ×ÞÞûÝ¢¡¢üŸ¡¡ÉÉþØòòüñãÎÉÉýÒÜÞÞû½¡¡€ü ¡©ÉÉýÊäòòýêÕÉÉýÌ×Þ ÞûÛ¢¡¢¡þ¶ÉÉùÌéòðÝËÉÉüÊÓÛÞ Þü·¡¡¡ýÒÐÉÉþÍÉÉýÎÙÞ ÞûÙ¡¡ ø£¡¡ÞÞÜÎÉ ÉüÊÕÝÞÞü³¡¡¡þ¨ÞÞýÛÍÉÉýÎÚÞÞûÔ¡¡Ÿü ¡¸ÞÞýÙÌÉÉýËÕÞÞüª¡¡¡þÎÞÞûØÊÑÛÞÞûÒ¡¡ú¹¾µáàÞ Þü¨¡¡¿þÂììýëäÞÞûÆ¡¡™¿þÏììùýÿþúîáÞÞü£¡ ¿þÞììÿûþöêßÞÞûÅ¡¡¿ø¼À¿ëììîÿÿþúÞÞûܤ¡ üÀ¿ÁììþôÿÿþðÞÞû»¡¡ªüÀ¿ÎììþúÿÿþåÞÞûÛ¢¡¡ù¥°ÙììíÿÿÞü·¡¡øÆ£¡ÈËÖçÿÿþýÞÞû×¢¡ ûÍËÆÌÉÉûÊÚðþÿÿþöÞÞü®¡¡øÌËØòì×ÊÉÉùÕìýÿÿëÞÞûס¡ öÉËËÑïòòäÎÉÉüÐèßÞÞü¯¡¡þÊËËøÞñòòðÛËÉÉüËÓÛÞ ÞûÒ¡¡ þÌËËýÏìòòüèÒÊÉÉýÑÙÞ Þüª¡¡Ëý×ñòòüñÞÌÉÉýÏØÞÞûÏ¡¡¦ùªÌËËÌçòòýíÖÉÉüËÕÜÞÞü¥¡¢!þÇËËýÔñòòýãÐÉÉùËÓÆ¡¡¢#ÌûËÌãñòòüïÚËÉÉü£¡ %ÌËýÏïòòýçÑÉÉû½¡¡¢'þÊËËþÝòò÷ñÝÌȤ§¾Ì(ùÛÊËËÏëò òúêÝÍËË*ËýÙñò òüÎËË+þÿËËýÌçòòüäËÊ.þÎËËýÔñòòûñÌËÌ0ùËÌËÌâñòòüâËË2þÈËËýÏïòòüÍËÊ4öÍÌËËÞòãËË6÷ÛÊËËÏÍËÇ8Ë;üÿÍÌËýÝÚ××ü‰¸Ö××üÙâíòòüïÜÌËËúéòðæÜ× ×ûØÞèðòòüׂ•ËËúÄËËéòòýèÝ××üÝæðòòöè YMB?¯ËÌüÊËØòòüêߨ××üÚãìò òüñ¿jMMþK>>ËýÍåòòüìßÙ× ×ûØàêñò òü݇PMMü@>>þÌËËýÑíòòýîâ××üÞçñò òüì§[MMùLE?>>CËýÙñò òùîãÙÜåîò òüÆpNMMýO?>>þ@ þÕËËýÌãòòüâRMMûPSSM>>øÑËÊ›_¨ñòòüì¬_MMþQSSü?>>ùD>EMWÉòòüËtNMMþNSSûK>>+>þKMMýkáò òüå“UMMüNQTSSûR?>>ü@>>MMüNîòòüï³cMMüNORSSüH>>>þAMMýP¸òòüÓzNMMüNQTS S>þ?>þEMMù[Ïòé™WMMýNQS SüE>>>O Mþ\MMýNRS SþQ>>ø=>=SSRNM MþPSSüD>=>þ?SSýROMMýORSSþO>>>þESSýQNMMþQSSüA>=>þMSSûQNPRSSûO>>;ú¢•{qUS Sü@>>öš™œ½½²kTSSûK>>D™þ¦½½ùÊÌÊ·‹aSSü?>?™þ±½½ÌûÇ©}VSSûK>>@ø”™™¼½½¿ÌÌþ¹SSûR?>?üš™›½½þÃÌÌþ—SSûF>>U™þ¦½½þÇÌÌþmSS>þ?ùJl£½½¾ÌÌþTSSüE>>øÆG>MSz¥ÌÌþÅSSûQ=>>ûÍ˪[MMûOv«ÉÌÌþ©SSüB>>øÌËØòÛ†PMMùi ÆÌÌSSûQ>>BöÉËËÑïòñ¸eMMü]–[SSüB>>þÊËËøÞñòòè—TMMüPRRS SûO>>BþÌËËýÏìòòüÌsNMMýNRS SüA>>Ëý×ñòòüì¢ZMMýOQSSûM>>@ùªÌËËÌçòòüÛOMMýPRSSü?>>!þÇËËýÔñòòüñ¶dMMúQM>>:#ÌûËÌãñòòüåSMMü?>?%ÌËýÏïòòüÆnNMMûI>>F'þÊËËþÝòò÷ëŸXLATœÌ(ùÛÊËËÏëò òúÕ×ÍËË*ËýÙñò òüÎËË+þÿËËýÌçòòüäËÊ.þÎËËýÔñòòûñÌËÌ0ùËÌËÌâñòòüâËË2þÈËËýÏïòòüÍËÊ4öÍÌËËÞòãËË6÷ÛÊËËÏÍËÇ8Ë;üÿÍÌËýÝÚ××ü•¼Ö××üÙâíòòüïÜÌËËúéòðæÜ× ×ûØÞèðòòüÐk‰ËËúÄËËéòòýèÝ××üÝæðòòöæ8*$#¨ËÌüÊËØòòüêߨ××üÚãìò òõñ´N)**(""ËýÍåòòüìßÙ× ×ûØàêñò òüÙp.**û)#""þÌËËýÑíòòýîâ××üÞçñò òûë—<+**þ&""þ(ËýÙñò òùîãÙÜåîò òü½T+**ý,!""þ# þÕËËýÌãòòüÞv/**ø,+,)"!!øÑËÊ‘H—ñòòüëž@**þ+,,ü#""ù)"&*6ÀòòüÂY+**ý,-,,û'""+"þ(**ýNÝò òüâ}3**+,"ü "#**ü+vìòòüï¦D**þ+,,ü'""ü#"#**ý.¬òòüÌa,**ý,+,,û+""!"þ&**ù<Èòå‡5**ý+-, ,ü%"#"ý*,**ý=+**þ+,,"þ!ü"",,þ+* *þ+,,ü%""ü#"",, *+,þ+"""þ&,,þ-**þ),,ü$"#"þ*,,û+*+-,,û*""û +, ,ü#""ü#,,þ)""ü(,,"þ#þû +,,û'""@þþ,,"þ#þþ,,ü%"" þ",,û+!"#ü ,ü%"!øÆ,")( þ,,û+""!ûÍˤ<**û) þ ,,ü$""øÌËØòÕo.**ù!,,û+""$õÉËËÑïòð­H+**ü&),,ü#"#þÊËËøÞñòòæƒ3**þ+, ,û+""$þÌËËýÏìòòüÄY+**þ+, ,ü$"#Ëý×ñòòüë’:**,û*""&ùªÌËËÌçòòüÕe-**ý,+,,ü#"!!þÇËËýÔñòòüðªE**ù)+)""##ÌûËÌãñòòüâ|1**"þ#%ÌËýÏïòòü½S+**û'""'þÊËËþÝòò÷ê7*%=“Ì(ùÛÊËËÏëò òúÏÔÍËË*ËýÙñò òüÎËË+þÿËËýÌçòòüäËÊ.þÎËËýÔñòòûñÌËÌ0ùËÌËÌâñòòüâËË2þÈËËýÏïòòüÍËÊ4öÍÌËËÞòãËË6÷ÛÊËËÏÍËÇ8Ë;üÿÍÌú™ÿ´ÉöÿÿüÂÚýÿÿúùÏ¿ÔüÿÿïüÍÄõÿÿô¡™ÿÂÿôÄÄñÿÿúþÚÀËôÿÿòã½¾ÿÿþÁb ™ÿÂÿÿû÷ÊÂëÿÿûèÃÄèÿÿöõÃÑÿÈó€#ûŒÿÍÞÿÿûûÐÀâÿÿúòÊÂÜþÿÿõþÐÅöÿÿÝûù!ù,ñÿõ½÷ÿÿüÖ¿Üÿ ÿúûÓÀÐûÿ ÿüæ¿áÿÿûôÌÿù#²ÿÿâËÿÿûß¿ÕþÿÿûßÁÈñÿ ÿû÷ÅÍüÿÿùùÃèÿçùIÙÿÿÏÜÿ ÿùç¿ÎÅÃãÿ ÿüÓÂðÿÿøôÁÎÿÿÉ, øvïÿøÀôÿÿüêÀÝÿÿ÷ÓÂóÇÿìV øžýαÂþÿÿû÷ÇÊûÿÿöíÀÛÿÿþÕÿoù¢ÿÃÿÓÔÿÿüÖ¿ïÿÿûþÍÈ÷ÿÿûÆÿÞ÷âÿãÿÿþÃèÿ ÿüí¿Øÿÿüç¿áÿÿûúàÿZü ÿäÿÿüóÀøÿÿûûÉÇøÿÿûûÈÊüÿÿûÂÿ×ü^ÿÃÿÿýáÈÿÿüÜÀèÿÿüâÀëÿÿûôéÿUüÿÃÿÿùÍÛÿîÁÔÿÿû÷ÄÎþÿ ÿüÀÿÇûÚÿÂÒÿÿüûÍöÿÿüÚÁîÿ ÿûíòÿ>øÿéÿÿÊ×ÿ ÿüôÂÕÿÿüÀÿ»üWÿÁÿÿüþÅàÿÿüÒÃóÿÿûåøý-ü”ÿ´ÿÿüúÁéÿÿüêÀÛÿÿüÐÿ¢üÓÿÄÿÿùô¿òÌÈøÿÿûÛÿõú Ô½ÆûÿÿþûÿÿüÊÿˆöDÿÐÿòÊ»ÛþÿÿûÉÿæü€ÿ¿ÿÿùâÿèÃÄèÿÿûþÛÿfù»ÿÏÿÿóÿÿúþÙÀÌ÷ÿÿûÆÿáøùøöÿÿÓÿÿþÅÿÿûúßÿfüQÿÑÿÿþÈÿÿþÁÿÿûÇÿÉü‘ÿ¿ÿÿþàÿÿþÙÿÿûôîÿAù»Á·÷ÿëÿÿýõýÿÿüÀÿÆ÷ ÑûôôȶîÿÿþÒÿÿûèñý>ô=ÿÄÍýÿÿûÎÀâÿÿþÀÿÿüÁÿ¥øUÿÏ÷ã¿åÿÿùÙ¿ÖþÿÊÿÿûæúý#õ&ôÿäÑÿþÌÇöÿÿûçÀÆûÿÿüÂÿªô?ÜÿÿÀìÿÿðÁ×ÿÿûñÃÆòÿ ÿûäûö#ù „ùÿíÆÿÿü×ÁïÿÿûùËÁæÿÿüÏÿ‹ù,ËÿÿÌáÿÿû÷ÆÎýÿÿûþÔ¿ÛÿÿûÔþõømôÿõÀúÿÿüâ¿äÿÿöáÀÑûÿÿÍÿ‘!ù °ÿÿÙÖÿÿûûËÇøÿÿùêùÿë#ùUäÿûÀôÿÿüíÀÛÿÿüÒÿv%ùšþÿäÌÿÿüÓÂòÿÿûÒÿé 'ù>ÖÿÿÄëÿÿ÷ôÁÑýÍŬ(ùƒùÿíÈÿ ÿúܽïÿJ*ù,ÄÿÿÑáÿÿûóìÿ,+økïÿõÀúÿÿü¿ÿ½.ù¯ÿÿÙÖÿÿûíòþ70ùTäÿüÀôÿÿüÀÿ¯2ó™þÿäÌÿÿí÷ü+4ö=ÕÿÿÁîÉÿ¡6÷‚øÿêûù 8ú'Êÿÿ€:ü3-ýÍÿIýÍÿIýÍÿIýBI&8plee-the-bear-20251226/bear-engine/doc/examples/CMakeLists.txt000066400000000000000000000005471512343254000236750ustar00rootroot00000000000000cmake_minimum_required(VERSION 2.8) set( BEAR_ROOT_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/../../../" ) list( APPEND CMAKE_CXX_FLAGS "-std=c++0x ${CMAKE_CXX_FLAGS}" ) subdirs( 01-screen 02-display 03-sprite 04-text 05-keyboard 06-mouse 07-joystick 08-music 09-sound 10-stars 11-animation 12-shader 13-input 14-gui 15-physics ) plee-the-bear-20251226/bear-engine/doc/examples/TODO.txt000066400000000000000000000002761512343254000224420ustar00rootroot00000000000000Beginner - physics - engine Intermediate - music: play, stop, pause, resume - sound: position, ears. - shaders: uniforms Sample games - bomberman - breakout - platformer - boulder dash plee-the-bear-20251226/bear-engine/doc/get-started/000077500000000000000000000000001512343254000215345ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/doc/get-started/README.md000066400000000000000000000040701512343254000230140ustar00rootroot00000000000000This document will guide you through the creation of your first project using the Bear Engine. Installing the dependencies ==== We use CMake as the build system (http://www.cmake.org/). You will also need a C++ compiler and the following libraries in order to build the engine and its tools: - Boost: http://www.boost.org, - SDL 2: http://www.libsdl.org, - SDL Mixer 2: http://www.libsdl.org/projects/SDL_mixer/, - Claw: http://libclaw.sourceforge.net, - Gettext: http://www.gnu.org/software/gettext/, - FreeType: http://www.freetype.org/, - wxWidgets 2.8 (for the editors): http://www.wxwidgets.org/, Creating your project using the wizard ==== When all the dependencies are installed, you can run the project wizard script provided with this file in order to build a fully functional project based on the Bear Engine: path/to/project-wizard.sh YourProjectName Then jump to the section named "Building your project" to see how to build your project! Creating your project step by step ==== First of all, you need to get the source of the engine: git clone https://github.com/j-jorge/bear.git Ensure that you have all the dependencies installed, then enter the loned repository in order to build and install the engine: cd bear cmake . -DCMAKE_BUILD_TYPE=release make make install # as root Create a directory for your project then copy the content of the `sample-project` directory provided with this document into your project's root directory. Edit this file to set the path to the directory of the cloned repository of the bear engine (line 6) and optionally to set your program's executable name (line 42). Building your project ==== You can use the file `YourProjectDirectory/launcher/main.cpp` as the base for your project, as it provides a minimal game code. When you will need more c++ files, add them anywhere and list them in the CMakeLists.txt, in the `set( SOURCES … )` directive line 44. Finally, enter your project's directory and run `cmake` and `make` to configure and to build your program: cd your/project/directory cmake . make plee-the-bear-20251226/bear-engine/doc/get-started/project-wizard.sh000077500000000000000000000035571512343254000250510ustar00rootroot00000000000000#!/bin/bash # The project is initialized with the files of the sample project provided with # this script. SCRIPT_ORIGIN_DIR="$(dirname $(readlink --canonicalize ${BASH_SOURCE[0]}))" # Builds and install the Bear Engine. # \param $1 The path to the engine's repository. # function build_engine() { cd "$1" cmake . -DCMAKE_BUILD_TYPE=release -DCMAKE_INSTALL_PREFIX=/usr make sudo make install } # build_engine() # If the name of the project to create is not provided on the command line, we # ask it to the user. PROJECT_NAME="$1" if [ -z "$PROJECT_NAME" ] then read -p "Enter your project's name: " PROJECT_NAME fi # We are going to create a directory for the user's project. If we are in a # subdirectory of a cloned repository of the bear engine, then we create the # directory where we are. Otherwise we will create this directory alongside a # clone of the repository in a directory created where we are. BEAR_ROOT="$(git rev-parse --show-toplevel 2>/dev/null)" if [ $? -eq 0 ] then PROJECT_ROOT=$PWD else PROJECT_ROOT="$PWD/$PROJECT_NAME-project" if [ ! -d "$PROJECT_ROOT" ] then mkdir --parents "$PROJECT_ROOT" || exit 1 fi pushd "$PROJECT_ROOT" > /dev/null git clone https://github.com/j-jorge/bear.git BEAR_ROOT="$PWD/bear" build_engine "$BEAR_ROOT" popd fi # Whatever the project's root is, we go inside to create the its specific files. pushd "$PROJECT_ROOT" > /dev/null mkdir --parents "$PROJECT_NAME" cp --recursive --no-clobber "$SCRIPT_ORIGIN_DIR/sample-project/"* \ "$PROJECT_NAME/" # The path to the Bear Engine and the name of the project must be updated in # the CMake file. sed --in-place \ "s:YourProjectName:$PROJECT_NAME:;s:path/to/bear/repository:$BEAR_ROOT:" \ "$PROJECT_NAME/CMakeLists.txt" pushd "$PROJECT_NAME" > /dev/null cmake . -DCMAKE_BUILD_TYPE=debug make ./"$PROJECT_NAME"plee-the-bear-20251226/bear-engine/doc/get-started/sample-project/000077500000000000000000000000001512343254000244615ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/doc/get-started/sample-project/CMakeLists.txt000066400000000000000000000035531512343254000272270ustar00rootroot00000000000000cmake_minimum_required(VERSION 2.8) set( BEAR_ROOT_DIRECTORY # replace the path below by the one of the cloned bear repository. path/to/bear/repository ) #------------------------------------------------------------------------------- # Find the root directory of the source of the Bear Engine. This directory # contain the bear-engine and bear-factory project directories. if( NOT DEFINED BEAR_ROOT_DIRECTORY OR NOT IS_DIRECTORY "${BEAR_ROOT_DIRECTORY}/bear-engine" ) message( FATAL_ERROR "I can't find the Bear Engine. Please set BEAR_ROOT_DIRECTORY to the path of the engine's root:\n cmake . -DBEAR_ROOT_DIRECTORY=/home/joe/dev/bear\nCurrent path is \"${BEAR_ROOT_DIRECTORY}\" and it doesn't contain a bear-engine directory." ) endif() # The engine comes with some CMake scripts to ease its configuration and usage. # These scripts are in the directory below and must be assigned to # CMAKE_MODULE_PATH in order to be found by the upcoming include() instructions set( CMAKE_MODULE_PATH "${BEAR_ROOT_DIRECTORY}/cmake-helper" ) # This will sets the variables of the source directories, required by the CMake # package below. include( "bear-config" ) #------------------------------------------------------------------------------- # Include Bear Engine's CMake package to find the libraries, the link paths and # the and include paths required by the engine. find_package( bear ) include_directories( ${BEAR_ENGINE_INCLUDE_DIRECTORY} ) include_directories( ${BEAR_ITEMS_INCLUDE_DIRECTORY} ) #------------------------------------------------------------------------------- # Now we can describe our project. set( TARGET_NAME # Replace the value below by the name of the executable for your project YourProjectName ) set( SOURCES launcher/main.cpp ) add_executable( ${TARGET_NAME} ${SOURCES} ) target_link_libraries( ${TARGET_NAME} ${BEAR_ENGINE_LIBRARIES} ) plee-the-bear-20251226/bear-engine/doc/get-started/sample-project/launcher/000077500000000000000000000000001512343254000262625ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/doc/get-started/sample-project/launcher/main.cpp000066400000000000000000000122071512343254000277140ustar00rootroot00000000000000/** * \file * * This program creates a game using the Bear Engine. The purpose of this * example is to show how to configure the game (path to the resources and the * items) and how to start the first level. */ #include "engine/game.hpp" #include "engine/game_description.hpp" #include "engine/game_initializer.hpp" #include "engine/level.hpp" #include "generic_items/decorative_item.hpp" #include "generic_items/layer/decoration_layer.hpp" /** * Creates and returns a level item displaying a text. * * The item is dynamically allocated. It's the caller's responsibility to delete * it. * * \param level_globals The resources to use for the item. The font will be * loaded from it. */ bear::decorative_item* create_decorative_text( bear::engine::level_globals& level_globals ) { bear::decorative_item* const result( new bear::decorative_item ); result->set_text( "It's time to code!" ); result->set_font( level_globals.get_font( "font/FreeSansBold.ttf", 40 ) ); result->set_bottom_left( 100, 400 ); return result; } /** * Creates a level containing a layer with a text inside then put it in the * game's instance. */ void init_game() { // A level is mostly a set of resources and a container of layer. Here we // create our initial level with the minimum information. bear::engine::level* const level ( new bear::engine::level ( // The name of the level. You can use any name you want. "Example level", // The file from which the level is loaded. It is totally optional and // would be set if we had used the level loader. Here we build the level // in the code so there is no name. std::string(), // The size of the level. If some layers do not have the same size, they // will be displayed using a parallax effect. bear::universe::size_box_type(640, 480), // The path of the music resource to play in the level. The music is // played indefinitely and paused when the level is paused. std::string(), // A pointer to a set of already loaded resources we can use. When two // levels are in memory simultaneously, they can share their resources // (musics, sounds, textures, etc.) It is necessary that these resources // outlive this level. This argument is typically used when loading a // sublevel of a level. Here we only have one level, so there is nothing // to share. NULL, // A pointer to a set of already loaded resources we can copy. The idea // is the same than for the previous argument except than there is no // requirement on the lifespan of these resources. This argument is // typically used when starting a new level reusing some resources of // the previous one. Here we only have one level, so there is nothing to // share. NULL ) ); // The decoration_layer displays some decorations (sprites, texts, animations) // without movements. We assign the same size than the level. bear::engine::layer* const layer ( new bear::decoration_layer( bear::universe::size_box_type(640, 480) ) ); // It is necessary that the layer is part of a level before adding items to // it. level->push_layer( layer ); // Here we add our item. The layer takes the ownership of the items added to // it. layer->add_item( *create_decorative_text( level->get_globals() ) ); // Finally we can tell the game to start this level as soon as possible. bear::engine::game::get_instance().set_waiting_level( level ); } // The game can call a custom function before starting the main loop. We are // going to use it to load our first level. BEAR_ENGINE_GAME_INIT_FUNCTION( init_game ) /** * Creates a game instance with a simple level and runs it. */ int main( int argc, char* argv[] ) { bear::engine::game_description game_description; // This is the name of the game. It will be displayed in the title bar of the // window. Also, if the game needs to store user-specific files, this name // will be used to build the name of the directory to receive these files. game_description.set_game_name( "Sample project" ); // Here we set up the size of the game's window. game_description.set_screen_width( 640 ); game_description.set_screen_height( 480 ); // The game will search the resources in the paths passed to // add_resources_path. The resources are searched by starting from the latest // added path, up to the first path. game_description.add_resources_path( "./resources" ); // Custom item classes can be added to the game using modules. When loading a // level, the items used in it are searched in these libraries. game_description.add_item_library( "libbear_generic_items.so" ); // Now we can create the game corresponding to this description. This instance // is a singleton and can be retrieved by using // bear::engine::game::get_instance(). bear::engine::game game( game_description ); // And we can start the game loop, which will call the init function above. // This loop ends when bear::engine::game::end() is called, for example when // the user clicks the close button of the window. game.run(); return 0; } plee-the-bear-20251226/bear-engine/doc/get-started/sample-project/resources/000077500000000000000000000000001512343254000264735ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/doc/get-started/sample-project/resources/font/000077500000000000000000000000001512343254000274415ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/doc/get-started/sample-project/resources/font/FreeSansBold.ttf000066400000000000000000014546001512343254000325010ustar00rootroot000000000000000FFTMY-¤~YdGDEF}@9(⤮GPOSÛP(7(WP´PW(ŸPWP,APèPyA¹ 6(6ÿý,ÿø(f(âPeAâPeAâPeAâPeAâPeAG(¹ 6(¹ 6(í y$(Œ"(d(ØP4A(c#(c#7(2#,ÿø5PÆPW((d(“PñPeA¹ 6(÷ y$f ¹ 6¹ 6(™PG™PG(6ÿŠ,ÿ²6(f((f(ÒPˆÿíÒPˆAâPeAâPeA©(,„RJ#äíP\Acô¹ 6(PG((f((f((f((f(ƒ % 6¯(¯mA.= |(|(G(G(B;P1&4:"<q(i(C(, Ž eA[@\A,A,ÙAèA~AA~AttAqAf(~(P(Ê(…‚–‚A‚AÙAÙ#JAEKaMK9)H ;ƒØ({A  %  'O2#Q#<(<(<(JAf(3AN,h(eA(L!Æ<|(<(<(ì((]('G8gñAœA æ“ § yyÊ' + ‹0l ú(Æ(úDúDúDMtMcM M M M MMMM MMúúdMMNúMMMMM^MWMMMMM#MpMMM-Mÿ÷MÿÔMþZt Ò8kuNÿø99M Mô8MMM M MLú"M2È È È È MMMÿìþÁÿ)þ¸þ­þÆý¾þÖÿ&þÃþäÿþ‡þ¼ÿ.þéþ‡þÖþÖÿÿ>ÿ;þúþûþßþßÿ3ÿhþÄþÕþÕþÚþäÿ7ÿÿ#þÀþóÿþÎþàÿ5þÏþÀþ¼þ±þÖþÓþªþÃþHþ<þ0þYýÚýCýCÿ5þÏþ½þ þ³ÿý¸þÄÿ)þ­ÿ>þ¶ÿ5þÏþ¾þ½þãþ†þ™þƒþþþªÿþ²þ›þ]þmýðÿ.þºþ[ýîþšþ¤þ¨þ­þ­þ˜þ¤þÅþ¨þ–þåþ•þ®þ¸þ©þ¸þlþàþÐþ”þ{8{:M‚M2k]M¹ Mq"n® ¾]Uÿé¹ ¡1zPè P`íP(6PØPÉ ŽPP¬2(PÌP¤’ù( @F(6 x(;(Vd<`<x(X<= n(;((V S(U<7<M e<6 (f(’z<Q(–(-`<(wØ2(U`<f(`<(a'æ•èÊ((‚‚f((f(PP8dPÑ(©(6P6<6\P8ØPñP½ îP¹ ÀPÀPdP„#P4 ©(ñPñPØPÇfPíP(íP¥PÑ(„½ (‹ )PÂF#PsPOÐP¥PÑ(GP½ 6(S(3A¬A§G(;(qAqA/A=¤AeAf(eAmA.(¸% Ì( ŽA=2€AÊA¿AAA8(YAE G(G(w¬A8(+!F,ÿý}‹Au/AqA% fAÚà @FöA(^$®à Úà ÁþzþÖÿÿ!ý´ýüÿ@R£<ªc¥Pd<|R¸<nÁ‡R><H #«*+ ÷R=<ÚR*<á + |¨9R<çRû<QQ<Ã,þ$Ò,.$f¶ ƒ =ƒ [ž$¸â Dg0º<L<¯FLFá*ù á*ù :R4 ¹P<$zñR[<3R—<ÂDL<§RÐ<:R¹ÿÿ6(¹ÿÿ6(ì‚$PG(Ò,GÒ,G4 ©(;(7((#ñPqAñPqA(f((^$(^$Ñ(8(¼ ½¼ÂF=2cR°<ÐPA  "Ù$A(m0¿ ÚR*<ÚFÉFý-ðAÄF!<ðFÉFWF®-×F¤FFI*ÄA”š#ë<º#õFv#ë‹-çA‘-Ø2AðAçA-³$ÉF€(©F2# %#ò#McÞúMÿýM` ji<eAz|AQ<#¡FeA’AÇ#aF>FDFž#eA_Fc#rAkjADeAOAˆi7A#[AXArA·AeAd(\F·AhA^#û#rAú2ŽðA+ˆe~+êÚÆÐÚ?Á)OŠeM2Ê=‹M-/~?ªO)O»?ªOžLIN>SL›>«PÀC)O­IžL<•H”OhŸ= PX?HLô>*O&IIî2Ú2þÊþÊÿA1Bá á  øÿöøÿönÿöLÿöÁÿö©ÿöÙÿöÙÿöÙÿöÙÿö    ÿö4ÿö2ÿövÿöÿö”ÿö¬ÿöçÿöÜÿöÐÿö`ÿö;ÿö‹ÿöBÿöˆÿö\ÿö¼)ÿöy)`ÿö`ÿöÿöÿöÿöj.ÿöTÿöÛÿöÛÿö¸ÿö½ÿö½ÿöÿö®ÿöÿöÃÿöÿöÿ} ÿöþvâ ÿö ÿö ÿ þHþºþÆþÆþÊþ1þuþX ÿÁ ÿ) ÿw ÿ`ÿG½ þäoÿ}ýÖþÿ"þÊþ:þ:ÿö4ÿö2ÿöçÿö‹ÿöBÿöÿöTÿö¬ÿöšÿöþLþK¢_¢Ú?F?]?;?F?:?R?R??n?mmQƒwá á  xá á çÿöTÿö`ÿöçÿögO‹ÿöÿöþÅÿ®9(ÿ÷…ÿ÷¢ÿÊÆÿøúÿ÷úÿ÷Ùÿøˆÿ÷ÿ÷‡ÿ÷Öÿö ÿ÷åÿöÿò¾ÿðÓÿòµÿö°ÿô¡ÿ÷«ÿø®ÿôÇÿò¨ÿûµÿõÙÿ÷³ÿø¶ÿø»ÿöšÿóÿö«ÿ÷²ÿø”ÿú“ÿú´ÿ÷ÿó¡ÿøÛÿù.ÿΗÿ÷Àÿò¾ÿ÷Šÿôÿ83ÿì0ÿô2ÿýßýßý¸ýŒýâýšþ‡þ‡¬ÿò-ÿÂËÿù·ÿøÅÿç¹!v¸²†| ;ª Î Ú þÎþÇÒÿøøÿ÷Vþàh<…<˜<G<s<v<;< P<v<·<^<`PCPv<b$<gP7<ëf<s<H<s<™2bPPV<™P˜<`Pvu<Ï4ÂËÜoÇîÜ~ôôÈí÷È÷ÆžÃ˳Ñìàôì ô°þãÂßöõ4?ÁNÊ<Û<pŒ '<Ž._+\<$Êÿð •<žg#+ÿí<y<ÓÄ{_9ñ(?<6-Ñ ¾(Æ<hB'd%þ'Yÿðs<‰-_*g'¨(˜ 5˜Á-·92   <›3,§<?:‡ÿþŒ) ƒÿôž”ÿþˆ)¦*e:g<ß)„‡<ø'= 8<ô<qÕ)ö''ž*®ÿ÷+˜åzÿîr9Î'»<¹ 6(ÀPmAÀPmAÀPmAÑ(.(ÔPm(ÔPm(ÔPm(ÔPm(ÔPm(™PG(™PG(™PG(™PG(PG(xPW(d(íP\AíP\AíP\Að3\AíP\A6ÿêÿÛ6,ÿüØP4AØP4AØP4AkPAkPÿôkPÿökPÿçfP~AfP~AfP~AñPeAñPeAñPeAñPeA(f((f((f((f(¥PmA¥PmAÒPˆAÒPˆAÒPˆAÒPˆ.©(,©(,©(,©(,©(,„R„R„R„RâPeAâPeAâPeAâPeAâPeA— — ¿ ¿ ¿ ¿ ¿ £%£%ƒ % `û`û`û\AR % +(MåP¹ 6(¹ 6(¹ 6(¹ 6¹ 6(¹ 6(¹ 6(¹ 6(¹ 6(¹ 6(¹ 6(¹ 6(™PG(™PG(™PG(™PG(™#G™PG(™PG(™PG(6PF6PF(f((f((f((f(f((f((f((’((’((’((’((’(âPeAâPeAPšAPšAPšAPšAPšAƒ % ƒ % ƒ % ƒ % x(x(x(x(x(x(x(x(¹ ¹ aQ'Úÿßîÿø;(;(;(;(;(;(öø½¯«±V V V V V V V V KN¥ÿͰÿçU;U<‰‹Ž&ˆ'†”%§§YYUOf(f(f(f(f(f(`a"û`<`<`<`<`<`<`<`<€L[((((((((lo//éÝx(x(;(;(V V UU<b(b(`<`<((x(x(x(x(x(x(x(x( Š /âì˜ÿÖžÿäV V V V V V V V î÷´·®¹HÿÍ[ÿç((((((((2,íìÄÕ¬¨‚(‚(‚(‚(‚(‚(‚(¹ ¹ ¹ÿê¹ ‹ TZ:TbMÿöV V VV V tqŒPìTéTŠihul{ˆ66ǽáQMQMÿö`<`<`<`<z<z<`<`<ùù´Ì6MMMR(((((‘i”~Ü(MuQôèôèMú§,§dMM,ÿ÷,ÿ÷èÿùèÿùµd,ÿêúDúD<úDÂ>Â8Â8ÂB,,23ô¡ô$î$@§è W ú(ª(f(ú(ª(f(ÂMSMPn=špf,’"’"¶ÿ÷Hÿù2§ÿSN`NÆ@°@°p,X$X$…Mq’"…zA8’" %W(Ò%Õ%à%Ò%\9à%à%_È6_____ ____ØÚ‡*_-(_______ _^^^ØØknŠh ccO y<×.ñPPD€$]OdW ýËýËÿ,ÿý’ý™þýZý0ý+ý*ý(ý_ý=þOþþ-ü9ý©ýëýèý¡ý™þб(È$ Õ ê$›(Ñ(—\Aš`qçDpíè.(¬((Z ØP¹ G(d„=-/~?g(—C1k(c ƒ  âe(ee(eeee(ee(eeee(6P8PbP…P—w«ÁP£Ÿ«kPÑ(ÔPfPF,FBF F  ( > F%(A.(m(~AÄ'Ä@Ä*Ä@Ä'Ä@ĞċĊĞÄ'Ä'Ä'ÄBÄ'ÄBÄ'Ä'Ä'ÄÄ'Ä ÄÄ'ÄŒÄ'Ä'ÄŒÄ'ÄŒ¹ Ìl, ›;›7\1ÙÙH7H7I-H7H7IPôZ7i7i&)H2H3H2þÄ(ôô?ôdR%%ÉÉ> ÜF|F``((<(<J<… ‡ú2l2H2 2H2ôôô$H5H2H2ôH2ôH2H2H2H2ó@ó2H2H2H2H2f#H2H2H2H2G2H2H2H2(2H-H(H7H7H7H6H2H2 H`Hèèü=ü=*Hú;èjèjèiÈbÈJÈbÈJH'’;’;ggô \\2ü › r¶Sr¶SM&,7 7 7,`,‚,V­ü ü ü `$h8h8ÐHÐHÐH˜0ð0ð0ÐHÐHT6ºHæH>HæHh8h88HÐH¸<ÐHH4æH6e: 0x<D6 4ÐH,ZD6,8Î?„6h8h8¸<4<€8h8h8ú8¨6ÐHú8ÐHÅ0ÐH<6ÆH<6âHH(M(cM ôôôøø”oo”c@M V2<<´(_?ZPPsÛAÊAÑAÖA¨AI1IVÄ=x?¤OML•>¥PR?î>H2HLHLHLHLÊ=Ê=Ê=‹M-/~?ªO\»žLb)N>SL›>ÀC­IžL•H”OŸ= PX?HLô>)OOM&L8OÊS .„þmþGþ-ÿùþ&þ!þ"þ&þsþþhþ-þWþˆþhþ-Þ´ÿñ2ÿìçèÿ÷$ÿ÷ÙÿöÿòÅÿðÕÿò¸ÿö£ÿ÷²ÿø¯ÿôÊÿò½ÿõÕÿ÷µÿø¸ÿø¿ÿöœÿó¢ÿöªÿ÷“ÿú•ÿúÂÿ÷ÿó£ÿø™ÿ÷ÊÿòŒÿô„ÿ÷ˆÿ÷¡ÿÑ×ÿøýÿ÷ôÿ÷Ñÿø‡ÿ÷ ÿ÷‡ÿ÷yÿ÷þGþGþhþ-þGþmþÑþðýöÒD(.(2(è(Ð(6"(Ý(±0(¹(‡(0(Z'(Z" (Æ %(  þ   (çZ;(P ×  [";(Ý(Q*úúMMôô («Aî8(¤5(7(.:(7(/G(8(,‰ÇÿöÉÿö€ÿöÜ Ÿ—ÿöÿö ÿöEÿöNÿö‹ÿöªÿöûÿöñÿöæÿö‘ÿövÿöÐ(Éÿö(„ÿö6ÿö¤)GÿökÿöÍÿö>ÿö>ÿö@ÿöÅÿö4ÿö ÿö0ÿö®ÿöÿöÈ)âÿöæÿö§ÿö÷Ûÿþ xnþuþQéÛÿö”ÿö—ÿö ÿö²ÿöðÿöÿöâÿöâÿöÊÿöšÿöÕÿö°ÿöÿörÿö£ÿö¬ÿöÿöRÿöRÿö-ÿö’ÿö}ÿö}ÿö$ÿöÿöHÿö8ÿöÿÿTþuþ=<ÿö<ÿö+ÿöwÿökÿöwÿömÿö:ÿö ÿöúÿöƒÿöÿöÆÿö-ÿö¨ÿöÿö4ÿöqÿöÿöàÿö•ÿö¶)ÿöt)ÿöãÿö]ÿöÿö¡ÿöôÿö×ÿöâÿöLÿöýÆþ ‹ÿöBÿö ÿöEÿöNÿöûÿöúÿöæú¡ú}ÿöÜ D(FF~»õ37ouz~ŠŒ¡Î×ñõasùV_‡Š¹Äêô w    ( 0 3 6 9 < B H M Q \ ^ uÀõùüô›žùEMWY[]}´ÄÓÛïôþ d q Ž ” ¦ ¨ ¬ ° µ ¹ Ó × á ð!!! !!!!!!"!'!+!.!2!8!;!D!K!N!!›!¨!Ê" "#"%"-"<"@"C"E"H"K"U"Z"a"g"k"s"‡""½"Ã"Å"ñ# ####*$#%Ì%æ%ï&,&g&o'@*-e-o.....§Œ§ªûûû6û<û>ûAûDûOÿýÿÿ  ¾÷$7Ptz~„ŒŽ£Ñðôp|‚1Ya‰°»Ðð y     * 2 5 8 < > G K Q Y ^ f Ðùû ž  HPY[]_€¶ÆÖÝòö p t £ ¨ ª ° µ ¸ Ð Ö Û å!!!!!!!!! !&!)!.!2!5!:!A!K!M!S!!ž!Ä""#"%"'"4"@"B"E"H"J"P"W"]"d"j"r"‚"•"»"À"Å"î###"#)$#%Ê%æ%ï&,&`&i'@*-0-o....(§ˆ§ªûûûû8û>û@ûCûFÿùÿÿÿãÿÂÿÀÿ¿ÿ»ÿ¸ÿ ÿœÿ˜ÿ•ÿÿÿŽÿÿ‹ÿsÿqÿgÿYÿQÿOÿ9ÿ3ÿ"ÿ ÿÿÿþúþùþîþéûÞûÝû\û[ûWûUûTûSûRûQûOûNûJûHûEû>û=û6õ ôýôúôùòVèKèIèHèBè@è>è<è:è9è8è7è6è4è3è2è0è/è-è,è+è èèèèè è èèçîçìçéçæç×çÖçÕçÑçÏçÎçÍçÉçÆçÃçÂçÀç½ç»çºçµç¯ç®çªçšç˜ç}çHçFçEçDç>ç;ç:ç9ç7ç6ç2ç1ç/ç-ç+ç%çç æíæëæêæÂæ¬æ¨æ—æ’åšãôãÛãÓã—ãdãcâ“ßÔÜ§ÜžÛøÛ÷ÛõÛíb”bw"   b   !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`a†‡‰‹“˜ž£¢¤¦¥§©«ª¬­¯®°±³µ´¶¸·¼»½¾KrdeiMx¡pkèvj ˆš fs ‘ ’gw J Y WM ol|6¨ºcn bT  Nm}Qb‚…—>?GHCD¹ ¾Á:o¹de # $LyEI[„ŒƒŠ‘Ž•–”œ›óf|qxyzz}{g°,°K°*PX°JvY°#?°+X=YK°*PX}Y Ô°.-°, Ú° +-°,KRXE#Y!-°,i °@PX!°@Y-°,°+X!#!zXÝÍYKRXXýíY#!°+X°FvYXÝÍYYY-°, \Z-°,±"ˆPX° ˆ\\°Y-°,±$ˆPX°@ˆ\\°Y-°, 9/-° , }°+XÄÍY °%I# °&J°PXŠeŠa °PX8!!YŠŠa °RX8!!YY-° ,°+X!!Y-° , Ò° +-° , /°+\X G#Faj X db8!!Y!Y-° , 9/ Š GŠFa#Š Š#J°PX#°RX°@8!Y#°PX°@e8!YY-°,°+X=Ö!! ÖŠKRX Š#I °UX8!!Y!!YY-°,# Ö /°+\X# XKS!°YXа&I#Š# ŠIŠ#a8!!!!Y!!!!!Y-°, Ú°+-°, Ò°+-°, /°+\X G#FajŠ G#F#aj` X db8!!Y!!Y-°, РЇ °%Jd#а PX<ÀY-°,³@@BBK¸cK¸c Š ŠUX Š ŠRX#b °#Bb °#BY °@RX² CcB² CcB° c°e!Y!!Y-°,°Cc#°Cc#-¸ÿ…°K°PX±ŽY±F+X!°YK°RX!°€Y°+\X° E°+D° E²L+°+D° Eº ÿ+°+D° E² 4+°+D° E² +°+D° E² +°+D° Eºv+°+D° Eº;+°+D° E°+D° E² ?+±Fv+D° Eº ÿ+±Fv+DY°+ÿ3ÆÙ}jrvv——h@lƒf7\xBJ9‹t‘dQFpa LN0000”ôœÈø0tÀ |ô X ” Ü @ è P  , ¸ „èôLÈDx\äD À8°ül¨(ŒØ˜˜àÔ ð!P!Ì""¼##t#Ð$,$”$ø% %X%œ&'@'Ô(„)<)Ô*Ä+L+¤,,€,¼-„..˜/D/ð0T1p222Ô3€3Ü4X4´5x5´6|7,7<7P7ü9p:h;;`<Ü<ô>8?Ø@ @T@dAìB0BÈBäCœD¨DìE¤F,FlFôGhH$H\I|JÄLˆLœL´LÌLäLüMM,MÔO O$O<OTOlO„OœO´OÌP P¸PÐPèQQQ0QdRLRdR|R”R¬RÄSPT8TPThT€T˜T°TÈVW¸WÐWèXXX0XHX`XxYhY€Y˜Y°YÈYàYøZ\[@[X[p[ˆ[ [¸\h\€\˜\°\È\à]˜^ì___4_L_d_|_”_¬_Ä_Ü_ì`à`øaa(a@aXapb8cDc\ctcŒc¤c¼cÔcìddd8dPdhe,eôf f$f@f\ftfŒgg¸gÐh h¬hÄhÜhôi i$i4iLidi|i”i¬iÄiÜiôjpjØjðkk k8kPkhk€lTlümm,mDm\mtmŒno¼oÔoìppp4pLpdp|p”p¬r0sÌsäsütÌuàuøvv wdw|w”w¬wÄwÜwôx x$x<xTy0z z8zPzhz€z˜z°zÈzàzø{{({ |Œ}œ}¬~p¼Ѐ°t„‚@‚䃨ƒ¼„8„ì…ü†Œ‡@ˆ\‰‰ØŠTŠÌ‹„Œ Œ„<ŽŽ˜Ш‘|’p“X””蕼–à˜˜$˜ø™Àšd› › œDœì žDžØŸXŸØ ˜¡X¢$£D¤¤$¤Ô¤ä¤ü¥¤¥´¥Ì¥ä¥ü¦¦,¦D¦\¦t¦Œ¦¤¦¼¦Ô¦ì§§§4§L§l§„§¤§¼§Ü§ô¨¨,¨@¨`¨x¨˜¨°¨È¨à©è««0«H«`«x¬T­,­D­\­t­Œ­¤­¼­Ô­ì®®®È®à®ø¯¯<¯T¯l¯„¯œ¯´¯Ì¯ä¯ü°°,°D°\°t°Œ°¤°¼°Ô°ì±± ±8±P±l±„±œ±´±Ð±è²²²0²H³(´(´@´X´ôµ˜µ°µÈ¶Ä·Ø·ø¸¸0¸H¸`¸x¸˜¸°¸È¸à¹<¹Pº$º8» » ¼ ¼à½´¾l¾€¿œ¿¬¿¼Á˜ìÄÀÅhÆ4Ç`ÇäÈÉdÉðÊLÊÀË”ÌDÌ Í|ÍÎ\ÏLÐиÑ(Ñ8Ò0Ó8Ô Ô Ô„Õ ÕlÕôÖlÖä׌נØðÙpÚ(Ú¤ÛÛ¤ÜDÝÝøÞ¤Þ¸ÞÌÞàß8ßÔàÄá|âÀã|ä8äLäàäøååðæ¼æÌç¸çÌèèèéäêàëØíî”ðñò|óœôÔõPõlõøö°÷ˆ÷œ÷°÷Ä÷Ø÷ìøøø(ø<øLødøxøäùHùÀùÔúdúôûû¤üüü`ü°üðýýý ý`ýtýˆýœý¸ýðþþþ|þÿ ÿ@ÿ¸  Ô ˜°ÄØìdÈ,Œà4”¨ÀÐäø  4Hd€”¤øXl€à4 ´ÈÜð  @ T h |  0 D X l „ Ì è ü  $ 8 L ` t Ô è 8 œ °  t ð,€Ôèütˆœ° ÀÔèü$8l„˜¬ÀÜø  |$<¤¸ÌÜð(<TlÀxœ¸Ð44H\xŒ ´`tˆìà0ÄØ  Ôè<PdxŒ ´ÈÜð,@„À@Pdäü@Xpˆ ¸ÐèøX¤´ÄÔ ” ¤ ´ ü!ˆ""`"p"Ä#\#Ä$$$„%t%ä&'P'h'€'˜'°'È'à'ø(Ä)Ä*8+,--À.ˆ.ì/L/ü0¸12,2<2à3˜4h585À6<77Ä8X9P9h9€9˜9°9È:È;|;”;¬;¼<¸=|>4?$?4?È?à?ø@Ð@èAÀAÐAàAøBBÐCŒD(D@DXDpDäDôEœE¬EøF F°G8H<H¬HÄI(I°IÀIÐIàJ8JHJXJhJ°K¼KÌLHL¸M$M¼NTNøOxP`Q8QàQðRÔS¨SôT T°U(V V|V”VðWtWðXXXhX¼XÌXÜY<YLZ\ZlZè[\[È\X\ô]œ^$^à_°`T`l`„axabHbXbhb€bcdddàdøee(e fPg gg,gähxh˜h¸hÐhèjØkLk\kxk”külDnôoàpÐqrLssÜt8t”uu v@ww´xTyz¼{H{Ð|\|ä}Œ~,~¨´€H€ÌHô‚ăЄ̅Ƥ‡‡”‡ðˆ@ˆØ‰d‰ÜŠTŠø‹œŒ Œ¤PŽŽpŽÜä‘’<“˜“Ô“ì””¸•\––°—@—Ș`˜ô™t™øšÔ›d›t›Œ›¤›¼›Ôœ|žDž\žtŸŸ(Ÿ@ŸXŸpŸˆŸ Ÿ¸ŸÈŸØŸð    8 H X h x  ¨ À Ø ð¡¡ ¡8¡P¡h¡€¡˜¡ü¢d¢|¢”£¤¤˜¥H¥ì¥ü¦ ¦¦,¦¤§§¸¨P©©¤ª@«p«Ð¬\­P­ð®®Ü¯ˆ°€±±t²”³(³œ´,µ<µÐ¶ð·x¸d¸üº0ºÈ»P¼½|½ü¿8¿”À|ÁPÁôÃÃÃlèÄ(Ä8ÅÅXÆ$ÆÈÇœÈHÈèɬÊ4ÊÈËÌÌ|Í ÍXÎ ÎøÏ„ÐÑÑ ÒÒôÓ\ÓüÔàÕhÖ8× ×ìØœÙ8ÙÐÚœÛÜÜlÝDÞÞÄßÔàpà€àÔá°áÈáôâ â(âlâ„â âÜã<ã„ã¤ãèä$äTähä˜äääøåå卿¨çpçÌèdè˜èôélêêXê°ë,ëÈì<ìàííˆî îÄïdððhðÌñLñ˜òLòÐóóhóÀôôdôxôôÌôèõöd÷ôù@úôûìýLþˆ $< $<Tl„¸¼Äè ` < ´ ¬ ph„¬d0d|È`x$< 4üÜd|\œ´Œ ˜!X"8#t#°#È$$À% %ø&Ð'd'x())|* *X**¨*À*Ø*ð+0+€+˜-¤-ä..˜/ /´00(0@0X0p0ˆ0 0¸0Ð0è2œ4 5ä7|7¸7Ð8`99¸:¨;¼< =°>”? ?à@„@À@Ø@ðAA A8APAxB4BäCìD|D”EFHF”G´HèJ@KÄMLMdM|M”M¬NìOOøPÜQ´RüT UV8WX4YXZ[\$]h^L_<`$a,aôbðcÀd¼e fägÀh°iljtkÄlÌmønèo´pphq qØrrŒräs„ttÄuuHvxwœx°yÜ{L{è|Ü}Ì,€|8‚؃¬„l…̆l†à‡Ì‰ ‹ÈŒ0Œôä ì’“T”L”ð•З(˜™™è›œ(<àŸh ¼¢$£ ¤4¥¦0§8¨`©ª«L«è­¬¯¯Ä°Ä±à³$³ìµ¶L·8·À¸¬º8»0¼(½¾¿TÀˆÁ\ÂàÄ8Å ÆxÇ´ȘÉÄʨËÀÌpÍœÎÌÏxÑLÒ¤ÔLÕ(Õø×h،ؠشØÈÙ@Ú(ÚˆÛäÜÐÝ(Þ@ß$ߨà\à¼á<á´â¨ã\ååpåÀæôç è”é(ê<êüë¼í íÔîDï ï¼ðtñ4òó˜ôôdõ8ö8ö¬÷Äùúû<üxýþ þ´ÿ4p” Ô@¼Øè d ø D ø ø , °¤0ôXð´œøôÀt¬Ô¼dl4Ld|”¬ÄÜô $<Tl„œ´´ ä ü!!4!L!l!„!œ!´!Ì!ä!ü"","D"\"t"Œ"¤"¼"Ô"ì##è$$$0$H$`$€$ $¸$Ð$è%%%0%H%`%x%%¨%À%Ø%ð&& &8&P&h&€&˜&°&È&à&ø''('@'`'€' 'À'à(( (@(X(p(ˆ( (¸(Ð(è)))0)H)`)x))¨)À)à)ø**(*@*X*p*ˆ* *¸*Ð*è+++0+H+`+x++¨+È+è,,(,@,X,p,ˆ, ,¸,Ð,è---0-H-`-x--¨-À-Ø-ð.. .8.P.h.€.˜.°.È.à.ø//(0 080P0h0€0 0¸0Ø0ð11(1H1h1€1˜1¸1Ð1ð22(2H2h2ˆ2 2¸2Ð2è33303H3`3x33¨3È3à44 484P4h4€4˜4°4È4à4ø55(5@5X5p55¨5È5è66606H6`6x66¨6À6Ø6ð77 787P7h7€7˜7°7È7à7ø88(8@8X8p8ˆ8 8¸8Ð8è99909H9`9x99¨9À9Ø9ð:: :8:P:h:€:˜:°:È:à:ø;;(;@;X;p;ˆ; ;¸;Ð;è<<<0>(>@>X>p>ˆ> >¸>Ð>è???0?H?`?x??¨?À?Ø?ð@@ @8@P@h@€@˜@°@È@à@øAA(A@AXApAˆA A¸AÐAèBBB0BHB`BxBB¨BÀBØBðCC C8CPChC€C˜C°CÈCàCøDD(D@DXDpDˆD D¸DÐDèEEE0EHE`ExEE¨EÀEØEðFF F8FPFhF€F˜F°FÈFàFøGG(G@GXGpGˆG G¸GÐGèHHH0HHH`HxHH¨HÀHØHðII I8IPIhIxJJ`JpJˆJ J¸JÐJèKKK0KHK`KxKK¨KÀKØKðLL L8LPLhL€L˜L°LÈLàLøMM(M@MXMpMˆM M¸MÐMèNNN0N°NÀNüOO,ODO\OtOŒO¤O¼OÔOìP0PŒPŒPŒPŒPŒPŒPŒPŒPŒPŒPŒPŒPŒPŒPŒPŒPŒPÈPØPèQQPQ`QxQQ¤Q´QÈR,RDRXRlR„RüS˜SðTDTTTlTŒTœTœTœTœTœTœTœTœTœVTX|X¼XÔXôY4YLYlYŒYÌZ [t[Œ\„\¸]]p]˜]¼^^4^ä__¨_À_Ø`8`¼`Ða`ataôbb(bLbøcTd¤dÄdìeeHedeŒe¼eàffffffff¨f¼gPhTi4iœj¨j¼k8k|k”k¨k¼kÐkäkøl l l4lHl\lpl„l˜l¬lÀlÔlìmmm(m<mPmdno p¨q¤q¼r„sœtœu¨v´w4wèx(xhx xÜy4yHyly˜y¬z z@{{|{œ{œ{ð||t|¼|ì}}},}D}¼€Ô„8„P…Ô‡¼‡Ìˆ ˆ¸ˆÈŠ,‹Œ$ŒLŒhŽè‘$‘4‘H‘\‘l‘|‘Œ‘ ‘°‘À‘Бà‘ü’$’8’L’˜’¬’À”¸”Ì”ì• •,•L•l•Œ•¬•Ì•ì– –,–L–d–t–Œ–¬–Ä–Ô–ì— —4—L—\—t—”—¤—´—Ä—Ô—ä—ü˜˜4˜D˜\˜|˜¤˜¼˜Ì˜ä™™™$™4™D™™¬™À™Üš<šXštšš¬šÈ›0›˜›ðœ œ œ<œ˜œ¬0L`|žž ž<žXžtžž¤ž¸žÌŸx \ Ð¡ ¢¢Ü¢ð£Œ¤|¤ì¥¥ø¦ ¦D¦ ¦´§§P§d§|§§Ä¨ ¨¼¨Ì©L©h©„ªd«X«°«ì¬(¬@¬T¬ˆ­­­ ­¸­Ø­ü®®,®D®\®|®¬®Ì®Ü®ø¯ ¯$¯<¯T¯l¯Œ¯¤¯Ä¯ä°°(°H°`°|°˜°´°ä±±±”±´±Ð±ì²²$²<²P²l²ˆ³³³°´D´\´t´´¬´È´èµµµ4µPµhµ„µœµ´µì¶¶¶¶ä··(·L·p·À¸¸(¸<¸ˆ¸Ì¸à¸ô¹<¹¬ºº ½¾$¾ØÁ|Â,ÃÃpÄ`żÆ4ÆlÈdÈàɘÊxËlÌ4Ì´Íl×È×àØìÙÜÚtÛÛ¸ÜÜ€ÜèÝŒÝÔÞÞ”ßà$àÐá8áÜâDâðãØäœäèåd娿çç çôèTééôêdêÀëë¨ì,ììíìî|ï@ï¼ð\ñtòPóôdôÜõ4öÌ÷ˆ÷Øø4øtù ùèû\ûÈûèüHü\ütüŒü¤ü¼üÔüìýý4ýPý€þhþ|þŒþ þØÿ$ÿäÈŒ<LH`Ìd ¬  $ Œ ¤ < Ø 4 Èlˆø¸4LlŒ¤¼Ôì4Ld|”¬ÄÜô $<Tl„œ´Ìäü,˜˜˜˜Àtð¼DÄhH$¬ø@à4ì¸ "$"Ì$Ä&è(°(È(à(ø))()@)X)p)ˆ) )¸)Ð)è***0*H*`*x**¨*À*Ø*è++,°.ˆ0h0ˆ0¨0È0è11 2À3¸4Ø5d66ü7x7¼8$8X99 :d:t:è;h;Ô<¸=$=`=Ü><>Œ?L?À?Ð@XABBBtBðCCC CxD$D¼DÌE¬F G\GàH@IIÈIàJØKKXK¤KðLL L8LPLhLøMMM(M8MHMXMhMxMˆM˜M°O8P\Q Q¸S(T UtVtW´XÈYôZ„[|\0\ø^\_L_ä`ta`bLctcÔd|elffØg„hŒi¨jHk k ldm`nn”oäpÜqtqÜrès˜t¬uuTv\vtvŒwlxLxðy¨z8{°}ŒØ¬ƒ8„¬†‡ÄˆØЍŒ ÄŽà‘t’˜“ü•Œ—˜¸š¸œŸ4 P h ì¡¡<£¤h¥”¦ð¨Œ©ð«¬P¬Ø­¸®¬°8±(²$³T´Ä¶\· ¸´¹Èº¸¼,½@¾À¿˜ÀÌÁÐÂàÄ ÅÇÈdÉhɄɠɸÉÐÉèÊÊÊ0ÊHÊ\ÊpË|˸#ÿuý #'+ª²++´% +°$/´( +°"/´# #+°/± é² +³@ +°,/°$Ö´( +°(±+±é°±"+±! é³!"+´+°!±+± é° ±)+´' +±-+±±99°!°9°° 9° ° 9±#± 9901>32#54>54&#"#5!%!!š!1D;!n‹2F-|#22#<-/?¹–þÞÚýy4ý̹Ab7" €f?R1 &12K.(4!1BL: þ±’’õ«üUFpÖ 6²+´ #+²+° /°Ö°2± é°2± é± +± °901#5#5*C)––ÖÒþË5Òý¼’’2Ö¨Ù 0²+°3´ +°2° /°Ö±é°± +±é± +01#'5!#'5¼*8(v*8(Ù‚‚‚‚ÿà)¹I°/³$3±é³$2² +³@ +²222°/³$3±é³ $2² +³@ +² 222° /±!+°6º>Îó¯+ °.° .°±ù° ± ùº>Ðóº+ °.°.°±ù°±ù°³ +³ +³ +³  +°³ +°³ +°³+³+³+³+°³+°³ +³ +°³+³+°³ +@ ........................°@01#7#537#53733733#3##7#737#’j(Macw"i"g"i"Zmdw(i(ggg Ìc™c®®®®c™cÌÌc™ÿ‚û!&+ª²+°3±é°(2² +³@! +² +±#é°2² # +³@  +²+°,/° Ö´%+°%° Ö±é°/±é°%±!+² "222´  +²'222° ±*+°2±é±é±-+±%°9±#µ "'$9° °901.=35&546753#54&'#5654ójsƒUÌkaD_n€)%tdqgDQ•T v[ jÕ/¦Th 66p^,7É bR`m i)µL?«ÄLIÿì_Å $-¢²+²+±*é²+° Ö± é´& +±&é´ +±é°./° Ö´ +°±+´ +°±"+´( +°(±,+´ +±/+±³$9±,(³$9±&*±"99± ² 999012#"&46"2654%3#2#"&546"2654ÎMkmKLlloF22F2;LþuMÕMkmKLlloF22F2½kMIkk–kc1"#11"#œý'tkNIkkLKkc1F11"#7ÿé¶Ó!*5—²+² +±( é²+±0é°6/°Ö±%é³%+±3é°%±-+´+°±!+´+±7+±%°9°3²999°-²" (999°´*$9±!±99±(°9°0µ"+$9013#'#"&5467&/&546265327654&#"q${¡.4&'3zdO=5#2– ?1, L’‰#28$8 67Ï*V"°/± é± é°/±+´ +±+01!5*þðV‡‡2È’/²+´ #+²+´ #+°/°Ö± é± é±+017#5È–’’’ÿòÊI²+°3²+°3°/°Ö´ +±+°6º=•î“+ °±ù°±ù±..°@013#ÐCÎCÊý(ÿéÔF²+± é²+± é°/°Ö±é°±+± é± +±²999±± 9901".546324&#"32>XŽb5n†Fa64B5380+#"+9jSµÁ5h„YP}k;‘uq“fs%$sDzÅC²+²+´ +´+°/°Ö±é² +³@ +°´ +°/± +01#5273#!]Œé]ý;Ôb² +±é²+± é² +³@ +°/°Ö±é°±+±é°2² +³@ +± +±³ $9±² 99901!!>7>54&#"#&546323NRL,þEZu@5/05†{npƒó;`A7A"}bs?RO;5=B; p}zÿéÔ+ ²+± é² +³@ +²+±' é²' +³@'+ +´!  +´!+°,/°+Ö±*é°2°*±é°/°*±$+± é²$ +³@$ +°$° Ö±é±-+±$*²999± ° 9± °9°!° 9°'° 9014>32#"&'332654&'퀆&#"#&/@9gz,1<8‡qmˆd.;*#6 |.*7(‚ò7T0 iX1GU>h{}jo? Å T²+²+´  +°3± é°2°/°Ö° 2±é° 2² +³@ +² +³@ +±+± ± 9901##5!53# JŒþ䥌¹tv²þL/þÑÿéŲ +± é² +³@ +²+±é´  +± é² +³@ +°2°/°Ö±é±+°6º?>ö,+ °.°.°±ù°±ù°.³....°@±±99±°901!632#"&'332654&#"#éþÛ9Bb{ŽrgŠ]5==5C~?Å}”+ˆmsŽs]XH>@I6‹ ÿéÔ)g²+±% é²+± é´  +±é³ +°*/°Ö±"é°2°"±(+±é±++±("³ $9°°9± %±99°°901!2#.#">32#".$"32654 $=/+‚'"#/ !@,[sƒj5TI((b<<0/=Qƒ"F0">B2"€ft L“}I;8HJ9;Å 4²+² +± é° /°Ö±é² +³@ +± +± °901#67!5~v orþŸÅn˜þ騼Œ}ÿé Ô +—² +±' é²+± é´!  +´+°,/° Ö±$é°$° Ö´+°/´+°$±)+°2±é´+±-+±$°9±)´ !&'$9°°9±!'± 99°±99°±9901#"&5467.54632"3264"2654&õ1+=7ŒopŒ7=0,cb³^;;/.;k2=>37AÿèÔ",p²+± é²  +³@ +²+±# é´( +± é°-/°Ö±&é°&±*+°2±é±.+±&± 99°*µ  $9±(°9°#±9901#"&'3325#"&54632'"2654&"3HB&\{‡/%u  ^v…j">E3!ý/78`<;r`’T3kR&Ê  ˆno‹/J„šIzGH:>J2È3²+´ #+°/´ #+°/°Ö°2± é°2± é± +017#5#5È–––’’’v’’2ÿRÈ B² +´ #+°/´ #+°/°Ö±22± é° 2± é°´  +° /±+01735>5##52– ?1-)V––’‰#28$8 85’’(ÿöÚ²+°/±+01 %5þ‚~þÚm…ƒo¶y24›°/± é°/± é°/± +01!5!5þäþ›wwðww(ÿöÚ²+°/±+015-5(~þ‚é m…ƒo¶y@,è#|²"+´# #+²+± é² +³@ +°$/°Ö±é°±"+±! é³!"+´+°!±+± é±%+±±99°!°9°° 9° ° 9±#± 9901>32#54>54&#"#5@!1D;!n‹2F-|#22#<-/?¹–áAb7" €f?R1 &12K.(4!1BL: þ±’’ÿv³é8Dɲ+²)+´+°"/´ +´1) +°93´1+°62´?) +´ +°E/°%Ö´+°±+´B+°B±<+´  +° ±+´, +±F+±327332654&#"327#"&54>32#"&'#"&2654&#"5lF)4]N04gÐ…f³ei¢Zs[eˆÎû†â¾ñ0KW(2@ =YD`ºþè/ˆ\r®t´`\–O)N.ç«~߄ձCtJ*) IdŠC/4{M.: ¯Ù ,²+°3²+´  +±é° /± +± ° 901%!#3# åþï1™¦üšY__““Ùý'þãP˜Ùc²+±é²+±é´ +±é° /°Ö± é°2°±+±é° Ö± é±!+± °9±°9°°9°° 901%#!!23254#3254#˜5jIþ¸EDc1.6yþN£jj£³ooÒ$DB(Ù(?</D#G ¥RSþÞ½^_(ÿé©åf²+±é² +³@ +²+± é² +³@ +°/°Ö± é°± +°2± é°2±+± ±99° ± 99±°901&#"32673#"&54632€YdaWFT’¨ˆ˜²´š¥ ⃈yw†LF}“Ͱ±ÎŠyP¬Ù 8² +± é²+±é°/°Ö± é° ±+± é±+± °9013!2#'3254+PTm%YYGŸ‡‡©©‡Ù(,j®°hU}ïðPqÙ J²+±é²+±é´  +± é° /°Ö± é°2² +³@ +³@ +³@ +± +01!!!!!æ‹ýßþ‡]:½}Ù}¥}PPÙ @²+²+±é´ +±é° /°Ö± é°2² +³@ +³@ +± +01#!!!æ–þ–?:þÆÙ}¥}(ÿëÅç {²+²+± é²+± é² +³@ +´ +±é°!/°Ö± é°±+´ +° 2² +³@ +±"+±³$9±°9±±9901&#"32>7#5!#'#"&546328(†_mu[%4,"¦$Z*hJ”ÁÄ„ªòu†vp"='}þv`=8ئªÔ„qPÙ ?²+° 3²+°3´ +±é° /°Ö± é°2°± +°2± é± +01!#3!3#þß–– —–KþµÙþïý'PæÙ!²+²+°/°Ö± é± é±+01#æ–Ùý'ÙÿéìÙ?²+± é² +³@  +²+°/°Ö± é°±+± é±+±°901".=332653)KF*–&+'*–z/[?HF2-,)ýåfoPÓÙ 0²+° 3²+°3° /°Ö± é°2± +±± 99017#33 #æ––±þÝB³ïôôÙþÀ@þÆþaBPCÙ,²+±é²+°/°Ö± é² +³@ +±+01!!æ]þ Ùý¤}ÙPÙ Š²+² 333²+±33° /°Ö± é°2°± +° 2± é±+°6ºÁ£ñž+ ° .°À±ù°Àº>ò5+ ° .° À±ù±°À² ...´ .....°@01#33##æ–à„€â––8ýÈÙý¼Dý'8ýÈP¡Ù B²+°3²+°3° /°Ö± é°±+± é± +±±99±±9901!#33 þÛ–š!–øþÙþðý'(ÿéæå F² +± é²+± é°/°Ö± é°±+± é±+±± 99± ²999016632#""32654&(ÁžÂ¿ ŸŸ[nn[Zom¿PÖÕ®¢×|‹æ‹ŠpvŒP}Ù B²+²+±é´  +±é°/°Ö± é° 2°±+± é±+± °901#!2#'3254&+æ–Bryxd»Œu9<ŒþüÙtno„}m86(ÿÊæå]² +± é²+± é°/°Ö± é°±+± é°2± +±² 999°±99± ² 999°² 999012'#"&6654&#"327'‡ŸÀ+%PLVSjžÁÁôR!m\[nnZ4$M娤J‹-LQQ2×N×þ1NB\t‹‹æ‹IP¥Ù(}² +°3² +±$é´% +±é°)/° Ö± é°$2°±+± é°° Ö± é° /± é² +³@ +±*+± °9°°9± °9°%°9°$°901%4654&+#!2#.4&+326í,1¬–‡8Q){  ¡ 46µµ55}" .)þßÙ&>?"„0 @>=*0µ8%¾&(ÿéå)Ÿ²+± é² +³@ +²$+± é²$ +³@ +°*/°!ֱ鰱+± é° Ö±é±++°6ºðãÁÏ+ °°À± ù° À³ ....³ ....°@±!±99°²$999±± !9901#&#"#"&'332654&/.54632gŒ‘:D:Pre\žŒ›’TLDO>Kfo^‘ƒ&GP:'ûr1)('_Vo}|u;>4.,0ZUku 1WfÙ:²+²+±é°2°/°Ö± é² +³@ +² +³@ +± +01##5!‘–ÝH\ý¤\}}Pÿé’Ù9²+± é²+° 3°/°Ö± é° ± +± é±+± ±9901".53 53™PKO:%––%:O$8];îþ‚‚îþ;]8$ƒÙ!²+²+°3°/±+±°901!#33‰ö—¢Ÿ—ÙýÛ%«Ù u²+±33²+² 333° /±+°6º>¥òæ+ °.°À±ù°ÀºÁlò•+ °.±°À± ù° À² ...¶ .......°@01!# #333á‡zw‡ÎŸqq”vmŸ9ýÇÙýÞ"ýÝ#Ù &²+°3²+° 3° /± +±± 9901#'#373£ê²Œ‹®æÞ²€†®tþŒýýojðð yÙ0²+²+°3° /°Ö± é± +±°9±°901#33’–ò§•‹¨þòËþ¾BBÙ ,²+±é² +±é° /± +±°9°°901!!5!5BþŒtýÜuþ‹Ù}þ!}}ß}Bÿ84Ù7²+±é°/±é°/°Ö´ +°2±é´ +°2± +01#3#4ppòÙfý+f¡ÿôÿò!ÊI²+°3²+°3°/°Ö´ +±+°6ºÃìj+ °±ù°±ù±..°@01#7êCêÊý(Øÿ8Ù@²+±é°/±é°/°Ö°2´ +°±é°/°´ +°/± +0153#53ppòÈfÕfü_= ·# #3 qysp¥},þÔ©ÿêÿ8Bÿˆ°/´ +´ +°/±+01!5Bý¨xPP_Õõ(°/´ +°/°Ö´ +±+±°9013#~FFõ–(ÿé% -r²+²+±+ é²+± é² +³@ +°./°Ö±(é°(±!+±22±é±/+±(°9°!³$9°°9±+±99°²"99901"&54?2>54#"#632#&575326ÌJZŸ8$  Q4*‡ ÚÝ ˜JI(0,$)#5:YI   6 *»¦þÔ%"Mð&  "#BAÿéEÙ]² +²+± é² +²+± é°/° Ö± é± 22° ±+±é±+± ±99± °9°°9°° 9012#"'#36"32654ba‚‚ac2ŒŒ2xhBA54B%¡}z¤N7ÙþýOu]JM^^JK(ÿé%C² +± é² +³@ +²+± é² +³@ +°/°Ö±é±+±°901"32673#"&54632#.&r=5). † bx…†ye}† -´±OZ-4aq”†Š˜pc5-(ÿé,Ù]² +²+± é² +²+± é°/°Ö±é°± +±22± é±+± ±99± ° 9°°9°°901"&546323#5"2654& d‚ab3ŒŒ4B4BBhBA¤yz¥Oý'7NÇ_KJ^\JM_(ÿé%V²+±é² +³@ +²+±é´  +´+° /°Ö± é°2²  +³  +±!+± ±99012!3273#"&546.#""#BE3 þ– -"PŠˆ[s„†ß71\%*AkE -+DP_•‚ˆæ;@{9ÙY²+² +±é´ +°3´+°2°/°Ö°2±é°2² +³@ +² +³@ +±+±° 901###535432&#"9SŒLLŠ)'&]þL´]A‡i*5(ÿ&#%&|²+±! é²+´ +²  +³@  +²+²+± é°'/°Ö±é°±+±$22±é±(+±±99°µ !$9±!°9°°9°°9013#"&'3326=#"&54632"32654&ž…‡zl‚‘R5B'C/dy€`Z27EEýÒ_iSF?=1I,"š~}§\`MI\\IKbAÙG²+°3²+² +± é°/°Ö±é° 2°±+±é±+±° 9± ° 9014#"#3632#V/=ŒŒ:d 97 ŒJd<.þ¼ÙþõW'N5þ–FÒÙ0²+²+±é²+°/°Ö°2±é°2±é± +01#7#5ÒŒŒŒýä½}}ÿ&ÒÙ 8²+± é²+±é² +°/° Ö°2±é°2±+± °901#"'532657#5Ò:A$/ ŒŒý†B:p[½}}A*Ù 2² +°3² +²+° /° Ö±é°2± +± ±990173#'#3ͱŸ¸Å¤8ŒŒJÒÌþ°î=±ÙAÍÙ!²+²+°/°Ö±é±é±+01#ÍŒÙý'ÙA=% h² +± 33²+²+° 3± é°2°!/° Ö±é°2°±+±é°±+± é±"+±°9°°9°° 9±±99013>32632#4&#"#4&#"#A‹#C.j)ŒNWbYþ–Ma:0þ¼(ÿé>% F²+± é²+± é°/° ֱ鰱+±é±+±±99± ² 999012#"&6"32654&2{}ŽŽ}9FF98GE%™‰‚˜™ ™q`š`_LP_Aÿ&E% _²+± é² +² +²+± é°/° Ö±é± 22°±+±é±+±±99±°9°±99° ° 9012#"'#36"32654cf|ad2ŒŒ2yjAA54B%¤ö£XþæöPYu^˜]^IM(ÿ&,% _²+± é² +²+²+± é°/°Ö±é°± +±22± é±+± ±99±° 9°±99°°901"&463253#"32654 d}ad2ŒŒ1jAA54B¢ø£YPý XÈ^˜]\JOAt%1²+²+²+± é°/°Ö± é°2±+± °9013>32&#"#AŒP0 {Œj7<Ž{þáÿé %-²++±é²+ +³@- +²+±é² +³@ +°./°Ö± é° ±+±&é±/+°6ºìùÂå+ ° ° À±#ù°$À³ #$....³ #$....°@± °9°³+$9°&±99±±&9901732654&/".54632#&#"#"'§+<17§   wgm|‡d%,±j1bCù"$4 SaaVI 3i;:#´ÿé4¢^² +±é°/°3´+°2² +³@ +°/° Ö°2±é°2² +³@ +°2²  +³@  +±+± ° 901#327#"5#53534N "/‰EEŒ]þÚ$b L]‘‘Aÿé$G²+²+± é²+°3°/°Ö± é° ±+°2±é±+± °9± °901!#5#"&5332653$Œ:hV_ŒZ3>Œ@WbYxþ¥a:0R !²+²+°3°/±+±°901!#33Z“½”um”þu‹  u²+±33²+² 333° /±+°6º>nñé+ °.°À±ù°ÀºÁfò±+ °.±°À± ù° À² ...¶ .......°@01!# #333j‘QV˜‘VRŒQR‘}þƒþ†zþ†z &²+°3²+° 3° /± +±± 9901#'#373b´¨[\¨´°¨XW¨þ𨨠££ ÿ%+²+±é²+°3°/±+±° 9°°901533#"'5326ÓÉšwpÞ  *%22þw‰ý   i4Ý ,²+± é² +± é° /± +±°9°°901!!5#5Ôþ÷þA ùqþÆqq:q%ÿ8=Ù"d² +±é°/±é°/´+°#/°"Ö°2´+°2²" +³@ +° 2±$+±"°9±±"99°°9°± 990174&#'536=46;#";#"&5v.AE6L%-)88)%L6E–,\>Ó=Oc9Ã7. .7Ã%cO=dÿ8´Ù"²+°/°Ö´ +´ +±+01#´PÙü_¡Hÿ8`Ù"d²+±é° /±é°/´+°#/°Ö°2´ +°2² +³@ +°2±$+± °9±± 99°°9°±"99013#+532=467.=4&+532.AE6L%-)88)%L6E{,\>Ó=Oc9Ã7. .7Ã%cO=Žß:h°/´ +² +³@ +° /´ +²  +³@  +°/°Ö´ +°±+´ +±+±±99±° 9± °901%2673#"/&#"#632\!N v-&9  Nx0#9"Þ#’*#‘*ÿÿÿÿBÿFØ HÀ$ÿ„ zD° /°Ö±é°± +±22´  +±22° ±+°2±é°2±!+±°901>73#5.546753#./"( †zY,hwrm,\y† (OS³þ¨-.Ztef•}• VUu]..þ°S—ÿéË9Ô²+°3±é°° Ö± é²*+±7 é²7* +³@71 +´"#* +°3´"%+°2°:/°Ö± é²  +³@  +³ +±'é°'/±é²' +³@'" +° ±2+±0é±;+±'²!$999°° 9° ³$9°2±*799°0²999±² 999±"² 999±7#°'9013#632327#"&#"'>54'#53.54632#'.#"³ ‹z4@N"P/:)LE##1<7?/Y<"‚l.,??-,?(Àb²+° /°3´  +°2°/°3´ +°2°/°Ö° 2±é°2² +³@ +°2² +³@ +°2±+±°901#3##5#535#53373ñŽŽŽŒ‘‘‘ŠË‹‹†‡À_;5;´´;5;aþþþŸdÿ8´Ù(²+°/°Ö°2´ +°2´ +± +01##´PPPÙþ{…ýäþ{…!ÿ7Ó<H³²&+²/+² +±é°$/±+ é³& +°I/°:Ö´@+° Ö°&3±é±(é°@±F+´+°°" Ö±.é°./±"é±J+±@ ±899°(°>9±.¶ $+7D$9±"F³ $9±+$°"9±&µ!2>D$9°± 9901.54632#&#"#"'332654./&546'654&} v[%>=& D#%5a,2Fxbу$+"* «O' *“.¬  Ka$K5M#F6c2A1ªjÉ ')"   d.V-=QL(P !ÿÿ m?ç&yayÿòÿêïç!-¼²+´( +²+´" +´ +´ +² +³@ +´ +´ +² +³@ +°./° Ö´% +°%±+´ +°± +°2´  +°2° ±++´ +±/+±°9° ´"($9° ² 999±´ %+$901#&#"3273#"&54632$ #"&54%"32654&(ZM5=;4X\fT\mn^Neþ±<àᢛß~}³²{³³¯NPŒNVOZ~jk}Tëàž ß➘¶€¸µ‚€¶IÙ#/² +´ +² +³@ +°/´ +° /´- +°0/° Ö´+ +°2°+´ +°/°+±+±$22´" +²" +³@" +±1+°6º Àù+ °°À±(ù°'ÀºÁª+ ±°°À±('±(ù°'Àº †Àß+ °³+±³+³+µ'(......µ'(......°@± ±99±+° 9°"°9±- °"9°² !%99901!5%#&'#"&54?>54#"#6 '5326Aþä$\ +7,6_"  1N R .#TNNF .6,W pd³f'(XHÔá 757757X§ee.§eeÚr•uYYr’r•uYYr'V x(°/± é² +³@ +°/°Ö´+±+01!#5!'øwþxþÞªÿÿÏ*Vÿòÿêïç#.:â²*+´5 +²%+´/ +´*% +´ +² +³@ +°2´#*% +´ +°;/°-Ö´2 +°2±+´ +°2°±+´ +°° Ö´  +° /°3´ +°2°±8+´' +±<+±°$9°²*/5999± ± %99±8°9±5°9°´ '-28$9°#°901#32#&546=4#'3264&+& #"&54%"32654& `î9@Fg=\g$$gM<àᢛß~}³²{³³9­»@9J" %), 61Q>ñàž ß➘¶€¸µ‚€¶l;»(°/´ +´ +°/±+´ +±+01!5;þÕ»OO—Æ® N°/´ +° /´ +°/° Ö´ +°±+´ +±+±±99± ² 999012#"&46"32654&/>YY@=YY?%44#&44®Y>@XZ|Y?4%#54%$4ÿÿ2ÿð„' ZÿD«†H8Z°/´ +°/´ +°/°Ö´ +°±+´ +°2± +±² 999°°9±³ $9013!>54&"#&54632H(4J»þÊ!08/ :\QKIN²*>"6Q.H'&,"%" EJEsI2"©²+´ +² +³@ +° /´ +² +³@ +°/´ +°#/°Ö´" +°2°"´ +°/°"±+´  +° Ö´ +² +³@ +±$+±"² 999±°9±° 9°°9°°901632#"&'332654'#53254&#"ŽBO4BWHIQ\=#T K!Ÿ“@59 G?KKDB"=>:&$y_=õ(°/´ +°/°Ö´ +±+±°901#7=~FFõ––:ÿ$=c²+°3± é²+± é²+²+°3°/°Ö±é°2°±+±é±+±°9°±99± ±99°° 901732653327#"&'#"'#3ÆT,9Œ  !%#*4#='†ŒÎn<.Rþz,W&ëøÿAÙN²+´  +°2²  +³@ +°2°/° Ö´  +° ´ +°/° ±+´ +±+01463!####.wX/+b?b\tïc‡Hü°Pü°Ê€@©¼$(°/±é±é°/°Ö´+´+±+013#@||${ÿ$&?²+² +´(+°/°Ö´ +±+±°9± ° 9°± 9901;632#"'732654&#"¢+#)C>7SE$!?&!-04 (…ò.P²+´ +² +³@ +² +³@ +°/°Ö´ +² +³@ +°´ +°/± +01#5273#“ku@_¦=KþWWÙj²+´ +°/´ +° /´ +°/° Ö´ +°±+´ +±+± ±99°² 999°±99±± 9901!52"&546"2654NþÓ–LTV”VVlD**D*TNN…\RN[\OP\D9\:9-/XHÎá 57'557'5ÿ§eev§eeOs”uYYr’s”uYYr(ÿìRæ Ʋ+° 3²+²+´  +° 3´ +° 2² +³@ +± À/´ +² +³@ +°/°Ö´ +² +³@ +°´ +°/°±+°2´ +°2² +³@ +² +³@ +±+±° 9±´ $9±°9°°901#5273#3#%##5#53#5“ku@_¾WþYW¨._³¥m_j^=KþWŽý!¼K]]Jþÿ¤¤(ÿìNè *Dz +²+´ +²+²+´(  +´( +± À/´ +² +³@ +°+/°Ö´ +² +³@ +°´ +°/°±%+´  +° ±+´  +°2±,+±° 9±%² 999° °9°³ ($9° °9±³ "%$901#5273#3#3!>54&"#&54632“ku@_¸WþYWª(4J»þÊ!08/ :\QKIN`=KþWŒý!@*>"6Q.H'&,"%" EJEÿìRå"&14*²++°%3²+´ +² +³@ +²#+´-4%# +°'3´- +°(2²4- +³@4/ +´ %# +´  +² +³@ +´%# +´ +°5/°Ö´" +°2°"´ +°/°"±+´  +° Ö´ +² +³@ +° ±++°22´* +°02²*+ +³@*( +²+* +³@+- +±6+±"³ &$9±±%99±+ ²#/4999°*°$9±4-°.9± °39°° 9°°9°°901632#"&'332654'#53254&#"%3#%##5#53#5ŽBO4BWHIQ\=#T K!WþYWˆ._³¥m_jR“@59 H?KKDB"=>:&$yý!¼K]]Jþÿ¤¤ÿÿ4ÿ4  "`Àÿÿ ¯„' ɾ$ÿÿ ¯„' Ê$ÿÿ ¯„' ˾$ÿÿ ¯z#|À$ÿÿ ¯„#j¼$ÿÿ ¯µ#zº³$ ÏÙ^²+°3± é²+±é°2´ +±é´  +±é°/°Ö°2± é°2² +³@  +³@ +³@  +±+01%##!!!!!!#·ß5™ªþ’Sþ­‚ýèCr˜˜Ù}¥}½}Gþ¹(ÿ$©å1¦²+±é² +³@ +²&+²+´(+².+± é². +³@ +°2/°+Ö± é°± +´ +°± +°2± é°12±3+± @ %&.$9°°9± ± 099±°9°±99±°+901&#"32673632#"'732654&#"7.'&54632€YdaWFT’£‰#)C>7SE$!+EK$o´š¥ ⃈yw†LF|‘(&!-04 S !"jıΊyÿÿPq„' ÉÈ(ÿÿPq„' Ê(ÿÿPq„' Ë´(ÿÿPq„#j²(ÿÿì„& Éù,ÿÿ*„& Ê#,ÿÿÿü:„& Ëõ, ÿÿ4„#jÿõ, ½Ùt²+±é²+±é´ +°3´ +°2°/°Ö°2± é°2² +³@ +² +³@ +°±+± é± +±° 9°°9°° 901#53!2#!4&+3#326aMMWl$*./)$mVþãÌZU‡––‡R]SP6'-3”¢“4-(lo¹PÖjÿÿP¡„#|Ê—1ÿÿ(ÿéæ„' ÉÜ2ÿÿ(ÿéæ„' Ê62ÿÿ(ÿéæ„' Ëæ2ÿÿ(ÿéæ„#|æ—2ÿÿ(ÿéæ„#já2Où¼ ''7'7¥T€T€€T€T¼TT€T€€U$ÿÙøí#q²+± é² +± é°$/° Ö±" é°"±+± é±%+±" ²999°³ $9°²999±²999°´ $9° ±9901#"''7&54632732654&#"éÀ ˆWS3VRŸ‰_S4YJ­þÉ2R\nþˆ:7U]ne£ÙK[._n“§×T\-ceþ¨0ŒtKãZ:ŒuSÿÿPÿé’„' ÉÒ8ÿÿPÿé’„' Ê8ÿÿPÿé’„' ËÈ8ÿÿPÿé’„#jÇ8ÿÿ y„' Ê <P}Ù K²+² +´  +±é´  +± é°/°Ö± é± 22°±+± é±+± °9012+#33254&+’ëwe»––Œu9<Œaãp‚ŒÙxþ¨m86Cÿé?Ù'x²+²+± é²#+± é´# +´+°(/°Ö±é°±+±é° Ö±&é±)+±´  #$9±&°9± ± 99°°9°°&901#"'532654춮&#"#4632½#0nb829MI1:4.).Œiƒe€›$G1z‰ iO8>A_.+',*%ýç`sfPfÿÿ(ÿéõ"CsDÿÿ(ÿéõ"v^Dÿÿ(ÿéõ"fsDÿÿ(ÿéí"|hDÿÿ(ÿéç"jjDÿÿ(ÿé"ziDÿèZ%.:>² +° 3±8 é°2²#+°'3± é²# +³@! +´; # +´;+°?/°Ö±5é°5±/+°2±é°;2²/ +³@, +±@+°6º TÀ×+ °°À±4ù°2À°³+³+³+°4³342+² Š Š#9°9°9²3429µ23......µ23......°@±5°!9°/² #999°± %99±8 ° 9°²999°;±,099±#²%>=99901%32673#"'#"&54?>54#"#632632532673&"ïr$; Šˆ[ˆ@YtM[Ÿ8#  U/+ƒáu:>].TO/þ %0P)#69Ø ÄâŽ'P_hiYL‘   5!)»22?{U &  >#A¥{(ÿ$%1š² +± é² +³@ +²#+²+´(+²)+±0 é²0) +³@0- +°2/°&ֱ鰱+´ +±3+±&±99°@  "#)0$9°²-999±°9° ³ "$9±0°&90132673+632#"'732654&#"7.54632#.#"´6+(. †€]$)C>:PC%"+hn†ye}† -+r*G9-4]u(&!-04 UzŠ˜pc5-ÿÿ(ÿéõ#CˆHÿÿ(ÿéõ"vfHÿÿ(ÿéõ"f{Hÿÿ(ÿéç"j|Hÿÿ Òõ"CùóÿÿFõ"vÑóÿÿÿ÷5õ"fïó ÿÿÿü.ç"jïó (ÿé>è&u² +±" é²+°3´ +±é°'/°Ö±é°±$+± é±(+±±99°$· $9° °9±"± 99°°9°´$9017#"&54632&''7&'"2654&Å%9W3Tql~}Ž„k$1(7M*F&4±9EErEDå 4"2M¾|Šš™‡y”@ .%,þ÷]LM]\KO]ÿÿA$í#|†Qÿÿ(ÿé>õ#C”Rÿÿ(ÿé>õ"vrRÿÿ(ÿé>÷#f‹Rÿÿ(ÿé>í#|‰Rÿÿ(ÿé>ç#jˆR2ÿõÚ 3² +±é°/± é°/±é° /° Ö°2´ +°2± +01!573#3#þ´||||#ww·{ï{ ÿÚX-#u²+± é²+²+± é°$/°Ö±"é°"±+±é±%+±"²999°³$9°² 999±±99°³$9°² 999017'7&546327#"326547&#"€H+K2}kKD+H/|tçÉ$27HóÊ'28G#I(MHp…™>F)IIk…™gÌ*`J(tÎ/`K.ÿÿAÿé$õ#C’XÿÿAÿé$õ"vzXÿÿAÿé$õ#f„XÿÿAÿé$ç#j„Xÿÿ ÿ%õ"v^\Aÿ&EÙ]² +± é² +²+²+± é°/° Ö± é±22° ±+±é±+± ± 99± ° 9°°9°°901632#"'#"32654Í2daad2Œ7jAA54BÙþóY£|z£Wþæ³þ×^LK]]IMÿÿ ÿ%ç"jl\ÿÿ ¯o#qÇ´$ÿÿ(ÿé»"qjDÿÿ ¯„#x˜$ÿÿ(ÿéì"xvDÿÍÙ\²+±33²+°/´ (+´ +±é°/°Ö´  +±+± ±99± °9°± 99±°901%!#3327#"&5467# ïþï1™§û4=L$'FNA;KX_`““Ùý'E%5/ 2-,Iþã(ÿ0%.;¯²+±9 é²+²*+²+± é² +³@ +°%/´ (+°54#"#632327#"&467#&575326ÌJZŸ8$  Q4*‡ ÚÝ mL $'FNB:MJI(0,$)#5:YI   6 *»¦þÔ%:G5/ 2XK"Mð&  "#Bÿÿ(ÿé©„' Ê"&ÿÿ(ÿéõ"vfFÿÿ(ÿé©„' ËÖ&ÿÿ(ÿé÷#f„Fÿÿ(ÿé©„#yÓ&ÿÿ(ÿéÛ#y„ÿôFÿÿ(ÿé©„' ÌÐ&ÿÿ(ÿéõ"gzFÿÿP¬„' ̯'ÿÿ(ÿéä' ^MGÿÿ½Ù’(ÿéhÙ ’² +²+± é²+²+± é´ +°3´ +°2°!/°Ö±é°± +²222± é°2² +³@  +² +³@  +±"+±°9° ± 99± ° 9°°9°°901#53533##5"&54632"2654& ……Œ<<Œ4‚‚ab3v4BBhBATCBBCý¬7N¤yz¥O&_KJ^\JM_ÿÿPqo#q³´(ÿÿ(ÿé»"qsHÿÿPq„#x¶˜(ÿÿ(ÿé"x|#HÿÿPq„#y±(ÿÿ(ÿéç"ypHPÿ‰Ùw²+±é²+²+±é° /´(+´ +±é°/°Ö± é°2°±+´ +² +³@ +³@ +³@ +±+± ° 9°± 9901!327#"&547!!!!æ‹mL)!GN}þ)þ‡]:½}:G5/ 2-Q9Ù}¥}(ÿ %'-†²+±%é²+²+±+é° /´(+´-" +´-+°./°Ö±"é°-2°"±+´ +² +³ +±/+±°+9± ° 9°± 99±"%°9°-±9901%327#"&5467#"&54632!327'.#" <8-L'(CM*5/#r…†t.SN/þ–.?O9/]˜*R4H#4/ 4-"7% –‚ˆ?{U EJE§GqTÙý'@C/ 4-L<Ù#ÿèÙY²+±é²+°/´(+°/°Ö°2±é°2° Ö´ +±+±² 999±°9°± 9901327#"&547#3#5}&(>HnMŒSSŒ€/ 4-GAýä:}}ÿÿPæ„#yÿ÷,FÒ!²+²+°/°Ö±é±é±+01#ÒŒýäPÿéÙP²+± é² +³@ +²+°3°/° Ö°2± é°2° ±+± é±+± °9±°901#".=332653æ–ä)KF*–&+'*–zÙþqý/[?HF2-,)ýåfoÿÿFÿ&ÞÙ#M Lÿÿÿéì„& Ëd-ÿÿÿíÿ&+"fåïÿÿPþÔÓÙ'Æ".ÿÿAþÔ*Ù'Æ·NÿÿF/¡ÿÿPC„& ÊP/ÿÿ*„& Ê#OÿÿPþÔCÙ'Æñ/ÿÿAþÔÍÙ'Æ*OÿÿPCä' ^"/ÿÿA¸ä' ^ðOÿÿPCÙ#y~–/ÿÿAŸÙ#yãˆO _Ù G²+±é² +°/°Ö° 2± é°2² +³@ +² +³@ +±+± ± 99017!!573ð¥¥oýûPP–§pXqÑ}8Y8 Ù 9²+² +° /°Ö° 2±é°2² +³@ +² +³@ +± +017#573Î88Œ88Œº(O(þ•&(O(dÿÿP¡„' Ê1ÿÿA$õ"v|QÿÿPþÔ¡Ù'Æ"1ÿÿAþÔ$%'ÆÒQÿÿP¡„' ÌÈ1ÿÿA$õ#g„Qÿÿ!~ì&\ÝQZPÿðÈå)`²+± é²+°3±é²+²+±é°*/°Ö± é°2°± +±% é±++± ²999±± %99°°901".#5232654.#"#3>32·(B3P  (B[–– V@ LRC+0Q]{˜‚.H/! bOþIÙM4%1GnBt±c0Aÿ&$%U²+² +± é²+²+± é°/°Ö±é°2°±+±é±+±± 99°° 9±°9013632#"'532654#"#AŒ:hV_:A$/ Z3>ŒNWbYþ8B:pŒa:0þ¼ÿÿ(ÿéæo#qâ´2ÿÿ(ÿé>»#qˆRÿÿ(ÿéæ„#xÞ˜2ÿÿ(ÿé>#x‡#Rÿÿ(ÿéæ„' Íú2ÿÿ(ÿé>õ#}ÛR(ÿéÖå#–²+±é²+±" é²+±é²+± é´ +±é°$/° Ö± é°±+± é°2² +³@ +±%+±±99°³$9±"°9±°9°± 99°°9±°901!!5#"&546325!!!&#"32|Zþ%C3‚§¨…0C$×þ¹+þ?*LPbbOM:½};.$×§©Õ#4}¥}ˆjI‹srŒ(ÿé©%)/›² +° 3±$ é°2²$ +³@$ +²+°3± é°-2´/  +´/+°0/°Ö±"é°"±'+±é°/2²' +³@ +±1+±'"± 99°± 99±$ ° 9°±"99°/±'99°±!99°°901%32673#"'#"&632632%"32654&.#">o%: ŠˆZqBLw}ŽŽ}zIAs$CE3 ý‹9FF98GEª7/` âŽ&P_KK™ ™LL*AkE Ò`š`_LP_ué°2 Ö±1é±A+°6ºó¯Á2+ °%°$À±: ù°;À³$%:;....³$%:;....°@±7(² 999°@ +4$9°°9± ° 9°± 99±4²(>99901632#"'732654&#"7.'332654&/.54632#&#"\$)C>9QD%!*€’TLDO>Kfo^‘ƒ&GP:'Œ‘:D:Pre\'&!-04 S vn;>4.,0ZUku 1W9r1)('_Ußÿ$ %Dâ²*+±é²A+²3+´8(+²+±é² +³@ +°E/°Ö± é° ±+±&é³0&+´; +°;/´0 +±F+°6ºìùÂå+ ° ° À±#ù°$À³ #$....³ #$....°@± ²56999°;@ *+38@A$9°0±-99°&±99±83°59°*³06>@$9±³&D$901732654&/".54632#&#"+632#"'732654&#"7.'§+<17§   wgm|‡d%,±jza#)B>8SE$!+kc"$4 SaaVI 3iQf(&!-04 T TRÿÿ(ÿé„' Ì 6ÿÿÿé õ"gqVÿ$fÙq² +´(+²+±é°2° /°Ö± é² +³@ +² +³@ +³+´ +±!+±³ $9°°9± ° 9°±9901#632#"'732654&#"7##5!‘#)C>7SE$!6MÝH\ý¤?&!-04 j\}}ÿF¢+—² +±é²"+°/´(+°&/°3´'+°2°,/°$Ö°(2±é°*2²$ +³@ +°2²$ +³@$& +°±+´ +±-+±$´ "$9°° 9°±99±°9° ³!$901#327632#"'732654&#"7&5#5353-N $#)C>7SE$!6oEEŒ]þÚ$b =&!-04 i rL]‘‘ÿÿf„' ÌŒ7ÿÿÿéàä' ^WfÙ]²+²+±é°2´ +° 3±é° 2°/°Ö°2± é°2²  +³@ +³@  +² +³@ +³@ +±+01535#5!#3##ˆsÝHÕnn–0}¯}}¯}þÐ0 ÿé-¢t²+± é°/°3´+°2°/°3´+°2² +³@ +°/°Ö±22±é±22³+°3´ +°2±+±°9°± 9901#3#327#"=#535#5353-NII "/‰JJEEŒ]|]M$b s]|]‘‘ÿÿPÿé’„#|Ê—8ÿÿAÿé$#|„XÿÿPÿé’o#qÈ´8ÿÿAÿé$»#q†XÿÿPÿé’„#xĘ8ÿÿAÿé$#x„#XÿÿPÿé’µ#zƳ8ÿÿAÿé$#z„XÿÿPÿé’„' ÍÜ8ÿÿAÿé.õ#}ÚXPÿ’Ù"v²+± é²+°!3° /´(+°#/°Ö± é°±+´ +°± +± é±$+±°9± ±99°² 999± ° 9°³ $901%327#".467#".53 53’(88(M')"<2/9;25_Z6––ë<`?6=!3/ -H;$6kIîþ‚‚î:ÿ4"‹² +± é²+²+² +°3° /´(+°#/° ֱ鰱+°2±é³+´ +°/´ +±$+±± 99±² 999± °9° ²999°°9014>7#5#"&5332653327#"&T-#@:hV_ŒZ3>ŒoL $'GNŠ2!@WbYxþ¥a:0Rýä8I5/ 2ÿÿ«„' Ë3:ÿÿ #fÚ!Zÿÿ ÿþy„' ˪<þÿÿ ÿ%"fj!\ÿÿ y„#jœ<ÿÿB„' ÊÜ=ÿÿÝõ"vF]ÿÿB„#y=ÿÿÝç"yT]ÿÿB„' ÌŒ=ÿÿÝõ"gS]4ÙE²+²+± é´ +´+°/°Ö°2±é² +³@ +±+±°9013##535432&#"æŒLLŠ)'&´]A‡i*ÿéEÙ !Œ²+²+± é²+² +± é´ +°3´ +°2°"/°Ö°2±é²222² +³@ +² +³@ +°± +±é±#+± ± 99±°9°°9° ° 901"32654'2#"'##53533#6whBA54BWa‚‚ac2Œ<<Œ……2°]JM^^JKÔ¡}z¤N7TCBBC~O(_Ù ,²%+±é²+±é²+´' +´% +°3±é°-/°Ö±)é²) +³@) +°)±%+± é°2°±+±é° Ö±é±.+±°9±°9°°9°'³ ,$9013254#3254#"&5463!2#!#"3­³oo³£jjþ`Wof_Dc1.6y5jIþ¸$K":½^_"¥RSþàrZdm(?</D#Gj$DB(CA'ÿÿ?‡ÙxïPÿéTÙ l²+²+± é²+±é² +± é°/°Ö±é±22² +³@ +°± +±é±+± ± 99±°9°°9° °901"32654'2#"'#!#6†hBA54BWa‚‚ac2Œ{ï2°]JM^^JKÔ¡}z¤N7Ù}†OŽÙ N² +± é²+´ +±é°/° Ö± é°2° ±+± é±+± °9°° 9°° 90132#!'32654#÷»dxyrþ¾a÷Œ<9uÙþü„ontÔKÇÛ68mÿéeÙ e²+²+± é²+² +± é°/°Ö±é±22°± +±é±+± ± 99±°9°°9° ±99°°901"32654'2#"'#'76—hBA54BWa‚‚ac2Œaí2°]JM^^JKÔ¡}z¤N7íQ›þýOÿÿ(ÿé©å &ÑÎÀ(ÿéßì"z²+±é² +³@ +²+± é² +³@" +°° Ö± é°#/°Ö± é°±+° 2±"é° 2±$+±±99°"±99±°9±°901&#"32653#"&54632632&#"€YdaWHY’­Š˜²´šdJS$/ ⃈yw†ND|”Ͱ±Î,3po(ÿéQ."]² +± é² +³@ +²+°3± é°2² +³@ +°° Ö± é°#/°Ö±é±$+±°9±°901"32673#"&54632632&#"#.&r=5). † bx…†yF3I/ † -´±OZ-4aq”†Š˜$pA5-ÿÿ½Ù’(sÙ_²+±é²+±é²+´ +°/° Ö±é² +³@ +°±+± é°±+± é± +±³ $901%3254+"&5463!2#!"3­‡©©‡Î`Wof7 FYYGŸþã$K"}ïðþàrZdmTk­°hUC@'4|ÙQ² +±é² +± é´ +±é°/°Ö±é°±+°2± é² +³@ +±+±°90174>;5!5!!".%#";4 %:d?£þ–þ¸Ij5²³5::5³Þ8E6%}ý')EHœ;0/;(ÿé,Ù l²+²+± é²+±é² +± é°/°Ö±é°±+± 22±é² +³@ +±+±± 99±°9°°9° ° 901"32654'25#5!#5#"&546^hBB45A•c2ï{Œ2ca‚‚°_KJ^^MJÒO†}ý'7N¤z}¡ÿÿÿI#AG À(IÙ J² +± é²+±é´  +±é° /° Ö°2± é²  +³@  +³@  +³@ +± +01!5!5!5!!5!³þ£]þ‡ýß‹:}¥}ý'}(ÿéæåS²+± é²+± é² +³@ +´  +±é°/°Ö°2± é² +³ +±+± ± 99013267"&5473!.#"#>32ÃhMLjÄžÁ–‰gOu6qvCžÂÀ%WefVþÄ×§"[hmWo'Õ®¡Ø(ÿéå'Ÿ²+± é² +³@ +²"+± é²" +³@ +´ " +± é°(/°Ö±é°° Ö±é°/±é² +³@ +°±+±é±)+±°9±²"999°±99± °9°°9°°901#&#";#"32673#"&547&54632tŒ‘:DŠLfGBODLT’›ŒžY?‘ƒ'FQ:&ûr1)gx@1.4>;u|}os1/]ku 1Wÿ&KÙL²+± é²+±é´ +±é°/°Ö± é°2² +³@ +³@ +±+±°901!!#"'53265!!á?þÂ:A$/ þ–·}þhB:p}ÿ&9Ù_²+± é²+±é´ +°3´+°2°/°Ö°2±é°2² +³@ +² +³@ +±+±±9901##"'53265#535432&#"9S:A$/ LLŠ)'&]ýîB:pó]A‡i*5(ÿéþì'¨²+²+± é²+± é² +³@' +°° Ö±# é´  +± é°(/°Ö± é°± +´+°&2²  +³@ +°´ +°/±)+± ³$9°°9°°9±°9± ±99±#°901&#"3265#5!#'#"&54632632&#"8(†_mu[Pi¦$Z*hJ”ÁÄkOR$/ ðu†vph:}þx^=8ئªÔ-4paÿì€ÙQ²+²+°3°/°Ö±é°±+± é±+±±99°±99° ± 99±²99901%32547#"&54733M 8 *TBFPLò§•‹¨ˆ š3j +:7.CzËþ¾BPÿðtÙ#m²+²+± é²+²+² +± é°$/°Ö±é° 2°±#+±é°±+±é±%+±#° 9±°9±±#99°° 9014#"#363232653#".5žV/=ŒŒ:d 97 &;7(ŠmzIb1Jd<.þ¼ÙþõW'N5|H=CH(þ¸i{!BL5AÿÐò@° /±é² +³@ +°/°Ö±é² +³@ +±+±° 9± °901732?#"&53Æ )> IX)/ ³þaBNôÙþÀøX:1-PNR,A*Ù>² +°3² +± é²+°/° Ö±é°2±+± ° 9± ±990173#'#4632&#"ͱŸ¸Å¤8Œ:A$/ JÒÌþ°î=±]B:pÿç„ò L² +°/°3± é°2² +³@ +° /° Ö°2± é°2² +³@  +² +³@  +± +01#5333##||†}}†:uCþ½uþ­ÿóJã$@²+²+±é²+± é°%/±&+±°9° µ $9°± 9901#57.#"76327327#".'&z²‘™)2;HŠn’  #!C(! \Nþ°Ð[Y_" z?9VXEþ{p# ÷Pÿö‚Ù h²+² +°3± é°2² +±33°!/° Ö± é°±+± é°±+°2± é±"+±° 9°°9°°9±±9901!#5#"'#"&533265332653‚•%H1r,AhWa–,%07–,%16–H,&VV_T0ýè#(<5òýè#(<5òÿ&œÙN²+² +± é²+°3°/°Ö± é°±+± é±+±° 9°±99±±990133##"'53265M˜!––þÜ:A$/ Ùþðý'öý¬B:pAÿ7$%D²+²+²+± é°/°Ö±é°2°± +±é±+± °9± °9013632#4#"#AŒ:hV_ŒZ3>ŒNWbYýÍa:0þ¼(ÿéæå#H² +± é²+± é´# +±é°$/°Ö± é°#2² +³@ +±%+±#±99012#".54>32675.#"†HwQ72K€PYŒQ)+RŠlhMLjgONiå,Kem:+\jQ7Dp„FH…oBþ@WefV}[hiZ(ÿéû q²+± é²+± é²+°!/° Ö± é°±+± é°° Ö±é°/±é±"+±±99°°9°°9±³ $9°°901"32654&632654'3#"‡[nn[ZomþEÁ–_Ž=7C¿ Ÿe‹æ‹ŠpvŒþZPÖ`- 0PdŽ¢×(ÿé’I !k²+± é²+± é²+°"/°Ö±é°±+± é³ +±é±#+±±99°°9° ± !99±´ !$9°°901"32654&#"&632654'339FF98GE°!{}ŽŽ|HŽ<7´`š`_LP_@_‚˜™ ™N- 0P(ÿ8äè (}²&+± é²+± é²+± é² +³@ +°)/° Ö± é°±+±# é°#±+± é±*+±±&99°#± 99°±99±² #999±°901"32654&4632>32#4&#"#"&‡[nn[ZomþEÁŠW I/cp–! ÀŸžÁe‹æ‹ŠpvŒþ¨ÖMidýã,)-2B3:¡Ø×(ÿ&&%r²+± é²+²+°3± é°2°&/°Ö±é°±#+± é° ±+±é±'+±#±99° ± 99°±99± ² 999°°901#4&#"#"&632>32%"32654&† {}ŽŽ|ƒG?NQþ%9FF98GE?ýç-$8 >R‚˜™ ™Q"0‚`š`_LP_(DÙ c²+²+±é´ +±é°!/° Ö±é² +³@ +°±+± é°2°±+± é±"+±°9°³  $9013254&+"&5463!2+##"3­Œu9<ŒÎ`WslRryxd»–1."m86þàrZgjtno„þüC#'Aÿ&E° i²+± é²+² +± é°/± é°!/°Ö±é±22°±+± é±"+±°9°² 999±°9°± 99° °901"32654'2#"'#4632&#"6xjAA54BVf|ad2Œ=B/ )2°^˜]^IMÔ¤ö£XþæA;p#PYPÿBsÙ%j² +² +² +±é´ +±é°&/° Ö± é± 22° ±!+± é° Ö±é±'+±!±99± ±"99°°9°°90132654+#332#&=4&#æz)&Oz––—6N'M ¡E,)"Fó»Ù½ 45*J"© *?®)9(ÿéå)©²+± é² +³@ +²+±' é²' +³@' +°*/°Ö±é°°) Ö±é°/±)é°±$+± é±++°6º æÁ+ ° °!À± ù° À³ !....³ !....°@±$)²999° ±99±'± 99014>3232673#"&546?>54&#"B':PG&ƒ‘^ofK>ODLT’›Œž\erP:D:‘û9W1 ukUZ0,.4>;u|}oV_'()1r#ÿé%-´²+±+é²+ +³@+ +²+±é² +³@ +°./°Ö±(é°(±+±é±/+°6º¸Â€+ ° ° À±%ù°$À° ³ +² Š Š#9³ $%....³ $%....°@±(±99°³+$9°°9±+±9901%3#".54?>54&#"#>32#326…‰ùCb1j±,%d‡|mgw   §71<+´#:;i3 IVaaS 4$ÿÿ<¤Ù0$ÿ+¥ä "j²+±é²+± é´  +± é°#/° Ö´+°± +±é°´+°/±$+± ³ $9± °9±± 9901"2654&"&54632327#"&5¸=WW=CQ+QXt·W==7Ž<7@WbYxþ¥a:0R=> 0PÿÿÿÝÏÊ 6÷ÊÀAÿô¡ÛG²+± é²+°3°/°Ö±é°± +±é±+± ±99°°9±°9017332>=4./3# AA$7>,)')§E=® þîóèýð', -O46VZA=' ]³g¸®)ÙR²+²+° 3± é°/°Ö± é°±+± é±+±° 9°±99°°9±³ $9014&#"#37632'•&%‡–ò§•T32&#"#"'532653~S0-%Á #2 !8Éš“º=Pi!3ýÚ 7. f-12BÙB² +±é²+±é´  +°3´  +°2°/±+± ° 9± °9013#!!57#537!5BŸkŸ¡týÜ¡g› þ‹Ù}ÍCÏ}}ÏCÍ}ÔB² +± é²+± é´  +°3´  +°2°/±+± ° 9± °9013#!!57#537#5Ë`3lpþAq5naùqrC…qq…Crq(ÿéÙl²+± é²  +³@ +²+±é°/° Ö± é° ±+±é² +³@ +±+± ±99°²999°±99± ±9901#"&'332654&'9#5!oRN‡qmˆd.;*#6lÿ‘‰i?h{}jo3232654&+57!5!lU 8 R^'&#`0ir4&\%SI9Isþø¹yPQlZq$$ u rP#'$"+m‰{l”_%ä-@²+± é²+± é°./°Ö±é±/+±´$9± ³&'$9012'!!7>7'57654&#"#7>)og<¿$nýõ95,®SA2#0 Š$8\ä‚gtQƒMƒG]A%ƒF/G/=.,)GJ3!ÿÿ(ÿñÙB<ÙÀAÿ&P( P² +² +²+± é°/° Ö± é±22° ±+±é± +± ±99± ±99° °901>54#"#3>32Í+TK.H]SŒŒ/YILf,I:V,# ^þÂMZf.9þöP..iY-XEI0:ÿÿdÿ8´Ù_ÿÿdÿ8@Ù"__Œ-ÿ8Ûl²+° /°3´ +°2²  +³@ +°/°3´ +°2°/° Ö±22´  +±22² +³@  +°2² +³@ +°2±+0133#3###535#53ÿFÖÖÖÖFÒÒÒÒÛþ‹P\PþÎ2P\Pÿÿ>ÔÖÎÿÿPö„#?´'ÿÿP›õ#@¾'ÿÿ(ÿé@õ#@cGÿÿPÿéOÙ#-c/ÿÿPÿ&Ù#M?/ÿÿAÿ&æÙ#MOÿÿPÿé¾Ù#-Ò1ÿÿPÿ&¢Ù#MÐ1ÿÿAÿ&3Ù#MaQÿÿ ¯„' ̾$ÿÿ(ÿé÷"gqDÿÿÿý;„& Ìö,ÿÿÿø6÷"gïó ÿÿ(ÿéæ„' Ìà2ÿÿ(ÿé>÷#g…RÿÿPÿé’„' ÌÈ8ÿÿAÿé$÷#g„XÿÿPÿé’Ý#qÈ"#jÈ8ÿÿAÿé$^#q…£¾ÿÿPÿé’' Ê„#jÇ•8ÿÿAÿé$„' ÊÒ¾ÿÿPÿé’' ÌÈ‚#jÇ“8ÿÿAÿé$„' Ì‚¾ÿÿPÿé’ ' Éȉ#jÇ—8ÿÿAÿé$„' É‚¾ÿÿ(ÿé% HGÀÿÿ ¯Ý#q¼"#j¼$ÿÿ(ÿé^#qj£¦ÿÿ ¯Ý#q¿"&$y¿“ÿÿ(ÿé[#qj âÿÿ Ïp#q¸µˆÿÿÿèZ»#q ¨(ÿéå'•² +²+±% é²+± é² +³@ +´ +°3´ +° 2´ +±é°(/°Ö±" é°"± +´  +±22² +³@ +°2±)+± "´'$9±% °9±±"9901%5367#5!3##'#"&54632#&'&#"327¡Ÿ¦$UUZ*hJ”ÁÄ„ª2O_mu[F5•P}£P—`=8ئªÔ„q1,†vp,"ÿ&x% .­²&+± é²+´+² +³@ +² +²,+± é´ +°3´ +°2°//°)ֱ鰱"+± 22±é²" +³@ +²" +³@" +±0+±)±99°"¶&,$9°°9±&°#9°°)9° °.901"32654&733##"&'3327#536=#"&54632 3?>27EEC…]r9±l‚‘R#4i'C/dy€`Z<°`MI\\IKblýÒChSF?CI,"š~}§\ÿÿ(ÿëÅ„' Ìæ*ÿÿ(ÿ&#÷#g JÿÿPÓ„' ÌÒ.ÿÿA*z#gŽ…N(ÿæå 'c²+± é°/´(+°(/° Ö± é°±"+´ +°±+± é±)+±¶%$9±°9°´ "$901"32654&4632327#"&5467.‡[nn[ZomþEÁžÂM•c9)L'(CM;4‰£e‹æ‹ŠpvŒþ¨ÖÕ®e¥h%4%2/ 3,*FÐ#ÿ9% &b² +± é°/´(+°'/°$Ö±é³$+´ +°±+±é±(+±¶ !$9±°9°´$$901"32654&'2327#"&5467.546.9FF98GE;o9)L'(CM;5gsŽ´`š`_LP_q™‰z– $5%2/ 3,*G•w…™ÿÿ(ÿæ\#qࡪÿÿ#ÿ9œ#qˆÿá«ÿÿ(ÿé„& Ìgyÿÿ#ÿq ÷"g}2ÿÿÿøÿ&6î&ï gïùÿÿPÙ#=Ò'ÿÿP¯Ù#]Ò'ÿÿ(ÿé@Ù#]cGÿÿ(ÿëÅ„' Ê,*ÿÿ(ÿ&#õ#v†JPkç N²+²+²+± é°/°Ö± é±22° ±+± é± +± °9± ±99°°901>54&#"#3>32á1JQ,.#]0‘‘/\FLm#1Q>\*þò!;QZ-(þ%]Ù3&mX/_JP4=ÿÿP¡„' ÉÈ1ÿÿA$÷#C°Qÿÿ ¯„' Ê"#zÄÿîB$@0ÿÿ(ÿé„"ziñ"D ʲÿÿ Ï„' Ê̈ÿÿÿèZõ#v¨ÿÿ$ÿÙø„' Ê6šÿÿ ÿÚXõ#vŽºÿÿ ¯„& ÎV$ÿÿÿéô#¯“ÿÿDÿÿ ¯„#± ˜$ÿÿ(ÿéð#±¿DÿÿPq„& ÎV(ÿÿÿéô#¯ŠÿÿHÿÿPq„#±ü˜(ÿÿ(ÿéð#±ÀHÿÿÿŠ6„& ΃,ÿÿÿ²2ô"ó ¯+ÿÿÿÿ„#±A˜,ÿÿ ð#±/óÿÿ(ÿéæ„& Î]2ÿÿ(ÿé>ô#¯§ÿÿRÿÿ(ÿéæ„+x-áÀ2ÿÿ(ÿé>ð#±ÖRÿÿP¥„& ÎV5ÿÿÿítô#¯fÿÿUÿÿP¥„+x áÀ5ÿÿAtð#±zUÿÿPÿé’„& Îj8ÿÿAÿé$ô#¯ºÿÿXÿÿPÿé’„+xáÀ8ÿÿAÿé$ð#±ÑXÿÿ(þÔå'Æä6ÿÿþÔ %'ƱVÿÿþÔfÙ'Æê7ÿÿþÔ4¢'ÆWW#ÿt"å/Q²+±- é°0/°Ö°2±é°±+± é°* Ö± é±1+±²%999°*²!$999± ° 901#7>32'367654.''767654&#"¯Štq€;P+N@lC:%®JX;Z!ƒ%55/94æ}vfR;;t(H66"*’:+4/% y6%*/1;ÿ{¼'6f²+±4 é²4 +³@4 +°7/°Ö±é°±2+± é° ° Ö±"é°"/± é±8+±µ(),$9°2²%-999± "° 901#54632'7>54&''767>54#"¦ˆqYVo&5&!8%C$#  H[E *E ,:&X[tfO@+,W+#" d( #3 s 8*ÿÿP„' ÌÈ+ÿÿAr#g }Kÿ)BÙM²+±é² +±é²+±é°/°Ö±é°2² +³@ +°2±+±°9°°901!#"'5326=!5!5BþŒt"G2&+þbuþ‹Ù}þ!Î*+v0}ß}ÿ(ÔT²+± é² +±é²+± é°/°Ö±é°2² +³@ +±+±±99±°9°°901!0#"'5326=!5#5Ëþ÷"G2&+þÇ ùqþÆÃ*+v1q:qÿÿ ¯„#yÉ$ÿÿ(ÿéÛ"yrôDPÿ+qÙ#”²+°3±é² +´(+²+± é´! +±!é°$/°Ö± é° 2² +³@ +³@ +³@# +°±+´  +±%+±±99°µ $9° °9± °9°± 9901!#632#"'732654&#"7#!!!æ‹þ#)C>7SE$!2÷þ‡]:½}8&!-04 cÙ}¥}(ÿ%6t²+±é°#/´((+°/´+°7/°4Ö±é°2²4 +³ +°±++´  +±8+±+°9° ±99±(#°%9°² &2999°° 901.#"72!3273632#"'732654&#"7.54671\l#BE3 þ– -"PŠ}T#)C>7SE$!3hw†?;@{æ*AkE -+DK^9&!-04 d“{ˆÿÿ(ÿéæÝ#qá"#já2ÿÿ(ÿé>[#qˆ ¸ÿÿ(ÿéæÝ#qä"#|æ2ÿÿ(ÿé>[#q ·ÿÿ(ÿéæ„&2yßÿÿ(ÿé>Û#y†ÿôRÿÿ(ÿéæÝ#qà"&2yà“ÿÿ(ÿé>[#qˆ êÿÿ yo#q£´<ÿÿ ÿ%»"qj\ÿ&Ò )²+± é² +°/° Ö±é±+± °901#"'53265Ò:A$/ ý†B:p[ÿÿÿé% D6À(ÿé¯% n²+± é²+± é² +²+± é°!/°Ö±é°±+°2± é±"+±±99° °9±±99± ³$9° °901"&5463253327#"'"2654& d‚ab3Š00M-k4M4BBhBA¤yz¥OFþrZ`Ç_KJ^\JM_ÿÿÿ÷‡3 ñ¯ÀAÿéEÙ #i²+²+± é²+± é² +± é°$/°Ö±é±!22°± +±é±%+±°9° ² 999±°9°°9° °"901"32654'2#"'#4632&#"6whBA54BWa‚‚ac2Œ:A$/ 2°]JM^^JKÔ¡}z¤N7]B:phOÿÿÿé% F.À ÿÍ%#,f²+±+ é²+± é² +³@! +´& +±& é°-/°Ö±é±.+±²999±+±99°&²$)999°³ $901">32#"&''7&54632#.&#"325r Pi4&<#1@-1G$ :LP#†ye}† -= L C´±.#5$55Q*  ( Z:C_Š˜pc5-þÊ* (ÿ&nÙ #g² +± é²+± é²+²+± é°$/°Ö±é°±!+±22±é±%+±!± 99°°9± °"9°°9°°901"2654&"&546323327#"&=*4BBhBATd‚ab3Œ /$A:4°_KJ^\JM_þ9¤yz¥Oüèp:B•N(ÿénÙ #g²!+² +± é²+± é²+± é°$/°Ö±é°±+±!22±é±%+±± 99°°9±!°"9°°9°°901"2654&"&5463254632&#"#5*4BBhBATd‚ab3:A$/ Œ4°_KJ^\JM_þ9¤yz¥O‡B:pýÂ7N(ÿé%V²+± é²  +³@ +²+±é´ +´+° /°Ö°2±é² +³ +±!+±±99012#"&'332>7!&54>3&#"%t†„s[ˆŠP"- þ– 3EBH× ]17%ˆ‚•_PD+- EkA*æ{@ÿÿ(ÿé% HGÀÿé ::x²+±é²+±é² +³@ +² +³@ +´ +´+°;/°Ö°2±8é²8 +³ +±<+±³ ,/8$9°´!)56$9°±+99017327".547!.#"#>273>7#".'¨71] l#BE3 j -"PŠˆ¶=Hj'    !/ $ (†Ï;@{æ*AkE -+DP_0E/o?   Ã+S954.#"#>3273>767#".'#"'§+'h25GG43h&05)óA! ïPh65gg5#f#6 ,0,65-¼¡N(5,¡$N^HD]N&ÿ&.V²+± é²+´ +°3± é°2°/° Ö°2±é°2² +³@ +²  +³@  +±+± °9017#"'53265#53533í:A$/ CCŒAÏþÓB:p‡ÆÆ‡(ÿ&c° /Œ²+± é² +²+´+² +³@ +²"+± é²/+°-/±( é°0/°Ö±é°±+± $22± é±1+±°9°µ"$9° °(9±°9°°9°"°$901"32654&#"&53326=#"&5463254632&#"&3?>26EEɇzn‘R5B'C/dy€`Z<:A/ )°`MI\RSWVþ>_iTE?=1I,"š~}§\kB:p#(ÿ&[% -’²+± é² +²+´+² +³@ +²#+± é²'+±, é°./° ֱ鰱+° 2± é±/+± °9°¶#%$9° °'9±°9°,´ *$9±'±%)9901"32654&#"&53326=#"&54632632&#"&3?>27EEȇzlƒ‘R5B'C/dy€`Z<E#7 °`MI\\IKbþT_iSF?=1I,"š~}§\[r(ÿê&R² +²+± é²+± é² +³@ +´  +±é°/°Ö±é±+± ° 9± ±9901"327#53#'#"&54632#.&r=5BXèZ?Nx…†ye}† -µ±OZCiþù3”†Š˜pc5- ÿ%" "_² +´+²+°3°#/°Ö´ +° ±+´+±$+± ±99°± 99°±99±³$9012654.''4>7373#"&"  y"¶›qrš¸; \GD`‚%.#6,Jõõþpm+FYY ÿèƒ&3—²+± é² +° 3± é² +±) é² +³@ +³@. +°4/°$Ö± é³-$+±.é°./±-é°±+±é³+±é±5+±-± '99°± 99°± 99±³$'$9± )° 901%4'3262632#4.#"#".5467&#"#>}92$¸5IM3B~-A$;@!$C@'9/ #,5&Ã"]Of4==={$?8~%6P**R7%€>;+:\4! Aÿ&$G²+± é²+²+°3°/°Ö± é° ±+°2±é±+± °9± °901##"&5332653$Œ:hV_ŒZ3>ŒÚWbYxþ¥a:0R@ÙS²+°3² +± é²+± é°/°Ö±é°2°±+±é±+±° 9°± 99±°9014#"#4632&#"632#ŽV/=Œ:A$/ :d 97 ŒJd<.þ¼]B:ppW'N5þ–Aÿ&Ù'a²+²+±$ é² +± é²+± é°(/°Ö±é°2°±'+±é±)+±° 9°'² !999°°9±°9014#"#4632&#"632#"'53265V/=Œ:A$/ :d 97 :A$/ Jd<.þ¼]B:ppW'N5þ8B:pÙW²+²+±é² +´  +°3± é°2°/°Ö± 22±é±22² +³@ +² +³@ +±+01#5##5#5353ÚŒÐDŒ@@ŒÙ}}þ}‡ÏÏ‡ÆÆAÿé )² +± é²+°/° Ö±é±+± ° 9013327#"&5AŒ %.A:þgp9B E²+± é°2²+± é°2° /°Ö°2´ +°2´ +± +±± 9901!#3!53#DDþð@@‡þò‡‡ÒÙ² +²+´  +´ +² +³@ +´  +´ +²  +³@  +°/°Ö´ +°± +°2± é°2° ±+´ +±+± °9± °9012673#"'#&#"#6323O!N vŒ NxŒ Z#’þóa#‘&þ†ûÙ_²+²+´ +° 3± é° 2´ +±é°/°Ö±é°±+±22± é°2²  +³@ +±+±°901";=33##5#".54>7¿**,Œ„„Œ-7%(O4³66{«þ¤þþ5$45#Aÿ&Ù )² +± é²+°/°Ö±é±+±° 9013327#"&AŒ /$A:^7üèp:AÿqÀÙ|² +± é²  +³@ +²+²+²+²+± é°/°Ö±é°2² +³@ +°± +± é° ±+±é± +± ³$9±²99901#"&'332654&'9!#3!.>T‡qmˆd.;*#6sþÅŒŒæ\Nh{}jo h² +°3± é°2²+² +±33°!/° ֱ鰱+±é°±+°2± é±"+±° 9°°9°°9± ±9901##"'#"&533265332653>Œ#C.j)32632#"'532654&#"#4&#"#A‹#C.j):A$/ NWbYþ–Ma:0þ^B:pAÿ&f%c²+²+± é²+²+± é°/°Ö±é°2°±+±é±+±°9°°9± ±99°±99°°9013632327#"&54#"#AŒ:hV_ /$A:Z3>ŒNWbYþWp:B«a:0þ¼A0 B²+°3²+°3° /°Ö±é°±+±é± +±±99±±9901##30 ÃŒ ÃýäRþ®þ®Rÿÿ(ÿé>%8(ÿéL% “² +±é² +± é²+±é²+± é´  +± é°!/°Ö±é°± +°2± é°2² +³@ +³@ +°2±"+± ± 99°° 9±° 9°°9°°9±°901!3#!!#"&546325!&#"327Hþýááþl7Eƒ‘ƒ?8–þj!U?JJ?S# JˆP~ž…„• ³CWJKYC(ÿ÷(4t²0+°,3± é°2² 0 +³@  +²!+± é°5/°Ö±é°±+± é°±+±&é±6+±± 99°±.99°°!9± 0°.9°±&9901%4&#"32>=332>%4>2#"'#".¡{~x &#”#.& ý‡5S‹´‹S5-<< d;9f0N@#ïcKZT)' ––)&*,OQ:%$:QO-9Y8$DD8e(ÿ7¢Ù n²+°3± é°2² +³@ +²+²+° 3± é°2°/°Ö±é°±+±22±é± 22°± +±é±+±³ $901%>54&'#5.67531::½0;:1u‚…rŒtƒ„sŒ\V]Œ]Oþ© \DH^y—ƒ|–³²˜˜´ÿÿÿøD U…ÀÿøAÙ1²+²+± é² +°/°Ö° 2±é±+± °901!#5#"'53253AŒP0 {Œk7<Ž{Ûÿ'‡=²+± é² +± é²+°/° Ö°2±é±+± ° 9±°9013327#"&=#"'5325¹Œ /$A:P0 {ý¥p:BÈ7<Ž{Aÿ8t%,²+²+± é°/°Ö± é°2±+± °9013>32&#"#AŒP0 {Œj7<Ž{þAÿ&t%=²+± é²+²+± é°/°Ö± é°2±+± °9± °9013>32&#"327#"&5AŒP0 { /$A:j7<Ž{þ¢p:BA¶%?² +²+± é² +³@ +°/° Ö± é° ±+±é±+± °901#4&#"#4632¶ŒŒ_VÀj7*-4þ³jYb#ÿ8˜%@²+± é²  +³@  +³@  +°/°Ö±é°±+±é±+±°901432#4&#"##ÀV_ŒŒj»bYýÎ4-*7A;Y² +°3² +±é´ +±é°/° Ö±é°2°±+±é±+±°9°°9±°9°°901#'##!23264&+!K6›³,Œ#6N'þ¬z,#%*zESÚÏÏ03_BÿÿKE ¶OÀÿ&>%9µ²++±é²+ +³@9 +²0+±5 é²+±é² +³@ +°:/°8Ö±-é°2° Ö± é°-±+±&é±;+°6ºìùÂå+ ° ° À±#ù°$À³ #$....³ #$....°@±8°09± ´*+$9°&±99±±&9901732654&/".54632#&#""'#"'5326=Ü+<17§   wgm|‡d%,±j1b†3:A$/ "$4 SaaVI 3i;:#UB:pÜÿ&4Ù9²+± é²+±é°/° Ö±é±+± ±99± ± 9901#"'53265432&#"æ:A$/ Š)'&Fý\B:p‘‡iÿ&=Ù_²+± é²+±é´ +°3´+°2°/°Ö°2±é°2² +³@ +² +³@ +±+±±9901##"'53265#53432&#"=S:A$/ LLŠ)'&;]þÄB:p]‡i*þõÿ&*07²+± é°/±é°/°Ö± é±+± ±99± ± 99014#"5632327#"&5\&')Š /$A:*i‡þp:Bÿ&'Ù"-e²#+±é² +±) é²+±é°./°Ö±&é°&±+°,2±!é°2±/+±&°9°!± 99±#)²999°²!99901%.'#".54>32432&#""3265&') I 5*El<( (P6#-Š)'&TþË I * q")1&/&13 ö‡i*ýó5- ÿÿ ÿm,& WAÀÿ&-¢^² +±é°/°3´+°2² +³@ +°/° Ö°2±é°2² +³@ +°2²  +³@  +±+± ° 901#327#"5#5353-N "/‰EEŒ]þ$b ]‘‘ÿét}²+²+± é² +°3´  +±33± é±22°/°Ö° 2±é° 2² +³@ +°±+±22±é°2² +³@ +±+±°9±°901!#5#"&=#53533533#!326=1Œ:hV_??ŒËŒCCþ©Z3>@WbY+‡ÆÆÆÆ‡a:0(ÿé°)n² +±é²+°'3±é°2°*/°Ö°2±é°±&+´) +°2°)±$é°$/±++±°9°&±99±³$$9°±&9901#".5467#5!32>54'5!d#)/EvILxD-)#JŽ &C*,E%Ž¢&]-54.'7C324&#"2:Ibuþû ù¤þ÷XS;<  5¨z.``q:qqþÆ4Q#ÿq e² +± é²  +³@ +²+²+± é°/° Ö± é° ±+±é±+± ±99°³$9°±99± °901#"&'332654&'9#5!x>T‡qmˆd.;*#6sù¤\Nh{}jo32#54>54&#"(/OJ+n‹2F-|#22#<-.@áPo4€f?R1 &1ÉÉ;S-%3#1BHI(èa²+²+± é² +³@ +°/°Ö±é°±+´+°±+±é±+±°9±² 999±°901#4&#"#54&'.54632ˆ@.-<#22#|-F2‹n+JO/áIHB1#3%-S;ÉÉ1& 1R?f€4oÿÿ(ÿñÙ 5<ÙÀAÿ7)ã9²+± é² +³@ +° /± é² +³@ +°/°Ö±é±+0132673#"&54632#.#"Í=5). † bx…†ye}† -+"0 ÂþOZ-4aq”†pŠ˜pc5- 87ÿÿ(ÿé>%#y±!RÿÿA ™,ÿö#'w²+± é²+± é´  +±é°(/°!Ö°%2±é° 2²! +³@ +°±+±é±)+±!°$9°±99±°!9° ³$%$9±°&901%2>54&#";#"2#"5467&4605,Zh34GG52tLe46hPï !Arg-56h=6#f#5¼&N]DH^N$¡,5(œS(ÿéZ%&[² +²+± é²+°3± é°2´  +±é°'/°Ö±é±(+± ° 9± ±99°±!#99°°901"327#53#'#"&54632632&#"#.&r=5BXèZO'x…†yM5#>)'-† -´±OZCiþú”†Š˜ i)$5-ÿÿA$¤ÿ&'Ù %)l²+±é²+± é²)+±(é²"+°*/°Ö±é°±!+± (22±$é±&22±++±!°9°$°9±² 999°² !$99901"3265&%.'#".54>323#5¿ I *>) I 5*El<( (P6#-ŒTTŒ- "q")1&/&13 Àþº}}ÿÿ!ÿ@  NKÀ<˜,²+± é²+°/°Ö±é² +³@ +±+01)33˜þ¤ŒÐþU(ÿ&n° !g² +± é²+²+± é°/± é°"/° ֱ鰱+±22±é±#+±± 99°°9± ° 9°± 99°°901"32654"&463254632&#"#_jAA54B—d}ad2:A$/ Œ1°^˜]\JOþ–¢ø£YhB:pýX(è%•²+²+±" é²" +³@" +´ +°3´+°2°&/°Ö±%é°%±+°2´+°2² +³@ +² +³@ +°±+±é±'+±±"99°± 99°° 9±"°9014>323##5#5354>54&#"(/OJ+n‹2F-VV|YY#22#<-.@áPo4€f?R1 &1]ZZ];S-%3#1BHI(è%‘²+²!+± é²! +³@ +´! +°3´+°2°&/°Ö±é°±+°2´+° 2² +³@ +² +³@ +°±+±é±'+±°9±² !999±°901#4&#"3##5#5354&'.54632ˆ@.-<#22#XX|WW-F2‹n+JO/áIHB1#3%-S;]ZZ]1& 1R?f€4o(ÿé×Ù!ˆ²+± é²+± é²+²+± é²+± é°"/° ֱ鰱+±22± é°2²  +³@  +³@  +±#+±±99±°9±´  $9±°901!!5#"&546323"2654&Îþ÷ýÉ4ad‚ab3Œþþ4BBhBAÍ÷qþÆq7N¤yz¥O½l_KJ^\JM_þÞ"(ÿqÝÙ%4©²*+± é² +±! é²+² +²+²+±& é²+± é°5/°Ö±é°±#+± 22±&é°2²&# +³@& +°&±-+±é±6+±#± 99°&° 9°-±99±!*³ '-$9°&µ#2$9±°901#"&'#5#"&546323!%"2654&332654&'9K>T‡qTud4ad‚ab3Œ¤ýZ4BBhBAÍRd.;*#6s\Nh{KD7N¤yz¥O½q_KJ^\JM_þ­o32%"2654&Ë 5tIbuþ4ad‚ab3Œ¤þ÷XS;<ý?4BBhBAÍùw7z.``7N¤yz¥O½qþÆ4Qº_KJ^\JM_þÛ%ÿé¢9ϲ0+±é²+±!é±322²! +³@! +²! +³@7 +°!´5+°2°:/°2Ö°62±é°82²2 +³@ +²2 +³@24 +°±+±$é°$± +±*é±;+°6ºìùÂå+ °° À±'ù°(À³ '(....³ '(....°@± $±99°*±99±!²$*99901#3%2654&/".54632#&#"#!"5#5353-N08§   wgm|‡d%,±j1bCþĉEEŒ]þÚ$4 SaaVI 3i;:#L]‘‘ÿ&8Ù"*޲+±)é²+± é²+±!é´ +°$3´+°2² +³@ +°+/°Ö°2±&é°2²& +³@ +°&± +±#22±é±,+± &°9°±99± °9±!°901#"'5326=#"5#535335432&#"#32ê:A$/ '[‰EEŒŠ)'&Œ4Fý\B:p2 L]‘‘A‡iýæ^þÚ$ÿé¢AÁ² +°3±0é² +± é²;+± é±#+22² ; +³@ ? +° ´%+°)2²% +³@%' +´ ' +± é°B/°"Ö°&2±-é°(2²-" +³@-+ +²"- +³@"$ +°-±8+± é±C+±8-°09° ²56999±0 °9°°29°³56$9°³ 8$901%&#"32">32#"&'#"5#53533#32>7&54632#.Ž L CBr Pi4&<#1@-1G$ b6 ‰EEŒNN #†ye}† -~* Z±.#5$55Q*  L]‘‘]þÚ$C_Š˜pc5-ÿ&&Ù/ ²+°3² +± é²&+±+é²+²+± é± 22°´"+°.2°0/°Ö°#2±é°-2² +³@! +°±+°2±é°2°±+±é±1+±°&9°°(9±± 99°° 9±"°9013632#"'532654#"####535432&#"3CŒ:hV_:A$/ Z3>Œ]ŒLLŠ)'&]NWbYþ8B:pŒa:0þ¼´þL´]A‡i*5AÿéÎÙ2¬²+²0+±é²+²+±"é²" +³@" +°3/°Ö±é°2°±+±%é°%± +±+é±4+°6ºìùÂå+ °°À±(ù°)À³()....³()....°@± %³ 0$9°+±99±°9°"²+999017#332654&/".54632#&#"#"&ÍŒŒE}K17§   wgm|‡d%,±j1bCjf**ÙýÕ3$4 SaaVI 3i;:#AzÙ H²+± é²+²+± é° /°Ö± é°2²  +³@  +³@  +± +± ± 9901!!3qþ÷ýÇŒùqþÆqÙ½qþÛ%ÿÿÿÿÿä.Z )™Z …)™mÒzX° /±é°´ +° 2°/±é°´ +°2°/°Ö°2´ +°2°± +°2´  +°2±+01!#5##!#5##¾död¾dödz¥CCÃ¥CC ÿ&EÙc²+± é²+²+± é²+°/°Ö±é°±+°2±é±+±°9°°9±°9°±99° ±9901##"&54&#"563232653EŒ:hV_ /$A:Z3>ŒÚWbYšp:Bþda:0R þÔ†Ù%k²+± é²"+± é²+°/± é°&/°Ö±é°±+°2±é±'+±°"9°°9°°9±°9°±99°±%9901732653327#"&57#"&54&#"5632îZ3>Œ /$A::hV_ /$A:Áa:0RýSp:BðWbYšp:Bÿÿ†TaKÿõ‡)™ÿÿ†S`ÿõ†)™ÿÿö¢_M„)™ÿÿ'†ðìUÿý†)™ÿÿ éåUåÖfÿÿ øæ†)™ÿÿ0†zæ ¶€åÖfÿÿ…åZ†)™ÿÿ øcæ\‡)™ÿÿ(ÓÏæ]ÿÿ(ÓŸæ&]]ÐÿÿDâ¾Ù\»ÀDâ¾Ù @²+± é°/´,+° /°Ö°2´+´+°´  +° /± +0135>5#DzE5"?Ùg=Q.+'Dã¾Ú :² +± é°/´,+° /° Ö´+´+°2´ +± +01#.=¾?"5EÚp'+.Q=gt=þ@°/´ +°/´+°/° Ö´ +²  +³@ +°2±+± °90132+53264&+t/BB/ B./B^  ÿÿc=í^a[À xDQ°/´ +² +³@ +°/°Ö´ +°± +´  +° ±+´ +±+± ±9901#4632#5254&#"`WHWHT7>Uq#IcB\MA)SwÀ9! xDQ°/´ +² +³@ +°/° Ö´ +°± +´ +°±+´ +±+± ±99014#"3#5.54632íI#qU>7THWHcN!9ÀwS)AM\B !Aw²+´ +°/°Ö°2´ +°2±+°6ºÁÂÏ+ °.°À±ù°ÀºìîÂè+ °.°À±ù±°À´.....²...°@015% 5µµƒ6bE79Eÿÿ  AbL<À/4ý8°/°3´ +°/°Ö´ +±+±³$9±°9013#'#3tIDEIýÍ}}ÿÿ/4þdM-À_Fõ+°/°3´ +°/°Ö´ +±+±°9013#'#tkgNRRLõ–dd _Gõ-°/´ +°2°/°Ö´ +±+±±9901#'373ÛkgNRRL_–aaLÏ'°/´ +°/°Ö´ +´ +±+01#53ÏPPLÅÿÿl;»qÿÿ_Øõv›ÿÿ_ÕõCdþý¬ÿÂ'°/´ +°/°Ö´ +´ +±+01#53¬HHþýÅÿÿÿi<ÿ¸qüýÿÿNÿFÿÜC=üçÿÿÿFØÿÜjüçÿÿMÿ1&qqL1ÀMÿ1 °/´ +°/°Ö´ +±+013N°X1 ÿÿ^ÿéèÊ_KÀÿÿWÿéáÊ_ÿôý¬†MœA°/±é°2² +³@ +°/°Ö´ +² +³@ +² +³@ +± +017533!5udtþ³ê²²ddÿÿ‹M¡tM'ÀcM± U°/°3±é° 2² +³@ +² +³@ +° /°Ö°2´ +°2² +³@ +² +³@ +± +017#5#53533ØdtudtØuuduudØM<°/±é±é°/±+01!5Mþ³3232?YG ?2)$G í :B ÿÔbTõ$°/°3´ "+°2°/± +±°901#7!#7˜~FF:~FFõ““““ÛMI&°/± é² +³@ +°/±+±°9015732>7".'SG,!    ),( JŒiTŒV)­!.G3#FÿÿZMš#G™D0 ÿÿ ùhç‡)™ÿÿ8…”`O†)™ÿÿsYèVƒ)™ÿÿ…bå[†)™ÿÿÿ÷†7j5ÿ݆)™ÿñÕ -²+°/±é°/°Ö´+² +³@ +±+01#!5Õfþª üÑÉfÕ =²+²+±é² +³@ +°/°Ö°2´+² +³@ +± +01#!5!5ÕfþªV üà$f–Õ ;²+°/±é² +³@ +°/°Ö°2´+² +³@ +± +01#!5!ÕfþªV üà_f[Õ ;²+°/±é² +³@ +°/°Ö°2´+² +³@ +± +01#5!5!ÕfþªV üà–f$Õ 5²+±é² +³@ +°/°Ö´+² +³@ +±+01)5!3ÕþDVffº9îg5²+±é² +³@ +°/°Ö´+² +³@ +±+0133!9fOgýÿf9îo;²+°/±é² +³@ +°/°Ö´+°2² +³@ +± +01#3!ŸffOþþoþúgÿÿ ÿHKÿÞgüéÿÿ < &q´qRÿÿ8â€ÙHÿÿÿ(4ÿödM&Àÿÿÿ(/ÿödÿûüùÿÿ ÿBÿûbüßÿÿ þùBÿôcüÙÿÿLÿ8ÿìzÿÿüêÿÿ"‡ækÿ(ÿÿ‡…'kÿ(k°ÿ(ÿÿ…‡'j¯ÿ&jÿ(ÿÿÿkyÿë| üþÿÿ2AÈIA ñ¿ü6°/±é² +³@ +°/°Ö´ +´+´ +±+013## ¶Pfüf¥ ñÁüB°/±é² +³@ +°/°Ö´ +°´+°/°´ +°/±+01#5#5ÁfPüþõ¥fÿÿ ÿ¨¿³šÊ¤Àÿÿ ÿ©¿´™È¥Àÿ:0ÿÃ<°/± é°2± é°2´ +°/°Ö´ +°±+´ +± +01!533530þîNvNƉ;;ÿ8/ÿä6°/´ +² +³@ +°/°Ö´ +² +³@ +±+01!53/þïPxP¬\ÿëÿ\ÿû-² +°/´ +°/±+±±99° ± 9901#.'>7\ý$$Y 2($#Y=+$N ,&!+ÿÿþÁ_ÿ…õCþ°ÿÿÿ)_ÿíõvþ°ÿÿþ¸\ÿöòfþ°ÿýÿÿþ­pð|þ¶ÿÿþÆlÿñ»qþ¶ý¾€Ð ²+´ +²+´ +°/01!5ý¨ÐPPÿÿþÖ]ÿÞìxþ³ÿÿÿ&mÿ”çyþ¶ÿÿþÃmÿõçjþ¶þä4ÿ}õ\² +´.+°/´ +°´,+°/°Ö´ +°±+´ +±² 999± ± 99°° 901#532654&#"'632Û,, %(04F@ 2&$3ÿÿÿNÿ´zþ³ÿÿþ‡bõ}þ³ÿÿþ¼_ÿúõgþ³ÿÿÿ.Lÿ~hþ¯ÿÿþéLÿÊ&­»­Lþ‡bõ °/°3´ "+°2°/±°9013#%3#½~FFþÆ~FFõ“““ÿÿþÖ]ÿÞJ#xþ³yþ³cÿÿþÖ]ÿÞì xIÀÿÿÿ:ÿ‰ø ³þÇ+Àÿÿÿ>3ÿÂñòþêÿÿÿ;3ÿ¿ñ*þêÿÿ)„ç³Âÿöÿÿþúÿ;ÿ¾ÿÑCþéüÜÿÿþûÿ=ÿ¿ÿÓvþ‚üÞþßþÔÿÄÿÔ=°/±é² +³@ +² +³@ +°/°Ö°2´+² +³@ +013#5#53¢ff,ÿMfÿÿþßþÔÿÄÿÔ¸þ£þ¨Àÿ3¡cÑ1²+±é² +³@ +°/°Ö´ +² +³@ +01!#5#Í0dÌÑþÐÌÿh©R  3²+± é²+°/°Ö´+² +³@ +±° 901+532654'7R®5#âzF4$CDl2I.-ÿÿþÎÿ$ÿÙzþ³ÿÿþàÿÿ¿{þ³ÿÿÿ5ÿÿ…ÿÔ­üÃþÏÿ;ÿáÿÄ8°/°3± é± é°´ +°/°Ö´ +°±+´ +01!#5##þÏNvN<‰;;þÀÿ9ÿòÿ³j°/°3´'+°2² +³@ +±22°/° Ö´ +°±+´ +°±+´ +±°9°°9°°9±°901#"'#"&=332=332=7%"#$74%&4%&M"$44$""$$""$$"ÿÿþ¼ÿ8ÿúÿÎgþ³üÙÿÿþ±ÿ8ÿïÿÎ gÿø-ÀÿÿþÖÿ=ÿÞÿÌxþ³üàÿÿþÓÿ8ÿÛÿÇ xÿþ$ÀÿÿþªÿM ÿÍ|þ³üàÿÿþÃÿLÿîÿ›qþ³üàþHÿT~ÿ¤°/´ +´ +°/01!5~ýÊ\PPÿÿþ<þþrÿÉ&Òô%Òôªÿÿþ0Øÿ’X|þ9þkÿÿþYÝÿ„,qþIþqÿÿýÚâ2Òÿ’ŽýCÿóh3#YLýœLhý›ýCÿÃÿóí3#YLýœLíüÖÿÿÿ5ÿÿ¿ÿä¼þƒþØÀÿÿþÏÿ:ÿáÿÃÊþ°þþÀþ½þÔÿÂÿÙ4°/´ +°/´ +°/°Ö´ +°±+´ +01!!75#þ½þû¹m'þûLmmþ ÿRÿÒÿÅZ°/°3´.+°2°/°Ö´ +°±+´ +°± +´  +±°9°°9° °9±°9014632632#4&#"#54&#"þ 3%&'$3,,“%34$ÿÿþ².ÿòG™þw%0 ÿCÿ‹U/°/´*+°/°Ö°2´  +³ +´ +°2015654&547à%&l%%7D0 g9 0 d"ÿÿý¸QÿîÓÿ|SÿÿþÄ`ÿˆöCþ³ÿÿÿ)_ÿíõ¡ÿÿþ­pð|þ¶ÿÿÿ>3ÿÂñ³ÿÿþµX þ¶ÿÿÿ5ÿ8ÿïÿÑþ³ÿÿþÏcÿáìÊ(ÿÿþ¾þîÿêÿ¸&Ñû¢Ñüÿÿþ½ÿ ÿŸÿÎ&ɈúÉúþãÿÿ‘ÿÀ8°/´ +´ +°´+°/°Ö´ +² +³@ +013#5#þã®[S@®Wþ†Dÿè!a²+´ +°2³+´  +°/°Ö´ +°±+´ +±°9°³ $9±±99± °901#7&#"#>32733273#"/Þg??2)% `. ?Y Dh:B 4O0 ÿÿþ™ÿû„#|þ¢&#yþÑyþoÿ°ÿÿþƒEÿåR#|þŒÿØ|þŒeÿÿýÿÿÿ»ÿÒG .ýìþñ $~þ~þÔÿpÿß 2°/´ +° /°Ö´ +±°9±´ $901#5'67'ð3("?9B7"=þÔ¨"7/JI0MJ=-@@-=Jýíÿ ÿ³ÿß%1`°/° 3´ +°&2°#/°,3´ +°2°2/°Ö´ +°±)+´ +±)µ !.$9±#·!).$901>32#".'#"&546323267&#"2654&#"þÐ028;*63+::0 9„"00aC$'BB'#D"I)8)þ™4ÿ¯P(°/´ +°/°Ö´ +±²9990137#7#þÜa$–E_'˜Pe¸_þ£ÿ ^ÿÏ?° /±é² +³@ +°2°/°Ö´ +°±+´ +±± 9901>73"&'.'326Ô*L0M$z|y$M0L*"vvwtHB  BH ÿÿþ§9bûü,þ¬TT³°/´+´+°/01!!þ­¦ýZ³_ÿÿþ¬ÿeTÿÄþýþ—T[`°/±é² +³@ +°/±é² +³@ +°/°Ö´ +°± +´  +± ²999±°9±°901#43232653#"/&#"þàH¹,-·) 6*Q#G0?E™!!0 m¯E&%$5#? ÿÿþ£†^HüUÀþÄþèEÿõ ²+°/´ +° /±°9015!'7'7þÄÎ7>/6FF6/>7¸L2/**32**/1ÿÿþ§9ÿdDþ˜BQÿÿþ•:ÿUHþ†CQÿÿþä?ÿULþÊ?Qÿÿþ”:ÿ`Rþ…CQÿÿþ­:ÿeXþ•CQÿÿþ·;ÿrFþ¨DQÿÿþ¨:ÿmXGþšCQÿÿþ·9ÿlPKþž:Qÿÿþk<ÿŽ PþS<Qÿÿþß<ÿU UþÇ<QÿÿþÏ:ÿ=DWþÇCQÿÿþ“:ÿZYþ:Qÿÿþœ:ÿb[þ—:Q8[I(°/´ +°/°Ö´ +±+±°901#7IÑ@[ºº:ÿFK"²+´ +°/°Ö´ +±+0173:Ñ@[ººº‚ÿ8<ÿÑG° /´6+² +³@ +³@ +°/°Ö´ +°±+´ +±+±° 90132>73#"&=3Ý  ';1'[o  *,A,ÿÿ2ÿRÈÿÿ]_!õ¡4ÿÿXM  P°/± 33±é°2² +³@ +° /°Ö´ +°± +´  +± +± ²999° °901#7#5!#5þBF4XLX ´´Rbbbbÿÿ ¯õ&Äqv(°/´ #+´ #+°/°Ö± é± é±+01#5–’’ÿÿúõ&£#‰ÿÿõ&£%ÿÿ^õ&£'xÿÿÿéøõ&£-ÿÿ¹õ&£2Åÿÿ5í"£Ò6>ÿÿÿèÿï…"éF:ÿÿ ¯Ù$ÿÿ1yÙ%áPfÙ,²+²+± é°/°Ö± é² +³@ +±+01!#!fþ|’Sý­Ù ÞÙ"²+±é²+°/±+±°90133'  ‘*Ï¢˜Ùý'}¨þXÿÿPqÙ(ÿÿBÙ=ÿÿPÙ+(ôÖ#O²+± é°/± é°!/±"é°$/° ֱ鰱+±é±%+±³ !$9±"!³ $9012#".54632>54.#"!5!Ž¢ÄÌš-[cJ1Æ7sb&FD(,;7lk‘þˆxÖÅ¥¤Å2MQªÈþh3cD7X4" ‰›zÿÿPæÙ,ÿÿPÓÙ. ¿Ù!²+°3²+°/±+±°901#3#]Ã~$•ýåÙý'Pÿù>ÕF²+±33²+°3°/°Ö±é°±+±é±+±± 99±² 99901###3673>‘©}¦‘¿ `,,!„¯Çþ9Íþ3Üþüa^IPÿø¶Ô H²+°3²+°3° /°Ö±é°±+±é± +±°9±°9±±9901##33¶‡þ¯Ž‰QŒáþÜþâ2zÙ )² +± é²+± é´  +± é° /± +01!5!!5!!5!jýÈ88þ>ÂHý¸HZþ]þKÿÿ(ÿéæå2Pÿù²Ô/²+°3²+± é°/°Ö±é°±+±é± +01#!#!²þ¾b[ý¥ÛPÿø¤ÔB² +² +± é´ +± é°/° Ö±é°2°±+± é±+±°901+#!22654&+¤ '>mGŸ'*;M4/þÝQ>DMŸ÷ :A.þéÜ.Mš229'Ć٠2²+± é²+± é° /±+±°9° °9°°901!!5'5!!0¸ß­ý˜åÃ2þ†þú€uâq€~Ü:²+²+± é°2°/°Ö±é² +³@ +² +³@ +± +01###5!~îìj\ý¥[€ôÙ0²+²+°3° /°Ö±é± +±°9±°9013#3}ˬþËþÖ¯²'þZþÍ3¦(ÿóíÓ%v²+²+´ +°3± é°2´  +° 3± é°&/°Ö±#é°#±+±22±é±22°±+± é±'+±°9°± 99° ² 999014>753#5.%4&'>(2DX;ƒ¢2CX;…¡8RACPþèARU\Fn=( OO¨xEm;' GG¡~CYþ¤]l\XDKZ ÿùØ&²+°3² +°3°/±+± ± 9901#.'# 3>73µŠ# ²,þ÷¯Š¨þî'µ3ÿ`"¡,'«þ¤FÿöúÜO²+²+±33´  +°3± é°2°/°Ö±é°±+°2±é°2°±+±é±+01##5".5332657ú1JJ/0CO/!Œ8RˆIAŒq:W3 ŽŽ1[?kþ¥A8Õþ+1H[(÷íi² +°3± é²222°/±é°/°Ö±é² +³@ +°±+±é°2±+±° 9°±99°°9± ³$9014&#"!53&54>323!56hye^u®þÃ{vR¡h§Èzxþ¸»}iŽk¼HvzbŸb§iÒœ§^zuKÿÿ3„#jÿô'ÿÿ ù„#jê2ÿÿ(ÿñxû#¢>ÿÿ(ÿöõ' Bÿÿÿ8$õ'ÈD ÿÿ<ÿïKõ"þFÿÿ<ÿð$#™R(ÿñxk²+°3± é°2² +³@ +²+± é°/° ֱ鰱+± é± +±°9°²999±±99°± 99°°9014&#"32%4>3537#"&'#"™6@xvxþ 2EA#]6{"%D,/ =Uû @]¡¡?c<'/)þWr)<ÿB0Ñ(в+± é² +³@ +²+± é´"! +±" é°)/°Ö±é°2°±+± é°& Ö´+²& +³@&! +±*+±&²999±° 9±°9°!± 99°"° 9014>32#"'#"32654&+532654&</[Aju=w~gW1‡ì<)_+AJþÃ:2;07s>(%- ÿ93$.² +± é°/°Ö±é±+±°9± ±9901#5&#"'46323ćŽ & 154^~þñðL6d*<êD(ÿýF×-b²(+±é²+± é°./°Ö± é° ±+±#é±/+± ±99°³($9°#²999±³ #$9°°901%2>54.#"'4>7'5!##"./+; 9)9HŒ!,<'ŸÀÙq2+O_>"@J7$x0/,0T>”Œ;]4& igrL13Q.Om: #7b(ÿö#)s²+±& é²& +³@& +²+± é² +³@ +´! +±!é°*/°Ö° 2±$é°2²$ +³@$ +±++±$° 9±!&°9°° 9°° 901%#"5467&546732#.#";#"32674cHï !A|s E`26Eh34GG52hE6®*89¡,5(NVI:9(!'6#f#5' (ÿ*ìà!¶² +²+± é°"/°Ö±é°± +±é±#+°6ºòŸÁj+ °°À±ù°À³+°³+² Š Š#9²9µ......µ......°@±±99° ± 99°² 999± ±99°°9017'654&#".5467#5!¶"7BB7"1|+/C>6!eX­–HxXï-7 9.=x-Y %3Q2sÍIxb)l£ ÿ8$R²+²+°3± é°2°/°Ö±é°± +± é±+±±99° °9±°9°±9901'632>32'4&#"#4#"!7#=U,n]Š!2qŠ žr<ptýù%Þ76ŒþÔª (ÿð+Ù#W² +± é²+± é´  +± é°$/°Ö±é°2°±#+°2±é±%+±#² 999±±99012#".54>.#"32>7J@H3!8gK=ZG$!3HÛ:7n:7$0Ù1O‰[X€h5$S”j[‰O1þÛg[Âsp\!A<.<ÿïK/²+± é² +°/° Ö±é±+±°9° °9017327#".53Ç00M-0.‹ ,"B.Œ<ÿø- 0²+°3²+° 3° /°Ö±é°2± +±±9901#'#373-¨¡‰‰ª¸áôÖ'©©Ö ÿóCã#=²+²+±é² +± é°$/±%+±°9°´ $9° ° 901#'.#"7632327#".'&zÇ )1!6"! ’  #!C(! \Nþ° 4 z9*# þ{p# ÷<ÿ6[b²+²+± é² +³@ +²+°3°/°Ö±é°2°±+±é±+±°9°°9±² 999°° 901%2653+"'#"'#32(<ˆ $7@0O:/ŠŠ7.547#5!#"ÕlˆBUP:)4:!2x)/>`P+-E/%=ªÁ"0ÿToA1,81#>x,m -T%Rÿîƒ!Z²+°3²+± é± 22°/°Ö± é² +³@ +° ± +±é² +³@ +±+± °9±°901%2>7#"&5###'!#5I@2¸ŽET?_uDH1þH¸vvþÑ<ÿ5R+#N²+± é² +°/± é°$/° Ö± é°2° ±+±é±%+± ±99±°9°°901#"'#4>3232654&#"R$7JE#G8Š2SV.#EJ7$þtK42ON3()Ag>($çàOs:'323!#"32>54&6>a;&3TW0 ""s*~$6 @A'*K %:NH%Pt;~AV}¿!45JZ !E1YLÿôL²+± é²+± é°2°/°Ö± é²  +³@  +² +³@ +±+± °9°°901"&5#5!#327U[=©Î +O TTrrþ÷ }<ÿð$7²+± é² +°3°/° Ö± é° ±+±é±+± °901%#".5332653$4aHMe2Š(CB'ŠÔ8N? AL7HþÒO67T((ÿ<ì!!p²+°3±é°2² +³@ +²+± é°"/°Ö±é°±+°2±é°2°±+±é±#+±± 99±²999°± 9901%2654&#4>7332##5"&ÔAPPAþT#:,Qk[Em‰§"BnE‹‡›pRB@W—8`A$dH[>Z±£{6`M.¶¶›ÿ9c1%@²+³ +±é²+°/±# é°&/±'+±#²999°µ%$901#"/#'."##563273327c*'P5L¢Ÿó‰$:L'k†”Ëz 3´a–ìoêw EÂôþ”ã2ÿ3¦D² +²+°3°/°Ö±é°± +°2± é°2° ±+±é±+± °901%>53#5.533°55Œ„rˆsƒŒ19ˆl9N$þÁlxÁÁwm?þÜJ=Ÿ(ÿñö!&†²+°3± é°2² +³@" +²+°3²+°'/°Ö±é°±!+±$é°$±+± é±(+±°9°!±99°$°9°±99° °9±°9°² 99901%2>54&'7#"'#"&546736=3!( =BD@tc\44\ctBC@@&-K†!e38!ToD)7±BvAAw?º0'BqU9S:ìì%ÿÿÿïKÛ"jóôFÿÿ<ÿð$Û#j…ÿôRÿÿ(ÿé>õ#²Lÿÿ<ÿð$#¤ Rÿÿ(ÿñöâ#ÿíV'ÿÛMó3p°/±$é²$ +³@$ +°)/°3±é°2°/± é°4/°-Ö±é³!-+± é° /±!é°±)+°2±é°2²) +³@ +±5+±)± $9901"3.'23##".'332>7!4>J x &;(CD#5U78U0 ƒ08$!ÿ&3yXW[Xz 53I:)z=`Z<#&8WK1]X-YB1CU9B,+ãé"N²+² +°3± é² +´ #+³ +°#/°Ö± é±$+±°9±°9± ° 90152>32&#"#54. 0N<@&†J.K1V4$"%’ "/JW’*U;W+2i=$DXˆR©©)6cDR3#ÿÿõ&£]­ÿÿã„"]j¬ÿÿ(ÿ7¢Ù(ÿÞö/)…°!/°3±é°2²! +³@ +°(/± 33±) é°*/°$Ö°(2± é° ±+±é°±+±é°2±++± $°'9°° 9°°9°± 99°°9±!°9°(±$9901%32>54'!326=3%##"'#"&5467#5Ò#''Aþ¿@S+ †#./)BG%[54\jm.™).?&rZ[q“(øžxf`Jq<DD s"q3xÿ‚%(M²+²+²$+°3±# é°/±é°)/°Ö± é±*+± °9±°9±#³ $901733#"'5326=&'#76544c{¤‰d%D=)"G2$ œ"w©\Ž_m>\_?‘”¦yF&Ó*+v9no­Y'"€ ?ÿÖ‚4&?²+³ +± é²+³ +±é°'/±(+± °9°µ"#$90127332>7#"&'#765.#"'>Ç;V y¤‰d(YP;4NP¦yF.="T/:MPŒo­Y*25L1>(ÿ->-/g²+± é°° Ö± é° /± é°(/±é°0/°Ö± é°+2° ±#+±é±1+±# ³ $9°±99± ° 9°(°9012#"'3263"#"&54>2654.#"1|‘&8LA"J5 )ND™-O{1QW05L))2M)(-žKr?( % „{=)Pv=þ,O`1H#N_4I"ÿÿ(ÿéæåa(ÿÛ>+I°/± é°/± é°/±é°/°Ö´ +´ +±22±+±±99±°901%#".54>;#"3#3>!qL$IQ>)~ptmÿÿPq„' ɾ|ÿÿPq„#j´|ÿ\üÙ#p²+°3²+±é°!2°/´+´# +±#é°$/°Ö± é°"2² +³@! +² +³@ +°±+± é±%+±°9±° 9012#"#53654&+##5!#"3R- $#3#F5!322654&+/B:!þ¾Þï& »?Z/÷7*03žß6S/ \¾þb‘2y þÚ&@FŠ+21+¹P4Ùd² +° 3±é²+°3´  +±é° Ö±é°/° Ö± é°2° ± +°2± é°2°±+± é±+± ±990132#!!#3!32654#»dxyrþ¾þß–– —Œ<9uÙþü„ont7þÉÙþÛ%þÛ68müÙV²+°3²+±é°2´  +±é°/°Ö± é°2²  +³@  +² +³@ +° ±+± é±+012#4+##5!#"3R- –P¯—¼ ¸ø+5'þ¼=>þ…]||eÿÿPÓ„' Ê"ÿÿP¡„' ÉÈÿÿ ³„#x¼˜ŠPÿjžÙ H²+°3±é² +³@ +²+° 3° /°Ö± é°±+±é°±+± é± +01!#5#3!3¸‚æ–"–––Ùý¤\ý'ÿÿ ¯Ù$P˜ÙQ²+±é²+± é´  +± é°/°Ö± é° 2² +³@ +°±+±é±+±°901%#!!!32%32654&#˜5jIþ¸þ–£?d:% þN³5::5Þ(HE)Ù}%6E8[Õ;/0;ÿÿP˜Ù%PPÙ,²+²+±é°/°Ö± é² +³@ +±+013#!!æ–þ–Ù}#ÿjaÙb² +±é°° Ö°3´ +°2²+±é°/° Ö± é° ±+± é°±+± é³ +±é±+±°9017265!3#5!#%!#‹(3s‚ýÆ‚* ÜlÇš ý“þþ––ß¾¾ÿÿPqÙ( *Ù:²+± 33²+± 33°/°Ö°2± é°2±+±³ $901 # 333 ##Ïþó¸eþǤõ–õ¤þÇe¸þó–þãz_þéþéþ¡þ†þã(ÿéå'•²+± é² +³@ +²+±% é²% +³@% +´ +± é°(/°Ö±'é°'±+± é°" Ö± é²" +³@" +±)+±'±99°"²999± ° 9±° 9°° 9°%° 9014>32#"&'332654&+53254&#"5&:QF'ƒ‘?YžŒ›’TLDOBGfLŠD:‘û9W1 uk]/1so}|u;>4.1@xg)1rP¡Ù F²+°3²+°3° /°Ö± é°±+± é± +±°9°°9±± 99013#33#æ––!š–Ùþðý'øÿÿP¡„&xИPÓÙ 0²+°3²+°3° /°Ö± é°2± +±± 99013#33 #æ––±þ’ÈþÛÙþéþ¡þ†ÿôwÙJ²+° 3²+±é°/° Ö± é²  +³@ +°±+± é±+± °9±° 901##5265!#áÞ"3P33& –\Ì2UdLB#‘«ý'ÿÿPÙ0ÿÿPÙ+ÿÿ(ÿéæå2PÙ/²+°3²+±é°/°Ö± é°±+± é± +01!#!#þß–M–\ý¤Ùý'ÿÿP}Ù3ÿÿ(ÿé©å&ÿÿfÙ7 ³Ù!²+²+°3°/± +±°901!#733C®rý£¬¬®â÷þ§Y(hÙ-<l²+²+²!+°;3± é°2´- +°.3´+±22°=/°Ö±'é°'±+±22± é±.22°±5+±é±>+±!-±9901!50# 4>;5332!#'#";2>54.+}"þÍ%94E-–-E49%þÍ"–';&!4'·!'4!&;'^4T6( [[ (6T4þè^¼`!D.0G%%G0.D!ÿÿ Ù;ôPÿj Ù N²+± é² +³@ +² +°3° /°Ö± é° ±+± é³+±é± +± ±9901%33#5!3–n‚ýÇ–}\ý“þþ–Ùý¤FrÙ9²+²+° 3´  +±é°/°Ö± é°± +°2± é±+01%#"&53;3#ܼY–0 ¯—–ájKCþà {ý'PÓÙ ?²+±é°2²+± 33° /°Ö± é°±+± é°± +± é± +01)33333Óü}–Û–æ–Ùý¤\ý¤\PÿjUÙ^²+±é°2² +³@ +²+± 33°/°Ö± é°±+± é°± +± é³ +±é±+±± 9901)333333#Îü‚–å–æ–x‡Ùý¤\ý¤\ý“þþ'Ù Q²+±é² +± é´  +±é°/°Ö± é°2² +³@ +°±+± é±+± °90132#!#5!32654#»dxyrþ¾æ|Œ<9uÕ„ont\}þÛ68mP€ÙS² +°3±é² +°3´ +±é°/° Ö± é°2°±+± é°±+± é±+±°901#32#!332654#€–ýü»dxyrþ¾–Œ<9uÙý'Ùþü„ontÙþÛ68mP}Ù B²+± é² +´  +±é°/°Ö± é°2° ±+± é±+± °90132#!332654#æ»dxyrþ¾–Œ<9uÕ„ontÙþÛ68m(ÿé©å†² +±é² +³@ +²+± é² +³@ +´  +±é°/° Ö°2± é°2° ±+´ +°± é°/°3± +± ± 99±³ $9±°901>32#"&'33267!5!.#"+ ¨~š´²˜ˆ¨’TFN_ þÜ#bI,>! âyŠÎ±°Í“}FLmc}T]2Pÿéå$j² +²+± é² +²+± é´  +± é°%/° Ö± é° 2° ±"+± é±&+±" ²999±°9° ±"99°°901".'##33>32"32654&Ê@kF4’––•3DwIœº¾—ZeeZYfd%>GP:þÉÙþÛ>^F3ܧŸÚ|ŠèЉqxŠ mÙ [²+° 3² +±é´ +±é°/°Ö± é°± +°2± é±+±°9° ±99±°9°°901#.5463!#=#"3šÝ³ÜG_yrB–Œ<9uþü }cntý'}Û68mÿÿ(ÿé%D(ÿé+ +`²+±' é²+±" é°,/° Ö±$é°$±*+±é±-+±$ ±99°*´$9°²999±"'± 99°°9012#"&57>7>?6"32654Ha‚ˆ|€’ "-9 h+¯&S+“hBA54B%¡}Ÿ®,\  * 3OWu]JM^^JKA #c²+±é²+±é´ +±é°$/°Ö±é°2°±!+±é° Ö± é±%+± !°9±°9°°9°° 901%#!!2%32654&#3264&# 'N6þó 3J$)!+.þÂ^(""(^d*%#,›30/,$B KèaÏqBA,²+²+± é°/°Ö±é² +³@ +±+01##ÐŒqþUÿƒ“h²+± é°° Ö°3´ +°2² +± é°/°Ö´+°± +±é°±+±é³+´+±+± °901%3#5!#53>=!3#ARnþ]n>%(¢þñŠeâ}}â¬r˜þU:3¯ÿÿ(ÿé%H :²+± 33²+± 33°/°Ö°2±é°2±+±³ $901%#'35373#'#A‰³Õ±”„Œ„”±Õ³‰ŒÆÆ(ô½½½½ôþØÆÆ(ÿé%%y²#+±é²# +³@% +²+±é² +³@ +´ # +± é°&/°Ö±é² +³@ +°° Ö±é±'+±°9± °9° °9°°901732654&+53254&#"#>32#"'±+<71#/\^A,%d‡|mgw,;1bCù"$ !nGIVaaS@"%J;:#´A0 B² +°3²+°3° /° ֱ鰱+±é± +±±99± ±990133##AŒÃ ŒÃ þ®RýäRþ®ÿÿA0Ó&ŸxÿçA* 0²+°3² +°3° /°Ö±é°2± +± ±990173#'#3Í¢”Öý¶§ŒŒ_½ôþØÆÆÿöüD²+° 3²+± é°/°Ö±é² +³@ +°±+±é±+±± 9901!###52>45_Œ…er  ýä«=DZ‡ ("6&Ac F²+± 33²+°3° /°Ö±é°± +± é±+± ±99±² 99901!##33#vHaŒ¯bb¯Œ)þ×þ¹Gýä)A$ ?² +°3²+°3´  +± é° /° Ö± é°2° ±+°2±é± +013353#5##AŒËŒŒËŒÜÜýäÏÏÿÿ(ÿé>%RA$/²+°3²+± é°/°Ö±é°±+±é± +01!###AãŒËŒýä«þUÿÿAÿ&E%Sÿÿ(ÿé%F©:²+²+± é°2°/°Ö±é² +³@ +² +³@ +± +01###5©‡Œ‡qþU«qÿÿ ÿ%\(ÿ&¤Ï!+Œ² +°3± é°'2² +²+²+°3± é°"2°,/°Ö±é°± +± 22±é±$22°±*+±é±-+± ± 99±*±99± ± 99°³$9°±99012#"'##"&463236"3264$"32654Âf|ad2Œ2da{gd2Œ2ÿjAB45A7jAA54B%¤ö£XþæX£ö¤YþýYu_MI^]˜^^˜]^IMÿÿ [ûAÿƒz Q²+± é² +³@ +²+°3° /°Ö±é°±+±é³ +´ +± +±±990133333#5AŒËŒVnþU«þIâ}2ü9² +²+°3´  +± é°/°Ö±é°± +°2± é±+013;3#5#".52ŒxŒŒv&@>$Öýä¥!B/A? ?²+± é°2²+± 33° /°Ö±é°±+±é°± +±é± +01)33333?ýŒ«Œ¯ŒþU«þU«Aÿƒ¶W²+± é°2²+± 33°/°Ö±é°±+±é°± +± é° ±+´+±+±± 9901)333333#HüùŒ«Œ®ŒxnþU«þU«þIâ—Q²+±é² +± é´  +± é°/°Ö±é° 2² +³@ +°±+±é±+±°901%#!#5!323254&#—%P9þå«7lkuþ´mT0)¨47!«qµj‹F"#AÓ S²+°3±é²+°3´  +± é°/°Ö±é°2°±+±é°±+±é±+± °901%#!3323254&##%P9þåŒlkuþ´mT0)žŒ¨47!µj‹F"##ýäA B²+±é²+´  +± é°/°Ö±é°2°±+±é±+± °901%#!3323254&#%P9þåŒlkuþ´mT0)¨47!µj‹F"#(ÿé%`²+± é² +³@ +² +± é² +³@ +´ +± é°/°Ö´ +±+± µ $9±° 901.#"#>32#"&'33267#5 11+- †}ey†…xb † .)+: ¯@<8-5cp˜Š†”qa4-=8qAÿé1%v²+²+± é²+² +± é´ +± é°/°Ö±é°2°±+°2±é°±+± é±+±± 99±°9°± 99°°901%##33>32#"&"32654&3fŒŒfl~„‡zm‚ï8==87><ÏÏÜmx—‹ƒ—xS^ž^^MQ^ S² +°3²+±é´   +± é°/°Ö±é°±+°2±é±+±° 9°° 9± ° 9014>3!#5##7.55#"3$'N6#Œ,³›=DTz*%#,30ýäÏÏÚX;AqBÿÿ(ÿéõ"C}œÿÿ(ÿéÛ"jtôœÿS6Ù&‡²+² +²+± é°/´  +´ +°3±é° 2°'/°Ö° 2±é± 22² +³@ +² +³@ +°±#+±é²# +³@# +±(+±#±99±°901"##53533#632#"'5>754&S2;ŒFFŒªª:e :7 F`^1l4¥<.þÅ7h::hrW'M5Þ>wM/>~^Ò8+ÿÿAõ"vMš(ÿé%`² +± é² +³@ +²+± é² +³@ +´  +± é°/°Ö´ +±+±µ $9±°901%#32673#"&54632#.#"3g¯ :+). † bx…†ye}† -+11 ®Ï8=-4aq”†Š˜pc5-8<ÿÿ!ÿé %VÿÿFÒÙLÿÿÿý/ç"jðóÿÿÿ&ÒÙMU#j²+°3±é²+± é´ +±é°$/°Ö± é² +³@ +° ±+±é°2°±!+´+±%+±°9°±99012#!##5>=!#32>54&‚^uQ_þåŸ 'T?.·hhm '?Q<:Y«3JquD‡|™ÝncAcb²+° 3±é² +°3´  +°3± é°2°/° Ö± é°2° ± +°2±é°2°±+´+±+± °9012#!5##3353#32654^uQ_þåËŒŒËŒhhm3$?Q<:YÏÏÜÜÝnc/4Ùu²+°3² +²+± é´ +°3±é° 2°/°Ö° 2±é± 22² +³@ +² +³@ +°±+±é±+±±99±°901"##53533#632#4S2;ŒFFŒªª:e 96 Œ¥=-þÅ7h::hrW'M5þžAdÿÿA*õ"vr¡ÿÿA0õ#C‘Ÿÿÿ ÿ%ð"xjªAÿƒ% K²+°3± é² +³@ +²+° 3° /°Ö±é°±+´+°±+± é± +01!#5#333jn»ŒÌŒ}}þU«ýäÆÙ[²+°3²+°3°/°Ö± é°± +± é° ±+±é±+± ±99° °9°±99±± 9901!#&53533#&']ŽKp’sŒw‰‘)EB&ŽE5:~‚Ùþåþ×6æêþÄ7oß¾@tÙÄ Ö]²+°3²+°3° /°Ö±é°± +± é° ±+±é±!+± ±99° ±99°±99±±9901!#&3>53653#.')Œ“ŒM%"Œ*$FŒICŒ    é4îµZÐG>Ö]ºé…þÞv2DC) ÿÿFÿöúÜ5ÿÿAÿ3µU(ÿéæå b² +± é²+± é´  +´ +°/°Ö± é°2°±+° 2± é±+±± 99±°9°°9°°9016632#".#"!26(ÁžÂ¿ Ÿf iSRk þq k¦l¿PÖÕ®¢×§crsbOcuv$ÿé:% @²+± é²+± é´ +´ +°/±+±°9°°9°° 9012#"&6."#326.{}ŽŽùCbCùùC10D%™‰‚˜™ ™ö>GH=O=IIÿÿÆç&Ç'Ö ÛÕq|ÿÿ Ö/&È'Ö©#Õïÿ´ÿÿÆ„&Ç £Áªÿÿ ÖÙ&È £Fÿÿÿ$«ü©²+°3°/±+°6ºöÀÅ+ ° °À± ù°ÀºöÀÅ+ °°À±ù°Àº=•î“+ °.°À±ù°ÀºõíÀÌ+ °³+±°³+º=•î“+ ³+±° ³ +º=•î“+ °³+±° ³ +º=•î“+ °³ +±° ³ +º=•î“+ °³ +±° ³ +ºõíÀÌ+ °³ +±°³ +ºöÀÅ+ °³+±°³+ºöÀÅ+ °³+±°³+@ ..................@ ....................°@01''#7'57'573«‹8‡™2C5€’8Ž =C@CÆC±¼BÆB×áþzcÿö I°/´ +° Ö´ +° /°Ö´ +°2° ±+°2´+±³ $90153353#5#þzxŒxxŒcœ9œ8ÿÿþÖ]ÿÞì±ÿÿÿPÿÜÔ‡´üëÀ@ÿÿÿ!PÿßÔ‡³@Àý´C )°/± é³ +´+°2°/°Ö´+01"#4>323".þ“+;yFd;Jx>G (N;s•(*C^(!(!_ÿÿýÿ†e&  '  Dÿy'  þºÿy'  Íþ3'  Füî'  üf'  þ»üí  þ3þ3üÿÿSi "/<IT_’²9+´4,+³94+´  +²7+² +²A+´F,+³ AF+´ +²*+°/´0+´LS  +´L*+±UZ22´W^  +´W*+±JO22³$ +°=3°/´0+°`/°OÖ´P +°P±'+´, +³K,'+´S +°S/´K +°,± +±22´ +°± +´ +± 22°±+´ +³U+´_ +°±[+´Z +±'S±7699±,K²4)9999° µ#$*01;$9±µ=>H$9°U²AF999±_±DC99±4 °9±9²6999±L7´!10$9±F$´#.>DI$9° ²',C999±A°)90135>5##546737'654''&5477#"'7327''7632&#"#"&'335532#.#þðp*F&@qp*F&@«O*)&-þ O*)&-"O))#$2"-—O))#$2"-ý#;38 *$8;38 *$<;38 *$8;38 *$ýO))#$2"-–O))#$2"-ýºO*)&-÷O*)&-Úp*F&@rp*F&@Rÿj„ “²+° 3²+°3°/´ +² +³@ +°2°/°Ö± é°±+´ +°±+´ +°± +± é³  +± é±+±°9±±99± °9±³ $9013#333#5#"&=33267è––!šn‚‚LpL8 D!#Ùþðý“þþ–øŒ 8LL9 B#<ÿƒÓ ˜²+°3²+°3² +°3´  +´ +°/°Ö±é³+´ +°±+±é³+´  +° /´ +³+´+±+±°9° ±99°°9± ³$901"&=3327333#5##¸LpL8 D@ þ¼ŒÃ VntàÓ 8LL9 BB·þ®RþIâ}Rþ®‚Ùq²+±é²+´  +± é´ +° 3´ +°2°/°Ö°2± é± 22² +³@ +² +³@ +°±+± é±+±°90132654#3#32#!#5353ëŒ<9uŒOO»dxyrþ¾FF–XÛ68m"OV„ont+O_?i²+±é²+´ +±é´ +°3´ +°2°/°Ö°2±é±22² +³@ +² +³@ +°±+±é±+0173264&##!#53533#32ëz*%#,Ú'N6þÝPPŒOOtmqßqBD30ˆOEEO;]P}Ù Z²+²+±é´ +±é°/°Ö± é°2°±+± é±+±°9±°9°² 999°°901654&+327'7'+#!2Ø9<ŒŒ -8¤/89(5»–Bry¬(86Û-8¤/89þüÙtnp<ÿ&@% s²+± é²+²+²+± é°!/°Ö±é±22°±+±é°2±"+±±99°±99±°9° ³$9°°9°°901%654&"327'72'#"'#36 AjAA578f|<;8<3:d2ŒŒ2£(9M_^˜] 78N¤{vQ;8< XþæöPYRR`7²+²+±é² +³@ +°/°Ö± é°±+± é± +013#53!è–j–þ–Ùˆþü<˜š7²+²+± é² +³@ +°/°Ö±é°±+±é± +01##35˜ÐŒÜšïþU~]Ù T²+² +± é´ +°3±é°2°/°Ö° 2± é°2² +³@ +³@ +² +³@ +±+013###53!!ó¿¿–NNþ–·}þÆ:}"}­ W² +²+± é´  +°3´ +°2°/° Ö°2± é°2² +³@  +³@  +² +³@ +±+015!#3##5#5Q\ÐhhŒBIÓqbZïïZRÿT_ÙW²+²+±é°/±é´ +±é°/°Ö± é°2² +³@ +°±+± é² +³@ +±+013#!!32+5326=4&+è–þ–nŠŠn%.@@.sÙ}d~`è`~}70Ü07<ÿEj² +°3² +± é°/± é´ +± é° /° Ö± é°2² +³@  +° ±+±é² +³@ +±!+± °9±°9012=4&#"#!#>32+4V55,,Œ\Ð@6#>>%!69 2DdO8,2$}qš %O85N' ÿj*ÙY² +±33² +±33°/°Ö°2± é°2°±+±é±+±±99°±99± µ $901%3#5### 333Äf‡,þî–þî³eþǤõ–õ¤þÇlþþ–þãþãz_þéþéþ¡ÿƒ \² +±33² +±33°/°Ö°2±é°2°±+´+±+±±99°±99± µ $901%3#5#'#5#'35373ÀInE‰Œ‰³Õ±”„Œ„”±eâ}ÆÆÆÆ(ô½½½½ô*ÿƒå6¨²+±4 é²4 +³@4 +°/´(+°-/±. é°7/°Ö±6é°6±+´ +°±)+± é°1 Ö± é²1 +³@1- +±8+±6±#$99°µ&4$9°°9± )° 9±°9°-² 999°.° 9°4° 9014>32#"'53254&'.'332654&+53254&#"7&:QF'ƒ‘?YŠ}NMC('L!-r€’TLDOBGfLŠD:‘û9W1 uk]/1sg|.G,3 /2!2 zi;>4.1@xg)1r ÿ %;в5+±/é²/5 +³@/2 +° /´(+°%/±&é°=4&#"#>32 ",=$OMC('L!+͉+<17$\^,%d‡|mgw,; ,C$/G,3 /2!0£"$  n IVaaS@"%RÿjÕÙP²+°3² +° 3°/°Ö± é° 2°±+±é±+±± 99°± 99± ³ $901%3#5##33dq‚FþÛ––±þ’lþþ–þãÙþéþ¡<ÿƒ%S²+°3² +° 3°/°Ö±é° 2°±+´+±+±± 99°± 99± ³ $901%3#5#'#373ÏVnH§ŒŒ¢”Öeâ}ÆÆ½½ôRÕÙF²+°3²+° 3°/°Ö± é°2°±+°2´ +± 22±+±±9901%'#375373#'#,––,O¢±þ­rȪOò+þãÙþé+’EŸþ»4þ ¥A<%F²+°3²+° 3°/°Ö±é°2°±+°2´ +± 22±+±±99017'#375373#'#ì$ŒŒ$O/”Ãê¶4O›+ƽ*~"7Þ,þî> ÜÙa² +°3²+°3± À/°3´ +°2°/° Ö°2± é±22² +³@  +² +³@  +±+± ² 999013#3 ###5353èMM±þ’”ºþÆ–HH–šO‰þ¡þ†þãKO? &a² +°3²+°3± À/°3´ +°2°/° Ö°2± é±22² +³@  +² +³@  +±+± ² 999013#73#'##5353É66¢”Öý¶§Œ33Œõ;[½ôþØÆÆº;'wÙ A² +°3² +°3± é° /° Ö± é°2²  +³@ +±+± ²999013 ###5бþ’ÈþÛ–æÙþéþ¡þ†þã\}£ A² +°3² +°3± é° /° Ö±é°2²  +³@ +±+± ²9990173#'##5F¢”Öý¶§Œ«½½ôþØÆÆ«qRÿjÙ^² +°3² +°3´  +± é² +³@ +°/° Ö± é° 2°±+° 2± é³+±é±+± ±9901%3#5#!#3!3Ÿx‡‡þß–– —lþþ–KþµÙþï<ÿƒua² +°3² +°3´ +± é² +³@ +°/° Ö±é° 2°±+° 2±é³+´+±+± ±9901%3#5#5##3353VntËŒŒËŒeâ}ÏÏÜÜRÖÙ N²+°3² +°3± é´ +±é°/°Ö± é°2°±+° 2± é²  +³@ +±+01!#!#3!!!ž•þß–– ÎþÈKþµÙþï}<å N²+°3² +°3± é´ +± é°/°Ö±é°2°±+° 2±é² +³@ +±+01!#5##335!#ŒËŒŒËRÆÏÏÜÜqQÿTÙZ²+°3²+±é°/±é´ +±é°/°Ö± é°±+± é°2°±+± é² +³@ +±+01!#!#!32+5326=4&+ž–þß–MnŠŠn%.@@.s\ý¤Ùá~`è`~}70Ü07<ÿEm!l²+± 33²+± é°!/± é´ +± é°"/°Ö±é°± +± é°2° ±+±é² +³@! +±#+± °9±°9012=4&#"###!>32+‹V55,,ŒËŒã@6#>>%!69 2DdO8,2$}«þUþõ %O85N',ÿéžå%/…²+°"3±é°2²+± é³ +±+é°0/°Ö± é²  +³@  +° ±+±. é°.±(+± é±1+±.±99°(±$99°±"99±°9°+µ &$901"&54>3";&54>3267#"'7654&#"˜¡Ë-\Ÿg{~ÚM'9G9b{[Mb yhE>HR[ '%<ÅOwG}•mÿ]uItD-¥p™b8X ?¯GƒKLba^$ÿéÝ%(†²+°3± é°2²+± é´$ +± é°)/°Ö± é²  +³@  +° ±+±'é°'±"+±é±*+±'± 99°"±99°±99± °9°$µ  $901"&5463"&5463267#"'7654#"5z—§‹Db*dLOf5HN \W:8:A)&˜ƒx©r[N¬:IkfeO]C.?%A $7['83,ÿ­å'²$+± é²$ +³@ +°/´(+°(/°!Ö± é°±+´ +°± +°2± é°'2±)+±µ$$9°°9± ± &99±°9°²!99901&#"32673#"'53254&'.54632€YdaWFT’“xNMC('L"-”´š¥ ⃈yw†LFt 0F,3 /2!2ÉŸ±ÎŠy$ÿ %'j²!+± é²! +³@% +°/´(+°(/°Ö±é°±+´ +±)+±µ!$9°² %999±°9°²99901"32673#"'53254&'.54632#."r=5). † hSPMC('L"-aj†ye}† -´±OZ-4Wm /H,3 /2!2‘vŠ˜pc5-ÿjWÙ J²+±é° 2² +³@ +° /°Ö± é² +³@ +³+±é² +³@ +± +01%3#5##5!#‚x‡‡ÝHÕlþþ–\}} ÿƒ§ M²+± é° 2² +³@ +° /°Ö±é² +³@ +³+´+² +³@ +± +01%3#5##5!# Vnt‡š‡eâ}«qq yÙ0²+²+°3° /°Ö± é± +±°9±°901#33’–ò§•‹¨þòËþ¾BÿC8#²+°3° /°Ö± é± +±°901%#33o–Ô§wm¨QþòËþ¾B yÙ]²+²+°3´ +° 3±é° 2°/°Ö°2± é° 2² +³@ +² +³@ +±+±°9±°9017#535333##üÈÈò§•‹¨çÈÈ–‘hËþ¾Bþ5h‘ÿCGV²+°3±é° 2²+° 3°/°Ö°2± é° 2² +³@ +² +³@ +±+±° 9±° 901#5#53333~–ÈÈÔ§wm¨ÉȦ¦hËþ¾Bþ5hÿj|Ù:²+°3² +° 3°/°Ö±é±+±±99± ³ $901%3#5#'#3738D‚0Œ‹®æÞ²€†®álþþ–ýýojððþ›ÿƒ =²+°3² +° 3°/°Ö´+±+±±99± ³ $901%3#5#'#373ÉCn:[\¨´°¨XW¨°eâ}¨¨ ££þôÿj‰Ùk²+±é² +³@ +²+°3±é°2°/°Ö± é² +³@ +² +³@ +°±+± é³ +± é±+±± 9901#5!#!33#5!ο ·!–n‚ýÇ\}}þ!\ý“þþ–ÿƒËn²+± é² +³@ +²+°3± é°2°/°Ö±é² +³@ +² +³@ +°±+± é³ +´ +±+±± 9901#5!#333#5!ˆsrsËŒ`nþ+«qqþÆ«þIâ}DÿjÞÙE²+°3°/± é² +³@ +°/°Ö± é° ± +°2± é³ +±é±+01!#5#"&53;33#\‚žnŠ–@.‘—n‚á~`þì07{ý“þþ0ÿƒPH²+°3°/± é² +³@ +°/°Ö± é° ±+° 2±é³+´+±+01!#5#"&=3;33#âtb\€Œ*$dŒVn£Y]ÃÂ##þIâ<hÙi²+²+°3´  +°3± é° 2²  +³@ +² +³@ +°/°Ö± é°± +°2´  +°2° ±+°2± é±+015333#5##5"&53,OV—–WOhˆ–3`WY{ý'áUU€^þì*5<q²+²+° 3´  +°3± é°2² +³@ +²  +³@ +°/°Ö±é°±+°2´ +° 2°±+° 2±é±+± °9017.=35333#5##øQkŒ0O3ŒŒ3O¤ZTÃÂ5 cgýä£SFrÙ9² +°3²+´  +±é°/° Ö± é°2° ±+± é±+0132#4&+#3ÜžnŠ–@.‘—–ø~`þæ07þ…ÙF9²+°3² +´  +± é°/°Ö±é° 2°±+±é±+01!#54&+#332Œ*$dŒŒb\€Â##þø£Y]*ÿé½é0z² +±+ é²+ +³@+ +²$+±é°2²+´+´  +°'3± é°2°1/°Ö´+°± +±( é±2+± ±99°(±!99± ±9901!.#"#"&5"&54632#4&#";>32!32>7ßLTFAXÉ ¨~›³uYJATn%!^¨~Ž©þcZ,>! ÕFLLþÑyŠÎ´YwQ]A>%0/7€Àº|†2 ÿéÕ% 1²"+± é²" +³@ +²+°+3± é²+´  +²  +³@ / +´%" +°3±é°2°2/°(Ö´  +° ±%+±é²% +³@ +±3+±% ±+/99°±.99±± (99013.#"'";>32!32673#"&5"&54632#4&†Ä ,'$ð$!Hae}þ¤<6). † bx…q\I1,FTd+% k=]dpcNQY-4aq•†G\6H:. *ÿ;½é3¥² +°33±*é² * +³@  +²#+±é°2²+´+´  +°&3±é°2°4/°Ö´+°± +±' é°'±+´ +±5+± ±99°'± 99°°9°²#*999± *±/099±±9901!.#"#5.5"&54632#4&#";>32!32>73ßLTFAXÂ\…–uYJATn%!^¨~Ž©þcZ,>!  oÕFLLý ±ʤYwQ]A>%0/7€Àº|†2n‡  ÿ;Õ%)3ɲ +°$3±. é² +´ +² +³@( +°/´ +°/° 3±é°*2°4/°!Ö´ +°±+±é² +³@ +³'+´( +°(/´' +°±+´ +±5+±(°$9±'°9±°*9°² .999±±99°±99±.±!9901";>32!32673#5.5"&54632#43.#"š$!Hae}þ¤<6). †cO\emq\I1,FTÎÄ ,'$Ú=]dpcNQY-4Sm²± ’yG\6H:.v+% RèÙ!²+²+°/°Ö± é± é±+01#è–Ùý'Ùÿÿ *„#xs˜}ÿÿ Ó#xëÿçPÿT´Ùa²+²+°3°/± é´ +±é°/°Ö± é°2°± +± é²  +³@  +±+± °9°°9±°9012+5326=4&+#33~nŠŠn%.@@.Œ––±þ’z~`j`~}70^07ýÙþéþ¡<ÿDþ^²+°3²+°3°/± é°/°Ö±é°2°± +±é²  +³@  +±+± °9°°9±³$9012+52=4+#373;R^^R2VVAŒŒ¢”Ö)aZoZawd/d²½½ô$ÿjõÙe² +²+²+±é² +³@ +°/° Ö± é²  +³@ +°±+± é³+±é±+± °9± ² 99901##5265!3#5#ñÞ"3P34% n‚‚\Ì2UdLB#‘ެý“þþ–ÿƒ[`² +²+²+± é² +³@  +°/°Ö± é² +³@ +° ±+±é³+´+±+± ²99901!3#5###52>45hVnt…er  þIâ}«=DZ‡ ("6&RÿTŸÙN²+²+° 3°/±é´ +±é°/°Ö± é°2°±+°2± é² +³@ +±+01%!#3!3+5326 þß–– —Šn%.@8þµÙþïýY`~}7<ÿEQ²+° 3²+° 3°/± é´ +± é°/°Ö±é°2°±+°2± é² +³@ +±+01%5##3353+52“ËŒŒËŒ^R2V ¯ÏÜÜýäZawRÿj Ù^²+°3²+°3´ +±é² +³@ +°/°Ö± é°2°±+°2± é³ +± é±+±± 9901!#3!33#5# þß–– —n‚‚KþµÙþïý“þþ–<ÿƒua²+° 3²+°3´  +± é²  +³@ +°/°Ö±é°2°± +°2±é³  +´+±+± ±990133533#5#5##<ŒËŒVntËŒÜÜþIâ}ÏÏDÿjpÙA² +°3°/±é°/° Ö± é° ±+°2± é³+±é°/±é±+01!#35#"&53;3î‚nžnŠ–@.‘—–u~`þì07{ý'<ÿƒG² +°3°/± é°/° Ö± é° ±+°2±é³+´+°/´+±+01!#535#"&=3;3’nVb\€Œ*$dŒ}â>Y]ÃÂ##ýäRÿj†Ùž²+² 333²+±33°/°Ö± é°2°± +°2± é³  +± é±+°6ºÁ£ñž+ °.°À±ù°Àº>ò5+ °.°À±ù±°À²...´.....°@±± 9901#333#5##è–à„€ân‚‚–8ýÈÙý¼Dý“þþ–8ýÈ<ÿƒ´U²+±33²+°3°/°Ö±é°±+± é³ +´ +±+±±99±´ $901!##333#5#qHaŒ¯bb¯Vnt)þ×þ¹GþIâ})ÿÿRèÙÿÿÿÿ¤„"$õx·˜ÿÿ(ÿéì"Dxvÿÿÿÿ¤„"$õj»ÿÿ(ÿéç"Dj~ÊÙ^²+°3± é²+±é°2´ +±é´  +±é°/°Ö°2± é°2² +³@  +³@ +³@  +±+01%##!!!!!!#²ß5™ªþ’Sþ­‚ýèCr˜˜Ù}¥}½}Gþ¹$ÿèb%.:>² +° 3±8 é°2²#+°'3± é²# +³@! +´; # +´;+°?/°Ö±5é°5±/+°2±é°;2²/ +³@, +±@+°6º TÀ×+ °°À±4ù°2À°³+³+³+°4³342+² Š Š#9°9°9²3429µ23......µ23......°@±5°!9°/² #999°± %99±8 ° 9°²999°;±,099±#²%>=99901%32673#"'#"&54?>54#"#632632532673&"÷r$; Šˆ[ˆ@YtM[Ÿ8#  U/+ƒáu:>].TO/þ %0P)#69Ø ÄâŽ'P_hiYL‘   5!)»22?{U &  >#A¥{ÿÿPq#x°“|ÿÿ(ÿéÝ"x^ñœ,ÿé­åC²+±é² +± é² +³@ +´ +±é°/°Ö± é±+±° 901%!326>32#"&5!4&#" þ´TFAXþ7 ¨~š´²˜Ž©ëdY,>! ùFLL/yŠÎ±°ÍÀºzˆ2ÿÿÿè$œ= Àÿÿ,ÿé­„#j¿'ÿÿÿèÈ"jmá(ÿÿ *„#ju}ÿÿ È#jèÿáÿÿ(ÿé„#j¦~ÿÿ(ÿéÈ"jsážÿÿ(ÿéÙyÿÿ#ÿq 2ÿÿP¡F#qÇ‹ÿÿA0‰#qˆÿΟÿÿP¡„#jÆÿÿA0È#jˆÿáŸÿÿ(ÿéæ„˜ÿÿ(ÿé>ç¸ÿÿ(ÿéæåËÿÿ$ÿé:%Ìÿÿ(ÿéæ„#já7ÿÿ$ÿé:ú#jˆ8ÿÿ(ÿé©„#j»”ÿÿ(ÿéÈ"joá´ÿÿ­F#q¸‹Šúÿÿ ÿ%‰"qrΪÿÿ®„#j¹Šûÿÿÿ%È"jmáªûÿÿ­„' Í–Šúÿÿÿ%á"}~ìªúÿÿFr„#j¯Žÿÿ2üÈ"j{á®RÿjRÙ <²+± é²  +³@  +° /°Ö± é³+±é² +³@ +± +0173#5#!!èn‚‚þ–lþþ–Ù}<ÿƒ˜ ?² +± é² +³@ +° /°Ö±é³+´+² +³@ +± +01#3#5#˜ÐVntqþºâ}ÿÿP€„#j@’ÿÿAÓÈ#jíÿá² ÿéyå'Ÿ²+± é² +³@ +²"+± é²" +³@ +´ " +± é°(/°Ö±é°° Ö±é°/±é² +³@ +°±+±é±)+±°9±²"999°±99± °9°°9°°901#&#";#"32673#"&547&54632lŒ‘:DŠLfGBODLT’›ŒžY?‘ƒ'FQ:&ûr1)gx@1.4>;u|}os1/]ku 1Wÿé%+y²+±)é²) +³@) +²+±é² +³@ +´  +± é°,/° Ö±é² +³@ +° ° Ö±&é±-+±& ° 9± )°9°° 9°° 901%3#".547&54632#&#";#"326‰ùCb1;,wgm|‡d%,^\$71<+´#:;J%"@SaaVI n  $$ÿ9‡Ù\² +²+±é°/´ ++°/° Ö± é²  +³@ +°±+± é² +³@ +±+± °9± ° 901##5265!+53265ñÞ"3P33& 3X:_Z1\Ì2UdLB#‘«ý'(E9!Ž%ÿXQ²+²+± é°/± é°/°Ö±é² +³@ +°± +±é²  +³@  +±+± °901!+53265##52>45hkaF%D…er  ýäFb… ©=DZ‡ ("6&ÿÿ(ÿÊæå4ÿÿ0ÿ&4%Tÿÿ«Ù:ÿÿ ZRÕÙ0²+°3² +°3°/°Ö± é° 2±+± ± 9901#'##37'373‚o%¦ÈþÛ––ªbo'?±“ù Ÿþ†þãÙþé§U"=<%0²+°3² +°3°/°Ö±é° 2±+± ± 9901#'#'#37'373÷oKý¶§ŒŒYIo ”ZjUþØÆÆ½hA gFÿ~îÙI²+± é²+°3°/°Ö± é°±+± é±+±°9°± 99±± 9901%7653'#".53327™L –)L—E_(KO:%–‹#yQîþX=‡Q$$8];îþ‚FˆðL²+°/± é° /± é²  +³@  +°/°Ö± é° 2°±+± é°2±+±±99012#54 !!#4>@NKO;%–þê¬þT•%;Oð$8];dd‚‚½}´î;]8$-óï "[²+°/° 3´ #+° 2°/± é°#/°Ö± é° ± +°2± é° 2² +³@ ! +±$+± °9± °9014&#";#5#".54>3 3÷PA.B$¢œ‘¿<^7&BzY'nû1<1*À‘ll%=BK-Nu_2þôå‘AððS²+°/±é°/± é°/°Ö± é°±+± é°2² +³@ +±+±± 99±±9901!4 #5476 3#íþê–GRRGmmî‚‚ÜÜx@JJ@xŸ}ÒFˆðT²+± é² +³@ +° /± é² +³@  +°/°Ö± é°2° ±+± é° 2±+± ±9901 ".53!! =3ŽNKO;%–¬þT–%;O$8];în}þý‚‚FF;]8$<ø4£²+°3´ +³+± é°2² +³@ +°+/±( é°"/±/é°5/°Ö±é°2°°( Ö±- é°-/±( é²(- +³@(* +°±+´2+±6+±-°+9±²"/999°2± 99±(+±-99°"°2901%32#54.#!#53327>54.#"3!&5!2H.42…þrŒŒf+W1(@<1J'»þ¶[€´H°"B/ .ä71 )*F)7O'(4"ƒ#tž…gˆFÒê :²+°/± é°/± é° /°Ö± é°2²  +³@  +³@  +± +01%!33#rþÔ’úú…æéýFˆðF²+± é° /± é²  +³@  +°/°Ö± é° ±+± é°2±+± ±99012#54 !!4>@NKO;%–þê¬ý¾%;Oð$8];ÜÜ‚‚þ}î;]8$FÿåHñ 3e²"+³ " +± é°/°/3± é°-2°/±( é°4/°"Ö±!é°!±+±é°± +°2±1é°,2²1 +³@1/ +±5+±°901"326=#".546;54&'#"#4>;23#ç8"'MF:v?\2c…›2I³#*‘3SU,¿r”66‘W*SK*:6‚þŽ /G8%‡z)760%þ A_0g2€‹h-ÿèšç I² +±é²+²+°3±é°2°/°Ö±é°±+°2±é°2±+±° 901%2675#""&=4673533#3>7Œ_6?xŽwvŽc`‘e/AÕu`:6}|jsg}ÀÀ}Üf€FªõS²+°/± é² +³@ +² +³@ +°/°Ö±é° 2°±+±é±+±° 9± ° 901"#3632#54&0A#”FSInE*AÍ4)#þäó½ ";Yc>``o]Få/²+´ #+²+°/°Ö±é² +³@ +±+01733F‘¹ãý­FÿìEìW²+²+± é° /± é°2² +³@ +°/°Ö±é°2°± +± é°±+±é±+±°90153!".=##332>´‘ÿMoD'9‘‘Ë=^'"@èéþ­ 8\fHYþ[êÃèp]*S*ÿã?! +t² +´ +² +± é°"2²&+°/± é°,/°Ö±é°±+±é±-+±±'(99°² "999°² 999± ²999± °9014&#"326!2'.+#"&5467"&=7z~\^‡ƒV[‹þ|Ÿi,p  "Ö”•ÌK=RB‚!72>=4.#""327&Ï‘œ{€]P%v5H:1I$//1c#3B$+ 9M ïSZb™—x3b°?)*6,%---A!+.)‹L &<Hþh !<ëðN² +±é° /± é²  +³@  +°/°Ö± é°± +± é² +³@ +±+± ±990123!4 #54>5PKO:%mþýþê–%:Oð$8];þ}î‚‚ÜÜ;]8$#—ò²+´ #+°/±+01%!5467&'767'.'—ýŒc^0^ILgˆ5È‘)6ƒìp o =8i>"ìþÝy>hR"¶‚FÿéõÙH²+± é²+°3±é°/°Ö± é° ± +± é² +³@ +±+± ±9901".53 5!#PKO:%–m%:O$8];îþ‚‚î}þ;]8$#ÿæNñ/²+±é² +³@ +°/± é°!/±&é²!& +³@!$ +°0/° Ö± é°$ Ö±# é° ±+±é° Ö±+é±1+±$ ±99±#²&999±+°.9±°9°°.9°!°+901%#".5332>54.#!5!254&#"#432N¡x&HK6# 1%%0,$þÿl@3c’öHj6QÖo $8\;(9 5'$.Z,(aÞ(CE$<@7¯ÙP²+± é²  +³@  +² +±é°/°Ö± é² +³@ +° ±+± é±+± ±9901 ".5#5! =3¶PKO:%m–%:O$8];Z}þ)‚‚ÜÜ;]8$-ÿçc$µ²+±é² +³@ +°%/°!Ö± é° ±+± é±&+°6ºòÁ†+ °°À±ù°À°³+³+³+³+³+² Š Š#9°9°9°9°9@ .........@ .........°@01'5.'"32>=3#".=46»ZØ"E'grL?+"’š~?h=*Ng‡l…g~OIQ6#Y_a›(;H;jaA¦ò5²+°3°/± é°/°Ö±é°±+±é±+±°901#4.#"#4>32¦‘ $C51=" C|ZGlD*Ÿþb7F76H9þcžOu^1";Xa-ÿÑdñ° /±é²  +³@  +°/°Ö±é°±+± é± +°6ºð'Áþ+ °°À±ù°À³+³+² Š Š#9°9µ......µ......°@±°901%%5>=4&"#54>32¬Zþ;žu}RxI‘$CnBPx;gn†w‰- xkUM@I32—‘%!“ C|ZY{AŸþbFS" þlš %0CDOt_12`tAÿÿø :²+°3´ +³+± é°2² +³@ +°)/± é°/±2é°;/°Ö±é°2°±+´8+±<+±± )99°´$2$9°8±99±)°$9° ²+999°°8901654.#"32#54.#!#5332654&#.'54>324&AC&/G&`.JS†þrŒŒf>X¼B I. -DqG,UZC+HU;&9R(#:6þèPN .ä7*$%)k&OVA+)?iCgˆAððL²+° 3° /±é°/± é°/°Ö± é°± +± é°2² +³@ +±+± ±990123##4 #4>:PKO:%mm–þê–%:Oð$8];Ÿ}Òî‚‚þî;]8$Aÿë¦å7²+± é²+°3°/°Ö±é°±+±é±+±°9013#".53326‘A|YIlE*A5cE?¦þYKsa4 9Wc@§þZ2>?\-ìò^²+´ #+°/± é²  +³@  +³@  +°/°Ö±é°±+°2±é´ +±+±± 99± °9015332>533#5#".-=,.?#‘Zî<^[}Cêpo&.>"87,ýŸ°2`u$ÿÛñ8ß° /±- é²- +³@-& +°/± é² +³@ +°9/°Ö±é°±0+±é±:+°6ºïWÂ5+ °5°2À±ù°À³+³+°5³352+³452+² Š Š#9°9²4529°39·2345........·2345........°@±±')99°0³ -$9°± 99±-°9014>32#'.#"#".=332654.?N|KMs;#‹JF.*2Oa`O2¨z]ˆF‰'K5?Y'?QUQ?'Fg2+9K.:2"' /V;h‡4VV-+*3-(!-PFˆð?²+° /± é²  +³@  +°/°Ö± é° ±+± é±+± ±99012#54 #4>?PKO:%–þê–%:Oð$8];ÜÜ‚‚þî;]8$(ÿéXñ-9œ² +±é² +³@ +°/±1é°7/±é°:/°)Ö±.é°.° Ö±é°/°!3±é°.±+± é°4 Ö±é±;+±)°%9°.° 9°4³ $9±°9±² !999°1±%99°7±)99012#"&=332>54#"#6767.54>32654&#">Om3=T|~™J>*-‰+8 ™5k)E0/DH,0Dñ'CA&Y/?xjŽ~q 2A 4$m>9'%BB(Ñ&1(/.%.F‹ì8²+°/± é² +³@ +°/°Ö±é°2² +³@ +± +0133##F‘´´‘ìø‚þ#ÿèî'0]²+°/°03± é° 2² +³@ +°1/°Ö±$é°$±+±22±é±(22°±-+±é±2+±³'($9014>753#5.3>54&'#.AZC#DXC/-AXE"#EYA-/%-!PN05RMjGrD1;92EtHGsF4223Et )D*Tb-M2Tdxñ!o² +° /°3± é°2°/± é°/±é°"/° Ö°2± é±22² +³@ +° ±+±é±#+± ±99°°9±°9°°901#"'!!#5#53462!"32654&t‚vL5}þ‚WW’êþþ4BM425G ‘9€__€+g};3.'854.“mªYË¥N‡b8О6?,wd%FF+-=6f­j¹×8d”X¨Ý‰ #8fCs…5kL=_8$ #ÿèÏî&/‚²+± é°-2°,/° 3±é°"2°#/±é°0/°Ö±é°° Ö´+°/´+°± +°"2±-é°2°-±/+±é±1+±/-°9±, °9±#±9901#"&=3".54>;235"4.#25É ‡u@Z*#DM6xQt<þ‰1,#u0'ŠzVM5 635H#Ù+HL+NiŠXaþ¹,;þÍ~ÿÿc=í_È´ì '° /´ +°/°Ö±é±+±± 990153'767$( 1T˜i)1( P '3æç"²+´ +°/°Ö´ +±+0173zj3´´ÿýG7²+´ +° 2°/°Ö´ +±+±°9± ±990132?#0#"'7>t#< )+08M #@Æ)*s5 3u)ÿÿ_ÕõC 7\/$t²+´+² +³@ +°/± é°%/° Ö´ +°± +´ +°±+´ +±&+± ±99°±99°°9± ²999012#"'&'&=3#3032654&#"#54>œvJ<8/ ^ $+*a+/L84@ ,/B7:63ZÞ#²+°/´+°/±+±°901'?3e„R»3CfQZ<ÿç-%m²+² +°3±é°2²+±33°/°Ö±é°±+±é°±+±é± +±° 9°° 9°°9°±99±± 99013#5#"'#"&533253326£Š:Ji.?\Z`Š'fŠ!"25 ýÍ!,EEebwþ¦33€@þœ5'FAÿ&$%`²+´+²+²+²+± é²  +³@ +°/°Ö±é±22°± +±é°2±+± °9± °9013632#54#"!!#AŒ:hV_ŒZ3>Wþ©ŒNWbYfIa:0ç]Úÿ&p% |² +± é°2²+´+²+²+²+± é°/° ֱ鰱+±22±é°2² +³@ +±+±± 99±°9°± 99°°901"32654"&4632533##UjAA54B—d}ad2ŒNNŒ1°^˜]\JOþ–¢ø£YPþA]ÚXAÿ7r%g² +°3´+²  +³@ +²+²+± é°/°Ö±é°2°± +± é°2² +³@ +±+± °9±°90136323##4#"#AŒ:hV_NNŒZ3>ŒNWbYþó]Éa:0þ¼<ÿéÙ^²+²+± é²+² +´ +°/°Ö±é° 2°±+°2±é° 2±+±°9±°9° ±9901!#5#"&53!!326=3Œ:hV_ŒWþ©Z3>Œ@WbY5½]þa:0:#ÿ&u% q² +± é²+´+²+²+± é°/° ֱ鰱+±22±é² +³@ +±+±± 99± °9°± 99°°901"32654"&4632533#ZjAA54B—d}ad2ŒNÚ1°^˜]\JOþ–¢ø£YPýg]XFÿ‡ƒÙ Y²+´ +² +³@ +²+´  +´+° /°Ö± é°2° ±+´ +² +³@ +± +01%/#33#o^ÊŒ±±]ÖwÙÈ]þ©Aÿ&$%S² +²+´+²+²+± é°/°Ö±é°2°± +±é°2±+± °9± °9013632#4#"!!AŒ:hV_ŒZ3>WþNWbYþ–Ma:0þ?]Aÿ8t%$.…²+±,é²+² +± é´&$ +°3±& é°2°//°Ö±é° 2°± +±)é°)±.+°2±é°2². +³@ +±0+±) ± 99°.°9±&,° 9±° 9014&#"#3>323##".546;#"325º1A{ŒŒP0oh::"5"0F#EGF (<&8{þäj7<5Pnx 5L&33E_x3#ÿì©Ù S²+± é²+´  +°3± é°2°!/° ֱ鰱 +° 2±é°2±"+± °9±° 901#"&546;533+"3267"2G;"vŽ‘yfŒŠŠŒf'6 6B@+In<% —q†—ÈÈŒ0,5GLJFÿ8 ÙO²+²+² +± é² +³@ +°/°Ö±é° 2°±+±é±+±° 9± ° 9014#"#3632#”V/=ŒŒ:d 97 ŒJd<.ýô¡þõW'N5þ–Fÿ7 Ù-²+°/´+°/°Ö±é² +³@ +±+013#ÒNÚÙü»]¢Fÿ8Ùl²+²+± é² +³@ +² +²+°3´ +°/° Ö± é° 2° ±+±é°±+°2±é±+±°9±°901!#5#"&5##3332653Œ:hV_NŒŒÚZ3>Œ@WbYýy¡½þ¥a:0R#ÿé€ì 't²+± é°/± é°(/°Ö±é°±+´ +° ±+±é² +³@ +±)+± ´#$9°°$9°°9±³$9°°901"32654&';##"&5467&54>?.9FF98GEUcta{}Žh]&P´`š`_LP_¥ 1v=R‚˜™…q’+,P Aÿ8$ÙO²+± é² +³@ +²+²+°/°Ö± é° ±+°2±é±+± °9± °901##"&5332653$Œ:hV_ŒZ3>ŒÈWbY5ýèa:0RFåI²+° 3²+´ +±é°/°Ö±é°2°±+± é±+±°9±°901#3632#4&#"ЊŠ9I;S+Š)+pþäåâ(#@M2þ·I8-#ÿé9Ù /h²+²+± é²/+°0/°"ֱ鰱+±é°´ +°/±1+±"±$,99°¶%'*/$9±°9°/²"99901"32654&#5#"&54?654/&54?.9FF98GE* > :irZFk}Žfk :(:´`š`_LP_%  >•{þý$;™… MP   1Aÿ8r%Y²+²+²+± é° /´+°/°Ö±é°2°± +±é² +³@ +±+± °9±°90136323#4#"#AŒ:hV_NÚZ3>ŒNWbYþ+]a:0þ¼L² +± é°/±+017!&'7!547&'767± qf½UpýÒ¢)!(5Di_RQŒšsýPê‡FFÂæ †)yGr>Aÿé$Ù%²+²+± é²+´+²+²#+°&/°Ö± é° ±+°2±é°2°´ +°/±'+± °9°° 9°° 9± °9±°9°°901!#5#"&5332654./&546;"$Œ:hV_ŒZ3> .'&¿(@WbYxþ¥a:04  -]  &ÿ%-²+°/± é°/°Ö±é±+± ° 9°° 9013#"/7326yŠDW.  Dý¿ej {Aÿé$ÙU²+²+± é² +±é²+°/°Ö±é°±+°2±é±+±° 9°± 99±°901!#5#"&5432&#"32653$Œ:hV_Š)'&Z3>Œ@WbY®‡i*þ{a:0Rÿ8þ-/[°#/± é°/± é°0/°&ֱ鰱+±é±1+±&² 999°³,$9°°9± ²&999°°9014&#"'7>323!!"&54>7>k03&!j !)7Y3# kÆ! <þœO1>0h$K?%\   $5?1–Ax ŒDM$9'0> 5A0M²+° 3²+³ +±é°/°Ö±é°± +± é±+±±99° °9±°901#3632#4&#"ËŠ:RÊŠ57:þå%%0êþº%MADÿ8t!h²!+°/± é°"/°Ö± é² +³@ +³+± é°/± é² +³@ +±#+±±!99±± 99±°9°!°901;#"&54?654/&54?Irh!^,yå/LvP:x– 6F-Š x2(°, '"¬7ÿ8(%u² +°3±é°2²  +³@  +²+±33°/°Ö±é°±+±é°±+±é°±é°/± +±° 9°° 9°°9± ± 99013#5#"'#"&533253326žŠ:Ji.?\Z`Š'fŠ!"25ýÞ,EEebtþ©33€=þŸ5'F#ÿ82,^°/± é°%/± é°-/°Ö±(é°(±"+±é±.+±(± 99°"³$9°²999±°9°%³$901!"&54?4.54>323'7>54&#"ïþ®-b%66%KmBq;DF2( */I45):Tt+!^4*2T7Jf*‰mO}>@/ Ø (D&JH=/5!4A)%b² +°3´ +²+²+± é°/°Ö±é°2°±+±é±+±± 99°² 999± ±99°°90136323#654&#"#AŒ:hJpY/Úx7'3>ŒNWb; þó]M +:0þ¼Aÿé$R²+²+±é²+°3°/°Ö±é°±+±é±+±° 9°°9°±99±°9013#5#".53326Š€;Q/H* Š 26:ÿ%ýÑ$0+,=&QþÑJDDAÿ8rÙY²+± é²+² +°/´+°/° Ö± é° ±+°2±é² +³@ +±+± °9±°9013##"&5332653$NÚ:hV_ŒZ3>Œk]WbYxþ¥a:0Aÿé{%q²+°3²+± é²+°3²+± é° /°Ö± é° ±+°2±é°2°±+±é±!+± °9±°9± °9±°901!#5#"&5332653632#4#"$Œ:hV_ŒZ3>Œ:hV_ŒZ3>@WbYxþ¥a:0RNWbYþ–Ma:0Aÿ8$%D² +²+²+± é°/°Ö±é°2°± +±é±+± °9± °9013632#4#"#AŒ:hV_ŒZ3>ŒNWbYþ–Ma:0ýô(ÿ8#0#.{²+±*é²+³ +±$é° /±é² +³@ +°//° Ö±'é°'±+°,2±é±0+±' ±99°´ $9±°9°*°9°$° 9°°901253#".'3327#".54>"2654&"H6ƒ5dF*C-"„!2u4BNs87tU,GF^FJ0(þ!/?O0! ## Y$PPN„VzL[cJM]ZPF>/²+´+²+°/°Ö±é² +³@ +±+013#Òløþ@\Aÿ8{Ù{²+²+± é² +³@ +²+²+²+± é° /°Ö± é° ±+°2±é°2°±+±é±!+± °9±°9± °9±°901##"&5332653632#4#"$Œ:hV_ŒZ3>Œ:hV_ŒZ3>ÈWbYxþ¥a:0þõWbYþ–Ma:0Aÿ8E% |²+± é²+² +± é°/´+² +³@ +°/°Ö±é²222² +³@ +°±+± é±+±± 99±°9°± 99°°901"32654'2#"'!!#36xjAA54BVf|ad2Wþ©ŒŒ2°^˜]^IMÔ¤ö£X‚])äPY#ÿÛ;+$>°/±é°/±é°%/°Ö±é°± +±é±&+± °9±±99014>32".%"32654.#2SX/x”"5HGLGI5! '*)(4K)(Ry@ŸFmB++Aið "J53I#Oa1H##ÿ8ØÙ&-в+°3±(é°2²( +³@ +²( +³@( +²%+´% +± é°./° ֱ鰱+±22±é±'22°±*+± é±/+± °9±(± '99°±99°%± 9901##5"&5335.54>;654.:W 7Œ,›wŒ{œˆAJ8T1 6QO!x†67H (  "1V5r‚¹¸l_ 2ï%3.2N)þväY'7AÿérÙ[²+± é²+´+² +²+°/° Ö± é° ±+°2±é² +³@ +±+± °9±°901%3#5#"&5332653$NÚ:hV_ŒZ3>Œ]]@WbY5ýèa:0Rÿÿ2È}*°/±é°/±+±± 9901727#"'7æ#<8'#I*-~M!õE AÎð„²+°/°3´%+°2°/°3´%+°2° /± é° /°Ö± é°±+± 22± é±22² +³@ +°2² +³@ +°2±!+±±99±±9901!#5#535#5354 #5476 3#3#ƒ–RRRRþê–GRRGKKKKÍ6M6h‚‚ÜÜx@JJ@xh6M6ÿÿ+þõ}ÿÄ&®®ƒÿÿˆþõ÷ÿÄ&®z&®zƒ&®ê&®§ƒ®ÿ]ÿÿeþõÔÿÄ&±ŸªWÿÿ~þüôÿÄ&®w&®wв®+ÿr}ÿÄ*°/´ +´ +°/°Ö´ +´ +013#+RRÿ8X %°/± é°/° Ö± é² +³@  +±+014&+532#}Q4ºÅHm7‹m.Js1KGýÂLX1²+± é°/± é°/°Ö± é² +³@ +°2±+014&+532+53265‹N7ºÅ<_8% 7lGź5Pm*Ns#4@5”GK2sN*>SîR²+° /± é² +³@ +°/° ֱ鰱+±é°± +±é±+± ±99± °901%#54>=!3!š‹*/*þv‹Š*/*eek7K!6)B –¼:N!3PeX .²+± é°/± é°/°Ö±é°±+±é±+012!.'#!Z>c8% ýëŠ.#ÿX'7D3þXç"2 þŽCyXe²+±33± é°/±33± é°/°Ö±é² +³@ +±+°6º?Nöš+ °.°.°±ù°±ù³....°@014&+##5!2!53îG8EHŒH[,pšþòƒq1CþåsƒdþsOÿ8ÚX°/°Ö±é±é±+013O‹È üàIgX<²+± é°/± é°/°Ö± é² +³@ +³@ +±+± ° 901.#52!53Ü0 M`Cþâ“m(s,aCþŠsLaX6² +± é°/± é° /°Ö±é°±+±é±!+±° 9017!2#".%4&+>5L/YN/šm(XV8ŠS2z 8''7 âv3[:”mu2\Ç,Lú !+*"<ÿÉCXh°/°Ö±é±+°6ºÀÁ¹+ ° ° À± ù° ÀºÁ”ñà+ °° À±ù°À¶ .......¶ .......°@01%653573Z^‹)U9þØqŽˆ%YRþ¤=H<Lx$óHÿ8NYE°/± é°/± é°/° Ö±é² +³@ +°±+±é± +±°9°°901;#".=!#.#Ó$5A$9$xŽ‹ #-<&—#s?,Ë„]ýÃ7  OUX"C²+± é°/± é°"/± é°#/° Ö°2±é² +³@ +°±+±é±$+01;#".=!2#!532=4&#Ú#5A)5'Ik9<\L"ÿøƒX˜–"s =(Ë)EK+Eb,sw„L+ÿ8 X &°/°Ö±é°± +±é±+±° 901#36753 _C‹Éž˜7 ‹±SZ þ?æ:îMœ=^X$²+± é°/° Ö±é±+± °901!5!3>=3CFE¦ýø þÇžš$‹±0iþþsåî3œPÿ8WX A°/± é°/± é°/°Ö°2± é° ±+±é±+± °9± ± 99015!5!526'#Ìþ„‹o2?å‹Èsþ¼gytBŒýÅ;?X ² +°/± é° /° Ö± é± +014&+532#‡P5Ãχ}‹m3Es~dþŠLþX"Q²+± é°/± é²  +³@  +± !22°#/° Ö± é° ±+±é°± +±é±$+± °901+"&53326=3+;2653þ*KwEO}µ‹D%‹0F9@R-O8n‹)YO3¡hOþë#ÕÕ5L#*3X>O>­X4² +°3± é°/°3± é°/°Ö±é°±+±é±+014&+#'532=#5!2#"N7U!.H6$WB.{‰‹n3Dÿ>Y/tvüsyiþŠOÛX&²+°3°/°Ö±é°±+±é± +013333O‹v‹Xý¨Xý¨I×X#²+°/°Ö±é°±+±é± +0133Ô‹‹x‹M9Dý¨Xý¨IÖX.°/°3´ +°2°/°Ö±é°±+±é± +0133Ô‹‹‹‹M9Dþõ9D2Ö¼Ù#²+´ +°/°Ö±é±é±+01#'5¼*8(Ù‚‚2Ö¨Ù 0²+°3´ +°2° /°Ö±é°± +±é± +01#'5!#'5¼*8(v*8(Ù‚‚‚‚ÿÿþÊ|TßÿÀÿÿþÊ•T˜&# àý ÿAÐÿéx²+´ +°/°Ö´ $+01'kTTTxTTTÿÿB\ê'àþ£àýŒÿÿ ÿìëf&ã$à ÿìëy<º² +°/± é°"/´&+³&"+± é°-/±33±3 é°2°=/°)Ö´6+° Ö´+°6± +°2´ +² +³@  +² +³@  +±>+±6°89°°:9° ± 99± ±99°"± $99°°9°&²8999°-²/0699901275#5!###"'#".'732654&#"'3>754&#"'>32ß+h:`r [U7jG.WpY!5$&",702C4T~CB]&!T ¨qqýäSZA[S4Ì!1(k*&Q>3Q]F8+ÿìªyFͲ+°3°"/±, é°2/´7+³ 72+±é°?/² 333± é°2°G/°<Ö´+°/ Ö´+°±+° 2´+² +³@ +°±+´+² +³@ +±H+±/°9°°9°± 99±,±/99°2±599° °(9°7² )999°?²BC9990123275#5!#####"'#"./732654&#"'32>74&'"'546ùD^& "fÿWo`s [T3jL1V lT!1*& ./3>- T‹y^E7+ ¨qqýäýäSZ74W7&;y/®þÉ dé"#3,:~:KD;R9NZ92+&"8Ê ›;'8qqª; H'Ž6<d%G:76*'",!ÿöÿN˜Cù²5+´: +°/±& é° Ö±) é°#/± é° /° 3± é°2°/±é°D/°Ö´+² +³@ +°³"+´ +°/´" +°"´ +° /²" +³@" +°±A+´,+±E+±²#5:999° µ%'>$9±A±.99°"´)2$9°,±99±:5±.>99±&°,9± #°9±±99°°901%"#"&546;5!5!&54632&#"3##27632.'&'4632>74&W1*;y/®þÉ)B[;-,;Fydé *10,:~#>$D;R9¥99"8Ê ›;'8q\G@<g/°&Ö´+°/ Ö´9+²9/ +³@96 +²/9 +³@/3 +°± +´+±?+±9&²7;=999°±99° ² 999°°9±$°9°*³ $9°+³ ;=$9°3²9999012'7654'#"./7254&+'32654&'!5!!JŠUt [ [*0xN,U@<&#b 35AU9'n0f@5þi`þµ){[Aa† 7}.)6S_)+±;-± 99°4³16$9±±99°#µ $901%2?#"&5467'#5'%&''7>325!5!!674/54632#"!ZNXLU0&vrþûDM&‡F6™'I:þ+ÕþrE0*!(A"JS`N^?0H2õÅ–[—TJW D7;ªqqµ+37'+#v#/ÿöÿu³y@Ѱ)/±" é°>/°53± é²> +³@>: +°/°3± é°A/° Ö´+°±:+´9+³,9:+´+°9±+´+² +³@ +°±2 +´+²2 +³@ +±B+±:± 99°,±99±±0599°²"%)999±")±&99°>µ %,2$9° ³$901'.54632675!5!#32?#"&54>54&#"#54&#"›a+FG{cIJ/5þU½ 7:'77'50>@JLr'77'*'r#! 8{d´ZLm+!=qqCShY8, a -WE+C,)5  $Zi0ÿÿÿöÿeã>&í#Vÿÿÿöÿeãf&í$Öÿöÿeãy'[°/± 33± é°(/°Ö´+² +³@ +°±+´ +²  +³@ +±)+±³$&$9° ±99014'&'%#5!#'>=##'32Fþê4í/m] 8§lV%! 7&(ü,qq¾S(M"®ø^N%-' cÿÿÿöÿeã„&í%Öÿÿÿìª2&ä#ÿøÿÿÿìªf&ä$pÿÿÿ쪄&ä%zÿÿÿ쪒&ä&pÿöÿìy.®²#+°&/± é°/°3±, é°2° /°3± é°//°)Ö´+°±#+° 2´"+°2²"# +³@" +²#" +³@# +°"±+´+±0+±#²&,.999±"²999±&#°9°±$99°µ !)$9°,±.9901&#"3267!5!!632'>54&#"#5#"&54632,,%%Q<þ›)þ­3;AhŠa(R")@q89Hy`T5P)!L qqi/fB\¡G#k& hþø‰!kMG} ÿöÿì>y"=°²:+°#/± é°/± é°/±é°4/± 733±5 é°>/°2Ö´+²2 +³@24 +°±+´+°±:+² 222´9+²9: +³@97 +±?+±±#99°:²999±#°;9± ±99°³ 0$9°²+,999012&#"32705!3267#"&54>".'732=#5!##5%%782'þÒ12jM.v221A](;0o=jI="^åHRq0{èg ,+/³‡*;8S(1OH,A þ!+>XIU 8F yqqýä_'ÿöÿì<yk²+° /± 33± é² +³@  +°/°Ö´+°´ +°/² +³@ +°±+´+² +³@ +±+±°901"&54735#5!##ý23n;(—FQp~ G|(*vqqýåÿöÿì€y(’² +°/± é°/±& é°/± 33± é°)/°Ö´+² +³@ +³@ +°± +°2´ +² +³@ +±*+±²!#999° ²'(999±° 9°°9°&°9°°901.547#5!##5#".=4"3275#;u (?ŠSqeM6E0· &!#Mmþ<Y@VH,qqýä¥8C,2#Gõ 'tÿöÿè y5¢²+±*é°0/± é°3 Ö± é°/± é° /° 3± é°6/°-Ö´+° Ö´+² +³@ +² +³@ +³@ +±7+±-°09°°9°°9±03±-99°±$99±²%999°±9901'%46;5!5!##32632#".'732654&#"#"&œXXXþy?­þ4Úð& ]$3'?D$@|TM f7N]*+2J@ƒ™XXX8-*8qqª!%V'9T+:Ib2E$LY92* ÿöÿìžy‘² +°/± é°/°3± é°/°3± é°/°Ö´+² +³@ +² +³@ +°± +°2´ +² +³@  +² +³@  +±+±°9° °9±° 9°±9901%2675!5!##5"&547#5!#3.\þ¨QqXSG[)Ž‘f*+ÎU6¯qqýä¹GRD:3rr#7ÿöÿä¶y8Ú°/±7 é°//´,+²,/ +³@,. +°/± &33± é°9/°Ö´4+° Ö´)+²) +³@ +°4±#+´+°±+´+² +³@ +³ +´%+°%/´ +±:+±°9°)°9°4°'9°#²,.999°%° 9±/7² 999°,µ#$9°² %99901.547#5!##"&54%"654.5475#327"2€',EÀŠ+0Fjy7^l!$j' Vû$61* 08H \2&qqO=;J€Q.vVBh03-!B-á=M1V+S++)f2-ÿöÿìñy€² +°/± é°/± é°/° 3± é°/°Ö´+² +³@ +³@ +°± +°2´ +² +³@ +±+±°9±±99°±99°°901%4&'5!5!5!####"7326v5!ýÈûQrY25¸gmhPüW#&Mqqýä_%)/E$O/þôÿöÿNæy,;β+²+´$ +°/±3 é° Ö±:é°° Ö±6 é°1/± é° /±.33± é°7475##3263232WZ;y/®þÉðRq q9KB;R9¨9:"9À…é(V/ Ê›;'8qqýäºj0@ \%G:l*'".!Nðª;*ÿöÿìÚy+w²+°/± é°/±é°'/± é°/° 3± é°,/°Ö°2´ +²  +³@ +² +³@ +±-+± °9±²#999°'²)999°°*90123275!5!##5#"'"&'732654.#"'6ü“0ýàäSq (,L15eJK2#&-/%$ ,#LVР ÔqqýäØ/5".9Z.4.!, Y3ÿöÿæjyn²+± é° /± é°/° 3± é°/°Ö´+² +³@ +°±+´ +²  +³@ +±+±±99° °9± ±9901746;5!5!##"327#"&Aq@ƒþt„è,&/%W4hg‡t¦òUyHqqº>"$9 ^@ŽšÿöÿòEy!•²+± é°/± é°/° 3± é°"/°Ö´+² +³@ +°± +´+³! +´+°/´!+²! +³@! +±#+±± 99° °9±!°9± ²999°°901#"32654'7#"&546;5!5!#Ïò "#5-4@[5‡_s”kQzþ—OvB9'<.('):>PYk¨\LqUqqÿöÿè•y1”²+±&é°,/± é°/ Ö± é° /± é°/° 3± é°2/°)Ö´+° Ö´ +²  +³@ +² +³@ +³@ +±3+±)°,9° °9±,/±)99°° 9± °!9°°90146;5!5!##32632#".'732654&#"#"&½?­þ4Ÿcð& ]$3'?D$@|TM f7N]*+2J@ƒy-*8qqª!%V'9T+:Ib2E$LY92* ÿöÿæLy&/£²$+°+/± é°/± é°/° 3± é°0/°Ö´+² +³@ +°±+´.+°.±)+´ +³ )+´+°/´ +²  +³@ +±1+±±$99±).°9±+$³'$9°±990174>;5!5!##"&54632#"&654#"1#I2„þ“Vwì '83J;5!5!###".* 4#þþRpQqÏ~(Q!!!.-/@qqýäj>œU!*%/+)ÿìÆy3§² +° /± é°$/±é°/±33± é°,2°4/°'Ö´+°±+´/+°/± +°2´ +² +³@  +² +³@  +±5+±'°9°³!$,2$9°/± 99± ° 9°$³2$9°°/9°°'901%275#5!##5#".532654&#"327#"&54>32Dd[h+RqZd@oF'@.LC*&- ;K(:0Sj]W%Ðz¾qqýä¼K5PZ(34",aC@'9 qMPfÿöÿÅ-y)¡°$/± é²$ +³@$! +²$ +³@ +° /± é°/° 3± é°*/°Ö´+² +³@ +°±+´ $+³ +´+°/´ +²  +³@ +±++±°$9° ²!999±$°9° ±990146;5!5!#!"4&54632#'&'.*O>«þ”0RþüPS0*1' F–HoA)&Fd8qqª85(/1&3!j$ 0F.=8)ÿìƒy/Ȳ +° /± é°*/±)é°/±!33± é°2² +³@ +°0/°Ö´$+° Ö´-+°$±+´+°± +°2´ +² +³@  +² +³@  +±1+±$°9°-±!99±² '999° ±)*99± ° 9°*°9°)²'999°±$9901%275#5!##5#".547&54632#54#"63"=h`$RrWf2J#+VS;7Nq +1[aF.Äeßqqýä¬F$6,9+GZ8TS033@m"ÿöÿìjyV² +°/± é² +³@ +°/° 3± é°/° Ö°2´ +² +³@ +² +³@ +³@  +±+01463!5!5!####"&*' 6þOtQr¸5rV2eqqýäGD8ÿÿÿöÿÁjy&X6ÿöÿìy e² +°/± é°/±33± é°/°Ö´+² +³@ +°± +°2´ +² +³@  +±+± °9±° 9017"&=#5!##5'275#óTu4Sp*51.³-’bJÊqqýä»r+ÙÆ"ÿöÿìy (£²+°/±$ é°/± é°/±'33± é°)/°Ö´!+²! +³@ +°!±+°&2´+° 2² +³@ +°±+´+±*+±!°9±² 999±±99°$±99°²&999° ° 9017"&=#5!!632'654&#"#5'3275#óTu4þ¯6+Mj:az+Sp+ˆ-'1.³’bJÊqq{(bM%MJMr8Lþóº°"%ßÿöÿìy€²+° /±é°/± é°/°3± é°/° Ö´+°±+°2´+² +³@ +² +³@ +± +±³ $9± °9°³ $9°°901!5!##5#"&54672&#"27'[þ›(Rq46_hdO+!  †m},qqýä• vDLt p [@ M)/ÿìty'¨²+°/± é°2² +³@ +°/± 33±é° 2°(/°%Ö´ +° ±+´+°2² +³@ +°±+°2´+² +³@ +² +³@ +±)+± %°#9°±"99°°9±°9°±"%9901235#5!####"&546;54#"#&546•,-‘h+Rq‘4#i# t Tw 3#œ§qqýäO |",†$/#)9Hÿöÿì8y|² +°/± é°2² +³@ +°/± 33± é°/°Ö´+°2² +³@ +³@ +°± +°2´ +² +³@ +±+±°9±°90146;5#5!####"&%5#$hBRq§3$ig§.§qqýä:5zg§§ÿöÿì^y$r² +° /± é°/±33± é°%/°Ö´ +² +³@ +° ± +°2´+² +³@ +±&+± ³ #$9± ° 9°±99014'#5!##5#"&'326275#¼,šhRr6Dv~   #)^D<ƒ:2À%#qqýä¾!•… #¬DÊ$'0](ÿöÿÖåy>°/°3± é°/°Ö´+² +³@ +² +³@ +±+±°901.'732=!5!#ŒP:lKOVŒt\*A*þÛïYŒ9L—IM\¶ª@> .fqqÿÿÿöÿ¦åy&›ÿöÿèÂy#t²+°3°"/± é°/°3± é°$/° Ö´+°±+°2´+² +³@ +² +³@ +±%+±² 999±"± 99° ±99017".54632675!5!##'47&'›™3&HL>(oTXD8>ý÷ÌQr-C c %_øFh`.?^5Mj?2 VqqýäRc,2.&ÿö&Çy*6¥°/°3±4 é° 2°./°&3± é°/°3± é°7/°Ö´1+°1±#+´+²# +³@ +³ #+´+°/´ +² +³@ +±8+±1µ+$9°#² &999±4°9°.±99°² 99901675!5!##"'#"&5463232654&#".#"326d'4þ7Ñ– .]TW.0XQ^gMQl0!$u*!!!!"&„.GqqL7=-\uCGt]YtÎ!>=*&-$ %2)04-Aÿÿÿöÿ‰Çy&™ÿþÿöÿìy~²+°/± é°/± é° /°3± é°/°Ö´+°±+° 2´+² +³@ +² +³@ +±+±²999±°9°² 999°°901&#"327!5!##5#"&54632"'.##1#64þ±(hq69PqbQ&4^ , )#0qqýä“!vGLu ÿöÿÔ¸y (в'+°/±é°!/² $333±" é°)/°Ö´+² +³@! +°±'+´&+²&' +³@&$ +±*+±² 999°'µ$9±'µ$9°± 99°!°901&#"32677>7#".547#5##41 *odJ¢NþÈH8(X$( B7_ÂWoÕ3@18QˆQS0&%@.&qoýäÿöÿìy q² +°/± é°/±33± é°/°Ö´+² +³@ +°± +°2´ +² +³@  +±+± ²999±° 9°±99017"&=#5!##575#327'óTu4Sp**….,(/›†bKÕqqýä¯õÑ"¤ÿöÿâÍy²+°/± é°/±33± é°/°Ö´+² +³@ +°±+°2´+² +³@ +±+±² 999°° 9±± 99°±99°±9901###'.'732=!5!5#ÍQsš&3ZZQWŽl\*A*þÛ×Ä}ýä}ZJ^¶œ@> $pqÿŽŽÿöÿ¦y3ª°/´+°1/± é°/± é°/°3± é°4/° Ö´+² +³@  +³@  +°±-+´#+° Ö´+² +³@ +±5+± ° 9°³+1$9±-³)*$9±1² #*999°± 99±°9017".547&546;5!5!#!632'674.#"£‘e KgP99C."Úþ£"Uþä5"?@'  M(,3J{-: c-S6;7I?"38qqª A-N2ÿ}zÿÕ*#°/´ +°/°Ö´ +´ +01#5+X*°°ÿÿÿöÿì*&Üþvÿ‹ÿ3°/´ +°/°Ö´ $+01%'þÊTTT3TTTÿÝây"Z°/± é° /± é°#/°Ö´+°±+´+°2±$+±°9°²999°°9± ³ $901#".'732654.5463!!"­`s`oR/`E.R"e( 9?[[?L9 þñß NXv/Ic"/+ K32?#".546;#"‰ 0-G=A*J>k^92°J-=(?#".547&þÆJ>k^9'!$0,H5 1,I*TE>32#"/732654'"#".=73254'&#'32654#"'546bTTTQ'A]uOPu[FþËD[#  ;7N"M\ZLD/2"=&/S/ 79-ZA4T %79==&;!*P2 M{TTTa-1R]_P0.fI=( 2;2~a_8 t'2)‚+532H%5LP7 08I.=) s-"=  8 ^ÿ}zÿÕŽ#°/´ +°/°Ö´ +´ +01#+XŽþìýÖþõÿ<°/´ +´ +°/01!5!ýÆ:þõGþÖÿBŽ1°/° /´+°/° Ö´ +± ± 99°±9901.#"67632¾I  .A'"$ Ý  $T" ' -ÿ"ÖNŽ/°/°/´+°/°Ö´ +±±99°°9012&#"'676'"'A.P.Ž"T$SCþÊVT„^² +´+² +³@ +° 2°/´+°/° Ö´ +°±+´ +± ±99°± 99°±990126753"&'53!!q(?]užv[.,ªtþŒ!(1 SadP !, qZþ:ÿRÿè $²+° 3°/´+°/±± 9901 /726?BþÌJGgDgG®Z44ÿÿþ:þÊÿè&44ÿxÿÿÿöÿy&óûÿöÿÿÿöÿB>y&ô¬ÿ·ÿÿÿöÿì<y&õÁŠÿÿÿöÿ‘ñy&úmÿÿÿöÿ3•y&ÿ³ÿ¨ÿÿÿöÿ3Ly'ÿ¨ÿÿÿöÿ£y'ÿ ÿÿÿöÿ~^y& Eÿóÿöÿ0¶yNß²+°-3± é²$+²+± é°4/±9 é°=/°@3±> é°O/°.Ö°;2´-+°A2²-. +³@-@ +².- +³@.= +°-±E+±K é°' Ö´+°E°# Ö´+±P+±E#°%9°±*+99±Kµ HM$9±°9°±#99°²%0999°4@ '+,/16BM$9°9´7;CEK$9°=°H901%"32>1#"327#".547&5467'#5'%&#"'6325!5!!7&54632&%@     SQR"(#7(9;I%E?&%-'qpÿDÿR&‘DÌ8?_þ5Àþ{S-)"'@Ì&   ]K!$Z;!@*0'+;-H1öÇ“Y”WS\ffœpp¯$ +38&, sÿöþɼyT ²+²!+±' é°6/±. é°R/°I3± é²R +³@RN +°/°3± é°U/°Ö´+°±N+´M+°M± +°>2´+²  +³@  +°° Ö´@+°@/´+°°+ Ö´<+°99±R!µ#@F$9° ² 99901.54632675!5!#327#"32>7#".'47&54>54&#"#54&#"˜—9MaFH03þ^®4= ..!!,;4%.;0&,;."2"10"%)o%nZ]±`Mh* :ppAS6/N1'#Z [ :%3%)?*E/*.Xf$þLþÔ:™8©²+´"+°7/°.3´ +°2²7 +³@73 +°9/°Ö´ +°±3+´2 +³'23+´ +°2±,+´ +±3± 99°'± 99±2²*.999±,³"$9±"± 99°7´'$9° ° 901%.54632632327#".54>4&#"#54&#þªC-->cM65$/0E ## 380+A '.'"^+0NR„L54#"#54&#þ«F,/H[L96$#( 0$?> "'5'*(%+7%$'.'7 ^+“/NQ"}Q0V#1!%[B K&  L 4$% 0$C)+!GR _ÿoʱ°/°Ö´+´+±+01'ÊkCý,nÔÿÿÚÿ}¿'Bÿ{BPFIø H°/± é°/± é°/°Ö´+°±+´+±+±²999± ±9901"&546322654&#"øuÊsvbcwÚ2763.9'hvtjgxyÔ:728:4m]ÿìÓy L²+°/± é°/± é°/° Ö´+°±+°2´+±+±±99±°9012##"&'4632654&#"Uiq)Qiu+*#3*ytYþ@, eNSh·#$!'(*;ÿŸyT° /´ +°/± é° /°Ö´+² +³@ +±!+±°9± ±99°²999°°9012'#".54632>4&'"'>b‰_;}]Ž "-/'=2(DA86aL$~y|^]zÉCä*#(,b\94P 5Fÿnúy+n°!/´& +°/± é° /± é°,/°Ö´+° Ö´+±-+± °9°±99±&!±)99°°9°°9° ±99°°901%4&#'32654&'"'632'&54632>ˆT0d,Ž3)$.$KC_m<>&-UN;Jak|(!E#/Í%7tb>!D.I)5aG^k>R&*)7:ÿð}#.…²+±* é°//° Ö´'+°'° Ö´+°/´+°'±-+´+°° Ö´+°/´+±0+± °9°'° 9°-´ !$9°°9°°"901#"&547.5467>54.'732654^lNLhYOC7"] V%;A!gDæ,&) ñZfSKJYZLJS9P7,H< O&D"1 *SþÈ: +Rÿì2†² +°3° /± é² +³@ +°/°Ö´+°±+´ +±+°6ºÂììá+ ° .° À± ù°À± ..³ ....°@±°9°² 999°°9012#'#"&547327&546Š)]wH'0WsFe98''ö' H-þ׿zci~6Jc>2*%4>Rÿ|þy.²+± é°/± é°,/±' é°//° Ö´ +°$ Ö´+° ±+± é±0+± °"9± ³ ',$9°¶)*$9± °9°² 999°°"9°,±$*99°'°)901;#"327&54632'#"&547&54632&#"ÄJV&v&53) +)&,#:g:ZyEVlIM-GD8Ù?&'&546254&#".I* ^K‹ )#- (¦cZD&)!y(3%Hg í)@/  P#6Ifï?"&9Q¬9’`°/´ +° /´ +°/°Ö´  +° ±+´ +±+± ±99±±99±°9° °9°°9012"&54"32654&•`DD`Dt ’D`BC0/ wà O"°/± é± é°/°Ö± é± é±+01#53 ••ÃŒÿÿ ÿì:&ã#Àÿÿ ÿìë*&ã¨ÿÿÿìª*&ä\ÿÿÿìªf&ä ÿÿ ÿRëy&ã4Nÿÿ þÊëy&ã5Nÿÿÿöÿ\ñy&ú'÷;'jÿÑá7ÿöÿì^y#O² +° /± é°/±!33± é°$/° Ö° 2´+² +³@ +±%+± ° 9°³ $9014'#5!##5#"&'326327'5#¼,šhRr6Dv~  "(V 0@)%¸gl 0> ü.5&MqqþAqq%)YPO,(L]8OÿíyH²+°/± é°/°Ö´+°± +´+±+±°9±±99°°9012#2654&'"'>/b‰wFpRlA86aL$~y|^dŠ® h@.94P 5ÿÿÿöÿ—•y&ÿ0D¢ÿöÿØy"‘°/± é° 2°/±é°/± é°/° 3± é°#/°Ö´+°±+°2´ +²  +³@ +³@  +² +³@ +³@ +±$+±³!$9±°9°³"$9°°901727'!5!#3!5!5#"&54672&#"î},”þ›(RHýì[46_hdO3' †Í M)/;qqþAqq8 vDLt s [þÅÀÿþ¿"R° /´+² +³ +°2°/±é°#/°Ö±+´!+°!±+±°9°!± 99°°9012>32#".54327"&4632Ÿ,5  ,'03 3)-6-N&;! A/P-6-:0&&ÿ®ÂRf $°/´ +´ +° /°Ö± é± é01"&4632"00"$..Â0D00D0(10:y°/´7 +°1/´) +°/´ +°/´  +°;/°$Ö°2´4 +°2°4±+°82´ +°.2±<+±4³ )$9±17±.$99±±9901".54>32'"32654&".54>32'"264&¬ &0! ' 8M 0'#*&0 !0& &0!M8 "4"#v 8&2M8'8 Á*,# ýæ 9&'8 8'8MÁ+#"4"ÿ÷•:²2+°/°/3± é°-2°;/°Ö±+´6 +°6°* Ö´+°/´*+°6±2+°,2´1+²12 +³@1/ +±<+±² "999°²&9999°6°79±2²"*,999°°&901%4>54'#"54>7654+532>76753###"L%+%#eM .-R /F\-A -2U,0,7Bï~qY6(/Vz:*:GC@h_;E  +(pP"0,,62I^!ÊpýïI.44A8ÿ÷‘>ª²6+°/±/333± é°-2² +³@2 +°?/°Ö±+´: +°:°* Ö´+°/´*+°:±6+°,2´5+°5±2+´1+²12 +³@1/ +±@+±² "999°²&=999°:°;9±6²"*,999°°&901%4>54'#"54>7654+532>7675!#####"L%+%#eM .-R /F\-A -2U,0,7Bë„p†qY6(/Vz:*:GC@h_;E  +(pP"0,,62I^!ÊpþéýïI.44A8ÿÊÿù°¥7<ز-+² +±é² +³ +° /±:é°:± é°//²*8333±0 é°2°/±4é²4 +³@7 +°=/°-Ö°12´,+°2²-, +³@-/ +°,±+´7+°7±;+´ +°2² ; +³@  +±>+±,-°29°³&*4$9°7±(899°;² 999° °9± ±&99±: °(901.#"!#&#"32>32#".'67&'###53>32375$>?'|–;^> $‰I"9 'J/ز*+² +±8é²8 +³8= +°0/±é°±. é°/²'+333± é°%2°/±"é²" +³@ +°?/°Ö´.+°2³.+´+°/´+°.±*+°2´)+°%2²)* +³@)' +²*) +³@* +±@+±² 08999±.°;9°*±"99°)°$9±.8±599±0°901375#".'67&'#5!3.#"#46323##+&#"32>32Ó-kl'J/?"m^ygl‚‚og—;^> $‰I"9 xuþ{ -4%(P5^G5spbY0Lov„ pýïæ&#Cÿÿÿ÷ÿ ™"©ÿÿÿ÷þ™™"©õÿÿÿøÿùã¡"¨‘Ìÿÿÿ÷•Æ"`’ÿùÿ÷ÿù´-;“²+±3 é°;/±é°/± 33± é°+2°(/±é°3#.#"!32654&#"ÅnMc,5 þnK8^w]þ•UX/DvK`'7#C@Y a\"Wý¿3O-;2]4„‰)2==+j#E^Shp@]F2&Yspó4@*,1Bÿÿÿ÷•Ï"`”hÿöæ%~²+°/±é°#/±é° /° 3± é°&/°Ö´+°±+´ +²  +³@ +² +³@ +±'+±³ $9° ±99±#²999°°901463267!5!##'#".7327'&#"‡aZAA,ýëðjLD+tFk|4Q. n@0UV<1A0=Zw45_Hpp•p¨~$4@//;w5":ÿ÷²…²+°/± é°/± é° /°3± é°2°/°Ö´+² +³@ +°±+±22´+² +³@ +± +±±99°±99±°9°°9°°9013275%4&+532353##5#"'>Ñ 8hX3$,Øs#a™pýïq>B\@žQp C,2Eo5~^+\WÿðÿðÔ$-ž²+°/±(é°,/±é°/±é° /° 3± é°./° Ö´+²  +³@ +° ° Ö´%+°±+´+² +³@ +±/+±µ(*,$9°±99±(°9°,± 99°²999012654#!5#5!!32#&'#"&54>327&#"ì@V51iþÀOäýÜéVi8,5u&WgPj&K7"/3@5F/).(,4±ppKWG.W0l.0BT@-.“'1ÿò色+± é°/°3± é² +³@ +° /° 3± é°/°Ö´+°2² +³@ +°±+°2´+² +³@ +² +³@ +±+±°9°°9±°9014632!5!5!##"#"&26=! b6:ýûöƒeû%"n1KþèR3K.Žppþ«Th#Ç%,S¤ÿöÿûÄ"'-©² +±-é°#2°(/°'3±é°/± é° /°3± é°./°Ö´+² +³@ +°±-+´#+°#± +´+² +³@ +±/+±±+99°-°9°#± 99± °%9±(-±99°±99°±99017467&54>3!5!5!#!"632!"&%654'# 0& )þÎyþl)fGaW+þÙ“—^„„o@@€Œ",>-"2 Opp¹  7)?, ÿôĈ°/°3± é² +³@ +°2² +³@ +° /° 3± é°/°Ö´+°2² +³@ +°±+°2´+² +³@ +² +³@ +±+±°9±°901463235!5!##5##5#".N;@ûþÐ~pûp" A6A3ªppýïøøø ÿ÷ÿå¯17°!/´' #+° Ö±,é°,´ +°/±5é²5 +³@ +° /±233± é°8/°/Ö°72´+²/ +³@ +±9+±/°9±°9°!°9°,°$9±'±/99°5²99901"#"&547&'#5!##".#"&5463232654&'327N!›4gC&:¸pWcxd +2*<"'*5*S?UÈW,Q,M* "+UppJB7URl'#)#&6-&9Ä%1VÿøÿóÀ(¨²+´+°° Ö´ +° /± é°&/±é° /±#33±! é°)/°Ö´+² +³@ +°±+´$+°2²$ +³@$# +±*+±±99°´ $9°$² 999± °9±& °9°°901;53!#327#".'.547&'#5!#!"âA"yþÏpûc%YP/4B=(vp oÈþ¡.1HÔ!kTR!H1X32"&'>7675!5!##"ƒ$I8%(^¾Ût.J­þËz-„œ\7‡_&&#%[}LDq,Lpp²@\-7ÿòÿóÚ $}²"+± é°/°3± é°%/° Ö´+²  +³@  +°±+´+°± +´+² +³@ +±&+±°9°±"99° °9±² 99901"326544>75!5!!#"&­¢k@1KhXþ1_?þÎèþ¹@`2¬€¬aL=AF0:7*@51 EppE 24@*h€ÿûÿû¹+4‘²)+±/é°3/±é° /±é³ +´ ++°/°3± é°5/°Ö´,+°,±+°2´$+²$ +³@$ +±6+±,°9°µ ")1$9±3/°9°²$999± ±"990174632654&#"#"54632327!5!##"&7327&#"#_MkbPscF1NoCþ$¾c 5(s GŠ^avmM 5?JY<“:F` .6C *Wpp-=k,OJ,T@8ÿõÿêÊ$-¾²+±%é°)/±é°/°!3± é² +³@ +° /° 3± é°./°!Ö´+°2²! +³@! +°±+´+² +³@ +² +³@ +°° Ö´'+°'/´+±/+±!± 99°´%),$9±)%°9°±99±°9014632!5!5!#!632#"'&'#"&254#"^28þÕ€þŽMcHX !G3 u1#«79 +k3G)rppâ!7+VG;,/˜@m#ÿ '!ÿ÷ÿûè/X²+±,é², +³, +°$/´+³$+±é°/°3± é°0/±1+±$,± 99±±99°°901%2#".'>325&'#5!!&'#.#"32>_·E$Sud"?Z3=?Å1®ñþnMÌB:k"+,+4O`—  ] #U=5K-$)J7!5!##".563232654.#"#"54 Š2# þÉeNhwa8~\= $Ä=>2$<< Wb›1(qquD;dWj$0- !B+*+ GBÿøÄ‚ˆ²+°/± é°/± é° /±33± é°/°Ö´+² +³@ +°±+±22´+² +³@ +± +±²999°±99±°9°°9± °901!#5#"'654'#5!#!353275JpVX}v8qÌzþûþð:JC_j'ˆ–l2qq0"gØ ?<1VÿöÿûÊ&™² +±$é²$ +³$ +°!/°3± é²! +³@ +°/°3± é°'/°Ö´!+°2²! +³@ +°!±+´ +²  +³@  +² +³@ +±(+±!°9°± $99° °9±!°901%2#".'#"5463235!5!#!326L YEg:$ Ab1:ýþÔyþ’H`9y‘ $R#4ND*82P.”ppþý[Q/ÿó«s²+°/±é° /±33± é°/° Ö´+²  +³@ +°±+°2´+² +³@ +±+± °9°±99±°9° °901!#5#"&'654'#5!#!3270pRWC„,8e¸{þ˜,D@>^„'O>[!pp "AŠ=0ÿöÿì¯+€²%+°3°/°3± é°,/°Ö´ +² +³@ % +² +³@ +° ±+´ +° ±+´ +²  +³@  +² +³@ +±-+± °9±%°90174675!5!!5>54.#".!yhþô¹þÂk{?()!)=4Jb!%!9 ËM‡\pp\‡N)B()j-#%8 U0#.j+7ÿ÷¹z²+°/±é°/° 3± é° 2°/°Ö´+² +³@ +°±+°2´ +²  +³@ +±+±±99°±99±°9°²999012273##5#"&'>54+5Z=UKHŒ\èxpTWOŽP$ .g —$b32>7!5!##".5463232654'#"&%&#"32'@E%[Mþ.¨eP@3RU,qj–N5EcsL\066U9JR)<;#%!pp\V=R54+53233####"$kjëóƒpõ OhC?f6spÍCpýï)-' ÿó² +°/± é° /± é°/±33± é° /°Ö´+² +³@ +°±+´+°± +°2´ +² +³@  +±!+±±99°±99± ±99±±99017654'#5!####"&32=35A`)‚qjSBPžˆ5OG"ÛÑ­M(ppýïD@Vvu#'[„R@™¢ÿøÿô°m²+± é°/± é° /° 3± é°/°Ö´+² +³@ +°±+°2´+² +³@ +±+±°9°°9±°901".54;5!5!#'2=#"â gªÑþ2¸z-×*D\ g”=upppþžU ;”$DYÿùÿðë(+‡²&+°3±% é°2°/±*33± é°,/°Ö´#+²# +³@#& +²# +³@ +°#±+´ +²  +³@  +² +³@ +±-+±#µ *+$9±%³ )$9017467'#5!#5>54.'#'.%7#XU;ò¢:WU’~0C! * \,Z*¡’RfÊÞI{ZppZ|Hfp'&#5 –– 4$vpƒô£ÿÎÿð;'*4´²%+±+33±$ é°2²%+´1 +°/±)33± é°5/°Ö´"+²" +³@"% +²" +³@ +³3"+±. é°./±3 é°"±+´ +²  +³@  +² +³@ +±6+±"µ  )*$9±$%±.299±1· "($9017467'#5!#5>54.'#'.%7#"&5462gWU;ßB¡.-ÞJzZppZ{Ifp'%$4 ––7/vp‚õ£ýß- !,,B,ÿ÷ÿø§'—²+±é°/±é°/±é°/° 3± é°(/°Ö´+² +³@ +°±+´ +²  +³@ +±)+±°%9°³$$9° ³$9±°9°±#99°±$%99°°9014>;5!5!#!"3!#327#".'.+?3ýþ;°zþ™Epú?0[]2T448.G&8 Hpp² j-[&<2AÿòÔ&´² +° Ö´! +°/± é² +³@ +°/± 33± é°'/°Ö´+² +³@ +°° Ö´ $+°/´ $+°±+±$ é°$± +°2´ +² +³@ +±(+±±99±±99±!°9±°90174654/#5!####"&35"&54>32_ kâpù$@$.³ö#0$" #10iÓ"%(Sppýïÿa+É[G¢ýÿ0#!) 1$#0ÿ÷ϲ +°/± é² +³@ +°/± 33± é°/°Ö´+² +³@ +°° Ö´ $+°/´ $+°± +°2´ +² +³@ +±+±±99±±99± °9±°90174654/#5!####"&35)^ qØzpï$>%.³ëi¾4"&Sppýïÿa+É[G¢ÿôŸo²+± é° /± é°/°3± é° /°Ö´ +² +³@  +° ±+´+² +³@ +² +³@ +±!+± °9± °9014>;#"325!5!##".,!;&JB1vOIþE«€"9:C“i 'p )sF[ppþœ1G%J…ÿ8ÿTÿ¶ÿÔ $°/± é± é° /° Ö´+´+012#"&54›$-"," -"ÿìúLA°/°3± é² +³@ +°/°Ö´+² +³@ +² +³@ +± +017##5!#Èpl`„úppÿô¥r² +° /°3± é°2°/±é² +³@ +°/° Ö°2´ +°2² +³@  +² +³@ +° ±+´+±+± °9°°901.#"3###53>32«$>?'qqowwlgy^ÀN.Lopýïp „upÿI¥r²+° /°3± é°2°/±é² +³@ +°/°Ö´+°±+° 2´+°2² +³@ +² +³@ +±+±°9°°90123###53.#"#46gl‚‚ogg(>?"m^¥„ pýïpbY0Lovýßÿ ÿbÿº °/± é° /±±9901#"'5327žo[\]f\d]¸((r)'ýßþ•ÿbÿÙ 2²+°3° /±é°/±é°/± ± 99±±9901#"'5327#"'5327žm]Z_f\e\l^\]c_d]“''l)(þå((l('ý¸’ÿ`¡° /±é²  +³@  +°/01#"/.'&5432  )*J]v#Jšˆ<¥ )-45‘?ýŒÿjÍ#6²"+°3±é²" +³@" +² +° /°3±é°$/± °90146;2.#"#"54632#"&#"+"ýŒ7( A^J2!Á1 $L@.a±:Ü94Sø '! @_2 „k/ :ýâ£ÿlÐ ° /±é²  +³@  +°!/°Ö01#".'&+"&'&54632;”  \V5  $>108Æ#$  (30#  %4ýšÿ|Ï+B°/´&+²& +³@ +°2°° Ö´)+²) +³@) +°,/±)&°$901#"'67&#"".'&#"#"&547232632„2  /( F`  @.^@K .?&(7 9  3#F<-& Mþ‡þãÿžÿ̰/´ +°/°Ö´ +01.#52bXe>a”þï \;R‚þ‡þãÿžÿ̲+´ +°/°Ö´ +0173"&þ‡Xe>a”@ \;R‚ÿòÿؼ‚+²² +³ +´& +° /± é°/± é°/°3± é°2°,/°!Ö±) é³)!+´+² +³@ +°)± +±22´+² +³@ +±-+±!²&999±)±99° ± 99± ±!)99±&° 9°°9°°90173275##5#"'654+532353#".54>32³7hq§§qýÇ &6&ÿÂÿï< *¦²+´ +²+°3±$é°(/±é°/±33± é°+/°Ö± é³ +´!+² ! +³@  +° ±&+°2´+°±+´+² +³@ +±,+± ±99±&!°9±$± 99±(± !9901"&5463246;5!5!####".73275#"#00#%/0&o\XþrHypažIt8qU1$A@11#%/0$#1N\pppýïþ‘¢So4-^$§ ÿùß' °/´" +°/°3± é² +³@ +°2² +³@ +° /° 3± é°(/°Ö´+°2² +³@ +°±+´% $+°%±+°2´+² +³@ +² +³@ +±)+±°9±°9014632!5!5!##5!#5#".".54>32N;@þæ~pþêp" T$%" %//A6A3ªppýïøøø þÛ * 2#"1ÿøÿðÊ<ˆ²+°$3°/±.é². +³@.* +°6/±<é³<6+±3é°/° 3± é°=/°1Ö´+²1 +³@ +±>+±1² 999±±!99°.±99°6²'1999±3± 999012327!5!##"/#"'#"&5463232654#"#"&5463åR IFþÒkKP+#+ />&9$ |Ge8I\r”A7UC¹ dppBB-Y%A*' *!8-= %#ÿçÿ¾Ù‚&3Ù²+±%é°%³%,+´' +²)+²0+° /´+°/± é° /° 3± é°4/°*Ö±/ é°/° Ö´+°/´+² +³@ +°/±+´+² +³@ +°° Ö´+±5+±*±',99±´ #%$9±%±*/99± ,²#999°°9°±9901".547!5!5!#!">32'4#"32"&4632¡9~kF¬þ ãþ­` =Y@LdlG^P0Tþ>*#%()$!-Mr?OqqÀG &1*M?@O1&%6,88!‚q H° /± é° /± é°/°Ö´+°±+´+±+±² 999± ±99014632"&"32654&!°€}´´ú³0Po .8*Qoo@°´}|³³=qP-H(oPRoÿÉQµ+w°/±) é²) +³@ +°"/± é°,/°Ö´%+°%±+´ +° Ö´+² +³@ +±-+±%³")$9°°9±)°9°"±99014632#"&547#".%4&#"326‘o-PM.5e [=6V1! †;K9W84,iôRo-Y=@•58X+,¢u4I,!/9+$4&, ( .s£/l²!+°'/´- +±é°/± é° Ö°0/°Ö´+² +³ +±1+±°9±'!°9°²*999± -±99±° 901%2>54#"#"54>32#"/&+"&54632 HZ>Ç?ŽCGfO[…D0Z1)}/,HP4J?/&dà&R7’5'0OS-Il= ;$,%)1"*!ÿøp¢@«²+± é³ +´ +²<+°9 Ö±é´1+ +±1 é°A/°#Ö´+²# +³@#. +°#°6 Ö´+²6 +³6> +±B+±6²999±°9± ± 99°+±#99°1³')4$9°<±699±9°>9012#"/.546322654.'&'#"&546323654&#"#"546;ƒ²C!3*m b‹Ž.12'%XY5z ‹V0=O?…~ˆD'ª?¦¢bOD.? %?'$! "0 0&-B!" (2 *1"1ÿúD¢(3¾²+±. é°)/± é°/°3± é°2°4/°Ö´+² +³@ +°°, Ö´+°/´,+°±+´ +² +³@ +°°1 Ö´'+±5+±± 99±1,²999±'±"%99±).±'99°³ "%$9°² 99901"&54>74&'.5473254'5%"32654&œâ‹ $ào¨¥pà0 "EÿM?O=AbO & >%Ÿ/p BggCp/ŸH* $9NPŸ /B!!-" 2j² +°/±é°/± é° 2°/°Ö´+² +³@ +°± +° 2´ +±+±°9° ±99±°9°² 9990123273#5#"&'>54+5L=UKIED^ooXPK˜O;)m;7¦38€ý‹,R4 ¸?p.BKݲ?+±7 é²+´ +²+´+´/)? +±/ é³2)/+±& é´!? +± é²! +³@! +°L/°DÖ°2´5+°$2°5± +´+² +³ +³@ +±M+±5D°G9° ´!&27$9°²)/999±/7±5D99±&2²,GI999±!)±$99°±99°± 99±°9014>32&546;#"&#"#"&#"32632#"&#";2+".54?4.,GG%]MI109:*1*F !1BrR)RH4] ;9XÛ'#,Ý8R* Ê/E#+*:F &%4%3$V&) ",9&!!7:1('< ÿþ‚¢&^² +°/±é² +³ +°'/°#Ö´+°±+´+² +³ +±(+±#° 9°±99± °9012#"547>54&#"#"&54>d~  =-l †23ûÛaE&6 -&Xt¢i3FHF?+!^›f9K( %1R* ›‰f²+± é° /± é² +³@ +°/°Ö´ +°2²  +³@  +² +³@ +±+± ±99± ±99°±99014632!!2#"&'4'. \87Äþ<)Dvš9_'¼ì1+û0^/&p *MW>*#Ô«$  «C«²+± é²+°<3´7 +²5+´17 +°&3±1 é± é²  +³@ . +°D/°#Ö´+°02²# +³@#) +°±4+´+²4 +³@ +³@ +³: +±E+±#°.9±4°29±1±)99°±499°7°:901"3#!32#".=47#"54>323&54632#*./&>'!4$,þž-FrHL:b$bš]>$5$3,8Ñ!XI.U" Å.5 % )NQ=&"6Urn9 8(=0(-0?K$þιÿò§J°/´+°/°Ö´ +² +³ +°± +´ +²  +³ +± ±9901462#"54654&#"#"&þÎP„P9 0%$19)7GF8,D 4!)("-DþǶ¡'°/´ +² +³  +°2°/°Ö±+01".543232>32œ13 5,#0  ,&¶ C0L-6-**Q%9!ÿøÿùã%*l²+±é² +³$ +°/±(é°(± é°/±&33± é°+/°)Ö´+°2²) +³@ +±,+±)°"9±± 99±(° 901%#".'67&'#5!#&#"32>32375d'J/ $‰I"9 þo-kŒ -4%(P5^G5sppæ&#Cfxuÿ÷ÿû™$1«² +±*é°//°%3± é°/±33± é±22°/±é°2/°Ö°2´+°2² +³@ +°±,+´ +° Ö´+² +³@ +±3+±°9°,´  %$9°±$99± ±99±/*° 9° °901&#"#".5#53>323! 7673254&#"H·¾þ)e]u_W„N0KL ¨Ž‹£Mý¬Mþ” 1N2hG+)‘««puBH^Sf>cVp—“…pGB8@ñ%6= E)OÿÏÒ=\fmzt²+±yé²[+°q/°t3±ié°H Ö±b é²Hb +³@H> +°/±5g33± é°32³]+±Mé°"/±é°1 Ö±é²1 +³1 +°*2°{/°KÖ´_+°_±e+´O+°O°R Ö´D+°D/´R+°O±+° 2´g+°32²g +³@ +°g±n+´;+²;n +³@;5 +°;°( Ö´.+°./´(+±|+±D_³HM]b$9°e°F9±O²>V[999±ng³it$9°.±m999°;±*99°(±%699±y±VW99°q²DR;999±iH²9FQ999±b³KO_e$9±1M²(/%999°"°901".5#53>32>3#".'&+"#".'&#!#".547#"&5432"3265427674&#"#32F9\T7!%"*=kDpP&‚AE|P/((EeB^3 Œ•#ö/P[tþ( $/&F3RcÉã þöp*0&K6ã;E-i):&gIu»|o@ZB0M8A6QY%8"HS@% $ 6j¿ojA99$iQÄÎDG.!&  *N 3.%NB=K7?þŸ(P)5;þàþíÿè/²+°/´+°/°Ö´ +±° 9°° 901"5332>7ˆ˜X%-þíûPV @ <Ð$^²+±é²+°%/°Ö± é³ +±é° ±+±é±&+±°9± ± 99°²!999±²99901#"&54733254.5473zxi ‚ 56m/99/‚/:9/{ši&'$$8Q¡3N/'#)A+( $:(&-9[<IÐ"‹²+±!é²+´ +° ±é´  +± é°2°#/°Ö±é°° Ö´+°/´+°± +´+°±+±é±$+± ²!999±!±99° ° 901%#".54675#"&=334&#"32Io6]N.ˆg~)xÆLZ‚I87QM:‚Ýlq/U8bjŽ*U:ò mY7:758:<\ä%1²+±/é²+±é´ ) +± é°2/°Ö±,é°,° Ö´+°/´+°,± +´ +°2° ±&+±é±3+± ³)/$9° °9±&°#9±)/±99° ± #99°³ $901%#".54>?4#"#&546324&#"326\˜qGzV-Q^96"$xmPSa+*‚O>9VQ?=Oçny*eI;Z5[b(" N\XR<(%C<>GD8=B<< ä'2}²+°"3±é°+2°/±0é°3/°Ö±é°±+±.é°.±(+±%é±4+±±99°±99°.° 9°(³"$9°%°9±0µ%(-$9°° 901"&54&#"#&!"5&54632632'4&#"3261d! M Rrx~)' –þæŒERdqdM/EfZyw .,.3.-,4Bƒt!%J)6972/K›v Re~9:vYbqÍ.C=^?<<#ä!p²+±é²+±é°"/°Ö´+°° Ö±é°/± é°±+´+±#+±°9± ° 9°²999±³$901%#"&54733254&#"#&54632#zjp“‹B7t54.?z‰]ààjv~n(%&8J‡5C8-[iþù<&ä*¢²+±é²$+±é²$ +³@ +´$ +±é°+/°!Ö´+°° Ö±é°/± é°±+°2±é°'2² +³@ +±,+±!°9±³ $$9°°)9±²999°°)9°±!'9901%#"&54732654򂂮&#"#&54632&}mpŒAr33:$*=.;7xƒf\“bbòn„{n)!&:KR<:/d5%.9J= er^Wj,"<ÿä)4¶²+±3é²+±!é´- +±-é´'  +´'+°5/°Ö´$+°$±+±0é°0° Ö´+°/´+°0±++±é±6+±$³ !'$9°° 9°0°9±+³-3$9±-3±99°°9°'± 99°!±9901%#"&54>7#"&546326324&#"3264&#"32ÿŽeg‘ .7C[yPJu#EaXqþM'!3* ",1@0/H@20ÐbnsdC$XUBM\YH"€+-z#" ##þƒ`=<.1@PPä-x²+±*é² +°3±$é°2°./°Ö±'é°'±+´+°±+±é±/+±'± 99°° 9°±99°°9±*±99°$°9° ° 901%#"&54632632#6=4&#"54'&#"32765…kmˆ‹jdGKæ`†…lj‡AAw`À‡²£–Ô+41$þÐî313—îBU41<Cä!?²+± é°"/°Ö±é°±+±é±#+±°9°²999°°901#654.#"#&547>32CQxG//GxQ ‰hN}Š©ÍÈ¡ )F-///E)©ÀÓ£>*jˆQG><&ä#}²+±é²+±é´ +±é°$/°Ö± é° ±+°2±é° 2² +³@ +±%+± °9°³ $9°°"9±²999°°"9°° 901%#"&547332654&+532654#52&il”ŒB893&*#(JYs_bòjˆj)!&9LR<-µ²4+±8<33±é±22²4 +³@ +° 2°-/±. é°?/°1ֱ鰱+´+°± +´ +° ±+±é±@+±1±-/99°°49°°69° °89° ± :99°²%<999°²#$999±.-° 9°³1$9°4±6:9901#654#"#54&"#54#"#.+53&54632632632{ ƒ!Bx4x13 [ivm[<–$>=W7(ÿUgZWI,+LK&1\JZ1CJD;]#yy"#ypFo5G!#,/\B#6qP¢Z|????h<ä&„²+±%é²+±é´!  +±!é°'/°Ö±#é°#° Ö´+°/´+°#± +°2±é±(+±#°9± µ !%$9±!%°9° ° 9°±9901%#"&5463254&#"#&546324&"32„j_…€`1?1,02}…Zcw‚8Z<<-,Ûiro^_t%—-A=0/Wbtcþ–Z??Z?P$Ð(w²+±&é² +°3±é° Ö± é´! +±é°)/°Ö±é°#2°±+±é±*+±³ $9°² 999±!&°9°°9±°901%#"&54632327#"&#"6324&#"326$…_bŽSPw7&%3"w>MVq‚=,-:9.-<Í]pq`\OTx%!¡%|T,@>\>>Póä&o²+°#3±é° 2² +³@ +°'/°Ö±é°±+± é° ±+±é±(+±°9°±99° °!9°±#99°°9±°!901#654&#"#54&#"#&54632632ó5x+%&!"ƒ"!&%+x5l_N9:V\efng8(73"¼¼"38'þÈepeŽ`w77z]<&Ð1“²+±é²#+´# +± é°2/°Ö± é³! +´%+° ±+°2±é°-2² +³@ +±3+±!°9±% ° 9°²999°±*/99±² 999°² /999°#°-901%#"&547332654&+5232654&'&5472&‚hm“ŒA92:,$#$0˜x 9?=(^-2Òfl~k)!&:K>2%2x 'm ;,_HÐ/¡²+±é².+´$. +´$ +°0/°Ö± é° Ö´! +° ±'+´ +°±+´+±1+±°9°!°9° °9°'´ $)*$9°³,$9±°.9±±99±.$³$901%#"&54733265#"&547332654'53273zjp“ŠB7<8-0^:>di##gHTàjv~n)")8JI>j,76=:"*,VB<èÐ6²&+°/°3±0é°42°7/°Ö±é°.2°±+´ +° ±+±é±8+±°9°²,0999° ±#299°²&4999°±'99±0±.299°&±#,9901%#654&#"#4654&#"#&54>7673632632èC‚C#%*x 0)+>‚>+>\HX1x3Nd]W($9±/±+99±?³ $9°;±99°6´ +$9°1±)#9901#".547332654'#"&547.54632$4&#"324&"2û\’^K}m>>‚>|e_{f%W<>YS&,]=:f6f‚þê """."".`‚9>rOjgXgcf[]”(,B;DH32632›€pŒUABI.x5#8:x-4$ /J>U ŽŽo9!%5AXWC!'!I:$ )*.M=<ä;D¯²/+±é²+°#3±?é°2´D/ +±Dé° 2°D± é°E/°Ö±Bé°B±4+±9é°9±+°2±,é°&2², +³@ +±F+±94µ6?CD$9°·!#/7<=$9°,°)9± ²,46999±D°)9°?²&999°°!901%2>54&+532654&#"#"&54632632#".54734&#"2õ/B $)/0$**$%'81*-]~VcG=eKl2/5* 5_Z5‚cK3#$23Fd/,,:x:%$,(?DDcZSdGGdJ5QO?}v*R9('";7£F33F3<#Ð"ƒ²+±é²!+´! +´+² +³@ +°#/°Ö± é³ +±é° ± +°2´"+±$+±°9± ± 99° ²999±²999°° 901%#"&54733276=4&#"#&546253#zjp“‹B7I5 %+b6xàjv~n(%&8J.,-¼#1&GT6Ã< ä6²(+°,3± é°2°!/±"é°"±é°7/°%ֱ鰱+´+°±4+±/é±8+±%±!#99°± (99°±*99°4²,2999°/±199±"°9° ´%/1$9°(°*901"#4654.#"#&!#"53&54632632#654&2 #%x &!0(¯V-F.4 –þåtHJ_z`Q@@gTj1‡6-€ ) f* #1(K4Ò -/<›i[£_v@@zUPSdB,<<#Ð#²+±é²+°"3´ +´+°$/°Ö±é° Ö± é°±+°!2´+±%+±°9° °9°° 9°³$9±±99°°9°°901%#"&5473326=#"&547326=3#|ko‘‰A8<83OTc!…$+X4xàkum% %&8JI>×)bT?B6B-<<,y2Iä&.’²+±.é²+°#3±é°2´*  +±*é°//°Ö±,é°,±+´+°± +°'2±&é±0+±,±99±´ !*-$9° ²#).999±*.°9° ° 9°±99°±!9901%#".5463254#"#4654#"56326324&"2IŽuArPœgE<89x5<=6BD)8TRT‚LjLLjÒ^t*`Ccp"¶LU ! PLˆ(22uVþ„f99f9P&ä#0}²+±'é°/±!é²! +³@ +°2°/´, +°1/° Ö´ +±*22° ±+±é°$ Ö±é±2+±$ ´!$9±°9±!°9±',°901%#654&#"#4>32#"'6324&#"32>&@…C:6'ExTh3!<;$/NJ(%]5! >?08d<Ð U²+±é² +´  +± é°/°Ö±é°± +°2´+±+± ± 99±°9° ° 901%#"&5463234&#"32†`]‡‰\58xx;,-<<-,Ñ`qq\[x%UýÔX@?Z?Pgä%-’²+±-é²+°#3± é°2´) +±)é°./°Ö±é°*2°± +´+°±'+±é±/+± ²),999°´!(-$9±'±#99±)-°9°°9° ±99°±!%9901&#"#4654#"632#"&546326324&"2g=<5x98:Gj™›hj™TRV1*HB6“LjLLj4LP ! UL¶"mfcjlfGVu00(ýáf99f9<„Ð%0«²+±é²+´/ +´/ +´) +´ +°1/°Ö± é³ +´,+° ±+±&22´+±"22±2+±°9±, ° 9°³$9±²$999°/²#%999°)²!"999°±99°° 901%#"&5473326=#"&54632537/5&#"32#€dp“‹B7<83N=VTDA;xaaaax4.%-1Í\q~n(%&8JI>—(Eé³'>C+±"é°"/±'é°>±-+±é°± +´+°Q Ö±é±[+±C"°$9±>'µ*034A$9°-°@9°³5;F$9° · JSUV$9°Q°M9°°9±*°"9°S@ $'-5>ACJ$9°;°90132654'7#"&/#"&547332654&#"'?'.#"&546327>54#"732XkÌCjpA,A Bx*4Ml8>\t#3á* $"n6‘O7?.§ %R}9GxU1_Ê "9&%Ak+(Ú7 8*:X);;!:# Yh .&@*>Nx26…M ^$<%ÐD·²+±é²=+´ '= +´  +´2+= +´2 +°E/°Ö±é³;+´>+°±)+°42±é°2° Ö± é±F+±;°9±>°9°·#'+.27$9± )²C999± ² 999°'²999°+°9°2°9°=°901#"&547332654&#"#523254#"#523254.'&5473%& B$8-HL$c“ ‚ <7&>%# JH % F5GX$x_O?"5 E 2 "E(>"oa6:"&P.,P/-& /±Ì O²+´+°!/°Ö´ +³ +´+° ±+´+±"+± ²999°°901%#"&547332654.5473±vXSrn2%)7):9)n+3+±U\\Q%..(#1 #@-!2#">æÐ$”²+´"+²+± é° ´+´  +´ +°%/°Ö´+°± +´+²  +³@  +°±+´+±&+± °9°²"999°°9±"±99° ±9901%#"&54675#"&=3;4&#"326æƒf`jZi$n~ –n<:;;B46@Ïdkq^Zw£$HÈ&¯;GF<4?>þü¤(4а /´2+°/´"+°5/° Ö´/+°/° Ö´+°/´+°/±+´ +°±)+´+±6+±´ ",2$9°°&9±)°9±2µ (,$901%#"&54>=4&#"#&546324&'326)(”dfš(&#KS71'þí9T R>8>Bþü¤¤08¬²+´7+°#/±$é°$´!+° /°33´*+°.2°9/°'Ö´ +° ±+´5+°5±1+´+±:+± '±#$99°³ !%*$9°5³,$9°1².999°°9±$!±99± 7³ '$9°*°,901%#"&547&#"#.#"53&546326324#"32¤b\Xv 0-'"60 3=S2+ ‚&;8M/"8DWqhYJ/9[TdnZVVZß_€oX1#/L2;Y5# )D-- dY£Zz::pf||tþü­¤ i°/´+°/´+°!/°Ö´ +° Ö´+° ±+´+±"+± ±99±´ $9±³$901#"&54733254#"#&54632­c_Xun0+XQ)( n qW¶>_g\U704/*1e,c=+ Va½þü¾¤2ް"/´-+°/´+° /´+°3/°Ö´+°% Ö´*+°±+°2´+°2±4+±*°'9±¶ "(-$9°°9±-²%'999°°9° ²99901%4+532654&#"#&54632#"&547332>OM#%5"*3n|QLw0*4%eg\wn01' HZ7%!&*)NWMI.GS@i{g[0&$*2>6%Qä$0»²+´.+²+´+´( +´+´#  +´# +°1/° Ö´ +° ±+´++³++°3´+°+±%+´+±2+± ° 9°²#999±+°9°%³(.$9±(.±99°°9±# °9°± 9901%#"&547#"&54632632$4&#"324&#"326Qe`]qK1;:EnICbD2JMRþ»  !"ø)1/.0./*ábr]X©"Z;HYNAE˜,sñ>*0!%þÚ4FL2/CE©¤"‡² +´!+°/°3´+°2°#/°Ö´+°±+´ +° ±+´+±$+±± 99° °9°±99°°9±! ±99°³ $9°°901%#654#"#"&546326324#"32©7n7EHd_\qj^U@5LR[þ—X..,1Wîokiditaup\_y;;cluE04GФF°/´+°/°Ö´ +° ±+´+±+± ° 9°² 999°°901%#654&"#&54632Ð0n08f81n1ud^{Ód[gX4CC4`_`Mdsþü¾¤)z°/´$+°/´+° /´ +°*/°Ö´"+°"±+°2´+°2±++±"°9°´  $9°°9±$²999°°9° °901%4+52654.#52#"&547332>5OM6+ "87&ZYch_una *HZ%7 Z 7%b%"…kye]0&$*p+)þü`¤Fϰ/´+°3/°3´ +°2²3 +³@3$ +°-2°3°( Ö´+°G/°Ö´9+°9±1+´* +°*±%+´  +° ±+´+±H+±9±99°1° 9°*° 9°%²?@999° °9°²999°±F99±±?@99°3´*9$9± (± 9901&'&%53&54632632632#654&#"#54&#"#4654#"…þãEe_WA00QI42JGZ%n%#'Cd!!DdG-KE23?\I5þüWZM Z}.::.bHAQF=)6i $\",k +) b&àfzw_[t ™l61h{aZþ¢5KJ62??Öä&†²+´$+²+°3´ +²+± é´ +´+°'/°Ö´!+°2°!±+´+±(+±!³ $9°²999±$°9°°9± °9014327#"&#"632#"&54&#"326°£*7!)q.&8@[w}derJ=537>21;'½ n .0£ t[cs{f6JK52??ª¤&n°/°3´ +°$2°'/°Ö´+°±+´ +°±+´+±(+±°9°± 99°°"9°±$99°°9± °"901%#654&#"#54.#"#&54632632ª3m2&)%d%)&2m3^UX;;XU^ÝFƒ|Q+>)&((&)>+Q|ƒFVq;;qÏÐ.޲+´+² +´ +±é°//°Ö´ +³ +´#+° ±+°2´+°)2±0+±°9±# µ $9°°&9°°,9±²999°°,9° °)901%#"&547332654퀆.5473Ï}_V n 412>:G#^.BB.n-AA-8118½\a]T-"2=,0D(c< +5&" ( =,2D KþüÙ¤,ð/´+°/´" +°'/´( +°-/°Ö´ +³ +´ +°/´ +° ±%+´ +²% +³@%( +°±+´+±.+±°9°°9° ²"999°%± 99°²999±°+9±±99±'"³$9°(±9901#"&5473325"&547332654'53273Ùg_Rwn,,[(:(b|SZ!$((z_gWNA24%.7ez 186A=!!/ L=ªÐ9–²+° /°3´++°/2² + +³@  +°:/°Ö´+°±+´ +°±7+´2+±;+±°9°³'(+$9°²&-999°7³%/5$9°2±499±+ ²()-999°±'9901"#54.#"#&54>53632632#654&í'2d !)&2m37WjkW7t&!>$#0ŒH&%G+:\R^3m2&J7-@+$>+Q|ƒFS‚O<'#-4' ,>;;sTFƒ|Q+>Ùäy² +°/´ +°/°Ö´ +² +³@ +° ±+´+³+´+°/´+±+± ± 99°°9±°9± ²99901%#"&54'332654.5473ÙRizuq-: n**ÅP`jg¹(þ‹3,,(2Hþü¨Y-7B˰/´+°/´A +°;/´6 +°1/´& +°C/° Ö´+°±+°#2´> +°32°>±8+°.2´ +°)2°±+´+±D+± ° 9°° 9°>°!9°8³&$9°±+99±° 9°A²999°;²999°6´ ! ,+$9°1±#)9901%#"&5473327654'#"&547&546324&"264&#"26¨+BXQ*ŠÀ2n2pi„)(XP@>VDCS>AQ2lxø+B*'H()#!+*D*VO}K1§ˆ‘xs{l„YVY—"!AYQ=Q0+H>YVB<)‘!,,!%33È#,.!"11þü€¤8À°/´+°!/±+é²!+ +³@! +°/°3´0+±&522°9/°$Ö´)+°)±+´ +° ±+´ +°±+´+±:+±)$±!&99± ´'+.$9°² 0999°²3999°°59±!±99°+°9°°$9°0²).399901#"&547332654#"#54#"#"&547332>32632€‰uh›f4?!BO/5d %&E)/<"n"!)1+ (S9Gsvcb)*'5".MB)+° Ö±é° /°93´0+°,2°@/°)Ö´<+°<±+´ +° ±+°2´+°32±A+± µ &,9:>$9°· $.078$9°°59± ²999±>°59°°$9° ´#)37<$9°0°.901#".547332654.+532>54#"#"&54632632$4&"32¥m1UQ/f •FK !& >$"iXTtzSTA1XFVaaþ›1R12():hb&J4& '`5C("c"V):XglSRkFF`Gw')‡R;;R;þü­Ð!w² +°/´ +°/´+°"/°Ö´ +° Ö´+° ±+°2´+±#+± ±99±´ $9± ³$9°°901#"&54733254&#"#&546323­ÇRvn3.R<$) n WHD3n9ËVOA24%/6e"#/">GT0wþü•¤6ª°)/±*é°*´'+°/°3´4+°02²4 +³@ +°7/°-Ö´+°±+´ +°±+´+±8+±-±)*99°²'+0999°°29°³ 4$9°±99±')°$9°*°9°³-$9°4°2901%#654&#"#54&#"#.#"53&54632632•l!%$c,S8ETOU+ ‚ $73I-#=MWr^^K55[N]ì?HF6)>'%+82=~Ic3$)N- dNbƒ;9gþü³¤$}°/´+°/´ +² +³@# +°2°%/°Ö´+° Ö´ +°±+°"2´+±&+± ± 99±´ $9±± 99°°901#"&547332=#"&5473326=3³&'~Qyn4/V4COY-n-3- 1n>F?AXO?24%/6eÊ%aPLGII-4( «Îä(4²+´2+²!+°%3´+°2´ ,! +´ +°5/°Ö´/+°/±+´+°±)+° 2´+±6+±/±!99±´ #,2$9°)°%9±,2°9° ° 9°±99°!±#9901%#"&5463254.#"#4654#"56326324&#"326Îuba€w[@8 4j3-4/8A&+RF=n734>;12>Öauu`[u µZ! O6l$;;`Jþ‘5KK52??Âä#z²+´+°/´+°/´" +°$/° Ö´ +±"22° ±+´+° Ö´+±%+± ³$9±°9±°9±"°901%#654&#"#46326324&#"6Â7n731+9nv[Fcþô8SRY˜#33žÞZpca2A>+ÎY^@BZ/r,E4þ÷r¤2‹° /´+°/´+°3/° Ö´+°±&+´++°+±+°!2´+°2² +³@ +±4+± °9°&°9°+² $999±±099±°9°² 99901%#"&5467332654&+53254.5473r9)_VwB–¬83nk('~Ec78-RM8B8n&43#È'9~Da(µ—[»K”ÑLPR=A9"^/+9( 3ÖÐ `²+´+² +´ +´+°/°Ö´+°± +° 2´+±+± ²999±°9°° 901%"&5463234&#"326ÖuÄv\@8nn915=;15;Öauta[u Kþ2DJ62?Fìä&2²+´0+² +°$3´ +°2´* +´+°3/°Ö´-+°2°-± +´+°±'+´+±4+± -° 9°´"*0$9±'±$99±*0°9°°9° ±99° ±"&9901&#"#4654#"632#"&546326324&#"326ì4-3j48@[w€abu=FR+&A8/„=537>21;T6O !Z,$µ u[`uuadJ`;;$þ 6JK52??þü Ð%1¢²+°/´+°/´/+°)/´+°2/°Ö°2´ +´, +° ±+±&22´+±#22±3+±,° 9± µ )/$9±² 999°/³%$9°)±$#99°³ "$9°°!901%'#"&547332=#"&463237'.#"326 _g`Sun4-RC%D]XCM6n___ÍB#-0!@‘í`fUPA21(.7eý )Y†XGqþQ bo%&")ÖÐT²+´+²+°/°Ö´+°2°±+´+±+±² 999°° 9±±9901%#"&53734&#"326Ö`avnwr_Vjn=537=31;Õ_vv`úþµ„dt`6JH43B?þü®¢Qö²+´B+°2³B+´ +°5/´6+° Ö´,+°R/°)Ö´"+°"±+´ +° ±E+´ +°°: Ö´2+°2/´:+²2: +³@25 +±S+±")³'$9°µ &,$9° ±99°2³/=@$9°E²BK999°:±LN99°°O9± °9±B° 9°5@ "')/=L$9°°:901#"/#"'532654&"57'&#"&546327654+53232654.'7®M9Z)Zo+0]@RHN&2 ´N[)b?S'G…7;.¿K  P H9NS¶E A->Am!Xs $3:9=MO‘Z Z&39z 2 0$ àÐ9¿²+´+²++´+ +´+´!+ +´!+°:/°Ö´ +° ±#+´2+°62²#2 +³@# +°2°#° Ö´+±;+± ³ )*+$9°#· &,/$9±2±4899±² 999°² 8999°°69°!°49°+°2901%#"&547332654+52324#"#53254.'.'53à*GL*`{ p t0BO9% NP #R-;[$;n7IH2;??DŸ-A"g^#s&-?ZTZ  3"$ 1-<H="ÅÕDKÙ²$+°3±Jé²@+°/±+é°L/°!Ö´E+°(2°E±H+´& +°&±.+´+². +³@.3 +°.°: Ö´+°° Ö´+°/´+² +³ +°>2±M+±E!°9°H°$9±.&´+8=C$9±:±99±@+@ !(CE$9°J²&H999°$± 99014.5432# 57>3232654.54323254.43232>54#"P1;1 #9L*16 4kJþ³NNjSm¿u€T:5?5% Q#3<3=þm(5<%8%! !O4#!A=!&%22/$d!‡·„“e~q'.!/:%5D8*K('ÿü¤Š|² +°3± é°2°/±é° /°Ö´+² +³@ +°±+´+² +³@ +±!+±° 9°²999°±99± °9°²99901%23"'#527&54>2'4"6A+!pSUnDO#9;<::#nŽGGbc++c+\,B!!A-`YBB:&&þîÁ‚#f°/±é°/± é°$/° Ö´+°±+´+±%+± ² 999°´#$9°±!"99±´ #$9° °"901%2#"&54>73254#"'7#5!2(< riZn!3 5-dZ2wÞk…ˆ%=?!ioaP#0/-2{p0·c2ÈþîØÔ<̲:+± é² : +³  +°/±(é°-/´. +°=/°7Ö´+³&7+´! +°!/´& +°±++°12´+° Ö°+° Ö´ +°+´+±>+±&7°#9°±$599°· (-.4:$9±+ ±399°±99±-(²!#999°.°9° ±79901#"54654&#"#".54732654'53254/.54632«$ "#Rz>WPf%C?%K-l6C‡‰7lK]PEXT "("""* F/H/Jl52lVi!A-^3% +R4-nJb!$JbKOYFõÞ'0:в+±/é°/±7é°1/°3± é°2°#/° 3±+é° 2°;/°Ö°2´4+°(2°4±9+±!,22´+± 22²9 +³@ +° 2±<+±94±99±17±99±/+±99014>323#3##".54>;5#".7;54#""32=(O7¸````¸7O()S;GG75#53#"&5332654&#"¡,,ýu¨uuT^74ú0‚ª_Öa–4yj'JK¹'..'&..&_ss_^s9ScOO_¹…i…‚†1>\†--9'ÿéîå %|²$+± é²+± é²+´ +´!$ +´ +°&/° Ö± é°±+±é² +³@ +±'+±³!$$9±!± 99°°9°² 99901"32654&63232544+#"†[nn[ZomþEÁƒ´@U-2C^,of5 ¼–Ÿe‹æ‹ŠpvŒþZPÖ”9–(B?#dm”¿<ÒÙ0²+²+±é²+°/°Ö°2± é°2± é± +01#7#5Ò–––ýä½}}.ÿçVç.—²++±é²+±é´ + +°#3´  +°!2³++°//°Ö± é² +³@ +°±+±& é°"2±0+±± 99°µ !+$9°&²$999± ²&.999± ° 9°²99901732654.'#53&54!2.#"3##"&'£1k54&'7#".54632%654&#"õA|$NG.]C54#"#4632ÿ––Fh~.<¢˜v€’µ~I RA—40Z‡Œˆ„Žÿíÿèøð1=²+°#3±é°/2°/´= +°7/±é°>/° Ö´+°±&+´-+°-±+°22± é±?+°6º>Øóâ+ °°À±ù°;À³;+º>Þô+ ³;+°³+°³<;+³=;+² Š Š#9²;9°<9¶;<.......@ =;<.........°@± ° 9°&± 99°-²(7999°±#)99±´ &(-$9°=°901!#"&547332>32#"&547332674.#"`þú $/H->Id%&8jH|,JU/=Jm!, 7($ &7QY8%T0#**Hr‹‹rHʲhŸY,J9#**k¦6SL((K;2<õÙ6²+²+´ +±é°/°Ö± é°2² +³@ +± +01!!#Ò#þÝ–ÙþÜ}þÈÙ<RÙ,²+²+± é°/°Ö± é² +³@ +±+01!#!Rþ|’Sý­Ùÿèœæ'2¢² +° 3± é°%2²+±. é´  +´ +°2°3/°Ö±é°±+±1 é°1±*+±! é±4+±°9°°9°1³ $9°*° 9°!³ #%$9± ° 9°´#($9°°9°.´!*1$901%53##"'#"&547327&5462327654."¡û/8kE_YYhn{dM -+(.s²n*&cþÓD ÏOO!GM211XTbNZ)!-{¨§¯¯§®xtRˆXjjXˆÙ u²+±33²+² 333° /±+°6º>¥òæ+ °.°À±ù°ÀºÁlò•+ °.±°À± ù° À² ...¶ .......°@01!# #333Ó‡zw‡ÎŸqq”vmŸ9ýÇÙýÞ"ýÝ#ÿçXç!.q²+±(é²+± é³+°//°Ö±% é°%±+± é° ±++± é±0+± ³ "($9±+³ $9±(´ "$9° ± 99014632#4&#"#".5467&32654.Çq\Rr–'88'‚s5@5.c^c@:E(+=@@gp[&(!8;D\2]Œ&5R3aŠ+— LB5I58!B&9@òL²+° /±é°/±é°/°Ö± é°±+± é² +³@ +±+±°9±° 9013#4632#52654&#"Ï– e(VQ3‹‡K1<10>#Zu6_;T„}3,'DK)(ÿéºå+š² +±$é²+± é² +³@ +´)  +±)é²) +³@)+ +²) +³@ +°,/°Ö± é°±++´* +°2°*±'+±é±-+±*+³ $$9°'°9°±99±)$°9°²999013#".54>32#&#"32654'#pO}~EXLxK2/V…O¥ €Wq *G/`MoOÎCjL-MD()Eaf;JpEŠyƒ¤i(AA,51>=<Ù Š²+² 333²+±33° /°Ö± é°2°± +° 2± é±+°6ºÁ£ñž+ ° .°À±ù°Àº>ò5+ ° .° À±ù±°À² ...´ .....°@01#33##Ò–à„€â––8ýÈÙý¼Dý'8ýÈ-ûð!^²+° /± é³ +± é°/± é² +³@ +°"/°Ö± é°±+°2± é² +³@ +±#+±±99012#5#"&+532;4&#"#54>pz–_SFŒ%%*'+&–*FKðofýå–Qq),-2FH?[/ ÿç¹Ù/9¬²!+±5é²+´ +°2´! +± é´ ! +´ ++² +³@ +°:/°$Ö±2 é°2±8+± é°±+´+±;+±2$°&9°8´!+/$9°²999°´ $9±5µ$&()0$9°³+-$90153#32>32#4#"#"'#"&547'6326732654`ï6.?E0G$w2,(@!G(7D‰[UvDJ-HWËF 5C*$˜AAg33'?B#>#1({FixnieKEN|Ohþ´L<+555K(ÿôð$X² +²+± é² +³ +± é°%/°Ö±" é°"± +°2± é±&+± "²999±´ $901233###"&546264&#"}@kF4––3DwIœº¾—ZeeZYfdð%>GP:7ý'%>^F3ܧŸÚý„ŠèЉqxŠ<‰Ù ?²+° 3²+°3´ +±é° /°Ö± é°2°± +°2± é± +01!#3!3#óþß–– —–KþµÙþïý'ÿç2Ùk²+± é²  +³@  +²+´ +°2°/°Ö± é² +³@ +² +³@ +°± +± é± +±² 999± °901%#"&'332654&#"'675#53#2¦oc™91A@?@Ma_4ú0Vxýzœq\ 0UDF[<\8zOOy‹ÿçÙc²+± é² +°3´ +´ +°2°/°Ö± é² +³@ +² +³@ +±+±° 9±° 9± °901753#32?33#"&=ú4$!ý£¬¬®þÁ@me{âOOA8:÷þ§Yý‹}f_6'ÿéåå b² +± é²+± é´  +´ +°/°Ö± é°2°±+° 2± é±+±± 99±°9°°9°°9016632#".#"!26'ÁžÂ¿ Ÿf iSRk þq k¦l¿PÖÕ®¢×§crsbOcuv%ÿ~,Ùz²+±é² +³@ +²+² +°3± é°2°/´ +°/° Ö° 2± é°2² +³@ +²  +³@ +°±+°2± é² +³@ +±+01%3!535.=#53533#3––þ¨Â”@@–ƒƒGTëþ“P"iuÝs¹¹s¢\B'ÿëÄç {²+²+± é²+± é² +³@ +´ +±é°!/°Ö± é°±+´ +° 2² +³@ +±"+±³$9±°9±±9901&#"32>7#5!#'#"&546327(†_mu[%4,"¦$Z*hJ”ÁÄ„ªòu†vp"='}þv`=8ئªÔ„qÿðÿé$æ(²+°3²+±é²+±$é°)/° Ö´ +±*+°6º?.õÈ+ °°À±ù°'ÀºÂïÉ+ °.° À±ù°Àº? ôð+ °³'+ºÂð+ °³+³+° ³ +²' Š Š#9² Š Š#9°9² 9@  '..........@  '............°@± ° 9±$± 9901#".547327>32#&'&'&#"x6+@ a>>_T,D0&s–`&  ŠþÍn$3#'*9/gyq*IM8þ,Šœ%Ah"<;Ù9²+°3²+´  +± é°/°Ö± é°2° ±+± é±+0132#54&+#Òf‚–ADN–Ùÿ€VþüÒFCþ¥Ù-QÙ ,²+±é² +±é° /± +±°9°°901!!5!5QþŒtýÜuþ‹Ù}þ!}}ß}*$ð#m²+° /±é°/°3´ +°/´ +°2° /± é°$/°Ö°2´ +°2°±+°2± é±%+±´"$9°± 990153#;4&#"3#53>32#5#"&'*ð.!,S*'%'-ð--DG'pz–ŠDdSOO" ),!%OO8Q*ofýå•hV'ÿéCå "’²!+± é²+± é´! +± é°#/° Ö± é°±+´+°±+´+±$+±´!$9°±99°°9±³ $9°²999°³ $9°±9901"32654&6327&'725#"'#"†[nn[ZomþEÁ…·+ npn•A(P ¼™Ÿe‹æ‹ŠpvŒþZPÖš„?# ii½*o˜Æ(pÙ G²+±é°2²+±é° 2° /°Ö± é² +³@ +° 2² +³@ +°2± +01%3!53#5!#—Ùý¸ÙÙHÙ}}}ß}}ÿçfò7²(+°$3±4é° 2°/°/±é°8/°+Ö±1 é°1±+± é°± +± é±9+±1+°-9°³(.4$9°³&6$9° ³$$9±4(°&9°´ +-$901%4673254.#"#4>32#"'#"&547327&F9l‡m&:?78–#6HB!S‡O*;hEZNKIv›f]G5Þ%g =EtòDrD%;0L. S†™L32632#"&'732654&#"#"&547&32>54û–.GL#`S|m_‡eF'VX4>=>DmVTo… uD- j@2En?!DDnY`^/-8"//&n˜ª­ ‹Ä€Šbl®dd`å,l²+²+°3²+±& é´  +± é´* +± é°-/°$Ö´+±.+±±!99± *±"99°&´$(,$9±± 9901!##"&'732653332>32'654#"#"'…µN$Bzh+*#'—¢Ÿ—0 3?]n-+$.B8 6K$30):oC$0(YLýÛ%Y23GD);)e/552ÿçfò=–².+°*3±:é°2° /± é°/°/± é°>/°1Ö±7 é°7±+± é° ±+±% é±?+±71°39°³.4:$9° ³,<$9°³ *$9±:.°,9° ³17$9°³%4$9°°3901%432.#"3254.#"#4>32#"'#"&547327&FWd= ‡m&:?78–#6HB!S‡O*;hEZNKIv›f]G5Þ¿Ml >tòDrD%;0L. S†™L3 #"ªDÎ/fS[gg[D]6–,CR[†€B`2¤Kœ´«Ä  YQ^o¼nA:u¤HDg”h_AEþB§¦oÙ `² +²+´   +°3± é°2°/° Ö°2± é°2² +³@  +² +³@ +±+± °9± ° 9°°901333##5!5CŒŒ––––þÓ¦gþ™}õõ}<iÙ B²+± é² +´  +±é°/°Ö± é°2° ±+± é±+± °90132#!332654#Ò»dxyrþ¾–Œ<9uÕ„ontÙþÛ68mjÙ‡²+² +´  +±é´ +±é² +³@ +°/°Ö´+°±+° 2± é° 2°±+´+±+±°9±°9± ±99±³ $901#"&573273632#4&"#ö, REo6–(REo0.–[d-*eþä[d-)þ²,ÿçâ :D¦²+±é²!+±?é³*!?+±6é°E/°Ö± é° Ö±A é°±+± é°±4+±. é²4. +³@40 +±F+±°9°A°9°´ !=$9°² $%999°4²'*9999±6µ.0$9°?²%;999°*°'901732654'7#"&54>7&54632>32#52654#"'654#"Â#(t ±4UR(R=jy4%$x~>Fs %&:]DÏ ,+'M‚!(® *NÔ-pE$86rU1O@!'€6Z\8 I9¬o-$%r&"<pÙP²+°3²+±é°/°Ö± é°± +± é° Ö± é±+± °9±°9±°901#54&'5254&+#!2ñ–sk.5t9<Œ–Bry?pq8>?o? m86ý¤ÙtnOt:ÿéÙ?²+± é² +³@ +²+°/°Ö± é°± +± é±+± °901"&53326=3$pz–*'+&–*FKofýå),-2FH?[/ÿþ`Ù-²+°3²+² 333°/±+±³ $901!#373733#'sö—¢5{—''—{8Ÿ—ú:ÙýÛ¸m……þ™¾%ý'ª)ÿçQç.™²++±é²+±é´"$+ +´" +´+ +´ +°2°//° Ö± é°±+±& é±"22²& +³@ +±0+± °9°µ!+$9°&±$99±$³&.$9±"° 9°± 9901732654.54!23!53&#"3##"&'ž1k,86S1ºhBOO-8! OAO%DA'`R ÿçÑÙj²+±é²+± é´ +±é³+°/°Ö´  +° ± +± é°±+± é² +³@ +±+±°9±°90152#"&5##5!32654ç[}luy¡P‡W-'}„Ygq|c–>»þ)ž+,dÿôFÙ :²+°3´ +²+° /°Ö°2± é± +±° 9°± 99013##53°––þÚ––&Ùý'Iþ·ï=JaÙ I²+°3´ +²+±é° /°Ö° 2± é² +³@ +±+±° 9°± 99015!##535¤½–þÚ––&\}ý'Iþ·ï=J`ÿþmÙ!²+²+°3°/±+±°901!#33sö—¢Ÿ—ÙýÛ%)ÿçQç&k²#+±é²+±é³#+°'/° Ö± é°±+± é±(+± °9°µ#$9°±99±´&$9°² 99901732654.54!2.#"#"&'ž1k,86S1ºV96&"86*9:X3%DA'`R*ÿç‚æ'4w²+±-é²+°$3± é°2°5/°!Ö±* é°*±0+± é°± +± é±6+±0*±99°³$$9° ´&$9± -µ!($9°°&9012'>54&#"'654&#"#"&54632632654.Äc[…W -9'9x >9F'sƒ{ba‡§•‡9?þe (.( <æ^\f’f d,# e@*+)¯m“¸ ¼ëZZþé7[mlP[#7:%ÿçUæ09BÀ²+°+3±é°62²+±?é°C/°Ö±é°±+± é° °A Ö± é°/±A é° ±.+±3é°< Ö±" é°3±8+±(é±D+±±99°°9°A± 99° °?9°.² :999°<°>9°3±0$99°"°19°8±+699±?@  "(.1:$901732654'%#"&54>767&54632#"&5473254654&"<$`G0vNam(*g+? UƒHIƒU4omaNv0u$<þã60ž:*0.6!GJ]nhQ&G,<CQPVVPRC@"K^Qhn]JG8-2*:7$$''%:-ðL²+±é°/± é² +³@ +°/°Ö± é² +³@ +°±+± é±+±°901!!4632#54&#"Ð]þ zp)KF*–&+'*þb}fo/[?HF2-,</Ù,²+±é²+°/°Ö± é² +³@ +±+01!!Ò]þ Ùý¤}Ù)ÿéªåf²+±é² +³@ +²+± é² +³@ +°/°Ö± é°± +°2± é°2±+± ±99° ± 99±°901&#"32673#"&54632€YdaWFT’¨ˆ˜²´š¥ ⃈yw†LF}“Ͱ±ÎŠyÿçSÙ#+†²+± é²+´ +±$33±é±22´' +±é°,/° Ö±) é°)±+°$2± é°2°±#+°2± é°2²# +³@ +±-+±)°9±#°9±'° 901%#"&=".54632333+3265%54#"ì|pnr.SR1vVck –gg–  +2#þÊ4:,â}~xvF$H3e`e\6Aþ¿}5?CMS•Z:ÿèÞæ)4›²!+±0 é² +° 3±' é°2´! +´ +°2°5/°#Ö±, é°,±3+± é°±+±é±6+±,#³! %'$9°3° 9°³  $9°±99±0µ#,3$9±'´%*$9° ° 901#53>32632'>54&#""&547&#"%2>54û/8kE_YYhoY'-LG(.s²n*&c-D ÿOO!GM211yWO‚ t4"+A{¨§¯¯§®xtRˆXjjXˆ<iÙ B²+²+±é´  +±é°/°Ö± é° 2°±+± é±+± °901#!2#'3254&+Ò–Bryxd»Œu9<ŒþüÙtno„}m86'ÿçÍç)|²%+±é²+±é´ % +´  +° 2°*/°Ö± é°±+°2±" é° 2²" +³@" +²" +³@ +±++±²%999°"°9± ³"$9014>323!53&#"32654&'7#".'7MpAuŸ,þìV‡-/%ÖMlCo… Ù W² +²+°3´ +°2²+´ #+° /°Ö´ +°± +± é² +³@ +±+± °901#5!#3#VL©\&™þ[°†=SþUþý'†<Ùa²+°3²+´ +±é° /°Ö± é°2°±+± é°±+± é±!+±±99° °9±³ $9013#3%632'>54#"#Ò––K$.78#]!=&!–ºÙþ»¿ @,&X p ' þ0zk<¿Ù 0²+° 3²+°3° /°Ö± é°2± +±± 99017#33 #Ò––±þÝB³ïôôÙþÀ@þÆþaBÿç5Ù J²+±é²+´  +± é°/°Ö± é°±+°2± é±+±°9± °9013!"&5!3#"32>5Ÿ–þñ…1$)ÿèæ#T²+²+± é²+± é²!+°$/°Ö± é±%+± ²999°·"$9°!² #99901'.#"32677''#"&5463277“bdmCYddYCmdb“HLaJ`‡š´³›‡`JaLw¯tv7i†yx‡i7vt¯A[tYnα²ÍnYt['ÿžÈç$|²+± é² +³@ +³+± é²+± é² +³@ +°%/°Ö±" é°"±+± é±&+±"²999°±99± ° 9±± 99°°901%2=3327#"&'#"&54632#&#"·–0?,8@GX‚ )y<–ÂÄ„ª(†_muk²1’MTl)QA %ئªÔ„qu†vpÿæßè)4@£²+°&3±é°2²+°3±;é°/2°A/°Ö±é°± +±? é°?±7+± é°±+±2é°2±*+± é±B+±? ² 999°7±(99°°9°±&99±*2±99±°(9°;@   *5$901"&57327&546323267.54632#"'54.#"654.#"üc–‘22xkVZ…Z8/^qjohJÌ0Nhl8d`H 'þd5 f M6 {§«­±§Ÿ{wa$~nG[þÖe¤jG32Ä?Q 0@ó[hLi&"cVs'ÿéåå *{² +± é²+± é´"  +´"+´  +´+°+/°Ö± é°± +± é±,+± ³ !$9±"°9±´ %$9°°9°°9016632#"654&#"323%327#"&/.#'ÁžÂ¿ Ÿbm\j7c2 #&þÃn[l8h#; ¿PÖÕ®¢×9#vŒ[%!g; +s‹a10V *ÿçoæ*3ƒ²+±é²+°%3´ +²+±0é°4/°"Ö±2 é°2±-+±( é°(±+´ +° ±+± é±5+±-2±%99°(±99± °9± · "(+-2$901732>54&#"'4>32#".54632'654&#"÷$i7Jt@ -z)N9J\Fc”X?piL-‹jLu€–€WÕ:7Gqx;8KŒ=]O)ªzCƒ}^:Gj¢f‚¦z`s“GFc1B«:ÿ÷ÿç~å "P²+±!é²+±é°#/°Ö± é°±+± é±$+±±!99°± 99±!´$901654&#".54632#"&'732Þ ' !(9-rŠxoat32#"'#"&547327&547'"iFFFF$h#‡m&:?78–#6HB!S‡O*;hEZNKIv›f]G5/#FxRRRREy*EtòDrD%;0L. S†™L8L:H>7TJ4,>7ì{DWznS"9"j-~…I0‚ 76#851K}+"0-=þ¶ÿîÿçCÙ$}²+²+± é²  +³@  +²+´ +° 2°%/°Ö°2± é°!2² +³@ +² +³@ +°± +± é±&+±°9° °9± ³$901%#"&533254&#"#'7>75#53#CvV[s–68]H3\<0¬Xj1/™X4ú0vŽ×vzs|rq[‘Ll„b#½;h­Ó\OOZ´98ðP²+°3°/± é° /± é²  +³@  +°/°Ö± é°2°±+° 2± é°2±+±°9014632#4&#"32#54&+#9s*QP1–<-,=f‚–ADN–o/[?+268(€VþüÒFCþ¥'ÿëªç&²+²!+± é²+± é²+´! +±é°'/°$Ö± é°±+´ +² +³@ +±(+±³ !$9°²999±°9±±$99° ² 999°²99901277'.#"32>7#5!#'#"&546ˆƒ`JaLH“bdmC_mu[%4,"¦$Z*hJ”ÁÄçnYt[A¯tv7i†vp"='}þv`=8ئªÔ<„Ùc²+±é²+±é´ +±é° /°Ö± é°2°±+±é° Ö± é±!+± °9±°9°°9°° 901%#!!23254#3254#„5jIþ¸EDc1.6yþN£jj£³ooÒ$DB(Ù(?</D#G ¥RSþÞ½^_ÿÿ ÿ&¯Ù'z¶üØ$ÿÿ(ÿ%%#z}ü×DÿÿP˜„#y¾%ÿÿAÿéEð#y¸ EÿÿPÿ3˜Ù#yÂüÆ%ÿÿAÿ3EÙ#y«üÆEÿÿPÿi˜Ù'mÁ%ÿÿAÿiEÙ'm¬Eÿÿ(ÿ$©„' Ê"‰ÿÿ(ÿ$õ"vr©ÿÿP¬„#yÉ'ÿÿ(ÿé,Û"yTôGÿÿPÿ3¬Ù#y²üÆ'ÿÿ(ÿ3,Ù#ywüÆGÿÿPÿi¬Ù'm¬'ÿÿ(ÿi,Ù&mxGPÿ+¬Ù*„²*+°3±é²+´!(+² +±é°+/°Ö± é°±$+´ +°±+± é±,+±±99°$µ!)*$9°°9±!°9°*²$999±° 90173254+!2+632#"&'732654&#"7懩©‡– FYYGŸ#)C>!81E$!2}ïðý¤ÙTk­°hU8&!-0 4 c(ÿ,Ù 1Ÿ²/+²#+²1+²,+²)+± é°/´(+°2/°&ֱ鰱+´ +°±/+±+22±.é±3+±&±99°@   "#)$9°²999±°9°/²999°²&0999°)°+901"2654&632#"&'732654&#"7.546323#5*4BBhBAB#)C? 91E#"2Zp‚ab3ŒŒ/°_KJ^\JM_þ:9&!-0 4 d  qz¥Oý'7GÿÿPÿ6¬Ù'f¨ü×'ÿÿ(ÿ6,Ù'fŒü×GÿÿPq×' ÉÈS#q³(ÿÿ(ÿé„'C®ÕÿÿPqÚ' ÊûV#q³(ÿÿ(ÿé„'v^ÕÿÿPÿ6qÙ'f¨ü×(ÿÿ(ÿ6%'fnü×HÿÿPÿRqÙ'|³üå(ÿÿ(ÿR%'|hüåHÿÿPÿ+q„'xª˜ãÿÿ(ÿé"xyýäÿÿPP„#y¢)ÿÿ9„#y=Iÿÿ(ÿëÅo#qá´*ÿÿ(ÿ&#»'q‚JÿÿP„#yÊ+ÿÿA!#yÏ:KÿÿPÿ3Ù#y¶üÆ+ÿÿAÿ3Ù#yüÆKÿÿP„'jÃ+ÿÿA„'jœK3ÿ8 Ù"{²+±!33²+°3° /´(+´ +±é°#/°Ö± é°2°± +´  +° ±"+°2±! é±$+±² 999° °9± °9°± 9901!#632#"'732654&"7#3!3# þß #)D>7SE#".+]– —–Kþµ+&!-04 VÙþïý'ÿÿAÿ7Ù&z|KÿÿPÿHÙ'xÎüë+ÿÿAÿHÙ'x…üëKÿÿÿêÿRLÙ'|ÿóüå,ÿÿÿÛÿR=Ù'|ÿäüåLÿÿ4' Ê@Œ#jÿõ‘,ÿÿÿü.„"jïì"ó vÿáÿÿPÓ„' Ê.ÿÿA*€#v‹NÿÿPÿ3ÓÙ#y´üÆ.ÿÿAÿ3*Ù#yzüÆNÿÿPÿiÓÙ'mÐ.ÿÿAÿi*Ù'm…NÿÿPÿ3CÙ#y§üÆ/ÿÿAÿ3ÍÙ#yÿÞüÆOÿÿPÿ3Co#qá´ÿÿÿôÿ3o#qÿä´‚ÿÿPÿiCÙ'm£/ÿÿÿöÿi!Ù&måOÿÿPÿ6CÙ'f¨ü×/ÿÿÿçÿ6%Ù'fÿßü×OÿÿP„' ÊJ0ÿÿA=ì'vÿ÷PÿÿP„#y 0ÿÿA=î#y"PÿÿPÿ3Ù#yþüÆ0ÿÿAÿ3=%#yüÆPÿÿP¡„#yÏ1ÿÿA$ï#yœQÿÿPÿ3¡Ù#yÀüÆ1ÿÿAÿ3$%#y„üÆQÿÿPÿi¡Ù'mÄ1ÿÿAÿi$%'m€QÿÿPÿ8¡Ù'fºüÙ1ÿÿAÿ8$%'f†üÙQÿÿ(ÿéæ' ÊJ#|æ–2ÿÿ(ÿé>„'v#|‰ÿìRÿÿ(ÿéæ#|æ—"2jã.ÿÿ(ÿé>„#|‰ÿì"RjŒÿÿ(ÿéæÞ' ÉéZ#qØ”2ÿÿ(ÿé>„#qˆÿö"RC¨ÿÿ(ÿéæÙ' Ê,U#qã2ÿÿ(ÿé>„#qˆÿö"RvÿÿP}„' Êð3ÿÿAÿ&Eõ#v˜SÿÿP}„#y³3ÿÿAÿ&Eî#y¬SÿÿP¥„#yÈ5ÿÿAtí"y6UÿÿPÿ3¥Ù#yÂüÆ5ÿÿAÿ3t%#yÿÞüÆUÿÿPÿ3¥\#qá¥ÿÿAÿ3t«"q1ð¦ÿÿPÿi¥Ù'mÇ5ÿÿ.ÿit%&mUÿÿ(ÿé„#y¦6ÿÿÿé ð"yp Vÿÿ(ÿ3å#y˜üÆ6ÿÿÿ3 %#ygüÆVÿÿ(ÿéÿ' Ê"6yiÿÿÿé ‚#yF›ÿÿ(ÿé#y¢"ÿÿÿé €#yu™#ÿÿ(ÿ3„#y¢­ÿÿÿ3 í"yh®ÿÿf„#yš7ÿÿÿé4g#yÿù€Wÿÿÿ3fÙ#y¡üÆ7ÿÿÿ34¢#y üÆWÿÿÿifÙ'm˜7ÿÿÿi?¢&mWÿÿÿ6fÙ'fšü×7ÿÿÿ6E¢'fÿÿü×WÿÿPÿ3’Ù#jÇüÆ8ÿÿAÿ3$#j‰üÆXÿÿPÿR’Ù'|Çüå8ÿÿAÿR$'|üåXÿÿPÿ8’Ù'fÄüÙ8ÿÿAÿ8$'fŠüÙXÿÿPÿé’' Ê4~&8|ËÿÿAÿé$#|„ÿå"Xv{ŒÿÿPÿé’×#qÃ'jÃð8ÿÿAÿé$g#q†ÿö"Xj„€ÿÿƒ„'|­—9ÿÿ ñ&|pYÿÿÿ3ƒÙ#y§üÆ9ÿÿ ÿ3#ygüÆYÿÿ«„' É,:ÿÿ í'CìÿøZÿÿ«„' ʆ:ÿÿ õ#vÇZÿÿ«„'j3:ÿÿ î'jÝZÿÿ«„#y0:ÿÿ î#yâZÿÿÿ3«Ù#y4üÆ:ÿÿ ÿ3#yÚüÆZÿÿ„#yµ;ÿÿí"yt[ÿÿ„'j¸;ÿÿð&jp [ÿÿ y„#y©<ÿÿ ÿ%ë"yr\ÿÿB„' ËŒ=ÿÿÝõ"fU]ÿÿÿ3BÙ#y—üÆ=ÿÿÿ3Ý#yVüÆ]ÿÿÿiBÙ'm¢=ÿÿÿiÝ&m_]ÿÿAÿiÙ'm…Kÿÿÿé4Q&jójWÿÿ ð'zäÿîZÿÿ ÿ%ð&zsî\ÿÿ(ÿé'#^)Dÿÿ4„#y=APÿé½è%в +²+± é²+± é´% +±é°&/° Ö± é° ±"+±é°° Ö± é°/± é² +³@ +±'+± ´ $9±"°9±%±99°°9°°9012654&#"#462#"'532654&#vT:OB–¥þ£G,B*Pa?M.5=KKgSÇ(*&%„þ ih_q# p0Fc6{)0CQÿÿ ÿ3¯Ù#y¹üÆ$ÿÿ(ÿ3%#yhüÆDÿÿ ¯É"$©NÔÿÿ(ÿé"D©ðÿÿ ¸è' ÊÅd' ËÀ$ÿÿ(ÿé,„#vï¤ÿÿ ¯è' ˾& Éd$ÿÿÿé„'Cÿï¤ÿÿ ¯è' Ë´#© ó$ÿÿ(ÿé„"¤©ÿÿ ¯' Ë·ÿì&$|«ÿÿ(ÿé„#|t—"fvæDÿÿ ÿ3¯„' ËÀèÿÿ(ÿ3÷"fhéÿÿ ¯ó' Ê)o&$x¿–ÿÿ(ÿé„#vjÅÿÿ ¯è' É´d&$x¿–ÿÿ(ÿé„'CjÅÿÿ ¯*#©E5"$xÀ“ÿÿ(ÿé„"xlì"D©ôÿÿ ¯#&$#x¿–|Á6ÿÿ(ÿé„"xlò"D|k—ÿÿ ÿ3¯„#x¾˜èÿÿ(ÿ3ð"xhéÿÿPÿ3qÙ#y«üÆ(ÿÿ(ÿ3%#ypüÆHÿÿPqÐ"(©:Ûÿÿ(ÿé"H©îÿÿPq„'|­—(ÿÿ(ÿéá"|hôHÿÿP›è' ʨdŒÿÿ(ÿé6„#vù¬ÿÿ#qè& ÉdŒÿÿÿé„'Cÿý¬ÿÿPsè' ˪#©öó(ÿÿ(ÿé„"¬©›ÿÿPq' Ë´ÿì"(|Éÿÿ(ÿé„#|t—"fqæHÿÿPÿ3q„' ËÈÿÿ(ÿ3÷"fiÿÿPìÐ#©oÛ,ÿÿFç"ó©jÿÿPÿ3æÙ#yÿ÷üÆ,ÿÿFÿ3ÒÙ#yÿâüÆLÿÿ(ÿ3æå#yàüÆ2ÿÿ(ÿ3>%#y‘üÆRÿÿ(ÿéæÑ"2©YÜÿÿ(ÿé>"R©ÿÿ(ÿéæè' ÊÜd–ÿÿ(ÿéO„#v¶ÿÿ(ÿéæè& É„'C ¶ÿÿ(ÿéæè' Ëà#©*ó2ÿÿ(ÿé>„"¶©²ÿÿ(ÿéæ' Ëãÿì"2|áÿÿ(ÿé>„#|—#f…ÿæRÿÿ(ÿ3æ„' ËÜÿÿ(ÿ3>÷#f†ÿÿ(ÿé„' Ê6bÿÿ(ÿé’õ"v|cÿÿ(ÿé„' ÉÒbÿÿ(ÿé’õ#C™cÿÿ(ÿéÐ"b©gÛÿÿ(ÿé’"c©ÿÿ(ÿé„#|Ü—bÿÿ(ÿé’ #|cÿÿ(ÿ3û#yàüÆbÿÿ(ÿ3’I#y‘üÆcÿÿPÿ3’Ù#yÐüÆ8ÿÿAÿ3$#yŽüÆXÿÿPÿé’Ã"8©JÎÿÿAÿé$ï"X©ÿúÿÿPÿé„' ÊðqÿÿAÿé—õ"v^rÿÿPÿé„' ÉÜqÿÿAÿé—õ#C›rÿÿPÿé­"q©B¸ÿÿAÿé—þ"r© ÿÿPÿé„#|µ—qÿÿAÿé—ê"||ýrÿÿPÿ3€#yÆüÆqÿÿAÿ3—Ã#yŠüÆrÿÿ y„' É <ÿÿ ÿ%õ#C‘\ÿÿ ÿ3yÙ#yüÆ<ÿÿ ÿ%#y+üÆ\ÿÿ yµ"<©2Àÿÿ ÿ%í"\©òÿøÿÿ y„'|œ—<ÿÿ ÿ%ð&|q\ÿÿ(ÿñx#ò’.>ÿÿ(ÿñx#*‹.>ÿÿ(ÿñx "ÿ$.>ÿÿ(ÿñx" 3.>ÿÿ(ÿñx "/.>ÿÿ(ÿñx" .>ÿÿ(ÿñxƒ"iÿ>ÿÿ(ÿñxƒ#ƒ>ÿÿ ¯å"òÂôÿÿ ¯ë"*ºúÿÿ\é"ÿ¬÷­ÿÿLâ" ¯ñÿÿâ"¬ðhÿÿ"ñ& ¯sÿÿÿßÕn"Äê&ÿÿÿøéq"ó:ÿÿ(ÿö#ò€.Bÿÿ(ÿö#*‚.Bÿÿ(ÿö "ÿ.Bÿÿ(ÿö" .Bÿÿ(ÿö ".Bÿÿ(ÿö" .BÿÿÎå"ò¬ô#]ÿÿÐå"*¯ô#_ÿÿŸæ"ÿ¬ô#.ÿÿ‘å" ¯ô# ÿÿâ"¬ð#ÿÿ“å" ¯ô#"ÿÿ ÿ8""òv1Dÿÿ ÿ8""*1Dÿÿ ÿ8 "ÿ2.Dÿÿ ÿ8" .Dÿÿ ÿ8"5+Dÿÿ ÿ8" 9%Dÿÿ ÿ8„"mDÿÿ ÿ8„#¤Dÿÿûå"ò¬ô%^ÿÿþå"*¯ô%aÿÿÁæ"ÿ¬ô%$ÿÿ¸å" ¯ô%ÿÿ³â"¬ð%ÿÿ¿å" ¯ô%"ÿÿÿÍUq"²í%¸ÿÿÿç`n"ñð%Ãÿÿ;ÿïK"òç.Fÿÿ<ÿïK"*ì.Fÿÿÿï… "ÿÂ.F:ÿÿÿï‡" É.F<ÿÿ&ÿïŠ "Ò.F?ÿÿ'ÿï†" Ö.F;ÿÿÿï‚…"øF7ÿÿ%ÿïƒ"/FEÿÿWå"ò¬ô'qÿÿWå"*¯ô'qÿÿ æ"ÿ¬ô'#ÿÿ å" ¯ô'#ÿÿâ"¬ð'ÿÿÿå" ¯ô'ÿÿËm"åé'åÿÿËl" î'åÿÿ(ÿé>#òœ.Lÿÿ(ÿé>#*Ÿ.Lÿÿ(ÿé> "ÿ..Lÿÿ(ÿé>" ).Lÿÿ(ÿé> "C.Lÿÿ(ÿé>" 0.Lÿÿÿé8å"ò¬ô-Rÿÿÿé9å"*¯ô-Sÿÿÿéúæ"ÿ¬ô-ÿÿÿéõå" ¯ô-ÿÿÿéÓå"¬ð-íÿÿÿéÑå" ¯ô-ëÿÿ<ÿð$#ò•.Rÿÿ<ÿð$#*˜.Rÿÿ<ÿð$ "ÿ'.Rÿÿ<ÿð$" ".Rÿÿ<ÿð$ "F.Rÿÿ<ÿð$" =.Rÿÿ<ÿð$…"vRÿÿ<ÿð$ƒ#šRÿÿ{å"*¯ô2‡ÿÿGå" ¯ô2SÿÿVå" ¯ô2bÿÿþl" î2 ÿÿ(ÿñö!#òó0Vÿÿ(ÿñö #*õ/Vÿÿ(ÿñö!#ÿ/Vÿÿ(ÿñö# .Vÿÿ(ÿñö,#Â:Vÿÿ(ÿñö"# ¦1Vÿÿ(ÿñö„#ÅVÿÿ(ÿñö‚#òVÿÿDí"ò¬ô6MÿÿGí"*¯ô6Pÿÿí"ÿ¬ô6ÿÿí" ¯ô6ÿÿßí"¬ð6èÿÿìí" ¯ô6õÿÿÁm"åé6Êÿÿ¾l" î6Çÿÿ(ÿñx"6>ÿÿ(ÿñx#)‹>ÿÿ(ÿö"$Bÿÿ(ÿö")xBÿÿ ÿ8"JDÿÿ ÿ8 #)DÿÿÿïK"®Fÿÿ<ÿïK")ÇFÿÿ(ÿé>"@Lÿÿ(ÿé>#)•Lÿÿ<ÿð$"9Rÿÿ<ÿð$#)ŽRÿÿ(ÿñö#—'Vÿÿ(ÿñö#)îVÿÿ(ÿ9x"lBÿÿ(ÿ9x"lCÿÿ(ÿ9x "lDÿÿ(ÿ9x"lEÿÿ(ÿ9x "lFÿÿ(ÿ9x"lGÿÿ(ÿ9xƒ"lHÿÿ(ÿ9xƒ"lIÿÿ ÿû~å#ñŠÿûJÿÿ ÿû{ë#ñ‡ÿûKÿÿÿû é#ñ,ÿûLÿÿÿûâ#ñÿûMÿÿÿûÓâ#ñßÿûNÿÿÿûÝñ#ñéÿûOÿÿÿÖÿû‰n#ñ•ÿûP÷ÿÿÿäÿûq#ñ›ÿûQìÿÿ ÿ8""É^ÿÿ ÿ8""È_ÿÿ ÿ8 "È`ÿÿ ÿ8"Íaÿÿ ÿ8"Ébÿÿ ÿ8"Êcÿÿ ÿ8„"Ìdÿÿ ÿ8„"Éeÿÿÿûßå#ñëÿûfÿÿÿûèå#ñôÿûgÿÿÿü¥æ#ñ±ÿühÿÿÿû¨å#ñ´ÿûiÿÿÿûŸâ#ñ«ÿûjÿÿÿûªå#ñ¶ÿûkÿÿÿÍÿû9q#ñEÿûlÿÿÿçÿûLn#ñXÿûmÿÿ(ÿ8ö!#×–ÿÿ(ÿ8ö #×—ÿÿ(ÿ8ö!#טÿÿ(ÿ8ö#×™ÿÿ(ÿ8ö,#ךÿÿ(ÿ8ö"#×›ÿÿ(ÿ8ö„#לÿÿ(ÿ8ö‚#×ÿÿÿê#í#ñ/ÿêžÿÿÿêí#ñ)ÿêŸÿÿÿêÞí#ñêÿê ÿÿÿêÝí#ñéÿê¡ÿÿÿêµí#ñÁÿê¢ÿÿÿêÆí#ñÒÿê£ÿÿÿêm#ñ©ÿê¤ÿÿÿê™l#ñ¥ÿê¥ÿÿ(ÿñxð"xm>ÿÿ(ÿñxœ"qoá>ÿÿ(ÿ9x"l¦ÿÿ(ÿ9x"l>ÿÿ(ÿ9xû"l9ÿÿ(ÿñxá"ó~õ>ÿÿ(ÿ9xá"véÿÿ ¯…#xÉ™ÿÿ ¯\#q¶¡ÿÿÿê¯å"˜üÿÿ ¯å")¤óÿÿ ÿû|Ù#ñˆÿûÿÿT3Øñò:ôüA²+´'+² +³@ +³@ +°/°Ö´ +°±+´  +±+01732>73#".=3•   !$[~'"  C?bT3Øñ;°/´++°/´ +° /°Ö°2±é±é°´ +°/± +013565#V‚„B@ñJf/ 2ÿÿlbì| ÿÿÿÿöaX…#óÿö™jôÿÿ ÿ8"˪ÿÿ ÿ8$"ËDÿÿÿ8$õ"Ê;ÿÿ ÿ8"ó}"Dÿÿ ÿ8"Êøÿÿúå"®ü#‰ÿÿ÷å")‹ó#†ÿÿ$å"®ü%‡ÿÿ!å")‹ó%„ÿÿPÿû}Ù#ñ‰ÿû%ÿÿT3°ò#– òÿÿT3«ò")nòÿÿ3}„#ó˜ò/ÿÿÿï_ð"xôFÿÿÿï^œ"qðáFÿÿÿïk"F ÿÿÿïb "Fÿÿÿïqá"óõF&ÿÿÿï~ƒ"ô þF3ÿÿ°#xÿôÄ'ÿÿ1\#qÿö¡'ÿÿwÜ"®ó'‘ÿÿmâ")‹ð'‡ÿÿQ3­ñ#“*ÿÿQ3¯ñ")rþ*ÿÿÿö0X~#óÿö’*ýÿÿ<ÿð$ð#xŽRÿÿ<ÿð$œ#qÿáRÿÿ<ÿð$#…Rÿÿ<ÿð$#…Rÿÿ<ÿ5Rü#ò· Nÿÿ<ÿ5R #*±Nÿÿ<ÿð$á#óÿõRÿÿ<ÿð$ƒ#ô…ÿþRÿÿô…#xÞ™2ÿÿô\#qà¡2ÿÿ¯Ù"®ð2»ÿÿÇß")‹í2Óÿÿÿøô"*¯/jXL  P°/± 33±é°2² +³@ +° /°Ö´ +°± +´  +± +±°9° ²999013#'#5!#5RrFÿ÷Ï-7°/±é±é°/±+01!5-ýÊ7hhÿùÏë7°/±é±é°/±+01!5ëü7hhÿÿÿùÏë7?ÿÿdÿ8VÙ'_¢_ÿÿÿêþÔBÿ¦&BœBÿÿDâ¾Ù\»ÀÿÿDâ¾Ù\ÿÿ<ÿz¶qDÿøý˜Dâ¾Ù :² +± é°/´,+° /°Ö´+´+°2´ +± +01#.=¾>>5EÙpM .Q=gÿÿ>â†Ù'CÈCúÿÿ8â€ÙG¾»Àÿÿ8ÿz€qHý˜ÿÿBâ†Ù'FÈFþÿ> Å L² +°/°3± é°2² +³@ +° /°Ö°2±é° 2² +³@ +² +³@ +± +01###5353 ³†³³†åtýÍ3tààÿ>Åc²+° /°3± é°2² +³@  +°/°3± é°2°/°Ö± 22±é±22² +³@ +°2² +³@ +°2±+01#3##5#535#5353³³³†³³³³†åtßtààtßtàà2ª^Ö .°/´ +´ +° /°Ö´ +´ +± +012"&546ÊXX>?W3¶g !°/´ +° /±+´ +± +01"&5463gýh ‰ ’ÿÿ¡7’oÿÿ$´’&òìÿÿ$®’'æ&òìÿÿ@©¼$y ÿêÞã $/:Eê² +±633´+ +°@2²+°3´  +´% +°03´% +°;2´ +´ +°F/° Ö´ +°±+´ +°±#+´( +°(±-+´ +°±9+´> +°>±C+´3 +±G+± °9°²999±-(² 999°°9±C>±6099±%+µ"#389$9± ² 999012#"&46"2654&%3#2#"&46"2654&%2#"&46"2654& ?WX=>XX=)):*)2Cþ[B‹?WX=>XX=)*:))S?WX=>XX=)*:))ãW?;WWzWP))))Oý 'W? +°>±C+´3 +°3±O+´T +°T±Y+´I +°I± +´ +°±+´ +±]+±$°/9°)².999±C>²,60999°3°-9±YT±LF99±±99±;A@  389INO$9±!'²999012#"&46"2654&2#"&46"2654&%3#2#"&46"2654&%2#"&46"2654&¶?WX=>XX=)*:))ûÌ?WX=>XX=)):*)2Cþ[B‹?WX=>XX=)*:))S?WX=>XX=)*:))W?32#547'57>54&–Ì(:NA"r¬?M |&Ú%’’’OAb7" ƒc;Q6  /$ÚW:" |Yt+1¶,°/±é±é°/±+01!5,ýÕhh"ÿ%q²+± é°/±+±± 99017#"&/5326F+8‹]_Š8+J±NŠ"y7&&7y"="2q°/± é°/±+±± 990157>32'&#"M+8‹]_Š8+J±NŠU#z7&&7z#<ÿöÿÀ-3#'#6x˜ªyllx-ûþì±±ÿÿÿùÿàDÙ' ß' ÿâþJ ßþI2—^K(°/´ +´ +°/±+´ +±+01!5^þÔK´´ÿSÿìQ˲+²+°/±+013#úWþYWËý!`ÿ-ò$G°/± é°/± é°%/° Ö°2±é°2² +³@ +±22±&+± ° 9±° 901;#"&=47.=46;#"ß (G>H:!H>G(!PsSI¶k1M9¶ISs ¦?,m1-ÿÓò#G°/± é° /± é°$/° Ö°2±é°2²  +³@  +± 22±%+± °9± °9017'57>=4&+532+5326=4&! (G>H!:H>G(Èm,?¦sSI¶9M1k¶ISs ¦>-ÿÿ@è#"c"ÿÿ@iè#c"ÿÿpyè#"Mÿô0 2²+°/± é° /°Ö±é² +³@ +± +± °901#67!5{eÃþŸ0n”ÏkïÐ}ÿAÙH² +´  +°2² +³@ +°2°/° Ö´ +°±+´ +´ +±+01####5!2t\b?b+/Xwï`€þ6Pü°PH‡ÿÿ$109xTjÀ$109N°/± é°2°/°3± é°/°Ö´+² +³@ +°2°±+´ +±+±° 901%!53#5!2#3HþÜ99$Jk32l‡<<1r$rKtEDtL–þÜÿÿÿàe" þIqÿR G²+´ #+°/´ +°/´ #+°/° Ö° 2± é°2± é°2´ +±+01%#.=3#VV1? ––’’b8$82#‰v’ÿÿ"ÿõq/'kÿjÐÿÿÿàeå' þI ÿÿA?à'yÿZ'yºoî 8¨T°/° 3±é°° Ö± é°/±+°6ºïÂE+ °°À± ù°À³....³....°@013#"/&#"#7>323267Ú^TG4M#!&^ ZA;6$+¨#?: ! !9= "ÿ qÿè²+± é°/±+±± 990157>32'&#"M+8‹]_Š8+J±NŠÔ#z7&&7z#< ÿÙÖZV²+°F/°3´L +°2°[/°5Ö°2±/ é°2±\+±/5´ ,8Z$9±LF´!CO$9°´ SZ$901&5463276327632#"/#"&/#"&54?#"&546?#"&54632'.5463281!"0J%.!/e} "33" |h/!'I1!"0J'!/e} "33"zh1!%I^"33"|i4-#&I1!"0J'!.e} "33!|i-#'I1!"0J'$,fÿÿ%ÿæÄ1&yå.'y yÿ=ÿÿ(Ó4æ']e']™']Ì]ÿÿ%ÿõ“º'yÝ–'yÝÿL'y×~yå~ÿÿ%ÿè–¾'yßt'yÚš'yÿå—'yÚÿ?yÿåÿ?ÿÿ%ÿé¡ 'yÿåçyÿåÿ@ÿÿ%ÿ8“'y×<&yå<'yÝùyÝþÿÿ9) 'ycä'ycÿ&yü& 3yÿùâÿÿ%ÿë¡ð'yÿåÿB'yÿåÌyÿåˆÿÿ%ÿê¡ñ'yÿåó'yÿåÿA'yÿåÍyårM3L° /´ +°/´ +°/°Ö´ +°±+´ +±+±± 99±±99014632#".74&#"326EX/@! .?"à!"# #$Rix#BL2Þ"@L2\ADXZ?Cÿÿ6†’`L †)™†N/ `°/°3´  +°2² +³@ +²  +³@  +°/°Ö° 2´ +° 2² +³@ +² +³@ +±+± °901##5#53#5N._³¥m_j.K]]Jþÿ¤¤hJ ­²+´ +° /´ +² +³@ +°/´ +² +³@ +°2°/°Ö´ +°±+´ +±+°6º?õ]+ °.°.°±ù°±ù°.³....°@±² 999°±99±°901#632#"&'332654&#"#78½'(@O\IBSY<"('#+Q) KYRAEVE85,%&, írL3'k°/´" +°/´ +° /° /´ +°(/°Ö´ +°2°±%+´ +±)+±%³ $9°° 9±"±99°°9014>32#&#"632#"&7"32654&55"/"S' "&5;IUCVKŸ'&(%JFb./"&&-)%M=EWpt,#"+-"#*wQ 5² +´  +° /°Ö´ +² +³@ +±+± °901#67>7#5QQL[,Aã B\§d|T^K rP3)°/´% +°/´ +°/´ +°*/° Ö´" +°2°"´ +°/°"±'+°2´ +´ +±++±"° 9°'³%$9°°9±%± 99°± 99°±9901#"&547&54632"32654"2654&A;JZGHZJ;S@?St<&'&E '&B'&¿8&G=LL=G&:2BB Š&! %%"&ÿÿpL1 ”_£À¿Kà R² +°/°3´ +°2² +³@ +° /°Ö°2´ +° 2² +³@ +² +³@ +± +01##5#5353KuMuuMsGmmGmm,Ks(°/´ +´ +°/±+´ +±+01!!7þÉsGÿÿäKº&™G™¸ÿÿ(Å„ ª)™ÿÿ(¾„›Ø¬Àÿÿ*†eëQ†)™ÿÿÿ&Mçý´ÿÿ(ÿ8òá{ý³ÿÿÿ8Hêtý²ÿÿÿ+Iêuý¸ÿÿÿ8Ná’ý²ÿÿÿ*Jâ“ýÂÿÿÿ*Lë”ý¸ÿÿÿ8Qá•ýÁÿÿ ÿ*Pë–ý¸ÿÿÿ*Lë—ýºÿÿÿK ˜ýÀÿÿÿìL3™ýÀÿÿÿŸLušý»ÿÿþÔÅ/G›ý¬@?äÿÿþÕ½1›×YÀÿÿÿ)^Dÿ8)™ÿÿÿ+cŸHÿ:)™ÿÿÿ+vŸRÿ:)™ÿÿ ÿ8\—[ÿ8)™ÿÿÿ+aŸùÿ:)™7Ùu²+²+±é´ +°3´ +°2´  +°3´  +°2°/°Ö± 22±é±22² +³@ +°2³@ +² +³@ +°2±+013##5#535#535!!3#çþþ…OOOOÕþ°þþIPùùP?Sþk“S ÿßBòM¾²!+± é° Ö± é°'/°3´( +°2°-/°3´. +°2°F/±5 é²F5 +³@F; +°N/°2Ö±Ié²I2 +³@I +°2²2I +³@2' +°-2°I±<+±;é±O+±I2´#),/&$9°<¶ !5F$9°;²999±!°#9°±$99±' ±99013#3#63232>7#"&#"'67#53.'#53.54632#45.#"誉 € $i  C$>&0„ R)DZo{n> ˜o9W5"‰$5? ‘N 3N  ZUM+N@N&-eŠ3JO0# 8/")<ÿŽ8‹%”²+± 33²+²!+± é° 2²! +³@! +²+°&/°Ö±é°2°±+°2± é° ±+±é±'+±°9°±!99° °#9°±%99°±99±±99°²#%999013#4&'#5#54&#"#3>3267‡sG?FŒ'"cŒ†sù)#-3Œ‹#C.j) &‹i UEþ‚h %þâQÃln &82þ¼C)#P*.¬Ý#˜²+°3²+°3´  +² 333´ +±22´ +²"333±é±22°$/°Ö± 22±é° 2² +³@ +° 2°±+°2±é±22² +³@ +°2±%+±³!$901##'##5#535#53533533##5##3'#¬3…ƒ–€----‚Š‘33]5õe415]××××]WgêêêêgWWWWÿÿPÿé¶Ù&5V­PÓXh²+°3± é² +³@ +°/± é°2² +³@ +°/°Ö±é°±+±é°±+±é°±+±é± +±°901%>73+!32#54#!#É>;‹,>L7 þ‡‹APk‹0þ¿‹s5:qþ7W0 zþùåYIÜÜ/þXÿè+#%ª²+´+° /± é°/± é°/°3´ +°2² +³@ +² +³@ +°&/°Ö°2±é°±#+±22´+±22²# +³@ +²# +³@# +±'+±#± 99°± 99± ° 9°°9°°901%!5##5#"&546325#5353"32654&øþ%6u3Jj||gF2NN}è3=>30:;AYY¹SýÏ+™{—%?S))åVVUGLT$ÿé\ã.s²+±(é²+±é´ +°"3´ +°$2´  +°3´ +°2°//° Ö±! é±0+±! ±99±(°-9°°,9±°9°°901".'#73&47#73!2.#"!#3#32>7§BOB7 M,C0> 7D+-.BZï×´U<"9N %:eAD* D|WHD" DFM•"ÿ8Eð0~²+°-/±. é°/±" é°1/°Ö±é°±+±* é²* +³@- +°° Ö±% é±2+±³$9°±"99±%°'9±.²*999°µ%'$901654#"4''#67.54632#526h MKt7¡£G #iUE^WAFuŒ96Ý93  þ_wðk2‰|$?:N!ViXCh _©cGcs"ÿ‚2û '²+°3± é°!2² +³@ +²+°3±" é° 2²" +³@ +°(/°Ö±% é°%±+±!22´ +± 22°±+°2± é°2±)+±±99±"µ %$9°°90153#&4.'>73#5.546 Dnj  $ ’ksDts€7&&Ä76‚z%!þ$* }Šhi ½ª¨²ý´ÕjmprVÙ K²+² +±é´ +°3±é° /°Ö± é² +³@ +° 2² +³@ +°2± +01##5!5!–ÝHý¸HXþ¨X}}}} ÿÑKÙY²+± é°2°/°3± é°2°/°Ö°2´+°2² +³@ +°2² +³@ +°2±+±°901#&'7326=!5!5!5!#3#ÀWBLT[¨’c):!þÇ9þÇ?‹‹‹’CfoK^´ÒQ2$'&v3vv3výËÿÿ²+´ +° /01!>7ýÌMW@/IdFAYM/YýËÿÿ²+´ +° /01!&'7!ýË€N.AXLýÌd_/MYAÿ,ÿèÿw®²+°/°Ö´ +´ +013ÔKÆý:ÿÿõÿc!#²+²+°/°Ö´ +´ +013íP ,ýÔý‘ °/´ +°/±°901!.'>7þ#=,0I>>I0,=#ïB(M+9L<7n,4.E99:;B.7)þR,4.H879;C.4,ö.J(R;33?N'M,0I'U;02>P(H0ý<ÿÀÿúð #ýiSý—ðüÐ0þOWM2°/´ +² +³@ +°/°Ö´ +² +³@ +01#!5MNþPýÖÜNÿÿþÿ9ÿþÿ´'yÿBþ'yþ‰þyýÒþþ-ô²>°/°3´ +°´ +´ +°/°Ö´ +°±+´ +01#5!#5þ{NÖMdp¾¾pü8 ÿ×, °/´  +° /01!&'67*üï6n,i››i,n6>F8‰-|••|-‰8ý¨ÿšPR###Pþ:OÉGþ:OÉRýH¸ýH¸ÿÿýêþòÿÚ¿ýé÷ÀÿÿýçþõÿݾýæúÀÿÿý þÒÿôGÂýI@0ÿÿý˜þÐ ÿòGÂýž{ÀÐþÏ2ÿœõ=² +°3° /°3´ +°/°Ö´ +±°9± ´ $90137''7'7â/DE-''(&,EDõH,9;;9,(ÿì†ê4@` ²W+°3´P +²PW +³@PT +²+´. +². +³@.2 +²+´> +°J3´> +°A2²> +³@G +°a/°Ö´<+°<±,+°+2´ +° 2³ ,+´+°/°3´+° ±\+´N+°N±G+´D+±b+°6º‹Á­+ °!°&À±9ù°8Àº ÐÀÂ+ ±!&°!°&À±9ù°8Àº?)õ¨+ °.° .°± ù° ±+ùº ëÀÆ+ °!³"!&+³#!&+³$!&+³%!&+º>›ò¶+ °³*++³5++³6++²%!& Š Š#9°"9°#9°$9²5+ Š Š#9°69°*9@ !"5689#$%&*+...............@ !"5689#$%&*............°@±<±299°³1>$9°,².999± ±99±GN²AS999°D±T99±P²DN\999°>°9°.° 9013#2#&547#"&54>?2>54#"#>73262#.#"32673#".54676ÔUý»U’*< .q?=1=8$+ 6$& a_a 1$'6&3ÒCPc%;B(chH-B!*!:Ëý!ýÞ 96+ (" HBõ#%10G5%$?6@L!'JQ..5u'F$ÿì¤ê4@m7²[+°3´e +²e[ +³@eb +²+´. +². +³@.2 +²+´>[ +°D3´ +°O2°n/°Ö´<+°<±,+°+2´ +° 2³ ,+´+°/°3´+° ±A+´R+°R±h+´X+²hX +³h` +°X°G Ö´L+°L/´G+±o+°6º‹Á­+ °!°&À±9ù°8Àº ÐÀÂ+ ±!&°!°&À±9ù°8Àº?)õ¨+ °.° .°± ù° ±+ùº ëÀÆ+ °!³"!&+³#!&+³$!&+³%!&+º>›ò¶+ °³*++³5++³6++²%!& Š Š#9°"9°#9°$9²5+ Š Š#9°69°*9@ !"5689#$%&*+...............@ !"5689#$%&*............°@±<°29°´1>$9°,².999± ±99±RA°l9°h´DOUk$9°L±V99±GX°I9±e¶GALRX`I$9°>°9°.° 9013#2#&547#"&54>?2>54#"#>73264632#654&#"#".547332654&/&àUý»U‚*< .q?=1=8$+ 6$& a_a 1$'6&31kUFPd"$G[p^.D"fL"+#;_Ëý!ýÞ 96+ (" HBõ#%1ÇAV92   AGT$#2  ÿÿÿéáå#&8r‡ ÿìºæ >Ͳ +°3´ +²+´( +²( +³@(% +²+´ +´+°5 Ö´. +².5 +³@.2 +°?/°:Ö´,+°,±%+´"+°"±+´+°±+´+±@+±,:°9°%³15$9°"°29±´ $9±5 ²999±(±",9901%4>32#"&72>54&#"3#2#.#"32673#".54676@zOR_•wP^Â%9 +%6O,Uý»UŸCPc%;B(chH-B!*!:P‡RUK~«V,A8+3nL+2…ý!ùG5%$?6@L!'JQ..5u'F$ÿìÆæ#:8²%+°$3²)+°3´5 +²+´  +²  +³@ +²+´) +³/09:$3´ +² +³@ +°;/°Ö´+°± +´+°±,+°.2´3+°12±<+°6º>™ò®+ °..°/À±1ù°0Àº>™ò«+ °%.°:.°%±$ù°:±9ùº>™ò«+ °%³&%9+³8%9+²&%9 Š Š#9°89³&.18....·$%&/089:........°@±°9° ³$9°°9±5°,9± °9013#2#.#"32673#".54676#7#"&5473326?3½Uý»U›CPc%;B(chH-B!*!:Æg @)1;;g38$6 2gËý!ùG5%$?6@L!'JQ..5u'Fý2# 5-ò 75-ìÿÿ(ÿéåR(ÿé©å{²+±é² +³@ +² +± é² +³@ +´ +±é°/°Ö°2± é°2°±+´ +±+±± 99±µ $9±°9015!.#"#>32#"&'33267ú^H€ ¥š´²˜ˆ¨’TFO_:}S[ƒyŠÎ±°Í“}FLodÿÿ|Ù#),r‡ÿÿAÙKÿš|Ê!>¸²"+±5 é³'"5+±0 é²0' +³@09 +²'0 +³@', +°/± é° Ö± é² +³@ +°?/°9Ö´8+°8± +´+° ֱ鰱,+´-+±@+±89°9° µ"3$9±± %99°±'099°,° 9±0² 99901723254&54673#"&#"#4>232>73#".#"#4>é& *"'aK3 y"4.=Y%( qb:)E'79'y,MQpfJ6&'4Na`‰4 4M&y#)#  Rf#)#Q]3NQ4!ÿõKè&c²+± é²+±!é°'/°Ö± é°±+±é±(+±±99°´ $$9°° 9± ± 99°!µ $$901327#"&54>7'7>324#">Kžƒ/ x!VQOQ *I•0€]VEŽ*$8@`O¡8|:*-:1'E wK©§FR5444632#".53032654&#"#'.—'$8 j.&9& %=BRq5ýkRS_+T?-4#o 9$ % }Q!=2#þ× )>LtsP"" z52FX^†»N;(Ìå%D:!.¡æ)6>²/+±0233²$+´ +²$ +³@ +°/´ +² +³@ +°7/°!Ö´ +°2°´ +°/°±+´  +° Ö´ +° ±.+´- +°,2°-±5+°62´4 +±8+°6ºñ ÁÆ+ °°À± ù° ÀºÁÑðÛ+ °0.°1À±,!ù°+Àº><ñ+ °6.°*À±2!ù±01°1À@ *+,16.........@ *+012.........°@±!°9±²$999±³-.45$9°° 901#&#"#"&'332654&/.54632##33#˜X[%+%2H@:dYWc\40,1'/@F<\R-2%[^U[‰VT‰[RH  <6FOOI%'! 96CJ7þ›]þ£Èþ¢^þ8]ÿÿÙf7ö33@/(¤/\/f/\oÙŲ+±33´ +°2² +³@ +³ $2°/°Ö´ +² +³@ +² +³@ +°± +´  +° 2° ±+°2´ +±+°6ºÁÑðÛ+ ° .° À±!ù°Àº><ñ+ °.°À±!ù±°À² ...´ .....°@01##5!##33#ý_‰m?^U[‰VT‰[‹þ†zNNþ†]þ£Èþ¢^þ8]ÿÿ(÷í6ÿÿ(ÿÇ÷´ 6´Àÿÿ ÿïFU ÀÿÿPÓÙ.ÿÿ ¯µ‡ÿÿ(ÿé%HÿÿÙ)dÙÀÿÿlX¾âÿÿ)X¿Çÿÿ/÷XÀÿÿ?6XÁÿÿ(ÿéD¨‡4ÿÂ@ÀÿÿCxÙf)33@/$/\;”/\ÿÿ1ÿçÎã*öÎÀÿÿ(Ù/kÙÀ Ù,²+±é²+°/°Ö± é² +³@ +±+013!5!}–þ ]Ùý'}ÿÿ yÙ<ƒÙÀÿÿÿë‡Õ ¾¾À ÿìôæ C0²-+°3´:+²+° 3²+²+´+´- +°3´+° 2² +³@ +± 22°D/°2Ö´7+³72+´ +°7±=+´'+°'° Ö´+°/´+±E+°6ºÀyø9+ ° .° .° ± "ù° ± "ùºñ/Á½+ °A°@À±##ù°$À° ³ +³ +´ #$@A.....@  #$@A..........°@± 7°9°=´-:$9±:²'24999°³ $9013###3#/4632#654&#"#".547332654&/.£Uý»U#Ê+ *Ä„À *ÿLÿÿŒÿ-8£ƒ AúÊÀ@ÿÿ'ÿ’># *´ *ÄÀÿÿ'ÿ’># *ÿL *´ÿÿŒÿ-8£ƒ DúÊÀ@ÿÿ'ÿ’> DÄÐÀÿÿŒÿ-8£ EÄÐÀÿÿ ¯Ù$¹ÙÀlÿu`]X°/±é² +³@ +°/± é² +³@ +°/°Ö´+°±+°2´+° 2±+±± 9901%#"&54632#4&#"3265`Šph’’hq‰iKFBNIGHIom“gôh’ŽlELNCþ DLLD ÿéÔ)g²+±% é²+± é´  +± é³+°*/°Ö±"é°"±(+°2±é±++±"°9°(³ $9± %±99° °901#"&54632&'.#"#>3 "326543i?jƒs[,@! 9*"'‚+/=$Æb:=/0<Q®Q18tf€"K06"0F"þ‘F;9JH8;;\Ù C² +± é²+±é´  +±é° /° Ö°2± é²  +³@ +±22± +01!5!5!5!!5!Æþu‹þu!ýß‹:}¥}ý'}7ÿÄ\"u² +°3± é°2² +³@  +²+°3±é°2² +³@ +´  +°3±é°2°/°Ö°2± é² +³@ +± 22±+±±990133!#7#537#537!5!35'35#ÃY"bþPYQW¨áLþÓfeWáQQ"Iý'<<}½}¥}þa½½}¥1ÿç+ë#z² +²+±é²+°3±é°$/°Ö´"+°"±+´+±%+±"± 99°µ $9°°9±± 99°µ $9°±9901#"''7&5463232654' &#"ÏT>FϯuX8T7ZÒ¬ˆ^þ˜:Gy”%þAqBWy—êJDa¤Ù4>J7¹YMM³˜YP[«ÜG7XŒŒnL,Gu[bm£“N˜ž;;]®]ˆ](„T1Ž®\MÿÿPÿÿÓ RIÔÀZ#š°/°Ö´ +´ +±+017!Z@#lý”iÿIÍÜ5²+±é² +³@ +°2°/°Ö± é°±+± é± +01!#!#id–þÈ–ÜümüêÿÿiÿIÍÜ W6%À)ÿ=èÙ 0²+±é°/± é° /± +±° 9°° 9°° 901!! !!5 8£þ!Tþ øýApþŸÙzþ¸þŸy\|]2¬#°/± é± é°/±+01!5þ#wwÿÿ3• sH…Àÿÿ2¢& y£~ÿÿÿìþËo­(ÿìœ ²+²+°/±+01#¯í‡í ýÌ4Bå°/°Ö°2´+°2±+017'7'7537'#5L;ss;sws;rr;sw„gCBgB„„BgBCgB„„?o´ã P°/´+°/´ +°/°Ö´ +°± +´ +±+± ² 999±² 99901#"&546324&#"326´mMOlmNMm]5(&87'*3)NllNMmmM(56''74ÿÿdªÖM2ÿ·:„R²+°/°/°Ö± +°6°&±.ɱ.ɰ6º?õ<+ °°À°°À±..±..°@01'7ïK¤þöa$°¹„ ü?ø/FUþ™ÿÿÿ·:„+uÍ6f bÿÿÿ·:„+’|Î6f b||” 1R°,/°(3´ +°"2°/°3´  +°2°2/°/Ö´ +±3+±,°&9°´ $*/$9° ±99013267&#"72>32&#"327#"'#"&546u""6$>B!32#"'#"&5463267&#"2654&#"±U_ GQOBcYYa:WT""6$>B!¡'9!C”W M=CKWWZ47S!"<$X!$ @>K 8²+´+² +³@ +°/°Ö´ +² +³@ +±+01)3!Kýó]° þPäȲ+´+°/±+01!!äþ àý8È‚þ^Fÿò–¤"²+°/°Ö´ +´ +±+013FP²ýNÿÿFÿò6¤& i i ÿÿBÀ l`ÀÀBÀ²+°/±+0133xššxþîÀþòþ@(ÿÿÜü@²+°3° /´+°/°Ö´ +°± +´ +±+± ±9901#546 #54&#"†^ÌÌ]šcbš´ƒÆÆƒ´¾ZЉ[ÿÿ(ÿõÜò mñÀ<ÿ Ôÿ:°/± é°/±é°/° Ö±é±+± °9°³ $9°°901%#"'73254632&#"C1>9$ S{V%$$-9Z6$ sw@\wn 9Dÿÿ<ÿ öÿ# o" oÿÿ<ÿ ÿ' oD' o" oÿÿ…ÿÒ™©'y…'yEÿ)yÝÿ)ÿÿ‡3›  r ÜÀÿÿ2ÿÆ®å'yÿòÁyÿòÿÿÿ2ÿÆ å& t trÿÿ2¬Ç'y£ Zÿÿ2ÿÆßÇ'y"ÿ'y#£ Zÿÿ2ÿâù'yÿòÕ'yÿòÿ9'yXÿ9'yYÕ Zÿÿÿîßæ'y{ÿE'y| zÿÿŒß8aþÿÿ$ÿêе‡ z\ÿÖ@Àÿÿ5  }JáÀÿÿ2T×' z(Ÿ Z¨ÿÿ2ÿé<' z( µÿÿ.ߦ& zþn z¢ÿÿ2ÿçù' Zÿ; 2Sÿÿÿòßñ' z¹' zÿf zÿÿ24v' ¯» ÿÿ2ÿJ'y§þØ'y§& ÿÿ2ÿ~U'yZþÕ'yÿò1 ÿÿ2ÿ„S'yÿòþÛ'yZ/ ÿÿ@ÿŠÁI'yþá'y% «ÿÿ2ÿˆÁ?'yþß'y ÿÿ27&z}› ÿÿ27…g ¹/8T@ ÿÿ27¥/ kœÅ  ÿÿ27§/ lŒÇ  ÿÿ#7Aå/IÃÁ™/HìÀ™/G¿™ ÿÿ27Ë/PZø ÿÿ272/"—͸ 2ÿÄ!6²+° /°3± é°2²  +³@ +°/°3± é°2°/±+0133#3!#7#537#5!¯YM[ŸEäþØ@Y@c§Eì0!†wywppwywÿÿ2' ZÞ& Z% Zÿlÿÿ2ÿÚc' ‰ Zÿ.ÿÿ2ÿÚ\' Zÿ.! ‚ÿÿ2ÿK¬' Ò ÿÿÿ2ÿI©'! Ï ÿÿÿ(ÿöÐÚ&¿ÿÿ2ÿ÷ÚÛ •ÑÀÿÿ-ÿÄ'¥ zÿ8ÿÿ(ÿÄ' zÿ8!¥7h4²+´+° /´+°/°Ö´ +±+± °901!".546;#";~Es\3³˜”:Y66Y9Œ!FyR˜ž]$=J)*L?%]ÿÿ7i ™IiÀ7ÿÄ£9² +´+°/°Ö°2´ +±+±±99± ± 990133#;#"'#7&546;¹YPÎ9QŒŒnL4YMM³˜ß®E`)£;]þx&](d“N˜žþWK@Y6C6ÿÄ£7°/´+°/°Ö´ +°2±+±±99±±99013+#7#53&+532>54¸YLM³˜ Y PÎ9QŒŒnL ®E`)£‘N˜ž==]ˆ&](—þµ@Y6Bÿÿ2ÿÇÞ& ™v Zÿÿÿ2ÿÈÜ' Zÿ šsÿÿÿäê°/~6f Òÿÿÿäê°/ Z‹~6f Òÿÿÿäê°& Ò™Œ…6fÿÿÿäê°§ Z^&w&wÙˆ&w Òÿÿÿäê°' ¯ðÿç Òÿÿÿäê°& Ò ` j9™ÿÿÿäê°' Àÿ Òÿÿÿäê°/ Á³*= Òÿÿÿäê°& Òá<ÿÿ8_' lÿöŸ ZÿhÿÿBl& k Z Iÿÿ6|& lô ZYÊœ²+°3°/±+01!# #3Êž¶ºžM~þƒ›ÿÿÊœ «èœÀÿÿ=ÿÝ¿ ®üÊÀ=ÿ®¿í;°/±é² +³@ +° 2°/°Ö± é° ±+± é±+± °901%#".5332653¿M–\^˜M•ZS]Q’èLŽ``ŽLý÷PhgQ Hâ» (°/´ +´ +° /° Ö± é± é± +012#"&546” .," ,0»/ !-/2ÿÿ;ÿò·'yÿûä'yÿûÿIyÿû—ÿÿjÅ€@'yu'yÄy*ÿÿjÿó'yÃä'yv—y*ÿJÿÿiÿò'y)ä'yÃÿIyv—b~Ù2²+²+´+°/°Ö´ +² +³@ +±+01!##b¿]Ù]ý„JfÙ2²+²+´+°/°Ö´ +² +³@ +±+01##5f]¿Ùý'|]ÿÿb~Ù µÈÙÀÿÿJfÙ ´ÈÙÀ'V x(°/± é² +³@ +°/°Ö´+±+01!# þwxxª";”XV °/±é° /±+01%"05>32&K·Y9€UV€9YíYW9229WYÿÿ;ŽXP ¹“äÀÿÿÿ:Nê ¼g$Àÿ:Xê&²+°/°Ö°2´ +±+±°9013#YææYâêþ(þ(Ø êÈN²+´ +°2²+´+²+´ +°2°/°Ö´ +°±+´ +± +01%3!53!”Vþ X2ÈÈÈpÿæè ²+²+° /± +±± 9901#6ÏÏWÏÏs žžèþþþŒþäÿÔH L°/´ +°/´ +°/° Ö´ +°± +´ +±+± ±99±± 99012#"&5464&#"326¯½Üß¼»Þâ ¸˜—½»˜—ºã·±é믵åþfž·¾•–Á½ÿÔG #)/5;EPW]ciouP².+°d3°O Ö´I +°I°Y Ö°93´X +°:2°D/´? +°4 Ö°Q3´3 +°S2°v/° Ö°2´  +°2° ° Ö´ +°/°3´ +°2° ±=+°K2´A +°G2°A±+°2´ +°2° Ö° 3´ +° 2±w+± ±t99° ±p99°=@$'03e/>ýD> E ý> E üàED2DEü×E =E =ý >/›=."ýÆ/-Í/*2—^à N°/´ +°/´  +°/°Ö´ +°± +´ +±+± ± 99±²99901"32654'2#"&46æ<,,+J?WY=>XXx- +* !vX@=WX|X ÿ7ò Z²+´ +°/´ +°/° Ö´ +°± +´ +±+± ¶$9±¶  $901  .64."26x憇çþò憇nÂìÃooÂì†çþò熆ççþìÂooÂìÂoo ÿ8Š€›ÿ°œ/°8Ö´@+°@±W+´“ +°“±.+´( +°(±!+°š2±é°ƒ2³!+´# +°#/°H3´ +°y2²# +³@ +°±+´  +° ±‰+´l +°l±|+´+±+±@8°69±“W²53<999±(.@ &2OPR]^Ž˜$9°!°09±#²ab999°°x9°° 9° @ egrs…$9±l‰²999±|°901'#"&547&'#".5475#"&547&'4/&54>75.'67.54>7'>7$54&'&>54.'654°lnMQ'}p- # &p|(QM*eK)-%=/E  3:%&1% .4$!9/ 3;&)4% '.•%!-;)#Ø!()#"f‹Uhrn;0c (?* ;)< ?( c0;ooj6`S,U++R==&) (  7S/'G0*+/*2 !6T1)I1(*  (’Ð.SxC(iD3#<('<#"<'Q:Mÿìc0,²+´ +°2°1/°Ö´! +´! +±2+01%!527>7#"&54>7#"' =ý÷- % -6=W'0:797791(W=6- %99 (!V=(:*'7FuKJuE7'*<(=V! ÿ §Ô6T²+° 3´ +°,2² +³@2 +°7/°Ö´ +°±*+´  +±8+±°9°*³ $9014632>32.7">54#"#".aF4XX4Ec-9A<:==A8,§(2?Q\EA=%X#1!4+Ha9229`C-REFT^‡NQŒ`VDAJˆ:,$la},)^NQV(X++/8/ÿÈKì.'>7'67.K#P…+2wY`y),·ä8€|7#"&54632&5462632#"'Šýô$49'U)Ig^D i’i D^gIYC&?B%99$9$#*kKIh!HeeH hIKkP.A'ÿìcNˆ² +´! +°2² +´ +°,/°B3´ +° 2°O/°/Ö´ +°± +´? +±P+±/± $99° ·*,37BD$9°?²<999±!°$9°,°9°±*D9901%3&32654.'326!527>7#"&54>7#"' <C$/&4 49<=834&Jý÷- % -6=W'0:797791(W=6- h" )0,4% 5+-H+,I,+4 %4Nö99 (!V=(:*'7FuKJuE7'*<(=V! ÿŸ§Ô%²+°3°/°Ö´ +´ +±+012.54632>ÿEc-9A<9==A7-aFm8XÔ`C.QDFT^ˆNSŽ`UB@J)Ham76ÿÈKì .'>7KX¤'+ˆm`y),·ZdáLRº…t¢C9XõÿìùÕ+0AMYû²+´ +°2²+´. +²+´Q+´ : +°E3´  +°%2´4 +°K3´ +°2°Z/°Ö´7 +°7±+´T +°T±N+´ +°±H+´" +±[+±7´ 4:$9°T°9°N@  ,'.1@BQX$9°°9°H´%EK$9± .°,9°:± '99°4¶"17@BH$9°²X999°Q³NT$901%!5>7#"&54632&5462632#"''3&.#"32>76732654&#"74&#"6Šýô$49'U)Ig^D i’i D^gIYC&?BØC;%Z$48 * V ] <2f6,,5 /'b%99$9$#*kKIh!HeeH hIKkP.A';")4,/; %AC;.+8*©9: ;F&¶ L²+´ +° /°Ö´ +°´  +° /°´ +°/±+± °9±° 901%#"&46323L4-BB-3"+S%..J.-7¶X²+´ +°/° Ö´ +° 2°´ +°/°±+´ +± +± °9±°9± ° 901#"&46323#54.'.&L4-BB-6 *1P)*1E Óþ€%..J.-7&%{U88 &/ 7¸Ùв+´ +³+´ +² +°/° Ö´ +°´ +°/°±+´ +°´ +°/±+± °9±°9±±99± ± 99° ²99901#"&54632#"&46324O91DF/:#¯O6/EE/9"Qþ())(&-Æ•þ&--L-K7¸Ù“²+´ +³+´ +²+°/°Ö´ +°2°´ +° /°±+°2´ +°´ +°/± +± °9±°9±±99±² 999°³$9015%#"&54632#"&46325Žþ¦N:1DF/:#¯O6/EE/9"”?~Eyµ())(&-Æ•þ&--L-Ž`ÿÜÉÚ!a² +°/´ +°/´.+°"/°Ö´ +° 2°±+± é±#+±°9°°9±± 99°° 9° °901#"577>324&#"32>ÉIhk&'D  V_”&B >3*E‚T30 þ \TO5=þÙ G€‚ÿ*È M²+²+²+° /°Ö´  +°2° ±+°2´ +± +±´ $9°°9015775D×D×D“Ê ÍY þþWþpèEèVÿ;ÌúT° /°Ö± 22´ +±22² +³@ +° 2°±+±22´ +±22² +³@ +°2±!+01%555755757757775Ì>F€F,,,,F€F>>>„€J •-Ÿ›–ê– ¾¹2¾²™å4æ-ê ÿ8ÿ.5H¢Äæ,Ei¨׺^+²ˆ+²+²6+°c3´Ñv+°Ñ°í Ö´v+°a2°‹/¼Pš+´’ˆ6 +´’v+°#2¼X!ˆ6 +¸'3¼X+¼-È+¼Å<ˆ6 +¸F3¼Å+°Å»=Ń+¼”=+ºƒ” +»@ƒˆ +¼r~ˆ6 +¼r[+°ã Ö´Ö_+±Û6 À/°3´Ýú+±f6 À/´Ío+°/´Id+¸©/°ŽÖ°˜2¼N +¸N± +´  +° ±+´± +»±+´÷ +°÷/¼ +°±¹h+¼ +¸¹Ÿ+¼€ +¸€±»+°Á2´¦ +´£ +°¦¹x+¸2±­+° 2´A +»*A­+¼< +º*< +»@* +°A¹ +´ã +°ã±<+´[ +¸B2´^ +°[±É+´j +¹ª+°6ºú`À?+ °}°{À¹4$ù¸6ÀºÁËðö+ ¸9¹46¸6À±x%ù°zÀºÁô@+ ³yxz+ºùšÀR+ °}³|}{+¸4»546+º546 Š Š#9²|}{9²yxz Š Š#9A z{56xy|}9.........A z{56xy|}9.........°@¹N޲Œíý999° ²’999° ´ž¢ü$9°÷A  OòûIKP^`$9¸ºçab999°±½PQ\d$9¸hºôe999¸¸f9¸ŸA ‡ˆé¶êZ¤$9¸€¼!Xj%¦$9°»¼'op–™$9°¦½S¯¿Ã‚$9°£¹¨r99¸xA+-‚#$'02UVtƒ„’”$9°­¿€ªÓ -ˆŠ$9¸*»?Vå?$9°A±C~99¹ã<¹ÕD99°<´GXÅà/$9°^º>YA999±É[@ 154cfqwÏÙÝß$9°j±h399¹P‹°Š9¸^½% ~‡ŽN$9°’½8ABK\a$9°¸b9¸XA 12w”•Dd$9¸-»tIZe$9¸!¹3299¸”A $*=?Vfh’–$9¸<¼4/œ$9°Å°ò9¸ƒ»ô™$9°ãAq˜5å÷û xz€ŠŸ¤$9¸~°ç9°Ö»àj§$9¸r¸v9°ÝAšªÓÔÙ¶ßéêü opt$9°Û²jÉï999°Í²C¨¹999°í±»¦99±Ñ° 9±6@ Á9901&547.#>7&'32.'>?/4&54654'>32%267>7632327#"&'&/.'&547#"&'>7&'>;&5477654'4?&54?&5472>54'#"&'#"32?632+%>7.#"327'&5465.'&'6324654.'&#"3263232654&"#"'.'&'&'&'32?6=#"'>7>7&5472>7327"&+"27>32&#"54#"+654.'>7v60F\<+/I >0 š%$ =  *Š@i/CCC 2 ýÝ  'YT w` .)*DAcE‚ O(X6A($s Q.g-OM 6$" zt  $ Å tg Q ž<$ -.S+"-I$& ),þÁ8yZX&´O#$^&0 (E,! . %3 4(  kfd  :S” a#*ã$] aL-=5#,&; C  >    á4  B! þo  G+ˆ4,<0 9'2//@ Oý 7?C — {&q* $ F &&& ,/N ’>d& Y !o+4V Fm#%0#(EE 7@ l}E '! 03 $ þn5e5 m"!< "7)`  (@'M‰ ?  )W& ,, 1"'%llf JA/T‰8.:S0$Da* @$4fU< >  „  0)      ÿÿ ÿ7ò' ¯cÿÍ Â ÿ7ò ²+°3´ +°/´ +°2°/° 3± é°2° /° Ö´ +°2°±+°2´+°2°± +°2´ +±!+±±99± ±99±± 99±± 9901  .6!>!!%!.x憇çþò憇þšÅþ5þ—ÇÙiÆÌfĆçþò熆ççþYþ–ÇÚjÈÏeÅ×þ›ŽÄ ÿ9ð!!'a²&+´ +° /´ +°(/° Ö´  +° ±+´ +±)+± @  "$$9±&·#$9012".4>65432%'7&#"™Æ¹‡QQ†¹Æ¹†QP‡lýW«ÿÿsŒþ ÿýX­üýr‹‹!Q‡¹Æ¹‡QQ‡¸Ç¸ˆ£ýÿr‹þ!ÿY®ÿüsŒ‹ÞüýV$ÿö<\²+± é°/± é°/°Ö´ +° ± +´+±+± ±99± ±99± ±99±±99012"&4264&"vtRRtRoRtRRt/8ÿð0è =²+± é²+± é´ +± é°/±+±±99± ±990166  !."!268Þ<ÞÞþÄ_ú޶Žæþ޶ŽÎ<ÞÞþÄÞ¸WqqÏWqq8ÿð0è Q²+²+´  +°3± é°2°/°Ö°2´+° 2±+±³$9± ³ $90166  373.>7#5#8Þ<ÞÞþÄbGiÁxÁiGGiÁxÁiÎ<ÞÞþÄÞyiGÁÁGiþiGÁÁGiHˆØ *²+°3²+± é° /± +± ³ $901!#'#7# Ø@ØØ‘‘ J”llþ”þ”ôôä|HˆØ *²+± é²+°3° /± +± ³ $901!3733°ØýÀØØ‘‘þàJ”lþ”llôôþ|HˆØ +²+± é²+± é° /± +± ³ $901!!37#°ØýÀØØ@þàJ”JJ”lþ”llþ|l|0hâ [²+²+²+° 3´ +°2°/° Ö´ +°±+´+°±+´ +±+± ³ $901!#3$2"&4$2"&4ˆxxþßN77N7³N77N7Ø 7N77N77N77N0ÀØ!²+°3²+°/±+±°901#3#xÈ€ €)ýרý(0ÀØ!²+²+°3°/±+±°901%3#3xÈ€þøþ÷€¯)ý(ØHˆØ F² +± é² +± é´ +± é° /° Ö´+°2² +³@ +±22± +01!!!!!ˆþ8Èþ8ÈýÀØx¸x¸xØHˆØ F²+± é² +± é´ +± é° /°Ö°2´ +² +³@ +±22± +0135!5!5!5!5!HÈþ8Èþ8@x¸x¸xý(6ÿöØ #¥²+± é²+± é´# +±# é´ +± é´  +± é°$/°Ö° 2´+° 2°±!+°2´+°2±%+±³ $9±!³$9±±99±#±99± ± 99±± 9901!!2"&4264&"2"&4264&"6èþºtRRtRo/tRRtRo£x­RtRRt/þ¥RtRRt/HrØm² +°3± é°2²+°3± é°2´   +± é°/° Ö´ +°2° ´ +° /°3° ±+°2´+´ +°2±+013#3###53#533ŠèppèZèppèZØxþx0þÐxèxþÐHžØ 3²+° 3²+± é° /°Ö´+± +±²99901#! £ã~öVþîÿV`þî"þÔØþ²þÊTHÿöâP² +´ +²+´ +´  +´ +°/°Ö°2´ +°2° ±+´ +±+012"&42"&42"&4N77N77N77N7;N77N7â7N77Nþ7N77NO7N77NHžØ 3²+± é² +°3° /°Ö´+± +± ²99901%!£ã~÷Vÿýªxþî4,TþÊþ²Ø8ÿð0è ]²+²+°/°Ö´ +° ±+´+°±+´+±+± ±99±±99±³ $901 &6 >4&RþÄÞÞ<ÞþHWqqÏWqqÞ<ÞÞþÄ_ú޶Žæþ޶Ž8ÿð0è#s²+± é²+± é²+°$/° Ö´"+°"±+´+±%+±" ° 9°µ$9°°9±° 9°µ $9°±9901%2654''7&546327#"'&#"´l˜&þ™?•.U.HÞžze.U.HÞžzdg?Jl˜h˜lJ?þ™&0.U.ezžÞH.U.ezžÞóg&˜lJHÿìðì[² +´ +²+´ +´  +´ +°/´ +° /°Ö²222´ $+²222´ $+±!+012"&42"&462"&462"&4zD22D22D22D22D22D22D22D2ì2D22DýÚ2D22Dú2D22Dú2D22DHˆØ!²+°3²+°/± +±°901%#3#h‘±ØØôôØþ”þ”<|Ø M²+°3²+´  +°3± é° /°Ö´+°±+´+°± +´+± +013#333#!´xäxäxþ°¨0þÐþX0HˆØ<² +° 3²+±33°/°Ö´+±+±° 9± ² 9990135373#'#HUxUØØ‘‘ØØþ”þ”ôôl4,P°/°3´ +°2° /°3´ +°2° /°Ö°2´ +° 2°±+°2´ +°2±!+0162"&42"&42"&42"&4kN77N77N77N7[N77N77N77N7è7N77Nc7N77Nõ7N77Nc7N77NHžØ @²+± é²+± é° /°Ö´+°2² +³@ +± +±± 99013!!#HVþ"ÞûãØýºx`þî6æÊM°/± 33´ +±22´ +°/°Ö´ +°±+´ +° ±+´ +±+012"&4$2"&4$2"&4mN77N71N77N71N77N7Ê7N77N77N77N77N77N:+Ø ²+² +° /±+01 %5-5% þÿ!)þ8þýÈ)þߢj^iq¤k^^i¤pi0pØ=²+± é°2²+°/°Ö´+² +³@ +² +³@ +± +01)5333pýÀäxäx`ý <ÿð<è k²+° 3± é°2²+°3± é°2°/° Ö´+²  +³@  +°2°±+´+² +³@ +°2±+± ³$9012#5264&#"&63"3<žÞÞžl˜˜lžÞÞžl˜˜lèÞþÄÞx˜Ø˜ý€Þ<Þx˜Ø˜6Ø޲ +°3²+°3´  +±33± é±22´  +±33± é±22° /° Ö± 22´+±22²  +³@ +°2°±+±22´+±22² +³@ +°2±!+01#3#5##5#535#53533533#3#ÏZZxxZxÇÇÇÇxZxÇÇÇÇ™ZþÁÇÇÇxZxÇÇÇÇxZx4ØØ D²+°3²+°3° /°Ö´+°2°± +°2´+± +±± 99013#3753#¬xx´xx´Øþ´½ý(q´HˆØ6²+± é²+± é°/°Ö´+² +³@ +°2± +017!!!!ÀÈýÀ@þ8xxØxZÒØ'²+²+°/°Ö´+´+±+013#3ÒxxØ6Øh²+² +´ +°3± é°2´  +°3± é°2°/°Ö± 22´+±22² +³@ +°2² +³@ +° 2±+01!#5!5!5!5!53!!þÐxþÐ0þÐ0x0þÐ?xÇÇxZxÇÇxZ8ÿ ôØ U²+²+° /´ +° /° Ö´ +´ +³ +´+°/´+± +±³ $9013#32"&4ÒxxcN77N7Øüð7N77N?ÿðØf²+± é² +± é°/°Ö´+°±+´+±+±± 99°³ $9°±99± ³$9° °901#"&54?!5!32654&'²ÝŸ‰ˆ “àþ–AþºEG`P]SNCÆ3¹i†j_‘xnÙ.N5'QG+1B 6ÿöNâš²+± é²+± é´ +± é´ +± é° /°Ö°2´ +°2° ± +°2´+°2±!+± ³$9± ³$9± ±99±±99±±99±±99012"&4264&"2"&4264&"ˆtRRtRo/tRRtRoRtRRt/CRtRRt/8ÿð0èP²+± é²+± é°/°Ö´ +° ± +´+±+± ³$9± ³$90166  264&"8Þ<ÞÞþÄf˜Ø˜˜ØÎ<ÞÞþÄÞèØ˜˜Ø˜8ÿð0èa²+²+± é²+± é° /°Ö´+°±+´ +±!+±²999° °9±±99°² 99901%#"&54632/7654&#"32“ez Üá› ÜH=U“³T³'–ni›–nI8Há› Üá›|c=U”³T³=Li›–ni›<|Ø M²+²+°3´  +± é°2° /°Ö´ +° ±+´+°± +´+± +013###3!xäxäxPØþXþÐ0¨þÐ<ÿöøâM² +´ +²+´ +´  +´ +°/°Ö±22´ +±22´ +±+012"&42"&42"&4sN77N77N77N77N77N7â7N77Nþ7N77NO7N77N8ÿöHâ'–² +°$3´ +° 2²+°3´ +°2´  +´ +°(/°Ö°2´ +°2³ +´ +° ±'+°2´# +°2±)+±³ $9±' ³$9±#³ %$9012"&42"&42"&42"&42"&4oN77N77N77N7áN77N7áN77N77N77N7â7N77Nþ7N77NO7N77NO7N77Nþ7N77N8ÿð0膲+± é²+± é´ +´ +°/°Ö´ +° ±+´ +°± +´+±+± ³ $9± ³ $9± ³ $9±³ $90166  264&"2"&48Þ<ÞÞþÄf˜Ø˜˜ØEN77N7Î<ÞÞþÄÞèØ˜˜Ø˜¦7N77N8ÿð0èa²+± é² +² +± é° /°Ö´+°±+´+±!+±² 999°° 9±²999° ± 9901#"&546327'7&#"32654'0Ü ›áÜ ze=U=Hþ®T³@In–›in–'l›áÜ ›áH=U=c¦T³'›in–›iL=8ÿð¶è /9©²+´ "+²+´8 "+²3+± é´ 3 +± é°:/°Ö´(+°(±-+°#2´+°02°±+°52´ +°2±;+±-³%+$9°± 99±°+9°± -99± ±(99±83±#99°°%901$3264&#"72#"&54632#"&547&5463264&#"  ?W7UQ% Üá›%QU7W?>V _†‚c V"  «xW>2I%á› Ü%I2>WW> ‘ea– >W6rØ M²+²+´ +°3± é° 2° /°Ö°2´+°2² +³@ +² +³@ +± +01!##5333#xbbxbb0x0þÐxHˆØ &² +°3²+°3° /± +± ±9901373#'#H‘‘ØØ‘‘ØØôôþ”þ”ôôl8ÿð¶è :DÞ²+´> "+²+´ "+²+± é³( +°,3±3 é°.2²3( +³@31 +²(3 +³@(* +´C  +±C é°E/°1Ö°)2´0+°+2²01 +³@0. +°0±8+°#2´<+°2°<±A+°2´ +°2±F+±<8³%6$9°A± 99±>°69°C±8 99± °9±±#99°°%9013264&#"2#"&54632#"&5473533##5#&5463264&#"  ?W7UQ% Üá›%QU7W?>V P|KxMMxKyR V"  CþàW>2I%á› Ü%I2>WW> lPDDxDDNn >WŠHˆØ²+± é²+± é´ +°3± é° 2² +³@ +² +³@ +°/°Ö´+°2² +³@ +°2°± +°2´ +°2² +³@ +±+01!3533##5#!!ˆþ8|xppx|ÈýÀØx¸bbxbb¸xØ0•Ø"²+± é²+°/±+±°901!!b‡]ý›ìþŒ`ý(ØHˆØ5²+± é²+°3°/°Ö´+°±+´+± +017!3!3ÀPxýÀxx`ý(Øÿéô²+°/± +01 '%ŸEþîþaEÑ#cÀÅþÝcÀ6Ø;’²+±433²+±$33´  +°.3± é°;2´ +°-3± é°2°75.5353>53#4.'Ûxµx -=a;Qx;"x#I3x2H#x .<`;Qw:"x"I2¨”!908) —8AU23%$¨¨$&2 818*!˜8AU22$"H˜Ø(²+²+°/°Ö´+±+±°9013#3#'ÀxdìIØþ”q6ØF½²>+±-533² +±33´7E> +°%3±7 é°42´> +°!3± é°#2´> +° 3± é°2°G/°>Ö° 2´=+° 2°=±6+²E222´5+² $222²56 +³@5# +²65 +³@6 +°5±.+°2´-+°2±H+±E7±&D99±±99015!5.5353>53!!#4.'#5#4>75QQx;"x#I3x1H"x";wQþð;_<. x"I2x1H#x)>kE0x8AU23%#¨¨#&12V@8x!)808!2%#§¨"&1 'E::'H¼šØF²+°3´ +²+´ +°± é°/°Ö´+°±+´+± +01353!3Àbxþ®x4¤þäÿÿ(ÿË™'y¹u'y¹ÿ"!J(v"¿8°/´ +°/°Ö°2´ +°2± +±°9±±9901575"úúú#TXTóTXTÿÿÿéJÑhiÑÀÿÿ Ï?=&jÿVÿÿŽß &azPÿÿÿŽßõ&ay„Ñÿÿÿôß:&ayzÿKÿÿÿ8ÚÙ' « ìÿÿÿ8ÜÙ' ¿ ÿÿp*'y´'yÿÝ'y´ÿZyÿÝÿZÿÿ;[Û‡@@Àÿÿ)[ɇ*îÀ@ÿÿƒ['yÍL'yÍ7'yÍÿ\'yÇLyÕL@,è#~²#+´ #+²+± é² +³@ +°$/°Ö± é° ±#+±" é³"#+´+°/´+°"±+±é±%+± °9±² 999± ±9901#=4&#"#4&'.546323#,ˆ?/-<#22#|-F2‹n!;D1!þÀ––á :LB1!4(.K21& 1R?f€ "7bþp’ÿÿ ÿÆI\fýgÿÿ–Îÿÿ24$›F  @</ư/°Ö±é±é±+01#5Æ*8(‚þ¯Q‚<ÎÆ.°/´ +°/°Ö±é±é³+´ +±+01#'5Æ*8(‚²²‚(dÙr² +°3²+°3´ +´  +±é°/°Ö±é² +³@ +°± +± é°2° ±+°2± é±+± °9°°9° ±9901!3#!##"3"&5463­ —–þß–$K"`WofÙþïý'KþµCA'‚rZdmKÙ#ƒ²+°3²+°3±é°2´  +±33´ +±22°$/°Ö° 2±é°2² +³@ +°±+°2±é°"2² +³@ +±%+±°9°°9°°901#####535432&#"35432&#"KSŒ†ŒLLŠ)'&†Š)'&]þL´þL´]A‡i*5A‡i*5ùÙt² +°3²+°3±é²+±é´  +°3´ +°2°/° Ö°2± é°2² +³@ +° ±+°2±é°2±+± °9°°901#5####535432&#"ùŒŒŒ‡ŒLLŠ)'&Ù}}Èýï´þL´]A‡i*5Ùh²+°3² +°3±é´  +°3´ +°2°/°Ö° 2±é°2² +³@ +°±+°2±é±+±° 9°°901####535432&#"35Œ¢ŒLLŠ)'&¢Ùý'´þL´]A‡i*5È Ù)œ²+± 33²+±!33±é°$2²+±é´ +± 33´+±22°*/°Ö°2± é°2² +³@ +° ± +°2± é°(2° ±+°2±é°2±++± °9° °9° °!9°°#901#5######535432&#"35432&#" ŒŒŒ†Œ†ŒLLŠ)'&†Š)'&Ù}}Èýï´þL´þL´]A‡i*5A‡i*5 Ù'² +±33²+±33±é°"2´  +± 33´+±22°(/° Ö°2± é°2² +³@  +° ±+°2±é°&2°±+°2±é±)+± °9°°9°°9°°!90153######535432&#"35432&#"~ŒŒ†Œ†ŒLLŠ)'&†Š)'&Èý'´þL´þL´]A‡i*5A‡i*5ÿÿÿéZÙ'W&AAÿé•Ù?Dz+°63²+°:3± é°02²  +³@ +²%+´&+²+±,433±é°>2°@/°Ö°2± é´+° ±+°2±é°%2² +³@! +°±=+±.é°.±7+°32±6é±A+± ±99°±),99±7.°:9± ±899±&²999°%°!901!#5#"&=3326=#"5473;./&546;"!32653#5#"&5#$Œ:hV_ŒZ3>Їi*·.'&¿(0)Z3>ŒŒ:hV_Ž@WbY±”a:0å‰ '&-] * þ¥a:0Rýä@WbY Aÿé˜Ù7¸²+°(3²+°,3± é°"2²+´0+²+°3´+²5+°8/°Ö± é° ±+°2±é² +³@ +°±/+± é°2° ±)+°%2±(é°2±9+± °9°°29±) °,9± ±*99°±&'99±0°9°°901!#5#"&5332654./&5463!!!326=3#5#"&5$Œ:hV_ŒZ3> $.'&ÜWþ©Z3>ŒŒ:hV_Ö@WbYxþ¥a:04 -½]þa:0:þü@WbYØ &Aÿ8Ù5´²+°$3²+± é²+´.+²+²+±( é²( +³@(- +²3+°6/°Ö± é° ±+°2±é² +³@ +°±-+±,é°2°,±%+±$é±7+± °9°°09±%,°9± °9±(°9±.°9°°901!#5#"&5332654./&5463!632#4#"#$Œ:hV_ŒZ3> $.'&Ý:d 97 ŒV/=Œ×@WbYxþ¥a:04 -þõW'N5þ–Jd<.ýôD &Aÿ8•Ù.6¹²+²"+°3±* é° 2²*" +³@*' +²+±1é²6+±33±é°2°/´+°7/°%Ö°2±(é´4+°(±+±-/22±é°2² +³@ +°±+± é° ±+°2±é±8+±(°"9± °9±*± 99±16°901"&5463!!32653#5#"&5#3##"&=3326=#"3È;LQ6\Z3>ŒŒ:hV_ŽNÚ:hV_ŒZ3>Ä*´O@CS½þ¥a:0Rýä@WbYýá]WbYгa:0êhU'Aÿ8gÙ9Ų+°&3²+°*3± é° 2² +³@1 +²+´2+²+±$33´/+²7+°:/°Ö± é° ±+°2±é² +³@ +°±1+±0é°2°0±-+±é°±'+°#2±&é±;+± °9°°49±'°*9± ±(99±2°9°°901!#5#"&5332654./&5463!332653#5#"&5##"$Œ:hV_ŒZ3> $.'&ÑÚZ3>ŒŒ:hV_NŒË@WbYxþ¥a:04 -½þ¥a:0Rýä@WbYýyD &ÿÿIˆÔX'®ÿ5Ç”2-+° /±é² +³@ +°2°/°Ö´ +±+01273#"&'3™0d;#@Qdø55OJÿÿIŠÖX&Û±ÿÛVCX^²+± é± 22² +³@ +±22°/° Ö±é±+°6ºÁ–ñØ+ °.° .°± ù° ±ù³ ....°@01%+533>53CšYö{nŽm@‹à]ƒsåþ;1qþ=„X9²+°3° /°Ö± é° ±+±é±!+± °9°³$901##5>7'3>=3g"…ÄÈþš-  ‹ .¿Ão;2‹±¹A·Q$ #.”ž 63"-³þª8M5œ?0X8²+°/°3± é°/°Ö±é² +³@ +² +³@ +± +01!5!##RýíñS‹åssþO^X@²+°3° /± é°/°Ö° 2±é°±+±é±+±°9± °901.'!5!#!3Ó  þ  4‹ý|‹m sP&5%þŠ]þ£LX&1²+± é° /± é°'/°&Ö±é²& +³@& +°2±(+01. '!5!#!5!>7… !þL¿¡3Y-?+þA´&m sP'5$”‹+s >MîR² +°/± é² +³@ +°/°Ö±é°± +±é°±+±é±+±±99± °901#54>76=!3!M@[[?‹ )-'Dý|‹„œ2H)'=*ek*%  /B –P_X .²+± é°/± é°/°Ö±é°±+±é±+012!.'!!T>c8% üñ„.#þ‡ùX'7D3þXç"2 þŽ? X*²+° /± é°/°Ö±é² +³@ +±+01.'!5!#  þCÉ 4‹m sP&5%þŠ>§X(L²+°'3± é°/°3± é°)/°Ö±é°±(+±'é±*+±° 9±°9°± 9901.'!#'532=#5!# &+þ±  UA WB( 10&‹n&" ÿ2* ,tvüs#)9"þŠ2¬ÙA°/± é°2² +³@ +°/°Ö´+² +³@ +² +³@ +± +01!5353þ¶w#ww¶¶ÿÿLþÑ&׺ÿÿLþÑ&×»ÿÿLþÑ&×&ºµÔÿÿÿLþÑ'µÔÿ&×»ÿÿ=ÿrŠX&¾±;ÿÿ=ÿŠX&¾²,ÿÿ=ÿ”ŠX&¾µ&þ‘ÿÿMbX&µõ¿ÿÿ/÷X&µµÀÿÿ?6X&µ£ÁÿÿOdX&µ1Âÿÿ X'µÿÃ3ÿÿsX'µÿÄÿÿLaX&µ5Æÿÿ)X'µÿ'@ÇFÿÿ>ÿ8X&µ«ÈÿÿLX&µÛÉÿÿ>Sî&µÍHÊÿÿCyX&µCÌÿÿIgX'µÿHÎÿÿLaX&µ/ÏÿÿHÿ8NY&µMEÑÿÿOUX&µZFÒÿÿ=^X'µÿtÿÀÔÿÿPÿ8WX&µ)Õÿÿ?X&ÖµÌÿÿLþX&×µÔÿžÿÿ>­X'µ‘ØÿÿOÚæ&ónÿÿMbæ&¿¸0ÿÿLæ&¸ÉÿÿOUæ&¸8ÒSŠî-²+°/°Ö±é°± +±é±+± ±9901#53>753m_˜£þl‹Ë ‹±›BÔ9µ–þã*"œÿÿ.ÿþÛ®/-7T/%:ÏÂ2!²ÂÿÁr  $;°/´ .+²  +³@  +°%/°Ö´ #+±&+±¶ !#$901346323467>54&#"#3 m/)$0((c$8(oX/6'xxAþP°¯·3A5'+"&A*((A3Qg -NþÀuu°¯þQþmþ»ÿëÿì%²+°/´ +°/±´  $901#"&'#"&54>3267n ~ s /-(0*)/ 6>]U(+4*%2 pþGþ}ÿ€ÿìv²+±é°´ +° /´ +°/´ +°/°Ö´ +°±+´ +° 2±² 999°²999±± 99°°9°°901;#327#".'.546;53#"þ“$Á~ 7# B*6 .0LÇ&©C?L#*. %B8|þ-þ‘ÿŒÿçB²+° /´*+°/°Ö´ +² +³ +°±+´ +±°901#"&'4326753t˜<€ e4S1 ]Þ‘g=S  : >»ÿùh² +°/±é°/± é°/° 3± é°/°Ö´+² +³@ +°±+° 2´ +²  +³@ +±+±°9°°901726=35!5!####".'7À ÔþV–|pf X ( q!´œpqýðj$P hGþ&þ„ÿˆÿêq²+²+°3´  +²  +³@ +°/´ +°/°Ö´ +² +³@ +°±+°2´ +±² 999°°9± °901".'#"5462353'32=û/;! .EBNIŒ)(6þ„55/$76753#"þ(8P;.” T9)UN!7,"Yþ·.54&#"#"54323273þâLti#%)D. :>L @QCUþw>,&,0' g;1(K4=þ&þ}ÿ‹ÿë"|²+´ +°/° 3´ +° 2°#/° Ö´ +² +³@ +°±+´ +°± +´ +²  +³@ +±±99±± 99°±990153#5654&"3"&546þ¯T>JD>4CDA   =FVhSSU/?QH3-+  HS=8Mþsþ¨ÿ‡ÿà:°/´  +²  +³  +°/°Ö´ +² +³ +±°90147332>32#".þs 3+%  ?153‚7+- 0E, ' " 7M-Xþþ»ÿ»ÿà °/´ +°/° Ö´ +01#"&'3¹0 +µ.5¥ 2¥€.þhþXÿñÿñ5²+°/´ +° /´ +° /± °9°´ $901#"&'#"&546326735!˜*T t 1,/)7, /a  âiwOT'-="#C A' þÊDDþ-þLÿ­ÿñ^²+°/´ +° /´,+°/°Ö´ +² +³ +°±+´ +±±99°°9± ±9901#"&'43267535!s—<€ e4R0 `þ·i£‘f>R  : ?‹þ[DDþWþXÿÁÿúQ²+°/´ +° /´ +² +³ +°/°Ö´ +² +³ +±°9±°90132>32#"&54735!þÀ3" "4.;T .ij8]M012I]m/*þpDDþˆþXÿñÿâ°/´ +°/01#"&'&'35!¹0 !v5'5Ui‹")K;,>%þ›DDþhþ5ÿæÿþ"&?²+°#/´$%+°/´ &+°/´ +°'/± °9°´ $901#"&'#"&54632675!5!s  &5 s 4%0(03"-¨Lþ°L' H)4> "þÀ55‰66þ-þ4ÿ»k²+°/´*+°/´)+° /´*+°/°Ö´ +² +³ +°±+´ +±³$9°°9± ±9901#"&'43267535!5!s—:‚ e4M!0 `þ¶xþ„xh›c-S  + ?nþ©11u00ÂÀf (°/´ +´ +° /°Ö± é± é± +01"&4632n"00"$..Â0D01B1ÿñþ•ɾ,6@[²&+°3²<+°@3°9/±>é´/4<& +±/é°/°3± é°Y/°I3°P/´D+°\/°Ö´!+²! +³@ +°!±A+´R +²RA +³RU +°R±+´ +° ±M+°2´F +²MF +³MK +°F±+´ +²  +³@  +±]+±!³12;<$9±R²%&C999° ¶/49>OP$9°M°D9± ³-67@$9±>9±7;99±4/±-199°&±2699°°9±PY±FA990174675!5!!5>54&#".#"'5327#"'5327462#"4654&"#"&99°@± 99°U±9±R³$*38$901#"'53273254&#"' 76?&#"%2>32".5432#".=#53>32;+tha]]f]c]þk`ZiH+)‘2F ·¿Ì+5  30603 ´-b^u`$AJ?:)LM ©Ž‹£Gêê¸((r)'hWaE)OñO:832#".54632#".=#53>32;!!#Dia\]c_d]m]Z_f\e\þ‹ 1N2hG+)‘2 F ·¾Ý+5  ,'13 «)e]u_4[eG/KL ¨Ž‹£C ÿ þ¶((l('E''m)(N%6= E)OñGB8=p««-6-+#&;! C0!++>ÿuBH^SfCm¿~p—“…pÿ÷ÿùf´ -Rݲ7+± é° /°3±é°/±.933±P é°;2°*/´+°M/±Bé´"+°2°S/°9Ö°<2´+²9 +³@9: +°9´P+°±+´4+°H2²4 +³@4R +°4±+´ +°± +±T+±P³7M$9°4±199°°.9± ±)*99± °19±M°9°"´ %H$90132654&#"'326767!432327632".# #53>3#.#"!Ø3O-;2]4„#nMc,5 þnp,;` 30613mK8^w]þ•UX/DvK`'7#C@Y a\"}4@*,1Bk)2=€M*/7f*,"/C Cþì+j#E^Shp@]F2&Yspÿÿÿöÿ¼æ'‹ÃhjÿÿÿòÿÄ)&m‹ñpÿÿÿðÿ³Ô'‹Ì_nÿÿÿòÿÛè'‹Ç‡oÿÿÿöÿÄ'‹ÃIpÿÿÿ÷ÿ½¯'‹ÒirÿÿÿøÿóÀ'‹Ô§sÿÿÿôÿÿ'‹Ëotÿÿÿòÿ¼Ú'‹ÄhuÿÿÿõÿêÊ'‹Õ–wÿÿÿ÷ÿÀè'‹ÀlxÿÿÿøÿµÁ‚'‹ËayÿÿÿøÿãÄ‚'‹ÄzÿÿÿöÿÛÊ'‹Å‡{ÿÿÿóÿö«'‹Í¢|ÿÿÿöÿ±¯'‹È]}ÿÿÿ÷ÿõ¹'‹Ä¡~ÿÿÿúÿΤ'‹Äz€ÿÿÿúÿž¢'‹ÆJÿÿÿ÷Í'‹ÐÜ‚ÿÿÿóÿË'‹Òwƒÿÿÿøÿç°'‹Î“„ÿÿÿ÷ÿø§'‹È©‡ÿÿÿòÔˆÿÿÿôÿ¾Ÿ'‹ÊjŠÿÿÿ÷ÿô•'‹V `ÿ÷ÿò” N²F+²+± é°'/±=A33±( é°92²'( +³@'@ +°O/°Ö± +´J +°J°6 Ö´+°/´6+°J±F+°82´E+°E±@+´?+²?@ +³@?= +±P+± ´ $.$9°²2M999°J°K9±F³ KM$9°'´ .68G$9°(°290162#"&5474>54'#"54>7654+532>7675;!##+##"À$-"¹%+%#eM .-R /F\-A -2U,0,7BŽaÿ„p aqY6(/Vr" -"':*:GC@h_;E  +(pP"0,,62I^!ÊpþéýïI.44A8ÿÑÿ“°¥ GL²=+².+±"é²". +³"' +°=° Ö± é²+² +°/±Jé°J± é°?/²8H333±@ é°2°/±Dé²D +³@G +°M/°=Ö°A2´<+°2²=< +³@=? +°<± +´+°± +´G+°G±K+´+°)2²K +³@ +±N+±<=°B9± ³48D$9° ± 99°G±6H99°K²."999°°%9±"±499±J°6901$2#"&54.#";!#&#"32>32#".'67&'+##53>32375$-"$>?'cˆ|–;^> $‰I"9 'J//±é°±< é°!/² 48333±" é°22°(/±/é²(/ +³@(, +°M/° Ö´+°±+´<+°2³+<+´,+°,/´++°<±7+°%2´6+°22²67 +³@64 +²76 +³@7! +±N+± ± 99°,´ CF$9°°>9±<+°I9°7±(/99°6°19±°90162#"&54375#".'67&'#5!;.#"#46323##+&#"32>321$-"Ï-kl'J/?"m^ygl‚‚oW%—;^> $‰I"9 4" -"üxuþ{ -4%(P5^G5spbY0Lov„ pýïæ&#Cÿÿÿ÷ÿ#™'ü&©‹Í~ÿÿÿ÷þ™™'ñ&©‹Î~ÿÿÿøÿÂãž'‘ãÿý&¨‹Înÿÿÿ÷ÿö•Í'’€&`‹\¢ÿÿÿ÷ÿì´'‹Ç˜hÿÿÿ÷ÿé•Ï'”R&`‹V•ÿ÷†fEO˲=+°/±3833± é°-2² +³@7 +°F/´K +°P/°Ö±+´A +°A°* Ö´+°/´*+°A±=+°,2´<+°<±7+´6+²67 +³@63 +°7³7I+±N é±Q+±² "999°²&D999°A°B9±67±FK99±=²"*,999°°&901%4>54'#"54>7654+532>7675;+#+##""&4632L%+%#eM .-R /F\-A -2U,0,7B€^Á00Tp^qY6(/V"00"$..z:*:GC@h_;E  +(pP"0,,62I^!ÊpþéýïI.44A8ˆ0D00D0þGþLÿ·#²+±é°´ +²+´ +²+° /´! +° /´&+°$/°Ö´ +°±+´ +° 2±² !999°² 999°²999±° 9°°9°°901;#327#".'.546;53#"5!þ“$Á~4$ B-8$ .0LÇ&Fjx3267n ~ s /-(0*)/ 6>]U(+4*%2 pþÑ ÿLe$°/´ +´ +°/±+´+01462þÑ&0% ,,þðÿÿ`ÿÄ =°/´0+° /´ +° /°Ö°2´+´+°´  +° /0135>5#þðp*F&@<;38 *$ÿÿç#y­"y#y7"y#óóöýöRQÚu²+± é²+´ +² 222²+± é²+±é°2°/°Ö´  +² +³@ +° ± +´  +° ±+´ +² +³@ +015!##5##5##5ýö[\‹\\KK//==//Dÿ&•ÙV²+² +²+± é²+°3°/°Ö± é°± +°2± é±+± ±99°°9±±9901#"'5326=#3•;A$/ þÛ–š!ÙüÉB:p?øþÙþð( i²+±é²+´+´ +´+°/°Ö±é°2°±+±é° Ö± é±+± ° 9±°9°° 9°° 901%#!!2%3254#32654#agþï_\A$,þ´eOOeq*(Rœ<`]1I&Güy=<Ö‚!Gÿÿ(ÿé%F(@²+´+²+´+°/°Ö±é°± +±é±+±±9901332#'3254+(ò{{|ze[ss[‘ú’]±²(Ð S²+´+²+´+´  +´ +° /°Ö±é°2² +³@ +³@ +³@ +± +017!!!!3µþX›þòùéŒ]]z](¸ F²+²+´+´ +´+° /°Ö±é°2² +³@ +³@ +± +017#!!3µþýãéé]y]"ÿé&ƒ²+²+± é²+± é² +³@ +´ +´+° /°Ö±é°±+´ +² +³@ +±!+±³$9°±99± °9±±9901.#"32>7#53#'#"&54632‚)%=8=7 "RÙMEX}‰}Z€h)#^IX[0$]þÜ3¡‚z iU(ñ B²+° 3²+°3´ +´+° /°Ö±é°2°± +°2± é± +01%##3353#d®ŽŽ­ŽõõÊÊýä(µ!²+²+°/°Ö±é±é±+01#µýäÿé‰?²+± é² +³@  +²+°/°Ö±é°± +±é±+± °901".=33253Ì=9#-Žh%E/54$"?þqMW(& 0²+° 3²+°3° /°Ö±é°2± +±± 99017#373#'µÀ—×ñ’¬µµÙÙßþÃë(¥/²+´+²+°/°Ö±é² +³@ +±+013!¶ïþƒþ@](_ в+² 333²+±33° /°Ö±é°2°± +° 2±é±+°6ºÁ‡ò+ ° .°À±&ù°Àº>|ò*+ ° .° À±'ù±°À² ...´ .....°@01#33##µºb_¼ŽUp‡þyþS­ýä‡þy( H²+°3²+°3° /°Ö±é°±+± é± +±°9± °9±±9901!#33…ÏŽ‡Ìbþžþ¥[ýäÿÿ'ÿé=%Rÿ(ä H²+²+´+´  +´+°/°Ö±é° 2°±+±é±+± °9017#!2#'32654&+¶Ž Mb]GŠJ&0-)JÁÁ^INf]()&+"ÿØ8%V²+± é² +± é°/°Ö±é°±+± é±+±± 99° °9±²999°² 99901%'#"&632"327'7654&39:>U}ŽŽ|:Ñ9FF9-8+E<7&™ ™™‰sJn`š`*<)*6P_(ø%ƒ² +°3² +´!+´" +´+°&/° Ö±é°!2°±+±é°° Ö±é°/±é² +³@ +±'+±°9°°9± °9°"°9°!°901%4654&+#!2#&4&+326[!$k„7ND[Œ'(rr('] "ÖY8b$ .-. [*Œÿÿÿé%V÷ ¼=²+²+´+°2°/°Ö±é² +³@ +² +³@ +± +01##5!-Ž•²¿þA¿]](ÿèý7²+± é²+°3°/°Ö±é°± +±é±+± °901".533253.NF(0-]Ž*GN+P7nþ’-3`nþ’7P+ÿÿYüÿÿZÿÿ [ú ô0²+²+°3° /°Ö±é± +±°9±°901%#5373J³”e]”¼¼¼`ÚÚ ùj²+°3´ +²+´+°2´ +´+´  +´+°/°Ö°2± é°2² +³@  +³@ +³@  +±+01%##!!3#!!=#W¥(€Ãþúòòþ^2Tqq\z]Œ]Îòò(îQ² +² +´  +´ +´ +´+°/° Ö± é± 22° ±+±é±+±°9012+#33254&+?5I#YK”ŽŽTV*,TÄ65S`hXÿQ*'ÿÿÜ]ÿÿã8,#n²+± é²+± é°$/°Ö±é°±"+±é±%+±²999°"³$9°° 9±²999°³$9°² 99901'7&546327#"'"7&32654=&@5Ž|gB5&6>{nF´9F Ä!>É#88G"GIr…™3:";L€‚˜=Ž`M+#Ù"OÝ._L7(ÿé'"² +²+´+²+±é´" +´+°#/° Ö± é° ±+±é°° Ö±é°/±é² +³@ +±$+± ³$9±°9±"±99°°9°°9012654#"#4632#"'52654&#="b5)Ž`aŠ4 1å*1'Z99GR!83/þœ|L_MFT T$½[)#6. . z²+´+² +´+´ +° 3´ +°2°/°Ö° 2±é°2² +³@ +² +³@ +°±+±é±+±°9°°9°°90173254+3#'532+5#5Ó[ss[OOò{{|zò<]±²‰;;æ‘ú’ü; à P²+´+² +°/°Ö° 2±é° 2² +³@ +³@ +² +³@ +±+± ±99013!5573/[ïþƒ<<Ž“A<¹]¹(B'#Æ  /²+°3²+´ +´+° /± +±° 90133#'#73' º“½” ¤8n9ýämmÊÁ"ÿéU6 x²+± é²+± é²+°!/°Ö±é°±+± é° ° Ö´+°/´+±"+±±99°°9° ° 9±² 999°± 9901"32654&7#"&632654'3-9FF98GE 1{}ŽŽ|sE i)´`š`_LP_ Hr‚˜™ ™? ":(ÿè;˜N²+± é²+±33° /°Ö±é°± +±é³ +´+±!+± °9±°901".533253254'33.OE(0-]]j.(*GN+P7nþ’-3`n[ #<þ’7P+ÿÿ(µç& ¬yÌ*ÿé-Ú %ˆ²+± é²+±é² +± é²+²#+°&/°Ö±é°"2°´+°/² +³@ +°± +±é±'+±°9° ± 99±±99° ±$99°±"9901"32654'2#"&547.5463!#"6_hBA54BuuŒˆ|y†VZLú2.°]JM^^JKÔž€Ÿ–‡ˆS0$;Sj) ó„%°/± é°/°Ö´ +±+±°9013#ˆdP„x ó„%°/± é°/°Ö´ +±+±°901#7óœPd„xx E„(°/°3± é°/°Ö´ +±+±°9013#'#skgXHHV„x<< E„*°/± é°2°/°Ö´ +±+±±9901#'373ÙkgXHHV x<<ÿÿ ±„' ʾ Êÿÿ ³„' ÉÀ Éÿÿ(ÿéçç'µcGÿÿAˆç'µOÿÿÿéËç'µGWÿäê°N°/´ +°/´  +°/°Ö´ +°±+´ +±+±± 99±² 99901264&"4632#"&`«ò««òíÏ—˜ÎÈžÉÃò««ò«þÜ–ÐÎþÐÎÎÿÿ(ÿéÔ ÿÿTÅÚÿÿ( Ô ÿÿ(ÿéÔ ÿÿÅÿÿ(ÿéÅ ÿÿ(ÿéÔÿÿÅÿÿ(ÿéÔÿÿ(ÿèÔ ÿÿÿéÔ&y’zÿæ“z5=Û²+°&3°*/± é°/± é° /±833± é±é°>/°/Ö´+°3 Ö´:+°±6+´+°±+° 2´+² +³@ +² +³@ +±?+±3°19±6:µ(*$9°µ#&$9°²!"%999±*°%9°±"#99°³!/$9°²1999° ³ 3<$90123275#5!###"'>32&'#".547&5464#"6ÃEPH=e$Po>GK74(*(6"2c8 # 85!X4Va&!#$nP6.%ZppýâM3*+6P)H#8&G/JB3@=E‚$ÿöÿ¨Ñy5Œ² +°3°0/±é°° Ö±3é°/± é°/° 3± é°6/°.Ö´+°± +°2´ +² +³@ +² +³@ +³@  +±7+±.±99±3 ³ '+$9°0°.9014>3!5!5!##!327632'#"54>3232654"#"&+'" ŠýëÛUqþž"  = *2 80XU‚ ‹! (3; /Au‡&5ppýäwA2.>OF{V" * zÿöÿâÓyv² +°/°3± é°/° 3± é°/°Ö´+² +³@ +³@ +°± +°2´ +² +³@ +±+±°9° ±99± ±990147#5!5!5!###".’ tâýëÝWq°!*S3M]Zs@qqýäj) "…+YQ§ÿöÿíŠy>²+°/°3± é°/°Ö°2´+² +³@ +² +³@ +±+015!##5'%&''>325 ”XoþþDÿJ *$5 >$¯+I;qqýåÇ”Y”N  [H5;¥ÿíæy1=¼²+°3± é°/°3± é°2°±6é°>/°Ö´9+°9±2+´+°" Ö´+°±+°2´+² +³@ +² +³@ +±?+±9±%099°"³(6<$9±2±'99±´ $9±±%99°¶"$&9<$901463273267#5!##5#"&547'7''>7&74.#"6dN GcsH\ 6,  ÿìªy)v²+° /±"33± é°2°*/°Ö´%+°%±+° 2´+² +³@ +² +³@ +±++±%²999°³$9± ´ %($901463275#5!##5'7''67&7.#"6wY2>T9i&NPpþß>Ñ[–I6m0®  ýB:C9D4RÂppýãݘ]oHF\85. ÿí©y/;§²+°/±é°/°3± é°2°±0é°T8K +" %6MPq/*5B.CšI6m0Y3  yC9D33 j$&sppýä4!G0P8G\858B:h   ÿöÿØ¡y1o°/± é°//°3±0 é°2/°-Ö´+²- +³@ +²- +³@-/ +°±+´+±3+±-±!99°µ  $9±³'(+$901!632'654&#".'732=!5!¡þãCi*VX#"%?+" K":D,eZ+=(þâ« < ]B":8LM1 -- R!?[<‘,=; .mpÿöÿè y7Ÿ² +°+/± é°/°3± é°8/°Ö´+² +³@ +² +³@ +°±5+´.+°.±(+´+±9+±± 99±.5³2$9°(²"1999°°!9±+ ±!99°² 999°° 901.'732=!5!!3632'>74&#".547^%<0'#M_|qZ+=(þâþx`"%CgF^ ' //=5#)>,"ToŸ¡=; .bppey]ls= !!,!!@ f ^8 ÿöÿì[y(Ÿ²+° /± é°/°3±& é°2°&°( Ö°3± é°2° /°3± é°)/°#Ö´+°±+° 2´+°2² +³@ +°2² +³@ +±*+±² &999± °9°³ #$9±(°901&#"2675!5!#632&#"#5#"&5463288!$&3>þ£e™/87o69FvfK%:S+:-#þppc+}33þð• oEVhÿö•y4‘°/±/ é° /±é°/± é°$/°'3±% é°5/°"Ö´)+²)" +³@)' +± 122²") +³@"$ +°)±+´+±6+±±/99±/°29± ² ,1999°³ $9°²99901&#"3267#"&54>32 7326=#5!!327N#6%';!AICX'/# »þëX^ áŸþ±E2aNƒz#–€#u8OA$8  þ*‡5Dlpp„5:7Sr#=ÿöÉXyV°/°3± é² +³@ +°/° Ö´+² +³@ +°´ +°/² +³@ +±+± °901##"&54>;5#5!X_,r'“b ø (x%rpÿöYÛy'†°/± é°/±% é°/°3± é°(/°Ö´"+²" +³@ +°° Ö´+² +³@ +° 2±)+±°9°"°9°° 9±° 9°± 99°%°9°°901"3267#"&547.547#5!!;þ'!0‰&,-"/Ds&&#=åþß 5W!'7‚  PM4,Tpp!'tÿöfúy\°/± é°/° 3± é°/± é°/°Ö´+² +³@ +² +³@ +±+±°9±°9°±9901!5!47#5!#327#"&úýüþ’(‹uP 3dm0bG>W pþ82ooJ u€41Tÿö`Kyd°/± é°/± é°/± é°/°Ö´+² +³@ +° 2² +³@ +± +±°9±±99° ± 99°°901!5!254.'5!##".'7Ký«Uþú(%2~#9%,Q:3 kW pþW+H!'p"(*.#-D]Q++þûÿöÿ_Ay=º²4+´: +°/±é°& Ö±!é°° Ö±é°/± é°/°3± é°>/° Ö´ +²  +³@  +°´+°/² +³@ +°#2±?+± µ4:$9°´*1$9±&4²*7999°:±$99±!°9°°#9±° 901%>54#"#"&546;5!5!##32632327#"''&'.54632"8L;u1©þÐK¬å (V/7+0 k#@PdLW.!9g,†F%$6pp¥'$"„h- _ /j64$+!ÿö06y+o°/± é° /±é°&/± é°/± é°,/°#Ö´ +°2²# +³@# +±-+± #±99± °9± ³ #$9°&² (999°°)901!5!2327#"'#".'732654&#"'>6ýÀ@þÆ’00# 0nJ !ILK-16"+"MX p¨  u JU ZO5+'6]ÿö¹›y U°/± é° /±33± é°/°Ö´+² +³@ +°±+´+² +³@ +±+±°901##"&=#5!2=#›,\DG_3¥Ñ6h ¨I_^E­pþ¯Eœ %ÿöÿïÆy?²+° /± é°/± é°/°Ö´+² +³@ +° 2±+± °901!5!4>3!!".Æþ0Ðþc 2##þýy4MP~ pþÅ--o5—)RF³(^ v*u° /± é°/±é°/±# é°+/° Ö´+°±+´&+±,+± °9°³#)$9°&± 99± °9°³)$9°±&99°° 901%270#".'3254&#"327"54632=sp8:"Q‚@>.”3" ¯f?PlbV#Ñ–  Yu6e!/ e>NtLMgÿöÓy*r°&/±!é°/± é°/± é° /° 3± é°+/°Ö´+² +³@ +³@ +±,+±²999±!&°$9°±#99°±99°±9901747&546;5!5!##"632&#"327#".M=?9zþÛÝHÑ )#'+&;leC1I&º%%,=5;,pp› m/p- 35(Sß{,¨°/±' é°!/±é°/°3± é°2² +³@ +°-/° Ö´+° Ö´#+°±+´+°±+± é°*2±.+± ° 9°#°9±²'999±± !99±'°+9°!° 9°² *999°± 9901#53".547&54632#54'"6;"3267ß““ã1I!+UV26Pp**0/ ¥ )6Y54'#5!#&724BkIXfŠ"')˜Å©Á/Z'W…@‚h (pp"ÿöÿðy!?²+°/°3± é°2°/± é°"/°Ö´+±#+±±99°°901!5!.54632>7"'67&#"ýÙ'þ{G0#EG4"mRWA%B63] i)(5 pþˆ:ba0;T/Mi>"pe=./!$#ÿö2Žy)4j°/°3±3 é°2°%/°-3± é°2°/± é°5/°Ö´0+°0±"+´ +±6+±"0µ*$9±3°9°%± 99°°901!5!>32#"'#"&5463232654&#".#"26Žýh˜þÍI$N]%?(V,.WO]cNOj/&s) B& pî"oX39+AFtZQvÈ =:8* #2'/5*@ÿöÿiŽy,7t°/°3±6 é°"2°(/°03± é°2°/± é°8/°Ö´3+°3±%+´+±9+±3°9°%· -$9±6±99°(±99° °901%'!5!>32#"'#"&546232654&#".#"26%fffÏýh˜þÍI$N]%?(V,.WO]bžj/'s) B&5fff:pî"oX39+AFtZRuÈ =&-:( #2'/4+@ÿöbyC° /±é°/± é°/± é°/°Ö´+±+± ° 9°²999°°901!5!2>7#"&54632&#"þfš©%A%L[MsdL:00$#'3 pþWƒCePMon-/ÿöÿãÏy#P°/±" é°/±33± é°$/°Ö´ +² +³@ +±%+± ² 999±"± 99°°9017>7#".547#5!&#"32bHžLþÎF7)Q%#10 ^Ù£. 15O…‰O R/) 7$!pp00ÿö‘„y P°/± é°/°3± é°/°Ö´+² +³@ +° 2² +³@ +±+±° 9°± 99017"&=#5!#'327'îRs3Ž¿¿S~.%'—‘`IÏppÉo%¬%žÿöÿä4y `° /± é°/°3± é°!/°Ö´+² +³@ +°2² +³@ +±"+±² 999± ² 999°± 9901.'7326=!5!#3#T"5"e'H@-MYZ+;þâ>°±Ì,7ƒ%HJ7i(} =; vppy oÿöÿ‰Xy'†°/´+°/± é°/± é°"/°%3±# é°(/°Ö°2´+² +³@" +°± +´&+²& +³@& +°$2±)+±°9° ´$9±°9±°901!!.547.5463!5!5!#£”þ‰4%1%%5"7%$;!6/(þ@b2d!q'"6["/C(D."N(-6pp¥ÿö þy,-°#/± é²# +³# +°/± é°-/±.+± #°901!5!4>32#".54676?.#"#"&þýøþ*;`9<80BÏJK""À &'^ pý%"9K?s. /c5qÿöøcy,° /± é°/± é°/±+± ±99°±9901!5!27#"&'5 cþ“mˆ=K%)0   pþî#v +o  )ÿèl08­²+°"/°3± é°/± é°3/±,é°9/°%Ö´ +² % +³@  +°%°) Ö´5+° ±1+´/+±:+± )°'9±15´ ",$9°/µ$9±"°9°±99°² %999°² '999°3³)/7$901327#"'4632&'"#"&547&54632'4#"6VmAAmH:3 (+*4# d< GbX5Q@BUp'!%#”#t2*+5(' L'0aMLA2A7KDB(,(ÿöÿ¨ y/i°/´ +°+/± é° ° Ö±'é° /± é°/± é°0/°%Ö´+±1+±%±99±²"#999±'+±%99± °901!5!463!!327632'#"54632>54#"#". ýìþ!3#‰þŸ + E*4tXU‚ ‹4 C@% *J+ pñ#(o D/i+PE{W% % -A=ÿöÿîyM²+°/° 3± é°/± é°/°Ö´+² +³@ +° 2² +³@ +±+±°901!5!47#5!#".ýèþ„ tåÀ!*\7B`b pþ¤pp( y/YTÿö ðy°/± é°/±+01!5!'%&''>32ðþúþÑDÿJ™@0§);/5 pþT­Y”PPUN&,5ÿëVu(3n²+± é°-/±é°4/°Ö´/+°/±+´+±5+±/²&'999°³ -2$9°³ )$9±±99°-¶2$9014>327327#.547'7''>7&7.#"6‰3:?S:?W1‚&9c%L5=OŽ=ß)–F8;/®ù.<C9B53)b@11s’,%M< HcsHV "4. 1ÿyH°/±é° /°Ö´+°±+´+±!+±³ $9°±99°±990146327'7''>7&74&#"6eN<=V:iNþ¸>Ñ\bN>l /­ ý9CC9C5R)~­]oH;%c 96,%y+3}°/±é°./±é°4/° Ö´)+³0) +´+°/´0+³,) +´+±5+± °9±,0²999±)³!&$9±°9°.´ 2$901%2>7#".547''>7&54632&#"4#"6€ 88J5=(>!”D-<0O<=U8K.4""&G  nv4"F0V2F]757EC9D33 l$&…$%ÿpÿø„$° /´ +°/°Ö´  +± °9014>32&#"#.ä#5%1(&/1T9(#0 NB5F@þ ÿÿüÿò²+´ +°2°/±°901#'#73zv†|ÞLúìnz[f% ²+´ +² +³@ +°2°° Ö´ +² +³@ +²+°&/° Ö´  +° ±+´ +°° Ö´ +°/´ +°±+´ +±'+± ²999±°9±°"901#4#"#"&=332632#54#"&=332ôS2q'CV'O9QgS)7V&,z)O/9!DE#>-8$% ;'ÿÿþup>„&%ö FÿÿþQp[ˆ&&ùö cñy",T°&/± é°-/°Ö´)+°)±#+´ +° 2²# +³@# +±.+±)°9°#±99° ³ $901&54632''6"&547%4&#"6‰/Y2/.9]fQT`06~*› S ‚48=N 9(C4K8B5$fþ¹B7 |I ×  ÿöy#~°!/± é°2²! +³@! +° /± é°/± é°/± é°$/°Ö´+² +³@ +² +³@ +³@ +³@ +±%+±² 999±!°9±°901%"&5467;5#".546;5#5!#";3#G f! ^%6 S.Gûj¶Íœœr#-*1B7pþê}r;ÿöÿùäy!<²+°/±! é²! +³ +°/± é°"/°Ö´+±#+±°901!5!#"&54?".54>3äþîr}r’,\SEfr 2# p® @1B4<&<2N>§`--ÿö¡ye°/± é°/°3± é°/°Ö´+² +³@ +°2°° Ö± é° /±é²  +³@  +±+±°9±± 9901#".547&=#5#¡ìV1B(6D$.:«ôjtKY&=H'@}qoz ÿöpyP°/±é° /°3± é°/° Ö´+² +³@ +°2²  +³@ +±+± °9± °90127'7"&=#5!#ëS2þî<¶>q3zØ./8Á£[mc; pp%ÿòºyB²² +°3/°3±$é°/±é°C/°Ö´+°± +´=+° Ö´+°=±0+´)+±D+±±99± ´$9°=°9°² 7;999°0¶!$,-69A$9±3 µ ),69A$9°$µ!";$9°´$9014&#"6.547''>7&54632632'>54&#"'67&#"i8Y!3‚9!m/N<>U:W56)< N2>3 +!i ý þŒ:7$<] <669CC9D4 6#,# 9WO#&/#'/0ÿöÿ  y9EQÿ°!/±Fé²!F +³@! +°/±Dé°K Ö±6é°0/°?3±+é° 2°/±33± é°R/°$Ö°(2´O+°32°O±+±H22´+±A22² +³@ +² +³@ +°±+°<2´+° 2±S+±O$°&9°²!+-999±´ :?$9°°9±F!±99°Kµ$HO$9°°M9°6³&BI$9±0D¶ (.3954&#"#5#"&547&54632&#"3267654&#"632275#"'Sþ£þ¶%GBb.-H@Y)I )=o/;Mt0/fQ K(2&*%<í$)-915 þ³>.-:'& pp*R<7A+;2v6FZZÇUbB;;.?>_ d$--UE)ç3])%ÿöÿ%úyYa²+² +±Sé²+´+²#+² +´. +³. +±!é°Y Ö´+°3/±Jé°J°G Ö±6é°E/±<é°?/°B3±@ é°Z/°Ö´+°± +°#2´ +°P2° ±1+´M+°= Ö´C+²C= +³@CB +²=C +³@=9 +³@=? +³M1+´V+±[+±°+9° ³E$9°=².6G999±1 °39°C´ JSY$9±M°9°V±99±°9°!° 9° ±V99±S°Q9°²$P999±36°19°G²*M999±EJ²+999°<±99901'2674#"#5#"&54632&#"3275.'732654#"#"&546;5!5!##32632632#RRRO$!%6o((CV];  &(+V9GO"²J1* 9'=2#¨þ?Óæ% V'/W=$):UfM±RRRþ>.—PU31D W  (j *'C83~ m6!+6ppš#BCYG8CEÿöÿ8y<Wå²M+´J+°/°3±Eé°=/±/é°4/±é°7 Ö±é° /± é°/° 3± é°X/°%Ö´?+²%? +³@% +°?±+±2U22´+±Y+±?%±:B99°@  /7EG$9°³ $9±E°9°M²BGR999°J°#9°=°9°/³& ?V$9°7°29±4²+,999°±99± ±:9901'%35!5!##327632#5#".5732=.'732654#"#"&546"'3&54632"326=«RRRþ͸þ$Íþ"-+?oVgR‹Fi $*GUcR'F <"Hf5#*s('g,Iv TE7j= §þ=öÂö T)2p“RRRë–!)u*40HR…r9 52pp¡"BBþƒÿöÿYìy:L¤²;+±Jé°/±? é°D/±1é°5/± é°8 Ö±é°/± é° /° 3± é°M/°Ö±3A22´+±N+±²999±?°9±J;±"A99±1D´$&BFH$9°8°39°5²(999°³)-$9±±9901'%46;5!5!##2632#5#"&'47&547&'73254#"#"&"3275#"';ŒRRRþ{.+±-:²+999°)±99±)²*3<999°³ 4$9±² 999°²!999°°901%75#"'&'73254&#"'>323275!5!##5#"&'732674'{š³dnJC$U'*-BOAkýáÞPol VAP€CN6Y2PŸ*4 BO[QP3)ZFI ”ppýéc=OdYGHM5ÿöÿ%Áy2Kæ²#+±:é°=/± é²= +³@ +° /± é°/°3± é°L/°+Ö´B+²+B +³@+ +°B±0+°&2´ +´8+° ±+± é³+´+°/´+² +³@ +±M+±80³.@EJ$9± ´#346:$9°°=9°´ !<$9±=:¶&(4!E$9°µ+3@BJ$9° ².09990135!5!##"4632#'#"&547"&5467&546327'.'32>>¦þ¯QÿNQ*,!-' –wjPG5XOBL&H4#PZ Q‹#L  Ó6pp¥73+35!3 ## X6 R:AY% Dbþ’N*% ¤1,($  ÿöÿ•üy5‚°3/±!é²3! +³@3/ +²!3 +³@!' +°/±é°/± é° /° 3± é°6/°Ö´+² +³@ +³@ +±7+±±99±!3±*,99±±99°±9901747&546;5!5!##">;&#"3263>32#&'#"&M=?9zþÛêUÑ  %(.6,$(."*B—'Xcº$&,=6:,pp›l6$)8$*JV&\TÿöÿÄyI°1/± é° /±! é²! +³@!' +°!°= Ö±Cé°/± é°/°3± é°J/°:Ö´E+°E±+´+² +³@ +°°5 Ö´+°±$+±) é³)$+´+°/´+² +³@ +±K+±5E±=A99±±@H99±$³1$9°± 99°´&'+./$9± µ-/57H$9°C´+:AE$9°!°@9°=±$)99°±9901%3267'.546;5!5!##"4&5462#'#".547.54632&#"6P@&3 2T+K…YK@¦ýðÅFþOP.P''O aƒ ;2BzL6,4L\%[Q< Yg 2fBCc6pp¥64'/=34¨¡A2 \B7K103+/!ÿöÿeAy5<´°-/´+°/± é° /°3± é°=/°Ö´+² +³@ +³0+´ +°±+´! $+³!+´ +° /´+² +³@ +±>+±°29°²-8999° °9°´#)+9$9±-±(+99°µ#069$90127'46;5!5!#!"4&54632#&'#"&547."&'&.j%ãO>«þ”&HþüPS0*1'%", –2:PY/: U  ? A#(eFd8qqª85(/1&3!QHQ $e:7-E@¼:( ÿöÿ!™yNå°=/± é²= +³@ +°°8 Ö±% é²%8 +³@% +°/±F é°I/°L3±J é°O/°3Ö´(+°(±C+´+²C +³@CI +°±+± é³M +´G+°G/´M+²MG +³@ML +±P+±(3°+9°C°%9°³ "*8$9°³;$9°G±<=99°M³ $9±=%°<9°8° 9±± C9901"432#'#".547'&#".54>327'.546;5!5!#4ŸU& &aŠ"~ <@*(0 (^ %6,C"<‡Fm@(L?¦þ3‡Kdg^%$ 44§IJ  ))P %9 (< ;dO,<7Cc6pp¥ÿöÿò­y,£² +° /±% é°2² % +³@  +°/±# é°*/± é°/±'33± é°-/°Ö´(+²( +³@ +³@ +³@ +°(± +°&2´+² +³@ +±.+±(²999° ² $999±% °9±*#°90135#5!##5##"&546;5#".546;3##"ªGû·Qou1g! ^&8 L# Íu¶ Ó6ppýéi;o "!1' *I}>¥ÿöÿò¶y-¸²+°/±,é°'/±" é°/± é° /±33± é°./°Ö´)+²) +³@ +³@ +°)± +´+°±+°2´+² +³@ +±/+±)² 999° ±,99°²"$'999±,°9°'±%99°"³ $$9°±9901%"&547&546;5!5!##57##"632&#"32LhB]PBþÞÀPo=f£oà&80P!#SQB+ %OA16ppýéw/+㥠n0ÿöÿu)y(4ư/±2é°,/± é², +³@ +°/± é°#/°&3±$ é°5/°Ö´+² +³@# +³+´/ +°±+± é³'+´!+°!/´'+²'! +³@'& +±6+±/°9°²,2999±'!µ )*$9±2±99°,°9°±99°±9901"&54632#'#"&547&546;5!5!#'&#"326ËNR.()&'dB9DQ‰L>§þœ$QN"/d73'/>3&¼ )a56*5Db6pp¥þ”9 "ÿöÿ%\y/¡²+±é°/±! é°$/± é°/±* é°-/°3±. é°0/°Ö°'2´+´+² +³@- +°±"+°+2´+°2²" +³@ +±1+±"³$$9±°9°±99±$± 99°± '9901##"3267#"3267#"&546;5"&546;5!5!\€ã"' 1OO3%ÙIAU1;&HdrzšlA•fGþŠf ¥E H3›+!%NYaV=[_W>[6pÿöÿ%\y:Dz +²+± é²+± é°/±2 é°-/±$ é°'/°*3±( é°;/°!Ö´0+° Ö´+² +³@' +°0± +´+°% Ö´++²+% +³@+* +±<+±%0´2$9° ± 99°+±:99°² 47999±² 999±2±5:99°-±!49901#"32674'7#".54>;5"&546;5!5!##"327Æí%‘C.h 0MJ%;qT-B5vk«n?þŠf€ã"' MCQ# D" 1(: &V:*> dR@Y6pp¥E=B!ÿöÿ%7yAá² +²+± é² +³@= +²+± é´7 = +±7 é°2/±) é°,/°/3±- é°B/°Ö°$2´+°52² +³@, +°± +°:2´+°?2³A +´+°/°*3´A+°02²A +³@A/ +±C+±³ 7$9° ³ 9<$9±A± =99±² 999±7 °A9°2²$;5#".54>;5!5!##"32674'7Æí%‘C.h 0MJ%;qT-B5v ;qT-B5vþ Aqí%‘C.h OD" 1(: &V:*> "&V:*> 6pp¥D" 1H%ÿöÿZœy8ܰ/± é² +³@ +³@8 +°/±0 é°0°3 Ö±é°./±% é°(/°+3±) é°9/° Ö´ +°±8+°2´7+°7°, Ö´&+°&/´,+²,& +³@,+ +²&, +³@& +³@&( +±:+± ±"99°&´.0$9°8±399±²999°°9°°9°0°9±%.°"901%#"'#"&546;5&'732>54&#"#"&546;5!5!##32632#×>5#*s('g,Iv  ) @7j= §þ=¦rö T-DpV–!)u*40HR…  r9 52pp¡"J5þƒÿöÿ%‡yRß²>+±Gé°L/±6é°P Ö±2é°-/±é° /±'é°'°$ Ö±é°"/±é°/°3± é°S/°JÖ° 2´9+°*2° Ö´ +²  +³@  +² +³@ +°2³@ +±T+±J² 4L999° ±'699±LP°J9°2±9C99°6°D9±-²/999± ° 9°$±*99±"'°9°°901747&'732654#"#"&546;5!5!##32632#"'327632#".'732654#"#"&º UDD#²I1*  =2#¨þ?‘`æ% V(.uW',* <'/,S98f[A)F%²F)2  & ;ƒo7Z@3} m6!+6ppš#CHg  B">;##D>/<3y)# jÿöÿ%‡yEP%²+°M/´+°/´( +°0/´B+°B° Ö´-+°?/±6é°9/°<3±: é°Q/°Ö´ +° ±+´O+°O±++´+°7 Ö´=+°2²=7 +³@=< +²7= +³@73 +³@79 +°° Ö´I+°I/´+±R+± ±?99°7µ(0BD$9°O°.9°+²-FM999°I°9°=°9±M³F$9°± 99±(±99°0°+9±B-±"99±6?±3#99012#"&54632#".543.'732654"#"&546;5!5!##3276>54.#" $/æ'7.R=:ItR=€^ e†'U -De:5&*<‚<¨þ?‘`Ô"B ^7+”021G';J1f@ŽSMD66" U6)$0pp” þ) ÿöÿ².y+4Ȳ++²+´3 +²+´4+3 +± é° /±2 é°0/±" é°%/±(-33±& é°5/°Ö°2´ +² +³@% +° ±#+´.+°.±++°,2´*+²*+ +³@*( +±6+± °9°#´02$9°.³34$9±°9°4² 999°3°9±"0°901%##"&547#".547&5463!5!5!##5#!!g“2h0j78.N1J)::6/(þ@8WpAþ}Y#6x# +#. N(1=,B0@@),6ppýé×@¥oÿöÿ¨ y+9Ú²+²+°/±8é°)/±2 é°0/± é°/±-33± é°:/° Ö´+² +³@  +³@  +°±+´.+°.°6 Ö´$+°$/´6+°.±+°,2´+² +³@ +±;+± ° 9°³ 02$9±.$²8999±8± 99°)´ " 6$9°2± ,99±0°9017.467&546;5!5!##5#"'3654.+"%#!322˜NX#-0T+´3+°3±.+´'+° Ö´+² +³@ +² +³@ +³@ +±K+±>´ B$9°3±@99°²"0999°.°+9°²*89999±89°9°0· '.3*>B$9° ² 999±°9017.5463267&546;5!5!#!632'>54#"3".547'47&#"ls;3&GF+_BG8(2%*Óýk\Wþë0!8R()%A W1H;VP>ti? BW$)Ž7Y ] %:Y6H\6( ((76pp¥/0'7T #7. ].T71X/+%ÿöÿçBy)1‡²+°3°/±/é° 2°'/±+33±( é°2/°%Ö´-+²%- +³@%' +°-±+°*2´+² +³@ +±3+±-%² 999°³ $9±±*99°/³#-$901##5'7&#'67&#".'732=!5!5#632BPoŽIŒF-$-Z;B/FiL>0G#N Z+=(þØL¿õEq ýéšxLuq%%/`|GH;a1p=; $lpþ»Õ9QÿÿÿfCz&àZ¦ öÿT·s‡D° /´ +² +³@ +°2°/°Ö´ +°±+´ +±² 99901'2653#"&53DDDD#*CT<:U@(‡DDDI$;JJ;-ÿÿþup‰„& à ÿ­þ=ÿ¦ÿ„ǰ/´ +°/°Ö´ +01''%|þð7G\¶NÓÿöÿKyM°6/±/ é°(/±# é°H/±é°/± é°/°3± é°N/°Ö´K+²K +³@ +°K±;+´,+²;, +³@;? +°,± +´+² +³@ +²  +³@  +° °D Ö´+±O+±K±99°;²999°,´ =H$9±D ²#B999°²(/6999°°%9±/6±499°(±399°#±&=99°H´%?K$9°±99± °901.547&5463!5!5!#!632327#"32>7#".'47&5463254.#"ç]?,H>*$þ~P_þ»22ØDJ#+@,,CE *"(8;KBA+4YP-0i&H?VdLBDI:#(6pp¢Š.)  e$ Z;"@)!"#?<>H"9OÿöÿaFy<°°#/±é°./± é°/±é°/° 3± é°=/°;Ö´1+²;1 +³@; +°1±+´ +²  +³@ +³@  +² +³@ +±>+±1;°9°·(.45$9° ³#*,$9±#°!9°.´ (1;$9°±99±°901&5463!5!5!#!632327#".543254#".54g>*$þ~P_þ» 22dwKE!'#2-.JJ9:%©c6hCK($.A&I:#(6pp¢K?&3 ^$5#rB3KG[/5V5Lÿöÿ5y1°//±é°/± é°/°3± é°2/° Ö´+² +³@  +°±)+´"+° Ö´+² +³@ +² +³@ +±3+± ° 9°¶&-/$9°)°,9°°%9±/± 99±° 9017.547&5463!5!5!#!632'>54&5'7"ŽR/"#D@'B8)%ÿþ€?Pþ»+;"GJ/40Z#+ Sj3dvCS V"7&#".54d<-#4þJZþ“ @?gšog  D=GJS69%H;Qn;A=(37B=#-6pp¥ %þRÞ9( CI+b.6? BAIU/J,HeB5ÿöÿ^y:½°*/±7é²*7 +³@*' +°/±$ é°"/± é°/°3± é°;/°Ö´+² +³@ +°±'+°2´&+²&' +³@& +°'° Ö´ +² +³@ +±<+±°9°· "$*-7$9±7*² (999°³-0$9°$°9±"°901%#.5467&5463!5!5!#!!#5#"&54673267Áà@ -`N-:6/(þ@‹[þ}op 1CYF8& ,Ç;,% W7‹X'L@@),6pp¥þJI I<-8 T  ÿöÿjwy1ž°/±& é²& +³@) +°$/± é°/°!3± é°2/°Ö°2´ +² +³@ +° ±)+´(+²() +³@(! +°(°" Ö´+°/´"+±3+± °9°µ$&+/$9±&°9±$°901"&54?#"&547&5463!5!5!#!!#5p~¦µ7 # .0µ::6/(þ@Qþ}ˆo[ ,B5O4#7 VCßB0@@),6pp¥þJë+ÿöÿƒy1ª² +´ +³ +± é°± é°/±) é°,/°/3±- é°2/°"Ö°&2´+²" +³@", +°±*+´0+²0* +³@0 +³@0/ +±3+±"°$9°*´ $9°0³$9±² "999°°$9±)°&901!3##"&54>7#".547&5463!5!5!#£¹¹2ir.,';9Q'::6/(þ@c3dop#6w)&:$ \ENB B0@@),6pp¥ÿöÀpyN°/± é° /° 3± é°/°Ö´+² +³@ +°2² +³@ +±+±°9° °90127#"&=#5!#ëH=6LRs3zØ./=€,`I pp%ÿöÿòJy„²+°/± é°/± é°/±33± é° /°Ö´+² +³@ +°±+°2´+° 2² +³@ +°2±!+±°9±±99°±99° ± 99017"&=#5!#632&#"#5'3275#îRs3T•3, Go)….%+0®À`I ppS'z BþÎá¬%%µÿöÿôy7X²+°//±é²/ +³/5 +°/°3± é°8/°Ö°2´+² +³@ +² +³@ +±9+±/°9014>325!5!##5#".54676?&'&#"#"&(;`9 þ,—To› JK""À/ )0U|% ¤qqýìÔQ /c552pÿöÿ_y1Aв+²(+´- +°/±@ é° Ö±<é°9/± é°/±633± é°B/° Ö´8 +² 8 +³@  +°8´+°/°8±+±522´+² +³@ +±C+± µ(-9>$9°8µ!&@$9°´ $%2$9±-(´!$9±<²2999±9@°59°° 901%>74"#"&546;5!5!##5'75&'&'46327>75##27632"7!(8x1©þÐ)PorQÃf n01 @\g£.!((¿!rËã )! #+g, •7%$6ppýéYkH¸%k/#^:ii$+"£%¯¥% ÿöÿìÐy'w²+°3°%/± é°/°3± é°(/° Ö´+°±+±22´+² +³@ +² +³@ +±)+±³ $9±%± 99° ±9901.54632675!5!##5'75'67&#"˜?6GZ=lSXA0 Rppýé†NYvK`'.9##ÿöÿä7y&²+° /± é°2°/±#33± é°'/°Ö´%+²% +³@ +°%±+°"2´+² +³@ +±(+±%± 99°´ $9± °9° ³"%$901##5'7&#".'732=!5!25#67Po¥G¤J9 C/-z XK~|Z+6(þâAþor`ô ýäñ‡Uƒ9$/<JZª¯=;*$vp¦N„9ÿöÿ©²y/£²+²+°&/± é°/± é°/°3± é°0/°Ö´ +² +³@ +³@ +° ±+±22´+² +³@ +±1+± ±99°²999±&°9°±99°´ $9°°,9°°-901'254.'5!5!5!##5'%5!#".'7Zfff¯(  Úý¼PoåG,þÚ#9%7^:.ha@fff +  'IppýäS—XÀ"(*.#9MeB,gŸÿöÿ¹y8Ò²1+³1+´ +²+²5+°/°-3± é°!2°/°3± é°9/°Ö´+² +³@ +°±1+°2´0+°2²01 +³@0 +²10 +³@1 +°0±*+´$+±:+±°9°1² 999±*0²!&'999±1°69°³&'2$9°µ$*/$9° ± 9901"&54?&54632&#"3267!5!!632'>54&#"#5±~BK`T8.#%Q<þ›(þ®3;AhŠa(R")@qšGC5 :TG} u)!L qqi/fB\¡G#k& hþø†J/ÿöÿ}>y&Hϲ!+°3³!+´< +°A/±0é°,/±'é°/±333± é°I/°Ö´5+²5 +³@ +°5±D+´.+°.±+±2?22´+² +³@ +±J+±5²!999°D± $99°.°<9°²')A999±!°9°<±99±0A±9?99°,³*2D$9°'² )99901"&54?.'732=#5!##52&#"3275!3267#"&54>9~@.L*" cåHRq X.„Ï782'þÒ12jM.v221A](;0ƒC9 \Qa&)7 yqqýä_ /k e,+/³‡*;8S(1OH,A ÿöÿ¹{y1³²+³+´' +²+²+°!/±0 é°/±*33± é°2/°Ö´$+²$ +³@ +³@ +³@ +°$±+°)2´+² +³@ +±3+±$³ +-$9°² 1999±°9°'±99°!±)99°0° 9°° 901"&54?&547.547#5!##5#"3275#;Ñ~AF( (?…Nq+”¥† &!#Mmþ<YGC5+O2-H,qqýä¥ G/n#Gõ 'ÿöÿµ™y*œ²+²+²'+° /°3± é°/°3± é°+/°Ö´+² +³@ +² +³@ +³@ +°±+°2´+² +³@ +² +³@ +±,+±´ $%$9°°(9± ² 99901"&54?&547#5!#32675!5!##5Ø~_))Ž‘f*+3.\þ£LqC2VKC5.)@:3rr#7U6¯qqýä¹'' /ÿöÿrêy+“²$+°/± é°/± é°/°!3± é°,/°Ö´ +² +³@ +³@ +° ±$+±22´#+²#$ +³@#! +±-+± ³&)$9±$°%9°°9°± 99°±99°°901"&547%5##"732654&'5!5!5!##5„~)Y25¸gmgQ5!ýÈôJršŽC4¥%)/E$O/þôW#&Mqqýä?J/ÿöÿãŸy-l²&+²+°/± é° /°#3±! é°./°Ö´ +² +³@ +° ±&+°2´%+²%& +³@%# +±/+±& ± 99±&± 9901%"&54?#". 4>3!5!5!##“~¦å})Q!! 4#:þ©Nq=aC5P>›U )%/+2.-/@qqýä/)ÿ·Ày>ɲ5+³5+´+ +²+²;+°/´+°/±.233±# é°02°?/°Ö´+°±+´&+°&±5+°-2´4+²45 +³@42 +²54 +³@5/ +±@+±± 99°¶#)9$9°&±+<99±5°<9°+±699°³ ) -$9°±&99°°901"&54?.532654&#"327#"&54>323275#5!##5ý~DFS?/LC*&-9O(:0Sj]W%«þ”0RþüPS0*1' F–ˆ”C4CuCFd8qqª85(/1&3!j$ #*A/)ÿ¢~y:à²1+³1+´' +°!/± é°+/±.33±, é°2²+, +³@+ +°;/° Ö´+° Ö°3´$+°±+´+°±1+°)2´0+²01 +³@0. +²10 +³@1+ +±<+± ° 9°$²999±´'58$9°1± !99±1°89°'³25$9°!° 9° ² )999°+± 9901"&54?.547&54632#54#"63"3275#5!##5ó~3,'+VS;7Nq +2ZaF.'=h`Mr"%‚)^C1O9+GZ8TS0))@m"eßqqýä¬R8ÿöÿÙy s²+²+° /±33± é°!/° Ö´+²  +³@  +³@ +°±+°2´+² +³@ +±"+± °9°°9± ²99901"&54?.=#5!##5275#­~\,44Pp‘.1.³-'C5,N0Êqqýä¢F/++ÙÆ"ÿöÿ¹íy+3¡²$+²+²(+° /± é° /±233± é°4/° Ö´,+² , +³@  +³@ +°,±$+°12´#+°2²#$ +³@# +°#±+´+±5+±$,±99±#²999± $µ%/1$9°°901"&54?.=#5!!632'654&#"#53275#­~€;I4÷þÑ6+Mj:az+Sp‘&-'1.³GC5>W9Êqq{(bM%MJMr8Lþó‚F/‰"%ßÿöÿ¯gy!%™²+²+²+°/±% é°2²% +³@ +°/±#33± é°&/°Ö°2´%+°2²% +³@ +³@ +°%±+±"22´+² +³@ +±'+±%° 9°°9±±99°%°901"&547%5##"&546;5#5!##55#ý~)Ù3$i$hqOqš–ÙQC5 :5z$.§qqýä|J/²§§ÿöÿ±y(›²!+³!+´ +²+²%+°/± é°/°3± é°)/° Ö°2´+°±!+°2´ +² ! +³@  +²! +³@! +±*+± °9°!² 999±!²"#999°² 999° °901"&54?.54632&#"327!5!##5²~F-7bQ'3'.##1#64þ±&fqƒOC5![/Lu r , )#0qqýäs?/ÿöÿì«y+­²+°#3°)/°3±* é° Ö± é°/°3± é°2°,/°&Ö´+²& +³@& +³@&* +°±+°2´+°2² +³@ +°±+´ +±-+±&°(9°±"#99±² 999±)³ $9±*°901&!50!!632'>54&#"##".547#5!ç£þ²µþ­3;AhŠa(R")@q™!*\7B`b t¾pqi/fB\¡G#k& hþøi( y/YT>pÿöfDy -1^°/°3±' é°2°/±!33± é°2°0/±1 é°2/°Ö´$+²$ +³@ +±3+±$°9±'°9°²99901747#50!#32>7#"&'#"&732>767!5Œ(‹­ 39A"ƒF-K"i5>W 3%R/$Gü²ú82ooJ 8%€$S/("5TªJ /-'ppÿöÿ%áyZ²+³ T+±>é°X Ö±:é²@+²K+²F+±Oé°5/±é°/±/é°/°, Ö±é°*/±!é°$/°'3±% é°[/°RÖ°2´A+°22°" Ö´(+²(" +³@(' +²"( +³@" +°2³@"$ +±\+±R"²99°A±99±TX°R9°°A9±>:²L999±5³ 7$9±°9°,² 2999±*/² 999°!±9901%''47&'732654#"#"&546;5!5!##32632#"'327632#".'732654#"#"&ŒRRRRRRRþ€ UDD#²I1*  =2#¨þ?ëºæ% V(.uW',* <'/,S98f[A)F%²F)2  & ;ƒRRRtRRRð7Z@3} m6!+6ppš#CHg  B">;##D>/<3y)# jÿöÿ{ìy:½°5/´ +°/±% é°%°( Ö±é°2°#/± é°/° 3± é°;/°-Ö°2´,+°,°! Ö´+°/´!+²! +³@! +²! +³@ +³@ +±<+±-±(99±,!°9± 5²,.999°°9°°9°%²999±#±9901'.'732>54&#"#"&546;5!5!##32632#5#"&547†RRRþ¸BkIv  ) @7j= §þ=öÂö T-Dp×~“RRRéM-R…  r9 52pp¡"J5þ»¶^/C6 ÿöÿæVy#“²+±33°/± é°/± é° /±"33± é°$/°Ö± 22´+°2² +³@ +³@ +°±+°!2´+² +³@ +±%+±°9°±99°²!999°²99901%'%5"#5!5!5!##5#"&'#33275!»þó7DQïR’þ;`Rr6D\zqq=AAD<þšš´NÑQs@qqýä¾!t`þÕ (DÊÿÿýÅþÔÿüÊ'ÿ~ÿè Øÿÿþ þÔ Ô' ÿ~ÿè âÿÿÿöÿ…•y&ÿ¡ÿúÿÿÿöÿwLy'ÿìÿÿÿöÿ³[y'±( çÿÿÿöÿ³•y'±( èÿÿÿöÿ³Xy'Ù( éÿÿÿöÿ³Ky'±( ìÿÿÿöÿ³Jy'±( :ÿÿúæè"ºÿÿúÖŠÿöÿì‡y.†²+°/± é°/±33± é°2°//°Ö°-2´+°2² +³@ +² +³@ +°±+´ +±0+±² 999±´ %&$9° ³ '-$9°°*90150!0!632'>54&#"#='%&''>325 ‘þ­3;AhŠa(R")@qþþDÿJ *$5 >$¯+I;qqi/fB\¡G#k& hþøÇ”Y”N  [H5;¥ PÈä"²+´ +°/°Ö´ +±+013#M{wFä”"® jkÿìjwÿâj~ÿìj…ÿìjˆÿìj‹ÿìj”ÿìj–ÿìj—ÿâj™ÿâjšÿâj›ÿâjœÿâjÿâjžÿâjŸÿâj ÿâj¡ÿâj¢ÿâj£ÿâj¤ÿâj¥ÿâj¦ÿâj§ÿâj¨ÿâj©ÿâjªÿâj«ÿâj¬ÿâj­ÿâj®ÿâj¯ÿâj°ÿâj±ÿâj²ÿâj³ÿâj´ÿâjµÿâj¶ÿâj·ÿâj¸ÿâj¹ÿâjºÿâj»ÿâj¼ÿâj½ÿâj¾ÿâj¿ÿâjÀÿâjÁÿâjÂÿâjÃÿâjÄÿâjÅÿâjÆÿâk‰ÿìk–ÿìskÿØs~ÿØs…ÿØsˆÿØs‰ÿìs‹ÿØs”ÿØs–ÿìs—ÿìs™ÿìsšÿìs›ÿìsœÿìsÿìsžÿìsŸÿìs ÿìs¡ÿìs¢ÿìs£ÿìs¤ÿìs¥ÿìs¦ÿìs§ÿìs¨ÿìs©ÿìsªÿìs«ÿìs¬ÿìs­ÿìs®ÿìs¯ÿìs°ÿìs±ÿìs²ÿìs³ÿìs´ÿìsµÿìs¶ÿìs·ÿìs¸ÿìs¹ÿìsºÿìs»ÿìs¼ÿìs½ÿìs¾ÿìs¿ÿìsÀÿìsÁÿìsÂÿìsÃÿìsÄÿìsÅÿìsÆÿìukÿâuwÿØu~ÿâu…ÿâuˆÿâu‹ÿâu”ÿâu–ÿâu—ÿâu™ÿâušÿâu›ÿâuœÿâuÿâužÿâuŸÿâu ÿâu¡ÿâu¢ÿâu£ÿâu¤ÿâu¥ÿâu¦ÿâu§ÿâu¨ÿâu©ÿâuªÿâu«ÿâu¬ÿâu­ÿâu®ÿâu¯ÿâu°ÿâu±ÿâu²ÿâu³ÿâu´ÿâuµÿâu¶ÿâu·ÿâu¸ÿâu¹ÿâuºÿâu»ÿâu¼ÿâu½ÿâu¾ÿâu¿ÿâuÀÿâuÁÿâuÂÿâuÃÿâuÄÿâuÅÿâuÆÿâzkÿìzwÿâz~ÿìz…ÿìzˆÿìz‹ÿìz”ÿìz–ÿìz—ÿâz™ÿâzšÿâz›ÿâzœÿâzÿâzžÿâzŸÿâz ÿâz¡ÿâz¢ÿâz£ÿâz¤ÿâz¥ÿâz¦ÿâz§ÿâz¨ÿâz©ÿâzªÿâz«ÿâz¬ÿâz­ÿâz®ÿâz¯ÿâz°ÿâz±ÿâz²ÿâz³ÿâz´ÿâzµÿâz¶ÿâz·ÿâz¸ÿâz¹ÿâzºÿâz»ÿâz¼ÿâz½ÿâz¾ÿâz¿ÿâzÀÿâzÁÿâzÂÿâzÃÿâzÄÿâzÅÿâzÆÿâ~‰ÿì~–ÿìkÿØ~ÿØ…ÿ؈ÿ؉ÿì‹ÿØ”ÿØ–ÿì—ÿì™ÿìšÿì›ÿìœÿìÿìžÿìŸÿì ÿì¡ÿì¢ÿì£ÿì¤ÿì¥ÿì¦ÿì§ÿì¨ÿì©ÿìªÿì«ÿì¬ÿì­ÿì®ÿì¯ÿì°ÿì±ÿì²ÿì³ÿì´ÿìµÿì¶ÿì·ÿì¸ÿì¹ÿìºÿì»ÿì¼ÿì½ÿì¾ÿì¿ÿìÀÿìÁÿìÂÿìÃÿìÄÿìÅÿìÆÿì…‰ÿì…–ÿì‡kÿö‡wÿâ‡~ÿö‡…ÿö‡ˆÿö‡‹ÿö‡”ÿö‡–ÿö‡—ÿ쇙ÿ쇚ÿ쇛ÿ쇜ÿì‡ÿ쇞ÿ쇟ÿ쇠ÿ쇡ÿ쇢ÿ쇣ÿ쇤ÿ쇥ÿ쇦ÿ쇧ÿ쇨ÿ쇩ÿ쇪ÿ쇫ÿ쇬ÿ쇭ÿ쇮ÿ쇯ÿ쇰ÿ쇱ÿ쇲ÿ쇳ÿ쇴ÿ쇵ÿ쇶ÿ쇷ÿ쇸ÿ쇹ÿ쇺ÿ쇻ÿ쇼ÿ쇽ÿ쇾ÿ쇿ÿì‡Àÿì‡Áÿì‡Âÿì‡Ãÿì‡Äÿì‡Åÿì‡Æÿ숉ÿ숖ÿì‰kÿì‰wÿâ‰~ÿ쉅ÿ쉈ÿ쉋ÿ쉔ÿ쉖ÿ쉗ÿ≙ÿ≚ÿ≛ÿ≜ÿâ‰ÿ≞ÿ≟ÿ≠ÿ≡ÿ≢ÿ≣ÿ≤ÿ≥ÿ≦ÿ≧ÿ≨ÿ≩ÿ≪ÿ≫ÿ≬ÿ≭ÿ≮ÿ≯ÿ≰ÿ≱ÿ≲ÿ≳ÿ≴ÿ≵ÿ≶ÿ≷ÿ≸ÿ≹ÿ≺ÿ≻ÿ≼ÿ≽ÿ≾ÿ≿ÿâ‰Àÿâ‰Áÿâ‰Âÿâ‰Ãÿâ‰Äÿâ‰Åÿâ‰ÆÿâŠkÿâŠwÿØŠ~ÿ⊅ÿ⊈ÿ⊋ÿ⊔ÿ⊖ÿ⊗ÿ⊙ÿ⊚ÿ⊛ÿ⊜ÿâŠÿ⊞ÿ⊟ÿ⊠ÿ⊡ÿ⊢ÿ⊣ÿ⊤ÿ⊥ÿ⊦ÿ⊧ÿ⊨ÿ⊩ÿ⊪ÿ⊫ÿ⊬ÿ⊭ÿ⊮ÿ⊯ÿ⊰ÿ⊱ÿ⊲ÿ⊳ÿ⊴ÿ⊵ÿ⊶ÿ⊷ÿ⊸ÿ⊹ÿ⊺ÿ⊻ÿ⊼ÿ⊽ÿ⊾ÿ⊿ÿâŠÀÿâŠÁÿâŠÂÿâŠÃÿâŠÄÿâŠÅÿâŠÆÿ⋉ÿì‹–ÿ쑉ÿì‘–ÿ쓉ÿì“–ÿ씉ÿì”–ÿ앉ÿì•–ÿìš›ÿØ©›ÿت›ÿìÅ›ÿìâÜâÜâÜâ"ÈãÜãÜãÜã"ÈäÜäÜäÜä"ÈåÜåÜåÜå"ÈæÜæÜæÜæ"ÈçÜçÜçÜç"ÈèÜèÜèÜè"ÈéÜéÜéÜé"ÈêÜêÜêÜê"ÈëÜëÜëÜë"ÈìÜìÜìÜì"ÈíÜíÜíÜí"ÈîÜîÜîÜî"ÈïÜïÜïÜï"ÈðÜðÜðÜð"ÈñÜñÜñÜñ"ÈòÜòÜòÜò"ÈóÜóÜóÜó"ÈôÜôÜôÜô"ÈõÜõÜõÜõ"ÈöÜöÜöÜö"È÷Ü÷Ü÷Ü÷"ÈøÜøÜøÜø"ÈùÜùÜùÜù"ÈúÜúÜúÜú"ÈûÜûÜûÜû"ÈüÜüÜüÜü"ÈýÜýÜýÜý"ÈþÜþÜþÜþ"ÈÿÜÿÜÿÜÿ"ÈÜÜÜ"ÈÜÜÜ"ÈÜÜÜ"ÈÜÜÜ"ÈÜÜÜ"ÈÜÜÜ"ÈÜÜÜ"ÈÜÜÜ"ÈÜÜÜ"È Ü Ü Ü "È Ü Ü Ü "È Ü Ü Ü "È Ü Ü Ü "È Ü Ü Ü "ÈÜÜÜ"ÈÜÜÜ"ÈÜÜÜ"ÈÜÜÜ"ÈÜÜÜ"ÈÜÜÜ"ÈÜÜÜ"ÈÜÜÜ"ÈÜÜÜ"ÈÜÜÜ"ÈÜÜÜ"ÈÜÜÜ"ÈÜÜÜ"ÈÜÜÜ"ÈÜÜÜ"ÈÜÜÜ"ÈÜÜÜ"È Ü Ü Ü "È!Ü!Ü!Ü!"È"Ü"Ü"Ü""È#Ü#Ü#Ü#"È$Ü$Ü$Ü$"È%Ü%Ü%Ü%"È&Ü&Ü&Ü&"È'Ü'Ü'Ü'"È(Ü(Ü(Ü("È)Ü)Ü)Ü)"È*Ü*Ü*Ü*"È+Ü+Ü+Ü+"È,Ü,Ü,Ü,"È-Ü-Ü-Ü-"È.Ü.Ü.Ü."È/Ü/Ü/Ü/"È0Ü0Ü0Ü0"È1Ü1Ü1Ü1"È2Ü2Ü2Ü2"È3Ü3Ü3Ü3"È4Ü4Ü4Ü4"È5Ü5Ü5Ü5"È6Ü6Ü6Ü6"È7Ü7Ü7Ü7"È8Ü8Ü8Ü8"È9Ü9Ü9Ü9"È:Ü:Ü:Ü:"È;Ü;Ü;Ü;"È<Ü<Ü<Ü<"È=Ü=Ü=Ü="È>Ü>Ü>Ü>"È?Ü?Ü?Ü?"È@Ü@Ü@Ü@"ÈAÜAÜAÜA"ÈDÜDÜDÜD"ÈEÜEÜEÜE"ÈFÜFÜFÜF"ÈGÜGÜGÜG"ÈHÜHÜHÜH"ÈIÜIÜIÜI"ÈJÜJÜJÜJ"ÈKÜKÜKÜK"ÈLÜLÜLÜL"ÈMÜMÜMÜM"ÈNÜNÜNÜN"ÈOÜOÜOÜO"ÈPÜPÜPÜP"ÈQÜQÜQÜQ"ÈRÜRÜRÜR"ÈSÜSÜSÜS"ÈTÜTÜTÜT"ÈUÜUÜUÜU"ÈVÜVÜVÜV"ÈWÜWÜWÜW"ÈXÜXÜXÜX"ÈYÜYÜYÜY"ÈZÜZÜZÜZ"È[Ü[Ü[Ü["È\Ü\Ü\Ü\"ÈN®MœüF {¯ Üñ +M É $!$$8ò  ÈÔ¦®þ Î Ü š ê  0 _ $‰  é Võ ’y H× æ  ö J $^ $ .n"€ò$„ŒD T&Ô ä®¸p&† FRÄÌ š¦!,!(D" l"z$ $&&°&(È'v'$Š*F*P- ^-j9 ¤9°Copyright 2002, 2003, 2005, 2008, 2009, 2010, 2012 GNU Freefont contributors.Copyright 2002, 2003, 2005, 2008, 2009, 2010, 2012 GNU Freefont contributors.FreeSansFreeSansBoldBoldGNU: FreeSans Bold: 2012GNU: FreeSans Bold: 2012FreeSans BoldFreeSans BoldVersion 0412.2261 Version 0412.2261 FreeSansBoldFreeSansBoldGNUGNUhttps://savannah.gnu.org/projects/freefont/https://savannah.gnu.org/projects/freefont/This computer font is part of GNU FreeFont. It is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This font is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this font. If not, see http://www.gnu.org/licenses/ As a special exception, if you create a document which uses this font, and embed this font or unaltered portions of this font into the document, this font does not by itself cause the resulting document to be covered by the GNU General Public License. This exception does not however invalidate any other reasons why the document might be covered by the GNU General Public License. If you modify this font, you may extend this exception to your version of the font, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version.This computer font is part of GNU FreeFont. It is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This font is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this font. If not, see http://www.gnu.org/licenses/ As a special exception, if you create a document which uses this font, and embed this font or unaltered portions of this font into the document, this font does not by itself cause the resulting document to be covered by the GNU General Public License. This exception does not however invalidate any other reasons why the document might be covered by the GNU General Public License. If you modify this font, you may extend this exception to your version of the font, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version.http://www.gnu.org/copyleft/gpl.htmlhttp://www.gnu.org/copyleft/gpl.htmlâ#mFreeSans â#m68@=89FreeSans 68@=89Kal1nFreeSans Kal1nFetFreeSans FetNegritaFreeSans NegritaKrepkoFreeSans KrepkoTu néFreeSans Tu né>;C68@=K9FreeSans >;C68@=K9grosFreeSans grosNegritoFreeSans NegritoPogrubionyFreeSans PogrubionyHalvfetFreeSans HalvfetpusjuodisFreeSans pusjuodistreknrakstsFreeSans treknrakstsGrassettoFreeSans Grassettohuruf tebalFreeSans huruf tebalFélkövérFreeSans Félkövér ' C 7 M FreeSans ' C 7 M ˆ½Ä¿½±Free Sans ˆ½Ä¿½±FettFreeSans FettGrasFreeSans GrasLihavoituFreeSans LihavoituVetFreeSans VetfedFreeSans fedtu néFreeSans tu nénegretaFreeSans negreta?>;CG5@5=FreeSans ?>;CG5@5=LodiaFreeSans LodiaÿCE _  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`a¬£„…½–膎‹©¤ŠÚƒ“òóˆÞñžªõôö¢­ÉÇ®bcdËeÈÊÏÌÍÎéfÓÐѯgð‘ÖÔÕhëíjikmln oqprsutvwêxzy{}|¸¡~€ìîº   ýþ  ÿøù !"#$%&'()*+,-.ú×/0123456789:;<=âã>?@ABCDEFGHIJKL°±MNOPQRSTUVûüäåWXYZ[\]^_`abcdefghijkl»mnopæçqrstuvwxyz{|}~€‚ƒ¦„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”Øá•–—˜™š›œžŸ ¡¢£¤ÛÜÝàÙߥ¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH¨IJKLMNOPQRSTUVWXYZ[Ÿ\]^_`abcdefghijklmnopq›rstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`a²³bcd¶·Äe´µÅf‚‡ghi«jklmnopqrÆstuvwxyz¾¿{|}~€‚ƒ¼„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅ÷ÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúŒûüýþÿ                           ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [˜ \ ] ^ _ ` a b c d e f gš h™ï i j k l m n o¥ p q r’ s t u v w x y zœ { | } ~  € ‚ ƒ „ … † ‡ ˆ ‰§ Š ‹ Œ Ž ‘ ’ “ ” • – — ˜ ™”• š › œ ž Ÿ   ¡ ¢ £ ¤ ¥ ¦ § ¨ © ª « ¬ ­ ® ¯ ° ± ² ³ ´ µ ¶ · ¸ ¹ º » ¼ ½ ¾ ¿ À Á  à Ĺ Å Æ Ç È É Ê Ë Ì Í Î Ï Ð Ñ Ò Ó Ô Õ Ö × Ø Ù Ú Û Ü Ý Þ ß à á â ã ä å æ ç è é ê ë ì í î ï ð ñ ò ó ô õ ö ÷ ø ù ú û ü ý þ ÿ                           ! " # $ % & ' (ÀÁ ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~  € ‚ ƒ „ … † ‡ ˆ ‰ Š ‹ Œ Ž ‘ ’ “ ” • – — ˜ ™ š › œ ž Ÿ   ¡ ¢ £ ¤ ¥ ¦ § ¨ © ª « ¬ ­ ® ¯ ° ± ² ³ ´ µ ¶ · ¸ ¹ º » ¼ ½ ¾ ¿ À Á Â Ã Ä Å Æ Ç È É Ê Ë Ì Í Î Ï Ð Ñ Ò Ó Ô Õ Ö × Ø Ù Ú Û Ü Ý Þ ß à á â ã ä å æ ç è é ê ë ì í î ï ð ñ ò ó ô õ ö ÷ ø ù ú û ü ý þ ÿ                           ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b softhyphenmicromiddotssharpAmacronamacronAbreveabreveAogonekaogonek Ccircumflex ccircumflex Cdotaccent cdotaccentDcarondcaronDcroatEmacronemacronEbreveebreve Edotaccent edotaccentEogonekeogonekEcaronecaron Gcircumflex gcircumflex Gdotaccent gdotaccent Gcommaaccent gcommaaccent Hcircumflex hcircumflexHbarhbarItildeitildeImacronimacronIbreveibreveIogonekiogonekIJij Jcircumflex jcircumflex Kcommaaccent kcommaaccent kgreenlandicLacutelacute Lcommaaccent lcommaaccentLcaronlcaronLdotldotNacutenacute Ncommaaccent ncommaaccentNcaronncaron napostropheEngengOmacronomacronObreveobreve Ohungarumlaut ohungarumlautRacuteracute Rcommaaccent rcommaaccentRcaronrcaronSacutesacute Scircumflex scircumflexTcedillatcedillaTcarontcaronTbartbarUtildeutildeUmacronumacronUbreveubreveUringuring Uhungarumlaut uhungarumlautUogonekuogonek Wcircumflex wcircumflex Ycircumflex ycircumflexZacutezacute Zdotaccent zdotaccentlongsuni0180uni0181uni0182uni0183uni0184uni0185uni0186uni0187uni0188uni0189uni018Auni018Buni018Cuni018Duni018Euni018Funi0190uni0191uni0193uni0194uni0195uni0196uni0197uni0198uni0199uni019a lambdastrokeuni019Cuni019Duni019EObarOhornohornuni01A2uni01a3uni01A4uni01A5uni01A6uni01A7uni01A8uni01A9uni01aauni01ABuni01ACuni01ADuni01AEUhornuhornuni01B1uni01b2uni01B3yhookuni01B5uni01B6Yoghuni01B8uni01b9uni01bauni01bbuni01bewynnuni01c0uni01c1uni01c2uni01c3uni01C4uni01C5uni01C6uni01C7uni01C8uni01C9uni01CAuni01CBuni01CCuni01CDacaronuni01CFicaronuni01D1ocaronuni01D3ucaronuni01D5uni01D6uni01D7udieresisacuteuni01D9uni01DAUdieresisgraveudieresisgraveeturnuni01DEuni01DFuni01E0uni01E1uni01E2uni01E3uni01E4uni01E5Gcarongcaronuni01E8kcaronOogonekoogonekuni01ECuni01EDuni01EEuni01EFjcaronuni01F1uni01F2uni01F3GacutegacuteWynnuni01F8uni01F9 Aringacute aringacuteAEacuteaeacute Oslashacute oslashacute Adblgrave adblgraveAinvertedbreveainvertedbreve Edblgrave edblgraveEinvertedbreveeinvertedbreve Idblgrave idblgraveIinvertedbreveiinvertedbreve Odblgrave odblgraveOinvertedbreveoinvertedbreve Rdblgrave rdblgraveRinvertedbreverinvertedbreve Udblgrave udblgraveUinvertedbreveuinvertedbreve Scommaaccent scommaaccentuni021Auni021Buni021cuni021duni021Euni021Funi0224uni0225uni0226uni0227uni0228uni0229uni022Auni022Buni022Cuni022Duni022Euni022Funi0230uni0231uni0232uni0233dotlessjuni0250uni0251uni0252uni0253uni0254uni0255uni0256uni0257uni0258schwauni025Auni025Buni025Cuni025Duni025Euni025Funi0260uni0261uni0262 gammalatinuni0264uni0265hhookuni0267uni0268uni0269uni026Auni026Buni026Cuni026Duni026Euni026Funi0270uni0271uni0272uni0273uni0274uni0275uni0276uni0277uni0278uni0279uni027A rturnrthookuni027Cuni027Duni027Euni027F Rsmallcap Rsmallcapinvshookeshdotlessjstrokehook eshshortreveshcurltturntrthookubar upsilonlatinvhookvturnwturnyturn Ysmallcapzrthookzcurlezhezhcurl glottalstopglottalstoprevinvglottalstopinvcstretch bilabialclick Bsmallcap eopenclosed Gsmallhook Hsmallcap jcrossedtailkturned Lsmallcapqhookglottalstopbarglottalstopbarrevdzaltonedezhdzcurltsteshtccurluni02a9uni02aauni02abuni02ACuni02aduni02aeuni02afhsuper hhooksuperjsuperrsuper rturnsuperrturnrthooksuper Rturnsuperwsuperysuperprimemod primedblmod quoteleftmod apostrophe apostropherev ringhalfright ringhalfleftglottalstopmodglottalstopreversedmodfrontedbackedraisedlowereduni02c8macronmodifier acutemodifier gravemodifierverticallinelowmod macronlowmod gravelowmod acutelowmodcolontriangularmodcolontriangularhalfmodringhalfrightcenteredringhalfleftcentered tackupmid tackdownmidplusmodminusmoduni02DEuni02DFuni02E0uni02E1uni02E2uni02E3uni02E4 toneextrahightonehightonemidtonelow toneextralowuni02EAuni02EBuni02ecuni02EDuni02eeuni02EFuni02F0uni02F1uni02F2uni02f3uni02F4uni02F5uni02F6uni02F7uni02F8uni02F9uni02FAuni02FBuni02FCuni02fduni02FEuni02FF gravecomb acutecombcircumflexcomb tildecomb macroncomb overlinecmb brevecomb dotaccentcmb diaeresiscomb hookabovecombringcmbhungarumlautcmb caroncombverticallineabovecmbdblverticallineabovecmb gravedblnospuni0310breveinvertedcmbcommaturnedabovecmb commaabovecmbcommareversedabovecmbcommaaboverightcmb gravebelowcmb acutebelowcmbuni0318uni0319uni031Ahorncombringlefthalfsubnospuni031Duni031Euni031F minusbelowcmbuni0321uni0322 dotbelowcombuni0324 ringbelowcmb commasubnosp cedillacmb ogonekcmblinevertsubnospbridgebelowcmbdblarchinvertedbelowcmb caronbelowcmbcircumflexbelowcmb brevebelowcmbbreveinvertedbelowcmb tildebelowcmbmacronbelowcmb lowlinecmb dbllowlinecmbtildeoverlaycmbstrokeshortoverlaycmbstrokelongoverlaycmbsolidusshortoverlaycmbsoliduslongoverlaycmbringrighthalfsubnospuni033Auni033Bseagullbelowcmbuni033Duni033Euni033F gravetonecmbuni0341perispomenigreekcmb koroniscmbdialytikatonoscmbuni0345uni0346uni0347uni0348uni0349uni034Auni034Buni034Cuni034Duni034Euni034funi0350uni0351uni0352uni0353uni0354uni0355uni0356uni0357uni0358uni0359uni035Auni035Buni035Cuni035Duni035Euni035Funi0360uni0361uni0362uni0363uni0364uni0365uni0366uni0367uni0368uni0369uni036Auni036Buni036Cuni036Duni036Euni036Funi0374uni0375 ypogegrammeniuni037Etonos dieresistonos Alphatonos anoteleia EpsilontonosEtatonos Iotatonos Omicrontonos Upsilontonos OmegatonosiotadieresistonosAlphaBetaGammaEpsilonZetaEtaThetaIotaKappaLambdaMuNuXiOmicronPiRhoSigmaTauUpsilonPhiChiPsi IotadieresisUpsilondieresis alphatonos epsilontonosetatonos iotatonosupsilondieresistonosalphabetagammadeltaepsilonzetaetathetaiotakappalambdauni03BCnuxiomicronrhosigma1sigmatauupsilonphichipsiomega iotadieresisupsilondieresis omicrontonos upsilontonos omegatonosthetasymbolgreek Upsilonhookuni03D3uni03D4phi1omega1uni03D7uni03F0uni03F1uni03f4uni03F5Iecyrillic_grave Iocyrillic Djecyrillic Gjecyrillic Ecyrillic Dzecyrillic Icyrillic Yicyrillic Jecyrillic Ljecyrillic Njecyrillic Tshecyrillic KjecyrillicIicyrillic_graveUshortcyrillic Dzhecyrillic Acyrillic Becyrillic Vecyrillic Gecyrillic Decyrillic Iecyrillic Zhecyrillic Zecyrillic IicyrillicIishortcyrillic Kacyrillic Elcyrillic Emcyrillic Encyrillic Ocyrillic Pecyrillic Ercyrillic Escyrillic Tecyrillic Ucyrillic Efcyrillic Khacyrillic Tsecyrillic Checyrillic Shacyrillic ShchacyrillicHardsigncyrillic YericyrillicSoftsigncyrillicEreversedcyrillic IUcyrillic IAcyrillic acyrillic becyrillic vecyrillic gecyrillic decyrillic iecyrillic zhecyrillic zecyrillic iicyrilliciishortcyrillic kacyrillic elcyrillic emcyrillic encyrillic ocyrillic pecyrillic ercyrillic escyrillic tecyrillic ucyrillic efcyrillic khacyrillic tsecyrillic checyrillic shacyrillic shchacyrillichardsigncyrillic yericyrillicsoftsigncyrillicereversedcyrillic iucyrillic iacyrilliciecyrillic_grave iocyrillic djecyrillic gjecyrillic ecyrillic dzecyrillic icyrillic yicyrillic jecyrillic ljecyrillic njecyrillic tshecyrillic kjecyrilliciicyrillic_graveushortcyrillic dzhecyrillic Omegacyrillic omegacyrillicuni0470uni0471 afii10147 afii10195Omegatitlocyrillicomegatitlocyrillic Otcyrillic otcyrillicthousandcyrillictitlocyrilliccmbpalatalizationcyrilliccmbuni0485uni0486uni0487uni0488uni0489uni048auni048buni048Cuni048Duni048Euni048Funi0490uni0491uni0492uni0493uni0494uni0495uni0496uni0497uni0498uni0499uni049Auni049Buni049Cuni049Duni049Euni049Funi04A0uni04A1uni04A2uni04A3uni04A4uni04A5uni04A6uni04A7uni04A8uni04A9uni04AAuni04ABuni04ACuni04ADuni04AEuni04AFuni04B0uni04B1uni04B2uni04B3uni04B4uni04B5uni04B6uni04B7uni04B8uni04B9uni04BAuni04BBuni04BCuni04BDuni04BEuni04BFuni04C0uni04C1uni04C2uni04C3uni04C4uni04C5uni04C6uni04C7uni04C8uni04C9uni04CAuni04CBuni04CCuni04CDuni04CEuni04cfuni04D0uni04D1uni04D2uni04D3uni04D4uni04D5uni04D6uni04D7uni04D8uni04d9uni04DAuni04DBuni04DCuni04DDuni04DEuni04DFDzeabkhasiancyrillicuni04E1uni04E2uni04E3uni04E4uni04E5uni04E6uni04E7uni04E8uni04E9uni04EAuni04EBuni04ECuni04EDuni04EEuni04EFuni04F0uni04F1Uhungarumlautcyrillicuhungarumlautcyrillicuni04F4uni04F5uni04f6uni04f7uni04F8uni04F9uni0510uni0511uni0512uni0513uni051auni051buni051cuni051duni051euni051funi0531uni0532uni0533uni0534uni0535uni0536uni0537uni0538uni0539uni053Auni053Buni053Cuni053Duni053Euni053Funi0540uni0541uni0542uni0543uni0544uni0545uni0546uni0547uni0548uni0549uni054Auni054Buni054Cuni054Duni054Euni054Funi0550uni0551uni0552uni0553uni0554uni0555uni0556uni0559uni055Auni055Buni055C commaarmenianuni055Euni055Funi0561uni0562uni0563uni0564 echarmenianuni0566uni0567uni0568uni0569uni056A iniarmenianuni056C xeharmenianuni056Euni056Funi0570uni0571uni0572uni0573 menarmenianuni0575 nowarmenianuni0577uni0578uni0579uni057Auni057Buni057Cuni057D vewarmenianuni057Funi0580uni0581uni0582uni0583uni0584uni0585uni0586uni0587uni0589uni058A dramarmenian afii57799 afii57801 afii57800 afii57802 hiriqhebrew afii57794 afii57795 patahhebrew qamatshebrew holamhebrew afii57796 dageshhebrew siluqhebrew maqafhebrew rafehebrew afii57842 shindothebrew sindothebrewsofpasuqhebrewupperdothebrew alefhebrew bethebrew gimelhebrew dalethebrewhehebrew vavhebrew zayinhebrew hethebrew tethebrew yodhebrewfinalkafhebrew kafhebrew lamedhebrewfinalmemhebrew memhebrewfinalnunhebrew nunhebrew samekhhebrew ayinhebrew finalpehebrewpehebrewfinaltsadihebrew tsadihebrew qofhebrew reshhebrew shinhebrew tavhebrew vavvavhebrew vavyodhebrew yodyodhebrew gereshhebrewgershayimhebrewinvcandrabindudevacandrabindudeva anusvaradeva visargadeva shortadevaadevaaadevaidevaiidevaudevauudeva rvocalicdeva lvocalicdeva ecandradeva eshortdevaedevaaideva ocandradeva oshortdevaodevaaudevakadevakhadevagadevaghadevangadevacadevachadevajadevajhadevanyadevattadevatthadevaddadevaddhadevannadevatadevathadevadadevadhadevanadevannnadevapadevaphadevabadevabhadevamadevayadevaradevarradevaladevalladevallladevavadevashadevassadevasadevahadeva oesigndeva ooesigndeva nuktadeva avagrahadeva aasigndeva isigndeva iisigndeva usigndeva uusigndevarvocalicsigndevarrvocalicsigndevaecandrasigndevaeshortsigndeva esigndeva aisigndevaocandrasigndevaoshortsigndeva osigndeva ausigndevavirama epristhamatra awsigndevaomdeva udattadeva anudattadeva gravedeva acutedevalongecandradeva uesigndeva uuesigndevaqadevakhhadevaghhadevazadeva dddhadevarhadevafadevayyadeva rrvocalicdeva llvocalicdevalvocalicvowelsigndevallvocalicsigndevadandadbldandazerodevaonedevatwodeva threedevafourdevafivedevasixdeva sevendeva eightdevaninedevaabbreviationsigndevaellipsisdotdeva acandradevaoedevaooedevaawdevauedevauuedevazhadeva heavyyadevaggadevajjadevaglottalstopdevadddadevabbadevaadak_bindi_gur bindi_gur visarga_gura_guraa_guri_gurii_guru_guruu_guree_gurai_guroo_gurau_gurka_gurkha_gurga_gurgha_gurnga_gurca_gurcha_gurja_gurjha_gurnya_gurtta_gurttha_gurdda_gurddha_gurnna_gurta_gurtha_gurda_gurdha_gurna_gurpa_gurpha_gurba_gurbha_gurma_gurya_gurra_gurla_gurlla_gurva_gursha_gursa_gurha_gur nukta_gur aamatra_gur imatra_gur iimatra_gur umatra_gur uumatra_gur eematra_gur aimatra_gur oomatra_gur aumatra_gur virama_gur uudatsign_gurkhha_gurghha_gurza_gurrra_gurfa_gurzero_gurone_gurtwo_gur three_gurfour_gurfive_gursix_gur seven_gur eight_gurnine_gur tippi_gur addak_guriri_gurura_gur ek_onkar_guryakashsign_guruni10A0uni10A1uni10A2uni10A3uni10A4uni10A5uni10A6uni10A7uni10A8uni10A9uni10AAuni10ABuni10ACuni10ADuni10AEuni10AFuni10B0uni10B1uni10B2uni10B3uni10B4uni10B5uni10B6uni10B7uni10B8uni10B9uni10BAuni10BBuni10BCuni10BDuni10BEuni10BFuni10C0uni10D0uni10D1uni10d2uni10D3uni10D4uni10D5uni10D6uni10D7uni10D8uni10D9uni10DAuni10DBuni10DCuni10DDuni10DEuni10DFuni10E0uni10E1uni10E2uni10E3uni10E4uni10E5uni10E6uni10E7uni10E8uni10E9uni10EAuni10EBuni10ECuni10EDuni10EEuni10EFuni10F0uni10F1uni10F2uni10F3uni10F4uni10F5uni10f9uni10fbuni10fcuni13A0uni13A1uni13A2uni13A3uni13A4uni13A5uni13A6uni13A7uni13A8uni13A9uni13AAuni13ABuni13ACuni13ADuni13AEuni13AFuni13B0uni13B1uni13B2uni13B3uni13B4uni13B5uni13B6uni13B7uni13B8uni13B9uni13BAuni13BBuni13BCuni13BDuni13BEuni13BFuni13C0uni13C1uni13C2uni13C3uni13C4uni13C5uni13C6uni13C7uni13C8uni13C9uni13CAuni13CBuni13CCuni13CDuni13CEuni13CFuni13D0uni13D1uni13D2uni13D3uni13D4uni13D5uni13D6uni13D7uni13D8uni13D9uni13DAuni13DBuni13DCuni13DDuni13DEuni13DFuni13E0uni13E1uni13E2uni13E3uni13E4uni13E5uni13E6uni13E7uni13E8uni13E9uni13EAuni13EBuni13ECuni13EDuni13EEuni13EFuni13F0uni13F1uni13F2uni13F3uni13F4uni1E00uni1E01 Bdotaccent bdotaccentuni1E04uni1E05uni1E06uni1E07 Ccedillaacute ccedillaacute Ddotaccent ddotaccentuni1E0Cuni1E0Duni1E0Euni1E0Funi1E10uni1E11Dcircumflexbelowdcircumflexbelow Emacrongrave emacrongrave Emacronacute emacronacuteEcircumflexbelowecircumflexbelow Etildebelow etildebelow Ecedillabreve ecedillabreve Fdotaccent fdotaccentGmacrongmacron Hdotaccent hdotaccent Hdotbelow hdotbelow Hdieresis hdieresisHcedillahcedilla Hbrevebelow hbrevebelow Itildebelow itildebelowIdieresisacuteidieresisacuteKacutekacute Kdotbelow kdotbelow Klinebelow klinebelow Ldotbelow ldotbelowLdotbelowmacronldotbelowmacron Llinebelow llinebelowLcircumflexbelowlcircumflexbelowMacutemacute Mdotaccent mdotaccent Mdotbelow mdotbelow Ndotaccent ndotaccent Ndotbelow ndotbelow Nlinebelow nlinebelowNcircumflexbelowncircumflexbelow Otildeacute otildeacuteuni1E4Euni1E4F Omacrongrave omacrongrave Omacronacute omacronacutePacutepacute Pdotaccent pdotaccentuni1E58uni1E59uni1E5Auni1E5Buni1E5Cuni1E5Duni1E5Euni1E5F Sdotaccent sdotaccent Sdotbelow sdotbelowuni1E64uni1E65uni1E66uni1E67uni1E68uni1E69 Tdotaccent tdotaccent Tdotbelow tdotbelowuni1E6Euni1E6FTcircumflexbelowtcircumflexbelowUdieresisbelowudieresisbelow Utildebelow utildebelowUcircumflexbelowucircumflexbelow Utildeacute utildeacuteUmacrondieresisumacrondieresisVtildevtilde Vdotbelow vdotbelowWgravewgraveWacutewacute Wdieresis wdieresis Wdotaccent wdotaccent Wdotbelow wdotbelow Xdotaccent xdotaccent Xdieresis xdieresis Ydotaccent ydotaccent Zcircumflexx zcircumflex Zdotbelow zdotbelowx Zlinebelowx zlinebelowx hlinebelow tdieresiswringxyringxarighthalfringxslongdotaccentxuni1e9euni1EA0uni1EA1uni1ea2uni1ea3uni1EA4acircumflexacuteAcircumflexgraveacircumflexgraveAcircumflexhookaboveacircumflexhookaboveAcircumflextildeacircumflextildeAcircumflexdotbelowacircumflexdotbelow Abreveacute abreveacute Abrevegrave abrevegraveAbrevehookaboveabrevehookabove Abrevetilde abrevetildeAbrevedotbelowabrevedotbelow Edotbelow edotbelow Ehookabove ehookaboveEtildeetildexEcircumflexacuteecircumflexacutexEcircumflexgravexecircumflexgravexEcircumflexhookabovexecircumflexhookaboveEcircumflextildexecircumflextildexEcircumflexdotbelowxecircumflexdotbelowx Ihookabovex ihookabove Idotbelow idotbelow Odotbelow odotbelow Ohookabove ohookaboveOcircumflexacuteocircumflexacuteuni1ED2ocircumflexgraveOcircumflexhookaboveocircumflexhookaboveOcircumflextildeocircumflextildeOcircumflexdotbelowocircumflexdotbelow Ohornacute ohornacute Ohorngrave ohorngraveOhornhookaboveohornhookabove Ohorntilde ohorntilde Ohorndotbelow ohorndotbelow Udotbelow udotbelow Uhookabove uhookabove Uhornacute uhornacute Uhorngrave uhorngraveUhornhookaboveuhornhookabove Uhorntilde uhorntilde Uhorndotbelow uhorndotbelowYgraveygrave Ydotbelow ydotbelow Yhookabove yhookaboveYtildeytildeuni1F00uni1F01uni1F02uni1F03uni1F04uni1F05uni1F06uni1F07uni1F08uni1F09uni1F0Auni1F0Buni1F0Cuni1F0Duni1F0Euni1F0Funi1F10uni1F11uni1F12uni1F13uni1F14uni1F15uni1F18uni1F19uni1F1Auni1F1Buni1F1Cuni1F1Duni1F20uni1F21uni1F22uni1F23uni1F24uni1F25uni1F26uni1F27uni1F28uni1F29uni1F2Auni1F2Buni1F2Cuni1F2Duni1F2Euni1F2Funi1F30uni1F31uni1F32uni1F33uni1F34uni1F35uni1F36uni1F37uni1F38uni1F39uni1F3Auni1F3Buni1F3Cuni1F3Duni1F3Euni1F3Funi1F40uni1F41uni1F42uni1F43uni1F44uni1F45uni1F48uni1F49uni1F4Auni1F4Buni1F4Cuni1F4Duni1F50uni1F51uni1F52uni1F53uni1F54uni1F55uni1F56uni1F57uni1F59uni1F5Buni1F5Duni1F5Funi1F60uni1F61uni1F62uni1F63uni1F64uni1F65uni1F66uni1F67uni1F68uni1F69uni1F6Auni1F6Buni1F6Cuni1F6Duni1F6Euni1F6Funi1F70uni1F71uni1F72uni1F73uni1F74uni1F75uni1F76uni1F77uni1F78uni1F79uni1F7Auni1F7Buni1F7Cuni1F7Duni1F80uni1F81uni1F82uni1F83uni1F84uni1F85uni1F86uni1F87uni1F88uni1F89uni1F8Auni1F8Buni1F8Cuni1F8Duni1F8Euni1F8Funi1F90uni1F91uni1F92uni1F93uni1F94uni1F95uni1F96uni1F97uni1F98uni1F99uni1F9Auni1F9Buni1F9Cuni1F9Duni1F9Euni1F9Funi1FA0uni1FA1uni1FA2uni1FA3uni1FA4uni1FA5uni1FA6uni1FA7uni1FA8uni1FA9uni1FAAuni1FABuni1FACuni1FADuni1FAEuni1FAFuni1FB0uni1FB1uni1FB2uni1FB3uni1FB4uni1FB6uni1FB7uni1FB8uni1FB9uni1FBAuni1FBBuni1FBClenisprosgegrammenipsili perispomenidialytikaperispomeniuni1FC2uni1FC3uni1FC4uni1FC6uni1FC7uni1FC8uni1FC9uni1FCAuni1FCBuni1FCC psilivaria psilioxiapsiliperispomeniuni1FD0uni1FD1uni1FD2uni1FD3uni1FD6uni1FD7uni1FD8uni1FD9uni1FDAuni1FDB dasiavaria dasiaoxiadasiaperispomeniuni1FE0uni1FE1uni1FE2uni1FE3uni1FE4uni1FE5uni1FE6uni1FE7uni1FE8uni1FE9uni1FEAuni1FEBuni1FECdialytikavaria dialytikaoxiavariauni1FF2uni1FF3uni1FF4uni1FF6uni1FF7uni1FF8uni1FF9uni1FFAuni1FFBuni1FFCoxiadasiauni2000uni2001uni2002uni2003uni2004uni2005uni2006uni2007uni2008uni2009uni200auni200b zeronojoinzerojoinuni200euni200funi2010uni2011 figuredash afii00208uni2016 underscoredbl quotereverseduni201funi2023onedotenleadertwodotenleaderuni2027uni2028uni2029uni202auni202buni202cuni202duni202euni202funi2031primeuni2033uni2034 primereverseduni2036uni2037uni2038uni203b exclamdbluni203doverlineuni203funi2040uni2041uni2042uni2043uni2045uni2046uni2047uni2048uni2049uni204auni204buni204cuni204duni204euni204funi2050uni2051uni2052uni2053uni2054uni2055uni2056uni2057uni2058uni2059uni205auni205buni205cuni205duni205euni205funi2060uni2061uni2062uni2063uni2064 zerosuperioruni2071 foursuperior fivesuperior sixsuperior sevensuperior eightsuperior ninesuperior plussuperior minussuperior equalsuperiorparenleftsuperiorparenrightsuperior nsuperior zeroinferior oneinferior twoinferior threeinferior fourinferior fiveinferior sixinferior seveninferior eightinferior nineinferior plusinferioruni208B equalinferiorparenleftinferiorparenrightinferioruni2090uni2091uni2092uni2093uni2094liramillnairarupeesheqeldongEuropfennigceditenge indian_rupeeleftharpoonaccentrightharpoonaccentuni20D2uni20D3uni20D6uni20D7uni20DBuni20DCuni20DDuni20DEuni20DFuni20e0uni20E1uni20E5uni20E6uni20E7uni20E8uni20E9uni20EAuni20EBuni20ECuni20EDuni20EEuni20EFuni20F0uni2100uni2101uni2103uni2105uni2106uni2107scrupleuni2109planckIfrakturlitreuni2114uni2116 recordrightRfrakturuni2120uni2121uni2126uni2127uni2129uni212auni212buni212euni2132uni2135uni2136uni2137uni2138uni213auni213buni2141uni2142uni2143uni2144uni214buni214duni214eonethird twothirdsuni2155uni2156uni2157uni2158uni2159uni215A oneeighth threeeighths fiveeighths seveneighthsuni215Funi2160uni2161uni2162uni2163uni2164uni2165uni2166uni2167uni2168uni2169uni216Auni216Buni216Cuni216Duni216Euni216Funi2170uni2171uni2172uni2173uni2174uni2175uni2176uni2177uni2178uni2179uni217Auni217Buni217Cuni217Duni217Euni217F arrowleftarrowup arrowright arrowdown arrowboth arrowupdnuni2196uni2197uni2198uni2199uni219Auni219Buni219Euni219Funi21A0uni21A1uni21A2uni21A3uni21A4uni21A5uni21A6uni21A7 arrowupdnbseuni21C4uni21C5uni21C6uni21C7uni21C8uni21C9uni21CA universaluni2201 existentialnotexistentialemptyset Delta.mathgradientelement notelement elementsmallsuchthat notcontains ownersmalleop coproduct minusplusdotplus divisionslash backslashmath asteriskmath ringoperator bulletmathcuberoot fourthroot proportional rightangleangledividesparallel logicaland logicalor intersectionunionuni222Cuni222d thereforebecauseratio proportionuni2238uni2239uni223auni223bsimilar wreathproductuni2242 asymptequal congruentuni224auni224b approachesuni2251uni2252uni2253uni2254uni2255 ringequaluni2258uni2259uni225auni225duni225e questionequal equivalence lessoverequalgreateroverequalmuchless muchgreateruni2272uni2273subsetsuperset notsubset notsuperset reflexsubsetreflexsuperset circleplus circleminusuni2297uni2298 circledotuni229auni229buni229c circlevertbarxornandnornarylogicaland narylogicalornaryintersectionuni22c3dotmathuni22eeuni22efuni22f0uni22f1uni2308uni2309uni230auni230buni2310frown slurbelowuni2329uni232auni2423circle dottedcircle whitebullet largecircleuni262Cspade heartopen diamondopenclubspadesuitwhiteheartdiamond clubsuitwhiteuni2669 musicalnotemusicalnotedbluni266Cuni266Duni266Euni266Funi2740uni2A00uni2a01uni2a02uni2D30uni2D31uni2D32uni2D33uni2D34uni2D35uni2D36uni2D37uni2D38uni2D39uni2D3Auni2D3Buni2D3Cuni2D3Duni2D3Euni2D3Funi2D40uni2D41uni2D42uni2D43uni2D44uni2D45uni2D46uni2D47uni2D48uni2D49uni2D4Auni2D4Buni2D4Cuni2D4Duni2D4Euni2D4Funi2D50uni2D51uni2D52uni2D53uni2D54uni2D55uni2D56uni2D57uni2D58uni2D59uni2D5Auni2D5Buni2D5Cuni2D5Duni2D5Euni2D5Funi2D60uni2D61uni2D62uni2D63uni2D64uni2D65uni2D6Funi2e16uni2e17uni2e18uni2e1auni2e1buni2e1euni2e1funi2e28uni2e29uni2e2auni2e2buni2e2cuni2e2duni2e2e lowcircumflex colonmodifier shortequalsSaltillosaltillouniA7AAffffiffllongs_t m_n_armenian m_e_armenian m_i_armenian v_n_armenian m_x_armenianuniFB1DuniFB1EyodyodpatahhebrewayinaltonehebrewuniFB21uniFB22uniFB23uniFB24uniFB25uniFB26uniFB27uniFB28uniFB29shinshindothebrewshinsindothebrewshindageshshindothebrewshindageshsindothebrewalefpatahhebrewalefqamatshebrewalefdageshhebrewbetdageshhebrewgimeldageshhebrewdaletdageshhebrewhedageshhebrewvavdageshhebrewzayindageshhebrewtetdageshhebrewyoddageshhebrewfinalkafdageshhebrewkafdageshhebrewlameddageshhebrewmemdageshhebrewnundageshhebrewsamekhdageshhebrewpefinaldageshhebrewpedageshhebrewtsadidageshhebrewqofdageshhebrewreshdageshhebrewshindageshhebrewtavdageshhebrewvavholamhebrew betrafehebrew kafrafehebrew perafehebrewaleflamedhebrewunifff9unifffaunifffbunifffcuniFFFD gur_ra.blwf gur_va.blwf gur_ha.blwfgur_ya_halant.pstfglyph152glyph153glyph154glyph155glyph156glyph157gur_ra_umatra.blwsgur_ha_umatra.blwsnounicode_3_1_3glyph161gur_ra_uumatra.blwsgur_ha_uumatra.blwsnounicode_3_1_30gur_na_uumatra_tippi.abvsgur_aamatra_bindi.abvsgur_u_addak.pstsgur_uu_addak.pstsgur_oo_addak.psts gur_ka.nuktgha_gur_nukta_gur.nuktnga_gur_nukta_gur.nuktca_gur_nukta_gur.nuktcha_gur_nukta_gur.nuktjha_gur_nukta_gur.nuktnya_gur_nukta_gur.nukttta_gur_nukta_gur.nuktttha_gur_nukta_gur.nuktddha_gur_nukta_gur.nuktnna_gur_nukta_gur.nuktta_gur_nukta_gur.nukttha_gur_nukta_gur.nuktda_gur_nukta_gur.nuktdha_gur_nukta_gur.nuktna_gur_nukta_gur.nuktpa_gur_nukta_gur.nuktba_gur_nukta_gur.nuktbha_gur_nukta_gur.nuktma_gur_nukta_gur.nuktya_gur_nukta_gur.nuktra_gur_nukta_gur.nuktva_gur_nukta_gur.nuktglyph194 gur_ha.nukt gur_a.nukt gur_aa.nukt gur_i.nukt gur_ii.nukt gur_u.nukt gur_uu.nukt gur_ee.nukt gur_ai.nukt gur_oo.nukt gur_au.nuktgur_aa_bindi.abvsgur_va_umatra.blwsgur_va_uumatra.blwsgur_ra_virama.blws gur_ha.blws gur_va.blws gur_ra.blwscyrillic_cresc cyrillic_dotcyrillic_ukrainian_yi_yi_ligcyrillic_titloEngsamisc.bsc.csc.dsc.esc.fsc.gsc.hsc.isc.jsc.ksc.lsc.msc.nsc.osc.psc.qsc.rsc.ssc.tsc.usc.vsc.wsc.xsc.ysc.aesc.thornsc.z sc.oslash sc.ssharpsc.eth sc.lslashsc.asc.ohornsc.uhornsc.i_dotcyrillic_serb_be grave_cap acute_capcircumflex_cap caron_caphungarianumlaut_cap gravedbl_cap dapostrophe lapostrophe tapostrophecircleoperatorfit.0fit.1fit.2fit.3fit.4fit.5fit.6fit.7fit.8fit.9 zeroslasheddev_ka_ssa.akhndev_ja_nya.akhndev_ta_ta.pres dev_ta.vatudev_sha_ca.pres dev_sha.vatudev_sha_va.pres dev_ra_u.blwsdev_ra_uu.blws dev_ka.half dev_kha.half dev_ga.half dev_gha.half dev_ca.half dev_ja.half dev_jha.half dev_nya.half dev_nna.half dev_ta.half dev_tha.halfdev_da_da_half.pres dev_dha.half dev_na.half dev_ba.half dev_bha.half dev_ma.half dev_ya.half dev_la.half dev_lla.half dev_llla.half dev_va.half dev_sha.half dev_ssa.half dev_sa.half dev_ha.halfdev_na_half_na.halfdev_rra_ra.halfdev_ka_ssa.akhn.halfdev_ja_nya.akhn.halfdev_ta_ta.halfdev_ta.half.vatudev_sha_ca.halfdev_sha.vatu.halfdev_sha_va.half dev_ra.rphfdev_rakaar.blwfdev_kash_au_mark dev_e_ra.abvsdev_ai_ra.abvsdev_sha_half_na_half.presdev_da_half_ma_half.presdev_ta_half_na_half.presdev_pa_half_ta_half.presdev_pa.half.vatudev_sha_half_la_half.presdev_ka_ka.presdev_nga_ka.presdev_nga_kha.presdev_nga_ga.presdev_nga_gha.presdev_nya_ja.presdev_da_gha.presdev_da_da.presdev_da_dha.presdev_da_ba.presdev_da_bha.presdev_da_ma.presdev_da_ya.presdev_da_va.presdev_tta_tta.presdev_tta_ttha.presdev_ttha_ttha.presdev_dda_half_ga.presdev_dda_half_dda.presdev_dda_half_ddha.presdev_ha_half_ma.presdev_ha_half_ya.presdev_la_half_ha.presdev_sa_half_ta_half_ra.presdev_ra_anusvara.rphfdev_candrabindu_combdev_e_ra_anusvara.abvs dev_rakaardev_ha_rrvocalic.blwsdev_ha_rvocalic.blwsdev_ha_ra.blwsdev_ha_half_nna.presdev_ha_half_la.presdev_ha_half_va.presdev_ha_half_na.presdev_ha_half_ma_half.pres dev_pa.half dev_pha.halfdev_na_half_na.pres dev_jha.vatu dev_la.vatu dev_sa.vatu dev_za.vatudev_ka_na.presdev_kha_na.presdev_gha_na.presdev_ca_na.presglyph275dev_ta_na.presdev_tha_na.presdev_da_na.presdev_dha_na.presdev_pa_na.presglyph297dev_ma_na.presdev_va_na.presdev_ka_half_ta_half.presdev_ca_half_ca_half.presdev_nga_nga.presdev_nga_na.presdev_ka_ra_ya.presdev_rakaar_u.blwsdev_rakaar_uu.blwsdev_dddha_alt.blwfdev_rha_alt.blwf dev_qa.half dev_khha.half dev_ghha.half dev_za.half dev_fa.halfindic_question indic_exclam dev_ka.vatu caron_side  ÿÿ>¦²ƒ„„…‹ŒŒ‘•––—œž£¤¤¥«¬¬­­®±²µ¶¶·¼½½¾ÃÄÅÆÕÖרêëëììíïðóôõöö÷÷ø-./0abcdpqrs‘¯°°±ÇÈÈÉÉÊÊË]^_`z{{|Ÿ ¹º»¼ÀÁÂÃîïïðÑÒÕÖ¥¦¦§©ªµ¶·¸¸¹Þßàá"#*++,./233456=>?@AB\]^_…††‡‡ˆˆ‰Š‹‹ŒŽ–—™šš››œ¥¦§¨ª««¬ëìóôõöýþ  ½¾¿ÀÁÂËÌÌÍÖ×üý  ! " , - Y Z Z [ _ ` b c c d o p p q Œ  Ž ™ š Ÿ   ¡ ¢ ¢ £ £ ¤ Ä Å Æ Ç Î Ï Ñ Ò Ý Þ Þ ß ß à á â â ã ã ä ä å                    , - - . . / / 0 0 1 : ; ; < B C D E I J J K Q R S T U V Z [ \ ] ] ^ ^T$,4<DL;Ó€B6,2qr ( ) Æ    ¾” DFLTDarmnVcyrlddev2†devaÄgeorgrek gur2guru.hebrDlatnRÿÿ $ÿÿ MKD SRB ÿÿÿÿ SAN $ÿÿ  #ÿÿ  # SAN $ÿÿ  #ÿÿ  #ÿÿÿÿÿÿÿÿÿÿ .CAT @ISM HLSM HNSM HSKS HTRK Pnl Zÿÿ !ÿÿÿÿÿÿ"ÿÿ%abvsàabvsæakhnìblwfòblwfúblwsblwsc2scc2scccmpccmp"ccmp(dlig4dlig:frac@halfFhligLhligRligaXliga^ligadligajloclploclvlocl|nukt‚nuktˆpnumŽpres”pres pstf¬psts²rphf¸smcp¾smcpÄvatuÊzeroÐ) !*, "  + $%&($%&'#2fnv~†Ž–ž¦°¸ÂÊÒÚâêòú "*2:BJRZbjr|†’œ¤®ºÂÊÒÚâêòú¨ÀÊFJÆÒHf²äôF"Trz~‚¨¬¼ò  B < L ¨ Ö  t † – ¦ ø B ² Æ2>v¬Ê˜¼8^zÌZdÆÖæê,ñ¡  Ç ¬LóJ" Ä ¥ ¦ § ¨ © ª « ¬ ­ ® ¯ ° ± ² ³ ´ µ ¶ · ¸ ¹ º » ¼ ¿ Á ½  À ¾ à ŠÆ D]¡¡¨¨²²ººÀÀcc rr! ÕòJ" Ä ¥ ¦ § ¨ © ª « ¬ ­ ® ¯ ° ± ² ³ ´ µ ¶ · ¸ ¹ º » ¼ ¿ ½  À ¾ Ç Ã Å Æ $=ˆˆ’’šš  òòbb qq!óÈñv d $*06<BHNT©È¯Ê±¬ï¦í¤ë£±¨°¢¯¡®  °¬÷¢LM yy/OB 0 ϵ ϳ г е ѵ ѳGOW6 "( &IO %IL $O #L "II 'WAF 2< Å»b» Æ»q»c»r»28RXÎ ,>Pbt†˜ª¼ Ħ„¢ Ö¦Œ¢  ¦–¢ .¦¢ Ŧ¤¢ צ¬¢ 聆¢ ¦¶¢ /¦½¢ $(,28DHLRX&8Z|žÀâ ð©ò£î ì¡  © £ ¡ ©£ ¡ ñ©ó£ï í¡  © £  ¡ ©£ ¡ ú©ü£ø ö¡ û©ý£ù ÷¡„Œ–¤¬¶ÄÅ ô-õM,L À Ê ˜ tžÈÞ &.6>FNV\ o  o ÿoÿýoý o  " o þoþ " o  o  o  " o  o  o 0˜ ¢¾¾6 ,  ,Œ *Š )„ (• +•“¦¡„ Zʾî@FLRX^djpv|‚ˆŽ”𠦬²¸¾ÄÊÐÖÜâè׺׻ Tº T»¾µ¿µÀµÁµÂµÃµÄµÆµÇµÈµÉµÊµÌµÎµÏµÒµÔµÕµÖµ×µØµÃ³¿¸É¸Ò¸ : = @ N P Y2 ( Ÿ• `• a• b•„‡Šæ(V`jt~ˆ’œ¦°ºÄÎØâìö (2<FPZdnx‚Œ– ª´¾ÈÒÜ ‹ ‹ ‘‹ ’‹ “‹ ”‹ •‹ –‹ —‹ ˜‹ v‹—‹˜‹ w‹ x‹ y‹ z‹™‹ {‹ |‹ }‹ ~‹ ‹ €‹ ‹ ‚‹ ƒ‹ „‹ …‹ †‹›‹ ‡‹ ˆ‹ ‰‹ Š‹ ‹‹†‹ Œ‹ˆ‹ Ž‹`uw…‡‡%‰Š& c•ƒZ &@ œ• n j ž• › š • o k ` a b, " ™^ q¦ r^a}Œ*   s§ t§ u§dehf *4>HR\6789:;<=óôõúÿ   Þ+ó + 0++0õ+-ö+-ö+ÿ-2:B 0÷÷ùùý:; 0/b,:H N+ø+ +ü+ ++ ++ ++ +ø+øú¸$NXblv€Š”ž¨²¼ÆÐÚäîø ",6@JT^hr|†š¤® ç+ è+ é+ ê+ ë+ ì+ í+ î+ ï+ ð+ ñ+ ó+ ô+ 9+ :+ õ+ ö+ ÷+ ø+ +8 + ù+ ú+ û+ ü+ ý+ þ+ ÿ+ + V+ W+ X+ Y+ Z+ + + óöøøúü  69<<! Þ Þ" ã ã#   0  0 ð 9Z(2<FP ] 0 < 0 á 0 = 0 ã 0 > 0 ? 0óû9 á 0 ð+ ü 0+ ó 0(0+  ++++0¾fpz„ %+þ (08@ "+ !+ + + + + ê + ÷ à + , ð"(.4 8 ÷ 7 6 5 4 * ) þ ð ù ÿ &  ò++ Q 0+  çh",6@JT^ G+ @ B E H K L I ç ê ð ó ÷ ü 9  A F è ñRht”Òä&.6 P+ O+÷ +ö +õ +ô +ó $+þ #+ý %+þ (+ '+ÿ &+õ&.6 "+ !+ + + + +ö M ð ó &, 7 6 5 4 * ) ÷ýþÿ ç .>F+÷÷ùùý++ 0 0.>*43à / 0     -à#%& J 8 æ å 3 0 2! 1" S R   \ [" *F:;:;"++  R S11 0+  0+ÿÛ 0 "+ ü +ö "+:; ü DFLTDarmnPcyrl\dev2jdevaŠgeorªgrek¶gur2ÂguruÎhebrÞlatnÿÿÿÿÿÿ SAN ÿÿÿÿ SAN ÿÿÿÿÿÿÿÿ ÿÿÿÿIWR JII ÿÿ ÿÿ ÿÿ ÿÿ abvmbabvmhblwmnblwmxblwm€distˆkernŽmark”markšmark¢mark¬mark¶mark¾markÆmkmkÔmkmkÚ     0:DLT\dlt|„Œ”œ¤¬´¼ÈÐØàèÀ Ê Vn”d %ò-’.®2:5´6R8Ö>t@¾BðCJF˜G*GÆLTP>RhR°SúF@ÿÄÿØÿìÿìÿâÿØÿâÿìÿâÿöÿâÿâÿìÿçÿñÿâÿØÿÎÿÉÿâÿÎÿâÿöÿâÿÎÿìÿâÿâÿöÿöÿÎÿìÿìÿöÿìÿâÿØÿÎÿÉÿØÿÎÿìÿìÿöÿØÿâÿâÿâÿìÿìÿØÿöÿìÿìÿâÿâÿØÿÓÿÎÿâÿÎÿØÿâÿâÿØÿìÿìÿâÿâÿØÿìÿâÿâÿÎÿâÿìÿÓÿìÿâÿØÿÓÿÎÿØÿìÿâÿâÿâÿöÿâÿìÿØÿÎÿØÿìÿâÿØÿØÿâÿÎÿìÿâÿØÿÎÿÉÿìÿìÿÓÿâÿØÿâÿöÿìÿìÿÉÿÎÿÎÿöÿÄÿÝÿÝÿçÿÓÿìÿöÿØÿÓÿÎÿâÿÎÿâÿìÿâÿâÿìÿÎÿØÿìÿÎÿâÿâÿìÿØÿñÿìÿØÿÓÿÉÿÄÿØÿâÿìÿØÿØÿöÿØÿìÿâÿØÿâÿØÿçÿâÿØÿÎÿÉÿØÿØÿìÿìÿöÿâÿìÿöÿìÿØÿâÿâÿöÿÎÿâÿâÿâÿâÿìÿìÿâÿØÿÓÿÄÿØÿìÿØÿÎÿâÿØÿØÿØÿâÿÄÿâÿâÿìÿØÿâÿìÿØÿÓÿÎÿâÿØÿìÿØÿìÿÎÿìÿìÿöÿñÿöÿâÿâÿØÿöÿÎÿöÿöÿöÿöÿìÿöÿöÿöÿìÿìÿìÿöÿØÿöÿâÿØÿÉÿâÿÎÿìÿìÿØÿöÿØÿìÿöÿÎÿöÿìÿöÿçÿìÿâÿÝÿØÿÎÿöÿØÿØÿØÿìÿØÿâÿØÿØÿìÿØÿØÿØÿâÿØÿçÿìÿâÿÝÿØÿÄÿÎÿÎÿÎÿâÿâÿÄÿØÿìÿâÿÎÿÄÿØÿÎÿâÿØÿÎÿÉÿÄÿÎÿØÿâÿâÿöÿìÿØÿìÿâÿÎÿØÿâÿØÿâÿØÿÎÿÎÿÉM$$%%&'(())**+,--..//01 22 33 44 55 66 779:;;<<==‚‡ˆˆ‰‰ŠŽ‘’’”˜ šš ŸŸ  ÂÂÄÄÆÆÈÈÊÊÌÌÎÎÐÐÒÒÔÔÚÚÜÜÞÞààââääøøûûýýÿÿ       "" $$&&88::??yy¶¶ MMUUii¡¡ «« ­­ µµ··::ˆ$$&&(())**++,,--..//01224466779:;;<<==DDFGHHII JJMM PQ RRSSTTUUVV WW XXYZ[[ \\]] ‚ˆ‰‰ŠŽ‘”˜ššŸŸ¢¨©©ª­²²³³ ´¸ºº»¾¿¿ÁÁÂÂÃÃÄÄÅÅÆÆÇÇÈÈÊÊËËÌÌÎÎÏÏÑÑÔÔÕÕ××ÚÚÛÛÜÜÞÞààááââããääååøøûûýýÿÿ       !! ""## $$%% &&++--//11338899::;;<< ==>> ??@@ iiŒŒ ¢¢««¬¬ ­­®® µµ¶¶ ··¸¸ ::;; " # % & `$%&'()*+,-./012345679:;<=‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’”•–—˜šŸ ÂÄÆÈÊÌÎÐÒÔÚÜÞàâäøûýÿ "$&8:?y¶MUi¡«­µ·:tÐÒÿöÿöÿìÿñÿöÿöÿçÿöÿöÿñÿöÿìÿçÿìÿñÿñÿöÿûÿöÿñÿöÿûÿìÿçÿñÿöÿûÿûÿûÿöÿûÿìÿöÿìÿûÿìÿûÿìÿöÿöÿöÿöÿìÿöÿìÿñÿìÿöÿìÿûÿûÿñÿìÿñÿìÿöÿñÿöÿûÿìÿìÿöÿâÿñÿñÿìÿñÿöÿñÿûÿñÿìÿìÿçÿìÿöÿçÿñÿçÿñÿìÿìÿöÿöÿìÿöÿìÿÝÿñÿìÿöÿûÿöÿûÿöÿöÿâÿìÿØÿìÿöÿìÿìÿöÿñÿìÿìÿöÿìÿöÿöÿñÿöÿñÿìÿìÿñÿñÿâÿìÿìÿìÿìÿìÿìÿìÿìÿìÿöÿìÿâÿìÿöÿâÿìÿçÿìÿ°ÿ°ÿrÿìÿÎÿ°ÿ°ÿÎÿÎÿÎÿÄUDDEFGGHHIIJJKKLLMMNN OOPQRSTTUU VV WW XXYZ [[ \\ ]]¢§¨¨©©ª­³³´¸ºº»¾¿¿ ÁÁ ÃÃÅÅÇÇÉÉËËÍÍÏÏÑÑÕÕ××ÙÙÛÛÝÝááããååùù     !! ## %% ''++--//113399 <<>>@@vv VVnnŒŒ¢¢¬¬ ®® ¶¶ ¸¸ ;; " " # # % &EDDFHIIJJKL MMOO PQRRSS TTUU VVWWXX YZ[[\\]] ¢¨©­¯¯ ³³´¸»¾ ¿¿ÁÁÃÃÅÅÇÇËËÏÏÑÑÕÕ××ááããååññ    !!##%%++ -- // 11 33 99<< >> @@ 22 nn ¢¢ ¬¬®®¶¶¸¸;; " &iDEFGHIJKLMNOPQRSTUVWXYZ[\]¢£¤¥¦§¨©ª«¬­³´µ¶·¸º»¼½¾¿ÁÃÅÇÉËÍÏÑÕ×ÙÛÝáãåù !#%'+-/139<>@vVnŒ¢¬®¶¸; " # % &@8ÿØÿìšš©©ªªÅÅ›š©ªÅüX¶ÿâÿìÿâÿìÿâÿâÿØÿâÿìÿöÿâÿöÿìÿìÿìÿØÿìÿìjjkkssuuzz~~……‡‡ˆˆ‰‰ŠŠ‹‹‘‘“• kkww~~……ˆˆ‰‰‹‹””––——™Æjksuz~…‡ˆ‰Š‹‘“”•" ‡ÿèDåÿ`Šnš  &,28>DJPV\ÿbÿ²ÿ‰ÿò#B</8}8,41,‘4 #%26>BDFLRV ¡¨´âä &,28ÿDDÿnDÿXIÿuÿT;ÿL( & Z  &,28>DJPV\bhntz€†Œ’˜ž¤ª°¶¼ÂÈÎÔÚàæìòøþ "(.4:@FLRX^djpv|‚ˆŽ”𠦬²¸¾ÄÊÐÖÜâèîôú $*06<BHNTZ`flrx~„Š–œ¢¨®´ºÀÆÌÒØÞäêðöü &,28>DJPV\bhntz€†Œ’˜ž¤ª°¶¼ÂÈÎÔÚàæìòøþ "(.4:@FLRX^djpv|‚ˆŽ”𠦬²¸¾ÄÊÐÖÜâèîôú $*06<BHNTZ`flrx~„Š–œ¢¨®´ºÀÆÌÒØÞäêðöüXtvZiMtŸL?¶sŠFˆdZEvHßQJ- J'$¡'ÿ8.‰wÿ8„¾08jÿ8-ÿ8‰"Ø(ˆÈühhhhhhýhhhhŽŽš™ggŠŠŠŠŠrrrr[þþþþþþ£††33333!!!!ÇÇhhs"hh z"?I,hhhh¤•¤Š¤–¤Œ‡/‡/‡/l#l#l#l#l#OÇOŠ8v'Hÿ÷6Ïÿ8wÿ8#hþhþhþhþhþhþhþhþhþhhhhhhކŠ3Š3Š3Š3Š3Š3Š3Š3Š3r!r!r!r!r!Ç[Ç  î" qÏäF.ó. 冟ú*.%$=D]‚ˆ4Š˜;›ŸJ¢¨Oª±V´¸^»¿cÁÅhÈÙmÜÝêïòó‡‰*38:™bcœeežqrŸõõ¡ùù¢&&£==¤ÄÄ¥êó¦öý° ¸ÄÆ")Ð.7Ø?Aâ ¥ ½å ¿ ¿þ  Âÿ Ä Æ ¶¹¼ÀÃÓ ÙÜçéíî!óö#ùú'üü)ÿÿ*+ÎÎ,ÒÕ-1ÆÌÒØÞäêðö,28>DV\bhnt†Œ’˜ž¸¾ÄÊÐâèîôú $*06<BÿZÿýÿZÿZÿKÿ4ÿZÿZÿZÿZ ––ÐÿZ ––`ÿZ ––`ÿNÿZÿfÿ|ÿZ ––0ÿZÿZÿZÿZÿZÿZ ––ÀÿZÿZÿZÿZÿZ –– –– ÿZÿ@ÿ:ÿZÿ- ––@ÿFþÝÿýþöÿÿÿ:ÿÿþöÿÿþòÿÿþòÿÿþàÿÿþÏÿÿþôþáþìÿÿÿÿÿ ––ó”Öþ yôú $*06<BHNTZ`flrx~„Š–œ¢¨®´ºÀÆÌÒØÞäêðöü &,28>DJPV\bhntz€†Œ’˜ž¤ª°¶¼ÂÈÎÔÚàæìòøþ "(.4:@FLRX^djpv|‚ˆŽ”𠦬²¸¾ÄYÚqÚsäHÚgÚ[Ú‹ÚuÚ¤Ú¡ÚFÚ@Ú¶ÚyÚ‡Ú[ÚƒÚsÚHÚHÚnÚQÚÛÚXÚEÚ@Ú&FÚ'&+Ú$&åÚ&>ÚÚŽÚ0ÚÚ¾&O&6&A&&ß&&¢¢9&†&säcÚ%&jÚ,&œÚŒÚ&mÚ-&kž‡Ú6&nÚ9&ú&‡Ú-&,6&'`ÚiÚfÚ&“Ú‡Ú1&‡Ú1&jÚ2&jÚ2&VÚ&!þø( nBüä@,, èƒ÷, $=D]‰‰4ÆÇ5ÚÛ7ðñ9óó;45<]]>bc?eeAqrBxxDª«EõõGùùHI11J33K==LKKMNPQ*-S89W<=Y ¥ ½[ ¿ ¿t  Âu Ä Æv^_ ´Ýäææêì ðò#÷ø&ûû(ýþ)+-¾¿:ÂÅ<ÊÊ@ÍÍAÏÏBÖÖCD$6<BHNTZ`flrx~„Šœ¢¨®´ºÀÆÌÒØÞäöü &,28>DJPV\bhntz€†Œ’˜ž°ÂÈÎÔÚàæì¢¢ÿDDÿnD ––€ÿV3ÿVDÿVDþÞDÿY5ÿZDÿXIÿÿY:ÿ DÿYDÿUÿUÿDÿX0 ––PÿY7ÿUÿuÿuÿUÿUþÊ$ÿP/ÿ[0ÿX-ÿXÿM/ÿU ––Pÿ0ÿGÿ3ÿ>ÿs ––ÿ=ÿ[þîÿþÕ.þÕ.þÏ0þÚEþþþñþóþíþúÿ þþÿþòþÿþþþëþ÷þö ––€þö ––€þöþÍÿÉþ©Éþ¸ÿÿÌÿ2–®œ ‰&,28>DV\bhzŒž°ÂÔæøþ "(.4:@FLRX^dvˆš¬¾ÐÖÜâèîôú 0BTfxŠœ¢¨®ÀÒäö,>Pbt†˜ª¼Îàò "(.4:@FLRX^djpv|‚ˆŽ”𠦬²¸¾ÄÊÜâôú $*<NTflrx~„–œl –– HÅÏÇrÏ ––c§€è ––€¶ ––| ––@| ––| ––@| ––@| ––@| ––@GGGG´´À¿ÏÏÏÏÏÃÃÃÃƒà –– à –– à –– à –– à –– à –– QQQQ¤¤®®{{{{{á –– á –– á –– á –– µ –– µ –– µ ––Ï€Çè ––| ––à –– | ––à –– | ––à –– | ––à –– | ––à –– | ––à –– | ––à –– | ––à –– | ––à –– GQGQGQGQGQGQ´¤Ï{Ï{Ï{Ï{Ï{Ï{Ï{Ï{Ï{Ãá –– Ãá –– Ãá –– Ãá –– Ãá –– µ ––ƒµ ––¨ŽbR-Ô –– bO&$$((,,2288<<DDHHLLRR XX \\ ‚‡ Š‘”˜›Ÿ¢§$ª±*´¸2»¿7ÁÁ<99=bc>qr@êóBöýL T`b")l.7t?A~ ¨ ¨ ¬ ¬‚ ² ²ƒ ¸ ¸„ ¼ ¼… Ä Æ†{Ìö <BHNTZ`flrx~„Š–œ¢¨®´ºÀÆÌÒØÞä©&Ñ&©&]&Ç&Y&³&³& & &©& &Õ&½&Ç&Ñ&½&;&Ÿ&E&³&Ÿ&£&Ÿ&©&&Ñ&Ñ&Û&D]ÏÏ  ]]µÿþ!þÖ Y´ºÀÆÌÒØÞäêðöü &,28>DJPV\bhntz€†Œ’˜ž¤ª°¶¼ÂÈÎÔÚàæìòøþ "(.4:@FLRX^djpv|‚ˆŽ”𠦬²¸¾ÄW#WWWWWWWWW^lywyqyoyYyyqy¡yy:y9yµyzy„yXy‚ynyPyEyryKyÝySyDy=y%H%$%&%#%¥%$%/%Œ%Š%%ˆ%Â%5%1%B%%†%% %,%%‡%%%%÷" mØôßE**å…ù ¿$= D]$ ¥ ½> ¿ ¿W Ä ÄX ÔÕÖרÆÇÈÉËÐÑ 28>DJPV\bhntþàþôþñþ~þlÿ)ÿ)ÿ/ÿ)þÂ)þTÿ)ÈŽê P¢¨®´ºÀÆÌÒØÞäêðöü &,28>DJPV\bhntz€†Œ’˜ž¤ª°¶¼ÂÈÎÔÚàæìòøþ "(.4:@FLRX^djpv|ØyØHØÙ&ØLØpØgØRØ]ØAØäØ^ØØSØsØUØ_ذØq؉Ø|ØLØØ6Ø^ØÅØSØzØ^Ø ØØØõØvØ]ØËØpØ! ðï!ã!l!#!!'!C!!-!Z!0!.!8!X!!á!!ÝÁ!.!!Á!À!À!ˆ!5!!`!#!!! !}ä‹ÏÂ!×!8!î°kêÚyú iikmpqvŸ¡¶/»¾EÀÁIÆÊK ¡¤¦¨¯±ÞàáÒÓÔÕ £>DJPV\bhntz€†Œ’ÿ?&ÿt&ÿX&ÿY&ÿX&ÿƒ&ÿY&ÿZ.ÿ^=ÿ@.ÿ<#ÿ:%ÿ_8ÿc8ÿ 0&@ Ý ÝÉÝÇÛ Hª²´´ *06<BHNTZ`UA--UUE*7Kî& <z€†Œ’˜ž¤ª°¶¼ÂÈÎÔÚàæìòøþ "(.4:@FLRX^djpv|‚ˆŽ”𠦬²¸¾ÄÊÐÖÜ^6žU˜ÜYP’úNc^ÝYT4>JnÌ£{ ,††††Tÿ’J,¢TÈÜTÉÈT,TJJh̪†”J"6&¾ÌÎÒÔÛ 0 0 : = @ Z!ª²´´ *06<BHNTZ`T@,,TTE)6J|`† Bޔ𠦬²¸¾ÄÊÐÖÜâèîôú $*06<BHNTZ`flrx~„Š–œ¢¨®´ºÀÆÌÒØÞäêðöü &,28>DJPV\bhntz€†Œ’˜ž¤ª°¶¼ÂÈÎÔÚàæìòøþ "(.4:@FLRX^djpv|‚ˆŽ”𠦬²¸¾ÄÊÐÖÜâèîôú $*06<BHN@Š“XrXÞ2xX,Xr2‡XXÞ2lX6XQ2ŒXTX22TXX[2mXÜXW2ŽXTX]2XhXLX‘Xö2yXXü2…XXÒ2XrX]2™X^Xy2ŽXhX”Xy2‰XúXX2šXrXz2ªXcX9«X6X2§X@XnX=X‰2“XTXV2XTXè2vXX'2‹X¤X»2¾XšX–XXXX’XX%XX“XXM2uX,XèÜ¥X†XèÜuX†X£X†XiX†XuX,XuX,X“XJXX,XX,XuX@X‰XJXkXÈXuXÜXX^XMXÓXkX"X‰X@X X†XXTXuXX“XJX“XTX“XJX“XTX“XTXuX,X‰X¾XÅX¸X+2EX–î2ÖXý2®X/ª‰XþX…2)XX¾Û - - / 0 : Z!³µ¸,X,ÚXì¾ 6ntz€†Œ’˜ž¤ª°¶¼ÂÈÎÔÚàæìòøþ "(.4:@FLRX^djpv|‚ˆŽ”š ¦¬Ú€Ð€ú€¶€ € €”€p€„€D€þ€D€l€€0€€€€€€:€€€Ì€&€€€ô€€€€ê€þ€€b€þ€&€Š€ô€€€ê€–€þ€Š€&€&€€0€&€Ì€Æ€f€Ð€`giŠŒŒ*—›+¨¨0 v v1 Ž ‘2]^‘’“”¦§"(.4:@FLÿ\€€ÿA€ÿA€ÿA€þû€ÿ\€ÿe€î$ <z€†Œ’˜ž¤ª°¶¼ÂÈÎÔÚàæìòøþ "(.4:@FLRX^djpv|‚ˆŽ”𠦬²¸¾ÄÊÐÖÜŒÿìŒÿì@ÿìxÿìnÿì–ÿì´ÿì–ÿììÿì<ÿìªÿìZÿìÿìxÿìFÿìFÿìFÿì‚ÿìnÿìdÿì ÿìŒÿìdÿìdÿìÿìxÿì ÿì2ÿì(ÿìxÿìÿì<ÿìZÿìxÿìxÿìZÿì´ÿìnÿìFÿìPÿìZÿì(ÿì<ÿìdÿì<ÿìxÿìxÿì–ÿì‚ÿììÿØZÿØŒÿì–ÿìTÿºnÿÎnÿØ–ÿØ‚ÿì–ÿìŒÿì`cfŠ—›)¨©. u v0 Ž ’2 • ™7 þ ÿìþ ÿìD6L  $‚ÿ´‚ÿ´‚ÿ¾‚ÿ悎‘’“”]^ ÿ€ÿÝ€2þZ >~„Š–œ¢¨®´ºÀÆÌÒØÞäêðöü &,28>DJPV\bhntz€†Œ’˜ž¤ª°¶¼ÂÈÎÔÚàæìÚÿöÊÿöøÿöÿö&ÿöÚÿöbÿöÚÿöNÿöþÿö:ÿönÿöÿö&ÿöÿöÿöêÿöÿöþÿö0ÿöÿöÿöÂÿöÿöÿöÿöôÿöÿöÿöÿöêÿöôÿöÿöbÿöôÿölÿö¼ÿöôÿöÿöÿöÖÿö–ÿöŒÿöþÿöŠÿö&ÿöÿöÿö0ÿö®ÿöHÿö0ÿöÌÿöÆÿöpÿöÐÿöÚÿöôÿöÆÿö†ÿö¼ÿö˜ÿö`cfŠŽ)—›+¨ª0 v v3 Ž ’4 • ™9‹‹•–«« ` b d o š Ÿflrx~„Š–œ¢¨®´ºÀÆÌÒØÞäêðöÿ~ÿöþÞÿöþÞÿöÿ ÿöÿ`ÿñÿ`ÿ`ÿñÿ`ÿñÿ`ÿñÿ`ÿñþòÿñÿ$ÿñÿ`ÿñÿ`ÿñÿ`ÿñÿÿûÿ`ÿñÿ`ÿûÿ`ÿûÿ`ÿÿÿ`ÿÿÿ`ÿÿÿ`ÿÿÿ`•ÿ`w€f† $*06<BHNTro‚oJooÚoîoºo¦odo–oÈo âìîðñò()*-ßþÊpŠn  &,28>DJPV\hÿ0ƒÿºlÿVlÿ~l(бlPlxlÿ¦ÿâÿû æ#$%&'()* àÿ:lÔ^ø jÖÜâèîôú $*06<BHNTZ`flrx~„Š–œ¢¨®´ºÀÆÌÒØÞäêðöü &,28>DJPV\bhntz€†Œ’˜ž¤ª°¶¼ÂÈÎÔÚàæìòøþ "(.4:@FLPll`lÄlºllØlãÒÉjtlÄl6lTlœl´lºlöl klöldldlPl°lœllœl lâl<lœllØlØlˆlˆlœlìl°lØlVlVl2löllˆl(lˆl<l’lŽll4lœl´lºlnllœlˆlØlPlPlêf\i`d hh"hhh^h$iegHcžge/e:cœc¬h²d hþgþdûd¨iŽgÍc¶gºk½g·edõiødþdødÍg˜i¢eŒeþg e¨ggãåçîñ 23,,46=5TU=XX? å æ@  ,B 1 8Z > >b @ @c G Gd J Je P Pf T Ug ] ]ißà#$%&/12  - /BHNTZ`flrx~„Š–œÿ•lÿ‘lÿËeÿŽlÿœlÿŒlÿkÿËaÿeÿjeÿÎe eÿºeÿºeÿºeÿºet.Œ dÊÐÖÜâèîôú $*06<BHNTZ`flrx~„Š–œ¢¨®´ºÀÆÌÒØÞäêðöü &,28>DJPV\bhntz€†Œ’˜ž¤ª°¶¼ÂÈÎÔÚàæìòøþ ”¬²ø…ÿúRÿòf\R_ÿô4ÿ÷”ÿôQÿö ä>‡ÿÛøäÚ€‹”î²Ð6ÿôVÿé>ÒÃÿ‘€*€HVÿ¶”ÿì¶ÿí²fÿì€ÿ$Nÿ$ŠÿìÐ HHø\* Nÿô`ƒÿ“MÿÈ}ÿÃfÿ¬íÿj6ÿ®Çÿ¦?ÿ-(ÿ31ÿ3øÿh‰ÿ0šÿ0†mÿþ”ÿ¶–ìÿsåÿÿ‘øÿ‹Ûÿ™ÿ”åÿŽ˜R­ÿý‹¬ø f >ªÿçøŠŠî€ÿ¤†ÿî\ÿêý ó6=% Þ æ- í í6  ,7 2 8I < >P @ LS P P` T Ua ] ]c  !"+045@A *06<BHNTZ`ÿW ÿ}ÿoÿƒ‘ÿÿóþéÿéÿ%ÿéÿ%ÿéÿoˆÿˆü– 1djpv|‚ˆŽ”𠦬²¸¾ÄÊÐÖÜâèîôú $*06<BHNTZ`flrx~„nà|¦ðšÜàæ6: /£T,PÖð·î¤ãÂæ®ð€T¤úàú”Ü̪†è€úÈ4n sd1–%Á¸øÿÄÿâÙÿù«ÿºƒªçÿÓÓKx­É-ÿì#ÿì-ÿìÿö7ÿöT1óôõöøùúüýþÿ     67<= Þ         ! " & 4 5 6 7 T U 0 R S$ÿÿìÿ„ÈÿÄÿÎ& ÿ’ÿt"$ÿoÿ’ÿ[ÿQ˜@F "FLRX^djpv|‚ˆŽ”𠦬²¸¾ÄÊÐÖÜâèîôú ܪ\È*–*È*‚È*‚ÿР  ÿøxÿø–ÿø–ÿøÒ*n – –*´ *Ò* * *È*‚*x*d*d 6 x*x*x*n*dÿäxÿvô  !þÊ<H2ÜÈâAD\""âA9D\_ɉo1ÃÞYïËÅÛ]plee-the-bear-20251226/bear-engine/lib/000077500000000000000000000000001512343254000173125ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/lib/CMakeLists.txt000066400000000000000000000000151512343254000220460ustar00rootroot00000000000000subdirs(src) plee-the-bear-20251226/bear-engine/lib/doc/000077500000000000000000000000001512343254000200575ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/lib/doc/Doxyfile000066400000000000000000002266351512343254000216030ustar00rootroot00000000000000# Doxyfile 1.7.6.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 sequence of words) that should # identify the project. Note that if you do not use Doxywizard you need # to put quotes around the project name if it contains spaces. PROJECT_NAME = "Generic items library" # 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. PROJECT_NUMBER = # Using the PROJECT_BRIEF tag one can provide an optional one line description # for a project that appears at the top of each page and should give viewer # a quick idea about the purpose of the project. Keep the description short. PROJECT_BRIEF = # With the PROJECT_LOGO tag one can specify an logo or icon that is # included in the documentation. The maximum height of the logo should not # exceed 55 pixels and the maximum width should not exceed 200 pixels. # Doxygen will copy the logo to the output directory. PROJECT_LOGO = # 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 = . # 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-Cyrillic, 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 = ../src/ # 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 if your file system # 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 = NO # 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 = 8 # 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 = # This tag can be used to specify a number of word-keyword mappings (TCL only). # A mapping has the form "name=value". For example adding # "class=itcl::class" will allow you to use the command class in the # itcl::class meaning. TCL_SUBST = # 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 makes 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 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 the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and # unions are shown inside the group in which they are included (e.g. using # @ingroup) instead of on a separate page (for HTML and Man pages) or # section (for LaTeX and RTF). INLINE_GROUPED_CLASSES = NO # When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and # unions with only public data fields will be shown inline in the documentation # of the scope in which they are defined (i.e. file, namespace, or group # documentation), provided this scope is documented. If set to NO (the default), # structs, classes, and unions are shown on a separate page (for HTML and Man # pages) or section (for LaTeX and RTF). INLINE_SIMPLE_STRUCTS = NO # 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 penalty. # 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 roughly 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 # Similar to the SYMBOL_CACHE_SIZE the size of the symbol lookup cache can be # set using LOOKUP_CACHE_SIZE. This cache is used to resolve symbols given # their name and scope. Since this can be an expensive process and often the # same symbol appear multiple times in the code, doxygen keeps a cache of # pre-resolved symbols. If the cache is too small doxygen will become slower. # If the cache is too large, memory is wasted. The cache size is given by this # formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range is 0..9, the default is 0, # corresponding to a cache size of 2^16 = 65536 symbols. LOOKUP_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 = YES # 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 namespaces 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 = NO # 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 = NO # 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 = YES # 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 # If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to # do proper type resolution of all parameters of a function it will reject a # match between the prototype and the implementation of a member function even # if there is only one candidate or it is obvious which candidate to choose # by doing a simple string match. By disabling STRICT_PROTO_MATCHING doxygen # will still accept a match between prototype and implementation in such cases. STRICT_PROTO_MATCHING = 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 = YES # 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 = YES # 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 macro 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 macros 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 = # The CITE_BIB_FILES tag can be used to specify one or more bib files # containing the references data. This must be a list of .bib files. The # .bib extension is automatically appended if omitted. Using this command # requires the bibtex tool to be installed. See also # http://en.wikipedia.org/wiki/BibTeX for more info. For LaTeX the style # of the bibliography can be controlled using LATEX_BIB_STYLE. To use this # feature you need bibtex and perl available in the search path. CITE_BIB_FILES = #--------------------------------------------------------------------------- # 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 = YES # 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 # The WARN_NO_PARAMDOC option can be enabled 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 = NO # 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 = #--------------------------------------------------------------------------- # 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 = ../src # 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++ *.d *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh # *.hxx *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.dox *.py # *.f90 *.f *.for *.vhd *.vhdl FILE_PATTERNS = *.c \ *.cc \ *.cxx \ *.cpp \ *.c++ \ *.d \ *.java \ *.ii \ *.ixx \ *.ipp \ *.tpp \ *.i++ \ *.inl \ *.h \ *.hh \ *.hxx \ *.hpp \ *.h++ \ *.idl \ *.odl \ *.cs \ *.php \ *.php3 \ *.inc \ *.m \ *.mm \ *.dox \ *.C \ *.CC \ *.C++ \ *.II \ *.I++ \ *.H \ *.HH \ *.H++ \ *.CS \ *.PHP \ *.PHP3 \ *.M \ *.MM # 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 be # 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. # Note that relative paths are relative to the directory from which doxygen is # run. EXCLUDE = # The EXCLUDE_SYMLINKS tag can be used to select whether or not files or # directories that are symbolic links (a Unix file system 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 = # 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 = NO # 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 or if # non of the patterns match the file name, INPUT_FILTER is applied. 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 # The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file # pattern. A pattern will override the setting for FILTER_PATTERN (if any) # and it is also possible to disable source filtering for a specific pattern # using *.ext= (so without naming a filter). This option only has effect when # FILTER_SOURCE_FILES is enabled. FILTER_SOURCE_PATTERNS = #--------------------------------------------------------------------------- # 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 = YES # 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 = YES # 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. Note that when using a custom header you are responsible # for the proper inclusion of any scripts and style sheets that doxygen # needs, which is dependent on the configuration options used. # It is advised to generate a default header using "doxygen -w html # header.html footer.html stylesheet.css YourConfigFile" and then modify # that header. Note that the header is subject to change so you typically # have to redo this when upgrading to a newer version of doxygen or when # changing the value of configuration settings such as GENERATE_TREEVIEW! 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 # style sheet in the HTML output directory as well, or it will be erased! HTML_STYLESHEET = # The HTML_EXTRA_FILES tag can be used to specify one or more extra images or # other source files which should be copied to the HTML output directory. Note # that these files will be copied to the base HTML output directory. Use the # $relpath$ marker in the HTML_HEADER and/or HTML_FOOTER files to load these # files. In the HTML_STYLESHEET file, use the file name only. Also note that # the files will be copied as-is; there are no commands or markers available. HTML_EXTRA_FILES = # The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. # Doxygen will adjust the colors in the style sheet 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 = NO # 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 (tabs) # at top of each HTML page. The value NO (the default) enables the index and # the value YES disables it. Since the tabs have the same information as the # navigation tree you can set this option to NO if you already set # GENERATE_TREEVIEW to YES. DISABLE_INDEX = NO # 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. # Since the tree basically has the same information as the tab index you # could consider to set DISABLE_INDEX to NO when enabling this option. GENERATE_TREEVIEW = NO # The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values # (range [0,1..20]) that doxygen will group on one line in the generated HTML # documentation. Note that a value of 0 will completely suppress the enum # values from appearing in the overview section. ENUM_VALUES_PER_LINE = 4 # 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 # Enable the USE_MATHJAX option to render LaTeX formulas using MathJax # (see http://www.mathjax.org) which uses client side Javascript for the # rendering instead of using prerendered bitmaps. Use this if you do not # have LaTeX installed or if you want to formulas look prettier in the HTML # output. When enabled you also need to install MathJax separately and # configure the path to it using the MATHJAX_RELPATH option. USE_MATHJAX = NO # When MathJax is enabled you need to specify the location relative to the # HTML output directory using the MATHJAX_RELPATH option. The destination # directory should contain the MathJax.js script. For instance, if the mathjax # directory is located at the same level as the HTML output directory, then # MATHJAX_RELPATH should be ../mathjax. The default value points to the # mathjax.org site, so you can quickly see the result without installing # MathJax, but it is strongly recommended to install a local copy of MathJax # before deployment. MATHJAX_RELPATH = http://www.mathjax.org/mathjax # The MATHJAX_EXTENSIONS tag can be used to specify one or MathJax extension # names that should be enabled during MathJax rendering. MATHJAX_EXTENSIONS = # 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 disadvantages are 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, 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 = # The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for # the generated latex document. The footer should contain everything after # the last chapter. If it is left blank doxygen will generate a # standard footer. Notice: only use this tag if you know what you are doing! LATEX_FOOTER = # 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 # The LATEX_BIB_STYLE tag can be used to specify the style to use for the # bibliography, e.g. plainnat, or ieeetr. The default style is "plain". See # http://en.wikipedia.org/wiki/BibTeX for more info. LATEX_BIB_STYLE = plain #--------------------------------------------------------------------------- # 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 style sheet 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 # pointed to by INCLUDE_PATH will be searched when 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 that # overrules the definition found in the source code. EXPAND_AS_DEFINED = # If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then # doxygen's preprocessor will remove all references to function-like macros # that are alone on a line, have an all uppercase name, and do not end with a # semicolon, because these 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 also works with HAVE_DOT disabled, but 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 use the Helvetica font for all dot files that # doxygen generates. When you want a differently looking font you can specify # the font name using DOT_FONTNAME. You 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 = Helvetica # 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 Helvetica font. # If you specify a different font using DOT_FONTNAME you can use DOT_FONTPATH to # set the path where dot can find it. 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 # 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 = NO # 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 = NO # If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen # will generate a 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 svg, png, jpg, or gif. # If left blank png will be used. If you choose svg you need to set # HTML_FILE_EXTENSION to xhtml in order to make the SVG files # visible in IE 9+ (other browsers do not have this requirement). DOT_IMAGE_FORMAT = png # If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to # enable generation of interactive SVG images that allow zooming and panning. # Note that this requires a modern browser other than Internet Explorer. # Tested and working are Firefox, Chrome, Safari, and Opera. For IE 9+ you # need to set HTML_FILE_EXTENSION to xhtml in order to make the SVG files # visible. Older versions of IE do not have SVG support. INTERACTIVE_SVG = NO # 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 MSCFILE_DIRS tag can be used to specify one or more directories that # contain msc files that are included in the documentation (see the # \mscfile command). MSCFILE_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 = 50 # 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 plee-the-bear-20251226/bear-engine/lib/src/000077500000000000000000000000001512343254000201015ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/lib/src/CMakeLists.txt000066400000000000000000000001231512343254000226350ustar00rootroot00000000000000include_directories( "${CMAKE_CURRENT_SOURCE_DIR}" ) subdirs( generic_items ) plee-the-bear-20251226/bear-engine/lib/src/generic_items/000077500000000000000000000000001512343254000227165ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/lib/src/generic_items/CMakeLists.txt000066400000000000000000000120611512343254000254560ustar00rootroot00000000000000cmake_minimum_required(VERSION 2.6) project(bear_generic_items) set( GENERIC_ITEM_TARGET_NAME bear_generic_items ) include_directories( ${BEAR_ENGINE_INCLUDE_DIRECTORY} ) #------------------------------------------------------------------------------- set( GENERIC_ITEM_SOURCE_FILES code/ambient_sound.cpp code/base_ground.cpp code/base_train.cpp code/block.cpp code/bridge.cpp code/browser_launcher_toggle.cpp code/camera.cpp code/camera_on_object.cpp code/camera_shaker.cpp code/camera_toggle.cpp code/change_camera_size.cpp code/clone_toggle.cpp code/crossfade_sequence.cpp code/cursor.cpp code/decorative_effect.cpp code/decorative_flow.cpp code/decorative_item.cpp code/decorative_model.cpp code/decorative_rectangle.cpp code/decorative_toggle.cpp code/delayed_kill_item.cpp code/delayed_level_loading.cpp code/density_rectangle_creator.cpp code/descending_ceiling.cpp code/environment_rectangle_creator.cpp code/explosion_effect_item.cpp code/force_rectangle_creator.cpp code/friction_rectangle_creator.cpp code/game_quit.cpp code/hidden_block.cpp code/item_creator.cpp code/killer.cpp code/level_loader_item.cpp code/level_loader_progression_item.cpp code/level_loader_toggle.cpp code/level_popper_toggle.cpp code/level_settings.cpp code/line.cpp code/lines.cpp code/linear_movement_sequence_loop.cpp code/mouse_detector.cpp code/mouse_over_manager.cpp code/path_trace.cpp code/path_tracer.cpp code/reference_item.cpp code/reflecting_decoration.cpp code/rocket.cpp code/rolling_credits.cpp code/slope.cpp code/spring.cpp code/star.cpp code/straight_slope.cpp code/teleport_item.cpp code/time_scale.cpp code/time_scale_on_input_toggle.cpp code/timer.cpp code/toggle.cpp code/toggle_group.cpp code/train.cpp code/trigger.cpp code/tweener_item.cpp code/unconditional_killer.cpp code/world_parameters.cpp debug/code/runtime_setting.cpp expr/code/any_input_pressed.cpp expr/code/applied_expression.cpp expr/code/boolean_constant_creator.cpp expr/code/check_item_class_creator.cpp expr/code/check_item_instance_creator.cpp expr/code/check_system_name_creator.cpp expr/code/expression_creator.cpp expr/code/get_toggle_status_creator.cpp expr/code/linear_constant_creator.cpp expr/code/logical_not_creator.cpp expr/code/timer_value.cpp forced_movement/code/applied_forced_movement.cpp forced_movement/code/forced_aiming_creator.cpp forced_movement/code/forced_goto_creator.cpp forced_movement/code/forced_join_creator.cpp forced_movement/code/forced_movement_toggle.cpp forced_movement/code/forced_movement_destructor_toggle.cpp forced_movement/code/forced_path_creator.cpp forced_movement/code/forced_rotation_creator.cpp forced_movement/code/forced_sequence_creator.cpp forced_movement/code/forced_stay_around_creator.cpp forced_movement/code/forced_tracking_creator.cpp forced_movement/code/forced_translation_creator.cpp forced_movement/code/natural_forced_movement_creator.cpp forced_movement/code/repeated_forced_movement.cpp forced_movement/code/toggle_in_forced_movement_creator.cpp game_variable/code/bool_game_variable_getter_creator.cpp game_variable/code/bool_game_variable_setter.cpp game_variable/code/int_game_variable_setter.cpp game_variable/code/string_game_variable_setter.cpp game_variable/code/real_game_variable_setter.cpp game_variable/code/u_int_game_variable_getter_creator.cpp game_variable/code/u_int_game_variable_setter.cpp layer/code/action_layer.cpp layer/code/decoration_layer.cpp layer/code/link_layer.cpp layer/code/item_information_layer.cpp layer/code/pattern_layer.cpp layer/code/physics_layer.cpp layer/code/recent_path_layer.cpp layer/code/runtime_settings_layer.cpp layer/code/wireframe_layer.cpp level_variable/code/bool_level_variable_getter_creator.cpp level_variable/code/u_int_level_variable_getter_creator.cpp link/code/base_link_visual.cpp link/code/chain_link_visual.cpp link/code/continuous_link_visual.cpp link/code/link_remover.cpp link/code/link_creator.cpp script/code/add_script_actor.cpp script/code/script_director.cpp shader/code/layer_shader.cpp shader/code/shader_variable.cpp system/code/system_fullscreen_toggle.cpp system/code/system_music_toggle.cpp system/code/system_sound_toggle.cpp ) if( NOT GENERIC_ITEM_LINK_TYPE ) if( BUILD_PLATFORM STREQUAL "android" ) set( GENERIC_ITEM_LINK_TYPE STATIC ) else() set( GENERIC_ITEM_LINK_TYPE SHARED ) endif() endif() add_library( ${GENERIC_ITEM_TARGET_NAME} ${GENERIC_ITEM_LINK_TYPE} ${GENERIC_ITEM_SOURCE_FILES} ) set_target_properties( ${GENERIC_ITEM_TARGET_NAME} PROPERTIES INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/${BEAR_ENGINE_INSTALL_LIBRARY_DIR}" ) install( TARGETS ${GENERIC_ITEM_TARGET_NAME} DESTINATION ${BEAR_ENGINE_INSTALL_LIBRARY_DIR} ) if(WIN32) target_link_libraries( ${GENERIC_ITEM_TARGET_NAME} bear_engine bear_gui intl ) else() target_link_libraries( ${GENERIC_ITEM_TARGET_NAME} bear_engine bear_gui ) endif() plee-the-bear-20251226/bear-engine/lib/src/generic_items/ambient_sound.hpp000066400000000000000000000023361512343254000262620ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A sound in the level. * \author Julien Jorge */ #ifndef __BEAR_AMBIENT_SOUND_HPP__ #define __BEAR_AMBIENT_SOUND_HPP__ #include "audio/sample.hpp" #include "engine/base_item.hpp" #include "engine/item_brick/item_with_toggle.hpp" #include "generic_items/class_export.hpp" #include "engine/export.hpp" namespace bear { /** * \brief A sound in the level. * * The following fields are supported by this item: * - sample (string) [required], the path of the sound to play, * - fadeout (real), fade the sample out during this duration, in seconds, * after the time limit (default = 0). * * \author Julien Jorge */ class GENERIC_ITEMS_EXPORT ambient_sound: public engine::item_with_toggle { DECLARE_BASE_ITEM(ambient_sound); /** \brief The type of the parent class. */ typedef engine::item_with_toggle super; public: ambient_sound(); }; // class ambient_sound } // namespace bear #endif // __BEAR_AMBIENT_SOUND_HPP__ plee-the-bear-20251226/bear-engine/lib/src/generic_items/base_ground.hpp000066400000000000000000000145141512343254000257240ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief The classes related to all grounds and walls. * \author Julien Jorge */ #ifndef __BEAR_BASE_GROUND_HPP__ #define __BEAR_BASE_GROUND_HPP__ #include "engine/item_brick/basic_renderable_item.hpp" #include "engine/item_brick/item_with_decoration.hpp" #include "engine/item_brick/item_with_friction.hpp" #include "engine/item_brick/item_with_restricted_z_collision.hpp" #include "engine/item_brick/z_shift.hpp" #include "universe/contact_mode.hpp" #include "generic_items/class_export.hpp" #include "engine/export.hpp" namespace bear { /** * \brief The base class for the grounds, ceiling and walls. * * The custom fields of this class are: * - top_left_contact_mode: string, how the contact is set on the collisions * on the top left corner, among "full_contact", "range_contact" * (default = "no_contact"). * * - top_right_contact_mode: string, how the contact is set on the collisions * on the top right corner, among "full_contact", "range_contact" * (default = "no_contact"). * * - bottom_left_contact_mode: string, how the contact is set on the * collisions on the bottom left corner, among "full_contact", * "range_contact" (default = "no_contact"). * * - bottom_right_contact_mode: string, how the contact is set on the * collisions on the bottom side, among "full_contact", "range_contact" * (default = "no_contact"). * * - top_sets_contact: boolean, tell if a collision on the top side sets the * contact flag of the colliding item (default = true). * * - bottom_sets_contact: boolean, tell if a collision on the bottom side sets * the contact flag of the colliding item (default = true). * * - left_sets_contact: boolean, tell if a collision on the left side sets the * contact flag of the colliding item (default = true). * * - right_sets_contact: boolean, tell if a collision on the right side sets * the contact flag of the colliding item (default = true). * * - middle_sets_contact: boolean, tell if a collision on the middle sets the * contact flag of the colliding item (default = true). * * - any field supported by the parent class. * * \author Julien Jorge */ class GENERIC_ITEMS_EXPORT base_ground: public engine::item_with_friction < engine::item_with_restricted_z_collision < engine::item_with_decoration < engine::basic_renderable_item > > >, public engine::z_shift { private: typedef engine::item_with_friction < engine::item_with_restricted_z_collision < engine::item_with_decoration < engine::basic_renderable_item > > > super; public: base_ground(); bool set_bool_field( const std::string& name, bool value ); bool set_string_field( const std::string& name, const std::string& value ); void init_default_contact_mode ( bool top, bool bottom, bool left, bool right ); universe::contact_mode::value_type get_left_contact_mode( const universe::collision_info& info ) const; universe::contact_mode::value_type get_left_contact_mode ( const universe::collision_info& info, const universe::position_type& pos ) const; universe::contact_mode::value_type get_right_contact_mode( const universe::collision_info& info ) const; universe::contact_mode::value_type get_right_contact_mode ( const universe::collision_info& info, const universe::position_type& pos ) const; universe::contact_mode::value_type get_top_contact_mode( const universe::collision_info& info ) const; universe::contact_mode::value_type get_top_contact_mode ( const universe::collision_info& info, const universe::position_type& pos ) const; universe::contact_mode::value_type get_bottom_contact_mode( const universe::collision_info& info ) const; universe::contact_mode::value_type get_bottom_contact_mode ( const universe::collision_info& info, const universe::position_type& pos ) const; universe::contact_mode::value_type get_middle_contact_mode( const universe::collision_info& info ) const; void do_z_shift( engine::base_item& that ) const; protected: void populate_loader_map( engine::item_loader_map& m ); private: universe::contact_mode::value_type compute_horizontal_contact_mode ( const universe::collision_info& info, const universe::position_type& pos, universe::contact_mode::value_type left_mode, universe::contact_mode::value_type right_mode ) const; universe::contact_mode::value_type compute_vertical_contact_mode ( const universe::collision_info& info, const universe::position_type& pos, universe::contact_mode::value_type bottom_mode, universe::contact_mode::value_type top_mode ) const; void set_default_contact_mode ( universe::contact_mode::value_type& c, bool one_side, bool other_side ); private: /** \brief Tell if the top side sets the contact. */ bool m_top_sets_contact; /** \brief Tell if the bottom side sets the contact. */ bool m_bottom_sets_contact; /** \brief Tell if the right side sets the contact. */ bool m_right_sets_contact; /** \brief Tell if the left side sets the contact. */ bool m_left_sets_contact; /** \brief Tell if the middle sets the contact. */ bool m_middle_sets_contact; /** \brief Tell how the contact is set on a collision on the top left corner. */ universe::contact_mode::value_type m_top_left_contact_mode; /** \brief Tell how the contact is set on a collision on the top right corner. */ universe::contact_mode::value_type m_top_right_contact_mode; /** \brief Tell how the contact is set on a collision on the bottom left corner. */ universe::contact_mode::value_type m_bottom_left_contact_mode; /** \brief Tell how the contact is set on a collision on the bottom right corner. */ universe::contact_mode::value_type m_bottom_right_contact_mode; }; // class base_ground } // namespace bear #endif // __BEAR_BASE_GROUND_HPP__ plee-the-bear-20251226/bear-engine/lib/src/generic_items/base_train.hpp000066400000000000000000000032211512343254000255340ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief The class describing the base of a base_train platform. * \author Sebastien Angibaud */ #ifndef __BEAR_BASE_TRAIN_HPP__ #define __BEAR_BASE_TRAIN_HPP__ #include "universe/physical_item.hpp" #include "universe/item_handle.hpp" #include "engine/base_item.hpp" #include "generic_items/class_export.hpp" #include namespace bear { /** * \brief The class describing a base_train platform. * \author Sebastien Angibaud */ class GENERIC_ITEMS_EXPORT base_train { public: /** \brief The type of the list in which we store the items depending on the base_train. */ typedef std::vector item_list; protected: void init(const universe::position_type& position); void update_items(); void to_string( std::string& str ) const; void collision_as_base_train ( engine::base_item& that, universe::collision_info& info ); void update_item_positions ( const universe::position_type& position, const universe::speed_type& speed ); void get_items( std::vector& d ) const; private: /** \brief The list of items on the platform. */ item_list m_list_items; /** \brief The list of the items that were on the platform. */ item_list m_old_items; /** \brief The last position of the platform. */ universe::position_type m_last_position; }; // class base_train } // namespace bear #endif // __BEAR_BASE_TRAIN_HPP__ plee-the-bear-20251226/bear-engine/lib/src/generic_items/block.hpp000066400000000000000000000045531512343254000245300ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A class representing a block. * \author Sebastien Angibaud */ #ifndef __BEAR_BLOCK_HPP__ #define __BEAR_BLOCK_HPP__ #include "generic_items/base_ground.hpp" #include "engine/item_brick/activable_sides.hpp" #include "universe/zone.hpp" #include "generic_items/class_export.hpp" #include "engine/export.hpp" namespace bear { /** * \brief A class representing an block. * * The custom fields of this class are: * - collision_threshold: unsigned integer, a threshold for the collisions in * the corners of the item, to choose if the other item is aligned on the * collided side or the nearest adjacent one (default = 10). * * \author Sebastien Angibaud */ class GENERIC_ITEMS_EXPORT block: public base_ground, public engine::activable_sides { DECLARE_BASE_ITEM(block); typedef base_ground super; public: block(); void build(); bool set_u_integer_field( const std::string& name, unsigned int value ); protected: void populate_loader_map( engine::item_loader_map& m ); bool collision_check_and_align ( engine::base_item& that, universe::collision_info& info ); void collision ( engine::base_item& that, universe::collision_info& info ); private: universe::zone::position choose_alignment_side ( const engine::base_item& that, const universe::collision_info& info ) const; bool align_bottom ( engine::base_item& that, universe::collision_info& info ); bool align_top( engine::base_item& that, universe::collision_info& info ); bool align_left( engine::base_item& that, universe::collision_info& info ); bool align_right( engine::base_item& that, universe::collision_info& info ); bool align_middle ( engine::base_item& that, universe::collision_info& info ); void post_alignment( engine::base_item& that, double f ); private: /** \brief A threshold for the collisions in the corners of the item, to choose if the other item is aligned on the collided side or the nearest adjacent one. */ universe::coordinate_type m_collision_threshold; }; // class block } // namespace bear #endif // __BEAR_BLOCK_HPP__ plee-the-bear-20251226/bear-engine/lib/src/generic_items/bridge.hpp000066400000000000000000000135731512343254000246740ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief An item that represents a bridge. * \author Sebastien Angibaud */ #ifndef __BEAR_BRIDGE_HPP__ #define __BEAR_BRIDGE_HPP__ #include "engine/base_item.hpp" #include "engine/item_brick/item_with_friction.hpp" #include "engine/item_brick/item_with_restricted_z_collision.hpp" #include "engine/item_brick/basic_renderable_item.hpp" #include "engine/item_brick/item_with_decoration.hpp" #include "engine/item_brick/z_shift.hpp" #include "engine/export.hpp" #include "generic_items/class_export.hpp" #include "generic_items/reference_item.hpp" #include "universe/derived_item_handle.hpp" #include namespace bear { /** * \brief An item that represents a bridge. * \author Sebastien Angibaud * The fields of this item are * - any field supported by the parent classes. */ class GENERIC_ITEMS_EXPORT bridge: public engine::item_with_decoration < engine::basic_renderable_item < engine::item_with_friction < engine::item_with_restricted_z_collision < engine::base_item > > > > { DECLARE_BASE_ITEM(bridge); public: /** \brief The type of the parent class. */ typedef engine::item_with_decoration < engine::basic_renderable_item < engine::item_with_friction < engine::item_with_restricted_z_collision < engine::base_item > > > > super; /** \brief A class that stores informations about an item on bridge. */ class item_on_bridge { public: /** \brief The type of the item handle. */ typedef universe::derived_item_handle< engine::base_item > item_handle; public: item_on_bridge(); ~item_on_bridge(); void set_item_on_bridge(engine::base_item* item); reference_item* get_reference_item(); const reference_item* get_reference_item() const; const item_handle& get_item() const; bool operator<( const item_on_bridge& that ) const; private: /* \brief The item on the bridge. */ item_handle m_item; /* \brief The reference item under the item. */ reference_item* m_reference_item; }; // class item_on_bridge /** \brief The type of the list in which we store items in bridge. */ typedef std::list< item_on_bridge > items_list; /** \brief The type of a item in the list. */ typedef std::list< item_on_bridge >::iterator items_list_iterator; /** \brief The type of a item in the list. */ typedef std::list< item_on_bridge >::const_iterator items_list_const_iterator; public: bridge(); bool set_item_field( const std::string& name, base_item* value ); bool set_real_field( const std::string& name, double value ); void progress( bear::universe::time_type elapsed_time ); void on_enters_layer(); void get_visual( std::list& visuals ) const; bool is_valid() const; protected: void populate_loader_map( engine::item_loader_map& m ); private: void add_bridge_visuals ( std::list& visuals, const base_item* start, const base_item* end, const universe::coordinate_type& unity, universe::coordinate_type& length, universe::position_type& previous_pos ) const; void add_bridge_visual ( std::list& visuals, const universe::position_type& left_pos, const universe::position_type& right_pos ) const; void collision_as_bridge ( engine::base_item& that, universe::collision_info& info ); void collision( engine::base_item& that, universe::collision_info& info ); bool align_on_bridge ( engine::base_item& that, universe::collision_info& info ); universe::position_type compute_align_position ( engine::base_item& that, const universe::position_type& previous_pos, const universe::position_type& next_pos) const; void compute_neighboor ( const universe::position_type& pos, universe::position_type& previous_pos, universe::position_type& next_pos) const; void search_or_create_item(engine::base_item& that); void update_items_list(); bool check_erase_item (items_list_iterator it, const universe::position_type& previous_pos, const universe::position_type& next_pos) const; universe::coordinate_type compute_giving_way (const base_item& item) const; bool check_item ( const universe::position_type& pos, const universe::position_type& previous_pos, const universe::position_type& next_pos, universe::coordinate_type margin ) const; void get_dependent_items( universe::physical_item::item_list& d ) const; void apply_angle_to ( engine::base_item& that, const universe::collision_info& info) const; universe::coordinate_type get_bridge_length() const; void create_extremities( base_item* & item, base_item* reference); private: /** \brief The list of collised items. */ items_list m_items; /** \brief The How far the bridge can fall. */ universe::coordinate_type m_max_fall; /** \brief Reference item on top left corner for line computing. */ base_item* m_top_left_ref; /** \brief Reference item on top right corner for line computing. */ base_item* m_top_right_ref; /** \brief Given reference item on top left corner. */ base_item* m_top_left_reference; /** \brief Given reference item on top right corner. */ base_item* m_top_right_reference; /** \brief The object that will manage the z position of the colliding items. */ engine::z_shift m_z_shift; /** \brief The width of the surface of the bridge. */ static const universe::coordinate_type s_line_width; }; // class bridge } // namespace bear #endif // __BEAR_BRIDGE_HPP__ plee-the-bear-20251226/bear-engine/lib/src/generic_items/browser_launcher_toggle.hpp000066400000000000000000000027221512343254000303370ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief This class launchs the default browser with an url. * \author Sebastien Angibaud */ #ifndef __BEAR_BROWSER_LAUNCHER_TOGGLE_HPP__ #define __BEAR_BROWSER_LAUNCHER_TOGGLE_HPP__ #include "engine/item_brick/item_with_toggle.hpp" #include "engine/base_item.hpp" #include "engine/export.hpp" #include "generic_items/class_export.hpp" namespace bear { /** * \brief This item launchs the default browser with an url. * * The custom fields of this class are : * - \a url: string, the url to open (default = none). * - any field supported by the parent class. * * \author Sebastien Angibaud */ class GENERIC_ITEMS_EXPORT browser_launcher_toggle: public engine::item_with_toggle { DECLARE_BASE_ITEM(browser_launcher_toggle); public: /** \brief The type of the parent class. */ typedef engine::item_with_toggle super; public: browser_launcher_toggle(); bool set_string_field( const std::string& name, const std::string& value ); private: void on_toggle_on( engine::base_item* activator ); private: /** \brief The url to open. */ std::string m_url; }; // class browser_launcher_toggle } // namespace bear #endif // __BEAR_BROWSER_LAUNCHER_TOGGLE_HPP__ plee-the-bear-20251226/bear-engine/lib/src/generic_items/camera.hpp000066400000000000000000000102771512343254000246660ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A simple camera. * \author Julien Jorge */ #ifndef __BEAR_CAMERA_HPP__ #define __BEAR_CAMERA_HPP__ #include "engine/base_item.hpp" #include "engine/export.hpp" #include "generic_items/class_export.hpp" namespace bear { /** * \brief A simple camera. * * The valid fields for this item are * - \a valid_min.x: (real) the minimum valid x-position of the camera * (default = 0), * - \a valid_max.x: (real) the maximum valid x-position of the camera * (default = the width of the level, * - \a valid_min.y: (real) the minimum valid y-position of the camera * (default = 0), * - \a valid_max.y: (real) the maximum valid y-position of the camera * (default = the height of the level, * - \a max_move_length: (real) the maximum movement of the camera * (default = infinity), * - \a size.min_width: (real) the minimum width of the camera (default = 0), * - \a size.min_height: (real) the minimum height of the camera * (default = 0), * - \a size.max_width: (real) the maximum width of the camera * (default = infinity), * - \a size.min_width: (real) the minimum width of the camera * (default = infinity), * - any field supported by the parent classes. * * \author Julien Jorge */ class GENERIC_ITEMS_EXPORT camera: public engine::base_item { DECLARE_BASE_ITEM(camera); public: typedef engine::base_item super; TEXT_INTERFACE_DECLARE_METHOD_LIST(super, init_exported_methods) public: camera(); bool is_valid() const; void build(); void progress( universe::time_type elapsed_time ); bool set_real_field( const std::string& name, double value ); bool set_bool_field( const std::string& name, bool value ); void set_valid_area( const universe::rectangle_type& area ); void set_min_size( const universe::size_box_type& min_size ); void set_max_size( const universe::size_box_type& max_size ); void set_max_move_length( universe::coordinate_type max_zoom_length ); void set_max_zoom_length( universe::coordinate_type max_zoom_length ); void set_wanted_size( const universe::size_box_type& s ); void set_shaker_force( double agitation_force ); const universe::size_box_type& get_default_size() const; void set_active_on_build(); void activate(); void smooth_activate( universe::time_type d ); void focus_on( const engine::base_item& item ); protected: void progress_zoom( universe::time_type elapsed_time ); void adjust_position( const universe::position_type& center_position, universe::time_type elapsed_time ); void teleport( const universe::position_type& center_position ); private: void adjust_position_x( universe::coordinate_type center_position, universe::coordinate_type max_move ); void adjust_position_y( universe::coordinate_type center_position, universe::coordinate_type max_move ); void stay_valid(); void progress_zoom_with_ratio( universe::time_type elapsed_time ); static void init_exported_methods(); private: /** \brief The area in which the camera can be set. */ universe::rectangle_type m_valid_area; /** \brief Maximum length of a camera movement. */ universe::coordinate_type m_max_move_length; /** \brief Maximum length of a change of size. */ universe::coordinate_type m_max_zoom_length; /** \brief The default size of the camera. */ universe::size_box_type m_default_size; /** \brief The size to attain. */ universe::size_box_type m_wanted_size; /** \brief The minimum size of the camera. */ universe::size_box_type m_min_size; /** \brief The maximum size of the camera. */ universe::size_box_type m_max_size; /** \brief The force of the shaker. */ double m_shaker_force; /** \brief Indicates if the camera start in active mode/ */ bool m_active; }; // class camera } // namespace bear #endif // __BEAR_CAMERA_HPP__ plee-the-bear-20251226/bear-engine/lib/src/generic_items/camera_on_object.hpp000066400000000000000000000036511512343254000267060ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A camera shared among objects. * \author Sébastien Angibaud */ #ifndef __BEAR_CAMERA_ON_OBJECT_HPP__ #define __BEAR_CAMERA_ON_OBJECT_HPP__ #include "communication/typed_message.hpp" #include "engine/messageable_item.hpp" #include "generic_items/camera.hpp" #include "universe/derived_item_handle.hpp" #include "generic_items/class_export.hpp" #include "engine/export.hpp" namespace bear { /** * \brief A camera shared among objects. * \author S�bastien Angibaud */ class GENERIC_ITEMS_EXPORT camera_on_object: public camera { DECLARE_BASE_ITEM(camera_on_object); TEXT_INTERFACE_DECLARE_METHOD_LIST(super, init_exported_methods) public: typedef bear::camera super; private: /** \brief The type of an handle on a object. */ typedef universe::derived_item_handle handle_type; /** \brief The type of a list of objects. */ typedef std::list handle_list; public: camera_on_object(); void progress( bear::universe::time_type elapsed_time ); bool set_item_list_field ( const std::string& name, const std::vector& value ); bool set_bool_field( const std::string& name, bool value ); void add_item(base_item* item); void remove_item(base_item* item); private: void progress_center( bear::universe::time_type elapsed_time ); void progress_fit_items( bear::universe::time_type elapsed_time ); static void init_exported_methods(); private: /** \brief The objects on which camera is focused. */ handle_list m_objects; /** \brief Indicates if camera is fit on items. */ bool m_fit_items; }; // class camera_on_object } // namespace bear #endif // __BEAR_CAMERA_ON_OBJECT_HPP__ plee-the-bear-20251226/bear-engine/lib/src/generic_items/camera_shaker.hpp000066400000000000000000000034641512343254000262230ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief An item that shakes the camera. * \author Sebastien Angibaud */ #ifndef __BEAR_CAMERA_SHAKER_HPP__ #define __BEAR_CAMERA_SHAKER_HPP__ #include "engine/base_item.hpp" #include "engine/item_brick/item_with_toggle.hpp" #include "engine/export.hpp" #include "generic_items/class_export.hpp" namespace bear { /** * \brief An item that shakes the camera. * * The valid fields for this item are * - \a shaker_force: (real) force of the shaker (default = 10), * - \a check_camera_intersection: (bool) Indicates if the shaker checks * camera intersection. * - any field supported by the parent classes. * * \author Sebastien Angiabud */ class GENERIC_ITEMS_EXPORT camera_shaker: public engine::item_with_toggle { DECLARE_BASE_ITEM(camera_shaker); public: typedef engine::item_with_toggle super; public: camera_shaker(); static void shake_around ( const engine::base_item& item, double force, universe::time_type duration, audio::sample* s = NULL ); bool set_real_field( const std::string& name, double value ); bool set_bool_field( const std::string& name, bool value ); void set_shaker_force(double force); void check_camera_intersection(bool value); void progress_on( universe::time_type elapsed_time ); private: /** \brief The force of the agitation. */ double m_shaker_force; /** \brief Indicates if the shaker checks camera intersection. */ bool m_camera_intersection; }; // class camera_shaker } // namespace bear #endif // __BEAR_CAMERA_SHAKER_HPP__ plee-the-bear-20251226/bear-engine/lib/src/generic_items/camera_toggle.hpp000066400000000000000000000040231512343254000262170ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A toggle that changes the current camera. * \author Julien Jorge */ #ifndef __BEAR_CAMERA_TOGGLE_HPP__ #define __BEAR_CAMERA_TOGGLE_HPP__ #include "engine/base_item.hpp" #include "engine/item_brick/item_with_toggle.hpp" #include "universe/derived_item_handle.hpp" #include "generic_items/class_export.hpp" #include "engine/export.hpp" namespace bear { class camera; /** * \brief A toggle that changes the current camera. * * The following fields are supported by this item: * - camera (item) [required], the camera to switch to, * - transition_duration (real), the time passed to the smooth activation * (default = 0.5). * * \author Julien Jorge */ class GENERIC_ITEMS_EXPORT camera_toggle: public engine::item_with_toggle { DECLARE_BASE_ITEM(camera_toggle); /** \brief The type of the parent class. */ typedef engine::item_with_toggle super; /** \brief The type of the handle on the item. */ typedef universe::derived_item_handle handle_type; public: camera_toggle(); bool set_item_field( const std::string& name, engine::base_item* value ); bool set_real_field( const std::string& name, double value ); bool is_valid() const; private: void build_off(); void on_toggle_on( engine::base_item* activator ); void on_toggle_off( engine::base_item* activator ); void switch_camera(); private: /** \brief The time passed to the starting smooth activation. */ universe::time_type m_starting_smooth_delay; /** \brief The time passed to the ending smooth activation. */ universe::time_type m_ending_smooth_delay; /** \brief The camera to activate. */ handle_type m_camera; }; // class camera_toggle } // namespace bear #endif // __BEAR_CAMERA_TOGGLE_HPP__ plee-the-bear-20251226/bear-engine/lib/src/generic_items/change_camera_size.hpp000066400000000000000000000025511512343254000272210ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief An item that changes the size of the camera. * \author Julien Jorge */ #ifndef __BEAR_CHANGE_CAMERA_SIZE_HPP__ #define __BEAR_CHANGE_CAMERA_SIZE_HPP__ #include "engine/base_item.hpp" #include "engine/export.hpp" #include "generic_items/class_export.hpp" namespace bear { /** * \brief A simple change_camera_size. * * The valid fields for this item are * - \a wanted_width: (real) the width to give to the camera * (default = 320), * - \a wanted_height: (real) the height to give to the camera * (default = 240), * - any field supported by the parent classes. * * \author Julien Jorge */ class GENERIC_ITEMS_EXPORT change_camera_size: public engine::base_item { DECLARE_BASE_ITEM(change_camera_size); public: typedef engine::base_item super; public: change_camera_size(); bool set_real_field( const std::string& name, double value ); void progress( universe::time_type elapsed_time ); private: /** \brief The size to attain. */ universe::size_box_type m_wanted_size; }; // class change_camera_size } // namespace bear #endif // __BEAR_CHANGE_CAMERA_SIZE_HPP__ plee-the-bear-20251226/bear-engine/lib/src/generic_items/class_export.hpp000066400000000000000000000015701512343254000261400ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Definition of the GENERIC_ITEMS_EXPORT macro according to the fact * that we create the library or link to it. * \author Julien Jorge */ #ifndef __BEAR_GENERIC_ITEMS_CLASS_EXPORT_HPP__ #define __BEAR_GENERIC_ITEMS_CLASS_EXPORT_HPP__ #ifndef GENERIC_ITEMS_EXPORT # ifdef _WIN32 # ifdef bear_generic_items_EXPORTS # define GENERIC_ITEMS_EXPORT __declspec(dllexport) # else # define GENERIC_ITEMS_EXPORT __declspec(dllimport) # endif // def bear_generic_items_EXPORTS # else // def _WIN32 # define GENERIC_ITEMS_EXPORT # endif // def _WIN32 #endif // ndef GENERIC_ITEMS_EXPORT #endif // __BEAR_GENERIC_ITEMS_CLASS_EXPORT_HPP__ plee-the-bear-20251226/bear-engine/lib/src/generic_items/clone_toggle.hpp000066400000000000000000000027321512343254000260740ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief This toggle creates a clone of an item each time it is turned on. * \author Julien Jorge */ #ifndef __BEAR_CLONE_TOGGLE_HPP__ #define __BEAR_CLONE_TOGGLE_HPP__ #include "engine/item_brick/item_with_toggle.hpp" #include "engine/base_item.hpp" #include "engine/export.hpp" #include "generic_items/class_export.hpp" namespace bear { /** * \brief This toggle creates a clone of an item each time it is turned on. * * The custom fields of this class are : * - \a items: list of items, the items to clone (default = none), * - any field supported by the parent class. * * \author Julien Jorge */ class GENERIC_ITEMS_EXPORT clone_toggle: public engine::item_with_toggle { DECLARE_BASE_ITEM(clone_toggle); public: /** \brief The type of the parent class. */ typedef engine::item_with_toggle super; public: ~clone_toggle(); bool set_item_list_field ( const std::string& name, const std::vector& value ); private: void on_toggle_on( engine::base_item* activator ); private: /** \brief The items to clone. */ std::vector m_items; }; // class clone_toggle } // namespace bear #endif // __BEAR_CLONE_TOGGLE_HPP__ plee-the-bear-20251226/bear-engine/lib/src/generic_items/code/000077500000000000000000000000001512343254000236305ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/lib/src/generic_items/code/ambient_sound.cpp000066400000000000000000000011621512343254000271630ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::ambient_sound class. * \author Julien Jorge */ #include "generic_items/ambient_sound.hpp" BASE_ITEM_EXPORT( ambient_sound, bear ) /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ bear::ambient_sound::ambient_sound() { set_can_move_items(false); set_phantom(true); } // ambient_sound::ambient_sound() plee-the-bear-20251226/bear-engine/lib/src/generic_items/code/base_ground.cpp000066400000000000000000000316011512343254000266250ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::base_ground class. * \author Julien Jorge */ #include "generic_items/base_ground.hpp" #include "universe/collision_info.hpp" #include "engine/item_brick/loader/z_shift_loader.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ bear::base_ground::base_ground() : m_top_sets_contact(true), m_bottom_sets_contact(true), m_right_sets_contact(true), m_left_sets_contact(true), m_middle_sets_contact(true), m_top_left_contact_mode( universe::contact_mode::no_contact ), m_top_right_contact_mode( universe::contact_mode::no_contact ), m_bottom_left_contact_mode( universe::contact_mode::no_contact ), m_bottom_right_contact_mode( universe::contact_mode::no_contact ) { } // base_ground::base_ground() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type \c boolean * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::base_ground::set_bool_field( const std::string& name, bool value ) { bool result(true); if ( name == "base_ground.top_sets_contact" ) m_top_sets_contact = value; else if ( name == "base_ground.bottom_sets_contact" ) m_bottom_sets_contact = value; else if ( name == "base_ground.left_sets_contact" ) m_left_sets_contact = value; else if ( name == "base_ground.right_sets_contact" ) m_right_sets_contact = value; else result = super::set_bool_field(name, value); return result; } // base_ground::set_bool_field() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type \c string. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::base_ground::set_string_field ( const std::string& name, const std::string& value ) { bool result(true); if ( name == "base_ground.top_left_contact_mode" ) m_top_left_contact_mode = universe::contact_mode::from_string( value ); else if ( name == "base_ground.bottom_left_contact_mode" ) m_bottom_left_contact_mode = universe::contact_mode::from_string( value ); else if ( name == "base_ground.top_right_contact_mode" ) m_top_right_contact_mode = universe::contact_mode::from_string( value ); else if ( name == "base_ground.bottom_right_contact_mode" ) m_bottom_right_contact_mode = universe::contact_mode::from_string( value ); else result = super::set_string_field(name, value); return result; } // base_ground::set_string_field() /*----------------------------------------------------------------------------*/ /** * \brief Initialize the contact modes. * \param top Tell if the top side is considered. * \param bottom Tell if the bottom side is considered. * \param left Tell if the left side is considered. * \param right Tell if the right side is considered. * * If two adjacent sides are considered, and if the corresponding corner is set * to universe::contact_mode::no_contact, then the contact mode becomes * universe::contact_mode::range_contact. Otherwise if only one adjacent edge is * considered, the contact mode becomes universe::contact_mode::full_contact. */ void bear::base_ground::init_default_contact_mode ( bool top, bool bottom, bool left, bool right ) { set_default_contact_mode( m_top_left_contact_mode, top, left ); set_default_contact_mode( m_top_right_contact_mode, top, right ); set_default_contact_mode( m_bottom_left_contact_mode, bottom, left ); set_default_contact_mode( m_bottom_right_contact_mode, bottom, right ); } // base_ground::init_default_contact_mode() /*----------------------------------------------------------------------------*/ /** * \brief Get the contact mode on the left side. * \param info The description of the collision. */ bear::universe::contact_mode::value_type bear::base_ground::get_left_contact_mode ( const universe::collision_info& info ) const { return get_left_contact_mode( info, info.get_bottom_left_on_contact() ); } // base_ground::get_left_contact_mode() /*----------------------------------------------------------------------------*/ /** * \brief Get the contact mode on the left side. * \param info The description of the collision. * \param pos The bottom left position where the other item is considered. */ bear::universe::contact_mode::value_type bear::base_ground::get_left_contact_mode ( const universe::collision_info& info, const universe::position_type& pos ) const { if ( !m_left_sets_contact ) return universe::contact_mode::no_contact; else return compute_vertical_contact_mode ( info, pos, m_bottom_left_contact_mode, m_top_left_contact_mode ); } // base_ground::get_left_contact_mode() /*----------------------------------------------------------------------------*/ /** * \brief Get the contact mode on the right side. * \param info The description of the collision. */ bear::universe::contact_mode::value_type bear::base_ground::get_right_contact_mode ( const universe::collision_info& info ) const { return get_right_contact_mode( info, info.get_bottom_left_on_contact() ); } // base_ground::get_right_contact_mode() /*----------------------------------------------------------------------------*/ /** * \brief Get the contact mode on the right side. * \param info The description of the collision. * \param pos The bottom left position where the other item is considered. */ bear::universe::contact_mode::value_type bear::base_ground::get_right_contact_mode ( const universe::collision_info& info, const universe::position_type& pos ) const { if ( !m_right_sets_contact ) return universe::contact_mode::no_contact; else return compute_vertical_contact_mode ( info, pos, m_bottom_right_contact_mode, m_top_right_contact_mode ); } // base_ground::get_right_contact_mode() /*----------------------------------------------------------------------------*/ /** * \brief Get the contact mode on the top side. * \param info The description of the collision. */ bear::universe::contact_mode::value_type bear::base_ground::get_top_contact_mode ( const universe::collision_info& info ) const { return get_top_contact_mode( info, info.get_bottom_left_on_contact() ); } // base_ground::get_top_contact_mode() /*----------------------------------------------------------------------------*/ /** * \brief Get the contact mode on the top side. * \param info The description of the collision. * \param pos The bottom left position where the other item is considered. */ bear::universe::contact_mode::value_type bear::base_ground::get_top_contact_mode ( const universe::collision_info& info, const universe::position_type& pos ) const { if ( !m_top_sets_contact ) return universe::contact_mode::no_contact; else return compute_horizontal_contact_mode ( info, pos, m_top_left_contact_mode, m_top_right_contact_mode ); } // base_ground::get_top_contact_mode() /*----------------------------------------------------------------------------*/ /** * \brief Get the contact mode on the bottom side. * \param info The description of the collision. */ bear::universe::contact_mode::value_type bear::base_ground::get_bottom_contact_mode ( const universe::collision_info& info ) const { return get_bottom_contact_mode( info, info.get_bottom_left_on_contact() ); } // base_ground::get_bottom_contact_mode() /*----------------------------------------------------------------------------*/ /** * \brief Get the contact mode on the bottom side. * \param info The description of the collision. * \param pos The bottom left position where the other item is considered. */ bear::universe::contact_mode::value_type bear::base_ground::get_bottom_contact_mode ( const universe::collision_info& info, const universe::position_type& pos ) const { if ( !m_bottom_sets_contact ) return universe::contact_mode::no_contact; else return compute_horizontal_contact_mode ( info, pos, m_bottom_left_contact_mode, m_bottom_right_contact_mode ); } // base_ground::get_bottom_contact_mode() /*----------------------------------------------------------------------------*/ /** * \brief Get the contact mode on the middle side. * \param info The description of the collision. */ bear::universe::contact_mode::value_type bear::base_ground::get_middle_contact_mode ( const universe::collision_info& info ) const { if ( m_middle_sets_contact ) return universe::contact_mode::full_contact; else return universe::contact_mode::no_contact; } // base_ground::get_middle_contact_mode() /*----------------------------------------------------------------------------*/ /** * \brief Set the z position of an other item according to this item. * \param that The item whose z position must be set. */ void bear::base_ground::do_z_shift( engine::base_item& that ) const { z_shift::do_z_shift( that, *this ); } // base_ground::do_z_shift() /*----------------------------------------------------------------------------*/ /** * \brief Add the loaders of this item class into a given loader map. * \param m The map in which the loaders are inserted. */ void bear::base_ground::populate_loader_map( engine::item_loader_map& m ) { super::populate_loader_map(m); m.insert( engine::z_shift_loader(*this) ); } // base_ground::populate_loader_map() /*----------------------------------------------------------------------------*/ /** * \brief Find how the contact mode must be set for a collision by the top or * the bottom. * \param info The description of the collision. * \param pos The bottom left position where the other item is considered. * \param left_mode The mode defined for the corner on the left of the edge. * \param right_mode The mode defined for the corner on the right of the edge. */ bear::universe::contact_mode::value_type bear::base_ground::compute_horizontal_contact_mode ( const universe::collision_info& info, const universe::position_type& pos, universe::contact_mode::value_type left_mode, universe::contact_mode::value_type right_mode ) const { const universe::coordinate_type left = pos.x; const universe::coordinate_type right = left + info.other_item().get_width(); if ( left < get_left() ) { if ( (left_mode != universe::contact_mode::full_contact) && (right > get_right()) ) return right_mode; else return left_mode; } else if ( right > get_right() ) return right_mode; else return universe::contact_mode::full_contact; } // base_ground::compute_horizontal_contact_mode() /*----------------------------------------------------------------------------*/ /** * \brief Find how the contact mode must be set for a collision by the left or * the right. * \param info The description of the collision. * \param pos The bottom left position where the other item is considered. * \param bottom_mode The mode defined for the corner on the bottom of the edge. * \param top_mode The mode defined for the corner on the top of the edge. */ bear::universe::contact_mode::value_type bear::base_ground::compute_vertical_contact_mode ( const universe::collision_info& info, const universe::position_type& pos, universe::contact_mode::value_type bottom_mode, universe::contact_mode::value_type top_mode ) const { const universe::coordinate_type bottom = pos.y; const universe::coordinate_type top = bottom + info.other_item().get_height(); if ( bottom < get_bottom() ) { if ( (bottom_mode != universe::contact_mode::full_contact) && (top > get_top()) ) return top_mode; else return bottom_mode; } else if ( top > get_top() ) return top_mode; else return universe::contact_mode::full_contact; } // base_ground::compute_vertical_contact_mode() /*----------------------------------------------------------------------------*/ /** * \brief Initialize a contact modes. * \param c The contact to initialize. * \param one_side Tell if the this adjacent edge is considered. * \param other_side Tell if the other adjacent edge is considered. * * If both adjacent sides are considered, and if \a c is set to * universe::contact_mode::no_contact, then \a c becomes * universe::contact_mode::range_contact. Otherwise if only one adjacent edge is * considered, \a c becomes universe::contact_mode::full_contact. */ void bear::base_ground::set_default_contact_mode ( universe::contact_mode::value_type& c, bool one_side, bool other_side ) { if ( c != universe::contact_mode::no_contact ) return; if ( one_side && other_side ) c = universe::contact_mode::range_contact; else if ( one_side ^ other_side ) c = universe::contact_mode::full_contact; } // base_ground::set_default_contact_mode() plee-the-bear-20251226/bear-engine/lib/src/generic_items/code/base_train.cpp000066400000000000000000000067411512343254000264530ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::base_train class. * \author Sebastien Angibaud */ #include "generic_items/base_train.hpp" #include "universe/collision_info.hpp" #include /*----------------------------------------------------------------------------*/ /** * \brief Init the base train. */ void bear::base_train::init(const universe::position_type& position) { m_last_position = position; } // bear::base_train::init() /*----------------------------------------------------------------------------*/ /** * \brief Update list of items. */ void bear::base_train::update_items() { item_list::iterator it; std::list dead; for (it=m_list_items.begin(); it!=m_list_items.end(); ++it) if ( *it == NULL ) dead.push_front(it); for( ; !dead.empty(); dead.pop_front() ) m_list_items.erase( dead.front() ); } // bear::base_train::update_items() /*----------------------------------------------------------------------------*/ /** * \brief Give a string representation of the item. * \param str (out) The result of the convertion. */ void bear::base_train::to_string( std::string& str ) const { std::ostringstream oss; oss << "nb_items: " << m_list_items.size() << "\n"; str = str + oss.str(); } // base_train::to_string() /*----------------------------------------------------------------------------*/ /** * \brief Proceed the collision. * \param that The other item of the collision. * \param info Some informations about the collision. */ void bear::base_train::collision_as_base_train ( engine::base_item& that, universe::collision_info& info ) { if ( info.get_collision_side() == universe::zone::top_zone ) m_list_items.push_back(that); } // base_train::collision_as_base_train() /*----------------------------------------------------------------------------*/ /** * \brief Apply the movement of the item. * \param pos The position of the train. * \param speed The speed on the train. */ void bear::base_train::update_item_positions ( const universe::position_type& position, const universe::speed_type& speed ) { item_list::iterator it; for(it=m_list_items.begin(); it!=m_list_items.end(); ++it) if ( *it != NULL ) (*it)->set_left((*it)->get_left() + position.x - m_last_position.x); for(it=m_old_items.begin(); it!=m_old_items.end(); ++it) if ( *it != NULL ) if ( std::find(m_list_items.begin(), m_list_items.end(), *it) == m_list_items.end() ) // item is not on me anymore (*it)->set_speed ( (*it)->get_speed() + universe::speed_type(speed.x, 0) ); m_last_position = position; std::swap(m_old_items, m_list_items); m_list_items.clear(); } // base_train::update_item_positions() /*----------------------------------------------------------------------------*/ /** * \brief Get the items concerned by a progress/move of this one. * \param d (out) A list to which are added such items. */ void bear::base_train::get_items ( std::vector& d ) const { item_list::const_iterator it; for( it=m_list_items.begin(); it!=m_list_items.end(); ++it ) if ( *it != NULL ) d.push_back( it->get() ); for( it=m_old_items.begin(); it!=m_old_items.end(); ++it ) if ( *it != NULL ) d.push_back( it->get() ); } // base_train::get_items() plee-the-bear-20251226/bear-engine/lib/src/generic_items/code/block.cpp000066400000000000000000000211121512343254000254230ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::block class. * \author Sebastien Angibaud */ #include "generic_items/block.hpp" #include "universe/collision_align_policy.hpp" #include "universe/collision_info.hpp" #include "engine/item_brick/loader/activable_sides_loader.hpp" BASE_ITEM_EXPORT( block, bear ) /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ bear::block::block() : m_collision_threshold(10) { set_weak_collisions(false); } // block::block() /*----------------------------------------------------------------------------*/ /** * \brief Initialize the item. */ void bear::block::build() { super::build(); init_default_contact_mode ( top_side_is_active(), bottom_side_is_active(), left_side_is_active(), right_side_is_active() ); } // block::build() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type \c unsigned \c integer * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::block::set_u_integer_field( const std::string& name, unsigned int value ) { bool result(true); if ( name == "block.collision_threshold" ) m_collision_threshold = value; else result = super::set_u_integer_field(name, value); return result; } // block::set_u_integer_field() /*----------------------------------------------------------------------------*/ /** * \brief Add the loaders of this item class into a given loader map. * \param m The map in which the loaders are inserted. */ void bear::block::populate_loader_map( engine::item_loader_map& m ) { super::populate_loader_map(m); m.insert( engine::activable_sides_loader(*this) ); } // block::populate_loader_map() /*----------------------------------------------------------------------------*/ /** * \brief Check if the collision is on a solid side and align the other item. * \param that The other item of the collision. * \param info Some informations about the collision. * \return true if \a that has been aligned. */ bool bear::block::collision_check_and_align ( engine::base_item& that, universe::collision_info& info ) { if ( !satisfy_collision_condition(that) ) return false; bool align(false); switch( choose_alignment_side(that, info) ) { case universe::zone::bottom_zone: align = align_bottom(that, info); break; case universe::zone::top_zone: align = align_top(that, info); break; case universe::zone::middle_left_zone: align = align_left(that, info); break; case universe::zone::middle_right_zone: align = align_right(that, info); break; case universe::zone::middle_zone: align = align_middle(that, info); break; default: { CLAW_FAIL( "Invalid collision side." ); } } return align; } // block::collision_check_and_align() /*----------------------------------------------------------------------------*/ /** * \brief Call collision_check_and_align(). * \param that The other item of the collision. * \param info Some informations about the collision. */ void bear::block::collision ( engine::base_item& that, universe::collision_info& info ) { collision_check_and_align(that, info); } // block::collision() /*----------------------------------------------------------------------------*/ /** * \brief Choose the size on which the other item should be aligned. * \param that The other item of the collision. * \param info Some informations about the collision. */ bear::universe::zone::position bear::block::choose_alignment_side ( const engine::base_item& that, const universe::collision_info& info ) const { universe::zone::position result( info.get_collision_side() ); switch( info.get_collision_side() ) { case universe::zone::bottom_zone: case universe::zone::top_zone: { if ( (info.other_previous_state().get_left() >= get_right()) && (that.get_left() >= get_right() - m_collision_threshold) ) result = universe::zone::middle_right_zone; else if ( (info.other_previous_state().get_right() <= get_left()) && (that.get_right() <= get_left() + m_collision_threshold ) ) result = universe::zone::middle_left_zone; } break; case universe::zone::middle_left_zone: case universe::zone::middle_right_zone: { if ( (info.other_previous_state().get_bottom() >= get_top()) && (that.get_bottom() >= get_top() - m_collision_threshold) ) result = universe::zone::top_zone; else if ( (info.other_previous_state().get_top() <= get_bottom()) && (that.get_top() <= get_bottom() + m_collision_threshold ) ) result = universe::zone::bottom_zone; } break; case universe::zone::middle_zone: break; default: { CLAW_FAIL( "Invalid collision side." ); } } return result; } // block::choose_alignment_side() /*----------------------------------------------------------------------------*/ /** * \brief Align a colliding item on the bottom side. * \param that The other item of the collision. * \param info Some informations about the collision. */ bool bear::block::align_bottom ( engine::base_item& that, universe::collision_info& info ) { const universe::collision_align_policy policy ( get_bottom_contact_mode(info) ); const bool align = bottom_side_is_active() && collision_align_bottom(info, policy); if ( align ) post_alignment( that, get_bottom_friction() ); return align; } // block::align_bottom() /*----------------------------------------------------------------------------*/ /** * \brief Align a colliding item on the top side. * \param that The other item of the collision. * \param info Some informations about the collision. */ bool bear::block::align_top ( engine::base_item& that, universe::collision_info& info ) { const universe::collision_align_policy policy ( get_top_contact_mode(info) ); const bool align = top_side_is_active() && collision_align_top(info, policy); if ( align ) post_alignment( that, get_top_friction() ); return align; } // block::align_top() /*----------------------------------------------------------------------------*/ /** * \brief Align a colliding item on the left side. * \param that The other item of the collision. * \param info Some informations about the collision. */ bool bear::block::align_left ( engine::base_item& that, universe::collision_info& info ) { const universe::collision_align_policy policy ( get_left_contact_mode(info) ); const bool align = left_side_is_active() && collision_align_left(info, policy); if ( align ) post_alignment( that, get_left_friction() ); return align; } // block::align_left() /*----------------------------------------------------------------------------*/ /** * \brief Align a colliding item on the right side. * \param that The other item of the collision. * \param info Some informations about the collision. */ bool bear::block::align_right ( engine::base_item& that, universe::collision_info& info ) { const universe::collision_align_policy policy ( get_right_contact_mode(info) ); const bool align = right_side_is_active() && collision_align_right(info, policy); if ( align ) post_alignment( that, get_right_friction() ); return align; } // block::align_right() /*----------------------------------------------------------------------------*/ /** * \brief Align a colliding item on the middle of the item. * \param that The other item of the collision. * \param info Some informations about the collision. */ bool bear::block::align_middle ( engine::base_item& that, universe::collision_info& info ) { const universe::collision_align_policy policy ( get_middle_contact_mode(info) ); const bool align = collision_middle(info, policy); if ( align ) post_alignment( that, that.get_contact_friction() ); return align; } // block::align_middle() /*----------------------------------------------------------------------------*/ /** * \brief Do the common stuff to do after aligning an item. * \param that The other item of the collision. * \param f The contact friction to apply to \a that. */ void bear::block::post_alignment( engine::base_item& that, double f ) { that.set_contact_friction(f); that.set_contact_angle(0); do_z_shift(that); } // block::post_alignment() plee-the-bear-20251226/bear-engine/lib/src/generic_items/code/bridge.cpp000066400000000000000000000516611512343254000256010ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::bridge class. * \author Sebastie Angibaud */ #include "generic_items/bridge.hpp" #include "visual/scene_element_sequence.hpp" #include "engine/layer/layer.hpp" #include "engine/world.hpp" #include "engine/level_globals.hpp" #include "engine/item_brick/loader/z_shift_loader.hpp" #include "universe/collision_info.hpp" #include "universe/collision_repair.hpp" #include "universe/forced_movement/forced_tracking.hpp" BASE_ITEM_EXPORT( bridge, bear ) const bear::universe::coordinate_type bear::bridge::s_line_width = 10; /*----------------------------------------------------------------------------*/ /** * \brief Construtor. */ bear::bridge::item_on_bridge::item_on_bridge() : m_item(NULL), m_reference_item(NULL) { } // item_on_bridge() /*----------------------------------------------------------------------------*/ /** * \brief Destructor. */ bear::bridge::item_on_bridge::~item_on_bridge() { delete m_reference_item; m_reference_item = NULL; } // item_on_bridge::~item_on_bridge() /*----------------------------------------------------------------------------*/ /** * \brief Set item on the bridge. * \param The item on the bridge. */ void bear::bridge::item_on_bridge::set_item_on_bridge(engine::base_item* item) { CLAW_ASSERT ( item != NULL, "An item_on_bridge is created with NULL item" ); m_item = item_handle(item); m_reference_item = new bear::reference_item; m_reference_item->set_center_of_mass ( item->get_bottom_middle() + universe::position_type(0,-s_line_width/2) ); } // item_on_bridge() /*----------------------------------------------------------------------------*/ /** * \brief Return the reference item under the item on the bridge. */ bear::reference_item* bear::bridge::item_on_bridge::get_reference_item() { return m_reference_item; } // item_on_bridge::get_reference_item() /*----------------------------------------------------------------------------*/ /** * \brief Return the reference item under the item on the bridge. */ const bear::reference_item* bear::bridge::item_on_bridge::get_reference_item() const { return m_reference_item; } // item_on_bridge::get_reference_item() /*----------------------------------------------------------------------------*/ /** * \brief Return the item on the bridge. */ const bear::bridge::item_on_bridge::item_handle& bear::bridge::item_on_bridge::get_item() const { return m_item; } // item_on_bridge::get_item() /*----------------------------------------------------------------------------*/ /** * \brief Compare two item on bridge. * \return reference_item.hrizontal_middle < * that.reference_item.hrizontal_middle */ bool bear::bridge::item_on_bridge::operator< ( const item_on_bridge& that ) const { if ( m_reference_item == NULL ) return false; else if ( that.m_reference_item == NULL ) return true; else return m_reference_item->get_horizontal_middle() < that.m_reference_item->get_horizontal_middle(); } // item_on_bridge::operator<() /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ bear::bridge::bridge() : m_max_fall(0), m_top_left_ref(NULL), m_top_right_ref(NULL), m_top_left_reference(NULL), m_top_right_reference(NULL) { } // bridge::bridge() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type \c base_item. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::bridge::set_item_field ( const std::string& name, base_item* value ) { bool ok = true; if (name == "bridge.left_item") m_top_left_reference = value; else if (name == "bridge.right_item") m_top_right_reference = value; else ok = super::set_item_field(name, value); return ok; } // bridge::set_item_field() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type "real". * \param name The name of the field. * \param value The value of the field. */ bool bear::bridge::set_real_field ( const std::string& name, double value ) { bool result = true; if ( name == "bridge.max_fall" ) m_max_fall = value; else result = super::set_real_field(name, value); return result; } // bridge::set_real_field() /*---------------------------------------------------------------------------*/ /** * \brief Do one iteration in the progression of the item. */ void bear::bridge::progress( universe::time_type elapsed_time ) { super::progress(elapsed_time); // update reference_item's positions items_list_iterator it; for ( it = m_items.begin(); it != m_items.end(); ++it ) { if ( it->get_item().get() != NULL ) { universe::position_type pos; pos.x = it->get_item()->get_horizontal_middle(); pos.y = it->get_item()->get_bottom() - s_line_width/2; it->get_reference_item()->set_center_of_mass(pos); } else it->get_reference_item()->set_bottom(get_top() + 1); } update_items_list(); } // bridge::progress() /*----------------------------------------------------------------------------*/ /** * \brief Initialise the item. */ void bear::bridge::on_enters_layer() { super::on_enters_layer(); create_extremities(m_top_left_ref, m_top_left_reference); create_extremities(m_top_right_ref, m_top_right_reference); } // bridge::on_enters_layer() /*----------------------------------------------------------------------------*/ /** * \brief Get the visuals of this item. * \param visuals (out) The visuals. */ void bear::bridge::get_visual ( std::list& visuals ) const { universe::coordinate_type length = 0; const visual::sprite s(get_sprite()); const std::size_t n(get_bridge_length()/s.width()); const universe::coordinate_type unity = get_bridge_length()/n; const base_item* start = m_top_left_ref; const base_item* end; items_list_const_iterator it; universe::position_type pos = m_top_left_ref->get_center_of_mass(); for ( it = m_items.begin(); it != m_items.end(); ++it ) { end = it->get_reference_item(); add_bridge_visuals(visuals, start, end, unity, length , pos ); start = end; } end = m_top_right_ref; add_bridge_visuals(visuals, start, end, unity, length , pos ); if ( (unity - length) < 1 ) add_bridge_visual(visuals, pos, end->get_center_of_mass() ); } // bridge::get_visual() /*----------------------------------------------------------------------------*/ /** * \brief Tell if the item is correctly initialized. */ bool bear::bridge::is_valid() const { return (m_top_left_reference != NULL) && (m_top_right_reference != NULL) && super::is_valid(); } // bridge::is_valid() /*----------------------------------------------------------------------------*/ /** * \brief Add the loaders of this item class into a given loader map. * \param m The map in which the loaders are inserted. */ void bear::bridge::populate_loader_map( engine::item_loader_map& m ) { super::populate_loader_map(m); m.insert( engine::z_shift_loader(m_z_shift) ); } // bridge::populate_loader_map() /*----------------------------------------------------------------------------*/ /** * \brief Add bridge visuals on a line. * \param visuals (out) The visuals. * \param start The reference item at the start. * \param end The reference item at the end. * \param unity The distance between two visuals. * \param length The remaining distance for the first visual. * \param previous_pos Th position of the last visual. */ void bear::bridge::add_bridge_visuals ( std::list& visuals, const base_item* start, const base_item* end, const universe::coordinate_type& unity, universe::coordinate_type& length, universe::position_type& previous_pos ) const { universe::vector_type dir = end->get_center_of_mass() - start->get_center_of_mass(); dir.normalize(); universe::position_type origin = start->get_center_of_mass(); while ( origin.x < end->get_horizontal_middle() ) { universe::coordinate_type dist = unity - length; origin += (dir * dist); if ( origin.x < end->get_horizontal_middle() ) { length = 0; add_bridge_visual(visuals, previous_pos, origin); previous_pos = origin; } else length = previous_pos.distance(end->get_center_of_mass()); } } // bridge::add_bridge_visuals() /*----------------------------------------------------------------------------*/ /** * \brief Add bridge visual on a line. * \param visuals (out) The visuals. * \param left_pos Left position. * \param right_pos Right position. */ void bear::bridge::add_bridge_visual ( std::list& visuals, const universe::position_type& left_pos, const universe::position_type& right_pos ) const { visual::sprite s(get_sprite()); visual::position_type p ( ( left_pos + right_pos - s.get_size() ) / 2 + get_gap() ); claw::math::line_2d line ( left_pos, right_pos - left_pos ); double angle = std::atan(line.direction.y / line.direction.x); s.set_angle(angle); visuals.push_front ( engine::scene_visual( p, s, get_z_position() ) ); } // bridge::add_bridge_visual() /*----------------------------------------------------------------------------*/ /** * \brief Check collision on bridge. * \param that The other item of the collision. * \param info Some informations about the collision. */ void bear::bridge::collision_as_bridge ( engine::base_item& that, universe::collision_info& info ) { if ( ( ! that.is_phantom() ) && satisfy_collision_condition(that) && ( that.get_horizontal_middle() >= get_left() ) && ( that.get_horizontal_middle() <= get_right() ) ) { if ( align_on_bridge(that, info) ) { that.set_contact_friction(get_top_friction()); m_z_shift.do_z_shift(that, *this); search_or_create_item(that); } } } // bridge::collision_as_bridge() /*----------------------------------------------------------------------------*/ /** * \brief Call collision_as_bridge(). * \param that The other item of the collision. * \param info Some informations about the collision. */ void bear::bridge::collision ( engine::base_item& that, universe::collision_info& info ) { collision_as_bridge(that, info); } // bridge::collision() /*----------------------------------------------------------------------------*/ /** * \brief Align \a that on the bridge. * \param that The other item of the collision. * \param info Some informations about the collision. */ bool bear::bridge::align_on_bridge ( engine::base_item& that, universe::collision_info& info ) { bool result = false; universe::position_type previous_pos; universe::position_type next_pos; compute_neighboor (info.other_previous_state().get_bottom_middle(),previous_pos,next_pos); if ( check_item ( info.other_previous_state().get_bottom_middle(), previous_pos, next_pos, 0 ) ) { compute_neighboor(that.get_bottom_middle(),previous_pos,next_pos); if ( ! check_item( that.get_bottom_middle(), previous_pos, next_pos, s_line_width ) ) { universe::position_type pos = compute_align_position(that,previous_pos, next_pos); apply_angle_to(that,info); return collision_align_top(info, pos); } } return result; } // bridge::align_on_bridge() /*----------------------------------------------------------------------------*/ /** * \brief Compute neighboor of a position. * \param that The other item of the collision. * \param previous_pos Position of previous item. * \param next_pos Position of next item. */ bear::universe::position_type bear::bridge::compute_align_position ( engine::base_item& that, const universe::position_type& previous_pos, const universe::position_type& next_pos) const { claw::math::line_2d line ( previous_pos, next_pos - previous_pos ); universe::position_type pos ( that.get_left(), std::max( std::min( compute_giving_way(that), line.y_value(that.get_horizontal_middle()) ) + s_line_width/2, that.get_bottom() - s_line_width/2 ) ); return pos; } // bridge::compute_align_position() /*----------------------------------------------------------------------------*/ /** * \brief Compute neighboor of a position. * \param pos The considered position. * \param previous_pos Position of previous item. * \param next_pos Position of next item. */ void bear::bridge::compute_neighboor ( const universe::position_type& pos, universe::position_type& previous_pos, universe::position_type& next_pos) const { items_list_const_iterator it; previous_pos = m_top_left_ref->get_center_of_mass(); it = m_items.begin(); if ( it == m_items.end() ) next_pos = m_top_right_ref->get_center_of_mass(); else { bool ok = true; for ( ; (it != m_items.end()) && ok; ++it ) if ( it->get_reference_item() != NULL ) { if ( it->get_reference_item()->get_horizontal_middle() < pos.x ) previous_pos = it->get_reference_item()->get_center_of_mass(); else { ok = false; next_pos = it->get_reference_item()->get_center_of_mass(); } } if ( ok ) next_pos = m_top_right_ref->get_center_of_mass(); } } // bridge::compute_neighboor() /*----------------------------------------------------------------------------*/ /** * \brief Search an item in the items lists. Item is created if not found. * \param that The item to search. */ void bear::bridge::search_or_create_item(engine::base_item& that) { items_list_iterator it; bool found(false); for ( it = m_items.begin(); ( it != m_items.end() ) && ( ! found ); ++it ) if ( it->get_item() == that ) found = true; if ( ! found ) { m_items.push_front(item_on_bridge()); m_items.front().set_item_on_bridge(&that); update_items_list(); } } // bridge::search_or_create_item() /*----------------------------------------------------------------------------*/ /** * \brief Update list of items. */ void bear::bridge::update_items_list() { if ( ! m_items.empty() ) { m_items.sort(); bool changement; do { changement = false; items_list_iterator next_it, current_it; universe::position_type previous_pos = m_top_left_ref->get_center_of_mass(); universe::position_type next_pos; current_it = m_items.begin(); next_it = m_items.begin(); next_it++; if ( next_it != m_items.end() ) next_pos = next_it->get_reference_item()->get_center_of_mass(); else next_pos = m_top_right_ref->get_center_of_mass(); for ( ; current_it != m_items.end(); ) { if ( check_erase_item(current_it,previous_pos,next_pos) ) { changement = true; previous_pos = current_it->get_reference_item()->get_center_of_mass(); m_items.erase(current_it); } else previous_pos = current_it->get_reference_item()->get_center_of_mass(); current_it = next_it; if ( next_it != m_items.end() ) next_it++; if ( next_it != m_items.end() ) next_pos = next_it->get_reference_item()->get_center_of_mass(); else next_pos = m_top_right_ref->get_center_of_mass(); } } while ( changement ); } } // bridge::update_items_list() /*----------------------------------------------------------------------------*/ /** * \brief Check if a given item on bridge must be erase. * \param it Iterator on item to consider. * \param previous_pos Position of previous item. * \param next_pos Position of next item. */ bool bear::bridge::check_erase_item (items_list_iterator it, const universe::position_type& previous_pos, const universe::position_type& next_pos) const { return check_item ( it->get_reference_item()->get_center_of_mass(), previous_pos, next_pos, 0 ) || ( it->get_item().get() == NULL ) || ( it->get_item()->get_bottom() > get_top() ) || ( it->get_item()->get_horizontal_middle() < get_left() )|| ( it->get_item()->get_horizontal_middle() > get_right() ); } // bridge::check_erase_item() /*----------------------------------------------------------------------------*/ /** * \brief Compute the y coordinate of a given item. * \param item The considered item. */ bear::universe::coordinate_type bear::bridge::compute_giving_way(const base_item& item) const { universe::coordinate_type coord = item.get_mass() * ( ( get_width() / 2 ) - std::abs(item.get_horizontal_middle() - get_horizontal_middle()) ) * m_max_fall / ( get_width() * 50 ); if ( coord > m_max_fall ) coord = m_max_fall; claw::math::line_2d line ( m_top_left_ref->get_center_of_mass(), m_top_right_ref->get_center_of_mass() - m_top_left_ref->get_center_of_mass()); return line.y_value( item.get_horizontal_middle() ) - coord; } // bridge::compute_giving_way() /*----------------------------------------------------------------------------*/ /** * \brief Compute if an item is over a line created by two contiguous item. * \param pos Position of current item. * \param previous_pos Position of previous item. * \param next_pos Position of next item. */ bool bear::bridge::check_item ( const universe::position_type& pos, const universe::position_type& previous_pos, const universe::position_type& next_pos, universe::coordinate_type margin ) const { claw::math::line_2d line ( previous_pos + universe::position_type(0,margin), next_pos - previous_pos ); return pos.y > line.y_value( pos.x ); } // bridge::check_item() /*----------------------------------------------------------------------------*/ /** * \brief Get the items concerned by a progress/move of this one. * \param d (out) A list to which are added such items. */ void bear::bridge::get_dependent_items ( universe::physical_item::item_list& d ) const { items_list_const_iterator it; for( it=m_items.begin(); it!=m_items.end(); ++it ) if ( it->get_item().get() != NULL ) d.push_back( it->get_item().get() ); d.push_back(m_top_left_ref); d.push_back(m_top_right_ref); } // bridge::get_dependent_items() /*----------------------------------------------------------------------------*/ /** * \brief Apply the angle of the slope to a colliding item. * \param that The other item in the collision. * \param info Informations on the collision. */ void bear::bridge::apply_angle_to ( engine::base_item& that, const universe::collision_info& info) const { universe::position_type left_pos(that.get_bottom_left()); universe::position_type right_pos(that.get_bottom_right()); universe::position_type previous_pos; universe::position_type next_pos; compute_neighboor (that.get_bottom_left(),previous_pos,next_pos); claw::math::line_2d line1 ( previous_pos, next_pos - previous_pos ); left_pos.y = line1.y_value(that.get_left()); compute_neighboor (that.get_bottom_right(),previous_pos,next_pos); claw::math::line_2d line2 ( previous_pos, next_pos - previous_pos ); right_pos.y = line2.y_value(that.get_right()); claw::math::line_2d line ( left_pos, right_pos - left_pos ); double angle = std::atan(line.direction.y / line.direction.x); that.set_contact_angle(angle); info.get_collision_repair().set_contact_normal (that, that.get_x_axis().get_orthonormal_anticlockwise()); } // bridge::apply_angle_to() /*----------------------------------------------------------------------------*/ /** * \brief Get bridge length. */ bear::universe::coordinate_type bear::bridge::get_bridge_length() const { items_list_const_iterator it; const base_item* previous = m_top_left_ref; universe::coordinate_type length(0); for( it=m_items.begin(); it!=m_items.end(); ++it ) { length += it->get_reference_item()->get_center_of_mass().distance (previous->get_center_of_mass()); previous = it->get_reference_item(); } length += previous->get_center_of_mass().distance ( m_top_right_ref->get_center_of_mass() ); return length; } // bridge::get_dependent_items() /*----------------------------------------------------------------------------*/ /** * \brief Create an extremities. */ void bear::bridge::create_extremities ( base_item* & item, base_item* reference) { item = new bear::reference_item; CLAW_ASSERT (item->is_valid(), "The reference_item created by bridge isn't correctly initialized" ); item->set_center_of_mass ( reference->get_center_of_mass() + universe::position_type(0,-s_line_width/2)); new_item( *item ); bear::universe::forced_tracking mvt; mvt.set_reference_point_on_center(*reference); item->set_forced_movement( mvt ); } // bridge::create_extremities() plee-the-bear-20251226/bear-engine/lib/src/generic_items/code/browser_launcher_toggle.cpp000066400000000000000000000030601512343254000312400ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::browser_launcher_toggle class. * \author Sebastien Angibaud */ #include "generic_items/browser_launcher_toggle.hpp" #include "engine/system/system_api.hpp" BASE_ITEM_EXPORT( browser_launcher_toggle, bear ) /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ bear::browser_launcher_toggle::browser_launcher_toggle() { } // browser_launcher_toggle::browser_launcher_toggle() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type string. * \param name The name of the field. * \param value The value of the field. */ bool bear::browser_launcher_toggle::set_string_field ( const std::string& name, const std::string& value ) { bool result = true; if ( name == "browser_launcher_toggle.url" ) m_url = value; else result = super::set_string_field( name, value ); return result; } // browser_launcher_toggle::set_string_field() /*----------------------------------------------------------------------------*/ /** * \brief Play the sample. * \param activator (ignored) The item that activates the toggle, if any. */ void bear::browser_launcher_toggle::on_toggle_on ( engine::base_item* activator ) { engine::system_api::open( m_url ); } // browser_launcher_toggle::on_toggle_on() plee-the-bear-20251226/bear-engine/lib/src/generic_items/code/camera.cpp000066400000000000000000000365131512343254000255740ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::camera class. * \author Julien Jorge */ #include "generic_items/camera.hpp" #include "engine/level.hpp" #include "universe/forced_movement/forced_goto.hpp" #include "engine/export.hpp" #include BASE_ITEM_EXPORT( camera, bear ) /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ bear::camera::camera() : m_valid_area (0, 0, std::numeric_limits::infinity(), std::numeric_limits::infinity()), m_max_move_length ( std::numeric_limits::infinity() ), m_max_zoom_length ( std::numeric_limits::infinity() ), m_min_size(0, 0), m_max_size ( std::numeric_limits::infinity(), std::numeric_limits::infinity() ), m_shaker_force(0), m_active(false) { set_phantom(true); set_can_move_items(false); set_artificial(true); } // camera::camera() /*----------------------------------------------------------------------------*/ /** * \brief Tell if the camera is well initialized. */ bool bear::camera::is_valid() const { return (m_max_size.x >= m_min_size.x) && (m_max_size.y >= m_min_size.y) && super::is_valid(); } // camera::is_valid() /*----------------------------------------------------------------------------*/ /** * \brief Initialize the item. */ void bear::camera::build() { super::build(); universe::coordinate_type left = m_valid_area.left(); universe::coordinate_type right = m_valid_area.right(); universe::coordinate_type top = m_valid_area.top(); universe::coordinate_type bottom = m_valid_area.bottom(); if (left < 0) left = 0; else if (left > get_level().get_size().x) left = get_level().get_size().x; if (bottom < 0) bottom = 0; else if (bottom > get_level().get_size().y) bottom = get_level().get_size().y; if (right > get_level().get_size().x) right = get_level().get_size().x; if (top > get_level().get_size().y) top = get_level().get_size().y; m_valid_area.set(left, bottom, right, top); m_default_size = m_wanted_size = get_size(); if ( m_active ) activate(); } // camera::build() /*----------------------------------------------------------------------------*/ /** * \brief Do one step in the progression of the item. * \param elapsed_time Elapsed time since the last call. */ void bear::camera::progress( bear::universe::time_type elapsed_time ) { progress_zoom(elapsed_time); if ( m_shaker_force != 0 ) adjust_position(get_center_of_mass(), elapsed_time); } // camera::progress() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type "real". * \param value The value of the field. */ bool bear::camera::set_real_field( const std::string& name, double value ) { bool result = true; if ( name == "camera.valid_min.x" ) m_valid_area.first_point.x = value; else if ( name == "camera.valid_min.y" ) m_valid_area.first_point.y = value; else if ( name == "camera.valid_max.x" ) m_valid_area.second_point.x = value; else if ( name == "camera.valid_max.y" ) m_valid_area.second_point.y = value; else if ( name == "camera.max_move_length" ) m_max_move_length = value; else if ( name == "camera.max_zoom_length" ) m_max_zoom_length = value; else if ( name == "camera.size.max_width" ) m_max_size.x = value; else if ( name == "camera.size.max_height" ) m_max_size.y = value; else if ( name == "camera.size.min_width" ) m_min_size.x = value; else if ( name == "camera.size.min_height" ) m_min_size.y = value; else result = super::set_real_field(name, value); return result; } // camera::set_real_field() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type "bool". * \param value The value of the field. */ bool bear::camera::set_bool_field( const std::string& name, bool value ) { bool result = true; if ( name == "camera.active" ) m_active = value; else result = super::set_bool_field(name, value); return result; } // camera::set_bool_field() /*----------------------------------------------------------------------------*/ /** * \brief Set the valid area. * \param rect The valid area. */ void bear::camera::set_valid_area( const universe::rectangle_type& rect ) { m_valid_area = rect; } // camera::set_valid_area() /*----------------------------------------------------------------------------*/ /** \brief Set the minimum size of the camera. * \param min_size The minimum size. */ void bear::camera::set_min_size( const universe::size_box_type& min_size ) { m_min_size = min_size; } // camera::set_min_size() /*----------------------------------------------------------------------------*/ /** \brief Set the maximum size of the camera. * \param max_size The maximum size. */ void bear::camera::set_max_size( const universe::size_box_type& max_size ) { m_max_size = max_size; } // camera::set_max_size() /*----------------------------------------------------------------------------*/ /** \brief Set the maximum move length of the camera. * \param max_move_length The maximum move length. */ void bear::camera::set_max_move_length ( universe::coordinate_type max_move_length ) { m_max_move_length = max_move_length; } // camera::set_max_move_length() /*----------------------------------------------------------------------------*/ /** \brief Set the maximum zoom length of the camera. * \param max_zoom_length The maximum zoom length. */ void bear::camera::set_max_zoom_length ( universe::coordinate_type max_zoom_length ) { m_max_zoom_length = max_zoom_length; } // camera::set_max_zoom_length() /*----------------------------------------------------------------------------*/ /** * \brief Progressively change the size of the camera. * \param s The size to attain. */ void bear::camera::set_wanted_size( const universe::size_box_type& s ) { m_wanted_size.x = std::min( std::max( s.x, m_min_size.x ), m_max_size.x ); m_wanted_size.y = std::min( std::max( s.y, m_min_size.y ), m_max_size.y ); const universe::coordinate_type w ( m_valid_area.second_point.x - m_valid_area.first_point.x ); const universe::coordinate_type h ( m_valid_area.second_point.y - m_valid_area.first_point.y ); if ( m_wanted_size.x > w ) set_wanted_size ( universe::size_box_type(w, w/(m_wanted_size.x / m_wanted_size.y)) ); if ( m_wanted_size.y > h ) set_wanted_size ( universe::size_box_type(h*(m_wanted_size.x / m_wanted_size.y), h) ); } // camera::set_wanted_size() /*----------------------------------------------------------------------------*/ /** * \brief Set the force of the shaker of the camera. * \param shaker_force The new shaker force. */ void bear::camera::set_shaker_force( double shaker_force ) { m_shaker_force = shaker_force; } // camera::set_shaker_force() /*----------------------------------------------------------------------------*/ /** * \brief Det the default size of the camera. */ const bear::universe::size_box_type& bear::camera::get_default_size() const { return m_default_size; } // camera::get_default_size() /*----------------------------------------------------------------------------*/ /** * \brief Tell that the camera must be activated by default when built. */ void bear::camera::set_active_on_build() { m_active = true; } // camera::set_active_on_build() /*----------------------------------------------------------------------------*/ /** * \brief Activate the camera. */ void bear::camera::activate() { get_level().set_camera( *this ); } // camera::activate() /*----------------------------------------------------------------------------*/ /** * \brief Activate the camera with a smooth movement from the previous camera's * position. * \param d The duration of the movement. * * This method applies a forced movement to the camera, during \d seconds. You * may want not to use this method if the camera already has a forced movement. */ void bear::camera::smooth_activate( universe::time_type d ) { const universe::position_type target_pos( get_center_of_mass() ); set_center_of_mass( get_level().get_camera_center() ); stay_valid(); universe::forced_goto mvt(d); mvt.set_auto_remove(true); mvt.set_acceleration_time(d/2); mvt.set_length( target_pos - get_center_of_mass() ); set_forced_movement(mvt); get_level().set_camera( *this ); } // camera::smooth_activate() /*----------------------------------------------------------------------------*/ /** * \brief Set the center of mass of the camera on the center of mass of an item. * \param item The item to focus on. */ void bear::camera::focus_on( const engine::base_item& item ) { set_center_of_mass( item.get_center_of_mass() ); stay_valid(); } // camera::focus_on() /*----------------------------------------------------------------------------*/ /** * \brief Progress toward the wanted size. * \param elapsed_time Elapsed time since the last call. */ void bear::camera::progress_zoom( universe::time_type elapsed_time ) { if ( get_size() != m_wanted_size ) { const universe::position_type c = get_center_of_mass(); progress_zoom_with_ratio(elapsed_time); set_center_of_mass(c); } m_wanted_size = m_default_size; } // camera::progress_zoom() /*----------------------------------------------------------------------------*/ /** * \brief Adjust the position of the center of the camera. * \param center_position New position for the center of the camera. * \param elapsed_time Elapsed time since the last call. */ void bear::camera::adjust_position ( const bear::universe::position_type& center_position, bear::universe::time_type elapsed_time ) { double a_x = (m_shaker_force * rand() / RAND_MAX) - m_shaker_force/2; double a_y = (m_shaker_force * rand() / RAND_MAX) - m_shaker_force/2; adjust_position_x(a_x + center_position.x, elapsed_time * m_max_move_length); adjust_position_y(a_y + center_position.y, elapsed_time * m_max_move_length); m_shaker_force = 0; } // camera::adjust_position() /*----------------------------------------------------------------------------*/ /** * \brief Set a new position for the center of the camera, but keep it in the * valid area. * \param center_position New position for the center of the camera. */ void bear::camera::teleport ( const bear::universe::position_type& center_position ) { set_center_of_mass(center_position); stay_valid(); } // camera::teleport() /*----------------------------------------------------------------------------*/ /** * \brief Adjust the X position of the center of the camera. * \param center_position X-coordinate to set to the center of the camera. * \param max_move The longest feasible movement. */ void bear::camera::adjust_position_x ( bear::universe::coordinate_type center_position, bear::universe::coordinate_type max_move ) { const bear::universe::coordinate_type current_x = get_center_of_mass().x; bear::universe::coordinate_type distance; if ( center_position < current_x ) { distance = std::min(current_x - center_position, max_move); if ( get_left() - m_valid_area.left() >= distance ) set_left( get_left() - distance ); else set_left( m_valid_area.left() ); } else if ( center_position > current_x ) { distance = std::min(center_position - current_x, max_move); if ( get_right() + distance <= m_valid_area.right() ) set_left( get_left() + distance ); else set_right( m_valid_area.right() ); } } // camera::adjust_position_x() /*----------------------------------------------------------------------------*/ /** * \brief Adjust the Y position of the center of the camera. * \param center_position Y-coordinate to set to the center of the camera. * \param max_move The longest feasible movement. */ void bear::camera::adjust_position_y ( bear::universe::coordinate_type center_position, bear::universe::coordinate_type max_move ) { const bear::universe::coordinate_type current_y = get_center_of_mass().y; bear::universe::coordinate_type distance; if ( center_position < current_y ) { distance = std::min(current_y - center_position, max_move); if ( get_bottom() - distance >= m_valid_area.bottom() ) set_bottom( get_bottom() - distance ); else set_bottom( m_valid_area.bottom() ); } else if ( center_position > current_y ) { distance = std::min(center_position - current_y, max_move); if ( get_top() + distance <= m_valid_area.top() ) set_bottom( get_bottom() + distance ); else set_top( m_valid_area.top() ); } } // camera::adjust_position_y() /*----------------------------------------------------------------------------*/ /** * \brief Check if the camera is in its valid area and adjust its position if * needed. */ void bear::camera::stay_valid() { if ( get_left() < m_valid_area.left() ) set_left( m_valid_area.left() ); if ( get_bottom() < m_valid_area.bottom() ) set_bottom( m_valid_area.bottom() ); if ( get_right() > m_valid_area.right() ) { if ( m_valid_area.right() > get_width() ) set_right( m_valid_area.right() ); else set_left(0); } if ( get_top() > m_valid_area.top() ) { if ( m_valid_area.top() > get_height() ) set_top( m_valid_area.top() ); else set_bottom(0); } } // camera::stay_valid() /*----------------------------------------------------------------------------*/ /** * \brief Progress toward the wanted size and keep the ratio width/height. * \param elapsed_time Elapsed time since the last call. */ void bear::camera::progress_zoom_with_ratio( universe::time_type elapsed_time ) { const universe::coordinate_type r = m_wanted_size.x / m_wanted_size.y; const universe::coordinate_type d_x = std::min( std::abs(m_wanted_size.x - get_width()), m_max_zoom_length * elapsed_time ); const universe::coordinate_type d_y = std::min( std::abs(m_wanted_size.y - get_height()), m_max_zoom_length * elapsed_time ); if ( d_x > d_y ) { if ( m_wanted_size.x > get_width() ) set_width( get_width() + d_x ); else set_width( get_width() - d_x ); set_height( get_width() / r ); } else { if ( m_wanted_size.y > get_height() ) set_height( get_height() + d_y ); else set_height( get_height() - d_y ); set_width( get_height() * r ); } } // camera::progress_zoom_with_ratio() /*----------------------------------------------------------------------------*/ /** * \brief Export the methods of the class. */ void bear::camera::init_exported_methods() { TEXT_INTERFACE_CONNECT_METHOD_0( bear::camera, activate, void); TEXT_INTERFACE_CONNECT_METHOD_1 ( bear::camera, smooth_activate, void, bear::universe::time_type); TEXT_INTERFACE_CONNECT_METHOD_1 ( bear::camera, focus_on, void, const bear::engine::base_item&); } // camera::init_exported_methods() /*----------------------------------------------------------------------------*/ TEXT_INTERFACE_IMPLEMENT_METHOD_LIST( bear::camera ) plee-the-bear-20251226/bear-engine/lib/src/generic_items/code/camera_on_object.cpp000066400000000000000000000140301512343254000276040ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::camera_on_object class. * \author Sébastien Angibaud */ #include "generic_items/camera_on_object.hpp" BASE_ITEM_EXPORT( camera_on_object, bear ) /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ bear::camera_on_object::camera_on_object() : m_fit_items(false) { } // camera_on_object::camera_on_object() /*----------------------------------------------------------------------------*/ /** * \brief Do one step in the progression of the item. * \param elapsed_time Elapsed time since the last call. */ void bear::camera_on_object::progress( bear::universe::time_type elapsed_time ) { if ( m_fit_items ) progress_fit_items(elapsed_time); else progress_center(elapsed_time); progress_zoom(elapsed_time); } // camera_on_object::progress() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type item_list. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::camera_on_object::set_item_list_field ( const std::string& name, const std::vector& value ) { bool ok = true; if (name == "camera_on_object.items") for( std::size_t i=0; i!=value.size(); ++i ) m_objects.push_back( handle_type((universe::physical_item*)value[i]) ); else ok = super::set_item_list_field(name, value); return ok; } // camera_on_object::set_item_list_field() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type bool. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::camera_on_object::set_bool_field ( const std::string& name, bool value ) { bool ok = true; if (name == "camera_on_object.fit_items") m_fit_items = value; else ok = super::set_bool_field(name, value); return ok; } // camera_on_object::set_bool_field() /*----------------------------------------------------------------------------*/ /** * \brief Add a item. * \param item The item to add. */ void bear::camera_on_object::add_item( base_item* item ) { m_objects.push_back( handle_type(item) ); } // camera_on_object::add_item() /*----------------------------------------------------------------------------*/ /** * \brief Remove an item. * \param item The item to remove. */ void bear::camera_on_object::remove_item( base_item* item ) { for ( handle_list::iterator it=m_objects.begin(); it!=m_objects.end(); ++it ) if ( *it == item ) { m_objects.erase(it); return; } } // camera_on_object::remove_item() /*----------------------------------------------------------------------------*/ /** * \brief Do one step in the progression of the item. * \param elapsed_time Elapsed time since the last call. */ void bear::camera_on_object::progress_center ( bear::universe::time_type elapsed_time ) { bear::universe::position_type center(0, 0); unsigned int nb_objects(0); handle_list::const_iterator it; handle_list remaining_objects; for ( it = m_objects.begin(); it != m_objects.end(); ++it ) if ( (*it).get() != NULL ) { center += (*it)->get_center_of_mass(); ++nb_objects; remaining_objects.push_back(*it); } std::swap(m_objects, remaining_objects); if ( nb_objects != 0 ) adjust_position( center / nb_objects , elapsed_time ); } // camera_on_object::progress() /*----------------------------------------------------------------------------*/ /** * \brief Do one step in the progression of the item. * \param elapsed_time Elapsed time since the last call. */ void bear::camera_on_object::progress_fit_items ( bear::universe::time_type elapsed_time ) { unsigned int nb_objects(0); bear::universe::position_type top_left(get_center_of_mass()); bear::universe::position_type bottom_right(get_center_of_mass()); handle_list::const_iterator it; handle_list remaining_objects; for ( it = m_objects.begin(); it != m_objects.end(); ++it ) if ( (*it).get() != NULL ) { if ( (*it)->get_left() < top_left.x ) top_left.x = (*it)->get_left(); if ( (*it)->get_right() > bottom_right.x ) bottom_right.x = (*it)->get_right(); if ( (*it)->get_top() > top_left.y ) top_left.y = (*it)->get_top(); if ( (*it)->get_bottom() < bottom_right.y ) bottom_right.y = (*it)->get_bottom(); ++nb_objects; remaining_objects.push_back(*it); } std::swap(m_objects, remaining_objects); if ( nb_objects != 0 ) { universe::position_type center((top_left + bottom_right) /2); adjust_position( center , elapsed_time ); universe::size_type r_init = get_default_size().x / get_default_size().y; universe::coordinate_type w(bottom_right.x - top_left.x + 200); universe::coordinate_type h(top_left.y - bottom_right.y + 200*r_init); if ( w > h*r_init ) set_wanted_size(universe::size_box_type(w, w/r_init)); else set_wanted_size(universe::size_box_type(h*r_init, h)); } } // camera_on_object::progress_fit_items() /*----------------------------------------------------------------------------*/ /** * \brief Export the methods of the class. */ void bear::camera_on_object::init_exported_methods() { TEXT_INTERFACE_CONNECT_METHOD_1( camera_on_object, add_item, void, base_item* ); TEXT_INTERFACE_CONNECT_METHOD_1( camera_on_object, remove_item, void, base_item* ); } // camera_on_object::init_exported_methods() /*----------------------------------------------------------------------------*/ TEXT_INTERFACE_IMPLEMENT_METHOD_LIST( bear::camera_on_object ) plee-the-bear-20251226/bear-engine/lib/src/generic_items/code/camera_shaker.cpp000066400000000000000000000105261512343254000271250ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::camera_shaker class. * \author Sebastien Angibaud */ #include "generic_items/camera_shaker.hpp" #include "generic_items/camera.hpp" #include "generic_items/delayed_kill_item.hpp" #include "engine/level.hpp" #include "engine/export.hpp" BASE_ITEM_EXPORT( camera_shaker, bear ) /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ bear::camera_shaker::camera_shaker() : m_shaker_force(10), m_camera_intersection(true) { set_phantom(true); set_can_move_items(false); set_artificial(false); } // camera_shaker::camera_shaker() /*----------------------------------------------------------------------------*/ /** * \brief Create a camera_shaker near an item with a given force and during a * given duration. * \param item The item around which the camera is shaked. * \param force The strength of the shake. * \param duration The duration. * \param s The sample played during the shake. */ void bear::camera_shaker::shake_around ( const engine::base_item& item, double force, universe::time_type duration, audio::sample* s ) { camera_shaker* new_camera_shaker = new camera_shaker; const universe::time_type fadeout(0.5); item.get_layer().add_item( *new_camera_shaker ); new_camera_shaker->set_center_of_mass(item.get_center_of_mass()); new_camera_shaker->check_camera_intersection(false); new_camera_shaker->set_shaker_force(force); new_camera_shaker->set_sample(s); if ( duration > fadeout ) { new_camera_shaker->set_fadeout(fadeout); new_camera_shaker->set_delay(duration - 0.5); } new_camera_shaker->toggle_on(NULL); delayed_kill_item* killer = new delayed_kill_item; killer->add_item(new_camera_shaker); killer->set_duration(duration); CLAW_ASSERT(killer->is_valid(), "The camera shaker killer isn't correctly initialized" ); item.get_layer().add_item( *killer ); killer->set_center_of_mass(item.get_center_of_mass()); } // camera_shaker::shake_around() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type "real". * \param value The value of the field. */ bool bear::camera_shaker::set_real_field ( const std::string& name, double value ) { bool result = true; if ( name == "camera_shaker.shaker_force" ) m_shaker_force = value; else result = super::set_real_field(name, value); return result; } // camera_shaker::set_real_field() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type "bool". * \param value The value of the field. */ bool bear::camera_shaker::set_bool_field ( const std::string& name, bool value ) { bool result = true; if ( name == "camera_shaker.check_camera_intersection" ) m_camera_intersection = value; else result = super::set_bool_field(name, value); return result; } // camera_shaker::set_bool_field() /*----------------------------------------------------------------------------*/ /** * \brief Set the force of the shaker. * \param force The value of the force. */ void bear::camera_shaker::set_shaker_force( double value ) { m_shaker_force = value; } // camera_shaker::set_shaker_force() /*----------------------------------------------------------------------------*/ /** * \brief Do one step in the progression of the item. * \param elapsed_time Elapsed time since the last call. */ void bear::camera_shaker::progress_on( bear::universe::time_type elapsed_time ) { super::progress_on(elapsed_time); if ( !m_camera_intersection || get_level().get_camera_focus().includes(get_center_of_mass()) ) { camera* c = dynamic_cast(get_level().get_camera().get()); if (c != NULL) c->set_shaker_force(m_shaker_force); } } // camera_shaker::progress() /*----------------------------------------------------------------------------*/ /** * \brief Indicates if the shaker checks camera intersection. * \param value The new value. */ void bear::camera_shaker::check_camera_intersection(bool value) { m_camera_intersection = value; } // camera_shaker::check_camera_intersection() plee-the-bear-20251226/bear-engine/lib/src/generic_items/code/camera_toggle.cpp000066400000000000000000000100311512343254000271200ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::camera_toggle class. * \author Julien Jorge */ #include "generic_items/camera_toggle.hpp" #include "engine/level.hpp" #include "generic_items/camera.hpp" BASE_ITEM_EXPORT( camera_toggle, bear ) /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ bear::camera_toggle::camera_toggle() : m_starting_smooth_delay(0), m_ending_smooth_delay(0), m_camera(NULL) { set_can_move_items(false); set_phantom(true); set_artificial(true); } // camera_toggle::camera_toggle() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type \c . * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::camera_toggle::set_item_field ( const std::string& name, engine::base_item* value ) { bool ok = true; if (name == "camera_toggle.camera") m_camera = value; else ok = super::set_item_field(name, value); return ok; } // camera_toggle::set_item_field() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type \c . * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::camera_toggle::set_real_field ( const std::string& name, double value ) { bool ok = true; if (name == "camera_toggle.starting_transition_duration") m_starting_smooth_delay = value; else if (name == "camera_toggle.ending_transition_duration") m_ending_smooth_delay = value; else ok = super::set_real_field(name, value); return ok; } // camera_toggle::set_real_field() /*----------------------------------------------------------------------------*/ /** * \brief Tell if the item is well initialized. */ bool bear::camera_toggle::is_valid() const { // We allow the camera to be NULL only if the toggle has been toggled on, in // which case he can have taken the NULL camera of the level. return ((m_camera != (camera*)NULL) || is_on() ) && (m_starting_smooth_delay >= 0) && (m_ending_smooth_delay >= 0) && super::is_valid(); } // camera_toggle::is_valid() /*----------------------------------------------------------------------------*/ /** * \brief Initialise the item in its off state. */ void bear::camera_toggle::build_off() { // nothing to do } // camera_toggle::build_off() /*----------------------------------------------------------------------------*/ /** * \brief Activate the camera. * \param activator (ignored) The item that activates the toggle, if any. */ void bear::camera_toggle::on_toggle_on( engine::base_item* activator ) { switch_camera(); } // camera_toggle::on_toggle_on() /*----------------------------------------------------------------------------*/ /** * \brief Restore the old camera. * \param activator (ignored) The item that activates the toggle, if any. */ void bear::camera_toggle::on_toggle_off( engine::base_item* activator ) { switch_camera(); } // camera_toggle::on_toggle_off() /*----------------------------------------------------------------------------*/ /** * \brief Switch the camera of the level. */ void bear::camera_toggle::switch_camera() { handle_type old_cam = get_level().get_camera(); if ( m_camera != (camera*)NULL ) { if ( is_on() ) { if (m_starting_smooth_delay == 0) m_camera->activate(); else m_camera->smooth_activate(m_starting_smooth_delay); } else { if (m_ending_smooth_delay == 0) m_camera->activate(); else m_camera->smooth_activate(m_ending_smooth_delay); } } m_camera = old_cam; } // camera_toggle::switch_camera() plee-the-bear-20251226/bear-engine/lib/src/generic_items/code/change_camera_size.cpp000066400000000000000000000036321512343254000301270ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::change_camera_size class. * \author Julien Jorge */ #include "generic_items/change_camera_size.hpp" #include "engine/level.hpp" #include "generic_items/camera.hpp" #include "engine/export.hpp" BASE_ITEM_EXPORT( change_camera_size, bear ) /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ bear::change_camera_size::change_camera_size() : m_wanted_size(320, 240) { set_phantom(true); set_can_move_items(false); set_artificial(true); } // change_camera_size::change_camera_size() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type "real". * \param value The value of the field. */ bool bear::change_camera_size::set_real_field ( const std::string& name, double value ) { bool result = true; if ( name == "change_camera_size.wanted_width" ) m_wanted_size.x = value; else if ( name == "change_camera_size.wanted_height" ) m_wanted_size.y = value; else result = super::set_real_field(name, value); return result; } // change_camera_size::set_real_field() /*----------------------------------------------------------------------------*/ /** * \brief Do one step in the progression of the item. * \param elapsed_time Elapsed time since the last call. */ void bear::change_camera_size::progress ( bear::universe::time_type elapsed_time ) { super::progress(elapsed_time); if ( get_level().get_camera_focus().includes(get_center_of_mass()) ) { camera* c = dynamic_cast(get_level().get_camera().get()); if (c != NULL) c->set_wanted_size(m_wanted_size); } } // change_camera_size::progress() plee-the-bear-20251226/bear-engine/lib/src/generic_items/code/clone_toggle.cpp000066400000000000000000000034731512343254000270040ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::clone_toggle class. * \author Julien Jorge */ #include "generic_items/clone_toggle.hpp" #include "engine/game.hpp" #include "engine/resource_pool.hpp" #include "engine/variable/variable.hpp" BASE_ITEM_EXPORT( clone_toggle, bear ) /*----------------------------------------------------------------------------*/ /** * \brief Destructor. */ bear::clone_toggle::~clone_toggle() { for ( std::size_t i=0; i!=m_items.size(); ++i ) delete m_items[i]; } // clone_toggle::~clone_toggle() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type list of items. * \param name The name of the field. * \param value The value of the field. */ bool bear::clone_toggle::set_item_list_field ( const std::string& name, const std::vector& value ) { bool result = true; if ( name == "clone_toggle.items" ) { for ( std::size_t i=0; i!=value.size(); ++i ) if ( value[i] != NULL ) { m_items.push_back( value[i]->clone() ); value[i]->kill(); } } else result = super::set_item_list_field( name, value ); return result; } // clone_toggle::set_item_list_field() /*----------------------------------------------------------------------------*/ /** * \brief Play the sample. * \param activator (ignored) The item that activates the toggle, if any. */ void bear::clone_toggle::on_toggle_on( engine::base_item* activator ) { for ( std::size_t i=0; i!=m_items.size(); ++i ) new_item( *m_items[i]->clone() ); } // clone_toggle::on_toggle_on() plee-the-bear-20251226/bear-engine/lib/src/generic_items/code/crossfade_sequence.cpp000066400000000000000000000133201512343254000301740ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::crossfade_sequence class. * \author Sebastie Angibaud */ #include "generic_items/crossfade_sequence.hpp" #include "engine/export.hpp" #include BASE_ITEM_EXPORT( crossfade_sequence, bear ) /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ bear::crossfade_sequence::crossfade_sequence() : m_last_sprite(0), m_index(0), m_fadeout_duration(1), m_fadein_for_first_sprite(true), m_fadeout_for_last_sprite(true) { set_phantom(true); set_can_move_items(false); set_artificial(true); } // crossfade_sequence::crossfade_sequence() /*---------------------------------------------------------------------------*/ /** * \brief Do one iteration in the progression of the item. */ void bear::crossfade_sequence::progress( universe::time_type elapsed_time ) { super::progress(elapsed_time); m_last_sprite += elapsed_time; if ( m_index >= m_duration_sequence.size() ) { if ( ( m_last_sprite <= m_fadeout_duration ) && m_fadeout_for_last_sprite && ( m_index > 0) ) m_items_sequence[m_index-1]->get_rendering_attributes().set_opacity (1-m_last_sprite/m_fadeout_duration); } else { if ( m_last_sprite <= m_fadeout_duration ) { m_items_sequence[m_index]->get_rendering_attributes().set_opacity (m_last_sprite/m_fadeout_duration); if ( m_index > 0 ) m_items_sequence[m_index-1]->get_rendering_attributes(). set_opacity(1- m_last_sprite/m_fadeout_duration); if ( ( m_index == 0 ) && !m_fadein_for_first_sprite ) m_items_sequence[m_index]->get_rendering_attributes(). set_opacity(1); } else { m_items_sequence[m_index]->get_rendering_attributes(). set_opacity(1); if ( m_index > 0 ) m_items_sequence[m_index-1]->get_rendering_attributes(). set_opacity(0); } if ( m_last_sprite >= m_duration_sequence[m_index] ) { ++m_index; m_last_sprite = 0; } } } // crossfade_sequence::progress() /*----------------------------------------------------------------------------*/ /** * \brief Initialize the item. */ void bear::crossfade_sequence::build() { super::build(); item_list_type::iterator it; for ( it = m_items_sequence.begin(); it != m_items_sequence.end(); ++it ) (*it)->get_rendering_attributes().set_opacity(0); } // crossfade_sequence::build() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type \c bool. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::crossfade_sequence::set_bool_field ( const std::string& name, bool value ) { bool ok = true; if (name == "crossfade_sequence.fadein_for_first_item") m_fadein_for_first_sprite = value; else if (name == "crossfade_sequence.fadeout_for_last_item") m_fadeout_for_last_sprite = value; else ok = super::set_bool_field(name, value); return ok; } // croosfade_sequence::set_bool_field() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type \c real. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::crossfade_sequence::set_real_field ( const std::string& name, double value ) { bool ok = true; if (name == "crossfade_sequence.fadeout_duration") m_fadeout_duration = value; else ok = super::set_real_field(name, value); return ok; } // croosfade_sequence::set_real_field() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type \c list of real. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::crossfade_sequence::set_real_list_field ( const std::string& name, const std::vector& value ) { bool ok = true; if (name == "crossfade_sequence.duration_sequence") m_duration_sequence = value; else ok = super::set_real_list_field(name, value); return ok; } // croosfade_sequence::set_real_list_field() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type list of <*base_item>. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::crossfade_sequence::set_item_list_field ( const std::string& name, const std::vector& value ) { bool result = false; if ( name == "crossfade_sequence.item_sequence" ) { m_items_sequence.clear(); for ( std::size_t index = 0; index != value.size(); ++index ) m_items_sequence.push_back(value[index]); result = true; } else result = super::set_item_list_field( name, value ); return result; } // crossfade_sequence::set_item_list_field() /*----------------------------------------------------------------------------*/ /** * \brief Tell if the item is correctly initialized. */ bool bear::crossfade_sequence::is_valid() const { return super::is_valid() && ( m_duration_sequence.size() == m_items_sequence.size()) && ( !m_duration_sequence.empty()); } // crossfade_sequence::is_valid() plee-the-bear-20251226/bear-engine/lib/src/generic_items/code/cursor.cpp000066400000000000000000000051211512343254000256500ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::cursor class. * \author Sebastie Angibaud */ #include "generic_items/cursor.hpp" #include "engine/export.hpp" #include "engine/level.hpp" BASE_ITEM_EXPORT( cursor, bear ) /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ bear::cursor::cursor() : m_screen_position(0, 0), m_visibility_duration( std::numeric_limits::max() ), m_inactive_duration( 0 ) { set_artificial(true); set_phantom(true); set_global(true); } // cursor::cursor() /*---------------------------------------------------------------------------*/ /** * \brief Do one iteration in the progression of the item. */ void bear::cursor::progress( universe::time_type elapsed_time ) { super::progress(elapsed_time); progress_input_reader(elapsed_time); set_center_of_mass( get_level().screen_to_level( m_screen_position ) ); m_inactive_duration += elapsed_time; } // cursor::progress() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type \c real. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::cursor::set_real_field( const std::string& name, double value ) { bool ok = true; if (name == "cursor.visible_duration") { m_visibility_duration = value; m_inactive_duration = value; } else ok = super::set_real_field(name, value); return ok; } // cursor::set_real_field() /*----------------------------------------------------------------------------*/ /** * \brief Get the sprite representing the item. * \param visuals (out) The sprites of the item, and their positions. */ void bear::cursor::get_visual( std::list& visuals ) const { if ( m_inactive_duration < m_visibility_duration ) super::get_visual( visuals ); } // cursor::get_visual() /*----------------------------------------------------------------------------*/ /** * \brief Method called when the position of the mouse changes. * \param pos The new position of the cursor. * \return true if the event has been processed. */ bool bear::cursor::mouse_move ( const claw::math::coordinate_2d& pos ) { m_screen_position = pos; m_inactive_duration = 0; return false; } // cursor::mouse_move() plee-the-bear-20251226/bear-engine/lib/src/generic_items/code/decorative_effect.cpp000066400000000000000000000277331512343254000300110ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::decorative_effect class. * \author Julien Jorge */ #include "generic_items/decorative_effect.hpp" #include "engine/export.hpp" BASE_ITEM_EXPORT( decorative_effect, bear ) /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ bear::decorative_effect::decorative_effect() : m_duration(0), m_elapsed_time(0), m_loop_back(false), m_size_factor_init(1), m_size_factor_end(1), m_angle_offset_init(1), m_angle_offset_end(1), m_item(NULL), m_same_lifespan(false), m_restore_at_end(false), m_resize_item(false) { set_artificial(true); set_phantom(true); set_can_move_items(false); m_color_init.set(1,1,1,1); m_color_end.set(1,1,1,1); } // decorative_effect::decorative_effect() /*----------------------------------------------------------------------------*/ /** * \brief Initialise the item. */ void bear::decorative_effect::build() { super::build(); if ( m_item == (engine::with_rendering_attributes*)NULL ) kill(); else { m_rendering_attributes = m_item->get_rendering_attributes(); m_initial_size = m_item.get_item()->get_size(); apply_effect(); // follow the item set_center_of_mass( m_item.get_item()->get_center_of_mass() ); } } // decorative_effect::build() /*---------------------------------------------------------------------------*/ /** * \brief Do one iteration in the progression of the item. * \param elapsed_time Elapsed time since the last call. */ void bear::decorative_effect::progress( universe::time_type elapsed_time ) { super::progress(elapsed_time); m_elapsed_time += elapsed_time; if ( m_item == (engine::with_rendering_attributes*)NULL ) kill(); else if ( m_elapsed_time >= m_duration ) { kill(); if (m_same_lifespan) m_item.get_item()->kill(); else if (m_restore_at_end) { m_item->set_rendering_attributes( m_rendering_attributes ); m_item.get_item()->set_size( m_initial_size ); } } else { apply_effect(); // follow the item set_center_of_mass( m_item.get_item()->get_center_of_mass() ); } } // decorative_effect::progress() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type \c bool. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::decorative_effect::set_bool_field( const std::string& name, bool value ) { bool ok = true; if (name == "decorative_effect.same_lifespan") m_same_lifespan = value; else if (name == "decorative_effect.restore_at_end") m_restore_at_end = value; else if (name == "decorative_effect.loop_back") m_loop_back = value; else ok = super::set_bool_field(name, value); return ok; } // decorative_effect::set_bool_field() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type \c base_item. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::decorative_effect::set_item_field ( const std::string& name, base_item* value ) { bool ok = true; if (name == "decorative_effect.item") { m_item = value; set_center_of_mass( value->get_center_of_mass() ); } else ok = super::set_bool_field(name, value); return ok; } // decorative_effect::set_item_field() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type \c real. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::decorative_effect::set_real_field( const std::string& name, double value ) { bool ok = true; if (name == "decorative_effect.duration") m_duration = value; else if (name == "decorative_effect.size_factor.init") m_size_factor_init = value; else if (name == "decorative_effect.size_factor.end") m_size_factor_end = value; else if (name == "decorative_effect.angle_offset.init") m_angle_offset_init = value; else if (name == "decorative_effect.angle_offset.end") m_angle_offset_end = value; else ok = super::set_real_field(name, value); return ok; } // decorative_effect::set_real_field() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type \c color. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::decorative_effect::set_color_field ( const std::string& name, visual::color value ) { bool ok = true; if (name == "decorative_effect.color.init") m_color_init = value; else if (name == "decorative_effect.color.end") m_color_end = value; else ok = super::set_color_field(name, value); return ok; } // decorative_effect::set_color_field() /*----------------------------------------------------------------------------*/ /** * \brief Set the item on which the effect is applyed. * \param d The total duration. * \param same_lifespan Tell if \a item must be killed with *this. * \param restore Tell if the state of the item must be restored at the end. * \param loop_back Indicates if the effect has a loop back. */ void bear::decorative_effect::set_item ( engine::base_item* item, bool same_lifespan, bool restore, bool loop_back ) { m_item = item; m_same_lifespan = same_lifespan; m_restore_at_end = restore; m_loop_back = loop_back; if ( item != NULL ) set_center_of_mass( item->get_center_of_mass() ); } // decorative_effect::set_item() /*----------------------------------------------------------------------------*/ /** * \brief Set the duration of the effect. * \param d The total duration. */ void bear::decorative_effect::set_duration(universe::time_type d) { m_duration = d; } // decorative_effect::set_duration() /*----------------------------------------------------------------------------*/ /** * \brief Get the duration of the effect. */ bear::universe::time_type bear::decorative_effect::get_duration() const { return m_duration; } // decorative_effect::get_duration() /*----------------------------------------------------------------------------*/ /** * \brief Tells if the item is resized when the size of the rendering attributes * is changed. * \param r Resize it or not. */ void bear::decorative_effect::resize_item( bool r ) { m_resize_item = r; } // decorative_effect::resize_item() /*----------------------------------------------------------------------------*/ /** * \brief Set the initial factor applied to the size. * \param f The factor to apply. */ void bear::decorative_effect::set_size_factor_init(double f) { m_size_factor_init = f; } // decorative_effect::set_size_factor_init() /*----------------------------------------------------------------------------*/ /** * \brief Set the initial color. * \param c The color to apply. */ void bear::decorative_effect::set_color_init(const visual::color& c) { m_color_init = c; } // decorative_effect::set_color_init() /*----------------------------------------------------------------------------*/ /** * \brief Set the initial factor applied to the angle. * \param f The factor to apply. */ void bear::decorative_effect::set_angle_offset_init(double f) { m_angle_offset_init = f; } // decorative_effect::set_angle_offset_init() /*----------------------------------------------------------------------------*/ /** * \brief Set the final factor applied to the size. * \param f The factor to apply. */ void bear::decorative_effect::set_size_factor_end(double f) { m_size_factor_end = f; } // decorative_effect::set_size_factor_end() /*----------------------------------------------------------------------------*/ /** * \brief Set the final clor. * \param c The color to apply. */ void bear::decorative_effect::set_color_end(const visual::color& c) { m_color_end = c; } // decorative_effect::set_color_end() /*----------------------------------------------------------------------------*/ /** * \brief Set the final factor applied to the angle. * \param f The factor to apply. */ void bear::decorative_effect::set_angle_offset_end(double f) { m_angle_offset_end = f; } // decorative_effect::set_angle_offset_end() /*----------------------------------------------------------------------------*/ /** * \brief Set the offsets applied to the size. * \param init The initial factor to apply. * \param end The final factor to apply. */ void bear::decorative_effect::set_size_factor(double init, double end) { set_size_factor_init(init); set_size_factor_end(end); } // decorative_effect::set_size_factor() /*----------------------------------------------------------------------------*/ /** * \brief Set the colors applied. * \param init_color The initial color to apply. * \param end_color The final color to apply. */ void bear::decorative_effect::set_color (const visual::color& init_color, const visual::color& end_color) { m_color_init = init_color; m_color_end = end_color; } // decorative_effect::set_color() /*----------------------------------------------------------------------------*/ /** * \brief Set the offsets applied to the angle. * \param init The initial factor to apply. * \param end The final factor to apply. */ void bear::decorative_effect::set_angle_offset(double init, double end) { set_angle_offset_init(init); set_angle_offset_end(end); } // decorative_effect::set_angle_offset() /*----------------------------------------------------------------------------*/ /** * \brief Apply the effect to the item. */ void bear::decorative_effect::apply_effect() const { double r = m_elapsed_time / m_duration; if ( m_loop_back ) { r = r * 2.0; if ( r > 1.0 ) r = 2.0 - r; } if ( m_resize_item ) { engine::base_item& item( *m_item.get_item() ); item.set_width ( m_initial_size.x * ( m_size_factor_init + ( m_size_factor_end - m_size_factor_init ) * r ) ); item.set_height ( m_initial_size.y * ( m_size_factor_init + ( m_size_factor_end - m_size_factor_init ) * r ) ); } m_item->get_rendering_attributes().set_width ( m_rendering_attributes.width() * ( m_size_factor_init + (m_size_factor_end - m_size_factor_init) * r ) ); m_item->get_rendering_attributes().set_height ( m_rendering_attributes.height() * ( m_size_factor_init + (m_size_factor_end - m_size_factor_init) * r ) ); m_item->get_rendering_attributes().set_opacity ( m_rendering_attributes.get_opacity() * (m_color_init.get_opacity() + (m_color_end.get_opacity() - m_color_init.get_opacity()) * r) ); m_item->get_rendering_attributes().set_angle ( m_rendering_attributes.get_angle() + (m_angle_offset_end - m_angle_offset_init) * r ); m_item->get_rendering_attributes().set_red_intensity ( m_rendering_attributes.get_red_intensity() * ( m_color_init.get_red_intensity() + ( m_color_end.get_red_intensity() - m_color_init.get_red_intensity() ) * r) ); m_item->get_rendering_attributes().set_green_intensity ( m_rendering_attributes.get_green_intensity() * ( m_color_init.get_green_intensity() + ( m_color_end.get_green_intensity() - m_color_init.get_green_intensity() ) * r) ); m_item->get_rendering_attributes().set_blue_intensity ( m_rendering_attributes.get_blue_intensity() * (m_color_init.get_blue_intensity() + ( m_color_end.get_blue_intensity() - m_color_init.get_blue_intensity() ) * r) ); } // decorative_effect::apply_effect() plee-the-bear-20251226/bear-engine/lib/src/generic_items/code/decorative_flow.cpp000066400000000000000000000143631512343254000275170ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::decorative_flow class. * \author Sebastie Angibaud */ #include "generic_items/decorative_flow.hpp" #include "engine/item_brick/loader/activable_sides_loader.hpp" BASE_ITEM_EXPORT( decorative_flow, bear ) /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ bear::decorative_flow::decorative_flow() : m_min_speed_flow(0, 0), m_max_speed_flow(1, 1), m_item_per_second(1), m_decoration_size(0, 0) { set_phantom(true); set_can_move_items(false); set_artificial(true); } // decorative_flow::decorative_flow() /*---------------------------------------------------------------------------*/ /** * \brief Do one iteration in the progression of the item. */ void bear::decorative_flow::progress( universe::time_type elapsed_time ) { super::progress(elapsed_time); double a = (double)( (1.0 + m_item_per_second * elapsed_time) * rand() / RAND_MAX); for ( unsigned int i=1; i <= (unsigned int)a; ++i ) create_decoration(); update_decorations(elapsed_time); } // decorative_flow::progress() /*----------------------------------------------------------------------------*/ /** * \brief Initialize the item. */ void bear::decorative_flow::build() { super::build(); if ( get_animation().is_valid() ) { m_decoration_size = get_animation().get_max_size(); initiate_decoration(); } } // decorative_flow::build() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type \c real. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::decorative_flow::set_real_field( const std::string& name, double value ) { bool ok = true; if (name == "decorative_flow.min_speed.x") m_min_speed_flow.x = value; else if (name == "decorative_flow.min_speed.y") m_min_speed_flow.y = value; else if (name == "decorative_flow.max_speed.x") m_max_speed_flow.x = value; else if (name == "decorative_flow.max_speed.y") m_max_speed_flow.y = value; else if (name == "decorative_flow.items_per_second") m_item_per_second = value; else ok = super::set_real_field(name, value); return ok; } // decorative_flow::set_real_field() /*----------------------------------------------------------------------------*/ /** * \brief Get the sprites representing the item. * \param visuals (out) The sprites of the item, and their positions. */ void bear::decorative_flow::get_visual ( std::list& visuals ) const { visual::sprite spr( get_sprite() ); if ( spr.is_valid() ) { std::list::const_iterator it; for ( it=m_decorations.begin(); it!=m_decorations.end(); ++it) { universe::position_type pos( *it + get_bottom_left() + get_gap() ); pos.y += m_decoration_size.y; visuals.push_front ( engine::scene_visual( pos, spr, get_z_position() ) ); } } } // decorative_flow::get_visual() /*----------------------------------------------------------------------------*/ /** * \brief Add the loaders of this item class into a given loader map. * \param m The map in which the loaders are inserted. */ void bear::decorative_flow::populate_loader_map( engine::item_loader_map& m ) { super::populate_loader_map(m); m.insert( engine::activable_sides_loader(*this) ); } // decorative_flow::populate_loader_map() /*---------------------------------------------------------------------------*/ /** * \brief Update positions of decorations. */ void bear::decorative_flow::update_decorations ( universe::time_type elapsed_time ) { std::list new_list; std::list::const_iterator it; for ( it = m_decorations.begin(); it != m_decorations.end(); ++it) { universe::position_type pos(*it); double rand_x = 1.0 * rand() / RAND_MAX; double rand_y = 1.0 * rand() / RAND_MAX; pos.x += elapsed_time * ( m_min_speed_flow.x + ( m_max_speed_flow.x - m_min_speed_flow.x )*rand_x ); pos.y += elapsed_time * ( m_min_speed_flow.y + ( m_max_speed_flow.y - m_min_speed_flow.y )*rand_y ); if ( (pos.x + m_decoration_size.x <= get_width() ) && (pos.x >= 0 ) && (pos.y >= 0 ) && (pos.y + m_decoration_size.y <= get_height() ) ) new_list.push_back(pos); } m_decorations = new_list; } // decorative_flow::update_positions() /*---------------------------------------------------------------------------*/ /** * \brief Update positions of decorations. */ void bear::decorative_flow::create_decoration() { universe::position_type pos(universe::position_type(0, 0)); double rand_val; if ( left_side_is_active() ) { rand_val = get_height() * rand() / RAND_MAX; pos.y += rand_val; m_decorations.push_back(pos); } if ( right_side_is_active() ) { pos.x -= m_decoration_size.x; rand_val = get_height() * rand() / RAND_MAX; pos.y += rand_val; m_decorations.push_back(pos); } if ( bottom_side_is_active() ) { rand_val = get_width() * rand() / RAND_MAX; pos.x += rand_val; m_decorations.push_back(pos); } if ( top_side_is_active() ) { pos.y -= m_decoration_size.y; rand_val = get_width() * rand() / RAND_MAX; pos.x += rand_val; m_decorations.push_back(pos); } } // decorative_flow::create_decoration() /*---------------------------------------------------------------------------*/ /** * \brief Initiate decorations. */ void bear::decorative_flow::initiate_decoration() { unsigned int max = (unsigned int)(get_bounding_box().area() / 2000); for ( unsigned int i = 0; i <= max; ++i) { double rand_val1(get_width() * rand() / RAND_MAX); double rand_val2(get_height() * rand() / RAND_MAX); m_decorations.push_back( universe::position_type(rand_val1, rand_val2) ); } } // decorative_flow::initiate_decoration() plee-the-bear-20251226/bear-engine/lib/src/generic_items/code/decorative_item.cpp000066400000000000000000000152521512343254000275040ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::decorative_item class. * \author Sebastie Angibaud */ #include "generic_items/decorative_item.hpp" #include "visual/scene_element_sequence.hpp" #include "engine/export.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param item The instance loaded by this loaded. */ bear::decorative_item::loader::loader( decorative_item& item ) : super("decorative_item"), m_item(item) { } // decorative_item::loader::loader() /*----------------------------------------------------------------------------*/ /** * \brief Creates a copy of this instance. */ bear::decorative_item::loader* bear::decorative_item::loader::clone() const { return new loader( *this ); } // decorative_item::loader::clone() /*----------------------------------------------------------------------------*/ /** * \brief Sets a field of type \c real. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::decorative_item::loader::set_field ( const std::string& name, double value ) { bool result = true; if ( name == "shadow.x" ) m_item.set_shadow_x( value ); else if ( name == "shadow.y" ) m_item.set_shadow_y( value ); else result = super::set_field(name, value); return result; } // decorative_item::loader::set_field() /*----------------------------------------------------------------------------*/ /** * \brief Sets a field of type \c boolean. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::decorative_item::loader::set_field ( const std::string& name, bool value ) { bool result = true; if (name == "kill_when_finished") m_item.set_kill_when_finished( value ); else if (name == "kill_on_contact") m_item.set_kill_on_contact( value ); else if (name == "kill_when_leaving") m_item.set_kill_when_leaving( value ); else result = super::set_field(name, value); return result; } // decorative_item::loader::set_field() BASE_ITEM_EXPORT( decorative_item, bear ) /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ bear::decorative_item::decorative_item() : m_kill_when_finished(false), m_kill_on_contact(false), m_stop_on_bottom_contact(false), m_kill_when_leaving(false), m_shadow_x(0), m_shadow_y(0) { set_phantom(true); set_can_move_items(false); set_artificial(true); } // decorative_item::decorative_item() /*---------------------------------------------------------------------------*/ /** * \brief Do one iteration in the progression of the item. */ void bear::decorative_item::progress( universe::time_type elapsed_time ) { super::progress(elapsed_time); if ( m_kill_on_contact && has_contact() ) kill(); else if ( m_kill_when_finished && get_animation().is_finished() ) kill(); } // decorative_item::progress() /*---------------------------------------------------------------------------*/ /** * \brief Gets the scene elements to use to render this item. * \param visuals (out) The scene elements. */ void bear::decorative_item::get_visual ( std::list& visuals ) const { if ( (m_shadow_x == 0) || (m_shadow_y == 0) ) super::get_visual( visuals ); else { typedef std::list visual_list; visual_list parent_visuals; super::get_visual( parent_visuals ); parent_visuals.sort( engine::scene_visual::z_position_compare() ); visual::scene_element_sequence result; result.set_shadow( m_shadow_x, m_shadow_y ); for ( visual_list::iterator it=parent_visuals.begin(); it!=parent_visuals.end(); ++it ) result.push_back( it->scene_element ); visuals.push_back( engine::scene_visual( result, get_z_position() ) ); } } // decorative_item::get_visual() /*----------------------------------------------------------------------------*/ /** * \brief Set if the item kills himself when the animation is finished. * \param value The new value. */ void bear::decorative_item::set_kill_when_finished(bool value) { m_kill_when_finished = value; } // decorative_item::set_kill_when_finished() /*----------------------------------------------------------------------------*/ /** * \brief Set if the item kills himself when he has a contact. * \param value The new value. */ void bear::decorative_item::set_kill_on_contact(bool value) { m_kill_on_contact = value; } // decorative_item::set_kill_on_contact() /*----------------------------------------------------------------------------*/ /** * \brief Tells if the item kills himself when he leaves the active region. */ bool bear::decorative_item::get_kill_when_leaving() const { return m_kill_when_leaving; } // decorative_item::get_kill_when_leaving() /*----------------------------------------------------------------------------*/ /** * \brief Set if the item kills himself when he leaves the active region. * \param value The new value. */ void bear::decorative_item::set_kill_when_leaving(bool value) { m_kill_when_leaving = value; } // decorative_item::set_kill_when_leaving() /*----------------------------------------------------------------------------*/ /** * \brief Sets the offset of the shadow on the x-axis. * \param v The new offset. */ void bear::decorative_item::set_shadow_x( double v ) { m_shadow_x = v; } // decorative_item::set_shadow_x() /*----------------------------------------------------------------------------*/ /** * \brief Sets the offset of the shadow on the y-axis. * \param v The new offset. */ void bear::decorative_item::set_shadow_y( double v ) { m_shadow_y = v; } // decorative_item::set_shadow_y() /*----------------------------------------------------------------------------*/ /** * \brief Adds the loaders of this item class into a given loader map. * \param m The map in which the loaders are inserted. */ void bear::decorative_item::populate_loader_map( engine::item_loader_map& m ) { super::populate_loader_map(m); m.insert( loader( *this ) ); } // decorative_item::populate_loader_map() /*----------------------------------------------------------------------------*/ /** * \brief The item leaves the active region. */ void bear::decorative_item::leaves_active_region() { super::leaves_active_region(); if (m_kill_when_leaving) kill(); } // decorative_item::leaves_active_region() plee-the-bear-20251226/bear-engine/lib/src/generic_items/code/decorative_model.cpp000066400000000000000000000031431512343254000276420ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::decorative_model class. * \author Julien Jorge */ #include "generic_items/decorative_model.hpp" BASE_ITEM_EXPORT( decorative_model, bear ) /*----------------------------------------------------------------------------*/ /** * \brief Tell if the item is well prepared. */ bool bear::decorative_model::is_valid() const { return ! m_initial_action.empty() && ! m_model_path.empty() && super::is_valid(); } // decorative_model::is_valid() /*----------------------------------------------------------------------------*/ /** * \brief Initialize the item. */ void bear::decorative_model::build() { super::build(); set_model_actor( get_level_globals().get_model(m_model_path) ); start_model_action( m_initial_action ); } // decorative_model::build() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type string. * \param name The name of the field. * \param value The value of the field. */ bool bear::decorative_model::set_string_field ( const std::string& name, const std::string& value ) { bool result = true; if ( name == "decorative_model.model_file" ) m_model_path = value; else if ( name == "decorative_model.initial_action" ) m_initial_action = value; else result = super::set_string_field(name, value); return result; } // bear::decorative_model::set_string_field() plee-the-bear-20251226/bear-engine/lib/src/generic_items/code/decorative_rectangle.cpp000066400000000000000000000103201512343254000305010ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::decorative_rectangle class. * \author Sebastie Angibaud */ #include "generic_items/decorative_rectangle.hpp" #include "engine/export.hpp" #include "visual/scene_rectangle.hpp" #include "visual/scene_polygon.hpp" BASE_ITEM_EXPORT( decorative_rectangle, bear ) /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ bear::decorative_rectangle::decorative_rectangle() : m_border_size(1) { set_phantom(true); set_can_move_items(false); set_artificial(true); m_fill_color.set(1,1,1,0); m_border_color.set(1,1,1,0); } // decorative_rectangle::decorative_rectangle() /*----------------------------------------------------------------------------*/ /** * \brief Get the sprites representing the item. * \param visuals (out) The sprites of the item, and their positions. */ void bear::decorative_rectangle::get_visual ( std::list& visuals ) const { super::get_visual(visuals); if ( get_rendering_attributes().get_opacity() != 0 ) { std::vector points; points.push_back(bear::universe::position_type(0, 0)); points.push_back(bear::universe::position_type(get_width(), 0)); points.push_back(bear::universe::position_type (get_width(), get_height())); points.push_back(bear::universe::position_type(0, get_height())); bear::universe::rectangle_type rect(points[0], points[2]); if ( m_fill_color.get_opacity() != 0 ) { bear::visual::scene_element e2 ( bear::visual::scene_polygon ( get_left(), get_bottom(), m_fill_color, points ) ); e2.get_rendering_attributes().combine(get_rendering_attributes()); visuals.push_front(e2); } if ( m_border_color.get_opacity() != 0 ) { bear::visual::scene_element e1 (bear::visual::scene_rectangle ( get_left(), get_bottom(), m_border_color, rect, false, m_border_size)); e1.get_rendering_attributes().combine(get_rendering_attributes()); visuals.push_front(e1); } } } // decorative_rectangle::get_visual() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type \c real. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::decorative_rectangle::set_real_field ( const std::string& name, double value ) { bool ok = true; if (name == "decorative_rectangle.border_size") m_border_size = value; else ok = super::set_real_field(name, value); return ok; } // decorative_rectangle::set_real_field() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type \c color. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::decorative_rectangle::set_color_field ( const std::string& name, visual::color value ) { bool ok = true; if (name == "decorative_rectangle.fill_color") m_fill_color = value; else if (name == "decorative_rectangle.border_color") m_border_color = value; else ok = super::set_color_field(name, value); return ok; } // decorative_rectangle::set_color_field() /*----------------------------------------------------------------------------*/ /** * \brief Set the fill color. * \param c The fill color. */ void bear::decorative_rectangle::set_fill_color( const visual::color& c ) { m_fill_color = c; } // decorative_rectangle::set_fill_color() /*----------------------------------------------------------------------------*/ /** * \brief Set the border color. * \param c The border color. */ void bear::decorative_rectangle::set_border_color( const visual::color& c ) { m_border_color = c; } // decorative_rectangle::set_border_color() plee-the-bear-20251226/bear-engine/lib/src/generic_items/code/decorative_toggle.cpp000066400000000000000000000012461512343254000300250ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::decorative_toggle class. * \author Julien Jorge */ #include "generic_items/decorative_toggle.hpp" BASE_ITEM_EXPORT( decorative_toggle, bear ) /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ bear::decorative_toggle::decorative_toggle() { set_phantom(true); set_can_move_items(false); set_artificial(true); } // decorative_toggle::decorative_toggle() plee-the-bear-20251226/bear-engine/lib/src/generic_items/code/delayed_kill_item.cpp000066400000000000000000000060771512343254000300060ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::delayed_kill_item class. * \author Sebastien Angibaud */ #include "generic_items/delayed_kill_item.hpp" #include "engine/export.hpp" BASE_ITEM_EXPORT( delayed_kill_item, bear ) /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ bear::delayed_kill_item::delayed_kill_item() : m_duration(0), m_start_duration(0) { set_phantom(true); set_can_move_items(false); set_global(true); set_artificial(true); } // delayed_kill_item::delayed_kill_item() /*----------------------------------------------------------------------------*/ /** * \brief Do one iteration in the progression of the item. */ void bear::delayed_kill_item::progress( universe::time_type elapsed_time ) { super::progress(elapsed_time); m_start_duration += elapsed_time; if ( m_start_duration >= m_duration ) { std::vector::iterator it; for (it = m_items.begin(); it != m_items.end(); ++it) if ( *it != (base_item*)NULL ) (*it)->kill(); kill(); } } // delayed_kill_item::progress() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type list of <*base_item>. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::delayed_kill_item::set_item_list_field ( const std::string& name, const std::vector& value ) { bool result = false; if ( name == "delayed_kill_item.killing_items" ) { m_items.resize(value.size()); for ( std::size_t i=0; i!=value.size(); ++i ) m_items[i] = value[i]; result = true; } else result = super::set_item_list_field( name, value ); return result; } // delayed_kill_item::set_item_list_field() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type "real". * \param value The value of the field. */ bool bear::delayed_kill_item::set_real_field ( const std::string& name, double value ) { bool result = true; if ( name == "delayed_kill_item.duration" ) m_duration = value; else result = super::set_real_field(name, value); return result; } // delayed_kill_item::set_real_field() /*----------------------------------------------------------------------------*/ /** * \brief Set duration until kill item. * \param value The value of duration. */ void bear::delayed_kill_item::set_duration( double value ) { m_duration = value; } // delayed_kill_item::set_duration() /*----------------------------------------------------------------------------*/ /** * \brief Add an item to kill. * \param item The item to kill. */ void bear::delayed_kill_item::add_item( base_item* item ) { m_items.push_back(item); } // delayed_kill_item::add_item() plee-the-bear-20251226/bear-engine/lib/src/generic_items/code/delayed_level_loading.cpp000066400000000000000000000226011512343254000306300ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::delayed_level_loading class. * \author Julien Jorge */ #include "generic_items/delayed_level_loading.hpp" #include "engine/game.hpp" #include "engine/level_globals.hpp" #include "engine/resource_pool.hpp" #include "engine/message/transition_effect_message.hpp" #include "engine/message/transition_effect_erase_message.hpp" #include "engine/transition_effect/fade_effect.hpp" #include "engine/variable/variable.hpp" #include BASE_ITEM_EXPORT( delayed_level_loading, bear ) /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ bear::delayed_level_loading::delayed_level_loading() : m_time(0), m_delay(std::numeric_limits::infinity()), m_fade_duration(1), m_loading(false), m_load_on_input(false), m_push_mode(false), m_effect_id(engine::transition_layer::not_an_id) { } // delayed_level_loading::delayed_level_loading() /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param level_name The name of the game variable containing the name of the * level to load or the path of the level itself. * \param delay number of seconds of delay. * \param load_on_input Tell if the level must be loaded if the user press a key * before the end of the delay. * \param fade_duration The duration of the fading effect before starting the * level * \param transition_layer_name The name of the transition layer * receiving the fade effect */ bear::delayed_level_loading::delayed_level_loading ( const std::string& level_name, universe::time_type delay, bool load_on_input, universe::time_type fade_duration, const std::string& transition_layer_name ) : m_time(0), m_delay(delay), m_fade_duration(fade_duration), m_loading(false), m_load_on_input(load_on_input), m_push_mode(false), m_effect_id(engine::transition_layer::not_an_id) { m_level_path = get_string_from_vars(level_name); m_transition_layer_name = get_string_from_vars(transition_layer_name); } // delayed_level_loading::delayed_level_loading() /*----------------------------------------------------------------------------*/ /** * \brief Destroy the item. */ void bear::delayed_level_loading::destroy() { engine::transition_effect_erase_message msg(m_effect_id); get_level_globals().send_message( m_transition_layer_name, msg ); } // delayed_level_loading::destroy() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type string. * \param name The name of the field. * \param value The value of the field. */ bool bear::delayed_level_loading::set_string_field ( const std::string& name, const std::string& value ) { bool result = true; if ( name == "delayed_level_loading.level" ) m_level_path = get_string_from_vars(value); else if ( name == "delayed_level_loading.transition_layer_name" ) m_transition_layer_name = get_string_from_vars(value); else result = super::set_string_field( name, value ); return result; } // delayed_level_loading::set_string_field() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type "real". * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::delayed_level_loading::set_real_field ( const std::string& name, double value ) { bool result(true); if ( name == "delayed_level_loading.fade_duration" ) m_fade_duration = value; else if ( name == "delayed_level_loading.delay" ) m_delay = value; else result = super::set_real_field( name, value ); return result; } // delayed_level_loading::set_real_field() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type \c bool. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::delayed_level_loading::set_bool_field ( const std::string& name, bool value ) { bool result(true); if ( name == "delayed_level_loading.load_on_input" ) m_load_on_input = value; else if ( name == "delayed_level_loading.push_mode" ) m_push_mode = value; else result = super::set_bool_field( name, value ); return result; } // delayed_level_loading::set_bool_field() /*----------------------------------------------------------------------------*/ /** * \brief Tell if the item is well initialised. */ bool bear::delayed_level_loading::is_valid() const { return engine::resource_pool::get_instance().exists(m_level_path) && super::is_valid(); } // delayed_level_loading::is_valid() /*----------------------------------------------------------------------------*/ /** * \brief Do one step in the progression of the item. * \param elapsed_time Elapsed time since the last call. */ void bear::delayed_level_loading::progress( universe::time_type elapsed_time ) { super::progress(elapsed_time); progress_input_reader(elapsed_time); const universe::time_type fade_date(m_delay - m_fade_duration); if ( (m_time + elapsed_time >= fade_date) && !m_loading ) start_fading(); m_time += elapsed_time; if ( (m_time >= m_delay) && !m_level_path.empty() ) { if ( ! m_push_mode ) engine::game::get_instance().set_waiting_level( m_level_path ); else bear::engine::game::get_instance().push_level( m_level_path ); m_level_path.clear(); } } // delayed_level_loading::progress() /*----------------------------------------------------------------------------*/ /** * \brief Tell that the level must be pushed. * \param push_mode The new mode. */ void bear::delayed_level_loading::set_push_mode(bool push_mode) { m_push_mode = push_mode; } // delayed_level_loading::set_push_mode() /*----------------------------------------------------------------------------*/ /** * \brief Start fading before loading the level. */ void bear::delayed_level_loading::start_fading() { if ( !m_loading ) { get_level().stop_music( m_fade_duration ); if ( (m_fade_duration > 0) && !m_transition_layer_name.empty() ) { engine::transition_effect_message msg; msg.get_effect().set_duration(m_fade_duration, 1, 0); msg.get_effect().set_color( 0, 0, 0 ); get_level_globals().send_message( m_transition_layer_name, msg ); m_effect_id = msg.get_id(); // start the level at the end of the fading m_delay = m_time + m_fade_duration; } else m_delay = m_time; } m_loading = true; } // delayed_level_loading::start_fading() /*----------------------------------------------------------------------------*/ /** * \brief A keyboard key has been pressed. * \param key The code of the key. */ bool bear::delayed_level_loading::key_pressed ( const bear::input::key_info& key ) { if ( m_load_on_input ) { start_fading(); return true; } else return false; } // delayed_level_loading::key_pressed() /*----------------------------------------------------------------------------*/ /** * \brief A joystick button has been pressed. * \param button The code of the button. * \param joy_index The index of the joystick. */ bool bear::delayed_level_loading::button_pressed ( input::joystick::joy_code button, unsigned int joy_index ) { if ( m_load_on_input ) { start_fading(); return true; } else return false; } // delayed_level_loading::button_pressed() /*----------------------------------------------------------------------------*/ /** * \brief A mouse button has been pressed. * \param button The code of the button. * \param pos The position of the cursor on the screen. */ bool bear::delayed_level_loading::mouse_pressed ( input::mouse::mouse_code button, const claw::math::coordinate_2d& pos ) { if ( m_load_on_input ) { start_fading(); return true; } else return false; } // delayed_level_loading::mouse_pressed() /*----------------------------------------------------------------------------*/ /** * \brief A finger has been used. * \param event The event dispatched by the finger. */ bool bear::delayed_level_loading::finger_action ( const input::finger_event& event ) { if ( m_load_on_input ) { start_fading(); return true; } else return false; } // delayed_level_loading::finger_action() /*----------------------------------------------------------------------------*/ /** * \brief Get a string from the game variable. * \param name The name of the game variable. * \return \a name if there is such a variable. */ std::string bear::delayed_level_loading::get_string_from_vars ( const std::string& name ) const { // The parameter is the default result. std::string result(name); engine::variable var(name, name); if ( engine::game::get_instance().game_variable_exists(var) ) { engine::game::get_instance().get_game_variable(var); if ( !var.get_value().empty() ) result = var.get_value(); } return result; } // delayed_level_loading::get_string_from_vars() plee-the-bear-20251226/bear-engine/lib/src/generic_items/code/density_rectangle_creator.cpp000066400000000000000000000031571512343254000315640ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::density_rectangle_creator class. * \author Sebastien Angibaud */ #include "generic_items/density_rectangle_creator.hpp" #include "engine/layer/layer.hpp" #include "engine/world.hpp" BASE_ITEM_EXPORT( density_rectangle_creator, bear ) /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ bear::density_rectangle_creator::density_rectangle_creator() : m_density(0) { set_can_move_items(false); } // density_rectangle_creator::density_rectangle_creator() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type "real". * \param name The name of the field. * \param value The value of the field. */ bool bear::density_rectangle_creator::set_real_field ( const std::string& name, double value ) { bool result = true; if ( name == "density_rectangle_creator.zone_density" ) m_density = value; else result = super::set_real_field(name, value); return result; } // density_rectangle_creator::set_real_field() /*----------------------------------------------------------------------------*/ /** * \brief Initialize the item. */ void bear::density_rectangle_creator::build() { if ( get_layer().has_world() ) get_layer().get_world().add_density_rectangle (get_bounding_box(), m_density); kill(); } // density_rectangle_creator::build() plee-the-bear-20251226/bear-engine/lib/src/generic_items/code/descending_ceiling.cpp000066400000000000000000000244431512343254000301400ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::descending_ceiling class. * \author Julien Jorge */ #include "generic_items/descending_ceiling.hpp" #include "universe/collision_info.hpp" #include "universe/collision_repair.hpp" #include "universe/world.hpp" #include "engine/export.hpp" BASE_ITEM_EXPORT( descending_ceiling, bear ) /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ bear::descending_ceiling::descending_ceiling() : m_opposite_side_is_active(false), m_left_side_is_active(false), m_right_side_is_active(false), m_apply_angle(true), m_line(0, 0, 0, 0) { } // descending_ceiling::descending_ceiling() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type \c . * \param name The name of the field to set. * \param value The new value of the field. */ bool bear::descending_ceiling::set_real_field ( const std::string& name, double value ) { bool result = true; if ( name == "descending_ceiling.steepness" ) m_line.direction.y = value; else result = super::set_real_field(name, value); return result; } // descending_ceiling::set_real_field() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type \c bool. * \param name The name of the field to set. * \param value The new value of the field. */ bool bear::descending_ceiling::set_bool_field( const std::string& name, bool value ) { bool result = true; if ( name == "descending_ceiling.opposite_side_is_active" ) m_opposite_side_is_active = value; else if ( name == "descending_ceiling.left_side_is_active" ) m_left_side_is_active = value; else if ( name == "descending_ceiling.right_side_is_active" ) m_right_side_is_active = value; else if ( name == "descending_ceiling.apply_angle" ) m_apply_angle = value; else result = super::set_bool_field(name, value); return result; } // descending_ceiling::set_bool_field() /*----------------------------------------------------------------------------*/ /** * \brief Tell if the item is correctly initialized. */ bool bear::descending_ceiling::is_valid() const { return (m_line.direction.y != 0) && super::is_valid(); } // descending_ceiling::is_valid() /*----------------------------------------------------------------------------*/ /** * \brief Initialize the item. */ void bear::descending_ceiling::build() { super::build(); m_line.origin.set(get_left(), get_bottom()); m_line.direction.x = get_width(); if ( m_line.direction.y < 0 ) m_line.origin.y -= m_line.direction.y; init_default_contact_mode ( m_opposite_side_is_active, false, m_left_side_is_active, m_right_side_is_active ); } // descending_ceiling::build() /*----------------------------------------------------------------------------*/ /** * \brief Get the steepness of the descending_ceiling. */ bear::universe::coordinate_type bear::descending_ceiling::get_steepness() const { return m_line.direction.y; } // descending_ceiling::get_steepness() /*----------------------------------------------------------------------------*/ /** * \brief Align the other item. * \param that The other item of the collision. * \param info Some informations about the collision. */ void bear::descending_ceiling::collision_as_ceiling ( engine::base_item& that, universe::collision_info& info ) { bool align_as_block(false); bool align_as_ceiling(false); switch( info.get_collision_side() ) { case universe::zone::top_zone: align_as_block = m_opposite_side_is_active; break; case universe::zone::bottom_zone: align_as_ceiling = true; break; case universe::zone::middle_left_zone: if ( check_left_contact_as_ceiling(that, info) ) align_as_ceiling = true; else align_as_block = m_left_side_is_active; break; case universe::zone::middle_right_zone: if ( check_right_contact_as_ceiling(that, info) ) align_as_ceiling = true; else align_as_block = m_right_side_is_active; break; case universe::zone::middle_zone: align_as_ceiling = check_top_below_ceiling(that, info); break; default: { CLAW_ASSERT( false, "Invalid collision side." ); } } if ( satisfy_collision_condition(that) ) { if ( align_as_ceiling ) align_on_ceiling(that, info); else if ( align_as_block ) default_collision(info); else align_nearest_edge(that, info); } } // descending_ceiling::collision_as_ceiling() /*----------------------------------------------------------------------------*/ /** * \brief Call collision_as_ceiling(). * \param that The other item of the collision. * \param info Some informations about the collision. */ void bear::descending_ceiling::collision ( engine::base_item& that, universe::collision_info& info ) { collision_as_ceiling(that, info); } // descending_ceiling::collision() /*----------------------------------------------------------------------------*/ /** * \brief Check if an item colliding on the left is aligned on the ground. * \param that The other item of the collision. * \param info Some informations about the collision. */ bool bear::descending_ceiling::check_left_contact_as_ceiling ( engine::base_item& that, universe::collision_info& info ) const { bool result = false; // the ceiling goes from top left to bottom right if ( m_line.direction.y < 0 ) result = info.get_bottom_left_on_contact().y + info.other_item().get_height() >= m_line.y_value( get_left() ); return result; } // descending_ceiling::check_left_contact_as_ceiling() /*----------------------------------------------------------------------------*/ /** * \brief Check if an item colliding on the right is aligned on the ground. * \param that The other item of the collision. * \param info Some informations about the collision. */ bool bear::descending_ceiling::check_right_contact_as_ceiling ( engine::base_item& that, universe::collision_info& info ) const { bool result = false; // the ceiling goes from bottom left to top right if ( m_line.direction.y > 0 ) result = info.get_bottom_left_on_contact().y + info.other_item().get_height() >= m_line.y_value( get_right() ); return result; } // descending_ceiling::check_right_contact_as_ceiling() /*----------------------------------------------------------------------------*/ /** * \brief Check if the bottom of the other item was above the ground at * collision time. * \param that The other item of the collision. * \param info Some informations about the collision. */ bool bear::descending_ceiling::check_top_below_ceiling ( engine::base_item& that, universe::collision_info& info ) const { const universe::position_type pos (info.other_previous_state().get_top_middle()); return pos.y <= m_line.y_value(pos.x); } // descending_ceiling::check_top_below_ceiling() /*----------------------------------------------------------------------------*/ /** * \brief Align \a that on the ceiling line. * \param that The other item of the collision. * \param info Some informations about the collision. */ bool bear::descending_ceiling::align_on_ceiling ( engine::base_item& that, universe::collision_info& info ) { bool result = false; const universe::coordinate_type pos_x( that.get_horizontal_middle() ); if ( (pos_x >= get_left()) && (pos_x <= get_right()) && item_crossed_down_up(that, info) ) { const universe::position_type pos ( that.get_left(), m_line.y_value(pos_x) - info.other_item().get_height() ); if ( collision_align_bottom(info, pos) ) { result = true; if ( m_apply_angle ) apply_angle_to(that, info); } } return result; } // descending_ceiling::align_on_ceiling() /*----------------------------------------------------------------------------*/ /** * \brief Align \a that on the nearest vertical edge. * \param that The other item of the collision. * \param info Some informations about the collision. */ bool bear::descending_ceiling::align_nearest_edge ( engine::base_item& that, universe::collision_info& info ) { bool result = false; if ( info.reference_previous_state().get_center_of_mass().x <= info.other_previous_state().get_center_of_mass().x ) { if (m_right_side_is_active) result = collision_align_right(info); } else if (m_left_side_is_active) result = collision_align_left(info); return result; } // descending_ceiling::align_nearest_edge() /*----------------------------------------------------------------------------*/ /** * \brief Tell if the other item has crossed the surface following a top to down * direction. * \param that The other item in the collision. * \param info Informations on the collision. */ bool bear::descending_ceiling::item_crossed_down_up ( engine::base_item& that, const universe::collision_info& info ) const { bool result = false; if ( that.get_top() >= m_line.y_value(that.get_center_of_mass().x) ) { const universe::position_type other_prev_top ( info.other_previous_state().get_top_middle() ); if ( other_prev_top.x < get_left() ) result = other_prev_top.y <= m_line.origin.y; else if ( other_prev_top.x > get_right() ) result = other_prev_top.y <= m_line.y_value( get_right() ); else result = other_prev_top.y <= m_line.y_value(other_prev_top.x); } return result; } // descending_ceiling::item_crossed_down_up() /*----------------------------------------------------------------------------*/ /** * \brief Apply the angle of the ceiling to a colliding item. * \param that The other item in the collision. * \param info Informations on the collision. */ void bear::descending_ceiling::apply_angle_to ( engine::base_item& that, const universe::collision_info& info ) const { double angle = std::atan(m_line.direction.y / get_width()) + 3.14159; that.set_contact_angle( angle ); info.get_collision_repair().set_contact_normal (that, that.get_x_axis().get_orthonormal_anticlockwise()); } // descending_ceiling::apply_angle_to() plee-the-bear-20251226/bear-engine/lib/src/generic_items/code/environment_rectangle_creator.cpp000066400000000000000000000041651512343254000324510ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::environment_rectangle_creator class. * \author Sebastien Angibaud */ #include "generic_items/environment_rectangle_creator.hpp" #include "engine/layer/layer.hpp" #include "engine/world.hpp" BASE_ITEM_EXPORT( environment_rectangle_creator, bear ) /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ bear::environment_rectangle_creator::environment_rectangle_creator() : m_environment(bear::universe::air_environment) { set_can_move_items(false); } // environment_rectangle_creator::environment_rectangle_creator() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type "string". * \param name The name of the field. * \param value The value of the field. */ bool bear::environment_rectangle_creator::set_string_field ( const std::string& name, const std::string& value ) { bool result = true; if ( name == "environment_rectangle_creator.environment" ) { if ( value == "air_environment" ) m_environment = universe::air_environment; else if ( value == "fire_environment" ) m_environment = universe::fire_environment; else if ( value == "ice_environment" ) m_environment = universe::ice_environment; else if ( value == "water_environment" ) m_environment = universe::water_environment; else result = false; } else result = super::set_string_field(name, value); return result; } // environment_rectangle_creator::set_string_field() /*----------------------------------------------------------------------------*/ /** * \brief Initialize the item. */ void bear::environment_rectangle_creator::build() { if ( get_layer().has_world() ) get_layer().get_world().add_environment_rectangle (get_bounding_box(), m_environment); kill(); } // environment_rectangle_creator::build() plee-the-bear-20251226/bear-engine/lib/src/generic_items/code/explosion_effect_item.cpp000066400000000000000000000203601512343254000307070ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::explosion_effect_item class. * \author Sebastie Angibaud */ #include "generic_items/explosion_effect_item.hpp" #include "generic_items/decorative_item.hpp" #include "engine/export.hpp" BASE_ITEM_EXPORT( explosion_effect_item, bear ) /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ bear::explosion_effect_item::explosion_effect_item() : m_force(0), m_dust_count(100), m_splinter_count(10) { set_phantom(true); set_can_move_items(false); set_artificial(true); } // explosion_effect_item::explosion_effect_item() /*----------------------------------------------------------------------------*/ /** * \brief Do one step in the progression of the item. * \param elapsed_time Elapsed time since the last call. */ void bear::explosion_effect_item::progress( universe::time_type elapsed_time ) { super::progress(elapsed_time); if ( !m_dust_animations.empty() ) create_dust_items(); if ( !m_splinter_animations.empty() ) create_splinter_items(); kill(); } // explosion_effect_item::progress() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type \c list of visual::animation. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::explosion_effect_item::set_animation_list_field ( const std::string& name, const std::vector& value ) { bool result(true); if ( name == "explosion_effect_item.dust_animations" ) m_dust_animations = value; else if ( name == "explosion_effect_item.splinter_animations" ) m_splinter_animations = value; else result = super::set_animation_list_field(name, value); return result; } // explosion_effect_item::set_animation_list_field() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type \c real. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::explosion_effect_item::set_real_field ( const std::string& name, double value ) { bool result(true); if (name == "explosion_effect_item.force") m_force = value; else result = super::set_real_field(name, value); return result; } // explosion_effect_item::set_real_field() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type \c unsigned int. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::explosion_effect_item::set_u_integer_field ( const std::string& name, unsigned int value ) { bool result(true); if (name == "explosion_effect_item.dust_count") m_dust_count = value; else if (name == "explosion_effect_item.splinter_count") m_splinter_count = value; else result = super::set_u_integer_field(name, value); return result; } // explosion_effect_item::set_u_integer_field() /*---------------------------------------------------------------------------*/ /** * \brief Add a splinter animation. * \param anim A new splinter animation to add. */ void bear::explosion_effect_item::add_splinter_animation (const visual::animation& anim) { m_splinter_animations.push_back(anim); } // add_splinter_animation() /*---------------------------------------------------------------------------*/ /** * \brief Set Add a dust animation. * \param anim A new dust animation. */ void bear::explosion_effect_item::add_dust_animation (const visual::animation& anim) { m_dust_animations.push_back(anim); } // explosion_effect_item::add_dust_animation() /*---------------------------------------------------------------------------*/ /** * \brief Set the force of ejection. * \param force The ejected force. */ void bear::explosion_effect_item::set_force(double force) { m_force = force; } // explosion_effect_item::set_force() /*---------------------------------------------------------------------------*/ /** * \brief Set the splinter count. * \param splinter_count The number of splinter to create. */ void bear::explosion_effect_item::set_splinter_count ( unsigned int splinter_count) { m_splinter_count = splinter_count; } // explosion_effect_item::set_splinter_count() /*---------------------------------------------------------------------------*/ /** * \brief Set the dust animation. * \param dust_count The number of dust to create. */ void bear::explosion_effect_item::set_dust_count( unsigned int dust_count) { m_dust_count = dust_count; } // explosion_effect_item::set_dust_count() /*---------------------------------------------------------------------------*/ /** * \brief Create all dust items. */ void bear::explosion_effect_item::create_dust_items( ) { unsigned int dust_index(0); for ( unsigned int i = 0; i != m_dust_count; i++) { bear::universe::position_type pos; pos.x = get_left() + (get_width() * rand() / RAND_MAX); pos.y = get_bottom() + (get_height() * rand() / RAND_MAX); create_dust_item(dust_index, pos); dust_index = (dust_index + 1) % m_dust_animations.size(); } } // explosion_effect_item::create_dust_items() /*---------------------------------------------------------------------------*/ /** * \brief Create a dust item. * \param dust_index Index of animation in dust_animations list. * \param pos Position of item to create. */ void bear::explosion_effect_item::create_dust_item (unsigned int dust_index, bear::universe::position_type pos) { bear::decorative_item* item = new bear::decorative_item; item->set_animation(m_dust_animations[dust_index]); item->set_kill_when_finished(true); item->set_kill_when_leaving(true); item->set_z_position(get_z_position()-1); double angle = ( 6.283 * rand() ) / RAND_MAX; item->set_system_angle(angle); item->set_system_angle_as_visual_angle(true); new_item( *item ); item->set_center_of_mass(pos); CLAW_ASSERT ( item->is_valid(), "A decorative item created by exposion_effect_item isn't correctly " "initialized" ); } // explosion_effect_item::create_dust_item() /*---------------------------------------------------------------------------*/ /** * \brief Create all splinter items. */ void bear::explosion_effect_item::create_splinter_items( ) { unsigned int splinter_index(0); for ( unsigned int i = 0; i != m_splinter_count; i++) { bear::universe::position_type pos; pos.x = get_left() + (get_width() * rand() / RAND_MAX); pos.y = get_bottom() + (get_height() * rand() / RAND_MAX); create_splinter_item(splinter_index, pos); splinter_index = (splinter_index + 1) % m_splinter_animations.size(); } } // explosion_effect_item::create_splinter_items() /*---------------------------------------------------------------------------*/ /** * \brief Create a splinter item. * \param splinter_index Index of animation in splinter_animations list. * \param pos Position of item to create. */ void bear::explosion_effect_item::create_splinter_item (unsigned int splinter_index, bear::universe::position_type pos) { bear::decorative_item* item = new bear::decorative_item; item->set_animation(m_splinter_animations[splinter_index]); item->set_kill_when_leaving(true); item->set_kill_when_finished(false); item->set_mass(1); item->set_z_position(get_z_position()); item->set_density(0.002); universe::force_type force; double angle = ( 6.283 * rand() ) / RAND_MAX; double factor = (double)rand() / RAND_MAX / 2.0 + 0.5; force.x = cos(angle) * m_force * factor; force.y = sin(angle) * m_force * factor; item->set_external_force(force); item->set_system_angle(angle); item->set_system_angle_as_visual_angle(true); new_item( *item ); item->set_center_of_mass(pos); CLAW_ASSERT ( item->is_valid(), "A decorative item created by exposion_effect_item isn't correctly " "initialized" ); } // explosion_effect_item::create_splinter_item() plee-the-bear-20251226/bear-engine/lib/src/generic_items/code/falling_block.cpp000066400000000000000000000012041512343254000271170ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::falling_block class. * \author Julien Jorge */ #include "generic_items/falling_block.hpp" #include "engine/export.hpp" BASE_ITEM_EXPORT( falling_block, bear ) /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ bear::falling_block::falling_block() { // arbitrary value set_mass(0.1); } // falling_block::falling_block() plee-the-bear-20251226/bear-engine/lib/src/generic_items/code/force_rectangle_creator.cpp000066400000000000000000000031731512343254000312010ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::force_rectangle_creator class. * \author Sebastien Angibaud */ #include "generic_items/force_rectangle_creator.hpp" #include "engine/layer/layer.hpp" #include "engine/world.hpp" BASE_ITEM_EXPORT( force_rectangle_creator, bear ) /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ bear::force_rectangle_creator::force_rectangle_creator() : m_force(0, 0) { } // force_rectangle_creator::force_rectangle_creator() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type "real". * \param name The name of the field. * \param value The value of the field. */ bool bear::force_rectangle_creator::set_real_field ( const std::string& name, double value ) { bool result = true; if ( name == "force_rectangle_creator.force.x" ) m_force.x = value; else if ( name == "force_rectangle_creator.force.y" ) m_force.y = value; else result = super::set_real_field(name, value); return result; } // force_rectangle_creator::set_real_field() /*----------------------------------------------------------------------------*/ /** * \brief Initialize the item. */ void bear::force_rectangle_creator::build() { if ( get_layer().has_world() ) get_layer().get_world().add_force_rectangle(get_bounding_box(), m_force); kill(); } // force_rectangle_creator::build() plee-the-bear-20251226/bear-engine/lib/src/generic_items/code/friction_rectangle_creator.cpp000066400000000000000000000031651512343254000317210ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::friction_rectangle_creator class. * \author Julien Jorge */ #include "generic_items/friction_rectangle_creator.hpp" #include "engine/layer/layer.hpp" #include "engine/world.hpp" BASE_ITEM_EXPORT( friction_rectangle_creator, bear ) /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ bear::friction_rectangle_creator::friction_rectangle_creator() : m_friction(1) { set_can_move_items(false); } // friction_rectangle_creator::friction_rectangle_creator() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type "real". * \param name The name of the field. * \param value The value of the field. */ bool bear::friction_rectangle_creator::set_real_field ( const std::string& name, double value ) { bool result = true; if ( name == "friction_rectangle_creator.friction" ) m_friction = value; else result = super::set_real_field(name, value); return result; } // friction_rectangle_creator::set_real_field() /*----------------------------------------------------------------------------*/ /** * \brief Initialize the item. */ void bear::friction_rectangle_creator::build() { if ( get_layer().has_world() ) get_layer().get_world().add_friction_rectangle (get_bounding_box(), m_friction); kill(); } // friction_rectangle_creator::build() plee-the-bear-20251226/bear-engine/lib/src/generic_items/code/game_quit.cpp000066400000000000000000000017401512343254000263110ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::game_quit class. * \author Sebastien Angibaud */ #include "generic_items/game_quit.hpp" #include "engine/game.hpp" #include "engine/export.hpp" BASE_ITEM_EXPORT( game_quit, bear ) /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ bear::game_quit::game_quit() { set_phantom(true); set_can_move_items(false); set_artificial(true); } // game_quit::game_quit() /*----------------------------------------------------------------------------*/ /** * \brief Activate the toggle. * \param activator The item that activates the toggle. */ void bear::game_quit::toggle_on( base_item* activator ) { bear::engine::game::get_instance().end(); } // game_quit::toggle_on() plee-the-bear-20251226/bear-engine/lib/src/generic_items/code/hidden_block.cpp000066400000000000000000000101551512343254000267430ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::hidden_block class. * \author Sebastien Angibaud */ #include "generic_items/hidden_block.hpp" #include "generic_items/decorative_effect.hpp" #include "universe/collision_info.hpp" #include "engine/export.hpp" BASE_ITEM_EXPORT( hidden_block, bear ) /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ bear::hidden_block::hidden_block() : m_active_state(true), m_new_collision(false), m_transition_duration(0.25), m_last_modification(0), m_passive_opacity(0), m_active_opacity(1) { } // hidden_block::hidden_block() /*----------------------------------------------------------------------------*/ /** * \brief Do one step in the progression of the item. * \param elapsed_time Elasped time since the last progress. */ void bear::hidden_block::progress( universe::time_type elapsed_time ) { super::progress( elapsed_time ); if ( !m_new_collision && m_active_state ) { m_last_modification = 0; m_active_state = false; } else m_last_modification += elapsed_time; if ( m_last_modification <= m_transition_duration ) { if ( m_active_state ) select_active_opacity(); else select_passive_opacity(); } m_new_collision = false; } // bear::hidden_block::progress() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type \c real. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::hidden_block::set_real_field( const std::string& name, double value ) { bool result(true); if ( name == "hidden_block.transition_duration" ) m_transition_duration = value; else if ( name == "hidden_block.opacity.passive" ) m_passive_opacity = value; else if ( name == "hidden_block.opacity.active" ) m_active_opacity = value; else result = super::set_real_field(name, value); return result; } // hidden_block::set_real_field() /*----------------------------------------------------------------------------*/ /** * \brief Call collision_check_and_align(). * \param that The other item of the collision. * \param info Some informations about the collision. */ void bear::hidden_block::collision ( engine::base_item& that, universe::collision_info& info ) { if ( collision_check_and_align(that, info) ) { if ( !m_active_state ) m_last_modification = 0; m_new_collision = true; m_active_state = true; } } // hidden_block::collision() /*----------------------------------------------------------------------------*/ /** * \brief Select active opacity. */ void bear::hidden_block::select_active_opacity() { double opacity = m_passive_opacity + (m_active_opacity - m_passive_opacity) * m_last_modification / m_transition_duration; if ( opacity <= 0 ) opacity = 0; else if ( opacity >= 1 ) opacity = 1; get_rendering_attributes().set_opacity(opacity); } // hidden_block::select_active_opacity() /*----------------------------------------------------------------------------*/ /** * \brief Select passive opacity. */ void bear::hidden_block::select_passive_opacity() { double opacity = m_active_opacity + (m_passive_opacity-m_active_opacity) * m_last_modification / m_transition_duration; if ( opacity <= 0 ) opacity = 0; else if ( opacity >= 1 ) opacity = 1; get_rendering_attributes().set_opacity(opacity); } // hidden_block::select_passive_opacity() /*----------------------------------------------------------------------------*/ /** * \brief Give a string representation of the item. * \param str (out) The result of the convertion. */ void bear::hidden_block::to_string( std::string& str ) const { super::to_string(str); if ( m_active_state ) str += "\nactive" ; else str += "\npassive" ; } // hidden_block::to_string() plee-the-bear-20251226/bear-engine/lib/src/generic_items/code/item_creator.cpp000066400000000000000000000053241512343254000270150ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::item_creator class. * \author Sébastien Angibaud */ #include "generic_items/item_creator.hpp" #include "universe/forced_movement/forced_sequence.hpp" #include "universe/forced_movement/forced_goto.hpp" #include "universe/forced_movement/forced_join.hpp" BASE_ITEM_EXPORT( item_creator, bear ) /*----------------------------------------------------------------------------*/ /** * \brief Destructor. */ bear::item_creator::~item_creator() { for ( unsigned int index = 0; index != m_items.size(); ++index ) delete m_items[index]; } // item_creator::item_creator() /*----------------------------------------------------------------------------*/ /** * \brief Initialise the item. */ void bear::item_creator::build() { super::build(); for ( unsigned int index = 0; index != m_items.size(); ++index ) { base_item* item = m_items[index]; m_items[index] = item->clone(); item->kill(); } } // item_creator::build() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type \c list of item. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::item_creator::set_item_list_field ( const std::string& name, const std::vector& value ) { bool result(true); if ( name == "item_creator.items" ) { m_items.clear(); for ( unsigned int index = 0; index != value.size(); ++index ) m_items.push_back(value[index]); } else result = super::set_item_list_field(name, value); return result; } // item_creator::set_item_list_field() /*----------------------------------------------------------------------------*/ /** * \brief Tell if all fields have a correct value. */ bool bear::item_creator::is_valid() const { for ( std::size_t i=0; i!=m_items.size(); ++i ) if ( m_items[i]->get_insert_as_static() ) return false; return !m_items.empty() && super::is_valid(); } // item_creator::is_valid() /*----------------------------------------------------------------------------*/ /** * \brief This method is called when the toggles switches on. * \param activator The item that activates the toggle, if any. */ void bear::item_creator::on_toggle_on( base_item* activator ) { super::on_toggle_on( activator ); for ( unsigned int index = 0; index != m_items.size(); ++index ) new_item( *(m_items[index]->clone()) ); } // item_creator::on_toggle_on() plee-the-bear-20251226/bear-engine/lib/src/generic_items/code/killer.cpp000066400000000000000000000043421512343254000256210ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::killer class. * \author Julien Jorge */ #include "generic_items/killer.hpp" #include "engine/export.hpp" BASE_ITEM_EXPORT( killer, bear ) /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ bear::killer::killer() : m_kill_activator(false) { set_phantom(true); set_can_move_items(false); set_artificial(true); } // killer::killer() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type list of \c base_item. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::killer::set_item_list_field ( const std::string& name, const std::vector& value ) { bool result = false; if ( name == "killer.items" ) { m_items.resize(value.size()); for ( std::size_t i=0; i!=value.size(); ++i ) m_items[i] = value[i]; result = true; } else result = super::set_item_list_field( name, value ); return result; } // killer::set_item_list_field() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type \c bool. * \param value The value of the field. */ bool bear::killer::set_bool_field( const std::string& name, bool value ) { bool result = true; if ( name == "killer.kill_activator" ) m_kill_activator = value; else result = super::set_bool_field(name, value); return result; } // killer::set_bool_field() /*----------------------------------------------------------------------------*/ /** * \brief Activate the toggle. * \param activator The item that activates the toggle. */ void bear::killer::toggle_on( base_item* activator ) { for ( ; !m_items.empty(); m_items.pop_back() ) if (m_items.back() != (base_item*)NULL) m_items.back()->kill(); if ( m_kill_activator && (activator != NULL) ) activator->kill(); } // killer::toggle_on() plee-the-bear-20251226/bear-engine/lib/src/generic_items/code/level_loader_item.cpp000066400000000000000000000161051512343254000300120ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::level_loader_item class. * \author Julien Jorge */ #include "generic_items/level_loader_item.hpp" #include "engine/compiled_file.hpp" #include "engine/game.hpp" #include "engine/level.hpp" #include "engine/resource_pool.hpp" #include "engine/variable/variable.hpp" #include "engine/export.hpp" #include BASE_ITEM_EXPORT( level_loader_item, bear ) /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ bear::level_loader_item::level_loader_item() : m_level_loader(NULL), m_level_file(NULL), m_level_stream(NULL), m_level(NULL), m_ratio(0.5) { } // level_loader_item::level_loader_item() /*----------------------------------------------------------------------------*/ /** * \brief Copy constructor. * \param that The instance to copy from. */ bear::level_loader_item::level_loader_item( const level_loader_item& that ) : super(that), m_level_loader(NULL), m_level_file(NULL), m_level_stream(NULL), m_level(NULL), m_ratio(that.m_ratio) { } // level_loader_item::level_loader_item() /*----------------------------------------------------------------------------*/ /** * \brief Destructor. */ bear::level_loader_item::~level_loader_item() { delete m_level_loader; delete m_level_file; delete m_level_stream; delete m_level; } // level_loader_item::~level_loader_item() /*----------------------------------------------------------------------------*/ /** * \brief Initialise the item. */ void bear::level_loader_item::build() { m_level_stream = new std::stringstream(); engine::resource_pool::get_instance().get_file (m_level_path, *m_level_stream); m_level_file = new engine::compiled_file( *m_level_stream, true ); m_level_loader = new engine::level_loader ( *m_level_file, m_level_path, NULL, &get_level_globals() ); m_items_count = m_level_loader->get_items_count(); } // level_loader_item::build() /*----------------------------------------------------------------------------*/ /** * \brief Do one step in the progression of the item. * \param elapsed_time The elapsed time since the last call. */ void bear::level_loader_item::progress( bear::universe::time_type elapsed_time ) { super::progress(elapsed_time); progress_preload(elapsed_time); } // level_loader_item::progress() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type string. * \param name The name of the field. * \param value The value of the field. */ bool bear::level_loader_item::set_string_field ( const std::string& name, const std::string& value ) { bool result = true; if ( name == "level_loader_item.level" ) { m_level_path = value; engine::variable var(value); if ( engine::game::get_instance().game_variable_exists(var) ) { engine::game::get_instance().get_game_variable(var); if ( !var.get_value().empty() ) m_level_path = var.get_value(); } } else result = super::set_string_field( name, value ); return result; } // level_loader_item::set_string_field() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type "real". * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::level_loader_item::set_real_field( const std::string& name, double value ) { bool result(true); if ( name == "level_loader_item.ratio" ) m_ratio = value; else result = super::set_real_field( name, value ); return result; } // level_loader_item::set_real_field() /*----------------------------------------------------------------------------*/ /** * \brief Tell if the item is well initialised. */ bool bear::level_loader_item::is_valid() const { return engine::resource_pool::get_instance().exists(m_level_path) && super::is_valid(); } // level_loader_item::is_valid() /*----------------------------------------------------------------------------*/ /** * \brief Get the index of the currently loaded item. */ unsigned int bear::level_loader_item::get_item_index() const { return m_item_index; } // level_loader_item::get_item_index() /*----------------------------------------------------------------------------*/ /** * \brief Get the total number of items to load. */ unsigned int bear::level_loader_item::get_items_count() const { return m_items_count; } // level_loader_item::get_items_count() /*----------------------------------------------------------------------------*/ /** * \brief Tell if the level has been completely loaded. */ bool bear::level_loader_item::level_is_loaded() const { return m_level != NULL; } // level_loader_item::level_is_loaded() /*----------------------------------------------------------------------------*/ /** * \brief Start the level, if it is loaded, even if the delay is not elapsed. */ void bear::level_loader_item::start_level() { if ( m_level != NULL ) { engine::game::get_instance().set_waiting_level( m_level ); m_level = NULL; } } // level_loader_item::start_level() /*----------------------------------------------------------------------------*/ /** * \brief Continue to preload the level. * \param elapsed_time The elapsed time since the last call. */ void bear::level_loader_item::progress_preload ( bear::universe::time_type elapsed_time ) { if ( m_level_loader != NULL ) progress_loading(); else start_level(); } // level_loader_item::progress_preload() /*----------------------------------------------------------------------------*/ /** * \brief Do one step in the progression of the level loading. */ void bear::level_loader_item::progress_loading() { CLAW_PRECOND( m_level_loader != NULL ); CLAW_PRECOND( m_level_file != NULL ); CLAW_PRECOND( m_level_stream != NULL ); CLAW_PRECOND( m_level == NULL ); bool stop = false; systime::milliseconds_type start_time, current_time; start_time = systime::get_date_ms(); const systime::milliseconds_type max_t = engine::game::get_instance().get_time_step() * m_ratio; do { stop = m_level_loader->one_step(); current_time = systime::get_date_ms(); } while ( !stop && (current_time - start_time < max_t) ); m_item_index = m_level_loader->get_item_index(); if (stop) clear_loading_data(); } // level_loader_item::progress_loading() /*----------------------------------------------------------------------------*/ /** * \brief Save the loaded level and delete the data used to load it. */ void bear::level_loader_item::clear_loading_data() { CLAW_PRECOND( m_level == NULL ); m_level = m_level_loader->drop_level(); delete m_level_loader; m_level_loader = NULL; delete m_level_file; m_level_file = NULL; delete m_level_stream; m_level_stream = NULL; } // level_loader_item::clear_loading_data() plee-the-bear-20251226/bear-engine/lib/src/generic_items/code/level_loader_progression_item.cpp000066400000000000000000000043371512343254000324500ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::level_loader_progression_item class. * \author Julien Jorge */ #include "generic_items/level_loader_progression_item.hpp" #include "engine/export.hpp" BASE_ITEM_EXPORT( level_loader_progression_item, bear ) /*----------------------------------------------------------------------------*/ /** * \brief Adjust the components of the layer. * \param elapsed_time Elapsed time since the last call. */ void bear::level_loader_progression_item::progress ( universe::time_type elapsed_time ) { super::progress(elapsed_time); const unsigned int item_index = get_item_index(); const unsigned int items_count = get_items_count(); m_item_bar.set_width( item_index * (unsigned int)get_width() / items_count ); } // level_loader_progression_item::progress() /*----------------------------------------------------------------------------*/ /** * \brief Get the sprite representing the item. * \param visuals (out) The sprites of the item, and their positions. */ void bear::level_loader_progression_item::get_visual ( std::list& visuals ) const { add_visual( m_item_bar, visuals ); } // level_loader_progression_item::get_visual() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type sprite. * \param name The name of the field. * \param value The value of the field. */ bool bear::level_loader_progression_item::set_sprite_field ( const std::string& name, const visual::sprite& value ) { bool result = true; if ( name == "level_loader_progression_item.sprite" ) m_item_bar = value; else result = super::set_sprite_field( name, value ); return result; } // level_loader_progression_item::set_sprite_field() /*----------------------------------------------------------------------------*/ /** * \brief Tell if the item is well initialised. */ bool bear::level_loader_progression_item::is_valid() { return m_item_bar.is_valid() && super::is_valid(); } // level_loader_progression_item::is_valid() plee-the-bear-20251226/bear-engine/lib/src/generic_items/code/level_loader_toggle.cpp000066400000000000000000000103121512343254000303270ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::level_loader_toggle class. * \author Julien Jorge */ #include "generic_items/level_loader_toggle.hpp" #include "generic_items/delayed_level_loading.hpp" #include "engine/game.hpp" #include "engine/resource_pool.hpp" #include "engine/variable/variable.hpp" BASE_ITEM_EXPORT( level_loader_toggle, bear ) /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ bear::level_loader_toggle::level_loader_toggle() : m_fade_duration(1), m_push_mode(false) { } // level_loader_toggle::level_loader_toggle() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type string. * \param name The name of the field. * \param value The value of the field. */ bool bear::level_loader_toggle::set_string_field ( const std::string& name, const std::string& value ) { bool result = true; if ( name == "level_loader_toggle.level" ) m_level_path = get_string_from_vars(value); else if ( name == "level_loader_toggle.transition_layer_name" ) m_transition_layer_name = get_string_from_vars(value); else result = super::set_string_field( name, value ); return result; } // level_loader_toggle::set_string_field() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type "real". * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::level_loader_toggle::set_real_field ( const std::string& name, double value ) { bool result(true); if ( name == "level_loader_toggle.fade_duration" ) m_fade_duration = value; else result = super::set_real_field( name, value ); return result; } // level_loader_toggle::set_real_field() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type \c bool. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::level_loader_toggle::set_bool_field ( const std::string& name, bool value ) { bool result(true); if ( name == "level_loader_toggle.push_mode" ) m_push_mode = value; else result = super::set_bool_field( name, value ); return result; } // level_loader_toggle::set_bool_field() /*----------------------------------------------------------------------------*/ /** * \brief Tell if the item is well initialised. */ bool bear::level_loader_toggle::is_valid() const { return engine::resource_pool::get_instance().exists(m_level_path) && super::is_valid(); } // level_loader_toggle::is_valid() /*----------------------------------------------------------------------------*/ /** * \brief Play the sample. * \param activator (ignored) The item that activates the toggle, if any. */ void bear::level_loader_toggle::on_toggle_on( engine::base_item* activator ) { delayed_level_loading* loader = new delayed_level_loading (m_level_path, 0, false, m_fade_duration, m_transition_layer_name); loader->set_center_of_mass(get_center_of_mass()); loader->set_global(is_global()); loader->set_push_mode(m_push_mode); new_item( *loader ); } // level_loader_toggle::on_toggle_on() /*----------------------------------------------------------------------------*/ /** * \brief Get a string from the game variable. * \param name The name of the game variable. * \return \a name if there is such a variable. */ std::string bear::level_loader_toggle::get_string_from_vars ( const std::string& name ) const { // The parameter is the default result. std::string result(name); engine::variable var(name, name); if ( engine::game::get_instance().game_variable_exists(var) ) { engine::game::get_instance().get_game_variable(var); if ( !var.get_value().empty() ) result = var.get_value(); } return result; } // level_loader_toggle::get_string_from_vars() plee-the-bear-20251226/bear-engine/lib/src/generic_items/code/level_popper_toggle.cpp000066400000000000000000000104101512343254000303650ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::level_popper_toggle class. * \author Sebastien Angibaud */ #include "generic_items/level_popper_toggle.hpp" #include "generic_items/delayed_level_loading.hpp" #include "engine/game.hpp" #include "engine/level_globals.hpp" #include "engine/resource_pool.hpp" #include "engine/message/transition_effect_message.hpp" #include "engine/transition_effect/fade_effect.hpp" #include "engine/variable/variable.hpp" BASE_ITEM_EXPORT( level_popper_toggle, bear ) /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ bear::level_popper_toggle::level_popper_toggle() : m_fade_duration(1), m_applied(false), m_time(0), m_start_fade_out(false) { } // level_popper_toggle::level_popper_toggle() /*----------------------------------------------------------------------------*/ /** * \brief Do one iteration in the progression of the item. */ void bear::level_popper_toggle::progress ( bear::universe::time_type elapsed_time ) { if ( m_start_fade_out ) m_time += elapsed_time; if ( ! m_applied && m_time >= m_fade_duration ) { m_applied = true; bear::engine::game::get_instance().pop_level(); } } // level_popper_toggle::progress() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type string. * \param name The name of the field. * \param value The value of the field. */ bool bear::level_popper_toggle::set_string_field ( const std::string& name, const std::string& value ) { bool result = true; if ( name == "level_popper_toggle.transition_layer_name" ) m_transition_layer_name = get_string_from_vars(value); else result = super::set_string_field( name, value ); return result; } // level_popper_toggle::set_string_field() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type "real". * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::level_popper_toggle::set_real_field ( const std::string& name, double value ) { bool result(true); if ( name == "level_popper_toggle.fade_duration" ) m_fade_duration = value; else result = super::set_real_field( name, value ); return result; } // level_popper_toggle::set_real_field() /*----------------------------------------------------------------------------*/ /** * \brief Play the sample. * \param activator (ignored) The item that activates the toggle, if any. */ void bear::level_popper_toggle::on_toggle_on( engine::base_item* activator ) { if ( ! m_start_fade_out ) { m_start_fade_out = true; start_fading(); } } // level_popper_toggle::on_toggle_on() /*----------------------------------------------------------------------------*/ /** * \brief Start fading before loading the level. */ void bear::level_popper_toggle::start_fading() { get_level().stop_music( m_fade_duration ); if ( (m_fade_duration > 0) && !m_transition_layer_name.empty() ) { engine::transition_effect_message msg; msg.get_effect().set_duration(m_fade_duration, 1, 0); msg.get_effect().set_color( 0, 0, 0 ); get_level_globals().send_message( m_transition_layer_name, msg ); } } // level_popper_toggle::start_fading() /*----------------------------------------------------------------------------*/ /** * \brief Get a string from the game variable. * \param name The name of the game variable. * \return \a name if there is such a variable. */ std::string bear::level_popper_toggle::get_string_from_vars ( const std::string& name ) const { // The parameter is the default result. std::string result(name); engine::variable var(name, name); if ( engine::game::get_instance().game_variable_exists(var) ) { engine::game::get_instance().get_game_variable(var); if ( !var.get_value().empty() ) result = var.get_value(); } return result; } // level_popper_toggle::get_string_from_vars() plee-the-bear-20251226/bear-engine/lib/src/generic_items/code/level_settings.cpp000066400000000000000000000044501512343254000273660ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::level_settings class. * \author Julien Jorge */ #include "generic_items/level_settings.hpp" #include "engine/level_globals.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param settings The instance through which we set the parameters. */ bear::level_settings::loader::loader( engine::level_globals& settings ) : super("level_settings"), m_settings(settings) { } // level_settings::loader::loader() /*----------------------------------------------------------------------------*/ /** * \brief Creates a copy of this instance. */ bear::level_settings::loader* bear::level_settings::loader::clone() const { return new loader( *this ); } // level_settings::loader::clone() /*----------------------------------------------------------------------------*/ /** * \brief Sets a field of type \c real. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::level_settings::loader::set_field ( const std::string& name, double value ) { bool result = true; if ( name == "full_volume_distance" ) m_settings.set_full_volume_distance( value ); else if ( name == "silence_distance" ) m_settings.set_silence_distance( value ); else result = super::set_field(name, value); return result; } // level_settings::loader::set_field() BASE_ITEM_EXPORT( level_settings, bear ) /*----------------------------------------------------------------------------*/ /** * \brief Initializes the item. */ void bear::level_settings::build() { kill(); } // level_settings::build() /*----------------------------------------------------------------------------*/ /** * \brief Adds the loaders of this item class into a given loader map. * \param m The map in which the loaders are inserted. */ void bear::level_settings::populate_loader_map( engine::item_loader_map& m ) { super::populate_loader_map(m); m.insert( loader( get_level_globals() ) ); } // level_settings::populate_loader_map() plee-the-bear-20251226/bear-engine/lib/src/generic_items/code/line.cpp000066400000000000000000000115731512343254000252720ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::line class. * \author Julien Jorge */ #include "generic_items/line.hpp" #include "visual/scene_line.hpp" #include BASE_ITEM_EXPORT(line, bear) /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ bear::line::line() : m_width(1) { set_phantom(true); set_can_move_items(false); set_artificial(true); } // line::line() /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param that The instance of the parent class from which we initialise. */ bear::line::line( const super& that ) : super(that), m_width(1) { set_phantom(true); set_can_move_items(false); set_artificial(true); } // line::line() /*----------------------------------------------------------------------------*/ /** * \brief Initialise the item. */ void bear::line::build() { super::build(); adjust_position_and_size(); } // line::build() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type real. * \param name The name of the field to set. * \param value The value of the field. */ bool bear::line::set_real_field( const std::string& name, double value ) { bool result(true); if ( name == "line.width" ) m_width = value; else result = super::set_real_field(name, value); return result; } // line::set_real_field() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type "list of items". * \param name The name of the field to set. * \param value The value of the field. */ bool bear::line::set_item_list_field ( const std::string& name, const std::vector& value ) { bool result(true); if ( name == "line.ends" ) m_points = point_list_type(value.begin(), value.end()); else result = super::set_item_list_field(name, value); return result; } // line::set_item_list_field() /*----------------------------------------------------------------------------*/ /** * \brief Do one step in the progression of the item. * \param elapsed_time Elapsed time since the last call. */ void bear::line::progress( universe::time_type elapsed_time ) { super::progress(elapsed_time); adjust_position_and_size(); } // line::progress() /*----------------------------------------------------------------------------*/ /** * \brief Get the visual of the item. * \param visual (out) The visual representation of the item. */ void bear::line::get_visual( std::list& visuals ) const { super::get_visual(visuals); if ( m_points.size() <= 1 ) return; std::vector p; p.reserve(m_points.size()); for ( point_list_type::const_iterator it=m_points.begin(); it!=m_points.end(); ++it) p.push_back( (*it)->get_center_of_mass() ); engine::scene_visual v ( get_scene_visual ( visual::scene_line ( 0, 0, claw::graphic::white_pixel, p, m_width) ) ); v.scene_element.set_position( get_gap() ); visuals.push_front(v); } // line::get_visual() /*----------------------------------------------------------------------------*/ /** * \brief Add a new reference point at the end of the line. * \param item The item to use as the new reference point. */ void bear::line::push_back( engine::base_item* item ) { m_points.push_back(item); } // line::push_back() /*----------------------------------------------------------------------------*/ /** * \brief Set the width of the line. * \param w The new width of the line. */ void bear::line::set_line_width( visual::size_type w ) { m_width = w; } // line::set_line_width() /*----------------------------------------------------------------------------*/ /** * \brief Adjust the position and the size of the item to fit the points. */ void bear::line::adjust_position_and_size() { universe::coordinate_type left = std::numeric_limits::max(); universe::coordinate_type right = std::numeric_limits::min(); universe::coordinate_type bottom = left; universe::coordinate_type top = right; for ( point_list_type::iterator it=m_points.begin(); it!=m_points.end(); ) if ( *it == NULL ) it = m_points.erase(it); else { left = std::min(left, (*it)->get_left()); bottom = std::min(bottom, (*it)->get_bottom()); right = std::max(right, (*it)->get_right()); top = std::max(top, (*it)->get_top()); ++it; } if ( !m_points.empty() ) { set_bottom(bottom); set_left(left); set_size(right - left, top - bottom); } } // line::adjust_position_and_size() plee-the-bear-20251226/bear-engine/lib/src/generic_items/code/linear_movement_sequence_loop.cpp000066400000000000000000000127731512343254000324530ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::linear_movement_sequence_loop class. * \author Sébastien Angibaud */ #include "generic_items/linear_movement_sequence_loop.hpp" #include "universe/forced_movement/forced_sequence.hpp" #include "universe/forced_movement/forced_goto.hpp" #include "universe/forced_movement/forced_join.hpp" BASE_ITEM_EXPORT( linear_movement_sequence_loop, bear ) /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ bear::linear_movement_sequence_loop::linear_movement_sequence_loop() : m_item(NULL), m_duration(1), m_x_length(0) , m_y_length(0), m_auto_angle(false) { } // linear_movement_sequence_loop::linear_movement_sequence_loop() /*----------------------------------------------------------------------------*/ /** * \brief Initialise the item. */ void bear::linear_movement_sequence_loop::build() { super::build(); create_items(); m_item->kill(); } // linear_movement_sequence_loop::build() /*----------------------------------------------------------------------------*/ /** * \brief Set the value of a field of type double. * \param name The name of the field. * \param value The value of the field. */ bool bear::linear_movement_sequence_loop::set_real_field ( const std::string& name, const double value) { bool result(true); if ( name == "linear_movement_sequence_loop.duration" ) m_duration = value; else if ( name == "linear_movement_sequence_loop.length.x" ) m_x_length = value; else if ( name == "linear_movement_sequence_loop.length.y" ) m_y_length = value; else result = super::set_real_field(name, value); return result; } // linear_movement_sequence_loop::set_real_field() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type \c list of real. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::linear_movement_sequence_loop::set_real_list_field ( const std::string& name, const std::vector& value ) { bool ok = true; if (name == "linear_movement_sequence_loop.positions") m_positions = value; else ok = super::set_real_list_field(name, value); return ok; } // linear_movement_sequence_loop::set_real_list_field() /*----------------------------------------------------------------------------*/ /** * \brief Set the value of a field of type item. * \param name The name of the field. * \param value The value of the field. */ bool bear::linear_movement_sequence_loop::set_item_field ( const std::string& name, bear::engine::base_item* value) { bool result(true); if ( name == "linear_movement_sequence_loop.item" ) m_item = value; else result = super::set_item_field(name, value); return result; } // linear_movement_sequence_loop::set_item_field() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type "bool". * \param name The name of the field. * \param value The value of the field. */ bool bear::linear_movement_sequence_loop::set_bool_field ( const std::string& name, bool value ) { bool result = true; if ( name == "linear_movement_sequence_loop.auto_angle" ) m_auto_angle = value; else result = super::set_bool_field(name, value); return result; } // linear_movement_sequence_loop::set_bool_field() /*----------------------------------------------------------------------------*/ /** * \brief Tell if all fields have a correct value. */ bool bear::linear_movement_sequence_loop::is_valid() const { return ( !m_positions.empty() ) && ( m_item != NULL ) && super::is_valid(); } // linear_movement_sequence_loop::is_valid() /*----------------------------------------------------------------------------*/ /** * \brief Create items. */ void bear::linear_movement_sequence_loop::create_items() { for ( unsigned int i = 0; i != m_positions.size(); ++i ) { base_item* item; item = m_item->clone(); item->set_horizontal_middle ( get_horizontal_middle() + m_positions[i]*m_x_length/m_duration); item->set_vertical_middle ( get_vertical_middle() + m_positions[i]*m_y_length/m_duration); new_item( *item ); bear::universe::forced_sequence movement; bear::universe::forced_goto mvt_1; mvt_1.set_total_time(m_duration-m_positions[i]); mvt_1.set_acceleration_time(0); mvt_1.set_x_length((m_duration-m_positions[i])*m_x_length/m_duration); mvt_1.set_y_length((m_duration-m_positions[i])*m_y_length/m_duration); mvt_1.set_auto_angle(m_auto_angle); bear::universe::forced_join mvt_2; mvt_2.set_total_time(0); mvt_2.set_reference_point_on_center(*this); mvt_2.set_auto_angle(m_auto_angle); bear::universe::forced_goto mvt_3; mvt_3.set_total_time(m_positions[i]); mvt_3.set_acceleration_time(0); mvt_3.set_x_length(m_positions[i]*m_x_length/m_duration); mvt_3.set_y_length(m_positions[i]*m_y_length/m_duration); mvt_3.set_auto_angle(m_auto_angle); movement.push_back(mvt_1); movement.push_back(mvt_2); movement.push_back(mvt_3); movement.set_item(*item); item->set_forced_movement( movement ); } } // linear_movement_sequence_loop::create_items() plee-the-bear-20251226/bear-engine/lib/src/generic_items/code/lines.cpp000066400000000000000000000046161512343254000254550ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::lines class. * \author Julien Jorge */ #include "generic_items/lines.hpp" #include "generic_items/line.hpp" BASE_ITEM_EXPORT(lines, bear) /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ bear::lines::lines() : m_width(1) { set_phantom(true); set_can_move_items(false); set_artificial(true); } // lines::lines() /*----------------------------------------------------------------------------*/ /** * \brief Initialise the item. */ void bear::lines::build() { super::build(); if ( !m_points.empty() ) { point_list_type::const_iterator it=m_points.begin(); point_list_type::const_iterator it_next(it); for ( ++it_next; it_next!=m_points.end(); ++it, ++it_next ) { line* new_line = new line(*this); new_line->push_back(*it); new_line->push_back(*it_next); new_line->set_line_width(m_width); if ( (*it)->get_insert_as_static() && (*it_next)->get_insert_as_static() ) new_line->set_insert_as_static(); new_item(*new_line); } } kill(); } // lines::build() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type real. * \param name The name of the field to set. * \param value The value of the field. */ bool bear::lines::set_real_field( const std::string& name, double value ) { bool result(true); if ( name == "lines.width" ) m_width = value; else result = super::set_real_field(name, value); return result; } // lines::set_real_field() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type "list of items". * \param name The name of the field to set. * \param value The value of the field. */ bool bear::lines::set_item_list_field ( const std::string& name, const std::vector& value ) { bool result(true); if ( name == "lines.ends" ) m_points = point_list_type(value.begin(), value.end()); else result = super::set_item_list_field(name, value); return result; } // lines::set_item_list_field() plee-the-bear-20251226/bear-engine/lib/src/generic_items/code/mouse_detector.cpp000066400000000000000000000130361512343254000273600ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::mouse_detector class. * \author Sebastie Angibaud */ #include "generic_items/mouse_detector.hpp" #include "engine/export.hpp" #include "engine/game.hpp" #include "engine/level.hpp" BASE_ITEM_EXPORT( mouse_detector, bear ) /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ bear::mouse_detector::mouse_detector() : m_toggle(NULL), m_right_button(false), m_left_button(true), m_middle_button(false), m_wheel_up(false), m_wheel_down(false), m_finger(true) { set_artificial(true); set_phantom(true); } // mouse_detector::mouse_detector() /*---------------------------------------------------------------------------*/ /** * \brief Do one iteration in the progression of the item. */ void bear::mouse_detector::progress( universe::time_type elapsed_time ) { super::progress(elapsed_time); progress_input_reader(elapsed_time); } // mouse_detector::progress() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type \c bool. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::mouse_detector::set_bool_field ( const std::string& name, bool value ) { bool result = true; if (name == "mouse_detector.right_button") m_right_button = value; else if (name == "mouse_detector.left_button") m_left_button = value; else if (name == "mouse_detector.middle_button") m_middle_button = value; else if (name == "mouse_detector.wheel_up") m_wheel_up = value; else if (name == "mouse_detector.wheel_down") m_wheel_down = value; else if (name == "mouse_detector.finger") m_finger = value; else result = super::set_bool_field(name, value); return result; } // mouse_detector::set_bool_field() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type \c item. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::mouse_detector::set_item_field ( const std::string& name, bear::engine::base_item* value) { bool ok = true; if (name == "mouse_detector.toggle") m_toggle = handle_type(value); else ok = super::set_item_field(name, value); return ok; } // mouse_detector::set_item_field() /*----------------------------------------------------------------------------*/ /** * \brief Tell the player to stop the action associated with a mouse button. * \param button The code of the button. * \param pos The position of the cursor on the screen. */ bool bear::mouse_detector::mouse_released ( bear::input::mouse::mouse_code button, const claw::math::coordinate_2d& pos ) { bool result = false; if ( check_mouse_position( button, pos ) ) { result = true; trigger_toggle(); } else result = false; return result; } // mouse_detector::mouse_released /*----------------------------------------------------------------------------*/ /** * \brief Tell the player to stop the action associated with a mouse button. * \param button The code of the button. * \param pos The position of the cursor on the screen. */ bool bear::mouse_detector::check_mouse_position ( bear::input::mouse::mouse_code button, const claw::math::coordinate_2d& pos ) { return ( get_bounding_box().includes( get_level().screen_to_level(pos) ) && ( ( button == bear::input::mouse::mc_right_button && m_right_button ) || ( button == bear::input::mouse::mc_left_button && m_left_button ) || ( button == bear::input::mouse::mc_wheel_down && m_wheel_down ) || ( button == bear::input::mouse::mc_wheel_up && m_wheel_up ) || ( button == bear::input::mouse::mc_middle_button && m_middle_button))); } // mouse_detector::check_mouse_position() /*----------------------------------------------------------------------------*/ /** * \brief Process an event related to the finger. If the finger is down within * the bounds of the item, the toggle is activated. * \param event The event to process. */ bool bear::mouse_detector::finger_action( const input::finger_event& event ) { bool result = false; if ( m_finger && get_bounding_box().includes ( get_level().screen_to_level( event.get_position() ) ) ) { result = true; if ( event.get_type() == input::finger_event::finger_event_pressed ) trigger_toggle(); } return result; } // mouse_detector::finger_action() /*----------------------------------------------------------------------------*/ /** * \brief Get the items concerned by a progress/move of this one. * \param d (out) A list to which are added such items. */ void bear::mouse_detector::get_dependent_items ( universe::physical_item::item_list& d ) const { super::get_dependent_items(d); if ( m_toggle != (physical_item*)NULL ) d.push_back(m_toggle.get_item()); } // mouse_detector::get_dependent_items() /*----------------------------------------------------------------------------*/ /** * \brief Toggles the state of m_toggle. */ void bear::mouse_detector::trigger_toggle() { if ( m_toggle != handle_type(NULL) ) m_toggle->toggle(this); } // mouse_detector::trigger_toggle() plee-the-bear-20251226/bear-engine/lib/src/generic_items/code/mouse_over_manager.cpp000066400000000000000000000162541512343254000302210ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::mouse_over_manager class. * \author Sebastie Angibaud */ #include "generic_items/mouse_over_manager.hpp" #include "engine/item_brick/with_rendering_attributes.hpp" #include "visual/scene_sprite.hpp" #include "engine/export.hpp" BASE_ITEM_EXPORT( mouse_over_manager, bear ) /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ bear::mouse_over_manager::mouse_over_manager() : m_sample(NULL) { set_global(true); set_artificial(true); set_phantom(true); } // mouse_over_manager::mouse_over_manager() /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ bear::mouse_over_manager::~mouse_over_manager() { delete m_sample; } // mouse_over_manager::mouse_over_manager() /*---------------------------------------------------------------------------*/ /** * \brief Do one iteration in the progression of the item. */ void bear::mouse_over_manager::progress( universe::time_type elapsed_time ) { super::progress(elapsed_time); progress_input_reader(elapsed_time); m_animation_on.next(elapsed_time); m_animation_off.next(elapsed_time); } // mouse_over_manager::progress() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type \c list of item. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::mouse_over_manager::set_item_list_field ( const std::string& name, const std::vector & value) { bool ok = true; if (name == "mouse_over_manager.items") for ( unsigned int i = 0; i != value.size(); ++i ) m_items.push_back( handle_pair_type(value[i],false) ); else ok = super::set_item_list_field(name, value); return ok; } // mouse_over_manager::set_item_list_field() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type \c visual::animation. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::mouse_over_manager::set_animation_field ( const std::string& name, const bear::visual::animation& value ) { bool result(true); if ( name == "mouse_over_manager.animation_on" ) m_animation_on = value; else if ( name == "mouse_over_manager.animation_off" ) m_animation_off = value; else result = super::set_animation_field(name,value); return result; } // mouse_over_manager::::set_animation_field() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type \c . * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::mouse_over_manager::set_sample_field ( const std::string& name, audio::sample* value ) { bool ok = true; if (name == "mouse_over_manager.sample") m_sample = value; else ok = super::set_sample_field(name, value); return ok; } // mouse_over_manager::set_sample_field() /*----------------------------------------------------------------------------*/ /** * \brief Get the sprite representing the item. * \param visuals (out) The sprites of the item, and their positions. */ void bear::mouse_over_manager::get_visual ( std::list& visuals ) const { super::get_visual(visuals); handle_list::const_iterator it; for ( it = m_items.begin(); it != m_items.end(); ++it ) if ( it->first != (base_item*)NULL ) { double opacity(1); engine::with_rendering_attributes* b = dynamic_cast(it->first.get()); if ( b ) opacity = b->get_rendering_attributes().get_opacity(); if ( it->second ) { bear::visual::scene_sprite s ( it->first->get_horizontal_middle() - m_animation_on.get_sprite().width() / 2, it->first->get_vertical_middle() - m_animation_on.get_sprite().height() / 2, m_animation_on.get_sprite() ); s.get_rendering_attributes().set_opacity( opacity ); visuals.push_back( s ); } else { bear::visual::scene_sprite s ( it->first->get_horizontal_middle() - m_animation_off.get_sprite().width() / 2, it->first->get_vertical_middle() - m_animation_off.get_sprite().height() / 2, m_animation_off.get_sprite() ); s.get_rendering_attributes().set_opacity( opacity ); visuals.push_back( s ); } } } // mouse_over_manager::get_visuals() /*----------------------------------------------------------------------------*/ /** * \brief Get the items concerned by a progress/move of this one. * \param d (out) A list to which are added such items. */ void bear::mouse_over_manager::get_dependent_items ( universe::physical_item::item_list& d ) const { super::get_dependent_items(d); handle_list::const_iterator it; for ( it = m_items.begin(); it != m_items.end(); ++it ) if ( it->first != (base_item*)NULL ) d.push_back( it->first.get() ); } // mouse_over_manager::get_dependent_items() /*----------------------------------------------------------------------------*/ /** * \brief Method called when the position of the mouse changes. * \param pos The new position of the cursor. * \return true if the event has been processed. */ bool bear::mouse_over_manager::mouse_move ( const claw::math::coordinate_2d& pos ) { bear::universe::position_type mouse_position = get_level().screen_to_level(pos); handle_list::iterator it; for ( it = m_items.begin(); it != m_items.end(); ++it ) if ( it->first != (base_item*)NULL ) { if ( it->first->get_bounding_box().includes( mouse_position ) ) { if ( ! it->second ) play_sound(it->first); it->second = true; } else it->second = false; } return false; } // mouse_over_manager::mouse_move() /*----------------------------------------------------------------------------*/ /** * \brief Play the sound when the mouse is on the item. */ void bear::mouse_over_manager::play_sound( handle_type item ) { if ( m_sample != NULL ) { bool play(true); engine::with_rendering_attributes* a = dynamic_cast( item.get() ); if ( a != NULL ) play = a->get_rendering_attributes().get_opacity() != 0; if ( play ) { audio::sound_effect effect(m_sample->get_effect()); effect.set_position( this->get_center_of_mass() ); m_sample->play(effect); } } } // mouse_over_manager::play_sound() plee-the-bear-20251226/bear-engine/lib/src/generic_items/code/path_trace.cpp000066400000000000000000000333401512343254000264510ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::path_trace class. * \author Julien Jorge */ #include "generic_items/path_trace.hpp" #include "visual/scene_polygon.hpp" #include BASE_ITEM_EXPORT(path_trace, bear) /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ bear::path_trace::path_trace() : m_progress(&path_trace::progress_void), m_fill_color(claw::graphic::black_pixel), m_opacity(1), m_fade_out_speed(1), m_maximal_length( std::numeric_limits::max() ), m_tail_ratio(1), m_use_horizontal_axis(false) { set_artificial(true); set_phantom(true); set_can_move_items(false); } // path_trace::path_trace() /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param ref The item to trace. */ bear::path_trace::path_trace( const base_item& ref ) : m_progress(&path_trace::progress_alive), m_fill_color(claw::graphic::black_pixel), m_opacity(1), m_fade_out_speed(1), m_maximal_length( std::numeric_limits::max() ), m_tail_ratio(1), m_use_horizontal_axis(false) { set_artificial(true); set_phantom(true); set_can_move_items(false); set_global( true ); set_item( ref ); } // path_trace::path_trace() /*----------------------------------------------------------------------------*/ /** * \brief Set the color of the trace. * \param c The new color. */ void bear::path_trace::set_fill_color( const visual::color_type& c ) { m_fill_color = c; } // path_trace::set_fill_color() /*----------------------------------------------------------------------------*/ /** * \brief Tells if the trace uses the horizontal axis of the moving item * for its computations, instead of the vertical axis. * \param b The new value of the flag. */ void bear::path_trace::set_use_horizontal_axis( bool b ) { m_use_horizontal_axis = b; } // path_trace::set_use_horizontal_axis() /*----------------------------------------------------------------------------*/ /** * \brief Sets the ratio of the size of the end of the trace relatively to its * head. * \param r The new ratio. * \remark Values of r lesser than zero are ignored. */ void bear::path_trace::set_tail_ratio( double r ) { if ( r >= 0 ) m_tail_ratio = r; } // path_trace::set_tail_ratio() /*----------------------------------------------------------------------------*/ /** * \brief Set the item to trace. * \param ref The item to trace. */ void bear::path_trace::set_item( const base_item& ref ) { set_z_position(ref.get_z_position() - 1); set_bounding_box( ref.get_bounding_box() ); set_movement_reference( &ref ); m_previous_top.clear(); m_previous_bottom.clear(); m_previous_date.clear(); m_date = 0; m_item = ref; m_progress = &path_trace::progress_alive; set_auto_axis(); push_position(); } // path_trace::set_item() /*----------------------------------------------------------------------------*/ /** * \brief Set the speed of the fade out of the trace when the traced item is * dead. * \param s Units of opacity lost per second. */ void bear::path_trace::set_fade_out_speed( double s ) { m_fade_out_speed = (s > 0) ? s : 0; } // path_trace::set_fade_out_speed() /*----------------------------------------------------------------------------*/ /** * \brief Set the maximal length of the trace. * \param length of the trace. */ void bear::path_trace::set_length( universe::time_type length ) { m_maximal_length = length; } // path_trace::set_length() /*----------------------------------------------------------------------------*/ /** * \brief Do one step in the progression of the item. * \param elapsed_time Elapsed time since the last call. */ void bear::path_trace::progress( universe::time_type elapsed_time ) { super::progress(elapsed_time); m_date += elapsed_time; (this->*m_progress)( elapsed_time ); update_length(); } // path_trace::progress() /*----------------------------------------------------------------------------*/ /** * \brief Get the visuals of this item. * \param visuals (out) The visuals. */ void bear::path_trace::get_visual( std::list& visuals ) const { CLAW_PRECOND( m_previous_bottom.size() == m_previous_top.size() ); if ( m_previous_top.empty() ) return; position_list::const_iterator bottom_it = m_previous_bottom.begin(); position_list::const_iterator top_it = m_previous_top.begin(); position_list::const_iterator next_top(top_it); ++next_top; std::size_t i( m_previous_top.size() ); while ( next_top != m_previous_top.end() ) { // The four corners of the polygon. const visual::position_type first_bottom( *bottom_it ); ++bottom_it; const visual::position_type second_bottom( *bottom_it ); const visual::position_type first_top( *top_it ); ++top_it; const visual::position_type second_top( *top_it ); next_top = top_it; ++next_top; --i; const std::vector p ( get_polygon ( i, first_bottom, second_bottom, first_top, second_top ) ); if ( !p.empty() ) { visual::scene_polygon e(0, 0, m_fill_color, p); e.get_rendering_attributes().set_opacity(m_opacity); visuals.push_back( engine::scene_visual(e) ); } } } // path_trace::get_visual() /*----------------------------------------------------------------------------*/ /** * \brief Update the position of the item. * * This function overrides the default move and place the trace such that the * last computed points are placed on the moving item. * * \param elapsed_time Elapsed time since the last call. */ void bear::path_trace::move( universe::time_type elapsed_time ) { if ( m_previous_bottom.empty() || (m_item == (physical_item*)NULL) ) return; const universe::position_type last_point( m_previous_bottom.back() ); if ( m_use_horizontal_axis ) set_bottom_left ( get_left() + (m_item->get_left() - last_point.x), get_bottom() + (m_item->get_vertical_middle() - last_point.y) ); else set_bottom_left ( get_left() + (m_item->get_horizontal_middle() - last_point.x), get_bottom() + (m_item->get_bottom() - last_point.y) ); } // path_trace::move() /*----------------------------------------------------------------------------*/ /** * \brief Do one step in the progression of this item, when there is no traced * item. * \param elapsed_time Elapsed time since the last call. */ void bear::path_trace::progress_void( universe::time_type elapsed_time ) { // nothing to do } // path_trace::progress_void() /*----------------------------------------------------------------------------*/ /** * \brief Do one step in the progression of this item, while the traced item is * alive. * \param elapsed_time Elapsed time since the last call. */ void bear::path_trace::progress_alive( universe::time_type elapsed_time ) { if ( m_item == NULL ) { m_progress = &path_trace::progress_dead; return; } push_position(); set_bounding_box( get_bounding_box().join(m_item->get_bounding_box()) ); } // path_trace::progress_alive() /*----------------------------------------------------------------------------*/ /** * \brief Do one step in the progression of this item, once the traced item is * dead. * \param elapsed_time Elapsed time since the last call. */ void bear::path_trace::progress_dead( universe::time_type elapsed_time ) { m_opacity -= m_fade_out_speed * elapsed_time; if ( m_opacity < 0 ) kill(); } // path_trace::progress_dead() /*----------------------------------------------------------------------------*/ /** * \brief Update the length. */ void bear::path_trace::update_length() { bool stop(false); while ( !stop ) if ( m_previous_date.empty() ) stop = true; else if ( m_previous_date.front() + m_maximal_length <= m_date ) { m_previous_date.pop_front(); m_previous_top.pop_front(); m_previous_bottom.pop_front(); } else stop = true; } // path_trace::update_length() /*----------------------------------------------------------------------------*/ /** * \brief Compute the polygon of a part of the trace. * \param i The index of the polygon relatively to the head of the trace. * \param first_bottom The first point stored on the bottom edge. * \param second_bottom The second point stored on the bottom edge. * \param first_top The first point stored on the top edge. * \param second_top The second point stored on the top edge. */ std::vector bear::path_trace::get_polygon ( std::size_t i, universe::position_type first_bottom, universe::position_type second_bottom, universe::position_type first_top, universe::position_type second_top ) const { if ( m_use_horizontal_axis ) return get_horizontal_polygon ( i, first_bottom, second_bottom, first_top, second_top ); else return get_vertical_polygon ( i, first_bottom, second_bottom, first_top, second_top ); } // path_trace::get_polygon() /*----------------------------------------------------------------------------*/ /** * \brief Compute the polygon of a part of the trace in the case where we store * the points on the vertical axis. * \param i The index of the polygon relatively to the head of the trace. * \param first_bottom The first point stored on the bottom edge. * \param second_bottom The second point stored on the bottom edge. * \param first_top The first point stored on the top edge. * \param second_top The second point stored on the top edge. */ std::vector bear::path_trace::get_vertical_polygon ( std::size_t i, universe::position_type first_bottom, universe::position_type second_bottom, universe::position_type first_top, universe::position_type second_top ) const { std::size_t count( m_previous_top.size() ); std::vector p(4); // Adjust the height of the polygon according to the distance from the // head of the trace. const double first_dy ( ( (1 - m_tail_ratio) * (double)(i+1) / count ) * (first_top.y - first_bottom.y) / 2 ); const double second_dy ( ( (1 - m_tail_ratio) * (double)(i) / count ) * (second_top.y - second_bottom.y) / 2 ); p[0] = visual::position_type( first_bottom.x, first_bottom.y + first_dy ); p[1] = visual::position_type( second_bottom.x, second_bottom.y + second_dy ); p[2] = visual::position_type( second_top.x, second_top.y - second_dy ); p[3] = visual::position_type( first_top.x, first_top.y - first_dy ); return p; } // path_trace::get_vertical_polygon() /*----------------------------------------------------------------------------*/ /** * \brief Compute the polygon of a part of the trace in the case where we store * the points on the horizontal axis. * \param i The index of the polygon relatively to the head of the trace. * \param first_left The first point stored on the left edge. * \param second_left The second point stored on the left edge. * \param first_right The first point stored on the right edge. * \param second_right The second point stored on the right edge. */ std::vector bear::path_trace::get_horizontal_polygon ( std::size_t i, universe::position_type first_left, universe::position_type second_left, universe::position_type first_right, universe::position_type second_right ) const { std::size_t count( m_previous_top.size() ); std::vector p(4); // Adjust the width of the polygon according to the distance from the // head of the trace. const double first_dx ( ( (1 - m_tail_ratio) * (double)(i+1) / count ) * (first_right.x - first_left.x) / 2 ); const double second_dx ( ( (1 - m_tail_ratio) * (double)(i) / count ) * (second_right.x - second_left.x) / 2 ); p[0] = visual::position_type( first_left.x + first_dx, first_left.y ); p[1] = visual::position_type( second_left.x + second_dx, second_left.y ); p[2] = visual::position_type( second_right.x - second_dx, second_right.y ); p[3] = visual::position_type( first_right.x - first_dx, first_right.y ); return p; } // path_trace::get_horizontal_polygon() /*----------------------------------------------------------------------------*/ /** * \brief Automatically sets the set_use_horizontal_axis flag in order to have * the best rendering. * \param b The new value of the flag. */ void bear::path_trace::set_auto_axis() { if ( m_item == (universe::physical_item*)NULL ) return; const double vertical_angle_threshold( 3.14159 / 4 ); const double pi_div_2( 3.14159 / 2 ); const double a( m_item->get_system_angle() ); if ( ( (pi_div_2 - vertical_angle_threshold <= a) && (a <= pi_div_2 + vertical_angle_threshold ) ) || ( (-pi_div_2 - vertical_angle_threshold <= a) && (a <= -pi_div_2 + vertical_angle_threshold ) ) ) set_use_horizontal_axis(false); else set_use_horizontal_axis(true); } // path_trace::set_auto_axis() /*----------------------------------------------------------------------------*/ /** * \brief Stores the position of the trace on m_item. */ void bear::path_trace::push_position() { if ( m_item == NULL ) return; if ( m_use_horizontal_axis ) { m_previous_top.push_back( m_item->get_right_middle() ); m_previous_bottom.push_back( m_item->get_left_middle() ); } else { m_previous_top.push_back( m_item->get_top_middle() ); m_previous_bottom.push_back( m_item->get_bottom_middle() ); } m_previous_date.push_back( m_date ); } // path_trace::push_position() plee-the-bear-20251226/bear-engine/lib/src/generic_items/code/path_tracer.cpp000066400000000000000000000103071512343254000266310ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::path_tracer class. * \author Julien Jorge */ #include "generic_items/path_tracer.hpp" #include "generic_items/path_trace.hpp" #include #include BASE_ITEM_EXPORT(path_tracer, bear) /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ bear::path_tracer::path_tracer() : m_fill_color(claw::graphic::black_pixel), m_fade_out_speed(1), m_maximal_length( std::numeric_limits::max() ), m_tail_ratio(1) { } // path_tracer::path_tracer() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type "real". * \param name The name of the field to set. * \param value The value to give to the field. */ bool bear::path_tracer::set_real_field( const std::string& name, double value ) { bool result(true); if ( name == "path_tracer.fill_color.red" ) m_fill_color.set_red_intensity(value); else if ( name == "path_tracer.fill_color.green" ) m_fill_color.set_green_intensity(value); else if ( name == "path_tracer.fill_color.blue" ) m_fill_color.set_blue_intensity(value); else if ( name == "path_tracer.fill_color.opacity" ) m_fill_color.set_opacity(value); else if ( name == "path_tracer.fade_out_speed" ) m_fade_out_speed = value; else if ( name == "path_tracer.tail_ratio" ) m_tail_ratio = value; else if ( name == "path_tracer.maximal_length" ) m_maximal_length = value; else result = super::set_real_field(name, value); return result; } // path_tracer::set_real_field() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type \c color. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::path_tracer::set_color_field ( const std::string& name, visual::color value ) { bool ok = true; if (name == "path_tracer.fill_color") m_fill_color = value; else ok = super::set_color_field(name, value); return ok; } // path_tracer::set_color_field() /*----------------------------------------------------------------------------*/ /** * \brief Do one step in the progression of the item. * \param elapsed_time Elapsed time since the last call. */ void bear::path_tracer::progress( universe::time_type elapsed_time ) { super::progress(elapsed_time); handle_list_type::iterator it=m_traces.begin(); while ( it != m_traces.end() ) if ( *it == (universe::physical_item*)NULL ) it = m_traces.erase(it); else ++it; } // path_tracer::progress() /*----------------------------------------------------------------------------*/ /** * \brief Set the color of the trace. * \param c The new color. */ void bear::path_tracer::set_fill_color( const visual::color_type& c ) { m_fill_color = c; } // path_tracer::set_fill_color() /*----------------------------------------------------------------------------*/ /** * \brief Set the speed of the fade out of the trace when the traced item is * dead. * \param s Units of opacity lost per second. */ void bear::path_tracer::set_fade_out_speed( double s ) { m_fade_out_speed = s; } // path_tracer::set_fade_out_speed() /*----------------------------------------------------------------------------*/ /** * \brief The condition is verified. * \param activator The item on which the condition is verified. */ void bear::path_tracer::on_trigger_on( base_item* activator ) { if ( activator == NULL ) return; if ( std::find(m_traces.begin(), m_traces.end(), handle_type(activator)) == m_traces.end() ) { m_traces.push_front(activator); path_trace* trace = new path_trace(*activator); trace->set_fill_color(m_fill_color); trace->set_fade_out_speed( m_fade_out_speed ); trace->set_length( m_maximal_length ); trace->set_tail_ratio( m_tail_ratio ); new_item(*trace); } } // path_tracer::on_trigger_on() plee-the-bear-20251226/bear-engine/lib/src/generic_items/code/reference_item.cpp000066400000000000000000000012641512343254000273130ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::reference_item class. * \author Sebastien Angibaud */ #include "generic_items/reference_item.hpp" #include "engine/export.hpp" BASE_ITEM_EXPORT( reference_item, bear ) /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ bear::reference_item::reference_item() { set_phantom(true); set_artificial(true); set_can_move_items(false); } // reference_item::reference_item() plee-the-bear-20251226/bear-engine/lib/src/generic_items/code/reflecting_decoration.cpp000066400000000000000000000065531512343254000306760ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::reflecting_decoration class. * \author Sebastie Angibaud */ #include "generic_items/reflecting_decoration.hpp" #include "visual/scene_element_sequence.hpp" #include "engine/layer/layer.hpp" #include "engine/world.hpp" #include "engine/export.hpp" BASE_ITEM_EXPORT( reflecting_decoration, bear ) /*----------------------------------------------------------------------------*/ /** * \brief Compare two scene_visual instances on their z_position. * \return s1.z_position < s2.z_position */ bool bear::reflecting_decoration::z_item_position_compare::operator() ( const item_handle& s1, const item_handle& s2 ) const { if ( s1.get_item() == NULL ) return false; else if ( s2.get_item() == NULL ) return true; else return s1->get_z_position() < s2->get_z_position(); } // z_item_position_compare::operator()() /*---------------------------------------------------------------------------*/ /** * \brief Do one iteration in the progression of the item. */ void bear::reflecting_decoration::progress( universe::time_type elapsed_time ) { super::progress(elapsed_time); m_items_list.clear(); universe::world::item_list items; if ( get_layer().has_world() ) { bear::universe::item_picking_filter filter; filter.set_fixed_value(false); get_layer().get_world().pick_items_in_rectangle ( items, get_bounding_box(), filter); universe::world::item_list::iterator it; for ( it = items.begin(); it != items.end(); ++it ) { engine::base_item* item = dynamic_cast(*it); if ( (item != NULL) && (item != this) ) m_items_list.push_back(item_handle(*it)); } } } // reflecting_decoration::progress() /*----------------------------------------------------------------------------*/ /** * \brief Get the sprites representing the item. * \param visuals (out) The sprites of the item, and their positions. */ void bear::reflecting_decoration::get_visual ( std::list& visuals ) const { items_list::const_iterator it; items_list item_list(m_items_list); item_list.sort( reflecting_decoration::z_item_position_compare() ); for ( it = item_list.begin(); it != item_list.end(); ++it ) if ( it->get_item() != NULL ) { std::list scenes; (*it)->get_visual(scenes); scenes.sort(engine::scene_visual::z_position_compare()); if ( !scenes.empty() ) { visual::scene_element_sequence e; visual::position_type origin ( scenes.front().scene_element.get_position() ); e.set_position( origin + get_gap() ); for ( ; !scenes.empty() ; scenes.pop_front() ) { visual::scene_element elem( scenes.front().scene_element ); elem.set_position( elem.get_position() - origin ); e.push_back( elem ); } e.get_rendering_attributes().combine( get_rendering_attributes() ); visuals.push_back( engine::scene_visual(e, get_z_position()) ); } } } // reflecting_decoration::get_visual() plee-the-bear-20251226/bear-engine/lib/src/generic_items/code/rocket.cpp000066400000000000000000000262771512343254000256410ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file rocket.cpp * \brief Implementation of the rocket class. * \author Sebastien Angibaud */ #include "generic_items/rocket.hpp" #include "generic_items/path_trace.hpp" BASE_ITEM_EXPORT( rocket, bear ) const bear::universe::force_type bear::rocket::s_force = bear::universe::force_type(0,50000); /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ bear::rocket::rocket() : m_date(0), m_min_force_factor(1.0), m_max_force_factor(1.0), m_initial_angle(0), m_min_angle(0), m_max_angle(0), m_min_nb_rockets(1), m_max_nb_rockets(1), m_min_nb_explose_rockets(0), m_max_nb_explose_rockets(0), m_min_explosion_date(std::numeric_limits::max()), m_max_explosion_date(std::numeric_limits::max()), m_trace_length(0), m_trace_color(claw::graphic::black_pixel), m_min_fade_out_speed(std::numeric_limits::max()), m_max_fade_out_speed(std::numeric_limits::max()) { set_system_angle_as_visual_angle(true); set_phantom(true); set_can_move_items(false); set_artificial(true); set_kill_when_leaving(true); set_density(0.0015); set_mass(1); } // rocket::bear::rocket() /*----------------------------------------------------------------------------*/ /** * \brief Copy contructor. */ bear::rocket::rocket( const rocket& that ) : super(that), m_date(0), m_min_force_factor(that.m_min_force_factor), m_max_force_factor(that.m_max_force_factor), m_initial_angle(that.m_initial_angle), m_min_angle(that.m_min_angle), m_max_angle(that.m_max_angle), m_min_nb_rockets(that.m_min_nb_rockets), m_max_nb_rockets(that.m_max_nb_rockets), m_min_nb_explose_rockets(that.m_min_nb_explose_rockets), m_max_nb_explose_rockets(that.m_max_nb_explose_rockets), m_min_explosion_date(that.m_min_explosion_date), m_max_explosion_date(that.m_max_explosion_date), m_trace_length(that.m_trace_length), m_trace_color(that.m_trace_color), m_min_fade_out_speed(that.m_min_fade_out_speed), m_max_fade_out_speed(that.m_max_fade_out_speed) { for ( unsigned int i = 0; i != that.m_rockets.size(); ++i ) m_rockets.push_back( that.m_rockets[i]->clone() ); } // rocket::rocket() /*----------------------------------------------------------------------------*/ /** * \brief Destructor. */ bear::rocket::~rocket() { for ( unsigned int i = 0; i != m_rockets.size(); ++i ) delete m_rockets[i]; } // rocket::~rocket() /*----------------------------------------------------------------------------*/ /** * \brief Do post creation actions. */ void bear::rocket::on_enters_layer() { super::on_enters_layer(); m_nb_rockets = get_rand(m_min_nb_rockets, m_max_nb_rockets + 1); if ( m_nb_rockets <= 1 ) throw_rocket(); else duplicate_rocket(); } // rocket::on_enters_layer() /*---------------------------------------------------------------------------*/ /** * \brief Do one iteration in the progression of the item. * \param elapsed_time Elapsed time since the last call. */ void bear::rocket::progress( universe::time_type elapsed_time ) { super::progress( elapsed_time ); get_rendering_attributes().set_angle ( std::atan2( get_speed().y, get_speed().x) ); if ( m_date < m_explosion_date ) { m_date += elapsed_time; if ( m_date >= m_explosion_date ) explose(); } else { m_date += elapsed_time; double opacity = get_rendering_attributes().get_opacity(); opacity -= m_fade_out_speed * elapsed_time; get_rendering_attributes().set_opacity(opacity); if (opacity <= 0) kill(); } } // rocket::progress() /*---------------------------------------------------------------------------*/ /** * \brief Set the force factor to applied. * \param min_force The minimal force factor. * \param max_force The maximal force factor. */ void bear::rocket::set_force_factor ( double min_force_factor, double max_force_factor) { m_min_force_factor = min_force_factor; m_max_force_factor = max_force_factor; } // rocket::set_force_factor() /*---------------------------------------------------------------------------*/ /** * \brief Set the intial angle. * \param angle The initial angle. */ void bear::rocket::set_initial_angle( double angle) { m_initial_angle = angle; } // rocket::set_intial_angle() /*---------------------------------------------------------------------------*/ /** * \brief Set the angle to give. * \param min_angle The minimal angle. * \param max_angle The maximal angle. */ void bear::rocket::set_angle( double min_angle, double max_angle) { m_min_angle = min_angle; m_max_angle = max_angle; } // rocket::set_angle() /*---------------------------------------------------------------------------*/ /** * \brief Set the number of current rockets to create at the beginning. * \param min_nb The minimal number of rockets. * \param max_nb The maximal number of rockets. */ void bear::rocket::set_rocket_count( unsigned int min_nb, unsigned int max_nb) { m_min_nb_rockets = min_nb; m_max_nb_rockets = max_nb; } // rocket::set_rocket_count() /*---------------------------------------------------------------------------*/ /** * \brief Set the number of rockets to create when the item exploses. * \param min_nb The minimal number of rockets. * \param max_nb The maximal number of rockets. */ void bear::rocket::set_explosion_rocket_count ( unsigned int min_nb, unsigned int max_nb) { m_min_nb_explose_rockets = min_nb; m_max_nb_explose_rockets = max_nb; } // rocket::set_explosion_rocket_count() /*---------------------------------------------------------------------------*/ /** * \brief Set the date of the explosion. * \param min_date The minimal date. * \param max_date The maximal date. */ void bear::rocket::set_explosion_date ( universe::time_type min_date, universe::time_type max_date ) { m_min_explosion_date = min_date; m_max_explosion_date = max_date; } // rocket::set_explosion_date() /*---------------------------------------------------------------------------*/ /** * \brief Set the trace. * \param length The minimal duration. * \param color The color of the trace. * \param opacity The opacity of the trace */ void bear::rocket::set_trace ( universe::time_type length, const visual::color_type& color, double opacity ) { m_trace_color = color; m_trace_color.set_opacity(opacity); m_trace_length = length; } // rocket::set_trace() /*----------------------------------------------------------------------------*/ /** * \brief Set the speed of the fade out when the rocket exploses. * \param min_s Minimum of units of opacity lost per second. * \param max_s Maximum of units of opacity lost per second. */ void bear::rocket::set_fade_out_speed( double min_s, double max_s ) { m_min_fade_out_speed = min_s; m_max_fade_out_speed = max_s; } // rocket::set_fade_out_speed() /*---------------------------------------------------------------------------*/ /** * \brief Add a possible rocket to create. * \param r The rocket to create when the item explose. */ void bear::rocket::add_rocket( const rocket& r) { m_rockets.push_back(r.clone()); } // rocket::add_rocket() /*---------------------------------------------------------------------------*/ /** * \brief Sets the name of the sound to play when the rocket exploses. * \param name The name of the sound. */ void bear::rocket::set_explosion_sound_name( std::string name ) { m_explosion_sound_name = name; } // rocket::set_explosion_sound_name() /*---------------------------------------------------------------------------*/ /** * \brief The item exploses. */ void bear::rocket::explose() { if ( ! m_rockets.empty() ) { for ( unsigned int i = 0; i != m_nb_explose_rockets; ++i ) create_rocket( (double)i * 6.28 / m_nb_explose_rockets ); play_explosion_sound(); kill(); } } // rocket::explose() /*---------------------------------------------------------------------------*/ /** * \brief Duplicate the current rocket. */ void bear::rocket::duplicate_rocket() { for ( unsigned int i = 0; i != m_nb_rockets; ++i ) { rocket* r = this->clone(); r->set_rocket_count(1, 1); new_item(*r); } kill(); } // rocket::duplicate_rocket() /*---------------------------------------------------------------------------*/ /** * \brief Create a rocket. * \paral initial_angle The initial angle of the rocket. */ void bear::rocket::create_rocket(double initial_angle) { unsigned int alea = get_rand(0, m_rockets.size()); rocket* r = m_rockets[alea]->clone(); r->set_initial_angle(initial_angle); r->set_z_position( get_z_position() ); r->set_center_of_mass(get_center_of_mass()); r->set_kill_when_leaving( get_kill_when_leaving() ); new_item(*r); } // rocket::create_rocket() /*---------------------------------------------------------------------------*/ /** * \brief Create trace. */ void bear::rocket::create_trace() { path_trace* trace = new path_trace(*this); trace->set_fill_color(m_trace_color); trace->set_fade_out_speed( 2.0 ); trace->set_tail_ratio( 0 ); trace->set_length(m_trace_length); new_item(*trace); } // rocket::create_trace() /*---------------------------------------------------------------------------*/ /** * \brief Play a sound for the explosion. */ void bear::rocket::play_explosion_sound() { if ( get_level_globals().sound_exists( m_explosion_sound_name ) ) get_level_globals().play_sound ( m_explosion_sound_name, audio::sound_effect( get_center_of_mass() ) ); } // rocket::play_explosion_sound() /*---------------------------------------------------------------------------*/ /** * \brief Throw the rocket. */ void bear::rocket::throw_rocket() { m_nb_explose_rockets = get_rand (m_min_nb_explose_rockets, m_max_nb_explose_rockets + 1); m_explosion_date = get_rand(m_min_explosion_date, m_max_explosion_date); m_fade_out_speed = get_rand(m_min_fade_out_speed, m_max_fade_out_speed); set_system_angle ( m_initial_angle + get_rand(m_min_angle, m_max_angle) ); set_internal_force ( s_force * get_rand(m_min_force_factor, m_max_force_factor) ); if ( m_trace_length != 0 ) create_trace(); } // rocket::throw_rocket() /*---------------------------------------------------------------------------*/ /** * \brief Get a random number between two values. * \param min The minimal value. * \param max The maximal value. */ template T bear::rocket::get_rand(T min, T max) const { return (T)( (double)min + (double)rand() / RAND_MAX * (double)(max - min)); } // rocket::get_rand() plee-the-bear-20251226/bear-engine/lib/src/generic_items/code/rolling_credits.cpp000066400000000000000000000240001512343254000275130ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::rolling_credits class. * \author Julien Jorge */ #include "generic_items/rolling_credits.hpp" #include "engine/level_globals.hpp" #include "engine/resource_pool.hpp" #include "visual/scene_writing.hpp" #include "visual/text_layout.hpp" #include "visual/text_layout_display_size.hpp" #include #include BASE_ITEM_EXPORT( rolling_credits, bear ) /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param text The text displayed in the credits. * \param font The font used to display the text. * \param r The intensity of the red component of the displayed line. * \param g The intensity of the green component of the displayed line. * \param b The intensity of the blue component of the displayed line. * \param o The opacity of the displayed line. * \param pos The bottom-left position of the line in the layer. * \param width The maximum width of the line. * \param a The alignment of the text. */ bear::rolling_credits::credit_line::credit_line ( const std::string& text, const visual::font& font, double r, double g, double b, double o, const universe::position_type& pos, universe::size_type width, visual::text_align::horizontal_align a ) : m_visual ( visual::scene_writing ( pos.x, pos.y, create_writing(text, font, width, a)) ), m_is_on(false) { m_visual.get_rendering_attributes().set_intensity(r, g, b); m_visual.get_rendering_attributes().set_opacity(o); } // rolling_credits::credit_line::credit_line() /*----------------------------------------------------------------------------*/ /** * \brief Create a scene element to display the text. */ const bear::visual::scene_element& bear::rolling_credits::credit_line::create_scene_element() const { return m_visual; } // rolling_credits::credit_line::create_scene_element() /*----------------------------------------------------------------------------*/ /** * \brief Get the bottom left position of the line in the layer. */ const bear::universe::position_type& bear::rolling_credits::credit_line::get_bottom_left() const { return m_visual.get_position(); } // rolling_credits::credit_line::get_bottom_left() /*----------------------------------------------------------------------------*/ /** * \brief Set the bottom left position of the line in the layer. * \param p The position. */ void bear::rolling_credits::credit_line::set_bottom_left ( const universe::position_type& p ) { m_visual.set_position(p); } // rolling_credits::credit_line::set_bottom_left() /*----------------------------------------------------------------------------*/ /** * \brief Get the size of the line on the screen. */ bear::universe::size_box_type bear::rolling_credits::credit_line::get_size() const { return m_visual.get_bounding_box().size(); } // rolling_credits::credit_line::get_size() /*----------------------------------------------------------------------------*/ /** * \brief Tell if the line has to be displayed. */ bool bear::rolling_credits::credit_line::is_on() const { return m_is_on; } // rolling_credits::credit_line::is_on() /*----------------------------------------------------------------------------*/ /** * \brief Tell that the line has to be displayed. */ void bear::rolling_credits::credit_line::turn_on() { m_is_on = true; } // rolling_credits::credit_line::turn_on() /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param text The text displayed in the credits. * \param font The font used to display the text. * \param width The maximum width of the line. * \param a The alignment of the text. */ bear::visual::writing bear::rolling_credits::credit_line::create_writing ( const std::string& text, const visual::font& font, universe::size_type width, visual::text_align::horizontal_align a ) const { visual::size_box_type s( width, font.get_line_spacing() * text.length() ); visual::text_layout_display_size func( text, font, s.y ); visual::text_layout layout( font, text, s, a ); layout.arrange_text( func ); s = func.get_bounding_box().size(); if ( s.y < font.get_line_spacing() ) s.y = font.get_line_spacing(); return visual::writing( font, text, visual::size_box_type( width, s.y ), a ); } // rolling_credits::credit_line::create_writing() /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ bear::rolling_credits::rolling_credits() : m_movement_duration(1), m_fading_frac(-1), m_elapsed_time(0) { } // rolling_credits::rolling_credits() /*----------------------------------------------------------------------------*/ /** * \brief Initialise the item. */ void bear::rolling_credits::build() { super::build(); std::stringstream iss; engine::resource_pool::get_instance().get_file(m_file, iss); if ( m_fading_frac < 0 ) m_fading_frac = 1.0 / 4; else // initially, m_fading_frac contains the duration of the fading m_fading_frac /= m_movement_duration; std::string line; visual::font font; double font_size(12); double red(1), green(1), blue(1), opacity(1); visual::text_align::horizontal_align horizontal_align ( visual::text_align::align_center ); visual::size_type width( get_width() ); while ( claw::text::getline(iss, line) ) if ( line.empty() ) m_lines.push_back ( credit_line ( line, font, red, green, blue, opacity, get_bottom_left(), width, horizontal_align ) ); else if ( line[0] == '#' ) { std::string s; std::istringstream iss_line(line); iss_line >> s; if ( s == "#color" ) { red = green = blue = opacity = 1; iss_line >> red >> green >> blue >> opacity; } else if ( s == "#font" ) { iss_line >> s >> font_size; font = get_level_globals().get_font(s, font_size); } else if ( s == "#align" ) { iss_line >> s; horizontal_align = visual::text_align::horizontal_align_from_string ( s, visual::text_align::align_center ); } } else m_lines.push_back ( credit_line ( line, font, red, green, blue, opacity, get_bottom_left(), width, horizontal_align ) ); } // rolling_credits::build() /*----------------------------------------------------------------------------*/ /** * \brief Update the state of the item. * \param elapsed_time Elapsed time since the last call. */ void bear::rolling_credits::progress( universe::time_type elapsed_time ) { super::progress(elapsed_time); if ( m_lines.empty() ) return; m_elapsed_time += elapsed_time; const universe::time_type speed = get_height() / m_movement_duration; bool stop(false); std::list::iterator it(m_lines.begin()); for ( it=m_lines.begin(); !stop; ) { universe::position_type p(it->get_bottom_left()); p.y += speed * elapsed_time; it->set_bottom_left( p ); it->turn_on(); if ( p.y + it->get_size().y > get_top() ) it = m_lines.erase(it); else ++it; if (it==m_lines.end()) stop = true; else if ( p.y - get_bottom() < it->get_size().y ) stop = true; } } // rolling_credits::progress() /*----------------------------------------------------------------------------*/ /** * \brief Get the sprite representing the item. * \param visuals (out) The sprites of the item, and their positions. */ void bear::rolling_credits::get_visual ( std::list& visuals ) const { bool stop(false); std::list::const_iterator it; for (it=m_lines.begin(); !stop && (it!=m_lines.end()); ++it) if ( !it->is_on() ) stop = true; else { visual::scene_element vis(it->create_scene_element()); double f = (it->get_bottom_left().y - get_bottom()) / (get_height() - it->get_size().y); if ( f < m_fading_frac ) vis.get_rendering_attributes().set_opacity ( vis.get_rendering_attributes().get_opacity() * (f / m_fading_frac) ); else if ( f > 1 - m_fading_frac ) vis.get_rendering_attributes().set_opacity ( vis.get_rendering_attributes().get_opacity() * (1 - ((f - (1 - m_fading_frac)) / m_fading_frac)) ); visuals.push_back(vis); } } // rolling_credits::get_visual() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type string. * \param name The name of the field. * \param value The value of the field. */ bool bear::rolling_credits::set_string_field ( const std::string& name, const std::string& value ) { bool result = true; if ( name == "rolling_credits.credits" ) m_file = value; else result = super::set_string_field( name, value ); return result; } // rolling_credits::set_string_field() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type real. * \param name The name of the field. * \param value The value of the field. */ bool bear::rolling_credits::set_real_field ( const std::string& name, double value ) { bool result = true; if ( name == "rolling_credits.movement_duration" ) m_movement_duration = value; else if ( name == "rolling_credits.fading_duration" ) m_fading_frac = value; else result = super::set_real_field( name, value ); return result; } // rolling_credits::set_real_field() /*----------------------------------------------------------------------------*/ /** * \brief Tell if the item is well initialised. */ bool bear::rolling_credits::is_valid() { return !m_file.empty() && (m_movement_duration > 0) && super::is_valid(); } // rolling_credits::is_valid() plee-the-bear-20251226/bear-engine/lib/src/generic_items/code/slope.cpp000066400000000000000000000375601512343254000254710ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::slope class. * \author Julien Jorge */ #include "generic_items/slope.hpp" #include "universe/collision_align_policy.hpp" #include "universe/collision_info.hpp" #include "universe/collision_repair.hpp" #include "universe/shape/curved_box.hpp" #include "universe/shape/shape_traits.hpp" #include "engine/layer/layer.hpp" #include "engine/world.hpp" BASE_ITEM_EXPORT( slope, bear ) /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param item The item loaded by this loader. */ bear::slope::loader::loader( slope& item ) : super( "slope" ), m_item( item ) { } // slope::loader::loader() /*----------------------------------------------------------------------------*/ /** * \brief Instantiates a copy of this instance. */ bear::slope::loader* bear::slope::loader::clone() const { return new loader( *this ); } // slope::loader() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type \c . * \param name The name of the field to set. * \param value The new value of the field. */ bool bear::slope::loader::set_field( const std::string& name, double value ) { bool result = true; if ( name == "tangent_friction" ) m_item.m_tangent_friction = value; else { // loads the fields that describe the shape universe::curved_box* c = m_item.get_curved_box(); if ( c == NULL ) return false; if ( name == "steepness" ) c->set_steepness( value ); else if ( name == "control_point.left.x" ) c->set_left_control_point ( universe::vector_type( value, c->get_left_control_point().y ) ); else if ( name == "control_point.left.y" ) c->set_left_control_point ( universe::vector_type( c->get_left_control_point().x, value ) ); else if ( name == "control_point.right.x" ) c->set_right_control_point ( universe::vector_type( value, c->get_right_control_point().y ) ); else if ( name == "control_point.right.y" ) c->set_right_control_point ( universe::vector_type( c->get_right_control_point().x, value ) ); else if ( name == "margin" ) c->set_margin( value ); else result = false; m_item.set_shape( *c ); delete c; } if ( !result ) result = super::set_field(name, value); return result; } // slope::loader::set_field() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type \c bool. * \param name The name of the field to set. * \param value The new value of the field. */ bool bear::slope::loader::set_field( const std::string& name, bool value ) { bool result = true; if ( name == "opposite_side_is_active" ) m_item.m_opposite_side_is_active = value; else if ( name == "left_side_is_active" ) m_item.m_left_side_is_active = value; else if ( name == "right_side_is_active" ) m_item.m_right_side_is_active = value; else if ( name == "apply_angle" ) m_item.m_apply_angle = value; else result = super::set_field(name, value); return result; } // slope::loader::set_field() /*----------------------------------------------------------------------------*/ const bear::universe::coordinate_type bear::slope::s_line_width = 10; /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ bear::slope::slope() : m_tangent_friction(0.8), m_opposite_side_is_active(false), m_left_side_is_active(false), m_right_side_is_active(false), m_apply_angle(true) { set_shape( universe::curved_box() ); set_weak_collisions(false); } // slope::slope() /*----------------------------------------------------------------------------*/ /** * \brief Initialize the item. */ void bear::slope::build() { // We remove the margin during the build of the parent classes to be sure that // the automatic size is computed if no size has been provided for the slope. universe::curved_box* const c( get_curved_box() ); universe::size_type previous_margin( c->get_margin() ); c->set_margin( 0 ); set_shape( *c ); super::build(); universe::shape_traits::set_size( *c, get_size() ); c->set_margin( previous_margin ); set_shape( *c ); delete c; init_default_contact_mode ( true, m_opposite_side_is_active, m_left_side_is_active, m_right_side_is_active ); } // slope::build() /*----------------------------------------------------------------------------*/ /** * \brief Get the curve describing the slope. */ bear::slope::curve_type bear::slope::get_curve() const { curve_type result; const universe::curved_box* const c( get_curved_box() ); if ( c != NULL ) result = c->get_curve(); delete c; return result; } // slope::get_curve() /*----------------------------------------------------------------------------*/ /** * \brief Get the Y-coordinate on the slope according to a given X-coordinate. * \param x The considered X-coordinate. */ bear::universe::coordinate_type bear::slope::get_y_at_x( universe::coordinate_type x ) const { const universe::curved_box* const c( get_curved_box() ); const universe::coordinate_type result ( (c == NULL) ? get_bottom() : c->get_y_at_x(x) ); delete c; return result; } // slope::get_y_at_x() /*----------------------------------------------------------------------------*/ /** * \brief Gets the steepness of the slope. */ bear::universe::coordinate_type bear::slope::get_steepness() const { const universe::curved_box* const c( get_curved_box() ); const universe::coordinate_type result ( (c == NULL) ? 0 : c->get_steepness() ); delete c; return result; } // slope::get_steepness() /*----------------------------------------------------------------------------*/ /** * \brief Sets the steepness of the slope. * \param s The new steepness. */ void bear::slope::set_steepness( universe::coordinate_type s ) { universe::curved_box* const c( get_curved_box() ); if ( c == NULL ) return; c->set_steepness( s ); set_shape( *c ); delete c; } // slope::set_steepness() /*----------------------------------------------------------------------------*/ /** * \brief Add the loaders of this item class into a given loader map. * \param m The map in which the loaders are inserted. */ void bear::slope::populate_loader_map( engine::item_loader_map& m ) { super::populate_loader_map(m); m.insert( loader(*this) ); } // slope::populate_loader_map() /*----------------------------------------------------------------------------*/ /** * \brief Align the other item. * \param that The other item of the collision. * \param info Some informations about the collision. */ void bear::slope::collision_as_slope ( engine::base_item& that, universe::collision_info& info ) { double f(1); bool align_as_block(false); bool align_as_slope(false); switch( info.get_collision_side() ) { case universe::zone::bottom_zone: f = get_bottom_friction(); align_as_block = m_opposite_side_is_active; break; case universe::zone::top_zone: f = get_top_friction(); align_as_slope = true; break; case universe::zone::middle_left_zone: f = get_left_friction(); if ( check_left_contact_as_slope(that, info) ) align_as_slope = true; else align_as_block = m_left_side_is_active; break; case universe::zone::middle_right_zone: f = get_right_friction(); if ( check_right_contact_as_slope(that, info) ) align_as_slope = true; else align_as_block = m_right_side_is_active; break; case universe::zone::middle_zone: f = get_top_friction(); if ( check_bottom_above_ground(that, info) ) align_as_slope = true; break; default: { CLAW_ASSERT( false, "Invalid collision side." ); } } bool aligned(false); if ( satisfy_collision_condition(that) ) { if ( align_as_slope ) aligned = align_on_ground(that, info); else if ( align_as_block ) aligned = default_collision(info); else aligned = align_nearest_edge(that, info); if (aligned) { that.set_contact_friction(f); do_z_shift(that); } } } // slope::collision_as_slope() /*----------------------------------------------------------------------------*/ /** * \brief Call collision_as_slope(). * \param that The other item of the collision. * \param info Some informations about the collision. */ void bear::slope::collision ( engine::base_item& that, universe::collision_info& info ) { collision_as_slope(that, info); } // slope::collision() /*----------------------------------------------------------------------------*/ /** * \brief Check if an item colliding on the left is aligned on the ground. * \param that The other item of the collision. * \param info Some informations about the collision. */ bool bear::slope::check_left_contact_as_slope ( engine::base_item& that, universe::collision_info& info ) const { bool result = false; // the slope goes from top right to bottom left if ( get_steepness() > 0 ) result = info.get_bottom_left_on_contact().y >= get_y_at_x( get_left() ) - s_line_width; return result; } // slope::check_left_contact_as_slope() /*----------------------------------------------------------------------------*/ /** * \brief Check if an item colliding on the right is aligned on the ground. * \param that The other item of the collision. * \param info Some informations about the collision. */ bool bear::slope::check_right_contact_as_slope ( engine::base_item& that, universe::collision_info& info ) const { bool result = false; // the slope goes from top left to bottom right if ( get_steepness() < 0 ) result = info.get_bottom_left_on_contact().y >= get_y_at_x( get_right() ) - s_line_width; return result; } // slope::check_right_contact_as_slope() /*----------------------------------------------------------------------------*/ /** * \brief Check if the bottom of the other item was above the ground at * collision time. * \param that The other item of the collision. * \param info Some informations about the collision. */ bool bear::slope::check_bottom_above_ground ( engine::base_item& that, universe::collision_info& info ) const { const universe::position_type pos (info.other_previous_state().get_bottom_middle()); return pos.y >= get_y_at_x( pos.x ) - s_line_width; } // slope::check_bottom_above_ground() /*----------------------------------------------------------------------------*/ /** * \brief Align \a that on the ground line. * \param that The other item of the collision. * \param info Some informations about the collision. */ bool bear::slope::align_on_ground ( engine::base_item& that, universe::collision_info& info ) { bool result = false; const universe::coordinate_type pos_x( that.get_horizontal_middle() ); if ( (pos_x >= get_left()) && (pos_x <= get_right()) && item_crossed_up_down(that, info) ) { const universe::position_type pos( that.get_left(), get_y_at_x( pos_x ) ); const universe::collision_align_policy policy ( get_top_contact_mode(info, pos) ); if ( collision_align_top(info, pos, policy) ) { result = true; if ( m_apply_angle ) apply_angle_to(that, info); } } return result; } // slope::align_on_ground() /*----------------------------------------------------------------------------*/ /** * \brief Align \a that on the nearest vertical edge. * \param that The other item of the collision. * \param info Some informations about the collision. */ bool bear::slope::align_nearest_edge ( engine::base_item& that, universe::collision_info& info ) { bool result = false; if ( info.reference_previous_state().get_center_of_mass().x <= info.other_previous_state().get_center_of_mass().x ) { if (m_right_side_is_active) { const universe::collision_align_policy policy ( get_right_contact_mode(info) ); result = collision_align_right(info, policy); } } else if (m_left_side_is_active) { const universe::collision_align_policy policy ( get_left_contact_mode(info) ); result = collision_align_left(info, policy); } return result; } // slope::align_nearest_edge() /*----------------------------------------------------------------------------*/ /** * \brief Tell if the other item has crossed the surface following a top to down * direction. * \param that The other item in the collision. * \param info Informations on the collision. */ bool bear::slope::item_crossed_up_down ( engine::base_item& that, const universe::collision_info& info ) const { bool result = false; // the other item has its bottom below the curve if ( that.get_bottom() <= get_y_at_x( that.get_center_of_mass().x ) ) { // we check where the other item was prior to the collision. const universe::position_type other_prev_bottom ( info.other_previous_state().get_bottom_middle() ); if ( other_prev_bottom.x < get_left() ) result = other_prev_bottom.y >= get_y_at_x( get_left() ) - s_line_width; else if ( other_prev_bottom.x > get_right() ) result = other_prev_bottom.y >= get_y_at_x( get_right() ) - s_line_width; else result = other_prev_bottom.y >= get_y_at_x( other_prev_bottom.x ) - s_line_width; } return result; } // slope::item_crossed_up_down() /*----------------------------------------------------------------------------*/ /** * \brief Applies the angle of the slope to a colliding item. * \param that The other item in the collision. * \param info Informations on the collision. */ void bear::slope::apply_angle_to ( engine::base_item& that, const universe::collision_info& info ) const { const universe::coordinate_type pos_x( that.get_horizontal_middle() ); // We must keep a local copy of the curve because the section and used after // will keep a reference on the curve. const curve_type c( get_curve() ); /* The item may have been aligned with its center on our right or left. In such cases, we compute the tangent near the end of the curve. We do not use the exact end because it sometimes produces a tangent in the wrong direction. */ const curve_type::section::resolved_point p = c.get_point_at_x ( std::min ( get_width() - 0.01, std::max( universe::coordinate_type(0.01), pos_x - get_left() ) ) )[0]; bear::universe::position_type tangent ( p.get_section().get_tangent_at(p.get_date()) ); const double angle = std::atan2( tangent.y, tangent.x ); that.set_contact_angle( angle ); universe::coordinate_type g_force(0); if ( get_layer().has_world() ) g_force = std::abs( get_layer().get_world().get_total_force_on_item( that ).y ); const universe::coordinate_type normal_length( g_force * std::cos(angle) ); const universe::coordinate_type friction_length ( normal_length * m_tangent_friction ); that.add_internal_force( universe::force_type(friction_length, 0) ); info.get_collision_repair().set_contact_normal ( that, that.get_x_axis().get_orthonormal_anticlockwise() ); } // slope::apply_angle_to() /*----------------------------------------------------------------------------*/ /** * \brief Gets the curve describing the slope. */ bear::universe::curved_box* bear::slope::get_curved_box() const { universe::shape_base* const s( get_shape().clone_impl() ); universe::curved_box* const c ( dynamic_cast( s ) ); if ( c == NULL ) { delete s; return NULL; } return c; } // slope::get_curved_box() plee-the-bear-20251226/bear-engine/lib/src/generic_items/code/spring.cpp000066400000000000000000000120631512343254000256400ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::spring class. * \author Julien Jorge */ #include "generic_items/spring.hpp" #include "universe/collision_info.hpp" #include "engine/layer/layer.hpp" #include "engine/world.hpp" #include "engine/item_brick/loader/activable_sides_loader.hpp" BASE_ITEM_EXPORT( spring, bear ) /*----------------------------------------------------------------------------*/ /** * \brief Contructor. */ bear::spring::spring() : m_applied_force(0, 0), m_sample( NULL ) { } // spring::spring() /*----------------------------------------------------------------------------*/ /** * \brief Destructor. */ bear::spring::~spring() { delete m_sample; } // spring::~spring() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type "real". * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::spring::set_real_field( const std::string& name, double value ) { bool result = true; if ( name == "spring.applied_force.x" ) m_applied_force.x = value; else if ( name == "spring.applied_force.y" ) m_applied_force.y = value; else result = super::set_real_field( name, value ); return result; } // spring::set_real_field() /*----------------------------------------------------------------------------*/ /** * \brief Initialize the item. */ void bear::spring::build() { if ( get_layer().has_world() ) { m_applied_force.x = get_layer().get_world().to_world_unit( m_applied_force.x ); m_applied_force.y = get_layer().get_world().to_world_unit( m_applied_force.y ); } get_animation().set_current_index(get_animation().get_max_index()); } // spring::build() /*----------------------------------------------------------------------------*/ /** * \brief Sets the sound played when an item bounces on the spring. * \param s The sound. */ void bear::spring::set_bounce_sound( audio::sample* s ) { delete m_sample; m_sample = s; } // spring::set_bounce_sound() /*----------------------------------------------------------------------------*/ /** * \brief Add the loaders of this item class into a given loader map. * \param m The map in which the loaders are inserted. */ void bear::spring::populate_loader_map( engine::item_loader_map& m ) { super::populate_loader_map(m); m.insert( engine::activable_sides_loader(*this) ); } // spring::populate_loader_map() /*----------------------------------------------------------------------------*/ /** * \brief Check if the collision is on an active side and bounce the other item. * \param that The other item of the collision. * \param info Some informations about the collision. */ void bear::spring::collision_check_and_bounce ( engine::base_item& that, universe::collision_info& info ) { bool bounce(false); bool top_contact(false); switch( info.get_collision_side() ) { case universe::zone::bottom_zone: bounce = bottom_side_is_active(); break; case universe::zone::top_zone: bounce = top_side_is_active(); top_contact = true; break; case universe::zone::middle_left_zone: bounce = left_side_is_active(); break; case universe::zone::middle_right_zone: bounce = right_side_is_active(); break; case universe::zone::middle_zone: break; default: { CLAW_ASSERT( false, "Invalid collision side." ); } } if ( bounce ) { if ( m_applied_force.x > 0 ) bounce = collision_align_right( info ); else if ( m_applied_force.x < 0 ) bounce = collision_align_left( info ); if ( m_applied_force.y > 0 ) bounce = collision_align_top( info ); else if ( m_applied_force.y < 0 ) bounce = collision_align_bottom( info ); if (bounce) { that.add_external_force(m_applied_force); if ( top_contact ) that.set_bottom_contact(false); get_animation().reset(); play_sound(); } } else default_collision(info); } // spring::collision_check_and_bounce() /*----------------------------------------------------------------------------*/ /** * \brief Call collision_check_and_align(). * \param that The other item of the collision. * \param info Some informations about the collision. */ void bear::spring::collision ( engine::base_item& that, universe::collision_info& info ) { collision_check_and_bounce(that, info); } // spring::collision() /*----------------------------------------------------------------------------*/ /** * \brief Plays the sample. */ void bear::spring::play_sound() const { if ( m_sample == NULL ) return; audio::sound_effect effect( m_sample->get_effect() ); if ( !is_global() ) effect.set_position( get_center_of_mass() ); m_sample->play(effect); } // spring::play_sound() plee-the-bear-20251226/bear-engine/lib/src/generic_items/code/star.cpp000066400000000000000000000113211512343254000253030ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::star class. * \author Julien Jorge */ #include "generic_items/star.hpp" #include "visual/scene_star.hpp" #include BASE_ITEM_EXPORT(star, bear) /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ bear::star::star() : m_star(5, 0.5), m_fill_color(claw::graphic::black_pixel), m_border_color(claw::graphic::black_pixel), m_border_width(1) { set_phantom(true); set_can_move_items(false); set_artificial(true); } // star::star() /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param branches The number of branches. * \param ratio The ratio of the inner vertices relatively to the outer ones. * \param border_color The red component of the color of the border. * \param border_width The width of the border of the star. * \param fill_color The red component of the color of the inside. */ bear::star::star ( std::size_t branches, double ratio, const visual::color_type& border_color, double border_width, const visual::color_type& fill_color ) : m_star(branches, ratio), m_fill_color(fill_color), m_border_color(border_color), m_border_width(border_width) { set_phantom(true); set_can_move_items(false); set_artificial(true); } // star::star() /*----------------------------------------------------------------------------*/ /** * \brief Do post creation actions. */ void bear::star::on_enters_layer() { super::on_enters_layer(); get_rendering_attributes().set_size( get_size() ); } // star::on_enters_layer() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type unsigned int. * \param name The name of the field to set. * \param value The value of the field. */ bool bear::star::set_u_integer_field( const std::string& name, unsigned int value ) { bool result(true); if ( name == "star.branches" ) m_star.set_branches(value); else result = super::set_u_integer_field(name, value); return result; } // star::set_u_integer_field() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type real. * \param name The name of the field to set. * \param value The value of the field. */ bool bear::star::set_real_field( const std::string& name, double value ) { bool result(true); const visual::color_type::component_type c = std::numeric_limits::max(); if ( name == "star.ratio" ) m_star.set_ratio(value); else if ( name == "star.border_width" ) m_border_width = value; else if ( name == "star.border_color.red" ) m_border_color.components.red = value * c; else if ( name == "star.border_color.green" ) m_border_color.components.green = value * c; else if ( name == "star.border_color.blue" ) m_border_color.components.blue = value * c; else if ( name == "star.border_color.opacity" ) m_border_color.components.alpha = value * c; else if ( name == "star.fill_color.red" ) m_fill_color.components.red = value * c; else if ( name == "star.fill_color.green" ) m_fill_color.components.green = value * c; else if ( name == "star.fill_color.blue" ) m_fill_color.components.blue = value * c; else if ( name == "star.fill_color.opacity" ) m_fill_color.components.alpha = value * c; else result = super::set_real_field(name, value); return result; } // star::set_real_field() /*----------------------------------------------------------------------------*/ /** * \brief Get the visual of the item. * \param visual (out) The visual representation of the item. */ void bear::star::get_visual( std::list& visuals ) const { super::get_visual(visuals); visual::scene_star s ( 0, 0, m_border_color, m_star, m_border_width, m_fill_color ); s.get_rendering_attributes().set_size ( get_rendering_attributes().get_size() ); engine::scene_visual v = get_scene_visual(s); v.scene_element.set_position ( get_horizontal_middle() - v.scene_element.get_width() / 2, get_vertical_middle() - v.scene_element.get_height() / 2 ); visuals.push_back(v); } // star::get_visual() /*----------------------------------------------------------------------------*/ /** * \brief Set the ratio of the distance to the center of the inner vertices * relatively to the distance of the outer ones. * \param r The ratio. */ void bear::star::set_ratio( double r ) { m_star.set_ratio(r); } // star::set_ratio() plee-the-bear-20251226/bear-engine/lib/src/generic_items/code/straight_slope.cpp000066400000000000000000000206241512343254000273670ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::straight_slope class. * \author Julien Jorge */ #include "generic_items/straight_slope.hpp" #include "universe/collision_align_policy.hpp" #include "universe/collision_info.hpp" #include "engine/export.hpp" BASE_ITEM_EXPORT( straight_slope, bear ) /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ bear::straight_slope::collision_result::collision_result() { } // straight_slope::collision_result::collision_result() /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param a Tell if the other item has been aligned. * \param f The friction of the side collided by the item. */ bear::straight_slope::collision_result::collision_result( bool a, double f ) : align(a), friction(f) { } // straight_slope::collision_result::collision_result() /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ bear::straight_slope::straight_slope() : m_margin(5), m_top_side_is_active(false), m_bottom_side_is_active(false) { set_weak_collisions(false); } // straight_slope::straight_slope() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type bool. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::straight_slope::set_bool_field ( const std::string& name, bool value ) { bool ok(true); if (name == "straight_slope.top_side_is_active") m_top_side_is_active = value; else if (name == "straight_slope.bottom_side_is_active") m_bottom_side_is_active = value; else ok = super::set_bool_field(name, value); return ok; } // straight_slope::set_bool_field() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type \c . * \param name The name of the field to set. * \param value The new value of the field. */ bool bear::straight_slope::set_real_field ( const std::string& name, double value ) { bool result = true; if ( name == "straight_slope.margin" ) m_margin = value; else result = super::set_real_field(name, value); return result; } // straight_slope::set_real_field() /*----------------------------------------------------------------------------*/ /** * \brief Initialize the item. */ void bear::straight_slope::build() { super::build(); init_default_contact_mode ( m_top_side_is_active, m_bottom_side_is_active, false, false ); } // straight_slope::build() /*----------------------------------------------------------------------------*/ /** * \brief Check if the center of the other item is included in the bounds * of \a this before processing the collision. * \param that The other item of the collision. * \param info Some informations about the collision. */ void bear::straight_slope::collision_check_center_included ( engine::base_item& that, universe::collision_info& info ) { const universe::coordinate_type pos_x ( that.get_horizontal_middle() ); const universe::position_type prev_bottom_middle ( info.other_previous_state().get_bottom_middle() ); const universe::coordinate_type prev_top ( info.other_previous_state().get_top() ); if ( (pos_x >= get_left()) && (pos_x <= get_right()) ) { collision_result result(false); if ( (prev_bottom_middle.x >= get_left()) && (prev_bottom_middle.x <= get_right()) ) { if ( (prev_bottom_middle.y >= get_top() ) && (that.get_bottom() < get_top() ) ) result = collision_classic_ground(that, info); else if ( (that.get_top() > get_bottom()) && (prev_top <= get_bottom()) ) result = collision_classic_ceiling(that, info); } else if ( (that.get_bottom() <= get_top()) && (prev_bottom_middle.y >= get_top() - m_margin) ) result = collision_slope_ground(that, info); else if ( (that.get_top() >= get_bottom()) && (prev_top <= get_bottom() + m_margin) ) result = collision_slope_ceiling(that, info); if (result.align) { that.set_contact_friction(result.friction); that.set_contact_angle(0); do_z_shift(that); } } } // straight_slope::collision_check_center_include() /*----------------------------------------------------------------------------*/ /** * \brief Align the other item just like a classic block. * \param that The other item of the collision. * \param info Some informations about the collision. */ bear::straight_slope::collision_result bear::straight_slope::collision_classic_ground ( engine::base_item& that, universe::collision_info& info ) { if ( !m_top_side_is_active ) return collision_result(false); const universe::position_type pos( that.get_left(), get_top() ); const universe::collision_align_policy policy ( get_top_contact_mode( info, pos ) ); return collision_result ( collision_align_top(info, pos, policy), get_top_friction() ); } // straight_slope::collision_classic_ground() /*----------------------------------------------------------------------------*/ /** * \brief Align the other item just like a classic ceiling. * \param that The other item of the collision. * \param info Some informations about the collision. */ bear::straight_slope::collision_result bear::straight_slope::collision_classic_ceiling ( engine::base_item& that, universe::collision_info& info ) { if ( !m_bottom_side_is_active ) return collision_result(false); const universe::position_type pos ( that.get_left(), get_bottom() - that.get_height() ); const universe::collision_align_policy policy ( get_bottom_contact_mode( info, pos ) ); return collision_result ( collision_align_bottom(info, pos, policy), get_bottom_friction() ); } // straight_slope::collision_classic_ceiling() /*----------------------------------------------------------------------------*/ /** * \brief Align the other item when it comes from an adjacent slope. * \param that The other item of the collision. * \param info Some informations about the collision. */ bear::straight_slope::collision_result bear::straight_slope::collision_slope_ground ( engine::base_item& that, universe::collision_info& info ) { if ( !m_top_side_is_active ) return collision_result(false); const universe::position_type pos( that.get_left(), get_top() ); universe::speed_type s = that.get_speed(); if ( s.y > 0 ) { s.y = 0; that.set_speed(s); } const universe::collision_align_policy policy ( get_top_contact_mode( info, pos ) ); return collision_result ( collision_align_top(info, pos, policy), get_top_friction() ); } // straight_slope::collision_slope_ground() /*----------------------------------------------------------------------------*/ /** * \brief Align the other item when it comes from an adjacent ceiling slope. * \param that The other item of the collision. * \param info Some informations about the collision. */ bear::straight_slope::collision_result bear::straight_slope::collision_slope_ceiling ( engine::base_item& that, universe::collision_info& info ) { if ( !m_bottom_side_is_active ) return collision_result(false); const universe::position_type pos ( that.get_left(), get_bottom() - that.get_height() ); universe::speed_type s = that.get_speed(); if ( s.y < 0 ) { s.y = 0; that.set_speed(s); } const universe::collision_align_policy policy ( get_bottom_contact_mode( info, pos ) ); return collision_result ( collision_align_bottom(info, pos, policy), get_bottom_friction() ); } // straight_slope::collision_slope_ceiling() /*----------------------------------------------------------------------------*/ /** * \brief Call collision_check_center_included(). * \param that The other item of the collision. * \param info Some informations about the collision. */ void bear::straight_slope::collision ( engine::base_item& that, universe::collision_info& info ) { if ( satisfy_collision_condition(that) ) collision_check_center_included(that, info); } // straight_slope::collision() plee-the-bear-20251226/bear-engine/lib/src/generic_items/code/teleport_item.cpp000066400000000000000000000051741512343254000272170ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::teleport_item class. * \author Sébastien Angibaud */ #include "generic_items/teleport_item.hpp" #include "engine/game.hpp" #include "engine/level.hpp" #include "engine/world.hpp" BASE_ITEM_EXPORT( teleport_item, bear ) /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ bear::teleport_item::teleport_item() : m_reference(NULL) { } // teleport_item::teleport_item() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type \c item. * \param name The name of the field. * \param value The value of the field. */ bool bear::teleport_item::set_item_field ( const std::string& name, bear::engine::base_item* value ) { bool result(true); if ( name == "teleport_item.reference_point" ) m_reference = handle_type(value); else result = super::set_item_field(name, value); return result; } // teleport_item::set_item_field() /*----------------------------------------------------------------------------*/ /** * \brief Tell if the item is well initialized. */ bool bear::teleport_item::is_valid() const { return m_reference != handle_type(NULL); } // teleport_item::is_valid() /*----------------------------------------------------------------------------*/ /** * \brief Get the gap of the teleportation. */ bear::universe::position_type bear::teleport_item::get_gap() const { if ( m_reference != handle_type() ) return m_reference->get_center_of_mass() - get_center_of_mass(); else return bear::universe::position_type(0,0); } // teleport_item::get_gap() /*----------------------------------------------------------------------------*/ /** * \brief Play the sample. * \param activator (ignored) The item that activates the toggle, if any. */ void bear::teleport_item::on_toggle_on( engine::base_item* activator ) { if ( m_reference != handle_type(NULL) ) { bear::universe::position_type gap ( m_reference->get_center_of_mass() - get_center_of_mass() ); universe::rectangle_type rect = get_level().get_camera_focus(); bear::engine::world::const_item_iterator it; for (it=get_world().living_items_begin(); it!=get_world().living_items_end(); ++it) if ( rect.intersects( it->get_bounding_box() ) ) it->set_center_of_mass(it->get_center_of_mass() + gap); } } // teleport_item::on_toggle_on() plee-the-bear-20251226/bear-engine/lib/src/generic_items/code/time_scale.cpp000066400000000000000000000040151512343254000264410ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::time_scale class. * \author Julien Jorge */ #include "generic_items/time_scale.hpp" #include "engine/game.hpp" BASE_ITEM_EXPORT( time_scale, bear ) /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ bear::time_scale::time_scale() : m_scale(2) { } // time_scale::time_scale() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type "real". * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::time_scale::set_real_field( const std::string& name, double value ) { bool result(true); if ( name == "time_scale.scale" ) m_scale = value; else result = super::set_real_field( name, value ); return result; } // time_scale::set_real_field() /*----------------------------------------------------------------------------*/ /** * \brief Tell if the item is well initialised. */ bool bear::time_scale::is_valid() const { return (m_scale >= 0) && super::is_valid(); } // time_scale::is_valid() /*----------------------------------------------------------------------------*/ /** * \brief Do one step in the progression of the item when the toggle is on. * \param elapsed_time Elapsed time since the last call. */ void bear::time_scale::progress_on( universe::time_type elapsed_time ) { super::progress_on(elapsed_time); engine::game::get_instance().set_time_scale(m_scale); } // time_scale::progress_on() /*----------------------------------------------------------------------------*/ /** * \brief Set scale value. * \param scale The new scale. */ void bear::time_scale::set_scale(double scale) { m_scale = scale; } // time_scale::set_scale() plee-the-bear-20251226/bear-engine/lib/src/generic_items/code/time_scale_on_input_toggle.cpp000066400000000000000000000063251512343254000317230ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::time_scale_on_input_toggle class. * \author Julien Jorge */ #include "generic_items/time_scale_on_input_toggle.hpp" #include "engine/expr/get_toggle_status.hpp" #include "expr/boolean_expression.hpp" #include "generic_items/expr/any_input_pressed.hpp" #include "generic_items/time_scale.hpp" #include "generic_items/trigger.hpp" BASE_ITEM_EXPORT( time_scale_on_input_toggle, bear ) /*----------------------------------------------------------------------------*/ /** * \brief Destructor. */ bear::time_scale_on_input_toggle::~time_scale_on_input_toggle() { delete m_time_scale; } // time_scale_on_input_toggle::~time_scale_on_input_toggle() /*----------------------------------------------------------------------------*/ /** * \brief Initialize the item. */ void bear::time_scale_on_input_toggle::build() { super::build(); time_scale* s = m_time_scale->clone(); s->set_center_of_mass(get_center_of_mass()); const std::vector linked( get_linked_toggles() ); for ( std::size_t i=0; i!=linked.size(); ++i ) s->add_linked_toggle( linked[i] ); new_item(*s); trigger* activator = new trigger( trigger::trigger_condition ); activator->set_center_of_mass( get_center_of_mass() ); activator->set_global( is_global() ); activator->add_toggle(s); new_item(*activator); any_input_pressed* input_check = new any_input_pressed(); input_check->set_center_of_mass( get_center_of_mass() ); input_check->set_global( is_global() ); new_item(*input_check); activator->set_condition ( expr::boolean_expression( engine::get_toggle_status(*this) ) && input_check->get_expression() ); } // time_scale_on_input_toggle::build() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type "item". * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::time_scale_on_input_toggle::set_item_field ( const std::string& name, engine::base_item* value ) { bool result(true); if ( name == "time_scale_on_input_toggle.time_scale" ) m_time_scale = dynamic_cast(value->clone()); else result = super::set_item_field( name, value ); return result; } // time_scale_on_input_toggle::set_item_field() /*----------------------------------------------------------------------------*/ /** * \brief Tell if the item is well initialised. */ bool bear::time_scale_on_input_toggle::is_valid() const { return (m_time_scale != NULL) && super::is_valid(); } // time_scale_on_input_toggle::is_valid() /*----------------------------------------------------------------------------*/ /** * \brief Tell if the item is well initialised. * \param The time_scale item to consider. */ void bear::time_scale_on_input_toggle::set_time_scale_item (const time_scale* time_scale_item) { m_time_scale = dynamic_cast(time_scale_item->clone()); } // time_scale_on_input_toggle::set_time_scale_item() plee-the-bear-20251226/bear-engine/lib/src/generic_items/code/timer.cpp000066400000000000000000000135521512343254000254620ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::timer class. * \author Julien Jorge */ #include "generic_items/timer.hpp" BASE_ITEM_EXPORT( timer, bear ) /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ bear::timer::timer() : m_elapsed_time(0), m_initial_time(0), m_countdown(false), m_loop(false), m_toggle(NULL), m_loops_count(0), m_reset_when_reactivated(true) { set_phantom(true); set_can_move_items(false); set_global(true); } // timer::timer() /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param initial_time The initial time. * \param countdown Indicates if the timer is a countdown. */ bear::timer::timer(bear::universe::time_type initial_time, bool countdown) : m_elapsed_time(0), m_initial_time(initial_time), m_countdown(countdown), m_loop(false), m_toggle(NULL), m_loops_count(0), m_reset_when_reactivated(true) { set_phantom(true); set_can_move_items(false); set_global(true); } // timer::timer() /*----------------------------------------------------------------------------*/ /** * \brief Do one iteration in the progression of the item when turned on. * \param elapsed_time The elapsed time since the last call. */ void bear::timer::progress_on( bear::universe::time_type elapsed_time ) { super::progress_on(elapsed_time); m_elapsed_time += elapsed_time; if ( m_countdown && (m_elapsed_time >= m_initial_time) ) { if ( m_toggle != (engine::with_toggle*)NULL ) m_toggle->toggle(this); if ( m_loop ) { m_elapsed_time -= m_initial_time; ++m_loops_count; } else toggle_off(this); } } // timer::progress_on() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type "bool". * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::timer::set_bool_field( const std::string& name, bool value ) { bool result = true; if ( name == "timer.countdown" ) m_countdown = value; else if ( name == "timer.loop" ) m_loop = value; else if ( name == "timer.reset_when_reactivated" ) m_reset_when_reactivated = value; else result = super::set_bool_field( name, value ); return result; } // timer::set_bool_field() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type real. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::timer::set_real_field( const std::string& name, double value ) { bool result(true); if (name == "timer.time") m_initial_time = value; else result = super::set_real_field( name, value ); return result; } // timer::set_real_field() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type item. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::timer::set_item_field( const std::string& name, engine::base_item* value ) { bool result(true); if (name == "timer.toggle") set_toggle( value ); else result = super::set_item_field( name, value ); return result; } // timer::set_item_field() /*----------------------------------------------------------------------------*/ /** * \brief Return the time. */ bear::universe::time_type bear::timer::get_time() const { if ( m_countdown ) return m_initial_time - m_elapsed_time; else return m_elapsed_time; } // timer::get_time() /*----------------------------------------------------------------------------*/ /** * \brief Return the initial time. */ bear::universe::time_type bear::timer::get_initial_time() const { return m_initial_time; } // timer::get_initial_time() /*----------------------------------------------------------------------------*/ /** * \brief Get the elapsed time since the timer has been turned on. */ bear::universe::time_type bear::timer::get_elapsed_time() const { return m_elapsed_time; } // timer::get_elapsed_time() /*----------------------------------------------------------------------------*/ /** * \brief Return if the timer is a countdown. */ bool bear::timer::is_countdown() const { return m_countdown; } // timer::is_countdown() /*----------------------------------------------------------------------------*/ /** * \brief Tell how many loops the countdown have done. */ std::size_t bear::timer::get_loops() const { return m_loops_count; } // timer::get_loops() /*----------------------------------------------------------------------------*/ /** * \brief Get the toggle activated at the end of the countdown. */ bear::engine::base_item* bear::timer::get_toggle() const { return dynamic_cast(m_toggle.get_item()); } // timer::get_toggle() /*----------------------------------------------------------------------------*/ /** * \brief Set the toggle to activate at the end of the countdown. * \param t The toggle. */ void bear::timer::set_toggle( engine::base_item* t ) { m_toggle = t; } // timer::set_toggle() /*----------------------------------------------------------------------------*/ /** * \brief Turn the timer on. * \param activator The item who activated this toggle. */ void bear::timer::on_toggle_on( engine::base_item* activator ) { super::on_toggle_on( activator ); if ( m_reset_when_reactivated ) { m_elapsed_time = 0; m_loops_count = 0; } } // timer::on_toggle_on() plee-the-bear-20251226/bear-engine/lib/src/generic_items/code/toggle.cpp000066400000000000000000000005571512343254000256240ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::toggle class. * \author Julien Jorge */ #include "generic_items/toggle.hpp" BASE_ITEM_EXPORT( toggle, bear ) plee-the-bear-20251226/bear-engine/lib/src/generic_items/code/toggle_group.cpp000066400000000000000000000047101512343254000270330ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::toggle_group class. * \author Julien Jorge */ #include "generic_items/toggle_group.hpp" BASE_ITEM_EXPORT( toggle_group, bear ) /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type list of items. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::toggle_group::set_item_list_field ( const std::string& name, const std::vector& value ) { bool ok = true; if (name == "toggle_group.toggles") { for (std::size_t i=0; i!=value.size(); ++i) insert(value[i]); } else ok = super::set_item_list_field(name, value); return ok; } // toggle_group::set_item_list_field() /*----------------------------------------------------------------------------*/ /** * \brief Insert a toggle in the group. * \param t The toggle to insert. */ void bear::toggle_group::insert( engine::base_item* t ) { m_toggles.push_back(t); } // toggle_group::insert() /*----------------------------------------------------------------------------*/ /** * \brief Turn on the toggles. * \param activator (ignored) The item that activates the toggle, if any. */ void bear::toggle_group::on_toggle_on( engine::base_item* activator ) { handle_list_type remaining; for ( ; !m_toggles.empty(); m_toggles.pop_front() ) if ( m_toggles.front() != (engine::with_toggle*)NULL ) { remaining.push_back(m_toggles.front()); m_toggles.front()->toggle_on(activator); } std::swap(m_toggles, remaining); } // toggle_group::on_toggle_on() /*----------------------------------------------------------------------------*/ /** * \brief Turn off the toggles. * \param activator (ignored) The item that activates the toggle, if any. */ void bear::toggle_group::on_toggle_off( engine::base_item* activator ) { handle_list_type remaining; for ( ; !m_toggles.empty(); m_toggles.pop_front() ) if ( m_toggles.front() != (engine::with_toggle*)NULL ) { remaining.push_back(m_toggles.front()); m_toggles.front()->toggle_off(activator); } std::swap(m_toggles, remaining); } // toggle_group::on_toggle_off() plee-the-bear-20251226/bear-engine/lib/src/generic_items/code/train.cpp000066400000000000000000000052661512343254000254620ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::train class. * \author Sebastien Angibaud */ #include "generic_items/train.hpp" #include "universe/collision_info.hpp" #include "engine/export.hpp" BASE_ITEM_EXPORT( train, bear ) /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ bear::train::train() { set_global(true); } // train::train() /*----------------------------------------------------------------------------*/ /** * \brief Do post creation actions. */ void bear::train::on_enters_layer() { super::on_enters_layer(); init(get_top_left()); } // bear::train::on_enters_layer() /*----------------------------------------------------------------------------*/ /** * \brief Do one step in the progression of the item. * \param elapsed_time Elasped time since the last progress. */ void bear::train::progress( universe::time_type elapsed_time ) { super::progress( elapsed_time ); update_items(); } // bear::train::progress() /*----------------------------------------------------------------------------*/ /** * \brief Give a string representation of the item. * \param str (out) The result of the convertion. */ void bear::train::to_string( std::string& str ) const { super::to_string(str); base_train::to_string(str); } // train::to_string() /*----------------------------------------------------------------------------*/ /** * \brief Call collision_as_train(). * \param that The other item of the collision. * \param info Some informations about the collision. */ void bear::train::collision ( engine::base_item& that, universe::collision_info& info ) { bool align = collision_check_and_align(that, info); if ( align ) collision_as_base_train(that, info); } // train::collision() /*----------------------------------------------------------------------------*/ /** * \brief Apply the movement of the item. * \param elapsed_time Elasped time since the last call. */ void bear::train::move( universe::time_type elapsed_time ) { super::move(elapsed_time); update_item_positions(get_top_left(), get_speed()); } // train::move() /*----------------------------------------------------------------------------*/ /** * \brief Get the items concerned by a progress/move of this one. * \param d (out) A list to which are added such items. */ void bear::train::get_dependent_items ( universe::physical_item::item_list& d ) const { super::get_dependent_items(d); get_items(d); } // train::get_dependent_items() plee-the-bear-20251226/bear-engine/lib/src/generic_items/code/trigger.cpp000066400000000000000000000165021512343254000260030ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::trigger class. * \author Julien Jorge */ #include "generic_items/trigger.hpp" #include "expr/boolean_constant.hpp" #include "visual/scene_line.hpp" #include "visual/scene_polygon.hpp" BASE_ITEM_EXPORT( trigger, bear ) /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param m The initial mode of the trigger. */ bear::trigger::trigger( mode m ) : m_mode(m) { set_phantom(true); set_can_move_items(false); } // trigger::trigger() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type string. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::trigger::set_string_field ( const std::string& name, const std::string& value ) { bool ok = true; if (name == "trigger.mode") { if (value == "one_way") m_mode = trigger_one_way; else if (value == "switch") m_mode = trigger_switch; else if (value == "condition") m_mode = trigger_condition; else { claw::logger << claw::log_error << '\'' << value << "' is not a valid value for '" << name << '\'' << std::endl; ok = false; } } else ok = super::set_string_field(name, value); return ok; } // trigger::set_string_field() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type item_list. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::trigger::set_item_list_field ( const std::string& name, const std::vector& value ) { bool ok = true; if (name == "trigger.toggle") for( std::size_t i=0; i!=value.size(); ++i ) add_toggle( value[i] ); else ok = super::set_item_list_field(name, value); return ok; } // trigger::set_item_list_field() /*----------------------------------------------------------------------------*/ /** * \brief Get the sprite representing the item. * \param visuals (out) The sprites of the item, and their positions. */ void bear::trigger::get_visual ( std::list& visuals ) const { #ifndef NDEBUG if ( ( get_height() == 0 ) && ( get_width() == 0 ) ) { std::vector points; points.push_back(bear::universe::position_type(-5, -5)); points.push_back(bear::universe::position_type(+5, -5)); points.push_back(bear::universe::position_type(+5, +5)); points.push_back(bear::universe::position_type(-5, +5)); bear::visual::scene_element e ( bear::visual::scene_polygon (get_left(), get_bottom(), claw::graphic::red_pixel, points )); if ( get_condition() ) e = bear::visual::scene_polygon (get_left(), get_bottom(), claw::graphic::green_pixel, points ); e.get_rendering_attributes().set_opacity(0.6); visuals.push_front(e); } #endif // NDEBUG } // trigger::get_visual() /*----------------------------------------------------------------------------*/ /** * \brief Activate the trigger. */ void bear::trigger::activate() { set_condition(expr::boolean_expression(expr::boolean_constant(true))); } // trigger::activate() /*----------------------------------------------------------------------------*/ /** * \brief Deactivate the trigger. */ void bear::trigger::deactivate() { set_condition(expr::boolean_expression(expr::boolean_constant(false))); } // trigger::deactivate() /*----------------------------------------------------------------------------*/ /** * \brief Add a toggle. * \param t The item with the toggle (must inherit from with_toggle). */ void bear::trigger::add_toggle( base_item* t ) { m_toggle.push_back( handle_type((universe::physical_item*)t) ); } // trigger::add_toggle() /*----------------------------------------------------------------------------*/ /** * \brief Gets the items whose behavior depends upon this item. * \param d (out) The itemps depending on this item. */ void bear::trigger::get_dependent_items ( universe::physical_item::item_list& d ) const { super::get_dependent_items( d ); for ( handle_list::const_iterator it=m_toggle.begin(); it!=m_toggle.end(); ++it ) if ( *it != (universe::physical_item*)NULL ) d.push_back( it->get_item() ); } // trigger::get_dependent_items() /*----------------------------------------------------------------------------*/ /** * \brief The condition is verified. * \param activator The item that activates the toggle. */ void bear::trigger::on_trigger_on( base_item* activator ) { switch( m_mode ) { case trigger_one_way: case trigger_condition: set_toggles(activator, true); break; case trigger_switch: switch_toggles(activator); break; } } // item_with_trigger::check_and_toggle() /*----------------------------------------------------------------------------*/ /** * \brief The condition is not verified. * \param activator The item that activates the toggle. */ void bear::trigger::on_trigger_off( base_item* activator ) { switch( m_mode ) { case trigger_one_way: case trigger_switch: break; case trigger_condition: set_toggles(activator, false); break; } } // trigger::on_trigger_off() /*----------------------------------------------------------------------------*/ /** * \brief Set the status of the toggles. * \param activator The item that activates the toggle. * \param b The value applied to the toggles. */ void bear::trigger::set_toggles( base_item* activator, bool b ) { handle_list::iterator it; std::list dead; for (it=m_toggle.begin(); it!=m_toggle.end(); ++it) if ( *it == (engine::with_toggle*)NULL ) dead.push_back(it); else (*it)->toggle(b, activator); for ( ; !dead.empty(); dead.pop_front() ) m_toggle.erase(dead.front()); } // trigger::set_toggles() /*----------------------------------------------------------------------------*/ /** * \brief Switch the status of the toggles. * \param activator The item that activates the toggle. */ void bear::trigger::switch_toggles( base_item* activator ) { handle_list::iterator it; std::list dead; for (it=m_toggle.begin(); it!=m_toggle.end(); ++it) if ( *it == (engine::with_toggle*)NULL ) dead.push_back(it); else (*it)->toggle(activator); for ( ; !dead.empty(); dead.pop_front() ) m_toggle.erase(dead.front()); } // trigger::switch_toggles() /*----------------------------------------------------------------------------*/ /** * \brief Export the methods of the class. */ void bear::trigger::init_exported_methods() { TEXT_INTERFACE_CONNECT_METHOD_0( trigger, activate, void ); TEXT_INTERFACE_CONNECT_METHOD_0( trigger, deactivate, void ); } // trigger::init_exported_methods() /*----------------------------------------------------------------------------*/ TEXT_INTERFACE_IMPLEMENT_METHOD_LIST( bear::trigger ) plee-the-bear-20251226/bear-engine/lib/src/generic_items/code/tweener_item.cpp000066400000000000000000000042741512343254000270320ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::tweener_item class. * \author Sébastien Angibaud */ #include "generic_items/tweener_item.hpp" #include "engine/export.hpp" BASE_ITEM_IMPLEMENT( tweener_item, bear ) /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param t The tweener managed by this item. * \param item An item used as reference for the validity of the tweener. If * \a item is killed then the tweener is abandonned. * \param same_lifespan Tell if \a item must be killed with *this when the * tweener is over. */ bear::tweener_item::tweener_item ( const claw::tween::tweener& t, engine::base_item* item, bool same_lifespan ) : m_item(item), m_same_lifespan(same_lifespan), m_follow_item(item != NULL), m_tweener(t) { set_artificial(true); set_phantom(true); set_can_move_items(false); } // tweener_item::tweener_item() /*----------------------------------------------------------------------------*/ /** * \brief Do post creation actions. */ void bear::tweener_item::on_enters_layer() { super::on_enters_layer(); if ( m_item.get_item() != NULL ) set_center_of_mass( m_item->get_center_of_mass() ); } // tweener_item::on_enters_layer() /*---------------------------------------------------------------------------*/ /** * \brief Do one iteration in the progression of the item. * \param elapsed_time Elapsed time since the last call. */ void bear::tweener_item::progress( universe::time_type elapsed_time ) { super::progress(elapsed_time); const bool item_is_valid = (m_item != (engine::base_item*)NULL); if ( m_follow_item && !item_is_valid ) kill(); else { m_tweener.update(elapsed_time); if ( m_tweener.is_finished() ) { kill(); if ( m_same_lifespan && item_is_valid ) m_item->kill(); } else if ( item_is_valid ) set_center_of_mass( m_item->get_center_of_mass() ); } } // tweener_item::progress() plee-the-bear-20251226/bear-engine/lib/src/generic_items/code/unconditional_killer.cpp000066400000000000000000000020461512343254000305460ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::unconditional_killer class. * \author Julien Jorge */ #include "generic_items/unconditional_killer.hpp" #include "engine/export.hpp" BASE_ITEM_EXPORT( unconditional_killer, bear ) /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ bear::unconditional_killer::unconditional_killer() { set_phantom(true); } // unconditional_killer::unconditional_killer() /*----------------------------------------------------------------------------*/ /** * \brief An item collides with this. Kill him. * \param that The colliding item. * \param info Some informations about the collision. */ void bear::unconditional_killer::collision ( engine::base_item& that, universe::collision_info& info ) { that.kill(); } // unconditional_killer::collision() plee-the-bear-20251226/bear-engine/lib/src/generic_items/code/world_parameters.cpp000066400000000000000000000071301512343254000277070ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::world_parameters class. * \author Julien Jorge */ #include "generic_items/world_parameters.hpp" #include "engine/layer/layer.hpp" #include "engine/world.hpp" BASE_ITEM_EXPORT( world_parameters, bear ) /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ bear::world_parameters::world_parameters() : m_gravity(0, -9.81), m_speed_epsilon(0.1, 0.1), m_angular_speed_epsilon(0.01), m_unit(3000), m_default_friction(1), m_default_density(0), m_default_environment(universe::air_environment) { } // world_parameters::world_parameters() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type "real". * \param name The name of the field. * \param value The value of the field. */ bool bear::world_parameters::set_real_field( const std::string& name, double value ) { bool result = true; if ( name == "world_parameters.gravity.x" ) m_gravity.x = value; else if ( name == "world_parameters.gravity.y" ) m_gravity.y = value; else if ( name == "world_parameters.speed_epsilon.x" ) m_speed_epsilon.x = value; else if ( name == "world_parameters.speed_epsilon.y" ) m_speed_epsilon.y = value; else if ( name == "world_parameters.angular_speed_epsilon" ) m_angular_speed_epsilon = value; else if ( name == "world_parameters.unit" ) m_unit = value; else if ( name == "world_parameters.default_friction" ) m_default_friction = value; else if ( name == "world_parameters.default_density" ) m_default_density = value; else result = super::set_real_field(name, value); return result; } // world_parameters::set_real_field() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type "string". * \param name The name of the field. * \param value The value of the field. */ bool bear::world_parameters::set_string_field ( const std::string& name, const std::string& value ) { bool result = true; if ( name == "world_parameters.default_environment" ) { if ( value == "air_environment" ) m_default_environment = universe::air_environment; else if ( value == "fire_environment" ) m_default_environment = universe::fire_environment; else if ( value == "ice_environment" ) m_default_environment = universe::ice_environment; else if ( value == "water_environment" ) m_default_environment = universe::water_environment; else result = false; } else result = super::set_string_field(name, value); return result; } // world_parameters::set_string_field() /*----------------------------------------------------------------------------*/ /** * \brief Initialize the item. */ void bear::world_parameters::build() { if ( get_layer().has_world() ) { get_layer().get_world().set_unit(m_unit); get_layer().get_world().set_scaled_gravity(m_gravity); get_layer().get_world().set_scaled_speed_epsilon(m_speed_epsilon); get_layer().get_world().set_angular_speed_epsilon (m_angular_speed_epsilon); get_layer().get_world().set_default_friction(m_default_friction); get_layer().get_world().set_default_density(m_default_density); get_layer().get_world().set_default_environment(m_default_environment); } kill(); } // world_parameters::build() plee-the-bear-20251226/bear-engine/lib/src/generic_items/crossfade_sequence.hpp000066400000000000000000000046421512343254000272760ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A decorative sprite. * \author Sebastien Angibaud */ #ifndef __BEAR_CROSSFADE_SEQUENCE_HPP__ #define __BEAR_CROSSFADE_SEQUENCE_HPP__ #include "engine/base_item.hpp" #include "engine/item_brick/with_rendering_attributes.hpp" #include "generic_items/class_export.hpp" #include "universe/derived_item_handle.hpp" #include "engine/scene_visual.hpp" #include "engine/export.hpp" #include namespace bear { /** * \brief A rectangle in which we render a sequence of sprite with fade. * \author Sebastien Angibaud */ class GENERIC_ITEMS_EXPORT crossfade_sequence: public engine::base_item { DECLARE_BASE_ITEM(crossfade_sequence); public: /** \brief The type of the parent class. */ typedef engine::base_item super; private: /** \brief The type of the list of the handles on the items. */ typedef std::vector < bear::universe::derived_item_handle < bear::engine::with_rendering_attributes > > item_list_type; public: crossfade_sequence(); virtual void progress( universe::time_type elapsed_time ); void build(); virtual bool set_bool_field( const std::string& name, bool value ); virtual bool set_real_field( const std::string& name, double value ); virtual bool set_real_list_field ( const std::string& name, const std::vector& value ); virtual bool set_item_list_field ( const std::string& name, const std::vector& value ); virtual bool is_valid() const; private: /** \brief The duration sequence. */ std::vector m_duration_sequence; /** \brief The list of items to reveal. */ item_list_type m_items_sequence; /** \brief The duration since the beginning of the current sprite. */ double m_last_sprite; /** \brief The index of the current sprite. */ unsigned int m_index; /** \brief The duration of fade. */ double m_fadeout_duration; /** \brief Indicates if there is a fadein for the first sprite. */ bool m_fadein_for_first_sprite; /** \brief Indicates if there is a fadeout for the last sprite. */ bool m_fadeout_for_last_sprite; }; // class crossfade_sequence } // namespace bear #endif // __BEAR_CROSSFADE_SEQUENCE_HPP__ plee-the-bear-20251226/bear-engine/lib/src/generic_items/cursor.hpp000066400000000000000000000032721512343254000247500ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A simple decorative cursor. * \author Sebastien Angibaud */ #ifndef __BEAR_CURSOR_HPP__ #define __BEAR_CURSOR_HPP__ #include "engine/item_brick/item_with_input_listener.hpp" #include "generic_items/decorative_item.hpp" #include "generic_items/class_export.hpp" #include "engine/export.hpp" namespace bear { /** * \brief A simple decorative cursor. * \author Sebastien Angibaud * */ class GENERIC_ITEMS_EXPORT cursor: public engine::item_with_input_listener< decorative_item > { DECLARE_BASE_ITEM(cursor); /** \brief The type of the parent class. */ typedef engine::item_with_input_listener< decorative_item > super; public: cursor(); void progress( universe::time_type elapsed_time ); bool set_real_field( const std::string& name, double value ); void get_visual( std::list& visuals ) const; private: bool mouse_move( const claw::math::coordinate_2d& pos ); private: /* \brief The position of the mouse on the screen. We must store its coordinates in order to update the position of the cursor in the level at each iteration. */ claw::math::coordinate_2d m_screen_position; /* \brief The duration before hide the cursor. */ bear::universe::time_type m_visibility_duration; /* \brief The inactive duration. */ bear::universe::time_type m_inactive_duration; }; // class cursor } // namespace bear #endif // __BEAR_CURSOR_HPP__ plee-the-bear-20251226/bear-engine/lib/src/generic_items/debug/000077500000000000000000000000001512343254000240045ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/lib/src/generic_items/debug/code/000077500000000000000000000000001512343254000247165ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/lib/src/generic_items/debug/code/runtime_setting.cpp000066400000000000000000000006161512343254000306450ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Required declarations for the runtime settings. * \author Julien Jorge */ #include "generic_items/debug/runtime_setting.hpp" bear::setting_map bear::g_global_settings; plee-the-bear-20251226/bear-engine/lib/src/generic_items/debug/runtime_setting.hpp000066400000000000000000000036131512343254000277400ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A runtime setting is a debugging feature that allows to set the values * of some settings at runtime. * \author Julien Jorge */ #ifndef __BEAR_RUNTIME_SETTING_HPP__ #define __BEAR_RUNTIME_SETTING_HPP__ #include "generic_items/class_export.hpp" #include #include #include namespace bear { /** \brief The types that can be modified at runtime. */ typedef claw::meta::type_list_maker ::result setting_types; /** \brief The structure in which we store the settings. */ typedef claw::multi_type_map setting_map; extern GENERIC_ITEMS_EXPORT setting_map g_global_settings; #ifndef NDEBUG template bool add_static_debug_settings( F f ) { f(); return true; } // add_static_settings() template void add_debug_setting( std::string name, T var ) { if ( g_global_settings.template exists(name) ) throw claw::exception( "Duplicate debug setting: '" + name + "'" ); g_global_settings.template set(name, var); } #endif } // namespace bear #ifndef NDEBUG #define BEAR_DEBUG_ADD_SETTING(type, var, id) \ bear::add_debug_setting( #id, const_cast(&var) ); #define BEAR_DEBUG_REMOVE_SETTING(type, id) \ bear::g_global_settings.erase( #id ); #define BEAR_DEBUG_ADD_STATIC_SETTINGS(f) \ static bool static_settings = bear::add_static_debug_settings(f); #else #define BEAR_DEBUG_ADD_SETTING(type, var, id) #define BEAR_DEBUG_REMOVE_SETTING(type, id) #define BEAR_DEBUG_ADD_STATIC_SETTINGS(f) #endif #endif // __BEAR_RUNTIME_SETTING_HPP__ plee-the-bear-20251226/bear-engine/lib/src/generic_items/decorative_effect.hpp000066400000000000000000000073031512343254000270730ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A temporary decoration with little effects. * \author Julien Jorge */ #ifndef __BEAR_DECORATIVE_EFFECT_HPP__ #define __BEAR_DECORATIVE_EFFECT_HPP__ #include "engine/base_item.hpp" #include "engine/item_brick/basic_renderable_item.hpp" #include "universe/derived_item_handle.hpp" #include "generic_items/class_export.hpp" #include "engine/export.hpp" namespace bear { /** * \brief A temporary decoration with little effects. * \author Julien Jorge * * This item has no custom fields. * */ class GENERIC_ITEMS_EXPORT decorative_effect: public engine::base_item { DECLARE_BASE_ITEM(decorative_effect); private: /** \brief The type of the parent class. */ typedef engine::base_item super; /** \brief The type of the handle of the modified item. */ typedef universe::derived_item_handle handle_type; public: decorative_effect(); void build(); void progress( universe::time_type elapsed_time ); bool set_bool_field( const std::string& name, bool value ); bool set_item_field( const std::string& name, base_item* value ); bool set_real_field( const std::string& name, double value ); bool set_color_field( const std::string& name, visual::color value ); void set_item ( engine::base_item* item, bool same_lifespan, bool restore = false, bool loop_back = false ); void set_duration(universe::time_type d); universe::time_type get_duration() const; void resize_item( bool r ); void set_size_factor_init(double f); void set_color_init(const visual::color& c); void set_angle_offset_init(double f); void set_size_factor_end(double f); void set_color_end(const visual::color& c); void set_angle_offset_end(double f); void set_size_factor(double init, double end); void set_color (const visual::color& init_color, const visual::color& end_color); void set_angle_offset(double init, double end); private: void apply_effect() const; private: /** \brief The initial rendering attributes, used for the reference. */ visual::bitmap_rendering_attributes m_rendering_attributes; /** \brief The total duration of the effect. */ universe::time_type m_duration; /** \brief Elapsed time since the begining of the effect. */ universe::time_type m_elapsed_time; /** \brief Indicates that the effect has a loop back. */ bool m_loop_back; /** \brief Initial factor applied to the size. */ double m_size_factor_init; /** \brief Final factor applied to the size. */ double m_size_factor_end; /** \brief Initial color. */ visual::color m_color_init; /** \brief Final color. */ visual::color m_color_end; /** \brief Initial offset applied to the angle. */ double m_angle_offset_init; /** \brief Final offset applied to the angle. */ double m_angle_offset_end; /** \brief The item to modify. */ handle_type m_item; /** \brief Tell if m_item must be killed with *this. */ bool m_same_lifespan; /** \brief Tell if the aspect of m_item must be restored at the end of the effect. */ bool m_restore_at_end; /** \brief Tell to resize the item when the size in the rendering attributes is changed. */ bool m_resize_item; /** \brief The initial size of the item. */ universe::size_box_type m_initial_size; }; // class decorative_effect } // namespace bear #endif // __BEAR_DECORATIVE_EFFECT_HPP__ plee-the-bear-20251226/bear-engine/lib/src/generic_items/decorative_flow.hpp000066400000000000000000000052671512343254000266150ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A rectangle in which decorative sprite move according to a flow. * \author Sebastien Angibaud */ #ifndef __BEAR_DECORATIVE_FLOW_HPP__ #define __BEAR_DECORATIVE_FLOW_HPP__ #include "engine/base_item.hpp" #include "engine/item_brick/basic_renderable_item.hpp" #include "engine/item_brick/item_with_decoration.hpp" #include "engine/item_brick/activable_sides.hpp" #include "generic_items/class_export.hpp" #include "engine/scene_visual.hpp" #include "engine/export.hpp" namespace bear { /** * \brief A rectangle in which decorative sprite move according to a flow. * \author Sebastien Angibaud * The fields of this item are * - \a min_speed.x : (real) \c The minimum speed on X-axis (default = 0). * - \a min_speed.y : (real) \c The minimum speed on Y-axis (default = 0). * - \a max_speed.x : (real) \c The maximum speed on X-axis (default = 1). * - \a max_speed.y : (real) \c The maximum speed on Y-axis (default = 1). * - \a items_per_second : (real) \c The number of decoration generated per * second (default = 1). * - any field supported by the parent classes. * */ class GENERIC_ITEMS_EXPORT decorative_flow: public engine::item_with_decoration < engine::basic_renderable_item >, public engine::activable_sides { DECLARE_BASE_ITEM(decorative_flow); private: /** \brief The type of the parent class. */ typedef engine::item_with_decoration < engine::basic_renderable_item > super; public: decorative_flow(); virtual void progress( universe::time_type elapsed_time ); void build(); virtual bool set_real_field( const std::string& name, double value ); virtual void get_visual( std::list& visuals ) const; protected: void populate_loader_map( engine::item_loader_map& m ); private: void update_decorations( universe::time_type elapsed_time ); void create_decoration(); void initiate_decoration(); private: /* \brief The minimum speed of the flow. */ universe::speed_type m_min_speed_flow; /* \brief The maximum speed of the flow. */ universe::speed_type m_max_speed_flow; /* \brief The number of item per second in average. */ double m_item_per_second; std::list< universe::position_type > m_decorations; /* \brief The size of decorations. */ universe::size_box_type m_decoration_size; }; // class decorative_flow } // namespace bear #endif // __BEAR_DECORATIVE_FLOW_HPP__ plee-the-bear-20251226/bear-engine/lib/src/generic_items/decorative_item.hpp000066400000000000000000000067371512343254000266070ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief An item existing only for a decoration purpose. * \author Sebastien Angibaud */ #ifndef __BEAR_DECORATIVE_ITEM_HPP__ #define __BEAR_DECORATIVE_ITEM_HPP__ #include "engine/base_item.hpp" #include "engine/item_brick/basic_renderable_item.hpp" #include "engine/item_brick/item_with_decoration.hpp" #include "engine/item_brick/item_with_text.hpp" #include "generic_items/class_export.hpp" #include "engine/export.hpp" namespace bear { /** * \brief An item existing only for a decoration purpose. * \author Sebastien Angibaud * The fields of this item are * - \a kill_on_contact: (bool) \c Indicates if the item kills himself when * he has a contact (default = false). * - \a kill_when_leaving: (bool) \c Indicates if the item kills himself when * he leaves the active region (default = false). * - \a kill_when finished: (bool) \c Indicates if the item kills himself * when the animation is finished (default = false). * */ class GENERIC_ITEMS_EXPORT decorative_item: public engine::item_with_decoration < engine::item_with_text < engine::basic_renderable_item > > { DECLARE_BASE_ITEM(decorative_item); /** \brief The type of the parent class. */ typedef engine::item_with_decoration < engine::item_with_text < engine::basic_renderable_item > > super; private: /** * \brief The item loader for the decorative item. */ class loader: public engine::item_loader_base { private: /** \brief The type of the parent class. */ typedef engine::item_loader_base super; public: explicit loader( decorative_item& item ); loader* clone() const; bool set_field( const std::string& name, bool value ); bool set_field( const std::string& name, double value ); private: /** \brief The instance loaded by this loader. */ decorative_item& m_item; }; // class loader public: decorative_item(); void progress( universe::time_type elapsed_time ); void get_visual( std::list& visuals ) const; void set_kill_when_finished(bool value); void set_kill_on_contact(bool value); bool get_kill_when_leaving() const; void set_kill_when_leaving(bool value); void set_shadow_x( double v ); void set_shadow_y( double v ); protected: void populate_loader_map( engine::item_loader_map& m ); private: void leaves_active_region(); private: /** \brief Indicates if the item kills himself when the animation is finished. */ bool m_kill_when_finished; /** \brief Indicates if the item kills himself when he has a contact. */ bool m_kill_on_contact; /** \brief Indicates if the item stops himself when he has a bootom contact. */ bool m_stop_on_bottom_contact; /** \brief Tell if the item kills himself when he leaves the active region. */ bool m_kill_when_leaving; /** \brief The offset of the shadow of the visuals on the x-axis. */ visual::coordinate_type m_shadow_x; /** \brief The offset of the shadow of the visuals on the y-axis. */ visual::coordinate_type m_shadow_y; }; // class decorative_item } // namespace bear #endif // __BEAR_DECORATIVE_ITEM_HPP__ plee-the-bear-20251226/bear-engine/lib/src/generic_items/decorative_model.hpp000066400000000000000000000027111512343254000267350ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief An item used to decorative a model. It will just display the model. * \author Julien Jorge */ #ifndef __BEAR_DECORATIVE_MODEL_HPP__ #define __BEAR_DECORATIVE_MODEL_HPP__ #include "engine/base_item.hpp" #include "engine/model.hpp" #include "engine/export.hpp" #include "generic_items/class_export.hpp" namespace bear { /** * \brief An item used to decorative a model. It will just display the model. * * The valid fields for this item are * - \a model_file: (string) the path to the model file. * - \a initial_action: (string) the initial action. * - any field supported by the parent classes. * * \author Julien Jorge */ class GENERIC_ITEMS_EXPORT decorative_model: public engine::model { DECLARE_BASE_ITEM(decorative_model); public: typedef engine::model super; public: bool is_valid() const; void build(); bool set_string_field( const std::string& name, const std::string& value ); private: /** \brief The path to the model to load. */ std::string m_model_path; /** \brief The initial action. */ std::string m_initial_action; }; // class decorative_model } // namespace bear #endif // __BEAR_DECORATIVE_MODEL_HPP__ plee-the-bear-20251226/bear-engine/lib/src/generic_items/decorative_rectangle.hpp000066400000000000000000000042111512343254000275760ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief An item representing a decorative rectangle. * \author Sebastien Angibaud */ #ifndef __BEAR_DECORATIVE_RECTANGLE_HPP__ #define __BEAR_DECORATIVE_RECTANGLE_HPP__ #include "engine/base_item.hpp" #include "engine/item_brick/basic_renderable_item.hpp" #include "engine/scene_visual.hpp" #include "generic_items/class_export.hpp" #include "engine/export.hpp" namespace bear { /** * \brief An item representing a decorative rectangle. * \author Sebastien Angibaud * The fields of this item are * - fill_intensity.red : double, Intensity of the red channel for fill color * (default = 1), * - fill_intensity.green : double, Intensity of the green channel for fill * color (default = 1), * - fill_intensity.blue : double, Intensity of the blue channel for fill * color (default = 1), * - fill_opacity : double, Pixel intensity for fill color (default = 0). * - border_size : double, Size of the border (default = 1). * - any field supported by the parent classes. * */ class GENERIC_ITEMS_EXPORT decorative_rectangle: public engine::basic_renderable_item { DECLARE_BASE_ITEM(decorative_rectangle); /** \brief The type of the parent class. */ typedef engine::basic_renderable_item super; public: decorative_rectangle(); void get_visual( std::list& visuals ) const; bool set_real_field( const std::string& name, double value ); bool set_color_field( const std::string& name, visual::color value ); void set_fill_color( const visual::color& c ); void set_border_color( const visual::color& c ); private: /** \brief The fill color. */ visual::color m_fill_color; /** \brief The border color. */ visual::color m_border_color; /** \brief Size of the border. */ double m_border_size; }; // class decorative_rectangle } // namespace bear #endif // __BEAR_DECORATIVE_RECTANGLE_HPP__ plee-the-bear-20251226/bear-engine/lib/src/generic_items/decorative_toggle.hpp000066400000000000000000000021461512343254000271200ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A minimal toggle, used only for its animations. * \author Julien Jorge */ #ifndef __BEAR_DECORATIVE_TOGGLE_HPP__ #define __BEAR_DECORATIVE_TOGGLE_HPP__ #include "engine/base_item.hpp" #include "engine/item_brick/basic_renderable_item.hpp" #include "engine/item_brick/decorated_item_with_toggle.hpp" #include "generic_items/class_export.hpp" #include "engine/export.hpp" namespace bear { /** * \brief A minimal toggle, used only for its animations. * \author Julien Jorge * * The custom fields of this class are the fields of the parent classes. */ class GENERIC_ITEMS_EXPORT decorative_toggle: public engine::decorated_item_with_toggle < engine::basic_renderable_item > { DECLARE_BASE_ITEM(decorative_toggle); public: decorative_toggle(); }; // class decorative_toggle } // namespace bear #endif // __BEAR_DECORATIVE_TOGGLE_HPP__ plee-the-bear-20251226/bear-engine/lib/src/generic_items/delayed_kill_item.hpp000066400000000000000000000036441512343254000270760ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief An item that kill items after a given duration. * \author Sebastien Angibaud */ #ifndef __BEAR_DELAYED_KILL_ITEM_HPP__ #define __BEAR_DELAYED_KILL_ITEM_HPP__ #include "engine/base_item.hpp" #include "universe/derived_item_handle.hpp" #include "engine/export.hpp" #include "generic_items/class_export.hpp" namespace bear { /** * \brief A item that kills items after a given duration. * * The valid fields for this item are * - \a duration: (real) duration before kill items (default = 0), * - \a killing_items: \c (list of items) The items to kill. * - any field supported by the parent classes. * * \author Sebastien Angiabud */ class GENERIC_ITEMS_EXPORT delayed_kill_item: public engine::base_item { DECLARE_BASE_ITEM(delayed_kill_item); public: /** \brief The type of the parent class. */ typedef engine::base_item super; private: /** \brief The type of the handles on the items to kill. */ typedef universe::derived_item_handle handle_type; public: delayed_kill_item(); void progress( universe::time_type elapsed_time ); virtual bool set_item_list_field ( const std::string& name, const std::vector& value ); virtual bool set_real_field( const std::string& name, double value ); void set_duration(double value); void add_item( base_item* item ); private: /** \brief The list of items to kill. */ std::vector m_items; /** \brief The duration before kill items. */ double m_duration; /** \brief The duration until the start. */ double m_start_duration; }; // class delayed_kill_item } // namespace bear #endif // __BEAR_DELAYED_KILL_ITEM_HPP__ plee-the-bear-20251226/bear-engine/lib/src/generic_items/delayed_level_loading.hpp000066400000000000000000000072471512343254000277340ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief This class starts a level after a given delay. * \author Julien Jorge */ #ifndef __BEAR_DELAYED_LEVEL_LOADING_HPP__ #define __BEAR_DELAYED_LEVEL_LOADING_HPP__ #include "engine/item_brick/item_with_input_listener.hpp" #include "engine/base_item.hpp" #include "engine/export.hpp" #include "generic_items/class_export.hpp" namespace bear { /** * \brief This item starts a level after a given delay or when the user * presses a key. * * The custom fields of this class are : * - \a delay: real, number of seconds of delay (default = infinity), * - \a fade_duration: real, the duration of the fading effect before starting * the level (default = 1), * - \a level: string, required. The name of the game variable containing the * path of the level to load or the name of the level itself, * - \a transition_layer_name: string, the name of the transition layer * receiving the fade effect (default = none). * - \a load_on_input: boolean, tell if the level must starts before the end * of the delay if the user presses a key (default = false), * - any field supported by the parent class. * * \author Julien Jorge */ class GENERIC_ITEMS_EXPORT delayed_level_loading: public engine::item_with_input_listener { DECLARE_BASE_ITEM(delayed_level_loading); public: /** \brief The type of the parent class. */ typedef engine::item_with_input_listener super; public: delayed_level_loading(); delayed_level_loading ( const std::string& level_name, universe::time_type delay, bool load_on_input = false, universe::time_type fade_duration = 1, const std::string& transition_layer_name = "" ); void destroy(); bool set_string_field( const std::string& name, const std::string& value ); bool set_real_field( const std::string& name, double value ); bool set_bool_field( const std::string& name, bool value ); bool is_valid() const; void progress( universe::time_type elapsed_time ); void set_push_mode(bool push_mode); private: void start_fading(); bool key_pressed( const input::key_info& key ); bool button_pressed ( input::joystick::joy_code button, unsigned int joy_index ); bool mouse_pressed( input::mouse::mouse_code button, const claw::math::coordinate_2d& pos ); bool finger_action( const input::finger_event& event ); std::string get_string_from_vars( const std::string& name ) const; private: /** \brief The path of the level to load. */ std::string m_level_path; /** \brief The name of the transition layer receiving the fade effect. */ std::string m_transition_layer_name; /** \brief The time elapsed since the creation of the item. */ universe::time_type m_time; /** \brief The delay before we start the next level. */ universe::time_type m_delay; /** \brief The duration of the fading. */ universe::time_type m_fade_duration; /** \brief Flag set when the item starts to fade before loading. */ bool m_loading; /** \brief Tell if the level must starts before the end of the delay if the user presses a key. */ bool m_load_on_input; /** \brief Tell if the level must be pushed. */ bool m_push_mode; /** \brief The identifier of the fading effect. */ std::size_t m_effect_id; }; // class delayed_level_loading } // namespace bear #endif // __BEAR_DELAYED_LEVEL_LOADING_HPP__ plee-the-bear-20251226/bear-engine/lib/src/generic_items/density_rectangle_creator.hpp000066400000000000000000000025561512343254000306610ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief This class adds a universe::density_rectangle in universe::world * then dies. * \author Sébastien Angibaud */ #ifndef __BEAR_DENSITY_RECTANGLE_CREATOR_HPP__ #define __BEAR_DENSITY_RECTANGLE_CREATOR_HPP__ #include "engine/base_item.hpp" #include "engine/export.hpp" #include "generic_items/class_export.hpp" namespace bear { /** * \brief This class adds a universe::density_rectangle in universe::world * then dies. * * The fields of this item are * - \a zone_density: (real) \c the density in the rectangle (default = 0). * * \author Sébastien angibaud */ class GENERIC_ITEMS_EXPORT density_rectangle_creator: public engine::base_item { DECLARE_BASE_ITEM(density_rectangle_creator); public: /** \brief The type of the parent class. */ typedef engine::base_item super; public: density_rectangle_creator(); bool set_real_field( const std::string& name, double value ); void build(); private: /** \brief Density applied to the items. */ double m_density; }; // class density_rectangle_creator } // namespace bear #endif // __BEAR_DENSITY_RECTANGLE_CREATOR_HPP__ plee-the-bear-20251226/bear-engine/lib/src/generic_items/descending_ceiling.hpp000066400000000000000000000064471512343254000272370ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A ceiling that is not horizontal. * \author Julien Jorge */ #ifndef __BEAR_DESCENDING_CEILING_HPP__ #define __BEAR_DESCENDING_CEILING_HPP__ #include "generic_items/base_ground.hpp" #include "engine/export.hpp" #include "generic_items/class_export.hpp" namespace bear { /** * \brief A ceiling that is not horizontal. * * The parameters accepted by this item are: * - \a steepness: \c real The difference beween the Y-coordinate of the * ceiling's right and left edges, * - \a opposite_side_is_active: \c boolean Turn on/off the alignement on the * top side, * - \a left_side_is_active: \c boolean Turn on/off the alignement on the * left side, * - \a right_side_is_active: \c boolean Turn on/off the alignement on the * right side, * - \a apply_angle: \c boolean Tell if the angle of the ceiling is applied * to the colliding items, * - any field supported by the parent class. * * \author Julien Jorge */ class GENERIC_ITEMS_EXPORT descending_ceiling: public base_ground { DECLARE_BASE_ITEM(descending_ceiling); public: /** \brief The type of the parent class. */ typedef base_ground super; /** \brief The type of the line describing the surface of the ceiling. */ typedef claw::math::line_2d line_type; public: descending_ceiling(); bool set_real_field( const std::string& name, double value ); bool set_bool_field( const std::string& name, bool value ); bool is_valid() const; void build(); universe::coordinate_type get_steepness() const; protected: void collision_as_ceiling ( engine::base_item& that, universe::collision_info& info ); private: void collision ( engine::base_item& that, universe::collision_info& info ); bool check_left_contact_as_ceiling ( engine::base_item& that, universe::collision_info& info ) const; bool check_right_contact_as_ceiling ( engine::base_item& that, universe::collision_info& info ) const; bool check_top_below_ceiling ( engine::base_item& that, universe::collision_info& info ) const; bool align_on_ceiling ( engine::base_item& that, universe::collision_info& info ); bool align_nearest_edge ( engine::base_item& that, universe::collision_info& info ); bool item_crossed_down_up ( engine::base_item& that, const universe::collision_info& info ) const; void apply_angle_to ( engine::base_item& that, const universe::collision_info& info ) const; private: /** \brief The side opposite to the descending_ceiling, is it active ? */ bool m_opposite_side_is_active; /** \brief Tell if the left side of the block is active. */ bool m_left_side_is_active; /** \brief Tell if the right side of the block is active. */ bool m_right_side_is_active; /** \brief Tell if the angle of the ceiling is applied to the colliding items. */ bool m_apply_angle; /** \brief The line of the ground. */ line_type m_line; }; // class descending_ceiling } // namespace bear #endif // __BEAR_DESCENDING_CEILING_HPP__ plee-the-bear-20251226/bear-engine/lib/src/generic_items/environment_rectangle_creator.hpp000066400000000000000000000027711512343254000315450ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief This class adds a universe::environment_rectangle in universe::world * then dies. * \author Sebastien Angibaud */ #ifndef __BEAR_ENVIRONMENT_RECTANGLE_CREATOR_HPP__ #define __BEAR_ENVIRONMENT_RECTANGLE_CREATOR_HPP__ #include "engine/base_item.hpp" #include "universe/environment_type.hpp" #include "engine/export.hpp" #include "generic_items/class_export.hpp" namespace bear { /** * \brief This class adds a universe::environment_rectangle in * universe::world then dies. * * The fields of this item are * - \a environment: (string) * \c the environment in the rectangle: (default = "air_environment"). * \author Sebastien Angibaud */ class GENERIC_ITEMS_EXPORT environment_rectangle_creator: public engine::base_item { DECLARE_BASE_ITEM(environment_rectangle_creator); public: /** \brief The type of the parent class. */ typedef engine::base_item super; public: environment_rectangle_creator(); bool set_string_field( const std::string& name, const std::string& value ); void build(); private: /** \brief Environment applied to the items. */ bear::universe::environment_type m_environment; }; // class environment_rectangle_creator } // namespace bear #endif // __BEAR_ENVIRONMENT_RECTANGLE_CREATOR_HPP__ plee-the-bear-20251226/bear-engine/lib/src/generic_items/explosion_effect_item.hpp000066400000000000000000000056661512343254000300160ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief An item that create dust decorative items and throws splinter * decorative items. * \author Sebastien Angibaud */ #ifndef __BEAR_EXPLOSION_EFFECT_ITEM_HPP__ #define __BEAR_EXPLOSION_EFFECT_ITEM_HPP__ #include "engine/base_item.hpp" #include "generic_items/class_export.hpp" #include "engine/export.hpp" namespace bear { /** * \brief An item that create dust decorative items and throws splinter * decorative items. * \author Sebastien Angibaud * The fields of this item are * - \a dust_animations : (list of animations) * \c List of animations for dust items. * - \a splinter_animations : (list of animation) * \c List of animations for splinter items. * \- \a force : (real)\c The force given at created splinter items * (default = 0). * \- \a dust_count : (unsigned int)\c Number of dust items to create * (default = 100). * \- \a splinter_count : (unsigned int)\c Number of splinter items to * create (default = 10). * - any field supported by the parent classes. */ class GENERIC_ITEMS_EXPORT explosion_effect_item: public engine::base_item { DECLARE_BASE_ITEM(explosion_effect_item); private: /** \brief The type of the parent class. */ typedef engine::base_item super; public: explosion_effect_item(); void progress( universe::time_type elapsed_time ); bool set_animation_list_field ( const std::string& name, const std::vector& value ); bool set_real_field( const std::string& name, double value ); bool set_u_integer_field( const std::string& name, unsigned int value ); void add_splinter_animation(const visual::animation& anim); void add_dust_animation(const visual::animation& anim); void set_force(double force); void set_splinter_count( unsigned int splinter_count); void set_dust_count( unsigned int dust_count); private: void create_dust_items(); void create_dust_item (unsigned int dust_index, bear::universe::position_type pos); void create_splinter_items(); void create_splinter_item (unsigned int splinter_index, bear::universe::position_type pos); private: /* \brief List of animations for dust items. */ std::vector m_dust_animations; /* \brief List of animations for splinter items. */ std::vector m_splinter_animations; /* \brief The force given at created splinter items. */ universe::coordinate_type m_force; /* \brief Number of dust items to create. */ unsigned int m_dust_count; /* \brief Number of splinter items to create. */ unsigned int m_splinter_count; }; // class explosion_effect_item } // namespace bear #endif // __BEAR_EXPLOSION_EFFECT_ITEM_HPP__ plee-the-bear-20251226/bear-engine/lib/src/generic_items/expr/000077500000000000000000000000001512343254000236745ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/lib/src/generic_items/expr/any_input_pressed.hpp000066400000000000000000000041171512343254000301430ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A boolean expression that returns true if any input is pressed. * \author Julien Jorge */ #ifndef __BEAR_ANY_INPUT_PRESSED_HPP__ #define __BEAR_ANY_INPUT_PRESSED_HPP__ #include "engine/base_item.hpp" #include "engine/item_brick/item_with_input_listener.hpp" #include "engine/item_brick/with_boolean_expression_creation.hpp" #include "generic_items/class_export.hpp" #include "engine/export.hpp" namespace bear { class timer; /** * \brief A boolean expression that returns true if any input is pressed. * * This item has no custom fields. * * \author Julien Jorge */ class GENERIC_ITEMS_EXPORT any_input_pressed: public engine::item_with_input_listener, public engine::with_boolean_expression_creation { DECLARE_BASE_ITEM(any_input_pressed); public: /** \brief The type of the parent class. */ typedef engine::item_with_input_listener super; public: any_input_pressed(); virtual void progress( universe::time_type elapsed_time ); private: virtual expr::boolean_expression do_get_expression() const; bool key_pressed( const input::key_info& key ); bool button_pressed ( input::joystick::joy_code button, unsigned int joy_index ); bool mouse_pressed ( input::mouse::mouse_code button, const claw::math::coordinate_2d& pos ); bool key_maintained( const input::key_info& key ); bool button_maintained ( input::joystick::joy_code button, unsigned int joy_index ); bool mouse_maintained ( input::mouse::mouse_code button, const claw::math::coordinate_2d& pos ); bool finger_action( const input::finger_event& event ); private: /** \brief Tell if a key or a button is pressed. */ bool m_pressed; }; // class any_input_pressed } // namespace bear #endif // __BEAR_ANY_INPUT_PRESSED_HPP__ plee-the-bear-20251226/bear-engine/lib/src/generic_items/expr/applied_expression.hpp000066400000000000000000000056631512343254000303140ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief This class gives a boolean expression to one engine::with_trigger or * more, then die. * \author Julien Jorge */ #ifndef __BEAR_APPLIED_EXPRESSION_HPP__ #define __BEAR_APPLIED_EXPRESSION_HPP__ #include "engine/base_item.hpp" #include "engine/item_brick/with_expression_assignment.hpp" #include "engine/item_brick/with_expression_creation.hpp" #include "generic_items/class_export.hpp" #include "engine/export.hpp" namespace bear { /** * \brief This class gives a boolean expression to one engine::with_trigger or * more, then die. * * The fields of this item are * - \a expression: (item) \b [required] The expression. Must inherit from * engine::with_expression_creation, * - \a trigger: (item) \b [required] The triggers to which the condition * is applied. Must inherit from engine::with_trigger. * * \author Julien Jorge */ template class applied_expression: public engine::base_item { public: /** \brief The type of the parent class. */ typedef engine::base_item super; private: /** \brief The base class of the expression. */ typedef typename Expression::base_expression_type base_expression_type; /** \brief The type of the instances receiving the expression. */ typedef typename engine::with_expression_assignment < base_expression_type >::assignment_class_type assignment_class_type; /** \brief The type of the instances from which we get the expression. */ typedef typename engine::with_expression_creation < base_expression_type >::creation_class_type creation_class_type; public: bool set_item_field( const std::string& name, engine::base_item* value ); bool set_item_list_field ( const std::string& name, const std::vector& value ); bool is_valid() const; void build(); private: /** \brief The items receiving the expression. */ std::vector m_items; /** \brief The expression. */ Expression m_expression; }; // class applied_expression /** \brief Applied expression for boolean expressions. */ class GENERIC_ITEMS_EXPORT applied_boolean_expression: public applied_expression { DECLARE_BASE_ITEM(applied_boolean_expression); }; // class applied_boolean_expression /** \brief Applied expression for linear expressions. */ class GENERIC_ITEMS_EXPORT applied_linear_expression: public applied_expression { DECLARE_BASE_ITEM(applied_linear_expression); }; // class applied_linear_expression } // namespace bear #include "generic_items/expr/impl/applied_expression.tpp" #endif // __BEAR_APPLIED_EXPRESSION_HPP__ plee-the-bear-20251226/bear-engine/lib/src/generic_items/expr/boolean_constant_creator.hpp000066400000000000000000000031761512343254000314630ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Class to create an item that is a boolean constant. * \author Sébastien Angibaud */ #ifndef __BEAR_BOOLEAN_CONSTANT_CREATOR_HPP__ #define __BEAR_BOOLEAN_CONSTANT_CREATOR_HPP__ #include "engine/base_item.hpp" #include "expr/boolean_constant.hpp" #include "engine/item_brick/with_boolean_expression_creation.hpp" #include "engine/export.hpp" #include "generic_items/class_export.hpp" namespace bear { /** * \brief This class is a boolean expression of type "boolean_constant". * * This item is a parameter for other items. He kills himself at the end of * his build() method. * * The fields of this item are * - \a operand: (boolean) \c the value of the constant. * * \author Sébastien Angibaud */ class GENERIC_ITEMS_EXPORT boolean_constant_creator: public engine::base_item, public engine::with_boolean_expression_creation { DECLARE_BASE_ITEM(boolean_constant_creator); public: /** \brief The type of the parent class. */ typedef engine::base_item super; public: boolean_constant_creator(); bool set_bool_field( const std::string& name, bool value ); void build(); private: virtual expr::boolean_expression do_get_expression() const; private: /** \brief The expression created by this item. */ expr::boolean_constant m_expr; }; // class boolean_constant_creator } // namespace bear #endif // __BEAR_BOOLEAN_CONSTANT_CREATOR_HPP__ plee-the-bear-20251226/bear-engine/lib/src/generic_items/expr/check_item_class_creator.hpp000066400000000000000000000041541512343254000314100ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief This class is a boolean expression of type "check_item_class". * \author Julien Jorge */ #ifndef __BEAR_CHECK_ITEM_CLASS_CREATOR_HPP__ #define __BEAR_CHECK_ITEM_CLASS_CREATOR_HPP__ #include "engine/base_item.hpp" #include "engine/item_brick/with_boolean_expression_creation.hpp" #include "engine/export.hpp" #include "generic_items/class_export.hpp" namespace bear { namespace engine { class with_trigger; } // namespace engine /** * \brief This class is a boolean expression of type "check_item_class". * * This item is a parameter for the items of type applied_boolean_expression. * He kills himself at the end of his build() method. * * The fields of this item are * - \a collision_data: (item) \b [required] \c the item from which we take * the collision data. Must inherit from engine::with_trigger, * - \a class_name: (string) \b [required] \c the name of the class to pass * to check_item_class. * * \author Julien Jorge */ class GENERIC_ITEMS_EXPORT check_item_class_creator: public engine::base_item, public engine::with_boolean_expression_creation { DECLARE_BASE_ITEM(check_item_class_creator); public: /** \brief The type of the parent class. */ typedef engine::base_item super; public: bool set_string_list_field ( const std::string& name, const std::vector& value ); bool set_item_field( const std::string& name, engine::base_item* value ); bool is_valid() const; void build(); private: virtual expr::boolean_expression do_get_expression() const; private: /** \brief The list of the class names to check. */ std::vector m_class_name; /** \brief the item from which we take the collision data. */ engine::with_trigger* m_collision_data; }; // class check_item_class_creator } // namespace bear #endif // __BEAR_CHECK_ITEM_CLASS_CREATOR_HPP__ plee-the-bear-20251226/bear-engine/lib/src/generic_items/expr/check_item_instance_creator.hpp000066400000000000000000000053621512343254000321110ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief This class is a boolean expression of type "check_item_instance". * \author Julien Jorge */ #ifndef __BEAR_CHECK_ITEM_INSTANCE_CREATOR_HPP__ #define __BEAR_CHECK_ITEM_INSTANCE_CREATOR_HPP__ #include "engine/base_item.hpp" #include "engine/item_brick/with_boolean_expression_creation.hpp" #include "engine/export.hpp" #include "generic_items/class_export.hpp" namespace bear { namespace engine { class with_trigger; } // namespace engine /** * \brief This class is a boolean expression of type "check_item_instance". * * This item is a parameter for the items of type applied_boolean_expression. * He kills himself at the end of his build() method. * * The fields of this item are * - \a collision_data: (item) \b [required] \c the item from which we take * the collision data. Must inherit from engine::with_trigger, * - \a instance: (list of item) \b [required] \c the instances that validate * the expression. * * \author Julien Jorge */ class GENERIC_ITEMS_EXPORT check_item_instance_creator: public engine::base_item, public engine::with_boolean_expression_creation { DECLARE_BASE_ITEM(check_item_instance_creator); public: /** \brief The type of the parent class. */ typedef engine::base_item super; /** * \brief The item loader for the level settings. */ class loader: public engine::item_loader_base { private: /** \brief The type of the parent class. */ typedef engine::item_loader_base super; public: explicit loader( check_item_instance_creator& creator ); loader* clone() const; bool set_field( const std::string& name, engine::base_item* value ); bool set_field ( const std::string& name, const std::vector& value ); private: /** \brief The instance through which we set the parameters. */ check_item_instance_creator& m_creator; }; // class loader private: friend class loader; public: bool is_valid() const; void build(); private: virtual expr::boolean_expression do_get_expression() const; virtual void populate_loader_map( engine::item_loader_map& m ); private: /** \brief The list of the instances that validate the expression. */ std::vector m_instance; /** \brief the item from which we take the collision data. */ engine::with_trigger* m_collision_data; }; // class check_item_instance_creator } // namespace bear #endif // __BEAR_CHECK_ITEM_INSTANCE_CREATOR_HPP__ plee-the-bear-20251226/bear-engine/lib/src/generic_items/expr/check_system_name_creator.hpp000066400000000000000000000042341512343254000316100ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief This class is a boolean expression of type "check_item_class". * \author Julien Jorge */ #ifndef __BEAR_CHECK_SYSTEM_NAME_CREATOR_HPP__ #define __BEAR_CHECK_SYSTEM_NAME_CREATOR_HPP__ #include "engine/base_item.hpp" #include "engine/item_brick/with_boolean_expression_creation.hpp" #include "engine/export.hpp" #include "generic_items/class_export.hpp" namespace bear { /** * \brief This class is a boolean expression telling if the game is running on * a specific system. * * The fields of this item are * - \a system_name: (string) \b [required] \c the name of the system to * test. * * \author Julien Jorge */ class GENERIC_ITEMS_EXPORT check_system_name_creator: public engine::base_item, public engine::with_boolean_expression_creation { DECLARE_BASE_ITEM(check_system_name_creator); public: /** \brief The type of the parent class. */ typedef engine::base_item super; private: /** * The item loader associated with check_system_name_creator. */ class loader: public engine::item_loader_base { private: /** \brief The type of the parent class. */ typedef engine::item_loader_base super; public: explicit loader( check_system_name_creator& item ); loader* clone() const; bool set_field( const std::string& name, const std::string& value ); private: /** \brief The item we are loading. */ check_system_name_creator& m_item; }; // class loader private: friend class loader; public: bool is_valid() const; void build(); private: virtual expr::boolean_expression do_get_expression() const; virtual void populate_loader_map( engine::item_loader_map& m ); private: /** \brief The name of the system for which the expression is true. */ std::string m_system_name; }; // class check_system_name_creator } // namespace bear #endif // __BEAR_CHECK_SYSTEM_NAME_CREATOR_HPP__ plee-the-bear-20251226/bear-engine/lib/src/generic_items/expr/code/000077500000000000000000000000001512343254000246065ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/lib/src/generic_items/expr/code/any_input_pressed.cpp000066400000000000000000000077511512343254000310570ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::any_input_pressed class. * \author Julien Jorge */ #include "generic_items/expr/any_input_pressed.hpp" #include "expr/boolean_variable.hpp" BASE_ITEM_EXPORT(any_input_pressed, bear) /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ bear::any_input_pressed::any_input_pressed() : m_pressed(false) { } // any_input_pressed::any_input_pressed() /*----------------------------------------------------------------------------*/ /** * \brief Do one step in the progress of the item. * \param elapsed_time The elapsed time since the last call. */ void bear::any_input_pressed::progress( universe::time_type elapsed_time ) { m_pressed = false; progress_input_reader(elapsed_time); } // any_input_pressed::progress() /*----------------------------------------------------------------------------*/ /** * \brief Get the expression created by this item. */ bear::expr::boolean_expression bear::any_input_pressed::do_get_expression() const { return expr::boolean_variable( m_pressed ); } // any_input_pressed::do_get_expression() /*----------------------------------------------------------------------------*/ /** * \brief A keyboard key has been pressed. * \param key The code of the key. */ bool bear::any_input_pressed::key_pressed ( const bear::input::key_info& key ) { m_pressed = true; return false; } // any_input_pressed::key_pressed() /*----------------------------------------------------------------------------*/ /** * \brief A joystick button has been pressed. * \param button The code of the button. * \param joy_index The index of the joystick. */ bool bear::any_input_pressed::button_pressed ( input::joystick::joy_code button, unsigned int joy_index ) { m_pressed = true; return false; } // any_input_pressed::button_pressed() /*----------------------------------------------------------------------------*/ /** * \brief A mouse button has been pressed. * \param button The code of the button. * \param pos The position of the cursor on the screen. */ bool bear::any_input_pressed::mouse_pressed ( input::mouse::mouse_code button, const claw::math::coordinate_2d& pos ) { m_pressed = true; return false; } // any_input_pressed::mouse_pressed() /*----------------------------------------------------------------------------*/ /** * \brief A keyboard key has been maintained. * \param key The code of the key. */ bool bear::any_input_pressed::key_maintained ( const bear::input::key_info& key ) { m_pressed = true; return false; } // any_input_pressed::key_maintained() /*----------------------------------------------------------------------------*/ /** * \brief A joystick button has been maintained. * \param button The code of the button. * \param joy_index The index of the joystick. */ bool bear::any_input_pressed::button_maintained ( input::joystick::joy_code button, unsigned int joy_index ) { m_pressed = true; return false; } // any_input_pressed::button_maintained() /*----------------------------------------------------------------------------*/ /** * \brief A mouse button has been maintained. * \param button The code of the button. * \param pos The position of the cursor on the screen. */ bool bear::any_input_pressed::mouse_maintained ( input::mouse::mouse_code button, const claw::math::coordinate_2d& pos ) { m_pressed = true; return false; } // any_input_pressed::mouse_maintained() /*----------------------------------------------------------------------------*/ /** * \brief A finger has been used. * \param event The event describing the usage of the finger. */ bool bear::any_input_pressed::finger_action( const input::finger_event& event ) { m_pressed = true; return false; } // any_input_pressed::finger_action() plee-the-bear-20251226/bear-engine/lib/src/generic_items/expr/code/applied_expression.cpp000066400000000000000000000007721512343254000312150ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::applied_boolean_expression class. * \author Julien Jorge */ #include "generic_items/expr/applied_expression.hpp" #include "engine/export.hpp" BASE_ITEM_EXPORT( applied_boolean_expression, bear ) BASE_ITEM_EXPORT( applied_linear_expression, bear ) plee-the-bear-20251226/bear-engine/lib/src/generic_items/expr/code/boolean_constant_creator.cpp000066400000000000000000000033551512343254000323670ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::boolean_constant_creator class. * \author Sébastien Angibaud */ #include "generic_items/expr/boolean_constant_creator.hpp" #include BASE_ITEM_EXPORT( boolean_constant_creator, bear ) /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type "boolean". */ bear::boolean_constant_creator::boolean_constant_creator() : m_expr(false) { } // boolean_constant_creator::boolean_constant_creator() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type "boolean". * \param name The name of the field. * \param value The value of the field. */ bool bear::boolean_constant_creator::set_bool_field ( const std::string& name, bool value ) { bool result = true; if ( name == "boolean_constant_creator.value" ) m_expr.set_value( value ); else result = super::set_bool_field(name, value); return result; } // boolean_constant_creator::set_bool_field() /*----------------------------------------------------------------------------*/ /** * \brief Initialize the item. */ void bear::boolean_constant_creator::build() { kill(); } // boolean_constant_creator::build() /*----------------------------------------------------------------------------*/ /** * \brief Get the expression created by this item. */ bear::expr::boolean_expression bear::boolean_constant_creator::do_get_expression() const { return m_expr; } // boolean_constant_creator::do_get_expression() plee-the-bear-20251226/bear-engine/lib/src/generic_items/expr/code/check_item_class_creator.cpp000066400000000000000000000061621512343254000323160ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::check_item_class_creator class. * \author Julien Jorge */ #include "generic_items/expr/check_item_class_creator.hpp" #include "expr/boolean_constant.hpp" #include "engine/expr/check_item_class.hpp" #include "engine/item_brick/with_trigger.hpp" #include "engine/export.hpp" #include BASE_ITEM_EXPORT( check_item_class_creator, bear ) /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type "string". * \param name The name of the field. * \param value The value of the field. */ bool bear::check_item_class_creator::set_string_list_field ( const std::string& name, const std::vector& value ) { bool result = true; if ( name == "check_item_class_creator.class_name" ) m_class_name = value; else result = super::set_string_list_field(name, value); return result; } // check_item_class_creator::set_string_list_field() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type "item". * \param name The name of the field. * \param value The value of the field. */ bool bear::check_item_class_creator::set_item_field ( const std::string& name, engine::base_item* value ) { bool result = true; if ( name == "check_item_class_creator.collision_data") { engine::with_trigger* t( dynamic_cast(value) ); if ( t != NULL ) m_collision_data = t; else claw::logger << claw::log_error << name << ": the item is not of type 'engine::with_trigger'." << std::endl; } else result = super::set_item_field(name, value); return result; } // check_item_class_creator::set_item_field() /*----------------------------------------------------------------------------*/ /** * \brief Tell if all required fields are initialized. */ bool bear::check_item_class_creator::is_valid() const { return !m_class_name.empty() && (m_collision_data != NULL) && super::is_valid(); } // check_item_class_creator::is_valid() /*----------------------------------------------------------------------------*/ /** * \brief Initialize the item. */ void bear::check_item_class_creator::build() { kill(); } // check_item_class_creator::build() /*----------------------------------------------------------------------------*/ /** * \brief Get the expression created by this item. */ bear::expr::boolean_expression bear::check_item_class_creator::do_get_expression() const { expr::boolean_expression result( expr::boolean_constant(false) ); for ( std::size_t i=0; i!=m_class_name.size(); ++i ) { engine::check_item_class e; e.set_class_name( m_class_name[i] ); e.set_collision_data( m_collision_data->get_collision_in_expression() ); result = result || e; } return result; } // check_item_class_creator::do_get_expression() plee-the-bear-20251226/bear-engine/lib/src/generic_items/expr/code/check_item_instance_creator.cpp000066400000000000000000000105521512343254000330130ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::check_item_instance_creator class. * \author Julien Jorge */ #include "generic_items/expr/check_item_instance_creator.hpp" #include "expr/boolean_constant.hpp" #include "engine/expr/check_item_instance.hpp" #include "engine/item_brick/with_trigger.hpp" #include "engine/export.hpp" #include /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param creator The instance through which we set the parameters. */ bear::check_item_instance_creator::loader::loader ( check_item_instance_creator& creator ) : super("check_item_instance_creator"), m_creator(creator) { } // check_item_instance_creator::loader::loader() /*----------------------------------------------------------------------------*/ /** * \brief Creates a copy of this instance. */ bear::check_item_instance_creator::loader* bear::check_item_instance_creator::loader::clone() const { return new loader( *this ); } // check_item_instance_creator::loader::clone() /*----------------------------------------------------------------------------*/ /** * \brief Sets a field of type \c item. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::check_item_instance_creator::loader::set_field ( const std::string& name, engine::base_item* value ) { bool result = true; if ( name == "collision_data") { engine::with_trigger* t( dynamic_cast(value) ); if ( t != NULL ) m_creator.m_collision_data = t; else claw::logger << claw::log_error << name << ": the item is not of type 'engine::with_trigger'." << std::endl; } else result = super::set_field(name, value); return result; } // check_item_instance_creator::loader::set_field() /*----------------------------------------------------------------------------*/ /** * \brief Sets a field of type \c list of item. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::check_item_instance_creator::loader::set_field ( const std::string& name, const std::vector& value ) { bool result = true; if ( name == "instance") m_creator.m_instance = value; else result = super::set_field(name, value); return result; } // check_item_instance_creator::loader::set_field() BASE_ITEM_EXPORT( check_item_instance_creator, bear ) /*----------------------------------------------------------------------------*/ /** * \brief Tell if all required fields are initialized. */ bool bear::check_item_instance_creator::is_valid() const { return !m_instance.empty() && (m_collision_data != NULL) && super::is_valid(); } // check_item_instance_creator::is_valid() /*----------------------------------------------------------------------------*/ /** * \brief Initialize the item. */ void bear::check_item_instance_creator::build() { kill(); } // check_item_instance_creator::build() /*----------------------------------------------------------------------------*/ /** * \brief Get the expression created by this item. */ bear::expr::boolean_expression bear::check_item_instance_creator::do_get_expression() const { expr::boolean_expression result( expr::boolean_constant(false) ); for ( std::size_t i=0; i!=m_instance.size(); ++i ) { engine::check_item_instance e; e.set_instance( m_instance[i] ); e.set_collision_data( m_collision_data->get_collision_in_expression() ); result = result || e; } return result; } // check_item_instance_creator::do_get_expression() /*----------------------------------------------------------------------------*/ /** * \brief Adds the loaders of this item class into a given loader map. * \param m The map in which the loaders are inserted. */ void bear::check_item_instance_creator::populate_loader_map ( engine::item_loader_map& m ) { super::populate_loader_map(m); m.insert( loader( *this ) ); } // check_item_instance_creator::populate_loader_map() plee-the-bear-20251226/bear-engine/lib/src/generic_items/expr/code/check_system_name_creator.cpp000066400000000000000000000062521512343254000325170ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::check_system_name_creator class. * \author Julien Jorge */ #include "generic_items/expr/check_system_name_creator.hpp" #include "expr/boolean_constant.hpp" #include "engine/export.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param item The instance through which we set the parameters. */ bear::check_system_name_creator::loader::loader ( check_system_name_creator& item ) : super("check_system_name_creator"), m_item(item) { } // check_system_name_creator::loader::loader() /*----------------------------------------------------------------------------*/ /** * \brief Creates a copy of this instance. */ bear::check_system_name_creator::loader* bear::check_system_name_creator::loader::clone() const { return new loader( *this ); } // check_system_name_creator::loader::clone() /*----------------------------------------------------------------------------*/ /** * \brief Sets a field of type \c string. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::check_system_name_creator::loader::set_field ( const std::string& name, const std::string& value ) { bool result = true; if ( name == "system_name") m_item.m_system_name = value; else result = super::set_field(name, value); return result; } // check_system_name_creator::loader::set_field() BASE_ITEM_EXPORT( check_system_name_creator, bear ) /*----------------------------------------------------------------------------*/ /** * \brief Tell if all required fields are initialized. */ bool bear::check_system_name_creator::is_valid() const { return !m_system_name.empty(); } // check_system_name_creator::is_valid() /*----------------------------------------------------------------------------*/ /** * \brief Initialize the item. */ void bear::check_system_name_creator::build() { kill(); } // check_system_name_creator::build() /*----------------------------------------------------------------------------*/ /** * \brief Get the expression created by this item. */ bear::expr::boolean_expression bear::check_system_name_creator::do_get_expression() const { std::string system_name; #ifdef __ANDROID__ system_name = "android"; #elif defined(_WIN32) system_name = "windows"; #else system_name = "unix"; #endif return expr::boolean_expression ( expr::boolean_constant( system_name == m_system_name ) ); } // check_system_name_creator::do_get_expression() /*----------------------------------------------------------------------------*/ /** * \brief Adds the loaders of this item class into a given loader map. * \param m The map in which the loaders are inserted. */ void bear::check_system_name_creator::populate_loader_map ( engine::item_loader_map& m ) { super::populate_loader_map(m); m.insert( loader( *this ) ); } // check_system_name_creator::populate_loader_map() plee-the-bear-20251226/bear-engine/lib/src/generic_items/expr/code/expression_creator.cpp000066400000000000000000000015001512343254000312240ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the classes inheriting from * bear::expression_creator. * \author Julien Jorge */ #include "generic_items/expr/expression_creator.hpp" BASE_ITEM_EXPORT( boolean_equality_creator, bear ) BASE_ITEM_EXPORT( boolean_disequality_creator, bear ) BASE_ITEM_EXPORT( logical_and_creator, bear ) BASE_ITEM_EXPORT( logical_or_creator, bear ) BASE_ITEM_EXPORT( linear_equality_creator, bear ) BASE_ITEM_EXPORT( linear_plus_creator, bear ) BASE_ITEM_EXPORT( linear_minus_creator, bear ) BASE_ITEM_EXPORT( linear_multiplies_creator, bear ) BASE_ITEM_EXPORT( linear_divides_creator, bear ) plee-the-bear-20251226/bear-engine/lib/src/generic_items/expr/code/get_toggle_status_creator.cpp000066400000000000000000000042151512343254000325560ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::get_toggle_status_creator class. * \author Julien Jorge */ #include "generic_items/expr/get_toggle_status_creator.hpp" #include "engine/item_brick/with_toggle.hpp" #include "engine/export.hpp" #include BASE_ITEM_EXPORT( get_toggle_status_creator, bear ) /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type "item". * \param name The name of the field. * \param value The value of the field. */ bool bear::get_toggle_status_creator::set_item_field ( const std::string& name, engine::base_item* value ) { bool result = true; if ( name == "get_toggle_status_creator.toggle") { engine::with_toggle* t( dynamic_cast(value) ); if ( t != NULL ) m_expr.set_toggle( *value ); else claw::logger << claw::log_error << name << ": the item is not of type 'engine::with_toggle'." << std::endl; } else result = super::set_item_field(name, value); return result; } // get_toggle_status_creator::set_item_field() /*----------------------------------------------------------------------------*/ /** * \brief Initialize the item. */ void bear::get_toggle_status_creator::build() { kill(); } // get_toggle_status_creator::build() /*----------------------------------------------------------------------------*/ /** * \brief Tell if all required fields are initialized. */ bool bear::get_toggle_status_creator::is_valid() const { return (m_expr.get_toggle() != NULL) && super::is_valid(); } // get_toggle_status_creator::is_valid() /*----------------------------------------------------------------------------*/ /** * \brief Get the expression created by this item. */ bear::expr::boolean_expression bear::get_toggle_status_creator::do_get_expression() const { return m_expr; } // get_toggle_status_creator::do_get_expression() plee-the-bear-20251226/bear-engine/lib/src/generic_items/expr/code/linear_constant_creator.cpp000066400000000000000000000033321512343254000322150ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::linear_constant_creator class. * \author Sébastien Angibaud */ #include "generic_items/expr/linear_constant_creator.hpp" #include BASE_ITEM_EXPORT( linear_constant_creator, bear ) /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type "linear". */ bear::linear_constant_creator::linear_constant_creator() : m_expr(0) { } // linear_constant_creator::linear_constant_creator() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type "double". * \param name The name of the field. * \param value The value of the field. */ bool bear::linear_constant_creator::set_real_field ( const std::string& name, double value ) { bool result = true; if ( name == "linear_constant_creator.value" ) m_expr.set_value( value ); else result = super::set_real_field(name, value); return result; } // linear_constant_creator::set_real_field() /*----------------------------------------------------------------------------*/ /** * \brief Initialize the item. */ void bear::linear_constant_creator::build() { kill(); } // linear_constant_creator::build() /*----------------------------------------------------------------------------*/ /** * \brief Get the expression created by this item. */ bear::expr::linear_expression bear::linear_constant_creator::do_get_expression() const { return m_expr; } // linear_constant_creator::do_get_expression() plee-the-bear-20251226/bear-engine/lib/src/generic_items/expr/code/logical_not_creator.cpp000066400000000000000000000034201512343254000313220ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::logical_not_creator class. * \author Julien Jorge */ #include "generic_items/expr/logical_not_creator.hpp" #include BASE_ITEM_EXPORT( logical_not_creator, bear ) /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type "item". * \param name The name of the field. * \param value The value of the field. */ bool bear::logical_not_creator::set_item_field ( const std::string& name, engine::base_item* value ) { bool result = true; if ( name == "logical_not_creator.operand" ) { engine::with_boolean_expression_creation* e ( dynamic_cast(value) ); if ( e != NULL ) m_expr.set_operand(e->get_expression()); else claw::logger << claw::log_error << name << ": item is not of a type " << "'with_boolean_expression_creation'." << std::endl; } else result = super::set_item_field(name, value); return result; } // logical_not_creator::set_item_field() /*----------------------------------------------------------------------------*/ /** * \brief Initialize the item. */ void bear::logical_not_creator::build() { kill(); } // logical_not_creator::build() /*----------------------------------------------------------------------------*/ /** * \brief Get the expression created by this item. */ bear::expr::boolean_expression bear::logical_not_creator::do_get_expression() const { return m_expr; } // logical_not_creator::do_get_expression() plee-the-bear-20251226/bear-engine/lib/src/generic_items/expr/code/timer_value.cpp000066400000000000000000000045441512343254000276350ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::timer_value class. * \author Julien Jorge */ #include "generic_items/expr/timer_value.hpp" #include "generic_items/timer.hpp" #include "expr/linear_function.hpp" BASE_ITEM_EXPORT(timer_value, bear) /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ bear::timer_value::timer_value() : m_initial(false) { } // timer_value::timer_value() /*----------------------------------------------------------------------------*/ /** * \brief Check if the item is well initialized. */ bool bear::timer_value::is_valid() const { return (m_timer != (timer*)NULL) && super::is_valid(); } // timer_value::() /*----------------------------------------------------------------------------*/ /** * \brief Set the value of a field of type boolean. * \param name The name of the field to set. * \param value The value of the field. */ bool bear::timer_value::set_bool_field( const std::string& name, bool value ) { bool result(true); if ( name == "timer_value.initial" ) m_initial = value; else result = super::set_bool_field(name, value); return result; } // timer_value::set_bool_field() /*----------------------------------------------------------------------------*/ /** * \brief Set the value of a field of type item. * \param name The name of the field to set. * \param value The value of the field. */ bool bear::timer_value::set_item_field ( const std::string& name, engine::base_item* value ) { bool result(true); if ( name == "timer_value.timer" ) m_timer = value; else result = super::set_item_field(name, value); return result; } // timer_value::set_item_field() /*----------------------------------------------------------------------------*/ /** * \brief Get the expression created by this item. */ bear::expr::linear_expression bear::timer_value::do_get_expression() const { if ( m_initial ) return expr::linear_function_maker ( m_timer, std::mem_fun_ref(&timer::get_initial_time) ); else return expr::linear_function_maker ( m_timer, std::mem_fun_ref(&timer::get_time) ); } // timer_value::do_get_expression() plee-the-bear-20251226/bear-engine/lib/src/generic_items/expr/expression_creator.hpp000066400000000000000000000136161512343254000303320ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Template class to create items that can be use as a binary expression. * \author Julien Jorge */ #ifndef __BEAR_EXPRESSION_CREATOR_HPP__ #define __BEAR_EXPRESSION_CREATOR_HPP__ #include "engine/base_item.hpp" #include "expr/binary_boolean_expression.hpp" #include "expr/binary_linear_expression.hpp" #include "engine/item_brick/with_expression_creation.hpp" #include "engine/export.hpp" #include "generic_items/class_export.hpp" namespace bear { template class binary_expression_creator; /** * \brief Template class to create items that can be use as a binary * expression. * * This item is a parameter for other items. He kills himself at the end of * his build() method. * * The fields of this item are * - \a left_operand: (item) \c the left operand in the expression. Must * inherit from Expression::super, * - \a right_operand: (item) \c the right operand in the expression. Must * inherit from Expression::super. * * \author Julien Jorge */ template class binary_expression_creator: public engine::base_item, public engine::with_expression_creation::creation_class_type { public: /** \brief The type of the parent class. */ typedef engine::base_item super; /** \brief The type of the class to use to instanciate the left operand. */ typedef typename engine::with_expression_creation::creation_class_type left_creation_class_type; /** \brief The type of the class to use to instanciate the right operand. */ typedef typename engine::with_expression_creation::creation_class_type right_creation_class_type; /** \brief The type of the class to use to instanciate the expression. */ typedef typename engine::with_expression_creation::creation_class_type creation_class_type; /** \brief The type of the expression created. */ typedef typename creation_class_type::expression_type expression_type; public: bool set_item_field( const std::string& name, engine::base_item* value ); void build(); private: virtual expression_type do_get_expression() const; private: /** \brief The expression created by this item. */ Result m_expr; }; // class binary_expression_creator /** * \brief This class is a boolean expression of type "boolean_equality". * \author Julien Jorge */ class GENERIC_ITEMS_EXPORT boolean_equality_creator: public binary_expression_creator { DECLARE_BASE_ITEM(boolean_equality_creator); }; // class boolean_equality_creator /** * \brief This class is a boolean expression of type "boolean_disequality". * \author Julien Jorge */ class GENERIC_ITEMS_EXPORT boolean_disequality_creator: public binary_expression_creator < expr::boolean_disequality, expr::boolean_expression, expr::boolean_expression > { DECLARE_BASE_ITEM(boolean_disequality_creator); }; // class boolean_disequality_creator /** * \brief This class is a boolean expression of type "logical_and". * \author Julien Jorge */ class GENERIC_ITEMS_EXPORT logical_and_creator: public binary_expression_creator { DECLARE_BASE_ITEM(logical_and_creator); }; // class logical_and_creator /** * \brief This class is a boolean expression of type "logical_or". * \author Julien Jorge */ class GENERIC_ITEMS_EXPORT logical_or_creator: public binary_expression_creator { DECLARE_BASE_ITEM(logical_or_creator); }; // class logical_or_creator /** * \brief This class is a linear expression of type "equality". * \author Sébastien Angibaud */ class GENERIC_ITEMS_EXPORT linear_equality_creator: public binary_expression_creator { DECLARE_BASE_ITEM(linear_equality_creator); }; // class linear_equality_creator /** * \brief This class is a linear expression of type "plus". * \author Julien Jorge */ class GENERIC_ITEMS_EXPORT linear_plus_creator: public binary_expression_creator { DECLARE_BASE_ITEM(linear_plus_creator); }; // class linear_plus_creator /** * \brief This class is a linear expression of type "minus". * \author Julien Jorge */ class GENERIC_ITEMS_EXPORT linear_minus_creator: public binary_expression_creator { DECLARE_BASE_ITEM(linear_minus_creator); }; // class linear_minus_creator /** * \brief This class is a linear expression of type "multiplies". * \author Julien Jorge */ class GENERIC_ITEMS_EXPORT linear_multiplies_creator: public binary_expression_creator { DECLARE_BASE_ITEM(linear_multiplies_creator); }; // class linear_multiplies_creator /** * \brief This class is a linear expression of type "divides". * \author Julien Jorge */ class GENERIC_ITEMS_EXPORT linear_divides_creator: public binary_expression_creator { DECLARE_BASE_ITEM(linear_divides_creator); }; // class linear_divides_creator } // namespace bear #include "generic_items/expr/impl/expression_creator.tpp" #endif // __BEAR_EXPRESSION_CREATOR_HPP__ plee-the-bear-20251226/bear-engine/lib/src/generic_items/expr/get_toggle_status_creator.hpp000066400000000000000000000033331512343254000316510ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief This class is a boolean expression of type "get_toggle_status". * \author Julien Jorge */ #ifndef __BEAR_GET_TOGGLE_STATUS_CREATOR_HPP__ #define __BEAR_GET_TOGGLE_STATUS_CREATOR_HPP__ #include "engine/base_item.hpp" #include "engine/expr/get_toggle_status.hpp" #include "engine/item_brick/with_boolean_expression_creation.hpp" #include "engine/export.hpp" #include "generic_items/class_export.hpp" namespace bear { /** * \brief This class is a boolean expression of type "get_toggle_status". * * This item is a parameter for the items of type applied_boolean_expression. * He kills himself at the end of his build() method. * * The fields of this item are * - \a toggle: (item) \b [required] \c the toggle from which the status is * taken. * * \author Julien Jorge */ class GENERIC_ITEMS_EXPORT get_toggle_status_creator: public engine::base_item, public engine::with_boolean_expression_creation { DECLARE_BASE_ITEM(get_toggle_status_creator); public: /** \brief The type of the parent class. */ typedef engine::base_item super; public: bool set_item_field( const std::string& name, engine::base_item* value ); void build(); bool is_valid() const; private: virtual expr::boolean_expression do_get_expression() const; private: /** \brief The expression created by this item. */ engine::get_toggle_status m_expr; }; // class get_toggle_status_creator } // namespace bear #endif // __BEAR_GET_TOGGLE_STATUS_CREATOR_HPP__ plee-the-bear-20251226/bear-engine/lib/src/generic_items/expr/impl/000077500000000000000000000000001512343254000246355ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/lib/src/generic_items/expr/impl/applied_expression.tpp000066400000000000000000000054341512343254000312650ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::applied_expression class. * \author Julien Jorge */ #include /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type "item". * \param name The name of the field. * \param value The value of the field. */ template bool bear::applied_expression::set_item_field ( const std::string& name, engine::base_item* value ) { bool result = true; if ( name == "applied_expression.expression" ) { creation_class_type* e( dynamic_cast(value) ); if ( e != NULL ) m_expression = e->get_expression(); else claw::logger << claw::log_error << name << ": item is not of a type " << "'with_expression_creation'." << std::endl; } else result = super::set_item_field(name, value); return result; } // applied_expression::set_item_field() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type "list of item". * \param name The name of the field. * \param value The value of the field. */ template bool bear::applied_expression::set_item_list_field ( const std::string& name, const std::vector& value ) { bool result = true; if ( name == "applied_expression.receiver" ) for ( std::size_t i=0; i!=value.size(); ++i ) { assignment_class_type* a ( dynamic_cast(value[i]) ); if ( a != NULL ) m_items.push_back(a); else claw::logger << claw::log_error << name << ": item #" << i << " is not of type 'with_expression_assignment'." << std::endl; } else result = super::set_item_list_field(name, value); return result; } // applied_expression::set_item_list_field() /*----------------------------------------------------------------------------*/ /** * \brief Tell if all required fields are initialized. */ template bool bear::applied_expression::is_valid() const { return !m_items.empty(); } // applied_expression::is_valid() /*----------------------------------------------------------------------------*/ /** * \brief Initialize the item. */ template void bear::applied_expression::build() { for (unsigned int i=0; i!=m_items.size(); ++i) m_items[i]->set_expression(m_expression); kill(); } // applied_expression::build() plee-the-bear-20251226/bear-engine/lib/src/generic_items/expr/impl/expression_creator.tpp000066400000000000000000000046271512343254000313110ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::expression_creator class. * \author Julien Jorge */ #include /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type "item". * \param name The name of the field. * \param value The value of the field. */ template bool bear::binary_expression_creator ::set_item_field ( const std::string& name, engine::base_item* value ) { bool result = true; if ( name == "binary_expression_creator.left_operand" ) { left_creation_class_type* e ( dynamic_cast(value) ); if ( e != NULL ) m_expr.set_left_operand(e->get_expression()); else claw::logger << claw::log_error << name << ": item is not of a valid type." << std::endl; } else if ( name == "binary_expression_creator.right_operand" ) { right_creation_class_type* e ( dynamic_cast(value) ); if ( e != NULL ) m_expr.set_right_operand(e->get_expression()); else claw::logger << claw::log_error << name << ": item is not of a valid type." << std::endl; } else result = super::set_item_field(name, value); return result; } // binary_expression_creator::set_item_field() /*----------------------------------------------------------------------------*/ /** * \brief Initialize the item. */ template void bear::binary_expression_creator::build() { kill(); } // binary_expression_creator::build() /*----------------------------------------------------------------------------*/ /** * \brief Get the expression created by this item. */ template typename bear::binary_expression_creator ::expression_type bear::binary_expression_creator ::do_get_expression() const { return m_expr; } // binary_expression_creator::do_get_expression() plee-the-bear-20251226/bear-engine/lib/src/generic_items/expr/linear_constant_creator.hpp000066400000000000000000000031601512343254000313070ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Class to create an item that is a linear constant. * \author Sébastien Angibaud */ #ifndef __BEAR_LINEAR_CONSTANT_CREATOR_HPP__ #define __BEAR_LINEAR_CONSTANT_CREATOR_HPP__ #include "engine/base_item.hpp" #include "expr/linear_constant.hpp" #include "engine/item_brick/with_linear_expression_creation.hpp" #include "engine/export.hpp" #include "generic_items/class_export.hpp" namespace bear { /** * \brief This class is a linear expression of type "linear_constant". * * This item is a parameter for other items. He kills himself at the end of * his build() method. * * The fields of this item are * - \a operand: (double) \c the value of the constant. * * \author Sébastien Angibaud */ class GENERIC_ITEMS_EXPORT linear_constant_creator: public engine::base_item, public engine::with_linear_expression_creation { DECLARE_BASE_ITEM(linear_constant_creator); public: /** \brief The type of the parent class. */ typedef engine::base_item super; public: linear_constant_creator(); bool set_real_field( const std::string& name, double value ); void build(); private: virtual expr::linear_expression do_get_expression() const; private: /** \brief The expression created by this item. */ expr::linear_constant m_expr; }; // class linear_constant_creator } // namespace bear #endif // __BEAR_LINEAR_CONSTANT_CREATOR_HPP__ plee-the-bear-20251226/bear-engine/lib/src/generic_items/expr/logical_not_creator.hpp000066400000000000000000000031661512343254000304240ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Template class to create items that can be use as a binary expression. * \author Julien Jorge */ #ifndef __BEAR_LOGICAL_NOT_CREATOR_HPP__ #define __BEAR_LOGICAL_NOT_CREATOR_HPP__ #include "engine/base_item.hpp" #include "engine/item_brick/with_boolean_expression_creation.hpp" #include "expr/logical_not.hpp" #include "engine/export.hpp" #include "generic_items/class_export.hpp" namespace bear { /** * \brief This class is a boolean expression of type "logical_not". * * This item is a parameter for other items. He kills himself at the end of * his build() method. * * The fields of this item are * - \a operand: (item) \c the operand of the operator. Must inherit from * with_boolean_expression_creation. * * \author Julien Jorge */ class GENERIC_ITEMS_EXPORT logical_not_creator: public engine::base_item, public engine::with_boolean_expression_creation { DECLARE_BASE_ITEM(logical_not_creator); public: /** \brief The type of the parent class. */ typedef engine::base_item super; public: bool set_item_field( const std::string& name, engine::base_item* value ); void build(); private: virtual expr::boolean_expression do_get_expression() const; private: /** \brief The resulting expression. */ expr::logical_not m_expr; }; // class logical_not_creator } // namespace bear #endif // __BEAR_LOGICAL_NOT_CREATOR_HPP__ plee-the-bear-20251226/bear-engine/lib/src/generic_items/expr/timer_value.hpp000066400000000000000000000037211512343254000267240ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A linear expression that returns the value of a timer. * \author Julien Jorge */ #ifndef __BEAR_TIMER_VALUE_HPP__ #define __BEAR_TIMER_VALUE_HPP__ #include "engine/base_item.hpp" #include "engine/item_brick/with_linear_expression_creation.hpp" #include "universe/derived_item_handle.hpp" #include "generic_items/class_export.hpp" #include "engine/export.hpp" namespace bear { class timer; /** * \brief A linear expression that returns the value of a timer. * * The valid fields for this item are * - initial (bool), tell if the evaluation is the initial time or the * current time (default = false), * - timer (timer_kill_players) [required], the timer whose value is taken. * - any field supported by the parent classes. * * \author Julien Jorge */ class GENERIC_ITEMS_EXPORT timer_value: public engine::base_item, public engine::with_linear_expression_creation { DECLARE_BASE_ITEM(timer_value); public: /** \brief The type of the parent class. */ typedef engine::base_item super; private: /** \brief The type of an handle on the timer. */ typedef universe::const_derived_item_handle handle_type; public: timer_value(); bool is_valid() const; bool set_bool_field( const std::string& name, bool value ); bool set_item_field( const std::string& name, engine::base_item* value ); private: virtual expr::linear_expression do_get_expression() const; private: /** \brief Tell if the evaluation returns the initial value of the timer or its current value. */ bool m_initial; /** \brief The timer in which the value is taken. */ handle_type m_timer; }; // class timer_value } // namespace bear #endif // __BEAR_TIMER_VALUE_HPP__ plee-the-bear-20251226/bear-engine/lib/src/generic_items/falling_block.hpp000066400000000000000000000015431512343254000262200ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief This block has a small mass, so it falls. * \author Julien Jorge */ #ifndef __BEAR_FALLING_BLOCK_HPP__ #define __BEAR_FALLING_BLOCK_HPP__ #include "generic_items/base_visible_block.hpp" #include "universe/collision_event/align_take_speed.hpp" #include "generic_items/class_export.hpp" namespace bear { /** * \brief This block has a small mass, so it falls. * \author Julien Jorge */ class GENERIC_ITEMS_EXPORT falling_block : public base_visible_block { public: falling_block(); }; // class falling_block } // namespace bear #endif // __BEAR_FALLING_BLOCK_HPP__ plee-the-bear-20251226/bear-engine/lib/src/generic_items/force_rectangle_creator.hpp000066400000000000000000000027111512343254000302710ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief This class adds a universe::force_rectangle in universe::world * then dies. * \author Sebastien Angibaud */ #ifndef __BEAR_FORCE_RECTANGLE_CREATOR_HPP__ #define __BEAR_FORCE_RECTANGLE_CREATOR_HPP__ #include "engine/base_item.hpp" #include "engine/export.hpp" #include "generic_items/class_export.hpp" namespace bear { /** * \brief This class adds a universe::force_rectangle in universe::world * then dies. * * The fields of this item are * - \a force_x: (double) * \c the force in x axis in the rectangle (default = 0). * - \a force_y: (double) * \c the force in y axis in the rectangle (default = 0). * * \author Sebastien Angibaud */ class GENERIC_ITEMS_EXPORT force_rectangle_creator: public engine::base_item { DECLARE_BASE_ITEM(force_rectangle_creator); public: /** \brief The type of the parent class. */ typedef engine::base_item super; public: force_rectangle_creator(); bool set_real_field( const std::string& name, double value ); void build(); private: /** \brief Force applied to the items. */ universe::force_type m_force; }; // class force_rectangle_creator } // namespace bear #endif // __BEAR_FORCE_RECTANGLE_CREATOR_HPP__ plee-the-bear-20251226/bear-engine/lib/src/generic_items/forced_movement/000077500000000000000000000000001512343254000260725ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/lib/src/generic_items/forced_movement/applied_forced_movement.hpp000066400000000000000000000024211512343254000334540ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief This class applies a forced movement to an item then die. * \author Julien Jorge */ #ifndef __BEAR_APPLIED_FORCED_MOVEMENT_HPP__ #define __BEAR_APPLIED_FORCED_MOVEMENT_HPP__ #include "engine/base_item.hpp" #include "engine/item_brick/forced_movement_applicator.hpp" #include "engine/export.hpp" #include "generic_items/class_export.hpp" namespace bear { /** * \brief This class applies a forced movement to an item then die. * * \author Julien Jorge */ class GENERIC_ITEMS_EXPORT applied_forced_movement: public engine::base_item { DECLARE_BASE_ITEM(applied_forced_movement); public: /** \brief The type of the parent class. */ typedef engine::base_item super; public: bool is_valid() const; void build(); protected: void populate_loader_map( engine::item_loader_map& m ); private: /** The object that will apply the forced movement. */ engine::forced_movement_applicator m_movement; }; // class applied_forced_movement } // namespace bear #endif // __BEAR_APPLIED_FORCED_MOVEMENT_HPP__ plee-the-bear-20251226/bear-engine/lib/src/generic_items/forced_movement/code/000077500000000000000000000000001512343254000270045ustar00rootroot00000000000000applied_forced_movement.cpp000066400000000000000000000027601512343254000343100ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/lib/src/generic_items/forced_movement/code/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::applied_forced_movement class. * \author Julien Jorge */ #include "generic_items/forced_movement/applied_forced_movement.hpp" #include "engine/item_brick/loader/forced_movement_applicator_loader.hpp" BASE_ITEM_EXPORT( applied_forced_movement, bear ) /*----------------------------------------------------------------------------*/ /** * \brief Tell if the item is well initialized. */ bool bear::applied_forced_movement::is_valid() const { return m_movement.is_valid() && super::is_valid(); } // applied_forced_movement::is_valid() /*----------------------------------------------------------------------------*/ /** * \brief Initialize the item. */ void bear::applied_forced_movement::build() { super::build(); m_movement.give_movement(); kill(); } // applied_forced_movement::build() /*----------------------------------------------------------------------------*/ /** * \brief Add the loaders of this item class into a given loader map. * \param m The map in which the loaders are inserted. */ void bear::applied_forced_movement::populate_loader_map ( engine::item_loader_map& m ) { super::populate_loader_map(m); m.insert( engine::forced_movement_applicator_loader(m_movement) ); } // applied_forced_movement::populate_loader_map() forced_aiming_creator.cpp000066400000000000000000000035251512343254000337430ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/lib/src/generic_items/forced_movement/code/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::forced_aiming_creator class. * \author Julien Jorge */ #include "generic_items/forced_movement/forced_aiming_creator.hpp" #include "universe/forced_movement/forced_aiming.hpp" #include "engine/export.hpp" BASE_ITEM_EXPORT( forced_aiming_creator, bear ) /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type "real". * \param name The name of the field. * \param value The value of the field. */ bool bear::forced_aiming_creator::set_real_field ( const std::string& name, double value ) { bool result = true; if ( name == "forced_aiming_creator.duration" ) get_movement().set_total_time(value); else if ( name == "forced_aiming_creator.max_angle" ) get_movement().set_max_angle(value); else if ( name == "forced_aiming_creator.max_speed" ) get_movement().set_max_speed(value); else if ( name == "forced_aiming_creator.acceleration" ) get_movement().set_acceleration(value); else result = super::set_real_field(name, value); return result; } // forced_aiming_creator::set_real_field() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type "bool". * \param name The name of the field. * \param value The value of the field. */ bool bear::forced_aiming_creator::set_bool_field ( const std::string& name, bool value ) { bool result = true; if ( name == "forced_aiming_creator.apply_angle" ) get_movement().set_apply_angle(value); else result = super::set_bool_field(name, value); return result; } // forced_aiming_creator::set_bool_field() forced_goto_creator.cpp000066400000000000000000000027371512343254000334530ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/lib/src/generic_items/forced_movement/code/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::forced_goto_creator class. * \author Julien Jorge */ #include "generic_items/forced_movement/forced_goto_creator.hpp" #include "engine/export.hpp" BASE_ITEM_EXPORT( forced_goto_creator, bear ) /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type "real". * \param name The name of the field. * \param value The value of the field. */ bool bear::forced_goto_creator::set_real_field ( const std::string& name, double value ) { bool result = true; if ( name == "forced_goto_creator.duration" ) m_movement.set_total_time(value); else if ( name == "forced_goto_creator.acceleration_time" ) m_movement.set_acceleration_time(value); else if ( name == "forced_goto_creator.length.x" ) m_movement.set_x_length(value); else if ( name == "forced_goto_creator.length.y" ) m_movement.set_y_length(value); else result = super::set_real_field(name, value); return result; } // forced_goto_creator::set_real_field() /*----------------------------------------------------------------------------*/ /** * \brief Initialize the item. */ void bear::forced_goto_creator::build() { set_forced_movement(m_movement); kill(); } // forced_goto_creator::build() forced_join_creator.cpp000066400000000000000000000017241512343254000334350ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/lib/src/generic_items/forced_movement/code/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::forced_join_creator class. * \author Julien Jorge */ #include "generic_items/forced_movement/forced_join_creator.hpp" #include "engine/export.hpp" BASE_ITEM_EXPORT( forced_join_creator, bear ) /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type "real". * \param name The name of the field. * \param value The value of the field. */ bool bear::forced_join_creator::set_real_field ( const std::string& name, double value ) { bool result = true; if ( name == "forced_join_creator.duration" ) get_movement().set_total_time(value); else result = super::set_real_field(name, value); return result; } // forced_join_creator::set_real_field() forced_movement_destructor_toggle.cpp000066400000000000000000000045451512343254000364340ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/lib/src/generic_items/forced_movement/code/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::forced_movement_destructor_toggle class. * \author Julien Jorge */ #include "generic_items/forced_movement/forced_movement_destructor_toggle.hpp" #include "engine/export.hpp" BASE_ITEM_EXPORT( forced_movement_destructor_toggle, bear ) /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ bear::forced_movement_destructor_toggle::forced_movement_destructor_toggle() { set_phantom(true); set_can_move_items(false); set_artificial(true); } // forced_movement_destructor_toggle::forced_movement_destructor_toggle() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type "list of item". * \param name The name of the field. * \param value The value of the field. */ bool bear::forced_movement_destructor_toggle::set_item_list_field ( const std::string& name, const std::vector& value ) { bool result = true; if ( name == "forced_movement_destructor_toggle.actor" ) { m_actor.resize(value.size()); for (std::size_t i=0; i!=value.size(); ++i) m_actor[i] = value[i]; } else result = super::set_item_list_field(name, value); return result; } // forced_movement_destructor_toggle::set_item_list_field() /*----------------------------------------------------------------------------*/ /** * \brief Tell if all required fields are initialized. */ bool bear::forced_movement_destructor_toggle::is_valid() const { bool result = super::is_valid(); for (std::size_t i=0; result && (i!=m_actor.size()); ++i) result = m_actor[i] != NULL; return result; } // forced_movement_destructor_toggle::is_valid() /*----------------------------------------------------------------------------*/ /** * \brief Apply the movement to the actors. * \param activator The activator of the toggle. */ void bear::forced_movement_destructor_toggle::on_toggle_on ( engine::base_item* activator ) { for (std::size_t i=0; i!=m_actor.size(); ++i) if ( m_actor[i] != NULL ) m_actor[i]->clear_forced_movement(); } // forced_movement_destructor_toggle::on_toggle_on() forced_movement_toggle.cpp000066400000000000000000000050601512343254000341470ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/lib/src/generic_items/forced_movement/code/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::forced_movement_toggle class. * \author Julien Jorge */ #include "generic_items/forced_movement/forced_movement_toggle.hpp" #include "universe/forced_movement/forced_movement.hpp" #include "engine/item_brick/loader/forced_movement_applicator_loader.hpp" BASE_ITEM_EXPORT( forced_movement_toggle, bear ) /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ bear::forced_movement_toggle::forced_movement_toggle() : m_apply_to_activator(false) { set_phantom(true); set_can_move_items(false); set_artificial(true); } // forced_movement_toggle::forced_movement_toggle() /*----------------------------------------------------------------------------*/ /** * \brief Tell if the item is well initialized. */ bool bear::forced_movement_toggle::is_valid() const { return m_movement.is_valid(); } // forced_movement_toggle::is_valid() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type "bool". * \param name The name of the field. * \param value The value of the field. */ bool bear::forced_movement_toggle::set_bool_field ( const std::string& name, bool value ) { bool result = true; if ( name == "forced_movement_toggle.apply_to_activator" ) m_apply_to_activator = value; else result = super::set_bool_field(name, value); return result; } // forced_movement_toggle::set_bool_field() /*----------------------------------------------------------------------------*/ /** * \brief Add the loaders of this item class into a given loader map. * \param m The map in which the loaders are inserted. */ void bear::forced_movement_toggle::populate_loader_map ( engine::item_loader_map& m ) { super::populate_loader_map(m); m.insert( engine::forced_movement_applicator_loader(m_movement) ); } // forced_movement_toggle::populate_loader_map() /*----------------------------------------------------------------------------*/ /** * \brief Apply the movement to the actors. * \param activator The activator of the toggle. */ void bear::forced_movement_toggle::on_toggle_on( engine::base_item* activator ) { m_movement.give_movement(); if ( (activator != NULL) && m_apply_to_activator ) activator->set_forced_movement( m_movement.get_movement() ); } // forced_movement_toggle::on_toggle_on() forced_path_creator.cpp000066400000000000000000000132271512343254000334330ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/lib/src/generic_items/forced_movement/code/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::forced_path_creator class. * \author Julien Jorge */ #include "generic_items/forced_movement/forced_path_creator.hpp" #include "universe/forced_movement/forced_join.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param mvt The movement loaded by this loader. */ bear::forced_path_creator::loader::loader( universe::forced_sequence& mvt ) : super("forced_path_creator"), m_movement(mvt), m_speed(1) { } // forced_path_creator::loader::loader() /*----------------------------------------------------------------------------*/ /** * \brief Creates a copy of this instance. */ bear::forced_path_creator::loader* bear::forced_path_creator::loader::clone() const { return new loader( *this ); } // forced_path_creator::loader::clone() /*----------------------------------------------------------------------------*/ /** * \brief Sets a field of type \c real. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::forced_path_creator::loader::set_field ( const std::string& name, unsigned int value ) { bool result = true; if ( name == "loops" ) m_movement.set_loops(value); else result = super::set_field(name, value); return result; } // forced_path_creator::loader::set_field() /*----------------------------------------------------------------------------*/ /** * \brief Sets a field of type \c real. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::forced_path_creator::loader::set_field ( const std::string& name, double value ) { bool result = true; if ( name == "speed" ) m_speed = value; else result = super::set_field(name, value); return result; } // forced_path_creator::loader::set_field() /*----------------------------------------------------------------------------*/ /** * \brief Sets a field of type \c list of items. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::forced_path_creator::loader::set_field ( const std::string& name, const std::vector& value ) { bool result = true; if ( name == "path" ) result = build_sequence( value ); else result = super::set_field(name, value); return result; } // forced_path_creator::loader::set_field() /*----------------------------------------------------------------------------*/ /** * \brief Builds the movements in the sequence. * \param items The items to join in the sequence. * \return true if the movement has been built, false otherwise. */ bool bear::forced_path_creator::loader::build_sequence ( const std::vector& items ) { if ( m_speed <= 0 ) { claw::logger << claw::log_error << "forced_path_creator: Cannot build a movement with a non " "positive speed." << std::endl; return false; } if ( items.empty() ) { claw::logger << claw::log_error << "forced_path_creator: Cannot build a sequence with no " "item." << std::endl; return false; } if ( items[0] == NULL ) { claw::logger << claw::log_error << "forced_path_creator: Cannot build a sequence without an " "initial item." << std::endl; return false; } add_movement_in_sequence( *items[0], 0 ); universe::position_type previous_position( items[0]->get_center_of_mass() ); for ( std::size_t i(1); i!=items.size(); ++i ) if ( items[i] == NULL ) claw::logger << claw::log_warning << "forced_path_creator: item #" << i << " is NULL." << std::endl; else { const universe::position_type new_position ( items[i]->get_center_of_mass() ); add_movement_in_sequence ( *items[i], new_position.distance( previous_position ) / m_speed ); previous_position = new_position; } return true; } // forced_path_creator::loader::build_sequence() /*----------------------------------------------------------------------------*/ /** * \brief Appends a movement to reach a given item in the sequence. * \param item The item to join. * \param duration The duration of the movement. */ void bear::forced_path_creator::loader::add_movement_in_sequence ( engine::base_item& item, universe::time_type duration ) { universe::forced_join mvt( duration ); mvt.set_reference_point_on_center( item ); m_movement.push_back( mvt ); } // forced_path_creator::loader::add_movement_in_sequence() BASE_ITEM_EXPORT( forced_path_creator, bear ) /*----------------------------------------------------------------------------*/ /** * \brief Initializes the item. */ void bear::forced_path_creator::build() { set_forced_movement(m_movement); kill(); } // forced_path_creator::build() /*----------------------------------------------------------------------------*/ /** * \brief Adds the loaders of this item class into a given loader map. * \param m The map in which the loaders are inserted. */ void bear::forced_path_creator::populate_loader_map ( engine::item_loader_map& m ) { super::populate_loader_map(m); m.insert( loader(m_movement) ); } // forced_path_creator::populate_loader_map() forced_rotation_creator.cpp000066400000000000000000000073411512343254000343360ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/lib/src/generic_items/forced_movement/code/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::forced_rotation_creator class. * \author Julien Jorge */ #include "generic_items/forced_movement/forced_rotation_creator.hpp" #include "universe/forced_movement/forced_rotation.hpp" #include "engine/export.hpp" BASE_ITEM_EXPORT( forced_rotation_creator, bear ) /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type "real". * \param name The name of the field. * \param value The value of the field. */ bool bear::forced_rotation_creator::set_real_field ( const std::string& name, double value ) { bool result = true; if ( name == "forced_rotation_creator.duration" ) get_movement().set_total_time(value); else if ( name == "forced_rotation_creator.acceleration_time" ) get_movement().set_acceleration_time(value); else if ( name == "forced_rotation_creator.start_angle" ) get_movement().set_start_angle(value); else if ( name == "forced_rotation_creator.end_angle" ) get_movement().set_end_angle(value); else if ( name == "forced_rotation_creator.radius" ) get_movement().set_radius(value); else result = super::set_real_field(name, value); return result; } // forced_rotation_creator::set_real_field() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type "bool". * \param name The name of the field. * \param value The value of the field. */ bool bear::forced_rotation_creator::set_bool_field ( const std::string& name, bool value ) { bool result = true; if ( name == "forced_rotation_creator.loop_back" ) get_movement().set_loop_back(value); else result = super::set_bool_field(name, value); return result; } // forced_rotation_creator::set_bool_field() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type "string". * \param name The name of the field. * \param value The value of the field. */ bool bear::forced_rotation_creator::set_string_field ( const std::string& name, const std::string& value ) { bool result = true; if ( name == "forced_rotation_creator.apply_angle" ) { if ( value == "add" ) get_movement().set_angle_application ( universe::forced_rotation::apply_add ); else if ( value == "force" ) get_movement().set_angle_application (universe::forced_rotation::apply_force); else if ( value == "force_delta" ) get_movement().set_angle_application (universe::forced_rotation::apply_force_delta); else if ( value == "force_remaining" ) get_movement().set_angle_application (universe::forced_rotation::apply_force_remaining); else if ( value == "keep" ) get_movement().set_angle_application ( universe::forced_rotation::apply_keep ); else result = false; } else result = super::set_string_field(name, value); return result; } // forced_rotation_creator::set_string_field() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type "unsigned int". * \param name The name of the field. * \param value The value of the field. */ bool bear::forced_rotation_creator::set_u_integer_field ( const std::string& name, unsigned int value ) { bool result = true; if ( name == "forced_rotation_creator.loops" ) get_movement().set_loops(value); else result = super::set_u_integer_field(name, value); return result; } // forced_rotation_creator::set_loops() forced_sequence_creator.cpp000066400000000000000000000045101512343254000343020ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/lib/src/generic_items/forced_movement/code/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::forced_sequence_creator class. * \author Julien Jorge */ #include "generic_items/forced_movement/forced_sequence_creator.hpp" #include "engine/export.hpp" #include BASE_ITEM_EXPORT( forced_sequence_creator, bear ) /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type "unsigned int". * \param name The name of the field. * \param value The value of the field. */ bool bear::forced_sequence_creator::set_u_integer_field ( const std::string& name, unsigned int value ) { bool result = true; if ( name == "forced_sequence_creator.loops" ) m_movement.set_loops(value); else result = super::set_u_integer_field(name, value); return result; } // forced_sequence_creator::set_u_integer_field() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type "list of item". * \param name The name of the field. * \param value The value of the field. */ bool bear::forced_sequence_creator::set_item_list_field ( const std::string& name, const std::vector& value ) { bool result = true; if ( name == "forced_sequence_creator.movements" ) { for (unsigned int i=0; result && (i!=value.size()); ++i) if ( value[i] == NULL ) claw::logger << claw::log_warning << "forced_sequence_creator: item #" << i << " is NULL." << std::endl; else if ( value[i]->has_forced_movement() ) m_movement.push_back( value[i]->get_forced_movement() ); else claw::logger << claw::log_warning << "forced_sequence_creator: item #" << i << " has no movement." << std::endl; } else result = super::set_item_list_field(name, value); return result; } // forced_sequence_creator::set_item_list_field() /*----------------------------------------------------------------------------*/ /** * \brief Initializes the item. */ void bear::forced_sequence_creator::build() { set_forced_movement(m_movement); kill(); } // forced_sequence_creator::build() forced_stay_around_creator.cpp000066400000000000000000000036171512343254000350310ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/lib/src/generic_items/forced_movement/code/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::forced_stay_around_creator class. * \author Julien Jorge */ #include "generic_items/forced_movement/forced_stay_around_creator.hpp" #include "universe/forced_movement/forced_stay_around.hpp" #include "engine/export.hpp" BASE_ITEM_EXPORT( forced_stay_around_creator, bear ) /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type "real". * \param name The name of the field. * \param value The value of the field. */ bool bear::forced_stay_around_creator::set_real_field ( const std::string& name, double value ) { bool result = true; if ( name == "forced_stay_around_creator.duration" ) get_movement().set_total_time(value); else if ( name == "forced_stay_around_creator.max_angle" ) get_movement().set_max_angle(value); else if ( name == "forced_stay_around_creator.speed" ) get_movement().set_speed(value); else if ( name == "forced_stay_around_creator.max_distance" ) get_movement().set_max_distance(value); else result = super::set_real_field(name, value); return result; } // forced_stay_around_creator::set_real_field() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type "bool". * \param name The name of the field. * \param value The value of the field. */ bool bear::forced_stay_around_creator::set_bool_field ( const std::string& name, bool value ) { bool result = true; if ( name == "forced_stay_around_creator.apply_angle" ) get_movement().set_apply_angle(value); else result = super::set_bool_field(name, value); return result; } // forced_stay_around_creator::set_bool_field() forced_tracking_creator.cpp000066400000000000000000000025571512343254000343050ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/lib/src/generic_items/forced_movement/code/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::forced_tracking_creator class. * \author Julien Jorge */ #include "generic_items/forced_movement/forced_tracking_creator.hpp" #include "engine/export.hpp" BASE_ITEM_EXPORT( forced_tracking_creator, bear ) /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type "real". * \param name The name of the field. * \param value The value of the field. */ bool bear::forced_tracking_creator::set_real_field ( const std::string& name, double value ) { bool result = true; if ( name == "forced_tracking_creator.duration" ) get_movement().set_total_time(value); else if ( name == "forced_tracking_creator.distance.x" ) { universe::position_type s( get_movement().get_distance() ); s.x = value; get_movement().set_distance(s); } else if ( name == "forced_tracking_creator.distance.y" ) { universe::position_type s( get_movement().get_distance() ); s.y = value; get_movement().set_distance(s); } else result = super::set_real_field(name, value); return result; } // forced_tracking_creator::set_real_field() forced_translation_creator.cpp000066400000000000000000000044231512343254000350330ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/lib/src/generic_items/forced_movement/code/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::forced_translation_creator class. * \author Julien Jorge */ #include "generic_items/forced_movement/forced_translation_creator.hpp" #include "universe/forced_movement/forced_translation.hpp" #include "engine/export.hpp" BASE_ITEM_EXPORT( forced_translation_creator, bear ) /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type "real". * \param name The name of the field. * \param value The value of the field. */ bool bear::forced_translation_creator::set_real_field ( const std::string& name, double value ) { bool result = true; if ( name == "forced_translation_creator.duration" ) m_movement.set_total_time(value); else if ( name == "forced_translation_creator.slant" ) m_movement.set_angle(value); else if ( name == "forced_translation_creator.speed.x" ) { universe::speed_type s( m_movement.get_speed() ); s.x = value; m_movement.set_speed(s); } else if ( name == "forced_translation_creator.speed.y" ) { universe::speed_type s( m_movement.get_speed() ); s.y = value; m_movement.set_speed(s); } else result = super::set_real_field(name, value); return result; } // forced_translation_creator::set_real_field() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type "bool". * \param name The name of the field. * \param value The value of the field. */ bool bear::forced_translation_creator::set_bool_field ( const std::string& name, bool value ) { bool result = true; if ( name == "forced_translation_creator.force_angle" ) m_movement.set_force_angle(value); else result = super::set_bool_field(name, value); return result; } // forced_translation_creator::set_bool_field() /*----------------------------------------------------------------------------*/ /** * \brief Initialize the item. */ void bear::forced_translation_creator::build() { set_forced_movement(m_movement); kill(); } // forced_translation_creator::build() natural_forced_movement_creator.cpp000066400000000000000000000047551512343254000360650ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/lib/src/generic_items/forced_movement/code/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::natural_forced_movement_creator class. * \author Julien Jorge */ #include "generic_items/forced_movement/natural_forced_movement_creator.hpp" #include "universe/forced_movement/natural_forced_movement.hpp" #include "engine/export.hpp" BASE_ITEM_EXPORT( natural_forced_movement_creator, bear ) /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param mvt The movement loaded by this loader. */ bear::natural_forced_movement_creator::loader::loader ( universe::natural_forced_movement& mvt ) : super("natural_forced_movement_creator"), m_movement(mvt) { } // natural_forced_movement_creator::loader::loader() /*----------------------------------------------------------------------------*/ /** * \brief Creates a copy of this instance. */ bear::natural_forced_movement_creator::loader* bear::natural_forced_movement_creator::loader::clone() const { return new loader( *this ); } // natural_forced_movement_creator::loader::clone() /*----------------------------------------------------------------------------*/ /** * \brief Sets a field of type \c real. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::natural_forced_movement_creator::loader::set_field ( const std::string& name, double value ) { bool result = true; if ( name == "duration" ) m_movement.set_total_time(value); else result = false; return result; } // natural_forced_movement_creator::loader::set_field() /*----------------------------------------------------------------------------*/ /** * \brief Initialize the item. */ void bear::natural_forced_movement_creator::build() { set_forced_movement(m_movement); kill(); } // natural_forced_movement_creator::build() /*----------------------------------------------------------------------------*/ /** * \brief Adds the loaders of this item class into a given loader map. * \param m The map in which the loaders are inserted. */ void bear::natural_forced_movement_creator::populate_loader_map ( engine::item_loader_map& m ) { super::populate_loader_map(m); m.insert( loader(m_movement) ); } // natural_forced_movement_creator::populate_loader_map() repeated_forced_movement.cpp000066400000000000000000000027671512343254000344720ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/lib/src/generic_items/forced_movement/code/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::repeated_forced_movement class. * \author Julien Jorge */ #include "generic_items/forced_movement/repeated_forced_movement.hpp" #include "engine/item_brick/loader/forced_movement_repeater_loader.hpp" BASE_ITEM_EXPORT( repeated_forced_movement, bear ) /*----------------------------------------------------------------------------*/ /** * \brief Tell if the item is well initialized. */ bool bear::repeated_forced_movement::is_valid() const { return m_movement.is_valid() && super::is_valid(); } // repeated_forced_movement::is_valid() /*----------------------------------------------------------------------------*/ /** * \brief Initialize the item. */ void bear::repeated_forced_movement::build() { super::build(); m_movement.give_movement(); kill(); } // repeated_forced_movement::build() /*----------------------------------------------------------------------------*/ /** * \brief Add the loaders of this item class into a given loader map. * \param m The map in which the loaders are inserted. */ void bear::repeated_forced_movement::populate_loader_map ( engine::item_loader_map& m ) { super::populate_loader_map(m); m.insert( engine::forced_movement_repeater_loader(m_movement) ); } // repeated_forced_movement::populate_loader_map() toggle_in_forced_movement_creator.cpp000066400000000000000000000047151512343254000363620ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/lib/src/generic_items/forced_movement/code/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::toggle_in_forced_movement_creator class. * \author Julien Jorge */ #include "generic_items/forced_movement/toggle_in_forced_movement_creator.hpp" #include "engine/item_brick/with_toggle.hpp" #include "engine/export.hpp" BASE_ITEM_EXPORT( toggle_in_forced_movement_creator, bear ) /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type "bool". * \param name The name of the field. * \param value The value of the field. */ bool bear::toggle_in_forced_movement_creator::set_bool_field ( const std::string& name, bool value ) { bool result = true; if ( name == "toggle_in_forced_movement_creator.use_toggle_duration" ) m_movement.use_toggle_delay(value); else result = super::set_bool_field(name, value); return result; } // toggle_in_forced_movement_creator::set_bool_field() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type "item". * \param name The name of the field. * \param value The value of the field. */ bool bear::toggle_in_forced_movement_creator::set_item_field ( const std::string& name, engine::base_item* value ) { bool result = true; if ( (name == "toggle_in_forced_movement_creator.toggle") && (dynamic_cast(value) != NULL) ) m_movement.set_reference_point_on_center(*value); else result = super::set_item_field(name, value); return result; } // toggle_in_forced_movement_creator::set_item_field() /*----------------------------------------------------------------------------*/ /** * \brief Tell if all required fields are initialized. */ bool bear::toggle_in_forced_movement_creator::is_valid() const { const engine::with_toggle* const toggle = dynamic_cast(&m_movement.get_reference_item()); return m_movement.has_reference_item() && (toggle != NULL) && super::is_valid(); } // toggle_in_forced_movement_creator::is_valid() /*----------------------------------------------------------------------------*/ /** * \brief Initialize the item. */ void bear::toggle_in_forced_movement_creator::build() { set_forced_movement(m_movement); kill(); } // toggle_in_forced_movement_creator::build() plee-the-bear-20251226/bear-engine/lib/src/generic_items/forced_movement/forced_aiming_creator.hpp000066400000000000000000000040241512343254000331100ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief This class creates a forced movement of type "forced_aiming", * applies it to itself then die. * \author Julien Jorge */ #ifndef __BEAR_FORCED_AIMING_CREATOR_HPP__ #define __BEAR_FORCED_AIMING_CREATOR_HPP__ #include "engine/base_item.hpp" #include "engine/item_brick/forced_movement_creator_with_reference.hpp" #include "universe/forced_movement/forced_aiming.hpp" #include "engine/export.hpp" #include "generic_items/class_export.hpp" namespace bear { /** * \brief This class creates a forced movement of type "forced_aiming", * applies it to itself then die. * * The fields of this item are * - \a target: (item) \b [required] \c the target to reach, * - \a max_angle: (real) \c the maximum angle applied to the item * (default = inf.), * - \a apply_angle: (bool) \c tell (true) if we apply the \a angle of the * movement to the moving item (default = false), * - \a duration: (real) \c the total time of the movement (default = inf.), * - \a max_speed: (real) \c the maximum speed of the item (default = inf.), * - \a acceleration: (real) \c the acceleration of the movement * (default = inf.). * * \author Julien Jorge */ class GENERIC_ITEMS_EXPORT forced_aiming_creator: public engine::forced_movement_creator_with_reference < engine::base_item, universe::forced_aiming > { DECLARE_BASE_ITEM(forced_aiming_creator); public: /** \brief The type of the parent class. */ typedef engine::forced_movement_creator_with_reference < engine::base_item, universe::forced_aiming > super; public: bool set_real_field( const std::string& name, double value ); bool set_bool_field( const std::string& name, bool value ); }; // class forced_aiming_creator } // namespace bear #endif // __BEAR_FORCED_AIMING_CREATOR_HPP__ plee-the-bear-20251226/bear-engine/lib/src/generic_items/forced_movement/forced_goto_creator.hpp000066400000000000000000000032061512343254000326150ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief This class creates a forced movement of type "forced_goto", applies it * to itself then die. * \author Julien Jorge */ #ifndef __BEAR_FORCED_GOTO_CREATOR_HPP__ #define __BEAR_FORCED_GOTO_CREATOR_HPP__ #include "engine/base_item.hpp" #include "universe/forced_movement/forced_goto.hpp" #include "engine/export.hpp" #include "generic_items/class_export.hpp" namespace bear { /** * \brief This class creates a forced movement of type "forced_goto", applies * it to itself then die. * * The fields of this item are * - \a target.x: (real) \b [required] \c the X-position to reach, * - \a target.y: (real) \b [required] \c the Y-position to reach, * - \a duration: (real) \c the total time to reach the target (default = 1), * - \a acceleration_time: (real) \c the duration of the acceleration and * deceleration (default = duration / 2). * * \author Julien Jorge */ class GENERIC_ITEMS_EXPORT forced_goto_creator: public engine::base_item { DECLARE_BASE_ITEM(forced_goto_creator); public: /** \brief The type of the parent class. */ typedef engine::base_item super; public: bool set_real_field( const std::string& name, double value ); void build(); private: /** \brief The movement finally applied. */ universe::forced_goto m_movement; }; // class forced_goto_creator } // namespace bear #endif // __BEAR_FORCED_GOTO_CREATOR_HPP__ plee-the-bear-20251226/bear-engine/lib/src/generic_items/forced_movement/forced_join_creator.hpp000066400000000000000000000030541512343254000326050ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief This class creates a forced movement of type "forced_join", applies it * to itself then die. * \author Julien Jorge */ #ifndef __BEAR_FORCED_JOIN_CREATOR_HPP__ #define __BEAR_FORCED_JOIN_CREATOR_HPP__ #include "engine/base_item.hpp" #include "engine/item_brick/forced_movement_creator_with_reference.hpp" #include "universe/forced_movement/forced_join.hpp" #include "engine/export.hpp" #include "generic_items/class_export.hpp" namespace bear { /** * \brief This class creates a forced movement of type "forced_join", applies * it to itself then die. * * The fields of this item are * - \a target: (item) \b [required] \c the target to reach, * - \a duration: (real) \c the total time to reach the target (default = 1). * * \author Julien Jorge */ class GENERIC_ITEMS_EXPORT forced_join_creator: public engine::forced_movement_creator_with_reference < engine::base_item, universe::forced_join > { DECLARE_BASE_ITEM(forced_join_creator); public: /** \brief The type of the parent class. */ typedef engine::forced_movement_creator_with_reference < engine::base_item, universe::forced_join > super; public: bool set_real_field( const std::string& name, double value ); }; // class forced_join_creator } // namespace bear #endif // __BEAR_FORCED_JOIN_CREATOR_HPP__ forced_movement_destructor_toggle.hpp000066400000000000000000000031561512343254000355240ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/lib/src/generic_items/forced_movement/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief This class removes the forced movement to an item when activated. * \author Sebastien Angibaud */ #ifndef __BEAR_FORCED_MOVEMENT_DESTRUCTOR_TOGGLE_HPP__ #define __BEAR_FORCED_MOVEMENT_DESTRUCTOR_TOGGLE_HPP__ #include "engine/base_item.hpp" #include "engine/item_brick/item_with_toggle.hpp" #include "engine/export.hpp" #include "generic_items/class_export.hpp" namespace bear { /** * \brief This class remove the forced movement to an item when activated. * * The fields of this item are * - \a actor: (item list) \b the item to which the movement is removed * (default = none), * * \author Sebastien Angibaud */ class GENERIC_ITEMS_EXPORT forced_movement_destructor_toggle: public engine::item_with_toggle { DECLARE_BASE_ITEM(forced_movement_destructor_toggle); public: /** \brief The type of the parent class. */ typedef engine::item_with_toggle super; public: forced_movement_destructor_toggle(); bool set_item_list_field ( const std::string& name, const std::vector& value ); bool is_valid() const; void on_toggle_on( engine::base_item* activator ); private: /** \brief The items to move. */ std::vector m_actor; }; // class forced_movement_destructor_toggle } // namespace bear #endif // __BEAR_FORCED_MOVEMENT_DESTRUCTOR_TOGGLE_HPP__ plee-the-bear-20251226/bear-engine/lib/src/generic_items/forced_movement/forced_movement_toggle.hpp000066400000000000000000000034171512343254000333250ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief This class applies a forced movement to an item when activated. * \author Julien Jorge */ #ifndef __BEAR_FORCED_MOVEMENT_TOGGLE_HPP__ #define __BEAR_FORCED_MOVEMENT_TOGGLE_HPP__ #include "engine/base_item.hpp" #include "engine/item_brick/item_with_toggle.hpp" #include "engine/item_brick/forced_movement_applicator.hpp" #include "engine/export.hpp" #include "generic_items/class_export.hpp" namespace bear { /** * \brief This class applies a forced movement to an item when activated. * * The fields of this item are * - \a apply_to_activator: (bool) \c tell if the movement has to be applied * to the activator too (default = false), * * \author Julien Jorge */ class GENERIC_ITEMS_EXPORT forced_movement_toggle: public engine::item_with_toggle { DECLARE_BASE_ITEM(forced_movement_toggle); public: /** \brief The type of the parent class. */ typedef engine::item_with_toggle super; public: forced_movement_toggle(); bool is_valid() const; bool set_bool_field( const std::string& name, bool value ); void on_toggle_on( engine::base_item* activator ); protected: void populate_loader_map( engine::item_loader_map& m ); private: /** \brief Tell if the movement has to be applied to the activator too. */ bool m_apply_to_activator; /** The object that will apply the forced movement. */ engine::forced_movement_applicator m_movement; }; // class forced_movement_toggle } // namespace bear #endif // __BEAR_FORCED_MOVEMENT_TOGGLE_HPP__ plee-the-bear-20251226/bear-engine/lib/src/generic_items/forced_movement/forced_path_creator.hpp000066400000000000000000000051321512343254000326010ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief This class creates a forced movement that joins several items in a * sequence. * \author Julien Jorge */ #ifndef __BEAR_FORCED_PATH_CREATOR_HPP__ #define __BEAR_FORCED_PATH_CREATOR_HPP__ #include "engine/base_item.hpp" #include "universe/forced_movement/forced_sequence.hpp" #include "engine/export.hpp" #include "generic_items/class_export.hpp" namespace bear { /** * \brief This class creates a forced movement that joins several items in a * sequence, applies it to itself then die. * * The fields of this item are * - \a path: (item list) \b [required] \c the items to reach in the path, * must be non empty, * - \a loops: (unsigned int) \c how many times the sequence will be * done (default = no limits = 0), * - \a speed: (real) The speed of the moving item (default = 1). * * \author Julien Jorge */ class GENERIC_ITEMS_EXPORT forced_path_creator: public engine::base_item { DECLARE_BASE_ITEM(forced_path_creator); private: /** * \brief The item loader for the forced path creator. */ class loader: public engine::item_loader_base { private: /** \brief The type of the parent class. */ typedef engine::item_loader_base super; public: explicit loader( universe::forced_sequence& mvt ); loader* clone() const; bool set_field( const std::string& name, unsigned int value ); bool set_field( const std::string& name, double value ); bool set_field ( const std::string& name, const std::vector& value ); private: bool build_sequence( const std::vector& items ); void add_movement_in_sequence ( engine::base_item& item, universe::time_type duration ); private: /** \brief The movement loaded by this loader. */ universe::forced_sequence& m_movement; /** \brief The speed of the item between the vertices of the path. */ double m_speed; }; // class loader public: /** \brief The type of the parent class. */ typedef engine::base_item super; public: void build(); protected: void populate_loader_map( engine::item_loader_map& m ); private: /** \brief The movement finally applied. */ universe::forced_sequence m_movement; }; // class forced_path_creator } // namespace bear #endif // __BEAR_FORCED_PATH_CREATOR_HPP__ plee-the-bear-20251226/bear-engine/lib/src/generic_items/forced_movement/forced_rotation_creator.hpp000066400000000000000000000047441512343254000335140ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief This class creates a forced movement of type "forced_rotation", * applies it to itself then die. * \author Julien Jorge */ #ifndef __BEAR_FORCED_ROTATION_CREATOR_HPP__ #define __BEAR_FORCED_ROTATION_CREATOR_HPP__ #include "engine/base_item.hpp" #include "engine/item_brick/forced_movement_creator_with_reference.hpp" #include "universe/forced_movement/forced_rotation.hpp" #include "engine/export.hpp" #include "generic_items/class_export.hpp" namespace bear { /** * \brief This class creates a forced movement of type "forced_rotation", * applies it to itself then die. * * The fields of this item are * - \a center: (item) \b [required] \c the center of the rotation, * - \a start_angle: (real) the initial angle (default = -3.1415), * - \a end_angle: (real) the final angle (default = 3.1415), * - \a duration: (real) \c the total time needed to go from \a start_angle * to end_angle (default = 1), * - \a radius: (real) the distance of the moving item from the center of the * rotation (default = auto), * - \a loop_back: (bool) tell to play the rotation backward when the end is * reached (default = false), * - \a loops: (unsigned int) do the rotation this number of times * (default = infinity), * - \a apply_angle: (string) tell how the angle of the rotation is applied * to the rotating item. Valid values are "add", "force" and "keep" * (default = "keep"). * * \author Julien Jorge */ class GENERIC_ITEMS_EXPORT forced_rotation_creator: public engine::forced_movement_creator_with_reference < engine::base_item, universe::forced_rotation > { DECLARE_BASE_ITEM(forced_rotation_creator); public: /** \brief The type of the parent class. */ typedef engine::forced_movement_creator_with_reference < engine::base_item, universe::forced_rotation > super; public: bool set_real_field( const std::string& name, double value ); bool set_bool_field( const std::string& name, bool value ); bool set_string_field( const std::string& name, const std::string& value ); bool set_u_integer_field( const std::string& name, unsigned int value ); }; // class forced_rotation_creator } // namespace bear #endif // __BEAR_FORCED_ROTATION_CREATOR_HPP__ plee-the-bear-20251226/bear-engine/lib/src/generic_items/forced_movement/forced_sequence_creator.hpp000066400000000000000000000032511512343254000334550ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief This class creates a forced movement of type "forced_sequence", * applies it to itself then die. * \author Julien Jorge */ #ifndef __BEAR_FORCED_SEQUENCE_CREATOR_HPP__ #define __BEAR_FORCED_SEQUENCE_CREATOR_HPP__ #include "engine/base_item.hpp" #include "universe/forced_movement/forced_sequence.hpp" #include "engine/export.hpp" #include "generic_items/class_export.hpp" namespace bear { /** * \brief This class creates a forced movement of type "forced_sequence", * applies it to itself then die. * * The fields of this item are * - \a movements: (item list) \b [required] \c the movements of the * sequence, must be not empty, * - \a loops: (unsigned int) \c how many times the sequence will be * done (default = no limits = 0). * * \author Julien Jorge */ class GENERIC_ITEMS_EXPORT forced_sequence_creator: public engine::base_item { DECLARE_BASE_ITEM(forced_sequence_creator); public: /** \brief The type of the parent class. */ typedef engine::base_item super; public: bool set_u_integer_field( const std::string& name, unsigned int value ); bool set_item_list_field ( const std::string& name, const std::vector& value ); void build(); private: /** \brief The movement finally applied. */ universe::forced_sequence m_movement; }; // class forced_sequence_creator } // namespace bear #endif // __BEAR_FORCED_SEQUENCE_CREATOR_HPP__ forced_stay_around_creator.hpp000066400000000000000000000041441512343254000341200ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/lib/src/generic_items/forced_movement/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief This class creates a forced movement of type "forced_stay_around", * applies it to itself then die. * \author Julien Jorge */ #ifndef __BEAR_FORCED_STAY_AROUND_CREATOR_HPP__ #define __BEAR_FORCED_STAY_AROUND_CREATOR_HPP__ #include "engine/base_item.hpp" #include "engine/item_brick/forced_movement_creator_with_reference.hpp" #include "universe/forced_movement/forced_stay_around.hpp" #include "engine/export.hpp" #include "generic_items/class_export.hpp" namespace bear { /** * \brief This class creates a forced movement of type "forced_stay_around", * applies it to itself then die. * * The fields of this item are * - \a target: (item) \b [required] \c the item around which we stay, * - \a max_angle: (real) \c the maximum angle applied to the item * (default = inf.), * - \a apply_angle: (bool) \c tell (true) if we apply the \a angle of the * movement to the moving item (default = false), * - \a duration: (real) \c the total time of the movement (default = inf.), * - \a speed: (real) \c the constant speed of the item (default = inf.), * - \a max_distance: (real) \c the maximum allowed distance to the reference * item (default = inf.). * * \author Julien Jorge */ class GENERIC_ITEMS_EXPORT forced_stay_around_creator: public engine::forced_movement_creator_with_reference < engine::base_item, universe::forced_stay_around > { DECLARE_BASE_ITEM(forced_stay_around_creator); public: /** \brief The type of the parent class. */ typedef engine::forced_movement_creator_with_reference < engine::base_item, universe::forced_stay_around > super; public: bool set_real_field( const std::string& name, double value ); bool set_bool_field( const std::string& name, bool value ); }; // class forced_stay_around_creator } // namespace bear #endif // __BEAR_FORCED_STAY_AROUND_CREATOR_HPP__ plee-the-bear-20251226/bear-engine/lib/src/generic_items/forced_movement/forced_tracking_creator.hpp000066400000000000000000000034121512343254000334460ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief This class creates a forced movement of type "forced_tracking", * applies it to itself then die. * \author Julien Jorge */ #ifndef __BEAR_FORCED_TRACKING_CREATOR_HPP__ #define __BEAR_FORCED_TRACKING_CREATOR_HPP__ #include "engine/base_item.hpp" #include "engine/item_brick/forced_movement_creator_with_reference.hpp" #include "universe/forced_movement/forced_tracking.hpp" #include "engine/export.hpp" #include "generic_items/class_export.hpp" namespace bear { /** * \brief This class creates a forced movement of type "forced_tracking", * applies it to itself then die. * * The fields of this item are * - \a target: (item) \b [required] \c the item to follow, * - \a duration: (real) \c the total time of the movement (default = inf.), * - \a dist_x: (real) \c the distance to keep on the X axis * (default = auto), * - \a dist_y: (real) \c the distance to keep on the Y axis * (default = auto), * * \author Julien Jorge */ class GENERIC_ITEMS_EXPORT forced_tracking_creator: public engine::forced_movement_creator_with_reference < engine::base_item, universe::forced_tracking > { DECLARE_BASE_ITEM(forced_tracking_creator); public: /** \brief The type of the parent class. */ typedef engine::forced_movement_creator_with_reference < engine::base_item, universe::forced_tracking > super; public: bool set_real_field( const std::string& name, double value ); }; // class forced_tracking_creator } // namespace bear #endif // __BEAR_FORCED_TRACKING_CREATOR_HPP__ forced_translation_creator.hpp000066400000000000000000000036571512343254000341360ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/lib/src/generic_items/forced_movement/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief This class creates a forced movement of type "forced_translation", * applies it to itself then die. * \author Julien Jorge */ #ifndef __BEAR_FORCED_TRANSLATION_CREATOR_HPP__ #define __BEAR_FORCED_TRANSLATION_CREATOR_HPP__ #include "engine/base_item.hpp" #include "universe/forced_movement/forced_translation.hpp" #include "engine/export.hpp" #include "generic_items/class_export.hpp" namespace bear { /** * \brief This class creates a forced movement of type "forced_translation", * applies it to itself then die. * * The fields of this item are * - \a slant: (real) \c the angle applied to the item (default = 0), * - \a force_angle: (bool) \c tell (true) if we apply the \a angle as is or * (false) if \a angle is added to the angle of the item * (default = false), * - \a duration: (real) \c the total time of the movement (default = inf.), * - \a speed_x: (real) \c the speed of the movement on the X axis * (default = 0), * - \a speed_y: (real) \c the speed of the movement on the Y axis * (default = 0). * * \author Julien Jorge */ class GENERIC_ITEMS_EXPORT forced_translation_creator: public engine::base_item { DECLARE_BASE_ITEM(forced_translation_creator); public: /** \brief The type of the parent class. */ typedef engine::base_item super; public: bool set_real_field( const std::string& name, double value ); bool set_bool_field( const std::string& name, bool value ); void build(); private: /** \brief The movement finally applied. */ universe::forced_translation m_movement; }; // class forced_translation_creator } // namespace bear #endif // __BEAR_FORCED_TRANSLATION_CREATOR_HPP__ natural_forced_movement_creator.hpp000066400000000000000000000041051512343254000351450ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/lib/src/generic_items/forced_movement/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief This class creates a forced movement of type * "natural_forced_movement", applies it to itself then die. * \author Julien Jorge */ #ifndef __BEAR_NATURAL_FORCED_MOVEMENT_CREATOR_HPP__ #define __BEAR_NATURAL_FORCED_MOVEMENT_CREATOR_HPP__ #include "engine/base_item.hpp" #include "universe/forced_movement/natural_forced_movement.hpp" #include "engine/export.hpp" #include "generic_items/class_export.hpp" namespace bear { /** * \brief This class creates a forced movement of type * "natural_natural_forced_movement", applies it to itself then die. * * The fields of this item are * - \a duration: (real) \c the total time of the movement (default = inf.). * * \author Julien Jorge */ class GENERIC_ITEMS_EXPORT natural_forced_movement_creator: public engine::base_item { DECLARE_BASE_ITEM(natural_forced_movement_creator); private: /** * \brief The item loader for the forced path creator. */ class loader: public engine::item_loader_base { private: /** \brief The type of the parent class. */ typedef engine::item_loader_base super; public: explicit loader( universe::natural_forced_movement& mvt ); loader* clone() const; bool set_field( const std::string& name, double value ); private: /** \brief The movement loaded by this loader. */ universe::natural_forced_movement& m_movement; }; // class loader public: /** \brief The type of the parent class. */ typedef engine::base_item super; public: void build(); protected: void populate_loader_map( engine::item_loader_map& m ); private: /** \brief The movement finally applied. */ universe::natural_forced_movement m_movement; }; // class natural_forced_movement_creator } // namespace bear #endif // __BEAR_NATURAL_FORCED_MOVEMENT_CREATOR_HPP__ repeated_forced_movement.hpp000066400000000000000000000027161512343254000335570ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/lib/src/generic_items/forced_movement/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief This class applies a forced movement to several clones of an item and * places them at a constant time interval from each other, then it dies. * \author Julien Jorge */ #ifndef __BEAR_REPEATED_FORCED_MOVEMENT_HPP__ #define __BEAR_REPEATED_FORCED_MOVEMENT_HPP__ #include "engine/base_item.hpp" #include "engine/item_brick/forced_movement_repeater.hpp" #include "engine/export.hpp" #include "generic_items/class_export.hpp" namespace bear { /** * \brief This class applies a forced movement to several clones of an item * and places them at a constant time interval from each other, then it * dies. * \author Julien Jorge */ class GENERIC_ITEMS_EXPORT repeated_forced_movement: public engine::base_item { DECLARE_BASE_ITEM(repeated_forced_movement); public: /** \brief The type of the parent class. */ typedef engine::base_item super; public: bool is_valid() const; void build(); protected: void populate_loader_map( engine::item_loader_map& m ); private: /** The object that will apply the forced movement. */ engine::forced_movement_repeater m_movement; }; // class repeated_forced_movement } // namespace bear #endif // __BEAR_REPEATED_FORCED_MOVEMENT_HPP__ toggle_in_forced_movement_creator.hpp000066400000000000000000000034151512343254000354510ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/lib/src/generic_items/forced_movement/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief This class creates a forced movement of type * "toggle_in_forced_movement", applies it to itself then die. * \author Julien Jorge */ #ifndef __BEAR_TOGGLE_IN_FORCED_MOVEMENT_CREATOR_HPP__ #define __BEAR_TOGGLE_IN_FORCED_MOVEMENT_CREATOR_HPP__ #include "engine/base_item.hpp" #include "engine/forced_movement/toggle_in_forced_movement.hpp" #include "engine/export.hpp" #include "generic_items/class_export.hpp" namespace bear { /** * \brief This class creates a forced movement of type * "toggle_in_forced_movement", applies it to itself then die. * * The fields of this item are * - \a toggle: (item with toggle) \b [required] \c the toggle to insert in * the forced movement, * - \a use_toggle_duration: (bool) \c tell if the duration of the movement * is the delay of the toggle (default = false), * * \author Julien Jorge */ class GENERIC_ITEMS_EXPORT toggle_in_forced_movement_creator: public engine::base_item { DECLARE_BASE_ITEM(toggle_in_forced_movement_creator); public: /** \brief The type of the parent class. */ typedef engine::base_item super; public: bool set_bool_field( const std::string& name, bool value ); bool set_item_field( const std::string& name, engine::base_item* value ); bool is_valid() const; void build(); private: /** \brief The movement finally applied. */ engine::toggle_in_forced_movement m_movement; }; // class toggle_in_forced_movement_creator } // namespace bear #endif // __BEAR_TOGGLE_IN_FORCED_MOVEMENT_CREATOR_HPP__ plee-the-bear-20251226/bear-engine/lib/src/generic_items/friction_rectangle_creator.hpp000066400000000000000000000025521512343254000310130ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief This class adds a universe::friction_rectangle in universe::world * then dies. * \author Julien Jorge */ #ifndef __BEAR_FRICTION_RECTANGLE_CREATOR_HPP__ #define __BEAR_FRICTION_RECTANGLE_CREATOR_HPP__ #include "engine/base_item.hpp" #include "engine/export.hpp" #include "generic_items/class_export.hpp" namespace bear { /** * \brief This class adds a universe::friction_rectangle in universe::world * then dies. * * The fields of this item are * - \a friction: (real) \c the friction in the rectangle (default = 1). * * \author Julien Jorge */ class GENERIC_ITEMS_EXPORT friction_rectangle_creator: public engine::base_item { DECLARE_BASE_ITEM(friction_rectangle_creator); public: /** \brief The type of the parent class. */ typedef engine::base_item super; public: friction_rectangle_creator(); bool set_real_field( const std::string& name, double value ); void build(); private: /** \brief Friction applied to the items. */ double m_friction; }; // class friction_rectangle_creator } // namespace bear #endif // __BEAR_FRICTION_RECTANGLE_CREATOR_HPP__ plee-the-bear-20251226/bear-engine/lib/src/generic_items/game_quit.hpp000066400000000000000000000021711512343254000254030ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief An item that quit the game. * \author Sebastien Angibaud */ #ifndef __BEAR_GAME_QUIT_HPP__ #define __BEAR_GAME_QUIT_HPP__ #include "engine/base_item.hpp" #include "engine/item_brick/with_toggle.hpp" #include "universe/derived_item_handle.hpp" #include "engine/export.hpp" #include "generic_items/class_export.hpp" namespace bear { /** * \brief An item that quit the game. * * The valid fields for this item are * - any field supported by the parent classes. * * \author Sebastien Angibaud */ class GENERIC_ITEMS_EXPORT game_quit: public engine::base_item, public engine::with_toggle { DECLARE_BASE_ITEM(game_quit); public: /** \brief The type of the parent class. */ typedef engine::base_item super; public: game_quit(); private: void toggle_on( base_item* activator ); }; // class game_quit } // namespace bear #endif // __BEAR_GAME_QUIT_HPP__ plee-the-bear-20251226/bear-engine/lib/src/generic_items/game_variable/000077500000000000000000000000001512343254000254745ustar00rootroot00000000000000bool_game_variable_getter_creator.hpp000066400000000000000000000035271512343254000350170ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/lib/src/generic_items/game_variable/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A boolean expression that returns the value of a game variable. * \author Julien Jorge */ #ifndef __BEAR_BOOL_GAME_VARIABLE_GETTER_CREATOR_HPP__ #define __BEAR_BOOL_GAME_VARIABLE_GETTER_CREATOR_HPP__ #include "engine/base_item.hpp" #include "engine/function/bool_game_variable_getter.hpp" #include "engine/item_brick/with_boolean_expression_creation.hpp" #include "engine/export.hpp" #include "generic_items/class_export.hpp" namespace bear { /** * \brief A boolean expression that returns the value of a game variable. * * The valid fields for this item are * - name The name of the variable to get, * - default_value The default value of the variable, if not set, * - any field supported by the parent classes. * * \author Sébastien Angibaud */ class GENERIC_ITEMS_EXPORT bool_game_variable_getter_creator: public engine::base_item, public engine::with_boolean_expression_creation { DECLARE_BASE_ITEM(bool_game_variable_getter_creator); public: /** \brief The type of the parent class. */ typedef engine::base_item super; public: bool_game_variable_getter_creator(); void build(); bool is_valid() const; bool set_string_field ( const std::string& name, const std::string& value ); bool set_bool_field( const std::string& name, bool value ); private: virtual expr::boolean_expression do_get_expression() const; private: /** \brief The expression created by this item. */ engine::bool_game_variable_getter m_expr; }; // class bool_game_variable_getter_creator } // namespace bear #endif // __BEAR_BOOL_GAME_VARIABLE_GETTER_CREATOR_HPP__ plee-the-bear-20251226/bear-engine/lib/src/generic_items/game_variable/bool_game_variable_setter.hpp000066400000000000000000000050221512343254000333630ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief An item that sets the value of a boolean game variable. * \author Angibaud Sebastien */ #ifndef __BEAR_BOOL_GAME_VARIABLE_SETTER_HPP__ #define __BEAR_BOOL_GAME_VARIABLE_SETTER_HPP__ #include "engine/base_item.hpp" #include "engine/item_brick/make_autokill_from_class.hpp" #include "engine/item_brick/make_toggle_on_from_class.hpp" #include "engine/export.hpp" #include "generic_items/class_export.hpp" namespace bear { /** * \brief A item that sets the value of a boolean game variable. * * The valid fields for this item are * - name The name of the variable to set. * - value The new value of the variable (default=false). * - any field supported by the parent classes. * * \author Sebastien Angibaud */ class GENERIC_ITEMS_EXPORT bool_game_variable_setter: public engine::base_item { DECLARE_BASE_ITEM(bool_game_variable_setter); public: /** \brief The type of the parent class. */ typedef engine::base_item super; public: bool_game_variable_setter(); bool is_valid() const; bool set_bool_field( const std::string& name, bool value ); bool set_string_field ( const std::string& name, const std::string& value ); void assign_game_variable_value() const; private: /** \brief The name of the variable. */ std::string m_name; /** \brief The new value of the variable. */ bool m_value; }; // class bool_game_variable_setter /** \brief A game variable setter that sets the variable in its build and kills itself. */ class GENERIC_ITEMS_EXPORT bool_game_variable_setter_suicide: public engine::make_autokill_from_class_const < bool_game_variable_setter, &bool_game_variable_setter::assign_game_variable_value > { DECLARE_BASE_ITEM(bool_game_variable_setter_suicide); }; // class bool_game_variable_setter_suicide /** \brief A game variable setter in a toggle. The value of the variable is set when toggled on. */ class GENERIC_ITEMS_EXPORT bool_game_variable_setter_toggle: public engine::make_toggle_on_from_class_const < bool_game_variable_setter, &bool_game_variable_setter::assign_game_variable_value > { DECLARE_BASE_ITEM(bool_game_variable_setter_toggle); }; // class bool_game_variable_setter_toggle } // namespace bear #endif // __BEAR_BOOL_GAME_VARIABLE_SETTER_HPP__ plee-the-bear-20251226/bear-engine/lib/src/generic_items/game_variable/code/000077500000000000000000000000001512343254000264065ustar00rootroot00000000000000bool_game_variable_getter_creator.cpp000066400000000000000000000055471512343254000357300ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/lib/src/generic_items/game_variable/code/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::bool_game_variable_getter_creator class. * \author Sébastien Angibaud */ #include "generic_items/game_variable/bool_game_variable_getter_creator.hpp" BASE_ITEM_EXPORT( bool_game_variable_getter_creator, bear ) /*----------------------------------------------------------------------------*/ /** * \brief Contructor. */ bear::bool_game_variable_getter_creator::bool_game_variable_getter_creator() { m_expr.set_default_value(false); } // bool_game_variable_getter_creator::bool_game_variable_getter_creator() /*----------------------------------------------------------------------------*/ /** * \brief Initialize the item. */ void bear::bool_game_variable_getter_creator::build() { kill(); } // bool_game_variable_getter_creator::build() /*----------------------------------------------------------------------------*/ /** * \brief Tell if the item is correctly initialized. */ bool bear::bool_game_variable_getter_creator::is_valid() const { return !m_expr.get_name().empty() && super::is_valid(); } // bool_game_variable_getter_creator::is_valid() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type \c string. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::bool_game_variable_getter_creator::set_string_field ( const std::string& name, const std::string& value ) { bool result = true; if ( name == "bool_game_variable_getter_creator.name" ) m_expr.set_name(value); else result = super::set_string_field(name, value); return result; } // bool_game_variable_getter_creator::set_string_field() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type \c boolean. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::bool_game_variable_getter_creator::set_bool_field ( const std::string& name, bool value ) { bool result = true; if ( name == "bool_game_variable_getter_creator.default_value" ) m_expr.set_default_value(value); else result = super::set_bool_field(name, value); return result; } // bool_game_variable_getter_creator::set_bool_field() /*----------------------------------------------------------------------------*/ /** * \brief Get the expression created by this item. */ bear::expr::boolean_expression bear::bool_game_variable_getter_creator::do_get_expression() const { return m_expr; } // bool_game_variable_getter_creator::do_get_expression() bool_game_variable_setter.cpp000066400000000000000000000052741512343254000342220ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/lib/src/generic_items/game_variable/code/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::bool_game_variable_setter class. * \author Sebastien Angibaud */ #include "generic_items/game_variable/bool_game_variable_setter.hpp" #include "engine/game.hpp" #include "engine/variable/variable.hpp" BASE_ITEM_EXPORT( bool_game_variable_setter, bear ) BASE_ITEM_EXPORT( bool_game_variable_setter_suicide, bear ) BASE_ITEM_EXPORT( bool_game_variable_setter_toggle, bear ) /*----------------------------------------------------------------------------*/ /** * \brief Contructor. */ bear::bool_game_variable_setter::bool_game_variable_setter() : m_value(false) { } // bool_game_variable_setter::bool_game_variable_setter() /*----------------------------------------------------------------------------*/ /** * \brief Tell if the item is correctly initialized. */ bool bear::bool_game_variable_setter::is_valid() const { return !m_name.empty() && super::is_valid(); } // bool_game_variable_setter::is_valid() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type "bool". * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::bool_game_variable_setter::set_bool_field ( const std::string& name, bool value ) { bool result = true; if ( name == "bool_game_variable_setter.value" ) m_value = value; else result = super::set_bool_field( name, value ); return result; } // bool_game_variable_setter::set_bool_field() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type \c string. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::bool_game_variable_setter::set_string_field ( const std::string& name, const std::string& value ) { bool result = true; if ( name == "bool_game_variable_setter.name" ) m_name = value; else result = super::set_string_field(name, value); return result; } // bool_game_variable_setter::set_string_field() /*----------------------------------------------------------------------------*/ /** * \brief Assign the value to the game variable. */ void bear::bool_game_variable_setter::assign_game_variable_value() const { engine::game::get_instance().set_game_variable ( engine::variable( m_name, m_value ) ); } // bool_game_variable_setter::assign_game_variable_value() int_game_variable_setter.cpp000066400000000000000000000052551512343254000340600ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/lib/src/generic_items/game_variable/code/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::int_game_variable_setter class. * \author Sebastien Angibaud */ #include "generic_items/game_variable/int_game_variable_setter.hpp" #include "engine/game.hpp" #include "engine/variable/variable.hpp" BASE_ITEM_EXPORT( int_game_variable_setter, bear ) BASE_ITEM_EXPORT( int_game_variable_setter_suicide, bear ) BASE_ITEM_EXPORT( int_game_variable_setter_toggle, bear ) /*----------------------------------------------------------------------------*/ /** * \brief Contructor. */ bear::int_game_variable_setter::int_game_variable_setter() : m_value(0) { } // int_game_variable_setter::int_game_variable_setter() /*----------------------------------------------------------------------------*/ /** * \brief Tell if the item is correctly initialized. */ bool bear::int_game_variable_setter::is_valid() const { return (!m_name.empty()) && super::is_valid(); } // int_game_variable_setter::is_valid() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type "int". * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::int_game_variable_setter::set_integer_field ( const std::string& name, int value ) { bool result = true; if ( name == "int_game_variable_setter.value" ) m_value = value; else result = super::set_integer_field( name, value ); return result; } // int_game_variable_setter::set_integer_field() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type \c string. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::int_game_variable_setter::set_string_field ( const std::string& name, const std::string& value ) { bool result = true; if ( name == "int_game_variable_setter.name" ) m_name = value; else result = super::set_string_field(name, value); return result; } // int_game_variable_setter::set_string_field() /*----------------------------------------------------------------------------*/ /** * \brief Assign the value to the game variable. */ void bear::int_game_variable_setter::assign_game_variable_value() const { engine::game::get_instance().set_game_variable ( engine::variable( m_name, m_value ) ); } // int_game_variable_setter::assign_game_variable_value() real_game_variable_setter.cpp000066400000000000000000000053001512343254000342000ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/lib/src/generic_items/game_variable/code/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::real_game_variable_setter class. * \author Sebastien Angibaud */ #include "generic_items/game_variable/real_game_variable_setter.hpp" #include "engine/game.hpp" #include "engine/variable/variable.hpp" BASE_ITEM_EXPORT( real_game_variable_setter, bear ) BASE_ITEM_EXPORT( real_game_variable_setter_suicide, bear ) BASE_ITEM_EXPORT( real_game_variable_setter_toggle, bear ) /*----------------------------------------------------------------------------*/ /** * \brief Contructor. */ bear::real_game_variable_setter::real_game_variable_setter() : m_value(0) { } // real_game_variable_setter::real_game_variable_setter() /*----------------------------------------------------------------------------*/ /** * \brief Tell if the item is correctly initialized. */ bool bear::real_game_variable_setter::is_valid() const { return (!m_name.empty()) && super::is_valid(); } // real_game_variable_setter::is_valid() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type "double". * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::real_game_variable_setter::set_real_field ( const std::string& name, double value ) { bool result = true; if ( name == "real_game_variable_setter.value" ) m_value = value; else result = super::set_real_field( name, value ); return result; } // real_game_variable_setter::set_real_field() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type \c string. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::real_game_variable_setter::set_string_field ( const std::string& name, const std::string& value ) { bool result = true; if ( name == "real_game_variable_setter.name" ) m_name = value; else result = super::set_string_field(name, value); return result; } // real_game_variable_setter::set_string_field() /*----------------------------------------------------------------------------*/ /** * \brief Assign the value to the game variable. */ void bear::real_game_variable_setter::assign_game_variable_value() const { engine::game::get_instance().set_game_variable ( engine::variable( m_name, m_value ) ); } // real_game_variable_setter::assign_game_variable_value() string_game_variable_setter.cpp000066400000000000000000000043571512343254000345760ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/lib/src/generic_items/game_variable/code/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::string_game_variable_setter class. * \author Sebastien Angibaud */ #include "generic_items/game_variable/string_game_variable_setter.hpp" #include "engine/game.hpp" #include "engine/variable/variable.hpp" BASE_ITEM_EXPORT( string_game_variable_setter, bear ) BASE_ITEM_EXPORT( string_game_variable_setter_suicide, bear ) BASE_ITEM_EXPORT( string_game_variable_setter_toggle, bear ) /*----------------------------------------------------------------------------*/ /** * \brief Contructor. */ bear::string_game_variable_setter::string_game_variable_setter() : m_name(""), m_value("") { } // string_game_variable_setter::string_game_variable_setter() /*----------------------------------------------------------------------------*/ /** * \brief Tell if the item is correctly initialized. */ bool bear::string_game_variable_setter::is_valid() const { return (!m_name.empty()) && super::is_valid(); } // string_game_variable_setter::is_valid() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type \c string. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::string_game_variable_setter::set_string_field ( const std::string& name, const std::string& value ) { bool result = true; if ( name == "string_game_variable_setter.name" ) m_name = value; else if ( name == "string_game_variable_setter.value" ) m_value = value; else result = super::set_string_field(name, value); return result; } // string_game_variable_setter::set_string_field() /*----------------------------------------------------------------------------*/ /** * \brief Assign the value to the game variable. */ void bear::string_game_variable_setter::assign_game_variable_value() const { engine::game::get_instance().set_game_variable ( engine::variable( m_name, m_value ) ); } // string_game_variable_setter::assign_game_variable_value() u_int_game_variable_getter_creator.cpp000066400000000000000000000056131512343254000361050ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/lib/src/generic_items/game_variable/code/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::u_int_game_variable_getter_creator class. * \author Julien Jorge */ #include "generic_items/game_variable/u_int_game_variable_getter_creator.hpp" BASE_ITEM_EXPORT( u_int_game_variable_getter_creator, bear ) /*----------------------------------------------------------------------------*/ /** * \brief Contructor. */ bear::u_int_game_variable_getter_creator::u_int_game_variable_getter_creator() { m_expr.set_default_value(0); } // u_int_game_variable_getter_creator::u_int_game_variable_getter_creator() /*----------------------------------------------------------------------------*/ /** * \brief Initialize the item. */ void bear::u_int_game_variable_getter_creator::build() { kill(); } // u_int_game_variable_getter_creator::build() /*----------------------------------------------------------------------------*/ /** * \brief Tell if the item is correctly initialized. */ bool bear::u_int_game_variable_getter_creator::is_valid() const { return !m_expr.get_name().empty() && super::is_valid(); } // u_int_game_variable_getter_creator::is_valid() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type \c string. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::u_int_game_variable_getter_creator::set_string_field ( const std::string& name, const std::string& value ) { bool result = true; if ( name == "u_int_game_variable_getter_creator.name" ) m_expr.set_name(value); else result = super::set_string_field(name, value); return result; } // u_int_game_variable_getter_creator::set_string_field() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type \c unsigned integer. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::u_int_game_variable_getter_creator::set_u_integer_field ( const std::string& name, unsigned int value ) { bool result = true; if ( name == "u_int_game_variable_getter_creator.default_value" ) m_expr.set_default_value(value); else result = super::set_u_integer_field(name, value); return result; } // u_int_game_variable_getter_creator::set_u_int_field() /*----------------------------------------------------------------------------*/ /** * \brief Get the expression created by this item. */ bear::expr::linear_expression bear::u_int_game_variable_getter_creator::do_get_expression() const { return m_expr; } // u_int_game_variable_getter_creator::do_get_expression() u_int_game_variable_setter.cpp000066400000000000000000000053641512343254000344050ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/lib/src/generic_items/game_variable/code/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::u_int_game_variable_setter class. * \author Sebastien Angibaud */ #include "generic_items/game_variable/u_int_game_variable_setter.hpp" #include "engine/game.hpp" #include "engine/variable/variable.hpp" BASE_ITEM_EXPORT( u_int_game_variable_setter, bear ) BASE_ITEM_EXPORT( u_int_game_variable_setter_suicide, bear ) BASE_ITEM_EXPORT( u_int_game_variable_setter_toggle, bear ) /*----------------------------------------------------------------------------*/ /** * \brief Contructor. */ bear::u_int_game_variable_setter::u_int_game_variable_setter() : m_value(0) { } // u_int_game_variable_setter::u_int_game_variable_setter() /*----------------------------------------------------------------------------*/ /** * \brief Tell if the item is correctly initialized. */ bool bear::u_int_game_variable_setter::is_valid() const { return (!m_name.empty()) && super::is_valid(); } // u_int_game_variable_setter::is_valid() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type "unsigned int". * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::u_int_game_variable_setter::set_u_integer_field ( const std::string& name, unsigned int value ) { bool result = true; if ( name == "u_int_game_variable_setter.value" ) m_value = value; else result = super::set_u_integer_field( name, value ); return result; } // u_int_game_variable_setter::set_u_integer_field() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type \c string. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::u_int_game_variable_setter::set_string_field ( const std::string& name, const std::string& value ) { bool result = true; if ( name == "u_int_game_variable_setter.name" ) m_name = value; else result = super::set_string_field(name, value); return result; } // u_int_game_variable_setter::set_string_field() /*----------------------------------------------------------------------------*/ /** * \brief Assign the value to the game variable. */ void bear::u_int_game_variable_setter::assign_game_variable_value() const { engine::game::get_instance().set_game_variable ( engine::variable( m_name, m_value ) ); } // u_int_game_variable_setter::assign_game_variable_value() plee-the-bear-20251226/bear-engine/lib/src/generic_items/game_variable/int_game_variable_setter.hpp000066400000000000000000000047641512343254000332360ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief An item that sets the value of an integer game variable. * \author Angibaud Sebastien */ #ifndef __BEAR_INT_GAME_VARIABLE_SETTER_HPP__ #define __BEAR_INT_GAME_VARIABLE_SETTER_HPP__ #include "engine/base_item.hpp" #include "engine/item_brick/make_autokill_from_class.hpp" #include "engine/item_brick/make_toggle_on_from_class.hpp" #include "engine/export.hpp" #include "generic_items/class_export.hpp" namespace bear { /** * \brief A item that sets the value of an integer game variable. * * The valid fields for this item are * - name The name of the variable to set. * - value The new value of the variable. * - any field supported by the parent classes. * * \author Sebastien Angibaud */ class GENERIC_ITEMS_EXPORT int_game_variable_setter: public engine::base_item { DECLARE_BASE_ITEM(int_game_variable_setter); public: /** \brief The type of the parent class. */ typedef engine::base_item super; public: int_game_variable_setter(); bool is_valid() const; bool set_integer_field( const std::string& name, int value ); bool set_string_field ( const std::string& name, const std::string& value ); void assign_game_variable_value() const; private: /** \brief The name of the variable. */ std::string m_name; /** \brief The new value of the variable. */ int m_value; }; // class int_game_variable_setter /** \brief A game variable setter that sets the variable in its build and kills itself. */ class GENERIC_ITEMS_EXPORT int_game_variable_setter_suicide: public engine::make_autokill_from_class_const < int_game_variable_setter, &int_game_variable_setter::assign_game_variable_value > { DECLARE_BASE_ITEM(int_game_variable_setter_suicide); }; // class int_game_variable_setter_suicide /** \brief A game variable setter in a toggle. The value of the variable is set when toggled on. */ class GENERIC_ITEMS_EXPORT int_game_variable_setter_toggle: public engine::make_toggle_on_from_class_const < int_game_variable_setter, &int_game_variable_setter::assign_game_variable_value > { DECLARE_BASE_ITEM(int_game_variable_setter_toggle); }; // class int_game_variable_setter_toggle } // namespace bear #endif // __BEAR_INT_GAME_VARIABLE_SETTER_HPP__ plee-the-bear-20251226/bear-engine/lib/src/generic_items/game_variable/real_game_variable_setter.hpp000066400000000000000000000050001512343254000333470ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief An item that sets the value of a real game variable. * \author Angibaud Sebastien */ #ifndef __BEAR_REAL_GAME_VARIABLE_SETTER_HPP__ #define __BEAR_REAL_GAME_VARIABLE_SETTER_HPP__ #include "engine/base_item.hpp" #include "engine/item_brick/make_autokill_from_class.hpp" #include "engine/item_brick/make_toggle_on_from_class.hpp" #include "engine/export.hpp" #include "generic_items/class_export.hpp" namespace bear { /** * \brief A item that sets the value of a real game variable. * * The valid fields for this item are * - name The name of the variable to set. * - value The new value of the variable. * - any field supported by the parent classes. * * \author Sebastien Angibaud */ class GENERIC_ITEMS_EXPORT real_game_variable_setter: public engine::base_item { DECLARE_BASE_ITEM(real_game_variable_setter); public: /** \brief The type of the parent class. */ typedef engine::base_item super; public: real_game_variable_setter(); bool is_valid() const; bool set_real_field( const std::string& name, double value ); bool set_string_field ( const std::string& name, const std::string& value ); void assign_game_variable_value() const; private: /** \brief The name of the variable. */ std::string m_name; /** \brief The new value of the variable. */ double m_value; }; // class real_game_variable_setter /** \brief A game variable setter that sets the variable in its build and kills itself. */ class GENERIC_ITEMS_EXPORT real_game_variable_setter_suicide: public engine::make_autokill_from_class_const < real_game_variable_setter, &real_game_variable_setter::assign_game_variable_value > { DECLARE_BASE_ITEM(real_game_variable_setter_suicide); }; // class real_game_variable_setter_suicide /** \brief A game variable setter in a toggle. The value of the variable is set when toggled on. */ class GENERIC_ITEMS_EXPORT real_game_variable_setter_toggle: public engine::make_toggle_on_from_class_const < real_game_variable_setter, &real_game_variable_setter::assign_game_variable_value > { DECLARE_BASE_ITEM(real_game_variable_setter_toggle); }; // class real_game_variable_setter_toggle } // namespace bear #endif // __BEAR_REAL_GAME_VARIABLE_SETTER_HPP__ string_game_variable_setter.hpp000066400000000000000000000047511512343254000336670ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/lib/src/generic_items/game_variable/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief An item that sets the value of a string game variable. * \author Angibaud Sebastien */ #ifndef __BEAR_STRING_GAME_VARIABLE_SETTER_HPP__ #define __BEAR_STRING_GAME_VARIABLE_SETTER_HPP__ #include "engine/base_item.hpp" #include "engine/item_brick/make_autokill_from_class.hpp" #include "engine/item_brick/make_toggle_on_from_class.hpp" #include "engine/export.hpp" #include "generic_items/class_export.hpp" namespace bear { /** * \brief A item that sets the value of a string game variable. * * The valid fields for this item are * - name The name of the variable to set. * - value The new value of the variable. * - any field supported by the parent classes. * * \author Sebastien Angibaud */ class GENERIC_ITEMS_EXPORT string_game_variable_setter: public engine::base_item { DECLARE_BASE_ITEM(string_game_variable_setter); public: /** \brief The type of the parent class. */ typedef engine::base_item super; public: string_game_variable_setter(); bool is_valid() const; bool set_string_field ( const std::string& name, const std::string& value ); void assign_game_variable_value() const; private: /** \brief The name of the variable. */ std::string m_name; /** \brief The new value of the variable. */ std::string m_value; }; // class string_game_variable_setter /** \brief A game variable setter that sets the variable in its build and kills itself. */ class GENERIC_ITEMS_EXPORT string_game_variable_setter_suicide: public engine::make_autokill_from_class_const < string_game_variable_setter, &string_game_variable_setter::assign_game_variable_value > { DECLARE_BASE_ITEM(string_game_variable_setter_suicide); }; // class string_game_variable_setter_suicide /** \brief A game variable setter in a toggle. The value of the variable is set when toggled on. */ class GENERIC_ITEMS_EXPORT string_game_variable_setter_toggle: public engine::make_toggle_on_from_class_const < string_game_variable_setter, &string_game_variable_setter::assign_game_variable_value > { DECLARE_BASE_ITEM(string_game_variable_setter_toggle); }; // class string_game_variable_setter_toggle } // namespace bear #endif // __BEAR_STRING_GAME_VARIABLE_SETTER_HPP__ u_int_game_variable_getter_creator.hpp000066400000000000000000000035641512343254000352030ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/lib/src/generic_items/game_variable/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A linear expression that returns the value of a game variable. * \author Julien Jorge */ #ifndef __BEAR_U_INT_GAME_VARIABLE_GETTER_CREATOR_HPP__ #define __BEAR_U_INT_GAME_VARIABLE_GETTER_CREATOR_HPP__ #include "engine/base_item.hpp" #include "engine/function/linear_game_variable_getter.hpp" #include "engine/item_brick/with_linear_expression_creation.hpp" #include "engine/export.hpp" #include "generic_items/class_export.hpp" namespace bear { /** * \brief A linear expression that returns the value of a game variable. * * The valid fields for this item are * - name: The name of the variable to get, * - default_value: The default value of the variable, if not set, * - any field supported by the parent classes. * * \author Julien Jorge */ class GENERIC_ITEMS_EXPORT u_int_game_variable_getter_creator: public engine::base_item, public engine::with_linear_expression_creation { DECLARE_BASE_ITEM(u_int_game_variable_getter_creator); public: /** \brief The type of the parent class. */ typedef engine::base_item super; public: u_int_game_variable_getter_creator(); void build(); bool is_valid() const; bool set_string_field ( const std::string& name, const std::string& value ); bool set_u_integer_field( const std::string& name, unsigned int value ); private: virtual expr::linear_expression do_get_expression() const; private: /** \brief The expression created by this item. */ engine::linear_game_variable_getter m_expr; }; // class u_int_game_variable_getter_creator } // namespace bear #endif // __BEAR_U_INT_GAME_VARIABLE_GETTER_CREATOR_HPP__ u_int_game_variable_setter.hpp000066400000000000000000000050641512343254000334750ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/lib/src/generic_items/game_variable/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief An item that sets the value of an unsigned int game variable. * \author Angibaud Sebastien */ #ifndef __BEAR_U_INT_GAME_VARIABLE_SETTER_HPP__ #define __BEAR_U_INT_GAME_VARIABLE_SETTER_HPP__ #include "engine/base_item.hpp" #include "engine/item_brick/make_autokill_from_class.hpp" #include "engine/item_brick/make_toggle_on_from_class.hpp" #include "engine/export.hpp" #include "generic_items/class_export.hpp" namespace bear { /** * \brief A item that sets the value of an unsigned int game variable. * * The valid fields for this item are * - name The name of the variable to set. * - value The new value of the variable. * - any field supported by the parent classes. * * \author Sebastien Angibaud */ class GENERIC_ITEMS_EXPORT u_int_game_variable_setter: public engine::base_item { DECLARE_BASE_ITEM(u_int_game_variable_setter); public: /** \brief The type of the parent class. */ typedef engine::base_item super; public: u_int_game_variable_setter(); bool is_valid() const; bool set_u_integer_field( const std::string& name, unsigned int value ); bool set_string_field ( const std::string& name, const std::string& value ); void assign_game_variable_value() const; private: /** \brief The name of the variable. */ std::string m_name; /** \brief The new value of the variable. */ unsigned int m_value; }; // class u_int_game_variable_setter /** \brief A game variable setter that sets the variable in its build and kills itself. */ class GENERIC_ITEMS_EXPORT u_int_game_variable_setter_suicide: public engine::make_autokill_from_class_const < u_int_game_variable_setter, &u_int_game_variable_setter::assign_game_variable_value > { DECLARE_BASE_ITEM(u_int_game_variable_setter_suicide); }; // class u_int_game_variable_setter_suicide /** \brief A game variable setter in a toggle. The value of the variable is set when toggled on. */ class GENERIC_ITEMS_EXPORT u_int_game_variable_setter_toggle: public engine::make_toggle_on_from_class_const < u_int_game_variable_setter, &u_int_game_variable_setter::assign_game_variable_value > { DECLARE_BASE_ITEM(u_int_game_variable_setter_toggle); }; // class u_int_game_variable_setter_toggle } // namespace bear #endif // __BEAR_U_INT_GAME_VARIABLE_SETTER_HPP__ plee-the-bear-20251226/bear-engine/lib/src/generic_items/hidden_block.hpp000066400000000000000000000040271512343254000260370ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A class representing a hidden_block. * \author Sebastien Angibaud */ #ifndef __BEAR_HIDDEN_BLOCK_HPP__ #define __BEAR_HIDDEN_BLOCK_HPP__ #include "generic_items/block.hpp" #include "generic_items/class_export.hpp" #include "engine/export.hpp" namespace bear { /** * \brief A class representing a block that change its opacity * when it collides an other item. * * The custom fields of this class are: * - \a opacity.passive: \c (real) The opacity when no item collides. * - \a opacity.active: \c (real) The opacity when we an item collides. * - \a transition_duration: \c (real) The duration for opacity changing. * \author Sebastien Angibaud */ class GENERIC_ITEMS_EXPORT hidden_block: public block { DECLARE_BASE_ITEM(hidden_block); typedef block super; public: hidden_block(); void progress( universe::time_type elapsed_time ); bool set_real_field( const std::string& name, double value ); private: void collision( engine::base_item& that, universe::collision_info& info ); void select_active_opacity(); void select_passive_opacity(); protected: void to_string( std::string& str ) const; private: /** \brief Indicates if an item collides. */ bool m_active_state; /** \brief Indicates if there is a new collision during the iteration. */ bool m_new_collision; /** \brief The duration of the change of opacity. */ bear::universe::time_type m_transition_duration; /** \brief The time since the last modification. */ bear::universe::time_type m_last_modification; /** \brief The opacity when no item collides. */ double m_passive_opacity; /** \brief The opacity when an item collides. */ double m_active_opacity; }; // class hidden_block } // namespace bear #endif // __BEAR_HIDDEN_BLOCK_HPP__ plee-the-bear-20251226/bear-engine/lib/src/generic_items/item_creator.hpp000066400000000000000000000027671512343254000261200ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief An item that creates some items when it is activated. * \author Sébastien Angibaud */ #ifndef __BEAR_ITEM_CREATOR_HPP__ #define __BEAR_ITEM_CREATOR_HPP__ #include "engine/base_item.hpp" #include "engine/item_brick/item_with_toggle.hpp" #include "engine/export.hpp" #include "generic_items/class_export.hpp" namespace bear { /** * \brief An item that creates some items when it is activated. * * The custom fields of this class are: * - items (list of reference item) The list of item to create (required). * - any field supported by the parent class. * * \author Sébastien Angibaud */ class GENERIC_ITEMS_EXPORT item_creator: public engine::item_with_toggle { DECLARE_BASE_ITEM(item_creator); public: /** \brief The type of the parent class. */ typedef engine::item_with_toggle super; public: ~item_creator(); void build(); bool set_item_list_field ( const std::string& name, const std::vector& value ); bool is_valid() const; private: void on_toggle_on( base_item* activator ); private: /** \brief Items that are created. */ std::vector m_items; }; // class item_creator } // namespace bear #endif // __BEAR_ITEM_CREATOR_HPP__ plee-the-bear-20251226/bear-engine/lib/src/generic_items/killer.hpp000066400000000000000000000033651512343254000247200ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief An item that kills other items. * \author Julien Jorge */ #ifndef __BEAR_KILLER_HPP__ #define __BEAR_KILLER_HPP__ #include "engine/base_item.hpp" #include "engine/item_brick/with_toggle.hpp" #include "universe/derived_item_handle.hpp" #include "engine/export.hpp" #include "generic_items/class_export.hpp" namespace bear { /** * \brief An item that kills other items and itself. * * The valid fields for this item are * - \a kill_activator: (bool) Tell if the activator must be killed too * (default = false), * - \a items: \c (list of items) The items to kill, * - any field supported by the parent classes. * * \author Julien Jorge */ class GENERIC_ITEMS_EXPORT killer: public engine::base_item, public engine::with_toggle { DECLARE_BASE_ITEM(killer); public: /** \brief The type of the parent class. */ typedef engine::base_item super; private: /** \brief The type of the handles on the items to kill. */ typedef universe::derived_item_handle handle_type; public: killer(); bool set_item_list_field ( const std::string& name, const std::vector& value ); bool set_bool_field( const std::string& name, bool value ); private: void toggle_on( base_item* activator ); private: /** \brief The list of items to kill. */ std::vector m_items; /** \brief Tell if we kill the activator too. */ bool m_kill_activator; }; // class killer } // namespace bear #endif // __BEAR_KILLER_HPP__ plee-the-bear-20251226/bear-engine/lib/src/generic_items/layer/000077500000000000000000000000001512343254000240325ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/lib/src/generic_items/layer/action_layer.hpp000066400000000000000000000027511512343254000272210ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief The layer where all entities live. * \author Julien Jorge */ #ifndef __BEAR_ACTION_LAYER_HPP__ #define __BEAR_ACTION_LAYER_HPP__ #include "engine/world.hpp" #include "engine/layer/layer.hpp" #include "engine/base_item.hpp" #include "generic_items/class_export.hpp" namespace bear { /** * \brief The layer where all entities live. */ class GENERIC_ITEMS_EXPORT action_layer: public engine::layer { public: action_layer( const universe::size_box_type& size ); virtual void start(); virtual void progress ( const region_type& active_area, universe::time_type elapsed_time ); private: void do_get_visual( std::list& visuals, const universe::rectangle_type& visible_area ) const; void do_add_item( engine::base_item& that ); void do_remove_item( engine::base_item& item ); void do_drop_item( engine::base_item& item ); void static_item( engine::base_item& that ); void mobile_item( engine::base_item& that ); engine::world* do_get_world(); const engine::world* do_get_world() const; private: /** \brief The world, and physic rules associated. */ engine::world m_world; }; // class action_layer } // namespace bear #endif // __BEAR_ACTION_LAYER_HPP__ plee-the-bear-20251226/bear-engine/lib/src/generic_items/layer/code/000077500000000000000000000000001512343254000247445ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/lib/src/generic_items/layer/code/action_layer.cpp000066400000000000000000000077661512343254000301410ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::action_layer class. * \author Julien Jorge */ #include "generic_items/layer/action_layer.hpp" #include "engine/level_globals.hpp" #include "engine/layer/export.hpp" LAYER_EXPORT( action_layer, bear ) /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param size The size of the layer/world. */ bear::action_layer::action_layer( const universe::size_box_type& size ) : layer(size), m_world(size) { } // action_layer::action_layer() /*----------------------------------------------------------------------------*/ /** * \brief Call the "start" method of all items. */ void bear::action_layer::start() { m_world.start(); } // action_layer::start() /*----------------------------------------------------------------------------*/ /** * \brief Progress all items in the active area. * \param active_area The area containing active items. * \param elapsed_time Elapsed time since the last call. */ void bear::action_layer::progress ( const region_type& active_area, universe::time_type elapsed_time ) { m_world.progress_entities( active_area, elapsed_time ); } // action_layer::progress() /*----------------------------------------------------------------------------*/ /** * \brief Get the sprites of the items in the visible area. * \param visuals (out) The sprites in the visible area, and their positions. * \param visible_area The visible part of the layer. */ void bear::action_layer::do_get_visual ( std::list& visuals, const universe::rectangle_type& visible_area ) const { m_world.get_visual( visuals, visible_area ); } // action_layer::do_get_visual() /*----------------------------------------------------------------------------*/ /** * \brief Add an item in the layer. * \param that The item to add. */ void bear::action_layer::do_add_item( engine::base_item& that ) { if ( that.is_fixed() ) static_item( that ); else mobile_item( that ); } // action_layer::do_add_item() /*----------------------------------------------------------------------------*/ /** * \brief Remove an item from the layer. * \param that The item to remove. */ void bear::action_layer::do_remove_item( engine::base_item& that ) { m_world.release_item( &that ); } // action_layer::do_remove_item() /*----------------------------------------------------------------------------*/ /** * \brief Remove an item from the layer without deleting it. * \param that The item to remove. */ void bear::action_layer::do_drop_item( engine::base_item& that ) { m_world.drop_item( &that ); } // action_layer::do_drop_item() /*----------------------------------------------------------------------------*/ /** * \brief Add a static item in the layer. * \param that The item to add. */ void bear::action_layer::static_item( engine::base_item& that ) { CLAW_PRECOND( that.is_valid() ); CLAW_PRECOND( that.get_mass() == std::numeric_limits::infinity() ); m_world.add_static( &that ); } // action_layer::static_item() /*----------------------------------------------------------------------------*/ /** * \brief Add an entity in the layer. * \param that The entity to add. */ void bear::action_layer::mobile_item( engine::base_item& that ) { CLAW_PRECOND( that.is_valid() ); m_world.register_item( &that ); } // action_layer::mobile_item() /*----------------------------------------------------------------------------*/ /** * \brief Get the world. */ bear::engine::world* bear::action_layer::do_get_world() { return &m_world; } // action_layer::do_get_world() /*----------------------------------------------------------------------------*/ /** * \brief Get the world. */ const bear::engine::world* bear::action_layer::do_get_world() const { return &m_world; } // action_layer::do_get_world() plee-the-bear-20251226/bear-engine/lib/src/generic_items/layer/code/decoration_layer.cpp000066400000000000000000000115661512343254000310040ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::decoration_layer class. * \author Julien Jorge */ #include "generic_items/layer/decoration_layer.hpp" #include "engine/layer/export.hpp" #include #include LAYER_EXPORT( decoration_layer, bear ) /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param world_size The real size of the world. */ bear::decoration_layer::decoration_layer ( const universe::size_box_type& size ) : layer( size ), m_items( (unsigned int)m_size.x + 1, (unsigned int)m_size.y + 1, 256 ) { } // decoration_layer::decoration_layer() /*----------------------------------------------------------------------------*/ /** * \brief Destructor. */ bear::decoration_layer::~decoration_layer() { item_map::item_list items; item_map::item_list::const_iterator it; m_items.get_all_unique(items); for (it=items.begin(); it!=items.end(); ++it) delete *it; item_map::item_list::const_iterator it_g; for(it_g=m_global_items.begin(); it_g!=m_global_items.end(); ++it_g) delete *it_g; } // decoration_layer::~decoration_layer() /*----------------------------------------------------------------------------*/ /** * \brief Start the items in the layer. */ void bear::decoration_layer::start() { log_statistics(); } // decoration_layer::start() /*----------------------------------------------------------------------------*/ /** * \brief Progress the items in the active area. * \param active_area The area containing active items. * \param elapsed_time Elapsed time since the last call. */ void bear::decoration_layer::progress ( const region_type& active_area, universe::time_type elapsed_time ) { item_map::item_list items; m_items.get_areas_unique( active_area.begin(), active_area.end(), items ); item_map::item_list::const_iterator it; for (it=items.begin(); it!=items.end(); ++it) (*it)->progress( elapsed_time ); for(it=m_global_items.begin(); it!=m_global_items.end(); ++it) (*it)->progress(elapsed_time); } // decoration_layer::progress() /*----------------------------------------------------------------------------*/ /** * \brief Log layer's inside maps load. */ void bear::decoration_layer::log_statistics() const { unsigned int empty_cells, min, max; double avg; empty_cells = m_items.empty_cells(); m_items.cells_load(min, max, avg); claw::logger << claw::log_verbose << "layer[" << m_size.x << ":" << m_size.y << "]:items:empty=" << empty_cells << " min=" << min << " max=" << max << " avg=" << avg << std::endl; } // decoration_layer::log_statistics() /*----------------------------------------------------------------------------*/ /** * \brief Get the visible sprites of this layer. * \param visuals (out) The sprites in the visible area, and their positions. * \param visible_area The visible part of the layer. */ void bear::decoration_layer::do_get_visual ( std::list& visuals, const universe::rectangle_type& visible_area ) const { item_map::item_list items; m_items.get_area_unique( visible_area, items ); item_map::item_list::const_iterator it; for (it=items.begin(); it!=items.end(); ++it) visuals.push_back( (*it)->get_visual() ); for(it=m_global_items.begin(); it!=m_global_items.end(); ++it) if ( visible_area.intersects( (*it)->get_bounding_box() ) ) { const universe::rectangle_type r ( visible_area.intersection( (*it)->get_bounding_box() ) ); if( (r.width() > 0) && (r.height() > 0) ) visuals.push_back( (*it)->get_visual() ); } } // decoration_layer::do_get_visual() /*----------------------------------------------------------------------------*/ /** * \brief Add an item in the layer. * \param item The item to add. It will be deleted with the layer. */ void bear::decoration_layer::do_add_item( engine::base_item& item ) { if ( item.is_global() ) m_global_items.push_back(&item); else m_items.insert( &item ); } // decoration_layer::do_add_item() /*----------------------------------------------------------------------------*/ /** * \brief Remove an item from the layer. * \param that The item to remove. * * This method should never be called. */ void bear::decoration_layer::do_remove_item( engine::base_item& that ) { CLAW_PRECOND( false ); } // decoration_layer::do_remove_item() /*----------------------------------------------------------------------------*/ /** * \brief Remove an item from the layer without deleting it. * \param that The item to remove. */ void bear::decoration_layer::do_drop_item( engine::base_item& that ) { CLAW_PRECOND( false ); } // decoration_layer::do_drop_item() plee-the-bear-20251226/bear-engine/lib/src/generic_items/layer/code/item_information_layer.cpp000066400000000000000000000354561512343254000322240ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::item_information_layer class. * \author Julien Jorge */ #include "generic_items/layer/item_information_layer.hpp" #include "engine/level.hpp" #include "engine/level_globals.hpp" #include "engine/world.hpp" #include /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param item The item from which we want informations. * \param font The font used to display the text. */ bear::item_information_layer::info_box::info_box ( bear::universe::physical_item& item, const bear::visual::font& font ) : m_item(&item), m_delta( 0, 0 ), m_text( font ) { m_text.set_auto_size(true); m_text.set_background_color( bear::gui::color_type( "#000000" ) ); get_informations(); } // item_information_layer::info_box::info_box() /*----------------------------------------------------------------------------*/ /** * \brief Destructor. */ bear::item_information_layer::info_box::~info_box() { // nothing to do } // item_information_layer::info_box::~info_box() /*----------------------------------------------------------------------------*/ /** * \brief Tells if the box includes a given point. * \param pos The point to check. */ bool bear::item_information_layer::info_box::includes ( const claw::math::coordinate_2d& pos ) const { claw::math::rectangle box ( m_text.get_position().x, m_text.get_position().y, m_text.width(), m_text.height() ); return box.includes(pos); } // item_information_layer::info_box::includes() /*----------------------------------------------------------------------------*/ /** * \brief Tell if this info_box links to a given item. * \param item The item to check */ bool bear::item_information_layer::info_box::has_item ( const bear::universe::physical_item* item ) const { return m_item == item; } // item_information_layer::info_box::has_item() /*----------------------------------------------------------------------------*/ /** * \brief Move the informations. * \param delta Vector to add to the current position. */ void bear::item_information_layer::info_box::add_delta ( const claw::math::coordinate_2d& delta ) { m_delta += delta; } // item_information_layer::info_box::add_delta() /*----------------------------------------------------------------------------*/ /** * \brief Update the content of the box. * \param camera_box The box of the camera in the level. * \param layer_size The size of the layer. */ void bear::item_information_layer::info_box::update ( const bear::universe::rectangle_type& camera_box, const claw::math::coordinate_2d& layer_size) { claw::math::coordinate_2d ratio ( camera_box.size().x / layer_size.x, camera_box.size().y / layer_size.y ); if ( m_item != NULL ) { bear::universe::position_type pos; pos.x = (m_item->get_right() - camera_box.left())/ratio.x + m_delta.x; pos.y = (m_item->get_top() - camera_box.bottom())/ratio.y + m_delta.y; m_text.set_position( pos ); } else m_text.set_text("Invalid handle."); } // item_information_layer::info_box::update() /*----------------------------------------------------------------------------*/ /** * \brief Render the text box. * \param e (out) The scene elements. */ void bear::item_information_layer::info_box::render ( scene_element_list& e ) const { m_text.render( e ); } // item_information_layer::info_box::render() /*----------------------------------------------------------------------------*/ /** * \brief Get the informations of the item. */ void bear::item_information_layer::info_box::get_informations() { if ( m_item != NULL ) { std::ostringstream oss; oss << *m_item << std::endl; m_text.set_text( oss.str() ); } } // item_information_layer::info_box::get_informations() /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param item The item from which we want informations. * \param font The font used to display the text. */ bear::item_information_layer::linked_info_box::linked_info_box ( bear::universe::physical_item& item, const bear::visual::font& font ) : info_box(item, font) { } // item_information_layer::linked_info_box::linked_info_box() /*----------------------------------------------------------------------------*/ /** * \brief Update the content of the box. * \param layer_size The size of the layer. * \param camera_box The box of the camera in the level. */ void bear::item_information_layer::linked_info_box::update ( const bear::universe::rectangle_type& camera_box, const claw::math::coordinate_2d& layer_size ) { get_informations(); info_box::update(camera_box, layer_size); } // item_information_layer::linked_info_box::update() /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ bear::item_information_layer::item_information_layer() : m_dragged_item(NULL) { } // item_information_layer::item_information_layer() /*----------------------------------------------------------------------------*/ /** * \brief Destructor. */ bear::item_information_layer::~item_information_layer() { clear(); } // item_information_layer::~item_information_layer() /*----------------------------------------------------------------------------*/ /** * \brief Clear the layer. */ void bear::item_information_layer::clear() { info_box_list::iterator it; for (it=m_info_box.begin(); it!=m_info_box.end(); ++it) delete *it; m_info_box.clear(); } // item_information_layer::clear() /*----------------------------------------------------------------------------*/ /** * \brief Do one step in the progression of the layer. * \param elapsed_time Elapsed time since the last call. */ void bear::item_information_layer::progress( bear::universe::time_type elapsed_time ) { info_box_list::iterator it; for (it=m_info_box.begin(); it!=m_info_box.end(); ++it) (*it)->update( get_level().get_camera_focus(), get_size() ); } // item_information_layer::progress() /*----------------------------------------------------------------------------*/ /** * \brief Render the layer on a screen. * \param e (out) The scene elements. */ void bear::item_information_layer::render( scene_element_list& e ) const { info_box_list::const_iterator it; for (it=m_info_box.begin(); it!=m_info_box.end(); ++it) (*it)->render(e); } // item_information_layer::render() /*----------------------------------------------------------------------------*/ /** * \brief Inform the layer that a mouse button has been pressed. * \param key The value of the maintained button. * \param pos The current position of the cursor. */ bool bear::item_information_layer::mouse_pressed ( bear::input::mouse::mouse_code key, const claw::math::coordinate_2d& pos ) { bool result = false; switch(key) { case bear::input::mouse::mc_left_button: result = grab_info_box(pos); break; case bear::input::mouse::mc_right_button: result = put_in_background(pos); break; case bear::input::mouse::mc_middle_button: result = close_info_box(pos); break; } if (!result) switch(key) { case bear::input::mouse::mc_left_button: result = show_item( pos, get_level().get_camera_focus() ); break; case bear::input::mouse::mc_right_button: result = follow_item( pos, get_level().get_camera_focus() ); break; case bear::input::mouse::mc_middle_button: if ( !m_info_box.empty() ) { result = true; clear(); } break; } return result; } // item_information_layer::mouse_pressed() /*----------------------------------------------------------------------------*/ /** * \brief Inform the layer that a mouse button has been released. * \param key The value of the released button. * \param pos The current position of the cursor. */ bool bear::item_information_layer::mouse_released ( bear::input::mouse::mouse_code key, const claw::math::coordinate_2d& pos ) { bool result = false; if (key == bear::input::mouse::mc_left_button) if (m_dragged_item != NULL) { m_dragged_item->add_delta( pos - m_drag_reference ); m_dragged_item = NULL; result = true; } return result; } // item_information_layer::mouse_released() /*----------------------------------------------------------------------------*/ /** * \brief Inform the layer that a mouse button is maintained. * \param key The value of the pressed button. * \param pos The current position of the cursor. */ bool bear::item_information_layer::mouse_maintained ( bear::input::mouse::mouse_code key, const claw::math::coordinate_2d& pos ) { bool result = false; if (key == bear::input::mouse::mc_left_button) if (m_dragged_item != NULL) { m_dragged_item->add_delta( pos - m_drag_reference ); m_drag_reference = pos; result = true; } return result; } // item_information_layer::mouse_maintained() /*----------------------------------------------------------------------------*/ /** * \brief Show the informations of an item, given a position. * \param pos The position where the item is searched. * \param camera_box The box of the camera in the level. */ bool bear::item_information_layer::show_item ( const bear::universe::position_type& pos, const bear::universe::rectangle_type& camera_box ) { claw::math::coordinate_2d ratio ( camera_box.size().x / get_size().x, camera_box.size().y / get_size().y ); bear::universe::position_type r_pos; r_pos.x = pos.x*ratio.x + camera_box.left(); r_pos.y = pos.y*ratio.y + camera_box.bottom(); bear::universe::physical_item* item = find_item(r_pos); if (item != NULL) { m_info_box.push_front ( new info_box (*item, get_level_globals().get_font("font/fixed_white-7x12.fnt",12)) ); } return item != NULL; } // item_information_layer::show_item() /*----------------------------------------------------------------------------*/ /** * \brief Follow an item and show its informations, given a position. * \param pos The position where the item is searched. * \param camera_box The box of the camera in the level. */ bool bear::item_information_layer::follow_item ( const bear::universe::position_type& pos, const bear::universe::rectangle_type& camera_box ) { claw::math::coordinate_2d ratio ( camera_box.size().x / get_size().x, camera_box.size().y / get_size().y ); bear::universe::position_type r_pos; r_pos.x = pos.x*ratio.x + camera_box.left(); r_pos.y = pos.y*ratio.y + camera_box.bottom(); bear::universe::physical_item* item = find_item(r_pos); if (item != NULL) { m_info_box.push_front ( new linked_info_box ( *item, get_level_globals().get_font ("font/fixed_white-7x12.fnt",12) ) ); } return item != NULL; } // item_information_layer::follow_item() /*----------------------------------------------------------------------------*/ /** * \brief Close an information box, given a position. * \param pos The position where the box is searched. */ bool bear::item_information_layer::close_info_box ( const claw::math::coordinate_2d& pos ) { info_box_list::iterator it = find_info_box(pos); if (it!=m_info_box.end()) { delete *it; m_info_box.erase(it); return true; } else return false; } // item_information_layer::close_info_box() /*----------------------------------------------------------------------------*/ /** * \brief Grab an information box, given a position. * \param pos The position where the box is searched. */ bool bear::item_information_layer::grab_info_box ( const claw::math::coordinate_2d& pos ) { info_box_list::iterator it = find_info_box(pos); if ( it!=m_info_box.end() ) { m_dragged_item = *it; m_drag_reference = pos; return true; } else return false; } // item_information_layer:grab_info_box() /*----------------------------------------------------------------------------*/ /** * \brief Put an information box in the background, given a position. * \param pos The position where the box is searched. */ bool bear::item_information_layer::put_in_background ( const claw::math::coordinate_2d& pos ) { info_box_list::iterator it = find_info_box(pos); if ( it!=m_info_box.end() ) { info_box* item = *it; m_info_box.erase(it); m_info_box.push_front(item); return true; } else return false; } // item_information_layer:put_in_background() /*----------------------------------------------------------------------------*/ /** * \brief Find an information box, given a position. * \param pos The position where the box is searched. */ bear::item_information_layer::info_box_list::iterator bear::item_information_layer::find_info_box ( const claw::math::coordinate_2d& pos ) { bool found = false; info_box_list::iterator it = m_info_box.end(); while ( !found && (it!=m_info_box.begin()) ) { --it; if ( (*it)->includes(pos) ) found = true; } if (found) return it; else return m_info_box.end(); } // item_information_layer::find_info_box() /*----------------------------------------------------------------------------*/ /** * \brief Find an item, given a position. * \param pos The position where the item is searched. */ bear::universe::physical_item* bear::item_information_layer::find_item ( const bear::universe::position_type& pos ) const { universe::physical_item* result = NULL; for ( engine::level::const_layer_iterator it=get_level().layer_begin(); (result == NULL) && (it!=get_level().layer_end()); ++it ) if ( it->has_world() ) { universe::world::item_list items; it->get_world().pick_items_by_position( items, pos ); universe::world::item_list::const_iterator it; for ( it=items.begin(); (it!=items.end()) && (result==NULL); ++it ) if ( !is_handled(*it) ) result = *it; } return result; } // item_information_layer::find_item() /*----------------------------------------------------------------------------*/ /** * \brief Tell if we have an info_box on a given item. * \param item The item to search. */ bool bear::item_information_layer::is_handled ( const bear::universe::physical_item* item ) const { bool result = false; info_box_list::const_iterator it; for (it=m_info_box.begin(); !result && (it!=m_info_box.end()); ++it ) result = (*it)->has_item(item); return result; } // item_information_layer::is_handled() plee-the-bear-20251226/bear-engine/lib/src/generic_items/layer/code/link_layer.cpp000066400000000000000000000050661512343254000276100ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::link_layer class. * \author Julien Jorge */ #include "generic_items/layer/link_layer.hpp" #include "engine/level.hpp" #include "universe/link/base_link.hpp" #include "visual/scene_line.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ bear::link_layer::link_layer() : base_debugging_layer(bear::input::keyboard::kc_F4) { } // link_layer::link_layer() /*----------------------------------------------------------------------------*/ /** * \brief Render the links between the items. * \param e (out) The scene elements. * \param delta The delta to apply to the position of the items. */ void bear::link_layer::render ( scene_element_list& e, const bear::visual::position_type& delta ) const { bear::universe::size_box_type camera_size(get_level().get_camera_size()); claw::math::coordinate_2d ratio ( get_size().x / camera_size.x, get_size().y / camera_size.y); std::list::const_iterator it; for (it=m_links.begin(); it!=m_links.end(); ++it) { link_type p = *it; p[0].x = (p[0].x - delta.x) * ratio.x; p[0].y = (p[0].y - delta.y) * ratio.y; p[1].x = (p[1].x - delta.x) * ratio.x; p[1].y = (p[1].y - delta.y) * ratio.y; e.push_back ( bear::visual::scene_line(0, 0, claw::graphic::red_pixel, p, 2) ); } } // link_layer::render() /*----------------------------------------------------------------------------*/ /** * \brief Do one step in the progression of the layer. * \param items The items to draw. * \param elapsed_time Elapsed time since the last call. */ void bear::link_layer::progress ( const item_list& items, bear::universe::time_type elapsed_time ) { m_links.clear(); item_list::const_iterator it; link_type points(2); bear::universe::physical_item::const_link_iterator it_link; for (it=items.begin(); it!=items.end(); ++it) for (it_link=(*it)->links_begin(); it_link!=(*it)->links_end(); ++it_link) { const bear::universe::physical_item& first = (*it_link)->get_first_item(); const bear::universe::physical_item& second = (*it_link)->get_second_item(); points[0] = first.get_center_of_mass(); points[1] = second.get_center_of_mass(); m_links.push_back(points); } } // link_layer::progress() plee-the-bear-20251226/bear-engine/lib/src/generic_items/layer/code/pattern_layer.cpp000066400000000000000000000114341512343254000303240ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::pattern_layer class. * \author Julien Jorge */ #include #include "generic_items/layer/pattern_layer.hpp" #include "engine/layer/export.hpp" #include LAYER_EXPORT( pattern_layer, bear ) /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param size The size of the layer. */ bear::pattern_layer::pattern_layer ( const universe::size_box_type& size ) : layer(size) { } // pattern_layer::pattern_layer() /*----------------------------------------------------------------------------*/ /** * \brief Progress all the items in the layer. * \param active_area (not used) The active part of the layer. * \param elapsed_time Elapsed time since the last call. */ void bear::pattern_layer::progress ( const region_type& active_area, universe::time_type elapsed_time ) { engine::population::const_iterator it; for ( it=m_items.begin(); it!=m_items.end(); ++it ) it->progress(elapsed_time); } // pattern_layer::progress() /*----------------------------------------------------------------------------*/ /** * \brief Get the visible sprites of this layer. * \param visuals (out) The sprites in the visible area, and their positions. * \param visible_area The visible part of the layer. */ void bear::pattern_layer::do_get_visual ( std::list& visuals, const universe::rectangle_type& visible_area ) const { engine::population::const_iterator it; for ( it=m_items.begin(); it!=m_items.end(); ++it ) { std::list local_visuals; it->get_visual( local_visuals ); repeat_visual( visuals, local_visuals, visible_area ); } } // pattern_layer::do_get_visual() /*----------------------------------------------------------------------------*/ /** * \brief Add an item in the layer. * \param taht The item to add. */ void bear::pattern_layer::do_add_item( engine::base_item& that ) { m_items.insert(&that); } // pattern_layer::do_add_item() /*----------------------------------------------------------------------------*/ /** * \brief Remove an item from the layer. * \param that The item to remove. */ void bear::pattern_layer::do_remove_item( engine::base_item& that ) { m_items.kill(&that); } // pattern_layer::do_remove_item() /*----------------------------------------------------------------------------*/ /** * \brief Remove an item from the layer without deleting it. * \param that The item to remove. */ void bear::pattern_layer::do_drop_item( engine::base_item& that ) { m_items.drop(&that); } // pattern_layer::do_drop_item() /*----------------------------------------------------------------------------*/ /** * \brief Repeat the sprites from a list of visuals. * \param visuals (out) The sprites in the visible area, and their positions. * \param local_visuals The sprite took from the items in the layer. * \param visible_area The visible part of the layer. */ void bear::pattern_layer::repeat_visual ( std::list& visuals, const std::list& local_visuals, const universe::rectangle_type& visible_area ) const { std::list::const_iterator it; for ( it=local_visuals.begin(); it!=local_visuals.end(); ++it ) repeat_sprite( visuals, *it, visible_area ); } // pattern_layer::repeat_visual() /*----------------------------------------------------------------------------*/ /** * \brief Repeat the sprite of a visual on the screen. * \param visuals (out) The sprites in the visible area, and their positions. * \param v The visual to repeat. * \param visible_area The visible part of the layer. */ void bear::pattern_layer::repeat_sprite ( std::list& visuals, const engine::scene_visual& v, const universe::rectangle_type& visible_area ) const { claw::math::coordinate_2d v_pos; const claw::math::coordinate_2d v_size = v.scene_element.get_bounding_box().size(); const unsigned int x_count = visible_area.width() / v_size.x + 2; const unsigned int y_count = visible_area.height() / v_size.y + 2; v_pos.x = visible_area.left() - (int)visible_area.left() % v_size.x; for (unsigned int x=0; x!=x_count; ++x) { v_pos.y = visible_area.bottom() - (int)visible_area.bottom() % v_size.y; for (unsigned int y=0; y!=y_count; ++y) { engine::scene_visual new_v(v); new_v.scene_element.set_position(v_pos); visuals.push_front(new_v); v_pos.y += v_size.y; } v_pos.x += v_size.x; } } // pattern_layer::repeat_sprite() plee-the-bear-20251226/bear-engine/lib/src/generic_items/layer/code/physics_layer.cpp000066400000000000000000000106461512343254000303350ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::physics_layer class. * \author Julien Jorge */ #include "generic_items/layer/physics_layer.hpp" #include "engine/level.hpp" #include "visual/scene_rectangle.hpp" #include "generic_items/camera.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ bear::physics_layer::physics_layer() : base_debugging_layer(bear::input::keyboard::kc_F6) { } // physics_layer::physics_layer() /*----------------------------------------------------------------------------*/ /** * \brief Render the bounding box of the items. * \param e (out) The scene elements. * \param delta The delta to apply to the position of the items. */ void bear::physics_layer::render ( scene_element_list& e, const bear::visual::position_type& delta ) const { item_list::const_iterator it; for (it=m_items.begin(); it!=m_items.end(); ++it) draw_box(e, delta, **it); } // physics_layer::render() /*----------------------------------------------------------------------------*/ /** * \brief Do one step in the progression of the layer. * \param items The items to draw. * \param elapsed_time Elapsed time since the last call. */ void bear::physics_layer::progress ( const item_list& items, bear::universe::time_type elapsed_time ) { m_items = items; } // physics_layer::progress() /*----------------------------------------------------------------------------*/ /** * \brief Render the bounding box of an item. * \param e (out) The scene elements. * \param delta The delta to apply to the position of the item. * \param item The item to render. */ void bear::physics_layer::draw_box ( scene_element_list& e, const bear::visual::position_type& delta, const bear::universe::physical_item& item ) const { if ( dynamic_cast(&item) != NULL ) return; bear::visual::color_type border_color = claw::graphic::black_pixel; bear::visual::color_type fill_color(border_color); border_color.components.alpha = 196; fill_color.components.alpha = 196; if ( item.can_move_items() ) fill_color.components.red = 255; if ( item.is_phantom() ) fill_color.components.green = 255; if ( item.is_artificial() ) fill_color.components.blue = 255; if ( item.is_global() ) border_color.components.red = 255; if ( item.has_weak_collisions() ) border_color.components.green = 255; bear::universe::size_box_type camera_size(get_level().get_camera_size()); claw::math::coordinate_2d ratio ( get_size().x / camera_size.x, get_size().y / camera_size.y); const bear::visual::position_type pos( item.get_bottom_left() - delta ); bear::visual::rectangle_type r ( pos.x, pos.y, pos.x + item.get_width(), pos.y + item.get_height() ); if ( (r.width() > 5) && (r.height() > 5) ) r.set( r.left() + 5, r.bottom() + 5, r.right() - 5, r.top() - 5 ); r.set ( r.left() * ratio.x, r.bottom() * ratio.y, r.right() * ratio.x, r.top() * ratio.y ); e.push_back ( bear::visual::scene_rectangle( 0, 0, fill_color, r, true ) ); e.push_back ( bear::visual::scene_rectangle( 0, 0, border_color, r, false, 3 ) ); } // physics_layer::draw_box() /*----------------------------------------------------------------------------*/ /** * \brief Inform the subclasses that the layer is displayed. */ void bear::physics_layer::on_show() { std::cout << "with c=can_move_items, p=phantom, a=artificial.\n" << "fill color:\n" << "\tblack: not c and not p and not a.\n" << "\tgreen: not c and p and not a.\n" << "\tyellow: c and p and not a.\n" << "\tred: c and not p and not a.\n" << "\tblue: not c and not p and a.\n" << "\tcyan: not c and p and a.\n" << "\twhite: c and p and a.\n" << "\tmagenta: c and not p and a.\n" << '\n' << "with g=global, w=weak_collisions.\n" << "border color:\n" << "\tblack: not g and not w.\n" << "\tred: g and not w.\n" << "\tgreen: not g and w.\n" << "\tyellow: g and w.\n" << std::endl; } // physics_layer::on_show() plee-the-bear-20251226/bear-engine/lib/src/generic_items/layer/code/recent_path_layer.cpp000066400000000000000000000121251512343254000311410ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::recent_path_layer class. * \author Julien Jorge */ #include #include "generic_items/layer/recent_path_layer.hpp" #include "input/keyboard.hpp" #include "visual/scene_line.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ bear::recent_path_layer::item_positions::item_positions ( const bear::universe::physical_item* item ) : super(9) { this->operator[](0) = item->get_top_left(); this->operator[](1) = item->get_top_middle(); this->operator[](2) = item->get_top_right(); this->operator[](3) = item->get_left_middle(); this->operator[](4) = item->get_center_of_mass(); this->operator[](5) = item->get_right_middle(); this->operator[](6) = item->get_bottom_left(); this->operator[](7) = item->get_bottom_middle(); this->operator[](8) = item->get_bottom_right(); } // recent_path_layer::item_positions::item_positions() /*----------------------------------------------------------------------------*/ /** * \brief Tell if the position of an item has changed. * \param item The item from which we tak the position. */ bool bear::recent_path_layer::item_positions::has_moved ( const bear::universe::physical_item* item ) const { return this->operator[](0) != item->get_top_left(); } // recent_path_layer::item_positions::has_moved() /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ bear::recent_path_layer::recent_path_layer() : base_debugging_layer(bear::input::keyboard::kc_F7) { } // recent_path_layer::recent_path_layer() /*----------------------------------------------------------------------------*/ /** * \brief Render the lines of the items. * \param e (out) The scene elements. * \param delta The delta to apply to the position of the items. */ void bear::recent_path_layer::render ( scene_element_list& e, const bear::visual::position_type& delta ) const { item_map::const_iterator itm; // one color for each line. bear::visual::color_type colors[9] = { claw::graphic::white_pixel, claw::graphic::red_pixel, claw::graphic::green_pixel, claw::graphic::blue_pixel, claw::graphic::yellow_pixel, claw::graphic::magenta_pixel, claw::graphic::cyan_pixel, bear::visual::color_type( 190, 190, 190, 255 ), bear::visual::color_type( 190, 190, 0, 255 ) }; std::vector cross_v(2); std::vector cross_h(2); cross_v[0] = bear::visual::position_type(0, -2); cross_v[1] = bear::visual::position_type(0, 2); cross_h[0] = bear::visual::position_type(-2, 0); cross_h[1] = bear::visual::position_type(2, 0); // Draw the lines. for (itm=m_items.begin(); itm!=m_items.end(); ++itm) for (unsigned int i=0; i!=9; ++i) { std::vector points; std::list::const_iterator itl; points.reserve( itm->second.size() ); for ( itl=itm->second.begin(); itl!=itm->second.end(); ++itl ) { const bear::universe::position_type pos ((*itl)[i].x - delta.x, (*itl)[i].y - delta.y); points.push_back(pos); std::vector cross(2); cross[0] = pos + cross_v[0]; cross[1] = pos + cross_v[1]; e.push_back ( bear::visual::scene_line(0, 0, colors[i], cross, 1) ); cross[0] = pos + cross_h[0]; cross[1] = pos + cross_h[1]; e.push_back ( bear::visual::scene_line(0, 0, colors[i], cross, 1) ); } e.push_back( bear::visual::scene_line(0, 0, colors[i], points, 1) ); } } // recent_path_layer::render() /*----------------------------------------------------------------------------*/ /** * \brief Do one step in the progression of the layer. * \param items The items to draw. * \param elapsed_time Elapsed time since the last call. */ void bear::recent_path_layer::progress ( const item_list& items, bear::universe::time_type elapsed_time ) { item_map::iterator itm; // remove lost items. for ( itm=m_items.begin(); itm!=m_items.end(); ) if ( std::find(items.begin(), items.end(), itm->first) == items.end() ) { item_map::iterator tmp(itm); ++itm; m_items.erase(tmp); } else ++itm; // add new items and update the positions of the known items. item_list::const_iterator it; for (it=items.begin(); it!=items.end(); ++it) { itm = m_items.find(*it); if ( itm == m_items.end() ) m_items[*it].push_front( item_positions(*it) ); else if ( itm->second.back().has_moved(*it) ) { if ( itm->second.size() == 10 ) itm->second.pop_front(); itm->second.push_back( item_positions(*it) ); } } } // recent_path_layer::progress() plee-the-bear-20251226/bear-engine/lib/src/generic_items/layer/code/runtime_settings_layer.cpp000066400000000000000000000150751512343254000322570ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::runtime_settings_layer class. * \author Julien Jorge */ #include "generic_items/layer/runtime_settings_layer.hpp" #include "generic_items/debug/runtime_setting.hpp" #include "gui/callback_function.hpp" #include "gui/horizontal_flow.hpp" #include "gui/static_text.hpp" #include "gui/text_input.hpp" #include #include #include #include /*----------------------------------------------------------------------------*/ /** * \brief */ bear::runtime_settings_layer::setting_visitor::setting_visitor ( runtime_settings_layer& layer ) : m_layer(layer) { } // runtime_settings_layer::setting_visitor::setting_visitor() /*----------------------------------------------------------------------------*/ /** * \brief */ template void bear::runtime_settings_layer::setting_visitor::operator() ( std::string name, T var ) const { m_layer.process_setting( name, var ); } // runtime_settings_layer::setting_visitor::operator()() /*----------------------------------------------------------------------------*/ const bear::gui::size_type bear::runtime_settings_layer::s_margin(10); const bear::gui::color_type bear::runtime_settings_layer::s_cursor_color( claw::graphic::red_pixel ); /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param f The font to use in the labels. */ bear::runtime_settings_layer::runtime_settings_layer( visual::font f ) : m_toggle_key(input::keyboard::kc_F9), m_font(f), m_root_component(NULL), m_pattern(NULL), m_settings(NULL) { } // runtime_settings_layer::runtime_settings_layer() /*----------------------------------------------------------------------------*/ /** * \brief Destructor. */ bear::runtime_settings_layer::~runtime_settings_layer() { clear(); } // runtime_settings_layer::~runtime_settings_layer() /*----------------------------------------------------------------------------*/ /** * \brief */ void bear::runtime_settings_layer::render( scene_element_list& e ) const { if ( m_root_component != NULL ) m_root_component->render( e ); } // runtime_settings_layer::render() /*----------------------------------------------------------------------------*/ /** * \brief Inform the layer that a keyboard key has been pressed. * \param key The value of the pressed key. */ bool bear::runtime_settings_layer::key_pressed( const input::key_info& key ) { bool result = true; if ( key.get_code() == m_toggle_key ) { if ( m_root_component == NULL ) { build_components(); update(); } else clear(); } else result = false; return result; } // runtime_settings_layer::key_pressed() /*----------------------------------------------------------------------------*/ /** * \brief Creates the components that will display the settings, but does not * fill them. */ void bear::runtime_settings_layer::build_components() { m_root_component = new gui::visual_component(); m_root_component->set_size( get_size() ); gui::static_text* const pattern_text = new gui::static_text( m_font ); pattern_text->set_text( "Pattern:" ); pattern_text->set_auto_size(true); pattern_text->set_position( s_margin, s_margin ); m_root_component->insert( pattern_text ); m_pattern = new gui::text_input( m_font, s_cursor_color ); m_pattern->set_position( pattern_text->right() + s_margin, s_margin ); m_pattern->set_size ( get_size().x - 3 * s_margin - pattern_text->width(), pattern_text->height() ); m_pattern->set_text( "*" ); m_pattern->set_border_color( claw::graphic::black_pixel ); m_root_component->insert( m_pattern ); m_settings = new gui::horizontal_flow(); m_settings->set_position( s_margin, pattern_text->top() + s_margin ); m_settings->set_border_color( claw::graphic::white_pixel ); m_settings->set_size ( m_root_component->width() - 2 * s_margin, m_root_component->height() - pattern_text->top() - 2 * s_margin ); m_root_component->insert( m_settings ); set_root_component( m_root_component ); } // runtime_settings_layer::build_components() /*----------------------------------------------------------------------------*/ /** * \brief Destroys all the components created by build_components() */ void bear::runtime_settings_layer::clear() { set_root_component( NULL ); delete m_root_component; m_root_component = NULL; m_pattern = NULL; m_settings = NULL; } // runtime_settings_layer::clear() /*----------------------------------------------------------------------------*/ /** * \brief Updates the visible settings according to the current pattern. */ void bear::runtime_settings_layer::update() { const setting_visitor visitor( *this ); claw::multi_type_map_visitor process; process.run( g_global_settings, visitor ); } // runtime_settings_layer::update() /*----------------------------------------------------------------------------*/ /** * \brief */ template void bear::runtime_settings_layer::process_setting ( std::string name, T* var ) const { if ( !claw::text::glob_match( m_pattern->get_text(), name ) ) return; gui::visual_component* const component = new gui::visual_component(); component->set_size( get_size() ); gui::static_text* const label = new gui::static_text( m_font ); label->set_text( name ); label->set_auto_size( true ); component->insert( label ); gui::text_input* const value = new gui::text_input( m_font, s_cursor_color ); std::ostringstream oss; oss << *var; value->set_text( oss.str() ); value->set_size( label->get_size() ); value->set_position( label->right() + s_margin, label->bottom() ); value->set_border_color( claw::graphic::black_pixel ); value->add_enter_callback ( gui::callback_function< boost::function > ( boost::bind ( &runtime_settings_layer::on_enter, this, var, value ) ) ); component->insert( value ); component->fit(); m_settings->insert( component ); } // runtime_settings_layer::process_setting() /*----------------------------------------------------------------------------*/ /** * \brief */ template void bear::runtime_settings_layer::on_enter ( T* var, gui::text_input* value ) const { std::istringstream iss( value->get_text() ); iss >> *var; } // runtime_settings_layer::on_enter() plee-the-bear-20251226/bear-engine/lib/src/generic_items/layer/code/wireframe_layer.cpp000066400000000000000000000202661512343254000306330ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::wireframe_layer class. * \author Julien Jorge */ #include "generic_items/layer/wireframe_layer.hpp" #include "engine/level.hpp" #include "visual/scene_line.hpp" #include "generic_items/slope.hpp" #include "generic_items/descending_ceiling.hpp" #include /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ bear::wireframe_layer::wireframe_layer() : base_debugging_layer(input::keyboard::kc_F3) { } // wireframe_layer::wireframe_layer() /*----------------------------------------------------------------------------*/ /** * \brief Render the bounding box of the items. * \param e (out) The scene elements. * \param delta The delta to apply to the position of the items. */ void bear::wireframe_layer::render ( scene_element_list& e, const visual::position_type& delta ) const { item_list::const_iterator it; visual::color_type color; color.components.alpha = 255; for (it=m_items.begin(); it!=m_items.end(); ++it) { if ( *it != NULL ) { uintptr_t addr = reinterpret_cast(*it); color.components.red = (~addr & 0xFF); color.components.green = (~addr & 0xFF00) >> 8; color.components.blue = (~addr & 0xFF0000) >> 16; draw_box(e, delta, **it, color); draw_internal_forces( e, delta, **it, color ); draw_system(e, delta, **it, color); draw_slope(e, delta, **it, color); } } } // wireframe_layer::render() /*----------------------------------------------------------------------------*/ /** * \brief Do one step in the progression of the layer. * \param items The items to draw. * \param elapsed_time Elapsed time since the last call. */ void bear::wireframe_layer::progress ( const item_list& items, universe::time_type elapsed_time ) { m_items = items; } // wireframe_layer::progress() /*----------------------------------------------------------------------------*/ /** * \brief Render the bounding box of an item. * \param e (out) The scene elements. * \param delta The delta to apply to the position of the item. * \param item The item to render. * \param color The color of the box. */ void bear::wireframe_layer::draw_box ( scene_element_list& e, const visual::position_type& delta, const universe::physical_item& item, const visual::color_type& color ) const { universe::size_box_type camera_size(get_level().get_camera_size()); claw::math::coordinate_2d ratio ( get_size().x / camera_size.x, get_size().y / camera_size.y); std::vector points(5); const visual::position_type pos( item.get_bottom_left() - delta ); points[0] = pos; points[0].x = points[0].x * ratio.x; points[0].y = points[0].y * ratio.y; points[1] = points[0]; points[1].x += item.get_width() * ratio.x; points[2] = points[1]; points[2].y += item.get_height() * ratio.y; points[3] = points[0]; points[3].y += item.get_height() * ratio.y; points[4] = points[0]; e.push_back( visual::scene_line(0, 0, color, points, 1) ); } // wireframe_layer::draw_box() /*----------------------------------------------------------------------------*/ /** * \brief Render the internal forces of an item. * \param e (out) The scene elements. * \param delta The delta to apply to the position of the item. * \param item The item to render. * \param color The color of the system. */ void bear::wireframe_layer::draw_internal_forces ( scene_element_list& e, const visual::position_type& delta, const universe::physical_item& item, const visual::color_type& color ) const { universe::force_type scaled_force( item.get_internal_force() ); if ( scaled_force.x != 0 ) scaled_force.x = boost::math::sign( scaled_force.x ) * std::log( std::abs( scaled_force.x ) ); if ( scaled_force.y != 0 ) scaled_force.y = boost::math::sign( scaled_force.y ) * std::log( std::abs( scaled_force.y ) ); universe::size_box_type camera_size(get_level().get_camera_size()); claw::math::coordinate_2d ratio ( get_size().x / camera_size.x, get_size().y / camera_size.y); std::vector points(3); universe::vector_type x_axis(item.get_x_axis()); points[1].x = (item.get_center_of_mass().x - delta.x) * ratio.x; points[1].y = (item.get_center_of_mass().y - delta.y) * ratio.y; points[0] = points[1] + scaled_force.x * x_axis; points[2] = points[1] + scaled_force.y * x_axis.get_orthonormal_anticlockwise(); e.push_back( visual::scene_line(0, 0, color, points, 3) ); } // wireframe_layer::draw_internal_forces() /*----------------------------------------------------------------------------*/ /** * \brief Render the local system of an item. * \param e (out) The scene elements. * \param delta The delta to apply to the position of the item. * \param item The item to render. * \param color The color of the system. */ void bear::wireframe_layer::draw_system ( scene_element_list& e, const visual::position_type& delta, const universe::physical_item& item, const visual::color_type& color ) const { universe::size_box_type camera_size(get_level().get_camera_size()); claw::math::coordinate_2d ratio ( get_size().x / camera_size.x, get_size().y / camera_size.y); std::vector points(3); universe::vector_type x_axis(item.get_x_axis()); points[1].x = (item.get_center_of_mass().x - delta.x) * ratio.x; points[1].y = (item.get_center_of_mass().y - delta.y) * ratio.y; points[0] = points[1] + 20 * x_axis; points[2] = points[1] + 20 * x_axis.get_orthonormal_anticlockwise(); e.push_back( visual::scene_line(0, 0, color, points, 1) ); } // wireframe_layer::draw_system() /*----------------------------------------------------------------------------*/ /** * \brief Render the lines of the slopes. * \param e (out) The scene elements. * \param delta The delta to apply to the position of the item. * \param item The item to render. * \param color The color of the system. */ void bear::wireframe_layer::draw_slope ( scene_element_list& e, const visual::position_type& delta, const universe::physical_item& item, const visual::color_type& color ) const { universe::size_box_type camera_size(get_level().get_camera_size()); claw::math::coordinate_2d ratio ( get_size().x / camera_size.x, get_size().y / camera_size.y); const slope* p = dynamic_cast(&item); if ( p != NULL ) { std::vector pts; const slope::curve_type c( p->get_curve() ); for ( double t=0; t<=1; t+=0.1 ) { pts.push_back ( p->get_bottom_left() + c.get_section(c.begin()).get_point_at(t) ); const visual::coordinate_type x = c.get_section(c.begin()).get_point_at(t).x; if ( c.get_section(c.begin()).get_point_at_x( x ).size() > 0 ) pts.back().y = ( p->get_bottom() + c.get_section (c.begin()).get_point_at_x( x )[0].get_position().y); pts.back().x -= delta.x; pts.back().y -= delta.y; pts.back().x *= ratio.x; pts.back().y *= ratio.y; } e.push_back( visual::scene_line(0, 0, color, pts, 1) ); } const descending_ceiling* d = dynamic_cast(&item); if ( d != NULL ) { std::vector pts(2); pts[0].x = (item.get_left() - delta.x) * ratio.x; pts[0].y = (item.get_bottom() - delta.y) * ratio.y; if ( d->get_steepness() < 0 ) pts[0].y = (item.get_bottom() - d->get_steepness() - delta.y) * ratio.y; else pts[0].y = (item.get_bottom() - delta.y) * ratio.y; pts[1].x = (item.get_right() - delta.x) * ratio.x; pts[1].y = pts[0].y + d->get_steepness() * ratio.y; e.push_back( visual::scene_line(0, 0, color, pts, 1) ); } } // wireframe_layer::draw_slope() plee-the-bear-20251226/bear-engine/lib/src/generic_items/layer/decoration_layer.hpp000066400000000000000000000033601512343254000300700ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A decoration layer contains animation and sprites positioned in the * world. * \author Julien Jorge */ #ifndef __BEAR_DECORATION_LAYER_HPP__ #define __BEAR_DECORATION_LAYER_HPP__ #include "visual/screen.hpp" #include "universe/static_map.hpp" #include "engine/layer/layer.hpp" #include "engine/base_item.hpp" #include #include "generic_items/class_export.hpp" namespace bear { /** * \brief A decoration layer contains animation and sprites positioned in * the world. */ class GENERIC_ITEMS_EXPORT decoration_layer: public engine::layer { private: /** \brief The type of the structure containing the items. */ typedef universe::static_map item_map; public: decoration_layer( const universe::size_box_type& size ); virtual ~decoration_layer(); void start(); void progress ( const region_type& active_area, universe::time_type elapsed_time ); void log_statistics() const; private: void do_get_visual( std::list& visuals, const universe::rectangle_type& visible_area ) const; void do_add_item( engine::base_item& item ); void do_remove_item( engine::base_item& item ); void do_drop_item( engine::base_item& item ); private: /** \brief All the decorations. */ item_map m_items; /** \brief All global items. */ std::vector m_global_items; }; // class decoration_layer } // namespace bear #endif // __BEAR_DECORATION_LAYER_HPP__ plee-the-bear-20251226/bear-engine/lib/src/generic_items/layer/item_information_layer.hpp000066400000000000000000000114671512343254000313130ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief This layer displays informations on items when clicking on them. * \author Julien Jorge */ #ifndef __BEAR_ITEM_INFORMATION_LAYER_HPP__ #define __BEAR_ITEM_INFORMATION_LAYER_HPP__ #include "engine/layer/gui_layer.hpp" #include "gui/static_text.hpp" #include "universe/item_handle.hpp" #include "universe/physical_item.hpp" #include "generic_items/class_export.hpp" #include namespace bear { /** * \brief This layer displays informations on items when clicking on them. * * When an item is left-clicked, a small window with instant informations * about the item appears. When right-clicked, the window is updated each time * that the scene is rendered. * * The windows can be dragged with the left button of the mouse. A right click * on a window put it in the background. Middle clicking on a window closes * it. * * A middle click in an empty part closes all windows. * * \author Julien Jorge */ class GENERIC_ITEMS_EXPORT item_information_layer: public bear::engine::gui_layer { public: /** \brief The type of a list of scene elements retrieved from the layer. */ typedef bear::engine::gui_layer::scene_element_list scene_element_list; private: /** * \brief A box with the string representation of an item, for instant * informations. */ class info_box { public: info_box ( bear::universe::physical_item& item, const bear::visual::font& font ); virtual ~info_box(); bool includes( const claw::math::coordinate_2d& pos ) const; bool has_item( const bear::universe::physical_item* item ) const; void add_delta( const claw::math::coordinate_2d& delta ); virtual void update ( const bear::universe::rectangle_type& camera_box, const claw::math::coordinate_2d& layer_size); void render( scene_element_list& e ) const; protected: void get_informations(); private: /** \brief The item to display. */ bear::universe::item_handle m_item; /** \brief The distance between the m_position and the informations. */ bear::universe::position_type m_delta; /** \brief Component containing the informations on the item. */ bear::gui::static_text m_text; }; // class info_box /** * \brief A box with the string representation of an item, for followed * informations. */ class linked_info_box: public info_box { public: linked_info_box ( bear::universe::physical_item& item, const bear::visual::font& font ); void update( const bear::universe::rectangle_type& camera_box, const claw::math::coordinate_2d& layer_size ); }; // class linked_info_box typedef std::list info_box_list; public: item_information_layer(); ~item_information_layer(); void clear(); void progress( bear::universe::time_type elapsed_time ); void render( scene_element_list& e ) const; bool mouse_pressed( bear::input::mouse::mouse_code key, const claw::math::coordinate_2d& pos ); bool mouse_released( bear::input::mouse::mouse_code button, const claw::math::coordinate_2d& pos ); bool mouse_maintained( bear::input::mouse::mouse_code button, const claw::math::coordinate_2d& pos ); private: bool show_item( const bear::universe::position_type& pos, const bear::universe::rectangle_type& camera_box ); bool follow_item( const bear::universe::position_type& pos, const bear::universe::rectangle_type& camera_box ); bool close_info_box( const claw::math::coordinate_2d& pos ); bool grab_info_box( const claw::math::coordinate_2d& pos ); bool put_in_background( const claw::math::coordinate_2d& pos ); info_box_list::iterator find_info_box( const claw::math::coordinate_2d& pos ); bear::universe::physical_item* find_item( const bear::universe::position_type& pos ) const; bool is_handled( const bear::universe::physical_item* item ) const; private: /** \brief The information boxes. */ info_box_list m_info_box; /** \brief An item box that is currently dragged. */ info_box* m_dragged_item; /** \brief The position where the last mouse button has been pressed. */ claw::math::coordinate_2d m_drag_reference; }; // class item_information_layer } // namespace bear #endif // __BEAR_ITEM_INFORMATION_LAYER_HPP__ plee-the-bear-20251226/bear-engine/lib/src/generic_items/layer/link_layer.hpp000066400000000000000000000022211512343254000266710ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief This layer displays the links between items. * \author Julien Jorge */ #ifndef __BEAR_LINK_LAYER_HPP__ #define __BEAR_LINK_LAYER_HPP__ #include "engine/layer/base_debugging_layer.hpp" #include "generic_items/class_export.hpp" namespace bear { /** * \brief This layer displays the links between items. * \author Julien Jorge */ class GENERIC_ITEMS_EXPORT link_layer: public engine::base_debugging_layer { private: /** \brief The points defining a link. */ typedef std::vector link_type; public: link_layer(); private: void render ( scene_element_list& e, const bear::visual::position_type& delta ) const; void progress ( const item_list& items, bear::universe::time_type elapsed_time ); private: /** \brief The links to render. */ std::list m_links; }; // class link_layer } // namespace bear #endif // __BEAR_LINK_LAYER_HPP__ plee-the-bear-20251226/bear-engine/lib/src/generic_items/layer/pattern_layer.hpp000066400000000000000000000033651512343254000274230ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A layer that fills the screen with an animation. * \author Julien Jorge */ #ifndef __BEAR_PATTERN_LAYER_HPP__ #define __BEAR_PATTERN_LAYER_HPP__ #include "engine/population.hpp" #include "engine/layer/layer.hpp" #include "generic_items/class_export.hpp" namespace bear { /** * \brief A layer that fills the screen with an animation. * \author Julien Jorge */ class GENERIC_ITEMS_EXPORT pattern_layer: public engine::layer { public: pattern_layer( const universe::size_box_type& size ); void progress ( const region_type& active_area, universe::time_type elapsed_time ); private: void do_get_visual( std::list& visuals, const universe::rectangle_type& visible_area ) const; void do_add_item( engine::base_item& that ); void do_remove_item( engine::base_item& item ); void do_drop_item( engine::base_item& item ); void repeat_visual ( std::list& visuals, const std::list& local_visuals, const universe::rectangle_type& visible_area ) const; void repeat_sprite ( std::list& visuals, const engine::scene_visual& v, const universe::rectangle_type& visible_area ) const; void add( engine::base_item* const& who ); void remove( engine::base_item* const& who ); private: /** \brief The items repeated in the screen. */ engine::population m_items; }; // class pattern_layer } // namespace bear #endif // __BEAR_PATTERN_LAYER_HPP__ plee-the-bear-20251226/bear-engine/lib/src/generic_items/layer/physics_layer.hpp000066400000000000000000000024771512343254000274330ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief This layer displays the a colored box representing the physical * attributes of the items. * \author Julien Jorge */ #ifndef __BEAR_PHYSICS_LAYER_HPP__ #define __BEAR_PHYSICS_LAYER_HPP__ #include "engine/layer/base_debugging_layer.hpp" #include "generic_items/class_export.hpp" namespace bear { /** * \brief This layer displays the a colored box representing the physical * attributes of the items. * \author Julien Jorge */ class GENERIC_ITEMS_EXPORT physics_layer: public engine::base_debugging_layer { public: physics_layer(); private: void render ( scene_element_list& e, const bear::visual::position_type& delta ) const; void progress ( const item_list& items, bear::universe::time_type elapsed_time ); private: void draw_box ( scene_element_list& e, const bear::visual::position_type& delta, const bear::universe::physical_item& item ) const; void on_show(); private: /** \brief The items to render. */ item_list m_items; }; // class physics_layer } // namespace bear #endif // __BEAR_PHYSICS_LAYER_HPP__ plee-the-bear-20251226/bear-engine/lib/src/generic_items/layer/recent_path_layer.hpp000066400000000000000000000031711512343254000302350ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief This layer displays some lines linking the last positions of the * items. * \author Julien Jorge */ #ifndef __BEAR_RECENT_PATH_LAYER_HPP__ #define __BEAR_RECENT_PATH_LAYER_HPP__ #include "engine/layer/base_debugging_layer.hpp" #include #include "generic_items/class_export.hpp" namespace bear { /** * \brief This layer displays some lines linking the last positions of the * items. * \author Julien Jorge */ class GENERIC_ITEMS_EXPORT recent_path_layer: public engine::base_debugging_layer { private: class item_positions: public std::vector { public: typedef std::vector super; public: item_positions( const bear::universe::physical_item* item ); bool has_moved( const bear::universe::physical_item* item ) const; }; // class item_positions typedef std::map< const bear::universe::physical_item*, std::list > item_map; public: recent_path_layer(); private: void render ( scene_element_list& e, const bear::visual::position_type& delta ) const; void progress ( const item_list& items, bear::universe::time_type elapsed_time ); private: /** \brief The items and their paths. */ item_map m_items; }; // class recent_path_layer } // namespace bear #endif // __BEAR_RECENT_PATH_LAYER_HPP__ plee-the-bear-20251226/bear-engine/lib/src/generic_items/layer/runtime_settings_layer.hpp000066400000000000000000000051341512343254000313450ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief This layer displays the runtime settings with some components to edit * their values. * \author Julien Jorge */ #ifndef __BEAR_RUNTIME_SETTINGS_LAYER_HPP__ #define __BEAR_RUNTIME_SETTINGS_LAYER_HPP__ #include "engine/layer/base_debugging_layer.hpp" #include "gui/text_input.hpp" #include "gui/visual_component.hpp" #include "generic_items/class_export.hpp" namespace bear { /** * \brief This layer displays the runtime settings with some components to * edit their values. * \author Julien Jorge */ class GENERIC_ITEMS_EXPORT runtime_settings_layer: public engine::gui_layer { private: /** * \brief The class to pass to the visitor of the global settings in order * to get the settings. */ class setting_visitor { public: setting_visitor( runtime_settings_layer& layer ); template void operator()( std::string name, T var ) const; private: /** \brief The layer to which we pass the settings. */ runtime_settings_layer& m_layer; }; // class setting_visitor public: runtime_settings_layer( visual::font f ); ~runtime_settings_layer(); void render( scene_element_list& e ) const; bool key_pressed( const input::key_info& key ); private: void build_components(); void clear(); void update(); template void process_setting( std::string name, T* var ) const; template void on_enter( T* var, gui::text_input* value ) const; private: /** \brief The value of the key that changes the visibility of the layer. */ const input::key_code m_toggle_key; /** \brief The font to use to display the labels and the values. */ visual::font m_font; /** \brief The container of all components. */ gui::visual_component* m_root_component; /** \brief The component in which the user can enter a pattern to filter the settings. */ gui::text_input* m_pattern; /** \brief The component that displays the settings. */ gui::visual_component* m_settings; /** \brief The margin between the components. */ static const gui::size_type s_margin; /** \brief The cursor of the cursor in the text input components. */ static const gui::color_type s_cursor_color; }; // class runtime_settings_layer } // namespace bear #endif // __BEAR_RUNTIME_SETTINGS_LAYER_HPP__ plee-the-bear-20251226/bear-engine/lib/src/generic_items/layer/wireframe_layer.hpp000066400000000000000000000033771512343254000277320ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief This layer displays the bounding boxes of the items. * \author Julien Jorge */ #ifndef __BEAR_WIREFRAME_LAYER_HPP__ #define __BEAR_WIREFRAME_LAYER_HPP__ #include "engine/layer/base_debugging_layer.hpp" #include "generic_items/class_export.hpp" namespace bear { /** * \brief This layer displays the bounding boxes if the items. * \author Julien Jorge */ class GENERIC_ITEMS_EXPORT wireframe_layer: public engine::base_debugging_layer { public: wireframe_layer(); private: void render ( scene_element_list& e, const visual::position_type& delta ) const; void progress ( const item_list& items, universe::time_type elapsed_time ); private: void draw_box ( scene_element_list& e, const visual::position_type& delta, const universe::physical_item& item, const visual::color_type& color ) const; void draw_internal_forces ( scene_element_list& e, const visual::position_type& delta, const universe::physical_item& item, const visual::color_type& color ) const; void draw_system ( scene_element_list& e, const visual::position_type& delta, const universe::physical_item& item, const visual::color_type& color ) const; void draw_slope ( scene_element_list& e, const visual::position_type& delta, const universe::physical_item& item, const visual::color_type& color ) const; private: /** \brief The items to render. */ item_list m_items; }; // class wireframe_layer } // namespace bear #endif // __BEAR_WIREFRAME_LAYER_HPP__ plee-the-bear-20251226/bear-engine/lib/src/generic_items/level_loader_item.hpp000066400000000000000000000054441512343254000271110ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief This item loads a level. * \author Julien Jorge */ #ifndef __BEAR_LEVEL_LOADER_ITEM_HPP__ #define __BEAR_LEVEL_LOADER_ITEM_HPP__ #include "engine/base_item.hpp" #include "engine/level_loader.hpp" #include "generic_items/class_export.hpp" #include "engine/export.hpp" namespace bear { /** * \brief This item loads a level. * * The custom fields of this class are : * - \a ratio: real, ratio of the game's time window to spend in the loading * of the level (default = 0.5), * - \a level: string, required. The name of the game variable containing the * path of the level to load or the name of the level itself. * * \author Julien Jorge. */ class GENERIC_ITEMS_EXPORT level_loader_item: public bear::engine::base_item { DECLARE_BASE_ITEM(level_loader_item); typedef bear::engine::base_item super; /** \brief The type of a method to call in the progress() method. */ typedef void (level_loader_item::*progress_function_type) (bear::universe::time_type elapsed_time ); public: level_loader_item(); level_loader_item( const level_loader_item& that ); ~level_loader_item(); void build(); void progress( bear::universe::time_type elapsed_time ); bool set_string_field( const std::string& name, const std::string& value ); bool set_real_field( const std::string& name, double value ); bool is_valid() const; unsigned int get_item_index() const; unsigned int get_items_count() const; bool level_is_loaded() const; void start_level(); private: void progress_preload( bear::universe::time_type elapsed_time ); void progress_loading(); void clear_loading_data(); level_loader_item& operator=( const level_loader_item& that ); private: /** \brief The loader with wich we load the level. */ engine::level_loader* m_level_loader; /** \brief The file given to the level_loader. */ engine::compiled_file* m_level_file; /** \brief The stream passed to the compiled file. */ std::stringstream* m_level_stream; /** \brief The level, once we have loaded it. */ engine::level* m_level; /** \brief The path of the level to load. */ std::string m_level_path; /** \brief The ratio of the game's time window to spend in the loading of the level. */ double m_ratio; /** \brief The index of the currently loaded item. */ unsigned int m_item_index; /** \brief The total number of items to load. */ unsigned int m_items_count; }; // class level_loader_item } // namespace bear #endif // __BEAR_LEVEL_LOADER_ITEM_HPP__ plee-the-bear-20251226/bear-engine/lib/src/generic_items/level_loader_progression_item.hpp000066400000000000000000000031001512343254000315260ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief An item that fills a bar while loading a level. * \author Julien Jorge */ #ifndef __BEAR_LEVEL_LOADER_PROGRESSION_ITEM_HPP__ #define __BEAR_LEVEL_LOADER_PROGRESSION_ITEM_HPP__ #include "generic_items/level_loader_item.hpp" #include "engine/item_brick/basic_renderable_item.hpp" #include "generic_items/class_export.hpp" #include "engine/export.hpp" namespace bear { /** * \brief An item that fills a bar while loading a level. * * The fields of this class are: * - \a sprite: the sprite that grows while the level is loaded. * Required. * * \author Julien Jorge */ class GENERIC_ITEMS_EXPORT level_loader_progression_item: public engine::basic_renderable_item { DECLARE_BASE_ITEM(level_loader_progression_item); public: /** \brief The type of the parent class. */ typedef engine::basic_renderable_item super; public: void progress( universe::time_type elapsed_time ); void get_visual( std::list& visuals ) const; bool set_sprite_field ( const std::string& name, const visual::sprite& value ); bool is_valid(); private: /** \brief The progess bar of the items. */ visual::sprite m_item_bar; }; // class level_loader_progression_item } // namespace bear #endif // __BEAR_LEVEL_LOADER_PROGRESSION_ITEM_HPP__ plee-the-bear-20251226/bear-engine/lib/src/generic_items/level_loader_toggle.hpp000066400000000000000000000045261512343254000274340ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief This class starts a level after a given delay. * \author Julien Jorge */ #ifndef __BEAR_LEVEL_LOADER_TOGGLE_HPP__ #define __BEAR_LEVEL_LOADER_TOGGLE_HPP__ #include "engine/item_brick/item_with_toggle.hpp" #include "engine/base_item.hpp" #include "engine/export.hpp" #include "generic_items/class_export.hpp" namespace bear { /** * \brief This item starts a level when activated. * * The custom fields of this class are : * - \a fade_duration: real, the duration of the fading effect before starting * the level (default = 1), * - \a level: string, required. The name of the game variable containing the * name of the level to load or the path of the level itself, * - \a transition_layer_name: string, the name of the transition layer * receiving the fade effect (default = none). * - \a push_mode: bool, indicates if the level must be pushed * (default = false). * - any field supported by the parent class. * * \author Julien Jorge */ class GENERIC_ITEMS_EXPORT level_loader_toggle: public engine::item_with_toggle { DECLARE_BASE_ITEM(level_loader_toggle); public: /** \brief The type of the parent class. */ typedef engine::item_with_toggle super; public: level_loader_toggle(); bool set_string_field( const std::string& name, const std::string& value ); bool set_real_field( const std::string& name, double value ); bool set_bool_field( const std::string& name, bool value ); bool is_valid() const; private: void on_toggle_on( engine::base_item* activator ); std::string get_string_from_vars( const std::string& name ) const; private: /** \brief The path of the level to load. */ std::string m_level_path; /** \brief The name of the transition layer receiving the fade effect. */ std::string m_transition_layer_name; /** \brief The duration of the fading. */ universe::time_type m_fade_duration; /** \brief Indicates if the level must be pushed. */ bool m_push_mode; }; // class level_loader_toggle } // namespace bear #endif // __BEAR_LEVEL_LOADER_TOGGLE_HPP__ plee-the-bear-20251226/bear-engine/lib/src/generic_items/level_popper_toggle.hpp000066400000000000000000000043641512343254000274730ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief This class pops the level after a given delay. * \author Sebastien Angibaud */ #ifndef __BEAR_LEVEL_POPPER_TOGGLE_HPP__ #define __BEAR_LEVEL_POPPER_TOGGLE_HPP__ #include "engine/item_brick/item_with_toggle.hpp" #include "engine/base_item.hpp" #include "engine/export.hpp" #include "generic_items/class_export.hpp" namespace bear { /** * \brief This item pops the level when activated after a given delay. * * The custom fields of this class are : * - \a fade_duration: real, the duration of the fading effect before starting * the level (default = 1), * - \a transition_layer_name: string, the name of the transition layer * receiving the fade effect (default = none). * - any field supported by the parent class. * * \author Sebastien Angibaud */ class GENERIC_ITEMS_EXPORT level_popper_toggle: public engine::item_with_toggle { DECLARE_BASE_ITEM(level_popper_toggle); public: /** \brief The type of the parent class. */ typedef engine::item_with_toggle super; public: level_popper_toggle(); void progress( bear::universe::time_type elapsed_time ); bool set_string_field( const std::string& name, const std::string& value ); bool set_real_field( const std::string& name, double value ); private: void on_toggle_on( engine::base_item* activator ); void start_fading(); std::string get_string_from_vars( const std::string& name ) const; private: /** \brief The name of the transition layer receiving the fade effect. */ std::string m_transition_layer_name; /** \brief The duration of the fading. */ universe::time_type m_fade_duration; /** \brief Tell if the level has been popped. */ bool m_applied; /** \brief The time elapsed since the creation of the item. */ bear::universe::time_type m_time; /** \brief Tell if the level has been start the fade out. */ bool m_start_fade_out; }; // class level_popper_toggle } // namespace bear #endif // __BEAR_LEVEL_POPPER_TOGGLE_HPP__ plee-the-bear-20251226/bear-engine/lib/src/generic_items/level_settings.hpp000066400000000000000000000035561512343254000264670ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief An item to set the parameters of the current level. * \author Julien Jorge */ #ifndef __BEAR_LEVEL_SETTINGS_HPP__ #define __BEAR_LEVEL_SETTINGS_HPP__ #include "engine/base_item.hpp" #include "engine/export.hpp" #include "generic_items/class_export.hpp" namespace bear { /** * \brief An item to set the parameters of the current level. * * The valid fields for this item are * - \c full_volume_distance (real) The distance under which sounds are at * maximum volume (default = 200), * - \c silence_distance (real) The distance from which we can't hear a sound * (default = 1200), * - any field supported by the parent classes. * * \author Julien Jorge */ class GENERIC_ITEMS_EXPORT level_settings: public engine::base_item { DECLARE_BASE_ITEM(level_settings); public: /** \brief The type of the parent class. */ typedef engine::base_item super; private: /** * \brief The item loader for the level settings. */ class loader: public engine::item_loader_base { private: /** \brief The type of the parent class. */ typedef engine::item_loader_base super; public: explicit loader( engine::level_globals& settings ); loader* clone() const; bool set_field( const std::string& name, double value ); private: /** \brief The instance through which we set the parameters. */ engine::level_globals& m_settings; }; // class loader public: void build(); protected: void populate_loader_map( engine::item_loader_map& m ); }; // class level_settings } // namespace bear #endif // __BEAR_LEVEL_SETTINGS_HPP__ plee-the-bear-20251226/bear-engine/lib/src/generic_items/level_variable/000077500000000000000000000000001512343254000256725ustar00rootroot00000000000000bool_level_variable_getter_creator.hpp000066400000000000000000000035511512343254000354100ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/lib/src/generic_items/level_variable/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A boolean expression that returns the value of a level variable. * \author Sébastien Angibaud */ #ifndef __BEAR_BOOL_LEVEL_VARIABLE_GETTER_CREATOR_HPP__ #define __BEAR_BOOL_LEVEL_VARIABLE_GETTER_CREATOR_HPP__ #include "engine/base_item.hpp" #include "engine/function/bool_level_variable_getter.hpp" #include "engine/item_brick/with_boolean_expression_creation.hpp" #include "engine/export.hpp" #include "generic_items/class_export.hpp" namespace bear { /** * \brief A boolean expression that returns the value of a level variable. * * The valid fields for this item are * - name: The name of the variable to get, * - default_value: The default value of the variable, if not set, * - any field supported by the parent classes. * * \author Sébastien Angibaud */ class GENERIC_ITEMS_EXPORT bool_level_variable_getter_creator: public engine::base_item, public engine::with_boolean_expression_creation { DECLARE_BASE_ITEM(bool_level_variable_getter_creator); public: /** \brief The type of the parent class. */ typedef engine::base_item super; public: bool_level_variable_getter_creator(); void build(); bool is_valid() const; bool set_string_field ( const std::string& name, const std::string& value ); bool set_bool_field( const std::string& name, bool value ); private: virtual expr::boolean_expression do_get_expression() const; private: /** \brief The expression created by this item. */ engine::bool_level_variable_getter m_expr; }; // class bool_level_variable_getter_creator } // namespace bear #endif // __BEAR_BOOL_LEVEL_VARIABLE_GETTER_CREATOR_HPP__ plee-the-bear-20251226/bear-engine/lib/src/generic_items/level_variable/code/000077500000000000000000000000001512343254000266045ustar00rootroot00000000000000bool_level_variable_getter_creator.cpp000066400000000000000000000056701512343254000363210ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/lib/src/generic_items/level_variable/code/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::bool_level_variable_getter_creator class. * \author Sébastien Angibaud */ #include "generic_items/level_variable/bool_level_variable_getter_creator.hpp" BASE_ITEM_EXPORT( bool_level_variable_getter_creator, bear ) /*----------------------------------------------------------------------------*/ /** * \brief Contructor. */ bear::bool_level_variable_getter_creator::bool_level_variable_getter_creator() { m_expr.set_default_value(false); } // bool_level_variable_getter_creator::bool_level_variable_getter_creator() /*----------------------------------------------------------------------------*/ /** * \brief Initialize the item. */ void bear::bool_level_variable_getter_creator::build() { m_expr.set_level( &engine::level_object::get_level() ); kill(); } // bool_level_variable_getter_creator::build() /*----------------------------------------------------------------------------*/ /** * \brief Tell if the item is correctly initialized. */ bool bear::bool_level_variable_getter_creator::is_valid() const { return !m_expr.get_name().empty() && super::is_valid(); } // bool_level_variable_getter_creator::is_valid() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type \c string. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::bool_level_variable_getter_creator::set_string_field ( const std::string& name, const std::string& value ) { bool result = true; if ( name == "bool_level_variable_getter_creator.name" ) m_expr.set_name(value); else result = super::set_string_field(name, value); return result; } // bool_level_variable_getter_creator::set_string_field() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type \c bool. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::bool_level_variable_getter_creator::set_bool_field ( const std::string& name, bool value ) { bool result = true; if ( name == "bool_level_variable_getter_creator.default_value" ) m_expr.set_default_value(value); else result = super::set_bool_field(name, value); return result; } // bool_level_variable_getter_creator::set_bool_field() /*----------------------------------------------------------------------------*/ /** * \brief Get the expression created by this item. */ bear::expr::boolean_expression bear::bool_level_variable_getter_creator::do_get_expression() const { return m_expr; } // bool_level_game_variable_getter_creator::do_get_expression() u_int_level_variable_getter_creator.cpp000066400000000000000000000057331512343254000365040ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/lib/src/generic_items/level_variable/code/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::u_int_level_variable_getter_creator class. * \author Julien Jorge */ #include "generic_items/level_variable/u_int_level_variable_getter_creator.hpp" BASE_ITEM_EXPORT( u_int_level_variable_getter_creator, bear ) /*----------------------------------------------------------------------------*/ /** * \brief Contructor. */ bear::u_int_level_variable_getter_creator::u_int_level_variable_getter_creator() { m_expr.set_default_value(0); } // u_int_level_variable_getter_creator::u_int_level_variable_getter_creator() /*----------------------------------------------------------------------------*/ /** * \brief Initialize the item. */ void bear::u_int_level_variable_getter_creator::build() { m_expr.set_level( &engine::level_object::get_level() ); kill(); } // u_int_level_variable_getter_creator::build() /*----------------------------------------------------------------------------*/ /** * \brief Tell if the item is correctly initialized. */ bool bear::u_int_level_variable_getter_creator::is_valid() const { return !m_expr.get_name().empty() && super::is_valid(); } // u_int_level_variable_getter_creator::is_valid() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type \c string. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::u_int_level_variable_getter_creator::set_string_field ( const std::string& name, const std::string& value ) { bool result = true; if ( name == "u_int_level_variable_getter_creator.name" ) m_expr.set_name(value); else result = super::set_string_field(name, value); return result; } // u_int_level_variable_getter_creator::set_string_field() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type \c unsigned integer. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::u_int_level_variable_getter_creator::set_u_integer_field ( const std::string& name, unsigned int value ) { bool result = true; if ( name == "u_int_level_variable_getter_creator.default_value" ) m_expr.set_default_value(value); else result = super::set_u_integer_field(name, value); return result; } // u_int_level_variable_getter_creator::set_u_int_field() /*----------------------------------------------------------------------------*/ /** * \brief Get the expression created by this item. */ bear::expr::linear_expression bear::u_int_level_variable_getter_creator::do_get_expression() const { return m_expr; } // u_level_game_variable_getter_creator::do_get_expression() u_int_level_variable_getter_creator.hpp000066400000000000000000000035771512343254000356030ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/lib/src/generic_items/level_variable/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A linear expression that returns the value of a level variable. * \author Julien Jorge */ #ifndef __BEAR_U_INT_LEVEL_VARIABLE_GETTER_CREATOR_HPP__ #define __BEAR_U_INT_LEVEL_VARIABLE_GETTER_CREATOR_HPP__ #include "engine/base_item.hpp" #include "engine/function/linear_level_variable_getter.hpp" #include "engine/item_brick/with_linear_expression_creation.hpp" #include "engine/export.hpp" #include "generic_items/class_export.hpp" namespace bear { /** * \brief A linear expression that returns the value of a level variable. * * The valid fields for this item are * - name: The name of the variable to get, * - default_value: The default value of the variable, if not set, * - any field supported by the parent classes. * * \author Julien Jorge */ class GENERIC_ITEMS_EXPORT u_int_level_variable_getter_creator: public engine::base_item, public engine::with_linear_expression_creation { DECLARE_BASE_ITEM(u_int_level_variable_getter_creator); public: /** \brief The type of the parent class. */ typedef engine::base_item super; public: u_int_level_variable_getter_creator(); void build(); bool is_valid() const; bool set_string_field ( const std::string& name, const std::string& value ); bool set_u_integer_field( const std::string& name, unsigned int value ); private: virtual expr::linear_expression do_get_expression() const; private: /** \brief The expression created by this item. */ engine::linear_level_variable_getter m_expr; }; // class u_int_level_variable_getter_creator } // namespace bear #endif // __BEAR_U_INT_LEVEL_VARIABLE_GETTER_CREATOR_HPP__ plee-the-bear-20251226/bear-engine/lib/src/generic_items/line.hpp000066400000000000000000000037731512343254000243700ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A class to display a line between items. * \author Julien Jorge */ #ifndef __BEAR_LINE_HPP__ #define __BEAR_LINE_HPP__ #include "engine/base_item.hpp" #include "engine/item_brick/basic_renderable_item.hpp" #include "universe/const_item_handle.hpp" #include "engine/export.hpp" #include "generic_items/class_export.hpp" namespace bear { /** * \brief A class to display a line between items. * * The custom fields of this class are: * - ends (list of items): the ends of the segments of the line, * - width (real): the width of the line (default = 1). * * \author Julien Jorge */ class GENERIC_ITEMS_EXPORT line: public engine::basic_renderable_item { DECLARE_BASE_ITEM(line); public: /** \brief The type of the parent class. */ typedef engine::basic_renderable_item super; private: /** \brief The type of the container in which the coordinates of the line are stored. */ typedef std::list point_list_type; public: line(); explicit line( const super& that ); void build(); bool set_real_field( const std::string& name, double value ); bool set_item_list_field ( const std::string& name, const std::vector& value ); void progress( universe::time_type elapsed_time ); void get_visual( std::list& visuals ) const; void push_back( engine::base_item* item ); void set_line_width( visual::size_type w ); private: void adjust_position_and_size(); private: /** \brief The ends of the segments of the line. */ point_list_type m_points; /** \brief The width of the line. */ visual::size_type m_width; }; // class line } // namespace bear #endif // __BEAR_LINE_HPP__ plee-the-bear-20251226/bear-engine/lib/src/generic_items/linear_movement_sequence_loop.hpp000066400000000000000000000053021512343254000315340ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A linear_movement_sequence_loop is an item that creates some items * and sets their movement as a linear movement * \author Sébastien Angibaud */ #ifndef __BEAR_LINEAR_MOVEMENT_SEQUENCE_LOOP_HPP__ #define __BEAR_LINEAR_MOVEMENT_SEQUENCE_LOOP_HPP__ #include "engine/base_item.hpp" #include "engine/export.hpp" #include "generic_items/class_export.hpp" namespace bear { /** * \brief A linear_movement_sequence_loop is an item that creates some items * and sets their movement as a linear movement. * * The custom fields of this class are: * - duration (real) The duration of the movement (default = 1) * - length.x (real) The length of the movement on x-axis (default = 0) * - length.y (real) The length of the movement on y-axis (default = 0) * - positions (list of real) The item positions according the duration * - item (item_reference) The item that is copied. * - \a auto_remove: (bool) Tell if the angle of moving items are * updated according to their angular speed (default = false). * - any field supported by the parent class. * * \author Sébastien Angibaud */ class GENERIC_ITEMS_EXPORT linear_movement_sequence_loop: public engine::base_item { DECLARE_BASE_ITEM(linear_movement_sequence_loop); public: /** \brief The type of the parent class. */ typedef engine::base_item super; public: linear_movement_sequence_loop(); void build(); bool set_item_field( const std::string& name, base_item* value ); bool set_real_field( const std::string& name, double value ); bool set_real_list_field ( const std::string& name, const std::vector& value ); bool set_bool_field( const std::string& name, bool value ); bool is_valid() const; private: void create_items(); private: /** \brief The item that is copied. */ engine::base_item* m_item; /** \brief The duration of the linear_movement_sequence_loop. */ universe::time_type m_duration; /** \brief The item position at the beginning. */ std::vector m_positions; /** \brief The length of the movement on x-axis. */ universe::coordinate_type m_x_length; /** \brief The length of the movement on y-axis. */ universe::coordinate_type m_y_length; /** \brief Tell if the angle of the moving item is updated according to its angular speed. */ bool m_auto_angle; }; // class linear_movement_sequence_loop } // namespace bear #endif // __BEAR_LINEAR_MOVEMENT_SEQUENCE_LOOP_HPP__ plee-the-bear-20251226/bear-engine/lib/src/generic_items/lines.hpp000066400000000000000000000043361512343254000245470ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A class to create several bear::line. * \author Julien Jorge */ #ifndef __BEAR_LINES_HPP__ #define __BEAR_LINES_HPP__ #include "engine/base_item.hpp" #include "engine/item_brick/basic_renderable_item.hpp" #include "engine/export.hpp" #include "generic_items/class_export.hpp" namespace bear { /** * \brief A class to create several bear::line. * * bear::line has to adjust its size to fit all the items to be sure * they are displayed. If the set of items is large enough, * bear::line tends to cover the whole world. bear::lines will * create several instances of bear::line, one for each pair of * successive items, each one will thus be restricted to a small * part of the world. * * One reason to not use this class instead of bear::line is that * the whole line will be broken if one item dies, whereas * bear::line would just adapt the line to the remaining items. * * The custom fields of this class are: * - ends (list of items): the ends of the segments of the lines, * - width (real): the width of the lines (default = 1). * * \sa bear::line * * \author Julien Jorge */ class GENERIC_ITEMS_EXPORT lines: public engine::basic_renderable_item { DECLARE_BASE_ITEM(lines); public: /** \brief The type of the parent class. */ typedef engine::basic_renderable_item super; private: /** \brief The type of the container in which the coordinates of the line are stored. */ typedef std::list point_list_type; public: lines(); void build(); bool set_real_field( const std::string& name, double value ); bool set_item_list_field ( const std::string& name, const std::vector& value ); private: /** \brief The ends of the segments of the lines. */ point_list_type m_points; /** \brief The width of the lines. */ visual::size_type m_width; }; // class lines } // namespace bear #endif // __BEAR_LINES_HPP__ plee-the-bear-20251226/bear-engine/lib/src/generic_items/link/000077500000000000000000000000001512343254000236535ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/lib/src/generic_items/link/base_link_visual.hpp000066400000000000000000000076321512343254000277060ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Base class to display a link between two items. * \author Julien Jorge */ #ifndef __BEAR_BASE_LINK_VISUAL_HPP__ #define __BEAR_BASE_LINK_VISUAL_HPP__ #include "engine/base_item.hpp" #include "engine/export.hpp" #include #include "generic_items/class_export.hpp" namespace bear { /** * \brief Base class to display a link between two items. * * The custom fields of this class are: * - start_item: item, the item to use as reference for the start extremity, * - end_item: item, the item to use as reference for the end extremity, * - start_x_origin: string in {"left", "right", "middle"}, the x position of * the start extremity in the reference item. (default = "middle"), * - start_y_origin: string in {"top", "bottom", "middle"}, the y position of * the start extremity in the reference item. (default = "middle"), * - end_x_origin: string in {"left", "right", "middle"}, the x position of * the end extremity in the reference item. (default = "middle"), * - end_y_origin: string in {"top", "bottom", "middle"}, the y position of * the end extremity in the reference item. (default = "middle"), * - start_x_delta: real, delta to apply on the x-position of the start * extremity (default = 0), * - start_y_delta: real, delta to apply on the y-position of the start * extremity (default = 0), * - end_x_delta: real, delta to apply on the x-position of the end * extremity (default = 0), * - end_y_delta: real, delta to apply on the y-position of the end * extremity (default = 0), * * \author Julien Jorge */ class GENERIC_ITEMS_EXPORT base_link_visual: public engine::base_item { DECLARE_BASE_ITEM( base_link_visual); public: typedef engine::base_item super; private: typedef std::const_mem_fun_t position_function_type; public: base_link_visual(); void set_items( engine::base_item* s, engine::base_item* e ); void set_items ( engine::base_item* s, engine::base_item* e, std::size_t link_id ); bool set_real_field( const std::string& name, double value ); bool set_string_field( const std::string& name, const std::string& value ); bool set_item_field( const std::string& name, base_item* value ); void progress( universe::time_type elapsed_time ); protected: void update_size( universe::time_type elapsed_time ); universe::position_type get_start_position() const; universe::position_type get_end_position() const; private: /** \brief The item to use for the start extremity. */ universe::item_handle m_start; /** \brief The item to use for the end extremity. */ universe::item_handle m_end; /** \brief Method to call on the start item to get the x-position of the start extremity. */ position_function_type m_start_x_position; /** \brief Method to call on the start item to get the y-position of the start extremity. */ position_function_type m_start_y_position; /** \brief Method to call on the end item to get the x-position of the end extremity. */ position_function_type m_end_x_position; /** \brief Method to call on the end item to get the y-position of the end extremity. */ position_function_type m_end_y_position; /** \brief Delta to apply to the start item's origin. */ universe::position_type m_start_delta; /** \brief Delta to apply to the end item's origin. */ universe::position_type m_end_delta; /** \brief The identifier of the link displayed by this item. */ std::size_t m_link_id; }; // class base_link_visual } // namespace bear #endif // __BEAR_BASE_LINK_VISUAL_HPP__ plee-the-bear-20251226/bear-engine/lib/src/generic_items/link/chain_link_visual.hpp000066400000000000000000000036131512343254000300510ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A class to display a link between two items with a chain. * \author Julien Jorge */ #ifndef __BEAR_CHAIN_LINK_VISUAL_HPP__ #define __BEAR_CHAIN_LINK_VISUAL_HPP__ #include "generic_items/link/base_link_visual.hpp" #include "engine/item_brick/basic_renderable_item.hpp" #include "engine/item_brick/item_with_decoration.hpp" #include "engine/export.hpp" namespace bear { /** * \brief A class to display a link between two items as a chain. * \author Julien Jorge */ class GENERIC_ITEMS_EXPORT chain_link_visual: public engine::item_with_decoration < engine::basic_renderable_item > { DECLARE_BASE_ITEM(chain_link_visual); public: typedef engine::item_with_decoration < engine::basic_renderable_item > super; public: chain_link_visual(); bool set_real_field( const std::string& name, double value ); bool set_u_integer_field( const std::string& name, unsigned int value ); bool set_bool_field( const std::string& name, bool value ); void get_visual( std::list& visuals ) const; void set_link_count(std::size_t link_count); void set_max_fall(universe::coordinate_type max_fall); void set_dynamic_length(bool dynamic_length); private: unsigned int get_link_count() const; private: /** \brief The count of links in the chain. */ std::size_t m_link_count; /** \brief How far the the links can fall. */ universe::coordinate_type m_max_fall; /** \brief Indicates if the number of links is dynamically computed. */ bool m_dynamic_length; }; // class chain_link_visual } // namespace bear #endif // __BEAR_CHAIN_LINK_VISUAL_HPP__ plee-the-bear-20251226/bear-engine/lib/src/generic_items/link/code/000077500000000000000000000000001512343254000245655ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/lib/src/generic_items/link/code/base_link_visual.cpp000066400000000000000000000174571512343254000306210ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::base_link_visual class. * \author Sebastien Angibaud */ #include "generic_items/link/base_link_visual.hpp" #include "universe/link/base_link.hpp" BASE_ITEM_IMPLEMENT( base_link_visual, bear ) /*----------------------------------------------------------------------------*/ /** * \brief Contructor. */ bear::base_link_visual::base_link_visual() : m_start(NULL), m_end(NULL), m_start_x_position(&universe::physical_item_state::get_horizontal_middle), m_start_y_position(&universe::physical_item_state::get_vertical_middle), m_end_x_position(&universe::physical_item_state::get_horizontal_middle), m_end_y_position(&universe::physical_item_state::get_vertical_middle), m_start_delta(0, 0), m_end_delta(0, 0), m_link_id(universe::base_link::not_an_id) { set_global(true); set_phantom(true); set_can_move_items(false); set_artificial(true); } // base_link_visual::base_link_visual() /*----------------------------------------------------------------------------*/ /** * \brief Set the linked items. * \param s The item where the link starts. * \param e The item where the link ends. */ void bear::base_link_visual::set_items ( engine::base_item* s, engine::base_item* e ) { m_start = s; m_end = e; m_link_id = universe::base_link::not_an_id; } // base_link_visual::set_items() /*----------------------------------------------------------------------------*/ /** * \brief Set the linked items. * \param s The item where the link starts. * \param e The item where the link ends. * \param id The identifier of the link between the items. If the link is * removed, the visual dies. */ void bear::base_link_visual::set_items ( engine::base_item* s, engine::base_item* e, std::size_t link_id ) { m_start = s; m_end = e; m_link_id = link_id; } // base_link_visual::set_items() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type \c real. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::base_link_visual::set_real_field( const std::string& name, double value ) { bool ok = true; if (name == "base_link_visual.start_delta.x") m_start_delta.x = value; else if (name == "base_link_visual.start_delta.y") m_start_delta.y = value; else if (name == "base_link_visual.end_delta.x") m_end_delta.x = value; else if (name == "base_link_visual.end_delta.y") m_end_delta.y = value; else ok = super::set_real_field(name, value); return ok; } // base_link_visual::set_real_field() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type \c string. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::base_link_visual::set_string_field ( const std::string& name, const std::string& value ) { bool ok = true; if (name == "base_link_visual.start_origin.x") { if (value == "left") m_start_x_position = std::mem_fun(&universe::physical_item_state::get_left); else if (value == "right") m_start_x_position = std::mem_fun(&universe::physical_item_state::get_right); else if (value == "middle") m_start_x_position = std::mem_fun(&universe::physical_item_state::get_horizontal_middle); else ok = false; } else if (name == "base_link_visual.start_origin.y") { if (value == "top") m_start_y_position = std::mem_fun(&universe::physical_item_state::get_top); else if (value == "bottom") m_start_y_position = std::mem_fun(&universe::physical_item_state::get_bottom); else if (value == "middle") m_start_y_position = std::mem_fun(&universe::physical_item_state::get_vertical_middle); else ok = false; } else if (name == "base_link_visual.end_origin.x") { if (value == "left") m_end_x_position = std::mem_fun(&universe::physical_item_state::get_left); else if (value == "right") m_end_x_position = std::mem_fun(&universe::physical_item_state::get_right); else if (value == "middle") m_end_x_position = std::mem_fun(&universe::physical_item_state::get_horizontal_middle); else ok = false; } else if (name == "base_link_visual.end_origin.y") { if (value == "top") m_end_y_position = std::mem_fun(&universe::physical_item_state::get_top); else if (value == "bottom") m_end_y_position = std::mem_fun(&universe::physical_item_state::get_bottom); else if (value == "middle") m_end_y_position = std::mem_fun(&universe::physical_item_state::get_vertical_middle); else ok = false; } else ok = super::set_string_field(name, value); return ok; } // base_link_visual::set_string_field() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type \c base_item. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::base_link_visual::set_item_field ( const std::string& name, base_item* value ) { bool ok = true; if (name == "base_link_visual.start_item") m_start = value; else if (name == "base_link_visual.end_item") m_end = value; else ok = super::set_item_field(name, value); return ok; } // base_link_visual::set_item_field() /*----------------------------------------------------------------------------*/ /** * \brief Do one iteration in the progression of the item. * \param elapsed_time Elapsed time since the last call. */ void bear::base_link_visual::progress( universe::time_type elapsed_time ) { super::progress(elapsed_time); if ( m_link_id != universe::base_link::not_an_id ) if ( (m_start!=NULL) && (m_end!=NULL) ) if ( !m_start->is_linked_to(*m_end, m_link_id) ) kill(); update_size(elapsed_time); } // base_link_visual::progress() /*----------------------------------------------------------------------------*/ /** * \brief Update the size of the item. * \param elapsed_time Elapsed time since the last call. */ void bear::base_link_visual::update_size( universe::time_type elapsed_time ) { if ( (m_start == NULL) || (m_end == NULL) ) kill(); else { universe::rectangle_type r( get_start_position(), get_end_position() ); set_bottom_left( r.bottom_left() ); set_size( r.size() ); } } // base_link_visual::update_size() /*----------------------------------------------------------------------------*/ /** * \brief Get the position of the start extremity. */ bear::universe::position_type bear::base_link_visual::get_start_position() const { if ( m_start == NULL ) return universe::position_type(0, 0); else return universe::position_type ( m_start_x_position(m_start.get()), m_start_y_position(m_start.get()) ) + m_start_delta; } // base_link_visual::get_start_position() /*----------------------------------------------------------------------------*/ /** * \brief Get the position of the end extremity. */ bear::universe::position_type bear::base_link_visual::get_end_position() const { if ( m_end == NULL ) return universe::position_type(0, 0); else return universe::position_type ( m_end_x_position(m_end.get()), m_end_y_position(m_end.get()) ) + m_end_delta; } // base_link_visual::get_end_position() plee-the-bear-20251226/bear-engine/lib/src/generic_items/link/code/chain_link_visual.cpp000066400000000000000000000117541512343254000307630ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::chain_link_visual class. * \author Julien Jorge */ #include "generic_items/link/chain_link_visual.hpp" #include "engine/export.hpp" BASE_ITEM_EXPORT( chain_link_visual, bear ) /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ bear::chain_link_visual::chain_link_visual() : m_link_count(0), m_max_fall(0), m_dynamic_length(false) { } // chain_link_visual::chain_link_visual() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type "real". * \param name The name of the field. * \param value The value of the field. */ bool bear::chain_link_visual::set_real_field ( const std::string& name, double value ) { bool result = true; if ( name == "chain_link_visual.max_fall" ) m_max_fall = value; else result = super::set_real_field(name, value); return result; } // chain_link_visual::set_real_field() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type "unsigned int". * \param name The name of the field. * \param value The value of the field. */ bool bear::chain_link_visual::set_u_integer_field ( const std::string& name, unsigned int value ) { bool result = true; if ( name == "chain_link_visual.links_count" ) m_link_count = value; else result = super::set_u_integer_field(name, value); return result; } // chain_link_visual::set_u_integer_field() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type \c bool. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::chain_link_visual::set_bool_field ( const std::string& name, bool value ) { bool result = true; if ( name == "chain_link_visual.dynamic_length" ) m_dynamic_length = value; else result = super::set_bool_field(name, value); return result; } // chain_link_visual::set_bool_field() /*----------------------------------------------------------------------------*/ /** * \brief Get the visuals of this item. * \param visuals (out) The visuals. */ void bear::chain_link_visual::get_visual ( std::list& visuals ) const { const std::size_t n(get_link_count()); universe::vector_type dir = get_end_position() - get_start_position(); const double intensity = std::abs(get_end_position().x - get_start_position().x) / get_end_position().distance(get_start_position()); const visual::sprite s(get_sprite()); universe::vector_type ortho; if ( get_end_position().x < get_start_position(). x ) ortho = dir.get_orthonormal_anticlockwise(); else ortho = dir.get_orthonormal_clockwise(); ortho.normalize(); dir /= n-1; const visual::position_type origin ( get_start_position() - s.get_size() / 2 ); for (std::size_t i=0; i!=n; ++i) { visual::position_type p = dir * i; double fall_distance = std::sin( (double)i / n * 3.14159 ) * intensity * m_max_fall; p += ortho * fall_distance; visuals.push_front ( engine::scene_visual( origin + p, s, get_z_position() ) ); } } // chain_link_visual::get_visual() /*----------------------------------------------------------------------------*/ /** * \brief Set number of links to display. */ void bear::chain_link_visual::set_link_count(std::size_t link_count) { m_link_count = link_count; } // chain_link_visual::set_link_count() /*----------------------------------------------------------------------------*/ /** * \brief Set max fall parameter. */ void bear::chain_link_visual::set_max_fall(universe::coordinate_type max_fall) { m_max_fall = max_fall; } // chain_link_visual::set_max_fall() /*----------------------------------------------------------------------------*/ /** * \brief Set if link count is dynamically compute. */ void bear::chain_link_visual::set_dynamic_length(bool dynamic_length) { m_dynamic_length = dynamic_length; } // chain_link_visual::set_dynamic_length() /*----------------------------------------------------------------------------*/ /** * \brief Get number of links to display. */ unsigned int bear::chain_link_visual::get_link_count() const { unsigned int result(m_link_count + 2); if ( m_dynamic_length ) { universe::vector_type dir = get_end_position() - get_start_position(); universe::coordinate_type length = dir.length(); const visual::sprite s(get_sprite()); unsigned int size ( (s.clip_rectangle().size().x + s.clip_rectangle().size().y) / 2 ); if ( size == 0 ) result = 2; else result = (unsigned int)length / size + 2; } return result; } // chain_link_visual::get_link_count() plee-the-bear-20251226/bear-engine/lib/src/generic_items/link/code/continuous_link_visual.cpp000066400000000000000000000110251512343254000320760ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::continuous_link_visual class. * \author Julien Jorge */ #include "generic_items/link/continuous_link_visual.hpp" #include "visual/scene_line.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param item The instance loaded by this loader. */ bear::continuous_link_visual::loader::loader( continuous_link_visual& item ) : super("continuous_link_visual"), m_item(item) { } // continuous_link_visual::loader::loader() /*----------------------------------------------------------------------------*/ /** * \brief Creates a copy of this instance. */ bear::continuous_link_visual::loader* bear::continuous_link_visual::loader::clone() const { return new loader( *this ); } // continuous_link_visual::loader::clone() /*----------------------------------------------------------------------------*/ /** * \brief Sets a field of type \c real. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::continuous_link_visual::loader::set_field ( const std::string& name, double value ) { bool result = true; if ( name == "line_width" ) m_item.set_line_width( value ); else result = super::set_field(name, value); return result; } // continuous_link_visual::loader::set_field() BASE_ITEM_EXPORT( continuous_link_visual, bear ) /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ bear::continuous_link_visual::continuous_link_visual() : m_line_width(1) { } // continuous_link_visual::continuous_link_visual() /*----------------------------------------------------------------------------*/ /** * \brief Get the visuals of this item. * \param visuals (out) The visuals. */ void bear::continuous_link_visual::get_visual ( std::list& visuals ) const { visual::sprite s(get_sprite()); if ( s.is_valid() ) visuals.push_front( build_sprite_visual( s ) ); else visuals.push_front( build_line_visual() ); } // continuous_link_visual::get_visual() /*----------------------------------------------------------------------------*/ /** * \brief Sets the width of the line displayed when no sprite has been assigned * to the item. * \param w The width of the line. */ void bear::continuous_link_visual::set_line_width( double w ) { m_line_width = std::max( 0.0, w ); } // continuous_link_visual::set_line_width() /*----------------------------------------------------------------------------*/ /** * \brief Adds the loaders of this item class into a given loader map. * \param m The map in which the loaders are inserted. */ void bear::continuous_link_visual::populate_loader_map ( engine::item_loader_map& m ) { super::populate_loader_map(m); m.insert( loader( *this ) ); } // continuous_link_visual::populate_loader_map() /*----------------------------------------------------------------------------*/ /** * \brief Builds the visual of the link with a given sprite. * \param s The sprite from which we create the visual. */ bear::engine::scene_visual bear::continuous_link_visual::build_sprite_visual( visual::sprite s ) const { const universe::coordinate_type length = get_end_position().distance(get_start_position()); s.set_width(length); universe::position_type pos(get_center_of_mass()); pos.x -= length / 2; pos.y += s.height() / 2; s.set_angle( std::atan2( get_end_position().y - get_start_position().y, get_end_position().x - get_start_position().x ) ); return engine::scene_visual( pos, s, get_z_position() ); } // continuous_link_visual::build_sprite_visual() /*----------------------------------------------------------------------------*/ /** * \brief Builds the visual of the link with a given sprite. * \param s The sprite from which we create the visual. */ bear::engine::scene_visual bear::continuous_link_visual::build_line_visual() const { std::vector p(2); p[0] = get_start_position(); p[1] = get_end_position(); const visual::color_type color( get_rendering_attributes().get_color() ); visual::scene_line line( 0, 0, color, p, m_line_width ); return engine::scene_visual( line, get_z_position() ); } // continuous_link_visual::build_line_visual() plee-the-bear-20251226/bear-engine/lib/src/generic_items/link/code/link_creator.cpp000066400000000000000000000052601512343254000277500ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::link_creator class. * \author Julien Jorge */ #include "generic_items/link/link_creator.hpp" #include "universe/link/link.hpp" #include #include #include "engine/export.hpp" BASE_ITEM_EXPORT( link_creator, bear ) /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ bear::link_creator::link_creator() : m_strength(1), m_minimal_length(0), m_maximal_length (std::numeric_limits::infinity()), m_first_item(NULL), m_second_item(NULL) { } // link_creator::link_creator() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type "real". * \param name The name of the field. * \param value The value of the field. */ bool bear::link_creator::set_real_field ( const std::string& name, double value ) { bool result = true; if ( name == "link_creator.strength" ) m_strength = value; else if ( name == "link_creator.length.minimal" ) m_minimal_length = value; else if ( name == "link_creator.length.maximal" ) m_maximal_length = value; else result = super::set_real_field(name, value); return result; } // link_creator::set_real_field() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type "item". * \param name The name of the field. * \param value The value of the field. */ bool bear::link_creator::set_item_field ( const std::string& name, engine::base_item* value ) { bool result = true; if ( (name == "link_creator.first_item") && (value != NULL) ) m_first_item = value; else if ( (name == "link_creator.second_item") && (value != NULL) ) m_second_item = value; else result = super::set_item_field(name, value); return result; } // link_creator::set_item_field() /*----------------------------------------------------------------------------*/ /** * \brief Tell if all required fields are initialized. */ bool bear::link_creator::is_valid() const { return (m_first_item!=NULL) && (m_second_item!=NULL) && super::is_valid(); } // link_creator::is_valid() /*----------------------------------------------------------------------------*/ /** * \brief Initialize the item. */ void bear::link_creator::build() { new universe::link( *m_first_item, *m_second_item, m_strength, m_minimal_length, m_maximal_length ); kill(); } // link_creator::build() plee-the-bear-20251226/bear-engine/lib/src/generic_items/link/code/link_remover.cpp000066400000000000000000000036751512343254000300000ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::link_remover class. * \author Julien Jorge */ #include "generic_items/link/link_remover.hpp" #include "engine/level_globals.hpp" #include "engine/export.hpp" BASE_ITEM_EXPORT( link_remover, bear ) /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type string. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::link_remover::set_string_field ( const std::string& name, const std::string& value ) { bool ok(true); if (name == "link_remover.sound") { m_sound_name = value; get_level_globals().load_sound(m_sound_name); } else ok = super::set_string_field(name, value); return ok; } // link_remover::set_string_field() /*----------------------------------------------------------------------------*/ /** * \brief Remove the links of a colliding item. * \param that The other item of the collision. * \param info Some informations about the collision. */ void bear::link_remover::collision_remove_links ( engine::base_item& that, universe::collision_info& info ) { that.remove_all_links(); if (!m_sound_name.empty()) get_level_globals().play_sound(m_sound_name); } // link_remover::collision_remove_links() /*----------------------------------------------------------------------------*/ /** * \brief Call collision_remove_links(). * \param that The other item of the collision. * \param info Some informations about the collision. */ void bear::link_remover::collision ( engine::base_item& that, universe::collision_info& info ) { collision_remove_links(that, info); } // link_remover::collision() plee-the-bear-20251226/bear-engine/lib/src/generic_items/link/continuous_link_visual.hpp000066400000000000000000000042311512343254000311720ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A class to display a continuous link between two items. * \author Julien Jorge */ #ifndef __BEAR_CONTINUOUS_LINK_VISUAL_HPP__ #define __BEAR_CONTINUOUS_LINK_VISUAL_HPP__ #include "generic_items/link/base_link_visual.hpp" #include "engine/item_brick/basic_renderable_item.hpp" #include "engine/item_brick/item_with_decoration.hpp" #include "engine/export.hpp" namespace bear { /** * \brief A class to display a continuous link between two items. * \author Julien Jorge */ class GENERIC_ITEMS_EXPORT continuous_link_visual: public engine::item_with_decoration < engine::basic_renderable_item > { DECLARE_BASE_ITEM(continuous_link_visual); public: typedef engine::item_with_decoration < engine::basic_renderable_item > super; private: /** * \brief The item loader for the continuous link visual. */ class loader: public engine::item_loader_base { private: /** \brief The type of the parent class. */ typedef engine::item_loader_base super; public: explicit loader( continuous_link_visual& item ); loader* clone() const; bool set_field( const std::string& name, double value ); private: /** \brief The item loaded by this instance. */ continuous_link_visual& m_item; }; // class loader public: continuous_link_visual(); void get_visual( std::list& visuals ) const; void set_line_width( double w ); protected: void populate_loader_map( engine::item_loader_map& m ); private: bear::engine::scene_visual build_sprite_visual( visual::sprite s ) const; bear::engine::scene_visual build_line_visual() const; private: /** \brief The width of the line displayed when no sprite has been assigned to the item. */ double m_line_width; }; // class continuous_link_visual } // namespace bear #endif // __BEAR_CONTINUOUS_LINK_VISUAL_HPP__ plee-the-bear-20251226/bear-engine/lib/src/generic_items/link/link_creator.hpp000066400000000000000000000041201512343254000270350ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief This class creates a forced movement of type "link", applies * it to itself then die. * \author Julien Jorge */ #ifndef __BEAR_LINK_CREATOR_HPP__ #define __BEAR_LINK_CREATOR_HPP__ #include "engine/base_item.hpp" #include "engine/export.hpp" #include "generic_items/class_export.hpp" namespace bear { /** * \brief This class creates an link between two items then die. * * The fields of this item are * - \a first_item: (item) \b [required] \c the item at the first end of the * link, * - \a second_item: (item) \b [required] \c the item at the second end of * the link, * - \a strength: (real) \c the strength of the elastic (default = 1), * - \a length.minimal: (real) \c the minimal length of the link * (default = 0). * - \a length.maximal: (real) \c the length of the link * (default = inifinity). * * \author Julien Jorge */ class GENERIC_ITEMS_EXPORT link_creator: public engine::base_item { DECLARE_BASE_ITEM(link_creator); public: /** \brief The type of the parent class. */ typedef engine::base_item super; public: link_creator(); bool set_real_field( const std::string& name, double value ); bool set_item_field( const std::string& name, engine::base_item* value ); bool is_valid() const; void build(); private: /** \brief The strength of the elastic. */ double m_strength; /** \brief The minimal length of the elastic. */ universe::coordinate_type m_minimal_length; /** \brief The maximal length of the link. */ universe::coordinate_type m_maximal_length; /** \brief The item at the first end of the elastic. */ engine::base_item* m_first_item; /** \brief The item at the second end of the elastic. */ engine::base_item* m_second_item; }; // class link_creator } // namespace bear #endif // __BEAR_LINK_CREATOR_HPP__ plee-the-bear-20251226/bear-engine/lib/src/generic_items/link/link_remover.hpp000066400000000000000000000032111512343254000270550ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief An item that removes all the links on the colliding items. * \author Julien Jorge */ #ifndef __BEAR_LINK_REMOVER_HPP__ #define __BEAR_LINK_REMOVER_HPP__ #include "engine/item_brick/basic_renderable_item.hpp" #include "engine/item_brick/item_with_decoration.hpp" #include "engine/export.hpp" #include "generic_items/class_export.hpp" namespace bear { /** * \brief An item that removes all the links on the colliding items. * * The parameters accepted by this item are: * - \a sound: \c string The name of a sound to play when cutting the links * (default = none). * * \author Julien Jorge */ class GENERIC_ITEMS_EXPORT link_remover : public engine::item_with_decoration < engine::basic_renderable_item > { DECLARE_BASE_ITEM(link_remover); public: /** \brief The type of the parent class. */ typedef engine::item_with_decoration < engine::basic_renderable_item > super; public: bool set_string_field( const std::string& name, const std::string& value ); protected: void collision_remove_links ( engine::base_item& that, universe::collision_info& info ); private: void collision ( engine::base_item& that, universe::collision_info& info ); private: /** \brief The name of the sound to play. */ std::string m_sound_name; }; // class link_remover } // namespace bear #endif // __BEAR_LINK_REMOVER_HPP__ plee-the-bear-20251226/bear-engine/lib/src/generic_items/mouse_detector.hpp000066400000000000000000000051241512343254000264520ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief An object that activates a toggle according to the mouse. * \author Sebastien Angibaud */ #ifndef __BEAR_MOUSE_DETECTOR_HPP__ #define __BEAR_MOUSE_DETECTOR_HPP__ #include "engine/export.hpp" #include "engine/item_brick/item_with_input_listener.hpp" #include "engine/item_brick/with_toggle.hpp" #include "generic_items/class_export.hpp" #include "universe/derived_item_handle.hpp" namespace bear { /** * \brief An object that activates a toggle according to the mouse. * \author Sebastien Angibaud * */ class GENERIC_ITEMS_EXPORT mouse_detector : public engine::item_with_input_listener< engine::base_item > { DECLARE_BASE_ITEM(mouse_detector); /** \brief The type of the parent class. */ typedef engine::item_with_input_listener < engine::base_item > super; /** \brief The type of an handle on a toggle. */ typedef bear::universe::derived_item_handle handle_type; public: mouse_detector(); void progress( universe::time_type elapsed_time ); bool set_bool_field( const std::string& name, bool value); bool set_item_field ( const std::string& name, bear::engine::base_item* value); protected: bool mouse_released ( input::mouse::mouse_code button, const claw::math::coordinate_2d& pos ); bool check_mouse_position ( input::mouse::mouse_code button, const claw::math::coordinate_2d& pos ); bool finger_action( const input::finger_event& event ); private: void get_dependent_items ( universe::physical_item::item_list& d ) const; void trigger_toggle(); private: /** \brief The toggle to activate. */ handle_type m_toggle; /** \brief Indicates if the toggle must be activated on right press. */ bool m_right_button; /** \brief Indicates if the toggle must be activated on left press. */ bool m_left_button; /** \brief Indicates if the toggle must be activated on middle press. */ bool m_middle_button; /** \brief Indicates if the toggle must be activated on wheel up. */ bool m_wheel_up; /** \brief Indicates if the toggle must be activated on wheel down. */ bool m_wheel_down; /** \brief Indicates if the toggle must be activated on finger events. */ bool m_finger; }; // class mouse_detector } // namespace bear #endif // __BEAR_MOUSE_DETECTOR_HPP__ plee-the-bear-20251226/bear-engine/lib/src/generic_items/mouse_over_manager.hpp000066400000000000000000000052141512343254000273060ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief An object that activates a toggle according to the mouse. * \author Sebastien Angibaud */ #ifndef __BEAR_MOUSE_OVER_MANAGER_HPP__ #define __BEAR_MOUSE_OVER_MANAGER_HPP__ #include "engine/export.hpp" #include "engine/item_brick/item_with_input_listener.hpp" #include "engine/base_item.hpp" #include "generic_items/class_export.hpp" #include "universe/item_handle.hpp" #include "visual/animation.hpp" namespace bear { /** * \brief An object that place an animation under items according to * the mouse. * \author Sebastien Angibaud * */ class GENERIC_ITEMS_EXPORT mouse_over_manager : public engine::item_with_input_listener < engine::base_item > { DECLARE_BASE_ITEM(mouse_over_manager); /** \brief The type of the parent class. */ typedef engine::item_with_input_listener < engine::base_item > super; /** \brief The type of an handle on a base_item. */ typedef bear::universe::item_handle handle_type; /** \brief The type of a pair of a handle and boolean. */ typedef std::pair< handle_type, bool > handle_pair_type; /** \brief A list of handle_type. */ typedef std::list< handle_pair_type > handle_list; public: mouse_over_manager(); ~mouse_over_manager(); void progress( universe::time_type elapsed_time ); bool set_item_list_field ( const std::string& name, const std::vector& value); bool set_animation_field ( const std::string& name, const bear::visual::animation& value ); bool set_sample_field( const std::string& name, audio::sample* value ); private: void get_visual( std::list& visuals ) const; bool mouse_move( const claw::math::coordinate_2d& pos ); void get_dependent_items ( universe::physical_item::item_list& d ) const; void play_sound( handle_type item ); private: /** \brief The item to scan. */ handle_list m_items; /** \brief The position of the mouse. */ bear::universe::position_type m_mouse_position; /** \brief The animation when the mouse in inside. */ bear::visual::animation m_animation_on; /** \brief The animation when the mouse is ouside. */ bear::visual::animation m_animation_off; /** \brief The sample played when the toggle is on. */ audio::sample* m_sample; }; // class mouse_over_manager } // namespace bear #endif // __BEAR_MOUSE_OVER_MANAGER_HPP__ plee-the-bear-20251226/bear-engine/lib/src/generic_items/path_trace.hpp000066400000000000000000000103561512343254000255460ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A path_trace shows the path used by an item. * \author Julien Jorge */ #ifndef __BEAR_PATH_TRACE_HPP__ #define __BEAR_PATH_TRACE_HPP__ #include "engine/base_item.hpp" #include "universe/const_item_handle.hpp" #include "generic_items/class_export.hpp" #include "engine/export.hpp" namespace bear { /** * \brief A path_trace shows the path used by an item. * * A path_trace is a filled polygon made with the previous top and bottom * positions of a given item. * * \author Julien Jorge */ class GENERIC_ITEMS_EXPORT path_trace: public engine::base_item { DECLARE_BASE_ITEM(path_trace); public: /** \brief The type of the parent class. */ typedef engine::base_item super; /** \brief The type of the handle on the traced item. */ typedef universe::const_item_handle handle_type; private: /** \brief A list of positions. */ typedef std::list position_list; /** \brief A list of date. */ typedef std::list date_list; /** \brief The type of a function to use to do the progression of this instance. */ typedef void (path_trace::*progress_function_type) ( universe::time_type elapsed_time ); public: path_trace(); explicit path_trace( const base_item& ref ); void set_fill_color( const visual::color_type& c ); void set_use_horizontal_axis( bool b ); void set_tail_ratio( double r ); void set_item( const base_item& ref ); void set_fade_out_speed( double s ); void set_length( universe::time_type length ); void progress( universe::time_type elapsed_time ); void get_visual( std::list& visuals ) const; virtual void move( universe::time_type elapsed_time ); private: void progress_void( universe::time_type elapsed_time ); void progress_alive( universe::time_type elapsed_time ); void progress_dead( universe::time_type elapsed_time ); void update_length(); std::vector get_polygon ( std::size_t i, universe::position_type first_bottom, universe::position_type second_bottom, universe::position_type first_top, universe::position_type second_top ) const; std::vector get_vertical_polygon ( std::size_t i, universe::position_type first_bottom, universe::position_type second_bottom, universe::position_type first_top, universe::position_type second_top ) const; std::vector get_horizontal_polygon ( std::size_t i, universe::position_type first_bottom, universe::position_type second_bottom, universe::position_type first_top, universe::position_type second_top ) const; void set_auto_axis(); void push_position(); private: /** \brief The function to use to do the progression of this instance. */ progress_function_type m_progress; /** \brief The item we are following. */ handle_type m_item; /** \brief The previous positions of the top of the item. */ position_list m_previous_top; /** \brief The previous positions of the bottom of the item. */ position_list m_previous_bottom; /** \brief The previous date. */ date_list m_previous_date; /** \brief The color of the trace. */ visual::color_type m_fill_color; /** \brief The opacity of the trace. */ double m_opacity; /** \brief The speed of the fade out when the item is dead. */ double m_fade_out_speed; /** \brief The maximal length of the trace in seconds. */ universe::time_type m_maximal_length; /** \brief The current date. */ universe::time_type m_date; /** \brief The ratio the size the of the trace between its end and its head. */ double m_tail_ratio; /** \brief Tells if the trace uses the horizontal axis of the moving item for its computations, instead of the vertical axis. */ bool m_use_horizontal_axis; }; // class path_trace } // namespace bear #endif // __BEAR_PATH_TRACE_HPP__ plee-the-bear-20251226/bear-engine/lib/src/generic_items/path_tracer.hpp000066400000000000000000000043371512343254000257320ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief An item to create a path_trace on the colliding items under a given * condition. * \author Julien Jorge */ #ifndef __BEAR_PATH_TRACER_HPP__ #define __BEAR_PATH_TRACER_HPP__ #include "engine/base_item.hpp" #include "engine/item_brick/item_with_trigger.hpp" #include "generic_items/class_export.hpp" #include "engine/export.hpp" namespace bear { /** * \brief An item to create a path_trace on the colliding items under a given * condition. * * \author Julien Jorge */ class GENERIC_ITEMS_EXPORT path_tracer: public engine::item_with_trigger { DECLARE_BASE_ITEM(path_tracer); public: /** \brief The type of the parent class. */ typedef engine::item_with_trigger super; private: /** \brief The type of the handle on the traced item. */ typedef universe::const_item_handle handle_type; /** \brief A list of handles. */ typedef std::list handle_list_type; public: path_tracer(); bool set_real_field( const std::string& name, double value ); bool set_color_field ( const std::string& name, visual::color value ); void progress( universe::time_type elapsed_time ); void set_fill_color( const visual::color_type& c ); void set_fade_out_speed( double s ); void set_length( universe::time_type length ); private: void on_trigger_on( base_item* activator ); private: /** \brief The color of the trace. */ visual::color_type m_fill_color; /** \brief The speed of the fade out when the item is dead. */ double m_fade_out_speed; /** \brief The maximal length of the trace in seconds. */ universe::time_type m_maximal_length; /** \brief The ratio the size the of the trace between its end and its head. */ double m_tail_ratio; /** \brief Handles on the items for which we already have created a trace. */ handle_list_type m_traces; }; // class path_tracer } // namespace bear #endif // __BEAR_PATH_TRACER_HPP__ plee-the-bear-20251226/bear-engine/lib/src/generic_items/reference_item.hpp000066400000000000000000000015011512343254000264000ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A item used to have reference point. * \author Sebastien Angibaud */ #ifndef __BEAR_REFERENCE_ITEM_HPP__ #define __BEAR_REFERENCE_ITEM_HPP__ #include "engine/base_item.hpp" #include "engine/export.hpp" #include "generic_items/class_export.hpp" namespace bear { /** * \brief A class representing a reference point. * * \author Sebastien Angibaud */ class GENERIC_ITEMS_EXPORT reference_item: public engine::base_item { DECLARE_BASE_ITEM(reference_item); public: reference_item(); }; // class reference_item } // namespace bear #endif // __BEAR_REFERENCE_ITEM_HPP__ plee-the-bear-20251226/bear-engine/lib/src/generic_items/reflecting_decoration.hpp000066400000000000000000000036021512343254000277610ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief An item that refects collised items. * \author Sebastien Angibaud */ #ifndef __BEAR_REFLECTING_DECORATION_HPP__ #define __BEAR_REFLECTING_DECORATION_HPP__ #include "engine/base_item.hpp" #include "engine/item_brick/basic_renderable_item.hpp" #include "generic_items/class_export.hpp" #include "engine/export.hpp" #include "universe/derived_item_handle.hpp" #include namespace bear { /** * \brief An item that refects collised items. * \author Sebastien Angibaud * The fields of this item are * - any field supported by the parent classes. */ class GENERIC_ITEMS_EXPORT reflecting_decoration: public engine::basic_renderable_item { DECLARE_BASE_ITEM(reflecting_decoration); public: /** \brief The type of the parent class. */ typedef engine::basic_renderable_item super; /** \brief The type of the item handle. */ typedef universe::derived_item_handle< engine::base_item> item_handle; /** \brief The type of the list in which we store collised items. */ typedef std::list< item_handle > items_list; /** \brief Compare two base_item on their z_position. */ struct GENERIC_ITEMS_EXPORT z_item_position_compare { bool operator() ( const item_handle& s1, const item_handle& s2 ) const; }; // struct z_item_position_compare public: void progress( bear::universe::time_type elapsed_time ); virtual void get_visual( std::list& visuals ) const; private: /** \brief The list of collised items. */ items_list m_items_list; }; // class reflecting_decoration } // namespace bear #endif // __BEAR_REFLECTING_DECORATION_HPP__ plee-the-bear-20251226/bear-engine/lib/src/generic_items/rocket.hpp000066400000000000000000000110161512343254000247150ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file rocket.hpp * \brief The class describing a rocket. * \author Sebastien Angibaud */ #ifndef __BEAR_rocket_HPP__ #define __BEAR_rocket_HPP__ #include "generic_items/decorative_item.hpp" #include "engine/export.hpp" #include "generic_items/class_export.hpp" namespace bear { /** * \brief The class describing a rocket. * The valid fields for this item are * - any field supported by the parent classes. * * \author Sebastien Angibaud */ class GENERIC_ITEMS_EXPORT rocket : public decorative_item { DECLARE_BASE_ITEM(rocket); public: /** \brief The type of the parent class. */ typedef decorative_item super; public: rocket(); rocket( const rocket& that ); ~rocket(); void on_enters_layer(); void progress( universe::time_type elapsed_time ); void set_force_factor( double min_factor_force, double max_factor_force ); void set_initial_angle( double angle ); void set_angle( double min_angle, double max_angle ); void set_rocket_count( unsigned int min_nb, unsigned int max_nb ); void set_explosion_rocket_count( unsigned int min_nb, unsigned int max_nb ); void set_explosion_date ( universe::time_type min_date, universe::time_type max_date ); void set_trace ( universe::time_type length, const visual::color_type& color, double opacity ); void set_fade_out_speed ( universe::time_type min_s, universe::time_type max_s ); void add_rocket( const rocket& r ); void set_explosion_sound_name( std::string name ); private: void explose(); void create_rocket(double initial_angle); void duplicate_rocket(); void create_trace(); void play_explosion_sound(); void throw_rocket(); template T get_rand(T min, T max) const; private: /** \brief The time since the beginning. */ universe::time_type m_date; /** \brief The minimal initial force factor to apply. */ double m_min_force_factor; /** \brief The maximal initial force factor to apply. */ double m_max_force_factor; /** \brief The initial angle to give. */ double m_initial_angle; /** \brief The minimal initial angle to give. */ double m_min_angle; /** \brief The maximal initial angle to give. */ double m_max_angle; /** \brief The number of current rocket to create at the beginning. */ unsigned int m_nb_rockets; /** \brief The minimal number of current rocket to create at the beginning. */ unsigned int m_min_nb_rockets; /** \brief The maximal number of current rocket to create at the beginning. */ unsigned int m_max_nb_rockets; /** \brief The number of rocket to create when the item exploses. */ unsigned int m_nb_explose_rockets; /** \brief The minimal number of rocket to create when the item exploses. */ unsigned int m_min_nb_explose_rockets; /** \brief The maximal number of rocket to create when the item exploses. */ unsigned int m_max_nb_explose_rockets; /** \brief The date of the explosion. */ universe::time_type m_explosion_date; /** \brief The minimal date of the explosion. */ universe::time_type m_min_explosion_date; /** \brief The maximal date of the explosion. */ universe::time_type m_max_explosion_date; /** \brief The length of the trace. */ universe::time_type m_trace_length; /** \brief The color of the trace. */ visual::color_type m_trace_color; /** \brief The speed of the fade out when the item exploses. */ universe::time_type m_fade_out_speed; /** \brief The minimum speed of the fade when the item explose. */ universe::time_type m_min_fade_out_speed; /** \brief The maximum speed of the fade when the item explose. */ universe::time_type m_max_fade_out_speed; /** \brief The list of rockets that can be created when the item exploses. */ std::vector m_rockets; /** \brief The name of the sound to play when the rocket exploses. */ std::string m_explosion_sound_name; /** \brief The force to give. */ const static bear::universe::force_type s_force; }; // class rocket } // namespace rp #endif // __BEAR_rocket_HPP__ plee-the-bear-20251226/bear-engine/lib/src/generic_items/rolling_credits.hpp000066400000000000000000000064341512343254000266210ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief This items displays rolling credits from a custom file. * \author Julien Jorge */ #ifndef __BEAR_ROLLING_CREDITS_HPP__ #define __BEAR_ROLLING_CREDITS_HPP__ #include "engine/base_item.hpp" #include "visual/font/font.hpp" #include "visual/scene_element.hpp" #include "visual/writing.hpp" #include "generic_items/class_export.hpp" #include "engine/export.hpp" namespace bear { /** * \brief This items displays rolling credits, ie. a list of members of the * software team. This list is taken from a custom file. * * The fields of this class are: * - \a credits (path): [required] the credits to display, * - \a movement_duration (real): the duration in seconds of the movement of * the lines (default = 1), * - \a fading_duration (real): the duration in seconds of the fading effect * when a line appears or disappears (default = movement_duration / 4). * * \author Julien Jorge */ class GENERIC_ITEMS_EXPORT rolling_credits: public engine::base_item { DECLARE_BASE_ITEM(rolling_credits); public: /** \brief The type of the parent class. */ typedef base_item super; private: class credit_line { public: credit_line ( const std::string& text, const visual::font& font, double r, double g, double b, double o, const universe::position_type& pos, universe::size_type width, visual::text_align::horizontal_align a ); const visual::scene_element& create_scene_element() const; const universe::position_type& get_bottom_left() const; void set_bottom_left( const universe::position_type& p ); universe::size_box_type get_size() const; bool is_on() const; void turn_on(); private: visual::writing create_writing ( const std::string& text, const visual::font& font, visual::coordinate_type width, visual::text_align::horizontal_align a ) const; private: /** \brief The visual displayed on the screen. */ visual::scene_element m_visual; /** \brief Tell if the line has to be displayed. */ bool m_is_on; }; // class credit_line public: rolling_credits(); void build(); void progress( universe::time_type elapsed_time ); void get_visual( std::list& visuals ) const; bool set_string_field ( const std::string& name, const std::string& value ); bool set_real_field( const std::string& name, double value ); bool is_valid(); private: /** \brief The path to the credit file. */ std::string m_file; /** \brief The lines displayed on the screen. */ std::list m_lines; /** \brief The total duration of the movement of the lines. */ universe::time_type m_movement_duration; /** \brief The fraction of the movement duration used for the fading effect of the lines. */ universe::time_type m_fading_frac; /** \brief Elapsed time since the beginning of the movement. */ universe::time_type m_elapsed_time; }; // class rolling_credits } // namespace bear #endif // __BEAR_ROLLING_CREDITS_HPP__ plee-the-bear-20251226/bear-engine/lib/src/generic_items/script/000077500000000000000000000000001512343254000242225ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/lib/src/generic_items/script/add_script_actor.hpp000066400000000000000000000034711512343254000302440ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief An item that add an actor at a script director. * \author Sebastien Angibaud */ #ifndef __BEAR_ADD_SCRIPT_ACTOR_HPP__ #define __BEAR_ADD_SCRIPT_ACTOR_HPP__ #include "engine/base_item.hpp" #include "universe/derived_item_handle.hpp" #include "generic_items/script/script_director.hpp" #include "generic_items/class_export.hpp" #include "engine/export.hpp" namespace bear { /** * \brief An item that add an actor at a script director. * \author Sebastien Angibaud * * The custom fields of this class are: * - \a script_director (reference_item) [required], the script director, * - \a actor (reference_item) [required], the new actor, * - \a actor_name (string) [required], the name of the actor, * - any field supported by the parent class. */ class GENERIC_ITEMS_EXPORT add_script_actor: public engine::base_item { DECLARE_BASE_ITEM(add_script_actor); public: /** \brief The type of the parent class. */ typedef engine::base_item super; private: /** \brief The type of handle on actor. */ typedef universe::derived_item_handle handle_type; public: add_script_actor(); void set_actor(script_director& director); bool set_item_field( const std::string& name, base_item* value ); bool set_string_field( const std::string& name, const std::string& value ); bool is_valid() const; private: /** \brief The new actor. */ handle_type m_actor; /** \brief The name of the actor. */ std::string m_actor_name; }; // class add_script_actor } // namespace bear #endif // __BEAR_ADD_SCRIPT_ACTOR_HPP__ plee-the-bear-20251226/bear-engine/lib/src/generic_items/script/code/000077500000000000000000000000001512343254000251345ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/lib/src/generic_items/script/code/add_script_actor.cpp000066400000000000000000000047461512343254000311570ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::add_script_actor class. * \author Sebastien Angibaud */ #include "generic_items/script/add_script_actor.hpp" BASE_ITEM_EXPORT( add_script_actor, bear ) /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ bear::add_script_actor::add_script_actor() : m_actor(NULL) { set_phantom(true); set_can_move_items(false); set_artificial(true); } // add_script_actor::add_script_actor() /*----------------------------------------------------------------------------*/ /** * \brief Give the actor at the script director. * \param director The script director. */ void bear::add_script_actor::set_actor(script_director& director) { if ( m_actor != (base_item*)NULL ) director.set_actor_item(m_actor_name, m_actor.get()); } // add_script_actor::set_actor() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type \c base_item. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::add_script_actor::set_item_field ( const std::string& name, base_item* value ) { bool ok = true; if (name == "add_script_actor.actor") m_actor = value; else ok = super::set_item_field(name, value); return ok; } // add_script_actor::set_item_field() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type \c . * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::add_script_actor::set_string_field ( const std::string& name, const std::string& value ) { bool ok = true; if (name == "add_script_actor.actor_name") m_actor_name = value; else ok = super::set_string_field(name, value); return ok; } // add_script_actor::set_string_field() /*----------------------------------------------------------------------------*/ /** * \brief Tell if the item is correctly initialized. */ bool bear::add_script_actor::is_valid() const { return ( m_actor != (base_item*)NULL ) && !m_actor_name.empty() && super::is_valid(); } // add_script_actor::is_valid() plee-the-bear-20251226/bear-engine/lib/src/generic_items/script/code/script_director.cpp000066400000000000000000000155651512343254000310530ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::script_director class. * \author Julien Jorge */ #include "generic_items/script/script_director.hpp" #include "generic_items/script/add_script_actor.hpp" BASE_ITEM_EXPORT( script_director, bear ) /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ bear::script_director::script_director() : m_time_scale_toggle(NULL), m_time_scale(NULL), m_can_be_accelerated(false), m_scale(2) { set_global(true); set_phantom(true); set_can_move_items(false); set_artificial(true); } // script_director::script_director() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type \c . * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::script_director::set_string_field ( const std::string& name, const std::string& value ) { bool ok = true; if (name == "script_director.script") { claw::logger << claw::log_verbose << "Loading script '" << value << '\'' << std::endl; ok = load_script(value); } else ok = super::set_string_field(name, value); return ok; } // script_director::set_string_field() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type \c list of item. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::script_director::set_item_list_field ( const std::string& name, const std::vector& value ) { bool ok = true; if (name == "script_director.actors") { m_actors.resize(value.size()); for ( std::size_t i=0; i!=value.size(); ++i ) m_actors[i] = value[i]; } else ok = super::set_item_list_field(name, value); return ok; } // script_director::set_item_list_field() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type "real". * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::script_director::set_real_field ( const std::string& name, double value ) { bool result(true); if ( name == "script_director.scale" ) m_scale = value; else result = super::set_real_field( name, value ); return result; } // script_director::set_real_field() /*----------------------------------------------------------------------------*/ /** * \brief Set a field of type "boolean". * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::script_director::set_bool_field ( const std::string& name, bool value ) { bool result(true); if ( name == "script_director.can_be_accelerated" ) m_can_be_accelerated = value; else result = super::set_bool_field( name, value ); return result; } // script_director::set_bool_field() /*----------------------------------------------------------------------------*/ /** * \brief Get the items concerned by a progress/move of this one. * \param d (out) A list to which are added such items. */ void bear::script_director::get_dependent_items ( universe::physical_item::item_list& d ) const { engine::script_context::actor_item_map_const_iterator_type it; for ( it = get_context().get_actors_item_begin(); it != get_context().get_actors_item_end(); ++it ) if ( it->second != (base_item*)NULL ) d.push_back( it->second.get_item() ); } // script_director::get_dependent_items() /*----------------------------------------------------------------------------*/ /** * \brief Extra processing by subclasses at the beginning of the script. */ void bear::script_director::on_script_started() { script_runner::on_script_started(); remove_time_scale_items(); if ( m_can_be_accelerated ) create_time_scale_items(); } // script_director::on_script_started() /*----------------------------------------------------------------------------*/ /** * \brief Extra processing by subclasses at the end of the script. */ void bear::script_director::on_script_stopped() { script_runner::on_script_stopped(); remove_time_scale_items(); } // script_director::on_script_stopped() /*----------------------------------------------------------------------------*/ /** * \brief Turn the item on. * \param activator The item that activates this item. */ void bear::script_director::on_toggle_on(engine::base_item *activator) { reset(); for ( std::size_t i=0; i!=m_actors.size(); ++i ) if ( m_actors[i] != (add_script_actor*)NULL ) m_actors[i]->set_actor(*this); } // script_director::on_toggle_on() /*----------------------------------------------------------------------------*/ /** * \brief Continue the progression of the item, while active. * \param elapsed_time Elapsed time since the last call. */ void bear::script_director::progress_on(universe::time_type elapsed_time) { play(elapsed_time); } // script_director::progress_on() /*----------------------------------------------------------------------------*/ /** * \brief Create items to allow time acceleration. */ void bear::script_director::create_time_scale_items() { time_scale* item1 = new time_scale; item1->set_global(true); item1->set_center_of_mass(get_center_of_mass()); item1->set_scale(m_scale); new_item( *item1 ); CLAW_ASSERT ( item1->is_valid(), "The time_scale created by bear::script_director isn't correctly " "initialized" ); m_time_scale = universe::derived_item_handle< time_scale >(item1); time_scale_on_input_toggle* item2 = new time_scale_on_input_toggle; item2->set_global(true); item2->set_center_of_mass(get_center_of_mass()); item2->set_time_scale_item(item1); new_item( *item2 ); CLAW_ASSERT ( item2->is_valid(), "The time_scale_on_input_toggle created by bear::script_director isn't " "correctly initialized" ); m_time_scale_toggle = universe::derived_item_handle< time_scale_on_input_toggle >(item2); item2->toggle(this); } // script_director::create_time_scale_items() /*----------------------------------------------------------------------------*/ /** * \brief Remove items that enables time acceleration. */ void bear::script_director::remove_time_scale_items() { if ( m_time_scale.get() != NULL ) m_time_scale->kill(); m_time_scale = NULL; if ( m_time_scale_toggle.get() != NULL ) m_time_scale_toggle->kill(); m_time_scale_toggle = NULL; } // script_director::remove_time_scale_items() plee-the-bear-20251226/bear-engine/lib/src/generic_items/script/script_director.hpp000066400000000000000000000054561512343254000301440ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief An item that plays a script. * \author Julien Jorge */ #ifndef __BEAR_SCRIPT_DIRECTOR_HPP__ #define __BEAR_SCRIPT_DIRECTOR_HPP__ #include "engine/base_item.hpp" #include "engine/item_brick/item_with_toggle.hpp" #include "engine/script/script_runner.hpp" #include "generic_items/time_scale_on_input_toggle.hpp" #include "generic_items/time_scale.hpp" #include "generic_items/class_export.hpp" #include "engine/export.hpp" namespace bear { class add_script_actor; /** * \brief An item that plays a script. * \author Julien Jorge * * The custom fields of this class are: * - \a script (string) [required], the script to play, * - \a scale: real, the time scale when the script is accelerated * (default = 2), * - \a can_be_accelerated: boolean, indicates if the script can be * accelerated (default = false), * - any field supported by the parent class. */ class GENERIC_ITEMS_EXPORT script_director: public engine::item_with_toggle, public engine::script_runner { DECLARE_BASE_ITEM(script_director); public: /** \brief The type of the parent class. */ typedef engine::item_with_toggle super; private: /** \brief The type of the handles on the items to kill. */ typedef universe::derived_item_handle handle_type; public: script_director(); bool set_string_field( const std::string& name, const std::string& value ); bool set_item_list_field ( const std::string& name, const std::vector& value ); bool set_real_field( const std::string& name, double value ); bool set_bool_field( const std::string& name, bool value ); void get_dependent_items( universe::physical_item::item_list& d ) const; protected: void on_script_started(); void on_script_stopped(); private: void on_toggle_on(engine::base_item *activator); void progress_on(universe::time_type elapsed_time); void create_time_scale_items(); void remove_time_scale_items(); private: /** \brief The list of items that add an actor. */ std::vector m_actors; /** \brief Toggle that checks input. */ universe::derived_item_handle m_time_scale_toggle; /** \brief Item that increases time scale. */ universe::derived_item_handle m_time_scale; /** \brief Indicates if time can be accelerated. */ bool m_can_be_accelerated; /** \brief The scale of the time. */ double m_scale; }; // class script_director } // namespace bear #endif // __BEAR_SCRIPT_DIRECTOR_HPP__ plee-the-bear-20251226/bear-engine/lib/src/generic_items/shader/000077500000000000000000000000001512343254000241645ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/lib/src/generic_items/shader/code/000077500000000000000000000000001512343254000250765ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/lib/src/generic_items/shader/code/layer_shader.cpp000066400000000000000000000166301512343254000302520ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::layer_shader class. * \author Julien Jorge */ #include "generic_items/shader/layer_shader.hpp" #include "engine/item_brick/loader/single_tweener_loader.hpp" #include "engine/level.hpp" #include "engine/level_globals.hpp" #include "engine/layer/layer.hpp" #include "engine/export.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param item The instance loaded by this loaded. */ bear::layer_shader::loader::loader( layer_shader& item ) : super("layer_shader"), m_item(item) { } // layer_shader::loader::loader() /*----------------------------------------------------------------------------*/ /** * \brief Creates a copy of this instance. */ bear::layer_shader::loader* bear::layer_shader::loader::clone() const { return new loader( *this ); } // layer_shader::loader::clone() /*----------------------------------------------------------------------------*/ /** * \brief Sets a field of type \c string. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::layer_shader::loader::set_field ( const std::string& name, const std::string& value ) { bool result = true; if ( name == "shader" ) m_item.set_shader_file( value ); else result = super::set_field(name, value); return result; } // layer_shader::loader::set_field() /*----------------------------------------------------------------------------*/ /** * \brief Sets a field of type \c real. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::layer_shader::loader::set_field ( const std::string& name, double value ) { bool result = true; if ( name == "kill_delay" ) m_item.set_kill_delay( value ); else result = super::set_field(name, value); return result; } // layer_shader::loader::set_field() /*----------------------------------------------------------------------------*/ /** * \brief Sets a field of type \c list of item. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::layer_shader::loader::set_field ( const std::string& name, const std::vector& value ) { bool result = true; if ( name == "variables" ) for ( std::size_t i(0); i != value.size(); ++i ) { const shader_variable* v( dynamic_cast( value[i] ) ); if ( v == NULL ) claw::logger << claw::log_warning << "Item is not a shader_variable." << std::endl; else m_item.add_variable( *v ); } else result = super::set_field(name, value); return result; } // layer_shader::loader::set_field() /*----------------------------------------------------------------------------*/ /** * \brief Sets a field of type \c list of string. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::layer_shader::loader::set_field ( const std::string& name, const std::vector& value ) { bool result = true; if ( name == "layer_tags" ) for ( std::size_t i(0); i != value.size(); ++i ) m_item.add_layer_tag( value[i] ); else result = super::set_field(name, value); return result; } // layer_shader::loader::set_field() BASE_ITEM_EXPORT( layer_shader, bear ) /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ bear::layer_shader::layer_shader() : m_kill_delay( std::numeric_limits::infinity() ) { set_phantom(true); set_can_move_items(false); set_artificial(true); set_global(true); } // layer_shader::layer_shader() /*----------------------------------------------------------------------------*/ /** * \brief Copy constructor. * \param that The instance to copy from. */ bear::layer_shader::layer_shader( const layer_shader& that ) : super( that ), m_shader( that.m_shader ), m_kill_delay( that.m_kill_delay ), m_layer_tags( that.m_layer_tags ) { for ( std::size_t i(0); i != that.m_variables.size(); ++i ) if ( that.m_variables[i] != (shader_variable_pointer)NULL ) add_variable( *that.m_variables[i] ); } // layer_shader::layer_shader() /*---------------------------------------------------------------------------*/ /** * \brief Does one iteration in the progression of the item. * \param elapsed_time The elapsed time since the last call. */ void bear::layer_shader::progress( universe::time_type elapsed_time ) { super::progress(elapsed_time); if ( get_age() >= m_kill_delay ) kill(); else { for ( std::size_t i(0); i != m_variables.size(); ++i ) if ( m_variables[i] != (shader_variable_pointer)NULL ) m_shader.set_variable ( m_variables[i]->get_name(), (float)m_variables[i]->get_value() ); if ( m_layer_tags.empty() ) get_layer().set_shader( m_shader ); else for ( engine::level::layer_iterator it( get_level().layer_begin() ); it != get_level().layer_end(); ++it ) { const bool apply_shader ( std::find ( m_layer_tags.begin(), m_layer_tags.end(), it->get_tag() ) != m_layer_tags.end() ); if ( apply_shader ) it->set_shader( m_shader ); } } } // layer_shader::progress() /*---------------------------------------------------------------------------*/ /** * \brief Sets the delay after which the item must kill itself. * \param t The delay. */ void bear::layer_shader::set_kill_delay( universe::time_type t ) { m_kill_delay = t; } // layer_shader::set_kill_delay() /*----------------------------------------------------------------------------*/ /** * \brief Sets the shader file to pass to the layer. * \param n The path to the shader file. */ void bear::layer_shader::set_shader_file( std::string n ) { m_shader = get_level_globals().get_shader( n ); } // layer_shader::set_shader_file() /*----------------------------------------------------------------------------*/ /** * \brief Adds an item to compute the values of the variables in the shader. * \param v The variable to add. */ void bear::layer_shader::add_variable( const shader_variable& v ) { m_variables.push_back( v.clone() ); } // layer_shader::add_variable() /*----------------------------------------------------------------------------*/ /** * \brief Adds the tag of the layers to which the shader must be applied. * \param tag The tag to add. */ void bear::layer_shader::add_layer_tag( std::string tag ) { m_layer_tags.push_back( tag ); } // layer_shader::add_layer_tag() /*----------------------------------------------------------------------------*/ /** * \brief Adds the loaders of this item class into a given loader map. * \param m The map in which the loaders are inserted. */ void bear::layer_shader::populate_loader_map( engine::item_loader_map& m ) { super::populate_loader_map(m); m.insert( loader( *this ) ); } // layer_shader::populate_loader_map() plee-the-bear-20251226/bear-engine/lib/src/generic_items/shader/code/shader_variable.cpp000066400000000000000000000074421512343254000307240ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::shader_variable class. * \author Julien Jorge */ #include "generic_items/shader/shader_variable.hpp" #include "engine/item_brick/loader/single_tweener_loader.hpp" #include "engine/export.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param item The instance loaded by this loaded. */ bear::shader_variable::loader::loader( shader_variable& item ) : super("shader_variable"), m_item(item) { } // shader_variable::loader::loader() /*----------------------------------------------------------------------------*/ /** * \brief Creates a copy of this instance. */ bear::shader_variable::loader* bear::shader_variable::loader::clone() const { return new loader( *this ); } // shader_variable::loader::clone() /*----------------------------------------------------------------------------*/ /** * \brief Sets a field of type \c string. * \param name The name of the field. * \param value The new value of the field. * \return false if the field "name" is unknow, true otherwise. */ bool bear::shader_variable::loader::set_field ( const std::string& name, const std::string& value ) { bool result = true; if ( name == "name" ) m_item.set_name( value ); else result = super::set_field(name, value); return result; } // shader_variable::loader::set_field() BASE_ITEM_EXPORT( shader_variable, bear ) /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ bear::shader_variable::shader_variable() { set_phantom(true); set_can_move_items(false); set_artificial(true); } // shader_variable::shader_variable() /*---------------------------------------------------------------------------*/ /** * \brief Does one iteration in the progression of the item. * \param elapsed_time The elapsed time since the last call. */ void bear::shader_variable::progress( universe::time_type elapsed_time ) { super::progress(elapsed_time); m_tweener.update( elapsed_time ); } // shader_variable::progress() /*---------------------------------------------------------------------------*/ /** * \brief Gets the name of the variable. */ std::string bear::shader_variable::get_name() const { return m_name; } // shader_variable::get_name() /*----------------------------------------------------------------------------*/ /** * \brief Sets the name of this variable. * \param n The new name. */ void bear::shader_variable::set_name( std::string n ) { m_name = n; } // shader_variable::set_name() /*----------------------------------------------------------------------------*/ /** * \brief Sets the tweener used to compute the value of this variable. * \param t The tweener. */ void bear::shader_variable::set_tweener( claw::tween::single_tweener t ) { m_tweener = t; } // shader_variable::set_tweener() /*----------------------------------------------------------------------------*/ /** * \brief Gets the current value of the variable. */ double bear::shader_variable::get_value() const { return m_tweener.get_value(); } // shader_variable::get_value() /*----------------------------------------------------------------------------*/ /** * \brief Adds the loaders of this item class into a given loader map. * \param m The map in which the loaders are inserted. */ void bear::shader_variable::populate_loader_map( engine::item_loader_map& m ) { super::populate_loader_map(m); m.insert ( engine::single_tweener_loader( "shader_variable.tweener", m_tweener ) ); m.insert( loader( *this ) ); } // shader_variable::populate_loader_map() plee-the-bear-20251226/bear-engine/lib/src/generic_items/shader/layer_shader.hpp000066400000000000000000000066021512343254000273430ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief An item that sets the shader applied to the items of its layer. * \author Julien Jorge */ #ifndef __BEAR_LAYER_SHADER_HPP__ #define __BEAR_LAYER_SHADER_HPP__ #include "engine/base_item.hpp" #include "generic_items/shader/shader_variable.hpp" #include "visual/shader_program.hpp" #include "generic_items/class_export.hpp" namespace bear { /** * \brief An item that sets the shader applied to the items of its layer. * * The fields of this item are * - \a shader: (string) \c The shader file, * - \a variables: (list of shader_variable) \c The items that compute the * values of the variables in the shader. (default = none:in_out), * - \a layers: (list of string) \c The tags of the layers to which the * shader must be applied (default is to apply to the layer containing the * item), * - \a kill_delay: (real) Tells the item to kill itself after this number of * seconds (default = infinity), * - \a duration: (real) The duration of the tweener, in seconds * (default = 1). * * \author Julien Jorge */ class GENERIC_ITEMS_EXPORT layer_shader: public engine::base_item { DECLARE_BASE_ITEM(layer_shader); private: /** \brief The type of the parent class. */ typedef engine::base_item super; /** \brief The type of the pointers on the variables of the shader. */ typedef universe::derived_item_handle shader_variable_pointer; private: /** * \brief The item loader for the layer shader. */ class loader: public engine::item_loader_base { private: /** \brief The type of the parent class. */ typedef engine::item_loader_base super; public: explicit loader( layer_shader& item ); loader* clone() const; bool set_field( const std::string& name, const std::string& value ); bool set_field( const std::string& name, double value ); bool set_field ( const std::string& name, const std::vector& value ); bool set_field ( const std::string& name, const std::vector& value ); private: /** \brief The instance loaded by this loader. */ layer_shader& m_item; }; // class loader public: layer_shader(); layer_shader( const layer_shader& that ); void progress( universe::time_type elapsed_time ); void set_kill_delay( universe::time_type t ); void set_shader_file( std::string n ); void add_variable( const shader_variable& v ); void add_layer_tag( std::string tag ); protected: void populate_loader_map( engine::item_loader_map& m ); private: /** \brief The shader to pass to the layer. */ visual::shader_program m_shader; /** \brief The delay after which the item must kill itself. */ universe::time_type m_kill_delay; /** \brief The items that compute the values of the variables in the shader. */ std::vector m_variables; /** \brief The tags of the layers to which the shader must be applied. */ std::vector m_layer_tags; }; // class layer_shader } // namespace bear #endif // __BEAR_LAYER_SHADER_HPP__ plee-the-bear-20251226/bear-engine/lib/src/generic_items/shader/shader_variable.hpp000066400000000000000000000046621512343254000300200ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A variable in a shader program and how its value is updated. * \author Julien Jorge */ #ifndef __BEAR_SHADER_VARIABLE_HPP__ #define __BEAR_SHADER_VARIABLE_HPP__ #include "engine/base_item.hpp" #include "generic_items/class_export.hpp" #include "engine/export.hpp" namespace bear { /** * \brief A variable in a shader program and how its value is updated. * * The fields of this item are * - \a name: (string) \c The name of the variable, * - \a tweener.easing: (easing_function) \c The easing function applied to * vary the value of the variable (default = none:in_out), * - \a origin: (real) The initial value of the variable (default = 0), * - \a target: (real) The final value of the variable (default = 1), * - \a duration: (real) The duration of the tweener, in seconds * (default = 1). * * \author Julien Jorge */ class GENERIC_ITEMS_EXPORT shader_variable: public engine::base_item { DECLARE_BASE_ITEM(shader_variable); /** \brief The type of the parent class. */ typedef engine::base_item super; private: /** * \brief The item loader for the shader variable. */ class loader: public engine::item_loader_base { private: /** \brief The type of the parent class. */ typedef engine::item_loader_base super; public: explicit loader( shader_variable& item ); loader* clone() const; bool set_field( const std::string& name, const std::string& value ); private: /** \brief The instance loaded by this loader. */ shader_variable& m_item; }; // class loader public: shader_variable(); void progress( universe::time_type elapsed_time ); std::string get_name() const; void set_name( std::string n ); void set_tweener( claw::tween::single_tweener t ); double get_value() const; protected: void populate_loader_map( engine::item_loader_map& m ); private: /** \brief The name of the variable. */ std::string m_name; /** \brief The tweener applied to change the value of the variable. */ claw::tween::single_tweener m_tweener; }; // class shader_variable } // namespace bear #endif // __BEAR_SHADER_VARIABLE_HPP__ plee-the-bear-20251226/bear-engine/lib/src/generic_items/slope.hpp000066400000000000000000000115661512343254000245620ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A ground that is not horizontal. * \author Julien Jorge */ #ifndef __BEAR_SLOPE_HPP__ #define __BEAR_SLOPE_HPP__ #include "generic_items/base_ground.hpp" #include "generic_items/class_export.hpp" #include "universe/shape/curved_box.hpp" #include "engine/export.hpp" #include namespace bear { /** * \brief A ground that is not horizontal. * * The parameters accepted by this item are: * - \a steepness [required]: \c real The difference beween the Y-coordinate * of the slope's right and left edges, * - \a control_point.left.x: \c real The X-coordinate of the left control * point. * - \a control_point.left.y: \c real The Y-coordinate of the left control * point. * - \a control_point.right.x: \c real The X-coordinate of the right control * point. * - \a control_point.right.y: \c real The Y-coordinate of the right control * point. * - \a margin: \c real An extra margin above the slope (default = 0), * - \a tangent_friction: \c real The friction applied to the items on the * slope (default = 0.8), * - \a opposite_side_is_active: \c boolean Turn on/off the alignement on the * side opposite to the slope (default = false), * - \a left_side_is_active: \c boolean Turn on/off the alignement on the * left side (default = false), * - \a right_side_is_active: \c boolean Turn on/off the alignement on the * right side (default = false), * - \a apply_angle: \c boolean Tell if the angle of the slope is applied to * the colliding items (default = true), * - any field supported by the parent class. * * \author Julien Jorge */ class GENERIC_ITEMS_EXPORT slope: public base_ground { DECLARE_BASE_ITEM(slope); public: /** \brief The type of the parent class. */ typedef base_ground super; /** \brief The type of the line describing the surface of the slope. */ typedef claw::math::line_2d line_type; /** \brief The type of the curve describing the surface of the slope. */ typedef claw::math::curve curve_type; private: /** * \brief Loads the fields of a slope. */ class loader: public engine::item_loader_base { private: /** \brief The type of the parent class. */ typedef engine::item_loader_base super; public: explicit loader( slope& item ); loader* clone() const; bool set_field( const std::string& name, double value ); bool set_field( const std::string& name, bool value ); private: /** \brief The item loaded by this instance. */ slope& m_item; }; // class loader friend class loader; public: slope(); void build(); curve_type get_curve() const; universe::coordinate_type get_steepness() const; void set_steepness( universe::coordinate_type s ); universe::coordinate_type get_y_at_x( universe::coordinate_type x ) const; protected: void populate_loader_map( engine::item_loader_map& m ); void collision_as_slope ( engine::base_item& that, universe::collision_info& info ); private: void collision ( engine::base_item& that, universe::collision_info& info ); bool check_left_contact_as_slope ( engine::base_item& that, universe::collision_info& info ) const; bool check_right_contact_as_slope ( engine::base_item& that, universe::collision_info& info ) const; bool check_bottom_above_ground ( engine::base_item& that, universe::collision_info& info ) const; bool align_on_ground ( engine::base_item& that, universe::collision_info& info ); bool align_nearest_edge ( engine::base_item& that, universe::collision_info& info ); bool item_crossed_up_down ( engine::base_item& that, const universe::collision_info& info ) const; void apply_angle_to ( engine::base_item& that, const universe::collision_info& info ) const; universe::curved_box* get_curved_box() const; private: /** \brief The coefficient for tangent friction. */ double m_tangent_friction; /** \brief The side opposite to the slope, is it active ? */ bool m_opposite_side_is_active; /** \brief Tell if the left side of the block is active. */ bool m_left_side_is_active; /** \brief Tell if the right side of the block is active. */ bool m_right_side_is_active; /** \brief Tell if the angle of the slope is applied to the colliding items. */ bool m_apply_angle; /** \brief The width of the surface of the slope. */ static const universe::coordinate_type s_line_width; }; // class slope } // namespace bear #endif // __BEAR_SLOPE_HPP__ plee-the-bear-20251226/bear-engine/lib/src/generic_items/spring.hpp000066400000000000000000000043141512343254000247330ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A spring gives a force to the items colliding with him. * \author Julien Jorge */ #ifndef __BEAR_SPRING_HPP__ #define __BEAR_SPRING_HPP__ #include "engine/base_item.hpp" #include "engine/item_brick/basic_renderable_item.hpp" #include "engine/item_brick/item_with_decoration.hpp" #include "engine/item_brick/activable_sides.hpp" #include "generic_items/class_export.hpp" #include "engine/export.hpp" namespace bear { /** * \brief A spring gives a force to the items colliding with him. * * The valid fields for this item are * - \a applied_force_x: (real) the force applied on the x-axis * (default = 0), * - \a applied_force_y: (real) the force applied on the y-axis * (default = 0), * - any field supported by the parent classes. * * When the spring is not active, the last frame of the animation is * displayed. * * \author Julien Jorge */ class GENERIC_ITEMS_EXPORT spring: public engine::item_with_decoration < engine::basic_renderable_item >, public engine::activable_sides { DECLARE_BASE_ITEM(spring); public: /** \brief The type of the parent class. */ typedef engine::item_with_decoration < engine::basic_renderable_item > super; public: spring(); ~spring(); bool set_real_field( const std::string& name, double value ); void build(); void set_bounce_sound( audio::sample* s ); protected: void populate_loader_map( engine::item_loader_map& m ); void collision_check_and_bounce ( engine::base_item& that, universe::collision_info& info ); private: void collision ( engine::base_item& that, universe::collision_info& info ); void play_sound() const; private: /** \brief The force applied to the item. */ universe::force_type m_applied_force; /** \brief The sound played when an item bounces on the spring. */ audio::sample* m_sample; }; // class spring } // namespace bear #endif // __BEAR_SPRING_HPP__ plee-the-bear-20251226/bear-engine/lib/src/generic_items/star.hpp000066400000000000000000000054331512343254000244050ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A class to display a star. * \author Julien Jorge */ #ifndef __BEAR_STAR_HPP__ #define __BEAR_STAR_HPP__ #include "engine/base_item.hpp" #include "engine/item_brick/basic_renderable_item.hpp" #include "visual/star.hpp" #include "engine/export.hpp" #include "generic_items/class_export.hpp" namespace bear { /** * \brief A class to display a star. * * The custom fields of this class are: * - branches (unsigned int): the number of branches in the star * (default = 5), * - ratio (real): the ratio of the inner vertices relatively to the outer * ones (default = 0.5), * - border_width (real): the width of the border of the star (default = 1), * - border_color.red (real): the red component of the color of the border * (default = 0), * - border_color.green (real): the green component of the color of the border * (default = 0), * - border_color.blue (real): the blue component of the color of the border * - border_color.opacity (real): the opacity of the border (default = 1), * - fill_color.red (real): the red component of the color of the inside * (default = 0), * - fill_color.green (real): the green component of the color of the inside * (default = 0), * - fill_color.blue (real): the blue component of the color of the inside * - fill_color.opacity (real): the opacity of the inside (default = 1), * - any field supported by the parent class. * * \author Julien Jorge */ class GENERIC_ITEMS_EXPORT star: public engine::basic_renderable_item { DECLARE_BASE_ITEM(star); public: /** \brief The type of the parent class. */ typedef engine::basic_renderable_item super; public: star(); star ( std::size_t branches, double ratio, const visual::color_type& color, double border_width = 1, const visual::color_type& fill_color = claw::graphic::transparent_pixel ); void on_enters_layer(); bool set_u_integer_field( const std::string& name, unsigned int value ); bool set_real_field( const std::string& name, double value ); void get_visual( std::list& visuals ) const; void set_ratio( double r ); private: /** \brief The star to display. */ visual::star m_star; /** \brief The color of the inside. */ visual::color_type m_fill_color; /** \brief The color of the border. */ visual::color_type m_border_color; /** \brief The width of the border. */ double m_border_width; }; // class star } // namespace bear #endif // __BEAR_STAR_HPP__ plee-the-bear-20251226/bear-engine/lib/src/generic_items/straight_slope.hpp000066400000000000000000000062071512343254000264630ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A piece of ground intended to be used next some slopes. * \author Julien Jorge */ #ifndef __BEAR_STRAIGHT_SLOPE_HPP__ #define __BEAR_STRAIGHT_SLOPE_HPP__ #include "generic_items/base_ground.hpp" #include "generic_items/class_export.hpp" namespace bear { /** * \brief A piece of ground intended to be used next some slopes. * * This items works like a slope. That is, the other item is aligned only if * the X-coordinate of his center of mass is in the range covered by the * current item. * * The parameters accepted by this item are: * - \a margin: \c real The tolerance between the position of the other * item and the current item for alignments. Positive value means that the * margin is inside the block (default = 10), * - \a friction: real, the friction applied to the items in contact * (default = 1), * - \a top_side_is_solid: bool, tell if the top side is solid * (default = true), * - \a bottom_side_is_solid: bool, tell if the bottom side is solid * (default = true). * * \author Julien Jorge */ class GENERIC_ITEMS_EXPORT straight_slope : public base_ground { DECLARE_BASE_ITEM(straight_slope); public: /** \brief The type of the parent class. */ typedef base_ground super; private: /** \brief The result of a collision. */ struct collision_result { collision_result(); explicit collision_result( bool a, double f = 1 ); /** \brief Tell if the other item has been aligned. */ bool align; /** \brief The friction of the side in contact with the item. */ double friction; }; // struct collision_result public: straight_slope(); bool set_bool_field( const std::string& name, bool value ); bool set_real_field( const std::string& name, double value ); void build(); protected: void collision_check_center_included ( engine::base_item& that, universe::collision_info& info ); private: collision_result collision_classic_ground ( engine::base_item& that, universe::collision_info& info ); collision_result collision_classic_ceiling ( engine::base_item& that, universe::collision_info& info ); collision_result collision_slope_ground ( engine::base_item& that, universe::collision_info& info ); collision_result collision_slope_ceiling ( engine::base_item& that, universe::collision_info& info ); void collision ( engine::base_item& that, universe::collision_info& info ); private: /** \brief The tolerance of the distance between the position of the other item and the edge of the collision, to apply the alignment. */ universe::coordinate_type m_margin; /** \brief Tell if the top side is active. */ bool m_top_side_is_active; /** \brief Tell if the bottom side is active. */ bool m_bottom_side_is_active; }; // class straight_slope } // namespace bear #endif // __BEAR_STRAIGHT_SLOPE_HPP__ plee-the-bear-20251226/bear-engine/lib/src/generic_items/system/000077500000000000000000000000001512343254000242425ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/lib/src/generic_items/system/code/000077500000000000000000000000001512343254000251545ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/lib/src/generic_items/system/code/system_fullscreen_toggle.cpp000066400000000000000000000042651512343254000327760ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::system_fullscreen_toggle class. * \author Julien Jorge */ #include "generic_items/system/system_fullscreen_toggle.hpp" #include "engine/game.hpp" BASE_ITEM_EXPORT( system_fullscreen_toggle, bear ) /*----------------------------------------------------------------------------*/ /** * \brief Update the state of the item. * \param elapsed_time The elapsed time since the last call. */ void bear::system_fullscreen_toggle::progress( universe::time_type elapsed_time ) { super::progress( elapsed_time ); progress_input_reader( elapsed_time ); toggle( bear::engine::game::get_instance().get_fullscreen(), this ); } // system_fullscreen_toggle::progress() /*----------------------------------------------------------------------------*/ /** * \brief The mouse has been pressed on the item. * \param button The pressed button. * \param pos The position of the mouse on the item. */ bool bear::system_fullscreen_toggle::mouse_pressed_local ( input::mouse::mouse_code button, const universe::position_type& pos ) { super::mouse_pressed_local( button, pos ); toggle_fullscreen(); return true; } // system_fullscreen_toggle::mouse_pressed_local() /*----------------------------------------------------------------------------*/ /** * \brief The finger has been used on the item. * \param event The event dispatched by the finger. */ bool bear::system_fullscreen_toggle::finger_action_local ( const input::finger_event& event ) { super::finger_action_local( event ); if ( event.get_type() != input::finger_event::finger_event_pressed ) return false; toggle_fullscreen(); return true; } // system_fullscreen_toggle::finger_action_local() /*----------------------------------------------------------------------------*/ /** * \brief Toggles the fullscreen. */ void bear::system_fullscreen_toggle::toggle_fullscreen() const { bear::engine::game::get_instance().toggle_fullscreen(); } // system_fullscreen_toggle::toggle_fullscreen() plee-the-bear-20251226/bear-engine/lib/src/generic_items/system/code/system_music_toggle.cpp000066400000000000000000000042511512343254000317470ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::system_music_toggle class. * \author Julien Jorge */ #include "generic_items/system/system_music_toggle.hpp" #include "engine/game.hpp" BASE_ITEM_EXPORT( system_music_toggle, bear ) /*----------------------------------------------------------------------------*/ /** * \brief Update the state of the item. * \param elapsed_time The elapsed time since the last call. */ void bear::system_music_toggle::progress( universe::time_type elapsed_time ) { super::progress( elapsed_time ); progress_input_reader( elapsed_time ); toggle( !bear::engine::game::get_instance().get_music_muted(), this ); } // system_music_toggle::progress() /*----------------------------------------------------------------------------*/ /** * \brief The mouse has been pressed on the item. * \param button The pressed button. * \param pos The position of the mouse on the item. */ bool bear::system_music_toggle::mouse_pressed_local ( input::mouse::mouse_code button, const universe::position_type& pos ) { super::mouse_pressed_local( button, pos ); toggle_music(); return true; } // system_music_toggle::mouse_pressed_local() /*----------------------------------------------------------------------------*/ /** * \brief The finger has been used on the item. * \param event The event dispatched by the finger. */ bool bear::system_music_toggle::finger_action_local ( const input::finger_event& event ) { super::finger_action_local( event ); if ( event.get_type() != input::finger_event::finger_event_pressed ) return false; toggle_music(); return true; } // system_music_toggle::finger_action_local() /*----------------------------------------------------------------------------*/ /** * \brief Toggles the fullscreen mode. */ void bear::system_music_toggle::toggle_music() const { bear::engine::game::get_instance().set_music_muted ( !bear::engine::game::get_instance().get_music_muted() ); } // system_music_toggle::toggle_music() plee-the-bear-20251226/bear-engine/lib/src/generic_items/system/code/system_sound_toggle.cpp000066400000000000000000000042411512343254000317560ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::system_sound_toggle class. * \author Julien Jorge */ #include "generic_items/system/system_sound_toggle.hpp" #include "engine/game.hpp" BASE_ITEM_EXPORT( system_sound_toggle, bear ) /*----------------------------------------------------------------------------*/ /** * \brief Update the state of the item. * \param elapsed_time The elapsed time since the last call. */ void bear::system_sound_toggle::progress( universe::time_type elapsed_time ) { super::progress( elapsed_time ); progress_input_reader( elapsed_time ); toggle( !bear::engine::game::get_instance().get_sound_muted(), this ); } // system_sound_toggle::progress() /*----------------------------------------------------------------------------*/ /** * \brief The mouse has been pressed on the item. * \param button The pressed button. * \param pos The position of the mouse on the item. */ bool bear::system_sound_toggle::mouse_pressed_local ( input::mouse::mouse_code button, const universe::position_type& pos ) { super::mouse_pressed_local( button, pos ); toggle_sound(); return true; } // system_sound_toggle::mouse_pressed_local() /*----------------------------------------------------------------------------*/ /** * \brief The finger has been used on the item. * \param event The event dispatched by the finger. */ bool bear::system_sound_toggle::finger_action_local ( const input::finger_event& event ) { super::finger_action_local( event ); if ( event.get_type() != input::finger_event::finger_event_pressed ) return false; toggle_sound(); return true; } // system_sound_toggle::finger_action_local() /*----------------------------------------------------------------------------*/ /** * \brief Toggles the sound. */ void bear::system_sound_toggle::toggle_sound() const { bear::engine::game::get_instance().set_sound_muted ( !bear::engine::game::get_instance().get_sound_muted() ); } // system_sound_toggle::toggle_sound() plee-the-bear-20251226/bear-engine/lib/src/generic_items/system/system_fullscreen_toggle.hpp000066400000000000000000000026731512343254000320720ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A toggle that mutes or unmutes the fullscreen. * \author Julien Jorge */ #ifndef __BEAR_SYSTEM_FULLSCREEN_TOGGLE_HPP__ #define __BEAR_SYSTEM_FULLSCREEN_TOGGLE_HPP__ #include "engine/base_item.hpp" #include "engine/item_brick/item_with_input_listener.hpp" #include "generic_items/decorative_toggle.hpp" #include "engine/export.hpp" namespace bear { /** * \brief A toggle that mutes or unmutes the fullscreen. * \author Julien Jorge * * The custom fields of this class are the fields of the parent classes. */ class GENERIC_ITEMS_EXPORT system_fullscreen_toggle: public engine::item_with_input_listener< decorative_toggle > { DECLARE_BASE_ITEM(system_fullscreen_toggle); private: /** \brief The type of the parent item class. */ typedef engine::item_with_input_listener< decorative_toggle > super; public: void progress( universe::time_type elapsed_time ); private: bool mouse_pressed_local ( input::mouse::mouse_code button, const universe::position_type& pos ); bool finger_action_local( const input::finger_event& event ); void toggle_fullscreen() const; }; // class system_fullscreen_toggle } // namespace bear #endif // __BEAR_SYSTEM_FULLSCREEN_TOGGLE_HPP__ plee-the-bear-20251226/bear-engine/lib/src/generic_items/system/system_music_toggle.hpp000066400000000000000000000026161512343254000310450ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A toggle that mutes or unmutes the music. * \author Julien Jorge */ #ifndef __BEAR_SYSTEM_MUSIC_TOGGLE_HPP__ #define __BEAR_SYSTEM_MUSIC_TOGGLE_HPP__ #include "engine/base_item.hpp" #include "engine/item_brick/item_with_input_listener.hpp" #include "generic_items/decorative_toggle.hpp" #include "engine/export.hpp" namespace bear { /** * \brief A toggle that mutes or unmutes the music. * \author Julien Jorge * * The custom fields of this class are the fields of the parent classes. */ class GENERIC_ITEMS_EXPORT system_music_toggle: public engine::item_with_input_listener< decorative_toggle > { DECLARE_BASE_ITEM(system_music_toggle); private: /** \brief The type of the parent item class. */ typedef engine::item_with_input_listener< decorative_toggle > super; public: void progress( universe::time_type elapsed_time ); private: bool mouse_pressed_local ( input::mouse::mouse_code button, const universe::position_type& pos ); bool finger_action_local( const input::finger_event& event ); void toggle_music() const; }; // class system_music_toggle } // namespace bear #endif // __BEAR_SYSTEM_MUSIC_TOGGLE_HPP__ plee-the-bear-20251226/bear-engine/lib/src/generic_items/system/system_sound_toggle.hpp000066400000000000000000000026201512343254000310500ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A toggle that mutes or unmutes the sounds. * \author Julien Jorge */ #ifndef __BEAR_SYSTEM_SOUND_TOGGLE_HPP__ #define __BEAR_SYSTEM_SOUND_TOGGLE_HPP__ #include "engine/base_item.hpp" #include "engine/item_brick/item_with_input_listener.hpp" #include "generic_items/decorative_toggle.hpp" #include "engine/export.hpp" namespace bear { /** * \brief A toggle that mutes or unmutes the sounds. * \author Julien Jorge * * The custom fields of this class are the fields of the parent classes. */ class GENERIC_ITEMS_EXPORT system_sound_toggle: public engine::item_with_input_listener< decorative_toggle > { DECLARE_BASE_ITEM(system_sound_toggle); private: /** \brief The type of the parent item class. */ typedef engine::item_with_input_listener< decorative_toggle > super; public: void progress( universe::time_type elapsed_time ); private: bool mouse_pressed_local ( input::mouse::mouse_code button, const universe::position_type& pos ); bool finger_action_local( const input::finger_event& event ); void toggle_sound() const; }; // class system_sound_toggle } // namespace bear #endif // __BEAR_SYSTEM_SOUND_TOGGLE_HPP__ plee-the-bear-20251226/bear-engine/lib/src/generic_items/teleport_item.hpp000066400000000000000000000033141512343254000263040ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief This class teleports items in camera. * \author Sébastien Angibaud */ #ifndef __BEAR_TELEPORT_ITEM_HPP__ #define __BEAR_TELEPORT_ITEM_HPP__ #include "engine/item_brick/item_with_toggle.hpp" #include "engine/base_item.hpp" #include "engine/export.hpp" #include "generic_items/class_export.hpp" #include "universe/derived_item_handle.hpp" namespace bear { /** * \brief This item teleports object in camera. * * The custom fields of this class are : * - \a reference_point: The item for which center of mass is used * for teleportation.(required), * - any field supported by the parent class. * * \author Sébastien Angibaud */ class GENERIC_ITEMS_EXPORT teleport_item: public engine::item_with_toggle { DECLARE_BASE_ITEM(teleport_item); private: /** \brief The type of an handle on a object. */ typedef universe::derived_item_handle handle_type; public: /** \brief The type of the parent class. */ typedef engine::item_with_toggle super; public: teleport_item(); bool set_item_field ( const std::string& name, bear::engine::base_item* value ); bool is_valid() const; bear::universe::position_type get_gap() const; protected: void on_toggle_on( engine::base_item* activator ); private: /** \brief The reference item for teleportation. */ handle_type m_reference; }; // class teleport_item } // namespace bear #endif // __BEAR_TELEPORT_ITEM_HPP__ plee-the-bear-20251226/bear-engine/lib/src/generic_items/time_scale.hpp000066400000000000000000000026341512343254000255410ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief This toggle changes the time scale when it is turned on. * \author Julien Jorge */ #ifndef __BEAR_TIME_SCALE_HPP__ #define __BEAR_TIME_SCALE_HPP__ #include "engine/item_brick/item_with_toggle.hpp" #include "engine/base_item.hpp" #include "engine/export.hpp" #include "generic_items/class_export.hpp" namespace bear { /** * \brief This toggle changes the time scale when it is turned on. * * The custom fields of this class are : * - \a scale: real, the time scale (default = 2), * - any field supported by the parent class. * * \author Julien Jorge */ class GENERIC_ITEMS_EXPORT time_scale: public engine::item_with_toggle { DECLARE_BASE_ITEM(time_scale); public: /** \brief The type of the parent class. */ typedef engine::item_with_toggle super; public: time_scale(); bool set_real_field( const std::string& name, double value ); bool is_valid() const; void progress_on( universe::time_type elapsed_time ); void set_scale(double scale); private: /** \brief The scale of the time. */ double m_scale; }; // class time_scale } // namespace bear #endif // __BEAR_TIME_SCALE_HPP__ plee-the-bear-20251226/bear-engine/lib/src/generic_items/time_scale_on_input_toggle.hpp000066400000000000000000000032571512343254000310170ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief This toggle changes the time scale if an input is pressed when it is * turned on. * \author Julien Jorge */ #ifndef __BEAR_TIME_SCALE_ON_INPUT_TOGGLE_HPP__ #define __BEAR_TIME_SCALE_ON_INPUT_TOGGLE_HPP__ #include "engine/item_brick/item_with_toggle.hpp" #include "engine/base_item.hpp" #include "engine/export.hpp" #include "generic_items/class_export.hpp" namespace bear { class time_scale; /** * \brief This toggle changes the time scale if an input is pressed when it is * turned on. * * The custom fields of this class are : * - \a time_scale [required]: item of type type_scale, the item to use to * scale the time, * - any field supported by the parent class. * * \author Julien Jorge */ class GENERIC_ITEMS_EXPORT time_scale_on_input_toggle: public engine::item_with_toggle { DECLARE_BASE_ITEM(time_scale_on_input_toggle); public: /** \brief The type of the parent class. */ typedef engine::item_with_toggle super; public: ~time_scale_on_input_toggle(); void build(); bool set_item_field( const std::string& name, engine::base_item* value ); bool is_valid() const; void set_time_scale_item(const time_scale* time_scale_item); private: /** \brief The item used to scale the time. */ time_scale* m_time_scale; }; // class time_scale_on_input_toggle } // namespace bear #endif // __BEAR_TIME_SCALE_ON_INPUT_TOGGLE_HPP__ plee-the-bear-20251226/bear-engine/lib/src/generic_items/timer.hpp000066400000000000000000000056771512343254000245660ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A simple timer. * \author Julien Jorge */ #ifndef __BEAR_TIMER_HPP__ #define __BEAR_TIMER_HPP__ #include "engine/base_item.hpp" #include "engine/item_brick/item_with_toggle.hpp" #include "universe/derived_item_handle.hpp" #include "engine/export.hpp" #include "generic_items/class_export.hpp" namespace bear { /** * \brief A simple timer. * * The custom fields of this class are : * - \a countdown (boolean): Indicates if the timer is a countdown * (default = false), * - \a loop (boolean): tell if the timer restarts automatically when the * time is over (default = false), * _ \a reset_when_reactivated : Indicates if the timer is initialized * when the timer is reactivated (default = true), * - \a time (real): the initial time, in seconds (default = 0), * - \a toggle (item): a toggle to toggle when the countdown is over * (default = none), * * \author Julien Jorge */ class GENERIC_ITEMS_EXPORT timer: public engine::item_with_toggle { DECLARE_BASE_ITEM(timer); public: /** \brief The type of the parent class. */ typedef engine::item_with_toggle super; private: /** \brief An handle on a toggle. */ typedef universe::derived_item_handle toggle_handle; public: timer(); timer(bear::universe::time_type initial_time, bool countdown); void progress_on( bear::universe::time_type elapsed_time ); bool set_bool_field( const std::string& name, bool value ); bool set_real_field( const std::string& name, double value ); bool set_item_field( const std::string& name, engine::base_item* value ); universe::time_type get_time() const; universe::time_type get_initial_time() const; universe::time_type get_elapsed_time() const; bool is_countdown() const; std::size_t get_loops() const; engine::base_item* get_toggle() const; void set_toggle( engine::base_item* t ); private: void on_toggle_on( engine::base_item* activator ); private: /** \brief Elapsed time since the creation of the item. */ universe::time_type m_elapsed_time; /** \brief The initial time. */ universe::time_type m_initial_time; /** \brief Indicates if the timer is a countdown. */ bool m_countdown; /** \brief Tell if the timer restarts automatically on a timeout. */ bool m_loop; /** \brief A toggle to be turned on when the timer is over. */ toggle_handle m_toggle; /** \brief How many loops have we done. */ std::size_t m_loops_count; /** \brief Indicates if the timer is initialized * when the timer is reactivated. */ bool m_reset_when_reactivated; }; // class timer } // namespace bear #endif // __BEAR_TIMER_HPP__ plee-the-bear-20251226/bear-engine/lib/src/generic_items/toggle.hpp000066400000000000000000000015221512343254000247100ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A minimal toggle. * \author Julien Jorge */ #ifndef __BEAR_TOGGLE_HPP__ #define __BEAR_TOGGLE_HPP__ #include "engine/base_item.hpp" #include "engine/item_brick/item_with_toggle.hpp" #include "generic_items/class_export.hpp" #include "engine/export.hpp" namespace bear { /** * \brief A minimal toggle. * \author Julien Jorge * * The custom fields of this class are the fields of the parent classes. */ class GENERIC_ITEMS_EXPORT toggle: public engine::item_with_toggle { DECLARE_BASE_ITEM(toggle); }; // class toggle } // namespace bear #endif // __BEAR_TOGGLE_HPP__ plee-the-bear-20251226/bear-engine/lib/src/generic_items/toggle_group.hpp000066400000000000000000000043501512343254000261260ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief This toggle transmits its status to a group of other toggles. * \author Julien Jorge */ #ifndef __BEAR_TOGGLE_GROUP_HPP__ #define __BEAR_TOGGLE_GROUP_HPP__ #include "engine/base_item.hpp" #include "engine/item_brick/item_with_toggle.hpp" #include "universe/derived_item_handle.hpp" #include "generic_items/class_export.hpp" #include "engine/export.hpp" namespace bear { /** * \brief This toggle transmits its status to a group of other toggles. * * \remark If the state of the toggles in the group change independently from * the state of the group, the status of the group will not reflect the status * of the sub toggles. So, these sub toggles should have a infinite delay * before being automatically turned off and should not be modified by * anything else than the group. * * The following fields are supported by this item: * - toggles (list of toggles), the toggles to which we transmit the status * (default=none), * - any field supported by the parent class. * * \author Julien Jorge */ class GENERIC_ITEMS_EXPORT toggle_group: public engine::item_with_toggle { DECLARE_BASE_ITEM(toggle_group); /** \brief The type of the parent class. */ typedef engine::item_with_toggle super; private: /** \brief The type of the handles on the toggles to activate. */ typedef universe::derived_item_handle toggle_handle; /** \brief The type of the list in which we store the handles. */ typedef std::list handle_list_type; public: bool set_item_list_field ( const std::string& name, const std::vector& value ); void insert( engine::base_item* t ); private: void on_toggle_on( engine::base_item* activator ); void on_toggle_off( engine::base_item* activator ); private: /** \brief The toggles to which we transmit the status. */ handle_list_type m_toggles; }; // class toggle_group } // namespace bear #endif // __BEAR_TOGGLE_GROUP_HPP__ plee-the-bear-20251226/bear-engine/lib/src/generic_items/train.hpp000066400000000000000000000024151512343254000245460ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief The class describing the base of a train platform. * \author Sebastien Angibaud */ #ifndef __BEAR_TRAIN_HPP__ #define __BEAR_TRAIN_HPP__ #include "generic_items/class_export.hpp" #include "generic_items/base_train.hpp" #include "generic_items/block.hpp" #include "universe/physical_item_state.hpp" namespace bear { /** * \brief The class describing a train platform. * \author Sebastien Angibaud */ class GENERIC_ITEMS_EXPORT train: public block, public base_train { DECLARE_BASE_ITEM(train); public: /** \brief The type of the parent class. */ typedef block super; public: train(); void on_enters_layer(); void progress( universe::time_type elapsed_time ); protected: void to_string( std::string& str ) const; void collision( engine::base_item& that, universe::collision_info& info ); void move( universe::time_type elapsed_time ); private: void get_dependent_items( universe::physical_item::item_list& d ) const; }; // class train } // namespace bear #endif // __BEAR_TRAIN_HPP__ plee-the-bear-20251226/bear-engine/lib/src/generic_items/trigger.hpp000066400000000000000000000053101512343254000250710ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A minimal trigger. * \author Julien Jorge */ #ifndef __BEAR_TRIGGER_HPP__ #define __BEAR_TRIGGER_HPP__ #include "engine/base_item.hpp" #include "engine/item_brick/item_with_trigger.hpp" #include "engine/item_brick/with_toggle.hpp" #include "generic_items/class_export.hpp" #include "engine/export.hpp" namespace bear { /** * \brief A minimal trigger. * \author Julien Jorge * * The custom fields of this class are the fields of the parent classes. */ class GENERIC_ITEMS_EXPORT trigger: public engine::item_with_trigger { DECLARE_BASE_ITEM(trigger); TEXT_INTERFACE_DECLARE_METHOD_LIST(super, init_exported_methods) public: /** \brief The type of the parent class. */ typedef engine::item_with_trigger super; /** \brief The different behaviours of the trigger. */ enum mode { /** \brief The toggles are turned on if the condition is true, not changed otherwise. */ trigger_one_way, /** \brief The state of the toggles change each time the condition is true. */ trigger_switch, /** \brief The state of the toggles matches the value of the condition. */ trigger_condition }; // enum mode private: /** \brief The type of an handle on a toggle. */ typedef universe::derived_item_handle handle_type; /** \brief The type of a list of toggles. */ typedef std::list handle_list; public: explicit trigger( mode m = trigger_one_way ); bool set_string_field( const std::string& name, const std::string& value ); bool set_item_list_field ( const std::string& name, const std::vector& value ); void get_visual( std::list& visuals ) const; void activate(); void deactivate(); void add_toggle( base_item* t ); virtual void get_dependent_items ( universe::physical_item::item_list& d ) const; private: void on_trigger_on( base_item* activator ); void on_trigger_off( base_item* activator ); void set_toggles( base_item* activator, bool b ); void switch_toggles( base_item* activator ); static void init_exported_methods(); private: /** \brief The behaviour of the trigger. */ mode m_mode; /** \brief The toggles to turn on when the condition is verified. */ handle_list m_toggle; }; // class trigger } // namespace bear #endif // __BEAR_TRIGGER_HPP__ plee-the-bear-20251226/bear-engine/lib/src/generic_items/tweener_item.hpp000066400000000000000000000034601512343254000261210ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A temporary item containing tweeners on another item. * \author Sebastien Angibaud */ #ifndef __BEAR_TWEENER_ITEM_HPP__ #define __BEAR_TWEENER_ITEM_HPP__ #include "engine/base_item.hpp" #include "universe/derived_item_handle.hpp" #include "generic_items/class_export.hpp" #include "engine/export.hpp" #include namespace bear { /** * \brief A temporary item containing tweeners on another item. * \author Sebastien Angibaud * * This item has no custom fields. * */ class GENERIC_ITEMS_EXPORT tweener_item: public engine::base_item { DECLARE_BASE_ITEM(tweener_item); private: /** \brief The type of the parent class. */ typedef engine::base_item super; /** \brief The type of the item handle. */ typedef universe::derived_item_handle< engine::base_item > item_handle; public: tweener_item ( const claw::tween::tweener& t, engine::base_item* item = NULL, bool same_lifespan = false ); void on_enters_layer(); void progress( universe::time_type elapsed_time ); void set_tweener ( const claw::tween::tweener& t, engine::base_item* item = NULL, bool same_lifespan = false ); private: /** \brief The item to modify. */ item_handle m_item; /** \brief Tell if m_item must be killed with *this. */ bool m_same_lifespan; /** \brief Tell if *this must be killed when m_item dies. */ bool m_follow_item; /** \brief The set of current tweeners. */ claw::tween::tweener m_tweener; }; // class tweener_item } // namespace bear #endif // __BEAR_TWEENER_ITEM_HPP__ plee-the-bear-20251226/bear-engine/lib/src/generic_items/unconditional_killer.hpp000066400000000000000000000022161512343254000276400ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief An item that kills all colliding items. * \author Julien Jorge */ #ifndef __BEAR_UNCONDITIONAL_KILLER_HPP__ #define __BEAR_UNCONDITIONAL_KILLER_HPP__ #include "engine/base_item.hpp" #include "engine/export.hpp" #include "generic_items/class_export.hpp" namespace bear { /** * \brief An item that kills all colliding items. * * The valid fields for this item are * - any field supported by the parent classes. * * \author Julien Jorge */ class GENERIC_ITEMS_EXPORT unconditional_killer: public engine::base_item { DECLARE_BASE_ITEM(unconditional_killer); public: /** \brief The type of the parent class. */ typedef engine::base_item super; public: unconditional_killer(); protected: virtual void collision ( engine::base_item& that, universe::collision_info& info ); }; // class unconditional_killer } // namespace bear #endif // __BEAR_UNCONDITIONAL_KILLER_HPP__ plee-the-bear-20251226/bear-engine/lib/src/generic_items/world_parameters.hpp000066400000000000000000000055031512343254000270040ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief This class sets the parameters of universe::world then die. * \author Julien Jorge */ #ifndef __BEAR_WORLD_PARAMETERS_HPP__ #define __BEAR_WORLD_PARAMETERS_HPP__ #include "engine/base_item.hpp" #include "universe/environment_type.hpp" #include "engine/export.hpp" #include "generic_items/class_export.hpp" namespace bear { /** * \brief This class sets the parameters of universe::world then die. * * The fields of this item are * - \a gravity_x: (real) \c the x value of the gravity (default = 0), * - \a gravity_y: (real) \c the y value of the gravity (default = 9.81), * - \a speed_epsilon_x: (real) \c the value under which the speed is * considered to be equal to zero on the x axis (default = 0.01), * - \a speed_epsilon_y: (real) \c the value under which the speed is * considered to be equal to zero on the y axis (default = 0.01), * - \a angular_speed_epsilon: (real) \c the value under which the angular * speed is considered to be equal to zero (default = 0.01), * - \a unit: (real) \c number of units of the world in a meter * (default = 3000), * - \a default_friction: (real) default friction applied to the items * (default = 0.99). * - \a default_density: (real) default density of the world * (default = 0). * - \a default_environment: (string) default environment of the world * (default = "air_environment"). * * \author Julien Jorge */ class GENERIC_ITEMS_EXPORT world_parameters: public engine::base_item { DECLARE_BASE_ITEM(world_parameters); public: /** \brief The type of the parent class. */ typedef engine::base_item super; public: world_parameters(); bool set_real_field( const std::string& name, double value ); bool set_string_field( const std::string& name, const std::string& value); void build(); private: /** \brief The gravity. */ universe::force_type m_gravity; /** \brief The value under which the speed considered to be equal to zero. */ universe::speed_type m_speed_epsilon; /** \brief Value under which the angular speed is considered as zero. */ double m_angular_speed_epsilon; /** \brief The unit of the world. */ universe::coordinate_type m_unit; /** \brief Default friction applied to the items. */ double m_default_friction; /** \brief Default density applied to the items. */ double m_default_density; /** \brief Default environment of the world. */ universe::environment_type m_default_environment; }; // class world_parameters } // namespace bear #endif // __BEAR_WORLD_PARAMETERS_HPP__ plee-the-bear-20251226/bear-engine/running_bear/000077500000000000000000000000001512343254000212155ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/running_bear/CMakeLists.txt000066400000000000000000000025221512343254000237560ustar00rootroot00000000000000cmake_minimum_required(VERSION 2.6) project(running-bear) set( RUNNING_BEAR_TARGET_NAME running-bear ) include_directories( . ${BEAR_ENGINE_INCLUDE_DIRECTORY} ) #------------------------------------------------------------------------------- set( RUNNING_BEAR_SOURCE_FILES code/running_bear.cpp code/main.cpp ) add_executable( ${RUNNING_BEAR_TARGET_NAME} ${RUNNING_BEAR_SOURCE_FILES} ) set_target_properties( ${RUNNING_BEAR_TARGET_NAME} PROPERTIES INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/${BEAR_ENGINE_INSTALL_LIBRARY_DIR}" ) if( NOT WIN32 ) set_target_properties( ${RUNNING_BEAR_TARGET_NAME} PROPERTIES COMPILE_DEFINITIONS "BEAR_TEXT_DOMAIN_PATH=${CMAKE_INSTALL_PREFIX}/${TRANSLATIONS_INSTALL_DIR}" ) endif( NOT WIN32 ) install( TARGETS ${RUNNING_BEAR_TARGET_NAME} DESTINATION ${BEAR_ENGINE_INSTALL_EXECUTABLE_DIR} ) set( RUNNING_BEAR_LINK_LIBRARIES bear_engine ${CLAW_APPLICATION_LIBRARIES} ) if(WIN32) set( RUNNING_BEAR_LINK_LIBRARIES ${RUNNING_BEAR_LINK_LIBRARIES} ${SDL2_LIBRARY} intl ) endif(WIN32) # FIXME: it would be even better to use "sdl-config" if(APPLE) set( RUNNING_BEAR_LINK_LIBRARIES ${RUNNING_BEAR_LINK_LIBRARIES} ${SDL2_LIBRARY} SDLmain intl ) endif(APPLE) target_link_libraries( ${RUNNING_BEAR_TARGET_NAME} ${RUNNING_BEAR_LINK_LIBRARIES} ) plee-the-bear-20251226/bear-engine/running_bear/code/000077500000000000000000000000001512343254000221275ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/running_bear/code/main.cpp000066400000000000000000000007411512343254000235610ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the main procedure. * \author Sébastien Angibaud */ #include "running_bear.hpp" #ifdef __APPLE__ #include // needed on OSX because there SDL needs to hijack 'main' #endif CLAW_APPLICATION_IMPLEMENT(bear::running_bear) plee-the-bear-20251226/bear-engine/running_bear/code/running_bear.cpp000066400000000000000000000052711512343254000253110ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bear::running_bear class. * \author Julien Jorge */ #include "running_bear.hpp" #include "bear_gettext.hpp" #include #include /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param argc Number of program arguments. * \param argv Program arguments. */ bear::running_bear::running_bear( int& argc, char** &argv ) : claw::application(argc, argv), m_game(NULL) { #ifdef BEAR_TEXT_DOMAIN_PATH bindtextdomain( "bear-engine", BOOST_PP_STRINGIZE(BEAR_TEXT_DOMAIN_PATH) ); #endif bind_textdomain_codeset( "bear-engine", "ISO-8859-15" ); textdomain( "bear-engine" ); m_arguments.add ("-h", "--help", bear_gettext("Print this help screen and exit."), true); m_arguments.parse(argc, argv); if ( m_arguments.get_bool("--help") ) help(); else create_game( argc, argv ); } // running_bear::running_bear() /*----------------------------------------------------------------------------*/ /** * \brief Destructor. */ bear::running_bear::~running_bear() { delete m_game; } // running_bear::~running_bear() /*----------------------------------------------------------------------------*/ /** * \brief Run the application. */ int bear::running_bear::run() { try { if ( m_game != NULL ) { m_game->run(); delete m_game; m_game = NULL; } return EXIT_SUCCESS; } catch( std::exception& e ) { claw::logger << claw::log_error << "(exception) " << e.what() << std::endl; delete m_game; m_game = NULL; return EXIT_FAILURE; } } // running_bear::run() /*----------------------------------------------------------------------------*/ /** * \brief Create the game. * \param argc Number of program arguments. * \param argv Program arguments. */ void bear::running_bear::create_game( int& argc, char** &argv ) { try { m_game = new engine::game( argc, argv ); } catch( std::exception& e ) { std::cerr << "Exception: " << e.what() << std::endl; help(); } } // running_bear::create_game() /*----------------------------------------------------------------------------*/ /** * \brief Print some help about the usage of the program. */ void bear::running_bear::help() const { m_arguments.help( bear_gettext("engine_options") ); std::cout << '\n'; engine::game::print_help(); } // running_bear::help() plee-the-bear-20251226/bear-engine/running_bear/running_bear.hpp000066400000000000000000000016431512343254000244030ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief The main class of the application. * \author Julien Jorge */ #ifndef __BEAR_RUNNING_BEAR_HPP__ #define __BEAR_RUNNING_BEAR_HPP__ #include #include "engine/game.hpp" namespace bear { /** * \brief The main class of the application. * \author Julien Jorge */ class running_bear : public claw::application { public: running_bear( int& argc, char** &argv ); virtual ~running_bear(); virtual int run(); private: void create_game( int& argc, char** &argv ); void help() const; private: /** \brief The game we are running. */ engine::game* m_game; }; // class running_bear } // namespace bear #endif // __BEAR_RUNNING_BEAR_HPP__ plee-the-bear-20251226/bear-engine/test/000077500000000000000000000000001512343254000175235ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/test/entity-count/000077500000000000000000000000001512343254000221655ustar00rootroot00000000000000plee-the-bear-20251226/bear-engine/test/entity-count/CMakeLists.txt000066400000000000000000000022331512343254000247250ustar00rootroot00000000000000cmake_minimum_required(VERSION 2.8) set( BEAR_ROOT_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/../../../" ) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -pedantic -fdiagnostics-color=always") # The engine comes with some CMake scripts to ease its configuration and usage. # These scripts are in the directory below and must be assigned to # CMAKE_MODULE_PATH in order to be found by the upcoming include() instructions set( CMAKE_MODULE_PATH "${BEAR_ROOT_DIRECTORY}/cmake-helper" ) # This will sets the variables of the source directories, required by the CMake # package below. include( "bear-config" ) #------------------------------------------------------------------------------- # Include Bear Engine's CMake package to find the libraries, the link paths and # the and include paths required by the engine. find_package( bear ) include_directories( ${BEAR_ENGINE_INCLUDE_DIRECTORY} ) #------------------------------------------------------------------------------- # Now we can describe our project. set( TARGET_NAME entity-count ) file( GLOB SOURCES *.cpp ) add_executable( ${TARGET_NAME} ${SOURCES} ) target_link_libraries( ${TARGET_NAME} ${BEAR_ENGINE_LIBRARIES} ) plee-the-bear-20251226/bear-engine/test/entity-count/box.png000066400000000000000000000002721512343254000234640ustar00rootroot00000000000000‰PNG  IHDR‰ bKGDùC» pHYs  šœtIMEß !$©;ÕìtEXtCommentCreated with GIMPW"IDAT8Ëcüÿÿÿ*&*ƒQG 5pÔÀQ‡Š³$ç⌲IEND®B`‚plee-the-bear-20251226/bear-engine/test/entity-count/main.cpp000066400000000000000000000177011512343254000236230ustar00rootroot00000000000000/** * \file * * Performance test. */ #include "input/input_listener.hpp" #include "input/input_status.hpp" #include "input/system.hpp" #include "time/time.hpp" #include "universe/collision_info.hpp" #include "universe/physical_item.hpp" #include "universe/world.hpp" #include "visual/scene_sprite.hpp" #include "visual/screen.hpp" #include double random_number() { return (double)std::rand() / RAND_MAX; } bear::visual::sprite create_box_sprite() { std::ifstream f( "box.png" ); const claw::graphic::image image( f ); const bear::visual::image texture( image ); return bear::visual::sprite ( texture, bear::visual::sprite::clip_rectangle_type( 0, 0, 20, 20 ) ); } class game_item: public bear::universe::physical_item { public: bear::visual::sprite m_display; public: game_item( const bear::visual::sprite& visual ) : m_display( visual ) { set_size( 20, 20 ); set_mass( 500 + 1000 * random_number() ); set_friction( 1 ); set_system_angle( 2 * 3.14159 * random_number() ); set_speed( get_x_axis() * ( 200 + 200 * random_number() ) ); set_density( random_number() * 10 ); set_angular_speed( -0.05 + random_number() * 0.1 ); set_elasticity( 0.5 + random_number() / 2 ); m_display.set_intensity ( 0.5 + random_number() / 2, 0.5 + random_number() / 2, 0.5 + random_number() / 2 ); } const bear::visual::sprite& get_display() const { return m_display; } private: void time_step( double elapsed_time ) override { bear::universe::physical_item::time_step( elapsed_time ); m_display.set_opacity( 0.1 ); } void collision( bear::universe::collision_info& info ) override { m_display.set_opacity( 1 ); } }; class arena_bound: public bear::universe::physical_item { private: void collision( bear::universe::collision_info& info ) override { switch( info.get_collision_side() ) { case bear::universe::zone::bottom_zone: collision_align_bottom(info); break; case bear::universe::zone::top_zone: collision_align_top(info); break; case bear::universe::zone::middle_left_zone: collision_align_left(info); break; case bear::universe::zone::middle_right_zone: collision_align_right(info); break; default: { assert( false ); } } } }; class game: public bear::input::input_listener { private: typedef std::vector< game_item* > item_collection; private: bool m_quit; const bool m_unlimited; const claw::math::coordinate_2d m_screen_size; bear::visual::screen m_screen; const bear::universe::size_box_type m_camera_position; bear::input::input_status m_input; const bear::universe::size_box_type m_world_size; bear::universe::world m_world; item_collection m_items; std::vector< arena_bound > m_bounds; bear::systime::milliseconds_type m_last_spawn; bear::visual::sprite m_item_visual; public: explicit game( bool unlimited ) : m_quit( false ), m_unlimited( unlimited ), m_screen_size( 1024, 575 ), m_screen( m_screen_size ), m_camera_position( 50, 50 ), m_world_size( m_screen_size + 2 * m_camera_position ), m_world( m_world_size ), m_bounds( 4 ), m_last_spawn( 0 ), m_item_visual( create_box_sprite() ) { m_world.set_gravity( bear::universe::force_type( 0, 0 ) ); add_bounds(); } ~game() { for ( item_collection::value_type& item : m_items ) delete item; } void run() { bear::systime::milliseconds_type last_update ( bear::systime::get_date_ms() ); const bear::systime::milliseconds_type time_step( 1000.0 / 30 ); std::size_t next_log( 0 ); while ( !m_quit ) { const bear::systime::milliseconds_type now ( bear::systime::get_date_ms() ); if ( now - last_update < time_step ) bear::systime::sleep( time_step - ( now - last_update ) ); update_inputs(); const bear::systime::milliseconds_type start ( bear::systime::get_date_ms() ); update_world( double( now - last_update ) / 1000); const bear::systime::milliseconds_type end ( bear::systime::get_date_ms() ); last_update = now; if ( m_items.size() == next_log ) { std::cout << m_items.size() << '\t' << end - start << '\n'; next_log += 10; } if ( end - start > time_step ) { std::cout << "physics timeout: " << m_items.size() << " items, " << end - start << " > " << time_step << " ms.\n"; m_quit = !m_unlimited; } else if ( end - start > time_step / 2 ) std::cout << "physics half timeout: " << m_items.size() << " items, " << end - start << " > " << time_step << " / 2 ms.\n"; render(); spawn_item(); } } private: void add_bounds() { const double margin( m_camera_position.x ); m_bounds[ 0 ].set_bottom_left( 0, 0 ); m_bounds[ 0 ].set_size( m_world_size.x, margin ); m_world.add_static( &m_bounds[ 0 ] ); m_bounds[ 1 ].set_bottom_left( 0, m_world_size.y - margin ); m_bounds[ 1 ].set_size( m_world_size.x, margin ); m_world.add_static( &m_bounds[ 1 ] ); m_bounds[ 2 ].set_bottom_left( 0, margin ); m_bounds[ 2 ].set_size( margin, m_world_size.y - 2 * margin ); m_world.add_static( &m_bounds[ 2 ] ); m_bounds[ 3 ].set_bottom_left( m_world_size.x - margin, margin ); m_bounds[ 3 ].set_size( margin, m_world_size.y - 2 * margin ); m_world.add_static( &m_bounds[ 3 ] ); } void spawn_item() { const bear::systime::milliseconds_type now( bear::systime::get_date_ms() ); if ( now - m_last_spawn < 200 ) return; m_last_spawn = now; const double margin( m_camera_position.x * 2 ); game_item* item( new game_item( m_item_visual ) ); item->set_center_of_mass ( margin + random_number() * ( m_world_size.x - 2 * margin ), margin + random_number() * ( m_world_size.y - 2 * margin ) ); m_items.push_back( item ); m_world.register_item( item ); } bool key_pressed( const bear::input::key_info& key ) override { if ( key.is_escape() ) { m_quit = true; return true; } return false; } void update_inputs() { bear::input::system::get_instance().refresh(); m_input.read(); m_input.scan_inputs( *this ); } void update_world( double time_step ) { bear::universe::world::region_type region; region.push_back ( bear::universe::rectangle_type ( 0, 0, m_world.get_size().x, m_world.get_size().y ) ); m_world.progress_entities( region, time_step ); } void render() { m_screen.begin_render(); for ( game_item* item : m_items ) render_item( *item ); m_screen.end_render(); } void render_item( const game_item& item ) { const bear::visual::sprite sprite( item.get_display() ); const bear::visual::position_type position ( item.get_center_of_mass() - m_camera_position - sprite.get_size() / 2 ); m_screen.render ( bear::visual::scene_sprite ( position.x, position.y, sprite ) ); } }; /** * Initializes the visual and input modules of the engine. */ void init() { bear::visual::screen::initialize( bear::visual::screen::screen_gl ); bear::input::system::initialize(); } /** * Releases the visual and input modules of the engine. */ void release() { bear::input::system::release(); bear::visual::screen::release(); } /** * Launches the game. */ void run_example( bool unlimited ) { game game_instance( unlimited ); game_instance.run(); } /** * Initializes the engine then runs the example. The engine's modules will be * released before leaving. */ int main( int argc, char* argv[] ) { init(); const bool unlimited ( ( argc == 2 ) && std::string( argv[ 1 ] ) == "--unlimited" ); run_example( unlimited ); release(); return 0; } plee-the-bear-20251226/bear-factory/000077500000000000000000000000001512343254000167465ustar00rootroot00000000000000plee-the-bear-20251226/bear-factory/CMakeLists.txt000066400000000000000000000073151512343254000215140ustar00rootroot00000000000000cmake_minimum_required(VERSION 2.6) project(bear-factory) # where the game programs are installed if( NOT BEAR_FACTORY_INSTALL_EXECUTABLE_DIR ) set( BEAR_FACTORY_INSTALL_EXECUTABLE_DIR bin ) endif( NOT BEAR_FACTORY_INSTALL_EXECUTABLE_DIR ) # where the engine libraries are installed if( NOT BEAR_FACTORY_INSTALL_LIBRARY_DIR ) if( WIN32 ) set( BEAR_FACTORY_INSTALL_LIBRARY_DIR "${BEAR_FACTORY_INSTALL_EXECUTABLE_DIR}" ) else( WIN32 ) set( BEAR_FACTORY_INSTALL_LIBRARY_DIR lib ) endif( WIN32 ) endif( NOT BEAR_FACTORY_INSTALL_LIBRARY_DIR ) # Directories where the executable and libraries are built set( EXECUTABLE_OUTPUT_PATH "${CMAKE_CURRENT_BINARY_DIR}/bin" ) set( LIBRARY_OUTPUT_PATH "${EXECUTABLE_OUTPUT_PATH}" ) #------------------------------------------------------------------------------- # various libraries #------------------------------------------------------------------------------- # Claw find_package( libclaw 1.7.4 ) #------------------------------------------------------------------------------- # Include directories for Claw include_directories( ${CLAW_INCLUDE_DIRECTORY} ${CLAW_GRAPHIC_INCLUDE_DIRECTORY} ) #------------------------------------------------------------------------------- # Link directories for Claw link_directories( ${CLAW_LINK_DIRECTORY} ${CLAW_GRAPHIC_LINK_DIRECTORY} ) #------------------------------------------------------------------------------- # Boost include(FindBoost) #------------------------------------------------------------------------------- # Include directories for Boost include_directories( ${Boost_INCLUDE_DIR} ) find_package( Boost 1.35 REQUIRED COMPONENTS system filesystem ) if( NOT Boost_FOUND ) message( FATAL_ERROR "You must have boost::system and boost::filesystem libraries installed (at least 1.35)" ) endif( NOT Boost_FOUND ) #------------------------------------------------------------------------------- # Link directories for Boost link_directories( ${Boost_LIBRARY_DIRS} ) #------------------------------------------------------------------------------- # Link directories for the game link_directories( ${LIBRARY_OUTPUT_PATH} ) #------------------------------------------------------------------------------- if( BEAR_ENGINE_COMMON_INCLUDE_DIRECTORY ) include_directories( "${BEAR_ENGINE_COMMON_INCLUDE_DIRECTORY}" ) else( BEAR_ENGINE_COMMON_INCLUDE_DIRECTORY ) include_directories( ../bear-engine/common/include ) endif( BEAR_ENGINE_COMMON_INCLUDE_DIRECTORY ) set( BEAR_FACTORY_EDITOR_INCLUDE_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/bear-editor/src" ) #------------------------------------------------------------------------------- # check wxWidgets if( WIN32 ) set( wxWidgets_USE_LIBS mono ) add_definitions( "-DwxUSE_UNICODE" ) else( WIN32 ) set( wxWidgets_USE_LIBS xml core adv ) endif( WIN32 ) include(FindwxWidgets) if( NOT wxWidgets_FOUND ) message( "wxWidgets not found" ) endif( NOT wxWidgets_FOUND ) #------------------------------------------------------------------------------- # path to the images used in the interface if( NOT BF_IMAGES_PATH ) set( BF_IMAGES_PATH "share/bear-factory/images" ) endif( NOT BF_IMAGES_PATH ) add_definitions( '-DBF_IMAGES_PATH="${CMAKE_INSTALL_PREFIX}/${BF_IMAGES_PATH}"' ) #------------------------------------------------------------------------------- subdirs( desktop bear-editor animation-editor level-editor model-editor tool ) install( DIRECTORY "item-description" DESTINATION "share/bear-factory" FILE_PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ DIRECTORY_PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE PATTERN ".svn" EXCLUDE PATTERN "*~" EXCLUDE ) plee-the-bear-20251226/bear-factory/animation-editor/000077500000000000000000000000001512343254000222115ustar00rootroot00000000000000plee-the-bear-20251226/bear-factory/animation-editor/CMakeLists.txt000066400000000000000000000000151512343254000247450ustar00rootroot00000000000000subdirs(src) plee-the-bear-20251226/bear-factory/animation-editor/doc/000077500000000000000000000000001512343254000227565ustar00rootroot00000000000000plee-the-bear-20251226/bear-factory/animation-editor/doc/Doxyfile000066400000000000000000002267121512343254000244760ustar00rootroot00000000000000# Doxyfile 1.7.6.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 sequence of words) that should # identify the project. Note that if you do not use Doxywizard you need # to put quotes around the project name if it contains spaces. PROJECT_NAME = "Bear Factory - Animation editor of Plee the Bear" # 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. PROJECT_NUMBER = # Using the PROJECT_BRIEF tag one can provide an optional one line description # for a project that appears at the top of each page and should give viewer # a quick idea about the purpose of the project. Keep the description short. PROJECT_BRIEF = # With the PROJECT_LOGO tag one can specify an logo or icon that is # included in the documentation. The maximum height of the logo should not # exceed 55 pixels and the maximum width should not exceed 200 pixels. # Doxygen will copy the logo to the output directory. PROJECT_LOGO = # 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 = . # 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-Cyrillic, 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 = ./../src # 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 if your file system # 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 = NO # 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 = 8 # 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 = # This tag can be used to specify a number of word-keyword mappings (TCL only). # A mapping has the form "name=value". For example adding # "class=itcl::class" will allow you to use the command class in the # itcl::class meaning. TCL_SUBST = # 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 makes 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 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 the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and # unions are shown inside the group in which they are included (e.g. using # @ingroup) instead of on a separate page (for HTML and Man pages) or # section (for LaTeX and RTF). INLINE_GROUPED_CLASSES = NO # When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and # unions with only public data fields will be shown inline in the documentation # of the scope in which they are defined (i.e. file, namespace, or group # documentation), provided this scope is documented. If set to NO (the default), # structs, classes, and unions are shown on a separate page (for HTML and Man # pages) or section (for LaTeX and RTF). INLINE_SIMPLE_STRUCTS = NO # 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 penalty. # 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 roughly 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 # Similar to the SYMBOL_CACHE_SIZE the size of the symbol lookup cache can be # set using LOOKUP_CACHE_SIZE. This cache is used to resolve symbols given # their name and scope. Since this can be an expensive process and often the # same symbol appear multiple times in the code, doxygen keeps a cache of # pre-resolved symbols. If the cache is too small doxygen will become slower. # If the cache is too large, memory is wasted. The cache size is given by this # formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range is 0..9, the default is 0, # corresponding to a cache size of 2^16 = 65536 symbols. LOOKUP_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 = YES # 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 namespaces 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 = NO # 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 = NO # 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 = YES # 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 # If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to # do proper type resolution of all parameters of a function it will reject a # match between the prototype and the implementation of a member function even # if there is only one candidate or it is obvious which candidate to choose # by doing a simple string match. By disabling STRICT_PROTO_MATCHING doxygen # will still accept a match between prototype and implementation in such cases. STRICT_PROTO_MATCHING = 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 = YES # 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 = YES # 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 macro 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 macros 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 = # The CITE_BIB_FILES tag can be used to specify one or more bib files # containing the references data. This must be a list of .bib files. The # .bib extension is automatically appended if omitted. Using this command # requires the bibtex tool to be installed. See also # http://en.wikipedia.org/wiki/BibTeX for more info. For LaTeX the style # of the bibliography can be controlled using LATEX_BIB_STYLE. To use this # feature you need bibtex and perl available in the search path. CITE_BIB_FILES = #--------------------------------------------------------------------------- # 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 = YES # 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 # The WARN_NO_PARAMDOC option can be enabled 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 = NO # 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 = #--------------------------------------------------------------------------- # 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 = ./../src # 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++ *.d *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh # *.hxx *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.dox *.py # *.f90 *.f *.for *.vhd *.vhdl FILE_PATTERNS = *.c \ *.tpp \ *.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 \ *.C \ *.CC \ *.C++ \ *.II \ *.I++ \ *.H \ *.HH \ *.H++ \ *.CS \ *.PHP \ *.PHP3 \ *.M \ *.MM # 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 be # 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. # Note that relative paths are relative to the directory from which doxygen is # run. EXCLUDE = # The EXCLUDE_SYMLINKS tag can be used to select whether or not files or # directories that are symbolic links (a Unix file system 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 = # 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 = NO # 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 or if # non of the patterns match the file name, INPUT_FILTER is applied. 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 # The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file # pattern. A pattern will override the setting for FILTER_PATTERN (if any) # and it is also possible to disable source filtering for a specific pattern # using *.ext= (so without naming a filter). This option only has effect when # FILTER_SOURCE_FILES is enabled. FILTER_SOURCE_PATTERNS = #--------------------------------------------------------------------------- # 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 = YES # 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 = YES # 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. Note that when using a custom header you are responsible # for the proper inclusion of any scripts and style sheets that doxygen # needs, which is dependent on the configuration options used. # It is advised to generate a default header using "doxygen -w html # header.html footer.html stylesheet.css YourConfigFile" and then modify # that header. Note that the header is subject to change so you typically # have to redo this when upgrading to a newer version of doxygen or when # changing the value of configuration settings such as GENERATE_TREEVIEW! 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 # style sheet in the HTML output directory as well, or it will be erased! HTML_STYLESHEET = # The HTML_EXTRA_FILES tag can be used to specify one or more extra images or # other source files which should be copied to the HTML output directory. Note # that these files will be copied to the base HTML output directory. Use the # $relpath$ marker in the HTML_HEADER and/or HTML_FOOTER files to load these # files. In the HTML_STYLESHEET file, use the file name only. Also note that # the files will be copied as-is; there are no commands or markers available. HTML_EXTRA_FILES = # The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. # Doxygen will adjust the colors in the style sheet 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 = NO # 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 (tabs) # at top of each HTML page. The value NO (the default) enables the index and # the value YES disables it. Since the tabs have the same information as the # navigation tree you can set this option to NO if you already set # GENERATE_TREEVIEW to YES. DISABLE_INDEX = NO # 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. # Since the tree basically has the same information as the tab index you # could consider to set DISABLE_INDEX to NO when enabling this option. GENERATE_TREEVIEW = NO # The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values # (range [0,1..20]) that doxygen will group on one line in the generated HTML # documentation. Note that a value of 0 will completely suppress the enum # values from appearing in the overview section. ENUM_VALUES_PER_LINE = 4 # 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 # Enable the USE_MATHJAX option to render LaTeX formulas using MathJax # (see http://www.mathjax.org) which uses client side Javascript for the # rendering instead of using prerendered bitmaps. Use this if you do not # have LaTeX installed or if you want to formulas look prettier in the HTML # output. When enabled you also need to install MathJax separately and # configure the path to it using the MATHJAX_RELPATH option. USE_MATHJAX = NO # When MathJax is enabled you need to specify the location relative to the # HTML output directory using the MATHJAX_RELPATH option. The destination # directory should contain the MathJax.js script. For instance, if the mathjax # directory is located at the same level as the HTML output directory, then # MATHJAX_RELPATH should be ../mathjax. The default value points to the # mathjax.org site, so you can quickly see the result without installing # MathJax, but it is strongly recommended to install a local copy of MathJax # before deployment. MATHJAX_RELPATH = http://www.mathjax.org/mathjax # The MATHJAX_EXTENSIONS tag can be used to specify one or MathJax extension # names that should be enabled during MathJax rendering. MATHJAX_EXTENSIONS = # 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 = NO # 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 disadvantages are 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, 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 = # The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for # the generated latex document. The footer should contain everything after # the last chapter. If it is left blank doxygen will generate a # standard footer. Notice: only use this tag if you know what you are doing! LATEX_FOOTER = # 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 # The LATEX_BIB_STYLE tag can be used to specify the style to use for the # bibliography, e.g. plainnat, or ieeetr. The default style is "plain". See # http://en.wikipedia.org/wiki/BibTeX for more info. LATEX_BIB_STYLE = plain #--------------------------------------------------------------------------- # 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 style sheet 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 = YES # 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 = YES # If the SEARCH_INCLUDES tag is set to YES (the default) the includes files # pointed to by INCLUDE_PATH will be searched when 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 = "WXUNUSED(x)=x" # 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 that # overrules the definition found in the source code. EXPAND_AS_DEFINED = # If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then # doxygen's preprocessor will remove all references to function-like macros # that are alone on a line, have an all uppercase name, and do not end with a # semicolon, because these 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 also works with HAVE_DOT disabled, but 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 use the Helvetica font for all dot files that # doxygen generates. When you want a differently looking font you can specify # the font name using DOT_FONTNAME. You 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 # 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 Helvetica font. # If you specify a different font using DOT_FONTNAME you can use DOT_FONTPATH to # set the path where dot can find it. 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 # 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 = NO # If set to YES, the inheritance and collaboration graphs will show the # relations between templates and their instances. TEMPLATE_RELATIONS = NO # 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 = NO # If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen # will generate a 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 svg, png, jpg, or gif. # If left blank png will be used. If you choose svg you need to set # HTML_FILE_EXTENSION to xhtml in order to make the SVG files # visible in IE 9+ (other browsers do not have this requirement). DOT_IMAGE_FORMAT = png # If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to # enable generation of interactive SVG images that allow zooming and panning. # Note that this requires a modern browser other than Internet Explorer. # Tested and working are Firefox, Chrome, Safari, and Opera. For IE 9+ you # need to set HTML_FILE_EXTENSION to xhtml in order to make the SVG files # visible. Older versions of IE do not have SVG support. INTERACTIVE_SVG = NO # 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 MSCFILE_DIRS tag can be used to specify one or more directories that # contain msc files that are included in the documentation (see the # \mscfile command). MSCFILE_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 = 50 # 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 plee-the-bear-20251226/bear-factory/animation-editor/src/000077500000000000000000000000001512343254000230005ustar00rootroot00000000000000plee-the-bear-20251226/bear-factory/animation-editor/src/CMakeLists.txt000066400000000000000000000000141512343254000255330ustar00rootroot00000000000000subdirs(bf) plee-the-bear-20251226/bear-factory/animation-editor/src/bf/000077500000000000000000000000001512343254000233675ustar00rootroot00000000000000plee-the-bear-20251226/bear-factory/animation-editor/src/bf/CMakeLists.txt000066400000000000000000000017261512343254000261350ustar00rootroot00000000000000cmake_minimum_required(VERSION 2.6) project(bf-animation-editor) set( BF_AE_TARGET_NAME bf-animation-editor ) include_directories( .. ${BEAR_FACTORY_EDITOR_INCLUDE_DIRECTORY}) #------------------------------------------------------------------------------- set( BF_AE_SOURCE_FILES code/about_dialog.cpp code/animation_editor.cpp code/configuration.cpp code/frame_duration_dialog.cpp code/main.cpp code/main_frame.cpp ) include(${wxWidgets_USE_FILE}) add_executable( ${BF_AE_TARGET_NAME} ${BF_AE_SOURCE_FILES} ) set_target_properties( ${BF_AE_TARGET_NAME} PROPERTIES INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/${BEAR_FACTORY_INSTALL_LIBRARY_DIR}" ) target_link_libraries( ${BF_AE_TARGET_NAME} bear-editor ${wxWidgets_LIBRARIES} ${CLAW_CONFIGURATION_FILE_LIBRARIES} ${CLAW_LOGGER_LIBRARIES} ${Boost_FILESYSTEM_LIBRARY} ${Boost_SYSTEM_LIBRARY} ) install( TARGETS ${BF_AE_TARGET_NAME} DESTINATION "${BEAR_FACTORY_INSTALL_EXECUTABLE_DIR}" ) plee-the-bear-20251226/bear-factory/animation-editor/src/bf/about_dialog.hpp000066400000000000000000000014101512343254000265250ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A dialog that displays some informations on the program. * \author Julien Jorge */ #ifndef __BF_ABOUT_DIALOG_HPP__ #define __BF_ABOUT_DIALOG_HPP__ #include namespace bf { /** * \brief A dialog that displays some informations on the program. * \author Julien Jorge */ class about_dialog: public wxDialog { public: about_dialog( wxWindow& parent ); wxString get_image_name() const; private: void create_controls(); }; // class about_dialog } // namespace bf #endif // __BF_ABOUT_DIALOG_HPP__ plee-the-bear-20251226/bear-factory/animation-editor/src/bf/animation_editor.hpp000066400000000000000000000022661512343254000274330ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief The class representing the application. * \author Julien Jorge */ #ifndef __BF_ANIMATION_EDITOR_HPP__ #define __BF_ANIMATION_EDITOR_HPP__ #include "bf/animation.hpp" #include "bf/base_editor_application.hpp" #include "bf/configuration.hpp" namespace bf { class workspace_environment; /** * \brief The class representing the application. * \author Julien Jorge */ class animation_editor: public base_editor_application { public: void configure(); void set_main_rect( const wxRect& r ); void compile( const wxString& path ) const; void update( const wxString& path ) const; void compile_animation( const animation& anim, const wxString& path ) const; private: bool do_init_app(const workspace_environment& default_env); void init_config(); private: /** \brief The configuration of the program. */ configuration m_config; }; // class animation_editor } // namespace bf #endif // __BF_ANIMATION_EDITOR_HPP__ plee-the-bear-20251226/bear-factory/animation-editor/src/bf/code/000077500000000000000000000000001512343254000243015ustar00rootroot00000000000000plee-the-bear-20251226/bear-factory/animation-editor/src/bf/code/about_dialog.cpp000066400000000000000000000040501512343254000274350ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bf::about_dialog class. * \author Julien Jorge */ #include "bf/about_dialog.hpp" #include #include #include #include "bf/version.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param parent The parent window. */ bf::about_dialog::about_dialog( wxWindow& parent ) : wxDialog( &parent, wxID_ANY, _("About"), wxDefaultPosition, wxSize(300, 200), wxDEFAULT_DIALOG_STYLE ) { create_controls(); } // about_dialog::about_dialog() /*----------------------------------------------------------------------------*/ /** * \brief Create the controls. */ void bf::about_dialog::create_controls() { wxBoxSizer* sizer = new wxBoxSizer( wxVERTICAL ); wxStaticText* text = new wxStaticText( this, wxID_ANY, _("Bear Factory"), wxDefaultPosition, wxDefaultSize, wxALIGN_CENTRE ); wxFont fnt; fnt.SetPointSize(20); fnt.SetWeight(wxFONTWEIGHT_BOLD); text->SetFont(fnt); sizer->Add( text, 0, wxEXPAND | wxALL, 5 ); text = new wxStaticText ( this, wxID_ANY, wxString::Format(_("Release %d.%d.%d, Animation editor"), BF_MAJOR_VERSION, BF_MINOR_VERSION, BF_RELEASE_NUMBER), wxDefaultPosition, wxDefaultSize, wxALIGN_CENTRE ); sizer->Add( text, 0, wxEXPAND | wxALL, 5 ); const wxString contrib_text = wxT("Copyright\n") wxT("\tS\u00E9bastien Angibaud\n") wxT("\tJulien Jorge\n"); wxTextCtrl* contrib = new wxTextCtrl( this, wxID_ANY, contrib_text, wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE | wxTE_READONLY ); sizer->Add( contrib, 1, wxEXPAND | wxALL, 5 ); sizer->Add( CreateStdDialogButtonSizer(wxOK), 0, wxALL | wxCENTER, 5 ); SetSizer(sizer); } // about_dialog::create_controls() plee-the-bear-20251226/bear-factory/animation-editor/src/bf/code/animation_editor.cpp000066400000000000000000000126451512343254000303420ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bf::animation_editor class. * \author Julien Jorge. */ #include "bf/animation_editor.hpp" #include "bf/animation_file_xml_reader.hpp" #include "bf/animation_file_xml_writer.hpp" #include "bf/compilation_context.hpp" #include "bf/config_frame.hpp" #include "bf/main_frame.hpp" #include "bf/path_configuration.hpp" #include "bf/version.hpp" #include #include #include #include #include #include /*----------------------------------------------------------------------------*/ /** * \brief Configure the program. */ void bf::animation_editor::configure() { config_frame dlg(NULL); if ( dlg.ShowModal() == wxID_OK ) { // TO DO : // Call update_image_pool() for each main_frame ; } } // animation_editor::configure() /*----------------------------------------------------------------------------*/ /** * \brief Save the position and the size of the main frame. */ void bf::animation_editor::set_main_rect( const wxRect& r ) { m_config.main_rect = r; m_config.save(); } // animation_editor::set_main_rect() /*----------------------------------------------------------------------------*/ /** * \brief Compile an animation. * \param path The path to the animation file. */ void bf::animation_editor::compile( const wxString& path ) const { wxXmlDocument doc; if ( doc.Load(path) ) { std::string w = path_configuration::get_instance().search_workspace ( wx_to_std_string(path) ); if ( ! w.empty() ) { workspace_environment env(w); animation_file_xml_reader reader; animation anim( reader.load( doc.GetRoot(), env ) ); compile_animation(anim, path); } } else throw claw::exception("Can't load XML file."); } // animation_editor::compile() /*----------------------------------------------------------------------------*/ /** * \brief Update an animation. * \param path The path to the animation file. */ void bf::animation_editor::update( const wxString& path ) const { wxXmlDocument doc; animation anim; if ( doc.Load(path) ) { std::string w = path_configuration::get_instance().search_workspace ( wx_to_std_string(path) ); workspace_environment env; if ( ! w.empty() ) env = workspace_environment( w ); animation_file_xml_reader reader; anim = reader.load( doc.GetRoot(), env ); } else throw claw::exception("Can't load XML file."); animation_file_xml_writer writer; std::ofstream f( wx_to_std_string(path).c_str() ); writer.save(f, anim); } // animation_editor::update() /*----------------------------------------------------------------------------*/ /** * \brief Compile an animation. * \param anim The animation to compile. * \param path The path to the animation file. * \return true if the compilation went ok. */ void bf::animation_editor::compile_animation ( const animation& anim, const wxString& path ) const { std::string std_path( wx_to_std_string(path) ); std::size_t pos = std_path.rfind(".anim"); if ( pos != std::string::npos ) std_path = std_path.substr(0, pos); std_path += ".canim"; std::ofstream f( std_path.c_str() ); if (f) { std::string w = path_configuration::get_instance().search_workspace ( wx_to_std_string(path) ); workspace_environment env; if ( ! w.empty() ) env = workspace_environment( w ); compiled_file cf(f); cf << BF_MAJOR_VERSION << BF_MINOR_VERSION << BF_RELEASE_NUMBER; compilation_context context ( std::numeric_limits::max(), env ); anim.compile(cf, context); } else throw claw::exception("Can't open the animation file."); } // animation_editor::compile_animation() /*----------------------------------------------------------------------------*/ /** * \brief Initialize the application. * \param default_env Default workspace_environment. */ bool bf::animation_editor::do_init_app ( const workspace_environment& default_env ) { bool result = false; init_config(); main_frame* frame = NULL; if (argc > 1) for (int i=1; iload_animation( argv[i] ); frame->Show(); result = true; } else std::cout << "Error. No workspace is available for animation " << wx_to_std_string( argv[i] ) << std::endl; } else { frame = new main_frame( default_env ); frame->SetSize( m_config.main_rect ); frame->Show(); result = true; } return result; } // animation_editor::do_init_app() /*----------------------------------------------------------------------------*/ /** * \brief Load and apply the configuration. */ void bf::animation_editor::init_config() { m_config.load(); } // animation_editor::init_config() plee-the-bear-20251226/bear-factory/animation-editor/src/bf/code/configuration.cpp000066400000000000000000000110031512343254000276470ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bf::configuration class. * \author Julien Jorge */ #include "bf/configuration.hpp" #include "bf/path_configuration.hpp" #include #include #include /*----------------------------------------------------------------------------*/ const std::string bf::configuration::s_config_file_name = "animation-editor.config"; const char bf::configuration::s_section_left = '['; const char bf::configuration::s_section_right = ']'; const char bf::configuration::s_comment = '#'; const char bf::configuration::s_field_assign = '='; const std::string bf::configuration::s_main_frame_section = "main_frame"; const std::string bf::configuration::s_x_field = "x"; const std::string bf::configuration::s_y_field = "y"; const std::string bf::configuration::s_width_field = "width"; const std::string bf::configuration::s_height_field = "height"; /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ bf::configuration::configuration() { load(); } // configuration::configuration() /*----------------------------------------------------------------------------*/ /** * \brief Load the configuration. */ void bf::configuration::load() { if ( create_config_file() ) { std::string path ( path_configuration::get_instance().get_config_directory() + s_config_file_name ); std::ifstream f( path.c_str() ); if (f) { claw::configuration_file config(f); main_rect = read_rect( config, s_main_frame_section ); } } } // configuration::load() /*----------------------------------------------------------------------------*/ /** * \brief Save the configuration. */ void bf::configuration::save() const { if ( create_config_file() ) { std::string path ( path_configuration::get_instance().get_config_directory() + s_config_file_name ); std::ofstream f( path.c_str() ); if (f) { f << '\n' << s_section_left << s_main_frame_section << s_section_right << '\n' << s_comment << " Position and size of the main window\n"; write_rect( f, main_rect ); f << '\n'; } } } // configuration::save() /*----------------------------------------------------------------------------*/ /** * \brief Create the configuration file, if it does not exists. * \return true if the file already exists or if it has been created. */ bool bf::configuration::create_config_file() const { bool result = false; const boost::filesystem::path path ( path_configuration::get_instance().get_config_directory() + s_config_file_name ); if ( !boost::filesystem::exists( path ) ) { std::ofstream f( path.string().c_str() ); f << s_comment << " Configuration file for Bear Factory - Animation editor\n"; } if ( boost::filesystem::exists( path ) ) result = !boost::filesystem::is_directory( path ); return result; } // configuration::create_config_file() /*----------------------------------------------------------------------------*/ /** * \brief Read a wxRect from a configuration file. * \param config The configuration file. * \param section The name of the section in which we get the rectangle. */ wxRect bf::configuration::read_rect ( const claw::configuration_file& config, const std::string& section ) const { wxRect result( wxDefaultPosition, wxDefaultSize ); std::istringstream iss ( config(section, s_x_field) + ' ' + config(section, s_y_field) + ' ' + config(section, s_width_field) + ' ' + config(section, s_height_field) ); iss >> result.x >> result.y >> result.width >> result.height; return result; } // configuration::read_rect() /*----------------------------------------------------------------------------*/ /** * \brief Write a wxRect in a file. * \param f The file to write in. * \param r The rectangle to write. */ void bf::configuration::write_rect( std::ostream& f, const wxRect& r ) const { f << s_x_field << ' ' << s_field_assign << ' ' << r.x << '\n' << s_y_field << ' ' << s_field_assign << ' ' << r.y << '\n' << s_width_field << ' ' << s_field_assign << ' ' << r.width << '\n' << s_height_field << ' ' << s_field_assign << ' ' << r.height << '\n'; } // configuration::write_rect() plee-the-bear-20251226/bear-factory/animation-editor/src/bf/code/frame_duration_dialog.cpp000066400000000000000000000050141512343254000313230ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bf::frame_duration_dialog class. * \author Julien Jorge */ #include "bf/frame_duration_dialog.hpp" #include /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param parent Parent window. */ bf::frame_duration_dialog::frame_duration_dialog( wxWindow* parent ) : wxDialog(parent, wxID_ANY, wxT("Change frame durations"), wxDefaultPosition, wxDefaultSize) { create_controls(); Fit(); } // frame_duration_dialog::frame_duration_dialog() /*----------------------------------------------------------------------------*/ /** * \brief Get the value of the operand applied to the frames. */ double bf::frame_duration_dialog::get_operand() const { return m_operand->GetValue(); } // frame_duration_dialog::get_operand() /*----------------------------------------------------------------------------*/ /** * \brief Tell how to apply the operand to the durations. */ bf::frame_duration_dialog::duration_application_mode bf::frame_duration_dialog::get_mode() const { duration_application_mode result(duration_replace); switch ( m_mode->GetSelection() ) { case 0: result = duration_replace; break; case 1: result = duration_add; break; case 2: result = duration_multiply; break; } return result; } // frame_duration_dialog::get_mode() /*----------------------------------------------------------------------------*/ /** * \brief Create the controls of the dialog. */ void bf::frame_duration_dialog::create_controls() { wxBoxSizer* sizer = new wxBoxSizer( wxVERTICAL ); wxArrayString choices; choices.Add(_("Replace previous duration.")); choices.Add(_("Add to previous duration.")); choices.Add(_("Multiply previous duration.")); m_mode = new wxRadioBox (this, wxID_ANY, _("Application mode"), wxDefaultPosition, wxDefaultSize, choices); m_mode->SetSelection(0); m_operand = new spin_ctrl(this); m_operand->SetRange(0, std::numeric_limits::max()); m_operand->SetValue(1); m_operand->SetStep(0.1); sizer->Add( m_mode, 1, wxEXPAND | wxALL, 5 ); sizer->Add( m_operand, 0, wxEXPAND | wxALL, 5 ); sizer->Add ( CreateStdDialogButtonSizer(wxOK | wxCANCEL), 0, wxALL | wxCENTER, 5 ); SetSizer(sizer); } // frame_duration_dialog::create_controls() plee-the-bear-20251226/bear-factory/animation-editor/src/bf/code/main.cpp000066400000000000000000000005471512343254000257370ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Main procedure of the program. * \author Julien Jorge. */ #include "bf/animation_editor.hpp" IMPLEMENT_APP(bf::animation_editor) plee-the-bear-20251226/bear-factory/animation-editor/src/bf/code/main_frame.cpp000066400000000000000000000407041512343254000271100ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bf::main_frame class. * \author Julien Jorge */ #include "bf/main_frame.hpp" #include "bf/animation_editor.hpp" #include "bf/about_dialog.hpp" #include "bf/frame_duration_dialog.hpp" #include "bf/image_pool.hpp" #include "bf/animation_file_xml_reader.hpp" #include "bf/animation_file_xml_writer.hpp" #include "bf/path_configuration.hpp" #include "bf/workspace.hpp" #include "bf/workspace_environment.hpp" #include "bf/wx_facilities.hpp" #include "bf/icon/compile.xpm" #include #include #include #include DECLARE_APP(bf::animation_editor) /*----------------------------------------------------------------------------*/ /** * \brief Default constructor. * \param env The workspace environment. */ bf::main_frame::main_frame( const workspace_environment& env ) : wxFrame(NULL, wxID_ANY, wxT("Bear Factory - Animation editor")), m_workspace(env) { create_menu(); create_toolbar(); create_controls(); Fit(); } // main_frame::main_frame() /*----------------------------------------------------------------------------*/ /** * \brief Load an animation. * \param path The path to the animation to load. */ void bf::main_frame::load_animation( const wxString& path ) { wxLogNull no_log; wxXmlDocument doc; animation_file_xml_reader reader; animation anim; if ( doc.Load(path) ) anim = reader.load( doc.GetRoot(), m_workspace ); m_animation_edit->set_value(anim); m_last_saved_animation = m_animation_edit->get_value(); m_animation_file = path; make_title(); } // main_frame::load_animation() /*----------------------------------------------------------------------------*/ /** * \brief Make the title of the window. */ void bf::main_frame::make_title() { if ( m_animation_file.empty() ) SetTitle( wxT("Bear Factory - Animation editor") ); else SetTitle( wxFileName(m_animation_file).GetName() ); if ( is_changed() ) SetTitle( GetTitle() + wxT("*") ); } // main_frame::make_title() /*----------------------------------------------------------------------------*/ /** * \brief Tell if the animation has changes that are not saved. */ bool bf::main_frame::is_changed() const { return m_last_saved_animation != m_animation_edit->get_value(); } // main_frame::is_changed() /*----------------------------------------------------------------------------*/ /** * \brief Save the animation. */ bool bf::main_frame::save() { bool result = false; if ( m_animation_file.empty() ) result = save_as(); else result = effective_save(); return result; } // main_frame::save() /*----------------------------------------------------------------------------*/ /** * \brief Save the animation and ask the file to the user. */ bool bf::main_frame::save_as() { bool result = false; wxFileDialog dlg( this, _("Choose a file"), wxEmptyString, m_animation_file, _("Animation files (*.anim)|*.anim"), wxFD_SAVE | wxFD_OVERWRITE_PROMPT ); if ( dlg.ShowModal() == wxID_OK ) { std::string w = path_configuration::get_instance().search_workspace ( wx_to_std_string( dlg.GetPath() ) ); if ( w == m_workspace.get_name() ) { m_animation_file = dlg.GetPath(); result = effective_save(); } else { wxMessageDialog dlg_err ( this, _("Error. This path does not contain required ressources."), _("Error"), wxCANCEL ); dlg_err.ShowModal(); } } return result; } // main_frame::save_as() /*----------------------------------------------------------------------------*/ /** * \brief Save the animation without asking anything. */ bool bf::main_frame::effective_save() { bool result = m_animation_edit->validate(); if (result) { std::string std_path( wx_to_std_string(m_animation_file) ); std::ofstream f( std_path.c_str() ); if (f) { animation_file_xml_writer writer; writer.save( f, m_animation_edit->get_value() ); m_last_saved_animation = m_animation_edit->get_value(); result = true; make_title(); } else { wxMessageDialog dlg ( this, _("Can't open the animation file."), _("Error"), wxOK ); dlg.ShowModal(); } } return result; } // main_frame::effective_save() /*----------------------------------------------------------------------------*/ /** * \brief Enable/disable the controls relative to the animation. * \param b Tell if the controls are enabled. */ void bf::main_frame::turn_animation_menu_entries( bool b ) { GetMenuBar()->Enable( wxID_SAVE, b ); GetMenuBar()->Enable( wxID_SAVEAS, b ); } // main_frame::turn_animation_menu_entries() /*----------------------------------------------------------------------------*/ /** * \brief Create the menu bar. */ void bf::main_frame::create_menu() { wxMenuBar* menu_bar = new wxMenuBar(); menu_bar->Append(create_animation_menu(), _("&Animation")); menu_bar->Append(create_edit_menu(), _("&Edit")); menu_bar->Append(create_help_menu(), _("&Help")); SetMenuBar(menu_bar); } // main_frame::create_menu() /*----------------------------------------------------------------------------*/ /** * \brief Create the toolbar. */ void bf::main_frame::create_toolbar() { wxToolBar* bar = CreateToolBar(); bar->AddTool ( wxID_NEW, _("&New"), wxArtProvider::GetBitmap(wxART_NEW), _("New") ); bar->AddTool ( wxID_OPEN, _("&Open"), wxArtProvider::GetBitmap(wxART_FILE_OPEN), _("Open") ); bar->AddTool ( wxID_SAVE, _("&Save"), wxArtProvider::GetBitmap(wxART_FILE_SAVE), _("Save") ); bar->AddSeparator(); bar->AddTool ( ID_COMPILE, _("&Compile"), wxBitmap(compile_xpm), _("Compile") ); bar->Realize(); } // main_frame::create_toolbar() /*----------------------------------------------------------------------------*/ /** * \brief Create the controls. */ void bf::main_frame::create_controls() { wxBoxSizer* sizer = new wxBoxSizer(wxHORIZONTAL); m_animation_edit = new animation_edit( *this, m_workspace ); sizer->Add(m_animation_edit, 1, wxEXPAND | wxALL, 5 ); SetSizer(sizer); SetStatusBar( new wxStatusBar(this, wxID_ANY) ); } // main_frame::create_controls() /*----------------------------------------------------------------------------*/ /** * \brief Create the "Edit" menu of the menu bar. */ wxMenu* bf::main_frame::create_edit_menu() const { wxMenu* menu = new wxMenu(); menu->Append ( ID_CHANGE_DURATION, _("&Change all durations..."), _("Change the duration of all frames at once.") ); return menu; } // main_frame::create_edit_menu() /*----------------------------------------------------------------------------*/ /** * \brief Create the "Animation" menu of the menu bar. */ wxMenu* bf::main_frame::create_animation_menu() const { wxMenu* menu = new wxMenu(); menu->Append( wxID_NEW, _("&New..."), _("Create a new animation.") ); menu->Append( wxID_OPEN, _("&Open..."), _("Open an existing animation.") ); menu->Append( wxID_SAVE, _("&Save"), _("Save the animation.") ); menu->Append( wxID_SAVEAS, _("Save &as..."), _("Save the animation under a new name.") ); menu->AppendSeparator(); menu->Append( ID_COMPILE, _("&Compile\tF9"), _("Compile the animation.") ); menu->AppendSeparator(); menu->Append( wxID_PREFERENCES, _("&Configuration..."), _("Configure the paths of the datas.") ); menu->Append( ID_UPDATE_IMAGE_POOL, _("&Update image pool"), _("Scan the directory of images for new images.") ); menu->AppendSeparator(); menu->Append( wxID_EXIT, _("&Exit"), _("Close the window.") ); return menu; } // main_frame::create_animation_menu() /*----------------------------------------------------------------------------*/ /** * \brief Create the "Help" menu of the menu bar. */ wxMenu* bf::main_frame::create_help_menu() const { wxMenu* menu = new wxMenu(); menu->Append( wxID_HELP, _("&Online documentation"), _("Open the online documentation in your web browser.") ); menu->AppendSeparator(); menu->Append( wxID_ABOUT, _("&About"), _("Display some informations about the program.") ); return menu; } // main_frame::create_help_menu() /*----------------------------------------------------------------------------*/ /** * \brief Save the configuration of the program. */ void bf::main_frame::save_config() { wxGetApp().set_main_rect(GetScreenRect()); } // main_frame::save_config() /*----------------------------------------------------------------------------*/ /** * \brief Compile the animation. */ void bf::main_frame::compile_animation() { Disable(); Refresh(); if ( m_animation_edit->validate() ) { bool do_it = true; if ( m_animation_file.IsEmpty() ) do_it = save_as(); if ( do_it ) compile_animation_no_check(); } Enable(); GetStatusBar()->SetStatusText( _("Compilation done."), 0 ); } // main_frame::compile_animation() /*----------------------------------------------------------------------------*/ /** * \brief Compile the animation without checking anything. */ void bf::main_frame::compile_animation_no_check() { try { wxGetApp().compile_animation ( m_animation_edit->get_value(), m_animation_file ); } catch ( std::exception& e ) { wxMessageDialog dlg ( this, _("Error"), std_to_wx_string(e.what()), wxOK ); dlg.ShowModal(); } } // main_frame::compile_animation_no_check() /*----------------------------------------------------------------------------*/ /** * \brief Answer to a click on "Configuration" menu. * \param event This event occured. */ void bf::main_frame::on_configuration_menu( wxCommandEvent& WXUNUSED(event) ) { wxGetApp().configure(); } // main_frame::on_configuration_menu() /*----------------------------------------------------------------------------*/ /** * \brief Answer to a click on "Update image pool" menu. * \param event This event occured. */ void bf::main_frame::on_update_image_pool_menu ( wxCommandEvent& WXUNUSED(event) ) { // TO DO } // main_frame::on_update_image_pool_menu() /*----------------------------------------------------------------------------*/ /** * \brief Answer to a click on "New animation". * \param event This event occured. */ void bf::main_frame::on_new_animation( wxCommandEvent& WXUNUSED(event) ) { main_frame* frame = new main_frame( m_workspace ); frame->Show(); } // main_frame::on_new_level() /*----------------------------------------------------------------------------*/ /** * \brief Answer to a click on "Open animation". * \param event This event occured. */ void bf::main_frame::on_open_animation( wxCommandEvent& WXUNUSED(event) ) { const wxFileName path(m_animation_file); wxFileDialog dlg ( this, _("Choose an animation"), path.GetPath(), wxEmptyString, _("Animation files (*.anim)|*.anim"), wxFD_OPEN | wxFD_FILE_MUST_EXIST ); if ( dlg.ShowModal() == wxID_OK ) { std::string w = path_configuration::get_instance().search_workspace ( wx_to_std_string(dlg.GetPath()) ); if ( ! w.empty() ) { if ( is_changed() || !m_animation_file.empty() ) { main_frame* frm = new main_frame( workspace_environment(w) ); frm->load_animation( dlg.GetPath() ); frm->Show(); } else load_animation( dlg.GetPath() ); } } } // main_frame::on_open_animation() /*----------------------------------------------------------------------------*/ /** * \brief Answer to a click on "Save". * \param event This event occured. */ void bf::main_frame::on_save( wxCommandEvent& WXUNUSED(event) ) { save(); } // main_frame::on_save() /*----------------------------------------------------------------------------*/ /** * \brief Answer to a click on "Save as". * \param event This event occured. */ void bf::main_frame::on_save_as( wxCommandEvent& WXUNUSED(event) ) { save_as(); } // main_frame::on_save_as() /*----------------------------------------------------------------------------*/ /** * \brief Answer to a click on "Compile". * \param event This event occured. */ void bf::main_frame::on_compile( wxCommandEvent& WXUNUSED(event) ) { compile_animation(); } // main_frame::on_compile() /*----------------------------------------------------------------------------*/ /** * \brief Answer to a click on "Exit". * \param event This event occured. */ void bf::main_frame::on_exit( wxCommandEvent& WXUNUSED(event) ) { Close(); } // main_frame::on_exit() /*----------------------------------------------------------------------------*/ /** * \brief Answer to a click on the menu to change the duration of the frames. * \param event This event occured. */ void bf::main_frame::on_change_duration( wxCommandEvent& WXUNUSED(event) ) { frame_duration_dialog dlg(this); if ( dlg.ShowModal() == wxID_OK ) { animation anim( m_animation_edit->get_value() ); switch( dlg.get_mode() ) { case frame_duration_dialog::duration_replace: for (std::size_t i=0; i!=anim.frames_count(); ++i) anim.get_frame(i).set_duration(dlg.get_operand()); break; case frame_duration_dialog::duration_add: for (std::size_t i=0; i!=anim.frames_count(); ++i) anim.get_frame(i).set_duration ( dlg.get_operand() + anim.get_frame(i).get_duration() ); break; case frame_duration_dialog::duration_multiply: for (std::size_t i=0; i!=anim.frames_count(); ++i) anim.get_frame(i).set_duration ( dlg.get_operand() * anim.get_frame(i).get_duration() ); break; } m_animation_edit->set_value(anim); } } // main_frame::on_change_duration() /*----------------------------------------------------------------------------*/ /** * \brief Answer to an activation of the "online doc" menu. * \param event This event occured. */ void bf::main_frame::on_online_doc( wxCommandEvent& WXUNUSED(event) ) { wxLaunchDefaultBrowser ( wxT("http://plee-the-bear.sourceforge.net/" ) wxT("wiki/index.php/%C9diteur_d'animations") ); } // main_frame::on_online_doc() /*----------------------------------------------------------------------------*/ /** * \brief Answer to an activation of the "about" menu. * \param event This event occured. */ void bf::main_frame::on_about( wxCommandEvent& WXUNUSED(event) ) { about_dialog dlg(*this); dlg.ShowModal(); } // main_frame::on_about() /*----------------------------------------------------------------------------*/ /** * \brief Procedure called when closing the window. * \param event This event occured. */ void bf::main_frame::on_close( wxCloseEvent& event ) { save_config(); bool quit = !event.CanVeto(); if ( !quit ) { quit = true; m_animation_edit->validate(); if ( is_changed() ) { wxMessageDialog dlg ( this, _("The animation is not saved." " Do you want to save it now?"), _("Animation is not saved."), wxYES_NO | wxCANCEL ); int answer = dlg.ShowModal(); if ( answer == wxID_CANCEL ) quit = false; else if ( answer == wxID_YES ) quit = save(); } } if ( quit ) event.Skip(); else event.Veto(); } // main_frame::on_close() /*----------------------------------------------------------------------------*/ BEGIN_EVENT_TABLE(bf::main_frame, wxFrame) EVT_MENU( wxID_PREFERENCES, bf::main_frame::on_configuration_menu ) EVT_MENU( bf::main_frame::ID_UPDATE_IMAGE_POOL, bf::main_frame::on_update_image_pool_menu ) EVT_MENU( wxID_NEW, bf::main_frame::on_new_animation ) EVT_MENU( wxID_OPEN, bf::main_frame::on_open_animation ) EVT_MENU( wxID_SAVE, bf::main_frame::on_save ) EVT_MENU( wxID_SAVEAS, bf::main_frame::on_save_as ) EVT_MENU( bf::main_frame::ID_COMPILE, bf::main_frame::on_compile ) EVT_MENU( wxID_EXIT, bf::main_frame::on_exit ) EVT_MENU( bf::main_frame::ID_CHANGE_DURATION, bf::main_frame::on_change_duration ) EVT_MENU( wxID_HELP, bf::main_frame::on_online_doc ) EVT_MENU( wxID_ABOUT, bf::main_frame::on_about ) EVT_CLOSE( bf::main_frame::on_close ) END_EVENT_TABLE() plee-the-bear-20251226/bear-factory/animation-editor/src/bf/configuration.hpp000066400000000000000000000041161512343254000267510ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief The configuration of our program. * \author Julien Jorge */ #ifndef __BF_CONFIGURATION_HPP__ #define __BF_CONFIGURATION_HPP__ #include #include #include #include namespace bf { /** * \brief The configuration of our program. * \author Julien Jorge */ class configuration { public: configuration(); void load(); void save() const; private: bool create_config_file() const; wxRect read_rect( const claw::configuration_file& config, const std::string& section ) const; void write_rect( std::ostream& f, const wxRect& r ) const; public: /** \brief Position and size of the main window. */ wxRect main_rect; private: /** \brief The name of the configuration file. */ static const std::string s_config_file_name; /** \brief Character written on the left of a section name in the configuration file. */ static const char s_section_left; /** \brief Character written on the right of a section name in the configuration file. */ static const char s_section_right; /** \brief Character used for comments in the configuration file. */ static const char s_comment; /** \brief Character used for assigning a value to a field. */ static const char s_field_assign; /** \brief Section of the main frame. */ static const std::string s_main_frame_section; /** \brief Label of the x-position fields. */ static const std::string s_x_field; /** \brief Label of the y-position fields. */ static const std::string s_y_field; /** \brief Label of the width fields. */ static const std::string s_width_field; /** \brief Label of the height fields. */ static const std::string s_height_field; }; // class configuration } // namespace bf #endif // __BF_CONFIGURATION_HPP__ plee-the-bear-20251226/bear-factory/animation-editor/src/bf/frame_duration_dialog.hpp000066400000000000000000000024311512343254000304160ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A dialog shown to change the duration of all frames at once. * \author Julien Jorge */ #ifndef __BF_FRAME_DURATION_DIALOG_HPP__ #define __BF_FRAME_DURATION_DIALOG_HPP__ #include "bf/spin_ctrl.hpp" namespace bf { /** * \brief A dialog shown to change the duration of all frames at once. * \author Julien Jorge */ class frame_duration_dialog: public wxDialog { public: /** \brief How the value must be applied to the frames. */ enum duration_application_mode { duration_replace, duration_add, duration_multiply }; // enum duration_application_mode public: frame_duration_dialog( wxWindow* parent ); double get_operand() const; duration_application_mode get_mode() const; private: void create_controls(); private: /** \brief How to apply the operand to the durations. */ wxRadioBox* m_mode; /** \brief The operand applied to the frames. */ spin_ctrl* m_operand; }; // class frame_duration_dialog } // namespace bf #endif // __BF_FRAME_DURATION_DIALOG_HPP__ plee-the-bear-20251226/bear-factory/animation-editor/src/bf/main_frame.hpp000066400000000000000000000046561512343254000262110ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief The main window of our program. * \author Julien Jorge */ #ifndef __BF_MAIN_FRAME_HPP__ #define __BF_MAIN_FRAME_HPP__ #include #include "bf/image_pool.hpp" #include "bf/animation_edit.hpp" #include "bf/workspace_environment.hpp" namespace bf { /** * \brief The main window of our program. * \author Julien Jorge */ class main_frame: public wxFrame { public: /** \brief The identifiers of the controls. */ enum control_id { ID_UPDATE_IMAGE_POOL, ID_COMPILE, ID_SCALE_DURATION, ID_CHANGE_DURATION }; // enum control_id public: main_frame(const workspace_environment& w); void load_animation( const wxString& path ); private: void search_workspace( const std::string& env ); void make_title(); bool is_changed() const; bool save(); bool save_as(); bool effective_save(); void turn_animation_menu_entries( bool b ); void create_menu(); void create_toolbar(); void create_controls(); wxMenu* create_animation_menu() const; wxMenu* create_edit_menu() const; wxMenu* create_help_menu() const; void save_config(); void compile_animation(); void compile_animation_no_check(); void on_configuration_menu(wxCommandEvent& event); void on_update_image_pool_menu(wxCommandEvent& event); void on_new_animation(wxCommandEvent& event); void on_open_animation(wxCommandEvent& event); void on_save(wxCommandEvent& event); void on_save_as(wxCommandEvent& event); void on_compile(wxCommandEvent& event); void on_exit(wxCommandEvent& event); void on_change_duration(wxCommandEvent& event); void on_online_doc(wxCommandEvent& event); void on_about(wxCommandEvent& event); void on_close(wxCloseEvent& event); private: /** \brief The animation editor. */ animation_edit* m_animation_edit; /** \brief The last saved animation. */ animation m_last_saved_animation; /** \brief The path to the animation file. */ wxString m_animation_file; /** \brief The workspace environment. */ workspace_environment m_workspace; DECLARE_EVENT_TABLE() }; // class main_frame } // namespace bf #endif // __BF_MAIN_FRAME_HPP__ plee-the-bear-20251226/bear-factory/bear-editor/000077500000000000000000000000001512343254000211435ustar00rootroot00000000000000plee-the-bear-20251226/bear-factory/bear-editor/CMakeLists.txt000066400000000000000000000000151512343254000236770ustar00rootroot00000000000000subdirs(src) plee-the-bear-20251226/bear-factory/bear-editor/doc/000077500000000000000000000000001512343254000217105ustar00rootroot00000000000000plee-the-bear-20251226/bear-factory/bear-editor/doc/Doxyfile000066400000000000000000002267221512343254000234310ustar00rootroot00000000000000# Doxyfile 1.7.6.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 sequence of words) that should # identify the project. Note that if you do not use Doxywizard you need # to put quotes around the project name if it contains spaces. PROJECT_NAME = "Bear Factory - Library for the editors of Plee the Bear" # 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. PROJECT_NUMBER = # Using the PROJECT_BRIEF tag one can provide an optional one line description # for a project that appears at the top of each page and should give viewer # a quick idea about the purpose of the project. Keep the description short. PROJECT_BRIEF = # With the PROJECT_LOGO tag one can specify an logo or icon that is # included in the documentation. The maximum height of the logo should not # exceed 55 pixels and the maximum width should not exceed 200 pixels. # Doxygen will copy the logo to the output directory. PROJECT_LOGO = # 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 = . # 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-Cyrillic, 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 = ./../src # 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 if your file system # 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 = NO # 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 = 8 # 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 = # This tag can be used to specify a number of word-keyword mappings (TCL only). # A mapping has the form "name=value". For example adding # "class=itcl::class" will allow you to use the command class in the # itcl::class meaning. TCL_SUBST = # 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 makes 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 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 the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and # unions are shown inside the group in which they are included (e.g. using # @ingroup) instead of on a separate page (for HTML and Man pages) or # section (for LaTeX and RTF). INLINE_GROUPED_CLASSES = NO # When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and # unions with only public data fields will be shown inline in the documentation # of the scope in which they are defined (i.e. file, namespace, or group # documentation), provided this scope is documented. If set to NO (the default), # structs, classes, and unions are shown on a separate page (for HTML and Man # pages) or section (for LaTeX and RTF). INLINE_SIMPLE_STRUCTS = NO # 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 penalty. # 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 roughly 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 # Similar to the SYMBOL_CACHE_SIZE the size of the symbol lookup cache can be # set using LOOKUP_CACHE_SIZE. This cache is used to resolve symbols given # their name and scope. Since this can be an expensive process and often the # same symbol appear multiple times in the code, doxygen keeps a cache of # pre-resolved symbols. If the cache is too small doxygen will become slower. # If the cache is too large, memory is wasted. The cache size is given by this # formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range is 0..9, the default is 0, # corresponding to a cache size of 2^16 = 65536 symbols. LOOKUP_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 = YES # 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 namespaces 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 = NO # 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 = NO # 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 = YES # 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 # If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to # do proper type resolution of all parameters of a function it will reject a # match between the prototype and the implementation of a member function even # if there is only one candidate or it is obvious which candidate to choose # by doing a simple string match. By disabling STRICT_PROTO_MATCHING doxygen # will still accept a match between prototype and implementation in such cases. STRICT_PROTO_MATCHING = 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 = YES # 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 = YES # 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 macro 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 macros 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 = # The CITE_BIB_FILES tag can be used to specify one or more bib files # containing the references data. This must be a list of .bib files. The # .bib extension is automatically appended if omitted. Using this command # requires the bibtex tool to be installed. See also # http://en.wikipedia.org/wiki/BibTeX for more info. For LaTeX the style # of the bibliography can be controlled using LATEX_BIB_STYLE. To use this # feature you need bibtex and perl available in the search path. CITE_BIB_FILES = #--------------------------------------------------------------------------- # 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 = YES # 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 # The WARN_NO_PARAMDOC option can be enabled 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 = #--------------------------------------------------------------------------- # 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 = ./../src # 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++ *.d *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh # *.hxx *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.dox *.py # *.f90 *.f *.for *.vhd *.vhdl FILE_PATTERNS = *.c \ *.tpp \ *.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 \ *.C \ *.CC \ *.C++ \ *.II \ *.I++ \ *.H \ *.HH \ *.H++ \ *.CS \ *.PHP \ *.PHP3 \ *.M \ *.MM # 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 be # 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. # Note that relative paths are relative to the directory from which doxygen is # run. EXCLUDE = # The EXCLUDE_SYMLINKS tag can be used to select whether or not files or # directories that are symbolic links (a Unix file system 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 = # 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 = NO # 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 or if # non of the patterns match the file name, INPUT_FILTER is applied. 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 # The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file # pattern. A pattern will override the setting for FILTER_PATTERN (if any) # and it is also possible to disable source filtering for a specific pattern # using *.ext= (so without naming a filter). This option only has effect when # FILTER_SOURCE_FILES is enabled. FILTER_SOURCE_PATTERNS = #--------------------------------------------------------------------------- # 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 = YES # 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 = YES # 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. Note that when using a custom header you are responsible # for the proper inclusion of any scripts and style sheets that doxygen # needs, which is dependent on the configuration options used. # It is advised to generate a default header using "doxygen -w html # header.html footer.html stylesheet.css YourConfigFile" and then modify # that header. Note that the header is subject to change so you typically # have to redo this when upgrading to a newer version of doxygen or when # changing the value of configuration settings such as GENERATE_TREEVIEW! 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 # style sheet in the HTML output directory as well, or it will be erased! HTML_STYLESHEET = # The HTML_EXTRA_FILES tag can be used to specify one or more extra images or # other source files which should be copied to the HTML output directory. Note # that these files will be copied to the base HTML output directory. Use the # $relpath$ marker in the HTML_HEADER and/or HTML_FOOTER files to load these # files. In the HTML_STYLESHEET file, use the file name only. Also note that # the files will be copied as-is; there are no commands or markers available. HTML_EXTRA_FILES = # The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. # Doxygen will adjust the colors in the style sheet 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 = NO # 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 (tabs) # at top of each HTML page. The value NO (the default) enables the index and # the value YES disables it. Since the tabs have the same information as the # navigation tree you can set this option to NO if you already set # GENERATE_TREEVIEW to YES. DISABLE_INDEX = NO # 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. # Since the tree basically has the same information as the tab index you # could consider to set DISABLE_INDEX to NO when enabling this option. GENERATE_TREEVIEW = NO # The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values # (range [0,1..20]) that doxygen will group on one line in the generated HTML # documentation. Note that a value of 0 will completely suppress the enum # values from appearing in the overview section. ENUM_VALUES_PER_LINE = 4 # 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 # Enable the USE_MATHJAX option to render LaTeX formulas using MathJax # (see http://www.mathjax.org) which uses client side Javascript for the # rendering instead of using prerendered bitmaps. Use this if you do not # have LaTeX installed or if you want to formulas look prettier in the HTML # output. When enabled you also need to install MathJax separately and # configure the path to it using the MATHJAX_RELPATH option. USE_MATHJAX = NO # When MathJax is enabled you need to specify the location relative to the # HTML output directory using the MATHJAX_RELPATH option. The destination # directory should contain the MathJax.js script. For instance, if the mathjax # directory is located at the same level as the HTML output directory, then # MATHJAX_RELPATH should be ../mathjax. The default value points to the # mathjax.org site, so you can quickly see the result without installing # MathJax, but it is strongly recommended to install a local copy of MathJax # before deployment. MATHJAX_RELPATH = http://www.mathjax.org/mathjax # The MATHJAX_EXTENSIONS tag can be used to specify one or MathJax extension # names that should be enabled during MathJax rendering. MATHJAX_EXTENSIONS = # 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 = NO # 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 disadvantages are 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, 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 = # The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for # the generated latex document. The footer should contain everything after # the last chapter. If it is left blank doxygen will generate a # standard footer. Notice: only use this tag if you know what you are doing! LATEX_FOOTER = # 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 # The LATEX_BIB_STYLE tag can be used to specify the style to use for the # bibliography, e.g. plainnat, or ieeetr. The default style is "plain". See # http://en.wikipedia.org/wiki/BibTeX for more info. LATEX_BIB_STYLE = plain #--------------------------------------------------------------------------- # 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 style sheet 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 = YES # 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 = YES # If the SEARCH_INCLUDES tag is set to YES (the default) the includes files # pointed to by INCLUDE_PATH will be searched when 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 = "WXUNUSED(x)=x" # 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 that # overrules the definition found in the source code. EXPAND_AS_DEFINED = # If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then # doxygen's preprocessor will remove all references to function-like macros # that are alone on a line, have an all uppercase name, and do not end with a # semicolon, because these 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 also works with HAVE_DOT disabled, but 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 use the Helvetica font for all dot files that # doxygen generates. When you want a differently looking font you can specify # the font name using DOT_FONTNAME. You 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 # 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 Helvetica font. # If you specify a different font using DOT_FONTNAME you can use DOT_FONTPATH to # set the path where dot can find it. 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 # 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 = NO # If set to YES, the inheritance and collaboration graphs will show the # relations between templates and their instances. TEMPLATE_RELATIONS = NO # 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 = NO # If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen # will generate a 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 svg, png, jpg, or gif. # If left blank png will be used. If you choose svg you need to set # HTML_FILE_EXTENSION to xhtml in order to make the SVG files # visible in IE 9+ (other browsers do not have this requirement). DOT_IMAGE_FORMAT = png # If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to # enable generation of interactive SVG images that allow zooming and panning. # Note that this requires a modern browser other than Internet Explorer. # Tested and working are Firefox, Chrome, Safari, and Opera. For IE 9+ you # need to set HTML_FILE_EXTENSION to xhtml in order to make the SVG files # visible. Older versions of IE do not have SVG support. INTERACTIVE_SVG = NO # 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 MSCFILE_DIRS tag can be used to specify one or more directories that # contain msc files that are included in the documentation (see the # \mscfile command). MSCFILE_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 = 50 # 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 plee-the-bear-20251226/bear-factory/bear-editor/src/000077500000000000000000000000001512343254000217325ustar00rootroot00000000000000plee-the-bear-20251226/bear-factory/bear-editor/src/CMakeLists.txt000066400000000000000000000000141512343254000244650ustar00rootroot00000000000000subdirs(bf) plee-the-bear-20251226/bear-factory/bear-editor/src/bf/000077500000000000000000000000001512343254000223215ustar00rootroot00000000000000plee-the-bear-20251226/bear-factory/bear-editor/src/bf/CMakeLists.txt000066400000000000000000000072571512343254000250740ustar00rootroot00000000000000cmake_minimum_required(VERSION 2.6) project(bear-editor) set( BF_E_TARGET_NAME bear-editor ) include_directories( .. ) #------------------------------------------------------------------------------- set( BF_E_SOURCE_FILES code/accelerator_table.cpp code/accordion.cpp code/animation.cpp code/animation_edit.cpp code/animation_file_edit.cpp code/animation_file_type.cpp code/animation_file_xml_reader.cpp code/animation_file_xml_writer.cpp code/animation_frame.cpp code/animation_player.cpp code/animation_view_ctrl.cpp code/any_animation.cpp code/any_animation_edit.cpp code/arithmetic_parser.cpp code/base_editor_application.cpp code/bitmap_rendering_attributes.cpp code/bitmap_rendering_attributes_edit.cpp code/bool_edit.cpp code/check_error.cpp code/class_not_found.cpp code/class_tree_ctrl.cpp code/color.cpp code/color_edit.cpp code/compilation_context.cpp code/compiled_file.cpp code/config_frame.cpp code/custom_type.cpp code/easing_combo.cpp code/easing_combo_popup.cpp code/easing_edit.cpp code/font.cpp code/font_edit.cpp code/frame_edit.cpp code/human_readable.cpp code/image_list_ctrl.cpp code/image_pool.cpp code/image_selection_dialog.cpp code/item_check_result.cpp code/item_class.cpp code/item_class_pool.cpp code/item_class_selection_dialog.cpp code/item_class_xml_parser.cpp code/item_comparator.cpp code/item_event.cpp code/item_field_edit.cpp code/item_instance.cpp code/item_reference_edit.cpp code/item_rendering_parameters.cpp code/path_configuration.cpp code/sample.cpp code/sample_edit.cpp code/slider_ctrl.cpp code/slider_with_ticks.cpp code/splash_screen.cpp code/sprite.cpp code/sprite_edit.cpp code/sprite_image_cache.cpp code/sprite_view.cpp code/sprite_view_ctrl.cpp code/stream_conv.cpp code/tree_builder.cpp code/trinary_logic.cpp code/type_field.cpp code/type_field_interval.cpp code/type_field_set.cpp code/workspace.cpp code/workspace_environment.cpp code/wx_type_cast.cpp opaque_rectangle/code/ler_base_problem.cpp opaque_rectangle/code/ler_horizontal_problem.cpp opaque_rectangle/code/ler_problem.cpp opaque_rectangle/code/ler_solver.cpp opaque_rectangle/code/test.cpp xml/code/exception.cpp xml/code/item_class_inherit_node.cpp xml/code/item_instance_node.cpp xml/code/item_instance_field_node.cpp xml/code/item_instance_fields_node.cpp xml/code/reader_tool.cpp xml/code/util.cpp xml/code/value_to_xml.cpp xml/code/xml_to_value.cpp ) if( WIN32 ) set( wxWidgets_LIBRARIES ${wxWidgets_LIBRARIES} gdi32 comdlg32 ole32 oleaut32 uuid ) endif( WIN32 ) include(${wxWidgets_USE_FILE}) if( WIN32 ) add_library( ${BF_E_TARGET_NAME} STATIC ${BF_E_SOURCE_FILES} ) add_definitions( "-DBEAR_EDITOR_EXPORT" ) else( WIN32 ) add_library( ${BF_E_TARGET_NAME} SHARED ${BF_E_SOURCE_FILES} ) endif( WIN32 ) set_target_properties( ${BF_E_TARGET_NAME} PROPERTIES INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/${BEAR_FACTORY_INSTALL_LIBRARY_DIR}" ) if( NOT WIN32 ) set_target_properties( ${BF_E_TARGET_NAME} PROPERTIES COMPILE_DEFINITIONS "BEAR_FACTORY_TEXT_DOMAIN_PATH=${CMAKE_INSTALL_PREFIX}/${TRANSLATIONS_INSTALL_DIR}" ) endif( NOT WIN32 ) set( BF_E_LINK_LIBRARIES ${wxWidgets_LIBRARIES} ${CLAW_LOGGER_LIBRARIES} ${CLAW_CONFIGURATION_FILE_LIBRARIES} ${Boost_FILESYSTEM_LIBRARY} ${Boost_THREAD_LIBRARY} ${Boost_SYSTEM_LIBRARY} ) if(APPLE) set( BF_E_LINK_LIBRARIES ${BF_E_LINK_LIBRARIES} intl ) endif(APPLE) target_link_libraries( ${BF_E_TARGET_NAME} ${BF_E_LINK_LIBRARIES} ) install( TARGETS ${BF_E_TARGET_NAME} DESTINATION "${BEAR_FACTORY_INSTALL_LIBRARY_DIR}" ) plee-the-bear-20251226/bear-factory/bear-editor/src/bf/accelerator_table.hpp000066400000000000000000000053231512343254000264700ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief The accelerator table stores the accelerators and their command for a * given event handler. * \author Julien Jorge */ #ifndef __BF_ACCELERATOR_TABLE__ #define __BF_ACCELERATOR_TABLE__ #include #include #include "bf/libeditor_export.hpp" namespace bf { /** * \brief The accelerator table stores the accelerators and their command for * a given event handler. * \author Julien Jorge */ class BEAR_EDITOR_EXPORT accelerator_table: public wxEvtHandler { public: /** * \brief The state of the control key in an accelerator. */ enum control_state { control_released, control_pressed }; // enum control_state /** * \brief The state of the alt key in an accelerator. */ enum alt_state { alt_released, alt_pressed }; // enum alt_state /** * \brief The state of the shift key in an accelerator. */ enum shift_state { shift_released, shift_pressed }; // enum shift_state private: /** * \brief The description of the keyboard state for an accelerator. */ class entry { public: entry ( int key_code, control_state ctrl, alt_state alt, shift_state shift ); bool operator<( const entry& that ) const; private: /** \brief The code of the key to press to trigger the accelerator. */ const int m_key_code; /** \brief The state of the control key to trigger the accelerator. */ const control_state m_control_state; /** \brief The state of the alt key to trigger the accelerator. */ const alt_state m_alt_state; /** \brief The state of the shift key to trigger the accelerator. */ const shift_state m_shift_state; }; // class entry /** \brief The map associating the commands to the accelerators. */ typedef std::map entry_map; public: accelerator_table( wxWindow& event_handler ); void add_accelerator ( wxEventType event_type, int key_code, control_state ctrl = control_released, alt_state alt = alt_released, shift_state shift = shift_released ); private: void on_key_pressed( wxKeyEvent& event ); private: /** \brief The instance that dispatches the key events on on which we dispatch the command events. */ wxWindow& m_event_handler; /** \brief The accelerators. */ entry_map m_accelerators; }; // class accelerator_table } // namespace bf #endif // __BF_ACCELERATOR_TABLE__ plee-the-bear-20251226/bear-factory/bear-editor/src/bf/accordion.hpp000066400000000000000000000024221512343254000247730ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief An accordion of controls. * \author Julien Jorge */ #ifndef __BF_ACCORDION_HPP__ #define __BF_ACCORDION_HPP__ #include #include #include namespace bf { /** * \brief An accordion of controls. * * Each added control is associated with a button that can be used to show or * Hide the control. At most one control can be visible at once. * * \author Julien Jorge */ class accordion: public wxPanel { public: accordion( wxWindow* parent, int orient ); void add( wxWindow* c, const wxString& label ); void add( wxSizer* s, const wxString& label ); private: void on_button( wxCommandEvent& event ); private: /** \brief The sizer in which the parts of the accordion are added. */ wxSizer* m_content; /** \brief The button of the currently visible sizer. */ wxToggleButton* m_current_button; /** \brief The sizers associated with each button. */ std::map m_sizers; }; // accordion } // namespace bf #endif // __BF_ACCORDION_HPP__ plee-the-bear-20251226/bear-factory/bear-editor/src/bf/animation.hpp000066400000000000000000000043151512343254000250140ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief The value of a field of type "animation". * \author Julien Jorge */ #ifndef __BF_ANIMATION__ #define __BF_ANIMATION__ #include #include "bf/animation_frame.hpp" #include "bf/libeditor_export.hpp" namespace bf { /** * \brief Animation type. * \author Julien Jorge */ class BEAR_EDITOR_EXPORT animation: public bitmap_rendering_attributes, public std::list { public: typedef std::list frame_list; public: animation(); bool operator==(const animation& that) const; bool operator!=(const animation& that) const; bool operator<(const animation& that) const; void set_frames( const frame_list& frames ); void set_loops( unsigned int loops ); void set_loop_back( bool b ); void set_first_index( unsigned int index ); void set_last_index( unsigned int index ); unsigned int get_loops() const; bool get_loop_back() const; unsigned int get_first_index() const; unsigned int get_last_index() const; animation_frame& add_frame(); animation_frame& get_frame(unsigned int index); const animation_frame& get_frame(unsigned int index) const; void delete_frame(unsigned int index); void reverse_frames(const std::list& indexes); void move_backward(unsigned int index); void move_forward(unsigned int index); sprite get_sprite(unsigned int index) const; claw::math::coordinate_2d get_max_size() const; std::size_t frames_count() const; double get_duration() const; void compile( compiled_file& f, compilation_context& c ) const; private: /** \brief Number of loops. */ unsigned int m_loops; /** \brief Play the animation backward. */ bool m_loop_back; /** \brief The index of the first frame of the loops. */ unsigned int m_first_index; /** \brief The index of the last frame of the loops. */ unsigned int m_last_index; }; // class animation } // namespace bf #endif // __BF_ANIMATION__ plee-the-bear-20251226/bear-factory/bear-editor/src/bf/animation_edit.hpp000066400000000000000000000077111512343254000260240ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief The window showing the properties of a animation. * \author Sebastien Angibaud */ #ifndef __BF_ANIMATION_EDIT_HPP__ #define __BF_ANIMATION_EDIT_HPP__ #include "bf/animation.hpp" #include "bf/base_edit.hpp" #include "bf/default_value.hpp" #include "bf/spin_ctrl.hpp" #include #include #include namespace bf { class animation_view_ctrl; class bitmap_rendering_attributes_edit; class image_pool; class workspace_environment; /** * \brief The window showing the properties of a animation. * \author Sebastien Angibaud */ class animation_edit: public wxPanel, public base_edit { public: /** \brief The identifiers of the controls. */ enum control_id { IDC_BOUND_INDEX_CHANGE, IDC_FRAME, IDC_REVERSE }; // enum control_id public: animation_edit ( wxWindow& parent, workspace_environment& env, const animation& anim = default_value::get() ); bool validate(); private: animation make_animation() const; void value_updated(); void update_frame_list(const animation& anim) const; void update_buttons() const; void update_spin_ctrl() const; void update_duration() const; void adjust_last_column_size(); void fill_controls() const; void create_controls(); void create_sizer_controls(); wxSizer* create_loops_sizer(); void edit_frame( long index ); void on_up( wxCommandEvent& event ); void on_down( wxCommandEvent& event ); void on_new( wxCommandEvent& event ); void on_copy( wxCommandEvent& event ); void on_frame_edit(wxListEvent& event); void on_frame_selected(wxListEvent& event); void on_frame_deselected(wxListEvent& event); void on_frame_button_edit( wxCommandEvent& event ); void on_delete( wxCommandEvent& event ); void on_reverse( wxCommandEvent& event ); void on_size(wxSizeEvent& event); void on_column_begin_drag(wxListEvent& event); void on_column_end_drag(wxListEvent& event); void on_bound_index_change( wxSpinEvent& event ); void on_refresh(wxCommandEvent& event); private: /** \brief The text control in which we configure the number of loops. */ bf::spin_ctrl* m_loops_spin; /** \brief The text control in which we configure the index of first frame * for loops. */ wxSpinCtrl* m_first_index_spin; /** \brief The text control in which we configure the index of last frame * for loops. */ wxSpinCtrl* m_last_index_spin; /** \brief The text control in which we configure the loop_back option. */ wxCheckBox* m_loop_back_box; /** \brief The control in which we configure the rendering attributes. */ bitmap_rendering_attributes_edit* m_rendering_attributes; /** \brief The control that displays the list of frame. */ wxListView* m_frame_list; /** \brief The button to copy a frame. */ wxButton* m_copy_button; /** \brief The button to edit a frame. */ wxButton* m_edit_button; /** \brief The button to move up a frame. */ wxButton* m_up_button; /** \brief The button to move_down a frame. */ wxButton* m_down_button; /** \brief The button to delete a frame. */ wxButton* m_delete_button; /** \brief The button to reverse frames. */ wxButton* m_reverse_button; /** \brief The label in which the duration of the animation is displayed. */ wxStaticText* m_duration_label; /** \brief The control in which we display the animation. */ animation_view_ctrl* m_animation_view; /** \brief The workspace environment to use. */ workspace_environment& m_workspace; DECLARE_EVENT_TABLE() }; // class animation_edit } // namespace bf #endif // __BF_ANIMATION_EDIT_HPP__ plee-the-bear-20251226/bear-factory/bear-editor/src/bf/animation_file_edit.hpp000066400000000000000000000043401512343254000270160ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Control for editing a field whose value is a path to an animation. * \author Julien Jorge */ #ifndef __BF_ANIMATION_FILE_EDIT_HPP__ #define __BF_ANIMATION_FILE_EDIT_HPP__ #include "bf/animation_file_type.hpp" #include "bf/base_edit.hpp" #include "bf/default_value.hpp" #include "bf/libeditor_export.hpp" #include namespace bf { class bitmap_rendering_attributes_edit; class animation_view_ctrl; class workspace_environment; /** * \brief Control for editing a field whose value is a path to an animation. * \author Julien Jorge */ class BEAR_EDITOR_EXPORT animation_file_edit: public wxPanel, public base_edit { public: /** \brief The identifiers of the controls. */ enum control_id { IDC_BROWSE_ANIMATION }; // enum control_id private: typedef base_edit super; public: animation_file_edit ( wxWindow& parent, workspace_environment& env, const animation_file_type& v = default_value::get() ); bool validate(); private: animation_file_type make_animation_file(workspace_environment& env) const; void value_updated(); void fill_controls(); void create_controls(); void create_sizer_controls(); wxSizer* create_path_sizer(); void animation_view_load(); void on_browse_animation(wxCommandEvent& event); void on_refresh( wxCommandEvent& event ); private: /** \brief The control in which we configure the rendering attributes. */ bitmap_rendering_attributes_edit* m_rendering_attributes; /** \brief The control in which we display the path to the animation. */ wxTextCtrl* m_path_text; /** \brief The control in which we display the animation. */ animation_view_ctrl* m_animation_view; /** \brief The workspace environment to use. */ workspace_environment& m_workspace; DECLARE_EVENT_TABLE() }; // class animation_file_edit } // namespace bf #endif // __BF_ANIMATION_FILE_EDIT_HPP__ plee-the-bear-20251226/bear-factory/bear-editor/src/bf/animation_file_type.hpp000066400000000000000000000027421512343254000270560ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief The value of a field of type "animation_file_type". * \author Julien Jorge */ #ifndef __BF_ANIMATION_FILE_TYPE_HPP__ #define __BF_ANIMATION_FILE_TYPE_HPP__ #include "bf/animation.hpp" #include "bf/libeditor_export.hpp" namespace bf { class workspace_environment; /** * \brief The file of an animation, associated with some rendering attributes. * \author Julien Jorge */ class BEAR_EDITOR_EXPORT animation_file_type: public bitmap_rendering_attributes { public: void set_path( const std::string& p, workspace_environment& env ); const std::string& get_path() const; animation get_animation() const; animation original_animation() const; void compile( compiled_file& f ) const; bool operator==( const animation_file_type& that ) const; bool operator!=( const animation_file_type& that ) const; bool operator<( const animation_file_type& that ) const; private: /** \brief The path of the animation file. */ std::string m_path; /** \brief The relative_path of the animation file. */ std::string m_relative_path; /** \brief The animation returned by original_animation(). */ animation m_animation; }; // class animation_file_type } // namespace bf #endif // __BF_ANIMATION_FILE_TYPE_HPP__ plee-the-bear-20251226/bear-factory/bear-editor/src/bf/animation_file_xml_reader.hpp000066400000000000000000000017211512343254000302130ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A class for reading source animation files. * \author Julien Jorge */ #ifndef __BF_ANIMATION_FILE_XML_READER_HPP__ #define __BF_ANIMATION_FILE_XML_READER_HPP__ #include "bf/animation.hpp" #include "bf/libeditor_export.hpp" #include #include namespace bf { class workspace_environment; /** * \brief A class for reading source animation files. * \author Julien Jorge */ class BEAR_EDITOR_EXPORT animation_file_xml_reader { public: animation load ( const wxString& file_path, workspace_environment& env ) const; animation load( wxXmlNode* node, workspace_environment& env ) const; }; // class animation_file_xml_reader } // namespace bf #endif // __BF_ANIMATION_FILE_XML_READER_HPP__ plee-the-bear-20251226/bear-factory/bear-editor/src/bf/animation_file_xml_writer.hpp000066400000000000000000000015151512343254000302660ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A class for writing source animation files. * \author Julien Jorge */ #ifndef __BF_ANIMATION_FILE_XML_WRITER_HPP__ #define __BF_ANIMATION_FILE_XML_WRITER_HPP__ #include "bf/animation.hpp" #include "bf/libeditor_export.hpp" #include #include namespace bf { /** * \brief A class for writing source animation files. * \author Julien Jorge */ class BEAR_EDITOR_EXPORT animation_file_xml_writer { public: void save( std::ostream& f, const animation& anim ) const; }; // class animation_file_xml_writer } // namespace bf #endif // __BF_ANIMATION_FILE_XML_WRITER_HPP__ plee-the-bear-20251226/bear-factory/bear-editor/src/bf/animation_frame.hpp000066400000000000000000000021111512343254000261560ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A frame in an animation. * \author Julien Jorge */ #ifndef __BF_ANIMATION_FRAME_HPP__ #define __BF_ANIMATION_FRAME_HPP__ #include "bf/sprite.hpp" #include "bf/libeditor_export.hpp" namespace bf { /** * \brief A frame is a element of an animation (a sprite and a time). */ class BEAR_EDITOR_EXPORT animation_frame { public: animation_frame(); void set_sprite(const sprite& spr); void set_duration(double time); const bf::sprite& get_sprite() const; double get_duration() const; bool operator==( const animation_frame& that ) const; bool operator<( const animation_frame& that ) const; private: /** \brief The sprite. */ sprite m_sprite; /** \brief The time during which the sprite is display. */ double m_duration; }; // class animation_frame } // namespace bf #endif // __BF_ANIMATION_FRAME_HPP__ plee-the-bear-20251226/bear-factory/bear-editor/src/bf/animation_player.hpp000066400000000000000000000032151512343254000263660ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief This class stores the status of an animation when reading it. * \author Julien Jorge */ #ifndef __BF_ANIMATION_PLAYER_HPP__ #define __BF_ANIMATION_PLAYER_HPP__ #include "bf/animation.hpp" #include "bf/libeditor_export.hpp" namespace bf { /** * \brief This class stores the status of an animation when reading it. * \author Julien Jorge */ class BEAR_EDITOR_EXPORT animation_player { public: animation_player( const animation& anim = animation() ); void set_animation( const animation& anim ); const animation& get_animation() const; void reset(); void next(); void next( double d ); double get_duration_until_next() const; double get_time() const; sprite get_sprite() const; void set_current_index( std::size_t index ); std::size_t get_current_index() const; bool is_finished() const; private: bool sequence_is_finished() const; void next_index(); void next_forward(); void next_backward(); private: /** \brief The displayed animation. */ animation m_animation; /** \brief Current frame. */ std::size_t m_index; /** \brief Are we playing in the normal order ? */ bool m_forward; /** \brief How many full playing have we done ? */ unsigned int m_play_count; /** \brief Time spent on the current frame. */ double m_time; }; // class animation_player } // namespace bf #endif // __BF_ANIMATION_PLAYER_HPP__ plee-the-bear-20251226/bear-factory/bear-editor/src/bf/animation_view_ctrl.hpp000066400000000000000000000050131512343254000270660ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief This control displays a animation and some buttons to play it. * \author Julien Jorge */ #ifndef __BF_ANIMATION_VIEW_CTRL_HPP__ #define __BF_ANIMATION_VIEW_CTRL_HPP__ #include "bf/animation_player.hpp" #include "bf/spin_ctrl.hpp" #include "bf/libeditor_export.hpp" namespace bf { class sprite_view_ctrl; class workspace_environment; /** * \brief This control displays a animation and some buttons to play it. * \author Julien Jorge */ class BEAR_EDITOR_EXPORT animation_view_ctrl: public wxPanel { public: /** \brief The identifiers of the controls. */ enum control_id { ID_PLAYER_START, ID_PLAYER_REWIND, ID_PLAYER_PLAY, ID_PLAYER_STOP, ID_PLAYER_FORWARD, ID_PLAYER_END, ID_SLIDER, ID_TIMER }; // enum control_id public: animation_view_ctrl ( wxWindow& parent, workspace_environment& env, const animation& anim = animation() ); void set_animation( const animation& anim ); private: void create_controls(); void create_sizers(); void display_current_sprite(); void set_timer_duration(); void next(); void on_player_start( wxCommandEvent& event ); void on_player_rewind( wxCommandEvent& event ); void on_player_play( wxCommandEvent& event ); void on_player_stop( wxCommandEvent& event ); void on_player_forward( wxCommandEvent& event ); void on_player_end( wxCommandEvent& event ); void on_scroll( wxScrollEvent& event ); void on_timer( wxTimerEvent& event ); private: /** \brief The workspace environment used. */ workspace_environment& m_workspace; /** \brief The control that displays the current sprite of the animation. */ sprite_view_ctrl* m_sprite_view; /** \brief The displayed animation. */ animation m_animation; /** \brief The player of the animation. */ animation_player m_player; /** \brief Slider displaying the position in the animation. */ wxSlider* m_slider; /** \brief The timer informing that we must change the frame. */ wxTimer m_timer; /** \brief A factor applied to the duration of the frames while playing. */ spin_ctrl* m_factor; DECLARE_EVENT_TABLE() }; // class animation_view_ctrl } // namespace bf #endif // __BF_ANIMATION_VIEW_CTRL_HPP__ plee-the-bear-20251226/bear-factory/bear-editor/src/bf/any_animation.hpp000066400000000000000000000042311512343254000256600ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A class that contains an animation or an animation_file_type, only one * at once. * \author Julien Jorge */ #ifndef __BF_ANY_ANIMATION_HPP__ #define __BF_ANY_ANIMATION_HPP__ #include "bf/animation_file_type.hpp" #include "bf/libeditor_export.hpp" namespace bf { class workspace_environment; /** * \brief A class that contains an animation or an animation_file_type, only * one at once. * \author Julien Jorge */ class BEAR_EDITOR_EXPORT any_animation { public: /** \brief The type of the animation effectively stored. */ enum content_type { /** \brief A completely detailed animation. */ content_animation, /** \brief An animation file.*/ content_file }; // enum content_type public: static std::string content_to_string( content_type c ); static content_type string_to_content( const std::string& c ); any_animation( content_type c = content_animation ); void set_animation_file( const animation_file_type& a ); void set_animation( const animation& a ); void reload(workspace_environment& env); const animation_file_type& get_animation_file() const; const animation& get_animation() const; animation get_current_animation() const; void switch_to( content_type c ); content_type get_content_type() const; void compile( compiled_file& f, compilation_context& c ) const; bool operator==( const any_animation& that ) const; bool operator!=( const any_animation& that ) const; bool operator<( const any_animation& that ) const; private: /** \brief The type of the animation on which we are working. */ content_type m_content_type; /** \brief The path of the animation file. */ animation_file_type m_animation_file; /** \brief The animation returned by original_animation(). */ animation m_animation; }; // class any_animation } // namespace bf #endif // __BF_ANY_ANIMATION_HPP__ plee-the-bear-20251226/bear-factory/bear-editor/src/bf/any_animation_edit.hpp000066400000000000000000000037771512343254000267030ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Control for editing a field whose value is any animation. * \author Julien Jorge */ #ifndef __BF_ANY_ANIMATION_EDIT_HPP__ #define __BF_ANY_ANIMATION_EDIT_HPP__ #include "bf/any_animation.hpp" #include "bf/base_edit.hpp" #include "bf/default_value.hpp" #include "bf/libeditor_export.hpp" #include namespace bf { class animation_edit; class animation_file_edit; class image_pool; /** * \brief Control for editing a field whose value is any animation. * \author Julien Jorge */ class BEAR_EDITOR_EXPORT any_animation_edit: public wxPanel, public base_edit { public: /** \brief The identifiers of the controls. */ enum control_id { IDC_CONTENT_TYPE }; // enum control_id private: typedef base_edit super; public: any_animation_edit ( wxWindow& parent, workspace_environment& env, const any_animation& v = default_value::get() ); bool validate(); private: void value_updated(); void fill_controls(); any_animation::content_type get_visible_content_type() const; void create_controls(); void create_sizer_controls(); void on_switch_content_type( wxCommandEvent& event ); private: /** \brief The control in which we display the type of the content currently edited. */ wxChoice* m_content_type; /** \brief The control used to edit the animation. */ animation_edit* m_animation_edit; /** \brief The control used to edit the animation file. */ animation_file_edit* m_animation_file_edit; /** \brief The workspace environment to use. */ workspace_environment& m_workspace; DECLARE_EVENT_TABLE() }; // class any_animation_edit } // namespace bf #endif // __BF_ANY_ANIMATION_EDIT_HPP__ plee-the-bear-20251226/bear-factory/bear-editor/src/bf/arithmetic_grammar.hpp000066400000000000000000000045541512343254000267010ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A parser for simple arithmetic expressions. * \author Julien Jorge */ #ifndef __BF_ARITHMETIC_GRAMMAR_HPP__ #define __BF_ARITHMETIC_GRAMMAR_HPP__ #include #include namespace bf { /** * \brief This grammar matches the arithmetic expressions. * \author Julien Jorge */ class arithmetic_grammar: public boost::spirit::classic::grammar { public: /** \brief The identifier of the rule that matches an arithmetic expression. */ static const int id_expression = 10; /** \brief The identifier of the rule that matches a term in an expression. */ static const int id_term = 20; /** \brief The identifier of the rule that matches a factor in an expression. */ static const int id_factor = 30; /** \brief The identifier of the rule that matches a real number. */ static const int id_real = 40; public: /** * \brief This class contains the rules of the grammar. */ template class definition { public: definition( const arithmetic_grammar& self ); const boost::spirit::classic::rule < Scanner, boost::spirit::classic::parser_tag >& start() const; private: /** \brief The rule that matches an arithmetic expression. */ boost::spirit::classic::rule < Scanner, boost::spirit::classic::parser_tag > m_expression; /** \brief The rule that matches a term in an expression. */ boost::spirit::classic::rule < Scanner, boost::spirit::classic::parser_tag > m_term; /** \brief The rule that matches a factor in an expression. */ boost::spirit::classic::rule < Scanner, boost::spirit::classic::parser_tag > m_factor; /** \brief The rule that matches a real number. */ boost::spirit::classic::rule < Scanner, boost::spirit::classic::parser_tag > m_real; }; // class definition }; // class arithmetic_grammar } // namespace bf #include "bf/impl/arithmetic_grammar.tpp" #endif // __BF_ARITHMETIC_GRAMMAR_HPP__ plee-the-bear-20251226/bear-factory/bear-editor/src/bf/arithmetic_parser.hpp000066400000000000000000000026331512343254000265430ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A parser for simple arithmetic expressions. * \author Julien Jorge */ #ifndef __BF_ARITHMETIC_PARSER_HPP__ #define __BF_ARITHMETIC_PARSER_HPP__ #include #include #include #include namespace bf { /** * \brief A parser for simple arithmetic expressions. * \author Julien Jorge */ class arithmetic_parser { private: typedef boost::spirit::classic::position_iterator iterator; typedef boost::spirit::classic::node_iter_data_factory node_factory; typedef boost::spirit::classic::tree_match tree_match; typedef tree_match::node_t tree_node; public: bool evaluate( double& result, std::string expr ) const; private: bool evaluate_tree( double& result, tree_node const& tree ) const; bool evaluate_operator ( double& result, char op, tree_node const& left_tree, tree_node const& right_tree ) const; bool parse_real( double& result, std::string s ) const; }; // class arithmetic_parser } // namespace bf #endif // __BF_ARITHMETIC_PARSER_HPP__ plee-the-bear-20251226/bear-factory/bear-editor/src/bf/base_edit.hpp000066400000000000000000000024571512343254000247610ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A base class owning the edited value for the controls that edit an * item property. * \author Julien Jorge */ #ifndef __BF_BASE_EDIT_HPP__ #define __BF_BASE_EDIT_HPP__ namespace bf { /** * \brief A base class owning the edited value for the controls that edit an * item property. * \author Julien Jorge */ template class base_edit { public: /** \brief The type of the value of the edited field. */ typedef Type value_type; public: base_edit( const value_type& v ); virtual ~base_edit(); /** \brief Check if the displayed value is correct and, if it is, set the value according to the display. */ virtual bool validate() = 0; const value_type& get_value() const; void set_value( const value_type& v ); protected: /** \brief Method called after changing the value by set_value(). */ virtual void value_updated() = 0; private: /** \brief The value. */ value_type m_value; }; // class base_edit } // namespace bf #include "bf/impl/base_edit.tpp" #endif // __BF_BASE_EDIT_HPP__ plee-the-bear-20251226/bear-factory/bear-editor/src/bf/base_editor_application.hpp000066400000000000000000000033201512343254000276730ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief The class representing the application. * \author Julien Jorge */ #ifndef __BF_BASE_EDITOR_APPLICATION_HPP__ #define __BF_BASE_EDITOR_APPLICATION_HPP__ #include namespace bf { class workspace_environment; /** * \brief The class representing the application. * \author Julien Jorge */ class base_editor_application: public wxApp { public: base_editor_application(); ~base_editor_application(); protected: virtual void compile( const wxString& path ) const; virtual void update( const wxString& path ) const; virtual bool do_init_app(const workspace_environment& env); virtual bool do_command_line_init(); private: bool OnInit(); bool get_worspace_name( std::string& result ); bool init_app(const workspace_environment& env); bool command_line_init(); bool compile_arguments() const; bool update_arguments() const; bool show_help(); bool show_version(); bool find_and_erase_option ( const wxString& long_name, const wxString& short_name ); bool find_and_erase_option_value ( const wxString& long_name, const wxString& short_name, std::string& result ); int find_option_index ( const wxString& long_name, const wxString& short_name ) const; void remove_options_at( int index, int count ); private: /** \brief The locale, for internationalization. */ wxLocale m_locale; }; // class base_editor_application } // namespace bf #endif // __BF_BASE_EDITOR_APPLICATION_HPP__ plee-the-bear-20251226/bear-factory/bear-editor/src/bf/base_file_edit.hpp000066400000000000000000000040101512343254000257430ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Base control for editing a field whose value is a path to a file. * \author Julien Jorge */ #ifndef __BF_BASE_FILE_EDIT_HPP__ #define __BF_BASE_FILE_EDIT_HPP__ #include "bf/simple_edit.hpp" #include #include #include #include namespace bf { class workspace_environment; /** * \brief Base control for editing a field whose value is a path to a file. * \author Julien Jorge */ template class base_file_edit: public simple_edit, public wxPanel { public: /** \brief The type of the content of the file. */ typedef T file_type; /** \brief The type of the current class. */ typedef base_file_edit self_type; /** \brief The type of the parent edit. */ typedef simple_edit super; /** \brief The identifiers of the controls. */ enum control_id { IDC_BROWSE }; // enum control_id public: base_file_edit ( wxWindow& parent, workspace_environment& env, const file_type& v ); base_file_edit ( wxWindow& parent, workspace_environment& env, const wxString& filter, const file_type& v ); bool validate(); void set_filter( wxString filter ); private: void value_updated(); void create_controls(); void on_browse(wxCommandEvent& event); private: /** \brief The filter of the file selection dialog. */ wxString m_filter; /** \brief Text control in which we display the path to the file. */ wxTextCtrl* m_path; /** \brief A button that opens the file selection dialog. */ wxButton* m_browse; /** \brief The workspace name. */ workspace_environment& m_workspace; }; // class base_file_edit } // namespace bf #include "bf/impl/base_file_edit.tpp" #endif // __BF_BASE_FILE_EDIT_HPP__ plee-the-bear-20251226/bear-factory/bear-editor/src/bf/bitmap_rendering_attributes.hpp000066400000000000000000000051261512343254000306150ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A class to represent rendering attributes for bitmaps (sprite, * animation). * \author Julien Jorge */ #ifndef __BF_BITMAP_RENDERING_ATTRIBUTES_HPP__ #define __BF_BITMAP_RENDERING_ATTRIBUTES_HPP__ #include #include "bf/color.hpp" #include "bf/libeditor_export.hpp" #include "bf/trinary_logic.hpp" namespace bf { class compiled_file; /** * \brief A class to represent the rendering attributes of a picture. * \author Julien Jorge */ class BEAR_EDITOR_EXPORT bitmap_rendering_attributes { public: bitmap_rendering_attributes(); bool operator==( const bitmap_rendering_attributes& that ) const; bool operator!=( const bitmap_rendering_attributes& that ) const; bool operator<( const bitmap_rendering_attributes& that ) const; const bf::color& get_color() const; bf::color& get_color(); void set_color(const bf::color& c); const claw::math::coordinate_2d& get_size() const; void set_auto_size( bool a ); bool get_auto_size() const; void set_size( const claw::math::coordinate_2d& s ); void set_size( unsigned int w, unsigned int h ); void set_width( unsigned int w ); void set_height( unsigned int h ); unsigned int width() const; unsigned int height() const; void set_angle( double angle ); double get_angle() const; void flip( trinary_logic::value_type b ); void mirror( trinary_logic::value_type b ); trinary_logic::value_type get_flipped_status() const; trinary_logic::value_type get_mirrored_status() const; void compile( compiled_file& f ) const; bitmap_rendering_attributes& assign( const bitmap_rendering_attributes& that ); void combine( const bitmap_rendering_attributes& that ); private: /** \brief The size of the bitmap on the screen. */ claw::math::coordinate_2d m_size; /** \brief Is the picture reversed along Y axis ? */ trinary_logic::value_type m_flip; /** \brief Is the picture reversed along X axis ? */ trinary_logic::value_type m_mirror; /** \brief The color. */ color m_color; /** \brief The angle on the screen. */ double m_angle; /** \brief Tell if the size is automatically computed. */ bool m_auto_size; }; // class bitmap_rendering_attributes } // namespace bf #endif // __BF_BITMAP_RENDERING_ATTRIBUTES_HPP__ plee-the-bear-20251226/bear-factory/bear-editor/src/bf/bitmap_rendering_attributes_edit.hpp000066400000000000000000000042761512343254000316270ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief The window showing the properties of a bitmap_rendering_attributes. * \author Julien Jorge */ #ifndef __BF_BITMAP_RENDERING_ATTRIBUTES_EDIT_HPP__ #define __BF_BITMAP_RENDERING_ATTRIBUTES_EDIT_HPP__ #include "bf/base_edit.hpp" #include "bf/bitmap_rendering_attributes.hpp" #include "bf/color_edit.hpp" #include "bf/spin_ctrl.hpp" #include "bf/libeditor_export.hpp" #include #include namespace bf { /** * \brief The window showing the properties of a bitmap_rendering_attributes. * \author Julien Jorge */ class BEAR_EDITOR_EXPORT bitmap_rendering_attributes_edit: public wxPanel, public base_edit { private: /** \brief The identifiers of the controls. */ enum control_id { ID_AUTO_SIZE }; // enum control_id public: bitmap_rendering_attributes_edit ( wxWindow& parent, const bitmap_rendering_attributes& spr ); bool validate(); private: void value_updated(); void fill_controls(); void create_controls(); wxSizer* create_size_and_placement_sizer(); wxSizer* create_color_sizer(); void on_auto_size( wxCommandEvent& event ); private: /** \brief Tell if the size is automatically computed. */ wxCheckBox* m_auto_size; /** \brief The text control in which we configure the width. */ wxSpinCtrl* m_width_spin; /** \brief The text control in which we configure the height. */ wxSpinCtrl* m_height_spin; /** \brief The control for configuring the angle. */ bf::spin_ctrl* m_angle_spin; /** \brief The control for configuring the flip_x option. */ wxCheckBox* m_flip_x_box; /** \brief The control for configuring the flip_y option. */ wxCheckBox* m_flip_y_box; /** \brief The control for configuring the color. */ color_edit* m_color_ctrl; DECLARE_EVENT_TABLE() }; // class bitmap_rendering_attributes_edit } // namespace bf #endif // __BF_BITMAP_RENDERING_ATTRIBUTES_EDIT_HPP__ plee-the-bear-20251226/bear-factory/bear-editor/src/bf/bool_edit.hpp000066400000000000000000000021561512343254000247760ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A control for editing a field that takes its value in a set. * \author Julien Jorge */ #ifndef __BF_BOOL_EDIT_HPP__ #define __BF_BOOL_EDIT_HPP__ #include "bf/base_edit.hpp" #include "bf/default_value.hpp" #include "bf/libeditor_export.hpp" #include namespace bf { /** * \brief A control for editing a field that can takes ites value in a set. * \author Julien Jorge */ class BEAR_EDITOR_EXPORT bool_edit: public base_edit, public wxCheckBox { public: /** \brief The type of the value of the edited field. */ typedef bool_type value_type; public: bool_edit ( wxWindow& parent, const value_type& v = default_value::get() ); bool validate(); private: void init(); void value_updated(); void on_change( wxCommandEvent& event ); }; // class bool_edit } // namespace bf #endif // __BF_BOOL_EDIT_HPP__ plee-the-bear-20251226/bear-factory/bear-editor/src/bf/call_by_field_type.hpp000066400000000000000000000024621512343254000266470ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A function object that calls an other function object according to the * type of a field. * \author Julien Jorge */ #ifndef __BF_CALL_BY_FIELD_TYPE_HPP__ #define __BF_CALL_BY_FIELD_TYPE_HPP__ namespace bf { class type_field; /** * \brief A function object that calls an other function object according to * the type of a field. * * \b Template \b parameters: * - \param F A template function object taking a field type as its argument. * * \author Julien Jorge */ template class F, typename R> class call_by_field_type { public: template R operator()( const type_field& f, A1& a1 ) const; template R operator()( const type_field& f, A1& a1, A2& a2 ) const; private: template R do_call( A1& a1 ) const; template R do_call( A1& a1, A2& a2 ) const; }; // class call_by_field_type } // namespace bf #include "bf/impl/call_by_field_type.tpp" #endif // __BF_CALL_BY_FIELD_TYPE_HPP__ plee-the-bear-20251226/bear-factory/bear-editor/src/bf/check_error.hpp000066400000000000000000000021531512343254000253210ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief This class carries a description of a problem found during the * check of the level. * \author Julien Jorge */ #ifndef __BF_CHECK_ERROR_HPP__ #define __BF_CHECK_ERROR_HPP__ #include namespace bf { /** * \brief This class carries a description of a problem found during the * check of the level. * \author Julien Jorge */ class check_error { public: explicit check_error( const std::string& msg ); check_error( const std::string& prefix, const std::string& msg ); const std::string& get_cause() const; const std::string& get_message() const; private: /** \brief The cause of the message describes the element on which the error occured. */ std::string m_cause; /** \brief The message describes the problem. */ std::string m_message; }; // class check_error } // namespace bf #endif // __BF_CHECK_ERROR_HPP__ plee-the-bear-20251226/bear-factory/bear-editor/src/bf/class_not_found.hpp000066400000000000000000000021351512343254000262130ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Exception thrown when a class is required but not found. * \author Julien Jorge */ #ifndef __BF_CLASS_NOT_FOUND_HPP__ #define __BF_CLASS_NOT_FOUND_HPP__ #include "bf/libeditor_export.hpp" #include #include namespace bf { /** * \brief Exception thrown when a class is required but not found. * \author Julien Jorge */ class BEAR_EDITOR_EXPORT class_not_found: public std::exception { public: class_not_found( const std::string& class_name ); virtual ~class_not_found() throw(); virtual const char* what() const throw(); const std::string& class_name() const throw(); private: /** \brief A short explanation of the problem. */ const std::string m_msg; /** \brief The name of the class. */ const std::string m_class_name; }; // class class_not_found } // namespace bf #endif // __BF_CLASS_NOT_FOUND_HPP__ plee-the-bear-20251226/bear-factory/bear-editor/src/bf/class_tree_ctrl.hpp000066400000000000000000000100751512343254000262050ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A wxTreeCtrl of the available item classes. * \author Julien Jorge */ #ifndef __BF_CLASS_TREE_CTRL_HPP__ #define __BF_CLASS_TREE_CTRL_HPP__ #include #include #include #include #include #include #include "bf/libeditor_export.hpp" #define class_selected_event_handler(func) \ (wxObjectEventFunction)(wxEventFunction) \ wxStaticCastEvent(bf::class_selected_event::function_type, &func) #define EVT_CLASS_SELECTED(id, func) \ wx__DECLARE_EVT1( bf::class_selected_event::class_selected_event_type, \ id, class_selected_event_handler(func) ) namespace bf { class item_class_pool; class tree_builder; class workspace_environment; /** * \brief Event sent when an item class is selected. * \author Julien Jorge */ class class_selected_event: public wxNotifyEvent { public: typedef void (wxEvtHandler::*function_type)(class_selected_event&); public: explicit class_selected_event ( const std::string& class_name, wxEventType t = wxEVT_NULL, wxWindowID id = wxID_ANY ); wxEvent* Clone() const; const std::string& get_class_name() const; public: static const wxEventType class_selected_event_type; private: /** \brief The name of the selected class. */ const std::string m_class_name; }; // class class_selected_event /** * \brief A wxTreeCtrl of the available item classes. * \author Julien Jorge */ class BEAR_EDITOR_EXPORT class_tree_ctrl: public wxPanel { public: /** \brief The identifiers of the controls. */ enum control_id { IDC_PATTERN, IDC_TREE, IDC_RECENT_USED_CLASSES }; // enum control_id public: class_tree_ctrl( wxWindow* parent, int id = wxID_ANY ); class_tree_ctrl ( wxWindow* parent, workspace_environment& env, int id = wxID_ANY ); void unset_workspace(); void set_workspace( workspace_environment& env ); wxTreeItemId GetSelection() const; bool ItemHasChildren( const wxTreeItemId& item ) const; wxString GetItemText( const wxTreeItemId& item ) const; void use_class( const std::string & c ); private: void add_recent_used_class( const std::string & c ); void create_controls(); void fill_tree(); void fill_recent_used_classes_list(); void create_categories_tree( tree_builder& tb ) const; wxString make_pattern() const; void select_class(bool shift_down); void select_class( const std::string& c ); void unselect_class_in_tree(); void unselect_recent_class(); void show_class_description(); void on_double_click(wxMouseEvent& event); void on_class_change(wxTreeEvent& event); void on_recent_class_change( wxListEvent& event ); void on_recent_class_activated( wxListEvent& event ); void on_key_up(wxKeyEvent& event); void on_mouse_move(wxMouseEvent& event); void on_pattern_change(wxCommandEvent& event); void on_size(wxSizeEvent& event); private: /** \brief The tree in which the class are stored. */ wxTreeCtrl* m_tree; /** \brief The control in which we can type a search pattern. */ wxTextCtrl* m_pattern; /** \brief The control in which we show the description of current class. */ wxStaticText* m_class_description; /** \brief The workspace used. */ workspace_environment* m_workspace; /** \brief The control in which we show recent used classes. */ wxListView* m_recent_used_classes_list; /** \brief List of recent used classes. */ std::list< std::string > m_recent_used_classes; /** \brief Current selected class. */ wxTextDataObject m_selected_class; DECLARE_EVENT_TABLE() }; // class class_tree_ctrl } // namespace bf #endif // __BF_CLASS_TREE_CTRL_HPP__ plee-the-bear-20251226/bear-factory/bear-editor/src/bf/code/000077500000000000000000000000001512343254000232335ustar00rootroot00000000000000plee-the-bear-20251226/bear-factory/bear-editor/src/bf/code/accelerator_table.cpp000066400000000000000000000067341512343254000274040ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bf::accelerator_table class. * \author Julien Jorge */ #include "bf/accelerator_table.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param key_code The code of the key to press to trigger the accelerator. * \param ctrl The state of the control key to trigger the accelerator. * \param alt The state of the alt key to trigger the accelerator. * \param shift The state of the shift key to trigger the accelerator. */ bf::accelerator_table::entry::entry ( int key_code, control_state ctrl, alt_state alt, shift_state shift ) : m_key_code(key_code), m_control_state(ctrl), m_alt_state(alt), m_shift_state(shift) { } // accelerator_table::entry::entry() /*----------------------------------------------------------------------------*/ /** * \brief Compares the entry with an other one, in lexicographic order of their * fields. * \param that The instance to compare to. */ bool bf::accelerator_table::entry::operator<( const entry& that ) const { if ( m_key_code != that.m_key_code ) return m_key_code < that.m_key_code; if ( m_control_state != that.m_control_state ) return m_control_state < that.m_control_state; if ( m_alt_state != that.m_alt_state ) return m_alt_state < that.m_alt_state; return m_shift_state < that.m_shift_state; } // accelerator_table::entry::operator<() /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param event_handler The instance that dispatches the key events on on which * we dispatch the command events. */ bf::accelerator_table::accelerator_table( wxWindow& event_handler ) : m_event_handler( event_handler ) { m_event_handler.Connect ( wxEVT_KEY_UP, wxKeyEventHandler(accelerator_table::on_key_pressed), NULL, this ); } // accelerator_table::accelerator_table() /*----------------------------------------------------------------------------*/ /** * \brief Adds an accelerator in the table. * \param event_type The type of the event dispatched when the accelerator is * validated. */ void bf::accelerator_table::add_accelerator ( wxEventType event_type, int key_code, control_state ctrl, alt_state alt, shift_state shift ) { m_accelerators[ entry(key_code, ctrl, alt, shift) ] = event_type; } // accelerator_table::add_accelerator() /*----------------------------------------------------------------------------*/ /** * \brief A key has been pressed, we dispatch an event for the corresponding * combination. * \param event The event describing the pressed keys. */ void bf::accelerator_table::on_key_pressed( wxKeyEvent& event ) { const control_state ctrl ( event.ControlDown() ? control_pressed : control_released ); const alt_state alt( event.AltDown() ? alt_pressed : alt_released ); const shift_state shift( event.ShiftDown() ? shift_pressed : shift_released ); const entry e( event.GetKeyCode(), ctrl, alt, shift ); const entry_map::const_iterator it( m_accelerators.find( e ) ); if ( it != m_accelerators.end() ) { wxCommandEvent command( wxEVT_COMMAND_MENU_SELECTED, it->second ); m_event_handler.GetEventHandler()->ProcessEvent( command ); } } // accelerator_table::on_key_pressed() plee-the-bear-20251226/bear-factory/bear-editor/src/bf/code/accordion.cpp000066400000000000000000000051671512343254000257110ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the accordion class. * \author Julien Jorge */ #include "bf/accordion.hpp" #include #include /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param parent The parent control of the accordion. * \param orient The orientation of the accordion: wxVERTICAL or wxHORIZONTAL. */ bf::accordion::accordion( wxWindow* parent, int orient ) : wxPanel(parent), m_current_button(NULL) { m_content = new wxBoxSizer(orient); SetSizer(m_content); } // accordion::accordion() /*----------------------------------------------------------------------------*/ /** * \brief Add something in the accordion. * \param c The control to add. * \param label The label associated to this control. */ void bf::accordion::add( wxWindow* c, const wxString& label ) { wxSizer* s = new wxBoxSizer( wxHORIZONTAL ); s->Add( c, 0, wxEXPAND ); add( s, label ); } // accordion::add() /*----------------------------------------------------------------------------*/ /** * \brief Add something in the accordion. * \param s The sizer to add. * \param label The label associated to this control. */ void bf::accordion::add( wxSizer* s, const wxString& label ) { wxToggleButton* btn = new wxToggleButton( this, wxID_ANY, label ); Connect( btn->GetId(), wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler(accordion::on_button) ); m_sizers[btn] = s; m_content->Add( btn, 0, wxEXPAND ); m_content->Add( s, 0, wxEXPAND ); m_content->Show(s, false, true); m_content->Layout(); } // accordion::add() /*----------------------------------------------------------------------------*/ /** * \brief The user clicked on a button of the accordion. * \param event The event generated by the click. */ void bf::accordion::on_button( wxCommandEvent& event ) { wxToggleButton* btn = dynamic_cast(event.GetEventObject()); CLAW_PRECOND( btn != NULL ); if ( btn == m_current_button ) { m_content->Show(m_sizers[m_current_button], false, true); m_current_button = NULL; } else { if ( m_current_button != NULL ) { m_content->Show(m_sizers[m_current_button], false, true); m_current_button->SetValue(false); } m_content->Show(m_sizers[btn], true, true); m_current_button = btn; } m_content->Layout(); } // accordion::on_button() plee-the-bear-20251226/bear-factory/bear-editor/src/bf/code/animation.cpp000066400000000000000000000254061512343254000257250ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bf::animation class. * \author Julien Jorge */ #include "bf/animation.hpp" #include "bf/compiled_file.hpp" #include "bf/version.hpp" #include /*----------------------------------------------------------------------------*/ /** * \brief Default constructor. */ bf::animation::animation() : m_loops(0), m_loop_back(false), m_first_index(0), m_last_index(0) { } // animation::animation() /*----------------------------------------------------------------------------*/ /** * \brief Tell if two animations are the same. * \param that The other animation. */ bool bf::animation::operator==(const animation& that) const { return (m_loops == that.m_loops) && (m_loop_back == that.m_loop_back) && (m_first_index == that.m_first_index) && (m_last_index == that.m_last_index) && bitmap_rendering_attributes::operator==(that) && ( static_cast< std::list >(*this) == static_cast< std::list >(that) ); } // animation::operator==() /*----------------------------------------------------------------------------*/ /** * \brief Tell if two animations are different. * \param that The other animation. */ bool bf::animation::operator!=(const animation& that) const { return !(*this == that); } // animation::operator!=() /*----------------------------------------------------------------------------*/ /** * \brief Compare with an other animation in lexicographic order of their * attributes. * \param that The other animation. */ bool bf::animation::operator<(const animation& that) const { if ( m_loops != that.m_loops ) return m_loops < that.m_loops; if ( m_loop_back != that.m_loop_back ) return m_loop_back < that.m_loop_back; if ( m_first_index != that.m_first_index ) return m_first_index < that.m_first_index; if ( m_last_index != that.m_last_index ) return m_last_index < that.m_last_index; if ( bitmap_rendering_attributes::operator!=(that) ) return bitmap_rendering_attributes::operator<(that); return std::lexicographical_compare( begin(), end(), that.begin(), that.end() ); } // animation::operator<() /*----------------------------------------------------------------------------*/ /** * \brief Set the frames of the animation. * \param frames The new frames. */ void bf::animation::set_frames( const frame_list& frames ) { clear(); insert(begin(), frames.begin(), frames.end()); set_size( get_max_size() ); } // animation::set_frames() /*----------------------------------------------------------------------------*/ /** * \brief Set the number of times the animation will be played. * \param loops The new value. */ void bf::animation::set_loops( unsigned int loops ) { m_loops = loops; } // animation::set_loops() /*----------------------------------------------------------------------------*/ /** * \brief Set the "play reverse at end" attribute of the animation. * \param b The new value. */ void bf::animation::set_loop_back( bool b ) { m_loop_back = b; } // animation::set_loop_back() /*----------------------------------------------------------------------------*/ /** * \brief Set the index of the first frame of the loops. * \param index The new index of first sprite. */ void bf::animation::set_first_index( unsigned int index ) { m_first_index = index; } // animation::set_first_index() /*----------------------------------------------------------------------------*/ /** * \brief Set the index of the last frame of the loops. * \param index The new index of tlast sprite. */ void bf::animation::set_last_index( unsigned int index ) { m_last_index = index; } // animation::set_last_index() /*----------------------------------------------------------------------------*/ /** * \brief Return the loops value. */ unsigned int bf::animation::get_loops() const { return m_loops; } // animation::get_loops() /*----------------------------------------------------------------------------*/ /** * \brief Return the loop_back value. */ bool bf::animation::get_loop_back() const { return m_loop_back; } // animation::get_loop_back() /*----------------------------------------------------------------------------*/ /** * \brief Return the index of the first frame for loops. */ unsigned int bf::animation::get_first_index() const { return m_first_index; } // animation::get_first_index() /*----------------------------------------------------------------------------*/ /** * \brief Return the index of the last frame for loops. */ unsigned int bf::animation::get_last_index() const { return m_last_index; } // animation::get_last_index() /*----------------------------------------------------------------------------*/ /** * \brief Add a frame at the end of the animation. */ bf::animation_frame& bf::animation::add_frame() { push_back( animation_frame() ); return back(); } // animation::add_frame() /*----------------------------------------------------------------------------*/ /** * \brief Get a frame given its index. * \param index The index of the frame to get. */ bf::animation_frame& bf::animation::get_frame(unsigned int index) { CLAW_PRECOND(index < size() ); iterator it = begin(); std::advance(it, index); return *it; } // animation::get_frame() /*----------------------------------------------------------------------------*/ /** * \brief Get a frame given its index. * \param index The index of the frame to get. */ const bf::animation_frame& bf::animation::get_frame(unsigned int index) const { CLAW_PRECOND(index < size() ); const_iterator it = begin(); std::advance(it, index); return *it; } // animation::get_frame() /*----------------------------------------------------------------------------*/ /** * \brief Delete a frame. * \param index The index of the frame to remove. */ void bf::animation::delete_frame(unsigned int index) { CLAW_PRECOND(index < size() ); iterator it = begin(); std::advance(it, index); erase(it); } // animation::delete_frame() /*----------------------------------------------------------------------------*/ /** * \brief Reverse some frames. * \param indexes The indexes of the frame to reverse. */ void bf::animation::reverse_frames(const std::list& indexes) { std::list index_list(indexes); while ( index_list.size() > 1 ) { iterator it_first = begin(); std::advance( it_first, index_list.front() ); iterator it_end = begin(); std::advance( it_end, index_list.back() ); std::swap(*it_first, *it_end); index_list.pop_front(); index_list.pop_back(); } } // animation::reverse_frames() /*----------------------------------------------------------------------------*/ /** * \brief Move a frame one position backward. * \param index The index of the frame to move. */ void bf::animation::move_backward(unsigned int index) { CLAW_PRECOND(index < size() ); if (index > 0) { iterator it = begin(); std::advance(it, index); iterator prec(it); --prec; std::swap(*prec, *it); } } // animation::move_backward() /*----------------------------------------------------------------------------*/ /** * \brief Move a frame one position backward. * \param index The index of the frame to move. */ void bf::animation::move_forward(unsigned int index) { CLAW_PRECOND(index < size() ); if (index + 1 < size() ) { iterator it = begin(); std::advance(it, index); iterator next(it); ++next; std::swap(*it, *next); } } // animation::move_forward() /*----------------------------------------------------------------------------*/ /** * \brief Get a sprite given its index. The sprite has the attributes of the * frame combined with those of the animation. * \param index The index of the sprite to get. */ bf::sprite bf::animation::get_sprite(unsigned int index) const { CLAW_PRECOND(index < size() ); sprite result( get_frame(index).get_sprite() ); result.combine(*this); const double w ( get_max_size().x == 0 ? 0 : result.width() * width() / get_max_size().x ); const double h ( get_max_size().y == 0 ? 0 : result.height() * height() / get_max_size().y ); result.set_size( w, h ); return result; } // animation::get_sprite() /*----------------------------------------------------------------------------*/ /** * \brief Get the biggest size of the frames. */ claw::math::coordinate_2d bf::animation::get_max_size() const { claw::math::coordinate_2d result(0, 0); const_iterator it; for (it=begin(); it!=end(); ++it) { if ( it->get_sprite().width() > result.x ) result.x = it->get_sprite().width(); if ( it->get_sprite().height() > result.y ) result.y = it->get_sprite().height(); } return result; } // animation::get_max_size() /*----------------------------------------------------------------------------*/ /** * \brief Return the number of frames. */ std::size_t bf::animation::frames_count() const { return size(); } // animation::frames_count() /*----------------------------------------------------------------------------*/ /** * \brief Return the total duration of the animation. */ double bf::animation::get_duration() const { if ( empty() || (m_last_index >= frames_count()) || (m_first_index > m_last_index) ) return 0; double loop_duration( 0 ); for ( std::size_t i(m_first_index); i <= m_last_index; ++i ) loop_duration += get_frame( i ).get_duration(); if ( m_loop_back && (m_last_index - m_first_index > 1) ) loop_duration += loop_duration - get_frame( m_first_index ).get_duration() - get_frame( m_last_index ).get_duration(); double result( loop_duration ); if ( m_loops != 0 ) result *= m_loops; for ( std::size_t i(0); i != m_first_index; ++i ) result += get_frame( i ).get_duration(); for ( std::size_t i( m_last_index + 1 ); i != frames_count(); ++i ) result += get_frame( i ).get_duration(); return result; } // animation::get_duration() /*----------------------------------------------------------------------------*/ /** * \brief Compile the animation. * \param f The stream in which we write the compiled animation. * \param c The context in which the compilation is done. */ void bf::animation::compile( compiled_file& f, compilation_context& c ) const { const_iterator it; f << size(); for ( it=begin(); it!=end(); ++it) { f << it->get_duration(); it->get_sprite().compile(f, c); } f << m_loops << m_loop_back << m_first_index << m_last_index; bitmap_rendering_attributes::compile(f); } // animation::compile() plee-the-bear-20251226/bear-factory/bear-editor/src/bf/code/animation_edit.cpp000066400000000000000000000477461512343254000267450ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bf::animation_edit class. * \author Sebastien Angibaud */ #include "bf/animation_edit.hpp" #include "bf/animation_view_ctrl.hpp" #include "bf/bitmap_rendering_attributes_edit.hpp" #include "bf/frame_edit.hpp" #include "bf/human_readable.hpp" #include "bf/wx_facilities.hpp" #include #include /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param parent The window owning this window. * \param env The workspace environment to use. * \param anim The initial animation. */ bf::animation_edit::animation_edit ( wxWindow& parent, workspace_environment& env, const animation& anim ) : wxPanel(&parent, wxID_ANY), base_edit(anim), m_workspace(env) { create_controls(); value_updated(); Fit(); } // animation_edit::animation_edit() /*----------------------------------------------------------------------------*/ /** * \brief Check if the displayed value is correct and, if it is, set the * value according to the display. */ bool bf::animation_edit::validate() { if ( m_rendering_attributes->validate() ) { set_value(make_animation()); return true; } else return false; } // animation_edit::validate() /*----------------------------------------------------------------------------*/ /** * \brief Get the animation corresponding to the values in the control. */ bf::animation bf::animation_edit::make_animation() const { animation result(get_value()); if ( m_rendering_attributes->validate() ) { result.set_loops( m_loops_spin->GetValue() ); result.set_loop_back( m_loop_back_box->IsChecked() ); result.set_first_index( m_first_index_spin->GetValue()); result.set_last_index( m_last_index_spin->GetValue()); result.bitmap_rendering_attributes::assign (m_rendering_attributes->get_value()); if ( result.get_auto_size() ) result.set_size( result.get_max_size() ); } return result; } // animation_edit::make_animation() /*----------------------------------------------------------------------------*/ /** * \brief Method called after changing the value by set_value(). */ void bf::animation_edit::value_updated() { m_rendering_attributes->set_value( get_value() ); fill_controls(); } // animation_edit::value_updated() /*----------------------------------------------------------------------------*/ /** * \brief Update buttons. */ void bf::animation_edit::update_buttons() const { m_delete_button->Enable( m_frame_list->GetSelectedItemCount() != 0 ); m_up_button->Enable( m_frame_list->GetSelectedItemCount() == 1 ); m_down_button->Enable( m_frame_list->GetSelectedItemCount() == 1 ); m_edit_button->Enable( m_frame_list->GetSelectedItemCount() == 1 ); m_copy_button->Enable( m_frame_list->GetSelectedItemCount() == 1 ); m_reverse_button->Enable( m_frame_list->GetSelectedItemCount() > 1 ); } // animation_edit::update_buttons() /*----------------------------------------------------------------------------*/ /** * \brief Update frame list. * \param anim The animation. */ void bf::animation_edit::update_frame_list(const animation& anim) const { std::list index_list; long index = m_frame_list->GetFirstSelected(); while ( index != wxNOT_FOUND ) { index_list.push_back(index); index = m_frame_list->GetNextSelected(index); } animation::const_iterator it; unsigned int i=0; m_frame_list->DeleteAllItems(); for ( it=anim.begin(); it!=anim.end(); ++i, ++it ) { wxListItem prop; wxString string( human_readable::convert(i) ); m_frame_list->InsertItem(i, string); prop.SetId(i); m_frame_list->GetItem(prop); prop.SetText( human_readable::convert(it->get_sprite()) ); prop.SetColumn(1); m_frame_list->SetItem(prop); m_frame_list->GetItem(prop); prop.SetText( human_readable::convert(it->get_duration()) ); prop.SetColumn(2); m_frame_list->SetItem(prop); } std::list::iterator it_index; for( it_index = index_list.begin(); it_index != index_list.end(); ++it_index ) if ( (*it_index != wxNOT_FOUND) && (m_frame_list->GetItemCount() != 0) ) { if ( *it_index > m_frame_list->GetItemCount() ) *it_index = m_frame_list->GetItemCount() - 1; m_frame_list->Select(*it_index); } } // animation_edit::update_frame_list() /*----------------------------------------------------------------------------*/ /** * \brief Update spin control. */ void bf::animation_edit::update_spin_ctrl() const { if ( m_frame_list->GetItemCount() == 0 ) m_first_index_spin->SetRange(0, 0); else m_first_index_spin->SetRange(0, m_frame_list->GetItemCount()-1); m_last_index_spin->SetRange( m_first_index_spin->GetValue(), m_frame_list->GetItemCount()-1); } // animation_edit::update_spin_ctrl() /*----------------------------------------------------------------------------*/ /** * \brief Update the total duration of the animation. */ void bf::animation_edit::update_duration() const { m_duration_label->SetLabel ( wxString::Format ( _("Total duration: %.3f ms."), get_value().get_duration() ) ); } // animation_edit::update_duration() /*----------------------------------------------------------------------------*/ /** * \brief Ajust the size of the last column so there is no empty space on the * right. */ void bf::animation_edit::adjust_last_column_size() { m_frame_list->SetColumnWidth ( 1, m_frame_list->GetSize().x - m_frame_list->GetColumnWidth(0) - m_frame_list->GetColumnWidth(2) ); } // animation_edit::adjust_last_column_size() /*----------------------------------------------------------------------------*/ /** * \brief Fill the controls with the values of the animation. */ void bf::animation_edit::fill_controls() const { animation anim( get_value() ); update_frame_list(anim); update_buttons(); update_spin_ctrl(); update_duration(); m_loop_back_box->SetValue( anim.get_loop_back() ); m_loops_spin->SetValue( anim.get_loops() ); m_first_index_spin->SetValue( anim.get_first_index() ); m_last_index_spin->SetValue( anim.get_last_index() ); m_animation_view->set_animation( anim ); } // animation_edit::fill_controls() /*----------------------------------------------------------------------------*/ /** * \brief Create the controls of the window. */ void bf::animation_edit::create_controls() { m_frame_list = new wxListView( this, IDC_FRAME, wxDefaultPosition, wxDefaultSize, wxLC_REPORT | wxLC_VRULES ); m_frame_list->InsertColumn(0, _("Index")); m_frame_list->InsertColumn(1, _("Sprite")); m_frame_list->InsertColumn(2, _("Duration")); m_copy_button = new wxButton(this, wxID_COPY); m_edit_button = new wxButton(this, wxID_EDIT); m_up_button = new wxButton(this, wxID_UP); m_down_button = new wxButton(this, wxID_DOWN); m_delete_button = new wxButton(this, wxID_DELETE); m_reverse_button = new wxButton(this, IDC_REVERSE, _("Reverse")); m_loops_spin = new spin_ctrl( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxEXPAND, 0, std::numeric_limits::max(), 1 ); m_first_index_spin = new wxSpinCtrl( this, IDC_BOUND_INDEX_CHANGE ); m_last_index_spin = new wxSpinCtrl( this, IDC_BOUND_INDEX_CHANGE ); m_loop_back_box = new wxCheckBox( this, wxID_ANY, _("Loop_back") ); m_rendering_attributes = new bitmap_rendering_attributes_edit(*this, get_value()); m_animation_view = new animation_view_ctrl(*this, m_workspace, get_value()); m_duration_label = new wxStaticText( this, wxID_ANY, wxEmptyString ); create_sizer_controls(); } // animation_edit::create_controls() /*----------------------------------------------------------------------------*/ /** * \brief Create the controls and add them in sizers. */ void bf::animation_edit::create_sizer_controls() { wxBoxSizer* h_sizer = new wxBoxSizer( wxHORIZONTAL ); wxBoxSizer* v_sizer = new wxBoxSizer( wxVERTICAL ); v_sizer->Add( new wxButton(this, wxID_NEW), 1, wxEXPAND | wxALL, 0 ); v_sizer->Add( m_copy_button, 1, wxEXPAND | wxALL, 0 ); v_sizer->Add( m_edit_button, 1, wxEXPAND | wxALL, 0 ); v_sizer->Add( m_delete_button, 1, wxEXPAND | wxALL, 0 ); v_sizer->Add( m_up_button, 1, wxEXPAND | wxALL, 0 ); v_sizer->Add( m_down_button, 1, wxEXPAND | wxALL, 0 ); v_sizer->Add( m_reverse_button, 1, wxEXPAND | wxALL, 0 ); h_sizer->Add( m_frame_list, 4, wxEXPAND ); h_sizer->Add( v_sizer, 1, wxEXPAND ); v_sizer = new wxBoxSizer( wxVERTICAL ); v_sizer->Add( h_sizer, 1, wxEXPAND ); v_sizer->Add( create_loops_sizer(), 0, wxEXPAND ); v_sizer->Add( m_duration_label, 0, wxEXPAND | wxALL, 2); v_sizer->Add( m_rendering_attributes, 0, wxEXPAND ); h_sizer = new wxBoxSizer( wxHORIZONTAL ); wxBoxSizer* s_v_sizer = new wxBoxSizer( wxVERTICAL ); s_v_sizer->Add( m_animation_view, 1, wxEXPAND ); s_v_sizer->Add( new wxButton(this, wxID_REFRESH), 0, wxEXPAND ); h_sizer->Add( s_v_sizer, 1, wxEXPAND ); h_sizer->Add( v_sizer, 1, wxEXPAND ); SetSizer(h_sizer); } // animation_edit::create_sizer_controls() /*----------------------------------------------------------------------------*/ /** * \brief Create the controls and the sizer for the loops part. */ wxSizer* bf::animation_edit::create_loops_sizer() { wxBoxSizer* result = new wxBoxSizer( wxHORIZONTAL ); wxStaticBoxSizer* s_sizer = new wxStaticBoxSizer( wxVERTICAL, this, _("Loops") ); wxBoxSizer* s_h_sizer = new wxBoxSizer( wxHORIZONTAL ); //number wxBoxSizer* s_v_sizer = new wxBoxSizer( wxVERTICAL ); s_v_sizer->Add ( new wxStaticText(this, wxID_ANY, _("Number:")), 0, wxALIGN_CENTRE_VERTICAL, 0 ); s_v_sizer->Add( m_loops_spin, 0, wxALIGN_CENTRE_VERTICAL , 0 ); s_h_sizer->Add( s_v_sizer, 1, wxALIGN_CENTRE_VERTICAL , 0 ); //First index s_v_sizer = new wxBoxSizer( wxVERTICAL ); s_v_sizer->Add ( new wxStaticText(this, wxID_ANY, _("First index:")), 0, wxALIGN_CENTRE_VERTICAL, 0 ); s_v_sizer->Add( m_first_index_spin, 0, wxALIGN_CENTRE_VERTICAL, 0 ); s_h_sizer->Add( s_v_sizer, 1, wxALIGN_CENTRE_VERTICAL , 0 ); //Last index s_v_sizer = new wxBoxSizer( wxVERTICAL ); s_v_sizer->Add ( new wxStaticText(this, wxID_ANY, _("Last index:")), 0, wxALIGN_CENTRE_VERTICAL | wxALL, 0 ); s_v_sizer->Add( m_last_index_spin, 0, wxALIGN_CENTRE_VERTICAL, 0 ); s_h_sizer->Add( s_v_sizer, 1, wxALIGN_CENTRE_VERTICAL , 0 ); //loop back s_h_sizer->Add( m_loop_back_box, 1, wxALIGN_CENTRE_VERTICAL , 0 ); s_sizer->Add( s_h_sizer, 1, wxEXPAND , 0 ); result->Add( s_sizer, 1, wxEXPAND , 0 ); return result; } // animation_edit::create_loops_sizer() /*----------------------------------------------------------------------------*/ /** * \brief Edit a frame. * \param index The index of the frame to edit. */ void bf::animation_edit::edit_frame( long index ) { CLAW_PRECOND( index < (long)get_value().frames_count() ); animation anim = get_value(); animation_frame& frm = anim.get_frame(index); frame_edit dlg(*m_parent, m_workspace, frm ); if ( dlg.ShowModal() == wxID_OK ) { frm.set_sprite(dlg.get_frame().get_sprite()); frm.set_duration(dlg.get_frame().get_duration()); set_value(anim); } } // animation_edit::edit_frame() /*----------------------------------------------------------------------------*/ /** * \brief The user clicked on the "Up" button. * \param event The event. */ void bf::animation_edit::on_up( wxCommandEvent& WXUNUSED(event) ) { if ( m_frame_list->GetSelectedItemCount() == 1 ) { int index = m_frame_list->GetFocusedItem(); if ( index != wxNOT_FOUND ) if ( index > 0 ) { animation anim = get_value(); anim.move_backward(index); set_value(anim); m_frame_list->Select(index,false); m_frame_list->Select(index-1); m_frame_list->Focus(index-1); } } } // animation_edit::on_up() /*----------------------------------------------------------------------------*/ /** * \brief The user clicked on the "Down" button. * \param event The event. */ void bf::animation_edit::on_down( wxCommandEvent& WXUNUSED(event) ) { if ( m_frame_list->GetSelectedItemCount() == 1 ) { long index = m_frame_list->GetFocusedItem(); if ( index != wxNOT_FOUND ) if ( index + 1 < m_frame_list->GetItemCount() ) { animation anim = get_value(); anim.move_forward(index); set_value(anim); m_frame_list->Select(index,false); m_frame_list->Select(index+1); m_frame_list->Focus(index+1); } } } // animation_edit::on_down() /*----------------------------------------------------------------------------*/ /** * \brief The user clicked on the "New" button. * \param event The event. */ void bf::animation_edit::on_new( wxCommandEvent& WXUNUSED(event) ) { frame_edit dlg(*m_parent, m_workspace); if (dlg.ShowModal() == wxID_OK ) { animation anim = get_value(); animation_frame& f = anim.add_frame(); f.set_sprite(dlg.get_frame().get_sprite()); f.set_duration(dlg.get_frame().get_duration()); if ( get_value().empty() ) // the user is creating its first frame anim.set_size( f.get_sprite().get_size() ); set_value(anim); } } // animation_edit::on_new() /*----------------------------------------------------------------------------*/ /** * \brief The user clicked on the "Copy" button. * \param event The event. */ void bf::animation_edit::on_copy( wxCommandEvent& WXUNUSED(event) ) { if ( m_frame_list->GetSelectedItemCount() == 1 ) { long index = m_frame_list->GetFocusedItem(); if ( index != wxNOT_FOUND ) { animation anim = get_value(); animation_frame& f = anim.add_frame(); f = anim.get_frame(index); set_value(anim); m_frame_list->Select(index, false); m_frame_list->Select(m_frame_list->GetItemCount() - 1); m_frame_list->Focus(m_frame_list->GetItemCount() - 1); } } } // animation_edit::on_copy() /*----------------------------------------------------------------------------*/ /** * \brief The user clicked on the frame_list. * \param event The event. */ void bf::animation_edit::on_frame_edit(wxListEvent& event) { long index = event.GetIndex(); if ( index != wxNOT_FOUND ) edit_frame(index); } // animation_edit::on_frame_edit() /*----------------------------------------------------------------------------*/ /** * \brief The user selects on the frame_list. * \param event The event. */ void bf::animation_edit::on_frame_selected(wxListEvent& event) { update_buttons(); } // animation_edit::on_frame_selected() /*----------------------------------------------------------------------------*/ /** * \brief The user deselects on the frame_list. * \param event The event. */ void bf::animation_edit::on_frame_deselected(wxListEvent& event) { update_buttons(); } // animation_edit::on_frame_deselected() /*----------------------------------------------------------------------------*/ /** * \brief The user clicked on the "Edit" button. * \param event The event. */ void bf::animation_edit::on_frame_button_edit( wxCommandEvent& WXUNUSED(event) ) { if ( m_frame_list->GetSelectedItemCount() == 1 ) { long index = m_frame_list->GetFocusedItem(); if ( index != wxNOT_FOUND ) edit_frame(index); } } // animation_edit::on_frame_button_edit() /*----------------------------------------------------------------------------*/ /** * \brief The user clicked on the "Delete" button. * \param event The event. */ void bf::animation_edit::on_delete( wxCommandEvent& WXUNUSED(event) ) { std::list index_list; long index = m_frame_list->GetFirstSelected(); while ( index != wxNOT_FOUND ) { index_list.push_back(index); index = m_frame_list->GetNextSelected(index); } if ( ! index_list.empty() ) { animation anim = get_value(); long gap = 0; std::list::iterator it_index; for( it_index = index_list.begin(); it_index != index_list.end(); ++it_index ) { anim.delete_frame(*it_index - gap); gap = gap + 1; } set_value(anim); } } // animation_edit::on_delete() /*----------------------------------------------------------------------------*/ /** * \brief The user clicked on the "Reverse" button. * \param event The event. */ void bf::animation_edit::on_reverse( wxCommandEvent& WXUNUSED(event) ) { std::list index_list; long index = m_frame_list->GetFirstSelected(); while ( index != wxNOT_FOUND ) { index_list.push_back(index); index = m_frame_list->GetNextSelected(index); } if ( ! index_list.empty() ) { animation anim = get_value(); anim.reverse_frames(index_list); set_value(anim); } } // animation_edit::on_reverse() /*----------------------------------------------------------------------------*/ /** * \brief Event sent to a resized window. * \param event The event. */ void bf::animation_edit::on_size(wxSizeEvent& event) { adjust_last_column_size(); event.Skip(); } // animation_edit::on_size() /*----------------------------------------------------------------------------*/ /** * \brief Event sent when the user starts to resize a column. * \param event The event. */ void bf::animation_edit::on_column_begin_drag(wxListEvent& event) { if ( event.GetColumn() + 1 == m_frame_list->GetColumnCount() ) event.Veto(); else event.Skip(); } // animation_edit::on_column_begin_drag() /*----------------------------------------------------------------------------*/ /** * \brief Event sent when the user ends resizing a column. * \param event The event. */ void bf::animation_edit::on_column_end_drag( wxListEvent& WXUNUSED(event) ) { adjust_last_column_size(); } // animation_edit::on_column_begin_drag() /*----------------------------------------------------------------------------*/ /** * \brief The user change the first or the last index. * \param event The event. */ void bf::animation_edit::on_bound_index_change( wxSpinEvent& WXUNUSED(event) ) { update_spin_ctrl(); update_duration(); } // animation_edit::on_bound_index_change() /*----------------------------------------------------------------------------*/ /** * \brief The user clicked on the "Refresh" button. * \param event This event occured. */ void bf::animation_edit::on_refresh( wxCommandEvent& WXUNUSED(event) ) { validate(); m_animation_view->set_animation( get_value() ); } // animation_edit::on_refresh() /*----------------------------------------------------------------------------*/ BEGIN_EVENT_TABLE(bf::animation_edit, wxPanel) EVT_BUTTON( wxID_UP, bf::animation_edit::on_up ) EVT_BUTTON( wxID_DOWN, bf::animation_edit::on_down ) EVT_BUTTON( wxID_NEW, bf::animation_edit::on_new ) EVT_BUTTON( wxID_COPY, bf::animation_edit::on_copy ) EVT_BUTTON( wxID_EDIT, bf::animation_edit::on_frame_button_edit ) EVT_BUTTON( IDC_REVERSE, bf::animation_edit::on_reverse ) EVT_SIZE( bf::animation_edit::on_size ) EVT_LIST_COL_BEGIN_DRAG ( bf::animation_edit::IDC_FRAME, bf::animation_edit::on_column_begin_drag ) EVT_LIST_COL_END_DRAG ( bf::animation_edit::IDC_FRAME, bf::animation_edit::on_column_end_drag ) EVT_LIST_ITEM_ACTIVATED( IDC_FRAME, bf::animation_edit::on_frame_edit ) EVT_LIST_ITEM_SELECTED( IDC_FRAME, bf::animation_edit::on_frame_selected ) EVT_LIST_ITEM_DESELECTED( IDC_FRAME, bf::animation_edit::on_frame_deselected ) EVT_BUTTON( wxID_DELETE, bf::animation_edit::on_delete ) EVT_SPINCTRL( bf::animation_edit::IDC_BOUND_INDEX_CHANGE, bf::animation_edit::on_bound_index_change ) EVT_BUTTON( wxID_REFRESH, bf::animation_edit::on_refresh ) END_EVENT_TABLE() plee-the-bear-20251226/bear-factory/bear-editor/src/bf/code/animation_file_edit.cpp000066400000000000000000000153051512343254000277260ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bf::animation_file_edit class. * \author Julien Jorge */ #include "bf/animation_file_edit.hpp" #include "bf/animation_view_ctrl.hpp" #include "bf/bitmap_rendering_attributes_edit.hpp" #include "bf/path_configuration.hpp" #include "bf/workspace_environment.hpp" #include "bf/wx_facilities.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param parent The window owning this window. * \param env The workspace environment to use. * \param v The initial animation. */ bf::animation_file_edit::animation_file_edit ( wxWindow& parent, workspace_environment& env, const animation_file_type& v ) : wxPanel(&parent, wxID_ANY), base_edit(v), m_workspace(env) { create_controls(); value_updated(); Fit(); } // animation_file_edit::animation_file_edit() /*----------------------------------------------------------------------------*/ /** * \brief Check if the displayed value is correct and, if it is, set the * value according to the display. */ bool bf::animation_file_edit::validate() { if ( m_rendering_attributes->validate() ) { set_value(make_animation_file(m_workspace)); return true; } else return false; } // animation_file_edit::validate() /*----------------------------------------------------------------------------*/ /** * \brief Get the animation_file corresponding to the values in the control. * \param env The workspace environment to use. */ bf::animation_file_type bf::animation_file_edit::make_animation_file( workspace_environment& env ) const { animation_file_type result; if ( m_rendering_attributes->validate() ) { result.set_path ( wx_to_std_string(m_path_text->GetValue()), env ); result.assign(m_rendering_attributes->get_value()); } return result; } // animation_file_edit::make_animation_file() /*----------------------------------------------------------------------------*/ /** * \brief Method called after changing the value by set_value(). */ void bf::animation_file_edit::value_updated() { m_rendering_attributes->set_value( get_value() ); fill_controls(); } // animation_file_edit::value_updated() /*----------------------------------------------------------------------------*/ /** * \brief Fill the controls with the values of the animation_file. */ void bf::animation_file_edit::fill_controls() { m_rendering_attributes->set_value( get_value() ); m_path_text->SetValue( std_to_wx_string(get_value().get_path()) ); animation_view_load(); } // animation_file_edit::fill_controls() /*----------------------------------------------------------------------------*/ /** * \brief Create the controls of the window. */ void bf::animation_file_edit::create_controls() { m_rendering_attributes = new bitmap_rendering_attributes_edit(*this, get_value()); m_path_text = new wxTextCtrl( this, wxID_ANY ); m_animation_view = new animation_view_ctrl(*this, m_workspace); create_sizer_controls(); fill_controls(); } // animation_file_edit::create_controls() /*----------------------------------------------------------------------------*/ /** * \brief Create the controls and add them in sizers. */ void bf::animation_file_edit::create_sizer_controls() { wxBoxSizer* v_sizer = new wxBoxSizer( wxVERTICAL ); wxBoxSizer* h_sizer = new wxBoxSizer( wxHORIZONTAL ); v_sizer->Add( m_animation_view, 1, wxEXPAND ); v_sizer->Add( new wxButton(this, wxID_REFRESH), 0, wxEXPAND ); h_sizer->Add( v_sizer, 1, wxEXPAND | wxALL, 5 ); v_sizer = new wxBoxSizer( wxVERTICAL ); v_sizer->Add( m_rendering_attributes, 0, wxEXPAND ); v_sizer->Add( create_path_sizer(), 0, wxEXPAND ); h_sizer->Add( v_sizer, 1, wxEXPAND | wxALL, 5 ); SetSizer(h_sizer); } // animation_file_edit::create_sizer_controls() /*----------------------------------------------------------------------------*/ /** * \brief Create the controls and the sizer for the image name. */ wxSizer* bf::animation_file_edit::create_path_sizer() { wxBoxSizer* result = new wxBoxSizer( wxHORIZONTAL ); wxButton* path_browse = new wxButton ( this, IDC_BROWSE_ANIMATION, wxT("..."), wxDefaultPosition, wxSize(30, -1) ); result->Add ( new wxStaticText(this, wxID_ANY, _("Animation:")), 0, wxALIGN_CENTRE_VERTICAL | wxALL, 5 ); result->Add( m_path_text, 1, wxEXPAND | wxALL, 5 ); result->Add( path_browse, 0, wxALL, 5 ); return result; } // animation_file_edit::create_path_sizer() /*----------------------------------------------------------------------------*/ /** * \brief Set the animation in the view by loading the animation file. */ void bf::animation_file_edit::animation_view_load() { animation anim = get_value().get_animation(); m_animation_view->set_animation( anim ); } // animation_file_edit::animation_view_load() /*----------------------------------------------------------------------------*/ /** * \brief The user clicked on the button to select an animation. * \param event This event occured. */ void bf::animation_file_edit::on_browse_animation ( wxCommandEvent& WXUNUSED(event) ) { std::string p = wx_to_std_string(m_path_text->GetValue()); path_configuration::get_instance().get_full_path ( p, m_workspace.get_name() ); wxFileDialog dlg ( this, _("Choose a file"), wxEmptyString, std_to_wx_string(p), _("Compiled animation (*.canim)|*.canim"), wxFD_DEFAULT_STYLE | wxFD_FILE_MUST_EXIST ); if (dlg.ShowModal() == wxID_OK) { std::string new_p = wx_to_std_string( dlg.GetPath() ); path_configuration::get_instance().get_relative_path ( new_p, m_workspace.get_name() ); m_path_text->SetValue( std_to_wx_string(new_p) ); animation_file_type v( get_value() ); v.set_path(new_p, m_workspace); set_value(v); fill_controls(); } } // animation_file_edit::on_browse_animation() /*----------------------------------------------------------------------------*/ /** * \brief The user clicked on the "Refresh" button. * \param event This event occured. */ void bf::animation_file_edit::on_refresh( wxCommandEvent& WXUNUSED(event) ) { validate(); animation_view_load(); } // animation_file_edit::on_refresh() /*----------------------------------------------------------------------------*/ BEGIN_EVENT_TABLE(bf::animation_file_edit, wxPanel) EVT_BUTTON( bf::animation_file_edit::IDC_BROWSE_ANIMATION, bf::animation_file_edit::on_browse_animation ) EVT_BUTTON( wxID_REFRESH, bf::animation_file_edit::on_refresh ) END_EVENT_TABLE() plee-the-bear-20251226/bear-factory/bear-editor/src/bf/code/animation_file_type.cpp000066400000000000000000000077671512343254000277770ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bf::animation_file_type class. * \author Julien Jorge */ #include "bf/animation_file_type.hpp" #include "bf/animation_file_xml_reader.hpp" #include "bf/compiled_file.hpp" #include "bf/path_configuration.hpp" #include "bf/workspace_environment.hpp" #include "bf/wx_facilities.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Set the path of the animation file. * \param p The new path. * \param env The worksapce environment to use. */ void bf::animation_file_type::set_path ( const std::string& p, workspace_environment& env ) { m_path = p; m_relative_path = p; if ( path_configuration::get_instance().expand_file_name (m_relative_path, env.get_name() ) ) path_configuration::get_instance().get_relative_path (m_relative_path, env.get_name() ); std::string::size_type pos = m_path.rfind(".canim"); m_animation.clear(); if ( pos != std::string::npos ) { std::string p( m_path.substr(0, pos) + ".anim" ); if ( path_configuration::get_instance().expand_file_name (p, 1, env.get_name() ) ) { animation_file_xml_reader reader; m_animation = reader.load( std_to_wx_string(p), env ); } } } // animation_file_type::set_path() /*----------------------------------------------------------------------------*/ /** * \brief Get the path of the animation file. */ const std::string& bf::animation_file_type::get_path() const { return m_path; } // animation_file_type::get_path() /*----------------------------------------------------------------------------*/ /** * \brief Get the animation of the file, combined with the rendering attributes * of this instance. */ bf::animation bf::animation_file_type::get_animation() const { animation anim( m_animation ); anim.bitmap_rendering_attributes::combine( *this ); return anim; } // animation_file_type::get_animation() /*----------------------------------------------------------------------------*/ /** * \brief Get the animation of the file, without the rendering attributes of * this instance. */ bf::animation bf::animation_file_type::original_animation() const { return m_animation; } // animation_file_type::load_animation() /*----------------------------------------------------------------------------*/ /** * \brief Compile the animation_file_type. * \param f The stream in which we write the compiled data. */ void bf::animation_file_type::compile( compiled_file& f ) const { f << m_relative_path; bitmap_rendering_attributes::compile(f); } // animation_file_type::compile() /*----------------------------------------------------------------------------*/ /** * \brief Tell if two animation_file_types are the same. * \param that The other animation_file_type. */ bool bf::animation_file_type::operator== ( const animation_file_type& that ) const { return that.bitmap_rendering_attributes::operator==(*this) && (m_path == that.m_path); } // animation_file_type::operator==() /*----------------------------------------------------------------------------*/ /** * \brief Tell if two animation_file_types are different. * \param that The other animation_file_type. */ bool bf::animation_file_type::operator!= ( const animation_file_type& that ) const { return !(*this == that); } // animation_file_type::operator!=() /*----------------------------------------------------------------------------*/ /** * \brief Compare two animation_file_types in lexicographic order. * \param that The other animation_file_type. */ bool bf::animation_file_type::operator< ( const animation_file_type& that ) const { if ( m_path == that.m_path ) return that.bitmap_rendering_attributes::operator<(*this); else return m_path < that.m_path; } // animation_file_type::operator<() plee-the-bear-20251226/bear-factory/bear-editor/src/bf/code/animation_file_xml_reader.cpp000066400000000000000000000033141512343254000311200ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bf::animation_file_xml_reader class. * \author Julien Jorge */ #include "bf/animation_file_xml_reader.hpp" #include "bf/wx_facilities.hpp" #include "bf/xml/exception.hpp" #include "bf/xml/xml_to_value.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Load a animation. * \param file_path The path to the animation file. * \param env The worksapce environment to use. */ bf::animation bf::animation_file_xml_reader::load ( const wxString& file_path, workspace_environment& env ) const { wxXmlDocument doc; if ( !doc.Load(file_path) ) throw std::ios_base::failure ( "Cannot load the XML file '" + wx_to_std_string(file_path) + "'" ); wxXmlNode* node = doc.GetRoot(); if ( node == NULL ) throw xml::missing_node("animation"); return load( node, env ); } // animation_file_xml_reader::load() /*----------------------------------------------------------------------------*/ /** * \brief Load a node of type "animation". * \param node The node to parse. * \param env The workspace environment to use. */ bf::animation bf::animation_file_xml_reader::load ( wxXmlNode* node, workspace_environment& env ) const { CLAW_PRECOND( node != NULL ); if ( node->GetName() != wxT("animation") ) throw xml::bad_node( wx_to_std_string(node->GetName()) ); animation anim; xml::xml_to_value xml_conv; xml_conv( anim, node, env ); return anim; } // animation_file_xml_reader::load_animation() plee-the-bear-20251226/bear-factory/bear-editor/src/bf/code/animation_file_xml_writer.cpp000066400000000000000000000014761512343254000312010ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bf::animation_file_xml_writer class. * \author Julien Jorge */ #include "bf/animation_file_xml_writer.hpp" #include "bf/xml/value_to_xml.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Save a animation. * \param os The stream in which we write. * \param anim The animation to save. */ void bf::animation_file_xml_writer::save ( std::ostream& os, const animation& anim ) const { os << "\n"; xml::value_to_xml::write(os, anim); } // animation_file_xml_writer::save() plee-the-bear-20251226/bear-factory/bear-editor/src/bf/code/animation_frame.cpp000066400000000000000000000044721512343254000270770ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bf::animation_frame class. * \author Julien Jorge */ #include "bf/animation_frame.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Default constructor. */ bf::animation_frame::animation_frame() : m_sprite(), m_duration(1) { } // animation_frame::animation_frame() /*----------------------------------------------------------------------------*/ /** * \brief Set the sprite. * \param spr The new sprite. */ void bf::animation_frame::set_sprite(const sprite& spr) { m_sprite = spr; } // animation_frame::set_sprite() /*----------------------------------------------------------------------------*/ /** * \brief Set the duration. * \param duration The new duration. */ void bf::animation_frame::set_duration(double duration) { m_duration = duration; } // animation_frame::set_duration() /*----------------------------------------------------------------------------*/ /** * \brief Get the sprite. */ const bf::sprite& bf::animation_frame::get_sprite() const { return m_sprite; } // animation_frame::get_sprite() /*----------------------------------------------------------------------------*/ /** * \brief Get the duration. */ double bf::animation_frame::get_duration() const { return m_duration; } // animation_frame::get_duration() /*----------------------------------------------------------------------------*/ /** * \brief Tell if two frames are the same. * \param that The other frame. */ bool bf::animation_frame::operator==( const animation_frame& that ) const { return (m_sprite == that.m_sprite) && (m_duration == that.m_duration); } // animation_frame::operator==() /*----------------------------------------------------------------------------*/ /** * \brief Compare with an other animation frame in lexicographic order of their * attributes. * \param that The other animation frame. */ bool bf::animation_frame::operator<(const animation_frame& that) const { if ( m_sprite != that.m_sprite ) return m_sprite < that.m_sprite; return m_duration < that.m_duration; } // animation_frame::operator<() plee-the-bear-20251226/bear-factory/bear-editor/src/bf/code/animation_player.cpp000066400000000000000000000202451512343254000272750ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bf::animation_player class. * \author Julien Jorge */ #include "bf/animation_player.hpp" #include #include /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param anim The animation to play. */ bf::animation_player::animation_player( const animation& anim ) : m_animation(anim), m_index(0), m_forward(true), m_play_count(0), m_time(0) { } // animation_player::animation_player() /*----------------------------------------------------------------------------*/ /** * \brief Set the animation. * \param anim The animation to play. */ void bf::animation_player::set_animation( const animation& anim ) { m_animation = anim; reset(); } // animation_player::set_animation() /*----------------------------------------------------------------------------*/ /** * \brief Get the animation. */ const bf::animation& bf::animation_player::get_animation() const { return m_animation; } // animation_player::get_animation() /*----------------------------------------------------------------------------*/ /** * \brief Come back to first frame. */ void bf::animation_player::reset() { m_index = 0; m_forward = true; m_play_count = 0; m_time = 0; } // animation_player::reset() /*----------------------------------------------------------------------------*/ /** * \brief Play the current frame and go to the next one. */ void bf::animation_player::next() { if ( !is_finished() ) next( m_animation.get_frame(m_index).get_duration() - m_time ); } // animation_player::next() /*----------------------------------------------------------------------------*/ /** * \brief Play the animation during a given duration. * \param d The duration. */ void bf::animation_player::next( double d ) { CLAW_PRECOND( d >= 0 ); if ( !is_finished() ) { m_time += d; while ( claw::real_number(m_time) >= m_animation.get_frame(m_index).get_duration() ) { m_time -= m_animation.get_frame(m_index).get_duration(); next_index(); } } } // animation_player::next() /*----------------------------------------------------------------------------*/ /** * \brief Get the duration until the next frame to be displayed. */ double bf::animation_player::get_duration_until_next() const { if ( is_finished() ) return std::numeric_limits::infinity(); else return m_animation.get_frame(m_index).get_duration() - m_time; } // animation_player::get_duration_until_next() /*----------------------------------------------------------------------------*/ /** * \brief Get the current playing time. */ double bf::animation_player::get_time() const { return m_time; } // animation_player::get_time() /*----------------------------------------------------------------------------*/ /** * \brief Get the current frame. */ bf::sprite bf::animation_player::get_sprite() const { sprite result; if ( !m_animation.empty() ) { result = m_animation.get_frame(m_index).get_sprite(); result.flip( trinary_logic::to_bool(m_animation.get_flipped_status()) ^ trinary_logic::to_bool(result.get_flipped_status()) ); result.mirror ( trinary_logic::to_bool(m_animation.get_mirrored_status()) ^ trinary_logic::to_bool(result.get_mirrored_status()) ); result.set_angle( m_animation.get_angle() + result.get_angle() ); result.get_color().set_opacity ( m_animation.get_color().get_opacity() * result.get_color().get_opacity() ); result.get_color().set_intensity ( m_animation.get_color().get_red_intensity() * result.get_color().get_red_intensity(), m_animation.get_color().get_green_intensity() * result.get_color().get_green_intensity(), m_animation.get_color().get_blue_intensity() * result.get_color().get_blue_intensity() ); result.set_width( m_animation.width() ); result.set_height( m_animation.height() ); } return result; } // animation_player::get_sprite() /*----------------------------------------------------------------------------*/ /** * \brief Move on a given frame (and reset everything else). * \param index The new index. */ void bf::animation_player::set_current_index( std::size_t index ) { reset(); if ( m_animation.empty() ) m_index = 0; else m_index = std::min(index, m_animation.frames_count() - 1); } // animation_player::set_current_index() /*----------------------------------------------------------------------------*/ /** * \brief Get the index of the current frame. */ std::size_t bf::animation_player::get_current_index() const { return m_index; } // animation_player::get_current_index() /*----------------------------------------------------------------------------*/ /** * \brief Tell if we have reached the last frame and if this frame has been * displayed during its whole duration. */ bool bf::animation_player::is_finished() const { return sequence_is_finished() && ( m_time >= m_animation.get_frame(m_index).get_duration() ); } // animation_player::is_finished() /*----------------------------------------------------------------------------*/ /** * \brief Tell if we have reached the last frame. */ bool bf::animation_player::sequence_is_finished() const { bool result = (m_play_count == m_animation.get_loops()) && (m_animation.get_loops() != 0); if ( result ) { if ( m_animation.get_loop_back() ) { if ( m_animation.get_last_index() + 1 == m_animation.frames_count() ) result = (m_index == m_animation.get_first_index()); else result = (m_index + 1 == m_animation.frames_count()); } else result = (m_index + 1 == m_animation.frames_count()); } return result; } // animation_player::sequence_is_finished() /*----------------------------------------------------------------------------*/ /** * \brief Go to the next frame. */ void bf::animation_player::next_index() { if ( !sequence_is_finished() ) { if (m_forward) next_forward(); else next_backward(); } } // animation_player::next_index() /*----------------------------------------------------------------------------*/ /** * \brief Go to the next frame, forward playing. */ void bf::animation_player::next_forward() { CLAW_PRECOND( !is_finished() ); // we're on the last frame of the loop interval if ( m_index == m_animation.get_last_index() ) { if ( m_animation.get_loop_back() ) // should we play reverse ? { m_forward = false; if (m_index > 0) --m_index; } else // come back directly to the first frame of the interval { ++m_play_count; // the last time we play the sequence, we'll go after the interval if ( m_play_count != m_animation.get_loops() ) m_index = m_animation.get_first_index(); else if ( m_animation.get_last_index() + 1 != m_animation.frames_count() ) m_index = m_animation.get_last_index() + 1; } } else ++m_index; } // animation_player::next_forward() /*----------------------------------------------------------------------------*/ /** * \brief Go to the next frame, backward playing. */ void bf::animation_player::next_backward() { if ( m_index == m_animation.get_first_index() ) // we're at the begining { ++m_play_count; if ( m_animation.frames_count() > 1 ) { m_forward = true; if ( m_play_count != m_animation.get_loops() ) { if (m_animation.get_first_index() != m_animation.get_last_index()) ++m_index; } else if ( m_animation.get_last_index() + 1 != m_animation.frames_count() ) m_index = m_animation.get_last_index() + 1; } } else --m_index; } // animation_player::next_backward() plee-the-bear-20251226/bear-factory/bear-editor/src/bf/code/animation_view_ctrl.cpp000066400000000000000000000214431512343254000300000ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bf::animation_view_ctrl class. * \author Julien Jorge */ #include "bf/animation_view_ctrl.hpp" #include "bf/sprite_view_ctrl.hpp" #include "bf/icon/player_start.xpm" #include "bf/icon/player_rewind.xpm" #include "bf/icon/player_play.xpm" #include "bf/icon/player_stop.xpm" #include "bf/icon/player_forward.xpm" #include "bf/icon/player_end.xpm" #include #include /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param parent The parent window. * \param env The workspace environment to use. * \param anim The animation displayed. */ bf::animation_view_ctrl::animation_view_ctrl ( wxWindow& parent, workspace_environment& env, const animation& anim ) : wxPanel(&parent, wxID_ANY), m_workspace(env), m_animation(anim), m_player(m_animation), m_timer(this, ID_TIMER) { create_controls(); create_sizers(); Fit(); set_animation(anim); } // animation_view_ctrl::animation_view_ctrl() /*----------------------------------------------------------------------------*/ /** * \brief Set the animation. * \param anim The animation displayed. */ void bf::animation_view_ctrl::set_animation( const animation& anim ) { m_animation = anim; m_player.set_animation(m_animation); m_player.set_current_index(0); display_current_sprite(); if ( m_animation.frames_count() <= 1 ) m_slider->Disable(); else { m_slider->Enable(); m_slider->SetRange(0, m_animation.frames_count() - 1); } m_slider->SetValue(0); } // animation_view_ctrl::set_animation() /*----------------------------------------------------------------------------*/ /** * \brief Create the sub controls. */ void bf::animation_view_ctrl::create_controls() { m_sprite_view = new sprite_view_ctrl(*this, m_workspace); m_slider = new wxSlider(this, ID_SLIDER, 0, 0, 1); m_factor = new spin_ctrl(this, wxID_ANY); m_factor->SetRange(0, std::numeric_limits::max()); m_factor->SetValue(1); m_factor->SetStep(0.1); } // animation_view_ctrl::create_controls() /*----------------------------------------------------------------------------*/ /** * \brief Create the sizers and the non-member controls. */ void bf::animation_view_ctrl::create_sizers() { wxBoxSizer* v_sizer = new wxBoxSizer( wxVERTICAL ); wxBoxSizer* h_sizer = new wxBoxSizer( wxHORIZONTAL ); h_sizer->Add ( new wxBitmapButton(this, ID_PLAYER_START, wxBitmap(player_start_xpm)) ); h_sizer->Add ( new wxBitmapButton(this, ID_PLAYER_REWIND, wxBitmap(player_rewind_xpm)) ); h_sizer->Add ( new wxBitmapButton(this, ID_PLAYER_PLAY, wxBitmap(player_play_xpm)) ); h_sizer->Add ( new wxBitmapButton(this, ID_PLAYER_STOP, wxBitmap(player_stop_xpm)) ); h_sizer->Add ( new wxBitmapButton (this, ID_PLAYER_FORWARD, wxBitmap(player_forward_xpm)) ); h_sizer->Add ( new wxBitmapButton(this, ID_PLAYER_END, wxBitmap(player_end_xpm)) ); h_sizer->Add( new wxStaticText(this, wxID_ANY, _("Time factor:")) ); h_sizer->Add( m_factor, 1, wxEXPAND ); v_sizer->Add( m_sprite_view, 1, wxEXPAND ); v_sizer->Add( m_slider, 0, wxEXPAND ); v_sizer->Add( h_sizer, 0, wxEXPAND ); SetSizer(v_sizer); } // animation_view_ctrl::create_sizers() /*----------------------------------------------------------------------------*/ /** * \brief Display the current sprite of the animation. */ void bf::animation_view_ctrl::display_current_sprite() { m_sprite_view->set_sprite( m_player.get_sprite() ); } // animation_view_ctrl::display_current_sprite() /*----------------------------------------------------------------------------*/ /** * \brief Start the timer with the duration of the current frame. */ void bf::animation_view_ctrl::set_timer_duration() { if ( !m_player.is_finished() ) m_timer.Start ( (int) (m_factor->GetValue() * m_player.get_duration_until_next() * 1000) ); } // animation_view_ctrl::set_timer_duration() /*----------------------------------------------------------------------------*/ /** * \brief Go to the next frame. */ void bf::animation_view_ctrl::next() { if ( m_player.is_finished() ) m_timer.Stop(); else { m_player.next(); set_timer_duration(); display_current_sprite(); m_slider->SetValue(m_player.get_current_index()); } } // animation_view_ctrl::next() /*----------------------------------------------------------------------------*/ /** * \brief Go to the first frame of the animation. * \param event This event occured. */ void bf::animation_view_ctrl::on_player_start( wxCommandEvent& WXUNUSED(event) ) { m_player.reset(); display_current_sprite(); m_slider->SetValue( m_player.get_current_index() ); } // animation_view_ctrl::on_player_start() /*----------------------------------------------------------------------------*/ /** * \brief Go to the previous frame. * \param event This event occured. */ void bf::animation_view_ctrl::on_player_rewind ( wxCommandEvent& WXUNUSED(event) ) { if ( m_player.get_current_index() > 0 ) { m_player.set_current_index( m_player.get_current_index() - 1 ); display_current_sprite(); m_slider->SetValue( m_player.get_current_index() ); } } // animation_view_ctrl::on_player_rewind() /*----------------------------------------------------------------------------*/ /** * \brief Play the animation. * \param event This event occured. */ void bf::animation_view_ctrl::on_player_play( wxCommandEvent& WXUNUSED(event) ) { if ( m_player.is_finished() ) m_player.reset(); set_timer_duration(); } // animation_view_ctrl::on_player_play() /*----------------------------------------------------------------------------*/ /** * \brief Stop playing the animation. * \param event This event occured. */ void bf::animation_view_ctrl::on_player_stop( wxCommandEvent& WXUNUSED(event) ) { m_timer.Stop(); } // animation_view_ctrl::on_player_stop() /*----------------------------------------------------------------------------*/ /** * \brief Go to the next frame. * \param event This event occured. */ void bf::animation_view_ctrl::on_player_forward ( wxCommandEvent& WXUNUSED(event) ) { if ( m_player.get_current_index() + 1 < m_animation.frames_count() ) { m_player.set_current_index( m_player.get_current_index() + 1 ); display_current_sprite(); m_slider->SetValue( m_player.get_current_index() ); } } // animation_view_ctrl::on_player_forward() /*----------------------------------------------------------------------------*/ /** * \brief Go to the last frame. * \param event This event occured. */ void bf::animation_view_ctrl::on_player_end( wxCommandEvent& WXUNUSED(event) ) { if ( !m_animation.empty() ) { m_player.set_current_index( m_animation.frames_count() - 1 ); display_current_sprite(); m_slider->SetValue( m_player.get_current_index() ); } } // animation_view_ctrl::on_player_end() /*----------------------------------------------------------------------------*/ /** * \brief The position in the slider has been changed. * \param event This event occured. */ void bf::animation_view_ctrl::on_scroll( wxScrollEvent& WXUNUSED(event) ) { unsigned int i = m_slider->GetValue(); if ( i >= m_animation.frames_count() ) i = 0; m_player.set_current_index(i); display_current_sprite(); } // animation_view_ctrl::on_scroll() /*----------------------------------------------------------------------------*/ /** * \brief Time to change the frame. * \param event This event occured. */ void bf::animation_view_ctrl::on_timer( wxTimerEvent& WXUNUSED(event) ) { next(); } // animation_view_ctrl::on_timer() /*----------------------------------------------------------------------------*/ BEGIN_EVENT_TABLE(bf::animation_view_ctrl, wxPanel) EVT_BUTTON( bf::animation_view_ctrl::ID_PLAYER_START, bf::animation_view_ctrl::on_player_start ) EVT_BUTTON( bf::animation_view_ctrl::ID_PLAYER_REWIND, bf::animation_view_ctrl::on_player_rewind ) EVT_BUTTON( bf::animation_view_ctrl::ID_PLAYER_PLAY, bf::animation_view_ctrl::on_player_play ) EVT_BUTTON( bf::animation_view_ctrl::ID_PLAYER_STOP, bf::animation_view_ctrl::on_player_stop ) EVT_BUTTON( bf::animation_view_ctrl::ID_PLAYER_FORWARD, bf::animation_view_ctrl::on_player_forward ) EVT_BUTTON( bf::animation_view_ctrl::ID_PLAYER_END, bf::animation_view_ctrl::on_player_end ) EVT_COMMAND_SCROLL( bf::animation_view_ctrl::ID_SLIDER, bf::animation_view_ctrl::on_scroll ) EVT_TIMER( bf::animation_view_ctrl::ID_TIMER, bf::animation_view_ctrl::on_timer ) END_EVENT_TABLE() plee-the-bear-20251226/bear-factory/bear-editor/src/bf/code/any_animation.cpp000066400000000000000000000157551512343254000266020ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bf::any_animation class. * \author Julien Jorge */ #include "bf/any_animation.hpp" #include "bf/compiled_file.hpp" #include /*----------------------------------------------------------------------------*/ /** * \brief Get a string representation of a content type. * \param c The content type. */ std::string bf::any_animation::content_to_string( content_type c ) { switch( c ) { case content_animation: return "content_animation"; case content_file: return "content_file"; default: { CLAW_FAIL("Invalid content type."); return "invalid content type"; } } } // any_animation::content_to_string() /*----------------------------------------------------------------------------*/ /** * \brief Get a content type from its string representation. * \param c The string representing the content type. */ bf::any_animation::content_type bf::any_animation::string_to_content( const std::string& c ) { if ( c == "content_animation" ) return content_animation; else if ( c == "content_file" ) return content_file; else { CLAW_FAIL("Not a valid content name :'" + c + "'."); return content_animation; } } // any_animation::string_to_content() /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param c The initial content type. */ bf::any_animation::any_animation( content_type c ) : m_content_type(c) { } // any_animation::any_animation() /*----------------------------------------------------------------------------*/ /** * \brief Set the animation file and switch to the content type "content_file" * if needed. * \param a The animation file. */ void bf::any_animation::set_animation_file( const animation_file_type& a ) { m_content_type = content_file; m_animation_file = a; } // any_animation::set_animation_file() /*----------------------------------------------------------------------------*/ /** * \brief Set the animation and switch to the content type "content_animation" * if needed. * \param a The animation. */ void bf::any_animation::set_animation( const animation& a ) { m_content_type = content_animation; m_animation = a; } // any_animation::set_animation() /*----------------------------------------------------------------------------*/ /** * \brief Reload the animation. * \param env The workspace environment to use. */ void bf::any_animation::reload(workspace_environment& env) { if ( m_content_type == content_file ) m_animation_file.set_path( m_animation_file.get_path(), env ); } // any_animation::reload() /*----------------------------------------------------------------------------*/ /** * \brief Get the animation file. * \pre The content type is "content_file". */ const bf::animation_file_type& bf::any_animation::get_animation_file() const { CLAW_PRECOND( m_content_type == content_file ); return m_animation_file; } // any_animation::get_animation_file() /*----------------------------------------------------------------------------*/ /** * \brief Get the animation. * \pre The content type is "content_animation". */ const bf::animation& bf::any_animation::get_animation() const { CLAW_PRECOND( m_content_type == content_animation ); return m_animation; } // any_animation::get_animation() /*----------------------------------------------------------------------------*/ /** * \brief Get the animation associated with the current content. * \pre The content type is "content_animation". */ bf::animation bf::any_animation::get_current_animation() const { switch( m_content_type ) { case content_animation: return m_animation; case content_file: return m_animation_file.get_animation(); default: { CLAW_FAIL("Invalid content type."); return animation(); } } } // any_animation::get_current_animation() /*----------------------------------------------------------------------------*/ /** * \brief Switch the current content to an other type. * \param c The new content type. * \remark When switching from an animation file to an animation, the data from * the animation file is copied in the animation. */ void bf::any_animation::switch_to( content_type c ) { if ( c==m_content_type ) return; if ( m_content_type == content_file ) m_animation = m_animation_file.get_animation(); m_content_type = c; } // any_animation::switch_to() /*----------------------------------------------------------------------------*/ /** * \brief Get the current content type. */ bf::any_animation::content_type bf::any_animation::get_content_type() const { return m_content_type; } // any_animation::get_content_type() /*----------------------------------------------------------------------------*/ /** * \brief Compile the animation. * \param f The stream in which we write the compiled data. * \param c The context in which the compilation is done. */ void bf::any_animation::compile( compiled_file& f, compilation_context& c ) const { f << content_to_string(m_content_type); switch(m_content_type) { case content_animation: m_animation.compile(f, c); break; case content_file: m_animation_file.compile(f); break; default: { CLAW_FAIL("Invalid content type."); } } } // any_animation::compile() /*----------------------------------------------------------------------------*/ /** * \brief Tell if two any_animations are the same. * \param that The other any_animation. */ bool bf::any_animation::operator==( const any_animation& that ) const { if ( m_content_type != that.m_content_type ) return false; switch(m_content_type) { case content_animation: return m_animation == that.m_animation; case content_file: return m_animation_file == that.m_animation_file; default: { CLAW_FAIL("Invalid content type."); return false; } } } // any_animation::operator==() /*----------------------------------------------------------------------------*/ /** * \brief Tell if two any_animations are different. * \param that The other any_animation. */ bool bf::any_animation::operator!=( const any_animation& that ) const { return !(*this == that); } // any_animation::operator!=() /*----------------------------------------------------------------------------*/ /** * \brief Compare two any_animations in lexicographic order. * \param that The other any_animation. */ bool bf::any_animation::operator<( const any_animation& that ) const { if ( m_content_type != that.m_content_type ) return m_content_type < that.m_content_type; switch(m_content_type) { case content_animation: return m_animation < that.m_animation; case content_file: return m_animation_file < that.m_animation_file; default: { CLAW_FAIL("Invalid content type."); return false; } } } // any_animation::operator<() plee-the-bear-20251226/bear-factory/bear-editor/src/bf/code/any_animation_edit.cpp000066400000000000000000000132201512343254000275700ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bf::any_animation_edit class. * \author Julien Jorge */ #include "bf/any_animation_edit.hpp" #include "bf/animation_edit.hpp" #include "bf/animation_file_edit.hpp" #include "bf/wx_facilities.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param parent The window owning this window. * \param env The workspace environment to use. * \param v The initial animation. */ bf::any_animation_edit::any_animation_edit ( wxWindow& parent, workspace_environment& env, const any_animation& v ) : wxPanel(&parent, wxID_ANY), base_edit(v), m_workspace(env) { create_controls(); value_updated(); Fit(); } // any_animation_edit::any_animation_edit() /*----------------------------------------------------------------------------*/ /** * \brief Check if the displayed value is correct and, if it is, set the * value according to the display. */ bool bf::any_animation_edit::validate() { bool result = false; any_animation anim; switch( get_visible_content_type() ) { case any_animation::content_animation: if ( m_animation_edit->validate() ) { anim.set_animation( m_animation_edit->get_value() ); result = true; } break; case any_animation::content_file: if ( m_animation_file_edit->validate() ) { anim.set_animation_file( m_animation_file_edit->get_value() ); result = true; } break; } if ( result ) set_value( anim ); return result; } // any_animation_edit::validate() /*----------------------------------------------------------------------------*/ /** * \brief Method called after changing the value by set_value(). */ void bf::any_animation_edit::value_updated() { fill_controls(); } // any_animation_edit::value_updated() /*----------------------------------------------------------------------------*/ /** * \brief Fill the controls with the values of the any_animation. */ void bf::any_animation_edit::fill_controls() { switch( get_value().get_content_type() ) { case any_animation::content_animation: m_animation_edit->set_value( get_value().get_animation() ); GetSizer()->Hide(m_animation_file_edit); GetSizer()->Show(m_animation_edit); break; case any_animation::content_file: m_animation_file_edit->set_value( get_value().get_animation_file() ); GetSizer()->Hide(m_animation_edit); GetSizer()->Show(m_animation_file_edit); break; } m_content_type->SetStringSelection ( std_to_wx_string ( any_animation::content_to_string(get_value().get_content_type()) ) ); GetSizer()->Layout(); } // any_animation_edit::fill_controls() /*----------------------------------------------------------------------------*/ /** * \brief Get the content type displayed to the user. */ bf::any_animation::content_type bf::any_animation_edit::get_visible_content_type() const { return any_animation::string_to_content ( wx_to_std_string( m_content_type->GetStringSelection() ) ); } // any_animation_edit::get_visible_content_type() /*----------------------------------------------------------------------------*/ /** * \brief Create the controls of the window. */ void bf::any_animation_edit::create_controls() { wxArrayString choices; choices.Add ( std_to_wx_string ( any_animation::content_to_string(any_animation::content_animation) ) ); choices.Add ( std_to_wx_string ( any_animation::content_to_string(any_animation::content_file) ) ); m_content_type = new wxChoice ( this, IDC_CONTENT_TYPE, wxDefaultPosition, wxDefaultSize, choices ); m_content_type->SetStringSelection ( std_to_wx_string ( any_animation::content_to_string(get_value().get_content_type()) ) ); m_animation_edit = new animation_edit(*this, m_workspace); m_animation_file_edit = new animation_file_edit(*this, m_workspace); create_sizer_controls(); fill_controls(); } // any_animation_edit::create_controls() /*----------------------------------------------------------------------------*/ /** * \brief Create the controls and add them in sizers. */ void bf::any_animation_edit::create_sizer_controls() { wxBoxSizer* v_sizer = new wxBoxSizer( wxVERTICAL ); wxBoxSizer* h_sizer = new wxBoxSizer( wxHORIZONTAL ); h_sizer->Add ( new wxStaticText(this, wxID_ANY, _("Content type")), 0, wxEXPAND ); h_sizer->Add( m_content_type, 1, wxEXPAND ); v_sizer->Add( h_sizer, 0, wxEXPAND ); v_sizer->Add( m_animation_edit, 1, wxEXPAND ); v_sizer->Add( m_animation_file_edit, 1, wxEXPAND ); SetSizer(v_sizer); } // any_animation_edit::create_sizer_controls() /*----------------------------------------------------------------------------*/ /** * \brief The user changed the content type of the animation. * \param event This event occured. */ void bf::any_animation_edit::on_switch_content_type ( wxCommandEvent& WXUNUSED(event) ) { any_animation::content_type c = get_visible_content_type(); if ( c != get_value().get_content_type() ) { any_animation anim = get_value(); anim.switch_to(c); set_value(anim); } } // any_animation_edit::on_switch_content_type() /*----------------------------------------------------------------------------*/ BEGIN_EVENT_TABLE(bf::any_animation_edit, wxPanel) EVT_CHOICE( bf::any_animation_edit::IDC_CONTENT_TYPE, bf::any_animation_edit::on_switch_content_type ) END_EVENT_TABLE() plee-the-bear-20251226/bear-factory/bear-editor/src/bf/code/arithmetic_parser.cpp000066400000000000000000000100011512343254000274340ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A parser for simple arithmetic expressions. * \author Julien Jorge */ #include "bf/arithmetic_parser.hpp" #include "bf/arithmetic_grammar.hpp" #include #include #include #include #include #include /*----------------------------------------------------------------------------*/ /** * \brief Evaluates an arithmetic expression. * \param result (out) The result of the evaluation. * \param expr The expression to parse. * \return true if the expression has been well parsed. */ bool bf::arithmetic_parser::evaluate( double& result, std::string expr ) const { arithmetic_grammar grammar; iterator begin( expr.c_str(), expr.c_str() + expr.size() ); iterator end; boost::spirit::classic::tree_parse_info info; info = boost::spirit::classic::ast_parse ( begin, end, grammar, boost::spirit::classic::space_p ); if ( !info.match ) return false; else return evaluate_tree( result, info.trees[0] ); } // arithmetic_parser::evaluate() /*----------------------------------------------------------------------------*/ /** * \brief Evaluates the value of the tree obtained from the parsed expression. * \param result (out) The result of the evaluation. * \param tree The expression to evaluate. * \return true if the expression has evaluated. */ bool bf::arithmetic_parser::evaluate_tree ( double& result, tree_node const& tree ) const { switch (tree.value.id().to_long()) { case arithmetic_grammar::id_real: return parse_real ( result, std::string( tree.value.begin(), tree.value.end() ) ); case arithmetic_grammar::id_expression: case arithmetic_grammar::id_term: case arithmetic_grammar::id_factor: return evaluate_operator ( result, *tree.value.begin(), *tree.children.begin(), *(tree.children.begin() + 1) ); default: CLAW_FAIL( "unknown tree identifier" ); } return false; } // arithmetic_parser::evaluate_tree() /*----------------------------------------------------------------------------*/ /** * \brief Evaluates an operator from the tree obtained from the parsed * expression. * \param result (out) The result of the evaluation. * \param op The operator to evaluate. * \param left_tree The tree built from the left operand. * \param right_tree The tree built from the right operand. * \return true if the expression has evaluated. */ bool bf::arithmetic_parser::evaluate_operator ( double& result, char op, tree_node const& left_tree, tree_node const& right_tree ) const { double left; double right; if( !evaluate_tree( left, left_tree ) || !evaluate_tree( right, right_tree ) ) return false; switch( op ) { case '+': result = left + right; return true; case '-': result = left - right; return true; case '*': result = left * right; return true; case '/': result = left / right; return true; default: CLAW_FAIL( std::string( "unknown operand: " ) + op ); } return false; } // arithmetic_parser::evaluate_operator() /*----------------------------------------------------------------------------*/ /** * \brief Reads the double value represented by a given string. * \param result The value read from the string. * \param s The string to parse. * \return true if s has been well converted into a double. */ bool bf::arithmetic_parser::parse_real( double& result, std::string s ) const { try { result = boost::lexical_cast(s); return true; } catch( const boost::bad_lexical_cast& e ) { return false; } } // arithmetic_parser::parse_real() plee-the-bear-20251226/bear-factory/bear-editor/src/bf/code/base_editor_application.cpp000066400000000000000000000243001512343254000306010ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bf::base_editor_application class. * \author Julien Jorge. */ #include "bf/base_editor_application.hpp" #include "bf/path_configuration.hpp" #include "bf/version.hpp" #include "bf/workspace_environment.hpp" #include "bf/wx_facilities.hpp" #include #include #include #include #include /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ bf::base_editor_application::base_editor_application() : m_locale( wxLocale::GetSystemLanguage() ) { claw::logger.set( new claw::console_logger() ); claw::logger.set_level( claw::log_verbose ); #ifdef BEAR_FACTORY_TEXT_DOMAIN_PATH m_locale.AddCatalogLookupPathPrefix ( L"" BOOST_PP_STRINGIZE(BEAR_FACTORY_TEXT_DOMAIN_PATH) ); #endif m_locale.AddCatalog( wxT("bear-factory") ); } // base_editor_application::base_editor_application() /*----------------------------------------------------------------------------*/ /** * \brief Destructor. */ bf::base_editor_application::~base_editor_application() { // frames are deleted by wxWidgets claw::logger.clear(); } // base_editor_application::~base_editor_application() /*----------------------------------------------------------------------------*/ /** * \brief Compile a file. * \param path The path to the file. */ void bf::base_editor_application::compile( const wxString& path ) const { } // base_editor_application::compile() /*----------------------------------------------------------------------------*/ /** * \brief Update a file. * \param path The path to the file. */ void bf::base_editor_application::update( const wxString& path ) const { } // base_editor_application::update() /*----------------------------------------------------------------------------*/ /** * \brief Application-defined initialisation. */ bool bf::base_editor_application::do_init_app(const workspace_environment& env) { return true; } // base_editor_application::do_init_app() /*----------------------------------------------------------------------------*/ /** * \brief Application-defined minimal initialisation, for command line usage. */ bool bf::base_editor_application::do_command_line_init() { return true; } // base_editor_application::do_command_line_init() /*----------------------------------------------------------------------------*/ /** * \brief Method called when the application is initializing. */ bool bf::base_editor_application::OnInit() { bool result = false; if ( show_help() ) return result; if ( show_version() ) return result; const bool compile_f ( find_and_erase_option( wxT("--compile"), wxT("-c") ) ); const bool update_f ( find_and_erase_option( wxT("--update"), wxT("-u") ) ); if ( compile_f || update_f ) { command_line_init(); if ( update_f ) update_arguments(); if ( compile_f ) compile_arguments(); } else { std::string workspace_name; get_worspace_name( workspace_name ); result = init_app( workspace_environment( workspace_name ) ); } return result; } // base_editor_application::OnInit() /*----------------------------------------------------------------------------*/ /** * \brief Gets the name of the worspace if the user has given one. * \param result The name of the workspace, as provided by the user. * \return true if a workspace has been given. */ bool bf::base_editor_application::get_worspace_name( std::string& result ) { std::string workspace_name; bool result_is_set( false ); const bool has_workspace ( find_and_erase_option_value ( wxT("--workspace"), wxT("-w"), workspace_name ) ); if ( has_workspace ) { result = workspace_name; result_is_set = true; } return result_is_set; } // base_editor_application::get_worspace_name() /*----------------------------------------------------------------------------*/ /** * \brief Initialise the application. minimal_init() is not called * automatically. * \param env The workspace environment. */ bool bf::base_editor_application::init_app(const workspace_environment& env) { wxToolTip::Enable(true); return do_init_app(env); } // base_editor_application::init_app() /*----------------------------------------------------------------------------*/ /** * \brief Minimal initialisation of the application, for command line usage. */ bool bf::base_editor_application::command_line_init() { return do_command_line_init(); } // base_editor_application::command_line_init() /*----------------------------------------------------------------------------*/ /** * \brief Compile the files and exit. */ bool bf::base_editor_application::compile_arguments() const { bool result(true); for (int i=1; i All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bitmap_rendering_attributes class. * \author Julien Jorge */ #include "bf/bitmap_rendering_attributes.hpp" #include "bf/compiled_file.hpp" #include #include /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ bf::bitmap_rendering_attributes::bitmap_rendering_attributes() : m_size(0, 0), m_flip(trinary_logic::boolean_false), m_mirror(trinary_logic::boolean_false), m_color(1,1,1,1), m_angle(0), m_auto_size(true) { } // bitmap_rendering_attributes::bitmap_rendering_attributes() /*----------------------------------------------------------------------------*/ /** * \brief Tell if two bitmap_rendering_attributes are the same. * \param that The instance to compare to. */ bool bf::bitmap_rendering_attributes::operator== ( const bitmap_rendering_attributes& that ) const { return (m_size == that.m_size) && (m_flip == that.m_flip) && (m_mirror == that.m_mirror) && (m_color == that.m_color) && (m_angle == that.m_angle) && (m_auto_size == that.m_auto_size); } // bitmap_rendering_attributes::operator==() /*----------------------------------------------------------------------------*/ /** * \brief Tell if two bitmap_rendering_attributes are different. * \param that The instance to compare to. */ bool bf::bitmap_rendering_attributes::operator!= ( const bitmap_rendering_attributes& that ) const { return !(*this == that); } // bitmap_rendering_attributes::operator!=() /*----------------------------------------------------------------------------*/ /** * \brief Compare two bitmap_rendering_attributes in lexicographic order. * \param that The instance to compare to. */ bool bf::bitmap_rendering_attributes::operator< ( const bitmap_rendering_attributes& that ) const { if (m_size.x != that.m_size.x) return m_size.x < that.m_size.x; if (m_size.y != that.m_size.y) return m_size.y < that.m_size.y; if (m_flip != that.m_flip) return m_flip < that.m_flip; if (m_mirror != that.m_mirror) return m_mirror < that.m_mirror; if (m_color != that.m_color) return m_color < that.m_color; if ( m_angle != that.m_angle ) return m_angle < that.m_angle; return m_auto_size < that.m_auto_size; } // bitmap_rendering_attributes::operator<() /*----------------------------------------------------------------------------*/ /** * \brief Get the color. */ const bf::color& bf::bitmap_rendering_attributes::get_color() const { return m_color; } // bitmap_rendering_attributes::get_color() /*----------------------------------------------------------------------------*/ /** * \brief Get the color. */ bf::color& bf::bitmap_rendering_attributes::get_color() { return m_color; } // bitmap_rendering_attributes::get_color() /*----------------------------------------------------------------------------*/ /** * \brief Set the color. * \param c The color. */ void bf::bitmap_rendering_attributes::set_color( const color& c ) { m_color = c; } // bitmap_rendering_attributes::set_color() /*----------------------------------------------------------------------------*/ /** * \brief Tell if the size is automatically computed. * \param a Tell if the size is automatically computed. */ void bf::bitmap_rendering_attributes::set_auto_size( bool a ) { m_auto_size = a; } // bitmap_rendering_attributes::set_auto_size() /*----------------------------------------------------------------------------*/ /** * \brief Tell if the size is automatically computed. */ bool bf::bitmap_rendering_attributes::get_auto_size() const { return m_auto_size; } // bitmap_rendering_attributes::get_auto_size() /*----------------------------------------------------------------------------*/ /** * \brief Get the size. */ const claw::math::coordinate_2d& bf::bitmap_rendering_attributes::get_size() const { return m_size; } // bitmap_rendering_attributes::get_size() /*----------------------------------------------------------------------------*/ /** * \brief Set the size. * \param s The new size. */ void bf::bitmap_rendering_attributes::set_size ( const claw::math::coordinate_2d& s ) { m_size = s; } // bitmap_rendering_attributes::set_size() /*----------------------------------------------------------------------------*/ /** * \brief Set the size. * \param w The new width. * \param h The new height. */ void bf::bitmap_rendering_attributes::set_size ( unsigned int w, unsigned int h ) { m_size.set(w, h); } // bitmap_rendering_attributes::set_size() /*----------------------------------------------------------------------------*/ /** * \brief Set the width. * \param w The new width. */ void bf::bitmap_rendering_attributes::set_width( unsigned int w ) { m_size.x = w; } // bitmap_rendering_attributes::set_width() /*----------------------------------------------------------------------------*/ /** * \brief Set the height. * \param h The new height. */ void bf::bitmap_rendering_attributes::set_height( unsigned int h ) { m_size.y = h; } // bitmap_rendering_attributes::set_height() /*----------------------------------------------------------------------------*/ /** * \brief Get the width. */ unsigned int bf::bitmap_rendering_attributes::width() const { return m_size.x; } // bitmap_rendering_attributes::width() /*----------------------------------------------------------------------------*/ /** * \brief Get the height. */ unsigned int bf::bitmap_rendering_attributes::height() const { return m_size.y; } // bitmap_rendering_attributes::height() /*----------------------------------------------------------------------------*/ /** * \brief Set the angle. * \param a The new angle. */ void bf::bitmap_rendering_attributes::set_angle( double a ) { m_angle = a; } // bitmap_rendering_attributes::set_angle() /*----------------------------------------------------------------------------*/ /** * \brief Get the angle. */ double bf::bitmap_rendering_attributes::get_angle() const { return m_angle; } // bitmap_rendering_attributes::get_angle() /*----------------------------------------------------------------------------*/ /** * \brief Set vertical inversion. * \param b The new value for the inversion. */ void bf::bitmap_rendering_attributes::flip( trinary_logic::value_type b ) { m_flip = b; } // bitmap_rendering_attributes::flip() /*----------------------------------------------------------------------------*/ /** * \brief Set horizontal inversion. * \param b The new value for the inversion. */ void bf::bitmap_rendering_attributes::mirror( trinary_logic::value_type b ) { m_mirror = b; } // bitmap_rendering_attributes::mirror() /*----------------------------------------------------------------------------*/ /** * \brief Get vertical inversion. */ bf::trinary_logic::value_type bf::bitmap_rendering_attributes::get_flipped_status() const { return m_flip; } // bitmap_rendering_attributes::get_flipped_status() /*----------------------------------------------------------------------------*/ /** * \brief Get horizontal inversion. */ bf::trinary_logic::value_type bf::bitmap_rendering_attributes::get_mirrored_status() const { return m_mirror; } // bitmap_rendering_attributes::get_mirrored_status() /*----------------------------------------------------------------------------*/ /** * \brief Compile the attributes. * \param f The stream in which we write the compilation. */ void bf::bitmap_rendering_attributes::compile( compiled_file& f ) const { f << m_size.x << m_size.y << trinary_logic::to_random_bool(m_mirror) << trinary_logic::to_random_bool(m_flip) << m_color.get_opacity() << m_color.get_red_intensity() << m_color.get_green_intensity() << m_color.get_blue_intensity() << m_angle; } // bitmap_rendering_attributes::compile() /*----------------------------------------------------------------------------*/ /** * \brief Copy the values of an other bitmap_rendering_attributes in this one. * \param that The bitmap_rendering_attributes from which we copy. */ bf::bitmap_rendering_attributes& bf::bitmap_rendering_attributes::assign ( const bitmap_rendering_attributes& that ) { return *this = that; } // bitmap_rendering_attributes::assign() /*----------------------------------------------------------------------------*/ /** * \brief Combine with an other set of attributes. * \param that The attributes to combine with. * The attributes changed by this method are : get_flipped_status(), * get_mirrored_status(), the intensities, the opacity and the angle. * The size is not changed. */ void bf::bitmap_rendering_attributes::combine ( const bitmap_rendering_attributes& that ) { flip( trinary_logic::from_bool (trinary_logic::to_bool(that.get_flipped_status()) ^ trinary_logic::to_bool(get_flipped_status())) ); mirror( trinary_logic::from_bool (trinary_logic::to_bool(that.get_mirrored_status()) ^ trinary_logic::to_bool(get_mirrored_status())) ); m_color.set_intensity ( that.get_color().get_red_intensity() * m_color.get_red_intensity(), that.get_color().get_green_intensity() * m_color.get_green_intensity(), that.get_color().get_blue_intensity() * m_color.get_blue_intensity() ); m_color.set_opacity( that.get_color().get_opacity() * m_color.get_opacity() ); set_angle( that.get_angle() + get_angle() ); } // bitmap_rendering_attributes::combine() plee-the-bear-20251226/bear-factory/bear-editor/src/bf/code/bitmap_rendering_attributes_edit.cpp000066400000000000000000000165541512343254000325360ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bf::bitmap_rendering_attributes_edit class. * \author Sebastien Angibaud */ #include "bf/bitmap_rendering_attributes_edit.hpp" #include "bf/wx_facilities.hpp" #include #include /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param parent The window owning this window. * \param att The initial bitmap_rendering_attributes. */ bf::bitmap_rendering_attributes_edit::bitmap_rendering_attributes_edit ( wxWindow& parent, const bitmap_rendering_attributes& att ) : wxPanel(&parent, wxID_ANY), base_edit(att) { create_controls(); Fit(); } // bitmap_rendering_attributes_edit::bitmap_rendering_attributes_edit() /*----------------------------------------------------------------------------*/ /** * \brief Check if the displayed value is correct and, if it is, set the * value according to the display. */ bool bf::bitmap_rendering_attributes_edit::validate() { bitmap_rendering_attributes att; att.set_auto_size( m_auto_size->IsChecked() ); att.set_width( m_width_spin->GetValue() ); att.set_height( m_height_spin->GetValue() ); if ( m_flip_x_box->Get3StateValue() == wxCHK_UNCHECKED ) att.mirror( trinary_logic::boolean_false ); else if ( m_flip_x_box->Get3StateValue() == wxCHK_CHECKED ) att.mirror( trinary_logic::boolean_true ); else att.mirror( trinary_logic::boolean_random ); if ( m_flip_y_box->Get3StateValue() == wxCHK_UNCHECKED ) att.flip( trinary_logic::boolean_false ); else if ( m_flip_y_box->Get3StateValue() == wxCHK_CHECKED ) att.flip( trinary_logic::boolean_true ); else att.flip( trinary_logic::boolean_random ); m_color_ctrl->validate(); att.set_color( m_color_ctrl->get_value() ); att.set_angle( m_angle_spin->GetValue() ); set_value(att); return true; } // bitmap_rendering_attributes_edit::validate() /*----------------------------------------------------------------------------*/ /** * \brief Method called after changing the value by set_value(). */ void bf::bitmap_rendering_attributes_edit::value_updated() { fill_controls(); } // bitmap_rendering_attributes_edit::value_updated() /*----------------------------------------------------------------------------*/ /** * \brief Fill the controls with the values of the bitmap_rendering_attributes. */ void bf::bitmap_rendering_attributes_edit::fill_controls() { bitmap_rendering_attributes att = get_value(); m_auto_size->SetValue( att.get_auto_size() ); m_width_spin->Enable( !att.get_auto_size() ); m_height_spin->Enable( !att.get_auto_size() ); m_width_spin->SetValue( att.width() ); m_height_spin->SetValue( att.height() ); if ( att.get_mirrored_status() == trinary_logic::boolean_false ) m_flip_x_box->Set3StateValue(wxCHK_UNCHECKED); else if ( att.get_mirrored_status() == trinary_logic::boolean_true ) m_flip_x_box->Set3StateValue(wxCHK_CHECKED); else m_flip_x_box->Set3StateValue(wxCHK_UNDETERMINED); if ( att.get_flipped_status() == trinary_logic::boolean_false ) m_flip_y_box->Set3StateValue(wxCHK_UNCHECKED); else if ( att.get_flipped_status() == trinary_logic::boolean_true ) m_flip_y_box->Set3StateValue(wxCHK_CHECKED); else m_flip_y_box->Set3StateValue(wxCHK_UNDETERMINED); m_color_ctrl->set_value( att.get_color() ); m_angle_spin->SetValue( att.get_angle() ); } // bitmap_rendering_attributes_edit::fill_controls() /*----------------------------------------------------------------------------*/ /** * \brief Create the controls of the window. */ void bf::bitmap_rendering_attributes_edit::create_controls() { wxBoxSizer* sizer = new wxBoxSizer( wxVERTICAL ); sizer->Add(create_size_and_placement_sizer(), 0, wxEXPAND, 0); sizer->Add(create_color_sizer(), 0, wxEXPAND, 0); SetSizer(sizer); fill_controls(); } // bitmap_rendering_attributes_edit::create_controls() /*----------------------------------------------------------------------------*/ /** * \brief Create the controls and the sizer for the size and placement position * part. */ wxSizer* bf::bitmap_rendering_attributes_edit::create_size_and_placement_sizer() { wxStaticBoxSizer* result = new wxStaticBoxSizer( wxVERTICAL, this, _("Size and placement") ); m_auto_size = new wxCheckBox( this, ID_AUTO_SIZE, _("Auto size") ); m_width_spin = new wxSpinCtrl( this, wxID_ANY ); m_height_spin = new wxSpinCtrl( this, wxID_ANY ); m_flip_x_box = new wxCheckBox ( this, wxID_ANY, _("mirror"), wxDefaultPosition, wxDefaultSize, wxCHK_3STATE | wxCHK_ALLOW_3RD_STATE_FOR_USER); m_flip_y_box = new wxCheckBox ( this, wxID_ANY, _("flip"), wxDefaultPosition, wxDefaultSize, wxCHK_3STATE | wxCHK_ALLOW_3RD_STATE_FOR_USER); m_angle_spin = new spin_ctrl ( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxEXPAND, -std::numeric_limits::infinity(), std::numeric_limits::infinity(), 0, 0.01 ); m_width_spin->SetRange( 0, std::numeric_limits::max() ); m_height_spin->SetRange( 0, std::numeric_limits::max() ); wxBoxSizer* sub_sizer = new wxBoxSizer( wxHORIZONTAL ); sub_sizer->Add( m_auto_size, 0, wxEXPAND ); sub_sizer->Add( new wxStaticText(this, wxID_ANY, _("Width:")), 1, wxALIGN_CENTRE_VERTICAL | wxALL, 5 ); sub_sizer->Add( m_width_spin, 0, wxALL, 5 ); sub_sizer->Add( new wxStaticText(this, wxID_ANY, _("Height:")), 1, wxALIGN_CENTRE_VERTICAL | wxALL, 5 ); sub_sizer->Add( m_height_spin, 0, wxALL, 5 ); result->Add( sub_sizer, 0, wxEXPAND, 0 ); sub_sizer = new wxBoxSizer( wxHORIZONTAL ); sub_sizer->Add( m_flip_x_box, 0, wxEXPAND, 0 ); sub_sizer->Add( m_flip_y_box, 0, wxEXPAND, 0 ); sub_sizer->Add ( new wxStaticText(this, wxID_ANY, _("Angle:")), 1, wxALIGN_CENTRE_VERTICAL | wxALL, 5 ); sub_sizer->Add( m_angle_spin, 1, wxEXPAND, 0 ); result->Add( sub_sizer, 0, wxEXPAND, 0 ); return result; } // bitmap_rendering_attributes_edit::create_size_and_placement_sizer() /*----------------------------------------------------------------------------*/ /** * \brief Create the controls and the sizer for the color part. */ wxSizer* bf::bitmap_rendering_attributes_edit::create_color_sizer() { m_color_ctrl = new color_edit( this ); wxStaticBoxSizer* result = new wxStaticBoxSizer( wxHORIZONTAL, this, _("Color") ); result->Add( m_color_ctrl, 0, wxEXPAND, 0 ); return result; } // bitmap_rendering_attributes_edit::create_color_sizer() /*----------------------------------------------------------------------------*/ /** * \brief Event sent when the auto size checkbox changes. * \param event The event. */ void bf::bitmap_rendering_attributes_edit::on_auto_size ( wxCommandEvent& WXUNUSED(event) ) { m_width_spin->Enable( !m_auto_size->IsChecked() ); m_height_spin->Enable( !m_auto_size->IsChecked() ); } // bitmap_rendering_attributes_edit::on_auto_size() /*----------------------------------------------------------------------------*/ BEGIN_EVENT_TABLE(bf::bitmap_rendering_attributes_edit, wxPanel) EVT_CHECKBOX( bf::bitmap_rendering_attributes_edit::ID_AUTO_SIZE, bf::bitmap_rendering_attributes_edit::on_auto_size ) END_EVENT_TABLE() plee-the-bear-20251226/bear-factory/bear-editor/src/bf/code/bool_edit.cpp000066400000000000000000000035401512343254000257010ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bf::bool_edit class. * \author Julien Jorge */ #include "bf/bool_edit.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param parent The windows owning this one. * \param v The initial value. */ bf::bool_edit::bool_edit( wxWindow& parent, const value_type& v ) : base_edit(v), wxCheckBox(&parent, wxID_ANY, _("'True' if checked")) { init(); } // bool_edit::bool_edit() /*----------------------------------------------------------------------------*/ /** * \brief Check if the displayed value is correct and, if it is, set the * value according to the display. */ bool bf::bool_edit::validate() { set_value( bool_type(GetValue()) ); return true; } // bool_edit::validate() /*----------------------------------------------------------------------------*/ /** * \brief Initialise the control. */ void bf::bool_edit::init() { Connect( GetId(), wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler(bool_edit::on_change) ); value_updated(); } // bool_edit::init() /*----------------------------------------------------------------------------*/ /** * \brief Method called when the value has been changed, to update the display. */ void bf::bool_edit::value_updated() { SetValue( get_value().get_value() ); } // bool_edit::value_updated() /*----------------------------------------------------------------------------*/ /** * \brief Event handler for a change in the text. * \param event The event. */ void bf::bool_edit::on_change( wxCommandEvent& WXUNUSED(event) ) { validate(); } // bool_edit::on_change() plee-the-bear-20251226/bear-factory/bear-editor/src/bf/code/check_error.cpp000066400000000000000000000027141512343254000262310ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bf::check_error class. * \author Julien Jorge */ #include "bf/check_error.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param msg A description of the error. */ bf::check_error::check_error( const std::string& msg ) : m_message(msg) { } // check_error::check_error() /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param cause A description of the element on which the error occured. * \param msg A description of the error. */ bf::check_error::check_error( const std::string& cause, const std::string& msg ) : m_cause(cause), m_message(msg) { } // check_error::check_error() /*----------------------------------------------------------------------------*/ /** * \brief Get the description of the element on which the error occured. */ const std::string& bf::check_error::get_cause() const { return m_cause; } // check_error::get_cause() /*----------------------------------------------------------------------------*/ /** * \brief Get the description of the error. */ const std::string& bf::check_error::get_message() const { return m_message; } // check_error::get_message() plee-the-bear-20251226/bear-factory/bear-editor/src/bf/code/class_not_found.cpp000066400000000000000000000025361512343254000271250ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bf::xml* exceptions classes. */ #include "bf/class_not_found.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param class_name The name of the class. */ bf::class_not_found::class_not_found( const std::string& class_name ) : m_msg( "Can't find item class '" + class_name + "'"), m_class_name(class_name) { } // class_not_found::class_not_found() /*----------------------------------------------------------------------------*/ /** * \brief Destructor. */ bf::class_not_found::~class_not_found() throw() { } // class_not_found::class_not_found() /*----------------------------------------------------------------------------*/ /** * \brief Get an explanation of the problem. */ const char* bf::class_not_found::what() const throw() { return m_msg.c_str(); } // class_not_found::what() /*----------------------------------------------------------------------------*/ /** * \brief Get the name of the class. */ const std::string& bf::class_not_found::class_name() const throw() { return m_class_name; } // class_not_found::class_name() plee-the-bear-20251226/bear-factory/bear-editor/src/bf/code/class_tree_ctrl.cpp000066400000000000000000000453371512343254000271230ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bf::class_tree_ctrl class. * \author Julien Jorge */ #include "bf/class_tree_ctrl.hpp" #include "bf/workspace_environment.hpp" #include "bf/tree_builder.hpp" #include "bf/wx_facilities.hpp" #include #include /*----------------------------------------------------------------------------*/ const wxEventType bf::class_selected_event::class_selected_event_type = wxNewEventType(); /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param class_name The name of the selected class. * \param t The type of the event. * \param id The id of the window that generates the event. */ bf::class_selected_event::class_selected_event ( const std::string& class_name, wxEventType t, wxWindowID id ) : wxNotifyEvent(t, id), m_class_name(class_name) { } // class_selected_event::class_selected_event() /*----------------------------------------------------------------------------*/ /** * \brief Allocate a copy of this instance. */ wxEvent* bf::class_selected_event::Clone() const { return new class_selected_event(*this); } // class_selected_event::Clone() /*----------------------------------------------------------------------------*/ /** * \brief Get the name of the selected class. */ const std::string& bf::class_selected_event::get_class_name() const { return m_class_name; } // class_selected_event::get_class_name() /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param parent Pointer to the owner. * \param id Identifier of the control. * \remark \a pool must live longer than this instance of class_tree_ctrl. */ bf::class_tree_ctrl::class_tree_ctrl( wxWindow* parent, int id ) : wxPanel( parent, id, wxDefaultPosition, wxDefaultSize ), m_workspace(NULL) { create_controls(); fill_tree(); fill_recent_used_classes_list(); } // class_tree_ctrl::class_tree_ctrl() /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param parent Pointer to the owner. * \param env The workspace environment used. * \param id Identifier of the control. * \remark \a pool must live longer than this instance of class_tree_ctrl. */ bf::class_tree_ctrl::class_tree_ctrl ( wxWindow* parent, workspace_environment& env, int id ) : wxPanel( parent, id, wxDefaultPosition, wxDefaultSize ), m_workspace(&env) { create_controls(); fill_tree(); fill_recent_used_classes_list(); } // class_tree_ctrl::class_tree_ctrl() /*----------------------------------------------------------------------------*/ /** * \brief Removes the environment from which we list the classes. */ void bf::class_tree_ctrl::unset_workspace() { m_workspace = NULL; fill_tree(); fill_recent_used_classes_list(); } // class_tree_ctrl::unset_workspace() /*----------------------------------------------------------------------------*/ /** * \brief Sets the environment from which we list the classes. * \param env The workspace environment used. */ void bf::class_tree_ctrl::set_workspace( workspace_environment& env ) { m_workspace = &env; fill_tree(); fill_recent_used_classes_list(); } // class_tree_ctrl::set_workspace() /*----------------------------------------------------------------------------*/ /** * \brief Get the selected item in the tree. */ wxTreeItemId bf::class_tree_ctrl::GetSelection() const { return m_tree->GetSelection(); } // class_tree_ctrl::GetSelection() /*----------------------------------------------------------------------------*/ /** * \brief Tell if an item of the tree has children nodes. * \param item The item we're looking for. */ bool bf::class_tree_ctrl::ItemHasChildren( const wxTreeItemId& item ) const { return m_tree->ItemHasChildren(item); } // class_tree_ctrl::ItemHasChildren() /*----------------------------------------------------------------------------*/ /** * \brief Get the text associated with an item of the tree. * \param item The item we're looking for. */ wxString bf::class_tree_ctrl::GetItemText( const wxTreeItemId& item ) const { return m_tree->GetItemText(item); } // class_tree_ctrl::GetItemText() /*----------------------------------------------------------------------------*/ /** * \brief A class is used. * \param c The class to add. */ void bf::class_tree_ctrl::use_class( const std::string & c ) { add_recent_used_class( c ); m_recent_used_classes_list->Select(0); } // class_tree_ctrl::use_class() /*----------------------------------------------------------------------------*/ /** * \brief Add a recent used class. * \param c The class to add. */ void bf::class_tree_ctrl::add_recent_used_class( const std::string & c ) { // delete used class bool found = false; std::list< std::string >::iterator it; for ( it = m_recent_used_classes.begin(); it != m_recent_used_classes.end() && ! found ; ) if ( *it == c ) found = true; else ++it; if ( found ) m_recent_used_classes.erase(it); // delete last class if the list is full if ( m_recent_used_classes.size() >= 10 ) m_recent_used_classes.pop_back(); // add used class m_recent_used_classes.push_front(c); fill_recent_used_classes_list(); } // bf::class_tree_ctrl::add_recent_used_class() /*----------------------------------------------------------------------------*/ /** * \brief Create the controls. */ void bf::class_tree_ctrl::create_controls() { m_tree = new wxTreeCtrl ( this, IDC_TREE, wxDefaultPosition, wxDefaultSize, wxTR_DEFAULT_STYLE | wxTR_FULL_ROW_HIGHLIGHT | wxTR_HIDE_ROOT ); m_recent_used_classes_list = new wxListView ( this, IDC_RECENT_USED_CLASSES, wxDefaultPosition, wxDefaultSize, wxLC_REPORT | wxLC_VRULES | wxLC_SINGLE_SEL ); m_recent_used_classes_list->InsertColumn(0, _("Recent used classes :")); m_pattern = new wxTextCtrl( this, IDC_PATTERN ); m_pattern->SetToolTip ( _("Type a pattern to filter the classes in the tree. " "For example: typing \"b*r\" will display the classes whose name " "contains the letter b followed by the letter r, possibly with " "letters between.") ); m_class_description = new wxStaticText(this, wxID_ANY, _("Description:")); wxSizer* h_sizer = new wxBoxSizer( wxHORIZONTAL ); wxSizer* v_sizer = new wxBoxSizer( wxVERTICAL ); h_sizer->Add( new wxStaticText(this, wxID_ANY, _("Search:")), 0, wxEXPAND ); h_sizer->Add( m_pattern, 1, wxEXPAND ); v_sizer->Add(m_recent_used_classes_list, 1, wxEXPAND); v_sizer->AddSpacer(5); v_sizer->Add(h_sizer, 0, wxEXPAND); v_sizer->Add(m_tree, 2, wxEXPAND); v_sizer->AddSpacer(5); v_sizer->Add(m_class_description, 0, wxEXPAND); SetSizer(v_sizer); m_tree->Connect ( wxEVT_LEFT_DCLICK, wxMouseEventHandler( class_tree_ctrl::on_double_click ), NULL, this ); m_tree->Connect ( wxEVT_KEY_UP, wxKeyEventHandler( class_tree_ctrl::on_key_up ), NULL, this ); m_tree->Connect ( wxEVT_MOTION, wxMouseEventHandler( class_tree_ctrl::on_mouse_move ), NULL, this ); m_recent_used_classes_list->Connect ( wxEVT_MOTION, wxMouseEventHandler( class_tree_ctrl::on_mouse_move ), NULL, this ); } // class_tree_ctrl::create_controls() /*----------------------------------------------------------------------------*/ /** * \brief Create the tree of classes. */ void bf::class_tree_ctrl::fill_tree() { m_tree->DeleteAllItems(); m_tree->AddRoot( _("Item classes") ); tree_builder tb; create_categories_tree(tb); tb.create_wxTree( *m_tree ); m_tree->ExpandAll(); } // class_tree_ctrl::fill_tree() /*----------------------------------------------------------------------------*/ /** * \brief Create the list of recent used classes. */ void bf::class_tree_ctrl::fill_recent_used_classes_list() { std::list< std::string >::const_iterator it; unsigned int i = 0; m_recent_used_classes_list->DeleteAllItems(); if ( m_workspace == NULL ) return; for ( it = m_recent_used_classes.begin(); it != m_recent_used_classes.end(); ++i, ++it ) if ( m_workspace->get_item_class_pool().has_item_class( *it ) ) { const wxString class_name(std_to_wx_string(*it)); m_recent_used_classes_list->InsertItem(i, class_name); } } // class_tree_ctrl::fill_recent_used_classes_list() /*----------------------------------------------------------------------------*/ /** * \brief Create the tree of classes. * \param tb (out) The tree builder. */ void bf::class_tree_ctrl::create_categories_tree( tree_builder& tb ) const { if ( m_workspace == NULL ) return; const wxString pattern( make_pattern() ); item_class_pool::const_iterator it = m_workspace->get_item_class_pool().begin(); const item_class_pool::const_iterator eit = m_workspace->get_item_class_pool().end(); for ( ; it!=eit; ++it ) if ( it->get_category() != "-abstract-" ) { const wxString description( std_to_wx_string( it->get_description() ) ); const wxString class_name( std_to_wx_string( it->get_class_name() ) ); const wxString category( std_to_wx_string( it->get_category() ) ); if ( class_name.Matches(pattern) || description.Matches(pattern) || category.Matches(pattern) ) { const std::string cat( it->get_category() ); if ( cat.empty() ) tb.add_entries( it->get_class_name(), '/' ); else tb.add_entries( cat + '/' + it->get_class_name(), '/' ); } } } // class_tree_ctrl::create_categories_tree() /*----------------------------------------------------------------------------*/ /** * \brief Create a pattern from the pattern in the search box, that will match * the original pattern anywhere in the string. */ wxString bf::class_tree_ctrl::make_pattern() const { wxString pattern( m_pattern->GetValue() ); if ( pattern.IsEmpty() ) pattern = wxT("*"); if ( (pattern[0] != wxT('*')) && (pattern[0] != wxT('?')) ) pattern = wxT("*") + pattern; if ( (pattern[pattern.length() - 1] != wxT('*')) && (pattern[pattern.length() - 1] != wxT('?')) ) pattern += wxT("*"); return pattern; } // class_tree_ctrl::make_pattern() /*----------------------------------------------------------------------------*/ /** * \brief Select a class in the tree. * \param all_children Tell if we expand the whole subtree (if selected item is * not a leaf). */ void bf::class_tree_ctrl::select_class( bool all_children ) { wxTreeItemId item = m_tree->GetSelection(); if ( item.IsOk() ) { if ( m_tree->ItemHasChildren(item) ) { if ( m_tree->IsExpanded(item) ) { if ( all_children ) m_tree->CollapseAllChildren(item); else m_tree->Collapse(item); } else { if ( all_children ) m_tree->ExpandAllChildren(item); else m_tree->Expand(item); } } else { select_class( wx_to_std_string( m_tree->GetItemText(item) ) ); wxTreeItemId item = m_tree->GetSelection(); if ( item.IsOk() ) { if ( !m_tree->ItemHasChildren(item) ) { m_selected_class.SetText( m_tree->GetItemText(item) ); unselect_recent_class(); } else m_selected_class.SetText( _("") ); } else m_selected_class.SetText( _("") ); } show_class_description(); } } // class_tree_ctrl::select_class() /*----------------------------------------------------------------------------*/ /** * \brief Select a class. * \param c The class to select. */ void bf::class_tree_ctrl::select_class( const std::string& c ) { add_recent_used_class( c ); class_selected_event event ( c, class_selected_event::class_selected_event_type, GetId() ); event.SetEventObject(this); ProcessEvent(event); } // class_tree_ctrl::select_class() /*----------------------------------------------------------------------------*/ /** * \brief Unselect the recent class. */ void bf::class_tree_ctrl::unselect_class_in_tree() { wxTreeItemId item = m_tree->GetSelection(); if ( item.IsOk() ) if ( !m_tree->ItemHasChildren(item) ) m_tree->UnselectAll(); } // class_tree_ctrl::unselect_class_in_tree() /*----------------------------------------------------------------------------*/ /** * \brief Unselect recent class. */ void bf::class_tree_ctrl::unselect_recent_class() { if ( m_recent_used_classes_list->GetFirstSelected() != wxNOT_FOUND ) m_recent_used_classes_list->Select (m_recent_used_classes_list->GetFirstSelected(), false); } // class_tree_ctrl::unselect_recent_class() /*----------------------------------------------------------------------------*/ /** * \brief Show class description. */ void bf::class_tree_ctrl::show_class_description() { if ( ! m_selected_class.GetText().IsEmpty() ) { std::string class_name( wx_to_std_string( m_selected_class.GetText() ) ); const item_class* cl = m_workspace->get_item_class_pool().get_item_class_ptr(class_name); m_class_description->SetLabel( std_to_wx_string(cl->get_description()) ); } else m_class_description->SetLabel(wxEmptyString); GetSizer()->Layout(); m_class_description->SetToolTip(m_class_description->GetLabel()); } // class_tree_ctrl::show_class_descrition() /*----------------------------------------------------------------------------*/ /** * \brief Procedure called when a double click occurs on a tree. * \param event This event occured. */ void bf::class_tree_ctrl::on_double_click( wxMouseEvent& event ) { select_class(event.ShiftDown()); } // class_tree_ctrl::on_double_click() /*----------------------------------------------------------------------------*/ /** * \brief The selected class changes. * \param event The event that occured. */ void bf::class_tree_ctrl::on_class_change( wxTreeEvent& event ) { wxTreeItemId item = m_tree->GetSelection(); if ( item.IsOk() ) { m_selected_class.SetText( m_tree->GetItemText(item) ); unselect_recent_class(); show_class_description(); } } // class_tree_ctrl::on_class_change() /*----------------------------------------------------------------------------*/ /** * \brief The selected class in recent classes list changes. * \param event The event that occured. */ void bf::class_tree_ctrl::on_recent_class_change( wxListEvent& event ) { m_selected_class.SetText( event.GetLabel() ); unselect_class_in_tree(); show_class_description(); } // class_tree_ctrl::on_recent_class_change() /*----------------------------------------------------------------------------*/ /** * \brief A class in recent classes list is activated. * \param event The event that occured. */ void bf::class_tree_ctrl::on_recent_class_activated( wxListEvent& event ) { m_selected_class.SetText( event.GetLabel() ); unselect_class_in_tree(); select_class( wx_to_std_string( event.GetLabel() ) ); show_class_description(); } // class_tree_ctrl::on_recent_class_change() /*----------------------------------------------------------------------------*/ /** * \brief The user pressed a keybord key. * \param event The keyboard event that occured. */ void bf::class_tree_ctrl::on_key_up( wxKeyEvent& event ) { switch( event.GetKeyCode() ) { case WXK_RETURN: case WXK_NUMPAD_ENTER: select_class( event.ShiftDown() ); break; default: event.Skip(); } } // class_tree_ctrl::on_key_up() /*----------------------------------------------------------------------------*/ /** * \brief Procedure called when the mouse moves over the control. * \param event This event occured. */ void bf::class_tree_ctrl::on_mouse_move( wxMouseEvent& event ) { if ( event.LeftIsDown() ) { if ( ! m_selected_class.GetText().IsEmpty() ) { wxDropSource drag_source( this ); drag_source.SetData( m_selected_class ); drag_source.DoDragDrop( true ); } } else { wxTreeItemId item = m_tree->HitTest( event.GetPosition() ); if ( item.IsOk() ) { if ( !m_tree->ItemHasChildren(item) ) { const wxString wx_class_name( m_tree->GetItemText(item) ); const std::string class_name( wx_to_std_string(wx_class_name) ); const item_class* cl = m_workspace->get_item_class_pool().get_item_class_ptr (class_name); if ( cl->get_description().empty() ) m_tree->SetToolTip ( wxString::Format ( _("%s: no description available"), wx_class_name.c_str() ) ); else { const wxString desc = std_to_wx_string(cl->get_description()); m_tree->SetToolTip ( wxString::Format ( _("%s: %s"), wx_class_name.c_str(), desc.c_str() ) ); } } else m_tree->SetToolTip(wxEmptyString); } else m_tree->SetToolTip(wxEmptyString); event.Skip(); } } // class_tree_ctrl::on_mouse_move() /*----------------------------------------------------------------------------*/ /** * \brief The text of the pattern has changed. * \param event This event occured. */ void bf::class_tree_ctrl::on_pattern_change( wxCommandEvent& WXUNUSED(event) ) { fill_tree(); } // class_tree_ctrl::on_pattern_change() /*----------------------------------------------------------------------------*/ /** * \brief Event sent to a resized window. * \param event The event. */ void bf::class_tree_ctrl::on_size(wxSizeEvent& event) { m_recent_used_classes_list->SetColumnWidth ( 0, m_recent_used_classes_list->GetSize().x ); event.Skip(); } // class_tree_ctrl::on_size() /*----------------------------------------------------------------------------*/ BEGIN_EVENT_TABLE(bf::class_tree_ctrl, wxPanel) EVT_SIZE( bf::class_tree_ctrl::on_size ) EVT_TEXT( bf::class_tree_ctrl::IDC_PATTERN, bf::class_tree_ctrl::on_pattern_change ) EVT_TREE_SEL_CHANGED( bf::class_tree_ctrl::IDC_TREE, bf::class_tree_ctrl::on_class_change ) EVT_LIST_ITEM_ACTIVATED( bf::class_tree_ctrl::IDC_RECENT_USED_CLASSES, bf::class_tree_ctrl::on_recent_class_activated ) EVT_LIST_ITEM_SELECTED( bf::class_tree_ctrl::IDC_RECENT_USED_CLASSES, bf::class_tree_ctrl::on_recent_class_change ) END_EVENT_TABLE() plee-the-bear-20251226/bear-factory/bear-editor/src/bf/code/color.cpp000066400000000000000000000110071512343254000250540ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bf::color class. * \author Sébastien Angibaud */ #include "bf/color.hpp" #include "bf/compiled_file.hpp" #include "bf/path_configuration.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Default constructor. */ bf::color::color() : m_opacity(1), m_red_intensity(0), m_green_intensity(0), m_blue_intensity(0) { } // color::color() /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param red The red intensity. * \param green The green intensity. * \param blue The blue intensity. * \param opacity The opacity. */ bf::color::color(double red, double green, double blue, double opacity) : m_opacity(opacity), m_red_intensity(red), m_green_intensity(green), m_blue_intensity(blue) { } // color::color() /*----------------------------------------------------------------------------*/ /** * \brief Get the opacity translucy. */ double bf::color::get_opacity() const { return m_opacity; } // color::get_opacity() /*----------------------------------------------------------------------------*/ /** * \brief Set the opacity translucy. */ void bf::color::set_opacity( double opacity ) { m_opacity = opacity; } // color::set_opacity() /*----------------------------------------------------------------------------*/ /** * \brief Get the intensity of the red channel. */ double bf::color::get_red_intensity() const { return m_red_intensity; } // color::get_red_intensity() /*----------------------------------------------------------------------------*/ /** * \brief Get the intensity of the green channel. */ double bf::color::get_green_intensity() const { return m_green_intensity; } // color::get_green_intensity() /*----------------------------------------------------------------------------*/ /** * \brief Get the intensity of the blue channel. */ double bf::color::get_blue_intensity() const { return m_blue_intensity; } // color::get_blue_intensity() /*----------------------------------------------------------------------------*/ /** * \brief Set the intensity of the channels. * \param r Value on the r component. * \param g Value on the r component. * \param b Value on the r component. */ void bf::color::set_intensity ( double r, double g, double b ) { if (r > 1) m_red_intensity = 1; else if (r < 0) m_red_intensity = 0; else m_red_intensity = r; if (g > 1) m_green_intensity = 1; else if (g < 0) m_green_intensity = 0; else m_green_intensity = g; if (b > 1) m_blue_intensity = 1; else if (b < 0) m_blue_intensity = 0; else m_blue_intensity = b; } // color::set_intensity() /*----------------------------------------------------------------------------*/ /** * \brief Compile the color. * \param f The stream in which we write the compiled color. */ void bf::color::compile( compiled_file& f ) const { f << m_opacity << m_red_intensity << m_green_intensity << m_blue_intensity; } // color::compile() /*----------------------------------------------------------------------------*/ /** * \brief Tell if two colors are the same. * \param that The instance to compare to. */ bool bf::color::operator==( const color& that ) const { return (m_opacity == that.m_opacity) && (m_red_intensity == that.m_red_intensity) && (m_green_intensity == that.m_green_intensity) && (m_blue_intensity == that.m_blue_intensity); } // color::operator==() /*----------------------------------------------------------------------------*/ /** * \brief Tell if two colors are different. * \param that The instance to compare to. */ bool bf::color::operator!=( const color& that ) const { return !(*this == that); } // color::operator!=() /*----------------------------------------------------------------------------*/ /** * \brief Compare two colors in lexicographic order. * \param that The instance to compare to. */ bool bf::color::operator<( const color& that ) const { if (m_opacity != that.m_opacity) return m_opacity < that.m_opacity; if (m_red_intensity != that.m_red_intensity) return m_red_intensity < that.m_red_intensity; if (m_green_intensity != that.m_green_intensity) return m_green_intensity < that.m_blue_intensity; return m_blue_intensity < that.m_blue_intensity; } // color::operator<() plee-the-bear-20251226/bear-factory/bear-editor/src/bf/code/color_edit.cpp000066400000000000000000000073021512343254000260640ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bf::color_edit class. * \author Sébastien Angibaud */ #include "bf/color_edit.hpp" #include "bf/path_configuration.hpp" #include /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param parent The window owning this one. * \param v The initial value. */ bf::color_edit::color_edit ( wxWindow& parent, const color& v ) : wxPanel( &parent, wxID_ANY ), base_edit(v) { create_controls(); } // color_edit::color_edit() /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param parent The window owning this one. * \param v The initial value. */ bf::color_edit::color_edit ( wxWindow* parent, const color& v ) : wxPanel( parent, wxID_ANY ), base_edit(v) { create_controls(); } // color_edit::color_edit() /*----------------------------------------------------------------------------*/ /** * \brief Checks if the displayed value is correct and, if it is, set the * value according to the display. */ bool bf::color_edit::validate() { set_value( make_color() ); return true; } // color_edit::validate() /*----------------------------------------------------------------------------*/ /** * \brief Returns the color corresponding to the values in the control. */ bf::color bf::color_edit::make_color() const { color result; wxColor c = m_picker->GetColour(); result.set_opacity( m_opacity_spin->GetValue() ); result.set_intensity ( (double)c.Red() / 255.0, (double)c.Green() / 255.0, (double)c.Blue() / 255.0); return result; } // color_edit::make_color() /*----------------------------------------------------------------------------*/ /** * \brief Method called after changing the value by set_value(). */ void bf::color_edit::value_updated() { fill_controls(); } // color_edit::value_updated() /*----------------------------------------------------------------------------*/ /** * \brief Fills the controls with the values of the color. */ void bf::color_edit::fill_controls() { color f = get_value(); m_picker->SetColour ( wxColour ( (int)(unsigned char)(255.0 * f.get_red_intensity()), (int)(unsigned char)(255.0 * f.get_green_intensity()), (int)(unsigned char)(255.0 * f.get_blue_intensity()) ) ); m_opacity_spin->SetValue(f.get_opacity()); } // color_edit::fill_controls() /*----------------------------------------------------------------------------*/ /** * \brief Creates the controls of the window. */ void bf::color_edit::create_controls() { m_picker = new wxColourPickerCtrl( this, wxID_ANY ); m_opacity_spin = new spin_ctrl ( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxEXPAND, 0, 1, 1, 0.01 ); m_opacity_spin->SetRange( 0, 1 ); create_sizer_controls(); fill_controls(); } // color_edit::create_controls() /*----------------------------------------------------------------------------*/ /** * \brief Creates the controls and adds them in sizers. */ void bf::color_edit::create_sizer_controls() { wxBoxSizer* v_sizer = new wxBoxSizer( wxVERTICAL ); v_sizer->Add( m_picker, 0, wxEXPAND, 0 ); wxBoxSizer* h_sizer = new wxBoxSizer( wxHORIZONTAL ); h_sizer->Add ( new wxStaticText(this, wxID_ANY, _("Opacity:")), 1, wxALIGN_CENTRE_VERTICAL | wxALL, 5 ); h_sizer->Add( m_opacity_spin, 0, wxALL, 5 ); v_sizer->Add( h_sizer, 0, wxEXPAND ); SetSizer(v_sizer); } // color_edit::create_sizer_controls() plee-the-bear-20251226/bear-factory/bear-editor/src/bf/code/compilation_context.cpp000066400000000000000000000117101512343254000300210ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bf::compilation_context class. * \author Julien Jorge */ #include "bf/compilation_context.hpp" #include #include "bf/opaque_rectangle/ler_problem.hpp" #include "bf/opaque_rectangle/ler_solver.hpp" #include "bf/workspace_environment.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param optimization_level The optimisation level during the compilation. If * the value is less than 1 then the opaque boxes are not computed. * \param env The compilation environemtn to use. */ bf::compilation_context::compilation_context ( unsigned int optimization_level, workspace_environment& env ) : m_image_cache(env), m_optimization_level(optimization_level), m_workspace(env) { } // compilation_context::compilation_context() /*----------------------------------------------------------------------------*/ /** * \brief Get the opaque rectangle of a given sprite. * \param s The sprite for which we want the opaque rectangle. * \param image_name The image name for which we want the opaque rectangle. */ bf::compilation_context::rectangle bf::compilation_context::get_opaque_rectangle ( const sprite& s, const std::string& image_name ) { sprite key; key.set_image_name( image_name ); key.set_clip_rectangle( s.get_clip_rectangle() ); opaque_rectangle_map::iterator it = m_opaque_rectangle.find(key); if ( it == m_opaque_rectangle.end() ) it = m_opaque_rectangle.insert ( std::make_pair( key, compute_opaque_rectangle(key) ) ).first; return it->second; } // compilation_context::get_opaque_rectangle() /*----------------------------------------------------------------------------*/ /** * \brief Get the identifier associated to a given item_instance in the compiled * files. * \param item The identifier of the item for which we want the compiled * identifier. */ unsigned int bf::compilation_context::get_compiled_identifier ( const std::string& item ) const { CLAW_PRECOND( m_identifier.find(item) != m_identifier.end() ); return m_identifier.find(item)->second; } // compilation_context::get_compiled_identifier() /*----------------------------------------------------------------------------*/ /** * \brief Set the identifier associated to a given item_instance in the compiled * files. * \param item The identifier of the item for which we set the compiled * identifier. * \param id The compiled identifier. */ void bf::compilation_context::set_compiled_identifier ( const std::string& item, unsigned int id ) { CLAW_PRECOND( m_identifier.find(item) == m_identifier.end() ); m_identifier[item] = id; } // compilation_context::set_compiled_identifier() /*----------------------------------------------------------------------------*/ /** * \brief Remove all the identifiers associated to the item_instance in the * compiled files. */ void bf::compilation_context::clear_compiled_identifiers() { m_identifier.clear(); } // compilation_context::clear_compiled_identifiers() /*----------------------------------------------------------------------------*/ /** * \brief Return the workspace name to use. */ std::string bf::compilation_context::get_workspace_name() const { return m_workspace.get_name(); } // compilation_context::get_workspace_name() /*----------------------------------------------------------------------------*/ /** * \brief Compute the opaque rectangle of a given sprite. * \param s The sprite for which we compute the opaque rectangle. */ bf::compilation_context::rectangle bf::compilation_context::compute_opaque_rectangle( const sprite& s ) { if ( (m_optimization_level < 1) || (s.get_clip_width() == 0) || (s.get_clip_height() == 0) ) return rectangle(0, 0, 0, 0); const std::pair source = m_image_cache.get_image(s); wxImage image( source.first.ConvertToImage().Mirror(false) ); ler_problem pb; ler_base_problem::rectangle r ( ler_base_problem::point(0, 0), ler_base_problem::point (s.get_clip_width() - 1, s.get_clip_height() - 1) ); pb.set_bounding_rectangle(r); if ( !image.HasAlpha() && image.HasMask() ) image.InitAlpha(); if ( image.HasAlpha() ) { // ler_problem expects the points to be inserted column per column. for ( unsigned int i = 0; i != s.get_clip_width(); ++i ) for ( unsigned int j = 0; j != s.get_clip_height(); ++j ) if ( image.GetAlpha(i, j) != 255 ) pb.add_forbidden_point( ler_base_problem::point(i, j) ); } ler_solver solver(pb); solver.resolve(); if ( solver.is_solved() ) r = solver.get_solution(); else r = ler_base_problem::rectangle(0, 0, 0, 0); return r; } // compilation_context::compute_opaque_rectangle() plee-the-bear-20251226/bear-factory/bear-editor/src/bf/code/compiled_file.cpp000066400000000000000000000103611512343254000265330ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bf::compiled_file class. * \author Julien Jorge */ #include "bf/compiled_file.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param f The file in wich we will write. */ bf::compiled_file::compiled_file( std::ostream& f ) : m_file(f) { } // compiled_file::compiled_file() /*----------------------------------------------------------------------------*/ /** * \brief Write a string in the file. * \param s The string to write. */ bf::compiled_file& bf::compiled_file::operator<<( const std::string& s ) { output_string_as_text(s); return *this; } // compiled_file::operator<<() [string] /*----------------------------------------------------------------------------*/ /** * \brief Write an long in the file. * \param i The long to write. */ bf::compiled_file& bf::compiled_file::operator<<( long i ) { output_long_as_text(i); return *this; } // compiled_file::operator<<() [long] /*----------------------------------------------------------------------------*/ /** * \brief Write an unsigned long in the file. * \param i The long to write. */ bf::compiled_file& bf::compiled_file::operator<<( unsigned long i ) { output_unsigned_long_as_text(i); return *this; } // compiled_file::operator<<() [unsigned long] /*----------------------------------------------------------------------------*/ /** * \brief Write an integer in the file. * \param i The integer to write. */ bf::compiled_file& bf::compiled_file::operator<<( int i ) { output_integer_as_text(i); return *this; } // compiled_file::operator<<() [int] /*----------------------------------------------------------------------------*/ /** * \brief Write an unsigned integer in the file. * \param i The integer to write. */ bf::compiled_file& bf::compiled_file::operator<<( unsigned int i ) { output_unsigned_integer_as_text(i); return *this; } // compiled_file::operator<<() [unsigned int] /*----------------------------------------------------------------------------*/ /** * \brief Write a real in the file. * \param r The value to write. */ bf::compiled_file& bf::compiled_file::operator<<( double r ) { output_real_as_text(r); return *this; } // compiled_file::operator<<() [real] /*----------------------------------------------------------------------------*/ /** * \brief Write a string in the file. * \param s The string to write. */ void bf::compiled_file::output_string_as_text( const std::string& s ) { m_file << s << std::endl; } // compiled_file::output_string_as_text() /*----------------------------------------------------------------------------*/ /** * \brief Write an long in the file. * \param i The long to write. */ void bf::compiled_file::output_long_as_text( long i ) { m_file << i << std::endl; } // compiled_file::output_long_as_text() /*----------------------------------------------------------------------------*/ /** * \brief Write an unsigned long in the file. * \param i The long to write. */ void bf::compiled_file::output_unsigned_long_as_text( unsigned long i ) { m_file << i << std::endl; } // compiled_file::output_unsigned_long_as_text() /*----------------------------------------------------------------------------*/ /** * \brief Write an integer in the file. * \param i The integer to write. */ void bf::compiled_file::output_integer_as_text( int i ) { m_file << i << std::endl; } // compiled_file::output_integer_as_text() /*----------------------------------------------------------------------------*/ /** * \brief Write an unsigned integer in the file. * \param i The integer to write. */ void bf::compiled_file::output_unsigned_integer_as_text( unsigned int i ) { m_file << i << std::endl; } // compiled_file::output_unsigned_integer_as_text() /*----------------------------------------------------------------------------*/ /** * \brief Write a real in the file. * \param r The real to write. */ void bf::compiled_file::output_real_as_text( double r ) { m_file << r << std::endl; } // compiled_file::output_real_as_text() plee-the-bear-20251226/bear-factory/bear-editor/src/bf/code/config_frame.cpp000066400000000000000000000255701512343254000263670ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bf::config_frame class. * \author Julien Jorge */ #include "bf/config_frame.hpp" #include "bf/path_configuration.hpp" #include "bf/wx_facilities.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param parent The window owning this dialog. */ bf::config_frame::config_frame( wxWindow* parent ) : wxDialog( parent, wxID_ANY, _("Configuration"), wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER ) { create_controls(); Fit(); } // config_frame::config_frame() /*----------------------------------------------------------------------------*/ /** * \brief Fill the controls with the values of the config. */ void bf::config_frame::fill_controls() { m_item_classes_list->Clear(); m_data_path_list->Clear(); m_run_path->Clear(); m_workspaces_choice->Clear(); path_configuration::workspaces_const_iterator it_map; m_workspaces = path_configuration::get_instance().get_workspaces(); for ( it_map = m_workspaces.begin(); it_map != m_workspaces.end(); ++it_map ) m_workspaces_choice->Append( std_to_wx_string(it_map->first) ); if ( ! m_workspaces_choice->IsEmpty() ) { m_workspaces_choice->SetSelection(0); fill_list_view(); } } /*----------------------------------------------------------------------------*/ /** * \brief Fill the list_view. */ void bf::config_frame::fill_list_view() { m_item_classes_list->Clear(); m_data_path_list->Clear(); m_run_path->Clear(); if ( ! m_workspaces_choice->IsEmpty() ) { std::string s = wx_to_std_string ( m_workspaces_choice->GetStringSelection() ); std::list::const_iterator it; for ( it = m_workspaces[s].item_class_begin(); it != m_workspaces[s].item_class_end(); ++it ) m_item_classes_list->Append( std_to_wx_string(*it) ); for ( it = m_workspaces[s].data_begin(); it != m_workspaces[s].data_end(); ++it ) m_data_path_list->Append( std_to_wx_string(*it) ); m_run_path->Append( std_to_wx_string( m_workspaces[s].get_run_path() ) ); } } // config_frame::fill_list_view() /*----------------------------------------------------------------------------*/ /** * \brief Create the controls of our frame. */ void bf::config_frame::create_controls() { create_member_controls(); create_sizer_controls(); fill_controls(); } // config_frame::create_controls() /*----------------------------------------------------------------------------*/ /** * \brief Create the controls for which we keep a reference. */ void bf::config_frame::create_member_controls() { m_workspaces_choice = new wxChoice( this, IDC_CHOICE ); m_item_classes_list = new wxListBox( this, wxID_ANY ); m_data_path_list = new wxListBox( this, wxID_ANY ); m_run_path = new wxListBox( this, wxID_ANY ); } // config_frame::create_member_controls() /*----------------------------------------------------------------------------*/ /** * \brief Create the controls and add them in sizers. */ void bf::config_frame::create_sizer_controls() { wxBoxSizer* sizer = new wxBoxSizer( wxVERTICAL ); sizer->Add( m_workspaces_choice, 0, wxEXPAND ); // item classes wxBoxSizer* v_sizer = new wxBoxSizer( wxVERTICAL ); wxStaticBoxSizer* s_sizer = new wxStaticBoxSizer ( wxHORIZONTAL, this, _("Path to the item class files") ); v_sizer->Add ( new wxButton( this, IDC_BROWSE_ITEM_CLASSES_BUTTON, wxT("+"), wxDefaultPosition, wxSize(30, -1) ), 0, wxALL, 5 ); v_sizer->Add ( new wxButton( this, IDC_ERASE_ITEM_CLASSES_BUTTON, wxT("-"), wxDefaultPosition, wxSize(30, -1) ), 0, wxALL, 5 ); s_sizer->Add( m_item_classes_list, 1, wxEXPAND | wxALL, 5 ); s_sizer->Add( v_sizer, 0, wxEXPAND ); sizer->Add( s_sizer, 0, wxEXPAND ); // data path v_sizer = new wxBoxSizer( wxVERTICAL ); s_sizer = new wxStaticBoxSizer ( wxHORIZONTAL, this, _("Path to data directory of the game") ); v_sizer->Add ( new wxButton( this, IDC_BROWSE_DATA_PATH_BUTTON, wxT("+"), wxDefaultPosition, wxSize(30, -1) ), 0, wxALL, 5 ); v_sizer->Add ( new wxButton( this, IDC_ERASE_DATA_PATH_BUTTON, wxT("-"), wxDefaultPosition, wxSize(30, -1) ), 0, wxALL, 5 ); s_sizer->Add( m_data_path_list, 1, wxEXPAND | wxALL, 5 ); s_sizer->Add( v_sizer, 0, wxEXPAND ); sizer->Add( s_sizer, 0, wxEXPAND ); // run path v_sizer = new wxBoxSizer( wxVERTICAL ); s_sizer = new wxStaticBoxSizer ( wxHORIZONTAL, this, _("Path to run configuration file") ); v_sizer->Add ( new wxButton( this, IDC_BROWSE_RUN_PATH_BUTTON, wxT("+"), wxDefaultPosition, wxSize(30, -1) ), 0, wxALL, 5 ); s_sizer->Add( m_run_path, 1, wxEXPAND | wxALL, 5 ); s_sizer->Add( v_sizer, 0, wxEXPAND ); sizer->Add( s_sizer, 0, wxEXPAND ); // ok / cancel sizer->Add( CreateStdDialogButtonSizer(wxOK | wxCANCEL), 0, wxALL | wxCENTER, 5 ); SetSizer(sizer); } // config_frame::create_sizer_controls() /*----------------------------------------------------------------------------*/ /** * \brief Answer to a click on the "OK" button. * \param event This event occured. */ void bf::config_frame::on_ok( wxCommandEvent& WXUNUSED(event) ) { path_configuration::get_instance().set_workspaces( m_workspaces ); path_configuration::get_instance().save(); EndModal(wxID_OK); } // config_frame::on_ok() /*----------------------------------------------------------------------------*/ /** * \brief Answer to a click on the "Cancel" button. * \param event This event occured. */ void bf::config_frame::on_cancel( wxCommandEvent& WXUNUSED(event) ) { fill_controls(); EndModal(wxID_CANCEL); } // config_frame::on_cancel() /*----------------------------------------------------------------------------*/ /** * \brief Answer to a click on the "Browse" button for the item files. * \param event This event occured. */ void bf::config_frame::on_browse_item_classes( wxCommandEvent& WXUNUSED(event) ) { wxDirDialog diag(this); if ( diag.ShowModal() == wxID_OK ) { if ( m_workspaces_choice->GetSelection() != wxNOT_FOUND ) { m_item_classes_list->Append( diag.GetPath() ); std::string s = wx_to_std_string( m_workspaces_choice->GetStringSelection() ); m_workspaces[s].add_item_class_path ( wx_to_std_string(diag.GetPath()) ); } } } // config_frame::on_browse_item_classes() /*----------------------------------------------------------------------------*/ /** * \brief Answer to a click on the "Erase" button for the item files. * \param event This event occured. */ void bf::config_frame::on_erase_item_classes( wxCommandEvent& WXUNUSED(event) ) { int i = m_item_classes_list->GetSelection(); if ( i != wxNOT_FOUND && m_workspaces_choice->GetSelection() != wxNOT_FOUND ) { m_item_classes_list->Delete(i); std::string s = wx_to_std_string( m_workspaces_choice->GetStringSelection() ); m_workspaces[s].clear_item_class_path(); for ( unsigned int j = 0; j < m_item_classes_list->GetCount(); ++j ) m_workspaces[s].add_item_class_path ( wx_to_std_string( m_item_classes_list->GetString(j) ) ); } } // config_frame::on_erase_item_classes() /*----------------------------------------------------------------------------*/ /** * \brief Answer to a click on the "Browse" button for the data directory. * \param event This event occured. */ void bf::config_frame::on_browse_data_path( wxCommandEvent& WXUNUSED(event) ) { wxDirDialog diag(this); if ( diag.ShowModal() == wxID_OK ) { if ( m_workspaces_choice->GetSelection() != wxNOT_FOUND ) { m_data_path_list->Append( diag.GetPath() ); std::string s = wx_to_std_string( m_workspaces_choice->GetStringSelection() ); m_workspaces[s].add_data_path( wx_to_std_string(diag.GetPath()) ); } } } // config_frame::on_browse_data_path() /*----------------------------------------------------------------------------*/ /** * \brief Answer to a click on the "Erase" button for the data directory. * \param event This event occured. */ void bf::config_frame::on_erase_data_path( wxCommandEvent& WXUNUSED(event) ) { int i = m_data_path_list->GetSelection(); if ( i != wxNOT_FOUND && m_workspaces_choice->GetSelection() != wxNOT_FOUND ) { m_data_path_list->Delete(i); std::string s = wx_to_std_string( m_workspaces_choice->GetStringSelection() ); m_workspaces[s].clear_data_path(); for ( unsigned int j = 0; j < m_data_path_list->GetCount(); ++j ) m_workspaces[s].add_data_path ( wx_to_std_string( m_data_path_list->GetString(j) ) ); } } // config_frame::on_erase_data_path() /*----------------------------------------------------------------------------*/ /** * \brief Answer to a selection of workspace. * \param event This event occured. */ void bf::config_frame::on_select_workspace( wxCommandEvent& WXUNUSED(event) ) { fill_list_view(); } // config_frame::on_select_workspace() /*----------------------------------------------------------------------------*/ /** * \brief Answer to a click on the "Browse" button for the run file. * \param event This event occured. */ void bf::config_frame::on_browse_run_path( wxCommandEvent& WXUNUSED(event) ) { wxDirDialog diag(this); if ( diag.ShowModal() == wxID_OK ) { if ( m_workspaces_choice->GetSelection() != wxNOT_FOUND ) { m_run_path->Clear(); m_run_path->Append( diag.GetPath() ); std::string s = wx_to_std_string( m_workspaces_choice->GetStringSelection() ); m_workspaces[s].set_run_path( wx_to_std_string(diag.GetPath()) ); } } } // config_frame::on_browse_data_path() /*----------------------------------------------------------------------------*/ BEGIN_EVENT_TABLE(bf::config_frame, wxDialog) EVT_BUTTON( wxID_OK, bf::config_frame::on_ok ) EVT_BUTTON( wxID_CANCEL, bf::config_frame::on_cancel ) EVT_BUTTON( bf::config_frame::IDC_BROWSE_ITEM_CLASSES_BUTTON, bf::config_frame::on_browse_item_classes ) EVT_BUTTON( bf::config_frame::IDC_ERASE_ITEM_CLASSES_BUTTON, bf::config_frame::on_erase_item_classes ) EVT_BUTTON( bf::config_frame::IDC_BROWSE_DATA_PATH_BUTTON, bf::config_frame::on_browse_data_path ) EVT_BUTTON( bf::config_frame::IDC_ERASE_DATA_PATH_BUTTON, bf::config_frame::on_erase_data_path ) EVT_BUTTON( bf::config_frame::IDC_BROWSE_RUN_PATH_BUTTON, bf::config_frame::on_browse_run_path ) EVT_CHOICE( IDC_CHOICE, bf::config_frame::on_select_workspace ) END_EVENT_TABLE() plee-the-bear-20251226/bear-factory/bear-editor/src/bf/code/custom_type.cpp000066400000000000000000000056731512343254000263250ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bf::custom_type class. * \author Julien Jorge */ #include "bf/custom_type.hpp" #include "bf/compilation_context.hpp" #include "bf/compiled_file.hpp" #include "bf/path_configuration.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Output the value in the compiled file. * \param cf The file to write in. * \param c The context in which the compilation is done. */ void bf::base_file_type::compile ( compiled_file& cf, compilation_context& c ) const { std::string p(get_value()); if ( path_configuration::get_instance().expand_file_name ( p, c.get_workspace_name() ) ) path_configuration::get_instance().get_relative_path ( p, c.get_workspace_name() ); cf << p; } // base_file_type::compile() /*----------------------------------------------------------------------------*/ /** * \brief Output the value in the compiled file. * \param cf The file to write in. */ void bf::easing_type::compile( compiled_file& cf ) const { bear::easing e(get_value()); cf << e.to_string(); } // easing_type::compile() /*----------------------------------------------------------------------------*/ /** * \brief Compare two easing_type. * \param that The value to compare to. */ bool bf::easing_type::operator==( const easing_type& that) const { return this->get_value() == that.get_value(); } // easing_type::operator==() /*----------------------------------------------------------------------------*/ /** * \brief Compare two easing_type. * \param that The value to compare to. */ bool bf::easing_type::operator!=( const easing_type& that) const { return this->get_value() != that.get_value(); } // easing_type::operator!=() /*----------------------------------------------------------------------------*/ /** * \brief Compare two item_reference_type. * \param that The value to compare to. */ bool bf::item_reference_type::operator==( const item_reference_type& that) const { return this->get_value() == that.get_value(); } // item_reference_type::operator==() /*----------------------------------------------------------------------------*/ /** * \brief Compare two item_reference_type. * \param that The value to compare to. */ bool bf::item_reference_type::operator!=( const item_reference_type& that) const { return this->get_value() != that.get_value(); } // item_reference_type::operator!=() /*----------------------------------------------------------------------------*/ /** * \brief Stream output operator. * \param os The stream in which we write. * \param v The value to write in the stream. */ std::ostream& operator<<( std::ostream& os, const bf::easing_type& v ) { return os << v.get_value().to_string(); } // operator<<() plee-the-bear-20251226/bear-factory/bear-editor/src/bf/code/easing_combo.cpp000066400000000000000000000022731512343254000263700ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bf::easing_combo functions. * \author Julien Jorge */ #include "bf/easing_combo.hpp" #include "bf/easing_combo_popup.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Creates a combo for the easing functions. * \param parent The parent control of the combo. */ wxComboCtrl* bf::create_easing_combo( wxWindow* parent ) { wxComboCtrl* result = new wxComboCtrl ( parent, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxCB_READONLY ); initialize_easing_combo( *result ); return result; } // create_easing_combo() /*----------------------------------------------------------------------------*/ /** * \brief Initializes a combo for the easing functions. * \param combo The he combo to initialize. */ void bf::initialize_easing_combo( wxComboCtrl& combo ) { combo.SetPopupControl( new easing_combo_popup ); combo.SetPopupMinWidth( 400 ); } // initialize_easing_combo() plee-the-bear-20251226/bear-factory/bear-editor/src/bf/code/easing_combo_popup.cpp000066400000000000000000000163741512343254000276220ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bf::easing_combo_popup. * \author Julien Jorge */ #include "bf/easing_combo_popup.hpp" #include #include "bf/icon/easing/back_in_out.xpm" #include "bf/icon/easing/back_in.xpm" #include "bf/icon/easing/back_out.xpm" #include "bf/icon/easing/bounce_in_out.xpm" #include "bf/icon/easing/bounce_in.xpm" #include "bf/icon/easing/bounce_out.xpm" #include "bf/icon/easing/circ_in_out.xpm" #include "bf/icon/easing/circ_in.xpm" #include "bf/icon/easing/circ_out.xpm" #include "bf/icon/easing/cubic_in_out.xpm" #include "bf/icon/easing/cubic_in.xpm" #include "bf/icon/easing/cubic_out.xpm" #include "bf/icon/easing/elastic_in_out.xpm" #include "bf/icon/easing/elastic_in.xpm" #include "bf/icon/easing/elastic_out.xpm" #include "bf/icon/easing/expo_in_out.xpm" #include "bf/icon/easing/expo_in.xpm" #include "bf/icon/easing/expo_out.xpm" #include "bf/icon/easing/linear_in_out.xpm" #include "bf/icon/easing/linear_in.xpm" #include "bf/icon/easing/linear_out.xpm" #include "bf/icon/easing/none_in_out.xpm" #include "bf/icon/easing/none_in.xpm" #include "bf/icon/easing/none_out.xpm" #include "bf/icon/easing/quad_in_out.xpm" #include "bf/icon/easing/quad_in.xpm" #include "bf/icon/easing/quad_out.xpm" #include "bf/icon/easing/quart_in_out.xpm" #include "bf/icon/easing/quart_in.xpm" #include "bf/icon/easing/quart_out.xpm" #include "bf/icon/easing/quint_in_out.xpm" #include "bf/icon/easing/quint_in.xpm" #include "bf/icon/easing/quint_out.xpm" #include "bf/icon/easing/sine_in_out.xpm" #include "bf/icon/easing/sine_in.xpm" #include "bf/icon/easing/sine_out.xpm" /*----------------------------------------------------------------------------*/ /** * \brief Create the popup control. * \param parent The parent control. */ bool bf::easing_combo_popup::Create(wxWindow* parent) { if ( wxListView::Create ( parent, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLC_ICON | wxLC_SINGLE_SEL ) ) { fill_list(); connect_list_events(); return true; } else return false; } // easing_combo_popup::Create() /*----------------------------------------------------------------------------*/ /** * \brief Get the created control. */ wxWindow* bf::easing_combo_popup::GetControl() { return this; } // easing_combo_popup::GetControl() /*----------------------------------------------------------------------------*/ /** * \brief Translate a string into a list selection. * \param s The string. */ void bf::easing_combo_popup::SetStringValue( const wxString& s ) { disconnect_list_events(); wxListView::Select(wxListView::FindItem(-1, s)); connect_list_events(); } // easing_combo_popup::SetStringValue() /*----------------------------------------------------------------------------*/ /** * \brief Get the selection as a string. */ wxString bf::easing_combo_popup::GetStringValue() const { return wxListView::GetItemText(wxListView::GetFirstSelected()); } // easing_combo_popup::GetStringValue() /*----------------------------------------------------------------------------*/ /** * \brief Connect the event listener on the list. */ void bf::easing_combo_popup::connect_list_events() { wxListView::Connect ( wxEVT_COMMAND_LIST_ITEM_SELECTED, wxListEventHandler(easing_combo_popup::on_item_activated) ); } // easing_combo_popup::connect_list_events() /*----------------------------------------------------------------------------*/ /** * \brief Disconnect the event listener on the list. */ void bf::easing_combo_popup::disconnect_list_events() { wxListView::Disconnect ( wxEVT_COMMAND_LIST_ITEM_SELECTED, wxListEventHandler(easing_combo_popup::on_item_activated) ); } // easing_combo_popup::disconnect_list_events() /*----------------------------------------------------------------------------*/ /** * \brief Add an item in the list. * \param label The label of the item. * \param img The image of the item. */ void bf::easing_combo_popup::append_item ( const wxString& label, const wxBitmap& img ) { wxImageList* images = GetImageList( wxIMAGE_LIST_NORMAL ); images->Add( img ); InsertItem( GetItemCount(), label, images->GetImageCount()-1 ); } // easing_combo_popup::append_item() /*----------------------------------------------------------------------------*/ /** * \brief Add the items in the list. */ void bf::easing_combo_popup::fill_list() { AssignImageList( new wxImageList(), wxIMAGE_LIST_NORMAL ); append_item( _("back:in_out"), wxBitmap(back_in_out_xpm) ); append_item( _("back:in"), wxBitmap(back_in_xpm) ); append_item( _("back:out"), wxBitmap(back_out_xpm) ); append_item( _("bounce:in_out"), wxBitmap(bounce_in_out_xpm) ); append_item( _("bounce:in"), wxBitmap(bounce_in_xpm) ); append_item( _("bounce:out"), wxBitmap(bounce_out_xpm) ); append_item( _("circ:in_out"), wxBitmap(circ_in_out_xpm) ); append_item( _("circ:in"), wxBitmap(circ_in_xpm) ); append_item( _("circ:out"), wxBitmap(circ_out_xpm) ); append_item( _("cubic:in_out"), wxBitmap(cubic_in_out_xpm) ); append_item( _("cubic:in"), wxBitmap(cubic_in_xpm) ); append_item( _("cubic:out"), wxBitmap(cubic_out_xpm) ); append_item( _("elastic:in_out"), wxBitmap(elastic_in_out_xpm) ); append_item( _("elastic:in"), wxBitmap(elastic_in_xpm) ); append_item( _("elastic:out"), wxBitmap(elastic_out_xpm) ); append_item( _("expo:in_out"), wxBitmap(expo_in_out_xpm) ); append_item( _("expo:in"), wxBitmap(expo_in_xpm) ); append_item( _("expo:out"), wxBitmap(expo_out_xpm) ); append_item( _("linear:in_out"), wxBitmap(linear_in_out_xpm) ); append_item( _("linear:in"), wxBitmap(linear_in_xpm) ); append_item( _("linear:out"), wxBitmap(linear_out_xpm) ); append_item( _("none:in_out"), wxBitmap(none_in_out_xpm) ); append_item( _("none:in"), wxBitmap(none_in_xpm) ); append_item( _("none:out"), wxBitmap(none_out_xpm) ); append_item( _("quad:in_out"), wxBitmap(quad_in_out_xpm) ); append_item( _("quad:in"), wxBitmap(quad_in_xpm) ); append_item( _("quad:out"), wxBitmap(quad_out_xpm) ); append_item( _("quart:in_out"), wxBitmap(quart_in_out_xpm) ); append_item( _("quart:in"), wxBitmap(quart_in_xpm) ); append_item( _("quart:out"), wxBitmap(quart_out_xpm) ); append_item( _("quint:in_out"), wxBitmap(quint_in_out_xpm) ); append_item( _("quint:in"), wxBitmap(quint_in_xpm) ); append_item( _("quint:out"), wxBitmap(quint_out_xpm) ); append_item( _("sine:in_out"), wxBitmap(sine_in_out_xpm) ); append_item( _("sine:in"), wxBitmap(sine_in_xpm) ); append_item( _("sine:out"), wxBitmap(sine_out_xpm) ); } // easing_combo_popup::fill_list() /*----------------------------------------------------------------------------*/ /** * \brief An item of the list has been activated. * \param event The event sent by the list. */ void bf::easing_combo_popup::on_item_activated( wxListEvent& WXUNUSED(event) ) { wxCommandEvent e( wxEVT_COMMAND_COMBOBOX_SELECTED, GetId() ); e.SetEventObject(this); ProcessEvent(e); Dismiss(); } // easing_combo_popup::on_item_activated() /*----------------------------------------------------------------------------*/ BEGIN_EVENT_TABLE(bf::easing_combo_popup, wxListView) END_EVENT_TABLE() plee-the-bear-20251226/bear-factory/bear-editor/src/bf/code/easing_edit.cpp000066400000000000000000000030341512343254000262120ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bf::easing_edit class. * \author Julien Jorge */ #include "bf/easing_edit.hpp" #include "bf/easing_combo.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param parent The windows owning this one. * \param v The initial value. */ bf::easing_edit::easing_edit ( wxWindow& parent, const value_type& v ) : simple_edit(v), wxComboCtrl( &parent, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxCB_READONLY ) { initialize_easing_combo( *this ); value_updated(); } // easing_edit::easing_edit() /*----------------------------------------------------------------------------*/ /** * \brief Check if the displayed value is correct and, if it is, set the * value according to the display. */ bool bf::easing_edit::validate() { bear::easing e; e.from_string( wx_to_std_string( GetPopupControl()->GetStringValue() ) ); easing_type v; v.set_value( e ); set_value( v ); return true; } // easing_edit::validate() /*----------------------------------------------------------------------------*/ /** * \brief Method called when the value has been changed, to update the display. */ void bf::easing_edit::value_updated() { SetValue( value_to_string() ); } // easing_edit::value_updated() plee-the-bear-20251226/bear-factory/bear-editor/src/bf/code/font.cpp000066400000000000000000000053751512343254000247170ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bf::font class. * \author Julien Jorge */ #include "bf/font.hpp" #include "bf/compilation_context.hpp" #include "bf/compiled_file.hpp" #include "bf/path_configuration.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Default constructor. */ bf::font::font() : m_size( 12 ) { } // font::font() /*----------------------------------------------------------------------------*/ /** * \brief Sets the name of the font resource to use. * \param name The new value. */ void bf::font::set_font_name( std::string name ) { m_font_name = name; } // font::set_font_name() /*----------------------------------------------------------------------------*/ /** * \brief Return the name of the font. */ std::string bf::font::get_font_name() const { return m_font_name; } // font::get_font_name() /*----------------------------------------------------------------------------*/ /** * \brief Sets the size of the text displayed with this font. * \param s The new value. */ void bf::font::set_size( double s ) { m_size = std::max( 0.0, s ); } // font::set_size() /*----------------------------------------------------------------------------*/ /** * \brief Returns the size of the text displayed with this font. */ double bf::font::get_size() const { return m_size; } // font::get_size() /*----------------------------------------------------------------------------*/ /** * \brief Compile the font. * \param f The stream in which we write the compiled font. * \param c The context in which the compilation is done. */ void bf::font::compile( compiled_file& f, compilation_context& c ) const { std::string font_path(m_font_name); if ( path_configuration::get_instance().expand_file_name ( font_path, c.get_workspace_name() ) ) path_configuration::get_instance().get_relative_path (font_path, c.get_workspace_name() ); f << font_path << m_size; } // font::compile() /*----------------------------------------------------------------------------*/ /** * \brief Tell if two fonts are the same. * \param that The instance to compare to. */ bool bf::font::operator==( const font& that ) const { return (m_font_name == that.m_font_name) && (m_size == that.m_size); } // font::operator==() /*----------------------------------------------------------------------------*/ /** * \brief Tell if two fonts are different. * \param that The instance to compare to. */ bool bf::font::operator!=( const font& that ) const { return !(*this == that); } // font::operator!=() plee-the-bear-20251226/bear-factory/bear-editor/src/bf/code/font_edit.cpp000066400000000000000000000122321512343254000257120ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bf::font_edit class. * \author Sébastien Angibaud */ #include "bf/font_edit.hpp" #include "bf/path_configuration.hpp" #include "bf/workspace_environment.hpp" #include /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param parent The window owning this one. * \param env The workspace environment. * \param v The initial value. */ bf::font_edit::font_edit ( wxWindow& parent, workspace_environment& env, const font& v ) : wxPanel( &parent, wxID_ANY ), base_edit(v), m_workspace(env) { create_controls(); } // font_edit::font_edit() /*----------------------------------------------------------------------------*/ /** * \brief Checks if the displayed value is correct and, if it is, set the * value according to the display. */ bool bf::font_edit::validate() { set_value( make_font() ); return true; } // font_edit::validate() /*----------------------------------------------------------------------------*/ /** * \brief Returns the font corresponding to the values in the control. */ bf::font bf::font_edit::make_font() const { font result; result.set_size( m_size_spin->GetValue() ); result.set_font_name( wx_to_std_string( m_font_name_text->GetValue() ) ); return result; } // font_edit::make_font() /*----------------------------------------------------------------------------*/ /** * \brief Method called after changing the value by set_value(). */ void bf::font_edit::value_updated() { fill_controls(); } // font_edit::value_updated() /*----------------------------------------------------------------------------*/ /** * \brief Fills the controls with the values of the font. */ void bf::font_edit::fill_controls() { font f = get_value(); m_size_spin->SetValue( f.get_size() ); m_font_name_text->SetValue( std_to_wx_string( f.get_font_name() ) ); } // font_edit::fill_controls() /*----------------------------------------------------------------------------*/ /** * \brief Creates the controls of the window. */ void bf::font_edit::create_controls() { m_size_spin = new spin_ctrl( this ); m_size_spin->SetRange( 0, std::numeric_limits::max() ); m_font_name_text = new wxTextCtrl( this, wxID_ANY ); create_sizer_controls(); fill_controls(); } // font_edit::create_controls() /*----------------------------------------------------------------------------*/ /** * \brief Creates the controls and adds them in sizers. */ void bf::font_edit::create_sizer_controls() { wxBoxSizer* v_sizer = new wxBoxSizer( wxVERTICAL ); v_sizer->Add( create_font_name_sizer(), 0, wxEXPAND ); v_sizer->Add( create_size_sizer(), 0, wxEXPAND ); SetSizer(v_sizer); } // font_edit::create_sizer_controls() /*----------------------------------------------------------------------------*/ /** * \brief Creates the controls and the sizer for the size part. */ wxSizer* bf::font_edit::create_size_sizer() { wxBoxSizer* result = new wxBoxSizer( wxHORIZONTAL ); result->Add ( new wxStaticText(this, wxID_ANY, _("Size:")), 1, wxALIGN_CENTRE_VERTICAL | wxALL, 5 ); result->Add( m_size_spin, 0, wxALL, 5 ); return result; } // font_edit::create_size_sizer() /*----------------------------------------------------------------------------*/ /** * \brief Creates the controls and the sizer for the name of the font. */ wxSizer* bf::font_edit::create_font_name_sizer() { wxBoxSizer* result = new wxBoxSizer( wxHORIZONTAL ); wxButton* font_name_browse = new wxButton ( this, IDC_FONT_SELECT, wxT("..."), wxDefaultPosition, wxSize(30, -1) ); result->Add ( new wxStaticText(this, wxID_ANY, _("Font:")), 0, wxALIGN_CENTRE_VERTICAL | wxALL, 5 ); result->Add( m_font_name_text, 1, wxEXPAND | wxALL, 5 ); result->Add( font_name_browse, 0, wxALL, 5 ); return result; } // font_edit::create_font_name_sizer() /*----------------------------------------------------------------------------*/ /** * \brief The user clicked on the button to select a font. * \param event This event occured. */ void bf::font_edit::on_font_select( wxCommandEvent& WXUNUSED(event) ) { std::string p( wx_to_std_string( m_font_name_text->GetValue() ) ); path_configuration::get_instance().get_full_path ( p, m_workspace.get_name() ); wxFileDialog dlg ( this, _("Choose a font file"), wxEmptyString, std_to_wx_string(p), _("Font files|*.fnt;*.ttf"), wxFD_DEFAULT_STYLE | wxFD_FILE_MUST_EXIST ); if (dlg.ShowModal() == wxID_OK) { std::string new_p( wx_to_std_string( dlg.GetPath() ) ); path_configuration::get_instance().get_relative_path ( new_p, m_workspace.get_name() ); m_font_name_text->SetValue( std_to_wx_string( new_p ) ); } } // font_edit::on_font_select() /*----------------------------------------------------------------------------*/ BEGIN_EVENT_TABLE(bf::font_edit, wxPanel) EVT_BUTTON( bf::font_edit::IDC_FONT_SELECT, bf::font_edit::on_font_select ) END_EVENT_TABLE() plee-the-bear-20251226/bear-factory/bear-editor/src/bf/code/frame_edit.cpp000066400000000000000000000060651512343254000260450ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bf::frame_edit class. * \author Sebastien Angibaud */ #include "bf/frame_edit.hpp" #include "bf/sprite_edit.hpp" #include "bf/spin_ctrl.hpp" #include "bf/free_edit.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param parent The window owning this window. * \param env The workspace environment to use. * \param frame The initial frame. */ bf::frame_edit::frame_edit ( wxWindow& parent, workspace_environment& env, const animation_frame& frame ) : wxDialog( &parent, wxID_ANY, _("Frame"), wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER ), m_frame(frame), m_workspace(env) { create_controls(); } // frame_edit::frame_edit() /*----------------------------------------------------------------------------*/ /** * \brief Validate the parameters. */ void bf::frame_edit::validate() { m_sprite->validate(); m_duration->validate(); m_frame.set_sprite(m_sprite->get_value()); m_frame.set_duration(m_duration->get_value().get_value()); } // frame_edit::validate() /*----------------------------------------------------------------------------*/ /** * \brief Create the controls of the window. */ void bf::frame_edit::create_controls() { m_duration = new free_edit( *this, real_type(m_frame.get_duration()) ); m_sprite = new sprite_edit( *this, m_workspace, m_frame.get_sprite() ); create_sizer_controls(); Connect( wxID_OK, wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(frame_edit::on_ok) ); } // frame_edit::create_controls() /*----------------------------------------------------------------------------*/ /** * \brief Create the controls and add them in sizers. */ void bf::frame_edit::create_sizer_controls() { wxBoxSizer* sizer = new wxBoxSizer( wxVERTICAL ); sizer->Add( m_sprite, 1, wxEXPAND ); wxBoxSizer* h_sizer = new wxBoxSizer( wxHORIZONTAL ); h_sizer->Add( new wxStaticText(this, wxID_ANY, _("Duration:")), 1, wxALIGN_CENTRE_VERTICAL | wxALL, 0 ); h_sizer->Add( m_duration, 0, wxALL, 0 ); sizer->Add( h_sizer, 0, wxALL, 0 ); sizer->Add( CreateStdDialogButtonSizer(wxOK | wxCANCEL), 0, wxALL | wxALIGN_CENTRE_HORIZONTAL, 0 ); SetSizer(sizer); Fit(); } // frame_edit::create_sizer_controls() /*----------------------------------------------------------------------------*/ /** * \brief Get the frame. */ const bf::animation_frame& bf::frame_edit::get_frame() const { return m_frame; } // frame_edit::get_frame() /*----------------------------------------------------------------------------*/ /** * \brief Action performed when clicking the "OK" button. * \param event This event occured. */ void bf::frame_edit::on_ok( wxCommandEvent& WXUNUSED(event) ) { validate(); EndModal(wxID_OK); } // frame_edit::on_ok() plee-the-bear-20251226/bear-factory/bear-editor/src/bf/code/human_readable.cpp000066400000000000000000000115361512343254000266740ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bf::human_readable class. * \author Julien Jorge */ #include "bf/human_readable.hpp" #include /*----------------------------------------------------------------------------*/ /** * \brief Convert a value in a string representation. * \param v The value to transform. */ wxString bf::human_readable::convert( const value_type& v ) { if ( v.get_value() ) return _("true"); else return _("false"); } // human_readable::convert() /*----------------------------------------------------------------------------*/ /** * \brief Convert a value in a string representation. * \param v The value to transform. */ wxString bf::human_readable::convert( const value_type& v ) { std::ostringstream oss; oss << v; return wxT("\"") + std_to_wx_string(oss.str()) + wxT("\""); } // human_readable::convert() /*----------------------------------------------------------------------------*/ /** * \brief Convert a value in a string representation. * \param v The value to transform. */ wxString bf::human_readable::convert( const value_type& v ) { std::ostringstream oss; oss << "'" << v.get_image_name() << "', x=" << v.get_left() << ", y=" << v.get_top() << ", clip_w=" << v.get_clip_width() << ", clip_h=" << v.get_clip_height() << ", w=" << v.width() << ", h=" << v.height() << ", a=" << v.get_color().get_opacity() << ", mirror=" << trinary_logic::to_string(v.get_mirrored_status()) << ", flip=" << trinary_logic::to_string(v.get_flipped_status()); return _("sprite:") + std_to_wx_string(oss.str()); } // human_readable::convert() /*----------------------------------------------------------------------------*/ /** * \brief Convert a value in a string representation. * \param v The value to transform. */ wxString bf::human_readable::convert( const value_type& v ) { std::ostringstream oss; oss << "a=" << v.get_color().get_opacity() << ", loops=" << v.get_loops() << ", mirror=" << trinary_logic::to_string(v.get_mirrored_status()) << ", flip=" << trinary_logic::to_string(v.get_flipped_status()); if ( v.get_loop_back() ) oss << ", loop_back"; oss << ", first_index=" << v.get_first_index() << ", last_index=" << v.get_last_index(); return _("animation:") + std_to_wx_string(oss.str()); } // human_readable::convert() /*----------------------------------------------------------------------------*/ /** * \brief Convert a value in a string representation. * \param v The value to transform. */ wxString bf::human_readable::convert( const value_type& v ) { return _("animation file:") + std_to_wx_string(v.get_path()); } // human_readable::convert() /*----------------------------------------------------------------------------*/ /** * \brief Convert a value in a string representation. * \param v The value to transform. */ wxString bf::human_readable::convert( const value_type& v ) { if ( v.get_content_type() == any_animation::content_animation ) return human_readable::convert( v.get_animation() ); else return human_readable::convert ( v.get_animation_file() ); } // human_readable::convert() /*----------------------------------------------------------------------------*/ /** * \brief Convert a value in a string representation. * \param v The value to transform. */ wxString bf::human_readable::convert( const value_type& v ) { std::ostringstream oss; oss << "'" << v.get_path() << "', loops=" << v.get_loops() << ", volume=" << v.get_volume(); return _("sample:") + std_to_wx_string(oss.str()); } // human_readable::convert() /*----------------------------------------------------------------------------*/ /** * \brief Convert a value in a string representation. * \param v The value to transform. */ wxString bf::human_readable::convert( const value_type& v ) { std::ostringstream oss; oss << "'" << v.get_font_name() << "', size=" << v.get_size(); return _("font:") + std_to_wx_string(oss.str()); } // human_readable::convert() /*----------------------------------------------------------------------------*/ /** * \brief Convert a value in a string representation. * \param v The value to transform. */ wxString bf::human_readable::convert( const value_type& v ) { std::ostringstream oss; oss << " opacity=" << v.get_opacity() << ", red=" << v.get_red_intensity() << ", green=" << v.get_green_intensity() << ", blue=" << v.get_blue_intensity() ; return _("color:") + std_to_wx_string(oss.str()); } // human_readable::convert() plee-the-bear-20251226/bear-factory/bear-editor/src/bf/code/image_list_ctrl.cpp000066400000000000000000000265031512343254000271060ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bf::image_list_ctrl class. * \author Julien Jorge */ #include "bf/image_list_ctrl.hpp" #include "bf/image_pool.hpp" #include "bf/workspace_environment.hpp" #include #include #include #include #include /*----------------------------------------------------------------------------*/ const wxSize bf::image_list_ctrl::s_margin( 10, 50 ); /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param parent The window containing this view. * */ bf::image_list_ctrl::list_view::list_view( image_list_ctrl& parent ) : wxWindow(&parent, wxID_ANY), m_parent(parent) { } // image_list_ctrl::list_view::list_view() /*----------------------------------------------------------------------------*/ /** * \brief The user have clicked the window. * \param event The event. */ void bf::image_list_ctrl::list_view::on_left_up( wxMouseEvent& event ) { m_parent.select_item( event.GetPosition() - GetPosition() ); } // image_list_ctrl::list_view::on_left_up() /*----------------------------------------------------------------------------*/ BEGIN_EVENT_TABLE(bf::image_list_ctrl::list_view, wxWindow) EVT_LEFT_UP(bf::image_list_ctrl::list_view::on_left_up) END_EVENT_TABLE() /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param parent The window containing this list. * \param env The workspace environment used. */ bf::image_list_ctrl::image_list_ctrl ( wxWindow& parent, workspace_environment& env ) : wxPanel(&parent), m_selection(0), m_workspace(env) { create_controls(); } // image_list_ctrl::image_list_ctrl() /*----------------------------------------------------------------------------*/ /** * \brief Set the list of images. * \param img The new list of images. */ void bf::image_list_ctrl::set_list( const std::list& img ) { wxString current_selection = get_selection(); m_image = img; set_selection(current_selection); set_scrollbar_values(); render(); } // image_list_ctrl::set_list() /*----------------------------------------------------------------------------*/ /** * \brief Set the current selection. * \param i The index of the selected image. */ void bf::image_list_ctrl::set_selection( int i ) { if ( i >= (int)m_image.size() ) m_selection = (int)m_image.size() - 1; else m_selection = i; render(); } // image_list_ctrl::set_selection() /*----------------------------------------------------------------------------*/ /** * \brief Set the current selection. * \param s The name of the selected image. */ void bf::image_list_ctrl::set_selection( const wxString& s ) { int i=0; bool found = false; std::list::const_iterator it; for (it=m_image.begin(); !found && (it!=m_image.end()); ++it) if ( *it == s ) found = true; else ++i; if (found) set_selection(i); else set_selection(-1); } // image_list_ctrl::set_selection() /*----------------------------------------------------------------------------*/ /** * \brief Get the string of the current selection. */ wxString bf::image_list_ctrl::get_selection() const { wxString result; if ( m_selection >= 0) if ( m_selection < (int)m_image.size() ) { std::list::const_iterator it = m_image.begin(); std::advance(it, m_selection); result = *it; } return result; } // image_list_ctrl::get_selection() /*----------------------------------------------------------------------------*/ /** * \brief Create the controls of this window. */ void bf::image_list_ctrl::create_controls() { m_image_list = new list_view(*this); m_bar = new wxScrollBar (this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSB_VERTICAL ); wxBoxSizer* sizer = new wxBoxSizer( wxHORIZONTAL ); sizer->Add( m_image_list, 1, wxEXPAND ); sizer->Add( m_bar, 0, wxEXPAND ); SetSizer(sizer); } // image_list_ctrl::create_controls() /*----------------------------------------------------------------------------*/ /** * \brief Set the position and the range of the scrollbar. */ void bf::image_list_ctrl::set_scrollbar_values() { const wxSize thumb_size = image_pool::s_thumb_size; // count of images in the width of the list const int cw = (m_image_list->GetSize().x - s_margin.x) / (thumb_size.x + s_margin.x); // count of images in the height of the list const int ch = (m_image_list->GetSize().y - s_margin.y) / (thumb_size.y + s_margin.y); // count of image lines int lines = 0; int pos = 0; if ( cw == 0 ) { lines = 1; pos = 0; } else { if (m_selection > 0) pos = m_selection / cw; lines = m_image.size() / cw; if ( (m_image.size() % cw) != 0 ) ++lines; } m_bar->SetScrollbar( pos, ch, lines, ch, true ); } // image_list_ctrl::set_scrollbar_values() /*----------------------------------------------------------------------------*/ /** * \brief Render the list. */ void bf::image_list_ctrl::render() { if( IsShown() ) { wxBufferedPaintDC dc( m_image_list ); dc.SetBackground(*wxBLACK_BRUSH); dc.Clear(); dc.SetBrush(*wxTRANSPARENT_BRUSH); dc.SetFont ( wxFont(8, wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL) ); render_list(dc); } } // image_list_ctrl::render() /*----------------------------------------------------------------------------*/ /** * \brief Render the list of images. * \param dc The device context on which we draw. */ void bf::image_list_ctrl::render_list( wxDC& dc ) { const wxSize thumb_size = image_pool::s_thumb_size; // count of images in the width of the list const int cw = (m_image_list->GetSize().x - s_margin.x) / (thumb_size.x + s_margin.x); std::list::iterator it = m_image.begin(); const std::list::iterator eit = m_image.end(); int i = m_bar->GetThumbPosition() * cw; std::advance( it, i ); // x, x is ok wxPoint pos( s_margin.x, s_margin.x ); for ( ; (it!=eit) && (pos.y < m_image_list->GetSize().y); ++it, ++i ) { render_name(dc, *it, pos, i); render_thumb (dc, m_workspace.get_image_pool().get_thumbnail(*it), pos, i); } } // image_list_ctrl::render_list() /*----------------------------------------------------------------------------*/ /** * \brief Render the name of an image. * \param dc The device context on which we draw. * \param name The name of the image. * \param pos The position where the thumbnail is drawn. * \param i the index of the thumbnail. */ void bf::image_list_ctrl::render_name ( wxDC& dc, const wxString& name, wxPoint& pos, int i ) const { const wxSize thumb_size = image_pool::s_thumb_size; if ( i==m_selection ) dc.SetTextForeground(*wxRED); else dc.SetTextForeground(*wxWHITE); wxString formatted_name; wxStringTokenizer tokenizer(name, wxT("/\\")); while ( tokenizer.HasMoreTokens() ) { const wxString token( tokenizer.GetNextToken() ); const wxString candidate ( formatted_name.IsEmpty() ? token : (formatted_name + wxT("/") + token) ); if ( dc.GetTextExtent(candidate).x > thumb_size.x ) { formatted_name += wxT("/\n") + token; while ( tokenizer.HasMoreTokens() ) formatted_name += wxT("/") + tokenizer.GetNextToken(); } else formatted_name = candidate; } dc.DrawText( formatted_name, pos.x, pos.y + thumb_size.y + s_margin.x ); } // image_list_ctrl::render_name() /*----------------------------------------------------------------------------*/ /** * \brief Render an image. * \param dc The device context on which we draw. * \param bmp The thumbnail to render. * \param pos (in) The position where the thumbnail is drawn. (out) The position * of the next thumbnail. * \param i the index of the thumbnail. */ void bf::image_list_ctrl::render_thumb ( wxDC& dc, wxBitmap bmp, wxPoint& pos, int i ) const { const wxSize thumb_size = image_pool::s_thumb_size; if ( bmp.IsOk() ) { wxMemoryDC mem_dc(bmp); dc.Blit( pos.x, pos.y, bmp.GetWidth(), bmp.GetHeight(), &mem_dc, 0, 0, wxCOPY, true ); } render_border(dc, pos, wxSize(bmp.GetWidth(), bmp.GetHeight()), i); pos.x += thumb_size.x + s_margin.x; if ( pos.x + thumb_size.x > m_image_list->GetSize().x ) { pos.x = s_margin.x; pos.y += thumb_size.y + s_margin.y; } } // image_list_ctrl::render_thumb() /*----------------------------------------------------------------------------*/ /** * \brief Render the border around the thumbnail. * \param dc The device context on which we draw. * \param pos The position of the thumbnail. * \param s The size of thumbnail. * \param i the index of the thumbnail. */ void bf::image_list_ctrl::render_border ( wxDC& dc, const wxPoint& pos, const wxSize& s, int i ) const { wxPoint p[4]; p[0] = wxPoint( pos.x-1, pos.y-1 ); p[1] = wxPoint( pos.x + s.x, p[0].y ); p[2] = wxPoint( p[1].x, pos.y + s.y ); p[3] = wxPoint( p[0].x, p[2].y ); if ( i == m_selection ) dc.SetPen( *wxRED_PEN ); else dc.SetPen( *wxGREEN_PEN ); dc.DrawPolygon(4, p); } // image_list_ctrl::render_border() /*----------------------------------------------------------------------------*/ /** * \brief Select the item at a given position. * \param pos The position where we pick the item. */ void bf::image_list_ctrl::select_item( const wxPoint& pos ) { const wxSize thumb_size = image_pool::s_thumb_size; // count of images in the width of the list const int cw = (m_image_list->GetSize().x - s_margin.x) / (thumb_size.x + s_margin.x); int i = ( m_bar->GetThumbPosition() + pos.y / (thumb_size.y + s_margin.y) ) * cw; i += (pos.x - s_margin.x) / (thumb_size.x + s_margin.x); set_selection(i); } // image_list_ctrl::select_item() /*----------------------------------------------------------------------------*/ /** * \brief Draw the content of the window. * \param event The paint event. */ void bf::image_list_ctrl::on_paint( wxPaintEvent& WXUNUSED(event) ) { render(); } // image_list_ctrl::on_paint() /*----------------------------------------------------------------------------*/ /** * \brief The window is resized. * \param event The paint event. */ void bf::image_list_ctrl::on_size( wxSizeEvent& event ) { set_scrollbar_values(); event.Skip(); } // image_list_ctrl::on_size() /*----------------------------------------------------------------------------*/ /** * \brief Answer to a mouse wheel event. * \param event The event. */ void bf::image_list_ctrl::on_wheel( wxMouseEvent& event ) { if ( event.GetWheelRotation() > 0 ) m_bar->SetThumbPosition( m_bar->GetThumbPosition() - 1 ); else if ( event.GetWheelRotation() < 0 ) m_bar->SetThumbPosition( m_bar->GetThumbPosition() + 1 ); } // image_list_ctrl::on_wheel() /*----------------------------------------------------------------------------*/ BEGIN_EVENT_TABLE(bf::image_list_ctrl, wxPanel) EVT_PAINT(bf::image_list_ctrl::on_paint) EVT_SIZE(bf::image_list_ctrl::on_size) EVT_MOUSEWHEEL(bf::image_list_ctrl::on_wheel) END_EVENT_TABLE() plee-the-bear-20251226/bear-factory/bear-editor/src/bf/code/image_pool.cpp000066400000000000000000000242151512343254000260560ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bf::image_pool class. * \author Julien Jorge */ #include "bf/image_pool.hpp" #include "bf/path_configuration.hpp" #include "bf/workspace.hpp" #include "bf/scan_dir.hpp" #include "bf/wx_facilities.hpp" #include #include #include #include /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param t The map in which we store the thumbnails. * \param r The directory from which the search started. */ bf::image_pool::load_thumb_func::load_thumb_func ( image_map& t, const std::string& r ) : thumb(t), m_root(r) { } // image_pool::load_thumb_func::load_thumb_func() /*----------------------------------------------------------------------------*/ /** * \brief Load the thumbnail of an image. * \param path The path to the image. */ void bf::image_pool::load_thumb_func::operator()( const std::string& path ) { if ( path.find_last_of('!') != std::string::npos ) return; wxBitmap img = load(path); const wxString image_name( std_to_wx_string( path.substr(m_root.size()) ) ); thumb[image_name] = img; } // image_pool::load_thumb_func::operator()() /*----------------------------------------------------------------------------*/ /** * \brief Load the thumbnail of an image. * \param path The path to the image. */ wxBitmap bf::image_pool::load_thumb_func::load( const std::string& path ) { wxImage img( std_to_wx_string(path) ); if ( (img.GetWidth() > s_thumb_size.x) || (img.GetHeight() > s_thumb_size.y) ) { int w, h; if( img.GetWidth() > img.GetHeight() ) { w = s_thumb_size.x; h = (img.GetHeight() * w) / img.GetWidth(); } else { h = s_thumb_size.y; w = (img.GetWidth() * h) / img.GetHeight(); } img.Rescale(w, h); } return wxBitmap(img); } // image_pool::load_thumb_func::load() /*----------------------------------------------------------------------------*/ const wxSize bf::image_pool::s_thumb_size( 150, 150 ); /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ bf::image_pool::image_pool() { wxImage::AddHandler( new wxPNGHandler() ); wxImage::AddHandler( new wxJPEGHandler() ); wxImage::AddHandler( new wxTGAHandler() ); } // image_pool::image_pool() /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param w The workspace to load. */ bf::image_pool::image_pool( const std::string& w ) { m_workspace = w; wxImage::AddHandler( new wxPNGHandler() ); wxImage::AddHandler( new wxJPEGHandler() ); wxImage::AddHandler( new wxTGAHandler() ); if ( path_configuration::get_instance().has_workspace( w ) ) { workspace::path_list_const_iterator it; const workspace& work ( path_configuration::get_instance().get_workspace( w ) ); for ( it = work.data_begin(); it != work.data_end(); ++it ) scan_directory(*it); } } // image_pool::image_pool() /*----------------------------------------------------------------------------*/ /** * \brief Get the image with a given name. * \param image_name The name of the image we want. */ wxBitmap bf::image_pool::get_image( const wxString& image_name ) const { image_map::const_iterator it = m_image.find(image_name); if ( it == m_image.end() ) { load_image_data(image_name); it = m_image.find(image_name); } else if ( !it->second.IsOk() ) load_image_data(image_name); return it->second; } // image_pool::get_image() /*----------------------------------------------------------------------------*/ /** * \brief Get the thumbnail with a given name. * \param image_name The name of the thumbnail we want. */ wxBitmap bf::image_pool::get_thumbnail( const wxString& image_name ) const { CLAW_PRECOND( m_thumbnail.find(image_name) != m_thumbnail.end() ); return m_thumbnail.find(image_name)->second; } // image_pool::get_thumbnail() /*----------------------------------------------------------------------------*/ /** * \brief Get the entries of the spritepos file associated with a given image. * \param image_name The name of the image. */ bf::image_pool::spritepos_entries bf::image_pool::get_spritepos_entries( const wxString& image_name ) const { load_spritepos_file( wx_to_std_string(image_name) ); const spritepos_map::const_iterator it = m_spritepos.find(image_name); if ( it == m_spritepos.end() ) return spritepos_entries(); else return it->second; } // image_pool::get_spritepos_entries() /*----------------------------------------------------------------------------*/ /** * \brief Get the rectangle of a given spritepos entry. * \param image_name The name of the image to which the spritepos is associated. * \param entry The name of the entry to return. */ claw::math::rectangle bf::image_pool::get_spritepos_rectangle ( const wxString& image_name, const wxString& entry ) const { const spritepos_entries r = get_spritepos_entries(image_name); const spritepos_entries::const_iterator it = r.find(entry); if ( it == r.end() ) return claw::math::rectangle(0, 0, 0, 0); else return it->second; } // image_pool::get_spritepos_rectangle() /*----------------------------------------------------------------------------*/ /** * \brief Get the name of a spritepos entry from a given file with the same * rectangle than a given one. * \param image_name The name of the image to which the spritepos is associated. * \param r The rectangle for which we want the entry. */ wxString bf::image_pool::find_spritepos_name_from_size ( const wxString& image_name, const claw::math::rectangle& r ) const { const spritepos_entries e = get_spritepos_entries(image_name); for ( spritepos_entries::const_iterator it=e.begin(); it!=e.end(); ++it ) if ( it->second == r ) return it->first; return wxString(); } // image_pool::find_spritepos_name_from_size() /*----------------------------------------------------------------------------*/ /** * \brief Get a constant iterator on the begining of the pool. */ bf::image_pool::const_iterator bf::image_pool::begin() const { return const_iterator( m_thumbnail.begin() ); } // image_pool::begin() /*----------------------------------------------------------------------------*/ /** * \brief Get a constant iterator just past the end of the pool. */ bf::image_pool::const_iterator bf::image_pool::end() const { return const_iterator( m_thumbnail.end() ); } // image_pool::end() /*----------------------------------------------------------------------------*/ /** * \brief Remove all thumbnails and images. */ void bf::image_pool::clear() { m_image.clear(); m_thumbnail.clear(); } // image_pool::clear() /*----------------------------------------------------------------------------*/ /** * \brief Read all item files from a given directory and in its subdirectories. * \param dir_path The path to the directory to scan. */ void bf::image_pool::scan_directory( const std::string& dir_path ) { std::vector ext(4); ext[0] = ".png"; ext[1] = ".jpg"; ext[2] = ".tga"; ext[3] = ".bmp"; std::string root( dir_path ); if ( !root.empty() ) if ( root[root.size() - 1] != '/' ) root += '/'; load_thumb_func f(m_thumbnail, root); scan_dir scan; scan( root, f, ext.begin(), ext.end() ); } // image_pool::scan_directory() /*----------------------------------------------------------------------------*/ /** * \brief Load the spritepos entries associated with an image. * \param image_path The path to the image. */ void bf::image_pool::load_spritepos_file( const std::string& image_path ) const { const wxString key = std_to_wx_string(image_path); if ( m_spritepos.find(key) != m_spritepos.end() ) return; std::string::size_type pos = image_path.find_last_of('.'); if ( pos != std::string::npos ) { std::string std_name( image_path.substr(0, pos) + ".spritepos" ); if ( path_configuration::get_instance().expand_file_name (std_name, 1, m_workspace) ) { std::ifstream f( std_name.c_str() ); if (f) m_spritepos[key] = read_spritepos_file(f); else m_spritepos[key] = spritepos_entries(); } } } // image_pool::load_spritepos_file() /*----------------------------------------------------------------------------*/ /** * \brief Read the content of a spritepos file. * \param f The file to read from. */ bf::image_pool::spritepos_entries bf::image_pool::read_spritepos_file( std::istream& f ) const { claw::math::rectangle r; std::string line; spritepos_entries result; while ( std::getline(f, line) ) if ( !line.empty() ) if ( line[0] != '#' ) { std::vector sp; claw::text::split(sp, line, ':'); if (sp.size() != 1) { std::istringstream iss( sp.back() ); if ( iss >> r.position.x >> r.position.y >> r.width >> r.height ) result[std_to_wx_string(sp.front())] = r; } } return result; } // image_pool::read_spritepos_file() /*----------------------------------------------------------------------------*/ /** * \brief Load and store the data of an image. * \param name The name of the image to load. */ void bf::image_pool::load_image_data( const wxString& name ) const { std::string std_name( wx_to_std_string(name) ); if ( path_configuration::get_instance().expand_file_name (std_name, 1, m_workspace) ) { if ( m_thumbnail.find(name) == m_thumbnail.end() ) m_thumbnail[name] = load_thumb_func::load(std_name); m_image[name] = wxBitmap( wxImage(std_to_wx_string(std_name)) ); } else { m_image[name] = wxBitmap(); m_thumbnail[name] = wxBitmap(); } } // image_pool::load_image_data() plee-the-bear-20251226/bear-factory/bear-editor/src/bf/code/image_selection_dialog.cpp000066400000000000000000000074401512343254000304120ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bf::image_selection_dialog class. * \author Julien Jorge */ #include "bf/image_selection_dialog.hpp" #include "bf/image_list_ctrl.hpp" #include "bf/workspace_environment.hpp" #include #include /*----------------------------------------------------------------------------*/ wxString bf::image_selection_dialog::s_previous_pattern; /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param parent The parent window. * \param env The workspace environment to use. * \param val The name of the current selected image. */ bf::image_selection_dialog::image_selection_dialog ( wxWindow& parent, workspace_environment& env, const wxString& val ) : wxDialog( &parent, wxID_ANY, _("Choose an image"), wxDefaultPosition, wxSize(640, 480), wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER ), m_workspace(env) { create_controls(); fill_image_list(); m_image_list->set_selection(val); } // image_selection_dialog::image_selection_dialog() /*----------------------------------------------------------------------------*/ /** * \brief Get the name of the selected image. */ wxString bf::image_selection_dialog::get_image_name() const { return m_image_list->get_selection(); } // image_selection_dialog::get_image_name() /*----------------------------------------------------------------------------*/ /** * \brief Create the controls. */ void bf::image_selection_dialog::create_controls() { m_image_list = new image_list_ctrl( *this, m_workspace ); m_pattern = new wxTextCtrl( this, IDC_PATTERN_TEXT ); m_pattern->SetValue(s_previous_pattern); wxBoxSizer* sizer = new wxBoxSizer( wxVERTICAL ); sizer->Add( m_image_list, 1, wxEXPAND | wxALL, 5 ); wxBoxSizer* s_sizer = new wxBoxSizer( wxHORIZONTAL ); s_sizer->Add( new wxStaticText(this, wxID_ANY, _("Pattern:")), 0 ); s_sizer->Add( m_pattern, 1, wxEXPAND ); sizer->Add( s_sizer, 0, wxEXPAND | wxALL, 5 ); sizer->Add ( CreateStdDialogButtonSizer(wxOK | wxCANCEL), 0, wxALL | wxCENTER, 5 ); SetSizer(sizer); } // image_selection_dialog::create_controls() /*----------------------------------------------------------------------------*/ /** * \brief Fill the list of images with the images that match the pattern. */ void bf::image_selection_dialog::fill_image_list() { std::list keep; wxString pat( m_pattern->GetValue() ); if ( pat.IsEmpty() ) pat = wxT("*"); if ( (pat[0] != wxT('*')) && (pat[0] != wxT('?')) ) pat = wxT("*") + pat; if ( (pat[pat.length() - 1] != wxT('*')) && (pat[pat.length() - 1] != wxT('?')) ) pat += wxT("*"); image_pool::const_iterator it = m_workspace.get_image_pool().begin(); image_pool::const_iterator eit = m_workspace.get_image_pool().end(); for (; it!=eit; ++it) if ( it->Matches( pat ) ) keep.push_back( *it ); m_image_list->set_list(keep); } // image_selection_dialog::fill_image_list() /*----------------------------------------------------------------------------*/ /** * \brief The text of the pattern has changed. * \param event The event. */ void bf::image_selection_dialog::on_pattern_change ( wxCommandEvent& WXUNUSED(event) ) { s_previous_pattern = m_pattern->GetValue(); fill_image_list(); } // image_selection_dialog::on_pattern_change() /*----------------------------------------------------------------------------*/ BEGIN_EVENT_TABLE(bf::image_selection_dialog, wxDialog) EVT_TEXT( bf::image_selection_dialog::IDC_PATTERN_TEXT, bf::image_selection_dialog::on_pattern_change ) END_EVENT_TABLE() plee-the-bear-20251226/bear-factory/bear-editor/src/bf/code/item_check_result.cpp000066400000000000000000000026051512343254000274330ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bf::item_check_result class. * \author Julien Jorge */ #include "bf/item_check_result.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Add an error in the result. * \param e The error to add. */ void bf::item_check_result::add( const check_error& e ) { m_errors.push_back(e); } // item_check_result::add() /*----------------------------------------------------------------------------*/ /** * \brief Tell if there is no error in the result. */ bool bf::item_check_result::is_ok() const { return m_errors.empty(); } // item_check_result::is_ok() /*----------------------------------------------------------------------------*/ /** * \brief Get an iterator on the beginning of the errors. */ bf::item_check_result::const_iterator bf::item_check_result::begin() const { return m_errors.begin(); } // item_check_result::begin() /*----------------------------------------------------------------------------*/ /** * \brief Get an iterator on the end of the errors. */ bf::item_check_result::const_iterator bf::item_check_result::end() const { return m_errors.end(); } // item_check_result::end() plee-the-bear-20251226/bear-factory/bear-editor/src/bf/code/item_class.cpp000066400000000000000000000431741512343254000260730ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bf::item_class class. * \author Julien Jorge */ #include "bf/item_class.hpp" #include #include #include /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ bf::item_class::item_class() { } // item_class::item_class() /*----------------------------------------------------------------------------*/ /** * \brief Copy constructor. * \param that The item to copy from. */ bf::item_class::item_class( const item_class& that ) { copy(that); } // item_class::item_class() /*----------------------------------------------------------------------------*/ /** * \brief Destructor. */ bf::item_class::~item_class() { clear(); } // item_class::~item_class() /*----------------------------------------------------------------------------*/ /** * \brief Assignment. * \param that The item to copy from. */ bf::item_class& bf::item_class::operator=( const item_class& that ) { if ( this != &that ) { clear(); copy(that); } return *this; } // item_class::operator=() /*----------------------------------------------------------------------------*/ /** * \brief Get an iterator on the first field. */ bf::item_class::field_iterator bf::item_class::field_begin() const { return m_field.begin(); } // item_class::field_begin() /*----------------------------------------------------------------------------*/ /** * \brief Get an iterator just past the last field. */ bf::item_class::field_iterator bf::item_class::field_end() const { return m_field.end(); } // item_class::field_end() /*----------------------------------------------------------------------------*/ /** * \brief Get an iterator on the first super class. */ bf::item_class::const_super_class_iterator bf::item_class::super_class_begin() const { return m_super_classes.begin(); } // item_class::super_class_begin() /*----------------------------------------------------------------------------*/ /** * \brief Get an iterator just past the last super class. */ bf::item_class::const_super_class_iterator bf::item_class::super_class_end() const { return m_super_classes.end(); } // item_class::super_class_end() /*----------------------------------------------------------------------------*/ /** * \brief Add a field to this item. * \param name The name of the field. * \param field Pointer on the field to add. * \remark \a field will be deleted by the destructor. */ void bf::item_class::add_field( const std::string& name, const type_field& field ) { field_map_type::iterator it = m_field.find(name); if ( it == m_field.end() ) m_field[name] = field.clone(); else claw::logger << claw::log_error << "Field '" << name << "' already exists." << std::endl; } // item_class::add_field() /*----------------------------------------------------------------------------*/ /** * \brief Set the description of the class. * \param desc The description of the class. */ void bf::item_class::set_description( const std::string& desc ) { m_description = desc; } // item_class::set_description() /*----------------------------------------------------------------------------*/ /** * \brief Set the url where a documentation of the class can be found. * \param url The url. */ void bf::item_class::set_url( const std::string& url ) { m_url = url; } // item_class::set_url() /*----------------------------------------------------------------------------*/ /** * \brief Set the name of the class. * \param class_name The name of the class. */ void bf::item_class::set_class_name( const std::string& class_name ) { m_class_name = class_name; } // item_class::set_class_name() /*----------------------------------------------------------------------------*/ /** * \brief Get the category of the class. * \param category The category of the class. */ void bf::item_class::set_category( const std::string& category ) { m_category = category; } // item_class::set_category() /*----------------------------------------------------------------------------*/ /** * \brief Set the color used for displaying the item. * \param color The color to use. */ void bf::item_class::set_color( const std::string& color ) { m_color = color; } // item_class::set_color() /*----------------------------------------------------------------------------*/ /** * \brief Tell if the item can be fixed. * \param fixable The value to set. */ void bf::item_class::set_fixable( bool fixable ) { m_fixable = fixable; } // item_class::set_fixable() /*----------------------------------------------------------------------------*/ /** * \brief Tell if the class has a given class somewhere in its super classes. * \param super_class The name of the super class to search for. */ bool bf::item_class::inherits_from( const std::string& super_class ) const { bool result = has_super_class(super_class); if (!result) { const_super_class_iterator it; for (it=super_class_begin(); !result && (it!=super_class_end()); ++it ) result = it->inherits_from(super_class); } return result; } // item_class::inherits_from() /*----------------------------------------------------------------------------*/ /** * \brief Tell if the class has a given immediate super class. * \param super_class The name of the super class. */ bool bf::item_class::has_super_class( const std::string& super_class ) const { bool result = false; const_super_class_iterator it; for (it=super_class_begin(); !result && (it!=super_class_end()); ++it ) result = (it->get_class_name() == super_class); return result; } // item_class::add_super_class() /*----------------------------------------------------------------------------*/ /** * \brief Add a class from which this one inherits. * \param super_class The name of the super class. */ void bf::item_class::add_super_class( item_class const* super_class ) { m_super_classes.push_back(super_class); } // item_class::add_super_class() /*----------------------------------------------------------------------------*/ /** * \brief Remove a class from the super classes. * \param super_class The name of the super class. */ void bf::item_class::remove_super_class( const std::string& super_class ) { bool found = false; super_class_list::iterator it(m_super_classes.begin()); while ( !found && (it!=m_super_classes.end()) ) if ( (*it)->get_class_name() == super_class ) found = true; else ++it; if ( found ) m_super_classes.erase(it); } // item_class::remove_super_class() /*----------------------------------------------------------------------------*/ /** * \brief Set the default value of a field of this class or a parent class. * \param f The name of the field. * \param v The new default value. */ void bf::item_class::new_default_value( const std::string& f, const std::string& v ) { m_default_value[f] = v; } // item_class::new_default_value() /*----------------------------------------------------------------------------*/ /** * \brief Get the default value of a field of this class or a parent class. * \param f The name of the field. */ std::string bf::item_class::get_default_value( const std::string& f ) const { std::string result; string_map_type::const_iterator it = m_default_value.find(f); if ( it!=m_default_value.end() ) result = it->second; else { field_map_type::const_iterator itf = m_field.find(f); if ( itf!=m_field.end() ) result = itf->second->get_default_value(); else { const_super_class_iterator it_p = super_class_begin(); for ( it_p=m_super_classes.begin(); result.empty() && it_p!=super_class_end(); ++it_p ) result = it_p->get_default_value(f); } } return result; } // item_class::get_default_value() /*----------------------------------------------------------------------------*/ /** * \brief Indicate that a field of the parent classes is defined by this class. * \param f The name of the field. */ void bf::item_class::add_removed_field( const std::string& f ) { CLAW_PRECOND( has_field(f) ); CLAW_PRECOND( std::find( m_removed_fields.begin(), m_removed_fields.end(), f ) == m_removed_fields.end() ); m_removed_fields.push_back(f); } // item_class::add_removed_field() /*----------------------------------------------------------------------------*/ /** * \brief Tell if a field of the parent classes is removed in this class. * \param f The name of the field. */ bool bf::item_class::is_removed_field( const std::string& f ) const { CLAW_PRECOND( has_field(f) ); return std::find( m_removed_fields.begin(), m_removed_fields.end(), f ) != m_removed_fields.end(); } // item_class::is_removed_field() /*----------------------------------------------------------------------------*/ /** * \brief Get all the names of the fields of this class and its super classes. * \param f (out) The names of the fields. */ void bf::item_class::get_field_names_in_hierarchy ( std::list& f ) const { std::list fields; std::list removed; get_all_field_names_in_hierarchy(fields); get_removed_fields_names_in_hierarchy(removed); fields.sort(); removed.sort(); f.clear(); std::set_difference ( fields.begin(), fields.end(), removed.begin(), removed.end(), std::back_inserter(f) ); f.unique(); } // item_class::get_field_names_in_hierarchy() /*----------------------------------------------------------------------------*/ /** * \brief Get the description of a field, given its name. * \param field_name The name of the field. */ const bf::type_field& bf::item_class::get_field( const std::string& field_name ) const { CLAW_PRECOND( has_field(field_name) ); const type_field* result = search_field(field_name); return *result; } // item_class::get_field() /*----------------------------------------------------------------------------*/ /** * \brief Get the description of the class. */ const std::string& bf::item_class::get_description() const { return m_description; } // item_class::get_description() /*----------------------------------------------------------------------------*/ /** * \brief Get the url of the documentation of the class. */ const std::string& bf::item_class::get_url() const { return m_url; } // item_class::get_url() /*----------------------------------------------------------------------------*/ /** * \brief Get the name of the class. */ const std::string& bf::item_class::get_class_name() const { return m_class_name; } // item_class::get_class_name() /*----------------------------------------------------------------------------*/ /** * \brief Get the category of the class. */ const std::string& bf::item_class::get_category() const { return m_category; } // item_class::get_category() /*----------------------------------------------------------------------------*/ /** * \brief Get the color used for displaying the item. */ const std::string& bf::item_class::get_color() const { return m_color; } // item_class::get_color() /*----------------------------------------------------------------------------*/ /** * \brief Tell if the item can be fixable. */ bool bf::item_class::get_fixable() const { bool result = m_fixable; const_super_class_iterator it; for ( it = super_class_begin(); ( it != super_class_end() ) && result; ++it) result = result && it->get_fixable(); return result; } // item_class::get_fixable() /*----------------------------------------------------------------------------*/ /** * \brief Find the whole class hierarchy of the class. * \param hierarchy (out) The classes from which \a class_name inherit. */ void bf::item_class::find_hierarchy( std::list& hierarchy ) const { hierarchy.push_front( this ); const_super_class_iterator it; const const_super_class_iterator eit = super_class_end(); for ( it=super_class_begin(); it!=eit; ++it ) it->find_hierarchy(hierarchy); } // item_class::find_hierachy() /*----------------------------------------------------------------------------*/ /** * \brief Test the unicity of each field. * Return True if the class is valid. * \param error_msg The message of the error. */ bool bf::item_class::field_unicity_test(std::string& error_msg) const { bool result = true; std::set fields; std::list::iterator super_class; std::list hierarchy; find_hierarchy( hierarchy ); for ( super_class = hierarchy.begin(); ( super_class != hierarchy.end() ) && result; ++super_class) { field_iterator it; for ( it = (*super_class)->field_begin(); ( it != (*super_class)->field_end() ) && result; ++it ) if ( fields.find(it->get_name()) != fields.end() ) { result = false; error_msg = "the field '" + it->get_name() + "' is already defined in the super class '" + (*super_class)->get_class_name() + "'"; } else fields.insert(it->get_name()); } return result; } // item_class::field_unicity_test() /*----------------------------------------------------------------------------*/ /** * \brief Tell if this class, or one of the parent classes, has a field with a * given name. * \param name The name of the field we are looking for. */ bool bf::item_class::has_field( const std::string& name ) const { bool result = false; field_map_type::const_iterator it = m_field.find( name ); if ( it != m_field.end() ) result = true; else { const_super_class_iterator it; for ( it=super_class_begin(); !result && (it!=super_class_end()); ++it) result = it->has_field( name ); } return result; } // item_class::has_field() /*----------------------------------------------------------------------------*/ /** * \brief Tell if this class, or one of the parent classes, has a field of a * given type with a given name. * \param name The name of the field we are looking for. * \param t The desired type. */ bool bf::item_class::has_field ( const std::string& name, type_field::field_type t ) const { bool result = false; field_map_type::const_iterator it = m_field.find( name ); if ( it != m_field.end() ) result = it->second->get_field_type() == t; else { const_super_class_iterator it; for (it=super_class_begin(); !result && (it!=super_class_end()); ++it) result = it->has_field( name, t ); } return result; } // item_class::has_field() /*----------------------------------------------------------------------------*/ /** * \brief Remove all fields. */ void bf::item_class::clear() { field_map_type::const_iterator it; for (it=m_field.begin(); it!=m_field.end(); ++it) delete it->second; m_field.clear(); } // item_class::clear() /*----------------------------------------------------------------------------*/ /** * \brief Copy all fields from an other item class. * \param that The item to copy from. */ void bf::item_class::copy( const item_class& that ) { m_class_name = that.m_class_name; m_description = that.m_description; m_url = that.m_url; m_category = that.m_category; m_color = that.m_color; m_fixable = that.m_fixable; m_super_classes = that.m_super_classes; m_default_value = that.m_default_value; m_removed_fields = that.m_removed_fields; field_map_type::const_iterator it; for (it=that.m_field.begin(); it!=that.m_field.end(); ++it) m_field[it->first] = it->second->clone(); } // item_class::copy() /*----------------------------------------------------------------------------*/ /** * \brief Get the description of a field, given its name. * \param field_name The name of the field. */ const bf::type_field* bf::item_class::search_field( const std::string& field_name ) const { field_map_type::const_iterator it = m_field.find(field_name); const bf::type_field* result = NULL; if ( it != m_field.end() ) result = it->second; else { const_super_class_iterator it_p; for ( it_p=super_class_begin(); (result == NULL) && it_p!=super_class_end(); ++it_p ) result = it_p->search_field(field_name); } return result; } // item_class::search_field() /*----------------------------------------------------------------------------*/ /** * \brief Get all the names of the fields whose values are set by this class and * its super classes. * \param f (out) The names of the fields. */ void bf::item_class::get_removed_fields_names_in_hierarchy ( std::list& f ) const { std::copy ( m_removed_fields.begin(), m_removed_fields.end(), std::front_inserter(f) ); const_super_class_iterator it; for ( it=super_class_begin(); it!=super_class_end(); ++it ) it->get_removed_fields_names_in_hierarchy(f); } // item_class::get_removed_fields_names_in_hierarchy() /*----------------------------------------------------------------------------*/ /** * \brief Get all the names of the fields of this class and its super classes. * \param f (out) The names of the fields. */ void bf::item_class::get_all_field_names_in_hierarchy ( std::list& f ) const { std::transform( m_field.begin(), m_field.end(), std::front_inserter(f), claw::const_pair_first() ); const_super_class_iterator it; for ( it=super_class_begin(); it!=super_class_end(); ++it ) it->get_all_field_names_in_hierarchy(f); } // item_class::get_all_field_names_in_hierarchy() plee-the-bear-20251226/bear-factory/bear-editor/src/bf/code/item_class_pool.cpp000066400000000000000000000177511512343254000271260ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bf::item_class_pool class. * \author Julien Jorge */ #include "bf/item_class_pool.hpp" #include "bf/class_not_found.hpp" #include "bf/item_class_xml_parser.hpp" #include "bf/path_configuration.hpp" #include "bf/scan_dir.hpp" #include #include #include /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param c The map where we associate a file with its class. */ bf::item_class_pool::open_item_class_file::open_item_class_file ( std::map& c ) : class_files(c) { } // item_class_pool::open_item_class_file::open_item_class_file() /*----------------------------------------------------------------------------*/ /** * \brief Add a class and its file. * \param path The path to the file describing the class. */ void bf::item_class_pool::open_item_class_file::operator() ( const std::string& path ) { try { const std::string class_name = item_class_xml_parser::get_item_class_name(path); if ( class_files.find(class_name) != class_files.end() ) claw::logger << claw::log_error << "Duplicated item class '" << class_name << "' in '" << path << '\'' << std::endl; else class_files[class_name] = path; } catch(std::exception& e) { claw::logger << claw::log_error << path << ": " << e.what() << std::endl; } } // item_class_pool::open_item_class_file::operator()() /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param w The name of workspace. */ bf::item_class_pool::item_class_pool( const std::string& w ) { scan_directory( w ); } // item_class_pool::item_class_pool() /*----------------------------------------------------------------------------*/ /** * \brief Destructor. */ bf::item_class_pool::~item_class_pool() { item_class_map::iterator it; for ( it=m_item_class.begin(); it!=m_item_class.end(); ++it ) delete it->second; } // item_class_pool::~item_class_pool() /*----------------------------------------------------------------------------*/ /** * \brief Tell if we have an item class with a given name. * \param class_name The name of the item class to check. */ bool bf::item_class_pool::has_item_class( const std::string& class_name ) const { return m_item_class.find(class_name) != m_item_class.end(); } // item_class_pool::has_item_class() /*----------------------------------------------------------------------------*/ /** * \brief Get the item class with a given name. * \param class_name The name of the item class we want. */ const bf::item_class& bf::item_class_pool::get_item_class( const std::string& class_name ) const { item_class_map::const_iterator it = m_item_class.find(class_name); if ( it == m_item_class.end() ) throw class_not_found(class_name); else return *it->second; } // item_class_pool::get_item_class() /*----------------------------------------------------------------------------*/ /** * \brief Get a pointer to the item class with a given name. * \param class_name The name of the item class we want. */ const bf::item_class* bf::item_class_pool::get_item_class_ptr( const std::string& class_name ) const { item_class_map::const_iterator it = m_item_class.find(class_name); if ( it == m_item_class.end() ) throw class_not_found(class_name); else return it->second; } // item_class_pool::get_item_class() /*----------------------------------------------------------------------------*/ /** * \brief Get a constant iterator on the begining of the pool. */ bf::item_class_pool::const_iterator bf::item_class_pool::begin() const { return const_iterator( m_item_class.begin() ); } // item_class_pool::begin() /*----------------------------------------------------------------------------*/ /** * \brief Get a constant iterator just pas the end of the pool. */ bf::item_class_pool::const_iterator bf::item_class_pool::end() const { return const_iterator( m_item_class.end() ); } // item_class_pool::end() /*----------------------------------------------------------------------------*/ /** * \brief Read all item files from a given directory and in its subdirectories. * \param w The workspace used. */ void bf::item_class_pool::scan_directory( const std::string& w ) { std::vector ext(1); ext[0] = ".xml"; if ( path_configuration::get_instance().has_workspace( w ) ) { workspace::path_list_const_iterator it; const workspace& work ( path_configuration::get_instance().get_workspace( w ) ); for ( it = work.item_class_begin(); it != work.item_class_end(); ++it ) { std::map files; open_item_class_file f(files); scan_dir scan; scan( *it, f, ext.begin(), ext.end() ); while ( !files.empty() ) load_class( files.begin()->first, files ); } } field_unicity_test(); } // item_class_pool::scan_directory() /*----------------------------------------------------------------------------*/ /** * \brief Read the file of an item class. * \param name The name of the class to read. * \param files The files associated to the item classes. */ void bf::item_class_pool::load_class ( const std::string& name, std::map& files ) { std::list pending; pending.push_front(name); while ( !pending.empty() ) { const std::string class_name( pending.front() ); item_class* item(NULL); try { item_class_xml_parser r; item = r.read( *this, files[class_name] ); m_item_class[item->get_class_name()] = item; pending.pop_front(); files.erase(class_name); } catch( class_not_found& e ) { delete item; if ( std::find( pending.begin(), pending.end(), e.class_name() ) != pending.end() ) { claw::logger << claw::log_error << "Circular inheritance for '" << e.class_name() << '\'' << std::endl; pending.pop_front(); files.erase(class_name); } else if ( files.find( e.class_name() ) == files.end() ) { claw::logger << claw::log_error << "Can't find class '" << e.class_name() << "' for '" << class_name << '\'' << std::endl; pending.pop_front(); files.erase(class_name); } else pending.push_front(e.class_name()); } catch( std::exception& e ) { claw::logger << claw::log_error << e.what() << std::endl; delete item; pending.pop_front(); files.erase(class_name); } } } // item_class_pool::load_classes() /*----------------------------------------------------------------------------*/ /** * \brief Test, for each classe, the unicity of fields. */ void bf::item_class_pool::field_unicity_test() { const_iterator it; std::set not_valid_classes; for ( it=begin(); it!=end(); ++it ) { std::string error_msg; if ( !it->field_unicity_test(error_msg) ) { claw::logger << claw::log_warning << "Ignoring class '" << it->get_class_name() << "' : " << error_msg << std::endl; not_valid_classes.insert(it->get_class_name()); } } std::set::const_iterator it2; for ( it2=not_valid_classes.begin(); it2!=not_valid_classes.end(); ++it2 ) { delete m_item_class[*it2]; m_item_class.erase(*it2); } } // item_class_pool::control_sprite_size() plee-the-bear-20251226/bear-factory/bear-editor/src/bf/code/item_class_selection_dialog.cpp000066400000000000000000000055211512343254000314510ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bf::item_class_selection_dialog class. * \author Julien Jorge */ #include "bf/item_class_selection_dialog.hpp" #include "bf/class_tree_ctrl.hpp" #include "bf/wx_facilities.hpp" #include /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param parent The parent class. * \param env The workspace environment used. * \param class_name The initial value. */ bf::item_class_selection_dialog::item_class_selection_dialog ( wxWindow* parent, workspace_environment& env, const std::string& class_name ) : wxDialog(parent, wxID_ANY, _("Select an item class"), wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER ), m_class_name(class_name) { m_tree = new class_tree_ctrl(this, env, wxID_ANY); wxBoxSizer* sizer = new wxBoxSizer(wxVERTICAL); sizer->Add(m_tree, 1, wxEXPAND); sizer->Add(CreateStdDialogButtonSizer(wxOK | wxCANCEL), 0, wxEXPAND); SetSizer(sizer); Connect ( m_tree->GetId(), class_selected_event::class_selected_event_type, class_selected_event_handler (item_class_selection_dialog::on_class_selected) ); } // item_class_selection_dialog::item_class_selection_dialog() /*----------------------------------------------------------------------------*/ /** * \brief Get the selected item class. */ const std::string& bf::item_class_selection_dialog::get_class_name() const { return m_class_name; } // item_class_selection_dialog::get_class_name() /*----------------------------------------------------------------------------*/ /** * \brief Validate the selection. * \param event This event occured. */ void bf::item_class_selection_dialog::on_ok( wxCommandEvent& WXUNUSED(event) ) { wxTreeItemId item = m_tree->GetSelection(); if ( item.IsOk() ) if ( !m_tree->ItemHasChildren(item) ) { m_class_name = wx_to_std_string( m_tree->GetItemText(item) ); EndModal(wxID_OK); } } // item_class_selection_dialog::on_ok() /*----------------------------------------------------------------------------*/ /** * \brief Procedure called when the user picks a class in the class list. * \param event This event occured. */ void bf::item_class_selection_dialog::on_class_selected ( class_selected_event& event ) { m_class_name = event.get_class_name(); EndModal(wxID_OK); } // item_class_selection_dialog::on_class_selected() /*----------------------------------------------------------------------------*/ BEGIN_EVENT_TABLE(bf::item_class_selection_dialog, wxDialog) EVT_BUTTON( wxID_OK, bf::item_class_selection_dialog::on_ok ) END_EVENT_TABLE() plee-the-bear-20251226/bear-factory/bear-editor/src/bf/code/item_class_xml_parser.cpp000066400000000000000000000501241512343254000303200ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bf::item_class_xml_parser. * \author Julien Jorge */ #include "bf/item_class_xml_parser.hpp" #include "bf/type_field_set.hpp" #include "bf/type_field_interval.hpp" #include "bf/wx_facilities.hpp" #include "bf/xml/exception.hpp" #include "bf/xml/item_class_inherit_node.hpp" #include #include #include #include /*----------------------------------------------------------------------------*/ /** * \brief Get the name of the item class described in a file. * \param file_path The path of the XML file to parse. */ std::string bf::item_class_xml_parser::get_item_class_name ( const std::string& file_path ) { wxXmlDocument doc; if ( !doc.Load( std_to_wx_string(file_path) ) ) throw std::ios_base::failure ( "Cannot load the XML file '" + file_path + "'" ); wxXmlNode* node = doc.GetRoot(); if ( node->GetName() != wxT("item") ) throw xml::bad_node( wx_to_std_string(node->GetName()) ); wxString val; if ( !node->GetAttribute( wxT("class"), &val ) ) throw xml::missing_property("class"); return wx_to_std_string(val); } // item_class_xml_parser::get_item_class_name() /*----------------------------------------------------------------------------*/ /** * \brief Read an item class XML file. * \param pool The pool of item classes in which we take the parent classes. * \param file_path The path of the XML file to parse. */ bf::item_class* bf::item_class_xml_parser::read ( const item_class_pool& pool, const std::string& file_path ) const { wxXmlDocument doc; if ( !doc.Load( std_to_wx_string(file_path) ) ) throw std::ios_base::failure ( "Cannot load the XML file '" + file_path + "'" ); item_class* result = new item_class; try { parse_item_node( *result, pool, doc.GetRoot() ); } catch(...) { delete result; throw; } return result; } // item_class_xml_parser::read() /*----------------------------------------------------------------------------*/ /** * \brief Parse a node of the file. * \param item (out) The resulting item. * \param pool The pool of item classes in which we take the parent classes. * \param node The node to explore. */ void bf::item_class_xml_parser::parse_item_node ( item_class& item, const item_class_pool& pool, const wxXmlNode* node ) const { if ( node->GetName() != wxT("item") ) throw xml::bad_node( wx_to_std_string(node->GetName()) ); read_item_properties( item, node ); for ( node=node->GetChildren(); node!=NULL; node=node->GetNext() ) if ( node->GetName() == wxT("fields") ) read_item_fields( item, node ); else if ( node->GetName() == wxT("inherit") ) { xml::item_class_inherit_node reader; reader.read(pool, item, node); } else if ( node->GetName() == wxT("description") ) read_description(item, node); else if ( node->GetName() == wxT("new_default_value") ) read_new_default_value( item, node ); else if ( node->GetName() == wxT("remove_field") ) read_removed_field( item, node ); else claw::logger << claw::log_warning << "Ignored node '" << wx_to_std_string(node->GetName()) << "' " << "\n" << wx_to_std_string(node->GetNodeContent()) << std::endl; } // item_class_xml_parser::parse_item_node() /*----------------------------------------------------------------------------*/ /** * \brief Read the properties of the item. * \param item (out) The resulting item. * \param node The node to explore. */ void bf::item_class_xml_parser::read_item_properties ( item_class& item, const wxXmlNode* node ) const { wxString val; if ( !node->GetAttribute( wxT("class"), &val ) ) throw xml::missing_property("class"); item.set_class_name( wx_to_std_string(val) ); if ( !node->GetAttribute( wxT("category"), &val ) ) throw xml::missing_property("category"); item.set_category( wx_to_std_string(val) ); item.set_color ( wx_to_std_string(node->GetAttribute( wxT("box_color"), wxT("#00FF00") )) ); item.set_url ( wx_to_std_string(node->GetAttribute( wxT("url"), wxEmptyString )) ); item.set_fixable ( node->GetAttribute( wxT("fixable"), wxT("true") ) == wxT("true") ); } // item_class_xml_parser::read_item_properties() /*----------------------------------------------------------------------------*/ /** * \brief Read the fields of the item. * \param item (out) The resulting item. * \param node The node to explore. */ void bf::item_class_xml_parser::read_item_fields ( item_class& item, const wxXmlNode* node ) const { for ( node=node->GetChildren(); node!=NULL; node=node->GetNext() ) if ( node->GetName() == wxT("field") ) read_field_type( item, node ); else throw xml::bad_node( wx_to_std_string(node->GetName()) ); } // item_class_xml_parser::read_item_fields() /*----------------------------------------------------------------------------*/ /** * \brief Read a new default value for a field of the item. * \param item (out) The resulting item. * \param node The node to explore. */ void bf::item_class_xml_parser::read_new_default_value ( item_class& item, const wxXmlNode* node ) const { wxString val; if ( !node->GetAttribute( wxT("name"), &val ) ) throw xml::missing_property("name"); item.new_default_value ( wx_to_std_string(val), wx_to_std_string(node->GetNodeContent()) ); } // item_class_xml_parser::read_new_default_value() /*----------------------------------------------------------------------------*/ /** * \brief Read the name of a field of the parent classes whose value is defined * by this class. * \param item (out) The resulting item. * \param node The node to explore. */ void bf::item_class_xml_parser::read_removed_field ( item_class& item, const wxXmlNode* node ) const { const std::string val = wx_to_std_string(node->GetNodeContent()); if ( !item.has_field(val) ) throw xml::bad_value ( '\'' + val + "' is not a field of the parent classes of '" + item.get_class_name() + "'." ); item.add_removed_field( val ); } // item_class_xml_parser::read_removed_field() /*----------------------------------------------------------------------------*/ /** * \brief Read the description of the item. * \param item (out) The resulting item. * \param node The node to explore. */ void bf::item_class_xml_parser::read_description ( item_class& item, const wxXmlNode* node ) const { std::string desc( wx_to_std_string(node->GetNodeContent()) ); claw::text::replace( desc, std::string("\t\n"), std::string(" ") ); claw::text::squeeze( desc, " " ); claw::text::trim( desc, " " ); item.set_description ( wx_to_std_string(wxGetTranslation(std_to_wx_string(desc))) ); } // item_class_xml_parser::read_description() /*----------------------------------------------------------------------------*/ /** * \brief Read the definition of a field of the item. * \param item (out) The resulting item. * \param node The node to explore. */ void bf::item_class_xml_parser::read_field_type ( item_class& item, const wxXmlNode* node ) const { wxString val; std::string name; if ( !node->GetAttribute( wxT("name"), &val ) ) throw xml::missing_property("name"); name = wx_to_std_string(val); if ( !node->GetAttribute( wxT("type"), &val ) ) throw xml::missing_property("type"); type_field* field; if ( val == wxT("integer") ) field = add_integer_field( name, node->GetChildren() ); else if ( val == wxT("u_integer") ) field = add_u_integer_field( name, node->GetChildren() ); else if ( val == wxT("real") ) field = add_real_field( name, node->GetChildren() ); else if ( val == wxT("string") ) field = add_string_field( name, node->GetChildren() ); else if ( val == wxT("boolean") ) field = add_boolean_field( name, node->GetChildren() ); else if ( val == wxT("sprite") ) field = add_sprite_field( name, node->GetChildren() ); else if ( val == wxT("animation") ) field = add_animation_field( name, node->GetChildren() ); else if ( val == wxT("item_reference") ) field = add_item_reference_field( name, node->GetChildren() ); else if ( val == wxT("font") ) field = add_font_field( name, node->GetChildren() ); else if ( val == wxT("color") ) field = add_color_field( name, node->GetChildren() ); else if ( val == wxT("sample") ) field = add_sample_field( name, node->GetChildren() ); else if ( val == wxT("easing") ) field = add_easing_field( name, node->GetChildren() ); else throw xml::bad_value( wx_to_std_string(val) ); field->set_required ( node->GetAttribute( wxT("required"), wxT("false") ) == wxT("true") ); field->set_is_list ( node->GetAttribute( wxT("list"), wxT("false") ) == wxT("true") ); item.add_field(name, *field); delete field; } // item_class_xml_parser::read_field_type() /*----------------------------------------------------------------------------*/ /** * \brief Add a field of type "integer" to the item. * \param name The name of the field. * \param node The node to explore. */ bf::type_field* bf::item_class_xml_parser::add_integer_field ( const std::string& name, const wxXmlNode* node ) const { return create_field(name, type_field::integer_field_type, node); } // item_class_xml_parser::add_integer_field() /*----------------------------------------------------------------------------*/ /** * \brief Add a field of type "u_integer" to the item. * \param name The name of the field. * \param node The node to explore. */ bf::type_field* bf::item_class_xml_parser::add_u_integer_field ( const std::string& name, const wxXmlNode* node ) const { return create_field (name, type_field::u_integer_field_type, node); } // item_class_xml_parser::add_u_integer_field() /*----------------------------------------------------------------------------*/ /** * \brief Add a field of type "real" to the item. * \param name The name of the field. * \param node The node to explore. */ bf::type_field* bf::item_class_xml_parser::add_real_field ( const std::string& name, const wxXmlNode* node ) const { return create_field(name, type_field::real_field_type, node); } // item_class_xml_parser::add_real_field() /*----------------------------------------------------------------------------*/ /** * \brief Add a field of type "string" to the item. * \param name The name of the field. * \param node The node to explore. */ bf::type_field* bf::item_class_xml_parser::add_string_field ( const std::string& name, const wxXmlNode* node ) const { return create_field(name, type_field::string_field_type, node); } // item_class_xml_parser::add_string_field() /*----------------------------------------------------------------------------*/ /** * \brief Add a field of type "boolean" to the item. * \param name The name of the field. * \param node The node to explore. */ bf::type_field* bf::item_class_xml_parser::add_boolean_field ( const std::string& name, const wxXmlNode* node ) const { return create_field(name, type_field::boolean_field_type, node); } // item_class_xml_parser::add_boolean_field() /*----------------------------------------------------------------------------*/ /** * \brief Add a field of type "sprite" to the item. * \param name The name of the field. * \param node The node to explore. */ bf::type_field* bf::item_class_xml_parser::add_sprite_field ( const std::string& name, const wxXmlNode* node ) const { return create_field(name, type_field::sprite_field_type, node); } // item_class_xml_parser::add_sprite_field() /*----------------------------------------------------------------------------*/ /** * \brief Add a field of type "animation" to the item. * \param name The name of the field. * \param node The node to explore. */ bf::type_field* bf::item_class_xml_parser::add_animation_field ( const std::string& name, const wxXmlNode* node ) const { return create_field (name, type_field::animation_field_type, node); } // item_class_xml_parser::add_animation_field() /*----------------------------------------------------------------------------*/ /** * \brief Add a field of type "item_reference" to the item. * \param name The name of the field. * \param node The node to explore. */ bf::type_field* bf::item_class_xml_parser::add_item_reference_field ( const std::string& name, const wxXmlNode* node ) const { return create_field (name, type_field::item_reference_field_type, node); } // item_class_xml_parser::add_item_reference_field() /*----------------------------------------------------------------------------*/ /** * \brief Add a field of type "font" to the item. * \param name The name of the field. * \param node The node to explore. */ bf::type_field* bf::item_class_xml_parser::add_font_field ( const std::string& name, const wxXmlNode* node ) const { return create_field (name, type_field::font_field_type, node); } // item_class_xml_parser::add_font_field() /*----------------------------------------------------------------------------*/ /** * \brief Add a field of type "color" to the item. * \param name The name of the field. * \param node The node to explore. */ bf::type_field* bf::item_class_xml_parser::add_color_field ( const std::string& name, const wxXmlNode* node ) const { return create_field (name, type_field::color_field_type, node); } // item_class_xml_parser::add_color_field() /*----------------------------------------------------------------------------*/ /** * \brief Add a field of type "sample" to the item. * \param name The name of the field. * \param node The node to explore. */ bf::type_field* bf::item_class_xml_parser::add_sample_field ( const std::string& name, const wxXmlNode* node ) const { return create_field (name, type_field::sample_field_type, node); } // item_class_xml_parser::add_sample_field() /*----------------------------------------------------------------------------*/ /** * \brief Adds a field of type "easing" to the item. * \param name The name of the field. * \param node The node to explore. */ bf::type_field* bf::item_class_xml_parser::add_easing_field ( const std::string& name, const wxXmlNode* node ) const { return create_field (name, type_field::easing_field_type, node); } // item_class_xml_parser::add_easing_field() /*----------------------------------------------------------------------------*/ /** * \brief Read the "field" property of a node "after". * \param node The node to explore. */ std::string bf::item_class_xml_parser::read_after( const wxXmlNode* node ) const { wxString val; if ( !node->GetAttribute( wxT("field"), &val ) ) throw xml::missing_property("field"); return wx_to_std_string(val); } // item_class_xml_parser::read_after() /*----------------------------------------------------------------------------*/ /** * \brief Read the elements of a set of values. * \param node The node to explore. * \param set The resulting set. */ void bf::item_class_xml_parser::read_set ( const wxXmlNode* node, std::list& set ) const { for ( node=node->GetChildren(); node!=NULL; node = node->GetNext() ) if ( node->GetName() == wxT("element") ) { wxString val; if ( !node->GetAttribute( wxT("value"), &val ) ) throw xml::missing_property("value"); set.push_back( wx_to_std_string(val) ); } else throw xml::bad_node( wx_to_std_string(node->GetName()) ); } // item_class_xml_parser::read_set() /*----------------------------------------------------------------------------*/ /** * \brief Create a field for the item. * \param name The name of the field. * \param ft The type of the field. * \param node The node to explore. * * \b Template \b parameters * - \a T The type of the bounds of the interval. Ignored if * \a RangeAvailable == false. * - \a SetAvailable Tell if the field takes its value in a set of values. * - \a RangeAvailable Tell if the field takes its value in an interval. */ template bf::type_field* bf::item_class_xml_parser::create_field ( const std::string& name, type_field::field_type ft, const wxXmlNode* node ) const { type_field* result(NULL); std::list prec; std::string desc; std::string default_value; for ( ; node!=NULL; node = node->GetNext() ) if ( node->GetName() == wxT("after") ) prec.push_front( read_after(node) ); else if ( node->GetName() == wxT("description") ) desc = wx_to_std_string( node->GetNodeContent() ); else if ( node->GetName() == wxT("default_value") ) default_value = wx_to_std_string( node->GetNodeContent().Trim() ); else if ( result == NULL ) { if ( node->GetName() == wxT("set") ) { if ( SetAvailable ) { std::list set; read_set( node, set ); result = new type_field_set( name, ft, set ); } else claw::logger << claw::log_warning << "Ignored node '" << wx_to_std_string(node->GetName()) << "' " << name << "\n" << wx_to_std_string(node->GetNodeContent()) << std::endl; } else if ( node->GetName() == wxT("interval") ) { if ( RangeAvailable ) { std::pair range = read_interval( node ); result = new type_field_interval( name, range.first, range.second ); } else claw::logger << claw::log_warning << "Ignored node '" << wx_to_std_string(node->GetName()) << "' " << name << "\n" << wx_to_std_string(node->GetNodeContent()) << std::endl; } else if ( node->GetName() != wxT("comment") ) claw::logger << claw::log_warning << "Ignored node '" << wx_to_std_string(node->GetName()) << "' " << name << "\n" << wx_to_std_string(node->GetNodeContent()) << std::endl; } else if ( node->GetName() != wxT("comment") ) claw::logger << claw::log_warning << "Ignored node '" << wx_to_std_string(node->GetName()) << "' " << name << "\n" << wx_to_std_string(node->GetNodeContent()) << std::endl; if ( result == NULL ) result = new type_field( name, ft ); for ( std::size_t p=desc.find_first_of("\t\n"); p!=std::string::npos; p=desc.find_first_of("\t\n", p) ) desc[p] = ' '; claw::text::replace( desc, std::string("\t\n"), std::string(" ") ); claw::text::squeeze( desc, " " ); claw::text::trim( desc, " " ); result->set_preceding( prec ); result->set_description ( wx_to_std_string(wxGetTranslation(std_to_wx_string(desc))) ); result->set_default_value( default_value ); return result; } // item_class_xml_parser::create_field() /*----------------------------------------------------------------------------*/ /** * \brief Read the bounds of a node "interval". * \param node The node to explore. */ template std::pair bf::item_class_xml_parser::read_interval( const wxXmlNode* node ) const { std::pair result; wxString val; std::istringstream iss; if ( !node->GetAttribute( wxT("from"), &val ) ) result.first = std::numeric_limits::min(); else { iss.str( wx_to_std_string(val) ); if ( !(iss >> result.first) ) throw xml::bad_value( wx_to_std_string(val) ); } if ( !node->GetAttribute( wxT("to"), &val ) ) result.second = std::numeric_limits::max(); else { iss.clear(); iss.str( wx_to_std_string(val) ); if ( !(iss >> result.second) ) throw xml::bad_value( wx_to_std_string(val) ); } return result; } // item_class_xml_parser::read_interval() plee-the-bear-20251226/bear-factory/bear-editor/src/bf/code/item_comparator.cpp000066400000000000000000000030311512343254000271210ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bf::item_comparator class. * \author Julien Jorge */ #include "bf/item_comparator.hpp" #include "bf/item_instance.hpp" /*----------------------------------------------------------------------------*/ bool bf::item_comparator::by_place::operator() ( const item_instance& a, const item_instance& b ) const { bool result = false; if ( a.get_rendering_parameters().get_left() < b.get_rendering_parameters().get_left() ) result = true; else if ( a.get_rendering_parameters().get_left() == b.get_rendering_parameters().get_left() ) { if ( a.get_rendering_parameters().get_bottom() < b.get_rendering_parameters().get_bottom() ) result = true; else if ( a.get_rendering_parameters().get_bottom() == b.get_rendering_parameters().get_bottom() ) { if ( a.get_rendering_parameters().get_width() < b.get_rendering_parameters().get_width() ) result = true; else if ( a.get_rendering_parameters().get_width() == b.get_rendering_parameters().get_width() ) result = ( a.get_rendering_parameters().get_height() < b.get_rendering_parameters().get_height() ); } } return result; } // item_comparator::by_place::operator() plee-the-bear-20251226/bear-factory/bear-editor/src/bf/code/item_event.cpp000066400000000000000000000037101512343254000260770ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /* * \file * \brief Implementation of the bf::item_event class. * \author Julien Jorge */ #include "bf/item_event.hpp" /*----------------------------------------------------------------------------*/ const wxEventType bf::item_event::selection_event_type = wxNewEventType(); /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param t The type of the event. * \param id the id of the window that generates the event. */ bf::item_event::item_event( wxEventType t, wxWindowID id ) : wxNotifyEvent(t, id), m_item(NULL) { } // item_event::item_event() /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param item The item concerned by this event. * \param t The type of the event. * \param id the id of the window that generates the event. */ bf::item_event::item_event( item_instance* item, wxEventType t, wxWindowID id ) : wxNotifyEvent(t, id), m_item(item) { } // item_event::item_event() /*----------------------------------------------------------------------------*/ /** * \brief Copy constructor. * \param that The instance to copy from. */ bf::item_event::item_event( const item_event& that ) : wxNotifyEvent(that), m_item(that.m_item) { } // item_event::item_event() /*----------------------------------------------------------------------------*/ /** * \brief Allocate a copy of this instance. */ wxEvent* bf::item_event::Clone() const { return new item_event(*this); } // item_event::Clone() /*----------------------------------------------------------------------------*/ /** * \brief Get the item concerned by this event. */ bf::item_instance* bf::item_event::get_item() const { return m_item; } // item_event::get_item() plee-the-bear-20251226/bear-factory/bear-editor/src/bf/code/item_field_edit.cpp000066400000000000000000001044161512343254000270530ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bf::item_field_edit class. * \author Julien Jorge */ #include "bf/item_field_edit.hpp" #include "bf/bool_edit.hpp" #include "bf/color_edit.hpp" #include "bf/custom_type.hpp" #include "bf/dialog_maker.hpp" #include "bf/easing_edit.hpp" #include "bf/free_edit.hpp" #include "bf/is_visual_type.hpp" #include "bf/item_class.hpp" #include "bf/item_reference_edit.hpp" #include "bf/set_edit.hpp" #include "bf/wx_facilities.hpp" #include "bf/any_animation_edit.hpp" #include "bf/font_edit.hpp" #include "bf/sample_edit.hpp" #include "bf/sprite_edit.hpp" #include "bf/call_by_field_type.hpp" #include #include /*----------------------------------------------------------------------------*/ /** * \brief Create and show the dialog for editing the field and update the item. * \param f The field to edit. * \param type The name of the type of the field. */ template void bf::item_field_edit::field_editor::open ( item_field_edit& self, const type_field& f, const wxString& type ) { typedef dialog_maker dialog_maker_type; typedef typename dialog_maker_type::dialog_type dialog_type; Type v; if ( !self.get_common_value(f, v) ) v = default_value::get(); dialog_type* const dlg = dialog_maker_type::create( self, type, f, v ); self.show_dialog(f.get_name(), *dlg); dlg->Destroy(); } // item_field_edit::field_editor::open() /*----------------------------------------------------------------------------*/ /** * \brief Creates and show the dialog for editing the field and update the * item. The created editor uses the image pool. * \param f The field to edit. * \param type The name of the type of the field. */ template void bf::item_field_edit::field_editor::open ( item_field_edit& self, const type_field& f, const wxString& type ) { CLAW_PRECOND( self.m_workspace != NULL ); typedef dialog_maker dialog_maker_type; typedef typename dialog_maker_type::dialog_type dialog_type; Type v; if ( !self.get_common_value(f, v) ) v = default_value::get(); dialog_type* const dlg = dialog_maker_type::create( self, type, f, v, *self.m_workspace ); self.show_dialog(f.get_name(), *dlg); dlg->Destroy(); } // item_field_edit::field_editor::open() /*----------------------------------------------------------------------------*/ const wxEventType bf::delete_item_field_event::delete_field_event_type = wxNewEventType(); /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param field_name The name of the cleared field. * \param t The type of the event. * \param id The id of the window that generates the event. */ bf::delete_item_field_event::delete_item_field_event ( const std::string& field_name, wxEventType t, wxWindowID id ) : wxNotifyEvent(t, id), m_field_name(field_name) { } // delete_item_field_event::delete_item_field_event() /*----------------------------------------------------------------------------*/ /** * \brief Allocate a copy of this instance. */ wxEvent* bf::delete_item_field_event::Clone() const { return new delete_item_field_event(*this); } // delete_item_field_event::Clone() /*----------------------------------------------------------------------------*/ /** * \brief Get the name of the field to clear. */ const std::string& bf::delete_item_field_event::get_field_name() const { return m_field_name; } // delete_item_field_event::get_field_name() /*----------------------------------------------------------------------------*/ const wxEventType bf::request_item_id_event::request_item_id_event_type = wxNewEventType(); /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param field The field to which the id will be given. * \param val The array in which the identifiers will be stored. * \param t The type of the event. * \param id The id of the window that generates the event. */ bf::request_item_id_event::request_item_id_event ( const type_field& field, wxArrayString& val, wxEventType t, wxWindowID id ) : wxNotifyEvent(t, id), m_field(field), m_values(val) { } // request_item_id_event::request_item_id_event() /*----------------------------------------------------------------------------*/ /** * \brief Allocate a copy of this instance. */ wxEvent* bf::request_item_id_event::Clone() const { return new request_item_id_event(*this); } // request_item_id_event::Clone() /*----------------------------------------------------------------------------*/ /** * \brief Get the field to which the id will be given. */ const bf::type_field& bf::request_item_id_event::get_type_field() const { return m_field; } // request_item_id_event::get_type_field() /*----------------------------------------------------------------------------*/ /** * \brief Add an id in the list of valid identifiers. * \param id The identifier to add. */ void bf::request_item_id_event::add_id( const wxString& id ) const { m_values.Add(id); } // request_item_id_event::add_id() /*----------------------------------------------------------------------------*/ const wxColour bf::item_field_edit::s_field_prefix_colour(*wxLIGHT_GREY); const std::string bf::item_field_edit::s_no_prefix("- no class -"); /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param parent Pointer to the owner. * \param id The identifier of this window. */ bf::item_field_edit::item_field_edit( wxWindow* parent, wxWindowID id ) : wxListView( parent, id, wxDefaultPosition, wxDefaultSize, wxLC_REPORT | wxLC_VRULES | wxLC_SINGLE_SEL ), m_last_selected_field(wxNOT_FOUND), m_workspace(NULL) { InsertColumn(0, _("Property")); InsertColumn(1, _("Value")); Connect( wxEVT_SIZE, wxSizeEventHandler(item_field_edit::on_size) ); Connect( wxEVT_COMMAND_LIST_COL_BEGIN_DRAG, wxListEventHandler(item_field_edit::on_column_begin_drag) ); Connect( wxEVT_COMMAND_LIST_COL_END_DRAG, wxListEventHandler(item_field_edit::on_column_end_drag) ); Connect( wxEVT_COMMAND_LIST_ITEM_ACTIVATED, wxListEventHandler(item_field_edit::on_item_activated) ); Connect( wxEVT_KEY_UP, wxKeyEventHandler(item_field_edit::on_key_up) ); } // item_field_edit::item_field_edit() /*----------------------------------------------------------------------------*/ /** * \brief Refresh the values of the fields. */ void bf::item_field_edit::refresh() { update_values(); } // item_field_edit::refresh() /*----------------------------------------------------------------------------*/ /** * \brief Add an item for which we want the properties. * \param item The item instance concerned by this window. * \return true if something has changed. */ bool bf::item_field_edit::add_item( item_instance* item ) { if ( item == NULL ) return clear(); if ( m_group.insert(item).second ) { fill_fields(); return true; } else return false; } // item_field_edit::add_item() /*----------------------------------------------------------------------------*/ /** * \brief Add several items for which we want the properties. * \param items The item instances concerned by this window. * \return true if something has changed. */ bool bf::item_field_edit::add_items( const std::vector& items ) { bool result = false; for ( std::vector::const_iterator it=items.begin(); it!=items.end(); ++it ) { bool inserted = m_group.insert(*it).second; result = result || inserted; } if( result ) fill_fields(); return result; } // item_field_edit::add_items() /*----------------------------------------------------------------------------*/ /** * \brief Stop editing the properties of an item. * \param item The item to remove. * \return true if something has changed. */ bool bf::item_field_edit::remove_item( item_instance* item ) { if ( m_group.erase(item) == 0 ) return false; fill_fields(); return true; } // item_field_edit::remove_item() /*----------------------------------------------------------------------------*/ /** * \brief Remove all items. * \return true if something has changed. */ bool bf::item_field_edit::clear() { bool result = !empty(); m_group.clear(); int index = GetFirstSelected(); if (index != wxNOT_FOUND) m_last_selected_field = index; DeleteAllItems(); return result; } // item_field_edit::clear() /*----------------------------------------------------------------------------*/ /** * \brief Tell if the control contains no items. */ bool bf::item_field_edit::empty() const { return m_group.empty(); } // item_field_edit::empty() /*----------------------------------------------------------------------------*/ /** * \brief Tell if there is only one edited item. */ bool bf::item_field_edit::has_single_item() const { if ( empty() ) return false; else return ++begin() == end(); } // item_field_edit::has_single_item() /*----------------------------------------------------------------------------*/ /** * \brief Get the single edited item. */ bf::item_instance& bf::item_field_edit::get_single_item() const { CLAW_PRECOND(has_single_item()); return *begin(); } // item_field_edit::get_single_item() /*----------------------------------------------------------------------------*/ /** * \brief Get an iterator on the first edited item. */ bf::item_field_edit::item_iterator bf::item_field_edit::begin() const { return m_group.begin(); } // item_field_edit::begin() /*----------------------------------------------------------------------------*/ /** * \brief Get an iterator just after the last edited item. */ bf::item_field_edit::item_iterator bf::item_field_edit::end() const { return m_group.end(); } // item_field_edit::end() /*----------------------------------------------------------------------------*/ /** * \brief Get a pointer to the class of all items if they all have the same * class. */ const bf::item_class* bf::item_field_edit::get_common_class() const { if ( empty() ) return NULL; const item_class* result(NULL); item_iterator it=begin(); result = it->get_class_ptr(); for (++it; (result != NULL) && (it!=end()); ++it) if ( result != it->get_class_ptr() ) result = NULL; return result; } // item_field_edit::get_common_class() /*----------------------------------------------------------------------------*/ /** * \brief Get the field with a given name, common to all items. * \param name The name of the field. */ const bf::type_field& bf::item_field_edit::get_common_field( const std::string& name ) const { CLAW_PRECOND( !empty() ); #ifndef NDEBUG for (item_iterator it=begin(); it!=end(); ++it) { CLAW_ASSERT( it->get_class().has_field(name), "Class '" + it->get_class().get_class_name() + "' has no field named '" + name + "'." ); } const type_field::field_type check_type = begin()->get_class().get_field(name).get_field_type(); for (item_iterator it=begin(); it!=end(); ++it) { CLAW_ASSERT( it->get_class().get_field(name).get_field_type() == check_type, "Class '" + it->get_class().get_class_name() + "' has a field named '" + name + "' but with a different type." ); } const bool check_list = begin()->get_class().get_field(name).is_list(); for (item_iterator it=begin(); it!=end(); ++it) { CLAW_ASSERT( it->get_class().get_field(name).is_list() == check_list, "Class '" + it->get_class().get_class_name() + "' has a field named '" + name + "' but with a different list status." ); } #endif return (*m_group.begin())->get_class().get_field(name); } // item_field_edit::get_common_field() /*----------------------------------------------------------------------------*/ /** * \brief Get the name of a field from the properties list. * \param i The index of the row in the properties list. * \param name (out) The name of the field. * \return false if \a i does not corresponds to a field line (ie. this is a * prefix). */ bool bf::item_field_edit::get_field_name( unsigned int i, std::string& name ) const { bool result = false; name = wx_to_std_string(GetItemText(i)); if ( GetItemBackgroundColour(i) != s_field_prefix_colour ) { result = true; std::string field_prefix; while ( (i!=0) && field_prefix.empty() ) { --i; if ( GetItemBackgroundColour(i) == s_field_prefix_colour ) field_prefix = wx_to_std_string(GetItemText(i)); } if ( !field_prefix.empty() && (field_prefix != s_no_prefix) ) name = field_prefix + '.' + name; } #ifndef NDEBUG bool check_all_items_have_field(true); for ( item_iterator it=begin(); check_all_items_have_field && (it!=end()); ++it ) check_all_items_have_field = it->get_class().has_field(name); CLAW_POSTCOND( !result || check_all_items_have_field ); #endif return result; } // item_field_edit::get_field_name() /*----------------------------------------------------------------------------*/ /** * \brief Create and show the edit frame for a field. * \param name The name of the field. */ void bf::item_field_edit::create_field_editor( const std::string& name ) { const type_field& f = get_common_field(name); m_last_edited_field = name; switch ( f.get_field_type() ) { case type_field::integer_field_type: show_simple_property_dialog(f, _("Integer")); break; case type_field::u_integer_field_type: show_simple_property_dialog(f, _("Unsigned integer")); break; case type_field::real_field_type: show_simple_property_dialog(f, _("Real number")); break; case type_field::boolean_field_type: if ( !f.is_list() ) toggle_boolean_field_value(f); else show_property_dialog(f, _("Boolean value")); break; case type_field::string_field_type: show_string_property_dialog(f); break; case type_field::sprite_field_type: show_property_dialog(f, _("Sprite")); break; case type_field::animation_field_type: show_property_dialog(f, _("Animation")); break; case type_field::item_reference_field_type: show_item_reference_property_dialog(f); break; case type_field::font_field_type: show_property_dialog(f, _("Font")); break; case type_field::sample_field_type: show_property_dialog(f, _("Sound sample")); break; case type_field::color_field_type: show_property_dialog(f, _("Color")); break; case type_field::easing_field_type: show_property_dialog(f, _("Easing function")); break; } } // item_field_edit::create_field_editor() /*----------------------------------------------------------------------------*/ /** * \brief Sets the workspace environment. * \param env The environment to use. */ void bf::item_field_edit::set_workspace_environment ( workspace_environment* env ) { m_workspace = env; } // item_field_edit::set_workspace_environment() /*----------------------------------------------------------------------------*/ /** * \brief Enumerate all the properties of the current item. */ void bf::item_field_edit::enumerate_properties() { if (empty()) return; std::list item_classes = get_common_classes(); std::set fields; std::set removed; for ( ; !item_classes.empty(); item_classes.pop_front() ) { const item_class* c=item_classes.front(); for ( item_class::field_iterator it=c->field_begin(); it!=c->field_end(); ++it ) { const std::string field_name( it->get_name() ); if ( c->is_removed_field(field_name) ) { fields.erase(field_name); removed.insert(field_name); } else if ( removed.find(field_name) == removed.end() ) fields.insert(field_name); } } show_fields( std::list(fields.begin(), fields.end()) ); } // item_field_edit::enumerate_properties() /*----------------------------------------------------------------------------*/ /** * \brief Get the classes present in the hierarchy of all edited items. */ std::list bf::item_field_edit::get_common_classes() const { if ( empty() ) return std::list(); typedef std::list class_list; item_iterator it=begin(); class_list item_classes; it->get_class().find_hierarchy( item_classes ); item_classes.sort(); item_classes.unique(); for ( ++it; it!=end(); ++it ) { class_list candidates; it->get_class().find_hierarchy(candidates); candidates.sort(); candidates.unique(); class_list old_classes; item_classes.swap(old_classes); std::set_intersection ( old_classes.begin(), old_classes.end(), candidates.begin(), candidates.end(), std::back_inserter(item_classes) ); } return item_classes; } // item_field_edit::get_common_classes() /*----------------------------------------------------------------------------*/ /** * \brief Get the fields of a given class. * \param fields (out) The fields of \a classname are pushed back to this table. * \param item The class for which we want the fields. */ void bf::item_field_edit::get_fields_of ( std::vector& fields, const item_class& item ) const { item_class::field_iterator it; for ( it=item.field_begin(); it!=item.field_end(); ++it ) fields.push_back(it->get_name()); } // item_field_edit::get_fields_of() /*----------------------------------------------------------------------------*/ /** * \brief Add the fields in the view of the properties. * \param fields The names of the fields to add. */ void bf::item_field_edit::show_fields( const std::list& fields ) { wxString prefix; wxString last_prefix; std::size_t index = 0; std::list::const_iterator it; int last_edited_index(wxNOT_FOUND); for ( it=fields.begin(); it!=fields.end(); ++it ) { if ( *it == m_last_edited_field ) last_edited_index = index; wxString f(std_to_wx_string(*it)); prefix = f.BeforeFirst(wxT('.')); if (prefix == f) prefix = std_to_wx_string(s_no_prefix); else f = f.AfterFirst(wxT('.')); if (prefix != last_prefix) { wxFont font( GetFont() ); if (m_hidden.find(wx_to_std_string(prefix)) != m_hidden.end()) font.SetStyle( wxFONTSTYLE_ITALIC ); wxListItem head; head.SetFont( font ); head.SetText(prefix); head.SetBackgroundColour(s_field_prefix_colour); head.SetId(index); ++index; InsertItem(head); last_prefix = prefix; } if ( m_hidden.find(wx_to_std_string(prefix)) == m_hidden.end() ) { wxListItem prop; prop.SetText(f); prop.SetId(index); ++index; InsertItem(prop); } } SetColumnWidth(0, wxLIST_AUTOSIZE); adjust_last_column_size(); if (last_edited_index != wxNOT_FOUND ) { Select(last_edited_index); EnsureVisible(last_edited_index); } } // item_field_edit::show_fields() /*----------------------------------------------------------------------------*/ /** * \brief Get the value of all fields of the current item. */ void bf::item_field_edit::update_values() { for ( long i=0; i!=GetItemCount(); ++i ) update_value(i); } // item_field_edit::update_values() /*----------------------------------------------------------------------------*/ /** * \brief Update the displayed value of a field. * \param index The index of the field in the view. */ void bf::item_field_edit::update_value( long index ) { std::string name; if( get_field_name(index, name) ) { wxListItem prop; prop.SetId(index); GetItem(prop); const type_field& f = get_common_field(name); const bool has_val = group_has_value(f); prop.SetText( get_common_value_as_text(f) ); prop.SetColumn(1); SetItem(prop); if ( f.get_required() ) set_required_color(index, has_val); else set_default_value_color(index, has_val); } } // item_field_edit::update_value() /*----------------------------------------------------------------------------*/ /** * \brief Set the correct font for a required field. * \param i The line to change. * \param b Tell if the field has a value or not. */ void bf::item_field_edit::set_required_color( unsigned int i, bool b ) { wxListItem prop; prop.SetId(i); GetItem(prop); wxFont font( GetFont() ); font.SetWeight( wxFONTWEIGHT_BOLD ); prop.SetFont( font ); if (b) prop.SetTextColour( *wxBLACK ); else prop.SetTextColour( *wxRED ); SetItem(prop); } // item_field_edit::set_required_color() /*----------------------------------------------------------------------------*/ /** * \brief Set the correct font for a non valued field. * \param i The line to change. * \param b Tell if the field has a value or not. */ void bf::item_field_edit::set_default_value_color( unsigned int i, bool b ) { wxListItem prop; prop.SetId(i); GetItem(prop); wxFont font( GetFont() ); if (b) { font.SetStyle( wxFONTSTYLE_NORMAL ); prop.SetTextColour( *wxBLACK ); } else { font.SetStyle( wxFONTSTYLE_ITALIC ); prop.SetTextColour( wxColour(wxT("DARK GREY")) ); } prop.SetFont( font ); SetItem(prop); } // item_field_edit::set_default_value_color() /*----------------------------------------------------------------------------*/ /** * \brief Convert the value of a field in a string. * \param item The item in which the value is taken. * \param f The field for which we want the value. */ wxString bf::item_field_edit::convert_value_to_text ( const item_instance& item, const type_field& f ) const { if ( !item.has_value(f) ) return std_to_wx_string( item.get_class().get_default_value(f.get_name()) ); else { call_by_field_type call; return call(f, f.get_name(), item); } } // item_field_edit::convert_value_to_text() /*----------------------------------------------------------------------------*/ /** * \brief Ajust the size of the last column so there is no empty space on the * right. */ void bf::item_field_edit::adjust_last_column_size() { SetColumnWidth( 1, GetSize().x - GetColumnWidth(0) ); } // item_field_edit::adjust_last_column_size() /*----------------------------------------------------------------------------*/ /** * \brief Remove the value in the selected field. */ void bf::item_field_edit::delete_selected_field() { long index = GetFocusedItem(); if ( index != wxNOT_FOUND ) { std::string name; if ( get_field_name(index, name) ) { m_last_edited_field = name; delete_item_field_event event ( name, delete_item_field_event::delete_field_event_type, GetId() ); event.SetEventObject(this); if ( ProcessEvent(event) ) update_value(index); } } } // item_field_edit::delete_selected_field() /*----------------------------------------------------------------------------*/ /** * \brief Show the adequate dialog for editing a given string field. * \param f The type of the field we are editing. */ void bf::item_field_edit::show_string_property_dialog( const type_field& f ) { switch ( f.get_range_type() ) { case type_field::field_range_free: show_property_dialog< free_edit >(f, _("string")); break; case type_field::field_range_set: show_property_dialog< set_edit >(f, _("string")); break; default: { CLAW_ASSERT(false, "range type is not valid."); } } } // item_field_edit::show_string_property_dialog() /*----------------------------------------------------------------------------*/ /** * \brief Show the adequate dialog for editing a given item reference field. * \param f The type of the field we are editing. */ void bf::item_field_edit::show_item_reference_property_dialog( const type_field& f ) { wxArrayString values; request_item_id_event event ( f, values, request_item_id_event::request_item_id_event_type, GetId() ); event.SetEventObject(this); if ( ProcessEvent(event) ) { values.Sort(); if ( f.is_list() ) edit_field< item_reference_edit, std::list > (f, _("Item"), values); else edit_field (f, _("List of items"), values); } } // item_field_edit::show_item_reference_property_dialog() /*----------------------------------------------------------------------------*/ /** * \brief Toggle the value of a boolean field. * \param f The type of the field we are editing. */ void bf::item_field_edit::toggle_boolean_field_value( const type_field& f ) { CLAW_PRECOND(!f.is_list()); CLAW_PRECOND(f.get_field_type() == type_field::boolean_field_type); bool_type v; if ( !get_common_value(f, v) ) v.set_value(true); else v.set_value(!v.get_value()); set_field_value_event event ( f.get_name(), v, set_field_value_event::set_field_value_event_type, GetId() ); event.SetEventObject(this); if( ProcessEvent(event) ) update_values(); } // item_field_edit::toggle_boolean_field_value() /*----------------------------------------------------------------------------*/ /** * \brief Fill the list of fields. */ void bf::item_field_edit::fill_fields() { DeleteAllItems(); if ( empty() ) return; enumerate_properties(); update_values(); if ( m_last_selected_field != wxNOT_FOUND ) if ( m_last_selected_field < GetItemCount() ) { Select(m_last_selected_field); EnsureVisible(m_last_selected_field); } } // item_field_edit::fill_fields() /*----------------------------------------------------------------------------*/ /** * \brief Tell if all items in the edited group has a value for a given field. * \param f The field to test. */ bool bf::item_field_edit::group_has_value( const type_field& f ) const { bool result( !empty() ); for (item_iterator it=begin(); result && (it!=end()); ++it) result = it->has_value(f); return result; } // item_field_edit::group_has_value() /*----------------------------------------------------------------------------*/ /** * \brief Get the value common to all edited items for a given field, or an * empty string if two items have a different value for this field. * \param f The field to test. */ wxString bf::item_field_edit::get_common_value_as_text( const type_field& f ) const { CLAW_PRECOND(!empty()); item_iterator it=begin(); wxString result( convert_value_to_text(*it, f) ); for ( ++it; !result.empty() && (it!=end()); ++it ) if ( convert_value_to_text(*it, f) != result ) result.clear(); return result; } // item_field_edit::get_common_value_as_text() /*----------------------------------------------------------------------------*/ /** * \brief Get the common value, if any, of a field of all items in the group. * \param f The field for which we want the value. * \param val (out) The value. * \return true if all items has the same value for the given field. */ template bool bf::item_field_edit::get_common_value( const type_field& f, Type& val ) const { CLAW_PRECOND( !empty() ); wxString text_result; // The initialization turns off the following warning: // "'result' may be used uninitialized in this function" // It occurs on the "for" loop below but should not. Actually, result is // initialized in the first "if/else" below. Type result( default_value::get() ); item_iterator it=begin(); if ( it->has_value(f) ) { it->get_value(f.get_name(), result); text_result = human_readable::convert(result); } else { const std::string text(it->get_class().get_default_value(f.get_name())); text_result = std_to_wx_string( text ); std::istringstream iss(text); stream_conv::read(iss, result); } for (++it; it!=end(); ++it) if ( it->has_value(f) ) { Type v; it->get_value( f.get_name(), v ); if ( (v != result) && (human_readable::convert(v) != text_result) ) return false; } else { const wxString as_text = std_to_wx_string( it->get_class().get_default_value(f.get_name()) ); if (as_text != text_result) return false; } val = result; return true; } // item_field_edit::get_common_value() /*----------------------------------------------------------------------------*/ /** * \brief Show the adequate dialog for editing a given field. * \param f The type of the field we are editing. * \param type The name of the type of the field. */ template void bf::item_field_edit::show_simple_property_dialog ( const type_field& f, const wxString& type ) { switch ( f.get_range_type() ) { case type_field::field_range_free: show_property_dialog< free_edit >(f, type); break; case type_field::field_range_set: show_property_dialog< set_edit >(f, type); break; case type_field::field_range_interval: show_property_dialog< interval_edit >(f, type); break; default: { CLAW_ASSERT(false, "range type is not valid."); } } } // item_field_edit::show_simple_property_dialog() /*----------------------------------------------------------------------------*/ /** * \brief Show the adequate dialog for editing a given field. * \param f The type of the field we are editing. * \param type The name of the type of the field. */ template void bf::item_field_edit::show_property_dialog ( const type_field& f, const wxString& type ) { typedef typename Control::value_type value_type; if ( f.is_list() ) field_editor< Control, std::list, is_visual_type::value >::open(*this, f, type); else field_editor< Control, value_type, is_visual_type::value >::open(*this, f, type); } // item_field_edit::show_property_dialog() /*----------------------------------------------------------------------------*/ /** * \brief Create and show the dialog for editing the field and update the item. * \param f The field to edit. * \param type The name of the type of the field, as displayed in the title of * the editor. * \param values The valid item identifiers for this field. */ template void bf::item_field_edit::edit_field ( const type_field& f, const wxString& type, const wxArrayString& values ) { typedef value_editor_dialog dialog_type; Type v; if ( !get_common_value(f, v) ) v = default_value::get(); dialog_type* const dlg = new dialog_type( *this, type, values, v ); show_dialog(f.get_name(), *dlg); dlg->Destroy(); } // item_field_edit::edit_field() /*----------------------------------------------------------------------------*/ /** * \brief Show a created dialog for editing the field and update the item. * \param field_name The name of the edited field to edit. * \param dlg The dialog used to edit the field. */ template void bf::item_field_edit::show_dialog ( const std::string& field_name, DialogType& dlg ) { if ( dlg.ShowModal() == wxID_OK ) { typedef typename DialogType::value_type value_type; set_field_value_event event ( field_name, dlg.get_value(), set_field_value_event::set_field_value_event_type, GetId() ); event.SetEventObject(this); if( ProcessEvent(event) ) update_values(); } } // item_field_edit::show_dialog() /*----------------------------------------------------------------------------*/ /** * \brief Event sent to a resized window. * \param event The event. */ void bf::item_field_edit::on_size( wxSizeEvent& event ) { adjust_last_column_size(); event.Skip(); } // item_field_edit::on_size() /*----------------------------------------------------------------------------*/ /** * \brief Event sent when the user starts to resize a column. * \param event The event. */ void bf::item_field_edit::on_column_begin_drag( wxListEvent& event ) { if ( event.GetColumn() + 1 == GetColumnCount() ) event.Veto(); else event.Skip(); } // item_field_edit::on_column_begin_drag() /*----------------------------------------------------------------------------*/ /** * \brief Event sent when the user ends resizing a column. * \param event The event. */ void bf::item_field_edit::on_column_end_drag( wxListEvent& WXUNUSED(event) ) { adjust_last_column_size(); } // item_field_edit::on_column_begin_drag() /*----------------------------------------------------------------------------*/ /** * \brief Event sent when the user activates an item. * \param event The event. */ void bf::item_field_edit::on_item_activated( wxListEvent& event ) { std::string name; if ( get_field_name(event.GetIndex(), name) ) create_field_editor( name ); else { if ( m_hidden.find(name) == m_hidden.end() ) m_hidden.insert(name); else m_hidden.erase(name); DeleteAllItems(); enumerate_properties(); update_values(); if ( event.GetIndex() < GetItemCount() ) Select( event.GetIndex() ); } } // item_field_edit::on_item_activated() /*----------------------------------------------------------------------------*/ /** * \brief Event sent when the user presses a key. * \param event The keyboard event that occured. */ void bf::item_field_edit::on_key_up( wxKeyEvent& event ) { switch( event.GetKeyCode() ) { case WXK_DELETE: delete_selected_field(); break; default: event.Skip(); } } // item_field_edit::on_key_up() plee-the-bear-20251226/bear-factory/bear-editor/src/bf/code/item_instance.cpp000066400000000000000000000775631512343254000266030ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bf::item_instance class. * \author Julien Jorge */ #include "bf/item_instance.hpp" #include "bf/call_by_field_type.hpp" #include "bf/compilation_context.hpp" #include "bf/item_check_result.hpp" #include "bf/item_class.hpp" #include #include #define SPECIALISE_FIELD_TYPE( type, name ) \ template<> \ struct item_instance::field_map_by_type \ { \ static std::map& get( item_instance& item ) \ { \ return item.m_ ## name; \ } \ \ static const std::map& \ get( const item_instance& item ) \ { \ return item.m_ ## name; \ } \ }; \ \ template<> \ struct item_instance::field_map_by_type< std::list > \ { \ static std::map< std::string, std::list >& \ get( item_instance& item ) \ { \ return item.m_ ## name ## _list; \ } \ \ static const std::map< std::string, std::list >& \ get( const item_instance& item ) \ { \ return item.m_ ## name ## _list; \ } \ } namespace bf { SPECIALISE_FIELD_TYPE( integer_type, int ); SPECIALISE_FIELD_TYPE( u_integer_type, u_int ); SPECIALISE_FIELD_TYPE( real_type, real ); SPECIALISE_FIELD_TYPE( bool_type, bool ); SPECIALISE_FIELD_TYPE( string_type, string ); SPECIALISE_FIELD_TYPE( sprite, sprite ); SPECIALISE_FIELD_TYPE( any_animation, animation ); SPECIALISE_FIELD_TYPE( item_reference_type, item_reference ); SPECIALISE_FIELD_TYPE( font, font ); SPECIALISE_FIELD_TYPE( sample, sample ); SPECIALISE_FIELD_TYPE( color, color ); SPECIALISE_FIELD_TYPE( easing_type, easing ); } // namespace bf /*----------------------------------------------------------------------------*/ /** * \brief Tell if a value has been given to a field. * \param item The item instance in which the field is searched. * \param field_name The name of the searched field. */ template bool bf::item_instance::field_has_value::operator() ( const item_instance& item, const std::string& field_name ) const { return field_map_by_type::get(item).find(field_name) != field_map_by_type::get(item).end(); } // item_instance::field_has_value::operator()() /*----------------------------------------------------------------------------*/ /** * \brief Erase the value of a field. * \param item The item instance in which the field is erased. * \param field_name The name of the erased field. */ template void bf::item_instance::erase_field_value::operator() ( item_instance& item, const std::string& field_name ) const { field_map_by_type::get(item).erase(field_name); } // item_instance::erase_field_value::operator()() /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param c The class I am an instance of. */ bf::item_instance::item_instance( item_class const* c ) : m_class( c ), m_fixed( m_class->get_fixable() ), m_rendering_parameters(*this) { m_rendering_parameters.init(); } // item_instance::item_instance() /*----------------------------------------------------------------------------*/ /** * \brief Copy constructor. * \param that The instance to copy from. */ bf::item_instance::item_instance( const item_instance& that ) : m_class(that.m_class), m_fixed( that.get_fixed() ), m_id(that.get_id()), m_rendering_parameters(*this) { assign(that); } // item_instance::item_instance() /*----------------------------------------------------------------------------*/ /** * \brief Assignment. * \param that The instance to copy from. */ bf::item_instance& bf::item_instance::operator=( const item_instance& that ) { if ( this != &that ) assign(that); return *this; } // item_instance::operator=() /*----------------------------------------------------------------------------*/ /** * \brief Copy the values of the fields of an other instance. * \param that The instance to copy from. */ void bf::item_instance::copy_fields_from( const item_instance& that ) { copy_fields_from_no_invalid_values( that ); remove_invalid_values(); m_rendering_parameters.reset(); } // item_instance::() /*----------------------------------------------------------------------------*/ /** * \brief Get the rendering parameters of the item. */ const bf::item_rendering_parameters& bf::item_instance::get_rendering_parameters() const { return m_rendering_parameters; } // item_instance::get_rendering_parameters() /*----------------------------------------------------------------------------*/ /** * \brief Get the rendering parameters of the item. */ bf::item_rendering_parameters& bf::item_instance::get_rendering_parameters() { return m_rendering_parameters; } // item_instance::get_rendering_parameters() /*----------------------------------------------------------------------------*/ /** * \brief Get the class I am an instance of. */ const bf::item_class& bf::item_instance::get_class() const { return *m_class; } // item_instance::get_class() /*----------------------------------------------------------------------------*/ /** * \brief Get the pointer to the class I am an instance of. */ bf::item_class const* bf::item_instance::get_class_ptr() const { return m_class; } // item_instance::get_class_ptr() /*----------------------------------------------------------------------------*/ /** * \brief Set the name of the class of the item. * \param c The new class of the item. * \pre c!=NULL */ void bf::item_instance::set_class( item_class const* c ) { CLAW_PRECOND( c!=NULL ); m_class = c; m_fixed = m_class->get_fixable() && m_fixed; remove_invalid_values(); m_rendering_parameters.reset(); } // item_instance::set_class() /*----------------------------------------------------------------------------*/ /** * \brief Get the the identifier of this item. */ const std::string& bf::item_instance::get_id() const { return m_id; } // item_instance::get_id() /*----------------------------------------------------------------------------*/ /** * \brief Set the the identifier of this item. * \param id The new identifier of this item. */ void bf::item_instance::set_id( const std::string& id ) { m_id = id; } // item_instance::set_id() /*----------------------------------------------------------------------------*/ /** * \brief Rename the identifiers in fields of type item_reference. * \param map_id The map of idendifier's modification. */ void bf::item_instance::rename_item_reference_fields ( const std::map& map_id) { std::list fields; std::list::const_iterator it; m_class->get_field_names_in_hierarchy(fields); for ( it=fields.begin(); it!=fields.end(); ++it ) { const type_field& f = m_class->get_field(*it); if( f.get_field_type() == type_field::item_reference_field_type ) { if( has_value(f) ) { if( f.is_list() ) { std::list::iterator bit = m_item_reference_list.find(f.get_name())->second.begin(); const std::list::iterator eit = m_item_reference_list.find(f.get_name())->second.end(); for ( ; bit!=eit; ++bit) if ( map_id.find(bit->get_value()) != map_id.end() ) bit->set_value(map_id.find(bit->get_value())->second); } else { std::string id; id = m_item_reference.find(f.get_name())->second.get_value(); if ( map_id.find(id) != map_id.end() ) m_item_reference.find (f.get_name())->second.set_value(map_id.find(id)->second); } } } } } // item_instance::rename_item_reference_fields() /*----------------------------------------------------------------------------*/ /** * \brief Tell if a field has a value. * \param field_name The name of the field to check. */ bool bf::item_instance::has_value( const std::string& field_name ) const { return has_value( get_class().get_field(field_name) ); } // item_instance::has_value() /*----------------------------------------------------------------------------*/ /** * \brief Tell if a field has a value. * \param f The field to check. */ bool bf::item_instance::has_value( const type_field& f ) const { call_by_field_type call; return call(f, *this, f.get_name()); } // item_instance::has_value() /*----------------------------------------------------------------------------*/ /** * \brief Delete the value of a field. * \param f The field to delete. */ void bf::item_instance::delete_value( const type_field& f ) { call_by_field_type call; call(f, *this, f.get_name()); m_rendering_parameters.field_changed( f.get_name() ); } // item_instance::delete_value() /*----------------------------------------------------------------------------*/ /** * \brief Tell if this item instance has a reference to a given other instance. * \param id The identifier of the other instance. */ bool bf::item_instance::has_a_reference_to( const std::string& id ) const { item_reference_type_map::const_iterator it; for ( it=m_item_reference.begin(); it!=m_item_reference.end(); ++it ) if ( it->second.get_value() == id ) return true; item_reference_type_list_map::const_iterator it_list; for ( it_list=m_item_reference_list.begin(); it_list!=m_item_reference_list.end(); ++it_list ) { std::list::const_iterator iti; for ( iti=it_list->second.begin(); iti!=it_list->second.end(); ++iti ) if ( iti->get_value() == id ) return true; } return false; } // item_instance::has_a_reference_to() /*----------------------------------------------------------------------------*/ /** * \brief Get names of reference item fields. * \param item_reference_fields List of item_reference fields (out). * \param item_reference_list_fields List of item_reference list fields (out). */ void bf::item_instance::get_item_reference_field_names ( std::set & item_reference_fields, std::set & item_reference_list_fields ) const { std::list all_fields; get_class().get_field_names_in_hierarchy( all_fields ); std::list::const_iterator it; for ( it = all_fields.begin(); it != all_fields.end(); ++it ) { type_field field = get_class().get_field(*it); if ( field.get_field_type() == type_field::item_reference_field_type ) { if ( field.is_list() ) item_reference_list_fields.insert( field.get_name() ); else item_reference_fields.insert( field.get_name() ); } } } // item_instance::get_item_reference_field_names() /*----------------------------------------------------------------------------*/ /** * \brief Tell if the item is fixed. */ bool bf::item_instance::get_fixed() const { return m_fixed && m_class->get_fixable(); } // item_instance::get_fixed() /*----------------------------------------------------------------------------*/ /** * \brief Tell that this item is fixed. * \param b Fixed or not ? */ void bf::item_instance::set_fixed( bool b ) { m_fixed = b; } // item_instance::set_fixed() /*----------------------------------------------------------------------------*/ /** * \brief Compile the fields of the item. * \param f The file in which we compile. * \param c The context in which the compilation is done. */ void bf::item_instance::compile ( compiled_file& f, compilation_context& c ) const { f << get_fixed(); std::list fields; for( sort_fields(fields); !fields.empty(); fields.pop_front() ) compile_field( f, m_class->get_field(fields.front()), c ); } // item_instance::compile() /*----------------------------------------------------------------------------*/ /** * \brief Test if the item is well defined. * \param result (out) The result of the check. * \param map_id The set of all item identifiers. */ void bf::item_instance::check ( item_check_result& result, const std::set& map_id ) const { check_required_fields( result ); check_mass_for_fixed_item( result ); check_id_required(result, map_id); } // item_instance::check() /*----------------------------------------------------------------------------*/ /** * \brief Test if the fixed item has an infinite mass. * \param result (out) The result of the check. */ void bf::item_instance::check_mass_for_fixed_item ( item_check_result& result ) const { if ( m_fixed ) { const type_field field("base_item.mass", type_field::real_field_type); if ( has_value(field) ) result.add( check_error("Fixed item must have an infinite mass.") ); } } // item_instance::check_mass_for_fixed_item() /*----------------------------------------------------------------------------*/ /** * \brief Test if the referenced items exist. * \param result (out) The result of the check. * \param map_id The set of all item identifiers. */ void bf::item_instance::check_id_required ( item_check_result& result, const std::set& map_id ) const { std::list fields; std::list::const_iterator it; m_class->get_field_names_in_hierarchy(fields); for ( it=fields.begin(); it!=fields.end(); ++it ) { const type_field& f = m_class->get_field(*it); if( (f.get_field_type() == type_field::item_reference_field_type) && has_value(f) ) { if( f.is_list() ) { std::list::const_iterator bit = m_item_reference_list.find(f.get_name())->second.begin(); const std::list::const_iterator eit = m_item_reference_list.find(f.get_name())->second.end(); for ( ; bit!=eit; ++bit) if ( map_id.find(bit->get_value()) == map_id.end() ) result.add ( check_error ( bit->get_value(), "There is no item with such identifier." ) ); } else { std::string id = m_item_reference.find(f.get_name())->second.get_value(); if ( map_id.find(id) == map_id.end() ) result.add ( check_error ( id, "There is no item with such identifier." ) ); } } } } // item_instance::check_id_required() /*----------------------------------------------------------------------------*/ /** * \brief Test if all required fields are set. * \param result (out) The result of the check. */ void bf::item_instance::check_required_fields( item_check_result& result ) const { std::list fields; std::list::const_iterator it; m_class->get_field_names_in_hierarchy(fields); for ( it=fields.begin(); it!=fields.end(); ++it ) { const type_field& f = m_class->get_field(*it); if( f.get_required() && !has_value(f) ) result.add( check_error( *it, "Field value is required." ) ); } } // item_instance::check_required_fields() /*----------------------------------------------------------------------------*/ /** * \brief Get the name of the fields, ordered so that fields depending on other * fields are after them in the list. * \param fields (out) The name of the fields. */ void bf::item_instance::sort_fields( std::list& fields ) const { std::set all_fields; copy_field_names( m_int, all_fields ); copy_field_names( m_u_int, all_fields ); copy_field_names( m_real, all_fields ); copy_field_names( m_bool, all_fields ); copy_field_names( m_string, all_fields ); copy_field_names( m_sprite, all_fields ); copy_field_names( m_animation, all_fields ); copy_field_names( m_item_reference, all_fields ); copy_field_names( m_font, all_fields ); copy_field_names( m_sample, all_fields ); copy_field_names( m_color, all_fields ); copy_field_names( m_easing, all_fields ); copy_field_names( m_int_list, all_fields ); copy_field_names( m_u_int_list, all_fields ); copy_field_names( m_real_list, all_fields ); copy_field_names( m_bool_list, all_fields ); copy_field_names( m_string_list, all_fields ); copy_field_names( m_sprite_list, all_fields ); copy_field_names( m_animation_list, all_fields ); copy_field_names( m_item_reference_list, all_fields ); copy_field_names( m_font_list, all_fields ); copy_field_names( m_sample_list, all_fields ); copy_field_names( m_color_list, all_fields ); copy_field_names( m_easing_list, all_fields ); while ( !all_fields.empty() ) { const std::string field_name( *all_fields.begin() ); insert_field( field_name, fields, all_fields ); } } // item_instance::sort_fields() /*----------------------------------------------------------------------------*/ /** * \brief Get the name of the fields, ordered so that fields depending on other * fields are after them in the list. * \param field_name The name of the field to insert. * \param fields (out) The name of the fields. * \param all_fields (in/out) All the remaining fields to insert. */ void bf::item_instance::insert_field ( const std::string& field_name, std::list& fields, std::set& all_fields ) const { if ( all_fields.find(field_name) != all_fields.end() ) { all_fields.erase(field_name); std::set::const_iterator it; for ( it=m_class->get_field(field_name).get_preceding().begin(); it!=m_class->get_field(field_name).get_preceding().end(); ++it ) insert_field(*it, fields, all_fields); fields.push_back( field_name ); } } // item_instance::insert_field() /*----------------------------------------------------------------------------*/ /** * \brief Compile a field. * \param f The file in which we compile. * \param field The field to save. * \param c The context in which the compilation is done. */ void bf::item_instance::compile_field ( compiled_file& f, const type_field& field, compilation_context& c ) const { CLAW_PRECOND( has_value(field) ); if ( field.is_list() ) f << bear::level_code_value::field_list; f << get_code_value(field) << field.get_name(); if ( field.is_list() ) compile_field_list(f, field, c); else compile_field_single(f, field, c); } // item_instance::compile_field() /*----------------------------------------------------------------------------*/ /** * \brief Compile a field made of a single values. * \param f The file in which we compile. * \param field The field to save. * \param c The context in which the compilation is done. */ void bf::item_instance::compile_field_single ( compiled_file& f, const type_field& field, compilation_context& c ) const { CLAW_PRECOND( has_value(field) ); const std::string& field_name = field.get_name(); switch ( field.get_field_type() ) { case type_field::integer_field_type: m_int.find(field_name)->second.compile(f); break; case type_field::u_integer_field_type: m_u_int.find(field_name)->second.compile(f); break; case type_field::real_field_type: m_real.find(field_name)->second.compile(f); break; case type_field::boolean_field_type: m_bool.find(field_name)->second.compile(f); break; case type_field::string_field_type: m_string.find(field_name)->second.compile(f); break; case type_field::sprite_field_type: m_sprite.find(field_name)->second.compile(f, c); break; case type_field::animation_field_type: m_animation.find(field_name)->second.compile(f, c); break; case type_field::item_reference_field_type: f << c.get_compiled_identifier ( m_item_reference.find(field_name)->second.get_value() ); break; case type_field::font_field_type: m_font.find(field_name)->second.compile(f,c); break; case type_field::sample_field_type: m_sample.find(field_name)->second.compile(f,c); break; case type_field::color_field_type: m_color.find(field_name)->second.compile(f); break; case type_field::easing_field_type: m_easing.find(field_name)->second.compile(f); break; } } // item_instance::compile_field_single() /*----------------------------------------------------------------------------*/ /** * \brief Compile a field made of a list of values. * \param f The file in which we compile. * \param field The field to save. * \param c The context in which the compilation is done. */ void bf::item_instance::compile_field_list ( compiled_file& f, const type_field& field, compilation_context& c ) const { CLAW_PRECOND( has_value(field) ); const std::string& field_name = field.get_name(); switch ( field.get_field_type() ) { case type_field::integer_field_type: compile_list( f, m_int_list.find(field_name)->second ); break; case type_field::u_integer_field_type: compile_list( f, m_u_int_list.find(field_name)->second ); break; case type_field::real_field_type: compile_list( f, m_real_list.find(field_name)->second ); break; case type_field::boolean_field_type: compile_list( f, m_bool_list.find(field_name)->second ); break; case type_field::string_field_type: compile_list( f, m_string_list.find(field_name)->second ); break; case type_field::sprite_field_type: compile_list( f, c, m_sprite_list.find(field_name)->second ); break; case type_field::animation_field_type: compile_list( f, c, m_animation_list.find(field_name)->second ); break; case type_field::item_reference_field_type: { f << m_item_reference_list.find(field_name)->second.size(); std::list::const_iterator it = m_item_reference_list.find(field_name)->second.begin(); const std::list::const_iterator eit = m_item_reference_list.find(field_name)->second.end(); for ( ; it!=eit; ++it) f << c.get_compiled_identifier(it->get_value()); break; } case type_field::font_field_type: compile_list( f, c, m_font_list.find(field_name)->second ); break; case type_field::sample_field_type: compile_list( f, c, m_sample_list.find(field_name)->second ); break; case type_field::color_field_type: compile_list( f, m_color_list.find(field_name)->second ); break; case type_field::easing_field_type: compile_list( f, m_easing_list.find(field_name)->second ); break; } } // item_instance::compile_field_list() /*----------------------------------------------------------------------------*/ /** * \brief Get the compiler code value for type of field. * \param field The field forwhich we want the value. */ bear::level_code_value::value_type bf::item_instance::get_code_value( const type_field& field ) const { bear::level_code_value::value_type result; switch ( field.get_field_type() ) { case type_field::integer_field_type: result = bear::level_code_value::field_int; break; case type_field::u_integer_field_type: result = bear::level_code_value::field_u_int; break; case type_field::real_field_type: result = bear::level_code_value::field_real; break; case type_field::boolean_field_type: result = bear::level_code_value::field_bool; break; case type_field::string_field_type: result = bear::level_code_value::field_string; break; case type_field::sprite_field_type: result = bear::level_code_value::field_sprite; break; case type_field::animation_field_type: result = bear::level_code_value::field_animation; break; case type_field::item_reference_field_type: result = bear::level_code_value::field_item; break; case type_field::font_field_type: result = bear::level_code_value::field_font; break; case type_field::sample_field_type: result = bear::level_code_value::field_sample; break; case type_field::color_field_type: result = bear::level_code_value::field_color; break; case type_field::easing_field_type: result = bear::level_code_value::field_easing; break; default: { throw new claw::exception( "Invalid field type." ); } } return result; } // item_instance::get_code_value() /*----------------------------------------------------------------------------*/ /** * \brief Assign the value from an other item. * \param that The instance to copy from. */ void bf::item_instance::assign( const item_instance& that ) { m_class = that.m_class; m_fixed = that.get_fixed(); m_id = that.get_id(); copy_fields_from_no_invalid_values( that ); m_rendering_parameters.reset(); } // item_instance::assign() /*----------------------------------------------------------------------------*/ /** * \brief Copy the values of the fields of an other instance without removing * the invalid values. * \param that The instance to copy the fields from. */ void bf::item_instance::copy_fields_from_no_invalid_values ( const item_instance& that ) { m_int = that.m_int; m_int_list = that.m_int_list; m_u_int = that.m_u_int; m_u_int_list = that.m_u_int_list; m_real = that.m_real; m_real_list = that.m_real_list; m_bool = that.m_bool; m_bool_list = that.m_bool_list; m_string = that.m_string; m_string_list = that.m_string_list; m_sprite = that.m_sprite; m_sprite_list = that.m_sprite_list; m_animation = that.m_animation; m_animation_list = that.m_animation_list; m_item_reference = that.m_item_reference; m_item_reference_list = that.m_item_reference_list; m_font = that.m_font; m_font_list = that.m_font_list; m_sample = that.m_sample; m_sample_list = that.m_sample_list; m_color = that.m_color; m_color_list = that.m_color_list; m_easing = that.m_easing; m_easing_list = that.m_easing_list; } // item_instance::copy_fields_from_no_invalid_values() /*----------------------------------------------------------------------------*/ /** * \brief Remove the values set for some fields not present in the item class. */ void bf::item_instance::remove_invalid_values() { remove_invalid_values( m_int, m_int_list, type_field::integer_field_type ); remove_invalid_values ( m_u_int, m_u_int_list, type_field::u_integer_field_type ); remove_invalid_values( m_real, m_real_list, type_field::real_field_type ); remove_invalid_values( m_bool, m_bool_list, type_field::boolean_field_type ); remove_invalid_values ( m_string, m_string_list, type_field::string_field_type ); remove_invalid_values ( m_sprite, m_sprite_list, type_field::sprite_field_type ); remove_invalid_values ( m_animation, m_animation_list, type_field::animation_field_type ); remove_invalid_values ( m_item_reference, m_item_reference_list, type_field::item_reference_field_type ); remove_invalid_values ( m_font, m_font_list, type_field::font_field_type ); remove_invalid_values ( m_sample, m_sample_list, type_field::sample_field_type ); remove_invalid_values ( m_color, m_color_list, type_field::color_field_type ); remove_invalid_values ( m_easing, m_easing_list, type_field::easing_field_type ); } // item_instance::set_class() /*----------------------------------------------------------------------------*/ /** * \brief Extract the names of defined fields. * \param m The map in which we take the fields names. * \param fields The set in which the fields are saved. */ template void bf::item_instance::copy_field_names ( const MapType& m, std::set& fields ) const { typename MapType::const_iterator it; for (it=m.begin(); it!=m.end(); ++it) fields.insert(it->first); } // item_instance::copy_field_names() /*----------------------------------------------------------------------------*/ /** * \brief Compile a list of values. * \param f The file in which we compile. * \param v The values to save. */ template void bf::item_instance::compile_list ( compiled_file& f, const std::list& v ) const { f << v.size(); typename std::list::const_iterator it = v.begin(); const typename std::list::const_iterator eit = v.end(); for ( ; it!=eit; ++it) it->compile(f); } // item_instance::compile_list() /*----------------------------------------------------------------------------*/ /** * \brief Compile a list of values requiring a compilation context. * \param f The file in which we compile. * \param v The values to save. * \param c The context in which the compilation is done. */ template void bf::item_instance::compile_list ( compiled_file& f, compilation_context& c, const std::list& v ) const { f << v.size(); typename std::list::const_iterator it = v.begin(); const typename std::list::const_iterator eit = v.end(); for ( ; it!=eit; ++it) it->compile(f, c); } // item_instance::compile_list() /*----------------------------------------------------------------------------*/ /** * \brief Remove the field values that are not available for the class of this * item. * \param m The map of values. * \param ml The map of list of values. * \param t The type of the fields explored. */ template void bf::item_instance::remove_invalid_values ( std::map& m, std::map< std::string, std::list >& ml, type_field::field_type t ) const { std::list to_remove; typename std::map::const_iterator it; for (it=m.begin(); it!=m.end(); ++it) if ( !m_class->has_field( it->first, t ) ) to_remove.push_front(it->first); else { const type_field& f = m_class->get_field(it->first); if ( f.is_list() ) to_remove.push_front(it->first); } for ( ; !to_remove.empty(); to_remove.pop_front() ) m.erase( to_remove.front() ); typename std::map< std::string, std::list >::const_iterator itl; for (itl=ml.begin(); itl!=ml.end(); ++itl) if ( !m_class->has_field( itl->first, t ) ) to_remove.push_front(itl->first); else { const type_field& f = m_class->get_field(itl->first); if ( !f.is_list() ) to_remove.push_front(itl->first); } for ( ; !to_remove.empty(); to_remove.pop_front() ) ml.erase( to_remove.front() ); } // item_instance::remove_invalid_values() plee-the-bear-20251226/bear-factory/bear-editor/src/bf/code/item_reference_edit.cpp000066400000000000000000000067761512343254000277400ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bf::item_reference_edit class. * \author Julien Jorge */ #include "bf/item_reference_edit.hpp" #include /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param parent The windows owning this one. * \param choices The valid choices of the value. * \param v The initial value. */ bf::item_reference_edit::item_reference_edit ( wxWindow& parent, const wxArrayString& choices, const value_type& v ) : simple_edit(v), wxComboBox( &parent, IDC_PATTERN_TEXT, wxEmptyString, wxDefaultPosition, wxDefaultSize, choices ), m_choices(choices) { value_updated(); } // item_reference_edit::item_reference_edit() /*----------------------------------------------------------------------------*/ /** * \brief Check if the displayed value is correct and, if it is, set the * value according to the display. */ bool bf::item_reference_edit::validate() { if ( m_choices.Index( this->GetValue() ) == wxNOT_FOUND ) return false; else return value_from_string( GetValue() ); } // item_reference_edit::validate() /*----------------------------------------------------------------------------*/ /** * \brief Method called when the value has been changed, to update the display. */ void bf::item_reference_edit::value_updated() { bool found = false; wxString val = value_to_string(); unsigned int i=0; while ( (i!=GetCount()) && !found ) if ( val == GetString(i) ) found = true; else ++i; if ( found ) SetSelection(i); else { SetSelection(wxNOT_FOUND); Clear(); Append(m_choices); } SetValue( val ); } // item_reference_edit::value_updated() /*----------------------------------------------------------------------------*/ /** * \brief Fill the list of id that match the pattern. */ void bf::item_reference_edit::fill_id_list() { wxString pat( GetValue() ); wxArrayString::const_iterator it = m_choices.begin(); wxArrayString::const_iterator eit = m_choices.end(); const wxArrayString old_choices( GetStrings() ); Clear(); if ( pat.IsEmpty() ) pat = wxT("*"); if ( (pat[0] != wxT('*')) && (pat[0] != wxT('?')) ) pat = wxT("*") + pat; if ( (pat[pat.length() - 1] != wxT('*')) && (pat[pat.length() - 1] != wxT('?')) ) pat += wxT("*"); for (; it!=eit; ++it) if ( it->Matches( pat ) ) Append( *it ); if ( GetCount() == 1 ) { SetSelection(0); m_last_valid_value = GetValue(); } else if ( GetCount() == 0 ) { Append( old_choices ); SetValue( m_last_valid_value ); } else m_last_valid_value = GetValue(); } // item_reference_edit::fill_id_list() /*----------------------------------------------------------------------------*/ /** * \brief The text of the pattern has changed. * \param event The event. */ void bf::item_reference_edit::on_pattern_change ( wxCommandEvent& WXUNUSED(event) ) { fill_id_list(); } // item_reference_edit::on_pattern_change() /*----------------------------------------------------------------------------*/ BEGIN_EVENT_TABLE(bf:: item_reference_edit, wxControl) EVT_TEXT( bf::item_reference_edit::IDC_PATTERN_TEXT, bf::item_reference_edit::on_pattern_change ) END_EVENT_TABLE() plee-the-bear-20251226/bear-factory/bear-editor/src/bf/code/item_rendering_parameters.cpp000066400000000000000000000527461512343254000311730ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bf::item_rendering_parameters class. * \author Julien Jorge */ #include "bf/item_rendering_parameters.hpp" #include "bf/item_class.hpp" #include "bf/item_instance.hpp" #include "bf/stream_conv.hpp" #include #include /*----------------------------------------------------------------------------*/ const std::string bf::item_rendering_parameters::s_field_name_left = "base_item.position.left"; const std::string bf::item_rendering_parameters::s_field_name_bottom = "base_item.position.bottom"; const std::string bf::item_rendering_parameters::s_field_name_width = "base_item.size.width"; const std::string bf::item_rendering_parameters::s_field_name_height = "base_item.size.height"; const std::string bf::item_rendering_parameters::s_field_name_extend_on_bounding_box = "item_with_decoration.extend_on_bounding_box"; const std::string bf::item_rendering_parameters::s_field_name_depth = "base_item.position.depth"; const std::string bf::item_rendering_parameters::s_field_name_gap_x = "basic_renderable_item.gap.x"; const std::string bf::item_rendering_parameters::s_field_name_gap_y = "basic_renderable_item.gap.y"; const std::string bf::item_rendering_parameters::s_field_name_mirror = "basic_renderable_item.mirror"; const std::string bf::item_rendering_parameters::s_field_name_flip = "basic_renderable_item.flip"; const std::string bf::item_rendering_parameters::s_field_name_color= "basic_renderable_item.color"; const std::string bf::item_rendering_parameters::s_field_name_angle = "basic_renderable_item.angle"; /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param item The item instance that is displayed. */ bf::item_rendering_parameters::item_rendering_parameters( item_instance& item ) : m_item(item), m_left(0), m_bottom(0), m_width(0), m_height(0), m_pos_z(0), m_gap_x(0), m_gap_y(0), m_mirror(false), m_flip(false) { m_sprite = new sprite; } // item_rendering_parameters::item_rendering_parameters() /*----------------------------------------------------------------------------*/ /** * \brief Copy constructor. * \param that The item to copy from. */ bf::item_rendering_parameters::item_rendering_parameters ( const item_rendering_parameters& that ) : m_item(that.m_item), m_left(that.m_left), m_bottom(that.m_bottom), m_width(that.m_width), m_height(that.m_height), m_extend_on_bounding_box(false), m_pos_z(that.m_pos_z), m_gap_x(that.m_gap_x), m_gap_y(that.m_gap_x), m_mirror(that.m_mirror), m_flip(that.m_flip) { m_sprite = new sprite(*that.m_sprite); } // item_rendering_parameters::item_rendering_parameters() /*----------------------------------------------------------------------------*/ /** * \brief Destructor. */ bf::item_rendering_parameters::~item_rendering_parameters() { delete m_sprite; } // item_rendering_parameters::~item_rendering_parameters() /*----------------------------------------------------------------------------*/ /** * \brief Method automatically called when a field or the item has changed. * \param field_name The name of the field that changed. */ void bf::item_rendering_parameters::field_changed( const std::string& field_name ) { if (field_name == s_field_name_left) m_left = get_field_real( field_name, 0 ); else if (field_name == s_field_name_bottom) m_bottom = get_field_real( field_name, 0 ); else if (field_name == s_field_name_depth) m_pos_z = get_field_int( field_name, 0 ); else if (field_name == s_field_name_gap_x) m_gap_x = get_field_int( field_name, 0 ); else if (field_name == s_field_name_gap_y) m_gap_y = get_field_int( field_name, 0 ); else if (field_name == s_field_name_width) m_width = get_field_real( field_name, 0 ); else if (field_name == s_field_name_height) m_height = get_field_real( field_name, 0 ); else if (field_name == s_field_name_extend_on_bounding_box) m_extend_on_bounding_box = get_field_bool( field_name, false ); else if (field_name == s_field_name_mirror) m_mirror = get_field_bool( field_name, false ); else if (field_name == s_field_name_flip) m_flip = get_field_bool( field_name, false ); else { const item_class& c(m_item.get_class()); if ( c.has_field( field_name, type_field::sprite_field_type ) || c.has_field( field_name, type_field::animation_field_type ) || field_name == s_field_name_color || field_name == s_field_name_angle ) *m_sprite = get_sprite_from_item(); } } // item_rendering_parameters::field_changed() /*----------------------------------------------------------------------------*/ /** * \brief Reset the rendering parameters. */ void bf::item_rendering_parameters::reset() { *m_sprite = get_sprite_from_item(); init(); } // item_rendering_parameters::reset() /*----------------------------------------------------------------------------*/ /** * \brief Read the default values for the position and size. */ void bf::item_rendering_parameters::init() { m_left = get_field_real( s_field_name_left, 0 ); m_bottom = get_field_real( s_field_name_bottom, 0 ); m_width = get_field_real( s_field_name_width, 0 ); m_height = get_field_real( s_field_name_height, 0 ); m_pos_z = get_field_int( s_field_name_depth, 0 ); m_gap_x = get_field_int( s_field_name_gap_x, 0 ); m_gap_y = get_field_int( s_field_name_gap_y, 0 ); m_extend_on_bounding_box = get_field_bool( s_field_name_extend_on_bounding_box, false ); m_mirror = get_field_bool( s_field_name_mirror, false ); m_flip = get_field_bool( s_field_name_flip, false ); } // item_rendering_parameters::init() /*----------------------------------------------------------------------------*/ /** * \brief Get the x-position of the item, if any. */ double bf::item_rendering_parameters::get_left() const { return m_left; } // item_rendering_parameters::get_left() /*----------------------------------------------------------------------------*/ /** * \brief Get the x-position of the right side of the item, if any. */ double bf::item_rendering_parameters::get_right() const { return get_left() + get_width(); } // item_rendering_parameters::get_right() /*----------------------------------------------------------------------------*/ /** * \brief Get the y-position of the item, if any. */ double bf::item_rendering_parameters::get_bottom() const { return m_bottom; } // item_rendering_parameters::get_bottom() /*----------------------------------------------------------------------------*/ /** * \brief Get the y-position of the top of the item, if any. */ double bf::item_rendering_parameters::get_top() const { return get_bottom() + get_height(); } // item_rendering_parameters::get_top() /*----------------------------------------------------------------------------*/ /** * \brief Get the x-position of the middle of the item. */ double bf::item_rendering_parameters::get_horizontal_middle() const { return get_left() + get_width() / 2; } // item_rendering_parameters::get_horizontal_middle() /*----------------------------------------------------------------------------*/ /** * \brief Get the y-position of the middle of the item. */ double bf::item_rendering_parameters::get_vertical_middle() const { return get_bottom() + get_height() / 2; } // item_rendering_parameters::get_vertical_middle() /*----------------------------------------------------------------------------*/ /** * \brief Get the z-position of the item, if any. */ int bf::item_rendering_parameters::get_pos_z() const { return m_pos_z; } // item_rendering_parameters::get_pos_z() /*----------------------------------------------------------------------------*/ /** * \brief Get the width of the item, if any. */ double bf::item_rendering_parameters::get_width() const { if ( m_width == 0 ) return m_sprite->width(); else return m_width; } // item_rendering_parameters::get_width() /*----------------------------------------------------------------------------*/ /** * \brief Get the height of the item, if any. */ double bf::item_rendering_parameters::get_height() const { if ( m_height == 0 ) return m_sprite->height(); else return m_height; } // item_rendering_parameters::get_height() /*----------------------------------------------------------------------------*/ /** * \brief Get the x-gap of the picture of the item, if any. */ int bf::item_rendering_parameters::get_gap_x() const { return m_gap_x; } // item_rendering_parameters::get_gap_x() /*----------------------------------------------------------------------------*/ /** * \brief Get the y-gap of the picture of the item, if any. */ int bf::item_rendering_parameters::get_gap_y() const { return m_gap_y; } // item_rendering_parameters::get_gap_y() /*----------------------------------------------------------------------------*/ /** * \brief Indicates if the item is mirrored. */ bool bf::item_rendering_parameters::is_mirrored() const { return m_mirror; } // item_rendering_parameters::is_mirrored() /*----------------------------------------------------------------------------*/ /** * \brief Indicates if the item is flipped. */ bool bf::item_rendering_parameters::is_flipped() const { return m_flip; } // item_rendering_parameters::is_flipped() /*----------------------------------------------------------------------------*/ /** * \brief Tell if the item has a sprite. */ bool bf::item_rendering_parameters::has_sprite() const { if ( m_sprite->get_image_name().empty() ) *m_sprite = get_sprite_from_item(); return !m_sprite->get_image_name().empty(); } // item_rendering_parameters::has_sprite() /*----------------------------------------------------------------------------*/ /** * \brief Get the default sprite of this item. */ const bf::sprite& bf::item_rendering_parameters::get_sprite() const { if ( m_sprite->get_image_name().empty() ) *m_sprite = get_sprite_from_item(); if ( ! m_sprite->get_image_name().empty() && m_extend_on_bounding_box ) m_sprite->set_size(get_width(), get_height()); return *m_sprite; } // item_rendering_parameters::get_sprite() /*----------------------------------------------------------------------------*/ /** * \brief Get the default sprite of this item. */ bf::sprite& bf::item_rendering_parameters::get_sprite() { if ( m_sprite->get_image_name().empty() ) *m_sprite = get_sprite_from_item(); if ( ! m_sprite->get_image_name().empty() && m_extend_on_bounding_box ) m_sprite->set_size(get_width(), get_height()); return *m_sprite; } // item_rendering_parameters::get_sprite() /*----------------------------------------------------------------------------*/ /** * \brief Set the position of the item, if it has this kind of field. * \param x The new X-position. * \param y The new Y-position. */ void bf::item_rendering_parameters::set_position( double x, double y ) { set_left(x); set_bottom(y); } // item_rendering_parameters::set_position() /*----------------------------------------------------------------------------*/ /** * \brief Set the X-position of the item, if it has this kind of field. * \param p The new position. */ void bf::item_rendering_parameters::set_left( double p ) { set_field_real(s_field_name_left, p ); } // item_rendering_parameters::set_left() /*----------------------------------------------------------------------------*/ /** * \brief Set the Y-position of the item, if it has this kind of field. * \param p The new position. */ void bf::item_rendering_parameters::set_bottom( double p ) { set_field_real(s_field_name_bottom, p ); } // item_rendering_parameters::set_bottom() /*----------------------------------------------------------------------------*/ /** * \brief Set the size of the item, if it has this kind of field. */ void bf::item_rendering_parameters::set_size( double x, double y ) { set_field_real(s_field_name_width, x ); set_field_real(s_field_name_height, y ); } // item_rendering_parameters::set_size() /*----------------------------------------------------------------------------*/ /** * \brief Get a sprite of the item. */ bf::sprite bf::item_rendering_parameters::get_sprite_from_item() const { sprite result = get_sprite_from_sprites(); if ( result.get_image_name().empty() ) result = get_sprite_from_animations(); result.set_angle ( result.get_angle() + get_field_real("basic_renderable_item.angle", 0) ); result.mirror ( trinary_logic::to_bool(result.get_mirrored_status()) ^ get_field_bool("basic_renderable_item.mirror", false) ); result.flip ( trinary_logic::to_bool(result.get_flipped_status()) ^ get_field_bool("basic_renderable_item.flip", false) ); color c(get_field_color("basic_renderable_item.color", color())); result.get_color().set_opacity ( result.get_color().get_opacity() * c.get_opacity() ); result.get_color().set_intensity ( result.get_color().get_red_intensity() * c.get_red_intensity(), result.get_color().get_green_intensity() * c.get_green_intensity(), result.get_color().get_blue_intensity() * c.get_blue_intensity() ); return result; } // item_rendering_parameters::get_sprite_from_item() /*----------------------------------------------------------------------------*/ /** * \brief Get a sprite in the sprites of the item. */ bf::sprite bf::item_rendering_parameters::get_sprite_from_sprites() const { const item_class& my_class(m_item.get_class()); const std::string default_name("item_with_decoration.sprite"); sprite result; if ( my_class.has_field( default_name, type_field::sprite_field_type ) ) if ( m_item.has_value( my_class.get_field(default_name) ) ) m_item.get_value( default_name, result ); if ( result.get_image_name().empty() ) result = search_sprite_in_class(my_class); return result; } // item_rendering_parameters::get_sprite_from_sprites() /*----------------------------------------------------------------------------*/ /** * \brief Get a sprite in the sprites of the item. * \param c The class in which we search the sprites. */ bf::sprite bf::item_rendering_parameters::search_sprite_in_class ( const item_class& c ) const { item_class::field_iterator it; sprite result; for (it=c.field_begin(); result.get_image_name().empty() && (it!=c.field_end()); ++it) if ( it->get_field_type() == type_field::sprite_field_type ) if ( m_item.has_value(*it) ) { if ( it->is_list() ) { std::list v; m_item.get_value( it->get_name(), v ); for( ; !v.empty() && result.get_image_name().empty(); v.pop_front() ) result = v.front(); } else m_item.get_value( it->get_name(), result ); } if ( result.get_image_name().empty() ) { item_class::const_super_class_iterator itc; for ( itc=c.super_class_begin(); result.get_image_name().empty() && (itc!=c.super_class_end()); ++itc) result = search_sprite_in_class( *itc ); } return result; } // item_rendering_parameters::search_sprite_in_class() /*----------------------------------------------------------------------------*/ /** * \brief Get a sprite in the animations from the item. */ bf::sprite bf::item_rendering_parameters::get_sprite_from_animations() const { const item_class& my_class(m_item.get_class()); const std::string default_name("item_with_decoration.animation"); animation result; any_animation f; if ( my_class.has_field( default_name, type_field::animation_field_type ) ) if ( m_item.has_value( my_class.get_field(default_name) ) ) { m_item.get_value( default_name, f ); result = f.get_current_animation(); } if ( result.empty() ) result = search_animation_in_class( my_class ); if ( result.empty() ) return sprite(); else return result.get_sprite(0); } // item_rendering_parameters::get_sprite_from_animations() /*----------------------------------------------------------------------------*/ /** * \brief Get a sprite in the animations of the item. * \param c The class in which we search the animations. */ bf::animation bf::item_rendering_parameters::search_animation_in_class ( const item_class& c ) const { item_class::field_iterator it; animation result; for (it=c.field_begin(); result.empty() && (it!=c.field_end()); ++it) if ( it->get_field_type() == type_field::animation_field_type ) if ( m_item.has_value(*it) ) { if ( it->is_list() ) { std::list v; m_item.get_value( it->get_name(), v ); for( ; !v.empty() && result.empty(); v.pop_front() ) result = v.front().get_current_animation(); } else { any_animation f; m_item.get_value( it->get_name(), f ); result = f.get_current_animation(); } } if ( result.empty() ) { item_class::const_super_class_iterator itc; for ( itc=c.super_class_begin(); result.empty() && (itc!=c.super_class_end()); ++itc ) result = search_animation_in_class( *itc ); } return result; } // item_rendering_parameters::search_animation_in_class() /*----------------------------------------------------------------------------*/ /** * \brief Get the value of a field of type real. * \param field_name The name of the field to get. * \param v The default value to return. */ double bf::item_rendering_parameters::get_field_real ( const std::string& field_name, double v ) const { real_type result(v); const item_class& my_class(m_item.get_class()); if ( my_class.has_field( field_name, type_field::real_field_type ) ) { if ( m_item.has_value( my_class.get_field(field_name) ) ) m_item.get_value( field_name, result ); else { std::string def = my_class.get_default_value(field_name); if ( !def.empty() ) { std::istringstream iss(def); stream_conv::read( iss, result ); } } } return result.get_value(); } // item_rendering_parameters::get_field_real() /*----------------------------------------------------------------------------*/ /** * \brief Get the value of a field of type color. * \param field_name The name of the field to get. * \param v The default value to return. */ bf::color bf::item_rendering_parameters::get_field_color ( const std::string& field_name, color c ) const { color result(c); const item_class& my_class(m_item.get_class()); if ( my_class.has_field( field_name, type_field::color_field_type ) ) { if ( m_item.has_value( my_class.get_field(field_name) ) ) m_item.get_value( field_name, result ); else { std::string def = my_class.get_default_value(field_name); if ( !def.empty() ) { std::istringstream iss(def); stream_conv::read( iss, result ); } } } return result; } // item_rendering_parameters::get_field_color() /*----------------------------------------------------------------------------*/ /** * \brief Get the value of a field of type int. * \param field_name The name of the field to get. * \param v The default value to return. */ int bf::item_rendering_parameters::get_field_int ( const std::string& field_name, int v ) const { integer_type result(v); const item_class& my_class(m_item.get_class()); if ( my_class.has_field( field_name, type_field::integer_field_type ) ) { if ( m_item.has_value( my_class.get_field(field_name) ) ) m_item.get_value( field_name, result ); else { std::string def = my_class.get_default_value(field_name); if ( !def.empty() ) { std::istringstream iss(def); stream_conv::read( iss, result ); } } } return result.get_value(); } // item_rendering_parameters::get_field_int() /*----------------------------------------------------------------------------*/ /** * \brief Get the value of a field of type int. * \param field_name The name of the field to get. * \param v The default value to return. */ bool bf::item_rendering_parameters::get_field_bool ( const std::string& field_name, bool v ) const { bool_type result(v); const item_class& my_class(m_item.get_class()); if ( my_class.has_field( field_name, type_field::boolean_field_type ) ) { if ( m_item.has_value( my_class.get_field(field_name) ) ) m_item.get_value( field_name, result ); else { std::string def = my_class.get_default_value(field_name); if ( !def.empty() ) { std::istringstream iss(def); stream_conv::read( iss, result ); } } } return result.get_value(); } // item_rendering_parameters::get_field_bool() /*----------------------------------------------------------------------------*/ /** * \brief Set a fiel of type real. * \param field_name The name of the field to set. * \param v The value of the field. */ void bf::item_rendering_parameters::set_field_real ( const std::string& field_name, double v ) { const item_class& my_class(m_item.get_class()); if ( my_class.has_field( field_name, type_field::real_field_type ) ) m_item.set_value( field_name, real_type(v) ); } // item_rendering_parameters::set_field_real() plee-the-bear-20251226/bear-factory/bear-editor/src/bf/code/path_configuration.cpp000066400000000000000000000473571512343254000276420ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bf::path_configuration class. * \author Julien Jorge */ #include "bf/path_configuration.hpp" #include #include #include #include #include #include #include #include /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param p The pattern used for the search. * \param n The maximum number of results asked. * \param c The files found in the data directory. */ bf::path_configuration::random_file_result::random_file_result ( const std::string p, std::size_t n, const std::list& c ) : pattern(p), count(n), candidates(c) { } // path_configuration::random_file_result::random_file_result() /*----------------------------------------------------------------------------*/ const std::string bf::path_configuration::s_config_file_name = "config"; const std::string bf::path_configuration::s_config_directory = ".bear_factory"; const char bf::path_configuration::s_section_left = '['; const char bf::path_configuration::s_section_right = ']'; const char bf::path_configuration::s_comment = '#'; const char bf::path_configuration::s_field_assign = '='; const std::string bf::path_configuration::s_items_directory_field = "items_directory"; const std::string bf::path_configuration::s_data_directory_field = "data_directory"; /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ bf::path_configuration::path_configuration() : m_max_cached_files(24) // arbitrary number { load(); } // path_configuration::configuration() /*----------------------------------------------------------------------------*/ /** * \brief Save the configuration. */ void bf::path_configuration::save() const { if ( create_config_file() ) { const std::string path( get_config_directory() + s_config_file_name ); std::ofstream f( path.c_str() ); if (f) { f << s_comment << " Path to the directory containing XML item class files\n"; workspaces_const_iterator it_map; for ( it_map = m_workspaces.begin(); it_map != m_workspaces.end(); ++it_map ) { f << s_section_left << it_map->first << s_section_right << '\n'; std::list::const_iterator it; for ( it = it_map->second.item_class_begin(); it != it_map->second.item_class_end(); ++it ) f << s_items_directory_field << ' ' << s_field_assign << ' ' << *it << '\n'; f << '\n' << s_comment << " Path to the directory containing the data of the game\n"; for ( it = it_map->second.data_begin(); it != it_map->second.data_end(); ++it ) f << s_data_directory_field << ' ' << s_field_assign << ' ' << *it << '\n'; } } } } // path_configuration::save() /*----------------------------------------------------------------------------*/ /** * \brief Get the path to the directory where are saved the configuration files. */ std::string bf::path_configuration::get_config_directory() const { return claw::system_info::get_user_directory() + '/' + s_config_directory + '/'; } // path_configuration::get_config_directory() /*----------------------------------------------------------------------------*/ /** * \brief Convert a path relative to a data path into a full path. * \param p (in) The relative path. (out) The full path. * \param w The workspace used. * * \a p is unchanged if no data path is found to make it a full path. */ bool bf::path_configuration::get_full_path ( std::string& p, const std::string& w ) const { boost::filesystem::path path( p ); bool result = boost::filesystem::exists( path ); workspace::path_list_const_reverse_iterator it; workspaces_const_iterator it_map; it_map = m_workspaces.find( w ); if ( it_map != m_workspaces.end() ) for ( it = it_map->second.data_rbegin(); !result && (it != it_map->second.data_rend()); ++it) { path = *it; path /= p; if ( boost::filesystem::exists( path ) ) { result = true; p = path.string(); } } return result; } // path_configuration::get_full_path() /*----------------------------------------------------------------------------*/ /** * \brief Get the full path to a file. Find a random file if the parameter is a * file pattern. * \param p (in) The relative path/pattern. (out) The full path. * \param w The workspace used. * * \a p is unchanged if no data path is found to make it a full path. */ bool bf::path_configuration::expand_file_name ( std::string& p, const std::string& w ) const { return expand_file_name(p, std::numeric_limits::max(), w); } // path_configuration::expand_file_name() /*----------------------------------------------------------------------------*/ /** * \brief Get the full path to a file. Find a random file if the parameter is a * file pattern. * \param p (in) The relative path/pattern. (out) The full path. * \param m The maximum number of files to find. * \param w The workspace used. * * \a p is unchanged if no data path is found to make it a full path. */ bool bf::path_configuration::expand_file_name ( std::string& p, std::size_t m, const std::string& w ) const { if ( p.empty() ) return false; else if ( p.find_first_of("#?*") == std::string::npos ) return get_full_path(p,w); else return find_random_file_name(p, m, w); } // path_configuration::expand_file_name() /*----------------------------------------------------------------------------*/ /** * \brief Convert a complete path to a path relative to a data path. * \param p (in) The full path. (out) The relative path. * \param w The workspace used. * * \a p is unchanged if no data path is found to make it a relative path. */ bool bf::path_configuration::get_relative_path ( std::string& p, const std::string& w ) const { boost::filesystem::path path( p ); bool result = false; workspace::path_list_const_reverse_iterator it; workspaces_const_iterator it_map; it_map = m_workspaces.find(w); if ( it_map != m_workspaces.end() ) for ( it = it_map->second.data_rbegin(); !result && (it!=it_map->second.data_rend()); ++it) { bool stop(false); boost::filesystem::path data( *it ); boost::filesystem::path::iterator pit = path.begin(); boost::filesystem::path::iterator dit = data.begin(); while ( !stop && (pit!=path.end()) && (dit!=data.end()) ) if ( *pit != *dit ) stop = true; else { ++pit; ++dit; } if ( dit == data.end() ) { result = true; p = pit->string(); for ( ++pit; pit!=path.end(); ++pit ) p = (boost::filesystem::path(p) / *pit).string(); } } return result; } // path_configuration::get_relative_path() /*----------------------------------------------------------------------------*/ /** * \brief Set workspaces. * \param w The workspaces. */ void bf::path_configuration::set_workspaces(const workspaces_map& w) { m_workspaces = w; } // path_configuration::set_workspaces /*----------------------------------------------------------------------------*/ /** * \brief Tell if a given workspace name exists. * \param w The workspace searched. */ bool bf::path_configuration::has_workspace( const std::string& w ) const { return m_workspaces.find(w) != m_workspaces.end(); } // path_configuration::has_workspace() /*----------------------------------------------------------------------------*/ /** * \brief Get a workspace by its name. * \param w The workspace to give. */ const bf::workspace& bf::path_configuration::get_workspace( const std::string& w ) const { CLAW_ASSERT( has_workspace( w ), "Workspace is required" ); return m_workspaces.find(w)->second; } // path_configuration::get_workspace() /*----------------------------------------------------------------------------*/ /** * \brief Get a workspace by its name. * \param w The workspace to give. */ const bf::path_configuration::workspaces_map& bf::path_configuration::get_workspaces() const { return m_workspaces; } // path_configuration::get_workspaces() /*----------------------------------------------------------------------------*/ /** * \brief Search the workspace according to a file. * \param path The path of the file. */ std::string bf::path_configuration::search_workspace( const std::string& path ) const { std::string result; boost::filesystem::path p_file = resolve_path( path ); workspace::path_list_const_iterator it; workspaces_const_iterator it_map; for ( it_map = m_workspaces.begin(); it_map != m_workspaces.end() && result.empty(); ++it_map ) for ( it = it_map->second.data_begin(); it != it_map->second.data_end() && result.empty(); ++it ) { boost::filesystem::path p_data( boost::filesystem::absolute(*it) ); if ( p_file.string().find( p_data.string() ) == 0 ) result = it_map->first; } return result; } // path_configuration::search_workspace() /*----------------------------------------------------------------------------*/ /** * \brief Load the configuration. */ void bf::path_configuration::load() { if ( create_config_file() ) { const std::string path( get_config_directory() + s_config_file_name ); std::ifstream f( path.c_str() ); if (f) { claw::configuration_file config(f); claw::configuration_file::const_file_iterator it_file; for ( it_file = config.file_begin(); it_file != config.file_end(); ++it_file ) { m_workspaces[*it_file].clear(); claw::configuration_file::const_field_iterator it; for ( it = config.field_begin(*it_file, s_items_directory_field); it != config.field_end(*it_file, s_items_directory_field); ++it) m_workspaces[*it_file].add_item_class_path( *it ); for ( it = config.field_begin(*it_file, s_data_directory_field); it != config.field_end(*it_file, s_data_directory_field); ++it) m_workspaces[*it_file].add_data_path( *it ); } } } } // path_configuration::load() /*----------------------------------------------------------------------------*/ /** * \brief Create the directory containing the configuration file, if it does not * exists. * \return true if the directory already exists or if it has been created. */ bool bf::path_configuration::create_config_directory() const { bool result = false; boost::filesystem::path path( get_config_directory() ); if ( boost::filesystem::exists( path ) ) result = boost::filesystem::is_directory( path ); else result = boost::filesystem::create_directory( path ); return result; } // path_configuration::create_config_directory() /*----------------------------------------------------------------------------*/ /** * \brief Create the configuration file, if it does not exists. * \return true if the file already exists or if it has been created. */ bool bf::path_configuration::create_config_file() const { bool result = false; if ( create_config_directory() ) { boost::filesystem::path path ( get_config_directory() + s_config_file_name ); if ( !boost::filesystem::exists( path ) ) { std::ofstream f( path.string().c_str() ); f << s_comment << " Configuration file for Bear Factory\n\n"; } if ( boost::filesystem::exists( path ) ) result = !boost::filesystem::is_directory( path ); } return result; } // path_configuration::create_config_file() /*----------------------------------------------------------------------------*/ /** * \brief Find a random file matching a pattern name. * \param name The pattern of the file to find. * \param m The maximum number of files to find. * \return True if we found a file; false otherwise. */ bool bf::path_configuration::find_random_file_name ( std::string& name, std::size_t m, const std::string& w ) const { bool result = find_cached_random_file_name(name, m); if ( !result ) result = find_random_file_name_on_disk(name, m, w); return result; } // path_configuration::find_random_file_name() /*----------------------------------------------------------------------------*/ /** * \brief Find a random file matching a pattern name. The file is searched in * the cache of the previous searches. * \param name The pattern of the file to find. * \param m The maximum number of files to find. * \return True if we found a file; false otherwise. */ bool bf::path_configuration::find_cached_random_file_name ( std::string& name, std::size_t m ) const { cached_random_file_list_type::iterator it; bool result(false); bool stop(false); it = m_cached_random_file.begin(); while ( !result && !stop && (it!=m_cached_random_file.end()) ) if ( it->pattern == name ) { stop = true; if ( it->count >= m ) result = true; } else ++it; if ( result ) { const std::size_t i ( (double)it->candidates.size() * rand() / (RAND_MAX+1.0) ); std::list::const_iterator itc = it->candidates.begin(); std::advance(itc, i); name = *itc; // put the result at the beginning of the cache m_cached_random_file.push_front(*it); m_cached_random_file.erase(it); } else if ( stop ) m_cached_random_file.erase(it); return result; } // path_configuration::find_cached_random_file_name() /*----------------------------------------------------------------------------*/ /** * \brief Find a random file matching a pattern name. * \param name The pattern of the file to find. * \param m The maximum number of files to find. * \return True if we found a file; false otherwise. */ bool bf::path_configuration::find_random_file_name_on_disk ( std::string& name, std::size_t m, const std::string& w ) const { workspaces_const_iterator it_map; workspace::path_list_const_iterator it; std::list candidates; bool result(false); it_map = m_workspaces.find( w ); if ( it_map != m_workspaces.end() ) for ( it = it_map->second.data_begin(); (it != it_map->second.data_end()) && (candidates.size() < m); ++it ) { const boost::filesystem::path dirpath( *it ); if ( boost::filesystem::exists( dirpath ) ) if ( boost::filesystem::is_directory( dirpath ) ) // plus 1 for the trailing slash of the root directory find_all_files_in_dir (*it, name, it->length() + 1, m, candidates); } if ( !candidates.empty() ) { const std::size_t i ( (double)candidates.size() * rand() / (RAND_MAX+1.0) ); it = candidates.begin(); std::advance(it, i); std::string pattern(name); name = *it; result = true; // put the result at the beginning of the cache m_cached_random_file.push_front ( random_file_result(pattern, m, candidates) ); if ( m_cached_random_file.size() > m_max_cached_files ) m_cached_random_file.pop_back(); } return result; } // path_configuration::find_random_file_name_on_disk() /*----------------------------------------------------------------------------*/ /** * \brief Find all files matching a given pattern. * \param dirname The name of the directory to explore. * \param pattern The pattern of the name of the files to find. * \param offset The length of the path to the root directory. * \param m The maximum number of files to find. * \param result (out) The paths of the files. * * \sa glob_match */ void bf::path_configuration::find_all_files_in_dir ( const std::string& dirname, const std::string& pattern, std::size_t offset, std::size_t m, std::list& result ) const { const boost::filesystem::path path( dirname ); CLAW_PRECOND( boost::filesystem::is_directory(path) ); boost::filesystem::directory_iterator it(path); const boost::filesystem::directory_iterator eit; for ( ; (it!=eit) && (result.size() < m); ++it ) { const std::string entry_path( it->path().string() ); if ( boost::filesystem::is_directory(*it) ) { if ( glob_potential_match(pattern, entry_path, offset) ) find_all_files_in_dir(entry_path, pattern, offset, m, result); } else if ( glob_match(pattern, entry_path, offset) ) result.push_back( entry_path ); } } // path_configuration::find_all_files_in_dir() /*----------------------------------------------------------------------------*/ /** * \brief Tell if a string matches a pattern. * \param pattern The pattern. * \param text The text to check. * \param offset Position in \a text where the search starts. * * The characters '*', '?' and '#' in the pattern mean, respectively, anything, * a single character or nothing, and a single character. */ bool bf::path_configuration::glob_match ( const std::string& pattern, const std::string& text, std::size_t offset ) const { return claw::glob_match ( pattern.begin(), pattern.end(), text.begin() + offset, text.end(), '*', '?', '#' ); } // path_configuration::glob_match() /*----------------------------------------------------------------------------*/ /** * \brief Tell if a string can potentially match a pattern. * \param pattern The pattern. * \param text The text to check. * \param offset Position in \a text where the search starts. * * The characters '*', '?' and '#' in the pattern mean, respectively, anything, * a single character or nothing, and a single character. */ bool bf::path_configuration::glob_potential_match ( const std::string& pattern, const std::string& text, std::size_t offset ) const { return claw::glob_potential_match ( pattern.begin(), pattern.end(), text.begin() + offset, text.end(), '*', '?', '#' ); } // path_configuration::glob_potential_match() /*----------------------------------------------------------------------------*/ /** * \brief Return a path without /../ . * \param path The path to resolve. */ boost::filesystem::path bf::path_configuration::resolve_path ( const std::string& path ) const { // http://stackoverflow.com/questions/1746136/how-do-i-normalize-a-pathname-using-boostfilesystem boost::filesystem::path abs_p( boost::filesystem::absolute(path) ); boost::filesystem::path result; for( boost::filesystem::path::iterator it = abs_p.begin(); it != abs_p.end(); ++it ) { if ( *it == ".." ) { // /a/b/.. is not necessarily /a if b is a symbolic link if(boost::filesystem::is_symlink(result) ) result /= *it; // /a/b/../.. is not /a/b/.. under most circumstances // We can end up with ..s in our result because of symbolic links else if(result.filename() == "..") result /= *it; // Otherwise it should be safe to resolve the parent else result = result.parent_path(); } else if( *it != "." ) { // Just cat other path entries result /= *it; } } return result; } // path_configuration::resolve_path() plee-the-bear-20251226/bear-factory/bear-editor/src/bf/code/sample.cpp000066400000000000000000000066271512343254000252330ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bf::sample class. * \author Julien Jorge */ #include "bf/sample.hpp" #include "bf/compilation_context.hpp" #include "bf/compiled_file.hpp" #include "bf/path_configuration.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Default constructor. */ bf::sample::sample() : m_loops(1), m_volume(1) { } // sample::sample() /*----------------------------------------------------------------------------*/ /** * \brief Set the path to the resource to use. * \param name The new value. */ void bf::sample::set_path( const std::string& name ) { m_path = name; } // sample::set_path() /*----------------------------------------------------------------------------*/ /** * \brief Set the number of times the sample will be played. * \param loops The new value. */ void bf::sample::set_loops( const unsigned int loops ) { m_loops = loops; } // sample::set_loops() /*----------------------------------------------------------------------------*/ /** * \brief The volume at which the sample is played. * \param v The new value, in the interval (0, 1). */ void bf::sample::set_volume( const double v ) { if (v > 1) m_volume = 1; else if ( v < 0 ) m_volume = 0; else m_volume = v; } // sample::set_volume() /*----------------------------------------------------------------------------*/ /** * \brief Get how many times the sample will be played. */ unsigned int bf::sample::get_loops() const { return m_loops; } // sample::get_loops() /*----------------------------------------------------------------------------*/ /** * \brief Get the volume at which the sample is played. */ double bf::sample::get_volume() const { return m_volume; } // sample::get_volume() /*----------------------------------------------------------------------------*/ /** * \brief Get the path to the resource to use. */ const std::string& bf::sample::get_path() const { return m_path; } // sample::get_path() /*----------------------------------------------------------------------------*/ /** * \brief Tell if two samples are the same. * \param that The instance to compare to. */ bool bf::sample::operator==( const sample& that ) const { return (m_path == that.m_path) && (m_loops == that.m_loops) && (m_volume == that.m_volume); } // sample::operator==() /*----------------------------------------------------------------------------*/ /** * \brief Tell if two samples are different. * \param that The instance to compare to. */ bool bf::sample::operator!=( const sample& that ) const { return !(*this == that); } // sample::operator!=() /*----------------------------------------------------------------------------*/ /** * \brief Compile the sample. * \param f The stream in which we write the compiled sample. * \param c The context in which the compilation is done. */ void bf::sample::compile( compiled_file& f, compilation_context& c ) const { std::string path(m_path); if ( path_configuration::get_instance().expand_file_name ( path, c.get_workspace_name() ) ) path_configuration::get_instance().get_relative_path ( path, c.get_workspace_name() ); f << path << m_loops << m_volume; } // sample::compile() plee-the-bear-20251226/bear-factory/bear-editor/src/bf/code/sample_edit.cpp000066400000000000000000000113111512343254000262220ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bf::sample_edit class. * \author Julien Jorge */ #include "bf/sample_edit.hpp" #include "bf/path_configuration.hpp" #include "bf/workspace_environment.hpp" #include "bf/wx_facilities.hpp" #include /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param parent The window owning this window. * \param w The workspace name. * \param s The initial sample. */ bf::sample_edit::sample_edit ( wxWindow& parent, workspace_environment& env, const sample& s ) : wxPanel(&parent, wxID_ANY), base_edit(s), m_workspace(env) { create_controls(); Fit(); } // sample_edit::sample_edit() /*----------------------------------------------------------------------------*/ /** * \brief Check if the displayed value is correct and, if it is, set the * value according to the display. */ bool bf::sample_edit::validate() { sample s; s.set_loops( m_loops->GetValue() ); s.set_volume( m_volume->GetValue() ); s.set_path( wx_to_std_string(m_sound_file->GetValue()) ); set_value(s); return true; } // sample_edit::validate() /*----------------------------------------------------------------------------*/ /** * \brief Method called after changing the value by set_value(). */ void bf::sample_edit::value_updated() { fill_controls(); } // sample_edit::value_updated() /*----------------------------------------------------------------------------*/ /** * \brief Fill the controls with the values of the sample. */ void bf::sample_edit::fill_controls() { sample s = get_value(); m_loops->SetValue(s.get_loops()); m_volume->SetValue(s.get_volume()); m_sound_file->SetValue( std_to_wx_string(s.get_path()) ); } // sample_edit::fill_controls() /*----------------------------------------------------------------------------*/ /** * \brief Create the controls of the window. */ void bf::sample_edit::create_controls() { m_loops = new wxSpinCtrl( this, wxID_ANY ); m_volume = new spin_ctrl( this, wxID_ANY ); m_sound_file = new wxTextCtrl( this, wxID_ANY ); m_loops->SetRange( 0, std::numeric_limits::max() ); m_volume->SetRange( 0, 1 ); m_volume->SetStep(0.1); create_sizer_controls(); fill_controls(); } // sample_edit::create_controls() /*----------------------------------------------------------------------------*/ /** * \brief Create the controls and add them in sizers. */ void bf::sample_edit::create_sizer_controls() { wxBoxSizer* v_sizer = new wxBoxSizer( wxVERTICAL ); wxBoxSizer* h_sizer = new wxBoxSizer( wxHORIZONTAL ); h_sizer->Add ( new wxStaticText(this, wxID_ANY, _("Sound file:")), 0, wxALIGN_CENTRE_VERTICAL | wxALL, 5 ); h_sizer->Add( m_sound_file, 1, wxEXPAND | wxALL, 5 ); wxButton* browse = new wxButton ( this, IDC_FILE_SELECT, wxT("..."), wxDefaultPosition, wxSize(30, -1) ); h_sizer->Add( browse, 0, wxALL, 5 ); v_sizer->Add( h_sizer, 0, wxEXPAND ); h_sizer = new wxBoxSizer( wxHORIZONTAL ); h_sizer->Add ( new wxStaticText(this, wxID_ANY, _("Loops:")), 1, wxALIGN_CENTRE_VERTICAL | wxALL, 5 ); h_sizer->Add( m_loops, 1, wxEXPAND ); h_sizer->Add ( new wxStaticText(this, wxID_ANY, _("Volume:")), 1, wxALIGN_CENTRE_VERTICAL | wxALL, 5 ); h_sizer->Add( m_volume, 1, wxEXPAND ); v_sizer->Add( h_sizer, 0, wxALL, 5 ); SetSizer(v_sizer); } // sample_edit::create_sizer_controls() /*----------------------------------------------------------------------------*/ /** * \brief The user clicked on the button to select a sound file. * \param event This event occured. */ void bf::sample_edit::on_file_select( wxCommandEvent& WXUNUSED(event) ) { std::string p = wx_to_std_string(m_sound_file->GetValue()); path_configuration::get_instance().get_full_path (p, m_workspace.get_name() ); wxFileDialog dlg ( this, _("Choose a sound file"), wxEmptyString, std_to_wx_string(p), _("Sound files|*.ogg;*.wav|All files|*"), wxFD_DEFAULT_STYLE | wxFD_FILE_MUST_EXIST ); if (dlg.ShowModal() == wxID_OK) { std::string new_p = wx_to_std_string( dlg.GetPath() ); path_configuration::get_instance().get_relative_path (new_p, m_workspace.get_name() ); m_sound_file->SetValue( std_to_wx_string(new_p) ); } } // sample_edit::on_file_select() /*----------------------------------------------------------------------------*/ BEGIN_EVENT_TABLE(bf::sample_edit, wxPanel) EVT_BUTTON( bf::sample_edit::IDC_FILE_SELECT, bf::sample_edit::on_file_select ) END_EVENT_TABLE() plee-the-bear-20251226/bear-factory/bear-editor/src/bf/code/slider_ctrl.cpp000066400000000000000000000500211512343254000262430ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bf::slider_ctrl class. * \author Sébastien Angibaud */ #include "bf/slider_ctrl.hpp" #include #include const unsigned int bf::slider_ctrl::s_slider_border = 8; const wxEventType bf::slider_event::value_change_event_type = wxNewEventType(); const wxEventType bf::tick_event::move_event_type = wxNewEventType(); /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param t The type of the event. * \param id The id of the window that generates the event. */ bf::slider_event::slider_event( wxEventType t, wxWindowID id ) : wxNotifyEvent(t, id) { } // slider_event::slider_event() /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param value The value of the slider. * \param t The type of the event. * \param id The id of the window that generates the event. */ bf::slider_event::slider_event ( double value, wxEventType t, wxWindowID id ) : wxNotifyEvent(t, id), m_value(value) { } // slider_event::slider_event() /*----------------------------------------------------------------------------*/ /** * \brief Copy constructor. * \param that The event to copy from. */ bf::slider_event::slider_event( const slider_event& that ) : wxNotifyEvent(that), m_value(that.m_value) { } // slider_event::slider_event() /*----------------------------------------------------------------------------*/ /** * \brief Allocate a copy of this instance. */ wxEvent* bf::slider_event::Clone() const { return new slider_event(*this); } // slider_event::Clone() /*----------------------------------------------------------------------------*/ /** * \brief Get the value of the slider. */ double bf::slider_event::get_value() const { return m_value; } // slider_event::get_value() /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param t The type of the event. * \param id The id of the window that generates the event. */ bf::tick_event::tick_event( wxEventType t, wxWindowID id ) : wxNotifyEvent(t, id) { } // tick_event::tick_event() /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param initial_value The initial value of the tick. * \param new_value The new value of the tick. * \param copy Tell if the user asks to copy the data associated with the * previous position (?). * \param t The type of the event. * \param id The id of the window that generates the event. */ bf::tick_event::tick_event ( double initial_value, double new_value, bool copy, wxEventType t, wxWindowID id ) : wxNotifyEvent(t, id), m_initial_value(initial_value), m_new_value(new_value), m_copy(copy) { } // tick_event::tick_event() /*----------------------------------------------------------------------------*/ /** * \brief Copy constructor. * \param that The event to copy from. */ bf::tick_event::tick_event( const tick_event& that ) : wxNotifyEvent(that), m_initial_value(that.m_initial_value), m_new_value(that.m_new_value), m_copy(that.m_copy) { } // tick_event::tick_event() /*----------------------------------------------------------------------------*/ /** * \brief Allocate a copy of this instance. */ wxEvent* bf::tick_event::Clone() const { return new tick_event(*this); } // tick_event::Clone() /*----------------------------------------------------------------------------*/ /** * \brief Get the initial value of the tick. */ double bf::tick_event::get_initial_value() const { return m_initial_value; } // tick_event::get_initial_value() /*----------------------------------------------------------------------------*/ /** * \brief Get the new value of the tick. */ double bf::tick_event::get_new_value() const { return m_new_value; } // tick_event::get_new_value() /*----------------------------------------------------------------------------*/ /** * \brief Get the copy statut. */ bool bf::tick_event::get_copy() const { return m_copy; } // tick_event::get_copy() /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ bf::slider_ctrl::drag_info::drag_info() : drag_mode(drag_mode_none) { } // slider_ctrl::drag_info::drag_info() /*----------------------------------------------------------------------------*/ /** * \brief Get the difference between the initial mouse position and the current * mouse position. */ wxSize bf::slider_ctrl::drag_info::delta() const { return wxSize ( mouse_position.x - mouse_origin.x, mouse_position.y - mouse_origin.y ); } // slider_ctrl::drag_info::delta() /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param parent The window owning this one. * \param id The identifier of the control. * \param value The value of the slider. * \param min_value The mininum value of the slider. * \param max_value The maximum value of the slider. */ bf::slider_ctrl::slider_ctrl ( wxWindow* parent, wxWindowID id, double value, double min_value, double max_value ) : super( parent, id ), m_drag_info(NULL), m_value(value), m_min_value(min_value), m_max_value(max_value), m_ticks(NULL) { } // slider_ctrl::slider_ctrl() /*----------------------------------------------------------------------------*/ /** * \brief Render the control. */ void bf::slider_ctrl::render() { wxBufferedPaintDC dc( this ); if( IsShown() ) { wxFont font(dc.GetFont()); font.SetPointSize(8); dc.SetFont(font); dc.SetBackgroundMode(wxSOLID); dc.SetBackground(wxSystemSettings::GetColour(wxSYS_COLOUR_BACKGROUND)); dc.Clear(); render_slider(dc); render_ticks(dc); render_value(dc); render_drag_info(dc); } } // slider_ctrl::render() /*----------------------------------------------------------------------------*/ /** * \brief Add aSet theticks. * \param t The ticks. */ void bf::slider_ctrl::set_ticks(const ticks* t) { m_ticks = t; } // slider_ctrl::add_tick() /*----------------------------------------------------------------------------*/ /** * \brief Get the value. */ double bf::slider_ctrl::get_value() const { return m_value;; } // slider_ctrl::get_value() /*----------------------------------------------------------------------------*/ /** * \brief Set the value. * \param value The new value. */ void bf::slider_ctrl::set_value( double value ) { if ( m_value != value) { m_value = value; render(); } } // slider_ctrl::set_value() /*----------------------------------------------------------------------------*/ /** * \brief Set the maximum value. * \param max The new maximum value. */ void bf::slider_ctrl::set_max_value( double max ) { m_max_value = max; if ( m_value > m_max_value ) m_value = m_max_value; render(); } // slider_ctrl::set_value() /*----------------------------------------------------------------------------*/ /** * \brief Tell if there exist a tick at a given position. * \param value The considered value. */ bool bf::slider_ctrl::has_tick( double value ) const { bool result = false; ticks::const_iterator it; for ( it = m_ticks->begin(); ( it != m_ticks->end() ) && !result; ++it) if ( *it == value ) result = true; return result; } // slider_ctrl::has_tick() /*----------------------------------------------------------------------------*/ /** * \brief Send the event "value_change". */ void bf::slider_ctrl::send_event_change_value() { slider_event event ( m_value, slider_event::value_change_event_type, GetId() ); event.SetEventObject(this); ProcessEvent(event); } // slider_ctrl::send_event_change_value() /*----------------------------------------------------------------------------*/ /** * \brief Send the event "tick_move". * \param initial_value The initial value of the tick * \param new_value The new value of the tick * \param copy Indicates if the move is a copy. */ void bf::slider_ctrl::send_event_move_tick (double initial_value, double new_value, bool copy) { tick_event event ( initial_value, new_value, copy, tick_event::move_event_type, GetId() ); event.SetEventObject(this); ProcessEvent(event); if ( !event.IsAllowed() ) { set_value(m_drag_info->initial_value); send_event_change_value(); } } // slider_ctrl::send_event_move_tick() /*----------------------------------------------------------------------------*/ /** * \brief Get the width of the slider. */ unsigned int bf::slider_ctrl::get_slider_width() const { return GetSize().x - 2 * s_slider_border; } // slider_ctrl::get_slider_width() /*----------------------------------------------------------------------------*/ /** * \brief Render the slider on the screen. * \param dc The device context for the drawings. */ void bf::slider_ctrl::render_slider( wxDC& dc ) const { dc.SetPen(wxSystemSettings::GetColour(wxSYS_COLOUR_3DSHADOW)); dc.DrawLine( s_slider_border, GetSize().y / 2 - 3, GetSize().x - s_slider_border, GetSize().y / 2 - 3 ); dc.SetPen(wxSystemSettings::GetColour(wxSYS_COLOUR_3DHIGHLIGHT)); dc.DrawLine( s_slider_border, GetSize().y / 2 - 2, GetSize().x - s_slider_border, GetSize().y / 2 - 2 ); dc.SetPen(wxSystemSettings::GetColour(wxSYS_COLOUR_BTNSHADOW)); dc.SetBrush(*wxTRANSPARENT_BRUSH); dc.DrawRoundedRectangle( 1, 1, GetSize().x - 2, GetSize().y - 2, 3 ); } // slider_ctrl::render_slider() /*----------------------------------------------------------------------------*/ /** * \brief Render the value on the screen. * \param dc The device context for the drawings. */ void bf::slider_ctrl::render_value( wxDC& dc ) const { wxPoint pos(get_position(m_value), GetSize().y / 2); dc.SetPen(wxSystemSettings::GetColour(wxSYS_COLOUR_3DSHADOW)); dc.SetBrush(wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE)); wxPoint p3[5]; p3[0] = wxPoint( pos.x, pos.y + 4 ); p3[1] = wxPoint( pos.x + 4, pos.y ); p3[2] = wxPoint( pos.x + 4, pos.y - 9 ); p3[3] = wxPoint( pos.x - 4, pos.y - 9 ); p3[4] = wxPoint( pos.x - 4, pos.y ); dc.DrawPolygon(5, p3); dc.SetPen(wxSystemSettings::GetColour(wxSYS_COLOUR_3DHIGHLIGHT)); wxPoint p[4]; p[0] = wxPoint( pos.x, pos.y + 3 ); p[1] = wxPoint( pos.x - 3, pos.y ); p[2] = wxPoint( pos.x - 3, pos.y - 8 ); p[3] = wxPoint( pos.x + 3, pos.y - 8 ); dc.DrawLines(4, p); } // slider_ctrl::render_value() /*----------------------------------------------------------------------------*/ /** * \brief Render the drag info on the screen. * \param dc The device context for the drawings. */ void bf::slider_ctrl::render_drag_info( wxDC& dc ) const { if ( m_drag_info != NULL ) if ( m_drag_info->drag_mode == drag_info::drag_mode_tick_move ) { double v = get_value(m_drag_info->mouse_position.x); if ( has_tick(v) ) { render_tick( dc, get_position(m_drag_info->initial_value), *wxRED, *wxTRANSPARENT_BRUSH); render_tick( dc, get_position(v), *wxRED, *wxRED_BRUSH); } else { render_tick( dc, get_position(m_drag_info->initial_value), *wxGREEN, *wxTRANSPARENT_BRUSH); render_tick( dc, get_position(v), *wxGREEN, *wxGREEN_BRUSH); } } } // slider_ctrl::render_drag_info() /*----------------------------------------------------------------------------*/ /** * \brief Render sticks on the screen. * \param dc The device context for the drawings. */ void bf::slider_ctrl::render_ticks( wxDC& dc ) const { if ( m_ticks ) { ticks::const_iterator it; for (it = m_ticks->begin(); it != m_ticks->end(); ++it ) render_tick(dc, *it); } } // slider_ctrl::render_ticks() /*----------------------------------------------------------------------------*/ /** * \brief Render a stick on the screen. * \param dc The device context for the drawings. * \param t The tick to render. */ void bf::slider_ctrl::render_tick( wxDC& dc, tick t ) const { if ( t == m_value ) { wxBrush brush(*wxBLACK); render_tick( dc, get_position(t), *wxBLACK, brush); } else render_tick( dc, get_position(t), *wxBLACK, *wxTRANSPARENT_BRUSH); } // slider_ctrl::render_tick() /*----------------------------------------------------------------------------*/ /** * \brief Render a stick on the screen. * \param dc The device context for the drawings. * \param position The tick position tick. * \param colour The colour of rendering. * \param brush The brush. */ void bf::slider_ctrl::render_tick ( wxDC& dc, unsigned int position, const wxColour& colour, const wxBrush& brush ) const { wxPen pen(colour); dc.SetPen(pen); dc.SetBrush(brush); wxPoint p[3]; wxPoint pos(position, GetSize().y / 2); p[0] = wxPoint( pos.x, pos.y+5 ); p[1] = wxPoint( pos.x+4, pos.y +9 ); p[2] = wxPoint( pos.x-4, pos.y +9 ); dc.DrawPolygon(3, p); } // slider_ctrl::render_tick() /*----------------------------------------------------------------------------*/ /** * \brief Get the value according a position. * \param pos The position. */ double bf::slider_ctrl::get_value( int pos ) const { double result; if ( pos < (int)(s_slider_border)) result = 0; else if ( pos > (int)(s_slider_border + get_slider_width()) ) result = m_max_value; else { pos -= s_slider_border; result = ( (double)pos * ( m_max_value - m_min_value ) ) / (double)get_slider_width() + m_min_value; if ( result < m_min_value ) result = m_min_value; if ( result > m_max_value ) result = m_max_value; } result = (double)((int)((result+0.0005) * 1000)) / 1000; return result; } // slider_ctrl::get_value() /*----------------------------------------------------------------------------*/ /** * \brief Get the position according a value. * \param value The value. */ unsigned int bf::slider_ctrl::get_position( double value ) const { return s_slider_border + (unsigned int) ( ( ( value - m_min_value ) * (double)(get_slider_width() ) ) / ( m_max_value - m_min_value ) ); } // slider_ctrl::get_position() /*----------------------------------------------------------------------------*/ /** * \brief Compute the nearest tick of a given value. * \param v The considered value. */ double bf::slider_ctrl::nearest_tick( double v ) const { double result = v; double min_dist = m_max_value + 1; if ( m_ticks ) { slider_ctrl::ticks::const_iterator it; for (it = m_ticks->begin(); it != m_ticks->end(); ++it ) { double dist; if ( *it > v ) dist = *it - v; else dist = v - *it; if ( dist < min_dist ) { result = *it; min_dist = dist; } } } return result; } // slider_ctrl::nearest_tick() /*----------------------------------------------------------------------------*/ /** * \brief Apply the result of a drag in move mode. * \param shift Shift key is pressed. */ void bf::slider_ctrl::apply_drag_mode_move( bool shift ) { double v = get_value(m_drag_info->mouse_position.x); if ( shift ) v = nearest_tick(v); if ( v != m_value ) { set_value(v); send_event_change_value(); } } // slider_ctrl::apply_drag_mode_move() /*----------------------------------------------------------------------------*/ /** * \brief Apply the result of a drag in tick move mode. * \param control Indicates if control key is pressed. * \param alt Indicates if alt key is pressed. */ void bf::slider_ctrl::apply_drag_mode_tick_move( bool control, bool alt ) { if ( control ) { double v = get_value(m_drag_info->mouse_position.x); send_event_move_tick(m_drag_info->initial_value, v, alt); } else { set_value(m_drag_info->initial_value); send_event_change_value(); } } // slider_ctrl::apply_drag_mode_tick_move() /*----------------------------------------------------------------------------*/ /** * \brief Event sent to a resized window. * \param event The event. */ void bf::slider_ctrl::on_size( wxSizeEvent& WXUNUSED(event) ) { Refresh(); } // slider_ctrl::on_size() /*----------------------------------------------------------------------------*/ /** * \brief Draw the content of the window. * \param event The paint event. */ void bf::slider_ctrl::on_paint( wxPaintEvent& WXUNUSED(event) ) { render(); } // slider_ctrl::on_paint() /*----------------------------------------------------------------------------*/ /** * \brief The user start a click in the frame. * \param event The mouse event that occured. */ void bf::slider_ctrl::on_mouse_left_down( wxMouseEvent& event ) { wxPoint point( event.GetX(), event.GetY() ); if ( event.ControlDown() ) { double v = get_value(point.x); v = nearest_tick(v); if ( has_tick(v) ) { m_drag_info = new drag_info(); m_drag_info->drag_mode = drag_info::drag_mode_tick_move; m_drag_info->initial_value = v; m_drag_info->mouse_origin = point; m_drag_info->mouse_position = m_drag_info->mouse_origin; } } else { m_drag_info = new drag_info(); m_drag_info->drag_mode = drag_info::drag_mode_move; m_drag_info->mouse_origin = point; m_drag_info->mouse_position = m_drag_info->mouse_origin; } } // slider_ctrl::on_mouse_left_down() /*----------------------------------------------------------------------------*/ /** * \brief The user clicked in the frame. * \param event The mouse event that occured. */ void bf::slider_ctrl::on_mouse_move( wxMouseEvent& event ) { const wxPoint point( event.GetX(), event.GetY() ); if ( event.LeftIsDown() ) if ( m_drag_info != NULL ) { m_drag_info->mouse_position = point; double v = get_value(point.x); if ( m_drag_info->drag_mode == drag_info::drag_mode_move ) { if ( event.ShiftDown() ) v = nearest_tick(v); } if ( v != m_value ) { set_value(v); send_event_change_value(); } } } // slider_ctrl::on_mouse_move() /*----------------------------------------------------------------------------*/ /** * \brief The user click in the frame. * \param event The mouse event that occured. */ void bf::slider_ctrl::on_mouse_left_up( wxMouseEvent& event ) { const wxPoint point( event.GetX(), event.GetY() ); if ( m_drag_info == NULL ) event.Skip(); else { m_drag_info->mouse_position = point; if ( m_drag_info->drag_mode == drag_info::drag_mode_tick_move ) { apply_drag_mode_tick_move ( event.ControlDown(), event.AltDown() ); delete m_drag_info; m_drag_info = NULL; render(); } else if ( m_drag_info->drag_mode == drag_info::drag_mode_move ) apply_drag_mode_move( event.ShiftDown() ); if ( m_drag_info != NULL ) { m_drag_info = NULL; render(); } } } // slider_ctrl::on_mouse_left_up() /*----------------------------------------------------------------------------*/ /** * \brief The user double click in the frame. * \param event The mouse event that occured. */ void bf::slider_ctrl::on_mouse_left_dclick( wxMouseEvent& event ) { double v = get_value(event.GetX()); v = nearest_tick(v); if ( v != m_value ) { set_value(v); send_event_change_value(); } } // slider_ctrl::on_mouse_left_dclick() /*----------------------------------------------------------------------------*/ BEGIN_EVENT_TABLE(bf::slider_ctrl, wxPanel) EVT_SIZE( bf::slider_ctrl::on_size ) EVT_PAINT( bf::slider_ctrl::on_paint ) EVT_LEFT_UP( bf::slider_ctrl::on_mouse_left_up ) EVT_LEFT_DOWN( bf::slider_ctrl::on_mouse_left_down ) EVT_MOTION( bf::slider_ctrl::on_mouse_move ) EVT_LEFT_DCLICK( bf::slider_ctrl::on_mouse_left_dclick ) END_EVENT_TABLE() plee-the-bear-20251226/bear-factory/bear-editor/src/bf/code/slider_with_ticks.cpp000066400000000000000000000221211512343254000274470ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bf::slider_with_ticks class. * \author Sébastien Angibaud */ #include "bf/slider_with_ticks.hpp" #include "bf/icon/player_forward.xpm" #include "bf/icon/player_rewind.xpm" /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param parent The window owning this one. * \param id The identifier of the window. * \param value The initial value of the slider. * \param min_value The minimum allowed value. * \param max_value The maximum allowed value. */ bf::slider_with_ticks::slider_with_ticks ( wxWindow* parent, wxWindowID id, double value, double min_value, double max_value ) : super( parent, id ), m_value(value), m_min_value(min_value), m_max_value(max_value), m_previous(NULL), m_next(NULL), m_spin(NULL), m_slider(NULL) { create_controls(); } // slider_with_ticks::slider_with_ticks() /*----------------------------------------------------------------------------*/ /** * \brief Add a tick. * \param pos The position of the tick. */ void bf::slider_with_ticks::add_tick(double pos) { if ( ( pos >= 0 ) && ( pos <= m_max_value ) ) if ( m_ticks.find(pos) == m_ticks.end() ) { m_ticks.insert(pos); m_slider->render(); } } // slider_with_ticks::add_tick() /*----------------------------------------------------------------------------*/ /** * \brief Remove a tick. * \param pos The pos of the tick to remove. */ void bf::slider_with_ticks::remove_tick(double pos) { if ( m_ticks.find(pos) != m_ticks.end() ) { m_ticks.erase(pos); if ( m_value == pos ) { slider_ctrl::ticks::const_iterator it; bool ok = false; bool stop = false; double new_value = 0; for (it = m_ticks.begin(); (it != m_ticks.end() ) && !stop; ++it ) { if ( *it < m_value ) { ok = true; new_value = *it; } else stop = true; }; if ( ok ) set_value(new_value); } m_slider->render(); } } // slider_with_ticks::remove_tick() /*----------------------------------------------------------------------------*/ /** * \brief Remove all ticks. */ void bf::slider_with_ticks::clear_ticks() { m_ticks.clear(); m_slider->render(); } // slider_with_ticks::clear_ticks() /*----------------------------------------------------------------------------*/ /** * \brief Get the value. */ double bf::slider_with_ticks::get_value( ) const { return m_value; } // slider_with_ticks::get_value() /*----------------------------------------------------------------------------*/ /** * \brief Set the value. * \param value The new value; */ void bf::slider_with_ticks::set_value( double value ) { m_value = (double)((int)((value+0.0005) * 1000)) / 1000; m_slider->set_value(m_value); m_spin->SetValue(m_value); send_event_change_value(); } // slider_with_ticks::set_value() /*----------------------------------------------------------------------------*/ /** * \brief Set the maximum value. * \param max The new maximum value; */ void bf::slider_with_ticks::set_max_value( double max ) { m_max_value = max; if ( m_value > m_max_value ) set_value(m_max_value); m_slider->set_max_value(m_max_value); m_spin->SetRange(m_min_value, m_max_value); } // slider_with_ticks::set_max_value() /*----------------------------------------------------------------------------*/ /** * \brief Go to the previous tick. */ void bf::slider_with_ticks::previous_tick() { slider_ctrl::ticks::const_iterator it; bool ok = false; bool stop = false; double new_value = 0; for (it = m_ticks.begin(); (it != m_ticks.end() ) && !stop; ++it ) { if ( *it < m_value ) { ok = true; new_value = *it; } else stop = true; } if ( ok ) set_value(new_value); } // slider_with_ticks::previous_tick() /*----------------------------------------------------------------------------*/ /** * \brief Go to the next tick. */ void bf::slider_with_ticks::next_tick() { slider_ctrl::ticks::const_iterator it; bool ok = false; double new_value = 0; for (it = m_ticks.begin(); (it != m_ticks.end() ) && !ok; ++it ) if ( *it > m_value ) { ok = true; new_value = *it; } if ( ok ) set_value(new_value); } // slider_with_ticks::next_tick() /*----------------------------------------------------------------------------*/ /** * \brief Create the sub controls. */ void bf::slider_with_ticks::create_controls() { m_next = new wxBitmapButton(this, ID_NEXT, wxBitmap(player_forward_xpm)); m_previous = new wxBitmapButton(this, ID_PREVIOUS, wxBitmap(player_rewind_xpm)); m_spin = new spin_ctrl(this, ID_DATE_SPIN, wxDefaultPosition, wxDefaultSize, 0, m_min_value, m_max_value, m_value, 0.1); m_slider = new slider_ctrl (this, ID_SLIDER, m_value, m_min_value, m_max_value ); m_slider->set_ticks(&m_ticks); set_controls_position(); } // slider_with_ticks::create_controls() /*----------------------------------------------------------------------------*/ /** * \brief Set control position. */ void bf::slider_with_ticks::set_controls_position() { wxBoxSizer* s = new wxBoxSizer(wxHORIZONTAL); s->Add( m_previous ); s->Add( m_next ); s->Add( m_slider, 1, wxEXPAND ); s->Add( m_spin ); SetSizer(s); } // slider_with_ticks::set_controls_position() /*----------------------------------------------------------------------------*/ /** * \brief Fill controls. */ void bf::slider_with_ticks::fill_controls() { m_spin->SetValue(m_value); m_slider->set_value(m_value); Refresh(); } // slider_with_ticks::fill_controls() /*----------------------------------------------------------------------------*/ /** * \brief Send the event "value_change". */ void bf::slider_with_ticks::send_event_change_value() { slider_event event ( m_value, slider_event::value_change_event_type, GetId() ); event.SetEventObject(this); ProcessEvent(event); } // slider_with_ticks::send_event_change_value() /*----------------------------------------------------------------------------*/ /** * \brief Send the event "tick_move". * \param event */ void bf::slider_with_ticks::send_event_tick_move( tick_event& event ) { tick_event ev ( event.get_initial_value(), event.get_new_value(), event.get_copy(), tick_event::move_event_type, GetId() ); ev.SetEventObject(this); ProcessEvent(ev); if ( !ev.IsAllowed() ) event.Veto(); } // slider_with_ticks::send_event_tick_move() /*----------------------------------------------------------------------------*/ /** * \brief Go to the previous tick. * \param event This event occured. */ void bf::slider_with_ticks::on_previous( wxCommandEvent& WXUNUSED(event) ) { previous_tick(); } // slider_with_ticks::on_previous() /*----------------------------------------------------------------------------*/ /** * \brief Go to the next tick. * \param event This event occured. */ void bf::slider_with_ticks::on_next( wxCommandEvent& WXUNUSED(event) ) { next_tick(); } // slider_with_ticks::on_next() /*----------------------------------------------------------------------------*/ /** * \brief The current date changed. * \param event This event occured. */ void bf::slider_with_ticks::on_date_change(spin_event& event) { if ( event.get_value() != m_value ) set_value(event.get_value()); } // slider_with_ticks::on_date_change() /*----------------------------------------------------------------------------*/ /** * \brief The date of the slider changed. * \param event This event occured. */ void bf::slider_with_ticks::on_slider_change(slider_event& event) { if ( event.get_value() != m_value ) set_value(event.get_value()); } // slider_with_ticks::on_slider_change() /*----------------------------------------------------------------------------*/ /** * \brief The date of the slider changed. * \param event This event occured. */ void bf::slider_with_ticks::on_tick_move(tick_event& event) { send_event_tick_move(event); } // slider_with_ticks::on_tick_move() /*----------------------------------------------------------------------------*/ BEGIN_EVENT_TABLE(bf::slider_with_ticks, wxPanel) EVT_BUTTON( bf::slider_with_ticks::ID_PREVIOUS, bf::slider_with_ticks::on_previous ) EVT_BUTTON( bf::slider_with_ticks::ID_NEXT, bf::slider_with_ticks::on_next ) EVT_SPIN_VALUE_CHANGE( bf::slider_with_ticks::ID_DATE_SPIN, bf::slider_with_ticks::on_date_change, double ) EVT_SLIDER_VALUE_CHANGE( bf::slider_with_ticks::ID_SLIDER, bf::slider_with_ticks::on_slider_change ) EVT_TICK_MOVE( bf::slider_with_ticks::ID_SLIDER, bf::slider_with_ticks::on_tick_move ) END_EVENT_TABLE() plee-the-bear-20251226/bear-factory/bear-editor/src/bf/code/splash_screen.cpp000066400000000000000000000060231512343254000265710ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bf::splash_screen class. * \author Julien Jorge. */ #include "bf/splash_screen.hpp" #include "bf/version.hpp" #include #include #include #include /*----------------------------------------------------------------------------*/ /** * \brief Create a splash screen. * \param img_name The name of the image to display. * \param status_style The style of the static text displaying the status of the * application. */ bf::splash_screen* bf::splash_screen::create( const wxString& img_name, long status_style ) { wxLogNull no_log; // turn off the error dialog if the file does not exists wxImage::AddHandler( new wxPNGHandler() ); splash_screen* splash(NULL); wxBitmap img; #ifdef BF_IMAGES_PATH const wxString splash_path = wxT(BF_IMAGES_PATH "/") + img_name; img.LoadFile(splash_path, wxBITMAP_TYPE_PNG); #endif if ( !img.IsOk() ) // try to find the splash screen for a not installed app. { const wxFileName app( wxTheApp->argv[0] ); img.LoadFile(app.GetPath() + wxT("/../desktop/images/") + img_name); } if ( img.IsOk() ) splash = new splash_screen(img, status_style); return splash; } // splash_screen::create() #include /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param img The image in the background of the splash screen. * \param status_style The style of the static text displaying the status of the * application. */ bf::splash_screen::splash_screen( const wxBitmap& img, long status_style ) : wxSplashScreen( img, wxSPLASH_CENTRE_ON_SCREEN | wxSPLASH_NO_TIMEOUT, 0, NULL, wxID_ANY ) { m_status_label = new wxStaticText( GetSplashWindow(), wxID_ANY, _("Loading..."), wxDefaultPosition, wxDefaultSize, status_style ); m_version_label = new wxStaticText ( GetSplashWindow(), wxID_ANY, wxT(BF_VERSION_STRING) ); m_status_label->Move ( 0, GetSplashWindow()->GetSize().y - m_status_label->GetSize().y ); m_status_label->SetSize ( GetSplashWindow()->GetSize().x, m_status_label->GetSize().y ); m_version_label->Move ( GetSplashWindow()->GetSize().x - m_version_label->GetSize().x, 0 ); } // splash_screen::splash_screen() /*----------------------------------------------------------------------------*/ /** * \brief Get the label in which the status is displayed. */ wxStaticText& bf::splash_screen::get_status_label() { return *m_status_label; } // splash_screen::get_status_label() /*----------------------------------------------------------------------------*/ /** * \brief Get the label in which the version is displayed. */ wxStaticText& bf::splash_screen::get_version_label() { return *m_version_label; } // splash_screen::get_version_label() plee-the-bear-20251226/bear-factory/bear-editor/src/bf/code/sprite.cpp000066400000000000000000000163541512343254000252560ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bf::sprite class. * \author Julien Jorge */ #include "bf/sprite.hpp" #include "bf/compiled_file.hpp" #include "bf/compilation_context.hpp" #include "bf/path_configuration.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Default constructor. */ bf::sprite::sprite() : m_top(0), m_left(0), m_clip_width(0), m_clip_height(0) { } // sprite::sprite() /*----------------------------------------------------------------------------*/ /** * \brief Set the name of the image resource to use. * \param name The new value. */ void bf::sprite::set_image_name( const std::string& name ) { m_image_name = name; } // sprite::set_image_name() /*----------------------------------------------------------------------------*/ /** * \brief Set the name of the entry in the spritepos file. * \param name The new value. */ void bf::sprite::set_spritepos_entry( const std::string& name ) { m_spritepos_entry = name; } // sprite::set_spritepos_entry() /*----------------------------------------------------------------------------*/ /** * \brief Set the Y-coordinate in the image resource. * \param top The new value. */ void bf::sprite::set_top( const unsigned int top ) { if ( m_top != top ) { m_top = top; m_spritepos_entry.clear(); } } // sprite::set_top() /*----------------------------------------------------------------------------*/ /** * \brief Set the X-coordinate in the image resource. * \param left The new value. */ void bf::sprite::set_left( const unsigned int left ) { if ( m_left != left ) { m_left = left; m_spritepos_entry.clear(); } } // sprite::set_left() /*----------------------------------------------------------------------------*/ /** * \brief Set the width in the image resource. * \param width The new value. */ void bf::sprite::set_clip_width( const unsigned int width ) { if ( m_clip_width != width ) { m_clip_width = width; m_spritepos_entry.clear(); if ( get_auto_size() ) set_width(width); } } // sprite::set_clip_width() /*----------------------------------------------------------------------------*/ /** * \brief Set the height in the image resource. * \param height The new value. */ void bf::sprite::set_clip_height( const unsigned int height ) { if ( m_clip_height != height ) { m_clip_height = height; m_spritepos_entry.clear(); if ( get_auto_size() ) set_height(height); } } // sprite::set_clip_height() /*----------------------------------------------------------------------------*/ /** * \brief Set the rectangle in the image resource. * \param r The rectangle. */ void bf::sprite::set_clip_rectangle( const claw::math::rectangle& r ) { set_left(r.position.x); set_top(r.position.y); set_clip_width(r.width); set_clip_height(r.height); } // sprite::set_clip_rectangle() /*----------------------------------------------------------------------------*/ /** * \brief Get the left x-ccordinate of the sprite. */ unsigned int bf::sprite::get_left() const { return m_left; } // sprite::get_left() /*----------------------------------------------------------------------------*/ /** * \brief Get the top y-coordinate of the sprite. */ unsigned int bf::sprite::get_top() const { return m_top; } // sprite::get_top() /*----------------------------------------------------------------------------*/ /** * \brief Get the width of the sprite in the image source. */ unsigned int bf::sprite::get_clip_width() const { return m_clip_width; } // sprite::get_clip_width() /*----------------------------------------------------------------------------*/ /** * \brief Get the height of the sprite in the image source. */ unsigned int bf::sprite::get_clip_height() const { return m_clip_height; } // sprite::get_clip_height() /*----------------------------------------------------------------------------*/ /** * \brief Get the rectangle in the image resource. */ claw::math::rectangle bf::sprite::get_clip_rectangle() const { return claw::math::rectangle ( get_left(), get_top(), get_clip_width(), get_clip_height() ); } // sprite::get_clip_rectangle() /*----------------------------------------------------------------------------*/ /** * \brief Get the image name of the sprite. */ const std::string& bf::sprite::get_image_name() const { return m_image_name; } // sprite::get_image_name() /*----------------------------------------------------------------------------*/ /** * \brief Get the name of the entry in the spritepos file. */ const std::string& bf::sprite::get_spritepos_entry() const { return m_spritepos_entry; } // sprite::get_spritepos_entry() /*----------------------------------------------------------------------------*/ /** * \brief Compile the sprite. * \param f The stream in which we write the compiled sprite. * \param c The context in which the compilation is done. */ void bf::sprite::compile( compiled_file& f, compilation_context& c ) const { std::string image_path(m_image_name); if ( path_configuration::get_instance().expand_file_name ( image_path, c.get_workspace_name() ) ) path_configuration::get_instance().get_relative_path ( image_path, c.get_workspace_name() ); const compilation_context::rectangle r ( c.get_opaque_rectangle( *this, image_path ) ); f << image_path << m_left << m_top << m_clip_width << m_clip_height << r.left() << r.bottom() << r.right() << r.top(); bitmap_rendering_attributes::compile(f); } // sprite::compile() /*----------------------------------------------------------------------------*/ /** * \brief Tell if two sprites are the same. * \param that The other sprite. */ bool bf::sprite::operator==( const sprite& that ) const { return that.bitmap_rendering_attributes::operator==(*this) && (m_image_name == that.m_image_name) && (m_top == that.m_top) && (m_left == that.m_left) && (m_clip_width == that.m_clip_width) && (m_clip_height == that.m_clip_height); } // sprite::operator==() /*----------------------------------------------------------------------------*/ /** * \brief Tell if two sprites are different. * \param that The other sprite. */ bool bf::sprite::operator!=( const sprite& that ) const { return !(*this == that); } // sprite::operator!=() /*----------------------------------------------------------------------------*/ /** * \brief Compare with an other sprite in lexicographic order of their * attributes. * \param that The other sprite. */ bool bf::sprite::operator<( const sprite& that ) const { if ( m_image_name != that.m_image_name ) return m_image_name < that.m_image_name; if ( m_top != that.m_top ) return m_top < that.m_top; if ( m_left != that.m_left ) return m_left < that.m_left; if (m_clip_width != that.m_clip_width) return m_clip_width < that.m_clip_width; if ( m_clip_height != that.m_clip_height ) return m_clip_height < that.m_clip_height; return that.bitmap_rendering_attributes::operator<(*this); } // sprite::operator<() plee-the-bear-20251226/bear-factory/bear-editor/src/bf/code/sprite_edit.cpp000066400000000000000000000331201512343254000262510ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bf::sprite_edit class. * \author Sebastien Angibaud */ #include "bf/sprite_edit.hpp" #include "bf/bitmap_rendering_attributes_edit.hpp" #include "bf/image_pool.hpp" #include "bf/image_selection_dialog.hpp" #include "bf/path_configuration.hpp" #include "bf/sprite_view_ctrl.hpp" #include "bf/workspace_environment.hpp" #include "bf/wx_facilities.hpp" #include #include #include /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param parent The window owning this window. * \param env The workspace environment to use. * \param spr The initial sprite. */ bf::sprite_edit::sprite_edit ( wxWindow& parent, workspace_environment& env, const sprite& spr ) : wxPanel(&parent, wxID_ANY), base_edit(spr), m_workspace(env) { create_controls(); Fit(); } // sprite_edit::sprite_edit() /*----------------------------------------------------------------------------*/ /** * \brief Check if the displayed value is correct and, if it is, set the * value according to the display. */ bool bf::sprite_edit::validate() { if ( m_rendering_attributes->validate() ) { set_value(make_sprite()); return true; } else return false; } // sprite_edit::validate() /*----------------------------------------------------------------------------*/ /** * \brief Get the sprite corresponding to the values in the control. */ bf::sprite bf::sprite_edit::make_sprite() const { sprite result; if ( m_rendering_attributes->validate() ) { result.set_left( m_left_text->GetValue() ); result.set_top( m_top_text->GetValue() ); result.set_clip_width( m_clip_width_text->GetValue() ); result.set_clip_height( m_clip_height_text->GetValue() ); result.set_spritepos_entry ( wx_to_std_string(m_spritepos_combo->GetStringSelection()) ); result.set_image_name( wx_to_std_string(m_image_name_text->GetValue()) ); result.assign(m_rendering_attributes->get_value()); } return result; } // sprite_edit::make_sprite() /*----------------------------------------------------------------------------*/ /** * \brief Method called after changing the value by set_value(). */ void bf::sprite_edit::value_updated() { m_rendering_attributes->set_value( get_value() ); fill_controls(); } // sprite_edit::value_updated() /*----------------------------------------------------------------------------*/ /** * \brief Fill the controls with the values of the sprite. */ void bf::sprite_edit::fill_controls() { sprite spr = get_value(); m_left_text->SetValue( spr.get_left() ); m_top_text->SetValue( spr.get_top() ); m_clip_width_text->SetValue( spr.get_clip_width() ); m_clip_height_text->SetValue( spr.get_clip_height() ); m_image_name_text->SetValue( std_to_wx_string(spr.get_image_name()) ); control_sprite_size(); m_sprite_view->set_sprite( get_value() ); fill_spritepos(); m_spritepos_combo->SetStringSelection ( std_to_wx_string(spr.get_spritepos_entry()) ); } // sprite_edit::fill_controls() /*----------------------------------------------------------------------------*/ /** * \brief Create the controls of the window. */ void bf::sprite_edit::create_controls() { m_spritepos_combo = new wxChoice( this, IDC_SPRITEPOS_CHOICE, wxDefaultPosition, wxDefaultSize, wxArrayString() ); m_left_text = new wxSpinCtrl( this, IDC_RECTANGLE_CLIP_CHANGE ); m_top_text = new wxSpinCtrl( this, IDC_RECTANGLE_CLIP_CHANGE ); m_clip_width_text = new wxSpinCtrl( this, IDC_RECTANGLE_CLIP_CHANGE ); m_clip_height_text = new wxSpinCtrl( this, IDC_RECTANGLE_CLIP_CHANGE ); m_left_text->SetRange( 0, std::numeric_limits::max() ); m_top_text->SetRange( 0, std::numeric_limits::max() ); m_clip_width_text->SetRange( 0, std::numeric_limits::max() ); m_clip_height_text->SetRange( 0, std::numeric_limits::max() ); m_rendering_attributes = new bitmap_rendering_attributes_edit(*this, get_value()); m_image_name_text = new wxTextCtrl( this, wxID_ANY ); m_sprite_view = new sprite_view_ctrl(*this, m_workspace, get_value()); create_sizer_controls(); fill_controls(); } // sprite_edit::create_controls() /*----------------------------------------------------------------------------*/ /** * \brief Create the controls and add them in sizers. */ void bf::sprite_edit::create_sizer_controls() { wxBoxSizer* v_sizer = new wxBoxSizer( wxVERTICAL ); wxBoxSizer* h_sizer = new wxBoxSizer( wxHORIZONTAL ); v_sizer->Add( m_sprite_view, 1, wxEXPAND ); v_sizer->Add( new wxButton(this, wxID_REFRESH), 0, wxEXPAND ); h_sizer->Add( v_sizer, 1, wxEXPAND | wxALL, 5 ); v_sizer = new wxBoxSizer( wxVERTICAL ); v_sizer->Add( m_spritepos_combo, 0, wxEXPAND ); v_sizer->Add( create_position_sizer(), 0, wxEXPAND ); v_sizer->Add( m_rendering_attributes, 0, wxEXPAND ); v_sizer->Add( create_image_name_sizer(), 0, wxEXPAND ); h_sizer->Add( v_sizer, 1, wxEXPAND | wxALL, 5 ); SetSizer(h_sizer); } // sprite_edit::create_sizer_controls() /*----------------------------------------------------------------------------*/ /** * \brief Create the controls and the sizer for the position part. */ wxSizer* bf::sprite_edit::create_position_sizer() { wxStaticBoxSizer* result = new wxStaticBoxSizer( wxVERTICAL, this, _("Rectangle in image source") ); wxBoxSizer* s_sizer = new wxBoxSizer( wxHORIZONTAL ); s_sizer->Add ( new wxStaticText(this, wxID_ANY, _("X:")), 1, wxALIGN_CENTRE_VERTICAL | wxALL, 5 ); s_sizer->Add( m_left_text, 0, wxALL, 5 ); s_sizer->Add ( new wxStaticText(this, wxID_ANY, _("Y:")), 1, wxALIGN_CENTRE_VERTICAL | wxALL, 5 ); s_sizer->Add( m_top_text, 0, wxALL, 5 ); result->Add( s_sizer, 0, wxEXPAND, 0 ); s_sizer = new wxBoxSizer( wxHORIZONTAL ); s_sizer->Add ( new wxStaticText(this, wxID_ANY, _("Width:")), 1, wxALIGN_CENTRE_VERTICAL | wxALL, 5 ); s_sizer->Add( m_clip_width_text, 0, wxALL, 5 ); s_sizer->Add ( new wxStaticText(this, wxID_ANY, _("Height:")), 1, wxALIGN_CENTRE_VERTICAL | wxALL, 5 ); s_sizer->Add( m_clip_height_text, 0, wxALL, 5 ); result->Add( s_sizer, 0, wxEXPAND, 0 ); return result; } // sprite_edit::create_position_sizer() /*----------------------------------------------------------------------------*/ /** * \brief Create the controls and the sizer for the image name. */ wxSizer* bf::sprite_edit::create_image_name_sizer() { wxBoxSizer* result = new wxBoxSizer( wxHORIZONTAL ); wxButton* image_name_browse = new wxButton ( this, IDC_IMAGE_SELECT, wxT("..."), wxDefaultPosition, wxSize(30, -1) ); result->Add ( new wxStaticText(this, wxID_ANY, _("Image:")), 0, wxALIGN_CENTRE_VERTICAL | wxALL, 5 ); result->Add( m_image_name_text, 1, wxEXPAND | wxALL, 5 ); result->Add( image_name_browse, 0, wxALL, 5 ); return result; } // sprite_edit::create_image_name_sizer() /*----------------------------------------------------------------------------*/ /** * \brief Read the content of the potential spritepos. */ void bf::sprite_edit::fill_spritepos() { m_spritepos_combo->Clear(); image_pool::spritepos_entries e = m_workspace.get_image_pool().get_spritepos_entries ( m_image_name_text->GetValue() ); image_pool::spritepos_entries::const_iterator it; for ( it=e.begin(); it!=e.end(); ++it ) m_spritepos_combo->Append( it->first ); } // sprite_edit::fill_spritepos() /*----------------------------------------------------------------------------*/ /** * \brief Test validity of the sprite size. */ void bf::sprite_edit::control_sprite_size() { wxBitmap bmp = m_workspace.get_image_pool().get_image(m_image_name_text->GetValue()); if ( bmp.IsOk() ) { m_left_text->SetRange( 0, bmp.GetWidth() - 1 ); m_top_text->SetRange( 0, bmp.GetHeight() - 1 ); m_clip_width_text->SetRange ( 0, bmp.GetWidth() - m_left_text->GetValue() ); m_clip_height_text->SetRange ( 0, bmp.GetHeight() - m_top_text->GetValue() ); check_sprite_pos(); } } // sprite_edit::control_sprite_size() /*----------------------------------------------------------------------------*/ /** * \brief Test if current rectangle is in spritepos. */ void bf::sprite_edit::check_sprite_pos() { bool found = false; for ( unsigned int i=0; (i < m_spritepos_combo->GetCount()) && !found; ++i ) { const claw::math::rectangle r = m_workspace.get_image_pool().get_spritepos_entries ( m_image_name_text->GetValue())[m_spritepos_combo->GetString(i)]; if ( ( r.position.x == (unsigned int)m_left_text->GetValue() ) && ( r.position.y == (unsigned int)m_top_text->GetValue() ) && ( r.width == (unsigned int)m_clip_width_text->GetValue() ) && ( r.height == (unsigned int)m_clip_height_text->GetValue() ) ) { found = true; m_spritepos_combo->SetSelection(i); } } if ( ( !found ) && ( !m_spritepos_combo->GetStringSelection().IsEmpty() ) ) { m_spritepos_combo->Clear(); fill_spritepos(); } } // sprite_edit::check_sprite_pos() /*----------------------------------------------------------------------------*/ /** * \brief The user clicked on the button to select an image. * \param event This event occured. */ void bf::sprite_edit::on_image_select( wxCommandEvent& WXUNUSED(event) ) { image_selection_dialog dlg(*this, m_workspace, m_image_name_text->GetValue()); if ( dlg.ShowModal() == wxID_OK ) { m_image_name_text->SetValue( dlg.get_image_name() ); wxBitmap bmp = m_workspace.get_image_pool().get_image(dlg.get_image_name()); if ( bmp.IsOk() ) { bitmap_rendering_attributes att(m_rendering_attributes->get_value()); if ( att.width() == 0 ) att.set_width(bmp.GetWidth()); if ( att.height() == 0 ) att.set_height(bmp.GetHeight()); if ( m_clip_width_text->GetValue() == 0 ) m_clip_width_text->SetValue(bmp.GetWidth()); if ( m_clip_height_text->GetValue() == 0 ) m_clip_height_text->SetValue(bmp.GetHeight()); if ( m_left_text->GetValue() + m_clip_width_text->GetValue() > bmp.GetWidth() ) { m_left_text->SetValue(0); m_clip_width_text->SetValue(bmp.GetWidth()); } if ( m_top_text->GetValue() + m_clip_height_text->GetValue() > bmp.GetHeight() ) { m_top_text->SetValue(0); m_clip_height_text->SetValue(bmp.GetHeight()); } control_sprite_size(); if ( att.get_auto_size() ) { att.set_width( m_clip_width_text->GetValue() ); att.set_height( m_clip_height_text->GetValue() ); } m_rendering_attributes->set_value(att); } fill_spritepos(); check_sprite_pos(); } } // sprite_edit::on_image_select() /*----------------------------------------------------------------------------*/ /** * \brief The user clicked on the "Refresh" button. * \param event This event occured. */ void bf::sprite_edit::on_refresh( wxCommandEvent& WXUNUSED(event) ) { m_sprite_view->set_sprite( make_sprite() ); } // sprite_edit::on_refresh() /*----------------------------------------------------------------------------*/ /** * \brief The user change a parameter of rectangle clip. * \param event The event. */ void bf::sprite_edit::on_rectangle_clip_change( wxSpinEvent& WXUNUSED(event) ) { control_sprite_size(); } // sprite_edit::on_rectangle_clip_change() /*----------------------------------------------------------------------------*/ /** * \brief The user has selected an entry of the spritepos file. * \param event The event. */ void bf::sprite_edit::on_select_sprite_pos( wxCommandEvent& WXUNUSED(event) ) { //Set the maximum size to avoid control_sprite_size() to bound the changes. m_left_text->SetValue(0); m_top_text->SetValue(0); const claw::math::rectangle r = m_workspace.get_image_pool().get_spritepos_entries ( m_image_name_text->GetValue()) [m_spritepos_combo->GetStringSelection()]; m_clip_width_text->SetRange( 0,r.width - m_left_text->GetValue() ); m_clip_height_text->SetRange( 0, r.height - m_top_text->GetValue() ); m_clip_width_text->SetValue(m_clip_width_text->GetMax()); m_clip_height_text->SetValue(m_clip_height_text->GetMax()); m_left_text->SetValue( r.position.x ); m_top_text->SetValue( r.position.y ); m_clip_width_text->SetValue( r.width ); m_clip_height_text->SetValue( r.height ); bitmap_rendering_attributes att(m_rendering_attributes->get_value()); if ( att.get_auto_size() ) { att.set_width( r.width ); att.set_height( r.height ); } m_rendering_attributes->set_value(att); m_sprite_view->set_sprite( make_sprite() ); } // sprite_edit::on_select_sprite_pos() /*----------------------------------------------------------------------------*/ BEGIN_EVENT_TABLE(bf::sprite_edit, wxPanel) EVT_BUTTON( bf::sprite_edit::IDC_IMAGE_SELECT, bf::sprite_edit::on_image_select ) EVT_BUTTON( wxID_REFRESH, bf::sprite_edit::on_refresh ) EVT_SPINCTRL( bf::sprite_edit::IDC_RECTANGLE_CLIP_CHANGE, bf::sprite_edit::on_rectangle_clip_change ) EVT_CHOICE( bf::sprite_edit::IDC_SPRITEPOS_CHOICE, bf::sprite_edit::on_select_sprite_pos ) END_EVENT_TABLE() plee-the-bear-20251226/bear-factory/bear-editor/src/bf/code/sprite_image_cache.cpp000066400000000000000000000206461512343254000275420ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bf::sprite_image_cache class. * \author Julien Jorge */ #include "bf/sprite_image_cache.hpp" #include "bf/image_pool.hpp" #include "bf/workspace_environment.hpp" #include "bf/wx_facilities.hpp" #include #include #include #include #include /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param s The sprite. * \param w The width of the resulting image. * \param h The height of the resulting image. */ bf::sprite_image_cache::key_type::key_type ( const sprite& s, unsigned int w, unsigned int h ) : m_sprite(s), m_width(w), m_height(h) { std::ostringstream oss; oss << m_sprite.get_image_name() << "|" << trinary_logic::to_string(m_sprite.get_mirrored_status()) << "|" << trinary_logic::to_string(m_sprite.get_flipped_status()) << "|" << m_sprite.get_clip_width() << "|" << m_sprite.get_clip_height() << "|" << m_sprite.get_left() << "|" << m_sprite.get_top() << "|" << m_sprite.get_color().get_red_intensity() << "|" << m_sprite.get_color().get_green_intensity() << "|" << m_sprite.get_color().get_blue_intensity() << "|" << m_sprite.get_angle() << "|" << m_sprite.get_color().get_opacity() << "|" << m_width << "|" << m_height; m_key_string = oss.str(); } // sprite_image_cache::key_type::key_type() /*----------------------------------------------------------------------------*/ /** * \brief Compare two keys. * \param that The other key. */ bool bf::sprite_image_cache::key_type::operator<( const key_type& that ) const { return m_key_string < that.m_key_string; } // sprite_image_cache::key_type::operator<() /*----------------------------------------------------------------------------*/ /** * \brief Get the key's sprite. */ const bf::sprite& bf::sprite_image_cache::key_type::get_sprite() const { return m_sprite; } // sprite_image_cache::key_type::get_sprite() /*----------------------------------------------------------------------------*/ /** * \brief Get the key's width. */ unsigned int bf::sprite_image_cache::key_type::get_width() const { return m_width; } // sprite_image_cache::key_type::get_width() /*----------------------------------------------------------------------------*/ /** * \brief Get the key's height. */ unsigned int bf::sprite_image_cache::key_type::get_height() const { return m_height; } // sprite_image_cache::key_type::get_height() /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param env The workspace environment to use. */ bf::sprite_image_cache::sprite_image_cache(workspace_environment& env) : m_workspace(env) { } // sprite_image_cache::sprite_image_cache() /*----------------------------------------------------------------------------*/ /** * \brief Get an image. * \param s The sprite of which we want the image. * \return get_image( s, s.get_clip_width(), s.get_clip_height() ) */ std::pair bf::sprite_image_cache::get_image( const sprite& s ) { return get_image( s, s.get_clip_width(), s.get_clip_height() ); } // sprite_image_cache::get_image() /*----------------------------------------------------------------------------*/ /** * \brief Get an image. * \param s The sprite. * \param w The width of the resulting image. * \param h The height of the resulting image. * \return A pair containing the resulting image as the first member, and a * delta to apply to the position of the image to keep the new image * centered on the initial one. */ std::pair bf::sprite_image_cache::get_image ( const sprite& s, unsigned int w, unsigned int h ) { std::pair result; key_type k(s, w, h); std::map::iterator it=m_cache.find(k); if ( it == m_cache.end() ) result = add_image(k); else { ++it->second.usage_count; result = it->second.resulting_image; } return result; } // sprite_image_cache::get_image() /*----------------------------------------------------------------------------*/ /** * \brief Remove the images. */ void bf::sprite_image_cache::clear() { m_cache.clear(); } // sprite_image_cache::clear() /*----------------------------------------------------------------------------*/ /** * \brief Add a new image in the cache. * \param k The attributes of the image. * \return A pair containing the resulting image as the first member, and a * delta to apply to the position of the image to keep the new image * centered on the initial one. */ std::pair bf::sprite_image_cache::add_image( const key_type& k ) { value_type v; wxString name( std_to_wx_string(k.get_sprite().get_image_name()) ); v.usage_count = 1; v.resulting_image.second = wxPoint(0, 0); const wxRect sub_bmp ( k.get_sprite().get_left(), k.get_sprite().get_top(), k.get_sprite().get_clip_width(), k.get_sprite().get_clip_height() ); v.resulting_image.first = m_workspace.get_image_pool().get_image(name).GetSubBitmap(sub_bmp); if ( trinary_logic::to_bool(k.get_sprite().get_mirrored_status()) || trinary_logic::to_bool(k.get_sprite().get_flipped_status()) || (k.get_sprite().get_clip_width() != k.get_width()) || (k.get_sprite().get_clip_height() != k.get_height()) || (k.get_sprite().get_angle() != 0) || (k.get_sprite().get_color().get_red_intensity() != 1) || (k.get_sprite().get_color().get_green_intensity() != 1) || (k.get_sprite().get_color().get_blue_intensity() != 1) || (k.get_sprite().get_color().get_opacity() != 1) ) v.resulting_image = apply_effects ( k, v.resulting_image.first.ConvertToImage() ); m_cache[k] = v; return v.resulting_image; } // sprite_image_cache::add_image() /*----------------------------------------------------------------------------*/ /** * \brief Apply the effects of a sprite to an image. * \param k The attributes of the image. * \param bmp The initial image. * \return A pair containing the resulting image as the first member, and a * delta to apply to the position of the image to keep the new image * centered on the initial one. */ std::pair bf::sprite_image_cache::apply_effects( const key_type& k, wxBitmap bmp ) const { wxImage img( bmp.ConvertToImage() ); wxPoint pos(0, 0); if ( trinary_logic::to_bool(k.get_sprite().get_mirrored_status()) ) img = img.Mirror(true); if ( trinary_logic::to_bool(k.get_sprite().get_flipped_status()) ) img = img.Mirror(false); if ( (k.get_sprite().get_clip_width() != k.get_width()) || (k.get_sprite().get_clip_height() != k.get_height()) ) img.Rescale( k.get_width(), k.get_height() ); if ( k.get_sprite().get_angle() != 0 ) { wxPoint center(k.get_width() / 2, k.get_height() / 2); img = img.Rotate(k.get_sprite().get_angle(), center); pos = wxPoint ( center.x - img.GetWidth() / 2, center.y - img.GetHeight() / 2 ); } if ( (k.get_sprite().get_color().get_red_intensity() != 1) || (k.get_sprite().get_color().get_green_intensity() != 1) || (k.get_sprite().get_color().get_blue_intensity() != 1) ) { unsigned char* data = img.GetData(); const unsigned char* const end = data + 3 * img.GetWidth() * img.GetHeight(); for( ; data!=end; data+=3 ) { data[0] = ( (double)data[0] * k.get_sprite().get_color().get_red_intensity() ); data[1] = ( (double)data[1] * k.get_sprite().get_color().get_green_intensity() ); data[2] = ( (double)data[2] * k.get_sprite().get_color().get_blue_intensity() ); } } if ( k.get_sprite().get_color().get_opacity() != 1 ) { if ( !img.HasAlpha() ) img.SetAlpha(); unsigned char* data = img.GetAlpha(); const unsigned char* const end = data + img.GetWidth() * img.GetHeight(); for( ; data!=end; ++data ) *data = ( (double)*data * k.get_sprite().get_color().get_opacity() ); } return std::pair(wxBitmap(img), pos); } // sprite_image_cache::apply_effects() plee-the-bear-20251226/bear-factory/bear-editor/src/bf/code/sprite_view.cpp000066400000000000000000000214711512343254000263040ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bf::sprite_view class. * \author Julien Jorge */ #include "bf/sprite_view.hpp" #include "bf/workspace_environment.hpp" #include "bf/wx_facilities.hpp" #include /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param parent The parent window. * \param env The workspace environment to use. * \param id Window identifier. * \param spr The sprite to display. */ bf::sprite_view::sprite_view ( wxWindow& parent, workspace_environment& env, wxWindowID id, const sprite& spr ) : wxWindow(&parent, id), m_background_pattern( 20, 20 ), m_sprite_position(0, 0), m_sprite_delta(0, 0), m_image_cache(env), m_zoom(100) { const wxColour dark_gray(127, 127, 127); const wxColour light_gray(192, 192, 192); wxMemoryDC dc(m_background_pattern); const unsigned int w = m_background_pattern.GetWidth() / 2; const unsigned int h = m_background_pattern.GetHeight() / 2; dc.SetBrush( wxBrush(dark_gray) ); dc.SetPen( wxPen(dark_gray) ); dc.DrawRectangle( 0, 0, w, h ); dc.DrawRectangle( w, h, w, h ); dc.SetBrush( wxBrush(light_gray) ); dc.SetPen( wxPen(light_gray) ); dc.DrawRectangle( 0, h, w, h ); dc.DrawRectangle( w, 0, w, h ); set_sprite(spr); } // sprite_view::sprite_view() /*----------------------------------------------------------------------------*/ /** * \brief Set the sprite to display. * \param spr The sprite to display. */ void bf::sprite_view::set_sprite( const sprite& spr ) { m_sprite = spr; make_sprite_image(); Refresh(); } // sprite_view::set_sprite() /*----------------------------------------------------------------------------*/ /** * \brief Set the zoom ratio. * \param z The zoom ratio. */ void bf::sprite_view::set_zoom( unsigned int z ) { m_zoom = z; make_sprite_image(); Refresh(); } // sprite_view::set_zoom() /*----------------------------------------------------------------------------*/ /** * \brief Get the zoom ratio. */ unsigned int bf::sprite_view::get_zoom() const { return m_zoom; } // sprite_view::get_zoom() /*----------------------------------------------------------------------------*/ /** * \brief Compute the zoom ratio such that the image fits the control. */ void bf::sprite_view::auto_zoom() { const unsigned int z = GetSize().x * 100 / m_sprite.width(); m_zoom = GetSize().y * 100 / m_sprite.height(); if (z < m_zoom) m_zoom = z; make_sprite_image(); Refresh(); } // sprite_view::auto_zoom() /*----------------------------------------------------------------------------*/ /** * \brief Get the position of the sprite, as rendered in the view. */ wxPoint bf::sprite_view::get_view_position() const { return m_sprite_delta; } // sprite_view::get_view_position() /*----------------------------------------------------------------------------*/ /** * \brief Get the size of the sprite, as rendered in the view. */ wxSize bf::sprite_view::get_view_size() const { return wxSize( m_sprite_image.GetWidth(), m_sprite_image.GetHeight() ); } // sprite_view::get_view_size() /*----------------------------------------------------------------------------*/ /** * \brief Set the delta applied on the position of the sprite when rendering. * \param x The delta on the X-axis. * \param y The delta on the Y-axis. */ void bf::sprite_view::set_view_delta( int x, int y ) { if (get_view_size().x > GetSize().x) x -= (get_view_size().x - GetSize().x) / 2; if (get_view_size().y > GetSize().y) y -= (get_view_size().y - GetSize().y) / 2; m_sprite_delta.x = x; m_sprite_delta.y = y; Refresh(); } // sprite_view::set_view_delta() /*----------------------------------------------------------------------------*/ /** * \brief Convert a given position into initial sprite coordinate. * \param mouse_position The position of the mouse. * \param position The position into initial sprite coordinate. */ bool bf::sprite_view::convert_position (const wxPoint& mouse_position, wxPoint& position) const { bool result = true; claw::math::coordinate_2d pos; pos.x = ( (double)mouse_position.x + (double)m_sprite_delta.x - (double)m_sprite_position.x ) * 100.0 / (double)m_zoom; pos.y = ( (double)mouse_position.y + (double)m_sprite_delta.y - (double)m_sprite_position.y ) * 100.0 / (double)m_zoom; claw::math::coordinate_2d size (m_sprite_image.GetWidth(), m_sprite_image.GetHeight()); size *= (100.0 / (double)m_zoom); // rotation const double a = - m_sprite.get_angle(); pos.x = pos.x - size.x / 2; pos.y = - pos.y + size.y / 2; claw::math::coordinate_2d center(0,0); pos.rotate(center, a); position.x = pos.x + m_sprite.get_clip_width() / 2; position.y = - pos.y + m_sprite.get_clip_height() / 2; // flip and mirror if ( trinary_logic::to_bool(m_sprite.get_mirrored_status()) ) position.x = m_sprite.get_clip_width() - position.x; if ( trinary_logic::to_bool(m_sprite.get_flipped_status()) ) position.y = m_sprite.get_clip_height() - position.y; // Check if position is in the sprite if ( position.x < 0 || position.y < 0 || position.x > (int)m_sprite.get_clip_width() || position.y > (int)m_sprite.get_clip_height() ) result = false; return result; } // sprite_view::convert_position() /*----------------------------------------------------------------------------*/ /** * \brief Draw the sprite. */ void bf::sprite_view::render() { wxBufferedPaintDC dc( this ); if( IsShown() ) { fill_background(dc); draw_sprite(dc); draw_box(dc); } } // sprite_view::render() /*----------------------------------------------------------------------------*/ /** * \brief Fill the background of the control. * \param dc The device context for the drawings. */ void bf::sprite_view::fill_background( wxDC& dc ) const { for( int y=0; y All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bf::sprite_view_ctrl class. * \author Julien Jorge */ #include "bf/sprite_view_ctrl.hpp" #include "bf/sprite_view.hpp" #include "bf/icon/zoom_original.xpm" #include "bf/icon/zoom_in.xpm" #include "bf/icon/zoom_out.xpm" #include "bf/wx_facilities.hpp" #include "bf/icon/zoom_fit.xpm" /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param parent The parent window. * \param env The workspace environment to use. * \param spr The sprite to display. */ bf::sprite_view_ctrl::sprite_view_ctrl ( wxWindow& parent, workspace_environment& env, const sprite& spr ) : wxPanel(&parent), m_sprite_view(NULL), m_workspace(env) { create_controls(); create_sizers(); set_sprite(spr); m_combo_zoom->SetSelection( m_combo_zoom->FindString(wxT("100")) ); adjust_scrollbars(); } // sprite_view_ctrl::sprite_view_ctrl() /*----------------------------------------------------------------------------*/ /** * \brief Set the sprite to display. * \param spr The sprite to display. */ void bf::sprite_view_ctrl::set_sprite( const sprite& spr ) { m_sprite_view->set_sprite(spr); } // sprite_view_ctrl::set_sprite() /*----------------------------------------------------------------------------*/ /** * \brief Create the controls. */ void bf::sprite_view_ctrl::create_controls() { wxArrayString choices; choices.Add( wxT("10") ); choices.Add( wxT("25") ); choices.Add( wxT("33") ); choices.Add( wxT("50") ); choices.Add( wxT("66") ); choices.Add( wxT("75") ); choices.Add( wxT("100") ); choices.Add( wxT("200") ); choices.Add( wxT("400") ); m_sprite_view = new sprite_view(*this, m_workspace, ID_SPRITE_VIEW); m_sprite_view->Connect ( ID_SPRITE_VIEW, wxEVT_MOTION, wxMouseEventHandler(sprite_view_ctrl::on_mouse_move), NULL, this ); m_combo_zoom = new wxComboBox ( this, ID_COMBO_ZOOM, wxT("100"), wxDefaultPosition, wxDefaultSize, choices, wxCB_DROPDOWN | wxTE_PROCESS_ENTER ); m_mouse_position = new wxStaticText ( this, wxID_ANY, wxT("( X = ? ; Y = ? )"), wxDefaultPosition, wxDefaultSize, wxALIGN_RIGHT); m_h_scrollbar = new wxScrollBar(this, wxID_ANY); m_v_scrollbar = new wxScrollBar ( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSB_VERTICAL ); } // sprite_view_ctrl::create_controls() /*----------------------------------------------------------------------------*/ /** * \brief Create the sizers. */ void bf::sprite_view_ctrl::create_sizers() { wxBoxSizer* h_sizer = new wxBoxSizer( wxHORIZONTAL ); wxBoxSizer* v_sizer = new wxBoxSizer( wxVERTICAL ); v_sizer->Add(m_v_scrollbar, 1, wxEXPAND); h_sizer->Add(m_sprite_view, 1, wxEXPAND); h_sizer->Add(v_sizer, 0, wxEXPAND); v_sizer = new wxBoxSizer(wxVERTICAL); v_sizer->Add(h_sizer, 1, wxEXPAND); h_sizer = new wxBoxSizer(wxHORIZONTAL); h_sizer->Add(m_h_scrollbar, 1, wxALIGN_BOTTOM); h_sizer->Add ( new wxWindow ( this, wxID_ANY, wxDefaultPosition, wxSize( m_v_scrollbar->GetSize().x, m_h_scrollbar->GetSize().y ) ), 0 ); v_sizer->Add(h_sizer, 0, wxEXPAND); h_sizer = new wxBoxSizer(wxHORIZONTAL); h_sizer->Add ( new wxBitmapButton(this, ID_ZOOM_100, wxBitmap(zoom_original_xpm)) ); h_sizer->Add ( new wxBitmapButton(this, ID_ZOOM_FIT, wxBitmap(zoom_fit_xpm)) ); h_sizer->Add ( new wxBitmapButton(this, ID_ZOOM_IN, wxBitmap(zoom_in_xpm)) ); h_sizer->Add ( new wxBitmapButton(this, ID_ZOOM_OUT, wxBitmap(zoom_out_xpm)) ); h_sizer->Add( m_combo_zoom, 1, wxEXPAND ); h_sizer->Add( m_mouse_position, 2, wxEXPAND ); //v_sizer->Add( m_sprite_view, 1, wxEXPAND ); v_sizer->Add( h_sizer, 0, wxEXPAND ); SetSizer( v_sizer ); } // sprite_view_ctrl::create_sizers() /*----------------------------------------------------------------------------*/ /** * \brief Set the zoom according to the value in the combo box. */ void bf::sprite_view_ctrl::set_zoom_from_combo() { long z; if ( m_combo_zoom->GetValue().ToLong(&z) ) { if ((int)z <= 0) z = 0; m_sprite_view->set_zoom( z ); } adjust_scrollbars(); } // sprite_view_ctrl::set_zoom_from_combo() /*----------------------------------------------------------------------------*/ /** * \brief Adjust the bounds and the position of the toolbars. */ void bf::sprite_view_ctrl::adjust_scrollbars() { m_h_scrollbar->SetScrollbar ( m_sprite_view->get_view_position().x, m_sprite_view->GetSize().x, m_sprite_view->get_view_size().x, (3 * m_sprite_view->GetSize().x) / 4, true ); m_v_scrollbar->SetScrollbar ( m_sprite_view->get_view_position().y, m_sprite_view->GetSize().y, m_sprite_view->get_view_size().y, (3 * m_sprite_view->GetSize().y) / 4, true ); } // sprite_view_ctrl::adjust_scrollbars() /*----------------------------------------------------------------------------*/ /** * \brief Answer to a click on "Zoom 100%". * \param event This event occured. */ void bf::sprite_view_ctrl::on_zoom_100( wxCommandEvent& WXUNUSED(event) ) { m_combo_zoom->SetSelection( m_combo_zoom->FindString(wxT("100")) ); m_sprite_view->set_zoom( 100 ); adjust_scrollbars(); } // sprite_view_ctrl::on_zoom_100() /*----------------------------------------------------------------------------*/ /** * \brief Answer to a click on "Zoom fit". * \param event This event occured. */ void bf::sprite_view_ctrl::on_zoom_fit( wxCommandEvent& WXUNUSED(event) ) { m_sprite_view->auto_zoom(); m_combo_zoom->SetValue ( wxString::Format(wxT("%d"), m_sprite_view->get_zoom()) ); adjust_scrollbars(); } // sprite_view_ctrl::on_zoom_fit() /*----------------------------------------------------------------------------*/ /** * \brief Answer to a click on "Zoom in". * \param event This event occured. */ void bf::sprite_view_ctrl::on_zoom_in( wxCommandEvent& WXUNUSED(event) ) { int index = m_combo_zoom->GetSelection(); if( index == wxNOT_FOUND ) { m_sprite_view->set_zoom( m_sprite_view->get_zoom() + 50 ); m_combo_zoom->SetValue ( wxString::Format(wxT("%d"), m_sprite_view->get_zoom()) ); } else if ( (unsigned int)index + 1 < m_combo_zoom->GetCount() ) { m_combo_zoom->SetSelection(index + 1); set_zoom_from_combo(); } adjust_scrollbars(); } // sprite_view_ctrl::on_zoom_in() /*----------------------------------------------------------------------------*/ /** * \brief Answer to a click on "Zoom out". * \param event This event occured. */ void bf::sprite_view_ctrl::on_zoom_out( wxCommandEvent& WXUNUSED(event) ) { int index = m_combo_zoom->GetSelection(); if( index == wxNOT_FOUND ) { if ( m_sprite_view->get_zoom() > 50 ) m_sprite_view->set_zoom( m_sprite_view->get_zoom() - 50 ); else m_sprite_view->set_zoom( 1 ); m_combo_zoom->SetValue ( wxString::Format(wxT("%d"), m_sprite_view->get_zoom()) ); } else if ( index > 0 ) { m_combo_zoom->SetSelection(index - 1); set_zoom_from_combo(); } adjust_scrollbars(); } // sprite_view_ctrl::on_zoom_out() /*----------------------------------------------------------------------------*/ /** * \brief The user selected a zoom in the combo box. * \param event This event occured. */ void bf::sprite_view_ctrl::on_zoom_selection( wxCommandEvent& WXUNUSED(event) ) { set_zoom_from_combo(); } // sprite_view_ctrl::on_zoom_selection() /*----------------------------------------------------------------------------*/ /** * \brief Change the position of the view. * \param event The scroll event. */ void bf::sprite_view_ctrl::on_scroll( wxScrollEvent& WXUNUSED(event) ) { m_sprite_view->set_view_delta ( m_h_scrollbar->GetThumbPosition(), m_v_scrollbar->GetThumbPosition() ); } // sprite_view_ctrl::on_scroll() /*----------------------------------------------------------------------------*/ /** * \brief Event sent to a resized window. * \param event The event. */ void bf::sprite_view_ctrl::on_size( wxSizeEvent& event ) { adjust_scrollbars(); event.Skip(); } // sprite_view_ctrl::on_size() /*----------------------------------------------------------------------------*/ /** * \brief The mouse move in the sprite_view. * \param event The mouse event that occured. */ void bf::sprite_view_ctrl::on_mouse_move(wxMouseEvent& event) { if ( m_sprite_view != NULL ) { wxPoint pos; std::ostringstream out; if ( m_sprite_view->convert_position(event.GetPosition(), pos ) ) out << "( X = " << pos.x << " ; Y = " << pos.y << " )"; else out << "( X = ? ; Y = ? )"; m_mouse_position->SetLabel( std_to_wx_string(out.str()) ); } else std::cout << "NULL" << std::endl; } // sprite_view_ctrl::on_mouse_move() /*----------------------------------------------------------------------------*/ BEGIN_EVENT_TABLE(bf::sprite_view_ctrl, wxPanel) EVT_BUTTON( bf::sprite_view_ctrl::ID_ZOOM_100, bf::sprite_view_ctrl::on_zoom_100 ) EVT_BUTTON( bf::sprite_view_ctrl::ID_ZOOM_FIT, bf::sprite_view_ctrl::on_zoom_fit ) EVT_BUTTON( bf::sprite_view_ctrl::ID_ZOOM_IN, bf::sprite_view_ctrl::on_zoom_in ) EVT_BUTTON( bf::sprite_view_ctrl::ID_ZOOM_OUT, bf::sprite_view_ctrl::on_zoom_out ) EVT_COMBOBOX( bf::sprite_view_ctrl::ID_COMBO_ZOOM, bf::sprite_view_ctrl::on_zoom_selection ) EVT_TEXT_ENTER( bf::sprite_view_ctrl::ID_COMBO_ZOOM, bf::sprite_view_ctrl::on_zoom_selection ) EVT_SCROLL( bf::sprite_view_ctrl::on_scroll ) EVT_SIZE( bf::sprite_view_ctrl::on_size ) END_EVENT_TABLE() plee-the-bear-20251226/bear-factory/bear-editor/src/bf/code/stream_conv.cpp000066400000000000000000000052261512343254000262640ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation the the specialisations of the bf::stream_conv class. * \author Julien Jorge */ #include "bf/stream_conv.hpp" #include "bf/wx_facilities.hpp" #include #include #include /*----------------------------------------------------------------------------*/ /** * \brief Read the value from a stream. * \param is The stream in which we read. * \param v The value we have read. */ std::istream& bf::stream_conv::read( std::istream& is, value_type& v ) { value_type::value_type real_v; // an empty string is ok if ( is.rdbuf()->in_avail() == 0 ) v.set_value(real_v); else if ( std::getline(is, real_v) ) v.set_value(real_v); return is; } // read() /*----------------------------------------------------------------------------*/ /** * \brief Read the value from a stream. * \param is The stream in which we read. * \param v The value we have read. */ std::istream& bf::stream_conv< bf::custom_type >::read ( std::istream& is, value_type& v ) { std::string t; bool result = false; // an empty string is ok if ( std::getline(is, t) ) if ( (t == "1") || (t == "true") || (std_to_wx_string(t) == _("true")) ) result = true; v.set_value(result); return is; } // read() /*----------------------------------------------------------------------------*/ /** * \brief Read the value from a stream. * \param is The stream in which we read. * \param v The value we have read. */ std::istream& bf::stream_conv< bf::color >::read ( std::istream& is, value_type& v ) { std::string t; color result; // an empty string is ok while ( std::getline(is, t, ',') ) { std::vector sp; claw::text::split(sp, t, '='); if (sp.size() != 1) { double d; std::istringstream iss( sp.back() ); iss >> d; if ( sp.front() == " red" ) result.set_intensity ( d, result.get_green_intensity(), result.get_blue_intensity() ); else if ( sp.front() == " green" ) result.set_intensity ( result.get_red_intensity(), d, result.get_blue_intensity() ); else if ( sp.front() == " blue" ) result.set_intensity ( result.get_red_intensity(), result.get_green_intensity(), d ); else result.set_opacity( d ); } } v = result; return is; } // read() plee-the-bear-20251226/bear-factory/bear-editor/src/bf/code/tree_builder.cpp000066400000000000000000000054041512343254000264070ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bf::tree_builder class. * \author Julien Jorge */ #include "bf/tree_builder.hpp" #include "bf/wx_facilities.hpp" #include /*----------------------------------------------------------------------------*/ /** * \brief Add a hierarchy in the tree. * \param entries The elements in the hierarchy. * \param sep The character separing the entries in \a entries. */ void bf::tree_builder::add_entries( const std::string& entries, char sep ) { std::list ent; claw::text::split( ent, entries, sep ); insert_entries( m_tree, ent ); } // tree_builder::add_entries() /*----------------------------------------------------------------------------*/ /** * \brief Create a wxTreeCtrl from the tree. * \param result The resulting tree. */ void bf::tree_builder::create_wxTree( wxTreeCtrl& result ) const { tree_type::const_iterator it; for (it=m_tree.begin(); it!=m_tree.end(); ++it ) create_wxTree( result, result.GetRootItem(), *it ); result.SortChildren(result.GetRootItem()); } // tree_builder::create_wxTree() /*----------------------------------------------------------------------------*/ /** * \brief Create the subtrees of the wxTreeCtrl. * \param result The resulting tree. * \param parent The identifier of the parent node. * \param t The tree to convert. */ void bf::tree_builder::create_wxTree ( wxTreeCtrl& result, wxTreeItemId parent, const tree_type& t ) const { wxTreeItemId node = result.AppendItem( parent, std_to_wx_string(t.value) ); if ( !t.is_leaf() ) { result.SetItemBackgroundColour(node, *wxLIGHT_GREY); result.SetItemBold(node, true); tree_type::const_iterator it; for (it=t.begin(); it!=t.end(); ++it ) create_wxTree( result, node, *it ); } result.SortChildren(node); } // tree_builder::create_wxTree() /*----------------------------------------------------------------------------*/ /** * \brief Insert a hierarchy in the tree and avoid duplicates. * \param node (out) The node in which the hierarchy is inserted. * \param entries The elements in the hierarchy. The last element is the leaf. */ void bf::tree_builder::insert_entries ( tree_type& node, std::list& entries ) const { if ( !entries.empty() ) { std::string ent( entries.front() ); entries.pop_front(); tree_type::iterator it = node.find( ent ); if ( it == node.end() ) insert_entries( node.add_child(ent), entries ); else insert_entries( *it, entries ); } } // tree_builder::insert_entries() plee-the-bear-20251226/bear-factory/bear-editor/src/bf/code/trinary_logic.cpp000066400000000000000000000047411512343254000266120ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the trinary_logic class. * \author Sebastien Angibaud */ #include "bf/trinary_logic.hpp" #include /*----------------------------------------------------------------------------*/ /** * \brief Convert an action into its string representation. * \param value The boolean to convert. */ std::string bf::trinary_logic::to_string( value_type value ) { std::string result("boolean_random"); switch(value) { case boolean_true: result = "boolean_true" ; break; case boolean_false: result = "boolean_false" ; break; } return result; } // trinary_logic::to_string() /*----------------------------------------------------------------------------*/ /** * \brief Convert a string into an action. * \param s The boolean to convert. */ bf::trinary_logic::value_type bf::trinary_logic::from_string( const std::string& s ) { value_type b(boolean_random); if ( s == "boolean_true" ) b = boolean_true; else if ( s == "boolean_false" ) b = boolean_false; return b; } // trinary_logic::from_string() /*----------------------------------------------------------------------------*/ /** * \brief Convert a trinary boolean into boolean type. * Boolean random is converted into false. * \param value The trinary boolean to convert. */ bool bf::trinary_logic::to_bool( value_type value ) { return (value == boolean_true); } // trinary_logic::to_bool() /*----------------------------------------------------------------------------*/ /** * \brief Convert a boolean into trinary boolean. * \param value The trinary boolean to convert. */ bf::trinary_logic::value_type bf::trinary_logic::from_bool( bool value ) { if ( value ) return boolean_true; else return boolean_false; } // trinary_logic::from_bool() /*----------------------------------------------------------------------------*/ /** * \brief Convert an action into boolean type. Boolean random is converted * by randomize. * \param value The boolean to convert. */ bool bf::trinary_logic::to_random_bool( value_type value ) { bool result(false); switch(value) { case boolean_true: result = true ; break; case boolean_random: return ( (2.0 * (double)rand()) / RAND_MAX ) < 1; } return result; } // trinary_logic::to_random_bool() plee-the-bear-20251226/bear-factory/bear-editor/src/bf/code/type_field.cpp000066400000000000000000000136051512343254000260700ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bf::type_field class. * \author Julien Jorge */ #include "bf/type_field.hpp" #include /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param name The name of the field. * \param ft The type of the field. */ bf::type_field::type_field( const std::string& name, field_type ft ) : m_name(name), m_field_type(ft), m_required(false), m_is_list(false) { } // type_field::type_field() /*----------------------------------------------------------------------------*/ /** * \brief Destructor. */ bf::type_field::~type_field() { } // type_field::~type_field() /*----------------------------------------------------------------------------*/ /** * \brief Get a copy of this instance. */ bf::type_field* bf::type_field::clone() const { return new type_field(*this); } // type_field::clone() /*----------------------------------------------------------------------------*/ /** * \brief Get the typname of the field. */ const std::string& bf::type_field::get_name() const { return m_name; } // type_field::get_name() /*----------------------------------------------------------------------------*/ /** * \brief Get the type of the field. */ bf::type_field::field_type bf::type_field::get_field_type() const { return m_field_type; } // type_field::get_field_type() /*----------------------------------------------------------------------------*/ /** * \brief Get the type of the range of valid values. */ bf::type_field::range_type bf::type_field::get_range_type() const { return field_range_free; } // type_field::get_range_type() /*----------------------------------------------------------------------------*/ /** * \brief Get the set of valid values for this field. * \param values (out) The valid values. */ void bf::type_field::get_set( std::list& values ) const { // nothing to do } // type_field::get_set() /*----------------------------------------------------------------------------*/ /** * \brief Get the interval of valid values for this field. * \param min Minimum valid value. * \param max Maximum valid value. */ void bf::type_field::get_interval( int& min, int& max ) const { min = max = 0; } // type_field::get_interval() /*----------------------------------------------------------------------------*/ /** * \brief Get the interval of valid values for this field. * \param min Minimum valid value. * \param max Maximum valid value. */ void bf::type_field::get_interval( unsigned int& min, unsigned int& max ) const { min = max = 0; } // type_field::get_interval() /*----------------------------------------------------------------------------*/ /** * \brief Get the interval of valid values for this field. * \param min Minimum valid value. * \param max Maximum valid value. */ void bf::type_field::get_interval( double& min, double& max ) const { min = max = 0; } // type_field::get_interval() /*----------------------------------------------------------------------------*/ /** * \brief Get the name of the fields that must be defined before this one. */ const std::set& bf::type_field::get_preceding() const { return m_preceding; } // type_field::get_preceding() /*----------------------------------------------------------------------------*/ /** * \brief Set the names of the fields that must be defined before this one. * \param prec The names of the fields that must be defined before this one. */ void bf::type_field::set_preceding( const std::list& prec ) { m_preceding.insert(prec.begin(), prec.end()); } // type_field::set_preceding() /*----------------------------------------------------------------------------*/ /** * \brief Tell if this field must be filled. * \param r Required or not? */ void bf::type_field::set_required( bool r ) { m_required = r; } // type_field::set_required() /*----------------------------------------------------------------------------*/ /** * \brief Tell if this field is required or optional. */ bool bf::type_field::get_required() const { return m_required; } // type_field::get_required() /*----------------------------------------------------------------------------*/ /** * \brief Give a description to this node. * \param str The description. */ void bf::type_field::set_description( const std::string& str ) { m_description = str; } // type_field::set_description() /*----------------------------------------------------------------------------*/ /** * \brief Get the description of this field. */ const std::string& bf::type_field::get_description() const { return m_description; } // type_field::get_description() /*----------------------------------------------------------------------------*/ /** * \brief Give the string representation of the default value of the field. * \param str The value. */ void bf::type_field::set_default_value( const std::string& str ) { m_default_value = str; } // type_field::set_default_value() /*----------------------------------------------------------------------------*/ /** * \brief Get the string representation of the default value of this field. */ const std::string& bf::type_field::get_default_value() const { return m_default_value; } // type_field::get_default_value() /*----------------------------------------------------------------------------*/ /** * \brief Tell if this field is a list of values. * \param v List or not? */ void bf::type_field::set_is_list( bool v ) { m_is_list = v; } // type_field::set_is_list() /*----------------------------------------------------------------------------*/ /** * \brief Tell if this field is a list of values. */ bool bf::type_field::is_list() const { return m_is_list; } // type_field::is_list() plee-the-bear-20251226/bear-factory/bear-editor/src/bf/code/type_field_interval.cpp000066400000000000000000000037531512343254000277770ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the specialized methods of the * bf::type_field_interval class. * \author Julien Jorge */ #include "bf/type_field_interval.hpp" namespace bf { /*--------------------------------------------------------------------------*/ /** * \brief Constructor. * \param name The name of the field. * \param min The minimum valid value of the interval. * \param max The maximum valid value of the interval. */ template<> type_field_interval::type_field_interval ( const std::string& name, int min, int max ) : type_field( name, type_field::integer_field_type ), m_min(min), m_max(max) { } // type_field_interval::type_field_interval() } namespace bf { /*--------------------------------------------------------------------------*/ /** * \brief Constructor. * \param name The name of the field. * \param min The minimum valid value of the interval. * \param max The maximum valid value of the interval. */ template<> type_field_interval::type_field_interval ( const std::string& name, unsigned int min, unsigned int max ) : type_field( name, type_field::u_integer_field_type ), m_min(min), m_max(max) { } // type_field_interval::type_field_interval() } namespace bf { /*--------------------------------------------------------------------------*/ /** * \brief Constructor. * \param name The name of the field. * \param min The minimum valid value of the interval. * \param max The maximum valid value of the interval. */ template<> type_field_interval::type_field_interval ( const std::string& name, double min, double max ) : type_field(name, type_field::real_field_type), m_min(min), m_max(max) { } // type_field_interval::type_field_interval() } plee-the-bear-20251226/bear-factory/bear-editor/src/bf/code/type_field_set.cpp000066400000000000000000000031141512343254000267350ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bf::type_field_set class. * \author Julien Jorge */ #include "bf/type_field_set.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param name The name of the field. * \param ft The type of the field. * \param values The valid values for this field. */ bf::type_field_set::type_field_set ( const std::string& name, field_type ft, const std::list& values ) : type_field( name, ft ), m_values(values) { } // type_field_set::type_field_set() /*----------------------------------------------------------------------------*/ /** * \brief Get a copy of this instance. */ bf::type_field* bf::type_field_set::clone() const { return new type_field_set(*this); } // type_field_set::clone() /*----------------------------------------------------------------------------*/ /** * \brief Get the type of the range of valid values. */ bf::type_field::range_type bf::type_field_set::get_range_type() const { return field_range_set; } // type_field_set::get_range_type() /*----------------------------------------------------------------------------*/ /** * \brief Get the set of valid values for this field. * \param values (out) The valid values. */ void bf::type_field_set::get_set( std::list& values ) const { values = m_values; } // type_field_set::get_set() plee-the-bear-20251226/bear-factory/bear-editor/src/bf/code/workspace.cpp000066400000000000000000000102131512343254000257320ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bf::workspace class. * \author Sebastien Angibaud */ #include "bf/workspace.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ bf::workspace::workspace() { } // workspace::workspace() /*----------------------------------------------------------------------------*/ /** * \brief Set the run path. * \param path The new run path. */ void bf::workspace::set_run_path(const std::string& path) { m_run_path = path; } // workspace::set_run_path() /*----------------------------------------------------------------------------*/ /** * \brief Get the run path. */ std::string bf::workspace::get_run_path() const { return m_run_path; } // workspace::get_run_path() /*----------------------------------------------------------------------------*/ /** * \brief Add a path on item class. * \param path The path to add. */ void bf::workspace::add_item_class_path( const std::string& path ) { m_item_class_path.push_back(path); } // workspace::add_item_class_path() /*----------------------------------------------------------------------------*/ /** * \brief Clear paths on item class. */ void bf::workspace::clear_item_class_path() { m_item_class_path.clear(); } // workspace::clear_item_class_path() /*----------------------------------------------------------------------------*/ /** * \brief Add a pth on data. * \param path The path to add. */ void bf::workspace::add_data_path( const std::string& path ) { m_data_path.push_back(path); } // workspace::add_data_path() /*----------------------------------------------------------------------------*/ /** * \brief Clear paths on data. */ void bf::workspace::clear_data_path() { m_data_path.clear(); } // workspace::clear_data_path() /*----------------------------------------------------------------------------*/ /** * \brief Clear the workspace. */ void bf::workspace::clear() { m_item_class_path.clear(); m_data_path.clear(); } // workspace::clear() /*----------------------------------------------------------------------------*/ /** * \brief Get the item class path. */ const bf::workspace::path_list& bf::workspace::get_item_class_path() const { return m_item_class_path; } // workspace::get_item_class_path() /*----------------------------------------------------------------------------*/ /** * \brief Return the begin of item class list. */ bf::workspace::path_list_const_iterator bf::workspace::item_class_begin() const { return m_item_class_path.begin(); } // workspace::item_class_begin() /*----------------------------------------------------------------------------*/ /** * \brief Return the begin of item class list. */ bf::workspace::path_list_const_iterator bf::workspace::item_class_end() const { return m_item_class_path.end(); } // workspace::item_class_end() /*----------------------------------------------------------------------------*/ /** * \brief Return the begin of item class list. */ bf::workspace::path_list_const_iterator bf::workspace::data_begin() const { return m_data_path.begin(); } // workspace::data_begin() /*----------------------------------------------------------------------------*/ /** * \brief Return the begin of item class list. */ bf::workspace::path_list_const_iterator bf::workspace::data_end() const { return m_data_path.end(); } // workspace::data_end() /*----------------------------------------------------------------------------*/ /** * \brief Return the begin of item class list (reverse iterator). */ bf::workspace::path_list_const_reverse_iterator bf::workspace::data_rbegin() const { return m_data_path.rbegin(); } // workspace::data_rbegin() /*----------------------------------------------------------------------------*/ /** * \brief Return the begin of item class list (reverse iterator). */ bf::workspace::path_list_const_reverse_iterator bf::workspace::data_rend() const { return m_data_path.rend(); } // workspace::data_rend() plee-the-bear-20251226/bear-factory/bear-editor/src/bf/code/workspace_environment.cpp000066400000000000000000000034251512343254000303650ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the workspace_environment class. * \author Sebastien Angibaud */ #include "bf/workspace_environment.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ bf::workspace_environment::workspace_environment() : m_image_pool(NULL), m_item_class_pool(NULL) { } // workspace_environment::workspace_environment() /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param n The name of the workspace. */ bf::workspace_environment::workspace_environment( const std::string& name ) : m_name(name), m_image_pool( new image_pool(name) ), m_item_class_pool( new item_class_pool(name) ) { } // workspace_environment::workspace_environment() /*----------------------------------------------------------------------------*/ /** * \brief Get the name of the workspace. */ const std::string& bf::workspace_environment::get_name() const { return m_name; } // workspace_environment::get_name() /*----------------------------------------------------------------------------*/ /** * \brief Get the image pool. */ const bf::image_pool& bf::workspace_environment::get_image_pool() const { return *m_image_pool; } // workspace_environment::get_image_pool() /*----------------------------------------------------------------------------*/ /** * \brief Get the item class pool. */ const bf::item_class_pool& bf::workspace_environment::get_item_class_pool() const { return *m_item_class_pool; } // workspace_environment::get_item_class_pool() plee-the-bear-20251226/bear-factory/bear-editor/src/bf/code/wx_type_cast.cpp000066400000000000000000000030361512343254000264520ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the utility functions to cast from and to wxWidgets * types. * \author Julien Jorge */ #include "bf/wx_type_cast.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Builds a position_type frow a wxPoint. * \param p The point to convert. */ bf::position_type bf::wx_to_position( wxPoint p ) { return position_type( p.x, p.y ); } // wx_to_position() /*----------------------------------------------------------------------------*/ /** * \brief Builds a wxPoint from a position_type. * \param p The point to convert. */ wxPoint bf::position_to_wx( position_type p ) { return wxPoint( p.x, p.y ); } // position_to_wx() /*----------------------------------------------------------------------------*/ /** * \brief Builds a rectangle from a wxRect. * \param r The rectangle to convert. */ bf::rectangle_type bf::wx_to_rectangle( wxRect r ) { return rectangle_type( r.GetLeft(), r.GetBottom(), r.GetRight(), r.GetTop() ); } // wx_to_rectangle() /*----------------------------------------------------------------------------*/ /** * \brief Builds a wxRect from a rectangle. * \param r The rectangle to convert. */ wxRect bf::rectangle_to_wx( rectangle_type r ) { return wxRect( r.left(), r.bottom(), r.width(), r.height() ); } // rectangle_to_wx() plee-the-bear-20251226/bear-factory/bear-editor/src/bf/color.hpp000066400000000000000000000026461512343254000241600ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief The value of a field of type "color". * \author Sébastien Angibaud */ #ifndef __BF_COLOR_HPP__ #define __BF_COLOR_HPP__ #include "bf/libeditor_export.hpp" #include namespace bf { class compiled_file; /** * \brief Color type. * \author Sébastien Angibaud */ class BEAR_EDITOR_EXPORT color { public: color(); color(double red, double green, double blue, double opacity); double get_opacity() const; void set_opacity( double opacity ); double get_red_intensity() const; double get_green_intensity() const; double get_blue_intensity() const; void set_intensity( double r, double g, double b ); void compile( compiled_file& f ) const; bool operator==( const color& that ) const; bool operator!=( const color& that ) const; bool operator<( const color& that ) const; private: /** \brief Pixel intensity. */ double m_opacity; /** \brief Intensity of the red channel. */ double m_red_intensity; /** \brief Intensity of the green channel. */ double m_green_intensity; /** \brief Intensity of the blue channel. */ double m_blue_intensity; }; // class color } // namespace bf #endif // __BF_COLOR_HPP__ plee-the-bear-20251226/bear-factory/bear-editor/src/bf/color_edit.hpp000066400000000000000000000026421512343254000251610ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Control for editing a field whose value is a color. * \author Sébastien Angibaud */ #ifndef __BF_COLOR_EDIT_HPP__ #define __BF_COLOR_EDIT_HPP__ #include "bf/base_edit.hpp" #include "bf/default_value.hpp" #include "bf/color.hpp" #include "bf/spin_ctrl.hpp" #include "bf/libeditor_export.hpp" #include #include namespace bf { /** * \brief Control for editing a field whose value is a a color. * \author Sébastien Angibaud */ class BEAR_EDITOR_EXPORT color_edit: public wxPanel, public base_edit { public: color_edit ( wxWindow& parent, const color& v = default_value::get() ); color_edit ( wxWindow* parent, const color& v = default_value::get() ); bool validate(); private: color make_color() const; void value_updated(); void fill_controls(); void create_controls(); void create_sizer_controls(); private: /** \brief The control for setting the color. */ wxColourPickerCtrl * m_picker; /** \brief The control for setting the opacity of the color. */ bf::spin_ctrl* m_opacity_spin; }; // class color_edit } // namespace bf #endif // __BF_COLOR_EDIT_HPP__ plee-the-bear-20251226/bear-factory/bear-editor/src/bf/compilation_context.hpp000066400000000000000000000047111512343254000271170ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief The compilation context keep some data used during the compilation of * the resources. * \author Julien Jorge */ #ifndef __BF_COMPILATION_CONTEXT_HPP__ #define __BF_COMPILATION_CONTEXT_HPP__ #include "bf/sprite_image_cache.hpp" #include "bf/libeditor_export.hpp" #include #include #include namespace bf { class sprite; class workspace_environment; /** * \brief The compilation context keep some data used during the compilation * of the resources. * \author Julien Jorge */ class BEAR_EDITOR_EXPORT compilation_context { public: /** \brief The type of the opaque rectangles. */ typedef claw::math::box_2d rectangle; private: /** \brief The type of the structure associating its opaque rectangle to each sprite. */ typedef std::map opaque_rectangle_map; /** \brief The type of the structure associating its the compiled identifier to each item identifier. */ typedef std::map identifier_map; public: compilation_context ( unsigned int optimization_level, workspace_environment& env ); rectangle get_opaque_rectangle ( const sprite& s, const std::string& image_name ); unsigned int get_compiled_identifier( const std::string& item ) const; void set_compiled_identifier( const std::string& item, unsigned int id ); void clear_compiled_identifiers(); std::string get_workspace_name() const; private: rectangle compute_opaque_rectangle( const sprite& s ); private: /** \brief The sprite image cache stores the images used to compute the opaque rectangles for the sprites. */ sprite_image_cache m_image_cache; /** \brief The opaque rectangle associated with each sprite. */ opaque_rectangle_map m_opaque_rectangle; /** \brief The compiled identifier associated with each item identifier. */ identifier_map m_identifier; /** \brief The optimisation level during the compilation. */ unsigned int m_optimization_level; /** \brief The workspace environment to use. */ workspace_environment& m_workspace; }; // class compilation_context } // namespace bf #endif // __BF_COMPILATION_CONTEXT_HPP__ plee-the-bear-20251226/bear-factory/bear-editor/src/bf/compiled_file.hpp000066400000000000000000000025761512343254000256370ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief This class outputs data in a format understood by the game. * \author Julien Jorge */ #ifndef __BF_COMPILED_FILE_HPP__ #define __BF_COMPILED_FILE_HPP__ #include #include "bf/libeditor_export.hpp" namespace bf { /** * \brief This class outputs data in a format understood by the game. * \author Julien Jorge */ class BEAR_EDITOR_EXPORT compiled_file { public: compiled_file( std::ostream& f ); compiled_file& operator<<( const std::string& s ); compiled_file& operator<<( unsigned long i ); compiled_file& operator<<( long i ); compiled_file& operator<<( unsigned int i ); compiled_file& operator<<( int i ); compiled_file& operator<<( double i ); private: void output_string_as_text( const std::string& s ); void output_long_as_text( long i ); void output_unsigned_long_as_text( unsigned long i ); void output_integer_as_text( int i ); void output_unsigned_integer_as_text( unsigned int i ); void output_real_as_text( double r ); private: /** \brief The file we are writing in. */ std::ostream& m_file; }; // compiled_file } // namespace bf #endif // __BF_COMPILED_FILE_HPP__ plee-the-bear-20251226/bear-factory/bear-editor/src/bf/config_frame.hpp000066400000000000000000000042221512343254000254510ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief The dialog to configure the paths to the datas. * \author Julien Jorge */ #ifndef __BF_CONFIG_FRAME_HPP__ #define __BF_CONFIG_FRAME_HPP__ #include #include #include #include #include "bf/libeditor_export.hpp" #include "bf/path_configuration.hpp" namespace bf { /** * \brief The dialog to configure the paths to the datas. * \author Julien Jorge */ class BEAR_EDITOR_EXPORT config_frame: public wxDialog { public: /** \brief The identifiers of the controls. */ enum control_id { IDC_BROWSE_ITEM_CLASSES_BUTTON, IDC_ERASE_ITEM_CLASSES_BUTTON, IDC_BROWSE_DATA_PATH_BUTTON, IDC_ERASE_DATA_PATH_BUTTON, IDC_BROWSE_RUN_PATH_BUTTON, IDC_CHOICE }; // enum control_id public: config_frame( wxWindow* parent ); private: void fill_controls(); void fill_list_view(); void create_controls(); void create_member_controls(); void create_sizer_controls(); void on_ok(wxCommandEvent& event); void on_cancel(wxCommandEvent& event); void on_browse_item_classes(wxCommandEvent& event); void on_erase_item_classes(wxCommandEvent& event); void on_browse_data_path(wxCommandEvent& event); void on_erase_data_path(wxCommandEvent& event); void on_select_workspace(wxCommandEvent& event); void on_browse_run_path(wxCommandEvent& event); private: /** \brief The list of workspaces. */ wxChoice* m_workspaces_choice; /** \brief The list of paths to the item classes files. */ wxListBox* m_item_classes_list; /** \brief The list of paths to the data of the game. */ wxListBox* m_data_path_list; /** \brief The path to the run configuration. */ wxListBox* m_run_path; /** \brief Map of workspaces. */ path_configuration::workspaces_map m_workspaces; DECLARE_EVENT_TABLE() }; // class config_frame } // namespace bf #endif // __BF_CONFIG_FRAME_HPP__ plee-the-bear-20251226/bear-factory/bear-editor/src/bf/custom_type.hpp000066400000000000000000000051141512343254000254060ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Base class for simple types (integer, real, bool and string). * \author Julien Jorge */ #ifndef __BF_CUSTOM_TYPE__ #define __BF_CUSTOM_TYPE__ #include #include "easing.hpp" namespace bf { class compilation_context; class compiled_file; /** * \brief Base class for simple types (integer, real, bool and string). * \author Julien Jorge */ template class custom_type { public: typedef Type value_type; public: custom_type( const value_type& value = value_type() ); void set_value( const value_type& value ); const value_type& get_value() const; void compile( compiled_file& f ) const; bool operator==( const custom_type& that ) const; bool operator!=( const custom_type& that ) const; private: /** \brief The current value of the variable. */ value_type m_value; }; // class custom_type /** \brief Integer type. */ typedef custom_type integer_type; /** \brief Unsigned integer type. */ typedef custom_type u_integer_type; /** \brief Real number type. */ typedef custom_type real_type; /** \brief String type. */ typedef custom_type string_type; /** \brief Boolean type. */ typedef custom_type bool_type; /** \brief Easing functions. */ class easing_type: public custom_type { public: void compile( compiled_file& f ) const; bool operator==( const easing_type& that ) const; bool operator!=( const easing_type& that ) const; }; // class easing_type /** \brief Base type for the files. */ class base_file_type: public custom_type { public: void compile( compiled_file& f, compilation_context& c ) const; }; // class base_file_type /** * \brief Type of a reference on an item. * * The type must be clearly different of string_type. */ class item_reference_type: public custom_type { public: bool operator==( const item_reference_type& that ) const; bool operator!=( const item_reference_type& that ) const; }; // class item_reference_type } // namespace bf template std::ostream& operator<<( std::ostream& os, const bf::custom_type& v ); std::ostream& operator<<( std::ostream& os, const bf::easing_type& v ); #include "impl/custom_type.tpp" #endif // __BF_CUSTOM_TYPE__ plee-the-bear-20251226/bear-factory/bear-editor/src/bf/default_value.hpp000066400000000000000000000032701512343254000256540ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Default values for the types used in a level file. * \author Julien Jorge */ #ifndef __BF_DEFAULT_VALUE_HPP__ #define __BF_DEFAULT_VALUE_HPP__ #include "bf/custom_type.hpp" #include "bf/libeditor_export.hpp" namespace bf { /** * \brief Default values for the types used in a level file. * \author Julien Jorge */ template class default_value { public: static Type get() { return Type(); } }; // class default_value /** * \brief Default values for the types used in a level file. Specialisation * for string_type. * \author Julien Jorge */ template<> class BEAR_EDITOR_EXPORT default_value { public: static string_type get() { return string_type(); } }; // class default_value [string_type] /** * \brief Default values for the types used in a level file. Specialisation * for easing_type. * \author Julien Jorge */ template<> class BEAR_EDITOR_EXPORT default_value { public: static easing_type get() { return easing_type(); } }; // class default_value [easing_type] /** * \brief Default values for the types used in a level file. Specialisation * others custom types. * \author Julien Jorge */ template class default_value< custom_type > { public: static custom_type get() { return custom_type(0); } }; // class default_value [custom_type] } // namespace bf #endif // __BF_DEFAULT_VALUE_HPP__ plee-the-bear-20251226/bear-factory/bear-editor/src/bf/dialog_maker.hpp000066400000000000000000000057301512343254000254550ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A class that create the adequate dialog for editing a field. * \author Julien Jorge */ #ifndef __BF_DIALOG_MAKER_HPP__ #define __BF_DIALOG_MAKER_HPP__ #include "bf/value_editor_dialog.hpp" #include "bf/set_edit.hpp" #include "bf/interval_edit.hpp" namespace bf { /** * \brief A class that create the adequate dialog for editing a field. * * \b Template \b parameters: * - \a Control The control used for selecting the value (free_edit, set_edit, * sprite_edit and so on), * - \a Type The type of the edited value (integer_type, * std::list and so on). * * \author Julien Jorge */ template class dialog_maker { public: typedef value_editor_dialog dialog_type; typedef Type value_type; public: static dialog_type* create( wxWindow& parent, const wxString& type, const type_field& f, const value_type& v ); static dialog_type* create( wxWindow& parent, const wxString& type, const type_field& f, const value_type& v, workspace_environment& env ); }; // class dialog_maker /** * \brief Specialization of the bf::dialog_maker class for bf::set_edit<> type * controls. * * \b Template \b parameters: * - \a T The type of the value edited with the set_edit (among the base * types: integer_type, real_type and so on), * - \a Type The type of the edited value (integer_type, * std::list and so on). * * \author Julien Jorge */ template class dialog_maker, Type> { public: typedef value_editor_dialog, Type> dialog_type; typedef Type value_type; public: static dialog_type* create( wxWindow& parent, const wxString& type, const type_field& f, const value_type& v ); }; // class dialog_maker [set_edit] /** * \brief Specialization of the bf::dialog_maker class for * bf::interval_edit<> type controls. * * \b Template \b parameters: * - \a T The type of the value edited with the interval_edit (among the base * types: integer_type, real_type and so on), * - \a Type The type of the edited value (integer_type, * std::list and so on). * * \author Julien Jorge */ template class dialog_maker, Type> { public: typedef value_editor_dialog, Type> dialog_type; typedef Type value_type; public: static dialog_type* create( wxWindow& parent, const wxString& type, const type_field& f, const value_type& v ); }; // class dialog_maker [interval_edit] } // namespace bf #include "bf/impl/dialog_maker.tpp" #endif // __BF_DIALOG_MAKER_HPP__ plee-the-bear-20251226/bear-factory/bear-editor/src/bf/easing_combo.hpp000066400000000000000000000010721512343254000254570ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A combobox containing all the easing functions. * \author Julien Jorge */ #ifndef __BF_EASING_COMBO_HPP__ #define __BF_EASING_COMBO_HPP__ #include namespace bf { wxComboCtrl* create_easing_combo( wxWindow* parent ); void initialize_easing_combo( wxComboCtrl& combo ); } // namespace bf #endif // __BF_EASING_COMBO_HPP__ plee-the-bear-20251226/bear-factory/bear-editor/src/bf/easing_combo_popup.hpp000066400000000000000000000022121512343254000266770ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A combobox containing all the easing functions. * \author Julien Jorge */ #ifndef __BF_EASING_COMBO_POPUP_HPP__ #define __BF_EASING_COMBO_POPUP_HPP__ #include #include namespace bf { /** * \brief A combobox containing all the easing functions. * \author Julien Jorge */ class easing_combo_popup: public wxListView, public wxComboPopup { public: virtual bool Create(wxWindow* parent); virtual wxWindow* GetControl(); virtual void SetStringValue( const wxString& s ); virtual wxString GetStringValue() const; private: void connect_list_events(); void disconnect_list_events(); void append_item( const wxString& label, const wxBitmap& img ); void fill_list(); void on_item_activated( wxListEvent& event ); private: DECLARE_EVENT_TABLE() }; // class easing_combo_popup } // namespace bf #endif // __BF_EASING_COMBO_POPUP_HPP__ plee-the-bear-20251226/bear-factory/bear-editor/src/bf/easing_edit.hpp000066400000000000000000000017471512343254000253160ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief The window showing the properties of an easing. * \author Julien Jorge */ #ifndef __BF_EASING_EDIT_HPP__ #define __BF_EASING_EDIT_HPP__ #include "bf/default_value.hpp" #include "bf/libeditor_export.hpp" #include "bf/simple_edit.hpp" #include "bf/custom_type.hpp" #include namespace bf { /** * \brief The window showing the properties of an easing function. * \author Julien Jorge */ class BEAR_EDITOR_EXPORT easing_edit: public simple_edit, public wxComboCtrl { public: easing_edit ( wxWindow& parent, const easing_type& s = default_value::get() ); bool validate(); private: void value_updated(); }; // class easing_edit } // namespace bf #endif // __BF_EASING_EDIT_HPP__ plee-the-bear-20251226/bear-factory/bear-editor/src/bf/font.hpp000066400000000000000000000021631512343254000240020ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief The value of a field of type "font". * \author Julien Jorge */ #ifndef __BF_FONT_HPP__ #define __BF_FONT_HPP__ #include "bf/libeditor_export.hpp" #include namespace bf { class compiled_file; class compilation_context; /** * \brief Font type. * \author Julien Jorge */ class BEAR_EDITOR_EXPORT font { public: font(); void set_font_name( std::string name ); std::string get_font_name() const; void set_size( double s ); double get_size() const; void compile( compiled_file& f, compilation_context& c ) const; bool operator==( const font& that ) const; bool operator!=( const font& that ) const; private: /** \brief The name of the font resource to use. */ std::string m_font_name; /** \brief The size of the text displayed with this font. */ double m_size; }; // class font } // namespace bf #endif // __BF_FONT_HPP__ plee-the-bear-20251226/bear-factory/bear-editor/src/bf/font_edit.hpp000066400000000000000000000033351512343254000250110ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Control for editing a field whose value is a font. * \author Sébastien Angibaud */ #ifndef __BF_FONT_EDIT_HPP__ #define __BF_FONT_EDIT_HPP__ #include "bf/base_edit.hpp" #include "bf/default_value.hpp" #include "bf/font.hpp" #include "bf/spin_ctrl.hpp" #include "bf/libeditor_export.hpp" #include namespace bf { class workspace_environment; /** * \brief Control for editing a field whose value is a a font. * \author Sébastien Angibaud */ class BEAR_EDITOR_EXPORT font_edit: public wxPanel, public base_edit { public: /** \brief The identifiers of the controls. */ enum control_id { IDC_FONT_SELECT }; // enum control_id public: font_edit ( wxWindow& parent, workspace_environment& env, const font& v = default_value::get() ); bool validate(); private: font make_font() const; void value_updated(); void fill_controls(); void create_controls(); void create_sizer_controls(); wxSizer* create_size_sizer(); wxSizer* create_font_name_sizer(); void on_font_select(wxCommandEvent& event); private: /** \brief The control for setting the size of the font. */ bf::spin_ctrl* m_size_spin; /** \brief The control in which we display the file name. */ wxTextCtrl* m_font_name_text; /** \brief The workspace name. */ workspace_environment& m_workspace; DECLARE_EVENT_TABLE() }; // class font_edit } // namespace bf #endif // __BF_FONT_EDIT_HPP__ plee-the-bear-20251226/bear-factory/bear-editor/src/bf/frame_edit.hpp000066400000000000000000000034171512343254000251360ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief The window showing the properties of a frame. * \author Sebastien Angibaud */ #ifndef __BF_FRAME_EDIT_HPP__ #define __BF_FRAME_EDIT_HPP__ #include "bf/free_edit.hpp" #include "bf/animation_frame.hpp" #include "bf/custom_type.hpp" #include "bf/libeditor_export.hpp" #include #include #include namespace bf { class sprite_edit; class workspace_environment; /** * \brief The window showing the properties of a frame. * \author Sebastien Angibaud */ class BEAR_EDITOR_EXPORT frame_edit: public wxDialog { public: /** \brief The identifiers of the controls. */ enum control_id { IDC_DURATION, IDC_SPRITE }; // enum control_id public: frame_edit ( wxWindow& parent, workspace_environment& env, const animation_frame& frame = default_value::get()); const animation_frame& get_frame() const; private: void validate(); void create_controls(); void create_sizer_controls(); void fill(); void edit_sprite(); void edit_duration(); void on_ok(wxCommandEvent& event); private: /** \brief The edited frame. */ animation_frame m_frame; /** \brief The control for duration. */ free_edit* m_duration; /** \brief The control in which we display the sprite. */ sprite_edit* m_sprite; /** \brief The workspace environment to use. */ workspace_environment& m_workspace; // DECLARE_EVENT_TABLE() }; // class frame_edit } // namespace bf #endif // __BF_FRAME_EDIT_HPP__ plee-the-bear-20251226/bear-factory/bear-editor/src/bf/free_edit.hpp000066400000000000000000000022271512343254000247630ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A control for editing a field that can take any value. * \author Julien Jorge */ #ifndef __BF_FREE_EDIT_HPP__ #define __BF_FREE_EDIT_HPP__ #include "bf/simple_edit.hpp" #include "bf/default_value.hpp" #include namespace bf { /** * \brief A control for editing a field that can take any value. * \author Julien Jorge */ template class free_edit: public simple_edit, public wxTextCtrl { public: /** The type of the current class. */ typedef free_edit self_type; /** \brief The type of the value of the edited field. */ typedef typename simple_edit::value_type value_type; public: explicit free_edit( wxWindow& parent ); free_edit( wxWindow& parent, const value_type& v ); bool validate(); private: void value_updated(); }; // class free_edit } // namespace bf #include "bf/impl/free_edit.tpp" #endif // __BF_FREE_EDIT_HPP__ plee-the-bear-20251226/bear-factory/bear-editor/src/bf/human_readable.hpp000066400000000000000000000106051512343254000257630ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A class to transform a value into a human readable text. * \author Julien Jorge */ #ifndef __BF_HUMAN_READABLE_HPP__ #define __BF_HUMAN_READABLE_HPP__ #include "bf/color.hpp" #include "bf/custom_type.hpp" #include "bf/any_animation.hpp" #include "bf/font.hpp" #include "bf/sample.hpp" #include "bf/libeditor_export.hpp" #include #include namespace bf { /** * \brief A class to transform a value into a human readable text. * \author Julien Jorge */ template class human_readable { public: /** \brief The type of the value. */ typedef Type value_type; public: static wxString convert( const value_type& v ); }; // class human_readable /** * \brief Specialisation for list of values. * \author Julien Jorge */ template class human_readable< std::list > { public: /** \brief The type of the value. */ typedef std::list value_type; public: static wxString convert( const value_type& v ); }; // class human_readable [list] /** * \brief Specialisation for bool_type "true"/"false". * \author Julien Jorge */ template<> class BEAR_EDITOR_EXPORT human_readable { public: /** \brief The type of the value. */ typedef bool_type value_type; public: static wxString convert( const value_type& v ); }; // class human_readable [bool_type] /** * \brief Specialisation for string_type: add quotes. * \author Julien Jorge */ template<> class BEAR_EDITOR_EXPORT human_readable { public: /** \brief The type of the value. */ typedef string_type value_type; public: static wxString convert( const value_type& v ); }; // class human_readable [string_type] /** * \brief Specialisation for sprite. * \author Julien Jorge */ template<> class BEAR_EDITOR_EXPORT human_readable { public: /** \brief The type of the value. */ typedef sprite value_type; public: static wxString convert( const value_type& v ); }; // class human_readable [sprite] /** * \brief Specialisation for animation. * \author Sebastien Angibaud */ template<> class BEAR_EDITOR_EXPORT human_readable { public: /** \brief The type of the value. */ typedef animation value_type; public: static wxString convert( const value_type& v ); }; // class human_readable [animation] /** * \brief Specialisation for animation_file_type. * \author Julien Jorge */ template<> class BEAR_EDITOR_EXPORT human_readable { public: /** \brief The type of the value. */ typedef animation_file_type value_type; public: static wxString convert( const value_type& v ); }; // class human_readable [animation_file_type] /** * \brief Specialisation for any_animation. * \author Julien Jorge */ template<> class BEAR_EDITOR_EXPORT human_readable { public: /** \brief The type of the value. */ typedef any_animation value_type; public: static wxString convert( const value_type& v ); }; // class human_readable [any_animation] /** * \brief Specialisation for sample. * \author Julien Jorge */ template<> class BEAR_EDITOR_EXPORT human_readable { public: /** \brief The type of the value. */ typedef sample value_type; public: static wxString convert( const value_type& v ); }; // class human_readable [sample] /** * \brief Specialisation for font. * \author Julien Jorge */ template<> class BEAR_EDITOR_EXPORT human_readable { public: /** \brief The type of the value. */ typedef font value_type; public: static wxString convert( const value_type& v ); }; // class human_readable [font] /** * \brief Specialisation for color. * \author Sébastien Angibaud */ template<> class BEAR_EDITOR_EXPORT human_readable { public: /** \brief The type of the value. */ typedef color value_type; public: static wxString convert( const value_type& v ); }; // class human_readable [color] } // namespace bf #include "bf/impl/human_readable.tpp" #endif // __BF_HUMAN_READABLE_HPP__ plee-the-bear-20251226/bear-factory/bear-editor/src/bf/icon/000077500000000000000000000000001512343254000232515ustar00rootroot00000000000000plee-the-bear-20251226/bear-factory/bear-editor/src/bf/icon/compile.xpm000066400000000000000000000015501512343254000254300ustar00rootroot00000000000000/* XPM */ /* From the Gnome icon theme. */ static const char* compile_xpm[] = { /* columns rows colors chars-per-pixel */ "16 16 27 1", " c #424341", ". c #555753", "X c #565854", "o c #585B56", "O c #585B57", "+ c #6C6E6A", "@ c #737471", "# c #737571", "$ c #888A85", "% c #9FA09D", "& c #AEAEAB", "* c #ADADAC", "= c #AFB0AD", "- c #C5C5C4", "; c #C7C8C6", ": c #CFCFCE", "> c #E1E1E0", ", c #E2E2E0", "< c #EEEEEC", "1 c #F1F1F1", "2 c #F2F3F2", "3 c gray97", "4 c #F8F8F8", "5 c #FBFBFB", "6 c #FCFCFB", "7 c #FEFEFE", "8 c None", /* pixels */ "8888888888$$$888", "8888888888+<+888", "888888888 272 88", "8888888$+1*@*1+$", "8888888$<7#8#7<$", "8888888$+1*@*1+$", "888888888 272 88", "888$$$88X.+<+.X8", "888+<+8.:,$$$,:.", "88 272 .>46364>.", "$+1*@*1+$5%.%5&o", "$<7#8#7<$3.8.3-8", "$+1*@*1+$5%.%5&o", "88 272 .>46364>.", "888+<+8.:,=;=,:.", "888$$$88X.O8O.X8" }; plee-the-bear-20251226/bear-factory/bear-editor/src/bf/icon/easing/000077500000000000000000000000001512343254000245175ustar00rootroot00000000000000plee-the-bear-20251226/bear-factory/bear-editor/src/bf/icon/easing/back_in.xpm000066400000000000000000000036651512343254000266450ustar00rootroot00000000000000/* XPM */ static const char *back_in_xpm[] = { /* columns rows colors chars-per-pixel */ "32 24 66 1 ", " c #62AEF8", ". c #6CB6FF", "X c #6DB6FF", "o c #77B7F6", "O c #7EBAF6", "+ c #77B9FB", "@ c #72B9FF", "# c #76BBFF", "$ c #7ABDFF", "% c #7DBEFF", "& c #83BDF7", "* c #86BEF6", "= c #80C0FF", "- c #85C2FF", "; c #88C4FF", ": c #89C4FF", "> c #8DC6FF", ", c #92C9FF", "< c #9ACBFB", "1 c #99CDFF", "2 c #9ECFFF", "3 c #AFCEED", "4 c #A9CFF6", "5 c #A3D1FF", "6 c #A5D3FF", "7 c #ACD6FF", "8 c #ADD6FF", "9 c #B2D5F7", "0 c #BEDAF6", "q c #B3D9FF", "w c #B6DBFF", "e c #BDDFFF", "r c #CDDDED", "t c #CBE1F6", "y c #C0E0FF", "u c #C3E1FF", "i c #C4E2FF", "p c #C9E4FF", "a c #CEE7FF", "s c #D0E7FF", "d c #D0E8FF", "f c #D6EAFF", "g c #D8EAFB", "h c #D9ECFF", "j c #DDEEFF", "k c #DFEFFF", "l c #E3E8ED", "z c #EBECED", "x c #EFEFEF", "c c #F0EFED", "v c #F1EFED", "b c #E5EEF6", "n c #E1EDF9", "m c #EAF0F6", "M c #E2F1FF", "N c #EAF5FF", "B c #EDF6FF", "V c #F3F3F3", "C c #F2F4F6", "Z c #F7F7F6", "A c #F9F7F6", "S c #F3F9FF", "D c #F7FBFF", "F c #FAFAFA", "G c #F9FCFF", "H c #FEFEFE", /* pixels */ "FVVVVVVVVVVVVVVVVVVVVVVVVVVVVnSH", "FxxVxxxxxVxxxxxVxxxxxVxxxxxVz&jH", "HHHHHHHHHHHHHHHHHHHHHHHHHHHHM%GH", "HHHHHHHHHHHHHHHHHHHHHHHHHHHHw2HH", "HHHHHHHHHHHHHHHHHHHHHHHHHHHH-aHH", "HHHHHHHHHHHHHHHHHHHHHHHHHHHj$DHH", "HHHHHHHHHHHHHHHHHHHHHHHHHHH56HHH", "HHHHHHHHHHHHHHHHHHHHHHHHHHD$MHHH", "HHHHHHHHHHHHHHHHHHHHHHHHHHp-HHHH", "HHHHHHHHHHHHHHHHHHHHHHHHHH-yHHHH", "HHHHHHHHHHHHHHHHHHHHHHHHHh#DHHHH", "HHHHHHHHHHHHHHHHHHHHHHHHH,qHHHHH", "HHHHHHHHHHHHHHHHHHHHHHHHj@SHHHHH", "HHHHHHHHHHHHHHHHHHHHHHHH>8HHHHHH", "HHHHHHHHHHHHHHHHHHHHHHHa@GHHHHHH", "HHHHHHHHHHHHHHHHHHHHHHD%yHHHHHHH", "HHHHHHHHHHHHHHHHHHHHHH5-HHHHHHHH", "HHHHHHHHHHHHHHHHHHHHHpXNHHHHHHHH", "HHHHHHHHHHHHHHHHHHHHj.aHHHHHHHHH", "HHHHHHHHHHHHHHHHHHHh.eHHHHHHHHHH", "p8w0rlxvvxxxxxzxvx9 3vxxxxxxvVHH", "jiw-:166,=:iGHHHHHHHHHHHHH", "HHHHHHHHHDMdppfNHHHHHHHHHHHHHHHH" }; plee-the-bear-20251226/bear-factory/bear-editor/src/bf/icon/easing/back_in_out.xpm000066400000000000000000000036331512343254000275270ustar00rootroot00000000000000/* XPM */ static const char *back_in_out_xpm[] = { /* columns rows colors chars-per-pixel */ "32 24 64 1 ", " c #64ADF5", ". c #6EB3F8", "X c #6CB6FF", "o c #70B3F6", "O c #75B5F4", "+ c #78B7F6", "@ c #70B6FB", "# c #73B9FF", "$ c #76BBFF", "% c #77BBFF", "& c #7CBDFF", "* c #81BBF4", "= c #88BFF6", "- c #84C2FF", "; c #89C1F9", ": c #88C4FF", "> c #8EC7FF", ", c #93C2F0", "< c #91C4F6", "1 c #98C7F6", "2 c #9EC9F4", "3 c #93C9FF", "4 c #97CBFF", "5 c #9FCCF9", "6 c #99CCFF", "7 c #9CCDFF", "8 c #A1D0FF", "9 c #A6D2FF", "0 c #A8D4FF", "q c #ADD6FF", "w c #B1D8FF", "e c #B7DBFF", "r c #B8DAFC", "t c #B8DBFD", "y c #BBDDFF", "u c #CADCEF", "i c #CFDEED", "p c #C8DFF5", "a c #DEE6EE", "s c #CEE1F3", "d c #C1E0FF", "f c #C2E1FF", "g c #C9E4FF", "h c #CFE7FF", "j c #D7EBFF", "k c #D8ECFF", "l c #DFEFFF", "z c #E1E7EE", "x c #E2E8ED", "c c #EEEDED", "v c #EFEFEF", "b c #F0EFED", "n c #F2F0EF", "m c #E5EFFA", "M c #E3F1FF", "N c #E4F2FF", "B c #EAF4FF", "V c #EDF6FF", "C c #F0F0F0", "Z c #F4F4F4", "A c #F1F8FF", "S c #F4F9FF", "D c #FBFBFB", "F c #FFFFFF", /* pixels */ "FFFFFFFFFFFFFFFFFFFFFAjfgkAFFFFF", "DZZZZZZZZZZZZZZZZZZZt.+21*O;qfAF", "Dcccccccccccccccccc,@scnncapywAF", "FFFFFFFFFFFFFFFFFFe%VFFFFFFFFFFF", "FFFFFFFFFFFFFFFFFNXlFFFFFFFFFFFF", "FFFFFFFFFFFFFFFFF>0FFFFFFFFFFFFF", "FFFFFFFFFFFFFFFFk%AFFFFFFFFFFFFF", "FFFFFFFFFFFFFFFF4wFFFFFFFFFFFFFF", "FFFFFFFFFFFFFFFV#BFFFFFFFFFFFFFF", "FFFFFFFFFFFFFFFe3FFFFFFFFFFFFFFF", "FFFFFFFFFFFFFFF-hFFFFFFFFFFFFFFF", "FFFFFFFFFFFFFFM&SFFFFFFFFFFFFFFF", "FFFFFFFFFFFFFFy7FFFFFFFFFFFFFFFF", "FFFFFFFFFFFFFF:gFFFFFFFFFFFFFFFF", "FFFFFFFFFFFFFM%SFFFFFFFFFFFFFFFF", "FFFFFFFFFFFFF98FFFFFFFFFFFFFFFFF", "FFFFFFFFFFFFS%lFFFFFFFFFFFFFFFFF", "FFFFFFFFFFFFe:FFFFFFFFFFFFFFFFFF", "FFFFFFFFFFFVXkFFFFFFFFFFFFFFFFFF", "FFFFFFFFFFF46FFFFFFFFFFFFFFFFFFF", "FFFFFFFFFFe#AFFFFFFFFFFFFFFFFFFF", "g0tuxcbbz5 inccccccccccccccccCFF", "lf9*+=1mZZZZZZZZZZZZZZZZZZZFF", "FFFFVjghNFFFFFFFFFFFFFFFFFFFFFFF" }; plee-the-bear-20251226/bear-factory/bear-editor/src/bf/icon/easing/back_out.xpm000066400000000000000000000035721512343254000270430ustar00rootroot00000000000000/* XPM */ static const char *back_out_xpm[] = { /* columns rows colors chars-per-pixel */ "32 24 62 1 ", " c #65AEF6", ". c #6BB6FF", "X c #74B3F1", "o c #75B5F4", "O c #71B8FF", "+ c #75BAFF", "@ c #7BBDFF", "# c #7EBFFF", "$ c #84BDF6", "% c #80C0FF", "& c #86C3FF", "* c #8BC6FF", "= c #8EC6FD", "- c #9DC9F4", "; c #90C8FF", ": c #96CBFF", "> c #99CCFF", ", c #9CCEFF", "< c #A2CBF4", "1 c #A1D1FF", "2 c #A6D3FF", "3 c #A9D4FF", "4 c #AED7FF", "5 c #B9D5F0", "6 c #B0D8FF", "7 c #B5DAFF", "8 c #B9DCFF", "9 c #BDDEFF", "0 c #C2DBF4", "q c #CBDEF1", "w c #C1DFFD", "e c #C1E0FF", "r c #C6E3FF", "t c #CEE7FF", "y c #DDE7F1", "u c #DDE9F4", "i c #D2E8FF", "p c #D4EAFF", "a c #D9ECFF", "s c #E0E7EE", "d c #EDEDED", "f c #F0EFEF", "g c #F2F0EF", "h c #EFF2F4", "j c #EFF3F6", "k c #E0F0FF", "l c #E6F2FF", "z c #E8F3FF", "x c #E8F4FF", "c c #EFF7FF", "v c #F1F1F1", "b c #F0F3F6", "n c #F3F4F4", "m c #F4F4F4", "M c #F5F5F4", "N c #F8F6F4", "B c #F0F8FF", "V c #F1F8FF", "C c #F5FAFF", "Z c #FAFAFA", "A c #FAFDFF", "S c #FFFFFF", /* pixels */ "SSSSSSSSSSSSSSVarerilCSSSSSSSSSS", "SSSSSSSSSSSSk,#*142:*&:6aVSSSSSS", "Zmmmmmmmmmj1 SSSSSSSSSSSSSSSSSSSSSS", "SSSSSSS3%ASSSSSSSSSSSSSSSSSSSSSS", "SSSSSSp.lSSSSSSSSSSSSSSSSSSSSSSS", "SSSSSA@9SSSSSSSSSSSSSSSSSSSSSSSS", "SSSSS8%SSSSSSSSSSSSSSSSSSSSSSSSS", "SSSSVOpSSSSSSSSSSSSSSSSSSSSSSSSS", "SSSS6;SSSSSSSSSSSSSSSSSSSSSSSSSS", "SSSC+aSSSSSSSSSSSSSSSSSSSSSSSSSS", "SSS9&SSSSSSSSSSSSSSSSSSSSSSSSSSS", "SSA#tSSSSSSSSSSSSSSSSSSSSSSSSSSS", "SSp#ASSSSSSSSSSSSSSSSSSSSSSSSSSS", "SS>6SSSSSSSSSSSSSSSSSSSSSSSSSSSS", "SV+xSSSSSSSSSSSSSSSSSSSSSSSSSSSS", "S9;SSSSSSSSSSSSSSSSSSSSSSSSSSSSS", "S*rSSSSSSSSSSSSSSSSSSSSSSSSSSSSS", "l#VSSSSSSSSSSSSSSSSSSSSSSSSSSSSS", "7:SSSSSSSSSSSSSSSSSSSSSSSSSSSSSS", "=5fddddddddddddddddddddddddddvSS", "ljmmmmmmmmmmmmmmmmmmmmmmmmmmnmSS" }; plee-the-bear-20251226/bear-factory/bear-editor/src/bf/icon/easing/bounce_in.xpm000066400000000000000000000035541512343254000272150ustar00rootroot00000000000000/* XPM */ static const char *bounce_in_xpm[] = { /* columns rows colors chars-per-pixel */ "32 24 61 1 ", " c #4FA4F8", ". c #7BB4ED", "X c #69B0F7", "o c #66B1FB", "O c #64B2FF", "+ c #67B4FF", "@ c #6EB7FF", "# c #7DBAF7", "$ c #72B9FF", "% c #76BBFF", "& c #77BBFF", "* c #7ABDFF", "= c #91C0EE", "- c #9DC6EF", "; c #80C0FF", ": c #84C2FF", "> c #8CC6FF", ", c #8FC7FF", "< c #93C9FF", "1 c #95CAFF", "2 c #99CDFF", "3 c #9CCEFF", "4 c #A1C7ED", "5 c #B4D2EF", "6 c #A4D2FF", "7 c #A6D2FF", "8 c #AAD5FF", "9 c #ACD5FF", "0 c #B0D8FF", "q c #B2D9FF", "w c #B9DCFF", "e c #BEDFFF", "r c #BFDFFF", "t c #D9E3ED", "y c #C4E2FF", "u c #C7E3FF", "i c #CFE7FF", "p c #D5EAFF", "a c #DEECF9", "s c #D8EAFD", "d c #DAEDFF", "f c #DFEFFF", "g c #ECEDED", "h c #EFEFEF", "j c #F1EFED", "k c #E0EDFA", "l c #E5F0FB", "z c #E2F0FF", "x c #E3F1FF", "c c #E9F4FF", "v c #ECF5FF", "b c #F3F3F3", "n c #F5F4F3", "m c #F3F4F5", "M c #F4F4F4", "N c #F6F6F6", "B c #F0F8FF", "V c #F4F9FF", "C c #FAFAFA", "Z c #FAFDFF", "A c #FEFEFE", /* pixels */ "CbbbbbbbbbbbbbbbbbbbbbbbbbbnauVA", "Chhbhhhhhbhhhhhbhhhhhbhhhhh-X6BA", "AAAAAAAAAAAAAAAAAAAAAAAAAA8%cAAA", "AAAAAAAAAAAAAAAAAAAAAAAAAu@cAAAA", "AAAAAAAAAAAAAAAAAAAAAAAAB$iAAAAA", "AAAAAAAAAAAAAAAAAAAAAAAA9,AAAAAA", "AAAAAAAAAAAAAAAAAAAAAAAB$zAAAAAA", "AAAAAAAAAAAAAAAAAAAAAAAq c #89C4FF", ", c #8FC7FF", "< c #9BC7F3", "1 c #93C9FF", "2 c #97CBFF", "3 c #99CCFF", "4 c #B4D2EF", "5 c #ADCFF0", "6 c #A1D0FF", "7 c #A4D2FF", "8 c #A9D4FF", "9 c #AED7FF", "0 c #B3D9FF", "q c #BBDDFF", "w c #BCDEFF", "e c #BFDFFF", "r c #C1E0FF", "t c #C5E2FF", "y c #CCE5FF", "u c #D2E9FF", "i c #D6EBFF", "p c #DAEDFF", "a c #DEEFFF", "s c #E2E8EF", "d c #E6EAEF", "f c #EFEFEF", "g c #F0EFEF", "h c #F2F1EF", "j c #E4EFFA", "k c #EEF1F4", "l c #E1F0FF", "z c #E6F3FF", "x c #EAF1F8", "c c #EAF3FB", "v c #EAF5FF", "b c #EBF5FF", "n c #EFF7FF", "m c #F2F3F3", "M c #F3F3F3", "N c #F4F3F3", "B c #F5F5F4", "V c #F4F4F5", "C c #F1F4F8", "Z c #F1F8FF", "A c #FAFAFA", "S c #FAFDFF", "D c #FEFEFE", /* pixels */ "AMMMMMMMMMMMMMMMMMMMxMMMNxxkyyZD", "AffMfffffMfffffMfffs 4hgd+O&;6nD", "DDDDDDDDDDDDDDDDDDDu@$lD3,zaSDDD", "DDDDDDDDDDDDDDDDDDD70q*::ZDDDDDD", "DDDDDDDDDDDDDDDDDDS:aDzpSDDDDDDD", "DDDDDDDDDDDDDDDDDDa;SDDDDDDDDDDD", "DDDDDDDDDDDDDDDDDD87DDDDDDDDDDDD", "DDDDDDDDDDDDDDDDDS;pDDDDDDDDDDDD", "DDDDDDDDDDDDDDDDDy;DDDDDDDDDDDDD", "DDDDDDDDDDDDDDDDS;rDDDDDDDDDDDDD", "DDDDDDDDDDDDDDDD0;SDDDDDDDDDDDDD", "DDDDDDDDDDDDDSy3$lDDDDDDDDDDDDDD", "DDDDDDDDDDDDD6-qnDDDDDDDDDDDDDDD", "DDDDDDDDDDDDy*nDDDDDDDDDDDDDDDDD", "DDDDDDDDDDDS-tDDDDDDDDDDDDDDDDDD", "DDDDDDDDDDDy:DDDDDDDDDDDDDDDDDDD", "DDDDDDDDDDD1wDDDDDDDDDDDDDDDDDDD", "DDDDDDDDDDn=nDDDDDDDDDDDDDDDDDDD", "DDDDDDDDDDt,DDDDDDDDDDDDDDDDDDDD", "DDDDDDzuZD2eDDDDDDDDDDDDDDDDDDDD", "DDDDDq$>=a;zDDDDDDDDDDDDDDDDDDDD", "DDviy#jD9X:DDDDDDDDDDDDDDDDDDDDD", "w>+o.5gffo c #87C4FF", ", c #8AC5FF", "< c #8DC6FF", "1 c #95CAFF", "2 c #99CDFF", "3 c #9DCEFF", "4 c #B4D2EE", "5 c #B9D4EE", "6 c #A3D1FF", "7 c #A8D3FF", "8 c #AAD5FF", "9 c #B0D8FF", "0 c #B3D9FF", "q c #B7DBFF", "w c #BCDEFF", "e c #C7DBEF", "r c #D3E0ED", "t c #D7E3EF", "y c #C7E3FF", "u c #CBE5FF", "i c #CDE6FF", "p c #DEEAF6", "a c #D3E9FE", "s c #D9ECFF", "d c #DDEEFF", "f c #DFEFFF", "g c #E9ECEE", "h c #EFEFEF", "j c #F1F0EF", "k c #E5EEF7", "l c #EDF0F3", "z c #E3F1FF", "x c #E4F2FF", "c c #E5F2FF", "v c #E9F4FF", "b c #EEF7FF", "n c #F3F3F3", "m c #F4F3F3", "M c #F6F5F3", "N c #F1F4F6", "B c #F4F4F4", "V c #F1F8FF", "C c #F5FAFF", "Z c #FAFAFA", "A c #F8FBFF", "S c #F8FCFF", "D c #FEFEFE", /* pixels */ "ZnnnnnnnnnnlnnnnnnnnnxkjMMkupaVD", "Zhhnhhhhhne thhnhhhhg#.4g5o&$:uDSDDD", "DDDDDDDDDD:i%uDDDDDx+fDDADDDDDDD", "DDDDDDDDDx:Ci+xDDDb*8DDDDDDDDDDD", "DDDDDDDDDu1DD0+iCs*2SDDDDDDDDDDD", "DDDDDDDDD3wDDDy=:;qDDDDDDDDDDDDD", "DDDDDDDDC=zDDDDDCSDDDDDDDDDDDDDD", "DDDDDDDDs;SDDDDDDDDDDDDDDDDDDDDD", "DDDDDDDD88DDDDDDDDDDDDDDDDDDDDDD", "DDDDDDDS;fDDDDDDDDDDDDDDDDDDDDDD", "DDDDDDDf=SDDDDDDDDDDDDDDDDDDDDDD", "DDDDDDD86DDDDDDDDDDDDDDDDDDDDDDD", "DDDDDDS*sDDDDDDDDDDDDDDDDDDDDDDD", "DDDDDDi;DDDDDDDDDDDDDDDDDDDDDDDD", "DDDDDD c #95CAFF", ", c #9CCEFF", "< c #B6D2ED", "1 c #A1D0FF", "2 c #A6D3FF", "3 c #ABD5FF", "4 c #ACD6FF", "5 c #B1D8FF", "6 c #B8DCFF", "7 c #BEDFFF", "8 c #BFDFFF", "9 c #D6E2ED", "0 c #C5E2FF", "q c #C9E4FF", "w c #CEE7FF", "e c #D0E8FF", "r c #D6EAFF", "t c #D7EBFF", "y c #DAECFF", "u c #DEEFFF", "i c #DFEFFF", "p c #EFEFEF", "a c #F1EFED", "s c #E2EDF8", "d c #EEF1F4", "f c #E1F0FF", "g c #E4F2FF", "h c #EAF5FF", "j c #EEF6FF", "k c #EFF7FF", "l c #F3F3F3", "z c #F5F4F4", "x c #F9F7F4", "c c #F3F9FF", "v c #F6FBFF", "b c #FAFAFA", "n c #FBFDFF", "m c #FEFEFE", /* pixels */ "bllllllllllllllllllllllllllllscm", "bpplppppplppppplppppplpppppla-rm", "mmmmmmmmmmmmmmmmmmmmmmmmmmmmm>um", "mmmmmmmmmmmmmmmmmmmmmmmmmmmmn=hm", "mmmmmmmmmmmmmmmmmmmmmmmmmmmmj&vm", "mmmmmmmmmmmmmmmmmmmmmmmmmmmme=mm", "mmmmmmmmmmmmmmmmmmmmmmmmmmmm15mm", "mmmmmmmmmmmmmmmmmmmmmmmmmmmj+gmm", "mmmmmmmmmmmmmmmmmmmmmmmmmmm4:mmm", "mmmmmmmmmmmmmmmmmmmmmmmmmmhoummm", "mmmmmmmmmmmmmmmmmmmmmmmmmm:,mmmm", "mmmmmmmmmmmmmmmmmmmmmmmmm0+cmmmm", "mmmmmmmmmmmmmmmmmmmmmmmmr.ymmmmm", "mmmmmmmmmmmmmmmmmmmmmmmfo0mmmmmm", "mmmmmmmmmmmmmmmmmmmmmmyo6mmmmmmm", "mmmmmmmmmmmmmmmmmmmmm0.7mmmmmmmm", "mmmmmmmmmmmmmmmmmmmv1ormmmmmmmmm", "mmmmmmmmmmmmmmmmmmw+=jmmmmmmmmmm", "mmmmmmmmmmmmmmmmr*+qmmmmmmmmmmmm", "mmmmmmmmmmmmmnw*+6vmmmmmmmmmmmmm", "mmmmmmmmmmvy3@&7vmmmmmmmmmmmmmmm", "mmmmmbhr6,#&3unmmmmmmmmmmmmmmmmm", "q21,:O $%<9papppppppppppppppplmm", "uqwrfgdzxxzlzllzzzlzzzlzzzzzzzmm" }; plee-the-bear-20251226/bear-factory/bear-editor/src/bf/icon/easing/circ_in_out.xpm000066400000000000000000000034431512343254000275460ustar00rootroot00000000000000/* XPM */ static const char *circ_in_out_xpm[] = { /* columns rows colors chars-per-pixel */ "32 24 56 1 ", " c #71B0EF", ". c #7BB4ED", "X c #6CB6FF", "o c #6EB7FF", "O c #74B3F1", "+ c #72B9FF", "@ c #75BAFF", "# c #77BCFF", "$ c #79BCFF", "% c #87BBEF", "& c #81BDF8", "* c #82C0FF", "= c #87C3FF", "- c #8EC7FF", "; c #96CBFF", ": c #97CBFF", "> c #98CCFF", ", c #9CCDFF", "< c #A1C7ED", "1 c #B5D2EF", "2 c #A1D0FF", "3 c #A5D2FF", "4 c #AAD4FF", "5 c #B4DAFF", "6 c #B7DBFF", "7 c #B9DCFF", "8 c #BEDEFF", "9 c #D2E0ED", "0 c #C1E0FF", "q c #C7E3FF", "w c #CAE5FF", "e c #D0E8FF", "r c #D4E9FF", "t c #D7ECFF", "y c #DFECFA", "u c #DAEDFF", "i c #DFEFFF", "p c #E3E9EF", "a c #EFEFEF", "s c #F2F0EF", "d c #E9F0F6", "f c #E1F0FE", "g c #E1F0FF", "h c #E5F2FF", "j c #E8F4FF", "k c #EDF6FF", "l c #F3F3F3", "z c #F6F5F3", "x c #F4F4F4", "c c #F5F5F4", "v c #F9F7F4", "b c #F0F8FF", "n c #F4F9FF", "m c #F6FBFF", "M c #FAFAFA", "N c #FEFEFE", /* pixels */ "MllllllllllllllllllllllzzdyrqqnN", "Maalaaaaalaaaaalaaaaasp1% &>25nN", "NNNNNNNNNNNNNNNNNNNNb4#-0jNNNNNN", "NNNNNNNNNNNNNNNNNNNqo;gNNNNNNNNN", "NNNNNNNNNNNNNNNNNN3oeNNNNNNNNNNN", "NNNNNNNNNNNNNNNNN2$kNNNNNNNNNNNN", "NNNNNNNNNNNNNNNN8+kNNNNNNNNNNNNN", "NNNNNNNNNNNNNNNkotNNNNNNNNNNNNNN", "NNNNNNNNNNNNNNN4>NNNNNNNNNNNNNNN", "NNNNNNNNNNNNNNN*uNNNNNNNNNNNNNNN", "NNNNNNNNNNNNNNk=nNNNNNNNNNNNNNNN", "NNNNNNNNNNNNNNg-NNNNNNNNNNNNNNNN", "NNNNNNNNNNNNNNe,NNNNNNNNNNNNNNNN", "NNNNNNNNNNNNNN84NNNNNNNNNNNNNNNN", "NNNNNNNNNNNNNN;0NNNNNNNNNNNNNNNN", "NNNNNNNNNNNNNh+kNNNNNNNNNNNNNNNN", "NNNNNNNNNNNNN-3NNNNNNNNNNNNNNNNN", "NNNNNNNNNNNN5$nNNNNNNNNNNNNNNNNN", "NNNNNNNNNNN5oiNNNNNNNNNNNNNNNNNN", "NNNNNNNNNn>+gNNNNNNNNNNNNNNNNNNN", "NNNNNNNn7+;bNNNNNNNNNNNNNNNNNNNN", "NNNNbe2$-uNNNNNNNNNNNNNNNNNNNNNN", "w2>-O.<9aaaaaaaasaaaaaaaaaaaazNN", "gwegdxvzlxxxxllxxxlxxxlxxxxxxxNN" }; plee-the-bear-20251226/bear-factory/bear-editor/src/bf/icon/easing/circ_out.xpm000066400000000000000000000034401512343254000270550ustar00rootroot00000000000000/* XPM */ static const char *circ_out_xpm[] = { /* columns rows colors chars-per-pixel */ "32 24 56 1 ", " c #79B4EF", ". c #6CB6FF", "X c #71B8FF", "o c #76BBFF", "O c #77BBFF", "+ c #7CBEFF", "@ c #87BBEF", "# c #80C0FF", "$ c #8AC2FA", "% c #8BC5FF", "& c #8FC6FC", "* c #93C9FF", "= c #96CBFF", "- c #99CCFF", "; c #9ECFFF", ": c #9FCFFF", "> c #A0C8EF", ", c #A1D0FF", "< c #A2D1FF", "1 c #A4D2FF", "2 c #A9D4FF", "3 c #AED7FF", "4 c #B3D9FF", "5 c #B6DBFF", "6 c #BFDFFF", "7 c #C2D9EF", "8 c #CEDFEF", "9 c #C3E1FF", "0 c #C6E3FF", "q c #CAE5FF", "w c #CEE7FF", "e c #D4EAFF", "r c #D6EBFF", "t c #D8ECFF", "y c #DDEEFF", "u c #E2E8EF", "i c #EFEFEF", "p c #F0EFEF", "a c #F0F0EF", "s c #E3EBF3", "d c #EFF1F3", "f c #E5F2FF", "g c #E6F3FF", "h c #EBF5FF", "j c #EEF7FF", "k c #EFF7FF", "l c #F3F3F3", "z c #F4F3F3", "x c #F5F4F3", "c c #F5F5F4", "v c #F1F8FF", "b c #F4FAFF", "n c #F6FBFF", "m c #FAFAFA", "M c #FBFDFF", "N c #FEFEFE", /* pixels */ "mllllllllllllllllzlxxxxdsyrq99vN", "miiliiiiiliiiiiaaapu7>@ $-<25vN", "NNNNNNNNNNNNNNNNk6*+%3rfnNNNNNNN", "NNNNNNNNNNNNNNr=o=9kNNNNNNNNNNNN", "NNNNNNNNNNNNt%o5hNNNNNNNNNNNNNNN", "NNNNNNNNNNk*X5vNNNNNNNNNNNNNNNNN", "NNNNNNNNN9. c #8EC7FF", ", c #92C8FF", "< c #99CCFF", "1 c #9DCEFF", "2 c #A2D1FF", "3 c #A5D2FF", "4 c #A9D4FF", "5 c #AFD7FF", "6 c #B0D8FF", "7 c #BFDFFF", "8 c #C2D8ED", "9 c #C2E0FF", "0 c #C5E2FF", "q c #C6E3FF", "w c #CAE5FF", "e c #D2E8FF", "r c #D4EAFF", "t c #D6EBFF", "y c #DEEEFF", "u c #DFEFFF", "i c #E7EBEF", "p c #EFEFEF", "a c #E0ECF9", "s c #EDF1F4", "d c #E1F0FF", "f c #E6F3FF", "g c #E7F3FF", "h c #EBF5FF", "j c #EDF6FF", "k c #F1F1F1", "l c #F3F3F3", "z c #F4F3F3", "x c #F4F4F4", "c c #F5F5F4", "v c #F9F7F4", "b c #F3F9FF", "n c #F5FAFF", "m c #FAFAFA", "M c #FBFDFF", "N c #FEFEFE", /* pixels */ "mllllllllllllllllllllllllllllubm", "mpplppppplppppplppppplpppppliOdN", "NNNNNNNNNNNNNNNNNNNNNNNNNNNN0-NN", "NNNNNNNNNNNNNNNNNNNNNNNNNNNM#wNN", "NNNNNNNNNNNNNNNNNNNNNNNNNNN0#NNN", "NNNNNNNNNNNNNNNNNNNNNNNNNNM@wNNN", "NNNNNNNNNNNNNNNNNNNNNNNNNN9=NNNN", "NNNNNNNNNNNNNNNNNNNNNNNNNn+eNNNN", "NNNNNNNNNNNNNNNNNNNNNNNNN3>NNNNN", "NNNNNNNNNNNNNNNNNNNNNNNNuXhNNNNN", "NNNNNNNNNNNNNNNNNNNNNNNM=5NNNNNN", "NNNNNNNNNNNNNNNNNNNNNNN5=MNNNNNN", "NNNNNNNNNNNNNNNNNNNNNNt.dNNNNNNN", "NNNNNNNNNNNNNNNNNNNNNj+9NNNNNNNN", "NNNNNNNNNNNNNNNNNNNNn=2NNNNNNNNN", "NNNNNNNNNNNNNNNNNNNM:>MNNNNNNNNN", "NNNNNNNNNNNNNNNNNNn,:nNNNNNNNNNN", "NNNNNNNNNNNNNNNNNj#>nNNNNNNNNNNN", "NNNNNNNNNNNNNNNNeo2NNNNNNNNNNNNN", "NNNNNNNNNNNNNNh c #97CBFF", ", c #99CCFF", "< c #9ECFFF", "1 c #BDD5ED", "2 c #A2D1FF", "3 c #A7D3FF", "4 c #AAD5FF", "5 c #ADD6FF", "6 c #AFD8FF", "7 c #B2D9FF", "8 c #B5DAFF", "9 c #BEDFFF", "0 c #D7E3EF", "q c #C1E0FF", "w c #C6E3FF", "e c #CCE6FF", "r c #CEE7FF", "t c #CFE7FF", "y c #D1E8FF", "u c #DFECF9", "i c #DFEEFE", "p c #DEEEFF", "a c #DFF0FF", "s c #EBECED", "d c #EFEFEF", "f c #F2F0EF", "g c #EEF0F3", "h c #EBF0F6", "j c #E1F0FF", "k c #E4F2FF", "l c #EBF5FF", "z c #EEF7FF", "x c #F3F3F3", "c c #F4F4F3", "v c #F4F4F4", "b c #F5F5F4", "n c #F8F6F4", "m c #F0F7FF", "M c #F1F8FF", "N c #F5FAFF", "B c #FAFAFA", "V c #F8FBFF", "C c #F9FCFF", "Z c #FEFEFE", /* pixels */ "BxxxxxxxxxxxxxxxxxxxcxccguywqwNZ", "Bddxdddddxdddddxdddddf0* +>358MZ", "ZZZZZZZZZZZZZZZZZZZZC5X2jCZZZZZZ", "ZZZZZZZZZZZZZZZZZZZN:%kZZZZZZZZZ", "ZZZZZZZZZZZZZZZZZZC;:CZZZZZZZZZZ", "ZZZZZZZZZZZZZZZZZZ,=CZZZZZZZZZZZ", "ZZZZZZZZZZZZZZZZZw@MZZZZZZZZZZZZ", "ZZZZZZZZZZZZZZZZmXtZZZZZZZZZZZZZ", "ZZZZZZZZZZZZZZZZ2>ZZZZZZZZZZZZZZ", "ZZZZZZZZZZZZZZZkXlZZZZZZZZZZZZZZ", "ZZZZZZZZZZZZZZZ,2ZZZZZZZZZZZZZZZ", "ZZZZZZZZZZZZZZk@zZZZZZZZZZZZZZZZ", "ZZZZZZZZZZZZZZ3 c #9DCEFF", ", c #A8CCEF", "< c #ACCEF0", "1 c #A0D0FF", "2 c #A3D1FF", "3 c #A8D4FF", "4 c #AED7FF", "5 c #AFD7FF", "6 c #B1D8FF", "7 c #B5DAFF", "8 c #BFDFFF", "9 c #D2E1EF", "0 c #C2E1FF", "q c #C6E3FF", "w c #C9E4FF", "e c #CEE7FF", "r c #CFE7FF", "t c #D0E8FF", "y c #D3E9FF", "u c #DAEDFF", "i c #DCECFC", "p c #DDEEFF", "a c #EFEFEF", "s c #F2F0EF", "d c #E2EBF4", "f c #EEF0F3", "g c #EFF3F6", "h c #E3F1FE", "j c #E7F3FF", "k c #E9F4FF", "l c #EEF7FF", "z c #F3F3F3", "x c #F5F4F3", "c c #F4F4F4", "v c #F5F5F4", "b c #F1F8FF", "n c #F6FAFF", "m c #F6FBFF", "M c #FAFAFA", "N c #F9FCFF", "B c #FEFEFE", /* pixels */ "Mzzzzzzzzzzzzzzzzzxxxfduywq00qmB", "Maazaaaaazaaaaaasa9,$ O=>13547bB", "BBBBBBBBBBBBBBBm0wkmBBBBBBBBB", "BBBBBBBBBBBBBBq@&emBBBBBBBBBBBBB", "BBBBBBBBBBBBl=@tBBBBBBBBBBBBBBBB", "BBBBBBBBBBBu+>mBBBBBBBBBBBBBBBBB", "BBBBBBBBBBe.8BBBBBBBBBBBBBBBBBBB", "BBBBBBBBBw.tBBBBBBBBBBBBBBBBBBBB", "BBBBBBBBy.eBBBBBBBBBBBBBBBBBBBBB", "BBBBBBBjXqBBBBBBBBBBBBBBBBBBBBBB", "BBBBBBm#4BBBBBBBBBBBBBBBBBBBBBBB", "BBBBBB:=BBBBBBBBBBBBBBBBBBBBBBBB", "BBBBBeXlBBBBBBBBBBBBBBBBBBBBBBBB", "BBBBb+wBBBBBBBBBBBBBBBBBBBBBBBBB", "BBBB1;BBBBBBBBBBBBBBBBBBBBBBBBBB", "BBBpXkBBBBBBBBBBBBBBBBBBBBBBBBBB", "BBB&6BBBBBBBBBBBBBBBBBBBBBBBBBBB", "BBy@mBBBBBBBBBBBBBBBBBBBBBBBBBBB", "BB%8BBBBBBBBBBBBBBBBBBBBBBBBBBBB", "Bw#NBBBBBBBBBBBBBBBBBBBBBBBBBBBB", "B$0BBBBBBBBBBBBBBBBBBBBBBBBBBBBB", "e#mBBBBBBBBBBBBBBBBBBBBBBBBBBBBB", "- c #93C7FB", ", c #91C8FF", "< c #95CAFF", "1 c #9BCDFF", "2 c #A3D1FF", "3 c #A4D2FF", "4 c #A6D3FF", "5 c #AAD5FF", "6 c #B3D6F9", "7 c #B3D9FF", "8 c #B5DAFF", "9 c #BBDDFF", "0 c #BEDFFF", "q c #CBDDF0", "w c #CEE0F1", "e c #CBE1F7", "r c #C0E0FF", "t c #C2E1FF", "y c #C6E3FF", "u c #C7E3FF", "i c #C8E4FF", "p c #CDE6FF", "a c #D7E8F8", "s c #D1E8FF", "d c #D7EBFF", "f c #D8EBFF", "g c #D9ECFF", "h c #DCECFC", "j c #DDEEFF", "k c #EFEFEF", "l c #E3ECF5", "z c #E8ECF0", "x c #EBEFF3", "c c #ECEEF0", "v c #E5F2FF", "b c #E8F3FF", "n c #ECF6FF", "m c #F0F0F0", "M c #F3F3F3", "N c #F4F3F3", "B c #F5F4F3", "V c #F8F4F0", "C c #F2F8FF", "Z c #F7FBFF", "A c #FAFAFA", "S c #FBFDFF", "D c #FEFEFE", /* pixels */ "AMMMMMMMMMMMMMMMMMMMMMMMMMMMMlCD", "AkkMkkkkkMkkkkkMkkkkkMkkkkkMk*gD", "DDDDDDDDDDDDDDDDDDDDDDDDDDDDZ=nD", "DDDDDDDDDDDDDDDDDDDDDDDDDDDDb-SD", "DDDDDDDDDDDDDDDDDDDDDDDDDDDDd,3ezc6 qB:>mmM&wBDD", "gtttt09888tshd8$O+#aBBlXhBz%lBDD", "DDDDDDDDDDDDDDDDbbDDDDD c #94CAFF", ", c #9ACBFB", "< c #99CBFC", "1 c #9BCDFF", "2 c #9CCEFF", "3 c #A1CCF8", "4 c #A0D0FF", "5 c #A3D1FF", "6 c #A7D3FF", "7 c #AED7FF", "8 c #B4D5F6", "9 c #BDD9F4", "0 c #B0D8FF", "q c #B6DAFF", "w c #BADDFF", "e c #BCDCFC", "r c #BFDFFF", "t c #C6DFF7", "y c #C9DEF3", "u c #C1DDF8", "i c #C1E0FF", "p c #C5E2FF", "a c #CBE5FF", "s c #D2E2F1", "d c #D3E9FF", "f c #D8EBFF", "g c #DEEEFF", "h c #EEEEEE", "j c #F0EFEE", "k c #E5ECF4", "l c #EFF0F1", "z c #EDF1F4", "x c #E1F0FF", "c c #E6F3FF", "v c #E8F0F8", "b c #EEF6FF", "n c #F3F3F3", "m c #F4F4F4", "M c #F6F6F6", "N c #F8F6F4", "B c #F3F9FF", "V c #F4FAFF", "C c #FAFAFA", "Z c #FBFDFF", "A c #FFFFFF", /* pixels */ "AAAAAAAAAAAAAAAAbfAAAAAAAAAAAAAA", "AAAAAAAAAAAAAAAA3 xAAAAAAAAAAAAA", "AAAAAAAAAAAAAAAZ-*6AAAAAAAAAAAAA", "Cnnnnnnnnnnnnnnk$yOze#>ppwwiipVA", "Mnhhnhhnnhhnjhns@l$Xotw66qqqqwBA", "AAAAAAAAAAAAAAAa2Ac7cAAAAAAAAAAA", "AAAAAAAAAAAAAAAw7AAAAAAAAAAAAAAA", "AAAAAAAAAAAAAAA6iAAAAAAAAAAAAAAA", "AAAAAAAAAAAAAAA2dAAAAAAAAAAAAAAA", "AAAAAAAAAAAAAAA-xAAAAAAAAAAAAAAA", "AAAAAAAAAAAAAAB*BAAAAAAAAAAAAAAA", "AAAAAAAAAAAAAAx-AAAAAAAAAAAAAAAA", "AAAAAAAAAAAAAAa1AAAAAAAAAAAAAAAA", "AAAAAAAAAAAAAAq0AAAAAAAAAAAAAAAA", "AAAAAAAAAAAAAA5pAAAAAAAAAAAAAAAA", "AAAAAAAAAAAAAA>fAAAAAAAAAAAAAAAA", "AAAAAAAAAAAAAZ-cAAAAAAAAAAAAAAAA", "AAAAAAAAAAAAAB-BAAAAAAAAAAAAAAAA", "AAAAAAAAAZrqZc-AAAAAAAAAAAAAAAAA", "a7777655u,X.9y&jhhhhhhhhhhhhhnAA", "gaaiipdw= c #9ACCFF", ", c #9DCEFF", "< c #9FCFFF", "1 c #A4CCF4", "2 c #A7CFF6", "3 c #ACD0F5", "4 c #A2D0FF", "5 c #A8D4FF", "6 c #AAD5FF", "7 c #AED6FF", "8 c #B0D8FF", "9 c #B6DBFF", "0 c #BADDFF", "q c #BFDFFF", "w c #C5DAF0", "e c #C2DCF5", "r c #C2E0FF", "t c #C6E3FF", "y c #C8E4FF", "u c #CCE6FF", "i c #DAE6F1", "p c #D5E8FB", "a c #D2E8FE", "s c #D3E9FF", "d c #D6EBFF", "f c #DBEDFF", "g c #DDEEFF", "h c #EDEDED", "j c #F0EFED", "k c #E3EBF3", "l c #E0EAF4", "z c #E0F0FF", "x c #E5F1FE", "c c #EBF5FF", "v c #EEF7FF", "b c #F1F1F1", "n c #F2F1F1", "m c #F2F2F1", "M c #F4F3F1", "N c #F5F3F1", "B c #F0F3F6", "V c #F4F4F4", "C c #F0F8FF", "Z c #F4FAFF", "A c #F9F9F9", "S c #F8FBFF", "D c #F9FCFF", "F c #FFFFFF", /* pixels */ "FFFDuvFFFFFFFFFFFFFFFFFFFFFFFFFF", "FFFr :FFFFFFFFFFFFFFFFFFFFFFFFFF", "FFF&r+gFFFFFFFFFFFFFFFFFFFFFFFFF", "FFC$Z64FFFFFFFFFFFFFFFFFFFFFFFFF", "FFf:Fg+DFFFFFFFFFFFFFFFFFFFFFFFF", "FFt4FF%dFFFFcgvFFFFFFFFFFFFFFFFF", "AN13NN1-mmm,X@.*qpae777790q0qrCF", "AN=eNmloim#Okmkr4;>50tyr0q000rCF", "FF*zFFF6+&%CFFFFFFFFFFFFFFFFFFFF", "FZ&vFFFDr0ZFFFFFFFFFFFFFFFFFFFFF", "Fc&DFFFFFFFFFFFFFFFFFFFFFFFFFFFF", "Fg:FFFFFFFFFFFFFFFFFFFFFFFFFFFFF", "Fu,FFFFFFFFFFFFFFFFFFFFFFFFFFFFF", "F07FFFFFFFFFFFFFFFFFFFFFFFFFFFFF", "F6eFFFFFFFFFFFFFFFFFFFFFFFFFFFFF", "F>sFFFFFFFFFFFFFFFFFFFFFFFFFFFFF", "F*zFFFFFFFFFFFFFFFFFFFFFFFFFFFFF", "Z&CFFFFFFFFFFFFFFFFFFFFFFFFFFFFF", "c&ZFFFFFFFFFFFFFFFFFFFFFFFFFFFFF", "f:FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF", "r,FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF", "48FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF", "*wjhhhhhhhhhhhhhhhhhhhhhhhhhhmFF", "xBVVVVVVVVVVVVVVNVVVVVVVVVVVNVFF" }; plee-the-bear-20251226/bear-factory/bear-editor/src/bf/icon/easing/expo_in.xpm000066400000000000000000000033431512343254000267110ustar00rootroot00000000000000/* XPM */ static const char *expo_in_xpm[] = { /* columns rows colors chars-per-pixel */ "32 24 52 1 ", " c #7AB4ED", ". c #7BB4ED", "X c #6EB7FF", "o c #77BBFF", "O c #7BBDFF", "+ c #7FBFFF", "@ c #91BFED", "# c #82BBF3", "$ c #8FC3F6", "% c #82C1FF", "& c #86C3FF", "* c #8AC5FF", "= c #93C9FF", "- c #96CBFF", "; c #99CCFF", ": c #9DCEFF", "> c #AACCED", ", c #A0D0FF", "< c #A1D0FF", "1 c #A5D3FF", "2 c #A6D3FF", "3 c #AED6FF", "4 c #BBDDFF", "5 c #CADCED", "6 c #C0E0FF", "7 c #C4E2FF", "8 c #CBE5FF", "9 c #CCE6FF", "0 c #D1E8FF", "q c #D5EAFF", "w c #D9ECFF", "e c #DFEFFF", "r c #E6EAED", "t c #EDEDED", "y c #EFEFEE", "u c #EFEFEF", "i c #E8EEF4", "p c #E2EDF8", "a c #E5EEF8", "s c #E0F0FF", "d c #E5F1FE", "f c #E8F4FF", "g c #EDF6FF", "h c #F3F3F3", "j c #F4F4F4", "k c #F7F6F4", "l c #F9F7F4", "z c #F2F8FF", "x c #F6FAFF", "c c #FAFAFA", "v c #F9FDFF", "b c #FEFEFE", /* pixels */ "chhhhhhhhhhhhhhhhhhhhhhhhhhhhpzb", "cuuhuuuuuhuuuuuhuuuuuhuuuuuhu$wb", "bbbbbbbbbbbbbbbbbbbbbbbbbbbbx%gb", "bbbbbbbbbbbbbbbbbbbbbbbbbbbbs&bb", "bbbbbbbbbbbbbbbbbbbbbbbbbbbb7:bb", "bbbbbbbbbbbbbbbbbbbbbbbbbbbb<4bb", "bbbbbbbbbbbbbbbbbbbbbbbbbbbb%ebb", "bbbbbbbbbbbbbbbbbbbbbbbbbbbs%vbb", "bbbbbbbbbbbbbbbbbbbbbbbbbbb4:bbb", "bbbbbbbbbbbbbbbbbbbbbbbbbbb*8bbb", "bbbbbbbbbbbbbbbbbbbbbbbbbbgOzbbb", "bbbbbbbbbbbbbbbbbbbbbbbbbb4=bbbb", "bbbbbbbbbbbbbbbbbbbbbbbbbv+0bbbb", "bbbbbbbbbbbbbbbbbbbbbbbbb9Ovbbbb", "bbbbbbbbbbbbbbbbbbbbbbbbb&6bbbbb", "bbbbbbbbbbbbbbbbbbbbbbbb8ovbbbbb", "bbbbbbbbbbbbbbbbbbbbbbbgX9bbbbbb", "bbbbbbbbbbbbbbbbbbbbbbv*,bbbbbbb", "bbbbbbbbbbbbbbbbbbbbbv=%xbbbbbbb", "bbbbbbbbbbbbbbbbbbbbs%*zbbbbbbbb", "bbbbbbbbbbbbbbbbbbp5ruuuuuuuuuuhbb", "e80000qwwsdaihkklkkkkkhjhkkhkkbb" }; plee-the-bear-20251226/bear-factory/bear-editor/src/bf/icon/easing/expo_in_out.xpm000066400000000000000000000034241512343254000276000ustar00rootroot00000000000000/* XPM */ static const char *expo_in_out_xpm[] = { /* columns rows colors chars-per-pixel */ "32 24 55 1 ", " c #73B0EE", ". c #74B1EF", "X c #68B4FF", "o c #6DB7FF", "O c #78B5F2", "+ c #77BBFF", "@ c #7ABDFF", "# c #7CBEFF", "$ c #84B9ED", "% c #81BDF8", "& c #9AC5EF", "* c #81C0FF", "= c #87C3FF", "- c #89C4FF", "; c #8FC7FF", ": c #92C8FF", "> c #94CAFF", ", c #9ACDFF", "< c #9CCEFF", "1 c #9DCFFF", "2 c #A1D0FF", "3 c #A2D1FF", "4 c #A4D1FF", "5 c #A9D4FF", "6 c #ADD6FF", "7 c #B5DAFF", "8 c #B9DCFF", "9 c #BBDDFF", "0 c #BEDEFF", "q c #DBE5EF", "w c #C1E0FF", "e c #C6E3FF", "r c #C9E4FF", "t c #CCE5FF", "y c #D0E8FF", "u c #D1E8FF", "i c #D4EAFF", "p c #D7EBFF", "a c #DEEEFF", "s c #EDEDED", "d c #EFEFEF", "f c #F1F0EF", "g c #E2ECF5", "h c #E5F0FB", "j c #E1F0FF", "k c #E3F1FF", "l c #EBF5FF", "z c #F3F3F3", "x c #F7F5F3", "c c #F5F5F4", "v c #F1F8FF", "b c #F4FAFF", "n c #FAFAFA", "m c #F9FCFF", "M c #FEFEFE", /* pixels */ "nzzzzzzzzzzzzzzzzzzzxzgpprrewebM", "nddzdddddzdddddzddfq&.O;<35567bM", "MMMMMMMMMMMMMMMMMMroMMMMMMMMMMMMMMMMM", "MMMMMMMMMMMMM=tMMMMMMMMMMMMMMMMM", "MMMMMMMMMMMMp+mMMMMMMMMMMMMMMMMM", "MMMMMMMMMMMb@0MMMMMMMMMMMMMMMMMM", "MMMMMMMMMMb;;bMMMMMMMMMMMMMMMMMM", "MMMMMmMml0+:bMMMMMMMMMMMMMMMMMMM", "r5443<:% $8ddddddddddddddddddzMM", "krruupkhzxxfczzccczccczcccccccMM" }; plee-the-bear-20251226/bear-factory/bear-editor/src/bf/icon/easing/expo_out.xpm000066400000000000000000000034401512343254000271100ustar00rootroot00000000000000/* XPM */ static const char *expo_out_xpm[] = { /* columns rows colors chars-per-pixel */ "32 24 56 1 ", " c #7AB5EF", ". c #7BB5EF", "X c #69B4FF", "o c #7ABDFF", "O c #7DBEFF", "+ c #82B9EF", "@ c #97C3EF", "# c #84C1FF", "$ c #86C3FF", "% c #87C3FF", "& c #8DC4FA", "* c #8EC5FD", "= c #95CAFF", "- c #99CDFF", "; c #9ECEFF", ": c #9FCFFF", "> c #B4D1EF", ", c #A1D0FF", "< c #A4D1FF", "1 c #A9D4FF", "2 c #ACD5FF", "3 c #B1D8FF", "4 c #B5DAFF", "5 c #BADDFF", "6 c #BCDEFF", "7 c #C5DBF0", "8 c #D7E3EF", "9 c #C3E1FF", "0 c #C4E2FF", "q c #C7E3FF", "w c #C9E4FF", "e c #CFE7FF", "r c #DFE9F4", "t c #D0E8FF", "y c #D4E9FF", "u c #DEEDFB", "i c #D8EBFF", "p c #DBEDFF", "a c #DCEEFF", "s c #EFEFEF", "d c #F0EFED", "f c #F2F0EF", "g c #E6ECF3", "h c #EEF0F3", "j c #E3F1FF", "k c #E5F2FF", "l c #EAF5FF", "z c #F3F3F3", "x c #F7F5F3", "c c #F4F4F4", "v c #F5F5F4", "b c #F1F8FF", "n c #F4FAFF", "m c #FAFAFA", "M c #FBFDFF", "N c #FEFEFE", /* pixels */ "mzzzzzzzzzzzzxxxhgruaittwwwww9nN", "msszssssssfs8>@+ &-::<<11113bN", "NNNNNNNNNMq#O-6ilnNNNNNNNNNNNNNN", "NNNNNNNNpO#wnNNNNNNNNNNNNNNNNNNN", "NNNNNNNwX5NNNNNNNNNNNNNNNNNNNNNN", "NNNNNNwXyNNNNNNNNNNNNNNNNNNNNNNN", "NNNNNkXtNNNNNNNNNNNNNNNNNNNNNNNN", "NNNNN#2NNNNNNNNNNNNNNNNNNNNNNNNN", "NNNN9oMNNNNNNNNNNNNNNNNNNNNNNNNN", "NNNMowNNNNNNNNNNNNNNNNNNNNNNNNNN", "NNNq#NNNNNNNNNNNNNNNNNNNNNNNNNNN", "NNN#qNNNNNNNNNNNNNNNNNNNNNNNNNNN", "NNjonNNNNNNNNNNNNNNNNNNNNNNNNNNN", "NN4:NNNNNNNNNNNNNNNNNNNNNNNNNNNN", "NN%tNNNNNNNNNNNNNNNNNNNNNNNNNNNN", "NlOnNNNNNNNNNNNNNNNNNNNNNNNNNNNN", "N9=NNNNNNNNNNNNNNNNNNNNNNNNNNNNN", "N-9NNNNNNNNNNNNNNNNNNNNNNNNNNNNN", "M#kNNNNNNNNNNNNNNNNNNNNNNNNNNNNN", "k#MNNNNNNNNNNNNNNNNNNNNNNNNNNNNN", "q=NNNNNNNNNNNNNNNNNNNNNNNNNNNNNN", "<3NNNNNNNNNNNNNNNNNNNNNNNNNNNNNN", "*7dsssssssssssssssssssssssssszNN", "jzvvvvzzzvvvvzzvvvzvvvzvvvvvvvNN" }; plee-the-bear-20251226/bear-factory/bear-editor/src/bf/icon/easing/linear_in.xpm000066400000000000000000000033641512343254000272130ustar00rootroot00000000000000/* XPM */ static const char *linear_in_xpm[] = { /* columns rows colors chars-per-pixel */ "32 24 53 1 ", " c #6BAFF3", ". c #6AB5FF", "X c #6DB6FF", "o c #73B7FA", "O c #70B8FF", "+ c #72B9FF", "@ c #75BAFF", "# c #79BCFF", "$ c #7EBFFF", "% c #95C2EF", "& c #80C0FF", "* c #87C3FF", "= c #88C4FF", "- c #8EC7FF", "; c #93C9FF", ": c #95CAFF", "> c #9BCDFF", ", c #9CCEFF", "< c #A0D0FF", "1 c #ADD6FF", "2 c #B0D8FF", "3 c #B4DAFF", "4 c #BADDFF", "5 c #BDDEFF", "6 c #CBDCED", "7 c #C2E1FF", "8 c #C6E3FF", "9 c #C9E4FF", "0 c #D7E9FB", "q c #D3E9FF", "w c #D6EAFF", "e c #DAEDFF", "r c #DFEFFF", "t c #EAECEF", "y c #EFEFEF", "u c #F0EFED", "i c #F1F0EF", "p c #E0F0FF", "a c #E5F2FF", "s c #E7F3FF", "d c #EAF1F8", "f c #EBF5FF", "g c #EDF6FF", "h c #EFF7FF", "j c #F3F3F3", "k c #F4F4F3", "l c #F4F4F4", "z c #F0F8FF", "x c #F3F9FF", "c c #F5FAFF", "v c #FAFAFA", "b c #FAFDFF", "n c #FEFEFE", /* pixels */ "vjjjjjjjjjjjjjjjjjjjjjjjjjjjk0xn", "vyyjyyyyyjyyyyyjyyyyyjyyyyit%ohn", "nnnnnnnnnnnnnnnnnnnnnnnnnna&*fnn", "nnnnnnnnnnnnnnnnnnnnnnnnn9.1bnnn", "nnnnnnnnnnnnnnnnnnnnnnnb+wnnnnnnnnnnnnnnnnn", "nnnnnnnnnnp#-hnnnnnnnnnnnnnnnnnn", "nnnnnnnnn7.3nnnnnnnnnnnnnnnnnnnn", "nnnnnnnc>+ennnnnnnnnnnnnnnnnnnnn", "nnnnnnr+-xnnnnnnnnnnnnnnnnnnnnnn", "nnnnn5.4bnnnnnnnnnnnnnnnnnnnnnnn", "nnnx:@ennnnnnnnnnnnnnnnnnnnnnnnn", "nnr@;xnnnnnnnnnnnnnnnnnnnnnnnnnn", "n5.4nnnnnnnnnnnnnnnnnnnnnnnnnnnn", "1 6uyyyyyyyyyyyyyyyyyyyyyyyyyjnn", "rdllljjljllllljllljllljlllllllnn" }; plee-the-bear-20251226/bear-factory/bear-editor/src/bf/icon/easing/linear_in_out.xpm000066400000000000000000000033701512343254000300770ustar00rootroot00000000000000/* XPM */ static const char *linear_in_out_xpm[] = { /* columns rows colors chars-per-pixel */ "32 24 53 1 ", " c #6BAFF3", ". c #6AB5FF", "X c #6DB6FF", "o c #73B7FA", "O c #70B8FF", "+ c #72B9FF", "@ c #75BAFF", "# c #79BCFF", "$ c #7EBFFF", "% c #95C2EF", "& c #80C0FF", "* c #87C3FF", "= c #88C4FF", "- c #8EC7FF", "; c #93C9FF", ": c #95CAFF", "> c #9BCDFF", ", c #9CCEFF", "< c #A0D0FF", "1 c #ADD6FF", "2 c #B0D8FF", "3 c #B4DAFF", "4 c #BADDFF", "5 c #BDDEFF", "6 c #CBDCED", "7 c #C2E1FF", "8 c #C6E3FF", "9 c #C9E4FF", "0 c #D7E9FB", "q c #D3E9FF", "w c #D6EAFF", "e c #DAEDFF", "r c #DFEFFF", "t c #EAECEF", "y c #EFEFEF", "u c #F0EFED", "i c #F1F0EF", "p c #E0F0FF", "a c #E5F2FF", "s c #E7F3FF", "d c #EAF1F8", "f c #EBF5FF", "g c #EDF6FF", "h c #EFF7FF", "j c #F3F3F3", "k c #F4F4F3", "l c #F4F4F4", "z c #F0F8FF", "x c #F3F9FF", "c c #F5FAFF", "v c #FAFAFA", "b c #FAFDFF", "n c #FEFEFE", /* pixels */ "vjjjjjjjjjjjjjjjjjjjjjjjjjjjk0xn", "vyyjyyyyyjyyyyyjyyyyyjyyyyit%ohn", "nnnnnnnnnnnnnnnnnnnnnnnnnna&*fnn", "nnnnnnnnnnnnnnnnnnnnnnnnn9.1bnnn", "nnnnnnnnnnnnnnnnnnnnnnnb+wnnnnnnnnnnnnnnnnn", "nnnnnnnnnnp#-hnnnnnnnnnnnnnnnnnn", "nnnnnnnnn7.3nnnnnnnnnnnnnnnnnnnn", "nnnnnnnc>+ennnnnnnnnnnnnnnnnnnnn", "nnnnnnr+-xnnnnnnnnnnnnnnnnnnnnnn", "nnnnn5.4bnnnnnnnnnnnnnnnnnnnnnnn", "nnnx:@ennnnnnnnnnnnnnnnnnnnnnnnn", "nnr@;xnnnnnnnnnnnnnnnnnnnnnnnnnn", "n5.4nnnnnnnnnnnnnnnnnnnnnnnnnnnn", "1 6uyyyyyyyyyyyyyyyyyyyyyyyyyjnn", "rdllljjljllllljllljllljlllllllnn" }; plee-the-bear-20251226/bear-factory/bear-editor/src/bf/icon/easing/linear_out.xpm000066400000000000000000000033651512343254000274150ustar00rootroot00000000000000/* XPM */ static const char *linear_out_xpm[] = { /* columns rows colors chars-per-pixel */ "32 24 53 1 ", " c #6BAFF3", ". c #6AB5FF", "X c #6DB6FF", "o c #73B7FA", "O c #70B8FF", "+ c #72B9FF", "@ c #75BAFF", "# c #79BCFF", "$ c #7EBFFF", "% c #95C2EF", "& c #80C0FF", "* c #87C3FF", "= c #88C4FF", "- c #8EC7FF", "; c #93C9FF", ": c #95CAFF", "> c #9BCDFF", ", c #9CCEFF", "< c #A0D0FF", "1 c #ADD6FF", "2 c #B0D8FF", "3 c #B4DAFF", "4 c #BADDFF", "5 c #BDDEFF", "6 c #CBDCED", "7 c #C2E1FF", "8 c #C6E3FF", "9 c #C9E4FF", "0 c #D7E9FB", "q c #D3E9FF", "w c #D6EAFF", "e c #DAEDFF", "r c #DFEFFF", "t c #EAECEF", "y c #EFEFEF", "u c #F0EFED", "i c #F1F0EF", "p c #E0F0FF", "a c #E5F2FF", "s c #E7F3FF", "d c #EAF1F8", "f c #EBF5FF", "g c #EDF6FF", "h c #EFF7FF", "j c #F3F3F3", "k c #F4F4F3", "l c #F4F4F4", "z c #F0F8FF", "x c #F3F9FF", "c c #F5FAFF", "v c #FAFAFA", "b c #FAFDFF", "n c #FEFEFE", /* pixels */ "vjjjjjjjjjjjjjjjjjjjjjjjjjjjk0xn", "vyyjyyyyyjyyyyyjyyyyyjyyyyit%ohn", "nnnnnnnnnnnnnnnnnnnnnnnnnna&*fnn", "nnnnnnnnnnnnnnnnnnnnnnnnn9.1bnnn", "nnnnnnnnnnnnnnnnnnnnnnnb+wnnnnnnnnnnnnnnnnn", "nnnnnnnnnnp#-hnnnnnnnnnnnnnnnnnn", "nnnnnnnnn7.3nnnnnnnnnnnnnnnnnnnn", "nnnnnnnc>+ennnnnnnnnnnnnnnnnnnnn", "nnnnnnr+-xnnnnnnnnnnnnnnnnnnnnnn", "nnnnn5.4bnnnnnnnnnnnnnnnnnnnnnnn", "nnnx:@ennnnnnnnnnnnnnnnnnnnnnnnn", "nnr@;xnnnnnnnnnnnnnnnnnnnnnnnnnn", "n5.4nnnnnnnnnnnnnnnnnnnnnnnnnnnn", "1 6uyyyyyyyyyyyyyyyyyyyyyyyyyjnn", "rdllljjljllllljllljllljlllllllnn" }; plee-the-bear-20251226/bear-factory/bear-editor/src/bf/icon/easing/none_in.xpm000066400000000000000000000021741512343254000266760ustar00rootroot00000000000000/* XPM */ static const char *none_in_xpm[] = { /* columns rows colors chars-per-pixel */ "32 24 11 1 ", " c #A9D4FF", ". c #AFD7FF", "X c #CAE5FF", "o c #CDE6FF", "O c #DEEEFF", "+ c #EFEFEF", "@ c #F3F3F3", "# c #F0F7FF", "$ c #F5FAFF", "% c #FAFAFA", "& c #FEFEFE", /* pixels */ "%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&&", "%++@+++++@+++++@+++++@+++++@+@&&", "&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&", "&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&", "&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&", "&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&", "&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&", "&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&", "&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&", "&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&", "&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&", "&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&", "&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&", "&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&", "&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&", "&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&", "&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&", "&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&", "&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&", "&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&", "&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&", "&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&", "X .#&", "OXXXXXXXXXXXXXXXXXXXXXXXXXXXXo$&" }; plee-the-bear-20251226/bear-factory/bear-editor/src/bf/icon/easing/none_in_out.xpm000066400000000000000000000022001512343254000275530ustar00rootroot00000000000000/* XPM */ static const char *none_in_out_xpm[] = { /* columns rows colors chars-per-pixel */ "32 24 11 1 ", " c #A9D4FF", ". c #AFD7FF", "X c #CAE5FF", "o c #CDE6FF", "O c #DEEEFF", "+ c #EFEFEF", "@ c #F3F3F3", "# c #F0F7FF", "$ c #F5FAFF", "% c #FAFAFA", "& c #FEFEFE", /* pixels */ "%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&&", "%++@+++++@+++++@+++++@+++++@+@&&", "&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&", "&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&", "&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&", "&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&", "&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&", "&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&", "&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&", "&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&", "&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&", "&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&", "&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&", "&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&", "&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&", "&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&", "&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&", "&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&", "&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&", "&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&", "&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&", "&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&", "X .#&", "OXXXXXXXXXXXXXXXXXXXXXXXXXXXXo$&" }; plee-the-bear-20251226/bear-factory/bear-editor/src/bf/icon/easing/none_out.xpm000066400000000000000000000021751512343254000271000ustar00rootroot00000000000000/* XPM */ static const char *none_out_xpm[] = { /* columns rows colors chars-per-pixel */ "32 24 11 1 ", " c #A9D4FF", ". c #AFD7FF", "X c #CAE5FF", "o c #CDE6FF", "O c #DEEEFF", "+ c #EFEFEF", "@ c #F3F3F3", "# c #F0F7FF", "$ c #F5FAFF", "% c #FAFAFA", "& c #FEFEFE", /* pixels */ "%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&&", "%++@+++++@+++++@+++++@+++++@+@&&", "&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&", "&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&", "&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&", "&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&", "&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&", "&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&", "&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&", "&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&", "&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&", "&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&", "&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&", "&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&", "&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&", "&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&", "&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&", "&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&", "&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&", "&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&", "&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&", "&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&", "X .#&", "OXXXXXXXXXXXXXXXXXXXXXXXXXXXXo$&" }; plee-the-bear-20251226/bear-factory/bear-editor/src/bf/icon/easing/quad_in.xpm000066400000000000000000000034011512343254000266630ustar00rootroot00000000000000/* XPM */ static const char *quad_in_xpm[] = { /* columns rows colors chars-per-pixel */ "32 24 54 1 ", " c #7CB5ED", ". c #6EB3F8", "X c #6AB5FF", "o c #6CB6FF", "O c #74B3F1", "+ c #70B8FF", "@ c #73B9FF", "# c #76BBFF", "$ c #7CBEFF", "% c #7FC0FF", "& c #9DC5ED", "* c #87C3FF", "= c #88C4FF", "- c #8EC7FF", "; c #92C9FF", ": c #98CCFF", "> c #A3D1FF", ", c #A6D3FF", "< c #A9D5FF", "1 c #AED7FF", "2 c #B3D9FF", "3 c #B6DBFF", "4 c #BCDEFF", "5 c #BFDFFF", "6 c #CADCED", "7 c #D8E3EF", "8 c #C7E3FF", "9 c #C9E4FF", "0 c #CEE7FF", "q c #D0E8FF", "w c #D4EAFF", "e c #DEECF9", "r c #DBEDFF", "t c #DEEEFF", "y c #EAECED", "u c #EFEFEF", "i c #F1EFED", "p c #F0F0EF", "a c #E0EFFF", "s c #E9F0F6", "d c #E0F0FF", "f c #E6F2FF", "g c #EBF5FF", "h c #EFF7FF", "j c #F3F3F3", "k c #F4F3F3", "l c #F4F4F4", "z c #F5F5F4", "x c #F9F7F4", "c c #F3F9FF", "v c #F6FBFF", "b c #FAFAFA", "n c #FAFCFF", "m c #FEFEFE", /* pixels */ "bjjjjjjjjjjjjjjjjjjjjjjjjjjjkecm", "buujuuuuujuuuuujuuuuujuuuuup7.fm", "mmmmmmmmmmmmmmmmmmmmmmmmmmmm=,mm", "mmmmmmmmmmmmmmmmmmmmmmmmmmm2$nmm", "mmmmmmmmmmmmmmmmmmmmmmmmmmrXdmmm", "mmmmmmmmmmmmmmmmmmmmmmmmmc@4mmmm", "mmmmmmmmmmmmmmmmmmmmmmmmm-:mmmmm", "mmmmmmmmmmmmmmmmmmmmmmmm1$vmmmmm", "mmmmmmmmmmmmmmmmmmmmmmm8Xfmmmmmm", "mmmmmmmmmmmmmmmmmmmmmmroqmmmmmmm", "mmmmmmmmmmmmmmmmmmmmmfo4mmmmmmmm", "mmmmmmmmmmmmmmmmmmmmg#2mmmmmmmmm", "mmmmmmmmmmmmmmmmmmmh#,mmmmmmmmmm", "mmmmmmmmmmmmmmmmmmg#>mmmmmmmmmmm", "mmmmmmmmmmmmmmmmmdo:-O &6yiuuuuuuuuuuuuuuuuuuujmm", "r9wdszxzlzzjzjjzzzkzzzjzzzzzzzmm" }; plee-the-bear-20251226/bear-factory/bear-editor/src/bf/icon/easing/quad_in_out.xpm000066400000000000000000000033111512343254000275520ustar00rootroot00000000000000/* XPM */ static const char *quad_in_out_xpm[] = { /* columns rows colors chars-per-pixel */ "32 24 50 1 ", " c #72B1EF", ". c #6FB0F1", "X c #69B5FF", "o c #6EB7FF", "O c #70B8FF", "+ c #79B9F8", "@ c #7ABDFF", "# c #7EBFFF", "$ c #88BBED", "% c #80C0FF", "& c #8AC5FF", "* c #96CBFF", "= c #97CCFF", "- c #98CCFF", "; c #9FCFFF", ": c #A1C8EF", "> c #A5D2FF", ", c #A8D3FF", "< c #ADD6FF", "1 c #B4DAFF", "2 c #BBDDFF", "3 c #BEDEFF", "4 c #BFDFFF", "5 c #C6DAED", "6 c #DDE6EF", "7 c #C1E0FF", "8 c #C6E3FF", "9 c #CBE5FF", "0 c #D5EAFF", "q c #D7ECFF", "w c #DDEBFA", "e c #DAEDFF", "r c #DFEFFF", "t c #EFEEED", "y c #EFEFEF", "u c #ECF1F6", "i c #E3F2FF", "p c #E7F3FF", "a c #E9F4FF", "s c #F3F3F3", "d c #F4F3F3", "f c #F7F5F3", "g c #F5F4F4", "h c #F8F6F4", "j c #F0F8FF", "k c #F2F8FF", "l c #F6FAFF", "z c #FAFAFA", "x c #FBFDFF", "c c #FEFEFE", /* pixels */ "zssssssssssssssssssssssssfuw98lc", "zyysyyyyysyyyyysyyyyysyy6: +-1kc", "ccccccccccccccccccccccx1O-qxcccc", "ccccccccccccccccccccca%%rccccccc", "cccccccccccccccccccceo>ccccccccc", "ccccccccccccccccccceX4cccccccccc", "cccccccccccccccccceX7ccccccccccc", "cccccccccccccccccao4cccccccccccc", "cccccccccccccccck@,ccccccccccccc", "cccccccccccccccc-*cccccccccccccc", "ccccccccccccccc7Okcccccccccccccc", "ccccccccccccccpo0ccccccccccccccc", "cccccccccccccc&>cccccccccccccccc", "ccccccccccccc1@lcccccccccccccccc", "cccccccccccceXrccccccccccccccccc", "cccccccccccao4cccccccccccccccccc", "cccccccccck@,ccccccccccccccccccc", "ccccccccck%-cccccccccccccccccccc", "cccccccck#=xcccccccccccccccccccc", "cccccccrO>xccccccccccccccccccccc", "cccccl c #94CAFF", ", c #97CBFF", "< c #99CCFF", "1 c #AECFEF", "2 c #A3D1FF", "3 c #A9D4FF", "4 c #B3D9FF", "5 c #B6DBFF", "6 c #B8DCFF", "7 c #DBE5EF", "8 c #C1E0FF", "9 c #C5E2FF", "0 c #C6E2FF", "q c #CBE5FF", "w c #CCE6FF", "e c #D2E9FF", "r c #D7EBFF", "t c #DFEFFF", "y c #EDEDED", "u c #EFEFEF", "i c #F1F0EF", "p c #EBEFF3", "a c #EFF3F6", "s c #E2F0FE", "d c #E3F1FF", "f c #E4F2FF", "g c #E9F4FF", "h c #ECF6FF", "j c #EFF7FF", "k c #F3F3F3", "l c #F4F3F3", "z c #F7F5F3", "x c #F4F4F4", "c c #F5F5F4", "v c #F3F9FF", "b c #F4FAFF", "n c #F7FBFF", "m c #FAFAFA", "M c #FCFEFF", "N c #FEFEFE", /* pixels */ "mkkkkkkkkkkkkkkkkkkkkkllzase99nN", "muukuuuuukuuuuukuuuuii71% &>24vN", "NNNNNNNNNNNNNNNNNNNNr:@,9gNNNNNN", "NNNNNNNNNNNNNNNNNNr=@5jNNNNNNNNN", "NNNNNNNNNNNNNNNNj;uuuuuuuiuuuuuuuuuuuuuuuuiuulNN", "skllxxkkkxxxxkkxlxkxxxkxxxxxxlNN" }; plee-the-bear-20251226/bear-factory/bear-editor/src/bf/icon/easing/quart_in.xpm000066400000000000000000000033251512343254000270720ustar00rootroot00000000000000/* XPM */ static const char *quart_in_xpm[] = { /* columns rows colors chars-per-pixel */ "32 24 51 1 ", " c #76B2ED", ". c #7DB5ED", "X c #6FB7FF", "o c #70B8FF", "O c #76BBFF", "+ c #77BBFF", "@ c #7DBEFF", "# c #80BBF5", "$ c #97C2ED", "% c #81C0FF", "& c #86C3FF", "* c #8AC5FF", "= c #8DC6FF", "- c #90C8FF", "; c #9ACCFF", ": c #9DCEFF", "> c #BED6ED", ", c #A0CFFF", "< c #A1D0FF", "1 c #A5D2FF", "2 c #A9D5FF", "3 c #ABD5FF", "4 c #B5DAFF", "5 c #BEDFFF", "6 c #C9E4FF", "7 c #CDE6FF", "8 c #D1E8FF", "9 c #D7ECFF", "0 c #DAEDFF", "q c #DEEFFF", "w c #E4E9ED", "e c #ECEDEE", "r c #EFEFEF", "t c #F1EFED", "y c #E1EDF9", "u c #ECF0F4", "i c #E2F1FF", "p c #E3F1FF", "a c #E6F3FF", "s c #EAF5FF", "d c #EDF6FF", "f c #F3F3F3", "g c #F4F3F3", "h c #F5F5F4", "j c #F9F7F4", "k c #F0F8FF", "l c #F3F9FF", "z c #F4FAFF", "x c #FAFAFA", "c c #F8FCFF", "v c #FEFEFE", /* pixels */ "xffffffffffffffffffffffffffffyzv", "xrrfrrrrrfrrrrrfrrrrrfrrrrrfr.qv", "vvvvvvvvvvvvvvvvvvvvvvvvvvvvq@cv", "vvvvvvvvvvvvvvvvvvvvvvvvvvvv31vv", "vvvvvvvvvvvvvvvvvvvvvvvvvvvc@0vv", "vvvvvvvvvvvvvvvvvvvvvvvvvvv7%vvv", "vvvvvvvvvvvvvvvvvvvvvvvvvvv*5vvv", "vvvvvvvvvvvvvvvvvvvvvvvvvviOzvvv", "vvvvvvvvvvvvvvvvvvvvvvvvvv:1vvvv", "vvvvvvvvvvvvvvvvvvvvvvvvvaosvvvv", "vvvvvvvvvvvvvvvvvvvvvvvvv:wrrrrrrrrrrrrrgvv", "q66666789iauhjhhhhghhhghhhhhhhvv" }; plee-the-bear-20251226/bear-factory/bear-editor/src/bf/icon/easing/quart_in_out.xpm000066400000000000000000000035211512343254000277570ustar00rootroot00000000000000/* XPM */ static const char *quart_in_out_xpm[] = { /* columns rows colors chars-per-pixel */ "32 24 59 1 ", " c #72B0ED", ". c #7EB6EF", "X c #6AB5FF", "o c #6FB8FF", "O c #71B1F1", "+ c #7BB8F6", "@ c #71B8FF", "# c #76BBFF", "$ c #77BBFF", "% c #7ABDFF", "& c #7DBEFF", "* c #9CC5ED", "= c #81C0FF", "- c #87C3FF", "; c #8AC4FC", ": c #8DC6FF", "> c #8EC7FF", ", c #93C9FF", "< c #97CBFF", "1 c #98CCFF", "2 c #9CCDFF", "3 c #9FCFFF", "4 c #BBD5EF", "5 c #A0D0FF", "6 c #A5D2FF", "7 c #A9D4FF", "8 c #ADD6FF", "9 c #AFD7FF", "0 c #B3D9FF", "q c #B6DAFF", "w c #BEDEFF", "e c #DDE5ED", "r c #C3E2FF", "t c #C5E2FF", "y c #C9E4FF", "u c #CCE6FF", "i c #D0E7FF", "p c #D2E8FF", "a c #D6EAFF", "s c #D6EBFF", "d c #D9EBFD", "f c #DBEDFF", "g c #EFEFEF", "h c #F0EFED", "j c #E5EDF4", "k c #E2F0FF", "l c #E5F2FF", "z c #EFF7FF", "x c #F3F3F3", "c c #F4F3F3", "v c #F1F3F4", "b c #F4F4F4", "n c #F9F6F4", "m c #F2F9FF", "M c #F5FAFF", "N c #F7FBFF", "B c #FAFAFA", "V c #F8FCFF", "C c #FEFEFE", /* pixels */ "BxxxxxxxxxxxxxxxxxxxcccjdutrrtmC", "Bggxgggggxgggggxggggg4.O;3798qmC", "CCCCCCCCCCCCCCCCCCCm:%rmCCCCCCCC", "CCCCCCCCCCCCCCCCCCm& c #A4CAEF", ", c #A1D0FF", "< c #A5D2FF", "1 c #A8D4FF", "2 c #AAD4FF", "3 c #ACD5FF", "4 c #B7D4F0", "5 c #B3D9FF", "6 c #B5DAFF", "7 c #BBDDFF", "8 c #BCDEFF", "9 c #D0DFEF", "0 c #C3E1FF", "q c #C6E3FF", "w c #C7E3FF", "e c #CCE6FF", "r c #CEE7FF", "t c #D3E9FF", "y c #D6EAFF", "u c #DEEDFC", "i c #EFEFEF", "p c #F0EFED", "a c #F2F0EF", "s c #E2EBF4", "d c #EFF3F6", "f c #E1F0FF", "g c #E5F2FF", "h c #EAF5FF", "j c #EFF7FF", "k c #F3F3F3", "l c #F5F4F3", "z c #F4F4F4", "x c #F5F5F4", "c c #F1F8FF", "v c #F7FBFF", "b c #FAFAFA", "n c #FAFCFF", "m c #FEFEFE", /* pixels */ "bkkkkkkkkkkkkkkllldsuyew00000wvm", "biikiiiiikiiipi9># o&:,2233536cm", "mmmmmmmmmmmmne$+ c #96CBFF", ", c #99CCFF", "< c #9BCDFF", "1 c #B5D1ED", "2 c #A4D2FF", "3 c #A6D3FF", "4 c #A7D3FF", "5 c #A9D4FF", "6 c #AED7FF", "7 c #BCDDFF", "8 c #DFE6ED", "9 c #C0E0FF", "0 c #C1E0FF", "q c #C7E3FF", "w c #C9E4FF", "e c #CDE6FF", "r c #D1E8FF", "t c #D5EAFF", "y c #DBEDFF", "u c #DEEEFF", "i c #EDEDED", "p c #EFEFEF", "a c #F1EFED", "s c #E8EFF5", "d c #E1EDF8", "f c #E1F0FF", "g c #E7F3FF", "h c #EBF5FF", "j c #EDF6FF", "k c #EEF7FF", "l c #F3F3F3", "z c #F2F3F4", "x c #F4F4F4", "c c #F6F6F6", "v c #F8F6F4", "b c #F3F9FF", "n c #F4F9FF", "m c #F7FBFF", "M c #FAFAFA", "N c #FAFDFF", "B c #FEFEFE", /* pixels */ "MlllllllllllllllllllllllllllldbB", "Mpplppppplppppplppppplppppplp%yB", "BBBBBBBBBBBBBBBBBBBBBBBBBBBBh#bB", "BBBBBBBBBBBBBBBBBBBBBBBBBBBBq:BB", "BBBBBBBBBBBBBBBBBBBBBBBBBBBB,7BB", "BBBBBBBBBBBBBBBBBBBBBBBBBBBb@gBB", "BBBBBBBBBBBBBBBBBBBBBBBBBBBe=BBB", "BBBBBBBBBBBBBBBBBBBBBBBBBBB:7BBB", "BBBBBBBBBBBBBBBBBBBBBBBBBBk@hBBB", "BBBBBBBBBBBBBBBBBBBBBBBBBB7-BBBB", "BBBBBBBBBBBBBBBBBBBBBBBBBB#eBBBB", "BBBBBBBBBBBBBBBBBBBBBBBBBe@NBBBB", "BBBBBBBBBBBBBBBBBBBBBBBBB&0BBBBB", "BBBBBBBBBBBBBBBBBBBBBBBBrOmBBBBB", "BBBBBBBBBBBBBBBBBBBBBBBN@0BBBBBB", "BBBBBBBBBBBBBBBBBBBBBBB6&NBBBBBB", "BBBBBBBBBBBBBBBBBBBBBBy.fBBBBBBB", "BBBBBBBBBBBBBBBBBBBBBho7BBBBBBBB", "BBBBBBBBBBBBBBBBBBBBh+4BBBBBBBBB", "BBBBBBBBBBBBBBBBBBByX4BBBBBBBBBB", "BBBBBBBBBBBBBBBBBg>X0BBBBBBBBBBB", "BBBBBBBBBBBBNmd9:O2kBBBBBBBBBBBB", "w555555222,>* $18apppppppppplBB", "ywwwwwwwertufszvcclccxlllclclcBB" }; plee-the-bear-20251226/bear-factory/bear-editor/src/bf/icon/easing/quint_in_out.xpm000066400000000000000000000033671512343254000277730ustar00rootroot00000000000000/* XPM */ static const char *quint_in_out_xpm[] = { /* columns rows colors chars-per-pixel */ "32 24 53 1 ", " c #6FAFEE", ". c #77B3EE", "X c #6AB5FF", "o c #74B4F3", "O c #71B9FF", "+ c #76BBFF", "@ c #78BCFF", "# c #7FBFFF", "$ c #82BEFA", "% c #98C3ED", "& c #82C1FF", "* c #86C3FF", "= c #87C3FF", "- c #8EC7FF", "; c #91C8FE", ": c #94C9FF", "> c #97CCFF", ", c #9BCDFF", "< c #9DCFFF", "1 c #B9D4EF", "2 c #A1D0FF", "3 c #A6D3FF", "4 c #A9D4FF", "5 c #AED7FF", "6 c #B3D9FF", "7 c #B5DAFF", "8 c #B8DCFF", "9 c #BFDFFF", "0 c #DEE6ED", "q c #C0E0FF", "w c #C1E0FF", "e c #C4E2FF", "r c #CAE5FF", "t c #CCE6FF", "y c #CFE7FF", "u c #D6EBFF", "i c #DAECFF", "p c #DEEEFF", "a c #EFEFEF", "s c #E3ECF6", "d c #EFF2F5", "f c #E3F1FF", "g c #E4F0FC", "h c #EBF5FF", "j c #F3F3F3", "k c #F4F4F4", "l c #F8F6F4", "z c #F0F8FF", "x c #F6FBFF", "c c #FAFAFA", "v c #F8FBFF", "b c #F9FCFF", "n c #FEFEFE", /* pixels */ "cjjjjjjjjjjjjjjjjjjjkjsurwwwwexn", "caajaaaaajaaaaajaaaa1.o;245657zn", "nnnnnnnnnnnnnnnnnnv<+rxnnnnnnnnn", "nnnnnnnnnnnnnnnnnn,&znnnnnnnnnnn", "nnnnnnnnnnnnnnnnnrOznnnnnnnnnnnn", "nnnnnnnnnnnnnnnnx+rnnnnnnnnnnnnn", "nnnnnnnnnnnnnnnn9=nnnnnnnnnnnnnn", "nnnnnnnnnnnnnnnn&tnnnnnnnnnnnnnn", "nnnnnnnnnnnnnnnp@bnnnnnnnnnnnnnn", "nnnnnnnnnnnnnnn43nnnnnnnnnnnnnnn", "nnnnnnnnnnnnnnn&innnnnnnnnnnnnnn", "nnnnnnnnnnnnnnf#bnnnnnnnnnnnnnnn", "nnnnnnnnnnnnnn9,nnnnnnnnnnnnnnnn", "nnnnnnnnnnnnnn:ennnnnnnnnnnnnnnn", "nnnnnnnnnnnnnz@hnnnnnnnnnnnnnnnn", "nnnnnnnnnnnnnw-nnnnnnnnnnnnnnnnn", "nnnnnnnnnnnnn=rnnnnnnnnnnnnnnnnn", "nnnnnnnnnnnnu+xnnnnnnnnnnnnnnnnn", "nnnnnnnnnnnb&7nnnnnnnnnnnnnnnnnn", "nnnnnnnnnnn6$bnnnnnnnnnnnnnnnnnn", "nnnnnnnnnnqXpnnnnnnnnnnnnnnnnnnn", "nnnnnnnbf>Oinnnnnnnnnnnnnnnnnnnn", "r44432>$ %0aaaaaaaaaaaaaaaaaajnn", "prrrrtufdlkkkkjkkkjkkkjkkkkkkknn" }; plee-the-bear-20251226/bear-factory/bear-editor/src/bf/icon/easing/quint_out.xpm000066400000000000000000000034411512343254000272760ustar00rootroot00000000000000/* XPM */ static const char *quint_out_xpm[] = { /* columns rows colors chars-per-pixel */ "32 24 56 1 ", " c #75B2EE", ". c #7CB6EF", "X c #6EB7FF", "o c #70B8FF", "O c #78BCFF", "+ c #7EBFFF", "@ c #7FC0FF", "# c #81BBF5", "$ c #9AC5EF", "% c #82C1FF", "& c #85C2FF", "* c #88C4FF", "= c #8EC5FD", "- c #90C8FF", "; c #95CAFF", ": c #9BCDFF", "> c #9DCEFF", ", c #A4D1FF", "< c #A4D2FF", "1 c #A9D4FF", "2 c #ADD7FF", "3 c #BED7F0", "4 c #B5DAFF", "5 c #B7DBFF", "6 c #BFDFFF", "7 c #C8DBEF", "8 c #C3E1FF", "9 c #C6E3FF", "0 c #C7E4FF", "q c #C8E4FF", "w c #CEE7FF", "e c #DFEBF7", "r c #D2E8FF", "t c #D7EBFF", "y c #DAEDFF", "u c #DDEEFF", "i c #DFEFFF", "p c #EFEFEF", "a c #F0EFED", "s c #F2F0EF", "d c #E8EDF3", "f c #EFF3F6", "g c #E4F1FE", "h c #E6F3FF", "j c #ECF5FF", "k c #EEF6FF", "l c #F3F3F3", "z c #F5F4F3", "x c #F4F4F4", "c c #F5F5F4", "v c #F0F8FF", "b c #F6FAFF", "n c #FAFAFA", "m c #F8FBFF", "M c #FBFDFF", "N c #FEFEFE", /* pixels */ "nllllllllllllzzldeyrqq96888869bN", "npplpppppfpap7$. #;>,115222424kN", "NNNNNNNNNNN9++2yvNNNNNNNNNNNNNNN", "NNNNNNNNNk*OqMNNNNNNNNNNNNNNNNNN", "NNNNNNNNio,mNNNNNNNNNNNNNNNNNNNN", "NNNNNNNhX5NNNNNNNNNNNNNNNNNNNNNN", "NNNNNNbO2NNNNNNNNNNNNNNNNNNNNNNN", "NNNNNN:-NNNNNNNNNNNNNNNNNNNNNNNN", "NNNNNrXkNNNNNNNNNNNNNNNNNNNNNNNN", "NNNNMO8NNNNNNNNNNNNNNNNNNNNNNNNN", "NNNN8%NNNNNNNNNNNNNNNNNNNNNNNNNN", "NNNMOwNNNNNNNNNNNNNNNNNNNNNNNNNN", "NNN9+MNNNNNNNNNNNNNNNNNNNNNNNNNN", "NNN&8NNNNNNNNNNNNNNNNNNNNNNNNNNN", "NNhObNNNNNNNNNNNNNNNNNNNNNNNNNNN", "NN1,NNNNNNNNNNNNNNNNNNNNNNNNNNNN", "Nb+yNNNNNNNNNNNNNNNNNNNNNNNNNNNN", "Nt%NNNNNNNNNNNNNNNNNNNNNNNNNNNNN", "N,2NNNNNNNNNNNNNNNNNNNNNNNNNNNNN", "M%iNNNNNNNNNNNNNNNNNNNNNNNNNNNNN", "i%MNNNNNNNNNNNNNNNNNNNNNNNNNNNNN", "2>NNNNNNNNNNNNNNNNNNNNNNNNNNNNNN", "=3spppppppppppppppppppppppppplNN", "gfxxcclllccccllccclccclcccccccNN" }; plee-the-bear-20251226/bear-factory/bear-editor/src/bf/icon/easing/sine_in.xpm000066400000000000000000000033241512343254000266730ustar00rootroot00000000000000/* XPM */ static const char *sine_in_xpm[] = { /* columns rows colors chars-per-pixel */ "32 24 51 1 ", " c #72B0EE", ". c #6BB2F8", "X c #69B5FF", "o c #6DB7FF", "O c #6FB7FF", "+ c #70B8FF", "@ c #77BCFF", "# c #88BBED", "$ c #82C1FF", "% c #85C2FF", "& c #88C4FF", "* c #96CBFF", "= c #97CBFF", "- c #99CCFF", "; c #B6D2ED", ": c #A2D1FF", "> c #A8D3FF", ", c #ABD6FF", "< c #ACD6FF", "1 c #B0D8FF", "2 c #BBDDFF", "3 c #C7DBEF", "4 c #C3E1FF", "5 c #C6E3FF", "6 c #CBE5FF", "7 c #D0E8FF", "8 c #D5EAFF", "9 c #DCEBFA", "0 c #DAEDFF", "q c #DEEEFF", "w c #E3E8ED", "e c #EFEFEF", "r c #F1EFED", "t c #F2F0EF", "y c #E2EFFC", "u c #E0EFFF", "i c #EEF1F5", "p c #E7F3FF", "a c #E8F3FF", "s c #E9F4FF", "d c #EDF6FF", "f c #F3F3F3", "g c #F4F4F3", "h c #F4F4F4", "j c #F5F5F4", "k c #F8F6F4", "l c #F3F9FF", "z c #F6FBFF", "x c #FAFAFA", "c c #F9FCFF", "v c #FEFEFE", /* pixels */ "xfffffffffffffffffffffffffffg9lv", "xeefeeeeefeeeeefeeeeefeeeeet3.sv", "vvvvvvvvvvvvvvvvvvvvvvvvvvvao4vv", "vvvvvvvvvvvvvvvvvvvvvvvvvvl@cvvvvvvvvvvvvvvvvv", "vvvvvvvcvp&@7vvvvvvvvvvvvvvvvvvv", "vvvvvvvp=o1zvvvvvvvvvvvvvvvvvvvv", "vvvcp4&@,dvvvvvvvvvvvvvvvvvvvvvv", "6:=$ #;wreeeeeeereeeeeeeeeeeefvv", "q68yijjjfjjjjffjjjfjjjfjjjjjjjvv" }; plee-the-bear-20251226/bear-factory/bear-editor/src/bf/icon/easing/sine_in_out.xpm000066400000000000000000000034051512343254000275620ustar00rootroot00000000000000/* XPM */ static const char *sine_in_out_xpm[] = { /* columns rows colors chars-per-pixel */ "32 24 54 1 ", " c #6FAFEF", ". c #7BB5EE", "X c #6AB5FF", "o c #6DB6FF", "O c #72B4F6", "+ c #71B9FF", "@ c #76BBFF", "# c #77BBFF", "$ c #7ABDFF", "% c #9CC5ED", "& c #81C0FF", "* c #87C4FF", "= c #8DC6FF", "- c #93C9FF", "; c #95CBFF", ": c #98CCFF", "> c #9ECFFF", ", c #BCD5EF", "< c #A2D1FF", "1 c #A5D2FF", "2 c #ABD5FF", "3 c #AFD7FF", "4 c #B0D7FF", "5 c #B4D9FF", "6 c #B8DCFF", "7 c #BEDFFF", "8 c #DEE6ED", "9 c #C4E2FF", "0 c #CAE4FF", "q c #CEE6FF", "w c #D2E9FF", "e c #D5EAFF", "r c #DAECFF", "t c #DDEEFF", "y c #DFEFFF", "u c #EFEFEF", "i c #E2EDF8", "p c #E0EEFD", "a c #E0F0FF", "s c #E6F3FF", "d c #E7F3FF", "f c #E9F4FF", "g c #EFF7FF", "h c #F3F3F3", "j c #F4F3F3", "k c #F6F4F3", "l c #F0F3F5", "z c #F4F4F4", "x c #F8F6F4", "c c #F3F9FF", "v c #F4FAFF", "b c #FAFAFA", "n c #FAFDFF", "m c #FEFEFE", /* pixels */ "bhhhhhhhhhhhhhhhhhhhhhhhhkkiq9vm", "buuhuuuuuhuuuuuhuuuuuhuuu,.O-3cm", "mmmmmmmmmmmmmmmmmmmmmmmd*$9cmmmm", "mmmmmmmmmmmmmmmmmmmmmm9X2vmmmmmm", "mmmmmmmmmmmmmmmmmmmmm4oemmmmmmmm", "mmmmmmmmmmmmmmmmmmmm<@dmmmmmmmmm", "mmmmmmmmmmmmmmmmmmm1@gmmmmmmmmmm", "mmmmmmmmmmmmmmmmmm2@fmmmmmmmmmmm", "mmmmmmmmmmmmmmmmm6+fmmmmmmmmmmmm", "mmmmmmmmmmmmmmmm0Xymmmmmmmmmmmmm", "mmmmmmmmmmmmmmmrXwmmmmmmmmmmmmmm", "mmmmmmmmmmmmmmfo7mmmmmmmmmmmmmmm", "mmmmmmmmmmmmmv$2mmmmmmmmmmmmmmmm", "mmmmmmmmmmmmn=-mmmmmmmmmmmmmmmmm", "mmmmmmmmmmmm>&vmmmmmmmmmmmmmmmmm", "mmmmmmmmmmm3@gmmmmmmmmmmmmmmmmmm", "mmmmmmmmmm5odmmmmmmmmmmmmmmmmmmm", "mmmmmmmmm5odmmmmmmmmmmmmmmmmmmmm", "mmmmmmmm3oammmmmmmmmmmmmmmmmmmmm", "mmmmmmv:@dmmmmmmmmmmmmmmmmmmmmmm", "mmmmmr$=cmmmmmmmmmmmmmmmmmmmmmmm", "mmny;+6mmmmmmmmmmmmmmmmmmmmmmmmm", "0;& %8uuuuuuuuuuuuuuuuuuuuuuuhmm", "yqylxkhzhzzzzzhzzzhzzzhzzzzzzzmm" }; plee-the-bear-20251226/bear-factory/bear-editor/src/bf/icon/easing/sine_out.xpm000066400000000000000000000033441512343254000270760ustar00rootroot00000000000000/* XPM */ static const char *sine_out_xpm[] = { /* columns rows colors chars-per-pixel */ "32 24 52 1 ", " c #75B2EE", ". c #69B4FF", "X c #6FB7FF", "o c #6FB8FF", "O c #77B6F4", "+ c #71B8FF", "@ c #75BAFF", "# c #7ABDFF", "$ c #7EBFFF", "% c #7FBFFF", "& c #85BBF1", "* c #98C4EF", "= c #81C0FF", "- c #84C2FF", "; c #86C3FF", ": c #8CC6FF", "> c #8EC7FF", ", c #90C8FF", "< c #96CBFF", "1 c #98CCFF", "2 c #9CCEFF", "3 c #A1D0FF", "4 c #A6D3FF", "5 c #ABD6FF", "6 c #B4D9FF", "7 c #BBDDFF", "8 c #BCDEFF", "9 c #CCDDEF", "0 c #C4E2FF", "q c #C6E2FF", "w c #CBE5FF", "e c #CEE7FF", "r c #D8ECFF", "t c #DBEDFF", "y c #DCEDFF", "u c #EFEFEF", "i c #F2F0EF", "p c #E2ECF7", "a c #EEF2F7", "s c #E1F0FE", "d c #E8F3FF", "f c #EBF5FF", "g c #EEF6FF", "h c #F3F3F3", "j c #F5F4F3", "k c #F4F4F4", "l c #F3F9FF", "z c #F5FAFF", "x c #F7FBFF", "c c #FAFAFA", "v c #FBFDFF", "b c #FEFEFE", /* pixels */ "chhhhhhhhhhhhhhhhhhhhhhjjhpt00xb", "cuuhuuuuuhuuuuuhuuuuuiu9* O,36lb", "bbbbbbbbbbbbbbbbbbbbvw=#5txbbbbb", "bbbbbbbbbbbbbbbbbbbr%%0vbbbbbbbb", "bbbbbbbbbbbbbbbbbx2+8bbbbbbbbbbb", "bbbbbbbbbbbbbbbbt@,fbbbbbbbbbbbb", "bbbbbbbbbbbbbbb8.7bbbbbbbbbbbbbb", "bbbbbbbbbbbbbv3+tbbbbbbbbbbbbbbb", "bbbbbbbbbbbbx>=fbbbbbbbbbbbbbbbb", "bbbbbbbbbbbl=:xbbbbbbbbbbbbbbbbb", "bbbbbbbbbbl% c #A5A7A1", ", c #FEFEFE", "' c #EBECE9", ") c #E7E9E5", "! c #E5E8E3", "~ c #E3E6E1", "{ c #E1E4DE", "] c #E2E5DF", "^ c #D9DAD8", "/ c #FDFDFD", "( c #BDBEBA", "_ c #A3A6A0", ": c #FDFEFD", "< c #E4E7E2", "[ c #E3E5E0", "} c #DFE2DC", "| c #DDE0DA", "1 c #C4C6C1", "2 c #FCFDFC", "3 c #AAACA8", "4 c #A2A49E", "5 c #E4E6E1", "6 c #888A85", "7 c #DBDED7", "8 c #BFC1BB", "9 c #ACB0AA", "0 c #B2B3B1", "a c #D9DBD8", "b c #A1A49D", "c c #A0A29C", "d c #E0E3DC", "e c #DCDFD8", "f c #D9DCD6", "g c #D8DBD4", "h c #D5D9D1", "i c #CED2CB", "j c #C9CDC6", "k c #CE5C00", "l c #9EA19B", "m c #DCE0DA", "n c #F5D400", "o c #FCAF3E", "p c #9D9F99", "q c #DCDFD9", "r c #DADCD6", "s c #D9DDD6", "t c #D9DCD5", "u c #F57900", "v c #9B9D97", "w c #CC5D04", "x c #999B96", "y c #E0E3DD", "z c #DFE1DC", "A c #E0E2DD", "B c #B17A4A", "C c #979A94", "D c #ECC3A2", "E c #949691", "F c #969892", "G c #E7E8E4", "H c #E5E7E3", "I c #E6E8E3", "J c #E6E8E4", "K c #000000", "L c #6B5736", "M c #E2CDB8", "N c #93958F", "O c #FEFEFD", "P c #E9EAE7", "Q c #E5CFBA", "R c #ECEDEA", "S c #90928D", "T c #92958F", "U c #EDEEEB", "V c #EEEFEC", "W c #EFF0ED", "X c #EFF0EE", "Y c #FFFFFE", "Z c #8F918C", "` c #969893", " . c #ECEDEB", ".. c #FEFFFE", "+. c #EFEFEE", "@. c #91938D", "#. c #8E908B", "$. c #8D8F8A", "%. c #8D8F89", "&. c #8C8E89", "*. c #8C8E88", "=. c #90928E", " . + @ # $ $ % @ ", " + & * * * * * = - ; ", " > , ' ) ! ~ { ] ^ / ( ", " _ : ) < [ { } | 1 * 2 3 ", " 4 / 5 6 6 6 6 7 8 9 0 a b ", " c / d | e 7 f g h i j k k ", " l / m 6 6 6 6 6 6 6 k n o k ", " p / q r s t t t f k n o u k ", " v / | 6 6 6 6 6 k n o u k w ", " x / y z } A A k n o u k B ", " C / ~ 6 6 6 6 k o u k D E ", " F : G H I J k K L k M , N ", " E O P 6 6 6 K k Q ' R , S ", " T , R R U V & W X X X Y Z ", " ` ...Y Y * * * * * * +.@. ", " E #.#.#.$.$.%.&.&.*.=. "}; plee-the-bear-20251226/bear-factory/bear-editor/src/bf/icon/graphism.xpm000066400000000000000000000007061512343254000256140ustar00rootroot00000000000000/* XPM */ static const char* graphism_xpm[] = { "16 16 5 1", " c None", ". c #737013", "+ c #9CB51E", "@ c #808080", "# c #1F98FF", " ......+++++....", "@......+++++....", "@......+++++....", "@......+++++....", "@......+++++....", "@......+++++....", "@......+++++....", "@......+++++....", "@......+++++....", "@......+++++....", "@......+++++....", "@......+++++....", "@......+++++....", "@###############", "@###############", "@@@@@@@@@@@@@@@ "}; plee-the-bear-20251226/bear-factory/bear-editor/src/bf/icon/item_class.xpm000066400000000000000000000017101512343254000261210ustar00rootroot00000000000000/* XPM */ static const char * item_class_xpm[] = { "16 16 39 1", " c None", ". c #FFFFFF", "+ c #0E6091", "@ c #2199FF", "# c #299DFF", "$ c #2B9EFF", "% c #31A0FF", "& c #37A3FF", "* c #3BA5FF", "= c #41A8FF", "- c #47ABFF", "; c #1795FF", "> c #1D97FF", ", c #239AFF", "' c #279CFF", ") c #FFFF00", "! c #0A4568", "~ c #1192FF", "{ c #2FA0FF", "] c #0B8FFF", "^ c #45AAFF", "/ c #058CFF", "( c #0D90FF", "_ c #1594FF", ": c #1B96FF", "< c #35A2FF", "[ c #3FA7FF", "} c #038BFF", "| c #078DFF", "1 c #0088FC", "2 c #0085F6", "3 c #0089FE", "4 c #0083F2", "5 c #018AFF", "6 c #0F91FF", "7 c #007FEA", "8 c #0082F0", "9 c #259BFF", "0 c #007CE6", " . ", " +++++++.+. . ", " +@#$%&*=-... ", " +;>,'$%&...)...", "!+~;>,'${&*...+ ", "!+]~;>@'$%.*.^. ", "!+/(~_:,'${<.[+ ", "!+}|(~_:@'${<*+ ", "!+1}/]~;:,'${<+ ", "!+23}/]~;:@'${+ ", "!+4215/]6;:@'#+ ", "!+78215/]~_:@9+ ", "!+074215/]~_:@+ ", "!!+078215/]~_+ ", " !!++++++++++ ", " !!!!!!!!!! "}; plee-the-bear-20251226/bear-factory/bear-editor/src/bf/icon/player_end.xpm000066400000000000000000000023231512343254000261210ustar00rootroot00000000000000/* XPM */ /* From the Gnome icon theme. */ static const char* player_end_xpm[] = { /* columns rows colors chars-per-pixel */ "16 16 51 1", " c #40403E", ". c #464744", "X c #484846", "o c #494A47", "O c #4A4B47", "+ c #4A4B48", "@ c #4B4C49", "# c #4B4D49", "$ c #4B4E49", "% c #4C4D4A", "& c #4E4F4C", "* c #535451", "= c #555753", "- c #575955", "; c #585A56", ": c #595B57", "> c #5A5C58", ", c #5B5D58", "< c #5B5D59", "1 c #5F615D", "2 c #60615C", "3 c #60615D", "4 c #6A6B69", "5 c #6E6F6D", "6 c #70706F", "7 c #7B7B7A", "8 c #A5A6A5", "9 c #A9AAA8", "0 c #ACADAC", "q c #B1B2B0", "w c #B8BAB6", "e c #BABBB8", "r c #BCBDBB", "t c #BDBDBC", "y c gray74", "u c #C1C2BF", "i c #C6C8C5", "p c #C8C9C7", "a c #CECFCD", "s c #D6D7D5", "d c #DEDEDD", "f c #E1E1E0", "g c #E2E2E1", "h c #E2E3E1", "j c #E8E9E8", "k c #EAEAE9", "l c #EDEEED", "z c #EEEEED", "x c #F6F6F6", "c c #FBFBFB", "v c None", /* pixels */ "vvvvvvvvvvvvvvvv", "vvvvvvvvvvvvvvvv", "vvvvvvvvvvvvvvvv", "v. vvvv. vvv===v", "v.9&vvv.9&vv-f1v", "voxd4Xvoxd4X-u:v", "v+fwg8%Ofwg8;p>v", "v@kiext+kiexra:v", "v#zhl0*@zhl0:s>v", "v$cj56v$cj56>s,v", "v.q2yvv.q3yv c #70706F", ", c #7B7B7A", "< c #A5A6A5", "1 c #A9AAA8", "2 c #ACADAC", "3 c #B1B2B0", "4 c #B8BAB6", "5 c #BABBB8", "6 c #BDBDBC", "7 c gray74", "8 c #C6C8C5", "9 c #DEDEDD", "0 c #E1E1E0", "q c #E2E2E1", "w c #E2E3E1", "e c #E8E9E8", "r c #EAEAE9", "t c #EDEEED", "y c #EEEEED", "u c #F6F6F6", "i c #FBFBFB", "p c None", /* pixels */ "pppppppppppppppp", "pppppppppppppppp", "pppppppppppppppp", "pp. pppp. pppppp", "pp.1&ppp.1&ppppp", "ppou9;Xpou9;Xppp", "pp+04q<%O04q<%pp", "pp@r85u6+r85u6.p", "pp#ywt2*@ywt2*pp", "pp$ie:>p$ie:>ppp", "pp.3=7pp.3-7pppp", "pp.,pppp.,pppppp", "pppppppppppppppp", "pppppppppppppppp", "pppppppppppppppp", "pppppppppppppppp" }; plee-the-bear-20251226/bear-factory/bear-editor/src/bf/icon/player_play.xpm000066400000000000000000000023061512343254000263210ustar00rootroot00000000000000/* XPM */ /* From the Gnome icon theme. */ static const char* player_play_xpm[] = { /* columns rows colors chars-per-pixel */ "16 16 50 1", " c #424240", ". c #464744", "X c #4F514E", "o c #50514F", "O c #5B5C59", "+ c #5D5E5C", "@ c #60615E", "# c #626261", "$ c #646462", "% c #686866", "& c #70706E", "* c #757774", "= c #777875", "- c #7D7F7C", "; c #7F7F7D", ": c #8F918E", "> c #91918F", ", c #969794", "< c #969795", "1 c #9B9D9B", "2 c #A6A8A3", "3 c #B1B2AE", "4 c #B6B7B5", "5 c #BBBDB9", "6 c #BEC0BD", "7 c #C4C4C3", "8 c #C9CAC7", "9 c #CBCCCA", "0 c #CCCECB", "q c #CDCECC", "w c #D1D2D0", "e c #D3D4D2", "r c #D4D5D2", "t c #D7D8D5", "y c #DBDCDA", "u c #DEDFDD", "i c #E0E0DF", "p c #E1E2E0", "a c #E2E2E1", "s c #E2E3E2", "d c #E5E5E4", "f c #E8E9E7", "g c #E9E9E8", "h c #EAEAE9", "j c #ECECEB", "k c #ECEDEC", "l c #EDEDEC", "z c #F1F1F1", "x c gray100", "c c None", /* pixels */ "cccccccccccccccc", "cccccccccccccccc", "ccc. ccccccccccc", "ccc.4occcccccccc", "ccc.xa:Xcccccccc", "ccc.p2ri&+cccccc", "ccc.d359fq#;cccc", "ccc.g68euhx@,ccc", "ccc.l0tpkw%>cccc", "ccc.zyjs=*cccccc", "ccc.xk<$cccccccc", "ccc.7O1ccccccccc", "ccc.-ccccccccccc", "cccccccccccccccc", "cccccccccccccccc", "cccccccccccccccc" }; plee-the-bear-20251226/bear-factory/bear-editor/src/bf/icon/player_rewind.xpm000066400000000000000000000016341512343254000266470ustar00rootroot00000000000000/* XPM */ /* From the Gnome icon theme. */ static const char* player_rewind_xpm[] = { /* columns rows colors chars-per-pixel */ "16 16 30 1", " c #3D3F3D", ". c #444644", "X c #464744", "o c #4B4C4A", "O c #535452", "+ c #60615F", "@ c #646462", "# c #686866", "$ c #757675", "% c #868786", "& c #9B9B9A", "* c #A1A1A0", "= c #A8A8A6", "- c #A9AAA8", "; c #B3B3B2", ": c #BABBB8", "> c #BABCB8", ", c #C5C7C4", "< c #DBDBDA", "1 c #E2E3E1", "2 c #E3E4E2", "3 c #E3E4E3", "4 c #E5E6E5", "5 c #EDEDEC", "6 c #EEEEED", "7 c #F1F2F1", "8 c #FBFBFB", "9 c #FEFEFD", "0 c gray100", "q c None", /* pixels */ "qqqqqqqqqqqqqqqq", "qqqqqqqqqqqqqqqq", "qqqqqqqqqqqqqqqq", "qqqqqq Xqqqq Xqq", "qqqqqo-Xqqqo-Xqq", "qqq.@<8Xq.@<8Xqq", "qqo&3:2Xo&3:2Xqq", "qX=0>,5X=0>,5Xqq", "qqO*617XO*617Xqq", "qqq$#49Xq$#49Xqq", "qqqqq+;Xqqq+;Xqq", "qqqqqq%Xqqqq%Xqq", "qqqqqqqqqqqqqqqq", "qqqqqqqqqqqqqqqq", "qqqqqqqqqqqqqqqq", "qqqqqqqqqqqqqqqq" }; plee-the-bear-20251226/bear-factory/bear-editor/src/bf/icon/player_start.xpm000066400000000000000000000017651512343254000265210ustar00rootroot00000000000000/* XPM */ /* From the Gnome icon theme. */ static const char* player_start_xpm[] = { /* columns rows colors chars-per-pixel */ "16 16 36 1", " c #3D3F3D", ". c #444644", "X c #464744", "o c #4B4C4A", "O c #535452", "+ c #555753", "@ c #60615F", "# c #646462", "$ c #686866", "% c #757675", "& c #868786", "* c #9B9B9A", "= c #A1A2A0", "- c #A8A8A6", "; c #A9AAA8", ": c #B3B3B2", "> c #BABBB8", ", c #BABCB8", "< c #C5C7C4", "1 c #C8C9C6", "2 c #CFD0CE", "3 c #D6D7D5", "4 c #DBDBDA", "5 c #DEDFDD", "6 c #E2E3E1", "7 c #E3E4E2", "8 c #E3E4E3", "9 c #E5E6E5", "0 c #E6E6E5", "q c #EDEDEC", "w c #EEEEED", "e c #F1F2F1", "r c #FBFBFB", "t c #FEFEFD", "y c gray100", "u c None", /* pixels */ "uuuuuuuuuuuuuuuu", "uuuuuuuuuuuuuuuu", "uuuuuuuuuuuuuuuu", "u+++uuu Xuuuu Xu", "u+0+uuo;Xuuuo;Xu", "u+1+.#4rXu.#4rXu", "u+2+*8>7Xo*8>7Xu", "u+3;y, c #D1D2D0", ", c #D2D3D1", "< c #D5D6D4", "1 c #D8D9D7", "2 c #D9DAD8", "3 c #DCDDDB", "4 c #DDDEDC", "5 c #DEDFDD", "6 c #E2E3E1", "7 c #E3E4E2", "8 c #E4E4E3", "9 c #E4E5E3", "0 c #E5E5E4", "q c #E5E6E4", "w c #E6E6E5", "e c #E7E8E6", "r c #E8E8E7", "t c #EAEAE9", "y c #EAEBEA", "u c #EDEDEC", "i c #EDEEED", "p c #EEEFEE", "a c #EFEFEE", "s c #EFF0EF", "d c #F0F0EF", "f c None", /* pixels */ "ffffffffffffffff", "ffffffffffffffff", "ffffffffffffffff", "fff ffff", "fff 678900w ffff", "fff 8.Xo+#r ffff", "fff qO@$&=y ffff", "fff e%*-:,i ffff", "fff t;><24d ffff", "fff u13555a ffff", "fff ddsaapp ffff", "fff ffff", "ffffffffffffffff", "ffffffffffffffff", "ffffffffffffffff", "ffffffffffffffff" }; plee-the-bear-20251226/bear-factory/bear-editor/src/bf/icon/text.xpm000066400000000000000000000006631512343254000247700ustar00rootroot00000000000000/* XPM */ static const char* text_xpm[] = { "16 16 4 1", " c None", ". c #000000", "+ c #808080", "@ c #FFFFFF", " ", " ", " ...............", "+...............", "+..@@@@@....@...", "+....@......@...", "+....@......@...", "+....@....@@@...", "+....@...@..@...", "+....@...@..@...", "+..@@@@@..@@.@..", "+...............", "+...............", "+++++++++++++++ ", " ", " "}; plee-the-bear-20251226/bear-factory/bear-editor/src/bf/icon/wireframe.xpm000066400000000000000000000012511512343254000257570ustar00rootroot00000000000000/* XPM */ static const char* wireframe_xpm[] = { "16 16 20 1", " c None", ". c #E6FF9D", "+ c #808080", "@ c #0B4457", "# c #13464D", "$ c #244A3A", "% c #2D4C30", "& c #214948", "* c #294B3F", "= c #1D4857", "- c #004082", "; c #3FBF00", "> c #573900", ", c #4D390A", "' c #303827", ") c #133744", "! c #003657", "~ c #3A381D", "{ c #1D373A", "] c #0A364D", " ........... ", "+.@@######@. ", "+.$$%%%%%%$. ", "+.&&******&. ", "+.=========. ", "+.---------. ", "+........... ", "++++++;;;;;;;;;;", " +;>>>>,')!;", " +;>>>,~{]!;", " +;>>,~{]!!;", " +;>,~{]!!!;", " +;~'{]!!!!;", " +;{)]!!!!!;", " +;;;;;;;;;;", " ++++++++++ "}; plee-the-bear-20251226/bear-factory/bear-editor/src/bf/icon/zoom_fit.xpm000066400000000000000000000027021512343254000256260ustar00rootroot00000000000000/* XPM */ /* From the Gnome icon theme. */ static const char* zoom_fit_xpm[] = { /* columns rows colors chars-per-pixel */ "16 16 67 1", " c #2E3436", ". c #464A4A", "X c #4D5150", "o c #525655", "O c #626663", "+ c #626664", "@ c #666A67", "# c #727571", "$ c #727572", "% c #757874", "& c #747875", "* c #3F6BA2", "= c #406BA2", "- c #486FA1", "; c #4970A2", ": c #4E76A7", "> c #4873AA", ", c #4873AB", "< c #4A76AB", "1 c #4D78AD", "2 c #4E79AF", "3 c #4E7AAF", "4 c #5178A9", "5 c #507BB0", "6 c #507BB2", "7 c #507CB1", "8 c #527DB2", "9 c #537EB3", "0 c #5581B6", "q c #5582B6", "w c #5783B7", "e c #5A83B2", "r c #5E85B4", "t c #5885B8", "y c #5985B9", "u c #5B88BC", "i c #5F8BBE", "p c #608DBF", "a c #6890BE", "s c #618DC0", "d c #618EC0", "f c #6491C3", "g c #6793C5", "h c #6A93C0", "j c #6894C6", "k c #6895C6", "l c #6A96C7", "z c #6C99C9", "x c #709CCD", "c c #838682", "v c #888A85", "b c #999B96", "n c #A3A69F", "m c #8E9FAC", "M c #8F9FAE", "N c #96A6B4", "B c #97A8B5", "V c #98A8B6", "C c #99AAB7", "Z c #ADB0A9", "A c #B7BAB3", "S c #9FB1C6", "D c #9FB2C7", "F c #D5D7D3", "G c #DADCD8", "H c gray100", "J c None", /* pixels */ "JJJJvvvvJJJJJJJJ", "JJvbZAAZb#JJJJJJ", "JvnVagjhCn#JJJJJ", "JbNHHzxHHBbJJJJJ", "vZeHsklfHrZ$JJJJ", "vA3qupdiy8A%JJJJ", "vA<70tyw91A%JJJJ", "vZ:H2675H4ZvJJJJ", "JcMHH>,HHDbJJJJJ", "JOnm-*=;SnXJJJJJ", "JJObFGGFb.& JJJ", "JJJJ+@@+JJ ov JJ", "JJJJJJJJJJ vov J", "JJJJJJJJJJJ vov ", "JJJJJJJJJJJJ vv ", "JJJJJJJJJJJJJ " }; plee-the-bear-20251226/bear-factory/bear-editor/src/bf/icon/zoom_in.xpm000066400000000000000000000025471512343254000254610ustar00rootroot00000000000000/* XPM */ /* From the Gnome icon theme. */ static const char* zoom_in_xpm[] = { /* columns rows colors chars-per-pixel */ "16 16 61 1", " c #2E3436", ". c #464A4A", "X c #4D5150", "o c #525655", "O c #626663", "+ c #626664", "@ c #666A67", "# c #727571", "$ c #727572", "% c #757874", "& c #747875", "* c #3F6BA2", "= c #406BA2", "- c #436EA4", "; c #446FA5", ": c #486FA1", "> c #4970A2", ", c #4E76A7", "< c #4571A8", "1 c #4773AA", "2 c #4A76AB", "3 c #4975AC", "4 c #4C77AD", "5 c #4D78AD", "6 c #4E79AF", "7 c #4E7AAF", "8 c #5178A9", "9 c #507BB0", "0 c #527DB2", "q c #5A83B2", "w c #5E85B4", "e c #5986B9", "r c #5B86BA", "t c #5E8ABD", "y c #5F8ABD", "u c #6890BE", "i c #618DC0", "p c #6390C2", "a c #6491C3", "s c #6793C5", "d c #6794C6", "f c #6A93C0", "g c #6894C6", "h c #838682", "j c #888A85", "k c #999B96", "l c #A3A69F", "z c #8E9FAC", "x c #8F9FAE", "c c #96A6B4", "v c #97A8B5", "b c #98A8B6", "n c #99AAB7", "m c #ADB0A9", "M c #B7BAB3", "N c #9FB1C6", "B c #9FB2C7", "V c #D5D7D3", "C c #DADCD8", "Z c gray100", "A c None", /* pixels */ "AAAAjjjjAAAAAAAA", "AAjkmMMmk#AAAAAA", "Ajlbusgfnl#AAAAA", "AkcrpZZdyvkAAAAA", "jmqeiZZatwm$AAAA", "jM7ZZZZZZ0M%AAAA", "jM2ZZZZZZ5M%AAAA", "jm,36ZZ948mjAAAA", "Ahx-NlXAAAAA", "AAOkVCCVk.& AAA", "AAAA+@@+AA oj AA", "AAAAAAAAAA joj A", "AAAAAAAAAAA joj ", "AAAAAAAAAAAA jj ", "AAAAAAAAAAAAA " }; plee-the-bear-20251226/bear-factory/bear-editor/src/bf/icon/zoom_original.xpm000066400000000000000000000027261512343254000266560ustar00rootroot00000000000000/* XPM */ /* From the Gnome icon theme. */ static const char* zoom_original_xpm[] = { /* columns rows colors chars-per-pixel */ "16 16 68 1", " c #2E3436", ". c #464A4A", "X c #4D5150", "o c #525655", "O c #626663", "+ c #626664", "@ c #666A67", "# c #727571", "$ c #727572", "% c #757874", "& c #747875", "* c #3F6BA2", "= c #406BA2", "- c #436EA4", "; c #446FA5", ": c #486FA1", "> c #4970A2", ", c #4E76A7", "< c #4571A8", "1 c #4773AA", "2 c #4A76AB", "3 c #4975AC", "4 c #4C77AD", "5 c #4D78AD", "6 c #4E79AF", "7 c #4E7AAF", "8 c #5178A9", "9 c #507BB0", "0 c #507CB1", "q c #527DB2", "w c #537EB3", "e c #5581B6", "r c #5582B6", "t c #5783B7", "y c #5A83B2", "u c #5E85B4", "i c #5985B9", "p c #5986B9", "a c #5B86BA", "s c #5B88BC", "d c #5E8ABD", "f c #5F8ABD", "g c #5F8BBE", "h c #6890BE", "j c #6390C2", "k c #6491C3", "l c #6793C5", "z c #6794C6", "x c #6A93C0", "c c #6894C6", "v c #838682", "b c #888A85", "n c #999B96", "m c #A3A69F", "M c #8E9FAC", "N c #8F9FAE", "B c #96A6B4", "V c #97A8B5", "C c #98A8B6", "Z c #99AAB7", "A c #ADB0A9", "S c #B7BAB3", "D c #9FB1C6", "F c #9FB2C7", "G c #D5D7D3", "H c #DADCD8", "J c gray100", "K c None", /* pixels */ "KKKKbbbbKKKKKKKK", "KKbnASSAn#KKKKKK", "KbmChlcxZm#KKKKK", "KnBajJJzfVnKKKKK", "bAypJJJkduA$KKKK", "bS7rsJJgiqS%KKKK", "bS20eJJtw5S%KKKK", "bA,36JJ948AbKKKK", "KvN-DmXKKKKK", "KKOnGHHGn.& KKK", "KKKK+@@+KK ob KK", "KKKKKKKKKK bob K", "KKKKKKKKKKK bob ", "KKKKKKKKKKKK bb ", "KKKKKKKKKKKKK " }; plee-the-bear-20251226/bear-factory/bear-editor/src/bf/icon/zoom_out.xpm000066400000000000000000000027401512343254000256550ustar00rootroot00000000000000/* XPM */ /* From the Gnome icon theme. */ static const char* zoom_out_xpm[] = { /* columns rows colors chars-per-pixel */ "16 16 69 1", " c #2E3436", ". c #464A4A", "X c #4D5150", "o c #525655", "O c #626663", "+ c #626664", "@ c #666A67", "# c #727571", "$ c #727572", "% c #757874", "& c #747875", "* c #3F6BA2", "= c #406BA2", "- c #436EA4", "; c #446FA5", ": c #486FA1", "> c #4970A2", ", c #4E76A7", "< c #4571A8", "1 c #4773AA", "2 c #4873AA", "3 c #4873AB", "4 c #4A76AB", "5 c #4975AC", "6 c #4C77AD", "7 c #4D78AD", "8 c #4E79AF", "9 c #4E7AAF", "0 c #5178A9", "q c #507BB0", "w c #507BB2", "e c #507CB1", "r c #527DB2", "t c #5A83B2", "y c #5E85B4", "u c #5986B9", "i c #5B86BA", "p c #5E8ABD", "a c #5F8ABD", "s c #6890BE", "d c #618DC0", "f c #6390C2", "g c #6491C3", "h c #6793C5", "j c #6794C6", "k c #6A93C0", "l c #6894C6", "z c #6895C6", "x c #6A96C7", "c c #6C99C9", "v c #709CCD", "b c #838682", "n c #888A85", "m c #999B96", "M c #A3A69F", "N c #8E9FAC", "B c #8F9FAE", "V c #96A6B4", "C c #97A8B5", "Z c #98A8B6", "A c #99AAB7", "S c #ADB0A9", "D c #B7BAB3", "F c #9FB1C6", "G c #9FB2C7", "H c #D5D7D3", "J c #DADCD8", "K c gray100", "L c None", /* pixels */ "LLLLnnnnLLLLLLLL", "LLnmSDDSm#LLLLLL", "LnMZshlkAM#LLLLL", "LmVifcvjaCmLLLLL", "nStudzxgpyS$LLLL", "nD9KKKKKKrD%LLLL", "nD4KKKKKK7D%LLLL", "nS,58weq60SnLLLL", "LbB-<231;GmLLLLL", "LOMN:*=>FMXLLLLL", "LLOmHJJHm.& LLL", "LLLL+@@+LL on LL", "LLLLLLLLLL non L", "LLLLLLLLLLL non ", "LLLLLLLLLLLL nn ", "LLLLLLLLLLLLL " }; plee-the-bear-20251226/bear-factory/bear-editor/src/bf/image_list_ctrl.hpp000066400000000000000000000046511512343254000262010ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A dialog to select one of the images in bf::image_pool. * \author Julien Jorge */ #ifndef __BF_IMAGE_LIST_CTRL_HPP__ #define __BF_IMAGE_LIST_CTRL_HPP__ #include "bf/libeditor_export.hpp" #include #include #include namespace bf { class workspace_environment; /** * \brief A dialog to select one of the images in bf::image_pool. * \author Julien Jorge */ class BEAR_EDITOR_EXPORT image_list_ctrl: public wxPanel { private: /** \brief The list view is just here to handle the mouse events. */ class list_view: public wxWindow { public: list_view( image_list_ctrl& parent ); void on_left_up( wxMouseEvent& event ); private: /** \brief The parent class. */ image_list_ctrl& m_parent; DECLARE_EVENT_TABLE() }; // class list_view public: image_list_ctrl( wxWindow& parent, workspace_environment& pool ); void set_list( const std::list& img ); void set_selection( int i ); void set_selection( const wxString& s ); wxString get_selection() const; private: void create_controls(); void set_scrollbar_values(); void render(); void render_list( wxDC& dc ); void render_name( wxDC& dc, const wxString& name, wxPoint& pos, int i ) const; void render_thumb( wxDC& dc, wxBitmap bmp, wxPoint& pos, int i ) const; void render_border( wxDC& dc, const wxPoint& pos, const wxSize& s, int i ) const; void select_item( const wxPoint& pos ); void on_paint( wxPaintEvent& event ); void on_size( wxSizeEvent& event ); void on_wheel( wxMouseEvent& event ); private: /** \brief The list of images. */ list_view* m_image_list; /** \brief The scrollbar. */ wxScrollBar* m_bar; /** \brief The images displayed in the list. */ std::list m_image; /** \brief The index, in m_image, of the selected image. */ int m_selection; /** \brief The image pool to use. */ workspace_environment& m_workspace; /** \brief The margin between the thumnails. */ static const wxSize s_margin; DECLARE_EVENT_TABLE() }; // class image_list_ctrl } // namespace bf #endif // __BF_IMAGE_LIST_CTRL_HPP__ plee-the-bear-20251226/bear-factory/bear-editor/src/bf/image_pool.hpp000066400000000000000000000060531512343254000251510ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A singleton containing all image resources. * \author Julien Jorge */ #ifndef __BF_IMAGE_POOL_HPP__ #define __BF_IMAGE_POOL_HPP__ #include "bf/libeditor_export.hpp" #include #include #include #include #include #include namespace bf { /** * \brief A singleton containing all image resources. * \author Julien Jorge */ class BEAR_EDITOR_EXPORT image_pool { private: typedef std::map image_map; /** \brief Function object passed to bf::scan_dir to load the thumbnails. */ struct load_thumb_func { public: load_thumb_func( image_map& t, const std::string& r ); void operator()( const std::string& path ); static wxBitmap load( const std::string& path ); public: /** \brief The thumbnails of the images. */ image_map& thumb; private: /** \brief The directory from which the search started. */ std::string m_root; }; // struct load_thumb_func public: typedef std::map< wxString, claw::math::rectangle > spritepos_entries; private: typedef std::map spritepos_map; public: typedef claw::wrapped_iterator < const wxString, image_map::const_iterator, claw::const_pair_first > ::iterator_type const_iterator; public: image_pool(); image_pool( const std::string& w ); wxBitmap get_image( const wxString& image_name ) const; wxBitmap get_thumbnail( const wxString& image_name ) const; spritepos_entries get_spritepos_entries( const wxString& image_name ) const; claw::math::rectangle get_spritepos_rectangle ( const wxString& image_name, const wxString& entry ) const; wxString find_spritepos_name_from_size ( const wxString& image_name, const claw::math::rectangle& r ) const; const_iterator begin() const; const_iterator end() const; private: void clear(); void scan_directory( const std::string& dir_path ); void load_spritepos_file( const std::string& image_path ) const; spritepos_entries read_spritepos_file( std::istream& f ) const; void load_image_data( const wxString& name ) const; public: /** \brief The maximum size of the thumbnails. */ static const wxSize s_thumb_size; private: /** \brief The images used in the application. */ mutable image_map m_image; /** \brief The thumbnails of the images. */ mutable image_map m_thumbnail; /** \brief The spritepos entries for each image. */ mutable spritepos_map m_spritepos; /** \brief The name of the workspace. */ std::string m_workspace; }; // class image_pool } // namespace bf #endif // __BF_IMAGE_POOL_HPP__ plee-the-bear-20251226/bear-factory/bear-editor/src/bf/image_selection_dialog.hpp000066400000000000000000000032361512343254000275040ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A dialog to select one of the images in bf::image_pool. * \author Julien Jorge */ #ifndef __BF_IMAGE_SELECTION_DIALOG_HPP__ #define __BF_IMAGE_SELECTION_DIALOG_HPP__ #include "bf/libeditor_export.hpp" #include #include namespace bf { class image_list_ctrl; class workspace_environment; /** * \brief A dialog to select one of the images in bf::image_pool. * \author Julien Jorge */ class BEAR_EDITOR_EXPORT image_selection_dialog: public wxDialog { public: /** \brief The identifiers of the controls. */ enum control_id { IDC_PATTERN_TEXT }; // enum control_id public: image_selection_dialog ( wxWindow& parent, workspace_environment& env, const wxString& val = wxEmptyString ); wxString get_image_name() const; private: void create_controls(); void fill_image_list(); void on_pattern_change( wxCommandEvent& event ); private: /** \brief The list of images. */ image_list_ctrl* m_image_list; /** \brief A text in which the user can enter a part of an image name. */ wxTextCtrl* m_pattern; /** \brief The workspace environment to use. */ workspace_environment& m_workspace; /** \brief The last pattern used in this kind of dialog. */ static wxString s_previous_pattern; DECLARE_EVENT_TABLE() }; // class image_selection_dialog } // namespace bf #endif // __BF_IMAGE_SELECTION_DIALOG_HPP__ plee-the-bear-20251226/bear-factory/bear-editor/src/bf/impl/000077500000000000000000000000001512343254000232625ustar00rootroot00000000000000plee-the-bear-20251226/bear-factory/bear-editor/src/bf/impl/arithmetic_grammar.tpp000066400000000000000000000035031512343254000276470ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the template methods of the bf::arithmetic_grammar * class. * \author Julien Jorge */ #include /*----------------------------------------------------------------------------*/ /** * \brief Constructs the definition of the grammar. * \param self The grammar of which we are the definition. */ template bf::arithmetic_grammar::definition::definition ( const arithmetic_grammar& self ) { m_expression = m_term >> *( ( boost::spirit::classic::root_node_d [ boost::spirit::classic::ch_p('+') ] | boost::spirit::classic::root_node_d [ boost::spirit::classic::ch_p('-') ] ) >> m_term ) ; m_term = m_factor >> *( ( boost::spirit::classic::root_node_d [ boost::spirit::classic::ch_p('*') ] | boost::spirit::classic::root_node_d [ boost::spirit::classic::ch_p('/') ] ) >> m_factor ) ; m_factor = m_real | boost::spirit::classic::inner_node_d[ '(' >> m_expression >> ')' ]; m_real = boost::spirit::classic::leaf_node_d[ boost::spirit::classic::real_p ]; } // definition::definition() /*----------------------------------------------------------------------------*/ /** * \brief Returns the main rule of the grammar. */ template const boost::spirit::classic::rule < Scanner, boost::spirit::classic::parser_tag >& bf::arithmetic_grammar::definition::start() const { return m_expression; } // definition::start() plee-the-bear-20251226/bear-factory/bear-editor/src/bf/impl/base_edit.tpp000066400000000000000000000025121512343254000257260ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bf::base_edit class. * \author Julien Jorge */ /*----------------------------------------------------------------------------*/ /** * \brief Constructor from a value. * \param v The value. */ template bf::base_edit::base_edit( const value_type& v ) : m_value(v) { } // base_edit::base_edit() /*----------------------------------------------------------------------------*/ /** * \brief Destructor. */ template bf::base_edit::~base_edit() { // nothing to do } // base_edit::~base_edit() /*----------------------------------------------------------------------------*/ /** * \brief Get the value. */ template const typename bf::base_edit::value_type& bf::base_edit::get_value() const { return m_value; } // base_edit::get_value() /*----------------------------------------------------------------------------*/ /** * \brief Set the value. * \param v The new value. */ template void bf::base_edit::set_value( const value_type& v ) { m_value = v; value_updated(); } // base_edit::set_value() plee-the-bear-20251226/bear-factory/bear-editor/src/bf/impl/base_file_edit.tpp000066400000000000000000000101121512343254000267200ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bf::base_file_edit class. * \author Julien Jorge */ #include "bf/path_configuration.hpp" #include "bf/workspace_environment.hpp" #include #include #include /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param parent The window owning this one. * \param env The workspace environment to use. * \param v The initial value. */ template bf::base_file_edit::base_file_edit ( wxWindow& parent, workspace_environment& env, const file_type& v ) : super(v), wxPanel(&parent), m_filter(_("All files|*")), m_workspace(env) { create_controls(); Fit(); value_updated(); } // base_file_edit::base_file_edit() /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param parent The window owning this one. * \param env The workspace environment to use. * \param filter The filter of the file selection dialog. * \param v The initial value. */ template bf::base_file_edit::base_file_edit ( wxWindow& parent, workspace_environment& env, const wxString& filter, const file_type& v ) : super(v), wxPanel(&parent), m_filter(filter), m_workspace(env) { create_controls(); Fit(); value_updated(); } // base_file_edit::base_file_edit() /*----------------------------------------------------------------------------*/ /** * \brief Check if the displayed value is correct and, if it is, set the * value according to the display. */ template bool bf::base_file_edit::validate() { this->value_from_string( m_path->GetValue() ); return true; } // base_file_edit::validate() /*----------------------------------------------------------------------------*/ /** * \brief Changes the filter of the files displayed when browsing. * \param filter The filter of the file selection dialog. */ template void bf::base_file_edit::set_filter( wxString filter ) { m_filter = filter; } // base_file_edit::validate() /*----------------------------------------------------------------------------*/ /** * \brief Update the controls with the new value. */ template void bf::base_file_edit::value_updated() { m_path->SetValue( std_to_wx_string(this->get_value().get_value()) ); } // base_file_edit::value_updated() /*----------------------------------------------------------------------------*/ /** * \brief Create the controls of the edit. */ template void bf::base_file_edit::create_controls() { m_path = new wxTextCtrl(this, wxID_ANY); m_browse = new wxButton ( this, IDC_BROWSE, wxT("..."), wxDefaultPosition, wxSize(30, -1) ); this->Connect( m_browse->GetId(), wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(self_type::on_browse) ); wxBoxSizer* sizer = new wxBoxSizer( wxHORIZONTAL ); sizer->Add( m_path, 1, wxEXPAND ); sizer->Add( m_browse, 0, wxEXPAND ); this->SetSizer( sizer ); } // base_file_edit::create_controls() /*----------------------------------------------------------------------------*/ /** * \brief The user clicked on the "browse" button. * \param event The event generated by the user's action. */ template void bf::base_file_edit::on_browse( wxCommandEvent& WXUNUSED(event) ) { std::string p = wx_to_std_string(m_path->GetValue()); path_configuration::get_instance().get_full_path ( p, m_workspace.get_name() ); wxFileDialog dlg ( this, _("Choose a file"), wxEmptyString, std_to_wx_string(p), m_filter, wxFD_DEFAULT_STYLE | wxFD_FILE_MUST_EXIST ); if (dlg.ShowModal() == wxID_OK) { std::string new_p = wx_to_std_string( dlg.GetPath() ); path_configuration::get_instance().get_relative_path (new_p, m_workspace.get_name() ); m_path->SetValue( std_to_wx_string(new_p) ); } } // base_file_edit::on_browse() plee-the-bear-20251226/bear-factory/bear-editor/src/bf/impl/call_by_field_type.tpp000066400000000000000000000164661512343254000276350ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bf::call_by_field_type class. * \author Julien Jorge */ #include "bf/any_animation.hpp" #include "bf/color.hpp" #include "bf/custom_type.hpp" #include "bf/font.hpp" #include "bf/sample.hpp" #include "bf/sprite.hpp" #include "bf/type_field.hpp" #include /*----------------------------------------------------------------------------*/ /** * \brief Call the method F<> with the correct type and the given arguments. * \param f The field from which we take the type. * \param a1 The single argument passed to F::operator(). */ template class F, typename R> template R bf::call_by_field_type::operator()( const type_field& f, A1& a1 ) const { if ( f.is_list() ) switch ( f.get_field_type() ) { case type_field::integer_field_type: return do_call< std::list >(a1); case type_field::u_integer_field_type: return do_call< std::list >(a1); case type_field::real_field_type: return do_call< std::list >(a1); case type_field::boolean_field_type: return do_call< std::list >(a1); case type_field::string_field_type: return do_call< std::list >(a1); case type_field::sprite_field_type: return do_call< std::list >(a1); case type_field::animation_field_type: return do_call< std::list >(a1); case type_field::item_reference_field_type: return do_call< std::list >(a1); case type_field::font_field_type: return do_call< std::list >(a1); case type_field::sample_field_type: return do_call< std::list >(a1); case type_field::color_field_type: return do_call< std::list >(a1); case type_field::easing_field_type: return do_call< std::list >(a1); } else switch ( f.get_field_type() ) { case type_field::integer_field_type: return do_call(a1); case type_field::u_integer_field_type: return do_call(a1); case type_field::real_field_type: return do_call(a1); case type_field::boolean_field_type: return do_call(a1); case type_field::string_field_type: return do_call(a1); case type_field::sprite_field_type: return do_call(a1); case type_field::animation_field_type: return do_call(a1); case type_field::item_reference_field_type: return do_call(a1); case type_field::font_field_type: return do_call(a1); case type_field::sample_field_type: return do_call(a1); case type_field::color_field_type: return do_call(a1); case type_field::easing_field_type: return do_call(a1); } } // call_by_type::operator()() /*----------------------------------------------------------------------------*/ /** * \brief Call the method F<> with the correct type and the given arguments. * \param f The field from which we take the type. * \param a1 The first argument passed to F::operator(). * \param a2 The second argument passed to F::operator(). */ template class F, typename R> template R bf::call_by_field_type::operator() ( const type_field& f, A1& a1, A2& a2 ) const { if ( f.is_list() ) switch ( f.get_field_type() ) { case type_field::integer_field_type: return do_call< std::list >(a1, a2); case type_field::u_integer_field_type: return do_call< std::list >(a1, a2); case type_field::real_field_type: return do_call< std::list >(a1, a2); case type_field::boolean_field_type: return do_call< std::list >(a1, a2); case type_field::string_field_type: return do_call< std::list >(a1, a2); case type_field::sprite_field_type: return do_call< std::list >(a1, a2); case type_field::animation_field_type: return do_call< std::list >(a1, a2); case type_field::item_reference_field_type: return do_call< std::list >(a1, a2); case type_field::font_field_type: return do_call< std::list >(a1, a2); case type_field::sample_field_type: return do_call< std::list >(a1, a2); case type_field::color_field_type: return do_call< std::list >(a1, a2); case type_field::easing_field_type: return do_call< std::list >(a1, a2); default: { CLAW_FAIL( "The field is not in the switch." ); return R(); } } else switch ( f.get_field_type() ) { case type_field::integer_field_type: return do_call(a1, a2); case type_field::u_integer_field_type: return do_call(a1, a2); case type_field::real_field_type: return do_call(a1, a2); case type_field::boolean_field_type: return do_call(a1, a2); case type_field::string_field_type: return do_call(a1, a2); case type_field::sprite_field_type: return do_call(a1, a2); case type_field::animation_field_type: return do_call(a1, a2); case type_field::item_reference_field_type: return do_call(a1, a2); case type_field::font_field_type: return do_call(a1, a2); case type_field::sample_field_type: return do_call(a1, a2); case type_field::color_field_type: return do_call(a1, a2); case type_field::easing_field_type: return do_call(a1, a2); default: { CLAW_FAIL( "The field is not in the switch." ); return R(); } } } // type_field::call_by_type() /*----------------------------------------------------------------------------*/ /** * \brief Call the method F<> with the type passed as a template parameter and * with the given arguments. * \param a1 The single argument passed to F::operator(). */ template class F, typename R> template R bf::call_by_field_type::do_call( A1& a1 ) const { F f; return f(a1); } // call_by_field_type::do_call() /*----------------------------------------------------------------------------*/ /** * \brief Call the method F<> with the type passed as a template parameter and * with the given arguments. * \param a1 The first argument passed to F::operator(). * \param a2 The second argument passed to F::operator(). */ template class F, typename R> template R bf::call_by_field_type::do_call( A1& a1, A2& a2 ) const { F f; return f(a1, a2); } // call_by_field_type::do_call() plee-the-bear-20251226/bear-factory/bear-editor/src/bf/impl/custom_type.tpp000066400000000000000000000050241512343254000263630ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bf::custom_type class. * \author Julien Jorge */ #include "bf/compiled_file.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Constructor with initialisation */ template bf::custom_type::custom_type( const value_type& value ) : m_value(value) { } // custom_type::custom_type() /*----------------------------------------------------------------------------*/ /** * \brief Set the value of the variable. * \param value The new value. */ template void bf::custom_type::set_value( const value_type& value ) { m_value = value; } // custom_type::set_value() /*----------------------------------------------------------------------------*/ /** * \brief Get the value. */ template const typename bf::custom_type::value_type& bf::custom_type::get_value() const { return m_value; } // custom_type::get_value() /*----------------------------------------------------------------------------*/ /** * \brief Output the value in the compiled file. * \param cf The file to write in. */ template void bf::custom_type::compile( compiled_file& cf ) const { cf << m_value; } // custom_type::compile() /*----------------------------------------------------------------------------*/ /** * \brief Tell if two custom_type objects are equal. * \param that The item to compare to. */ template bool bf::custom_type::operator==( const custom_type& that ) const { return get_value() == that.get_value(); } // custom_type::operator==() /*----------------------------------------------------------------------------*/ /** * \brief Tell if two custom_type objects are different. * \param that The item to compare to. */ template bool bf::custom_type::operator!=( const custom_type& that ) const { return get_value() != that.get_value(); } // custom_type::operator!=() /*----------------------------------------------------------------------------*/ /** * \brief Stream output operator. * \param os The stream in which we write. * \param v The value to write in the stream. */ template std::ostream& operator<<( std::ostream& os, const bf::custom_type& v ) { return os << v.get_value(); } // operator<<() plee-the-bear-20251226/bear-factory/bear-editor/src/bf/impl/dialog_maker.tpp000066400000000000000000000063731512343254000264360ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bf::dialog_maker class. * \author Julien Jorge */ #include "bf/wx_facilities.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Create the dialog. * \param parent The parent window. * \param type The name of the edited type. * \param f The edited field. * \param v The initial value. */ template typename bf::dialog_maker::dialog_type* bf::dialog_maker::create ( wxWindow& parent, const wxString& type, const type_field& f, const value_type& v ) { return new dialog_type ( parent, std_to_wx_string(f.get_name()) + wxT(" (") + type + wxT(")"), v ); } // dialog_maker::create() /*----------------------------------------------------------------------------*/ /** * \brief Create the dialog. * \param parent The parent window. * \param type The name of the edited type. * \param f The edited field. * \param v The initial value. * \param env The workspace environment to use. */ template typename bf::dialog_maker::dialog_type* bf::dialog_maker::create ( wxWindow& parent, const wxString& type, const type_field& f, const value_type& v, workspace_environment& env ) { return new dialog_type ( parent, std_to_wx_string(f.get_name()) + wxT(" (") + type + wxT(")"), v, env ); } // dialog_maker::create() /*----------------------------------------------------------------------------*/ /** * \brief Create the dialog. * \param parent The parent window. * \param type The name of the edited type. * \param f The edited field. * \param v The initial value. */ template typename bf::dialog_maker, Type>::dialog_type* bf::dialog_maker, Type>::create ( wxWindow& parent, const wxString& type, const type_field& f, const value_type& v ) { wxArrayString values; std::list raw_values; typename std::list::const_iterator it; f.get_set(raw_values); raw_values.sort(); for (it=raw_values.begin(); it!=raw_values.end(); ++it) values.Add( std_to_wx_string(*it) ); return new dialog_type ( parent, std_to_wx_string(f.get_name()) + wxT(" (") + type + wxT(")"), values, v ); } // dialog_maker::create() [set_edit] /*----------------------------------------------------------------------------*/ /** * \brief Create the dialog. * \param parent The parent window. * \param type The name of the edited type. * \param f The edited field. * \param v The initial value. */ template typename bf::dialog_maker, Type>::dialog_type* bf::dialog_maker, Type>::create ( wxWindow& parent, const wxString& type, const type_field& f, const value_type& v ) { typename T::value_type min, max; f.get_interval(min, max); return new dialog_type ( parent, std_to_wx_string(f.get_name()) + wxT(" (") + type + wxT(")"), T(min), T(max), v ); } // dialog_maker::create() [interval_edit] plee-the-bear-20251226/bear-factory/bear-editor/src/bf/impl/free_edit.tpp000066400000000000000000000032731512343254000257420ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bf::free_edit class. * \author Julien Jorge */ /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param parent The window owning this one. */ template bf::free_edit::free_edit( wxWindow& parent ) : simple_edit(default_value::get()), wxTextCtrl( &parent, wxID_ANY ) { value_updated(); } // free_edit::free_edit() /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param parent The window owning this one. * \param v The initial value. */ template bf::free_edit::free_edit( wxWindow& parent, const value_type& v ) : simple_edit(v), wxTextCtrl( &parent, wxID_ANY ) { value_updated(); } // free_edit::free_edit() /*----------------------------------------------------------------------------*/ /** * \brief Check if the displayed value is correct and, if it is, set the * value according to the display. */ template bool bf::free_edit::validate() { return this->value_from_string( this->GetValue() ); } // free_edit::validate() /*----------------------------------------------------------------------------*/ /** * \brief Method called when the value has been changed, to update the display. */ template void bf::free_edit::value_updated() { this->SetValue( this->value_to_string() ); } // free_edit::value_updated() plee-the-bear-20251226/bear-factory/bear-editor/src/bf/impl/human_readable.tpp000066400000000000000000000025401512343254000267370ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bf::human_readable class. * \author Julien Jorge */ #include "bf/wx_facilities.hpp" #include /*----------------------------------------------------------------------------*/ /** * \brief Convert a value in a string representation. * \param v The value to transform. */ template wxString bf::human_readable::convert( const value_type& v ) { std::ostringstream oss; oss << v; return std_to_wx_string(oss.str()); } // human_readable::convert() /*----------------------------------------------------------------------------*/ /** * \brief Convert a value in a string representation. * \param v The value to transform. */ template wxString bf::human_readable< std::list >::convert( const value_type& v ) { wxString result; result = wxT("["); if ( !v.empty() ) { typename value_type::const_iterator it = v.begin(); result += human_readable::convert(*it); for (++it; it!=v.end(); ++it) result += wxT(", ") + human_readable::convert(*it); } result += wxT("]"); return result; } // human_readable::convert() [list] plee-the-bear-20251226/bear-factory/bear-editor/src/bf/impl/interval_edit.tpp000066400000000000000000000033241512343254000266420ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bf::interval_edit class. * \author Julien Jorge */ #include /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param parent The windows owning this one. * \param min The minimum valid value. * \param max The maximum valid value. * \param v The initial value. */ template bf::interval_edit::interval_edit ( wxWindow& parent, const value_type& min, const value_type& max, const value_type& v ) : super_edit(v), super_ctrl( &parent, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0, min.get_value(), max.get_value() ) { value_updated(); } // interval_edit::interval_edit() /*----------------------------------------------------------------------------*/ /** * \brief Check if the displayed value is correct and, if it is, set the * value according to the display. */ template bool bf::interval_edit::validate() { bool result = false; if ( this->value_from_string( this->GetValueText() ) ) result = (this->get_value().get_value() == this->GetValue() ); return result; } // interval_edit::validate() /*----------------------------------------------------------------------------*/ /** * \brief Method called when the value has been changed, to update the display. */ template void bf::interval_edit::value_updated() { this->SetValue( this->get_value().get_value() ); } // interval_edit::value_updated() plee-the-bear-20251226/bear-factory/bear-editor/src/bf/impl/item_field_edit.tpp000066400000000000000000000050331512343254000271160ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the template methods of the bf::item_field_edit * class. * \author Julien Jorge */ #include "bf/human_readable.hpp" /*----------------------------------------------------------------------------*/ template const wxEventType bf::set_field_value_event::set_field_value_event_type = wxNewEventType(); /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param field_name The name of the field. * \param val The new value of the field. * \param t The type of the event. * \param id The id of the window that generates the event. */ template bf::set_field_value_event::set_field_value_event ( const std::string& field_name, const T& val, wxEventType t, wxWindowID id ) : wxNotifyEvent(t, id), m_field_name(field_name), m_value(val) { } // set_field_value_event::set_field_value_event() /*----------------------------------------------------------------------------*/ /** * \brief Allocate a copy of this instance. */ template wxEvent* bf::set_field_value_event::Clone() const { return new set_field_value_event(*this); } // set_field_value_event::Clone() /*----------------------------------------------------------------------------*/ /** * \brief Get the name of the field to set. */ template const std::string& bf::set_field_value_event::get_field_name() const { return m_field_name; } // set_field_value_event::get_field_name() /*----------------------------------------------------------------------------*/ /** * \brief Get the new value of the field. */ template const T& bf::set_field_value_event::get_value() const { return m_value; } // set_field_value_event::get_value() /*----------------------------------------------------------------------------*/ /** * \brief Convert the value of a field in a string. * \param field_name The name of the field for which we want the value. * \param item The item in which the value is taken. */ template wxString bf::item_field_edit::value_to_text_converter::operator() ( const std::string& field_name, const item_instance& item ) const { Type val; item.get_value( field_name, val ); return human_readable::convert( val ); } // item_field_edit::value_to_text_converter::operator()() plee-the-bear-20251226/bear-factory/bear-editor/src/bf/impl/scan_dir.tpp000066400000000000000000000046721512343254000256020ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bf::scan_dir class. * \author Julien Jorge */ #include #include #include /*----------------------------------------------------------------------------*/ /** * \brief Read all item files from a given directory and in its subdirectories. * \param dir The path where the files are searched. * \param f A copyable function object called on each file found in the * directory. * \param first_ext Iterator on the first valid extension. * \param last_ext Iterator just after the last valid extension. */ template template void bf::scan_dir::operator() ( const std::string& dir, Func& f, Iterator first_ext, Iterator last_ext ) { std::queue pending; boost::filesystem::path path(dir); if ( !boost::filesystem::exists(path) ) return; pending.push(path); while ( !pending.empty() ) { path = pending.front(); pending.pop(); boost::filesystem::directory_iterator it(path); boost::filesystem::directory_iterator eit; for ( ; it!=eit; ++it) if ( boost::filesystem::is_directory(*it) ) pending.push(*it); else { const std::string file_name( it->path().string() ); if ( supported_extension( file_name, first_ext, last_ext ) ) f( file_name ); } } } // scan_dir::operator() /*----------------------------------------------------------------------------*/ /** * \brief Tell if a path correspond to a supported extension. * \param path The path to check. * \param first_ext Iterator on the first valid extension. * \param last_ext Iterator just after the last valid extension. */ template template bool bf::scan_dir::supported_extension ( const std::string& path, Iterator first_ext, Iterator last_ext ) { // return true if no extension is given bool result( first_ext == last_ext ); for ( ; !result && (first_ext!=last_ext); ++first_ext ) if ( path.size() >= first_ext->size() ) result = path.rfind(*first_ext) == path.size() - first_ext->size(); return result; } // scan_dir::supported_extension() plee-the-bear-20251226/bear-factory/bear-editor/src/bf/impl/set_edit.tpp000066400000000000000000000034331512343254000256120ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bf::set_edit class. * \author Julien Jorge */ #include /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param parent The windows owning this one. * \param choices The valid choices of the value. * \param v The initial value. */ template bf::set_edit::set_edit ( wxWindow& parent, const wxArrayString& choices, const value_type& v ) : simple_edit(v), wxChoice( &parent, wxID_ANY, wxDefaultPosition, wxDefaultSize, choices ) { CLAW_PRECOND( !choices.IsEmpty() ); value_updated(); } // set_edit::set_edit() /*----------------------------------------------------------------------------*/ /** * \brief Check if the displayed value is correct and, if it is, set the * value according to the display. */ template bool bf::set_edit::validate() { return this->value_from_string( this->GetStringSelection() ); } // set_edit::validate() /*----------------------------------------------------------------------------*/ /** * \brief Method called when the value has been changed, to update the display. */ template void bf::set_edit::value_updated() { bool found = false; wxString val = this->value_to_string(); unsigned int i=0; while ( (i!=this->GetCount()) && !found ) if ( val == this->GetString(i) ) found = true; else ++i; if ( found ) this->SetSelection(i); else { this->SetSelection(0); validate(); } } // set_edit::value_updated() plee-the-bear-20251226/bear-factory/bear-editor/src/bf/impl/simple_edit.tpp000066400000000000000000000030511512343254000263040ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bf::simple_edit class. * \author Julien Jorge */ #include "bf/stream_conv.hpp" #include "bf/wx_facilities.hpp" #include /*----------------------------------------------------------------------------*/ /** * \brief Constructor from a value. * \param v The value. */ template bf::simple_edit::simple_edit( const value_type& v ) : super(v) { } // simple_edit::simple_edit() /*----------------------------------------------------------------------------*/ /** * \brief Transform the value in a string. */ template wxString bf::simple_edit::value_to_string() const { std::ostringstream oss; oss << this->get_value(); return std_to_wx_string( oss.str() ); } // simple_edit::value_to_string() /*----------------------------------------------------------------------------*/ /** * \brief Transform a string in a value. * \param str The string in which we read the value. * \return true If the string has been converted. */ template bool bf::simple_edit::value_from_string( const wxString& str ) { std::istringstream iss( wx_to_std_string(str) ); value_type v; bool result = true; if ( stream_conv::read(iss, v) ) this->set_value(v); else result = false; return result; } // simple_edit::value_from_string() plee-the-bear-20251226/bear-factory/bear-editor/src/bf/impl/spin_ctrl.tpp000066400000000000000000000215401512343254000260060ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bf::spin_ctrl class. * \author Julien Jorge */ #include #include "bf/wx_facilities.hpp" template const wxEventType bf::spin_event::value_change_event_type = wxNewEventType(); /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param t The type of the event. * \param id The id of the window that generates the event. */ template bf::spin_event::spin_event( wxEventType t, wxWindowID id ) : wxNotifyEvent(t, id) { } // spin_event::spin_event() /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param value The value of the spin_ctrl. * \param t The type of the event. * \param id The id of the window that generates the event. */ template bf::spin_event::spin_event( T value, wxEventType t, wxWindowID id ) : wxNotifyEvent(t, id), m_value(value) { } // spin_event::spin_event() /*----------------------------------------------------------------------------*/ /** * \brief Copy constructor. * \param that The event to copy from. */ template bf::spin_event::spin_event( const spin_event& that ) : wxNotifyEvent(that), m_value(that.m_value) { } // spin_event::spin_event() /*----------------------------------------------------------------------------*/ /** * \brief Allocate a copy of this instance. */ template wxEvent* bf::spin_event::Clone() const { return new spin_event(*this); } // spin_event::Clone() /*----------------------------------------------------------------------------*/ /** * \brief Get the value of the spin_ctrl. */ template T bf::spin_event::get_value() const { return m_value; } // spin_event::get_value() /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ template bf::spin_ctrl::spin_ctrl ( wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style, value_type min, value_type max, value_type initial, value_type step, const wxString& name ) : super( parent, id, pos, size, style | wxTAB_TRAVERSAL ), m_min(min), m_max( std::max(min, max) ), m_value(initial), m_step(step) { super::SetName(name); CreateControls(); SetValue(initial); DoValueToText(); } // spin_ctrl::spin_ctrl() /*----------------------------------------------------------------------------*/ /** * \brief Set the minimum and the maximum values. * \param min The minimum value. * \param max The maximum value. */ template void bf::spin_ctrl::SetRange( value_type min, value_type max ) { m_min = min; m_max = std::max(m_min, max); } // spin_ctrl::SetRange() /*----------------------------------------------------------------------------*/ /** * \brief Set the step of the spin button. * \param s The new step. */ template void bf::spin_ctrl::SetStep( value_type s ) { m_step = s; } // spin_ctrl::SetStep() /*----------------------------------------------------------------------------*/ /** * \brief Set the current value. * \param v The new value. */ template void bf::spin_ctrl::SetValue( value_type v ) { BoundValue(v); ValueToText(); } // spin_ctrl::SetValue() /*----------------------------------------------------------------------------*/ /** * \brief Get the current value. */ template typename bf::spin_ctrl::value_type bf::spin_ctrl::GetValue() const { return m_value; } // spin_ctrl::GetValue() /*----------------------------------------------------------------------------*/ /** * \brief Get the minimum allowed value. */ template typename bf::spin_ctrl::value_type bf::spin_ctrl::GetMin() const { return m_min; } // spin_ctrl::GetMin() /*----------------------------------------------------------------------------*/ /** * \brief Get the maximum allowed value. */ template typename bf::spin_ctrl::value_type bf::spin_ctrl::GetMax() const { return m_max; } // spin_ctrl::GetMax() /*----------------------------------------------------------------------------*/ /** * \brief Get the value displayed in the control, not necessary the current * value and maybe even not of type T. */ template wxString bf::spin_ctrl::GetValueText() const { return m_text->GetValue(); } // spin_ctrl::GetValueText() /*----------------------------------------------------------------------------*/ /** * \brief Set the current value and bound it to stay in the interval. * \param v The new value. */ template void bf::spin_ctrl::BoundValue( value_type v ) { if ( v != m_value ) { if ( v < m_min ) m_value = m_min; else if ( v > m_max ) m_value = m_max; else m_value = v; } } // spin_ctrl::BoundValue() /*----------------------------------------------------------------------------*/ /** * \brief Set a string representation of the value in the text control. */ template void bf::spin_ctrl::ValueToText() { value_type v; std::istringstream iss( wx_to_std_string(m_text->GetValue()) ); bool update_text(false); if ( iss >> v ) if ( iss.rdbuf()->in_avail() == 0 ) update_text = ( v != m_value ); if ( update_text ) DoValueToText(); } // spin_ctrl::ValueToText() /*----------------------------------------------------------------------------*/ /** * \brief Set a string representation of the value in the text control. */ template void bf::spin_ctrl::DoValueToText() { std::ostringstream oss; oss << m_value; m_text->ChangeValue( std_to_wx_string(oss.str()) ); } // spin_ctrl::DoValueToText() /*----------------------------------------------------------------------------*/ /** * \brief Create the sub controls. */ template void bf::spin_ctrl::CreateControls() { m_text = new wxTextCtrl ( this, wxID_ANY, wxT(" "), wxDefaultPosition, wxDefaultSize ); m_spin = new wxSpinButton( this, wxID_ANY ); m_spin->SetRange( 1, 3 ); m_spin->SetValue( 2 ); wxBoxSizer* sizer = new wxBoxSizer( wxHORIZONTAL ); sizer->Add( m_text, 1, wxEXPAND | wxALL, 0 ); sizer->Add( m_spin, 0, wxALL, 0 ); this->SetSizer( sizer ); this->Connect( m_spin->GetId(), wxEVT_SCROLL_LINEUP, wxSpinEventHandler(self_type::OnSpinUp) ); this->Connect( m_spin->GetId(), wxEVT_SCROLL_LINEDOWN, wxSpinEventHandler(self_type::OnSpinDown) ); this->Connect( m_text->GetId(), wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler(self_type::OnChange) ); } // spin_ctrl::CreateControls() /*----------------------------------------------------------------------------*/ /** * \brief Increase the value. */ template void bf::spin_ctrl::Up() { if ( m_max - m_value < m_step ) SetValue(m_max); else SetValue(m_value + m_step); } // spin_ctrl::Up() /*----------------------------------------------------------------------------*/ /** * \brief Decrease the value. */ template void bf::spin_ctrl::Down() { if ( m_value - m_min < m_step ) SetValue(m_min); else SetValue(m_value - m_step); } // spin_ctrl::Down() /*----------------------------------------------------------------------------*/ /** * \brief Send the event value_change. */ template void bf::spin_ctrl::SendEvent() { spin_event event ( m_value, spin_event::value_change_event_type, GetId() ); event.SetEventObject(this); ProcessEvent(event); } // spin_ctrl::SendEvent() /*----------------------------------------------------------------------------*/ /** * \brief The user clicked on the "up" arrow. * \param event The event that occured. */ template void bf::spin_ctrl::OnSpinUp( wxSpinEvent& event ) { Up(); SendEvent(); event.Veto(); } // spin_ctrl::OnSpinUp() /*----------------------------------------------------------------------------*/ /** * \brief The user clicked on the "down" arrow. * \param event The event that occured. */ template void bf::spin_ctrl::OnSpinDown( wxSpinEvent& event ) { Down(); SendEvent(); event.Veto(); } // spin_ctrl::OnSpinDown() /*----------------------------------------------------------------------------*/ /** * \brief The text has been changed. * \param event The event that occured. */ template void bf::spin_ctrl::OnChange( wxCommandEvent& WXUNUSED(event) ) { value_type v; std::istringstream iss( wx_to_std_string(m_text->GetValue()) ); if ( iss >> v ) if ( iss.rdbuf()->in_avail() == 0 ) if ( v != m_value ) { BoundValue(v); SendEvent(); } } // spin_ctrl::OnChange() plee-the-bear-20251226/bear-factory/bear-editor/src/bf/impl/stream_conv.tpp000066400000000000000000000023121512343254000263250ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation the the bf::stream_conv class. * \author Julien Jorge */ #include "bf/arithmetic_parser.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Read the value from a stream. * \param is The stream in which we read. * \param v The value we have read. */ template std::istream& bf::stream_conv::read( std::istream& is, value_type& v ) { return is; } // read() /*----------------------------------------------------------------------------*/ /** * \brief Read the value from a stream. * \param is The stream in which we read. * \param v The value we have read. */ template std::istream& bf::stream_conv< bf::custom_type >::read( std::istream& is, value_type& v ) { std::string expr; std::getline( is, expr ); const arithmetic_parser parser; double value; if ( parser.evaluate( value, expr ) ) v.set_value( (typename value_type::value_type)value ); return is; } // read() plee-the-bear-20251226/bear-factory/bear-editor/src/bf/impl/type_field_interval.tpp000066400000000000000000000024161512343254000300420ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bf::type_field_interval class. * \author Julien Jorge */ /*----------------------------------------------------------------------------*/ /** * \brief Get a copy of this instance. */ template bf::type_field* bf::type_field_interval::clone() const { return new type_field_interval(*this); } // type_field_interval::clone() /*----------------------------------------------------------------------------*/ /** * \brief Get the type of the range of valid values. */ template typename bf::type_field::range_type bf::type_field_interval::get_range_type() const { return field_range_interval; } // type_field_interval::get_range_type() /*----------------------------------------------------------------------------*/ /** * \brief Get the interval of valid values for this field. * \param min Minimum valid value. * \param max Maximum valid value. */ template void bf::type_field_interval::get_interval( T& min, T& max ) const { min = m_min; max = m_max; } // type_field::get_interval() plee-the-bear-20251226/bear-factory/bear-editor/src/bf/impl/value_editor_dialog.tpp000066400000000000000000000376411512343254000300230ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bf::value_editor_dialog class. * \author Julien Jorge */ #include "bf/default_value.hpp" #include "bf/human_readable.hpp" #include "bf/wx_facilities.hpp" #include #include #include /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param parent The parent window. * \param title The title of the dialog. * \param v The initial value. */ template bf::value_editor_dialog::value_editor_dialog ( wxWindow& parent, const wxString& title, const value_type& v ) : wxDialog( &parent, wxID_ANY, title, wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER ), m_value(v) { m_editor = new editor_type( *this, m_value ); init(); } // value_editor_dialog::value_editor_dialog() /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param parent The parent window. * \param title The title of the dialog. * \param v The initial value. * \param env The workspace environment to use. */ template bf::value_editor_dialog::value_editor_dialog ( wxWindow& parent, const wxString& title, const value_type& v, workspace_environment& env ) : wxDialog( &parent, wxID_ANY, title, wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER ), m_value(v) { m_editor = new editor_type( *this, env, m_value ); init(); } // value_editor_dialog::value_editor_dialog() /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param parent The parent window. * \param title The title of the dialog. * \param values The valid values for the field. * \param v The initial value. */ template bf::value_editor_dialog::value_editor_dialog ( wxWindow& parent, const wxString& title, const wxArrayString& values, const value_type& v ) : wxDialog( &parent, wxID_ANY, title ), m_value(v) { m_editor = new editor_type( *this, values, m_value ); init(); } // value_editor_dialog::value_editor_dialog() /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param parent The parent window. * \param title The title of the dialog. * \param min The minimum valid value. * \param max The maximum valid value. * \param v The initial value. */ template bf::value_editor_dialog::value_editor_dialog ( wxWindow& parent, const wxString& title, const value_type& min, const value_type& max, const value_type& v ) : wxDialog( &parent, wxID_ANY, title ), m_value(v) { m_editor = new editor_type( *this, min, max, m_value ); init(); } // value_editor_dialog::value_editor_dialog() /*----------------------------------------------------------------------------*/ /** * \brief Get the current value. */ template const typename bf::value_editor_dialog::value_type& bf::value_editor_dialog::get_value() const { return m_value; } // value_editor_dialog::get_value() /*----------------------------------------------------------------------------*/ /** * \brief Set the current value. * \param v The new value. */ template void bf::value_editor_dialog::set_value( const value_type& v ) { m_value = v; m_editor->set_value(m_value); } // value_editor_dialog::set_value() /*----------------------------------------------------------------------------*/ /** * \brief Returns the editor created in this dialog. */ template typename bf::value_editor_dialog::editor_type& bf::value_editor_dialog::get_editor() { return *m_editor; } // value_editor_dialog::get_editor() /*----------------------------------------------------------------------------*/ /** * \brief Initialise the dialog. */ template void bf::value_editor_dialog::init() { create_sizers(); this->Fit(); this->Connect( wxID_OK, wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(self_type::on_ok) ); m_editor->SetFocus(); } // value_editor_dialog::init() /*----------------------------------------------------------------------------*/ /** * \brief Create the sizers containing the controls. */ template void bf::value_editor_dialog::create_sizers() { wxBoxSizer* sizer = new wxBoxSizer( wxVERTICAL ); sizer->Add( m_editor, 1, wxALL | wxEXPAND, 5 ); sizer->Add( CreateStdDialogButtonSizer(wxOK | wxCANCEL), 0, wxALL | wxCENTER, 5 ); SetSizer(sizer); } // value_editor_dialog::create_sizers() /*----------------------------------------------------------------------------*/ /** * \brief Event handler when the user clicks on the "ok" button. * \param event The event. */ template void bf::value_editor_dialog::on_ok ( wxCommandEvent& WXUNUSED(event) ) { if ( m_editor->validate() ) { m_value = m_editor->get_value(); this->EndModal(wxID_OK); } else { wxMessageDialog dlg ( this, _("The value is not valid for this type."), _("Invalid value"), wxOK ); dlg.ShowModal(); } } // value_editor_dialog::on_ok() /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param parent The parent window. * \param type The name of the edited type. * \param v The initial value. */ template bf::value_editor_dialog< Editor, std::list >::value_editor_dialog ( wxWindow& parent, const wxString& type, const value_type& v ) : wxDialog( &parent, wxID_ANY, _("List of '") + type + wxT("'"), wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER ), m_value(v) { m_dialog = new dialog_type( *this, type, default_value::get() ); init(); fill(); } // value_editor_dialog::value_editor_dialog() /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param parent The parent window. * \param type The name of the edited type. * \param v The initial value. * \param env The workspace environment to use. */ template bf::value_editor_dialog< Editor, std::list >::value_editor_dialog ( wxWindow& parent, const wxString& type, const value_type& v, workspace_environment& env ) : wxDialog( &parent, wxID_ANY, _("List of '") + type + wxT("'"), wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER ), m_value(v) { m_dialog = new dialog_type( *this, type, default_value::get(), env ); init(); fill(); } // value_editor_dialog::value_editor_dialog() /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param parent The parent window. * \param type The name of the edited type. * \param values The valid values for the field. * \param v The initial value. */ template bf::value_editor_dialog< Editor, std::list >::value_editor_dialog ( wxWindow& parent, const wxString& type, const wxArrayString& values, const value_type& v ) : wxDialog( &parent, wxID_ANY, _("List of '") + type + wxT("'"), wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER ), m_value(v) { m_dialog = new dialog_type( *this, type, values, default_value::get() ); init(); fill(); } // value_editor_dialog::value_editor_dialog() /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param parent The parent window. * \param type The name of the edited type. * \param min The minimum valid value. * \param max The maximum valid value. * \param v The initial value. */ template bf::value_editor_dialog< Editor, std::list >::value_editor_dialog ( wxWindow& parent, const wxString& type, const T& min, const T& max, const value_type& v ) : wxDialog( &parent, wxID_ANY, _("List of '") + type + wxT("'"), wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER ), m_value(v) { m_dialog = new dialog_type( *this, type, min, max, default_value::get() ); init(); fill(); } // value_editor_dialog::value_editor_dialog() /*----------------------------------------------------------------------------*/ /** * \brief Get the current value. */ template const typename bf::value_editor_dialog< Editor, std::list >::value_type& bf::value_editor_dialog< Editor, std::list >::get_value() const { return m_value; } // value_editor_dialog::get_value() /*----------------------------------------------------------------------------*/ /** * \brief Set the current value. * \param v The new value. */ template void bf::value_editor_dialog< Editor, std::list >::set_value ( const value_type& v ) { m_value = v; fill(); } // value_editor_dialog::set_value() /*----------------------------------------------------------------------------*/ /** * \brief Initialise the dialog. */ template void bf::value_editor_dialog< Editor, std::list >::init() { create_controls(); create_sizers(); this->Fit(); this->Connect( wxID_UP, wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(self_type::on_up) ); this->Connect( wxID_DOWN, wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(self_type::on_down) ); this->Connect( wxID_NEW, wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(self_type::on_new) ); this->Connect( wxID_EDIT, wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(self_type::on_edit) ); this->Connect( wxID_DELETE, wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(self_type::on_delete) ); this->Connect( m_list->GetId(), wxEVT_COMMAND_LISTBOX_DOUBLECLICKED, wxCommandEventHandler(self_type::on_edit) ); } // value_editor_dialog::init() /*----------------------------------------------------------------------------*/ /** * \brief Create the controls. */ template void bf::value_editor_dialog< Editor, std::list >::create_controls() { m_list = new wxListBox( this, wxID_ANY ); } // value_editor_dialog::create_controls() /*----------------------------------------------------------------------------*/ /** * \brief Create the sizers containing the controls and the controls for which * we do not keep a pointer. */ template void bf::value_editor_dialog< Editor, std::list >::create_sizers() { wxBoxSizer* sizer = new wxBoxSizer( wxHORIZONTAL ); // the sizer for the buttons wxBoxSizer* s_sizer = new wxBoxSizer( wxVERTICAL ); s_sizer->Add( new wxButton(this, wxID_NEW), 1, wxEXPAND | wxALL, 0 ); s_sizer->Add( new wxButton(this, wxID_EDIT), 1, wxEXPAND | wxALL, 0 ); s_sizer->Add( new wxButton(this, wxID_DELETE), 1, wxEXPAND | wxALL, 0 ); s_sizer->Add( new wxButton(this, wxID_UP), 1, wxEXPAND | wxALL, 0 ); s_sizer->Add( new wxButton(this, wxID_DOWN), 1, wxEXPAND | wxALL, 0 ); sizer->Add( m_list, 1, wxEXPAND ); sizer->Add( s_sizer, 0, wxEXPAND ); s_sizer = new wxBoxSizer( wxVERTICAL ); s_sizer->Add( sizer, 1, wxEXPAND ); s_sizer->Add ( CreateStdDialogButtonSizer(wxOK | wxCANCEL), 0, wxALL | wxCENTER, 5 ); SetSizer(s_sizer); } // value_editor_dialog::create_sizers() /*----------------------------------------------------------------------------*/ /** * \brief Display the value in the list control. */ template void bf::value_editor_dialog< Editor, std::list >::fill() { int index = m_list->GetSelection(); m_list->Clear(); typename value_type::const_iterator it; for (it=m_value.begin(); it!=m_value.end(); ++it) m_list->Append( human_readable::convert(*it) ); m_list->SetSelection(index); } // value_editor_dialog::fill() /*----------------------------------------------------------------------------*/ /** * \brief Edit a value of the list. * \param index The index of the edited value in the list. */ template void bf::value_editor_dialog< Editor, std::list >::edit_value ( unsigned int index ) { typename value_type::iterator it = m_value.begin(); std::advance(it, index); m_dialog->set_value(*it); if ( m_dialog->ShowModal() == wxID_OK ) { *it = m_dialog->get_value(); fill(); } } // value_editor_dialog::edit_value() /*----------------------------------------------------------------------------*/ /** * \brief The user clicked on the "Up" button. * \param event The event. */ template void bf::value_editor_dialog< Editor, std::list >::on_up ( wxCommandEvent& WXUNUSED(event) ) { int index = m_list->GetSelection(); if ( index != wxNOT_FOUND ) if ( index > 0 ) { typename value_type::iterator prec = m_value.begin(); std::advance(prec, index-1); typename value_type::iterator it(prec); ++it; std::swap(*it, *prec); m_list->SetSelection(index-1); fill(); } } // value_editor_dialog::on_up() /*----------------------------------------------------------------------------*/ /** * \brief The user clicked on the "Down" button. * \param event The event. */ template void bf::value_editor_dialog< Editor, std::list >::on_down ( wxCommandEvent& WXUNUSED(event) ) { int index = m_list->GetSelection(); if ( index != wxNOT_FOUND ) if ( (unsigned int)index + 1 < m_list->GetCount() ) { typename value_type::iterator it = m_value.begin(); std::advance(it, index); typename value_type::iterator succ(it); ++succ; std::swap(*it, *succ); m_list->SetSelection(index+1); fill(); } } // value_editor_dialog::on_down() /*----------------------------------------------------------------------------*/ /** * \brief The user clicked on the "New" button. * \param event The event. */ template void bf::value_editor_dialog< Editor, std::list >::on_new ( wxCommandEvent& WXUNUSED(event) ) { m_dialog->set_value( default_value::get() ); if ( m_dialog->ShowModal() == wxID_OK ) { m_value.push_back( m_dialog->get_value() ); fill(); } } // value_editor_dialog::on_new() /*----------------------------------------------------------------------------*/ /** * \brief The user clicked on the "Edit" button. * \param event The event. */ template void bf::value_editor_dialog< Editor, std::list >::on_edit ( wxCommandEvent& WXUNUSED(event) ) { int index = m_list->GetSelection(); if ( index != wxNOT_FOUND ) edit_value(index); } // value_editor_dialog::on_edit() /*----------------------------------------------------------------------------*/ /** * \brief The user clicked on the "Delete" button. * \param event The event. */ template void bf::value_editor_dialog< Editor, std::list >::on_delete ( wxCommandEvent& WXUNUSED(event) ) { int index = m_list->GetSelection(); if ( index != wxNOT_FOUND ) { typename value_type::iterator it = m_value.begin(); std::advance(it, index); m_value.erase(it); if ( !m_value.empty() ) if ( (unsigned int)index == m_value.size() ) m_list->SetSelection(index-1); fill(); } } // value_editor_dialog::on_delete() plee-the-bear-20251226/bear-factory/bear-editor/src/bf/interval_edit.hpp000066400000000000000000000027601512343254000256700ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A control for editing a field that takes its value in an interval. * \author Julien Jorge */ #ifndef __BF_INTERVAL_EDIT_HPP__ #define __BF_INTERVAL_EDIT_HPP__ #include "bf/simple_edit.hpp" #include "bf/spin_ctrl.hpp" #include "bf/default_value.hpp" namespace bf { /** * \brief A control for editing a field that can takes ites value in an * interval. * \author Julien Jorge */ template class interval_edit: public simple_edit, public spin_ctrl { public: /** The type of the current class. */ typedef interval_edit self_type; /** \brief The type of the value of the edited field. */ typedef typename simple_edit::value_type value_type; /** \brief The type of the parent edit. */ typedef simple_edit super_edit; /** \brief The type of the parent control. */ typedef spin_ctrl super_ctrl; public: interval_edit ( wxWindow& parent, const value_type& min, const value_type& max, const value_type& v = default_value::get() ); bool validate(); private: void value_updated(); }; // class interval_edit } // namespace bf #include "bf/impl/interval_edit.tpp" #endif // __BF_INTERVAL_EDIT_HPP__ plee-the-bear-20251226/bear-factory/bear-editor/src/bf/is_visual_type.hpp000066400000000000000000000025511512343254000260740ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Predicates to tell if a given type represents a visual value (i.e. a * sprite, an animation). * \author Julien Jorge */ #ifndef __BF_IS_VISUAL_TYPE__ #define __BF_IS_VISUAL_TYPE__ namespace bf { /** * \brief Tells if a given type represents a visual value (i.e. a sprite, an * animation). */ template struct is_visual_type { enum result { value = false }; }; template<> struct is_visual_type { enum result { value = true }; }; template<> struct is_visual_type { enum result { value = true }; }; template<> struct is_visual_type { enum result { value = true }; }; template<> struct is_visual_type { enum result { value = true }; }; template<> struct is_visual_type { enum result { value = true }; }; template<> struct is_visual_type { enum result { value = true }; }; } // namespace bf #endif // __BF_IS_VISUAL_TYPE__ plee-the-bear-20251226/bear-factory/bear-editor/src/bf/item_check_result.hpp000066400000000000000000000022401512343254000265210ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief This class contains the result of the check of an item instance. * \author Julien Jorge */ #ifndef __BF_ITEM_CHECK_RESULT_HPP__ #define __BF_ITEM_CHECK_RESULT_HPP__ #include "bf/check_error.hpp" #include namespace bf { /** * \brief This class contains the result of the check of an item instance. * \author Julien Jorge */ class item_check_result { private: /** \brief The type of the list in which the problems are stored. */ typedef std::list error_list_type; public: /** \brief The type of teh iterator on the errors. */ typedef error_list_type::const_iterator const_iterator; public: void add( const check_error& e ); bool is_ok() const; const_iterator begin() const; const_iterator end() const; private: /** \brief The errors in the item. */ error_list_type m_errors; }; // class item_check_result } // namespace bf #endif // __BF_ITEM_CHECK_RESULT_HPP__ plee-the-bear-20251226/bear-factory/bear-editor/src/bf/item_class.hpp000066400000000000000000000113451512343254000251610ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A class that stores the type of the fields of an item class. * \author Julien Jorge */ #ifndef __BF_ITEM_CLASS_HPP__ #define __BF_ITEM_CLASS_HPP__ #include #include #include #include #include #include "bf/type_field.hpp" #include "bf/libeditor_export.hpp" namespace bf { /** * \brief A class that stores the type of the fields of an item class. * \author Julien Jorge */ class BEAR_EDITOR_EXPORT item_class { public: /** \brief The list of parent classes. */ typedef std::list super_class_list; /** \brief The association of a field's name with a description of his name. */ typedef std::map field_map_type; /** \brief Iterator on the fields of the class. */ typedef claw::wrapped_iterator < const type_field, field_map_type::const_iterator, claw::unary_compose < claw::const_dereference, claw::const_pair_second > > ::iterator_type field_iterator; /** \brief Iterator on the parent classes. */ typedef claw::wrapped_iterator < const item_class, super_class_list::const_iterator, claw::const_dereference > ::iterator_type const_super_class_iterator; private: typedef std::map string_map_type; public: item_class(); item_class( const item_class& that ); ~item_class(); item_class& operator=(const item_class& that); field_iterator field_begin() const; field_iterator field_end() const; const_super_class_iterator super_class_begin() const; const_super_class_iterator super_class_end() const; void add_field( const std::string& name, const type_field& field ); void set_description( const std::string& desc ); void set_url( const std::string& url ); void set_class_name( const std::string& class_name ); void set_category( const std::string& category ); void set_color( const std::string& color ); void set_fixable( bool fixable ); bool inherits_from( const std::string& super_class ) const; bool has_super_class( const std::string& super_class ) const; void add_super_class( item_class const* super_class ); void remove_super_class( const std::string& super_class ); void new_default_value( const std::string& f, const std::string& v ); std::string get_default_value( const std::string& f ) const; void add_removed_field( const std::string& f ); bool is_removed_field( const std::string& f ) const; void get_field_names_in_hierarchy( std::list& f ) const; const type_field& get_field( const std::string& field_name ) const; const std::string& get_description() const; const std::string& get_url() const; const std::string& get_class_name() const; const std::string& get_category() const; const std::string& get_color() const; bool get_fixable() const; bool get_need_a_name() const; void find_hierarchy( std::list& hierarchy ) const; bool has_field( const std::string& name ) const; bool has_field( const std::string& name, type_field::field_type t ) const; bool field_unicity_test(std::string& error_msg) const; private: void clear(); void copy( const item_class& that ); const type_field* search_field( const std::string& field_name ) const; void get_removed_fields_names_in_hierarchy( std::list& f ) const; void get_all_field_names_in_hierarchy( std::list& f ) const; private: /** \brief The name of the class. */ std::string m_class_name; /** \brief A short description of this class. */ std::string m_description; /** \brief An URL where this item is documented. */ std::string m_url; /** \brief The category in which this class fits. */ std::string m_category; /** \brief The color used for displaying the item. */ std::string m_color; /** \brief Tell if the item can be fixed. */ bool m_fixable; /** \brief The classes from which this one inherit. */ super_class_list m_super_classes; /** \brief The fields of this class. */ field_map_type m_field; /** \brief The default values for the fields of the class. */ string_map_type m_default_value; /** \brief The fields of the parent classes that will be set by this class. */ std::list m_removed_fields; }; // class item_class } // namespace bf #endif // __BF_ITEM_CLASS_HPP__ plee-the-bear-20251226/bear-factory/bear-editor/src/bf/item_class_pool.hpp000066400000000000000000000045121512343254000262100ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A singleton containing all item classes. * \author Julien Jorge */ #ifndef __BF_ITEM_CLASS_POOL_HPP__ #define __BF_ITEM_CLASS_POOL_HPP__ #include #include #include "bf/item_class.hpp" #include "bf/libeditor_export.hpp" namespace bf { /** * \brief A class containing all item classes. * \author Julien Jorge */ class BEAR_EDITOR_EXPORT item_class_pool { private: /** \brief The map associating item classes with their name. */ typedef std::map item_class_map; /** \brief Function object passed to scan_dir to get the item class files. */ struct open_item_class_file { open_item_class_file( std::map& c ); void operator()( const std::string& path ); /** \brief The files found in the directory. */ std::map& class_files; }; // struct open_item_class_file public: /** \brief Iterator on all the classes. */ typedef claw::wrapped_iterator < const item_class, item_class_map::const_iterator, claw::unary_compose < claw::const_dereference, claw::const_pair_second > > ::iterator_type const_iterator; public: item_class_pool(const std::string& w); ~item_class_pool(); bool has_item_class( const std::string& class_name ) const; const item_class& get_item_class( const std::string& class_name ) const; const item_class* get_item_class_ptr( const std::string& class_name ) const; const_iterator begin() const; const_iterator end() const; private: void scan_directory( const std::string& dir_path ); void load_class ( const std::string& name, std::map& files ); void field_unicity_test(); // not implemented item_class_pool& operator=( const item_class_pool& that ); item_class_pool( const item_class_pool& that ); private: /** \brief The item classes. */ item_class_map m_item_class; }; // class item_class_pool } // namespace bf #endif // __BF_ITEM_CLASS_POOL_HPP__ plee-the-bear-20251226/bear-factory/bear-editor/src/bf/item_class_selection_dialog.hpp000066400000000000000000000024221512343254000305410ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A dialog to select an item class. * \author Julien Jorge */ #ifndef __BF_ITEM_CLASS_SELECTION_DIALOG_HPP__ #define __BF_ITEM_CLASS_SELECTION_DIALOG_HPP__ #include #include #include namespace bf { class class_tree_ctrl; class class_selected_event; class workspace_environment; /** * \brief A dialog to select an item class. * \author Julien Jorge */ class item_class_selection_dialog: public wxDialog { public: item_class_selection_dialog ( wxWindow* parent, workspace_environment& env, const std::string& class_name = std::string() ); const std::string& get_class_name() const; private: void on_ok(wxCommandEvent& event); void on_class_selected( class_selected_event& event ); private: /** \brief The name of the selected class. */ std::string m_class_name; /** \brief The tree of classes. */ class_tree_ctrl* m_tree; DECLARE_EVENT_TABLE() }; // class item_class_selection_dialog } // namespace bf #endif // __BF_ITEM_CLASS_SELECTION_DIALOG_HPP__ plee-the-bear-20251226/bear-factory/bear-editor/src/bf/item_class_xml_parser.hpp000066400000000000000000000063361512343254000274210ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A class that reads an XML file describing an item class and creates * a corresponding item_class instance. * \author Julien Jorge */ #ifndef __BF_ITEM_CLASS_XML_PARSER_HPP__ #define __BF_ITEM_CLASS_XML_PARSER_HPP__ #include "bf/item_class.hpp" #include "bf/type_field.hpp" #include #include #include #include namespace bf { class item_class_pool; /** * \brief A class that reads an XML file describing an item class and creates * a corresponding item_class instance. * \author Julien Jorge */ class item_class_xml_parser { public: static std::string get_item_class_name( const std::string& file_path ); item_class* read ( const item_class_pool& pool, const std::string& file_path ) const; private: void parse_item_node ( item_class& item, const item_class_pool& pool, const wxXmlNode* node ) const; void read_item_properties( item_class& item, const wxXmlNode* node ) const; void read_item_fields( item_class& item, const wxXmlNode* node ) const; void read_new_default_value ( item_class& item, const wxXmlNode* node ) const; void read_removed_field( item_class& item, const wxXmlNode* node ) const; void read_description ( item_class& item, const wxXmlNode* node ) const; void read_field_type( item_class& item, const wxXmlNode* node ) const; type_field* add_integer_field( const std::string& name, const wxXmlNode* node ) const; type_field* add_u_integer_field( const std::string& name, const wxXmlNode* node ) const; type_field* add_real_field( const std::string& name, const wxXmlNode* node ) const; type_field* add_string_field( const std::string& name, const wxXmlNode* node ) const; type_field* add_boolean_field( const std::string& name, const wxXmlNode* node ) const; type_field* add_sprite_field( const std::string& name, const wxXmlNode* node ) const; type_field* add_animation_field( const std::string& name, const wxXmlNode* node ) const; type_field* add_item_reference_field ( const std::string& name, const wxXmlNode* node ) const; type_field* add_font_field( const std::string& name, const wxXmlNode* node ) const; type_field* add_color_field( const std::string& name, const wxXmlNode* node ) const; type_field* add_sample_field( const std::string& name, const wxXmlNode* node ) const; type_field* add_easing_field ( const std::string& name, const wxXmlNode* node ) const; std::string read_after( const wxXmlNode* node ) const; void read_set( const wxXmlNode* node, std::list& set ) const; template type_field* create_field( const std::string& name, type_field::field_type ft, const wxXmlNode* node ) const; template std::pair read_interval( const wxXmlNode* node ) const; }; // class item_class_xml_parser } // namespace bf #endif // __BF_ITEM_CLASS_XML_PARSER_HPP__ plee-the-bear-20251226/bear-factory/bear-editor/src/bf/item_comparator.hpp000066400000000000000000000024541512343254000262240ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A set of classes for comparing instances of item_instance. * \author Julien Jorge */ #ifndef __BF_ITEM_COMPARATOR_HPP__ #define __BF_ITEM_COMPARATOR_HPP__ #include "bf/libeditor_export.hpp" namespace bf { class item_instance; /** * \brief A set of classes for comparing instances of item_instance. * \author Julien Jorge */ class BEAR_EDITOR_EXPORT item_comparator { public: /** * \brief Do a lexicographic comparison of two items according to their * position and their size. * \author Julien Jorge */ class BEAR_EDITOR_EXPORT by_place { public: /** * \brief Do a lexicographic comparison of two items according to their * position and their size. * \param a The left operand. * \param b The right operand. * \return a < b : position(a) lex< position(b) && size(a) lex< size(b) */ bool operator()( const item_instance& a, const item_instance& b ) const; }; // class by_place }; // class item_comparator } // namespace bf #endif // __BF_ITEM_COMPARATOR_HPP__ plee-the-bear-20251226/bear-factory/bear-editor/src/bf/item_event.hpp000066400000000000000000000030441512343254000251720ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /* * \file * \brief An event sent when something happens to an item. * \author Julien Jorge */ #ifndef __BF_ITEM_EVENT_HPP__ #define __BF_ITEM_EVENT_HPP__ #include #define item_event_handler(func) \ (wxObjectEventFunction)(wxEventFunction) \ wxStaticCastEvent(item_event::function_type, &func) #define EVT_ITEM_SELECTION(id, func) \ wx__DECLARE_EVT1( bf::item_event::selection_event_type, \ id, item_event_handler(func) ) namespace bf { class item_instance; /** * \brief An event sent when something happens to an item. * \author Julien Jorge */ class item_event: public wxNotifyEvent { public: typedef void (wxEvtHandler::*function_type)(item_event&); public: explicit item_event( wxEventType t = wxEVT_NULL, wxWindowID id = wxID_ANY ); explicit item_event ( item_instance* item, wxEventType t = wxEVT_NULL, wxWindowID id = wxID_ANY ); item_event( const item_event& that ); wxEvent* Clone() const; item_instance* get_item() const; public: static const wxEventType selection_event_type; private: /** The item concerned by the event. */ item_instance* const m_item; }; // class item_event } // namespace bf #endif // __BF_ITEM_EVENT_HPP__ plee-the-bear-20251226/bear-factory/bear-editor/src/bf/item_field_edit.hpp000066400000000000000000000233211512343254000261410ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A frame to edit the fields of an item. * \author Julien Jorge */ #ifndef __BF_ITEM_FIELD_EDIT_HPP__ #define __BF_ITEM_FIELD_EDIT_HPP__ #include #include #include "bf/item_instance.hpp" #include "bf/type_field.hpp" #include #include #include #define delete_item_field_event_handler(func) \ (wxObjectEventFunction)(wxEventFunction) \ wxStaticCastEvent(bf::delete_item_field_event::function_type, &func) #define EVT_DELETE_ITEM_FIELD(id, func) \ wx__DECLARE_EVT1( bf::delete_item_field_event::delete_field_event_type, \ id, delete_item_field_event_handler(func) ) #define set_field_value_event_handler(func, T) \ (wxObjectEventFunction)(wxEventFunction) \ wxStaticCastEvent(bf::set_field_value_event::function_type, &func) #define EVT_SET_FIELD_VALUE(id, func, T) \ wx__DECLARE_EVT1( bf::set_field_value_event::set_field_value_event_type, \ id, set_field_value_event_handler(func, T) ) #define set_field_value_event_handler_by_addr(func_addr, T) \ (wxObjectEventFunction)(wxEventFunction) \ wxStaticCastEvent(set_field_value_event::function_type, func_addr) #define EVT_SET_FIELD_VALUE_TEMPLATE(id, class_name, func, T) \ wx__DECLARE_EVT1( bf::set_field_value_event::set_field_value_event_type, \ id, \ set_field_value_event_handler_by_addr( \ (void \ (class_name::*)( bf::set_field_value_event& ) ) \ &class_name::func, T) ) #define request_item_id_event_handler(func) \ (wxObjectEventFunction)(wxEventFunction) \ wxStaticCastEvent(bf::request_item_id_event::function_type, &func) #define EVT_REQUEST_ITEM_IDENTIFIER(id, func) \ wx__DECLARE_EVT1( bf::request_item_id_event::request_item_id_event_type, \ id, request_item_id_event_handler(func) ) namespace bf { class workspace_environment; /** * \brief Event sent when the value of a field is cleared. * \author Julien Jorge */ class delete_item_field_event: public wxNotifyEvent { public: typedef void (wxEvtHandler::*function_type)(delete_item_field_event&); public: explicit delete_item_field_event ( const std::string& field_name, wxEventType t = wxEVT_NULL, wxWindowID id = wxID_ANY ); wxEvent* Clone() const; const std::string& get_field_name() const; public: static const wxEventType delete_field_event_type; private: /** \brief The field whose value is cleared. */ const std::string m_field_name; }; // class delete_item_field_event /** * \brief Event sent to request the valid item identifiers for a field. * \author Julien Jorge */ class request_item_id_event: public wxNotifyEvent { public: typedef void (wxEvtHandler::*function_type)(request_item_id_event&); public: request_item_id_event ( const type_field& field, wxArrayString& val, wxEventType t = wxEVT_NULL, wxWindowID id = wxID_ANY ); wxEvent* Clone() const; const type_field& get_type_field() const; void add_id( const wxString& id ) const; public: static const wxEventType request_item_id_event_type; private: /** \brief The field to which the id will be given. */ const type_field& m_field; /** \brief The valid identifiers for this field. */ wxArrayString& m_values; }; // class request_item_id_event /** * \brief Event sent when a field receives a value. * \author Julien Jorge */ template class set_field_value_event: public wxNotifyEvent { public: typedef void (wxEvtHandler::*function_type)(set_field_value_event&); public: set_field_value_event ( const std::string& field_name, const T& val, wxEventType t = wxEVT_NULL, wxWindowID id = wxID_ANY ); wxEvent* Clone() const; const std::string& get_field_name() const; const T& get_value() const; public: static const wxEventType set_field_value_event_type; private: /** \brief The field whose value is set. */ const std::string m_field_name; /** \brief The new value of the field. */ const T m_value; }; // class set_field_value_event /** * \brief A frame to edit the fields of an item. * \author Julien Jorge */ class item_field_edit: public wxListView { public: /** \brief This function object converts the value of a field of an item to its text representation. */ template class value_to_text_converter { public: wxString operator() ( const std::string& field_name, const item_instance& item ) const; }; // class value_to_text_converter private: typedef std::set item_set; /** * \brief The field_editor class opens a dialog to edit a field. */ template struct field_editor; /** * \brief Specialization of the field_editor class for the case where the * workspace environmment is needed. */ template struct field_editor { static void open ( item_field_edit& self, const type_field& f, const wxString& type ); }; // struct field_editor [with workspace environment] /** * \brief Specialization of the field_editor class for the case where the * workspace environment is not needed. */ template struct field_editor { static void open ( item_field_edit& self, const type_field& f, const wxString& type ); }; // struct field_editor [without workspace environment] public: typedef claw::wrapped_iterator < item_instance, item_set::const_iterator, claw::dereference > ::iterator_type item_iterator; public: item_field_edit( wxWindow* parent, wxWindowID id = wxID_ANY ); void refresh(); bool add_item( item_instance* item ); bool add_items( const std::vector& items ); bool remove_item( item_instance* item ); bool clear(); bool empty() const; bool has_single_item() const; item_instance& get_single_item() const; item_iterator begin() const; item_iterator end() const; const item_class* get_common_class() const; const type_field& get_common_field( const std::string& name ) const; bool get_field_name( unsigned int i, std::string& name ) const; void create_field_editor( const std::string& name ); void set_workspace_environment( workspace_environment* env ); private: void enumerate_properties(); std::list get_common_classes() const; void get_fields_of ( std::vector& fields, const item_class& item ) const; void show_fields( const std::list& fields ); void update_values(); void update_value( long index ); void set_required_color( unsigned int i, bool b ); void set_default_value_color( unsigned int i, bool b ); wxString convert_value_to_text ( const item_instance& item, const type_field& f ) const; void adjust_last_column_size(); void delete_selected_field(); void show_string_property_dialog( const type_field& f ); void show_item_reference_property_dialog( const type_field& f ); void toggle_boolean_field_value( const type_field& f ); void fill_fields(); bool group_has_value( const type_field& f ) const; wxString get_common_value_as_text( const type_field& f ) const; template bool get_common_value( const type_field& f, Type& val ) const; template void show_simple_property_dialog( const type_field& f, const wxString& type ); template void show_property_dialog( const type_field& f, const wxString& type ); template void edit_field ( const type_field& f, const wxString& type, const wxArrayString& values ); template void show_dialog( const std::string& field_name, DialogType& dlg ); void on_size(wxSizeEvent& event); void on_column_begin_drag(wxListEvent& event); void on_column_end_drag(wxListEvent& event); void on_item_activated(wxListEvent& event); void on_key_up(wxKeyEvent& event); private: /** \brief The items of which we modify the fields. */ item_set m_group; /** \brief The prefixes of the not displayed fields. */ std::set m_hidden; /** \brief The name of the last edited field. */ std::string m_last_edited_field; /** \brief The index of the last selected field. */ int m_last_selected_field; /** \brief The workspace environment. */ workspace_environment* m_workspace; /** \brief The backround color of the prefix of the fields. */ static const wxColour s_field_prefix_colour; /** \brief The text used for prefix for fields without prefix. */ static const std::string s_no_prefix; }; // class item_field_edit } // namespace bf #include "bf/impl/item_field_edit.tpp" #endif // __BF_ITEM_FIELD_EDIT_HPP__ plee-the-bear-20251226/bear-factory/bear-editor/src/bf/item_instance.hpp000066400000000000000000000231351512343254000256600ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief An instance of an item class. * \author Julien Jorge */ #ifndef __BF_ITEM_INSTANCE_HPP__ #define __BF_ITEM_INSTANCE_HPP__ #include #include #include #include #include #include #include "bf/any_animation.hpp" #include "bf/color.hpp" #include "bf/custom_type.hpp" #include "bf/font.hpp" #include "bf/item_rendering_parameters.hpp" #include "bf/sample.hpp" #include "bf/type_field.hpp" #include "bf/libeditor_export.hpp" #include "level_code_value.hpp" /** * \brief Declare the member variables and accessors for a field of a given * type. * \param type The type of the field. * \param name Root name of the variables created. * * This macro declares two private variables named m_(name) and m_(name)_list, * of type std::map and std::map >. * * Methods to access these variables are also created: * * void set_value( const std::string&, const (type)& ) * void set_value( const std::string&, const std::list<(type)>& ) * void get_value( const std::string&, (type)& ) const * void get_value( const std::string&, std::list<(type)>& ) const * void get_value( const type_field&, (type)& ) const * void get_value( const type_field&, std::list<(type)>& ) const */ #define FIELD_TYPE( type, name ) \ public: \ void set_value( const std::string& field_name, const type& v ) \ { \ m_ ## name[field_name] = v; \ m_rendering_parameters.field_changed(field_name); \ } \ \ void \ set_value( const std::string& field_name, const std::list& v ) \ { \ m_ ## name ## _list[field_name] = v; \ m_rendering_parameters.field_changed(field_name); \ } \ \ void get_value( const std::string& field_name, type& v ) const \ { \ CLAW_PRECOND( m_ ## name.find(field_name) != m_ ## name.end() ); \ v = m_ ## name.find(field_name)->second; \ } \ \ void \ get_value( const std::string& field_name, std::list& v ) const \ { \ CLAW_PRECOND( m_ ## name ## _list.find(field_name) \ != m_ ## name ## _list.end() ); \ v = m_ ## name ## _list.find(field_name)->second; \ } \ \ void get_value( const type_field& f, type& v ) const \ { \ get_value( f.get_name(), v ); \ } \ \ void get_value( const type_field& f, std::list& v ) const \ { \ get_value( f.get_name(), v ); \ } \ \ private: \ typedef std::map type ## _map; \ typedef std::map< std::string, std::list > type ## _list_map; \ \ private: \ type ## _map m_ ## name; \ type ## _list_map m_ ## name ## _list; \ \ friend struct field_map_by_type; \ friend struct field_map_by_type< std::list > namespace bf { class item_check_result; class item_class; /** * \brief An instance of an item class. * \author Julien Jorge */ class BEAR_EDITOR_EXPORT item_instance { private: template struct field_map_by_type; /** * \brief Function object to tell if a value has been given to a field. * * \b Template \b parameters: * - \param T The type of the field data. */ template struct field_has_value { bool operator() ( const item_instance& item, const std::string& field_name ) const; }; // field_has_value /** * \brief Function object to erase the value of a field. * * \b Template \b parameters: * - \param T The type of the field data. */ template struct erase_field_value { void operator() ( item_instance& item, const std::string& field_name ) const; }; // erase_field_value public: item_instance( item_class const* c ); item_instance( const item_instance& that ); item_instance& operator=( const item_instance& that ); void copy_fields_from( const item_instance& that ); const item_rendering_parameters& get_rendering_parameters() const; item_rendering_parameters& get_rendering_parameters(); const item_class& get_class() const; item_class const* get_class_ptr() const; void set_class( item_class const* c ); const std::string& get_id() const; void set_id( const std::string& id ); bool has_value( const std::string& field_name ) const; bool has_value( const type_field& f ) const; void delete_value( const type_field& f ); bool has_a_reference_to( const std::string& id ) const; void get_item_reference_field_names ( std::set & item_reference_fields, std::set & item_reference_list_fields ) const; bool get_fixed() const; void set_fixed( bool b ); void rename_item_reference_fields ( const std::map& map_id ); void compile( compiled_file& f, compilation_context& c ) const; void check ( item_check_result& result, const std::set& map_id ) const; private: void check_mass_for_fixed_item( item_check_result& result ) const; void check_id_required ( item_check_result& result, const std::set& map_id ) const; void check_required_fields( item_check_result& result ) const; void sort_fields( std::list& fields ) const; void insert_field ( const std::string& field_name, std::list& fields, std::set& all_fields ) const; void compile_field ( compiled_file& f, const type_field& field, compilation_context& c ) const; void compile_field_single ( compiled_file& f, const type_field& field, compilation_context& c ) const; void compile_field_list ( compiled_file& f, const type_field& field, compilation_context& c ) const; bear::level_code_value::value_type get_code_value( const type_field& field ) const; void assign( const item_instance& that ); void copy_fields_from_no_invalid_values( const item_instance& that ); void remove_invalid_values(); template void copy_field_names( const MapType& m, std::set& fields ) const; template void compile_list( compiled_file& f, const std::list& v ) const; template void compile_list ( compiled_file& f, compilation_context& c, const std::list& v ) const; template void remove_invalid_values ( std::map& m, std::map< std::string, std::list >& ml, type_field::field_type t ) const; private: /** \brief The item class I am an instance of. */ item_class const* m_class; /** \brief Tell if the item is fixed. */ bool m_fixed; /** \brief The identifier of this item, for references with other items. */ std::string m_id; /** \brief Rendering parameters of the instance. */ item_rendering_parameters m_rendering_parameters; FIELD_TYPE( integer_type, int ); FIELD_TYPE( u_integer_type, u_int ); FIELD_TYPE( real_type, real ); FIELD_TYPE( bool_type, bool ); FIELD_TYPE( string_type, string ); FIELD_TYPE( sprite, sprite ); FIELD_TYPE( any_animation, animation ); FIELD_TYPE( item_reference_type, item_reference ); FIELD_TYPE( font, font ); FIELD_TYPE( sample, sample ); FIELD_TYPE( color, color ); FIELD_TYPE( easing_type, easing ); }; // class item_instance } // namespace bf #endif // __BF_ITEM_INSTANCE_HPP__ plee-the-bear-20251226/bear-factory/bear-editor/src/bf/item_reference_edit.hpp000066400000000000000000000031161512343254000270140ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A control for choosing an item reference. * \author Julien Jorge */ #ifndef __BF_ITEM_REFERENCE_EDIT_HPP__ #define __BF_ITEM_REFERENCE_EDIT_HPP__ #include "bf/simple_edit.hpp" #include "bf/libeditor_export.hpp" #include namespace bf { /** * \brief A control for choosing an item reference. * \author Julien Jorge */ class BEAR_EDITOR_EXPORT item_reference_edit: public simple_edit, public wxComboBox { public: /** \brief The identifiers of the controls. */ enum control_id { IDC_PATTERN_TEXT }; // enum control_id /** The type of the current class. */ typedef item_reference_edit self_type; /** \brief The type of the value of the edited field. */ typedef simple_edit::value_type value_type; public: item_reference_edit ( wxWindow& parent, const wxArrayString& choices, const value_type& v ); bool validate(); private: void value_updated(); void fill_id_list(); void on_pattern_change( wxCommandEvent& event ); private: /** \brief The choices of identifiers. */ const wxArrayString m_choices; /** \brief The last value that produces a valid entry. */ wxString m_last_valid_value; DECLARE_EVENT_TABLE() }; // class item_reference_edit } // namespace bf #endif // __BF_ITEM_REFERENCE_EDIT_HPP__ plee-the-bear-20251226/bear-factory/bear-editor/src/bf/item_rendering_parameters.hpp000066400000000000000000000113421512343254000302510ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Rendering parameters of an instance of an item class. * \author Julien Jorge */ #ifndef __BF_ITEM_RENDERING_PARAMETERS_HPP__ #define __BF_ITEM_RENDERING_PARAMETERS_HPP__ #include "bf/animation.hpp" #include "bf/libeditor_export.hpp" namespace bf { class item_instance; class item_class; /** * \brief An instance of an item class displayed in the level. * \author Julien Jorge */ class BEAR_EDITOR_EXPORT item_rendering_parameters { public: item_rendering_parameters( item_instance& item ); item_rendering_parameters( const item_rendering_parameters& that ); ~item_rendering_parameters(); void field_changed( const std::string& field_name ); void reset(); void init(); double get_left() const; double get_right() const; double get_bottom() const; double get_top() const; double get_horizontal_middle() const; double get_vertical_middle() const; int get_pos_z() const; double get_width() const; double get_height() const; int get_gap_x() const; int get_gap_y() const; bool is_mirrored() const; bool is_flipped() const; bool has_user_defined_width() const; bool has_user_defined_height() const; bool has_sprite() const; const sprite& get_sprite() const; sprite& get_sprite(); void set_position( double x, double y ); void set_left( double p ); void set_bottom( double p ); void set_size( double x, double y ); private: sprite get_sprite_from_item() const; sprite get_sprite_from_sprites() const; sprite search_sprite_in_class( const item_class& c ) const; sprite get_sprite_from_animations() const; animation search_animation_in_class( const item_class& c ) const; animation load_animation( const std::string& path ) const; double get_field_real( const std::string& field_name, double v = 0 ) const; color get_field_color( const std::string& field_name, color c ) const; int get_field_int( const std::string& field_name, int v = 0 ) const; bool get_field_bool( const std::string& field_name, bool v = false ) const; void set_field_real( const std::string& field_name, double v ); public: /** \brief Default field name for the left position. */ static const std::string s_field_name_left; /** \brief Default field name for the bottom positino. */ static const std::string s_field_name_bottom; /** \brief Default field name for the width. */ static const std::string s_field_name_width; /** \brief Default field name for the height. */ static const std::string s_field_name_height; /** \brief Default field name for the extend on bounding box option. */ static const std::string s_field_name_extend_on_bounding_box; /** \brief Default field name for the depth. */ static const std::string s_field_name_depth; /** \brief Default field name for the gap on the x-axis. */ static const std::string s_field_name_gap_x; /** \brief Default field name for the gap on the y-axis. */ static const std::string s_field_name_gap_y; /** \brief Default field name for the mirror state. */ static const std::string s_field_name_mirror; /** \brief Default field name for the flipped state. */ static const std::string s_field_name_flip; /** \brief Default field name for the clor. */ static const std::string s_field_name_color; /** \brief Default field name for the angle. */ static const std::string s_field_name_angle; private: /** \brief The instance of the item. */ item_instance& m_item; /** * \brief The sprite used to display the item. * * We use a pointer because the pointed value updated in const member * functions. */ sprite* m_sprite; /** \brief Left position of the item. */ double m_left; /** \brief Bottom position of the item. */ double m_bottom; /** \brief Width of the item. */ double m_width; /** \brief Height position of the item. */ double m_height; /** \brief Indicates if the sprite must be extended on the bounding box. */ bool m_extend_on_bounding_box; /** \brief Z-axis position of the item. */ int m_pos_z; /** \brief Gap of the sprite on the X-axis. */ int m_gap_x; /** \brief Gap of the sprite on the Y-axis. */ int m_gap_y; /** \brief Indicates if the item is mirrorred. */ bool m_mirror; /** \brief Indicates if the item is flipped. */ bool m_flip; }; // class item_rendering_parameters } // namespace bf #endif // __BF_ITEM_RENDERING_PARAMETERS_HPP__ plee-the-bear-20251226/bear-factory/bear-editor/src/bf/libeditor_export.hpp000066400000000000000000000014721512343254000264140ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Definition of the BEAR_EDITOR_EXPORT macro according to the fact that * we create the library or link to it. * \author Julien Jorge */ #ifndef __BF_LIBEDITOR_EXPORT_HPP__ #define __BF_LIBEDITOR_EXPORT_HPP__ #ifndef BEAR_EDITOR_EXPORT # ifdef _WIN32 # ifdef bear_editor_EXPORTS # define BEAR_EDITOR_EXPORT __declspec(dllexport) # else # define BEAR_EDITOR_EXPORT __declspec(dllimport) # endif // def bear_editor_EXPORTS # else // def _WIN32 # define BEAR_EDITOR_EXPORT # endif // def _WIN32 #endif // ndef BEAR_EDITOR_EXPORT #endif // __BF_LIBEDITOR_EXPORT_HPP__ plee-the-bear-20251226/bear-factory/bear-editor/src/bf/opaque_rectangle/000077500000000000000000000000001512343254000256375ustar00rootroot00000000000000plee-the-bear-20251226/bear-factory/bear-editor/src/bf/opaque_rectangle/code/000077500000000000000000000000001512343254000265515ustar00rootroot00000000000000plee-the-bear-20251226/bear-factory/bear-editor/src/bf/opaque_rectangle/code/ler_base_problem.cpp000066400000000000000000000301411512343254000325500ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the ler_base_problem class. * \author Sebastien Angibaud */ #include "bf/opaque_rectangle/ler_base_problem.hpp" #include "bf/opaque_rectangle/ler_problem.hpp" #include "bf/opaque_rectangle/ler_horizontal_problem.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Compare two points on their coordinates. */ bool bf::ler_base_problem::point_compare_x_min_y_min::operator() ( const point& p1, const point& p2 ) const { if ( p1.x < p2.x ) return true; else if ( p1.x == p2.x ) return p1.y < p2.y; else return false; } // point_compare_x_min_y_min::operator()() /*----------------------------------------------------------------------------*/ /** * \brief Compare two points on their coordinates. */ bool bf::ler_base_problem::point_compare_x_min_y_max::operator() ( const point& p1, const point& p2 ) const { if ( p1.x < p2.x ) return true; else if ( p1.x == p2.x ) return p1.y > p2.y; else return false; } // point_compare_x_min_y_max::operator()() /*----------------------------------------------------------------------------*/ /** * \brief Compare two points on their coordinates. */ bool bf::ler_base_problem::point_compare_x_max_y_min::operator() ( const point& p1, const point& p2 ) const { if ( p1.x > p2.x ) return true; else if ( p1.x == p2.x ) return p1.y < p2.y; else return false; } // point_compare_x_max_y_min::operator()() /*----------------------------------------------------------------------------*/ /** * \brief Compare two points on their coordinates. */ bool bf::ler_base_problem::point_compare_x_max_y_max::operator() ( const point& p1, const point& p2 ) const { if ( p1.x > p2.x ) return true; else if ( p1.x == p2.x ) return p1.y > p2.y; else return false; } // point_compare_x_max_y_max::operator()() /*----------------------------------------------------------------------------*/ /** * \brief Compare two point on their y-coordinates. */ bool bf::ler_base_problem::point_compare_y_min_x_min::operator() ( const point& p1, const point& p2 ) const { if ( p1.y < p2.y ) return true; else if ( p1.y == p2.y ) return p1.x < p2.x; else return false; } // point_compare_y_min_x_min::operator()() /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ bf::ler_base_problem::ler_base_problem(unsigned int min_bound) : m_min_bound(min_bound) { } // ler_base_problem::ler_base_problem() /*----------------------------------------------------------------------------*/ /** * \brief Destructor. */ bf::ler_base_problem::~ler_base_problem() { } // ler_base_problem::~ler_base_problem() /*----------------------------------------------------------------------------*/ /** * \brief Tell if the problem is in a terminal state. */ bool bf::ler_base_problem::is_terminal() const { return ( ! has_forbidden_points() ) || ( (m_bounding_rectangle.width() == 0) && (m_bounding_rectangle.height() == 0) ) || ( get_nb_points() == (m_bounding_rectangle.width()+1) * (m_bounding_rectangle.height()+1) ) || ( (m_bounding_rectangle.width()+1) * (m_bounding_rectangle.height()+1) < m_min_bound ) ; } // ler_base_problem::is_terminal() /*----------------------------------------------------------------------------*/ /** * \brief Tell if the problem is a solution. */ bool bf::ler_base_problem::is_a_solution() const { return ( ! has_forbidden_points() ) && ( (m_bounding_rectangle.width()+1) * (m_bounding_rectangle.height()+1) >= m_min_bound ) ; } // ler_base_problem::is_a_solution() /*----------------------------------------------------------------------------*/ /** * \brief Get the bounding rectangle. */ const bf::ler_base_problem::rectangle& bf::ler_base_problem::get_bounding_rectangle() const { return m_bounding_rectangle; } // ler_base_problem::get_bounding_rectangle() /*----------------------------------------------------------------------------*/ /** * \brief Set the bounding rectangle. * \param bounding_rectangle The new bounding rectangle. */ void bf::ler_base_problem::set_bounding_rectangle (const rectangle& bounding_rectangle) { m_bounding_rectangle = bounding_rectangle; } // ler_base_problem::set_bounding_rectangle() /*----------------------------------------------------------------------------*/ /** * \brief Set the minimal bound. * \param min_bound The minimal bound. */ void bf::ler_base_problem::set_min_bound(unsigned int min_bound) { m_min_bound = min_bound; } // ler_base_problem::set_min_bound() /*----------------------------------------------------------------------------*/ /** * \brief Set the minimal bound. */ unsigned int bf::ler_base_problem::get_min_bound() const { return m_min_bound; } // ler_base_problem::get_min_bound() /*----------------------------------------------------------------------------*/ /** * \brief Divide the problem into two sub-problems (left and right problems). * \param left_pb The left problem to construct. * \param right_pb The right problem to construct. */ void bf::ler_base_problem::divide_on_x ( ler_base_problem*& left_pb, ler_base_problem*& right_pb ) { const_iterator it; const_iterator it_end = end_point(); bool ok = true; unsigned int l_v; // vertical_line to separe right and left area l_v = get_vertical_line(); // separe forbidden points in two groups for ( it = first_point(); (it != end_point()) && ok; ++it) { if ( it->x > l_v ) { ok = false; it_end = it; } } left_pb = new ler_horizontal_problem(first_point(), it_end, get_min_bound()); right_pb = new ler_horizontal_problem(it_end, end_point(), get_min_bound()); rectangle left_rectangle (point(m_bounding_rectangle.left(),m_bounding_rectangle.bottom()), point(l_v,m_bounding_rectangle.top())); left_pb->set_bounding_rectangle(left_rectangle); rectangle right_rectangle (point(l_v+1,m_bounding_rectangle.bottom()), point(m_bounding_rectangle.right(),m_bounding_rectangle.top())); right_pb->set_bounding_rectangle(right_rectangle); } // ler_base_problem::divide_on_x() /*----------------------------------------------------------------------------*/ /** * \brief Divide the problem into two sub-problems (bottom and top problems). * \param bottom_pb The bottom problem to construct. * \param top_pb The top problem to construct. */ void bf::ler_base_problem::divide_on_y (ler_base_problem*& bottom_pb, ler_base_problem*& top_pb) { ler_problem* b_pb = new ler_problem(get_min_bound()); ler_problem* t_pb = new ler_problem(get_min_bound()); const_iterator it; unsigned int l_h; // horizontal_line to separe bottom and top area l_h = get_horizontal_line(); // separe forbidden points in two groups for ( it = first_point(); it != end_point(); ++it) { if ( it->y <= l_h ) b_pb->add_forbidden_point(*it); else t_pb->add_forbidden_point(*it); } bottom_pb = b_pb; top_pb = t_pb; rectangle bottom_rectangle (point(m_bounding_rectangle.left(),m_bounding_rectangle.bottom()), point(m_bounding_rectangle.right(),l_h)); bottom_pb->set_bounding_rectangle(bottom_rectangle); rectangle top_rectangle (point(m_bounding_rectangle.left(),l_h+1), point(m_bounding_rectangle.right(),m_bounding_rectangle.top())); top_pb->set_bounding_rectangle(top_rectangle); } // ler_base_problem::divide_on_y() /*----------------------------------------------------------------------------*/ /** * \brief Search the largest empty rectangle in a line. * return true if a empty rectangle is found. * \param result The largest rectangle. */ bool bf::ler_base_problem::largest_rectangle_in_line(rectangle& result) { if ( ( m_bounding_rectangle.width() != 0 ) && ( m_bounding_rectangle.height() != 0 ) ) // not a line return false; if ( ! has_forbidden_points() ) { result = m_bounding_rectangle; return true; } else { if ( m_bounding_rectangle.width() == 0 ) return largest_rectangle_in_vertical_line(result); else return largest_rectangle_in_horizontal_line(result); } } // ler_base_problem::largest_rectangle_in_line() /*----------------------------------------------------------------------------*/ /** * \brief Get the vertical line that separates problems into two sub-problems. */ unsigned int bf::ler_base_problem::get_vertical_line() const { return m_bounding_rectangle.left() + m_bounding_rectangle.width() / 2; } // ler_base_problem::get_vertical_line() /*----------------------------------------------------------------------------*/ /** * \brief Get the horizontal line that separates problems into two * sub-problems. */ unsigned int bf::ler_base_problem::get_horizontal_line() const { return m_bounding_rectangle.bottom() + m_bounding_rectangle.height() / 2; } // ler_base_problem::get_horizontal_line() /*----------------------------------------------------------------------------*/ /** * \brief Compute a greedy minimal bound. */ void bf::ler_base_problem::compute_min_bound() { m_min_bound = 0; const_iterator it = first_point(); for ( ; it != end_point(); ++it) { std::list maximal; point last_point(it->x,-1); const_iterator it2 = it; for ( ++it2; it2 != end_point(); ++it2) { if ( ( it2->x > last_point.x ) && ( it2->y < last_point.y ) && ( it2->y > it->y ) ) { last_point = *it2; maximal.push_back(*it2); } } std::list::const_iterator it3; for ( it3 = maximal.begin(); it3 != maximal.end(); ++it3 ) { unsigned int area = (it3->x - it->x - 1) * (it3->y - it->y - 1); if ( area > m_min_bound ) m_min_bound = area; } } } // ler_base_problem::compute_min_bound() /*----------------------------------------------------------------------------*/ /** * \brief Search the largest empty rectangle in a horizontal line. * return true if a empty rectangle is found. * \param result The largest rectangle. */ bool bf::ler_base_problem::largest_rectangle_in_horizontal_line ( rectangle& result ) { // m_forbidden_points.sort(ler_base_problem::point_compare_x_min_y_min()); const_iterator it = first_point(); unsigned int size = it->x - m_bounding_rectangle.left(); unsigned int last = it->x; unsigned int left = m_bounding_rectangle.left(); for ( ++it ; it != end_point(); ++it) { if ( it->x - last - 1 > size) { left = last + 1; size = it->x - last - 1; } last = it->x; } if ( m_bounding_rectangle.right() - last > size ) { left = last + 1; size = m_bounding_rectangle.right() - last; } if ( size != 0) result = rectangle(point(left,m_bounding_rectangle.bottom()), point(left+size-1,m_bounding_rectangle.bottom())); return (size != 0); } // ler_base_problem::largest_rectangle_in_hozizontal_line() /*----------------------------------------------------------------------------*/ /** * \brief Search the largest empty rectangle in a vertical line. * return true if a empty rectangle is found. * \param result The largest rectangle. */ bool bf::ler_base_problem::largest_rectangle_in_vertical_line(rectangle& result) { // m_forbidden_points.sort(ler_base_problem::point_compare_y_min_x_min()); const_iterator it = first_point(); unsigned int size = it->y - m_bounding_rectangle.bottom(); unsigned int last = it->y; unsigned int bottom = m_bounding_rectangle.bottom(); for ( ++it ; it != end_point(); ++it ) { if ( it->y - last - 1 > size) { bottom = last + 1; size = it->y - last - 1; } last = it->y; } if ( m_bounding_rectangle.top() - last > size ) { bottom = last + 1; size = m_bounding_rectangle.top() - last; } if ( size != 0) result = rectangle(point(m_bounding_rectangle.left(), bottom), point(m_bounding_rectangle.left(), bottom+size-1)); return (size != 0); } // ler_base_problem::largest_rectangle_in_vertical_line() ler_horizontal_problem.cpp000066400000000000000000000036061512343254000337560ustar00rootroot00000000000000plee-the-bear-20251226/bear-factory/bear-editor/src/bf/opaque_rectangle/code/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the ler_horizontal_problem class. * \author Sebastien Angibaud */ #include "bf/opaque_rectangle/ler_horizontal_problem.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ bf::ler_horizontal_problem::ler_horizontal_problem ( const_iterator first_point, const_iterator end_point, unsigned int min_bound ) : ler_base_problem(min_bound), m_first_point(first_point), m_end_point(end_point) { } // ler_horizontal_problem::ler_horizontal_problem() /*----------------------------------------------------------------------------*/ /** * \brief Tell if there exists forbidden points. */ bool bf::ler_horizontal_problem::has_forbidden_points() const { return m_first_point != m_end_point; } // ler_horizontal_problem::has_forbidden_points() /*----------------------------------------------------------------------------*/ /** * \brief Get the number of forbidden points. */ unsigned int bf::ler_horizontal_problem::get_nb_points() const { return std::distance(m_first_point, m_end_point); } // ler_horizontal_problem::get_nb_points() /*----------------------------------------------------------------------------*/ /** * \brief Get the iterator on first point. */ bf::ler_base_problem::const_iterator bf::ler_horizontal_problem::first_point() const { return m_first_point; } // ler_horizontal_problem::first_point() /*----------------------------------------------------------------------------*/ /** * \brief Get the iterator on the ending point. */ bf::ler_base_problem::const_iterator bf::ler_horizontal_problem::end_point() const { return m_end_point; } // ler_horizontal_problem::end_point() plee-the-bear-20251226/bear-factory/bear-editor/src/bf/opaque_rectangle/code/ler_problem.cpp000066400000000000000000000036561512343254000315710ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the ler_problem class. * \author Sebastien Angibaud */ #include "bf/opaque_rectangle/ler_problem.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ bf::ler_problem::ler_problem(unsigned int min_bound) : ler_base_problem(min_bound) { } // ler_problem::ler_problem() /*----------------------------------------------------------------------------*/ /** * \brief Add a forbidden point. * \param p The forbidden point to add. */ void bf::ler_problem::add_forbidden_point(const point& p) { m_forbidden_points.push_back(p); } // ler_problem::add_forbidden_point() /*----------------------------------------------------------------------------*/ /** * \brief Tell if there exists forbidden points. */ bool bf::ler_problem::has_forbidden_points() const { return ! m_forbidden_points.empty(); } // ler_problem::has_forbidden_points() /*----------------------------------------------------------------------------*/ /** * \brief Get the number of forbidden points. */ unsigned int bf::ler_problem::get_nb_points() const { return m_forbidden_points.size(); } // ler_problem::get_nb_points() /*----------------------------------------------------------------------------*/ /** * \brief Get the iterator on first point. */ bf::ler_base_problem::const_iterator bf::ler_problem::first_point() const { return m_forbidden_points.begin(); } // ler_problem::first_point() /*----------------------------------------------------------------------------*/ /** * \brief Get the iterator on the ending point. */ bf::ler_base_problem::const_iterator bf::ler_problem::end_point() const { return m_forbidden_points.end(); } // ler_problem::end_point() plee-the-bear-20251226/bear-factory/bear-editor/src/bf/opaque_rectangle/code/ler_solver.cpp000066400000000000000000000766101512343254000314430ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the ler_solver class. * \author Sebastien Angibaud */ #include "bf/opaque_rectangle/ler_base_problem.hpp" #include "bf/opaque_rectangle/ler_solver.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param pb The problem to solve. */ bf::ler_solver::ler_solver( ler_base_problem& pb ) : m_problem(pb), m_solved(false) { } // ler_solver::ler_solver() /*----------------------------------------------------------------------------*/ /** * \brief Solve the problem. */ void bf::ler_solver::resolve() { if ( m_problem.is_terminal() ) { // terminal state if ( m_problem.is_a_solution() ) { m_solved = true; m_solution = m_problem.get_bounding_rectangle(); m_solution_case = 0; m_problem.set_min_bound(area(m_problem.get_bounding_rectangle())); } } else { if ( ( m_problem.get_bounding_rectangle().height() == 0 ) || ( m_problem.get_bounding_rectangle().width() == 0 ) ) search_on_line(); else { // part 1 and 2 divide_on_x_y(); // part 3 search_rectangle_in_quadrants(); } } } // ler_solver::resolve() /*----------------------------------------------------------------------------*/ /** * \brief Get if the problem has a solution. */ bool bf::ler_solver::is_solved() const { return m_solved; } // ler_solver::is_solved() /*----------------------------------------------------------------------------*/ /** * \brief Get the solution. */ const bf::ler_solver::rectangle& bf::ler_solver::get_solution() const { return m_solution; } // ler_solver::get_solution() /*----------------------------------------------------------------------------*/ /** * \brief Get case in which we found the solution. */ unsigned int bf::ler_solver::get_case_solution() const { return m_solution_case; } // ler_solver::get_case_solution() /*----------------------------------------------------------------------------*/ /** * \brief Divide the problem on two sub-problems on x-coordinate. */ void bf::ler_solver::divide_on_x_y() { std::vector pbs; pbs.resize(4); m_problem.divide_on_x(pbs[0],pbs[1]); m_problem.divide_on_y(pbs[2],pbs[3]); resolve_in_order(pbs); for ( unsigned int i = 0; i < 4; ++i ) delete pbs[i]; } // ler_solver::divide_on_x_y() /*----------------------------------------------------------------------------*/ /** * \brief Resolve in order sub-problems. * \param pbs The problems. */ void bf::ler_solver::resolve_in_order( std::vector& pbs) { std::vector done(4,false); for ( unsigned int i=0; i != 4; ++i) if ( pbs[i]->is_terminal() ) { // terminal state if ( pbs[i]->is_a_solution() && ( ( area(m_solution) < area(pbs[i]->get_bounding_rectangle()) || ! m_solved ) ) ) { m_solved = true; m_solution = pbs[i]->get_bounding_rectangle(); m_solution_case = 0; m_problem.set_min_bound(area(m_solution)); } done[i] = true; } for ( unsigned int i=0; i != 4; i++) if ( !done[i] ) { resolve_sub_problem(pbs[i]); done[i] = true; } } // ler_solver::resolve_in_order() /*----------------------------------------------------------------------------*/ /** * \brief Search a rectangle that is in at least three quadrants. */ void bf::ler_solver::search_rectangle_in_quadrants() { place_points_in_quadrants(); sort_quadrants(); keep_maximum_points(); compute_corners(); compute_case_1(); compute_case_2(); compute_case_3(); compute_case_4(); compute_case_5(); compute_case_6(); compute_case_7(); compute_case_8(); compute_case_9(); compute_case_10(); compute_case_11(); compute_case_12(); compute_case_13(); compute_case_14(); compute_case_15(); compute_case_16(); } // ler_solver::search_rectangle_in_quadrants() /*----------------------------------------------------------------------------*/ /** * \brief Resolve a sub-problem. */ void bf::ler_solver::resolve_sub_problem(ler_base_problem* pb) { pb->set_min_bound( m_problem.get_min_bound() ); ler_solver solver(*pb); solver.resolve(); if ( solver.is_solved() ) update_solution(solver.get_solution(), solver.get_case_solution()); } // ler_solver::resolve_sub_problem() /*----------------------------------------------------------------------------*/ /** * \brief Update solution. * \param r A new candidate for the best solution. * \param solution_case The case in which the solution was found. */ void bf::ler_solver::update_solution (const rectangle& r, unsigned int solution_case) { if ( ( !m_solved || ( area(r) > area(m_solution) ) ) && ( area(r) > m_problem.get_min_bound() ) ) { m_solution = r; m_solution_case = solution_case; m_solved = true; m_problem.set_min_bound(area(r)); } } // ler_solver::update_solution() /*----------------------------------------------------------------------------*/ /** * \brief Get the area of a rectangle. * \param r The rectangle in witch we compute the area. */ unsigned int bf::ler_solver::area(const rectangle& r) { return ( r.width() + 1 ) * (r.height() + 1); } // ler_solver::area() /*----------------------------------------------------------------------------*/ /** * \brief Place each forbidden point into the corresponding quadrant. */ void bf::ler_solver::place_points_in_quadrants() { unsigned int l_v; // vertical_line to separe left and right area l_v = m_problem.get_vertical_line(); unsigned int l_h; // horizontal_line to separe bottom and top area l_h = m_problem.get_horizontal_line(); ler_base_problem::const_iterator it; // separe forbidden points in for groups for ( it = m_problem.first_point(); it != m_problem.end_point(); ++it) { if ( it->x <= l_v ) { if ( it->y <= l_h ) m_s1.push_back(*it); else m_s2.push_back(*it); } else { if ( it->y <= l_h ) m_s4.push_back(*it); else m_s3.push_back(*it); } } } // ler_solver::place_points_in_quadrants() /*----------------------------------------------------------------------------*/ /** * \brief Sort quadrants. */ void bf::ler_solver::sort_quadrants() { m_s1.sort(ler_base_problem::point_compare_x_max_y_max()); m_s2.sort(ler_base_problem::point_compare_x_max_y_min()); m_s3.sort(ler_base_problem::point_compare_x_min_y_min()); m_s4.sort(ler_base_problem::point_compare_x_min_y_max()); } // ler_solver::sort_quandrants() /*----------------------------------------------------------------------------*/ /** * \brief Keep only maximum points in each quadrant. */ void bf::ler_solver::keep_maximum_points() { keep_maximum_points_in_quadrant(m_s1,true); keep_maximum_points_in_quadrant(m_s2,false); keep_maximum_points_in_quadrant(m_s3,false); keep_maximum_points_in_quadrant(m_s4,true); } // keep_maximum_points() /*----------------------------------------------------------------------------*/ /** * \brief Keep only maximum points in a given quadrant. * \param p The list of points. * \param max Indicates if we must takes maximum y. */ void bf::ler_solver::keep_maximum_points_in_quadrant(point_list& p, bool max) { if ( ! p.empty() ) { point_list result; point_list::const_iterator it = p.begin(); unsigned int y_ref = it->y; result.push_back(*it); for ( ; it != p.end(); ++it ) if ( ( ( it->y > y_ref ) && max ) || ( ( it->y < y_ref ) && !max ) ) { result.push_back(*it); y_ref = it->y; } swap(p,result); } } // keep_maximum_points() /*----------------------------------------------------------------------------*/ /** * \brief Compute conrers points in each quadrant. */ void bf::ler_solver::compute_corners() { compute_corners_in_quadrant(m_s1,m_s1_corners); compute_corners_in_quadrant(m_s2,m_s2_corners); compute_corners_in_quadrant(m_s3,m_s3_corners); compute_corners_in_quadrant(m_s4,m_s4_corners); } // ler_solver::compute_corners() /*----------------------------------------------------------------------------*/ /** * \brief Compute corners points in each quadrant. * \param p The list of points. * \param corners The list of resulting points. */ void bf::ler_solver::compute_corners_in_quadrant (const point_list &p, point_list& corners) { if ( ! p.empty() ) { point_list::const_iterator it = p.begin(); point_list::const_iterator previous = p.begin(); ++it; if ( it != p.end() ) for ( ; it != p.end(); ++it, previous++ ) corners.push_back(point(it->x,previous->y)); } } // ler_solver::compute_corners_in_quadrant() /*----------------------------------------------------------------------------*/ /** * \brief Search the largest rectangle on a line. */ void bf::ler_solver::search_on_line() { rectangle r; if ( m_problem.largest_rectangle_in_line(r) ) update_solution(r, 17); } // ler_solver::search_on_line() /*----------------------------------------------------------------------------*/ /** * \brief Compute rectangle in case 1. */ void bf::ler_solver::compute_case_1() { // type B point_list::iterator it; for ( it = m_s4_corners.begin(); it != m_s4_corners.end(); ++it ) { supported_point p3 = get_point_end_max_x (m_s3,it->x,m_problem.get_bounding_rectangle().top()); supported_point p2 = get_point_max_y (m_s2,p3.first.y,m_problem.get_bounding_rectangle().left()); point_list c_p; compute_c_p_min_min(m_s1,p2.first.x,it->y,c_p); if ( c_p.empty() ) { point q1; point q2; if ( p2.second ) q1.x = p2.first.x + 1; else q1.x = p2.first.x; q1.y = it->y + 1; q2.x = it->x - 1; if ( p3.second ) q2.y = p3.first.y - 1; else q2.y = p3.first.y; if ( (q1.x <= q2.x) && (q1.y <= q2.y) ) update_solution(rectangle(q1,q2),1); } } } // ler_solver::compute_case_1() /*----------------------------------------------------------------------------*/ /** * \brief Compute rectangle in case 2. */ void bf::ler_solver::compute_case_2() { // type B point_list::iterator it; for ( it = m_s3_corners.begin(); it != m_s3_corners.end(); ++it ) { supported_point p2 = get_point_max_y (m_s2,it->y,m_problem.get_bounding_rectangle().left()); supported_point p4 = get_point_end_max_x (m_s4,it->x,m_problem.get_bounding_rectangle().bottom()); point_list c_p; compute_c_p_min_min(m_s1,p2.first.x,p4.first.y,c_p); if ( c_p.empty() ) { point q1; point q2(it->x - 1, it->y - 1); if ( p2.second ) q1.x = p2.first.x + 1; else q1.x = p2.first.x; if ( p4.second ) q1.y = p4.first.y + 1; else q1.y = p4.first.y; if ( (q1.x <= q2.x) && (q1.y <= q2.y) ) update_solution(rectangle(q1,q2),2); } } } // ler_solver::compute_case_2() /*----------------------------------------------------------------------------*/ /** * \brief Compute rectangle in case 3. */ void bf::ler_solver::compute_case_3() { // type A point_list::iterator it; for ( it = m_s2_corners.begin(); it != m_s2_corners.end(); ++it ) { supported_point p1 = get_point_end_min_x (m_s1,it->x,m_problem.get_bounding_rectangle().bottom()); supported_point p3 = get_point_max_y(m_s3,it->y,m_problem.get_bounding_rectangle().right()); point_list c_p; compute_c_p_max_min(m_s4,p3.first.x,p1.first.y,c_p); if ( ! c_p.empty() ) { point_list::iterator it2; for ( it2 = c_p.begin(); it2 != c_p.end(); ++it2 ) { point p1(it->x + 1, it2->y + 1); point p2(it2->x - 1, it->y + 1); update_solution(rectangle(p1,p2),3); } } } } // ler_solver::compute_case_3() /*----------------------------------------------------------------------------*/ /** * \brief Compute rectangle in case 4. */ void bf::ler_solver::compute_case_4() { // type B point_list::iterator it; for ( it = m_s2_corners.begin(); it != m_s2_corners.end(); ++it ) { supported_point p3 = get_point_max_y(m_s3,it->y,m_problem.get_bounding_rectangle().right()); supported_point p4 = get_point_end_max_x (m_s4,p3.first.x,m_problem.get_bounding_rectangle().bottom()); point_list c_p; compute_c_p_min_min(m_s1,it->x,p4.first.y,c_p); if ( c_p.empty() ) { point q1; point q2; q1.x = it->x + 1; if ( p4.second ) q1.y = p4.first.y + 1; else q1.y = p4.first.y; if ( p3.second ) q2.x = p3.first.x - 1; else q2.x = p3.first.x; q2.y = it->y - 1; if ( (q1.x <= q2.x) && (q1.y <= q2.y) ) update_solution(rectangle(q1,q2),4); } } } // ler_solver::compute_case_4() /*----------------------------------------------------------------------------*/ /** * \brief Compute rectangle in case 5. */ void bf::ler_solver::compute_case_5() { // type B point_list::iterator it; for ( it = m_s4_corners.begin(); it != m_s4_corners.end(); ++it ) { supported_point p1 = get_point_min_y (m_s1,it->y,m_problem.get_bounding_rectangle().left()); supported_point p3 = get_point_end_max_x (m_s3,it->x,m_problem.get_bounding_rectangle().top()); point_list c_p; compute_c_p_min_max(m_s2,p1.first.x,p3.first.y,c_p); if ( c_p.empty() ) { point q1; point q2; if ( p1.second ) q1.x = p1.first.x + 1; else q1.x = p1.first.x; q1.y = it->y + 1; q2.x = it->x; if ( p3.second ) q2.y = p3.first.y - 1; else q2.y = p3.first.y - 1; if ( (q1.x <= q2.x) && (q1.y <= q2.y) ) update_solution(rectangle(q1,q2),5); } } } // ler_solver::compute_case_5() /*----------------------------------------------------------------------------*/ /** * \brief Compute rectangle in case 6. */ void bf::ler_solver::compute_case_6() { // type B point_list::iterator it; for ( it = m_s3_corners.begin(); it != m_s3_corners.end(); ++it ) { supported_point p4 = get_point_end_max_x (m_s4,it->x,m_problem.get_bounding_rectangle().bottom()); supported_point p1 = get_point_min_y (m_s1,p4.first.y,m_problem.get_bounding_rectangle().left()); point_list c_p; compute_c_p_min_max(m_s2,p1.first.x,it->y,c_p); if ( c_p.empty() ) { point q1; point q2(it->x - 1, it->y - 1); if ( p1.second ) q1.x = p1.first.x + 1; else q1.x = p1.first.x; if ( p4.second ) q1.y = p4.first.y + 1; else q1.y = p4.first.y; if ( (q1.x <= q2.x) && (q1.y <= q2.y) ) update_solution(rectangle(q1,q2),6); } } } // ler_solver::compute_case_6() /*----------------------------------------------------------------------------*/ /** * \brief Compute rectangle in case 7. */ void bf::ler_solver::compute_case_7() { // type B point_list::iterator it; for ( it = m_s4_corners.begin(); it != m_s4_corners.end(); ++it ) { supported_point p1 = get_point_min_y (m_s1,it->y,m_problem.get_bounding_rectangle().left()); supported_point p2 = get_point_end_min_x (m_s2,p1.first.x,m_problem.get_bounding_rectangle().top()); point_list c_p; compute_c_p_max_max(m_s3,it->x,p2.first.y,c_p); if ( c_p.empty() ) { point q1; point q2; if ( p1.second ) q1.x = p1.first.x + 1; else q1.x = p1.first.x; q1.y = it->y + 1; q2.x = it->x - 1; if ( p2.second ) q2.y = p2.first.y - 1; else q2.y = p2.first.y; if ( (q1.x <= q2.x) && (q1.y <= q2.y) ) update_solution(rectangle(q1,q2),7); } } } // ler_solver::compute_case_7() /*----------------------------------------------------------------------------*/ /** * \brief Compute rectangle in case 8. */ void bf::ler_solver::compute_case_8() { // type C point_list::iterator it; for ( it = m_s1.begin(); it != m_s1.end(); ++it ) compute_case_8_unit(*it); point p(0,m_problem.get_horizontal_line()); compute_case_8_unit(p); } // ler_solver::compute_case_8() /*----------------------------------------------------------------------------*/ /** * \brief Compute rectangle in case 8. */ void bf::ler_solver::compute_case_8_unit(point & p) { supported_point p2 = get_point_end_min_x (m_s2,p.x,m_problem.get_bounding_rectangle().top()); supported_point p3 = get_point_max_y (m_s3,p2.first.y,m_problem.get_bounding_rectangle().right()); supported_point p4 = get_point_end_max_x (m_s4,p3.first.x,m_problem.get_bounding_rectangle().bottom()); supported_point p1 = get_point_min_y (m_s1,p4.first.y,m_problem.get_bounding_rectangle().left()); if ( p.x == p1.first.x ) { point q1; point q2; if ( p1.second ) q1.x = p1.first.x + 1; else q1.x = p1.first.x; if ( p4.second ) q1.y = p4.first.y + 1; else q1.y = p4.first.y; if ( p3.second ) q2.x = p3.first.x - 1; else q2.x = p3.first.x; if ( p2.second ) q2.y = p2.first.y - 1; else q2.y = p2.first.y; if ( (q1.x <= q2.x) && (q1.y <= q2.y) ) update_solution(rectangle(q1,q2),8); } } // ler_solver::compute_case_8_unit() /*----------------------------------------------------------------------------*/ /** * \brief Compute rectangle in case 9. */ void bf::ler_solver::compute_case_9() { // type C point_list::iterator it; for ( it = m_s1.begin(); it != m_s1.end(); ++it ) compute_case_9_unit(*it); point p(m_problem.get_vertical_line(),0); compute_case_9_unit(p); } // ler_solver::compute_case_9() /*----------------------------------------------------------------------------*/ /** * \brief Compute rectangle in case 9. */ void bf::ler_solver::compute_case_9_unit(point & p) { supported_point p4 = get_point_min_y (m_s4,p.y,m_problem.get_bounding_rectangle().right()); supported_point p3 = get_point_end_max_x (m_s3,p4.first.x,m_problem.get_bounding_rectangle().top()); supported_point p2 = get_point_max_y (m_s2,p3.first.y,m_problem.get_bounding_rectangle().left()); supported_point p1 = get_point_end_min_x (m_s1,p2.first.x,m_problem.get_bounding_rectangle().bottom()); if ( p.y == p1.first.y ) { point q1; point q2; if ( p2.second ) q1.x = p2.first.x + 1; else q1.x = p2.first.x; if ( p1.second ) q1.y = p1.first.y + 1; else q1.y = p1.first.y; if ( p4.second ) q2.x = p4.first.x - 1; else q2.x = p4.first.x; if ( p3.second ) q2.y = p3.first.y - 1; else q2.y = p3.first.y; if ( (q1.x <= q2.x) && (q1.y <= q2.y) ) update_solution(rectangle(q1,q2),9); } } // ler_solver::compute_case_9() /*----------------------------------------------------------------------------*/ /** * \brief Compute rectangle in case 10. */ void bf::ler_solver::compute_case_10() { // type B point_list::iterator it; for ( it = m_s3_corners.begin(); it != m_s3_corners.end(); ++it ) { supported_point p2 = get_point_max_y (m_s2,it->y,m_problem.get_bounding_rectangle().left()); supported_point p1 = get_point_end_min_x (m_s1,p2.first.x,m_problem.get_bounding_rectangle().bottom()); point_list c_p; compute_c_p_max_min(m_s4,it->x,p1.first.y,c_p); if ( c_p.empty() ) { point q1; point q2(it->x - 1, it->y - 1); if ( p2.second ) q1.x = p2.first.x + 1; else q1.x = p2.first.x; if ( p1.second ) q1.y = p1.first.y + 1; else q1.y = p1.first.y; if ( (q1.x <= q2.x) && (q1.y <= q2.y) ) update_solution(rectangle(q1,q2),10); } } } // ler_solver::compute_case_10() /*----------------------------------------------------------------------------*/ /** * \brief Compute rectangle in case 11. */ void bf::ler_solver::compute_case_11() { // type B point_list::iterator it; for ( it = m_s2_corners.begin(); it != m_s2_corners.end(); ++it ) { supported_point p1 = get_point_end_min_x (m_s1,it->x,m_problem.get_bounding_rectangle().bottom()); supported_point p4 = get_point_min_y (m_s4,p1.first.y,m_problem.get_bounding_rectangle().right()); point_list c_p; compute_c_p_max_max(m_s3,p4.first.x,it->y,c_p); if ( c_p.empty() ) { point q1; point q2; q1.x = it->x + 1; if ( p1.second ) q1.y = p1.first.y + 1; else q1.y = p1.first.y; if ( p4.second ) q2.x = p4.first.x - 1; else q2.x = p4.first.x; q2.y = it->y - 1; if ( (q1.x <= q2.x) && (q1.y <= q2.y) ) update_solution(rectangle(q1,q2),11); } } } // ler_solver::compute_case_11() /*----------------------------------------------------------------------------*/ /** * \brief Compute rectangle in case 12. */ void bf::ler_solver::compute_case_12() { // type B point_list::iterator it; for ( it = m_s2_corners.begin(); it != m_s2_corners.end(); ++it ) { supported_point p1 = get_point_end_min_x (m_s1,it->x,m_problem.get_bounding_rectangle().bottom()); supported_point p3 = get_point_max_y(m_s3,it->y,m_problem.get_bounding_rectangle().right()); point_list c_p; compute_c_p_max_min(m_s4,p3.first.x,p1.first.y,c_p); if ( c_p.empty() ) { point q1; point q2; q1.x = it->x + 1; if ( p1.second ) q1.y = p1.first.y + 1; else q1.y = p1.first.y; if ( p3.second ) q2.x = p3.first.x - 1; else q2.x = p3.first.x; q2.y = it->y - 1; if ( (q1.x <= q2.x) && (q1.y <= q2.y) ) update_solution(rectangle(q1,q2),12); } } } // ler_solver::compute_case_12() /*----------------------------------------------------------------------------*/ /** * \brief Compute rectangle in case 13. */ void bf::ler_solver::compute_case_13() { // type B point_list::iterator it; for ( it = m_s1_corners.begin(); it != m_s1_corners.end(); ++it ) { supported_point p4 = get_point_min_y(m_s4,it->y,m_problem.get_bounding_rectangle().right()); supported_point p3 = get_point_end_max_x (m_s3,p4.first.x,m_problem.get_bounding_rectangle().top()); point_list c_p; compute_c_p_min_max(m_s2,it->x,p3.first.y,c_p); if ( c_p.empty() ) { point q1(it->x + 1, it->y + 1); point q2; if ( p4.second ) q2.x = p4.first.x - 1; else q2.x = p4.first.x; if ( p3.second ) q2.y = p3.first.y - 1; else q2.y = p3.first.y; if ( (q1.x <= q2.x) && (q1.y <= q2.y) ) update_solution(rectangle(q1,q2),13); } } } // ler_solver::compute_case_13() /*----------------------------------------------------------------------------*/ /** * \brief Compute rectangle in case 14. */ void bf::ler_solver::compute_case_14() { // type A point_list::iterator it; for ( it = m_s1_corners.begin(); it != m_s1_corners.end(); ++it ) { supported_point p2 = get_point_end_min_x (m_s2,it->x,m_problem.get_bounding_rectangle().top()); supported_point p4 = get_point_min_y(m_s4,it->y,m_problem.get_bounding_rectangle().right()); point_list c_p; compute_c_p_max_max(m_s3,p4.first.x,p2.first.y,c_p); if ( ! c_p.empty() ) { point_list::iterator it2; for ( it2 = c_p.begin(); it2 != c_p.end(); ++it2 ) { point p1(it->x + 1, it->y + 1); point p2(it2->x - 1, it2->y - 1); if ( (p1.x <= p2.x) && (p1.y <= p2.y) ) update_solution(rectangle(p1,p2),14); } } } } // ler_solver::compute_case_14() /*----------------------------------------------------------------------------*/ /** * \brief Compute rectangle in case 15. */ void bf::ler_solver::compute_case_15() { // type B point_list::iterator it; for ( it = m_s1_corners.begin(); it != m_s1_corners.end(); ++it ) { supported_point p2 = get_point_end_min_x (m_s2,it->x,m_problem.get_bounding_rectangle().top()); supported_point p4 = get_point_min_y(m_s4,it->y,m_problem.get_bounding_rectangle().right()); point_list c_p; compute_c_p_max_max(m_s3,p4.first.x,p2.first.y,c_p); if ( c_p.empty() ) { point q1(it->x + 1, it->y + 1); point q2; if ( p4.second ) q2.x = p4.first.x - 1; else q2.x = p4.first.x; if ( p2.second ) q2.y = p2.first.y - 1; else q2.y = p2.first.y; if ( (q1.x <= q2.x) && (q1.y <= q2.y) ) update_solution(rectangle(q1,q2),15); } } } // ler_solver::compute_case_15() /*----------------------------------------------------------------------------*/ /** * \brief Compute rectangle in case 16. */ void bf::ler_solver::compute_case_16() { // type B point_list::iterator it; for ( it = m_s1_corners.begin(); it != m_s1_corners.end(); ++it ) { supported_point p2 = get_point_end_min_x (m_s2,it->x,m_problem.get_bounding_rectangle().top()); supported_point p3 = get_point_max_y (m_s3,p2.first.y,m_problem.get_bounding_rectangle().right()); point_list c_p; compute_c_p_max_min(m_s4,p3.first.x,it->y,c_p); if ( c_p.empty() ) { point q1(it->x + 1, it->y + 1); point q2; if ( p3.second ) q2.x = p3.first.x - 1; else q2.x = p3.first.x; if ( p2.second ) q2.y = p2.first.y - 1; else q2.y = p2.first.y; if ( (q1.x <= q2.x) && (q1.y <= q2.y) ) update_solution(rectangle(q1,q2),16); } } } // ler_solver::compute_case_16() /*----------------------------------------------------------------------------*/ /** * \brief Compute rectangle of type C. */ void bf::ler_solver::compute_c_p_max_max (const point_list& p, unsigned int max_x, unsigned int max_y, point_list& c_p) { point_list::const_iterator it; for ( it = p.begin(); it != p.end(); ++it ) if ( it->x < max_x && it->y < max_y) c_p.push_back(*it); } // ler_solver::compute_c_p_max_max() /*----------------------------------------------------------------------------*/ /** * \brief Compute rectangle of type C. */ void bf::ler_solver::compute_c_p_max_min (const point_list& p, unsigned int max_x, unsigned int min_y, point_list& c_p) { point_list::const_iterator it; for ( it = p.begin(); it != p.end(); ++it ) if ( it->x < max_x && it->y > min_y) c_p.push_back(*it); } // ler_solver::compute_c_p_max_min() /*----------------------------------------------------------------------------*/ /** * \brief Compute rectangle of type C. */ void bf::ler_solver::compute_c_p_min_max (const point_list& p, unsigned int min_x, unsigned int max_y, point_list& c_p) { point_list::const_iterator it; for ( it = p.begin(); it != p.end(); ++it ) if ( it->x > min_x && it->y < max_y) c_p.push_back(*it); } // ler_solver::compute_c_p_min_max() /*----------------------------------------------------------------------------*/ /** * \brief Compute rectangle of type C. */ void bf::ler_solver::compute_c_p_min_min (const point_list& p, unsigned int min_x, unsigned int min_y, point_list& c_p) { point_list::const_iterator it; for ( it = p.begin(); it != p.end(); ++it ) if ( it->x > min_x && it->y > min_y) c_p.push_back(*it); } // ler_solver::compute_c_p_min_min() bf::ler_solver::supported_point bf::ler_solver::get_point_min_x (const point_list& p, unsigned int min_x, unsigned int default_y) const { supported_point result; result.first.x = min_x; result.first.y = default_y; result.second = false; point_list::const_iterator it; bool found = false; for ( it = p.begin(); (it != p.end()) && (! found); ++it ) { if ( it->x > min_x ) { found = true; result.first = *it; result.second = true; } } return result; } // ler_solver::get_point_min_x() bf::ler_solver::supported_point bf::ler_solver::get_point_max_x (const point_list& p, unsigned int max_x, unsigned int default_y) const { supported_point result; result.first.x = max_x; result.first.y = default_y; result.second = false; point_list::const_iterator it; bool found = false; for ( it = p.begin(); (it != p.end()) && (! found); ++it ) { if ( it->x < max_x ) { found = true; result.first = *it; result.second = true; } } return result; } // ler_solver::get_point_max_x() /*----------------------------------------------------------------------------*/ /** * \brief */ bf::ler_solver::supported_point bf::ler_solver::get_point_min_y (const point_list& p, unsigned int min_y, unsigned int default_x) const { supported_point result; result.first.x = default_x; result.first.y = min_y; result.second = false; point_list::const_iterator it; bool found = false; for ( it = p.begin(); (it != p.end()) && (! found); ++it ) { if ( it->y > min_y ) { found = true; result.first = *it; result.second = true; } } return result; } // ler_solver::get_point_min_y() bf::ler_solver::supported_point bf::ler_solver::get_point_max_y (const point_list& p, unsigned int max_y, unsigned int default_x) const { supported_point result; result.first.x = default_x; result.first.y = max_y; result.second = false; point_list::const_iterator it; bool found = false; for ( it = p.begin(); (it != p.end()) && (! found); ++it ) { if ( it->y < max_y ) { found = true; result.first = *it; result.second = true; } } return result; } // ler_solver::get_point_max_y() bf::ler_solver::supported_point bf::ler_solver::get_point_end_min_x (const point_list& p, unsigned int min_x, unsigned int default_y) const { supported_point result; result.first.x = min_x; result.first.y = default_y; result.second = false; if ( ! p.empty() ) { bool found = false; point_list::const_iterator it = p.end(); do { --it; if ( it->x > min_x ) { found = true; result.first = *it; result.second = true; } } while ( !found && (it != p.begin()) ); } return result; } // ler_solver::get_point_end_min_x() bf::ler_solver::supported_point bf::ler_solver::get_point_end_max_x (const point_list& p, unsigned int max_x, unsigned int default_y) const { supported_point result; result.first.x = max_x; result.first.y = default_y; result.second = false; if ( ! p.empty() ) { bool found = false; point_list::const_iterator it = p.end(); do { --it; if ( it->x < max_x ) { found = true; result.first = *it; result.second = true; } } while ( !found && (it != p.begin()) ); } return result; } // ler_solver::get_point_end_max_x() bf::ler_solver::supported_point bf::ler_solver::get_point_end_min_y (const point_list& p, unsigned int min_y, unsigned int default_x) const { supported_point result; result.first.x = default_x; result.first.y = min_y; result.second = false; if ( ! p.empty() ) { bool found = false; point_list::const_iterator it = p.end(); do { --it; if ( it->y > min_y ) { found = true; result.first = *it; result.second = true; } } while ( !found && (it != p.begin()) ); } return result; } // ler_solver::get_point_end_min_x() bf::ler_solver::supported_point bf::ler_solver::get_point_end_max_y (const point_list& p, unsigned int max_y, unsigned int default_x) const { supported_point result; result.first.x = default_x; result.first.y = max_y; result.second = false; if ( ! p.empty() ) { bool found = false; point_list::const_iterator it = p.end(); do { --it; if ( it->y < max_y ) { found = true; result.first = *it; result.second = true; } } while ( !found && (it != p.begin()) ); } return result; } // ler_solver::get_point_end_max_x() plee-the-bear-20251226/bear-factory/bear-editor/src/bf/opaque_rectangle/code/test.cpp000066400000000000000000000036651512343254000302460ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the ler_problem class. * \author Sebastien Angibaud */ #include "bf/opaque_rectangle/test.hpp" #include "bf/opaque_rectangle/ler_problem.hpp" #include "bf/opaque_rectangle/ler_solver.hpp" #include /*----------------------------------------------------------------------------*/ /** * \brief Constructor. */ bf::test::test( ) { std::cout << "problem creation" << std::endl; ler_problem pb; ler_problem::rectangle r ( ler_problem::point(0, 0), ler_problem::point(6, 8) ); pb.set_bounding_rectangle(r); // DEFAULT TEST // no forbidden point // TEST 2 /*pb.add_forbidden_point(point(0,7)); pb.add_forbidden_point(point(1,2)); pb.add_forbidden_point(point(1,4)); pb.add_forbidden_point(point(2,0)); pb.add_forbidden_point(point(2,6)); pb.add_forbidden_point(point(3,6)); pb.add_forbidden_point(point(4,1)); pb.add_forbidden_point(point(4,8)); pb.add_forbidden_point(point(5,3)); pb.add_forbidden_point(point(5,5)); pb.add_forbidden_point(point(5,6)); pb.add_forbidden_point(point(6,4)); */ // TEST 2 // All forbidden point /* for ( unsigned int i = 0; i != 7; i++ ) for ( unsigned int j = 0; j != 9; j++ ) pb.add_forbidden_point(point(i,j)); */ std::cout << "solver creation" << std::endl; ler_solver solver(pb); std::cout << "resolution" << std::endl; solver.resolve(); std::cout << "result" << std::endl; if ( solver.is_solved() ) { ler_problem::rectangle solution = solver.get_solution(); std::cout << "solution : " << solution.left() << " " << solution.bottom() << " " << solution.right() << " " << solution.top() << std::endl; } else std::cout << "No solution" << std::endl; } // test::test() plee-the-bear-20251226/bear-factory/bear-editor/src/bf/opaque_rectangle/ler_base_problem.hpp000066400000000000000000000064561512343254000316570ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A largest empty rectangle problem. * \author Sebastien Angibaud */ #ifndef __BF_LER_BASE_PROBLEM_HPP__ #define __BF_LER_BASE_PROBLEM_HPP__ #include #include namespace bf { /** * \brief A largest empty rectangle problem. * * \author Sebastien Angibaud */ class ler_base_problem { public: /** \brief The type of the rectangles used in the problems. */ typedef claw::math::box_2d rectangle; /** \brief The type of the vectors used for representing coordinates. */ typedef claw::math::coordinate_2d point; /** \brief Compare two points on their coordinates. */ struct point_compare_x_min_y_min { bool operator() ( const point& pe1, const point& pe2 ) const; }; // struct point_compare_x_min_y_min /** \brief Compare two points on their coordinates. */ struct point_compare_x_min_y_max { bool operator() ( const point& pe1, const point& pe2 ) const; }; // struct point_compare_x_min_y_max /** \brief Compare two points on their coordinates. */ struct point_compare_x_max_y_min { bool operator() ( const point& pe1, const point& pe2 ) const; }; // struct point_compare_x_max_y_min /** \brief Compare two points on their coordinates. */ struct point_compare_x_max_y_max { bool operator() ( const point& pe1, const point& pe2 ) const; }; // struct point_compare_x_max_y_max /** \brief Compare two points on their y-coordinates. */ struct point_compare_y_min_x_min { bool operator() ( const point& pe1, const point& pe2 ) const; }; // struct point_compare_y_min_x_min /** \brief The type of the iterators. */ typedef std::list::const_iterator const_iterator; public: ler_base_problem(unsigned int min_bound = 0); virtual ~ler_base_problem(); bool is_terminal() const; bool is_a_solution() const; void set_min_bound(unsigned int min_bound); unsigned int get_min_bound() const; const rectangle& get_bounding_rectangle() const; void set_bounding_rectangle(const rectangle& bounding_rectangle); void divide_on_x(ler_base_problem*& left_pb, ler_base_problem*& right_pb); void divide_on_y(ler_base_problem*& bottom_pb, ler_base_problem*& top_pb); bool largest_rectangle_in_line(rectangle& result); unsigned int get_vertical_line() const; unsigned int get_horizontal_line() const; void compute_min_bound(); virtual bool has_forbidden_points() const = 0; virtual unsigned int get_nb_points() const = 0; virtual const_iterator first_point() const = 0; virtual const_iterator end_point() const = 0; private: bool largest_rectangle_in_horizontal_line(rectangle& result); bool largest_rectangle_in_vertical_line(rectangle& result); protected: /** \brief The rectangle in which we search the largest empty rectangle.*/ rectangle m_bounding_rectangle; /** \brief The minimal bound.*/ unsigned int m_min_bound; }; // ler_base_problem } // namespace bf #endif // __BF_LER_BASE_PROBLEM_HPP__ plee-the-bear-20251226/bear-factory/bear-editor/src/bf/opaque_rectangle/ler_horizontal_problem.hpp000066400000000000000000000022401512343254000331210ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A largest empty rectangle problem. * \author Sebastien Angibaud */ #ifndef __BF_LER_HORIZONTAL_PROBLEM_HPP__ #define __BF_LER_HORIZONTAL_PROBLEM_HPP__ #include "bf/opaque_rectangle/ler_base_problem.hpp" namespace bf { /** * \brief A largest empty rectangle problem. * * \author Sebastien Angibaud */ class ler_horizontal_problem : public ler_base_problem { public: ler_horizontal_problem ( const_iterator first_point, const_iterator end_point, unsigned int min_bound = 0 ); bool has_forbidden_points() const; unsigned int get_nb_points() const; const_iterator first_point() const; const_iterator end_point() const; private: /** \brief The itertaor on first point. */ const_iterator m_first_point; /** \brief The iterator just after the last point. */ const_iterator m_end_point; }; // ler_horizontal_problem } // namespace bf #endif // __BF_LER_HORIZONTAL_PROBLEM_HPP__ plee-the-bear-20251226/bear-factory/bear-editor/src/bf/opaque_rectangle/ler_problem.hpp000066400000000000000000000017731512343254000306620ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A largest empty rectangle problem. * \author Sebastien Angibaud */ #ifndef __BF_LER_PROBLEM_HPP__ #define __BF_LER_PROBLEM_HPP__ #include "bf/opaque_rectangle/ler_base_problem.hpp" namespace bf { /** * \brief A largest empty rectangle problem. * * \author Sebastien Angibaud */ class ler_problem : public ler_base_problem { public: ler_problem(unsigned int min_bound = 0); void add_forbidden_point(const point& p); bool has_forbidden_points() const; unsigned int get_nb_points() const; const_iterator first_point() const; const_iterator end_point() const; private: /** \brief The list of forbidden points. */ std::list m_forbidden_points; }; // ler_problem } // namespace bf #endif // __BF_LER_PROBLEM_HPP__ plee-the-bear-20251226/bear-factory/bear-editor/src/bf/opaque_rectangle/ler_solver.hpp000066400000000000000000000110651512343254000305270ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A solver for largest empty rectangle problem. * \author Sebastien Angibaud */ #ifndef __BF_LER_SOLVER_HPP__ #define __BF_LER_SOLVER_HPP__ #include namespace bf { class ler_base_problem; /** * \brief A solver for largest empty rectangle problem. * * \author Sebastien Angibaud */ class ler_solver { public: typedef ler_base_problem::point point; typedef ler_base_problem::rectangle rectangle; typedef std::pair supported_point; typedef std::list point_list; public: ler_solver(ler_base_problem& pb); void resolve(); bool is_solved() const; const rectangle& get_solution() const; unsigned int get_case_solution() const; private: void divide_on_x_y(); void resolve_in_order( std::vector& pbs); void search_rectangle_in_quadrants(); void resolve_sub_problem(ler_base_problem* pb); unsigned int area(const rectangle& r); void update_solution(const rectangle& r, unsigned int solution_case); void place_points_in_quadrants(); void sort_quadrants(); void keep_maximum_points(); void keep_maximum_points_in_quadrant(point_list& p, bool max); void compute_corners(); void compute_corners_in_quadrant(const point_list &p, point_list& corners); void search_on_line(); void compute_case_1(); void compute_case_2(); void compute_case_3(); void compute_case_4(); void compute_case_5(); void compute_case_6(); void compute_case_7(); void compute_case_8(); void compute_case_8_unit(point & p); void compute_case_9(); void compute_case_9_unit(point & p); void compute_case_10(); void compute_case_11(); void compute_case_12(); void compute_case_13(); void compute_case_14(); void compute_case_15(); void compute_case_16(); void compute_c_p_max_max ( const point_list& p, unsigned int max_x, unsigned int max_y, point_list& c_p ); void compute_c_p_max_min ( const point_list& p, unsigned int max_x, unsigned int min_y, point_list& c_p ); void compute_c_p_min_max ( const point_list& p, unsigned int min_x, unsigned int max_y, point_list& c_p ); void compute_c_p_min_min ( const point_list& p, unsigned int min_x, unsigned int min_y, point_list& c_p ); supported_point get_point_min_x (const point_list & p, unsigned int min_x, unsigned int default_y) const; supported_point get_point_max_x (const point_list & p, unsigned int max_x, unsigned int default_y) const; supported_point get_point_min_y (const point_list & p, unsigned int min_y, unsigned int default_x) const; supported_point get_point_max_y (const point_list & p, unsigned int max_y, unsigned int default_x) const; supported_point get_point_end_min_x (const point_list & p, unsigned int min_x, unsigned int default_y) const; supported_point get_point_end_max_x (const point_list & p, unsigned int min_x, unsigned int default_y) const; supported_point get_point_end_min_y (const point_list & p, unsigned int min_y, unsigned int default_x) const; supported_point get_point_end_max_y (const point_list & p, unsigned int max_y, unsigned int default_x) const; private: /* \brief The problem to solve. */ ler_base_problem& m_problem; /* \brief The solution. */ rectangle m_solution; /* \brief The case in which we found the best solution. */ unsigned int m_solution_case; /* \brief Indicates if a solution has been found. */ bool m_solved; /* Notation of quadrants : S2 | S3 ---------- S1 | S4 */ /* \brief List of forbidden points in S1 quadrant. */ point_list m_s1; /* \brief List of forbidden points in S2 quadrant. */ point_list m_s2; /* \brief List of forbidden points in S3 quadrant. */ point_list m_s3; /* \brief List of forbidden points in S4 quadrant. */ point_list m_s4; /* \brief List of corner points in S1 quadrant. */ point_list m_s1_corners; /* \brief List of forbidden points in S2 quadrant. */ point_list m_s2_corners; /* \brief List of forbidden points in S3 quadrant. */ point_list m_s3_corners; /* \brief List of forbidden points in S4 quadrant. */ point_list m_s4_corners; }; // ler_solver } // namespace bf #endif // __BF_LER_SOLVER_HPP__ plee-the-bear-20251226/bear-factory/bear-editor/src/bf/opaque_rectangle/test.hpp000066400000000000000000000010541512343254000273270ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A largest empty rectangle problem. * \author Sebastien Angibaud */ #ifndef __BF_TEST_HPP__ #define __BF_TEST_HPP__ namespace bf { /** * \brief A largest empty rectangle problem. * * \author Sebastien Angibaud */ class test { public: test(); }; // test } // namespace bf #endif // __BF_TEST_HPP__ plee-the-bear-20251226/bear-factory/bear-editor/src/bf/path_configuration.hpp000066400000000000000000000116171512343254000267230ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A singleton that stores the paths used in the programs. * \author Julien Jorge */ #ifndef __BF_PATH_CONFIGURATION_HPP__ #define __BF_PATH_CONFIGURATION_HPP__ #include "bf/libeditor_export.hpp" #include "bf/workspace.hpp" #include #include #include #include #include #include namespace bf { /** * \brief A singleton that stores the paths used in the programs. * \author Julien Jorge */ class BEAR_EDITOR_EXPORT path_configuration: public claw::pattern::basic_singleton { private: /** \brief The result found by a call to find_random_file_name_on_disk(). */ struct random_file_result { random_file_result ( const std::string p, std::size_t n, const std::list& c ); /** \brief The pattern used for the search. */ const std::string pattern; /** \brief The maximum number of results asked. */ const std::size_t count; /** \brief The files found in the data directory. */ const std::list candidates; }; // struct random_file_result /** \brief The type of the container in which we store the results of the calls to find_random_file_name_on_disk(). */ typedef std::list cached_random_file_list_type; public: /** \brief Map of workspace. */ typedef std::map< std::string, workspace > workspaces_map; /** \brief Const iterator on map of workspace. */ typedef workspaces_map::const_iterator workspaces_const_iterator; /** \brief Itrator on map of workspace. */ typedef workspaces_map::iterator workspaces_iterator; public: path_configuration(); void save() const; std::string get_config_directory() const; bool get_full_path( std::string& p, const std::string& w ) const; bool expand_file_name( std::string& p, const std::string& w ) const; bool expand_file_name ( std::string& p, std::size_t m, const std::string& w ) const; bool get_relative_path( std::string& p, const std::string& w ) const; void set_workspaces(const workspaces_map& w); bool has_workspace( const std::string& w ) const; const workspace& get_workspace( const std::string& w ) const; const workspaces_map& get_workspaces() const; std::string search_workspace( const std::string& path ) const; private: void load(); bool create_config_directory() const; bool create_config_file() const; bool find_random_file_name ( std::string& name, std::size_t m, const std::string& w ) const; bool find_cached_random_file_name( std::string& name, std::size_t m ) const; bool find_random_file_name_on_disk ( std::string& name, std::size_t m, const std::string& w ) const; void find_all_files_in_dir ( const std::string& dirname, const std::string& pattern, std::size_t offset, std::size_t m, std::list& result ) const; bool glob_match ( const std::string& pattern, const std::string& text, std::size_t offset ) const; bool glob_potential_match ( const std::string& pattern, const std::string& text, std::size_t offset ) const; boost::filesystem::path resolve_path( const std::string& path ) const; public: /** \brief Map of workspaces. */ workspaces_map m_workspaces; private: /** \brief Recent results obtained with find_random_file_name. */ mutable cached_random_file_list_type m_cached_random_file; /** \brief The maximum number of entries in m_cached_random_file. */ std::size_t m_max_cached_files; /** \brief The name of the configuration file. */ static const std::string s_config_file_name; /** \brief The path to the directory containing the configuration file, relative to the user's directory. */ static const std::string s_config_directory; /** \brief Character written on the left of a section name in the configuration file. */ static const char s_section_left; /** \brief Character written on the right of a section name in the configuration file. */ static const char s_section_right; /** \brief Character used for comments in the configuration file. */ static const char s_comment; /** \brief Character used for assigning a value to a field. */ static const char s_field_assign; /** \brief The field of the directory of XML files for item classes. */ static const std::string s_items_directory_field; /** \brief The field of the directory of the path of datas. */ static const std::string s_data_directory_field; }; // class path_configuration } // namespace bf #endif // __BF_PATH_CONFIGURATION_HPP__ plee-the-bear-20251226/bear-factory/bear-editor/src/bf/sample.hpp000066400000000000000000000026141512343254000243160ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief The value of a field of type "sample". * \author Julien Jorge */ #ifndef __BF_SAMPLE_HPP__ #define __BF_SAMPLE_HPP__ #include "bf/bitmap_rendering_attributes.hpp" #include "bf/libeditor_export.hpp" #include namespace bf { class compilation_context; /** * \brief The value of a field of type "sample". * \author Julien Jorge */ class BEAR_EDITOR_EXPORT sample: public bitmap_rendering_attributes { public: sample(); void set_path( const std::string& name ); void set_loops( const unsigned int loops ); void set_volume( const double v ); unsigned int get_loops() const; double get_volume() const; const std::string& get_path() const; bool operator==( const sample& that ) const; bool operator!=( const sample& that ) const; void compile( compiled_file& f, compilation_context& c ) const; private: /** \brief The path to the resource to use. */ std::string m_path; /** \brief How many times the sample will be played. */ unsigned int m_loops; /** \brief The volume at which the sample is played. */ double m_volume; }; // class sample } // namespace bf #endif // __BF_SAMPLE_HPP__ plee-the-bear-20251226/bear-factory/bear-editor/src/bf/sample_edit.hpp000066400000000000000000000033731512343254000253260ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief The window showing the properties of a sample. * \author Julien Jorge */ #ifndef __BF_SAMPLE_EDIT_HPP__ #define __BF_SAMPLE_EDIT_HPP__ #include "bf/default_value.hpp" #include "bf/libeditor_export.hpp" #include "bf/base_edit.hpp" #include "bf/sample.hpp" #include "bf/spin_ctrl.hpp" #include #include #include #include namespace bf { class workspace_environment; /** * \brief The window showing the properties of a sample. * \author Julien Jorge */ class BEAR_EDITOR_EXPORT sample_edit: public wxPanel, public base_edit { public: /** \brief The identifiers of the controls. */ enum control_id { IDC_FILE_SELECT }; // enum control_id public: sample_edit ( wxWindow& parent, workspace_environment& env, const sample& s = default_value::get() ); bool validate(); private: void value_updated(); void fill_controls(); void create_controls(); void create_sizer_controls(); void on_file_select(wxCommandEvent& event); private: /** \brief How many times the sample is repeated. */ wxSpinCtrl* m_loops; /** \brief The valume at which the sample is played. */ spin_ctrl* m_volume; /** \brief The path to the sample file. */ wxTextCtrl* m_sound_file; /** \brief The workspace environment used. */ workspace_environment& m_workspace; DECLARE_EVENT_TABLE() }; // class sample_edit } // namespace bf #endif // __BF_SAMPLE_EDIT_HPP__ plee-the-bear-20251226/bear-factory/bear-editor/src/bf/scan_dir.hpp000066400000000000000000000022551512343254000246200ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Search a given directory for files with specific extensions. * \author Julien Jorge */ #ifndef __BF_SCAN_DIR_HPP__ #define __BF_SCAN_DIR_HPP__ namespace bf { /** * \brief Search a given directory for files with specific extensions. * \param Func The type of a copyable function object used to process the * files. * * This class scan a given directory and call Func( file_name ) on each * file_name found in the directory, ending with one of the given extensions. * * \author Julien Jorge */ template class scan_dir { public: template void operator() ( const std::string& dir, Func& f, Iterator first_ext, Iterator last_ext ); private: template bool supported_extension ( const std::string& dir, Iterator first_ext, Iterator last_ext ); }; // class scan_dir } // namespace bf #include "bf/impl/scan_dir.tpp" #endif // __BF_SCAN_DIR_HPP__ plee-the-bear-20251226/bear-factory/bear-editor/src/bf/set_edit.hpp000066400000000000000000000022661512343254000246400ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A control for editing a field that takes its value in a set. * \author Julien Jorge */ #ifndef __BF_SET_EDIT_HPP__ #define __BF_SET_EDIT_HPP__ #include "bf/simple_edit.hpp" #include "bf/default_value.hpp" #include namespace bf { /** * \brief A control for editing a field that can takes ites value in a set. * \author Julien Jorge */ template class set_edit: public simple_edit, public wxChoice { public: /** The type of the current class. */ typedef set_edit self_type; /** \brief The type of the value of the edited field. */ typedef typename simple_edit::value_type value_type; public: set_edit ( wxWindow& parent, const wxArrayString& choices, const value_type& v = default_value::get() ); bool validate(); private: void value_updated(); }; // class set_edit } // namespace bf #include "bf/impl/set_edit.tpp" #endif // __BF_SET_EDIT_HPP__ plee-the-bear-20251226/bear-factory/bear-editor/src/bf/simple_edit.hpp000066400000000000000000000022531512343254000253320ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A base class providing methods for simple types (integer_type, * string_type and so on). * \author Julien Jorge */ #ifndef __BF_SIMPLE_EDIT_HPP__ #define __BF_SIMPLE_EDIT_HPP__ #include "bf/base_edit.hpp" #include namespace bf { /** * \brief A base class providing methods for simple types (integer_type, * string_type and so on). * \author Julien Jorge */ template class simple_edit: public base_edit { public: /** \brief The type of the parent class. */ typedef base_edit super; /** \brief The type of the value of the edited field. */ typedef typename base_edit::value_type value_type; public: simple_edit( const value_type& v ); protected: wxString value_to_string() const; bool value_from_string( const wxString& str ); }; // class simple_edit } // namespace bf #include "bf/impl/simple_edit.tpp" #endif // __BF_SIMPLE_EDIT_HPP__ plee-the-bear-20251226/bear-factory/bear-editor/src/bf/slider_ctrl.hpp000066400000000000000000000131201512343254000253350ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A slider control. * \author Sébastien Angibaud */ #ifndef __BF_SLIDER_CTRL_HPP__ #define __BF_SLIDER_CTRL_HPP__ #include #include #define slider_event_handler(func) \ (wxObjectEventFunction)(wxEventFunction) \ wxStaticCastEvent(slider_event::function_type, &func) #define EVT_SLIDER_VALUE_CHANGE(id, func) \ wx__DECLARE_EVT1( bf::slider_event::value_change_event_type, \ id, slider_event_handler(func) ) #define tick_event_handler(func) \ (wxObjectEventFunction)(wxEventFunction) \ wxStaticCastEvent(tick_event::function_type, &func) #define EVT_TICK_MOVE(id, func) \ wx__DECLARE_EVT1( bf::tick_event::move_event_type, \ id, tick_event_handler(func) ) namespace bf { /** * \brief Event sent when the value of a slider has changed. * \author Sébastien Angibaud */ class slider_event: public wxNotifyEvent { public: typedef void (wxEvtHandler::*function_type)(slider_event&); public: slider_event( wxEventType t = wxEVT_NULL, wxWindowID id = wxID_ANY ); slider_event ( double value, wxEventType t = wxEVT_NULL, wxWindowID id = wxID_ANY ); slider_event( const slider_event& that ); wxEvent* Clone() const; double get_value() const; public: static const wxEventType value_change_event_type; private: /** \brief The value of the slider. */ double m_value; }; // class slider_event /** * \brief Event sent when a tick of the slider has moved. * \author Sébastien Angibaud */ class tick_event: public wxNotifyEvent { public: typedef void (wxEvtHandler::*function_type)(tick_event&); public: tick_event( wxEventType t = wxEVT_NULL, wxWindowID id = wxID_ANY ); tick_event ( double initial_value, double new_value, bool copy, wxEventType t = wxEVT_NULL, wxWindowID id = wxID_ANY ); tick_event( const tick_event& that ); wxEvent* Clone() const; double get_initial_value() const; double get_new_value() const; bool get_copy() const; public: static const wxEventType move_event_type; private: /** \brief The initial value of the tick. */ double m_initial_value; /** \brief The new value of the tick. */ double m_new_value; /** \brief The copy statut. */ double m_copy; }; // class tick_event /** * \brief A slider control. * \author Sébastien Angibaud */ class slider_ctrl: public wxPanel { public: typedef wxPanel super; typedef double tick; typedef std::set ticks; /** \brief The identifiers of the controls. */ enum control_id { ID_PREVIOUS, ID_NEXT }; // enum control_id private: /** \brief Informations on a drag local to the control. */ class drag_info { public: enum drag_mode_type { drag_mode_none, drag_mode_tick_move, drag_mode_move }; // enum drag_mode public: drag_info(); wxSize delta() const; public: /** \brief The current mode of the drag. */ drag_mode_type drag_mode; /** \brief Initial value of the tick. */ double initial_value; /** \brief Origin of the drag. */ wxPoint mouse_origin; /** \brief Position of the mouse during the drag. */ wxPoint mouse_position; }; // struct drag_info public: slider_ctrl (wxWindow* parent, wxWindowID id, tick value=0, tick min_value=0, tick max_value=100); void render(); void set_ticks(const ticks* t); double get_value() const; void set_value(double value); void set_max_value(double max); private: bool has_tick( double value ) const; void send_event_change_value(); void send_event_move_tick ( double initial_value, double new_value, bool copy ); unsigned int get_slider_width() const; void render_slider( wxDC& dc ) const; void render_value( wxDC& dc ) const; void render_drag_info( wxDC& dc ) const; void render_ticks( wxDC& dc ) const; void render_tick( wxDC& dc, tick t ) const; void render_tick ( wxDC& dc, unsigned int position, const wxColour& colour, const wxBrush& brush ) const; double nearest_tick( double v) const; double get_value(int pos) const; unsigned int get_position(double value) const; void apply_drag_mode_move( bool shift ); void apply_drag_mode_tick_move( bool control, bool alt ); void on_size(wxSizeEvent& event); void on_paint(wxPaintEvent& event); void on_mouse_left_down(wxMouseEvent& event); void on_mouse_move(wxMouseEvent& event); void on_mouse_left_up(wxMouseEvent& event); void on_mouse_left_dclick(wxMouseEvent& event); private: /** \brief Info about the current dragging. */ drag_info* m_drag_info; /** \brief The current value. */ double m_value; /** \brief The minimum value. */ double m_min_value; /** \brief The maximum value. */ double m_max_value; /** \brief The list of ticks. */ const ticks* m_ticks; /** \brief The border near the slider. */ static const unsigned int s_slider_border; DECLARE_EVENT_TABLE() }; // class slider_ctrl } // namespace bf #endif // __BF_SLIDER_CTRL_HPP__ plee-the-bear-20251226/bear-factory/bear-editor/src/bf/slider_with_ticks.hpp000066400000000000000000000044741512343254000265550ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A slider with tick support. * \author Sébastien Angibaud */ #ifndef __BF_SLIDER_WITH_TICKS_HPP__ #define __BF_SLIDER_WITH_TICKS_HPP__ #include #include "bf/spin_ctrl.hpp" #include "bf/slider_ctrl.hpp" #include namespace bf { /** * \brief A slider with tick support. * \author Sébastien Angibaud */ class slider_with_ticks: public wxPanel { public: typedef wxPanel super; /** \brief The identifiers of the controls. */ enum control_id { ID_PREVIOUS, ID_NEXT, ID_DATE_SPIN, ID_SLIDER }; // enum control_id public: slider_with_ticks (wxWindow* parent, wxWindowID id, slider_ctrl::tick value=0, slider_ctrl::tick min_value=0, slider_ctrl::tick max_value=100); void add_tick(double pos); void remove_tick(double pos); void clear_ticks(); double get_value() const; void set_value( double value ); void set_max_value( double max ); void previous_tick(); void next_tick(); private: void create_controls(); void set_controls_position(); void fill_controls(); void send_event_change_value(); void send_event_tick_move( tick_event& event ); void on_previous( wxCommandEvent& event ); void on_next( wxCommandEvent& event ); void on_date_change(spin_event& event); void on_slider_change(slider_event& event); void on_tick_move(tick_event& event); private: /** \brief The current value. */ double m_value; /** \brief The minimum value. */ double m_min_value; /** \brief The maximum value. */ double m_max_value; /** \brief The list of ticks. */ slider_ctrl::ticks m_ticks; /** \brief The button to go at the previous tick. */ wxBitmapButton* m_previous; /** \brief The button to go at the next tick. */ wxBitmapButton* m_next; /** \brief The spin to edit the value. */ spin_ctrl* m_spin; /** \brief The slider control. */ slider_ctrl* m_slider; DECLARE_EVENT_TABLE() }; // class slider_with_ticks } // namespace bf #endif // __BF_SLIDER_WITH_TICKS_HPP__ plee-the-bear-20251226/bear-factory/bear-editor/src/bf/spin_ctrl.hpp000066400000000000000000000065121512343254000250330ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A spin control that supports any numeric type of value. * \author Julien Jorge */ #ifndef __BF_SPIN_CTRL_HPP__ #define __BF_SPIN_CTRL_HPP__ #include #include #include #define spin_event_handler(func, T) \ (wxObjectEventFunction)(wxEventFunction) \ wxStaticCastEvent(spin_event::function_type, &func) #define EVT_SPIN_VALUE_CHANGE(id, func, T) \ wx__DECLARE_EVT1( bf::spin_event::value_change_event_type, \ id, spin_event_handler(func, T) ) namespace bf { /** * \brief Event sent when the value of a spin_ctrl has changed. * \author Julien Jorge */ template class spin_event: public wxNotifyEvent { public: typedef void (wxEvtHandler::*function_type)(spin_event&); public: spin_event( wxEventType t = wxEVT_NULL, wxWindowID id = wxID_ANY ); spin_event( T value, wxEventType t = wxEVT_NULL, wxWindowID id = wxID_ANY ); spin_event( const spin_event& that ); wxEvent* Clone() const; T get_value() const; public: static const wxEventType value_change_event_type; private: /** \brief The value of the spin_ctrl. */ const T m_value; }; // class spin_event /** * \brief A spin control that supports any numeric type of value. * \author Julien Jorge */ template class spin_ctrl: public wxPanel { public: /** \brief The type of the value stored in the control. */ typedef T value_type; /** \brief The type of the parent class. */ typedef wxPanel super; /** \brief The type of the current class. */ typedef spin_ctrl self_type; public: spin_ctrl ( wxWindow* parent, wxWindowID id = -1, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = 0, value_type min = 0, value_type max = 100, value_type initial = 0, value_type step = 1, const wxString& name = wxT("spin_ctrl") ); void SetRange( value_type min, value_type max ); void SetStep( value_type s ); void SetValue( value_type v ); value_type GetValue() const; value_type GetMin() const; value_type GetMax() const; wxString GetValueText() const; private: void BoundValue( value_type v ); void ValueToText(); void DoValueToText(); void CreateControls(); void Up(); void Down(); void SendEvent(); protected: void OnSpinUp( wxSpinEvent& event ); void OnSpinDown( wxSpinEvent& event ); void OnChange( wxCommandEvent& event ); private: /** \brief The minimum value. */ value_type m_min; /** \brief The maximum value. */ value_type m_max; /** \brief The current value. */ value_type m_value; /** \brief The step of the spin button. */ value_type m_step; /** \brief The text field in which we display the value. */ wxTextCtrl* m_text; /** \brief The spin button. */ wxSpinButton* m_spin; }; // spin_ctrl } // namespace bf #include "bf/impl/spin_ctrl.tpp" #endif // __BF_SPIN_CTRL_HPP__ plee-the-bear-20251226/bear-factory/bear-editor/src/bf/splash_screen.hpp000066400000000000000000000022531512343254000256650ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A splash screen for the applications. * \author Julien Jorge */ #ifndef __BF_SPLASH_SCREEN_HPP__ #define __BF_SPLASH_SCREEN_HPP__ #include #include namespace bf { /** * \brief A splash screen for the applications. * \author Julien Jorge */ class splash_screen: public wxSplashScreen { public: static splash_screen* create ( const wxString& img_name, long status_style = wxALIGN_CENTRE | wxST_NO_AUTORESIZE ); splash_screen( const wxBitmap& img, long status_style ); wxStaticText& get_status_label(); wxStaticText& get_version_label(); private: /** \brief The static text where the status of the application is displayed. */ wxStaticText* m_status_label; /** \brief The static text where the version of the application is displayed. */ wxStaticText* m_version_label; }; // class splash_screen } // namespace bf #endif // __BF_SPLASH_SCREEN_HPP__ plee-the-bear-20251226/bear-factory/bear-editor/src/bf/sprite.hpp000066400000000000000000000041431512343254000243420ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief The value of a field of type "sprite". * \author Julien Jorge */ #ifndef __BF_SPRITE_HPP__ #define __BF_SPRITE_HPP__ #include "bf/bitmap_rendering_attributes.hpp" #include "bf/libeditor_export.hpp" #include #include namespace bf { class compilation_context; /** * \brief Sprite type. * \author Julien Jorge */ class BEAR_EDITOR_EXPORT sprite: public bitmap_rendering_attributes { public: sprite(); void set_image_name( const std::string& name ); void set_spritepos_entry( const std::string& name ); void set_top( const unsigned int top ); void set_left( const unsigned int left ); void set_clip_width( const unsigned int width ); void set_clip_height( const unsigned int height ); void set_clip_rectangle( const claw::math::rectangle& r ); unsigned int get_left() const; unsigned int get_top() const; unsigned int get_clip_width() const; unsigned int get_clip_height() const; claw::math::rectangle get_clip_rectangle() const; const std::string& get_image_name() const; const std::string& get_spritepos_entry() const; void compile( compiled_file& f, compilation_context& c ) const; bool operator==( const sprite& that ) const; bool operator!=( const sprite& that ) const; bool operator<( const sprite& that ) const; private: /** \brief The name of the image resource to use. */ std::string m_image_name; /** \brief The name of the entry in the spritepos file. */ std::string m_spritepos_entry; /** \brief Y-coordinate. */ unsigned int m_top; /** \brief X-coordinate. */ unsigned int m_left; /** \brief Width in the source image. */ unsigned int m_clip_width; /** \brief Height in the source image. */ unsigned int m_clip_height; }; // class sprite } // namespace bf #endif // __BF_SPRITE_HPP__ plee-the-bear-20251226/bear-factory/bear-editor/src/bf/sprite_edit.hpp000066400000000000000000000056721512343254000253570ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief The window showing the properties of a sprite. * \author Sebastien Angibaud */ #ifndef __BF_SPRITE_EDIT_HPP__ #define __BF_SPRITE_EDIT_HPP__ #include "bf/base_edit.hpp" #include "bf/default_value.hpp" #include "bf/sprite.hpp" #include "bf/libeditor_export.hpp" #include #include #include namespace bf { class bitmap_rendering_attributes_edit; class sprite_view_ctrl; class workspace_environment; /** * \brief The window showing the properties of a sprite. * \author Sebastien Angibaud */ class BEAR_EDITOR_EXPORT sprite_edit: public wxPanel, public base_edit { public: /** \brief The identifiers of the controls. */ enum control_id { IDC_IMAGE_SELECT, IDC_RECTANGLE_CLIP_CHANGE, IDC_SPRITEPOS_CHOICE }; // enum control_id public: sprite_edit ( wxWindow& parent, workspace_environment& env, const sprite& spr = default_value::get() ); bool validate(); private: sprite make_sprite() const; void value_updated(); void fill_controls(); void create_controls(); void create_sizer_controls(); wxSizer* create_position_sizer(); wxSizer* create_image_name_sizer(); void fill_spritepos(); void read_spritepos_file( std::istream& f ); void control_sprite_size(); void check_sprite_pos(); void on_image_select(wxCommandEvent& event); void on_refresh(wxCommandEvent& event); void on_rectangle_clip_change( wxSpinEvent& event ); void on_select_sprite_pos( wxCommandEvent& event ); private: /** \brief A combo box with the rectangles from a .spritepos file. */ wxChoice* m_spritepos_combo; /** \brief The text control in which we configure the left of the sprite. */ wxSpinCtrl* m_left_text; /** \brief The text control in which we configure the top of the sprite. */ wxSpinCtrl* m_top_text; /** \brief The text control in which we configure the width of the sprite in the image source. */ wxSpinCtrl* m_clip_width_text; /** \brief The text control in which we configure the height of the sprite in the image source. */ wxSpinCtrl* m_clip_height_text; /** \brief The control in which we configure the rendering attributes. */ bitmap_rendering_attributes_edit* m_rendering_attributes; /** \brief The control in which we display the image name. */ wxTextCtrl* m_image_name_text; /** \brief The control in which we display the sprite. */ sprite_view_ctrl* m_sprite_view; /** \brief The image pool to use. */ workspace_environment& m_workspace; DECLARE_EVENT_TABLE() }; // class sprite_edit } // namespace bf #endif // __BF_SPRITE_EDIT_HPP__ plee-the-bear-20251226/bear-factory/bear-editor/src/bf/sprite_image_cache.hpp000066400000000000000000000046331512343254000266330ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A cache of resized or rotated sprites. * \author Julien Jorge */ #ifndef __BF_SPRITE_IMAGE_CACHE_HPP__ #define __BF_SPRITE_IMAGE_CACHE_HPP__ #include "bf/sprite.hpp" #include "bf/libeditor_export.hpp" #include #include namespace bf { class workspace_environment; /** * \brief A cache of resized or rotated sprites. * \author Julien Jorge */ class BEAR_EDITOR_EXPORT sprite_image_cache { private: /** * \brief The key of the sprite map. */ class key_type { public: key_type( const sprite& s, unsigned int w, unsigned int h ); bool operator<( const key_type& k ) const; const sprite& get_sprite() const; unsigned int get_width() const; unsigned int get_height() const; private: /** \brief The sprite. */ sprite m_sprite; /** \brief The width of the resulting image. */ unsigned int m_width; /** \brief The height of the resulting image. */ unsigned int m_height; /** \brief String representation of the string. */ std::string m_key_string; }; // class key_type /** * \brief The values stored in the cache. */ struct value_type { /** \brief The resulting image and the distance between the top left corner of the original image and the one of the rotated image. */ std::pair resulting_image; /** \brief Evaluation of the usefulness of this cache entry. */ int usage_count; }; // struct value_type public: explicit sprite_image_cache(workspace_environment& env); std::pair get_image( const sprite& s ); std::pair get_image ( const sprite& s, unsigned int w, unsigned int h ); void clear(); private: std::pair add_image( const key_type& k ); std::pair apply_effects( const key_type& k, wxBitmap bmp ) const; private: /** \brief The cache of images. */ std::map m_cache; /** \brief The workspace to use. */ workspace_environment& m_workspace; }; // class sprite_image_cache } // namespace bf #endif // __BF_SPRITE_IMAGE_CACHE_HPP__ plee-the-bear-20251226/bear-factory/bear-editor/src/bf/sprite_view.hpp000066400000000000000000000037461512343254000254040ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief This control displays a sprite. * \author Julien Jorge */ #ifndef __BF_SPRITE_VIEW_HPP__ #define __BF_SPRITE_VIEW_HPP__ #include #include "bf/sprite_image_cache.hpp" #include "bf/libeditor_export.hpp" namespace bf { /** * \brief This control displays a sprite. * \author Julien Jorge */ class BEAR_EDITOR_EXPORT sprite_view: public wxWindow { public: sprite_view ( wxWindow& parent, workspace_environment& env, wxWindowID id, const sprite& spr = sprite() ); void set_sprite( const sprite& spr ); void set_zoom( unsigned int z ); unsigned int get_zoom() const; void auto_zoom(); wxPoint get_view_position() const; wxSize get_view_size() const; void set_view_delta( int x, int y ); bool convert_position ( const wxPoint& mouse_position, wxPoint& position) const; private: void render(); void fill_background( wxDC& dc ) const; void draw_sprite( wxDC& dc ) const; void draw_box( wxDC& dc ) const; void make_sprite_image(); void on_size(wxSizeEvent& event); void on_paint(wxPaintEvent& event); private: /** \brief The pattern of the background. */ wxBitmap m_background_pattern; /** \brief The sprite displayed. */ sprite m_sprite; /** \brief The sprite scaled at the window's size. */ wxBitmap m_sprite_image; /** \brief The position of the sprite in the view. */ wxPoint m_sprite_position; /** \brief A delta applied to the sprite when rendering. */ wxPoint m_sprite_delta; /** \brief A cache of the sprites. */ sprite_image_cache m_image_cache; /** \brief The zoom ratio. */ unsigned int m_zoom; DECLARE_EVENT_TABLE() }; // class sprite_view } // namespace bf #endif // __BF_SPRITE_VIEW_HPP__ plee-the-bear-20251226/bear-factory/bear-editor/src/bf/sprite_view_ctrl.hpp000066400000000000000000000045241512343254000264230ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief This control displays a sprite and some buttons to adjust its size. * \author Julien Jorge */ #ifndef __BF_SPRITE_VIEW_CTRL_HPP__ #define __BF_SPRITE_VIEW_CTRL_HPP__ #include "bf/sprite.hpp" #include "bf/libeditor_export.hpp" #include #include #include #include namespace bf { class sprite_view; class workspace_environment; /** * \brief This control displays a sprite and some buttons to adjust its size. * \author Julien Jorge */ class BEAR_EDITOR_EXPORT sprite_view_ctrl: public wxPanel { public: /** \brief The identifiers of the controls. */ enum control_id { ID_ZOOM_100, ID_ZOOM_FIT, ID_ZOOM_IN, ID_ZOOM_OUT, ID_COMBO_ZOOM, ID_SPRITE_VIEW }; // enum control_id public: sprite_view_ctrl ( wxWindow& parent, workspace_environment& env, const sprite& spr = sprite() ); void set_sprite( const sprite& spr ); private: void create_controls(); void create_sizers(); void set_zoom_from_combo(); void adjust_scrollbars(); void on_zoom_100( wxCommandEvent& event ); void on_zoom_fit( wxCommandEvent& event ); void on_zoom_in( wxCommandEvent& event ); void on_zoom_out( wxCommandEvent& event ); void on_zoom_selection( wxCommandEvent& event ); void on_scroll(wxScrollEvent& event); void on_size(wxSizeEvent& event); void on_mouse_move(wxMouseEvent& event); private: /** \brief The control that displays the sprite. */ sprite_view* m_sprite_view; /** \brief The combo box with the zoom ratio. */ wxComboBox* m_combo_zoom; /** \brief Horizontal scrollbar to scroll the sprite. */ wxScrollBar* m_h_scrollbar; /** \brief Vertical scrollbar to scroll the sprite. */ wxScrollBar* m_v_scrollbar; /** \brief A static text for mouse position. */ wxStaticText* m_mouse_position; /** \brief The workspace environment to use. */ workspace_environment& m_workspace; DECLARE_EVENT_TABLE() }; // class sprite_view_ctrl } // namespace bf #endif // __BF_SPRITE_VIEW_CTRL_HPP__ plee-the-bear-20251226/bear-factory/bear-editor/src/bf/stream_conv.hpp000066400000000000000000000054261512343254000253610ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Conversion between a value and a text in a stream. * \author Julien Jorge */ #ifndef __BF_STREAM_CONV_HPP__ #define __BF_STREAM_CONV_HPP__ #include "bf/color.hpp" #include "bf/custom_type.hpp" #include "bf/libeditor_export.hpp" #include namespace bf { /** * \brief Conversion between a value and a text in a stream. Not defined for * types that are not based on custom_type. * \author Julien Jorge */ template class stream_conv { public: typedef Type value_type; public: static std::istream& read( std::istream& is, value_type& v ); }; // class stream_conv /** * \brief Conversion between a value and a text in a stream. Specialisation * for string_type. * \author Julien Jorge */ template<> class BEAR_EDITOR_EXPORT stream_conv { public: typedef string_type value_type; public: static std::istream& read( std::istream& is, value_type& v ); }; // class stream_conv [string_type] /** * \brief Conversion between a value and a text in a stream. Specialisation * for custom_type. * \author Julien Jorge */ template<> class BEAR_EDITOR_EXPORT stream_conv< custom_type > { public: typedef custom_type value_type; public: static std::istream& read( std::istream& is, value_type& v ); }; // class stream_conv [custom_type] /** * \brief Conversion between a value and a text in a stream. Specialisation * for custom_type. * \author Sébastien Angibaud */ template<> class BEAR_EDITOR_EXPORT stream_conv< color > { public: typedef color value_type; public: static std::istream& read( std::istream& is, value_type& v ); }; // class stream_conv [custom_type] /** * \brief Conversion between a value and a text in a stream. Specialisation * for others custom types. * \author Julien Jorge */ template class stream_conv< custom_type > { public: typedef custom_type value_type; public: static std::istream& read( std::istream& is, value_type& v ); }; // class stream_conv [custom_type] /** * \brief Conversion between a value and a text in a stream. Specialisation * for item_reference_type. * \author Julien Jorge */ template<> class BEAR_EDITOR_EXPORT stream_conv: public stream_conv< custom_type > { }; // class stream_conv [item_reference_type] } // namespace bf #include "bf/impl/stream_conv.tpp" #endif // __BF_STREAM_CONV_HPP__ plee-the-bear-20251226/bear-factory/bear-editor/src/bf/tree_builder.hpp000066400000000000000000000022151512343254000254770ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A class to help building trees (wxTreeCtrl). * \author Julien Jorge */ #ifndef __BF_TREE_BUILDER_HPP__ #define __BF_TREE_BUILDER_HPP__ #include "bf/libeditor_export.hpp" #include #include #include namespace bf { /** * \brief A class to help building trees (wxTreeCtrl). * \author Julien Jorge */ class BEAR_EDITOR_EXPORT tree_builder { private: typedef claw::tree tree_type; public: void add_entries( const std::string& entries, char sep ); void create_wxTree( wxTreeCtrl& result ) const; private: void create_wxTree ( wxTreeCtrl& result, wxTreeItemId parent, const tree_type& t ) const; void insert_entries( tree_type& node, std::list& entries ) const; private: /** \brief the tree currently built. */ tree_type m_tree; }; // class tree_builder } // namespace bf #endif // __BF_TREE_BUILDER_HPP__ plee-the-bear-20251226/bear-factory/bear-editor/src/bf/trinary_logic.hpp000066400000000000000000000024331512343254000257010ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A class to represent a boolean that can be calculated by random. * \author Sebastien Angibaud */ #ifndef __BF_TRINARY_LOGIC_HPP__ #define __BF_TRINARY_LOGIC_HPP__ #include namespace bf { /** * \brief A class to represent a boolean that can be calculated by random. * \author Sebastien Angibaud */ struct trinary_logic { public: /** \brief The type of the codes for the actions. */ typedef unsigned int value_type; public: static std::string to_string(value_type value); static value_type from_string(const std::string& str); static bool to_bool(value_type value); static value_type from_bool(bool value); static bool to_random_bool(value_type value); public: /** \brief Boolean true. */ static const value_type boolean_false = 0; /** \brief Boolean false. */ static const value_type boolean_true = boolean_false + 1; /** \brief Boolean random. */ static const value_type boolean_random = boolean_true + 1; }; // struct trinary_logic } // namespace bf #endif // __BF_TRINARY_LOGIC_HPP__ plee-the-bear-20251226/bear-factory/bear-editor/src/bf/type_field.hpp000066400000000000000000000055321512343254000251630ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Base class for the fields of an item class. * \author Julien Jorge */ #ifndef __BF_TYPE_FIELD_HPP__ #define __BF_TYPE_FIELD_HPP__ #include "bf/libeditor_export.hpp" #include #include #include namespace bf { /** * \brief Base class for the fields of an item class. * \author Julien Jorge */ class BEAR_EDITOR_EXPORT type_field { public: /** \brief The type of the field. */ enum field_type { integer_field_type, u_integer_field_type, real_field_type, string_field_type, boolean_field_type, sprite_field_type, animation_field_type, item_reference_field_type, font_field_type, sample_field_type, color_field_type, easing_field_type }; // enum field_type /** \brief The type of the range of valid values. */ enum range_type { field_range_free, field_range_set, field_range_interval }; // range_type public: type_field( const std::string& name, field_type ft ); virtual ~type_field(); virtual type_field* clone() const; const std::string& get_name() const; field_type get_field_type() const; virtual range_type get_range_type() const; virtual void get_set( std::list& values ) const; virtual void get_interval( int& min, int& max ) const; virtual void get_interval( unsigned int& min, unsigned int& max ) const; virtual void get_interval( double& min, double& max ) const; const std::set& get_preceding() const; void set_preceding( const std::list& prec ); void set_required( bool r ); bool get_required() const; void set_description( const std::string& str ); const std::string& get_description() const; void set_default_value( const std::string& str ); const std::string& get_default_value() const; void set_is_list( bool v ); bool is_list() const; private: /** \brief The name of the field. */ const std::string m_name; /** \brief The type of the field. */ const field_type m_field_type; /** \brief The names of the fields that must be defined before this one. */ std::set m_preceding; /** \brief Tell if this field must be filled. */ bool m_required; /** \brief Tell if the field is a list of values. */ bool m_is_list; /** \brief A description of the field. */ std::string m_description; /** \brief A string representation of the default value of the field. */ std::string m_default_value; }; // class type_field } // namespace bf #endif // __BF_TYPE_FIELD_HPP__ plee-the-bear-20251226/bear-factory/bear-editor/src/bf/type_field_interval.hpp000066400000000000000000000020731512343254000270640ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A field taking its value in an interval. * \author Julien Jorge */ #ifndef __BF_TYPE_FIELD_INTERVAL_HPP__ #define __BF_TYPE_FIELD_INTERVAL_HPP__ #include "bf/type_field.hpp" namespace bf { /** * \brief A field taking its value in an interval. * \author Julien Jorge */ template class type_field_interval: public type_field { public: type_field_interval( const std::string& name, T min, T max ); virtual type_field* clone() const; virtual range_type get_range_type() const; virtual void get_interval( T& min, T& max ) const; private: /** \brief The minimum valid value. */ const T m_min; /** \brief The maximum valid value. */ const T m_max; }; // class type_field_interval } // namespace bf #include "bf/impl/type_field_interval.tpp" #endif // __BF_TYPE_FIELD_INTERVAL_HPP__ plee-the-bear-20251226/bear-factory/bear-editor/src/bf/type_field_set.hpp000066400000000000000000000020501512343254000260260ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A field taking its value from a set. * \author Julien Jorge */ #ifndef __BF_TYPE_FIELD_SET_HPP__ #define __BF_TYPE_FIELD_SET_HPP__ #include "bf/type_field.hpp" #include "bf/libeditor_export.hpp" namespace bf { /** * \brief A field taking its value from a set. * \author Julien Jorge */ class BEAR_EDITOR_EXPORT type_field_set: public type_field { public: type_field_set( const std::string& name, field_type ft, const std::list& values ); virtual type_field* clone() const; virtual range_type get_range_type() const; virtual void get_set( std::list& values ) const; private: /** \brief The values this field can take. */ std::list m_values; }; // class type_field_set } // namespace bf #endif // __BF_TYPE_FIELD_SET_HPP__ plee-the-bear-20251226/bear-factory/bear-editor/src/bf/types.hpp000066400000000000000000000015621512343254000242020ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief The various types used in the engine. * \author Julien Jorge */ #ifndef __BF_TYPES_HPP__ #define __BF_TYPES_HPP__ #include #include namespace bf { /** \brief The type of the coordinates. */ typedef double coordinate_type; /** \brief The type of a point. */ typedef claw::math::coordinate_2d position_type; /** \brief The type of the dimensions of a box. */ typedef claw::math::coordinate_2d size_box_type; /** \brief The type of the rectangles. */ typedef claw::math::box_2d rectangle_type; } // namespace bf #endif // __BF_TYPES_HPP__ plee-the-bear-20251226/bear-factory/bear-editor/src/bf/value_editor_dialog.hpp000066400000000000000000000073641512343254000270450ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A dialog that displays the controls for editing a given type of value. * \author Julien Jorge */ #ifndef __BF_VALUE_EDITOR_DIALOG_HPP__ #define __BF_VALUE_EDITOR_DIALOG_HPP__ #include #include #include #include namespace bf { /** * \brief A dialog that displays the controls for editing a given type of * value. * \author Julien Jorge */ template class value_editor_dialog: public wxDialog { public: /** The type of the current class. */ typedef value_editor_dialog self_type; /** \brief The type of the editor. */ typedef Editor editor_type; /** \brief The type of the edited value. */ typedef Type value_type; public: value_editor_dialog ( wxWindow& parent, const wxString& title, const value_type& v ); value_editor_dialog ( wxWindow& parent, const wxString& title, const value_type& v, workspace_environment& env ); value_editor_dialog ( wxWindow& parent, const wxString& title, const wxArrayString& values, const value_type& v ); value_editor_dialog ( wxWindow& parent, const wxString& title, const value_type& min, const value_type& max, const value_type& v ); const value_type& get_value() const; void set_value( const value_type& v ); editor_type& get_editor(); private: void init(); void create_sizers(); void on_ok(wxCommandEvent& event); private: /** \brief The control used for editing the value. */ editor_type* m_editor; /** \brief The effective value */ value_type m_value; }; // class value_editor_dialog /** * \brief Specialisation of value_editor_dialog for lists of values. * \author Julien Jorge */ template class value_editor_dialog< Editor, std::list >: public wxDialog { public: /** The type of the current class. */ typedef value_editor_dialog< Editor, std::list > self_type; /** \brief The type of dialog displayed for editing the values. */ typedef value_editor_dialog dialog_type; /** \brief The type of the edited value. */ typedef std::list value_type; public: value_editor_dialog ( wxWindow& parent, const wxString& type, const value_type& v ); value_editor_dialog ( wxWindow& parent, const wxString& type, const value_type& v, workspace_environment& env ); value_editor_dialog ( wxWindow& parent, const wxString& type, const wxArrayString& values, const value_type& v ); value_editor_dialog ( wxWindow& parent, const wxString& type, const T& min, const T& max, const value_type& v ); const value_type& get_value() const; void set_value( const value_type& v ); private: void init(); void create_controls(); void create_sizers(); void fill(); void edit_value( unsigned int index ); void on_up( wxCommandEvent& event ); void on_down( wxCommandEvent& event ); void on_new( wxCommandEvent& event ); void on_edit( wxCommandEvent& event ); void on_delete( wxCommandEvent& event ); private: /** \brief The dialog displayed when editing the value. */ dialog_type* m_dialog; /** \brief The control that displays the list of values. */ wxListBox* m_list; /** \brief The effective value */ value_type m_value; }; // class value_editor_dialog } // namespace bf #include "bf/impl/value_editor_dialog.tpp" #endif // __BF_VALUE_EDITOR_DIALOG_HPP__ plee-the-bear-20251226/bear-factory/bear-editor/src/bf/version.hpp000066400000000000000000000012161512343254000245170ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Version of the editor. * \author Julien Jorge */ #ifndef __BF_VERSION_HPP__ #define __BF_VERSION_HPP__ #define BF_TO_STR_BIS(v) # v #define BF_TO_STR(v) BF_TO_STR_BIS(v) #define BF_MAJOR_VERSION 0 #define BF_MINOR_VERSION 10 #define BF_RELEASE_NUMBER 0 #define BF_VERSION_STRING "Bear Factory, " BF_TO_STR(BF_MAJOR_VERSION) "." \ BF_TO_STR(BF_MINOR_VERSION) "." BF_TO_STR(BF_RELEASE_NUMBER) #endif // __BF_VERSION_HPP__ plee-the-bear-20251226/bear-factory/bear-editor/src/bf/workspace.hpp000066400000000000000000000033671512343254000250410ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A workspace. * \author Sebastien Angibaud */ #ifndef __BF_WORKSPACE_HPP__ #define __BF_WORKSPACE_HPP__ #include #include #include "bf/libeditor_export.hpp" namespace bf { /** * \brief A workspace. * \author Sebastien Angibaud */ class BEAR_EDITOR_EXPORT workspace { public: typedef std::list path_list; typedef path_list::const_iterator path_list_const_iterator; typedef path_list::const_reverse_iterator path_list_const_reverse_iterator; public: workspace(); void set_run_path(const std::string& path); std::string get_run_path() const; void add_item_class_path( const std::string& path ); void clear_item_class_path(); void add_data_path( const std::string& path ); void clear_data_path(); void clear(); const path_list& get_item_class_path() const; path_list_const_iterator item_class_begin() const; path_list_const_iterator item_class_end() const; path_list_const_iterator data_begin() const; path_list_const_iterator data_end() const; path_list_const_reverse_iterator data_rbegin() const; path_list_const_reverse_iterator data_rend() const; private: /** \brief Path to the directory containing the XML files for item classes. */ path_list m_item_class_path; /** \brief Path to the data directory of the game. */ path_list m_data_path; /** \brier The path of the run configuration. */ std::string m_run_path; }; // class workspace } // namespace bf #endif // __BF_WORKSPACE_HPP__ plee-the-bear-20251226/bear-factory/bear-editor/src/bf/workspace_environment.hpp000066400000000000000000000025031512343254000274540ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief An workspace environment. * \author Sebastien Angibaud */ #ifndef __BF_WORKSPACE_ENVIRONMENT_HPP__ #define __BF_WORKSPACE_ENVIRONMENT_HPP__ #include "bf/image_pool.hpp" #include "bf/item_class_pool.hpp" #include #include namespace bf { /** * \brief A workspace environment. * * \author Sebastien Angibaud */ class workspace_environment { private: typedef claw::memory::smart_ptr image_pool_ptr; typedef claw::memory::smart_ptr item_class_pool_ptr; public: workspace_environment(); explicit workspace_environment( const std::string& n ); const std::string& get_name() const; const image_pool& get_image_pool() const; const item_class_pool& get_item_class_pool() const; private: /** \brief The name of the workspace. */ std::string m_name; /** \brief The image pool. */ image_pool_ptr m_image_pool; /** \brief The item class pool. */ item_class_pool_ptr m_item_class_pool; }; // workspace_environment } // namespace bf #endif // __BF_WORKSPACE_ENVIRONMENT_HPP__ plee-the-bear-20251226/bear-factory/bear-editor/src/bf/wx_facilities.hpp000066400000000000000000000042231512343254000256650ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Some facilities for using the wxWidget library with other libraries * (namely standard library). * \author Julien Jorge */ #ifndef __BF_WX_FACILITIES_HPP__ #define __BF_WX_FACILITIES_HPP__ #include #include #include #include namespace bf { /** * \brief Create a std::string from a wxString. * \param str The reference string. */ inline std::string wx_to_std_string( const wxString& str ) { return std::string( str.To8BitData() ); } // wx_to_std_string() /** * \brief Create a std::string from a wxString. * \param str The reference string. */ inline wxString std_to_wx_string( const std::string& str ) { return wxString::From8BitData( str.c_str() ); } // std_to_wx_string() /** * \brief Append a menu item with an icon. * \param menu The menu in which the item is added. * \param id The identifier of the menu entry. * \param label The string to appear on the menu item. * \param help An help string associated with the item. * \param icon An icon displayed next to the item. */ inline void wx_menu_append_item ( wxMenu* menu, int id, const wxString& label, const wxString& help, const wxBitmap& icon = wxBitmap() ) { wxMenuItem* item = new wxMenuItem(menu, id, label, help); item->SetBitmap(icon); menu->Append(item); } // wx_menu_append_item() /** * \brief Create a wxBitmapButton. * \param parent The owner of the button. * \param id The identifier of the button. * \param bmp The bitmap displayed in the button. * \param tip The message displayed in the tool tip. */ inline wxBitmapButton* wx_new_bitmap_button ( wxWindow* parent, int id, const wxBitmap& bmp, const wxString& tip ) { wxBitmapButton* result = new wxBitmapButton(parent, id, bmp); result->SetToolTip(tip); return result; } // wx_new_bitmap_button() } // namespace bf #endif // __BF_WX_FACILITIES_HPP__ plee-the-bear-20251226/bear-factory/bear-editor/src/bf/wx_type_cast.hpp000066400000000000000000000012361512343254000255450ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Utility functions to cast from and to wx widgets. * \author Julien Jorge */ #ifndef __BF_WX_TYPE_CAST_HPP__ #define __BF_WX_TYPE_CAST_HPP__ #include "bf/types.hpp" #include namespace bf { position_type wx_to_position( wxPoint p ); wxPoint position_to_wx( position_type p ); rectangle_type wx_to_rectangle( wxRect r ); wxRect rectangle_to_wx( rectangle_type r ); } // namespace bf #endif // __BF_WX_TYPE_CAST_HPP__ plee-the-bear-20251226/bear-factory/bear-editor/src/bf/xml/000077500000000000000000000000001512343254000231215ustar00rootroot00000000000000plee-the-bear-20251226/bear-factory/bear-editor/src/bf/xml/code/000077500000000000000000000000001512343254000240335ustar00rootroot00000000000000plee-the-bear-20251226/bear-factory/bear-editor/src/bf/xml/code/exception.cpp000066400000000000000000000071301512343254000265360ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bf::xml exceptions classes. */ #include "bf/xml/exception.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param node_name The name of the unexpected node. */ bf::xml::bad_node::bad_node( const std::string& node_name ) : m_msg( "Unexpected node name '" + node_name + "'") { } // bad_node::bad_node() /*----------------------------------------------------------------------------*/ /** * \brief Destructor. */ bf::xml::bad_node::~bad_node() throw() { } // bad_node::bad_node() /*----------------------------------------------------------------------------*/ /** * \brief Get an explanation of the problem. */ const char* bf::xml::bad_node::what() const throw() { return m_msg.c_str(); } // bad_node::what() /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param node_name The name of the needed node. */ bf::xml::missing_node::missing_node( const std::string& node_name ) : m_msg( "Missing node '" + node_name + "'") { } // missing_node::missing_node() /*----------------------------------------------------------------------------*/ /** * \brief Destructor. */ bf::xml::missing_node::~missing_node() throw() { } // missing_node::missing_node() /*----------------------------------------------------------------------------*/ /** * \brief Get an explanation of the problem. */ const char* bf::xml::missing_node::what() const throw() { return m_msg.c_str(); } // missing_node::what() /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param property_name The name of the needed property. */ bf::xml::missing_property::missing_property ( const std::string& property_name ) : m_msg( "Missing property '" + property_name + "'") { } // missing_property::missing_property() /*----------------------------------------------------------------------------*/ /** * \brief Destructor. */ bf::xml::missing_property::~missing_property() throw() { } // missing_property::missing_property() /*----------------------------------------------------------------------------*/ /** * \brief Get an explanation of the problem. */ const char* bf::xml::missing_property::what() const throw() { return m_msg.c_str(); } // missing_property::what() /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param value The problematic value. */ bf::xml::bad_value::bad_value( const std::string& value ) : m_msg( "Invalid value '" + value + "'") { } // bad_value::bad_value() /*----------------------------------------------------------------------------*/ /** * \brief Constructor. * \param type The expected type. * \param value The problematic value. */ bf::xml::bad_value::bad_value ( const std::string& type, const std::string& value ) : m_msg( "Invalid value '" + value + "' (" + type + ")" ) { } // bad_value::bad_value() /*----------------------------------------------------------------------------*/ /** * \brief Destructor. */ bf::xml::bad_value::~bad_value() throw() { } // bad_value::bad_value() /*----------------------------------------------------------------------------*/ /** * \brief Get an explanation of the problem. */ const char* bf::xml::bad_value::what() const throw() { return m_msg.c_str(); } // bad_value::what() plee-the-bear-20251226/bear-factory/bear-editor/src/bf/xml/code/item_class_inherit_node.cpp000066400000000000000000000042051512343254000314120ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bf::xml::item_class_inherit_node class. * \author Julien Jorge */ #include "bf/xml/item_class_inherit_node.hpp" #include "bf/item_class.hpp" #include "bf/item_class_pool.hpp" #include "bf/wx_facilities.hpp" #include "bf/xml/reader_tool.hpp" #include #include /*----------------------------------------------------------------------------*/ /** * \brief Read an xml node "inherit". * \param pool The pool of item classes in which we take the parent classes. * \param item (out) The item class for we read the hierarchy. * \param node The node. */ void bf::xml::item_class_inherit_node::read ( const item_class_pool& pool, item_class& item, const wxXmlNode* node ) const { CLAW_PRECOND( node!=NULL ); CLAW_PRECOND( node->GetName() == wxT("inherit") ); node = reader_tool::skip_comments(node->GetChildren()); while ( node!=NULL ) { if ( node->GetName() == wxT("class") ) item.add_super_class ( pool.get_item_class_ptr(wx_to_std_string(node->GetNodeContent())) ); else claw::logger << claw::log_warning << "Ignored node '" << wx_to_std_string(node->GetName()) << "'" << std::endl; node = reader_tool::skip_comments(node->GetNext()); } } // item_class_inherit_node::read() /*----------------------------------------------------------------------------*/ /** * \brief Write an xml node "inherit". * \param item The item class to write. * \param os The stream in which we write. */ void bf::xml::item_class_inherit_node::write ( const item_class& item, std::ostream& os ) const { item_class::const_super_class_iterator it; const item_class::const_super_class_iterator eit( item.super_class_end() ); os << "\n"; for ( it=item.super_class_begin(); it!=eit; ++it) os << "" << it->get_class_name() << "\n"; os << "\n"; } // item_class_inherit_node::write() plee-the-bear-20251226/bear-factory/bear-editor/src/bf/xml/code/item_instance_field_node.cpp000066400000000000000000000357351512343254000315460ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bf::xml::item_instance_field_node class. * \author Julien Jorge */ #include "bf/xml/item_instance_field_node.hpp" #include "bf/human_readable.hpp" #include "bf/item_class.hpp" #include "bf/item_instance.hpp" #include "bf/xml/reader_tool.hpp" #include "bf/xml/value_to_xml.hpp" #include "bf/xml/xml_to_value.hpp" #include "bf/wx_facilities.hpp" #include #include /*----------------------------------------------------------------------------*/ /** * \brief Constructs a node parser. * \param env The workspace environment used. */ bf::xml::item_instance_field_node::item_instance_field_node ( workspace_environment& env ) : m_workspace( env ) { } // item_instance_field_node::item_instance_field_node() /*----------------------------------------------------------------------------*/ /** * \brief Read an xml node "field". * \param item (out) The item class for we read the hierarchy. * \param node The node. */ void bf::xml::item_instance_field_node::read ( item_instance& item, const wxXmlNode* node ) const { CLAW_PRECOND( node!=NULL ); CLAW_PRECOND( node->GetName() == wxT("field") ); const std::string field_name( reader_tool::read_string(node, wxT("name")) ); const item_class& the_class(item.get_class()); if ( !the_class.has_field(field_name) ) claw::logger << claw::log_warning << "Unknown field '" << field_name << "' in '" << the_class.get_class_name() << "'" << std::endl; else { const type_field& field = the_class.get_field(field_name); load_field( item, field, node->GetChildren() ); } } // item_instance_field_node::read() /*----------------------------------------------------------------------------*/ /** * \brief Write an xml node "field". * \param item The item instance to write. * \param f The field to save. * \param os The stream in which we write. */ void bf::xml::item_instance_field_node::write ( const item_instance& item, const type_field& f, std::ostream& os ) const { os << "\n"; save_field( item, f, os ); os << "\n"; } // item_instance_field_node::write() /*----------------------------------------------------------------------------*/ /** * \brief Load the value of a field. * \param item The item in which we set the field. * \param f The field to load. * \param node The node to parse. */ void bf::xml::item_instance_field_node::load_field ( item_instance& item, const type_field& f, const wxXmlNode* node ) const { if ( f.is_list() ) switch ( f.get_field_type() ) { case type_field::integer_field_type: load_value_list( item, f.get_name(), node ); break; case type_field::u_integer_field_type: load_value_list( item, f.get_name(), node ); break; case type_field::real_field_type: load_value_list( item, f.get_name(), node ); break; case type_field::boolean_field_type: load_value_list( item, f.get_name(), node ); break; case type_field::string_field_type: load_value_list( item, f.get_name(), node ); break; case type_field::sprite_field_type: load_value_list( item, f.get_name(), node ); break; case type_field::animation_field_type: load_value_list( item, f.get_name(), node ); break; case type_field::item_reference_field_type: load_value_list( item, f.get_name(), node ); break; case type_field::font_field_type: load_value_list( item, f.get_name(), node ); break; case type_field::sample_field_type: load_value_list( item, f.get_name(), node ); break; case type_field::color_field_type: load_value_list( item, f.get_name(), node ); break; case type_field::easing_field_type: load_value_list( item, f.get_name(), node ); break; } else switch ( f.get_field_type() ) { case type_field::integer_field_type: load_value( item, f.get_name(), node ); break; case type_field::u_integer_field_type: load_value( item, f.get_name(), node ); break; case type_field::real_field_type: load_value( item, f.get_name(), node ); break; case type_field::boolean_field_type: load_value( item, f.get_name(), node ); break; case type_field::string_field_type: load_value( item, f.get_name(), node ); break; case type_field::sprite_field_type: load_value( item, f.get_name(), node ); break; case type_field::animation_field_type: load_value( item, f.get_name(), node ); break; case type_field::item_reference_field_type: load_value( item, f.get_name(), node ); break; case type_field::font_field_type: load_value( item, f.get_name(), node ); break; case type_field::sample_field_type: load_value( item, f.get_name(), node ); break; case type_field::color_field_type: load_value( item, f.get_name(), node ); break; case type_field::easing_field_type: load_value( item, f.get_name(), node ); break; } } // item_instance_field_node::load_field() /*----------------------------------------------------------------------------*/ /** * \brief Save the value of a field. * \param item The item in which we take the field. * \param f The field to save. * \param os The stream in which we write. */ void bf::xml::item_instance_field_node::save_field ( const item_instance& item, const type_field& f, std::ostream& os ) const { if ( f.is_list() ) switch ( f.get_field_type() ) { case type_field::integer_field_type: save_value_list( os, f.get_name(), item, "integer" ); break; case type_field::u_integer_field_type: save_value_list( os, f.get_name(), item, "u_integer" ); break; case type_field::real_field_type: save_value_list( os, f.get_name(), item, "real" ); break; case type_field::boolean_field_type: save_value_list( os, f.get_name(), item, "bool" ); break; case type_field::string_field_type: save_value_list( os, f.get_name(), item, "string" ); break; case type_field::sprite_field_type: save_value_list( os, f.get_name(), item ); break; case type_field::animation_field_type: save_value_list( os, f.get_name(), item ); break; case type_field::item_reference_field_type: save_value_list ( os, f.get_name(), item, "item_reference" ); break; case type_field::font_field_type: save_value_list( os, f.get_name(), item ); break; case type_field::sample_field_type: save_value_list( os, f.get_name(), item ); break; case type_field::color_field_type: save_value_list( os, f.get_name(), item ); break; case type_field::easing_field_type: save_value_list( os, f.get_name(), item ); break; } else switch ( f.get_field_type() ) { case type_field::integer_field_type: save_value( os, f.get_name(), item, "integer" ); break; case type_field::u_integer_field_type: save_value( os, f.get_name(), item, "u_integer" ); break; case type_field::real_field_type: save_value( os, f.get_name(), item, "real" ); break; case type_field::boolean_field_type: save_value( os, f.get_name(), item, "bool" ); break; case type_field::string_field_type: save_value( os, f.get_name(), item, "string" ); break; case type_field::sprite_field_type: save_value( os, f.get_name(), item ); break; case type_field::animation_field_type: save_value( os, f.get_name(), item ); break; case type_field::item_reference_field_type: save_value ( os, f.get_name(), item, "item_reference" ); break; case type_field::font_field_type: save_value( os, f.get_name(), item ); break; case type_field::sample_field_type: save_value( os, f.get_name(), item ); break; case type_field::color_field_type: save_value( os, f.get_name(), item ); break; case type_field::easing_field_type: save_value( os, f.get_name(), item ); break; } } // item_instance_field_node::save_field() /*----------------------------------------------------------------------------*/ /** * \brief Load the value of a field of simple type. * \param item The item in which we save the value. * \param field_name The name of the field to load. * \param node The node to parse. */ template void bf::xml::item_instance_field_node::load_value ( item_instance& item, const std::string& field_name, const wxXmlNode* node ) const { node = reader_tool::skip_comments(node); if ( node == NULL ) throw xml::missing_node( "Content for field '" + field_name + '\'' ); Type v( load_value_from_xml( node ) ); if ( wx_to_std_string( human_readable::convert(v) ) != item.get_class().get_default_value(field_name) ) item.set_value( field_name, v ); } // item_instance_field_node::load_value() /*----------------------------------------------------------------------------*/ /** * \brief Load the value of a field of type list of simple type. * \param item The item in which we save the value. * \param field_name The name of the field to load. * \param node The node to parse. */ template void bf::xml::item_instance_field_node::load_value_list ( item_instance& item, const std::string& field_name, const wxXmlNode* node ) const { std::list v; node = reader_tool::skip_comments(node); while ( node!=NULL ) { v.push_back( load_value_from_xml(node) ); node = reader_tool::skip_comments(node->GetNext()); } item.set_value( field_name, v ); } // item_instance_field_node::load_value_list() /*----------------------------------------------------------------------------*/ /** * \brief Loads the object described by a given XML node. * \param node The node to read */ template Type bf::xml::item_instance_field_node::load_value_from_xml ( const wxXmlNode* node ) const { xml::xml_to_value xml_conv; Type result; xml_conv( result, node ); return result; } // item_instance_field_node::load_value_from_xml() namespace bf { namespace xml { /*------------------------------------------------------------------------*/ /** * \brief Loads a sprite described by a given XML node. * \param node The node to read */ template<> sprite item_instance_field_node::load_value_from_xml ( const wxXmlNode* node ) const { xml_to_value xml_conv; sprite result; xml_conv( result, node, m_workspace ); return result; } // item_instance_field_node::load_value_from_xml() /*------------------------------------------------------------------------*/ /** * \brief Loads the animation described by a given XML node. * \param node The node to read */ template<> any_animation item_instance_field_node::load_value_from_xml ( const wxXmlNode* node ) const { xml_to_value xml_conv; any_animation result; xml_conv( result, node, m_workspace ); return result; } // item_instance_field_node::load_value_from_xml() } // namspace xml } // namespace bf /*----------------------------------------------------------------------------*/ /** * \brief Save the value of a field of a special type. * \param os The stream in which we save the value. * \param field_name The name of the field to save. * \param item The item in which we take the value. */ template void bf::xml::item_instance_field_node::save_value ( std::ostream& os, const std::string& field_name, const item_instance& item ) const { T v; item.get_value( field_name, v ); xml::value_to_xml::write(os, v); } // item_instance_field_node::save_value() /*----------------------------------------------------------------------------*/ /** * \brief Save the value of a field of simple type. * \param os The stream in which we save the value. * \param field_name The name of the field to save. * \param item The item in which we take the value. * \param node_name The name of the xml node. */ template void bf::xml::item_instance_field_node::save_value ( std::ostream& os, const std::string& field_name, const item_instance& item, const std::string& node_name ) const { Type v; item.get_value( field_name, v ); xml::value_to_xml::write( os, node_name, v ); } // item_instance_field_node::save_value() /*----------------------------------------------------------------------------*/ /** * \brief Save the value of a field of type list of values. * \param os The stream in which we save the value. * \param field_name The name of the field to save. * \param item The item in which we take the value. */ template void bf::xml::item_instance_field_node::save_value_list ( std::ostream& os, const std::string& field_name, const item_instance& item ) const { std::list s; typename std::list::const_iterator it; item.get_value( field_name, s ); for (it=s.begin(); it!=s.end(); ++it) xml::value_to_xml::write(os, *it); } // item_instance_field_node::save_value_list() /*----------------------------------------------------------------------------*/ /** * \brief Save the value of a field of list of simple type. * \param os The stream in which we save the value. * \param field_name The name of the field to save. * \param item The item in which we take the value. * \param node_name The name of the xml node. */ template void bf::xml::item_instance_field_node::save_value_list ( std::ostream& os, const std::string& field_name, const item_instance& item, const std::string& node_name ) const { std::list v; typename std::list::const_iterator it; item.get_value( field_name, v ); for (it=v.begin(); it!=v.end(); ++it) xml::value_to_xml::write( os, node_name, *it ); } // item_instance_field_node::save_value_list() plee-the-bear-20251226/bear-factory/bear-editor/src/bf/xml/code/item_instance_fields_node.cpp000066400000000000000000000062131512343254000317160ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bf::xml::item_instance_fields_node class. * \author Julien Jorge */ #include "bf/xml/item_instance_fields_node.hpp" #include "bf/item_class.hpp" #include "bf/item_instance.hpp" #include "bf/wx_facilities.hpp" #include "bf/xml/item_instance_field_node.hpp" #include "bf/xml/reader_tool.hpp" #include #include /*----------------------------------------------------------------------------*/ /** * \brief Constructs a node parser. * \param env The workspace environment used. */ bf::xml::item_instance_fields_node::item_instance_fields_node ( workspace_environment& env ) : m_workspace( env ) { } // item_instance_fields_node::item_instance_fields_node() /*----------------------------------------------------------------------------*/ /** * \brief Read an xml node "fields". * \param item (out) The item class for we read the hierarchy. * \param node The node. */ void bf::xml::item_instance_fields_node::read ( item_instance& item, const wxXmlNode* node ) const { CLAW_PRECOND( node!=NULL ); CLAW_PRECOND( node->GetName() == wxT("fields") ); item_instance_field_node field_node( m_workspace ); node = reader_tool::skip_comments(node->GetChildren()); while ( node!=NULL ) { if ( node->GetName() == wxT("field") ) field_node.read(item, node); else claw::logger << claw::log_warning << "Ignored node '" << wx_to_std_string(node->GetName()) << "'" << std::endl; node = reader_tool::skip_comments(node->GetNext()); } } // item_instance_fields_node::read() /*----------------------------------------------------------------------------*/ /** * \brief Write an xml node "fields". * \param item The item instance to write. * \param os The stream in which we write. */ void bf::xml::item_instance_fields_node::write ( const item_instance& item, std::ostream& os ) const { os << "\n"; save_item_by_class( item, item.get_class(), os ); os << "\n"; } // item_instance_fields_node::write() /*----------------------------------------------------------------------------*/ /** * \brief Save the fields of an item by exploring its parent classes. * \param item The item to save. * \param the_class The super class of \a item for which we save the fields. * \param os The stream in which we write. */ void bf::xml::item_instance_fields_node::save_item_by_class ( const item_instance& item, const item_class& the_class, std::ostream& os ) const { item_class::const_super_class_iterator itc; for ( itc=the_class.super_class_begin(); itc!=the_class.super_class_end(); ++itc ) save_item_by_class(item, *itc, os); item_class::field_iterator it; xml::item_instance_field_node field_node( m_workspace ); for ( it=the_class.field_begin(); it!=the_class.field_end(); ++it ) if ( item.has_value(*it) ) field_node.write( item, *it, os ); } // item_instance_field_node::save_item_by_class() plee-the-bear-20251226/bear-factory/bear-editor/src/bf/xml/code/item_instance_node.cpp000066400000000000000000000072321512343254000303720ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bf::xml::item_instance_node class. * \author Julien Jorge */ #include "bf/xml/item_instance_node.hpp" #include "bf/item_class_pool.hpp" #include "bf/item_instance.hpp" #include "bf/xml/exception.hpp" #include "bf/xml/item_instance_fields_node.hpp" #include "bf/xml/reader_tool.hpp" #include "bf/xml/util.hpp" #include "bf/wx_facilities.hpp" #include "bf/workspace_environment.hpp" #include #include /*----------------------------------------------------------------------------*/ /** * \brief Constructs a node parser. * \param env The workspace environment used. */ bf::xml::item_instance_node::item_instance_node( workspace_environment& env ) : m_workspace( env ) { } // item_instance_node::item_instance_node() /*----------------------------------------------------------------------------*/ /** * \brief Read an xml node "item". * \param node The node. * \return A dynamically allocated item_instance as described by the XML node. */ bf::item_instance* bf::xml::item_instance_node::read ( const wxXmlNode* node ) const { CLAW_PRECOND( node!=NULL ); CLAW_PRECOND( node->GetName() == wxT("item") ); wxString val; if ( !node->GetAttribute( wxT("class_name"), &val ) ) throw xml::missing_property( "class_name" ); std::string class_name( wx_to_std_string(val) ); item_instance* item(NULL); try { item = new item_instance ( m_workspace.get_item_class_pool().get_item_class_ptr(class_name) ); item->set_fixed ( xml::reader_tool::read_bool_opt(node, wxT("fixed"), false) ); item->set_id ( wx_to_std_string(node->GetAttribute( wxT("id"), wxEmptyString )) ); load_fields( *item, node->GetChildren() ); } catch( std::exception& e ) { claw::logger << claw::log_error << e.what() << std::endl; delete item; item = NULL; } return item; } // item_instance_node::read() /*----------------------------------------------------------------------------*/ /** * \brief Write an xml node "item". * \param item The item instance to write. * \param os The stream in which we write. */ void bf::xml::item_instance_node::write ( const item_instance& item, std::ostream& os ) const { os << " \n"; item_instance_fields_node field_node( m_workspace ); field_node.write(item, os); os << " \n\n"; } // item_instance_node::write() /*----------------------------------------------------------------------------*/ /** * \brief Load the fields of an item. * \param item The item in which we set the fields. * \param node The node to parse. */ void bf::xml::item_instance_node::load_fields ( item_instance& item, const wxXmlNode* node ) const { node = xml::reader_tool::skip_comments(node); if ( node != NULL ) { if ( node->GetName() == wxT("fields") ) { xml::item_instance_fields_node reader( m_workspace ); reader.read(item, node); } else claw::logger << claw::log_warning << "Ignored node '" << wx_to_std_string(node->GetName()) << "'" << std::endl; } } // item_instance_fields_node::load_fields() plee-the-bear-20251226/bear-factory/bear-editor/src/bf/xml/code/reader_tool.cpp000066400000000000000000000171721512343254000270460ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bf::xml::reader_tool class. * \author Julien Jorge */ #include "bf/xml/reader_tool.hpp" #include "bf/xml/exception.hpp" #include "bf/wx_facilities.hpp" #include #include #include /*----------------------------------------------------------------------------*/ /** * \brief Skip the comment nodes. * \param node Start from this node. */ const wxXmlNode* bf::xml::reader_tool::skip_comments( const wxXmlNode* node ) { bool stop = false; while ( !stop && (node!=NULL) ) if ( node->GetName() == wxT("comment") ) node = node->GetNext(); else stop = true; return node; } // reader_tool::skip_comments() /*----------------------------------------------------------------------------*/ /** * \brief Convert the value of a property in an integer. * \param node The node in which we take the property. * \param prop The name of the property to get. */ int bf::xml::reader_tool::read_int( const wxXmlNode* node, const wxString& prop ) { CLAW_PRECOND(node!=NULL); int result; wxString val; if ( !node->GetAttribute( prop, &val ) ) throw xml::missing_property( wx_to_std_string(prop) ); std::istringstream iss( wx_to_std_string(val) ); if ( !(iss >> result) ) throw xml::bad_value( "integer", wx_to_std_string(val) ); return result; } // reader_tool::read_int() /*----------------------------------------------------------------------------*/ /** * \brief Convert the value of a property in an unsigned integer. * \param node The node in which we take the property. * \param prop The name of the property to get. */ unsigned int bf::xml::reader_tool::read_uint( const wxXmlNode* node, const wxString& prop ) { CLAW_PRECOND(node!=NULL); unsigned int result; wxString val; if ( !node->GetAttribute( prop, &val ) ) throw xml::missing_property( wx_to_std_string(prop) ); std::istringstream iss( wx_to_std_string(val) ); if ( !(iss >> result) ) throw xml::bad_value( "unsigned integer", wx_to_std_string(val) ); return result; } // reader_tool::read_uint() /*----------------------------------------------------------------------------*/ /** * \brief Convert the value of a property in a string. * \param node The node in which we take the property. * \param prop The name of the property to get. */ std::string bf::xml::reader_tool::read_string( const wxXmlNode* node, const wxString& prop ) { CLAW_PRECOND(node!=NULL); wxString val; if ( !node->GetAttribute( prop, &val ) ) throw xml::missing_property( wx_to_std_string(prop) ); return wx_to_std_string(val); } // reader_tool::read_string() /*----------------------------------------------------------------------------*/ /** * \brief Convert the value of a property in a real number. * \param node The node in which we take the property. * \param prop The name of the property to get. */ double bf::xml::reader_tool::read_real( const wxXmlNode* node, const wxString& prop ) { CLAW_PRECOND(node!=NULL); double result; wxString val; if ( !node->GetAttribute( prop, &val ) ) throw xml::missing_property( wx_to_std_string(prop) ); std::istringstream iss( wx_to_std_string(val) ); if ( !(iss >> result) ) throw xml::bad_value( "unsigned integer", wx_to_std_string(val) ); return result; } // reader_tool::read_real() /*----------------------------------------------------------------------------*/ /** * \brief Convert the value of a property in an integer. * \param node The node in which we take the property. * \param prop The name of the property to get. * \param def The default value. */ int bf::xml::reader_tool::read_int_opt ( const wxXmlNode* node, const wxString& prop, int def ) { CLAW_PRECOND(node!=NULL); try { return read_int(node, prop); } catch ( ... ) { return def; } } // reader_tool::read_int_opt() /*----------------------------------------------------------------------------*/ /** * \brief Convert the value of a property in an unsigned integer. * \param node The node in which we take the property. * \param prop The name of the property to get. * \param def The default value. */ unsigned int bf::xml::reader_tool::read_uint_opt ( const wxXmlNode* node, const wxString& prop, unsigned int def ) { CLAW_PRECOND(node!=NULL); try { return read_uint(node, prop); } catch ( ... ) { return def; } } // reader_tool::read_uint_opt() /*----------------------------------------------------------------------------*/ /** * \brief Convert the value of a property in a string. * \param node The node in which we take the property. * \param prop The name of the property to get. * \param def The default value. */ std::string bf::xml::reader_tool::read_string_opt ( const wxXmlNode* node, const wxString& prop, const std::string& def ) { CLAW_PRECOND(node!=NULL); try { return read_string(node, prop); } catch ( ... ) { return def; } } // reader_tool::read_string_opt() /*----------------------------------------------------------------------------*/ /** * \brief Convert the value of an optional property in a real. * \param node The node in which we take the property. * \param prop The name of the property to get. * \param def The default value. */ double bf::xml::reader_tool::read_real_opt ( const wxXmlNode* node, const wxString& prop, double def ) { CLAW_PRECOND(node!=NULL); try { return read_real(node, prop); } catch ( ... ) { return def; } } // reader_tool::read_real_opt() /*----------------------------------------------------------------------------*/ /** * \brief Convert the value of an optional property in a boolean. * \param node The node in which we take the property. * \param prop The name of the property to get. * \param def The default value. */ bool bf::xml::reader_tool::read_bool_opt ( const wxXmlNode* node, const wxString& prop, bool def ) { CLAW_PRECOND(node!=NULL); bool result(def); wxString val; if ( node->GetAttribute( prop, &val ) ) { if ( (val == wxT("true")) || (val == wxT("1")) ) result = true; else if ( (val == wxT("false")) || (val == wxT("0")) ) result = false; } return result; } // reader_tool::read_bool_opt() /*----------------------------------------------------------------------------*/ /** * \brief Convert the value of an optional property in a trinary logic. * \param node The node in which we take the property. * \param prop The name of the property to get. * \param def The default value. */ bf::trinary_logic::value_type bf::xml::reader_tool::read_trinary_logic_opt ( const wxXmlNode* node, const wxString& prop, bf::trinary_logic::value_type def ) { CLAW_PRECOND(node!=NULL); bf::trinary_logic::value_type result(def); wxString val; if ( node->GetAttribute( prop, &val ) ) { if ( ( val == std_to_wx_string( trinary_logic::to_string (trinary_logic::boolean_true))) || (val == wxT("1")) || (val == wxT("true")) ) result = trinary_logic::boolean_true; else if ( ( val == std_to_wx_string ( trinary_logic::to_string (trinary_logic::boolean_false))) || (val == wxT("0")) || (val == wxT("false")) ) result = trinary_logic::boolean_false; else result = trinary_logic::boolean_random; } return result; } // reader_tool::read_trinary_logic_opt() plee-the-bear-20251226/bear-factory/bear-editor/src/bf/xml/code/util.cpp000066400000000000000000000043031512343254000255140ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bf::xml::util class. * \author Julien Jorge */ #include "bf/xml/util.hpp" #include "boost/algorithm/string/replace.hpp" /*----------------------------------------------------------------------------*/ bf::xml::util::replacement_map_type bf::xml::util::s_replacement_map; /*----------------------------------------------------------------------------*/ /** * \brief Replace special XML characters with adequate entities. * \param str The string to process. */ std::string bf::xml::util::replace_special_characters( const std::string& str ) { if ( s_replacement_map.empty() ) build_replacement_map(); std::string result; result.reserve( str.size() ); for ( std::size_t i(0); i!=str.size(); ++i ) { const replacement_map_type::const_iterator it ( s_replacement_map.find( str[i] ) ); if ( it == s_replacement_map.end() ) result.push_back( str[i] ); else result.append( it->second ); } return result; } // util::replace_special_characters() /*----------------------------------------------------------------------------*/ /** * \brief Fills s_replacement_map with the adequate replacements. */ void bf::xml::util::build_replacement_map() { s_replacement_map[ '\'' ] = "'"; s_replacement_map[ '"' ] = """; s_replacement_map[ '<' ] = "<"; s_replacement_map[ '>' ] = ">"; s_replacement_map[ '&' ] = "&"; s_replacement_map[ 'à' ] = "à"; s_replacement_map[ 'ä' ] = "ä"; s_replacement_map[ 'â' ] = "â"; s_replacement_map[ 'é' ] = "é"; s_replacement_map[ 'è' ] = "è"; s_replacement_map[ 'ë' ] = "ë"; s_replacement_map[ 'ê' ] = "ê"; s_replacement_map[ 'ï' ] = "ï"; s_replacement_map[ 'î' ] = "î"; s_replacement_map[ 'ö' ] = "ö"; s_replacement_map[ 'ô' ] = "ô"; s_replacement_map[ 'ù' ] = "ù"; s_replacement_map[ 'ü' ] = "ü"; s_replacement_map[ 'û' ] = "û"; } // util::build_replacement_map() plee-the-bear-20251226/bear-factory/bear-editor/src/bf/xml/code/value_to_xml.cpp000066400000000000000000000146211512343254000272410ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bf::xml::value_to_xml class. * \author Julien Jorge */ #include "bf/xml/value_to_xml.hpp" /*----------------------------------------------------------------------------*/ /** * \brief Write the XML attributes of a bitmap_rendering_attributes. * \param os The stream in which we save the value. * \param att The attributes to write. */ void bf::xml::base_sprite_animation_value_to_xml::bitmap_rendering_attributes_xml ( std::ostream& os, const bitmap_rendering_attributes& att ) { os << "auto_size='"; if ( att.get_auto_size() ) os << "true"; else os << "false"; os << "' width='" << att.width() << "' height='" << att.height() << "' mirror='" << trinary_logic::to_string(att.get_mirrored_status()) << "' flip='" << trinary_logic::to_string(att.get_flipped_status()); os << "' angle='" << att.get_angle(); os << "' opacity='" << att.get_color().get_opacity() << "' red_intensity='" << att.get_color().get_red_intensity() << "' green_intensity='" << att.get_color().get_green_intensity() << "' blue_intensity='" << att.get_color().get_blue_intensity() << "'"; } // base_sprite_animation_value_to_xml::bitmap_rendering_attributes_xml() /*----------------------------------------------------------------------------*/ /** * \brief Write a XML representation of an animation. * \param os The stream in which we write. * \param anim The animation to write. */ void bf::xml::value_to_xml::write ( std::ostream& os, const animation& anim ) { os << "\n"; animation::const_iterator it; for ( it=anim.begin(); it!=anim.end(); ++it ) { os << " \n"; os << " "; value_to_xml::write(os, it->get_sprite()); os << " \n"; } os << "\n"; } // value_to_xml::write() [animation] /*----------------------------------------------------------------------------*/ /** * \brief Write a XML representation of an animation file. * \param os The stream in which we write. * \param anim The animation file to write. */ void bf::xml::value_to_xml::write ( std::ostream& os, const animation_file_type& anim ) { os << "\n"; } // value_to_xml::write() [animation_file_type] /*----------------------------------------------------------------------------*/ /** * \brief Write a XML representation of any animation. * \param os The stream in which we write. * \param anim The animation to write. */ void bf::xml::value_to_xml::write ( std::ostream& os, const any_animation& anim ) { const any_animation::content_type c = anim.get_content_type(); if ( c == any_animation::content_file ) value_to_xml::write( os, anim.get_animation_file() ); else if ( c == any_animation::content_animation ) value_to_xml::write( os, anim.get_animation() ); else os << ""; } // value_to_xml::write() [any_animation] /*----------------------------------------------------------------------------*/ /** * \brief Write a XML representation of a sprite. * \param os The stream in which we write. * \param spr The sprite to write. */ void bf::xml::value_to_xml::write ( std::ostream& os, const sprite& spr ) { os << "\n"; } // value_to_xml::write() [sprite] /*----------------------------------------------------------------------------*/ /** * \brief Write a XML representation of a sample. * \param os The stream in which we write. * \param s The sample to write. */ void bf::xml::value_to_xml::write ( std::ostream& os, const sample& s ) { os << "\n"; } // value_to_xml::write() [sample] /*----------------------------------------------------------------------------*/ /** * \brief Write a XML representation of a font. * \param os The stream in which we write. * \param f The font to write. */ void bf::xml::value_to_xml::write ( std::ostream& os, const font& f ) { os << "\n"; } // value_to_xml::write() [font] /*----------------------------------------------------------------------------*/ /** * \brief Write a XML representation of a color. * \param os The stream in which we write. * \param f The color to write. */ void bf::xml::value_to_xml::write ( std::ostream& os, const color& f ) { os << "\n"; } // value_to_xml::write() [color] /*----------------------------------------------------------------------------*/ /** * \brief Write a XML representation of an easing function. * \param os The stream in which we write. * \param f The value to write. */ void bf::xml::value_to_xml::write ( std::ostream& os, const easing_type& f ) { os << "\n"; } // value_to_xml::write() [easing_type] plee-the-bear-20251226/bear-factory/bear-editor/src/bf/xml/code/xml_to_value.cpp000066400000000000000000000326271512343254000272470ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the bf::xml::xml_to_value class. * \author Julien Jorge */ #include "bf/xml/xml_to_value.hpp" #include "bf/image_pool.hpp" #include "bf/workspace_environment.hpp" #include "bf/wx_facilities.hpp" #include "bf/xml/reader_tool.hpp" #include /*----------------------------------------------------------------------------*/ /** * \brief Read the bitmap_rendering_attributes of a node. * \param att (out) The attributes we have read. * \param node The node from which we read the value. */ void bf::xml::bitmap_rendering_attributes_xml_to_value::load_rendering_attributes ( bitmap_rendering_attributes& att, const wxXmlNode* node ) const { CLAW_PRECOND( node != NULL ); att.set_auto_size ( xml::reader_tool::read_bool_opt (node, wxT("auto_size"), att.get_auto_size()) ); att.set_width ( xml::reader_tool::read_uint_opt(node, wxT("width"), att.width()) ); att.set_height ( xml::reader_tool::read_uint_opt(node, wxT("height"), att.height()) ); att.mirror ( xml::reader_tool::read_trinary_logic_opt (node, wxT("mirror"), att.get_mirrored_status())); att.flip ( xml::reader_tool::read_trinary_logic_opt (node, wxT("flip"), att.get_flipped_status())); att.get_color().set_opacity ( xml::reader_tool::read_real_opt (node, wxT("opacity"), att.get_color().get_opacity()) ); att.set_angle ( xml::reader_tool::read_real_opt( node, wxT("angle"), att.get_angle()) ); double r = xml::reader_tool::read_real_opt ( node, wxT("red_intensity"), att.get_color().get_red_intensity() ); double g = xml::reader_tool::read_real_opt ( node, wxT("green_intensity"), att.get_color().get_green_intensity() ); double b = xml::reader_tool::read_real_opt ( node, wxT("blue_intensity"), att.get_color().get_blue_intensity() ); att.get_color().set_intensity( r, g, b ); } // bitmap_rendering_attributes_xml_to_value::load_rendering_attributes() /*----------------------------------------------------------------------------*/ /** * \brief Read the value from a xml value node. * \param spr (out) The sprite we have read. * \param node The node from which we read the value. * \param env The workspace environment to use. */ void bf::xml::xml_to_value::operator() ( sprite& spr, const wxXmlNode* node, workspace_environment& env ) const { CLAW_PRECOND( node != NULL ); spr.set_image_name( xml::reader_tool::read_string(node, wxT("image")) ); const std::string spritepos = xml::reader_tool::read_string_opt(node, wxT("spritepos"), std::string()); if ( spritepos.empty() ) { spr.set_left( xml::reader_tool::read_uint(node, wxT("x")) ); spr.set_top( xml::reader_tool::read_uint(node, wxT("y")) ); spr.set_clip_width ( xml::reader_tool::read_uint(node, wxT("clip_width")) ); spr.set_clip_height ( xml::reader_tool::read_uint(node, wxT("clip_height")) ); spr.set_spritepos_entry ( wx_to_std_string ( env.get_image_pool().find_spritepos_name_from_size ( std_to_wx_string(spr.get_image_name()), spr.get_clip_rectangle() )) ); } else { spr.set_clip_rectangle ( env.get_image_pool().get_spritepos_rectangle ( std_to_wx_string(spr.get_image_name()), std_to_wx_string(spritepos) ) ); spr.set_spritepos_entry( spritepos ); } load_rendering_attributes(spr, node); if ( spr.get_auto_size() ) { spr.set_width( spr.get_clip_width() ); spr.set_height( spr.get_clip_height() ); } else if ( (spr.width() == spr.get_clip_width()) && (spr.height() == spr.get_clip_height()) ) spr.set_auto_size(true); } // xml_to_value::operator()() [sprite] /*----------------------------------------------------------------------------*/ /** * \brief Tell if the reader can process a node with a given name. * \param node_name The name of the node. */ bool bf::xml::xml_to_value::supported_node ( const wxString& node_name ) { return node_name == wxT("animation"); } // xml_to_value::supported_node() [animation] /*----------------------------------------------------------------------------*/ /** * \brief Read the value from a xml value node. * \param anim (out) The animation we have read. * \param node The node from which we read the value. * \param env The workspace environment to use. */ void bf::xml::xml_to_value::operator() ( animation& anim, const wxXmlNode* node, workspace_environment& env ) const { CLAW_PRECOND( node != NULL ); anim.set_loops( xml::reader_tool::read_uint(node, wxT("loops")) ); anim.set_first_index ( xml::reader_tool::read_uint(node, wxT("first_index")) ); anim.set_last_index ( xml::reader_tool::read_uint(node, wxT("last_index")) ); anim.set_loop_back ( xml::reader_tool::read_bool_opt(node, wxT("loop_back"), false)); load_frames(anim, node->GetChildren(), env); load_rendering_attributes(anim, node); if ( anim.get_auto_size() ) { anim.set_width( anim.get_max_size().x ); anim.set_height( anim.get_max_size().y ); } else if ( anim.get_size() == anim.get_max_size() ) anim.set_auto_size(true); } // xml_to_value::operator()() [animation] /*----------------------------------------------------------------------------*/ /** * \brief Load the frames of an animation. * \param anim The animation in which we set a list of frames. * \param node The node to parse. * \param env The workspace environment to use. */ void bf::xml::xml_to_value::load_frames ( animation& anim, const wxXmlNode* node, workspace_environment& env ) const { for ( ; node!=NULL; node=node->GetNext() ) if ( node->GetName() == wxT("frame") ) load_frame(anim, node, env); else if ( node->GetName() != wxT("comment") ) claw::logger << claw::log_warning << "Ignored node '" << wx_to_std_string(node->GetName()) << "'" << std::endl; } // bf::xml::xml_to_value::load_frames() /*----------------------------------------------------------------------------*/ /** * \brief Load a frame of an animation. * \param anim The animation in which we add the frame. * \param node The node to parse. * \param env The workspace environment to use. */ void bf::xml::xml_to_value::load_frame ( animation& anim, const wxXmlNode* node, workspace_environment& env ) const { CLAW_PRECOND( node->GetName() == wxT("frame") ); wxString val; animation_frame frame; sprite spr; if ( !node->GetAttribute( wxT("duration"), &val ) ) throw missing_property( "duration" ); frame.set_duration ( xml::reader_tool::read_real_opt(node, wxT("duration"), 40) ); wxXmlNode* children = node->GetChildren(); if ( children != NULL ) { if ( children->GetName() == wxT("sprite") ) { xml::xml_to_value xml_conv; xml_conv(spr, children, env); frame.set_sprite(spr); anim.add_frame() = frame; } else if ( node->GetName() != wxT("comment") ) claw::logger << claw::log_warning << "Ignored node '" << wx_to_std_string(children->GetName()) << "'" << std::endl; } else throw missing_node("sprite"); } // bf::xml::xml_to_value::load_frame() /*----------------------------------------------------------------------------*/ /** * \brief Tell if the reader can process a node with a given name. * \param node_name The name of the node. */ bool bf::xml::xml_to_value::supported_node ( const wxString& node_name ) { return node_name == wxT("animation_file"); } // xml_to_value::supported_node() [animation_file_type] /*----------------------------------------------------------------------------*/ /** * \brief Read the value from a xml value node. * \param anim (out) The animation we have read. * \param node The node from which we read the value. * \param env The workspace environment to use. */ void bf::xml::xml_to_value::operator() ( animation_file_type& anim, const wxXmlNode* node, workspace_environment& env ) const { CLAW_PRECOND( node != NULL ); wxString path; if ( !node->GetAttribute( wxT("path"), &path ) ) throw missing_property("path"); anim.set_path( wx_to_std_string(path), env ); load_rendering_attributes(anim, node); const claw::math::coordinate_2d size ( anim.get_animation().get_max_size() ); if ( anim.get_auto_size() ) { anim.set_width( size.x ); anim.set_height( size.y ); } else if ( anim.get_size() == size ) anim.set_auto_size(true); } // xml_to_value::operator()() [animation_file_type] /*----------------------------------------------------------------------------*/ /** * \brief Tell if the reader can process a node with a given name. * \param node_name The name of the node. */ bool bf::xml::xml_to_value::supported_node ( const wxString& node_name ) { return xml_to_value::supported_node(node_name) || xml_to_value::supported_node(node_name); } // xml_to_value::supported_node() [any_animation] /*----------------------------------------------------------------------------*/ /** * \brief Read the value from a xml value node. * \param anim (out) The animation we have read. * \param node The node from which we read the value. * \param env The workspace environment tu use. */ void bf::xml::xml_to_value::operator() ( any_animation& anim, const wxXmlNode* node, workspace_environment& env ) const { wxString name = node->GetName(); if ( xml_to_value::supported_node(name) ) { animation_file_type data; xml_to_value reader; reader(data, node, env); anim.set_animation_file(data); } else if ( xml_to_value::supported_node(name) ) { animation data; xml_to_value reader; reader(data, node, env); anim.set_animation(data); } else throw bad_node( wx_to_std_string(name) ); } // xml_to_value::operator()() [any_animation] /*----------------------------------------------------------------------------*/ /** * \brief Read the value from a xml value node. * \param v (out) The sample we have read. * \param node The node from which we read the value. */ void bf::xml::xml_to_value::operator() ( sample& v, const wxXmlNode* node ) const { CLAW_PRECOND( node != NULL ); wxString path; if ( !node->GetAttribute( wxT("path"), &path ) ) throw missing_property("path"); v.set_path( wx_to_std_string(path) ); v.set_loops( xml::reader_tool::read_uint_opt(node, wxT("loops"), 1) ); v.set_volume( xml::reader_tool::read_real_opt(node, wxT("volume"), 1) ); } // xml_to_value::operator()() [sample] /*----------------------------------------------------------------------------*/ /** * \brief Read the value from a xml value node. * \param v (out) The font we have read. * \param node The node from which we read the value. */ void bf::xml::xml_to_value::operator() ( font& v, const wxXmlNode* node ) const { CLAW_PRECOND( node != NULL ); wxString path; if ( !node->GetAttribute( wxT("path"), &path ) ) throw missing_property("path"); const font default_value; v.set_font_name( wx_to_std_string(path) ); v.set_size ( xml::reader_tool::read_real_opt ( node, wxT("size"), default_value.get_size() ) ); } // xml_to_value::operator()() [font] /*----------------------------------------------------------------------------*/ /** * \brief Read the value from a xml value node. * \param v (out) The color we have read. * \param node The node from which we read the value. */ void bf::xml::xml_to_value::operator() ( color& v, const wxXmlNode* node ) const { CLAW_PRECOND( node != NULL ); const color default_value; v.set_opacity ( xml::reader_tool::read_real_opt ( node, wxT("opacity"), default_value.get_opacity() ) ); double red = xml::reader_tool::read_real_opt ( node, wxT("red_intensity"), default_value.get_red_intensity() ); double green = xml::reader_tool::read_real_opt ( node, wxT("green_intensity"), default_value.get_green_intensity() ); double blue = xml::reader_tool::read_real_opt ( node, wxT("blue_intensity"), default_value.get_blue_intensity() ); v.set_intensity(red, green, blue); } // xml_to_value::operator()() [color] /*----------------------------------------------------------------------------*/ /** * \brief Read the value from a xml value node. * \param v (out) The easing function we have read. * \param node The node from which we read the value. */ void bf::xml::xml_to_value::operator() ( easing_type& v, const wxXmlNode* node ) const { CLAW_PRECOND( node != NULL ); bear::easing e; e.set_function ( bear::easing::function::from_string ( xml::reader_tool::read_string_opt ( node, wxT("function"), bear::easing::function::to_string( e.get_function() ) ) ) ); e.set_direction ( bear::easing::direction::from_string ( xml::reader_tool::read_string_opt ( node, wxT("direction"), bear::easing::direction::to_string( e.get_direction() ) ) ) ); v.set_value( e ); } // xml_to_value::operator()() [easing_type] plee-the-bear-20251226/bear-factory/bear-editor/src/bf/xml/exception.hpp000066400000000000000000000047331512343254000256370ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Various exceptions thrown when parsing an XML file. */ #ifndef __BF_XML_EXCEPTION_HPP__ #define __BF_XML_EXCEPTION_HPP__ #include "bf/libeditor_export.hpp" #include #include namespace bf { namespace xml { /** * \brief Exception thrown when the parser find an unexpected node. * \author Julien Jorge */ class BEAR_EDITOR_EXPORT bad_node: public std::exception { public: bad_node( const std::string& node_name ); virtual ~bad_node() throw(); virtual const char* what() const throw(); private: /** \brief A short explanation of the problem. */ const std::string m_msg; }; // class bad_node /** * \brief Exception thrown when the parser does not find an needed node. * \author Julien Jorge */ class BEAR_EDITOR_EXPORT missing_node: public std::exception { public: missing_node( const std::string& property_name ); virtual ~missing_node() throw(); virtual const char* what() const throw(); private: /** \brief A short explanation of the problem. */ const std::string m_msg; }; // class missing_node /** * \brief Exception thrown when the parser does not find an needed property. * \author Julien Jorge */ class BEAR_EDITOR_EXPORT missing_property: public std::exception { public: missing_property( const std::string& property_name ); virtual ~missing_property() throw(); virtual const char* what() const throw(); private: /** \brief A short explanation of the problem. */ const std::string m_msg; }; // class missing_property /** * \brief Exception thrown when the parser find a not supported value. * \author Julien Jorge */ class BEAR_EDITOR_EXPORT bad_value: public std::exception { public: bad_value( const std::string& value ); bad_value( const std::string& type, const std::string& value ); virtual ~bad_value() throw(); virtual const char* what() const throw(); private: /** \brief A short explanation of the problem. */ const std::string m_msg; }; // class bad_value } // namespace xml } // namespace bf #endif // __BF_XML_EXCEPTION_HPP__ plee-the-bear-20251226/bear-factory/bear-editor/src/bf/xml/impl/000077500000000000000000000000001512343254000240625ustar00rootroot00000000000000plee-the-bear-20251226/bear-factory/bear-editor/src/bf/xml/impl/value_to_xml.tpp000066400000000000000000000017451512343254000273140ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the template methods of the bf::xml::value_to_xml * class. * \author Julien Jorge */ #include "bf/xml/util.hpp" #include /*----------------------------------------------------------------------------*/ /** * \brief Create a node for a simple value. * \param os The stream in which we save the value. * \param node_name The name of the xml node. * \param v The value to write. */ template void bf::xml::value_to_xml::write ( std::ostream& os, const std::string& node_name, const Type& v ) { std::ostringstream oss; oss << v.get_value(); os << "<" << util::replace_special_characters(node_name) << " value='" << util::replace_special_characters(oss.str()) << "'/>\n"; } // value_to_xml::write() plee-the-bear-20251226/bear-factory/bear-editor/src/bf/xml/impl/xml_to_value.tpp000066400000000000000000000022631512343254000273100ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Implementation of the template methods of the bf::xml::xml_to_value * class. * \author Julien Jorge */ #include "bf/stream_conv.hpp" #include "bf/xml/exception.hpp" #include "bf/wx_facilities.hpp" #include #include /*----------------------------------------------------------------------------*/ /** * \brief Read the value from a xml value node. * \param v (out) The value we have read. * \param node The node from which we read the value. */ template void bf::xml::xml_to_value::operator() ( Type& v, const wxXmlNode* node ) const { CLAW_PRECOND( node != NULL ); wxString val; if ( !node->GetAttribute( wxT("value"), &val ) ) throw missing_property( "value" ); const std::string std_val( wx_to_std_string(val) ); std::istringstream iss( std_val ); if ( !stream_conv::read(iss, v) ) throw bad_value( wx_to_std_string(node->GetName()), std_val ); } // xml_to_value::operator()() plee-the-bear-20251226/bear-factory/bear-editor/src/bf/xml/item_class_inherit_node.hpp000066400000000000000000000017321512343254000305070ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Read an xml "inherit" node of an item class. * \author Julien Jorge */ #ifndef __BF_XML_ITEM_CLASS_INHERIT_NODE_HPP__ #define __BF_XML_ITEM_CLASS_INHERIT_NODE_HPP__ #include #include namespace bf { class item_class; class item_class_pool; namespace xml { /** * \brief Read an xml "inherit" node of an item class. * \author Julien Jorge */ class item_class_inherit_node { public: void read( const item_class_pool& pool, item_class& item, const wxXmlNode* node ) const; void write( const item_class& item, std::ostream& os ) const; }; // class item_class_inherit_node } // namespace xml } // namespace bf #endif // __BF_XML_ITEM_CLASS_INHERIT_NODE_HPP__ plee-the-bear-20251226/bear-factory/bear-editor/src/bf/xml/item_instance_field_node.hpp000066400000000000000000000047731512343254000306370ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Process an xml "field" node of an item instance. * \author Julien Jorge */ #ifndef __BF_XML_ITEM_INSTANCE_FIELD_NODE_HPP__ #define __BF_XML_ITEM_INSTANCE_FIELD_NODE_HPP__ #include #include #include "bf/custom_type.hpp" namespace bf { class image_pool; class item_instance; class type_field; class workspace_environment; namespace xml { /** * \brief Process an xml "field" node of an item instance. * \author Julien Jorge */ class item_instance_field_node { public: item_instance_field_node( workspace_environment& pool ); void read( item_instance& item, const wxXmlNode* node ) const; void write ( const item_instance& item, const type_field& f, std::ostream& os ) const; private: void load_field ( item_instance& item, const type_field& f, const wxXmlNode* node ) const; void save_field ( const item_instance& item, const type_field& f, std::ostream& os ) const; template void load_value ( item_instance& item, const std::string& field_name, const wxXmlNode* node ) const; template void load_value_list ( item_instance& item, const std::string& field_name, const wxXmlNode* node ) const; template Type load_value_from_xml( const wxXmlNode* node ) const; template void save_value ( std::ostream& os, const std::string& field_name, const item_instance& item ) const; template void save_value ( std::ostream& os, const std::string& field_name, const item_instance& item, const std::string& node_name ) const; template void save_value_list ( std::ostream& os, const std::string& field_name, const item_instance& item ) const; template void save_value_list ( std::ostream& os, const std::string& field_name, const item_instance& item, const std::string& node_name ) const; private: /** \brief The workspace environment used. */ workspace_environment& m_workspace; }; // class item_instance_field_node } // namespace xml } // namespace bf #endif // __BF_XML_ITEM_INSTANCE_FIELD_NODE_HPP__ plee-the-bear-20251226/bear-factory/bear-editor/src/bf/xml/item_instance_fields_node.hpp000066400000000000000000000024441512343254000310130ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Process an xml "fields" node of an item instance. * \author Julien Jorge */ #ifndef __BF_XML_ITEM_INSTANCE_FIELDS_NODE_HPP__ #define __BF_XML_ITEM_INSTANCE_FIELDS_NODE_HPP__ #include #include namespace bf { class workspace_environment; class item_class; class item_instance; namespace xml { /** * \brief Process an xml "fields" node of an item instance. * \author Julien Jorge */ class item_instance_fields_node { public: item_instance_fields_node( workspace_environment& env ); void read( item_instance& item, const wxXmlNode* node ) const; void write ( const item_instance& item, std::ostream& os ) const; private: void save_item_by_class ( const item_instance& item, const item_class& the_class, std::ostream& os ) const; private: /** \brief The workspace environment used. */ workspace_environment& m_workspace; }; // class item_instance_fields_node } // namespace xml } // namespace bf #endif // __BF_XML_ITEM_INSTANCE_FIELDS_NODE_HPP__ plee-the-bear-20251226/bear-factory/bear-editor/src/bf/xml/item_instance_node.hpp000066400000000000000000000023051512343254000274610ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Process an xml "item" node describing an item instance. * \author Julien Jorge */ #ifndef __BF_XML_ITEM_INSTANCE_NODE_HPP__ #define __BF_XML_ITEM_INSTANCE_NODE_HPP__ #include #include namespace bf { class workspace_environment; class item_instance; class item_class_pool; namespace xml { /** * \brief Process an xml "item" node describing an item instance. * \author Julien Jorge */ class item_instance_node { public: item_instance_node( workspace_environment& env ); item_instance* read( const wxXmlNode* node ) const; void write( const item_instance& item, std::ostream& os ) const; private: void load_fields( item_instance& item, const wxXmlNode* node ) const; private: /** \brief The workspace environment used. */ workspace_environment& m_workspace; }; // class item_instance_node } // namespace xml } // namespace bf #endif // __BF_XML_ITEM_INSTANCE_NODE_HPP__ plee-the-bear-20251226/bear-factory/bear-editor/src/bf/xml/reader_tool.hpp000066400000000000000000000034151512343254000261340ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Some tool functions for the xml readers. * \author Julien Jorge */ #ifndef __BF_XML_READER_TOOL_HPP__ #define __BF_XML_READER_TOOL_HPP__ #include #include #include "bf/trinary_logic.hpp" namespace bf { namespace xml { /** * \brief Some tool functions for the xml readers. * \author Julien Jorge */ class reader_tool { public: static const wxXmlNode* skip_comments( const wxXmlNode* node ); static int read_int( const wxXmlNode* node, const wxString& prop ); static unsigned int read_uint( const wxXmlNode* node, const wxString& prop ); static std::string read_string( const wxXmlNode* node, const wxString& prop ); static double read_real( const wxXmlNode* node, const wxString& prop ); static int read_int_opt ( const wxXmlNode* node, const wxString& prop, int def ); static unsigned int read_uint_opt ( const wxXmlNode* node, const wxString& prop, unsigned int def ); static std::string read_string_opt ( const wxXmlNode* node, const wxString& prop, const std::string& def ); static double read_real_opt( const wxXmlNode* node, const wxString& prop, double def ); static bool read_bool_opt( const wxXmlNode* node, const wxString& prop, bool def ); static trinary_logic::value_type read_trinary_logic_opt ( const wxXmlNode* node, const wxString& prop, trinary_logic::value_type def ); }; // class reader_tool } // namespace xml } // namespace bf #endif // __BF_XML_READER_TOOL_HPP__ plee-the-bear-20251226/bear-factory/bear-editor/src/bf/xml/util.hpp000066400000000000000000000022261512343254000246110ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief Some tool functions for the xml writers. * \author Julien Jorge */ #ifndef __BF_XML_UTIL_HPP__ #define __BF_XML_UTIL_HPP__ #include #include namespace bf { namespace xml { /** * \brief Some tool functions to manipulate xml. * \author Julien Jorge */ class util { private: /** \brief The type of the map in which we store the xml replacement for the special characters. */ typedef std::map< std::string::value_type, std::string > replacement_map_type; public: static std::string replace_special_characters( const std::string& str ); private: static void build_replacement_map(); private: /** \brief The map in which we store the xml replacement for the special characters. */ static replacement_map_type s_replacement_map; }; // class util } // namespace xml } // namespace bf #endif // __BF_XML_UTIL_HPP__ plee-the-bear-20251226/bear-factory/bear-editor/src/bf/xml/value_to_xml.hpp000066400000000000000000000106551512343254000263370ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A class for writing source level files. * \author Julien Jorge */ #ifndef __BF_XML_VALUE_TO_XML_HPP__ #define __BF_XML_VALUE_TO_XML_HPP__ #include "bf/any_animation.hpp" #include "bf/color.hpp" #include "bf/custom_type.hpp" #include "bf/font.hpp" #include "bf/sample.hpp" #include "bf/libeditor_export.hpp" #include #include namespace bf { namespace xml { /** * \brief A class to convert a value into an XML representation. * \author Julien Jorge */ template class value_to_xml { public: static void write ( std::ostream& os, const std::string& node_name, const Type& v ); }; // class value_to_xml /** * \brief A class for common code in value_to_xml and * value_to_xml. * \author Julien Jorge */ class BEAR_EDITOR_EXPORT base_sprite_animation_value_to_xml { protected: static void bitmap_rendering_attributes_xml ( std::ostream& os, const bitmap_rendering_attributes& att ); }; // class base_sprite_animation_value_to_xml /** * \brief A class to convert a value into an XML representation. * Specialisation for the bf::sprite class. * \author Julien Jorge */ template<> class BEAR_EDITOR_EXPORT value_to_xml: public base_sprite_animation_value_to_xml { public: static void write( std::ostream& os, const sprite& spr ); }; // class value_to_xml [sprite] /** * \brief A class to convert a value into an XML representation. * Specialisation for the bf::animation class. * \author Julien Jorge */ template<> class BEAR_EDITOR_EXPORT value_to_xml: public base_sprite_animation_value_to_xml { public: static void write( std::ostream& os, const animation& anim ); }; // class value_to_xml [animation] /** * \brief A class to convert a value into an XML representation. * Specialisation for the bf::animation_file_type class. * \author Julien Jorge */ template<> class BEAR_EDITOR_EXPORT value_to_xml: public base_sprite_animation_value_to_xml { public: static void write( std::ostream& os, const animation_file_type& anim ); }; // class value_to_xml [animation_file_type] /** * \brief A class to convert a value into an XML representation. * Specialisation for the bf::any_animation class. * \author Julien Jorge */ template<> class BEAR_EDITOR_EXPORT value_to_xml { public: static void write( std::ostream& os, const any_animation& anim ); }; // class value_to_xml [any_animation] /** * \brief A class to convert a value into an XML representation. * Specialisation for the bf::sample class. * \author Julien Jorge */ template<> class BEAR_EDITOR_EXPORT value_to_xml { public: static void write( std::ostream& os, const sample& s ); }; // class value_to_xml [sample] /** * \brief A class to convert a value into an XML representation. * Specialisation for the bf::font class. * \author Julien Jorge */ template<> class BEAR_EDITOR_EXPORT value_to_xml { public: static void write( std::ostream& os, const font& s ); }; // class value_to_xml [font] /** * \brief A class to convert a value into an XML representation. * Specialisation for the bf::color class. * \author Julien Jorge */ template<> class BEAR_EDITOR_EXPORT value_to_xml { public: static void write( std::ostream& os, const color& f ); }; // class value_to_xml [color] /** * \brief A class to convert a value into an XML representation. * Specialisation for the bf::easing_type class. * \author Julien Jorge */ template<> class BEAR_EDITOR_EXPORT value_to_xml { public: static void write( std::ostream& os, const easing_type& f ); }; // class value_to_xml [easing_type] } // namespace xml } // namespace bf #include "bf/xml/impl/value_to_xml.tpp" #endif // __BF_XML_VALUE_TO_XML_HPP__ plee-the-bear-20251226/bear-factory/bear-editor/src/bf/xml/xml_to_value.hpp000066400000000000000000000114231512343254000263310ustar00rootroot00000000000000/* Copyright (C) 2012 Stuffomatic Ltd. All rights reserved. See the accompanying license file for details about usage, modification and distribution of this file. */ /** * \file * \brief A class for reading source xml files. * \author Julien Jorge */ #ifndef __BF_XML_XML_TO_VALUE_HPP__ #define __BF_XML_XML_TO_VALUE_HPP__ #include "bf/any_animation.hpp" #include "bf/color.hpp" #include "bf/custom_type.hpp" #include "bf/font.hpp" #include "bf/sample.hpp" #include "bf/libeditor_export.hpp" #include namespace bf { class workspace_environment; namespace xml { /** * \brief A class to convert an XML node into real data. * \author Julien Jorge */ template class xml_to_value { public: void operator()( Type& v, const wxXmlNode* node ) const; }; // class xml_to_value /** * \brief A class for common code in * xml_to_value. * \author Julien Jorge */ class BEAR_EDITOR_EXPORT bitmap_rendering_attributes_xml_to_value { protected: void load_rendering_attributes ( bitmap_rendering_attributes& att, const wxXmlNode* node ) const; }; // class bitmap_rendering_attributes_xml_to_value /** * \brief A class to convert an XML node into real data. Specialisation for * the bf::sprite class. */ template<> class BEAR_EDITOR_EXPORT xml_to_value: public bitmap_rendering_attributes_xml_to_value { public: void operator() ( sprite& v, const wxXmlNode* node, workspace_environment& env ) const; }; // class xml_to_value [sprite] /** * \brief A class to convert an XML node into real data. Specialisation for * the bf::animation class. */ template<> class BEAR_EDITOR_EXPORT xml_to_value: public bitmap_rendering_attributes_xml_to_value { public: static bool supported_node( const wxString& node_name ); void operator() ( animation& v, const wxXmlNode* node, workspace_environment& env ) const; private: void load_frames ( animation& anim, const wxXmlNode* node, workspace_environment& env ) const; void load_frame ( animation& anim, const wxXmlNode* node, workspace_environment& env ) const; }; // class xml_to_value [animation] /** * \brief A class to convert an XML node into real data. Specialisation for * the bf::animation_file_type class. */ template<> class BEAR_EDITOR_EXPORT xml_to_value: public bitmap_rendering_attributes_xml_to_value { public: static bool supported_node( const wxString& node_name ); void operator() ( animation_file_type& v, const wxXmlNode* node, workspace_environment& env ) const; }; // class xml_to_value [animation_file_type] /** * \brief A class to convert an XML node into real data. Specialisation for * the bf::any_animation class. */ template<> class BEAR_EDITOR_EXPORT xml_to_value { public: static bool supported_node( const wxString& node_name ); void operator() ( any_animation& v, const wxXmlNode* node, workspace_environment& env ) const; }; // class xml_to_value [any_animation] /** * \brief A class to convert an XML node into real data. Specialisation for * the bf::sample class. */ template<> class BEAR_EDITOR_EXPORT xml_to_value { public: void operator()( sample& v, const wxXmlNode* node ) const; }; // class xml_to_value [sample] /** * \brief A class to convert an XML node into real data. Specialisation for * the bf::font class. */ template<> class BEAR_EDITOR_EXPORT xml_to_value { public: void operator()( font& v, const wxXmlNode* node ) const; }; // class xml_to_value [font] /** * \brief A class to convert an XML node into real data. Specialisation for * the bf::color class. */ template<> class BEAR_EDITOR_EXPORT xml_to_value { public: void operator()( color& v, const wxXmlNode* node ) const; }; // class xml_to_value [color] /** * \brief A class to convert an XML node into real data. Specialisation for * the bf::easing_type class. */ template<> class BEAR_EDITOR_EXPORT xml_to_value { public: void operator()( easing_type& v, const wxXmlNode* node ) const; }; // class xml_to_value [easing_type] } // namespace xml } // namespace bf #include "bf/xml/impl/xml_to_value.tpp" #endif // __BF_XML_XML_TO_VALUE_HPP__ plee-the-bear-20251226/bear-factory/desktop/000077500000000000000000000000001512343254000204175ustar00rootroot00000000000000plee-the-bear-20251226/bear-factory/desktop/CMakeLists.txt000066400000000000000000000005261512343254000231620ustar00rootroot00000000000000install( DIRECTORY "applications" "icons" "pixmaps" DESTINATION "${CMAKE_INSTALL_PREFIX}/share/" FILE_PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ DIRECTORY_PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE PATTERN ".svn" EXCLUDE ) subdirs(images locale man) plee-the-bear-20251226/bear-factory/desktop/applications/000077500000000000000000000000001512343254000231055ustar00rootroot00000000000000plee-the-bear-20251226/bear-factory/desktop/applications/bf-animation-editor.desktop000066400000000000000000000006331512343254000303320ustar00rootroot00000000000000[Desktop Entry] Version=1.0 Type=Application MimeType=application/x-bear-animation; Name=Bear Factory — Animation Editor Comment=Animation editor for the Bear Engine Comment[en]=Animation editor for the Bear Engine Comment[fr]=Éditeur d'animation pour le moteur « Bear » TryExec=bf-animation-editor Exec=bf-animation-editor %f Terminal=false Icon=bear-factory StartupNotify=true Categories=Utility; plee-the-bear-20251226/bear-factory/desktop/applications/bf-level-editor.desktop000066400000000000000000000006021512343254000274560ustar00rootroot00000000000000[Desktop Entry] Version=1.0 Type=Application MimeType=application/x-bear-level; Name=Bear Factory — Level Editor Comment=Level editor for the Bear Engine Comment[en]=Level editor for the Bear Engine Comment[fr]=Éditeur de niveau pour le moteur « Bear » TryExec=bf-level-editor Exec=bf-level-editor %f Terminal=false Icon=bear-factory StartupNotify=true Categories=Utility; plee-the-bear-20251226/bear-factory/desktop/applications/bf-model-editor.desktop000066400000000000000000000006051512343254000274520ustar00rootroot00000000000000[Desktop Entry] Version=1.0 Type=Application MimeType=application/x-bear-model; Name=Bear Factory — Model Editor Comment=Model editor for the Bear Engine Comment[en]=Model editor for the Bear Engine Comment[fr]=Éditeur de personnage pour le moteur « Bear » TryExec=bf-model-editor Exec=bf-model-editor %f Terminal=false Icon=bear-factory StartupNotify=true Categories=Utility; plee-the-bear-20251226/bear-factory/desktop/applications/desc2img.desktop000066400000000000000000000006351512343254000262010ustar00rootroot00000000000000[Desktop Entry] Version=1.0 Type=Application MimeType=application/x-bear-spritedesc; Name=Bear Factory — Spritedesc interpreter Comment=Interpreter for sprite description files Comment[en]=Interpreter for sprite description files Comment[fr]=Interpréteur pour les fichiers de description de sprite TryExec=desc2img Exec=desc2img %f Terminal=false Icon=bear-factory StartupNotify=true Categories=Utility; plee-the-bear-20251226/bear-factory/desktop/bear-factory-icon.svg000066400000000000000000004305341512343254000244550ustar00rootroot00000000000000 image/svg+xml plee-the-bear-20251226/bear-factory/desktop/icons/000077500000000000000000000000001512343254000215325ustar00rootroot00000000000000plee-the-bear-20251226/bear-factory/desktop/icons/hicolor/000077500000000000000000000000001512343254000231715ustar00rootroot00000000000000plee-the-bear-20251226/bear-factory/desktop/icons/hicolor/128x128/000077500000000000000000000000001512343254000241265ustar00rootroot00000000000000plee-the-bear-20251226/bear-factory/desktop/icons/hicolor/128x128/apps/000077500000000000000000000000001512343254000250715ustar00rootroot00000000000000plee-the-bear-20251226/bear-factory/desktop/icons/hicolor/128x128/apps/bear-factory.png000066400000000000000000000361471512343254000301700ustar00rootroot00000000000000‰PNG  IHDR€€Ã>aËgAMA± üasRGB®Îé cHRMz&€„ú€èu0ê`:˜pœºQ<bKGDùC» pHYs × ×B(›x vpAg€€0á1š;GIDATxÚí½ieÉuß÷ËÌ»¿­^íÕëÌtÏÒ³c0’A´MQZ"´‡l™vÈ ‡Â´ÃRX YaÉ ‡BrˆA‰4é…â"@AÐ$3˜µ{z­î®½êÕÛï–™þð^U½WõjëéžXs"^Õ½yóÞ›™ÿsNžyíιµ &Óv³“Øùvlo´s¹Þ±/çÚþ¾±ÜÒ÷²±Ó&÷ôÝ&OüÑ™Šú©ÙŠúdµ '‹¡b;ƒØsÃP¡ˆQUw·bvûÏ®´>òƒ—ì “ œ ŽÑë-3¿\×_[mšÏ'™ý:P7{?z/À÷ññÙŠúËg§Ô›*©²RÃ…~/èbÄž‹AÊÚ}Rì(Ø­¬zÆ(fغ/Í­]®›•ëkù¯¯5ô/æ†ïú·ýµÉÝ¢ ôÄOß?åü7÷M9.øB± Ü-àÕ|ïXì’ú d>û#WÔpÁîJ°{`ð؉ê]“^Yο:¿®ÿa–Ûoù=ÂàŽÛå½ÃsħÏÍ8ÿÓùç#+äÖ›÷?ú€zÊ»SìÝöÀnw¡zvÕýúþ]Ìpàö€ôVl³‹‹Ù—æ×òŸ×†—ï$#ÚìÑìɪú_ž8ãýl1Þ°ý—ï’øÝÀš[ÀïÑý‹¶ÀX ]*""ŸVGÓ¸¹\­q"2¨wPÓ½êßîeˆÌ0¬ì…Ca½eZ¯ÜHÿÉFËü= u/ºg à9â§ž:ãþÓ3“Îé«®÷ÂÝ}ü~À :ˆJ qrᨡ2Xc¹øõˤ/_áÉqs`…í){`HõÎ û1Â6£Œèr—³—ß\Èþ¢1¼r¯pº àV òxî¼÷ß–éï+õÇ~·Õ/fÇáÉóˆ å…iotøî?ûŸ:yônÕŽ84ïöcˆ!)ïgß—FØ£´ÁjÓ´¾w9ùÝÔþò=À õαC*§'Ô¿üèƒÁ_=á („èý_ô üöIY. ìIij•Âp±­\ZʵÌldw=së¹ìù!vÊ8œ.¶ËÇÀ½°ó<Ã6̓÷óî´6bD—ùÂ;=áü'-Sè¦ö€¹Ë˜Ý¥ &ÏÏ8ÿú‰3Þ'Õ$.õ#%~0O)DƒwÌ çf_{òŒ÷‚ÜVy;•TùCç»f×¹QŽŸy á±ÊÔ­Ç\ýÂ+<Ô]£â xäßp»»Í {Aìa„=ÚmäaF͈Ù1õ¡Í¶k'öËÜ…îà2€õ(ŽU Ú|•/~Ÿ‡i9;ï“ÇüA@…ØsXÂc†AÉÞòž´òi‹ô5ÁtE}d¥aqf_|§ ðŽl€r$ÿæ üÿÕwÄ^ðG4ÄŽ68<Ä=‰8=Î-I;!o%& ¨Ð;rYÚ+Mº¯Þ p{‘1¥÷¸„`/nÓî¾ûh×ø~ÐI4܇ûö¤Ù]#†þùàHa· °Ûn¨wLü·’ÿ,Éì¿{'Þ18ŠyáBðÕjAHZ¶ÓûçŸþâôô•!m§dó+pm‘¨V#Är»e_#(Žìï¡‘“<{ÁÝÌ0òîáßà1™À7×ó[ß»œ>kaùŽq¼“›=éýó±‚, 6ò6ÀýÄ}ÁߺV-ü´•ÝXAÞ\&ܨQôff}ÿÃtÆË=‡«öíÛŒ¶hcHRMžä¤­ÓI0õÔ[ص…p,gÇQÏ?†˜»c¬µ´×;èNJåtõŽYî´°q³Æ¯_âLÚàLÉö´A_µ…LÛí!›Q+$y¦1¹&P½®i”´cwIþÖµ!ißÑÃbX ܪé[/¾zò8GW0YœáúÎñÆkï"éL³ðÚÙµeNO(ÂÉY¥Å$5XmðB«VIòÌÐZnß®!Vkx&U''ì7ÉqTþÐh`Ÿ®@kì¿=þ[›óS¯#·¶œýÄ…àS%Yv‚ ôõ‘óɧ‘ǰ쭱\ùæe&nÞdâÇÇœº³!áû™¬±të]_] óƒ<\H‰œ>x£l„=b'/ìeúÇW–ó7^ºž~èµlGîL+‘üÓEYÞcõ÷N‘ûGäXà¼õ勌]¼ÂŒH‘·VÞ |î9 )ˆªç>qžÙÏ=Íw×\rÛ6Ã6À¶³l'i—m1ðì»âä¸zÄwÅÇS¶£2€{z\ý¬Üe—lwRà|â)ÄDåX séë—©^»Î‰þÌ®È~¨Bê˜€±"Lì€>äzÞÉ;d_í2wÒ·“ \!§ËêϧœÃZàÔ¸ú´€±£–çHc²‚/?S ¥)ýŽB=óБ^f­eóÆÍï¼ÅY?dgä æÄÔ»Ä{AÖÂÕï\ãlV§RÞ1äÄŽs°ïõ뻚ŽÓÙò²ã Ú¢‰¢œuñtšÛ¯¥LGa1U–?¹g, @ž˜@”–\k-Í…:ï_¥¼²Â”kjX•™©*fªúÞ"t)O5 ß½ÆØÅ«œ,x Å–q×;—ìÀqëíc;p ;ÂвˆÖ[w¼©’úÈ`‚Øþõ¦q÷#k-[›Ä¯\£´ºÂIe®ØkÌ8ù‡ÞgV懛tªi\YÁ¾~ûâ&~áÞÀ¢عi0“%õ±õ–JÞe!8Q Åänõ¿Ev~ ž>ÁÀÔ­…ÆÂ&­?¼Beu•9Çô}Žbà;ÒŸ?qsLò}MâZ›üÚîEf“Žë°-íBì mŽ÷Õ»i`:a'P-ˆ @#„”ÊŽO–BÙƒo·Ù Øz›üKßE=ÿ(¢R¤»¸Iûõ›„«kœáìdeÄèÓ3äŸ}Oñº[”vRÒ«¸ó‹” toÞ@O ŽRï°c ìVïƒùöh‹Á,ýÙÂb g„`ÌÚ»ÀžÃ‰A×û úßf‚µ:ú‹/"…—kBîËîÆØrüGÿ¡WýíÝWo0±ºÂ¢¯®{j~-»%¶{¤}Ф#tb¯š=¡%Îe¹½uXÙe€R ÜS¦½‡½Bdù°–Øg0ÑQd?ö4ÖûaXò¿?-¾±Dö7yzÜ€Üòì Ä®…¢Ûõ%í»ç¨ÝÃí»•Íw…P‚3Gñªêð\1u|î76<ߣþüÙ Øj‰vzû÷®r¶ füöiÁ¶Øý£*@qÀù_¤äHÁ”‡2€ì¼? ÀB©¯þÍ™Yô'Xë÷7•gJ,´ݹ{«¿íÑ; i¶’¨ýò W‰#Iס D/Øw–N슃óØÀC?óðûvÖï¸ôÐ ç¹Ôv¨%Û!AÛu)í»ÅV ´Ý¾ýåà'(Ap”¼‡3À~¢|ÀéA×Ì…û°ÇŒó?S4rá§çÛ‹‚îÀòÃ}›äM7”ïmÜϤGߓК} xèsÿÿPýƒ4}~’¹?Äwn[ô^Eð¾¦{[5ªÞæÄG‹üa£3Ïœ‚ûfx}íPçÛûŠîŒj;;ñ^×÷ž‘‚G~âA.Ç›wméæ½§»Ã»Ð·Žg+Å÷º¾÷”‚rÀ¹ä÷—ú]Áˆ¶9Ü;?šòÜé3á `G¢:|l,‰x×¢yßK:õäîù¼²ÒÛ:0÷NžýÛî¨í{gtgˆØý“F­«ÛnKߵͯÞ3Bðøga¹TåÊæV› 2Ãnu9ph÷Ñžì½å p69ö@{„ ÖÉ=Ú ó}fw)OñÌŸx’·e™ë[K5v­%¼£êØ#æ;½#¼‡àXàXaâÇ!¿ëû+J^äñìŸy†+Á8k{”Ön–Ã%}{}À>Ï8 ŸŽøR»;Ÿç`ÇîÜ÷o´Ùe‡ ¼ËXt~W·Î¹+ä†.ÏüìÓÔ¸?X•$zõ6œÚ;C´&¾Õ–#l°¡[ŽÁ Gc;êpw¿S™‘ëë'*0°&л/ û‘ÎFƒ,•$ë¾?#Š•«¸ð©‡˜ü܇øý´Ì|S`FHÿvœÿPúpûŒl­¡nöøjàX`è|Dg'°Ö¢³žºÎ“ü€ù…=d¡iç}³÷ˆöÂÁŸüóÏ‘<ÿ/Ù1®7©aÙÛ}Ôÿ~íÍžÛEG^©9äá´ý˜úQ.ûà¸÷&ÌN´R¼Ð%‹sÄ>A ÖÚ}c‹yö´¯äÉáv€1ùŸ(Wqò‰9N<6K{£Ãüµ5ÄZ(KY†nLj8¡àX|µ³âÇbÂ'l¥ßàoÓ‘`7ÆÛç½ë;©Vô£w¼=G^.`&ÊÄ ‚’Og³Kqrôtõøäµ˜©¢=—îü:EÇbË…= ¤35v_ÆÊ“åÞ#ô¸$¤ 8YÙYœQ»U§qe…üê"³2¡äìôóûÛÚÙO }­ö–ÔoIèW Æ· àµé8سs4oÖ®C܈qƒ×6W[Ü|ñ:(É霡4µã-Lo­Qþî«(%°3¸î'>€:t1ÑØÞ™Fk,y¦qü{¿§À;%7p™>?ÉôùIÒîƒ\þ½«ä¯_çÁb†3ÐÞ£ ñ# ÈöС-²Ÿz4·f·0æÆb„@9.ÊJÜS´7›áÄ9™×{­I5oüÊwyv,#1’뿹ÆäO<ÊÔ!H_'Ñ ×ÔFã{{â^_b,‹™˜*’´rDÉÇJ9¤²:›Ý‘Œñ~'/tyô3³t¦ÊK_|•Ç£îöêâÁoÜ©ôÃQ»€¾´oõ÷CýôvhkéæšÜ‚ç÷vg4äRÉOâD;¡ãyªyå·^å‘bBá9Ê>è3ÿ•WåB¹$‚RÀ¹F+7•Z"E’áÿþëÄŸü0¶¿ÉD{£Ãâ×/òøCœZ £$ùµ[ä…ÎÃg0…iL¦±IJž[¤§Pžû¾Ÿ¦¤ÙG¦'xõ ¯ðt9ÞÖûJÿ1¸àØ:qÐØYÜ`Ñ::§«-ïá8ÆZÐ9æÕëÌyšçÇIÝ^¼ôúÕú&…’Ä ´R +§ FÄÉ&"•”'&Å&ÏscAªÍ6î囤îÇhÿýšvèvskM.zckkYmã-Ö„~ø]á€ã@ÑÅ-ø?´ȳOS»u–+/_ááR60RxgþÀc1Àvlû °`°ÄÚÐJ E!tÐXŒ5(!™9y–w Ñʹ·I„dá;WùpU’gFK%„¶Væ¹&Ó9¹6ÌÎBçJ92ÏR«¥°Z9B÷—]ý×)Õ6m\ÀÆXá(…ç:8ŽB`l¦µx銪–}Á\íhò`ûÃ$úƒ$àÜGïã[¯-ÒÊDj—GÆrG#‚cÌîs dÆÒÉ ÝTàyHЦÇ)Õ‰ifÏœCJKae“¨róÛWxt ÒÔØ8Ѳ›ä2NRâ,#I3ª“sh­‘J‘&]‘K<5†ž¨°y»ÎÒw®PÒ±h¶cÙÝÍétsâÄ`,R!±I¶ÙE^ºIøÒ›`ÌPÁ­ygÒón“Wð˜{lŽ…®êã0ºï¿g“Aƒˆ-õc¬%5†n&CßWXzÚ¡X*òÐcÏ"lŽÎ:ÄË‹„ßz{ žÑ´Ú™H3+Ò4ß¿T¢T®„âvc ¹Ö$yŽ~ä,yªyã·_gNÅÙÓ2zK!ö5’E \‰ã:&Ó6ÓÚ’a]‡´×»=GÔaw0ûÈ4™Úö&Þiß¿EGëúúAÛCôÓ´±$¹EH—bÁEHp¤$<}âyG ³ŒÍõy’nŠÐšN;a³ÞE 1Â`ŒÆhC±Táô™È’„ÍÚynÐ:#Ó9öì”ðª%^ÿ7¯1¶¹ŽïY´µXaq(G.Aè⺠%­Í²<7Æb„uñ\Ò[ë$ÚR:;ù^ãxÇTœ*y™Iz»–íRýÇ:|HÏã$ú0èû±2chu-Å¢K¸XkqÅ矤P,“%ušë7HºYž“$9ëížÀªžÄjcñü€GŸ|–,‰‰Û-ÒNŒ’,×tòœ±'Ïqñ+—0oP 4¦_6)®çP,ŒU ø¾ƒ1†,Í´Îu3ÏuÅJKvÿ ¼É1޾ûðû“ÜÀÅ =-p…Ý«ú'ŽŽ@Ç› Øúßç:m,íT'‚bäx.ç2;w–ég1:¦½y‹$Ni4º¦^o±¶Ú$Ï JI¤H)ñ\}äcH!±ÚÐÜXï­”cγܺ¸Fý{o3ææX,¦ßÍx®C©R­¨T‹¸žÂKgq·“4¬Ö!Jb£`te~Éñô>6Ù±Ÿu”L¶¯óEßÕ+è} 35†FÛx…ÀÅSŠ *qêþ `2Ú›7Iº1›Ô¬¬làXKœ””)‘B"„à‘§>Œïù`aþæuDè!Ê!Öué\¹‰ð|¾ú:ÓžF))¾çP/Q-…Tªc`sÒT“tsºí$èt“ÓJXÕÉž±äË›ÈZ¹QÇKb²çŸÀq×Ò÷™Üô÷Ü«ú‡gc§cº‚w˜@K73ä¹dv2Âw¾pêþGq‡výq§E£™±¶²*\«…6Jõ@I‰’ûz„±ê8Žãrñå?@£q>û!(¼þ;oâ[Có[—(c <){žGÏu(BÄÌ$¥r„’N½MÜI‰ãŒ$I=mŒ×ÎRÈRJŸÿEÇ¡ù8R`²õâkÄ?öÔ¶cé‡LnȺž3jx|Wàá]À.ks‹Ã2chv,åR@µà:ŠéÓç EâÖ"ÝVF3aey ™%‘£$Ž’()˜;uйÓg£"7.½IÜi!ë(º˜ú›7Ñ›˜®¦:xŽBI…ï: !Õj‘rjYR!·.̲ùà iœæ9©ÖX)ð|rÈ4¤r«ÐÊE6cü—. ßçÔmÄ8i‚#öî;¼;®ä(tä.`kº´5t2 8ÌT‹„¾Cuæ$¥êi\£Ó\as³ÉòÂ*6Np•Â…”Ñ—þJuœsGHÅòÍë46VQŽƒ4µßx‰å5&lL· ¡¯ˆ|·g78‚ ô‹(W ŒOâíó\j´1·68¶Iâ˜$ÏÈÄóC‚¸«ÉbƒÉ¡oPªç”·k¸þU‘=uî‡b½âú Jd;+ÍŒ¾QÃõw̃b§ïï$‚‰±å¢O©:ÎØô ŒŽé4¨m6X[^ÃÄ JH„r0Z"ûê?Œ \xæ9‚N«ÉòÍ+(ÇE(Íæ&›õ5<£É5`%ÅÈÅu$J)üÐ¥T)W"ƧNÒi®2ù4æ—ñmF74j q*ñ£5yÞÛ©C:.‰R‚1Zä¹1òòNà‰ü‘3‡6˜µö€…œ÷–¬±,ü`3¾Þ þ–¦¾žÀA&È­¡›|7`ªZ XŠŸ;†vý››uj«5òn‚çüIìdG)<Ï燞ØÞüý‹¯"¤ƒU.«õUÖ7W±F£„ ! ÏA)E°þXHur–$n‚hn6ˆDN,5ê“Or;îÍ*¡Ñ&Ç‹”×s¨Œ˜9Yar¶B±"¥”y¦ —n><¨D§­ß›.cåòjy‚cÿîÇlÏï[2cÉ´ÃÜd‰rѧ:s ¥õµ›¬­-ÓØl’u„¶%‘›mÜÏ<‹+%f±F¹éb€BXàÒËßÃXÈ…duc‰v§ Öâ)‰IÆZŠAOú=ß¡Pô)•Ê•*J¹˜Ü²¶º@§ÓhµPOœÅ‰(ñÒ@à(…ë88ÂA÷—&¸ž"*hmls3ϳ$WÂØC7ÐÏ“å)”#Œ^ºÛ”´S®}õ-Î…Ù¡àßõQÀ–ºÑÖg–R¡ÀD%¤2>r=V—nqëæUâvi,’þö±ÊADQO‹>ùÜ8/ÿ2ç?z–ëo½JÜIµey}‰8î?p‰Š–çBÏS¸®CTð( ¥"…ò$I·Íæú:íf›F«EZ Ù¼¸ÌÚ—¯1IÜ€¾Ñ©ðO¹„a£+ ”£Mžg6Nò̱Âw´á°O˜èÌl7²RåÝû(£´“ñÖçÀ™tOÙ»þ`+îÌ’ƒT>3Õ"•±1ܰÀÆÚW.¿E–$xBnûו”(×ì6¯ÌcŸ;ÇÕ¯]åsO=Éúíë´ê›t³Œåõ%’4Abñ¤ ((ýÉO¢æ×è~ý <a1 X (”B*§Hâ­z‹z­Æf£A+IˆóœÅ„²ëSðJ×qq•K„ŒOͲ¶x³×T‰Fë”\gY–i£”s¤Ñ€¥·éåØ\U¹÷A&íõ6W?ÿ s­5ü-ðíp·¼üãxæ ¶–Ür­˜¬–©VKø…2­v‡+—ß$cø’ÈQ¸RRog$×7èlv™Ê …b@×qè\8¹c4¬..°Q«ÓètÉ´î9¥º‚BèQFJº‘ÃÆ˜‡~í*«k«4Ú2­±Xâ®EàQŠ\|Wâ8jû‹žã“3ŒMÍ0éuLßÊ·Xò<ÓÚ˜¦ÄVTµˆüØGŠB4º¤¡¥P®D(…Tò ­µ¬^\¡þ­7›8rDßÿ³W €·4€ã Ǻ¹•ŒWÊŒUJh!¹uë:ÍzEOò·¦‡…¾‡r<Ss½‚DÌ¿ý+k¬m®¡uÞ_B¥p¤Äbi'zce‡Rɧ\ (” äÁµ$çÖ+W0‹·¨·:=/Ÿ[º± RðˆG ”!ñ‚Ó>ÊúÒmÚÍj­Ó<7A±à8Î Oou»éÜ ÉôCwÿ«&õ[›l|ç"Ñò ÓÂìõ@&°{ÒïŠ#hvŒB¡ Ê~P`j¼ R±´²ÄæúÒözûÍ<×Å÷„t(O¡‡beœ[×.³°¼ÀF}môø® ×`ü€Òù9‚Í&…rHT(Í±ÞØ¤ö‡ë—¨·Ú¤[‹A­¥Ýµ8Ò£Tðð]‰R½ø¥T<øÄ³äYÆÊ­ëÛM¢un’4^ëÆÚ)ù”Ü=†˜¬ÚPYœ“vR ãwï›ÖXêó´þð îÂ2ãÒô¦Ü÷‘ú­Ã]ÁÞ5ö°/òäynðÀôxÇuY¯×X]]FPb'8ÀBßQã#— PÂó}Jc“,ݾÉÍ[7¨56¶Áw… %ävÁ“\M(êqâåñµ%¦KS$Ý–u3÷òEQo·Hú«ƒ¬í}­+‰c>Q pTOò…œ}ä ü0äÒ+¿Ož÷–”™È1ÝõÖzgaɣ䜛C>xêÐFJZ i7Z³pÇ [KÖJh^Z$}ó&Þæ&%aöÿ=@êmìÙùJû2Àx@Jçsã•ò‰(ð©·[¬¬,!´E¹.˜þj]Û[núžàù!~R¨ŒSÛXçÚÕKÔšµ!ð}¡P±ûÚ„ãR( $Á‰1â©o¾µÆéDÙæâe·›Äi6ôá¤vÛx>傇ïH”ìõýÓ'ÏPœáöµK´5ÄDñè ä©qÙùý“áËo !4êÂÙC¨Së§šò̯lÖ©&otHæWÉn,c—6ðL¾Óø£€@ý(*³¼#À…ÐwrÏ•Y£ÛRëµ ¬¶ΟB>xŠÛ_|…I™`¸®C†¸žç„…2N‡+—ߢÖÜ@ÓÛ'$ÎÖxÑö´GŽCx¸ë”«¨ù|ë› ‹¶AœkØ^€ifÉRÁÄ„Oä+G!• X©2wßyê«=ÕïH:7KV›¸IîŽÝW«ÍûPKKøScXÝ“¾Qñå&ÖZ*³å¡t£ &Ó8žêE[Û 0Õ²ÓMÉël­A¶RÇ®7°í.ÒZ\·Ü÷“ú#ƒŒ¨ } Õ!3&}µÞÞ\{RN–™øècøg¦xó+—m/6Ý‘’Bâù^âGr W®\b£¾Žéƒ¯úà+!w ,,…ãzx®‚nÖsÆH‰Î ×¾ñ6“YƒØê¡™:k-Ž¥” ½{•’x~À™Ãä·¯¼‰µ†´Çñ«ëm…©JiÉT= ûÝ—çO ÏL¡¢áÀùÊS{Àxû›WñÞ¾ÎLam@l–÷ šP†Öq ‚sß:Þz¶1i¯²} “ך¼\)‡7fìá“ÑC§J’Å9·“ }‚(ÄóC×éqýÆUÖ6–ÑF÷_²~ÉΗ°¤G¸8JÈ3C'Ϲø;¯SYY¡÷,FI‹1’ñrHè;8NoÈyêü£H¥X¼v‰4î ™æSã™\«ëºÈE)W÷*¹½·×pË¥çž"9QD‡.+—V ÊåÙ½j¿[YùþûÂ`bc© ‹k(¢0 P(âyVy4ÚnݾŽ6k{3‚¢×ç‹nFôÀWŽGùTÆB*“®éÖ;ªsãÛ!ÛªV_ú- ûþ©JH)òpEP(09w,ܼôªm·›Ýv'V¦Õô;ÿÏ—I­@+‚kQBa-k0„”œ8óq§…09›c±·Vî!¬^Y#ìvpŠv„ä éÛÎÙ-Éû«ú½yÙ#õƒéqFž.…ä>i³Oü± ^*¹Ã n½|›1‘âû.¥R‘ ð1Ò±ÍnÊ­Û×ÈuÖ›#· ì–ÚÛ•ÙRÿŽãà‡ýÀŽé2Ê u£Ö›ë5Q[^F Ùša!î"Ï£Zñ\…ë¹LŸ¼!Kó—l½±Ñmwb“ûqžcGB`sÕ‹@ÖÆ ûFÈäô IDÔÖnCŒØùµ‘ê…×–˜òò]Þ[u¤Ö;ß@aíÎH`0?ìÎ;,õÛ޹/NmÝZÖ£4@4v²ü#gž9õ£ÖZâzÌúÕ5Ûº¼,ìü2WP.(DB:¦•ävaé¦J²¶ÀG ¬ìĈ¡9®CED‘OúV:‘ÝXÙv.Ö–É%ߪ¾Øöå™ÁhÅÄDDº¸®ÃÄÜ„”Ô×íêòBÜéÄ®0¹›è¬rï!½îFõV+ RHªS”Ë&ƧX_˜Çhc£‚§7ÛB©Í– ×0-œvRZ·6¸Ï5#-»¥|ètdÿo÷Ü{T‰¼>Ê>htÍpgF ¦O?uòÓW_¼ßþÁâÅ•Ëk/WUöáGfÔcRŠQD©T@9®m¥F/¯/¹nKo#'' ™ ;_ßêwETˆ(” ø®c]?J×WÖ½¤kÅòíy´ÑäúßUÞ&c,I¥( R 𜞫ÙóÒ¤moÏ_Ž;®‹ÎLkr»Ó}¾òp”C¦s”T”+UfgOR,•éln`tŽ"‘°n]gZ~ô‚Ë®PñúR/MPÞ°a6ð£‚~€Åõ®ýp¤Íç¥×¾ôÖ7€oZc¯‹xâgì´ü;Aè1V.áy>íÔ˜µúºÛhÖ· PzâÕ=N¼°Áòï|¿ÓBö\ÅQ!¤4V$Š|?LZ­¶wµX¹½@žkrkÐýåNÛ»ŽKž[á19øa±HT,c­±óWÞLÚØ³y®Œ±ävg£fkžãâ»BJ,? 8{ÿy|×GhCÚiÖ`ÍB’è‹ò¹‡>-ÏîìÙ¸Q£¨Ì0‡>"qpÇ~캖æÖ¶bûÍ£€{m ,Xc¿lýMàÛÀÅbÅþFªe^-‰¢NjìF£®677¶ !•¢ôÄýHÏ!ºošÒg>LÛ: ,JI¢B@¥Z¢X ñ£ Ír­’8WëË«¤i‚±=ÕoØömYÃ:STËÅ‚ïÇ&@n^}3m6Z®I3eŒEcж²…@ Eèùxž‡ë¸¢>ò¾ëEõÕ¤è<í€}µnä†nf¤aÜXnõ`äoô­rï×÷ïoŒ¶ìûùQ£‡Á÷6º¦–åöÅwÂkÀM`ˆý£ÏÜ(•Ëo•K%’̲ÙìˆÚæ*¦_Ha œ›ÂøúgqºÄ¦_DJIùŒ)U"¼ÀÏ´U"K·ÙhÑi·0†Õ¿Íս𿙠òªåßs)V'R°¼p#­Õj®Î2µe„icÑÛ )ñ]ŸÀóq”‹ïù<ô蓸J16>Áê­kH)0F›4¯hÍ7Ú3Õgäˆ?kz¶'†w{?Ð92èÇÞ•¡w¾Ú4¿gaõ¨ 0ŠÛ‡”–|®R/ùfœ›GÝ\Ô6W„¶f;·ò=*Ï?²Ýo¯]]çÚo¿ÂT\ljÊåˆR¹€ë¹Z[•wÛ­°ÛÍiÔ6zÀÑ[ão;†£ ë2Q‰ˆ—by )›µõleyÑÉ“Löâô{«¹5Æ|Ç%ò×ÅUŠ“÷Ÿ'¢b‰Û—·7‹°qÒ™Ïuþ+7Vóâ™ÏžxdT#mÈ“ ¹e±ï×Xût9‹vûìRõ:Š€Lc7ZöÿQ„c1À%À/}wÙ˜ çûAäZÑËLÞ3Ð¥¤üøŒ}ôQTäc´áò7¯ÐùÞEfdÚ[Àé»K®ç’i™¶[0Ë`my©·þß´è7ÔDŒVTŠå¢OX, I7‰ó…›7T§rkd¡é­WÐô§„¢~OõOLÏR˜Äq]Vo]#ÏØ8NnÇÖ?ZÙÈ^SSÅ_ §Ë#cz¬¥çëß‚kĘ~Ô=wú(F:ø­ûk-s+Îìï|8âÂïw»‡Ÿ|âZIúb’'xÓUNþÙŸdâ'?´=‘²~£FëÅ·iO3ÈÞ\ãºÄ™Íõ–w5«‹Ë$I†6½eÞ[ào}ûVXVâ¹ã•0 p\L}óÆ5™t9 €0Öö÷$ê©þÐ ƒ×u)KÌ>‹Ъ­ÓmÖl’$×Úæß7OÜŸ_\×ÿøäG߯þ½i Ñþ€:d]¿­² ©÷*~š?TÕÛ=סÏz»¦¨‡ŽòõpþÓ?ò¤oóv}óÿ%õ“ÅÙ’;÷'>ì‡QmJ²q}ƒ‚è9J¶¤?ðCº±µÝ¤£ò4“Íz“n'Æl/íö’óðà2^Ž(„>^md·Ý˜µŠÖ‚m{Òï»>Å(Â÷<|?àôù‡È³¥$µ•§É¥Î¸ûeçSÏþU' ž.¿Qÿvÿ6På9ä·OÄ…Ýu0j:öà‰¢Ä!ißí!Ü•g뙎­Õ»öŸü#1ÀÇžÿ339éÿÓùµZ(ùr5³ßxêg>µ~žj~ðË/rú íË5Æú†’ã*ŠQD¦%µõÒ¦2‰3ڭζÑbTÿvc8£ˆr1ÀB2“›µõšhÖbÛIЯxÏòïmS'¥K1 ‰Ïõ8yßy²$¦X®ô¦‡Á´ãÎ+]Çþ’úøÿ3B„}öäÛÈJ% ÊIKÊ]kŽø¾ ¿à¡'ýóú_YËõ»Ê÷œÏ?}_ðk¿ýµfšæ6ݵâ_ÿȃ§œþ"ªúb³´Ase‰jL¥$Å(@yË]ëØ®@*:Íæ€J3XÉÐd¹0=÷±ëõ¬þ0 Ètfê­®¨­¯‹­°ÁÎD‰†Ìôâ "?¤…x®ÇÔÜI–ÒØ‹W/¢µÑívëÅÍÍ¿;ßÏ^0Öª÷òýö-¤òl‰öMIEí£ö1´Žú®g²jm³\k›x\ðáÀó<þÖñ)ÿÿüõ¯woÌoš>T•©‡¦O…SÅmciãú¡Ø €BA±ÞÌȺM¡­¤ÕhbÌN?f„ÝÞq|«S“V j¹ç*ÎMn›„µåaò¼[ªk½‚±ß ("ÂÀ§2>NEÊeVo^%Mã¬Ùªuqeýï¼òöægCÑùy½Ù>’ýcú¢?=FËÈ}ýƒ ŒòìçèµÛÞ!$»ž=Ú‡`ÑÆÚë«úï[Ëí;a€}5À™SãêW¿ðý|i¥¶åRTÀÌ=û‚B¦í”öF‡KËL ·Ý½ïR.±ÊEÒÄqÝvcìΧî¥é±ÞH-zQÄQbäc„µí8µ+K«RçfhR©wKÏñ“[PÒ£E¢€(*PÇš«tÚͤ^¯}q~qó7VÚÿãéªø•&bõW¾Føèü³Ó˜Ü`âÛM0„¼“ [1ÒZJ?zàþÆÏV1…ˆ8M¤9Ü<¸gX¸+q?i<ßoqsÃ|·•Øz'àÃÇ}‡&'ÇÅ}g&Ô¼ôöàg¾"!ÄÇg™þKI'‰7;íÇíg‹®ÝŽB³U‚BDl¬nRÛh¡ó|gg1,8fg†4¸Ò!,˜¬”p|iÛqb766eÚɶ¿¾=4?€!µ‹C©PdºZé-Z;ëzH!X[º×êë¿~ùúÆÅ¸›þÍjAŒZÚ? ¸àþªäTqgÐ¥o\aí[oqÚKF·¦Ýÿyû©÷ƒ@?xk¡Ûö«7óçŒå;e€=–O±èñü‡Ï©o÷¢ÞåôpBk­}½[ÿ}–èßnÇ&™)Ëç{.Áôd™ÙÙ1r£ÙXkP¯wÉÒ¯|XeŠíMÑ QDaÈøX ד4;][o´dÒéM*í^‚m±haÑVø!ceJ…ˆ±Éi¥ðƒ€•Û×[««¿öúÛë®+òÿ²ˆh°»‡rƒžŸcò§ŸGúËE*se®¿µŽÛÝñ Žæƒ½HÔ÷úÐóò¥ýÆmýs™æXãþCàÑR(¾ûÖ‚É÷n– Màp XJs¾šä<]-ȇ¥ìmÝ’åšÅÅMš­˜$îIÊÐŽÒ‚ì¥YÒJ¢0`l¬DytÒ®m4»²Óì2JAYÀ ÛSýÊg¼\¢Z*RÃó\¢b™¥›—7–—>ÿÖÕÚ#ß~ÆÛŠD="éf„À;1>-,IiªÈå×Ö(“í,Ø<ì»úÖecàÒRþ/Z±ý»û½îŽ`©›övùY2 í3ƒt'±ÿNñéR æ’$§ÑèöC¶{’¿gÿÓWç¦çì }ÊX‰J%ÄHm[ÝT47[˜~¾íÛº# V¸” E&ÆÊ”Ë%‚0$*–ìòÂÚüÂÂ׮ߪ?7ð¸’Ç_±g%ž_E.þÉáïGc!¹,]ߤ$÷ùP•Ý•£‚>˜w0Ÿ±puUa­iÿZ‹wDƒ Š…ÂgþöOüw³f>±ðúÒu“›úžÑmÄöKRŠOGÓ 1Zl€mf0‰$\ÆÆJŒP¾ÀX+ÚÍq;ˆÞÕ`¢…$ð"&«*¥a¡@Evcmiýêùï-.7´äÙ“ïtïŽâcgð¦+{Ò«§*,Ýj’ÖÚ„Â ì! Nu ÷¶,ÿùuýõ¥Móç€w Xœ*~ô™Ÿy⟕¦ŠŸ¾õÚ‚ìlt¿ä†®<óôÉ'±~ÒJ÷cˆz½k¿ä9Χ#ÏNmUj·ônŸ ðý>ø[»{"ÑYN«“ÄùÐ0i§,V‚t&*e&*¥^\¢ïÙf«¾ñö•k¯¯­·Ÿ [ÝÓàw@Ý«ËØ\îŠRP==ÆÛ/¯P4ɾcéã>tÏ®ú 7ÖôWëæÏÚcÌöFràÿÜÌCSïøŠÉ³ãŸ}ô3ýé?þ÷>÷åÿ¯~ì»g?|ê Ê‘û.¡={êäuUšþܵü[Æì³úµ¥”‹•±Aà’FwS²Toû öL¥J ¡©–‹ Ê‘¶w6/¾}åÊÆFû#¾´C+9ì;ø™\ãMUFÖ·P8ûü}¬hï½v°Î;sûÎìÓN[ys½¼¬ciÓü)kY¾[àÃŽp…~øO>õ7¤”“ßÿÍWç»›ñ>öWžÿû^èžÇs&æ_ºýõ<ɯïyˆRœ;w–×ß¼²Ùìšßì¤öT%ËAó]ìü —ññ2ÅR@¢-ÂhZ­.­f—N'½ —° AXdz|Œ±r Ç‘¤&o^¼|õúf­ó„+m°Õ w‹:——èÞXÁjƒSŠ!ãQ5äío2!Ò>GógDgV¿½¬ÿQ­mhÝŪõ°ëÿ/Mœ!¬ø/|ïW_úÛ¯.þÇw§úäŸ}£j(³$½oåÊÚÿ‹aè3àÖZ—·¦)ãnÆçkm»ùü¸çâŠ>@)I©R(h!ÐyN»Õ¥ÙèÒn§d™Þ»S‹¡,Ž21Veb¬„绤:í\¾>£¶Ö|T ;ôž=tƒ`°6–|³CçíEê/]!¾½Ž‰3¤£Xþƒë8‹«xbgÄ´¯ÿ×ÉAΟÞuK­m×/.ê¿ÜMùÇÀ=ùôú–¡=z!oÄ­Ê¿ÿ½ëcÖò~ÿºCj¡k-uz´K/¸úº¯Ä_øsO‡ïÖ®ÜÐ= ™û¦çÎýè}Gca$ÕÑ¿Ö(„à¯ý™ÏyAp´-\? ãÓ½C **¼ðñ¿öü¯êÜ´êKÍoÏ¿tëßþà ¯ÿ²Nõ³?óüÓêW?ÿµ,Ž´ßÑtt¯7»WÀýíîÅ©ÂÉê©ÊÙ¨œo,6ÿèò¥Õÿ+OõÊA7·„k×ÖŽ´ÏÁt‡t¯@eê‡ç_ºfIžÎ<45{å;×VVÞ^ý;ÖÐÐh¼ëÃâÿèè^wX¾m´±¯}ñÍZ}¡þ…N£«ŒµGÚÁ⺷ôn™Öp’žwñ6=Oâûbü;½›c+EÏ£¨Ùñ0~@Ðô^Òÿ@ìîÚäQ÷M%tEXtdate:create2010-06-06T11:38:16+02:00{ëÞ%tEXtdate:modify2010-06-06T11:38:16+02:00 ¶f­IEND®B`‚plee-the-bear-20251226/bear-factory/desktop/icons/hicolor/16x16/000077500000000000000000000000001512343254000237565ustar00rootroot00000000000000plee-the-bear-20251226/bear-factory/desktop/icons/hicolor/16x16/apps/000077500000000000000000000000001512343254000247215ustar00rootroot00000000000000plee-the-bear-20251226/bear-factory/desktop/icons/hicolor/16x16/apps/bear-factory.png000066400000000000000000000017001512343254000300030ustar00rootroot00000000000000‰PNG  IHDRóÿagAMA± üasRGB®Îé cHRMz&€„ú€èu0ê`:˜pœºQ<bKGDùC» pHYs × ×B(›x vpAg\ƭàIDAT8Ë“Ûk\UÆ{Ÿ}ævæ’É\2fšK±­¶¥(xñ©úä“Rúïˆà“‚bßú7¢ ˆJÅFkÒd†1Ét2™äÌLæÌ9gïåCd$RÅëaÁâãû¾õ-Å¿—úÇ,ÿ¹d4•Ûþû› ÿ~10-Õª!G'xâ¬C™Ýßí§Ÿþ~”|$B¼ð4å»·s_7+掹±†~ù:ît‚Ùú/š£¬ÅZ!µB’:öÉgß<ž¿XàVÛÿàÚ+íw3o¿íx­*ÜÜ$½y§<ôÊ2©Ì,¢”W×™tÏÎÝ`½nîy›-ønÇè¥`¡Qzéy¤U#“ñ0Fa´f­æÝÐ9_­¨oÁ«•põ¥g:êuÈNÑJ¡ä}µ²¸°XpÕòÂo‘˦»7n3Y^Æ¢.Ã8'L¡8ƒèóŸÈÔTbEߺ¢T©€—ÏÀ[¯bSÇù?↠b+ÔW×áç} sã­=ôÁHìÖÄÉ%&ÚhÔ•ÖÉß™|‰éè„l³Éñàõµ&ýÁX›~$îp$6¶ €ädB²õëþ’Ëê"+¥¬™;¶·)]ßàÉN—ö†œÚ‰ƒ‚އcÒî!ÉÓ3âN›:R+î"€ùlÛMÓî ã®V+% ;ª’/2/.iÕ9§GÇevz¸‹Db0ž¹]L“ßzç<§ '‘Šã”dág ªP­t£Fà'‰ež:执ÝÙO¼úfõî ?ýÞ Ç_§wŠAŽhnÉesãÞî^c¶{䯽@ø¨‡uZáÉÀ~8åce²fµXnœþqöU­ä½·¨ûÏ5Ëõá0Ì.^M@%ì= ݃I$_>3m•Õò›Z)´VüßújœAä¹(â2%tEXtdate:create2010-06-06T11:38:16+02:00{ëÞ%tEXtdate:modify2010-06-06T11:38:16+02:00 ¶f­IEND®B`‚plee-the-bear-20251226/bear-factory/desktop/icons/hicolor/24x24/000077500000000000000000000000001512343254000237545ustar00rootroot00000000000000plee-the-bear-20251226/bear-factory/desktop/icons/hicolor/24x24/apps/000077500000000000000000000000001512343254000247175ustar00rootroot00000000000000plee-the-bear-20251226/bear-factory/desktop/icons/hicolor/24x24/apps/bear-factory.png000066400000000000000000000030151512343254000300020ustar00rootroot00000000000000‰PNG  IHDRàw=øgAMA± üasRGB®Îé cHRMz&€„ú€èu0ê`:˜pœºQ<bKGDùC» pHYs × ×B(›x vpAgxL¥¦íIDATHǵ”Ëo[ÇÅ3—ˡDR²HI–,×pl%vÐ4Eƒ6@}hÝ&@ÑU7útÑÿ¡+¯º,d$’vÝ6­­á8–凒’øø&/ïÌ|YPT¬Ø»éÜ;À½ßœƒ9ç|ÿçROý¨²úµ¹@?ïiå«“ÎY³œ¼$2Ò;껵‡î¯€}Z[ˆ½u}-þûŒ¯‹žVèTµ^"솤ê)€ˆàœœZ}»½õpòÛVß}ô8 ÷8øµµø—.$—Jè@'Ä.­àýìX+!•:©ÑÏSÄ´BkÖ ­J)ü„.®-xotG®ÖÉÖ'8_ô~óýËþX2†·^Âûዘ~ˆ7s(禚ŒBd§Jº×Å9Á:ÁXÁZ‡±B¹èϷƯôFnë”@Aâõo§vó ¥ø_?‰­4Ðå":îñõ²‹®5Љ&4˜ß'Ùî`¬ÃÇúùàãðç`>­_Íúºõ¶3D>üÉ^ÿ©à^ÂC](!Ë ¨\@ÜO+¼ÉV ÞO´" È¥ô­À~ðwââðÊEÌæÆ3#èþò óí#ŒqD”¥qOѤºÔ˧@k(P‘Aö¥ç@©gŒV–NT€BM·)ÐJ%O%š…[N2.éÔY$y:Azs•ƒåÜé^AällàfÙRQ¸ã!¾\&ÀʉîO9UðƒM:ebÍcÂG‡Ä›8‘³8º¡Od‘{L¶îI"—f¸qNÅ·k$.ž|Y©Ø“Æ'—ó°œ'umƒÖ;Ão4OÿéÙdZ+ăåÅE&7·)œ[Q¥UóŸ÷Ò>Ñ^ÃèýÖ• ¦«R+_µM BñØØ8O¥¶Ç¹ û´¿¨såü9†±8õ^Ü»ù}¯:½ŠÜ“L"‚Ýoá¦zEàŠ ‹<¸ó9¹ O»sL³¹Ïê‹q1ê=Ê‹KŒ‡ÎMÆ£3à¦?¦ýþMâ‡M¬ûšÉåÅÔò±‘Og Æïï‘Y_A<Ïnß¡”_"Èå\+<’àêyÏ„e,¶ÖÂv‡L¾híT‘ÈbÌR%3•ýÑõ«ºvˆ+»d}Ÿ|2%w·n+?–¢T^r÷;ûH«çå>º ?}Ƈ[$ëÓÄÈI ìÉY:3‰ÛïþçíTg(í9D!OieÉUîï*,¬¯.Ë£wGý­KW‰’Þ®1SkÙéE7[¬¡…‘ìÌB1ÞÛû™Ô'.# •jC ÂR¡Èá~M&F=wy“(Pw'××2âcÑcàÑcOåÈþ0ž§FîØ©B³ùš56Þ Ô\:Ãh°oŠ0ðJW–~¹úÕ_ï}Z½ÑîÚSžùE&ð“ó… ÍF|¡€µ¶[«Ö–ÄØDÔâ&†ìw/Ó¹µ‹8NIúcyøYÕ¾Y*³yýæ`Oiµég“ÙæAÿ½z×ýIÁÜ 7¼èûñ¤Ÿò'ûµzZʘ9®wéÝz4ͽƒa(µê‘ûÃýºý•qTÏ ßcŸN‚|°|\i^^Ì”Zǃì7¯ut­£Æ7ÎøÙšOƒïý¯ÍϪ/ݰ\éŠ.%tEXtdate:create2010-06-06T11:38:16+02:00{ëÞ%tEXtdate:modify2010-06-06T11:38:16+02:00 ¶f­IEND®B`‚plee-the-bear-20251226/bear-factory/desktop/icons/hicolor/32x32/000077500000000000000000000000001512343254000237525ustar00rootroot00000000000000plee-the-bear-20251226/bear-factory/desktop/icons/hicolor/32x32/apps/000077500000000000000000000000001512343254000247155ustar00rootroot00000000000000plee-the-bear-20251226/bear-factory/desktop/icons/hicolor/32x32/apps/bear-factory.png000066400000000000000000000041661512343254000300100ustar00rootroot00000000000000‰PNG  IHDR szzôgAMA± üasRGB®Îé cHRMz&€„ú€èu0ê`:˜pœºQ<bKGDùC» pHYs × ×B(›x vpAg ‡úœVIDATXÃÅ—Ë\ÅÆU÷ÑïžîéžgÆ6~ŒÁ@ÂÃä ¡(›lÊ.«l²È2‹üQVYD‘²HEЬlP$,#0Œ1öŒíž÷«ÇÝÓïÇí[u²èžöŒ b„RR÷=}Uu¾ïžû¯ªáÿ<Ô74_¾vBþDÆy}&缞K:gc¾šÐJ)¥@©ÁŒÝÕÒÿ X+a£c‹5óÎâ¶ùC­mß} #1ýüÙþïsI}Jk…Ö ­:G˜Â$bt.Ï“2Ý>þàyEÀŠ "XÛŠá›W–z?îÙüJ#ÎÏÏFþè»ÊsvÁ…>÷êÌ1Кn©zëß$‡À2¨‚ €­•!ka§i–ß¹Þ}¥Ó“[_J ÓϽòXô_WùŽ£ÐŽF¿ô6ÃÏ`k-Ø*ÃrÏ„ ‚mwq[mdX;5v—@ÿz§næÞ¾Ö9k…Æ.¦³ß9?ù[:®'ݘûä,úÙ3èÃyˆút®-IFPÓc¨ã“ȉ)ää4<|”öÑiÚË%’´¡û:ꥯʨO>4xwêöï÷U ŸÒ?xùÑè_Üüþ÷ŸE%bØÐÒûè&‘gN¥š­±Ðꢢ>Å*æÒU’Ý&ÆÆZB#´º¶ñæGíi+Tôn‚™œûšV ïùÇQ‰½Ì[ï“lÔÔNÚÑèT å9hÏÁùøZúâÕô¯Jóur,í|ow»dú)¥@>[ ÷ñ-"wʸQÞKçD`w„ËEâ…â[e¬± Výö”‚lB?½U5ÞG â©1¥²¼‰ç(”Ö„Ï<Š$ãD {e‘± F¨XÔX)O冕Û#†ý-™ˆbN>8€~áqvŒ3LzoâÁ­!î0öø§€D¼7j –‰Qò m«ú5ôˆ»8û#N¶©bïN·Æ`zæ+I¤NMP{ñÕÑí`†¹eØ£Ù5+t•É õ.ÝOpgÆH¯¬ž »Z›ÌÐÓŽç|i•â‡3pø,ÝZ›ú¥ÏI®­#÷0¸û ,ë]CC4Óa”ÞG·qn®Jôƒ[Pj²ý~àâUÔ_?´ÞÜR?ÙF$#ûêTtä¾ Xc!Ô³§ÏVÊØù5bé¼ò#qÖŒ¢yù:ÑDÏsƒ°Ù±ªÙ>°6ÏArìàA¿°ÍÀrtæžcX-¬0’Í3‘gK÷hŠLgˆNb³Xî\]Òþ?>Ao”LÂ6ÚýÝò‹*`¬ÎŒâG¯Ïá>5ËØÌnÞºNgs›©‰4Ç¥¼´FE\Áõ¢˜kKCU­àKÁ+×V‰U*X{wûÞGÇ#•J°87ïŘé$˜ûücÂvÔDžÜ“§(,,±¾RfÜq9|hš;õ0LF‡)ÄÊ}}fº=*?þýŸþîyÏ+p² 5žÏ¥ÓwŠ$|Ÿüä 7n\%lÖ‰Dãd¿}ŒÒ‡·Y]Ûb$žfêè1JÒ” •Ô¹Ó®ˆv ‘„ÒénW ¶n,C7سU÷õ¶€õ<Ç}åÌ»sä£q «KtêUbŽK6›eka‹ÆÊ X—ãÍЖ®)UÊ8¥ª§//Ò=9†—O±qáÉZ íàd´{Jbø»N »ÀÄ3?ÙÙh˜\ϲխҨVˆ Ig3Gé\™S&„#‡&P»ðùg:TŽJ¥Fp‹ ÛËúºX¼í2¡ºk6²xPzk¡Õ•Â^ ¨ù‹·Sÿç_ÖÒN»$¾û4#£iFr[¸µ¨Bk‰§ÈdS²t{^VÔäØ$³'NÓêu>Ö'Ó^ßÂÁéÇ!4‚Ùs2ÚËM{q/6š6z¡9ï%ž}ŒúÅ«ÄS)Y,¬:mà*ŸCã9Y*,¨V/T¹Lž'g©Ñ˜o=:“UŽÆ†¦h ´ì#b ø԰WÚ\Þ×ãù´º¹Z)trãK[o¼Çh*ÎÒ¦ª·Ú(4ã£YÖÖ7T'ð"qNžœ•ÂÍù–7‹ WÂã­ë+øù4Á.ð´Ü¿¡)ÍÏØÓ+ŽRJE~¶Vmµ—>\½0âË QéV»‹r`"Ÿ£ZkÐiˆãðð©YÙXßX^_];e*lk¾ïïù´Zƒrm :†Š·ƒö+l›_–òÛ}™K>÷𫳿žyâð‹«Ÿn\¨î&èž‹ùê¡ÑLŠT&Æv±ŸôÈô´TkµÊæúæ„®XxPª£#>É33”?Y„=¨^¶Í/6*öç÷YtÐ ªÍr«‰ž·¡Ý©n7>-5äO­@¶¢¾úVm§>ÒëYr¹,"ÒÞX/¦­ †ÿŸÆíMŸ,Ü·ýµÜ”÷æ·Ìvšò»/rHµçª{7{7æ«çRQž9õP>¾¸\ÊÈó… Û“ÅzG.õ ײæ¾qììÌO§Ÿ| âyD#þÿ”çëŒIÇsF¿iÿÅ–)£ÎÖŽ%tEXtdate:create2010-06-06T11:38:16+02:00{ëÞ%tEXtdate:modify2010-06-06T11:38:16+02:00 ¶f­IEND®B`‚plee-the-bear-20251226/bear-factory/desktop/icons/hicolor/48x48/000077500000000000000000000000001512343254000237705ustar00rootroot00000000000000plee-the-bear-20251226/bear-factory/desktop/icons/hicolor/48x48/apps/000077500000000000000000000000001512343254000247335ustar00rootroot00000000000000plee-the-bear-20251226/bear-factory/desktop/icons/hicolor/48x48/apps/bear-factory.png000066400000000000000000000072051512343254000300230ustar00rootroot00000000000000‰PNG  IHDR00Wù‡gAMA± üasRGB®Îé cHRMz&€„ú€èu0ê`:˜pœºQ<bKGDùC» pHYs × ×B(›x vpAg00ÎîŒW eIDAThÞíšIld×u†¿{ßPs±&‹d‘ì‘”ÕQ·f%–•0dyaeBœE¼’ì‚^N€ Œ ^eY‰ÛA¢ BäD²c V,u»w·º›l6g²Hk®zõÞ»7‹XE²Õ”ºaor€ªwo±Þyÿιçž{XðÿòÓñtȇ¸Ww_?¶)f'’ÆGãòçGBò\È9!„¢«Hˆîõ>PF÷Æ<_7k-µX¬«‹›%ÿÝšz]k”@ÈOjÒúóóÓ@ !„AçE‡…Ö eO¹@ï#ß7¹­õð¸{-7Ô·ëÞß.ïz£5õ‡%`ž5¿zaÆú#ÛæAàR„ˆü(âLMâ!Ù~ýòNù ñ;ö×]Ѓc­QD”ÖlWÔüû ΗêŽþá'" ¡ Óö7ÎæÌW…ì—CÀAŽ&Ï?cÉþ}nË¥òÍwÓÍáÒް|€Rûã–«[ïÜr¾T¬©o\Æ…û›³ãæ¯ÈžÕ¥@ X´M ;Æxù90þMN©ûöeÒÊ!…]ü‡,ß³xïªTw¬4JkO·¿{ÃyµÜPo›ÀLÆüãçOÛ_“=ËKiJŒ_ûEˆ‡;ˆh_¡Öw¡°‡Qo‚!è/_¡›mt¹NÈo#Å ÕX^k”ê‘Ù+¥©¶ôîw®µ.x¾^{ €%æ>>x%hË€è‚7ÒqäÙ6x;À>•ßÎÁä(Œ§1&3XsS”“)Ü;넌^Îûk§3žY¨¨Ô9´‹fãÆ«SØB€ùÌ,"½­µ"޼ǘS…Hèc?ŽHß'hÞþ²Ÿ¶ù´ñË€5xŸ98ÉÄäK¢»›Š‘Nh´Ö÷àÊÂÛ»˜R fr¨Lâ‘÷v*È;+¤ï­aX t´î‘РбL-q®åêËGˆ‡äcÐaì¿ý#T6!cŸ¿ÀBb Çë”ô«Õ#ð þá~z_R àG#(ï0HßõûWý ¢Á0%cŸ;Ïî§Ÿa7“¥nhiѯ—:(Cq¡{à…èÖ( 09Fm³Bd,Æî•B“I‚a‹à¥›¨ÇOC*†Úu‡@4€ò½õy,9™“™¥©¬îÑxïC’åÝ¡ ö# ôÙvËÞŠãcl¢ ŸD6ÎÆµUWoëÖU /ÁrG¶Dхл×Ip&34F“X#¡¡Rû㈂øtŠÈø ,ãäêÅþ î ZÄ=/4=EÍhÃàdfšøÝÖïÑrÂsEZ˜B!D+fãËìn)®VÐW—¼Ø÷.jáùŸh] …—e~n––' ûQú ¨:šd2ÌÜcç1hR¿yUmÐr}‘Ÿ™¥Ýt¨p÷Ú&½]¤)HưƒVË‘¦RJ#‡iXt$‘OPñÄ}Ût^ާÂf:‚d"ÊÒ¢ÞÚ(a?sáY<¯MãT–ÍÝr~…@Ðbrvš`(À^±¨4[†qã÷o‚z8/ˆ!l‡]ph+­©9pöTŽìÄ8‹·¯Q/–„eÚœ˜ý¦€J©Da­„Ú­‘NE˜šEBÜÛ.R­6-Ó10¯¯aÆ‚˜úÞssŸ¸U^+‘ªì|@ã+Òé¹é)o]eosûéYÂçÎL²²t—ÍÂ*z»Lz$ÄÄdŠìø8ímꋦÊׄ‚!é8jq˧Ùê?ÃmyKC”§h¾ S¨~h”!(­Á13çÆµ«x‘PˆPìHŠ[7¯²^X#’Š‘|ñ ¡•&f¦Ù\]gys“rÕ —´‰EãXfõ¥=ÚNÃxªŸŽ<ÇC 1ƒ]¶k»o\$¾·³ŸÒH¥}¾bjr‚å•%œjÓ0GG˜Œæ¨-γº±LÄx¥6êö&‘3“l4êÌ/Þ£Tn3G™˜:ÓjÒv¦u2k ï?Ðèô’´:Ú ZiÊ×–)ÿãÛ„¶ CàÕžë{ #;™K'K•=êå2¦Äbq2ãS,.γ´ºHD˜BbŸ;ÁØH£ärûÊ5-S‰Glò§gÙ-là„ - ûÎ÷+\·åb-¤y8;yµÎuZ×1*UÌAàC ±ûˆeÚ7<[ÌMкÜfÔ„D:ËÖÎK+ …Ä-DÇlÆ¢”ÿå{x^›VK02:>Ó¨³çÖ ¤CÕd¤Uia…,„”..–Ývñ«M¼B ½WCk…Ô àˆÞQRG¨˜ÿ©lV ¶ïÉMRn:,.Ïck%$HƒD"N¨…^|ë]!¼6ž§‰‡¢d2Ib#)î––ÜæÌ¨íýð:¦4ˆü·5™ÄzÃ2غ±‰õƒë´„>Üì:|hÞ !ϧvcî幯 Ë T.ÝåD&‰£„^\]†CH4OŒ›ÎꥫóB:u´(Ï`j:Af<ÏÂÍËírÑnkIдvHl„Òí{˜çr`›4~¼D’Nû¤¿9l7gØ ¶^8´ˆ…ÙÕ+ýé¿ýSºXÆ„ÔâÚ’ˆœÍcÆã]ð1R£)miKlïî …Àu5¹T‚ìDžå…½J¥d»Jµƒ„BΞ}·QsåXrC„xm}¥À×tWàõºŸëÁþPgÝrõ•C´Ö…•Ëk_žŒØ‹è¥5©MIú³OãŸÊG˜˜ókõ¦,lpét×"V„üdŽÂÖš¿·³c:¾iØ$ã ž8ÿ †ïÒjÖßqÎæ}LƒF±¥ü>` ß­WÝ.ÞNU}_kʇ>à—]óöÝíËöÉ,ùßz…õ÷î¢/Ý"5šÐ¥rK¬¯lG{h@*‹é‰Qªš*¬o®¯pµ Oprö1ðZTœê¥õ@ >‘ÉøžzØÐþ`Kq¸êöP×Kþ×f¯~>‹„-’ÙÑÖUçµÌ+ϱñÞ]œ+ D#!¶wšbåÞ†l:.J‚T’\:…Òë+kÒWG)bá8SS3X¦¡WW–ÿ½öÔT:÷…§^Evòh0¤å‹®Åõ‘ ÷=±\)(ÖÕÍrCë¾ûÀäDÖxïâ-wl.›^ý`e¯qe1™44¡HœBaß÷ЦB(ˆ‡cØC¯­ník|4Ò 0=1ÉH2©oݼþÖÊÊæ‰¸_Ÿ LgQ­62 úÌüt¿¸0|æex÷>×|­Õü–ÿû€{€ˆ-ÚÇÀ¸„ž˜2ßœ=™Ý%oÌoù_Û*«?á11û¹¹ßó}?g…,§UsÖ´¦X¬©ÿ´…ÿ«Êuã=Å¡@€üL––ãP.6:©MhR©4ÓùIÿöÂÂòöfaV ‚ýÃQ÷ÕÞ®y|ŠH6FŨՕ{•°fpË»þ×7Jê8ú8€!ÉÏNýEbbäÉçù×î}°òŽSu-ÛÞÝkˆo›Ò)h‰ !ù|i ¶·Ê8m€P$Ì陼ZZ]ßÝÞÜ™ 7Ÿ~´\ܽ:HAt*Máâªt´<¥ý…-õg›eõ:›ó‘"€9ûÒ©¿ÌžÍ|&=“ ½ùWßýl«ê\ï~ÇÎÄÄžµ¾2š‰ÄV›f³ÝY@¶ÁÜ铺X)W6×·GŽ[òëÁQë X×—wÕ—[®~÷AºzÏ”ÀFš›¿(ét\þv2$¾ Ч,+ŸÏ)!t}u¥íéºïÿ‰@îã×}Ͷ.–ú¿vªúïmýæGYý(KŒ,æž}"g]ý°0ª|mKë!(¥©·=}ÏWܼO‚ç2q.÷Ê‹¿ûÂkÁXàDï³D4Br$ö(~ªðPr¬†çúM'>ó=Õ?™”juxÈß9ü$EÑŸ6ˆ£äÿ™SªÆ8—Uº%tEXtdate:create2010-06-06T11:38:16+02:00{ëÞ%tEXtdate:modify2010-06-06T11:38:16+02:00 ¶f­IEND®B`‚plee-the-bear-20251226/bear-factory/desktop/icons/hicolor/64x64/000077500000000000000000000000001512343254000237645ustar00rootroot00000000000000plee-the-bear-20251226/bear-factory/desktop/icons/hicolor/64x64/apps/000077500000000000000000000000001512343254000247275ustar00rootroot00000000000000plee-the-bear-20251226/bear-factory/desktop/icons/hicolor/64x64/apps/bear-factory.png000066400000000000000000000127601512343254000300210ustar00rootroot00000000000000‰PNG  IHDR@@ªiqÞgAMA± üasRGB®Îé cHRMz&€„ú€èu0ê`:˜pœºQ<bKGDùC» pHYs × ×B(›x vpAg@@êóø`ÐIDATxÚí›YŒeÉ™×g¹û~sÏÊ̪®êZzÜî.—÷xÜv·åy4b€bˆ‘Ða„4 à‰E¼ð0ò H€4 š1 »ÇLì.ÛÕÕÝÕµdfUî™÷æ]2ï~¶îš73«²ÛU6óI7Ï9qΉóýÿß_D| &&ÿ_‹x†õʧ\gðÿ"v4$~i*i|)—ŸŽ‡Åň-g¤Ä€ÃêÅØ—Æ?¬Ç.ú×ZëÞ\_4ýè ©n—êÁw* õ ¥)üÌ ‚és9ó+&Í¿™OÈY!º`…èU(bt÷(z÷Sñp´F÷€÷‰è_÷Ii¹Ú]/ùßX-ø_m9úOÇy|سã￸`ýãDD&ûVîœ÷÷Êu4ŒNÄh·}̃óì#ªëz@Šî§G‚>B„ W Þ7înûÏ ôÊ3!À4¸p}Éþ/ yó)N>R²—áâ"ï²¢áîÜæÚÁö©m@3tùcÖ?r>rl8ºñΊówË õΊË8ËCQ[¼úÚÕð[Ó)ãùQðR¤ù ¦¼²ˆüâ Äâ"´­5[Éi!E÷}!zõH÷Z2^6rÞõ±áQ,{!oþZÓÑÑÖú6ghO$ b‹W>5ü¿RQ™€îǯ¥e"ß|qu Ì£U+_Qüöë%Ìx!‡@GëbxÝ'Ä(XŽÖ'X 1›6>Ûruâ ¥¾õS`Jæ_»þãTLæ=å$]ëIºVŸH¡~á"íhûSÏ#fóÇêék´ÿ÷mfªELÉqÄ£DŸŒÓ¬/ŽZŸ/ -`:m|¦ÒP妣ßyÆÇÅãSçí·.Lš_('qYºÿ+o@È>ö²_kÃfQ¬b™਩•Fûºí¢ë-äaƒ„¡ïŸÜÖGË5J 况£Öš¶«o½ßyµãé[™€É”ñ[¯] ýÛ~›—¢oyœÊ"ÎMB>œ±¸†ÆÃ"öêátž›CåROòB/`ïö6¹î‘‹ŒF zJWÇIPZ³Y nþ`Åy•SR'6!H¼z1ô{ÑH À 1ŸÇüâ äK—ÓYD2zä=·åÒº·EòÕËè¥t4|&ðÒ$gSìû&nñ¤¡Bô¢˜@Ù[ù;tÿÁ±þ9W8 –Û®~ïÌ06¾ò¹+¡=L†ù™«/œ?6¤kW[˜u¬óSgû$éÔT¡J,%‡Ð€0 <ǧ³{@°^ ´¹GÒ žÐojàC/Ùªï}ÿsý$/8ÉÄ‹çì—ŠÊiÑëæì7^Ƹ²x |ë Mëëïm¢ž_xj˜!+‡Ha™HËD3dÎʼn<7ÍF R•î˜{ÜôѲXHL®íûßô6Ç¿ulÂbx!jy 9Å)Õqo?$¶¿ÕÁÕ%Ôdö™‚ÖJãï”±Öv‰íI+eÒm÷ôÆ4!4¢¾?WB‰É«@h=–€xX\#þ£×w ¶ X@hÐ#tï©©,þ‹Ï?SðÕ{»L|f˜¶I0ºœvŠœÒºý@Ý HÆ¢dSY枣RXa{cO¸MSšDbQ>ñ©ÏPØ\ûa/€ƒ·~L+b’IÇI,ÎÓžˆQ¿]¥Þleå“ùƒï‘MFÚŸý*ê¸)1L¡Ÿ9ôÛŒ¯N`pù\ŽÙó—¨U±¾ºFÐî ›°ióÂõOÓ®R;(SßëЮì#]Hdlb‰0 ‹ÓH!xÿ½m¬Ã:Ž&Q¯¹X„Ûùݵ~ýEñQ2Èg£ØÅ3’^?IŽ7 JCËSÌä3Ì?O£¾ÇúÊ#œF ëÚöÕ®ý†a°»¹F¥Q£Z-€£IÇÃÄãaææó$ÓYZubªMuñ|Ë0ÉM&ÉM§¡í)íSÌëxüþƒ"ÉjylmáŒà)…б¸0O¥Zacõ†R„m)LœKóø°¾|—Ýrv»NúÒ9šû’AÀÄT’üÔ,•ýÛ;{ìyšàaLB¶ÂdRYJm„PtÚ×r¼È¸%:‡„˜!“"ëeÜoÿ„˜ Æ–ÔOö‚cµ+­ñ´É¥ù:¾Ïêò]lºkV(Lâ@q¾dSÞÈúÎ&ŽÓ$i™èD’D.O¬Ö$ùÜ"íJ‹GÖ(×ê´ë’¹‰á$OO&9(ñ·Dq{“åµ\§MÂ2ZÒ¸µÁÜl’ÌÒ,»1ƒÖîwÁw‰HŒxIJlæ/<Ïæò]´Ö¸žÓÍeòÚâQ0Zc…LÇGša<~ÖÞØ¬ÐøîÂåÊ‘%ãk‹O$`2E&—‰gR©­"|B`Y6‘X’ÜôåR‰{Ëwð\‡¸abKIG„˜üÜU&.–ãáÛïR/W…çšÌåB˜†ÁÒå¨wñ hµ›‡FȈÙ_|YŒ&WT ðÚ>Ñl”ljòíµ"íÛ1v÷ £Ot÷á:âYH7&²ÉüÖî6b"»]!,!™LHgiw\>¸{ ßs‰JKJ|%ˆåØŸ\d»ÔD½õ>b¥4­–&—Œ [LÌ-à¹.~Cû¿x wm?•´5"<\YöÝ·åMGº kÕMo+ ®OPkáïàm—ñ7‹ÈŽ‹9|Ôê#dœ)6:ê~Åt+™_¹1Q=ð[eâññd%MîÜ}Ïs‰SH”ÖH+BÔ0Ð^ÀöÍUäîVwÊh6ùt˜d:Cvbš•;?V-¿Ó ¾ö݈eYxá:ÐD_¾D[Ü–K<`çö‘›ïcKÐJu7©áöAײŒï[}Üt÷ygœ€ÑÆ%:¹ÉkÓ¿ñù\xq’ú{kDB&™Lm†¸·r×í`#1…DÒ°I&cLNçuù;+Ø÷—ѽÑm» 3¹ñx”Ùóϳ¹r'è,¦}ùË7¢eáPo´‘[5ÒïìbÜÛ€×JSÿÑ*¦ë¢:.ÊõQFéá¯Lõ~Ães=(,”¢ J×çñ¾|åŸ !äán «X&?—ð#¬n<¢Ýnbjѯ5RJ©³K“ºÕôay_wc†çibv„l*ÂôâEŠ[‚ba'¨¯·lç‡1M<¥°ì™ü ¥âª.1®?@y½J¬QC™ÐOïŒg¸NÛB7ðˆ±ÝeW»bã4Dj&ùš”âò­ÿú“‡‰ýÂ…¹tŒH4¡Ö÷vD³U†40}ÑKÉ™|Jµ[ØX]m§ƒ­!ð$ ³IòÓ³´‡ÁÖÆªvœŽíkMÈX†R°xþR2h¹´Au¹@ÎŽî'`dåè½ñ¡o¿¬ÖÑ€æiM@îÖv¾ù;òƽoßÿ„ t6“f»\µªˆ>7ËÜßúUüÉ,A2gr6¯´0ÔÖ£-Ñl5ñ{jøžf"•$—Ë" S­-ßÕ^Ç5ÕíOc¡Ñp„K—_ Oà´ê¾ã©ï™o|r÷ww*÷îîüè¹»Ò7wÿ»ŸÐ<”ÖT›êmNˆ…}PÀ»hô¹¤=‘Ï­í6ÏWJB H½t %Ž&13Ÿ×†mûÛ%«V¯áÒu}­4!#ÂÌd†p<®.ˆÓvL_øZ±#Ä£1æÏ_$žLRÚZÃqZ?>L%ÛùxHôÛPk¡FL{ª Ê[|¼,ÕÔïŸÔ ŒA ðáN3Ø9ðþÇ~µHøÜ$óýMd>Íò¿›ðæ™l-Í`¿PµJžV(ÑýP&³i¢É„ÞX{¨[õ¦ ´ÆÑ !,Ò‰$Ó³óä''9,lÓqÚ7·Zþ×"×f¿øàÎR±ü’%I&*îêúø‡Mb×Î!„ ¹˜cëö.áÀ=²üuè¡å»ÇõRð ‡ê·G^;•‘œJ¼ñæ?|ý­âÊ~åÚ›W^o–š¢Sw6|Åš°?²„ûçÍÞƒþÊÑÄdŠÜD ?¨–ø¾¬$v˜ós3$“IÿîƒåõÊ~岨ÇÖF~^µIôÂf"‚¶ðÃašv1z‡ž±)ïqð¿»s ~‹Sß8ö¹—g{ó'Ûû‹×ç_ºü…‹¿‰K[ïíü'@ !ÐÒ\Ý)wþ(b‰×ÖÈk á°ÅôL?(hÔ;Ý ÁÜô4ùl*X^_/”‹•E!£`Ç¥¯|óþnµ0$áT„ýw×±PG,|ÔúC¯ðí-‚²_×ÿè,àû1 ,î«ãÆȨ̈¯æÏgC[·wnýÉ¿ùþ—”¯FžN$ä¿XÈɯdSáP4Æé¸ðBjrù<Îͨݽra·”c[ŽN[ xìÚþi1 ×æË }s½ü/àæY€З|$þ ºãE3‘‹À›•Öÿ<Ñm$'“òÌçÍ¿j¢“º¿”Ä“.--éRµz¸µUHâ=Ë2ȉÞ1ýGÌ(T¥©ßÙ=T_m9ú¿ó1þ³llëÑ`\`ž@¤$±Ä/'#âKñøt4Ìùss“ʶDycs ­¯>‰}â)Z£¥•ã³Ûrõûõ¶þÎa[-P|ø$=ÏJÀO-¦$ôêõÙðÕJ¸zÐyºûh4žîÎæ:ÀÓÙqñq$5•\úìo¾ò¯Î¿²ðe!Ä‘ŒÒD*.æ¦~v»§ž‚|TeE½ÔxÞi8Ÿ¿üÆÅ߆8’¹¬u<½±]øùYçg$)à×ã±7ÞŠü<ÅàéÿoðÏEþ/½‰ãúìä%tEXtdate:create2010-06-06T11:38:16+02:00{ëÞ%tEXtdate:modify2010-06-06T11:38:16+02:00 ¶f­IEND®B`‚plee-the-bear-20251226/bear-factory/desktop/images/000077500000000000000000000000001512343254000216645ustar00rootroot00000000000000plee-the-bear-20251226/bear-factory/desktop/images/CMakeLists.txt000066400000000000000000000001411512343254000244200ustar00rootroot00000000000000file(GLOB BF_IMAGES "*.png") install( FILES ${BF_IMAGES} DESTINATION "${BF_IMAGES_PATH}" ) plee-the-bear-20251226/bear-factory/desktop/images/level-splash.png000066400000000000000000007577621512343254000250210ustar00rootroot00000000000000‰PNG  IHDRè]ÈWþÊsRGB®ÎébKGDÿÿÿ ½§“ pHYs.#.#x¥?vtIMEÛ 2i4÷(tEXtCommentCreated with GIMPW IDATxÚÔ½wte×yåù»áåŒøs*„ªBåˆ*V`%‘’eJ¶lÉ–ÕvÛã»{u¥q{<ž÷¸í‘,µe˶$*0IdQÌ¡r +çrxñæùã¡@…ðP$í6ÖÂB¡pï9÷ÜwïÙg{ß ³°@°aú{Þ×zÿK˜ócÁ/ 3lPX¢L®gÎ1+›i‚ ¤¿ç§éàË*¢0ÏOqI)ýC\»t»íîöÃÎÇû8ûÚI0˜ÃS?~šöo¥¸(Ã0‰Å“ÄbqÆÆ'yù•cüÁ¿ÿ-FG0L—_y‹Û7RWS„iš$’)bñ$ÃCã¼ùÎ{üöW¿ÀøØ –)pùÊ 6oÙ‰Ïcaš )E%O&øéÓ¯òë¿öYvEI184ŠÍæaýúÍŒ µ#I‰d EÑ9yê"‡‡‡lcbb˜”¢0<ÃIPt Ó—}ÖçµÈs»ä³þ~Y+<^øjë_rÜÖìëYô+kwE§Zs_æy¿®x\Öì±,s!÷e-ÒÇJž¯eN\ör­¹÷(“k˜9ÎZÁ}û€ýÎéÓZ–kÀ2ëk¹3ÛL_EYï7%,ð¦Î°»½s“„æ . ¼ ô•ÑCiMƒír'X`Z°aÓVξwÓ²¦o” €ÝfãÁG>Åí®.º»;I("¤†Ð4kº;?u6mß?·MÓX·®…ü\Á@›Ý†®LEãD"SLMňL%¸~³±Ñ yø>Âyn~/.—Ã4‰FLLL&°,‹ž¾I9ŧ›M¡¬¤¯×(‰$)"‘(±XÃ4²9õÞ t]§0ì!7'H8? Ç…aZD£q"‘ª¦a·Ùq{‚<õã_°~Ã:ÑaÖ­oÁå´áv9ÐtƒèTŒÉhC7°;\H’‹gž}²²¦&#|ìÑ}Ȳ…ÛeÇ0Lâñ$SÑ8ºaà°»e?ùɳ´®­çä©K|õ«¿Ž©'§ÓŽ®$“)4Ý@SuòÂÅxéMü^™‚‚†Gyø~®];‡Ã.¢«*Ñh”h4Ê¥sgq»Ȳ›Ÿ>ó'8lðè㟡ª¶‘oýÕÿ¡%‘Ä…YøW¤ ’‡Îö5}˜@Íü =C´ýº¯ø„÷O°¬é_…•ƒôœK¾3Y™Ÿk-3b½ßîJAzÎõ,pâ¼Û°ì5dÒ±•á ­ ?kH Ë~g._)HßéÃbVÒ‹`œ¹P³ž¹Â[”…%Ü £}s„°Yî¥Ïûc&«4qöC¸Lwþm°y{í½$£ƒ¤R ró èEíäŒ b“!\PHˆ]¼ðÜS¸ì–efÑ?0Îç¾økgÌòb&u ë¸q³Yˆ x0LƒX,I_ß;ÚöÑ×ÓÅÄD?¢(R×°žãÇQZ"ð`&Šª2<¡°¨ Órpîìq** ©kØÀàÀ ãcä ª:‰DÓ’?øáÓìÞµÜÜ|jëVsäÐËÔÕUàr:0M“”¢’L¦0L‘ÞÞ!NŸ¾ÄƒÞGEe£ŒwQ\œÃáÀ0 ‰±X‚TJed4Bd2Á¦M[ B t‘ˆQX‹ËíÄ2M’)…X,I<ž žH‹&Y·aŠja“5Úo\ ¤$ŒÛíB¶Iš11H&S$S*^¯Ýð‚`cläùA‚!?N§IÐ4TJEUuMÇœfíºégh°Ÿƒo¼@l¢›ÍÁÄxQL?¢0wa5g"ýXXî²–)— aùC­èÒ2maÑÿÌw3ÃøÀaåŒ|>P#,Ï 3êæãŒd!v¿P/u™.æ´gex\¦lóD–íÏÊìõ¹«EúÊäC·N¾q‡%®ˆÑÞK!³—t9À–š¸„Y«!s¦¾s6Œt([çþI¡»³‹Ñ‘ >ñ™_c*aàsËĦÆÁH‘J&¤ô Ñh”k—.RTR£?In^!¦®’LNñÉO?DAa.‚ `š&CC=LEÆ(-o ?\AVv˜±‰) #…H Pq8l€ÀÐPñD”pA nQ’¸~c€ññQÂù٘ƹ¹!,Óbh ›‘‘DÑÇê5[èdxdŠ_x›Úš*‚'Mx½n,Sgh°›É©7ï'‹05a``”ÃG/°ÿ>L3EC}’d™f22Nwï(6´‰ “L&1tëÖogp°—¬C359ÄÔd„žÞQ6lÚAtrEQÑuQ”¨¨j¡`Uc“4RÉQR©$—¯Ü¢¾a=Â0tUÃ0 t]Á˳ϽLue~Ÿˆ,$™œŠqãÖ;¶o'•œÄ²À0L4Ý$•J16:ÁÓϾNUU9ÙBA'Ñ‘ÃW¾ö›´®o¢®¡‡ÝÆðÐñ˜…¤ÔtÅ&8@"ÌûžóÖ嬃a„E^éw&mX ŒCXº ë#kkK·˜uŸ˜wÂÒkŽÛZj޳æÎu¬\¦Q¼9·_˜E\é-–égÞ`fÀ%×3(…ÅoË'ÌúŸÓž0ï>+ïwÎâz‰ÏBX(’±’þ„ˆé2ãc‘ûºÄ°ï—P|'Ä-,Ó‚W˜,Á gï7gÉëYS7M¨ª©£¬¼š·_iƒ2LÈÍ/ä‰_ù Ó¢§ë»mè-,v•Õk¹té2ãc=””„1L“‚‚2Ž9ÃÙsï‘ïBI&™šš"‹¢¦L„;l[\ˆïz­yÏþ²ôùˆœÿš1yëî1ZË,Z>V=;ê±м«>âÐ÷œfæÓ-î‘ÁÎg²³®+c–¾‚÷GƤWÚ¯µ²èEfzÇr,z%!ýL´ok‰hšäwñ¥­°”,,½Š´X=.öËõµL~NÈz¦>'ãð…qH:5õÍ<øèã\½r™ØÔ§OEU’x] ª FST×Ö016JMmvOããcˆ\¿rI€µ­u<òÉ'xê'¿¤ºª, ‘ã§.Ò?0FScY!õueTT1:ãåWR[[–f€šÆD$ÊÕk½lذ‘x|’u­õ”ç"Ù¼|ÿû?£¦ºY–1 A°˜ˆÄX»¶-mÄJMÑÜX<óÜ„‚|~ `šÆôK PPTËÁC'¨ª ãõÈTTVsäè)*Ë e„ôñºn ¦Rè†ÀOöÅEYäç°s×z{:))ÍÇa·a³É8`Yš¦“L(œ?™h\¡qU-k6bh B!;6»‡Ã†,K` Ó×­’J¥èëídMk9¹…(ª@<Úƒ$8\v\Nv›Œ(ІA*¥2::„×-‘›WESËvº{ú1õ R‰1ü>7.—§Ó†,I˜¦E"‘¤»»©©1úûGXݺ—W_;Ln¶¢¢[6¯fïý{ÙûÀ>¶ïÜÁ¶;Øy_Ù9ÙäæçpþL–™~¶$q.£œÍŠg/‘…¥(ç¿¶Ø{¯4vÞ˜„yz>ãæ#bÙs.Cxð„…:–fs1êyíΰáåXîR}Îg½ÌÃÖ2óòp2\óÍ¿–ÿ™™ô]}Ï:/&½ -5^°Ù‘” _™;¡jÅCÝKEF$¿›o,¦á.u²° £ýÀ¦02׸çŒéÎ% ø|R)åîΛ,Q_[ö=sèà›?ø‚ Í°%qºßd"NvÈÍÇŸx’«7{ij\Å•óÇEH&ãÀ¾÷òè㟠›¤µµ™Šêœ=wµ­[ øeêJ0 Y–ÐTQ4¨ª©¢¶a —/]¢´¼ŽÓï]`ÓúZ4-Ž×ëÂ&Û0-ƒTrŠŠòRV¯ÝÅ­[7q¹<\½ÞÍ¥Ë7È˱#‰:YYAìv©TŒ’âl,!@NN}}½ØíNŽ?K^~9n·EiI~ŸY˜šatl¨I„ht’TJ£`º†õTVÕP^¢P(Àw2¢uréÒ-JË‘EKò'êæà%/ÏGÛî:::.±i}1šª16ÜËÍ\»5ÀÚÕÍ$ã1 ÃD×uTMÇçÏæü…vΜ½Dn–DtrˆXtœW_;ÁÚµ­¸œ6 CG7MtMG7 lv׮߿ê>6oZÃ¥ ‡ä—/bã¦V’–5ͼuMÓ‰DbŒŒNòé_ù=]—ì㥗ߢ±±‡CÆ´ LÓD”$v.·‡šú:ê›ZøÒW>ÇûŸòªtMÃív! "²,‘L©˜w&%q‰Ðò¿Õ/!ƒ8©¸ðXg/^ÎŽø €=§{aî¼1$éHX Œ¼1fȦgÿMœ}N7A\<æÈ޳ØìrkBaÞ|»X²€Í^´Í[,Yˑ洷Høy¹Çìó2è.ÔŸÉó˜Ah}ö}Yjѳ\¨û.€^)£Íä!–õr¡íL4îÀç¾ô5ÆÆ'E’@MAVN6ƒcIòóræà¯Ð°ª‘OþÊçyïäÑ´ÐT0,°¹³X¿~¯¾ô ãÃ#<ú‰O1<4@d|œx~ëw[7¡©Y9%ä‡K9zøUâñ8uõÍ$âÃH¢ˆ,Ë‚ˆiš3šByÅ*þÇwÿ–ÉÈ›6ï$œgÇ&Ë8iægYL§)©èºÆó¿8ÀÉS¨oXGue.u5ŸœœNG:œ hZšýz‚£ÇÏràåcìÝ»IH’“íÂ& 8œl6A0 “¬PYž"ž<ËK/²~ÃjþòÿíçÀ'y¹1J/f“óçMl{ûd·ˆc—†e(ôö ñ­¿=Áù ¤Rn::røø£gÙ¸ùYV5aÌ=Á7}ï¡7©|Ò³S”ùÎ÷~Œ ÀÅ‹79{þ&›7­#œïcíš:|>/‡¿×CsS56›Þþ/¼ð:¹9FG# ë¬]ÓŠªLÑÜT¢Äp:œdg¨¯+Çë 08œäµ×ß!//„iØd7-kÛèééÁíIÆG° …p~6M«ªðxý¸=ù¼úê;俆ˆÇÓRƒªÄb2Ïýü—”—†ÉÉ QY]EÛ}»ÙÿÐlßµ“Ý{÷°mç66l^Ï@_Ý]ÒRÈ3ÚGiþ Xû¡¸µ´æ}‡¥  ´à »·æ±ê6™aG‹1êLôéùl8“ñ,Ħ…%HXŽáÍ£ðo‘I/¡Ç/Élïì 4b!4^”E¯`|óÉaFŒ}1)£]0ÅÙ«(a÷ìE€•A_Ö¼ÐŬŸ§Ž`t|‚‡>öInݼÁ§?û$·›±ÁÛÄcS$âqd†úû9xð( -­xœ2‚$ñØã¿JWO/j|ŒÎŽvLSÃnƒã‡s»wœ†U <ùŸ¦¡±Exþ篑›í%Åëõ z˜äï¿ÿ<õ µ‚‰®€Ì‘£gp8ÈRŠÒ’\ ²™äÙçß&;;ˆÛí@Õ44Ý`xxœ`(Lë†í¸ì-Í•H¢Êø„Á7)..ÀÐu ÃÀ0ÒiS9¹Ede—2ÐßÅCl¡ ¨„öŽDÁÀçs#6¯™–9#¬Pßø_yèáKìÜaãÀ6~ö´ÈØX—®äðñaþþa3ŒCwrcËyR)§ÎÒ¶k?'Nšhšü|…‡nÇæx—_áKÂ×Ë&èhêCšO›45®b뎩¯oÆåÔ$—ÓËåÀn·#JéEŒ¢¨D§&1$N·›æõ7…ÙYAü¾t*šl“ Ó4™œœ+I"¡R]»w߻ı§Éϵá÷Ù çåàóyp9ˆ’€…@">ÅèH££œ9w›ÆÆf޼À¦Í{ÅëVWãñºEa†•«ª†,Ë8NBY!ŠŠKxè±GùÜ—>MiYÍkIÄã¸\.@Ó445ý°Zfšiß‹z1‚ž©?ì^½® ‰3kBÏ€ï‘] KÈsÖ þÅ@0ãв°HTњˌÉÁ ±é%Xìr¡Ø…ÎË„ÍÎ\‡°æûa2éBÂB&ã˜9ÈDYê^³  ,–‹,—æ9 3 9gÎ˹¨—dé „jëË4¡¨¸,3<}ŽiN_ù­‡¦&8sþ·ož£ëvû ³¹Ó¾(Av¶'>õY.\é`r*ÆÕ ÇѕĜc-+ÍŠünøÝ?úÏ<ý웈’@Ey˜Õ-Õ„²|8N$IÄ4,%E]myyE<ÿÂaêê°ÛDró‘eY–±,ÐT…¢‚l\ž±„„eZTT6qõê%‚‰Ø0gš…뚆¡ÇD™ÆÆ­\»~…@ Èù ôöõQQ^„®MRX˜6«÷cš)|¾<[6Óßw›X<ÎÙs×9sî&79<…Í’çà;Õ?Qä“cgïØÈ!‡wW¥æWê0MP–›Ül“õ­)††M|ð<»wßO*õ"’¬ð 0âœðqõ“$Fq{d¦"}LŒpéò BYeädù°Hº4MÇÐM4]CQež~æeÖµ6£$‡)*ÌáȱÓ—TáñHÈ6qZc·Ð§ó¦SÉ‡Žž£ °œp¾» .\¸Œ® ”•äâpØ‘e)½°ÀÐ TUÇDAæ‹_ú ããcœz÷4¯¼òKÊËr±ÛmHÓ Ã0Q5MÕÐ4 °Ùl˜¦a˜X–EIY)Õ55ì¹{í»v²cw{ïßK,¥¦¾–s§oÃ3‰†Nd2NYy ç/\GU"W"J&6ÉÂå´#Kòôñ†ab³9QŸþôúúÇ(.Ì"p úÒalYÆ‚iwrº¿S'òíïþ”¶]QRì§²<ŒÍ&¦Ÿ1V™$“:{‚¿ø¯oóàßDãlßÒˆe8H*„šº«Ã0òòå/á¹ÓOÑðÅRN&Oòß÷ý?|oÇ‘<&ë¤U8vrr ½Cbëf‰h4Î[o äK„Ï~‘£òžˆ<À#—ÖQ\œGVЇÃiCEŠ‹òq9ܾB~ü“g…‚Ħb\¾ÚÎζGÈyii.ÃçsL&õuäååQTÒȉã'°ÐÑuƒÉÉyù%dçV‹Ž°ª¶€d2Š,Bëšzêê¨mØÄ»ïÂ2 ËBS5LÓÂÊá×s«£K%™˜ ª²ˆ‚p6íÇ´ «ë6²Í†2íÌO$Sèœ={•‹—nÑPW>óTÞq¦š† 8. Pˆ¶ûv±qË&~óë¿Æžý»(¯(EÓŽôm²TReú#›ûbZm¦æ«å{)æ-¬äbæ§—-¤] ‚R&c›§S +… BŸw¥Ÿ® ¯^XŠMf  /{ŸW˜’t£ÿФ—Ó—dœó?Û%Øí]Ú»p!h+³wSÈ@g_ì>ÎôrŸmÖZ©¼Ô3³Th{vØ›ê2í#ââùË|ìñO‘_Îíö›¸Ý†ú;‘%IL3dUÕ8ôökdeçòÕßùCÞzç ÛvÜG<>…–šdx ]×E¸zù"ÏŸæ¾>IIq£c£|åkÿš†ZvïÛ‰’œ •ˆ"Ë2¦™¤½½“©˜@^®EQÈÊ.ääÉËèºJ8? ·[ œŸ¡ÇéáÝ÷nPS[J*™$¥¤èëá·NÑÔÜ„×ã ¾®”êªBtÃâ?|êª2l²ˆ> üªª3³h]»‘‘ÑAvl[‹Ë §Þ½ÌéÓ¨®*B’$,ÃB7Ò%2‡4¼Ì3ûÞd,ÕÀé¿ØŽ)¾… ¤(,(ÀçiÃëd¨ÿ èºNUÅ}ýnɧ)-.£¶¼ g<À_Þ÷"…1.WµóÀèV¼¦,‹öv‘P0F<>ÂÀàMvï)¡ÔÿU®÷_äñÉ6ü]ÙTüŸ[¨|¯™èö ›ŽªjÄb)&Æûð‚ìh{ _ ÌÄX–1‰i&ñ¸]¸œNlv¢ ¢j“‘Q^yõû]¯¿„`ÈâØ±TVaêÊË q¹¸].l6Ã4™šœ ³ó:ýýCÜêbã¦íüìg?çv×(«›(/Ëe}ë*¼^.— Y–p¹œ öw095ÅÁCï2>¡’ŸŸÍ@ÿá¢Uäæ•22ÒGëš:ìöôb(Â60­4›ž-> Bzqeêé|o§ËEEu;ïÛ;`[ÛîÛ¿Ÿ­mÛX·q’,™˜`t$mtÔu?@žö‡ìËÈÌÌ­½@£ 1ë{ Ïש3eÔ …¾—Ô§…¹ RXA“9·`¶ 8Ý|¹|é•ä ˜ùÊ™2é•há‹.”¬yùòô·˜þ¿¬³_ÈLB°æ/>Y ÌŸäwóeCΠò—©Þ•‰;|¶žcYàr¹Ø÷àÇè¸umN¾žËå&‘ÒØ¶s'9YY<ÿüs”WT191„¢¨sªCAºÅö»ˆÅœ>S™`dpðî0¶N‡SOâ –rõz%EnÚvo%ðâtØ% Ó4QUÇI8œÃÙó=9ò.ÍÍ«ÈÏsRR’(‚M–ÓîmMG–Eª«KÉÉmàØ±ãlÞ²C7Y³º—SD–,d9¤ª)Ö®YÅúû¸zýº¦âpyþç¯RYž‡iD }8v4U¡ $Ê¡yõv®^¹ˆ ŠèºÀ ÞbÔçç5¯£ä%áþ›L}³Ï=$žœ¤eÍzº:û¨®éex$ÈíÎE%Õ ²kgˆšêl´¨Böí~Üð,f¶…[t²¿w r\B×5nßÖh]W‹‰H(8Fnö$çN¥xÇýY9´üÝN<׳ñdc…TF«zñxz fõóæ[—¹zu»£·û&/8Hn^E…ùˆ’€(ŠX¦‰nhºŠ®™üïf'ñqþB+û÷Æxïô òsÈÏÏÆn—°ÛíH¢8]!ÎLWS ੱ‘šºµ\¹v §]ÅïuâvÛp¹Ò†;»-onX&ªª“J&(,Ì£¢¼”òÊõ|ãOÿŠdb‡¬PŸ…ÓíDš^=š†…1r7 sX¦Ë–!¤ŸoQ¼Ã³±,ËLÿt:]¸ÜN²²²(*)aëŽí<þ™Oó›_ÿ2“¶=môtwáõzDUQÐõ¹Ï¸°R´ý@;SÝ{E º³¾£ñ ™“ßEV\ŒQ¯ ôme( Îצ3ÊLY.½ìÂa{[“æÃgÒéÑK0[– ﯠ¿»ô÷PXd9ƒÚ]Ígèê–|n¾ñaÔÚÇe¬;/Ó¡ë(ŠÆè¤†„Š¡CÓÚÍ4µ´pãÚu†ú»¸zå"dgéS0YYyèÑ'°dCCD#£\<û.9!;ï{”Ó§/"‰¤]Þ*Ȳ@$^ŸÇÍåsÇøê׿–12܃ËåH랆aèŒOasdÎºŠ²Š&F{Ó¥(åiíRO»·%ÉFeu ^|Žññq¶nßM<Ú‹Í&a·ÛҹȀ®›éÚ×±(íí|ïïÌÎ]SΦ¦2—ìì.§+­Ši6™T1 •‘á>þáŸ~ÎÆÍ{q9ÊJs).Ìâ@ì0º`@˜ÖC»Ø¹+B(à$‘ˆñÊkG0-‹²ò í>¯H__ ›ÝMy¹ˆ¬ÛÉ¿XFqƒ‹nßÛžo¥ã@ÕÕÕ<ÿówÈÉÖ¨® áu™TU©Øj¬†-·Ùa¶"v£÷ˆhœ}ä0Ï4þ3Ÿk| ëβuÛù®¯áµ¹°¹eV·Ôâóù©¨ZÍsÏ¿DnN€d*–……‹–µ;ù뿾Èr»wv²¾µ§ÓC}ãF._zS† IDATºŠÏç$¥¨¤Ý0$;=}QΜ9Oee ] ‚HËš­Vcši3Ÿ¦i¨ª†¢*tv ðâC45732t‹ŠŠ<,$Úv? ˜˜†‚®覉¦j$§‹Ç‚@,žÂ°Lì6G¨çL^éÙûý÷N˜#nÝ‘2’É$Õu5”–•òàc²{ß^vìÞÅÖ;زc+6›Ln^.]·ûH)ï(.#$„ ¾œõö|ÍÚºÛ°z/¬z!F-d˜Ül­„E.Ð~¦›K,È(­ÉÿDLšÔÐ^*88“þ,nµÂP72öL]Ý3˜â^œùp\Û4ßy22ÎÎ;øwø§<ÿóçì¥ýæuöé¼åé•ïÔä‚¡ð­ï=ÅÁƒ‡0E‰è8·®^Áa‡”’BA×4®_¹H^aûx˜‹ç/ñÀÃcëŽ=ܾq%#•Šñÿé%ðÑÛÓÎÕë#´´4Òß߇ÓåÃë/àÍ·RS•G*5‰ÇãFM®_¿ÄO~ö:ëÖ¯ASS膅 ʼõÎIÆÆãx\&Á€“‚‚Úo^æïþþ9êp8DT5]-+]«‡;Âí¶³ª¾%9F,nrüø)jª+Òà`ZÓy¾ñDŠŠªUœ8u‰UuE†Ð =ÝíT†KØãÜ€âVÙñ!<‘«RH’ƒ›íÝ\¾|ƒ-›·‘›7ÆÈp99~ ø¼2¡ ’Îxþ06KdÄ1Añ@.õ…ëxøÑOc“äçç! 2Á Ó( /ÒÒ‚¯ßÅTÕ0î !ô=:¿¿ÿ¿pÛ}G,¯|_÷õðrÓÖEWáN9QµÝ]7ˆD¦è蚤¶ª–¿ùöH$c|)\N;£c>ñ±[6Ȳˆetv^ãÌÙKxéÍÍM qþB;=ü)\Ž$«[jp9e\.‡ ŸÏÃèp===|ëoŒ(ˆ~&"“LÆRlظ—DBeýºJnܸ„Ç㜙è =ÝÇÈH„Ò²(©;wçÁ »ÝŽ<½#ƒièš%ˆ(ªÂo¤«g‚â †%??Û‰ÝaG’ҹ˚f I"Ý]7ùöw~„Ûfõš*Ë‚æ Iiý<ÝGú»,põúþæ[Oá} |;·«´ßê'ôçu l»„¢EˆW§hÕd‘¬P€²Òò š8}æ0UUï‹…èo·øSå uSŸÄïŒÓÒÛH²­ŸB#÷¤kxÝÛxTjåûg¼´;hRª¨¾^JcÓ†Gxq9Mt-Aëš:ü’Ê.úú§XÓ’@UÓ»}iš‚„Íæå‡O½ÈÄØ©x?~¯D_ÿ0á¢Z òQR $IÄ2ÓŸ—ªiÓåF5.\¼AuÍñQ’‰1~í;vàrÙ‘méªa’$¦Í°Ð4EÕPô(.­âÅ_ávGÁ€“PЃ$ŠH’„ XsÒº4M›fÃÓlYAï ßy+„éÊh³ß¼4P ³·éiÆ2-,ÓÄ4 \.N§“ìœ\*««ÙÚ¶Ï<ù$Ÿù§).-¢yuñX·Ë•.\£ihšõ¾¦-¾/?-•ϼ¤Ó%Cv}‡‰ ™2ëeŸŸ‹Vªµ[Âò¹µ+Z¯wW?\IÎôÌ—¸üâ!&ýaå+“ÉâÀZ™~—tÊâÌ}©qfÒ÷궞ô—qv dî¿ ï¥Öv®m!ƒÐöüêcŠ¢ðÞÉã(jjf'kºg*>ÉW¿ö$ 7¯µ#‹:W.œÂiOëÉwJvövwÅøý?úç/\$©X”•3Á†‚ª*È2¤’)^ÿå›|þË_àùß £ã*£c)Ö®ÛF_oyy’ñ1,3mTêì¸Ê‘ãçÙ¶}/“‘ à ˜]@W÷8£c#„óBÄ£Ã䇳I%#¼wæ NWNG:¥JQ‰o½ý.EEäæ)-Ρ¡¡ U3ùÞ?ú.y¹v4uŠPÐeidg¹E--ÛèïJ×¹V4"S1®\ëbÛŽÐRãT”çc³ äßòÐ{¢ƒâ’ ‚Aª¢¢ªš®08à‚¬Û¸‡ÞÞ~{ØKO÷^{ã‹/ÐÚÒŒhZXȺˆ®›˜†‰ªÚ8xØËÙs/’J:ˆLŒò̳½ d~Ù6ß+cVÇFéÌ y Œ7ÐAÇ•bFk'ùœ¯Ñu­ªÊ¼.—‡ÓŽÃn›vr[hšFMM^²²"ö=ð®\í'2ÑGeE6’hâó¦CÑ.—›,aZ&JJ!§¡¾QòѶû1þáû?äÅ—Þ¡¤Ð¦ŒQVVHÐïÃãqc·Ë"$âQ’ÉI²B~n´³fÍzzz{¹r­ƒ-;&èwÓÒXL¸ „Ói›ŽF8±,ƒ¾ž›tvvñýzú†UX–Éä䉄NQI=/8ÌšærjªKDçÄîfï{÷, KWç¿dâ]3¬9M“M3­ƒ»\.‚¡ Y9Ù4­naÓ¶­|ù·¿Èîým”–£ª ‡Q°Iª¢aÍÏמͶb€¶°H®ˆ ÏOƒ™©[)£¾«ŽøùÓÂ"—%4ÒŒL^ úAêgÏ;`Å•¿„¥µÔŒü"ZïJ4âŒ"+t[/ÈÜùð\Ý˹Çïè)×öô“›Év•37„5ë6P[ßLOw–– ¿¯› j*ÆpDG×RéЂխذe7çÎ^DMMrúÔQÜ6Šê&ntôa¨²œr›Mä7¿þ{œ»ÔNIq1v›ÉšÕ5lÞº—ãÇNPX”“æig­eYŒO.No²`ßþ‡‰LŽàqËÈ’”Þƒ´Niè&†eâtú¸ÝÕËèhŒ6k'++ˆÓiŸ®V%N§Wi$’ º:¯òÜÏß"¡8YÝÒ@À/³q}#¡€·Û5SO[Q4Ü.;Ñ臟a`xнû¥¿¯ ß‰$ıÙÄtq›„lJL´Eyû© ä‡ÚyçàI Â9x|E<ûìjª‹ÑÕá\£ý9X¢HccÉՏвxí¥Ã¼´ñ ÕýEŒNñìóo²ek'Oyùò¯qßž³ •±¦ÕÍ•Ä$•¡f>÷ÙQ[ÆÐ§ N¹/2üìÎ߃Ëe§¯ËÆåÍ7(­(tuqóV/5U%´wÜdj*Nkk.§8øm6 A±, EÓI&lv™‚pˆêºu9v†þèYÂ9IÜ.'n·3¦eKŽî×ç󲪡Y²àûÆ_"Š¥ÅÙÔVçQT˜7SPFÅi=ÚœGeÊ:^Èó¹ˆh*X³ò°„8³ßB˲¦ÝìéHË墢êN òÙºs';÷ÞÇÆ­›Y»®I™ŒD˜S±¦«øÙäYÛò-ǰ3/¶/´é‰ÌóŸ+ר—Ü…*ƒÚÙ™Ôô¶V¸éÆríGΤ?H寠†¶µØÇñ¹­ ugØÏr[#Ïè€ó‡áÚÎÔ€v§Q„¾¾~Úo\Dzô9]dbŸ[ä»ÿôo¾ù½C ‚~7ï?ˆË™vlß1ÂôõtùÃÿø'œ8öù…EüàéÉÍË¢¡¶¯ÇŽahˆ urîÂ-*«P•8Ñh'ÀÐp‚'NÎs“JFLŒ÷ó£§~eÙ(*ÊEQ4MCenÜêâì¹[ÔÖ”£&G …ŒŽóÒˇhnªCÀÄ´,4-]êrbb¿?Í[ö’JŒÑ¸ªÙâÒÅó„ÃÙé¼j1 wRqtÃÂë ræÜeÖ·¶RPPLçí+åàq»q:ìé”/+òÕèæö'Yf’3gßãk_ÿOܾuÍ[² ôå´{{yªîuüJ°å¤èÅn —J r"y…¯lþ:]íC47–àq›9æçчò Î06ºž”3ÆëŽKüþv;§_9LáåZlk޼…¾F‘'%ÂUæ 3ÜÇŽ©ÖéœbÞžÛüÃ?¿ÀÄx„PVèT”ÎîÞ}oO~±”ò/5UÅ€Ë夼¬…¢’Þ|ódYÀ4,RŠJ,–Àîð²ªi ~ù*mÛ›‰ŒRÎbú&V5®'*äæ+86LÃBUÓ…T4UÃîôpøðiNŸ½AIqIH°vu=Í«wŸ_ÀèèNWšY¦?“tŠœ¦i$Iz†É˯ ¥e5‚e œÝ÷íFS“ˆ¢…Í&!‰ÒLøzŽPwצÒóœ(ó7*ž¿[Ä캑3•9æÿýÎÙÖ<öð>jÌíö–е>¯‹º† ‚¥àtp¸ó9îùù!&F{ל¡P|O¬z¾ö{®ïù:°Siþ°–ÌS^ÀåI$ÿ®‰~¥Œö˜t¦•¿VZC;“ô«ÅúË$‰ÛZø0\ÝlKyW$‚ù½‚Øwé1+tm/TÊsÉo‘§- ÂáB>õ¹/Òq»#¡ëv‚™¢¶¡™kíÝØ%, aZ_ËÎͧ{ JVv.X“|úWbóÖý\»v ¿×$Jï3Y]gl|ŠÉ)…5­›úEžøôè¿Ý&¤÷eîT2ˆÅ8.eNœºÄÚÕuLFúÉÍ ár;q8d¤éÜTMÓ$‰nþñŸŸãìÙ[lذ‘T¼ššR|>7.·›Í63^—Ëέ›—øÛï>ƒÛíbMëV•„ÝÔVM/ìÓ¡o¨¬(ÂívÒ7¨Ð~ó:^¯ ;ÿôƒ_`ÄTüþ]!ÊJ]H’EYI˜õëÖRYÓÍ;ï:9˜<†>h { jŽ”Rk //‹‚Íä°H">EK]5 5Õu¼õÎõµIròÎÑßÛDwtœî‹Õ|ýKxþÕTn Ð9v™_®>Hê%‰í» ÀgÐ’¥øÒ›dh:ªf ˆÝ=üøÒÛHb’ãÇrèðöÜ׈Çë|Ó 1NÖ5EÕQCO;˜7mÙÃ~ø4kZª¨©*F–…tÚeÇá°MïÏ- i)E!7;H^~õïçä»WùÁž¡º2Fœp8Ÿ×Ûížµ¨E2§ œMUU9kZwc 6Nž8ÉácÙ¼y±ÈmV­ª$';€wz÷-»MÆ0uœ‹õë9qâMÕÓ©X³˜í ëæîÑ8ÖËT®Xâ÷÷S¶˜¾‡³ j³þ>ã0Ÿfk:J`ÍjÓ²fò´gض®#§“@(H0+‹5ë×±}÷.žüÍ'ijYÅêÖf†ÉÊβLA@Õô9y¹ Õ<^~t™3ê9ìmÖï+ÙÓYX,l¸„»9“ô ¥ÃÇK2é{e´ó˜tÆ –!“^”qf¨ÏWe–ª4¶¬ÛšÌê¤ ÷êê^i­î€÷}-¾Ï03Nî͵Ih{ær–0 Az³‹³ïCID焼o\»ŒÏëâ?ó¿qø×4©khÄi—1Ô)¾ú;_¢±¥ EÕèî¼ÎÅK7ؾã!&#CèšFVN)áÂj:;Û \LŽ÷¥«†öqþâ œ®,ì¶t¸/Æ–8zâ·;zinj@$ɪú2tSà|ïg46”ãpØgJ@ªªŠªêtvÓ¶{?~ÄúõܸÙÃíÎ*Ê Ó[/ŠâŒ¨ëéÝž ‹ª˜ˆL©®iæüÙ7ÉËÍÆa·á˜µ‡®›¤R*££C öðÚ§ùí¯ÿ1‰Ø õŬn¬á@ËAOÔQ“çÁëMG &&¢¸Ý'8uÈÆêÂøËýHOïbo H¾˜‹<)"6)ôd ÚB–S36>Á‰“/0édýúINž*âùãoSÿ17U&Ô5á ÙÐÜ“Á8ì@´åóïåg«ßdÝXJRar*εƒìÛÿªeãúz|^;‰D9E…õÔ7äÌ*çô»'ÈÎ ’Lª¤-]VS©®]ÇÁCÇp»eF‡oSVšƒe lÙ¶‡Ó‰ªL¥¡íNéPMŸÞ#É™s×xõµãäçùP’ãØd‘mávËØdm2’MBÒú¶a3ÕÆ C$JËxú™çˆN%¨©ÊÃnûÿ™{ï(¹ÎóÌó÷ÝP©sD£¡‘"“ @0Š’eÚ¤d‹öH–=c{}vfgÖžµ<ãñά}Æ{<¶W¶håDQ¦,‰"E1g$‘3:ç ·núöïÞ[· ªAÎÙísú ÑU]u«êÞïýžç}žçÔÔÔP“I‘ ¢D“IÓ41MƒštšnXŽz¬(Êò†[<¡‚ÊßÏB&]‰Ž§‰«,Ô"è‘kB ëzÔ3'ôd…9^¤+¿}OËEË¢±¹‰y *ùw²õæ›Ù¹ç6¶íØN]]Í-Íôö\Å.J|’,~1³êº*ìdªïYÆqÊŠ^0bú¢Zê#Ùÿ s«EҲʂYÍt¨7³èϤ‚®VmÍ,Sf­ê3‹ß¦£¼ 7¤ù³jÃ&µTMr Õª¶gÜÊÉ©…ð¡4…B?¦ÜŽÄšJÐÐÐÈþ_žañ‚&®^8ƒçùó¿üÏttÌ p¨€‡9íÍ ?}â^zù íØV?sÛhj¨#‘4AJŠv‘æ¦z-Z‚G#ï½û6#£EnÚ¶—–&“µkn$öòÜ"ë×­bówròä»X MO0·s)ßúî¸aÝb¬Ü ©´ê{75$¸piˆuë·0:2€ã:ض‹”ÇŽ½ž®®Nêk!“68uò(ßÿÁÓlÜx‰„®|Õ°§X´cý†m´´Ì§&m“Ïòÿ€yshin #Ó¼Ñ~„Å—–ÓØÄUº>­íEŽåê¡þôž?æ­eßeO~;©F2=õ\l>Í;gN3˜†KÃC# ôõ³ ³‰Ö–¥ØÅu$µÅ6/u󬤳w I‘ Yg°<ßEÁ²¾BçÂN™½|náqÐùê׿ϖMËðÝQj¨¯¯¡±>ÉÏžhgû¶ ¬Â0W/ŸæÉ_¼AÁ’tt´1<2Ê‹/¢{ÙFt1Á’®VæÎm%¨Àê2ôöœãàÁ£üÓ×~IJ¥‹A@!_`l<‹¦¥¹åÖ{Éå&ؽsºp©©I²tÉB\{œ¥Ë¶ðèB"¡‘0MlGEÏÚ¶‹ãY›¯}ã1t]RÈ]aÅò.¶Ý´ž ›vƒ– ·÷2M $L% 4M3a(O¼¡O¢•QÜâZZYTlý¥˜~;-Ò!TP¾¢Šiª‹ˆŽQh]×1 Ý0¢Ÿ¥ï½döcTy€´Ãë/Üx&S)2™š[ZY¿q#7︅O?øŸøµO²hÉ”h½ IDATV¬^ÎÄĸçjèäóÅ8Û>e{nê®AÓ³™B5moº‘W}é™z´×ƒhgz~1Ëä¯ÙdhO×#žM†¶dz†E|ÀÞ7U€ÒJu_óY]Šú¬¢ÒOÇÉXªíI)ô*Pz°°ïžqµw»˜çÊÅÓ¤ô"÷?øy.÷ôðgñǤÒ)µ08.ŽmsåJ?Þ:Á¶›·âÚ|úþÏEj2I SG×U¿Îó}e)ò=É #ÉЈ͚Õ+èë=A2aLžâ¨‡íP´-.^<ÉK/åÈÑs̟ߎixlÙ´‚¶Ö&25*O[Q­.sÚ›RòðWÈØèóVÐ>§ƒ\v”Å‹Zñœ<ÉT]×I&“lÚ¸’¹sòÞÉrÙ<Ï£s^7Ï<¿ϵio¯ÇÊÒÔÔˆãY¹b!õ -¬]¿÷ÔÏ,z÷‰,ébÿÁ÷È4Ì»„QÇêÕ é¿x÷æœ#{ÞgèêUÞ×Ñs¥‹áÔƒ5xŽƒt®\©ãøñMuorù¯þèVniì'›+2~ÄfÀéáLþ,£ÃcH[0¯ë].]¼Ê;_¡¥½×^{“\vœ­›WÑP_G:“"29!͹s nÜ:N±¨Ä[«–/Âõ$;vý _þ‡o³¼»ƒ–&…tkjÓÔdÒ$Sê3D<×£&“`Y÷B©:V®¹™ãÇÏðØždÁ‚¹øî(-M)êêj©­©!•RZÏ÷¹|é º.8}¦‡½û~…ÞÞË  óó_¼Á½÷} ÃðزqË—- ¶VQྞ³Œ sèÐ;¼}ô$ëoXŽ®khšP&†Ž®©ÿk¢4±EL¶7¯l5ËYrŸS]ie«\uÍ_u‹²à”xÊ™a†iªly]׃͇ˆüü^`튯\!j÷|?pây>óÌgÙòåì»ûnv쾕Û7ßÈ÷Þ…U(Î$¹rqX Fq•Ne²üŒ¨*µx×!"+ëMWaˆ®jÕ,z´ÿ¿AÒò:ƒL®3C{*t;­?ZVÏèòATÝ”÷ô§Á•õUo¨QÓ¬´Ù ÃfØILµÌø1<›M€”pÇ=ãÒ…3ô_=‡.$Žcãûc£W¹aËv/^A>;ÊD6GÑöÙ¸å6Þ~û(;¶¯altH©ì=Ï—¿ò:;çÑP_øƒ]4-AOï?ñsæ43>r™TÂÁõÁ†yjˆÑØcc9²9‡·Þͼy-ܺóF25m\¹|š¦ÆzÌÀZ%}Çuq=«`ƒÐ˜7okoØŽ¡9Œ ]dþüvµø§ê’Šôô^aldŸ>ñ&÷ÞûI¤t˜;'Í’EóH&teÉ 6¾/Éç'8räÿ÷к¾ŽS¯¬çÞ]­œ;s–í7¯Àó³Ìw˸rñ*ÙWÞ~€eïÍ£õÂ|Æê‡p4ž–!w`$ Ré$IÓ`,WÞ½Gêïæ¸™cáÊ~2v½·»±Àû‹Îa:Ú¨ “9CëÒmt¬ZH“ždÁ‚,˜ÇÍ·ÜC.;N±˜GÓànæ×ïïEJ߇Ʀ6ž~v?Çß}áÑÚ’áØ»ÙµëV4áa˜:𦠂$¼m›bÑa|<ÇÑcï³nÝ&ùÁ#hš`Û¶M$ H§S¤Ò  Cõ§5çúR44ÖpéÂ9ƳIþøÿøolÞ´šT2OÂTQ 5Á¨ÊT*I"‘ÀL˜¤“&ëÖ.ãÆ­«Uˆ…QÁŠÂG‚HODx^ )býèøÏBÎЙQÙr*èQŽÄã8,š•Ÿ²(‡·‡ÿFt}ð³¦ëè†b B¤­î£ÚmUJÈ;Dâ>ßó0L“d*Esk MÍMìܽ‹}wßÍç~ç7YÔ½ˆUkV’ËfIgÒ*‰IÓ°,wvªíJwÅ*¨Þ£}ÚÔ}éªÑô$ˆ©7<#’žì5U4§³~U•Ù]ņd6þèé*|µ(zÖYÝÌ,оæp‚û«,î*þX‹Ÿh k»jj{ŠÔ¦’Ã8uòCƒýÑse³ðÙ‡îgçž=Ìio¢¡±¿þ›o10¨èkß§«ké´JªRô›à†µÝÌÛÅ˯ü’Ba‚C¿<Íî[w#¤Ã–Í+h¨WèLÓtìâ8 ±c×Çèë½D±XÀ4Ó,èZËáÿ¤¾.M.ÛG>7Æðp—/%o™lÙr##ýAº”E¡Pàùqþ|/Ö¯AÓrã=Lds|÷‘Ÿ³íæ¡T³®ëâ¸^P¤%7lÜICc5‰ÀãüíÃ,]2—ÆÆºhAT=W…JŠE›d2…ãA~ÄbÝ®yäߟm7¯Ã4 Þ=v…LíÏyýe»XÄ©Ç9ÒÅÂ:Ÿî7¶rµû4†Ðq5Ÿº± ù¢E.oQtÆ™Ó~‰‰¬ÍÈ `à¦×IdHå ´s5ȶïw\`Î@#š£ÓØ|…C—Ÿ´›Ô7Ö“Lôõœg`p”ÿç¾GMº–y’úºžñ-ú lÞ´ž󛨼q%5µëX³j ©t o|cÇŽ3wn+EÛÆ*ظžK*Uæ-{9uêÉ„ÄʲrE‹»:éZ´œŽÎå\¹|–ÚLZ½OÁ&Ë*ÚµüýY‹µ«Ò½t.7neë{pÝ,ɤBŒ‰„i$Lõm&L ]ù›ÃyÑš“(¬Ã,nQ¾šËøUV9YN®Úž®lLŠÀå5KD¼¸†…ZT Ýéèó°X— w¬÷ØÉ´€Þ{Ú!ÒŽ„0”ÂXd0õ YNi«6•‡c;Ìíì¤{ù2öÜuwÜ{·ìº•Ý·ïeûÎí´¶µÒ:§•£‡/à:%KÚžÒ\ºÒ·;“O¹ªMƒ,WŸWs,’¾Ž)X|1Õ?_5þh>Ä>›¬î™ Ú„1± µÜš8¤Ÿ‰ÚžôµRÖöŸMù&L¦—PßPǃŸ{EK–rùJ?Çß=ÃÇ>ö ®\>Í–­»8zäE::”¸  h;ä²9&²yFF'Èdê1M<ñä³<ðk{Ñ„„ƒ˜HéS üµ¹œ…íØ‹?úñK,îêdÕê¬^9ÃÐÐ5 _á#y Ë*âº-mKxöÙgY¿®› —²hñ*|žÖ–ZlÛÅó<ŠE×uH$’l¹én^{å)RI]7I$R<ñäKôôöó‰ï 1¤ôg~×zš4rÙA CDZ]¬¢Í•«ý¤3-ìÙs‡ßz‰|v«`ñÍï¾Æ†ÕÍxž.4[Ç®Ç4 t šÅ¨(pÃk7q¼ûŽãà በ‘J"„Ïû'»X¶ô"…B+…öAš\Ã×é:¾š‰•Wyã–cì¹°‘Œ‘¡{ÅQ^ÎÐjuÑä×!}ŸŽ˜éT Œw˜3w'­­‚ËWú8|ðEvܲÓ4H&“èºbSmò…"–UÄ÷}^xñ ÷Üû«$Í"ƒ}<ýÌk´µÏãž;oÂu ˜¦QBÖŽƒk»LLdùî#Oqú•Üu×Nl+GÑvcæ[hm›Çk¯üŒ††–¥DižçQ_WÏSϤ¾Öà¾{n¥¡±.÷I¿8¢P3bT'®Z,µŠÀúÀ²¼ƒZ¶µ–\W¶–”“„‡çOÁ¿–Šm)‹ 5w¼h—„aDC=dP]ãè<ŽÐË»´—T6š¯Ý$hA›`² Dø˜†a é:É€Ùøá÷¡¿§—·$ŸÏã8.Ù‰\YAдIHYnUr"'+H’iEdµ(¦|¨IÿLÆr°§Û(LIwÏâyËî^Å늂†êž+L›œêõÉ™¨|y­sÆ÷ÑgÊq‘S=¬r# C÷õö§…ö³´nU£ÚÓ5úê™L’/ý—?eåê tÎ_A_ßUæÍm¦h¢ Ivbˆ?þ"]  é*çÚs=¤#ã>ûß<Ì’E Ñ4‹õë»9|ø §OŸ¡»{*¸žÄ ¬9ŽãòÊ+G¸çÞ_¥««•õë7ÐßßOgG‰„隉bl[)²5M£§gœ ›¶#„C_Ï êU H*,M¯r\²Ù'NáàÁ#¼ýÎe4=ÅòËhk­açŽÔÕe¨©Í,Y¦i`[£\ºÔÏWþéQ:ç¶Ò9o1óV²ÿt´Õ“èÁ4I3Á‹7½ÉÅŸÞË’Î~4¡|­RªÑŠÙl‘±ì8ÞMpáÎwÈ_¤hÛ¸®Ç±uçh¹\‹ïûx¾‡&|ú‡3t/½Ìé37RŸ&íû Åtœ‘åBsgê™ÈæÉ¤G94\ Ã›CZO€ä'räÆr Ï¿rˆog.‹žâ©§ž`Ñân:æÔ“J¥H§$LewRLBP¨óºvréò%Ö­ßÅ_þÕß±|Ù|¶ß¼Šd ¶6C&“"•Jb& 4¡áù>¾„µk–ÒÐÐÀÒ¥ë8xø$O?óCCÃÌi¯gtè<-- ÔdÒÔfR¤R‰`"™Çš•]Ô×רD±t"(¾š¢­ƒþ² h… e ËŠ•¨ÌŸ!‚Ý´,¢Qµhªâ̵RãÉÒbtx%­Øà˜D¬ ú¾_¡à.?u²l±+ôPDV*àB+µÂqqzýšÕüQ›Ú­‚Ų+ذy÷þÊGÙ±ëVnÛ·—›n¹™m;¶c:µµµœ9Õ/U2Z˜í/*ˆj{Óeoé4HVT‹fg‰h?$=Éó΄¢«¬1eú«¨žêžÔ ÓÆž^ª{¦¬îi_O•=ïøqêÕƒSà)󶧆UF2[„.gØx.¬X¹”ÿö×ÿ'ÉT‚B!ËèHÍMu4Ô×(56/äY½r ÛvÜË/¿ÍðÈ0'O]æÆm·“N:¬^ÙE"©¡ °m›ŽŽ:7Aw÷*úû¯âØ.Žë³xéZ~ñÌë¬X>ÇAú.…Âjãï_á†uË•¥ÊQ!!R Î_¸Ì©Óýܶgø£Œ÷ñØ¿eak.Íc -ö5sÒ¿J[®ÇõHÑ¥I!›C7V°bE KçX¹b1+W¬`õº¼ûîQ5>µQ §Yy¾¤¶¶™'žzãÇß#eæØpC7¹¼Æíûî&—Á4†®GÞ^×Uô¨eÙd³®^íCŠ$ .âÉ'Ÿäc»›Æ†4ét" FI$ªÇl*»TÂ4hmk¤¶&¦éhš •(ñ²å£+âC.¤/£B¯§ ®ÅBé«FÌbïÚ©Zh'K-‹]X’’­(~²¢0{ž_¥)Ë‹pø{_úeEX"#²@}Qö|2(ø•zù†h²×T½óJTíd2IMm-­mmttÎeÛÎì½sŸÿ½‡X{Ã*V¯[…‹ªx]¯Ì§,Å, µ˜^å-fR;W~Œ³DõA“¿¨n:Ô”½ÛëPAW£$‡IüÄUD°ÎFÕ-¦ÛLT¡Åšík ['ßzÎÆV5mᬒšŠÞ®f\%@Ñ‚{?z_ü7ÿJ {ß—‘eÄu] ‹ñ EKm›––ùôöåð|”9FGG+™LÃÐñ<Ë*4v)%Ž«óõo>FsS wÝu«W-Å÷,4M‹(éBÁÂq\Ò™zúrœ=}”uë–‘L¶±víj^zéi::š1ƒç(]°|îºç“¼ýÖ3hºÊðN¥êxñåà ôò‘{o'›ÃuŠE›ó¸ÿþÏ2<ø~´8Ú¶ƒe™`pÄa÷®[9¸ÿUtC2>nñÜóoðGÿËgH' Œ„‰&ïyŸã'OൃyIPp}FDzør)óŒ × i’«½IZ›<:ív É,ùD;áb8FÄ~€¤§?A{«Ã©3Ÿ‚ÝÅêþ¥Rgñ‰µ\Zýnà‘Mh´w\åôH#ºz?LCÇ0´4Õ‘0t†Gó,[±€%ËaYEŠÅ"®'yïýsœ8u™Ï:Æ›¯½Nv"Ë›¯¾ÆÄ¸Ä0Ê63YZ½Qï¢z*XR4™õ\q`RTGuOý‹ê¨nIu_ÓQÐÓ¾§rÚCœúuMCßOYVÆŸis3Uþ …³šYÒ2NmÏV|V±¹ÿOð©_ÿ„ºøÊYUŠ6ùœ…ëAOÏ?|ìçìºu+-͵¬\µ‘“§.SWc1gN º¦ãù¥=<<ÆØxž}w|œ‘‘A-êæ¥ÿ…¹sšË z¡Pd"(èÅ¢C&SÃá·/â¸+º›X¸ L&£’¾€¢í’ËåÉf ØvËrùÊWã7?ûqjjÙµû6.žð @j ¨õ––9¼ªüæÏk'•®¥P„o~óî»gmmM€JÊ’Ò'™JsÓ¶{9ðæÓ$ DÒä¹§^'m&8—›àÌ»ó™×òããE<‚ÚúƒýM˜†`dTÑ4.ÿúe<߆‘3p4Ó5ƒE\22*p½åš[þ+Çaú _\É‹›žg~±¤Ÿ@‚ú¶³äF–©Âlhš iêhºŽ&32ÖÀêUW¹óž]är²Ù<Ù¹á1F/÷sê¹ýœãm/^A«ïØAMsƒú ßgÅ]·in YWCª¡Ý4´ b&£+Kb´J¯PêW YU—Õï<_Í¢BlQF_ÇÐòd‹I™ TcX(µXB‰Šrø^‡EºL-Ë ¼¦‰IEl3‚†2 ýZnšÊ¡Žmóòó/Ò×ÛËË/¼ˆU°p‡|^Í,×´òl™I å â±i åÿ=é*{ª•â§HFQmQ›d#âWÓû–3×®sãq͆b6=︬b&½ÕtºÑ–¨â†ë%=BG@±ÿñKÈî=·b;NùN=†,óù"EÇ¥¥µ‹þË ãH,ÛÆ±]úú‡Ø´ù62i‡á¡«ð$AûÜn~ü£¦±!MKkžë’Jexêé׸û®=´4*¥®ëzX…"¹,‡y’ ûyð_¥håhnÃßþÝWùäÇw±pa'¦aàû¾¦åòäóE•6%`26>Æ•+½ÌmÔ×Õ‘É$Ñ Ïõ(X69²Ù<…B±± NŸá?ÃøÈe ‰.\•zˆ•¬¢M.W P(âyÇß;ÇÙ³WùÄÇoçòù+Œ p¼é<¯=·‰­ÉWŸ("4–¶!û:Ð4I6çc»>­ôÕ÷—Ŷ]жƒ”Çß=Ã3ÏbY÷|z¯žÄ¶Æ8þ¯¿ù>;wlÁuÒ”$ÇÁ¶&&òFš½û~Ë¥â±=Åœözšk#¿t(q#ÛüÎN4]gówräàkXE‹Üx³éqÌÓ ´ |t#O!—Áõ\%¤òm꛸²£qXâ¸cnޤeâz*…Ìu…BRŒ“s-ÒÅ$ZÑ@s L[ lç«‘}Å1Z´ú`Da°È ãÔr¥wëVž¡©±ŽºÆ:r9‹ÁZÚ»¸mÏG©¯…Ö-Æ4`íšnº»³~ãŽý%¦©EFï—ëza+øüã?=Šô'ع}-uu Üq×Ç)'0 T2‰ih†¤|i˜†¡kJð§Å¬†1®RDÉpPýùè[ú\â#˜ãÀ£¿à«_ø½o½‡=2Žt\4] ËB)±å%BÝØ”„®ãÚùá1Þ?Ï‘ï<Bвt>F2qíJŸHQFs•Çý•ÔÖ"@Î^™’[õ”ý A˜*Ê¡Î÷ýXô§bã}ÏÇ î~€¸ÃNuÔ«–R)àƒžoøs¸Ñ Qt„È¥,_$£DFh{ª¢:z®ìaOÖ¯,êay"™$S“¡©¹‰æ–vïÛÃÝ÷}„õ¯¢kñ|6lYO!—‹üàš®cYn™þ@La3©7üzÒSˆ¸¦Lþ¢ú¾jY~¶IcbR ÅŒmÓ™ìmS=¨dŠ*zÞ3‰ýfêã_ƒ gB¶ª­jõTŸ/!•Jðw_ù¿iooÃ÷ýHMß…°ô"ýX6 çKEaç µ,‡ýÞდ'O³qãFúzŽ‘L$¢T)ÛqÉç-&&rär×áÊÕ1›ÔhÇ];7SSc’L˜hº®Ð«U$›-P°ŠºIOß8û÷àæ›Ö’Ê´³íæ-=²ŸÖÖ:4¡á¶!×uÑô$ó¬äÅŸaó†n×Å÷šÞÈ·¿óöî¹…¶¶Š–…çyŒeihšÇM7ßHïåwp]Ïs±Š¶móÎ;§éè\ÎêUK8tðujj’¼ýÖ»$ ƒ¼[äg ‡Ð¿w óáûJÔãº^!êc»µv†K¿ÓGÍ¿$1uôQZü†è³í4ÙÜm´µü_èBcN®Í Ôõ’ÔÍ IK ŒQL­Ãèš*†™t‚cïÝÇÝ{/ÐÙn“L×°iÛôôåxê©ÇÙ{Û6Z[ë1 •‰íxn0ëY!ÆcÇNqì³üÁ<ÄèHž'Éå <ÿÒ/ù/|žìx?c£ý躆ãxøÒ§&SÇxÖá{ß{Œ‡>÷Q–.]©§=/¦&†@\ö)鄨@2²ljTiê Ç*òä_}ƒËGN`Œ“6 t@ŸDÝ!D)Ñ…Pa&_*C*ð!PE0ÓÜÀýßú 2Íõøž[¤&I' /\Qâë*íP~ Ž Ñ/Á¬m ç²×XØüXägtí†=ûðq+ûÔh„."ïxÔO¦T5-TÆÝQÙ£Ö&mÉkÑ„ªòdÅ}*K×tè<|ô`„—¦kH_280@Ñ*2<4ÄÑ·Ò×Ó˱#osåÒ©”IA£êÞðu!i¦¦ž§EȳèÏ†êž bWcu›©…P­š÷p&Û•}üI)n1c%žáŸm¦wµÔvPœ×oXÃßþÃgdx4X,ã’HQvåµwƒE]y˜}›æò‡Å]­Ìël)¹xe˜«Wûøìƒ”bÓq\ò‹|¾ÈùóWðIóÑû~…'ÞbùÊyíåÇY²d.ét]Óp=Oõ¥J:—³hlj!]3ÝHÒséÍÔd”Â\ÇuÉç,&²9ry »hóó_¼F×¢¥ÔdL>÷Ðç¹tþ(`G}8×Uç|^Í ÖÍz¾úOßᡇ>Ž®AKk§Îô²ÿÍ×øÈÝ;H$Á{"xò§/PW“"e&x¹ö0ïý¬“EÚ|ßCÓ'(ÚÛ6ð\ŸÁa›Ö&“â<‡Â†"õ?É0$Æi 6p \·ÛYHMÍQlá‘&Ag¶‹‰ôC©A굌ZXuÃ8 ‰vt] ëÉd’d2Ckãj–.¶Ðu±¬ÃùÞ[7-¡{é\jkRd2*XFTkÁ²ÉåUÚ²Š†ÉÚõ;8wö,Ùì8?xô'ìÙ½žeÝ É¤SÊÂ&Ž­Æoz®¯t¾Ï±wíîXÑ IDATN±÷¶›Uß2Ö ‹<ºÁùßìÅ‹ƒ ©C• =+´9pö2¯|ëqN¿y„ºt3(&Fh«QjPˆÃ‰Rš”‚ª–!åÞF…ÇåÓÿ9󷬎ÔÑ“RÙáÊ,KÓB\둜a²WHsËØpŒ°ïr×+¡êpuñ¥J áO„¼ãªë-Ké#´Râš®kV¯RÖ5¾®ëÑïdäËŸÄ­V–Ð]ŽÊª a™®(O:²s†Ûâ¿B[ ƒt:Å#ßþ.}=}Ü«PÀó|rÙ¬š¯]é×þ0zÒÌ\4?¬A™Mé:¨uY¥}:1×”Ï3 J}&ª»ÚMÀŒ=èŠlg¢*l¶Á'ùÍ;G_|<×¥¹uuuÍüËaáü9$¾/),Þ>vŽý{_¤¿÷Dô<K ºž{á}}CüÖC2<Ô‡Dð­ïü„{îÚÁæËU’™'è™fsŠÅ"™Ú6V¬Üȯ¿ÌظÍÐÀivîØL&“"™HDÞ¹|!Úm›þþaæ-\O&“¤¡V‚´I$fìùjPÁO{»X$“ÉàJ‡óö ƒÇ†C)óXV)%c m¸Â%kL =(‹¤H(Ô#¾´" @V¨'CçÄBú2½Ø¦EJ 2®…ÄEšÌ C'‘0I%´·5±vÅBÒ©cã9Ìd‚9óÛ)ðëþ6Cý'ñ½\ ¬UQœ–e“ËYŒOL01‘åÂ…žñ{÷îæü…óܱoõ>5™$™L†„iDùܶc":0MDà.£-)%`I_–-Ì%Q‹Ñõ¾¢sÑ4 Ù c–Dþm¢XÕÍ µY)K=¯ˆ(±\òÉ(ç©RÕ*{Ù•Ez2Ô=µ¾n‡ÀÀÀ®ã0Ð?@>—ãW_g°×_}‡DB¥¢FlÆöu iÿzEca.T‹n? j¯¹PUwµ"¸™F^G‘ŽzÐX´£¶«AÏSÅyN•³ ð'ÿéøÂÂq½ Uš[îRá…(cÅ<Ö›Q‰O†æ“LšQ,f(.ò=—·Þzƒ/?ü/4Ô7ðè??E{k‚ –,žGcc=ét]WÃ:;›1õ¼òê[èºÏðÈ8MMsÙ²u/¶5ÊÎëqœ|°ãõÙ¸~9;w„‰lñ±!\Ï úÒ‚¡¡,ßþÞã4Ô×31v¤M&åóÚëÇØ°a©¤ÐŒ>¶ëàжÃèX–ÎyKÙ}ÛGxûÈ+\8w–_<ý"[¶¬!aê$S‰ˆ–H.]èe0`"tõ¤hi®'•LÒ70F¡ z¹žçaš†k"|Áø¢,^³GbØŒP#ÒÅ*îÄuFÐõ¢+ûõÅŒ…,}…¬ÏCH ]&ð¥ÙÔXdžµK¨¯­e"WÀq}Ré$K–.¤¡¡†þÞsô¹<óÌ‹tÌiÅ÷%–ecY˶}nÚ¶\ÞgÕŠv:ç6²léæt´±aó휾èzˆm‘âQÚ!†'¼ïûQƒ/}œ¢C¾`1‘Í3>>Áù ½ôôMpǾÝÔ7´Ò×sö6eáI&L ñcòùv±ÈÀ Å²›9ñþ–wϧ¡! ̤T½ï\®©·¯ôŒðÔ/^â×>y'Ï\夷÷ž“#“Iã{Ê×],Ú€ sþRöx‡¶fææz\×%•®ç•׎1Ðw™}ûv"}'zý£Ü}ϧÈeû)äðƒ1›®çñÏüB‰Ç¬¢š•LF‹E6—çÝ“8}ö2š®)¡•Ô0u ·Ñ§ø±"æW ô„à‹ñì"Äר¯uÕ ̳æs&q†”¦6@ƒƒ¡{¤:°réBvß²tÒd,›Ç²l\ϧ¡©Ž›oÙL>_ _(R,Úœ9{‰Õk¶Ò½t!gÏedÔâëßx”{ïÙÃöm)&Ð5¡|Ð[Ó5NžºÈþÇøâ>IkKc™à) ÃðìhD0¼A×~¸8›} ð …h]Ã):<÷wßçÊ;§°F&Ô`ÀV Mˆ5ü¬‡tvŪ¢æxj—¢Lˆ9ÙÅ¿žÌT‚_ûþ_’j¨lL•°°|à… t^y€JP4ü¨x‰Á¤çã¢. jÏóqÕ=YØÊtÝУž½®ë\ºx ˲åÍ×_gb<Ë›¯¾Îø¸ŒÔã‰ÄõÙ¯f¤lc>ßj•Ý\Õ=K›×u©º+˜ð91-#0 •^FqÏd«ªf–ê‡Im«ÉEuüí?ü5 jösÐs*Ÿh^±‹«ÔbÏ#ãŠIáà …"ù|MOVÏ£>ÂŽí7}7É~ø ëÖ­â¾{oQ/%¶ã©â‘+pþÂUƳ’~ô#œ9u”wÞ»JC­Ç–Í«ÉdÒ‘(¤`Ùd³9%6Ë[˜f’•+7“Ê´óÓŸ|µ«R_W s_úQÒU.—§`ÙŒŽŽòôs¿ä‹_x€ÑÑ<»w߯™ÓѤ¢T`;*8Eåû<þÄ+èºÆ§>±Ïóhjnåk_ù>Z`mÉ ¤Óiêj3ªÔ1MK—ûyãÐ;dsEòy‡š´‰/ÏøðYkI¥’¤’‰ 좭¬tŽ‹aè4Ô×DÔ¡%PÅú©¡=/–6äôýR*˜çùH› [,9þÔ«¼úíÇÉ$Sè"@Æa¯4vžë1Ú:ú‹dŒ¶.[œ+híÉD¤ñK+,ö¾ç±àÆu|ôïþ§`]³É B%õ £÷CÆ6¸%³ÑÛ>ž¯”Ì®WB;¯õáß…LC¸áÐ „apùJ?ó÷?Àq]Ö¬ZÊ­;6е°ƒÚÚ2™dp^,„®#QÔ¸¡%®éZí%c£<‰y¬¯E+eÑ¡è£ÆËãà®™ä%ĵ¾*7Sõ£g\6§¡ÉgR¡‡~mÃ4(ZE^|îúzûxñÙç)ZJ·R(p¿äÕB†v•v¨™Dc²Šš2“˜ëšú?ê®v0š[,l-õÚ¯K¹=‹â,ª¬öp]X½fÿöÿCÚç´½?Qž',+–¤øÐÍ2” ˳õbÑ…¡ˆ'DÂEÛ¥¦¶™B~ßw¢(ÈBPäjëÛ¨©ic°ÿ=êëUuçüUø¾ÆóÏ=ÁœöF ÈúÙcã÷}ä#ôö¼!6’çØ;gyóÀ1>û™O“0ÀõŠ<ÿÂAš›¹sß2é4Z€‹ÅbP  8ŽËÜyË0ÍZÞ?ñ.?ùÉÏø­ß¼—ÆÆz2鉄l\åžÈ1‘-à:.½}CÜsï¯óò+/²iã ¾òw›Ž×u1MS 1tRÉ Ó@Ã#ã \žàÝýWèOö '4¬_qHÿsMÛÙŒm'ðü7¨­Wº¤EŠ6«ƒ«ÉKhhè†ÆŽ­kI5$Y4g­M ¤RÉ ÖÔEú’¢í0žÍ“ËÛ4·Ô±{ßv²Ù‚¢² 6K»7ò󧞣§ç t D’ßøÍÏsþÌ’ M ø0td ìsmU,ÃP {)í«Tt}!aU÷-ÇlCr (YŒµ<úøKœxn?㽃jÞsØ3Ö´2›à_=¦ÐÖ‚“Q г*´ƒ"kÿ n@¿3IqÖ¦°XcY~÷õoa¤’Læ¨-åh‡ÁÇ÷K"9u­xu2^Ì:å–>Çq£o?Ð;„C`'ü<º^Ó0 ‚eó?þþär…hsàû’šš­­M,[º€·¬gy÷¨7«RPU{BÓu4 tM/eŸ£M íc%±_h×Ò&I+ééJÿ—Ä vÅ¢WÞ{–Q¸ÊT¨·Z¤=SÁ®,úÕò0Û\×uF†‡Éç ŒŽŒà8?ýÑOèàí_ž'•R'“içÔuˆÆfãYþ Á"Õ˜ÌÔ÷žq˜ב0ö‹´XÐL˜mqžlŠÓgzWCm+:K°jÍJþâÿú’¢À41…=„²¹f2¾‹—{QGD*uÌu=ж‹ë:@)¶Ñó< í=1‘öΜ½Ì˯cÇ-8tè(ŸûÓÔ˜$Î 4 ×Uv¬B¡ˆëztt.ãáú½wB@:]φM;xíÕh¨W¯Üq<ÇFJX¹j+õ -¼{ì2™~P´@çà¡£¼ñæ1þý¿ÿΟ}]×9yê"¶›âW?¶ßË«ñ’Á­\Þ"ŸË38£hrüÒ.\ìÃ.ØøIIBhŒO|œ9s^Ä.@zj‘”°“ÌY\OkK#Û·®AJ%}9ŽKÁ²ð¥R£z®¤`YŒŽç°Š µl¼ñry‹·ß~Ÿy V²í¦¸pþ¸¢¤ÆÆ.]Í34p†=»oTi_ˆ êE¾[E¥l_‚/½È2-žj:G…"Þ' {̹‘qN¾xˆýß’”aT£*¨Z<:*DË Ì¨ƒ…ÅX !H lô)ñbg´ˆ·Ì˜ Kĺ¯†ÜÿÝÿŠŒBG*„_eZV$Åz¢¾j¨ÏÀÆ™*;^è=·ƒM—Ê®w#Ô¾‡ñxTÉ7¾ù8=½CÑñ„Šì½ö­%‹çóë÷ßɪ‹oº:o•}OÍñVy륂¥kzôZã=ç°@O–ï’«ñ8ÔH©"r9¹­J6£l&xeQž.Ùl²Ç™,‹|²B~%JŸa&L^xöÆÇÆxþ™ç&7‘Ãu]r9+ÆÌ@/H¢±ª¢@«¤º§S_ =¤>“j¼24*Ð3QÏ0}¤ç‡a«H§SüñŸþ;V®^Ùa®ù„âŠÓø¯ãÑ»Il”°³¨ðyÊH¢î®YÙErye{*ä-Nœ¼@{Ç"V.ïÆ—I^}åçìØ¾Žt&Œ®ØŽ²pgÉeóØ®G_ÿŸúÔçùú7þ‘•Ëç1~†.Ô*®ã‘/"¤èy:_ýÆc|üc·‘N'¨­›Ë¦Mëyù¥_°`þœØK¥BÎÔÔ¢Íüó¿Ï§>±!¶íàù>O?}€¾þA|àWðܶmãû>ÙœËé÷/ÐÛ{UyK…†i*?²’>‰„*ÎJýdhÉ„® ESש¯¯ÁÐ}$A¦v%Ð C‹r—Ç üÜÇ—ÅFyŽ]O)ßdzœ¢Cº®†úW¯ôðúkO³zÕRêk0 ªÀÛ¶ÿ(‘œ:}‘ιm¬[Ó]BšA‘ ÅC~`9ò¥Äó½’È #be„”}_ –€×õð‚ÛßüÚ¹täÅÑq4Ã@|Êz\°+ÒaáÖcýåhà„¤„ 6@ÓRb>á²iV”'–€Y¶õiPMM[Ÿøê"YWSÒgc.=×+‰¤ÂþaØ_®;ÏS"0×qK›–ÀBæØ®ÒJØvQ9!˜Rö#Ú\ o:“â‰'_åÐá÷ÊŠÌÖ­[Bpþüy%“®ëÜuç.îÿä.Õ›Ö4tCõ°ÃÜlA9­÷ çn_SÐB˜*ã»bN6•í†xQT´РVÞߟ\õ=>]±žmËT›…ɾB¿v(œíïë§hYô÷õ3>>Á7ösìí£\½œUéh1¿öõ(­?ð¸ÈY Ü™63Ъmd°mLš†2ƒªz*…Û´´ö ”¶ïC"aðå¯þ õ¥: !Ñb“nÂc©OEq{¥…Q ¾…"¨±”~´0†½*!ôr?g°Ø8ŽK}]+ƒýœšÐ—~$€q¥ÁJa%Ú6,<%Ôì:nDß^9z‚ßzœÂhÝÐÑM3¢³˜ŠJTRÛa@Gp\i!¨ þvHJ&|?Ry‹ „-*¤nÜüžiŠôØ•~Æ.÷Ó¾jqdoR½g"zKeœ©U"R°Ç"Ò"j?Íù¾l¼äç¢íDÈ8ûP*¡ÁþÇxýÍc$ƒis¾ï³xñæuÎŒ±ÿ~òù|4oûgO<ÏÆkXÒÕ„i‘ [×$RÓÔF3-¼6å(YÔ*‘i8M-ܰF¶¯~_Ù_Q5)ŸÝ-ClÔF/Þ›žJüU0,®úž HH½W=‰?^\Aÿ·¥µ€ÎùóB°÷޽è†N*•â{ßü.===xã–e)¤-DÔ³`úÂ6“š›)×’™©îé×S&§U$´Íª¥{veÓ5¦í-Ìb`ùLê:°qójþíøC›#¥vÙ #Ã$#¿,>X†¿§ÂføõË·=2>xº"ñ)L‰ {¾ïc&™L ‹ºêyèsÃuÝÈ/ýÞK÷òÕ¼ûÞêkm© jj›Yܽ”‡¾L×Â^åÇxžTS¶¤Éšvqáì[eC+äacÛ6G¤0Ëgø$Ï<õ]:çÖòÓŸ½Â¿ùÝOÂ-#º0C5«”P(ÙsÛNКâ­Ã/ ÝQ’É©tš„©Ššm»†ÊæöýŠ ^wèßõDÄ2„ÙÙJE«úÈʲªh`†¦ %ÜÑ´àq||!p]O¡MC˜JiêûÊ’#‚)I*¯9ì9*šÔó•0onG+«6¬dq÷:ººsáìÁHÀ¦ié«ù×~ ä#fSŠúª1å1‡jþ(JRù¢Ý¨—*#;ï+dåÈ Þ{âe†Î]QÖ'M¡] "ô&~ÉŠÍAˆnà(¹IÓH Á„”ôû>V8„¡‚®Žã9×vJ½fÃ@j[ʲ¿ñcÏ5jÚµ}Ëø‚-b¬•”?ˆÏõ#U ðÆÇwòv7Ê.Ww؃ö¢ÍS(¶ŒÞM£¯„gŸ?H"aDÇÑÒÒ–-›˜×‘BÓ `¹dR2Bt%„§aÁ²ìˆ‚7Lýݨjkxh(íAèm“ÆdÐꈆ|ˆ×&ƒA º¼¦À)ïu\·Z¢Áýˆ!*â•®[9+qØT”õtx9m?½¢|ªçº6«ÜÇqlGPȸïãEÁïþþïÑß× í‘‘¼q€cGÒäÉÔô–ª©|M“E^”k˜v\ä¤=âëG9Zñ×!§¹}ŠÂÛõÆ4vݽç*ÔybšÞ3€ô`ÃÆUüÍ—ÿ{ÔHˆ²¨Á”s©ÃxC)Ëß±Ð6ãų‚ƒ…EF³yå5·©¢Šr T˜šîº©„A2™ÄLîaYE®^½ÀÑ£osèðÚZ›xøk?¢µmxìXÞÅœ¶f…úLMÓh¬O266ÎãO¾JMÆÄ÷%Ù Mshk_ΙÓï³oïV ùQ¤ôikmà¶Ý·póöû8}ê8šF@íºä lÛáâ¥^úŠÜq×G¸pö-\{Œ§ž~•…]K™ÛÑ„i*D‘/Õõ\Ž~_å˜O²E”’Ò¨½ _˜Hè¤*Î4¤¾²Ö¢ŒèR.þP$O>ŠåX‡EÚó%žçb HÒé$ËW,ab¼Ÿ‹Îògþe/ê¤sn›š½¬}ÌàùÅI@aYgâ™ÑqZ6´UúuC*Þ Q  žVÏ™g^AºnZ6ÂΘo9.þ ‘°$„ QÓh×u ÀeÏ#+%^@…‡â±È-%zÂ$ÕT‡ftj­kºi_¿Û*bfñBÛVpDÁ'“]—¾ÏêÝF¦¥¡B¦o•®ÜP@_¢÷Í÷Àóq<Çõp£÷*(ήb5TÄ®(ÞK«¢®iضÃ7¿ûDÓ„|>ÏÅ‹q›TÊÄulŽ;Á¥Ë=eÇ|ãM7±fUšp*9(¢BEÉ–£Ç² i|?žÆÖT+¤4 S¡íx!eö*ﱊÐ;/ËRå*—âø¦¨!džɔàe“Á¦ Í§+¾ÕRâSôòB-Ê6¡….™JR[[KÇÜ/YÌ®=»¸ÿ3÷ó;¿ÿkׯä†k8}òéL¡‰@Ý[s`ʼîi³Á+ñÙ4Ås¦Lð™æSË*6¢Ò®v¾hÑÕ‚äb¢ZF·ÂŸ|é ܶ÷VUÊ¢E ˈûO9Åò V,_D}]&èM+zznç"Æ'$ý}ﱬ»K-¤ŽÁ842ÆÓ?{-¢CT£éZ”mèzÐÛÓ1M¤™ ™4‚>³ê-«à§  ö¥0Ÿ:ìYãK„®E1JœAÐ@‚ãy‹6ÙœEÁRôXKK#Ûv݈mÛѹ644Æ ë–EjTJj„Ò9Œç,§¬•ú:\HÂß;x),Ö¶ëà9žç`{µø2/M¤T»ÌC_þ2ƒï¼ƒ™H`†‹VlÒRÕm8UanÕ4¤ IINJÜXrXX” @º.¾íÒ¼j1­ë—Ó¸¼‹šyíÑùÒ…fÂäâkG8òí'¨1tªi±Ç«üò—O}ë/hZÔYv®{žW6 Zm\B¦Ãó=¼ XÄ ²¶RvF©¨PtQ ÄÜ@­ڬ€pqô±g¹|¹?B˜ñÞtؾˆ#¶’øÑfݺuÜqÇ>šê‹¤Ó 2é4©”©6ÐAŒ:7K™ÜeÁ*­[¢ É–?b~êÊÞ³ ™D¦‹’pL”ÎJ!EÅüêé3¼'£œgƒ¤«AË3!÷©î?ùÿeEÿýZ1ZÄøêzÃ0Èçò Óß×뺼ùÚ› ðÆ«‡ql0A2š6 %ô‡,æú ‚±£­7ÖLŽ §œF ïªfZÕdÅ9ŒUü“/ý!·ßq[ -̱•Aß8ˆRŒçkGVE9Ûq”àEÃ"EjxŸ@îËÒRú±Q€êΚ¦èjM § ‰@ÄdQ´l„0sùÁ£OÒ9·‘Ñ‘Kô\=ÃÃ_ÿ›6Ü@cc †®,J%ë‰Z̆G&¸ùæÝܼýrÙ"##W™?¯™šLŠT*­TÓÁXC×S“¨ÆF'èìlaÏÞûèè\Éÿöþ3KuâûY¾l­- ÔÖfH&ÃyÈ#à ^æá¯ý˜ÅK–à{ù‚C÷² œ9;À¥ çcéAZAhA‘¾ CÑyš¦út‘ª,+ZµH`}”âK,Gùg¢ºšúlDV´U>¶‚šºZÖ®ëÆ0 ¦A*•¤££¡ t¡)ê±LˆK„"I)Kq“aädØcv=ÕCõ\?@Ͷ«aûHÒ ŒýišF×îÝø¶ÍøÙ³‘9ŠÚ c*ËTBê4:M£_Jú|;Øñi1ZZ“áK5)æïÞÊòÏÞKçm[©]ОN©áÏ8œw.=3¤çàqLÏìYÚ4 8žcÙÛÕãÅ'QÅœŠñëADvÄ0l‹R„ IDATÄ/õæc aê½S̃bh<|Ÿ@|é—â+57öãø»gËf=oܸ‘Å‹“Ïçµ·[¶è'“IæÌ™ÃÞ½{Ù±cºG^àkWçªçù-å¡ÿ‰{ï(»®û¾÷³÷)·Mïè½$AìÅ"v‘EUË’ÛJË~öóK±_b;N¿Ä±ì¥µlÇωm¹Ç²š%Q¤D‰¢DR$E°€$‚‰>(3ƒ©·œ²÷ûcïÓîÜ`%ÊãZX†wîÜ{Îþ•o‹mHˆãº9Ä+ïÈf€H¥ã4¿;-Šºó›ld„±Ôä)ȬE“s.>–*d¾g§Ç,…k/î±ÔäÞéq“öUz29'¶ËZgìwÑIº–û,ãØ¨ç)Æ–æØÑWQZS.WY³î ¦&ó %ÒaB2™£p ¾'9ðêsTÊŽ=ÄØØ¥”+e|ÏDÒ1kÅVàÇ-¤”|ü£÷Pëáôä,“g3<<Ê%;†xâ[ %s w Ò•ivƒ»V[,RÙ‘ƒæý“˜‰B9æ–‰+“\l’§r0†iTöQŠœCW޹\*•ìôDº•²8¥@ñÏYÊR.rP©l½­uªÏc»ÚŽ"âH¨!"e Sm)@T¯³ùþûÛ½›>ó¹9üj5uèG® A˜";æÞ N¬¢ÉÖßIßæ5x=5Pš¸æð²L] „)èJkÊCý¬¸t gŸÞ‡p¤i Ò QçûÔñÜœŒJXÚ:wd(c­ræ$)|¤ÚœÁÔ"eD’0›_Ü÷:O~ÿ¥Ü¤³fÍ6l܀Ɩ-£ÕlräÈ^zé¥tš¬V«<ðÀûèꮡ‚)-´öpÉá#'yú™W?5aäqŒçºtuUY±b„¯ßÍÕ{¶[c™,lCH#€µ²Ìo»ú–²«eç£Ì=™op{ÚƒIŠ«Ëö |Îgn繆º©í|)[ ~V0ea½wxç57…mGd›ÎBÀÛYÛùç4P„Aˆ_ò¹ëÞ»¸ç¾{R291E£Ñàèá#œ?;—^æÙï?ÃÌŒqF“<¿H=Ò(€bÚb//„ÿ¨°h÷G†=wx¢8†‘‘>ý™ß¢§·»Øêü…GZœ…°‡†•ýèì.°°ÈåÖ&ö‹ªp³˜‹"²)=E†"ö‚M þµJÔ´{4%ò ×uˆ¢˜™éc¸®KOw ¥0’¬F¥¯ìû>ã)êõ€ð.NŽŸ¢«g·ß¶•ÞÓ@ëkÂЧ٠ع½ÌÜìi&¦|šc õ£•&Œ"|¿ÊkNòð7¾Ç{¾-ÿñ»éé_ÏÐȳçN¤Ä–(Š9‡Åëˆ[Þu?S|ÿÉGyêé—Ùµk#£ÃÝD±Âf"Næ9ƒá9Òš~8Òx¬[ÏìüIPA‘lß}ѶŒJ=£1kØ$”!'ÉNÂ*’Ræ8[µdÌèÖg›¸(ŽÉ'P™XÃÌ-LÅÆ–Ò¬kUêzUo8w DŒq:ñtœ´¦gÕ*nÿÃ?äÌ /ðÚ_ÿ5ºÕB7›tÙmÂi¥RBX¾h’p'ìßWßr›¼h¡išÀ0JÍ´QÉ ø“{D iž™bjßA d¤µó¯Ý’♼?yŒU¥ ™bsh…FÚf8ãl$¿b $D²8W¨ck ŠL›á»O¼˜®«µÖô÷÷sà ×Ó×­)•¦b¾^£«k;û÷ï'Š"„œ>}š7ßx;–ïxÇe¡ÞàK_yŒ^|ÃÊùŠÓìÄä4o9Éw¾»—ukWòK¿ðc¬^5j±ÎвVvMmõ4*ÎKªŠ'Vògèâ')ÔiqÖ…-¢Y¡Jôçù6I)…²R’]ûú¼øp;!­X(;K¼:ÿ¥VëÙã“÷EÚ?«Žt«ÆEÍ4}æzëê®ÑÕ]chxéÞóàý¸®‹ãº|ë‘oqjü4~ãQêõ:õ…:Íf“0P«ùóдPÿOê–ÿWë¢Ý NÁÿ‹¦è0„Ûï|ÿä“£§§;ÍpNe…N/{ë´Nb*›Œ´*ÎtE-R"¶ÎuIÁNà–ÉC²cUd.6ùg.äØÞ‘‚’ïã{6“ÖâJk“8BXÖ¯âÎÛo`õºÝ ,ã™g?Í5Wsèg©T+x^) È9c‚òÆÁ—?5Áñ“ |ðý÷ððÃÑlI~ì#ïãŠË]v_º!…ue hµBˆÏrôHÈïÿÁç'â>º»»M«ÕÂ/ó×ÿïßsýµ»yûç™9Çž+w²kç&6l¼$eb ´-ŠÒ®ôͪÖIÀŸä Öf]—¸^¥D0]4p+`Âè6kÞ÷”iI¢MŒi0€pD±HvH’Oׇ"G˜Ñé1‰& HŒ.¢Øþв&&1ª™;wšîî.ªÕjTVhJr^Ôh0´c7ÿöo3ý꫼õWÅää$õ„)œsè×¹I8ŽcúÖ.góýï¤{Õ2ÂùzŽá˜­™ÉçeV’#-÷t³ÿ¿ˆj4‘ŽƒÛîÛ}ž›3k^H¹¦øË”}\°ÿLï1“9&÷c¶­Ðz±„'™¢ƒ â«_{³ÃzãÆMønHW­L¬4ÕŠ »KòäS/Ój©¤NkM­«Ë\«R033Ç_ÿG˜ššÁó²Ç¬]»–¾¾>¢(b||œ©©)\Grôè ~õßýÿöW~Šë—[x%ˤvó&ÚÁóIä’nRD›[YBÂIÓÐrz“¼ª }ß™°ÃÑÝÈÚI´íSöù¼¾Ï§µnŸÔ;=_±pëÂV` ªÔEê}.8‡¦ r¡2DN­5×Þp Büðûƒ3§Ï099E³Ñdß‹/qöôY¾ø…'(—ÀõH'îB§i±³û"Yã"/íý!žß`Ð?BìÙÈ—_±‹ùË¿@ÉLäÿEB°Ñ‰îNgb‚D³LRÀ%ZdšÖ—S6Ê.p¨Üã’ /ÎÒqtŠQêÔ¤B§‡iÎÜÂv±‰ñ€cÉSÂê³ÃÐä7[!‡ï?ý/¼xˆÛVóìÓòÕ¯=Á5×\F__7år ×1 Î86ržVÒl†8ŽË®][¹òê;ùÒ—¾Ê ×o% ç)ù•j‰j¥l¼¦Çê ,,L30ÐKOÿz„ˆyâÉç¸ñ÷Q«zì¾t5kWQ*9TªëºäpúÔQ>ÿù ±ÐÈ^Rdy´R¤R&‘L´R²xk ‘Ð|âRÒ¼¢ÓAÓy“Æúe+³ÔÜÂ’»*µ2;vnB¡ ~Êùƒt²Nt¹¶`äMJTlŠs‚›F¶P‡¡MV CZ¦Ù’4›MšÍfºZ/¤Kµ¥M%žÞµj•M{öðÖþýœ=|¸ø~$Spâjå{ l\Íå?óüî®\3šóÀ¶p›( q/É &Vìÿï_dòå7p]×àι %»y­ݸšU︜8 ³ï›?Œs÷J’ó%žJ¬òÓ³Êâ'ãØ°¡“„/€§¾¿3g§1;Æþ×ÞäÔéIКù…&ÏüàUžÛ»¿ —æî;oGè‚0âÏÿê!Λ-L¡×\s [·naxhá‘aV¯^Íôô4sss4›Mææ7\·#=Ÿ’"Ø Bã¢'B—H‡ˆ¼·ngˆ%c‚ÈŸ_S‹QUä›>_Êú¦ /Í«SÚ±à¥1g½H×ÝŽ)wú{žœÖik´Ôô»ôßóqb±lö‡*Òb‹*‘ÞR¯Q~Ôºª 1¶lŒ+ö\É7ßÀ§~á'x×ï`ÕšåÌÏϧNs®ãQFúNÖú߉E»?jìYkø…_úçÜq×­4›­ÂŠP:°ìPȨœÿ¢N}EIM’C-}AvÁçíú2Ò¶ÎÑÎ25BæÌLLã “ŸRY4]EFŠ)¶ïº‘‰3'Ø´á$7¿c”¹Ù3,[6ÂÏÿ܇ٱë:úz*?ö }®V+¤Þh°°°À#ß|éøü؇7ð¥ÏÿžòÈ7Ÿç#¸דx®12IØíÆÔDEб±Qöì¹’gðÏíÝÏå—}žžnºjU|ßC:+;hæçÜxÃn>ÿ?Fà€“]eN. 4“KÛMÑÁu )´Ef‘6^YöƒñSÖÉÔfO5)EªIͦŠäй¾Éôœn*‡9GQÂ(N&fe XÌßMAq¬ÖÖL}SSSôôôP«Õ–ÄåÊår:­>r„7Ü`¦mf` ZïÚelà6z×-'ÂÜä“M *CH#LÖ¯à•|N~w/'¿û<3S‚H4Ø\˜µê ('+ݶæS' j‘ã Ox¢Mî˜Ënv\‡X)<ǵ2½8…„Ö®Û@Oß( œ;wŽññqÂÐH¤Â0äõƒG8ðúá”ô!s…·R©ðÀÓT«>ßúÎsLNÎ&G!{÷îåõ×°jÅ»woaåºå¼~ “'O¦Xö‰ãLNÕéí-™²Ö´¿ý;N½Ñ¢¿·›uë–³}ëz.»t3•j™8Šr¡æ3rÚ°]…BH§VœŸ0ódINÊI‘&±ÍýžLÞ™Œtq¡KÎ¥öiúBlñ¥È\K}Ÿ‹eç7œÿ³Žgšª‹ Nö»ÇÄ‚0áÝ÷ßËýï½)áÔøiͧÇOqnjšgž~–}/¾Â‰ãóø>”ËE¥ÒÿX´{Á*þCbϨVÊ<ðà}Üú®wŠs²&i÷Næ V'HÖi*•R% ¯ÒuÔ"¢ÂàŒÉúMä¬@µ5þ:[e¤ïSŠ»¤Ê ´•³d‡©•ÕÍ¡ƒÏ %ìÚµ!aÑl4i¶û_þ{_8D½>ǽwßHEÌ-4Y¿~;›·­b~!díšQš)ªU—®»Œå+Ö°eÛ5<ûôWèë¶dŠ˜FÓ¬¸ê-¾ýí§yç-w²÷13uŠ®j…X÷™Ück’­XDzhï\q“‰(Ø ¦SœÙ×¢OÁö0;8L!—‹ü΋›iiyæw¥sEº`Xi<¶u|á!Õ:§Ä'](ŠF.”$.©4ƒ8!6%üƒ‚£-ð³³³DQD___+Ô¸®K­V£T*qöìYæææðªUËð3¸Ä²¹• n]Ëõ¿ôã´æè Ê^³ÈZIC3[$cMi¤kD1ZG<õD8»€ãy†À—›œõ&gèfOâÁl‘’×@ºÑ–¥ŸuaZ«BC”äi;ŽÂU±ã˜‡ú.¥Ì#‡Á*¨U+Œ±sçN&''9|ø0sssA°hå+¥ddd„û￟®šG¹²°Ðâég^.¢îînkô3==ùsÓ<ÿâ«T«‹õf°D__­ ¤Õ4g‚#>÷÷òÂK¯§MÁÓÏîC)ç¹\wÍ¥ÜßMlذ’JÉG+óobTúøÔå° »Mpþ¼Ýgv­’ý›œ+[çéTÈ–² M µ•‰µ?&0 cá\äªvI×Ò¸².4åɦ±8–'•uR]ŒÓF§ æ9B£uâoνþ>úégùò¡¹ãîÛqÏ÷øÎ·ç¿ÿ×?efÆÜÿ³3u¤ÌÖÔíyÙ?*,Ú½àôüÃLÑ*å¿÷ûÿ‰+–†a¡8§;y•­ÖŠ¢µ†Ì–ܹ•˜Bi‘ÚP¦kNÙ_ic×rù.T ²D°u<µ-çHsw¥4ÎWJ§–Ú’g›ÎrÉÇM½kM:"k¸„F‹Í—qü„Ï–íïä?þæ¿Ã÷$ýýCÌÍŒ³cÛ:¤]]š ±Po0~ò(gÏœâ³ùev_¶Ý—lÄ÷}J•>v︑'¿÷m®¿î2†ú Óß×Ç?xc£==9ËÂìvíÜŒVFctÕ fgç‰Të7nâàýÔܪÁ£E¾"'(²Nùö›9qš"!£ä¼|÷™B±:]™SóïUú¡ç´²òâ %:5KdT™$HÇÊøi'¢–(Gqº 7Ÿk–¬œÇ™ëõ:ZkFGG)•JÄqL­Vcnnމ‰ ¢È¼÷q2²kSdëÎ(FVË\ó©Ñ»jŒÀ&5ás=‘ùhÇÖcZK'Áñ|tsì;ÏqúùרŸ8ƒ”×óR¼Y\€–|ݳ)~¬ºq7QdD4a|¤µ!Ó²¨[4©l=[œ–íkN¦8)Qæƒ-¬ ]+¨18P#Œb‚@17×Âq†AkE³Ù¤^7­5µZÑÑQFGÇpˆZ%@‡Ã‡OÑ <×M¯Ã›o¾™0 ™žžæÔ©SŒS¯×iµZéÚÖÜ››7oÆubZA€‚…ú/î{›µkÖsssÌÏÏ›YkžxêžüþK¬]»‚ôÝ\µg« R‰´Q@+ùËŸA:/[ÊÖÇÙ¦/3 Èš´\c¬ ëkMÕù{d)ݲÒ(‘“|æb™%ðe–”I-…O‹|¾«% ±XBÙÜéë yÌý]uB‚sçZqU®µHe°Fƒ=Wíáºë¯ebb’f£ÁÛoæÔø)^zñóû G)•Í=ãû?:,Ú½¨ýúEzn'º´J¥Ìþ·ß£¿¿oQqÎð"NŸ)ÓÖJ òÚÊcBŠÊRÒ¤¡ÂŠA[ëFjûéGvd†]k•3×7NI:&‹û³kni™¹iÑÐv%(¬Û–0 Mš|O,&Eš.uvbšÛïx7óós´BŵWoÇ•ÕZß÷pl‚–@„ÍfÀÌÌ ï¾ç\{Ý=L;Ë¿ûõßà²Ë.áÖæ,ƒËÆ6à8+šAH£ÞäÔø¢f“ÏþÅ×øäOw3ÐW12á²ió•üæÿóin¼þFÞóþçä±C<üµ/Òjµ,J&rF_ù+HäyÙ9ÌFt¼[mœ4?Zï„h È0ÐX[C™ä#[öpæWXmëâód¿¬³öy­Õdrm IšÏí8æú«–C¤ 2E·(M³Ùd||œ¡¡!úûû9qâD:ñ¥r¡0dx×.&_{Í43J³ñÎëÙvßMÄQd®Q™“8I]_“v½®‚ˆÖÔ §_x7¾ø~µœnB<)Sç2ÎSœóË?è“’nÇaZiÜ®jz¥¾ûNG’úØ‹TÒ˜á}BJ´R8Ò¾wR€g^·(y8¡´Ö°ÆþÕqŒc˜tD'êºåôõ”RPoDLM5j†‡qãPçù.®ãPòštÕ„ål@+Œ ›6€JÅ¥¿¿BWWeËÆ¸ì²Ë˜ãí·ßâìÙ³´Z-‚ `Ó¦MlX?–†w!¨×C¶mÝ–FšÏ»ÅÉ“'8vìF!àÈ‘üÖþ~õÿþ§ìܱÖr- A …köH©ÛkE¼8…òTöJdéªóª9ƒü2s ¥&Y¥ \+“¸Ôzº}ÅÝɹ¬=>³°¥*ø«ç“u*¬BœW7´DeÒ癲—*àí¡ç«dæ5+ÜÝ]£»»‹¡áa¤”¼ï¤i_ß|ø[ŒŸâ›?J½Þ ¾PGÅŠ…z«èšø?E»‚_pÅhþm³ W]½“ßø­c™ ªme’IÿW]µ‹Áž”£¤Ì¼ó¸³(ÆWæ¦ØN¶² a›Ù<+• *mýÇsÖ»KøW]ˆµ}1¤±âêúb bûÌx1êåN,ñ¥ªXþÿ단vºíßÉÜŠ\†Ú’ [\ãu!øÐGÞO„œ'BΜ>ËK/îãì™ ¾ô…'ñ\ÒiÛóþqX´Kîetô•)WeÉN=i„>ôc÷ð³?ÿIæêfUÖÖ9¦‡§%iÉ—´ÊdìdmØ IÚÊÈ,öúŠs,ëäÇŠskó[Öq”Yù!P‘IXr™NŒiQãR‡‘1H†Š(6¬åÄÓZ(KÚÒmé?æç"㪴uûõ4ê3ÜúÎKB…š02Ý™ã8ô¬ã+_~šÛVã8Òø!J &ÏÕùó¿ø{®Ü¤ŽïàVv_qó³oÇ-\ÇØF*ËPNÖÿ­V€Âedl¯¾ò*gÎL22TcaáÝ]U¤£Q*$hÍIɦ­»øÅí»xûÍ×yöÉïâ8¥¢ôó‘RdgyÂô•Ùæ"uÊ]çZ1jtÞ¨(çÉ6ãšâ™$:’Ãò î¬x[˜B‹äb&TcgJ)m.itgg(¥¦\ ðý˜…F™(vÒ5i²ÎîĤÕZãV* ]®ýä{Ù¾lXˆJÖz¹d¦é0 Ó’äÕÆ±²P‘L¹ Zg¾ßa K~(•—í¾Œ½Ï=G£a ƒ3g&øì_~ÅÕõ+X66Hww´dn^142Ɔ ¨U@©¿ù»Çxò©—Òu}ºÅ³gÓòeÃ\{Í¥”Kµ4†6;Ç$³ó \ÇÀY¾ïñ·÷ >÷ùGq‡Ý—náž»nàª=;©T|”å€-¤PæÞHbPÉÁ@qîkIqèäVÖ>-‹ÔB¸ Ä—¼©Ž^tÆœ;ãÎâ‚éö [ëóAT¢ uÕmß§ó [§npz‰ÕõR`(l2 bÿSçGEªOWé¹1¶l Yµz%W_»!%¿ñ[>¾çñÙ?ù Nœçé'Ÿ¡ÕjÆ1õzaˆEûêasÍüÐä0m<µý?ü ·¾ë¦TR‘'mœ…T܆ޫtÝ­­•`²nSö±Ú:?eÓQf;˜L¼RÊ‚•cÞ—;qK.ÈÔÕ(!5I íÞ¿;Ò)¼[ÊÆ&ºDìä‘饋r"lˆ}+h1ZÅÆª²ä¥Sw+Y¨×iÔ›4[O>ù—]~#ƒõzƒgž{O|ücœ›§±pŽRÙ7„³f‹0Š©”«EÏú•\õÛ¿˜³´Ô“´ØÜ,"ewkEúžj»uJtåaƒ26­Égl’íSd›ÕÈ2çãôþMMö‰cCºRJåò¸UnË’1ΘaüÔ ÇãèÑ£4›Íœ$+kÖ”Òlß¾»î¼‰¾Ç¿ÿÂ7yiß›¸®SpÙò<Èf• ëgາPh¤”|ìccÏîQÃpžá¿ÿ_?—굕Rôõ ð©þa\'âÌÙstÕªlß¶žõk—Y)fÎî6á$ƒŠ°î~YZV±IÅ®×Û«Lv‰"ÄêÛö”µö¾q>Ÿð¥×yM-MÂç+ì›—}!¾JfMÊ…]\`B¦íöçϾæº&`ÉqÆÇÇiÔ댟¢QoðÔÏò‡¾ IDATpöì$O=±ß7“v’öå^ˆ%/:þ`Ùß{z»ùµÿ³\uõå¼9yO_¥sS³µTš36)„ 7]¥Å5ïáçLMŒQH>8#yÓT¤RVr„Ƨ·Ñ´.R¦›Ÿž˜á­ƒG8úæq u𭀍{K)Ùzéfzz¹Êªu+X·u-]=]”*¾Ñ¥GÀôÍIˆ!žë"…“¦,9®ÑÌ&‡€ë)JDì¾l —ìÚŽ_äSŸúg|äƒwpòø«ÔªUzmþs„ï»Ì/4˜_˜cùh™W_ ˜˜R8bŽ…zßïâúîcåê7Ù´a¹‘WEÙ×C­Våôøkœ:ÕÏ׿þÞõ®»¨v™÷W:.…Š›xž”]ݽésõ +p=‡rÙÅ•æó<Ïb51¥r™#o¾Æ“=d]¿:ÈíR²Qææ–iÝ‹X¶Ö&ŽÒ„hIÖ¶î”Nö€2S¿4˜¦Bx–lhb!…*„R¨("¶ÖhÉt麂’RwÍ „R Ïó fo¯[×QÔºZø®¦²sQ̂ӃEzÙ¨ŽP|haÂqRl^f'ªE4YäÖ‘Fcq}Wz„`Äu‰€y¥-&ÉÚÞn&,M޹ž;äE~­'LÜ\²µÒ8E%׸Ʈ¹M—+ZG…C4™2\×µúzÓÌè4á*;T.BRà]×ÉyzMuBÜé"ŽcªÕÍlÞ¼™‰‰ ÆÇÇ™ŸŸ'‚tÓQ­V¹òÊ+)—LØÆø© ^;pØp6l!îîîæŠ+® ··—0 çäÉ“œ={6Gr2çÔÆ›X½rf³…’……:ù7æºÏÈ¥’Çoý§ÿJFiE1×^³›_þWŸÀ÷d*“$g>Ò »VhŽ>ÉŠå#T«eû½Ì¶Ð‘Žm²2éc‚=/b€ë¼ÁÉbÍôcrÒÞ€æÝÖü³³õ’+g!–ÿvÒY_œh){ž¬qÑmxøÌ=WþõªóêÌjÉÖÂ4«&¢s` X±r% ¹ùÖw"¥¤T*ñý'ŸæÄ‰SüÙû,^ÉÇ!e‹¾±Á‰*ŸOæ7Y¶l4WœYÅ–vÌÖПÂJ[¥Î_qNú‘ÄÓl9#|%†&)Ë111Éá™®ïS*y¼òÂZõó3sŒ¿}’™©Y&ÎLPŸ­„‘ÉþÍcBÒ8i«w‰ó3íýþKi,Bà9’žÁ>Öl\Ūu˹äê]Œ..˜­H!®Äu³Baða£¿m¶ZM# 9rdœ÷½É²•›9ôæSµî^Ê%¿ì¥ùÏž2šÖÌÏ×Ùså6jÕ Ž¿œÏþåïrÃõ—S{þ›¸.Ôj3(ˆâˆz½E½Ñ" ΰvÍ ffæ4…J  9Çwñ}ŸrÉÄc–ü®ëâz.•r Ï÷™ššen¾ŽRµj ­ã)Ó7ç¼Y°[Í×=wŽXá˜Â Iål….QXw·ßIx‚&ÆE¦ÔI%”uŠR(eHP¹G@B¸ÇKðÃJêÐÛQAR)—i6C©rZâU÷ÜÀðջР&ž+¢pÎä#l˜–8Ò˜ëí3 Ìv£¬5lE–l£‘R£” ŠHÍ?¤4Ø¿t2Dç&H‘ð Œp•nœX¦¶¢Ž£Y±¬‡z#`~!Â÷ÇX¶l®ëáyä$Kƒ>µŠÉ‰>}f*-šI1Ù²e+«WQ.IÂH1ÐßG­Vcbb¢@–êééáÞ{ïÆ•-š-EÉ÷ø›¿{„™™…´@'ÏyòäÉTS/„a—J>W]uA+²¼rWÊýòë)%ó·ðå¯~ÑÑV¯ã²K6sÃu—±jÕaÙAk×›ùèÜ´%ƒ©T.*Òp ]`]L*V' Ð K¯È­µÏ_ä.Žõt>6÷?FG­/@DË¿NÍÅâ‰:ÁßÍy# «ñöÿŒ³ž B.¹ì.Ý} ÷½ç.Ã.©}–mÙœ:‡‘İaÃjþóïþ¾ï¥M‚ßæWR‰ÓPjȯ(#R©+‘"Ž‹f#yßäÃOVf >•_¡'7}³Þâ™Ç¿Çsß{‘…ÙyTâ&1sˆTáØUv{?¦W¥œ,‘S%d(,LNóòÄ9^zê%ý·¹úæ=ì¸r+×­¤Z«ØøÌì𑇌â˜f`¢ù<¿Êº [øîûxß{obzâý½%þÙ'ßÏ-·½Ÿ7 cFGp}( Ó•¢y¼×°ÒýR‰Z¥Œë9œ¨Ó7ÐŪÕëh5ëÌÎÍ0;3gœÑ°Ddq3š<ð–oúD†Yç&ˆ´iÓ …Z$ëh·Ý,bÓŒ*GH”Ô¸h¤gØñ±VèX¦­u¥‹‰ãôK´æÆWX¦ =Ž”T§ˆÄjújSëh§TFÊ5×_tºRfyz==kÖpÇg?ËÓ¿ú«Ì¼ñFAÁ)r^Šyë]6˜C A l L‘¬<ØÇÚnCµÂ¬JÜÎl޲ÎEM òÒŸÌŒDÙ)߸÷e ^&¿Úè¤q “Ù¸úi[¨ÂelYý2ÝveLöœµ¨v2¶3úõ8RÄq”ûŒŒ›]WÍÜÿa¨ #aØÒðWtÄ@ŸoúÏ+ã8Ná:zùå—Yµ¢›þU#8AȾ}¯òì^ŵ2.!L<â{ßû^*%ˆ¢&JKžxòE^|é ¾ï¥Ÿ»ã8lذ 6P­Vi6›:tˆ£GrË-·°bÅ0Z‡ABJU…U· dçà‰gyô±àû.SS3œ;7Ëó/à¿ýٗٴaïºí®Ø½™ÞÞn*•’¹V-_¤ ¿N#i±þ%HJ¹†îBI]íź]ýtrÖÅØ]ÝÝi½,– zïÿ“kƒÛ¿¦ÏSÌóxvÒàè6ºî¸ ÐzñF@ò*b„€(²ÌøµÃè ’ÃrŹـÛﺎÿó_ülMlŽlç«•ÊÉ"ÌÊF+eo ³b5k/ÆÚeÑ™óXjÀ¯6gÁL›]5^ù ý‡Ç9uü43S³”<Çb.n–JRã,{@y–ákM¨ ™&Tš#¬õ¨%­©\_šdq’,T-³vÓj®½íj.¿þ²Ôî0ÿ·‚úBƒVÑ׿Œ…ù)ÀÈO¢Øè”[­Ã¾WsðàA>ú‘»ñ}߯úÅHé³Ðôx衯°}ëz{QóÞ}ù;èïïâôø<×3„ XÍfÀB½IEÌÍ59z²‹õëGèëíáô™&ï¸aÕJ™R©„_òñ\RÉÇõ<Ξ™åðÑiš-ÁÝwí¡«VA£™ŸŸcúÜsÓ§øÊçþ̬¾ÑÖÇ[ íˆ$]ǦPÉLÏnp­Ma Ãf+4Xt3$ŒjÕ2|ð.J%ÿ¼¤ËÔ>Qé!u™#³üÌ_¯IÁŒ¢Ø„f$8µõ‹Ö´I ÉHNÔJibÛPËÆE€(áW×[¢b'¦lr?ñ¯þÑá÷ô¤nlNnÉÖ¶Q‚Þ¾‚x‰#P…Ã×^Â%¿ò“EꊗٸÒf™?8²Ÿ9™ÄR UûÞ%&0äšr«—$SODQ†+§œ”ÕOÊJ>›4æÒB`aÑj¹éQ¥X­g-ËIIÿ’¡áÌÄÆÑÃûxß{o1ÚÐȘ.-Ÿ·ÞÜË«޳ÿë|ü£÷Q*¹(¥?Š#øÊW¾Ã¹éYî¾û½¼v`’7æþ{¶[BŒ9 ÜÊ]%KVÒ<ùÌ!Þuë6ff"¾þðs|àÁëÐJà{me(9~(aåk‰Iâ'ÌŠ4ãû'Sh6=§úw¥;ÏÍ"wÁæî•d.œÌ–UJÅPéX)JòÚcÃö\'uR:›r´•àʼnûVj(aX´ÉµÛi2ŽêÁ9ººº–”°$RU·ÞŠßÝÍþ?ùtÉ?9W è’’²4íÄÜiÖHî¯þ]¹ü?ü,Ñ\ÝõHá…B:-‹LR'hÃê„ñ¿×†áNl>6Ç5ëìD;­“Ï99hvS‘™„Í:²&Jä-dSÙ‘k­ZcT”åyËÐL¾o›{[$“ÕmB„J¡/Ó^„!µŠÇÆ ëåðáÃLLLdžÄÙ×ׇã8¼õÖ[…sllŒ›nº¡ÎÆ1Ž#ùâ—¾M³˜Ñ>ø~Ö¬YAO-¤R¶yê®CÀÙI—Ñ!­b‚ n3ý KS&]M)ÍWúÇŸÅu³ä/ß7>ü™ß4'Nœáøñ3<úسx®Ç}øxÏ2ÔÒÁ+çhV˜”EAŸÜ^0òz祜ÌÚ‰fç'‹q‘ÚçÌã/4wš¾Õyžë|f*Å4Eö/†9™$I…ËÒãò×yÖ+òYÚ rNb:›HuG´¯­Õ„ñËÿ”»î¹f³Yp»I»‡œKNÒýš.¶›mU`ef®OQák ¶Çq–&“Qiü’ÇÛoã?ÏSßzšZ¥BO¥DÅbÈý®Ç€ï¡4h"ó±b>‘ôä¬!cm$J‘RJ%„›dê¶™o'ŠÈ‚á¾=ÐT‚ƒ mI2‚…©YžüÆÓŒ;ÍÇþ#øå’Å2Íaì• ¦+EÖ˜õ*iC£”f¡Þ`t´—J­ÆÉ3Šçž}ž«®ÚÁýOP«V)•K8Bïc×¥N“…Fƒ kGñ\èÚÄìô1êõYN>Ç 7ÞÁÜì$·ÞºÀèpS3ŽMÖòÙ±}€(ŠÙ÷ò)^;0I©\â=÷^ÊúõÃ;>ÍÂB@OW™¹Ù9„ˆƒ:RZ ¡h6š3ÑmŒÓ®çrðõ×q‡0 BP.—¹ùæ[h5&ñ={ùè·žæø‰3iFyÇìܹ“õëVQ«4ð<ë— AÅš’/Y½¢dȬQ¼È‘+ù¹Œ_¼" #NšàÙç^K‹sr\ý tuu133Íää$'Nœ`zz: ðq‡žžnzzG ƒ×sÒfÕ4MíXƒ•¼-/Ù°•è³óò®NyÔKMД ?¼÷ÅMÓyßólZí´š¦[»oæ"ðm•]kºhWZ¿Y’dþÇ^ì•® ò7#“3÷¡ÛN?×9 /™ Gð·_øúûûh6ƒ üÎîq§‡W’r£r²M²¾Î.HÇÆ3ΫsLìd•¦vb†ú|ƒÏö+ìá5Ê¥=• UÏeÀ÷é’}® Bp&˜µzçvkž”—û^±Î,ESE]ÎTå ·ÌeüzÂd%Ó s¶8Ú0Ƽø:óGŸãýÿä½Ôº«v½ªÍŠÉ‘¶h“Þ”­¦YoA@¬§NOrð¬Z½Æü ½uœwß{%ß1! Ò1dlm'Åz£IOw…¯>ÃÐØV>ý{¿Ï²eÃôö”èéîbŲ!|ßcf>bòt“ ëú‘BðÚÓì}ñ?óS×â¸%þô/žãWþåíüÃ×öqÿ½»Áƒ§Ø¹c•9ÔJ¡%a„AFZÖÿ¤¢’¹póäRnò· OÞlDkÍL ù‡ã]øBqdÎá¾ÕõE’Œ$zRHk’æ`j¤pp(nl¥ÌæÀu±vìÊ:—Ф’ÉÆð%ˆ5q”­gsvu)×"1¸‰B#åi4ÌÌÌÐÓÓ“N̦E”xçü{ó7i¾ý6=RR²ÝsLö"–8¤œJ‰•÷¾ƒMŸ¸/åM$ßS¤Îwí©F¤ðÖ+=ßÝ“›à‘2i5“«¹ðc•LúIÚ—!‡&¤ÿÅo§9ØÉ»víbh¨Ïßddd˜]»vYå‘#9r„V«Åõ×ßÀ²±n‰-6yÏNmÊd{GDvCfýñIWR´X%)%ËÊãÏíùÔç#ŸušP³©~éóâ@ŸgÝÉE.Ñ\˜ÖÙEäÞ·vq¤.øªçqëbζÀÍK¦’›-éÂ6oYÿú•ÿƒþþ^;çCÌ‹ëêì0ÓF¥ >EŽì«lŠNÝp"‹Eª8ŬTÎúScä{ŸÚÇwyЉñ³T+JޤÇuö}Fýõ8æX³É\[{GR9—ÆxÓFÖª0í¬ÞTpT†(­qb-š31·Swò(\!ðµÆ—ŽÉƒ¶+D©¯<û*qóþŸ~€j­j)S™‹Š_w³Òl¶h¶"–­ÜŒR^ÿ×\µ£G^a` ›O|ü>ÖoÜŹ©Ó„á9K– 47v«Õ2˜˜€£Ç'¸óÎë8yâ0££¼ûÝ÷R*é˜ëš_è0Œ8qrŽÕ«›|þËûéí­òÙ¿ÚKWW•m[F9{f)c£Ý=6ɳϽÍ·íLµäAФ^o¥®Ý"?N:ç™Þé–I:w‹i´ûT=Ò…×|›KGB.ä{“œ $½¾Î© r)@ö4ù€t&J&h!r«'#JI×5SVšHņàiùhV½ZÇÌ;ÝÈÆµ´`~~ž8Žì8Yä‰5]]]ìùЇxáßÿ{ürÙàËIRX‡Ã-ª7éݱžu¹‡žõ+¨ õ!â8+Î663Óóv&éäÀM £•<&†:! É4ÖDÊ’e·Ûךđ*[¤ÓšUsH4B8˜L‘9†%[¼Ä H¦0‘L›!³ÕÖ3sÖ¼]žçÅ1Nè …C`0 q]õÓÆP Á®+˜šª3·ÐÇšµë(ùÝ5sAÈ?|íñ´p&q£üà‡ñ½&ÕŠ 0É0ßÜäš#í©¶A%ŠU³!~ûYNžJuÕɪ´ÑhR_˜dõÊA<ßG !,Ú 'žJ)sßQZœOœ<ËKû¦MI~ò|óÍ78xð ]µ ;¶o`÷e›`ù²¾ï3=rfbµ«» Z!AQ*™¦ñ\0JŽXÅ9½µmNë'(ëQžåCSˆ©Õrr-e.‚yxþ:Íomþ1ä1!Ä"\¹“›Y§{é«m½Äº»“ýh'ç2užçnÿ·‹™åÙÏŸšu¡Ép;‰Ãççà~?õÉ1}n¶ØéŒe©´ÊÝ,™S“Ñ=gŒÏÔQ(¿òÖÖw7².L+½$ÝÈü(_ú›‡yöÉ©”|JRRvú]—e~‰²ër¸Ñ`2¨küÖZޤ::@ÿªQbGâ”|¤ç¤¡©q‚#ݸ25Ê-«ã´#f'¦ÑQÄüÄ4QìBãI‰Ólá+ã Yw%t»®ñ,Ö*¥Áïýî^¶\º‰ ÛÖ§2sžÇ9û:Ä,Ì¥·§ÛhMäšç#E6¹ãöë?Çèò¼}èEæççØûüîºû^zzc~âã÷S²ò·(ŠÈãGrìèa¾ð¥‡¹ïޛع}}Ú½óË`ê\ÈC¼ÉÝ·oad¨‹f³Å׿±Ÿ«÷¬aß+'xß{.Åó}&&æéO 9µj…SG-º®un•“åiäo4]õ'DI&©•4÷¬ž!`?¾ë^þ⡯rÍ5»Ÿx“å4¯ÍølëIt×IÈ]æpW‹€ŒY®S2¤´„¦82ï½ç¹„Df5ë \-Áb*Ö8޽±‰ˆR@„k¦HQ<¨â8fzzšÞÞÞôà,—ËôööÒÝÝMÇÌÍÏsäÑGqlt%m¬l„to_ÏšÝÉज़p\Wƒô\;Å‘rÚ r!ãV´Y©ŠÎ$™EJZ`3×-iSà´-ÖÆSÀ[m×Ùy‹´É”Ë"µc9²›,DÑˆÓ ›ã¤¬ô¤™0E;[é»®Äu•ÕiǸV¯È;Í{e5ÝÂLý##‹NÔA X³f%+W®ÄqÌç¸yóFƆ<ßIñül²7Îk*uKTiÌgÒFQD+­jÄC?‘†xdkðØàË®¹žÍÏ>÷*Ï=¿ŸþþV,æš«w±cÛZzº{PqÄø©yþôÏ¿Š#%}}ݬ\1ÊæM«¹dçzzj)l“(u¤rRþQʱ÷‹H§:»¹À"‹–·zžš×Ô/µò¾0.½¸ÀžÏjtéN_°gq¤5urZ›j®ÛÜ t)3ó&p“C²}Ô~õ7~–[n½‘Vd,äã!u[U¬la6St‚ý¤n_6MP[¹D²öŽâÈ®ÄUV¸Uvã>þð“¼ôƒW©–K”„ äH<—e¥2‘Ö®×™ CZ@(Q¹DÿÚelÙ¾Žùù¦ÅFmn­gí<…°~È%Ì,í{î”}å+…SömâPozð¸®C¹\âÄ›Ç)—}Ž?·53o±-ƒq¹qL·ëä|Å£VÈc_|ŒõÛ×ÛiK¥Û‡¤8»®cô¬ÓŒ•BDf•8ÕëuÊeÉ[‡^ã…—ŽñØ·åöÛ®eöÜüR‰JÙÃu\ð\”òÌ < ‘>òá»i5Í*< C¤ i¶‚ dåŠ^n¿e=<ú÷Åý8RòÖáI«¬YÝÏß~n/õFÄÏÿÌ-©tÉ8Œ•˜8{Êd¾’ã&ä]ásñ¡‚ìŽcÖÈŽ V–Œf%z‰9ýÒ¢Ç1FƒÁÁAºººC)RÞ IDAT¨VMÂÔüü¼9|‚€æéÓi¨Ú¬j™Ñ/gô¶«è^=†ŒŽë˜ô(»ÊNHqÉt“eÝ®eÍbZä[,é&UĪ‹•Ä‘I Q‰¾9I”Kˆ;6Q)¹þ D)m¿µÈðR2 [:å&8¸4vŽtÅž1®½rY2y:Ž´Ö³1®kŠ®ã:iáM-2±™½ï\Ç1…ÝqÑZÑÛã²rå0õzÀé³uZ-ÉÊå5ªU߮ߓa¤•§ð‡²ð_¬ŒÊ%ŒbsóÍo=ËÄÄŒ•(fæ(W^y%o½eR¹Â0Ì]£pîÜ,33ó¬ß¸³ ¸ŽÄõ\¾ôåïðÖ[ÇÓ÷á¹½¯¡´!“^±{+wÞq-Ö¯¢\òµFëЮÃE ûIGæ$Y:—ŸÝWJeÑ—)~Ýæªµ.ß.,%ïZ¼¶V‹ððÎÅ\Ÿ‡ Ö> ÎÖ¡Ú ­8ÏZ[¶Ý3ªM/=g»r!›¢³×ìf+E¨ÔJüê¯ÿk¶nßd²R…]d“I>•*Á•#KªIеÎáy‰¯nÑ/¹øxe |Òõ>óøxüá'ñ<(9CžÇêJ…™0d¼Õ²!І#)ô³zÛZœ’ÏôìBJJÕ Â5VŠÂ®¸ÇM½¢Yƒµe³IÖÎ `«ØàD¡ñ‡žŸ_ Ù Ž”l¼érfœâØsû‘ž‹‚–ԴѰʼn%¢Ð{ý§ŽžfxÙPê®–\tZëô`M±(4Û…ÀNÁI§=3³Àó/ä=ïÙÀ`¿Ï¶í[ÙsÕÕÔ&ŒG¶ã¦++!~‚9®çÒßÛEiV¥ÚG«Ù" LÒЪ•}üÔOì¡V«ñÄSG¸öê54!³³ Nœœæg~úôöVìÁ¦9v앲Çì¹ *ÕZ²è&Ëa(:_œu‡%‘6Ÿ…–ŽIs=Ž>ô÷,óëür|çßüsnø­?&rî\ÙäYýQæ6§Gö [¸ ¬ò¶{­hÒ`me´óÚ6H A)Vb‹ë™ä» ’¸Ž!K–ýÏ™¥” â2Ž,Á+• F#•! ! âFƒ¸Ñ¢¶e-½Wl¥{Ý z·­Ç¯Up…ÁèÝ’gþ)Μ4"'=)Ưs˜h‚¿K„ìÍ%ò(‘rRÌLf¶¶JY÷7¡]*ÆSœ6²e™Â˜¹˜@­Ä¹,;¥Ê1»Ó´¦¬‰Ò*#‰Ü9–­ÅMÓÎ2RZóAÇxž—KÜËVÓ‰žÞuCœÐÁu£Ô«»\òèëífíš±Ô«;X”.À#ɹ†QÊ©‰’sÎ’ÃB{Ÿ:=Á«ûß*X†ÆqÌž={ehh„0 XX˜çܹs=z”3gÎ „àšk®ah°Ç„0ɹñ `pp0 mž¹ mÑZóìsûùÁÞ×â¦/çŽwí)äe;Òp\ÇA»Ž ™‘ŽÝ†$÷l‡æÖÂ…¦XŸ_;ÝkÙ ÓΊ¹j+Ê¢~|>i”Xâ1êôD*íJ^Ã%—\š5+ذ¶›(RLL6™¯×Xµj%W^q%ó ó;vŒ+–S«Ä4›V9ÃÎ; EannŽS§N199i¶iRröìÿãsßàõƒÇøÉOÜc‡×5*m·dŽ’F —lghâ†0IhʲÕãÜu\¬ef-:ãv‰VçB­— Ž%[9Ñ–A}>ÿo– -ÆŒ‹ Xñxµè`:R|l‘¾Nm!î§?ó™cph€þÁ¾´ ,¤Ç¤–¦‹Iââ’\×(RY6³uJ“²[“®Q§ŽB¦8Ç ´‚SÇÎð·üy”OšI¡ê8,+•”âH£A3ŽÍúÌwؾžòpÍV„ë»”Ë%ü²ô\ÏÅó<#‰²iU‰Îºpq$ç´4n2y¦É|„]Ï£\.¡cã‡1­F‹(ŠXsÓþúSÄ%ŸPkª.!Œ4­zÃþÜÞžÙœ&ìu3µ'^Ä­VˆRš¡ÌÍNòà·¤ï]FAÄk¯>ÇŽsè­£|ðÁÛ©UF9³iÌiÝí?0På‰Ç¿‹VŠÑe#T«]¸~‰’o³­›†yôÛ¯sÇ­[h!O=}˜}ä*cG§¡Õjà{®).äpçDÙTˆPË¡ó7iîòL -äÿÇÜ›ÇX–Ý÷}Ÿsν÷-µo]½wOÏÞ³iÎÃE\dZ6£È­DŒ“ˆˆb(²)’ƒB‚ €‚Ø!#Y"3%ˆ’h“’)j(™Ôˆ¤8;‡ÎÖ3=3½L/ÓKíõ¶{Ï9ùã,÷ÜWÕM:‘b71(vWÕ«WïÝ{~¿ß÷÷]\”ʬ€|ù(ضpð=?÷ÙF~êØ6Ÿ9Ñá§oÚ¢2M§°t§¥/2Ñhï²7¯§i똮BG&ãÃ!Œµ¨Ê"s¥rÓ¶ÔH™c¤·NMÔÚ-Cž­3¬º”•ÓÄv»]fggcÖph†½K Ê·8þÏþ‘cÜKj¹Ý²ô„)<¤Ò‹‚:Y4~wBÆ£ÄO­ÂŠ”.7FÆiî •7ui°’Fo-›ˆLFHÚ½Ï*1áÛ¦„À#b­Œ:æL¨èU~X0š E9J±lí=-”ò–‰›vJ$1›NúÕ(¤+×eÊO‡(ß5r™uêí`–µF;ˆÛ!Œ• éÑcttOüê_<ÅÕ«k‰¬ÌxÜrË-Ø×ñë Áþ}]teé÷Ko’ÒâÖ[o%“Ûh]2hÎ_¸ÂÊê&ƒfzz‚¹¹f¦§é ¦Y\\d4*yá…ç¹zõjD[žýî‹|ù+{øàîE)ÖÊ#®ÉÌ3ÒI~ŒðÈcàxd.DZ:W8 ‰¢ß·¨íx›Þ•vוJÚ4í$‹±CßÜÔ#Ãu‚‘¯¡o¾Vj•ýÙÛf—=¹l@Þ×Ót[+ÇŠ³»Ž²å½{س¼÷ÉMÁ9b2 á+fÖöPpÊ®ãèªÈhÔ>þ¯ÒÆOáB®/î/ÿáŸ(Â…Îg¹Rœí÷8L Qd,Ü}3rf ´:-Z‚¢((Z2SÈ<#Ï2 ™¡«’2dþ ›*ws×á‡44Hù‰ý¡ÊÑ4Ë!«ª˜ŸfåÙW¬¬» =¸MJÉ™§¹ãíwcRI™G´—u…×7¼–ÒOW/A*ç ÜR9º2dY‰GwÝyŒûc Án2‘óI•5ÑÄa{cW^ø6Ø»é´'X]]gii=KóÜ}ç~FeÅ¿úì.˜üïßÇž=ÓTÚ „ ßÛ ÏÒüfÛbÑõà\û†%9°ÂWïçÔô#|“,:l ì öÜy&Æ”²ž¨8¿óEšÝ[¿gA¤¤Š„¦d1¾›G™ß‡éQû¶ÀHI&Áåj¸Ðm-FKŒm*¿Ö1uB›±hehµ†ô‚þ°ÅÌÌLÒi[tµM9¼‚Õ›´; % T¦<ôíš•º »F#Ø46v[$¶6mDôÖÿšïp–Ù]ïªà1Ÿ¬½Ò©À5Ù¶Áø®_Ù`°’L½2uÕ p§ÿw›îË ÞgW¶ìôòöaÃćˆ¢J¼°mâðeã”ç¦gWl©U˜ýž5ÕI—£ªöÔ¶$™±®»í¥S¬^]GyXM 뵤d³,Ù®*§±Ì3ºwÞˆœ™@(E»]Ðj»Âœe 2‰È2ZyØõœ´÷ê%½ˆM=YJ Ú@W—+¤cy*‰ÊsŒÀ%•¬ö“jŽ5†Ão»×y¼f{¹—ðMÁÖú–Gêápá†GŒu‘yžƒ%Èâ!-™ÊmWl±–½ûÈ•sY’Ò¥¦5†*$ù‰Ë AYŽxõÅgyëÂ)f¦g¹÷mSäŠVg’{ï9Ä=wî§($y^x†½AhA9ñæ¹ËÜrëN/ÌÎÝ”MÄúV¤ÉE¡H;d¡á`•tØ¥ñ¾TFl©9--aŒ¦­àå5Å7/¶¹ezHW–.SƒòÍßj™sr«àl¿ÅÛžò ašÂÜ4‰eéAì´¤N”àJ'ð›®thQ°½lö„k¾Ûô–N§ëÉh=ôð<Ø!E¦EË™ÐHÇ—ÉJFF2ÜáN”X‚¹H׆…cÂÚntžßoªàº0¤mdЦò+;f"cVc¤£‚¬-A]2R™Røè®çíîaùXxEÔdãó´U`Žûë üºRøB(Aù(Û0ƒHšF)ÈÔÐ yI.%×½cŠÛHJ‹É2rÄ5S¤tº]Þö¶¹rå —.]bmm[o½•cÇ3?Ûr’>/Çrxo®½lí…_çëß|Ö™ídÙ, [Û={âyžxêææ¦)K‹s(³³³èJ3•±)ì÷·ùî÷NòÆçYߨöŽk933“>´Ìý÷ÞÆM7Œ>âaj–~ý̇®^]g}c›[o9ìîé²Ú… Æ®6¢Añ’:ÞíæfÖd’s (ûÚ×øµ­Æ÷Ñæ“¹Ü± O¡öÚ&•1¸;²Ðøz·>dA—È;Âûéš„taRòWâVù ¯¶ö¬uÍ#ÌÈ®˜WŽ(N¶veúó?ù†'øàz!hy«Í5­©¬u M3SdsSäEŽÊ3ÚYž‘ÁÌSIÁ`»‡1š¼Óö°¨Œf!‘^. SŠ\¹üçQUFy Âh¤„<§èt)«’ªÔàýÅcò•5Ó“îÆ!ÖÙ*!ÐÖ¸Ú£¡‰©Ã,Ñ>ïÚ£J34`ý‘ÒÆÖ¨†çÂSk  å%\6ab%ak©dE lnlÐÛÞâÂ>Ç¡#7p߃ï`vnÝÉiŠ"'φ£)¬P´rºÂEh–%wþÐC¼þÊ ±€˜N߸4v?U¥Pjä?2‚¯^èòÁ‰Œ5-Èïx'í©)Vû–?>Û¡+ =ºÆöú#8ÛœÜjsº×bu{„²Wxï6ï_ñäJ‡#}4™¯)².ÎÉõ÷Ö¸ÝZ¸±¤pñ‹²^¨ÓR•ƒB¢„ËI§Â=c±™M|vÝÍ7шl•íµË;¢ÕRÙv{åÀ&:ãÎcuYŠ7rPK§‰^uÑIܸb-ÒÑ™¨a„d—€„¦þ4¼v©#R =׹òy“ÿÜ\,e“ˆã|¼MCFâ=®!a FH”¨C­ ‚Dâ 5 -Áû42Ûpk²ÆÄ}ëxB`£8$ÍŠóØWª”¥eÍo!Jœ'œ¢Û=KsÌÎÎpË-·D“šCû'\r G&M²»2-!ýÞ€§žy±1} !˜˜˜`ß¾}!¸zõ*ÛÛÛTUÅÚÚæŽýn«ÕâÆopÞF"´à¯¾õ]þèKß ß:X_©FøØãßãwï+:¸ÌO~äÜï­Eæ¯qM\„€_ÿ­ÏóÄS/rðÀ2?ò¾xÏ»îa~~†<ÏÆÊ\b0”tE©¾þÚzéÚlç×Ù@ýƒxzïæï=q3æ@vmÉ–CmljUëeºYƒe:‰@èÖ*­ë)ÚW­M,¾Ú¸ImÝ”¿Þ˜˜x¬4¥oØ.•âß~î+l¬oÑÉ” t…®ãIH[U厡,C.ÏÑj·È‹Œ¬pb|•gµ<‰UÈLÆ)Dù‰%‰Ìâ¡h­AJ…µC{;N$ÖÃí¢å Xim–ce:·L†Åanÿ¯™õå;ùì‰ǦJþ“}Ìän²ø«·ºtdÉtVqçä6ïžßäwÿìùÌé?åñ¹~ì¦w3œÿ)ì~Ä¡Ã$ ˜¬Ñš­jÍ„kdÜ5ëôô!„CaP‘דŸ¼FÞF† µý£H5ò»äVÓÈAD>¦ÑœI®¶ôÞÙ¤Ÿ šÄõn׉@¸]/»iIc@³m(Ç–ÔÐßî²GlÂ}µÔ®&Õ°uÊØé.½Æ¼Æ6”–êcnp"î’ãùŒMRkâ {Bk2â|·ê'Ì87E3›RO¡K× ð¾àŽæü±«JG¯ì²*Q•¤RÚZÚí‚îdT¶zC66Jfg:t:в›–˜7üÜ­Íýþ°Q ;?üÃï¥ÛiƒŸð‡ÃgÏžå»ßýn#FSÁ½÷ÞG·íΪrTòûôïøÞó¯¹|,Mu£Š"ãâ[Wøäoü>‡îãÃ?þ^Þvÿ-H)}§áÕ×Îñü oÐi·¸|y…ßýÜWøÜþ9ÿ#—Ÿüð;Q™{¿¤{׺ùu£ˆ÷’l\¯õýPÃÝMVÊøÁ‹4?€úZD³Ýý¼ƒÓN§5×A6êÊMVÈt¥]à:·èæ§å(¸ŸZ»âkê³5&’ÆìØc‡n0È'6WÖ9ûÆ9ãZ‹òZ90ôÌh™)äü K7t¦ùEîv"!ŽÍà VkT»pÆJ9sƒÀ NˆJ5¤jè¶»TƱͅ‡ñ,Þ¶ÊXœš'ïvXïoÕþ¿Z×»¶ŽÁ*m¥h ÁȿХg4gE÷íZ»g»^Z.le¼¾!ÙÂd¦¹yZ³uúë<ñæ·9ºï ÷ï?Î K{ya%£_rU;®…7½26G¤‰*á ÑFĽž—áܸ漽Ÿ'G)UÐÛÚdØë!„äÒ…3œzõyÏô”%Èë×_J5¶öªçdº’©íŽúQûK)08þýû‡üÎé9^åFçá£G6bêÖ°r¯åþV¶0ÌåC°‚QeùØßù{<ý/Nr¢ŠßÝx„ÿæïá¥õEnž1áàjã}ÀežÌ±I$@É™VºJ¡°X©ü·)‡Ê‹ÍL2ÕŠÿ!¬SdE§P_þóZL‘L^×&³@Ò‰?«‘û›tú¶6?H÷z~ĬGðÈ c„q‰Z4LYÂä ŠlìEdü3Xƒü+ÂÛ ¬uÀ&i”hLüÖÔS”ë U>›!×—8HÛ&×A`¥;Ù•öj0BiN¬¡péÊÁÇZk¤6(i£!’Ê$Yé¼ëµ7¨ Ï£ÛÌÎL`÷Ý ë ÏzzàhXÄŽ  ­5íìß—£¤¤ªàüÅ!¯¿þZC¡àˆ¢óØ¿™i—àö•÷ß{þdã½ k¶n·K«ÕŠÁªªœí)ðæ¹‹|ã['¸ãø¾öèÓ<óíüøú¾ðÅG#kÜÑ–={ö0Ñm{¯zãѪƒ›É–§ü¤H’ï¿’3o7øµò Å5Hcò:÷õhãÅZ4|·CÓ¾ÛdßܧÍxÐA›ÄÓïž#Ñ+ÂÐ6’ÄB‘­t½¸Ã~ÚÁ¶¦Þ¿™&‹»áÁí~ BJÞ8y†ÞvV–y‹+Ι”h`È]R2sÃ>2)ÈrEî‹Cˆ2´Èò‚Åb°`Lbí”’II‘X`{°íHA°ªÜAÛ-ÚXÜÇÜô,o\9Üí‹„ð®IR N>ñ<¹R´… ¥Æ?oåïìîT76,Á‘éOÏ´yßÞmÞ¹T‘ûå‚E²25ÍÚæ€§¶_æ©×^æøÂQ¼ûÃlS¹Nö2NãáðˆÉdv,9ÅëVÁ…t¸HDã‰.¢†ü¬ÓÿºóÊÃŒ2‹læWwœFô‹²Ml{éx†¦¤Å>µ›˜‡¥ *ø{‡ûôJËR«dXÙÕq×T[@é“Ê´…×^aã™/ñ¡¶àãë(Û‚C‹‚¯\épãä:B:òcýŠX¨;]Š"2á÷kîÒõ)ΰÅX\®÷œi ¹÷nH¿v Ëõ? ‘2æk8:€rܵ¨áF˜¼W»TcÝ¿¸žyÃî†;› qÍóÞS§ŸŒ Ö¦Ó\Êæ–ÞTDˆp`“:%µ•(™«&Ó:e~„DÒÕÔÏK48 nâ&Ë0e+¥0ÖÄ‚d½ ‡Ñ’L+J)QªÂ˜ùj»F­+Yæ^*¯3íNqpq³3s¼~éW×®8nÕëÒ瘟@[ؼp…¥,£ëÜ&á+,sûöÔÞÏ8ùt¡éHƒÄ⌈$Ã~Ÿã‡qìÉ}X+¨&*®nn²Ø6l,SY†#¥­íCƒåb²ÅŸm,¢DÂÅ[ºTkK¦@[B5¢.¬Õ`²ß[EÔvCýf5±>¼ÀL5+)éNmÂí ‡¢‘üäÂ($²r7­±ÐQš–°Œtb|ã¯G,dTüæ©}|ôÀeŽNUŒÎ¼Èíæ î‡?ýÂorÇ/ýï´©ÈV4#-?)@;ˆ;ºa¥¹¨wDfÌ~WÄ0„] V&ãž•t_øá»¹˜%.MA·m=)J ½ „‰MA€±Ec› Ä^½?v1ï‚ë‡Ó_O&bwõYÞmš¾–ST}€I_lÍ\ÊÞ ,uã/()m2]Õª€è6æ?*©j»Ñ1Bf˜Ú¤u×bh"ÔX좤FŸD`z‡u’q{Xwû)¯ÎÒM‹ÎßÝ¢uåy'6Ê.£ÞÞ›ʼn^†&܇‹&'Z?~;¯¾z’•••Èûéõú¼zòŒÛ‹çyÌ@H‹Ä9xp/]I¥5~ýÙxv„¢:33ñcǘè(öï›bjª‹R’áȰ¾^¢í!Š¢ Ûípó±%ž|ê%¶¶úŽå©×DY–dªbss ¥ ÝjE§2%½þ:ôÐîun\}vL•ž;¶ÑÔ¥A*×ÚmŸ]k¨Å.d0± ËÛŽ ½¯vU?¾äÎP3ƒ}hJk¾ˆCA³È2õ“XÒ¹¬feÚkú‚*@Ô^fŠðÈ;R…û0¸ƒ60t½r:ñüktŠ–‡VëZˆu4>¯Y A.ñžÚžÙçÑtÈ5˜ä@’"Úq†Ð mÓdfŽ©©]h5EžÑ)Úì[Xæàò~„Ìxõü뜻úBU߈TºB E&%g¾ó2BÐ’®RTÆ™–TÖRaQEAÖʉc¯hWœë)ŽL*möû¼ù…Å|Wóî¬`òؽì¹ë~zÃ>•ñæ–âàD•sØ1Ç䊑ÚO×—ˆû>·Æ™oxy–‘®r $‹J̬ ±€*"+‘ˆä!í,ð´ãn:…Ó©YÔa9áÉXám#ë.ÛFƒíÜk¸6’üåÕiŽv†H,_¾¼Ä‘·.sLÂwÞ‚rñ$0ÒpûôœU_/ IDAT€«ɲ M§¨W J6,@ÇeB‚¦Ó•e¬®¹’E}r$ÉøÅ"î3ëÝg`ó§öº"É~u²3ÿ]$’©4» ©û5ƒ½D÷}ãvÅ÷ÙË]‚ÞíuÜ­°7íDJ¹PÑ€ÀSÃ[SO‘#ÑàK%|®º©‹sH˜  Ñ̘º)36õ§ÉÑHö×ÍéÈ6Xï"Àá ÷Âáµ×­­Ÿ¾M”àII<{]Ô k@3í¸=F»s×-X+™˜hsÓ {À *íí¶¶¶(Ë’V«Åìì,¯¿þ:W¯^M’”’V«ÅwÜÁâ|æ ú€ËWV½1†ãÇsèÀ ÓS¹oê+„È™ìæÌÍvÑZÐnßAž¹ô·ù…%ÞùÎwñï<ËÆÆÆŽÂ¨µæ©§ŸãɧžcyχíåÝﺗûï½mk”TJ/•K³êÂ+›ûçÆ}(¢Ÿ¸MÔ )"0~N¦µ#ùk{|_oï¼[gÌÉ4Ô 5 *hQxîY#*R'®_Æ` ÆöзöÌm[ÜÁS[ûÀñR•j÷¢Q‡*‰h´+®ÃÁ ÆØkcæ­ ^¾þ÷Î¥¤h·iMvQR54«Št;géWuN–"bí<é­^D5tìòN»Íôä4‹³óLOÍ0;5Ëåõ+¼|ö¤ÓOkƒUX߈ #¬5ä™ ·Öcõ…×™’ ¥è(ÅÕ²tÅÙÿ7¹8Kg²ÓȃµÀá)Í“oe(R°uá¹1ӂɼÏ3ßúíƒÇ˜œFk͹^î¦Y[¿Á¨o³«_l ­„NÝ}¤¬*¤gaÖ A`ò²›@/‰w»q{Xãu©ÒZç*d…Ó–;rÙ1b‡_v`€Já.Œm0ý1Žã\(þÝåi>zð2_º8ÏRGów'/ñÏÊ{xhÏ9Î]pë‡?Š©J‚Ù¬b»TQ"}_8,•’µQ‰“…¬é8eQ“¤Òn\Ö„+i…g+ûˆKo§dã>¹†GSˆ?eÛ[áù±àË$+;Úp¹âlj[ÓØ †"oRÚuJ6m¸DîïS¹w-ÒײuÜy8înPQïH›>æÍ"Þ,ÚAA!„Œ?Ýe£ Zïo^?Y»ÖÄ×Dé×bî·h†¨»SkAÛ„UÞ€Pƒ-ª/<…. pt¤‘d>€#EåŒ2Hm¨„ã UÔ¨ÆXöí›ef¦Ã™7×è4óósTeååRnboµZ”e9EwÞy'÷ÏÐÊݤæl„usýÌÏM3=•G™ShÀêšç’ƒûZ䙃óçæº´Z’+W®Ðn·ïu–eµ÷¹€ËWÖ¸|e¼5Ç­·¡ÝÊ0Ö’)‰¥VKØ$ù,ðkÒ˜t}ïÅÔ7<¬¢,Ñ 0ÝQ‡ýp­¥¿†¯ehbÙi™¶[#,ûæÝ4ÙÑÞ6ÊÝ{‘8Z¹á Pœ¤µOf1µ#I¾sUé1ë¼ÔÌÔN@žX¦C‘@pùâUdp) ÝÏØÍ›yG±ÁÚ&[}˜ËüÁâ¦a‘4Üj“†¨/³n¢°ÚÒÊ3:s3ÌÎÌ135KQd F#.o®òò›'Ùîm;½ÒزB—%å°¤ßRŽFäR0¬4'¾ö$ª?¤Si·ÃÀhgûi &Sì½ù3ø·i[n˜Î5ëeáÝŠ$çN¾ÎÞ.¬Wpú2ÌÜ}/3ÓQ ²§­9ß“,¶tÃÂ05‰pM{¹7I#&3çM¬+ÇdÖÒÄ$-c4ÚëÀµ•dÉHZãl1ŒÁ é jÒ‹D̾ARîIGã+ÐtŸdݹ±5!Q{ûAáÅoö ~bß •U<´4äÛ½=ܹú49÷Y>Û¿›òm?Á=33n²–ɬâ[+]nœÚ‘5:ëZ kÇ4¯Í¢¦þ?“4;bE­í¶il_(&L ®ðâ;l’@‚èÆ‰cÖÓ:É…´ñ:·±`5àn‘j±ló„Ãî„Éÿšÿì–F”Æ|î¦o5¦9ËD.e±q,}óî±`°éìî4š¤ÀFišÞQ&¹}Ã3Â!Mñq‚1…¶ñ2a·ÙâŽ4Ù€]¥D)›ìJd¥ÑRlj+ìÞÝ É¥KMt[¿u/£Òù{kÈs—OÝjµéõ£¹rå £ÑˆãÇoerB:Ó!½d™b8LÒ§ŒáêÊUn¾qÎû*ˆ¸[‘‚,—.àDJæf:¼ôâóÑJ54@Ýn—Ûo?NU•¬­­qùòe¶··™ãømGÍpdéH‰È\¤kèT“òBÖÑÅ­l"!L'j¬³” Kкè‹H0«aèto-®S”w›¤¯‡@‰ë’ÓÒFÂ1щ0Ó&ØMšFZÓºÎF2Xm2b|§WÛz£Òõ÷„îÓz­è¸ @že´²zO"½Dè€JcɽiÀ ,^Z¥»4SO¢NQ‘á E[)²<Ãj¿«Ì\6jQdYN^ˆè¹¾ÿš'$wÎU|ë¢âƒ«]ìòL#£·Î¤5ñu ‡Í()$h„ëÔ-ãºa#ÒX4aÊ_A›k¼A‡ñ“³ñp´ðФ Á#ž­.eæÓ7ÇÂ,<ºa©Ù›*‰¼ Hñ¿ƒ5–SÛo ~tyAi(%êgQß~™•V‰†OžãïÚcüëóÿZ¾J¡`2·\8´ù>vMØD‚ã'T‰Œ¤DG“µÜ¢ëV=‰ÕŸ3ÖDÍu€ˆlÈW?\’{;ðð+ˆ‘Gs e‚”õÎÎ$ä‹ñ‰Y¤ûkÛ¤È þÚ‹õµ²{Çc?›“…m@–"Ìd”uÁ¤¤Á±q’ý~1‡"ýù2IÖ r©-¤ÄŠ`uZïDIe¥ahIQÑÆÝ[:x¤4h)¨tñQ‰<ÒÉýbô#‚NGÑé$×±Ü~Ë—¯l3 <@ž·è¶‡‘œïXöïßlj¯ÖŒ{)yæéï°¼4ÉÑÃË.RSHgؤR‡ åed/¿ršS§/Dˆ<¼—÷Üs7û÷-Ò”,ïÙí·ÞÊ`0 ÝjqøÐƒ‹Û|òéù˯?Ë™³*'çÊ Ù˃÷ç︋ÙÙIÚ­"sc“ Ÿ±Hài´‡!NÖ²ò†Â=îX¶{Ñ6×àiˆë 0æÂ'1“®Qµdu5 ½] ¹¨LƒØ 2‚CX ÅÔÓuZÜ멆ÜR‚5Pmöh WL-PãL>¤;¨Wµd¸´•Õ×Þdæ¶Ã¨<”c1F´‰¥.È÷·. * Ôšþ`B€¼”5¬(ÆÇ;ÆgUQù@õþvŸAoèÈgBpêkOÑí˜ÍsŽu»lµ8ÙïSzƒÒZFFsèÆƒÌ,̸â÷²Ž^Ë|Ë0²’­K—X\Ù†³ÃYîþÈ!¼|ÉxHu¾U1ЕN¨ÉÅ Út-"$PK8ÊÊù—׈‡; d¸¤rÆBSUÎ~ÕH‰4ÎP%^‡߉×þÇ6]+ภRfÍ$+ÁKÕI艇Ú”1QaðÍËLÊ!ÇÏ|™—}»½Â’¾Ä”Ùæ''à›Úü~/L\䙋ò“÷½Ÿ/^X¦nú¸4(¸<ÌXêˆ(ujŽä G4D¡ŠHJaUQoëwÉÆNºw!P+ã.lI<$cu„&ÆÈ–f¨¬MÌGdB"â:«æ |‰áon¢ÞmW]¿7ª.lcžæ`Ô†ÁôAÊ1tœak¦> ÒX­,°žŒNÂëZÝØ*¼¨E b&D¥ÐE[OÛ$© !ÐÂÔ<ášépK’’Yê“x‰‡{IŠzý‰‚N's vCCY•´ 9*áu÷H°yYرc7rèàî:¾—²¬èõJ6·GlnULL´™œ(xæÛ/ñåG¾Åå+ë‰g¾{ŒJW¼þÚYN¾zš?øüŸsôÈ>Þõ®{ù±¿ópä„ÄžÇלçd­.2…³Çï†ó—…|\þ·»Óص|»¯¥~Ø)µ D±zïä~¡,ˆáMÂâŽyÅU-•rhï)ì XínShhk0Iีa1ž0µak}“‹¯Ÿgíò +o\`Òwa•µ)©ü¥„Œy#ã4†F^ýêÓÜô¾È:“š­@…já m¥£QŠôQjá #èµ+׽Ɍ5¯Ê’aÈp8d°= Ž^~þ±ç˜V,¶Ûìo·Ù“ç¼Úë±­5#O+AMOpû;îvâýè „ê+$KËH¬¼ð ¸TMpüC?Næ#ñÜ=î‰^HŽLzFÒ¦©¯«»À:¡ALpúsAYUŒ†­¶ûÚJ„r¦ Vv»Z)•vÿ®EYl¹]á%EnrÖ~g¤Œ‰7Bx[ÇxXÕSœ"Úf¦×®®™rIh•ÑTÎõs>¸°Nïõﲸr°Ì´ ·™2ÌTÞý_þsNþù'XY•/ž†í¬Íí_ç‡æj#2ïÐ%;©Ð¨Õ3ýî{Gá&x‡§1–u3&ÒÇó.f’fáu{m™ Ä¢9UÛtsŸÒám’fšQl>]Ìýc®kì™Å÷ÅþÚ'êq’XÚܧMu1¶Î½'1¾¨÷—6±ft¼ˆzO\'^ÑpFK—“q§*•o:E=‰D2™r…¬Ó¾b%SbŸˆþóJ”¢±«µ‰Ÿz€î•çN`ëBÍŠ»=ñ±PR¡¥¡(„O³;Øë‡öO³µu„‰‰ N:EY–ñ¼¸øÖU.¾u5¾þGŽá޺˩aü}ô…?z”«+މíÑÔV«ÅÑ£G9vtÎ;I:ÝŒ‰É‚ý{]þæ·žãÿõ×È2Õ°ôL5ôéõñÆ©ó¼öú9žxò%þ‡_ü(S“odR#š ¿ÒÜqÝQ#44ò¦U5R3úS{Î&Û[ì¢æ:²­fqo”$ª‹¬ô^¯á¨ u¨4¾…:|{ታh/i‚©lolsùì[¼yâ4[+ë˜#î„}REmp_„@2ˆ–..°ô‡#^ýú·éÎM3µoöD‡é=sØÊ±Œ â’´å¤5µ¬¦î¾I˜ÂºÒ Cƒ!ÃþrXz–¨eóâUÊÓ™”ìëtØS¼ÖïÓKŠó@kÊLñö|üY4v͸²4ãÓ?;ÆbûãÏxqÞLví©Ûý~uÑIµÿbl¢¦v`›¨CÔâEÖg„‹:ÌÃó3Âß­¬ 5Rˆ×ùªˆúºðwM@t¸µÂÇ”F¦!E.©ü4©¤ T•÷ž0±©ˆ&Ia 2Ùð\rðyØ:’HÓB=1Ñæ¶[öpºS°´´‡ÍÍ ÎŸ?ÏÊÊJÞ„pa=¿ã!º…TRJz½!ßùî«‘lÞ¿#GŽrû­{) 4ë3Ñ‚‹Vù“/‹lIÖáÇ™ŸŸ÷qÆ%çÎc}}݇ÇÀË/ŸäWþ·ÿ‹_úïÿ““×,xy«{ž*þÌq™Vj-êãa…%÷Æñ¦;áîÝ4Ñ»I´¸F‘6Ôq–ãQ”ž{•$ D,ÊUb5È& »ªè;œ^¡à†#V/¯ñê·OpéôyW|³ŒL2%cj” †A>2s#"R’ \׆®uÐxo}›õSçÑyÆ¡»nbáð^²vá ßázÖ²ñzä4{×üŽÅ^UŽVùG]UèRcÊŠ­ W¸úò)æ”b)ËÙÛí2›eôa£ªèCi •µ”Ʋm ·Þwœý7B —'ë (]güN…²¬ Ë÷½ l-ç6àR.÷%ë#g,Ò‘–¹¢d©£90 }Œ±Ñ@£ ý‰†á†ƒ› ½Þ€v·å%S®ã.µcÄhS¡DîŠsiȤ³Xm¨üké¸ÛÆJŒÊP~o%*ãÈ/J­¢ñ‹F€èÊ"…#0ÛKKÝø«Þ`D¿?d0(™˜è6 :\èóÂF—¯mäý¶â4ª«0yTŒæðµósü·®¢¤ðp½iT2I'ò~ËÏ`Æ[Zš0}ZÓßa<`TYÇ.F¿o+êƒB¿F¶^2$#Q²95Û&½$XD’”²›â€lþ=-ÿÃçÝäVµNÔ^SkmǼ°Ū±³æí:aÈ"°Ê&¼ˆ†»yýƒÛÕø<üc€Òùî×ñ®JÖkŸñ³Ú¦]¸üºÎ‹ÂF»ÐÜdIQó<¾Æƒ¯(S’²”h)ÑÊYäÖ÷œ{ݦ§ÚÜu|ç/n²¶ÞfyyZ†Ã!Æ666˜Ÿ_àÐÁ²¼.Nënm7Þk-ÇŽfi¡ëêGjšd-Je|éËÅpT6HB~øa懃©(KÍxüñÇÙÚÚŠJ3gÏóÈŸ}›ÿøÛÝk/´+|ã¯žåØ Y\˜%ϳHŽM3©œä-÷„t÷ à9yœN¤^b½´ØÕpd§Ëî2i7IbbLÚ—EéTBÃKvÊJÇ€ “]ÝHç1q’’‚þvŸÓ'ÎðækgÙ\Ù`¸Ý'‚Âw7JøM¿[RÆ‹:üW%)9•óçRÑ2–~¥©Ð(!˜v‹ÊjÄå§^äÜs'™>´©3{ç™Yš§5Ñq!îºrÆabóäµ›Ê`%l^Z¥ìÙ¸¼Š®*ÌV»²I[ ŽKYÎŒ÷³]­*úZ3òpve-#cX­*ß}3Çß~7E®È²¬Þwú‰Ý]0îãTa9µ)Ù.•‹Ù”†n·Í•Ü·¤ÉÐ`tÂf¾è"† T•Ž0˜ó'î°ÒÊZ*?Ž(ÚmV¯¬ÐívÁXŒ´hã|íð…Ö *¦xéÍ7J”7u±Öq „Í0"=`,/°ÎY+<κݺ ø¸GªEc ë›=nºí(yáäRÉF¡¹g~À¾AÆ—/Ìð#Ë›t”ë\ÛÊðÕKÓH!øïn¼BzÃ7í(©jFª59)L[©û™MN±cоÖtU&=E‚4'‡þØßSMmc‚Þ nh°°ÇèÅ‚k˜'ˆÿh¦çëi¤w+ÜãźéJ–îùÅØ5_ÃÀi¸H×6Èùš$€†m¨GÂçƒO $i •1Á%=žeÂÙу9:ĉÄz•±ÉZ …ò“5@툆G.IŒ¡*íÃ[¨ƒŠ”—pI%Ñ•¢Òš,«ÏîZ–éžÏ±£ mé *¶·K†#ª hµi’¹YîÄ×Ey¸™TõØcO€ÝæømGYZœm¸¥>s‘“¯Ÿs²*[sAî¿ÿ~n½õF¦'4­–ðŒpËúƈ7Ïâ…çŸoÄs>û¼ÿ}÷ÐÊÝÀ—)Åå+«ü槿Ȩ,Ù»¼ÀÑ£ûù¡»oæï¸Ûù‹‹z ”>´GJ°:D0؆ È6 ölâ/’ºÝ‰aã“ñÎ »–5Ïê¬òvžÚ8J¿õÅ7-ÎõM”TE)CB&ÛZßäù§^à—N11Ñ©­\ì¡79'Na™‡eªŸDs{Y¶ÆË¬ÕäBÒnÿRàÒnºÎ”ó-Œ(_9K?Wl8ÍkyM(Þy#3{¼þÚ³¨½¬Åú‹øÍï¾Êê…Ë(ïƒ:© m­Í™WÎpõâUÇ –~Z¦ö»Î… —’ŽÿOùBÜ7†Qízî¦g3(`ÜŒ%+ŒÓD A;È<ìàËhW. EŽDì”iI*I«(h· æçgXYYck«O§eèt[Û …•Û­J…Ð¥À›8¢Sf4X‰Ê¼£™HJWMæI©cCˆ¢ 6Ñîâv“ÿ¨,ÙÚ¶I)%7ÞÇÌôEQDÙœ¤IèVa°üä‘ ž¾ÒæäÖ$ïYÜd»ÂHêávÍÒçv‹Føz€ÖkbZóO!æ¨n蜛“uc— °‡´› p;¶ûL [ÂßÅN¾g#íJÔÖ’&dŸ¨´vëšÁ`H¯×gs«Çæævü¸µÙc}c‹‡¼›ã·»æÞ÷?ô¤=þçúð·S8À¸§rýýõ{Êuš°¶§îDèÓ6‰Žá]Mš%•wi´ c_4ü¦CÁ9VI߀‹H&Lóª;<\Áp+âa}—S@TdJE¯ ­¥_dµ]®I òàÚ_Ÿ år–kVL,àéš ÛiqÇñ›™˜˜àܹs\¸p^¯ß'­5–ŒíÌL;S™Í­AÓ´ÉZ:‹óÖ–Þ ÚiÅÖ¬®mrâ•7ê`$ÿ½ÓÓÓh]ÑïWäyÎ+¯žæ±Ç¿×ˆ³t\ÉÙ3øÿçÉÆf°tÚ-öï_âûó·ÿÖCtÛ.­Ð™ Œ0»( l‚X4åQãÈÍ8ék'A¬ù÷& ²o”eåuÈ"ÆJŽÊ*†=„¦1†ÁpÄås—yæßæÒ¹ËäY&•+75K¹Ø–’–RL(Åt–Ñ–’Ò6µfSkt“Vùݨõ1€©À_xë·¡ÖŒ´{±T.¢%¨ÁXá§v銈±H"Ë\!õ‚6;(Ýî˜lµâãå2ylÜÞ»§u|yƒé…PBPÃêh„šžàá½›å½ LNvévÚ‘MŸ’74DìøÕú†(8Üo§)eØoI”´ñ0 g„ð„g`@BP± 8Ðnÿ_´3&ª6eYR–“¬®®1–Rë´É¤#°\wí9àþ¦³HëP C†Áï•DR%;pƒuoD½Wñû÷`¹¤¥ß²¶¾ÉÖöç;²ýû–˜šê’åÊM8I$aH½rÆ'îñß¶8à¡Å£Ê)¤‡±¢-,µ×µr‡)Æ.ã瘭µÛMÇä­O A f ÂnJ©l$†Ée‚:ºÑZËÈwøaJ2Ö8UvZüþ`ÈÖVŸmV×7Y]Ù`euÕµM÷qÅýÿÍ-¶· CvXÙ&SúçÿÑG¹ëΛ\Ö¹ø~;ßÿÿXÞ»šü w›ÊØò3C7µIã4­ÇHÎôqMmáX#ž|Áu|“4J1ñ/ Û܂Ȅ[ÉyÓ‹ˆûí,“Ýz¼fŒ…LE‘;3ò8a—A—´ méùL2‘Qí][o ÐÚÇsÊ4›e’‡<Š1%­¢àÆo¤ª*Ξ=Ëùóç±Örë­·13Åï;pà UõL#ju8RU}òLzDNz$Àòg_}’Á`ذ•RrìØ1tÕ§ß— †%ÿæþrY-|\]Ûl4QÃaÉêÚ&•θty%5xßÛX\˜¥håî\ŽgµkvDðÙ³ mêÞëˆÉT6µ»T+$rÉäÜwŸÏj†¶‰»Kc\.¨ö™Ç.KN¿v–3'ÏrþÌEÖ¼^­(òp‡° 鼨'”b&Ï™R %­Y«*¶ýD«ýôYyh8ì”'ÏTœÞª' IDATø)[ËŒÂE­]vr&Ê W°=XzøŸdŠ}Ð çBÐ ‰Y‰SzSWÆ0ò„2Û´Hn˜ïK!芕QÉü û¹ï½ocqq†™éIÚ¾8g™cJ»Ô(?ùúS.0qËå & «ÚÙIâlKô¦•ñŒO§/·Ï– Y ¤¡ëSy¹W½G”»ºY¥EI$ÐrCå-:#!gL?=®kßO‡I¼I4«©„œxå4¿ü?} €ápÿëõ‡ÑDèÿíŸx€{ï½—ééiyä^xá…ø¹‹¯xB%ñº•RpåÊ/½ü:¯¿ñ&ÿà£b8ýáÝ‚ò:ä²Ý>?þ¹T²µ›£Ys`>Íõ÷Ñx„TÞH‡†ôMZ‹‘^oOs_Nºo‰ôг‘I eÌØïUDûbgú”×ÖÍq:•‘ٜȌ©%k; Cï&šÃ„“ŽÕÙãhŠ•R’~×m¬¬nsùÊ&W®öXZÚý÷ÝÇÆú:Ì15‘Gù×¾½‹aÏ8SIl ÕoPÃD§ijw™–›(OS[“È2短#Q d”!™jXòÆ+gxú›Ï²±¾éI!h噳y£¶hII[JºYÆ‚ß×*!ØÒšm­é…J_¡*È«”7(¡¯5Zºi8ìŠ+,Uл…®Æ.å¡õ§GŽ]x ¼Kô±H¾&LàÒÍñ$²¶q m»ªX­*ÜqŒ{ß}/s3ÓÌÌLÒé¶È”Kg‘BDí³±–"s MÁx¡Žˆt7²®\™ŠA&^L‚ÕÚýþY Ÿ(Ÿ½í’¦R³†` l÷¬åá¬`.Pd¦]`m7Æ?þÇ?ǧ>õ©xà´Ûmz½Æ¦¦¦XXX`uu•£GÒn·yüñÇãc<ýôÓ<ýôÓÜ|óÍ<ôÐC}îÂeúýç/\â{Ï¿Ê7¿õž|ò{\|ëjüš=‹ó¼÷½oûk‡Á¯µ÷¾^Çnõn°÷n Fã°åÎéÛ‡˜ÄIÑJ³]‘oÞÃÊ£]xÃüóIÄn<ŒSuü. Wmˆ žrã&ká%Y‰ ”­ø¬Ï¶ÆOÓR:ø[H±Úv?Kí\¥Zô4DÂzA’&¹¶ÿtSãüÜ3Ón8¢éJÎ_ØäJ‡öÏÄ€LMI|ð!þüÏÿŒ~¿ŸÃw¾ó"/¼x’}{É”àâÅ«”•›Z-yžóž÷¼›\ ,¶âO¿òX”V¥ïçôô4ËËËt»]‡xVý~Ÿ+W®°¸¸ÄýóôûëÎF)Þº´Â…‹Wèõ ‡/3Ñi9©§0(›‘©ð»ÛDkoÇtú’¦ÿ6×ÔF7¯ñúñ²ªÒžôU'àô·û¼øì˼þÒ)ÖVÖÙê žd£ü.9@Ë…Ÿ˜;RÒ’’é,c&wSõÀzZ3ðDª01Æþ.„À¶rª©:Ë0£’ÑÚUUQ†ÃØïÿ”çQh„å.´@"ÞŽ2¦$5”«ÔÖÚ†)^âä. ©¸©e0aßSÃW‚‘1lŒF˜VÎ]ï~€›î¸‘Ùé ¦¦&èvÛdyæ b)ýN e‚ã ,ƒ=cíe2*-©„#t…Æ1ì u$<íý·‘njvv¶¾öСsVÒº=UžìË”ŒÌæí^1=E9*ÙêõÈTF»]ªN rjh/YÓPI§?—«5Z(¬0(ãõëe…®F¬o *¶z4‚V§ÍÂâ óÓ,//°giž‰‰Ž×3úwÏ9H-dí oæTfSCgÍ©iGQfÌ¥k\%š“°LÃ*‚~>¦r±‹vÚ6YØ×"–ùÏ\¼xu×BôÒK/±gÏ~ê§~Š .ðÄOðÿá?ä±Çã½ï}/¿ñ¿ÁïýÞïñOÿé?å3Ÿù ¿ôK¿ÄþèòÖ[o¹}d–ñÆn‡÷‹¿ø‹üʯüJãg<óíyïü «kõ,ËøÙŸýY~ë·~ €ñÉÏòÐCwÑj»†ÏÿM°ÄwÓDÿ ¬ïäqj_fÛ8LÇó S)P,Ò~w<¾ûV(ð—m¼<ÂÖÜ‘ÉÁŒ°zm?W'Ò8'¾ vˆ•jçÝGãËÂôm¤Ÿæ/þp6Ø`ôöêá1ŒLî±Z¸/¡! ?' VZ‹øoí>8Íþ½]*­‡]z»•±w¹Ë;Þñ0'O¾Ê™3g¢™TU–œ9s>Þ· ÷p»Ýæ}ï{S“P"DÎ3ß~™s®gYã}:xð {÷íåð¡ö,Î ¥`s³Çé3W˜™™ezz’o˜çÔé³»™ô{C–¼Ê(а×ÎÈ=)”e•47DÞO(¸»_“¶AÛY¼C´1 z.¿Ìs}S¯¾°FÚ™Š¬ëAgRRøs€³'¼Œj[k†‰“–M`ìÒF¾0[)‚™ è´cÜy†Ì$¬9½›Õ†a¥}ƒgzøÇgpn -•u…±äJ’ûEO}ÐZT#yYPH¥‘ Q{S|¥µµô´¦§5íÅYîxønÝÏüü4ÓS´ZJe^‹çˆ]AJ¡¤ôÊ®0g™JBê…Û‰IŒ4à8XuaP³Âým<<%Œ£¿) RjªÊ›Šø(¼P¨\a®'Î<ËØî÷KʲbksËê,£ÝÊ<2ÓλSfŠ"wÍNu¿ÕÀ€Ö «ŠÞ¨¢7t†6Y¦h· æf&Ù³¼ÀâÂ, n-Ðé´"Û:Mu ÁïáyÖ©›jÏærÝy×fã{ák©"¢gvrc™Ôo;ˆÔ®Gãé&ªÕds7¾Æ{l§kø“ç9?ü0ŸøÄ'øæ7¿Éç?ÿy~í×~<ÏyÇ;ÞÁ-·ÜÂìì,'Nœà±ÇãÍ7ßä»ßý.ËËËäyÎG>ò^|ñEÞxã <ÈÇ?þñn]J…¹ª*fggùà?È{Þó>ûÙÏòÈ#ðØãÏñ÷?Ø0ؽ8Û¿Vy×õâ*wƒ½wûÞ”ý;>M§ŸŸjš2Ñ2I‰†#1îæÈ²ªVYˆZ9@˜¾Ã4m­·÷õ:èà\†ËJŽþïÁÍÖ%ä%¬OË2Æ7ý焨›W¬“UÙICïT!i·iãÏÈ2¢WuÔ‹FÓŠ©Rc•›‘¼ËZëZ\kÙ·g‚^o†n÷.:ÄË/¿Ìææf#™/ÍtB°gÏÞÿþ÷£´²>Ö*ƒ!O<ý"YÒ,Xkév»ìß¿Ÿûî9ÄââTDß–—¦¸å¦½¼y~•V‘c­öÆ&ºq ã vk5­VŽÑ¦ei 8}þ2ÿü×þoÞþà]üí¿õvfhµò„ì%" ?œ¹uÀÇ8Ql7-µ ;{òM^|æEξqžõ­èD”ù Tù½²ô2©\Óg7ׂV(ÌÂù‚l=Ë9H‘†^¨Ev ìT—Ê€„Ñ]Õ8¼”´fœØ_kªÁQoˆ)5¶Ònê´ÍÜnm Z{¦´p.d¥5äR’ å].‰(Íyõû`‘Ðé“ ´SUŒ´K¨Ê§'8zü7Þ~ËËóÌÎLÑî´h·[Ž9h= Äw~Â¿ÑÆÏï)ý^'d!³+|¸ˆdHP #;€Àè>,„6xkÑÂépEÂ4uÅJûî¸îîB',¥Û=¶Ú½ž#å™#_”£’þ¨Jè X²K–eüÜÏýyžó©O}Š_þå_擟ü$ðÀOÿôOóéOšG}€ÿåýMÞ÷¾·ý{LÐÿß‹óõ²¦¯§©nY»kPÆ8Œ>®±Nå4©û]\kˆ¦Iª)Rbë¶ “•¤19[eÊ)‚âÅDEJ$! õ.™Ðø½sP…~‰õIZò®×&™üŒ6ÈLbtmÆRCß©¼M5{ÏD¼ÚEIϳ0âp…gƒ ÃÍ7.°²ÚçÍBÐéÞÏh4¤·½Í`0`4r c§Óaii‰½{÷²¸¸ÄÖÖ ­¼ÊܹõÊ+§Y ]ð5ךn¸{î:Äâ¤+¾It“ú¾½3ýþ<Ë’&ÅD™Z07æ‚<ÏùÎs'ù?ÿåçY_ßâÿÍWùü¾Æ¾}‹ÜtãAþÁO}ˆ#‡“ë,=›R6·ÝujN‹uöo?óÇT¡óÉœ4*÷Ðp¦ædbÎü‘û"-=³ÚàÈYi ±±–‘µôýD­™g´–çÝF”®¡p¹b!ú|¢K1ÑuÆ%ƒ!ý­Õpä`ÚIŒë1á4½Æ3‰—¦ײ˜;vP†—0Âð@% ŸéräÆƒ»í–÷.059Áôt—v»åÓ±2D >²¾ˆ*éàRgèá BˆÈ$0¹Ý.µª*PÁOÆBWž)šçõïöq#…H=)ÜŽ_"¨„ÀV–,K3U=S]»æ+Èò<£Ó.•ÃaÉh4Š­òB°E(¬µ’ ÈE‘S9­Vî t·ÍäD‡n·íXîÝ6­VD¤ä9…Y¦Ab72Fó@vÑb­Ó†D䈚‰=¶oN%SÚjŸZµÓ°$즥mÔ‡éZìf˜omê|Ÿ÷ÊêúŽ¥”âÂ… lll0;;˯ÿú¯óó?ÿóüÌÏü ÿøÇùâ¿È+¯¼ÂÇ>ö1>ó™Ï8Öêêj|ŒV«…R*Ê_.\¸À£>Êg?ûY>ùÉO²µµÅ“O>ɯþê¯ò ¿ð |îsŸckk‹³gÏòéOš»îº‹§žzŠ«W×ø?>ù»üÂ?ù¯â¤³+íñÿ¹HïV,P ÷µØÜ׃¼Ç÷¯Í‚^#$‘ÞÆˆš¥ï uª«°µ”éujÆtµ²ù|!ˇ²Ä5ŠO­k†c„‚kbjW gjoF ië=¹­§t"‚f,nœ ýÏMüÅè}Bàq‘ ! ªÀ’yŸÉÏGXœŸ`ÏâÛ½!gÞ\cccc!ËrŠ¢ Õ*hµÚt:9£Á[´²Q¼oÁò_vÇû8??ÏwÞÆâü„—­º{1ø¤[wSÇ×_JD¯0½ëR3’õÕûü‹¯ñéßþb\(å õK—VXXÜËé3—9rx±!¯ªÃŒšÊ!vC™êY(ÎÊ3›óÄDD‚›–“k)< `”LÌ©é™1&î +c •S,Î’u[HÏj.271©Ìû§3 Ü®4£ª¢UTÚ§ ­<£˜ìRö ·ú {C¬·Ø á`¬Œ¥Pzù• à )ÔnŠ …F{I‹ ‹œ‰ÙIæ÷.°gß{÷/±°0ÃÔÔ“]:ÝÂæ0剚…'¤L&%÷ûdJ‘†i¿©au÷JIŸ{*ºN‘…BWå“­\¤cæ5{¶ÞAYeÆH¤rä´‡m´ÆØš)(¥D”‡hdÈÊeÃEFÇÔée•7¯‰6ƒ>×;Ýѹ)ܽyáb=‹"§ÓnÑî8Ýu»UP´ ZEFžÕS³»I\¡V*s¤°mÕZÆÝL,¬—1y/ð‡ûXW²c}ÖDj"skÄ>Ú]÷ÈVÔô‘PØð`n²¹ñ²°1ư¹ÙÛQ|666ø'ÿooe×U‹~k­½OW§úV%•$Ë–%÷ ;`Z¿’ rCÈKár!ydÉË…À@qæ%“„`0˜ÆqƒÛØÈ½lɲÕK¥jN»÷^ëýXÝ\ûìsªd3žÇ¨!Y*:ÍÞkÎùͯùã?¼éMorþOÿôO…ÅÊú/¿ñoÄ—¿üe$I‚w½ë]ؽ{7öìÙƒn¸wÜqÞñŽwàúë¯GExÙË^†……´Z-DQ„}ìcø‹¿ø üéŸþ)®ºê*|êSŸÂ7Þˆo¼_¼îF¼îò—c||d½õÏí]Dëk‘ÙŠXáù黟!ŠçløHW«}ͯnÐyx]æÖ"T2Ô#ᢹ!š«`å›(æ!¡¸‘œúó€ DÌÝ·Ü(aÜÿa0ÄRr~1B(‘ :ÁC.ÞQ aÖ]©Ë %ƒä65Ž+#„~¼ñ±!Œ×‘$)ÚíÝnFv×-¤é2 ¶à7ßzVVšÚ!Œ¼—çœsægkšÌGP2g+œI’‚ÆüŸ_û$i.âHàö;î׿v³ó¢°Ÿs©TÂ\€Í›pæ™ Zéâ sTŽë `î¢{…!йÞÑZ§/a&KÁ9"39Û'ˆ…vé(¥5Én·aº&c>ÒÊtL Ñô¢Ñ!³ßú×8B¹ëLæˆCDú@v_™tnfiª½X“$Aj|e“$«U!Êeĵ6ºÍ²nȼ®O9²ƒBÇF½‘éÙBðàúÿKåªÕ Fdž1<>Œ©¹IŒOŽatXOÊõúªÕ²s+•"gÎ"Á¨Fù¶ËšÒOƒ&Ò,ðtæ Ü9 q¢oÍl.³öODËßø2323Ãt×Ö|@pþÐ:6s»#¤™9L¸»àAL†Æ2çæÄ áLDz—Eú³B \Š]Ñœ9£}!¸ƒØEdamæt›ºxóžƒ:pæS+ÁõxÏið°Ÿú €…¾Ý® tRò°¸žÐµo9 2™ë ¨\«ÛMP*ŘžG­ZÁÈðÆÆF0<\Ã÷ÿëGhµ´žùK_ú&&&ðæ7¿<ðæçç¡”Âêê*Þüæ7ã—~é—Ðjµð‰O|ûØÇð'ò'¸ï¾û°k×.üã?þ#¾ûÝï"I|ó›ßÄ«^õ*üýßÿ=VWWqÍ5×àСCؾ};.¼ðBüÃ?üž|òI¼÷½ïÅïÿþðüç_ŠÕÕU¬®6ðo݆ß}í+ ;?×Ü¯ÈæÑ:}®EÕõÝOâU¼×f® ¶“WÀSªg:§!ª‡Ïƒ Lé —¶8Ód4q—Ê$ÈnÜMhf—š âûCåb¹c‘­°b.N4Èù|+‚3öºXTÈx7èsL‡[ƒ ¦i!¼¤×YyÐf ºÉO+º]$J ÷žë$-†cÇWuR qŸÀ©ÛæQ¯ í Ò4~€›”sžöz°;i™7ßr7¾ùíö°É«Õ*.½ôRLOOáEÏߎÑáŠ;ì”MµUʮ܊ùQ=€á&FôØä1ì°šeI¦¿Ìì˜ÛVãÌâÉDÃ5”ªÄq¤‹r)çq,P.—PŠ#p!4C<ân7#•4EÍ$LYj# KÓLGA&)ºÝI7uÓ³ûZ)‘´:èv$Iâw5 ˜Þ0­]Ï"J¥Œj­‚êPÕZµZÕJ õ¡††*ªb¨VA¹¤©öÖ[Ûº|Y鈯.çÂÜÂç^*ÅŒësš=„Ä8G©T2FñRÃr„Î3§ed,·9ÜP™0…^yö:Óß+ ›²L€óiêÙ’Òúûz#J’ßF'Xe^«-¨Z La£ñ„™¨u±æ®xÛf-ŽJqäÐý«7À¡'Xx(ÓâLrp™?•mHúÀ¤4S7ØIòcÊZ¬òùÎj+›tËTóèn6EþD?V¹RÆ—¿ð‘`¯nïË_ÿ.üè'»°°°€ƒâ×ý×èè¿+¯¼ßùÎwP.—qÙe—á%/y >úÑâþûïǵ×^‹×¼æ5xå+_‰¿ú«¿ÂË_þrg¸wï^LLLફ®Â‡?üa¼à/Àìì,}t7>ó™ÏâØñc¨Vbüë?ÿ¿x対[·Îã×_ùÌÍNcnvŠç“cqŸŒ¥hÑNy$k- X¯q [ó9õK×êG\ó‡2‚Ý­'VQW*[Ñ·mð©b€uPc w/X{S¿º1OÄj má·\åâ6C™XH>³6SuÇ7£ÖÛÁ@ûÜýÛŒi1UVXÎ×{X¦È8¯s©b0¼a$l®`Ë– Êå²,ÃÊÊ Î<ó l˜­:XßqÜy­óµ•‰òeÐòW•»²,CG¸ùÖ»ñƒ;î Šs–e˜™™Ásžs16ÍàÙnÂèHEK[?!÷ù„ãC÷1OcŽú¨hSp­XÅüššÜ5‹s–»!ºJ¡m`Š1𑪳Îì \Ö{H]¤cmpG(•bD‘>´£ÈB›Üìi|˜ËS50Œ?¼¤cv»zÂÖ{Rmk˜$©¶Â3SgàúÂBO6"âú9DšB_)Ç(WʨÕ*¨U«(—cT*%TË%DƲÓ2Â…Ëë5²š5qc¡rúGgÒot`È\Ìíxì‡g?5j[de–!Ë”3ÌÏ2ÿžPiLó­õ`–Isq*_ÛÉ\¿I»!Ï×9xù™½Ñôg%Ämˆ^ŽŽ„^iØ&McÁiØàq$Œ®ÐäDG㎠¯ßKLÒÚÁ)¬Žü‚0ë–ŠƒXGé½t­/z £¡»kkˆ\$b,ÄBJp`'é-ÆÌb!ÍHàK×}ñ¿>øøÇ?ŽóÏ??øÁðÉO~o|ãñ¶·½ ï{ßûpçwbóæÍ¸æškð‰O|¯{Ýëð¹Ï}þ玫®º wÝu¶oߎ׾öµ ¢ÕJ›6ÍàYž‰Kžs.Î9g;¦§ÆÁÀœed/Cûäö̃ØÖý çü4;ˆDF'ëõ¸“õkŠcy–÷Z{ïÐ0²š^ô§è{‚0‹Üµ§d1šDMM” 9*Š<Ø=¹…´­9M&´ išZ;PÏá€BΤ°{žŠm ©!V4Ì aiæ¬j“4Cš¤^æV{®uÙûöÇÁC+`,ÆÈÈ(ÆFjغPs“±mtm<(#(ªõ\}êà |üê/ TŠÝû;33éÉÜwÿ£Žn_ëÂÂ.¹äÌÍŽâü³gu=‹õ°EÂóÞ‡Á‰5xhRÒ¯ÉeŽ*å ]tb šÝ²Û/[—y¸®²CÈ*M £<6Œ¸VE S„KÚ‹Ú†â(Ò0g›-Üá 8sP·=àµM&wOþ¦£.8Ò%reÈÒ ÝTÛÒY¸×’tÜ 0»B²±@)Ž )!F$tÌäÇéTf mëìMüÙ«RË9ý»©•:0m4/ ôÊn/|éY—ºÍt2””¡¯®Ô…ÛúëÚÜãKówÊ$—))!œIŠ5¼·7vL °-¤ºyÑïKÇÞf“q7-ÓÏ;6ïµ0Ó³þ,„!†y3çÔï6$#¹2A¦ëM§–#ðØÕ‡µÎñnºévüÊË.EµV3û§&²¤íohGØ ÍK YÝʤ±â¬¼»#“Dlü—I‰óžý›îEá‚ .Àgœ……|àÀ«_ýjÜpà øÐ‡>„ßþí߯›ßüf\{íµXXØŒGyJIlß¾I·Ó·oÁöí›qÊ– ˜››ÆÜܦ&Ç14TqÍõæïuÙÂIê ÉÊ`th-ÊÖœÀûY‘*œEy¿â;hj.úýz÷âESzQÑÊyŠúyÀ¸¯{ ![ã+ý±ë*ÊðÖó€ì-îI”îÖýŸKHï÷,È9¦¨u³Ž€ú{,*šºugæ‚Khž³=‡š­.š-‰zM‡øä6JöSdíÀ9¶‚^õÙžlj)¥Óu[ý¼óÎÃÙgŸƒ…M#غ0lÖw±>ÏLÍ`ˆDð^èjÅàÐ|€0ÜÆh(…Èà­ÖÀ,3Œl»Ä·Ý’`Ìí™mpDi¬ŽÚܤÞ7FÂ<Ñȸi[D.—Knš.Å1¢ˆkiO,L>´ž¸¢HË€¢È~ØD,Ђ'YåD_¥¯ IDATã!‡6¹©e–¡›¤h4Z(UÆðÍo~ÑP H3 U0;5Ž-[·bjjœ3¤i2í8c 7²àÓ wŒù©œðr)&éÄíý*åþèmÄ7¿uJ¥fgg133ƒ×¿þõxûÛߎÏ|æ3h4øÃ?üC”Ë%}/(‰©é œuÆ6<çÙçà¢g‰m[çQ.—½£!õÄURhŸQk=â kMÑD^Æz'pªþyLÞ'C8£“Ý›Y‡®5]?ÝÝ<}ü^•ž²ï@MÒûx¶éË:âÞ;§‚@nò&“µ ecŒûnÁY#“½®3W!¾åîüˤ7V"ï_–fÈŒó™ýJ3é2ß-[6êŠp¢òÖ¥Ô[ݞ㊠.++m|è#ÿêÏøéRkÀ#<÷¹ÏÅ©§žŠª˜›©iGÆ8B©;Ž•µwÖµƒ¹TÁPjÅ=©˜)u“ ú¹££ŠsŽÌ1)ÆHŒ”ª)%:iŠx¨ŠÑͳ(Õ*>L<(—µ¬&Žc”K&ÎËîJ¹„r)6Å0,è:„!EV—ke6œ¹ß[_eMßOƒ‹Î8ÜNS†îG‚þtà„à€Ò5µ°S±…×I^lþP¶“ÂA&Ö9H€ :»G:m«¼c£ãwÅŸU©B(Ë颕4¶¡¾ÈfFûì¦æL~ë9•®«´ŒùLJ¤Iê¼rÓT»˜)(#™0f\àÖc#/KOb\:ÛÁtUGPƦû‘n¸·ÜÓìD‘þ|…gz/mSÈœk˜}?•% ú.ÙO ¬`‡\à{'åXm{’beµ‰VKâÆïܦ\Æ-÷߀Du151†áò$†â1lžÛŠ[NÇÌø,ªÕõab_.ÅȲÝn ʺsRßüž¯xz;å¾ø'Æ8ÇíwÜ‹7ü÷€sŽ¿ø%ˆãnºé&”b†-[6àôÓ·àÌÛ°iã,æf'1;;‰±Ñaã2§\³åë­ ‹®=<1Q ûû þ’>wܾÅZå^eÈç›­iJr2,ïAPöz¦ä~®eý¿üdu߃›’œ>›L‹´*×s¿„F+ÖV ûذ𤱢 69ÏëµY§»UžI1$P´O É«ÎÜpaÏ2;¸ø4.?Èô^¡Þ«6¡ÕNðþsÎáË–õz/zÑ‹°eóæf"Œ”ôà ”b³¢³ëZËË1µ‚r´i %šIw¶õÄìþ9sû]m.ÁÉÁþ½uë*…‰S7axjL'CúÑP¶žŒ+ÕÊq 劆¹ãÈvÚ}Ê’„¢HáRä B"BÜ ÚK[`šÍ™ÿ`K%2IÈÇBÑ.ÌÜ›Xdæâ±ŽmH\n/s*9g3É Gû|Bv SR;1ÈíãXž‘³…4I5JšˆGî.X†,Ó™ÔAúñ] 0á©6š8‘egãÒ[ezO^Ïgè&)”ÆFÑD¥€‚˳n«ß?<‚_[XA1€eøÒSã8¥žáâé¶þ<¹ß1Ûô,}!›•†‘Mé"‰9žéjxìÅG¼)%NPýHAºñHÑl¶ÑlvñØãÇqðÄA¬`¢²®KY ¤ LX<Œ¹Œùó (‰ãÃÓ* cnb¶ÎoÆ™[w`rbŒe˜ššÀääH’Ò¤M ¬0„}NüWs0²£Ý€¡R);¢Ÿ›ˆéTL'YFáäêm¯GBaJŒB€±>HúOÌùF…>×àgåT¬×e-¸¸Èo»ˆÁ=hr^K¶Õ/Ikdë™HÎÖûoŠîEôøt²† wî*f!HË£ sÛ{)„¤3•[èïÿÈ·Ð÷ËòpH %ÛuE³,uˆ`šJ(%ú'ÉDÝç0ˆs÷Àƒ{±ãôÍØ²eY–áæ[ïÁ?Üì ¥”ضm^øÂavfÓ å²•(†d¬%¢–àJ¤u„,jéÂZÖëŠèXÜÏ1$1Êh³“rfl:%ç˜Ø2‹™-ŒD*2±]Âë[cÏÆ®”Kfÿ;S}[ -ÃÍNK”0Ĺp;F»ö,^OT¦¥4Bp75p31²@³ ×áNô¦ôˆ½Ûôÿ¹·ÌpSäÝA(Ì™#½ÇÈ®Âè1;ê©A9ƒuÕÃö…Öîs4c.VÎï^ÒLº²Ý=ç™ÊIØ3!ÑŒIw{BƾN Dz ž7¶„Œë a4ΑA5Ú»µª81|þû–%LV„™¦¹È]Ô‚AdýÍ'Ö K :È"V¯R@»ÝÁââ2VÿqÝWЪÇÞ¥Ÿ"*‘5I¦¿2óÅ$À…¯6<Í€¤t;€Ê€í³ÛqÉéÏÅØte.06ZÅöÓNÃÜÜ<⸙µ&Mr-0³H;7æ2'dÏ>—åþžû_ó{e;¹‚LÂv¯Çr͸ßA˜ÎÿŒ|€¶°{I/=D2K$â_£óI1Å×»s.Ú=çYàEMàz,F×#ßúyÿGÐòD§ð9õÂÝŽñíÖinƒ¬ò)\*Ø=‡ñÊdÉ;¤PÊ5ÙóTÚ•IOdÕˆ7.±QÉišy(Ü®5 [\Ászlã÷¡¿ù ––NGÙÝu9í´ÓpÙe—al´Œ 3ÂÔ<Ãj‰¯ú\Žä ’„u+–û…éWì⑳_NiÊT¦MF&·Ìara•ZÅÈ£¬u£fgÇqlH`^&U­”„ÊMÊœNÎÌc;)[{OkæHCBH7gj¯üDÖ¥…·%Õöàm!á'T:Ì0³´×gLx+I÷Üq"âø…  lI²¯´Ä I d×’™Ý4ÑÇuœ–ØåÌ7Ân:KušILbž5™"5™Û·.Mc*nã¬ú*˜ˆ•b¤íVîÿ)D$0÷¬KpxùÞ~ýß‚•%Þó+oÇQv:öwJxÅÆULUa˜ÚZ† ˆ¾™êEU¡T™õÕ/£N Y«Ô8¢ÛM°¼ÒÀj“ásŸÿ –q{Nü•‘°öAù­¤ÕÓ_̤©IdöW\ÆIŒÅn,FkC˜™Æpe[6,à´…S±ev+ÆF†E3s“®×Mh|iÒ&ÜŠðJdES¨Tv„!Å9WøÜãð°àRÒW.e)hZ‹˜ÙÁãð>$°>Sò ›Ë`ë9óÍÁ3ÞèKÚ=÷›´ÁÒýóÿBÝLV—Sú`Úf$Ä ¹³U–Gn"§¿Wfj¶ÌqÁù–7@Éɳl‘&2QWœ‰»!ÝU;R¬S´8œœqüè'÷ã?®ûâ8êi´˜³;¸øâ‹qÁ`fº„©qm¨eÉÊz=g9RdÐ眵Yuج7KxE(íÌ ôF‹¸”©ÔRã9Ãø–9l:c+Jå‚ Ä%½·r©ª±£8†àÌMÔvJf¾@[—(ê­LìõDMñ{Á5™ˆÅÂMŽöâ²’(/O±æ&°zY.ÀeæM@H÷ )Dœ>ÏÊ `­àÊj1wÑÉKdÒ·BèÖª/ÐÞ‚Yy?hf,%1MuZ?Sh¸„Pº¡2ѳ΀Þlpn“l¤3S’$~Ï"b.¤„îí^F˜Ïäû‹Ó8{d3¥.•tñä7¡ºç‡8o2Årx¿éÈI wí½¯ö<%1>öؼ÷¼£nÚ¦ U|Lù¸º|.mÑN‘®0Â"®@,K¾ÛM°¼Ü@« üû¾T[8th††,ôF`8Sx󓳿+};3ÏÍü©€!UÁJÜ@­¨è Í4߇oÞ T+gn=;7žÑxÕ˜adx;wîÄÌô,¸`è¶—!efðRŠSþ‡«„M™áö“`™wÊ¥lÓÀV@VÓàep“¢ßÃð¦žÖdE&mÞ+úe,öÀú2Džî$‡ûé©Cês€ö7I)Ê¡.ú¹' ƒÚE5³ý YŠ%}ßå »ñpf9–OcýÂ{XâTÎåõÑ¢gå9Cæså^.i¡m‹ˆEB@2C|å ,eΙ›5cšIdYêgå™™\¯Eǹ瞃Çcee% Àèè(.»ì2Ìm˜Ã†™“%W£¬Ë¡àžÀ¬<܃@ùfÔ5Ë2‡4åSù¨–Ü\#ç«ÔÈsPŠ1±0‹¹S7¢>R7ôqrɳբ(r¶•ÎX³5Äd‚-37fö÷pð&30¶Õ s=eš';„îetÁ+ÐÞ)7mS¶´»x)IO(æÿÞÊ¥B>6™oŒ„Š9;M:I›‚8óЮˆé.5›·’6}pÌGÛjR vÍÎ…-`ZÚB%‰¾Õ0µ³Ì’Mã–ÐBÒ~~†“Å„™¾™®‘Y¤]@p`bh õ ŒW&°eÃflŸ?ó¨TFG똚š@µZÕlñΪá$ð ¡ó×­*ÞÓ˜KÕgÊe’/…Þ¢_¼dßù"Úw·MØá‘L?­u"~ÞþÞEÅ“sŽJ¹„N·ÛcR4瑼A0ù ô 5Ï3Âé¬é{¬È.9˜°É4íjT…£” pšÐKº%M»„cv[ÄÐ6v’Î2}~eR"³i;agRgHIœõçùäS‹Ø½çVtÚt:mMªÃÃ#Ø´i›6NaÓ| Ãu/ u5Ù_"‡AómŒïƒ*±Ä\N¼ThúáxB®¾œS¯+ `xã4¶¿•ªfZW*eD‘Ý/ëé8ŽccB¡‹q$Ȩϙg›Ìh79öµàŽ5ížw,_f\˸-àd7äucº›VÔÚå°ò`I}˜•Ù•)éuÝn³æ ªŸ [”q1h /è!œ×žÜŽXʤIÑŸfØ­~Âö‰—ã(‡x%ƒ—"XríÖ­Ë5" {I¥‰`Tºd#‰¥„áºƒÓøïó‡pø«×`zé1T«º¨ŒhܳŸa,fhl{.¶¼ô×pë®ãg‡ÅžGä^³°aãwAEîPkí‹àmp‰ô/™öæ&Á'M%Í&šÍÿuëO±wÿ#xìØ]ã È”RË¡f€L0ˆMmt—Š”@=G‹¯¢#$ HÍW&õßsaZîQa)ýcÇ1—tá–)0YÃ[.ÄÖñÓQA•Ǧó8å”SQ¯×¡diÒ„7Û $3×o¶eø¦qæ§`“WÛ›_ ›¢0ºÊɰ@PŸ ÓQnW­ü¢m°œáxvÐŽx=Óvþ±;ÜÝíÃ'?u~絿ŠS·mr.SE XEÓt>Þr-˜=?¹çYàëѯw*/b±÷ÂùáZ!¹I³©ú#Öp)ЃøÞ#$JIbó¬È¹¦\@ökHíÚ@Û©)ʶXS×Dê£ æÒR {öÅá#+R¡R©`ll§Ÿ6‹™©ªãI9Ù”ð»j+Ãå†4ÌÍzм ™ ¶Ó´}¼ÇÈçí§mvÙ…g¨™S6btr±ÐZeËÆvûe¶fVcƒ „; Ä/ëÅŒö×j\õßVvŽ–ÎsÐ7½µ8ÙÝ*jÒîŠ/ 9Ðlm‰üZNõ*F®ì¨X?¸éx¸dšðgsö žU*Z¬—­r–¡tš¹+¿’x:Ϧ9­Ò‘¾(Ù"ǽu|jÅÿRAZ¤Y|ýàÚÃ+g`u÷.töï Í®‚*£:6ލƒUjPQ£³3`jð½¥/uðÜ©X\vv¯qäåTƒà·¼ cýï^£þ°Ò{öV«f+ŃïÇî¾û›¢ÅŸÒ»ygg™ß3 ç‘ð­¸WÿØ)ºœÖ!‘¡ÍZfÿ¤Rg[¤3«rAL´ÉÊýeycJIW벨`´:‰Ñê8&«3ضaN™= µÊªÕSÓãF¹TB7i!é¶È¡Àû3°ú÷°ºÃ¥²6óгêã¦Ö3!±â}µêmvßËÖ`iA„OŸ íä@‘ÀíwÜ‹?~û•.]lÛ)qÉ%çá•¿úb<ëü3˜©­HÖWT‹\i~&LîA¿_A_« J ÷ñ½§dÒ6å?W)U}wOÈþ|ë7á'o[ì)QÌri,iLOÒÆMQfdm‹)œ4Œ"F´÷\0/Q£XôÂÍá ÏÅâZ«i„¾Ü–ÝwMñ?ÿðÕª\)yKN!\>¯g\‡UϾæþ3/ØéÂÈäÆ §‹:»Øà®óO{éç„(™‹ì³4ø^ö¯×£ÇIb¡Wˆ\)OcÞ8E)i3èüß)²';gEvÁº&ž(ëšåÅ«Rf€1ŒwÒ…ŸÝ^88èD¥ý§i–:©•nt$ö·b|vÿ.ßpqW_pv@ÞOÍ"×ßWoÀ9c-œ?ÖÒ“s{iq+Ú÷ù‚¬‚éXIÕwgh½uƒÜes]ÈL¢Õî`y¥…ã'R|泟FN`Y>fâç|¶„/»º¥(“]õZøÛêH TÕVØ2Tæë`–ZM©‰.5½0}Mv…+b ŠÍ¯BÃáÆ™UO੟¾%€´­aö­ÓÛqúÜ9˜)mBEĈÃÎ;°iãDÄ‘¥-ȬM‰¡aKؘªÐAÌ0D ¢Û†7 `ðöŸëÅ^=¡“b‹â)Ó³•=³¨ œŒ»˜}ù?Ûµ¯ÿýw£Ýî7==#GŽ`Ë–yüßo¹/xþ…ˆÑR™l;¼ÿÄ?x*þyIµŠdbEr±~ndƒäYE=5-ÀŒ± VÓ†{0:¼¡’$S»³Ÿ…B–¦zÈ0c)YÕi²˜$ùþ‰y)ó9öŒõg›Jè%ÀÌ›pÓÕ3CÖ&NúÂQ¥RQ_˜}˜ÊàÍÀÞ}Åï)íøæuä5̯Ü@ÓÔêRÛaŠÀ副:w(SDíA-lÑ3ÁVìN;+kÙoGã.^νuIV¡•óE¶Áð)D ^²ôËk®éÁ,­ãš/Æ,Ñ)jñ©ÂC‘åÝ£l ˆidPU8EÃÇç“™èÄd}Áí>:3µÍu¶;íLf`J!ÇÍGÇðT§Œÿsö0F¢ ™¹ôM"]1ûüÁy¼hjÛê]°¨„Hpwpù8I^¸[s°™qÞr7¼ ¨w„#²AοšN fßÔîtqâÄ ÚŸÿ—Á‡W°oñ.”j0«=9§))ÔTÝÄÈäË<ƒL›-ŒÉIœˆŽ€1“M«ˆ2HùBk%YYN­Â# *û@DúË™ç'-¯Šû–¥úùŠ)b¼<ÁüØ6OmÃÜøFÔkUÔ†J˜ž™Àðpœ1´[ËÈdjàHž›¶d_LÐŒ2»Ãµ4ë;å’». PÒv©ÐÆ5_è nÕû<ú AÅ,о÷ý;ñ§þíiÿûË¿üKÔëu\qÅ.øall?û¼ì—ž‡_¼ìT*%t:Éš~ÛEEøéºš=“=t?è½ßD>-ÞÈ¡5$Y«¼-0¡!îgÁ@ T˜`аcp»IÚIb}Œà ·¦W¡ Šä+˜za‹9g¬²¶ƒ˜›˜9ÜŠ-,ТG©’ßA÷‘ ìCïÿcUŠ¢86^ع©×Tyf:f¼˜yNhíöɶӰÝhÏìÔl#õ¾÷Þœ†¢ùˆ#‹Ù}±ÐEÑÉí½À8&剟‡7ÌR™'£ºiYúo!õ,ÕÍ„žžÝ°*™!<+j%iÁfæßXž™ »ÛF*ÃØ6·;fÏE #ˆ¹ÄÈÈvî8 6Ì@ÊYÚ†’]cœ‚ Q‡Ù'óu‚n c•"5¦•´Ó6Ëi™|‡ÁŠd`ë«AüêYŸF Ï„W¤ î§gþÑO~†?xÓ{$!³÷ oxfffð¾÷½¯ï3­V+xýë^ßþÍ_ÆØØp€ås«×uy2Óÿ3Ñ]¯¥áÎïÂÌŠß÷°É'©¡\w–Ñ?ž—oe©tÒRkX"3‰$M¼]h&]̯Vìúv26êjÑëœ$íDmPDaìœÝm×µŽéî$¹d=êÝÃdàë‘ßÁ»Íü?]ý.e‹ªý[¿'„c¬åGuk“ÉÈ'y³}ìäÌÍ yáö £v”n*4S”g«Â±¦]Q ïãΊÎB¦2 =äáe*³òû6Èž¸Û{¶¶gÕJoÂhG{µ×ž@ê A"At‚´@©ÜŽH§ÅÝàÜi -K2“V?­d©ÓRÝ ";i ƒ*ܾ8ЇW«xÉÄQl«w±»QÅm'FñŠ™c¨ÇÊqlŠ5›ÉœçÉ=Ôô R QJ_t$iŠååÚޝýûXÍaïÑ£:ÜÕîlR;¢Z)±‚ÞßÏ[ ä.¯ˆÀES,CqBáö~pNv¾6 nØÜL;”ÉÌÈ·¨b úyAæ3ËŒi ››ºÇÌîÏ¡€´ÈPŽ&ª3«L¡&ư0»[7lÇøðªÕÃ#C˜™žÄÐPIÚE·Óð+ÖÒ˧0wj¹ºÈµlÝòÀâÜCèf= h?²ÓZD©(øú7nÆï¾ išßó‘|GŽÁûßÿ~÷g³³³¸ôÒKqûí·cÿþýäeq<ëY@eM\vÙ%øÕÿöBÌo˜F§ÓÍ%©uí©×[ÌŸ Ql-âÙ Öú b=ˆ¼G­—{]Ïré\ªxg®Œ³¢%€ivwæü!dîW»eÖó"—¿àôÜKqíþ˜r´_‡FM9\b Ö¤”_äe¥y•BpÞýÛ?¿WñÜdcݬhwá—ádÌ7Ó´}r\0b¶`÷ÊÖ¨Äv$^ ~¤y¨Äu¼Aà5qf!ÇÆ (¼¼­¢ý~ž7Y Ð7SýðÍ·ZiÝp(N".FňÔá4Îf×M5¨y*­uß!žÄÔ À˼áºg~+"eê½Im§ ¥¦¢Ù³ÃíE®¡ †=>™r‚T1ü_ ‘*á˜Ö]Îó°cé Hs™©ÃPðÁr&aS%¥­OÒL{l·RüôÞ=صû'xâÈ}Õ%g/í“vHý`aqVDí“‘"ZE Œq4£U0ákevsøÏ’¦™ð-7mœ[ÈØ°Æ­±Ž4ƒ¡bD§ùÁÖNãÒ Êh¶ãˆ" Ú0#Ž Ì¿IÚ@· l߈í›ÏÄ)Ó;!ÛÕ Ç–-[±uë)E–µ‘¥­°A$LnGt¤zk»Ä$SöÉ!Ô„Rû@ÿ‘ùXÞñŒ¡§9Í£pý&hË‹¹å¶»ð?Þò×=NWW\q>Œk®¹&øóÓN; Ï{Þóð¾÷½/}éK±k×.DQ„Ïþóøà?ˆ;ï¼Ó}ï/^v Þü¦ßÄ)[76’ƒŠn¿=ú ‚×Ï ä騅¡˜Á¹¼ùš\‹ IDAT.ö¼¿¯ûý›"ÈýéO£T*á7~ã7Ü÷¾êU¯ÂK^ò á«_ý*î½÷^œ8q“““øÊW¾‚»îº Íf3øY7~÷ÜøÝ;pÚ© xÞsÏǯ¾âŸà¼Ú÷>I Òƒ¬DM¶…ëÁuBÞëù9k±ÎóÏÁòªÞ°¡ µ‡ fNG Š¢¥žŠ)-ƒâ €â Y¦MKDcàwbÔ^“öŽa Ò¨¤¾6)‘ª z‹s˜3G‰lƒâ@ê/áCŠ/iš­kËÝm1¶AZ¦wÎŒv<Üã2b`B_9dËß\kåÊöbö>j-Ôœõƒmã´ý;}Òzw~ß•ƒßh¶6ŒÊ$¬¸"k1Ì0 õ85Yd:™0§õ –•N ºê÷zýä)]t›‚Ì2“äe9£«–ðã¦#¤¹ëÅDQ ʃυé;”ÂüCM¶aβÏA‘5†ÈâUR¡ÝéàĉN,+|åk_EZ[“GvÁä¥k•4;[ÓŸ0î z©YB3ŹªjˆYKâ˜~œôXfẅ^ZDJ¯¯ŽJ¤™Uf„ m qdÒæ‘!±™¹Ý•[ƒ/:ð)S¨-©­T2E@Ù0ÅíëµF,Yj$_-ÏáôÉ‹³ÕZÃõ1LÏÌ MS¬®,¢V+c玘ŸßˆJµŒ4i¶8'/¢y+ÐÜ¹ï­ vÔ¹Ô+°\¢•/Ì–²^63e[ Áñý›~Œ«>öoxø‘½Ø¸qÞóž÷àÙÏ~6®¸â œrÊ)¸è¢‹ðº×½óóó¸ýöÛñêW¿<ðn¹å\{íµ¸÷Þ{ñõ¯ÓÓÓhµZ}‹Ýާà-oz ž÷Ü ´'?yöKÖz:Ìô“ÙCÓ¢ÙorÏçf÷ «ÉëÊ¡zÅ(B®±è aô®4r,¦LÚ3ç ýÞ¼‚¤Ÿ‘H¹ÚçU Üŵ3¢<¢…×òµ¬q =çC¹©a¤À®¿î#t¤éÉÈd ¡î—‘€ƒÁ‹ˆ÷0áxþÿyh¶î¡…ÁEÔNØ$nÛíTó.ž!äl!  gùH^6R}õ  Â,1%À–ì…bƒ±'¡0 ¦^ @öt”½¬U2ò-+@k< Ì Ó\è@Ýu¬±‹]käwüáãÞ{ï¼óïÄqíµŸÂÄø(.¹X³Àÿ_ ƲLõÄ®wêýy0»MßëIîÊCÙë5*Ú_Ûa¢ç½È¹—9éUàá™áÎÚr'–9 I¼ŒÔ9[uN=3ÒÙ"¸›…ä°ÜË ™÷ƒ wðù~ã«Uù½=Э0ÛERò×nbTrdwÒtô&tÎs ñ⛨_>kQJK?h†î-ÝJ—­šaÎo·‹*¿ŠÓÓž£òtÁpŠ=°ûö(ÚPXSç@©90þ ý[€iÁ¬ÊIÌÖ wÝ”#èä ýz˜šÎ9Ìü›,ËÌ*´ÝO¹¶8K©Œ^îûCxÍÚÇæHò7ªì÷z(™$M,-­ Ùø÷/^v´ŒGŸü)Ï‚³ßÙwJOªŠ„vñb‚Zö]£éñd”¹ï³i¡tW-L¡g0,mæÝÄ`ˆ\œì¢-/ÅNØ)–ÒOө穸 ¿"ÓpÞÌ‹Á¼ÆX Ó¤fr¶Þ Y 0c[õ¹˜¬Ok7$i2âMRœ’¶A—ˆK1:í.FGG111ѱQ,ŸX†ÌÚŸÙgŸÙ™&‘$ !:úêÌèÎ:ߘÒ4®u‘ÌdΖ4t5[Qªèτػw?þáêÏãÛ7þÝ$Åå—_Ž›nº Œ1Ü{ï½xþóŸûï¿;vìÀ§?ýiüîïþ.¾øÅ/âw~çwp÷ÝwãÝï~7fggñÖ·¾oyË[044„+¯¼²çyÔ†ªøêÿóóÓ=ÃÂZÏs-ùÔzÏ…“‘eMÏyùT?ûÓµvÓt²ö\æ½.r!­ ’n—Ix5ÁkÊÉR]ýÉ1@5t­ËĦ'*7¨ZÈÝ>FÈÞ¦ˆ,]'÷¬+n¸þ*åôÁd*"Ê4OüâæÄî †ôåp}ç6–ãQ¨¡¤÷äQ›¿€Öó8ë¹Hƒ‹Ä±™Š»PìÀØ0¶ ½XD PjLÍ@aLM(dïI(q%XöwzÙH†?Ýõ—;¯Å ª5ñÚö~TV5h²púc•z Œ÷(EEç»ØÎÌ-ˆ_IIYú)Y) IC(Ûú!DL¿…%°f‘CÂ;§¥©þâæß2YÆã/ÂD}JG¸ºT´ H1$\3áms×ît$)žºçqì{l7fç7`|vó “˜žŸÃ);w`t|•²Îˆß4¿#£CHºmt,[áa¨ǃ÷’H‚å+€Ï¥'úIÏ’ ~Ô6b÷ÈÑEÜyç}øÏnÁw¿÷CœyæÙxÎsž_üÅ_ÄþýûñÔSOáúë¯Çûßÿ~üË¿ü ^úÒ—bÆ ¨V«ø­ßú-|ä#Áüc|âŸè-ÎÕ þöoþ /|þ³zXäë™fû‹ýˆqë)â'Ã*_Ïг °VƒIí°( ×yT÷ìÒ´L ’žË œŸ‚ å†9``S2±½—ÑÝ+¡¢r8µç¸ßýæÇc7 ÃlìÞ˜¹®„’Xø™qf<«5{Ø›Œø<ÿaäɃ pï÷‡ð× Üàµ$½*)nvÂ:`ü:€=…'ÁXJž%Ïggj P™Þ‡Ä92)ì >¤ íñ-VXŸgoø÷Í™¦ïMOhPOÂŽr¿‡W½¿)¨Åæ ]·êI­QÄ\Ä“Ôeá¾ÉB@y²?oõsë&šZí ×ãfoÁý߃¸ÒrÁ”'I±KCDä~jf!é£b«XÒ„#{Š" TDÉh“•×)÷ðœReµËÌþ<£ûHR¿§& ©£I\¤ÁT1Jv2NI‘6Ÿ‰àþ‹8=I ¡,õD¯,‰°sòRlßbÌô”ƒÚy!—?žeÍfÇŽ/aqß"žøé}àf"-33Àî}À2€Û7ãü_8O; ­NQ‰aë–­ØvÚ©˜Cš6‘&-óúz=Àó>½\V`‚¢2E\ŒÖÀ鄸Ôn·ñoŸû>ý¯_ÃÑ£'Ü÷½â¯À¹çž‹¿þë¿vd³$IðÉO~Ÿýìgñ½ï}¯ 8WñùÏ^‰Ó¶-8”~»Û§e÷;gý¾xõÖÿ,]O‘ÍK"û EƒžWQž´"ü7H[Ôý*ÓBÝyÙVÞ°‡åÐŒ‡€$Gc‡ ÂÙzºütŠ+2ióÜ>‡õ¸eûþ·®V´°]'c6‰#o«J;ÊȦviëí¨Öšû_Å$²õèùÂDTâc$TŠ= }Hß…Y0 ›S2€æJOŽ{¸í{«ÉÄBO©1÷¾Ù”ÜéÝD=0Íl¦šd Ækšh 3x©¬ [±±æ´!f¶–¡äã¤~*~ŠæÞë›ç4ÖŒø€ nØß” M²*¤Òa¦q¡ž‘I›"õÑYªeV¶IÔAY7ÂÅ[_†Éá ª”Ë—޼%¥B§ÓÅñÅ%Ü{ûîÚ…N§2€jlÝ:kµ2P¯qhv€r}ã³Ó˜Þ8‰á©9LÍÎc~ó63aÇÁ܆YTʺ&’¤í=B½wRÈÕ¸ŸõóAYŸ;W±î+¿WãÝN÷üô!ÜtËOðõÿü/>²„w¼ãÏ022‚o|ãصk®¾új\sÍ5øö·¿Ýó“NÙºÿxõ_bÓÆ™ -«ß}ñt$Sk /k¡˜ëÙW÷³}zCR” œ¢óˆ\(»U}Î,Šêõ«*o[ð-œ|]dyL:T²ÀIŒªrŠÞ—(Š#ƒ)ZÌÃ1>waÒìd·«vu¨S£»ˆAA⃠–¼gs¿Â3øÃïg ²cdßl&,^9°­úÐc©aJìúñAd(a~ã8&gÎÀ·¿ô/8¿<Õ-óh®&˜ÜcrvÈ/:é›Ì@pã^;äb·´|a–Ž ¯Mp÷JHsÊÞ½ë‚ÞNQ®+…7‚CÎà¶Jæ¥VÄ­ˆÞ˜ð)U¡‰B§ Ùê`Ïžã¸åŽÛpxõ–»GÀ…f]ËL“¹„4d‡K4ÁRêï£ù%V‚Pe,bQÁJCÛ–Em ½È_«<§£d$KÂ)ÒOó\Ç3…ÔœX[)Ö¿j)êÔ%2®¿˜JÊ“Ììú– ý|íNܶ˜ÇM ¤j(GUÏpP ,àŒ#ãÒ¤LÑlu°xlwíÆj§:4ܾuhµ€•P)C5`tè¦@9x¶¹²¾|ËKᱟtÑh1lÜvNÙ¹£SsXüþmªW°yË)8댨TËè¶— ìÛŒDÊø xâ¡™¿>ë™|è9"×0 q¨VÙÉ~u» ç8ÿü¸ðÂ3ðgòzÜvûÝøÛ¿û îÛõ(à÷~ï÷pÅWà±Çë¹'Ï>ë4|î_?àô¼ù‚—‡v‹&ʵ2¦×úÿ~mÑT«rýÎ%úå‘Òõzº{î®Sô™1CS†hÊ9×;hÅzˆÇölÒ— =åùâÌäÏó|-®&€†q’ÍŠøMNm”KI$m}äH>AT!õ­¶¹È°º.ø)»ßÄœ×ÝÚ mlÐ~ú™’!8!„;-¥è-A dgŒ O¾ÆJÕºÀãÄÝ«xdâ:Ívu÷£qÇ÷qÑK sÓÆ™"ƒ‚ôŽcW¶Pn\DæPÞ(EæVTKX|ƒ²ðu*’(“#bц‹BÞÁ^YùüÖžÌfJbsªmŽqîF“=aáo¤”èt,¯4°²ÜtË­h²,¶ö#޽§ ìDË5!Š‘8IEß^“`ã¤nvŽ*U \†ëÞS¼\ÊU`v¶‚8޵%*‚¢‹•}?ƃG~Œ•Uˆ) ONãþ¡qü×ø4¶n?›–¡>TÅÌÌf¦' 8C«¹DØâœÜ[!;1?yõƒg×Ë)ò­VŠ!ISüÂ%çãù—> »wïí?¸_½þû…Åù—éRüïÿõ? -4‹WEãZïdöÌE¨bþuæaïAûçõ¤ôÛcÓלÿ|6œøãZBAy2´{=r]’À¼3%çEêE$Æô}U$0ÿºÂ³ºWÑ©×ÜS‡ÜZMˆBwË:QÑ‚›gð ‚cÖCŠXO§6ˆ8ÜÐ,—P,™A1†±É!y;¶«]ˆç$Ž´6a±Õ@|àShwN‡Œf€ÉKP«r?2±œ•§úgý+Co~hpQæˆ T¿Ó8ÐÛØø.˜§EH¬oÔ\~ª¥ŸOšñ9¨ºW×°¶¤DJí±½ºÚDâ3Ÿý$Êãvï~µa [ "#¼¡ ޽˹Ynš•) Æ!°ˆEÄ‚xv;gNΔ…XŒHe5éÉ[•<Ôl«¦À¥o$lz•56±#¿ð…¸•'§NevGÎýã:£:a§ vNGÛ€v»¦hK "†13:oX©úˆ$CeÆ^§¨µÚ_<Æm´´°!žDqD¥c¨+ì?¨P©˜ ’žþ›]½(•É©õzf†¤+Ñm'(ÅC5¡ý”Û Yz‹KGÐX;4LOŒãÒç^ˆmgîDi¤Œv»‘‘ìØy&¶m]TI²Jvú¬'¶°ŸÊakV¿ÉT»-Êw(†4M‘¦)6mšÅoýæ/㵿ýßðÔþÃøø'¾€¾uš­6~çòWà/ßýF´ÛÝ *†kEXb¨ÉwÖš¨ó÷{~bîGb-*ÜEµÁ¤«^+u«XÖeþL í ~ŠõáæÐ©—÷4{=Í…ÉeÐç-wëBZœ‹›%_ăœÿq\»ãæO© ;ÖüÃÀ@„@Ú!®ÎÖìžž «p-÷~Ä„g® ¤rÅWÙß2Ÿïæë ÷~SÃmˆòDÌÐ^j ®Ä( Õ e†ÿûa¼à•„_ùåS ñ û;ïTUHz(~-E€êóôYŸ=œB^+]d zì7Uq@~ßì2¨™'iôÕUç=vá-?óÄ ¥’$Åòò*YÂu×}KÉQÜÿØ=ˆÊ™#_Ó2Ï‚†7±ð®•[Ù¢*`–O£ÁXS›-iŒó\B ™  »Û•ºZˆš1ó}%ýå69"Xšzi•Û®˜(Ja [¥¬‹/,[; ­Ù#3a ¢´;ð4Õ¤°nWÛ|&m Û²¶¿vÎ_„SgOE¥ZÒ¾ùI gTÑ,þn'ÅñÅeìÙ½Ýõ0²¤)#q„ÍJh¬ÄÈ QŠÊhʆêV“6D Ôj@½Î13;ŒfK¡ÓVX^íB°•R†8f8q\¡ÓÑZíV8txªDfË@$C •˘œÁÌÜ6nZÀÎó¶azj •J•²@­Vņ¹iŒ K;èt[¡·8ãOKftr;ìÞæ TŠqìø|ð1\ô¬³µÖb9Ò%?“ÀAÿîdÃ8Ö’e­E.[Ïk.BŠöÞ”CSˆäöÍö,걦|æ}ˆ‰›‚ó|ž¢ ”°VöÊ­4ÄMwÍ„ñØ+¤VNç•ßA²Ü›3P¾ ÈË™™Ê×Ú‰<]ÒÄúþc}&n¢£1fél?:•.êsšý*e™fè6ºè6—‘¤ïz÷Ÿ¡¾p2ù”A 4Á $† „¥ìò€”™1ØbᎄX*7y3_¤dBé„bܯ¥°v¾8ç!nzaû,X%¥žeAa¶Ó‚b.öÒå9“Ÿ/ [¿ðF£  áæïü‹íã¸ÿÑ!ã H½Aˆ¥ G®Ê„\èé.Ku±Þ,7ãžãB@Ã;5»é™k¸›ƒ‘, ã"…$…ÔËló"…¸)jL ËH¤ ýT-3B2ƒ&”š(†T¿6ç:KÍã˜Ý¼…áe ”EãC“ˆcÍzc™€Š2‡àh‰šÂj£…C‡âÀ®#8’´q*€€É‰‹íT7-KíŒ Çi cÑ(F†’ÒQLNVÑj+´Û Ë+ ˜Ê—24VÒ¨–t#ÑnÇZú¥Õ90ZŽ­è××ètÀžØ‡§öíÇÈèöí{ûžx#£ã˜žžÆððvÝÿ0”Ê0193ÏØ‰™éI$I2ë€1‚­\Q<©†+ AP¸^ÍtQªºâÜošß½Ú¦¹ß›—óAùOçœì#2Éï¨ó»ä¢¡Š>ß~Ñ–Åm0ç¨wBQÁ€“ $“=¤0Kè‹¶)à\ñž€–<1·8÷;<Ãá‰õÀÝXoGÊ4†@`^#¶vÑTáž50â‡Öš ŸnGû̦ê±ÌÄõi !i­‚#$:Í6äÈÝt*³g¢<¾2ËÈŽAõš>çÂ!<‹Ù’HF´Å9Möâ¡´Š 7}†§‹×`«' vQÜYéA…073¤eÒ&¤ê-ÌtŸÉÌûìR¢‰+ξ!̤D³ÕB§«p÷=÷âg=€=‡ö¢™4h™gЬybe©B0Á%W1”"“*Å€«ã`v2"ÅÙZ€òy('l±v{ÿÌ«êœÎ ‰+ñª+ú|ÒÄkž‘ÛvÈLÿ=7{ta sÅu±·¦ÊH±‡[ô¢kåÑi¾ô’ÜH|juÔ+Cš[¢´!CÆS@q==Ë f ÇŽ.bß}Oâ‰ÕP0=¡ßó´­ˆf[CÛ­4A;YÂÌôÚ0=1!kÈš²¦@”51TVHÙ"šm ÓÖ($àÐ2Ðö Ÿ+« u· 8`ÇiÛ06SGšhƒãÇŽàè‘#†êêÕÐîľ}û162‚±ñ1 ×kÅôô†‡†Ðn/#5±„Œñ>‡jQÁFîPk!}ƒv¾E“`¯_õ`ƒA¬í§{n®EH4ýªÎÉZÖ«k±Ïüòd¶€é#Yb—‚É '¾ (@3YN%cÍ™Š~~ø¹(x›Ú¼?ˆ ü$ìcG6:1\^“úIŸúî?+Œ4¬gïèÉ~n™N±lÐÅÇ<«ÛÀJI¤+‡•Ðl¶™€‹ˆªØôÂ?"ÍÒ“:®J…Ä3÷IÁíúÐ7¤Þ¿UÜf 2£“Q~ú¦Ôª¥ €ñúÊÁÖÞB5°8³ ÙZuð6ó&RB¹ŽÞ[•JC†sÒ©<ù…H#2©ÐiwÐl&8|¤Û~ôC4Ò.Ž/@ëAQ¥ºHdÜGC²&#»Šbó™/•p”TU§S!ä™XÓK¸r»gʹË^8KQæ¿ßúf+c ïþeC™„0‘\)©%aÖL+QÊË´DfNäVÖ)L¦þ9d©†ÇíÞ=“ÀðÐ*¥²– e%$¥.¸²ÌU…v;Áââ î=Š#‡B˜0ZjC@£©ß§V[ÁTÐhS“@}¨Õc°8ÃÑÇÑhK+L "DÉÊÉ(8?„r9ÃÒJÇNKP0-´,nUm½ÖÇ €‰‰<ë³P® .|™IèÖj6Ðl®º,û={öbllããSÃÁ˸õ¶"[·mÇYgžŽj¥„ngRfé5º”‘ëÍo?‡µvÁýÔ/½êŒõOÊO7áj­ç^T è@WŒØ©B–ýZd¾AhjQ“6 )ÆuqÞ¡ÄÍ oËûO¬cÓá«UÂ2 Q œVöõ¼ùƒXxáß!°í[2õÓË0=©‰X­uáæ Æ ¨ Ñiv1}ÉÿÆÐè ŽÝn»‰,ë€ÇÜäCdÅÓ¸¯œ2ÌÏÍÉ® ü¤éIdÌ¡yXˆ±0{Ù3ó}©È´šïôÁʱ¼O¶oh¼W·g09Ãyòø´u¯‚ÈÌ`tÓÖëtºXmvpìX_ûÆ·pl¹G{ qYÎ}a¦EÕH™¢Åµ2Nf@jœ¼ª‘Àh<ò";µ* Ãè³Ì³Ã‚^ÃɦKÜLßvZ·î“2%o«‰ˆ´ÈM …Ù]«fšõ¡\èð ûs ‰2?76r*NŸ³òžÞJúàÌü̱òDÄ»Hö' IDATPJËÈJ‰)ÎÆ ¦ÛÅÒò ŸZÁ¡‡ö`QeØ`<Æ'–@»«¿*5 “c£ÀÄP*sT‡*X^NÑh1,.wQ))0H´Ó ÝN*;Ž‘z„¬]Cs™#éa˜71£›à ™¢ePû6U©ày¿p>*£ª•ªY+)™ª#Ru&°ö_®”Ëh6[h·žÄ{÷ .Å®€ îC`×®‡0;3‘‘Q0&14TÅü†YLOƒ  Ó^!†œm¬F=ùɳ§(©è ,b>÷Ûÿ®GÚ:è9öÛõöûY¶÷«ýXöƒÈcë)Èý ò"¹.0Á ¸@Ê¡ŸýøAE+€µl¬‹yD!ªY2°/¢ý™»y&cQjI?ò×Ú|Ö]Äôx']¨SzÆÔ>¬o%]ª”ƒ”up®P ín SÓs¨Ö†ÀEŒƒOÝ Á;.É*°—²§zÏç¼Ûç½£ t¿¬ÂÜë`ê÷e4=Fh^®…ÆeC›…VzdºuBÎÃVfš\YÜ}«>´”ÞcWJ…¤ÛÅÒò*²¬‚¾ý=,®4ñøž=ºvuAÍÉk¦;h3mÆÚ™‰™„…0&#°QlÀö¤—?1ïŸ 'KSè/z vH¤w>Ùœô îá…·üT H¥·çtV™þžÄ¸˜1x/où¬¨üÊ"‘ù÷©/üVCí‚@Òcµ)”’ ’jÇèÐõ_¦i†ÕFG-቟ý ǺZï<Æ€ÉIýøÐÍtqŽK (3ÓZÃ]©VÑjfh´Ž-v!x†j,Ñî˜=¾*14puOš²… €v§ƒ.0WÛ†§ºÁ™À±díØŽ©¹T+U—­,„½–¤±!µäÀÌd™kkÒLJÄæú[ZZÃâq \ޱwïLŒO`jzSSãØ÷ä=zããØ±ó lYØ€(RèvA4nÑd[$‹**TƒÁA²œA“jÑùHc­éA«ÅõøVô+¤E™ yMs?ô.ÿþõ{ßó{ÿAi`ù†¡èq{wÊÅÏcÐçÓ¿0çBà–ßLOÐùi±¨ðåŸP~¹ßOÐß[Ló:E–ëdd!,t²ÌË5¿'9Ñ‚Wà»ìì>©ø/ƒµO+ÞËÎ÷“oËÛÓHm§‘OôêÓ4ç‹ †'MÐõZ¤jE¼6A/ƒ#–Ý ó2«ÓâOÊ‹_ô¢îÃÂîÿ{ç‚°‹…ã18yŽPyÀF;çíßúºëÕ6ëùklœýYZ­6Ív—4ɸwçG¶HÛ=8ø¹6…ÎÐ>>ð/éžh*(MKLõÛËHG]‹dÆòN«šmgÍÒ³î¥-ê{œºôÊíÃ….¢ÞÊ–ÌÉŠ ZÙ`±'4.„a:Íy¼öï²åb‹M¸‘À“¼ø¨u=K~dȰò…v€#—{\Ïj.v´I¬SÆé¤$•I”7ËÌ4ªY{Ec'kåÎú¬ Å¢J‹*§Ð<{ãZUGÑþÞ¦dÉÙíG=ÿ¤db…Z»‰ÙTÏUÊ(LåHlÒý];7Â:œ=õÀsDßó«’\1ÙÙ9äèë mQj½¢†eU+÷úBß6­Ž%†Ù[Ø#W‡CC’h_ÙhË VÚöýXëO£a0°ðý´6?LÜ[4qSôGž~Šó­Ól4œÃ¡XÀx=é³]©v|¶Ù3d zŠ[q_–°¸R(]@å†ÉdÄddM+¤e¸yóíNŸsç¶i4|¾óÝWƒˆ‹â±Çfsc…édÿD›ä“ ÝzÒüÙ{Rñýóœó{ÙeuaÙJó~¦ÌûadŸD ; a8iUzÚ{u?hÅiÃá22ô©£›°ý³Ü>Íbn„p~#ð¤‹p?ìÇ?×ÿꤱ™®göMÔZã=Bj=/ß*™CÔpYY¥#”'¿©Æ/SI«JU^®¨YÕ•Ze]ÐB` ³líš ‰®TðtõYãa'mš:œ67y׺m ¹R(¥1Ævyž3'H¯ÃïþöÿÅV ¸qí «=ˆX]'Ÿ BŸÁîÁÆ9;!¶»OatL{Æšzäî”BðpûA.®4\Á3Mj‰€*]µ'«a«¸ÊaÇu§¯’.äPb–Ù]ÖŒ®í¡=ç:V¹$3A%‰¿¦ãöêSµ©¬K p<ûü”¨~qf'ñØé<‡ž¿Á¹õó„mÏ É:qœ²pÄî;ˆÝëd2c [Mßî‹SÇÖ–žý=FÚ³çŸyÑT0BO#…&N¡A«i‹{«iQŽxƒC%Ò.Øô™+Ð# á7øÌ§>B§ß$ ýÙÌè¸,ËU"‹ƒ4ŽŸgî3"+ ­-ñm~ÂÖJá¥!i JÖx…7eÇSÁÁÁ>apýúu:.ýÕ ÎŸÝäæí»|õ«_gµ¿ÆO=ɃçÏÐl²lŒ²Lx;ñ=Ÿ°¬à6Œ-KùºŸÇœ÷_´K¯ŸÓ÷“»°¨NœDž[¶†­Ô"úDØ{>gàÃÕ“û¼ODšgê:èÅ1§Qòë¬ÜÂ~Ã1jÿ2‘ú²î´›ò/>A›š˜Ô,/Ì öÆB’x ^@sëY¦G¯ã‡£ëŠð»ˆ ¿ê [M'h-‘žZÂî©ksÌñÆA˜cP}κd{—{lSo|ì´jjlîÙ·Q[dÍœCXuMë¶ž¡K×ÜJø[—»çù4C•嬔F幕åŠÑxŠ”m¾ü;¿Ï™@°wíM:-[h-xðAŸN¯Á`/&72TèÌÐêØ n4 ³;×Äí_qû̆lqmtÃþ)ȆÝ}'=ד•ºaG€nz-ì9K¢½ƒÑ5èØMî~`+ŽôIÍTp»_ó ÏLõøz.@mÆ6ßi³µ©q©gW°³ÌAÝÒ¹u階!›‚'"žÙ~‰ÞJ‹(òÒ^ë4M †Ü¹ºÇèÝwéH8t·kGXÖv® l¸fÁ±Ý»m§5— „ÇÑDr4i4A¨Ž ‘¦mš4öïû{0Ú)YÖvϸ½s.ŸûÔ±q¶M³!´aÊ"Í5ˆYŠ|-*êËVsóÅÂBѦœlí¤­ÑR"¤ ’à»S]BãùQAž+ Ž'ìܹÁõkÐl4ét;ÜÛ=ààÛßãßccc“^×^£f#bsssç¶È³ Y–̸ž-+\ËàÚ“ŠÃ2‚ïiÓ좳wQrái¤®“Øæ‹øN÷³_ô}Ötë46üi,ú?g?¾ƒ^æóz?,¶å¹Í‹º-k¹loq?°Ä_F¨;x-ì²ëP´¨ÅÙ¿'‰FecVV7¸ø…ÿœw¿üëL#üÀÇ»ù5DïcärƒxxM‰:>=f4G3ÏÃT˜º¡I5×$Ú5G3WèEÍ[ˆy–¨­.6'ÕNߢ„Vk'½ªbóŸïÐu½fm=M-»Ñ8v¸Ñ•—·(íJF+reYÚyžÛ"­ÓiBuùã?ù&+*åòûoÑ‘VNÕhÀJ_²¶Ña2Ö(|²<…ÜЈìNt<†ýˆ$bS1óÛ(Ñà}5¶ï…5¶û^?´,¹À 1«cÖXrélÐEq eM1WüY@äY­PKçÁønÿêR©ð«M†¡²(-“ìj»Ê+KP©j“º®z5‰ý¢–z•¥V«œÄ ”äÅOÓ[oÐj6ËØØ4Ë9M¸wû€½7ÞcÓÏ8L,ÄÜÀæ:7•û¾-ÒYQhá}ø¡Ïxêq4¶ˆJ3TLbz÷=´Û¶‰8܃Ý}™2ø«lª¦îëñ sñ‘mZ­ž'k\‚eS³YPˆëÿ&ñÓÈXÅTZ1œëŽaä!:TÈò&©)L奭”•u)mJÞE£¡tÎááA¹òŸ>¸ÂæÆ6ýÕ>+\zç=œ=÷ Ï=÷4çά¡ò ÚäønªÇð“¹AËŠÞI‰U'M¶ËÒ¸Nˇž÷ø?ÿôavÔ'‘Åî—!¿\²vÜÞsY³ðaáöˆ{ÑŽwѽŒš¾ŒÜµìMš}Bøÿ'C•4Ë[à<©Ø½ü &7þ˜@ Y{ú%ÆW¿M–äd“}â÷ÿãÝkY챿Œá ³…¾î×XNÔÌP¥köb‡5Q¡%Üí¥uQl©¤Oϲ²‹½š¶Þ³fF·\xjÏjœ‹Ýr1냗 ­/ô¦v²n¿©”­,ÖØÃj2ž¢ŒÏ·^þGÜ$ÛÝa;h¡Èö­6¬m¶™LÓÆ…”ŠNÏ1€§0A;°ðî‘õjîOôz¨®§{6-Ÿ®´…BeÖÓoºqý³áö̲¼³Ã—¢ò½¦¾k¯MÔ™g;Âfõ6ù…Žz®Q¹¡•€Ž¬ú·¢è>ß²ÖL˜Üíªu•®¥•õµNcû|Z}Œþv›n·MØh¼ûû;ìîÞãGoåÈÀ#71—o]ã‡o¼Ê™Í³<øÀƒD‘G…¬ôºœ9³Îêj,•rÉâµd"µˆPu’œé´A©>A/úÞy)×"ööICãý¸²}äu™)Êiŵxï×ðå4/öe+ÿ$êz‘¡9Ÿl´2˜÷Z]ÔAÄÄ;É™çŸ{qžyœyó亾…šÖµ29÷DŠzçoá¯7 [ ¤/¸w˜ÓYm†l´kÙ¦žG–%Èö³é …&§„±Ýï.¥^º¶Ÿv¥×3ï™…ÀËgæn$£K Úî¤]üš ®’©„ƒ½+¯ì=´™µç4nßm\û>cJåÅ]ì™mV£™Æ)Ÿ[·ܺôj´Çäèž„3 6šÓ] ˜Æc¦Ó!GG)žÌ _ÚfšX˜5í¡¯Œ-з-¦z7:™NíÒ»ñ:Ô 1x ˜T`“£Š³mFbn*ésQ°•®XâÒÌ3`Ù,µ…§ÐVçì…çànYAã†j/­Ôœ+YqK¨Jcm¯§}Lß/C¬Æ6i*…õî6O®?E§¹]®@iCœ¤ìqû½;ø{· [pcl›;-+'Š" g+mŸwª Ó¶Àh,É5øR!„-Î+ë&–e°¾jßÁövà^b§æ¢lïÏðŸÏ}òcôÖÛDaèv•óÓ±X€v‰ßS/Àb1BFåŸ]o‚OPÕñ`s¿ Ú×5ãâÝk½¸Ï©ð/Šs–ç$:%WŠÁôˆƒñÃé>Iv„ÒIé„§ ¤¯Ú ï'y‰Ç~œs››|ïû†@ræÜƒ<ûôãlmvIâa©Ý¿ÿÃî­ïgZF¾ZÖ,*Êõ÷õ~êLJÙû.#ƒÍ§p-º–AÚ§Ybßü]› —AË宲¦¿=I÷vÒ®yY”Øi ‹Þˆ¿àŠþxw-æ`ïâTž# !HG»ÜùÚOÔmBA†Ó’­‡ºYH°R„”dÓÂ.^çŒÝ›¹K³ÄUfÞe +ÇšY4—l–ÙW4ËÐ6%/ Œ4ָĎYUA5îgg˜ÝTƒº®g@×LG,™ÌjhMmG]<†Öš,Se6ÆÇ)Iª¸soÌ×þðO¦cŽnÝ@ø°±²cÖï°¯$é¨Ãðȧí5 ý£éy–ÓlTû¸5¶oÏ) uƒ›ÓÊt]½?ÊŸ<­–Àd Â1”MEËêñ ãçÑÉUîòEÒ|% õì~¹”Q¥5ÂWá›íŽ[N¾¥gs¡‹¬Üî\åÕÎÙԢċï/dU…ùI–Ù ºåwyvýEkÍF„V¦–¦‡Cvo2~ï* ¸3±ä, t\#Óh@Ù©¹0lÉ”õ÷q,ÉrûK¥Pheh7¬Î9K¡ë õÁìïÂÎÈ>ß•ÖWœà'^ü(ëç{4›¡Û³R+žfÉN™S¤,ÇC æÏƒzVÀâ%´­Œ&̨0­Ú‚¹Éñ$¹NYäÝ4çšýÁ·®±3ºÁ4ã9›Ù{«ø {8ƒ†¼uëe~xåe¤ôØèŸ¥ßYgýÖ?|ýœÛ>ǹ³gBÑn5Y[[ekk•n'"I¦ÖE͈¥ìê^ÑI9΋˜çË&ÍEùIÁ‘ç¿l½{’ý~߇c‡;«Ï:»íø)Þ [L*Þr¡úiqb‹…ôÌÀXËwîG×¶tY_×9ÏJê¦ä²Îë¼·ÁX2hµZ¤ûä2Àó=È Q+¨Àk4ñ”Á_{/ê/&¢Iql >yS='#f½$µál, .'èYÃþ*EÊÔ\@MYDÝkÓvÐŽìUNкi×)Ê¢ËËP ûÈûã«eq»ýf€D$iEÒ’$%É”u£Z8Ãl£«BHÇ4vQÖP$$ŒÏ ÖÆ r;1OÓ”ƒ»¼ûm&ù!Ò×ø´ZNÊVó(­†$Ï'ǦÄÓ`Ûe;â“2NòÍ>àv’¢hÞ@k‘sØIµèÃBä'åT|˜8ä“!ï ò {Þí«:ìïd`6   š>yÁ¾èÖºNk7®k¶Ry‚í~“af.žwwÚs å™ð QCØ…d\dÚ8ƒ¿‚‚°Ìhœ ã Qÿ±}6¥ªþ]u1ìœÉ DW:‘Õ¿G¸¾a6 Ëœ¸[Ò3–¾®I²ê“s©X+ò3¿²¾-Ǫkšç9Y–»âl='ã˜V{‹¿ûÿü6á8åæåKøXçn̓äh³{`œúmMžTf‹÷ÐŽö=nìt¼5ú&ál¸Æn:&!±I™±€sg·hw#r—p„HOÒó=â$E™Œœ”T¥di‚ÊMé¥]ôiº6ùÅYrhk‹ ëš;Y‘k‚¡ $yeÛ©R»"K$«ßug0á~¾0øP.*]¥i¡ªâ\°·1‚Î~”͵Uº&Aà;qåô·\yó2Áx€°k*-r?´Ža†[ Ô£<5D A–{|¤¨<'ò•us®g¾„•L§px÷öàP[Ó“Äõ¹›¢§@«Ýæ…ç£Õn¾—£MP;‡{÷W«§¹ä¶øyç¼^È‚˜WK +؃ã)çf&Žq>ëÏU×$Š*׌ã)ûGûÜ;ºÃ`tÈ(> U AXÉ× Hºø{q\I¿Ææ/–eÞl¿^Ìøàu`À-¾ú£[üÑ«Ði´ØêŸeµ³Îå[ðÊ÷_á°±¾Ž”†v§ÉöÖ:kk+xR¡tî5y_ñýè–—M¾ËÈÆ÷ÃÒÎü˜N IDATž7ÌZöûN#žáŸd¨õç1„YŽÏÞ¾²bÝ.¡å/bçÍîÌ1a]—·ÜŒ”R3IFB¨êgjºÈ9.`¯cRŸ98J;¢“ýp™c{ éõõîcæÃšà7:œÿì¿Q9—¿Ú`xýeÖ¶ Q3ÀýªÔ Ó|/l¹PÞ¹Ç+?dz,nëu=+ë2ÇB<\J=WlêYØ|æ6ÂÁÛ¢Ìe6º ½(öËeÑf6Ç´š¾Mža´¢•ªu“Pî›ó\¹I:g<ž ý.¿ýåߣ­7>x‹@h66l<¡ïÛ‘`8Ôì 4I’Ñn*²¬Š—ô„ÝŽ‡p}G1Ì>1àòtD"<¤×âbãQÞŸÞâs«´ú>¾ =éü—-ƒ<Ër#Q±@§’@6i5{è–"W1q’ rwÖl3K 4…pXcºÖkÉÊæÓ`MCŒtn`Y…bh 2«ä"ª´uÄ0£lA/<¶‹Ï²®ž¸â,„àñíg8·µEg¥AÎÎ0ö÷Üy—ÉÝ[t€}c!æèº]g«YGÅd¨ŒÝC[yÐ÷Ø$Dž¢Ñp¦(Šïtì$w°g%U{™-Î!•‰ÁBê1ð/þ~²,á½Û«Ü¾õQžî›4A jqÆ8µÂ2g©:”=_Ðç‹ò|a(¦cÒ†FÖ$mLK6Þ¬ ™m~ ´(Wši’°s¸Ãõ+ â{h“á»ØP/‚HÍÒ_Ê[¬øo²Bjf,d]Yšðêš­mí l³5Q®ì½ÏÕÝ÷ݹ ^òÐÙGyñ‰yâá‡yûíwH³ŒNgLj'¿€Ö1Fg%ϨЂ/+¦Ëä[õ_¦ªør!ª^—¥]ƾ>m2_VØ ˜'y‡|Xø)Ľ°pV‡7´ƒBëSUõÆ7_¶;(âß Û¼þ±È¯}áž4(ÙB‰ˆ¶`ðfØ8e÷XQ/ª®·6 aaà™àª“:¼ÒˆzÞŒ?Fë„F'~þßã­¿{•_Ãà—vMû4·±‚j ÃÒý¢*ªå¼IÕ4ÑÅó6ÚpB:w³ÎÞ4JéŠ8Vì“]te=ô¢¼VE 9U®sñÚtÍФœúP<†ÒšÿFdÿ<<°f$÷ÆŽN¥u.B02`óÑ×V^åÖAB: ¸ô•ÿÄ>ßþîçBóÀÅˬöW8ÿÐWélüˆ<÷ðéãKŸHvèFk4£Æl亨©Äq¢çIÖ•„††·¯²(.ƒm*g1ÈrÅÑxÈáø€Áø€áôˆ81I‡(­ð GœƒBŽ(¼JBW§µy9EþLý¸( ƒîúç.ß[Õs¿ë-‡¨µ""(?å½;oñö·Îln±±²ÁæÊï]¹Äw¿»ÁÙ³ghµ"QH§Ýäì¹-Öú”Ч¥’Rž4±.òÙ^6E.ó_$«CÙ'1§ïWË|Zò×iüré߇PÕNz¿œ°XÐqÔë/V˜ÄY×´UÛåDæ¤:¦V|mw§g¿ŒÁ¨¢$!ãè1±Š”ufvh“™æ‹ªv&]뢰¹BTÂ~áôŸB,Žø*$@ÅËõ<‰ô56)yn =A:Ü';x‡þƒ+aP51 škkxñ[˜ÆÇ^PSOÕS›uÍ)L”9ÍÂá‰Å„,tUP‹Ú^7ÐZËñ65 ”vðsAô*¯‡2¥'wy}-ª‚+ŠrÙ™Úu/0Su¹ÖÚQ•Ȉ-Î1Úx|ç;¯³{õ*»W.ãÅ[œ·œiˆð™&’ÝCC2Í Ëš¡ X°½ÕW©ÚÇ`ä ÓÔí/ž;Ï3/] ßï†A‰Ê# “¤qÆæm¦­„Ç¿z­‰ÝI§Ó”é4±ûé$#IRâ8µPxluLýv—°%12#Í&L“„,Udi-W½ÆT@Ñžu9ÓŽ¹íF'¹ý7éþû {»&ß28v·¨¦£¢ <ÕXo¬ñðÚƒ´6Z͆•ùy–3޹{wŸÛï\§ƒ&¥rñ NèäT ˆsK ÒþY4B4›!I¦ÑYN·eáìÁÀM…nwzthwχGö:­¸kã9H;v_a³Ap6G62Bß°÷þK4:Oñ‰_úeâQ‹Éþö®¾Èk¯¾Èk¯þ2Ò;Ïù§¿Å'~á?%%b¨yÿÈÐ\ ão’å¡}ZA‡N£C«ÙÄ“•FÙ"qb†™½8×ÔœøœE›í ”<×$IÊ8žríîu®Þ{—LKƒšÂîÕc}Îó]Á,¦’Ö™ZPJ‘lVÂÜ®ÙS¹[£¸¿+å$zî{ e¬ýºH¥Ðµy8ÊP®&îíßcopwý€tp…§~–žzž3}~ðêk#ÙÜ:Ç£>Ècœ#‰Ê÷v|Y¶Â|fõ"Žy6õ|‘UÎÑð$IÓ¢5í¢Œ‡ePüüó»?2Ú"%Ái¤åº,ÐèŠ#å dgt!œäf¡Y»6ÇS›JnPÜÔ…Ù|ée[0ŒÝ‡æJ¡r;E+•“{m”¿Š ×É‚u$ a´›*†þãLEB¨Ò;H5¤ô*!C}¬ËªÓ §)–OB–0$Æ;-¢RvÏÔh6ˆ¤-’I *Oð}I(#’ñ•åH1T^p ÙÑmî|ãoÒ}êK´ŸüRyrϺ Éc°º…­l¢Ié6— ]vÐF,\/Ô âÆMíJÕ 1³&†*C—᫵°è,÷Ö…Í¡®{qS&Råµe¹&\ÿÑëèÑ/ÐíÁ憋{Ä#ÍWB»û@©ªA+´ó(çgÙ\£W?û±úSKÕUºZQàV.~‰ðƒkßä{ï“Fà³µv†Þ&[··yëRŸµMΟ;ƒïZíý•.g¶×éõZ¤é´Vå‰Óç<„½L¯½¬¸ž6¹ßÏ|R¼ñI¾á‹÷ýÚÑŠ§n¿˜<ˉ«œtk,¸’($\á’ wÕSvhÊŠìa­«pe³‰¸ÐtM&Z$­3d³Ò5i279ƒ4áI„g¢AnZäÑ9¤šàÅ7`|Ã^./"ëo¤”¥™GAF+^†”ÒlAžeÄqŠÊ5ž/\Li´4GCQcÍFHr£ÄÃù¨L£Rc'¿öY¢?Þü “±ïÂð=Ï+ãJTQGe-qN\3ܵÚK±›egƒ.FÔöÒ¥•gÉuÓì´,ŠNUT×¹xÿŠâ\ß9Ûÿ_I­ìîËYxºýnž+ËT¦Du~ÿïým6=Íðöe:-X[uûLO ›ÿ¾ÙèããÌIø¢î“ìJ—9¤”'ÁÝæ„‚í¬¡¾óõß*#|ËrÍGYÔãÐêV‡BÎìž+"´Ûg–D E®T5[|ƒdž'•]2Í9'$v¢õ1R <ãYQª‰´EWzˆ|ˆžî‘o“^ÅŸú¬jæC¡Ä[wqJ¯èB˜*|Zíœàw¸òþ@H h ½€Ý7¿…I'øaƒ°×¦µ.hô§ø}„¸fäàõ‚ $Ï!ÄGì³›KªšgW]"e“dj„:S³š+ÖÂ>nõ7k?¨fÒ«êºçbB®È5•·¶Ñµk[—ŽÔ2³,'Ïs’$c2MÂþÁ—M_qõ­×h†þª-¾/ÉTÀáP2iB/'Ë:‡^ËÁ„X-­6°sËZD>ѡ۟ænL=É_úì¿ÀùG×évZ¥T§°"Íòœ½Ãgåóø'/ðÓßüT©oR¹=­Ò8gozÈÿû3ßàéí‡ø¹?ü,:0åô­•"1)Iž’eIœ¹˜Ì„±›°Gã “qL–+¤/1¾FÉœ$£T^C7jÙÕ…¹\­(¡gWBÆ6¶%’"¡×ìsnå+Í6««=zÝÝ  …ôd¹I“œ½ýCn^Þåò÷ß$È&„ØxN ´l6¡ÓµÐö$vÖ¤ „aû0I³Òé5O2T–ÑíxLÆ »÷4óæN;='±ýèLÓª¸ Ô¡[EltWIϥ䭔µÍŒýWÿ5Lþ%žýù_!òÃÒÄÅÆ‚ :}謀ï‚Ðþ)…Ae •®½ù w/opãO°ýDzÅÙ§^¡Ñl=ú{4×®L!†ä‡->óÀÏÒn·–Hc*²Wžh’QÆîôn]áÖÞed˜„•zÝkhæqꎾîŸ=o6»¼$sÍ‹8*Ÿ";å炜;âMmå!jÜRq¢­BE4Ô ”áfVŠYG]‹×Kͤa§ú<•V‡ÍÞ6½M6ºÛ¬vÖ8{æ,[›ë|úS!ŽîË=ò¸þÙÌp s™ãF(Ç g÷Ãè¾ké“dgÇ¿w×á´$¶Y•”_ÀÐBÔÃj¤#=G-ww2ûŸW-.;…A…*l„›‚#ïbo£l…VYy«IõJúH$FK›{k°S´vìJ ‚á·ðV:øý‡Ï~Œñï\©ã´µ7t¶S)LUìMeÐ2câXÑŽœ9£ÙÙÝÃ÷=Â0$ CšÍ˜•'rZík4š—ñƒ=ŒYõ4J?ПÖ­lÆÅ(U7Œ¨YVU4ÎÊÐÄ”ä,cæ’Žmd ø¿æðå¼½fdv’R³RQŸ€Í1yV±{6…¶¹F$«¯ ˜[)]óضñ‘ÝÞ_þò?b3ȹzéMZ¡¡ëÒ¤äÊg0’ŒFšÈ·œ*\¨\âS§kßžÁ.ìÀ‘ëð#—ûçLJ~öŸeûbÏi~kÅÙ­.â£„ß þ)ç[üK/ZUCéy­I¢øÓg^¡y.ä3ú²FVò<íÑQV¤GÚLÉVë•å$©E_&“˜ÑhÌÑ‘ý&Ö]«µßõÐ"#ÍÒ,±ÍR­ËV‡Èk¢Süˆ0 02%Écò<¥Ûì³­²ÚïÒïwi¶"Ú´ÑQ^"EÆémGã1G»®¼ñ~6! 2#i+ž5L BKÆ3²~#çÁ­” Õöiw";hEÅG+Åá¶Á#X‚Øx£¡E<²¬’œ ÔØç¦ïÓ^ŒüÍîk?E¼óEü©ÿ–ñ(°nnÅJHÍJ›Þh¼ž!I¤ýFø†­ÇîÒ9{—ͧß`:úßï·¹ûÞ‹¼÷Í/ðÞ7ÿc„üWyü'þ36û-õK·Þã¥Çž›^ë°¶Rš8Nˆs®Þá½ï2˜îÐêØ©¹˜`KDª–~Fm¯Œœ­ª–/^L°ºF,>âešY=E¶îl(f³~ŠÆ®lÊŽ€Y÷Â…NTû…2sQ ¡µÕLM9P6 ¦òˆšŠ7‡#nÞ·B2‹xòÂó¼úÖûüò—>C+jžÈŸ7²š½6º†*ÎO¬šz¾÷"éïI~Ý'1ÀOr ;=YËœiŸFSº< ¥ó-¬Û<Šš•- •гðc.Ÿ°#"Ù`s+K€2b©è1‘k 2WDÞyç]ôQÆÓ)ãñáIÎno£“œ,ÏY[]C¢‘Âà îà•ÅNFÓ1ý^—õVÈ;7X½ð)ú?Éd÷]Òá]’Á ÷ê9°Ž|àÙ)%ƒ§ ëRE« µO¢}âk„ш0”~„”=0Û`>ŽÑ¿€N¶¢‹†@š­bö˜3zgS…È»òZ‘¶Jw/{gôL–áì¤< »”`ˆÑ³šórRžýÿó‡T™JUÂÜæ˜¾²+TnŠVL&S¤×æþøëtÒvn@/PD-{¸ùás8ŒG†ÐW I+-k*¢2èõìpwîÁ‘#È„îÐ7îП{ö¶íÒëtßz#×”“锯ó¦ŸIøÕ7~Ñe©>hÙDñ­ÖëþÄ_ùöÏÑÉ£M@834y!Œ ©Ú¨ §ãùä Ý2Ä«1Iš0' G†G#†Ã ãÉ”tš#ŒGCthÈ.«Öž'ñ}™Kt¢Z‘'éÐŽ¢aÐ`½·ÆZ·Çúú Ýn›F# ÒMt— ´qfâò?xã}Äh@P›f×ÜQ„¶@ iYñƒ4ÃÐ6i­–O§6BFGcZ-IÀí» FÛFj<µ°öᑽÕbe÷Ì KBê7`ÃNzM…ŠØñ}òIƒøÎ¿I÷Ù?F·Þ$3!il?ëÒ­`’Ì~b²ÌÂÍ\ày§fv„ʺÙá ¼H`:VŸùO¿ÌþÕ‹Üú^‡ÑQƒöØNC.>|aÎÞ³8Ð-4&{)—n¾Ï{wÞ!3 ͶËÿ®#†ªrÛ«›®nÔeq5¤DÕþ»©éâßu!ÑÓ³ôz>Sˆk«³À¿¥dá»\ÏÒÁ®A0ט:ɬÖhÔIu Yq¥–¢púÒ.È~* Ö ¥€‘í$JüÊ”zo]6Ce_cs ¶.€:᯶ÆpX¨s+Ú‰Yóë~¤f"+ë@©ûÌs&ÓDÄÕk÷`ç “Ã»ù„Ðh¬œH²{G#ƒ:ŸãïiÆCC§iIaYj‹³À2¶o߆}—Î\™+Ìcà‘‹yîùGè®4 œ×t}§Ç)—'·øÑ¿ü¿òÖé˜&ƃ,ʈâm,Úsm|‡·þÒe~éë_`ûp ¸z—7¿ýuÚzˆíáGU’“'%×:‚ëOhÏi6w Þÿ íÈNWy++&=܇;·áNl sq8dîkl¯móÉ{†f?Äky(O£„f¸2&Œ²4çƒø&_ùÉïò““ÑVM†ë6øÖ^ãWÿ§Ÿ'%cÿèø‘—ùhëiζçÿ‹y6ÖÑ”yÜ–@çøTsŠgc˜á”En®sèÓsæ…µ$³¢p+SC¶Íìê·,þµ9@ÔÌnÌd]x¶3Ç.¦îÈr‹s=Ë6+ SÌqÕháp‡€çy‘w¯¼Å_úË<øàæB•M}%W"s®0[bêÜ9XB‹‚üèÒˆýƒ ý~‹^'bµ±Ö÷i4Z/ÎXdë¹HRµÌ˜eÑ÷,×D‹oæ’®‰ ‚ð-¥_9Re<ÏlrÑñt)OÊR(„%SÊ ŒÅz nq{J°¡æaÀ½Ý]z½¦IB#‡¬­®28:⡇.0Ø? ß[¡ÓnñÌ3OãI)$Rxìò¥O~„o¿þ6ŸÝäâö—®ßà¡3[äZóg—®òèùMîîîòÁ *W Çôº=T–‚ót‘ÞEHÏMÂŽ%n¨&¦cûŠ|v‘¯«üåzU2Ø;µ¾ü)ܹ\`…[â÷I/;CÄ Ñ (´…ûµÑ5ÓR]e’ë¥ RY‚èZŠ•mµóÑ®øfÆ‘¬X踼€¸k6¡F—tšfL§F´ù௰ÕÐ nß²Æþâ·B¸ÕUxoØ7Üø/àüïCÛE@öºöà=<€{wá¶Ù}̲¨)ì¿ÝÑ Ï=þþªd÷€þ°CkÔD*I÷°™F¾½ùÏm=ÆýÑSx¡èvyøsÄ"fzó÷_eå‹~êo|z”ÅÙÔ?tÆ jbVÀH3£nךRŸŽ0䲋‹@™¡<:¦‰—dAŒºF ²ûÌï]Ùë¦Y#¶œWlò,çh8æîÍ=î¾ù>¾ÊÊC}µapo š!}cJ IDAT-;}Æ©+ÒÒÚ{¶Û>Ý•6Bv;Mèt<0ŠÝ{iyP]q>ÌÁk€Œ Ó†ÝaÎ47„ Mr†cškCœÂÞ¸ÏAòkl5þ:~|ˆw ÌžfrÞG íY“+ƒ¬çu–Šs%`¬l0GœYÖq–ðùX“ 2â7ÿÞêÛÑŸð°|”çz’^§uL‰R @Ãшä®á½½÷HÔ„ ²p¿¬M§§Ä-Z¿j¹áΞ¼|T5©š¹€Â1¬dr+÷û¤íD (}¦øëÙxù"­$­ÉêùᔵJÎÇä° P—~¨V÷b6TYÕlèVÖZ\½r•§{žç ?ð—Æ_Ö%K…b0Ô•šDkãì½uÏcmý ›[^ét–Éõ; aèÑmiV{YÉi8i×½L½,Éj>k'{²çI o?K3+}rœ}“å•Û×¼ÚB´²HÊë1õÏÒ$ÇC˜£-»ÁÔžŒ FcVúk¨\!‘øVÎEkM´±AèloŸ!M-žyýú->þâÓ„ždg8áâÅ‹|÷wyêÂy†›»{4£×nß%WšÍÕ.WwˆÇ1¾±º"‘Ɔ¡'‘žO¾ãˈé5êé5˘z ;"1›ŽSMÂÌR:uÝêWT¬ Sҹ짇*(²”=™¹ËY[.'±Âûã…æYÓ­™Ý·×ŒRÊÄ«¯uyµb ³F%[´n0c£ò2¦q²ÅŸü£?¤KÆîwé4IHYßàWž2L14^LþCãïw²Çà(µØ‚;Gp'‡ƒÔ:#P ‡À8š÷?þÙç9›oÒ‹Ûïyi‹bñ3þ x™Þ·ùÜËÅ í{ÕÔL& ÿdô-²'ç×þ·Ó3Õä<¿£šÿ»;ñD1SE|{ÒT÷¿¥ªÀøª ÒHb„F‰aJVûäùé½@=‚,$DÍt#SšñxÂþÞ˜ƒwïÅGåJ`½iuηlêV§eí8³Ü^Ÿq›«ÐîHVVÛáÛ5ÒhJ¢övc&kF’e0šÀ` ±†Èe$«½(€@jòL³?Ô¤™fÛ"šdp”ÂQþ«â&¹zËz”k±ÁŸèx$ …qEZø <Œ ¢á¸.Úꊵ²Á:s_tlPCE~û'‘Ù§yöâ_çÌúgØÜì³²b9 Õ¡[‘Â&Ó„ÃÝ\cox?²jƒ:t\˜˜Z’˜ç9=MòäÉÙéZ¸^½ðf/‹qQÜÌãÛ€Éìªk µõŸ£fnRâ™B-í¸Ø«fÇ™å,(´Ç¦~=W;tyKÛÂ\ó§ÇR,|o7?l®œcòÂö'9{v­!:?5Wç*#jqTé²`ß'…°¯%X]=ÃÚúFc ÷îÝ£×ëÇqyFŒ5Ýæ!¾§f áýj—%Y-óê>ÙúSœH «ÿÏϳÜA«Õá\gçzž,ÿnõÂöû²ÎãdÁZxåX´F;ç…ê¢+ ÑjC'}‰'í—ïxždp8`½¿Â`ÿ€ŸÝæg>ù¯½{™‡G|úù'G\º~÷nÝ#ð”QœYí°?ž2MR¢(Bˆ€ ÙE…/^áûžÝOHƒ‡ê²£²éXÆÔ;ÞùˆcÿI¸‰Ø çíjiA·¬ÑÕt #/H>…“Wá\dL™~Yî§upØÝ¾Ò³ÌÆÙÐ Q’âT±ËÖ5ž\[9¿Õ _D Þ6e`ŒÕ¹†S¢FŸßýÀY9åÞwh7 04›°?ôI>§8ó·%{/*¶ ný´~ã><ô=XÛ„á»߂ᮽg:7íÞlîs² Žù_0ÑË ã=FÙ€•  ,;ñé8៦ß!þ©„/}ï_¤¡B+Ys»é£›\ùÂ-þo‘¦•òA3§XB‰™†¬%Ö&l÷F˜g·â§•0™Úµ†K%ó´‡—xÆ' ’r™g –?£ÊW'K,®8NØ;ríÕw8º}ß=ß~hManÜÔ@ßɪ6:2Éín·Û…þj!}Œ–ŒŽÆ£h·&“”Á¡.ãÌã)`¬+Ôsµ+8Y·½ñÔîCÏj¤Ç±+¨ÆEzÒ!3ϰŸ}…Àûú[4¢.kn3‰§ì¥G˜Ð@f+¤š dצ…èØNÐ"tÓd\cMkMtôÉÞ¯óâóÆS¯Ðn·i64j¢¨8JY­øþÁ€ÁÞ˜›û×K‰W=Ä­xÊ%‹^E¶¢&ƒ’N³,kµW|ÄueF" ™™ÛSYÅÊ úYÌ¢•ë:l®+¸»A¯¥ˆ1-¤^u3œ…óž™%¡>­¢–ƒ®qžá¢ÒqkÛ+LSž¹ð ^zþQºÎ1tݺX›aŒ#;©›Så…/¾;¯}¢Î“¬­õét:¼ýöÛüæoþ&ý~Ÿßøß Óé8Ù¬"Ë2F£)«½ié°(‘ªs/“e-*ÆËÒµ=Æb˜\”¡,õïõ ¡HªÊ`ˆŠƒG4×1­³¨p­(3‡V_XHxÖ.ÒÝ‘¢` ˸‹Ó”x<å©G/"…¡ãÃ#d£ß¡\ºv›•v“v«Áï^!M„ïãù>Òøìb¼ ¢áåÜð@‰R9…'l,dž&íƒ1t{=Z«A¼ÙAÉÞ¦˜†N6ëµrªaOÇÜdæhöF«*£™: ITÍÍœ'ºAØBí «.‹pÅì®tΚfVF¥k˳ Ê6åÞ²Ìx®‘ΪCÖ ²,g2Mèö6ø'ô2[¾âú•ˬ™%·h—]k<„”¬þ¯†kEÑz¦¿ϼ kÿšmèm[‰Îþ=¸±oÉ_'¥Ò@º-ȩ̀Áµï}‰;ןâO¾éðSÈÆl]øg4ƒ=Ö·èl|»"àòç÷øèÛ« nÜÄ4ÎÐo¯•­–jÞM®ñGç¿ÅçõÇ9s{ÃÚ’•6±ËK‹õ± [Ì„YëYQrDÝq½Ð¨ …ðŠ ¡%žñÑB#µ–9B ¤–äQЍç$I98°í€Éò96<8vö`˜A+°k„FÃÁÂÊÂܽ.¬m¶ ¢ÐNÔã)Y–ÓëIŒÎ9ØËÈ3;!¥©%j&öÚ4<[”nÝUŒRëòº;(&9ßÇ|¤ÐöCVÿÂ{,Ûäpðׯÿ7hãÓïïÐnïÓm¿Ázðm&‰$U‚\9çA£ÐèÄZßj¤–D^H§Ñd½ïóÆõ¿ÂCŸþô×ðý ßÇó䜅 ³,çh0b²›ñÁÞû¤yŠ -dŽ°Ü °(P±[BÛh”ó¬ö¾º¶øø*‚,„Û7E×ø³ÅVøÕDZh¦eÝ»˜`Õ\Q6ñL«êï*sû#D ’—µ¶œ½…Ëé\§Óp|¬ £!Š|V¢m&éŸzá#¬®®–Nf&çc»gmj>þ6K>ÍrGbv×Ä÷»Ðí¶ùÁ~ÀW¾òÞxã :O<ñZkºÝnù;vvvA˜ÌÁe{åE&&ˬC…f,"šä”¶¨8øI’•„0ÊT"QQÚ‹âE„ý§Ñxnâv%ÆT»WJ®]jØ0 ƒD;ê»åájcØÝ¹Ç/üôçøÊ·^áÆî€ÿµ÷¶,»Îû~{ŸtóKs÷„îÉ=Ó &q A3 ŠE D mS¦d¹HÉ%J¶È²å«ä²H™,JE“”h‚ €‰œLžžÜÓ9½üÞÍ÷„½ýÇÞçœ}oß×=„ª®n¼é~ᆽöZëû~ß{î¿~¯Ïj·ÇfÄÞ=»xê¥7ر0Ïêꊱ[…Õ‚B¦4¤E@CŠ/$Rßüž¦)ïñÀm7ó½—^§½Ôf8°×fggxóü%ú݈ùm÷ Ö¿ª?ùÑSŠ´¸v)ã’ä8É^ íÃòt®"ÆâkdYtµ*Š°È §Òc¤7rršf,¥ªØg6È‚rì[åÄ´5æ(í0¾Å˜Ìxu!XÊÛÃá¥<¾ðåï¢Ïsþâf½¾Åwš)§^õµ”›þö=i¶ ‚&´f`4€µ¸º ]el@{ôÿf_ ÚWw±~ág8ñáß ±ð4iª¹òú VÎìæêâ}œyé~.—­MæëIq+ouE(2a%¼"µãlIÆHs”+ÐM¾sŸ+¯¾ÎHÅØÉ,‡vC¯ovÅ‘­ºV¥Ê !¸ka!¤ZˆSôb½˜J¤CÍõ½ž]½dÆï¼Ú5¢3¨ØÀ†¡ý«¾ÙKûÀŽíÛ™kR«šT­0 BŸ0ŒØÍë#ÄwÐꛬm49n'ç.ì"Ëþðû9üûìÙñy¤ì¡ì˜S)…n”¯ç{„O…àÅ“·¡ÔqÞõØ×¨UwÚÉ_i¡t4ÍèvMüæùÕK¬l®"|[hœ½°tÐÒ Ö´¥Àh[T'ÅZÊYxv¯¬U9êYÉ[Í sR”–¢p:ð8E9/Ø®*¼H³ÊÊß5ããð¼›wGAùXÜÝæè‰ŽÛiçEWŸ‘0;ßâêÆ~úÑ_æ¦Ã{©Õ¢©€’b¬)'ÉŠüRe/f)£$E¥™½ØÖëMZ­mœ;wŽoûÛAÀ‘#GŒˆ4I¨V«!²Ó1éð¾Q¦&Š©ªðIø¤Ò|«$®iÞéiûìkGߥŽhÜ–ee?I’òE¯~¶-Åß–°vu¯R£UÏ÷¬¤Þ¡ s¸¤ŠfÇt;m´Ö¼ýø¬µ;tzu¾ÿê›ÜyÛ-Ô£Õõ6KmBߌûž:ù:z•4I˜›5OŒ…×§‰Bcrí|ÏÜE—g/ í6;æføþÉ׸ïØMUf>k@â ~”StQºðô¢)ÿl•รlÊ]Nn£ÊYÛBˆ1·+¦(côR†Ã^PãÓçQ«WX_Y£ªúÈÈÜÌ ÌÀÃó|ÂЧ³‘pä%Å Œ?¶Õæ:¬®ÀZ³ŽÏyh»ç0ôzŠóßù8w<þ—ì>ú$Z‡¦; ŸâÌ“ø4ï~÷GY[©qîÓ“=qr÷"'Oœ¥rp•}ÝUªIíUÁ™(#Ü.˜ùÚ2Otþ– -"¿ÂLež}3‰Â¨d¡ÿ˜·ò?#ê²;›Ùç5ï° 6{>•†ÔȬ¸ôåÏI¿güΗNž¢ÓëRË‹óNãÛ]¾lº½Fµ¿Ä±-¦UXXðiÍÔ‰cÍ(Névc„PT«É(¥½i`|+ [ë˜Ñ¶¶KS¤ÛÚˆ©<`ÕZâ8ÄþÃÛi4«DQDøøoÞ³¾‡”V­nIo;w¦Ü|Ó"I|†ó_duõY\¼…§žþ‡(UgïÞWiÔ[Øÿ æç^G©ˆLUJÿ¸ll&\¼t/ï}϶më D8¥û)»ÁpÈêÚ&Ý•—V.¡5=§`âÏœîVYþ^(²ó‚&.S•úQ¬àͳݬ'ËÝõ5{_G€˜kPÝßóB©•;ç‚®¼@çÁ“ÅÝ¥Ži7÷{"ùOLàEEÙ|[GƒÝà•–dÏÂ!ÂÇíe~nß÷¯é‹óÆÚx§M³T‘$ •š‰]¦óssTûÒçŽ;îàðáÃ\¼x‘õõuYYY)l\ÃáN§cß_ÃrRzV÷´œè­3œ·‹M•.!¶ø¸¾†ï§™*n¦iV¦8å¹¹…ÚГ$Ɉ$Ó #|OP«Vˆ*UaŠG–ã×2ãSîöÚÜyÛQ|ÿ#¬^]áÜÕ%Þ{ÿ]H_{ñ4ß}ö9þ»üŸùêwˆ‡1Û·Íã ™™F±ß0èMA'æÉ ŒÅ·ï†Ü&br{cÚë|øÑxùÍ3¬4O½|ŠGS.sóþ=¼tê 3 ÛxùÓ$£ÛvíA5ï@¶Ÿ+•¹ê9嘗 `yØÆpf_ô%šK$³ÿµPH +𼤓ˆÂû ô„’Z¸ÂQn›EV^°òÏiת(êæûÐND’šä£Ørœ­Æ|ÔYñ(!ŽS:ýÏ~ëIBºy…ZÍ(°•eŸû¾O¥²ÙMI™­™®mÐ6ÅÙ—ÆæÐï´a}dÆÚÚè!ПÈC>QE±øí'jç_ÑïEDFzðÂçÌÓöøã£õ–W_ã×õWyùå—9>aõ¹ûyéìˆSwž_ü:Üb ×/Ô[T{diNëÃ3ÔúMv…»W1aŽxkÈüâ*œ‰‰(|ë¹ðRæÏ;¶üôºx™‚]+­ F¬¬m°úú*‹ËW©Ù®v¡a:å —%­Õ°IU‘¡~iÌs53#˜_¨“¤$ŠN;F«ŒJEãyšÕ¥„áÈOq¥ì|=uöÇÂê|ïíšMrÁWî½Ör|¤]„r¸ØQ1¡FǨùï:ò§/¿ÀO|„C‡÷FÁTÀÇØêoLlëDðZbb>¹K’ŒŒY²,0Á7£Õj•cÇŽÆb˜[³,£ÝnŸ3ôVÊË­Â/\œò¤°lZ‡=±Å©!¦*ºÅü»®sfv–• Œ’לÓi­;ð‚ª¹ùÛÎU ð}³[ò½?ôÑ™¦ßë³w×A°0Óduy‘jm†«fj¼üæî¾ù {vídÐïqöê2žTÂ%$Êú,U’»é üÀ3”!) T€Ñ6«ÞP©eÈέ¬¿ò¸õýÿ7³ÛN†žíÒÍ4ÜÌ诒õY"µ›=»÷Òši°¸x!wÝy¿÷ïþ”4ÛË‘ã9uIÀòÇi,¼FsG›¨²ëèo“¤äú6ÞyÛûÒ™JÜ ß(·æš=Vü)$" E ÏÆ>¯­¹(lee¥77yíùð3E A Ù·V× ?2ûf<ã/Ïì8:ˆL÷¼{oÏ 2z½”Ñ0% SšMA/emU‡w·çWjà@ÝûÕÔ0¶óim†àÝïz”ý7ï V ‘»ZîéÅöð$‡óž«yc’$fi©ÂòJÄ™3w±Ù>‚ï/°wÏ:Z'œzóüý_þÌÍÆS;›ü-›¦)›.]Xfqu™ÓKo˜âfGÕÒÂIÂÈEH#éÞÍ'V0p¬sS^»x̼À;|l¥Ç½ÖÓ,OzB¼5æ­f\ݹ³ÔØž²ÄÆ›fŽÛº·RÊ1;êùãI]Òßö-ìlŒ4ï¸ã1~ô‘÷²ÿN*QxÍhxòùÎ#‡³L‘¥)iªŠ€šÁЄÔÄqBg\]ÎØµk/û÷ïg~~žz½NôEÅó¾¹¹I¯×³SÁ˜jpõƲ¢°¸·êšoÄô¾QêÖVV,ß,ßíleíã•= |Aœ¤x"5—ÌÔCyž/ÉT £ÄµZ“JµÊjo@ïê"ÏwzôzC¢z“OÜų'_b~~޵QÌÊ™ $£˜á°ÏìÌ ñ ¶{¹À¦Xò”oU®iÍ ßåK—øé~7Be|ýû‹ÌÍÍqúÜÞ÷à ¾ù«<ýê)¹û_zò9jµ:_~âYö:‚ô%µÐæ(c¾†¹„´Ð3÷ÂÆ3”´81n\câ9è;eÑž_[‰Ò<%TÉÃË÷¾Ølì"½JúEÎs9æž9¿!ÑÃì•YÙå”Rnð…r”ùŒù¡]Uv±÷¶¢®'±üÇ ÝÞ€™Ù]üá¿ÿcöF’Ÿ>É6+:’¾I3Š*>ÍFDª5ñ0f¦%Йdu%3 ›zÔï›p†~bF¤¥e¾= öúd¾F¶³þÊßeÇC¿KZ=KèÑëkÛYÖœdÏ-‚Z­Ð›¼òÝ“|ó °ÐÚÃ<À_}úó8¼)3ÚWŸƒå«ÀçÙ|žÍËqö‰_c~ïðëO±2Ø$Ë2|›%>ͪ¯#7xƒõtÁØ Ý¬¹¯=¥5IœÐn÷¸zy•×N¾Ì(° “:µo{F5tÖ¡QO¥šzdŠó(1¢¼0„mÛ+aH¯—1j†Ã”Àˈ"HâŒNÛ¼žBÏDG®´¡mN 6ϺŸšî9³lïÁƒ÷ÞÏžÃsÔªAà'wl%¸g<aü ’*@ë¥õšbÿþ”»îü>£Ñ·Y^Ž8}f'§Ïìáé¡#³Ýœ¦3FqÌúZ›áFÌbïB9ºÍG¹ö—Îç¸r\ü¥&”Òù9 ®·¶‰R]ت¬Ã!Ñ“Žû¨¨‰ Ÿ³ù›’æpÏQ‰ãŒºí¨¾ø^¥±$å\è û”Ãüv”Ÿó¶ Ét^³ùx;€]óGBÉ‘ù›Ù¾}–0¦¨¸Oœ¯V ÷Š63ºdb‰Áì¥Ïž=ÇÙ³8yò$Õj•£GrâÄ *• žçÝó`0(ÏXDˆ2öòz"®Éõ4°JÞ¼L릧©¾§È\rÚVµŸ§å*î,ËJ›UnÒ M%øHOàI« Ö&C g¯n›ë¤iF¥^%ˆ"öí?L¦£,æô¥+Ø¿MÆ(MÑ™@JŸZ­É(Iñ…‡§A©„îpÈÜL‹Áp@­ZÅ÷}ÖÖV¸íÀnVRýøxñ3Ôj>ô·ù?ùÿãÇ~Žçß<Ç-»·óé¯~‹j„!ÕZF³YŽ+óq”RÅØ!Ð^Q=ýSh|Ë»ŽÂ*•Ÿ(¦¨MøÀKÎÌÍíQÅØMç1ŠÐ 1†ÛňyŒ¦U ë¶îY»Lm÷cå”D;ö¯2`C%ãd™¶6…Œ^o€4ùÔ_|ž]^Ì©—N±­aRª)Œ ~ÐÛìÑjšËȥŌÄÞØ»}Øìa"‘`>„z¤™«KZuI%<¥àlß§súGñg#äÌ›h!è%–Ëža°–± ¡΃ô5»÷ Þ°ó¸æÊé+¼ÈÞ¿D¥r¨% ™÷VyXfYF¯×§¿sipÑht <$ð˱®r/i©ÓáÚDª’¿omAªüï®ÓEáØ"Õx×9™&„r‚ îHWÜD+i·uwil/‰Í¤vØb‚|–_4¤%ƒ 9©ÌÊ©Á‘ƒ7quù{÷Ÿ8jCkÜ⬠þ¹i$Æ™ Jk2 'QNª`––cîjÕG EÛç±G§ÓáâÅ‹ìß¿Ÿ#GŽpðàAÚívœmD¥ˆv«®÷zÓ¦aÓŠùV~ê­x72 ùI’–™Â >¦¶?˜„$MðüŒTƒ雤”æê¥¥4#\‰ÉÊ +!+ËTë æwí!ðq«Ì¨®…‡ô%J‰b,„!~ðþ·ßÅöKüƒŸÿ_{ê´–Ì´fQ•ºg?ŸüÊ·ùÙ÷>Ê×¾ÿ2Ož*xé:ß}ë±`‹±îÄݺß_‘ámVýÁ€¨ÚâÙg_£Ù[äì¹KT<T_©šZùÔ!µzD{³O³!ñ}Í…‹ ƒØtoqfhÍYɾºÏÁ…€]³•PàKEª+í„óK ³E°v±ºŸê¿B¢¥É”À÷!K4ñȼæV;à A%lvr@Š ÙôhÝâ³p Çk.óÓïy„Oã Þÿöã¬nl …G»Ý%ÓšÇnâ«O<Ã7àÙ—_e³S©ViÎÎÑj6B …(ö<ûg!wR›Õ<ž#ªu†’ ´Š‘YÇÕBOœÈÖ2“ߤƶ$Õˆ‰™©vÜÎÞÍtÎ ªlÁγâÖé0jµ»/Eè…vÔôz¢“«<×cn%„ļIz½>š€—_»Àé§¿K{eÝ[# .RzV<ê µzAˆï)ªUÁÕÅ!«0ÊÌ([{‚¹–ÏÁmÛ[žTtãŒ+#.¯'œ]NXÚÈ8¿ªXììfµûël¯ü.~z…Ä“¤B’eš4¨L0J4™0Ÿ7CÐ@· ƒÙ—%™Y5 M/Ä5ItHÌCÿòAú¯ÿám'å r‡ÜÇL³1–%½U¡Ýª¸ŠéMÏ4ÌÍfyì¢=†£+«\:}™7ß|ƒØ4™èX8F<‚Ql#SSx¶ÍCXQÌl‹d}ú}ͨS%ËRZQ„/Y" l' `؇å5X4Y ìöL‘ÞŒMl¥=³Ù”>üsûëÔjFY]Éb=t¡0úšÿ'´sHûló1#>“[Œ+Ô*SôGC6—ú\\»B/Þï8'(\¾ïä`ä;bwjåhIÝlï"#gJ˜ÆäîXRvßîH[ £×ÈÕݾ#JÓS<Ðjd"r"ñä~YL¹<:#pá|ýbWî•ûgíÆìÝkÏŽ½ôÓ6ï¹ëÃÜuÇZͺ L2°Ë×AîBÑJ“Í€ÑCõ(5Ö–ì"…@x52%6!MÇžw)%Y–qèÐ!s¶ëMB¿M¡œTgOFHNþ>ÁìüÛId¬ ,ÙŠóí~½ëÚÁ¦Y)KmÉãóL_\U¯ z|?Â÷ó@iÐ:EHÏ„N P¤ ㄯ~뻼ç]òàý÷ò‡ÿéÏi4›¬olR ¶mßIšiÚ¿ã>¾ð§©Ölo5ʺVáÞ[ñ䋯òØýÇùì·žäçßû(ò·_gïî]\^^¥»¹Aœ)Î\]åÈá#EA@§½ÉL«YaØWe‘X%1 ‡bt¨ ²Vþ+«ÞJ”¶‘j06Šp­J…7YÈDaoJ…¾Ú ÅÐÅËú¤ÝÄ*×°oOí½(¬Q9Y*÷?»>g]î®ŠšØ¢µy¶D©N FŽÚ Gd™d£3ä OÑðËíüÀ|¢ŠG½Q­× G Sê ¥¥Ë«šAjÄJÃÌ0 G™QT†ïiúý”ÕŒöÀ˜â†©ÏÊèǨù—xµ&¨tRú»|²Š 5‘šÌÏ>îR#|‹­ ÌÈUù¶kÏÃài²ž&Yn1zåïÌ=Ïœ÷2G*wrhßæg›æ`™RœaZÞÌ[ŒMvÛêFÝwA!3Å9Sñ(am½ÃÕK«\}e“Mý«ºÿTÖž§u7Dû Â3QоÃoC¼iÆ©všIG£NF»«èôúÌ5±V†+=¬QÕuª5è:tzWû¦ˆÌ‘€Í‘éœÛ¯.Çe÷ÁyjÕŠea2¢ÔX¸ê£‰GL\sÝ)=FbÂâ(p¹zªò¶, ¢˜jiK¨ò»«ƒUúñ¦™ÜYÕV^|¤4ÓßwŠŸp:bY¾|.`+øLk‹_ª»õ8¡,ïf…ó(­@K9M%J–·Rå˜Üm Ü÷¹Òå@ar¯{®'¨”CÂzÂj挼•3Ò_Ø>qÄÝûážÛÓjÖ‹E³R¥U¯°¶¶ÎžÛ¹¼ÖfÔÝ$¬Tý€T æfg¬¬^²¹¹Iš¦$Ɉ( Ì#U%:Å3D«<Ծ̈.´Ôæßä·Ñ,a wéUÙ–*>!Æ}ÆÚ¹ºÔ0gæ”?)±¥zõÅã˜xB©9µ½¦©´UY¬õ”Q)Î÷¤Té«Î¹ÄY–1Æô1qðÕ¿ùþ`¥s§ñ-â°VƒZç^ˆªUâ8%‰G4½Þˆ+‹™X$fß,<ؽR‰*5ªáÕ”^_Ó˜B:L 3‚äcøâ&Bþƒ4Cá!ED0ô#É0ÉL ÅH%:5ÅYУܓnœ¤ qÔÒ¶F­$ŒN”få1NÜõϹyçíìÞ±Ù™•JT¦ø×Œ§søêÖ…|Ú¾úz}9aËʲŒÑ(aye“³«§èÈ׸´yéèâÎ\Yù8ÍuNÐhô˜Ÿ¿Êܘ;ò0ø S¨{’jµJ§›ÒéA§“†ŠŠoTüq I–àW†dzH3bqÍGS¡& ^•nÓµûf…QoÞ€¸‹úL…( Ï (IyÓ1/â3qÝÍþø~{º¿´X)M:R,µWYZYc¥³bD±zÜ&%¥¹|J7G;´° <‚ž–} ÇÕÕŒcÆa„t0/œÂ±3åM·²—€$5êùnÞ÷vÁÕU£ÿC-¸zÕI;›#6Ón7í¤p GçÒÆò#¥yoE‘ÇÁ]ÇXk_æ‡xÇŽ¦V«NPÛ¸&gWu Dùä9´*í4ªØX¢˜}ð¤ÐdB'qš+L¦‘Zã If ÿžÙ ¡5¾°´¼JüòG~Š?ý̃À`îˆÕ7žÁ›ÝÉü®=¬Æ)_|æ$ïè8þÅïð¾ð=~ö]oã>û%½çv–7:$+ë´ÛmvïÜ´ˆLOx †#®\¹ÌÎ;ét:¿óv^?uš(Šèõ‡¾Ï|}Ž$Iì8ÉQ‹j³kͱšÊŽ„LÌ&lŸkqhG‹×^z…x4š2®)ïÿR8ãÈ¢æa9XB¢°r×\ Å´íàÇ;ß¼ó–(I.™£êvçm:Ó…Ï!Š”+œ½u^XJ±†ki1o”8Nh·»TÛùÜ'ÿ’]Þ W/!…ér›-h6|Z³MYš1ìi6=Ò4ai1-xÂÃØ* MÁ¥å˜ÁÐæ ¨ø†iœ¤eUóƒ *»Ädó—8°ïË„a)I’1 ‰ú]6“.Y `¨Ž!?̆š4³œfºgb¡ ´D-€@½—‡þæï¦V«P©„¾c ¯[ÞŽÇú¼œ>¦íuzq¾žÞgÚ¨ÜÍ]ÏÒ”~ÄÒÊ gãïSÝßcðòíôV>Ê{?úÏh´.“ ^»——ž|/¯=ùà·Ù{óIßõ)öÞñ’yhïƒî‹ñfÂp(Y[ñdJŇá°l½;FíwàòÊõÄŒ´+À@Åd²Ê¬?Ãb²BO+dèqïÝG©´|¢0(ÆÎãAÉ“‚;=±›†©I Nç‹§\wÊVQÙÕJë Ø)a6»â4#Uªx¯+Gìåeǘ÷5§öûÈRØ7?ú¹pÞ}§ækO—ÉYnn´ëÎ}Í.h$÷c+çgz\-ž»MQe‡´½Ìδ¸pùU>ôοÃ-7í§Z ¯ûte´rV”®“<±*+ÕÑž'QZ¢•…vºŠnO…9/ÒžçÑl6 Ã0 iµZ„a6vuÞŠèµUg;Y¬§å@o¥Ú¾Q—=Ù=o5sÿÛ'~E'IJš¥Jn ¶Uç{R%|Ö*7Ñh¶ˆ‚ÐüàžDzyÀ¼üÁ’xžVõZ•ýûö‚J¤/¼ø*a±+¾Jgå2›ûßñfvBg GìààŽm|íù×X^Z⎛³¸¼ÂL£N…xžoó©Ò3¿Çq̰Û)©T*œ9}–={wx•J…$I}ŸjQ©ÕŠ7|nëÈ”&³{JPfëêÕOÂh¸É/…Lee!ã(»(gP§q°žzÌû:Ñã»h+ŠÈUygëRvLʧ.<Ò"Ö+WÝíDRjg´ítßy¡ÏEç?¤U­‘ xùÕÂûß÷mn:|?¨à{Ò“[Ür¯ïTd‹šØ®ôVãòÂ`ž^¯Ïå+KœŽ¿Os~DÖ«ðÔgÿ/Ž=|š;ý-„ªÙÂxБ\>s+k‹Y_vø^:ï¼÷1Nœ8f•ÛrËi£*‹²Hí¤3Í œ&MËîY9ÈùËiZж<Ï#Lý C#L¬T*Tk öíøjyƒQöV¶©¤³~+þè­ ûø÷`}Д± ¥Ç+Sc‚¤|œ% Yš¢l¡$·üØ8ZkNÑõ:o»û6¾ò­'YÚØ`‰ªAà…!7à¯ý%·½ïhÍ/ðù¯~›Ÿøà³±¾A£Ñ`s0¢9;cˆaùÜG–¨ÀóW—–¨7šøžäÈM‡8{æ,@g)¡P¯WÉTf_¨f~­s²V¦XhÖØ6S§yÎGŒØ4K‘Ò+â…Åwæ]²pnü%ŽÏÉ€£LzÏùÜ!Ì¡Ý1vapsIb¹/Ù.¢tîó_]Yà®Î÷á…ZÛéó]D ÖcŠ”<‘l4Jèv{„a‹Ï~î«ÔºË\½p’i³M˜›“Ìok¢´Oš(:ía¨©VL$a¯g‰Q £>túVé 4lA¦ÍH;çm7ëuݲŸÙ¹Õj…À÷"F‹gÑêi._ipþB“ç_˜>HþSvïþÇŽý$‰çDÒ©BPbL(0!†|îó?Ã;8ͱ£—ðý†!y 1u3úÖ¬Râ-Ù©¸?È‘ä7ïÁ`ÈÊò¯\}¶h¤ðâW>Æž£1Çý-³[Wöдd¶ú¬âð¯rà諤Éß’Æpþõûi/íåõïý$ðhn²÷ÎϰÿÞO§6–!>»Ö È`Ѓr7PÚ©[ ûhŽîÚϱû¨VC<_–’.QÌh¦\PÄP˜Åÿêú ƒÉ®);0ÄŒF)ƒÑ•ª"HB*ûD—hΜ…O!uV&79)°E¢VÑaç¬ì<$Þ¸žWþJ•ÇŽœ„›`.Ã|úsð~Qpþ*üÆÇ€Ppæ,­jâ¡yy²üú¹XL 'èÃÝOër‚–ç\tVl'<Çû섆HÇï|§Ï¾Êûü·ÝvÐIÄ »F7@8T½RxeÎW)=³Æº=icBÓBœ•ÃI‚ 0(Ù0$ #Z Eä }ýòVEùzãð볫ô5Öª·Š\ø.§-÷ )ÑYVôRJ3~µ‹|eßzƒ^z«J‘ÙWXªm>ªÄiÆS/¼L£V¡?¬Ðh4@™›O¥Z% èt{¼úÍÏrÏ|„½ðͧŸg~vÎdÎff,©ÑxZ™Ý§ÏøÚ#ð++»í6.^ºD’*TÚcÛüÍzƒµµöí?Àh8BÏimãùF•V-¢^1Là\½=N: XY|ÃŒU6¶·ÕÅÖ]Ø`í¼I]•óFc#Ls¤ûöTÐ[z›³1ôcaC(Ò¨J•v¹ïQH!µ7c‚°¼ƒNÒŒ~HÖyé•ÓT:ˬ/ŸGÆ’̈Œæ Û Êâ,„¢Q÷è´G¬¯é‚”:êB§gu_@#‘ÀÅÐö˜©µ8qâ6¶ïhÑhÖ ßÒ§ìXO)vîH¹ëÎ.ñh«‹orî—YY9ÊW¿öw„f³ÉÁg™_¸ÄÎíBV·ð†ƒ˜/~é8Û·ßÊÛîÿ3‚ Rª)';Øi7dñ_ƒÂÍ ßØùïñ(¦ÝîqúÊÖ‚%æxí;£²ñÐÿ"²ñ9â15Ý®ÈU¿–¦{ÛSèì)†ý¿f}ikK{Y~õ8¯~õ/iîxš™=ð[K÷ü%qžÑEèG¯€6"gvÒ‘bÔÛ³­îyèÕZ?ì|ª0ÎÊsÁÒcÜ´ë8ħ-ä…ÙMkÃÉz‘yÈLªÃáˆ$ÍÌû9ÿ4¶xI¿ì~Õ¯Z‹2ª‘‰hGw¬¬¤™h謼—kÝ™Ÿº.VÁ *E‰ôt2”2« ¼[ó?ü¯ …äÉgçÇà‹pß1xáu«ô–Fàæ¹líÔÙ7ÛÎ=›L¿r¢/‹¥A6Ž/Í{Ž™í.-žãŽ£÷ð¶{ï Ñ¨]£Úž6úÍHB”MŠ`bz`»ã‚ !$£´JŒ ñY>ÚÎÇÚQáy’(ô˜möR³¼n±}+Ô°\¨6ÍRµÕþyÚ(}«ËÁõ<Ô~ÎÎ=fRH2­¤ Bg% )©²»^{ájõ:·Ý{2KÉ„EúÙÎpss“Í >øØ#8rˆKŸùq–xÂó@j<<‚ÀGGa¡hOÓŒ÷¼»ƒRk,¯žeyù)®\™åSñ ÝîæçY[»ŸŸú‰?@Ê™¡9vÒãyŠ©} ÎÄY×ìþŒökŽâ˜õõMÎ_]dfd«+¯}ŒC÷}¿úí.ø­êù6s[8у¾)ÔRƒoDZ©2—£L”T¨Îu˜ÝóuŽ=üuV.ì`cqWNÝÇóô›o¿¹íïüïQkW¼Y>~?ÛojP«VÌ“ïzóxÕ±¬x9¶EÖÅÕ7è¢ÅuºëëDÀ:ÂK¥5^ e‰ÏͲŒ$މÕÐO…Sé2õI9Ý¤È ³,½ÒR^[ЄÓ)gŽçI8ÿ=Kˆ£ÔÎ1šÙ¾v>~–$þé¿Å5ƒ`Ç»lÁ#¹8-³—?ߡۯ©bšpR¨ô„˜ÌuŠ('ùêྫྷ.¯pßÑwsìØ.êµÚ–>ã部2# /Ôù9l:^[ 5h<¤W!ââ¼Í‹±[œ¥”„ YŒuoµ8OŠÆ¦‰§êëeBo¥ú¾ž¸lr$îK!QÒ<Ò3ºT•¥¶Û+¥†ÊB[ß|ázÂj••KiÎÎñâOpߣZk’BJŠS¾ñïñóþºï>ù™¿e¡1g‹«QT«5*Q(Œ¨Tž{âKœÞXåýü9ÈßPt`ÆvZküT¡|iwÓÚYt†Ô©•Ðg÷lÈöFXøI…$¶¨+çÕR.Wt›[›ô¸tþyÖV/ s_š…š¨,c E89ÎÉS¬ìâIå¨çðÈG×ÅÍËQeh•ï„­8ÂÒ”²ù©ùÈ]å±*è ûÛ~=)íþL!ür ]–¦ ‡Cú½!^Ðâ¯þã§Ø[óX|ã ³“«Taç®*a1¤t{Šá !Š2ªUŸÍõ˜NצS%Æþ±80_§.`6„îÐŒIÛNq»ïȼmF ô—ÙE¤æþp;•‚#¤4#l@kS°•2žÈ}Å®)ÇŽnÇŸ!IÞ<½‹;o_ãð¡‹á;*{1½[Þâã"ÚýWî ÝÌèL)úƒ«+›,o®¡ë‚ÑÙÇñjï€ÙŸ¥³nŠoÚÚç'²cíÀtÏ"-÷¢Ò?xÊf@+ƒWM(Õ¹R‚ÂÎCKlÛ·Ä¡{N2ìÁÚ•^ü¿gþ]-ÔÁ+¤>ÔN-pøØN굺M¨’[\]´S¨Mg;.ùÚ ÿ"·(ÌzZ/wMÑv;'™ùh©ÀWèlœÒ‘¥A'öà·Œødbëf1ç©NÊa Q"4¥í% O%îSˆ¢mW¬ò+éLî—ŸrÒ©Šî[À¥uó{­abUŠ¿ŒŽÄ¢=E)òRž-ÒÞ8˜D 3nWVð–{ŸÝQvqÉ;ûÖœOÖ~›·ßuÛ¶-†þu»H×ûœ[E'í¨y~½Fõ¶-à);ñ<]DHº* !™ku‹ðœiŠíëÆü‚1I›A»$°·âÞJÑ=ÉúÞj7í7Ç~$¤I©-¢pç{Ôšu†½³ €d8rþS¼õ$ ¡=ü àíÇïfyem ó¦ù_†²Ï÷ ÂÐÂÍ2ñyàè¡{9pëaâT£|iÁ†6#|‰F¢3i0|žfílúÔ}É®FD#’d*#G¦ K§Ír\‹¬ðo›W¡¹šÆñ€öÚez½566.;ÜR ¯,ô œk—;Ý<»WT.Æè^΋×ÙÉ1^ù‘€R·Ì ªvv™ã쪼˯™_Tñ=MÔk«”4ŠíNg€¶øÜ_}ž=~Êâéב˜fÁŽÕZ…~?e0T 1ŸR¯Jƒ”Í ;>Sf´}©SŠ‹öT¡74óºÕœdÀÎùyŽ'¶: IDATžØK³fwÎ9”Cˆk)Z¹x ¹˜NZ¤}ŒMÐø¾“T"‹*Í;¶ÂA„E‘½f¤-ĵ»æ)o•ÆÄnb+Ñ %ÕMÙuC¯Ûgm½MºÜA¯Ýú=DG~‘,5^åa" :Ä36)/€(4‡h˜5³å(5Â^¢êT¾‡,òŒmÇØ‹=^úòÿÌÂMW›¯3RШVyÛCo§5[+å3¢':ß­ãzÌí ®é†ÕulWÓxlÚ’ä~h“_-33ûj²°µólöWÈ”ohTvßš©)žeç)TNÁõr[VNé Ëb)ÔxÁÓ.œÄŸ¸*n!ǽÊcEšREí>¤Š ¿µýsª ˆ}¾=ßhxrew¾Eò\|¨*û‰\°&ìç>ìßuˆÕµs|ø±_fÏîjÕhŒŽµUÀÄøÇÕØ7O´„©dà+ ""0/Æ8q¬á³§i½Ødˆ,£×7·-a¯R2{C’~ˆ°V-­™N¹xéeÚíE¤”Ž ÀåŠBamx½Òޕը>M =–T©‹×¹) ‡$檯™Œ)û|X5lN³ ÅB…éØ3Œ—» NTæ2‡Ø®á0¦ÝîÒšÝÉ_î+Ì‹Œs—Îá')~ÅdÏÎù4ZUºÝ„Q ÝnB 3¢P“Äkægö¥Iü”b´œH–å ô¬,¸ZëYòs¤ðp;Ö,¡ܧŸPÔ9~ë;¹ùÐ.æærÞötÑÔ4MNyUc¹®¸UÛ¶]3S¸‚`6íãaXáɧÏã#r¬äDÄ›ý=Ë”ånCš%È caÏFýB †½õF )%¯|‘»N܇К$‰yîùžÇÛ¯ï)|ï·¥„颓8!öèšßýÄoðË¿ñ Þt ÍPIj¡GÅKiy){›­@ƒHDy³˜`« ð}ü0À“>B$ôû=66®Ðî,3uñ¼`ŒUüθ0 ¡A–{ÓºE£TGç(N—&T†‘Œã?í¾¸èœ¥Çè"Ãí µƒôêìâæž Í„,P,5.NSÚ.Ò«òÍo<ÁèÂEF½>Í‘G­º°>"¨hÍG&ñhínBà¥A Ú›`e™Íë°š˜¯¿=4XÈå‘)Î&ÐA…Ux𡉇›Ip=á´[iþæÏ·³»v©iÂaænù5&EaB\sÁ¹®¹ù-x"§wmŠÏh4b}£ÍÒ™Ú«Kôù(>=è^ ëAߪSÍjDV#€2t©,4ébºnÆØPvÏ©ùùž4ƒÑ’Qyà'C¸ôÚ¬^ü0÷üÈÇÑC¸ò<´6ö³ç];hÔkøž‡ËSÝbŠ!M\n=ævGÛoeÏ<¾ŸÖºü˜Ö2i.ËÂtÍÓU‡¡O«UgÇöy’$¥½Ú)™ŸÝÎz{•$¶¤"¬Îë‚ åìes»ÒÈ‚L‚ž‡¨&ÈÈv©jüâÖ11–ÎËMŠqͺ¤TŒç—æRÄŠÂ,›˜·„ € Î¿Ñæ¢'EéfÍ»~éÃ7¿ƒSgŸã‘{ãàÝDVv½ä§ñ‚7Þ•Ä´k0ò•BFeÊÓ5ûm÷ŒVJÓ¨Ž¼Ì™¢ð– æ´ÂýV2Ÿ·*ÎÓÆÕ7úüîe#Š"â4à{ß{ž«‹+úø*SE§™+’¤¤‰.c(µ&Éq’€gFÛÕ–.\$ªÕôûTë üQln\ʤt¤iÂå¥U”DA`÷Øbì&-¤Ä÷ÍQz£ÆÏ<’þÓ¿ý]þÙ¿ý7 ûÔSîœIÒ !ÀO}FÚ›äâ ƒó”žïy$Yư›Ðî.³¸r ßóñ|)žLÝ ”#-ËÏc….D.ÅòJØ+›5[îš½¯“ZtÂN±-FU*G«*kmclDŽ›j¥…Aæ"4¥m!Ê-/²Tt[BšA¡¦ôz}‚°Á™³‹,Ÿ>jÄÊâYŠ À+ vφN‹^|‰õö—â{BC¯kº­(„Ôb¯ôͻÃÙȪ¸­Z»nGÜž¸›íûf©W«ø^yXoY¤ÇÓ¦wµb\n4õ8¹îHz«Î¹È˜®üçvÐÅÔÊä;onvY¼¸ÂÊù˜Mþ[B|þµÑm\„l? ò ”¦S&ï,8c”@›ƒÙlÒæyJmè…/ÍíÙNp82Ź»Qç⫤µgÈÆò+ß…š^àøcGhÍÔñÏ>%zl¬ÌT{Õ4‡òVÂ/ue÷Ö£í‘h&_ ­A’VFVUnß?Bú3­&{÷*‚Àçêâ*ËËk µ¦^«³¾mkîyÖ.îÓA^éR)T2¨¤64&…tFUÓMkßQMJa™MÎJíóêì¹ÈÄDŽ*wØJƒMò¿—\ Æ…^Å$ÀyYçv®\,&Ouk¦ÅËo<Žû8zóAêõj1fžÆ›vw».ÑMeJe¾m¬Q¤j޼ƶp:”´¦ìšK^$2­CvmXÓŠédãv=¸Éda¾^çí^T´Ö„Q‹O}úÛ¼þÚ <òÐqöìª#Dè¸3'ÅIr¢˜.Æ¡ij:±$Ëè÷ì½õ6SpfÔ]«püÁIG‰!É Xßèrû±[öû ‡}jµZ™{,ÊÂ#¥Ä÷|¢ÐÃ5Z%¤2ãÂÅW9óåÿÈG~ì= Ñ_<áù5˲â–äy†É-%x™ oðýågy³†õt•Ëõ«ÜW¹»¹…5ž(ÆÎqí¾¡PQ;OD¡Î¦P† - œ`ÎÝV:+;§[.PžyÒŒvºr'5·K ë.oíÂÒ¿Êyœ.?Y>É H¾Û4£xî÷‡Ä#ÅêÆ&O}õ›TÒ>ë—Ïᇰ0gHJõyÅjz‰þèý®Ç¼Ø þ:´‡ë¨XF1:³{çucŸšfØèšÎy`wÑ«NÜ}/nÞA½^))òGÉ-Œîˆ;W{nU¤'÷Õ“srw<­ Nîš§]܈¢·Rè¯Óû­”"MSº½W–VY{ã*¡Vxâ ý01†à ž:‹Z?…¨~®¢`œïPF+àIðC³cLRP±Qñ¦yÝx¾õ¾ÆFB?´‡q––‰Ý>\~åƒ(uIÿç8ÿ}ˆ‚·?z'Û·ÏNyÁ—×cùÍ×섷̯š„LÒÌ·Ânµ.WOJ „òÈÂÄg÷ýmªjµ±Í›µÞY³4¾re™™ú ¡ß#ŽGENs±KÎE^nð„µheú> 3©ê#3áPЋ`Qp­Å„£¬XÈRåöÔä¶G;ë³Âã=®¶Î?î†âÀRN†`ŒÓ]`K‰ž°,{-aß®[I“¶íe÷®…b´=-7`¼Ã-§¹U²ä=è1ákþ̦j§ÕülmcÊ5Bµhhvè{äi¾äiÝ­ëqžŒ1)ÛJìµUaž¶ÏÚVkž —ÖxáÅ7¸tñ"»wµxçÝO’dÅñ擃3rn³ã«SS›Ý+ô£ƒdiFš$TêuV¯\áí?Žïù¤I‚'=<»È¸óØÍìØµ“¿øìßÐjµŠƒ±µŒUáEQH%ô ðƒDÓvÐIÀ\° än.­,ÓÓ¦Kž•ИÅÀžK+À-7âð;i6k„a`ÔñcȤk‹íÔñXJ½ž”…ïrmÕ1ßȆõŸ»›.RªƒÁˆå•uÚ¯l ÖÙ û$Ÿ$#$åm$‡öß'kÿKÄìSô«Ï vü^‘jEfäÝl˜®:²êÜ$1'½™F;'Se6p¡o¹è*ƒáÙa¸þü_°)ŒvìŸ)޹j[ªl5µ˜Š ~öÖºl1¡ìž¶‹¾Þx»|¿ŠLfq0²{çñIL®-©D¼YsfŒF1ÝNŸAgH«1ÃÊêJ ÎxXËòÿ£¬í*çScvуO@7fšCˆèVŒBRùã;ê\!ï’3+Vïg~0yO³êÙ¿ã•;åüógÚQƒkç² Ê}xq·—¥ª]K¸ïöãœ>ûxøÃÜzë^ªÖ^çv˜nš{ŒZUØ#‹\hì:P+™ñŸvìWzl\îûõê H€š,šÓŠª[Hó¼U7< Ïy=~Û‘_O” ?ÚÍÿþþõºàöcG8rx§­·éØßõ… >Ïó7•žŒŸÔ$–•*“%ª+¤µ]ÄsXسŸz³NS¤ï;xó&úë¯|ƒF­Æ/ýüOó;¿ÿìٽ˼¡E9ÚÌyAà3«+èD$iÌLØ¥T¸ûö»Ùlo’$1*ËI_Mf‚.$‘ÏÕgÖüÿ”½i°¥Çyß÷ë~·³Ÿ»ÏÌ ‚HŠ‹LQ %—dK‘c[‰•²U®(¶+Rü!å*G®¤*q*)•SŠ]e•cËŽ\RbI¦HÉw‘p €03À`f0ûÝÏþ.ÝÝïvî¹…©™{ï¹gy—~úù?ÿeóÒôÛ\™¾Åp2!h n\mpßæ#¼Úñèëçúéu‚ûCÞqŽ9Ñùƒ:ïJäÂ%ò®Té`ÁÄ6eO ƒ˜ÑºF‚È­ÊtÉÆ÷¡‡…ɭט¶þѺ„ß¹ÀtéÛŒ’ë>4Cë<å{%á‚›H3HR[ ãÄΠ“kMôðãü9R_ÀO>ôgZ§×mø~¹ [€Åfµ¦ ·s?7հȳøE®Ýæ@×\B¡¦¯Û{Æ×qc†tÅùà~Ë8IŸn§ÉÊJŸ•Õ×oÜ¡-ÓjMFåÄ/ïtM)*R œ•B•¸•w·©;h%ÐB€h€ò+3à ÜwÄf~Î])Ò«B\Ë?cáñMYl«n—¦T9 ˆâDäúlá:ùœ‡×í6ؼ³Å÷?ÀÓOœ§ëržç;ÆÃŠ`-‡ ?gºâÒUpž4M’­äLœC‹~n±ÜiNк´MïRu²Õ.{+{qÀ‡¹'ÉkQ¾óüïÎ*/¼x‰«Worý­OñžwŸCJ¯@µ¾vD$Só“.‡øºB,Ê\Fgºu•ÁK„Ë'8òð³Ä©BÈ„F³Q0—¥ü_ü«Œ÷vùÔŸ}ßóÑ™v³ QÎaÜó=ŸI˜rµ³…ZoEüø>Äd<"Mt–¡µÆó$Y–’eÆÀ•W¯óŸø.ñvF#lðžÙ{™}G°þGøK4ËêžÌIÌØ¢=sãÖ4sôðWñÙ&ä?ýN‡½ŸN¯IP‘T!Ä!3âù>·^´²;U9Ü⇚ÚËŠ(KçÆT´P^`<]ä«ç¨W R¯-Ê’0 è÷;¬¯-±?±·=`ãÈQÒô³Yb»ãjæ². ¸ò¼æj˜Du¾œ¯qIa áäÔvÑahÿÖÎ^TÏÍ›®Ëµ ½´.íŠÎØçÜ=l^Ï\+κB£0eç^Ì¡U¥³–pæÔì7ùÀc?ʉãëEëÛu•¦be ¥‰’žŸ÷Vž"U-2êk>WÚ÷2¢ÀùZ, d-‚³ç½±çHªÝï¼Þy„ýöIU%#ûÚõ˜ó;ÿ;ϼçôº-9ÿ@eà ö&BXF™ØâöZô REjRž0’e¶ÃÞºÌöµ‹ôO=Ìñcõè 0 é ”Éøöóßæ]?ʹûŽóŽÓ'yù¯„v‘¶»\§e“6Ëoú d†Ÿ5ÈZ‚_úÉŸf4‚1$IŒïÄ“„çn|‹WþÓMÄ †XÌÚc'ئuy‰/Ÿø í?^墒mw‰€wž“[·:Œ†ÿ©}^yõJ¤ew_àóóäªSÃüLzqlAÁ Š©(˜îoèüF‘Bºù[½{«æ3öš‡•Q{œ)8ÃÑ”;·w¸ñƒ·ð²SJÆ{èùvÁ ›vfŒ†TCjlª‘Ò f¯¢‚W1ÝÎŽ`²¤ÛÞýo!È„ ~÷2t¾† ^t+¡?ˆ ˆ)˜Ùó´ø5¬ÛØûßûn–VÛ„a„,ÜôLW…œ«pµYªY%ЉJ±®HÊ…S뺗ž¬XašÒ/P^V¶ë°«h˜çy´ZMÖÖ–Ž&Ì®Þb÷î>+ËkÜݼƒVÊêˆE]Ëœw¥¢âÌ&*{‰Zþ³ë|g$>„3𦠧Π.pÅÙUäêÖf¾®è’s¥\Ï.œÕh5ÛºØÚÚúL;ÿ™ç9„%g•K8¶±Fk;û ?|ŒNÛŽ9±´«ô|汩HþsH•aŒàÒ•k|õßä©§ÞÍÍoE ú½á¥SÁW¡¯¾ñ8a“%ÎvN²Üê’& J)6·wøçþ»¼tér…õl‰þê2Y˜‘vf †cÄÐßvÙ>ñí» >þ‚½Åhì³qä.^\gm}‹7®ñ‹÷sòøi¾óÂcüÃ_kFíÉÅùßiSº‡Ù±íbÍ|úyeÑs‘”Æ9±çH`r ”s;Ð*Ã!j&óeÇ]Yt´ÆYÚrè<ËifÛÊø|ë…רyó"íۈá&~hgií® =¶w2&SAäÑy’ƒPYj 0”²Fü{c˜+ ™°_ç>Û‰<ùÄ)ŽŸ^E¶_£ÑøI„§ÒhR¡äd¶…ò¢BCÚ‡A͇yjW|â ¥öX)E’&L“)›ñ´Â‘ìÓ:´¢Aàdx?¼ºªNÚ•¡£#ýM&3¶·÷xãWÐã]"7ˆ©®'mdØ‚LZhé»4)—¦ (í®2u)î€÷Jü®í§EßáçßDŠWæ4ù±Ì˜¿Îÿ+)C4ð¡'ÞÏÆéž•ÁyÂñSì"+|ƃ&"¢aÐǪëK= Z/0;1)fÂ)„AkA#i’4§EêRÎQ9”K.Jײ0ðé÷º;ºF§Ü¸q5õX[Ý`së6ž‹¤ÍDòN:O§Êg¹BrmTQ%`Ú¯Í)ˆØêܑ̌@v@‡%©]˜9­3¥Á V¶¦¢u®ì G1¯Ô3WsžsYžyàš-ãëg¸»s…gŸúy6ÖWÃp¡Äh~W5mzÔA;bc˜¥ ´Î}Ôõg¯jè·'xžr§¸‡¬ë 4J)faÇ_-Ô‹ ðêï/š=¬¬âÓŸùßøúWøðŸäÄñBtÉ257+/—·ùB/o¾¶{¶;«ÄôIWá¥Û1K'‡Ê2U¸¾f¬`˜¡•â­—¿ÇÍW¿ÏÙ§ßǩǟdãä)þá_û+|öË_Gú^m”÷Væ$}ÉöxÊç?s‘ÙÅ.÷g«t½#èÍþÉ×èµ}®\}ƒ?üüó¬w{´×6H§kÜ=‚ûö9zÌæ ŽÇ-âšn{Ìú¬‹z`“凾Ïhz ¥2úK#–—š<÷Ü)âÙIZÍ&wÿ}é|}-¼|ç;ã*¯ª/Üj%d-ÜÝ«õÑ®iš‹yY9V`.$£ ™Û.Y·qôRQfj£É”&IRFã *“ìíÅܽô z<€Ñxúô<ë6)fq¨hµ$©Æ—†ñÈfæ* í6 °5¶/×ÐhCƒNíB1NÛàÁNÑé4ñ}ƒ C¡AŒ¯|<ãY_t·`*O• ùÃÈboÇ´^tµçžÊÜKeãIÌíý+|ÿ¥áÖí³t_âìS×è=ø~b 7¯GlŒ?Âzçxêôvź& 2¥„2vî¼·;äöå¦w6é`Š´¨ë‘ÝìqõœMj+´–FB¬,±K+XÕf‰¢–Ì[­r—ª/€ø*…YzŽXŸEó>Fü*’KhÞI›/#¸D ¬o¬qâ¡eÚ­¾/+F nüu`J|P¯l(£Åìm*yVU÷"ƒ“E# ›jZDSW¸½Ê%³Èè¤ÚÕ¹uNz´Zk«Ëv5pûî6f KUR0‹'¤IVlªâ‚â{î­ UÏ_sûÄΞ´-ÌÝH ›9§/zßΩEÓšËä²'eêG$ïìuÞÁ»O©rò™, _¢"17ùû•­(lðÄkccƒ7¯¿Ê_ÿ™_âô}4[Í"JòÐTÆu4¶Œ¸-Ïq®2@ìºgµÂ<_t¥„fd¡íª­çÛuºóÝýazåyG±ùç›'«åHe«Õ寭}^yõ .^üŽ]æ#zŠ4Íè³û÷üràK…ï`Vßh”òð<› ¥2 udÊié Dø±$Kš½Ð&œ§iÆï}‡+/|‹“çew~¯G’ÄH£ æ1Rà>W¿7äOlaü§³¶õ˜f0áÍGùãß{•sÛܺ g®°·0ºÝ ß’%mVVß`:“ììvð¼„'žÜâÎgIÂ;»]þìw~…ÕÕ+¼vá~!KK‚µµ1ÿÍßíÓl†ôú]VV2´ölZÖs©2Z¦ÊÔÆá„Ûnj]_ü©’»°ˆC1™3¢RàKGY´)Ò›¨’R§“sú cì<[;}H–fL&1“q ²Ã—þôèy‚íëWi·,´æI[œg±…< ¾§‰"@ú5f6É,ùEÙÀ OZ •Ò†µ®]‚L¦©ÕܾçéGèõ;„QPú™S0T3‘aHKA ”òS”ŸºŽ—úPoAˆÅ¡°s–-Ò2Å,NG\~abxóâÆCÏþ'®¼ô$Ï¿öË<Ï»9ýØkü¥¿ñ9õŽm6o|–éõe­·F³Ñ´;íE°ü}—¨¡9}¿á¥ïÝäåï/#ÄŒÛw^áÎ z½¾ã{{ ¦ÓgY_ﳺ 2Å`oŸV{Ïó‘2F«AØÂ÷œI‹2—®&ºÏsœ+jå‰uTþBÇX2 6v±{ËSÅêÎc5Ïíü±¦4æ(Ȳ,µEh4!ˆ–øÓ?ú$G»mn\ü>Ý6DmÏz­ ƒômN/Jóféøž`4ÓÖD_Ù7 `<±]SZ-®ç[ƒ¤- Xî÷8vt•( SXu¹äAÔíÅà[NŸ„H#IÃÔömRmÖiSñÝç=³»3âÒà›¤Í]^ù³ÿ‰ûž¼Æ;>ôúÐgH'pãÕól]˜ßÿ§¿ÎdÿÜyìstN\$Úy‹‡ÎÜ¢-Ò4g¿ÄëD.+¥xýÈc$ÇSö6Gܹp›Fš`Dr`mɇN ZM—>¥¬.=Œ jZ’@JüÐ#j '-ieV:ƒáºÍ²8g‰í¸s9Vß]•!pÃvì‹=û~£ÆYyÊ D_/zòFGaT»èùC=†’E\‚Ï›¢Øû È"’hêŠsÕvÔüÐÝxn¸âû>Ý®Í4n·[,/÷ÙÛ²³;`0¡ô[+ddÌ’)Óé¬@{L…1mªÞÚ•ä°ZŒ£©¿ÃÔ·á'Ar¾s|3#kt¥–s0s´Üâ·ºç¨úuç#x£ËŒðÜMU¥]¢<¿E²•€§†×.}¿õs‹óçÏ8r§¼'ªÊ¹™÷ý¯E?R B¦%™’={µ]mNûé/Òœ¹öúktCEÐ‡Ö ?4[a!=+ìÆž× íMÚ‰(²¯¸¹ Ó±íâ$Ðià 6‚‘+ÐO=û.Ž_·ñ‘¹^VP0lÅÜFVòŸ‹à{¡Óbrb£â°™s•–Ïí´&ŽSv÷†¼zû»Œ½.}é¿Æ ŸäôûþG’4%žÙ¬»¾Åɇ^ãü3_äü3ÿžépÂKŸû7/}„×^ü› iœú-¶v÷Å»ÜI^coÂp<â­Áë¨ÄÐŽÚåìË¡,“é”ÍÍ=.ýà2ãÛ7iº÷6psɃ^ZmÛUMgâC{œs«v+ ×‹ÜS,÷$­†d2ÔøÂή¥±YðôãÙX% ƒC‰QUf´ív«H£¨AÇUïmá6´{ƒ6JËÝøüßRÂúò¬P,"qÍÛE0ù"“{é›çecaØ`2ëò¿üÓÿƒvKÒë;j‘] XZ 渗jt9bqÛÝ‹§KR ïû5¥5ž”H3• ¥O¿½D·Û¥ÕnÓh5ATšY;É$!ISÀ “¨ñˆ7/_áοþw$iÆþÎ6Ahý˜›+Z­V_§Æ¡¯±/o°/Gx-ÌΚ±Ôð`tžN÷2Y:d:ñüóïã×~íó|ûÛßäSŸü{ôw·.¥Oðì3Cî;ù"ü©s¤™bcÃæ0+­H³˜ÍM¥b|ÿÄvH ßm¹@Ûf缕¾À…Çðtá fŠ"n/ÊyµÁÔ:骓Xm:·=pV׉+•‘$ {ƒ!¾ßãÏÿüy¼Ñ6·nÞ¤dx¡a çÆæyž`„‡'4JH‚F£ä8Í,ÀdÓ‰u Ëܬ¹ÓL ³™Õq¯YåôÙx¾W¬B¢"ø¬2šEÏçaóÂí‰4~¡¢Ì¦ ËÊÀl~ûùÃXmæ)Qã ·ïÜe/»ÍÞ›?B2ù8OþüÏÓhÆxž…ë/G®k ¼˜§~òë¼÷§¿Îí˫ܸt?W^þ(o~÷_"£.'ºÀ¹§þ‚It¯{‘ÙvF?àò>Güy`í<Ã,NØÝ²}mŸÉõ›´-q—]7sŽ€–o_Ól§,}Ëh8¦½Ê Õ hwB‚($‰Ç¬ö$¦dóöa Y$C9¦}–ØÃ—ªxTnS0p„î^»Íž}’f/Ä÷ýzbÛ¡^_u(›{Ø’ÌwÉæ€”ÊÀŒhÒÈŒÃkµOK|í£@–ñ- {ûÂ!V#m0A…QN®Â)7ó“¡"¼/Ÿigåm¤Eymœ_ÿÆË\¹úÃÁ&?ùÏÇiMY ƒ‡ô÷Š8LIêýÌOýÈ?±³*ºµÊ+ÈÒÇCš*â8!Žd&¢€FÔ Ói6QDÔ°6z³þ ¦Ù¡Ùˆè´»tºÏ' CúKKô»=V×Véuº,-ÙŸ7 ÚÍ ƒŒ'\lßÀ»µÆµö¥†£ ¢ã+œ OråŠá¯4øËùM´Þä»ß=ÃþÞãDáËœ8ù~[Äñ˜ë7áÂÅ Âàx6dwï~Þõ˜FA#jÑÏÑiŸ¡Ñx€Vãá“x~ÛA“fª¨ëò RW^tóÄö|ÇHÅÒ®ªo®””ÐÏÁüÐyööÂY.ÃEG6›K\¼x…Ùר¾»ƒm!ë0äûönÔ™ ÝÁ÷ K@c¬Ü,j„h £ALšØ×™Í,Dš¹§–Ðí‚H0Â4±ü©ai©ëŒ-ªë¶X¸U̡˂ 4’6i[ËC#Ïh¾q¬Rĵ1Ìâ”}Þ¼~•­=Ÿ½7ÿÿÌoÐ^Þ²cÔ^úyÄfn•(< ã#¡³2eãþ[<ðÔ×8ÿì'Y;ö5n_yáÓïåò·þ[¯ÿ*§ßùÝÕ-d#f+»I¼Ð —ٌغ±Ï…o‡–Vøn°s(¬z³i_3Imqöû=e ù´:íN‹étFäkº]ŸáþŒý}C#´\dj½Ñ§kV’¦…]7±ÅÇ®ƒö<=ûVNµi4øž,ˆ¢eLMuÐÿkžŒUí¦ó2[ŸDÏwäea—súg=W¨+J ©ÑÒéO<…𯴅Ì”+ÔUœ~1$**Ýt¹ÐzÒZû¾OE´š ºN‹v»Ih¥I¦1²²¼Ì,ž÷qUg\•hÕ2œM5‰nnz.¬M«ñA¦Éy*¶ºF”¤51·ª™°Š93”Š­y>Ÿ6Þóž§yóÍ7ùÈ{?Ìž}'KKÝ¢Q;LK\…¾k,äÜg^;&mêH¢†½aäfò»æü}~ÉúJŒïQÉ òÛå7f½9o8’?®Õ^åߺÊÿõ¯ÿ-Çõèu#ÖÖ–K²´8è«TŸTgØóKÓ!B“ºQ‰ô¾ñ+Ú¬”( I PÊEEÚÊT“L)ÆÁŒLeÜÞe82™ŽYß8B«ÓÁo4¡Õ"ó#ZÚ¦qš¢TÇÙ€ â8¶ a`e,ž´ž$aggÀt:`µíq‚# ÎŒ83>AÒOQËpB¡ÝiÒë…|ÿ•£|óyÍ—5ûûñ å.Ÿû O<&Y_?ÍÉS’‹¯½Â_t^áäÑe޲Aºü§|‰#<Ó{”ûÛ' 8$ŸK¯2ÓÂ&z³8Sºª&º¢KÎwŒˆzç[ŸO‹škXÉt¤pb²³e}˜9&rõÂÒ9c{2.\ºÁåï3±{ý½®-®g‰yIbh4­V@«Ý$MS$Šn/$žÍØÛÓ„¾}¾4¶hÇdlçÊ™²üœV=/Î#÷½'ßyžõÓ=ZÍ~k;RØA•²©ä—›¢ðšš´JÐ< ªÖ¹uǰƒ2,]STLÆZœŸ¢ÜÌÒ°ŸÌWRû(?ÃSÚÓVÖ'ëŒjw^ß÷Ù®ÚÚ› |OEÍf“n·Ãr¿ÇöÒ>[Û»lmí1ÞŸ°ÔY!Õ1Ãñ° sÖ±ªÃW5s…:[È’Úú ;àÇ–8æ ÙÄmºš•±Peö\µÅÙ–êê|\W޽†v¿ÁÞÖ>gOßÏ»Èçàm š©X ÇRË›=cæÖª £nûd™¬Ã;uÁêRB˜úµr“ÃôÍ÷2U)»jM§»ÌîîŒ_ºÄ—¿D¿ð{Ÿcds`¾H³Öî÷’Xwp&\…ªÅã¶–Ä2¸ç3¡åJYÕBÔYër×A`m'ÛA`߇ï…~à>“錷a}ÿžëè?9ÊËWyðÁK<üà“4šZ ö†#¾Ö‰Ióò±70Êð§'Ÿãñä!–²^Áª˜'a™9©T9Ϋô˺”è¹âa”ëHÜ<¦Ê ©½®;¡…ÓNUoMÅÂÈÍa”RˆÆ“ˆÏ}ñ‹´ão]½Ú`\Ê‘zd‰&4¬C˜!Æ<¤“¨„N³ Y¦O “X°Úóð„@’¹X½(²»ßx¦˜*8ùŽ“,­ö¬ÓÐBF„©[.ÍéÅ_ùÌ“ÂR,Ò9/ ÍXP¨ó|è|¶?›Æ¼vá)2õŽžû/ 'mEºÙ³–×hC:¶P·t‰vÑŒ©²„+´íTwïx¼ü¹Ÿ£wä8Çû ¦c[ôãø»G‰dŸ»¯ßáî• •’·Ùçûï|Χ¥÷rB º½Ï·f)ãáˆ0”„lÞ1Z[eeqž*;ÓN0œ'RŽÝÜYíf‹gžzŒ°ï¹ðJ­ýbW}"<¸ZÓ3˹2nææÓó0µ8R5o0â^GèúHÄ1«JÏS‰Ì©+Ê ™6F€ L#»‰ G8‡;QÜͼţý‰ï'|ߧѰ„²^·E¯×bskŸÁþˆ¦hÑh6QdL“˜4M*ò°ŠA…óó®~d#+R­ |ú –íjhyv´4Û… ç¬G]|¨ðʪl*ÌqªÕ9г¾B+êñÌãÏrl£E¿oïã*ä<¯®3¸ÍAövå5óµ,ÿˆ›;¡Ût‰…±ŽåFL°ÔK Ù{ɾæ}¶/æ†Õµc|÷{—¸rí6o\úœ?Cn”È©™—úÕ7X‡jQñ«( ó<ø·h6]X}úžt(¢(¼±Aàyš$ÍðÜE*…F{ϳÉ,µÏAà!=IúL§1³ÙŒÑtÂR6Æ¤Š­ý!KÝk+ô=!ñ,f4‹'ܸq›ñxŸ†ÒoZ͈0 ‚€0ô À0ð}0ô ;Š“„ûd‹‡Ž-±Ñiò•G>Çÿvù—yóo?Ïñ5ƒ”V*´ÔíÐÿ^}^³úpŸÎ7š|èÕ'yáÄÆç¦4 ˆÙª<Ë;'OÕÔ¨¹Î,Ÿ%ëJ¶oÖå1“Âê"l“(Qj~!Q…±IÕL¡ŒË“Et¥õØÖdiJ§ì†ôzGùä'þ„~²Ï•+7ˆÇcŒ±©Fa$ÉRCü…ô4Èg­ŒÕ½¡»«£aÂöŒ'XÒ6w)È´AFà’ÙL1ÂHðèÓ:Ç-±(C9·qœóÌÖîÖ ’&*Œ1Î=†4Zn³Yé°­»š=æÓiÌ·oÿÇNýJMIâræ5mg1Ú·O1ÙnÖ÷í¼]J;ô„-ÌØß‚|þcdÉGyê~ɆN¸çÕ7޲Þ:Çþ}¶Þ¸Œ_)ÎëûÍØ.²­¦?'™EÄ,/Yˆ|i¹ô<Ïg<œ`Œ¦Ù™ŽcûºÈ žÍ,¬½5³f'Ææ|¢;ö-ý€'Þyžåv!¡¢î(ÂÏuƒ’ƒôœuÖxÚèSý'sš¡{H®ª6ž…”­â¶QºWé‚-e¥Ãs¦×‰Ÿ8=; R¤–„Iågh©0R—Ä.#jªû·}-)¾/¡¬ÍòRí}vw‡ †cÔLÑ »È¶`4“&q9N3õ}·‘֜ěÙnØ8f·–å‰TÒiÛQH$!H!ÛÙÎÑù¥¦:wÅÿ¡Ópáð7îãœ={ª¸ÍlŸéV‰bɰñ’º6Ï” IÄ¡mõëÀ×t[Y±ËI}?Lçb*ðÒÁÙ±©1;DÑ3˜×圥ªõ+Ia.lƒŠ%^^ø íRhŒ›•:kûx­4ZÛŒÉdÆÒÒ¾øçß oÞ¼¶I:°&ð!M ÍP ¥aolHµ¦ÕAˆšex¡OØ0n«:¤ÜÙœ²7…^×im Œ”_„àù’x’’¤päÌ zÝvû™KÍj^ƒÕE·`Ûƒã¥Y0s¥“ífåY)ÍwÏyÇ\¹Ò“$áöÝ„/?÷î¿ï%âÆsvΜ@аèBƒÛs%%´:¶{c[$§cû¸–¶!!³1 ÷àÊ·gç­_䱟ýuâ™íÄÇû¶¨o˜Ãý ;¯¿…QIÑ(m´ísÞܲG£Û€n/·í„qlc?[-[œÃ0B#™NbÒ4£×õÑ:ek+±¶«Ò~–É6G¥wàfÎyq¸¿Οy€ó?°ÞÊÕŠ8ĶÔ,*™9OËyG°yغ 'ë õ¬np!Q/×yä¢Â©j¤‹Ä;S)ëfùÆY'‡Žíêg~ =…Ô>ƒò3w/–מ…`=ça‘ˆV»ÉÒRÁ`Ìþþýý!ƒá„ÉdFÇë@§R•$ ³x†ÎLÁÀÖÒY•A˜AèøJØ?:° îÄe€O»ÌDèdÞ\A˜³ Í?É‘ã|çÅïðw~é¿äìéc´çü¶çY͇u­fÞÌiÅÀ 1ììö˜s&¯΀Õ嬨™”·÷b_íúåùÇôøö ¯rõê-nÞxþè»k<¤·±ù?qÖ+,bqÖI/*ìÄm! w·‹jЀ!ŽíB/¥DiÔé n¥¬gªï.Îľ2GdÉ2—íg#îÜq÷nÀt[v\˜qbMÐnFDQ×uȾo/öÀ·ÅÞe[¤Ã À,$¥ I‹Û›|÷Ã_æg/ÿ5ž?ñMVŸzŒ¸;Æ—6Ó­Ûosþö>ÕyŽÝÿ$ºý$¿§?Kø”Ï›Á-Þ•=POª]„E8vÉÈ.½t¡¯-:lÆÈR2u€].‚Z©tm‹µ(êYanâ|»«tO­”õsžÆx~“¯|õ»è­ë\yý*j´‹{ 6á&³Ñƒ~ Ć8Õ4A«Y uf[’¨a%tJkv¶'ì í½…çK¢4~ZÈ"$ݽÕeÂÀ+º¹Z ”>xõš “E(+êžíTj‘‡1'•ÌD´õÙÞÄ|ñ‹kt;'8vôßðúV:ƸԞx\"ïžogÑË€n4m7=›BÙ~/ËlÞºÚãö+›“O~ ?¼K»ßÂÑ æ2»ß¿Îx»èhW°¶oÝ„ØX;ÏV×¾îÌÍãÈÚ©.-7h4#2%‰g “IB«!CÃÎVÌdâÖ`mß×ÞÆÚæÐý1nîÓØÊªæ;ô*ÛY{7£R¶µhÓ0ßÑ/š•W¸–WOðÝï]æ?ü¿ÿšþÈ“¬¯l¬=2AY‡°‹£_TpêÃÞ÷†ÆËãæ:h qK¥‘B—»6š0ôÐZÑ“Yf ‹'$i–ÙÙï‘)ï{–<¦TB ”&M¦³ ;ƒ <{ó ý¶?ÿ§¸rçç{ƒ=Ò4ÅHMêtÑ~‘ȳ…:qîwÊuÌÙ¬rÔŒý S…C;¼ñú›<óîwó®GÏÐî´kšçERªƒLëÊ#W•˜º¨;ß茧­EMVµxö,XégžFk îE›¬EnfùsgJqôøCüÖÿù;¤ñ.ç>Ëù3÷‘ I’Õ:æ{i’ß.aö0·áù‚,å¡ýÄB·;+{va>RÙhu×µ)çêe´õ6Æ ´ ÓÈ 3øõ‚Bu×CÅα\`mµ°”Y@DNÆàK—V"ñ|‰'=ß+Š´tìréI:&ëkËÌΧ4 ½Wç\Aà³¼Òw·y5"¬Âø5ƦDéJA©™ˆPì¸MáÁ-ê~~óÌocاR…º«Ð É¯.‚ªW¹Ö­4*ˈ“Œ8Ѥ™ÏW¾ðô8á­7¯¹¹m™bJK"QüРgŠ@Ú°ŠñT#=§5QÓÇó„s ÓloÅ쌬¡‰1v›bÿ7ø¾À$©†0”V¿Ûˆˆ¢!ç!˪až«‹]¼§}²0vá!pö¢;尿綸y\f·Ýâ<ŽÛåö/pë–Ïî^‹÷3Üû1üÍ-²oõ/ÑZ¾ÀlZžÖ™ öïø\ù)’Éű§­gŒ÷)lÔ•Œ›½«¤»b­ˆÜrß[ÄïnÚn½Û„vËò¦V‰CB¯«ëÖÓ3IãQB+š‘&Œ{1ÓQi9™ÀŽ“T)`ó…{¢J9Õ̉s'îãÜ;ŽÓj5 |¯ì^ÅAqÓÛ¥tt®,C4¨õɇmÕL ²6sîƒ6&f. ƒ9õ¢éøb³ªô¥.ƒ)%L­õ1•V̱ÃKÇ,˜‚˜Zy }…1ÏH”Tˆ@áû–[£µ!ëjTfIžÓYÂh4f0±»7dwwÀt–°Ô^i˜Äc&K’PL3ë×Ðöl‡'e6ufÊ­J>EËœbÁ8oý‡Ï<ÌÖö]~üGßÏÑ£+4¢`!ì¼Ð˜iÎ,©~,J|$ØÚu¦D,dÅŒÄ*ƒ¬”:­ô€ñÈ"W°y÷1ß“ÄZò…ç¾Î+/òGŸúü­ŸÿÞý˜M•Jƒ„ É‚„zJÛáö óá‹:ßÃ`ï{-_÷’gÙëÍuЖàPñEÂÂØÒ-­DñoŒe±f©reP¼‚¡ôí•"mÙáÒe‘ºÝ°x2×V{µþ±°’À·³V{íÞΣ/­g°í¾›­†ý™  ˜¯S¹€ìHÔÔ¾gç¡•«uÍf®J„ÒzAŠË\ÌMîùÉ?FMS.]¾L 4FX¨ÔK%˜$¶@iÙn>g"N3kêÐŒ í‚–ouÏÀd”²»—1K-«X+ {iAI2 Aši¤gE”Òó*.P‹= Di"/3Ïq?rô¢²C¾;cÑ”[%U4Ó¹z~íø¾G„4ŽlÌ'ìî}’ýý=®^}”Á3Œn|Œm>LçÄÿL³ý'x“€ØÄx+3„Ëc¾ýêC ®ÿ2Kü]Òxf5ÔØ@3´ >[\Ml²—Rp¼iyA7nA¢¡Û±sæVËŽ"”¶…ºÙ†µõ6~ÇŠéT3™¤¾¢Ùôm Ö¾!S¶ŸNa0„=+ƒ¦'¡ÀxV’Âw5Òã½Ï´Ç_\°©th‚‚Â)äY¶”¢žPÕJkm×G…Fûq‰š¹…¶1mƒ€8š =—ÎZ¹j§£Yêw˜®,±6³·;`{oÀî΀ÑhB+ìÐÛèqgë¶û„𨳳è@A m±ŽµÝéÊü>?z*.?íƒ>ÈÛwùØG?ÈÙÓ+t;m·/¶Íœ—AcËÙTÖ´²ù­aΈ’[[^­èæ‚ånjçæà‹ºçjÚ””_}ùu~óŸý&ixƒ¨m8zþäkÿ‘¨ÑäüÙ‡ìÈÕË,OšE¾I‡ê›óêãß¾žç¼Þ«3¯þ¾ï;˜:ï,='¥RJ#•BK—èã¡]ب'eA¦È[qOz•ƒ†Kqq™BoÊw]²¬˜Y”tykæÝs^œEn”âÒ¶Ï÷¬} dJ³³“0œØ;K „K3ö¤§šÑ$#j ʨ2çõÐär§-3ß2ç=UȩēÿøeŽŸû¾È¯E_"Ýèa@»Ý ßo³´Ôg´³ÌÊò†ÃÙ4 ?Át÷q6oü?4/…7È&W0+ŸerËgïêßGÊ-’ëH´}«Ë΃ûOìÅpc/ã‘S’›{F°¶››öü,9­j«m»œ4³ìð0„••€V+d:SıaÏÓ²mQ—•bœ'Ïä;«ü„Åì9‡N}Ïéâ÷e^ÈÝ ®Èyæg%‹Y}Xd@쪩ìóÏ'*bÞãj£+;®JÑux¼Êp4CyMýŒç¿¯Ý(A;¢]’¤ŒÆcz½#|óÛ?àÖ՛ܺu—ñhBÚ¹sæ FêBÞ#ß’¸&c…DÓjØ›8K-Äê»]ªçÛ"Ï4Û» ‰³†ŒÀ²Ê– & £X“ešnÇò²Ìà7…;â0=KzÓÆàLÆ.OYÌ,Ò'Èi…€TÝ’Îͪ‹óœ3€…z¾DIïùD^ƒV³A/n2™ÄL§1i6CëçI“¿àæíenßÞ`¸û3°ûkÀŸ×ÅoÐ2°Ö±oÅ305°?Q,·}¢õ×ï(†±æDo…t:c–Li4 ™Vnˆ2³tA¯'é/·™ÎIb2´ÎˆEz ÷SÆcœ7¹•qm ­Û™ÖB»é+ë¯=ud±ØX_徇ع³”5ÛÔjéÒsU³ØµÚèYžƒ6”£nmRþ¶qJx¹ tÊÊOÜÝRL¤>ZÒÿϧnÍOÙå!Zì{EšÑ,×[çG.7Q±¨U)ÁA&3ª¼ä¥DAkÖC{)³æ”0ôi5#ºmk~Òé´¹{w›½­°Cc¹ÁÎþ¶+R€v5ŽóÐr÷°ºžE>ïdplu•»¯½ÊßÿÿŽ3gŽÒl6jÞ‹àäƒ:hQxG”ë–)fõù‘õ¤`s[¸xÈE³ç¼(ZÉêRjÅX¦Š1ü=O²;šñé/}›ñ¯~‹h#!lÁꩊ‹šq¡>Ú&Â}á›F„<óè{1F#µ‡ª6Š]ìv0Ž~ÑRu˜Ôê°ç{;2Y‘íyÒúç–l”©.BèBN•CÑžWÚ]V/ÔjäXO)œé<‹¶|FœÕâñ¦¾{+œlÜBz²ø[T`©â„kŠb^Z²LH)\aD”5ÿ¸bó‘£ fnŽ\l…ʹvá:ì Jæå(TX…Y»8ó‹RítÎöýL¦3¾þ¼Çóßü{× Ü¹úwï ¹µ½OSÀ,£"ͲëÄÃë?€À€×Òô[Ö—yæ 9XhUë ßo‘$š­Í)Ó©a윬´{Ì$Ñ¥HEJºŸFÃw&šµµºßmåØ9GĢ´AÒ˜Ù„0 /X$±Ê‹yu(07T¬}r&¸¨Jw¤“‡x_ùßà…‚F3 Ûm[¤»T¦9~|Âpô&»;/ñÖ5FÃ%¢ð›Lv=2¥=X†ë˜eš3F±¶rÿšÇ‘fwº‹2>ÝæƒçgôÛ{³ÒS„ ë ¶²Ú&Míœ'š4ÍMBkÆ#{Bßê°‡#ØÊÜB,¡ß„½-ÌC§ƒÖÀRg…|ðtº |¯žRu˜ÖØ jr§ZæùÂþ³R MI„45=:E'l¿Ö…nÙÌõ¬uAVUh%k}öÛ©²«˜€¨°Éçv|÷(òæ‡ö«ÇÒêú¥++‹°YÐa+K¢j ñŒ‡¯B¤òð‚” ÐöÛ4 Zí»M6·öÈÃzÿ35e<“¥ÖÎ 4ïœÁrQºM«‘÷,ôÓ'äñóhGèà;gÌ ]œ‹1“-“DU„ïØÝEžsIâ*ÜÄÐCÇ™1F¶1ÂvwšŠ7#Ò#í˜ÇJ[X;˃AŒ$\ºô5^yõ6„øMÿejòÿ!ÖÇñ”õÖΔ% ½ã]ðáÁÁðýGà~¼†¼‰sÅr2ä ðˆv«Çå+ ýzX ·†Ìdä‰fyÖcïrèl(mu?Ý33; ­k…vÙÂHò(fÂ0£$ÿrQ)'Cß“h‘•b]:º)ñ4ÆÓxÆ ¢‹nP›Í:sss,-&ìÚÕ¥µy–õcHÛ\Ü‚zhhÖÛ}Ã@ Ú‰­œzÝçÆýÛ)ƒ~F;nã;S’ÍAˆ/j\»p”®+Þ‹b™Åú³³WX_ߤÝÞFä»ö°oÒïõ•!¨Ìò»VI3»úxç;ÞÁ™gŸà]x ÇŽ$ É»ÞqxÛæ<ë f'z:âØ(eXoï|¬‹i½ m#Ø»+“È ïn) í^Àÿöï—GŸzˆ™=Ös`vÑÆ±Ó ¡P³¸ ©m¸ð¥ï~‹«Wøé÷íx4ÓLE&Í ÓôÍ“äW¯Š19Ûg´YôKæ^y÷Uó=e ÑHwSõ-àí¢Ãª’¬ÓŽÝsÚ©yh-Zv!¸É¸ØKˆaŽp—KYu:C9“cÐÎC61¿´ÂŒ1F¸ðuJ©ÀÐO ƒ.$ÎwOWL Ïa*Fh‹¦`ä 3ÅD`‹˜vÓzž+kãéŠs’jhîþô6šxì§—Þæß€Öhž¤!%SOQ«mó¶wÂÿû{–ü¦·Â¿ü-8v ¼ü,<ü\|ÅJ/‚D5k‚qe-ak[éðjÌ]–@<ÐìšóXZ°É6i/Ç =”0ôH“lôªXrW¢Ì=›Ð#r÷;¬ÁÀT÷ù'x,4·: V?nìó'CX›G/ÐA>š+›¹âîãICZ¯åz="ŠŒ¶©a›½yœry/ê!„ › :ÛšýR3S÷YPiªé)C#´LÚX¥¬,§¬‰ç˜›‹Ø^Ïúv›(¯Óïu‰üM¤L­YÊÀºœ¾ËtNacÛBê8è&†íÌNÏ h-à7ÞÊC+Ôëum& ÄXÜi2ž=.)eeÞ·CFSS÷Š)¾ÌYw&)b‡ß˜ÛŠ‹ Óó´b-F µØÁ,7ébZc8ò5®fÛbʵ]¹Ó™°«;ê¡Ú¨CCù€§uaÎîÆ2FÄ̭sy}ÞVL-hÍF .·0˜Òó}®fM¦ÚØ»¸È©§¿Ï{~üG¹å–#4› K²8!ŽºqU“þª¨d-¡BvBÐëCž g‡:*}•åÔJ¨–²’Df™ô¶ÑR"ä‘ÇŸäáï=Íç¿ü7,ÏÎP[²Ï‚%S=™]é#/}šA>ÙÆ÷l“k4|ïÙÇÙµ°Â{îz©Œ+Q¤ŒV_£`¿ž">É•l+|øqbäÏøvu:P75 “èy¢$„ ½VÍŽÂW2µ+k)‡Y¡eqvз'+šÙ¢(—{‹!Ù«,ÐÞ8ëtœ!ÌŒ´“éWNrkÙ§GØÚhËÜ®ÀÝÄÃÙRŠR eØ™vUP³ƒ\Qµ[[Pù0\£p¾ÒÚîŸã$em½ÍÜÜ>þòÓ•µ.È.¹\…ú“ýGHïZDr;í¾|€·¿ýËìÝÓfižþ¼ò,¬ì…ßüßáäxïOÃÑ£pî9øæg!é’NN{[‘:ø»Œ¶>¿uæ›>YªYm§4>a$Øî(²ºÛݱ‰ñ‘ÚSiF©GÕIøjéåã8Ók™˜ì˜Þ†VªB t`Ãu…Ûu )GÝË*ûnáRÓJÍ0ˆºÝ™9²x^ ­„¡ Ï º‡Are 1ƒŒíœnÏØ(ÉÈzlÏÏX½s­.™™‹¸Ü;M¬¡Ûk¡ÉÙçï£.fi¥çÉ’m$†(´Úì­M¸’Ø÷hÙÁ—[=ËÜ8h{XÙ·—ï8B½¹KX áæ‘®ØQšÄ„ɲjlËDß.FÌ+”ƒ‘Šhtév­Hï¶ÊºhªÍNv㤆bÂTkFÀøIÁ•“dUÓDdb ûÛLÖñï€ÀÅU&qñ:&l1‘I\%,—¶ïiB3j4|üYA8ãӺإu¥C]‡œÑ­Ò'pùâý.ßrïÝă‡o8ÈÊ®ÂЯ«Ûšõÿ5kÛç‘ÁŸ”œ(™%ÖÂz…=à ¶rR3•¹@›Ì2Ü] ¢Mˆ‹ á ßüK KÜ}íí$~2RKª,S’ή6q›ÑîtI ®fbbF o¿ddã!”Fxî2éÏsŸqfõÖ°ÄuC•´”bï+Š"[Læž,™²˜x ’—g-"µ1Èbú.‹ó(Ý^0d §t3"–ŸäÁº#VlLUʪ*ÚeQñÉ.í\ÁPe)Ƙ¬ŒL*EWX…´E….=ic70]iƒRŠ$NÙÚê2¿°Ïüí8{ú~"¬™¾'X^j’¥)Ýì’𼆇Žwñøs‹$ nºÝçý?¹IûJÆåËpéUøÄÞ¿„ën‚7¼îþqص˜3SÏxø«ðØwáɆ:ÀÆE7"V†îv†ê{|„ RCžÃ®•Ų'í{yh×^6œœÇYã9kÓ ò4AâÕÄŒ’Ÿ§ìV‰¬\oˆ*Ô:^$*gÉóþ¹o z6ìçÂ=¼xìÛ‹³#Pf5'YL˜o'ÑfDεó/9yw5ƒWã;ôHÛ¼†ð̼AÚ´ ª±„#Œ€ò>“~Žó®0†n¯¿ ëW.q ¶•w‰DH­£MJ2H¸ýÎÛ8æeÞô¾wó†[–İaÅ/&MÏBÈr]§w$CT# W6†Úò*MÊÑ$2!<æ‰U•ø>,áK_„'Ž?Í7¾óMfAÖláÕ ¶°,£3A& ÒEÀlÑõ„{ÎÜ[Qä·û¾¬¥t†>uÈ•æŸü3òÖÜuç­£w8“V£W§Éì Ð;dVã;èÉÓµá¿úÒ³»Bc ¾ôJÍ­5!eF—¸™|­îYVœ+”?„°‡È¤pvƒÎð]ˆ‰Z7£Mùy‡ˆ(]ÉŠƒ4)±¤º+¯>ìZëŠdjŒ­X™„ë4ª‘jCƶÙ Y6TàDYØT銇÷Ðì_9om£m‚ØÖvÏoòw_ø*Ï<÷ RH ÉÜl…ù&só52“sú½~J–)”·JkßzRðí'ž¾ž›®Yâ¶[_¢§[ü¿ Î<¾×„_øï4ëW×Ý ?ýÏà×~ žzÚ6dð 4kI?'O K{jD¡G ê¡5VÙµgyè%¥c©Û†Î¦©Òe´š×7AO˞Ƽ(X³.gÚƒPFj´ÔÜéIôÌ*T[X`2|O¥´Îj&`œ¼Íó`u ,à ÕäÚ'†~ÏùP¯¹Øaw‰DÌÎ×0xt»¹…âòœÐW¥%bž‚VˆÎáièvº\Ø,‡˜ñú4MN¦c:j@ì íÄê·¿åvæv×mJ•+΢¬f8Ùû– IDAT [Û\eœ69WË™r뙯fP2é'›ä‡&§ì±åeML䛿–Zœ©ûèñWxˆBšÒ¥zÜ­¾‡ò¬!™`{£M;ï¢ò®õ¾ý¾Ç›½£B{kÜqçõÌÏÏLÔÂO’þ3ÆÔv÷–1cVž9išƒ!2ZÝ=ejÒÅÛjfgr¼h¿øâçøÄú‚Ý}„o˜_5°wQ–;£m½Mä׉UßÚ˜Jûh·ûf´;›n_dl¶­¾g¥ŽÒƒ¿ô7\sð‹+sÃ%N5 h‰ëjSðkÊ'°µÇÙÜ#:è‚Qk¬-‹°#§‘Ë‹![³¢?ª ƒb„I=ÂÞ«°«‡¦"¦d;NòY-:¯QS>¬“þ_1ÅC¹ ³)ÆãQ’Z›²?)½°ÍÎlØù‰'JÖªU(H½é)ºd~繢ߑ~gŸ{•§ž~’@zèÜ0¬,Ì1?×`iOÚœ‡fë ^~õ"g/v,éÎ2iÐÞK<{ž=9Ï—¿}€C{jìß#¸ý5Ùbý2<¿÷ûðÌ øÿOkEi†ÄG64465žÒøT_!–Bú½Oj´V[ìß¿ÂPKbÏ‹ïv½H9EO+¦ßi“ýãtÉ«„¨-F¢¼¼ÌfL˜â'ÿâ=Ìòœ~³qy­3gÈ»Ûv áò– ºhm[¿€þÀà¨;ãš#Ɇ5'iÌx¾ÇæfNœZKáu®ó²³úti `k-ÃZjМa¨ÉJÖ<ŸŽËY Ï×äð¡½4¡…¶ Æ­;ßñiZŽM¥ÞõT•© Q¦@’”8II“ ­¢½Í×û1)pX.ç•F;{«‚h*©ËFN AøxZæN_"tuã;ÂÔ®r¶'OÌL)ØrJÁ×GOa’"^Ç}5RÚdh½º¶+Ã"õ.I26·;¬_h±–lã;r Ôë†8³ÖÀÉî>í˼ÿ½?ÃÞ½KD.^t|¨'‰U›Òš¸2ð“U×5)W­âE ÆÌD†^ÛRH‚У“œâ/>÷~áÏYדּ°ßÝ‘9eÀ¢sú´ûf´ÌhóäÄ 5R;/ÇË0^ÑĸøNwå ã,Òú„¼:ô½„O}éïø•Ÿÿy2•ï`°O³cߨ]í㦑Ǧ9W?Þ/:S)²¦Òq°¯cÚÊ ¨Tì¨j†ÇãÃÜÞÁh1XÚÊQˆ0‰(£Ý Ö¤Ô’ñLÑáL²jÍFb“Ø  6#‰!­ÍœþÀѤãGhc¡K“Û³øv’î÷`­g¯ì'ŸÙÖ1]“¹êÐÍâ 7_ÇlØDøNkïH[¼ÆT|µg&ü^õßuåŽÈ3«ÙOâŒ$±ñ˜$)'ÝŸ¹â¦ü—#Úd¹%4•"ƒtÀ–‚7ž8ÃǾü(ß¿ý>õÀýDY>vŽFS¯Êù׌BÇ;aÈqï´IÅvZQ7¯³èþÿ…À'-!vúaƒ!Ms¶:]ú«)«—ÖÊM®²ìÛ·D†Ç­÷Ýϱ£ËÌÏÍŒ¤BMRÂŒOÑÕÜ*Š–rh©|¯­-MšÉ)$«!÷¨¹ðŸþôÿâË_ùÝ9A ΆÔ5ª`ýð‚¨æL}¤-Ô}±ÎA…–^³ß—€†­–ÖÖÉ/Ó¶i [à1Ö?À“6H¤Þ„ãç_äÉ'_ä o¼¾D6‡a!b„ðz§æ«ÈÄ(—vd»W K/nmlÔŸ.ô»UOc)-äYy“ÆÓoªRŠ ¹²Âf¬mv8{•¾FÄ=z²âmdFSu¯1²?«Ä† w'nBÖ£N8†¦îU"Lj=Ɉ‹ŽäÛ@Ñ‚R¤¼”¯“s¹²ß“(ƒY î]ž)gœŸ¡L—O|‹ëŽîåÜ«kt’ynÍBzqŠ$ƒ6·RÏà <„ ˜iÔÙìwY\j°kï ³:«Ûln¤¬n~8ŒI?‹û\Z?Ág¿)øÌçŽrôÆ.×ìWüýßÿ $o$ைñ®NñÛÿŽÞ_> ßþ<\x¾ñexé„!Ë!QÐlF%Â^î[kL‘—œaôë£AŽ%^•^†‘¸Í‰^µÈä¤,pƒ©°Ç'?5¦à=hËÀWJÇ)›œ}î­ÓgPÒ>ô¾K½’–g}Ò^ŽÑvjޤmrjáNÃØ‹ ÑØÞNéôlçaðë>Y*ˆ|M[ˆ;ò-¤çIèÆÖÊs—°Âî“Ê¿àØ{¨¯È|!ÊMƒ…ö‹†WŒéŸÍ-4\Ýåz<Ö®ÙTJ‘eIjW/žÖˆÀ'Êr<à0ˆc©·¶h-ÎC¨Ò¥Ð)ןºÀÿþÛü-píŽóÏpœîü ú+'̲R<%†Î@Câ¦û~ò —ÖÙÞÚEš†!Æ­V®ÖºLƒËÇmm ¯Î1}‘põ‚.ª Ú+M¯? µ¾Å©“§èá"F…HMs¨G’½Çn`ýÒ®»å0ûöî*¡íIê–ê}Zå’\Xù…¿À aþ³—v@­-ÁK+Ûüã$SAÍxí²±£2ÙǹPV!b,c{è¿<4+Ébˆ=»ö¤°s‡V‰Ü’6ÿîÛ_â†›Ž”ºpY©?ZOϦ9OÛ9×Î4ÑÊxñ÷…x®‹/§éª–ÑLè¶*ÅUV÷ BNØN ¡m)*ŸCÚ¦ êV]°w_£/ÚÕQª…zgçѽóÐíwäÏ‘.…©$¥Ë/YåÂ%ÅTšŠQXÈNÌÚ ƒÓ¥”äJ‘å9½^JœIžüî·¨{>ƒLc´ ÉŒµwÌí­.Y–33×$ðì®N‘“¨Œ¸—0øžG3˜!K Ýö€ÖÚy's3¿J–If öíŸåÅ“WHfNqöœ¾(@ü/Ð| ýü>üSŠ—_®sæÅ§ð›ÿUÊo‚wüü·¿o¸ {~å—`ïžwvl¶³öóʹ¨l9wÜMbò gOV§Ây81;*(‰)ØãžBÛbzƒ \"Y¡?ïõc.ž¹Àé'žÄèŒÜý(BYÒ‰ð ù,Ô=FY­rh¨ûaFé¦hi§€AœÑíù¤4"ƒZ)—Ñ)Hƒ/íåQoXǰvß"M\Þt`wsÚé¸óŽ›8rÍ~jQ„ñ4™HÊR,„ LêäžôÌý|ørša3=mS;s7µš±6r4­ªjT1rÓï€ÁÅ„â®Ù™=éUÓ¯g‘[&u§´ÛÛl_îÓél¡²`ÏLaI¿°¸À«Ï?LJþÉ/pý ©×k%“zÒÝ9é±(ÞK»¿u:heFÌ4ÝÛê€aèaQÜÕFƒ¾Ä¿ùíßb-=ˆ4ÍE[$=GÞÒn?¬”•H)† †Ôé9‹b7ïtÌ€YožMÚH1ì㵋nÙž[—5Ó2¹}Òž'2¼Ò½Ìé“ç¹áæ#˜‘â9Ú$Mʉž¶“'‚U§å×›3í¦çË¡x<±Ä4á]T¬Ø„ƒsˇÄýcÞ®~u ²È¥Øan`ÿØÎ•i¢ã°LUÃ7ÂÒv¬Öàõ;NB›R]Â7e$YUk[)Ò#Ó´QˆEºˆ¤TʉGŠ‹Á]0Î#j<þ‡É€ØhÚÛ=ºýÄFÜIÒš´ŸÇ[µ(¤V ð|‰ÖöÒÆ°¹÷.“d9îÍdù/Ò¨ÿ!¾çÓ¨,ÎÏàŸ}»fl •Ñ\iuÙŠ3tø(~ø(_|ö€Ý»ÜûãpW}¾úéËôÚ‚‡‚sç üIØà%^:sîì~Ξ8L&u%£2iS¹õͨö8yŒêÇL1ÂHƒ,|̾òí¼bÞ_åJŒè¤Ý¯*WÄIÊÖvã?K÷â9šuA4/ét5ÛƒRÐŒ`12ÌÔ%~î£"ÀæFÒ·ÅÜl±Žcûž‡>H¡‰ÂÀz  Húy φ‘…Å7ZÖý-pûÅFSÐÍ ¾ouêÊÀLpìÚƒÌÌ4œ9PÙù»Ê9ºÖÕOÈ\:M³D{ ©ÊS#’ÄäB=®– 5ÌEøôlŽïyî‘dZS[ksmœò÷ÿIàsö 7ÑØØdùÜ*GNžãƒO¿D67Ãñc‡¬,² ¬aS¹æÜäí¹¢!Ýý¤t%R5Û] ÓÝdeþ)zÝÃüñîã¯g/pÍ‘SÜõ¦çYX¨3ÛœçÔ©cl¶—X½²ˆÀÃ÷s½²LŒ"†ròö~Z5¯Ëî¹¸Š¦ºzZD §Óí²¶Öfõìº:+cFk¾:s 3¡Çþc75›:²‹åÅù×t Þ·ºbciÜ$Z½Ë†a@Æ=ÖIí­ÑxïÞ½œUœ“á^zlB,þ{l’-.ß!¼=Ôû!¥á |_Mõuµ‘¦Æ‹öä©ZŒì®K=2zgqvÓ-€ª˜°TßGR`Ôx:–{´®µqßQJsŸ]îl–ålmuÂYùÆc\<­íå$©KŒq»!I•-èi’’f.ð W€”ÉÄcfÉò²¼ôäÙ3¤  ½v¥,ÌÌ27ÛÀ­ï!ˆBŸ³Ûl´2Ú[ðô‹ðÐðkyëÀon¾N??Ë/~$¥¶òOÿù%xàUþb탨nѱl'êRMžšŽøMßOßUÛNK銳Ó;K1ªs®Ð' L$WŠ^oÀÚZ›g}Óß"òmqÁlÓg¶)ɳ„A_SIMè Lä‘´ùÓ–­ÔŠ ÍN i*‘¾O ìåïyáù ?Pä©3#É`aÁNƒÌíʜϺvšB{Ñ@c¦Éòòa ½ŠêbÌüÀÈEj›ìŠÞ6P5%Æ# cç¨*0bœ&5Êi …”#$¾' ƒæÎVU’e9¢µÉ›_=ÇK÷Ý?S'òl“ ë5Ú{WXMR¾•¦,ºHxþ2‡ž|®“nÀÂ}w`‰ÍYwÏW®†M7ÆÐ$üö§¾ÆÉ=ÎýëŸÿÞQ«e$ƒƒ6#ÉRËÛØ÷,3³sÛm†w¾[Ðïâ™§Žqòä5„!6‚UTôüBN˜€G4ÅÔÍŽ [¼Î}tñjmèÇ ­Ö6ñÙ˜îFiLb¡m¤µù¾ëíïæûßùüG纣û¨ÕÂvžúÕïb<>²œ”ªG»êQ'¬mŒO«««<øàƒÜpà \Ü<Áâ~Ût¦ªÒ[»Â›Ç6×<ëÛâ\lı \^`×DÒ³MiI¢:j‹…ÔÄ¥ÓÑöódY!ǵŷ¯RîmP©e}+,dœ];PÞ²4Ò#㢓ñôªjQ.ÀI^ÝãT_Tµ¼c¦“ˆX;¥Ur¤«×í §ï¡ñÈNèƽZ'™·OÔÕ_G5Ð ÷È•¦èþ&ïž‹¨G*ä²âUȩԘqÚ¡¡<²DJS\­-3xss›\<üðc<ñØcø¾ %±ZR+Uñ¥ ˆBd²€%Š â„4ÍÈÒe ‘/- äû ÷pyí'Ù»;æÀ¾s¬¯Ï±Ýé“f9“1È{ôû­„ .YœŸev¦F­áÓï'Üp¬Éñ—Y®×˜­‡œ_ÝæûOÀÃj…¯> ·ÝÚá7ÿ¼ðx“$móÌ3w°¾Ñl¦ã£?ÊS×JO»,®*5ÝÙv&#Ewïg‘…Ù¥cÞVÍ0ª¡% U–çt{.]¸Â+O<ý-BÏnê¡@x¾+œ’fM`2Kó¥å:{ž!ÍF¸â@ú¶4Ú¦†yÂP™½„[¯{¾r~êij§­!I Ch,Œmwu“Ù³™¹ è]+‹Ôëaéq_4#¥ÿ´¨¢KC4C[ÌS/¶šñ²# ÚÏÊ=´czWeMU—k»Ûó¥,S)M2²4ãšWαwižS‡ö2ãr‡íå¯QÊ„~°yãIÊ+Ý>‹ím–:=dk•¤ìöb.\Xeue‘LJd®PNÎ¥”¢Ñ‹ù/¾ú]î÷™97üR{øsþøç~ŒÍù9 ríœÎÖ}l¬kNŸlcÄ:3Í Ž^û=>ðc_G«%N¾r-Y¶„VMÎ[& ¬-dár5DÉŠË\OPk‹ ;ëI[}1uz.Í$µÞë«›\X}•Ì¡*MG ó|翾0dzO=ÃÛx/wÜy=33ׄ¶Ë{‹q§+3dkWMI*k¯o³¨«ŸëðáÃÜrË-ìÛ»Ÿ/[i™×¨>Θ¬D€tnSãJ©¯ctkw˜}a›ÝTÙ¯»½Ýe+Ù¦„h¡†-—™d„5 Õ½ºågõóŒÏU’Xõãý‘âvæÈèã(ÊóU»ì…(J˜QNôV®v Cñú$(aüCæC–Ý$¢X!/qiU8w£±‚<ú :ÏaaƬ߆E¾,¾f¸»bL¦PíF,E©6 Ö¤Óé#Dã/¼Ê7¾þ-´Òe3cw*†ÀÌÍ5˜Ÿ£Ù¬Ûßp»¨8Îèub®¬µÜnÛ ýåå%^>õvöí™çÎ[?Ikkôºƒ!íÅhY¶2Û’Íõ>AàS¯GÔgféu3n½ñ5¿F¦3öî_àÊå/Üàì«pÖÀS/ÁŸ¼ãMøõ_ÿ'q×ëqóÍǹñ†ïct „Wá3˜‘P‹É;h§‰Ð£¡ÓXÝ wb^’û™u-3åæe:Wײ\Ñé ¸|y=…Èzxꑵ lÖ Ï õš%0E¾!÷-„íy…6:%Í¡Qw{µ`Ô¨'ðü0ÄHïi ´‡x¨\¸õǰó  ½å& ç±ÃU~œ¯ö;î¾¥ÜûU5Ï¢²U(*¤è"¾±0Å0ºl^¥òH‚~©õSf@[n ?oJ•{‘ïF¶‘Ì”b×ù+|l«ËýÜ1øR–‰cƀΕk. dYÌ4èÕ#:zBÛg÷Ú&òÙ—Ùýä‹ü°¬ÙϧßtÛ¡È­ ⚯?Æw·:(àp!çKVóŠT=M`|¢Ð>G¹Þ‹ÊWȳŒãϧ<óTNT;ƒRçÉòÇyÛÛÿìW ßýν¼ðü1²,°á ž*Ê‚*ÌØÎújúç×25q ¥èõbÖÖÛ Îôèf¶"6±ŽaAäl.38xìV²<åàÍ×°{e‘0 ^£8WïµÂU± ºêR ]î  „ÐIr×Z²bÓiÏ€RŠ#GŽp`ÿAN<øŒo‹xA3@Ú³SsTƒ°n'e#\Ô­Ó=«ÌNØEðEÝ+;Ik[¨•ÎYd‰VÒÇ–Rì«‹ý¶Röß=a›ê ›©Ž±EÜd¥B”î GÓ«£¥b¸3;Ì\†“³˜iO³o˜cOÙÕ÷'™¥—þÜ4r;tbEîMe²­NÞ£¯ µL‚±Ç÷â“ ùðÝÆD)u3!©H«ªÚÏ¡§a.ð¾ î5(¡Ø53ªÊhL¹7ë÷ú ç/®óÙOž<Íœ~·jƒ(ñ‚KK‹80Oc6*“–ÝŒM= §{Ö2AìYirúü}øþ›¹ûÖOb´`°Õg0H­Š2Ô} ”¤™&Ë4ƒT¹W%eÐK »>AÍ#í¢H‘™Üî½[jJ"}Aœ)üDà°¾®ùë¿»@°ü«dýÛ9qú('^¹øŸ¸ùÆç8p`ƒ]»6¹öèh¡TXZ¾N^ÖTvůqŸÙ„·ŒÆ2—=C×Ƀ¯”X1,L×¹E{*$¾³ÄõÝN;^œãÑ[®E$ž¾Àòå nüÌCL3^8¸—ÍÝ‹è4ãYG,Ë€]À«@–¦¤YJªr<)ÉLF(láŠü-=LPW5ïšÝFš Æç]äk_Ù`Ïþç¸éÆï1Ûl¢õn”ÚÃÌŒFJŸÕÕEN¾º ÐHiÜKm^Cfe^ødh±9HRÚ›[´N·¹´q²œ}Ü™ó쟾þÖ7pyõ2÷}à}ÜzãAfšu—BÈÔ8IK´ctï\8†•û}]¼‡Îí›Û‚<¿bB%] ÑîÝ+|ú³Ÿâƒ?üa>õ¥?Ås1©yì¦Ø šó54ï;¢˜+\²˜ ÝLgp:fm=éS·«Xcƒy¹È6m|I8dš»¨ÝÜ}~9ŒæÔ®üÿæ—‘•¥E2•á)åånà6Lflå9 ŸÄâ®NÆãsÊ4ž_µœ~f G¯»[ºP„ñ¢\-Ì`­éƸI¹Í“º½IÐö$ƒ’¡4`”Ü0N"Ú±·.5U¸gK5R„˃^ÐôУJ¦Ñº‹ $q’Ñé&tû†O>øYâ¸_¾N' S–>ï3H ^˜ã{‚l IE¿ßg»;@)…ô|f›5Î_º•Þà>ÞqÏgÈ“5Î\Ø`­µEâìD}_øö¢®ÕžÀ(Cš*ÒLÇ)qš#»O ¾}èòL¡2Mx  ç§+¸ñè.²,e³ÛE;ÄfçYâôs`~›ξ‰^½¡ÞB­öÜ|ãIÞý>Öu„ð£Ð >ͲgâugÚh| hAôClí1è(ægiPÒ²˜•²Ò¶õõ6¯>}œ|kÙ†¤B–i2e0_àöµ+š® °“²çI”V¤™! m1•® Z‹WAÙÖÝô :×¥z,ŒòTc„(aî8±]~1ŒXG¤0òHµ±9ÐhÔ¹îækË0šRî8M¾VL¾¢‘áž_…HJ¨¡’)ÎÔIaá=P„Ìh£Iºn|üyv;ĉc‡¨‡ÁHJ)Ì%œ'sÕ²Ó+ f¸fÆwßgpÃ5¼t`7nµÈ:}W×¹ý‰Ë(ÇöÎQìU À<õMRßB FÙ_ƒÈzQ×ÃЪK„$ÌsƒQšn†>aäwsÔs ùUŸÀ¹åšÓüß<ÅÞhCiÚmÁ‘£!IrŒ“/_Çê•%<Ï™“N†¸'^³,£ÓéÑZݦuá¼5åpº„zÒË4ËËóÜtëav­,–>ìW+(C·²êÝ…#ÔÚý¾vƒn-([]Q~=)Ï£1|ôÃãø·¿ÆÊâÖ[«rÎì4ëס±hÏ£ÒnÚÍ,ômr{6dÝ2»“ľ¯¾ñÀw oJá£Ò³“¯Û5kåv̺âÏ튾 ôŒB)¸ûÍ·qôÐ>”VH$~æ“ËÌ)“ª„½Ñô¸ËÕ$S“Hb“\Ī¿úžç$“ŒîÇ¿˜©x² oõÐ eR;™‰“Šë8T=‰6î±=iÿ<šQÊ0$¾Ô4±ñJg±"Œn(ÛÑ#£òØ>º¢ ׎Ímª&‚ Ã]”Æâ8¡ÝÞÆˆ:Ÿù›t¶ˆÏm|Aš›2†S èÅÁ 'N2+·Js:N¥ìª‡’nÿ­­¸ùÈã úÇ9¹Ög«Û'WÆÆtú’™z@xx¡G£QB„6ôû [ÝýAJ’+”1(e§ &²î“YnP¦H8tZ1K{šQ@šæ¬^Zs7oüo å70¬0PGyâ©÷óÄS?ÃÒ⎹Äu׾ž½§i6·1:DkÂL1v‰U"*‹ËÄÏ”Pz àTÿËõEÖúìm,s)»BC%Ž3”Ñ4ƒ:ñ g­µÉËO>él0[·ûå,Sı@áƒÐ%ÙÑ$I_¡°Ú÷¬ä¢Û³1‘º½| ~h-sÏ#ˆœÅ¡ÊI’Œ<3øA@­Æ3ÿ IDATzÀhAèIúF‘\«.IÞQÍYÝSÒc8|h/ 3vBªîÙÇÙéN»Ÿç–ç.™âYÑÖY%÷³!³“˜èË%Æ¢AÕZÓK2v=ÿ oÍr>ÿ]f•!¥#’ŠRÂ(…³6ÂXåΠVšA³=è’ª„x²ÙéÐînÓên“årû£|}Ið/Z†z§ìWöï‡ín†tP©œ±Õ;U =} Œ›à€À]¼¹ýD!e2$ÿ <¼jxø+ðË¿ wÜ¿õ»†c‡Ž^sœ·Ýwœ›n]`×ò,§Neõò.,a¨õ×cÒ®ëºAœ²ÞÚ¤s©i\ÞRn'+mG²røz[k¼çÃÿ˜½{©×jSÖŒãZï0$),«¦$%Ši¡éÆÆTƒ/D¥P <Ï#Ï3þáOýS^:ÿ]üû¿$pdX¥ç9I”ƒêµ“‚I(ÕZØm b'Ï’ö9gï ¤t©3Ãv²m‰bÙLU®ð{ " }ߨ·g‰zËÝüÈ{ßÌ…Ù!Ž;vУþÚ;“_Ë=lü÷´žîÛTʬª ¾aQ¬î@ôa¬ÚE˜©¢í2˳2ÙNsÇ™$¥2“ØÓ öÑoõÎj…:“MÚ= t‹ Sr†7Ê ºÌ1npRmniªð}Á¾ÝóÔ>.µ¨5²èû­ü ­çîçÉ'߉”ïcee;Þø%n»õ[n.ðÊP3¾Š6ÃYK»´¬\d(£lqMδϣÍ@ÅœJ/°§¾‹gVO¨„ÛWn"ÝÒ\Ü^å•ÇŸEÆmj!4BH嘤’HBÏê”ë¡´fýÛ9If¨G6UiAw`ÏG’A³árБd‰¦Ñ(¤ŠLÛùZz~ ‰çövJ[GKÆl€ÉRÒ¶F ff=¤/Q:§Û7¤À ·^G„-ïäg#Irâäq>ô¡Ó´Z×qòä16[‹HϾ°QV'b÷Œ0 “_E½;"ˆ+íq5i–¡V7¸í¥Ó|õCïB7jøîÙ("'Ë mEÂ(¥M­“J²™lóâ…“\Þ¼Bœdd žA¹éË(û·pä‘ ~®k¸í6Á¯¯GÞ=K§py¦Žî'\ÓÚ"Z 9wz“¼«©ã“E”ûÔkÆXzJffjôú ›iLØ—džb¹Þ O‘Å]´6z´]fçáã_û58}N_€ÚàO>K3›¼ãþMî»ç÷Ü+ùØ1h·òWq/Ýn“ ÐŽ%.¦º£HR«òغÔãÒÙWðË¿Ë.pIMõЧ¾´Ìõ÷ÜÃÞ=u–ç†)f†›Ñð aŠR©f™âáPʽrÁæ–ñ¬¨Ú;07®»öŸûâ_ñ#ÿàGùÊ·þ¯náÝ ´Ïo®íÏ¢ (i‰‘fà¢n]D´Ø" îWÊzÈ¢YÍŒ÷$ƒL—ndÅ®Ú7e0íY>väÿÉ暃{ DˆdA ¾5õ‘cƒåx¼ñøžy<óg’1âxßSO’dùã$¬Ñ"½Sæ4 z/ÂUOìê”;iw|µÝòø”K7=Þñ¶÷ðâ3ßç­ïû!Ž\s $†U§õIEº€lK$°o›’0Úˆ )ØÚfŒ«nªb YœËùµüqþà¯>Ëò®úª[îÌE9ä9%’a¤c|»½tñWàWL?Œ%}man£àt¼Îno7ô UÁŽÌm3×õá–›ŽñÀ;ïç®ÛoÁ$î>7š,Ї,|#Ê!¤h^ÆëÙ0zÓŒ4*ãÒ«inc“x²“6Sþø›÷Z$¬iæêÓö“&àI¦#Å$<ícvN¬ãÅ›‡¤X»˜ü&5•‰¡*¥RJ•F!à/ v‰š¡è¤øU®†r3÷:u:=z½Œã/žbãÒiZAåš4Íèv{ â”ÄOÉ2Ê•ÝEK‰4 ©S²6·2’,·^±å¦ˆÓÇ÷öÿš4÷Zâ a}gÔÃf=b×Ò<{v-†ÒíÄ%ƒ ’ÌŠ:É £ßékÍ ×D‘O!hÔkx5D)RŠ´ÊIóŒÞ %× _Jtf=ÁB³ÁÒü s‹{\^¬,-Ðnwç6¸²ã%`d† ^ÿU¨…\ N¯ÝÍé3ïgmãZþûßøwtÚ‡xé…ë‰B;aQ1 ÈÈHu†IàJ¶FÜN¹¼½Æ*— ‚€x3SŸã@¸—•`Ñ Yí\ä¥'è·X˜•D¾ÆÃHˆ€^?a®iQ펦ÓɬpC ´dúIV>ü„'IbÃLC¢0 ú Ï7Dž‡Ä³k4¾–´D¥¾f+†prmCd¤/PÆޤgó¦ãXøpË7ø¸¸ˆáž¥nŠðá–[öòå/þðâ )i¦¡‘¹çßGÐÚJ˜É›í³t{1‡¯Ñ\wüá'<–<_²gq‘$K9°«aYÿ‘Ï N¹´špñ <ô]ø¿ÿf›pÏí'yÛ½'y÷»ï~¯¤Ýº–o|ãF._Z¶.uΡ½Ùáòùu²þ:´ìeS`LÒþ½°°Ì O|‡ýâ/qôÈ^Zɨ¶o™ºã.uÍ•ñ­†QplŠ ÚÈsI &º:Z¸ÛskI-Ê©‡ ×^sˆûï¾à•Œ§^þV¹G. ¢ Ù•rE+°²ðævnc†¡‰ rÆ$YbI•bŸT§˜ÜBÚÊ@cO“ùó?Íõ×&0>¦ ya½D!1$Ù6B´yç»ÿgþøO o¹ç"7Ýö=Tv­öÐnïc}}žº©£¼f Øl£úš+[-.éU‚4Θ›c‘Ep¡}…üÊYÖΜ¢žõ¨GMäT]ýº™$Çc£Ûg÷‚}®´s’Ø" M@zô’8Uå%f}¹I¬iÖ-zÒr­© ïèÌBdAÍ·Ó´›ºÝ”VÇ0ȱð¹Ö„ÂÓ„oB[øóL[Æl°¸¼Pîž©x&—Ï™6ôû1gÎ>Ƈ?ó½ï¼Ÿùù­ÇRÎ1ý·“Ú<ýÔ9ñyn¹åI–"¤Ø‡ÖPù[[ûBYv²˜žd9\ºÂ»ž9ÁsÜOÍóì„å¦å,N¹ØZãÌê.´Vi·¶IcƒŸƒÈFÀ|½†ÒŠ[nÞCž+õ¥àÐî.ßB—vQöœ·9Ýpó5ð³/FìkôIzÒ·Ü¿X3Cž*„¶n h’$sžÝIÆv’±ÙîÙKד„¾‡vÎ*ÏÙÜê‚0ÌÌÂ0>¤Ý6ø¾µtÛ¸¼Åì\ƒ] ÌÍ5¨×}V76A­(àÒz—Ͷá«ß‚¯>¿ó ‡÷)îºãeîË˼õ>Ÿ<ÛÇúÆ ?x|†Ëg»¬¿¼AÍ1˜«ð¶ôìTxÝíw LÂìR“½û¬ß¶t±Á¯Uœ©Zã–ÜWŒµa$a[H¤0´·dI2,îûBg-¥çàm[Üæš±M%Óšûß|'g.¶Ø·çU.\¾P²uaâØÔÚyqgûYì“ ÈZT¬ùµª8)‹ë”ÝþnV“+`nažýà{yÛ½wá…ÖÃ@KM%ö.¿*j˜Ñ=ü•ëàj$èÐ6V\•çúz²¡ ‚¶?ͯº:Ù^­@N’iM+´Ó¥Q“‹÷4–÷8S¼üÿ†×2ÌÐ9¬4)™2}W; # [NûØË´’+­‡’]£íïç¹™äó<ãÙçš<õÌÍÜtÓWyä›_gi¾ÉÒb“f#@éœÞ@1è¥d©"KsGš)o4ƒÜêc‹ÐZ ɵ!—Š8¹¥?Ælã?€é`JƒzA¦ B›ö’ŠBz’çŠ$6d*#‰µ^fá4¥ì.ZV¦„4}Ï£ùìZh°{i<ëÛ®ÐÖÿ;˜i„øZ²Þo‘{’,W â”N?ÁW>ýAÎV+Á—á OO^`ßTªimv¸xÖæïåWõÏùýß70 þÀ>Ào½û·\#×H>ô†‡½Ï¥Ó«±±Ýaukƒ œ'UÂ@T‹ˆÓ«—/qþlCÞnŒ‰i!û¢¾¥ Rhw!É511Ëó’À7ôÛ$-XlHü( ××ô©Ý‰º0 )!‰ s³O :‰&É5¾Q”$@Ï—„‘‡ïùv=‘iÚí„­Øá–B“kIè‚ ²´kÁ ,L,IT‹ÊnµÝ.ž×4Ëhµ×yãgÙl½!êH!œHÒP³Ä‹=jDheuÀÍfÆùs Yž ¸€á”‚ûî‹X˜?Æ™3GÙl[vr¹?u·VЏÓãæï<×æì‘ø¦íÇ1¯\<Í‹§O³Ùë zѳgY+M# ðBA= ©EaTcýrLàK›ý„­vL¿—ÚçÎ!\Y®ù©™?ö¿~”ðè>¾æÉ²8` µÝåË?Ö) ò©ï9ÌP$žà’À÷‰³œcûfYYjð{ðäsgyêä/žÙ$ð$õÀb²¾ßäŽ{[t·çyñø,»–ºtºâX¡TB’*¢8¤·Q«û_së û©×¼@ÐìUí¯±ÞêÒÞÎ DĹsŠã¯æüå§?ç®›ÎñÆ[Îqç‚þ´àÂËš¿ý3xð ömnPÈÿàíï{Ï=÷Þþãâú£»©×¢‘cF­(ÍŽ¸\FÂ8'ÿÙ’@ lñØb«RWœS˺VN£\uØ2Ž`¥Çv˜[?òFÝtƒ[ÃÎ¥1?ùÑå¾»nÇäöœª /-Lì@…G9Q“<ÑÅÍòèt,¦¿ªÅx1¬xûʸÉq8yš&úµ&ãIÓ÷Umå¦H©ªú¤a|¯B2C÷¤ “ÕŒçjÞï„ øØá÷8d|‹ŠŠD–Zh­G´,¬ÝçÌÙË|ëÛ³|ú³aeé(‡öm3W?Näg»›ÐnÅtºöÁîRR¥‡Vw`!Q)Bø’(ðд:‡Iò2Ûø=üÿ²7²ô¼ï:?Ïóîw«µ÷UûnÉ’Y²e;6²­Ä²c''r’ÌÉØ–à aæÀ$8`B›`›{âU¶e[»dkiI½oU]U÷Ö]ÞõYæç½KUW·LS§«»ª«î½õ¾Ïï÷ûþ¾‹|m¼)˾¾€ŠÒ°9RÙã7y–' •r@•W¨Âý O¸}e^Th£gL'\ûÙM’¦G«°w_‡ãg×ùÚ·4_û:t Ÿüo°g÷K<øC/ÑéD\<ßàä9(IN¼`˜k$½‚¸g°eÆR«6çÚi¥›MG4É+Œ`˜¹}X4AXF…Ó€†¾$ ,~à1Ì £´Äól6΄¶Zß“ôKKmF#ò‰Â« U©ð}?ðU¬…,SŒF ¥t.åT®”q à¸@׬q„¬‰h;ßSZ67‡hýmÞü¦køÊ—ÐlÉ.‹×FŠÐ1k°ƒž#bL¥UµHYÞΨZ᳟Y¡ÙºÀ-·¼ÀÜ|“¥½sô²k ˜gýâ"FÃ0/ÙýÜ1ÞZ)þðÍ·s©{‰Õ5ޝœåâ¥.¶¿¯’Ö#núXk }ÏùÒ¨²ŠlX2ëíc´{ÞX‡ ÔÖ HOòþwÞÃÇ~ñƒŽÉ4«ñþ½mïjb¥ ,‡üì½ï½tžOñYzýŒKý ß ˜kÇü¹¯çÎ[†E¥¸ýökùHž³ri“ï»È¿s‚•MËáÃ%¯¿Ûòìc{˜k[²QAèWXí4ÃyY‘wÝïÙ«wÚƒnI…$Í}K‹ì9ÐÁšó\¤E§ÕâÂêBX6ÖR.ö2ý.<ú5hî³ìY²9ï|;üéß³§àËŸ…ó§aít›ã's×›ßȯ¿‘v§…ïÉ©Æ]ˆ™øßé48ŽSÜ2àØÙ¸\»U‚%œé¶‚á¨Îz–bË5•WMÏÒñô<>n•R|äƒóëÿø·8´ç&^8þ¼³ß4ÎÒSÖ†"ãi˜z‚¦†·Ç©WV0É‹¶ D ±€ë÷ e ¬Ï°lpÍ‘[9Ǽôä*|‘»ßt-¢3&S\V˜·ïÓ¯N¬7?[!ðRu·“Ç®ÄöÞ)€C<óضÛuɯqÏ~ÝNŽ^ÛÙßW“U]i~¥ŒíßgKv󌭨Öz"ª·µoïv€ßÎ<þÉ®e6+º6.q…×L—³ÈÝÎzüøªJ±¶¾É¹ =¾þȳ¼ôÒË †×2þ¤8 ¼žëŽüÌ(;Ã(­(«.•!í$ÄàÎ>1 ¤3)"¾ÿêÛh5®c¾õ›ä¥FémìËñMÒYšk¢¬@ú>fƒ…Nƒ¥…FÊR‘寜ºÈÚF¥ÝMÚl6ˆ£Ï÷‰Bß÷ }×!G¡”_ZFYÉù•.÷ŠÕ:î±4% ’8&Ž}ç§[Zº›ƒ‰']ú¤ùÍÁOsォH¾À‹/99Øü|‹f;¦;ìSTš$ôÈJÅ…‘‹¶ÎVó¶á‡ß‡À¡ðÌ·à¿ ­Ä¢6%–Ú°¤Þãel¦®H—FÆùn/µ`˜¹F§{ľŠé f2…ª»Üª†å<Z0—HR-BI–+bßÒI‚ÐGJ+Zó í…˜ ô°Æ²²2äÕã9—°0ï–fìK KòÊb¬ÇÜ‚O NžÎiìÙÃ;ßÿ.´!¶ê™­µ ‡¯¼úüà §NýÖ$Ó¬n a¡Ââ2èsK ‚q>ñUåç²,'Ï £yãé'ù[/ç|ñ=’å¿n9vúÿ\È}ŸxœÏ¼ñ:¾Ø?O–å¨Ê+Ib}âÄÅ_æY‰ïËz*ÑÚPcJiwø 9ÉX—R{–fâ:Xæ¿ó~†»ï¨Yìb*³Vàù’¤!¨²œÁ Â ,ÆXíVNÆXò¼¢ÛðùoçÀR½w`®Ó¤=×&¼ZÑaPJSUŠá¨àÕçybõ³t»yæñ=t{#.^ÜàR·2N–ØJ<”¶Tº–"Ö+0OJÂ( ŠüÈIïZ  ¥[­œïsþ|ŸÀw Ó†@ƒ jù—7] ¼î¿î¾ þþ/枆»_wˆ…ÅžçÏÀ¬³bf•7u(›ei3鞪btY †–õž¬½ ¦°öxjö}Ÿ ÎˆÜµ…zÇáîÄé3<òô1>þùߡʣŒ­½µÝšLrzä`ëñfEà¢WUmukŽ€ùæç|öÌ-áíÞÏ­7½S'.ñÂ…cå¸û-ð‘<@d"TPmu†Üî£q.Öôó[u W[¿^É0ñJîa—êgûÏöj±«ù·þ _{µXÈך´wšÎ·w³°Íö?{NvÒ3Ë;Èô„4-æÖlõ÷¶¸‹ÚÔ¶ÒÊíÿN]ää™u†Ã’•• ¤égÏždssž¼¸ƒ²Úƒ1áI‹/ÿO¼JSÓ} ´bhÇ`…$ˆÜkêa‰¤;A®»Í£»j¬Xv'ÌíŠñ}ªÔœ<ÙçøE‰ Óò¥¥Õð‰„¥ÌÚ J-ˆI«åñêÉŒùÃGxÛ{ßFPcôvF^%.žå oü{÷¼gž¾ÆåQý²ËãkðjNÆ«©±9…Rš²,)Š’,/ÉËŠ›WÖù¥GŸá1àИI¼ 9âcËЈC‚À#Ï·pA yZrüøYZ`ŒÓ'¡GYšº0Œï9G”u|²ÚñNÁ Wü£_ùQ>øà]XB¤ ±¶ÀU£>a`uE–enâ²ÅÔ »v3ZS”Yš²±Þ£¬4$fÏžE:„0 |¿¾f]³_–ŠÕîYþõœäâÚ:g/tYYë‘Õ¤jÆ>¾tä> (íò›uÍnžÀ=稆D†®M-2E‘;Â!ªº!i¶Cr]°°Ø ÈKre5îæ-·ù\ô=¼ñÞ[9|h?q½ö9=)ÐÓŽÙßù¬9‰žáðhe9qÖnÑ;ÏBÚ΃=¨SÌ`ïr:M:ÜvÞÏÿõÏ~‡Î¾ü§?þ·˜Â‚:BUÕNaV8Ù•®í?Jðj“ªþóH4š4—w3·û0žisi°Jé•­1ÚX~ÑçÈ¡½|à¡û™_J¶dG¼V z-«ÔÌI^+ÕêJ—Æž}ü?ÛË}Fwÿ¯6ñþ Ö ¯µË¾’dkö2Û<µ'Ù‚0ÆSô¤3ÜîãSg4oÌg_2ðG‚›À~EáØßÊqíh¦ú&6ûïæÿüG¿Ïçþ[À… )››#ÊJצ>q#$ üX’4<[´Û'Ϭš²*9qfÈ¡Ý-òBÑåø–áõ·ÃMGáŽ; òáO?Ÿø¤ëØu=…·#~1,!ô`¡écÑ K©j½;朣 IDATõŒdUÕƒ¡çvÐÆÀò‚“My5ÝÔ³°¾ ¿þ{nVnÀ±gB.o4|²´âåWúœ¼h "IAJ:Í€Phle°ž /!nxD‘ä•S)»¯¿‘·üнxcïí jSÑíñ)î¿÷¾ÿý»ˆ"1‰µ°¦6åõêUͬ¹É–¦Ö%¯U•"ËrÒ4g4Ê0ƒ”w}ûDY1ìÚÀó8o‡ÿãš&wÞ¸Ujg÷©!ôCt©YYrq¥OYVã¤:µ)‹û)hç”%]AÍ*Ãæ¨šÜg¿ôÑâ/|øÎWÞ ÐÆ« º¾Gž ©Ê ?rßoü¼<9“>„ó·VZS•3ÚèÓ]ßäàá=ìÝ»DD‘+ÔÒs©V†WO]âçÿö±Ö’ç•Kò²Öù D¾k¦ç@ùFY²¬ Í+2­©j'97}Šúq¹ŽOzãG,ꆂØãàE‚X²±Ùga±M»} ééüìÿúsÜróÚí&¾çýO :³’ªñßµ6è-ÔÚ!BÎ^ÔŒR»eï<žšÇ…:„ðØ»œøÚyÔ_áìO∟ý«¿ÁÙõ3\\½8I§Ò¢Þ?ëIþˆÛ‰+ˆÊ%ïY ¡ IDL³³¯s-J ÖÍ~à!I#!ÏGH/@jAU*Ò*gÏ®?÷Óá7Ädо’|wg—«x\%èJ™b«iÉv(ÜwÿÑìy]©˜n‡y·ÃÎÛ1þ+î>w%S’ÓeÐü¸Ït³‘xcÖÞl”Ú•;“º4ž,©-DÍŒÓ8–íØGQJWØ<ßcqaž§ž~?hÐHÚ|ç±çˆ£€Û︋µÕ ºÝ.Í«§þ-y ‚;é oç«O~ŒFìqÝágY^\¡iŸàÙçïÂóóž·þdÊ’W‚8s’n¯Ê |)ðIè9˜°áÉ:‹Z‘Ž*úÃiЉ5†À“[ót„@[çZ-Œ³ ,KwX§!§SÛøÿyÂG>óómâfƒ8ŠœLG¸Éa8ÊôS666'&0’8>À¥ ÷ñ«¿úÇ|÷‘9Œ2`Òú{ºï®*ÅpS“úžï µµ•ŒF#Äó=öìãÒz—ûß°HĬõ69ì-püÕuÎ)9÷*|ÎÀÑ[aÏye¨*MYTH!HNë:J ‚À#Å’ú)Æz½’*³DÆC†Í™WàüYxìYgxh?¼ã^ø¡‡áúëáÄ«ð/ÓâºùOëfßÖ°šqFm’DýRÒ Ý~´ª,Uá"'E ï|¾úG°q‰G÷¤Ï³_ó‰æå’€þY8ö|ûOacteÐu”e©!Í5~P{KÉ(ËÐÊà{Ó5MQ”ô6WøÀ×9uò½ÖiKãÉTPN$*lYMWF;Öõs§_äÌú.ïcF®M”%³ÎãZÏáHu£FÀS¾G¼ž"¬@kK^h0–4¯( 5ág¸\s¤‘$ ÍV‡¹ù&mãï´æ(£?Œrºý!–‰`y¡Áb;Dø!|T•RC¬±¨b„*†Äí6~Ô`2tL\çl=­×4J1 вöÀ—9ßÂ|6Öº„¡zø¾W§Ë9uBÒé4øÜ¿þyþì_ù÷¬m¦.Á+$͈ù… m|é¨Ò°9`¤¡2®ù ŒÅó]D©¸½n¡5FÕÞÿfü#¬E+ÍÚÚµRqÇM÷qøþƒ,,9oƒ©cج¬jÊܾÂe#o³1;EŽÏIV׫-©][‹òÔ”Ä÷-s­¢V½\]2k¬å-o¼‹ÿ÷_ü þâGšÿøñÿ8QU(½5êúkðþ÷¼ƒ›¯;: 刊ZVx-zCò*sÊQ¢´ Zh+ñýõµ‹Tù&TG"ú½.£jDGÌ£D55³ºÂp¹]©t5¸ûrï;#ǺÂÞ)^rû$î_‰Q}yèÅλæíÅw'kÏžôNŸÛÞÑm79™…¸·.Óíeû„Yø$qKl-âf‹½é8ƒ ;o¼$]Íš3˜ñóuI°^ý¼Ç!‹ó `×ò<½Þn¯ÏF·O·Ûg}}“c/¿€ÑpËw±Ùësqå"âÚkŽ’X ŸæÒzUÞB!.ñÄ÷ná‰ïý®;üM–æOÓj^>ý =ù)¬ïaù-NŸ¿“WO)ï ð®¡ÙøM¬ý¬s ò|‰ŽYé¹]ŸQвRãô¹½‘s%ó¤˜ìòÇaaP3©ÄTKnK]\·îy‚b«¹Ôí“Êuî’  ûŽ 9&pø¨J1 ²œ¼RÊ’+…BíHh±ç8eÝ@hé qâ4ü„ή˜A–’ÄO}ï'ÏÀɳðÕïBóàwÂ÷Àm7»Cü[ÀWþΜw»²(¨»ßñ!óâŽcÕÝ÷#pÓõð÷~–šõMh,Ic¬¥å ÃMuaõ <þ5X\‚¥ýš×Àÿ‰Ï}žxD *ƒ/ ^3™Öhc¥9ýá7øÈ‡žzòzÂÐLâM]n…¢¤Ê+rUras•çϼBo8pߣU(çsÝs?Ž£ =©¥96¬Zø ^«±ßƒ?M|R¥ñE—š(ðÈKMQÕè”1øÒ£•x4"Qi‰ã˜ÅÅ6­ND ℯє„Í4'ÍJò¢œè­ myý\â!kY¥®#Ax>Z›m’•©; ­WUrœ=öy› Ézš.†¢ÕnbµeõÒÆÄ6SÖ–¥áIB!)­áWþâ;ø•ü9Z&f _xµ^ݬ)‰’‘ï# ¬(Í`T`Œ%Œ\üfù4’?uBšÁÔrc o6yõ¹§yè¡÷pë­Ghµšnº¯Oü1ùkê)&6ž“Âb§&Åf²¶ƒõ®f”ºP–Fâ e+kª>kå–‚<šk¼™Zr⟿“?ÆNÅ:I>ðÐyøGÞÍ…³Çê=¶Ø2•EEXÆTAñ´³qF ¥Æ7Jk´Ö^ŒïäeÊÚúEb/çÆ#K GšskŠ8t:ûwóío<ÊëヒN¸€ õeöÖcÅÀ´Ül/ÔÓÂzõvv‚Þ9¹ìjq”“ újôNÐÂÔÞ¾wx-C”+yvïÔ l}²õç­Øñ±o—CM!íiîéøšÔcg2¢ÝŸj,£ªI4ã–”ã|*]uX†.–ÕÈ‘u¾ß¾'iϵ8{n…ÕKìõ– ßó!­ÞK‡QÈM×íãŽösa­ ªäjRy¡ïa±x1T­›½”þ ˜4÷Z¢(p&-a€ï{D‘c{B CKZŒ¸î†»Y;qнGp`ÿ2a^î1{²Ík¶¬§dWpçaYίh|ß§Ôƒ4’0pF!*”R;Ö€ñä9×vÅy't{Áž…’­µ:¸›/}õYî|Ý­œ>õò4rTû`ÝPUDÙtÎKiÆ#‰ Ê‹´ƒ«§ˆ|ÃÒ\D+npòlÊB'b×BD^…@éâ(­Ï#_þï}øxU€ö«Ëj‹C¬¶“lM³W$͆ ìôw6)£¸“DšÍâéïþ¾Ý)c;l'ÑöN¿´YØøÁë_Ë…ìj“ö¸ n÷3ITf’Â2óµÂé–­aFNP^X±.&Ä3gb¯œfÓØIçíyS£Yq¾Ýi9}ýK¶ª™²£QÎ`8¢ÛÐë ØØèÓíõéõ†ô)›ý‡f÷î=œ9}Š"Oyó›î!/ ¾õÍïpñRA ËÝX~ ÁI|„#ûåîÛþ£} %2Ö7‡\Úè±9H' Û¤×úÆf# Ýž }(Üj´F+·_ÖÆMqI’Dø~€ð„i”b˜å †9E©ê5„fTüMþå¿ü&¿ö×% J¥±G½ïö}8öYœ‹™_j³´Ü!ô¤‘ë1ÌGôúC.­õ 3¬±T•F)C³aŒu\--²¶Î)Önä‡{Xéš(£©«ÓNX^î&>y•qúÂ:ÃaUOàæ³Þ}/Üý:xÃ=pø0üö?/}ÖMÑoy7¼ámð…ÿÇ^„]-'Áòt=ZóMÖ7 Nž)è¦0RP¡K|t„åŽd®àû0ÌJÀÜ˾ƒ–[oµ<ø ÇÊÊ^>ÿEûÞtšÿ'’Çž¨BO´ÞÔà†?¨ÄÒ(ÇO˜iúçÎwñ… ýBI…5ä+'ï ¤U©( ÍF_ñ 7¤Üñüb;$¬åXŽ@X“Û¤3wñóÇ_bcmƒ$†ùfˆô< 1 íFè£m‚Œ5£áa|2•òÑ¿ðçY^Ú‹ÁLÅÖ?€¬jûÔ{%ƒ’­¶ªÛëže– íyóó»9täÖ×{¼ðâq¾ûÝÇÏ>þöjÅp§â|¥T«+Û+±·_˯ûµDãcøf¶™°3]ˆÑfÛN{ÊzJŠjM®Ñ“}™”r[áf²W¥§Ž[ÎúÎ…LQÄLïÖ´Ä-ÏAk§_ïUGiÎp˜ÒÛ¬§ëî&Ýõ.kk]Í‹‹‹”EJàùÌÍ-°Ñí1èPº »q‰<ßKQÝ…Ò·w³¼PrýáÇÐæ‚ÇXÛèÑë×,Ùú¢ó|çP…!Qì³8ßb¾Ó }ªª"M ò¼ *+²¬$M Œ¶µí ƒõ£0@JJ+FiNVºFÆÐV2*~”[n™cyáßóäc?Ó(Cë¦ÌF#¢ÝŒØ¿w¹…AèØÊ®°ºb8ÈYYéÒÝ¢µf”UÄO’ÄTÚ¸b㉺X+”RÎÍK+Tmh3vI:í&K‹m:í„…Ý ÆS|ÿ…³ìšŸãثؖj)ˆv,©ko‚ÃûáMo€‡ž Â<úøô§]¥c—È (|Ÿ,×dÊ 20R rë2m=çuìKKœxÖP A©äE¨:+\ÃÍûàÈaxà-pÍ ð3?ç¤\¢A'pÊÒBUÒ4'‰}÷Z ÁÆFеßóÃéAà{ÄQD»•… ã ´"/y^qÿ®KÜòµŠï_d]XFYEVµ˜¹§’Ð#ö%ö,ðõÃÚצPBXt %›šù:¦Qùäžäÿùø#|°Ôü-eÔšë? C~ìAï&ˆüÚLÄnQeˆ:…È¥¸¹ûQŒ÷ÌRà 5s[zS¡7mí$ÿXwŸ?ÿýã,//°{Ï"ífB‡„ž‡j˜\”ªøÔš¯=~–¬„B9m^P‡»ˆÚ›£Y]ërúÂe¥RÒn&$qD£ÓlÄìZl‘ÄÁdŸ.ý€ ±È`m•ì}ÜzóQšÍdg;=íL΃˜°§rªÙ°k-•’¬n4]0N†!aè<ý£(šÀÚ¾ïב¹%§NÂã µ”Ü›OÄ­ÙÖÓagzvÛYÎað­o?Çbk/ÝîLp¹döJr(‰ Dyõä þÃï|’¡ê3×p¶±Ò‹éÌÍш5â¤ß²{®E•ù¬õ{\sÃ>þÜOÿ4Ë#V×W9xÝǸÂp¹µQ¸ºÜj: ÛIˆH³Ù¡Ñl±¹9š _Y®X_ëqîüEΟ=ÍóÏO:ä§(µ³ú¼RêÔÕ íö®æj~Ú?èþùÝWÏF©m%z¹ƒÜ3)Îã tRœÇ.9zì–£'¢})@¹¿¸×b–9ɼ+ÅLê•W«˜H<ÏÛb„‚ç9Ë=»5¾LJ×¥&€iZææÛh­É²‚,+èS6{Ö76éölll²±±Éh”²¹9¤ÝpøðÂ0âûߎ»ï~Gäùï?ÇÅsß$-5£ì.¾óÜ=`þ,ž÷ó4â'½Xüz‚ÄaHÒˆ˜ŸoÑnÄtÚ ¾'‘^Bg¬¯;Ïp¬=÷¦Ä:¥*FyEQ™ÚÕmy4”úfæævóK¿ø[üÚÇ<_L¬cO ¬›¼›qD³Ñ¤‘´½_„´‘Oà š& ú¥(҂ͪž¼]!o54‘;€¥ÛbÀó-¹*éõ‡lö3¤5T%µvÙÁÛÆ²´b÷þo¾çzÊTE=y ”ÄhM‰AÅpü´{ä1øÍ¿ñ¿ÃÝGà_ý!xM÷œmAM\q‰~©(c3¥NdF Z BÉ\}¯§ðÁ¼ )½‚í66€µÑˆýómÒMËÊJŸ‡~î¿/`1ö©P(añ}Ÿ¥Åv ŸZ´VHYZ‘eN>f”!}¢ÀÇ÷%AàÑLÚ4’@H²R£•‚*ƒkö9úTÅî…v÷ô¡>ÿôŸÌ³{Q0L ´uÐqàI²a6‘MÕÈ~m¤ã^§$ôñ} Dq@³žÞÚqVp©7¢È+ÀMÙñ¼â]£·~í¾£ì†Q.Q•¢È]s0f™ÜvÃn~ã¯}€0iP”C.­n2·`e„Ádr¶ÖÁ¾”é? ð¤æw?ö0ÿå—ÿ#XnÎ'¾ü·½î€›Nkw;)å‰ÐX$¤‹-B¢äØXC‚ïã ¨*ø“Q'ÕQ3¦©³“†+ˆ£QF# QžFzbÂS±ã)3ðhÇ‚ŸzèFþÅ'ž¦@àùγ]iÒ4çìÊ:ƒ´˜žŠ¢ÄókÂøhcù Åò®Ý¤YÉÍo¸ŸÃÛÌuš.Ål¶üm±.¶✭‡ mìÔ­­.Ò Ã&QM ó¾ÞÎ?Oó½^o}ž¥ÓÔW„¯'â–=î•à^Á\§Í·¿ý4¯»ë~Μz~Küðk¹Q*¯"0?úcïçøKÿ’aZÒˆ<6ûÝaÅá=æ›!ÚXò´bO³I*BÒÂò™¯?K6Lyÿ>@åNº ØÑ^ÚZãSY¡Ø·ïJ74u¤YÅh˜qöÜ k—Ö8uò¯¾zœkZG8[ž" #ô˜Ãd§Èc0ƒâxB—Y^ qôö‚ùZžØWƒ³KÐ+ɦ®ÆÜ¾’«ÙNÅ6vrüÁ˜å9Þ£ÜYh˜NÇÂAÖX‹›à˜Ë§Î¢öìòYÛÐ,ÌI”šj¥Í6§žIêÛ5ÛHRN‚.\#àQÒlÆhÓ¢*ûö.“fÃaN¯7p²­M÷¾ÞØœJW|û‰§¸íÖÛhÆMξø2 û¸ç 7pêôiž}ö7)+6÷2ÊïÞÇ(ßÍBù íöçiÆ/³{¡IäiÅpPRfÊ¥0•u&tm͈Áy‰×]¯'qiEHY‹¬|?ôγü—?:I;¡–~ÕÎIÊ’We5¦˜DªJ9£”ªDZ.Õ˜Œï’ê”#.¹ý£D Ià¹Ýb %vµH’«›Y¦¾–ˆP@Û²qa@XòÊù-÷6S*ãr°•Cú([Qe£!Š·Þv¥ù9VVûDÔª‰»ï‚a^|Òc>¬–„e>Œ(j$GiCâ ¼(pNI#×im$Q@c>¢ÑŒXXh²k¹É\»Aœ„¤iÉu÷SU†ÕŒë¯¿D£Ñàø”eå®mcë¢l©ê4O:_éЃ´Ðhë®÷FädkÖ÷h$¡ õð½^F?-©êLsOtPñáý«,~ÊòïnÚMØÏXךJU¤Yáî_‹“èXX^Hø¹¼ƒD«kþ÷Ò…„­E°E8¶ÚTY†a+¬²D×.½é:Ž÷UÀ§UÅê·ó¾û®§ô52/ñ=ϱ¥gÌW¦2ªZ6%•RDaàlf‡¨Ú§ÙÝs¬žÞ‡ãéQHvíZä•—O3×¹… Üy¡kVx½{v»ÉfȯüøëøÕßúó­Oʪ`0Ìfåt'Y颬(•kæÃ pÓTMÒ¼eß!N<÷]îûÝ=²Ÿ(Šf¦|¶ªXêæ~ c;UÆx-§µ®sÜq þ>I“( 'Åy\ wZ+*¥(ÆÀܼ®‡ ûšQÀ;|¹ùÕûÞûŸýïrèà²løšudŠ †¤Ñâ὇ÿòñ/Ð¥´’€ƒ»šD`}3eW«M;ØË3§Ï ÒŠ#GoâèÞ6ößAÒŠ¹F ‚²NEt~âžô6+îºû¾ÿü)†£”c/ä«_ý8.\¬‡·¶1Æ¡/ILJì"‘óÙFk|cÈM‰2fÂ!¸ 7 ¸fhì#á_­ømgvÿmÖäjéT;Ù+ýû•¾n;„¾ymVp?™ÆÇ:QU?Y+DUOJk”3Œ®áîéÍóÆÔñvJ`êemÂX ´æìŠûy+¾gh4p]}Öô±¦¸|_"kF©1yÄxж3n^“‹Ñ[9:˜. ’8¤ÓjP.(öìY ËSºÛëÓíº½uw}“õî&gÏž`0HÙ·ÿ ž<ñÔÓÌÏÍñ–·¼™~¿Ïhx–,ÿ·œ?ÿŸ°vŽnÿ6ž{ˆVc‰£Osdß«$É+Œ²‹\¼Ô§7,H³‚¼¨&S€Û½K¼ÀײÎÒu—ÃÅîyè¡Uî¸õ<þÝé™:‹ÛM!ã½½Ò†BYA‘gHii5D¾Gè×ýRLH<Ã4c˜µ%¢«ÜAYiiÆñs–(p0¡/¾çP­ ÅH»hÉBáIIQ)Šþ4/h6c’$" QÐ`¨Jƒ±†J Žë²¹äD'OvyÿÚûø‰½s5ƒÜX’P’×íŽg`è$>Â:taìñîÕòÀ÷hÄÍ8d®{>ƒÍ’4­¨TE–küh•Dñë¿¶ˆª*gR£6( ò]cEaä¦Ì@L/g8J©Œ%+5Aè¹”±Jƒƒ¢"-J› ©iPTÝ?âÀŸ(º±ÏWúCšiî'Š’¢¬êCÆÝ7¯»ië/?€ç‡TU޵ )}ü0Æ"ª|ˆÊøaL4PºëÖBÚI`M™W<ðÑû9öä ²: ]KÁÓ¡OñèqVVûÆ¥}üÄý0p‘h1A£é­ IuAœ4ùæ×'Ís^>ö2ç×ÿoúCçtú‚ ý^’øžœœçQäåÀXÉ~±ŸóéyGX¬h&(¥5aè׈AiGDöäUò w"hý –WËÞþ³vJѺ,þq¦1¸\6e/c”;’“Tªq¦çxªÖµúØÀÁÜfâ};]ò›:ô½&yææ÷Ñî˜-ͬ6pÌ~4F“§+èòBX?ÕÂmñPNJaëé[°u—4öÈ Äâû>Æ/ðˆãfÓYîÞ½@ž•ŒFÙT¾µ¾Éz-ãÚèÂpáâü0`ï¾ýœ8žQäÞÿ#wãy’Çÿc*õI²lÇN¼ï{+R>ÌÒü€fü{Tå×Hó¬Dç&”Ä!Kóm*e]'ñA¾÷Ò\ý<è |ê“»™ï¸ØJUéÉîá$Qq )+Åz?YgŠK½ŒÃ{çYh'Ží]OÍÝÞ€Ó6(ʲÎúž†¤¹ƒâ³ÂMGnŸçÕÍ‘AZMw3Ek31—ñ=é|™Ë’õ¢Ä² Bßé!+UiQeÊæfJUîyƒæ]ï‚¿ók>K-×@(e&~ÝÆj§ ·ÕÚrOÎÀ¸‰wln“4|šIÊ0T¤#÷œ¬t®Sƒá€÷¾cƒßþ§Ë¬®T(íÖ ÎYLÒ<¤²8ß 3ß$ˆb?¤·™ST¨”kNTeFQ!éécÇûÔ’¬(Q•Âo•|tNq{&xgGÒLsÖ'ˆ@½Î®!Û=ßà/è”ñêûÓÁ«RŒ’‚8ªÓª@›ÂAÝ5‘j\œÇÓCéK¾³0äì5°¸bäù‚O®óê™wÜ´›w¿ñ çÎ_ÂK»Õ$<´ÒUÅòòs6aTžH*tmÎ#R#D‰nïê×h™0Î[Ì3§N£Êó¥Tý3ÀH‹­Ÿ§Î¾´ÝI(+Í;ï¿…?øÂóDOJ2¥]|¬'ñ&–Ä3é3g¡R·Ür ‹íˆ¸)Ù³{ÁO!±³Èñ6RÒä\²]«MªÊ5]JÕÊë…Kîl«ƒ.ÆÖÛã…ÇÐv–e ‡Ãú|5Ì·Õ$aömûàö?û&„`n®ÍÿøÂÿàýøÏ>ýèU þC-añUHÀû~äþõ¿ø»s]ÚÃÓ'ΓåšBWd:uÈŸ†¦l°ÔØ…—ùÒ£OÐë^¢ßp푃4£JV¼úôó¼rñ8´Ì5CÏ còÖåšOãA Ö •&ð=*9¢)1ÆIM…” YRÖ^ò¾ç´G¥VT¥»‹K’Ÿü)űï·xò1ŸJ+J]3wëiá˜÷EY!k´Â‹/ -5Y^¡´¡¬*†ÃÔ©0üÄ-ŠÛ¿¿Ü1µiˆ*]# ¹É5â€_þè[˜ï4 ‚ÀR5²2v¦bBÚ­õ,ÙÔ;S·/5ŒÒ‚ÏãÊXzcC 1]k9qn“¯=u޵~É ­8¿ÚçÜ¥>k›7]³›$I¶– bL¬ïEO8uÀÿÏÚ{kvœç¿î>éË7O €ˆ@ HJ$ E‰”©Hi­XN²6”½å²½®Úà²ví²Öުݵ֥õZ*íZ¤µr*‹¤)¢("`€É7|ùÄîÞ?ºÏù¾{1éªÖ†wî½óÝóÓÝïû>ÏïiRš¨­Z~vk UY9ûOº :ð0’:ªô–Cm(ü5¾é†c<òôL§©ïì˜E·¡.€–…uy`Œá£?ð ž{ôëÜsßùȇï ßïz¤'‹qÙl©õÖ3­]µ\øûwqŸ¸ƒœ z´:›DQØõFýNÔÆæàªœvR|GÚ¢ïô×A2å]w½‡ÿþcÇS–Å·kÖT=£4±ŽQV²sî21\Ý»€5šË³)¹q~ç¶j³­QÚŠ ÷ØÙ9ÏÍ7£ßoshk ¤•Xi09\ܾŒR® §¼î©¬\—¢Ô~ÔçßG!Å’3ÈRjGkÙ>WfÛT¥K4´µHÏÌÀ¯óY‘{ ”ÓYß:òn¾çº‚<øõ˸·w²f]k^¨1m³™-N‡nq¬)Jµ„ú_,Ô5hÞhëç.õïÚ>áN—õBµÜ¼Ø}<ºôVN#„àsŸû}{ì1²,c<“ç9Zk~ù—Ù·Óœg°,K” ]ì ÉBºï”ŸËÕ²¨9¢·m@@5îRIG„jxâµï®¦£Y œ±>Ö‹œå¨ß¯XßXáð|ùúQøoþvª*)|‚™ÑÆ dÄÊJ^»M)æóŠ~WC`X])ªi–bµA («Š´ÔÌsíuÞZh-Z÷hn}Ö’‚KB„AL3:©¬å/ܳl)é÷&pð–ØTÒøõ «½5NŸ:ÎcŸ§Ór ¡X%QÃr•ü2X—ðÌÃOsôèan¼éxs(©D…4‚õµâÈl  , Ú8‹œÖ²n¯š÷šŒ,/× ’”Æ0cªÂ`}Ð’ðÓŠB(|L°Ö”•[›¤rÙæÁwªÚ¾Öœú²4nâßÎ÷¼øþ‹GöZfû…±›%>oˆF€0Âo¼x±„õ,犪r’ÖNeìN‡ X ¥«x[>GO| ™SÝwß}|ík_c6›GŽáÁ䦛nòoXÉîî®÷>J„Y¶/(2Žœ¾Žã×m¹œg)½}Ê,®½5‹1ÉRå\–Ú1ò²)DÜ3biuO‘$Nµ†!Q5ªìk¿€f=³Ö²1˜Ôôc¾Ý~üŸ2‡¾VÇöè‘ þàåýᅢ«W.Òí P*d<ž2åaHQhÒ´àÙç¾Åpø§ØyÉÎ<ãÖ[޳=ÙæùógtV©²‚žŒÑTìê+iYOàH¦hxôK_feåln­;]‡°H¢Ú‚N;a8ΑÊó ¤DICY«æ±D"ÀJ¼àØ‚™×hèJsU\%”ŠÒV‹éD-À󼆲¦ûùxT¥ÄB$vð úv3éï„úµ<[¾VÆþ™õÛ3©ß –b<*I˜ýìÖÆjà~#s¯ª²Q5Ö7u©·q_›\Bœt8uú»šÍYÁáÇyðÁyýõבRrÿý÷sûí·7³³½½½æs«ªb8Žé´ ’¸ôÕ±ô¢ç……K,¶·‰å*j¿Û¥6 ¨7cšX¢5­˜:åá;RB¬ÂÀµÁ{½6ë+=òÂH&Sç©ÞÝsëÝ1»Ã1ãñœÙlÎp<åæ3·pèè Î?¾Ã±cë|ô£ïáü[oòÌSÿBJ®îü¯Ü|~¿àžü[}Ééëcν¶ÆïþÛ l÷£ñÄU@Æu?))KwíµµTÚ‚¨#K4öùÒÚ«­¬yÔ‹HÂæY84f˜Züg½“B$í6+ƒ[‡»„‘ÂhÍlZ2äÊá¤T@;‰Ø\Ðíh~ð‡Æ|ó+g(²˜l>%M3²¼l|÷I¢ˆ´Å IàG­V‚P’ ¶‚,×ÌÓ %QàÄk–Ò8ܪR’À€±%7Ü¾Ë ×'üîo „) „³i a°±Ú§×u8Ô œ·R ]„cž[ti …% $D‚YêfïÒòÊ4•¬Œ,ÿùªáijð·ZëF…nZ³RÔ0KY>xûuÎÎ&}½¼ŽaÂ8 ›¯Hµ©m>ʵޘ­[ênÖÕí1éÔÍÂmåûºövšùv«ÓNœ%1Ï3„Õ¤ZðÐ7ÏñÑ{NúÑR=V2ª&½­Rº©ª!5ª~®<ÈÆZ¤a¼Ämˆ`$MÖ¼KXHé>V•%erϧùoñ>~ñ—?O¯-R:¬m6^…Hi¹ýŽ÷1ŸMyïwpÛ-ÇèvÛ RïŠK9v‘ál|hŠË¾­í«g€2$Ž{~!÷ý~§mooÏÑ[º±½Ûüîb±·3©…ôuc;E»½B§¿ÅOÿôMü_¿ñ;D¡âõ×áÒ¥Ë\êíVÜÐÑjâÝæFlXo èŒ g|úwþ#£rôXiKÖ»]hÚ‰%O¡Ê ú¿Ç‡?öQ®;yÄí ª¤%[´ãc5¡6ô¾›b=zt-XC‹#-¥õ.c)­&ð÷_âCWJ×9jÎÅâ…ÊFôòf=*ú 0ààßßÎFõNÞåƒ6©ƒ¢‚ÙæNbûÔKq”õÍ*ê7ØU ŠXí¬•´¦Y4´q­7—©ƒÊx a E‰“wa}Û¡Qcxàxæ™gX]]åÌ™3 ¬dggçmsõR‡ìŽ×2ŽJZq…Rš0pjÎúdÛÌÇp}¾!„/IÜl¬nÿÕ3¸¥œŠ%hÈ‚™] å7Ü6mu%2‘„QH’Äôû67V˜§[Ì<Ål8òa^`vîÜËL&)ÇŸ$¾ùøÙÚäc{€ÑpÈ|þ³ù×¹tîiõÿôWÖÜxSÆ™›ÏóóÿÅyL•ðÕ?íRPrá1K  Eàibž“.„ ò4¥\jV¤¤›EΫ}ºךMåÆbík Í€D.‚R„”弇F Æ“’¤¥Á@™¹îÊlž1ËrŒæµ[ Yiøøƒo1Û9ÂsOu¸:ÜæÒÕ]ƳÌwG,‘7!è´cV:í6A‘SŸÑhë[ÝNDaüiôè±[IZ}ªªj^=§éõzÜ}÷ÝÄqŒRª1ð4öooo{¥Ÿ;/eEÌ< üìÁ°Ú/h'Uc ë+_W×ÖLáƒì+ênÄ"”ÀåY›Æjdš–¢X,vÆÅ kšj»Éx’ (åP­VE¿ßf}c@žm0›g G3†{ö†>ÐcoÌh4ÂÚŠ_y…ÂXN?ÎøíêŸø‘3TÕ)¾ùè#\ÙÞå›H}Øð™ß2ÜxSÆûîÊø‰ÿ ~æçáå—$ü‡n¡ôH IDAT‚+Šõ™Y/>ªJMšeTU8k5ÖA"jûµç Ç¡ðy½âmYá ôü„ÐÜY^1KK¬€ÉÄ¥|eYÅt<§ÈS§æ’PH‚@ðÝ÷]âÞü꯴xëÒE®îMH³¢Ö¸W!” Š0¢@ ’H°ÒmÓ+„q\ó¼(AŠÂÝU^ÈâF%Šn¯E«‚"Ó>¾Ò6YÕuœ%Ö`ôƒŒ‘HéãÑŠûþ,­ u{ûágÏ3šÌ½“¢¬«|)ˆãˆvâìpÆ3Ÿ“•¦ÿÌ2ËÙ‹#Né‘ݪM×')å„_R¸B}€×Rø±‰j5wÀ ðél-ºNÐhêɰ3åµ?]ú«î¼å+ݘÝqæZÝÖ*'îTRræÌ-œ}öI~ìç'6i·d“óX˜1·Ú§™é¥Í¹¬*ò¢òyUÓ)”*¢?8ÖÃj¿ó;¹c†Ãaóç8Êé$U#dûNZ× ÿ´f:—ŒÆ†^x™KW®òäOðØcb% VD -ˆ€ò®=>þÉû°vÅ%™ÃqA§Ûc6›^–µœsߪZ¤Á¬Ñ8ù®÷ñùsÈ €HºxØH´€0RlnE¼t6¥ß–„ÒòÊÓOòæÙ×øàý÷shkd‹íà*U©‘BцvÜæ>Þ’0FÄšC¬5̳œ¼tW ÇãSl绾›×oµˆ’{Ùˆ µÂ\8µ|KµÈ˜»Íü`žóµÙïäg¾–ÈëÛ}Í57k4ÑFM†³Ñæ@%½_q08cVâª2’¬oh_-×7µ;jß–p-“‡¾ô笭¿Ìææ&›››¬¬¬0 èõzn!õêP€ñxìqŸ‹ë1›Š{ÙV/@ÆXvF1;ã6ÝVITDaI€”¶™ÊøÔG¹?ðC€ðíxâäþn mJÝ64^¬ä;b)ÿZÔ´4||³ü´Û-ú}ÃÚjNz¸pŒðÉŒÝá„ážóØ›°½»ÃŸýù« VÖ9zè?õ4a ¹ýλÈÓ”KW¯2Ÿg¼~îO<©yâIØX‡õ5xß݆Ÿý+a W/Fì]m³·' ÛXS1›Ï˜¥ÓYJeœ˜‰%%«õj +Aè6 —\ã ñžkP¢¦ÈÉ&n/Í ‚éŒ¢ŠˆBçiMç9ãIÊt–a´Ÿ0†Ã‡Ç|ê'+þþßYa{û*³¢$/´Ã*ÖùÕDNÞ«"…Š\j”š M… 2HâPÒ‰CòÜq¾Ó¼ ËKO‘‚\k~ü§s²¹ä±oV$‰ð HÚëƒ*Šév:´ã˜¤¡¤r™ÌÖ:³¢âêîˆÑdê~žªtžïJó÷3Í·¬Ãr¶¦÷N3î߀7·áh)ÚBÆ $íˆþZ—µõQ¬ØÛIÙ-S¬ º±óqûØ.£Ƨ¼¹.GÝŠtª¡ݯ&eÝãq+/æÜÛ±3É]GÉZ„ Ü'I"TÅ!EQ2gäyŠ®£Œ…j6ÐßýÊ«Ürr•ホª4ž<AåìÆ‡î”׫,VÕHßå¼^Cžt:m§\·`µhòÖMU'¤óÇÎg)ý~„{®ŽYçïý—'x+Ž×^V¼ð‚äÍs!í$âøu[ k¬ÝµF¿gX_,‚%:a} 7Í,¼òí좬|hÌÒÜÙ·Þ×6nöA!ª‡Õ‘‘ײÂfYFš¦Íš5èd+7ÉÊ|9Í*þ§ô›üѾØü8íÄJ¤rp¡@ºÚE:ΰU­a°ÄQÄtô›‡o$Ï_iÖÚƒý±,˜#¬XØÑ€#'ŽÇ¸ÌªÐàÅZEièvBNŸHxõ\æ ÂŽyèw?Ëu7žáúën¢{¥†8М_&ÕÚ¤P¬÷Wô»$R¡dD·ÕBWšK¦*¤päC½ë:_"&V!¸CAÎf´ÆP̶g¨²"#ÊG•;¸y~'t°w«°¿]†óÁtSóK=ÁÇšAKÕ}Ý^ 7Yòã-µÒ}™¤uåÉ^¶©¬M£h¤Ùœ‹²BkWi¢]:ÏÅ‹¹råJÓŠ¢ˆ›nº‰£G²µµåÚ^á¸| óÄ¡­Ã|ã_çÂ[çáµ³‚ÏVrøˆà¶ÛÆ\zㄲÃk/lñÈW×jâ6¹¼ðŒaŸd#h8Áa'¡SC{t^QVdYáºU….ë9ªÛ¸±‹a6ËH³œV }k{:ËÉ˪éT$-Í_øqͯüožO1 Ðhlo¾Ýn,„Êhü¶‚(„‰DjIàÔBþ€åmY¾26…¦ÈáG>UñÀð“?¢hµýfœ@bÐëÅ Q’Ðí$´[1BBY–HU¥N¦ììMØ͘¦)é÷\­1|õñ7IKÅúÚ«]‹v–eÄ~Ô`¬$K3&³ÔÑÿ¤Ã¹Jo“þ¾”ÀÊ€{ö}úZ=öªÛÄJkŒ+ÿiýÌ‚ÍsVWµoÅXON“Φ Ú{ÞvœóÑhÊæÖºæ5½A—8Éoý9Þÿ>ÍÏý%M·cxè‹–,ÿ0ýîçø‘ŸûgΜ$N"¤Toã=[ï4Y€HŒ·ÇÕ›s¹°Žú‹„-⤻åùNžçz}FÍzª9Rêw¥€½Û¯Ê$Üо‘·ò7Àrá„›yZ4D6&ëΈˆ&UV¼Ýfõí*âo·¿QìଠŽs¬g@v)²Ù¤øãüYÿ²”n´ˆÑ> Q7›¼Yøö¶?×ÞËjI¤¢+'´ÈórÉÆåþ¢(xî¹çxá…ÐZsÏ=÷pôèÑ}7º1†ÑhôŽ›rý¹O~r‰w;KC¦iD:­) Q¨QYä]#0T Å;ÂmØÊsé°b8@–¡öKסޠ±Ž¸æjƒ…ÈJ ‰Š¼#Ž"º]¬f9iºÉdš2OÙóèѽá„áވǟxDÀm·ßÁîÞ—^z™;n{·ßz†ÝÝ!Ú”¤ùœ‹/óg_6üÉ ×¯èõçÜ÷½¯ñý?!¸|¡Ã ßR¼ù–äÕ׌#3Iw”#öa@§°¶Ú¥ÛI0Ö’ç9óyîÚ¼EÉ|Ve§Žt¬€’H¹Ål6g6ÏÉ}WS)HÁ_þk+}ÁÓÏx‚rµåOûJŸKíÆ*þÒ*‡õlîFã`I0™eµÎQíÜ[xÓ-†|~é¯tº¾'oÝ`¢‡„AH‡¬¬¶‰ÚŽaËÕ†íÝ©›‹OSFÓ9iš“UÓERJ  <À!\ä嫞yýš€ÃÀe%iEýn‹v3ã‚õ´âé²dwg„0ÚY©¼wÝ‹lFK(¬ví£@ÕIëüîM| µwž—<÷ú.½nâž EZ ,$/J¦ó‚¢(œÀJ©F‹ üTa8\VSÍ×4üÆz—joÎÚ´àŸ¼r£ »äsàÓK!¸ÖÇŠaýæ,q¢õV%m5Ê¡–\Ä ݨ×Ý©®ŒxóòŒ²y¨4EẳÔ-¸EeJœôYìrd½v;&ò¡+I 8²Ör£%‘Êtêy}Ï×X`‹Z:8»×¦+M–æ\¹:ä¦O8;U#skLmÑ¥›ûOf©Y˜F(¤au}•Žtxáü„Ù^xVðå‡~nGqÃ9‡·V‰¢`¿µÔ˜¦SX?g©ÒÞ"jI­¥Y^{–+é½½=/¾‚^kèò³›×³uøUÕ+¬¯Ïšû×ie Â;Z„pŽ8rØÛ,ϘO3º«­}kh¿ßáë™üGùó¯|±yýË<ŽåYtEå[Ýî~¼áæÓœ{þ[ì5Ý–¤2†BÃxl hpyW³Ú ùäõwñÄîkœ-ßbSm¢pQ­UU¡° úm’~Þf/#Ë’•¬Ç[Ã+%ˆ£[BЦK_„ìd»Ø~‹Íôc½G^jô$Ec *úYq|…i3fhkˆ¢Á "¾£HÈwòHÜŒö£<Ù7^ftìû81³õyµV"ﯮ÷ß‹¸/»/Ý¥Æ×.6nÑTñ¶ÉlfIQ«\ÿÔµ—näåŸïÊ•+lll4¯;Ë2¯½ë:‚Ó §„õ ¨€¤%hkM¿×ec}@šæÌæ)“ÉœápêfÖ£ ý /½ø,³yƉ×S™ˆ/}é+9¼É?p/Ãшó®0ŽyéÅWxøaxøah'ð¹ÏÂÝï×üæoi}Drþ\À|fÙ¾ÒAÉ^'aÐkGŠy–2IЬr¢ÀR/Â|¨É¼²^|dÒ›–ªr©£Ç*~æç,çoDaMÏóÆ8%ôc°‚Ü·w‡S4mD£^îÄ í$rŠñÜ’¥Î9P•ÚmJÖÙ…B)˜g‚ïúhI·­ø­ÿ;b0p½o¢"I|䦕†Ü‡U(«°yÆ•+C.\Þ%Ís´ÑäEÕŠk¥»Nˆø¤„g¥à´†ëV,w(ø½mxBÀ§€ŒåÁQÊßzò æQÀ@¾Ui”š*áð•—¯pÿûNúT2/œÂº° cÑÂø\é…óY6Â'Ñd8øwø³yæjJ³[+õÝáÔYÃ@¹CP’„®5:›–>¢T°OIŒd)ýÉ?ûf±f\ët¥ÙÛ3™dQê7f#ÜÜÚ¥ù ik¨´eg{Äúj¯ŒcÑ¥!/ ·žZåía-úÐÙ½r™“xwÝy#íN%kO?û:€Öÿ;•v0c,Ué:€ "b“Š‹TŠþÊQ’Äå<7݃¥ ù jywwwIt["E±PG ±¯xZD’¼û&-¥äêÕKœ<~Œ‹.,3s:"¤ô™ça$)uÅîå ‡N®:?ä’Æè{ïûòПphkÉxø67e¯±¶"¨BD iË.ëÇŽòÔÆãì]zƒ½©F (4&)$­GZl©xtû1VÚp" Ù™MHdÂ|žÒëµ°a¾]¡d• ?¹ryè<ðÊ1¶ePk!ªŠÙ)öHÓ‚v¿MYå5F„hƒæ³SY‚P#•$ÇŠ¯ª9E‘$ Ìf%R×lɾìZ›óþ/$ÍÇ–*³ýÕ»mT¡ûû‹Ë‚«·Wýuq“E¹€°5x½ÇsIx&•+ŽÇ޶±´Ì3ÐF¾íä9›ë•¦)óùœ yÊž³(TׄdÖÖÞéúf«¯Ír.+^è6KC¤Œýéº"‰*:­©kÑNì’êÓûL„¤ºé«+Ûˆbl“ŽcšŽC]¤W=Kíº¾Ø–î4(‰®å' ½~‡ CžçL§©›[& = e8špáÂ.YVpîüeNïÎ9~Ýqòܰsu‡Oþð£dÀüÁï1œÌ9{νŸý¬àäIÃí·Î¹ñ–9¹2]åõçoÆXå ³ŠÙ´tÌup¨õ¦àð‹í(Ièº3*‚Ðð‰O¢PðÖ[–0ô÷²ß0F“Œ4×tÛ! KY:mC{òïE6× +”tyà Õn®¹¸¾®õ÷þj¾ÿc‚?ýýMn½I3åÌç•c°+é /UEžçÖ ƒF&e<.Og¤iFQ/¶4(©šÍ©)"«²4TÎF–ÞMðÿ¼ÓÔç- ç|Å·Üï**~}ß ßž]Ânº8Cw8ﺛ÷×J%–‹dᑚU¥yú[oð§Ÿ£‹îŽ÷LBº8SpÈE%V9kY€³~¥¹¦¨4‡VW]°E½ìáà~b1 rÁZµ´¾à[ÙÎw½³7!Ž£fC2¸ Pºû¬ÛdŠ¢`4žsêÄ¡}ë—±†étÎÝ·å¹7'd:`6qÓ™“ÜvÛIúýžï–,­‰¢Ž¡¬©üaSkïqÖX¬nqãS•’d8n¿­r>ØÒn,¡eIžçM¯î6‚Õ·wPÅw\A»÷+ãûà·û3Háe-Î4k^Vh—Ñ-»—÷òV›¥TMÍyêø:‡žá±G¿LFî]ò1ª‰i3ˆ7ÙZ?ÁæÊIÖ¶ŽÒ£‹¼E‘tcTÿã¿ûÛ•;eHs׿­¼–ŸåÕô<ºt!ÆB+(é„ÐíœàìÎëlöW°•âÜü<¹ÓPh÷Wº-Z­˜«»còYECWôйfVÌÐy… a/z+¨šZf 6t²6E•Ç-¶BEÒîL§©p*µP>ÅåÚ\îw“]{Ó®Õ×ÙXX²hÔÅv¸³o‡ˆ}~hû1“õß5 ­«åèèKóÞf³•®UU>.R8Å/B$‚N[6žÊ¨f°¸Ü¨7僭ýåÓêÁ®ºŠÞ“ÙÌ3ž˜·ƒÕ{]}»ŸY1ËiÑ"P%APªI…µ t"^…išr¡¶ŠØØîGéim0Â6h:ám]u‹Ëa`*¯ ^T'î2.2³Ûm³¾6 Ï æs—¬4N\dæhÂh8ewû"¯¾ü"뛇¸é=·ñÜó/2ŸOùè÷ŒÝÝvwv(«ŠóçÏsö•9¯¿¦HbÅé ‡îr÷û¿ÆÚJÂ[¯b%‚³o\Ù©Ð:÷³AÓ¤Rø…ËY´ÂÀW¨ wׄ[nVüü/ôÛ¦¡'ÕQšç®¥?ltc¬©ˆ·Ù+%h'!í–K> ÃÀ_+'Œš¥yQ,B°±©øä¼úÂvv ÆUæ°¸*Ñ"(µa¼3#ŒB•;vwQ‘f•6éR†¾šp¼é@ téfБpÕË™›Akp§ÉñÆ‹©ÜSC <›™õkÀ§€‡=ÜX5ÒÏH­ª$j뛤 Ýól|GÌ_zñò.ŸþýgéÄégÊ®S¡T•u@!­ÑZ"h‚6„¯¾g©ö¡)†nKqÝ!7û¬=vÂÓçšä»%^FÍn_„/Ô  ×Ò\]é„uîœiFg‹YYUÌg9Ö+] Ί¦½sžeÄqÄÝ{#ßxI I¹óî»8zh•$—ðÆ5¤Ç4äfÆl,e¡½z[7t-xsR“€µÍ|RÚÛó®×BˆF;i'(•/·ö'\BŠ5R—ý˜1kauТ×E!xå¼õ»²ÒN !,­VˆÔ™Ì\Ĭ0mO…´GúÇxäkó}ß÷# ¯Î$[t×6è­­Ó]é¬ITb oP’ Œ8|ôˆ+6v…CÝ>AðØð ü:„”…!K-+ý‹f:±¦6¸º3¢°9BZÝQ²»7¥,+Â8¢7h¡­a8œ2›æ”r‡ë:[Ì唢0èÒÐ\Îlž— -’$dooÎl<'ˆ¾ørU°žmq®xÝ¡>—¡õUå‚„¬ƒ”ßàÞzí° Ñ 9—}ÒoO¥Ú¿9×-”ZädÅ"íE/·…}êŒõ~ÕzÆìb ]KÏÍ$Ü÷“”Ÿ#kŸ"¤¤Äg×>ÝÞ ÙlîBº¸Â()+œÜÇ©«ªÀã¤÷]它Á"ƒÈ¯µy<­jûàIØZ¨t@Y¤$cˆƒœ(H±¶8`ì_F‡‚©ôÂki–©Z^Œu-Û¥hÁÆîU·ÁaSÖQÞ„kmJ) Û íNB¿ß¥(**™ÏR&Ó™¯®§>6sÌö•·˜ÏsæYÎ7Ÿx‚{ÞR<õäã|Ï}÷rÝÑ#¼øü³œ{ãuFÛ†K*¾ùhEU\ý›Üq§áüä:üög$?îˆ]I, €Ãk=2í×Îç+‰cA(§ÛüØY~ë7W8yÌ’fE^6­Æ©j­¥(Æóœ¬t ¨”‚N 9¼Ùgkµ‡5þÑ-¤Ã‰ËÖZcüB/UÂG¾gÆhg…¯~¹‹PÃaÆhZx*˜ œ-¬ð£]h †¼ÒXCãñHd –{’(’8k‘U=Ó5¬¯[ÖÖ*¾þçB:âQó÷‹Ø.›6û™õŽŸaÿUàC•ỪC@[å5 þ éè‰PŽg ­«CÝXF0¥œ}ý“Yáò•r›a¨Üû#ãY‰6–Ô¸`ŠRk"Qk Öh\Èñ›§¢ÓŽÊÜ>K,±±¸L ™‘Öc±•Õ>íVDGM0‚°äâyÖÆ"¦Ó”ëO!iÇþYq­)c4ÓéœÁJ‡*Z!zsÄ­wÜÁÑ#múƒ*P =¯½¸õ«Äë*ÚÔ6QÓÌ q›uÿÎæá3DQBEû:ïÔ MÓ”,ËüZbä^@áBEÄ5øžv)K@,mÎr?ÍÂÂ÷ÜwO<ýE•±`橳µúC Ln˜¥‚*ˆé%}Úã¾K¹k¯ÒïcDNëÔQÂÕ?óñ_ü7ŸágÿÊ/1žÎ©t‰ $(Ç7r^ºÊÊ‘TÛ"J‰â©‡¢—Wwð¬~…L^B‰€DºîI·×ak­Ëöî”ñtÆê`Q¼véMzÁ€i‘:tú‡µ•.Enz,XwïnôaÃJ¿¹¡&³9yVºbF[l%H∭-ÅÅó†¬ÌˆeBjflËˬȾ³Y]+Òѽ™­+ßjõi?þ÷AcûµUuf߬µNÚ_M/6çfSbüknŠzs^jM/ßtµz±y]Ãæuhˆ.Rº– $¡ =ÔÃWˆRb´ÞU)=ê³þz¡ÜÉ^Ê’W^ø*QÒEÈ)[¡|ž´Ù' ;:òN¹ØË˜úëVÕ[ûõ†• i‘ dš@¦Q!¨šUªæY[ìqŠo‰Û…çØÖøTT©Û³‹HOÎp ^©=ë‹‚¾EÙŠH’v;auµçmQ9³iÊhì+ëá˜ápÊp4á«_ý2ArÛw²½³Ç«¯¼Ê·ßÆén$›O'¼qî"ç/^â‰'$?\ÑëW\®¿^ó³¿çß<öHÄ =`¼½FVjDà=º}·UðS¿0âåçŽ2Gô: C.%YQâ®Xã"2+mÈ|«<Ž]+qµß& ŠÒýÀ•CQVš²tí×zƒ—BpÇ{3î½Ïòé‹iOñ IDATßèRé‚t–3Ïʆ¦µÀˆŠ4)hJ("… ñ™´Êÿô‰Qa¤èõÚ ú-·‘iC™—äåŒ[ß;çì+ I""@ KV·ÝmÚ¿RÀ3^‚„ /7jÓR°g •u Œ²2ÄT-úòAÚÖs0%Xål|õÂA»•p×§ ã˜_ûÏDý^‹N'rà’y… *u”TÊ $SjLe±bÑ‘Ï2>ù‘nô‚]!Áõ½/{çød½QBE¿×q8Sm]…í~6 í¾—’–µµ>$Ê Ê„ÀhWõ–yÉÊf— £‚Ñø 'O~ˆ£‡7\‡Ex…xMUôøË噭Ѻɯ _5-¬~nUÐjˆãè]ÛÛË#Áz\ç´&SdPz>yÓÆ<ÐÕõƒ½¨²AÁ²6h1¦ÓzÎÆú UVÑ‘¦óiC’ &I1 Ë•OkÀk*k§èõ7ܺµ%Y>À/ÞÒ4%MS¯q©åÅ}Ø"ÓA,­ãv_ØÃ¾ÓMÓ9]ìèRJÞ|õ*ì ¢*¤4ÓrƼš3­f¤vN.RR9d7qîÒyÂN›ïÿø€. *ÑEA™ìŒf¤YÁñ­uþø>Ï=÷|Ýé„°’Ìç"ˆyþßà_þóÊk“ |ê“?Ïÿüÿ{~õ—ÿÏí\¢ìUÈ*B)ki­ôØØ -S¨r˜äJJTààXèô[œY;CÌ\е ÇSò¬ ­VBUU…ãŸ×†ªÒ´e›4Ï)MI¯Ó¢×k!DÀ,M§ACYV(¥ôÚeÉ,KDÔ_ÿ«?üÞ©uz-EÞrûBëÒÏ9b‚ƒ0Žk º–2–«ja÷ŸðÌ’8Š}ms±¤X´o»GjšVc»Zš­²ÔÕbùp°°ÐÔ§NUg.û¶…”Òyü¦4ŸëffN£Qaª!¦ÜÁštqÈáb\ãgÍï¤ö>x8ª?wùsRÊnäõ){±i/®»6CÍxÚ˜Æè²QÔZCÃ7¯[uµUVµÅó¯"„t|‡‰ÔK™É¶A´*o/ŠCÅ,7dYÞ(¨cÏâRVÂF¿C BƳŠÉ\“t·ùî{'üÉzd¹hò«‹¢ôñ«f_ö¸ð³úÐ/øQ¨wh§ö¿ñÄíÄaFëYvÍ>žü'¤ð$8á…†¢¹'k‹`uÐb{oÎ[W&Ä‘‹ê³ÂÉŒG[?Â@QÙæZodß÷“=ÔG –Ý^o(¿é*Y?»îp®F ètb¶¶úT•!Ôm®ëb;ÝEÏãbJ…þí¬NÒh ´ÙRÒîÄLËÉDn ‚N;kOÒæÙëvcÂ8 M]›nœÍö“Ä®•BµÜþ>#Y´«+?sª•—Ò‰TØ?Ïö@‹V,,Ouëi¿jqâÞ—ýì¹ÒìK‚²Íf¿ÜŠ‘Âaß”riHaðö)ŠÂµŠ”A»f&ìbVÕ<ìJ4­-Ðr5ÅÌý𣋩·[(Œmƒè"D=.àšé^Ëÿ]®Â—+êƒïËA‹ÖòF½ì¹®Cc\ˆ&Bˆêt0;=Å¢›Ôxÿ¹”K¤7_5ËZT¤MCÔª+e­-‡Å_’ÊûµEýyµ·]»¯­êŒè @II+‰Ñ-M·×f}}@Q”L¦)³ÙœÉxÆ®ŸYïíM¸pþ EQòÖhBqó-7£uÉ|¶ÇOýÔ#„â÷?ÿy®\Ýe´ðì3!BÂÚZÁ 7^æÞ÷vvá“?ýO?r==Üc–XSÈYš!¼Î‰Ì$Y©I=#»ôŠù4Ï Ó€,Ë]«YÁÞÄWŀ’W–ï¹_sêüó_•X‘2/¢—[†ÖºÃN}8ª´%« Qv@Qh‚@ÑNB´v_%­KvÊJ²Ê,)wÞz•ÏÿÇá%”nØ\ä9Y^Rê”À¹Ük>X$ Q4㤠A^j&“Œ•~BRE„AZ‰4N(•ïÀ—(…±iœÖÃÌõþ%üÌ'nãØ7{|å‰7 "Ñ@‰%¼VÄ`ŒÏ~Ç.éP$äúëVñÍ+ôýˆK¹ÔõÅBúûЃk|w§‘}Ûšvæ«æ}]\»T¸dMLÖmÒÍç[ÏRÒïµg¼üæE>|ïI’xñ\ÖÏs“fä­eK¢×:¿¾Á›%û™¬­Ÿ JEï*ð­ÿÿÞÞž‹VÄ¢d…YcB­­^ûöÜ:¼g¹’–Ëëݵ7îªÒ|ðž;ø?ÿÅïgy^IA¨ ÕŽ@——†@ È!ØÝÝa2™bãˆi–3šçL³”ñlÎÅÑ„–äºÓ§yø‘Çh«ód{ì˼ò œJÎðûòïi+EY”T€YæÄ¼oŽÞâ†î1F•vvGäUÁ¬H©“·+m؈qx#æÉ7ŸãÍùyÒ¬$¶1Â@šfci·ZTUÁÞ0ÅšŠVâÄ~óÜéG¢  ¿Ú"™·™VS²¢âÒ•=6Öz$­pêÞÿ:+V‘úY±•Ä>¼æòf¼¬4~'ºØrž³SÊj´.ÄàÄâmìk)»kjÝ2¾eZû’¾žÆÏ{ =^Ÿ ]KÇ ¥r"|¿þ·ÉZ”Ô~£±Í¬»IEªÓXA¿?l”Û÷‹’ì®Ó{{{ ÒSØŠ^tàÆ|^`J·[PÏ»²þfý®ãáºJo{Ïfå9‹Tñ­o=G8½ƒµ4¶·ú¥µ£ÚJósŸøYp˜-98:b™‘¦Kî.–H\ºØþ2ç«_û áÞ¾ú•?E–tY!qYáÛ›cúQEžÓ£O¨"2±·óÙÏqçÎm¦GGÜÜÝãÚµüàyއɾý \zÈòŸÿWi*øá÷6ﳿ;a¶p0“Jæ‹%Yš’…Ïyn7$ üü/†}ø_  · ‹É¬!&VHâ@’c)k®zK’)¨# Ë4'Ï –H òÒeÌö–Ïÿ³ÿï_H¦‹ÔW.ë„?Púœuwª3ÊÝæ%‘IJI/qIVkC,†ÙlÉT-™/3/2Ì«ŠŸþÇeûMëœBúXJwD.*Ót)[œl#]εã9 ‰ ©‚R8¸ÑKoíñЙ5ò¢$.ת´ÿ¾j6-›ÈSc]âŸñ¶GYëG„‡YåPaÄGÏþn-yqô¯Ý¸Æ¯âcþp¬™¥e“ç>õ: ·ËÀUÅ¡wd()QþïdÝÃÍÙ…liøÆˆŽ/¢Ã¹Ç?Ôö_+|0tm6¶CùòÑ•Aªñgãyåõ³c›Kõ<òFVyzXå:cR¬­Ÿt úÎÆ|¿¶v½NÔYÏntaP>nsu¶ÜÛ4ý z˜½e¬ýøÑhÀææ:aèÔôÚÇÇXœPQÛÚ5à-a^ûûŸ°þÓOsw9CT†e¶Ä(…f–k— ò²äèpʉ'?Ê£¡åÅŸ¼Ìöö„PIöïÎÙ=œ‚uc’8 èÇ ËyA(¶û›l„Û¼•½Áí|×4ŽúëžÇ P$qÂþ|ÁÚ8@ Ãt ¡µìÛ»$$”*Cà ñrrÈ•Ýk¼{pèºZÆG'ÜÌòŠ›úÆhúýÄéU²œµqŸ(¹¹{À¶:É$P)»å®³YݯZî*ÿ>ˆÍ½ÚúVù±9s㇕+׸mE[Œ­VÛ(öÞ  hí\Ç¢ùšu*M÷giEn^ðå[rJ¹“u·˜4³g!P2ð =»b)h8àM+¹£´Æø£mìj•g±ZŸ_ŒmÛ{nc÷´bô ]¸h=/Ú2Æógí½UõqKWýçÊ<2¾Êö õo©è¨„E;ÐïØ_Œi+º€Œà&…‰™W=/à@Œ Öˆª*Ñв$Q–HÆ1|ì´e{¨9¸y“'ÏB©%$¡ŠÀÎŒ,¶ÒÜ:4e­í6 Žo91 X6i·eÓE¤¡"ŠBßï³¶6bc}èZáÞº5Y1èÇDAÀ•«Wxõµ×9sî“Éo¼ñÓ£#>ùÉOrþì)¶×Ç ÆcÒÅ’Eªxõµˆ—^ xùeH‹%Ÿÿµ[|üûœyÐ0^SìZvïh Úc)áWþ¹æí7¾÷þÀåû “É€£Q0 ˆÂ€Ø‡>Ô¡µ×9”‚(pçSÛ늉â mÕתèNæ¸~®EHPbõ¹­7†ú°PçÁ‡AÀ[[<~æóiêr´½š[IEEMÆpPÃg"= " ߯ö£«@µóÚ ¨E`²±)ÙþYtËJÛ6¯ƒ„ }µ>Ù̵¢³Â ñ¶|¡÷™µ=µæ’ÕÔBíìT¥’Ì‹ªQq—•#ÁU•¦×_gsûl£Ú¾9¬Û],,‹fÚZ;\ѪܫÖ~¿ÿıY£xß͹Ò½ðÂë¥ìíîQùµª-¤DsÀ¨ùãË|Á“Ÿù%nPVé"£2–¢ÒTFHE¡5óeÆ`}oõË|î·ß|“²r:˜ùÂg$HÉúúˆ“[ëˆ"¢oÇÌ«)oï¿ …dY.гrœnG8³dy‰ÅȈJä(åܱ .ŒÎÓ{ˆ4âzz“x #Å|¾l4ƒAßÓs&k}¤²ŒXgVÍ(Jí¨sýg6O’è!·wØOï²LÌ%ø  ¸'uaµÚúx{µë•ëD0ûÑ…h)設i#Õ´6جXµ\¬¼Ï4¶­å¤«þn`~ÃjØF1]ÿª³y¹EÂÒV¥¡rb•Àg,[k‘Ö@ãkt7£öŽn¬Hþa´¬ú¹…ºo£7"8ãá¦UîvlaÂQ[›¯­õAÇ~ ä¡&>¾MÞÓöv– å7QÉ¥Þ›œ9}¶Äý8­H]43sc; ˜nä·]œ .#uÊõtËY©1KˆUÛôTÁ‡·÷Ç.¶3 Ýaf¹,éHúĽ1ùbc ÷uMÀ…-ÁÉ|åUÉl) ËxJ”þ0%QJcãN¦”˜Ú ÓhÜb«„AaÅÃ~ÂxT°½9!/J—ÿ<[px4ãàpÆþþ‡SîîÝ Ë+ò¬$Nz<òðCNY.wùÿò7X›Œùîw¾Éõë7˜ÍJ¾ûœæ;ÏUD¡æñÇîò³Ÿ4üÛÿLpò„à÷ÿ;És߆òéŠÑþä£Q@…ôúë›#ÖÇ}G ²†a3;Z’§9©ßt«Ê©êéF#q DnN|wšQU)C‚0D*' cÃg?oùŸþ@‘/“a@œDô‡ ƒAD–ÂÈe[sÈ2-v¶öÉnA Q dàgºV´‚" $Ï¿~‡OŽéeÁÊ ]`åÕÅNmà2ʦ9C«OÂuD°H¨ŒÏww›àhmàý£º—ÕÚãša ¥jˆOR©Î¦ìªjÕáê+Õv—h|Û4‡¢îrVï;¶v¬ AÔ£‹t½Ç"×øüqãqÁÃÍØ™{6 IDATSq¯ vhÑufµ5Æw@ì¢ò¼íZcRVŽ1o­âäéGWœÇ‹¬nz^Y–ìïï7EÑx¯X?›ªÞv~P!Þ°ü>Õ´x_5wYNyê©gyþ‡?ð-}'€3ÆNí¿öB voÝ`±¿dYPiòªð˜X§äŸç9 Ei z¹äSÿúwøæÿú¿ dÄÁÁ>Y^6{He4q1dmfƒ\¿}‹Ià"CIÄäÚkšÌpÁ ”h,ÓyÊd4á°8bØë‘Kn/nÓ}nå·°¹»¾gÎlp…^ý•®ØZ1Ÿ-˜ÏR*m)“CÙ¾Àì£rl™±Ÿ2sJ[  àt)]ôqÒÕý¨W«ñˆuµ\ÿ²-g¥â]i»´‰(5,ÄXÓñ&‹{DQnV«;-kqLq¬‚­Y@ˆ.üFtüw½¸«:P¼ž_)¤ê*8屦mlÓrÀïQ“{qéˆ`ºXÒúy°´ÍC®7ʦUÖ·ktµDûX“cM壕·HÊ|‰Mï0Ô×èëkœYwáª3§²örÖ‹­øÄ4IB5©Í‰8 ‚Ar7®ŠßL–\˜pn<å±íCb¥è³–é öìíÞ!×£õ-'ÔÚ‘ô;;ëìœØ`¹,¸³»àÍ·,õׂç¾m¹|ÙòñŸ6|æsnÿþ÷e®0ºÇ`±¹1" }•9$ÄÂTšùL¯7"ŠBçUïä=ïˆÖYõišúŠÒ°>ÎÚ<ú•¢ø6æ–“ú­í÷ ͼúæ~ðƒ‡²Ã³°ÍÚh:Üÿ,[rñ‰±TËŒ¢[h*¼•Ôk楻Q@8si{‡ï}ÿGŽì6qrí$}3â0;b7»Íb±¤¬4E^‚°$#Ƀ“3Lóe¥½,Çu©¶wÆ„QÈrY0¬ މ°’~ܧ7v]¨å2ÃXÈò’¼t™çyVÄyå®™°1szüëÑ„[ó;ìgw]gɸ®”R’­­5–iq¯Hì¾óä®X “øRÏ\WÚÚ+³é:1©K«I9¶±ì¸vi’qË—=>ogÂu†’¡›³ºãj“J…Xa’tldvÅ'-:A;?RŸàq‚)½ÂÐÏGŒ~.­ý&ÛÚ±¤誣P÷³¦f³^!wq½Èv鯴0š÷]´}tµÄÚ…›# Éâ(e¾w™£’qbY. ¶¶&„a‚²-ªÏzöo=ãu׊†^D“ôCg&AèüäE‘1 5Ož\Ð ro 6ÝA6ØP?ØØ’eK®_{‹S§¤**¬)=·X³(+ìÏ9Xž¥ª3zéQTÖ)tITô“Y–?_aдTë6™Ä®Lk—€ð3&¥$qÒï÷úllŒÉó‚,+˜ÍÍ9:t³ƒÃ)W.¿År™“ç%{wÿ–~ô£ÄáˆËï¾Éc=Ég?óE¾ÿý¿çïþîûìíÁ×¾ _ÿ:Œ†ðà9ø™OhþÑ?Öœ9]ñ·½Í+ ñ `mÔ§ß ÁfeEá+§FKÐ]­%­ ‹Ã9‹´pU¡Ä¡b–d™æñ§4?ÿ ðoÏ»„ö×Ï‹–*Ël^’$È’W´]Y÷_:T÷ýœH èÅNX™—†,+IâÐ+£¢ðB³°>¨¹ƒ˜¨¹ÝƸªS ŒÕèª^_¤”„ͦî6*Ç!·²ÅËb!¥÷æwÚ×ÂoÞ«”Ýá;hžc¥d#kÙ «ï5]­ïç­8ê¨MÓ‚{ŒuáÚGAc¨Ê‚ÑöTeÑZ[íjñR?g¦qr¸5 vBèÊ0&k’Þ¸Õ th…ÝMºè3›Í|‡M²6È‘Âv6æ®ÂÖ¶Êì®Böž~Â?,ͪþÙyä<ò+¯:­’Á ÆH³œ²ª\3AZ?«wëê;¯¿ÄÚÖÇѹF«]jl œ;F4‚Jº»ôh¹dóâÃ|ÿ;ßæ×å üÝW¾Ç™Ñ Òø‡{¤eNdÝýXÞ@„·¦wF4€áPa€0ôz!{‹}]`c¼Á«‡ïP„Ѻe ×Ió‚B•ÌfË& <Ón-¿qû€8’$IÀÈl0$áµ;oÓã0;+˜M—$qÜÈÌ\7è×¾ø‰/YcìÝqñ×ñʹêßo¾ÑÞ¯¶ã ~ø±¼S!·¶©&ïó)æ˜8ͺh];‹•–¼®nþNzF÷Ê᤭ƥ’Ö©ÇDµ‰¹ºÁÖÑ ü0 éÉAC:¼Z+ÚŠº!qÕ¶ í½ŽÃpvО¦VÓ*ÊtÁòè.³ë¯ÓÓ»œß é'‚¢, ƒS;’ØY0j’ƒ±UÞÂQçÍZOeÒUE^j²RSjK^V\¿±Ëå+»lŽ%nÏDþä.”;Õ6ï¿DÑ•ê6¹±ÆW5.ª3e™’)‹ÌU£~ÌNÿˆkËÅèÛJ…HÙ£Ò ±›ÉׇO¶“~)ºžNØŽív7|E§”"Š^/¦×s•õÆdÌúÆ[›ë.|~}ÌÚxHPU¯¼ò*ï]¹Î¹‹³\¦¼øâ‹œ8yŠg?ò,ë“ £aŸ0¹³7çÖmøá%'G– —f|áWoóÀ™%¡ ”a÷vÀÑQÆtºd¾H£<¯(ë¶³wÚuRªÊ ¤ê€Š¢¬¯kþÕoþÇ?ÈsI×a½e­,]ŽXœ ÛëÛÀ®²L¢8 é%ƒ~L?HbW-LS–Ë‚¼¬°¸…,--—N]V¸r]œÔ.|LíΘK*š®ÍêÑ:1ÚgšNÅÛvÁjkUàÞ@Õóf7_vèÀ[)…[ï”jžéšdVFê¶èn^¶sÈÞ-Ûv¯èTu€Im¯,«ŠÍKO“Œ7Ó‘Ú´ í°´v‚°²2¾‚v]’Üë Î>x Dßãˆÿ÷$æÕú“½½=ò‚cÕ±hWíLLÜÇïz¼$ZýÊJJ^{ã*?ùÉËèªbЉã¨E:óÌ×ÍÈöX{òIlš£ƒ˜2Ë==ƽîÜ ²ÊAi”. “{ê ½w¸zë »ÙMÂ@Q–î{ôz£Q,+=4Ç’YšÓCR“²}bL‘»õÐM.ÜÏ‘ç%…-n„Ìæ©ëpè Y†Ì²9A ýxP{hH¥5Ź­3œß8ËÙævÊ2Ë¥ƒö”Ö­õuw?37Æ žùðÆ—®^»Â•÷Þ%Ësý>IÒ»¯ °æo¿T£¹A›ùL èfœÞ ko #öÞþ~ìêºên%“øº'\‚¬UáMRkyÖ'L¥dc%hîAÙXÔ­5Yì1`'(ÂÚÒÙñHMãCÝ[>6+nºæ[7$©Zhf;ï•m¬LÍ÷Ò†tÿaz‹µ°d{½Çd#¥ó"§YÉ™“ë û‰ç +w‰”kuVÚµÔªÊúD,·Xç¾¥–e%˼¢Ô–¬¨xù•«$qÀãìNŸ8ŒÝ{¨FÞx*O½)Wºò‡¬6ø¦¬r–é‚4ϽÍ̓j„DçKng[[š_´k¿ªkå+=´Ž)uL©Cʲ†‰ÔÛÌùVð±+:Ûˆ˜jßl†„aÐ0Â'k#Ö7ÖØÙ™°¹9ass­Í ý^Ìþþ»»»¤iÆõ›7¯­qêä)Þ»|™ÑhȯýÚ¯rîÁ3ܺ~…ti¹q=âµW"þê!W¯f½Ûœ¹p“'>r“á$å_·Ì—9i^•;8ùÃ_íÛ£( Hâ^/f8ˆé÷O,åŸü|ÄŸÿYßY¦:ADMe柣@BQjÒ¬õM[kNl{ŒG Izâ‘áh‘1-ÉòÂù¥`4èa…£™ µ2ƒ®ƒ¢QBw€íÎ×¹-ú³ÖiI/<ÊU=Òãuëk¥dÝQǹŽUJ!UÐÎ¥ըɤÝJÖŽÎaë ‡:#½±LÖÚ–/½~öÆ'P9ÏvÍÍß8ÿAwf½Ý„¨6'ÞhãªÃÊyd‹¢¤(K²¼ Ï &k#zƒ „Œ›¹ö=ßSÀx Él6s[esÈi±®ÇØÇØÕvƒJ–ÿE÷ý7è@)^øÉ¼õö‹™±('‚+]àKìÙTÆR ËÎÓ?e…ö›±tmJ¤°”–¥³dÖ I™$\¿zƒÓ“˜÷ÞyáCB»ÙÓ‡‘h/ÆË+'CTd¨*ÛÌü» ¤Ò•˨Æñ÷—i©*¦ÙŒ5¹Žˆ ÇjÃdmÀúÆ‘Ý 4Gå!óòˆƒù¼ñÅ«žáÜÆr³$/ª†’­íR*Gúúî;oñö›o'1ÛÛ'9}æ,ý~Ÿá`è•Ãö}7îÚsk•£íTM¢/´ÝsŸ»jl£NnßšNÕÓ¶w›Í©p˜Õù‰µS¢uÙä[+å#3q­GZ×ñxÖJ6ÈSß®v h7kªÑ„H¬­üjVì_®5î0–VÒpð4"ÓQ|ÓÙ¸ %ê5iQ¶ó~úç¤ÊSÌÑU&AE2ŠýœÍÏÀ4,³‚ÍÉ€ñ qöá^?~V¦ñŠ·–×B.ŠŠÅ"%׎”Š,-ØÝŸòÄãg9wz›(T­@J?Gkdy¾Ý×ÜBÔ gÂ[m¼ ÎB¡ ù²`±Ì8:ZRxTÔ…ŽØÙr•hšæd9,ÕY&}g{ï¨Ïa„a‡]ž0]Zâ¨"T%BT„ma6M›»Îþu3ÒÆcl;ªc!·¨;ExŒÖ#¶·*–iÆr‘1-8<œ:Ÿµ'™½ñÆËüh¾äÑG?Ì`0à[ß~ŽÑ°Ï?ÿõ_c>›2›îSUW®^ãò;S^~I3Wœ:L¿¯Òû8js•ðÁÊçÙ!ÕjäaógÓr¶»<î•Öx‡Öm_ ë³SË6ÉE)E%Þ{mÚÒ˜æç´´[·«•ÆZ‰®¼ZÚ:~SMdª7{¥$hC $¥5«<_Ûœ Ƶ¹ÛLîbà9ßÔv'în5ß'LoÒK\T[¨$J9޶–¢,èÇ!;[kŽ ¥”¿%%V¸Yrã÷\cíÓWòeν)*z!ׯ0õø¹Ÿz”µA¯d ׆2t6f¿¸ºŒÁèªÉ‰®3§µ¶”©zx8çò•]†õµ!“ɈəmzIÀ°ï6ˆ@ Žf ÕãÔ‰-aƒcÝØ™q˜Ïøáí-â8¼G(S”¥³ð‰€Pe(¹S´6À& µö‹6ØçŒËzqò[@Gôz1“µ!;•›A-ÓéœÃ£9G¸ÈÌË»×ɋлû{hmyâ‰s42›ð¹Ï}žÞ`È7¾þ5Þ~ç=Þ{[òúküGš 4z>ñIøÝßÓ¼÷NÄ—ÿl‡õQBeÝ ¶2¤»67füü/Îøßþçœ8)(+IÅHmÚz¿¾öP )yé¬.Âk-„DA€A±Ì4=¡1^^æËŒùɻヌ.«fí\ŸôX,jÝ…bgsÀÁÑœýý9¹2(" »¤2ÎѲ>3èWÍ\‡p£†@JteÙ?š1HÜ:ƒ’£ÃŒ‹›\ži´0ΓecsÄôhÙ¸t¥™§)1bƂͭ Óƒ%e©™ÎR¤P¨_þô“_²ÚtNN¶½!©iXšË—ßãù=ÏõkW›„&)%q¿/ܤµæ8ˆ|­v6ÖÛ‹º3ÜnêTk¢îlÈâ¾éUÍf\GM6áÇ¢/k­Ñ”EFåçÖ®îZ¥uâŽ=f°=^ůTóMdj6P·¥=ö³žûuñy«mûúPÒf»ÖmòsY+Ý­½¼KœÞ Ÿ„ô#ç—us6Õ0¶³¢âÄö„a/&Œ"ïï´XL3ÿð«¦&EI–ºÖªò´âä‰5ž|üý8BNëú–õA[v¬YuÞuejÓœ±ÖytKÍ,͸ugÊ{—ost”râÄ„s§wØÞ^c4HôBâØã…kO¥YN¨BúkÛ„½‘;mWHß àÌøÃ"†`@¯—$.°> C÷PI…=‚pŽÂƒ±eghGõ…ÍbÝaÕû–¸>@"Žýœ6i¢2·:^ëõõ5ÆÃ>½^ÌáÑ!?þñ h'Ïœãòå+¼øâË<öá'¹pá"½^Âh8"]f\½^ðúëð“ŸÀóσ 5ŸúÜzjÆÖ–a­ß£ßÒO†OüÂ{œ99âËÿÏ&2p§ké^¯Q¹Ã ·ÖÕfà=ÁÂÝ Òµ+m½­ ËrŽfKf³”4Ë[†m7<ëÝE¥9µ9Dùùq¨vÓ?gCÞñ–¨ôÐiŽ4'VÃ]ÝI=òpªl·I·~ìÀK”S–× n鳩…çB³ÒÞÇ´8ÎʶZ4•w½îhíGEÆi\çÑ`QLÎ<ŒTª­ m+Š¥=hÓIò¼l~•EIQTT¥íî-;³s!XUUܺu‹_|‘áp¸b½Üœh=_€H±’Úu/•ä˜Ç¹ûq]5í?@½Ý‹§iƵ3^~éET` d©ëÆÔER½Î)FWœ<÷Ò^%%™qb?ã*a’—S:¿¬T’ª,"dmç ï¾ö"§†nݼ‰”’A/bkk k!MsŒ…~ÒÇËt‘"¤åüæ´,É‹ÂÍÿ+Ãh˜Ç!{ûSŒµDQÀÚ¸ïÜ4ZpfãÑó|Î{GW:i…’¼,Q°LSÂh›)«ŠÊTŒƒ1QŸñ­©J¯ ùåO=ù¥&^P¬n8 ¾c(E–æ\½zË—/óæ›oñöÛï²6Yc}câÅêšNw¤v^Õ-oáÕtÇW5î®É8­[Þ¦Kói«lq,¢ÔŠv“>0i y!ø~òà0mæ£]6½ÖUUE–ell8b_À‰-WTÕ$³®n…ïéêÙÕq´ø+•½ßÿÿÒ4#ÍC¾þµo"¥–¥ËP÷Ùä5L&ç)·wI¦ý= ÜÈ2ò&[i—¨FTyîF¤‚Í ž=¹Í+/¿€ÑnäØïÇM†w^” zQp8]8Ká@2²³#¤”ä…óSz ÓyŠ¢8dûĘSÉ…ì¦{\=º†)$ËbIå#@ËÊ4÷DUêæý zÈ@aŒ&ôÃ>‡³yQ’„ÃaÌb™£>ÿKO|É6¦|Ñv3¬k×P·°m+rªgwÚh–Ë%¯¿ú?üáóܺu›~¿ï’ˆTÐAÏqÏiëØÈŽ ¨¶aµB‡)¬Sµ®v^:Â-Ž}­¦ßÝž€EG½ÛTÖ~\äyž¡µFIupBtf2öø×mÎq—^ÿn콟S[ÑŽ§zÙ°¨EˆÂ|1¿Æ°“$Š^¤\k»Q¯Kв¢(5'w6é' }ua0¬´Íé×\»³™Ý;XV¤yɰóÌ“çIÂØU,¾2Bx1×j.÷*½ÌÍݪҗóÅ’ËWoSU–‡/bksD’¸J9 $ÏPöû±Õq€uL¦R$QÈÑÑ£t‘cLM޵©NÈÒë%ÄqL’$Mx@7D`¹tD¥²,ÀL]¡+ZìDtÖ©&¸§îºÔˆÎu¯«8ˆH»\ëÑxÀúÚˆ5¶·&lo9‘Ùxõwuqq­¿Ø~+æeá³WqÕc5 Œ“‘iǬ) ÎqkA*Ÿ¼ä Rú8¹º‚+\ì&Ô½{/›N«¯TtY’ÝâÌfŸÐœôÌa0VRjMQ9&ñ°ï„SRúˆGÑÜé(GÒë=¢IÇ1–[» þñO?„T«üû¨q¢˜±Úo´P­µ `°–ùbÁ;ïÞáá‹'õD±B²Ik`/^¤×%ÖÕÑ‹RÍõ´”Ý}åï­+Ò¢ ‰œP­¦ª£2ÔË IDATÕ½^¯×(iµÖìïï;2—è°ÃëÑH'i©™›ë6¬ØÔzïí¶M{·­éD…D2l6ëÑp@¥×ÜB:5ôôhÎþáÌçZOÙ½s•ÙlAQh¾û½²L+N:Íëo¾ÇÚdÂg?ûYfó9ßøÚW˜OÜ|éÿþ¿Y ¥ ¼E`$‘TJmI¤åNqˆÖ.£Ù‹k½S¬«††%ü3ç|²šYª½{µsT1ÉšÞºqȉÍ!‘ß,Ë¢jÔ÷¥Tá<ïXça °h¸øQiÚ-\WÌ`h1¡¢=(7Õ¸+v»°oÛñ÷}}(¨ïYéÛòõš ¤X Þ9nõ¬õ)tº}M§Î€¥¢²ÆùŸ ÿ»÷žqÒ&WÑf 8ÿµÓË4íðšNØŒïlcAÒÂå›F¡ÛÈŠ¢h“®µ/›D«åré=Ó“‘rþs¼û¡“aß) ÜáÝÚÕâ¤+j«ÛÍ¿±ÒYZµYµB¿úߢ(dçă^àZÓõQÇ3'”h4µ/<½s•MSá’×*Uaˆ". a`ƒ “^S"ÑyN˜@…åÙÏ|oüùÿÎÖæûûû¤i¥OƒƒÅ2åÆuCeépž"g ÆÜ¹{a]œkÀ£;âpºäêáu^ß}ÓQ'µ¦ª$eU±±>àd‹ü #ÏËæL’1eé¯ÓYÊ ß' C/ØÔœ[?ËÍåu–Ëœý£9½$&pí\ƒ4 ›,Sá Ü]9S€¡2îóÂd×~¶ÍH¶nÁwáÓ/½ø2?~þ'ŒFΞ=˹sç‡ ‡·awf³tà'܇±l»‘’]•!tС¶³è¶ I²îußõâYgîÚÕìgm}[ÂW‹å»˜»¸R„A€ðóGwð !9п«0ëT)œ¦ÞÄ{Uõ›‘ÆúÌ[šŠ¶Þ¸u•3Ž]å‘DNôx{‰±ÎÊ‚vsÇ£a(;ÉO^`.dÓU0¶­SÖ¶Ž’·¹øà&“ñÐ-z@šÍ½2—kT®ÎVR”%ºrjÉÅ"åðpÁ³O^$ •*p_SúûFtÖã"+kß,÷ØGúƒEžºy“q I!q^BÚ>rí Ãét @ÇŽÔVí¯ëb}Ü:ÙFE [Ó×Z;ÚÝs®ee$Žèä› #‚Ð(?kî³¾>¦(+– —¾u8sx8u3Gyå•çùûïg<þØôû}¾ý¿# >ûù/`ó’ìîœÃr[7¯3Ÿ-½IpKïƒ6Ti@•JFLèÅ ©Yr¤‘bØöûþÚú1JQ’eUU6v¿fk©Å“þŒ®¤ ”²sØ–-åíkª`oôÖ>'7ŸàÑKóÿü?0™¬yÆ€!R’~?æàhÙ¼ç*v6]œÛ:EZ¥T©`Ž(‚Œ#u— ¨¬óÛKI…î}#.^§W ˜‹%abJ½‚îõ" § ï%×(²hÎF¹ÃB\ÅZËl¾p‡Tc§â®g¢¢#²ªç„~Ó@û5ß-bŽ‘ÛZV„?8IEŠ,+xã·xûíwˆ¢)Ï<û gÏœu!­WÄ`n¦cï›IÝüÞõÙ6ŠÛÎÖáƒ×)!hÔËõlñ¸ïª›FuÜ3ZUEÛÊó ÿ^¯OEÎǬµðˆ¥¦¥¶i¹«¡¬IW‰ )±MâT‹ûìVf”„qHxŸ`àæˆ'Œq9ª’Jà·-:ã-uª—u¯£Ðl®e^g9ÖÀcz!UÓ>7+d7ÑrÙ:aZ;uiYV­9š¥H,—.>@ÍüQÖøeSgšµ}1å5nÑ+3ßö~Ľ°„(¬T•f¶H)òœ × }jMÌçsò<'I’ƾRY….ÛÇ5ôwíê‡Nd¢¬½ûÂu]œõF¬Ì-ß`êч±ÐiÝJIœÄDqD?‰Y[°½³AžåÌ)³Ù’ƒƒ)û^¾¿ÈíÛ×È Ç“O>ú$wì.×®ßâSŸþ,ãáo|í/yëÝËyU5¨Pk!"Bp~p‘dƒ»á &k‘;Øx%{Ì Ešô1-WÝyqת´V%¬å[GìNS>ý±sH¡¢ìtŽªþE…Å(K ,èÕ4! õ„8i‘(ßµ›q=Ûn6ä‰*Ç›mÛ&¦´¡É¦K×=߬$ÜCïž'SϥݠY‡ê´_3´p0ÁTFØckGÑ «4BÿsÔÏ{½G–¥f™j,½^ØTÎõk¯5@QQ–;[Š$qÂΚª¶:›¸ŸHÌÞ·=Ýöå ÷´;»ø½Ãëæùµ”ÌùÐcæ›ßú6Ê ƒI1L"×=ð¨R]BozÀbã$ÚWµVUÁY;¤—ŽÙÉû$ùƒ\­IÅ]y›[Ó÷˜ýä¯xèÑG‰“ˆï~ç»üæ¿ú×üéÿƒ¡; ïÝ="Ë*wÿXK(òÜE—®­õ¹89Onr^ºù:7×Éâ!Òø±"–ÍÍ wvÝaK–åeIY.P6d}½Ïbš±XæÜ=˜‡¡#CÃt¶`m²N/ ÉŠ’Û{û$ôH˜¸0.Q_üå§¿$êù›íä'w] SMªUœtæ7õ‘¾ª¤£r5¹¢^O•8–|徆]ŠÔsDß^:HÑFwR¦è´q iš2Î,ŸË.VMÅå *%8ÇY¶ -üÄvçõÆ"¨«CúID„ž!,=çÚå^WYqb{½©&dǦBÒee£|¯gMy^Wwî.¸tq‡µÑÔ3`Ù¨¾ÛöÜê{TÊçyAYUÌÃÙÓ;DAàg…n–¸Îà–ÚW)+M³Iw*œº•·šUëË,gÿ(ã(~Š~â ê_u…1›ÍšÍZyŠ” lé‹Ó´J›+Ô±v3”Wò›1(?Ú¨Emõ$Æ×2n 5ÍšÖfƒãã˜- I"'2[40”ím§ ßX3ôH’ˆ»w÷øÑ ?Àˆ€‡>ô8ï¾w…—^z™ÇŸú.=B†ôz}²,c±Ì$@£Éâ¯ÆôåˆSñ$=I¤"Th›•ÚîSp­?@× ‘Z5†®³%qºøFye¸qwÎC§×¥´lyHˆM°‰hTóXpâªfãgѲw³ÜõSMl©lD|íýÒý³¶ñM7‡Âû&õÑt·í}êÚÓ®ÍoK¨ÓÚ.Œv=ÚÉ™ Œ·OµcãÏ~ÇRZw©´qíq÷Þ~Æi™Ísfs£ˆ8Žé÷û$IÒxÖÃ0d00¹xá„ÕŒpo/‹£°6RNeiš{0ÊŒƒƒ#ö÷]…ýÆ/’ey^ñÜßý=ýèÇxðÂ%¾ñµ¯òô3á™§žàW~Ì·žû.2 úô×BLPPûAJ c¹É‰å9^2/a;@J¢«ÖÍP·FëÍYHIGôâ¥$Ú8ñOU*ª²b±¬øñ[»|ü±“…ö£Î†)×LªÉ\Ò8/±‚@¸¬à T„Œu©íVÈ&ƶµ]¹õ©nÏ6s÷`ì3­ï~XºÝÛj^:Õíñ QgìI¨Ú®£Cͺ›£–ÉɳީOGwÓ)Fñ™”HašÃF˜À­]JIÒLƒŒŽ¢æ^–2¢†9ªÜh˜ðà™¡'«‰&u®½~â^l§ý€XÉš§í,æï—vÕA ‹ÞÙÙd}2ö]Xí %ÉF¸ÎéÞI–fÉ™AŸ}qÈe}™¢*¸zûeÎüi®ˆW#Í( ±R°H²ÔXÁ@*ta*C˜„„ýiž`}¤81ÙæßüÖoò?ü»ßæ—>óiþ?ü#öA¸õ]@i5;ñIv¶$¯\‹Åu‹œu¹Ñ>“ÞBµH©¼ÛCëå£WOlOHú!û{3–™cÛÛB‘ë”0Ø\_£( Š£A ûÜ=˜7÷‚’®PNbÅ™µdUJ ¤k)é*!º2ŧ¦>…÷Ì ã¯ÛÔ‹Ê=58BùH@íá'u¨úÑÎ1kkEü’.S²,åo¿ù7¨@qâÄIΟ¿@’$ŒÇkM.n]žXì}xàþ„ßm¹u€+­ó®˜§ó`Ö äF8fL³Y·£iNÓ¢¦r™vnGÓÖZÂ0rI@R5‘xÍ/*Æè{ÙàÂŒµ„Tž3ì,Uª©(B:5|¿º¹qÇd„¯ZëÓnç``¥Å–ÞÚ¡áµ7wyæñÓDqØÌ…œˆg5×[øvmmÇÓÆùö´1•a‘Êˊã)²*bÔ“+ ­5GGG+ qM}ÿa4&ŒÖè‰óÙU9ÃT ´›¯Þ^± vªiá9ÂÆØ.‡Âµf¥Åh/bQ²vt¬-ÞËÛ¤9ù’3 C‚0 éÅŽ¾1¦8µÅb‘:‘Ùtξ߬§ìOù›¿ùÉO}âgÑeÅ׿ñWœ¿x‘ßü­ßáðÿ#ìÍ‚-»Îû¾ßöÞgºçÎÝ 4b Hš”LQÔT"mE)%e'eY’¥ÈRž’¨$çÁyÆ{ʪâòcR.§—‘’%:±Äœ@‘I€z@Ow¾÷ {Xkåa {íÓ2ªPº·oŸ³ÏúÖ÷}ÿÿïò)jšnÍ£Gü÷E‹Eð »Çéúd]2wûHWbÜ)•žpÑ® 1p ,5UU¤.M;( I#Z¬1H)xïÃsž9˜ñÒ3Û´­Ñ%x‰V‚¶Ãw ÑÆ¨ük…­¼ZºKÿ­¼6@C!\¸ˆ‹^Ø&T*>Ræ—à¾ų+ `ijqùO»Õþ™uáÛ‰tBâŒïž]ÀJ­i}¹v&ÚÈâz§  .ö"°¼mØQFÛèb˜óžC˜ªÊ§¢ÍçcvwúøÑ8eè}]ö?™ùRû &›yÑnc¾9Þv×4å‚q ¯Ü|…rí-NN¶TºâžyŸ††³õ’ŲfÙ4cЧ°²AM¶¶LG‹¶C(PÊ P¸®c4.i¯*%¨¦SŠç*Fõ§çç+îß¹K¡Çüü/ü<ß|ã(­˜O§Ðj*;æáé1­\±êÖØ…¦í çÕ1Ÿ¸ñ2w.ï±X®£÷!%;ÛS¬œœ-¸\4ŒªÓé„‹Ë5ÇÝ1‡Õ-¬ôÀ™Ë«ãIų7÷89»d±lB‚ªTÔëšÖ9voÌùøüŽWÇh­e‚KDP¹÷¸Zœ“ˆ"ìM­ÅID´qD*-U¡ýadMÌÆâ8¾ì;¯”…õÑoBÐ4&Üîú‡À›ùáÑ£‡ KLJ‡0Æ•£QÅd2bww‹u½G]7\^zæòÉé'Ç眜^pçƒsqqEgßø?ó¹ÏñÉ×^á»ßý:£JóëÿðwéÚß|ãßóðñ)'§KV«–¦^°Z?¢m:Œ±LÕŒÇ/±4 N»¬ôVD­ý³ƒ*ŠÂ¯Elg1ªëÓ¬áO¾þ>¿ò¹çùøó»tÆÑ´žìc^{ØÖøÌváRS£F„d»6¤d!PBx‘›ðJà~™üÊÑ·O'ùÔJô9Ïb]Š7 ªÿ<û]s„˜ðYh;Kç+7RWèrœ¦IÇ‹aE¯’ÖRbØ^›QÆ9e4–©ahÛ6=»EQ¤Ì󢨸q ¨ /Š“Òõ°¨bwÃ×h(ËPžY°b£SÎçþ±ˆ_‹Í uø=&SASÔÜ;}Ýjöª9K§)¬òpöÄKpS/ÀÖ”ã)¦íPÂGî¶ÖbE‡”¼q¥ –tPHpÆrx¸Çz}Iݶ\¼wÆó?÷“Ù„ýr›—nÜæ¯¼Í㋇ÈÖã8#ÂVÃî|Îy{©a•Òÿûd:ÂGµjX.×4[SthzË¢`v¨Ñ‹]=áâjÉj]sã`ÎÃm>¸ûëó­1{»3?9cߢ üàÑiÚõÿËϽí q§£”LÙÈ‘”òÂE‘O3uô€¨~Mñm!Á¤ŒøƒV)>PÙ$=lŒtŒQ…®7óÎ;oszvÂéÉ©§DiÍh4ʨOCägìdD Š!høacê”Í›ºêÈ"ÌðΚþÇ£Ôô™Ê&`ç¬1~¤º«®kY.W\]]%Ú–ÈÆA6B\ÂX]®©„a4.(uA!½xD¬Ö~ÿ§Cî­oÔÝ ïš0îŽ{¹¨7¥í‹•W]ß¼±2¥UÂ1<–´˜DS7ç+FUÁáÁ6UÆÆŽ{옎èóɉc1“;O)J-_¬±!= i;NN/¹´âÿüË3ÎÏχxkk ­5Ëå2æ\D“{œ‡¹â⩨¾ÈQ”SF“gÐÅv pÝ £Œ·a‘í/"Ýn@w"‡• 5!ÿ\"ß¾§ò •ÆñâZšqU±µ5fgwÎþÞ‡{ìlsp°ÃîΜñ¸¢($ï¿ÿ>ÿá/¿ÊÁásìïßâ?øk?>æµ×~†ùÎMœŒF?>âòj k¬ÚÖœvÇ´®åÙÑs8é#¶ª™_¹”0I<Óv–¦ñ>^“é3Þ½Š”’ýíIšÆ8H~f±ñúy>¾ —Ì0f¶„ýuŸf•èD¿s–Bd–©,çYö‘–ñY‹ÄC™­Ñ†‚1Ñ_Lm¯†6¾N‡±ÿ<¹$YŒ¹ñÒ'“mP„o®êÏJŠ¥‰V«°>ëŒ'‘µv–øÐuUUQFTÕˆ[‡šÝm‰Ò:¨¿Õ !ìe–¹^w9”Êä ’Ü „”ƒf9jVrŸôÈÄ:ÇÞÞ.ÿò_ý m½)ý³“9ëº ûܰ6ì¯~þ ¸q‰5ޱ°´8¤s”…¿ø+Û2š–'(MMWyeõ¤i9íVÌŸyŽoþÙ—iO\ÔG|ö¥ŸãÎýX.éZËjÝøà—Ùk EY`Œa<*¹X.™²ÅÂ,ØÝb:¯5Ð*ð„£n¤”ìîN¹¸Xú÷SÀÈM¹l¯ØÞžxmgè:Çj]c­eTŒ¹½}‹Ýò€»ç÷©Åš³Ë+&b õ›ÿàs¯GÓ¿ãר:&Øw¼5 ÷¢¥'¼ôß X/3Dˆvì…Þ¬î]fè8´òÖ¸3Bô{áQ÷°År¹âìôœû÷ïq÷î=Þyç'ŒÇc¶··{¯²Ëv-iDEº$HÙˆÔ‹>=*岆Ÿ3‰=ìÒ;ÛãùlØÅÆqWB^—†0wqÜ/| {ÝP7 ëz¦‘ fq¦£lN(4Œ+«€e”!Ï6Êô…À‡Ñ«^Ñ*…  ‡P@œÄÅQ޶u¬kÃÑÙ©{sdè@“­$ù\ŠÇLxÁÎP×u@ØÁ­›{Œª ]¨l-ÓŽÏe6–T¼¢öHa‘Q]›¦h6ìœ G§üå÷/øú2²ŽŽhš†ù|>ð†ÆbmzÑ OajsÌc^Ƚ²^£Ë9E¹CQíS”»X³FØu²ùKVÜ8F±bŸäÙÓ¤ Í`ï篻,š9Úrž•º”þTš²(˜LFL'cv¶gìïmsx°—DfAºËÕå9|ðñÁ‡œž_rpðŒw\¼ý÷W~•Ïþç8~ü„ÓÓ‹Œ wå핪¢`\ŒxF?‹–Æ5Þë¹ö1™ë¦ ¡¾ÛÄÁG<8ºä•Û; $ˆJÂ#‘)ƒ] KCÆý1ƒ÷&>ç*#•Å¢‘­ÇHâ@/Ì‘½Ã=TZLI¶Èô)oˆº—ùá3ì>ûbzŸ¢0Ud“?—íãcC]$±­»1Ö•ƒËdQƒí/¨7@Ê»<2ˆB<µÚ¦6„<(ƒxú9Ý,Þù^{€qÜX 8Jó¥/ý.ÏÏ@ ŠR'pלqÔ­IÍNgZ>ö™Ÿ¡ØÛÂv–Jz*šp–­‘¢”uL§šN)жÁ~:U:C« ãñˆ—_|…¯~éKæùŸ~‰î½G[·8ç£yuÈ‡ç™ŸŠøT±u×°]ÌÍ<·¾iZ#qŽºöMƒé UéQ²«eCÓ4\ÕWìè].›EH)ó ÍÖlľ…5Žóæœ“Õ W땯æó õ[¿þs¯ç]DÊjMms_ˆEüpHïUM ùmWôÙªÂõI²WZïT\4 #ÓDµ”"í·¦ž¸È45wïÞå¯þêû,— Ú® ~³1JK¿ÇÍ%"#Úå¡ëQfIÐØ={~jü@Ú¾ÓÎ:JëúIL^n¯I«²ƒ”œxh»ŽÕjå“kŒÓ0 ªª *îÖ˜–Wá?KþÚÄ3dˆ—}j]þç×\­féuŠN„¨ÚŽ…Zë‚Ã=˜]Ÿæ•ª{æ<ò2&¤qŽä©6zà‹Þ䕆ì|~9(ÒBÖuÍÙ™á;ßúBiŠRSJ¯X¯ýºÌÚÈÔðz¦go|Œù«Ïcו–”¥Æ˜–i!±J Œ Ói:D¾Ù±cê¢aÕ­¸}sŸ¯}å˨•ä/¾óu~ç¿ú]Þüî›XçÏ^¯Ìîê´* ¿–³†b¤Ø®æœ^œÑ¶Þ×?T4MËrí-„U©9;_y—µ>v\Ñ56L,Å­­>ñÌKâèê„¶m‚Ì[¸”V~ªð~ã^OjJdzQ2³ãC­Ç6 "Ú0§Ód1m2 £ˆÅ#pSAŽÝ{.Öê¥ùvw=Ý'¥çÜÿðCîÞ¹Ç{ï¿Ï½»÷™oÏÙÞÞî?›Šà ¾¶Aá‘PæýÓ6CZöÅÚѧÐå‹+„ IDAT}±¶Wü3Ü‘÷PÒ­Ûe>Jö×~§e°]Ã\w¾8­üz!ª£%ñ²¤–™.C¾@¨°¶¿TµÆ²ª[ÖmÇ|{ÊÖlÂ|k‚›è©Íâ\×-«ºc¹jËÁÞ6e©S×Bß÷ ÑÉvᙺR*” Ï6 D‚7¸YÜòädÁŸç!o?êÐÊ"Y98¬^x᪪JEu¹\ºö\\ó7åë óÐ6Ò³Óu1CémŠj‡²ÚGHMÛ\ ÆÚ"$ñ2½èœÍ^g<‹l o… Mºùýõ—ŸÀ/‹dßšmMØßótDŽìû¢ –?¼ÇÑÑuÓðäø˜ýýCvvwùÉ;ïpûùçøOþî¯0—4«KJÎ —Í’e[Óº–ÎÖÍšCõ Ê)Ý"ͤTŒG‹Ž—<{8A ÕYÙ‘dê0e²oÆ•U\ƒ©Èå– MD@ƒfyTEHžrýY/¡Â ûNæ6ûü;?ÚŽí+±Xvn¾Àîí—½;#-Å`ª—ºç,c€˜I áÙÕ¸×tÅap"¤B]–T•äæ~ë'’Z&’d8ó´xKln±Ql³„+!®ñFoO„&b=õÿ@]׬ë‚/}éß…|nÿžú¤;ƒiýÄ¥ à‹c*JnýÒç)×5Z ¶&MÝ0*<¹±ÒJX¤–tAÉ% ¶’8 ”šÑd‹óï}@S,xrtÌt6ãøø$Õ—ñÈ ëš¶cg>åÆá©W—kÛ¢]ÁÊÔH`:™0N(´¦ëZfÓqÏwaâ訛ŽÑ¸à…ƒg8œï¡ÚŠ“ú˜¶ZÓ¶뺥,4;ÛêºM8V­ê·ã_‡eúpÙƒëÇ<ü2Œc8ÏEâÞÊlÔæôQY™üˆb@´Ê÷2ª÷bøN\ 1Œigl{˜JŒ4ÙÙ6~×ûö;ïð÷~ÈÉÉ)Õ¨ÂYç-PB ŒRBœŒ½­Ç‘æð’8wqnmMçùÙÃÄ.;¸)»”ÅìlßIù¯#˜Ús¦#lhÞŽ¢„'ØÄÝ›Ÿ—}nòøö#W?â ¾f'°ÂÙÖø›]Yl‡âL¦Š#6F]"ìH»Î° ÁuÝpx°Ít2JLÚaƒqd\{ô ”(ì±?z|ñê¶c±ªyÿÁ_yóž Š" N5ŒJ›|¸JyÊÛÖÖ–¿”…Ãàº"‹tƒ_×Uç‡z„ÈÇô›#{Ÿ–¤ÑÅãém”žø`øJÚ.¶ËQ:œlqQ´Ô[¯dÎÀ{®|RÈgëAg³KÒ°`WeAU•L&óí-öv·ÙÛ›³¿·ÍÞÞ6»{s¶¶&TUA×Ö¼ýÎÛ¼÷Þ{|òSŸ¦,+¾ÿWo²½³Ç+¯~‚Ý]æÓ)BHÎ/®|ðŒµÔmCÓ´­Žè\ÇHŽ©1…ôkšÙ¸ ëÚñàhÉávécøèž½/Þ¿8‘§-2®¶ ϾR½>†ŒÖwÕnã¢ïmp9çŸÌƒïDÎÃ3’ìÕ[¬è¹ómg| ¨ó¬ÉÎM¶ŸI!>"Ä̺Ao0ÙAgƒ€ÚNr¹ÐƒÏOœ þV’ƒ†B“M!669íÚñv^p¯ ¿æ:ŠÁB½ì°4²§5ªªäÉIÃÿýýÛpfä¶H‚WL N:´’¬W—üí_ý{L\M¡³qE]7Ò…3Q{¿„Ö´p^Œk4ÝH¢ ¹yÈO}ì|çkÎÙÙ ¿ñ[¿Ãw¾ùM„”…âæ­ʹ»Î2®FH$gKŒ3<³u§:š®£é|n÷|>FKÅñÙ•wÝ’ùÖ˜®38+¹½ƒå3œ­O¸s~Ï?sÖ»Gš¶¥ÐÊÛÃä5â’Õïýö/¿=X"…›÷Å2™ñ‚1Þþe‘pYÄ£ Á~ÿçǪ2Û‹&Õj' ™ßš]$bƒ:œ<I(3fG %vªxŸŸ_ðî{ðþûwxçwiš†ÉdBUVá÷p TòTÒL Ø´Nnk†1·@øÑL!ZjrX~ ˆ§“ù­ƒÃrAYjJ­¼'XD”öqy>‚ϧUIÑïùe˜€ˆäC”iÁá/Ö9œô‡ö¨*)JO*¡°p6 z¬µÔÖè:C³®¹ýìA`'Ç×Ef´¦,-(އcç„6Dó™.N1^òÝwOø¾uÄï/Y´ÂûÁ‹p(4eYP•Šª„ÉX°·;£í ö·é‚hot’¾ã¡·—z]A¿®xçÿïP|‹MéwÖå.ºÜCJ³ ™!V2ƒe¤@á†Ñª±8G{˜s›Ð¦ž!ž%SÅ3O…SJSвòÁÓÙ˜ù|ÆÞ½öö·Ù £ñétÌññ>|ÀºéxrtŒÔ%ÕxÊÇO8¿ZòÚ§>ÍÁþ?âü₦‰Ý¥u-k°ÂP»zŸ‰ØÂè5Ö œ¬ÙkÀ…˹È&qùÑ äâ”Ç YeÏæNuËvÿ1üÁƒrlp#ˆžöÃÃÔ¼–’„N¹oß&%·woø¯uó㟥¨ÆÃðŶ²Wè3ìâ“~KÁêÁÅ1vÏ}­Ðº ,{Û™¾"K.+œî:«TV¬ÝvîÿD?gžM:ãSáù»\XþäKš¢cðkͶõ‘R ëºæ~þ×¼/|\iêÖC†”tžÝ×aΡÞ×IТÂhow¬WW¾ð?õâó|ãkÁ×ßø&ÿÝüßþö·Jë”_C6uÃhTQ– t¡™íl‹=NVg~MØ´Hó­)gKœƒÑ¨äæ­m‹›¸ZqÚœòþéT[rÕ,°ÖÑ„ËG®v]ïÚßßò(Ýßýí_~=€ûRªŒ Ù@T…ô‡P[“¡€GQ‚Ê»‘ »—+´½]Hf ‘¢é¬u)¯t‘éà$^ázÞ©‹ —YRwÖÒ5<â­¿þ!GÇ'œžœ ƒò¸(ªdŒ9Ì6p±“øËEÅ·K¸ PnkÝScøXüû Í_<‹«ŒB’’–ݪ ”©°ŸÃ¡µç€G!ŸŠk†„Ë”=YMDmöZ†°„(žÑEA¡U “ɹ͹^…ÿêŒl[ËÙéû»[ìlMûu’H§ó{l™Ô™i´г þÎx<èñÙo~ÿ=¾õÖC¾òÝG|ã+>8nÃÝ ¡|·\ø‹K¡ýÅ¢ˆ„gWkNŽïrrtg×EåDºJ]TBTfjþëvÔ›ÿž‹Ç†#{±¡Ãà*•DéEuˆÔÓt ú÷ÊöP” ÚÃDT)‘*vÛd0Šêl¬ý”Œ;G©RI´Rh¥¨ª’élÌÖÖ”íù;;3vvæìlo1›MüCƒ?äíŸü„rÚ[ÌTÐéJÑáœÄšÑJ^ü[?ÍíÛ7ùþw¿ÃréÃ)ÎÏ/üg$|Lê@ýÚÛŸ°\64I×m‹)XÖX®–5‹Uƒ 8剜qPÝ •5wÎîS–:%;f“ ó¨a/öçÇÎö(a@wvæìÌǨüÛ_x=µ1ñB%’ð$î4eøPD¶«}'’BÕãcåRðJ|c)}x‚@Œîâ¹Íu‰ƒ4¥þí¸¼Û‰…Û:—¬0žæ;¹ÅbÁéÉ)wîÞãî{¼ûî{ŒÇ#f³­°4}qw}AÆmt0 Xâ2çû)7èÂDd9GïtRmºÔôŒdÇ´0æ C—Œ˜Œ£mÙ¯"× ºŠ"ÿûª´Ë³ñCEù' Î4ÎË×IAuÇyëÕŠ½½-vwf!Ÿ5ùŦúñoRV‹…Øb:¯f_.×¼ñãSÕŒÐ(­ýe$„”ø]PUEYøB]ùÆâ]eÒ%…B¸Ž¶9{‰iϸ³Cªñ`b³YŒ7GصçÝü±ê²óË€WEA¾KQí!ÕÔë!ºU}E±ŽÙ¸5G%gI\2¢\Vò NögêŸC„ºO*Ò´LkEYiŸo= ùÖ;[Ì·ùÚÇ1]Íbá=Ù&\t ­k0§lÕKÍÖÄRh’X1®kd8{toHÁ .¥]9²ËooQë/î$ž· —™$ ûW&Fþ†üs 8ßõ8!Sú[Û™0š´P"(ÊŠý^Cj9H†Šç¼. !üë®<<ê eœjzM kÿßž5ŒJ&Ëâ€lç6ìTdŠíüÏŸûŸâÚÞRÑë*ú)†ÈÕ·›ÍC¨”’û÷?dÝT|ó7|`OrÀ@ÛÚÎ$Û¯uÞýsc~ƒÃ_ –ЬהZÓ˜¡5V€t°¶6°5|¬ P5#.hÂPr~tÊéUÍáÇ_áÓŸÿ<|ï{|á—¿À7Þø6·]5-mÈõnš–B—ÔM|ìs¹Ã£ËcºÎ¢¥@iøÄÍW‰1'«SNVG\.¯hCgÜËÎÞ”[Ó›/1ÆÇ ŒGš;X'X,›À¥˜ ~ïwþÎëÑ^•º€då>ŒÚãsĆÁøý¸)~¨â(ŠÊ¤êãÝ çÇSAͶ9nNy­{7Æ’EVv"ŒÅ7Ýe¾Ó—•I–†˜s÷î=Þzë-ÖËU*„q "íž !„Ý¡ÛðÇnÙ&•£¿‘»Ì>Sl†y®þ5«šR)…¾[ lkRp}ø|)™YÛN‚Mmo-óQ‰b èJ7ï 0O…ùèBn„`4ª¼j[éÄ‘<ÏbXLRþo°IRŒlçC6Ïð~÷þ%ïŸéÐ)©àñV”…W%—a¤]U"XiŸ+]”eØÅ:ŒÂ5Ziï/dÈôHϦ>ÂÚ)ƒg[êxlS4¶©<Z,öQ"2žŸ¥ñz‘ƒRUƒk=öv,Û‚3‰yøqurÐ õkŸ8’ Ây’ÞÂöÂI4‰µÆŽ^áw×ãqÅ|kÆÖ|Êl:f6›2™Œ(K¯š¿º¼äþ‡÷iÛ–çž{žÕrÉ“£'<óìmnÞdT>ºó.€¸o4Ö lÉÂ,™OtšêäÄ=•<Ï‘žå:^Óµ(2Mp½n%ò²=¯ÀÚajÞ6È5k]ÄúÊ~¿oý¥Û:Úе¡ ÜŒ&Û¼ô‰áh8K eÙä9œ‘,ËO óݺ=`§éÏØØñKùÔç¹”AÞoX¦¤xš26XñˆAƒßR櫵Üî&RÃW?ÏÜÚçoÀo¼Á†ÂcúxbVEé=àÏ}òÓ,µÄu-…”´AÕß eÕÚàÇ÷,w%$­ë¸4 ­¥kݺåêAË«‡Œé÷ ·Õ²T<|ôˆ(@Áx<æùç_d6ÛNaãQ0f’0,3kD“x‰. Á§mUÒcDUt¤°Ylb¹Ê¤Þö‡ÉpO<¬ÄÀ¦èb!Nc¨L€±†Q—-E(‚*ä·f³Ea㺞°#ì&qÓ54]Ç[ïŸñý»&uH±““',ãîMÉ4âS*dK‡ŽO+(La_'%Z t!ÑBJ^ì,m}L[Ÿ¤C}kûEŠÑ®§9û‘]tÜÆÏ…†O)†ìnqí^[d©]Rj„ÚAémt飶ÚõºöÂORfQ½u,N¿œM±ˆ}ÐHfΈ˜’2¯Ã¤Çw¹6]FeøËB#Ä8ìÿ£ª`;ì­¯®–\†¿¯®–,+<¸KÛú®s¹ª¹uóYªñŒ“Ó æÛ;¾z““ã#Ž?dGrfN¸|")”â§«2¬Ú@ Eð 2üùµ Él2®¯¼ølJS*î˜}–p!¼òÚ׬Ná\øy6;¢ÀÌx}FÜIŽCg Öu½“#TÚjk«·R&_ÖÑŠŒÒá\p,ÀÉ™X£63äã{:Ÿµ^­Üoùf{ª¢pOS½ò0è -œ~0)sÏô5b±HÅËOZÇGˆÌHëIç ÐŠÉXSU]׆/ç…«¶…b²‹èÙÙ ËõŠv¼…Pc:l¡Áyêâªii@Yå÷Æù‹ž5ØVÐ‰ŽµÑuÐVœ^¬ùɽ'8Yðó¿ÿG|ïŸþ>“é6B.™Í¦œœ^д¥1”JÐ4 «uËl>â…ÝÛßðC>\Üg]M‘DV…doÎÃGgtm‹p>\iÑÕŒÝ -û[<~tNÓtœ]!¥¢3ž×°X-Q¿÷;_|=vJ=?X$.m£‰>‡5uÙ.-Öýî(þZ™¼ˆôè½ÜdzbH“Š»jgIã\ÈÇ+Þ¶‚>S~”ëcoËPÅé(»ërŽƒý4ìøŒ14MÍ£‡xðà>«ÕÂwÕTQd¯W®ò}z – ßp®O¬` [jP}žÓ«¤  ÅH¦iD_A}9²Ý}d<‡©ü€vñµ‰ô5àH'ñJ,ä")󕪡}ç,û¼sÙ{)ÓÁ*…ÅYƒp>dÃYÃï,yó®çÇô¢ÐÞ>Rz„ᨪ¨ª‚QåÇÚeY¤nÚ[M|·ìÑþÇ=+Ú3Á#"5†Á ŠWˆT\¯ž°¸¼‹éÖXë“k”.³¤£!}rñÙß´Óþ(ÕøP¼æßOUìPŒn!eÉð<8»©¸í']6d‘»lZ“xÌLèä\ˆÓ;qÉûíƒxNxêw¥ƒ -;pÄSÏ‚ D)MSŸR¯Oá¤wO©Æ»ÝjÍðr²á¸Nõ=ÐEd1–¹ /ï¬B½Ç ‹m(wüG×^ÐÖüõÓå»ÌžC@ dÃõLg<ÜQGU))ju±ù÷}z¨B£¬¡¬Ê°û×LÆ#¶æSêuËj]suµ`µªY¯k./Ïhêë`¹öEf{¾Ek¼šõÕW?A#|2šT"L‡‚å“6ˆK-MúÌ´Pé0¶óøP§<% ßY;ë”±ÃS*dFp†Œ4hÀÙn$*$ù 8öÖ¤ô>‡õS('(§s¶žMˆŠ{ƒç¢/&¼gM#h»a·ì‹³êá#áóqso NöÔMÄWmm~Æ-ý—vÁ›v©ÜC¹†öF2Vþ=äûhçØßŸ2›MY..Ã*^ü¸Yë…£®W,»URjçÓ œ58«pJR·@ç@BÓù)í¢í°­bm Æú@()ZÊz̹lrÉ{÷ïRìßÀ•ŸúÔßâ½÷Þak6ë™βSmó\õß¿ÿ6÷Ö²\5ì°“"B­ƒ®óiWPÒ_¢;·ŸÝGj8>ºd]·LÕŒÅjAk £ªbw{‹åª¦5KÆ•Æ „pôžÜü£„ ¾Í~ÄíBš”Èò¢µÖ^äáF_ V¤_ߟM)t1+,Â)¬t!«Ø[l„‰àü^Ñm‚Êà ‡Æù Ó€Šôu½ <]Â8ã ~æ$ÒŠ£B1¼/¦\æxhÒw¤¾Ã©ÁX/ÎhMG{üˆããL&s”*™Í¶‘Jû‘«sáu W\à~ IÄ›ôQîºYøBM¢——ssóÉEàk¾Fˆvô2AÑCCv³ŸP¹Œ $òÀ›”Í+s•@O™ËÔ¨áKÒ-ôЬÃu/ÂX¯V|÷Gy÷¬D*ueY„ÐöÈA¦U Â;®´NÏnÍEŒ¤ÅËìfiâoÝL$t¤Ëþ ‘³nY\=byõ„d:»M9ÚAc¤*{kÌGåü=Ï‹·ØPË÷J{ûTáÎÐè·¤ÞaTìáœÁv'tí¸Ú{­£L±ÊIex* 0îý¢hÑkÌ€§m:ž«>³Ý§±E—‡ðžýHDªJFã’ɸò*ØuÍj½f½nX­êuÍãǸ{ï{{ìlïrÿáCîXÉþg&¬k”&t»m@Evû&Z Œ¤ÙYH: ç$°Ás/ýêÍ9îÇlнÉBI¬pH"“dßs6FÙz!Œ޽g_¼¾ô¹ëòå`ùî]óÓ–¡S ,,e)žêqû zbÙyÌ‘}íœ,·w“8æ6fiüx øÄmØ®²Gø·æ•—Ÿ – a cö˜oÎŽ þXìé÷"tRb¤òÈaëP­Eh¨Ò¥ƒukiÚŽU ºÑœºi}=¨Õ׌hMÃÑÅ5¹à`gÂÝí[üüOoñ£ÿ˜ÇÇgLF²«(݈å¹áTÀª]bVš®5\”'¼vø2w.ï²\Ö5RKöögÔkËÙÅ‚óË5û;3ª²äârÍ™>ápr““æ ëºãìrÅt2âö­ŠOÎü¥“\aH6ï;æ^c2¼ï>TÛ9Ï6Æ¢¤E½¿§ )}wìF‚ÌýbÜ ßA[é’A=eL»>aÅJ‡sÙù¿k½pF(‡B!uÂù ùtÊ>äÁ`SÒ‘±ad£i>°=¦×!µÀÛOÄÇÏÔ½ÚëÕX²^_øüZóùe5M£íØyÄ‘=¶/„6¤Œqí2Lh¶—r›(Âÿ6/¬j.𣅕  „A‘Ýzí [™¶™->x.ƒ6Ä1WÄ‚öKÌ«ÑY_D\`ÑÖ _ÿÑ9SŠÊ K”ìwË>÷Z¼ÎÞVâw;Q0Ô;H]FåéH¾AW¶|=‡]egK¦ˆ>|KŠ6õ,Ÿbuyqqy)5R–L¦Ìw_ƘÖÆ aX,|›ŒïÍŽ› •µR cLÒ_\G6ó¶¾à#Õ{”zk[œm±æ˱g¡G¯Š‘˜"†§—%0ý˜K‚Ì.L¶â˜<2ç»Î3ˆ1)H&ç„ !) í3®+ËdRQ×#ÚÎR¯kê¦aµjX¯kÖu̓‡&1âÝ'‚oé45±¡¦épñR2Ú;û¼øÈZÎúd¨p~x›~ö´¤³!oZ 'lÙÐy° ”Û6Åäæ dBj¶o¾¦Ø"[—¹§|Äñÿ‹ÓæÇÇÐu.A—”Ú t'¸¹· ~íᤠñÔoBaèG×îO³sO+¼­Ûlù7¼Ñ¶W‡»¢>¼>ÕA;UUðÊ«/óàÃû^ð)yᮡ¤ ÐáùQ„åâÉ#fú5:ÛÑ …ë,­¸Î‘Ä¢p®£³Žuk©ñá6uÒúË©¡eÏîqaHá8½ZRMJ_û ßúÖ×yõ•—yrï1Ÿºý*?9¾ÃÃã#NÏœè  „ag{Îy{Žh³Ô4éÓ!ÇãRyÐÒr¹bg6E+Æ“Šù^ÉúdÊéÅ9—WKÖMË·÷™O'<|rŽú¯ÿñß}=߸LbœÆeÂ¥p–¹ IDATq¹‰AÌ÷éAŠ;¾°gˆB„ð‹{$)³ñsH¨qùïMâLGP AîóR{&¬ sߨHOF¢èǵ}b—ï®ûyÿü¸ Za“ìÂT_òg#â¨2êZ!†¹§þnY¯®¸¼8ƒ6©Ú#a-aOÂnk)ºË ˆ’”Ê{C«ªB(‘„CW„ë»?×X;] ÎÉä½tY:× ò&-6×Ó>Å% ]N+Ë´’ Bl£ß7_^.ùÞx°¡CâN,ÎeØ;{4eÅhä9ÃU©©®2fG¡R¤ˆéà תçÙª´ÿî­] C²€ÉköÁÃÆÀZ7 ÝùŸë¨ë3.ÏÞ§k¯PªìS°ÄGcD7m[×uÓ›øu{ïë?$BH5C‡5ÁÙ&L º ÒHÝQÞ¹»˜Âf{Æ|ÂÏÚ^iOÆXL/D}L"².w8Øô^G•ýhT1ª*Æã’ñhÄ8€!„´L*Áö´JÞï¸oöcoB¼¤Béá8Éá›a³¸ÔL’2€eÂ/g3} þÒíy6ètüŸ½ë&PÓü*ÛŸ)?¼s7ßûŸùÔgû gÃ×ÍjœIacàþ#7… ihýçjo»eTuCå³èÉdø@’ÝAÍÍlQB>]°³ˆÈ S÷4Æs@cC-.ž—„Ï]½®9=7|õ«ßðgihRüå ÊBQ•娠TcÍHÌ~ögéš×ù©CBÝ¡´¤¡@(M%ÂÎ(uE±Pœ¸&½¯ÎX: Ö®á0B2žLX­Ö\2â—ž{†ïÜåL=¡³÷9[[#Lg)J1†QUp¹\1aÊÂ,ÙÛŸy&}€¬ˆð>¯×5E©Ùž9¿¸ò>ë¶aê¶X‰»;3–Ë5—+n={›/~ñ èþïwiì›)óTœ¨|$¼ÂÛÒ‡ËÛ>KÔÓ]D–þ"CX½BZ™ì )­FöÒ¦(罆¦3)eKL¥sŽR€ *qn.0»CHEò‰*<ÌéÁû&H?}c¢m´TdŽå©Q“uý!jÂ×ÝO,ò {↓Vˆõev€K&³=´®üE@ö¢%±€ÆB¡ð¿WjFøé¬Ç¦®*àd½õHC'Έ$È``G JÖ¨ÓO#Òø#*Ñä¢@$ד$/ªŒe Ö`?ÈÏNÏyððœí.J÷1ƒñÀÖa”]»TU•”ºðé<Ì/*tǃ ’ψ"©ü`rÑ¢ ÝQô­‹Í‚Çàë{—Š»F&Rô‚õú )5Éh|ÈhrˆRU|‘þ&\èß4ÔªØeoâjû¿×1rô‚C»k.°Ý¸&©×E\C¥ÝG¸¬¥Ë›Kûjë|bS×yæ¶K¶­Œg sÔU$«!"Ó# As^i;²e_Z¯xøø1Ï®¸¹;aâúÕ–‹ðÈà—Ò[5Xå?ïB ¤“¸Š†ÊÙàl „ÈÆº"’JÃ7…%zO»óöŸ˜'IÎX.—5ßxëmÎÖG<9~Àý7ÿCJìÑ*xq]ï[Fptêèº<pS\èÿ[+Ç|ÚyøÈì[AÔwÓy䣻Ö"õÒ3/¼CãvV˜‡Žr Gž@ÔÛ ‰p8î–!ôCòÒË ¿µÈ.a=‡¤û”®¢ôé|—ÇøX7⤻D’õµmýç]”,[´.X,ž=˜s̲St: ƒ®ª°‚µ¼×ÆÀhºÍ¿ýÚüúoü§üËÿã§,+Y–)5Y#Úk-WWKêÖÒZÃn±G© ¥Ö,;ÃùÅ‚qU²\wX çWh[³)—W ÆPÓ1S[ñŒd{E¥?\Cï!\J3s!ŠÙ_bD Þô­HRÕ v/NÖbœ¥m[®®–<9¾â½õžÂSý˜ºjë² T³ Óºï’cg,â:LFTX‘P&X€k2Pùè>/†Á 1±E~ýØ<Ÿ½ëp¶cµøÅ夬¨ÆûT£=¤,Aè§lX±ÀæãìMkVþë> ˆrݯÉ×BŽ@Tuˆ³KlwµKœkÂw¾iÿ*zƒµ=…*…½¤Ìt‰î:›p¸ÎúU™ˆ¤à+Žá2î©¡ê¤ÄYÃÉâ”®õÝþûó‰çžeY7Ù.œkð›ít²g¦ÑkØ i0Þ„èí9®g^ûׯ_N »B?þ^p›ï.åKÇ·¡noþä—«KT!ùÑÛÅOÞ{‹W_þL¿ËJn™.°"L"ŽáÑŒ¶‡EZ2Ÿµ u›¤¿´w¶Y×+†èrÛ ÞçD&ìÍH‡¹ýê)”gðÖ bV]¶'ÉU“IÅö|+0üÛe I䨴¢,ýç_K…1°¨/i.Ž1R@c±£*¼Ÿ±64Á‘Ô(ÿš5Vb œÛ†¢«Xâ° *¡èDÇD)jc..®ü®ëxá¿øú¿fw÷'GOÖõâb.Ê0Œ¼ÊÜ4”SÅ„’ã“cZc© ÍtZ±XÖ4MGYH”–åbqŧ^ø¿ôñ[L·æüÿìŸñâäyVu¶ƒ}‹H‘CR>t<ð7Æ€JùC%.Iiì¤7ó[æòÁbeã™j{¯'³N6´®:¨ôløš^2œe; :üMY)ÿ"˜Îߎ PH/.áö¬bæuÌœ–µqH¦Ý·èi_ñ¹µº¤¤¬|½wI- +òˆËØ9é$œ‹ o¬c½^°Z]Tº%BWi!#˜$?œSôÉO.ÞS8E„úã°r¨\N#êÍ˵ J_aû]¬aâÈÍ=€s‡òT!kq|¨±ŽõjÍ»ç"`µ …7î–þY)IYTeéÅaÊ«µÖ©ëÀ¹³!\œŠûT§Úÿ1e†±(oÝôvBáR8ŦÂ; DJq¬QÉ/´ùžÑf¾v) ¬5ÔËG¬—½ÇYHFÓÛ”£Ýp¶™§RµòŽz³`çJðÈ¿ÎúuÝø;ª´ýŠe„*G¸®Åš)jŒ;£«Ïû©>*2ví¸=â@gM8\âRÇИ^´iûËCGŠžu>^Öp÷ÞéÌšªèÖ]Ír]£¤ùñ{¸PäfgÖ–”¥ÃiMá¼~CXér‚£Áú;¯ “2âó!ºôzé°.3a:(/Þ6 }]%Ûu†umxûÞþúÎTëQ£Bógÿï¿bï&[³Ýo] ‰N¦ Á݇ŠB‹Q¼ðõhÜÉȲ½Õ ^b"â)—ƒpöúð‹MZX¾êÌ~> ÎÂʰ¿l(À³ÏÏ`ešQ¡§;[3Í˯¼Äïà§®ÂKV•Öå_ƒª,°º®Å yÿCÜK·1Ãjéí°BÓÕ-T‚¦v´Îyg‹®¨˺ƒ]SòØv8íµFÖX&•¥‚V€íZ:#]]ÇôÕŸâ‹?óiþ§ÿù¡Òþ{žL @²XÖÌçöv§\\,9:¹ gH[`튮‰bow›é¤áâò ­  õ‘–ÎÒËý÷ÿ”¯üÙŸñÕ¿ø Ú®agŠÖ‚©¡~ÿwþÎë®ÿ¤$AA~älàï–+s_r΂•ƒt¬>gZ„±¦ŠÞØ€õY[¢›eã,O ’A4ÒÛ ¯6ˆ“¢Ø'î3Ò=$H‚€IŠžbÙSbxxü,$/¯ÈV-io™ÝÒ•¿ä¸0q·ë¥ìûÉÕ£8(ºšI!R [¡%£Ò‡q¯*UbüŠPEës§Ej„K‘Í`ù.§¹¬vùû™‰ddF• ï}dÇιGŽªLiì;Ik-McxóíG¬ÕžWù†ý£GyjÊR£u:i_˜«Ò¶ý.9`µöð‘`½Š SÑcŸOìúàúÄ^¬/䆽E.l"ËÞQD¢ÕmÚ¨b—eûÛ¿M}Âzq…Œ¡E/`‹Ñ”ù¥ñewÞeE{Ô¦…ë£Æå}ÇüÀªÂ1¹åѰÖà°á‚eˆ'y¢ãž¹³ j…žñëö†á(5íµã3~j±<ãüò£qX}^8µn ¥*=qÌÄHÇžˆ–Xãx gôn[ç_—Hùr!°ë:é" 0[÷ˆ|'S¯¬§ ¶ëÚ²ª–«šÓ‹5÷óÕ¿þ!”WŒÆŽÑÈO„..xëÇoò³ûWSã'^ …qšóK‰iId)sÔ©àÆ~Ο¾°æIUCEx\Mçzä >_—€!ñ—©GÎs"©1ǯ„Kðð×Gñ^Fˆ’ýŸóÞ½û¬Ö’¿þÁ÷ÃÅÚÿ¼QLF%e¡iVÕâ(ÆSŠ_Á\Ö”'4…í,Bè:­Åb©F:ÉrÝÑØŽÆzQsĺϨFÕ!(%TEI»®)Çîá_ûÓ?æ7ÿÞ¯ñæ÷ÞôiW7w(«2¤]ÆÕ!ç—Kœt¼°w£:ê¶¡n;:cØžOŽÏ®è:Ëk™/~ñ ¼üÚ§øçÿü_p~vLY)F#ïvت¦^O#²1] ºL|Å› S’z8“ó‡Å¿µA „U!O•´Ÿcߨ8ÎSL±…’‰’!ãEHæRj\ë¯Ô/j1Xë}‹ÒúßÏü 5éa,ÎøKI?*ŽûŸF7m—àû1l‚mí¬íùÍÂSÒ⯱ÖJâØ››ó’°‰uæ;é<½H Lƒs¾óòÈ:Õ?äY|e)ááΚÀ³×X,ÒŠ$’b~â}Ìâ¬L…Ü¿6sUøD·Áé Op Á-S¶6øƒöuãÉé÷#gA¦˜oyähCJ¼¥Jð…·R…¤® ŒB<•û¥èÃ^\¢(©,b0{n3+“¿p¹¬ù° cŠ‹Šo™©çã)÷êÕô›jíüŸQäíKžx¶^áÜ“p{6w5~!tÊ…Ä¡^#.Ë/¹BüºÿçºNÛÚ¡ò$BmœiA7¸ö Î^†K€¦¿…Ã×v=Ç ïšË2×MÂDr¤ãó©¤âîý·ó®\¸H9®Ö l'ØßÚÂ8ãýÒÆÑuŽÎx+ͤé5Ue(¤ðžx%’àÈ«îen )N¡”ŸI<•NÛÞRä¬ ß£¡i ëÆP7m×±Z·œ]Ô|ûíwYË3öÆ‚²ô6C:E×Öœž3ͼO_IN/4Û¥6cÆeÅ‹/Ž0ÆðèÑ#º®ÄšÆ`:ê(”„ ½Õr°v™ž¢ßó4ÔfÌ”Fá"hHk„°Z#KHÂúÏXF/3Lg‹SÈ šoZC×Ú4Í=~tÛÆÒuÐ5 rªâ÷áZÈ€ìoÝþ¡PaäþVci­óãïô™µÈBeä±ð”QÉ-ÓkaÝ0ÙJÌdTm› v!ƒŠÖ:`6t2(¹EÆ!ï£éœ A]b¢—t‚×<팄Â:úžoì÷Û±ûÚè]€Ñ¤=·Kãb'{ê\ ذý¸]ļéβ^¯yóÝ“41ÇÕbÁj½f6P–;;s””TU™Åd:”*Ò¨/Ú±DQJzƒ‹á!WVËYJ|²é@QR¥b,âþ: ûœpÓÓèÂeHHÞ›\3ÜwãÑAЧ‘M–d@yŠ,û»/ÞÎu´õ1õê1B(ÊÑ!Jo!Dváfp‰½Î'_òÿ¾ž²Yø¯ëº}s)‘Å!¸]„;Å™¸uzþ#wà:Õy´,Ù ìN—~ã²ä¸¼: ¯J—c‰ ª •pU_²<ªÙÎmÛÒt%mkhFMÓQխDD1P&ˆ{Âó#Ã-SÞ=Á¾§Âç,¨Ø;Gk=ˆÉ„üs_¤[«šÓ‹+îŸáô%ó¹ ,A…F@J‡¿ã»´Ð…ÂZ ŠCoîAUU”eÉK/½ÄÅÅççç\\\°Z­RÞÝn†IU©wuésÒÿ{VP´hŽÛL¦ã³jc¼¬I»‘ Æ\ЧˆLà{Eѯ?ü”€<ÿz0V÷Ÿ»O~âc|õë÷3= ’>–‘uëבôd—ˆeëŸïÎàj‰«¥CH¡q¦fÕ5l .5c©AY´€•€BTÊQK©®[Q” é RX¦ãнŸùEnìðoþÍsrråy‚¶âìrÁ|§d2ñ]õ“£3Fr͸QŽËåšñt—O~ò“Ü8<à_üoÿ+ÆXšÎ¤gP†©ò¨Ð¬ ]G)F¾@§é¶ZÕ„ª<>’ŽãpOÑCÛŽ _ÛÅ1b¼ÁÛTÜlèP»Îwôð¾jœEÊPø­ï±h%ƒGÓ/pltHçÅJq¤ÞãÉ@¼€)⿦"¥CñL‡aeWËx7FØÓ‹É-õìq.¿ë6¡ ÆnÃYïÝL>ôLé^ÀL¸âba–¢×ÍšP\„ *R‘½¢®Vlx(E@‡fý¡8ËžeÔ¾ñ™ñ‚6ë q4]Çw~rÆ¥™øXL%BHcë¶m±ÖptÜQšÙÖ”í­óÑ–Gt†ŸU-“\Š,ÕLô»æ$’rÁŠÇÐJö.ç/‹.$Å?»Ì~½TB\ŒÒô·ÌA4$›bËp±•™àl ÜÏHFaLùquÒ¬ŸO¼]ht±®n œ;?L%tŽÍ‹6¯³½†Z6ì‚cp”Ç' œlp¢Á±@ˆ.êóBÏáü¢A(© d¶£¦]©KįQYøàzÕrtuBµœ1®JÆkÃzÚ1©5«QAÄ…ÞG/B³á¹2Ű:Á ¯¹gŸûà „@q4­¡é Mc¹Z­8¹¼äb±dQ¯(*GQuTcÇd"©F  ’Al*Aù0%š®C­À2šÝæàð“É„¢(¹äMÓ0Çܸqƒ·Þz‹®3ìÎT¸HçíþT°OÓÓ¬~£svlÄLº*O¹àŒ ´Û Š]kÿ“×ï©7>/ÆX¶·ÇTÕˆåºÎ.ôiRÎOBµöÓ²¶YÁò )G¡V8dá'Sm cmp¢D ïÕ+J-Pár¢¤£’F[¦”¬t‹­ÎzÂf! R;ž{Ž|ãÿã¿øûÿ9þgJ]·Þjgõzͽ»'…Î…“½ªX©5øGÿ„¯|å+ܽ÷ïÿ¤co›ÓÓsÚΤé 1ŽÅUãóÂK¾/È;tyÚM–dD96 nò‚œ‡G=fP8@½9’72F!Feï!u…/|…”áö-RÞª ,/6@ bOcýø#Le¡{¥x%·ô¹±.å̶]̯•%î¤E*‘YfÂþ0vÒïÉ…“ ™êdpÉF!("ˆpâîQ8‹ {=J— þ¥sIHÕåä•Ö…É€ïŒãú"C€‰_à ºðMñˆÿš2xM{µ¦ÃO*âäDä»-ç|BUȆmárÙüÿ¤½éeYvÝ·ö9çÞû†ˆÈˆŒœj®®®ªžÙ›”HqjR†­É$EC„a2 üOPÐ?À¶à6 ¤d)ʶ,É$›lNMöXCWWwWe Y™•SÌïÝ{ÎÙþ°Ï°ïYÕt5 •ÃÎ>{ïµ~ wW’F)c&›FÕ6ÇfT¢Tàôô wÞ¿‹Ë—÷°³½…nÖ g»Ñ#c“ÔðT„cEX¥l=FÃú³³²®˜ÑÚ ^¢¨¼>M ÏÈ»DkòÀ•F·ãz¡-¾ñiÀ±¦šéŽªž×»gŽd†õmô«÷`¬äI,˜Í#}Ôºè^è1uOGÔ¹k/q«y¦9Èv x cŽÓs²ª¾é\ ˜•™‹­&z¡¼¥ƒU‰t¨¹ó »$øðá‡gG§îÐa9o±œµè)ÐmÊL'#IpÖ™´Ëú“u¦FG®½ÇÉÙ «µÇjXãèìë¸Bãó™ÁΞAÛÎABXÔ¬r±€ÎÆ2úÕâíìæËËøíßþm¼øâ‹xúé§ñÌ3ÏT:^zœ­µ¸ÿ~:·€-_WN¥xª¨Ñ RÀ'ãåŒæ§Íø ÏÓÐsðÞ\cu±'¥æ>‡ñÖÖ,ÕE§·éblmïàlõ~^b'A£GŒNW¥ìט¯¶[9“–ÁZB¶Úˆc h0ôÎ3‹EtXÙ‹NhrÇ‹—×Çn€!y 6{g$eÑ<ûKÿ1ÌË_Ç]ÅÑÑ)W1v/-qïþ1¹\Xb<õÜÓxþ#Ãl9ÇÿøÏþ{\½²ƒÙ¬K@²_‰ÑLçÕàNÏVhYo­©¯#n¢ê­­t7V¾:• å±oFÙe gUžº”tŒªÊ!„Ä#†ÔE¦­"ŒÚáÑA§@uÈLRµCr$h+‚ ¦˜Ãä_IÌE„P 2‚—Q8'¯l¢UÊ&,L‰£ƒ©ø¼J³‘¥“òyôž³¥KEE|c²R–¢L òøƒt@:×ÑaˆRxÓ“– “aùWö¦\mU9L@¥bowò}“Q{%{j‰¨<æÕŽ‘€,©sfÈ~0 ·öè=JÇœSªŒòskÕhd…X˜åàðàM'á[[K\»²ÆXeïàbÍ ä7F S—¸AJù_¨¾óîÀ³JŸxÈ Æ)8®ª3GR”KK*1Ç'÷Ëó6¢T–ÇFÞ£M#…¯u˜ôÉç¥#5b{šÏù°e-'_Û9†uÒ1;‡”Ì)EËI»Ñ÷ƒ l»°†ptt„ßüÍß3ãÙgŸÅ—¿üe|éK_“O> cLowÝ{ O¢±À“è\µ¬gõ*R¸(,8áQÞoPuoð?+aYÍߢ1!”7¥eÿ>+­%;þòåmt]—,m•LÆ ô}H“V.ë-øû@ÛÛp-Á1a†3bÕ30k€kÇh[ÇŒ¦x0s„ycà#Á4Œ+ý%œv=8Z4À:%Ÿ!2¬‹Ø¾²‡ûËž{þ“øÆ7¾†×÷ððàGÇ+!„!àÊ•]üÃ_ûuüÞÿùoðïÿðßauzç,Vg‚pM“.E¦Øqó¤-ø€5×ÐÛ9¸›oÞÂãO^Cã¬tvItDî@úéä ʯ L‚–b·ÆÚuäNœ™Ë޳„¥ÃY 6TÂ*˜ÑdIòPg¥fŒEEcò:Á€áäïÇ|àÉ¡BY C ¯vÏ6í¦²×ÕX“€øœÛy'_~ò3³ìè¨t^áI)p£XDzé©L-Pâ-C¨Jo›¶5òk›- ¬ì†±ZT@Òú”ßk” GzéÍ”<Õ•¡•ÞõÖLÓ¥IQ¯ˆË­›7Äxr¶°Q,AHt©;‡U4%Üä"¯.d7VþRJQ†­\ "§xÅ€à%?øý»÷áœÃÕý=, t³®L qDû"“»·tá+¶¨ôx50Š*½ˆëYÇ‚Öu>';_6È÷§;â¬Æ•ËX¨‡´ÓËÖÄÑÅç—;wâtîc‘!01¬ï _½—öÕ-`¶Àì`\—. Ø(,›&h]4îÖÅ<¿®ôÇêQy,¯K ÆL˜Oá E³r(ï™ÂlG„2O”Œñ‘ýV²KàŒî"Î1š&£G}™È†¬<À}º4uO\Â\,е׿b[Õú"2ƒ³9"XËiw-Ýwžäš‹^V>ýà·ƒÎðÞã§ú§qóæM03._¾\·aJ]°=_a 8¯;`%¸¢)s[òâ !}ÔÅgI­Í˜mRrø|SMê,ǘ½=²†™ú7CøÄÇ?2Fÿä,ï©~ðh›4…%ÆÚKNÁý[obç¹g`F‹õ ëÅÎ< o¢E„k3Et a»ï°nWè,Á´’•à—ÈaÝ‹pÔ:9“kЃ† ÚHxæ3_¿}ßüö·Ñ=®î_Â÷¾ O>õ>öâ ¸öÜsøíñ[p4Àd¬t QýÈ IDATŒ8[‘ÑDÀ8±—c¤¦¥Õ¬µr–®ûƼކýÎ_}ã7þà÷ÿW®ìá©'oH´#qx:SoOS²úXuh´¤žêA\Ç|S¼g '*ÀIÓâr1+¶˜ÔI!³©¨ë·„¥ú²Ék¶ee`^Øc$ºƒª¤¸SèS¢¤6®J*£²§+fˆl°3<„m g0Ÿ9tC׈%©ø$Q!¨%Ä¢‘½4kú^º‘F6©ÃÖ»öަݜ*"Õ^¤l%ŒÂ”¿‡$l#ÈD"ƈu? <^º5ŒØÙߪtT¦É%­Cf£‡ j]°å< <8\ãáÁ!âèð>lm-ë¸]…ˆäר™ŒvsòU©K–ºd™”¤4M­Ò½y]„sù±IÝO-À´V6GC*"TO¨¦VÆZ¼‰,8ö`^! àpTºl±Oaò­Ö,ž¥;æi÷œí½/Žê2í¸óÇf’_d Ã¥·× xîr¹?<¾‹qdäoVË—K§Z‰6!¥=YÙ37(©Û–Ðv„ÙŒ0Ÿ ƒÅÂ`¾ÿžÏ ³9¡ëdl=›\#ŽMKhZ m©tÍÖœ#'£mk)q¸\­£¤Ig"·¸qãçAvž8óRyï½÷ð³?û³ø¹Ÿû9|þóŸÇîî.¬µ888Àz½cÞ<€¡XVTÀÔ „’8Ÿe¡ÕÞï‰óYÉ#4¨\Ê©dTÖ_iõÀ*ÈbŒøŒ£Ï}®`ИÏMDz¼ñ>^{õU,æ3t“¯%ÝŒYŠeïc¢}¸5ðÂßøi¬Ðc>oЇç3CÀÌbI4„Š^V­…óÀ¬cÌ‹ùÌ!`Û8îAd±ô .Ó‚Ø¡5ˆN.ÈfÖáíûwðâ•køæ7¿…Ùl_ÿÏÿ ¼ò½×pãË?~â1ì‹Õý÷²X­áÕ'ûa]mb\d™K*’ rí=ìöŒ£_øã?~ÿüŸÿ>ÎNÁ`És]ÎêÍšÔÓd ²¸F|u%g=I¹¸€ë›ªd}`’‚Þ›z'¥ì7§8éìˆÈ±fJ§‚›»W=έJ8*HR-Ú1IÄ”=Õ&G*Ý~V#“Ê´&#;Vï0Òè\ð‚5˜!*Fv‹ûfq¦1R˜[Wü®±õg"•ÆùkåÞ–JÀƒ)Å`†6ílE4V§fÕ{YDÉ SC)t–²Q”¤·V«!¼q/¢±ÂcÏ®ìSfžÜ¿+±#tްÕžØsxr—ðô.áÚ2b«‰Øiö»5®Ì²\q&š™jÏCÄñÉ}€•vƦê0nZ‚+²¸N‹„‹^ºcÙ3'yêmCp-É·RÔ«ÿoó×Ëâ2›”ÞV„…2:¯gÀšrw­VL±Å“Oþ fݲ€eŒ1ØÛÛþð\¹r¥hsÖë5ÒkrÖÖâ–Q¤D*yM·‰é?bcƒÆÿãz¬,¡DGâ3â°j”ˆEjÌI*ÓÞlÌâ™´'ø0 ¸û ÇŸ}õ«X.˜Ï:¸F€S1TPNïcœÞÇOþG‡aÅV+ªog0w’[àL‘ÁCunÍ: ¼Æ>fp†°ƒaEاÛžÀˆv@˜œÄ5B3€›jÙ8bï©§ðW_ùCüÄg>‡OþÔßÂ_¾û¾øÿKÌÛL„½¸×¿ýçAÖš>ƒm’#À$Qqa ¤Ud6E%®,;讓ÿྎÿ÷÷¿ŽÝÝ9º®Ågìüê¯ý"‹úõ6wyÌ[ý¡£]ôHüM£ÂMÖqaó¦ˆlê.g›”ÇÉ€•<朕œ£å8í–E<(›Ï6%ùHz•|¯‘d”j „ÙÊ,Jo›S5°E$ÁðIU: -à}H‡³A„äXKeH2ÊöyÇÆT8ôÄ9KºB“Fq ‚9;F°!yxsNtCJ!÷!Â¥Dª˜!“Q¾˜*¾¡´ç‘=×ÜY«&WÖ”tfåF’ñ‰yLŒtAâ‚>IoX¥ì/ÌéÄu·Î&_¨z ¨ ªtŽ#àÅ'æØ]4è‹ÙL.(d \ê®E°"ú^@`Âc[í|çÝ€ñðàH.6Öa‹Å»—vŠxÆX£¾çô”§ý,k d^k€`œ•ÕB½v֩›ro¡Jº+—8rª ÷Ó¹(æ L&¢i+X±öuÖE„¦Æµã6àp€·0v Æí§ Y8×Y= %ª3£§„²iqÖ_«Ì¥pÛd¹t|^ —©S‰´L»ãüÖÌÁIÙy|uó˜¤'§¨Þ?VC®¸@…ʉu„²z¾ —K.™^ºXĬþsµŽLðÑ`è¼üÒKØß/¼ð¼÷hÛÏ>ûlºÈ®Ð4Âxøðaz¬3wœc¢ãT›¡ ÞT˵uÆ2ÕKd½ö|Ä Fë½g `¶í€–°lUb¦; ²€g´ŽÀ!r@gÁ§¼† „Æx œš½[ƒœAäy“êNdDÈš#ãøè_ø•_Æúèaÿ >÷üÓ¸wx‚Ùj€µ„Ùµ8;ó5·Þ$8’d$œ­Xêù`mÛ`{93Äc¶#À^Zà7¦b;C@ß{œ­ñúëïâû—Œo}óe,—svv¶àœ>áÊȹó4ÕC§Dh†ýJý?F”¦ôÂQ»¸"Âal@䘯s Y!SM)ƒ*o”R…*`˜¾„åp3…He¨Ž­³B›F¶,‘X¡åUâ?3ן¢³¢u2ÚîÚFŠT³šÇ“»ñ¢£æ:3ze “•òÒÌh ‡Œ8ÐLjÜ›»Ëª@ •fŒ`‡‚wµ8î«„ Mb.ÎܸÔà'_ÜÅÞV‡íív–sI²jt$UYkàœIéU¶¤W{ 3®o¼óÀÃû¬6Ž8:>ÅÑá¥}ÜTçÒÁ–dÅ…ÔLpfŸóœÚUHIɬ‘;ãº1J0Ww‡¢×6ؾ´#z'’ËB<Úз Üþú7p¶>-ÉoÚâ–µIÙÅcûagkù¼ƒ$Î4Ø~ƒ.˜Dä‹Qׇ‡§øÚ×^ÅŸþé·ðGôuÜ}ÿÿø³˜Í»ò ÛÑAí(ô¶z‚EÏäý¦Ã(ïœÁDáŠÑ~/³SXy÷òx=&ÉxŽ9¥4º®Ìù8ÚÝf›’> @hAD.<‰}Ë‘Ïsm1fy'ËpùÜm\¡3@×9̺Ëy+lê”k R€Ž¢ˆ7%©*«SeD—í¶‹pÞ‹’­! %8=«Ÿê:5´äý¦7_ÖMòXÜ`gfpû(ÂG.öªüZññøþ _z~O]Y`6›a>k0kZ—5šÔ5Æ:#!î¹Ë2a»#¼q·O»P^w‘«Õ‡G8>>ÆÁá!º®“ÌVµGjÕÂÕ—¬wÒ6ÙjŠAáDËdaDô2õ\¢qçLES°¹{Õ¶¾”NŸ3cÆÜîñ8Tg<«ý5Äšü!8ž¤×ëLÙʸì«uWœ­_wÌÓ‘¹îÀ5áÒêäl}Á÷5t,›ò$ˆ™t¦1£U«18¦Ü|©¿_/³ ±ÖF'×ÅÊw\g(Ýuit++ ÛÀÑÖéøa#Âñä5<}ëîE_Üœ¶··ß¹ƒö?ü+Ìf;ÛK|ös/âWþá—±XÌÒM ”1 D•8WwÒÓÃ?Ã;6„Ú—QM,âãd÷B†+„ZœÓÁSˆ¶e p@9’‘RB’>DN®|yÌË¡’Ã$±‹HìA^»o;,®V"DƒRœ#Ë‘Ý8gòŠ@øÈùILI”Lç""M/X$»XîÆªr¼.ö2@%. QUªÊr¦úf7)Ž2Û‹j˜FɘêÓ4–Ћèd‡ãcÄG®6xì’Åwï0lìñÅçwáœÅ#ZçÐ4&ýË8ùæó?#BMæ‘§Ã0ƒl¬åÏ OFn† è1ÅRXµ©º{ÄŒŠ×™µg˜kÚVÆ(ê/yfæ×®7°Öf iø ðÇà´. ¶0Ô¦uI8×EmŠÈ,° ‘ÙÈWæQÌ0¥ m›ÑsûàÁìîî‚ã€Y{&¶ª ´á$º"e³*»9.ŠêÑãy~ ¾q/ ž$ãaœÍ£êH*TG¹Ò‰¤ÅeÚ»ûó ï§Ÿ¼Œk×Gß{¹œ¤â/T8‹®m #cð²gü)‚`œƒ"Y°’×B€Á¢x£c:ëïEãÑ =zwõâ|i€ØH`äÕ`-"<Â1¤óX¸ð„à+¶èbÄΕÇaC€€OLq4¥°'"rnƒüüggkD¬“—$n—Æ«û‹‹ô…R}Q0öƒÇ½ûøþí_àw~ç/ðñ_Ãg?û">ý™çqýÆ>¶¶)ì\Á/Ò ÀLb犧5móX;+W#Sa{G[MÊí—­S ØD„‚tä$K1íy4˜þ—=ÛÃ'™ä\ã7c,À¢D\j¯"Æ{ÅÔ¯Uç"Qx ²ÒÍ[RŒÝ:æŒaLí«;yÅŒd á”q[vl-™FÁéZ,œjIÊÓgó‹*?¶tͤ”¦jxK”Æ5€Çãí}\¿¾ט’Ûm]óÇQxB±ôE‘Ϧoìwß½‹'¿†íÙ.l³ã,ÖÇñ‹Ÿ¼Œÿõ«§è}„µœÄ}”¨`bßEyFÀW½!|ÿ7a­ÁÎÎ.ï]‚µm× é­ÈT(}alóFûTLn±QÙEÖBkÆ)V™X–:º*?àrÏ1%×»Ì0›‰*œ‹Pq”¾U÷0*·9Ùèxñ±„ðM‡hùÛÑŽyŠ^°7Fk¦.‘×½+´”‘—€ŒœÓÏlRCµ»ÁÅÏÖtÑj¿|V5%áʰª(+Ógª"ºÆº¢t“õR —öëW? k[, ~éçwqp¸Â;·ðàá)†”w}ûöm<þøã¸¼# Ý —éHvKËߨ_i £_“Çô:Á™ºÁîÃI£:M‚”ŒÏeì­(qu'Î%Ao”A&joÎ.íî`±ìD"ì=œˆµ³¶MŒ LÎVðÇ=üv‡ÐGÛÀôk‰Ñ¬†iä¢ãC„iD=k0˜­ðÞìÏECÀ ÎÖÆG !ñ*¢¼ÎãxÐ5FÂSú€è!­!Øv†ÙlŽuZšg \c˔чˆ¡÷#š^ð©™°³Y'¯†Gé £›/ø˜ü9œ¶·€·ßºƒ·Þºƒßû½?Âîî®]»Œ_þÕ/ãSŸz«Õ:u šGÌÙZ¬BÔ©rQ­€ ¤˜ÃD· !íÔb)²z\ÿn  ËwÖ &µ¬Ï/Z6)´"AFø#”è¼|(kL&z’)µ¾ÉcqLòt;/ž˜À€k0G8ç„òdPÈàuê%]4O«èI®1ð½‡Ù]†Õ1 Öžð·>¶‹÷iìjÀ1 F? q¾MPåÛ}PYˆ‡Ç888–”­¦ÁÎζ··Ð4’8ÆlRBU¦ã¥‘|ÔêvÊ¡Ÿ`ØÉõÊ‘1c.ö“è@£Ä=¥²ö›j®·&¿Õÿžj7DP†¢ 1eŠ“)ÓVóãX:ÛĆˆ¥³_8jaÎ;Ø‹ü¸D„®»ŒÕú^z+dº‘º\ø@*h£Nde”.¢™½AÕgB–K`Mnm :Iï,³(ä1Ù0Q½q½ôæ·U~_ˆ®E¾¹K—®`½:-Ó¬K;sìïoíÉw^y·o¿àWhÒŠ…Ó€||ЪçTñµYCH”“€&mô´ ëB­ÏÊ’âUb$u~åXTW ï$N´lÂP½R·©‹Ez¯\^b±\Šº=¡l½÷p…³ÝÌað NÎÖ>àèøþöV³®÷`ãà#æC„W ­1È!ƒØµˆìaœÁÚ:4Ñ¡Ÿ1¶O:xÀ1ÀYW4¤˜¦˜ÑŒ)‡‹bg“)¥¢–cøÁãôô ·nÝÁÖÖ—v¶…î$Ûš™Á$v,X[»efD²eÕ!ƒ4ªfñ_–€ÆH ™SݤãMiOÇhêNzS$%3«x¥†™”_ža >}CZîmJ¨Éjªågˆ‡  6 ¸2Ê+ zc.ìžËEËu‰7ÍAˆ^zWÒ¿Ò÷ÊéýI–Ôjl\4Gê@²ù1æ¤KÐûÿ4¹³ãÎ[žC‚ž4gù)HIÓ>Ž@Û807eÍ•õM'lƒ_ú…Oa½öX,óóJ#¿s¸oè|ÕX9wØÓ&JÚ4ºâòhíXÝ\“ g¡ÒùÐÑ8]?S•‰Ì(j»Ñw÷zvÄånšˆÅb ÇGLj!ÀZg vðh\‡y× „€£ƒÁÎVkÜ»uÍcŸúˆ`¥ˆ @bƯbf«,a<ÐaÐ[‹HŒcöXG‚ãˆÕÙÆüŠÉ`ðò=›DÒ9ôÖËc´ Œ™»ð Üαµ¼‚ã‡wa!®‘Ù¬A7s>™qñHËV{g-¶3cE“s^6rA—üÅyú4•×Õ¨ÅÙL~ÿ_ÿîWðoþõW°»·k×öðË¿ò øä§ŸÇêl-6 U 4vñ|Š‹úž‚7KÁÈ BD2 ç”ÓlˆTž´’~4>(Xírã¢"P‹±ŽyL6óÆß3w4¬n°ObªÏ‘a¢2?f1u›¥8çC•mŽ”iÊÚ«¬Y‰åÍ–þ 8“ШYy“¢µz)Ë¡ž|ê2¥bz¢w£Ç…õ0#¯.‚+Šñ´»§É!¢º$Þ`*éÔ‹Ñ5â—ÃŽÁð C88óeÔ[ò¢£L bR–3í9®€~Vp9µONNE”fÆ8,3ìînc{k‰M²…¨^&øòºˆ‘JvzL9R¶â3%uè TrYe­¢¬qzRÁ+!ç›"c!_eAMY–ÆÔ¼—µ%;Üë\2xp\Ëú'¤ƒš] ¥È¶V›çâݶ—}øNÂtZ'»åh•?òZÎøËR¸‡×(Ïr圼ò1Zô˜¦IeZ”ºhåÎRÍŸ²ÄeWƒ©"Z›UÝ‘±µÜGÛ AMï IÜ©s²jY.;4Îqg͟ч®*ØÌEVFØ<¢ó¢5ˆÆ>g½&VûìDò£)ó›Ç•IM"O°Û›"&õôKíP¡M/<ÿš¶©S- è{ ;j›ürèÚëõ€¯~{Ÿù1ĵG°„U:ËlÐI[[°ÍgD˜y`<§ÎŒµqˆ¡Ç‰à™àaàW=Ür! 0¶Áà6HÇÒ˜«À8õ\4>0‚58 Œ`€ÝÏâÖÛ/W"çKHpÄ|ÖaÝ{¡J¤D=c æ3‹ÈÒquÀµÆ|Þ¶YzÁÜ\+î><ƒûGø§ÿä–Îúïý >ýéâÚµ}lo/¢¨GÉH,bÍ`®©Iü’Çœ‹…3²wÎ,b™S#R,jqNŸƒI½Ø˜•Š3c#8Œß¨yb}à’X”oCYLVzy‹Ð†R×QÕ¢‘9y8kŠ0-+Þ9ÖbSÇgò€ë!E%`>#?“}-edXm—Pv°<þ¦‰„_€¦/ˆ&"Œw›ÅÏ[ðœ¤FWõoX£Ö¨B>TJ[ŽuIo4%Bw×é X,8;ºÙ|K"2há÷OSjÕm¡Úä[Ïß“.p5ü¢þ:ÛðXBÆtð~ÀAºù_½rËåmÛJZä\²ÖEX‡òµG—㑨Þßœ6–.“±ÒÃäqˆQèa%=‰k7M0&Ö©À¨Às†^›òî°é½•/)ZižYÎdÄ'ŸóŠÈÊlÑÓg‘D65‰MíàËÈŸœ¬!À (yîÅe1Že5Õ){õª|·yœE^¥ÈK×M„2á1¤ %0ËwÞ:y’÷¡Í þhßo †ÁãñÏ%ñc[ìAT~nñó;+N mÛÙPKw”VNœ›¬Ð¸º oÐyIIÄÁKªqœtfü¨ØŽ3/8 êÇ‘ Vâ¢3¿QÌeIS®\Ùŵ+—ðî;¦h6ˆ€¶•›KŒEꬕfÅnÞ|{ïa=ȪsÍ gKÚXãd—†€¡µ˜±^‹”7ö²ö ›r°Á:ËÎ IDAT!’ €Á3š¹CÌ LyãZøUÀà-:JÙA<Ñg,Üï½g>Žð§ÿìrJhSˆr!b6h¨C;–‹®ìîáÉÇ®àúÕkxϸÙEãbU÷ÆzNã\ðMêBc€.wÖ¿óüÞï~{{ÛØ¹´…/|ñø•_ýEœ¡_E¤•ÉNZ3âÏŽD;i̲¹%ägšg”ŒäüßRµµÂ•RZS6žóˆ§ÉBYД s>ì«×º¢=³˜´fbè/”­úŸ1¦ c}¹fQçèÕú†­WMŽ’Û^¶“Q­H>éhŸ¦\Œp“yì6y蓪–yŽ\TäÓ¸ÃéT¤" Œ0¢çdIZñg Bí"¬k9È œ1ø“×ßÇûGC¢=Q‰%å›Î;?á¥ò9>ö8mŠƒä"ëâ—£œEdpÿþîß?@Ó:CX.—¸²¿'!Ù³mmIË׬uJ‡°±5” &›ˆ”¬‘‚i’ÒÈ•×`5:$åµÇá ™#Ó®ÜXñ‹JÓ†X|ñÖZùþ™ ‚¬”Œ±0&¦)@yÅÀÇð” ;äcSrá™#ó«8:z¯$¼ žà,WèE±ôIѶTÅ›ù}½Êd*èÃZN€¢<Ç×:mÉsʯRÉw„±7Ÿ* û—Ÿ@Û8£õQµ ;ç$Ý™áqéq4¥3ך’z9<ßAã¬&m „i”g-”Óõ€¢^ txgÅ}â6ÄKšs8«Ìýµä=äñ“?ùE|ûÛß‘ tŠa4ñ` ˆ~Ð÷¾XrÜ¿ƒppеgØ–0`°2Ø é°Š¢Si,ÎBD`†'ƒè† }ŒXt ’‹‡Ð‹ÕJöÐÑ0ÃêDš­30b#7ÇYk°ZDômÐâºØ!  hÖsÓaÇ^Æ“WŸ@w¹ÃõkûØÙßB»t˜uÚ¶q5#ÂM×6gš\|ð!ÿ!u‰š|Ñ—žvÖŽðýïß¿øíÿ€ûìGð÷ÿÁÏb>ŸáÆ} >J7ªbû(w\©eù{ qóK˜)YŠÒ89Sò¾¹*\+'fzNdu€«lhõ†.ù{«E9'Y1KvµèéQx΀'"çt¶¬D!Ùfòá*]>§K +¢ˆ-£Aa"ê÷ §1µ Ž hbë™*jcúÞržãx€%ªlŸÔë±\L(AV"óˆ—ie à:†J“S^(™9.]œEŒ€³” íáú ·ÏÐ8WÀ íž÷üµD µÈûØrçï#ÆIÑV+Ts‘P³É¹–ŸÝÇÝ»÷±\.°\.°XÌEêlYs0l™>˜tÙË—5¢Z¶#W,˜]“ô! 0·ÅaaËë̪0™¼N‘.EP††,Ø2L¬cýü3f8KŒ,)=DˆFÆÃ’…É ›öéÉ MúSZНa°G c€Eñ&¹&ÈŸ½üÒñòK?ÄrÑáÚõËøìç>†ðŸþNsg]F­Q^R£––Æu> prWɆÓ4P µ$9¡ð´P'Òl±isÇÌéë§"#Ë sJeJ‡rdÆ’¼âýRAzR¢è@í…î$jQÊÁ#däP2“³ìÓ¸€{•_M2Fˆ`›UªòØ6Ó}Ó=ãts`zñZ«¯25¨;’ ÷x‘Ç eM+·À¥«&™KV Þh›„F —p÷ä ½Ï])úWêÀ4dö ñ%RÝR˜GÐæ&Q<«4²1b›¨T1ÂéÉ)ÎNÏeØÈ.m{{ {{—bŸ~Þ ›Z8Jg­úg6å1ÎyÊ:®RÆàP´± HÉB9c2€ lÈ“Ü &­†¤H‡ú¹‚fŽKTêÂæ±0çü&žqÈ®°DuFk=‡‘ò<+¶!øPÏy3µ~Úúœ9;¶ûe[Ty Òh:‚ιTr±žvϺšì˜€dÊÔ„®ÙÂr±¦q*“¹v½9ÝMì”b«ÉYǘN2)´±Ϊïi±Þt¢o*ì›þLÿýóêûéanÆâ³ò¸Æj•,“È<ý´šu\ÞW³Y‡Ç»Ž~lSÏÖãÓuR1„’ä—ÿ[o¿ŒåõŸõ;"< ¬±É…ãà&^­á— ðzÃv>“€#Ï (Ù Ëu‡í pa;‹°ö`xfœ®#vÎ":,ðغÅ~4xrá°ÜYÁÎOÑ4k46˜CØÿ旤Ψ¢ëÀ$“9§§9_ /¨ÖMnžGátÁ àQ»&…ž­Öxó[øþë·ð¿ÿËßǧ?ó,þ“¿û3X.gØÚZ–à N;9…Õ½U)¼yÜ^ü&u=ˆn“ÝɇJ¹³ –1K"‹äy\º¯b…QE)ÀÅæËç&H{MŸ"*5fÒ–ñ`6²×ÖÊI Ee+B™lÃR,&.›hù•+D@~N˜äŸæóB)5QŒ²˜&Ê>GÇÌ=û`+L"ý÷(Y,­M¦Ý4J!£¼{Ë ObD¬ûmÓáàänÑüé­5…EžS„DŒc’Gž+~Ò€êžË¶O%’åÝ|dŒóq#+??J.yY9P@Xôë‡GÇxóæÛØÚZâÚµý¢à̇n&ø¯t+Úª gÔlLCÙM#±ü½…-ë0­lJž³5°âtÈ{âÒ2 ¢Â÷CfÁCEfÚT¼¥»¤jõJ“+“m[Jì£Ç¥88¼W&j!Êø4xíXȰ¹4ÇPíN‘•še‚+nˆSÇlÆÖÙµXåýQIf™þGF½žM•£h‚jšklƒÙ|&~®ÖQÀ[–1)¡.k³×5GZˆJ8·wŽY—£&€Sö¸¶dñh„½ù>Ýg—,Òç‡™è‹ÆE¤¦ÜoW6u]”¹¸ti m›è_éµ´î=BQ§MšÂj0ŒÕíw±` /|>„ôZ&4ˆÑ`Öuˆ­ŠÔñtåbƘè17ë¢)q˜¡G¹L Ì}ƒ+³«¸¼öv"vaqщ‹PaRyZ’NH3tQž~¦—"‡ PbTuÓ]ò#TÝçÄcô#vìŠçùýW_y¯¾òËóY‡/þħðã_ü$._ÙÅzݨG–„ÕB–÷¥4úæÊˆZy‡­1ãb‹šÄ”;à?g ¢GJŸ Õó̬2¢¹¾ñLEè EÈX¥ÍÊ“Ê)5‹Š·².§ªBÂêÏj8M’r¼ø¡Á`Š’ UF%B…’(q”Í~ØXWCjês”]Ü¥~ÄXRÖ`J°@ÙêãuEqn—eÿɪÇÙêCˆXÌ[üùëq°–‹-loo§ptéRŒ­¨NcÇd:Ú”Õ¬FFZ]ò¾©>/Õ›ëﳎôýSœ°è MÓ`Ý÷¸yóÝR··–Øß¿„n6«£ó’b;”U‰]‚å‚S”¶àdƒ.Ò†d—E`2ªç$®V={™\Xcìνçz™t1ùØÔy³•ÏÂx¬c‰¦©Py=fúG°"`¹¥É•ŒïIÒ蔢”·f‘h¢Vúˆr>ØÚB3OΞè/ˆ&å¦Ú¾ _92ËKØÞÚ“ðwE:ÎT38‡yÕ 'Ÿ·«…`¤Š;&€-Ɖ1›~ŒöÌüŠœyPòH“ÅxôÝxh´Û/þåy:;}ˆŸú鿉¯üáWEà•4B>aeçm:ËÔðþèøö|@€CÌÞµ¨¹×+yסw+D&ïEÿàO×h-.™7ü%Ìo÷8ùáMœÜûnš¾ûÆKø¯ÿñ/ã¹îtšÖ%òXœåŸ šÉ%†KwŒ (ÓÎù<50uÐ|.ä{ó˜š/`uVnDwÃÅŸqÁ\wß4öÓç•ÔêlÕÙÿ×ïý ~÷_ý .ïÏð¹ÏŸý싘/æ˜/f‰Ú#›U©ù…‘_D™Å›ÏŽ8r=$%pTé.éS…ãC§Ütka/Ù½œ%NÀðÖJ¬¡,KMª·J)8w…Y†upEÚ‡J‘®[. ´3b±¤H‡ßÄÚÿ+à‘J•Êjq*?·tàž«†KÔe=D“¥6OLj*~¨h‚òÇeï’uÅ0x¬Ö+ï…d Þ¸}†÷œ8>:ÁÝ»·±³s »»»˜/æ°¶…µ­:¨3ö”’G=¦Ë[U¯¹¸ZÙ­ßp¹k!R7‹ ¯„³ä‹LkejX,œ\mÒz‡xøðÆZì^ÚÁîÞ¶Äð5V +!À¸¬gPÄ”õ­×–´#YÒÊCÅÛklŽÇ”W«³}žX“@( ä"ˆIB˜µ±|ÁÈ\lDÙö%Ž aßÇ´~ˆK¨ƒÑ6Ûbˆ¾Œ„óE'Ƭ„Mv©´3†¡©YÒŽ(éSx<‡ÖÁ$@Lë}pjMMO*… ¥ôu2ø¦''‡è‡S´íLÕñ%*_zM±WŽ…f%ÌB’ÎïœÕ¥¢„©(U·!3¶[¸IT—Þb°¬ïµ Â2J²ùŒ ¥´Œ/@•Ä &}z'±´Ð¶Ü”ÌØ‹«leG‡·ñÙÏ~òG K„>µÒÖ³Ö•Í9`HôÆ0œ!ø3PlÅb ï8:ðàÁè0Ç ÛÍ!–v†³û®ÁSM‡¿øÚWñ¿üÛßÅåÇv1ß^`1_bkï2þ³¿ñ÷ñî÷ðü‹»ð~Ìf§ Es*„ÝT”/koî G·›‹ÇÏÄê~”õ {Ñ£/ô6/ºàk9'ÿžž¬ðÇ_ùþì«ßÄb1ÃSO?†Ï|îcxáÅg¥³ö±¨¸k”ÕÍR´ ºÐÐ{ñQ—‚cE2– ŠÜQÇrÃÎQl°å2§;d8W Y“l(ɉÌ)BöþG«€Wß>Æ{+õؤžœH;Y ÀzÍðá!<|€"®]¿†í­m´mWóyÚµ¬#w”„[|®ÓêsJ˜ÐÖÚ²ëä•­ÆXænÔxÂÛo¿fÆþåKX,h›VI Ä“0, Ä Sß<ÕjXc“P,…Ȥ[•cA¾˜(]¹tÌòœ9gÓO9€F¡ CÒÀXgU‘”ç,Ê=‡òff5nšmà}_xñ›Fâ¡Jå*r±©‘0 ŒÈ©H2'Ê^³<ASÊëøü„&\ R`õ “â;ãò¥+¸¼{ƒ6Ê¥¨Óx¿+´±lêu®—šnu>$ƒ•x §¤i[iN$ hêÍ!£]F…e<¨LÎ1r€Œ€ZÕ£Ú‡ÓIZ ºd@/æÈ‰ptÅ8KľÆ98jÐÛ‹-ÌÜ Ý¬Ã/n/q}—æ¶+ ³3y°Ø(YOtÄ 3¬a¼þ½oáÆõ}|î3Oâ—ÿÞãÊ•=4Cðbíª3²÷>ª#þÑŠòù‚ç6z–”îvº#Æ£•Ý\‰a÷ÒìÝØaë/a жÀéé _ûó—ðõ¿|³Ù =q ŸøäGñìsO¡ïø„àÌžæmV,QùbyD0Ut—póH%Ç9‡Wð*N0 CÏXŸâ¹{!¸‚½DQ‚ÃÔ\WdbÑÈQöEF[&”긭T±©VäîÔäÛ¶+(`´0¥ÐϲlN›Dó„!Äj­¢äMs`Ùû1ø?xø ”IÏ•MÊt ØX„`ŒtgRÈ wŽÖøÁS¯B âàª/(]•@h">u„1† M¹÷>Ü»ë,×`k{Û[;˜/¦á.yªvqê¿ ‹ÆŠY Íߦ±w-s»I1Û¡¢=9$Û‰7I£ˆ­Ê½>Œ è5n•Œ"_ÈÆ{ÆM\óᛀ#›¸ŠE‹xLÓ«ß’—Ü3i%ܹ˜Ú‘¸K¶Æ‘’Ó½òÄ?{n—ÉçNù<‰º²¿Är{‰÷ÐÑ Ûí.>ÿÂ'qõ‰Ë¸|e—övàmÛŠw¸!Š`ÜÀ8Í®‡hô…7ZŠäë]Â÷ßþº¢ó‰†Âû>5;¤KQ?êÏÇ5¦0£†e|µõÆ]ó†1}И[OáÆû‰ =’—Îú{ß}¯¼ô&¶w:¼ðâ³øè‹Ï¢íZÌf]bË“êc(…Ö=oäHB2õgwiÆv®ý€ï}ïX¥Ldc׸w´FÓšV¶À "‚@{ö%åx² K¥Þ.©NÝzGLÞ,› ƒÉãé´C"•…›ˆœ¬*ÅZDŒ<0e°<&Ì5.3fc”Ô¨ÜùFƪ÷8]yœöCHV+V}ÄÁYLA;H%gV¦ïõœ•µ-(Ceï‰Q\Y¬öÍ *Ü‘‚bÀ#ø€Ó³3ܾ}Mãpeÿ*‹¬sp®I©I§2)›Í¤)Ž£´¼ãÃøõZÎ2¸£¾12ú[Ë:·‘ÇFܜռZÝÇýû@ÆàòÞ%Ìç3)ÞÎ!ÆúæYn”¸b‘"ÅSî(]Ùäâê 3U hJl&õX’1r)Íãwk£ G)J#&Á_5Gìï=†·ß}=ÁpêÆ8eR½Ê6Ûù*¾2Æq½ pb~ÍŽÇ~å`¦*L£XC08Ôc²gÒx+cQó ‰Ïÿ¥Ïà©§ŸÃ²OY ’u‘½$ÿ$¡K~Ѫ!ryáúðòk/c=DäØ9B×Hœåƒ3ì,46À Ê@”Ò(.‘¥ŒJ9ÊXS2(ò®û•Ÿœ Åžeôm7VßbqgaT. bQ)6© ûp)Ê¢P|H#ka*{ï1ø€àG+w¬qëaï}ÐIfTÆÆ Ò0O Dñª”€Ú]rÅ/ªMäXŸDJÆ$nŠøÀM¦w™´í?xÜ}ÿŽðÈ­EÛuØZnáêõ´ÉB«´Î'ô T|ÛPò\ª¶C_xË{×Ô®‚CJ¨*¡9iúCr‘™a?ês@C²ÅeVÔ̵¹j2Œ2L°.dõè}Àcן-Ž)›&¾äGÁFÎy’7üù¨Às¥ƒÕ¯¥Š®ûÑ(Q*M'ˆÑðJ\ãQ§D˜2žœô¤:Àɾz‡¹h~êSÏ¡›9ôé°¢Oï%R¹Ó:±áQ³[Þà'zÔ¬vºøV£‹«ó6O“åøÂÑ·öuç=–¡u1~”Ô«I÷ý׺èýÐp) Õrz¶°Æø¿ÿC|úsÁcOÜÀÎî6œs †]¤"Q8ài¿BÂÒ)võ›o¿‰Õ*ÁH•'×0vv_{óö·gh¬…kdÔjbGE˜Qž­|Ý É£Ë-g¥ü~@”b•nf&ÈòH!®÷­yî''ÃNB eà4Â)[FÕŒ!„ÑûúÁãø,à=Þº×ѬÐ;ÒzÛ¦hÊë`øñ¥'û’Lbé/h·qÞ9FÄyVV ñɆÌZgj˜ì…EòÓxtíCÀéñ nß~Û[—°}ióùd œ•Q.q•–Ež7SÕ̦úm9s¦“5)ï†Q¾,RªÇp¥GkmDähJ2³té'!àôô·o¿åÖ[Ë-t³VÂPœùbFú ˆ<©‹y_ý«ié›}Α×i7•ÛA©[%AŒÙ%pJLb¿PB0¢¾x*ô¤­È± QËchÑŒ$(¸L¼J=KÊ,6­|¡2õÿÕ†)#÷$¿H™%Z§~4 ‚élÅ­[?,Aœ3f6€D=ÝÞÌÞÖ—®ú‘1fS}>î£âÀÆ Ž²^cû&X 5ÅýQÅHß„¦Ê»Ú{§K±µ¼Vâ9µäÐÞùñð´ èßüI›ŠîE-b½(sß«•/¤|]<òž~ŒÒÁ/‹ý(;â©áìÂ5Áî¯#ËÓFŸëƒfç鬓_{õ‡øî+?Ä|Ñaÿêe<ùÔc¸ñÄ €Ãàeê.ÖZ[nç1FôC÷ïß—ðXGh\ýÛ–±¿gðõ·îâgæ7Ðv œ`m+*ט¯ö5¥G<Ǧún§d)22nÍüÜôÄ$ZŠ!‚¬I7RN£Y*Ñ}åu¬½ž&+ÐEtá£àV%t<`‚eï±öëÞãdpóÞ€‡§ý rˆ\v:ùÂÕ´Ë&Ò)_±ö±Ž<ÆP,m}³f­…¤n§DÄB*Ä%20E*št±Œ•o` ±ð‰­=ú<úµ8>9Âñɱû­Á|±ÀÖÖ.vvvD Y]þ¤¨f« qÅ`å±ütW˜»YMbÂ(—9¦@8z…óDŒÃ¨Z SÒ¨OŽOqr| ë$Q©mš‚ >ÂÀžGãÙ1Ÿ:gqejs³/֘Ê¢¨æhËgŠ‘‚üœÎZIÓABM¼_Éóõ#òø’ª¬itµUÜÄQņ$“B)þÌ’ ¯òÝ¡ëHISªgŒU+"-âãH5‚Ö°„;@­'´²Z!7§*í‹B/¦Å}Z°£Ú-Ÿûû“° ¨Î¿\VÌѺ’TÚ›¢¡ñxbWýÖzÿÌã¬á(¨âl{m‡Ç•«×ñÆÂ‚~§›‰á¢"=ýÇLªÊ£>vs§]ÇØVìõÁvª‹"uÝ£öËŠ¡}‘êØÞ£ai«ÃeþE?¦.Òz’òA4o§ðKX¦­Wk¼óæ-¼ùÃ[ð=ð±O=k7®bk{‰¶m¥&q”öKþg%ûf+ð]+Ý`¦Ì:FôwŽVh\“Âm¬¢ÜåIDAT×=æ$° .Aé‚Ìø?šìÁÎyД7%m± )rlÓ8E™ÉêPËc/J´˜P¥!D Àu0ôëÁcÝ{¬‡€ãS;ÇŒ÷CÉ*ŽIµ]\il™édΘBq*–1-6àÉ*š–ÁdR= ÅËL¼aÊB2frXf—ñ3ƒŒUÙ$¦0rå9Š#¬k¶Y¬‡€Õj÷‚9`ÿÊ5lmm¡ëæpÎ%•´©£í|D €1Én§k„¸UI ò~Œ´/ž*Ó½ +d&WŽo m¡Á{¬V=àœÅb±À|6“ ‡Æ–Ç!O+˜f/â=ËA²¯#ƒhÁXËk+ïÌc2õ^¦ÎÕç)Ä”Z=ß/+Œ˜ìz\âRTÍñ§qÊ*ƒ“0ÙDŽþž²•løœŠ•V=¬2µ³Ð+wKu‡Éh‹Álïì‘ L­ÌÆîYw¦zœ/ìž§…úüNû|ÄäxÜÍç ö´{;¿=_Øô^{Ĺ˜(Ñ¡¨|EtVvÈê™IE[& ³ùžèÔ³Vµ¸áC¢Hó‹T¾@ºoÎuåuÇ|^5µi÷ü¨nðbÑØdý£îˆ/¼{üˆþh] .’ðù×ðcoP­~vVV uùr)óõ¯ßÄë¯ÝÄbÙÂ6W¯^Ás/<+֒ĺ¾ûþ} ~À²50hF×RyAs²Á¸ŽàmÄË·ïâèÌãO\–€ygÐD#B 2É«Œ‚Ì^gF*qÙr>\¸Zƒ!y›¼ÈyìTˆk\”®"æa |€ëÞ£¬WëuÀª÷8^{¼{­½Ò²pL1Í‘vÊ!È;ÜZ‚†M±½sœî'u`DRç‹G†°ˆ%,Â(åpCæLÞœŠC9[­Q þ Ø×äWæÚ9…åí¦2ƒû÷îâþ½»pM#áëÛ;Ø¿r MãD…žÐZ£°ü3dëK€©ôzB‰눭¾é8Mb¤âk×ÙÒ¬hQäË?}?ÀGxøð0Y¶—v¶1_Ì’ö pÂÎfé[KÉâW½µÌ¾\4Kd ò!}ÏV g¼òž k¬×=¬•i €bÏÒ¢`Vcæ`Aú2#]Q+,Ò€ÕBSª¿Ÿåy”­|ÑÌu|™F¯—ÒçÞã/þ„80Ž…œò®?(ìâ\|$ó9®Áƞ͘ 0žxݦ@lܵO„©yÀ%þÿ؉Ê[kèŽJuÆb>ÃÛïnFÓ5scÁåÑÉò;勯äãϯ-VåÑüÜIáóùþïç¿‚m ºØÙ‰“sÓ&-Á6À¤Å§ïI<‹ã7›íćë×ǯ°t?þøb´“Ói+ñ“)â®8hS}ªsŽÉdW¨üP‰(¹’¥"9-‘Àð½CÒö«U„±W]«¥Ç³KƒË%¡w@àXœƒqïÊÚب¢Sv°Z.— DC@0,¹AœÙÏÅ"5é9MÖ­› K;9F`8±š´%¦3q`"¼ž’ÊRY*pgö&G†Ù# -\åýÂHò>ÄÃHH}Þ¼|ù¯Ž_¢iL&Ü¿€>|ï]&RÑØƒ–ô¸b&‘Â3³+اë‘eýx⊹ *Dª¼ËÓto­ºËe´•‡ý{{˜NÛh£+ÏwÌ6ó‚4 ÂúÖ[ÉÑŽR°“Ó×hldb[#Á7JîãÐ*†¼±õj³' ?IæxGÐHcÚ4uÃ2¬eùqH«¸d”i‰Þ‘4øòø[|ðÞògšeLƒƒp¸ÞäF:ÎQ‡e Ïä”!ÏeÂäʱkè*È[%0º@ës†ÈŒÀÂå'pÅÆ%Nºi³>åVò)rÆàìô>úøGxüøKµsÖpôX1Ý4A1³Ó±½oÞO×U‰hSc€Q)Ö¦ Z­ÁwÄo;ÙÒ`¿{[‘¾«ÓÝq’Æ`§>d˜ópz–kCôe(%S0øðÁŽtëQkš4‘­;i#|×6@×% ‰vã›ðÍé)v'b²UÓà~Û–4$Ù奵M®T‹fbX $òQá€ét&#©[)«ÙûÞ3ºÞ¡s]°è®º€“kàd1(;çg‹µe”d„¢3…²­ìU냆²–9NÀqâE6¼¨ü†‹Í”¤ o”Ç„ìÄ¿‡Ø£š’ŠD¼ÀßàÔ<›è 7ÔÄÂV†ä®m–žkžÚcʤ¤‰¼…Ž£¶#•kxðçɾ"…%Éóâ®S ÌðüBkBähèÛ¬§ .{†Æ®°³÷NY_©oJk»áp²Öi- Ècc•0`ÔV®úïvõþÝþØýüã]vÄo=Ù¢þ,îOYí‡7Æn›¤Ó÷Nî´)ê’êßqÌÅL¿v¢ tàZƒ¶!ìÌ"Lg É:ÂÜZhk•˜¤ZY™¼žŸÝàÅÙG»3;³³i›—€’zÃT“òóÃQÓS²}¢zÀY Nïz `+ç±èçcÕòÎVÖŸÑlI¾"•Ü*Îy'¤2­.{~s$7=fìß;œˆÖs¹·æM,î±Ý4¥Ìd¯!?“ØhÀþÍ&å&ÆÊê¼Ášt“\ŒëC3OÍk¢àª`Xk1´X+#«ëæQ”asñÞ& ^³‰y 5pð-Œqº³ä ¦_…Ää¸}Gœ§Å·õÐ@·’ƆMÁ[NÒ<Ò¨a %`MÿÍ5t¶õJ‰™mDóÜ TH«VŒ¼£Ô¶MLQ2’y!×Ô(|wq‚ó \wÁœÞ=ÜEÓÚ*_*Ÿ˜ÅÚ0@ÅRTàWÙàç@F{ÞEéMß;ô>àº78^N±èâìäo º¬¤ZzWÝ*J,s®†˜x”¸OX)å‹©Gê(¥ °†êô¦¬Ä*±ƒ¦‚ôêDAãàõF,»ÌQ&®%Ø7Yx†0 9T©\äNÕž…Ô=Â2­ÑÙGÉâ$c“WÇxýê“ɶ±888ćaÒ¶ðÎÇøFMXÊ:R [ñ,ŒxÄ,[™ücšUIeÝ6Eâ\rñ"#ð&—)š(’ åû“‰$C’0“dËé‚Ë|„Ä &mCNí7Ëåjè IŽL)®v@àd®¹p N–¼AÙÛÈz ”|›•öÞ¨3+7:…HF}™øFÞÇ{ùûg¿Eßw¹WžÛöoó‡>ÖZ65Ü[ë'‚×’¦Hyr«|l ÇP«ôô^•¢*‘K™{äbmêý'©‹ä"\\Ÿa:b¹\ ¸‡±²°Ñ:jR_Ç–Ý2Ç-Üai;RDqDZÛv×[йĖ3hhDü6“í­Ú\“°î졽Á³¸ÅxmPÁyƒÛØ_OûÂ2ná vÒÑIHŠn d7”â3¡Œ5ìO‘øb[À ükŒì< °ZF8ù—ϾÅw§¯ñ'¿û >ýøì Ø2u2)“†hÄ0(xMI¡B& 1™#NÅ},¾}ï±ò7®Á · wèã®Ù‡hµ˜˜¤Ì9Œ)"‡l$™ó„ëÃBÁ°*pƒJŒeµ¤ uê{§iŠ>9KndJ à @/>Ø1··m òƒ©fPøuÈ}2‰)@ê†[ÅÏ%ú2svy3ÉÁ*´\˜©\Aäñ‡ö}‡¾',—ÏñâÙSئÅÃGqppˆ¦iѶMÜWšL¾"2Þƒ„‹DóÍl¸@üÊÝ-¹Ÿå#( »‡$Ä¡ìåsŠ[‚ËeuâEbæECoDŒNˆ¶«®ëá$ùÉ(XÛ(–69ŒG¡ÆÄl/ľô\ä]³ÒP¯5óYÖWH($ûy$~†#˜‰ëÉ— èú±¸¾¹ÄÍbŽ{{G5ª$2·MÅù6ÂØ&YV%á¤ai™Wz ´ù×åV§M•Cyè)½ÞQIy¬&-Òdž”fFCɕޥÌf€s3Ë,Áª]ÄŒzŠ¡Jtz¹…Å=,°¸E¦Åöö¶=7ÃáTßtK‡«Å5úk‡å¼ÃåõÚ°ðge‚®vþw™lo)ä·yhã–µúÛxvMîùŒÄíi[À¸o7Ñf²þp‚N{1#ûªee HÆ ™aÊe7G>Bã,ÞÐÖ2fSa5{`:µX-øÙ—_áŸâ/>ý~ü;ï£i ÚÆÂ+¼†QZYâÜ´Ö9„€baö.À9KÞÁE˜ óç¼$P% «Ã„@•vÍFÞ kË—Ê$sJÞÛ‘¡*ö=Àg‰þ$( "I6q9<©°¹×63ØÖ‡lù>>|üñCüꋯGö¼ÃSØTóóÝÞÕ¡þySºm\³È«æËPFJíªÁõüËó%N^žàÉ«'øòëçxþúº~ƒwÜÇ£OàþþÓ©¹ĽQ52‚ÞÕC;Ãåwi †¦"oš~ÅwOÉZûèŸa2×çòG³¯X0'±PGßmÎðL:ü‚gx½ I`Á¦‰°YÓ¡'°,±t‘ѱ±‘ù}q}…ùï_â¿>ÀŸýÞ'xïpû»SLZ+¢)‰P)–„§LIáGïøg+ž`N»â<Ð;)Ê:vQù9E3 ‰óÔN¯D3&™‹¿v£’”N`®L:ÄÐEòv+ÈZ ±][£Q!ß ‘V©¦1ùàID¦B^âBÆJ$«Tœ©–³%^ú|)OéÁ,MLI «oJ“`;a›#3V ÈÎsMîJŒë4ņïz\Î;\ÍçøþÉ788:ÂáÑ»ØÛÛƒ% Û´EžÎR±¬xË'†Û!9Ú‰Í+Óƒó‰1\G¤†,ØÂ#À6Mü!6 â%ž sx'ÏhêYܹPsŒ“ÈÊ¿&vê^é›5„LªëÆÛ¤I|€Î±r"K+œ¸IaŒ ¾ßÆ‚•fÊCå 3¾øÍáo>ø!œwÐIH m00µgõ†b»­9’mšÊ«bŒqí²Š4Å8‡´,5ë+{@P°Î£Þ¾¾¿‹°¹æ®$EB6#á€wÞ9Ä«ãgu4Ú”Å<êÅ–ÙR‰îâôÅUñ×ÓsÕøSäXœóð]ˆhW·n,n®ç¸<»ÁõÉ//_Á5WðÁáz±Ä|~ƒÇÏO°\vhÂÄ6ìaMÜ¡„¬ƒ¾‹'ÖYyÛ<´oƒžßÔC{ÛÏ»u’V/Òì\ÞòÑ­Mïêz7! ´÷¢k˜µ±ð[ ½ AnJ°%¥µ6hÁ æ90lo^ï Ó)0i vW„³Å~ú?¿ÆÞtŠÝY‹£ý|öé°3kÐZ Û˜hJê:¨ÈhBp>`å=Ͱ˜€W]ŽŽD6EÐ{¤²Ÿ2¨%Æqäâ\¸LÊ”æô “ìå8ÀR´‡d™Ê©"j^æÂ"M‰Nz§œ³„ÕÍ ×Xèä)“Š´Y¥CXnÚ°+½¶æ'"²LŠâ̺Y­7VlôØ XÁŠÉŒ)ùÑ㚊{~/,ÁšóùóùÓ¶EÓ6¸wo‡Ø¿çB° N©NêwIк¡4OéÀRŒ5â&kx±L…ä s1¢‰ü#Á.±éqð1íJ¦2k©F;©@d3ËiXWCéÁÞ¹HÿcC¨üµÓDUHf™d“!5`‚ªà)¾ N âÉŸ>ßÿøÏÆßýí?àêú¼°°ô¬½Îr§Ñ¢=~ÄmâƒÈ7Å^æW'Ô %ò“i zžâJï6t«Øö<˜´¡›tÈyá1Û¹æ§Ue) k}r³–VôÓm,©-x*§à¢ø0ˆ÷»¿f¼:>ÃËoOñÅW¿ÅË“cÜ,—Øß³x÷h/Þ÷†"úØÅ3Û“Gßõ¸¼¾ÁéÅ º."G“f‚I¥¥]ßÁ®€à¼2*¹ãd{Wí­…^“Æ4}‡Iš·Lîcr¥}æ^¿M5§W&­ZÕu5»òÎ6… šÐ×<#Q•^ˆc! ¤GÉp$¡¯¶L‚Î{{“)£ï€®[áìz…“«9®»%ŽvwñÇïãho³é$OkFEL²8^ÝÜà›ç¯ñùoã£á³?ý¬2)p¬Ï›1È$›uÖñÿã3Wvšé¯aaA‹‹³rëÿÅXäÓ{QvøÁ›’¢#†%¢L" 1¸È”)ùtC•œ†¶NÉLe¼Iq2©Ð+CèT$5³8ú¬—ÏÑZS¨Ö ë×s {C‘­ ² LùóO¤?}ó3)5hVµ•ðï=1.ÎO1¿8Cðï½ÿ{ûû˜Ng0Ô€…à…‰9 Ò@Æà—¼ßcÑ#™´™3Ü‹^:j¿“LöñÆJ¢˜gëÏ+rž8Gí·±ãëç»iÙ0Ý“,MAIJt¯nÂ1ðšÒϪ1¨=ø¹ž•ô¹ØÀFe(2› ú÷myÙpæYù ÿöïÿ„¿þÉßg3š¡íg–, ¦e#èXaÝjd²¡`ý»±}wvFKðò`1!óWHg¡Z‹¬Q‡)ë-5¯­Hym¿‰‰bøÞ9úß>jZ†úy¼¡Ô–߈À›¥TÒ¨’r0KÞ}çÐ-WèVWW×è.Ü¢Gïçè.;<~ý—Ëk|÷ü%Ž_Ÿg²æìªÁåÍ-¬•@Lð`÷s ç<Ë7ËN΂Í1¹ÑÅoÖ7è:mõù†“í¨‡ö–b¾ÉiìMåW·Yœò6%Ü ®”¶4ú¡åA7^IÔ©È÷Ú=Ƥ%qFâL¨ˆD)f°ÞBCHúÛ %S õR$Ú6¾¾m¢³mç Þœ]_ââæO/^á`o†Ikñðþû SnëýÙ^ÎOqÇŸÿñ_½Ë¤/“4›&A¼bêA)Ùª)4JÍ+6.F4a­ D!g%;Ê¥`šÅkM^=Õö˜¹Ž(΀1&ól0a(ï¾Ót¬¬GrAN2R×P“¶•ÿ²‰n?jÆÈ+k(ÿœ ,ÿWüÑü÷÷Æ'`‡¬S±40 ï˜Mè¶I{ü½V¼IYqªI™`”2&Ô| }MÙ´‡·cªÕÄ”B|Êp³·»ƒ¯.aŒ”ßP½[cð5cœa>¼Aˆ nÕÃ_ž¾x'Ožãéw/ñÝéSt«]׃ °¿?ÃGÞÅGï 8FÏ=ŒµÑYOxû÷fxÿ½,n¸¹Z"8/FS37ù¿õƒM¸çþb‰àœƒëBÏèzÿã8‘6V 5IEND®B`‚plee-the-bear-20251226/bear-factory/desktop/images/level-splash.xcf.bz2000066400000000000000000263464541512343254000255110ustar00rootroot00000000000000BZh91AY&SY.q‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿè»?@P€ Rˆ©Ê­À¡À P€(  ( #í €ú ¢Š H€IJª§­@ª€TŠ ª R¤ ¨¤ŠA€CH $P’P”J½2‹ØÔ{‡»$ $¢P¤)@PPP @ˆ‚Š{QëA@(ž…Ð € ½èR‚R**€PH×»è4G@ÒšŽ€=V”@ E@W°= :4Ðt zW × šP ! =DQR^Í:;° Rž€(ã`èô ×zƒFÐöîƒMlÚÕ­k¡Ð^Ÿ^ûGÓE)G@צ€ÞÀtz{`zPÞÀ”@G@[t@Wví@`jš­t†öòõ^‡ÐÝ€r”©(Šôz@4 ž­ €Ëºm‡]PîÔP}]SMìì¡Û>tÐdZÑ}ƒÓ»ÝO@éA¶iO¡ZÔAÓ@ièzttvÅì4š€iÓ@4ô€¢ì=zÐÐ@uC  9\¢”=ì:ë 93³ P§#³rt:-(iÐt}îšh (…A@@ë Š=4}J=5[{†JîÇwVåFžÙ ôâ°vj»vÔ ÐPm…tÈšè]¹­}‡¡Ðow=±ï, hM›¶r8v vÙˆµîÀ= ô:fŸv¥«ë)€(>ƒÄÐ…h}5]tî`»:4t:4Vli¢l@îÔ-™€»¸Ñ§#—@݃“] šû°ë{u×v÷bö(ÄM9tÈÙ¶*ë m*7k»:î¶­ž½ã= €Ÿ@è[b€èt­h}€]}îç—F€6Êë%ïpQÐõF€P(n`¶E{­éè¤ovöÐvh¢ÝËÝî< ;µ»™4èKµ¹r »uÖk®=bîÝèg£ªëÞð)xì:fÝ3e½tL§vû²‚@zP¦²höÁ¢÷s£MC¶(iÒ—g]u“EڨЭ××¼=€°CÐ÷³½=€UP¶;±§ {ØÝƒV˘Þë¶ÁåÓM•C®õºÓÐîêrÚݰHÞî:{K ç¯pz릚Žöié·p Ò\Ê5Ö€ènÝÝÛÜ×½GG@j6ßCÕ£ë% }³é¬€+¢‡@47`úè4{\€J¥¶Gv ·{½ïUná]ôítóÖ=ùîèЧÑíjÓO¸ÀöÂö¡Ê«Û͹¡[³võ»5µ´×qÛ¸)Û—Q“nWI ¦¤wf•k õÐy«Îèvwuݶ÷yxÞÙÊÛ\ƩҮͻ’‡½ž×»ªÛvh-º$Û‹Ž÷»¡èÜËVôo{×®èî•îös×®)¯6÷²•J»ZhÙ u‘l_AôÛú4¦Û®€U:ƒí€< Oc»-”6ë‰U {°<Ï^ðò€­ Q§½î Zw·–VÐA´m±¡Û7{¨¹½çN×UÈ-€Û·t{goknݺ÷ºöÕJ=˜šWõ«³½o{(ÛµŽö u ïw=ÌÞàõ#Ç´Ýïo{€vXô ¯ éôÓm¥(ëèyy}Ó®»j»vîjµ§:¬è»¸êÌûÞã[e^´ºv÷o{½6÷ Y:VOB®­¶­Øصºi»¸{±Ê†ƒ ÑFìõÜÞ3œ(g»«Õz9w»×ƒJ]îS»Ûuzuïwš]ÝÕt-¯U§‘Þ×°§nî¶ÏZzïyµë»A›+ÓºÅFí·q§  »»Í ( °ëž÷鎰ú–¥÷p@ÛíÃï` ú&ÁУ»sgZíÑl}:t=mºÞƒÒÝ]]®Üì Ü÷7m°ÖžíݹÙÝj™¢v k®šj‡Z£#v®¦˜ÓNì­…^ÞJ{oA®ºæÕÝ'mÀ7jÜëw½´ô=°éã·lK¡ÝŒ·l´k¡½½ï,õ=v=h^Útè¶(À‘èÈôPžš5¡ÑBºPy}ÓèØîÚnû×5ç½çUC¦öõÝ€(k{·§oJìk«´®îêƒMPtô4÷™í×+Z®îê {·:çÓ«nTš×g:÷ooC]#·{« öê½¶µ¶m¨š÷½ë&ÍNÀdëÓ¯¬ï-À+¶i×_o{xdÞ¸ô W{ÜA# k·pë§‘Ð@^Àu!аè‘{îÛéôút¶(u¡“vîÍËëª#Ú÷wvé¶Ïn½½Ùí€=íÝž†šÚÚѰ[ª½Ï;uºë®lhWvÖ†ŒWS=¬§®·o{&÷)ž·M½n^Þ»Ö®Þ½ÓË›“ÓÛïw½žÅÙÀw¬véÞ´S[ÎÛ™MKC ï°÷ßwZô;Zì Ökv:tÖî°ÓЧ@<ì{ØovÛQÛÜ  z(ÓÊì´ÐC®NØUnÚꀮìt»[IHìÉtjçmÝçN]ؽ{Š5éUÝmZÚöz÷i°]‡WvíØ¡Ë»R÷nžÃ3t×¼÷†š®ÈõîÒ½ºïaÐ^Y6ÑNö¢Ùï<îÆ½{`$]@ F†ƒ ªz¥í]:tè¾ÛAõGOM5™¶·XŽƒéÈow^»wvîÇœÍÙäu]FÒ)ÚÞ½½wVÖ5Ò¹n»mqf»¸«n]4ÚÅíÞc]Í =áïO{=·:]m\7c¶õݞݹ]nÖ»º[»Þn·C£×;PèÓ@ga»ë@^ÝÛ¦^†Övžkf½ì‹]«¸­Õ^ÍW¹µïc¡ÝÝîçe.‡]kZ(zÈØÅÛr(kÒÍïÝÃpè®íïeì=]wmnŠë{º znç/<à]–Õ֮역ëi`{ªîPkQÒšé@o`·- ëeÑê@{»Þ½u3»qëÞÚyÛÓ{Úê¶]ž÷nÝé¹éàž´=w]sZocU{uÑëÛrƵN»¸ ·T$vô;¦ÚÞöðknÎÖ€d¼îD)è:=;›ÓÙ©ÑcÕ)Лor€ÒÝÔ*ºÐ ³wuÙ¬—gEÙÐvó»²óÍÀÝíý·w½w°õ½ˆ*ÉÜÇo{Ýç={uݸwOU@Û·m¸½î==ìR¯võ{`—e==íIP¦š:ئö&Þºt»Žö wnzÀÕ{Ýïz¨P{:GgC¯'@÷±Í‰JØ7½ï/{ƒ­Ýs£s«µïëÞ­à÷½ÍSÜc“»=ë´ã¶îNÛiÝë»Á]›žÚ4h%켨‰¶hÙfžÝp6뀠iÓ¡§[`èíÙÑ­MÛ¨ºïo¶‚ó]4Òy€z›¹AÖvÕ;ÝÝØ{ž“Öžoã¶×Xvõ­Ã¼÷¶óÚÛÞá¯=î=Û+ÝÏO=ºÞ¼ö÷M½:·ÓëÐ ívk»IÓ¡õª.±î`ål»±œÔ5@XVí¡=ž±Tmî ]׬‘ªöìÚîŽöÛ¸]ïñëmç– îÚox{ν;Áì÷¡ìÝæ½Þ{e뽯{fÞíïswo=×¼5ç½çyµ[½w^2ެΗf”{ïz{ ;nÝn³C®Ø(>{t^†÷½´í€ßa펼‚€^ì-Šyëkz»»šïm­ïë×½¦Þ÷»ïç^òö{Üè!ÝsÏg³k¶½´s{½y5ïïkrÞvmíî±½ëºLówm­{ZíKµSOM:ÑäT:û9Qío¥O{7w—½ÀmOn¸÷½ÎšÐ5×{;NêåÎî kç=jó­·7KÞzæ¼°:p©0›v÷‡qTiWw2:(eÏ=Á¶Þá¶/e(SW°±€÷°rtëÇ»Ýè»ièΨë¡{‚ެa¹eÞ÷;ÆÝEݲn.v®4áë®×\³½u¦”wå¶y·{×€9U½¸u JžÛ¶*Öwkjíï1Û=µ:¥Œ¹­­ClPhw»£®^ÏF€tuÐÕë»&÷Q6;œqݸž{»½¼žb,êw¶zÏ[Ñè{kJzzèíÝ¢¶aFÙ»S@tõÕ5v¶ŠSÛÒªÝÁ“­hi;®Gvê—6ZîÃS·OYÚ÷<”èkÖOyîÍç7\äk6ÖžêÛ˜óc݆@hÞîÑèvÞƒC½Êá í·c¡§Z¢‰×pîÀtSARÐ7wiC§lznzêíí­³ÐÐC éØÔö@Ðô2Ov­Úww°eÓ×;W·;гÞóÛjõɸÛÝGBUäí®l í©Öm¨µZÙt4“­^ÎÙfö`*OOC¡NŒBæÝº ¢×p 2 ÇM4ѯFºç·w=»»{s×mÕ9ÞáÞ`;½À;Øu» 4Ydõ—`Hdé®–ÇMmº ØÛ¥P6ÊJ®ºvÕ¶îͰíµ@h‹™{Ù^½ií‡#RÚÁîÜ´ÖÝÍt¡@S—Tv vîª:îckM :³Ø­€-ØP‡GEð:u—nÜz¶( õ îÍØz;³MÝÎØ ¶ÌØ+¡ÒFæt­H‚±hÑC6[¸h¡ÝgT  ÕvÝ×9õvé@ãP¢–ÀÑ‘N¹:Û¸ (Ð$ 4j…›fº×*Ö€)Wß{ë_B”4Ø»*¨ Þ°*ƒ‘VÀ¢Ì4)"…h(ÐKÁmP¡N²=Т€tm€h P ¬46Æž+ *†@y@ëMHhòº7ZÝš;jh×EJ mîºÓJ5@(zÐk€j´ÐèÕ£N€ :[j (Š@Ð t (PÖ€èY0×Zè Q •Oðš  i 1 Ád11<¢di Ó G§„§ƒSL 6•Bª§þ€@@€š!£@Ó## “&™2i‰“!0𘧩àSÐÓM4dOC#Iè1€&&˜&G“@…U?À @ ¡QOÇ©µ%õSOPò›Õ?Tiú¡èʆPÄÐýP Ú‡êHQ zƒCÔ *©þ„€€ÐJž§è'¦“ÕM’~Õ&õMêOÕ6SOIè†Ñ7ª=•?Pš?RhÓ#L™4dÒŸ¢½P  ?T 0U? @@A †©™55OÕ?Õ3J~¨ý5MèšÂSG©¦dGêe=M? Æ‘åªié=Úž¦Mµ#F?T ÈhÈÓõCÑ=#&€4¤4Ðb©øD 4 Iˆ4ƒ$ò4$ôÉ´ŒÒjŸèMÊŸ¡ˆš‰æFSh)æ©úýMOñ54òžÊŸ¢i‰§¥#)¶Tdò›Dö¤Þ¨lÕ6~”24ª~©þ´?®/ñÎÿ«ãàVí1taìH@\@™mo~º/ç%à=£ó#Mƒè@@ !Öõ€X[ú(^°,¬þ™žøDÿ²¿x?[Öý¿öáî(_[ýoÜ{¾/¬´=éÿŒ_[Öõ¿ªïƒö†ô0öt‚÷õ¿;ü[0A¤`ýûÿ5±@ÿ€>Ÿéí 踜¡þïgò?¡Á§ã«©ñ[øêCþLÿWø¯ýûñ}ïìÿ·üÿÅó¯©éþ„Õ>Èÿ·×ü0\îü¿ÒÕÚÝ;ïuŸ¬˜¿éÍúŸøüþŸ÷û?µÿ×È4ßô1òÿ_ü½ý÷ùIüoÝÿgà[üT?œ.|¿.ÿ줊c;ù¡ë÷…û_Ê—ãþÇ‹ô|Üÿ¿ÿ·Þþþ÷áþ·ûŠìýñ?Ú÷÷6±þ¿{'—ûß3YF·Pîí©Oö¼?û_ÂWö¹¿áû?ÛûOöù?îíüŸkòÿ?—ÿ?µSâú>ßèPÿüù>ù}c¿Sù¼Ÿåþéý„=ï™ü-SûÿùöÊÿw÷}¿GÕê›úÑîëû¿f?ãä-Oó`GaïØ£¹íþÐÙÿÜû‰þ-[Ÿëýéúâã?ާÿÞŸÆgýŸ‡ú4þ®ÜÿÓ›ÿ£Çóþ׿ûµû? ŒþíMÌßãÅü?¶÷Ðÿìîá$|ŸèÞÿenðü¯ÿ:>?ñxë9ôñ×ÿOÿ?™¹ûßíêÙÞýÿz×ÿôŸýu{ÿŸú½ÃOžÃC¹ôrÙ˜Næ}_»ÿïûÜþÏé{ßäÿã?ò·»+ÿwèv?½Æ'søãø{vûêÿ«èòÿõÿ?þ×ùÏ¿ò?ðAÿñwï€ûˆxÿ4CÇB?ÆQ|xÿÏýrðÄ<úà@?戄ÀÀ¼€ð‡à¼€xð|€?¸ãÁxñè|?˜><‡ÿ øð?Ï·€É÷A|@ëð‚í?¾&Ú€ÿÙùÞD ?œÿûøäx0ÿþ‡ÿ@?­ñà€Göüÿðxÿ|?Þýa"àbúà?݈x°øPþÁ€ÀÄ<|xÿCÇ€ð!â@ b¡€x¸GÀ€xýá€/qðñþø >Àh|€  þ°DÅÇ€ÿb <`D|xp€9 xð1ñãCà?ü"xøð#ãüAñ)€x‡cãüaƒâž?µAñà?Õ€þx@<€PÀH@ìAþâÂ7àÃÜ@ÿÒð >< ‰˜‡õ~ÃÇÇ‚ßà‚€Qê |DHD@|x?ÿèñ!à,01!P &>?ø^< € ø@1ð""cù‡ƒ1"ÿ` _Deÿ3Á˜‡xQB‡Àˆ€_ðïát¨æ–¸ÀÚžTý`ôXÖ X;=X:á€:ÁÏP÷¿t?Që!ý¯ûžöÀ¼~Ø~Ù ƒÀÃñ대DDD|‡ êÄ<‚|x>Ããýæ#ðB#¡!xð!à¼xýÏéÐ @D?ô„<xð#à<øa>DCn×ÿ[ýÏôÿñ ÞãÀøð#ãþÀø/Ö7ÿ @ (~þ ùcâ ï>?É!ÿÍü„@âý®ä !þ¸Icþ“û/ýßé”GÇøB !)€‡íÐ?î ÿ佃ýšDÁü² íf(Dƒÿ1ßä·ý”ÿ4žšDý¢ï™ Œ?û÷?šÿÆàÁOÚ" >ùrJ©¹¿ÕûðwýñÑDþÏýòÜCþðBΈâ?òyÁâ—ÿ$š Aíìþ:ö¤Ÿî¨Ïùd³ ÿ0@ b#Ïþgý¯Û_ˆƒT¿±ÿÓÿã0þy‹Çü—WüUAðAƒþ ñˆÐ}¡?Ú Àú“ÿ~Bþ}oõpàïû¢zßlX@?CáWÈ(™:BÿŸûÉÿ¬!ÿ_øƒÃý*ƒAìÈøF¢>ùâÿh ïþDûÿø‹ÂøoÚÿ_ÿ)êù/ü DüÐY”?õÿéô ;À*?ËBǺ ´¬_ÖÀX‚ÿÿ3 ÿˆ>°ãJ4?ÕÔôAÿäXrOÿœT?Ãw€§ùT8ˆ~Å4—ò?ü©ÿtCÿÀ?¾:%ñü5þÇÿ)#øþ@L@Dÿ)‚þ‡ùýrÿû8 È@CÿœIåb2ÿ/þ_ú-÷ÿé ƒÇÃÿîÿІþŸ`0 P¢ 2Ö(í`íñ\ òý¡x€ö/ úYø ?Ë/übübËÀŸù“ñSý@@ñýÐÿ!/‡ŒHDãÀ‡ýað+ÿúÿœÂÿÔÕOþçõßטÀsÈ@DÃüaÿ$@ÔCô‘´‹÷¾þA‡û€ À¼}ÿ¥‚ÿQüÿ×£h0>ÑÃÿÐ09ùà€ª¡,Ýð¾€ O,€Â À” 7° „õ¯ŠOð„ßD+§ Þÿ»»ÄA~¯ô’ÿ0g{E~ð€* `4ï~@¹AÿAÁzö$‚?ûþ¦âBÿûÿXDý€€@ N ?Oì~ŸÑLÀÂð\@€ }ö‰HþôåõˆP"ƒ.o­õƒèd/XoöÇL?X¯î°8OÚü>oñ ëB˜˜'Ùú¾ ¿ø_ $ _µñPXØüp÷¿{ÿ ÓAÿ©k‚‚º'­Pðjz{_ï _ºx[Ö.€[Õ‚±P/œþ—ûÂÿˆ Ò·ù§6'gŒ#¡î?Lßòåý]¿7ÿQ€CV.ôïyªÿîÿRƒÿgu'áAnq¿$4ŒÿÞq_MHk‹7T„Boýkb’çHΜ´Ÿ°/€ö‘®=ðnü:îúö>º½ª®ð±ez(þæ­ÿ/Ì"ë.~ãÿøïW˜Û)ù³gŒ»a_´“ýµÀ9ÚÏpQGÿKÓÿýÑý~Àùöèþ_Ø'þ'o|äjð ïÚ’ÌN¾Oþ]y&¨Nýìðÿz’;>æÕËγãwÖšv^(@®*Þ‘Å­Ø}[nàÀ+Ÿ©æaŽo%Œ´ùÖüåjV?Jí—·Ôãÿ†šU°Ÿç¯:ǯG±7økw™’ÇÔM’N^¿û‘é=cU+ë즭Œƒsü;Ÿ­¿•dgòì§¶~Sç¶[9î^»«HÀÓóqrïìL™DZݺNÀ=Þü1ûï”ëxœQ¸)Œ$´'Nÿ7íë~Óß°Õýÿ«JÓù;¬Rs[ìõ¨ê‰ÌÕ„ÊnìEçRÜìÕÚÏxõ)ìûGEMñ©†úP{½ØKðä5Ͻ÷¿¸Mé8Çñ ¥Ë˦Z¿Ì* 1¾ §lSÁlz~É:³Iþ¤ j£°›yƒ²Ï‹R´ ûÄl¦+ ij?ÇÊob,ùÿ~…rpš »Ÿ‘þ‰¾/o;tÔXé©V^:¿ ÞÙ7_k°€fÿç±û¸ºµét¬¿Õo"®fmµ`LÕ)‚¬÷–‡ÒxÔ¶¬Ò ÍJ{_ìò„]oM±dèDƒª•‰ƒp9_TÅýüÚÜ—)ñPþ³Œß?I5GP¥ìgû^}Ù›“ÌbælÕ88Nò{(Äoë“þnDÛ%%1`^çóÿÚ¯_ îõqœŸƒúZéÎÿ»øvª%ôÔƒ¾ÕÐóÛ§ð•­Ó€Û'‹(ÍDg"÷º,ÿŠ=_ình$“:gÿÆ Ã©úÌé¥Dêýü{mÿªQ¦(î.Ì­íö,Já_ÅIÿÔþ†™ÜJØËMtx¬zã,ôjæÿûþ?ï£X\…ÄËàuìþû½<=Y‰Ÿü»ÌYÊ ÑÄElñd»x<ùŸio`y×4Zﻞˆ_ü‚ ŒîHÛð³æ&6¯.×yyc=ïõü¢–Ùÿãúi-_è&“*ÿSšI Oü&ÿÐJŸb ÿJÚ·*—üñyÁ-ß²HäÎÅlSÊ1"»¦ į›çðš LLÿîfÝÉ5É^¬dMÿõGî/ÖH|®Éæv™}NHfïàÎUlÄàrŠÌXJA«¾«¥œ–tØ[µabmåö‡”EÀ¬;XŵÛöf|šŒwž+ž :§­’ð=þOþÙùŸà£Æ¯óè—Bs¨þáŸnË©{°#Øp™ºÓERžÄ•*„ý]A>a€m Ø«ZüÅDy.qÇö!Q.#«ì3¿ù%§SÔ8ë=pÿ¿ÿõ„¿Ý1£ÕíüÙì}Ÿ³¡“—¼åpÌ_p`(W™||ϯªT¹>Ë#_ü©ÿy‹r¾&mûvù5‡(-e·8Æ\”|S̵šcùHø®‘;“,«†àßü%ÿ¯çá¿×ÙÞkÌYgd:òH‡åí¼ßGŽ›ÒGšX=¶²Ôý ?Gó¾}-omJ¯{ÅóúkÙŒ;'w`tm©ãIâÕÄû ÿßš¯V÷µ‹ñÿ÷í¿˜  ¸ìì C K+{ G<úæòŰ;{*V¤tõ¿gìömJ€_Ò©Z·nŸI?ÅÔ¶ 2 eý:ó§M¯:ÌÍt ÃЊ*zÞò¦ƒVoÜQîþt« ²zsï%«Ô@ÎP2ù@ý ßäLïܳýîSú[èþŽäà2åZýfèÕrއ7ú=Ì-Ó¶÷2¥MlÙ7}ôšÔ2œ}M»6ð‡¹Ú˜Ê6$—Þüáæ ŸçµAÖb›ö'êÁ3([æYcÖÿ×^œ–"ÎJpM~¼žTgkÍÈÁqÿLãÞ Øäã÷‘ Ê­¤Eó@ Ö±Ù Øþÿ¤gkýÃÈÖ!ÿ9ⲕ’ tû ®p` dÅYW†àžohä“ä(T*)Ïè\ÏîûÀY¼¬¼!sS¿ˆŸü<£ßk¨!Öʉ¼LÄ„Z³®§ Od[6‘Ÿäõÿ¿<ïÒÝusv­êäz`+ÿcLlÆ wµÞf„3ºžÒ?ñ^ötõk)ÒüerÒëWˆWêñv?…™)¥ó³ â„./ùà”3 «d.Öo{ýA‡M¢ý~2ÿÏßô#½ì…°Ï³ÒG-óBþ+¾ ßrÅáWý³6 ½·©¹¹À®41Ч¬X…ÐÈ©Xð±ŒòŸŠý.´ŠüK”êÖ‹æí…7¦=ê][­óÆççEø>~,àj°˜æåý¶"èg¥ùÿ½ù.B83ðûÁâLz]n°¼ß‚O[ÍXÅ~ï—rzyDǸë5E„CŠ4*Ýg¦fΩ™'õ$›Ø›ÃÈ{¨ÂA#áñŸ/üÜNÒý?[s|mùµ;ßW7f€Afÿ/¬?[˜?v¬6À͇ÔPb¯ãË¿òû7F0ŠÃ?ìwysCX)—¬Ì@sÑ+±ïü¿¡÷? HøUôJ6–˜{{k$‚Œë½}à#o #w÷€éëld«,oqÙ(~Ã}ª¼ÎEד•ìÃâ ±ôzµ1¿ð@ªÿ°Y˜¹Y×±³p†«5þr ¦M%Úœ`@ pºßõý#¦]XïØòãüŸ¿åïkw1õñƒèÊ.Á‘­½ÅÔ|2úÕåãêEk/Íܳ¸ã_W­áñga eFOçrÊ-8+“²'=6_EË3u+¯‘V×öiN"’Ìœ¡]’£vþ¡«!À(:áÿ9±¾ë~ß @\ŸèÿŸÿ<–Àþ¿ø˜|¶o` ¾:³þ‰˜þ»`àRªØµÿaνÒl«´’´Iî¼öÀÛõ¿%Ö âÿ_þr@Ñõþ_ã0:TµÅÇ‘Ü÷ó÷ÏR…²[§óé¢õ.­âÇ_ïüíо³=9vlùäµ³àðñÕìþÅ~ðp 7Áë›-Œ9’éÐíÒÌðTúÔkÞàRÕìwº»“ïEpô|ʼnçÙ*à«ÿååL=Qà ‘Ø<;×Ôkÿ¥}~ãhlõÿ§õßi}™‘+§úÁ?‡éŒzýÇ·®Qó¾-œSµq~¾hÿ|)‚Çÿ0ËgŽ´¶Ž<™ð&aÚ"J'ž¡Ú<õ±òlý®½ŽIp-W\Æ5þDš#qrÂÌ‚Ä+¶f§J_å¢>æ%;ž}_’„«ÞH—;$úG+ÈχoÚ7¡]m(cüåùMÚç‹Dóqcý2El?Á|u¿¥€®•Yæ€G —vß§[E~žªÒ Ôû[<ä?ÇþG;ü…5,össðÿ½bº;¼jG8bø8C½­¬ x„mk^¼×Tá¦Ë¬‡ìê­»ù¼J/rרW€ÿ…w0_ñœþö¶Öþª¶eÑV+þT„-` âû¼Û½üCërÓþ`ѲØu«õ«pû²ÒôbϹ[£ƒûõKêØ÷áú[|>·T¨ÆÇÙ¡¬¼ý¾ššç‚Gþmj;j¶ÃÀUæÑßeoÇÁíypÌ÷û_'ßÈ5A›ZÖ®°Sü¾!k]ž g¡ÍïÝòàé­jÂ3ÜþzÜSú«‹Îw BU#Ú–eœý©+ø‘ö öi¿M…g¯[šáz ÚXB[¯ãˆþ@‹nUÀÔW–çƒs«ƒ’޶ £©ŸÝµ—‡Ÿˆ xÂ)çò8‡éÑÿ£øGÿzìtÊÿ·ßý‹qwôwŒæñõGí{¶½};½^@¨wÁþšß‚‚ý=rý`{¹ur iÀO’ï Ýê£o·îr·üÙ™i]ë ~n«El$×SÒØìv–º½èiAüG‰ÐK[p´Îßò¾^÷Èü,œV¡ŸØóöu"ýâœ].µ¤ÑŽYå+±Ù^÷½â Ó­i\"¿P„;Sû[lö¸z¿ý wzæÏüû jAn,#*@‘éhk|eZª6vÒŒ8•¼áÜé¼Ñ–ж׶*²¶Îž”I>*üT¿»#vÃ&ÂèÎô½Ä…â†.¦×n®8ú§Á¹íô»,úf;sýyéýìÔñ‘-[{ZU«KÚéìW©ûñÛ»4Ô‘ÿæL Ùÿ¿—畼&~•®×üÿÅ+Ì#¦kýøôÉ ÔùFQO-ÙŸÁÜÚÎýïúkººSó~ݾ?\NÌýoÕ•Ãaßøúƒ[âËÃú“ãÙ…Ñ£Ðùz‚xé#«ßëw¥âºn䆭…Ùú5÷{ŠG0‹‚/15¯ì˜ÑCĦ)Ü6²W ?oµ³µ¬~ÑK 0+»»‹ì ž ÿ_A »ßÁ}¯*ƒµTÓð1§®:¼œžÀŸþÖ±ûKæä]DÕ¡4í»3?/Ü?{æí÷=lþÿ®lOw‰Ù{ßÌ¥Ï3ü ïhú;í|çµ÷ö!Ôˇåö8ý¾‘L; Èâß‹î„'v°Ý­±õw_éïóÖ|©O«ÛÊFËÀrÿ‡«ø?yÌæ£³£÷¢Æ&~§Ã¬7å*@¶¤ê¾¿€þïG¿Ð:=îô_tÞ¦ê¾öø}õì¼F—ÁÍ·9‚^WÔA¼¼åiOl“lòuï4˜@Õ›¥úäûx,wSŽ"vÇ?ªå…Ê7Û£˜3õ½o>ÞëxNÈp‰o-¥ˆ8ê’ý.A —ø³ ü׸”뺗Ûaç%5°{{±1ôéžÝqöc$èiåß?I‘Ž —[»Ã£ï¡öfËvwXí‰p{\Vn2×Ì;s¿:KW‡ùا~÷¥¹©ü¸·F¶V⊥bð=&»‡V·×o²|ZÜT³I/f“Ò°î‘»·[ ®Õ]‹ÙÂÇܬ%jßÐïLB§ëŠ>›©{_Ûß û?£ícØéà­V¥Õä•€§‰Þ%KŸRnóþzâKoM´ž·CÅ1Û›Z^»UùøšÞ¥Äõ¢lñËé;¿¢oOíOÅxEÃEw9HîSlÿ0_‹·Å%ª»¡„êSèèО[ûSö÷”õ~=8¨ªHêÈ–½xý°{àÐOY·B£ãÕz"ïžk ô&ÀçvLïÐÖýž²+Mè郼udkRcNI‘’­3Üx8NÓméqþ™ÈÄ=®ýåœÒ:¾Õ0» ý~o÷E8Éÿ©ÿç—%ìZ÷-©ÿwËdÛÃfÏý^ìÞiü÷Ã9°NË„_6›{þ«ÿïï9ò€~7æYä,ÿŽÿç³þU„ëüÊì‹áÄâs¬´ÞAKPòâòUöv8øyyŒq î}~DêicÑË!Þû™TßP÷‘åõò(.¯\*Ç—7ú43âèéSòæžÍ/7¦~$vºø®íû,lÔ6ÌÊ*I‚¿^Þ'zÏ×zÅ–@X–ý«?„!»¾)ß_° ï¹ö9þÀ½oÿž~ïƒå×à–s`âê/cäìy`þÑ‘iæì9@_©wøbèÜû»¶çpûÔb-ÏÿwÚr(‰‡†7û¼Â—S³e7ÖýбöÜ “ËX©PsˆA¶¾‚“õa/ÖŽ‡ªíÝ\­ò;Úcø:Sèô›ýxûÈçn€;x8oõ{4?[„߃õãÔéu1aðMƒõêéÝÏÒÈ–¦µY{8Ü'M=Ož¤N}ú.oé->”ƒ6çtuÁHz>S±[‘¸ Ìg7ØŸrimMjüÞÃ'¾?WÝF–zj‡ƒY/ñïý^•Í…¬Ñì×TJ_µa%^=«’ÑÎ䘈W5î³[¤èY×¶}—Éë aO]ñuÿ#»5¶g±þÔÌÓz°òêòÚÿwë}Oߦ?(%pÎCoò¿sç};,³#¶ûö8èûÛBßÈÜK!'á#Œzw=ÊÜôåågTßÉîšaÉð‰úénÑÙHýžÏê‰Ù'Ñûè|'íG—³øÏ 7<è;&OeùÞêše7sXÙ±9ËcïöÄ;÷Ôa~à=.L¦äÅ µø¢ó#ør?QC'Z÷Z³TΙŒ²€çhW9êsêh~ ´ÃqdÀÙÜsRÄw¬}ôѦ'ëcôÔ©èÛ¬vþÊù½Û‚M{uêÔܺ'³ðvîýÑ¿OÀ]›Zf%h»ù5,ùÝÏ£ÿ—¨â‹ú•bD¨ÒÑ•ïÜàÀÁÏ5¦ÅâÔ)>ÅÏžX”'mwzÑýÏp„ºd®—ßpô N¬‘†Jzá¾´gŠ3éßìïÖ黳òË&ñLvdÁiw¿2§šÀð ‹}dr{'Ì@¬¤‹æà½’qØ‹™Ó ´}&?ý<Ê]á‡-r·é^®Î>§K®«Á6æµ?ë_4“>y*.·c5šIëöTÞuhñѸ}}3±ÎgŸèÚûdŒW/ú6¿Ð†¬‘…d+áEÆü‰{%v°þ7k»°?#û˜X¡§èE¶DõÌ_¬òoÁÖÅѸè7 §:Ï\a†{ç¸Öž¹áÌårñ®uEäêòõ÷33º›žÖ{÷ÃU'¸Ü<ÐcéK¶žÎ+vjLJN¨í(ÅDŒÙ-ó»‹yi ^;mM¯µÎ6@dP¦RCT—¿n‡Ò•=Ð:žLŒ¯mü˜9¿àÆLä ‰ QHrêµ+¶wQî>'{z” ÖƒdûlÜ«î×þÆý‰…`þovÒIùhþ_öy?Ê,l±[’*wjoާ6jŸDÊ¢<7;™{·‚z¦þ¥«Ð$âY:¬R­b–]V.wîîì@'{]¿ÈŒÞO±Õ* Z˜|+Úæ 7U:7ž\šœv!_fy»þMö-âàÁPë=a\lX˽¬‹ùjê‡¥óŠ¨ø»}g‡~åM€f•aÂm®,*—éd›å¢÷ðhwQ‡'“Kú;Úòˆ†¥GÕÜ¿rï×?½"]/¼~êj3ù=\›—$;‹Mƒý u½º{»ÍIlzóŠ×ÄÀ.~8T³ðÏÇs_\Or§jŠ€ÇO>»=ÙÛ¿'ëö8¬}¥=îJ©Ø \œ>Mö%ñ[ó!Õe_6Õ”ýZÓ nþªج&{¥JÌáïàLA"1ŠÓZúiz*7‘ûÔ¥OÚ©ÖîÚÚtÈì $p¡j±0›%·H#Tœ»ý®äŽŸcê7;>÷¯›²²p»ÿJÆúmGGâ47©ø !™ÒPÙ¤!Ó?­öJgý¹Û;Aìøæ ¡:\ÑùëOé7+ùg«©M<™y— áívûx%ÞøôüŸö…ú?Ö Áà þð}o¾­þ?ÊÿWóÿåû߈ÿóþoçþÑž°¸ÿ"° w¿¿òû!*¡tJ/Oy$oÿÅ Ÿó=ÅçþÿýÄ ù‚ùóôPúã×KãþßÁ8äÀwýßþÒyü!Òƒ4ÿ:X>Ä<°\ü¿ð—ýÉD {×(ª!Ñü5ú>?7Hh4¡0…[G¿ò ~:ßü`!;­n h×Ý‹¿×mú+<(€]&Óò€ôsÌ€ýÞ_­øm†‡´-d´½L'Ä:ü«ÖD`?ð©ÛºÉ‚ˆ@¡ÆÈØ:þgn_<9³³5éë±3¨°Kó‘ðÝ·©°[À\ì9‡ê Ä™}”eî|Æ÷~Oƒ •gîE¸ÂîMð®&4üþAÄ&ò¯GÝë9ó‰eŸËüÎý)Úï~§½GìѾ„ùߨû¾£¾¸¨Ÿä~gÛò¾ÌÏÊÃz‰ñ~D ›œO²u] ( þIÙ²™A„ÖÀ>¦97T'I‰Œ!"ÕA´¦]SGôçEBë3Á¯«›?fþÖÿQ,Zß›Y ¯Â@(k6$MéÍ·€Ý{¨éüÖÃÊ 6qø06ê¿“gÞÂesKÛ¿iîÑäþR¹†þtbAýݺ›ì}=›ß™‹§ºßà:Ÿ–¡:<· c´–럩_êݨÅ7ìûÓvÎê·Ž9ÛÑR£‚Þúÿ¹úø0þÀÕµ/ ç7úºÞST~ŒWÕÁž–¿õßýjŒ÷cbó j¢ôåôW1I2¦˜ø‡ú…M0 1ù÷OCèIZMèý^Pc;(%³¹:‡E®¥b,îß!ªu¤â¾nýu°{ƒ?û¯Œð2ÌîÇÕ³÷Ö>©|Gäl¢œyø;¦i[n„Uõ#–}éšÿ¸ Lu¿’¿É–šW*»Ú¬\ÖÜ[NÏU]]JøáƒÁr:½ûŸ×(‰Ó¡Ù~Ã/Ó“öƒ2ãšû·g™£ù‰7›ÞãÉÒ³@ÙþW⻣ù_+x;ÿæ¨'ä‚Ýü A ½î­¿U~*;‹7ìQÝ;µÁ¿½=´õ¯rÐ`mÙvSÑíÚ±®`åàåé¯î‡°Û!4»Ø5ÿœÐºç_hè€þe;Gowœaì×öºžÁHƒ|>ïRá^þ¯ŸËä­6;]âBÒ=_'Ya'ÑD.Ì( ½Z¹?,¯I#ô;tÓ‘ç½µWû²ÐøÒÕþFõ{ý­¿ rf\RïZ:^L$öæöU~ïó›Ö—Dv‹íkÀî>µ+º¾kw;oç'tçC)¶˜(ˆMýŠ˜0£²w¬ƒj2N®Ư¯õö€Ûou7™÷h(Ûþ9šÛÍ&`_ÇÑDê»k}¥;œþ`Å:œ¿ýŽ&+ÓU*ÖÁôöºB!qÉô6,n¬Ùyùövÿ> `§`ÿÝ‘«üxoôU1]ý©T_bߎ_m—0Ußûu¤øw㌎©!R߸+Wg0¾šßÆÑ]ÉÙ×kûÚ†[9Ýér›fµ)§y[,ê7:¹ø99'ÚÝW•T)/¯Ò‰î½¾Q*jê¯ÕŸçú¹77î•=ÍëÓ±4%ê:i~׃÷ÛÓÚT÷öŒ-?Ò ?Û§rŠØÝÌ+ÿN¿·6J¡qË“{·8WÑ;dpͱIM©~¨yè_,Òö ¯CøÇ_všÁq“o¥‘*`gEý°‡Û¶’5z/Ú*°dj©¨V¹ 8Œ‰×ªz¾ œå䊶°xŸ/Ìü­¬]>kÂà‡ö-ßÒìx{äÿ\„÷þ`‡ÎGîäkëU>&ù7¯MùZ‰<÷±ÌñëˆSìâØùž¥J[Š(º·•íö84{¿g=në‰Ü2ŠþÛ;7N÷gÁÍ ?¤¶æõz¾êjòrË=¬+ÎɃ©Ãô²ùè» Ltc«¾à£ê=nã—jŸãu×ÿ¨ÖÞ¨Ç> […Ù 9q÷ÊÖ¡`pfÁ½Ý>} vÇ‘•Ìb Ô‰í9åºÁÎÒœN$¬sºÉÕc™Zfšãטþºcmè ô­¥l»‡Ö1Ý’›àÓÒǵԲþÍÓF„ï_†3i)o,?|¯Ï;ôgÇèÿ¨g °DÐ7 P½u7·,p;x³ggýÿ%¯ÉúÿÇ»êê¼Ük—(ô‘oü!Ë·ìÿßÚî‹¿øûgûAÁá5¿æòIü‘…ÿ¬Í­n–I!Çö?ÔºÁG©åÿ”[A$?ªs;ýíâ±áðu3ù¼SM*þ8ái¿ë‰‰hûl£Nædxó©Î_ÑíÂ-­öö×W•¤Ò„`FoÜö¾`›I??¥£³Õ´‡R?¢E©Ó›¦÷å’ïË*]¤þ Å]|ü~èüçs¦?³|øë'¹jÊxÎ9W½æuˆ [È0ÝÊ?ú SÙö<ŽgêYqÅºŠ´¤µã:÷ÁoÎdn†¯³+Õ­•íc·é2[®ØF’0ß°75ýÞoVôí¹ÖÑ€´ëL‚ïÑý#F™Ê~O<ÇðL& ˜¹ÍÕZ‡Py-;Ž„ÀÊçB­^æ)&K[É÷øëïâÕ{§O{ëAñCðø>Ï>O(ž`©•ô¾ØÀpÓÞLŸ½õ~Oøǧr望Áì†ÿlèÔxe~Øœ%joþU£¯{Bïô¸q~®]®£Ý‡oaBùéÔ‘>`;%ƒ8OÊ8c+˯Ùíî¬8¾åcþ3 ‘0æÀÝ Ÿ§—GþòÔÁ7™˜îuš™ØR¶‡?PÆgó%â^¢4“âå÷‰\ƒû3>êu‡J|'²¢ø*jvK<\öéN¾f#þO€ ýÏÍí|GyVzÔb<iÆ…ø\ û´ý¶ÄÙñ͆{cdÕ£oâ#„5©œbóåHOÇ» û¦3^ã}÷WñÅ‘ôêÙk:VijeŸ„Lÿ“­õbftÖÜf¶M£… mÉi!\ìpiÔ§ö¼Zõ®YãÕ¿((σB¸,Ö°„צ ·?bÔ›zˆ]V¨zü}0æ°g­«§_]Žo5 >ÒÁ-ß»~Ý“ÛçÚGÜêbÉùT¼@ûhzþoß,%w½ô?7Ûb_îÙ­_P3bµÓ³SÜ&˜„‹*:~Š\¨ÿÎ:j¢6Ö< Øè·µ´Áâ7Åú/gçù†)¼„S,ßÄ ½ÅúÄyx|G/4rhmc£Oa¤‚‚½Ç†›ÿjÓüB”“f'T!`­ŽŽìÁލ;hWújõ»R†A”™À:ÏѸ”]¤>÷~¼K•' ¯±e0|•ËõÒíb¨Dx ›kŠôÝœ­Xòp×ê Ì”ªÓhç@Ög€ƒÝè¸ÁŸo7Ûó1’ûBWíöÔpx¾?GƒˆÔ*d__?ò7›ØÈÕ¨ñÈXÄ_É’T‘ŒVÈl?¸ ¹FÕç?H6!,v”¶1j\܃ÊE¾•aDSçX¦± ;{¦f ?­V+Uõ9ØìÛüð@ ë÷ïýÀ??ùS P-صîìDèOò-Áª9yõ§.ø• .V²ä¥{(cj–Xê|…!ý,}SRN?ƒíø‹V=þN”îÇ#Sw!¨¬<ýž¿_Û… è£nª`+æ4~ZÕ{Ýòì¡W··È¦åi k±´ÁÍ]>Ž1†‹uGÄe` çŒ>ߥ3t}|´n•.?èÖ‡Þm‰ù¼› (œ§Ü ´‘|MÎø=ÐEìô^Ýœ6_i«o¼?˜ó^ø6FõùpÔÇâÙ·Œ-¯ Cú±©3Á˜`³,Ÿ›zêý™3-î!x©6G £oñs) Û”5­j¹Aºbë(CÝÝƱ&üÿGZ;ØÁ|Nb§Dkÿ¢‡Ú¦•;–StëÃ|¯Gÿss\Æ$¥äôBñÜøópyýŒÿç·÷v¤ì¼Y+·îKÙæ ûíôJ6;6@Ïí¬U¹ºó,øþ®rÇêiîò{7éöö‚Oo…îÁŽKÍÚ‡w—r•~AÊÈa\ÊûŸ'Ëé²ß ï>ÃöE¥à­2ë§?µc)¥œUÕ•XFÁŠs<¼x»&%J|ܽˆ'Ö†•‰ç÷Sú²uært3~ŠU;VWOÁsߕҀ"w½ Fï8ZðΛ1+é¦Q,‚,{¤þ5}úùxS.Ýõ@þmÖ*…ôbÕ3äwÜó;àwÂT>_›w¾×²u9˜jÓƒÉ8!µ­DQôÍÔTF0‰«§‡ÑÒß–Ê õPF‹kuq~wdü~ó'pî e”ÄœÜ7U÷ΈmM’-ïN«nÝ{Mm“St‚`Æ®9š©Tà °«ÇêÃÁî‰Ø>gY„0±@põ]cè{å;ðy—ýð ýï\ÅüÿKX é„`xi|¬WÿÓdN_ –—MîÓ]›»¤Žþ›ÃÔÑ•!5®_)Ç)›‰P 5áð¿¹Ç؟ǵHˆß*ïôÆì;䛵c\Z= ãüùACͷý;¿wøê‘|ŽJ“ïïš¡ïîlºO[~¨Ø™Ò§·+¦%S?éc5*øK_=â_#„>ßs®LboÝ1Ìs¿R±™¤úlkPú¹ðMõÆ”©ËÝ•ôÁá#‚æüþ+ì‡?²˜t@mƒ)Óçßú;ñ'Õ÷™O¨ÿÊ•%½sÙk;èÜ«:åS¹käm}b»^Õ¾CÚŠ'ª.ÖÈreP.Cüïn‹Î)å5Ooê]ôS­¢Æ;¿ËÁ?z?F{5»[žMÏ-Ñä 턇uÁ éùÂêÿlZ¸zV­t<Õ0ÜÙ«t8/:Go‹XAPšŸG˜à]¼b“LK|‚éo¬ª›¢ëM‡âžJE•"^êN)(¡7¸ðÙµhÍ~8Ô(N7]£¯Óß*'x†³Äg4"ŠWí×ñpµ¢Í›œqlû˜ø”Ç‚÷¾YÝ«{‹}¨—ëÇoä+¿kn®NWu\â$Ò‚+qÉåû·liu„¢>Û²Èv[Aa©Hvö¯î5Uj¹²}²o ûÍÊóZxq×x0¡3®j]ÅaÏÓ¨?Å@$5!‡ÇvûS³ÝA‰žc8¤¹H ùäð #Æ3n×?·I\ä =¾àƒÛÏ·;FÅ÷¶Nf°{¬ÑîíyéÁO¯ô¾šMm”.˜Zѱ“v–¨¶0sêûÛSÀ-ïÉw¹ÞCÖ^øPiÖÖˆàwÄõ„ì×ÿ©Ÿ6ÐSØÿ¡m¾•m³¦z ¯Åýr¶ºz•-ø5¶ú€ú'ë°çLá6ü™TØòL7ÞçÌÜÛïùªP¥±þO~‚(è:ôúÓ?hÍÎ÷ Ò¦>ü½óº–;ø¶éïöñ}?`;:ß½~wõ{ ÎÀ3ýjltøÿ &6·=ÎÇ7XÛ¿DFÇj™5'ßNOçϼ¼G¡…¥Cê¿;ŽòWBî³Å¤{ú³ìØ©åì­'q›ðÔ9 ®þÕšÿó©ìIw6Xwx:SÞõøuŽ Ö©›~-.ïíP ª¶‹©0íRÜÅí‡L)¨&Þ¢eëÕ »Ö·-ÖŽÇ4t"¯C²S)52§:›ým¿%ÿ!&Mú˜*Åó)ôVâà›Åg=4ãÇB,Ñ¥ª¾‰§¦ëvˆ¯:Zíï¶Aóø·«±êÑ|ð7EŠ´8{&#äÊÄsSûœäøÄç›=©ÏéœdQ: ë©~×Ö³Üàÿ­oì'ö¢®·ë\Mº.qÑÕÜôlú¿˜dbQö½VŠl`>o÷¿ãÿÒßÇøy7Ô­Ë—Ëú¿FçÎØÖè´‰Øäîöõ?c¯§›ö–ŽÆ¯n¯_/Ü!`߽ϫfoÿöGœW.õùó¿½ô­©éü¸ûÚzu*„;¡R”%?sưѽG~…Ÿ×Ê?{£†#xõ¿1â^!ŒºŠùA UyfZ÷—åU_³®=.–»Ü*ö˜€ ¹6g &zTÔЙýLÑТ8ý¿Ë<ÒþP»6Õ+Wèr€?òUòð–îœ9è?¿{²Í©ŠË‡Ç@MìŸ[ç<}s¼h½&ÄSD´›doŠ_[f¤Ë»ZÚ•ñg×s"ªS¤Ë ÞöqÈŠ¡ºÎôh§·©³ðªÇBü·sèg•ˆ-]¾—çùh[Mš xýа{T,Ög'^¯ìNú»2Ð÷ï܃Óõ ŸFuö¸61T™Ò™ýŒ"þ©;G´Ž‹RÜ­òy­‹š…!óèÜJ×Õüp%ö>·ë3êö€ùàŒ)A»ý2=Ú"€AÿPþ×åõ8ï3Þw~a7þåˆrüϯÐ~0¹ϵï-,Un­Ìšžë&ªº>˜=^ŽÎ]?—½í+‡¹×ÞéNïÄ׿wª’Pëðp™»kuºµ§ñUìa©±‰G8¼Ôð.6;tñ•ú2ÍÉÍÜÊŸgã¼GÝ›± ø{¯àØ–žÕ°sžu-hL :ž'ª/©ÜÎïã¿,)¼Ç¦Õbx4mã—¹•lÛ³wlg·æJ»£:c\8ÉÔV*§µâ=×6 ›ñ~n<¥gï™­žòÚêáFшA,ÅaäòY(ÉqÌ«Gæ»äÎÍP®oNÕ°u¥ï˜ü··ÀÌDÖl¬0¯­8Eë)I;ù‡¨³5¯èù.Pù¯™Š (¢b¬?¯*¸º\U ˆ}Ÿeݸa]¦ºs9êêm>±ßd¨ñàém•ÎY`0©øí!þ¸\²ÔiÚ#`­ìU»bô?¬Æ]ë¶ÝÈFï߿ŵ…T°g{°9œnÍv£Í?m¹yis)vø…[sØ?´sÕ)¸MêÝ]]P?6½}½îÉÛ#nù€îýŸÌíúá?èû-ÿ+ðÿt¾Gþ¯ñöþ~zþïSôü~ÔÎ?kOÓëyiw„´zäúç!âð¥éMM¯iÁ˲6îÿQÐ.ý?GJ¢û=Ò¶UÔàÓÛuž~(eÙÎNì¿V'ø,+ïz÷èR=gyé}¾|sËé/7±sÂDò ìïCm¯-¯0}É©OØŠ¿‡ÚtŠÞaã_Ác F,Œ0h?êàRÖû!_¾—Mo‰)\Zs¹ªÛ=û­ÍÉGÓ.êÙ‹R]úÏ«Z„Ýþ$ô³&½yz~,;3BW%cSXŸ§üݬ)ü;`óÍ÷íá‚åѲN;|úÀï1»{YSÛ]S\1#o¾+ Îøi) 퇭Z¦y™Oâ¹µZ·1g}_¦iûû}g±oÃZ^ͦx·÷2°T5â¦~ºšÍùï÷7+žôäEäò„àG½È½ìÇ~M}9͇bƒm^ËLÇ0Î¥}hEÄ–¸ÚlS†µ/×*eÇìÎïŒ÷¸ã†i\ŽrbÔÍ0­¦£™k,ïk´->¿¢b¾€="=IÁû_}a-ÿñ½sJvÞOfàN„Œýµ•fœË®"ZÓ¾_+8»—õ.Y¬­\=ýá§g>?™ª¨£|{§jߟOİÙÜëÄ—_±ÖÛî[±Ö ýŽÅW; 9¿&Ë;íâ~oÆ%ûi~œþ²å>];‘z^e¾ow–þÕ˜:”¯ì”ÝŸ,è)UæÙ[·isx6ãÞ‚ã ÑË…/Ï<&Æ}[¯2‰¥:)뻋¸ª0U>vÝ/[S¼ìÕô]\ß}¶ºÖNól‹Eyã˜üûô§3v½ÞìÞIý±¹+ë­Gê(K»X^,YŸ»7Ý6êç,éû´ò q•„Ë×ÂÆÊ(N"ês˜ÏÛ2Å ÙˆÝw”­…@9èh`x9HÀŠëWÑ[p¾Ÿj–¤O¶Ílå«?Ê‘3RÏê¹M«Œúg——D›—;ipÒ ü©šKÕìV¹ÉrŒÿ£I–0rkÁ“åQBç-Øãnd^½Uጭ¬3ö›Ñ<¶k(gæYÄӽʘcEû:÷(ãŹ0}ÿ/·ÓÌß&à}?è…ü 7õÆô~ˆáDX@‚?ùÿøôc°ÝOÏÝÕô¿Ÿá±ÛŽ÷×Ë5¯ 9¼»%ºx¹ú¾©ÚÁîÃóG”ÔÚÏÔÇ^˜Ìy3²Š§(×ù†w,šüŒôâ8-ËêþW\*=ˆøsÃÛ×õù¹7•þçtbv“±Z”4@òÖ”ï¤>"+ÌŸ_×­Ù®…>ÔseO<¼Ä+Ù®ˆ†öú¶ð¯£Õg2ê3Tc­÷»*ÛÔ¡h†œ{h=GÅ[/Zmèwõ'GW·:Ñ´©ræ?©¦]‰óûÒYóÅ:EAý~”Àrê'¾À’—ŠÞýžZgì…ã éLÉç¢Å 5ðê´Óÿ~œÿ‰S?Kn†£#ö\UFÚÅW@Dl èà;;¢gû9UÕZF"¢X¸,ËcŸ5þmHºíquîl'ÚZƶ›8«$z¼Íðg£ùš]K¯ÓçJ³ Þ•x„R2=ΡŒîŽîˆc°b3egfʆýl¯¯—Úcg-&véÇ/_tW‡/¤ÿÊø?$¨· ú­×ÕËkô#Ýä~†}díë[«áØöª›Gü>œA;õwÿwøÇöûÞO0žß÷B0õ¿{ýŸÊçþ<}<(ñ©ã«õíOÙzX6¼û„kíêéÕ²ˆ» fœ?.׎rŒmbÆ®©qÿ·éäê>~à¿ANè¨IÎmЙÙ5}Àì)µà ¸Ä{B/?j«öá¹·à»öj§×é¸(âh—ý÷! t,ÇEÜlßm>š)-¶æ×Ñìg#¥3 Òk8îh«_É⧤†þ¢³t`'õõ©@`Þ¯3¦ñÝÎïÒ'؃”¬†˜[Lò«¯ä³€2ñ•ªkÒ?[º¥$‹‚ÏFŒR‚G]éÌŸ …í ïçUZþ“|¡¡œçuÈ’`³~<Åþ6õ-¯kþ¯‘yøeš­µBº{QÜ=€4LÊS&A¿&àÏL“¶]^nÒ¡ý}¹Ê·6Vî YÈÔ{¿¡r–ÖwÚ¶¦÷›…-ߟ_l–¤ã£ßü?š†=ë3=Äž¡ª}.Ï!TØŸ½`—¡˜Hbœv½]êèmo}´6yö?¥î«~ó=Å×Kïj½M½´o•ÚU]ô5𙻨"íâ¶NôÖÔÿš'Ð_n–ïÒ›7ïaí©Ôýï Yû˜ÿfó}ž0}¿“ÚX4„ÑÈ ÚáéíKW(ÓcõÛ©úýü¼aV€ÿ©P®>­ì~î‘’Úg‡í˜†Æ¥ŽÇ[³£¨&=ÔüßȦ2Þ’Ú~÷ëǫɻàÔE­7ö}±=+ÆúÞNõ×Lœ_eÅc'Ê>ÔÎŽÏ$áG¦/yE(õzáDzÇÛâ¿nm¸Ò}.~æI™=¯e=ð{M6×e¥™éЛ››‘"VzeðcÝC¥'SG8¹½ú‰a™N¯²ucþì[µ`}Âñø†/é/DÇÒµîu뤭ì,]q¤›• -nð´0vž×9К˜†ÞCéâ-Y°äå…ÿÏÿSä[WïzíPÇ¢çÓ¹Ee²NŽÜ=Z‡£ïçLœsb°=?h ¥.—¹ÁXõ/“ÃH\¹>ÃàM²^ m¼…l¡›抟fùL‚ðSF¹|ý‘39Þç5Þ²ºí7ä§Ã¿óAŽ]FÚ1:S&BÅ­Iß2ÅßM €J×¹ú14Ÿ1*q£N¯ýÃmt®õ.L'ãÏ[Ý"£pM¾wÔ³lÇõðXK”î\3sA1ÛY¼N|Põ4aC w® Ý1}Ñõ·_ûFö¡üϱ­Oön=îñßëlŽg¹ïùؾj3Š`añ| ?üØ.ør×öý8ƒçµ)v}»$Rüv»ͱ·ü_Ô†—{AèéÓzÂT2<‰¦ô7‰""+ºÚŽâžî¿¶kw¦i1)ø6ÒÓÈÀÏRÎÑS’°^FoÓùŽãnn_©2rv'Wo­ìõ¯–¤öŸ¯ç¹3Àlxs¸ÊþŽÓö‰×oÙ|=ëÕÖ®-K~:Sþ?aάsGAAâéb­è Éúý£¶'ÕŽ¾H+Ù«ZðåGðËsHÖ¢J H7Àp;°GqÛ¢™Á“(·}ý¡(ˆ½ÞÍY¶FTó ƒâ‘µ}'SÇg2ßD˜Áö왈âF’Špè„räÍÕl×ÉVd1ƒu1 Sä™§ÙÃ}($׫ŠÚ™íAyE[»µù]\Óº¦g³1Iý›·^NlúØÞÝÀH:?ÕÕÕ¯WË }®an Õ±;MXšD=ýþ²÷â±N<%æÎR§30´»ngO!Tk¶eÈ•§O>O²Gm4 wŠÉôþ|˜“ÝsÂ:þOt…ÓÃÁ¡yhR{lÎ_oÛ«hthÚ®£BßPÛŽv¿=Q u7ÞËÐK‚b;¿»úó—búD/è÷}ëÞËÄWßÈVÐ&ƒõ+½ý`ÿûÙþ:Ý_i_¿Þ{¿—{?‡»sÃ:7µ:œÛYÇõ|–6Fóþ{4sõzþ=ÚžÐûsu{zÞëí©´ÏØ_ò;Yø&•$ÇSWUî—"õ©¬¸ø=ìCÌÚ©ìvÞõù8cg‹§È¹žyár~yªÉCá·‹¨×~‰O0ùµBñ!¨U{?=oq‰Ø¬!­g Ï.ÔüÏt¯‹¯©ôÓ¸;“v&XË®EŒºå²Ù7AרGŸzyËñ]Bî–у9Óg^BgñZNþQ²"ˆ~ßÛÛ½Y…¸¬UžÎß×^¯)j«²¸ç¸½­Â?##éÖÚºUÀûV´6nÇ»›³Ê÷%ùBôŽÙânùPíÈ ¼_¥ÒM㮼t¦ü™n뇣‡·Ü¯Á`Ö¡ù=3‡L]Ž,' /TÒWÛkå‚ûu·/¼‚?©× OOgù+(m 7\I¹þ£>ÝP~ßàýŸ­öEûàÄX_Óÿ‡ýßûyéÉ—èð/£$Û9<1TìZFQ»:Õ<@þž¯{¡mž¾îÖîÍÞŸ6­.ìι uêôˆêïôD~ᣮ*6Û­c•ÔF¢T—lÌ›YÅC‹~Ù~9ˆÕþ;·dÝký=¶=(ûžj“ý½r¶±/Ú@ÒÚÏIW}E!«!º’¹k\™òŠ—Y™)tÉ~å{>y=Œš¢ø¿aû{'sçèœíªt¨R³Góè}æÜÚ  Vîmîç òõ|¾ïÔSv}}¼õ³¡«¥:õÝþr3í¥îçÄu‘×w4ÒÒé20œÊLö‘»ßÏÿb\|ËÕ«ý»Y™n^˜^Ïj–j Þ ‘ê8çXz¡hïiå¹£9𔽫ÿGacZrسY“ÀHe5‘WÙ+«Mõ‹Û¿W·B¼†Á?{äGÃùÆQ-Žª¢d ×¶>f§r¢!Ô¦m¥tAâŸa­>Hµú‹ˆKTó„‘#_¯„Ë¥sD¾¶Ü‚Ÿ7D Zö³j¡Bú¸û+5ÃÍ¿…ÿ¯ÕýÇ¢ïD³ þÄ—:kŸúYµ¼´oH¨‡öù”:ZÞ^UæLÏÒ§? ÖÀÌãÏ›1ßyO ·Û‡ÛcœMõÕŽ]K®oľþ ÑÑÇd]¼8`¨§/ØåíýΙŽÇ÷ý¿Ò@÷ÿGkæ‰÷̲£½ŽæYÞ “*øc+àôŸÂý¯kìù=Þ®^,‰æÛï:&šÝþ˜8Oî3ÒÙØK›6¥'y3ìU%aü=¤ßvj“ß«^€Ç;q¨úÿ jYóW"kyîÑ ¾ãœ¦ü¾N·W²ÏEçï\G£ïJýªƒ(µbÎN–çh¥{Òpu‹vß=•¨÷ƒú¦`Š­¡>Üd4k$ñ&%‰ÆSE½™Õa²Åɳ‹þ/dºûåÕV#eîCV«ðaÆN­ßV²v½ˆŠ¶KÑÚ&޳z¸5Ìþ>Òh÷{Ž™tˆ·›Ã8¹/À}×eÃz<¾ÓqõëÞ±KÆž¤´wwjS^ ‚µP½Ò_*ðñ%aJÙ&×VÒÒ§$æòËn,¼”\°åJ[ôTþ’ÌìMﳂž ºZŸXÍ+úT{E‹‡ô)]ƒ*q~ص³ÚÀ²Bú9y^§C-Øu›{8)0!LÙL½•çékÕM_ Ý#ºåìtäûŒj‚õy3ÚC Ý^?Ó7¢Ð=-‰ÕLÝ™5Õ ¬îÕ—Ž{gEŠôúÃy  ´ÝÍóÓÚg·óûܹÍGFµ[Rnpóp¢`˜2ü]*wåú O'ƒëj“ôYçü!vyw°ÁáT8]CX*aG{oµ]¬ö¶&I'àCʧx ½Éåß0ä½Û)e*ö4òäèb=mÑåÔYŸj±?ioÚû|^×Óõ7ü~àb€wòàþN°-u|ú˜¸5GìôlBeÍ¿ ãèñgö6zæÒ B¦›µ².gµO³•²ñëe âzN¼¢¡õ3•ÕŸÏ×xÔöÕÑèËÁ ‘èšš}‚uäÒDýx†Éž ƒÍÞk³ÿ¬ií³éM_Ñ®w™Äã ïý‘ô7Ãì·•CÔ¸’ìv½;Ÿ]l©{34(üxVúÎêÝÕ>pî»IÕEhÏÇaón»o¹£§‡¸`½óÌñj9jÔõ=‚FŸ‰Š¯^ öµ ÄÂÕèJv½MQý«çf= ˜è 4íLOÞ(ŠAK(qõÌ~ÇÆjÞæ€&úTƒ ëàQŒ¼f ½D芀÷â5ž[‘w¶/í]~!›V¦à‹p•ï=•‹” .&ŒÂbRÀZlff&ÆŸt:5ioßò½VO,è°¹¥Ú‹<žHfôžDaŽš[Íõ4{l$d±vomT›J¨:~¡¼³‹ÓÌÚþ ŸQ÷ïN²…0ø&v`Æ€€íõ7çvÍàÑh,ˆîz½ÍiKGOÏgÃE¸ ãR§FÇz£ XÏsَẎE”Ùݤ`y´ÿswŠúÿ϶FÂ}T;}Û)Ú§ Ô¾Ó¡üb”¸ºµtÿÕô;œþÕHù ú€û>0½°@ö´`uþyÖ}?ÌÛ¿ÚwÏ©7Ç÷ ÍÉÓ[jçÊå¥7©àò‡4îûÚÇ‘S'¦¯g€}>ÏdŽ[÷xÿX_oHCuÜÿS¾A/õ|ÿ>.Öê¡C7š_1£ûÔj×G¨<Þžø¼orZÚðM¨‰(äÝ…–yŠ›ÝùéofÙì u$T™8<üÿ›¿Ýî «šš…ÕÛ8Ä'”—¸_—º O?WóIW©¾ä”-ýo}®Çʵn‹QÝ/½Ó«6mx…| ÕЕn2ý>AõüVÉëÙÚûöH¾4OqËj\Þçy±ÆÀ 4ÓPnÐÄþæÔëqúþ6R•_¹k¾È©â~;:úHÛB`/PAeט°›ûÌ”)á˜Ù{º+H?‡Ùá³ï%Mkzõò‚ÄFîÖ“õf³›‡!ölªËy¡VÞ¡6âÑoræÖú³ù‹7ó²[–Ò,p+¾†V¯ë{mBÕY>¹Æ…í5îÉ×Úg&w÷oíüSOÑ}Ú îCVç?GÃÂh–ó­5~t[Ý^B&{óå?og´M}¼ài±îÃÇô‡½jÅ ÆEaÂm/bü_nÑÚáÒGíÛ¦kªo?·wB2¯sXa«ìž%"öGââ­Ñ»¤ÜÔ¨ô"CŸ~gçìzº¤Ì•8õ¶‰âZÝ®»û?5Þ^g jøn|´2Êõ'|¹Êƒ×®K]ÿ„©šÐý¿“Éì~8 ~IßHïx\A}OtˆßsîlÙÂ~¯Ôí{­Ýãöòáw©ìi+öñö)‰¯C{¬îª¶2ÑЫã[ñ/¿Rù¾±é|ö¶E&?îfônEÒ€àåì04ž? t_­ìÁÞª.ó4ˆ¨ï|Dñ +ñú~м#ŠÁåNÒ„¬³©8q?;„1‡™€B×¹Ï[Uè9-Teîdn¯CñÈiz¾CO°E×ÛWu9mpnŽ+Læ½n¾ËÇ–¢GÚüììsG†*AfXþe~S@C0­x)±>Ù0ñÛ$¥Þ™k™5¶2| ò;¨SŠUžŸ2˜È? Au&°ó[¨hø ?ì‹Éz1£ Ÿ„¨À<±ö¸qqàaö•,Þ¬8ÀßJHºçª¤Q´¯`ù›GuÊÚÕÊQ,Ó<ýQ¿BÜ*|l&gzïc{üÞÿ·#ö¿Ï«}ÔÌG49ÚùÙ¯þ‡£ùòÃnÅ(£èàúv+äÃúVöôx~N÷.ùœ]W”Ú^R±ôõ*½©½õw„à‚,ˆz‹ér=à?éH÷ÄÿÍç@ë¾<î e~–²O8-ÏàÃFž¿Ü#Öù_úõCp@@@ÇýïøGSõ/Üòv~wÌÖ¥ÿrúü>îÖ?wáŽú»}j§Ê?â·¡¶û´.€ö‡sq-£ð_ä»òð9áÞÂ9# ¯¹Öè2­õXö:ç¢@Jb1F{ç+fè“›´k¼³¾âµ¯~Vl‹m…­nX4ŠuýÕɾƟyVÕgÔó¾÷»ß¡·’„UaÝ­ewÔ‚$‹_­J=£ ±žž¿‡x6nÒyÊÜõsôe?ƒ%ê \% T+¤u¯:®ÙÒþ±”¿ÖXŒŽŸsz¤–RâEJß&µ–võá~%eÝÖÖ¥X/Ç$ ˆÓiîÈ ˜¸#"›úôɶ÷gîðë¯O2\ï7´Îý¨E[-ÚÛ»U§§®ïËü¼·)_Ötpáä¹ÎéÔŸV2¡Š—wfÎ9‹£ìLmStèú ìµ ~­·,_ÚébÚÓ,ã±Z(‰×ùø]ziâü*›ÍµoZýƒ*)±Qç껚†óµ¢Ë'"£k]ަ çF®ž•wžˆÿuη+YSÍKîºk Ò|"‰3û=¯£s¤ÜK=ÏlKöû8´E‹ãúXÿã÷]·êSâøºázÁyùP¹½·“ËÝwÏÍ~Z{?s]­X~¬Þ}²ö1ìÝ®0kjõ¬¨ÿ\[yÁŸÎÖm£7y¸§ÍØÏ«­ÃÚ¿»š[• J´îRèhOm×4ìu:½ÎmAiwmôí1à©Ô·áµ=ÎÔúý^i`ËÊw8—ç ˆaƒ/a9ƫġÞ_ÓÊýìɪ+÷d[&eãÑÀuÜ>Yí*ö,yü¨MÕ<1¼1øÝv¦æµn÷‰[ÎvÖ³‡Züdý*̃,E®ê'Ù_.Û“Ú/¹Š|ßMn”ëEy¿-IØP¨Àh„Ía§^c›Ýí™ùœâ>K‡ôŽ­Û*ìЩŽñI/ˆú`û T”h"Û[¸DЗ§³_`²Á˜Ù‚aâoÏb:¿šn°fWЉàÎÁñ=eLugØþ~ºÔ6€©ÑMBõ‚ÀŸ;NmʴΨ §skFÊ&IÓ_ßȃâSÔG"Œß³HÛ|ìäÚÇí‘~ŠÅ¬yÂ;’aØ.® ‹ëQP{ 5 ‡à‘s2÷¿³½EG{#›3dƒ¾«SwkPÝÙœ5ÿ_Ñç©»C•Ò×6kº'Ù/YNÿ(¾íÎæzÝ<”þÚ·.ÔLë¯ðëçÝÝ¡ÑÕÉä½ßOõ)ûŸõ÷?`/±íô$þoÅzÇ@À~^¾íŽÆå#µkgßý Ï ;ÝýîÑ¥{Èdï/—ؼ¼óÄTwžz°Ã"¬Ó¥ª-è¼ÑÆj íbíÏë îñžâ—áÏ…?£³©)\³.¸Æ7gÎH¬ûÔ¸}¿ÃÒ]ÔÚ2fnNq°¿@¿€?‰‡Ÿùg}ØëÞO­ß[lõ6ß«ñ wá‡;Û~æ’Aïi4¼]W¬E‡­îlZç¹t¹Óyô}uxj©úဠþ ÖµÔàî÷…½¼±@FÿÐÜ1ˆ¿–¿SiNð9JÝ‚¡.ýÿ™‡ÓS¯¡û‘{«íÙÛ{àù î†(3P?òö¾_õz?ÁÛoÇÚØúX(ßÅõ;]^ÆjS9ÿrŸÖ͘†­êoãé™k÷ìxµÆ¥ëâ ííÈ&YòG¿ÝÃJíÝ̈hІ]÷;ÃžŠœí ÀÐê5s´'±º`TqöJƒb…ÎIêyá9:¾ƒ™7-ÿÆ…îOÉ»î|5‘h¹Ôï­ ;Q‘¶×âC¦mÙ’AO²å)0~å±fß—½§’Øœšév|Iõ-ý u0äßZçé4¿O°FË»‚À×xÚùìî9W›T½÷N%À/çÑ/ç#Û×W¿¸ðûÓþ_Ó¿ñý¿“åDà½Éâ»ÁÌö´7‚º¯?¸Œ1fá÷,ØÃåïÞ-_W`'‚çÕçì÷5òl9ͤ!a†èõYåÅÔU $Ë¿°¬œÔÈѱBwµÍ+WLÛòt,ƒ¾·W¢ Eòÿ!®!uÖNÜWï<xõ¶7êŠO«Ò8‰E  DÉr+øXÙ°¤:ûáñ8%÷ôȪ z {ˆgÀN½ˆ9>ö'7&˜S—c©£»dûÎ×øÁ÷±³Ù߈`sqjýÄÌUÈ6ïz©±ÜÉ šIíêÕ‚½¹Câßìçfת¥—D ƒ¨áîrfúÄá˜Ç©)‡ u$èŒE‘Ä·Õ?>‰Rv÷r|‹’_WÙÏGZÿIþ]u5/][UÌeka^}(é^A9w‰¯ê8 w¯9z๫&c\QNÁ26únŠE@j õexßµìüÙ˜gqà;\m½§ŸÉ_­ÑÁèÞ!+º Ë‹b+œü Y¢ÇWQ®d²^ ¶æíË–5;Q&^Ññi³ ã±"VúLµ7µ´]W%b†ßãoÏZþ]œô¦ç·j‡hómÔ(ÄÃÖ? ¤ˆ±‡W2z» eÚÔ.ão‚bשtèuºA‘%êÅŸ‚/ó-v”ûµ.ÐsEf¿'ƒÍËŽ¬ýÆPÅj¡ZÜ]xRä²›·ëèA~ý=Õ¿E¯ Ÿé/±A Mý‹o˜ODÈFí]Z»~Ýß½^ÂÒQ«ìWwÔïµö„÷ýÏæ~"»Ÿ)¯•ìïKÍŠ¦}«×\ë1¿Ý^•M/)ؘ™‹÷;=-^Ç&õÄ꽩Q[£CÏK‚¤æÙH½¤Ò”øïa¨zŒœXo{ ö5{>pZ¨µµúU¢E ø¶‘ÞwƒÝ{@\7«ðv‹ÎÏs­ö "¯zÀ½šD¢Á¤­ØŒMiÂcî¹€™•Ñ`—êsÏ›r~D°Ý†utë¡í!™©Ø[¬RT»•—®ÉÚ·vŸù[ Õµ¯ñyd±bÞÜölW·pM=¬tv)×1ùÚ ‘^HÜV J|ÔªžÂE߇ÒÏæee…TÊ!Ü~¬øÀ¼TÕ¸ÄV ÓY‘]5Fs!V~EöW²nÓîϦ½äQïüyàš0,Ú°Tã8j9[Ô˜¡BÂØ äP‡„=Œ¼iˆW‹ôØf]+.óſӮè'“c¢krˆh€is+ém8¾j†¥ Ùá¸ó'NÀÆ«ËÝü˜¼Õfé²(Vg3sÄ›5jƒhíF·XßGá°«û96öÛ>õ…›Òô·.j½ø ÜÈ|Ÿ¢%'ùPz^sá½Ës¹Ø©Q¿@ÀÙ û‡ƒVÞÅQ4Oâà=HCØœlú¯Q8 Ï—§¥œŠkÃÕNϬ߹õöæ:²™¦¡>•ÌÙZ€ì3r§~do7šÇÅ0„«ÑÝÔÃÓ7_^ýT~Yª Ôâ+µ;éœ6,UêXtŠ6u4Aó¨¡ n?Ù^x¹oZoœ(aÓ;í¡•ìçR{T ßòQðiÞöÈ˵F ëÿGð'»×½èøŠ49‚î{Gùç—Ú:·—›½¦—YÐ÷±ý›>NÇ‹€Q·Á¿G›ã»í¦Ñc|çè}$4•sÎ’ ­~õÿÕÓãåÖZ}onú:YæÎYßZ}t%ïòæ ~€ n~PéÈáû«´ÿ¿fþÚËG*쇜ò¤?xþ×§Õ'Ò¦—Ð{¨ÁU‹Q ÅpÕ˶M#“fÉŸÙ•Kðò{åª`JíæÖ¿=-OiO{¿Ý7¯=o)⻽î-J»—nAMë|bÏÑ”6ufËqqñ1bIžï»õu³ ©å;.“¢µc|ï.?Ì+x‹Áì„ë´|< äŸ1]„ö@š.’²Ns$ËÛõ6˜“ ý¼“RZÀŠH?ª 0ZÄä)8†. *ÝkÇ ·ËÇÁ6“Kæ“>ØVóÌ¡óâNÿÉ_±Bò™˜R´Í£ N_ËË¿$ÛÁËwBxìuõsnò{}íÆj‘ܸ} µ 8HèÆ¿£¡ËÈh¹oï6ÕAQc¯rt[ 圩’ÍÏ_eañ|ÖÈs½7mXö©<ʼ69Sãª%ÀwúŠÎĶiˆs~å‡\’ –ä겅ɼbáÆöËóø½Ý3ì&ó®ZìZk·Ž—5s¯ÖG{)O¦3póiÃ`©ûpÛÅí‘âéVž’j*Fùz…º\Ù•™ýzd‰såbyó¯àSãõzhóÊ<×ãÁ6bdVÏ3¨mÇ(í[Ÿó¿o·ÉLóÁš™à[é ä jmç¡¿êú¥JOx`<¿¬ø¿7ß`rÎíØís¤“·ÓWÜìknùYæ}»yÌ|´ Óš^>…È/§[ŒH}Þ^Ì"‰Ò 8º ñÞí=ôäÙéù2KÎOI¹Dåë NNñŽõ ?—©µ {‹óï™1Ä1”+mxª,ŽàX›"¡~^{[¥_øJz½.Õ4ã, u¼ó ì<˜FÚ'¯.;6çxÉëÅ"GÅ&ÏæM%a~tÜ5ö§õ“~/)·¤æÃrŸ¼ºzÙãS¯Ÿ|yg#áf…>' IÐêù!¯¥áx-K³$›ÀÐN}( ºP …^¿ÎÓ/°Ñ;—}Õ˜noŽî>ŸÊ€Ü]ƒéG‰u²–®à1üz˜³p³kdã½§fÍþœå°Qê‚-é—¼þ®{åÛ÷vEa×˷ͱ-Ž,tΞUœ}rÂïÂ.wúÁ¹ÍÅÄ|eüBcºßYŠÂP/——p5zÐrèÙ®híjŸnr“§wZrµüÉ¢,6gû´F½ƒxOÁÃØÇ>u.6èæå܆ÖnÅ]ÌNÕ‚ñ¹©Òelè 7A0Ek©›ä§KòÈÁ;ÜI%²2É «Ã­†·ªàóóVC“/7å“©Þ÷»‹sVÈ´ló#ÞŽ®Î·örqTÕ®&ý?‡X¶¢œ=ƒö²ßd)Ø‘PÑë$9þmt·ù oã>·ÊÔ¡Ïs7¿ô’žäI}q~PbÙí»u:4;ÜFµ®Ÿ««Nwhk}ó}RúþìÌ;äú„ÿ¨Aò¿ÝÀÎOá‘nNŽ?=Y†ý:$ô‡ ½Ë]îõT5}Ïï9^¼Û|9\gsÇ±ÓÆNTíf€uðõÒ3k¯ÏÒ!ôtâ+ÍFÃUÓGoƒ«ºŒÄ]ÐkIÕœ~¸õ{ÁŽg(ÕÓG’¯&×h üž–)ƒ'zQvNóûø‰&%¥Ðkt¯•ß’ìNúíì|ÑÈSJ\OL¶{^Ì@ rÁK‘§j«D]%Ï€ã7Y\a,®´ý™_±³%o.Ö}“¤W Dódà„0yoÇ©ßR(jÈÞ¦m\öµcŠ6NQ¦- jsãbÅ‘“éä2@)¡ø£ou¯«STl¡3›À¶ö§èïÓá`„Uµöó¨WR?ÁÖÄF¼Hì1HSðîɆg©òߣxI¡š„6fåüX9ÂÊÇ­1 ùv¡\{Ñ—LŸP‘&i%ó1”--ió¦è¯ÙÝl`¹Y.æ± &À3¯ôœìkÒû~-¯å“±ö{‰¬q¤ïu íèû|Ö¨[%\öe˹c5m°½ãØ÷ì"ö×'=Úû]¦Ô[áÒu/ÆðÏø~n<2áÆéËÝî[“ Îò×£L{©d-mЇ«6IÁÚû´*OWþV ÈGraúëð-»ª€9n#÷eÊ/Õ¢a¾æó›õKBˆÈѦ#‘©%«âÇÑ0Î)—O:—žR®ìboWôn*óõؽ…o4}s:¿;Ù[ät/§€Ô‹«ì‡«ÅÛoåPͪm®ážã=Ù“‡À©àý ÄvÿXŽì½Ž™Kø~\Þ _!µH9nÉnNÿËþO”>—̲@ýø¹“üü¸nį/Á׃ÁÙöïv>ÒdTÛ¾_gÙâÚ²/Rx4{31nÅÏ!?´ù_~Æ}»@êIË4þp?—µ˜Þ¦¯!Æ«ëöôtÊý½á ôXàaޏ}Ûá‹ëí8ÝÊfr1V§½ð‡ñµöõpþ®oP¡¬@Zÿ>UH¹ÈÊÂ`à ¨¦±;åù¶ +ɇ^º6œ'­¯¨E#G·íÃÁoœ}ãô€†0xl);íªY´ä#UÁp‹2`:wdCoyz¥RˆLI®@)|üi…ºÚûÜócoÜ–dÚ˜ _ uìü¯¦­?®–i {„ç’sÿ`tuPÔ—ÜueŽ“º²#±V­zEBe*t°3ì 96mç˜-¿µè½ÕA úÆØÚÑÏ­µwRQ\Ø l oüéÖ(:ñئÑcz@ÕâTÞÆÄýìd¿‘!YÁC±×fágR˜5Îs'Ö­=U¬Þ‰]ް¸jÛ‘ZâFsG'ZMß’íL¤ï±eqjT˜jô¶ bw0[ùyö7D©ü´0joY³!òª8¡àăÑäÅà1õ ‰ š9õíÓª>0 *l·2ÔY¹Ü¸.`…Œô'û“ÇŸ{‚k#\X*c{B²$¢ê^tèØ¥lšŒ°}`âtifCËÇZv§p>ÒïCkPîHÔ ÍìÅÞõ{»‡éå¥ì¤(µG—ù'`õï'ƒÔ'ˆó¾?jïìQüžÇKS½çàñÓìÖÙןhN—`}yÔÔÕ©u¾¾­ý²µÀøÎÉí Ôàe:œ…òß'‘rî‘Vwüü4b¢é´p¹$é½BW¥E®ÿ“ÚàP‰XDÖ㋞lu¼1~? üiîMÜòoÖ± F×í.7wŽbŽ•Ú–™9½¼]‚Öö/11"t_'Ø~R”’ŸS1êçVÝ~•‹²{L7â™ÿ} Mà°6(1òt¿–õ…Þ°’£ÝŽÈçØö&2$Ò¯ì#3W¶Zûsýï_7rö,5»`I©$@%­g½îy ¤#- PU‹s¿ZcRØ+û”£läçæLøeŽôIAÚ¯Ôµ¾uÎ)aO¸íâ¨_¹æ[ØfgFµªnUÆÆºw®í—¾ýGpE1²+¾ÿ½ÈKZ(X æÉQ§¹>à­Š+j(4ÉôõOújëê6Í2Ji,'¾&lž¡ž>P±ùqÊXý<MöoßÎïU9O©vëH‡YèU¥ò‚ –ÅO 꾈ƒçRÕgµnËÚðÄqW8&;Áªìb’é_‚µò¶òÖv° ³g3.3„»2¤ÑrˆnÕ¾ÍÀñ• µm›†PßÒôÒ௥ {Ô׺„è˜ænu^‹òQߟ/V“1}MÌQTt«ºk¸lÓ8jmï|¨=T›&ÝOv¦öÞ\.mÜkò‰Ÿš÷RñÛ5”k4õtDôitÓ¹sklàpÿ›á wä,ÅüòàöòØÙ?©U¢’Ù'¿2•ï‡ ž$eðýmxŽðóèºrJ³üÀšk$Î_Îå+ 1ÃÑì÷f°î–9ý+{Øu))Wßü?ß/¼à•ñ‚ÿk©üZ·v-Ô¡›­å÷¸‹©ëöëxMéÜݤ@dßËÄ&ÿ›[ÁÏÄ ¿É¯šØˆ|#ÙsßG¼™x£î$^ ¬£1ìŠn¯ºÄa. ºÝÉP¡oˆ1;5aÙÙ:N+óþgG #Dàvݨ§Ö¹.ï»{4ÿŽ’dð³cRÇ™gn˜º÷{É™á~n˜öÉiûo&þT[›3Ø ¬jëw_ñ\‹«Ùnoˆ8£szLJ?ÊêÖ`|DCv©Àí—_F€Ý6@ª“ Qü핼þŠY´oTÕ}•šc»òªV­¹ `m¶ª»ñûŸ&F­–i ÒÿÐê§ êðÃ#ÓÀ&ÞvìBP)r÷³½úƒ¥µÉƒpÚÛ |xïô¶Lp÷ù¨L+xã.PèÔ:…é×ëž#â6¾gˆ1=qùîìS,œ½][¹gÁc¹šåÞ³´¦Ñ8]]îlÇj©ç~iy©¥zwq+,Ocgkî¶/œv6Oõ¨!ðf¦äŸ1„㆞àÝ…®|”iGµƒ³º»Õ$£ €Ï_*µº—vx„³¯;ýÌèêêÆ>ÍýOÔ7rvå+ë=N aÞÙnmtÜñÔK±;¿NÂã>ÿÐ2©Câ™KÅ×êLzh67ªÂpÂ($µ´ UÕˆZ±sš@?«ò9N³ ±*W±+ö¾º Ž„ê’3à¯E÷{½ÓËS§/‚µäX£¾ýÏó³‘-ާ·ÊQ9ã'™Ú×ÄÊwšÄÏΦZ$•åâË¿WàýÛ:ÕÙÑù$qáÏ[RgÇ?‹îlü¿µû?‘³ ¼´îfÜkŒ]ÊÀËð3õ~>åžM„zYíféh ŽBVÔèG´ì€Zéi~ƒ6ÛÙ×È~Ö¯>ÔÞø~œà>)ÉhAN‰±Xމ]]®Õ˜´ù¥ßÝG}Ýmšh”Žálû<½J©*#Rú<@XêÞ·ìàÀ[3ç ¼‹O«ÄçjÑùxåËÓ±ìÑØìÁâ7 F3m|w”îÇÕ` ž¿çýfqvăÓî‘qïcã±G•϶|Ú[¿Î7ƒ•ÑÁ숼~]8æµJ> ÷i¢²rTFÍÌ1è‡æqÓF¤cà;ºVëÑñ›†Ñún=Ì<¼H5×Ëž†9`îìì—›ZÙÒæ¥íkqKSóìp_¸ìéLh¤mÙôhµÑÒ+R¥[žuñˆVµ5•MLíŸ8‹Î 6»„Jøw¸äá_§XE3®Bºû#Ð]^´÷uðœíîž¶X/Q¢©FÂ'ì´erS±µ1¸äû„D˜O-#sUŸQs[×`ZR!¦Ž «õÌÐÅ@ 0c±;¯5½¨×¾}ð£YÐ{Xä÷cÀç0¤»ü“ïì :ÁWé|3˜nºI¥9‹61LÜo›¿9ÛS5©®½ ½4'Sù¨l%mmçýÙ5lIððø°]''º×šÖöýävw!–Åìö`ü‚éŸåÅ÷º¶wÙÒÍ‹'’—ßÍòLŒ[û™¥oµó1<³qì‰8.oûº(ÌB‡N5¸úºšÁëÒØø¨Nxrg઴zÕ¶ã€?® $Tì×ô7§•è3yü×zÜøË)¹øžø&GËÐ\7 àÅÚ¿©ËÞæþ¿fÿdëçÉCéôóë¤ÏÃâû¾‡åo„]pÀ냯Þ/ágù¿ÅTº~.Ö÷Ný.íg÷*ú¡¦÷6§¿O›„f8ûÈvåþäø\ßêTðçϱ¨p=7{ 3Ó·{Ïã7—ÚÄÉ•žr’æÁ]ŒºÜÊFxÉÖ¼‹ 䟂=úúO&—<·ƒp>Rº‡Ï¨~õJp7?xjWɃ ‹qtbŠ@ÏCÍdºae°%¿gý øf—Z|–p/ƒðpOP+½ÊZ»'qY„'cðmÚ¸Ú«æzGáÙ&‚>3𫱹›.šŸÐ¾áÁ µ‹…?“6ŒLíÝ¥Ù 1ƒ"„Û¤>%„&yfÛä¹¥6è‘›ZÀ9*ZB+S¼Ø*Æy:CgÄé iœcâ¸<h ë¢ìG³2™ôã8ωV6´Î˜‡º}ÂWL=¬ ú‰¡y=Jnòâö„Æ/¢7¦aóÝ,&hôú—yiÎWô4X¼`Y=#ª‘v¹˜øKPæb!öÓëåi(Ìêêz½Þ9äFöENÂÂ?Z©|³+xñçþ)圆ð©îŸ³=Ôþ Øc-^¸zFÉ;å¥Z’ò1’hV˜suËÃ\ûX¶Æru§/"¸žöé|Gtùi3ºOÝ„¨opsðzµ Ây¶ü蜊N;× $»ÛßoS:¶ÃµJGñn Èéð9¶ª0)q0(TÅ&Ê!9cçïç4wâàÊßaËU-܆÷ªqÏx ýʼÔ:Ý¢ýÊýMnïˆj½^ž,ö¶£'7ÇòwÎév"7O€¡ua·{νD‡–?½SAçü{ÿ±ø8žÓŸv§Y#hî!PŸÆ/ ¡÷M¿ª_ÜtM´gGc“Wï‹/¾ƒ½F÷áø…¹öøË­¬?koäo´/õKÿÛñoÎí%þ{«óë±cs©ûT{ëókø¬uý»“;^m Üm/=N¥6¹R0s k •±géßòŠ™ºuŸòíûôvˆï¯Äq:C·7^ÜZ²h–jþ~ýõ‘Ne°{túÖë:E,mÚ?£\‡‰˜ro¡zsƒr7?±tlœ¡í•pÖº­_"Ä#øé–å? Ë1q &ª;˜†‹Gh¡OBŸJV_kL=BCÖ6°ÍÚ¼0~_·Üs@-pW¢³ðúÓл=î<Œb?™ôkt f×EK¸žs¿O|lÕ™”ºR)Zò“Ø5±øohf2ëÚ*üóN.|ìéÕûb¾¥L›ª3™S„Œ+¼»Ú›Û¾\Œ©€z€Íûë}«94»¾ì7[=kæJ_.Š«×ͺÕøXÌú€ ÇÕéðg¾!uöëÅ:`¥MV˜ØPº¢l[ך#¬©&Íkp ˜¬{¦ì„Sþð£}>•¡Ô§¨ËoÓ…\Ù;3É”mjcÞ¢=Ió6p’ Ý& Žj)Ϫ|xpï=¡Ð™/h×õ´ÂE™Ú‘¿kç XeÞ'ðë m“ý‹H¥xã`…‘ã°\¸â±ªx ‹7¸2³”fô›½‰¬êA ng%ùøæÝ*—g±ËÛ~*Wn¨_ u4¯÷ÝᩆÃôø"˜²Q–ô“}®oNæ§[©¢ÆÏuÅ‘»½žÂArÔ× ~x?b`Oõõ9¢Ò?É·ñÒ#°Ïjíà9;ºKï…ñô¸&m¦¼îÛÂO åäî*$ìü˜Ö‘£8kŒ4«ú¯ýŽÇ6iÝšI¢>œC+TµoÞ–’´{–lQ÷=?:þCÀu?'ßOáÆXŸ¿õÿWñ;ßµ³Ýî{\›Õ%µÙÉ~¦ÍÎÅ›ž,˜1O_^§…k¡]å„í‡Ö{¯lvgö|9pMCÄï¡Ë¹ßanv§÷8c®×,a»C¼è‡AÞ©îþŸHäæ{5ß4OÉô Ì;øªjÌ_¨¾*{aî˜rž@0«ÂLê‚ÑïsÑï§Ò k¥ýy‹NzN±0Û™l+Œö™½?©–,¹½¤TRé|Á©çl{[[4<´sÌôϲBsDµ˜Š‚ÒO˳:µÿHŒP¹Þ2½½Úº³¤b±æ»wpqüÖ¯L4СõjQ.ï¿N«ù5?âÖ¡Ïúû3ŠÚ V÷îÒ‘WfícÕøBêR³Å—¤´^GÌd7gÜ®µô{ÜÁDx<ñ~{ ±–ÐÆ «‡Z¬çצ3Bí¼ÃY5¹Ôâ‹)Ï/±u‡ÁÖþn»»·º`õ^l2éƒ?ÙsõL׬D“:»º¶9l›•†kн’{zР·lEõê™ÕHjÕ¾÷H~¨V¿»•s"î…Nw6)“ÔiZ e¸­3/I½G#Yì寫¼cgí|•>PVöSF˜åüÝ(Ó·•“À±Øð.-v\ƒ$á÷±2îO¯Iœ×j*‹P1‚:ðñÚÔˆ#Š~¡™ ÆÐ+£Vö³}\›ØJ#.âþP5˜Á±°;L5Y)Š[@3¬JÝ K¬ º0ÚÔ=Ã&cP T³¤V½À¦~3ŠrR®í0âˆNöâ)Ìú:䓤:w ¼Q ÁÞ;ë"öµ-8é&¯˜M~•¬å‚Úµ±paÝSƒñ†Ìð9¢ËÓט³Ÿ¶ìàûAXëu³÷K©Å[soS‚§+U876ºgÀ&î"åÍ´5êêÖ'‡¥\Îð­ê½ûø–=‚/¾ížþ¦N=z«i7á°gÒÌÿ‘(½×Àçd‹G\ËÚÔÞ¬¥@÷Ÿ³¿Ü ¢}NM‚t¯±§¯ÁZ©µñä­ËýÞÇJö‰š‘шù9f)}±;Z5S%tý‘HáÕîí÷kQÞÊ®K×"ÇoU™üUû%O{W¿Ð :jýjž•z UÜ÷ñw¼H9Bv†˜Lݪµó^,Ë1¯Fû!ôi:µ5©Îæ¶"ßFx‰¯³¾kØêeÄÙêŸ/¯3ÔOÏÛ6Nò®MÒ׳„!±Ý©—–ŸƒZЃjTà!º1Çr¹þMK¼$dˆÍe,Ú?Ñå¥ÎÕPÚwÕÊô0¢]<<©ñ)$úÑ…"ÝÌiXÿ&Î’“¥q Û“mö¨çÞ|¤(ø»óèœN ´N’ûRçe$å›éÒÎmd)&¬ªöN‚ðš7wŒ>`‚F»È2âÀVÕ´b êiÇ2æÏVvé†î®;µ}”ѯ%ÀC ùoàÑ•€ìF™ªo’\Á¯äŸÙ 0o¿~åö×€Ã4f{~˜%ÊÆºFúøgö¬ZÏúNd\‘„ÕÝØRžBñÚç:Ÿ.—kΈ®%æW-7¾,Mõ®«»£C»+ù„pÇêpÌOk²­óv­íÙ|kÌÄ©ÛfF¸à0 9µ©`ñX¶)>šê §.ĸ»¾™¨>„³È§]DÖºd$Z§có¹RÖÏ´mäl®í:RèZ•Ø¿Ñ!GpáôîÐ)Ì’Q½ÔWhC¤1;ˆÙïP³¶¥ÑÜç^iº»&}è »–º1Rž^þQÈ&­ÍpD¤ ÌëêðU[>+:–p´Öù®u‰óî“L§AøoØr¤´­úè¯&u´ãÞÖˆÞ 3QBõ4¨ÞÛ‘&îĦ}MC2n†pÇÜ6rV‹,ÙæZDN5xv»5·bË»x¶3Ùß·ÅŠlz‡uVì,UxhUÞa6óÕŽC®¿pµ© ÝœlkîQ©<ûÏI2IÖ(fÞ w©®/6£\ôäâzœ83r³¸õ°Ñ²ŒâÓfÙú'TÕŽ¢Ô;ºÊ]ë\ëÀkgé½iæ§`Ô«–‚L‘­’ä¸R„Ê)i§È .¾¸Ó*GÉÇÝ[R}‰Ž_t~Ô–-Ž9vWôÔ…Ím£íç˜½Ž“h•4¢,ëu¡œ×$Úô§ØÇ‘Oû³£íV¡Aå³nF¿[¹äàV‹ËøáÜäF‚…·:û#¡µ—ãèL ®u9þùS#ÀuÑl}#©T¯hŸaÒ>U>«çC°Ïãù{güÊ_àÌfŸdõÕåüBþÈÿ5tj±W/k­x†û6úØ6¯ý¸§y™ì[ÔàÅ *û‰5Ãïêà<¸»Xü{>k¸étúÛcÅ?@ Å[èQìW˜Lÿv̽õļeÆívGðñC©ñ™…O€P Õáb{²›NåÍŠëú=*ɶ…¾šM[«Ì½>%kHtù>Pt›ç´X{k6xmÐôJæS¤Ç:С۾s\lTªS`W&¬4—ú—F±(5é¶)\MЂŸ…¹•Ò—vPH÷=NZWDþæmÄ‘Lýþ|˜]µgæì/OÁµwjÛ/Ez¥.[µÀ~¾¦*º¨NçÆù1ÚN†¥®î56ûÄ0åÈAD.®D_úâûu°CÅ(ÆìÃâ0 …°óó-Å>îÆ»Þ—Þš•ÎDÙ±íűáêïqkKÁµÔJÓKº8V'“|qÕŒbSîmôøŽüþvVÚÓ© ,F*©¢›‡LtJ.˜ú,H¸V…èÖ¼7QX:"-mºü;UƒôöOªrºÕ#,¦²Â!»{[xã[ƒYIëL}É—~VvÀ¿`y¹.î®­šS¬¶R?*dã/&ë[zsm3[0í­Ô==we©Ú[ ýs'«Tå3ª€ÆÞŠÏf¦V,ëÉ®Á+Êó)â9øH›Så½®»2oÈ£ÿqæs8ãn/¦=Ý tå¿{ÃXKCõnê¤õ\“q#ïT`hdGÚ¾=H"¦ULO‹ô&î§á¢TOO^Þ3*•Ì@HYcÌU›¨6l¡)-y±þRU®}íjoò½Ösè˵: 3(Ù¡¦§*ÒqqÝ?;nêß9ÏRu’¯”Ϲô°Ë¶d¯™zï}‚0@ƒþï)ü_‹oÕWÞœ¢öÒñ>*t„óŽ=®×׿ܸfdpˆúØ:€›Â‡¡°þóQù×fÀý3Âëªf?g¾§jUâZñkÒîx‡Õkvô{îT ~çHo»OF½Z‡uwhÆ¿’ Š=Æå“pÛÝ.Û48:ü!ël ºRòýŸ{7XÊ(a þ¶e:u~—×ì5Ûs¹µî öu(´ýOZ{ÃÞ=m¥îûOÖPíôF -T’¼˜ ÑÆ–Ö”æíЭ'¢vPèE8Ù;ô_醮¶³=”@¯5¦KzÐ|ê\“înz6ýrçWѲÅ"mxò|ËÏì;g„0öûü8ì ]ç픟;äiÜó ÅV›oï Ÿ"0H¶ÏG þ’™5f]ÞG>–¯·^¤[Û¼v° ’‰º‰S¨”Ù¸—Òè^ö­•j+7µE ¿V×*ãÝ,0Ñ .q{˜:t)›ñ%½p™Yªf׺z{têâp“ºzÞŽ˜b¾¥i$OßÀ¥lªNj„n,qa·[k‘êÃcÝÉz©~™Ë”$âèó½}™ëÂKÌŠ ,ÙWN‘ÍêÞ¨>ÏÞƒný¯?Urèò^ýÑso¿¦fÁˆ‹n{®Ë)d¾­ïrvµÃÙÖZÙŒ®TË# ‡³N€4÷Þìñœ„hº½~ì:Ô´+‹o_œ)³P £^í¸g¸ÅZ¶69²Z©Ä}(£”Ñ«Ð׊‡U—FÕßp² jvNín •ÿ¤¤þËöð‚jÚšÁôk^oïmWé¾{út*bÀÞü¤ü¶®n?ˆVç*yos°Þ÷[íÉøQkÝÁŠí¯ŸöøüÓfΣºç‡“W}¨.ÁÝ›·å¿Ë_o|ënóæ¨óÖ÷ÈP‹<©`/ǽølÓÏûµ;h¥Ú0þ ÄøχÕ~ˆ>ïÊBAs õûÊ~/<Å9Ì™·=ÿ!“;˜ûLîZÚˆÞ K}ÎúÝíÚ[x6}ܼ}"Íymw2ú'ìM}•çà„.Ê^š½Øaîòݪï°ÚªŸYEÞ›Š]MÞÑ6M—„Ý`èóJ×¥Ó$îöÀÖÙCbܬÜA<º©µÁ±œŒÞVïû™HÊÓUx^«¸ã{:vRîMGcfÞßµ[¥sÂeŸ¼2m׈åw6ÕÛ\ÆIyjY;)Dy3u'‡5iúÛgS g‘ÑKU°¾òUÞXís°î`ÌÄÕul>F§ŽD”•’ÀZqËqÉžåüjÍÎÅv(¿²…#Ý5PEx<ç\WÍ¿«±83yŠÃØ÷E3ÀΦ¦ó Ýï’Æö*«U†}[˜ka/“3½}Ç=7YÅ~¹U|ý«ö¶*°-hÜÎ-’ˆŸFhU1`V™ò´,Ðêï29»ÇuE óÖÓaÉtφK¤MÃ)€yáé›ñeò§»Z‰={b߬䯵$“)—cÂ6ÍN;„ïiØ÷½¶v‰Áu ´oáá¨Úª®zîÔÿ3y§:fºˆÙÁå™™’æ™Ã¶;N:gÓà ¹Û”‡¼ïBõPY_À|ÔãÄÖ„±ŽÝ$ƒ=+‘͘+C0CÙ«ñˆå|¢äçÅKƒRú7lLwÝ7¼¡ìøŽí&ý¡l³¹\S5¦:î´èäÅrŽ^¾’òYÁÕa >8òsŸK_LV°ý›ã7 ]ö6ÂéðØâ3S¥¾·‚k„WaívøLj‘ÚÞã¼Ex4Ôym»P^®ðŸ/'•­lþÌ>ÇÀôÿP >÷úù/ËÓ¨§F¦o/[w¥çÃO·pß'VÏvnþǰ&l}?Cž÷?ù77/crMËg¹ƒè“›µÇ«µ€ãŒç¬æ ý¦éìmHÐ;¿9Á¿'[(föx!IøÞKÉk×í……|¦ g/‡fT™¸^Ò}øl¯ìÃÞË?:³ éë–.Â3š¢XŠà½LÒûit@qç}²ƒR⽓‚ó@¹aFN^§ÍÖ%‚À®æ¨@Æ®a»Dî¡Û¼![nºÆ=†©Ç‰ðp¢TÔÞg½z£Z³ðÔì[{4íp¢¦lØ•êÁ醿º\sˆ•€Aæ*ªè=á’n¡üÄ Ôý]Ü ‘ü¿3¸~{Ðç¹Dýª7«n¢>µ\,Ýg;§®=šå´£-Ojýò¡Å©@óYA+›lñÑR):kn“ÉíÌcΊw1kí3›®ø¬µ5Q¿.¥­Ò‚׆¶éÜ©y¸3Dm.3ž¤!oaQal&ÝŽ ÐÄÍlðú„&‚#6ß>lÁRò¥{Èz=3XZ{hM½9qýÉŒª}Ç«ÜùpÌ)i>¢óêT‹76©•ƒâ‡ª“{E¬p1*Õ¾`îGÛögš)·:ƒ g›‡‡ì·œýýÃhŽ”›:÷¼¾¥éUô%æËŽßƒ5ìÀ§jŸåF†Áay'_ÑSwtÑ ,€y׫‚ަ,<¸3§ºªëð?¿×£më åªPJÖú—„©Åga09ð×n ¼±0u å†Þ }K³çì §é´g­FrÕBÅó¯Ú° -à×åÏo …r‘Öõ»g;éô¯ºEÏpâi+*‘dM&A­Ôp‡qFçg‚?µ¼[çº~O¦]僎g·Å:ï–#e¯çWô°„ò¿Ô+-~ºÓ§XŒ7gL¢_›âj ‘%½¢çŸc«‡Úsôýû~êàØðjÃ(¶¦ðKÓðÉûû€·ºwóü«Ùÿ‡÷ðû ÞÁØ—¸Ç7/ÍÎçwƒ¥Û—’ÖzÇ·ÏU€údÊW—[¹ÚíiÝò\ÝñÈLšð®¾¸D¾ú“û_K½ÚõïgÝä¯Å¿ <ë;μ"Ëá:”j9Úäæ…<6·ù=ýü»K¨%À­¥ê‡P¤Q9O ú˜Á£ÍæÊF3J2} ¾¹- à|Üt1äÒ¬Ú×ù¦³!º=¾Ö”2ØoÍnƒuhöÍy°Ýì$¾Éª&wÑÊ• ÝÉ8/ü±{újê-lúCŸ­e¿} ™‰ªµ0ÍüŒ_P¸²l*ñ÷ÊkŠø®üÖKNú{;—Ž¡a &‘½”n[€ÄjøÍ;xÊw<‰«Vq'OM¶ë]Yº l´Û+å\¸í‘èÕ9ã]—)Wšx\ ~¦mÅkºÂXH½}ªªÃN”[¬Jw¶ô4¸hÔPAd.x$ô;S/ðÛ—B&»»§cÕàÔºï‰~þÀæôºZ/ü$+6Ãúü ȨÄR<.Ñà –séCÝÍI<8f´½êFY¶¿É/d75Î:~¾‰!¾öÝÉŒ/n •$NÝ>–úøº„i«ã¥|ÓóóÑú’ ¹óßÍp¥gÚDª ¾ŠÒØ*yoc\Ý­E?­rç­5¨†Eº…m*®ËÖÖêk_›oM›¯¿—â¹­ÂãW`Îä”E4Á‡j…R¾gÊùÚ0ùÔõêümn¯qišCog‹ÑxNgFoÏ? ¹lô¼Ü¥áw¥â°U¬uÆP½sQÈZuß|®l3sM³jÖî›qæÿÇÁnª™6 .‘Q™7ovgçÜzM­z¸éã÷áì(yŸo>c9m™ f‹ìVƧKÚ­óG÷ì øhA »}ì[Þ =¯ Ø&GïsîN–‚ÃôÇrõïù>=4z‡v2_Û„ýo^ªúúÕ)Áó,)ÝÛ¢†ÝÓõÓÛ}ÚÜkZ%?Í^ÊHm.\€u[ïÕGÕñH¥å{ï<–í>Dý'wEj»<§&†,ý‰p‡Í“£ ¡H5®¼âþßg¯”]žƒ¼Zh§»«8û5!ÀkÛoôÕÛå-…LûCí__ŵpfž‰ÌGÔ5|ÉéìÝ»ŽØ•›ÙÁ̧o[‹i­&æ¬m\¶òÓt‰Ö¸qYú%7*l¨Ž®ðòN¾+¹-¥ 6"Á5•;Q<*`/¸Œ;éPé}~J!ýe¶ø»ù=ìÓ¾ˆt­äf>Mhì|Y$“c–ì7gŧ¥—.Á|ûöÌŠL©mQMG„òuë-{ßêæ'ŸŸ-½¯1Œñ f¶b´†kkï¿nâYüñ”?Ì×@ƒÌîÑ]ôŒ¼œálã‡éY£×…§Ú¨ãpwOQ_(l»Ï˜çúÂrKëÞ´¹¤PgQÜß3åM© ;øPˆt&gñ©kÝêÜkiÛü¹LÔ‚‹­•Ü…y¯gw4Ħ-45ïã©Ïp:ˆbQtâÈãXI¿gC]¾Ll—_£W]LøgeÕ£=@L;Ò³Sän€WÖ3w9ÃÞs’“¥}R®W7Qo©Àﶬ8‰~—’º¨ßÍ¿–űù9ãÎëVþ*pn¼K£Ú,¡…óÞõÓ³ÌXÙ˜_ÎV§ÊM#8º¹ˆ—âð“I­Ž^=~zÞ*vl…è2×Wb?·øßI¸;{; Í„a*U¤Yâ˜öŸÛ÷ µ«ÎòUÕæ˜?¶WŸQÙÓ{°xŠæÕ±®f/l˜Ž ¾rÿT0½d>ïðòoF6Ëa›óþ—ü¿Š¥ôêXeÿ@´ªê[Íç«3’1n=ºW†Ã˜u…/]NÂúªòÖû¤µô؆ú½L Ãè@ëèóë¨/£T*Ýz>,~…AÃÃ@PðXòj\®€üÆÆ¾íP¨8·×N„Û #Ï%¸9$™ˆ¾jûÞ÷Ðïú}=“J¬²°›[éeÓg·[,dÿæÅL£¶¨ø–±\}m7õ:µ¼³%†œ~f½€ûiô«ýxŒ'B\¿BüKGƒ»º øý€^ 2ãCra¶ ±w¾NüÕ×ÕÛ1m©•ùm‡.®Ù#â€>î%ÓÁ­ÚEˆ tt“E¤›K K´©~B.ãMʱ¡ªnT"YÓ>Ίgž3„u˜½ñY ѸéÓßC{E[BÚõ#€³Õ>è¯lùǘ˜Zn ÄÍ^?VíÈ~—¿¸é×kr­šJVA¯Íÿlä^ ¾qïœÅþ.¦o%½2¼ÒJ®x\øžß\¹ÖCÕ«Xj ¾Ûí’Ã[Àš´9QbÎ,ë‡æç¼;çA—®9€ûÃUï+µU6Ac³} [»@©Söm0N’i 1ÓúÊt¶÷V‡ƒŸÉ…WOò÷Œ ÝÒ -ðÁÜíÏjÙ?·°#l‡Ò¦L Æ7jp8­ÄÑ(3ž[³<}:úý»Ê÷ à§Ëˆò®ÖV Ý®oÐ=_/Õq‹òr#ÈŽ…h ªÜC_0Ÿ ÜqÕçDÅòt ïm¨‰Zßb›Ktõ¥ÖÕ¸÷ÔÚãmá:96¥ØÁýˆºÀh» Œ… €.ÑÒÏtå=ý¢rÔ?^kûœuï\gïÍ8 ú/b4Mì`äÙlÞ¯Ãï%ú!d0 ?™ñS¿çÿGâ×mIݽûÚ›W¾^—߉ýžO[S,Ü}p¾ BöþñšÂ·f¯áæ½^+X´ó`•ÛqŸÜÜ× èl©Òbi;“ÏÞ‹­” †ÆÈ;×@†%yŽÏJÇC ŠœË-:ùL3Õwéªô+ã àö£À0òÏTe|Œåc‹¿,äLèÅÎå/zîð:š¼0ßVýžxÎd K×ãEµQ טW•ÿ·n¨V¼ÔÃÃif`Ûm˜G©Þ€&Ê \¥¼×j‚Ü2미GË"Ú~L.Ú¡ÖàYÞ ÐAÖW« ×xâ@3žÖÍlÛy,ú\ŠdÜ×Ö €0]k_/ÉáŠ0”¨þ§ÃÅÃ}J›Ú-îæƒzÐpæzYœ7Êä¯î4> ¶xyµ¯¤Q뽊åƒôåÛ×Äÿ5ûÂ;Fe$SÙÁvªœ\ˆ@J:ú{ÌáìzYû^mÒyQc˹?EmÖ³f”3uxºâSŸŠ¤U¹Ù:é˜\«u›¨ÒÍ_ãºðØ‹Q¬<÷°ön^ð\†ñ+Ùèæ¾ów¦]Úv.5-Æ\&{ƳÉf bæt(‹V°àÑ`‚ÊìMY„õ¢ŽRñr(2K8=b©ò—¾Dʼn­® ×%ªA=ˆ¥…¹W-YxH§Š÷ƒÜÓ0x-(ó„ü‚лè¤ßO;ú½†ÇÉ”­KÝ[i‘»—¥ ùx~À¸ÎÈ 9ä5fi¬.Yν.PŠ`hŸÇ@û \öo?*3¾õúê¸lÈë º°)H‰ðR1vÑ~ú$;L6)hìâ¾ `|©S¥.}Ômñâ-Poj[ß+x…íwº[šïÃáØVÒ·ìevøJ\ץͦæ 'Ü ¹‘Ö÷.ú¾î Æ&ôQk»ÁëéùÛˆ]üü²6Š®Îª?¡k§üéßæ4„7SõKáþ^ j7(ˆÝÞ½ÙíFïKþ7©Ø#•ëq«»ÍÀyC‰º>r³ÕTž*ƒø<c¿W_jê™»‡áëîï¯áµ12„Mˆwz½!¸®i!Ðë5”\ån†|VÐA/ÅQíýr9}˜â,DZ¸‘ºå¬ q¥/dµ#ñ$y s.Ió°ŽDb¦­{²Á¡æ?,!†’“µôSõçØ™YûÄPÈ0 ÆðûPÍä·zܶ4ø°Í›ì)¸4Õ“$0™7©t"èæË¯ö„#‘,äñìIbÒ§9•½zÈ>ã-úïtÁbAsg K™0Ö5ÔOÈõT+f˜Ô. ôé’¾©•ÔŸ€±¼¶‹<+S뻪[)àÑk¼H³Ašö<„;V¡ÒಭYÏ®PKð~MkÖù‚ù<%Ÿ}ç‹.Ó]&ÇØ/ÙSWJ›»„ãRª“›fÆízU® 4Ô2LJÇG¦ï:¸IǤ ÏaU@»š^ö‰ü³™O²wĈKÐbµãdµ–´ÜY}ê×&èàär˱ŽÏ®n&¦ji™"^ñBÜÉ:­ŠÈJ³ú6,uï§[fé1{Š*[k{L= (Ÿ&õ/¤èVñËHÃ[š U½3¬Å<_©¹ƒkD9#Á‰Ùkº˜”*êàÊEŠ6ÀV›ã ø50KÅ…ìÓg¢ðL²cV¦C±?B5}ŽkØ£¦ÞÆœ,ƒu;Cæã¥!ÏõL÷æOê™±^Ç&‹Ógá~-ÕA^cm™…™ÂœñPoVµ}ßêkÓ;ó>ÇgÏ%Ü©íÜæt/bÂàýo“êê9VõþnP÷Ÿæx9õæùmÒ¸v¥îµ^§£óþxân²{÷ìäëþ.ƒkbíPÐ{ßWú è«ü/gìñØïʉ:¾qö êÏûy4[.–>?Ws´©ÊT¨7tåPºuzænÛ?Áh§ëv0øGâ­7's=½5bómÏ‚i@~åÈôvC,­ôiµßáåë×XJkuðž8/Õ0`ô¦ZÂþÎèåÕß7BÎR軂m‰»°kµR°ЙèQu×–ñù8"ö™µ?•¨ÍÔ¼ËðÕ£Þ?¬GܳBŠyjÛ+Û˜mÚúðÃ>•ï$J¶‰ìLŽÔî{a͸ÍEª®ªÈá@ÝpW.¦—{rŠ7š‰±¤/Rv;/b»Ö«€ªuêN!Èñ —ùkåõbËçTËK5mËš™Ýhµ*eCÙð¹0eµ¶¡§c;Ü`ËØI¿yûøö´;1g³@’¦N³¦&ŒÏáf7]¨y5†ø®Ê‰HS‰š…¾åÍM»æè—„Êò¹¦!Åȶ­i)U‚@˜¼s7¼ÓTœ ô¶ÜR¢³i:ÝRÇ×mÔ=áÑqËÛ®ƒ¸M„ÁaÇE‰ *c3iBAí$`Õ×/Ye‡´Ô¡º…C&hôôê @*Á>"?5ÞU“œlÌsî‡J¤/–Îo~i%-ùîAö1¢I™WÄÊ4†É±b‰”i-}+0^£¤†½A¼J*ã¹²µ½æ.ÄØNUþî¥ùö̆qbaÖLxe«T¯rÖ+·N¤E:47ì°ò‡ÀG2f¨°¯ÈHoïë±4ë×õ§ø¶Ç]&­ï™³#,>ÍfãÂí¿ûýx8’OWÝ?˜[Ýáþçâÿñ¬ Ýá9yW GÐ%µ<¢þ7éršÿ¦.¹óêÇܸ¿t7zks*QƒØ?:®²'¨¾ö‰˜r €ž…ÞîžÿÃ’TÏCNÒ»Ô÷GwŠïJw§\NÓØ¥ÚÁÁ¸Æþ-ψ 2®?r$9K u0cwz›kœ°üÝNÒ¾@^fMð ap#¥Ö‚{v<Äûˆ ¦o!±u•Åa¦×Ê«aªäÙ”°Ñðêº0"Ùm ú´o·5b­«¬˘ðûª]<}íbwYl¼"¡†ÜÉÓØáƒ ïid¢dÑÅ,MŒRl„´Ïk#Þ¿±5¤^–€ÌÙVa\æ†XÃeVð¶ý Ž?œêº®nçž‚Üf•ôýW0?3uí|9`»»«`‡m+X¿~ŽÎ˜M À3bD€ëZ8Œ ¾í;ÐL²„RcéÍ­sD&ûþ/(‘E—q.E"õ°ÑÓ:’Ö~uŒ“è¸8öucÏsRªSzÉjT}âCwm±vFµhƘV·L°ë×Û™8Ê?ƒà­7 õ·GÚÕJ¢ÚµŒÔÀ%VD ƒ÷ª¥jáì1!øfUD™…cŠe%²¯ºq‰LB1 ÐG»hÍÒn  mé.x¬¨ `R,+!ƒ¥`-”°pƒ"W~¥†ê¼X¨èr,›6Ü¿7·Ü? uJe¯ˆ3¹ØáõQ½Êuç¼F«“‚¯Å‚s}=iw Ù¯ÙnB¤@%oüª¬ËX(~Š{ýÒ#€Ÿð÷³½Øk!IRÏkmÍd÷¬ýmŽIµmÚâïüeÍKÇ¿‡g²Ý‡^\÷^§0¹¼sù9nfø†È³|•ð{tÒ>|¤½úÎ9SÜ3“¨ñ ´4Š|áêx’×ì;xăOƒ_V.ŠWŸ  ¯éÏ÷°âûþ!~ þï¬ ¿ÅÓ+Å?½Ä´ý)“”›Ÿ O8@%7ÝåafˆäL[9pµ¤œ{™Ä7½ueܶ²5j†þÌ÷ï׃Ϙš3í¾²ZCÓA| MˆÕtL¿ËÓñ=çr+S³@íúùÊ|’xh÷³r½Ü~xzy&õ¤†€*Záç7ŠŸ}Y„SfìÙW…Â5¾Ôwñ¦™à¬8ÎÇÙì5DθQìÉý‹Û‰Ó£[¿8Ä.ø+#´6ª±›Gµ>4n¥8½‚Ò›Øâß.ËÙЧSv­¹ˆ¯£Põ«yÙ”"×>}ŠE/Ý<«mIhÝÍÛ%öÙ—lN-n宋ð„-çóÿ ëÝÓÜ̹ŒRgœéˆ}}fƒ !H<Ý>p>g±ó ÿ¦³ÕMïƒÖÞÓÁ,ÎÖß ÿ'NŽ9›¢d¡#ô·Ç¯`SLÍRâe|Ó{´Å¡ÐbÚ²m¤

ÆÖ «æ.Jóè…½ÇízæòûüÝ |Ä]1œ-Þ„1噺®âÉÖqõ4õÝñ„8èçî!7n° ®ww&Nseɳ:¡ŸÏ!“XÌ[r›ì=KŸž¥mt¦HÜ÷¬¡ÍF¼û=þsÏ7y? n\h'vE†š«šÔ W¦ @…›p!°ö–í耕EÉcC:ßKØA¦KTgb0_hK ìLTŸ`î ”5n[ñ“níž|õ é©X¦à±£¿²œr¬Ã:C&-}Ì÷$¼§>Òy€ÂÂL£[û–ž§ÂHbRà68õX¨kä ®ã÷kOõwp“Kƒ%g ÒØ ‘`éKC{4¦xõ½Œøí^f&5ŤA¶ÀÌh´8PêhÜ´só÷:BCñ=Y)¦lÑ\¹²H¼ì¢’¥?‹æ@uøg'ÊË}­a¢fn¬ÍÂZ/z)åJ‘¾vÉWë¡­šŠar Lˆë‹tiÕΚzÌ1¹ÐÏÙ¢¿J­ƒÌ½u»M`£dk²>ó²=€5n« óÙ<[óŠ·nÍ?‰< f“’eƒùÍÊc?!ºVøš¸ˆ4õÀ“PÀÐÂOÑÆ†¹Áh¶ª¸„Ê%úz>#±!ðÙº¢A%~Î$• rStjIß¼ôï#»>Î€§K°™wˆ3´†àKa„Ä ‘D?°œ=í¾7ûwÁ­«¼N¶2/<›þ¸àŸ;ÀM̉Ù& k8¡u³Û°C¥ä² :[º…_ê÷ÜíÞÜÏÆìéh' &øûtú΃ÔåÎÙ ±Mš9¬Š6™úô1Ú16:»ÕMî »Ï±c’;ÖFð»×O¯jßFâÀyÓ'È@ú럨,ÆQÝy­´Y ¦ñma4råC æ zÊe"c\¤8‚ ‡^.æÆ~óŸ(Îk(ಋujýšô+Ê}zýUBܾ$UêVëÕ±òõ¨Û„‰åÚµlRfuq“ÝÇf^² {{ûṲ́ö·¶ —&µYàn€úQž›¬T²ŠØd2 m¬¶RœÐáC½E2ÈÆnÎpÎ?%go÷Ð<ÑCW ~y—g¬z> åZ81må/Ì;)º© ƒ0•çÕ·²B¯#æšî!Ùh§%Åœª.c.ÞŽÈ3'jšyGϧqõ¾™.ÝÂ8uQÔÚvÛ(»elþ+<}™Ö3è) ý—»­‘¿«z¿ŽlüÓÒù|›õGnt¾š ¿euTZ/ø/Z½ï‘<Þ{Y-\ɉôkîl¹þiÀÕú©ÙkÓhý¬;[=?ë›âž¹U„D0—á|~sÙé?Åc‚à\½}$gÚͪoG_ÕÓ/“­ãÝ€Ð'f²E‹6Ú5¹|›Bíî8VáNçfDÞhQeÄDÞ3ÝýYë"7Øy8þ‚nàÚ,®¯³¦Ë"Ôi›€R4ì¼Ó¹>_»É¶õ ƺjO[a'–ÑÍwA;j=¶^E/ršZc9s½À^³%œ»ÏHo­}UÍDmGI¢œÖL£DaÏ4üÈùoX‰WÓ” 3ppËYžßµ~ºŸ$Pùt´Ï½¼3íâ¦b†Œ4nRW*ÿ2vÍ[ÐÂæÖb´!RñþªƒØ Q«ù¦ ¿3 a»asuãÔx‚¬G›±–^ìuO´—Lâ~jë`­t|Œv¯âOžüú÷§j—jî ÙýBbçCfÕ÷o8¹zî¸ ­!)¥€-ìCˆeoípÂÄÎ W4ó†Å`$A & d©˜hÌõû/¶¦“瘹Ú(ÌZG¦XÏ|•x«€XèQ®@pÜ©äÛÜ08yÚ;× ;<W§çVç¨SKÇÏeò&OOGq—D//ž[ç£GDÌ2©ÿ¥¦yÌjkh|–)ÛBè.ï7vÛvó‡TóE0j#ÚØL­bòNµo1lƒ‡ø™tj¼yD9¢V³ïÔ™ÐùG?ΆºpÔw²µÑ9¹hЯBnµQ‰ †›KÏÝ¡-°C™*{•ã1ÚO7wRëNÄ»3¨êñX×ß¼°Ö¥Î'Îø“¥Z¶Uª@‹²Š‘Ñ*£g{óëM˜–q;mð¡7%íÔ¦ÜìͪðA·§צS×Þµk?€ö’Ñ/aˆéVòèݹqÄüw¦¿ÔœðÒ<üoiËäðÓ‚¿Ð½iÍŠ™IhÜÞ}TY÷­hTÃ$ÜÝ-Æ U6¿T=Ç& ¬¿·ÃVˆÖ¿ðjmÐ{gÁšéX¸ŽoK¯Û Õ7Å샷û°ò'óH&µü´¥éÈâ_׿ƒFbºùz†êóæjYNþOlœ…ö›L}´ZåJýe ë#ˆíúä³àjCÁLñ!ê7É˨Ðyº U¶ËžÄ²ŠX¯3äNSk»˜æ(ˆÓ§jVÃRëûGèom –/ÉH­>!2g$Ù§/\jZøÈ ¦0}¶?å®ÇãÊ×’eGUïN[½!Ìõ{Íúú bw©à~xBäã˜éýzNK§_m¾z(ÙÓ¯ŽNÍ4ʺZ{rH>-z¶óÛØñdá7k~’¾õ¯G±PÄýAÚÖ«]‹ßu8ÛccåŠ$jƒ3½G>‚6û]›êM¦5^Ô¡‘¬óxçH9ýÜöŸ÷·¼5^¶[Q˜Ü>F)3ÌFÙ ß#ºeÕa:ÁGüí39¬ú6rÖµXgÝàÊöËò9¸&±Çj´³»]2¨¢µMÑþ»·yh¤]G/d›Ìù'yLmÊì7£+t°¡ó†sH¸jc‹¢{Ψ®€–P>QÊ™p/Tý¨4˜ð—˜P›¯³ö•Œ@2—Ó„ÚïìRWÚz»óDÉ3M<îÓEöRƒM²ŽÔ§ š¶WŠÀ…±#Ýn†÷BÔ6®ºú¶m‚Gï›Ø.¥˜Úw0o‰“Èíâ“­+§Al¶w9mô.ïýÌ[ب=¼–ý7Ú˜ „sm#ÜÕ‚6=´ö]ðÀuRºõ³ÍòÛ§vN„zw¼ý«¹plžç±º¾×Þ§–ÒpøF³‰·ÕˆSÞ~ríS÷–ǯÃÇ&=û[.ÒÑ8¼á€ð>Ï÷g_ß²~ï¯ÚÍ\HluôPƒsxÜ?ÜÿÄH@ù[ÝÛ/¥s®9DÙøÆäà1ÍÂÊXpÈözX¤×-KÀ群¬sIôÁí/ä$?‰Ŷ(ªðö Êf¥¢ç®$ý–LRNÝÖŽÊóQèØìníp6»“RÜO¬Ö Ù‡æ 8)½SÄíDúœZ‡KÅ ¾~< Îíw™vø*ÂÅß ‘jjõîþXÔfáÊ%ÐͳìµsMnµ÷6•£6ò ?—!õµsþ˜tªsë9v té ²‚)õ?y¸¨kíIUãÏ{V³­%QÐ//ÞÞÏdF!Bâc†l9±ú#ð^© ”üá’[²Ú V ÀÖU­ÓÀUk£9¾ ¸ÉÚ[.HÃÆ“x½±:’-¯"ÕAp;/æñOÏËE-«³vïƒß[6§Äl«¶Ô½Nþ=«ÆÛ’‚ÁnÁ5¬‚«M|šÛ'*â¬É%wX×4 1_ɶ‚þ_5×™ Ñè!/šúY[¼Ìá4Ý:U&árMm»²køãÁ˜àš­g¹½µOj1ùÁÍÐLú˜žÁ›©{Ù.–5ˆ¨éšBZù)fÜiÄHÏ µšÃMûiuÑa™|JT÷Ìdï™#êX¸û-èBõQ§˜Ïá²·å§Ë4æa‹§M½Ù’¬ÃY¦×P»´ZcÂVc=T¼2  ò¤’?SÏÏ+èÏ|æëÔ›\tSÔC4;6|«qñæ´ÙúÀS¬r' ,•ò¸{’ì2¥_ÎðÏun—F£¯u\‚ÞFVý­Püoö ]ØùŒÝwë±è£­Á±ÇoÖêv ÛÖcßèn‘@ØÕ>êšÚzS›%\ÞÿÓ†Rq¤UÁ P54į~åù2Ç‹šgsg¯Ç—<ùÁvWKN·H±ý•Ÿ6»EÏÉMÑV›.\`<¡åúîÒKŸÌ–æ ¦à'¡ ‚E_MNæû^Ï×Ê£x:ýª½;Fp)†jß_…ü7·/ŸÜ?ð“CþŸbŽÑ¾vSêö4éµ@©7úšìÑGد죞–üë=s…U[£vÒ·H0ôïíf:‡>ÉþÝÜöý|«×-7Ï:6¼ÝÖEÞml¬†\N»ã8³ ë¹§ÑÖœœþTÚE™H>-Û»+âôtš:w^‘Lhl{S^õäeÕó/ \¹cÞF½Wêí(üìUÞ½cË߆u~mSFÞ—ŽI¶¦¸geÍŒ-:Ý.·7Íñ}w_£ß"ë–ä¯%E²™$?t5 ‚*V¶Ë×áͪµd1…è"õÄz©vX¦¤åññ.µáu¹§FܤËáˆC55´”¼$çú«æÛ™Ÿ!ŸEæ)ÅvÔ8ô6µÑ#ªN«–EJ –|ø"éÚo–¶Ù-ÛsP=‹è5¬¨?½Šd)–¿-ÆÐ~zpQJU!'`>öúÙC”¶ìJ·”}í¿f,Éõ‡*ª!ªe&º,S—õµª‹¹oXÄlæ1¿=s1KÜ÷ ÔyŲø+†‘Y‚è÷üÆÒŸ1:‰Ó¾íÐðTd$ö÷Fâjcìíg™Ë…ö¡¼”ñ³Ü×Þ2*‹L¦©¿E¼™,×ÑJ²¸/ð2j柴 ‹9YŠíCK, A&6mcðX²p[}R¦­>GY C‰¢ú›U>iÄ =>¸¹dàÑ&zʃ¹ícÈßci,)b©jà|‡Ó7.v¹§.eÃT­*a›P°ƒ…#ëØ‡]i%ÔÇÈZflààÞä­«¥mpk|zvòŠW ¾®Rî¢mv¥Ùé9¨Züù(Ê;ó÷ÃÚ´´j|Ú…%êõ ,‡…7ˆsFº MÈt¥x3§RÊ›B5Ÿ^ަèþ NV7Ž©­bÏè&«ªOS†__ë‹D°EѽÁÏèéììYÀq{íùœÞL.­ˆIÈ ,õü+ÿXŽ ,kò®x§ÉÉöõùÆ2í*dɧ•Ÿ´Å·éïAâÍ‹†J4Òzº×§ä A¶6>O‡Ô¦¶¿O¢ /ìëuOùAúÝàÂõ½®½iÿ‹ñUÂö±~5áo‹Áúxz* s"iÄ&ÞÂÁu¢å®j¦øGÃòÍïS$»¥Àƒ \NÇH7¸N'S§ÁÁ`ù}Ã>W]Ž#™E€ä$Ï~`#G«ƒ]Ï ›BU±¡ò‚F:RÍ¿Y=}¦'~FÿhõY(½Ü©¿^qøõø%Wª^òT£å¸mF;e@é=90¿Ï04as È |¢ì5\ ë’ŽˆÅÎêh: u†º†—ÏKÒ1¾^x¥v†P§Ou±ÜØ)˜5;.wЧȕÚ¢ŒûJÙŘÙ^œ×kv´ho¹1}{)BåQï.mÊתbQKÐÁ³ †<+[ð¤\³/J Rz1~JñC©BõMï­%&Q¼°¯êz 0FÙ²H´±DV.Hرgß Å~ÉfštëØŽ·§,Ib‹M¾Ùh5Ø¡[3­W*¸÷.ˆ‰9æOŒAr`7Iò…Ö>Pöv†ž'±55<6 ¦9U€Ó¨WJðö1]#ãeg8§Îž×TV)osG Ã!MæRÖúšSØ’@œ·¦ö–íM{l“¡¿ÌJzWGì'6¾ÿžuyiDãÃtÖ˜ƒ4:–<Dó¯d>J lÕ½Ë7ß@•Ú>åd꜀ɗ7ªWñ‡½m ºn _Ÿ£Drt]q룓¿ùí-²ÜçaáçЩ0ìŽn–¼\ãz‹Ž_æäš7Pë’Møÿ{è“Øú¥l»Ç¾&ÂWq“k`š?T[b×[“øÂkEÐýl€Ôp}`=fõ€õÖø½{œ‹yi—(®ÿ·Çgo˜ê›ÈZ }ÜÆêçÙùçuE\ ÷ÏE×dËë¡8õ!>}A8ßLÓåSñx§è÷ЇxÉ#õõ–ñÄ÷©cTñSøyìñïjl7 8rQ»å>_[æÉoqφS޶*'wùæù ®ªƒ@A½¾H{Ù¬ƒÃ¼£‹vx!ƒ1ÞJVp¹:÷RsO*<—†AÏÇé¨<€p›"æ°ÿYYØÈ´ÍP6õæÔt¨ž/*¨“«Æ²éb]7pyËi÷wv`nÕjð‚&‹ÃZG©Y”‚žBP0|Íd ¤·Öjl=ÞŽõÖ”šYýqçS¸°Õc´ßDv+à ÕßÊ5¿(»/Œd¸/ªÏí³~Ø O§`ÉÔ€¡P9ŸZh`ÐhP±g!ï=Z¦PoŸ%öMn“¨·ÁÛ=­¨}¨siÛ1%î…©fÜ]!’ º„‰Éw„Ô~þÚ½ì½mèÔŒiçØ^в³Q›¡¶ú}[Qj]ºÛs•/h7p)†™óŸ¨[¢›8)úŠÌu}zÞ‰LN±º¦Ÿš*¸G&Ä•a¡ûc€.¨£g|—æðœàOù_!‹èq.Æ|ÉF_P"”Ž;ÒÐCa5kÔ$°k}LêubÚÀæÆØbùEx<àt„}Ša±¼E<š58&Yi}±6vRÉéh¨Áµ´êrIpë;ýX7᎙Ãp 1Ÿwâ‘Úâ?>³7<‡\™·dôú²ÏÃÁX¬ÉZ3ÝÙÕ•³WǵܺtlZœb®Ò¯â(SE´éÄñnODÇ{ñM‰m¤³Œ“t”`´DÔw”}ÎfÃæd» àÞ)HìW§A+XF™YïLð¢.ý*"³ò¼InÍ¢FøqcC±7{ý PÛUvjKE2Wµ5ƒ¸â‚ñàÁÉ ­çwzÔÀT<4]»w¹@£› o,ë_×ÞÜpt³ê(ú6gÕ¢¶­­3Óú®°5&›å{Þ«²ÛŸô/GVðÔ»]‹DfN¬±òe®Ô,n·áÞœßIÙ–p>Rï5 @üÐ>Ú!úîëM bZ 4'ä^Öÿf¢ºžÕC³à‡(ßH8(w»ü¡Ñé—²²]oWT¶hq®ŽÝ™,´Ž2Ô¶èkõü¼þö¥ž„ÒD"fû­·»jžRuø ­ÐŒóöL¼Ñu¡S|1HÃÀajíf³©¦QÍ …:CE¶ªЉŒ:Têj}Y¬'¨Š½í’—ÝAñsÖVd~ ¼C£ßµ€ÙÞ‹ŒÇÔ‰YÕõAÖ·Ù ü¤¾±îqÚßã>}€/¿_¬õqìw:JûyÜ'¿›Xù,1zšL뙑~7NКôëÅö)Þx;-³·¬êÔžh*®£¾‘;¹Ëa³ld0¨óÍ™(éùëj$[x}J³xÍtüsU¡Pó2åÍ_dÆa9³§¥ò—ߟœˆÍ=Õ{³¶ §¹Hò¦B¥BŒì麄öÎ"¥\³îÆ"•&¯*í7$[íKz­»šeªL˜M*²Ü;Çzx¼º7kD͉ Š!@µPwF#OhE^«Üq;ÒšÂjûïÑÏhËQ~#ˆ»R´Ýb(‹Ôrd[Ô©¹x…jJÛ±q[§=ý.¬µ˜\˜D¦&n›j”R4BaØÈ‘ì#ëÀñÙÔâ U*;uJ3U†‡šGÿ‚_j''“Ù/höä=“Xn5@Õ^¢ê£95(ìA4ïJ gdy™±%>‘¨js ÷ÉöÁ˜Z¥±FJ- ,~ÊfdoŸÝÏÙÀ…ß­«4aM¢…R€œÔÃDäõábí¼„`x›¶ µdŽŠ×Å™dhOÇš¡OÃOBÑ‹aŽžkŒ¢…B=@ˆäÉ%úŒáG·ÈNÀ¶kƒM)½G9ƒ êàB£f <Â@+ŠLQÐ[â‡P¼™)uQ J-×4 ½}o†­×&Mœ™ÑX¡—zjìíºžbÔ|ƒ±Z:¬jl{4ÌÏí;½­.¿HShºž•ØeñyOš–³ù¾Ÿ§¸‹ýMÎ:|žaéeÒ°ªå~ZXp“¹GÑv±\ç×ÚÂRîë–¼Ç6~Y Ùg«›çöf'Z==lQ$ÞNOw×Ë­úÓ¬EÛúûfËÓ­ã3¥O3þäBq dÁ×îäZA|GJÅÐj_J/?°ÝÐ¥”//ì«J¯=þ pƒˆ JéUéöõ|Úθö>Zs¤Y}£*‰ôÒæ@> KõöúDÝ‘cˆotù˜BÐ*YÚ¶UV#ˆq35#Žý§Ø4AD0cß¼ àŽ™f"ý8…-UFPB'™”Wêø”ê3¹°ÄÇÒphöå€v¹eN;Ä%û»(t¸þªl(ÌÂé¾$BáÀg]=N®0‚R†ì4¶¸*ÓP ]p×AD­:Ì¢›I€ª§³1ÔzÏլʫAͼ#Iò*Äæ×Ç5%™^¼“Éû%NË(4ŽŽŽFˆÍÓÓJ¶'„[ÙW¿©„š•JÑ~‰Ý;ºZ ÂA‘¦3™} €$ÕѨ ÷€vËÎ h [Š­ÆìN*»,ÕÒóc±«Ùž3š˜•Ä„W¤<†0ZµŠœ8Êžj]Û®’ƒ˜¬¨²8!…h§°¢85( J¡ÒÒ}(eaú.1ï®Öˆµ³áµY0"ii³ÒêÜ˾ß{-¬Oaˆ¤”ÏCò¤i2ÚP§ðëšÃhÒøSSÂߘ„̘Í'6Õ–’ÚG|åµ-Ë_׿ÏÈšgÁ’±»s”ƒ„#ÛR‹ {Düø¯è¥QÚ¡=¸u@ç9½Òw¶…“ô[`ÓƒÄÔùâŒ@³-»ÜöN«Q¹´·v²sì…bWà¦Ï·ÅG<èÏÎ.ÄNYo¸4Ý %­^²ã{Öy,nè»z–œµÚÓ³›õµ}œWædþTÛ§r¶j8n6™êð·Q·º8,+}]:s›Z­/ŸËÜÁlŽr«¹9~Îó‚ÛüQ¯Ö›6Îäµ:Ev/5Í<bû>ù õ«´ÉêX zê0mí­ÀMjnßм¼ç°#ÜpmDœy€_ošïƒoÛ/5~V0?±;ðJ‰0î÷y=w}>÷µò!ÜÔ'{Ÿ^,,õôÄ6·1Úç¼M4tP–À„‡µ8M¡‘3Ù >œÇê \æ ¼ŠÞQÆí"‡½ÛMÙuŒOèHË=CÏŒ4X=¼2•>Œ”;r:|Wÿ}îµ0¥ ÔAtjŽçL!lwZF›ÓÁÅE|zâu§€ÕôŠÛÕëô Ü[×J"|La”1õ”´2E1”÷Âo$'Wß–-ûSéúúQº5Wwã, ” nm|ªäª£6J4bŸ²8Ü‘á κmk½pU?¨¨ ÉÖ‚ŒÒ4®*zÀƒaÊ=¨bîÏ^Äã“3Í-rÕ¯%KOôîõÌxí4 ©PÙÅä:¬ê™;ÓjØ/nøaRÅùršäµfãÖê94F»ûJ¼‚pŸ;d¹–Ÿ¶1ŒÑeYýµ±ôeÊ¡øƒZÂ/%¢qªÞ ¸À˜ª¹®ÉðÝéL9Ñ!‚´ô)8oF¥H&9žBŸ à$ØC!‰Ô¾ìÁ¿ásÚ}lÇÕL–0ÝŽ´ëY¯ùÝÚ³ži”@ž’Ò¨u%çáF¢cÕNAN¶myOª”:<™›[\&Î(‰AÈ’WE;“Ôûõ©Žqv)[$ðnÛ ö([…¨‰¼ÌüοJÿKé&¸ ô€»î… ¤ $0AºXIC#æZ0ÐØ#°ElÒ0øÂòn£XžYìš~ú?7uɇbzÌV˜ #b+—¶ÌBɆH:¢UE_VðcxîfGj4½ÇMjUáš=FÊŽy¦‡¯b‹Aq‹k8 lügZ¶R|âiäXHR}¨°‰ž¢´ôar£1âdA=Ó”#q£´,x&JJ×a}®j¥Â°bjº (ä0Ød¢Õ·J§\úH"„Ú` ™‹¿làLÑä'Ô¼Ÿt„¶`¯,ž4m·[Y»Â¼ ®@ÕâÏ­Ôh/¯| é´IO´•;;c‘·~[ë½y¤XB¿P:v+žÕý~2èlìƒC’ïKSÈÝ- J\uv*Ð0'g83ù:¨ ɤ—ž`8[üh„ðNñ÷]V‰2÷0¼jÌ^ ¹¬m8…`³Ï›;•m¨xsx³çà¯>®ß©“O-Êúê✸§fÁÌtù$‰ƒ®-\z:ܦf/'­ÚMn8¦@ähðfŸ¢µ¿­1n¥ðzO¤øzý»œÿÅ…?LSÊP PÜsøºy®dÉ Ö»nöF]Ãêê¯Ø2K¬^`©Y-û/‡á'ù}ú•u2þa1®’5(‹GGÓõ†ž±»0G ÊQgEÖet…üV­ÓMäm»~±±ÖÙ AåáýÊÔ"ÀXb«ÜCsR#zÄ&ÃêxìTd‚Ø—™ëN;úaºÛ»ì®—˜%¥k1-ÝýL<} éuoDÅiá¯)kU7ÄÒ[7ƒVkÏ‚î‹ÕURb% á¹B=¸öf=¹IÄ1¯õöqp6|×ù„@vÝÞwCRqÔ;M* [¦ÞLÙ0_Êk!dõ1ê_Æh]£P¯qZÒ7eÉa),PÜ“U»Äîn›¥®©óµ‘ªUxÍÅ¡JNÕõèÑ+ÕIô°¦*gHäò&œ>|¿s[Xw Îe‰´B#:Kº:P’^u‚èšûJ uÄp *U³ "I‚ ­P äðN¿¢ö¥¼­-Ê~iî]ÏaÒÌ~¥jp‰µc¦f´ødjöOÚ½×LhÑtòÙƒÓ»§&‹â …ýG®Q R‡«å4÷«*áUsšç0p½ª›z¾£†ev×ÎÕWU±¡êö&k1–|$f¥'çÒNrv®ô#`hƒ£¸oËXì¯ÌÅ6†½È*Œ^ô4^ÛBwÓ,õ÷1!:í… DÎm ¶rlåÆ`xoCZÇÎÜKfÞ¡»[ºp‰>È—ªù¿Gb1 Ó´sY#Oæ­C/*“áÃa 3À8û¦v°ÄØ¡O`zóÌиfe6ÜwñqkÐâ¦ÕõW3‡²Ÿ,q­ Ý!̽·8g36ky:ã#‡/Vƒ÷,e>ô·xª}ü”á¸wžó¢óØ«‰!âßKt´!A¥Ú¥–<Á¶¦Õsæ°ÿW_~~c¢&/{OöA k¯ÊfQ—b ç÷ûô8yÌ÷ûšnæ†Ã¹kj{+Îåbþ#f›G“·Á·½²ê nçö@=@äÔdþÉtL®BTQ0¦ÆÇƒ©öé ê÷"³u€YîŬÂé1ƒ­õwÀ`y:gÑob¯Žz)³ À+ÍšhD™ã.gqùvdw=RLàX@µÔ؃\lÆÒ¾ÎÅ ú’Ïf€ÔY²EÞÞ3ꜘg°×m}š ŠÚÐx ,ï«=º$tÍ tvß-¦öç“»ïV ¢ 0£Ãë´ÅHçJŠõg¨-cåËaÞŽ¦î({æ»Ib¥aŒ0wU¶!÷X§|0Ù§—гi0s•ÀÈÄ]%{zDžQƒŒðÎV<w î4¸@nmŽ¥!eqÀðj ld?6ÿDÎÌgC%£æ ‡läÃ͵o·<ãÆ%m‚0®3P©°Ò`˜Õ°3+øÎ…A–R¬?]áôPÏ`Ü€UKm°¹`¦9sA-õÆ:iû5œ´kkº£•ºðWD}õd½˜uƒžjÏâ÷U¨ø1£{¸UrrQ\ýé°¬j5¯^"¬æÄ0wgÈSƒº‰‹‹u2Õ†´IÓ^¥Žm¥@Clª•ÂU ÚP&à M1ãœ:VŠ.kO:ÇŒ§£7­·²: yÄÜr!çP{ÇHws]¬^<%Ùvòȃ5BÆ” ŒÉÄÄxG¯Z•ñZ°k/NÛBÙÅ1‘/Pw 0¬³Š…ë4uk‰í5:îç™Ò±Y½„×ÊD©Øí\”ïD3ËäGx2_eÅ3ÖðsM“ŠÞ:àâ´37B·¿bR¤°a uÕç4ÝLbîÓ½ihÊŒkÙèdùRUyJ i»Ho¿£Ž+™Éiu´2—7Òª·è‘ ŠÕRí62º' ^crÈ‘ôóÎ¹ŠÆ&¼ÁP°f–@‘ ݸƒ!ÃlfdÞ´ƒúðÖ&‰jùÍÐåp;KUÔÚÚjmŸcn¹_»…tÞÆ¡©–вt=O‡ÒÝ›o½(\pˆuB “3i+Ó„l%^µ>!…ÈkdkÆÎÃÉ+Ì5Y„EœGeÇÒÛ¹©¹¯TØ ¯Ç´ÇÆÐ¸÷b‹œtYJœ'Á„ÍõjÙÈäÜ {ó UûÍí§»Bv{^JÿÔ–Žâ\+RM)¼| 2l£óR(¼XJp«óæÎ¿Ÿ­’øKIÚáÆH¿Æ|7ö×·3¡énÇ“z޾ÒyFŽ3Ô¼ßy“±+Ü˸/®W°(û™|Þ.œ:ÈPzô‹•å`¦ìy–÷K±¹Ýƒ‰éÛ£ÓÂ.°èxM±féYïVÜ·SŒ'¾Ÿq-ìê…‰ ¬7·ª%?cüefŠ7¡¼VU›H!A`†ZSçé¡\ÑÇJ…"E"»¾êÃL ‘,íõ¥ÜÝ=ò@|åFãS¹´r6¼ä¢Ç…hrˆY†J=’$å bºó‡@­3Ÿ”q]?prù2q±5…‰ªÁ “Çéea{òÀ.í<€’•viä(E`q?Õã4›tö¨ÿPDx¦o§ì2aên‡XL€Þy-˜"ÏËÄk§d²õB‰Æ×[¢½³-nÁz´®ì-ÒsŒCG4,eŽ(¥‹èÔØ^­>|ëÏ›j}I¦r`’ÍR»„@) àŽÍʶ 4Ö¢zÀAðSveÔH)ÉbWJn:Å  VZ*96iôHô«ÚâVÑÞº©FÐ!èlW¥Pd¦ÒÕrü7oÕ<Ða²mD{{ Cº¿-…°Õ1Y­.Hˆ¹ªô&sW1Hóø÷)ÖKØr0F°@¢ˆ>üÛjO*ç¶²#ã•ò Rp[D¤¯Ãjé}Cܹ5›ÛVô¡KÌ :¦mƒm`{HVè„=Bž˜k Ûppð—ëUz!<íó5M”²L½Ü¹mêhæÃùî7vâAwœS§eƒoÒ S:Z ÚðAóaëSqIØ¥µË1&PÔŸ“ÁjÂð¢Âx‹Â„ÀÊD“ÅâØŒÂ…0|s‚®¤äÊVŒºNK)gí1 eìž)gƒ M\£cÝ"Kò¶AÁP0×aU0iAL¡q •k»h+–Îì•›¶j]šÌæq ¸-é˜õQƒ°â†VÌ¢üŒ,dZq15f6¶P±bµ¤€¹•åò×ÌÐC4VûmåB—‘•èÈAšg8–V°KàTýû·JzŒbd:–{í=²ó‘ÆL@÷<[ ýÂô·BlòÔ,§õ™²´i›l­©ü~4âjD=¢àýiúÂq¾b³‚ u}öËl ¶'–黯yÔ(ÏèÔãѯi¸À{eªŸ²Eµ«5Òo0>\z“ÀjG<o'HmF9U«åquÜ*I ´Ûg¦z/Âèڼ䷲ Á€€U’¿Ø!Ñ:hgéÅE 69H³2™0ÔRrj{£¯Œs”q8ˆJ‹Vb¢-vœ}ò˜¬V«ùçE®þdE›)x)BKB׎«©Ò¦ãX›Uc(QžQo: + tï[n´õ4F±4×fÑ•Òä.xÓ«ÕÁ¤xY IÒ„Sq}úÌŒ„°-£©)Pj­닊åNÙÉlZ´rï€nw7PVM5v1c*üÛ”ú˜0ˆçQgÉ»~zÚ@˜¢Óo<„ÛÖ,Ù˜×ÑÚÖ `Ö™l€ÂéL Û«qãjøs§W?èïšÑUA¿ó\ù¼³HÏëð$°1oý þÏP²&ÿïÃÇf­„«¬hàãÑïì/þœ@ÉZXyÖ»)6øIJ=k¸¯!œ¾ ¯âG[m1«RSG0ƒ°Ñ:+×NgÚÔ6#V0¤x`xA›¸©unwZMã 0¤¦€Ô/X‹ SJH¶©˜XHÑo ‹|ãëµÀqÊ«½~gi2£xh~€íœ®—*Ô5GÛ vv„t%IâGÛó¾kÙi"&6ÚHy¬ŠÝæáüš6ßu6Ysy£4Å#uZÆ<‰c •r²T¶ÔãJ5×ÔŒ ’CUo^yØ“ÒOšOí§ž*)°ªUC‰Áƒyg NªT†CU‡àEú¢½CiiO€er]ÉŠ°EDt¹l8Ë*[h]PŸ½1Þ^©#O;Y•À®Ï€}bdeó0Á3+Ì#¡à†ÀQ„Ô^ÆeXÛ‘šiñ)ƒ­z¨"YŽ}£aY°wB-ˆé*.·bdn¹¡Åjˆ‚(jÓ-„ÚÈD•dC!4`ò9qiLawŠdRxEÚ§7Ì[îRi¼C†h7»ï’ˆ¸ò‚ÊݵäBœt´122¬Ql~å×é@þÿ!ƒòg÷ßÜõ ȃéç£ÀÆ*_®¢.Ç%?HŒÍêWЏkÎuaZó"kP NQ‹˜Sqˆ7WRB`vÉ@a&Žò~ý™EÖw}þŸçO¯x¹ÐZš¡v™‹¸PÑæWwšÚEÏ„OÉÅU6`0ŽPá/„«¾Ä èaŒÅ—˜"ª»X$÷F»K¨@'.¨Y¬a›P`‰+VÈ:˜QÜUßs§Ôçã¾ô¤Ñ¥1Z4ÁÛd®‚l-Vh—‘8æÂ”æŽRØ¥–ŠÆå!2ùh@²gÕÂûÚ†leNj`݉sXÂ5ÝS#»²…Í2¢Vöƒºè/Éh»¯)¯8rqÉP„‘aà\ GA¥ðsL!‹ÒžòƒG= §µ½³•|¦A@ïV,Œ¤4¦æô𡢤T,ª¤ù–u’Ã~i§€ç]TQ{% áÜSk~²4ýœd¤„ºŒú#ó2´¯Là弌÷÷¶‡QãÝÅ€iÃf öIp‡B÷N¯Z˜ #ÞU™aPkÙ1;JÕ0<•TLV‰·µŠ5O­Ú£åF•j¬h¡"ЩV^)³a­g>–Vx)7T#êœrŠ?t»Pp¥0mݽü6KgW\Æ#“×°î;ÐM¡1[‰£F{8£²:ŽÃ‚ؾ¶i¦l ”z>þ*GŠŸ*¶Ümü|(™`( VÉoʽB™Zj¶uݵ&Ì•îà=£]Í›ôÅÜNÙ,ï©Fuã[ÌW2(IDLã®5[8=%6íø•™ê°É²xTxk5-»„QÁx[h_B½‚¶öˆýW÷ÍÔïW¥ºäÂnwg Ýõ¬¨Ø4‰CF½¨  †²M¦Z&ÓkGuàï¡0µ̳Ã6½®««<‚œ‚?øížR ºÅʲ´2Éq·ªdAðïBþ²Ú§oœý6¦òÂ`ÁrC¶'ÒÎn§5 5"‘i/¬§4ç¾™\Zž:Oy÷=–œ€]ŽP€òº1„§Z0q°R…Ÿ ÊÌú.Ž ôµ1žß1÷÷QUxwLS'J]{s´X,Ö+âÛ¼ÙÈ‘ª‚ØØ\F€†= Ê3*ê\êBwmy”n Íï¾BÑ5ÓQKèBBßÕ±Ñ(ô¯jsR‚Ñ:IYêan°:5ÁJÛnµUÚOå(µè…Ù9Î%J xlñ„’#D‚M ê¤ñ’S±ËWsº25ñ*h&ZØ×YnÒ, « wPq8&·*ãÄb½3ùG9*\jÛ,“Ñ]$™(;¹–æ¥JÓÄ©KBÔ¡…a“X¨‡¢Àêí ¯C#hZ¸³/Z‹xíqÒÚ…™Iñ²0ˆN€ ¤¶H Ue‡©¿"‡ ¹H‘a 2jÇêßX¦6Еo* ˆË½$)Ü ŒMƒž{!¤‘1¡Õ^p[¢Ž #YßÒ僯SBß^uU«›I‘i¾»sÖ tTp'i¹ê¯„DQ,2â¦bvÖ9°'Td²W OäºÅ¹Ô™>ðC³Bz VyCý[·”"…œ”aÓ0 VbôÌy÷Š %Úº4u.º¹%ÉÝÈÄŽÓàäü–¶«›!I˜øBu –9Ks€ÁWª=¥íÉM¼µµA ;h`B•¤j€VxÎMaVYæ…]ܪ¡;Ï‚“K<"|ö·g %àžŒ×3Ñ f¾í ·i™ñ L3{+Pã^|.F,† £¬×Â8V5GÙÔ¼F-Eä`-é”E h°Ø^{“98f˜¹B|Ьc@€|51:XÌ 30;N5TkZ§Yzе^–û†àVz)„Œ‚Ã\â› Sc¼$ò×qÓD$ú‰ˆÉY+“¬—jÞ¸a[æ7Æ/-Ð`•˜‡Æâé}b\³I Óõ„áÇŸ—RmÝP?QÛ•ÆâäŸG&åb¦'Æùc\?´a×byÃTbØWäD²Ô  y ¢B,Ð  ª]µP ‰€z€dšŒÌ€²J6G¾|êQw*³:¤•r7ÈM³]¤šY¨× ‘È‘§BS‚p"ŒŸo¾tê6®3#€<­ -z)€íÑuGJÁ²\1O<Ò7A›BéÛj ¯nrlμ­`Þ-âÀ€b<ÊËQvun_,Rk%` ‘p& =þ0ò6ñƶuXð,mxa¾ü“ÊQ`Þà¶ÅÔ×ôìý¡Ú,•eyÙ¾lÏ8 Íx¦µ_ ÀÍ“ÖEÙ†?>•C@Œ—Übq}ðN<öãÆLðiLrBÕ Ò=ñËgSmÆfñV«=¢{vÌ„–zÑEî£NÿLÚÓš%`^µ7˜*C%°È¸ú*K¿M¦qM A/×ÓªÏã,áÖ—Tý™J,íÀ =0ð$HÐW¡¸¬Î+ãu“p™ÍaÓ M ¬Ö^™ƒílÅZ—'j\0—žeþ6.ª‡y›ý ®æ%ç^РP{›ò×®.΀÷vv)ξ+ÒTÂÌ7š¬Ú»v@Äøü$rü##L˜Þqg5/[æ~1êhD Z¤»³Yyê:ëí`ÙÉßFäôwtœÝ{·öß¶ó‚î´ˆ4IÅd3Z3EXO?¾t:PQS¢Œ¹<>:‚-JÁ[}œM‘­—èž\;!àcþ;—mõ%Á 7uˆ¸î‹•¶Ø¡ÍÎ!CÌÊ?µ“yÝ2š½@‹/.ø†bD¾¨áuº(£R+Oó5$Ú‰uºÚÓt²èRðæ`YÐA˜€úEÉŽ$æ&‹QaÁe±>_ZZ\»/›à„18ÖW€E€¨½ bù¼‘6]#úSŽ¢d Š( ¸CGV¨ŠnCÓY$+‡6ìãá:gž™ûŒ1`’ÎuùàÚ9Þ”ößüúÓ^1r%ÌfkðšO¥šßAy–á]T|“`x±˜µTÛøˆ|ÔœD« g¤ 7hwz¡PbØÀU±ì Ê Æ‚6í}@/~nÊÒÛ„`@NŠ­tgæá~w©Z…jN£Þ5Ñ‘šÍ•3\K­'Š+—·£tì™MkL­/Ñ—†Ñפb1ó(F–WˆH¼ã@ö*u4cÓ*¶úˆÐ²ÊTõ+:©ÏBÏöú~¿Œ½¦1ÐÛóúŒú§èœÂÕ™0·/’ïª!Ôã§ŠF­¸‰tØø•²´*fXŒ@‡htV «A9Z\hç¿[¬ú+G£»}{N·èÒý~(?¯–ÈQŽ}n©}³{8ë­±m¿­/rüL_ž€‘F½5ÊûNªŒ/¤~Íи ’ËMÖžôE`¤ cDö^<׃·]û+€Ý ¤*ãÃYÇF¢Õ’9TÎb; m*#_„ û7Ã¥i‹f¼[ƒ$hœ¦º«â¨ù‹ GÍ@2‰9û ë½0û[[´µ:*²9Q$>Ó“nP<åߣLH=8ËŠ¿¢ä¾2ç,°©?«]1f3ñlZ;›(ºî¥$`Ÿ¢Ç‘³I´@¨ yÌÐ Ä}°à)à@•*ZǤãÂ0z´âF48[ª:MS”EU¡uD³S2!Eyp›SÙA‘˜õ: *FýwBW…¼‡Š²Ø"×—Òù/GHhв­2ĉOÅ6”õ·è%+­¥šr‰¬cÈË3]\ªp u$T¹/eh{…yw5Ï!ÜÅiGØ$)ÃŽC‚¹ÎôL&æüW–ÕÇO0c*“$©C+s Â° 6£eùÄ ¬úî9¬? Þ¶ÑlQ‘å†G*ÍLªè6t/Á(Wg§!×ǽPsÊ^¦5p+.ŸD 7k‚4`Ó\6­¥©ž© é>,OÃírI6e ñ›P7sd3RT›¥Þ_d#ˆq©Ñ‰ª\Ú£kYÅ(µ$;ψtP¹•×­³Àê¶”¾¿ãcRBEÈ|o–´w2sÞÑÚ8ÃMêµ{Œõ(g¡ŸMQlË<‚@~8(jÅtU ‡…¨ 9Ý:z/»wS©z¸Ò‚Ì9 à‡“½¸¦VVfd‚)þÇ[i÷•<§Ô^á'õ^åÁ-oW ŠÑÍ»âìCʃÄQ\=ó=õ@d-ŽÔX¤|ïÇ\,=tJÑJR2à|q…åTµan‰1òbkÍEîü£Ÿ[N¬*b™ˆO 7)Oä€Üc3\Œ/cŠà¢Â)@.QϽúò—:Ì3^ÌïbâªLÒBÜöznNG¥èõ†ÛíK;odE¾™t,×ÏSXm¾¬‰Sâ*;–Ã49wª”2ZÔjbªq’œ´šµ­Xlm§»«.½É¹1,¶qT é/´¼Æþ?ŽÃS{ÝŒÎa„Óêxá$vÊLŽØœEæ]gDÞš–›-9´5m¼ºCDœdÌÙ ŽVb*ý:Þ‡ìIÐæð{ Ç;Sµ“ŽÄjÖ :†(°ØÊ#:6g_‡þã3RŒ+ ×Ìô«Ã€w¼°ZfÐûÑWZ<Ûê™ Ž)D=!ÃNU ¾yõ%±Üä/‹§ìvÑ©(’o…¬û.‰ìôö²ö&Û¾6žÞÁx¯l±äÄÔÁ¥@EoÏæÜ™ùð£DÀ)°>sêjlklÔꃮ~Þ“§â!¾t‚l–Ÿ øP.‘»â+zØ«JD³ºUªÝ9›y‚ Ypé6nP] \窥xC:Ïl: Dïûjùv‘?m²ÙkâP‡Éó„§3­TýV‚1d]ªx;sëuøP1U¡Zà‚²&Ax ®Œ`¶ÆÜ6$ÃXY§ACÿ æ×i¢o¸…Û@@]g¾TG50æ• ‘J|ôdf˜ÏP¼LОô«±ÔpG·Â»ˆ§R6ȇdfîVäFІò0*ʼԥõè¨C½ Bu&æº,à`p±w&DÃ+±dƒ®‹ax-Y’À©®þ¼m>%b,V탽¤k6]ÊD ¡Ô朊Óç'æç·vQçN”©¸!¸)> `8¸;áQt´(Äo|¢ Ö‘5«Üp¼õ­°@;„ÓE3ÝÆ~R…¸ÇÐo ¯iæfÀ²FRGäAg§«‰²“x[ò(£€è30Â¥°d«--Š"½¶£©øoƬ]·÷‹1µ·d×/ b"§‘=S®Ñ2âÔ+V€óAS§D/!Ou ’ÑtaTsØ£M[%•&vÜ£@D.hÇUÑ: µ˜² 1@²Ðvï%óˆ°Äî„"6÷Ð×S5-›pò2æ*mc¿0IJ{ 5I€mœø™*Wâ’փƦ¢–™™žN+D?égÁ‘% v™i‰eò|a«yƬŸ K‡®¬¡/Ìß~äš9nÞ€Ø$]XMy‰(.lq$ú¡‡ ¡:ú¹(¼ÓÔ ÕxÇ)Á´‡eÃ}ÄÎäôØÒhiS„qàu¡„fWG1Uow}]3°ì·¥ÉÉä՞Ĉ»YžJå—~ì$Ñ R[vˆ -&Éчë.¹å^&3)“ á.x;²{éM½wïe¥œ¿ݲPøfŽe $L¸|É„P ’•2WéZ$ÛOQžÜí`ÎÃÆ5 £6#eñŸ[ž'tå®èw•rqÒï–<-S%*:”ö1Å4gcÃâhï•Z§ËéÓš:ã9”Yµù‹^Æ,­£é¦ø†¦¸É´F%Rî©€ˆ#Q‡-f€¼ë™Êš2‡šÄz…j³õÖuLz4Üd4:%ÍjB+[55""b`.ÐÙ°„ÚšX4»½ÊYÁÍ««y²Ú:¦ØIðÂÁssuG –wg; ×,5h"Ã;|áûÑ¢"Ôn··–[Õ{º7a¨óœ\iH&('> ÿH³Wð—$¥°…CìH1{fàÙeŽ oW²‹=}LjðW`ɳO ÌÖl_Fµàe¢|¾Ñrù$­ÕrËß6Jýϲ“rþ2[þ(OUHP]b+5L’G_gH~Û“F„¯C(ÄM¥DMƒ%ÂIætÇ($ÀŒ!´Ûä.MO&<ª‡™¨h‰",Õ2‡I‘bØXï¥R-Uiw⬠ñÕtÛjùÌdYí ; ³â>è@j‚@-’ýjª™KÒ´;$;3²½¶°ÚKœ(L=%r%áZ¦ÏŽÁ¶\YëÛ(9]•L Cr,M ÔUãxž$¦·±CæXò€Vë/$(+j)6 ›úT Î<¸Iëaé‹kª)#’í&“T€ÎH§:OZ0Ô3‹šü¤¦ÝÑ,û(ÛLÀ'ãa°àÞ¾3ŠSUb®ºìP S·äprA ‡pð•Òž5” XÊðºp õÄÄo’©*“BT.™5DÁž¤v¦kH#SÓapL7vq4´YðO8§¶âM·È,ðyY+E,³äµƒq6Štšô*Ñ*äs•l'©ë2ª bXaÈ -g°¸2 Öb¬LtܡґtÏnˆ!’tÏJ4Ü„ÑBÏã‚ ƒ¶!èÒëÞÃÔŠU.@$P€N$À7Éúá€Ü¯À•†^î tÎ~ÂBP÷ÿ^Êš‹Ýo2‚Ûì³f†À“”ë9-i0‰ 0ÆÊGÆF+F[ó hSeÖ±—Èämï[@ Z`â_m&HV3ÖðtèðßLs,»kÊL=GFÒÀC¤öD ”Æ“8–ôÉ×jZYܼA‡óòÈÃÛ@5jÛÐÜmúTik©v—^üÔ•„d#V,éØûÐ3iËV)“Ø ¶̲öÂ0 }šžw{¯vq5´$³)N4@ ¸ïN3« ~@•·Ü¸—C[…¼ Íúg`@O9Û"·ªðï…s©C³JÌ·Í€YæÝÄ4ç öøˆ"›YÏCUš¼ÊÁb™Þª}AÞÓö_b‹Ýý±÷N’¨Yõ+ÉvÚhÍ€"8øâ4é°?bQzÉ¢žD¦­d¨åÊ[\šÎ¦< ÙöêO–eM.bxÆHµæ Jƒ0­¸)®dai]Üj²51â°Ò5aŽQÐf,‰Ç«œiÊéJ2#ëå‰ÔÒ bœÀ©LŠ cqpk¸xb ڊѨ5*Ów®j¤ðµItÐ¥»¬°âÓ&ó‚H`£¡šéáe¡O±^‚ˆä£Æ­*“¡©îMÈw³¢*¶ŠÐFžŽv¸b–0 }ÔîàrœÍJk˜-6ë+Äî…_½¿À¬qYÈú®oíß§tÅ \DÖç «Ãä} °ÃYùáu˜IwV&8bœÍFí*áPµÝªm‘zC‡kH‘ä|^¤MŒî5 yïgà‰jW×}ŒÂÔjVµÁ¸a+¹ƒLû1VºA ¸¿ªá$U7e{v™GbS" ¨*:•h].úÛx¿!vñ_©d/k`×Ê$îœ>Ð~t-·Õˆû4ÂØ #íõ*~¯n•¤R„¶+Ð 'àËŸ\:ætOxùF¦á¬bõ ¥ÜL¿³¿ñÚ:‚#’­E9d¸ÅIݲ."À áúŠ=d_ºËI‚‰¯—µïü=ØMzgœÕjâ\³ÜícO›\‘»:ô¨°IS9Ø[Òw‡„z圳ÂfÈ#J†W:Ô„ìN%sú¹ª]™²p”M,lª ŠÄñ)®ƒ‡VêÎlu‹ ´Êp½'| -K¶6+ 0¦8'$oðÃÂbX8›9;Ü\à˜{µa¿3¹QOšÈµÏXÓê>5Si,gJ¬nÛ<‰¨YáÐð,j V'1 6QSE+vÍåfSµÐJ|î7¢Y шô8-Qeˆ:áÀ©Õd']“ËÔÐ9yiÐÁÎ5rPn|âë.vd-—ZLg ŸŽ²¿.SúÕï)ÿ¶«®tíBÊ †ZuéGõyþáWî©F6¶ÅZ»-÷Ÿ`ÈU³´ê€š çR”­fŽ-š¯ZøXÒ0Ô• §/¸$½½)̲á–ˆ“L>JÞ6ÏV¸Ô,XDÉÛÛ tbÍ(ň-°ª¨„Úp~L4N½%jËæbÙT±eÌÅFJ×Jc$@”Ò@™ÍÎX¨vE]‘Z°bdÔØµa'"Xd^å.…±/óZ¢ÑjY5ÍW:o®+P]žq“%fT–ª ¼å’œ+„ðZF#Ze‰¨ƒ¤®±ažAÇ 3'Í8¹‰Ådɦ —«Ì@G¿Ü12@çTCÝpë, T`uæì®F2i©«ã¿™Úž›q‚âtíU,Z”³Õ Qu­³t‡P%]!•0T´M©kÔemRÚ²9atŒs%!Y¥V‚xç‰ ´·xX¶×aÙ>NØ2”ÆÎȶk²Aân ÖP¦ñ5H2efmFþ`i˜Ä¬$â&\å‰L%übüâÞ÷z¸ê/víG‡ËGbuzS6qVÊ’Ghøâxḕ>‹ 8ù’U“V\QÂE&Ä«”¿S*š©/E@·Õ9´~ïœãEuÓƒ 8ÛTP\Qk˜§b¹GÌŽbÎBiù bðæ]t‚RŽM\à {•j†º‡HÓ¨8!%…Y¡øjHÌkVrBŽãE!N&†yVéÄqñ•lH i°z.t†nØ@HDêB7W„. ½ŠÐ.¤®CÀ—Ñ.Y¥Ðk‹EÓ þÅ3§ˆEº µL®Ý›æB¿puqÙhÕº"ò@SÊé 7õd¶@Þ}üÌT)ùé…# º\5èQf´áìôÎ†ì •²`‡l ³_K">Í3fRš— B—RS»?VÚaÔž‹eŽ9uÃä":¥µÒý%­ê§N¬n†4†À°bnBYÔ¨Ù­]%ÚôÍãüú2PË"çAv%PÔ: ) 9EܪŒÉŽL[/$¤ŸHx§*n‹^*Äóò™ÂAƒ!šazÝŠO>k³Ÿ"ƒêž8+¹ 3Á `E.Á•ˆ’ÃÅ*Ÿ®œ¤Ôkž?ro•>²éÉ6C6E˜·]%'ó{hf+ ×'Yx2ŒµÒZ¹€«¦" )0-aÔêK5¬Z­Ù¹)2_JXýrWìÀ]o7Sê]¸ŠÖÔzè|ã„s8–§E¶ý×w÷Q :`¹H¿ŒÃä“ }Ɉƒ²X{¦‡Vb‘yeè’Hj9KAÒÈàXÐðúþ:ëÏæFŠÕErôóS‘þõ]•¤mÑi×j_“û(ŠÓ¥0åÓÑšÓÁkƒy OA`ÈRñ°dÚM‰Ôö IyåSI\yÅWB!K¾`NCÚJÜ"êb!¹O`9á°€*µHã>+Ì* u•«TÚ «¼‘jf­@]ïϹEŠET=ëÉìa@@|÷Fv/x礡’̳ó,5 ´èl½ºéLâÄb“(‹|ÐSñÇ¢ìhí»3,Œ_3Y×Úé7³^vË›P¡pmP×Õr‡ÙDS ô¢ª”!€ÈD¼‰7š©Å{'&7;iHÌé@–”ÌÞ¼§&£vÕ°ò*¹]ð•˜KVRi,A6ëGP²g8;¶ T¶ç)5û+`4ÒÀq)ªuÀiEnãSà‡ÒÎ&S ® DÀïãžátMÀ1Ç éœMÚƒ¾ºyÁdÝa\Œ6dI~áWÆBÃÞ“Â!5ô:S¾€Î‹ÝLì¼KxÏ~øÏ×PÚg×’=©”4îIrЪkbžJÕ¬W_m5–ÌÝõÊv¢q ¸ŒÖwP1G+wº°[È –|îqÔ/—`\M¹}çÛÄâÂŒ ‚I\{×*Õw#.‹_òÙšc•š¾ÜÎíà ÍoN*èÙ`I8’-§­¼Áf.³7ØðYÆjc<ØXçf¢¢íQÜC,*€Ë˜pé<¸EiÀ†’ƒû8æÅ>Ûp…Ö­£ÔYðþ‡¥Äãl¤ÐMF­‚ û$üSÕ‚ ¡h“®ÄmqÈ94‚aÔZ=L &£W9“1íM54NEF[<3¶0újPR¦MÛ¼ç ’ IOSp@#<¥&*–ì­Ì‘0ɘܠÐV­\LÅ1°¶Yˆ]}af’­ÓÕ‘¯«¦c+¦òEF#!pÕ„ü'Ñœ©ÁFš<.©¬¸¾Ì1§Ûa3ɸ¸’EÈQßØØ‡BHe§D)Ã!œ„I!\#R°ïÉY²L ³˜d*÷­F&°ìšÈ™aʸÖkž³ÎÔ5ñb`BC\Z7ޱFÎUIAIÀI7VåHeDäÙ†''¢F‚fôó'<š`+/f§ƒ$à FÁšª¬2( <$¹5€6‡ˆ yÊ8É„MyoÃè¿ ;iÇãþçi#@†ZÍŒ¡_8•ÉúÉßeûói!RýA¼€€±«NˆpŒÆFôŠ"€äUJæ*k!2⥂J2»A ª1>¨ÂY’*ç~ ³—$kº«¡à ¬3 ˆÀQ“ƒ¦9d¥«™"*WhÕ`äTr±aIa½d7—^ár‰o+–QÅ\±p4Ë|Wh&¶ƒÙqn<¸tßp7¨æÁEeV"|ÃAS“£ó)/€•ñn$Ð3j"ŒF‹ë]bç+=çŠÖ`ÐT§ Õ”é¤>.B)Ü5Oo#­’ûä¬zÞćҕ Ö‚UŠŠ- A7aX·Vr½;¹¦°—Ö'µ>k5S@Ohjs(Y—w°™‘òéBÈÁ!1ÂJÓ˜‚Ç$+ ?åÙ6ŒòIhÂÌ jG+’Þ©9l… Ršâì¼››CDa6«DñÍ׳²5Z¾H¦p)«6šÄ¢)Œº@¡¦;„Œ! q4ëEŽE\|êÖ5hC ÔôCÆ%ñØ»\Ó²ÜýtØ}ìlà0¶iZ47êô•6F9R’*|ñ|øÛ ãðSqù¬Ñ(•L™3=Œ4Ä»8&ž –,ÎT”üSÖ¸R¢·˜ÉÃÍØ9ýè .â`ý‹ªÌ0l8¡'´%çà¹FÒŠ¦ ”–ªJÊ+׊ã;O;v¬ …¤UY7H ‹¢³fá©H»W1À&±Aá¬á€†± kšEÐÝ@WðX= å«·K%†m² Ô¥<õÂÇ’`s d,Ê-J‘FIçÈÍÒk>1ÞÆja;*ÔhŠ:Š” ˆQcÁv«Éø.Žâh>ø„Ц|ÒÛà5‚–4´Ã×”˜ØjkñϳAq¶ÿŒ’l B[aZ†½æ´£#´;'ƒ’“fJ!îŸ5:IÈM4ÉñZ˜µHžÒHÑÜ»c/2£QZªÜk‰¢i(^*¬4 „˦þ:“¨«M‚ƒCó@ö2Œ‡ÜÛ´{$L(70¤‘ šXýMŽÑ 4?CšÍæN9p„Æ`¡á@6,ÀL'Îõ ídœmïR Ô{Õ6³œ$7öêíµ1Š%R”.¼IôËyÌ–R[(¼¨™™n]¾5”¶!F\…3‘€×;l²èÚQnõt yQœØ×›³¸ÕÖsB ¢0oŒcŒÌš™ãך?$ŽÄ—^&A¶¸˜‡FÿË,|ÇÁ ”s¦éóKy a _qdÆ å*Ë‚„S †õ_Òìõ^µ=ÂÜ1kI×…MÕgh&t¦§·PTÊ]9¶õé‡q›%y#}•ahb!¿9Yáèâ…„ ïA$ª; þ˜³f3B³C½?¤² :‹ï€;þ!©‡/R³;}lmõ¿+fÖKòÖ¾_É:ËÀý»Ú¦a‚wcÖÇâ~è!Ô†¾4b=p€L8-éC®0ìûK”ó -tŠÆc8H¿MÇu–I®*H‡W¢åÆZ:]>Ò³,$^j§#ßÄM4ç¢iª*a]áEIxG ¢æPƒänÊ­Äm*ƒ.vøº2Ì£þuʰÆÛå¦(öDióO*£=cÎA$¡ž³Ÿí2!–èÌDXݤ ¹Dm“fß«hèÀL4K†Ü +‚}Šg³Æ T&šEÇg’bû&)Ê[Q´ê-NõÖšljtœãCËk'Lw—»WÑ@æéGnÍÍOu„iÚ …¨^T(Õ'?0ðXùx&Ã]È ¬h2À~ä;6? ÂJå^9¼JÎã&b&ÓóG¸bOHˆ9‹Ÿ¿é6û‰¶(ØË%y«Ü–ºmªÜôŒÍVËD14Ù‚³Úš“Ì`î‹0c^"dD„™ˆhgQ‹VÍK©gqH¾žÒkkžkÑ™¢¤D•Hâ&yu,à€ÕëÃ++¿JùT„ž’‚‘E™È6q3TŒà×ËŠðsô eXá0èÅp€˜N˜¶HaÊÀ–*T´h¹i6ºæ¢³ Œ2à@€~0šš¿ÛìÏ1ëüY¯Kt‘íSÊ¿§ÏŽeåÈ\†ð:Œ)¸ô%:ê€ùv9£W0Cðžk'¶{0õÒP¥WíÄøõá1s‡H‡È•†@›,Uæn%µRI‡Wõ`*|Ð Ö9Òͪ (Øßñ^ÊéQš)™Ĥt$Π G\í§DR#K1%ÑRYáÄ,Q×áM#k–UV°”K–Ú^fûS0¦ž¹C}«€ÇUë¹h”,îÊ °Ãž…ÜÙ݈DÒrÊ€ŽŒ ) pPf8ù“£âHöׄ„¢¼¼Ëó:I%fîÙ(Âm_ ¤Þ¦»NLƒh¿6ì:„T!;SØ¥Hl7ùfϰhR¬!K>€ãE"!KKDèü¾ÚMåm›‹ è‡ÖV´ä æ·LA#ªS¥;®@a¿Mw1{שªû¨O@ÖAEU7 …•%KóO–#O¦ˆlJ$‘XŒ… ºùÄŠzœ ´Â¨ÆL£v‰Ú¹šŽù ;Dú#²=¨Ó AS£÷ç­8¨è_:t8åíÀ2ëší$%IÏ)¢T5Ù8*´ˆœM$É;LæiµÖEóSFÓMÒSYf­2ØmBÍWmÀ–mÔ¯†Ù³Q/¥µ £®Å&¤Žì®€Ýꑘáa 4°Kº× &ÜncCZ=˽Hh žz]´“€'LdÄX£BÝE¹T ‘ È}Â}‰ Fo’ãf-¬„«ó‘–sB­P@x¤¥lLó¦AXdû=s Ý$ç\XDLidyËÌPÈ„€0Íúi ú&œ¡Ô°W X‹ I(ƒ‰„°ó†];«lÚ¤%#IòÍBW^Q*;ò•áxÍm·c9Ç~YJ¬G„‚­0 Eˆå'u!P›F€;¡m*ô¦N²‚Í áeH_ß…øK=Ž)Ó\±~Á1ýãg,ÇMÄW¢,gMŠ9¡pZì•FSÅI‚Û¹¹¬ŠYˆx×皇À9G‹ë P€Ùfa S( c€€Ã5ú¦"Ýሀ;ãÚ¯&vúGÕ u‰3Ò‘4ËÜæS|ô‹/kœÜEñ×n|£2pVM&Ïx5 –³Èž‰RÏ€ÊD gõtO |)¢,)³©¿¼Íÿ ×LÁ¿ŒÞïí‚!—·œÉWg^IãË\Ö_¿ôê •×aü@üjù æ0èT ßÀ¯é{h}Ò3CHÙ|žñö"ûoñIFÀÚ}|+ñ:ÿ—½*³úyÇõÒÿÄšªé‡«©»wà9ª ¥ ÜÕn/‹•¿µc ÿìµXŠ'¥x¯ò¬°Õñn-ÔVZ‹-„zô›¥tÉQ>S•»ª ç’Á¤îùFAžáÄÇ"&“ß&h+'˜ÃâÎizxZßðÇÿwÜÞ¶Ž³úå7õ×¶__Ï4‘Îó €ž(á¦dҲøgMGt¹ÖÂTŒïw¥À$Ú\f #"œ «Ý#E—Ui° 7X…wO(ÆV¥„HmŒÊ•¸¸Í”™›ÙÙGŒÄ¢”)ÁÌ€ q•Þ¦\F3|FEꑳ±CK­ ¶N’¥y†f/"õTP BÖÑL€§&‡¢ç]ÄÔZc~Û‰›mR‡Teç±5©9ü &›`¬ujšþ:¤ŽI@ad¨«¡cÎÔu@ ×ÀÔYBlÏ{ …+†Ù×\:Ètì=NBˆ`ÁaX "H< -›e¾vLæIr…=bŒ]jГ/xF Hñ8Íô_q×…‘˜[0 ƒ}#ÅP±Öÿ¤î³$ÉN2ND؃£0êŠÜÃQ p£±22ź°é©HÙŠ ¸/+0ôÏ)Ëiq “åœIäTvu@{fÇxè©Îm4×£¤Ø—_]‡‘ÌÊM¸<%À¥¶­.ËÏÛ7 t`XIÆÙ fkm¼…Ä«öÝjx§b0n %›/r½h‚âœ8 ´[qK'R‚„š£€!äM»Vz4‚®åÐCŸ\…xæ ±²ÔÎK'i• c:Ú"©d /ne»tÓZIÙ«dFÈh‰ù¢Í·<Ú‘§a"Ê¢N=\'\£«Ú!!B2á´:g¡*\$!âº%ÐUŠ^˜B¾[’⨠š8”˜¢’‹Hi!Umï19’T>äЃ}I‘%dl z…6…²Û}ŽóäXƒ0 (ÉËËÒU“±Ö( 0Hg² Tmȇ:I¼ØÑ-(Ù‚-G¶Ì"m-m.i´Ùœb¡)\%Bˆ‚½†p€išèš F¡Ö øÂÒ5ã´Ð^A(_=Æ[ÕR}N\lò-‘• & ñ®‚-mÁÌ"ˆ¯©Ó渦‹ Sn¯Am↠â·'ºQ÷ >7½BVF“@ÉôEmAIQ“È}RœgŸRìQ~âgQ•O?ÿ½75|s‘g/Û¶Ãä–Â;to¯?iÇÛ¢, t•˜äȸéиy ©ÂþÇtàPƒ[Œl³Öa²ÔÎNÄ"ˆnÛÀa Ý€Ý ¨|夔”žxi[žÍÓ@%¦@R¹IëªLÀ2‚Ž *¸~P(¤‹Vxß]Û¤PWm žïBù8éʦ7Hc°T6IŒÎÞ2Öok¢v¡#­;c‹L žÁÑ&'SŒèËJ´™$PhÏ„ÐwÍ…8Ä;Ü&[XF@•­H+•LµŽF¦ÅˆIâ[Øl=iÖÆ!“ðh«f¹V-ÁÔ¨•Àk B^”ÎýMš¸¥:mfÏÉ9óРApPP£ÉÔ@Ëѹ†)Q²¢Š –Š”ÈV2#hn¸ç²± žE‹Â  EQm±©­RrÇË`+OëS&7FøÂŒbæÎƒLVÀ,À j$NX@Á8õQlà4,‚¯V„¥´ˆàcÏHKµg½Á«Ë¡!ëÚ°#¢Ñ,ð%ÔˆfÁ±àìéµ&àm—î Fô°Ç¾‰IXA{©„ ?Ì1ü¬UþÞC—¡Añ³n ‡ûg2á^® 诧g¨«ã}™¥4›0ÖÒQýÖ…Ôº^ ¦.\ù®ÅU‚@ª í© 9¼°k#’0OÄ(å_<‰†šaùMŽ:Ç£!Ãd4R ¥‘©¦…Ç}h ´Å.°3†°èÕAX¸1š[È#'U)ã,Ùõ£‰øß ‹S“ÆX‘(1¾YD–¸o‹Fq²¦² f8úìd5×IMúqR¼Às&ßg@d-D™K{Aº‹E UèµÃ©¡Ãâ‹ÏNµ*ˆ"5X3/µ~=@«\q 'å{‘È€€ )óFåTc$ÒÈ3éðœÐ¶q€aŸ$!GaøÄfu“j€g*ioЦyΙ0¹c:ûê(u$Ë©#Œ‡®èýJ”l)ósë&¢H¦cy/çu½j¥ÒÙm[ŠÅ•ÙCÍš¡ ô“$æ¶Eñ©k›’ 8ˆVø'i%Pƒ5¸Í¦5c s„ªN‚¡ =¤Y–áÝh[UvkÏE=Ûƒª¬Š8êŽpá—éü5—ù4]ã²—íý.ƒå5)¡­w¯Þ8-âà%»þ|š«pb€½]Hé–…FŽ(¯»Cr¬<‚TÛ£ å*Ø{vM0ZCe c#‡D¶6hQzÅ,rQUëb0ˆ@žø5·ŽXÎË—öØìñhV¤Un]~! IN‘¶7uÞîÐ⌻G”iSD]ñÕ~¹qpGÝqa`g>èìÊ„ðDi£ö«7PÕE(Œ•6|Ø¥Í'U Óe1JJ;¶BchãfÌB¡p<Ø£ƒ0SÅÛVèR[–²EM HÀ Ö€IÇDÃ5ÿ·d_Ñ_ËìEÇF ò.½l̼ çý¼˜‚¡¦ô܉ËAy.ç¥ßxËQ7ä-ö†d¤MÄ34ŽÝ. ¨„+¡ðšÂG¡89=lÃÃUøCK´ Z§¹Z„ùóÔ•êÊÑTYñåYªMšNÁt õk4\ñ® …ò갔Ġ^ü¤Rж”çç”ÓÈ åHÑ« ޵6ü¬Ë_ŒÕõ¸ÓÊ¿“§¶á»âX ÐŒŒŸô‘0Cã>£^º •A®FcÛï)Á˜\`v¯øüÏת+ ù9³~u#÷û‹÷jñÐêFQµ:†µ8Še^˜£?p´ 3`„²œ½Š ¡©§ ГìHm*Ü7)®…'Ûè…þ»ÁüŸJZˆï·åú˦<|¾$^/X_×3 ¨ö°ý—<çÍ=—.gÄ)³“ÇF¦ú¤×¦p°!Å5[câ CÍqXÉb^sFáÑ™ç;éç &†yä HB›E™Ô¡rZ Óı4UÐFl_$M%‰ä 0…¸xi´DŤaåÙžÕÓ‰TòyÂ!+i' âÈãà+iɲ•:|h:ìXQjƒ¤Ž²sç´±ìò"kÍWÖlUqÅ”\݄ꀵ‘rY Ž`3@QgûUÞÚEAŒZô/ êÕËBͰ º’¤•jÑ õ*uÊ áA^îÓÒÀ¦¦Ï·‘q†´#ƒA‚Àqc‰fÓ*ß`«ø+D “¾Âo3Ø>_y[ð É«Lvq ¿:Vd€NÇ_M5÷½µ:Ò#¢[¡¸ËªÄ.õSéʉIÐqÕ¬jÇ2i…&.T÷鯼”Z£|Ú +P6X‡ $P˜ BM0Èi€¦Qo zQ'A“à®ØHƒV>“‹7J›4Ló‘á`z$†Û`ˆpÉd³ä…ƒêÈcT O†Ú]¡êVPWãŸF:Dû‘Ð4Ëå ¾Í$¦Âë ? † h • ‡ŽkÑT6³ãHVaʵ^AÙlÌÃ7^¢Kb ƒð£=ÖFe—†PpìÒ ­‡ ]Ÿ$.„˜%§`B8iAYÇiÊ€{uŽà ‘L"p°T,Ußéùíœrö󵛑õ+…?·ð¯7š ×jîýÕ¢SzÿnRö¬|  K&6S'â Ê¢"ë³ ð±ódÅI‡UFŒðMIÑ÷VW*Xƪý4d¬Èˆ ΃U}ŠÍ”PãYEh{C j¤É>­sh"PÀ!Ïx|Njm…Ð ?ŒÐdùþâ—à Ïåü<þÈo/ØÙÞ´ÖþùžáÍv÷pÎn…Ýö¦ˆÄ¬x¶(Ò°fÛ‹âÀ{Cô+ævò³9þoIæ"ûûü<yg$ýåZOŠüã`‡3)>müù“º-§ÈZnÿ&5\ Ý0|´ˆBû³eŽi„„ÊJ:²6Ñ”†ƒkiÐ -=-IŽ ñÕ›2b¢ÒJÍõÔØU ö0ëoSsP¥Áb¢j÷,aÙxVA[°¤Å²®b/Hý)úIÓ¬©‚œ*à¶r†œsÏÔPöÉ$+³ éëkLø€^eêª-GØJr6™›ä²¼È&ÉB.×tíËÆé¤³UtÄߤ:þ´w3)Éá@‰³äØV¨„lFÖšL{0=1‘¿ñÓãmj.BM`œbC´-+T'V×¥ ¦^'ÌpáËMg>ñQN˜á%sar¿Í5DmÓX!q„¬r@Fâ‡û Ì,D¾ºEê€)ºRÈ©]™Y(²YκLŠE@jÝ¡@iÃ=|¹ 4Ÿ8Iº3Ó¢L F³ßqª-«]öÏk¨b2Éðó\aÔÔe¥¿`.¦ÌêH¿Z/Žû…0kÒ„Ì®–?¤MfL1©Äl†©" °ï¯ë.¹n‘lŒâ©ŠJÔé‹‚ÁAñRoË$ýëž“àÚRUW%7¯E‚ÙP:@«4Ú!W–±Ù†šp–’N¦âô6ó ,êÌúË:‰ˆ†Oc4£ª8ä¼{QuIÖ{tžj­ZÁVßr¢ (ç’AE ÒÂÜÃC¿<"í–µ¶¢PÖT<áJLÜhÔ[VcÌühNn¨zƒ%ßгÁ‰Oséë×K ]¿ uò,;ûynQ°!øâ ?ïú}|yû¤œaÖnÖ&Ä ì²™©€]™l¨¦ÅË ‰~üô+Šó4n*ŠÁ„ìºd Xi¯5=1EýV¡ÓU;9åÖTd Ò覚^`²<€ÃÊå’'èŽûDÝñùŒ¯õçóæ˜w†§•´_馟¸|´yAÁzu“øðîd=ÓÌTü†:¾Èuž¾4ʺÓð}µÒYVgFÌl¦Jº6ØÏoA²bM´ƒ›ØÝl¶¯*[ÌJ`Ô*ÎT²ˆ¥¶ê®Z–”‘:!õÜ«3µp¡ íœd¬HB¢2Sà8Æ ¶õ;$–†ZËâ ¢jFÐa2ÐäÖÄ ‡¾  G ©¾ q¼Ì³ÇËÒ"ü‹óLç½³þôwÅ*BwO‡G.hîOØç«p‹óeªó¨xö°Î°Ò¸3k4 $F‚2¢±@HÈ 8–ŒAÕ›A‹JÓ—ÙX…òÏÅ zOÔ_Ÿ¯!eŠcózkü&Ÿë|ºÇ…ÄpÃ%z†¼A·^‘PTmIðAÊŽürÕ<¹·÷ ¾w{ßùo“ËOªÅ¿1y#öûÚ¿¯) :¶®ónzÓF,¼­/$%I0ì3,üg±ï§Eî Øz <Ëû ¾õ…ë÷SÊ__ ³~½÷*ÿlBàʼn;W•?s~’’Ý ˜„_«Vš3ÛîÕ]„…”›®•È2ü_餿:2—ÆC¦(ƒ,‹P$#𼓍X5oÃgèàD³Â*V®Û„ R„!ÁW®4]O,Ø,Ѥ²åªÙ9!€§Hž1¤êŒBÑcI§L­*1 ‘Â&cà,}w±¤æ¨*9+N¸á·˜3Ó°šIÝ0È_–[™7qtKâ´Óùi$ø×oíÉÇŠXÞ€žÑò÷”ºjž¿—Oð¿dÔ9¤¦2çäNÀþ%•l¹ã‘-ËHÓÙ~܉e3/ÅB”œ ZaFÃY)(aÈ6JR8«€Ü‡#×û‹ † ²'Œ ¨4:³èßcùa‰…Ñ?cOçÅÍ@¹3C‡ÓÇû@ß 髬@0!ìµ7•(< —Då G™Úy Ϩb¬PòÀ8ÄQ¤àôŸ8ìÑ>cçß™WÔ½“7Ô‰r‰ñ?TlüAuÅ¥Z½lRloâæ¬¨œ´fhl2 (ä.ÒÃÎ"•¶ ”Dp¹ €ªy,ú-‡@N@j`2*ž'Õ¡÷Ã&¯:zç‹Ì“)úþÕAe[ûoÖwxspÔY:#CÛˆòzŽ‚ }€&šF1‘M-0 êó&(#øI ³j=û~?ÚßbµŠm¾hC|þ PŽÑyÛTÔ¢X:q×?*³f?×W+C‰BˆS1]*Í^ÊfΗhmzͯñs’›Î&[9•ú N®¦ô)Ï^ŸËÝñ|T½ŸóÛ^§?C˜JÏÔÒt Úä¯ÈþK—mÈ﮲V€¹~)3÷iFpŸ¯_ ƒaXƒ¾åiˆL[a8ÀhyNµâ†BfûM @Ø4–D܈ˆ¦¢ÛIêÞ’úÅÙ«A ŸPi¿xJùv3‚B3[öã:I_Ó©P ”¸DW4Hûp ™©4ÄO—(ƒÂ«Ë2)Œni|µ« íHÓ 2qå+4Ý%â}¢fÉ/Ôoa„'9ˆ„@n¥µÛEªsò8åÙ’ê Aóc®âŒ ù豉¢øB<1‘CUš B`e0ç®™ÄII*yÞ€SuÄtˆ±¦adÓ->ʼn`Cp?qÅYj‚yXç(¬6ÈAÕ n9æÄ‚*3DVÜry*ËvRŒ+‚ÄÓI.­€z)‰a5 °@ào¡[H(ç‘hÏXƒé›v"f’$ LNêlA̾n/ü¥jG×þ-ï§0}¡«ûçÎ/¹¸Œ:ÿþ(¿ÜaÖ²¤nS!L Ã-•Hà(xROuôX"Í™yŽX G†(›çÍø1gŸ¦0V­¥¾æû&=_C‰¿·OÍÓ?ü߱хÏ+‹sYVp&ªÐ}2g/iÁ |e‡3kÍp0§*/ 'DÌ5É¥'?Ïa}3¨$Eí Óµ1•Î!S”L–HÉšaäÕ5ÚÍ(G`æSU*´5F¦%ÒU'MŸ‘$AL“ uì:ÈὈöçÉLBÇ`)¢t ßoTv=µTãâ0m®™‘-1ê:ƒ 5E‹i2Ò;?°.Â0ÅÚ …GŒôçˆÔ––`Ã+¯«÷rb~6G¬œ=wê\SÌ=FÉ+?Ò::¼½Å~8§ ’ÞZÁ6_„’eß—ãô<Ÿíóþ絋îîET%¡€*r3¿¨ NR*±ý— îäÙ‡>ž©È¤>g{%´*388ÍÚðìÁ`Ò¬–輆¥¨7­Êð8?‘üŸÉúAïé~è‹\÷€¨'Ão7! é&œš Ñ“NQñýJÀaNb*„A †ÓÒ§†Ñ•­ZÂÄ­S]Î c*–P@!Ó£WÈ(Ê¢ Q;¨² ­¢éÀ"°¸T'À–¾}…JžÙ,ñÀxà/7ùJª=g‰:G0{Š´ mš5iàTKd) BfQîÏØž’’'1‚¢ä"wX3E‚¸ è€j ¼½ =ÝÝ2d¢È€oÅ, ž«#ÈÎ¥ò=WªhÕŠJrS„áöÒR 1ÞXÂZS$å*Ñè±Ûu%ãM"udÚ›˹óʼn 89{ŠjÌÖ9ä–fgN½ĶO\ÚcÄÁUŒWõ×^ƒØ.Jµo·O¿²mÔË졸)ÃV/Ùr:ýHæƒÔà„ „I«"ŵ@,‡1j¢=²æ;'jêÊvŽmæSÀ+§Ú:{`·l3»Ç×§™:V¢·o”´oKv†è‹¬Ÿ’8[ÊG‹üÓ0#.­ô¯Hñ~hß?Ù |„žÓò26¤ ÌÓ0Áú¾B&œ¿c`i…Td±U%€V²É4ÝQ‚ ƒ˜y F”†lZ¹ˆõÉ!Lˆj‹ÓhõQ·(BâNn½‰e X‰õз8¸çYýEÌ~ ‡¦*E¾ö¯ &”æcMeÔŸ˜Tƒùm¦j3zÀ†xÍ aY¦@KÂȃj=2óv€ýQgCrž’~}[/ç;„ú‡×?Êç‚Zê°Gü/ó€EŽ'7²€ÃäJX\Yà‚$g£Ùß?h+>¨®£!dÍ^Œ÷4ç¤ÜöŽÞÌ. Œú2¬œrŒä úbN 0œaĪô4°( őš½Õi”{6ˆ ¦¢Ü(‘/Mù‰ Wd±ÊÍ!ÎAg”>‚i1”zzͳ("Xan"1 u¤'!;#IXqÍxªkác€]]$°õ#…͵”§AŠæ@§€ “¢ë-P¤v,1!=QbÛ“BUDZûTî›Â²D_~éK>ò³`{˜cŸîN:]¼¬OÈe|cðþõ†Â}H½éÓD²ªéD¸&d—‘ØíR-pN™?Ù0P\JsB+&MaMÔv%ú-„ÙzøùY/lÇw ôñÙH—QLÓÊ ªûþb½]ÛÆ+„ ëvTO•…Й •6*¯Ìž\Nˆ-×Ñè°’3…oŠå÷#ô?¡c »ø?Bÿ¿°rvú…Ò¯(Nž·¹@Éé5pš":àÝ{}ÇU$•œ®“Jé'/Íx\9É©OtŽœóÐÆÅO[õˆÿz¥ºŒ ÇQк±dŸñž¡¢áwø°ãÞ?ãÏe°S!_ÊëÆb»¸ |Ä B¹R¶Ì® ›¬¸=[C5Þn} fp¡ XjCHa“ÈV• …2n-~Qƒfvα7T}Žš,39ã´Œ¥”ؤo¦A­3lÜÞÓ±Ñ*eú´[g¶Z„U¾üÖÆ:d€7ˆ±ˆ—$Ѝ•Ó.*¢à+¨*Ë0 y÷ßÅNH rt18d\‹Õê$:5¨zÑ?„r0Ð J¤×”£g‚J²š#®é™8 íUì ~Ó‡F•#—@+êM:³'#£ßª@Ë8eœ}øÆ@€W‚%f%„`iÈ¡¡+¬m„¾øiX¨Ò¯èÊWͼ­O‰ooÑâS”õËÚ¾áÏí9çØHç¨àlˆå!‰É!Àž(O]L8ì1®zˆ½5Ó£`u5; y.ér’y¶Ž¡þ´áÔj €Hu_„©Óe¥B•)A tx©{*P(—_wֱēümè’À9¯†D^>û3¯‹wüœoãôÎOÑ;4:NM@i÷Û±„ì&±­…º­„H˜ò¾RÄ9eâÆª$M_N]Ò°è-\Âþ&¼ÜúN˜åûSý_k¼™ÀšußÜøUðоmþƒ|ÏÈ ®qä@$t›iÒtãÌ·Eÿ•÷Ÿ”¥öþŸö‡œS ñéæ]3ÁPEÅWn¡´ %úËaŽÍS%4ºÌuÍd#I’‰0Jˆ¢H±,;’™ÅØnå/ïdn"Ž›u ”õ»† ,òÃ#v¨î÷²:Ç}äO&Â7mìéÑ"’6™&|ôä-¥¸â‚ðŽduYr²i<1š],ß»pEN€Öà;"TAL˜Rw§‘cšçÓMv#}*³Ÿœ~°«”z}?Þòn—ŽEÚ¢z (1R;3=vwËYý6C]öDo0´·Ý–A„a]7ü§¤„£jŽ¥UæakB¯fY•iùÏ>ª£iL5Æ‘&;Œád¢cY£sQ8^£AÔ“´k4D׿-³ÝœÙª,9æÞ€ñÎP«ÅXWä›*ýe&:Le¶z†ÃìÔþÏwø|eô¨.#SvOò·b®ºyWž,4X nÞ\¬ tÊ_É qd>{£¦9Ò–Û~½JÖ,p£/ŽÞ!ל?r¿?ì§\<¥Ó ®'âµ>üâx#5ªþü(ìµù»a"Ñ×pn»FŸ*×–˜zñÅ}´J§HD ˜!h¼’¨Êø5=Ö™âa·#þ^uL<*¨,=¹~fxÂ#Ì(ÁI… àv€ÖÉE6X‹–Œ¯¨¨±tw‰DÈ}Bç0»NÂ_ä²GVM4ë_¬w¥×œF1A9žÖ£' œº=t_å–mÀ[ý §ß.cÕûò·ët›@úÓnï‡íR[2ßóݶ)Õþ2]w1 AÌÙIG ú„:aJåUs ×ó¡e-û~Þ¬Ö_Ã×33În5«ýÃ(í!fiA qΙA®1=†SRõƒõÆèJ8IQeæh6lœ`®Ñæ a“Ñ´ßH Ö?âÎþ‰Ðð_á«7 ôêÓßÞÀÓçF«›½ùím t~^QöˆñŒ šœ…o½Ð%TZ¥Î\Ïäæ™š?!ÿh’‰ Iü‚")zæÿ|þ™gŸ·ã¾½[[›BÖí+ÂÊ9žhÔL“[*Ë9æ>t§»nÎhrD­Öñç*“ûÝ´“^DCPm$°yòU s¿_—ìeÏãØGÅ’eÈyG~l–úhåþÇ,÷reúxø®ðíY³°WúÇ“Øj—«5˜1‘Õœk”Ü~O¶!Õ‘ÀY ÷«9bGn\L̳#çt+AÿãrïðþR{óØüDþ±¥¾íãHàÎÏhûŸ§ùzhaöÁ+ú<_úÊÒ/ñÿiÓ¡qÕ«_Õúã._?MWÓqü9 l§7À|õçª9ÿI& ¼cW¾G„·æ®|˜÷;MqØ?³ŽcZÚ¨“øx€?ü^gÛøù8Ýâ×!—|è†O Îÿ Ö+ýçU\½6äVøå|ºùOø—\–¼z^«Çñ-fÔ[Ídwt@ÍA¤Fþ°’ï)îßPö°ì¿–€'5©WLܤ .ÚEb2Y£Ø¬ksÞyÅ:3“0%f]IgÄœ…‡ù¶éHcë|R_´ÿX4§w†ƒ'7þ™áÚdQgv¦ëòñüŸm—’"å½þZœ÷³?†âú/ÝpظµÙöò5ë7ü¼ÿÕ9*݈՛*ŸB3 b}y-%V{™g/*Y¨ \qŠR%†W‹+c—‚6AŠôïâúvÖxôÿáÿôD×RRÎSeóEÎýÒv)-¹ê•Xðˆ ¡‚‰ä·hÍÆ“ Ûá(@wjâ°öýy¿Ì0·,_´é¡ó„=n6öÏ@Ñßo´ƒ±ä1®dÄÀ.ûæ)2Û;P«¬'%Yw²¢ÁWÀ"¢Ó áåRù "À…XI -(¼‰-æ ¸¥ ‡ |ÅDC©ö×aÄ„cµQ%^XÖ…|íÞŒ¡Å Š­ L¥2T%:ʤ8"„a,²pT˜úå 2”¬µ3Øqª³O‚‘âúóNí Ý‘©“—ƒ= ‹ EJ1Ó|”0™Ø‰AÖv^ùxÃ…ž$zL ÝÕO-}àñ®÷“Œ™ß2àLÀÙW¹$<@19] V›aªˆÉ‰-B/ªRšj±Þ 6R%*–BúÚ“vB,Ø1_͆ ÂÑX tªšùºl3ÿ^ˆ,ðI„4/žê–V%*Gžùç +Œ’ˆé3A §–Ì.H ˆ˜HŽk>Š  T}HÐ<` É݈ÒÔ€±…½}Fßn^!Æ‹+Kžƒ¨fhMF:–#hJñ_äÙUñ’ªËøÿ,·Ùg Ƹ,ÃPÃɨþ ­&é‚dJºÒ ‹uQóÂT† ¨ ¬¢‘ÄSƒLäÙ¯¼ùSÍ8rd5‘Ë,ûgÁu‘¤4¢’ØXâ$·ÊXrAˆ3¬`HÉŒûç~ˆwpë_`üèðeOy•¹–Ož~€GöBjô‡ßCøÁÉø±2˜è!$#¯>J€†ºZ4w•¤@ ¡Œ0[¬Ú-¸LHÕpCÁ°yQCk8{Q•’"q‹Q@êO¶oh"Û&je60_¸ª>˜ Ýq„¢™s°/1’&é’×¢ÎO‚ø}š­ÅFxAéù ŽðŠ´âfY$|¼k§[}!8¾Áøn‚G.檴økaLÝR/­:$(çð. »ÖͦF²U€,¶'ËÂ!Í+ïêý.y0â *¢²žèÀ6c‚Û”Cg@$(ë„ÂJ@ I…Å£A >ˆ¦·>pG3è¢î^–•“`šYÃCH¨³¹=fUUb j!]U”ü,¾•R‡‚ÁJy‹ŒSy’‘H†d^[F0Ï=’ÅœZÅMs7íñû#ð«N¿¶Xúƒä*÷P>½ý+‡eþêc¾Ñ}–\OûjŒLÓL¢h €êèï:8…¼á°ZŠú Ïh "O”³N! N™&»2KŒtsP–d¥l[f†I© ¡´B‚1Ž „ `Ê2è&ˆôõ8³Î.¸Ç<‰4P=FJ7È4rÅœ÷!çœíîɈ¥˜š ò7JⲺ)‚Œë°ÝF×EZªh@u¥@÷Hañj^TÆ@ø²m ¼ö!Í'Ïì!œwLŸò÷%Šÿ6sÌ<ÿœø‰¿n?»yÛßÍ9B,ãûh’ƒýS>Úv5GÜÛ—Zy]];·)þ‚_¯úÈ~ÇZɦ‡EÍ]šdã\¹U`6„&&H0ŽD‘¦<ÃʉðÊòÓ3xU ÚHÃOF‡ÞEéÏ»V‡³DvÆ4À1£<]å&6¨×Ÿ-“ˆ11žÈ¹ú=ão5ˢʼnew}Þš¥‹¹/¼Z%EPs¾¨+é“÷ýþ ¢ãÂ-šiàìë™Û“K7| ˆ¦[奯zÿiôäåõþPë+L¶ÒHF¤ás0%JáîßÌðg¤ Ói£‹:(’ƒBbìÓ!£ûŤ(\ü¼á§ƒ!¾ÝqP;ò&¥Aê:‹Ëo¦¿Øè#ÀâР4"ŸõØåÏү؊ 6Ÿ0ögóáúÔ† #öˆ2ó=åì>õ¶üÿºèÿ¬"oÞ³øÖÜzõ ä°<ã‚™_h\çÌ‘[ ƒ~$¡ÔmJ-¡NTê úþš:ò§È=nÿñc·çæ´z~Ck]`j Š|ãUU³C€„ç—Rã`A)”ÊM-Ña‘S0ÜWQ³é­lÙQ õèì‡6ÊÁDÁHh¢ƒUí˜Zü ôú@˜Œ JrÕ¬'N]”ì}pògÚ5/¿*ƒ_³¡“C}Üüåjì}~o°%âU,‹¸Œ¸ãh¹`N ¹îBó èdO‰öHg}ÇSI*Æ™,(0ÙIÄ5uÒ…ÊÛÀ©VU™ž¤St¾Íí̵´ØÆ™4Î\òX‹`‚Á%÷Ô‰³\ apJ”¤ólîç>8öƒ’º§(P$_À<§ì`Ì4þ\Ѷ‹4§ãóò«ö9)W)­·®9h2[–Gú’ø Dôº¾^®³‡U ‡Õüyv“¸íRÎYŒ<±Ëíó(CŸÓÏò³Œò#¯ø]ëM½Ù©‡›¿Ï?g^.âe7"bÍrþQ€šÏøBû³Ëöôþg«ëù“Í2À<þ¿L~Cc)<|´“‹Ú®³rNÊÃÑÎ"¡ÚÜCcý€ç¹UÁ5TvúÚèj6 ÿ£ÕÎú§VüIW¶%}ûæ. Ð&À^*×÷džaÕJH'^pŠÆ  a¡¯H V¥Êe ˆpPúcöe÷ü<çú­ëúz‘m-Ñü¯…¡UNé㟮BwÄ`gt{Ñ&°ÉÚ÷‡0¯~šd úd±]¨r²çÍ;ÿçZÂÕ1®e?¸½Ž­R‡$_#‰i:t§Ûúåìv£€úp°ºe÷…iÔ$R‰•-ž+Elø`¡4 ®Jw2, œ/Æš3Ó)VÖ±xN᢮o^_k>Îÿ¯Ìñpäg¿j©I›oTá-¶d |:C'ñ$ó˜ˆüÿŸìŽ— GôOŸÚÿÖ¿·ßÊþcO¸$V?«14îí*Q3°9 Z l• –A6ô¬(T!¤ ŽWMà%( ÒÏ}Qô*Ã>†Y²%à‚SB%¸Ó#ŠìHÛd­˜ ]®’ÈÖ´ïÆ š5Ëc ¬™W¥GoÝ…1ù§ñ^ð˜þ”§—60á{—éë D)koÕ?õ´I—Pw%_'˜^ýöèm¨ 8QŠ"\—m ¦lR*#*`ÒÃ0)úP4—, iÊ/ŽÊ–ëß-«õ”tè†'vø|vÍ“1øövÀWÎF‡— ƒ»HdÖgû¿“'ù0lj÷£¾düKAß’h¹5ü%¢÷ÕO[Ç¡Õ[•ž› ¦~Uq=ú ]}þ¿¿X3ª3»ç¡ý²úh"*UU˜{úë*v³¦ByœS¼qÑB™ø†}vÅ„ƒ@ ÊË:KS˜ 5¢.B¹D2 q¯„Ë%ýâÜ-¥!?hnš»Í§›BÛæ‚ŠmçòȘ£p‹¢o…(ûÔdòæ^•÷®ºõ=´Z3H±nå=©Wæ)è*ëvðûr"ÀkÓû,6mµ!¢€ÖÓÌ]Ã`S£™W¢*&ÎeþÕ…º¥lâÞÔ†Dq/ÿ#ο* Ò›ºø–‚‡a¬ž ÖyÍœœ'+¨cB<l‘Ç|. vKfY±0Û Î"ÙÞÞ~vž;#ß·ÅCçQÆ×à-~¢:¼‘ïï㹿YJ¤ ¸Áäà@q‚»m–Ä8†ªºÔ\1Ü!ø&5¸ÀeBà?(ßäzðç«XQn3P¶ FÊ[2‘Y‘4.át³4"Sp80 ÖOub,àS³t–ª»z–©C!HWz‚„‹8Œ§¬1ÍÀ†EFä :"4#Ÿ@jÞ>ö¹#~SKOŸãßõçT™ÅA—ãu¹^Üû†Сí†ì[ÎámÅûþþ`"©ÃÒºüÏ——’´¯èÿ¯ÈSt¹—tÑ¡uçíð¹¸üËû˜Tû²Bï!qÇŠŸ4|ÐKñFwxòœv€=&™ž~f«~¥žRŒ c‡®A ­ÊúSß¿•ï±÷–¡þqÌÞZ Nòç;;bTD–dˆ H³ÓDÓaFRöCm —Aœ{’#ˆ˜Jͺ¾ìæµßæÿÑ—™X;¯¬+Î¾ÂÆ}Û]lÁ“í¯ƒCù]E±¡Ž¤x{+§¹ñÇ!´¿_–û´)P9q^XMü3¶÷Û ÍÄ)yøÀ޾¿Ûè]ïôå8,ÌÌÏ%ï]•Ÿ)'“jþAxG‹¨®,cÓ·{V¥ý™¬;‹’/bcþ1‡¼’b¬ONCçÍÁÍ0ŠDF/€ªE/õ—Ù#Þ½Њ÷üÚ>ÉHÁÌ]Äah'… ±ÿ#KYpÐDcðŠH¸asÒ_Ë650Z½‡è4û¬ÀmRÍÄ f`GÝÎÇ÷ÈÓXÇ”ïþË’• úÝ“[cÛ™§Ã€Lû^Χ”¶­ªXòBUHçÄûïnɧùy^©¢&Nµ§(™°I£ÁcÝÿn|©Uô={j~¿KP&øñ›ähαÍÏrÈýįÉÛvÓ3›Œ(áš_œ­×·%0ó„]Îó ­Yan䨚«èŠ¥Cñ¯Yzv¥·™Ì¼Þ¿Žân‡t~ÿ>]CÜ"ÆíÊñ¼àS$ßbqá, ”Š1ºSµ,eÕÙ Ræ1>L²[×EŸž‘ÏiS¢ŒõA(§P! Øâ5F§AlÈ·ŸªE ¬°òçÝÿµCE†gN–yÏýMl’.¸ÍÇiûj5öÝ+ë·&vùà¤Æ÷rhNxåfj¦S™©ÿœ†žl¢Döhà{t\%-žd &âü<ì!Ü’,²Jó1Æ…Ô'î]¡›AÚ] Vù/â.Éù*iïT#Ὼ]‚­<°‚¯û årNç7€Ý;þݵ¡b……Sçã¶¾PX© Æsê•õ벿a µZ¿ÌøÒô‡ï¿ú¿dvïC&î?r´Ñ¥gûý7{ v ùÄ߯Z! ©å÷^€j?˜øä£@¸éŸŸŠÿ¥ð€{^\Ÿ/t—ßã‘ç«×ü…ª¦ÂøýšŸÁß½Åï߈.Nš˜¡`þ¾ûæØ›.`ðgX#Wq`§úüzû‰»n#ëçAÎaýU€“oË×Ð,¥cF€Ÿ“ìþ#˜º³4¯NiÈ#£ ,c‰A„)ógò„ó*´)-[UZæEPÅj‰'r‚4ùü Î'J. +ª¥5T Û • ®± –uÚÕI-'fZ\„±b|§öáhþNŒóRyÇ©¾Edu9y <¿ªM2îÏĠ¯ø‘ˆ/¹“/½{Å›+t Ú/¶‚ûšTzþr3´±a×,MÇ©;7Û²tâä€ÿ©¯çGB:‹ä.¼Gq#e4±|.ˆOMvÔµòô´®{¹a*‡oçËú<«ÐOõçs~ÿ«©g%h ñìÿ¯Ó޼ÝAœû¼NëÛûèæÏÌž ~Ä1Rþß2ïº!CÇøÝ±ÖAãï`½•°Ã4‹#®MW^¾™”Õ—åÿÅÛ F@þŒr8&±²~âàto |_=Ä?öÍéü°°UëgæWÉ5ûô‹.šO4Üæ ]ñ L`NFV¿i´õ…·ÿ ©×^ô M‡¨à(†˜Ÿâá_ŠšÖD…ê¡0a`d,ã8BK$vy­ã¶€Ö³^ËǤk—™Ã—ö_?B  dº( õýÖröûÝJþ+¾Â%rÓûhØ&]r å*˜—(°¾ê °&Ë ¿«7øï—ß Çòútôû½éd?;rЦiý¨eÊY’»X5d6‹£<Ô‚„c=ítPî4+ÆíBa °Í™‹M‘Rp`ûã„áF’ÑCh„«•>+“²l°Ši™F8˜NÎnuS¤FtsÓ(Ñhƒ¼RëÏE8`ÂÔØ¿‡‚ŒÀ O‚­À!A¿ÉÄÚc­›2å“óúÅ[U×úòoðö7@qœ,L›¸öñ‰“W¬—ùËŸR2!Û‘7E~´Ãë/z–mA2åá*S‹ËÂLI5&0N# »ì×H·~*›¦¾Òú|3ýV<øGÆì¾R-÷ž¡ŽÍ0r–CØ~Á"J7æÊ‹4ö›Ú†zeÓ¡ï°3pÐV!“å1Yô¿ gñ·¨w~ÿK^âë÷nO$èùý¿ü‚jüEì,˜¨pé lï®Î@¶æQ«ûœ¯ÒÐÍ¡?GëŒÀ5¿‘Kn?‹~Õ¶ϰÀ‚2í8‚õžÑ6ø7ªÓ­FÌä¡~š ¯d!¦™DPW‚ò2³~xù!7G¾ãr‡ÂJŽÕA>Ôùûü;£äŽxþ/3BžÓÊ~ŽËÕ¾Ígl’du@»›“û@}'?ÑYÅ\BÖý ¦ŒÆsý“:È ›ËÊ«=´ÀòBåû 9ð?"BþsdO®Ó¨ü>‰,9¿k_ó Úd¼eo×Z¿$©ÏZ3['±:ôj2ýCo ôöúmàš;{=BC‘¿…]ÐðO Zÿq¢=H{~O¯–‰7øx\Ú<ÛQ“ν¿VjÖðcÖ9yVC  ùHŽ‹m?¾£A´ý|òk)*>ÝÀe­‡G·Áƒ­Ñ]¨£~y š`*—7ý7kÏ=BÉ! Í;BÉEr‘Y¡˜c)Ž$m(A‡ª%¸#ê+Z¡UÜ2Ñò4Ð2ôŸšEnÁ ù-âýFM|ýø£ Ôo?¥Š¢Žˆ²‰ÍÛüÞGËÓ<úäf‹ÛRU€úÜÑ¢zÓ˜îù"0^ÆÓò³ w SǪÔNXªÔ+/^AGG…9ɾk‡·¦©™ó*OÙßn{¨G€taAù1ü›ÇkçgÂmÆSyjß,lš)] ±LUôCÿ–ÿãÀ §—m|»Oä$óÝ{Ûd†áí|‹ÁM²ÎRIÿÝD­9ÆÉ´šÃ?¯Ÿm‚CTÙ»™ ;ʉ&ÀM(AYÌx‘¤qóœn>ÁDÿ¢ô]… :cŸu3íºe³¤¿«­öwU*`Ðe9 þ{ÉøH>=¨ÇüV ÿ(ò¢ÿ‡·{{w 6ëöòeC–Á®æô*aÔYyS¢×¿Gßã®dé¿{üŽÉœ.‡Ræ q:à–r;<üeæþdN¡cw~HXRzùZN'wG(»ö†R#Óµ|~-“u˜L½IaŽs4Q/êø?zåhI»î ?f°@öv=}Ñ)’Ps°KÏ8ÕÇfr”FIð¢'æ;ª±ÿ¿‹õC²´= áÝfCỳ`åüFÂqËàû×Ýkz,0ðÆ J¤ Æå9×xÄqýeÖ4ÅxT–&Y€ßaLMûÈQ#”õ tqe–®z3æÈR¼ôèc°‘ è}ÂÉz.¶*l½gö­×k#RîÛšf3òô*TÖ5¬ÿgWƒa4€\ÊRgã?„­’6ÐY¢1+A—èwưÉ6XQq‚áðøoxû‰ëï?kCS°ÇõvWÙGqÈñŽÿú'¬ÅÝÝ»õû‘×#v!ÿà£Ìþ]_ždéás"ÿ>ô^Àu npäµü·’5Ý!#®OÎaÿù„R¢> u-çjàÝéî0tµù2Ç>w8låj\›?ƼÿÖÎÊú  \6¾ºåÏY~îN_Š (EÚöq=ŽžÈÒ_Æóh¥}ÙääqÿC‰Ïïé—tc¼"tdz7mþq[Ú?s=!8þ¾^Yáf¹Ä[Blþ‚Ï Òú“à‹©Ÿ‰Ìð¤?ôF®ðV,4ò»@[@) bØñœ5”`‚ˆ[õÕaÖÙÒásðOGpÇ=é3Ë/²Öuƒú\H{·ˆ½·¶DvkwCu94kD'*§ô!4FGµâ‚Á·«+-¿Ž]<¥FÈ|à¡ešúQä–«“u½á†ÄÐΛ“ûLâÄWš·ËÔy%ȧ/ ¬_Ĺ«âLS:î?ãÑ”îluCÑhœ1Ý’F¦ù^`èÏ`ÇÒß>ýãqŒ ¿[îèÝ¡û¡ñÊúƒ;vIMŒ™ÿpªåð Ÿ‘¼§ç$’i¨¢¼ø iMÞäBÝÔ`•Útù[>Åôúó¡éH!ýX_¸ÿ¬¡‡èU4 …¸ÜLýWÀÒóS(¦øâÃûÖ}œ_}»ëľþ{¨õõˆyî4KkÎs FÊ* 5#È•V‹ Þq.¦3¬lTÕšÝJ×€üЯ~nô9Pfpi‚<,È™é<ê.ßß5û½£ùÑÀ™zÓ}¶MüÞùh¾m†QÓß÷%2ÍŽ€ÈÀÛöJÐé9ZÉãýÖÜEÆŒ'>?€–B«ãûùägŸgE¬À7ø¥A„rICÉ6B(?’K蜚Á˜%ˆýZfžÝZ3iš=ôE2 “4›$&‰×4vvhÌPn;à±TÐC¤%¦‚â -A$D‡ —Xã¡A›^¼ [iå™8lîãVS¸  cžÐâm¼aLÒ³X^I9¾üÓ¡[¨S¿Ã©eó˜n>]…~MÔ·NdCÚS§øC ¶ByygŸÑg_2k©‡úÄ”´â͉M¿4ü¹XÓúŠ.]¬á$ìW™ƒô/"u¸;§‘Ó®:ðq…°­lêçêÜ8ïôO·M¤ìßÒÛ×eŒMzôüÿr-ê¬+ŸÜü´2¸Nü¡. r8=%ÝÆ¥ÊU[žÒ[e]ýs ¯×¬Ž¯ß€”Ù ¹"н¹hˆs}}âK¶ƒÄ¢x&ü/‡—LÛWîäÒÂÓ箲T¼†'»ÂýytTe#oò"Ù_o{å ,Œâ‡™ËÁä–^Æôê‡rÉeÌf™Lq_Ç¡Ú!cV«üOð¿,ùËIWöŸ¾‚Ç÷×Àz¿µE$;%I=î@t&Ñ„2¢` êGÑ3ò:yØ^ÜÉ¿^º©9²ÆmİȦÓ'變D|µ“ÐÝÊ—óýf‡“ÿ©Kúí´ôgYqÓ¾1š&ÎNšøÍqƒIõWûȘ¼l TYJ_Ô"­þÐö1EÐ%þôV«¨˜[a£s}…Æ7]íÄ> [¹Ûõꮎõ†¼r@ãÆûóòk¾ÅcÞ'ÿ\”L—ö3ü<æ9•ÊáË1‹Y&r]v ô7\¿²h¤=’ÀÞîÓEWEáøóÈ2RožÌ™€JO_ETõÓb·GÛ±®`¡Ô»= I×/„ëýwwJfnXÝö ~ûóþËláA[/g›D;ûrÔßXP,´äŽy¾Äoð†JÞ~šæY[5}Äêlzº¿/¦ÈñË Ï³Ä=™ÐŒø<Äh©õ§—ë!8>šujÁ ¿×çS•ÿp[v¡ù¬>}$îÔõÛ =€¡n©L§6${DïpîGX••–OíUDÕ–)ðÊ8I'2í´œžZ;"Xojmèlœ hú*ãjÂzvsŸèꊟÕ^Œþ[ˆ<ô¨òý×íÍvê@rJLú7È"‘i£¹nøMÒ_jüǃñãCƒË Û«ŠjxK4¶CÆ•x¡‡A½ówS k €„þ‰ ޹}mÂA߃¤G†ªÄæÖ€ uwn„‡!r7â3ç­Õ¡"7Ø—ÐJoý›úÊE¼„'îM¿;9×ö†©eªO¸íòL/!…úØëǭΑR:•9ÿ®ÚïÏËÒ-—KH‡§¤_#yhö¿'ŸËèó—IŽäèºù2íž?“Åž÷Znô‰lfU–VY)‚õ— Ò¨f--êk¬B¼ø{Î? $`zÁí ò;§Û’0Oñb§í£È‡kqá¡‚N ÍŠ\Ú|I朸§™¿µÓp¨Upf™çƒÎ—(Év#û ô“–|ÐcŸŽÝÛÇ—ö•¾¹:åH^^{Ÿj$y¿ÁóÙ6ßû‡aÞ|£‚ùŒ䔼žaÓ}YÀ?zêÌϼÁrL=æ-÷޼œÃÒDÆQOȳ@ÂVÆÄ¿4S¡vüòž( @íÇìâéÙÐÚ܇ˆŽåªý<²¨ÔÈ|ø´\HûÌ^˜U6ë}%ûdùS%Ù˜WFË‹/ÔŠ–¾+pšr[¹ÛÓº5ýbÄ™z‡'Å0ódG]õ#¥öxJx<ÇÇ‚Æj–äS'®»cÕŠõÛ#›¦û¸•@)"= ù:ßÝQ=Eúe1©ƒVï6ºGª©Y^FžÌ–H霾WG×ï´O”è­Japë´Â!ÎÉz&ÃqÀ¡‚âù q3bìV‘ŒWqI€((§s&´‚Gx¹Þ‘ªθǹ÷$ô÷Aöóüƒ1 s¿¥õ­ò@®ïOá©­ýD@µùüÜqs½±n4Þ¡„\„ˆKM0¾žífîR› —ÂXÂÐUU§ñ¨hÞ°³xÈJõ`œ®YcRá(Îfâ’WÂI¶5Q§8CC9…_rAl­`µ´Ûd“š8³˜ãBÛs„â` Õ20ÂîÞwL’OvбÕh)sÄb ™Ú‹l”Pó¿@Á…±ñ_–Órm˜ZœZ¬þCŒvoI4ÙŠ:btpœÄ‰ì½5óÎE6Ûre3d –±³J¬8 ½LV˜ÙêXº‚B;fËMÔãjC/ªL&5×d»%†ó/8^Ú”„Fm¬NaD’ ¥x%±Îa'—ZQ¥Ïý²-Âöä*j”í¢ 7xûË€Ç ÐÖ%›9º“³ÌU)åmГ$‚‡¢¬÷Êzň³£E̤“DŸ„Ú'œøG3˜y¡^17®Ð- naMž8eÅ9É-§$åç£7»EÊ$«ug¨LnÈ>ˆgaiMnÂWß.ìåºH™a’Æ5• &FHx… !s °tÒfRCªæ€{gÆ£®¼1@$H©’Ð#£fhI’ÄU+Z/2ac¨Ê ^CŒak4%y`yÁædPÆtàæ‹Q]à÷!Øñ <Ãy´êÿ?Õ³C¥<îù“_­åäÂ}yp¤è$«1¹åe-GÚFjÂálÓ4{ð1ÙÙÍ gÚå"Ô­å}!–kŒ+:šá@:ƒ=T†xàPvm;Ž>ŽË†¾.$) DŽIªªH£8Ò à Í…*šïŠjxZ|Åå%ANzˆ2X",>L&l%]ú€¸y”Wí €íß›-¦FÊœ¤NfäŒôŸO[DZ+áíùmùÙôbtýØ%èˆt¨tßnŸ  å—cóÕ“îR"ï½¾]?T²8_í |Ïvïµ úMÃ3ªPzDö=üiï:uwÙ¶Òfâó®¡$B/Ÿ_àüÍÆÔœ±Îǧ“ô‰‘(ý}þ}ýwQ~qÍHÔTï…ý8òõ÷ÛêD»ŒÖÌlG7N\/õy ú«-ÊÖËò§Ó݃d³¥“š~‡Ø ºéð»·ˆoçZÌ뢖ŸYà$ßãº9:~Ï(_~pN\üw/Ö9.}þÇý$²ü‡.žêåÍTÔ¤·¾HK}Zž½ß³Ñ¨oÏj;-V³‘»ØmÒwÓ‰å÷¥ßeþÊzkÓ ûßÂ.¾^9zÏ nÃI_.T¾^{Ç^Ï– ÿ£Û;å*-&ÇŠWœ{—& ²ª[iœûqO B\–“)—›$€Hª__wÃÐsÍmýµÇœAûþ£~³Lr€ÎýòÜóöûÛ)1ä‹{õw×å’~\hË{ò+¼"¤0Z[^§gLü·àt·°p+U1,ÌúØq›Z+èípßЦ—oç±0Óã"ã]Cù@1’ }Qã医”]»Í¾y­°O.f±q§›bd}ŠúdcŸ†ª½óF–£¸ê|¹»&ò=ÿËþ¤h€âµüi+ô.\þ @(»ëI”|©Ï£4?ÛÍÁö´Á¼ÑùÖúø’yž›Ö‹ÏÍÝK€Ì,PoóÿqÇܲ×ûw{yò¢¹ƒ—"ýˆ6‚0\L4‰ÑRãÊŽ4 Pú¹Ö‰öP÷vhê^û…ý}‘å8úD?#“¡_?ؤü©n[¼E•Šã!óê`‡ìåù°MžçwP>²K§Š†\(iiÛÛãyøòêøíÖ*ëwåΦå®x%ÝÌ„h`îŠí×oDÖÎ囨µ')[ÿO=äu±æO¿Uùð÷s#w%Öy?ó\l2Çr(í+hY˜5‚ËI‘ä9ELàË›à˜àq°ˆ¤.ÏT`Ýl n³ p² üÂ",„â)œá²ÍPdêùHs0Ï´À¤4aÔ˜U%-‡áB R£!¸m¼¥Œ´uaü¢Ûó&„ûY!c/ .”:†ƒne—ºÀ‹¨õfYD‹˜rå‚–ØVã¤4B4\wÿ´g‰‰æÇ¥ªN?Y5°½Âù¡¦I¸JBæ3ÄfÊîQrE˜²8 ÂÑ à‰D\g@F/Õö"Û<“óg‡jüç.7 wÌm?<ý†ÌÌ_>˜Óéå_ËyÛ!©§À«uÜú8œ*=={}vÃÆp0òÎÃÕ$L\K!nÒ:{Πc` Ièu¤¢@¹t”ß´Ó,*ˆ Ó\ øÔ?>ÏÍΗ¢UXÚ·þU_Jmó/nà+›DrÜyrwSùñ|¡€Ôæù4í×?Ù5yÿ?„³#Öæ‡!³•O/àä£cÆ«d¡ûNíÚl[j‘7Ït)Äòƒ\×J¯a=£CÏ*Îd½úýgǶ’Xöc ¡ØÿŸ^Ïp¨¯8O1`GCiØŸ–Ø‹+¢,\¡î/®Ïú~æ€éÆnøA߬,š¯Šy–µ!በ€¬Ý"‰0y‘¨Ì¡8q)¤¢GŠË7¨J©2Ó¸™Ï ª¬S2úë)aÜúÀêôìͽÿ¶Oõç_£9Œ~!÷]§å,+÷oj{ÜA'sm¶^ˆý£P»=By4å¡¦å¾ ÂΧÐ'ƒ æ}òä|wy=ÎKM/ãÜ¿°šü¬'õ >ê—H Q?&çŸçÚÙ Q[¢›arµ|½ôAQž´3Ý^¿QØ¡Ì R¶1)wâ‘@F'`7ð⾌ð1°Ý2Ï ê¿Þýl†‘V83Yé2) €mù“¾"'²Ì,8®+ Ò´ ¶¬¹¨Qîšn¿{õåØ+_„4æúq§ øgëÕé«ûn^A¯»ù^ æ7$tçUyS–hbr»©…“ÖoÈÅæqDcl‡sƒçuªªÓ’q¡dèDÈEy„ãJ0ÿ>Õ›1šâÖ$qœ@u$úöšÙxçæÆvÙ~jãíô´QwÑÞÇhóŠuÉ "‚_–š”¿]vÅâ?i€Èùk9A?µÍÎ-¦\õ@ÆmÈH?jÂm5ÉWÕfuÀeó€6ľæIÂvÄ)wžè/M® <ª5œåŠ2ßÑZKMx¾Ï«W@ •ò‡Ý ?kfF’ô¯!DP)zdš.z¹ŒGªÓ gf“ÖŒ§û?•ïQ>pæBúrô¦Uñ¯vÏC.<Å®6üÝÔ¶x‘êû0äK7µ@ Ó¯ —ÚžmKlPsß´ r ¿ïf¯‚eÚ,“{åã—>\ˆ: ýºç–' ž¶7)òìDÊ…F{Ë8ûxμǧ{}7½,³¤f*ÿìGî_mlÇŸ½¦ð,ˆ¡zoºß¹8üw¥†ìzyýœþ= … µ´0ˆÖÈ™A7·ÂÓ¸f`Ãûú(!%jX,þBKëýš&ì&7kdAj¯ãf­ÁÇ®pëØzùA¹—w•oªziÄÇ-¶M£‹‘×hÉj(¿?efe)Šî󮨼µdƒËâ=ù4eà{efÆÞárüþM»ö»eó¢;„AíÞÿV_O}7ÉKˆ¡¹rmÕÖŠŸšÉíÏÆ•Û-²P+o1ÊéÊ­å6&5ò¿®¨¥4zb°Xm)£îh"1tæ”Bª¤ÚÍ.Û—=¬´¢P±?¸":>¡$d(ùk=aõí¦´Ìç -)-¤ToMýÚ9ÿU%Ÿ›‹Æ|5_SÖÉ¡-\O (BõWוT" ¡öŠ-Á¾Zf1WÍôL±-¯ÿÓ÷9kŸ0çªÿq¹}rŒ2³Þ²·†W^™9+´JAe/Ñüˆm½Î¦fL  …»VO¿çä]“ƒ ï”Mäy¥M’w¯fucÖ?B#åù‡óö¯¼x^;ËÜݪ¬Ø{7Þ½­þŒÿž¢ÐÙžíó'?ÎãUdI5釱}\S«ô«·Ö…©¶¸4€÷Ë’ùeæ…×~@Øm×ÎQý2²̹ZêÆkÏÇè_£góü¼í}F²² ,×ÍU§çûûv‡3ãÈ¿x5Wƒ=ÿ%ÉÎç1­¬f{C³(õüIš„z\~‘ò É‹’:®Hæ:<9Ûôþôý˜©‰ŽŒU¤Ž«ù±¸ì_MÅ ùÄ{#ðræ"‘Îû¢›k v¢ËµP4á±RõÐÞ[W]³®ihüÑZŽ&OlÒmÞÃ)ŒÍl4ïš\SƒòÈßÉÍʺý9‹{‚§¶¾Ù|8þè5õOÔifpþâgü¿šmÊüW£Ô2-Ï'<-‡ ÚÊX½ËÇs4Gt…ý,ôùCÛØpwÙ!|믹іÚ~i0JÊ{éÐb´=ïûÁªù³c Ãayähþ®ì™ßYýî’úàè_¢´ÞõÉëL®·4[&H?D“4•Ô#oÙõÜêÿiÏn²¯ñ?v˜S‰ôÑ—eÓЖÎ7=© e‡V€#£Fd_‚ÝJSšx˜},9°,Ž:xËôÑÌ”[=E!½úÝ .LÈÅt©„=e¸ÆÓŠâBrîcé~ëß^œ#ö÷¿FáXÖ¥wùR«?kW}–ÊÈœ)W¡zýOBs"•´¿Dö<Ïû4FOá³IúÐ$êù(°Ì[·ÇlI™[šÉ6ŠL–©á¢ü~ó 5ݪ«g Ò½€¨µÜ\«ª­ ßO– 'W²‘…À²©B5¸Wôgš *9mŠ!䊈!$s'ª…x’H·8ik•7\Eq^àWGbÊ<ϰïÓ¿zi³³fþ`î ÚCÔ;yysY«Ü³åÄ4”`˜0'"m}Ê+1ë-á7 PTîÍ`Ì,—< Ƭ`¬´|KE×õ(„g3½e^ѽøæ”ô6œ~2ÔµÌÑ>eXÔXëYýŽâL½¿¸þÎ\\Lý5ñc|Cý°h…uë×Rï]À G\ìå$’aßé£ÌÓ¦Ýáˆüo戄õW^^Êv¹6òOßS@þP—÷¤\™Û3ÉVÍIƒõ?†MÁsž<ÅsÍÕªèÍG¿à†Ž_»;OÚ±¾éþ½DzSµšÃÈ&øžêÔ–A·s.Z¨™~Ô:ßAò„ª1®¡6>)ç3©<ÐA!>Zuµéí$ç ¯´ d …™7¤Vìzþ†—¸•Ó9ǼÎ^ZH­N ¿ä´î'%µÖ£,ÿs›ñpc ø¤pmü#.sZÉî:PÊûÔ&;ôúô'œ=öïºy OTÈÙÎ,¢ŸI½fp‘~ìÅèuEo×™ëÙ‰W›­žÊÏåXìüÇ!ú²¾Šš¢±ùÊ ˜FJÈs(â_<Ô‡#¿šKÖb4R bv¿Rc­˜cû¹tpÃÊY lž²×rS“Æ‚nÌÈÏišjñ·²D¿&çý4s1ØGU ™í˜µå?µ@Y@Äҳĥ|?)K¥v%rÑ»z–Yýzéó0 ¾¿æíw¢iúÿí~Px`u^ØtDñÐÂéþ”ÿF §ê™ ~·Ók“3%+ª ê¤EÙZ,9b¾r1w?ìÊãã Ú¿\SæôHêüáoµ¯µ6Óì¡ôô"vÕšíWb;~½Ö, £ú»f£¢±þ9d½s¦XH¢$tôÝ Ã|´KNnP€ Ñì_Hó-7…Xë•=ÓBžÒè\Ôt³ÿÒ×…A«ñanÈô ‡ô”¡S”ÏÙñ®@N(¨ÌïêTA<ÇÉ'š9'.†Úÿs,‚ÏǧìGV-ƃùÑå.AׯÞçínQÆ©?ñ«"6Pz)ÌiþŸ«q¶ Ý¿ÃRì. ±ºr®P-ÿ–´>Íü§êÛèöó>¡¤Éš#Á¦ò`ü)˜m3>§ŸÿÂåDNŒ¿TÌZËì(¥ ªÅ îõ”Ѷ†óWò™ýXú°1XHÁ|rõ®¹é’/c Šäh áÚĘ…X$ž`{%ìÀÀvX£%±À0Î2ˆuÊ«€bƒCu^žëÏÖ…@NaäöP_ÍíáV÷Œ>±K×÷ög™¹WM tµùBž‰ ”ONö†?CòĤ"D‹ mm6H«úDLvºð¾öQô?éÊ¢5|‘/®<òµ½”¸àÍJV·hpM(Ÿ1àÕw£mzð|fEQ¥pÂaæÖãløvÝ{g´s¨vÙ"% Ò-CW§ñ²ÎáunI;zbžcó¥Ö÷éÙ® 7N¾ÏP °Ž °x¨ŸDd—/Eõ˜ïÑÓmϲ‡z QŒ?éù¥åÅùd-¡àD"’?x›(J[3ß8¡‡m0¤ã¬ANQ ›mEL·e†ÝJU‘µ‘R*‚,SÿXKó˃ô †s—â¾O®£ê»¾åô’ E@C<ý„.eó™Ÿ{—› ˆÿwRHýA ¡ðy§ò[΋W`†d»J‚¤!I…º0© úë6Þƒ|‚˜·®PQòŠQ§ð²´äŸßüÙ¢—!,¡¯Y“íÊ\Ë…¢C¿U£*ðÀäèwµ%?TÜýBpfVZ±ÝÅÊßCÂ} |B/Pì‘W¥Qƒyšp|Qªðq„›ðP¹o·„ÿ~˜ùAÁÛžteUž¿Xze±\„ò‰¿CA/¨áÙç'zªý]O_ã Ÿœ_ÍšeçÞÛUÔš ÝÇŽ&Ð…¤^~š—@ßDÔœyã|m¿ø\sú‹o9ìÿˆA–5 ê[›ÊR€;âMl¯éóÐs¯áç¥yO,iE3"§Ì~y©$0~aå-N9ÍzÃö|opP¾¿ûJ.é•X“ôjb$ó#zküºBü™‹èÞ2!ÁD3Üü„ôóÿ÷“³ˆ;Æ®!2¾Ô2‚“Ã6jÄ‚1Ç#f­«4²'a@l¢‰ G¤C æ9®(}“‘à_ݵ°6_?Ák’ûrú„ z \I—}û3å!UtþäæoÏšrÒãÏéõø#ËÖØã$“ð¿Í~ž>ìðìUýtè¤zÓ›äì¨o¬YLR˜pF°z„õ1u§Ò`‚®æ¨m¹q(’ŒöA´…vf—¼H`Òy ÷¦à™^9"¿ÿýzcÝiò,]Èá¶ñ@ªËã´èv'.q<³¢M+K¸Â"W!Ád,!€™íýpÚ¨ð¨ü…| ®rR願º‚D8ïĸƤp‚ð–Hä®ÂÙš—uS£{ª|U@XˆMLxÚÇÓaCßzó´#ù($`_ÑI€réüqNf‹ñ—9¼§þòÈ?Ñþ/d±_ÛS€–Û"Ê/ÛF˜êvyf÷šáWû,œ©YBòôÈA™û=»†¥®ÎûÂã (ÐÐ ¸ë‹ ÙÛ k¡ŽÁ &Z^a;ÆèL¯,ØT¼¿q¾óªK!î*2/<ý_"ÌUÎÅAX‡(H®ÈTZLüï(3î€`W€‡ÔgDh€ P·f­9äÛ¨½9 «@¶aâJ vh0ã™\9<4%itâ“0hõ]éf²’Ò´âC¡åk×¹Q”ÒBo ÙFXªÉÉݘêŠhгÆ4‹%°Bhè:•´òîËûZS îÁ5Ò¦• 59['×\€HRÁÁ^ªhf¦ùKVÑ‘,enš.…^z2’‚â#Pv¯fxC‰Ó„¢CÄ`P¾âS}'JaH0;Õ®â.Nt’øçWoUኸdÃ:ÙI uöÒ& r"—fÍ_u%–“"ÔY2Z7Ö)eäM“—Xúqª æSSÛ|õ ‹«s·HÜ_Ýzá{^ªS jsý<ÆNç¸Ñ:qäéiñùÁ߸íý½hC^™¾÷ôÓ˜tòÙ‘Û»J·}Ùü4(Â?íß F¡±µ~°×ؘË×UnooÖY©gø@§Âãå¾ÃËÍlÇÀ_O¨CPùþ›õ/xî´çÝ_ sÕzÊaÆ_xHÏ~Ëò'×â|ƃ’þqÉκSù)WÓÁn¾˜(Êíwh/+ugî ¶ò;ÚfŒþàjd»|~ܤ8åDœ£ ‰¬ ò…ž’;m‡ŠiÝÇ Õ¦eLC- ÁTW€0±CiAH ÇŽ$bjÄmŠcT›=ȉ I&€™E¥BƒyÃ!–}b!Í$][ 2(ó‘ñØ‘2U="TlÔ‡.dÔjSé 8:Å”º‰œ”²Wd P¡0#¦¸A©ðˆÓ3ª¾K¢®}åÐõ‹©X› Ž äßàz̞牡-:«Xû£Ä¤.d¦s¨ˆ‡ÀCû‹:fÄóijh¾Ü·ñÑq øJ@Æ© UØ,ŵ)a棺tíZÔj SWŒ"ƒ‡¿œ-úsÔI§^â7-žW~Ž{oûç¿ey}šß¶š‰Š2±Hèj¨„ï¢#”AÕÄòâ‚íËŽ”Ž6 ô‘€S¤ecÔîÝöŠxN©iŒ>îW³ý?c×N;kæ!A\$¿Û'‘‚ýö'Vù‚_Úh;¸ÉãlCâ±ÁEö aÓð…À«Äp¨€M¤^¯VafÓ,œz•™*uÕ' "x@¨¨rÄà‡ `# =ÊJ=0ZyÎaóSº‘U>Ü_òuS·ýmFú½Éj¹A°©× ÈŸ>~=¸V.j7oàâwÓâ©»³³}E±>ÎRîÏ¥aöÛr#ë—–¡£Ë2@bF Ð3Í\ÅûHsRÌ»jÅ<~ªèR>Uj¼/l%êæñí°áÒ%~3×f`%läÀ bí‰0fšdf.7å¦!åÔ|jÙ÷4ã#%áÊ?CÜÎòGÚþù0û]ŸÙÇL¬€ |Å7lŽU¦jsÔ°,€ºí² €¬ ƒ ‚ 5B·°ê5‰Ì˜°8 pZŸ6”JŒÂÌ|×QqˆT04/c´è‡Ú²bNð˜Ù T€èŒf2D>˜á%¤Àí©<¢VifD0Úý•!’èƾÿ?O£ô”0”un‘ÁÅ “:ó§tè—¡.Ò’ èxÇ?ÓïCxJzI´å6žÛNHj‚Äœ`O@gK4UF´Ê´Ú%â­² O7ÂŽsàyæÍVT÷ |¢½¦ü²‡8cðW}Iļêmù­¨t´F2æÞQjªÏ³©ÜŠ…ù§\îÆÃLªåG]­Wb£üDœÂ_‰R(âëä?«mÏbmD‰AÉ9ä1€þY«ï¯.G»8¾®¡šú÷"6Ìì¯=“<9%ë`dˆ!=ß)ð†;EûÓøw!S¯¯;çäÖ›þ&4çúa±»|¯1ú|½V‚‡È?q1…Üâš .vÇÐ×’€B¶ójÂsÝá"óaëý¤ËéäEõÛÕ`½-Ãn)"HöŸÙËOÑM Û“Ñr,q}úwm¯Û!,ì$’JJ´ÔïNa!UƒQãY£`M$Ì #æuW÷á8×Ý%‰ð@ìnóJ~š°qð å¦nðÉLð4N“¬ph`Sš¬O­~Ü ïí'U/š{ûëÚ³²ˆ^'÷´ÏhLxžî-@ŸˆÎ[šçù|E¿hþr=DÛ+X?ésúô$ÓôCXG ‡ò’8ày / XÚŒ~8œŸ£IÿÒ'(G!ò•Z&Ÿª³±Ú#p…¯Gš`;”Ím1½Ú¤²ÄSç÷«Z½u/”ü©s­Ë¿­ä×ù,D\ð5¬´ÚÈÒ}ò³ÜäVwùõ‡×œßÖw<ä#«™ÒŒºþû_®ÉÅÒá»4j®ÃL‚EKÞzí­A½1þ/h~Z ¯2}$È–¼xç­•ò·H•M¢b œpÞFÕÌÎ4![á¼âVã.â~“”MRC0Ç*)EwˆVœ£Ñ“vœ.C›±P^ÜQµwký@âCBæ^±ù°ÕqßL뜊O¡+(£F tù¥‹–R£ÚôJ¹óGç²¾Xo;Aüݤû˜è]“ö|ýÌ l¬ÂNù²"íª§äð°<ø|Å1qiR¤b)…ú(ÿ,ZyË3fív ºD¾½ìãèËb¥È­ÂUúÉ×ëÑÓkÂó°"t t3L]|˱LéK“å÷½ð¾_ÏV^¡ÕDNëÕe¨â)ÖeXáB›E­/5„bz>hÛÊÐÕD¡‰*b "ƒù ®Ýô—&9ŽjŠšòQ€¸æ·µ"&ºæ ]iÀ´Æ“ï×üÚëó¾£G*|9YDø×›|qcÄÆxL›SøÐŽgk ùCðþO0÷ýý4䱿ÓÓçÎÞ0øõŠê_‰™ûÅòÊTè³mÔàñ¢WëP È>_Y>¿É)gà ׆Rþ™–kówÑ-ýÎF]Mw*7Û‚k e¨·ÍWÃü·Èp{1ŸTc)45Vq×ÍÿtJË· f‚™_09¿…Žg{znÝm`0xœ RWôBùˆ;jñøßF GoägŽ>ð¤6ô¯[ø®Q,ÈZ´:©)³ƒqÔÄ}Ö—«Ç!áÃÞH—˜ZôÆuë¾5út]3üiô©¹úà>©þÉêð?o_º‹4mϱH4öëM\ý=MówêøìèÎq|ÃöwPø^Ä‚>ìa oDÈHôü»'óñÏë¹h¢—l‹§l„ 0‹~«G˜! ;žÕcÕºá¬X5G7Zç̨TñI¯ÙÁ2ØÎܱ7ýIö àÏæ¼©·ðS*§hWî­“RrFëòØyŒ?:1’7Šø''ì·m,«IJ¢.Áâ’(7VëëãÜ‘±>|ôÙV!N€¯jauQžIØ­ç÷uqd|4Æ!T3¾æùþ¢¥ÔK‰øÛý 8¡žƒË±v_Ç¿oY—Åö©,¡ò+–Á ìb'·!^R#úÙ|Õ:ž5ñOªâL óõ³ºs‰þ±°8’–]Ÿ ¼Ø‚Ÿ>»È­O¢Ø8åú¯ÓÆië% If²ÿ'}ͧÃR£hÎD¹û¤Ùzr‘o‚i' ¹Ãˆ€þ–!¿Û¶ií;ÇÔ¡Qz¯áQËsöûÄs‘œT¸¿1“ËãZ…½WÉç£~ ˜õ 䣨³ˆ²·! ÏëÑQýÌ™”n.§<¼C}‡aŠ¡CPx˜ ‘GíüÐü‰+ñÞnoñ·á„ŒRý1§`ûõÓ»ÔØöätŸGû·g…’Âdzâžß·ˆº­uŒ&ó }–åAIäÛXߊ¯U§÷s7³ÅœþWæMzÿ‰øã‡§n²'FNmÏõ´Ñ Uâî¦noÝF-=kÓlš‘£U߇XlÎA¨2yÎM¿a-ÁMl"ýtÐW¢© óû[ò²3°U¡ù|$Í9sÚz¾XÓGo¼RwkÜÌì[ÛU@Rý1_ÄÈ;3úð®éá•SŸJÓ……ð²íýÓ鲘U§œŸÅØgñ"ŽžGÏÐ{/€„ý»õQ5èž“óM zÚ'¿Ê}¼XSl)æ„êCëà°ÐOBñE›ïò‡H긷ï'F¤¦¶d5WSÙ–-Þ*^‡áVjI„Xªk¼ŸÔóìljU9—qö„z]g®3SÍ#bè8„Ö 7{Ó\m+‚ïYÔŒ÷ŠÌ(Rˆ-Hg &U¹b2l*êù;ê¿í.[ÞÑ.æ#÷ Ì(þmÏ‚—HöH›<„$W‚ÊSѧ© J?“ø×Ï?®HäÕU$ûn1C!ä1°²—Œ¯Á— ¾Yú÷^üËÓLT]4I§ù09#Ž:ÓÐ5UIâ*¿î¢"Ó&»GŠœKoTè »f–Šuü0—¦„tJ#Ú4cùÁ>šK?·¥û-Ž$Ýf¬Mmêvf>¿€ÿ|ªçGÔlþ}áá6†Û‘ðà£ÃÑä #(S®¹ï¤Æ!.eùôèÏ“YÌ­gy—àjë”å[LtÌ7›CÉ9!Û®´öÚ?…ޏ¨{Ü–°ÂGñëâ‡ÒO>0‚¢!ª~ÞÑÑ­¹ ÞHJÒ6¤ñƽAw÷Ù€àôók¦ïº{Ëî/4P^!²»e\7Çè´Óû?‡Ê\Ùó†áÛÚªlN62š<ÅÒŽnß›RlåN)á@<¼¸è³›u•wÊ1’s.ÂÃÝSjÑÍýŒþ¸•2ŽƒýE2;„ZÝãÛäš÷r¤¿“åËë/†xcA;p ‰ÒÚys”Ìùã½6&–—°z…ç’YÇÄ—7•ÜdŸ>5‹`³góø2Ö;X¨'Ïr¿ž±-¢¾}óôºâÍÄM´!?'èìÝo“j9!º~a­ª€}:EÃö•Ýu.3†äöù¹^TŽdR“Êo·8ï„,࿪Ndü6c£°Sxt58 (\Ðö`h‹ A#~íi=—±¢3Ì”wäD>N ç d¯o^?LÍ3Ë]4Ó²Õ×ËZgñP5î÷rN£ ÉŸ>£ÿw§ßǸÝüs˜Jþ༥ÀÎË.>Æ))ÑÚ"ºˆÔÊä?-º2ƒèÿõü™#Áþm`Ýý:¢ŠË¦¬ÝMýn†_ÓÜ´Üÿßc~mø'oÊ”gy8˜`Óþ2õé kÄäÆ>ø<7;ts†`ò,hü¢3?ò—Î6ܳÇÿ Wv¼ Ÿ•ö!p/CŸÝ]þŽ)Ø*~5N_Ø 7ÅPÐ'„=רc0ظJÁÉLü¯ÔŸË—I¢lÓÊ0›ÌQ ¦†{Swû áWÈÄ,0ýÍÒ{³ w)‘Àí¥ø–y€š¡D¤EþQÍÎËØbs+8‘žƒ™þ½Œì¾öP¥¢H±Ÿ¢9ËëV{WSÍvü¨I^}³’ì( Dd÷F1rö俱Ԋ·þ5§3;ó.wÓpDˆªv8DÅzi"¹•CûÚó\½<¥%€¦º‰ñsë3?tþ/1–ñ8b “­íÌsÍ’°s!cUû2M±jsoìu,ÁE&êÉ23h\„¶ëQ.±ª…´,‘ZAõ<‡š# …0H°ŸõÓ< B^¿ÐòÅ…âd¬?¾<ûß«HãÈ@xxÓzS¿qý—¿Â}Uf³ûJß$¼>€ôøé²g1ÝÀê¾â±N¾KÆ ÇЖÜg ©¹å IáøÍ5Ç]F¦ «X`fð¸|.+9dT’ ò`ØPlì?ÅÙ´êý»bU¥"5op¹¯2WíGäe'~úRWj} ¡úy‹~Ú¸¢ #̺Pû ÁaëWF™ìÝDT¬l¯W£E- “-ËÕ(ÇWÉô ‘ê«ñô£ÿ›¢Øìž‡”G 4üìºVÆÚÿ€×шÆÙÐd/mQýÙ’}ýÿ>êëׯlsôåË.e¸ªæñŽ«çÌVéMJ4Yî¢Ò×Mw)¯ihâ@ä‰o¹é(ÐÓò]¬C HùÇôWõ"NVΨ úýºÔ{L„G‡¯ñðã_–Î\Cù}‹DŠê†G\>á³h¼ú¯]Ðy” 5CEvò×ûÝO !uh}å{~åLRŠòùì‹óÖà¢$6€ 9gšÎŸá¦YL¼OœÈsJñˆùŽ)sŒÌ¨?¿ÊÜ×6G\J?ßÁN&®á°Cè‚pë¬É”E’˜·—Sâ䵟_Zþ:ŠMC[÷®Ì;TÝ’Ò£dnÃ&aÏàÐÈïã!³Îä1E‚HF‡D•‰òÌLCxM4³\2rëá25Umð¢•þ¶úzâÇÓ6“oe˜‡¯Ž–KS$Í—zä^_žaÄÆt7Ÿ+†ð o~®x“Ì[X¸Ú¿@Ü=OÈqlÆÎbåÜ|"jV_ºG¤£ÖŸ<<øÌ>•HaµŠÚ™ZïhHâ(שÁXÖÿ Ëã®Í4ÀtÆ´(O§_Ÿ¯ûnýC‡ÈPT åòšÓ˜}>j™»rÙ÷8¹Ážt§ŸEëâ±þÿ3"¢ä?ò-^8_·Uk†cÚœŸŽ9‹Ò /F¨QÂyÕ¤>ÚðU‡’ÃçË£÷zËü´•SªJîP›p™ªëíõPLvýrÆ7©›ƒj&ï%Àë£ÜÃ+('sº aU~2ßèÃJHWâ‘HÛ~0³Z³*êTw¬OéÂä »&DnüªAì¤i£ý2ÃQúì>¿‹¡Ò \n^íôÉÈ‹[läu_wá,à²6ÇFöù;›“Cº}|Æ©'¶#̧ü\l²~çV³Dt;ßQ—bƒßRa’[R aýwŠ©ó0Mª¯ßU-þŸúþ’ïž]FœÂDeJýƒ_ ÞEH”3ØkòR´ò½"ðx?FyKÊ=éªà@wGRfN˜»È.®U‘,ä©Ïtñ ~šàŠ2¥Q)#Þ #©Åßë5Á¬Õ®}‚þÓŸ, éý“y@Y«G„#ò‹Êíl¹G1‹1~Y<…úÓôNuø'bÒÞ@K˜Tó}Âa4õ@¿ŸËýW¶7²¥H×9Û Ð`y1$kN ‚3Â(!A™ÇÎU!a9t$žFºü,Õ9¸q%·1fÓUo,Ô— j¬ˆ6á_²9Õ³þg‰vî²îÅ^[xgØó 3¾l_œ]Œ?øBŽsæÿ“Ö•ëÌ|Ý5©µ»ËÌ/.å?š@ çvaÞ çžZ’ÚÈ"Aíç,~l ]!ƒ§ÝŽÕ°÷X8tö*!æ$%FR‹Âx–ÔÏr7D¿æÀm Hµbvrj m@ÝE¢„þÃ^±T€Ëòs+:5þ‚ÃÙ–pýϼjÑ^Ëe4ÚgšF)eò;7vÉtØðÁ¡ùЬÎ'¤3ùôæòÊiZ·…ÌHº ðhD|Œðží#¨¶.žûsÈdR°¿§ÖéúvezSPÁ>?')@.zI”óvÛ+M!Áy¨•÷e7y2Ìÿ\ó.øñý±JGÑ:¥wåø¤y+Aí¶ Ÿž*80þÞ‚þ§/’¿\~»Ðvàˆ çB_·‡LVü».?‰9DÝ8ÿç±XÀa í a§âÉçÕ(Ùûcá×#~ô?2¬™V—ßE¿ìËo@‡û˜#êÇÎò ™ëÓä­ S÷@€Í•"Îôp:ÉÁŽ/¹ˆ~ ,òÌ·÷;U7±“÷ížÕýa_XªER l(`¦ŒÕf!) xf ÃʹG!†Ù8¦ˆb2Uõï¤c™Ö™*\Þ`¥‚þúkó†ÉûQ!ª( –A›ÀÙúýóžœâa= hð/À(š„ŸnfuŠþò ä¹¾ªÎ0/÷xûËôít¸èŸØ 0ôõM¬ˆtN¸çªçÇCÁDõ IÓ.Èæ2â”ØèÎ0çU˜Xnƒë¤:èYt>½•…±ƒÉ/BìÍ~¡L&2ï(9±›8©Í–EKƒÓŸö©~ù€ëzÃÏ1y´f‚6ª·0¬Œ44BÚª:æ‹\ÚͰÁHQdFÐ|4Í àÀ0ãEL‘Î>¿^b<¡[âîLI“¯ÌΕ–‹Y Yˆý×U~3U$˲²óœC‚Qþ˜×¦j/Ín°çPªc}¡ $‚ò@Z agn¢ú;—Â"ÃOTóF¼ÑO2æÎT×ˆŠˆf0ƒk@BèmÓ.æÄŒ/JÚ0°x°k¹ÞF«,È+9€m&´µIXÔÝÛ œ$)R˜s'52æÅ5бЙK\Ê“ƒlÕ@Ø,‘-9ç hÉQFEÚ³3Q:±ÄûçÒfx©€L§6ÔÀ ãi µb˜€:A @ê‚w®Â„4Dµa€f…ak±T–e®PK©³éÇoSs¼7k±e÷—¿¯evõ§Ú¿­ªŸÂ¹”Ÿ ¶cEW8¹ÑªàÏ ãyù˜IÈDNùœ©!Fºá ®®™¾Ãð¦äh"§§º¹ïÚeÜ,öþ!8¨TúõþáÎë ‘1þeÑt˲¦S=4˜VI½ŒF®ó(„pò×ðùiGÃÔbì¢?ʤ4ꛇ}és§+‡t m{RLíÈ©Á}þBz`=Õíì&´„§a0n"ÑacÞ[¯öx¿ÀíøvFÝ7~N†'LÀÍã ±''÷¸š’Fª© â1+Œ Cd35¥^F±E:9ä’DcÇK˜ŽýÞýÏq~ùϯ÷x邟J…ê·|ùû¡”8Vº™m3¼h½Nn$5Çètºüz<§/æ|‚`…ŽË/#:ç>W¨dqÚ㌚N\’wÓÙªëäÌ’7]_»”;§ƒ7#:|ë³B–/Fzæã"¯ÖIãÙ„“—ñ=˜ðSÄ™pvu²¶Ý+Ò>%WÚ.Y3D‘ðöÈë>“a—/Ù>úÏö7£Œ6ŒüÒMÒxnEõä½vTZ-ÿß‘Öö×Ïo—.ÛOòn(¾ñüÒæKZœz‡iC¬È¯#©[>TzZíþ+¯ÑÛùEq·ÛéÜ7ˆ¼êÈ=ιüIÝ=€°«,¡²Äèò h™EJÙ쪂<ŠßÆÞyÙ¢­Ê¿ÊÆYRŒx×±*}>¼`VïçûANþL„Ê® <léF|SïñÜé/žÆÿÜçF²ž)âgõöþpÒr_]R˜‚ýg,Co?„¾2=œò~!â¾µRo¿¿ Xý*içñÿ¶Q,tàƒß ù w7©;(!üÉ‚Þü7Ÿäà^IoNkÁú …oÝ®KV#$8Ô _>®ö ûz«íbPs‘Õÿ‘qÅÝüxÈ{ôA=áâùD’Óöegkúäž}¡ê=“mžÖ<Å–PÅc fÌ¡ÝÐ…óÑ2» ºG¯d‹ÇÉRm·(/% —šÄfíë“ùñwÅÿ%ë~Ñ„1våúÂYîÊXÖf„dÆ;\v…¸E©0ßÑ8ü áÀ¢ca-ÂQµ^Ÿ±¤éÇA«·[æð ×H •Hë–©”‘ËœCgYmáT,¬‰H‹yåø¢d×”r¬_ ~Šz`‰0¾RªoüÊù7qô± ŽÑ€@žkn&\C0Wýe=€…êºtÂÚ{KLæ†uÔ…vD¶M£ª‰ã°‘ôT>vü×…æìØ(‹lô¥þF~Ì)¨4Z7 Ÿ§]+>Ž¡úè3þFj‰[")´C¼…Ó|þ^êe5¬­/Ëk]zl:v£Fwl=R£@vLf‹8²+2]8‚®–Nè–L¡¯Ay|~xƒï‘#Btº”PƒÌ ž`Íà*{™Pû6þ²=[ª€rÍ”Èñ-¦#É^Sfä t~d$òˆŸøþRç®I¥6•þ8Ó•;¥è ƒÀÁ øÆ3:fb'KZÊãtñ!|5ë÷öVÜz™z4ðF_3é8’ֽ̱Ë3¯Ü ð'·_¤4ó–fz)Z=¨f[ §ƒ _šh¼|œý¹ö„øûüØcêqÓ„g ‡Ûô†èåþ‹Î.píôç,?°áROOnH`ŵJÈòçW–C2÷1-Ûvý2jÛ=Æâ"0ö†Y.‘óöoƒ&(³ïß]®`Û”÷"&æSÈ/_‚P¦dùsÞ:…<ïêú[l—B:òµ®BïÄÞî°z á§“%±۾ŠÌõ„ g{þ¶Bߪ×Tcy êJ¶V²–ÊmÉüdR«¼»CÏ!‰­o2DSàÜ'µ2¹JT$I4|͵½;3(‹¯ß~góá-T±ÏrzœN !Ù~·$@—v6Ð>@¤¬ßÆ`v¡Õ$VP|›µ¾9u®«!¿¯âù;US8rzº}»‚VçÏ4r¶¡v.ß¶7ò n§MÖ´‚§šQ†l <#â²ÕÖ™Wo×—-Œ'ÊèµKUãûïWnù·ºÐ‡Yø(þÙ~Ùm„ÇE3Ì4]Ǭ/§ú‘jn!%µOö­°'JQ{ëÒë“÷]Øú›·„ô%qû¡7hèÿqfÝŒ žÄÁíí-S. é¶»wniçV–¼Ö¹ï”´þ´}Y¬½<0óîo{Ûª»-¡v•1ä¯7©x ‚?¼]6,ú ÙÄ.qÿæê‰jQ¹¿)Ãáßl¶ÎÖôg‘™û²FGU™&œ–þ35W$vîÌ¡<­3¡‹›œˆ½£ÁÕùÂö,bЛÀÙõÓIÚò_ÈóËF­9çŽ5ûÑ|¥Nƒ`ej¶zf*®}“+7ñ‚yiýƹ¼ÿeùtèE0oyä/§3¥UÈâkÕüƒG‡[Ñ)U79Çì?pÄ4b"ç+‚Åýƃ&]^6O¢þäõåç@h½€ˆG_ÆÐ‰åöŽ}s‘QÑÚyŸ p¬:–Î*ŸÜQ‰ô…]5„" y ¶.?yøÊz@7Uš·¿(¶ñûÜD÷ûÚʃÆxá€8;1˜yvþJýN¾u!JŸÀn÷/Ê ÊCßÜ{":¯Ë~ðGB¨ZîNdl-Ò¡DEn4~ úÿv@ZOæ¹ÇêâRð2ìðoacÓ²au¸jòȾç}‰üÝzò™Ñuñ\L§Ñ!CÏŸ©éÛ|zÆõÆ<@=>ê)$t1eód‰|²¶sÖÅÏ}Võ©ø6Ùxàl(¤—oa÷H¾ÁÈ|¯tO˜¿:Ò½»L?ÏW¬BÊ-a/­ÌýÎ {CíîŒòH„LJÒJ)5óöïã.—HÇw#;O>ß®õØtZÞooýŽþ›è÷sæŸ}{Ä€›Rß8?¨džÞð^—Û:H:%OËR_Ç¥Ñç‘t‡Íÿ'ÛDkñX?×™N}éý°Øð…ÿoÏ¡I’§:{›BíŸ0‹æÝ Á-sƒÒx|¥»‰q·ÿ‘Ü},ù?`襩÷všûh1 Xƒõ÷¬üø™Å|ÆsìxîÑË6P Ç¡Oíü‡x·—ǤWÚ¨ÇciÇ6Û±: :/ñƒ… óK ›%LßvÙ{ ÿKõ@yyŽ{ÚÊÆV ôŸõÃžË ?ßIpxþqѨŒÿ´Qâú-QRè$ç ®jNÙù@'èÙ­×݈ÏÎ=u䙤.î:Ù¤Rø±sÜšŒ9jÀ4 J–âieÛ÷ݱ¾öå2ÏœÏüÉüâ«ôÆ7ÑÁÖ Y! ¦ç#rNÁ¦^oÀ<ÂXÞ>$”÷¤øHWG+}°z °BÙ3öèÌ~ ™%»¤\ŽŸ½”´áبI›ÆÖfÐJGX 0¸û9ÒËe x\aY±²Ž¦VJ#2¤À'K¿w}³‡×9S—¨òž/¡¯‰'¿VTüèX²A!®C[T”mÃ^¿£=K“»åË·—nÕŸ"äDrš>ƒ?ªÂg¿úo~¨ÏML~û#õ£´ukÁ$?4éî“&‘p|*üËi‘š zG<ù¹«ín²È“ÉI>ý£þÐ,©‘¬éçR‹•Qæ³nG•A‘Ð…Œ’ãü•zs2t¾tò(§äì÷ë%WÝ]4h»«_Lä`æ«á’Ù2‚ñ‡Ï{ωú^%ýEý°ò°×?¶À}.×Í»z§ #cK“Œ’³»?¯$ÉÏQ‘Jg–€¨W!éîǃˆßºÒ[ùDKŸ|°³~§’¥ó–ZÇ¿ÍEP®n’Ú:<…ŠÎltsEðb‡vÿzí3ä7ŒÕP.k%žœÃ©Pa‰Y|Äå¿ø·Jdg÷2*ÝØ¿þø‡ÂniE¦©™ÊÜÑlÿ“°µ‘½0@'ýÛu´Æ¥³ÏsÈT+–zjwýpü‘®¯ò|zlýÇ™ N2ßòtú Ošàåü;¶)çÓçæ-˜™tÌ÷MMˆ³?ÃÇñzWé6;³Žì2º0ì +ôŠßÅSTâÕ4¿ã“<ãê•|!í!qÓŠ1õô¶2”gôA{þ‘ëÉÁ$¶!™š˜ä¼'2ÑÕqvB‡#„í<Éþ±}‹Ï–CT¨W†<#ò…½2÷_@ÎÐqõ$¸¸ú#ú©Žeê*ø)Ûs#¦½+—ìн2ó¡pªXÜÀÌß­%XËÞµ‡~Œ7 MÈYWó]\b›¥ù óü|“s^”äbŽ TE°a†Ùd7#g>=n‰¾ôP” ÌCØ@órÂ6Cé5Hù_#üÊög º³E¡:éŠÔ´BUÝK]0ÊËù-€9 38?(~tœŸ9jÄ€­èþ¨ý±‰­Í¹Fš> ñšCÅKüGË~~ƒ–ËèBpˆÎÕ$ ç±l©‰BðÂ:hæ`Ó49óRF—¹£t&âç‰@Ÿ3ˆ ·µÉ•Úd‚9Li—ÌÚôÞŸ»÷éªàÝòÁÊ&Tz{A{=—î:ÿ% § ?_]¶ ߉…”Ò9ø Sìô÷‰n¡þêaàÖoÈ\*~¬ð€‘±uëëíEjØ]òŒoQdb.×»¯ZÉWðwõHùé‘Ãb˜2CœF¹ƒ]Z ¼$¸‡ù?r‰¦g j1RÏÎåc¯ô¿›²y)‘²‰^›Ö5÷í ð÷í·ùŽÇ †y‰XP‹Iáy~(ÄïŽêß¨Û …¬_³µKÒ‚ ’[@ÖE7óy|Ô“mýà‘Ò»# ¨¢ ˆ¯vш¨•ï´¢ð'kÓôkùÜ@ñCî½ç"PÒÔ¿/¶ßɶ:øl?PMáóW^Mõ[BA ¹ E^ &__NŒwWÒâ# 2ònhÛù»5¢Ì+;q„œòGó›Mÿ.SПÜyèIÑj¤Ë³©Óœ´/D‚^uŠ‘°M˜jÓ 3ìÛJ`5QJc ,ÒŸ®ÉäuÒYõ — <ÔD!Ù|šÕ  _cíü‚S?VõvÜË÷´Ýj•çÑm%jÛ Óð8\Û¤€Ug Ñ”˜—ßøÿ]J(k¾^lSA}òúÿ2Ьì«Ã) 'g™0¨Œ ß×Ôhjæ/ÖI=>TB2Þ‹äË%oV¾@t¶\s¢:¼Kpÿ”Í~ŸBu­6ñs~ïä£Äð­1ˈf&EÛd |îÁù›rèÝR'_î§äy>ý9Gê×ùþ› TfAòV3ŽŽñëkžŠšNUŒ4 ØGð:sáŒÝ ßϘ–Hˆ ãòlÞ>+SAõ`ëg³à¶UÇ<ÑÇ–ÿ÷£©ó.æÐKÕCu_ÆèÎ|símu ‚Ée¦¡ÉÌYØöäºþðþ†MµVÅ×ò³o §Ô{³Ü¶¦uçì"è1ÃðäÐÙ©Û¢ÒlÊÇ3N¥«Î Iš®¯ÈC|ç/ËÆJìÞˆ™S¿—‹¡Ã ul%M«ÿhCû²-\Ùqû\{'Drk_Lg̃w'„Ÿ/Uœ^¥Ogr…°|Iêɹ[†^49;ÿ Íô“³ê’1Š ¯9K ;ñÉJ ËloaÌ÷úw±ù¾Eh¦bÀš‹sëðÌ£¡Öþ4þgÎMÊj#°hf“`r/ìá¸ã 3cÔz2 ‘ò“Wöº½Yr¿8DX§&.Q¦m=W†~yc"/=;@+æŽà6±ç‹2¡Àà%%®Çë|~.t$Šuù‡å6üz¯òÝØõÓÑ=”ƒÆ`iƒCHÓ¢7‹¯G2æO˜ó ¦ô’ºJœ:" fvP¼>uÖ`r½7X{zñRÛû™è"!UòÔ9A¯ÓBðÓÒËû¤×õ´€%j ¤ÊÉjßY}æ7wŸjyÖtîQëýµPøëñmyIâÍ,¥›¡E¢(öõ·úŒo¬Ëñú0ÿC‚ÓšH3uætÑ Æb ´\=Ä×f(ëäߤn*ýïê‡Nf(0¬b×âžËöû¬—Ôs/rMðú=é—”Üis†¾eº}ÌìVXeÄpAÉìÓùà‹Œ˜ fÓ•1ÆóU'~‡µ/V"¦i’;º'%í.(êÏRŸ¥lªå°ïõ¡>¼ð“Hò%éç´ÿ_*jù±•è/EÂVëä6tï8רÞ\UynD¾o‡4ó[{å2kûNÔùéû\BÏB4W…GiÎGáö]Î7Wö˜{îjÁyðV‚ÏÒëàåÈçÚ|“/OJ3i7ËdM¹V@b¡¬ §ô×8¦ÎÇ,œæìaî›ðâHåwÓwú-€¥ù7²¢Yi®XJùT …v\¹ÒhOüð- `›ãYÃ_x,”ã$];me”¹öH"5“C›ýŠî 阡ó¾"ó\¦Áýšƒ@zíÓ÷Lì»%¾ŸPÓùP ¿ m\±%õe?\I Ja`Ì“2BQñœSÂy…™»Ï•O?s_¾µÃð´üÅ6ÙŒÐQPJÿ ±ŠÍ:.Ø6Ñíðbàßv˜Ì$“ r¾-šü^y‚¼Ôr> ]FÓmõ@?=¶~w1˜ÕmðI[ð™äBùr)9Mú[Çø°}èfå"V…•§ ûûüݬ< ’¦8þßVþNñú;ú[¯B %’O8éO겡²k¹÷ \º™iþšø?¯›WžæýA/7·SEþ~riÍ~¿xn[£”‡ËÆ¿vâF[÷¸òÈ<“š” NªTCãí2ÔñÓØÈØ{{é×°Ák:Iüœ¿b.ïpU:u¼†ý¥ûNû×UÈ)úóTbøMzh«—ÛéûêÛR0åu糉BÔÄHéR(Šýša4uìó»¨Çí³Ù ȰXÔ×gåÌš]ã1œÉ+—mÍIüD—9™j…)OÎ%P#î­q—ß]4S– ‚ÄàtsDÌ+T,Ùð.;Ìlב=OékIßzÚ|ŒTÚß-û'C ¿†ˆz£„{½ÝѨmX …ú8SRBF¾gåY…‚s;´['=,É=‡ä'À×&I’W€ÿ?’ß&4:û¼ö zùÝ9¦ñQjñ;!ù#ö¶Ÿk(auKã—Â}Oð”¶æàÑØ9:f‰C(c”U¶|å•˅ÓõOôM÷CäA/8k­òO¶ßè“LŠ¿/º€k —Æptnnç‰d“·s6Óìa¬¯rÿ°µ§6ÙgB?‚º—hïÌ·ŸôéíoFF<Í"WûÔ¡¹Ätà\)ºšûîc)+·ÑÆÍ`I€bÁ0Ÿ×] iŽ%+øzI©éœƒò*¼¨ép).Å\‹½$³¯ªRÌM>n}ÿ•ê¬Ehä'sžÄ•óÒuæÔA¹µZ´³z»w‘<@Û0§kÂØ‚@j¾ñB0€:îýF›…¶qÜBä«úUãvòɪ–©^¤Ÿ“4²ÙÑ/|¸o›Í¨1EåaæwLïè†ñb)fF7}”OßG°;~,Éù·O.Û«††s¹>°£Éü#é×\ì1DæëŒttÛúd.¤Þ&ã¹)ÉàƒÒ0ÎQÞ-ÍC5OÕr =/Àôîü¶=-} þ2Æ~›5ô#}}c’-})0‚âëY•à{M"õKö¹¦QA¢„äÎÜž‹f ‚ÇåB¾ï1èXtmȾŒ.ÒIÈO¢Lz÷’AË}²G@Š=õ€ ‘ü ¤xvZ/¿lÍU¢e 8‹n‹Çh%jí?~¶´¸šÿŠ¿Á¤»ö* ç͹C¡ ï;Éiê44ÁL.ÿ‚eQ?7b[_ä1Bâû9#ô¬^ÿ¥%ÈS=­˜.>ßm·£I³H‡y|Éñ@/ÔÚ¦×à;Ãü5„ôÄ“ÒGú{ô?ÎÛÁ8ÑÀF(s¶Ö㓟Ã1E„òR‡ìp_Pœ…—$óó6½é˜2C&Œåù "xʬ‚Dp™ $mÇä~-ò=LJËCpâNJÍÄÂY¹—C f¯þ—ÏN›_Ï… Û”1}2r¯(0Ä\Í„O&{ˆä‹fijkEËvu™xMº|‚Ì/èï§ÊYÏÞêíÃÖë5M‰HÈ4ô”þ¿¯"íĬ’“·mt„ØH^+d©ú„{wRþÑ{M™%ue6æPÅÆ÷ØF3(~oP–Õû‹ã·dùî, ˆ²yYr_ßÞCvÚç|"Yßå—Ïo™ÌéAÜš äi@Gþ'¢ NþR‰·åa„ˆÎDVãfŸŽ3ðøzç¢OúäܼwPÿéVS¼¼bç5™õÛòñª×Ë»j‘ùÍ<éuÁ|Iž„£a績 T?J¨ ¼ ‰ùW•¨ožâP¿­Ÿ ];äb›åŒ¦’WgbÇUÎå­î©-cèqOBÜÜs(HʰþŽ-ï­öÿÍ]Söžäóï<Þ—…| ' œQô±þ$f¶d$œnlY¶YÔ›­ã‹µ?¸Ðÿ¶:ms­ø½ÿ›Ù–ùœž‚"Ö̉fköc]ÅÍœº÷¿¸þÏË“Œ™«^®=Lylu”h–Ïw²ü!‹ ï²ÈõÚ “fó]>©ÖÐüç_ÿ^©þŠc³Ë6+3u6 …Gß#d?áåsZ&r¬Þ®¯)) +À0tNož+Uí«€œÏòŒýu¦vƒ? þžõ{³®OퟦœË»<Áý~NÃãèg¸®ù‡ñÄŸ¯Íef9ú{ËúÑgÅ^è´u÷ýÞó!½úr>ç/ªûÑyžÚÏÂiB˜þné…×)ôÒÜ È ôøSÑý@Z Ç7ø½i, l‡LYHÕbÀ:ˆ?è †%Pb1Øp`ò3 @”ìÌ›b¸VY¤Þ*=Z9oâ¶ÔççµÞWÂUÿ!šg?]{ó$=o?¬Ké‹§õ8]ßššdâWž6±2„….S‘¬ ¶4 0îŽK%Kï‰$ßÊŠEW‘•]„4›6Bcee(+¢‡ãžAÐuDZè‹ìŽ}HU¬{¡Uë&ã5]$™Ž:© Kó„Nìc\ÁÊè•‘02l‚Rê61ÊŽ¯‡4ã?ªB(™£~Æ&OœÊBtžÑôøº­¯§âß×ýzù/^Tü÷z²Cnñ}ùƒz'ŸÚ/ggW20¾Ï!”®IÕ¿Ïó²)ÅÃåÒ?­È\M‹@öþ}í9ôirù¾×˟ć¤lP·N´gF]6\p‰¸ƒ[ˆ]†Àhœ¤n’™ «%T(€çÕYi„Ñ#¨OÐ(øG¿—ø"Èbóò'ogdßN”ruk†m·©ßo€—ç¢÷xiœ“O:Ú6î*Åüø³ˆ}]¾ªJQ=•ô7°=94»JIvDò½9ÕW°aA”y·ÁNÝ›yŒtèû7ëaï¤cXÖÅhfÒö8þæy¥Î ÀÓ¦LÙ’«D†$¶ãA¿0@Ò“ªHèCÔ¢C~YÖ½cæ‚#rµß.§õþƃâDÃÔöXy!8Ó×eäŒQÎ0XŠ´¢ T7¤è‚T¦i% ÍV2ü¯VD0‹yôñ XÄ>®J“,}¢!‚š³» Ì£«>ŠÄ%Y®4>¶º€@ó„U6·7¯—ð+Ö?bö¶ôŸ³µøLNz/Ѥ~'ã*’8Eý·\î ^Ô­¬¼èü›öùMvKœ“|ðÐAðû,LI@LËçŠ b§`qFàíÛ‘!\LjINR*ƒL‚‚ò‡TSÄ6Âè4‘Kx™á÷ûWëÜßUÏ.çÌ ¯÷˜nº{µx ÷Óôš €Û&ÃÃçéoG ÝÄqú@äü{žìÿ:)þ¡Gî÷ÏòzÝn_‚×ÒÉÒç!n¶’ˆ}h³ü‡X)þ۷Ǥ¾Ù2~·åþ–¾<\ý"¶.(„M†˜ÃfŒ+F}3£)CÄ+ḓ¨œh(ui–TÏ4#Ö‰â¤S>tmt¥Û(Ÿp£ud3·ÎG?&rÝžqôæ*—†eèÖ Ý owf*üŠ5Ïœ±ÕöÇ!50}€îX‰ý 5Y&6mG»5w…ÿœsòvûÈåÉGƼÍ[öF •»á@òYä”.R˜å¦0ê8…Ì¢üKþ9?çø½ /.šÑ[‹ö¤;fjiDY„o–ÀÅ—MaWô“>¹õî/Ñ··×ÚQýB.KgžÈá–ßM·/à·ô—²þ"ô›¾U—µ»{ä¡Ï-÷ <´óó†5 ò:©Í/Ý^ÙÓªÕÔðAÑßDÍôå}l$c9»>€†*(–©®‹²S ¬á‹#Iž›0 (E^ÌIµa@ßQ¢€Hž³Õã^ÓàpíúÄó/¶„ õÍ>Aøzq¼.Ÿ>¯«ÿ]b‡äó!ÜÅÌUazÁÃBZ!5F—Øõƒ~>! +ðZЦ'ô¾Yþ>G¾y‡5Xˆy~¿,–u„œÿ•@|쾤Jóüº¹¿Xò^Kœn> ïßýÇcWFÊEÝÈñË%éÎ*½ בÙcOÉÑkê;kOaÆÇw߸þMŒ²LÁ‘Ï©@öµ•ú£„ ê s¦Ãì§õG å¸AÞ5oºL½ ûÜv|#á6L¹‡Ã]ò¸j/¾;Œ×–ßg½ÛðkiC¤¡>ü÷NNö‹<’ÇÓ‰sÔSÈm¿§3bX¶'„çW×äO›|ºÝ|X_“u6‰WxªÒHwjͲgå´½4BÕú%¨j>’J¾j¯™Šæ3鿌³2ˆGôŠž©{}¾=×0~RzŠæX?‡±Ý:ÄŸ]=©±¯ÕyyœC˜ë¹Á×໋+ÓØà'à¡akôÚ,åö<è/0ò &-Ú¢BHxÑx®å» cóù÷\•˜}¹™úù:tmŠ«7ÔëÀ}“ÇØcú^‚àž_•˜º`¤rü<@Ÿ’K ñrÁy׆ü>ÔÜÇ‚¤iù./ë\£ëÊ»Yä.Òˆ y»ÌÛ2}û_#ðöýÑ«¾µ¡ä²oæ¯äh ºìR9 #‘ä?qºVÍË.©Áà‚$‹y…Z=œnhõQtÊ(Ê—ˆsþw,(«˜ÇÚÖ`M$«_k!{OG¥'(»{z,ËWç ¼ìiG¯ýУŸ? ‡ó…—ý(÷\¥ö¤³5—çò›iVúf éd9}Y=ÿßJé—ëéœ Cëµ·“3Ä/í1÷ ;=öí°쥆. qDèz§D»‘ÓÐY‘ÿuj¬Ã‡¥u½;V×óq·…,Ò&×ɤoìžGÀÿl$!˜ÒrÌwÇ ÿ1‘krçêÛNºü÷@>›ìi”<†¾Ì}áI†´r}ûÈ~ƒKSäý­Và*¥ú{MI¬Û„0õˆ™„Ûsý¢"SFup¾dõÚúÒ¸Ô5½¤å2Vë°°‚¡½R%zäke„ËBº{ò陞ˆbü›¨3Ó‘³2ÛKfì„®7¸[+êòJE°9Váþ§”Gúýreyyæºy08þ:ãa »sþ&¡éŸ«j¦FÛîŸÁ¦¡{S°‰zk>ˆ+ ÕŸgƒëRh3oú«å™¿{˦"K7±&µjy¿.XL6bˆMÊÂ*3ú~êÙ]ñb8Mæ3RÕPùZ™·ñ¸ßûQa›C»KV:3ó«Ú Ûˆ.…?´ÐnìÉuòÇâx?ŽŠŽ˜ä‚9¡6¹Ã’7æ] pšÖgÈ ⪫1¹-ožºÓFŽ"ñŠ4¥]‰æeܵr/NxN>Œÿ]d±J©—Å?3fiòÏKäLr¼6‡™³Ùœg…Q\¡û¿`¶3Zÿm/€Ã>rźBB<Íõgö&dnä@|•õˆžAiÁß•2ìßž±ËŸæË¡Ü'¢‚@ñÿôlP@"½&ˆÄa‰ìü†7¡âÇE'ýм€%¦ÛsBV8²6Ú0¬`'8:q›:X›“Å2Ê2Ó˜ýúØ Õi’áïË$ÔSa4áX Õ ÁB®ÜcljpÛ=J–Ô¨>*ËQL&M!HJ×ÑF5ÉþQþs~a¯¿˜'}A¾YÛ?¢%ílj¡±|`\Õ®D–¯AWŒ&Õíß—Å®ãÒc#ô-SûJQk08zäãâá”ÚÿÅ <]ÏÚð8­ûK×Á>ÙË1U¯r‡ä¿Ï¶°Óøû#I~§· d:q¯:„ñGêï›6PìeùL/bàÿšœÕª”¼ÿ«ì "95m½ýèØh˜jRéÈ™µzY÷6ÿÕ'åßI¹Wúöõ¹q'%Ñ37È•€„&ˆVMƒCsº¤V€ÎA„ª¼E9xOúb‡ÓTSÀ0½ßSV*/Jz3K+rþûý3sÜñ¨—Ü–'IK¤Yì}8ûFFa<º7u}Ÿùzõá…é¡W0äòú*ñeûq£i¡ÝœÐ‚ý#¥ÉÏïøŽ[ºJ~°>|sG´à„a÷!—ök4}iÓ¸z3Ä1*­§ìüËù3›Á¥Û(Wùršz‡Wu–\ÿŸ¾¾<†Š ÝËÈÚ¿wb&Ujb$üˆzrø¡þAÅDrvtcäï骤³VPj®ë/l+3ræ{sÍãVµãžâ,Ú¾„v­ ¬IrØSÒ(€"&øå Ã=FÅCèTM^oÚµ$¯ÌF¹S;»‡Ç¦ØknZm——M`µ/1¢›¬¿ñœWçKÀº“%ñ93°lQóë'ƒ„¶z—g¾wµñ÷c¶ fyò1ºn5Áêsùæ<wR‚¯_ðSüΦÍë wƒî¼.ù膒kµ/âÎŽçô§/Ðß§0äãoÝÏB†D•¼³|{ ¼»§Ed®ÂÉ–þw)$»ëðä9U~/óÑ“@¿³~éÈÿm2ÚÚéõí<äÌ.–ÒwõÓ4ßt#US–f#QÒ , àOh´Í±¯û äf&ÏŽa&ß?§ÏsÐ]KÙ(Éßœ~Î:c7ï¨,ëÈu:tPÎÞüáxo/®]îI~.s@µ«-\:î½TNä(äüw@²ã-9ð Úðb›ñþwtmèm×éröçÅ•fzêÔE@¬¹ßPÌfXˆ“svÓÖÃbÄ&X2A!Ra½í)¤p+cS¤º²œXµoQ¾%ÐRìè':kÒu \ls™+bgrY¯^¥YÍTÓMz%šìXð—H=NÔܦÄ!ù&²´~0&{L€¯EflFìAY)æ ׳Ü88sX©Ë?VU`Ë÷km8¦= ’òüªB±Âva§Q&ñðû[<™ ¿¶;¶)¿D¹B¼µÇv>£ü5fø(ºvlýïPíܼ^Іpô;ø!p ~{UÀëfÔ{ ÞÑþ|Z_Öóɬª¼ 9÷Bq$(­s öå¹kOEzÿÇïÏîÉ3—c$6/9NI70ah|¼Ÿ¢0Ý!ÆgÊí}¢FÅÇOëa)®#¶ï2wi Ï{òh&ô¯\€#ÑabLH%ºåmF2sÈK—‹Õ?®‚Î\¾;yo•3jV¬ô˜/ë3èÌü¹Š›7]5 òp3=:‹‰~V‰„¨Î€ÇœDµh ùô’g;í4`CçôWØÊ|üsè{÷$G¯2yËÌ÷ÔDçÈ%6kRGùµz{œÜ7ê:ð%f¤rì™+ë:ŒÑŸÃ‘Æ´XXóqÅïÂEÒÙ4“cAvÏ›ÈPCzqFæÑŸ" )§õS‡8{ŽÇ_™ŽþXâgÂÊEl`û›ù<™­BñÁM§”¶’ZËç½:ÍÙ:Äk÷u©]:R9ÈÊÔœ¹©aÔ0ùs¨šœÂocG?™VM0êZ×ó´ÌÈBä¯igºL&€^p^ [,ŠÜ}7ãO½eÏíë×°rý+¯X ü±ððƒí—ÆàñnÚ# lzKã—ƒø03Úçó³¤Ú.ù¾Eø¸üD½²»¸)©ûñ»í"AÖ±»âäÂ,‰cg ç¦ÓŽ­_$£!‘i¶^W%öö¨6æpªXÔ¹ƒB!“ü!]…“M‡ksDnæ”ɘá[³4,ëºå˜†OÐÓŸO´À?]oÏhš( Ñ’²‡¤ÂÏdæâ4Ö.»ãò*Þ4†Ò1t>'9¿@EYÃFJJßäÞR)à•Œ¦ÀÅò-Z’~íE¼=Š3¡´ÝB ëäÐ »ÏÏ>üÚÍœÁ¿ÿKýÕ+¬rËG ?Ÿ¢Oˆuô⛸ºÌ‹ür‚šï¹öñh lšŠT<‚æ¡8Šì‰ÔsAs‡_.áù*Ãn¯øFJšÚ4àY³ú·iÉ7Éã@MÍwÏóÞ0†ž‡X8Y<'¥Èx¢o3<é½–½yìM:¾·à,†g>GÅ0œ¯¶}ÓZä!$'’G s­LüŶwì þˆD&)Ë‘?.â×õÌöSw ÆT µÎ„vIsˆ-?Æö ]z +¥º»p‡ð“ß =?ǼðËÁLæ…«ü ]ÿ9k4Îñ%a=<ÎZ*3c´§¢èÊ<Š yÅÈ*bSy4rnB…Žb¦»GéàÆ¾î­^I’¥8„ï¯pWkw{¢£„Øõ ‹D´™Œi#„4\ º 7S!U¢jRþ!,|îfô§ °W.„ê g¯ÔÕ¯áè©Â{ìC ”SÂA–\ óˆh†+rïLi±BÊ%I…¼Ã¨ø,:ÌroÃP庋¯v,ì‚•ÅþH] 5æÔý4Ј•Ý _å=IMû{eœþ%Ö–MÜÊ¡•©. }tø2Ç:,/À±Pcçœþ^ÓÌ/™¨Iº—É3(¢t„àá ' .‡0ò]K¬Îù ‹(¯œó'Y³ëÌ<Üúx¼—•Wz®²Œˆ6>-ÊLKÚ Ÿƒh:{( 'š¥ôìŽJãäÃQ”fàou01Ï;úòÝ·oû¿cö è ûùx檢¹æ<~C˜°:bh†îå¹ôr{;uTÚ‡ø9ùĹ7ªçú:wÝÑŽÃótq¯ë,ùæ*ýÂûµ±päj¥†#ÑF1¹“¾Rœ >MF3aÄþ+(~²+Ä â(ýãóîX£öâ ‹Z{U—i˜àiÒO(¯Ô¢ÀsÖèjç=ch–X|Ž1¹û}~è42Š!¯9Þ.|¡6ò“]×è=¿.½+ÄT*L;t’_¹à*¤o‚ۦ͆‰ûp,‡•e?9’m®ÿ>ކþ±¦÷¥«Õð|ô?”6=·è/ãã>쮇lpý¹ ;­j×ot1 pü› S³)³ÂQÀ7¶Àü “6ðòô„2^©WM-Ò“=°Ö<»Ë¨ÂRtúúŒÌÀaßõÇ ­ß¸q=2ÆŽ¦{Tá)ë·}Ëõ\².’övlÀÓáT!·sÁ,º–Ù¸.® -‰þgKïÒdC!³[Ë5kæÈ#Œ,Í´¤íÜFt¬ÔÅöûØ—ŸŠS„¶‡=ç˜pIÿ5ƒûÚYMôJì#]%˜Ï•®3³“MÛ¯."ì‰âý줡±zÒ%.®Œ7ÁËôýâ vðïÛù›YéÊk­H2žÌ Þ휻˜€ ±»vQùùÝ“ÜÐÛù ÒÝFÝŠ\îr¡>yÓOâ:Eóæ-’ÁìvìX~”âЃ§X`­à¨ž¤¼d½š+ê눭4‹D¾j~Bm騋:;+ÄhE³þ0ÿûïûÉóÓe¿¹o­NJ~ÛlÌqj.<ÐŽ‰þS_ðéÕ>¸óª?—=úLëÝwšï¿ì`c’ õër’ Ȱô *—x‡‡¯Á;“pÈ #wd¬ªp/#JÐÀéØ@ ²Úö?!]u¬Ì å-¥7öíR©žÄ´ Òk×ó\€X#Ú|&¹ ùü5µ¸ÿÌ\mü tá„[&änz]I þÿÏó‚þ‡³$ žAÝ\–òfPË—ïŒ ªSºQ3A^Éiýt¥..èÌ77¤?´ÏÖÙ?‰ãy¥!~ã%-ÈkšD¹—n¿Àˆ˜.]”ÝÌÈ6›ãèÅk.“›®óŸDu¾)‹›=ÏnäY¨ÃS~¤ì4î9èz¤þ´ewk´SeYjhýVø†+lã fÛëaçïÓ"-rÒcÔ^„sf"Ä Q¬:€æTü{ 8ŽKó^Û K?<ÔõˆhÑòçc4÷†sˆ…¿×G6Õ]Üæ¹êô¾5´í‚݆мlÔ˜¾ÍÑêêŒJ™Äª°äªž æVvÕà '_Kë•´N1“9옺ÞWÖ¼la¹žë÷ú©ºç9ü?žÚù‡ÜƒyžËÚ’>cz›ÃùÒ \¿.b”ÿ‹÷(”F··Ђ;²ÚÓÉH°ð’© ù÷W1ƒë[ûgv—}ÅzúæÆhmô÷£6 AœÇ WÏ?åÀê>ÖZ¬l°1Ÿ˜îÐà€áaû|‘&6«¤Btí×oÚ¶3à.épÁt>=mq1&·"¡‡TôN¿"F…ã±îÓ„9㤤C1ê¦ øA¡ÔÞIC†]mç5!Ñ´²ÕWÜ ï!¨X µâa^ãAQœo«9´M’ÿ£Aé6êæ¶våø…œ³–Ùš¨¢«¯Ì[Øz1ãÜz×r gcÇì?^3<­Ss´°|—·ßplè}U(ó¿z x'VI¹¾ÑªèàÆÆÅ"D;CÈ$ñúº+Í´É„Áq¡›AX%* ‘ïPúÿk4¿Ç$æÜZ޳ë?ÒŸMõßî‚6pq“«ˆ¾ÙGŸ”oÜÂÈGÆ¿%É_Ž™¿S‡jƾ—5óÔ8Yz2­=I³nÒE·?˜s›˜H. ÑA¯ä=æ‡ânù¨ Îë1ûýª4ýnŸ“{ çÉ»]¢’b.Vrœ4c¯’<ºÇyÇ•†yÓtÿ Œ„FËâx“” Fà0ÿo7ù,j €{Rǯ²D]w¨Éù·ÍhÍ®>j&Œ•™åÌ+LÿÔ yÃ¥œ™VÄ"ІÚô`»â®\Ñþ]¾­1•¢ª¡ù„ûÂH±™v§NÉû”øDÓ`þÿN£Ô æ›î}„O‡6Iɱa‡/c3þÂ4eºª 톧É$Ù3^_Ï!«fè31&!sYå¡Hjµ*ZÛæç9û`út€/'ð_&ï'ƒÓð„Ü»¹7¡ÝiàÑH®u)îÿR_úÉäâ@uàªÌ¸|§ûBisúè$ÒZyÌ÷æ}aCæÏ,äŠuQ|ïLøó8üúdI |\®øß\‡CF³ÚºÔ[åôÙ}ÁnwÊTx:¸^eΆ·Ú»@ŒÊìlñÅÓ‘oÕnSAÿ•f¥=ïßB‰/lo'ÍSÇõ:[n4á/ñ½±œmpècèVYÈÜb6‡G¬;&ˆÎñÓª±]ÛáeÏ6ž·v¢[ØpÑ 3¶‹—¤â­Ûeñõ?ÓÒÅŒîfäç®_ ]Ž8R”;,ÅôåæÉyƒá¡¾. òY="üÂc%úy'_f²ú˜¯<õz4¾ñùz˜¨‚$@Yuöù÷ò%¨»»ÙVkG5—@÷þc_äphI± [KI±]DU~µ³¬ÖLÏœê2¶™ÉEh¼ =ñ#–c>­!òŸ¿«)Ý÷â-–Xm.ÁzëN£ÓC¢•$jŒ¸i¶ˆ Bz‚/ò±ûqÅ ¢é2.5^*98~t2´W,•ÿA™s®Cn øóz6/ý̬7¼Ýd¾–ÅX4}Œûc£×ÖmÔ‡‰Ô‰d†xLÖÝYQÕVY•fc­ÁÊ’{¾ÉvÏU½Ã„ìä®p¬u–fv)BÖ‡êkD¬##òÿ§Ç$èšÿÁmEÿ¼/f!_Gm£“pRCøg&1ßß§€¨¬ÌEpœ#kuAëâ·ì¤÷ Ø#rwWHqë„/¨Ïù?ƒ«{y&õóGžÆá ÀŽùµY#G•½¢r$į–9õèåÏ¿>tÀd-óË.*Esš'8TC\È,X!R'«7¶là@àa>cVAO<õÎ^lÍ•âŒhbH åãÊÅ@¬Xq:ô£a­é œÎÆz›õ3›w†7¹’t&}|ül`r}mè2æSž›"ýmºÍehà,^…ì ;ÏãyG½Ü•flŸ¯AÑi#ÖÈ.^â‚ÿu0U2dS‰ Ï‹fI‰2ˆ±D|é軃„y iQ¯c­Ù00Å"mrY% Ü>ª·o±²<ri/äþ(ÂÙ¦ñüÑcáæ:ð®$˜_õ—œ93­:tý•u$õ•÷ûòR¨x ¥ uÕŽxú;µÞã"Öª»K)E¹øq$íÜ,e˜+¾Q¬h¨E <š>ö[L 3÷tVõ+—0Ô{}K¢Ð?~Æl‰QuG¸Óhú7ÁoTT¸?Ç}%+É‚ûs¦Ék~½ÊÖUW¨v“^p€ÓðB?»HÀ‰|ÜAˆ{2Ê®ò¤Gë»\1úô°~eA-/ãß®™÷§KbIˆÌ`Bt5›aåý[AÉÃQM™4¥<^i4$†Ë ¯zŒk,Ð!#FØ$RœI†Âcqv±å¶PZe¨H f͉8Ëiµr «@ªן^²Æ<•ÂÑgw9«õ½>ŠÛ5%Àn@ÿöXûi²VhhGTè…ÀâCí’ „ü W ´íþÈÙÁ~aáëZˆ P’¿hþ~™?&ŽïøåIù‚5WÆ»“ˆ›†"LÑjQô°‡À'>”…‹z”¯*Þ9í7²‚nWÜn18ÐÚ/g%ÜÞÀã[ ÅCq&vŽaxM‡âiz"œ¯·äãÂ4(q£ø}õ©›úÿÁß߇Yñ!°^«º—µ«.Â#çÀjBL pYÉ ˆ’© ٯ  £ÅÐÊí«¨’,×úç-¡Â\Qšèô#(«4ÿ®ã»÷Ýý]…·óü1•¾#mÕ‚þH¥X±~Mù•\žödÍó)õ!ÄâP³E«1”½û½¼ñî‚xôèûe)élÇ;|ßëºÑñ¬FïŠvDÍŒ„¤=ÍþÞÔu¼&MÖž–ýtà·×<ÝúŽÛCÔ˜'æåžŒ"iÀo{ KÉ_hÝÏØ(ý³†žÙ†2}vÕ¢?É%8ŸíX¸Â1Þ)û=kè¿D`Ò žîê¡f^¸åÖßÚút_}H­»‘ÙËnüÊÃf€4J¬îK55á 6ážà¶x€ÌÖõ½ð}oZBbÐUWK.¡a%‡«®€¨EcU`ZÜtƒl¹˜Sn`eì:½uYG`*Þ—D•ªÊQ A1!!ÔÃÐî˜Â!˜¸¹^µ’dɬƒFénDé—Eè8JDpÉÀÛŒ*ǰ0ëÁM\QÊź!¹MC–7…,º˜j%>¼ÓÃ&¸@‘ÆÍPžsÒ|SŒ %°1^¸LtÈ(@Þ .ɦWИ>m87Unx…’e Ïj”„ص²iÇÎQ%‘tjTPóLNTÎç\”ÊuyfTtÁØ™A•ZP QÄI‚•zcÓ*ÀôJÅìÝ)ŠÀ&Ñ14Æ~t»Êƒ‰¶~ãùJš¸J©…L—´a'(!Ku‚à æŽaMŒ&ð„ïŽ|ÅØõ¦ ˜>ÉæÍ5Èu¡ eãV }dD2–MûZ¿\¦aÔ>°§«}éùìrý°g2üRÏ¿·R~Bua笶ö®“#>¸ö»ïÖ©ü<ÚÄ aP§7[;ŽÔ,5µX¢–QÃht–'še§-¶e‚D€<UK›‘•dUhýáŒp<¦äw×½e¯$.*çRÏŸäìß&ŠšvèšN%W°òð_æë­Ò®¦Šó,¬²ô((ýGA,–‡&×ÈJÈݵÙpCÑâ®VÕw«½6‚/°ƒ/!-¶Ñï Ø¸lejÉ"BÔŸa~Ïç×ÞYó-º Ð9JUÚ®ÁøÖŽû™ðS¿Hš ä‡öû¿m?¹Ãkžµ‹´ ;e¥´?'ÿv<&Ä„§ÿ&àyWU“:X]å(|š WvGê]:uúü1yEëš+<WÚ`\²áÇ »ÝßÅx+À.>É“aÒAû¨ÏÔªDCÆÿ¯øø²Fá«îÏÂrŠšÆ¯î°(À_lˆÈÛ³23sÓöKáûda6íG6æ2:"J‹pÎ$ãì3ÙZ= ðŽ=òþ‡%¸Êìö¿˜çÝVþþŸ1šªïâ g—æc·<µç{zjïÜ¢ÓØe2Ê€óbj®w– j×èžõWØoÚã©õ ÞU{’Ošª ¯ÉB»öuè-Vûºÿxß,üˆN²ÇÉ#Œ•öH^6Ù„àh4ø]œéŸšøÇÜ ˜:˜¥)úTïrüxµç׿ßÚÒåNV!£’‹ï!ÍštJ4L§‚IÒ -1²Jåk”§6zm¦–nà×ÂÆý8õ™N}ý*$ãý‚/¡d!ž¾†e9\0} Óç.æRLÙ~AfXPóuEÚU óìE7<¦«÷q·§ògš:3··O­ïr8ª ôå:úÉÈ*ÅôþÍŸlœÌ9yëñ‡PJ+(T_›oÈô×(¾¿e±ò Cm2Ýte6àÛóþâ)8¤ƒïœmÈ‹4’<åA?ìU9áSa£ç¾%y¢ .9Ò¾Ðá›äqGÇ£O¼¦óéÞ! Ó±Ì^^æþ¦¿Vªlî‡>Üå“?S“œf#Åæ¥Û¡Ó”þX(=ÝUËó¢hj2ö¦tøÿSŸVTKÓõd³¸ÑgPËX¹Ã—S}䦂þ·Ž…4dÒE~ßyoÒ¦^s®Y+"äú\‡\¯ô x¦Æ–›§0þ¤M ,H?¥z\þ&hÍðº6‹¿ÌMØÊ²Ðdû?aN×ìutÅFúè>‚2º„æ)D½§ÚDušA¹þ‹ßWòÞ/Ô\ògS±Ìœí[fäãMç2¶žÛ {…{7ëfê4 æbÓËuUáYïUX2¦uÏ¡šZד¿p¢h5ýíëTßr¡?–}-3ü4[]ÖPfF!Aap¢1•²[Bï/©àï5ëØ­šG•7ŒL°&Ú˜õÙÀ•twýaZ®Ìß…X ÅÂ0Î5݆AuD Iòô××yþm¸ëçM†¬3¿—#õ¨%q¦6gçn,¾@Ï{K¤ANaøškŸL‰afŒô¢†#}„ßâäüE?¥¼hÇQ¾¼sëË—AŒŒcUª\Ç‚C.Jx|È)»·F¡>ƒþ¹á (5©›Gò]Ѫgœ[ý€¼ ûßýT»§ÇQ×±mZeùú¹µ¢t×\¢R' …€™òòØÇÑÔ‹#Êö3° |FòP¿%Píø•·è\V~çöd,oÉåèïo£U¢ùR_ÎC1éÊý}È4êÑ€—'3{ÝmÌßÄWÖ[§VŽIÇ·7f¾Z¯µâQoxW(8nÖÔ=íªËç‰VOܳl'-N.ñyÄiðqr2c×?åã9ÌbG3ñT¡“ϧ ;}–›¡ò8›1ÿQ IºÃňA\qñGò—êL´óû ø›÷šJ?œX_ïoí“Oš¨•„éæ°fP;2C‚]Ãýx¼×Cmw|GÐkâêÛÙ£ûþ ÓBýQº 0ôX?ÓѼŠ ¸]èG}¿¯/2Î…í®|—ΦР™8pÚ¢øH°ßº¦°†ý¾¨®º¹‘Y`1à2-ÌÞ±xk;Ž\û¤#U&@‰öÔ”öü³äÍe_Èæ[Ö÷‘? /ÐÙ»6þ¿Ÿ>٨뾧é Ù™|®çãøxn#öËË'ïxð¿¹*/GËEúzòzë¶ëài•»ì0¤ä!qÜe©a•X™*|th7Xþƒv¥†[ö…”Èpk–+ž]®Iü3=µúðG‚”X"-9\IbìmÍ_”÷²}ãÓŽ†ã”™f@šàf¬Hþº,ÉûVLÛݲfˆ6m¸7SÄ»°¬.‘fß5éW°ÚMAª£Ià~×6–PJ~`?(ŒxŽ9åœVJ×»Ö+ë®ïßdCˆ­>(àCÔsV2Ï䞤/ñHóe$]TÝ1\<5ЦÿW¬¦DCɽVôù¸ÞctßU³ƒ&á;ÆÛ{D¥ËWs[’ÀY2LëÏÁXç2|/ÓK€ô=¢Fh‰øÞßÇÓm‹ÈunGA‰Ôä»Öåâ AMÎÿ‚x欸èj€“7:Y ¦±Ý-ü lå|¢Í”ñH…Ñ.oBýJwEA\^ž…@ÚÈ:‡Éßfûτ埯¬ûÃý\G¯gÝ Â7†5(|ý½7/|åÛËÇN¯ù/͸S{Ün.i©ìîûŸOj{êCÒ‘¤_®[¼oðžÕÔëȃéOkã,ú“Mt¹w ?F¾äî÷¶0Vt¯kõ4Á}¾ÖØìõÁ'Ó Vh±U–¤bG<‚• D4rD`ø¤„‚ã"e•–?àR#Û:LËMý„Ø JÃ[xx¾?0oÕ[“ìÒöÑf ||àƒ³ R,¯Äyå(Ö'ãáå—V=Šö|CéÍàà¼H:óÏù7ðdÅ:“†fñ=wˆÁùÜš5Y=€Q/b|{hlþËÕÖFçYoø¡Y×À†VªK›ïûGÎ ñ‰Úuž[#B}oÍJæQL›®^Y\Èäk…¸Õo¹>3Ûø^O¢rý½Á±ŒSš‡‘(Mtì¿õøBüíãD“Y-ž”Þ(ÐTéÐÅ*äÁÛ1á¼fŽZg‚Ë(¹>ù9ïgÃîYÏçE÷ ¿è÷NID-£F÷"ÃF½µ4;§9ÕP É–q‹G¿¥~·È÷ xîÓãMB>欢æ/7‹ºHŽ€ÙRç$õ*ŠÕÌûâ´”¯Q"YýžøeµBÈþ C°ÈFíݧH×ìIòàþ€!¾ü{{6älР&è¯OÙ &ìÍ”zÜAìÇpÿS‘­÷JzÝžbHßœý…cŒ¼¥‹Æ+¤HsÒº~:Í|¼Þݯî!C~‚ébä¡Ï2Y!~‰ÙJߢÒ¾Zƒ/(Lœó™fÑS£-¯[’hÄðó¸î C`E ú‹ß_òWý£ õìß$ê{‚á?¨LÈåèr˜i ùöN8;@ÐÀ:E±Cæ…º|íiÍbÿ§¬ƒ”˜çüî—>‹]©"rÔÕ|±¢4€Žoz»ò¯oe_J­Ó %ñ,•Pý_®œ¼ÙHè‹#µ·ÎE@߸OI«¡ð3§¾U>áïìAƒþô(Ý••'í³Æ ‘ѱ,bQ®Tr×RZHcú1šðW’ŽŸÐêsèPš¹ùÒˆéûLz}/RG#ÂÉá–?ÏEjÿ¦ ^Ý/x…ØaŠ„VCHÐSv¨(?9êAÅlÒxÙ†jD„‰¯.ð„ßEšÉ_â uÔ臦 [𮽉ÿ¥‡ºÇôf?8àIq•W’ ¿‘^«ÙyݠЊ ÷øºêKH$ ñJƒigaoI´ÂŒ‚ùÃb‚Yz¿âÜìö|uMQgß’9–¤-ßý'4êÆúgrŒ"m¢¾f@Â2a…&º†¯O=‡¨¼¦ˆnß­•‰ §­q± ¨üõKT€1­O»>ÿêBpÏxZéÉú‹¿ îÓ¢¼sS¸“+$¹}ä ͽî·uKMv=ñêÚÞ>ýM¹~ÏäååÓž½Ë}sɤ¶þz‰ÀÏ÷ÿaPp~Áe˜s/é…‡ðu¦O2‡Å¶¼P>Q»6ïø2.C‹\x|žTþÕ5þK-ê‚S|Ø¡ó²!§¢ÊE+u·zH™){¦WÓ2hyŒóæøÏ!ß^ /™Þ¼R“_ X[r&z²Õ/åûüÊ@þÌ™Í,Õ…ç‘_ŠŸÝÝÁ­ŒVÜž–7k—£Èùjœ?ë(u Ü|vÂý6$üR•eaG äî‡"ýÝ’qTÅ>U4î©ÿ NËgÿûÃø·…•ÆhóOÜÚˆºì.4ŽäU¤ÿcôJÇì±’%û?Mæãù«DÒàß*öèpaÐNáv4ÃîßBú×á¹ _·–”ÚM2 §ö3ÊkªbØ)äÜ”ö–{v›µŠ]ÝŽ/aÎ,}v®}¹|î¯7êï®ÆÏÌ9‹:‹Ñûç—ì?=üúÏççÝê, œ„n;‡«@¡\òo‡Ü­–΃§#è>Áà+à}š’®$PVÁÉuDO”h„$ž¶l©ŒŸ ³ê_„ ‹ëÊø{…9”—“ìõ±ù2ç/“òèÅ °°”JK ¼<`"úAÖ û£2¢N˃õDõ/QyxkkE^_ÙM¹~tWÔ)`=HÅn(ÚÎ ªVýð/·£.`Éï¾ÜÒÉØéV… cù¡ `ð\CÄ?Ï0«y(Œ&kÝéí*^-XXÓ‡#]}‡û“XýEWóí¯™O×s; KÕhoDãëóÌ(ÁäøÜÈZ/ãsJ8VB’9‚3T1Uc0¯N‚$IˆaÙò_*$‹õ‚>GÖ íûv²÷{ûz°³Þ\k¾;­&Äôÿ%}WäN2(õsw§³Xa¿éˆø;“Ìq±?Ú¾¬*þ¢Q¹¤ Lâ˜7îg¾ô`5/Þs$ò¸©ÎËfõ?6Ùí÷~)G—˜µg^×ãœËQßD¤´ÁöÿÄsø3W=}¹a:Ñ`JÞ²¼ˆ@ĺo`¶GèÛ5Å+¹Z“íý¢Öæýšµ•G‘2ðá•îoa4 a•(E£,Ìhyžbo7¥B+Xcnx¿F¥7‚PH^ŠüsòÛâ£ñ;žm×læ[KfÄ'FqâàöEO£¡Š§»'Ô¿"ª„Àï’ÿ?yŽ9ÉyŸr£ˆ&\ŒúùÎÌ¡ WU¬žè(hÚ„£¤Òà"?Ñ R1§PpL¯çdü£ö­ìÀÙñ£æz ¹ ðz#KÆÊɵSרþáÓ˜ˆüKãÓý¡aAéä!ôm¼u×Ί$½dá=˜L×Ęá…ñk¹Vãmçƒz~Å j=ð(ˆÖr樘Èè .¡3ñ"kô™ã˜wy ÓóDàjþкaãžÊöHuø¶ôýÅ*ª`ÖFÒÇRú¼–$‚b% Âì[ÌË`É“À_…ÿ"I'>âÔ5³~ª._Ð.Qð<›ëÚ‘–ô^#ý‹õô¬+q€SW ¹™üí¿é\´çÐøÖ-->SW ezt?Öÿ„ñ+6Fé^áêœÊ²±Ÿ|€ºMíΚã `Y™e us½ëðwä/‘ÛׇC4p§ý¬ôärú4@Û[èX›áÐ…”ÀA7@_䓤ÌwY¢áb¹©?Õï3m?ãuMHÏ?Ÿó½ýÍOàF¹uþNÓŸ­RÃù‹.»ïò0=ͽf(B]ƒ±Â8r‹Vb›A/¶«ã÷±S†€@×IvåÐåi—Oâ:öÄ“–Yzò’1I… Ý%Y:§ÊZDð×N•42î=Õf¶»úð²ð ³üîqò#o‡œm»ã¼×Ç|lùRekö˜¥ 7)÷íÛ»K ¢Ãb¤°jÈ4þƒ«i´€ž EÆ­k_ ƒWª§Á¼ œï™~§ŠÈ”} Óö½§ëaŒôâ“x:h6‚Г3Ï\½=Éêédà²tw úFpÖ¼R¡ ×\u¸2ÿe9ñ `]³iµ=–BG7h(4™iT¢É¼†"Ü»ú`¶‰E}:çš‚ZN…ÂÐrp)ÛÛ&ä².ƒmø¢íYE]““[°€‚zçœäl#»EÔh›ö LI{F‰äÿuW ô's^´îs†âÀ//”ê‘hÂ*ý{­hOEUj_Rð-HªÏÜÖÎ:üß»h1øGcÅUE}Eä¢g…¡v.Àà CîÄž ûu Ò cÈòtÌÏeµÌhz ô<–vã! dGÛ:c)ÀvgPˆùÖq- »L¸ˆƒ[º)òIŽû‹G©Èz{íþóüª÷g•Mò^YÐx͘ì¾~žØUÏ¢Œ©Î3YBXô@É/ dކ݉™ŒÏ݇ڻ©lXžNg1ù FþÀ:~&×½r<*$ÇN¡ÎÿbÒÃÂcù%ü'ñ„ÌM}s––·„Ü,ˆÎä¢éa¨d¢†5ìG³= ʤ%ÂÚª‡«ElIÇ?Ñ/drt€P½–šd;ii‚‡r §^)” M>›7%\‡Ïã¯v`Ùög¦1¾”½åwhLjÀ”UÙóãÑÅãœûZó4Ã?Ê_€«¦8âþø¿\ƒLšÝëåòö%±µ´þÐÜê²aw˜Nõ EµBÓ5eqˆŽ©²Rr¾ìQeè WÉ/oË4­úÇ77}ÛM¿óÉ_¹UÝ9üT;mñß“SÒßÜ Wõ%• [Åé«Þ [Ì•!Ø…jül¸Ê\Ü¿ŠuÇðãw$9Lß óôhÖû]Z¶Jø@U«êW#$3éêœåÊ ÿŽßÉÙÕkÝ Aå®Î1µ¦cÞp¡‚²‘ŽeI=“Þ˜Md˜ÚÊÝ€™¶l‹üÈ-¬"Ê •\`Ê@§®kÁ–Éw¼2‚­Í7nÆç­–œ¤]^C°ë@µPýÚÚB+¹Ž\q—µ8«z$燖Z *Ú¢žLÞùåL÷hBгãâ*'jI=zÝÅ ˜=èí"šÀ›,üdz-flQ?œoíÉI\Gùs@ÀÈ3=5ðuÁBxî¡.‡\›NcÜ`UI±<»cãTžfKˆÊ\–èàÛÌyÌ@[º „Q ËÀÿóíÛ ;®k+”"d@ôFK$‡QÅoØÖD+/ñ6nÖê:HÛî«7 k0îzn¿Ù/;CM½üö"@eQF)ºì Ô{¥MpÓa€{ýlâ7À»ú¨ÔdЭìȉÔkX¦yÐHxsœ÷²rWÉÎzfí~¿NªÅ{ÏÀ¿µ¸g[!èv²@JðÖ±˜‡}¹ð…òíA¯®¾˜ów’×a¦t-þÑAHƒ‘ƒÏÓÄù|³öòܯ ô\bèñ“¡ïn¹ùh·lnx[@ôäAúb9¾sæŽKg&ó¹‹_Ü8—÷èÂÉö|y³3×FRzD‰dÂþçb‹ý7b}"¯ëÒe#PñEÿ*®ÅŦͼ¶î1æxûôC:/WÚØÈI˜¥‰ªÄÛ’ÑçÒ-Põ&øAòD¯¨e£Q†Q­òVQÅ‚:ŒþˆÏ‡«8 ´êÆÚ×ñvÃ?«Yh D€K¼„™ÄZ_Td•sQ9>CVÇõ0/o÷,KAêé‘ÈØ8890B¶Ñ· šº‘YÌC{keŸ²Q  ¢ùO’hÑé{¼,uBÁ›µöNçlˆ{|äónnºœŠ~eÒ¬¬÷`fÏd÷%¼Ücñ¯ž÷xQÅWAâꜤ5ÓÁÆO‡å4ãûȽ1‡ÔLÞŒý„ZnëmþB±H¡M<ÖqåüE£9ƒÏ˜Ñ—‹…˜æùúß vKÜI[úo6ð-Iÿ^ÂG;'iÎ i“æQVGÌ×z ö°¥ ¯Q~þ\®½À19•ø´«9Í$/òäW"£f*÷5õB«+û¼¡7ïÛ™>ë\|ØtUÚUȰðr÷G>f‹“#ÃEåÞGçÈglÅàLG–Ó·å¶]wk¶ý“¿OX\·Ý96(`ˆ~‰õª=­¦‹~cˆúw*‘5U¤9}o½*ëeþ1§€,„…¤ae^¯–ßÅ? Ükîò< øŸ"ÏœÖo<1°J‰ž·ÕÌjùí6Ð>šË勹×S 1;:þшËÇ@] tkøáQ(ÇÌ“ž=8þp®—Ä=´Pž/ýî¶¿{»žà»‰ÄØ5Tm%=nZ³p}Ú¬l*z<¡vû*‚×^ÿ.?DšíñÎ2Óöã„­”pâ"ºá~hŒõÖ9ž²¸ÄŽÀ¡IúåŒ7ÖÿªÅ$]Ãâ·‹=Ú:““˜Ù+{—KO6tUò{˜þ‡/XvsÓL¥;÷”õÄ\ûIŒ©qš@\¢Öü—mÞR’z;íýÉ3ˆ[ZRã@P ‚5.ЇhæÒs ’mçH0t†Ôƒäó«~½i~NÐyzoÑ¡o%hüºmÏ»^Á?S¸`äé£þ¯¦ª«˜b‹àhB~MŒSûDy{¸Û÷D,»ðp\D¿Íߘ{ůiyy(é!I)î†èÂs=ONQaZéúV—‹ŽÓèNŸ$70x<9ZÔÌ*n Õ&Ô󦳓“Ó P²1ßšU»1 ßßz:RX/Ù·,ZRŒq=ƒÞÔBSt¬p¢1E0#\^B镈ˆ“>$ûªÛ†›C‘]xÊWa}AlÖ©¡TúÜë&±ž¡k[Ž|š8Èài­°ýZÀ(‘z0-2Éå z<}ßÁ×nbU¬>®—bf;-Cõ™_ÖíäöE“í”7å;:’Yriôp_¡5¿Ãµ†t+÷4O9ùç—| ľ‰ óßLö¯(ÿåÜFôÝDE:}Ž®Üljù.úú;¶EòÖfgèŽ>´V¥þ@WˆÍg`p™Ó0ê‰ùÇânI)a‡´\¼»ùÒŽ_ÂRmÂ5ÐþËë5 òE?ÏRþÙã$^åÎSÖNä^?Ôp':Î~XøÒT½‰Æãwö²yê1hCôžú=%ã@ì‰|}óoekÉCžÝˆi ¨/Vkïog䉉Y­ñ½«4YT;–§/T1 èaº*âͽÝûu—»A(¨k0Š¿V¦hNƒß r¡Té録©”®cãÁ+ßî“riï©%Š-ºw¾Xo%¤¼€·NTŸ:µÿvÇiÅK ³Ë ‡YtE uÞAÏ5U@¶°ä¨ÏÓg°ýÿw°G²aõg9¼8*…²x~(üŒÎ½#>dY@´ ij†-6÷º>ÄÎÞPÒ´F”ç xX^t~cI•«úc½]¬ËeÂG ÷àáGÑÕú»–kN{üfYž‚îDÈ™Åag~¬º§Às„Vô1¿öSXä›C&¯vXH~_w?çìÓì4<¼{}—)iŸ;ôM9H¶&/ۢʣs¿Hl>œ¹ôÙ,°üj_{²%òÀ”·Ù×p¦7SÃXò«¤*ÓI—ñŠ „ô¢”¢ûÐ ëZ xÒQ!™O×6S°dßâ01ý÷Ì´+ή·¡uB8KP]×8ÅqÇõ?I1ômÒÔõ(”ÕdTýD‘MÇøÒ¾o8Çá’ã%Å=°¸§™ú¿´ÐφEú °òçÚ“«M”rË[õC=Z\…ç23Ì†ÔÆOï‹ç*A‚§PÍÎ+r~æ@Š52øíWÌ<—TšÃÍ;Ö8¿XÇA@eÙ]* J/ƒ†˜ –Ó³ÁáTYþ¹õÕ5ñÛ9¡*/`UŠ·$ ÖZ_;îÓN²1ØôÐá]vÿE¬êK+ñX£~ÝV"’#¢ƒÜù£@”zÜ—®\,±VÿüÅŽ&óÊ•Y+çßnüÎèùë±6ã§4§áé»süƒÏ37ñžtSñÇ/­(ÔÐì$éÝ”÷F̀˜ÍSc÷~¿hé€ذ}‘)ði µêçfËw[ØÜ”–þ`w¨SÂ@Þ¨ýKw…¨¨¥øùö+×ZNðÕ|d4xNInH ÆÑ ó½úIõkc”¸•«ൎ’ÑóÄ=¹œ‘{Ä#_S¢ ì‘І< 53ä®sŽ,|!f…aÌCê~A‘GÕz‰ãUZ­úÓðõiºî«E¡m¯:`þ?±âuw€X`Z©¹rÑ+Ž»ÞñE²FÙ•$ûrªt仿\–¹µù¢NäTͱ>¡ÉH¨ŒSÒ9ŠT×ñóôfÓ˜ì«dïКÂmßÿŸÔZk[‘Q öZ²8æÒW¦ZÉÿ1áH#Ñž˜† av 7as*©xã14í>°]R}aæõÍל§ï¾ïìßoDóõߤºOÏx²=9GøS¤kÇUý€.Ö^IAýƒ$ãz­1­d§uxÇÐGæ,õêp"r–›U#Ý ÷v¬ÝÞw˜Rƒ&švX£æª¼¾X®ÎmÄÄàYo¶^—%»öÑZÏU|ß1ðÅŠÜÆ!1V»F?•š+³]¯âñEàÊql–yà[˜Æ×j¿N“1ÇgÖ9°…)Z$¸„.ÁWÁ”šu:›ò²éTbÛgjDUúd$¥•˜²s¯Í‘æ[h”–n¶¡­¾÷bÙžÿ5ðÌÓâ¥hy÷ŠÖ—?êýšA#¯ø} n+WÖMÏÛrfZ;.[fÈVô­…ˆU¼k¢³©ÚçË4ý±¾ÿæ¦ [5sÊ΂-òlÞIGõ@ô×SÃ"‡Ü­×¯C;ë˜Íñù›\W½ØXs¯ß¯©¡,hÒI¢é—BE{ÎPFa¥!U ~|+ÿ+S‘çØÜùzv›÷³M íÑüµPVIH.'ä¯<Ûà÷ü Ï Æ*îZi%ÍU'Áëoƒá¡/™óÀM!&|øðÝu?ñà³ñظPûv­õŠ™p•ã[Ó2äNüÙãJeN¡L¨"„‡'k3ëtE+ú*­ÝÅUjcSR:>±Èª ,ŠDz‘ÕÉÇa”̺ީþdtv€>à®kû-#ŸÕrœ/ Ñ"õ›¹3­ŒÛ§IA3'0JÈÎ`£¨O 6œ´Àï Ùo†&÷÷'k¹GQêážÑ¿Þ! ÅÀ ·h¹‚´ºË‘ Û¬ÚV`æØÜ]¶Õ|¦A5E¿+‹o<ãœO1#Vmõ¼Ô{ÞU4.ëÉÆËr‚ùìñc” «Â.AaÈðzµß´}öϲû®ÊM·íd ðÍ!ú÷ÉV.ã¯|k¾kÊñÝŽ 6Їs¨ïê8 FÝ–ÑCuÓ@5s‰GØS¾›òÚ]‡2e<ÌÅØ¨˜T>ân¡{"f†®Æ¯äß·0ߢ x§¼ WŽPà´W: ÏKÉ$XGQXLú’ä«Ý<ô.œ³§±jŠNˆq` Ò…3ðच-ÖQ-O!fÈG1aì<ë‡TvF®c/.?®‹-®ÕÅ®‚Ú£¿‘ëÀÍ•¾–#y|ç/È^ÃKB7ú”‡‘9Ój‡Ð£ì?¦Û§$€Ü_k'ÊMØ)¼À£~Z:–øMkþr´‹ÈqhÔƒEäâ?žjîVEZˆ6φûŸž\´êú9Òä’×Ïï_ßÂN¿ŠwðÓ·ù?б±ž×N s9t;¼‘ËeKF£gP—$國¥ß,üÆIß^Cr%n¤CôQvæÈ’µ~ë®ô/=#›ŸDÿ?þi“?™¹Ù‹m$äRHoÀŸV¥P°?S,€³ôt!øJå4ƒiDõ…ÂJ÷ièT¹’ßË3ÌSüxO⃗ƒÝÆ}ý—/]Mžœ3åß!'› ;# äiR9ŸnšÇK~RÁ™ ?.WÓÕ(¦™øÔ‚‹)~ÚGPæý—û,¼Ð³¡aRòóèlÒ¢‰)ÚM…QWB;5]N‹b?Ù¯xž¿Átß*ù½éhÁû®ùMvr¼Q1ÞQû5Qów"7÷œ3†N¶tY/‚Ê¿È0¸Ÿâü!ó9È;i»D×Ió{Ú„íR-ÝþN_,CŽrØÕP?YiÄ)µðEÁÿ([èU_,…±ŒÓ‰TOG~&óvag^0†Ö ëÁ¢'¾Ò¨:­—AŒ%&Â!§©FkÈBþöXs»RpýˆÂuÖg+L†êìH@“æ•Õ% \ ÀOÖgЯÕÜ °@ ú‚‘ü|]R{û4b/sȵõŸßªô–ŸÓ…` ê¯AǦa1@v#ðB1¯´C†,Õƒ•(€Rr®“ À/ë(vqP"tЦb!ר‰gmMyi®¤(€<0-(i6Õ„µV…‚Œ3‡ü°nÖ Zl—šÕÊý­úé“Ïïäò“~ágÙöÒ Ûz8YƶÁF£7V¡ÎõJ@׎*L^¹µØUb »ê» pHЕA”.¶Ë§²ØO9Õ‰b+óññAd£%a£Q…Q/tÄ̧›ô\:<8ž³ÞñåB–^8cÓ÷Ÿöƒ¦Ÿš0ÓaK¾ºŠìý¯Ý³xP0ÔkVp²M=‰¢5MbµHZPË ®à 'ucÆTP h ›jÄ*G·Àîá0)»7^QöIäßA).öž;‰à!ý±Ê„íòúóÍ“õH×åÀ=m›•žÐ÷=ûôËßôI>3ápŸ}pGÔÜÂ¥Õ®\w­c*ðÃÙb™l¾6…f¾“ J Ó)Â!ÏŸ®!ÓÁ F)ã´§Á\IË á·h¼0œh 6ƒø#YxGLHU…²þg­¿—ɼ½ýú¶¤>å‰|ÿOtô}ô8_1Ÿ€…Üój„ åÜbeñ à.:J#`D ¢ØÔAa7õœÛ^!£½FDسŠä^E)byG@fæ¬B®‹YZ¡ä¸à‘BG(<ƒ ‡ƒrÀ@ÛÆšs˜ÑQЊJc$ÑéD²‹^´b õºjÓ;b†+èë{¿GŸ–¦õÇSÔ‰îfûíß®› ç” Åv?ï-IÏ#Óˆä½óvùéSt®½&ÓÝß.ß“ùYt÷ûeW7ë•ü»×n[}K4: … ÍÖ )jçÛu0VĽcKÓ®ÖÌãm¡¶È:)‹àæðü6÷ÜÈ7Àý²¶I?Š1‰g¸K(Ïå“°Þ½¾Ýç©§>yÉ Ü ˜IPiA›ß\j™——Cÿ¿\åñéôÖŽåwð9 Ÿàp"W²È™ŒVÑ˸¦8>߈Wnmññ¶a³î_ÒÐûEç·Uûé EÆyxXó§–M?S3ŸDz.óüÀ&‚ž«×÷ÐVbÊÒ#Ü[ÂA é¤PyB!îoϧ|È/SAC5`7Î.UHîãÒʶ®Ü (û«ìG.Š™L}„àþ> ”c—:þ“ ýtpo'Kïmc''-*þ]ªìŠ=Ò™w ºwgäO%“¥y«¦Ž7ã³ ±Ð™øÏìOÊõ'Uõ6vÆ,ŒO±JBGû]ûæJÿŽ~ã¡JT0/ÓMÆØ—Õ‘í; ¼™ÛåÕ%~¤ez8¨ÃUR—™„0™^=f—å–Á,]I,h²OÞ9yo£ÍŽBÉl^?Ä&ç%á >î1æKq©p¢Ó¿¸Ãû~Jõï˜Gûª#ázÙeYì2çPî.þ[Ûpjï±ýºÇŸìK_;oËpE S¡G{ù ܃·¸‚¿Ê„£Ý¼†NöO~<-ýö…ÅM×3‡‹ÅmGª-¿a  ÒàFäq5œGß"oþʚߎUÕåÅp“’Û·oÊß=YV©®0|Ñ%lÄÔ$i>ˆùa%YáÆ§Á&•?e”SûnU?oÃù ¯ 'º51•!ν‹_—äãí>ýBå“~Ñ/ôœÆ!BÔ9Q·#ýµ¹ó˜¥†ÄžEý[€ýé1»>ë’ëÖ :eé曫ÍÞgû5Ûf™…–Ó©ò±…åÎs¬·Hðö¡}Ì’:¶·=+úGËôQ2ŸÖ¨{Ã&óÞtíÏè$–8³}W:KK¶þ°þ|P¶gÖ»Tì>[| ÓjÂ(¢O”h^©ˆÝÆgÑ¡Žt…t´v@ÙñoÁ K+÷a¿êÂÏa$jy·tz˜™ þj‹Oñå¯%pèå²ÁðNX €‘Ô¡±a[%1üû›Zº•ÚˆOøQ\ËÑó`TxFoŸEH†º©Èœöl_^Û8Š 1YæTC3“å€×‰aÏ–®1‘™xö¦¹ˆ ù‘–<àS”Ý;«LŽÐè¨lOç‚c@¶è5ŸêèqœÊzú<åQ&ªýýµ§”¹t´×‚šQ?7ýì’ÙЛ£c4&xs¢ ÝË]Ž„ùóßàùÀÿ_ŽºîD³r9a‘ªŽ¨·•å·*_Lמ„òü%óçºf6>úÏ;›^(N»l<ñ<"ö82-£p¥áÞ-¥Ù0/ûÞš|2¢‹á±çŠ^Üzu“9aiq~öa?oøk ^šI¬‡n¹&EöªCæ+Åû'œ‹±Â==s%Åäî¤rƒ±Ø,ÿ¥ŽóMp4çKlÀ +™Ž-[.„º-ŸŠˆ@SÓ•;«LñN›43aÂ3‚c§Ðw]G˜þ왇±MÈp¾=¼îMù0¾äFœ¦mô·í qJ¸0·—µù$ýp€{­§ÙÀ1~³A e¼Å³!ÁÅ~jKYÇVªTŒ·.p’žÌ|sÀ‚7‹5KQ)2ýÒBZÈ- a9, ÊK—äðtë0ËC&×OñÄ`ex×àP[f ÊU×í^4|”¸zýйd­ÛÆê7."j´Ù°B‡¤@ â?_' ™º¢”þ:=råŒák.dý®«?Y™`üþ† m}=|gì lZószòW#ãˆÅ8Ó©Ÿ¯¤pd¶…èsøG·²×°maòÜú‡Ÿ8D<Á·£ÆÌûÙÌù#Åô°|ÔˆòâcëS]rmNq&M©< '|²L…`ÿêŸy¦&`?bõ¿TùUÏ“R‹ÎXÂ|Œ÷òËO"²ýƒHP:<È~O‚8¨ÃuûšFB½ UæUŒƒ99…ʪáËjá2ïÉ±áØ»¦ë¤Æ4R¾f乺tó_Bà9Æ$ÙͶϴº®LkHG¥¼L¡ 3 [”S_ÛÕwô\Ñ: º²Ï̃Ї5S¾„Š3[û3­CÜö~Ù»ÂTíÉÃå¦6ÈŠº>è4¥‘Ÿ¤ÒÔæõ¡™î?èJúë‰ÃjZ/Ì Š¢l)#w”~?GÈ«r;gí¶| z´ôZÙÏ©£|XI`$&äÁŸ¹J“x?ªÔˆ–eöЯ‘úÙ<$«O|ëK˜×bq„¹Kªcn\ä{Ú …–³ÏÄy˜$L•Q‘AKüºHosk:´u`ö9Š«§ñT³c3•xpC<ä`+‰Šª{Ç@„~ûU‡ kªó"`M÷9!nfËc¨’©9OM5 —ñL£œ AÀˆi¨`H2,î¥JêØQ _†=+Q4” >tp…¤D¶^y|¸H:PXû2ÉÑ¡M~dè.*%œÜ.ížõ,oqf†•ƒOÀû5'݇g[¥Ñ4ÄóÈ*o'ÃDúÃVóAü½úgЫ´å»Q•uxR0ª.ÉDl¹x™úËäÕvÿúÔ©3^LÇá,˜aZWâžA½èòâ-DdXãÏî„}·IõËÏ{¢w7Ç• lõm!ã%k],ÞßÈ'À8ù]ƒ’•¡)ÁƒêAŸ’¸± Þùè‚T?& `¢‹ß—&¯a´TPg·cÒj¤€iUöÏ" !JI˜ê!ân(‹Ð§è¶ '÷VN¸Aˆÿ;ÑšåØJ/}ǃfÕ=:+_ XÿN=Cê‘þQ@ Ã-ÅïP«ü :W­íl/§_²0 KNÔ(•™9™<ÔÝL,Ïà}¨)V^[ÇÌ=®Û²"w “ ‚²°˜FŸ$ñjÓûÏÿUÈS_Ð Íêå7$y‘A~ëÿ#+ûX<³5ÁÕG!÷Ú 3ƒ‚ÇMU eãk7Ý*ý9ý3õ™û=óî£??Z4ž¾ƒ°z˜yG¾!×a ʇ(§„®eÁùJ+'¬ZÓ¬9®ìà&Å7W{kÞà&ÙÇœ2þÛ÷~ùÞUV}IV|úÖ~ƒõ @o?&G\Az )ó8 BæÝR:Ç«(o‚ÓËq£Ë83~ìÉâS§,…¿²xÞÙY 3Ä#þ ``’ÚèÕfü’?9êºüF’Wøœ{DüÓÉ-vÜ…€ÉH¹žïl9ò *—HÆøHÀåŽù€ôäç*åý?«ÝÔñήÏ^¼Ç:ÇòèɬG£2õ½æª~mt 4±Påšâ,my2³M$f¦þþNGÛ¹z÷]ß9æNÍû–ß±a³UŸ_PýØÁÒ¼ò5}œ¾r³e•2Ç;1 îv`dxµkWŒœÐ'A¬íœW šÞàsþ?™,´ÀyÇ4d8ª ;WM;AˆÝrt2=£ÞÂbºu\IZó|yâ¥îe俎DQ2òš S§÷~+ü{›ÝhߨzsòÓ]5öCa­ó9•ùÃåò,>æ¯m·òäÓùte^]Ô³4n·Þ={E$GJ么,ôU‹¾.™«ÓÃX:Š’¤¹‚eƒÒÄõ¡ÈÀ‹hoÃ6̹{Å[˜J¿Òå<†âŃÙLTk ´øà+o“AÍ¿µYÈ–°jšÈK 4#3‰E‰Œ\3;Söxæìbœä½ª»zšLÊKèùæ³µx ìõ¢³“ OÍù—3V+Wj(žêE‘1sfTw`ðA†v²ö ¨AIÇ!Èkýp<œ Ík3ƒ 6û £eW¨#3+Œ1¹Çûƒ°÷šŠcg}§”Å> ã4'G¶€óDËZBh;{a €?d9±KÉ.ºÈ½l<š ßÄhrމ„´ Sî¸OgcrA^~i(®—õIð4Îf³‡UÝë1ÿ—Û̯߳4eÐÐôÂp]íg[TÀòõÔæLî’å™uœÇ-…¿bÿ3ª~FÄ‹ZjªÔrÁåõCë¢ÔqGå¼M_Ï£w •×É($hÎÓ¬‹,n¬ôšÎeƒE–©²‹ð·””9$7(— šÕ}Úsîw°6hÜyi‹ýp!Ÿ5÷û©×‘£›•nëfÃ$pã3OîeTذ¹ˆ?Gj™Ô<¸ü§ Ews7¬"É<ÑÕX¼LÝÅîÛÓûXͲ(S¶ÇŸÌކh;ûÅ9ûssÚ÷]+hßoB#á$‡|¶òÖêò h¶ëñ<Ÿ7šA@>¬Öˆ3cÀÑ E9nï~9AV¥/k=Šêµq~ÔÕØÑÊmtҥ°ޫcƒ˜Û%Ì̤çð_°Sî‰V)òÚÐe£kóãŠ22[²UQ¢UÒ¾¯›Ìáopšæ+Hº~û¾Ã>æïy˜¾“™¹ö?¾®@nwzÒG6Ræ7¤ªË é²u†jgk0y6+çCú£eø³»†®œPRÑ}U ´TYŒ-øÕòäà,*E"àântS$ š4|èÆg}ÅBå„{ -W¥RÕpNØŒ…!L“90stuƒƒîmŒ7xÁõè$­0Ó{²yräÝU7Õò“é ò&‚µÓ`Ž„œõnyó*4:]#œ{¼©÷pØ+Ì(½lâSì˜Û÷qÍ­6"IÕl¨·MthÈH”§|wai¥*[L˼‰Œ6vØ)àô~6[‹œjã-ƒÉ"=”0©îL{.4þ,|”Þ}1׬(ÕèEtáé ‘\™mtsG톜ìÝÇlÕ~FÉ 7`œ´vA£,¨ù[<8@Àx}>ܤƸ³¼ÿÅ*A¡bnâüb€é¶¬‡¤VÿçSýéCvX«”³×ñ¨èuôþ&ÓüèŒEq Y-âü8KŽ¡²¥´bàŸ  1WŽêëo=ZãÊRàö/’ÍÅ'È2Æ õýa¡+wûd«øþ—›Ôù~“$<‡cœSù‰@ûÏ”ôëw‡t1xðǓӱ  vä1e0"36 ÿÁF÷VÿB:/û7Z°øËÒ¾ ¾÷ô†Ì™]çó ;Ø^ØÀ× k;Ÿª>ÄAÈ!ÌÿžV³@nvÆ{¸LCÔòr‘ Kï"ï¸Öe™–)!Ì/ø µ7T£ò~ÅöSžw¹šdúþ=;ëËYe‰WAÐ8þR¯´µ[ÍWœøúÅ\’ñ¿ìÌôje+ž‚~ædoO’"ÊûÎ4º†©˜íüBm• B@"­Ì×Ê7½õй£èì­êæWúïç†Tgî­,ú Bü£@RØä¯{ðm?¯C˜ Ðã(B®> ßìË.“ÓÉ„úÂs)IÔcÌœ)BÑù"Öà§6¾$ …“n k¡¸¡¨aþ'¾Ak*xJÜ|¹_´ì´K©(G[®• ®ä3Â.¾r?ʹjอ >ì†óž V*U‰a?$#(æÖM:ž™õ]í½N"²i/KBðs¼õï´4öoSíýªù0‘_ißy$(!bL”.ÔêP/»)îq÷¾Hé^±˜†F/}¿p€mïªx˜˜¸rœiÎý¿i4È(Í3êã?x'Þ§tõÕêê´Ü˜YŒ2Å[%Àé[vsóä.cn?ˆ4•xW½î(@…|¿)—°xet¿‹ñÊÑüŒÝ®€Þ$x$íW¿d„3T ©`9T„‡øM¿]¿¶¨Ó´ûïšö&‡%¯Ž–üqÃÍv×Ù‡Õ¤lÈZ™•­ü ”÷-þ0c¥ê~Lø«VßÊ¿›å%ßR…„Æfï§À­AvjÀf RÇç~z~¯V‹ÍßGú€ã롆‡P²¨Mï ÿ â™ê;f×’î츥;·Ÿ§à&áÏ_¯MÑì†Gç¨êp/ŸJ÷ɼÑÏ–N|Óõân¹&›Æ`PØæ {uÕ)nEïÿ#}¶7ikÙ°Ð@êû'±s¯<}+’ØÇIn²›O”bïÆis 6äHûÞâõпh»öz'q/„šÑ]ÇMR6“¯/^§g³yX<½@+ÍZÈâ>ª%#!ßËN»;#DÞ> Gs€„Ý%#åîñB|G3y5^È )®:×Å‚¿µ¯¾“?o°á6ß‚@âÃM ×RÂìôy¯+ÞycûÕhã ¢-#dí¿€§]ž`¹b>´ ³ã‘P›#™Í?ßLÂ乜¤ÛÞ^ï䥎@N·ab‡s=Jwm§ òEòï$QVe¶ß» 1âÌt›=‚i<ÜTƒá€òÒoÎâ$PɇóÕpŸLÊbr{zDŸðá–欛¶ +×u{t²kDµ9›ë†àÅv[X͈{±‚ï{â_»«ŽK+¡elcútC%í­™+UUHKR¹Û&õ*nA»›D rŸ”Q´D£vð.·X4]8£Ÿû"ÂæŠðˆ"ÿ‡6ç^@8ü•þäóƒþnŠ4R2³½4ø¥wÚãÌžÁÐü•rôM qÊ™§2aª,†?[@†;ûôÀ[9:1ßhϺ_áæÅ¨ßHò_¤mR› ù®„Êu\+?õù)@1a(ê`[Ú7°D²Äñ©“™Z¥€ÕQšÜ¿ $í.ÕÞv?óþRY9Ï<³Ìò¾t“A {ÂjÄ¡%?KhfR.«=DôV V]gH­µ¨4ÊÏ¿ ¸ÖtâvÏõçNÝ–i1›C"Ô…ø'qí¼fe–­§¿yžZ¢ ëÓêé,ø‘÷Õgˆ WÑBc+|‰Þ–Nbjã^¯ v^(ºYÝ$nÊÞ>µ_°–ëzäÍØ•ÉÊíÝMzñSzÍÊ¿0Äj×O òÕM3mqij”¸Ž/mÀ_Žn‹ÖûØ÷uíQ„V:ðåß«N׉Ï´$Éß„º) çžC<>û+Á`.ƒNÝsÕZNM˜/ µqÉàÿĽ[æbû¯ãÙLz$>ÚW¯ƒV+”‰Õ<‡%à!¡o5„=Ôœ°û»;vçxáA(¯Ã³Q¿‡lW\ ¸[›&3²p½Gt»µsíõcõ¹.îv8—íèyÁ³$H‰CU1} Íßø¾iÁysdkë®Ï0XÕ“?þ÷$¹‡•éDŒ`뱺 Ѻ2ÊÕšµÎá–þyñLÒ57ŽÊb-å$è¨49ÉœûVr,©w0úb‘Ò‚`´úéUÓ™:|"Oí…E­2Ä]Nt±¾ ä”^ß=µKÓ$št©™£S~`á§™QŒBÓbL½’<§ªh>XÉÖ3†ñ›•PnrgŠ 9V÷!¨þA°ŠèÇUv¿ÃJ˜í!~—A"ê§Ý‡Å’ÎÊ&k¨¨§æÅ}Jm›bL«Û§= Œã‹`Eþ×,‡Ú‹^­ç2ZŠ`¾›ŸG¤8U8Z#?{Ñ¢þM ©S£í,“º¸EVxÊc©0ýl•hØ÷BŠUttï>„rÜ0`‡â-D“®´©²«ø ™ëP‹›Ð0.àþò6_¡Õ«´ã 4!$³ßP¬TOóð!Þ_e#¢§Óu„‰^Ú™ÔX呱Èê †ôf‡Pyû›èa„ÍqR` xKPᚉª&Ò¶Nœãµ 2‰œ D…¯Óœˆ³cyãøÌžâÿbRگźóÁIÕõçÏ÷ê̦>$²o(¿š2ó'SL™ Â³â¿ì±¦IPþÄ‚ÍÓÔn4E] Ð' `j޾€\Ocüü¿ãA|™Õµß~Áâr’’})Åog~Rd<•‡içáj';Ì9/Xju„\—“š%É,:­–lðB9­Âh>ï~ÈtÑ©Ì誂e±œèjÄìÑuáùÓÃä]<_Ö/ *3¦ÝîÑ(Îñìmé>k[¦†U§h>H‹àÎÌ“‹"€Jª‹F´w¾à ãh‚‘`.·ÈŒ*pKˆ4o<þ’iALÕ€Çú;ÇGB~,âYÈ+U!Û-…gtqÕ•Þ B{ÃßÓ‘3 ›flܤ"°1‰Gµ—%j£Lï kTaÿ„¨t•[’º0Dj<õŒj†ãÓðWLyzª o=öFEéËTQüФӯë~¥üâ³ô0ÛÐmi¥¥1y²Ñ Ðþ_Œï´ÖxÅ£Ê"ömµ:± …ãÕH㥉')5sN¨±¢¸G€¸! †N…§JtSJT˜`{Ô¥HþâQGÖ(݇3ôjÝ}(ÒÙ $áñúsÀ‡Ó•œnÓ!å¦Ò7À¿“Ûëxº¾„á8Z’j2Údˆ³þzÐk¢Ìä0x ‡ÓƒXªóå3C“O'ˆ£Ö°mà±­D@ôB‹Îõñe[nÏN·y#šñ|}Ø„PVð-ÛŸ¾QbÌM| JðsžzŒû¡¯<^aŽÏ²¤´¸ÙùB€'À~&¨‡4ö\÷ÂWʹ)>‹ƒ!¡#ÔÛÖ~¨Áþ yu]¿‚&‘¨a›¯÷ûwÉì:ѾðÑp’V­<^¹VÚƒ°«+G^F¡78ÚÛl>TE¾CpúöW+rþÚàsé/ Ö¬éI‰ü§€kg<±^ôPÙf70;åð' ± Óe\¹³È¢4=EC¶Ë5‰CñJ¢P’!¸hÖçIw×oaµ­®T'8Bó¬Å’) “ÿ¨y§Ó[ƒi7yQ-yû¨ò×6u®þ®çCnZ× Ôq×üj¯i˜Ôe’5²í¸–Ûní?J©÷ JëZ”õ¡VÄ-ó~_oŸ×=.­&.>ŸÝòð™s=¹ß¦E%iß=SX CåÁ3€€2—>EWmÿ(½Ë,æEøÝÿTÅ,Q³¶á Ó¡¼=B1¬Dš$“‹q¡µJæwÞ®ôºŽF—†ã Ž%²=5wé¹ô°3=ž g«•ºÎ”Åï,óI#/åõîcgWeh£°àÐñ`DòíÍÀv“­ XÀʲ™€˜•Ûªö9¢+X½9:<܇³Äx•̾ ½Æê™ç`.r "!T}"äÉ @®tam’™ü¡YÕþ?l¯‚Ë$+ >ZËåÉ ˆtLðúô9qz–«„îcŸÿ.H'·Dø>i]2’ü¥Î¼ø]ˆgÜ 6 B¦‘N ³lQ)Ê’Tò‹}ñ÷a.h—ÁyL‚wz_ò£œzOŒGÚœZŽÑ75gZ¨’jª^ê§»Œçjì” ö–"¯$èÂÚúr2 šÒâKª.Rõöé¿jiš…³I!ÁȨ9ø?%ëFäÉ^5Û õfôKAÍs*¬ÅÆtœ2SγӞ!WÁ)_°»9;»ð÷*[n±É7:%WIùýˆ{wçyãwˆ}TS^„់þ\­ÿ”f¯–M“:'Q¨q{)Y&a§Î…؀䄥»®úV?I>^ÿ¿è°Bç ºý§è‘‹dÜÀŸfƒÂ¼”ïìr^ªê…I9 {‹øÉ†FÊ;^[öõw¬ü?_›ÈG§OÂ%—ìõ–᎟„²Ë}5ªð‚Ó¿“^7qóN–±üÚ¬Á1ÒQ‰Ï²c¦x"ô½Š¬×c¤˜Y-¹>’ÌÁ°D¨•ÀÙ:‹l?QÔËÜu` c8Nf¨…?ÄtRÓé·ã‹'g‰éXªYØÐÿTs¶?£}¨" “A7Ò»˜uGX™º GÚ;;,ˆhv$÷®çþ†nb7ÞC3GϨøI:,eÚëaµýgÔšï6‚Õû¬ÞiŠ÷ÏöO?Û 9âáý ýÑéíî> Ëër„Ò.ü$/¨:ÔyêC‡Æ‡«ñ©ìäpn­XqVlKþ0†ŸQl¶Ó§iD*íçTù-ÚèJƒT"æËS¡d@ºÊu"ìPÛ{úh#Åû·¤¦\h¤Œó–¦¿®*ÿê:Ši|µ`ÄBØ2¡$E‚™ênËÑVNð¶à]¼µ )ÌÛ-ÚÌ"ÚNÉ]UÅŽP®:³ö.6á¹sÉŒJ¡oTs¯·Ü{ËÔ}pÏ78I9L£Mt ‹Õ‰¯ÐöV›­¸c|“º¾!ÑèºMò‰ìà¶éù¸X cmýêuêèu°p!nášÎÝ£ýïë}Ëôxƒ“ã-uÌŸ—‘Âh…ps3šáL•¿G;é¯w›.¢o2Y•êØsóPp±Ñ¥ íÈz~A?™ú§ÖXa¨¯÷ÝèÐC¹Üu—tßÄóíûäô~pš¸žŠØÌÎàØV_–5 ž¿«Ù S7ÓbO½ÙrI‰‚D R¢©‚šEFœ7Bî‚B¯ûPd—„ å òÒÀF‘™|Bà†þ–4:ˬSÔ[0o¤×T³ÍsBÏ[µú¤)0L€=_oªK‡ËÑ2;”IpWä[””Ÿµz‹²À§x¡\Mr®‘Á+¤×ÛVœ-^äØ.k™ºr¹p{[ýxå£{ÌxÅ:5˜ÃpÞK× ½€_k΂ˆÊ}ªb­J‰ó÷i »×ŒL8+éŽÔÏ9‰5…uZ$IÕEY‡Åæx X:ÿB]\Jš%ì(Ï£žG.ÎX/ä¨À‚êõ“‰vдû Y—×f<^¾îcÓgùwÐdïh·z}sØ.^‚\å[© DÄC2è«3í&j³ácâRö¿Ÿ… Ë7-ádSŸ ~ôl~_€©i2Ìç( c)moQ_dÏlfMÚÆ€¡ú5ßúÐ7.kßN8œSÉiNz™ANp+ì®é9$ÏN9ýº¢”ֆ޽dKH,¿·²Ÿö™vsÏn;džÝêOâöJ ;8¶£ˆ#JaªºÓ ú'¬RUV6iÒ*œùýù›V›K}@Ã|¡Îg3"T 2YšêÿJHÑ%ð+U] œŽ:Ñ‚–MhÝ CÁèÕÞ6¡eAäR Ñì[\­eŽð¿MÛ©/*£0AN/íDQ'FVk¾ýO ¢MEÿ6ÆÎ‚ °VOûÏøU±®!3 -¦#Þëûüä!KïÚ_GÛ†ktC‡¯±–9à…’©jr^ÛävÛÅùÜ>Èêã:¢.x3ßcäé~GV»‹ökÒ{â2Ó‘Q¼w=uüT uNé·/&Ú…·m¹ª*a[‘¿)Ñ4ÓGê¿…io6OæîDŨÿ8ÓÇÓ^7hQs²¨QY“{óþà¿ÏYÁ}zÊ¡³»íé ¹pË»­öSq40UÂB$ê~ ?ßjKŒ‰Àˆ ^Vîøõüƒ¡¥ó¨¾ž±º!þMY¨›°yt'å¶zY[ÛëN×ìÝÑ“‰XßU†NÂE 'ͨüþÃ|MNˆcUvPÂÆt cøV»#®ˆshì•kO+¨@!G×Ђ/‘º}«ÔNs7Sû[29wƈùO×åÛ—¦^ ÿæ†ô°ÉiãËËåáµòs¼Á´@ È-#ù¹ùÝk#ÌO>D^a1²B'"ßDkL1Þy;§1u¡âÿíyY(¡þiÊé#¯HI†~ßí—ø Yï'õvR9¼÷ 0÷ÙÞ¡.,› >Å,£%AÒaןk¹$¿üV›Ö¿4k4~6”œA[è¸ÛÄrwöBé~+x747ú4ˆþÛ¨mrYÎÈ£v24ŽZ1>Å4Ø¿/öd÷³Æ²_¤èÇ|j Ncá6¬¨3ô©\†+íè-ý0Þa/ô6F¦„›Ïqýú¼Þ‘'ŽÅŒ¾RËbåʽüòOËV1ç ç[¥íÆvzºóIv÷Ó©$÷ Dí)ºg'–ö-ÁüŸ Oøô×®‡¶ ã¿ö/-8^©EÏâNЂI‘Óží'ÔžØÑýXç©ói}耜«×C%ó²FpÁžƒô¶nÛSeŸ°{(}RÄ~åHò—òà 2ØNèë“ Ï#òYS¨‘ó׃8Óéω-?‹ÆÛ·Eê°Qy—îB2ùaNØãí{@`Ÿ^;ã?mxgTÛÓÈ =†J rå®iåH‹%¹s@ä½ÔJç!_-aä2üÃ{þÖý|šžÝ"wýÙgtñà¿®ý†—Ügz«›q¯ÑÞOY†—~Vâ'ø“4xOU² W$WrP}‹˜c¾¡i{dGæÑ~¼Äi¤Ð{5Ú ö·.dœø íí2Ñev³}tž†múLË׿:N¾Ü×ÃyqêÏÚÞø«§Qꉿ‚“ÇÐJÄc¯óNÏSš!þ›T—°We¿hÅbp(P¹7/ÞW, LçÕn²¦r‘áÜ'ýû6óc0‹Ûï†Pí¿-ÖfzªÝ:À Õo{&mõÌÔö |¦yܽÙ6Ž^9×Éù¦5~u-œV;l;$ü’Ô1¶Æ g_5 ¬Ô¨•е)•·Eš†Xîhc—¿yí]sÓ£Èk¢­ê°$ªÇ‹\ L€¥Î öË·o1‹cà#å]6%:p²“‡?o_çæ‘lŒü­ï.–_pFïÍv(…©37M‚|ÛŽúÈ€1^‚äSSpŠpÓ°–?ò¯ΫpþÎTé×äô1W÷² :ÊÝj/\üòYïÜú~\5Ÿ°£ÜÜ¥‚b¿bM\‰; ÖnÄ»éZ­‘¼÷)ìÈ1VŸè†&ËØ=Ôi¶¨¿u5&`øƒ¾Rù§:žvàyGÁãty “ÔD¸ú¸0„fä ‹ˆçÞHЄïIœµÆ¼t‡ß/&;P‚Êõ&Ì.~0Õ¼ë·?•|D¡Ê¬b4é™$Åv=‘—Ú¿¤\ö7¿Ûnç”»sÛ«Çšo¶˜+ú'4¡CÁÿ†Àc}˜+’ P__Ê$ë:!>ä€ç7ü‡á’òÉhÂ8YÒ%œº ÆBô.WîFÞ×/ŽÞâÛ7Þ[ê Šw_˜Äyû•¬ÇçJdö.Áiy.øOŒãæÐ_NL5¤ &—ÕÛµÚ|$ 2Íú·Ô=¸‹U[þ¶TCˆ ýΟÙ=§¡{I|6òÚvPÄß^ê‹…À4:Zk뎖ÓÎ)àW gòw“¹&HäN•n†…¾"ÐóôŸ¬PÕÌ@ê\iNF>›âÊÙ¡›ãË;L‡À6rÈC.Ïû}Å©°¦}І»ãÔéf\0œ:IýyC¹ôà¢Hk•ââ\®À¼Ì§ì^×Aû#.àùs]Â>!Ví14iK=a bºæ@zê¿,Ù¹Xi¶Ó`/¾,aTú¡†Cã—þ.z\9%„íO`×À=Å™1ŽB(þBïc· A¹ ·ì›·Í³!Í?¢©åu^_¥Hñ¥tí?$É_–9þŸ8äý=ú³‘ÞH°¨‰s‘\ €W=Ø· )Fàï 2×jÆötz6 />2.×`Óo2ÁÙü7è³OFjÙGˆu¶Ì÷š'³QalØâD5Û0§”¹x7R-[GË»Žâ~b×ôÄGÐOÓ™˜ÚM$t+ËM_²)W¸ûq0òy >ˆBožü‘¹öÑIx0‡gsÚz£ÄøIß©gf‘ÆÌáD¸ò ‚ôð`6›l…*$sxö¦È/¯ÆÚÅÛ’³k¦‘0‘-c°2/Æ,lzI‹$/ Ük©£†¸yÖKo†ÿ–f_ÓÙvEÿ¿©L,í9ßÏvö‡@ÜŸ=¤ ãÁ¶Ê27ëÀ™–_iþ—Üë`^™ž‚ývd1TŠÐ«$©áíå=—¨‡2õJ×ßÖéû²PÝ WïÓd{4› Æ+¼Ql¥¯šd(9E7F´cõJã].~ܱ’qG&O¥í™³øDÊéHû«¦¡ ôŸ°òxuãŒ*~¾”ü_Ë:]Dª—ûÍ?!4uŠnQòXp™~+]Ó«Ú4¬KS]v ´'ºö´ŸÆBˆÕ‘÷ÏQgqŒ?«çõ~ˆWúO0¿¾(ù³µÒÃvê&¦#¾Ì£Y¬ÍŽéNe4KÍØ=èõ'wì'2È]/:>’­üÿSˆÂå•ÎkùÇ×]Û¡¿©%h{?ƒþï-²(àºÉõåå ÉúNŒ¨j Ý‘|c‹­JßÒÛÔ–ç»ÓŽgÍ™ZYÂRmù³ë„7ž%ÕƒËiûUÀ¥Õ6ù1—m°žšPaD`­Ö•ç—ešc8GÛ^5mî­i!ÝVÆ1ÙpɃÕÓ~²U³Ùü’æ¾RçûêlpX UôÉ‘tÛDGgÄsûmÌé+˜íöÆ»w3wûÚÞÙe Ê,:tšÇ”ÂÍ{èÒëf?$gîNR¬-AñØ€Cˆ¨Š)ˆî€¦ÜÔKîÂÉ 7—_›Ê€Ë»éíÿg¯ÚýDpøåØË4US¦_PˆŽW-·ö‘^€®¤æ”PÀgñ=׿„/–‰Ïíj4qá>„öéè—;§žy¤Ì}2z™¶wkÈ|ßÃATŸ]_´ÆFˆWX sý¹â³›Ræý~ Îh~¯+j 2‹Ö½s¢‡¦ÉÆ–ìpzzr3Š.;ŽÞ]O13ï—W^Û«SȈG›JÀKÖš&m¤ç|Ž&"þÇóèàô‡{F­Ý&Vš®$ƒkÚ®8ý8Zçgv*صë¡4訒è/,g-p¯Þ3+’u|Ñ¥9Ê"®t;áªÍÎÔè¡6ãù‰† P£óïxS<ÞïöÝÅ3 Þ.¡«”±#AN,,ë7²&KŒ®XN"Ùk¤'3V|ŸlÒ!QJÞUkS„PR ²œËäî¯+~Š×¾uÿ¯OKo} ÷eVÃÛwpêdLYñØLšÑ78Q‚æq|v$BÛH.-»µPÝ¢gט%p6òFp¯6üNîA7^^—l Pžø;ߘ È\±Úy“6Jª”?BùüNß(Sl¤ô6#ÀxŒ·Ó“nXÛR:I“&ˆm‘€!?‘›é{GëoöŠº¡a¨s¡í–V^¸ÍÚÍÌYÈYÙΪ§/7±ÂÐH"ßoƒIÐ1¢¾Ìù­sS’U|Eœ¼‚4lÓ ‚ïúxÁ éÀù4«ÃÝK¸—OQ¡*ÎÃóÜðhŽÙÏÉ:Û-Cq=zóíf’TOºÂˆ×oÚCLúMúø˜«<[òUøìh,íÉÚ´¬ŽB%bc3nÑ,¸ÐP.FGΉ}áΟ¤$`ãž½sÑ–Xì4îÏÇ_Ä^lú·ÈãÇÒnÝ_>‘*¨1t!ü™¾D¤®=§èy€¤ù¨bÕåè\ §cõVÿsÀ¾nõkÃ]c¬í8F pŠ|j‘ƒ$v•ö#°ÙºÉ¹(MñŸ }òÝ.Çóþ˜¼uÎÓ ¤]ç<âl‚ªd,sØñŒ¢A†ß†]m¼wÖAÄݬ¹KÖ­.ñqibŒKWSUy$¬í ÓÛ°‹½TW™'?‡áÜÞ©°ín|ŽwuúŽ€a{Ùmª¤¨tVŠ#‰Ç$²Ã¤¸L“þ_Êb! ³—‹’Ïû]É™µØ­_Ù5ÐüÔUËD6ƒE\#­1ÇØ8 D+Ÿù:m>ÕÕµÌG“¿Å8º|ì¾-NVâ\¨¬Ï+ÕýÿHEö咥㧌Λ|†«^‡ú»å¼M–å:¹8Y5ˆñmäôÕÓ âh,dcùz!zÇê² Æ*óÖV£Ú,Bí3v ÉÁ™í3b(G±–ÜžÚÌ”}‘„Tgë$øŸhMŒ ¿ R) —çžâ(J'-¤)\Ïq™–mq¤ÉüÖhœÚ#l5Ƕò§>îG@jˆ92¶žKnW ÀJöz»/iÛ*Dbjs„j ~‘Z‚dI3Z¡ŠÈÈ~‹CTàìâ˜ý»ž¹qâœY?'mPüýïÞÊÌ—ŠC‡.uû±³–º¼,y>H‚‘=À›ƒí¨êz‹ëÍMižw9Óln¼æÃÞOF3Z_»x ÙSø],ž4Œ&o|¤eRù—Ë› ³+ºfjì¢>Å')ôsžH…Y]móZŸÖ‚lj™´’©Gœs,påyh‡s¾ç]6ר7¸¯K ˆèW”‡®¨›Ï>'êPw²[8«‰ŒûEÛPL®›tˆò¿Qd¦Äùþ퀴€¿5¼|N‰àÖiÓÚÃRƒ k$ì:l¯7øÿ,Aä;¿Å¼ç'i|IÕc\Oþb0°xFÇ/½ÔæÇÅä Aš |‚\UxÇÙ«BÎ ÷ÀMÇ­Iôý½y=*FÏèAyô_'ºyŽ“¡Ôò“ÓÈŠÓÄ7¥xû¾C>§A5aò°yˆQ× Y«…‚ŽoÇ>¹ªøÉþ%e©0dKì&g[x¸ª9½>;©­ÉiWŽÑàà‰å¨¯‚ÂóO¦Fj¡Žñ$šŸ›˜Ø ’Gç@ò–X¿ÙyV½sóιytÇø]uÙkòò'ô-“œùö’Âü«É%ƒØaÎ[tø¶!©)ÕBPŸ ÕJ= h+`ŒX4÷ÕatL€ŸË±n3wÿçYÄ‹VË>uÄÍ2{Ë-㈴_?ñëµ!Ô Q5Ý’®~—ÝÕ€€’«Ô< ·NÕÃFUFÑ“Ïã‚|Tó¥–(Ož|ˆš¹Šò ?jõ€Ö·óºevÔ> 7e\jƒ8˦B#=™ÜûK8Ap¿sc†ñë¶kâѤ^ ¸5iŠ*š“â™—^E•dzd²š‘-Ó*D¡)þL²Ž<ñ=2Þká· ˆh­¥rL¦$&°¯FÇêVcÓæµ…¡2µ­§Ï•ẰóZŸ£¤‘ »BkÒ«.¿{áµ'apD˜Ry»¿öòÁ—Ë?­‘÷òð³Ök§]¬`Y'æñþ%^;—Á‡0p ûñÎë¸-Ë#ŒL…ÂM1°øÕÆ&i„Ž69PPÞi'×hX"´R% Î òä§÷éÙsH=¯Å%­3ªôÊëäM±úp„lAˆz€Ñ1ûôLÑÐqfEÙ!=¾!”§K¸ÑºHô(ÄIwz½%§†^iNeý<…ë¹Tùg”o"¹AÇbcn“°œ‰¯=i,¤!€€÷ä#œ ¿J?Ñïœq,7CáŸZ{7ŒA?Ô–ˆh”Œ7=þu ´_ÌØÊTL:Hü·î}®ñìaÞ ×Bà„åÌf¡;µ-=Èë3y!òÉÂ[÷':dè &b/\kýSúÝ•5iŠìêjÝsp¼Ø¼ÌIkù<%}4ããû\¸wäÖ0ÇÙ øª²¹Âs.ý×´^ÉÚEœ‘àâ6Iæñ7Ó÷ÝÿX÷/#Š@<éæVõÈÁjz‡-z£O¶þ“¡wÝëÖ–KD§ $àipúË‹ÇqpÆ;ÐÁëæ… *U]h M¿+l³º«KÑÉúæ6¸6S’Š?.äë·šð ñ€zõgv;éŽZ ×¾´¶ß:ùÅ%ã’S]…Á¹Âé£FÐî¼3”rÔ9Þ-iÍ~=;~D€ã’§¿“»J¿•)ä Ó“CNHR4ÇþI “Ùº§ËoÇ?/DΙ¼åt;M(Ës3!0* ö[ÂÆÀà8.?ç߸Yq—byߦnnð§ù’ aãëc ÈlÍ^N©Snk»?àŽ¯ˆË;K‰åבSùÎy§Ñgup¾ <åÄÕæv+5ò¹ ‹ðú 23€g¨vç~0Bk^ܪ,…üDç(rQKäÒ!»~¢šÿžç§BŽ·<»a¾aåKŒO—L´ù#ª3>\'’¥ò!I;Ÿ‘Ü4%Æf7N\óüˆÖ‰‘ÛÈýYixͪuúvÀæ°‘:îñª¤ekÒ`U:ÿöÑ–O)®îmÒÖ39ÓLï\ß#8¨ÅK’ºFl(ž`„­Hú|¿P¬C@„M±Í !_µý]#ô &WîPíã‘mW–ÎÄ “§%aÇÝ„-˽>wLþÑ”ShExHy~-.8ÙüÕ}¹aè- ÄCu*R‚ÐpL5À~={± ³À o’›½RŽ:k0q¥EÕ”µú4ϳüŠVÑ&_Ë>v“ã°9A@æ¯9ä|CÑÚ)aÀAAÒ’4Êc/Ú+ëÔfoÞ]¬eܱ±"8\„¦v!½§‘''¨üáŠÈ«[c¬#·T0WC?T—·©1äQ^X  mÔRÈ"!N‰£ûcÄÔÞ-ܘ‹ÏÄeýçô‹ÒQë?†· v #=Å<ö”JŽñHèT™x^îe=*¶%ïµvÃR6µ ådžzPî¼i9p±ß–“çQÃ;„ðãLf’ÿ0G•B½Cr…t‡KÀ«]ƒO8e#}Ý»»|¡#VêkÝÿ ùœBT6ðO`qn”–%ÎNžÊ„(?‘N£±êíV…ÖÓ|ÐÛ÷€¶X,ïÞT㽘t©Ð_}­Ò¬.c0Y§§À!D‘7~]H­ñÞÀLÉ ÔÏÒëä@ƒq/ê„5X5Ÿ}6…t}lvx+úÄŸ*VøØ•(ß ¢ˆášË 9¹ªÜïX8s‘¶6T@ t«¦P3Ö“HYÝÃpK*©¼•j‰‘ –8_cGêM»¬C?•zr°Û‡ß,¹5ðßz ›D¡îÍœ¨¡ðÛó×ün`…ÕI+¢P µf±ØV÷Ó¤&•uÛ?¨ŠÒªó;JÀ@‡÷»4>äÕ<ÿ@‰­YÀ¿s“£¯va’ǃ›Z9¼nÙ$ zW]¹››øåIq:˜eHû¨uá˜oixu(lâ¸æ­IKË£ fý©õ Ï|që¦T¸ÜŒ©#9(éí|ݹ@4’M-ư‡IQäýß¶¬±²ƒM`yü<ýÜôòÝlð>A×\û˜ÆÜÁ<Œ ¹šöÁ¯ŒÛŒ×g¹­Jºõ‰÷µLAy亀â{ÍÐÝ\x´ßÿÞyÖ§Ï./Û3Ð%l¹ žë·ŒúÏ#?øãîCWF?íl¨¹sÇBûõþ„;^è(?ÎQM6g!~oN+ê¢AùsØRFEhÕ¡ÞHßš SiâFÊÇ÷’ªË „‚H#w2!"R,FÁ€!7Ù׆VZJd5L ‡Þì­Éæeð¾HŒ¾;¢ÙM©È­tWïa™ï6C²ðR|R@¾? ‚O¡ê¡•°Tx,„FÜH¢pZHkÿ‘n³s$y°¼¸tÃh&`úHT“,÷Znä…¹ó‘z£Þ'-Sê6vñvå:œ¹ãv,ôKbÌH•ŠzmŽ‚pn]f)ÀÏm j¡C_ÄIlò }þÄdŽÌŒÅ.+ÿO”$pˆ·3SPçÍìðÉ W6a8Hî|d„ïàåˆ_e‡þ]uæ=d Z‰7ÉsUÌk_Ù·îût†ÁÂ¥ým+6þÞ.ÄݺBŒË=ãD*>r*ï \œ•ý²pЃCPPò×½H 9KšÃ}s¸ø£Å_Ða( PNˆPfvó—\-hž«bÏŽâ—çö^ˆøgkÆÍ/Íø —ŸhƒDç¼X¬¡[Óþ,KÍØÐB ”±ˆÿCr»¥!«ˆ ÷óÌ&tÑup]µ˜ñô- ‹ªƒ”ÖEüí­Ì81ìÇÝcHÄÝý9ŠS _ú@­ŒÃ?{tF”år@Ñ Õð À”ûäH•»H­êB¬n3mE$tS‘š‹¡žÓ¦>ÝšJo³>aò¼wÏd×ïZÖŠB–‡–ûKÃ<¯Ó†ê…|®‰çJƒ½¾ žÛÖDõ=Ú¿8ïwBj·[5ñëä>º/ûør~è&˜À{J1¾YŠg~_ÇÑñ P€—Ð>®sè"S ôe4 þA@kwÒÛìWçÔzG$òs3_èFC%¬{¾š®´_åM¤·ç–bʘøH3ð+ñßÛØ(ÒbИCýÃÌïs¸hÐÛT³¤)Žãõ|$%ÙºbWã! ƒž!úg§©‘´ÁêyxjHMdâ Tð‚HÔ°\1wuá«\t»âº,È“»øñ¦÷4¦ÃKFèNWe×YênsUó,|¤U+¶žrC«ll7ª²íì•-ö·æ)îâ€ÄhQ+Q\R*É·ôL`uOYñÏݶ5î€z7Fì^iJ­WÀ«õ=ø¬—è«oêH–í"O ÿ-™,!<˜Xu¥‘­yg Q˜›FM–ËKC|ˆfYQíE³ae[ÑsdCÛ—ÙɪNWÏæ·âʨJv.Òˆ_ÌSy;ƒS”ç'‡f9W‘·xfƒ10ìÆ [mËAU’±y»qÛTñ^ÿ¶k³–_˜™å¦¨»ú1Z?­ž–dxÖÝ(2§¢¹— œgûƒ=ÒôûùMæ³’ž­œ7ƒØ'²Y¿V7òc «b«•œt¸yÍ\·†ÜdcsžÙHìä ê7®F /è©ÇNYÆHç”0x¡§f¾îpØ|Ù…ªËÔN4³‹†x~+•Ø&ØÌ+'fÕÇ+“È =[è‘Xè ¨Þ Äa؉à—æ6›½Ÿ-&wW弯àSÎ'úë_à8þìЄ‰rÇ]Ѐmâ¦A° VnøM Jþ`i~q$ø$Ò/3É*¼šÓÕX_«àáÁåùs®?7Wí˺¥°¬?{T§ÖȧT¤’Њ’Úp)­ÄUèÝrá$Ê>óšaÖÝvl%šÝ7+[P*ûñ,®‰Q=â—¤÷.GD¯ëñ–]îãôØ­>_izE)ÜC¶º· CÞ £ +ØÅ› éXßu¯ùé_Õ°.·Šˆ}V_Šlï1í¯QP«–¿iWegÊ÷P«uk³‚Q[¦Õ€$#•OÀç>ËX’m!N‘’W•¿­U–¨Yμ­PvjÀÓàÉI Ž-Fô²æ¹ ³;Œ|<Ô÷3R‹mಽa\EêÑ~§¬ÄöýO@§|ɇvZú~“…"¸–2öιÓìþÑ™Fw+,œWÈ.3öh%t1¾œ}¿/„$•ôƒ¢ë@ ,´ ¹³˜¯`eÇL›Œß9i†ó 1ÊýŽû@_ ÊÎô¡-Ô64|ˆ+½o[´`<(„7^ü?p±0x›@›b}H!E…Û¾HÝ™/ž[nóç%ßž]b'ûK!$>£lúÄ)ÈâÄî‘Û2¥âZv‡Ôìp:áCÕnÁmó•ƒke`€,gœ¢ç1²çL8Ä™r\—[õì„BõHºéƒÉ ‡Š¯O´šºKW.D5ay ŽáAŸÏO—íåfÈU¥>+†ÐO—Ï÷[ˆyÉrd¶”<øÜ–ÐÁ+o¦sB¾l¦Z;òíç§õu–2™€°áöJ8]éfAš¬ˆÐœ»l{üÖË«_mÝ¥­¢ä®èo~¥~jûï¡ûS>õ»œý ­‹6UÕµ¯„o–jÒ9Å#µ>@³`¼ôß~Т.—Çrw\¸=+°Î†–­>è±T”Áë»ÙëV6Ð>y_V™®™7»ö1WQE²1dX—)/–>JéþfwŒ"aYÄÝ3\00çÖFzÃd7¼5KͱèÖrLÜâr«%û9éŒP˜–>Ý÷B|#dPxxb´ ʸ»^m·‚^tRTúW|F›Òú3ü£ãd Ýb \¶2˜ÂyYÂÍw‡•zCØ7tØQ°}d 4BÉ)+®Bš¼šâÒ+¬Ê2ÓErSo‡%#Sþ§e|‚¦;܃³4üßÔ<—¥ÌA;=4%¡G±7“¿jÍY—ϯ7ú4Ú„£„ôå~P$a°2Ͷû·öÒpbôBX¦µ6áçw9ÂN5è>á˜t’½%#AmGº…õ#ùxç£ø^ñµ¸Ý Rø °ƒÕ¦çtz )îMG|ލVW\4Ø÷f¹Õ øÑO+ÃZU:Äxµ!ªÿžò 4Ý4#%¡6¾â-$éØŽ7D¡TJYCöÓL.òŸä„ïä&¶W&Ë4Ä`„ï7¾Ì‚W\Îâ ¼ÿ÷ðÛ4vOOn«"ÐæñÚ 4‚™yÂ8ï QÊwpüzZ”RÉ—$!RQË`‡Í–õ&MJDuCrV ûÀ•š9¼·J3舞¾¡ÊºašvrƒcØõ_òL1¦É&UwÝx@Ó  œà^˜‡Ø±HF©æð·NvŒNnÕÝO=Ö˜ìÃÚù6ˆ–,á€ù³¡ÚÉ3u…Až‘ϼ²L$±æêåÌ[ö›¨zƒ±æ‚úÓŸrJ"ä_.KýŽX«ÕÍ@Ÿk&ÍÙª¾¯Ê|£M·ëÊ×AG1‚äjìG¼™³uÈ8”uȆY°7D¹ðÎfS*<•§GéŸUK¨ûæŽgÛkgº;XüάµõGDÀ7ÙâÔožÿê>¾sÍþr øÆu7IÝòm|¦ç'€i¦T'Ëvæv$Ëh55HGgŒ¿=¦Ä•é'ëé–Pá~!$5A.F„ÊÝBrð¨× p¬¶8…qÉ‘Æ;<¦w¥„ÖNà#fþp#F[€4°€hQ ežö[¸o"2f\$U‰û2 #kž '”¾wg2FêßðZ Tj ‹rxüH‰W!h2Ô«ùüà)#ðz[ KÍZo§Ã%«ƒÍ˘Æ8wþ&}œæ@"·™º*,¼³;4Ðü<ú¦pD†è­d³¯[7;Óð=!qj7²Ú¿”´\87øÍ(…w)ˆGѬ• qåÎ S g™ø’E'„¬ù4stýÜ+ƒb7{˜˜«ûÿðìpÙ)V«!Ï,Ýø &ZxÌTS]mˆ>:Ÿ'ÍwF4Œ\ùVzØ-Ùćr¶ô‹qÝþWÓPÓ:6Ž/ éËNDg«^äþ°u‚–¿ dî¿Ûyy}!.iÁG<—‹Œ]€}J² ¯Rj,¡òRL3-§<Ý-^¿†Yž]΂Þzǘ%×b7Y{ø r÷ÈÏPÓÕœìùž'ÔVÃýßÅügt¯ëê;ÖV`"œNxÀï·úØ]y»¯?eq”+zÑŒãÊ-b6ªøptÊMLÚ>½d¼Mf£AZ6{‚3Ä]œ²¡ïicFègí4ïäÏòÛô+œÏœx&1Ÿ •ƒkíÙâ+W®_ní´­!Óƒ»ý1æzâr;¼ÄÊÅv'3›fH@€áÌ]ôáâõò'Š~Qöj‡2–j=oK] ›;ê•'Ȇ<*pƒ“š¥klDç½Zìiàl%–Ý¬Ïæ½Ï<{áLÄzê­èmÓ‚-6bOÈ8ràßÅ,Ò3¥]žu8H0Ó˜Œ°óà8·žû§Ê¢ª!W‘zQ’ú@câܱÃÒìn˜s*†‡MùBÌPÒ&ÌUŠ÷ÏCÞ½B ƒ¥á´ýÒ¿S1»|˵6¡¾"T´áÔ2&;ZÙeqz ’;!·vdÄEraÀ,:BŽâ”YjñÛO‚w[b–+2ÔfÆë¯KmqÖê÷gEªÏ(Êvhô‡œÎÜ•({Ï´ ·¬úrÕ”%‘Ѳj}çúW¯$~ÜyD¶åjÆ£جýù§¡O.ŒYßGkÈé·_3;~A¢”žÅ¼-"­À#ÕUéYŸÅ¥2„¾kÈ›>£ŠÒé-¿»mùC‘9 øh=ž&'{ˆ”oÃ/Øãh‹G`r´Æ¼®ECP¿6Éjøß 'ìÛ?»,B ªÄ=Qú¹@Ò³{Y,Yd17Ä’x:µ!G©‚칕G÷p Ö5D+vSùºÌבQqsáö¥“EؤÊÊàXXjæuQÎr¨øL È=mö¢e†œ?JêTCMð)4K—û6ðÛö,¹Ÿyi¤%Ì–åÉ3h& ûä<‚¡±`MyÁ¯uC£9¥Â|Ûz”‹göc¢LM<ïÿSùwÒ†Ìgä¾ Nˆ×@¨ÁÔ!Кqß$(‡ð®þk~©!‘j¼VZ6t#LI%Ú¦MôÎ0,NïÍÞÇŽõIè“á`zÓõ^~Ñýo(ªø(µ­Ø‘MÖUÆ›3òuQDÕsÅNePõuî“K¾šjÏçlWÆ·)"@Ç!ûí4-ŽD6œ%f³µs/ ]œÞd!  åF@O›œ3æÑžâ¾ô$Ѿ3™B¾Dè´]"[ek„«ßCÝ™æ’Kì³•í ¾«° LEú2|> ^Âé³È¯ ÿ®ÄøïºsÙü˹én}G»‰¼ÊCÒ„Q‡íòß|Õ[²ƒ 1ÅB 1OqîáÀ *Nýþ¸úÈݵ=“ ì`e6€ ½»Oú쿲=y±ÃÝo؈ZŸ«곉'Ûöõÿ ù 3ãEDR–í§Yy~A‘y/Bÿ´ï»ÏÁÂ9+¬÷ AP½J»#JjEØê-î÷¥y{u†ì àZ·QŸzLŠAûˆþzcXѵ3|cjçÇU2ü Ô5ÙÔoÑ€í&š(6¦ˆNGö÷@òÆy¥y ]z€—:e=ƒB<•;Zàbå)¶Ûâ^ûM°}BxÀðÈŽ}áü¬øÊ¦~ÊË¿ž×ïaÿ?²ñû_]âªK¢c<ÅäVi¹k†A†‚µ °[ö /\1^òA¤þ”‚¬!‹¯Å@í3…ªÛ·^äîßõCû†@çÊ>¾ âùñÂt]öáÿ3®/lô_6ç‰<Æ ~ý.§¤F™~g‡s6~N)2ħÄ€}- ðˆOUÊÜ®•¥Bæ²ú?š>z¾õ§ï/P“^QŠå¡Æó(„ý» øÅ0ûäN~¤#=QÙ€—F¯Pk•€ŽOv|TÝbso²'iÒH­î•ÝAÈê ¸L}¬òNI¶U†LšÃbè\Ðj¶Ç›‰QÑ1@UÑ>qOŠ5¢Ò÷á1û <‡fX)t˜˜§³úËTw'ê*ûKދш1þØ% ™ñ@>㱊¿šåõP<Á_V¤>˜`‘˜ÁŽeo’Ïþpõ¯æòS_æ÷C}ñ¯êJ•Þlµ.Z ”ñŸ–M ¾}e÷þƒ1Ò•ø]ÜÐ!ƒ-—…üìïQeÂ~:²@ԇȬ·”ŠXý“ù3âPbX.2?vËãK‘:½mþÃÊ–¶?“Y”#¦»‡öÙè·7(^äþAråžµ ¡žÜÅ#¿‚þ ¯ãü—kׯaŠþ‘p²£ùúßðoRE€;r¿(©OŸ—ÙÛ= çlyMæáÆ_Tü7L›dìàjˆËzæ=YøZ󽓦Qöm­eýbZa`£ªÊFˆpT! EaÐ5Y« nLT§ŒÓ‘7çý¼}þï0·扡=k ‰'þ}Æcœaú†¨¨@íƒêzþуðòóubßÅð5†¬f_.g‚\î”ùúh : Ç/0t:‡ÑÅ ?¬¯á·×÷TVÎ:Ъ¡ºCð/‚_`½:Áe8…ï´ÅŠ±È»ÕPB—„ÖdÜ=B DVJܹ2Qç „ªÖcb4S.G‘ˆ“=¡ø§˜¡-À>r)1à6PåSXfW¨úJÏ æ1³5Ee˜é³Úá×$%s‚5YeÈTf¡ ªõ€dCA¶`nF‘\C ˜(¨ âÆ›J÷eýÖHmÓD8쉉ðÔBªZD~ ³[¬aÒ…"2m bhû¶yô@ ½[ü+»µÛ ³õÛî—O¼Aô3øÚ®¿É›Òi§s%‡€‚‹ó” Ù*ð§ãMt iÅøHÙàζåÓ)þ Û ,Và°*ç¯$•!”ã«3䯖_¨üŽž¯3sûeèñ4ÐÁC]C­‹¾üºš­ýÞ<•NôäpC¦HÉŽ’ûx‡$aCýt¬^aNÿç˜F婊éz›“0<Ês±cù”ˆØ¯Tپݣôz­•ÑBõ˜*Áþ\¶öª;šC<˜>³ †3 û3 ´Ie ïtñ>’m­çžzUÝPx"jƒíEp3ÅÞ<Wö²,ŒáÇ^ë«îÒ0÷šYŒ¹ì20æ-ÓÏv&#QNªÚ£C\G-,éÛ¯lá@ÄÀ 2bIœ¢rÄ»#)4Bd€“„Ѝr0n ¥×ˆU¾F+êé XØ»¬d”%n‚ER‹ÛGÀ?™:ª †~šYWJ¬t5Šà—m"}Éx Yž×SÈ3<.7‡ôE•wî8ûkŒÕ›©@VȪoË/°—`R ÒèÐE7Fm¹dkôrQä,àëŽäGÅÍ·.®ò¸›ÒØ9ùží*äRG¤&}Î &fA„‡‘§’ÿ.§¥»®Æ×…)Íè3s-´É¿4Y©„s€í¡@ß?Ý­À÷0ÛU7ŽÜÞgÒËbQÉãI.PÁ§ÂÝÌ„uL®Oñ>Û¯W$^fäÞU¿žŽ`Ëìi£ } ^n^º;‡sבyróy9O-iœž"ØmˆšO³«U¦jsnø.hí“—D<*qU¤…*þ–×ÐÓsa C°¨º1/‘œÌš¶õ g_æÛ³^ÛrMëà¹Gî𯯥ÁwÙ÷‘3bHÑÎT¼E®mYÜñZí“_’GPÁZ¼žô4.Ѓ¿öû¾iƒ‘ÓqŒ%‡ØE+âk§Øb¯9 ö£^Óã>™fN,bµˆú<\/k6€Üð ) 3æv0gõùséâg¨VÁÐbÄšM‡¤”Â[òéåΊò‹¤Ñ=y~éà~aZå®»Ý}•3—?m˜ >vÌ„šrYúÔòÐ:álõóæíOŒZš”$E?á@8ë’Îk°¶„\.™t4³ûNç?æ%щ ü‹èC  ›ù#Ábý]¯–µGôY=m?fw¹ÆŸ<‹rÿ¥¶Q¾Rçðô,ÅÞ Ï‚VÂÆäØ›B!6Ïë ÓI$MD»›¹ŽàÎøÏû éø³ŒÏ5HÀ|>½'î8ªÇZ°Lj€åš@ðNMVƒ3Ù´þÕ¦¨NFÚhþðžù©j•ïÉžyñõ‘Žâ0·?…Óã.0~±8û&qh98.`e‘„Ô=ïª{üBE0Ž×r!‚:L½p“ ¸ “7>5)¼Ç¾¶ÈŽMA8ôÝ¿-g×òlŸž–†¸¦ƒœæpÿëé©Fµ„zðH„øcm}àÆM[ÏÈ7è[eôShìžÏš–ør7å×þŽ^Õ²ç/èöV“>¯ûvæáÕBÅ0c \êD?ž|¾îºÌ“ëç×›¥°µ²k¸SÔA°ŽS²[,JbÍ)^סHÉõÀÚá0@ò¢36f>NMT¤ê÷ú*!š-³O)jàzM~—HþÉÉ[¹â^øÃƒ¹c*nf½jÞé§;©2ñ+ÿhw ãœÚÞ»ÀtzH•H¯åíK*SÿÌ£a‘çb˜.½Œá®—Êù„0 Z_ïg¾âÚÐfí³âÞ•iûö\ÊáXuÈ…ôå@jáWÓga`Çù}ù¨ª”Ì ³GÌUå’v4˜ˆ\ºH˜‘ŠÜ‰Ä»í¬„?_¾Ö°˜±DgL”¯î¦¿={C¯¤oÄvIwâáåRpm°oÖŠ Žùd$Ƹ†û‡ª^Ë×té8˜×3@ê‡G7”˜l˜ Úv¢<£JÍÑ‚/—š{šqóãALcÂSä8)Úœ0Èp–7‰ÕZq™™k¦êf%Ø}>¹4ý¼1ÚÜì x„Sš4¢ƒ¼~†dV6ˆ]eú,%EÈÆdþtL}ì}y›¬u¿»úJÊÜ·ýgk—XÙ©ÊÌã&¹Û5Éœñ‡P!Šˆ^K¼i?»ÚÀðóÑ ƒzÂZ!çßý™šèàOoº›D·N¿k w 7 ß{räÄeÕŠŽÝ;ÜVKP}¼ÍË”eò±²-y;—ç&hÊÉÇãz¸`ލ±´&ßìOD?³N†b ýÜM•¯Å¾ótð«Â†™âÒ&hÕKÝrðIlލ˜‚Þ-3ëÛ ù]= •¹KF·¿Ä#WÙ/«ÞðYø¨Á%¦û«Œ¯2§ìÕÇ1Ë/n©Ôžpz>àvš½qÀÀÅ¿|1<ð®ZDÄ*tØ6ÛA¼ôs zþ”Ísn³{µ /`j|¾_q{ðVÑo^‰Ææ©9~pìÏÚŒ“Íß·ˆOè~rPô~¦Aƒ–¢ƒ,>”ò8_”§³¢¥ì%“?Ÿº ¬%|‡½žgMÀÑžsN‹~EèkŒžÄSYwHrøR_&´Ï­€¥“1Àåä¸Ú*Ô!S²b‚ׯÈ7»ÆûaóbrHØp¢ŸšûùëöÙ(ä-gœåˆ‚õ†–æzû>vý«Â[¦L3ÿ{ª<ú³¼‡¯€­.9v(ê>ÿ,Ë›’³;y–çéÂÂzé$) L@ßoÆ÷~Ó¹ÑRÁ¤"a™¬ñâ ž=©${3És ~0çç‰j2RIR/$@à :æ”t½î»GSŠ•ŒJ°"r¦S'¨ϵÔiq2r:x÷¯Wì’‚Ú<Š*&¬G v ˜&t w7œØô̺lªëN è×*ú•ñÁL»;f\ Üþæo§Oc–œÞ‰…ÔÂJ©Õ؈®™«¨SÒòíôy™åWG9™׫—ifB˜÷†Æ¨4/ëªØÆãñQv²lÅÃ,Ñ+ÚK4FÅúcø+rãã60²Ðð¬‘,)Н?ñVü3ÜïC évzÚ_b8ò€éx*.óÆ&µ›®ª8A îòÒ©5~’Ø*%êtkä½!ðAÏkVŠNéÝžõ_Ô<5ëãï;¼P£àÅJæ;¡`ªGBq‚>¾}kš²ÀÞÖ‹&EÕZ/áí~¶²BlTâyfNVz3¤’ºnQuf,ó»áÐGEd”[¿&/Îsjyàé©ÑÂñ =Ì¢—ueõž}Ì#^Ý‹}HOL[0^U‚i»â(a×G„–yëKô†ÿ£”˜Íã8!!Òü7³W“æÎa@­aéãQ»@ŠUŠ#ˆ®ÂtjõO(ÙÅg×]e®êMê:¶é h4Œ%J+©9)2gRÂC|¶èÞñqÌÅU/k 0rȬ¤yîÎ-ú¢Ì[6:ÉM{:¶ßü‘ðþx~ne÷ás–¼:SÝñÊÝ™›_ƒŸ7˜Ú©ñÑ,6O:‚ …˜.‰xìᘿNÍôÜÆôÝf¯r¶d¯Ÿe#)Éâ“üЏª‹Þ ÇÉrž0B¨x-8¯¯ ‘*!MÜápÄyðɳøíã»JØðUúIX&^?»_/t³\ÀÊ£R¸Ž-«ûžÓÌáI„ÕÎÐ1¼H]~ãežÁÙüºiJ5øã¥6zZ"&åVPÑúÃ»Ž®nåyÓÉ£m¸?üoì!è,öÇÐ9å]]kÙ1êi;ŸÔãá²keôÉØ„9ršÉÄ0?O²×6ŠômW ÕÞ¶}Ñ*_³³`-|1pç®Ù²õ¦ë"bŒú1ÒðcÄÛ£RK ‘lCZå t (éÓÀŒYù Ô0ïï¡é(n¦i(:é±€ÍÈ h’À5£È5D±‚öˆÑF„ðì\;Kª¢½”Žâb,:IxZ´³þRÑ÷ÊÆÑ`De•²sO¥”¾ÜŒZ¨?ÖT_ÅcæÑ…@˜SíúïÂ>œrÂö7ÆâÒó¯ßžûµ!|Õ5€l &~¾› *ýq sî³lve ›U6ÄŸtôþàp&˜ýÒ[…aôK°^›|¶°0ð”õÎI*åF+½ç`–8ùÆ€âç&”NÌ /Åã_å>³(ÑKØ‹òíæ£ýõÃéïƒcDmcäúQ‹@£ExœHw®sü“w㈳QSÓŸ‡ Â{Oçv{¯&Oó¯DJpnZ†^‘g&[è<Õ£‰"Ÿ¹Ô¾oÒ‘cwÝ1d»µ–ïÛgö+Ý=A}>W’(›!_ âå'øÚÅÐHÁ¹ç‚¤ÀößÈh÷ `î…fí7—#5V÷/Íêç^Ú·’öŠOlŠd›õrió@Sš±ž]–{ämóþMº†³]æÚˆhØ/O š‘ØîE]bÀüÒj²"(SÅ~qŽ”ÓBï­Aú°38@qG]_ç—Ýß®7ôÆ`n²6ùœ„ùdŸ÷’ƒäÊ0D2Ûкqů¹ÕšSæå7 <²ø“>âf‰B ¢ð¯á.•@8¦çã^Ÿ­Öæ› Åˆ› 3³ qƒ=IéÀJ’ɯDz¦´*!‘å`¡»ÎüwT¾åg{ð‡®TÓÌæZG²¿ñ˜byÂÅì|¼ŽwñÐçKtéS€T$ÉÉS¦æ>ŽñÃì|§!yy`9yf¼÷!$3Íã’û:ó¼Ö¸AÂP,Qh`®pÕ: ü‹lÿuô­DÑ­ :³g¬¯òÍmÛDnÐôŽMüÖ4£[&PÆæìƒÉ^º²Óãå~×k”¹é|q½8>“oC‰2¯Å踭…T ŒvÅsY= ׯ•#K'†9¸ÂŽy«ºl0’[•¤råuÓRh÷ˆw#rèÔ$;ÏQ«}ô§jª'C_3iæB•ŠOÂå@n×»íáèn^ò&Ž“ 2ôÓžàp™«­"6Ž¢<§´2\乊Ü^çІ9§m:»_L\Já­ô€EMô7­ÎJ‹ýÉ ]¸Pöd&{tÁíPÍ\¾Ô“ÙvªüGÓªãdp`òíðç5C2}0¶ð6>Ž,þ[¿\«ËØ7|ÎfÖ gÚwÌÔ©˜NÇORX‘;͹B›fæ£÷ñÇ™Ý1Œc«M«Èm}Z°Þ¬{¦ F*P‹3“µ­è¿…sdž¿šëR†ûi—:LVºò©ÍïÐr]ÅtÃÕ”ú³‰+ˆð‘¿®˜!¨7_¦ƒX,4ZTÙ1—3ðòk)^^£¸ëûlY,3/ŒÊ°hë·ùfþ?9QVvÆ£Cdæ§u°Ÿp› Ä aaC#4yaâ2ÕrOrœâ8¨®±„ӃˬŸlaòÐBaÊáËY6>ºzßÊ·XL$oÇ)Nßú¦@8®ÜÂ4n¨dE —Áù9¡šÁ5~_´j‘òµºEî42îºÕËÕa ê^8RJ4xôRù÷DÙÛMrÃÌŽKØ•Ÿ¿ŸwL’*Æ‘EÔ”¤c°s^k*èFS²r~›‡IÖBYF;K €iC‡õ`AǨýÜp +Ê#sgËÆÚê©©²±† @q”¬)™eµR÷Œèܹ([ujÀmÑÙLô×}Šu+Ph:Ü òlú< b1M]þMO_CkÃú"òÕc…Ú©òí9¨ Eb‡½?f!ocèÃóiuõ³ÂÔ½J* X™°änö¤ÓߢXh×)ëZ‹N}jÒ£x7WÔRºCâA§EÕÅäK–ª¡YFÞ Ä†{Ösjså¶d¹¡ëuþÆ:G’¯ŒÝl,à´û&1qÂyp0mÊR]3|ÀÔb÷©·lÒQôÕ %ƒ&Âç¿ðM8ç¡÷úÓÏ=õ;öÓ`ö.¾\Ã!¦&LY¾Ý/íâÖZÃ`Ÿ”HL«´¶¹šMb%&mÛ“ѓ~E3ù~¢ëC UqùÍZáÏWÂÊâEþë0'(è‹åé×2ë.{·&f€¿…ò.mÜ_&¿`üÁytoobúïLq‡XÏ} @ƒ8‘ÀûÎ Ï_eJë)A„Þ •#õ ®Ã놉a1g™©È$x*©Á©«æ„ÕÛæA8 þ$¹4`ÏïÞdtq²nÔY/€Â9Üû:eú_ä¼RóµÛešÏQQ›Á3%<¢•Ô½ŽÈö’kÑl­¥°'¨=škèrY_Â/ø?wÞA‡'sÞ£}aIlYá¼ÈEjw½qæòGu)î\ø\á\•ô¨ðûì%¨¯T¾X(‚’–ªàHPÂÖíMäÞK§Ö;k6ÚB»”½SiÈà–¥m_«>ë«Â3n0Õã*|$[/Sp;Edæ=µåèæYôÏ3¢Æì`­‘GL߇r£__ÔEÍê‰ê^ÝÁ I‘9'؆~ˆÙô¥SU*cîwî|¾'ïÊEL—CA|üóófh“—äk#ÖÜ7˸^ËÑÒ>‹PAk³1ÆøÃ˜ÖY“ŽÃ£BÀ+™´³HfX„þ(­‰z§u:‹,p¡8ý°<ÉÎɤ •º½ný`3ͧýfQ(r»dL"ä­¶ÑêýD†Üxõû“úéÒLŠyZ„Ø BX9}ÿË]'Ó—‘uO€~>Ûrýëä¢*öƒ]‘µÑöįgýlÀuðdÙ'±1;yÓWm1ª¹\Q½‚9Í€˜'5¨h€†€ÍÉœpùߦРÍ!Œuø³«É Ÿé_÷ÆÁ;ŒöçFDÄMd7*%«ª…L sµÝØ"rƒýŸ·ÌŸ.(¹ä&ÕYÿh!`Á¡©¤Ïç1›ÚåïMdÊ;ç»a•Yd·$4Ѻ,Žýád»¯ß‚¿å~3­B ¯÷ê;úë0YQôÓk6«b_‚º¼ˆMLúÞÍq4ÃRðÔi¤ö„ÏTI_HzrIA$*ÀÌ 7^Fò0§4mº×’Hl¹$³Ë·«Éø.µütŸ·£ÉrƒEré;‡ýįóž´V‚С‚jPþïç¥Jl^™¯Î&j=ç:>p’bÂéH.ßœy,DNšÛ¡‡µr€‹”žb%«Ò€cHC š>³±m£ú¡âË!x ú2Ò?TxÈëW.‡oµz5]µô§¾ý†šµV©x‰Å±Ã÷`U_:I-¯q\¾»ƒ[OÖüvÊÆè‰¹X`SLRŠÀ…Œ .ʘ€5 ÍÅÈ}ƒ”ôBÙ¨šq€~XlóÙNp†7¥¤4ÖörÕ¾ú#ž¢f‹0Á˜rr$d³‡à’y‡‹5šá¼(™ÒÜŽeX,V·5þØ+)h1Ÿ+OŠr9!“›ûyù'`퇹*û»ÄÌÜŸÚdz/Ñjª`o0äªIÒÏ‚æzèF,TÈ.mck°ÉjØfw¤'ë«°YXßçj"a‚Ð+„ðÊ«æ+¼úÞTÕQcñb©:/0'|ä8¦Wü¼þi›“x¯}~d(ÁD“Ÿ;,Ž9îAÕHÀ1¤=Fã3»&§˜¨"1^Íö«S  ^ý–ÄApœeøÈ&T˜ód­V2góK]åºc–‚øâKàúËø¯ø“Ýø‹w—=ÍBAiPÈàó儽˜÷$|ù¯NÒ§­õXØ,.tónHé“syà|çQ+‘½eÒÑmâ´7ç—5A­Š‚]Z†œ_ûfÉÙÆæ|*î£ôæú*¦ 3lI¢Ü%þÀ߃Rßd~2óU´tCF¡Œi•wð {a/Ùj c€àŒu$“ Óž,|œX®„NîHÖ¡d§Vb€Ç’At—Ùm|ÏäÎÓåM™ÀLJ˱&)¤¸ÅÝË ¾mzdk³ŽØ5 ÃS" èÉ¢ •í‹=l¾÷¯ßõq¨urÆZ³‰—S¥()PÀŒÚ'U{‚¯b …ô+]Rÿ§däIyc¾’J%ýg?àý$[_ÜÁµÄÊ'—‰¢Z¤Mÿsâˆ'õÑ»á&SÈ4€\ £—TØ¥K±0ù±)€}µ_7P,À]?S õð\[³vÙ{Øä;N‘ޞŬ•õúÖö<[Ï`©‘Êœ B‘ƒcÜcï&dcXßÇ¢å!Q8Zl¬4’ƈ:ì«¿:£PäÒâŸ7E>@k¸åÏ[£Z”Œj`­h+!Ö}¾Ñ4wXyÒO× 3òðø <#ô)æÉÏ/òt£ÚÁŽ­`2À]r«•ÌQ/çÚhEgq@ÈíðXô_ÔP‡rÅ•%mn HuÖ+±Žu¼ÑÌĘºÖxqÞfƒ¹Õ<: ìR"7ðC•ÐëÞú£'„T2™2:-€‰3p1–Ẵ<ªt´0&|Þ¬©® 3ZÙÅñ¯ˆŽÁð1-M½éËã‘öO–™âÛG~ôrdüÓU¥ÿ<Þ£ÄHN!çÐôñÍ„?»>ÙÝæúÔ+B#$h$ØÂr-ïà¾.Y¸Ü1ßïA€)šdsÿ%ÛÜðƒƒµ$8^·xÀ8¬aøŽùæX}iJÐ8d ;Çë0ÞáZun²Û¼7ŒC2¾eœÿ¿ã‚ ÓéãÁ7æû¨gX‘Å OÕ©Ž  &[îÆ\ÞçiirØ”—™æd# Û&ž[eìøó‚<³Ã)M‹„¨ÍÛ*Ìû³Âà!ŽÿŽ·EÜõèŽYiÅRß³º lžžÿ«,1þ3¬ªµb-å®#IºH„åŸÅïî4½æä ò9²œ“ ¹¦õ2äyÀ?%°=‹ˆ¸i*ÙR$‡Kºkzo 1àŒþuñZiˆoc%®l›¿{-ç Äk@ú-ÝUÙ9.cTŽAÛ4B¨Äê$ò¬T8má¶×µ ”„=7zÉÓ'kÞX†eù…yr)ÆÀv î^†§Ù›‹•c“úŸjíËíëì“ã—·¡cd‹[×ÛÞ¶b¨‘îÒ‹ã4xЇÀ¬oÖÇ?Yý9ˆD~ÁoÙØ·¿Ó¾’$¥y «1SU:ïw SŸ…7§>Ì,~»oº‘$CŸÇX…L̵±nö­Â•t{¤^8ïM°Š¨Me› pÖ1ɾòŠ2½“'\gi18 ½˜‡O ˺s§ýu30IuÑ´A>A¦þ¾n _œKL»@,²\Š‹3»QgÕ+çª?b&:_ÛPºÔ›Cc\±”ú\6´Peg ]‘KϪPùçÝ`¬84«åéìðä=sRwcxØfNå`皊Ҍ/™%h•^âÞ¸{lá‘ÀŒ1›œ\þÓVã–¦R7B PÑჇ\ˆá¶›ÿ€ù¦¸ÌãX]ÕCaôëcÚo"2ËÓ(ô­<™˜­~‘LÝj䊫ï!¹=CW®›Òˆ„¿Ç9«ž=vŒé†ó_K3 lD¡¡ nÏOËtÖRFõa±ƒLÎÇ!E,µgƒI9zQC€Ï’c¦A`£©åDac¦5 Å ~iá |´tyyŠKlçk%̈#!UÐΞdÁ["ƒÊÍ9…póØ‹:˜¥¥okc-uoçïvq³øÝM&‘ÁZ²´§4ï7þ¨­$׳”|™ÞÛKYEG…sçü†ûù¶F£%A°(õj½Üy޽s86 Ì•`Î'e5(æ]OÄ“:(ñ© ´qÞDËãÇëëO{:¼F®’­t©< J.Tå¦%‡rïW-ÒÛQÒ¢Ðxç…šß&8(ߘÍëyÞi©ïg…EzyÌÁ@sª_¦ÿ1ÃH-Ýoº3ÈùÝÒ ¼MW']ÃãÌ9¦4žóWoë†};ï|¢}ž…œ1Ÿ#Ò!ä0j¯É®óù‚Ñyïü».—±Õ¼œE7cÎ!íP?+eyf®²ŒÁ\Ç+†_£ÊÛÍy6ÉÁ_ Lßù^õì麦×,Ùb÷[´eŸT­[ ¨>Ó ­ÀD0z¶†¹ý¾nv]‚Â'dr8cç€Tï©ÿ[à{º8#q䉴Û(³zð¸Åƒ½¢ì®Aÿˆ„CsRBþû¿«q¾Nãy÷²F}ch)0ˆ¸æ–bXâê¶Üä+vÇ1}ÜÆ_çܪ£'F)½Iª¨v2Ÿ€BmŸì›¼CxéŠ=v„nÝFÔõþ)çfuyŠ^¾:ÎW˜f†z¡¸¿<ÉG—Neè‘þÜòÕ£k@¬ á”®”Ð6T!ÙP(y?‡šùòIñg1).Å”Sá À¸)7Ñ`É@êΘŒ¿Ö€Š°g -µ9‹®jmEˆKçÍxÛ_UBOâ6%•ØFQFè%íH=¼M©EX ÕÒžûüR»ñBð´3â>ò9ã]/xêßÛdµ8]Aðc_«Þo‰UA$ ’PTž†¾bM®4]ãþ¿ç#¥§‚sZŒ`ëýkÕRfì?{h\ºOÚ,’²‚Ãײ=ÓѺÙ?ÖŸl²î¼QõÒqË+E¶/#ß®&Ö(é²øRs²+ï•o»pÉŸüØxîR¼»­®W!i‚qj¡s–õW¹*µ`QDË͆…/¸+·ßú]؃ÍG>¥/òlÛ—ÍȧŽ=yÝcO{¨u>½è[Ä Ê)v­ãu4BõS~?5/†ñh]ÐYØ>‚i™z¥OŒö·@Ù§ÉÈ—ë=ç@•m„HyÕø(Íà¤üØç§Å9±™¿uÀœQ ®0v#kÓ Ò¿ÀNÁmXð®÷¢¨ôA}³¹Uù‚hTÐçz(¸Ið¿G¥« åé Ÿ~©*Ȥ֜©ìr™û¼??ÏÙȸZ~Pã†}÷ =Âé|²ûF¡sÊáä©WÏ:jÇËP<Æ×ÚBž×Hê[´e·øã»>Çì\‘ñb ,éÓîO2æd…›×-®^BWÁ0ß…d‡‰¥±¢«ëÐuyNO-W2?Ç€Ž0•¯4”¶\•n¾OcÍË ±^ÜÜÍu“?&/ Ég´Û6(Q“¾ß`SÜjïuçÄú¬ñ›ò^fYâÉ Æ ž›@ð`Ы†ûÍmܲç Õ˜¢àÛct© IJó‡½ÙŠX]·&šüölõ èÊö¹?©èöTЇ1l½ Å-¬L–[‹ ïÌ0GÝȯ/sM=q牸Kӹݦ/Žn/É'”© bØÄ`åýD'÷æÓ"€<¾…mر»Õò!kc‘1ˆÃFäœÚ“ri£G4ŒãV¿Þp"â¿úr“Ô[ÆÚ,’‰õvl%ö!ÛݤŒDPè•N.ûÓ2–×N‰Ú„”4°iO«öç©Óx»Ü'­üG⿌8é*_›l„!å½O¦–öcp€afjL&ÇR>gÌ+»Å!¿}®ÏrR°­•åõú1Ë׆5ÍÑØyþùh>GiãÅöëfrÓ‡.Ý™c±¡ÏÎx‰×>¥'¡L ÖÆ»C\æ ì›`ôšr¹NÝ÷ÜÛ¶àr-³0H){+1ä—O\v ´s@¾K!OvÐô‡0<\®¢cO—#1)¿BŒÜ¨š¯CvǪwypJù6z´õtšI÷qÈ-?:ôñž”Ž™Žó1À^—z¥üÜŠKñq”1SßüZ›:P)[O·am®NUî§ß)ùž™mšK ¶Ê«œÙ-”眺FȧÚÜä¾±øõ.yA¸ñ•q˜Âÿ"æ3åýr5F¼]n‹A‚6¬Ž $Û Ñ4¨Ë¡ÄÛÃp×¢&i‚nе Z>´ËÁ®þªrèoʬ­ªd…jæÁqÁaá_eÕ—^êÆ¡Ìøe‡eˆJÙM©b¼Ç,'æ®×D.XŠ.¨,£é“z`É=Û$€üxOE¹USÜ\†uØ;"Ú1ËòÊ:‹Þ(N ({{b–Xñ)S£ÝT“\>=¼„);6•Gîµú›Ò˜ctXSiù+n{q*|ö°‘IJð¸KHÇ#ˆ+§µÆs›DÚfØ[@Š8€nIŸXñ]̦ ˹‡ÝÊA“=¦Ù7Qþs"VÔÇ‘¡"w%&iÇÜjýÿ-BŒúA ¼mά…ø”¹ª±ýÕ–þ˜ÖŽ¥•&¼prl¾Y÷ëçv¼œ˜9D;Ÿh’r­:q1[~yÛŠ ÷',ÏÑYq ù_p0P+èÙ[c6dï3SPa{•áæ9x˜!VlÔ…ž=šæ2DZv¹íMpEPùâ;_›s¾ÂZ‰P÷r ÿìlѶEÙ)«QêóOÝE„„ÈVYE‰?a”<ïJÛ8ßÁ~3m)ô*t•BÕ1™P`sTÝÖ<ørj®Z$Ú†zs}vç¶å¯®à’t”xÈz2ì4@;‡<)$ ¨Ø%z~‘áõažŠe‘Z¸ˆ’ñÖE6Ÿ8¶É:¯ÌÄ ¿£ƒWœÏ›Kìœh¨!Fþ§Õ…²”ÆIíô [ýýŸyû$¥¢Cœ6~ì+¼ …²=ƒÉ'+ }GŸÏÇ>'®À§f‰FÖ<ƒ±ž±K˜èŽlùðÏwÕ׉ïÔb^” |JÚXï ‹Árå.l²CÈ <íûE ¶ ¬ ò*ÈoÐL4ÑèÎHH,ÀidC e-˜âå>%¥öñiñÄ2Pª~AòùàA×<¡Ì¤BõíãÀ˜6ã>×a/apu þãØ.j²g´³Ð<Õ®¦è NÚfPÆšžÈ’¥Á¨U™ùÔåIA‡+Õº-ýI–§N–’ò$§¥–ÈeÏ< ×âb^¯÷|ç[àìzitµWlMy˜Y&8¶²¯¯ÓŸ.×Q:+Ï`O/K9;gúLËïñHýr²{· ÇÁ9)wžOËù©½ªÏZjñuOù¡è2ó!lÚReúÅ£JÃå¤6òoF7Ý ó‡ Ñlf>ÿ¾ø’~ù‹±4£ë„Wï Ê–(²Š®gy©§ÇÑÛ+,;Õ/9Ô¡në‚7až™/²Î)™ulÀÄž,K6Ûc…@nX·à¼YÜ{²lÎìïi„¦#H(€#é~w8ŒÛÒ’r¢;ÉÝ7ð¹ÛwŠ ƒÊ@¤Ý‘¹çƒÒû³ýv¶iòñËa:A¢¯[–u0næÀ¹d޳cœ)¿œách„dV¹-P~Áÿx¡Fšc@úKÃNÊ»¨P·¹vÎÙ²ø—åO'7T—¬g@R¼ÝâœI˜ˆä4I(£]x4ø¥vGôD5¦zþ¯Þ×l²ÂÐD¸Ñ8ùDä%ÁÆ‹J%©0|ëQõ@;™…+ÕàÃs!%mÔG¢[ô@ê¤É¸w#£¯$òÛ¡ÕŸûL{ ÷ï­©é¥v“YhG<öËVšÊå<¥Õ,¨ScœÃ‰Ûr$öâ:Ú+µ…ñÿ)¸ö­GëÎ+&‰9Kmª¹MÿdôVt 5™|ÐàN9]€%â ³Ñv»©?¬äó'øÔŠá'벋ŽeÌâ—@´O N4x½A`ð»³`&Û£Å#Õ+“¤¨„nj˦ԋÂa¯áa(ì~Ä»s¥·¨Ãþ$ãûî¾R3?‘‰'—¯s,¿%±ø7ò¿¼¹ çGAvy„QêÆáü:“­#áG³Q ê.aFý+©X$*¶)q -ó´>VÌ 'ûnÓÐɽ‚!½?PÇëtuVm™—qVcÚœzO¢‰¨ê዆œF-þçˆÁud˜ýÏÊû!FPi12¦HD¯·§(˜!ÂP“ó+$m'u!GìÓM~m6ƒJ¯ï¦§ôné¢ÍÒ¨å·Óe–èÖ}œù·bäÙpÔÏã•âÕ¤7)ýk‰J`49ØÔï P j$¯‡tÓ$—M.ܵôSãô›Â¿ca¯”ÿ´ƒò£Å )²_°¹lW€Nã_ð©ôCöÄ9ˆ¤'â4 ½V)ÚÙ¨G´T3ºÍÀ©VtxžÐxôx©9û4j×gùa°-ùs¨åäº\Ó«p6êálPú)}ú”sÃ5ù‘éÀù÷Åöw2Y Á5ù¯Ô!‹3r\pGòîÏÕ x¬°]óFQ´‘}lä×5„M쟌cåø©ªI©æÚ4ÇîÅÍ¿RÚÜsË+Ê™zfBþ«3$6@2#*“Ô34 SŠÖåÿ.òB¼êcÖÇ#vZuòÙèÿUšØ|eµšÒ^”šïú7HÒ'O’b|…€àÁÁªØ³¤¼ú¸Q–ÝÛœ¤? Ñ Ê^W ‹ž@‡œ¼?t?˜ÿÔrém”÷ \‚geŸŒy:¾N™QÑ{YÁˆ†'ñÞ>¡ò Èȯ@Ùš™ò ›O!ü6µòrW•HQÐ#lBsfšp=hpÿs¹I¢O_ø<˜* Ù²ÎôìÒe«$è“É%c¨E¢ˆc"{¥ß|" G枟=½<Ö-¾¹±Z•³ÏËÐ Ëyü´Ÿ8h¶iq¥K({OsS@œV­W‡g >ùë>‚86+­ýHÚ^ÿTpý7|E.Ç4PÚ̧†Ç_è»$È[+ðÔ³øR$"Ћ35kO2Á:D`°¦\sÉŠ>{N&0]ÊÑ‹ŸÉ;ð¦žÍWÝIšoïò¸Îâ’ÙT™5ªËKY ©¥òä·¹mlBó ¡šwvêÛ4¹Ì Ÿ·Ù×âQ`9C4, []“q¨-ÚÙðê-joÜÿ°–‹È8·ŒgÃ×½¸‹Ø÷oïÅ}gíåÖÏZ'§×•õmƒyyÑÝœ;ÅeÐr—Ç›OŸ±zEþT©µø³•?˜ £ÿ+=Ûõ—¾°öë—ŸXwƒÒz•uäÄ$ÛACºæF7­oÑûù¨=TS}T?0Àï…9ZÓòò;ؾæ13êö<8ÊÙBã¥Ë†€ý” ßqò"ß ›oB×Ýœ­T—_sq ÕX®’JøT`Õºø.ÿ7Ô¶$ò¬øôSõ9…¶ß­ÍÄÁï¨=^2Î{ -÷òï"çHVróÔyke¨tT®¹¥n$3äŠ2¡FÏ‚\ìËyõ+â[táóLT~°H>a}Ûý©(RÈ\´Œ[7$ÀÕ<7au1ÐÌHBîÍ&‰­FjÓ8©DCË­YÁ®C»‚F= ¾~÷_”ú/ÉËô%<•-jÌ7îþ1==rÓÐT¯ˆk›TÇ;Å!³X½ß`!XN7¥¥4¨ ÑøÅÕ÷RŒaV”mÍP•OíW|o‘AÑ40¯ÜC¢užRË:F¡¹nQ0{/X¬œêGy¨*â1ß¹å•yäÓ0A!˜~¿=z‹qålƶì86Jì€Ôc²7Õ3O/Á«0YhœAa¡´>†úmáì!Õ'q¶Œ™îpyÁnÄ =m?sÁ›Ij*;“\‚ø«@ym0#7ssáâß«RÁ8¹e±m,'÷R/Ðaô•WÝYA™Õ¢ímd+Ì1`¾€Çùiä‡^ß§V|$“º?µýøŒ ¼D²q8²TÉB[¯´¼Ð®Ò‹Ø´a Ê¢žCI´ô‰ú ICR¿z3•ÿ[¼¤{ËÍ&â§fG8³1Ø÷"gÇɬ!, ¤GfÑ×t¾ÒZGwæwp€¬þkÀˆ}r›G“Ùõ³W"’¥¨Jà¢ãÁA Ó¥6ÈõO €\ÂÒFPÛ;…2*“Ú 2p†CÔ(¢V“ûìe†½‚‘N#Dú@diÂŽÿk”šGáÆ8Ãȇ#;Y¯oÖcX£’O™vMâfUççî#UG¸çöŸõ[í¶¢þ-øVÁÿq«ÇuÇ„NÉÛq—¡ÓØ}0—`;ÇB¥.éøw=¾äÁf´Ã8–†ñFõcójr ;×;üíß§aÌ Ùÿ)à0¢ SÏ› [“˹?YV¿P`LĽJ£mìwƒ–Šò]bóõh?mÔ?­ùruRãÓ°‚ïŸËz‚Û„:?"µ„ÕfÌ­B«ó— pDhÉÑ2@ÓR$HÖrh„@„J°ÈöÎ×,QÄÅ/‚\3D~îKv‘µþ¸³$膃é—çcïæO—7/éüžÙÉÖl¤Ò!RöâªçÙ®TKÂF ´Ö4tM#ð%5µ‹eJi¢hµbòµ_ø?t<>[ù°ÿ”“Žüî©dˆò&^‚ýtÅA aQóüê¯ëqïäþ¼è ù°x þ‚R/„þOиOï³p—í}ýu÷«Ðoÿl‡Ä.¯ÐÇíÑ×"êu{È9óèp3ìï”8+ŽÆË êuTm<â!éWcÍ)2‘ÙöÄcIˆ˜Ç AOta¡ª€qÙ “¡‡—ZÀii¨Eƒ^@ù…”pŸtÝFuÃ="ÔP‚…¤à1wAÑ †ßôÛ÷—jýl%þù|HM¯o࿜iÉíÊÚ><ò²KZ&l)€ ËèqK^­®/Ãa¢Aö÷^R<·Tª2L´ðªÍ@ËP2Èj>ôÄ|å5G¹1†HâiÍ ¤©Ì-Jçšj¿p×þx-TyKʈõmÚ·ÙÂýãçÆ}Ý®m~»ƒò‹ƒóï¥ùúõãd†ßäÆ$z¨>f®~ŸŸc@Ÿ’iñ‘BwÝuÖa¯´/Ô:eÏ7*{ÁÍä ó¯¦\½ ¸z=ÿOüNfÔýyd˜}›Ì<7d‘@ež¾ƒÝ‚H•tâ jAËðBB¡Ô ý'íý¯y±Ý_ïÛŒ“é:ʦÏ!_X¬Œìaó ükiñ{þÎn…>„­j’!Ó&„¡€‰çüîÕ1#X}„PP¿uâ(u6«m>"û¿sþ‚¿2O3,?¾4±´(AµžL=Åæ†D4KxB…9©Ýš­b¬Á:|Þëm<ýòwšLNû3áaý_Îø4uY-³‚Èw…ø/lA½6Ýôçðg³úmÓõåÆÿc•Fn ‘&ü©øš „æG/,8)Mæ®;p½HY¶ÎnŽ—ëW"1U^&<œR… d†~nõJ×Ó¶v5Ž`vk5FK&¿êÌR²ÝÇo%OÝ¢ ÿ Û>Ï‹=5ÿ+á›´€¹°TuÁ¿2^Ü·¹~ìÏ_¾Š¼Â•µ% y£¬S·Ç|†åýGíaTYKËoÙvˆ&¥ëí:e$‚ü³þ‡ð|ß°Ôg†@c{)(Ì2˜¨±P9òW£=:…DQŸièi[áüDvíf¥‰~Lëç5Ñ pYZŒVx„uxx¬§ªÈŽÀØ:å Tî ¾eÓ/õQ¹þçUi|IÍ?Á?ðí'`ucÇŸ‘]tã¨ú,oϯçŽê¨¥?¦ßacÔñÕ¸—0-Ø€àOƒÓIY(øðDêJ›øÙ¥Ö+ô(Wtõ7Ÿ,ÑúùzÏ0»8‘‰td.]BfÔ&üCÎÆq”ûs‡sãsñéJtH·=AOçþtv?Ãð¼üÊá3]€H>&VÇÀ} uâ|9¸Ñ¬þ¶·ŽÞ]Ÿ:zµ¨´yz÷ܾ4gñûÝg´óo&„å$@ÿœþä««âN¤·á£âˆò DŸÂäNý÷–¦=ê%ÐÿYýÌt$¡ç"¸%jÐO©û‰”V>?GµÌãH9NòÛjÎÙ‰(Ò¨1Y¥zøójômÓË<µöœѯ_ëï ðñýÂë˜d½:‘ºy± ¶×zèOˆ®ãÕ ü¢‘Ío–P 'ù…¨BzÍSmò¢¼t9Î +éÌ}ôºtÝz=MI#rT7´IìíVÈý*(æÈㇶlìo^^îõõôóÓtW¼÷¸¤Æ•ŽYFjËסúÁaækØ3o84µÚNNöåbå‘¥‘~l$˜háxËÇ>UüT YJó(¥Á],Ì~”9 Ü›‘°Õ^OÑw(á¦G\úÅ]xúß º¢$#Q`¶þÔ„è§… @üâ3¾P1oöœî(]_<‡ƒ´©óÌŽž1_”Ušn¼;êU/«~Žá?C…geŸfýG\ìZ!ˆILœô± lÈÕ§N0ÐÎ$ô€}³6^^½þ âñ¶5]êÙxgg´9Ž4È}¢G¤qéê×@¬6"Ç‚oi[àõ"K .ß4(l MyÁ,Xö'ò"CkÖ]p1¬L¶ôS4Ï„PÌ¿ú §³bŠùtd”ñZúYzª…òŸir¿·¸¬dÒéÙÙ‚.NoŠÜ­ãÈúÿ6äKÇ‘ùÀAxŽÄõ¡ú¿Y3//7¾ Z>dØîßI4r0Âì‚\_‘‚%‘2>¾ê ·LÞA +oåùÅ_ijÐì|¹Šv5`ö9(ïä1Ð`ié°æ<^›M^ª„·/Û’éžV‚„¨á› ôü`µÔÌáÑísy¥pÈ"÷+9?©A‹C[—ÜÜgÍ©è”úØ£’»Û@±]Œ6ÁyòJ\L´ê>3Ñ(lEÞÏ# h=V~¢ú Hud­‹°¡¡>„Ïuò…èûDa¼x ˜Ÿ"•ós}Ÿ(^ÿVQ.WT!ˆÝ8&ýE6$ÃØýx™µÇ3Fê~½Þ§}šÍ†²9_gô2Ym¯ûãVEÃÿSbA‡ëy)ð×7vÓ+ò*±¨D»5ŸMEö¶9 ~dϤrQÌýNÝ¢™D«­×´Hií$¾ŠU%ú^¥Z¾ñ‰NHúh¾C¨’S+3véæmáÝ C›žï+H–0«~ÐA¼é!>í+& 9­›2¥Ôv¨¾RQŽ> xÜJã-Ù¼ð.ú” §,¤[HˆY`ÂNùÇ0#Rô‘~XÜ¿šµM =¿ŠØ_ùȧԨ³Èw…’­ºêÓ±°3•A—雦½{¶:ÏNGh HŽì!䆩ˆ Ðo‰è£*\U›ý&±#ÛÛpch䳢хî‡é's Wod´.Û‡z±¦¶üù‹Èà"/ª 2,ý7½ýüµ™ÕmS\!L›áàZÙÔ› %C¿fµßðTkJZ‰¡pÐrA;ˆ˜ü¬,pÂVNSr2UçŠ×»3†Ñîœ.G¤)]O2?¾Ëñã½>gø/ºÑ r˜ÜO‰U™ÜþûÜø;Rá@ >p34/ù-RöºÉ,Ì ¥£_??o¯qꨴH2¼,¯ÐÙSÁp¼æÞÔILYÀ‚ lmtä^ýçº)¢>PÇoIê³¹—/hÔ™r–jk2F¢õä£'Ã"RÎçÚ öCI Æz+8FÞÔ*¿O'gMï)•aéK‹?#~$loš¢lDüG“‡±Ž š°l“®¿’—1+“1]‘/}Ùð¾Ëœww+ð>Ì ±¶÷,òve¿å2,¹œ¡ýìG~ !±“kÒ Ž=J«­ÿ ž»–½@íøÊˆa×yǨGhåöôÝÛ¹úS$+¤q@:†®?þ—ãà¢bœÇèÿ új"þ:"ÁÂÒ·¯íÆ{K¶„ć[Ìæ)KÕ•ÑÈ*ÇÕøF;C’… Ûàò|j}üîEÑ»/œEÄýVSÕ¢ ë&­˜l˜Ê:qKu?4š.d)Ãö“²ˆ%ÞûN>y feoëªáÈž)[Ï!º¥ ZíIæ).Ì-3RqìM–ÍÏ„|œÐoô¼wË®…œÎŸöQL©:‡ù¿Šš5bfX8%‡óĽ‹§>;"ÆFãù¶¨¥ ¦ì·÷§†”:²I5Úœ'ÛĴΔF~Xfûäp¸sÍ»š¼ë%…ŽÒq2£¨Ù6Ñ´]öËÛ'1`ª …¹8êvŽ{ïú Š:œ h]0âT8¯…h6 ´ŸÂ¿x¡µª$RcsµJ ¬¦w‚Žêʽ蛟֟Ñò¯»|õ`ãOªF›¿_<óTp<:*kÞ¯^Â)%Ÿ3§s»/wO2Ö¼ª+TFRÍ2Rc>œÎpGírÚÃtRw •ÏÈ­| º†ì×Wë|-ëæÝX}I°™m¤ê4íå‹ieʾ¦¤ˆ>•ÏÑTçÍ•üJY¡È¨cÐ?›èƒþòº‚d·ÏMœõñ¾º3µP°?òÛ º‡þYUµ²·óîd5ä(9 ¢úX*^o‡ÄgF¾cøùì|­ï]²Ï¾Uˆ;Bˆ}3CÄE†oË^EPvŽÉ6¤ž2Ëó.i Ðч“©ƒoŠ‘SkË[eJšž†ß0èõL¼N«´–¦Am‹ A6hÆ>K\ìY籪œ=<ö ßxA÷9âò^Jóº³B˜|1y¬6“ºGS6s–3¨¾ów®7›78£ £®F;Ê<ȵ猩¸ãœV÷Ê›«8òÒ˜_ñ…âÄŽÙ‹Š.7~â!UÐûu|ëAJñù{iîàÆ"ÁÁv àÀ'S@qѲo_Zü­ÙK_fPw O s¼–QéÎwaûžÀ”¶§3òê̲àËÉACÎ VCGôrD}Ãøâ åŽ?!§0<ýüákåv( ó®Ü)4–ÈA© Þ†Y]{®ìre¡½…–öi Ú^œ÷§ çÍl–ŽÍÉÒ}ÜŒðܧ»òÛIj`¹ºŠß$UÏhHò—ÝÄû…ßÛ4Q¹éë÷‹àðuϦa ¹Lhü®wŸl‚Au´»åû¦/"Š“‡<>¤†ÆÕX.år)§25!Òb´ñ(ü ÃršL•=ö8ûXÖY{¶*ýõVº>]ݰèE³CôçÛ jQïÁ¡;Ú"¤¥<Ѫ?|lpÒ)8…/`¨ .»Ã¶°ÞвäV,]ªº*NôlP6A•¥6hS’6O.”/ÈR̪0婸éGñÚy!·^œ^œè(#@|‚“€9Á¾ù|>'j|Œ½±Î¢þÍùLN@É¥8´ÌjîÓ ‘™J‹Qý“nð//ú ¸ý´–+PЀùNçñ¢]1‚½Úù_äUGŸ?ˆ#ÑHÄo˜F`1s“¤•?ê7|Õ [ à´%E„ˆk/ã¢ÃÇ6r°¯¬8 ch>ÔÑ:6‡Àš'ÄXÑ틟8ýËHú3ÃgJ€@ôçbaÊz 3ì2QÈÃì^«µƒ·U¦$É£qÏ0Î` ³°HN`ýßwÑ„›Í[­9ø›'^ðsØø{êÑë&i݆9#m»PIë”·ìpóʧú`× |8:©«ÊÍ “eúDß·´ŠŸ•?ûÄòÇ™Vá6é ȳ±;ÑcãQý-?n\úèãÅÄæSÓ´@*b=Š@£e³¿Ö?asyøØÜ8`óälˆU(ÜXI“ÉdÙ‚°\+_7*ç¢m>é(ƒþOʵõ#·/ù6?Aß®‡éÔ…:»}paþa· Vó‚Õ8ª[\5Ç7Áa™? åÛï¹øè.Úá»ýMëÀMiUr\öC^%/>ñ;üDPÁ} Ü׬¶5’Å>,[ö)ËDäññ­GŠSÚR•Á3^ß´|Å9°uµÖ5†)>´I—vÌVÒl}¾@ß‘-`=TK1NV/8y‰H ¥ÖŸ‰œVÃIk¬.cBÏb#Ék5ø9ç·nÇ ËÆFÙé“ÂS£‹¢§«ö§í®!b¿—6k©sÈ= ~'ªZšÞÞ’æ$¤ ê™ÿk ~ û{M”³sa¥Ì™£+‘#s ØìZ ƒÔ+7Ë@ ± OU§ó̳—xͺÃ]ý‘•¿ó§ +K?ƒ9áÙ‘¢Lœwq…阖¹çÞ‘ô›w„·dm²™çGáòÇ´(“?ŠI(P`Â_6ò©0LµieÀ† WÉóiK&{ÀuPÅ}p Âm¯7´Ú ìã;E1ph€Ô)Óx[4y¯£²pºq²ÒN¤ì.lS”.z*ì5F;¦A~JócÆïÃ^ŸhÀ2P§äÓ .¶Û_Õá ¨1öiÜÊ:,íÃ¥h‘Ažº(ôý·"IOÁa×wÎE«Ÿ‚éWóf4s&ÔΩ¯íMы횒L—L²ÄL¿|¤KQëÒÛqÀaQ¶<^>ðζhMvaZ¼ã´â{ñ¹Æ„ãí¹¤ï3HºgªïcZ84&´„Ø8Ð× j9JébX±üE#¦"ò µH±µ÷Š®AŒf=•‘û kýØ©hã §þSœ— íE‹“n t0ó™µ€ ^È.8%a’–;/~AW–ë²·g7Ñ­8íʵÒKvÒZÒôbs‡À*WžÓ¼Q÷O„’#ÂI8ú ‘'O­²ðåðYÊìÊSü}]1s‹9Dµí¿f!¥ìMJÊ1"Ú<Ð]¼£¹Ìü<Ábz:¦zT€¥žW¡øð˜«tãlž›0&ÃjæKâ~Ÿª B½ñÿ!sß³ùFëf×ÁN|ŒGg$´t¢{k¶é;~u šT;¡È”§Á ÅÄüG”-Gôµ/›äÛV2â©Å&á0nEL}Á…Wýsç7U™HÒ„Fˆª’ ¢!™Ž›¦qÁ¨¥?—–LFÛwßîŸLˆ¹…Dñ·Ô&z ÉfðÞÛ¨>] ç@^6kà´áŸ§+Oᆂw‡¼Ójþ¢NˆëMƒÞHóæ7wäÉëZô^"#Û0œù.ø„ø+HcM:ˆy5ïGÃíÃ2èä~Pº‘ØÂˆ^1œ‘ýÈt‘¡…9ýEþêÌi:zÔº¶øø(ÁÊQ>Àr5ó“ŽHá 9éõ7ñ k¢lÌE+‚äHhè„EE +ó'À.K`ôwÝ®èã8öGͶ\6 è!$¬CþI z^#ø\ 0i³ÔÉÜ…ŽSåÙE´Å?l®‰Ó2e`Juźú3$ig…„ͲƒK%#õâµ{NÅàFx2Ìöf"Ѹwm,¾Wzœ²lºÂ¶ZØ#ù˜](itë œB5 4¥Ð’V…³PㇺhÇ‹Ëõ„c )ÊŸq ÈÃlòQÚðÄe/ŽJ͉‡ÓB.öÓ€]ógl}*©Pï̦¡—e®RÌ–ieÁ9õ–•ãláÔמO¼x#lÉ+©žü÷œõÛ,̨)“SAXg¡¾â)@è„8šB·Úˆ5&L¦„½JÐUX)–[!À•’ ›y`^ ‡Át £YM·¦UK”sô¿ÐÚQf$@ù KÕo™Í!!2ESÄÃÖŸŒžçÏF_>¡Ï™ë76Ùÿ,°wñ^¤µ‡¥ ¬dãjåÛ¯­fô„´ˆ³v¼ó@“¶aÜz7¶L˜j ÛçJ“_N• ðé—*ðÇ:.|€RÞÌsÑ,v&Cû=ŽñÅ~*ø¨úIß?¬ƒÛ(«euÖH™ÞØÌjLá‰k? Šé¨Á?¦•8 áDm+]¥Â‰Ü æ>[ä³VND<ÀoˆKg1>i(ë˜S‘3­1/ ¥ÏÙ~Ô}œŒ½¬j÷Ü€8CÎEÉÔ“ÈΑi- ñã(í42 il Ü s&%C@ºð rpÇ8nóBz7œÀÀço^Í‹*_ Q¢wb 3*‹¹¿ˆæYô”.ZͪÇ'H†bDSÚN„”åH~mÖÞª—ª„Ÿ^ éZátgÓw!5–^NŒoæ h6ß‘ùÂ:ûï{?¹£EÇ—ò\•ohÍroÝåWX󉦈ë¢f  Ž]±ÁS2­Ìà"ùÙ³Ä"3/³â ¹¡,.Õn+ÚPbƒj…Ñ›·——\9Ku#U3õcV:Wµ¸x×±× ‚’ŽlóEÈpÃEàß·òÂ$[¤éH}1TQt 𤹷Ä$s#ÇbðPõ²˜NÐöHCÑfA¸áÙ/• ûd½mš‰‘~|Nè oïÑÏí²d uƒò©ò†ô裣EN=¢C·w 6$–óxo ïÄ’{g\O’ÏáÀMŽŠ?»T K˜ÌvYèè§vó»h_»n2«“0—ñ®M¨Gû81[ìÀ_ë4ü4Ð&³êa°³9Â<ôÜÕ–}î&°2³Q}b8!ÂYObšy¥ä0V[ŽQ`•³}>ÙZ ]õú[4¦[.he0lÍ; à‘ǗrFh‚ZÞ>æÔßnD$ôxè½O„m½? ÜȽ{›]6_˜ ´2*pmÐÖ½êª%…ÌV-‚p)QRïG3thŒrg0b‘§!¯kÑX’#YÍm@í‰>åø7L+BLµ.FÜ{3óH›&°)€>5t<½“— ͹º&CœxŒ¶wKÝ-d¢¼@eëÒU4gv@ÉÓ—–]5óY›² ¿êÜÙ'`JaLÿìǬ2ÅúPÈÆ/&툔¬ßg+”tßÄ«qPY4ÁmŽ‹¼_g÷[=3Bÿ´´ö»&rrÀ1k¿ö*"ÂoÄn¡•¢Vüö¨\œ¹Nm6J£KGN›¹ùÛ³c|êžSM"®r|šà/Å“ m$0±Fu!×ÃB5SkºÙü³盲£7ÌêÃþË{‹v+¬ZÊ=V\ÄþQÅîä—Œºàcå©Ít°*_còÎÚrR؉©Œ\¸ÁÔMö>dº>Û …¦VtThð¥@`ä1×^˜ážm¬A°š‡ »‚‘l®„Sìè4œ¢”7êÆ ø[8ò?Zê±|¹øÙú6õ昙 òôà@è½f°¶‘yß©úÔêœï ”²„a›¬svõ=„*5yB(V@p,6 6ŸŽ[Bä’•"”ú·ñ˧ïëz,únüõ‚œÍÒ²´êŽàR ¸(Z?Ì 9'á+FöSŠi Î -¦5)½ñ¤,cóWBtEiÆ€Uå`œ`uBÑÏ4J{f‡=W·\ˆîøƒõ9 ‚iÒ®5e¡q¨-A¨”œ4¥ÙMC믎ªþK—eÐ?´ií¨D±L›=‚ù>Ñáu~“€ÍÔ!„9åŠÝgã!0öðN} w& ¨úeêÇ+Ó[€Š?®ÿ3Ч·Û–tÛÆS9èµ×h“jQ,÷‰†Zø¢f0ãÜžh¸þ»Ü­) ÿ³Ø·ß{.ˆŒ"qKa„„€ÇE@ÚÔàUøO ?Š^Ô¸—A|9,$÷:àÌÀhRäjª0ò×îC/ØíÀûv-˜9(¤ ç‘èMõP4ÂXq>Tç@QS$ŽUÅñ›mL †[Àì3££?©œz…ã?EÀ\ÛZ]Ù+/¸áµëBà‚»]Ÿ–JmŽ,hÖù §¯ÔUPi µæp ÷m¶œ1‹Þ ®¾•½Þ¯Hñ)Ý ÐÂnsÂög™ÚP ×Ãw\G¾Ì¾Àê‚Pû4°Èª>Ë•/E™‚»Ñb×56w-ãt¾|â›tŒþMEÜl‰Î™¿a«„„Â’º–ŸA#@E”<£É<‘† V³×„_²‘PL`× •ø×«Ð¦Š_Æh_É­‡ÂëzÙý5Vêæ3 Ø.¾Ñ€‡± ‡:g˼av1Ùz[8«Ì‚>RLò*‹äôœ7(jr¿ŸÓ3½;ú¢Ú>þœÔ]|#Öïôîk¦³ŽMÍ48H¼±*b.Û€£Õ>çå­í«Äß·U3œ#«"Ѩj:YØ :ò]5õUñÅÐÃdÅËYêP6>²ŽKn’,a³´Ó-ùõè ·žQåFŽ:­G’κŠ@µ¶†œ9BŒôw ùóû’0pÍM .@¨w›Ž­á÷êkp®\«Ðõã˜ßìÌ¡6l`&*M”æ"uÀÑ´íº‚¥5*AHÆ–~ë^ |XãøDî!aÝФw´¸YŠMAâ .ÂYÙ¾ÖKÔËr6¾D¿«4|2å×ÐNŒ[Ï^]Ÿ³D¶ïb §BF¼X8n¼¸(Jú¦.¾„¦2’ Бø2ó:Óú´“ £´éww ûòÂPÌó„ta‚+ž÷ÈG@\ïTU>sÅùÎ\&9ÝÐ@a*[ׂéÔ’)èÃBz„áÒ?Ü ÓHh^À¤`,Ôy.x—j¶wÕA¾¾LÛE @ßÝI»m–¼µeæ5Ð@DwªÍ’×Ê%j][‘u,‡ 'ß/sY­`§¦RÈÈ*›Ã†dRïw€D‘ ™P0º§™®îáÖ$ˆï߈յ×ù¬äŒ>%bÏSYà#Ti¢®¶ø¶¨ñZ{/“îºä&t繌þn–¶²‚¾ù5"'lŒ²33ð«Ý–y~~fÅêáõùAî§àµ+RPù¸ç6‰©ãš¦Ïy_Â索)´Ø‹ ü•Ú®¿ôwOzx¿_aJÏÙ¤y@j4ϱOãiê²î†¯Æy´{˜éÛY(ч±Ë$y²½»xÑŸ9¸^ÿð𣹞pÀ¶q"eխðêV‘½AЉ£„´O¢o?¿r 5–|¾ô±£Å¸•¤éí;'ÊÏ8ÖT²¨ó·çad`’ Á‰/gÉ œ 1åÅ ‘¶û„Éž³Z°ù’¹Cºñó2^E˜a=Þ! pÕcÙ¬({H¿‹òî«1‰c¥´3û ¡ÐÌ#‘rÍŠ¡–QëŸÑØÉHÁØ‹˜#³<Å›z܃bZ&X4iàKHÞS@´Ë%Gu4+}ɨr `Q—÷±ñ¬0ñJÈkóùní·QGgeY,ÍqjÌ…~âN»$ìØ*Âa.Wiþ^~~×ì‰u€Æˆ< Îe HBm"ˆ9‹69§Ã˜û¨y¸FHJÙZ‰‹'Ыù.îôÙnU€Áö»*‡À]Ÿiwä2i&bv—y€OßÎM`£âº2rÒ*\0o%ãAà‹Îí¡`ñÁË´Fºé•LFÁ]ò¾#ù5eQæ´ÚýäâÔÕÝ™Ï-;’@çÀˆ«÷pñõ³2—¶JèøûÈúW¨í øÍàæp˜ú]%­X£êã²÷M³‚lÎýŒã!0šEþ\Þê”y®+ÊOÇM_õêp­Ðm~ÍÈK¨~…ÙëKvpê’g˜OËWÉ7Z¤h•Œí:¹aêq(#¬ÿ V¹$S»ô·üºŸé‹+ îpk ¢º?¤ûøâdÅž¡vKkI£ra±Ù ™Í#è2ù§î’ã6eŒá×:.u-+óÚ½g5#ë%#TèEêFõó‚D€7ÎLNWŠº)~D—ÓGçQ<Ð&01‘•*G+ø yÀ`Á×7{4Ü"mnÖ­¸šž\Á)~¨¥{°Z¡ºÆyKþº¬ÁE[Ógå-wÕŒºÐNu·ê‡˜Hæ,¥Ê¸-¬!h­?pàv#ÎÖ œˆ2eØÉ_ŒÁ6P•E ÎÚsPD¡‹|3¤}xŠ •7Fˆl^ë©!&h÷£ÍÒ{KB3%;º€±=—½&.<¢Ôƒ á¨@tì·,•Äa&[ÛV{À¢ íb O"ÉMXR›¨µN°BÕŠ6šÑI…á|ÈÏJ$rå²maIUt&!³­ú¿ŸäÿzUHÞ⃯¯,‡eöç:—“ïÏ@ yNa®`9uçÈTxCõÆáÞ*Ëç¢ãxQ´èîý'ù!ò¾®e±=íg‹#)xâ1W"œJ…ÉÚñbðµ—b:•˜?²ðÞ L)(óþ=ûuOϰ§„›RPw-1DôœÉÈë\õ Iz›ºÌPNËO €¹{­¾uÈî/·°õ w†lü‡Òd.f˜êE4ƒJ³2œãƒÂ\|·^¤â9BËWÍGɛز9}&;£Nl›¡ Re¬)¢3t@biAØÂ¬PZê?[?A{§¥c:gB{Û8ø¿u/Aio©ˆn# ¬ÒçÒ´xNPÄN tk°tH|ÙMScÉ´½kqd73] ¤<‡´Š"ÑÂÀ~T÷lѬžœðb6~“Ì„2y–\µ\Û†eíïÂAÓƒøb't2ꟖµEÊùP$ïž²xÕÎZkW´S¸pô†?³¯CÈø)'M+uÝØjvÏU˜‚&áÂÀåÛ ¦Fö0¨¾œ çoÐíÒç(wW#‰ËAU·0w#ejH=}%ÄBì!$/Z¬Ü¼3 1I…úáË@6„A‘t$™x€’8§ðóš©{ aH¸ê]¦á·^¯›Ó¶±é>“Èî9¸?N̈M½ÉêZNÛš3{•¬Hhú§¤¦àB9þBB³;‚RCpJ–7êQ¬Î}ÅÛVpäcK~Oi ÷ÙóA5ù$xŠ;rÓ»~ãÞàÏÜ1J7ëp¹¯ÃñdX•ÓvE°2©Üf‚:Þ9ô—F¨Ø_Ž'Ök? W¹Û;ÒSçgwG|øBî9ŸïNqþî)Úf‰”±ë B~Îø¾nzš Éκ½×Å;“.jh–Z«$¥·#œiWdk {ÙŽ“’|#^úpÐâ~ŸÍñîý¤¬ÕnéÔ9ÐÓ(¨†í–ØjСdþû°ó ›d?ž>B†$hkÚŸÁßÍ5ë„ «u Leó™:ÿpaô.b|÷­V«SÝòY)ÃEº˜}‘w‘üDÛ.x€EžMM浺´ŠÓßœ­qÅ;¶¼¦%:Oå뮄߃ò¥8>4" Uö¦þ3ó⣎¹4yˆ>ï)rJZ¤Ñ‘î/æ·C³^Fñ'«ù ˼¡gÁèVê´ú#àb£ˆ=`½úEÜÈ=aµÇÎñ2]­+¹Ðd.AêU˜“CSÆO.Èɯí{&Ÿw‘Úv«Vwô*¥t«î±ºÙÊY÷5»e㦣é*gi;@æJ#\æ`0KJ›Ü[§N\Ö¢ŒüYË?¢dÈçÞ6ýÚÝ8$@BJÌ/ÃúÝüÐÚôDëZü!} ë€t$vñfC©E-ÜXö~:Õe´8O7¥mïd±^D^NŸYpÒá?ö„kº}?a>©ß+‹ªBI!?ÃÔÊï¦OW þ”Ðäûà»þ·ýþI1©…ü‰äÃ+ÄÅ¡’ÔrþGïòAÑõG›Õnpg«' Ýž>dåý¤lR´Z÷XÁôrHu&(+Š)öø¨55¥mTKÚ‡òg9#£³7ŽG»¢/Ò¶U†b\¨ùCÍ”Ve_©ÍxZÝ3z@Hä1ÉfÎ@W×>¸>Èÿe‘\ÿ|o;쫬ϳ.Q¦¸~†¾ÇU¹s[t^h‡t ºÞTÁ±¯”?¹{ºfiÖ Z“ó¹ZéSmí¾»öi°:‚—=He¸ý´wI>½‰#6î_äðžðiÒýfV‘ ¯Hÿ Q‰ëÑN¬ÚIgÒ¨­]Ë{•íH‡ËÀŠ<5‡ºÏøâ÷zI U½†x@ó ̰~øˆQŽC<å#§Øn ôݳÃ^»0ËRwËÉ;0àÛl—N9%ýòèwÙLW:0œk+-dA –P”¹ôÏ×/ïpë,²u¼Ðu©[ÁWbqUJÛ¤:¯(Q1Á¯Ž€|£ê¸ÿNë™®µÜ¶,(ëÝÃcËyGgÌ®³íøpàî*uz#m)´ÙHŽ´§Þ ÷T.ý9¼óå“à‘KÝÛ€MÓºÖztÈýËçÓ©¾:cW)Ôv ¡\ÃåeùKáü‹Á„ÒWE`ƒð–¡½$•«tBèÞj··@ƒdœg(ÝH—63"S‰Ö¿Cg:âJLdÕKòi±lzcöowG3EˆÓ)ƒ÷ñ-Ê÷… Ÿ°Üm3ýŒ,†£;»Nrø¿â…ìjäGЙÞÔ»$–áîCù ¨u§» «Z»ÂD Í!µ©b?p«œªk¹§™†ô-´¦ß¤½îN ‘³Ófô¹­’¿›ùB/½ (½ÍþÍú/wV„ìNŠa †ô¡Ñ:k“Ù Ÿ±.¬ «zݸ¡ª`‰ÞeÎm¤2k»ÅVÆÃ0R´¢’Œà£×áépóc‚·„ðS¸>6ˆ¦3[/×Ìzé¼c§êzîG—L)Aæ/+ÆD&6¬¤ž§Nä&zh³êžÎ  {à¿äžn³Ž_âÌÇQ5±¦ŽS|E–gOáy)éúÈ|9W>¦…#uáóì÷¥Û Ö¹™ûo†ÿˆÈþÖá¹6/Ñèlçròó^üô?HSoÄ`Ä1\ˬ»«×;¹ÍMv·,[v¹ç¦üÄ\D6¼%^âÒAxÁáB¾{ZŸ\Uºu Ãõ[ØŸ@’Ÿ ÙS }'í}zØíºF¯Ù~dƒ–R Ckø£°Áù¼ðRwÃØÝo!J³D¢œi¢ˆò¥Â‰ñ-«Ç^þ%±%g'y¬FŠ ZÓáC¢¿ŽÖ–ÖV£z,aãƒÓSÜóŒôÊz¥iÕÈ[xá• .•ýiúf¦5É>ÛúÚÉH­2_ödhÙt˜¼Í{ üÈM”@&[°_}B•Ùë.{}SúZŠÚÎM•;0?òNÖ•ÆÙӔ᙭ _&¬"œJÜ(ûó*‡ ‹mƒ§;öÚv3C¥¥qÌÒ ü¯5´ººûG@ˆ*ÎÐ9¶Jðr?רvèˆÔËù›·{VÉú l"¢ÊÀýQCh`, Rí.j@Zß*¾U kpSÅæ'`ÎK¡)»¾€´•Ú^éCx´*’å¸HF™ÎÎkÁ3/o……É&½b·!šŸ¿2'ƒ !t‡‰qŽ+äBŹH\²_)ÈP0)°@»›ÇG›~é¸} ·aº,5 •¥ü`õç§@òÌ!¶—^P®O9ÝÓUn*Œ…’ˆ-te{…è"‰1úêÏ'fÍ’6ECËããàÿàj ®d Ç'ñ˜ëéâàCöVi_HQJbØp€|ëbA]%‹'—dG“y嬃ÂÊ»!Ì”Œ8QVIÿ››s`¬muÒˆ“o ÌÓM0´ +SrèR ¢ÂÖç íÏu›f!£T3.§d\úO~3T`,ôÉ…&bÙÏ ÉÃÆ’+Iy8=71_ɼDà¶©Ïï)eºç_Zѵ[¢‰q ó¤Ìw,! ›åÝeR@5ô†œdþ0±>fì$Ù®™p0zý{Ù±Dܰ|3ºnYáæOm$È„lGÿv…ÊQêÊtµÆÀéé4j{yúBüŸVrÚö÷§@p±Ë-}³ hõ¤±yê{•+×bŸ²7ä‡e#ø³â°0GÔ&pMls3BÅù{wœ·1ÍcfçZô3ƒ¬ÔÙõ´’Þ†í¦}^qð€+BÍœÆ}tÙžx¿eÚ“;pª…5œR„eëÌé¸PA;è%?QÁ"L@ÔG°r’ =QÒ£(¦¿š¬âüó;Ý^<<ûÀ¨±Z³X3tíáó­ ½{~ÐVXÄR¤Æª#F—þê^Ÿ'ËZhÿ<þéR•=·_Šx@ Ÿ 15Úˆ²n ‡œº ØøÍÛEfĹ“Vˆlû ™´H)8Á@f¶zÝO4zM«51ÿjºY9cÒqyå¥DâV$*©bü¿ÎÚ¡m8ˆ³¦³Ä®û÷õÍf îï…òäLç.}€m‚à2 ¨=5/×ͨÙ( Õé»+üű'=ã&NwR_ÈmNq¢+ÐìÀ9?u˜TµÄ2ÏjRÀÀˆh A[°ß|½ëw"–âõ$„†¡Å×Ñ~OXtfdv´È±ŠOx"]Îfes NlA¼Xá4òh2.âw¢QN¤ƒMŽ &Õ¹¶\E„Q­QÇšvpìV… ü©¦çøšÏ“Çû°Kz¢†¿?åäN¦ÿS½;|—„\²OX úádž Åø¶(϶Êÿ&±i[ßüov(íÌ?s=b4d0“P­{e› ½„¨”„@çHesncõš—/Xájl¼.$çÂ’‚ò9—ðãêî¦ð@A÷L?†©='Ö+ Ûš9K…ܶ´ôû4EÑðyôï§D˜ ãqaðH6Y€˜Y}yð¹¸ÊÆç 8ñƒÚ»¬Eàv°2¸ðõF :“Ôš'V¢&ëÉPW|óHЮEFO7ÅT›+ƒÏf}78ìð‰â¼às冄ÂÜ\À{ѹ…vŠÍ[ ¦ÿ@ß{xæºð~EÉæÏ匇· æ ót3ì}àuª@(€;º ª$¶!|õz¦ÝÆ8æÂ¿fý<\ î?ÒÕOÁ«1®)…n'jRÝ+LÄîÝ6d›“‡\Ì|³ë¢ªúe·YrÊ vä'lRœÌà¼_ çÉIë&ðÆúykÑ7 Î«” 膱é€3dŠE.ú/×~9ÇÊ]ÿö#³ú›¿ ojéŠdÄâmÛ.˜ãp« E¹^ó`”3POG£ß–‚B9Ýfú`ýí×3¦Ì U‘3lFWB|Zßkõd¸–@׊±ú¤Ï]U°ìgÉ®Óݫڊ—TÁö³zIñîšG zˆÔ¿“ 9SÍÐ2ðcS&ß`"þy|;ÀB?V‡3¯ãhÃSø7ŠóôË€‘×`uù2ÛÈ ï„êu¸YÏ#GšÐŸÒèûs€úÌã6ƒ3*ŒA—nçO7è˜ñ†¥*hˆ‚#ÝÖûs”~PÄAo«˜vSEä~ž‹ç›úª¸þy£ ûývøÓ¥ýêþºè¿¦ŠøìpÆVho·bäXà¼cÃ_ëláª^€ár5Ûu¬Ãô2ÙýÖ  ðl¿hç°úcÏJÚÚ>Xkk00`oêÜi‡‹VY—¾¦Ë÷øî?×ÏzÊ( ³Œ³.ã=­o‘GØ¢¿áïX‚&š„º¥¨mÓÙlßš4Œo˜_ ÙU¸]û\Ø=þP¯«tNàçRI582PàØ¾®Ë¢’‚hô3GÍ£ý­&Ò䛡‡LÀRdÞ›H/¬S¦YÈCm×D$ä*rƒíõ·>o3OÇ/oŸÃ]ò@3E•Í®yÄey®‚ ÅÍ—o.ŸÆ‡K#»ÝC<'PŠʲ˜}¾ â'ßÊXºcc@ü©i ¸i ù( ‘šÔ¥‘³‘æ—iÆYˆêµ>o=rü½{~ºnnï‘|õב¾sÌôÒ•ÚUøN 4AÊAtùÜg/Á4¢OípE˜/²eÜÏo³kÒq2ôôG§úÔ¡€~ GX“ ³Ð"*º£w¿(Bxj#Š ° à`V°“•«Éã0×–Ý¾Êøq72åôIUÙº°=. å碪ŸÊLÿz&ŽXúÊà~C0h{%H-s³'ÊÊŸÉê ô^5 =m9||~×Ë#›ÑöîåèÚˆsH„9ÙÎ=ôc× E·ú|JV Ÿ2Ä 7Fü[¦Æõw«³ Š{H$©#Ð{gAɡ҈p'f‡2˜Ó±Qd!àÀ|õ›ÏH6L;ÈoéïÌèÔ¹+7=¨ªvô2 {Íž¤ñÌ?Ж1ƒò@1 ^B'è·ø+¾ÖøÒù#×Ô‰îoÒ]WÜx±{ØD&]Dï’2ëÎITŠ•ÓÁFN‚އçû…íLŸ-Ÿo}qa ?¨'ž#éå—Á@ë?B ¯ú¢jX§?ø‡×Xzò—‚ãÒbëäª“M;èO‘r¼ödØÞø ĸ´‰kÑ&‚¤_×݃ú Èiëû&$îÿ<ÉJþEú{D ©îoßA·É‹Ó-?¿^‹—Ï›Ýù |¼˜»þ(r%ß>çÓ*Ì-—‘a îÅ€vå×dè‘eì~ŒˆÑ}$ë?ØøÝS± ‚ÀñßçíJϓɑˀaÀÏa¤ì"–aŠsý÷m+có”²ôüÛ”;ÓÖ}ûóêš,‡%šëvç{-ý>ŸÄ7;v Ÿ7lË:o–èé”Vº”ñ­ž‚켃›k;L7f´_èdËï·øÃÕ©-‡Hsi¿\Ë—â>þvÃãê,õ‹Oíþ)Êw‰t¥}/‰×á9ÈŽ9Ö6s7Þå[˜‹Ú”(bÏW’.B&F ¨|É«†Ž³ø+£‰¼«!¸ž‹Ò“c)òÛ‚ \qw,è–>US²*ÒÊäö¥e˜G •KÄwîf²—Uçìóò«ÀÎôþÌuÍ_¾8œ£o~Ð8 ¢³çü}ùh&õ´B0ñõÖKãÑ}GàÍíÚDß³¬Þ‚É?ͧ—‰_M/Y“Fø5M/:ƒCwÙªBUc¢A/¢`¬Fùáβû yÑ€'Û@9Ù—†øBû½‘ùlu”2ºyC¶†Õ€%ž ˹Õ™CdjŸ< êv¤Æ¿!âXç… ±Ïò“‚¶QN’ì…™"ñ‹·E'óqË^|–“ Å+^¢6?ú*$+áÕ÷ ûtùÏš;M9Ðß èÖ‰¬‘GÚ>åˆOžß“z^§^U[!0•Ð*orñŸí éz¿4t’.,jHöÓ'½Ò DÎæ{¤qs¼š_<ÓÆlZYÏÐ vœK°%rƒÝØáIN¬­©pÊì1?y²ì04"©¡Aȹý½öÀ}Ùü€ëçÕ£RBr'áÉó¡t‚¯Ù` ’`Ùœ`±wk ÑH>ß~‰µŽ—Oè—eüÅÈrÓ/QQ%dQ"÷óÓó—„\ÀÌñAâÞØ)…Õ¯™%¿Zß1UÙ†K®ãHbRñ.³ì Ç®à0òó/áåí»9]œ9ŸË.¥Ùˆ=4qv˼f·UØèЏ‹¨œüÙ'RjQwÛ»Þa8»§!YÂʆ6œ#e‹Lösû'T¬ðŽœË ÝA¨S!Rg·Rœþ‰Y¿*öá®]ù´GÍÙГAЄóº„êÔ9†S©b ¤¥>ÂÁ¦dÁ!LÊcB8BÙùÇJÝÕ*_w܆⃪;ì~O:½<nŒ/ÖnU*Rkä¿j¬ž¶47$i<=ž?®Ï^i )MB'—>Vgi¼Þœ÷—pÔY6‡—w¤oDýué àg3x­é>­ÞSm?¦ðâ%ÕH/ =ÊÜ×ÔßöI–œÑ³eš/;ô‰Ã„C¼ûÑeúGtÏ}ËÙoƽßßÏ’…Ëï—ÀƒÛÏì‹:{¤Èõ/ÙÚE4ª4Ÿ¤ÒeÌhˆý>!-DÌJê¥ÇfòtÒ†r³ý *eÎÖ„ÜòT`v]WM #Q0‰Cöyq€h2.þãÛ¬PܣǙ JÙ…}ITj-fîýÇaåex£iìK”Ê)„‹¤]íøtBf™æ}#ˆù‰ èÆ]}ú–Cë_o©7f–‹,Ÿsg›(Jn²ˆß>ùÇ/,”ßö†äU[Šé‡RíзM\Oa|õ\ŒzŠó ‹ݘ¯Û­¢ #Ñ@*ÖïEƒ¶à¢X^£Cú½[©%f_Jÿ2=]9ô«ÄÜÚc~eö Øç›P ž‘Õ™Êâ.ô’qŸºš6‰D[H¿öòŒSùúɾël PâFÀgì{§ Åg0:Ö?ü56Ru~\5Jﮚ 0¢›È‹*"8¾Tÿ¯ºÑ&t«Ü€wWH üo­’³ñŒK’éïÆK Ó–²"#–©Ð¶d¦Í@k¥ŸÜF§¢‚EŸEGáUG,Œé4+y°á¹aD½Êrœƒ4ÃÙÑn~†ëÝž’óü!íò,¿{uRlÛð$;mÈ꜅}}²È^å)~.‡¨å©7­ð1gìð/ÿ.¢ŽôúGÛuæŸׄNXW/ÍuWï€Öÿ–vë—T??'¹#ÎÔ•wÏÓÍ£p©7ûf¢WDB"'˜ß¡´[PÕÏŸ*®Æß«z¯’3L»çªÐv×Wj8Êc{X}P꽦_ƒØæÕP²(·ìŒkÐú³,6ÊL¶ÀÊVš{Kw[Mˆ[1° Á` ro`½Çµw-ëAÎ FQð{›f/Ë™ YÐúB½ÙàuÞNŠ/-Œ’™Úë¬DY*ÈJÁ*¯ÐwYo¤q´Ù »ß“‹j•V2‡+à ÞTQ‘VJ€@I¬Ÿ1–&PÚšŽåØo¤g{’ß^`nÑÒf¤:ýŠl‘¨Âñ×n yY±G=X,˜âY`ñúõv´‡êæ<»Ù˜Se3fYpX?fêušÃåìK9ØQ«÷Mö`£zZjÚBZ÷Od³Í'<Ñœ“†ÉÑÀìp¼â>=§ÂAÃ÷?pVt{¹Øq“é»v%7,ÿn·#w¦¨m¨ä=)<Ç ÅüE»2™òÚ9O†Ðä×éAƒ×ÆŠ÷ÌÔ²Æ~ïêMKÀß®@4ë®$áRsyí2)ÉNä ÙJ5ØüȵÑPn÷¤È,÷Ÿ…29Ud|º›ÏÜ$VÀÉ `âü½álÒ©–ÃùÜo2Ây°KB^m @Þ@ˆûv%øVLzM¶«&Èãþf-9ú«>ú˜-ìvbEt±ŸM´šY(¢ ZCŠë °÷p\ï7¦Hs`á}^$µÜ¯&šèwFãn3§¶Gvã¼K‹‹¨Nr¹ADp=à +™)qvpÀePe|Ïž¾ñµ4Ñ(nlêØi\¹:»ÆÅ™ý)ÄM'7ÿ,[ø™a¦Ì÷½5Ëå'és~æZmàెǦyõCPœÓ¨ç)À°Ž´ö¯V§§yéäÜkÊ­¥ŒCÆ¢ŠÂ£Oë)B!÷ܪ²Dмµ½Ý²3tÿ› FüŸ–üÝ+o.ÞGbKMû M]èÖõ—!P§mc˜ŠÕõ+SäIs<ÑÊÒ[ný½Íâ³39ªÞ=%¤øRT`ø6Ñ'Õ¸–“›Â+ðå,‘°œÁâÔ~~•íû½;pá/¨o-òï¦ïÏ­Îbàœë»NSQÉ$ˆSɇwÚ00à(mNH·®íqÜÉ,f[¯6GNÐ ÜU8Ú(e¤®+N0\ÓBQ}Í¥¦/xò[YF-N %:ò³ -ô8?f;¶½\‘ñ¾ UV‰–^ïýó¹¯èþ“!ØÙ zõŸcŸs†˜w¬¬Z§p•ú€cÕyÍ^¤“;d‰Üêâ$AÃåµ~'¥{°`=×u "k–7TxßܾGˆÿ[ãŒVf–$8ÏŒüD@ùMÚ­™=u±¬×šþñæ:è0~ˆÀM„c‘ÉŒÓ^ÞZ &ñ\5†jõêaN–E{ÓTZ®—ÜN¿bdNéϪ‹ ·MC'QÖà˘ÔA„‘ÿw°Òö‚ç⌇€¿ó~´°£žC¾¢#Ú<¼ž >µThÊ5ZÑ „ß›žÉ­Ý‹ÔÚõª­¸?‹'$ Ðá>eæå?¾*~b>'dä/,i…uË•[ûöýR1Ú?Þ#ŒÞ—×$,Ø cò}Y›‰µNTæí\½t)³×™Ë¼óÓÆÉþ­ìK^,uæeËr²qԥ硑v¦éÒccòÂØZ½¸ŠZê Tô*õC»1SeP Æ¼ìÙûÉrælG­€ 8‚Ôáߥ©S{+†û-&áT–êÔ^ JíÏ{÷ií»é–½&‹Ë$‘øÿþ ½µ^º§‹¶¤5Ôà8NA|ÔµwÒw’£ ÓÃcˆ]$Ø›@Ó”DôJÇ%I‹_.Ûc¿§Ïg\á{`oY¨…”_ ÝR¹΋Óx#«LÁ^Áˆ8›×í"›žM)PÆ’Òròð¢)üÝòpž>…"EØ$ÑWžÏ3ùõúTä ë+BØéw¬êõ`!ácÀÿ2yb îAâRÓ¿ѱðt)/•b,§XQCp9ÀÏå–$‘gPË{ýíù“êøCË!Þ ±j­‰Š9gÛÄ¡Ny+´dAs¿Üx+æ†ï+è?³%ªö É] ÍùÂ/ۛLja„þÙ/OèÅŒúóãuªTWMÛÅër‹ôJ¡£ÊjMdÐk¼äù»Ýøj£5n”ê¾½ZO¡w\µ=x•Y…ò8)n7#áù_§sØžÓúø­ºU{RúŽãã:ü¨$dð.½ëpƒ¨³A†1Hè…g§~ É=‘Ò¢h'“;Ã4C”;vÕ+ž»›éù‡]?›Üà“ﺰª%„@γ'ü9ê­ ¦#ð³î$slÚ‘do%Í¢ú¯«lõ¢38ä#tF88Ì!+3d¥<-0EwT·«±9Í×ʬô¡B§?in«Ÿ°¶¿|«’ ¾=J~2~ "/Š³Î“ä,âÒ²kA¹ƒtZ]á4YÏ3ÅVoîuä6z€›X›ŸÖqÆÝdnZ±Ü๔ÚD]×Ò¨~Á-b©Nq‹…¤ÏDÌ×ôqwdÛ„%\ù!Éð[¦úKäúî¨;5ÕÔm«¢¹Z0AJ¨ˆ*,Ÿg©ˆ Á&Ù6½> Ê üÿ%ápL-*¦Ü[~:ÜZõ[YåZItVšP`åôý¼°ÓX³YG”ô»¤J°™yÏ‘µ¨ZWÏéìwÅâj¾q÷­$Œ$ê½wðwH/Ð ¼ÑÐ~\=ê‹ ÝýNjø&|÷Þ9PYUx%œÞÇQ,¯V{5DßvŽÑ”i >†é·ÞoQà¸7I%‹ÇŸ)ç²Q-­Åø{ };+Ä ­Æ1Gö˜;f„õ1(AÈ׳ÔNêx{åç f º¿Ïx‚˜œ!fêlÑÄ”©A8ÆU°÷à©ëº¥T,`~–+ŒƒML‡Îzqùh+ïº8 /-­Ÿ:…n:ˆÐ„r亮ó\)¬^8 Ð=¼OßÇËÂtÝlÐþjrîå=ø•‰Î~‘MâäeŽKŽUÿs ò^ë΃ µºí4í5Ènß<ÜǦºëÒ_R‹(eœëvaVŽqV÷•€yˆ\ÐkpÙžæs§«þs“ž{9Ãß°jQ“ì q¬_ÚIq÷—ª>hÈ3ÊÖ†ÓíØá¥Øô{¹åêÁÀ\¨¥ìã6!׬ݕ³Ä††kÓ”ƒ‘ÎÔ`‡hÄ“æõ,Sœ,Pé,,ºZЄî`s~g}ot`gì爼‘k!ÍÄYÒ²)Ýϲ·>Ÿ¿jGåNz±`ܲç§\âM•-AÈ·—–•J î"ˆ)*åþUY¤·žHù”QxÔråXf²8´ÌbûέЕõmïJhÝ@&ƒ J·¹¼}) ¢:iÞh H Fˆx8,ÂJç]ÁcmSMV¹ ­¤Ã09¯m !Z¡îç¿f¡ußo)œ®Z¶¾z@‹¤4Jeq˜>/™Kõ¼¥›DÆŒµÂ‰ü¥|–è×z²(…j¶®]75†­ì¤§àöÉhÐáîeT íaýtÖû,ð¬aŒäè‡Ú¹˜I*1ë‹›`)„+§2¦$¶š–E1£ù^ó£ÒN¤ŽO³Ü°öøÎÿQ½T%õà°ù;W=¯ lZ:z 3:GœJÀNãiEŠk=í믢™m˜72ðãÈ£j„•EÝùE rfÞFÏi”ØŠªnÃl•ìHךÇ­VÉ+v>êï]Vµd¿MEÙÙâ%À¸ 9'Yk<Ì!š>9µÒ: ž¶ð—º²·¢Úå]a¾ÅëëAùm€õZõ@rw• €`†â뀕m•¾ÄA6ZB7ŠêošyGa¡ú.×çlißΪc¹ŠÐ U—‹g*çËTMPÚmyÓ¥†"’÷ëÎ|ß·Óù…ÑÕ‘][Õ©óizÈb Ÿ¨fQ6ë¯O—|eObt?ä]W>BüÝÒÒt»ð"æË$†ÒEó÷i•Û“ù^ðñ´É­1OÁÉjÂvÄÐÒžžt»¨¥É(ÏjÐtì’B£´p¨c0²©DX 'mP0fÏZAn–ºËS2îA{Ž}ŒGÐõr„ U)Aô¹¨½A‹”8ŠãMÇÌâ`…áÆÌÛô“賚$ÞV·x"e¨°S²M1W¥=e¶ÏÛ$‘ð˜G@jœ6Z‡–™ C;¯Û•@å=ÏÈÇ%Å¤Ó ó®G^xYlq!µÆ¹~J÷JqÞ"L¬â½½’ø/‘ þÖuÒ0ådýr×NMIEžRž"˜D`ƒTÞ'À¹k&y—ºZ¦c·uuœ2—:jyj”À ã„Óú_N¥ªPò,#¥4’ÅâE|‹ —7\Zý–ÄÚX…_MuEî×ÎÉSYe‰®ÒùO“ÒPΰ[µ¥-³Í›¡µÚä…‚ïËHÖ²Á‘›å–jîÕÙsÙ•×\é„8F»Û5 >Jqó}È^WT³å2˜•jE1MˆÆ5º$ ‘÷‡jDÅL¿io€Ë&†Ñ%4à|;ã¹i¤ªWÝRTSÕÌ'GuÌÅnSÜ{d3()¬”Ãq@Sì ^W;!%çd?­=y‚3tàI~ÂÍMW…»–Q%ò†£ SàzN£ç¨ÁE…<ŠÜtDüeÇryY5©q_ЪÀ,€Ý™üÜ™pw?Ðfð‘Îå³óæppF.•.P—(Ç×U”Eê£íOÊ«¤æuE¯EwÍ70N…Ð{8´W²5!ËǨí—pÝä‘,ƒSǧ)'ȲR¢þbl}ÿµ©ÂäM.›Ô:믗‚õÙ¶%`°µp¹ð•"MäB{ù ›=YûSGÊï¹4„2À¤c¶X̘é¤ÊK]Z¯tãà ýV^P¦çÞ~ÙÃÝûænm/MäãbÔ*êQ¡vO&ã‚lŠþÿ2çºu÷Ñï† âŒ±i¦‚Í/i"$?tH:_­û3O·e­¶£6þH&«õZ/óËkå²?›&‡¢e ô5œÅf~R¨ë¿È¦ ·sõŽQé™|ìg„’2{`[¿—áãNë(+¡IÉJx=i,y¹…ÁßÒú% ^'8žÙ…à Ì`#%1éýáÎu²äm­þê×R"Ʀìx„õ«t©º =ƒ´"0ƒ¦÷ÿjt§&®ÃèC(S®q?𠘔ò–„›³~9ZªDŒËsÓ•¶ÚÑÈîÏÒ˜ëŒÍnb¾l:l¼¡ÀnæAªð•¤ÙG´ÛüwÜò}¤–¿;6[éödQø÷e¹áµj» q¶"Îël¯vÁÛ`Z6 @ƒ•´—6ªÈ7¯/Þ¦½)l1Õ—P–ïåÆwx¢l•HKN…b~nQúC'aËž]®^ã†Z ånñd›ðñpHÙ¤ÌØVšND>Ñ…¨]fP!µiœ;M8iéc¨–¦™»abgÝÆýx@Ï¥Ÿ>üëÆ!ç« 3Ø;u @„sѼŸ¯½á`žbËÈ'ÄûdY’.³n–Ñao^µiA´_[œ„XÉûr¬îÏ“e†7X៱hô2éÒ&{FapϘs”G™ª…œ„CvòpïØÂ[ü²yž¶HE_°Ñ^yØ_¯©g‰1]loÙ¹wç ŠÅò.øí£^XŸä µò´P»|¿&Å>šWÁ»©üº/¹¬Ìõî­îA´ìW€hDÛŒ°¿™}AL ñ%¦i¬€uX{®•U×£4ÞP– Êcòàèwoßá€û£æ™{tóª·m ÛÍÏcÐãY`é©f¥NYYíh_Xh˜ûľù5ùýi¼‡þyÀqSy3}ñèÝ©b¼fCçõº%¿ìŒüÅš` Ÿ¿äqÂܨ°ªÁ¦°±ágGêkî7¦ìMSÔZ9žH¾Þ²Ž"V¶4z1Ù~É*sµNçV k°Cöçñ΃&Ðwé÷Å úÎÖ)ÅjômkÆ ü2:g#¨ÿhŸsB¤¿»e-Ï´ãùJÈã{þ/ø "aÚHÀà©êS)q¢ê'…˜ú|Áÿ)´Aþ ñÉW$t{ìF™²¿XÃ4Í_8¿`ìˆ×PŽTʸ³»¬ÁmìBv3=@þi¸ÇüU@åšüIëÒr’á§ŽÙ¶¢´WÄfÛ©ïêIæp”s ߤŒ.Œ6¾ ÷,õzk‘ôd &޲a»Â´Ñõ`èõDŸW;DÏo>†•(¯ÈMZ0/ †‚Þ—I |ÑÂb i™;‡ãhKÑ„Ài!ézC ’í¦‘X` nZ+óŒ;iñãARNò‚›ÔzSÝÍï5áÖÌg,®¢"B<²3ð gáO5Dó$}©ƒ§%gtçãºJüëMöY¨Ý @MÇPëF¦ÐÖ½ã àÎG#y‰"Ľ`- ø†l"7nk*tmjöå$]p´åà3ÝG¿+ÉO7Œ€8€áYË ó{‡1KUiÀä”ÇW9‚ͼ„ž{UØðúsâ­„™ Ë 1æ ±.‘,)óD›4Q)zpV¹IêÊ“™K2k‡#.o&SšÉ¸²\ÇÊ„MÒ¹ÆÒÝUYP¬œRsàÊÆÆ¨ñóâÖ±4c‡EÓI¬vg¢0i *ô=ˆ0åf¨ÓM‚¼ºcÜÛ’USÛ±ž˜hÃiM šøl"Ît³pVio8JÄâÿô(å&ïòÃt,ÕeÙTÙðìÉOãsšz_‡Fc‹õXŽ+Í":‰Ysó¸"B´{Iz:Žá«D*õ4<÷/‹âñfväFµ-Ž€P7\H¢áVРìÞ=‹ `.„íÕ³(Ð~i.ÿÐûûn®cf|Ígûv~ñZ¶¢Q¦ˆøŽÍàŽ“ý£2ØÈ2£1|Gü`G$Ôµs äs6…í‘avô×ôY¥Óeô¤Z|øŽa8EZ $ 3eŸ5’øë®|úÿ]l·Î|“w)$h[—~ã(£ Wóײ´81k¬Õüú¥GóÉfë_»%T À¨[~(ãëŽ5j©¯éþD ûðë™êÉ|¨a¬K†³è|Pñ ¿0¿OèoQç¥*:縖ËkÇ Æ·xEÈßP ÖõÈš"Ö¬ÿŠ´¶ÃOx›#Wafi$½€õÒç}-¦q?¹—ŸKm­'ªFªòÌù?ñQ@”)ò–uva¦àúP2„üAÞ”EÃ&ª‡.ïL-ûÉ~øGS¯í3a2~Äú$_„®º³DšŠ«èbÔÇOU^ñö’º7ôc0ã'<¼àI›´­@œÖø6Í*†õ^€ár·¡þE Ü:&Ñ\gë€Ð’&þW£è#Ͽʄa²Wâ+å3¥FžÃ0Ø®°†íz{(Æ2rrØr¾ºôFÄzôàÒù̪6é%_X«~”Q&Ëcè"½Ø.Ý97ôAOãÍ]æ2eDz|µÅ*"áIV<`z¬ÑÜÏÔV£Ãý=ßë?Îm¤2‘^ d¶š„Yà§×ÕF2CáÑŽ'RjjOÕ[ýBläZˆ+›Û1š*íÅîtÁíy×ôøŸgeò‡´àdgñŒ5·çZu8¤S²ÿÀnŒ¿y»ŠÜ,ïl¸PÂe>†$¶"7v–qÒTí«ÙÃË^ä“Ɉ¬&Ù±ÚfåZrPü±t0¦–.Ž–o›ó1Eºõª^VxÈÜý±®ÍµmcˆJǶà` ¶…ò)k·?D§›™aD™dVÌl`RRä rn Øn0ªzlç%,³áŠ€z€š`XâÔ3]ÛÍ:H[E'ñë=ïî«Q$ÖMÜ"ôQjVB¯ÙpC´!Ÿs,ZŠõP |{ðù5 <¿‹yF®ÿv®1Ó·´:ÿz!Œíëøfþ ƒŸl€È„\n´O#TåÁËø“ Å¢Åo¸V™æÞ€F"ª †¸huÙC‹B‹xŸJ?Q5ç4Ó¬C>|ÛfÕfðXö¨¯M´f§8©Ó.–^ÞYŸ¶UÊ<ŸâÖ£M$»a€ö’®!—ΰ´u'2÷ʪCntÔ›dî£@Héœ×ı9MÄ'îÙ’’5àNü… ë©€°zívuëëÕÏÙj}ºl;:›ˆFn´[9¾g€ÔnÐ •7Íô=-°O›L‘‡.Ñï[*+!åÕ&Ðef:3¤íœ|)µat­’­–QÁ 46›QÖÔU6^mSíÎ Ûò9× N¤„Uð–¦[צ®œS]@!"¬’WØ™h×ÓZm¯ó&¾ ¢îÝÃÓ®îæ|‡¸oŒšÄBߊƒ¸ÃvCnf哯²7˜.%%Üœ<-ìýÞ®ß_Ÿ²¨m™yÉ‹Å{éSlÉÀbçbÅì´¾L§eÍ(>¸Sϼ)Ü5–F5 æj‘ºÐêCµ5åjbâxÙ6Ë.«^™ä F“"|,ÈÙ'å‰ÛÆŸI‹*SJéC Ø<Ð>ÿ½”ÜÕ’Ä ,®Zï«°vÙñd~$r¤’”$Ç¡” šÚÉ‹Ú<@:I&ŸI᛿6LtÔüìîj*/ @…Vêún†2ªßqrõÜk xÏ1 ¬åÓ¨­äµ‚€ À² ÑjUªÙ4ÞÞ£+“m–Àe¶ÛªYôص2IyŽåÚq’tHû¹´üöŒLh«¡9]œ…ŸŽ™§^"Gxªm_‘]‰a#4îóµ;Ý—±ÜPUÖfC8t¸QLÞo† F¦ùKànW'Û=œù“H£cw‡õ”MNèÁ9†îDjQ^QÖª8ðâhñ¥‰³ä]—Y_‰Ò8Æ:!Üybk<ÔŒ)oÁŒ ò &Ï|ßÊôÑ3yÉ8!1)‹@öƒk9Z LŒãý‡ :þ`¡3…qs .nt¼}‹’ËFïØÄ"0…¨ú:›Ã"ìéƒôG…xX¥ÚÚ-šŸ›¯öüÓ³äbƒp_ü}‡¯A9ç“ãžÀ3 §,¬öM ZÍ]®ßÇÍŒëÀV#‹ïž}ü¢¯l‡2×T ˦Õî­·¨<‚ˤÊ7ê铞7åt‘EYˤ\™Éè¬%Æá)[‹ãSÑÁ„°säÉèÐ_+ò=üòE†qi®7ev—N[à•}nÒFHÕ̓®Éíj;óÉÌñü°5Uѵz ûó8Ýöô¬,q1‰L[€òBAAãOÌÎWÁF@3MÙ×”˜¸$l¼nT£QQÒØ-bÕ¤óvïp®S1Œ¨Q`O¢!ÇÓ«1[‚D!ÖXÎYø'|¡Q=¬¨¿öª‰&` ¶"„@×—ïè”6=Þ=Œƒnðáü®Ô f5Áì·„5Pn·šéþ`Ïã²´a»EØ™5&û”W p÷—ÉÍÆÞÉ©I¹4[F9VdÁëwÁÅð|¨ëiÞ땚WÔ^–IWcªÑÔ~ €°ùvDiäFÚ]؈¼/gTz ¾p°“°ü —ˆFÀ|³­ÐUõé·v!`øq×q²yÒüÉ §!æ¦P˜ô/½åÑPò4Ò"R!* …ñ lí·Vï[¡óxN÷p¹‡·‹ùÑce+±ˆíñwYú-òTò¸§kŸ¦Ne„h0YW e‘þÇv¬ô1@5|²† „¸?dU⬧AR?¡Ê¿w_÷«ïôé2!)Æ=»Ö,ƒ@ÑI+}ý¤Š`+)z¬¶&ëðBÚFé7 = P¢|ÁN×Sì¬×™Š9ÄÀ¥ åØÇÅX Á¼%=¸ÔÞ]Ï'7Dé-¢xiÖÓ õÈÜ=#NŽ9eåý-ÄQ-5tiª+ÚÐŒqäüIÍå—JD4íô†¶e7åf€ûkýšžuk¡º–FSo^«ä€«¼¢ö/Ä<Žæ]ŽAË8±ØöäãQmzw)ü¹ÓW¹™&:´Ùh8§oßÑ9k+öLcœ)è#´ H@LµÁiePâCV¢"¤Ösñ}ŸžFpY襯0|1‘x¾_“3~±Eóê[ùµ™o¸ðºÖXLßP®üâ†àî­Ð =Nb9}iäY•äØÔ]5œBnÕ¢…ç¨ÕÙÓ.ˆc'Ù%šÏëb%#Ç’C Óôì©Ù>UAá^þbf<ìÙþ$~hï‚ÁEhn s'íš2¬üAs†üü]›ÀÍ,í­‹jä’ä7™”û˜bjÓ7í¡® ¢+Ð(pFß×’L”ößVÁÙd^Ç0GZáž¼6R´¤n­î´iÇX¥Ž”ôìÁ1“ÃlìñÎ`üÁ6f†BíÈw‡-©ç’;h²(^QûsåØÜvܶ¸?éË·‹8¼Ó áûeêïŸÁòÕY3ñ „±ûå½”cÝ@·ùÏ-cöRÞÿ,6ÊjîϧȊ¦{ßûÐη#ßàMöÅÎ$ûÛe±âüx‡•üÃÀ¹k÷–´™ùí¼CDÛès—ºÍäÔ!ï}B™ˆ® ‡a>(ä;ÛeriŒ®ñáO ܉E`”Už+~š]›; [d.ŒF|«lªìÌkFIž´ Knbç9 °Ñç£"Å!Èíˆ}Žþ4Wû×Âá‹Ãq¨}×rA'~EO o¢¬½°cÄ8®o<ÖçNª©ÔU5: ‘é¼á5HBŽ…òê±Ñ¸vá[—·?°1ñ¶ÄÞˆOÁR??4õ¼íúvï3òÎ Øf }(mPÓr½UR«R¨;Õ» &ß‘ÔJ|¦ÿ5^–Œcê#qîø¯x–ñ>´;(29˜»:_6ë>ò¤L‡k)Î]PÓã*b‚ûËâûäŸjšÐ±Ò|^§Žìº½¤Ä ¯"OÉaVñeó•wML«kVÞrOF#ßÛÞ- s4 ã dJõËñ7ÅxîàyÒw Kâ`÷²|)›¦{b2\ŽAîÅñ‡ãN‰žïaÏÑŠˆñɺÔÅ;ê½e ÒõŠÔyÏ‹­dòYJ™d9$¾ã7#Ó3²Ò—öÕvAž[Ùù±’Ù.Ÿ2ïªR¨ÿáÀU¨~fÌ!m©ÞŠþQ´òYM¢Æ´¸›ñÂEíÉh¹ ’Ðw\ž?˜‰ôêSDЮŒ^ÛÆ…Vùü©î‡c>Ú®ÆÃ¥MwYü«vY½GvÀ°&ᣯö.«²ÐÆú@¨b&‘\.]®IÒ)9“s®¤fü›ÊLzl(°¯"6&Dˆµ©ò&ÞÇDø¤¡?N§éø`ÞfµïŸq‚;¤£‡Ÿòiúåbóg$E'„.Ã\RÞ‘U„4a¯õ×Ј)ºËÛxI⓺fôjD²Çí·qéä¬>³ytZ^=šç;×#m2;÷8&0%el çêvYýňî–E‰KžèÚÆýØ8ÜaÜq-7Æè|¾©eto(Â#:'Âùÿ7™×¾JTñûxJê¦HÅ„Àä@VL:`jR†Î\Fwžé–Fúên>°¸5-Y@ÖÐû ³±ÕB¡uú¦@•6È­Öšº aaï«å«©r\v^p>j?ðƒžà­Gé°jvŒ§'©#[SæR«Qc%9jíÞ[„´Î†®d µTá褡]EHí!-’²5»ÕMOn5cÆ¿ªg$†íÞ„óq¸e'©fÑr޶M"£~RU{üÒ§ú¤føÜØý²¶ƒC€6îü¢¥¢§,šq'g'“@-!=†ópƒó>̱×ÈÚ4<òl‡”µC‡ålÒ9­Š#…"yYåå×è”NP[kÔKaÂßÂ?\O‚¬Ol·ÙŒÌ¦»‡êw#iš•úòŠuÜJAâóäòz¢o ꟶ¾ÀÚtܱ’ó£Û"Ú× ÉM*ý~À®È Û_îU¬ó2BHè¼Ëùð…]•lçMIíØú¤öFšrÉÙ ¡7¿“¼àV¥mÄb„^ 5xÞs÷ƒá#ü,Gr8òcæ¡üº±lmCÈ ¥ôÐõ§1Ý€æÉÐQKn§ A¬e .5±ÒN,I¹fp„å¯åÞÝ (ŒŒ>ð¯\N§­¢Ü²ó¨ #¾¨“Ú©@Ù‹÷~ßÅâ+™UV‹ÇÑV r@z=RºÑÏH¤c¬ÏÚ ç(‘,¾«‚iq º—äb¼ù¯QÀƒA–XãhŒ­ö@Îø+ÃÈÙæÊÓaöÞ|âÙ¤ÆZJħ@Dò øs­3>{±Êa¹¤z‚ÒØÕ¢b¥ÄiÕ#ÑF Qâœæé’vQ„•ÖÌŠ¡Úµ‘w±¡âÀ¾W—ÍZTˆ¡d!ÜG§¼ø"﨎Ñ}jr+dðK’/°>xu¿Â,gèµ'!Ò° ¥´´Èc>äüõk˜g–¡ §-j9° ±Œ=ðžÄNa°ûQk/Ÿx@£;Ü*qzë÷ãoiŽ›¦JL3óîÿ§Ê*6<-2¤ÐyõžÇ¦°f$JmÁ!R€÷‚š®°ÒD¢“ ÑU1õ{õ5"OújS› š»ÞIx¤pé÷$ü‰úpåÿiåÕõÃô\‚9Ó}K­Ñ¶š#æÅ^#àÄ¶Þ báûjÀ®Ï+üü–/±¿k½2¤'<\­÷ØûÆ£j‘_¢‰ÿÌG}+3ö5É>*ä 0H·©¹ho4*OjPk’ 9ì~¿¬³)áL±óøïËÍ)n˜·´*°KÍn Ó¨-Xú3©À+M’¥c›'rUQG¨gÙR¡ù[Þ4ħ»ÚË)òè²¼+7H_H5ÊÐZYÔv‰P³ý8ÿÑ2é·È<â(¬Ü3ˆÙ¿“={gÜ@4m¬Nªë³+Ø«ââ“HY15Ïâ¿S[m9¡«}i3¯õr*üç®Ùâ6 j/2À}mð1*%ìhmp>ÎÀ‰#‡h³ ¯Í§cikç"p>¬0 ®² …=&É)QÊ㸀(}p…9JËw9Å)šQÊåµd–‘6oÄ;˜è{ëÉ9o[\N)e˜L>â@3êœ!ƒJò¡*C%„;\’Ï\瓲¸Î¥F²–f³î&<¡÷ÉÆAWo3b Á·{qó‡ È %܈ sßIþ,pF7$ªÛ¬ÂCÍ8ß®#$é—_Dú3Ò E¥KÑ®TTäó„^Ò®“Òø×3Ð*7+‘lW '´>Ü‹€öïÏIÔùQ£‚>V¾ñÝÅwnÜ©LkÜ‚ÄÁŽ.«U.óë¨_mºƒcinäŸÇ©SbΤ*ç ܼ^¸ƒ(jîÚi]þ „}¦ –L·ãâCâ(ð ¾cÆèwf?X¤NùeRH‹z¯ÓÝIÔ’ØseOÕN ˹T—L5Ó~Ôþ{®WÈÝ3„S~º—¥Õ®tuzОÅ«½†Ö|¢ÿ"#¤ÃQ_ÖS‡('ÇY4.Ö5úe gÒ‚:ÖW{ Ihôþø›*èñΞzRÂÂþ|ê;£†ä}‡è}Êd môs¶¼j庺ÅfÝżùÊÝ•­*«tþXo"ÓÅ—J9U©˜åh{7£A|ªÝrˆ²Vc«’ ñã.\[Cý;B Ð'ïçD]þì’P b,bc¹_«ÄÆ£’û 3áöRx_¤·@L+%XF««MBbb2äÖh= iæ‚]VæÖÔŠÝBT(ׯ&rlÒ 3„sFÁ<€¢*ï%ÞÊ @ÚÐKª· ºÙ\§}À ½siªÙÃ÷.s°3«Ý CۡׄÕîAmn”ægç¡òúsÖË!° gºKE´zYlåÜS(Ëó1àu%üúDY¾!àW!GùnÊÒ cž¡×œÇ3£‰Y—*™A¦¶ÅÞ`´˜,8e$Û•ÆŠ![èÙÊQܱ—£11´­¥å¬niß»šv‚ˆû:š; é³+¡VÌ ŽžÍßÚ#í·Ë·C‚‹¢èuJ—Á6ù þ2öÀèÑîüÐ;Þ1IVÔûk“8ß,mý—‘€ý½;>r |c׈sƒ6ù}4‚šÈ_^Â?ö •·8]:¬H)Gþ°IÎ9¡#â,ËÇ«)çÍÿ’ð¤S/q°˜,KY4¹uôÍÊ™ÿxƒ"TBú ‡fÑË]2@Qe0äG™7V §ª’¤GÑœ{åæLÉó‡›åµËÏRS› )w@—  <Ñùæ¾A##M3xûÕ¬­jŒæÊ¡Á1ÕaeH\D䵺Ÿ;½Èî}¢-·UŸ&ÝõÇF ôaxx”™ ãÁ-U¿¨Øqòà|ê ÎÖe¼)ú=‰ƒM0žÎM$!Èñ Qߊ¹s§¤G»Þ€ýœXÝ¢.´Ë-ì³OÎøôiEÓÒ±dS§© =ÅçÖã«óɱè&ý¥Ð]Mù¯ŸiIe_ñy©…áioozu O0‚Ö7í’æÖžÁn__zvÎÇpýœÕºÂ©ÀÿjäßæoÆžB–â`ZÙ|÷Ñ/ý½6¥¾ºøö–®xe0”TøxÁv²Sê CXL‹‚?#1_„ÉI¹Ž´Ô–ß%Ê$2ô ì‹“ ñß5»-Rdò°pQ OÖ¬ú?“ ¥êÛýŸ¼Ìbrš!UTÇú‡6a[ßÍ|ýQö›˜"]þ´_´dg×:õ0 æ›YÔ³°ctþÜéAX+z‹»µ6³—Õý*\ÕBòUÈ-;´t:ñ3u“BÇkó3&óx´£ÊqÜ#9 -ëWá¥û ëŠoë “Ñ—ü¾×P¦Ž×û˜ËvªŒ/?Ÿ•(ŸÃß}XŽ4^œ£ ïbuñ«€¾ìúŠš©yü¸ï‹â'írî_îþ¾½t-ƒœÙß’2Û™žgï÷cd³~ˆœNRÛŽqÑTr<\Ëánº3"¶-(Šá.†+‹Œ¥^®bSÚLÚÑþB³Á¿¢)Õ3Ñ«0ÌóŽ?üî2ÐÓÛˆj£nxãïååqT¥~+¤Ëä„u9Ç}"þD/åƒèƒoºÈ‘ tfGa˜¨ýs~iJWðgne‘Ë ¡¦S !­évè´Ÿ/•’Í–Þœ$@ZhéÂóhö6˜RŽVz…zOæ<ÙèÀ }ì;2®•-.d!hq™µ´ ¤ÔÑâd9ØkÆkªÜÿŸ.Óþ-y|aà²BâúrG}»¹\ŠÁ‚¬Ë[…?¥y›w6îáH¤Yõ}›v-IïÓÀÙ ~…@²ü½šþ5’h°|fàª|;‹" tžƒ!‹´+ƒ +˜GH§0X”šiˆoÌìž&#Á7€xàe–\R?Éãd"é¤üÆ@ÛóçÁ¼ýׄqUЉBQ^Ûúª”çñп‘gÍCO¤° Ôúm!¬,90×2êÿ˜ãôfŸ=¾ãeS‚¶!Ð÷)1FÕ³^0˜¬ª8d‘Ðf„)dçC8R¸E$š2AÓíI< 2†/ÁóÄ'º3}ÿk–ŸÌ³üJû}µ£¶§ž`·5lM"·öœÑôBÔ1ÈVÃO5]ùîo=™?IJWÓœÆQ”Ÿo[Ÿ}}´ê‘$™k%B¼˜ÿÓÆ8Pç~_mBðbüþ·ƒ¶ñ?¶ý‰-§éÜ«Ö&‡Ãëµ ü±Ìù{ÁŸBò—ª@»Z<é§Ð«p;P0Üqéó©ÙVz«v`œš§N|õÍŠÛA ¨R6­ååx¨~R›Z*…?'û…ÝÉN{#éòøN/ÏþÓ×ñú¢öGuÖ›äqý²ø)"Äãa îNLYCû£ø@OÚacÿþO«êý³©ëSúzM>ˆZ}==¸†QÜíô_Üß•±õ—Ûåóoî}EZþä´ž;±o†^RùH@Ð)vfœÓóÇàŒF#ûÅð/ðÍÑÅ¡‰Oåž`¥"²ò™§1e #´É¨¤Û+ mÙĬå°Ë–*O€nGæz0]ÂÖS¶mu(јYQÓD9ã¶²DiN¹Y(¢¢p5“lûˆ„[—ªÔ<È^ƒúÝå ¥¦æ?„¢¶}€Š$ŽÌ÷ú©tÏÈž c[qÐjiy˜„E»ã†ìôEÈÿ’ŽF×yü*1AâÁÈ[oÇîâ$9„w~UM䟫:1£æóZ¹YuÏ‚»—÷Aå^È1ùì¤;»dÖ fJâÏpþÔèÄ-á÷ðgØ{ËŸóEøn¬V²ç0€»ÄÈ"ësåÃ5€ú`ÿè†¸Ñæ ?;"€ pHs/é¹S÷çÌ‹A-í±Œˆþ³¦;jl§<Û˜Kê]j2~<†¨Í Üå~¶ÐõÞ;×õÕÇàEþï7{À93ád•´Õ±» Þ ‰/¸çFjÿ¦cùºõešžWyóË1ÍÇÚ9žÛ-P\ÆßˆÕ¹–ô(Ûº9|áñÊwÔøúl’å‡} –6ÍX43°P_"‹Ü~ïÅù̼~Jµ2‡d½ð‘´šî þ<„0ÝV"Åžƒ• m”ÉóP“žºÉ'ý]uü…ÄüCÁ9 œù#£aKò%ÃÈÃ=šÞ‘ýJïŸ<ѬÆÕô¦]Yo×#2z³‹vqý}”¿Ï´3ïvwxãDRjE¢š„x˜»¯&õ<ÖfA™‘ÅÿÀÓáuæ×ú»Øšyy1óþTçö@Á6~â ±J ;Pxà/ˆî,&¿«Õ˜¦è|2±?{¼µª}Ro™ƒÐºÝâRý\O¢€Õì Æš£Ùêu>ï»$RÑLÁÎñ‚‡’’vþ@Êh©ó¢&Yëâ°yfPt32!¹W«Ê¡Û”áçÍÑËŽï=…è0@ÉJ„ A!…—(º­}G¾;õû#ùg°iÿܶÊ!sMažã¨¼Å؉éå†mF( øŽÝ»‰j‚×?²ÿ’UƒÎtäÎ‘ìº ^‰ÌíYUë|•.ºL 0r\zú[‡5˜Þ- QŒæÚ;µæá(ѼԳ èW7 Žß<ôwˆ k¢Ãvà  ŽB™Jæuh €­bAðKÍYþ%ß275’- ‘Óí›ËÔTN’dᦩ+dõàŒ= ªN›@„zdHô¯È`¬{ì‹÷¡ã!À ðÎW3ëžL&Lú¡ àOÉ¿u3|¹ù à™éAgñŽZà'mÙØÒ¨âìlxhŽærz‡ Ð$'ðîi?ëòЉ9â¯Tiˆ`þ<óì>ŽÙ¾!kgáN‡[”ãÀÏ‹’“‡f0+ÂIù Ý|Úɨ‚:eÈį³`¡4ß!c¾Òë+Ôè¤Ï¤‚)»È<" á—GÊgЂIYÂÈBO fNAvº½tBÐ~Ò3NÛ}B€¢šÑÃɸÈèå€(–Ú“‹g¹k’±€óË.Aê»uŸøS>>¡·ŒV=–]ü%òßÓ§"ì1¯€l!K²Lªé![YIð}ˆ;Á˜ui¨#Ǭ¡ìÎáJ)m™jcNd¡|r÷ÿvîßÖƒ²ÈMœ )톧·[-@ñå'9Òá:ï¿CUã£zþÂÒ û³ÈDBCï“·_Uå/3½¢]Ëö~Ê…œîiì‚·¤Óû=³VB-1Û«tü1TK¢*éšUETNyÈÞÛ†è/œÈo­q#‡vèu’ÊÍq$ò©öòPçÔDÓ½am^{Wo‚òƸÏpׇ0fâr«Iü…+D~Í{/phr0À…¨Ù±]ÞÇ3OÏ:5È©ÖèØË|´¿ŒùE‡ÖûµËøˆŽ™¿‹Í†Ü `<ŽöÀí^‚ñ¡ù*5åP£úX€Cjš^7çŠ{ù"M%mEW,†€#¶‚ü±‡.£NçMÑL¹xÂj»¹LµúqÂ*÷ögKÈí9aÉ”¾Òb“Lh^F[•ß•‡wFwÎt›—¾+Ò8¸…ö_ëLÒÆñ€è§‹’'±5¾[z`*ÎN˜q»ý˜»¤É™!œ¤:R¹Ë˜î }¤ÉÒ¶;Ô·‹J­[ ‰òvcµ”vv¬GðsXxµœæQ|6Ûyœ <šNDê®Br´Xé&òZ5eìp7N½ ³¤‰Ûœõß7ù'¿Pš+¾@àû¢³ QÏY¸Dvró¡»{h.[*9¸î%m¿‚ûËO‚—qµ™Ï–=Èa%JcmŠwüø0ÿ ø3álòêµÛ=m—1djŒ¡ÈS P<6«ÐISÇè~'mBœô'% ±V ã§'’4âŽ{ ¥QÓÓ8å‹Ä¡€••§Ý17]2ø|¯ªº¼–¿€ŠŠƒ_ËzÙÚøåF6ÏrOG}f¡‡ÐúŽD4LaÛ@Hά*擞=ÔÙ Ñ9×h·¬ƒç¯ŽWÞÎhèC¼˜ª`@Ì«\M·=pÓ«¹ê?±Óâ0~…7¹÷ѶÍL.H›¢ùP’<óÂnòˆ]8‚ý  ÎénM¸_‘ï>¹é?áš~þ.öZÏÝý†àå· %´ª ÃÉC5Ãæ?þ•¤-˜Ñ::V„ 7*ª”ØO°¶û”N#åi.ê[˜GKÆDkt~Ù€ŽÌa.q¿çÛ¬»FŒŒ‘\­–[ \ÄÓãk œÔ¸h±Ì*{Ož¨*÷]s˦\ÈÔº\™+õÖÕøsá¡á|k…fW…–@ø±T°ÌÍPµ(Íç`Sm4èE1³ØîÙ…¤ÿ\yá2â…^ç`XC§Tó‰O:.øRšå{¿æ]Ÿ¥åõí°†M„Ÿ±—1Þî ão;iî§ŸdMèõ–Ý ˆ,¦&©¡¦–$âéGÖœ›ÆjÎK[˜ÙŽ8̃2)º©ŸÖš°üA›ß?!ïÌ]ϧ=0²¼ÜÃLT ?2íW±ÛC’>‹Ì]¢H5º‰ÆL˜õ)}3|•b2ÿžˆTäýÂ`õ!ÂÌà,FŠÕ«:gjïY*ôØ0Q$(VŸÚŠÝ×êrå›ÇDm­V büÏç5Y(N‘˜ðNgä]‹d\bîÕgð»áÿH¢*÷õIœnžêÚr'§dúÊuòØ–E$•5bå¹/®usêŠb›«d¶ LXŒNmCO?è2Ÿª‡ÿ×ÞDÔRî/…ŠK<#Q8t”]Ш1‚ŒMâ¿–kn2 ¹=ЃuQ 7j®5s—„K—/º I‚ÁjÈë{Áµ–½W„Éôó¿fp“W°K›…•´šdÁ7÷õFm84híQ\Aˆ¾!+µhzñ˜ú2]Oœ6YNò¿UÃ|…ÒºgÒn=ÁäìÉÔö¤'ê¾KøùBä¿F×Rüž¹š]•5¹HØG»6MâAf +xÁï{XYóû³’GǪæÀ`ËôT†åšCj2þ4ÙqJº]~\‹…” GT‚mЌÌì—Và'F)¦Ì\^.Zà Êê*ëîR‘ Ýd[¢nö!ßÃK]ÿ_\÷•—º.¾c°Nìò;É<`¯ÓÒ_?=½f²b&ÐM"À.¤·å™žCb 'úË0Uƒ¸¿h¼jÝGËvÉœËúò£dº 5y=¼Z)ð¼ìN¼@‰îo™È>{Ä‘¸°þm_䊘œ´A™Ø1Ï#ô°´‡¬ÛÎjTþ´(â+:C-ÝÊå–˜6Mjk¬e¢%Bè†Mÿ`<[l7 ÇÕºa׳Ãêr‘(àÛpe¾2 ,¸#XQ-Œ]Z~æÿáãC¶¢€òÝ<* ÕKú¿…¯å"SàIìDîö `´¦0 tǰ°wˆ©¬–,ÈíåF(‰ÕØÝ¸cSKÖI\lÿP=¿Ynze®ˆa0qÄ ” ‰«ÌÐ…1¦ª@µ?J)0æj=—fû}A–œ'è½Àe}p3&LŠq`õxj oÓ!¿Õ¬¼ŸÐÕ >¼Nx"âÒÝŠìƒqˆBen§v†LzS¯jæòÈÙ&H¡"®´ö¢™wݺ’ÿ›C´)”®[R:\B¿y—Nõµ8Ý:dk6QÚ?¬¶hyò–ÉQï¬Ï&üyU§ù…£Ù½e¢ "昴i-¥öm·æ› aNp#§Çë¦ÝÈ'A™|heÆŠ(ÖoÀÚY>œ4Ÿ®ÌÒ>ò› Ü/æ·©”M|¢zôÑ1£ë²z½¸Ðè(­—ARfEªVÐÔrBÉ=Å]hË¿.©w/ SÝ ½2ámíô-Ó‚hé¢çŸOþ¡óŒ“Öö7/w¶Õ„hÔá0‘“s>ÁÔµÉ}$PSZ“"ðúFQYôÙ«X¿K&ˆü½É8«ŸÜ[iÝZu­8?ä ? TÎbZ¼Õ}\vƒ ¹ÄäJ·R>…{våš s-mÄâtàíƒ\ÖŒ.Œk|½C¯á¶~iò$LK—˧²A ¢NH¨0ŒÒ(A6ªá ‹¾ü(MÞŠñøЦbÚmWÛ-ù¢RZ©§ay¸±‡¹® E¸e,$¥×_r=ò›­H,&”ôÂW.ÛµuWsëþÙ ´D£qfxraìz6ñÓ‹gäõØUÓR¸Z(Ö®ëU7¦"W ?¡Y:IhL;<ToïÏÅ›Ü|lýóóN;¤Ëž]%h3Hw#ý)ºxÇCí’$ýw‡d Vœà”wkŽå±éª²S®št³N~ZÉk µl-L“WvÅ@yÝó–å;˜oÎìz<Ã÷EYx°gIJ—¬íZ@®’ÔŸwxÐ3<û,¶f§} ?“ûœœ¡ aáyúö^VßlS.Œ¨ôÄe4ŠTÔ<׿N³çRÍCték˜öª1ÏCet .Bê3ÄàkC2¿?å‹ô–Ѿfú(Z/Šø†ÌYKΣ„¤}²†úäÕ¢k;UbôÈÔïÓäЪ߯‘K:ojÌÍ‹”ñt+ãTsà†9Õ{- ל²¿4K”ú1Ž D(ᯎõúñÍû(ì²æ°<@àøÈÁÓz3²Õ°s>{ |ÅJs½Þ+ÇŽWá¿iŠ»‹šÙ1@Ÿ2-wpÿiÒ×Né»ó®×øä’¿Öl_€¼fÕ®fÌ«,¢j x!g/&wó¹Æó_-oXù‰"µQC,ÞÖŒ|Dퟹùôë—Ž•Ù?ØŽÇÂoð4õÉ•9sòÖ–È×cBZ"…)lNšû{›M‚‘ÐH¨y¸mÉÛç þn\Èß²…¥¢AšpÝ÷Û­Öl äßxBØt« Š &ó’uÙ[Ãw¢¦6ùh¶µRÈKÄŒ×Ùrí5‘·1ãÙA©^®¬ZÖ/¬²ß)ù9ùNŒz˜™rB~@OšÂ—„‚èŒ%ReFžæ‚¦Ù]v’°èíù -Pâ\º?š[Ž‚®Dw"ßþ!†Ù3åkúg „ŸÄwT ì/x‰®ïïIÑÑ8õÞw kÇBl9tya 8i¦ñý… Scvˆ¼Šäúê— H›Uòì͉ˆôŽÏ(Ùõfbw<[²»3eÆÿy¢QdÐÆ@+íÑØ.˜xÊx:£´è:øÓ°è¨?O"QF^S¯WS„A¶‹ϳ¤½•|#ÉðHî²\¾!”î »2’]¢ØÈýn£\­‚Qµtñ1}LZvýòu!¢ò sœY“ùwàuüÉ{o ßV#R‰Q°®ÞK¡Îpx}.ùDzÈd ]Ùdtvcâ8*{F>oQ{º<Îheó;Æ’‚X„ÃI¡ ݃Á®Ã$<Ï Ù9¦ˆÏ¢50ó¾6Éfã?¬p[šs–0ò¶8iÒ(:˜n¦µvÎï_ºˆSÔÃw «”aÚÚò㺔ÕÑš™]D,€yáiZ$ì±3Å3?€ÎÁYJÌj¸ Nn¼5ÚËÔ¥ ÖÞ?z‰!x'³×ÏD˜©Uò±4¹ÿ_bß4g'm‰¦|EjÒ{XÇrcñ¹Íö!®ƒ›­±ŽA©ÄFKï¾fCk¸¯':q„,Òj?2¨- &øäœÖí$¦tŠÝëÿ;¹ê´Óÿãó?8‚û µ™¾ãë÷ÚàX (qª¤G1œ¨/*yÓ'ˆ×)hÝK{–yPàc­èl‰û~(|:¢úY’¦ˆz† lsù7fýu·!³Ý¥¼Ñ»ÄÏø2xʳ’ðÖ¤S8 ùI/óMÿdK7§hp›zb MX,n&þÀs¼8¬%í[s¸[JæÉ‘HMC…š]™·F­hrgîf‹9Ø':•Þ“ùt çCP£VȀЯû¦PÊÑiXàNá¤SÛ’ªº×8ÓÓî„>IÔäm-I=ËÕ«i˜?­­1[îé$ã$κÖ•·š?Ò¶¦ûÛåö¤õˆxôN]±™,à‡vã¬Å=,¸ñÏ…K™~›×Ó›Puô¦½‰Y†í&¡!F÷ºÓn óÁëîcU ¹¯x†4– öà h™’™;h³¢A¾tu¢Óƒ+6ýÜÏ¡àQ€[5z‘(B¾°¡§ú·áì%{gvÛi—{òûf½¸K’¼äåò/#U ž¼þ"û;Z¶µæn&†kÒi°ÅµÖá‘F€h]¦pœµzå»&°¥“äXì›þj$dÖÖ¡Ë÷µW’‚¬ÃDHé‚áõÆç}\–™É _>Ç,F×tn …ò‘7j¾ÎfCðݴѶ<%è²ä3 Qàrq¢µzDdˆ•ݸ¢6èMBËlœ šÀda©>TØôû6Üøßš>c‰ù[;*ÜH6øÿÒæóó Ȱ Y$yÜnö«4óß]”»„êÝ1®ŠèRĶ`;õÜ\i8¯âôÏ ÏÊ!ÅDÂ-¯ÝÀÔ¼³}ØÛ¹À7ww<[HÚ™çh`Nü‚×é28ÔÒ¸=Áئm2Ò„øJ¦¡È¡i™s×§ÂEçOž÷4cQ;¡žÑxäb+\Ÿ®ýÍÍEÌ–(÷µúËЗ—(ÓÑ#ý‰-|—Î::YAo¹Sœ‡QfžN¹êî¼é ËßûõÔýétÂ}oH×Oöú0¯ü}uN÷ûñéã)Tƒ÷_‰£ÆNêÌœm‚lשEðØê@Äó䩨Ä)¯¿1š…`ãèAæbÈäaˆœù1`+“tïuǃßí!yÁ&f~šÓ´J²âˆ¥Ì`O|UË@‼LÃû_£“¢×¯¯<Ó\*`“yTJéÃÐÅi1f¼´Nçê” ýói”Á5¨†!0Ú.i[%ÎvËS|Êôëu7 |äÛéjcyŸeº\Ž _VŒf>Áí›­÷T…« x¼2Ø­$uãf+y¶A°„š_‘èÛÊà š)`yä`·FüS3GpƳ2¾T¨Í¤y_K­L+~Ç‘£;¬}.1žû…W/Ÿï_á¸#\¤ D"È^D*ówת Íþ,ñ é÷Š#ÍTzh^UPÆ"ær«(lQM>W3ߘv5&ãÌ€+@ùvtòü}Ýß2פóøfv¹e5˜S#®…ô8ë¥6šû¿GYÐÏI8¨$ÃMì°C´NÕ@± Sÿª¹ó»|sÅ#6žÂXéwx<ÛMzAÜjZ™¦t3”>Ç~œcÞûMÝO–W”  áÛ HdœµÊPeÎeËýÕê%zž³„Èkæ¹¥õoŠ”™8ê0}Š?à¹Íâ³­"€œn»—w‚C/]]·ƒŽþ-kseiòÑ9~sãÌÑF!PëD tqƒº¥·‡•83®<ÀRÑ–¨¨°¡b”lÆñ)ä?5}p ÷ùíòeôÜ!ŸÕ˜àÂLgèç³êEœCoæ¹áó YŽèaÌ´_\ejõAök[„¼õ¦ù³×X¯µ}xœ\ÿÔU’K6QîþÌ sË.¾,ÙÓFÝ!îÛK0u˜$ÕG¼6üK>¢ý'>-ÆÎ#b颓Vè±8¤Ç@IÚ$)8êPž£S ›«Üïç)S+ást(â÷EÒ¼çTµéxå~Ú¥L°tº‹ÒÙB¡°F‘RêÈ8)i å\ÞÏ H+ú ¡ÁÄçí$—1š÷3ØŸVË^4Oc¡ûGÔ* ÀœñE7Z(¤a”‚ƒou±´D!£îSºø~”šù3NcTJTxXcIÇoúwÍîw×¥õ=·à«%6Ærí2OP»Sn‚ºÃààb•ç>ÁíoÜ ;Ì}ï†ï(ëmGËDù6¤"‚Hª™3åfªçãè±'TºJpª]HÚC|õɦ½~ÐÍjϰNÖÛ$UÏ­¯ÍÙ6÷sî´@ãäy¼Ö>)‡Î «ÑÑÈdQd #%ƒ‹\²›‚èVõy¢ó©>ÿÆ[¹­CLq@Z³Cô½ß.{O¬¹Í'fm^â_3æ`(,¨Î2‡Ò1LRƒèó¯MŽRí™ñSÍVþÆOÚ¹HÆÒ–Mç}j^ÔÆeSY^+•q¶¢†c &+>{ô ùY0a¢{?ÄÙÊøJ˦Ðh¡¸qEAœNÃië=·€úï;sÚQJL°¶ÊBüˆd,[‚Ëñk—×mÙ#©e1mLÇ6\~F±úð–yÊê6a üë܃èa‹L•/ÙLÐ罎'¹NJÕZCàËÛ€Îø½4½Z†Àîß:õŸËd´(H ÊH=Ñž —ÁµelíZå§CF™†-eøŒúX4%„PÔŒ12 F¶ŒáH[Ú ®~ŒbI~ •sZ+Û`kI³‡ ËeVh €6¸øå˜éÐã ¥Lw7&0r!E{{D¼q=ÅÒúËïPÊ™Á+åF§í m6vòž™]€z;®¸¨0œ!-t[ÖOJ“œ ¦²àel}®“ \#àÌ O«Ç¡%®ývy`k¢çœßš”>¼’Ü íkMHýÁ¸¤ ­ÃêÊ'Þ5ä€TÙÐJ“øöÈqÞÊm „¥ÔÈ‚NC匸ÂÖ[†ð6ÁHãŽJ!Ù³58FeÆ0­DžÂÁ×ìôC7ËÖº:ßv®ž]!pâmX­ŠÍÒY„üi4®Ê‚]êK ô;NÙ=20_já“0ZæýzüFeç…¸Ž–©ánߦ§ ã@6dg†n„N“ g5¹(ÕA,”´tFâml‹²dOn"5˜“÷•Ø)o°›(«ÓÍÝR×<óYï«ò—¿ ^‰›6¿j5:a '” ÷#ú›ú+ ×KÂèÒ¦&¼Þ-_´üd£À¢~1ð¼¢ÊÛ•2*Q„*c®ÜZ:!R6‡ lS—Ã9’ÿD’(q &SÎ&¥êP ¬å’ûÛ“Ÿ'Cœ¯|t‰M­êzô ±Ï®mL¼•Ô)«Ê<•»fyÌ’‘=­TŠ?¼½âWÙoŽ?“J±@Íów=$züöæ¢6‘PÁŸËóc¬tFÝß-Õ¬óòè‘èÿµŸ‚oÆBà\M«ðñ.–·º°¦,ëâÐ1Ã_b}c<€L8\ÏP!—|áÝ"úþ˜s7ŸÒ^¡|«¹v¼TÑ6á(ìa&ýA"tœêM^²»aý ŽÝmTz-N¶œ§ Ñ_Œ×óÊÚç?;´zé "ÈY;¤RþæQUÐ)Üœë×y¿¢A)ܱr¯áÐý Ór”+öZŸtyòSª{žÓÖ'J _ga®¬û¸•k¡'_,ŸN§ù¤P"¾¼Zd šU¼nO³ó5àÕ¥ôj$õ=)Iþê=Û°õNuÝŽûJ—ÞöfJVSzoË+G·ý™žé&–Ó ªÈðøK×ÍZ«$¾ 6›ÔÿmÛ)‹­{èN=½wÏñ°ƒÉ< sF?{Õ‚ ÉvG=N“’VÔ¬V!si§jXõõˆ}cpÑþ^ôxLãa{Åy˜›WºŸûIÙ«×­bëóüg¹e(ÊóëÐêŒ nøì»`ŸZۈͨ^“õíN·²öíÔj°Å/ÔâY¼±¯/2ѯ ºâ~:\f‘›Ô'Éý“Ók¼¾ØKžfÉÆ‹â“ 1X1g×MC|1’”BǺ¥§Ä?³•O÷|%Ÿ‰w©Jûè§eæÇïžSM/4y»'æt%œ×)¬‚–:lq(ÝsçBXS5›+ºhï6¥O:Y"Þ£qõ¸ËW9ÒÃö'f<&”>¬²k8=Gëí|›ÞŽ“g*snL«ö@^z†­—ËÖu!P@%â:”b… Ñ×B×Ý·òÚtÉpše±2µI¨h/\X“ ž;&&z9ò’j4ã]c¨ñ<®· B¡‚  +}.臲²Ï´öòð² Òó–GïÎËí‚#‹%qf G^õÞ›Wfkñ››©ÀÍŠØòL#¨Èï;š|Ïšî ó˜óæ_÷ÏwÝ#™šžÒ©ˆSÿH•Ä%·™þOoÛ*ñýÜT:=_B¦Ýd%Ñ—5& ¤zÉý1g#‰8Y…ÑŒ÷ ciÝŽäs½:Kߨqí_ŒXq´Óç^(pd•Íh"|^Ÿ³§t<\”Ñ úϯ:P]¿seCP¨Ô]œ>“C·†b¡€qQ\ß6g= H÷LŠÜ®’ªìVk)#m9Nº wú`PèAõSà#p”;£é•„#Z" 7WæÌX‡~舙GÍæà!ã¿y<Å[f¥Nz%ýñæ4˜Â”ƒˆæš~<ļu•BÙª7%¶ï+-LöxüûÁ-LúÍ­ßø2@{òý쟵N »œdsÚ0•û¼Å+Fbãó®NIzìvë=tÛŸPƒ¯\½õºs`ì¢Z`2u /l¡„–ÒöÇRG“çÞBØý͸ìyÚmAU[oZ¸YÏõ J -%lÙ¦8´5ÝÛ¹jQ$ ¥÷8V>{\7m\F ·Zl[ÀÖV/ÆfDkˆöb•Ç++xeu¤Fìö.+®)õDÄ+Œ;o›Õùƒbšõ1Ä”ÅíÌ›–(ëU嬜©ûøºÆIï¸.H„¨A´ 0ìñùÒ†ºMeJTYHÞ× $Û€ÁŽN‰ºë‰ë/4¬å3“íÞö‘®têz²›Ý,Z-ÎAŸµx‘ _âD JZQLKÈf0{„¦É 0¡¶Ý É=É!ï}ÞÜÉê|·;}olú™©–ޏÜ%æÓŒù’éG’šF¸(¶ó\0´T÷h §z¢°tñŠ´ó¨ýz<ôeñ<ó)îÒ‰.0Íß4Ý ¦¢[š9E}:Õ}Dåï°°ú(Yçh¡ø·|礊£–VRT]@ÝR‚„(Ÿ|¸hƒ'8c ÒR‡Y‹×n²Òìhé=jM^ªbÓã¢U‘‚"Zižx^­éÁÝqÚâû¿.-:úÛäD ~Šü6 £•Qu[>­ST4'Ͼ¿§iå;Ò"”Àe¨^þrõˆšê…=ÈU~Ë“Ÿ²sg¤º²}ºS^$«,¨AåÇký§Åîä<ƒsò—b¥5׿|quÜ©=HEGÔR7{öím¾@MƒðùöxÓkɾî\þo°ÏêÙ;„Þtb”G`V·mK®Î±#‘afšU$x7,Nƒ^M×£ff`‹,:àÜU_Ð8Õmt÷¬›úƒ¤&¾¤KÑ„ üK:âë±×AõÔÄ 1õŸ!ò Çï ™ÇoLó7]¸ ¹„<´YE¡:_¹‘tØ6‹‚B‚üaùAŠ˜yCCÃ:!“²g5¼j§Ž„‚~}¡DÏ4[ Ð팪ÖÏ s tçp‚¤N~ã0ä¢ò$‘íë!îc%MíٻƢ] 7W!Gî­7˜»ä“E’RLØVöË¥Í\6ŒÀ¼òÓ›ãV ôÊ_šq‘óùœ)E’}À}†ó91µ¯‰¢ÅGºe˜K«‹I®Dˆîù–"À‹\y­žîʋƀ éÄ!S†Æfï#ûU4ãCxPè}[ 1tCÐD%Úš;­à§ÃÖ#Êk­#u­˜´{qéî½x[K“RXÄé.öDÓ~„µ›Qò‰Q±Wð…óWÚ¸|_×£ôŒM›ÅÝìrë±Bä<`IÚn+ßÔç”ŠŽ¡Ã'•˜€wF=!¹ˆ¢Æw@ÍìO9sÓ­Í0îeFà’ h3n!Ó§œÏ÷+õF.p(Q‘‰Å^qš`ìS:ØNtžIÜ¡DÓ|l›SB£<Éÿ2››ò/< Œ®Z…1×ÝÁ˽•œ%¤UQ1…!z8=X«WoÈ;]‹Z»P˽ø€‡UãBqº¥:í1ã¥×\¤ÞŠÈzÞåjá6~ag¬¨Œ&¸HÃè…ô›âã©é×S“4|£½(»Å‚M«ÍMÛNrPT“æÜ Œp¼NªÐGÉP#éŽÖ`ËŒBf›óÖÙg iø™ògXy+¬ò¥­”„Èn$ˆù# ¸oIÍøvòæØx^hb÷Ê¡Ü9ëDí³ÐÍ:"ȇ…*òćK@,ç£ÁºáJâ¹gf³>å`D÷ñ9Ó ~ÂWæ™ Ôn¦äIòV"ž’@¸¯Wk&þ®Ò鵈È{g)b¦u§sßÖõ„-#gB«‚Ýw^ÜtYÔÂ!µð£æµºá7*ýh\îUÓ‹#·Þ{e!æùÅú¯‰Û›Ñ—Gž’ئ-ÀHYR7óÁmøoË ‹Üº>¥*|çZF`îÜrX àçÑ*jgËHåwÏ6ÎÛ– ÇÀz#EaƒôÌ<ŽŒ=1$ÃÔ‚þZ³÷4ÅázS§¨Ë‡}"ü›™ÅB†ÌÞƒQûHí{FžÍù왤ÿÇî-½…ž WÒ5RèÀS=ëÛ›•:®7 !lái“PÅ}ºý±3š‰ãbh‘lö—B«“RñËÝX7cu—#jVŽ>qå°—¦Ãsð±ÝCî: ˆ*ý›d€û‹~ƒ>^3Êq7••rÔêP•õe âVŠÝ•uú™¦á…}åY]k·tÓŠ~“O']  Õà_ ¿õ‰î@SæžÛêT$Zuk›U¼Í%lup@*UgæoF—­NYJH‚ ø( ½Ÿy˜ž9=¶òÊ"9a]…"SÒ É€øÿÚ#2„ˆ‹\H”!ƒw^ÿ¥yr–º”]Ð2èÅ[pð/ž¶vVË0§c²}ù“ò«#W~Üãúª<·¥’c“=ò:]ðúC„˜¿fø«@U{9eY³N}XW ÿúÇh=ä­s_™ãÐîg;ÕÚ}z &Á'×bƒ.æe’§¤ðâíùˆjÏ9÷ÖnÝÁm(FÛbA@F‘={>Ùd`{.|N¤—x«x¬Ìù“[:˜N©g¬nGÁÊ)Œ=þn–)Muöy^}VØrŠ8¨ U¡¦‚wS•¦1é8sŽô"÷稻ªu]ëï¤8*SÇtÕÊÚÙyªáa5çNjŠ$ øjõß Îß~x¦Ð£Ž®êæ´Ô[F'@Cví½ù!Sn0²Ô@!ÙäǩˢÐÊЪØ\ö–e"(%œ6ƒ ½ðÛLÝ%ˆßÚs^Ò`ÁŠ_l»ÃBô4Ñ=–}ÀýwÑbûUiqCÓ¥“]æ†(ò ,ä\ FâØEÀŽ\ÐÊÅrj(†¿†íRÜv Áצw†8ܤQóEçŒa–Ÿ#äCš-p©°뾚gÀ¨~•K1ëäVæ±”Šìá’ÿËtÇ/Zž«ˆçlPë¿MxîýÿáMFèÛ‡º#=óðÌIDK­¡¹ë°¾þÌÔÊa,!£°Ç *(nðqþ»wÑõÿ¾+ƒ¶9;©+„¨4½G•|‹^®o 4M[Åêñ³c<Ž&¦(#n(3µEEòÎâ.ý%O™\\Æ„SKË/% BX™£9]õú®êÊ‘×mJ…£ ü<ÐQ†¢?kå3扈½ÑB¬š–…øì458()R{ÀÂKñuKQFH')læýHz€F÷f_’ŠE›7P´õàÕ.©6Sß5/õàL›a¬8ÑøÀ’\»ƒeþªWG9¶rp€å]¿æ zRSXWúÖï('0†l›ÿŠF6¡æb–åc÷ÌHF‹…0å0×ê)g½ÙÜ‹Ø(ô.’Ñ‹•`âÒ^Anœ§ûZS×y#Uy+La,ý½•§Rë§î„©÷l1Ä€Ž7ÅÃÖoL àŠ¹ý¼S|wñÙ %7í›9m%ôK×Ï«2:½¤mpa(t8ˆVüy¨Õï¨ðY|PPþèjK*k·ëÛoˆÙiÚšV·‚ÉC]¿q{×´;§%×b/ÏìŸð)ª\9ãó.2'C¡K3¥<ï™7‰7ðsù½[<@ŒF‰­¸`ᨅŒ剭zÛ[F817&Nôi–´Ò]q; ³YÍ·UM øeHu`á£A>ÔÛ)‰k.M+m¶Š¤Ãä7gäï?iaáöcr†€È"|6*¶øRêðá?°¯v <•x« ¶„‰×¢’bo'«59•q¦ºèækÕvËÓ^Þd­n‘[²á~\ õlâû`7tTŸ²T±Ü÷u#˜-N­g*Ü‹2 •Û•ÿ£uSA˜m EÏ”õHüCü%r.z§aèí×ÛCUkpÐ(å“ è~UȨõ>@ =YCu)»99þÁ¶Þ¹‰¢d2K¦F¥X½0%¿_$qìqû›ù–!T)½¡Jð‹ªÇÏzC­Qsºù @,yñr2GÒKRøáXzÄp/‘4ÇœÊkÏÙœV˜êÜÝÃ~ï™Ü|ÝÀiÑË=:Õï2³ 5´cå ¼Di0ÔGn,èQÓ«V|Ë–‰³¶jÄÐ’~ »Òšb ÜNm.6&)„AÑš2ͪ(…­ªx&dƒ´*HÝ"r —E‹V¤ `¿c&'%Ò4X·Ë+¯(måDÅDR{%²Ã„»¿N‚R§tÙ˜_¤º(FD[Mâ€u}pmŠˆ–ÙMðßî&;ÊMK…bèa¡~OÍÏ/Ë#`v>…3?[Û‘`—‡JWÞåÉ&Sr›ÖE/÷`Üü?æ_Nôÿ’nÑÛk—»—Mðó)bcj æ3rç¥~ùg³ ¢ ä]Ø>#Ì`žÉUKõí‰Ò.²Ã˜£j>Ó½‹ä­ÇFÇ"uh': kE•µ̼¿¹Ü Àmt£ŒÑÚÖs5d@¾šÊén©Ÿ¥ÒÞÀŽ!M¥¡•Ö;Öà9äØÓA”Û>kשNÙ¹Fù[qÑP7hÌ›Zň,h^«XJ¾—$¿ìsé*Í(¢òÐdóÖ’DøÔ£+¤î!ø EÍ´¤D.VÙF­ÿìÕªH5®b-P8‡4Àwçü íõ娅r V/Plì÷8½,Ail—sбE$­’86Hük¹ùÔKæpÄŠ?hèůÆúzL­gEŠj_Æ6¶(ò@ÊE-%f®ãs¹ÁÓ£Q03•Þ… •Ó¶¿_ÛwŒÁô\È?ʧ€)™:ªWÏØúç?»Û‹êY4xRÛ^`@È—Ý´9ÀÝúÖ’)l0B–XþaòSô"è4æ™Ø‰~R Ù Y»ŒpO4øþsx~*–R5„n$C`ñ´l£;“Éúk•ÞîÒˆxØ~ÛmùÄ:õóyΔZ˜H?ðñ8J¿³ŽÑý‰X$©±sΑÇäÿ>¿ãA ôNÆ,>Cö¹³âtàB`2Rn­Å@¥l ¦Å_½|•Í©±y][ÍuF’ÓkÙfç1ú½­pô©<Õb*ûEw5=_¶ÇLZ§ùn€£ 7A]ÅØÛæU@Á¸>2šòñzZ2}=^ísšNƒ«$Üæà»úš NÄ›ê.áx©tZ뵯‚\Qµx`AmPhƒ‘èB#‚Î3 íÒ zÒ‘‹Rmt^[=lžù“3ã³Rìõ:t+ßZ@©²(« aüÐY$—Ú+/ °#HüeÜKŠÞ#Ÿ—NG=/-0[ˆª™Ÿ`ìµ”wÍ-2­šx+t cî 2„Å+ñ @ÎRÆoáà+ÙŠÆ…áeQ –õþ©í"_i‚!óÜÙ¶5Ù1g&r50)‰µP¢ÊÇ®¶-s“Ç1­}+}Zєі¹fý5¥k‰*!€BóᎭÀ™’¶`“öeà¡~'¶\}*âZ’¿ 寜‹œ‹gKþÉé«Û‘,Ž’Ì‚ÈßÍÖTÒ4ÕPp ž}s‹>&`@¨[]·µ­ƒö3;Àõå¾õOn‚MU¢¢è’ƒáôÑ×ç¹×zúÐêÚL<]'ýmy±6Ýdük¤î}O¼4±F'°»N‘UÑUiA>&…wARm"L þûç:ŠÞ³±PÒé+¡¦¿°ž‰Pöæm;Òg*e¥DÝ|ùTüáp‘’·™õþ|©?ˆºλԣ¿ß‘$¹VŠ›´±qy&\ ².GÍ&ØoÜ$XÇ üÚG“"G6œ7·bòÃ[!‰É‘¢ ôèq:Y4FêýÕɾ qÍÉ’VU'…`¡[ (ò l¾ñ’SÏö·ô#ŠÙæºÏ‘VoÒØI^AžŒŒ½e7Qg8l;(WͺSq¬¬–¶ÃŒŠµZ‚E„²ë¬ùNà=-+–baàt臅_Ê2_˜óXZŽ,{£bë0*7&c1xÒ<*°çɦ¸ƒ¿»o(·7Lêf,²9êÁ°™ìê~Ÿ–ÊíeÅLÄÎËQüÒaÏ»´Ó±èå=ƒN ƒ¿œ%åŸGì9|X?{öGûŠêñ.×éŸèS©v%søføøZµ Jý˜s‚a*±JpdfÅA}æýQ×*76„ qŸth|°Ì´Ÿ©tõ§t^Ã¥ î¹3–šŠ–~7Üw`hy–©Úåž$§Þ:R.D4åw‚¸×˼Ñ8ýöÙþ>Uå¢'à×è€úuÍTäeaóÈ%1£AÑäJâžsVàTz~f ®g•|FA·^‰pþµã_ób¼¤¹/û.)âéæo×n¼Ù-(CüemÕÒÓV±ö?—øÆìÆ}ÎsÔ'ÊCÃ,zªÄ<ŒHù{ØêÜ߯pîëÌc9¨œáúê] ¾¹ˆû«Ì¿AªÎ˱¿ž%—Ù«î4×&n´>S᮫µWçÊéP¹o¼övR¡deE&ßà:YN óú»¤zþyÌ4o€¤’‰;Æ8ìî%¨rg‚øA,ˆ28ØÐ´Ò 7D(j5fÝoÅsÿ¯u+E3x|òRÁØšqÈ2/ÕrÓùç6H7³Ìâ÷¬´@.#†kÿÖä–ÅâÜýtŠàÃñNwÕÓÍ[ª1cÔ!gDš³´bóG 8[è ,ϬD£$­©@E•ïLÕÆ‹ž:¤©¼ÁšáŒl÷ Ø‹¼Î}K(Ô¬áŠçÉ.÷º¡¸:Þ¿Ô—I…ÞD¯¦™#dBB"ÕŸMø‹‘îÿˆt‘©UOTˆÒõÊžqp)r&SYb‚ÿQŽð#PМø÷¿Ëÿ®—AG°€&_'óÊ ž‚´™&ìÑ„MÓžJŸ„‹[Æaôèý†ÿßtœý5§l3ÒåÑ?nóvaAQxiͽš×¿3¾²Tž;‘ý”_¤Ô߃¿ëøÊ# aÏ ¾¨xóÈ—çBûhZγÍÝ,E/Ø;ÚlÉ/6A¡õ<7Ú6޽!}&ý÷L¡µ¹yˆ¯æžÒ$G±1¨+®Ö浩)@|¢Íg0YD¯1?±Qþ¶Ù Dб0ëh®dôJîúEúmyåÑ 0xØðt֬ŗÄzè’Ýq.Õ‘ôS úý»ë¸¡\k±ºÈóï)x Zûƒ9~ðÕ('Tkí¼eÁbô$VusPê߯ˆ8-_ñ“GlôJéCìn0ï®@zòxš•͇Su•þÁ‚A!Ay FÅ›œõãbŒ¾ôIˆŽ­¡ÊWÕ„Ê“ŒÓ¥"Å(!Z\3OÕ!³gƒ5óæÈæÛеbðյޙoщÔõÕôˆí÷°v»âÀÐT8Wß÷ów†èòÚyã÷}ò”̧ÓûÿÈýÚÒ«ìÍ@Ñûsñß?-´yͳòË/‚j[ ýÐÞ!¯ÜÕA!äµ{eÿ¸kŽ&q [  tú’¶cî–Kh5̤ÄWð=HUáhìJ_aÇwGK;GíKhh׈¦½~t”Ofh;ð+˜(æ2P r pÞhüÞi¸«bJƒ‹Ué6ÎŽŽÂ =ž¦‰™ äïYhªk­ÏPëª$¶;§$û÷þ‚eØÛP îoùcß©7Ö1Ju4 FË"‹íVPó” ûµ3ù¼yk"î®+Ú¯Åý5køãчòÿ\¯ËrœÑM¸¦¦¥ŸÀ?ǯËñç÷O.žÕ•šsåšÃ̇Yxf8A+q¡+ÖíO1+Hp¬–\þš-ªlˆzür†‹Õ0øGv»¥WáËP•J¦ã„vË,@*Åñìï4ï“ëgŸÌû.³Ô½ #æÓ—ö5n­ùW<  CØ0²Š’ùÌšdPræYþŒ]&JCžzô#{¯ËήÌZr7{çqpZÌŠh F£`-øY…m;¬x¾›´ ×z9Hõ­@ã•(ö‹'xª/(6š[ë,! }€È¦™&NÊRX™Õ;ÏãJкWc~*#r—ìÛË‹R"ËFãϾB¤®`yfïW×jcØ'ᦪ³¦Ž†À͉@µï3ÿäó¡Gó†ųœÒzvòû¯Òiˆa—“!@‚‰û£-n `Ïšs€þi›ûW¨MFoß~`©˜x;N`&Ú¤MÌpáÍq@ãö!LÈFËîäÈÙçzˆý½â¿Ò£±)ß.޵ fb½h„m¨1"?¦ØG2KfñR.VJMt{"ÊpNYvfÇ—sdÚb‰wÃFôßÓáõùZüe¥´ZOU\û™9¯ÌÛa›(¼Ã£Fô©v¬/©ër΂Ù/D~¾žVÉ_÷íçP‡âÛþå+ýÁÛœîÓièê€Jŵ1UOMmÒ@XžšªJ‘Ã%À™£Ê•¨™Ñ¨0cX+¨Ãiβ©W ¦‡°ÕÌ÷è–?]iåöhɨØv6ù*åù_½‚ðÄÕ?ã}ìîv™w÷nùÐ^óŸ‘>È-J¦| 3nƒ|/+I¢!û°§/¶øúÞ~ʳ"Pÿ?#x2¨[ù%týÿÆs×½þ;õE‡Ç#ã¡#ãýðø !àÿ‡þyD JÂßBüƒß>ª$zÈSW»¶{?Iþ]ëÛ¢)à]q¸ý n£4á FpÁ™†*‰“‰OR˜„ ¹2$~'+2#4"¢Wt\/Ì2΄ð`”™u¶"f|ãA2däÎNs ™B0‡q AËÐ! Ã+=¥ÎR¿A¾è µwì™'CúŸÏàÈß_ê:o•­²¼§£½UOÏöñÆ%*¼iëndýuÙ‹V7ê·ïg|yJ0½œZ@јÒ&àI.Œ }‚MS!’‘TÓŽJŒ‡ÇAVŠ_®sdfiývä_åû=üÇä™)»ÛUp Ž¢>Øz;qÇEtV㯘Çò½Yÿ¸ïJZøüèNn:æ1âku~œ[¬žg'1‘a{§&4<‹8#ôê H=™ör0[“xMП—¸sFÔÏçà®ÊÃú^K9\á ¹pÖ”øä• SÊEÌ&Dó9FØ’ürp<„¹ùØã¯q¡ÙHC¿O¥ß/ŒÀªq þqOíT3iÍs±àÎþ"?OEwü_×_ÚPŸ•ÌMË ):Á±À]=¶V°:³yDnjºiàÓk#¯OWþ»n1—'ô¼‰TFZ|Ò`1åÉätGÝ~~[zä% :›ù×Sµ¸÷îÍ;c}|+ëÓ§t^i¯m bÑÙ;¡!xZÍ–ÕvÎ=#öù}˜b:ùD±:èêåòL‹åSzg®ª§îž®úà]?†³éŽœìØˆ;Ä”Ád&—ެ %)ÁŒŸÌ:õ=M±£P ÜÄÆGZ­¸fS q²”DÇ%ÊR¶kùåš’¹ Ç.E㺟ÌÀámÎ&®7áö½äÞ›•Ê\vÁwì±-NL=Eµ`âW¤ÿ r/âµ(Oî6 “ ÁÚèÙA¯bÎÐ íîš[Â…_Ví^Æns°k¿Í=—DB«c®?º,Ö£µß’,MFq¸t7êþ4wÛ´ïOIIIÅòO’ý%#¤«Þ5ϳ¹“á\á¶É‡ìJOJ“ö÷¯PñGاží÷†¶ŸÙØÒä9õ}9è!¶.Hˉ&°V¡?Ø žëÃÈß»>cNfJƒ ¡}ËÐÊöÞaå­³óA¡4¦ÛŽF}kPöÜ80Žå‘Û%o2K ìA5K§N„[\…‘Ö hÏ”ÓøÁº-·ÛÏÓÏ$!KÀA†C¾%0¯²5‡<¬¶±+x´â›¸C=™Qxw]¬çgJôýù~é¼½N2&ØQ:—­GkÓüù~íÞGñÆÓ¿g©×WéWaog4ßzÑ!dmÖÖ¾½ùå.âOÜ• áwïŽi#‡&`ÊdoÏ×:! ¯çÖ?s”ß¶ÒÔh7!ד$,Ȭˆ·Q/É ½¦”Ëw+ù­ßœôãŽ~˼ޯÕ_É0÷Q`FÜ8e•5H‡Ç«5!Ð@ Ž˜œgÁ5'¿Mha¹!(ˆu€2æ«`¢ ¬%d@es^ñ´@¢›Ï¿("¡H¢Tt~hoÄzQ†?ÎÝW.P*÷6þã \—aißh#q¨o6Ǫf¼úõßðôÅ”Wn·¨a9p>»=ê—óî%ñ’œ˜ŒŸV¬çc”ãùrú~2ñN•Æžee­Ô4â†Vtgù®û\)Óm‚­[9¡cѦpÙ¨b!§ïß! úåñ#^ç¦^‚Òð¬´%ˆgÙš‡%®ž§÷¡é9šü¸[7Ê5dž :VÊPÑNõÛ2úæ×­ë2rš1ÀKÙˆÓpŽp攋C›= mÕÁToòNÅio!™´ÛN»24ÆmMJ$­8žâ&%Þ?Uë¨7€¯g$¡÷üqë­þ¤Ùò ƒAâÝ<® }é’ú{x×¢'6~>‡Ç5Gǯ’™Ìê×ósgRk%“¿G>ȇÇwnVÃþGÓ«–ÔO1 Â5:Ô.⹺6g`/¢@â©Ä³£«NéRdê…¯O”åD›í A|{ 6¶í'î‘¢+é6óßíõý5ûò;žyΞvÕ)å¡Óýs?À"Ó¦gr$eµÍzö¥àŒ‡Á}ò€ŒÐf——š¥ÉieãMf›|Œdl›ØŠ©\ÕìO7¤§×hpûCeÌ2l³£<‚,Œ=§ü¾¤ŽäÑs y€ìbJÕ£«ºvs%å¸K ²ËVذÕkˆþG)ºå^wÑ ã.ùÖ6úMæù"NÐÞè”Ò-þ¤‘YñàÒ¤…Æ[Âsžª­¥ÛÒbŸ¾U»‡©µÖ<}¤$ @Ç'¶jä ™€ø\8¶Ÿ—0 =EZ†VÏ G,6äÑ€ÎÂ¥%–sPÀTb€v ü"(œÕ¹ÒO.äX«Ê?OÓÉN¶ƒ³Ë)”¬ûJ$+]ãäM(»¬YbM´µ|ùR+AÂïóÜ#7¦å>#PD½©Ê¦ê7uÎG†A3Ø (vc'­ û&MA¦1REèÕ¡K™Ås¶Íèr™a½Ú²3u…ÇÛúio@Õ:Ac éލ>È›)Œ“ Ê‚fD>ZyÌÓùQ x²F°„©Q´c f”Þ"ºù°$ÀüŒìèÖ}^ôbKÁIÓÓ–GŸˆî½µx2bplµý4ifÝ‘V1;êÁB¹~£é‚¿·šÏ ÃËÁŸÓ‰a’|ê¯V 5‡3Hÿóúg±ž¤ç}a$#ú© [‰"šwò4€+鯋4¶=ëÚçVBÀòŠ1»~Âê> Ü@#„CÐdè1F\ÔŠßLDŠ“Ùí‚}‡.#URð«JuÒµ‰06 øê©4îî?shFáÑo{Þ±!a×ÜÎû*k๓„êòq*“»2îäT9þVYOGåv»ìU¿¤I\Çqcä)¦å#们@ØüSËË7åGëÑ(¼Sþ¹kì|ëHÜXûs#¼æLÑq;¢Mž_yH÷8mS„µ4TŒ'„±à½)¿O'=]ï=ä´§ðv%Gì?½U 8"2É: ½Gåd‚õZÞW,´´sɧÂR–ª$mñž%þ˜ëð˜Å ;XâTZŽUJ+*W-ª4‘½K’TŠòÌ·¶…ë´m¼;1Êî*A|ÅpûÍéÓUt0ºA§  Žßí6Kó¶õ)0áTLœ9²Þ3nHSå)Âhõ­½BÔy1VBg ØëÛˆ)¶b6K¼ù¹qÓx%Ù8¡{Îå}T ä¦Ñý‰B Í` ǙޙŒÂ¸GÊõPl…:BC˜±–¤’+™u€rx™‡í‹¼Í'ûßR {rYqªô!¥ãgOmt—_,ÆöN—Ö“+‘”38{å Z]ÎcF™Qø¸ŠRP0ÉÄ™Õz–üÅ oÕÃvB¡`QÙ5è`Ì™wìïi›o›/¢¯ÓäÌøó ú+¯¯‡ˆÐ&M•b* ]ø‰6Âcp%up®HVuG¶†‚Íš&¸+¯¤ªoŒ Ò§WÒðî^‰‡¨uz£¸m…ci¾ùZˆKmeyTf$¸Êsv’Þ0Ÿ#Ó‰7"lÝ3DS• Z®Õ ´VÃ_õª+=O¶zðÑ!¸wFš²n;RþTz[Ò·O‘3(§úÉóŽ_<Ù€—U,ê”?ÊkDs䎿™û¨ëŠø žd Éš«¦ô%_¨ Ÿü’ÁŒ¢ºˆn74ÀºŽ‘*½é³ˆt(l: ·Ýç’.m$£èËôsq}›}G…ÒIžZºy—±Ù<ý'ë9 ë§qì‚“P‘©uDÕN=³Mö;Wy=ÐTG 8#¡÷ù =Qš²À¤×Ü“ ~<ÿ[ò»êmïãé¾Ê¡ÅgG‰|zit…ÿL.‘ž¦D] ›~߬>¯O/¼è äü Ü»Om˜(sa—±—ÿ1Õk—6 T¦¦¿QNÈt…Ù$š~Ȉ©Âf ÃNÛµ6àIh´ ª; òØ.°eƒ%AL€>³×K(â*/6/Çã©W­î ¬Ù´xж§ÊÃyàÓáˆ!”ýü‘B÷\òüXmx‚ÖÝõ¶JCa«“ r :TNªËƒôîs2 ÉÒL˜Þ"„YÚ’.tGzw9T W¼!ò>§«Óð$3/#3ñ‘ ;U/r:@uxºg‘Ùw0>0 rέTÅ3Ö´ÿÍ`;/k°ß‚çÛg Cí¸þ×-JèM€xsœ¹¬ò<&bæu‡æ"ôéË2ñ—áW\ìMd-ŒŽ0¼#Í¡&?£uïf<HÍU$ô·?SZ¥?Ðâž·Åo’Õ*Y2h>hoWš\v œ•Â;äy %C*Wò$“‚‰~¬–¼pÍU©<\"ÁÚD·!›îG§$b-¬Sšw¸ú(ÛˆÖê¤fÎ‡Í ëI$¢Ý±€wdMˆ˜‡» A¹fœ vÙ´7¾Jëdç“Ç…¶Ð‹a„‡Ç‹2§F°3÷gI ì]â&8Ò\YŽ›ð F·Ø•@ -ªpR7vè®®Ú½¥»%¸*&³Ì8Ákzý_¼ZôÄ·=­¯]÷’@ +´gÌÏ$b÷uvÌg˜á×3¸9ë}1+¶m³’}:®ttA·„ ¢Ï\GØÎÒ¶?¨ÚóÆîɹ‡ O4!KÜdi¿›M-ߦ<±ü{rGSÉþÜ[$¿U$~ÔÊzyY»•™‰}Žb—žz¤…]Þ6˟̰žAù#Ñú.wÊ#°ŒÙ¢½-̉µ¥™™Ž5ùp‰…3DâTúè6R<‚³qiÞ_Û|õUû™—o­†µý‰k»v¼LðÚÁ/4²÷qÓ «©ºUˆE’`’XÅkSy˜sñ¼õ˜ôŽÂsQ£,;ЀP¬AÎomã á |(n­ÌV”8Ùâmˆ¤±t±ÓîÇ/¨ãmßF¦ƒzt_hr׿CŸ6…/MŒ,WŠ*û+=b={öæ¿åh^‰ôíÕúÓÒšŒFL! A™ãýñr1;MžÝ3H;éX“X¨ÎÀÓk3µ´õGK¿¯J–+Xç \/`•ä[7¤N–eÂÜŒ­ŸfJÍÌ&^ BŽžë²õ "±dZj¨‹B”¯ œ9_5àë>^V«‰Ïñ¯°eý8åéÀ-¯“É&Τ¿eÃ6ób<Øò Õ/TEÑ\ )_tš:2 óXË’6Ÿ.Låi¦šW™/*–Bzß§bÞC Ëb­ h`‘Š Þʶ?DÍ Y¯‡ |é ŽAÕÒ!wó2“‹å‰jâc¡X}®ñZDŠ}ª«‰‰~žø£m­ÊñÛ­‰x(õÁDÁeƒÓ\Ìe£ÑO8…6„Rý™®Cæí=gÛïºS½ë=ì:V¨¡ì|·ðДUQ¼ò»êçj!‚ä÷‘'éÔ½z³Juܘ͊þv{ã=#b/’»ˆW{"Ÿ³çá Šj¥p¨±¢d…Ïï—+‡«Út›»ÎïC²Lõo3ÅNª#Œ”*$푽Ìñ´UԳό ±¸äŽsÊ”,,壿KÔº]ö×]šòG̱,$oàŠ©XE µÓ1‰–ÏŽ™s ¼,ƒ}T¬âö+ÐY 8ÏíáÛíZ>õ$™ˆ­Õ\”*ø¹ÉQäçøE¦ÝÍ•2çqÂiÔS cA˜ï ßÄ1¬ O?+Oª5?HÙÊ&yÊügÛeKeuýðß™¾šr$[Ð;Ï:š wùè¥ËsRÆ–œöó"ª°Kèn“nMZI¡uÝžöWøðÓ·‘  ˆ[Þ~Ežµ&'²ì–Äy^æžëóë˃ÅWåg.e''R‰’ÍŸÆ]ÿa=® '£‚™œ"x†äK4 “ÚïnYG­ä4x¶'#Ï ™!]Š¥’AÜØeOD/’Vt3]'ÓK,ÀèÈ•+ÑÇ º Âic­>üJH¾N ä{"³R¤[»ÑwÐïÛ%K•ëØ+ÛMNF ®Ó¥\触ðìM6ðZuÏkwqHOþëü´©O íE;›{4!ùˆ¦r:ç±…#ò9ïûcÿ=[(Qi¡@3¾=-\ˆÂa½Ú ”çH`âBHƒ%rŸ^hO‰l(Á!ó†KQÞO¢Ýý,•ÿ/—LIóJT°øçZ¼ ­wÊþ¾âüŽVÜ?ëe¢Ê2ê÷‚=Ýéëƒ×òwQZ[?NÃX2;®™ÈtŸhf.üslNg‹®fØ” öÉfröo à ,â´ðÑãàïŽKuÌß’2²б±mÍ.²þ ¬‘WmõÕòË`ŽÛE¾ê`5èœòÿ·€3òÍ OàµÐ©Á¹³Î÷©Z íHn޵n—|Â_5â×µeº¬v`Tjü³#ÈV𰨤˜›ûY´2U$ëâe.\6ÃÀкø·Ãa—¹ŽÞ¯Pý[ÕÇElQ¯OZweî° ¯bÕ‘k7d<øœÝ§ccõ8Çb-"}Ò9u&´B›1íx€°„¯ìŸB¨Éû^Œ^ýk«Üã%«|žƺ<‰QK¼Rn{B;-Þh¸û¦™AÆú¶ÕÖg—|óY&dGgAž¶õ—>yÅÁ""•¯žÛÄ|n >‘þFRi£²m/½§ )é2ìi³ûœƒ…:¢$‚&àÛ¯à¦AJì\Ý]d ^ùd£c5û§ÜÕ’"Nòßᓚ0×{C÷>Çý¹e¸aáx”<:,ºpXº:ô) dnùóJÇTœòÉܦ8CÐfßðçCáNg÷á]fÔµüÞØÂtÈZT’ß<¬¬Œ –Ê"¤>Ã'çÂèu…[ÓkÓ]9’”Ïë9“:Ì 0ë¾û ¼ÌSÖ]hê(-.XÙu¶µvþÉ;™#ì§4£ò9?H¥ —çªÇmlñ)°Ë-UáÛÆ`”‚Èù Ñ2b¬ËTÁƒÇV£D ªüˆÞ§u|¥à*F}ªÁË^MùúkN—’) ®×Dô=ѬNý:7€¾ ø‘!YqâñHõT† D馊Y7 ZW¼UÈM1hž#¹9 ·¼\]˜s–Nñˆ¹]‰šf¡É˜ÕG2”ñ®¢!ŽqÑï|VóY«SFÀº@šÑ“Åñ…•Š ¥š÷S¨taPþëd¸Ž¥#0rcuhÿ§Tn—Áð­y-ií%€0ªÀøÉùß‚cú–ìÿ¨œþ¾Eï]£¢LæüCfjh†Â«hm„›4騚’aÿ]y®-Ú$4% zR0-ø…׃òÝuÏY$æ&a ²Öðæü´ ”Åg“JÈy·²Úôé7<½ùaq´Ò‹çpie}ËM À±´Ýúä?°»í´ ë¨[\²˜Y<ìÜ@bèv—ÓcéÍw‚ÁŒÈ8‡I¹ºN[VÑ0ÿy%³Üì^ƒå„:£Ë"“ÊnÐ-í£àÊÌ×›b³áÍ7ÁŸËÞdlz-m·.bmÆœBKÛ6d‘ov™ÿpïñäúýŸôÒe_nT:åRÝÌJÀ¯^B*·S¹?¨òZIÄÙkŸìCƒï’Ö´PË[HÉéLÁúš Á6ANŠ!þ<ý¼«¸¨º@Å>ÊÌÀtч1ñ K¦å£ºÇtë¡í¬ÚdäF—üÁîS«KØŽˆ&×!ö³YoÞj|Îå¼Cû¡w<þhÁ:´óóB€Zã×eÜåI%݃!Šê‚²Òà!×g§&‚«ûE’^-½žTºÉʾW¨5L˜ÕF6¥@Wü;¼é›f¤?=Þå)§Ÿ‰÷g¾'¤ÞŽÚFyR°±²| ‹"m:’!-“ ­r åéОǯj´Öí/´Cú±5V†¢ÆþîV÷û ÕºÌ,ÛØòŸöøüPvÒ7"2ô r4VV^C.-a©­ÂÖoý¶¥  ç1muy=ŒÄާ#Ø+ÊÈDjÜš\0K å¥l©¹›ÿWEbá ûY·æÇ’k±KÆEʸz*åX<0‡4¼¯)õ>iŒ{kÇUÏŒ­z3:…Ÿ¡ÌÁI¿ÀíÁ]3fâA0' Æ2 µ"Lü¢Ç{üF Ѐ÷À¹êÐ3–]ý,Ž8NÃç¢É„ôÓRá ݺ êåÑyE'8FÈhRŽü´ÑFBOy¬Ì·×úI~W¸èw1´L-ª@¶-¢ÛP³ª6ŽC{¥¨y°½IÂmΦ¼KÒÃ0¬vvk¦ÖÒÂw¹Ìð‹çžÍ*T#YFþŒ)ÈÌqù–‹Š@œŽKû å¶§{¶ážJ0WM_0ûÁæå7åsªÓˆï.ypB"zšCs/ FùWˆy4Ù£›hd¶&àÇ UÞµšÅM6ÑmdÙv{þ7#T½3³-ó¢÷S¬Þm cø,ÑÃÅ଩oCöF‹gô.NºWŠ_ª¼Å1‚Æ%ÂÈÖSï³:å[k/çõ\8^sYëÏIÞͼèFiö» ؃#¾XÞŽóœ|ùÁ˜ŸÔgÅØf/XšŽîÖ”¡§à唹u‘oö4öç‡Oé·Db©ƒ1•@x„M¸ 9òC€']x@ì¡Ïž,ç´ €-’õÖÄBÐmæ÷§EB ½ó©L¦7îçòÇ„Ó4H]lˆ3·®Âz “ÈvdVnSWõÿ¡gì¡Å$Îò^= $-éXÅzɘAHÆÑTÚ^ý:¬yÐÇåúEg?UûÊØYOz€]D®Æú@‰"ÀrÅ©);›D—¥ï\Çälå®ÌKðйÍ)î6wtÓ¹¯YïÐdu×p¨/#Ø¿jѶíš®'3¾  —piÆ™3ç·Hl"¥QÿCw‡‹6tö¾'!%iJâ‰80_ø:|‚r¹À›0Ïø5õKšÐ¸«Â‘úxD¢^o’,ƒóžÍ,Eõ㉰ºÍ¡Š³U}ÔT7Ã1{lÒÄ#“Š›€“B ”€Ø³|…–]´a(Rìý‰“xÃ'J;üó&é…A¹ 5vT š%Òã²LõG¬~­#Ðm\¥“‰3¨Ýzàwânþ¢Ë(4ã•P9B(s[dÂòÅ⇙Øh) Û¦­â´a+mùSâwc_:j‚¼}J<6N•¦„,[yÏ Yt’׋`±¸Â1PæÝKæ­®G9Œ;–#ÄNÂÒ ª3ÈcçK¶P{û ÿ ¦šÜ§/LÀ*;+ÛÉÙW£³ÅÎ%hy¥ÐhÌ ü•qá_°¼`½RǽREW±z^O­B\®Î¤E€0DÚmÌûîQo¬’²¨bÝ€Zâü$¤á5XøäÝc×t(-A„òÙ´ÈÃ*Æ `Fémq‹'dbá"£|*´0äyy_x³V2gÖhx(b¯é-± {À•Çõ; :<ÍêQµ¨ùk)»ÎSQÜÝÔ¶º£ — ÌQò 7CZkýÅè{œH _rQY½CÁ 4ò趘ܺ;ú¿;$M›ž<«We×°À¡¸í¢ŽßÎ|4šgÙóÜP³FçZÓ§,’Ö¯Vé…â15÷É''ŒÚž¿Â©/q°…”²X¢) i« –BÊÜýÞ¼ã‡c¢ãxDéÊþI) fãQ׸ò&Xêýš¶¡rF.n“‰®ÿ‚ Vî Àƒ{ÇGÕwÊ<Éí3¿%T‘ˆù§f§.q×¼~ˆ±ÞÛÏÚM’¹}Ô-,æTA]ãŒrÇIÛæ^¨gÁ$ó{ñVi£€v‚ðÖL&öΫÊÈa–ƒ©üÎÙËymã¦W::Ê÷B|Â[C|2äl÷MÞ°Õ"›y›{yD ƒà[Ä€«?=y).ºÚ0å%Ä—hHؾáaµæŒ|Kv[¶‚º½“›Öûc=XÍØÿ Öh2MÀÿzžü´^†¨pÕ]íg¿ë’!ø.šxÔõ Oí%º½ÿ,Þ{ZêV$"hœƒ³Áò;ÏË쮘áHȗʈ‡§¹T†jœJYpëY“vnÒ,µuäYêZCF`<þpØ 1EãcÞ&Èx8Ÿ2C¦ ëR°wÐK=%"áSPX—ðu8W'‰±â¶öÍ^Î’O=ÌÃû¢3\g½´å“¢Kë\œ²Ôù?ÿ0¦{yAlŸ« w5óú¹Šг‘Nf•ž½ÂÏ«^£áˆN·Ò=‘\_¾Wb¾,>Ñ}#™­#çÔe{“&7ìDýXœ$ n[#Ží“$ÜS¨û±:7³jÐØˆÑµ™_#Š›ð§»QŒáˆµšýÒ•wχìbK–q¶U([~FÅÜvkœÌ6‘uÐ +u×U*RBor¤H…!ílP¾ëHçëŽ ½žWÑq÷«¨r ±Ÿ,§F~‡¤2ËŸÃ#š3@# Zâà^jjÜ\{åµ!Qg£ð‰¤ÌGŽšFåæ{ÚâKA€¼Õ ÝKÔ=UåñT,Ûéžv—ÙÊUœsËUÓoª¬@bàW¬Y¡t§¨Õu y­^-Š[íÁæÛÀ‡(_Uzðà «(§DÁHßikG& ¹Xxalmš­zÔÝ`À+'ß5ãÊ&î驟Y,9g[å¤×lÿ¦Ú*PØŠ¬›„‡-Tî&+.¢%tÁª ‚ºÓŠº‰†Ù5f =ˆg ­Óå•Õ¼ˆË*±7Q3ç –~&åøÐî»pÃMRÜõï–¥‡€¤,ù«éQ_l„ë>œÉ©@ í %b€E,Vˆ,œú©Å@¯P,ãÛ=©¿§3æÜÜÕˆDÏž´JsY;Rêø i˜Aâ•Éä¬Årí3 õ>ët‘ß\Ú—^J_MBƒ<´W9åºQØ“”f=È~Ã`«éÏ­¶Œ²ù¨SybO²=3^¤@rþ:ergPo;K>V4íëT""aÂjÈørƒ~<.§ÐÃC[ưڿ|#´ät@ !„OéF­Ü€¹ÆWÒ;ôÆ·lñH„øa©Õ¢‘öX] YKϘTk>ìæÊ;®Q>‹šÕ=fԇܙ§}ÃO;= û=msHL£ïoḖì˜ó-¬ØS¸Ñz”;唋´˜ æ‹CÚŠçoøƒ¿yD ™†Ø"Ân¥z)œb°ýÐpÁù{²°ŸMÖ@5±Ù ºÒ¬ÖW\3/Áïo%£ƒK·ëN¸ÑWZ@øóÙ’ÕÌÂü]œ8#Ø}5êy•5ÙJ1dlé¢]]]ªÖs8ŒxSÈ_ uãh²¥)a&ÀõŽqZéu*ë/) ç"Î~Ø?äïâ 5…klFÏ2$ÎeŸRíÐõN~DÞvh·¡Õt;6žü¬ž2ÏÊØ~oŒÈŸu“ªÄÐ1±ýáFçq·UHùß cËÀîS/p”š—z`C'Îñ|qi­2siœ¤ò¾$Á|ÞK  å/ïR@öì¯2ÁH='‹[ncí•„çm´ä®‡qŒœgRÇi¡P;8ÕÙø.zb8Ë´’Ÿ¶Š#"Tž°3ú›· ®÷ªs ”¥>Ø“`±EÔÑÊã’B¯Z?–­yË$Ðtü@›/>;"Ó̹ -Êëèñ—h¢!eÒ†,¬‚}\×àw%·Ò5ƒQ5öA“À€ÉL}šd…[eGdjÖô(>³ðáTÍEЮӔ<¡/]ö}§Çp3ÈïF¬’öS'Öqgclf›Nà E áû±Ê"^Då@Dе.¢ªFåýH¾i~kÏÀˆÕ¾L–†e£ÝEˆeÔîË×üý‡iz” rx€îY{dÛš†Å… K’+Há jÃò6IDÓ~p¢I^QXÐÀ ›!0+¡£Ñ©®}ðõÜ!(2²iÖpy5åÊSBÊ\Iw?É‘="Ùç즹Só ˜Çuü_•i¹m|Ó@à1bº}ƒÌd{cà õwNy‚F>çæ¼9Øwñ®8¨÷¸S™ÁQ¤áÝ“žÎþŸo×{dɇ|°h4I°Ê“DÈ w_é—Y-ÌLEz‘ÅÓ#! ª¸:¾"Ës }ÌLæeýi}fÃ45KÊfu·V¡"«ê,:Ÿ$§f-kfì“_†‹ù˜Ÿ™vÖÍ$4&®©6 zèòìÌð¶6k ³þË×sc=unzm‚–Ä:ePË@Aû픟/éÍ¡?}”9ÛA¡/êËpB{äTèØagk%­ˆÑÿ¦àI$?¡jëÍüì?¬lD´Ù§ç}%§aÚâ2¬d¡]SFcL>ªë–_TPEÕ¹Oœž(AI³P¥Bõü´ººúÁjÄè§›½2í*¬Új\ÌÐSjsS" ÈìÎwrÚù°êseâõÿEq¾gžÂÁš‡ªâi2tG6u/¼Y™Æñà5X›žWBB$ß v²”»ÿm¯øîð’Ò–Ï=<ÄϪ›¾-äOÚçi}Ç ú¡•Màá–Dö?Ó,‘qý}ºÎzl8ÙƒäwXÕ@Èÿ¯f1£EåË‹->c÷‹a¥[uçl †^1ºòçoÎ<> Â|xr:ˆ¨ÆggÒ)|îT÷éÛ,Ò“ÌQ6˜Û°Í-™ûÂ~=ÖË©G:·P>ߌYË|[ “…6é5õ oŒ¿äÿ²Jùm±ŽÐ³´ÌØô™Îìºï•Ì"l"Z JŸÿ^<” 9Nô®äù3~x/?jW(¢®Á&éXáèXå¿¥5ŒþBC_%í©kØ™fù&åǃaÎÚ†Âj ¨TÕù‹±T˜Ô‰Y ö05N¹Äq¯1“lËmzˆzļ¯HcR¬`¨ºä0ñ?3K×[•T Úö`5…zrơǕM:è ¦ýx„uŇ½CNÒ TÆÙÁ/I¸J鑞¼Ùxâ…ÓG7€ß—Æ¡ŽDñ(&ç^+Ž'‹m )'ÌÚv ¼"JتI¯ï¼WØÆ›ãªVmœùØNËyf£®â£ëùeܳzÍœ±/lk,:Æa¤øiëëa`ƒQQ^jBïÕ[Lõ;Ý4Ӧ̗×v(á´OV¹š¬È¨Äýz··BÉÂ<¿NŒlnoÉjŒé½)ï¼Øs (ýÔ( šMÿÕ-Aù.ãðÞ)–’úÚé¥ó³„­øEæÞeO,…£™€5ÖùLâXÑ7¼æ.ðj9ÂV#‚<. ¹ëb5> &Äñ©XæEºæð·œƒ;…LtÒ\AúùùGаBIt#Œü(› ~a|RyqUã˜çÌQ—ô<°(Äüçõÿ·í”—Õ•x͗טb¤JNËðÓ5ãKÜ{T¼Â‚iiðßh¶Â=žÈ¤Ä’‰ç|Âó<›ÚP‚ú¾ø,«è$®¾rçšqç Âþœ¡‰(Ðúfþ.?DYÛ¾{LmÛUdøDc¹GR âÓ9`Â~ÃP–$ ÕY‹Å©³âÇAN¹U¼ã –†‡}³óö]øSБR™ùç8´vÜÚÆ…t>Æó,ÁO©;]½I—ƒåÀŸæë¯O4ÑŽÿ|‰fÑνÞí{vš‘ˆûõÀ™ÌàO`sïÆÜ‚3º±öÊöø‹Ëãõçãlˆùü„핬–°Nþ³YûmXgÍÛ¦¸h¦¯¨EÝQ¥‚Ѳ3ÊfšÄ\íÛrµhâzˆ2 ½s{„YöWìQÂM6Úך¹U›ÍÞ}ù&L¯B¼Ð,4t-–h.a‘ôòû¨ÞïÊän$ö@B0æ d ˜ÐD÷ýÉl™‚rfÇù,„g´&†Lt Ÿ¸z ß­áÏ@k ò%{œÄ1÷dÈ¥4hQíe ÜöaZwyÑ]T*DZZ?Yn¦ªÚÈ PzÂÚKu¨Åë-¤Hun Ö¦»^eæ-ßL’¨›®I$eµÂè±uAUá´ á>Âñ9„‘cæÅ”§ „Žçêí‰ü”Üoò,“~ŠGÊ÷áŠnyèÃwÆU̵þÀûê7ªQå€b¦*XÏfô¸Ó¶È·1ÍöEütËœ8¾@]×>#çÊ„Á’Ìý$l“5¿ß™ðYHZÉ'â#…ÌmÍbIA`,ÆQ…¸Î5 ùàI¶À¥MgÚÐ*ÍNïs×¢àŠ«…¤RŒ3è^wP§aÜ¡“06DÑÖ4hU鱘¿}#ŠÇ3¬Ûfþ%MÆ ²ai–t¸\ª©)€*é4 ÊÞóS”ƒÏ,=Z#¡‰9_*ÚÈÒw dÐ6.Ö¬d¶ìO¶D+ªã¿b8 %N¸„4o·B•ºl/Á1 S0‹ÓfZ.7]LÄÑf$PÍLÀž·ÐAJ!¾p]µœªÏ³í#¨b„ÄÚÀ0%3ÇÊɉqvÆwE{IsS®6œ‚caÀy«ìïòÔ0Ï›à’¨¼[u27ô‰†;g–û„ÞQ}EóïVïäÝzÕC, ¨~Õ²êÞ©ápä¯Yã ZÛõj -ï’A§wžª»!.;ñÝÊ’¹ sC%H…ÐàÙ#ŸXê•`írÿgöžn  ë¼,ä9ÚéÌ °³­Ü´’â…%WÙb ¨˜X +ɺ¥­žÃ ÂZƒpX- Ù¾ê°Á¶m Þàï¨4ç©(zŽ^VÉ"ÆÙÈ[L >ï-"Ä4j< üîdcô«f×}‡º$ø:þm|Ã_‹ßÕC]PÀL« ;°i×»B÷‹˜aÂî_.bìîeàr-¹×ÞsûÐï²å™/íÓ‡Ò¶•òŸ£TH£DÛ!°Íý+˜‡åøï¹o};lyK ¼˜w<¹‹y}”m¸°t§³ÐæEî!¼—KTªªeŸ’Cnw“yu¸Â Z)²NwVõ >… l•^Ü/fZËÔ·_º3ÚEg ]» P¯×¹¸.ÆîcC}b=—Eç8©‰J‹;}ÿ¯wôŒ7ÚC±3{GȆâß´J=óôÞꃚ$C·4)Õ,¯o|vqÌ’¹3×=»Kx*ñk@È>l¯Þ‹´<“ä«ÁâË[==s¢s]1™Èãj-¶UÇ‘Q'Á63Ec½ê–"Ã79´ÏEÅëý$éyâ”)¦7iGT©MÐQQ&¾%‘™ãQ8佣醯P¦ö4Ã&½~5»$mºö"«E@›L y8ÞRÕ5ÕYdE—'Þ\¾«aprÚÒ`ïU.¡Õ “¶9)4bþ¯s©‡ôø“®…f%Xbå|èí4s|¢÷KÅ¿J‘'ŸÅzîÕ?'¤™j 1žQ&žâOåÌ W ÔŽAµ‡`ZåÈJíêÕ·æ™?u¡ç³žÖaÎWmï»ÑꨟVÍå1GÛß’ÓbÍD4„H++rf=CùzG‰:(\ÔLÑ3< }r0VÚãH‹`¨J&½NœæÂŠü4átío÷-oZšW”(Z7õR²´ÍªPù…ÅØë}mš•Lš:õßBôß63¦ˆZÁüê.ASÆv²(@L@XNwóÏ-±2båMñc ” ßU¹IÛ±á\ÖÀ¡å¨?Þˆ¥¸O_<ÅÒ^!bæ­…2âg«t?• ÙžlѼèÄ¿½PÿYÀô6ZÞÀ:c„¹¡1µ9_&21ÄšBÀO§çq² F·ç<·Š|‰<ÔO±Jò4âùéÏ”s!æ§8ÍÖ›jÞµÕß.Dææéü|®D`H80@y=l¨–™Ý«rÛµž–t£i5öTÑgç’[È.r‘‰ ÉÃÿè>V‹ŽÎ¹Ò°XÃÓEL(,#'¦c‚ïõêH~Ðé¤Ü®a­!ïÔ=Bª’5_}’+Ÿ3ï…É^C+CS³×Ü>mS}½ýåó9œú ,ÙmW›0ÐK fSW.oƒä}ØÈ¹Š°ŠMHÃÃn•á{þÛLç V”Œ–nÚ)R <®>Ü&q¬X\1…ê’釳Dssø·n¬üÏ¡_n˜‘”ÆE=K+ (Î1bYn׃i'=m:­M`²g Ò UZ ðÅh5>¬€¢žÆ5yꮪÛerV‚œñ÷UŸ©·ñ_—†6$=™—;ž»”ÕœŠv×9p8¡¸BYm{#02K,DƒÖ¦’ËÄV'3¡ýùŒþ ŽmÿÝ[íáõoøí»\þÌ^,ÌšCðFoÚjBgÁÕ²žyQБOð¯! >àüçv^è–׈‡J#ËåtE B´ôµv'à/d=^pº|Ï™ Oãü;=` ¼”Šc?Œºä±É+C´¤žÐ¯Ë[fž·å ’kù>kgÕÉ¡´ÜÓóܯí§qÑÆê.ŸªoñI\Æ¥|U°¢‰…'÷~:¡Ï<—Z3áveš*Ðvóa?edC&õë ]¿ã•Ämí¹%hcôÅÞëÛÚB\#e@Ñ`£îeë]þ$â½À«D;r–›}ËÚU$cÙcÙdèaPÈåvŽå­6 2߯gR ”:”ù2$@FY‹s'Bûc÷äìUª…ɃuÒ2Ø—¹¢üú.¥–©7Õ@¸p“)ÿ€ü-æUóÍÉ"§‘>ºè3êbƒ«ò&Üb1(™nn¨^ sŸçJ2¢'ŠðÓƒP¾æ7‡ü:6¬> ß“åŸÞ t´RïÁ«ã¯H?Z„=V¡t¢Å¬<1_€)pOŒUÚT„â¿rLyšÝÞú-ÆöŠk¶í´Ì‚?E“ÇšÚ†6†"Ô¼:ýßiÊÆí¶D¥Çõmù~6fÀ°ÑZq‡®é]Œ²‡óC~6ÐÅ/E¡zÌzÞ6K P}ØÃ{èq‚çÑ¢•àŸfèÐÍa²ðq³±dPÌvÂæSÉüµ#\ óêù"›×&ñPÙ*.ÜÅ%uhUËòW_­ jä®Û‹)ä^çéÎ(0‚ŸÉ<åMÏå5Èu~æÎ%A›ªdü{À‹w:Âã?™Ë3cUXy¶bÎeðÝúAU»MYOÿÊ ·×?a¨â;&LjƒðqA*GLA«~ }BOÞÑɶ…äL‹Õ2î¥^€ÇýLIØTèü;±š´J›ÒëÊå†S#™eM„ÇÁÁ>è‹“Ê#@÷ !zçßJuƒz¢ö#œ `":}]B›j<$B{© ’™ #H•ÄÓ6ï¹ùp¿¡lG¿ˆGMFéW„O‰ܘzI3}‡î=˜%²:;TëŽ~Ä‹²ÒÔÎãØK´ñÙx:¬6Ê#Wen}ºèL9VHjÁ™ºÏj<ÖHYÁƒÄj%[)'ߨ›ÚÙ´ÉïH¸(¤xåðÒ‘R¡àUžÛ®Ó‡O”¯äàn}õ ;ôãƒ_"Îi1ÇLŒhkÃÕ>I÷ëp61U¨¹TŽÎ·#WNÂNÁŠ„ìð Ò£2k&²˜hàytaa^Ú¨:5.50±‰K°Ý¢˜¢βÎ['ñÃÍ~4·ÙØcmãX)çO†SÙzëÓ¸¿;[Ö|¸•WXÂ5œþ‡G$µýœwÃb» !$Vjh˜¼QXo7êÛgéæõD碥ÓbežQô×mqšÚ¨2°¢ÚgøA gÒÇèѰ4»Oàí{e¥ˆã ¬_õÚ*|ùªsïßeŠÎ!Ðü{.Yæ®fÛã¯"IË„hérÍÃøýå®Â¸©ÛŠÀD’"aÛ_ÏÛ|ÄÄù¼œô&!Ô ûnÈës郢VÔâ/5¯’ÐwØq1³Üõ{è?YÀ¬¨Ì·\}>yÖìº8åZP?EI)‰‘¶Ú@BÃRü,§ãå˜öÂçnݘÒ+Ï^M4Ø >ô÷ßVÁÞ»èg ÓeT—„¸P °’Ç)\tè¹B—®®*4‹"³§Á)-‘ŸÛëM‡¤n§<ˆÁžäþQ6W¬ ç²áá¨IP|†î¼†¹X»¼»k—CSQ¸û(¥¶R5Îʉ FV%–*ðl+h1¡…E­Äiµ¬AÉœ‰• e²c[x±¥C2[Î…Ð8iÓ´›ëñ$oð¿¶44§1¢å¾áwZd”?Sd8dŽ •;š8Á T%MJÚkH&_†4EƒRBÚ-å€î'W7ÏìÆ©ì>þO/Óû¸jÊ{‚dºê¹øg_Ÿü|Ò|b¼@[V k©3f… ‹Ó+qˆÕìɤÎÎ\SŠ••³«xFèJA>½ésã¹8šïµÙßçP`û2ýz…èø(8¬å±[eÉ¢1ÇÄÒ¡k÷%A¸C-ÉÉ» FÙm³©ABûl¶Ë¢EH²å ð¡¶-¡…LuÍ„÷L" Éþée;tò$ïÌ`¾ü¥àâÆ±&ò÷­\ ‹ÐC)(µ1YŒÏ&Ž|iƒ·^¨H6ŠÏ ég o„äÑvõ`ôPåõ£T¹-NôÍ.± ‹!OÞù20«P:5’sogÁ4wxšÄå’â-‡¼™žXFIŒîЄŸê;-[!ÂÖ_…õž»³Å¡uć#‹+æ:þeiOZÁiRNÆ®Ž!íŠ+ÍL+^JÇw-æÒ×J*ÀwŠëo­è d„rmF¦êçB‘wuƒáªÊ Ì.¹G°¹fEn<ßÛ)Ñ:Zis…ë2Sl97>ûŠ¿5Ý) RÑéBb«“æ_Evýχ“4àèuò%ÀJT¯?4Ëb§:Œ-MÊüˆ°5¢ãÊíØò‚Òbm ΢S4;I-jÌ#ß÷¼d €9$]íÔÏÁaèÅÝ÷G,†XÚßO‰ãU=ZnÂ[0€>Êöꀎ§àª&ãÈ,ŠwÜÓ)Ø|N^ʼy$@omb-—Ñæ ¦ eê§6GäB>­Róñ>êœ×³à`ÀËȰ3Qª;Ïxª‹>·7G+¯`ÙCŽWø•p@m8tܻŋåmCjõûw|ò€ÃÏ{y÷$bœÝ…‹çùsfÆ®Bá =dÂXpàɺñ*-ïjÓ Í (‡n‚[Éʉ 6dêD çò}møÉ6éq—·b®ïWDãiéíº†‚7r²[¬Þ€±AºÛ¯Ý¦‡—ÀKë[Dýž¹^Jö·–r²='Ì+N¼»…7;¾ëøÅúS›ûô©5Òüõ!rÔ]É®Ó`=ÑÂþÍ¡v$[Ã×­+Ò÷XÚa¥ÌÜ¿IùÎ!‡ŽhÆ(…gRýºòBΪ“QÄ¥^ÇoCÍ0²ø£ ¨§§¾DTâhXÊ`4//) ©¸R=ý’ä\†wÁ=”ˆs¨¥8q‡™ÔVÛƒ>‚{‡·..œì:¦Ì¾Ç08–]ÓåÏ ™ÙKýmq8QaCJ¬è•ØD«f©·Áßk púg•?Y§ðü-³ë/ŸÛ«Ž‘î® ý¯•p퇓4ÉÀåA¼3òàoX.Ö8™ÐÛO@íòü>Ÿ «Eßèýy”/õúÅ/bsù§~‚á-ÀGüŸÌ&p÷@RÍ÷ú¿œÄ¥;Ao“ ®ª¹DS¬ýà Ècí…jœ:.ÉÔ7*a jKä¹Cò‘G—+eà6ƒ3Sêbsm Aêªí{cpliýHÆV­!ÃÂú2î©àˆk¢_E²™…vA ¬¶=Z c-/-jÆ7èrb91‘Iüíñ»ï+“5 Þ”ê»Y—p戳Ԇ# dw,ƒj[ËççmS§&é-¹é±Ñ¤;yS¡ƒvûé¯ûÁSU}VêÎQï™çÖGÊðpl–%ÓËÈðñiþþ†.þEp<„gðfÈ-ýV]Nõ¢æ{†RÜ̇™KÔKá ëù²<;¥¤4󄤺{yUngElPžm¥´ú’lJ;öXÎ:`žTÏóêlϹ*Ó ©RÎýŽ÷t¢Õè§á>~;õýÇóÃws’e~§l•à_¡ºÙ5äB­tpSìç=JO!s‡X=>^ä}4JŠàÓc}\±ð+÷µpóùd–´À9ø½Þýð8»Äâ´üsS)¼) 'sô>¢­Ô® ŽYeV ÆÙCÛg>dÏþˆ¾LY_ðêߺÛã§»¤}{tã# zd" ¡¶´×G™¿ç‰ k¬Heõ¨ùÒx/…®L^×É_Zn@ß„Mtõ3z&G'h¤ŒHÔeÔ·§xÖ#7¢q5ŸïUôñï¯tiÝ[ŸÚ"Å×5óÍÙ”»eý¤z3/ÛôÂnÁpÄLiSˆ3f©éåÂïd䑀Øé‘¿/Üþ«sd˘ nŸÕëÌq_/oÍ/¯nJ·m%l¿³¡¡Ž‘#m»«&á».‚œþ±Ó…bpò1Kv$/ õ÷qëÊZ°ÿˆ½[ËËŽ»9vøÉä‹nWz Á›¦ýóêÐ~‘ýŽá± 4°?êûyp‚ý¶ðÞšu†x¸a±Ò$äQCdû¾\|„þƧµÐöPŒ¹¯E”ÚjW™‡ëð÷V|ÁON©{ÿGÖ˜Ýð[W©X~ü»÷*æê œ)ð?r¬gÏU2¡àn ëyõ¹–Ç,ºõy>߃ۺ·yCW„Ò€ ü¿¿Dú ŽúõÏ ^^¹KÐÖ ]ÖÈwDþñ½;düÅ=¿ùúïÝã­Eör¯ÄÿïÜÇ·+Ó–…ǦT!GÛ4ôéÀˆ¿™’aߘ½õ ¨–ôùAÇ&d’=¬}±¬|KÛîÉFÌÇþýp>›ßQªÒýÙu_8åó{„þ!€í‚÷ð”#Ñé~•6"©ûuDÊ¡è‚OÙàµOÉý?W.ž/5wö·]þ¾@aÑÛe±Û:“‚0³3Jaoòâÿ!]É­àTt‡–{ár—-å®ôuËoTõ 7ê¹&{‘/ÕïéòYëª׬¨£SVuP§éÜࡌãym¢=V4BJì@ú¬œÉ—Þéʳrd›ÆC&Ûƒ;„ŒWaH?Ÿƒ~ex©wŒƒÖGeŽãfu_ü:ˆ•Ù`Âx&:Š».k ÞµæP`t:~žÜ¹þ÷)ÒEEl;Ñ¢XºC¯àŸãªüS¤á= VpÚq¯Ø·ê_˜œê3#¡<~þó¡zoˆvkòeˆwûî亢ßàAíž¾Ü×é!xl!Hq6é_¢¶èí}œt¿-ßë«Aƒ£¹™vRc/2â+ ØR·ÐéöÄ ó„Ÿ?”.}åÌìÝþí>V¸m]ŸË¯‘Ò3€[KegÑRتê5-Oƒøuïˆ*‚ž0q*]UQ’ÿVPƒ9&ŸL‡^Rójøô$n'ß²oØQš"Q@J€åÕQôˆ°®9_,¶æä€1þl`ÏAû‘4Ó/gqµ¯·Îl"ªƒVºëù­«Õ_kK°}Ü)-m(1T¾lBLž@ ÍÕg±¹M橚P“¨…´\òë³'8?µ Þ"<;`¨$-¹v`,kô@| ‹Cç,” ª†½'¦­Yñ>]¶4ÄOAä-™ ÑpZƒ`$)UÄ7Ý—.L«ôM¿›Ê!ïùϽ–¬ ­ŒãŸ½¼‚*!fXG£@ȵËÊfLǧ$¹0¢õØÿ.GñfÈ@ÌPm ²@ߊ|[D2̹ì…jݤê¦ðšiÎ’(Šôcô æ$ˆøÉ49µ_U•ïWç#Fªóh¡3uý%Ѱö<-G0ö ‚ü üùå§¼þùÑîŒÕ¡O1ùt ­²vOñŸûƒÜiébÓP3§ºW±XÂúö–Ìë‘ ß/u‹·ßðé±³îÇ;¸<±Ë×¶€õlùO™½hâ%†K{3xaÿ Ã0§a«—šÔÔl4bq…vë™ä‚yâ(©:’qY0MâÔCDº{%<œŽ4øšã‡A&<ŒMyy^½>¥âó•fÏN8¶fBMCú¢·I«çCF #Z¤1÷™¯ÐY×]¹öù¤E55`F’¼rk--„ÉDÔ³!R.zË‚hÖƒ8&mèDüÜÖÝlߪ6M§Í<ãÉßÄ„ï”p²¨®o°Ut2ªI7eڰȸ—.»ˆÚ j89Y¨F Œfñ¼í FѶ¯Ôg¼ðª&g'~£ÝyÃ,nis9' J“¬\ñþÔ‚‰3µ}7Ô ¨‚G#æ£î¤ÿnz°Ž?GéŽÜ$û÷¢aˆã@[R6þÍýLJi‰s“_ ˆ;¢½g¤#—ïA“CxûT¹lSÀÙÀ„ @ú4Y_azC},±ÐiG€µfâ£a>ætyÖNÕ PLqN“ˆ(”O›¶¿÷èî€C1í£ ¼òUíJ´uËš¶ËåVs×FÇÿˆ€¤;QÅ_±ôÌûëðHýþ¬†íwì<ŒÝRp'ÃŒÞ yóó8®–†$Äg*7}yÇ2rn[‹ÛnÿYdˆ{ƒ˜¡A ?•ïًõyq»¹é !¹Žà¼óV°“ϾòîН”ÚØþš# à9I,(@ t'`8qÁ®úćífOæ5©Œž½¤Æ},¾D Ïv­„= 0ÄLâ±^aÏpö“Ø_|Î0z‘CÅe¶ò[¹Ë„ ú] à®Ù‡á©ˆÙ<›ÚÎÕŽ Š‘µJiý”­qsóÔ+WˆL–»K4žޱà`¯ÚÁf|bx³sä]6€O÷o¤¶G5+™Û9VÈeÉ7¿ÞP Ûaãc¸á07C„@;¹QÝz•C©‡Á{¸Ö:ÊKŽˆÄÝ¥lä’S&1¬Cܼ×òàéÔÁj.RhòÇ)é1æãȉ;©!ʱCº:ë¤Z1ÅUìo–èHi¾Ôö.lÆáÞsѨÍWW‹¥²kºŒ ^¸á¼º@ý•öå@ g)ª: ·´£ex‡¨0! K¦ïÝø¿ìõí7gËXþ|©>þêÍÚé¢'ÃÏ.‹PîÈÆixúFLAˆå\Ôí þV’%íø‹Âj 1ì¨%´WoßVú£õOPõAJM‡W—FW\(F:äÝÂâ"ðsÊÂúü䯨Ÿ\ò$¦äé{ÌsÎÒ^N%¼”aö ôÏ–¹_àÀ±è²îpa-hóè>RD¶ È÷A–—íŽ)·¸³WÜ£­à«~[´%Z¸—ËÉÅÎq3<¸+nS^¾ ~K?Hìa²}oôx¡ ‘$úˆá;ìð†`1MÒîïns}Ücí„lb¢·RÝ(·Õd¸ð™Qµóñ‘€†=d9ÂZù&ÜMHòÀk Œ3PAw/>!s²…æèB1ZÎÕç¯dMvoGN¶³â=fu~úzB;DÆ ¤,Ê…Zut*>SBÀúðÄ¢wÍæŒ;€Q9?/ùbȬ°>ç‘ rߣĦe¶”Ë3¡Áئ{ˆOB™.BC¬z÷ži=Hâ*ágFŸå+¤<¼»ôÉá(M[È l#J]ôp%–ؘ.bÿú´ŠA¥Š­Ê$îq ]ÔúÓõˆi¸Ä÷ù%qô¸¢æ+!2–ÞÑmæØSN£±ÀSz2‹Õ¾[7±¢a×^~\2º`|R u·ìQñGN‚,1ú`ÂŽÎ-˘L·Ás<ÆßB7ELìýX—½Ùë¨Òd&ÅizýäG¢¤Õû"J@·³”ÞDK4*¿¬6iɆ¸³æÓ€Ôé«CtÆÔèA7ª§˜gÈ}—f„Íùó‡Àõ¯îŠ_.’ÍTKŒÕÊõÏ®ëu÷‚¢ùpÅýP=<Ýåjå)MƒËÒjP8=_uRÄ©iõÃeºèòÏ™·F¡õáË=€¤’ÏÕï CwV5r¥¿råõÆ× Û¤‡ý°ÙK¯‹Á¹dh+òLç.`Ó£ÍüÃ_Œ¦¿›zfsXìºÎËly¿§Uw ðwÞ_sµ/ý9ïRJ¡ŽÁkxà½y­Jn4ÛÙ±$«hqò» §ß™8 »+_ä•Io¬T[¢  µvmżâ /•¬¸æ¾#ú ŽüŠ507"òy ïÇÛ2º[—*ªœ©9Tåk½ú–ÒÏ_d,ƒn*Á? 5K:&(ÖMÛ”ex=ž¤$yðð‡r4QêlX‚zRÝìq‹æ_ŸF//ˆÎ­Ú²,7å–™á=˜³Ëpd‹DY€ÀVÔ€–æŠÂyxìZ’ì_®Jsà„†,H}o«9‘h!â(HmÄoÑ-Áë.àvz@®¦6¯!í—Ò³,н˾Ÿ“‘ ›×³îÿ~»Zúù i•vfÑäžž Íõ*!Of ååµwÑ’%v¸ØRÒªYJsj½à®µ¢ÒÇåËŸ ^þ$vðÖ¦¨`_?Ѐp¾ïÎ.­b¿M¯ƒ&gÉð[GÖý3cùLÍ vÍ©zA?‰ŽÃ²ÉæÒ #fýC) \Dò§#[!þ_ª£é•B§yõçî\à 6¬¨¨èvx¤l´ßSðøƒ MãˆPâÄ@×h­Œ‘.œçNhl”Š^•vÕŒ³/Œ€¶bY‘×´n4MÓAïþÇxÛ„áÒU00)Ù¶ÿ÷rµ«tÝ^èµT¨üÙ€+… ™¶‘6pºÄv‘hå ¯ö-'«Ç~¤¥Â¥ï |49Qô6JÝ*5O!d_ÓªH(H€ÑÉn 7+’š6·4Û{«@±`Ä¢! „ P6 ¾Â.<’í&;ICÒÄ^(íu§²[µÆ2›RäÙ‘Kø¢; =áT 6ÈW«ÛÊ;qWäð ×£~6l%>n9Úg©žš‰‡ø2CÑ– .2lruÒ­b°æ†‘ˆ©±‡:G‚fT>S„ãç±i'½OI`I‹¸wí§¬¶Ì&À³ªb<9#%ÌE¯A7×x™F«ñx‡ôpó›èêÑ6ó‹¥v-VQ–<´gf$ë’›Û.Èáì˜|ÇÝ“ÓÊ‹Yýø‘—nÞ…_¦×·+Ù0§ÐÖy×ÃѦ&ÊSù¾j<×[“Eµ¿GR´»´¨§„cͪ¦™Û“c¿_Ql]sëÒE˜]i’P&I0»ä!úñôgLVÇ߀]ôE” ¥ˆ­3©YdŸÃtWPtDz…:ræù9t»~kQr˜ßz7¾­£B›îAÝrË\'Éá9ÿy¯ºk»œ¢r œ÷‰…®yÙ1y1Æ \°—D²?uj.­±r¦ŽiÈwqû ^ù¥^çû.ÎF"ŒÍݱùiyöŠ$¬ÖîK]æîàGeO¸RPÙ®ò˜ûÄ‘C¢ùþN^±ç„kèbNéPkœìUg£soØ n‡5’åŽÛš"Q:5é0'úw%¾m*¬`;äÑ—B]|lvL2 ¸vÛþÑ)µ š†r? Y¬Vy’ÞÂPÀ$@ãî;GTü<äÙö»ç)2…Q dWÌcÛÎOfž÷"à ªµ¦?85Bd¿°¾«G>^dê,CÙó†ûî•cH¶°GV¿Þë1E—Zo@f&ÿ&$+Œßfn˜eP'•wOG(ÛÛ\-O}]‰ï3B3%Ë®TËß’ºç¿¶ÒõßRi¡{VÃç ˜Üßõ3(C Î,Qçú‰õkˆ¨s|ÚŸ-RwD>ùùOÏ]f£òøXLšx[ Ÿg%kR‡²1+Ü"’ËÒ¤KqD·Î W8LÌD¸·ÚC>€}Bõ¤ìXuýUTBÝ2:¢#žÝ²‹Lúd¡kiJ#?¿-fDºlµ.ÿœx.™É¸ó±-PA8D¸þ±t¿ºeõÉ7ùCÐUϸŒ?R+> +6óöyˆ.G¯’  û|«j`CàµÙñ%g‚·5+[ggøW—JÓC,éˆ%Þ'$' .YUÆ¢SEÕdL;âŸe× ê?ŽBóEeí:ç-ÿ’¡lž0}ÂîV hx–µ²óÛ›w ®°”©ÀLoxç/%Õ}þR‹!D(›ñ¹fn½¼öòȈzÜ ‘`é ÚPé¤"’‡óôyÆ(r*×öéÑB? ¯¿_^ÉÌtÑB&-?²ˆIÊâ¥0ƒþcÏ~ÊóPïÓÞàz;‚ÜîUÕ·Çúÿ;9GŒJÑ䛵¨NaèîðDþ£`ZT kÁŒKÕH do÷«€„cH!ˆvDœæÅƒz‰åÔêobTÏ™m¡’«„e®Zá0„¡oF×AüåÎóJœlö£JÂÌ…ã.×:’° BÙ©*æœÚzOáÊ>ei̲ŒKï÷üŒ^zå~““Qþ- Í ·ënuý+ÉD+ u±KØù3˜Pk2é¨9äàJçâ×qr—‡Ép7¯)¡›yÜ¢–:†Õ0?%_Â:¦õœ—¢­”æ†7äDŸi‰+0;0•e.ßIC2V„ð:—Uàæçl²a‘@ŽöøýòE†×(ĺUäè¥u[5%h€£-È"©Y«…õeúÙØˆ†’݇IïKÈâfÿ®»£-‰e Uyà®ÜÍ&B=©®L̃ÁeÙÐHà·<Ç’nÕ ™Šªò.ÖŒõ’€ÌPäÐi1óC8ôË[›ë4³M ÍY%CWØ`0o#e¿­‘Kmêàûª²Æ’1jFs×å¦þ®Ïša^Ó xìÞE-é>'Îm F¢³64š•"€÷6÷&¸Ô;I†äÁÙŠ]'Þ›<—G]c™ƒÒ(²;" #«ºjt„¨j$y Ñ%;¯&7ØVbŽÒC…ZÁ±X è×VÓE¨û-¯Ðïß{ûèD–tü ¢§…¢ÁͰÈW¾SVwh.‰‚{†cÀ%ä–WW4ÅÚq&óå²i˜cãӟ‘Ó¥éµÅ§<Ó³m‚Ýdk qÔ\Þ)ÓUg=xGÊe›&*¬eoŸ ¸8îÆ&`¾à·º£Ö¬lQfz$äÄ—Ïgo{IÚfn Cf‘iYÚyOÇO\ÉV2y™­ ãwjif9H²Œ1‚±xz,Æ0ٴ⺎ACaø!«8t"(Z5þÁ_ Áxsžý°"£˜†“UWSÔ\68yžê¸ËhíRófZ‰E=G‚‰Ûl‹ €l¬O¨– ¬©¦‰GY‡‹™®Ñì×cH2JOÖúx!Øþr–ùl»uˇ”® ›½¹^@kˆÌ8;?¿ñum_ÙžÖ!‚$͘3Ü_}î-Ân$¹òî¹à¹=(âÍô8Ý6r¯¥ã ú~d¼ 3Öm[!l“~<¯ Øš|%¥æòbuaVÝaÓXÍW‡“>Ï/vÚf}bÄ>­«sU€[«V”dGØÝO©ˆi6£# õè»â­‚Ü(Í8p}óÓÕ3"0lÓ…ÇY3‘…ƹ@IÉ(eïË!ÐÕ&êuº—‰ˆQˆvT·qJÏ‹/(q×n9ëÔœx`€™±.¸0Ò1ËKƒéÝ·†MC³~Q½hÕ…o™K]V„ XHz9O:Iû 9aÆÎÅ]†ã®É#”nï.=kÊŠÚÏ ÚH”é•‹ ´[RCÇA¥‰7y WýŒóèkÐæ–¾cÜ[oìNYl)BX=y~U‚ð*;ZQè¤ I³Œ³CsR±ïœÁv„A€NÁ!ö¾²¡UBbÕãdãÈ·õ*Fƒà{Û5K>dÕ˜«î gC_4¶f8 —–hÞ Ú¤ šàqŽˆ0œ•qÞÞ§˜†Übþ+ \½eµcn Ñ û 1À ë|EöOÏbIcÊá;ÁY(¶%ÞËL™b‚?Ö2éÙÁ+G\iʳ¢è@«j]ÅöË^Úu\$ÍwúE%*†âwƒ^<Ô÷‡fÝ«½iéÙÁÔí/à®u>‡_‘Ð×½LiC_Nĉ‚–øø&<`râ8ˆÍäcÁ!d©°Å‚©RøÓÓ×i§J5ÜøoÏ—’)óü#•ç~™L$^çëNý@tóÌàœiàóØ~¬>ÃñîÈYÒÜ­z±Û#o Ëé!«¿oæÈrkxèÎ31¸œ©ŸíF«Ï¾ð’c±2QU6|tŠéÛsS± q·bÞ¶6¤i¨Æ¦±sv¥íR|«Èý•»åqoÑ®ÏdŽ”=‹Ó RiªH r.ãÒ®zPÐØ%÷‘¿#é²¢[ö` é½ ÎÖŸG¯@ ’ö±,ã–©g&›`Àõæú~ìMÜR$ ª4…yJ‘ãOô&¡rHC'?ÌÍœ«t¿Âz=çŠã8>Rutº¥ê‚¨w¼œùæ4fækËL¼º§)Ó;Ú»=J“¹o¨]8§®ä]~‰ìŠ7%…4u(¤^$Ïi¯;°¤/¿©‡i~K‹´ÅO‹+Fž÷,~R–()‹)£¼Ã¢“¢$•:œìÎ|0{ñŽ [JdÝP_wÕM©³Ãec¸©³ÒN®9e±~uóÍO›Ó.€´ò>_ˆk§%/i%cT¬Zë¡g3jsíÌaœëžûQ×UÀôn“òú§Ks½7»7Bl~q9)GâNµ£=áPž0LØ”*¡½æjP”Ï>|¡’0¥*3è>?žì÷á0" ÓzŽ/µ è5€¨€€ÍÂwâýrRôÝ E$ü l&­ÀÀ¡U«´ÉÊôI9‘Hí• åD?œ´ª²ë„)%¾{EÒÍm«bªŒ´qð®ß‰¿?5¬èO¦atš8ï­’¡ê°cメµfÊpçög)W‡YGdB²Hï~ÿ~ҤȼA{̳ØY†âèááœ!xækz¤ññÐì~«å+Æ7‚ ¦OZ¤àÓL·qé5¼Ûñ¡kZ©{tÊU;Lu*~(å¾[ +e˜ˆ(ÿ…rÒﬥØ(RègwN–©6ãXoÀ?íÁPÕ˜š2ß.…ÐZ‹Ó‹N¨Þ-°Ã.T“F‚:WÍ'*¬k©ÁZsúÒRþÄ; K­Ä£ ݯ@3|xj |ú›JgÈYóærû© ‚d´¬Ð t€-µ úô?'n½#`´ËÈ§Ž…ŒAŸs-¥ù·²³²‡­ÎY½˜¡õ#Â@7þéÂ@­AX#ɘÑÕÑ …¤—ØU&ÞL,¨ɗwWDM Ïhªë4GœÐM”K°Udpþòx瞣´¡®H;÷®b8íw†¬ÓŒ¢ZÝ÷Ý>:íÒšOœ™¸q¶sXNÃû„pŠ?¾uÒiXA,œ Ð;áÙÀ@ð1üæQò7›¢u æÿ†NZpª·ã±1èØúeA$Y¯QáÔSõ³ˆAqÊ%ðW:tŠqÂr•#ÁšIëxQ>°0¥€3”\<$pä1¥·îëí—W†ës@m_ó'ÜöFCÛ•îØ€$…+-YΚX¸Î̘ UW8º:ù{º2nÂ%ˆœáV—ƒ c¿MNâ°Ç¼j{È2œ¡ÅÊ„Œ 'uâ¹Xèyz«éÙÞ’î‡û(~@þ?¯ŽúxkéѬ@a—®¯äag)ð”¾p¦~Ì«Õ'»#ÖÑ´ûU‹ÈÑÇ‚I»ØoùHv4“ $A…}Ôæ,úÕ<Á“t]ÈhýwÏ“è+¦ æY:Ÿir¤ 茢b÷ãØ`´Kªðæß~¬bÏ’ëÄX"¢(ùI}îi–jÊfPo^ˆ:Ñ¿BišÚ,/Ï÷n‘t6ºO†XõMHç†å ˆïòÆr@×Gƒ>M6²Ð¨¾Ñ‡Èþ&«èc¤®1ȺM×ë\bq ~žn,>ܳË¢äíŠ8•¶êüš|³È¤Q°1ÓT0M™”òGéþ\Ëú6Žõùf«_~¯tyµº,y[„Ò©A?Ü.eyRA‰ò.«à;6ÆþN ÄÄø¥N£|Ô:?,ÖŒ>.äá%$ÚÐ!bƒŽâ oçæºŒí•EQÎ4FêE©ëº+¦(­°LÆw¾;™"VNE$5HÄÊFAÊ0«Ëà›œµ,Bµû¥OO­Åi÷¯ÞRG®5‹§ {’s@ßž,õÄ[—-´áàØù ÓvZît;­Ë²GaâŠ>5§<4Û©{cÇ Ý¹o–i»ŸÐz‹Q~u‰j+×]z¦3\Ò5|£ÉKÍúóM»Fá #ˆÄ;Uÿl£h0̲ȇ©÷û•Ù+—¥C\@zqÁ!‡¼6äƒ[VZ% sËôÄüÌ­ܾP¯l–Ù´i¤N~Lº:—tÞâÊ3 ) ¸CŽrjßËv*«À»Ç C,4)æÖÏðqÇ»;SJ «’ ÿ=D†`¹Ñ­Og *ÍÌ©´5h5=>PЖt×¾òjò¨ø1÷ †0 Šô#7Õÿ]ЕÏ69Ñ_D[êÜÕæŠÇ\;ôòÇ>›n̯¢T—û;¥qFDo‘g½€¿(â9iÆÊ°ê!=úhEM[UÍOt媤 L÷#¤Þ–ÍVß[°è¥pdÆ¢ÝúÉÑËI¦*º¶þ#‘9>³Ï&Kì–‹ºØÇ/1;ŠîÓñØ´hš—sék™& ƒIÞÏ€õ”è§©­Øáº¤÷~ZÊjªrcÇ‘hì“ãì5ü|Ö×—u¯rî²!øFS¬Â«.–OžË&æt¶¬¨üÿ¯#²?º2™o¡ §_%Å|vQÉiüÈzö‘¼ëîÛs©ªZP(9,Ajó&%ia«ýïWÎá0HL/¡gËQ²¿eq›Š°dB4Îe¨SpœYÕŠ¡¾~c6˹ [4y…»w‘llò¥’÷ßÕËž>b„a ±CIeÍ™P̃‚‹& UÛψxRÜ4ì‘<ú´yå}Ô[#oQl^Õ¡>p3±=¼8Ùw£b.{zœ¬Üº\p9@‹š>Fa9d19ÓTf8šT*þ‡Î/º`hRjzTç}Ý.ÜúQÉNÓd>éw÷ £ôf8$o'€ !dÔEù§ÜÂ4ŸRDkãí(ª‰×,ñ„OÒ7Ø´è…î~¾…-gktÇí…\R«Vz “aNJíˆl'ñ:0M—×±fpAÈOß#my&EŸ‡ßívè°¶o À(ö~È7/’9/‚œ£#àViòt }ùyúÚ ßœ=V÷|s[ÔÝ‹cLÜ0¹Z×ÄxqZ\°ƒ‰šç•” ¨\¨<Ÿ ÔP,â¹ÇŽÛMG¿IÕf#‹• ìI½Xg~„³Èc3æ*ñ§ƒ ³ýö:€þ¦Ñ:³=œ÷ÄpÔ7ZöGÅ3¬|,˜î]¤IógQó 42t,§ °¾×)º¼µw[³’Y%9›ãeÕ5„K•Í’#]Ž‚±rÈ#o“\ÖòJo¨vECªàH…HkèQ±Å3ð²o:›6ú¢º )"å žs‡þê0uÿÍʳ˜]y¨¨G"îHäRC±º¬¾á×÷èIì¸Óö>>/´(t†S!å䔞bûty]{y¤ã.™¾ju*÷] “´œù DͯW"h|[1(¡±‚Å¡¥õó|°– 6éé ’{©ÁçÀ—³ÍHÏAãNbS²ØŒl2¬êÐVÇNŒÝÐBFÈHZ  +9­À]ºp‘bsÇ:ÇW[IëÉí>gÁÕ;mÄ¡k?,)prL™‚DŒiWtuq`^œ:š Å[«@ÕÀÝ‘ÿR¨xó3OÆúס?O›òEM¤¨<†©r–IÀÀTw2Zë Yu¤Ä’ôšÌ Ý»ÅX4þ^ÙCfZÐf´£vFÈoºë"꺳Eâ[iÖD~) 7+_µ¥MlûÌÉDHjA7Òt6 æÅ†ŒJãR\Ðgç Q#=T[ w¥szÅ7ü «Mn"UXô7²v< |æÉzoKV” 0L”ÛçÑóפ9=æt˜®üª æjùä’–â pîvG\`€´/Ï¡.gÓ`b«Œ‹Ó¾\ù±^©Ã‹Wégf^fP²ÔÅÝCǬë-Îîu½-~y“C'&XøÎv|Y²;R«€«˜ˆ¶¨Å`Ȧ• ÿP.dîv{T6U´ÜtºÃGS#û”£`™= ó,+NËjw°üïÉ’¤a9ùNa£_¶ÞÞìtn£XaßK`'™Œ‡É]Dém Îm³kvÝË‹ƒª½iÕU=ãô&dáÃÕIËâÞëcøS{«ƒºÿXÊ1®"|õÉ 4Ö±›5±J3»7é3SöÐCëÛ*D° õ@*:›X,?—© â‚ ˆ•‹5,Þ ²,„ãrÝ›ú¾ØÑܦèt¹ëú­Áʲxk6½÷%h‡\žã©¦:Wä£g¬©5ƒSZ>^ñ¢ª²l CPÖ"öË_'WÂ*ºÂG^ºô†‡FŽMÍÍs#Ìÿuh*@‚\üigX¿l8GúøOÊ7KÂI¥Ãmžv:¦*……_Bp]Ýõyó{í %˜M$©*¬Yð»W&ںȸUê"¼0€É@]æ‚H拵.bˆuá^:ƒ}iç¯'_>ÚÔQÂÕ †ýÇ߀ãßÍÙénIq§ Y«Ë¤UèMxy{s “FÆ­£É×ဘc¿×uésÇÕ’ÐH1dw‡~BøxÙr†Û‹{“-d!]3ÁHä@ÄoN’ºL™ˆh÷öi¾LiãĆËSš FÅfDVrNÅ£WVB[Ÿà쇙ÆädGÀ͸vQ³¸Š¼¤< ìÃ`0Ý eÎ4ü‰«ü¹€Œ×J8m$ÊB€@CÎU))A3¢6„ƒ›SD’ñP Oãî£NÜß }&È™‘˜Z&^yŠvµ¢+’Îó êÑÙȶ›·úë§b‡•Êr,ÿ±ª«r –K¶ +§Ç8ì ר ™T¿@ \Ý¢™7Öçi¨º¤ô+ôqpؤmí’‚ܾqŽ„Pù­ÞVØ ŒÙÕ‹J,bMùðtæÅ:vQ EtÑ=¡<Ý lß‚š`d†¦Æ‡5:4ñ‚ä\®ÉÔSƒ<;Ïç.'˜ÕùoBùrÞy "WT¯årsÎBi‰,ߪË4F}‚W®[â¡XÍ ¯oš¨ÒVÞv؆{B]p`0Õ 6±¿½³ „¸Ko½kfBu„á£ìª.¤¬œï=ß“äH,3–q¹»ÔExŸ™ƒ/`û]Š}øN WcõºÛÂÎl€ÃjS€™PJ>ÇÉ@¬žt”™v­`íÆA¿Ú¡7·óI)ÊY=L°ÏN5€@­.~c2¨_¾Ø:b•I$é6?aäà Cí•g§P5yâúq§8ý ;39l¸;&ê—›[)/]Ï0WÄBoG’hDºÑ¸ÁO¥róTæH;Å¥§:ÄK*ú8 FŽ—^›ºwn×òò´3p‡»ì¿Œ«pJOY/[³,”"r5‚R±aÁ_uˆì;ÒU7„ýÉ«ÂçIeÉBƒa‘ÁüÊf@Ÿ@'Pñ߆¨4áº9$S‘2MÊFÊÿHòÌI [C?¯_EUŠu<nÜñÔ´|­»n£¡‰:“QƒÐµzö6ßîSÀ-†1ÀN6ÿa˜/ —/éag6à­ tªvå'ÈP7õuè—yüÓÜo :SI«D‹‘Ê‚ntÐQ5 « DAmòaI¬(̃еLßžª©T8 W’›[¢êåâ÷ Ÿ¦–Ëw·ôÕàXCŒ€ú°¦QZò^}pC!!Elµ’pXú@)¸gÊŸ¬j£vå{H•øÜ§<¨« ‚ ¨gsÎhºI¦{|Že±"› =W„c“‹aŽÈ÷@êeUŠn“<ßâŠXaòä,_·CDø†×P¥ –1¹9Õ­EB¢cÒ u¢¤†x€»ªRÂ~«©Ep@©–aáP\Ñ3?e©ígéOð¨/GR #dDÈ»†-ô á%ëQñÒ´¢£NÒæ´(—Û¥èüégGRby èl#ŸõÙ¶65ÁØvúê/iÏ<¡‚Œ<ô8šÒM¨P¨sõQ‡±9¬moŠÊ $ p;æ®m„v³?W²7ÓGëd{OY^'to|µ{¨Í·)ÉWõxÝw¢íÁ1¾’ƒ§°á_q£›§Yë†Û³y=A‡–`z¥~¬ ¾‘Qø˜€æ Fo°rЗ.2;±˜¿úбd.ÏÅË”=öQÛ{0|·ÚP1È2Õ£xá «ÚaS™‰ÄæNCë$ÆÉ;=r¤,ÄÙ¾,­òs<”.›u?ÔvY¥¨hofùDH(ß-ð›&°"Óª×Ñ[ó`ÔPÞ’'t(RäQ¡a p“Õ´1aY§.ºzAèð¼‘èþ%U½gMÍyûsƒ«çm~GPµ‰¥_»>©¢™· &û ~K!'0‚we¢#· 5jIËa1:ᇣ¿Ò÷×É(§•S:"t!ÃÑ¿6®äN!£@Ô$®Ü•]¼7mÃÈž+”jëÎfÖ‡¦Ÿ¦o|ò–¹Á”OYd™Ï3·Õ3X0\‰#©ó{KúK1“ê›b‡!Á:|­®Ó&*Ô͹gÓûåm3þ-¤Ü Å›³EŸe À)óЃËñ!=íõvìTȵJÇ„Hˆ©ùGnå4DE!Óå»´E‰» 8(éäk~¾~ñœI¿«+rS©˜+”?SÛ’ŽÜ@L“È”øü5‚Žzšú@Œw¤£OhM_ŽŠp4¢Û)AÇ×ð=žc†ØÔb]fW˜ä—`ýRFh›]@‡&®)Æx¶ÊçC«ö ‹%gú.3LjóÏìÖyT¾^iR £mV ûõ3Ê&ÒBsÍf+_#T;\–¬µf5w‰\¤I&£.»";Îj]Þsv†«·,áLRwž1j””H‰ mOšéŸêÙ~yþòóøë•ö$…=X<÷‹Y=i Ô´t<úÝ–EîL_•®$ø4e%/' ¼ò÷é’Ò:\ ¦râ€\êÆ>É¥up9ß›êÓ£'n+å8È‘} ²¦âÁÛAI5èQÔ@³ˆØØÆÀrÝó´¸OŠUË¢ÑXÑ,pÖ>œl77†Ñ²Öü… ØÕ‹*=O üÞ=!du*&(¤ôöÆ•¢x8ªgæÝz³ÑÎ/ÍV?“!ÏähÚ:ui÷ž+‹‹=~ÉŪ,7m-h½Azð¬F…Üg¤ÌœW9ôy;A‰T£Öf O)˜ãÖXË” öþ=ƒ Ÿ—fŽªÈ>ø=ß+i9zrà0Òc£t‰"cy–.ôbÀA² «@Jr6ÇŽsî i©ö`wið'Tä·o gOœ†Ô;$` ¦©Orä3cNè‘+3ÿz+Sµ‰ˆã¡l]a&’uÑ!ú׋»wEÝÓu¥•v‡À\{ÇQÙ_'¥È;D § ‘Øî#¡ÔÛ„[z§V¼È@§·a¸¹89XzýÑ)låU>³ì ¶IZ:¿¾açê€mšâ@ ÎþY¨˜ôÖcñKX÷^²Ej[YñÒ!1Ùõ®Äã*¹(c/êËþB€è\ª‰Æ‡ ÅÚ%ß žÍJSNM0ä$JíÓ5ô˜÷ëPrÜYr&ÎU“úÑQ 0gÆ)öYó™(e\¦ýøMéçñ/óᶘÍS3ß‹'ugÞNÒV‰WqõÍ#åä@;µ¾+oFIÈ©ç¨G –)›xÖÓ8ôwcæî4ƒ$þbïL̘¥öð¥fgC,‹0NºÚˆÏ¼Jd¹õߤŸûWPîËs»Ëºa)ë»Á{ ãØµ o6üG{’ãTtðûïR÷)#öÁ^“^:ó¦`wR‰‹c¤ŠãšîðÄ ­Á‡dªÉÝûë¯ÄÒœõo(ÓV)ঙwmɇž)ˆš’AY•ç×f—YÃ,õ#ôgGMRFàµöbÚ{¶O0–}¶þfóÉW½sX©@eihuOw3eq¼#t\M2#ØÓáƒ/Ï~sØ›ê#ˆZ/ðÆž^KuÖ«|15öŠÉ‹BÁ޼&?–ÂNsä;ˆ#}Ðá¨j¬·m–ðO>tî?ýBÅ+7¾€<"ïÙ³:Ùq±nÅÐCŠÃö¾ã°+bE„cÁzâ˜ãòFÌ£Eqr‹/öiuéÕ½ ½£…h©õc‹ÔÚ6ÌÔön^~i`²‡ªø}Æ%Š hÆ-‹½ìò@*'©µÇR¿5ya‡ãIça¤¹³ü%×£rÂd p`Щ‰Aïšw€Vo*nq¢ÂyЈof’N¨_Æ»sð»ms‘’@pÌC{¶›©CZÇ“óÆTAäz­éÎÿy«5ÌIo,Âlëi"¢Ø‚ ‡A×Ey 0=ìpšÁí°)™#?fGƒÏzjå©L¾W4¨ ˆWzŽyGrUáêT“ißú_<úmOƒ~‘\·‚$=²œ¸gO—°²‹ÜN5ê;o¯Ž£±èOEQ>º˜ð.º¬ÚN#\B £ƒ. ¾¾–a&ÂÓ¨5>«¿Æ€ÜfjÝÙËl¼æ)ösk1ÞP_„Ѿ¼þ·:dƒ˜Òä3鸲‘â³ÉÞim°Hj¯åö1&õØ–ñßÒàÎZýZ^zD¿fXfLiT-z¿àÿ^ üÅù·+ë`H–â˜;Ƕ×'· &žP>÷@qXØ™^äQš èEâ7¬—Þl€Ãžµ¯ÓÜ1óÀk×°¹¼ì›7¢i.Bƒ©€xˆò!Ýô`SJnFÑéyŒž¤Éw†;ÏÔµí¦õ0®¸Z©+‹›Ý|jdá=ÙâfÇ“ÌjCP«õ·DÚm),vÙXzÁKz!õ`FëŒ:ÈáÏ÷}F?2À´¦u±<=އ~ AZ(vŠ~hI@¼Ðöû­ˆîƒÕÕt弉dçm4úœánSÎ-ÂÁuØê˜È÷Ê2É^Õ}ݯòiXÔ:Å9›U;n½ˆœ¸·8sVƒiþé„zVÝ ¡xÔn™bƒÌ½y$fl>}öźj@!Fy vCYˆ~Í,ÝŠÃF¶‡×ÞuŒ:ï§L?ÙAÑœƒ~ä亟6&¥ÖžG<ª!TàÊíë#‚<¾!×—¢˜Æ³žñw¿ŠÔ á­U ²µùP¹|ˆÁºR}²òÔ,¿sV#P.ú–~oä>Y‰Ñ¼A'ÍNz<¶J³«–%ŸæóãfgÐ72ðËÐ_åBæz6{ô~À=OèT¿¢ ÉýP°×WÑéÛ†0}ÒLm8û®Or^²<‚|š52F?—ð—p¬åÉçUì®”8 ŸÄ(å ¿D…È(’ÅàN”ÖBõI:æmŠ& 1_q¡Ï7ÓaEVÝU:ê.CdÕ ¾&YÑ„µG•î…âàœ!£O Uø^û èÉ=ÿoŒyv&Êãa 1‰éž’(r¹”†l.«Bl.äËÍ6ánq-¨rFBŒdiÒ‹àD^ƒZj†hL–—å6?—;ƒ‘K¹ ›=ãRz³¤ÇÂi[¡JÆ[´ÎbdÊáÄõ}wDù¹ˆÄMgh.›¦d¤NÐ. ³+±ßQIh-9iMôsk3‰ÚÕÏVçVå–Ú ¯?{ogRFŠF·y+·«M9ðJBÌ{\[¿wÓ4-±nOå,ÎÌíÄ¿{IÃ䆱²§éo 7å´Â’ÉiQ{®§ø!»Pö•-~JÁþêʶÂÌæˆ.ÕCÖ®Ý؉úçd¯!øóGô­I zÔ°£ÔâT÷ZÜ àSræ­ ïzdOu*ù ŒÕL´X$o¸ËrÃ,ç>¿RX~ɸµ¹Ž­ô‹MÍçO‚Þ*ñ™Æl>f¨«þ-g7owÅíKKö %ÄÇ ~~lÞøRO›†‡”æIº"aH¾öÉ·Êx¼„{¢ S˜ßK­,dí`ïh% lê ÉØP|šB±6Äš–úJž&÷¤ÔK}iî[½= ľ_–b<$Ts"iujòýÓàãÑCºЦ•!¦°1Õ9¤XÇß,ž¬4]Ü'o9;ÕäbˆÁøÃÙ?V}[%‘ßðÝA¯l›¶¥J*-6…è&@[°Üë‚Nƒžª¦šmücTȬ'; R-ÌW/4€‘(k‹%iâÖ_†´“Ù¤Öµ£¦âÒ©®ŠÛ!)<']!U÷½)¶hCßcƒ”M÷"të€!+þ@ýâι5uØ ,¾‚sQû‰é¶í´O‡X‰+ãÀHC7.É_“ÉëëDzÑõ·J´d›f.äû‘Fše˜}©ñ¼¢oDÇõ¶Èð#Ñ»‡k+,Ý/ÈÍkU›·§ØäŽröFz¬žÏÚÕÁRÇÿ%X œZUåã‘ FÀÏ ¢Z„&ñ?¯êS¼ë~OR!dáîÙBâ?È…3­­°2¤X¯AØ-SЯº'OTwl‡ÓùéF_æ©Kcڀ߭‚ç×C°:é[OׇöÇÜ?G½ þ+õ ™«‹jx°LX†¢þÃçý—<Úp;.Ûå‹héÀ0fÂ…6 ýß8Í\WçŽuÅu¡õà†¬¨ì§C†ª^!•º›:4âDâ¸Ð”ŸZ&oŸ\§>NÑÓÒIè-¶¼ ofu4Ô‰uÐç5‡muHÇ3tL¹k˜!ù¾×£({g-kkmS&OÖg¡½±_ ®‰±òLªnÏRHΈ7->æ|õ6æÚö7}t‡ïZO“¤ GÓÔò6³'ÃI謲DÁØ]é-2äÖÌ‹ì.Î"À“!íi±ÇbÕŽ2Ž^Ì3£­ÉÔ[† ‡²[ä¿ÎÎP¾Ž}[é¿Óz82:l1¿[ðØÉÀ™—ç½ü«ÞH¯àwF|§!PâŸS±rÈÑøG†Ï–êFÍï÷7¢Žjº-³jÀ¿2k“®H:$®RÑÀ_ùˆzùñã£Ú["Vgqü5Y׫©¿'Ñ’S{Þ0Î U†½#ì;tŠÑµ©¼‡ºÊH·©aF¢Üê#ðK‹6“»Óîó² .Û ;tËÑyY¡Õh È0…8•IñlÍŽÌÎ<<þkß&Ë&Çö<ž7IÈW4‰¾†Âeø¢_÷áÍï’ »1Ðx ÷ڬȦwcùÂ,“ γ 3aÝþ?Ø‚øØ]³ A©0hùOË&SS2W¾|‹è<Ó&}+›ÒƒjGfÜIJÿòùü´8BßNuekù®š 1<ŠÅ†…ö`ª-ôyr÷ÿN†ùiáaŠnÛ+õÿac„˜çbÏ2G÷œÎ’áç¾H\Ï̧xH·¨­Ë›_»ÇÁ8ðåÛmg ƒê.N¢~‰ô.g1éy}œ‘À‘ú_%óÁ\jÒö¦}õ7/¶|°!ý9åqxg),±¾‹ Ç«¾’åæíÙ)Ñé£?©í§4þk’ªû4bÄm|òáAìcÕ,£lPX=þ-بŒŠÅ$ŒÂw”-è´"ÀÝ=iËRJŸ/é*-{4=Û UáS9\„7‡žvyý­ªS'6A*mþÕôºÏây=©„.“ Eø"c‰¦ ¤ZÒP œÏ‰ÈÉ>¸F­ÛIÞnÝòqjÍ€f¿†#¥G¶2Ðù AßÄ&ï—˜¸F~kÉ÷†^ºxcg{€çÙâ}{ƒ€‰´ø3”øzXbråE€‹ ¥ZA[É^tÎÅÂóÚž7s¼ÑóZ.z~‚ÿâïŸÊöT4ñëÓöǪ æO &{ùŒiÍÑlaØ{¯Y›z¹»f£Nf©Y—)Ì­›ûá×ÞçÕtOÕo œ@Š^k>åßr¹>´F‘è]ÌŠZQàþYæªt¢a&Ïô|4aòõêH‡ï±¹–ë¹ë÷ÅËR7-} Ð1AÙøÖPÜwÍ•,MÈ$wÞÑŸI5 `.5@ü¥ŽuQ±éÕ#/ýßÈÚÈÜqló¢.N"ªÇ.(ož"éŠN¾¸˜cíN´ñ‹_ƒft_Oï²ò?béñcÏ1eÑüù>BöÖ»DpfH\r”göðà?)îÔÓ¹i¿‚øKzèwá§î õ8Ab7/M‹#{». ªGüÔäKºH”  ³¥§"ÃWÝŒªÿÉÙXØ“«ý9Dçê2<&ÎàUv:<8&³À«»Ç]:òܳЅŽkJB¥h.v²e0£õ MP¤T¶A þà m$¼ÆÙtŽ2‚,ºpH»‚Éûe,¹kðñ7ÊßSTS“µ6ÉëѤúÚ⸄DkëösÉ~ÜW0«"’A+C!òî[øÊzúZ ŸºßÁâKáZuQôûÛzý£`“_È\›+;™ê0ËXpÁfîðQ]³…_¾&qšU/wrár×<œ¿È]y¡øDޝZ÷ÏJ•s /ã·&<Îât`@~*ÌqÒeû ³j“5æR€fÏ·Ùü‡Žæ£h±œÑ¤9ißÇŸ§3(_Šýº§ö­E8„°J}<÷õâºÙT19°ÑˆMT±Ö§úçu›ª³{¿j„4t =¦H¶'Ö4â%z™!Ì ‚2« ¯?ÆgôÆ‹¢¹“}d¡ðõË:Z<õÉmÖ'æyõ?L²ûö—>ƒcêÜ(íÖ]›>t O èµ-=t únT_$mýSù•\”÷w‘„=`oÖüS9à7!úËúÔQµr1¤¼á ï*Í}%˼ÑÞXT¥QøLûö¯úSWHó̹篘/‡ø<;€:«JƒR`µì`Hx´(¸ q „t…’!Ižá£Ío·SÕÞaüë©€åRý“¿Ñüo¿ðmcàCÇ‘ >øÃãÀr!ÿˆï·¼ŸÍëþ©ûqoÓ×Z÷ߟ§=Cíäá/Ȱ_–Sj{;L~¥Þ¦FL^ø\ ý¿’yÁÅ¿uÙPÿàe_ š.‚÷7`Ñ· ȳ°ß)ƒKº=ÿa®ÕÿïÛ—ñͤy%‰ Áfà$l€Ü%É^ÀCÂá9Ñ›ÁçB„)Ü…ä#¶,¸à<}¥¬Å Ìi€ÿ”ºíûܱËÝfeé·óÃz/zacÐ5{[öôÌ.¿¶2 èyy¸Ò&ïäP‘™uƒn<~Umtm„ ¹nþ €º~ùçñGŠ™×iEס`€aDR—¹µÜì6¦l"Ùì2:—ðMNê¶ùæ"Õá}!R7м… ¬]ƒl‚{ÈiÙþNfdá9O×ë󾉑%Fè8äÈq<3‘@"pº¹kßÚså”ßÍ‚+‰!³±réG­ŸuŸ ")µî:q4Šâì,û øÒâfËB:©Ñþð$žeöÛ eÖæ‡z£vÃÑlJ¾¯éÂÁº^–æ>ø^•Û Û q“¢¾|©IµPJ„Dç‰ KõA±×TzÃÊ@>#“õ-ت\Z5vaaTü²±­ñÙê‰P} _‡ç+Õ¹.cÖsÊtiÜ(°;]Øk“ÛMfNÄêvF=ÂpÔ&?Óog‰¬Íð A¥œôÊØ ÊÓ/6„Òü«²Y¨öÏÒÕ@P%á‰&•z6î:´9Õ,ïWΑiæ€iµÛäN?#å:xó,(ÞÍ)ôÖóx±fHÌYÂ4c™ÜÚÆè'—LÃ4»ä&>ÎRS™c˜§¾—]ã÷0ÚŒ¬æ(˜¸£5ð£<©dGd·¾ý +IŠ ³B,®å@ø%žú3´°ÇxrÐlœ5s×BWv#žäpéÉïåÌsÇáIþ”¶l®(ÜA ,?÷E¬ù”ó݈‰v Kq¸VñÛ¯ÌÙŒ¹í žLd"d½Í„;¥| })ÙzHÍmº{ýÚ¹©2V#jO¬OÈG`šåTl¯47EYT`;ßÐp¾¾zT/h€©¢ I mTBL>ƒ8zâG®_Óž8jAD³†6H’Q?[ü-aJí£MÏû±Îôõ¢A–÷A® ƘԪ•¥ˆ=BëgF½+&Üüø|·Ìîtö“ÚëUË*‡±M/I¹x¼–óÖïè#ò- 2¼iya3Ó/B}Pˆn´7ó˜³ýN}3Ijš«D(î§ÇÊ,ƒŽ#ŒFæC`­?pí )ä\¨P?Ö5x†˜k6¬mQèûdÔ9t½â°—SÊc¢°šœ»]a×LxÑM¿k6¾z„|}«Aû7l3ÐÅWQäïP<ŽŽl…48užÃÔ˜pŽéÊV6ÂP3A­ áoüš;ó¨6¬íÆ]röÁ¯Nžiêó‘áŽe¡ƒ)¦(+:öà-PIÕ½¸pBÁrT3hþË5ìĦö0­Qž ì¿Æ=Údìãq¤b çDS(Ù¥åUsžÝD½÷ë•‘í+± >0áà¸KæÊºë *¾Å;Ò7(ÍÃT¤‘WÈpÊ7š*xí•ʘA+Ë-«ÈfÉÿÉŽ ›=³(TRd¥sñæe—E“ó„CÛÏÑ»jÿhåb†0;T#.à æÞZ¸CõÿO ywCy&™wà¬c¼°òfP.Äc³Mûú5/j?p%á³ôj~îeÑ^ÝyÄÜ Ëʘ㠮DæsÒIø:s´œ±` Ï5ïU¿<âX’òõü~g¯^ò´m9ƒÉÅõDåöÐ@ ˆðëƒsŸµtøg¯üõ7G¼ž|ÄÉøÛ±ÿ)‚·›(Qù„s5J•]q•‡R³)®_È\pÃÆÝ$Ð-"|H¨#›¼¨…³¹³Ê¯óvS>oä–`Ý7<µSV‹Í0nÖ'Aµüƒõ.šl 4!ÙÍ’Ë×Ém²sʵJwÄï‚%9½Û›Rý] }îi#+>š®oÙz¾DHÅ‚F쳿ÌMÆz)Ù ¸eìöm¦Ë‘2úZ'” ª í£Î=1êøÄ&Fm~5dh&!À×!‚] ¢ [E_™©È€ÞWFÁßYÞº®O}%:œÉÒ´q»ÝÓ“¬ÒŸBzqŸTLÃüdd|g…ùXH阵Kk~°èĻݦ·ûì»Yð Õ4Ìøu+ÁÑü‡ô·_Cd ß#†È1m)¾!èBYt‡ÄÓàR|‚Ôó…rã·(ò`e4À{™Þ}cù„ ï8´ŠÛnÑl ÂP㛣Œ<[CBE*B—f «7B-ô%3ÙIS›°1!"¼(ûÆÙÎ-: }i “GWåª;„ƒÕ¨´{y’´‘y¬¶~ü؈ӣðÃeþ¥éI9 ã@ €v¦"(Þi_héçÇb–ßéÔL$PK°üçADêÇ_àšií”7zªÂõ´èKO1›ïS I3­ÂˆWjôpG ã¹+±¼ËŽLÆ•²NÖ^¤h Ç$ ÝnÙG$K€Y„sxö0€dÒÕ.rÚĸÇcìXVXÅÖâÈ£#rBÇR­k¹·¸·ºÉ{fo¸%˜saÞ˜sY%¡þJU+pM»ÇW4ÙPuƦ¢üá Êø¾b¦¯¹©8¥ÚW·æ–zÅÎÀƒÇ>Ì,Øãæ‹êª D )!<¯ kžo$^ÁÑ?‰V/ÅpGÆå§í=1OÁCr:äÉ©¨¢|#b¸2|Ú‡`U°$83ž#=tmÀí1€þ*(ÿDÇF8{`r‡Âô½aÉÀÈq…šW r`Ü7#+í@÷jF˜ 3°æ‘ždû:6É >C³I¶àí¾³žÑmÈA~up=Á@z94\9ISÊb#ãÃ,  ~|ˆÍžVÏ6-€V•+Y3e#&¹:g¥ÌšÌÝÒ¥ùe½1ÃEõ]áÙd2ùÏ¥ÊW•IÀ”í`">Ñjf÷äbâúe€ÄùÊÕ<ê| ÖŠXd­Jý…Lâ‚À¨BI »£z½œwS}:™ñò’a m¤øtXé#[‚óR‘(«}Ö«!KÍ˵JÑN>i0Íê²Ï—\éÐYAv…éœû£5 âÿ¶‘–8÷aôޏPªõT?(¡â¼¦Wˆ£TÜZ Š·§phàr²r&K‘Åëzli.:žX­ Í#ç‘VÏ8´1°ªºÜ²u‘Ò¥Î$³:Y³è¦fKN‰2J0pÃæ§zU–,Õ|¥k`Ý—»÷ÝD>XÆ·ñT¦ð‘àu ¤G4uŒe,LÖÜÚþ†¼Ds<£g7X¡ÖÃìèÆ5u“ØW%UnäicÙÊù¾BÇ){îÖñdÎ0Ä@>;5Fó¾³~ÌLCRÓÞÂÃt™§ø& T†ª×ëÇþf ”TªQ³¸Á¬…©÷?MyQÅ`È—0ѳxS‡?ŸyÄÔ¬ç@°`=5Õ ZV# ¹›ÞNBÍmð ’H;É“ͬ©5K4Ö r…’.A7AÝMžì" VžTëEŒP³Éx>b&òì³óûÍm–ªh:VU!d(õâÆJÕóNé‡ }m”õAÝeL1cùðýP¢ù <º¿•ÐB†W§)”ÛTï´Ï–*ã@Š~ô(NMéÝ)ƒhi×±Û,°0T¯ænü^*;,‹ iÇ!‚*k¨åy¥`z]6»Â¾·lŒÁigu.*‹–¶Û˜pþ™Yê:ÛŶ$²bÍÆ¨‘®iõZt¹¢ë7pÆIþ¨¶+À&£YÖƒqДG¯óäYœðkü@»™ÈYq(~®©'šñãÆýè–ˆÖ°h[®>slú{ïÖb…xz¥£i{ЭsûÉPØŽR_>Ýæ0ífýÖ‚b¯ÔÊ/“r¼m”®ØI̶u¶9tÕjR­2,ílOÕ7…F 2ϸ4±#2BÿŸáo3Àò¡nyóp"€iÈ¥y§Ô=˜T¼a3=">íÞÄ2©´i$66’E, ¥É/ ¯ŒK3êŒèÆÍ5Ñ.ûâ»Tà 1´dï‰áìÚ•0¼ê@yšë4‘þýwЩ¢Ô4³e>iÑ㔀èã}’u>ÚxåŽÚ¡ž=6å ³Š“¾``½Õާóe–¡ ê6ñÑñyùd¾WCB ©Þ7òÀš/š3CuÛpŠÒþà£Ò7¯3hy(œÈq¡EEÅòÊsHÅŸ¤änŒa,ùdb™i˜Þ$˜'ÌCQ†)BÉö_˃šgøAÛy,°ï‘2'mò«0>¤Ÿ ³~N®l¦%».‡#y-Ö e¼ìÈw3éC²Íˆ¹»… _±Ás¹ÌTœ#×S8oZ¿®°öu•”÷»Â¶Öèm-žÜßœ¿€“®å^QÄãçõg˜:7ÌÔpQ € vÈ?ò"Ô”G:rºŠÔ%7£îó,Ýáÿ¯âl2ëvØqt%Ýã™k­’¿+Ãг}oÐGÈB·—ZZý4r^ȨºÿX¤¿œr[ € ªz¹7ùCïcc†p¥[ÎYNúY¤W9k¨‘¼hÉp¡ +1wæ ÄB-á€lE™cÓ!ܢ箋6˜q"Á oão#áˆÔ­u{ÄFõFÝ„aEqx~óšSØLΕÝÈ£gLÓ]r|¯>b F—û×|ÒésûÍh%&{ÎÍj÷zCsÚUNŠÚôÒpw²w)¶JÃcòeÐ gd\ê7wÄobXÿšéRš•Y¶3EÛÌüqºwÏ7zós ­Ùgðñ=Ôà=zÏ?¶ƒÈ^ý1«¿J«®6Á= ï’±ÂaÌ%ä]s~]'´É?(%yYÔ“9p)`;Ź>Z¦ ‘¡9V8‡Aî¢*áB»¹Ô{sÏ0?Íȯ k2Ô‡¯¤±{ò ðʽýÊ}¡`óË)Àˆâœ2í¦Iѳ(ãh¸ÔY&ƒÁZŽ-¯ÊÐdL½9ªe]ܰ\ÚÛžUØaèÃèU@‚E£iùIÕª@T_à#¦Š¬•Øm'Ô^0Pd‡Ñ±C¨óÒó¥fæ– [ÎÍ;Æúì’ìZUòX¨•‹®úì…òûíl"L†$¬í’ÿ²Lß¿¬"žê  UïºúRÌ"á3” ‡¦I$õùè&Ì|,–‰gbïØœ¥ý Äñâ/‹ø\ªÏ§Mõáê6Ül¶#o=Ùi`ÇpïÖÙ,û2ææ,¨{<…*~Bu‰ÌtììÌ5µËFã(•±!©E^!b<z4£9è´ÑpÄ=ƶž7›‚ÿI¸7Þg£Ã률`8m“¡W³*T„÷Q­Ù9yä–>€gñ-rf)&eq7G Â~ÂAÊki˜Ò £ ùúµ{eâ‚.ʇ…}ïBz4¿£ë«ýz ÏI/; ˆ£²¶ä¤ƒÜúŒ…Ò !¨¦ȱÔm˜Î(ÿŽ^PÎÏ« ÙÙŒKåÜ&Ö ûGkP†ÊVPÜ })UI¾Fh¢u¿§ÿq`“.Ò‰v Äj׈¼¡ Qo+qÅ'Æ|•yÕB›üS·p!\Ø`G>h†UT³ \ÍC³¹gArî«M^7E*Êt—ËòilÙN¸¼FfÜ·ŽjV7¨|ÈEѹ¼HöåV˪ò“ ë'€œAüV˜?;41Àñú\ð®¡ë2ýG–­ý¡) ÝíätÁšnf/¯Å¿ ¹³ÅdÊCŒ<%² …K¦è £¸b6¥‚h³3µÍí«zûæÀ¸"²2†¤ê^PZQ²fé2ŒÙ=ð§À'˜Z»üx‡Éh.Ñ<¸ÅúüÊh! ÏCnˆá#ů™%ß8:æÅqȬ7~””?ðGÄ*¾kâ‡0ã5Êävl6{>uï9Ï99#‚‡“tŠjQmÂN ¥vªÿCøˆÁ5é»Müß|^ºü¹›Ž!ãny±|ç­tÝÈ_ÆãK-òò»CݲóRLƒÌƒ™2°rô<<Ãáᵚ䢘âˆÃ<ÙDŠ Ž4zÛlºVóh0È€Î/žÉ”Kh¶rôn&¬4be’#< Äòt[iœ tŽr‘g+ÜWôBh©J¸ÍáÅ¡ÁYâ ¶•G©Ùê×ìað†v,ðÇo/øÌ¹˜³Ìb½‹)>saí š€u+lj!²®¯D۶д»ÐÆŒùÎ#';“Í ¹uM%N{ùÂY³Â𿇓³Óó"ºIДaƒµÎÃ!ê7Ì¡¿dLSl™±`-g·~ ~yØ÷¶ÈN˜N1.?¨g*i¦Ù>6‚`Æá»™ áR2É´ôL¬,”ýÇ,é”ó‚mdì2ÖE‘Š¢*g 2 ¶„h¿ÖæÖ@vM`ìýÔ,‘Ÿ{1Hwc¹ÑWÞJÑTáŒÑƒxÞ›ªüm¢wúÄûþT‘Ÿ Š@×Ã/-¸š3…¸Ÿra;µ¯"¶t#RòžNåx\—-åÔv¨âèÏDOúø?ŸÏM6ˬò×Ê-qRZö›/ÓQ~“ž Xs·Ù¬J»·ÍØ|yÛ15HéÜQÓ|ˆ#K…J —+g{g­…Ñ®¤º;i$TÛ«ë{©"µ«Œ_ÎàUs…¬;hÿäö: ç†÷­qšÿk•¬Z…!“ÀRI[ŽZ“MøŒÈn3g«ò`]s·?3ƒ°–á6›´³î–4€èÔ\Ÿ§«(|Šy Ã\Îbiw×~TÄkÊé$'þ“!ã–·º GâpÐw¾qß3e Éí¨}ªÕeB˜Gw˶zŸ)î[ŠëPBãÊ4ǔӡÔ~üùLžøÉ‚ÞË›Ll¦<Ÿ•ϱÉïÉ"4e/L¥Ý™fyÚcaŠ“Ÿº®HJ‚Zë³ùNÏ`h´:G€àjFy’Ï€*ÒÆšÚ9¡½P(ÎÝQtO€MC³à´ª3ú’u•z³Î:2úpf+ñ[µ€%ïe Ç_ƒÔ|?ð›L¡7z…•óC4ºü+ûƒ‡(™R禰/Mö/.5ñ¼/Ã<}Ûð¤ÆjÞzˆ!§ž O …•óïª_í˜,†ÏnÅ7£ª¶”V«ç„¡!7ÇêÆÀÁ›šä¡ÎÓü ÒŸ/”dHç„HÉÌ `gb¯Ê©`*¢†ÒDE¿Å.ÈCŒM»PzdbÕ(%Ö©Gá2û¦B+ͳ0„±¨"@2è1Ç*1úxP2q‘(ÃPê4x3ghr_µ8¸{$…Ö­YÏZ f[~çqÐagÚýE¡]ú¨$„oª4>c´ Ú—]7E=}ê1£ÌNÈK—ÎSÉ©"E­‚P_¼ê¸ŒÎgçMo•‘TqdÒYj—Uɸ²ie½S3]æ2t7å%Ø\mZ`a÷úÚº$\a|\7A2Í¡æÊÙê;¬ylñ ºÚÈ Ùš^mO4%#b±.9õN;N©¬¹ÜˆÞ”ÈdÜ R #±OS†ÄÈýÖbJjXç”îTØ”™”æëþìϸ5ñ{¥ó—ž DwÛÛ…IòDŠ&&<ݘȕ¨f-ˆÒÝÀÙJWô²fû¾Ñ&–òMHÏ€„ªÂªX\ˆ¥êŠ'€޾ŒùìÝod&›•‰¹úè 6ÁYË£ÞÚ„LA\©×µ<”Åø•T½ÛË"ØÊF“Ž#»qò*ÍÍèàe(ÁoL¹£ðV÷<î×”#Â$&MrSÙo|&£Ì*ñÊ`×?ŸŽFªzì lÑ™MÐ,c°¾¦ÏuõÓÀY3~±ÄÁDèütŸ\xAÉh®ÑÃ2÷ÏTh¥ª­`K6:÷2ufxƒ.Œ ßfƒ®ÉûÄ_9Ì\[|õ8é ñô>÷{ÂHÇ4Bȯâ°—×¥PàöÍÿ<²6^ò'·ojsfôÏšöOžÈnÿ¨¸ÝPÙic[8hD)þ ;¿Ð劣qg¸WgfZ÷8ç:üIa[EG_Ô/‡U nøkœ7g:ÖÒÊA B²y¤®vÜÙ ±jÞƒ†ÖgÈÑ|û)w"×4Q¢;Ç<æ&Žd®ÉõÚQÛ}G8‘ÐrƒëËFÝYÁ^2©¹¸ŽÃñk‰´%vÞ·•ƒ)dÊ€ÚLC¤€é]#&¥-Ó)s]Dý5í®¼$1ÔTYžãaFÙv^.æ‹y’ceþsõËH·¯h3'°ƒ­æ}|-KVànàf öD©ŠéãÃù1«ØûÒ7¤¤¥ù¢÷Š,Ûkrt*%Èká€]8©ð¨MZäz÷¼»{ÄÚênHâx–ã^6•™®Ù†\=@k­¹hÎrxc˜ïSáî®S¸Zšæ“Ë2ÃÖñ6§Ùéö 6“õÀPZJ¼„D¨º…>m±“¡'†Œ,ÈV|æ>c: šè§gw†GbªÙ*Ú^”¿›7Âô£›qã½Ö€ÕUÈspIV‚Î!Þ[Œ :†Ÿ«`Ú‘+!«÷Çm»ÙèÏB´©´ö²ô´…ܽVã»mñw÷a4r®ìߎåˆa¥Q—Uló—Ìáe6ÄRêªêCà]RâáÏ~³ÑÈ¥Ð.¢¸èÑ™›_Âí8ÙC:w™ 9C°æôa±<ƒó„†í¼nÊÖ9N`RŽ~»JƇ¢Nxß•4=“PŽ»܀밚F˜œ†D“'¸Å³˜¨Á,õ)éòÓÀPJM8ß0ë%“à'v/¤GiÎ3 uqé‚bnâ—½ûäÚIoª²’›]*¸Lj‚´Ù¸qØQ¡¢`V%î36`3Ip8`žSý„x\ ß\/eyÐóâLIÈ.õz¡DJ&¬(»µ’ºzVÂ6äkÝñˆ¯¢V¢2uø Çâ–´®Û§§(>Ú°‡È³"è!R}ƴ݆ù·Ztv9¬Õã`õŸ­~‘^¿ @141Ã-ÓMnå iÉà»r6‡Ë,w£q”+n,kѳcCåpömz•\/Æy?•·o»#Ïsœô$yê{‘Dî…á0#µù÷7ýw˜§ÞÛ‚ù¸÷ˆÏȪÞ!ôåÏܾUËF#uiÏø„FA¢½lñ ¼):$«AªâÇ08³7®^iŽæÉ7Ý‚wj=3Hßý˜¾ù ø‚GòxÏí¶ø‘ê?n‡Ñ–%»Ð¤³™úW /’(Û6`FÉ ÃQùFä „L?Q®eAÿæ4ƒ_/0ËËu³Å8w™„ŽY¦á[›ƒï^çIvFj²À_Œ·6o–Gûmˆ)›ÖæÕ¿¥0mP»žqÑ÷#?kwæÊt¤¦õ»z:1 8Á G@`iy\tD¦¥{_1Mã}ê©ÑªÄo)^k)¦r]}+‘ô–Vù1ä÷Ô7JÙ’—ÿ!4W8}DðÇŸµÄ›¹ÝFõ¹G1ת þËÇלgìãükWq±=‰xt #€+M}J¤ƒûÄæ­i-ÄÇó‡2>{)SŒ¬ç¿»Tàúo„qGú ƒ[ëNɾŸ)¯ N¸íÉ 5Ü4ÕñräÁà7YOÆ ƒ®Ï\=¯½” )rþ¯.ZÊô?«˜YVÄ:éçMQdßȳ.ä¾\]xðˆfämá1kÁ’ØN¬œ)ÖT"wܤ¢»s:$Ñæ\ß§†"$Ç6~í¡g½㥯ÇÏ‹ºêˆ‡Ç~Šå¦LtÅ3 DÍ?góÚñ·6±ûþÏDK¡³ùrŸ«Ö':ï·]/s·‚Îø4å$ùqŠSŸgLf‰‘»àöÊÉè‘ÃOÉgЄä³ÈÇÌvìtä{'4s§F˜Ï¼8¸qbZe OØT‘ØO|±£™Œ¤DjnjfB6-2°Pà ›~ÉS>dš[ª)Sy+Å3#ý¨DùIÏx5zöÝ7q<ßål–QÀãùÝ¡G w úC1|ÊzêÍÐÊ=i›ß¡ú åéØ1Å%¢lîA –4Ìòó9&gõÔË`nÌ<¸ g´®!¬ìÔìŒu&üý¶¤l£8Ù™Ú=Á~EPç¨k“ðiÙ%¤èø/ì–.™ã½@÷@„  $“¼º© •{V•Ú²†üóœ}i—£zQ¹Û%Çm4<¨“ä°`‚¸ÓÄä}‘'Y'à9w¿¨kjtû‚& Ç£ÊÎO…•Ä–pò(Ÿæ'ì7(lün{¦Lé:R3O§ƒ¯Ò׉ª >{>FO§†Yëwm:ÀoÀð ÏD2v‹7GÊuݳu,ÑçeÈãó˜æªD}l±U›³Odê<þ a»Û@5 JÁ`Ìç*Ñ8ÅÌ¢¤¤vjJÒúKaR¤ —¬âÆJ ;—Èg›ÚN\ NºLjìT1EùòeµÜ®d¡ýfõ¯ËÓ 6XPóžÉI^vl(IAH’hÏÞ‰sëzüÞnÞažÿš¢/W{•üû¯ª¬¬`ÉŽ=ƒ…5Üû=É eÿ‡ ?ë6Ñ…G)rž©+¾dÈ^+rRy-|¨ìjÐC' W²|²¬qÈ1^˜™WjÔî¾^­—zP&;¿Ü“¤_å%ÊØL5(.P€òºþjkZíögÒúãe yZøõ•z¡­Ù B˜…†ÝRLV—N Uñ6áIf­ñÕszÈ$>fãzÍñ‘' —¸rkå:ÅŽ]u¨óÖæ‘¶|+w\F·m]¥Ò¤Î•&Äl$óôtÉ8˜A±B¶kÀäºÐë–¥p×GdàLõ\Éx4cˆtÏ @ãFYCI^8TÀ[}ŸÉ¡~~9ú)9•w³z ±¤íƒ1vc=‰¿Â%Çžúó u8ûáï½I˶‘Sq’U"Œ^Ôët<+¾´&ù÷•ë¾;QI¦<̘º\—Õºès¬"Ô+HOùNœ޶ô RÜLÁ´Ul¯(¼:®ÇÌ¢6j)ÄÒß¶qS@€èz&‘I'ÊÂÏm,³ªû¯·—"®zF«ÜG-kãoÞÛ´”HÌüïn'\/^Eûèó$V¿$Zþ¹‡¯ZXëjîüt£˜…sä̦9p»h"œ*/ã« vB£uë+A!SÁ8¦×j.áóï67™=±1ó‰3‹>ó1Ê+jù_ Ašª±qÙrgóïÔÜ‹²ÏœSÂ÷XaÐ&³)#µG†Éѽ‹°±Ø”kû";7 Zºƒf lÓÏ‹X‘«‚UaDa°ñÈð4ç˜ãœ†|šÛܯ˜ó³³á7O{Üwd¦º ‰bÁ„é××w0ª;¼` žü·–ºt[D¨\‰naÉ:<<ò®†dJž*ù§AÝÅâÅüä‘)m5kô•›ßl8»²MW‡#³ÊY¹"]aŠÕ- Lß·«/¡¬}Ç _êl–'sw\@ï>¨‰ 7Uµ2ÆÙ½ƒ™rÍ’cK螥VéÛµA8.É.¢wK×tºR0Fð¡6¤W8í¸ŒWk6Û3È⋇¬ä‚.‰×Åò•ÓÑûÞ¹n§Ç[b9ë™uYKo·}>ª õ ù£‘I*À[îÈY‰ž¢hà¿|t´bzÚ°¹òÒ 7•säÕz4p€Ó&ó1C¤Ç.Z¤«ë…Z.¾£œÚHv1ÁËUßåë«¶¸âÜ¢\"̽Z dz›TÿK$*Ñ7̓Ô\œ¬Z qxW´OE?ç÷ä* hëý>þgÖcRé·°ýLÔ40<ü³K³«6¤þ3ˆ¨‡ûX¨ñ`;"ÓýÌ,zµõ-#u_¢ON*áuº)Ô¨½_@ÞoÃ)’Újút„’ÀOÝŠì‰kÒUS«T‹>îTÃk,€2“çF¤ã sö‘d¶íÛ^‹ŸE,ÍäÛ[Ù2DÖ’6N„tÓ)z4xéœI;gªÕZaÎ1~‡ŠIÄÃ,kA)¢~vV–Òðxf-¦ ™To°Ä=AÌq"øÅLX¥–g¬óT0í%üõıI~øåñT±QuyX ÆÐdOi%©Ã®¿ÀËG»/¶|ŽÐ©‡o.FD´$Í$o \.e¶†ä:R>3§’(É'›x°÷⩼ß( ÿO¸Ì‚Gš3ét9À·%½ÎЗHÉh¢ÍâTŠu*ɲ«–%Ü%º§~Ó5r´˜çFŒöÕ7z1[AÕГ¤QÅô™¤FX“(Á/Ò¸¬Ü^/jÅ笆½ÇÉÔBñQx®GFcéßïÈœ¸v½«'¦ºÇmÑõTˆYw+#»5 2©Ä ‚eÄ^óÇÏß]}ÕáKu¦¾èÀü[³zÑ=á@>à®ÈP·Îš÷}]ŸørÍŸš¨ÞU.å*N¼Ø ViÙ´™ èþv×ý2›J,·Ü&¹ q¸6DãŒ\jâ¨î."@=SS÷Ò‡G·®–Z<¦„ÐÍn›¦ÉãM¬$´„aëMî­•@Òñ—2X½‘;5ÑôK SEŸ«FaØôÁ}=+¬Šg-|¯(‚EAuó)ÄM¶äaJ6Ìo¹º Ñ,×LÚÁÚàš‡¥aø1Ëzí+2=8í¦ -=¯­b…€ôöç{[E3P¦B#@oMr ¹sd€¤„¶î]άÞôÅÃÆ‚r€áS0”ø|{¿*}9͔͋–ý“ÙÖ–LA¶Ê5”Âjò*GVyE)µ– %†‚JœÑ¦ãþJÿ“×­)׺óž¡wq”™So›²ÏV7 ý8ŽH`ÏŽRÍWOM>.ÔØV¨”e Ü´ßñA mê2ǘ(.¥*g PQrˆgij£C;¯Iýãú[º+må²h+d‰Ù¡+‚hÌfmZ—’60®AÓàǭà ǥ®þ¹r¬G][WG¢êÉ™ûµ§Æ’«š­Ÿºóѱ`OÁ$ò)@VÖ …!^IÄX FÛ–"1ÎccEÚ7™ûê:Ù‰ l¦¾²FKÃQƒLƲÎO)(XöÁ¸qªú9Š5×™ f0¢…ZBºÙ¢rÈ0ÝZÖ®È\ÑÑ.|ù-Û±;ËEdÿhàÉI|¾.3ç`˜n™ÌჸõPöí–Ѥx1Ö&™ m  Äê+ùc>éDû&“$£#ŸrÂe³u[„¨õüG™ígldz±Ð÷pÝî5¼e0Òè­„fÉ{Û£åWñƒð9Šøü<Þ˜ê'\²z9@ŽSÀö,o3?¥w•M‚BDh—3_H# R›-µìÓ=r³ò¯»‰ô‚Ð2µ¦ÔºQ¬ENh“WpÄ7ì½Tmñb¦ª‡óocò>kìí¡µÖ°ÚbuD€™R~¨cŒÔ…Út€ò{µ_÷%…v­I R׸ÊtO·#Æ>þk—M ¤¨s.žµËœœ‡ÜÀ ‹ÄBÐ/á¥`•1¹¼G¢á2 à^L_Hƒ~·‚B8àÓN=QÑÁüpÓ­‰Gàâ£5!5Ù™šÐñêhòšÔ„Aì; ÞÍ”÷—;‡83œì­þV§GCª:À–ÊY;IŠ@³Ï«,С+“Hv³ ’ôÈ—a —¡ÍƒÓSº:ýT>ý—¢L~k _ˆ© zŽ»ÁRsØùy Z³ŸÏ£Ö@¬šÍl})àÅ(Xùç(á…Vmì`y©%;îI¤Àv`JY&Ä¡A‚ oÒÿ='•è¥qE.Pɦ½…Ë9§ÌßáÒÔϬ_V÷?)3NA„ÎÊw£Ã^£ßˆÓ$«W̸± ®èJ#A.â‡HãÖS`w@`÷‡HðÌtÕ1_‘V‡TßδPòöYúù ³eYvÆ”ïf *ò4‡]‘YÜäˆXYBWigu$Žîõ7wÃň³êßëø·6Ñø„µŒ hJ·NØZ{È~x‹Róéªæ=IÛ5Ç—ú¦e¥¤”R‹ÉhP°}t7ÝQ&;Ã+»öƒNKÒ\È)pvw$q“ÂznTW§nÒô]6ŒßçÅ!“‰*9üt࣡À/·8ÚïRŸ¼wÍõ¬…½ ÚÇ5NKD画¶uLß¹²°Ì·² õ•^Å&œ%ˆ@kU§ oðŒlv:”³9ÈÊ`Hÿ¾ø\Y¾Þ÷#vßUOo¾b'¾­l—­ƒºëà5ú­TáÊWçß3>dša´BômÓQ,±K$etÄE¡Ä:Püß¶SF;ÀI‹ä60všLð,Œ t=‘÷á^–ä—Ïê¿ÅïÏ&ß\ß²BíŸV"Ò^ÍinbÒÜ|R¸p’h”€¬Õh¨…ía¼-¢µÚ‚2ô9šk%má§Œƒ¬i²ŽZžíѽLÔBêùuyÝߊÇsEXAg~(Û6奺]1.€¤{f¢/¥„ªá­ì¦Ê{õ!XõRí¤CÇ=×õd¡pW•g|rýÒÑ­ Èä„ §qßÿ…B|ع<ìˆ)àwbÉ&ªÑâI£¸NˆmN„ôø6^øŸîkÑ6¶³™GçoN¨ ¡p .lLë!0RéOÍ,­(.¸¤+ÊÆ§оMÓÍ^yãÿÕ KŒ`áå *˜ñ:ÙÚ½•Üp{^9w=Ä™ #4úI¶ Ï?ã:!AKt(‰š>Ÿ·Êa¿Ž÷å××øÚ>NÌFÞœOË…sóÙ£€CÂÒ®ú ‰º¥+P~#ûÔ*׃…$"<¼ïHÉLAi7¾AGaÿáÂ(òxéY£LÀÙe.5ËVœÂ[.×çj ^á~©n¶Š1¼Ò=uTš8Œ`XD‘™‡ú~K¢Õ¿ƒ¦€±FWÐÄUŸlõ=üŠT¯hÝwœ^ñ’çØUNã…Çüd@R&Üw͆ÂïÅf@´qbBX¬Â¿MYTí¡½gÌgö‘Ú<ìªÃ«#2òÇrKG =Wm•Â9Z"¶¥ž:P¨Þä>,töH„ æíøsÅp¡7Ü÷Žº§„ ê{rªöUÉ|ò²&Jo×·9ÝRWR ©ß6QÙ¬@ƒ¶Ì¤—$¾?t{EÖZ}°Z5¹8öv?y<®+8óTe6øþzú~w³0«!I]·*Víá)&ŠeªL ˆyâ‡×ýnDüuÍ+O %àÉ GÑ]GA‘›nzŒƒÃ„ç›ÛDêg-V !룶uP…&kHB:…a&O­<å n+3 {î6X‡Ë5ä(™Anä +)M¡vÕÏÛÏñ¦Šîüý M­(n“p¿´EéN5Óß”ºе ØýÊÇü<ŸÄßÒ¶èjÆ·Ø@°€ßhì¤m¸S ˆ/~oEÅäè`5tyãu.î ó:SM¥eõý3Ž7Ö±ú¨×Óg`%äë»Ë›÷‰Ã–ƒu\kº¥02ÉÃT³a; ¨öD¡”õ¬W<:g*wnêÅ&·×Åxþj:H€Ô-—Í)±Uݽ`†Œ€L’Ý0)ŠR›âƒí+ncÚHqn¬Pu.*™ˆ~Æv„ˆ±Ža$¬íF>OøÒÏ=xˆõY T¦î bNH¦LÖRsJeç¡8o4-jmµÎ'V"‹ç ´! ^ ?x]ô¤=§°þá6;0Raú7ޝÇd¦fo¼Kê~;Û§ú.ž³‘¡ÇƒXLOq«’ôF×»»W˜àý~y£ª¢ˆõ;>·®ÌµA>VÐÿ¿i‘¡5í·‘6ä¢Bo êfðz ²GÅÁ#9ï äÑ×`§Àƒìu«¨r½•ýl‹oXTœÅpÆÖ¡×® ¸tVZõZPß<ÚÏF#GUÙ–khšá3"Òd˜=ù UkešÜè À šeæb:UKQ^'Ús}qç…ðÙ¿,³Êð÷¶÷« X|E'O³N‘¯ ›¸–ó*ój±›ÃI¿• er®µÔXnÖ00£ ´¦8(·¤Á;½æ5h²HFË'ñmÞa> Ø«‰E¹êføšŒÞ®Ùˆƒz‡NŒÐ©)i:×y|D(õ„§óŸ(Ó‘¶œ µjØ(íV¥:æe&«5…í'¡½Z;%›Žã(Sc½-pxob&ÒrÿvÅRßs°ÓÎæýÌj›>Ï—N›u¡!èä ݈á ÀN¬]qÑξ=©CTÉ"ÍÏÀz}ºÉöV9Z&Žg˜,l©V)Ô]âÒb+ öcùhÝihË%=é8äÔ0ÿ-ðJ˜©íùì¦B#-çk A¾°©Pè°˜¹U—mwɳ.)ãDz ‚ëŸTŒïåÔóeìïkîZE>cð|×ã~ÂÎï\®sÈY)nPêý9Ýì…áöѲéÔ ÁN™.—¢]6;\(3Q³$Aj(Ö %)^bI·—ã1XbRþxU“lÆÞ¬$¢²½ÕÌMª[¹•¶˜ÏíGÕƒÏ#éÖBpšÐº.Ø1ø©„]òzuÌ€ca:1M9A]ñ(g‘·~¦CóËO¾Š òÞ¸°ì‰â‘1@„SÛ|yØI¢Ð²›[ðêãã{´FV{©=ìŒ6<<)"ÚˆRÐ&ÙF´B^:'Ó’›;«ºxÔâQ©¨{«$Ê4މá¶6œô#¦&6ãUÊ ®ßœ¨½,ôîCÚê§ZÃæ#@wV²"m{&i/g0S°öý¡zÙJ14S¹#Lh@JEwZ|‹>i]ÒÈ4Tx»Ü®ú¼®œ‹V9jg;³ãNͻșÃes›&Çá½ûŠ…lبئjï+„”£Íç5!Ö­ÚU8jö@MŠ|Ö\y½„ŠMÒ½`Hñ´z÷Àž_ôlßnwQ­56»Ý­GÌÔÎrË*Ë#[i)PjzPgÆ @O'Õ8‡!x¥Ûn¢[hmC´|”Î.ˆ­VÓ¡.þ‹iPO/Lj¿20‚SvHìœÑ[öñ>¼ÐziYŒ‘†Ê:@Ül¨‚–äå3D'ó6!d^âß ¶U‚ò±žKl¦ïAšçŽÐ ‹,nÚ^;1f\”ÜÍVÕÛw,4]×­æ½cÐæ-·‹²4~×ÐÒ§Ñ_ŽtýpòŒ7н2!ó,Bnk?™Îh)<ýîtÍòß~Ï -ióÕŽ89ΛÐÌ&ù*ëõôYë.'È1‡$õ£‘§z´™B¡{¡ÝÊ Yì¹'9­Á1H ±èw ld -¹´„¢>Ä‹¾}nêϺÉÞÙ¯–Ï‚'j½™·ñN|%0¸ðxw`ž@¾ØÈEtPlÕœ@äÀIGÍÁ~œ¢gžŠëÄ’jêƒò tàxAräÏ\æv *â]#ÃãLêTrç?€ÖMY’é_f°£¼jòt`˜]+=O𔡠-K>X&vh¸ÀúLÅ¡Kf'„:¹ÂS*±/ç‹‹6}Jhƒ£˜\ÙTôkåLXšEñÑ4ñYÅ'‘ãvc&Ô[Ò‰›‰·Ø£Þ*AL»úºOÈ€n8¹Ÿb8f_zhd”óµÂa"T¼ãèô¯öcZ² ŒãEº¹ã02¨³dÚˆå6ͦêCÖQü¸ÊÐGàà ådwÏp’ƒÊGÕLJwz6ŽswÓušˆ—t±Sš|ŒÚœ‚“%–È“û*ø¯ÚÞ€¢?'R¶dNGiU2UÊGP ‘Ö{ÙjB£ap^ñê7H¡³=AÞþ½”6j ˆ.œ[Ý™'ëöóaÆåuð‚»ûñ*#âþúLóÈEÄ'ÇgßÕzÝïHª˜P?MØÔ0p N û˜TŽŒÂñuiö¶YN=ÚÇ!hÜñ3÷Qay>{ÒT+¨ÛšjëqÚ*ÂMzˆ9,Š™±z ¶¸Ådåó=é鬎ïǽ0,B®Õm»¶zVÐm4OëãBØ7²×N¤²^‡Úy:JÒ¬Ÿ‡(¸¯jžœÊ˜`Tg.3˜¿ÒS“,€)¹Üá‹ùS.îÜ gÉÏsïF1zP×ãW>X0‡@-èg¡i:t“..Zð%ÓùêØ¾/Gz[‡­AÜÀÜÞŒü?™r´O3†Ø°£ônÎ0ø´ëhµ"ÏõQTƒ,SP=ǺÅ^¯tø¹<ùŽnËë¦ktR n`;»‰§Æ¹•8o·+m Ïê¤Be­Ñ.ªcÔ`õ·%¢'‹íãáUŽ—Nð N¯•˜>åE§Ä¼‰y‚*1H"BúûæœÅž""§ûl ¯[@³VTI? ¼yrbR_v•ˆE¶WY*Êß°^Ëf †§ã¡ô`}Ÿi†…ó«ÇgåÏ.{…¤~RâÅøä]¹•¦rß qX‘¢^„.œ594x0~º³G¥×#ٕܺ³h=9Þã3ûyž å?âè«8ë;I œHŠe²I@ëT~‘¦‘ÙØ8K:kp&òRÉ™uëÓ7"9‰X—3Ðx 00¿ÍàÆ¬ZK9J®ß»!Ñ{î6¶òMñélÁ¸\° éåvXØQ¼FX¼´Ñpû”Ó¿A¨!Úa6C ”“&ï]í}.Ÿs^÷<Çe,ƒ8­CKübÊüö8²ÎÛÅÅÎ9îašðž¢jöƒ¥rîeZ‚ÃàafÙ.ãe€”o&>Ÿ_$¬Ètµ m±%Ñ´êR}'¿6…csLÖìQ•y‡ÝAëð° ŒÇÔÁ—Œ»_E¼#ámµüÙDûió=/·Ëí.öûª=§?hÔ*‡§×ê1É5Îñ. ë‘|õkè*¥ŠgF¡Ü{=£¸ê²ø´!-2ÔÅ ùÇ#¬_¦³£}+ îð¹?ùÝxa tL¹©3Aý'y!œ¿pÕò¹õ¢Ïh X‡ûÌ›Ñ'bmùæ—„ÍÝˤ¡·½ˆÆ«ùÕK¦;k.`I{j+Î`Ö‘He°{˦‡ÏÌÇ>_ôzxвë²m!–úÒP §Œ±±Õ|¼b _´Åóé¿@ªi 5n²ȃŸÅ„ÛyˆUK’Ùg¦Œ5 å«‚ÔoW[=:´i¸Ân ž\PLßìŒ,‹·Á¨(¸6&K ­ÏiywYÈoYÁ€-“ׯ,ðŸXbâ½ÆŒëGµ.‹KlÑï‘poÖxÉ1rs‹8 ^mç褱G8½Ž9æS»?ÜÛG´®ŒŸÀÏí±FEs•BÝ]‘-%,EZî\Sã6Íðy;Úqè^ KQ&¾‰žoVz¹ëÊ—Þßéóø Ÿyññ¶ú/ÎÛsÅ«Ú<½Ni»¾åò"Ïè[ýYs(¾ý< soªb/ûýRòÓ~nÔ,;¼Ùv.Ù-+צÁÈúm4Zß`â^sÙ»ÿ8;EòQØ¢|J£Áì­8;B.S/“eMßñœ(®ÿw™[ ŠtÇs•õhR±P'ï|Ùõê…¿M}§N“è¿DH(ñU¤¿¿Äîþû{9]ÛdòäÝÍ“¦ÒVû\ê ¶UaH¡»øÓÅ+/Oí†_†Ùš$p"·ˆïÿ¥@3O˜”³L–WÕøŠN>Øaâ ÿ,‚'$žÇüz÷¿zC á¿gJb·ˆG;p¾eõ‰uŠÚ@ø7X&¿Ôc;»mɦ]‘w×üþm"C&.Cø¶ ªëübÉyèÊ7®O´ØQ'SP·ò€n‘³ýÖWñ×N}ue±f²Oè¦.çÌ:)«ô†Œè:¢9özVÞr& 8 \[*¯¡4g]w-ˆÏð9»-òͶf|¹ÂAt*G J…G*¼S²5úø"ˆî1.÷:-òäñÄÌ£ ò¢™¸:±&ŽS€„“Y)ô¸½2s>qQÞxê“ñ§]N"p8°žYucú~nFï‘„§0}¶îÚsòv3nMú«‚(4 º¸«Öst†Ï&™b—ƒoØÞ)Ö©Héå £Fù&B™ÒãRwâ&Œ•åàíÞ¯1Ó&8\¦}V|ºñˌ䶿‘‹ÒeïÍúmÕεpúY×?ï%ê§ô—xÎÃê í±cR£Åó& T 398_ž¬àâwÚ^CÝ=š_›³ç–Z Aêö‡‚85ß·úÆ|õâ1)ÿšb÷ º¨w \¾:\;›SSO þA^_6ÃRÀ’¦„ÃÏ oKˆ}„ „Ÿ‰?ˆ½|ÆP¨ºíåðøñn>ã*„Âî:ä-b!O,ªm´ødßb¥(éã•õñoËÚˆËëu9êÃ&ÓZËò—Pƒn¿âcRÀ=¾ ”}ËE¬0K­Ë'¢צ<çö64àPOé2xéïΓû{øx¬×6.Žò0G–dš—§­4î#aàqËV3ýù?¹õh¾½å®¿{H¯tù"A.¡îdPOJ7‰â2¢êʼnkK@úðˆ•kÐi…ÒÍqû{®|~î¸-â^¿ûóÿž!)ëçÀ‡" ?að 1.>„ î 47¶ÙP¯AxBzŒßúÇÛ÷sPÑ!b0IPÀ< bâ|âΦ x›%·_,G€öaúhf}M t#¾™ˆ¥F+\ÿ™“=:õ«£ôî ©4ø 89Nœüß¹¶¶ù’?-HuBõ%á³7ÓÄÑÙ}™<Ì${þ|Ëçwá_ªµi9É\¾¼ŠŸÞ¸÷»›ÔÈŽŽpgùÌïaÆgåù 0ÂþC ºFX¹™K–Mó瑱üMeRN3‚ÿTà?¿©ý Îsýs«y6ŽðÃtÀ¹¾+˜Aê#Í4‡Óë^tx ;jêh«£$~ÿìÔÍvJùz3tè›fê܆+4bížw\¿9Ÿ¨lÐë,Øÿ‹‰>}~µ'üAþÍÂa¿¯ôÝËÎÉ×ËPïŽzƒ@Æ ÆÞ_íUÑ[±©ïÿøîiº¦,úæ‘—òÒ—@$ùz?Ý>m~© Â9ùeiœF:’ÁC|"  äþÓÆ1i•×169“ê¹xJùK8ô;ÑÍ`ÕÇïû°ówÙÈ…@ÿ|Ž©˜4oÆõˆIîØ±fÊSM³Z©,Ü€ÿ }}ÕM!=§b¤ØìÌ–B‘P@¶Ë—ÜáY4ÈLéSÀÏÅm-:¶ ;<Îí>£õŠ€þ±kñ’‡*éqE× Ã‹'µ¦bìáÒ®SUã…jv/¡¿Óè;×Þ é¡u€}åè¤ ëC:·¢¢2ÓnöÝCÖ?h<äªúeSf¹ 4ú*PÍœÁH¤4k¢ŒßCº¿‘Õ D×çéùd pð&äk†W €jÛâioÖ5H˜½ÊK¯ûY“ìäWôò‹¼`‹ÕÆÅ'‚ ½ {GI¨ÿªóŠ•'+ZmZPçF½N=ÓQŸ`ó‰WXAÕ8`\«Sq* öMpÕ…Q¤³? @$^ܳü9%€5“³ùµ™lo–’{züôÐ!† †Ð9ôûwNÞž]¸I¥.|ïòæÓôæ%㜅Ä3 hƒ°ãà<ÓÒ/k7åÌ›Çå>E&LY£ØúÞZ¬Ãïø«¢\LÕÁæßÃܾN)Î+r¦tŒˆHÙw®² Ò"Å9ò£».Ç«NçnØEæ‘ ˯–w·ý9//ÍÏ6`Æ÷¬/j2sênÈÿ%ÄaåÏ“Àm¨§‘ôÕ/™Ž ëK@àŠ™}a¬jÐÿ*ƶߗëC’ ­±Ç´¯PŠç{ÖJÞè/U=Q —±9$ˆJJj™qªc¹b%£A‘]½Ö8[9"ÞR^yÜmª5=™t»=Ošœ¬Y–EåèfËß­_ºOѸø…Ÿ½Ã¬ûn«Inº2[òzÁÂeý=ˆ»¬Ñѕ܀‚£õ"vKŽa)ÕÆoœM™v«ÛÏ¡Ž‚H_¢…âÛ”@Ïd ‚%swÀDRgÏ—‘—Üö5¢`. `ô6z¨öp=ëÓ´Þºn¸™úõŠ$=QŠ‘õ»ò^Ô«÷\ã=ʦìŽkx‘&µ«¢äªÝgÕ¿ yA¤3h~Zï[ÏOVÂiGŒ÷·%òO@>ÃÞ·”L‚ëÒ|Ò1äñîæi‰âIõêaê9xÄRÝ2ä39p:ñ>»kðÞF d|5»ö“µVéÍb¸W=ˆ?JA`j… OÎ 4 ]þAwz éۤĽ*ÚíQëº=YÒ=Õ Ü‹„¨ò%f¤z¿;Õ³Ð}¹fÎ_áâž4ɳ5W-[¢äÁ ò[jº–12üÐ&ŠBBÅkýH¨4GaŽ{ÏL Ö0$n¬‚gáÌuæ{Ëb¥GoƒÒI ´À+¹þN¨6B†‚^æhdáGŠŸæï^úe£Â(3íZÀÓDù‘]-fÆàóÆ¾ºUBœ–[2a§±˜ÑÜÐF3Rªj:TñPÐ`ó5~JMÝÔŽ¸Ëêþ”ñÖ ܬlúVV©™ M¾Ø†{Óü$-J!ŒzIï­(š~Hø¼V*&[—ææ œJ5ÌTÒGñ+ÿT`ø œö›Ò3ô- ·ö8&|‡ÙBwWÐŒS"KËt°áŽ„®‚í¤@T=ë >)ÝüXO _¯çé×—b–BéB9rHj5t'õo¬tæcÆ jÎÖóû ^=FDÙý™¥³]>PqLN@)’¾­î£rUIÙÒ-œÈ£ÊGRFÒ/m³9²[¦-𤴑O 4ÛQ¼°ø»Zû¾EÜq%¤ ’\„ ™`©’E«lo†ÑíÆ¼…Ë8P»Úi0;«çuM{dZ2 •˜,¹×Rå=ü}ø¿h%u·ß3–ô+•ðݳ¹®Îó¹àš…æ°OÇ"ª)NžÞEôöaÛ…L’RF”i;é’}õÂ]† ¢w f)€Î {¬|T •g»Hø á¶j»ã‘¤šDi'êÐQ*+’•h@$¿q¬™iF—ï’îd¡>ìÿëDÔéP5¢9ÙAµÛ§¬÷?ÄÜè*t+ºgé¬Rê˜ ÖþP²—ëï@D˧Þ&èÙ˜Qù’Ÿ¹óÅ×å‚­o¾ÆW5O¦%"¼%¬^0IæÌ@к‘×’?’pcBB©ý'l‰õ(pø}nìF"¿bVö)ïÁñ‹Ä›i¿FØ/ÆÍÁv÷ÛG† Çv "G ;“ Þ'9Ú €yì.Žü`ýýX¬º4ºÛ¼Û]8Hç³Ï÷NO®‡žå˜„Z¿‰A‹oäšY†rÌ&2‘YâÁ‡ ˆÐ2´ôƒ‹œ]õެ„w½]ø;ÙîéE%í¦g/ëõÄio8QnÏËÊ]Õ®º\‹ Kqö@‘˜-FrãRÞtØÿxdà–«‚ÜŒ´êiV;Èc,GËÒñÄf×dqa $?pŒ‚y9¿Ò’Y²ë`0/é¤ò.Ú¨s¡6lɪÿËP£Ú}²Èy›TðîúŠA?¨½GÈ|Ù¢r‘'dàµêQ1#iŒÈJ>”ŸJKƒáäœá (&}5}›’Bz7FBú$Å„µ˜°Ì}AèïÅѳ&Ä£úÀÚ=¹5´ë@*<ˆloô6E„Á«=|©U‹¥CÍghVÒ$+8ÀUm9›‹S?f‹P‹d¨H0—gkŸJ71ÓzÅókÙ J3 ݹAãìýÙ8>×ÓEéüÌðÂ7šV¿â 6ΨÑ}j•]AØrôèЦÖ©;†^²œ5ãð$;¼»˜9t\xhI+'zÅ…p#skr‡`«jÕª c€òdF!ç­¡‚ÞdYW¯=¶¦T`Á)—îEË#Æ€G›þ$KwHâF*1ïFŒTä8G3¢w{eÄÐ].® ü~^«šõcAšyÓ‘0–6«Þ쎣YðÛhG³Â€k0Ñe^MÍ}6Øõ"ÐoKˆ·˜£\×7•å[F9ØV£SÖŒŠuàjL2ÉæÌ$#Ìcz²çi—Æ)œ+µ™¤PÓ¢í3ÃN ¸„;—1, 5 •ˆí‚ëѯ@¨«Hu7'mÚSE®X ¦ý ÇŒíÕ]{l¤³®Tnƒ…Ö€šÆÔµ×¹C äÃYÉYÞ=8Ö5dq¨È賦¥ºôÃʼ⛉’1åÍÍ’ ¦?z8­Ô ÀvÞÈÛ¾êÛ—{øÎR©{ö^œó-¶ºoW’2lÇ%@áß;úÈ|¢áïOÏ,‰=Ñ>¹d<‡Råøuì~ɃôfÏÓvÝ„¢ônä°;„&ƒ`U&þøøs­í4öK=MDÀCF¤É>Nú\tMJÜië”Ó»àõÖ°лӕŠ=,¡ô”0y1þ•–RŽ2ÙxA<3¤?-IƒW¾<2_}l¤rêº÷eRú†ÞÜ©Ô4 Q™Õ °:ÿhCÛl=^bièQ\‚ªëFÔé1{»½Lð*è­»—››@î¬~Ö!—k=nŸ&S* <Öbeô<¹¤>nåýfíÈè|.M~{ ?Î…ˆqMõ/¬y6>ür„S£›h 6.*T~9Âp™y§,©ÜkK R‚yñõ›‹dÁD ñCµÐòéïêÛy“TÍ5Ö–¸q;àÏR*„%ºýÓÙõ7Í.¡˜s9£ kÇ£¢±ü:wL Ä!m¢ä±8/³‡ÖÚ t—²H‡«ZÛ-œËÛ[‡Hús¯š³f”K|ÅÞ’ÝNƒ´¡'O>P¼q,‚®Û·I ‰ê0ú8Ž+·ÈÝ üÏÂ8FÊ@µVJQèFèø­bŒ¸ U[þ–"àà›Ñ÷YYtì$ÃÔJ&Í9lùÍ,²²òpã÷à¡û-oF!iºKèj §g˜®ÎüݪYË›L¥æÔeF™žŽÎ¹©wǶïG^#;–L.„y‘‰¨å—p´±šrŒ@! McмwNöÏ­O3/­“s.€ç£6HFˆT¹Œd|%GÀV/-ùZé—Ì´ÓL#(z'œg+Á(¤Ý9r}8gÖµ« C“B±†Üp¾ní<œS]Ož\[æÒcP\Ú^Šg÷'aM:„:[V(úCж'u‚p¤ '`®uœ6°¡²¨ênâ±9FAßqÎ]ü„ˆËb¯Y"å :OÂ]NÃÏ“ÜQVEp(y7šÀ{#Ý\AàÓ€ïÄ WUçξl·Pnb…¡×SBt:¼€®à’\1ç×:Ä;“Í<-.9Dq(à×h1Œ¼"Dl˜E|_Të£b™+zþéÉÏŽcDãPdF\‘Øom§%7F·/6Úª´ 602jC}þX™L ù&lû_ËéÂŽV„‘Õü$@ƒg<ó"êìhKšõ€¬W!™?S]—d ¬D¼‚Nb±¶:´I¥™ °ŒðNÍô1Iõ1é\cª­|§… ʵ×Åôpû©gAÉ%í#'$€ÁË/#°9‹:H„Y>àmpyf íKa­&¾î=zÆaˆÙ[€£®:rU©³¤‘IWбŸH›~ßOÃEX|: êŒmÑ­Eî*¶%ÝJ6/âæ/cª5“Vµ3 ÆŽZ}§€O1ÒX Á$«8/Hè JT{,kµu 4WÏåÚJ²B±TA¶U¹âÌŒ©·è+ȶٕ.Ì\FǨں^hÒ–yý½0UNi‡‰ñãhÏ$³'ýOµÍ ‘_Qp|NÏÒ. b“làÂ"o :í·×Ì=¡À¬¨„¹ç+B¶€JQ§d‚°KâÀ •ØîmUÁ`¥Míu_DÔ`8¢…}…#y@­rzöPò­“ÝÁË%T`mšJ"ûpàfT\u™£³ç†YÉš/‰âöÊ}©²{#r)šÍ„ láÞ("Œ‹n¿e;ÐÀ +´„ŸmD׈NŽÂž y"}K*im"qn>¬Ñé\íó}1’ç‹cufüÊ¡«Ö«ö{踈E²zã_è˜Ò¬ôêó)¾½¿‹•rË«>9Vƒ[®óÔ]•Kñmkyó~áçÎ"ð“û*Î#ìþD=L_üjT:œ\³ŽRƒê Ü0P;üaƒzÉ'å‘„†úêH4þ\ÔC ¤`•:Èo/Õb|Áï-*èÚ%èý¤Œ œ*AJ!éÆ'>[bKƒV0 Óã‘Û\ƒ D yÁ•7,Ôî¢oó¡8‰]¶-Ø9÷ÁÒ¿!Zî&Ÿ§í¾޲쨖œH._ï†#ldzŸ ‚Á}ê\ÿO(»­C29^¾(¸ü×ar5'9¬±Òj“¨žX¶Ãš_Ø©ÂmâŽXœÉ.2.$Í1$:kàRýVÄR’‹UDfgNèè`HÖð²Ge)/ÌQ_f*ÑÖ:æ¤ñ¡yëæè@x°EÆ“™ñDË*…}šG…o$l9>Oiò¨*¤[Kîææ4 ¼‹F@àœìGè]‡ý‰* «r&ÕÝoÚƒ½‘Ì3’qºxA_c–¯F4½¬P] ·£HmokÄQ\èƒèºT榆% ä„0êú´3š–C}ZêxÀæµpÙàןWWf™ÀU±}²$V]²]ÍD.‰>·ÓŠž$±–AþLj2ªì½{Q …f¦p|Ê::It!ÖŸÉ:žé=l]zä¹FîVù–ÖQ¯dãW|_«t£ <&Äk¯™'KÈT\bGΊ J„n)v‰Â¼×aòáÜ‘#":ˆž&®NœÜ_^;˜”5ª0¦¶!Z€%ùHeN?¥¡ÆÚ_ xö—Õ¤ÑU=EÈóápŸso˜« ÅØƒÆSÛ¢·a,u‘Jpëqµ‡æо¬ç´ïí´ô1CB5¿lÌÀZt¢kï¸yiÅý#Îò•N|“ÄjÔ-4Óbä¦Å…Äçzö1"¼¼ñ™%fr¬ì³æ½>†‹Ý¤ÅõÍöÀþ™»I\5ӆŦXØëŒ ó›ÂQ “‘›Ö ÔžC ŽénüápYÍYÓDvu¿¥2_º1ÎÍ 3,1(U5\Hǵ¾»=\»øIPáËךÂñ2å´ž˜)ƒíL™=Ë0˜€<¸Ü «ŽU°©fµiå?»©h¯^ß}ÜrDÉ/ß*Ov³b!ñ[]¶ì€ëÔûÔð„bÀOÊÃÔ4la9ž<¹;ؽµ)d'­ö*+îȼÎJ†aׂR©uÈÀ:4äCüt•µŽ1F/“än¸{X&ʾYÍn C9Q²p¸ ÂÀŒ¥€ŸïXìG\H\î>öjþ¤­<¸×ŽR¬õžÿvö¼–½ÇnÔÔ$HL¦¼ºúÓa¹|@†6D<µy ìË’(Rh\ÊvÈÀ Ò®%HÕš²…ºI- ¶NPdæ=Kêæ¨C@ÊÄÛÓxaÃ3zÆ×mçÀOv ïe2ư jfÐÊ‹YÔí|œÌn¶"4v[­ë»Sp´ïdý>ß&Ë?¿%–wׯ©2ȨýûÁ%uÅtŸ(´ÜæQx.ª¨íuçĬG(¢ÊúMóú¥ "Øaîõвt¹Gòº~i[ êj75䘶Ë1!‹¸w~HcÖPŒbp=g u=9É£ñ.Ô‹j¹‹Ü€z°LYk`ažbN<¢Ó‡x.Áz¥Å6´q—ÑrusYНÀ¼å,¼V3‚A£ÜHrÄÏ H´äeráјr »^7©?Šú¾bÐŒ1´]AÑý ŠEÇç|¼™±°~ÚÉ JÃßݱÊk&Üe˦|gÊ’b³áÍçIî É6hÝ›àò™q¦ñj˜=¤ÛFC`ºÑñ 2°*?ëBÞÀP\*ÌD7.®ÏÞˆ^Efúdï—YbA á×n·}¸S[¡Hö¥uú~O«V8òpº›Ò!H%¡r¡Àf¤4žÈ§ ŸÍ/¸’ÌŽúwWÄï.G.ìÂU²›ŠÈt‹ïÒ/æX3GŪ¨ÓÊs„ʧ6àâÙþ#¤uãvÐ×™˜?œµšð˜›6³cS)„ê•ÌdèåjÊÈÔ»q>xfÉvãxeÙùdÙ”Ë{m³Þ+“²¤Y€ã6+Ã>°ËÍ÷'sÏJ‘Æ\>¡*ªkE¯¿ãhßGqàÍ ”ôÞ­ròÖ¯B ÓN•Ûu¦’†Zo*ÆK#¶Í~¥šðzÐb Á£Èl/©Er­édý%Môoªø“ÂÔÝ8%*‘®Áõ¥ÔL…bãVAÜøü®g¸4jŒ@Sn4¤M ±¸\Ø!ÂË<^ Ÿ™óx…:¶Õ=d‡“Q´Ä–GóZꤢq‘€º?ñR_þñtDüž‘é¯Õ©¶ÇRò¡B+¨^} ÕÛæ”®zèŽ.ŽR¢æ‰sà«–/Íy‰¾æ—ã¡_Eˆ&Z?ý²ìº©Œ¸'#Ãr ÛÉ€K ·¬D娧ÝÿÃÞ5ÿ\ˆû–ÖúŒ$Ë™ aÅrŸH¼¿Q9p•jUðFL#úr/-°øG´¼µ™ÑIñ–’€&Ͳ¸úuÉf2¨¥M¦Bœç®Üže­y¾eÚ!W£²OZ¶N?(ãó?ég>JØ“ÊÊfÀý‡1ÛM·®µ(o$™¬ç:lÙ³B›¡%ßL‡VÎ:J8•h؈Òå{íðRUј=?'懒àíc}F>ÜôVÇ ® •`˜Í  H2IJ‰Á¡#Çž™Æ‚\Ôi„E ò£×¸~-‚ІzO›Î g³7¯o˜Í,Ï($hg•³my:‚²Ž¯êwÀ$œ©G“wÊR´ø‰¡|wgÕä¼›èï°óçÒóóÅd¬Þ°ÜÎf§Kߪ»#³Êæ{zfÃJJCµBy@û7«J꯫ƒs7/L 9ƒÄQ)j…)´Îˆ«ÀüÚ‡eN<´Gb3=š_¹VÀdð ¬&(+ÇÏеå¦ÐKcͶ¼`N©ì©áÉ¢œDÑ„pSÇm³+ÑZóaë8«+¤±õqçpKnñ¶õÝÔ“Ú„ÑBµ¶úº:<Æ'U÷ŠŒ„HâWð½²[S¡kúU; ~:.3¿Ý‚¹._Ìñjtm«Q€¿JqmCÍ]C¸sìI½HoĤ“A>i™µ ‘škÙœë¦j\³i$ª@(Mø%s=õ¡£=E#‹šQ`†Âü}hä%RF'å±ôöJ´‰Ð®Ã ÖiÌ»·©g±ÎÎ0*ð%ý|›Hy¬óÀñhðh[Q3‘Š‚“ œß8ä‹'[•˜áh'^ü¹¸Ü‘%tì ýEªiåuáZe¤Òx½8@¡]Ÿ¼ ŒRd¢ÆößèXñî´=KYÇù€†QãG XÖ· 0þJÏBJ-º3T§´@ŽF9Ç&~·_y%¦SÇá´/Åݨ.™.`˜Vv:7ÈÃ5ò<ÛÒ“¹2±~À ÁuR!sf†ø¬[%©O)£îz2™©³×T«š¼Ãtuêø/ËôáÉÖuhÖG“Æûî‡õãV$$~{÷Ús¡ +PYÁL·«Sp¢ÀD>›Z“Þ>T‚vü z…|µl.Üxå¶q^v `KòýLd;&œ{Ž3ƒ¼8AÕ¡ —±tÓQƒ‡˜œ]Ú?-øÈÜÐD¬açÌL Dõ®jõ¿ge%ÁÝ@^"}Â,Š!‘Pb¯w: ëuá MŸ™ êG€¾A‘è1ýF < yàk yAÁ‰€(Gm——¬ðNS—+Ãi † 1ÈS¬Š$ç…zµÜB~gâçÀ×D2ìôóaYy›æi 3_háR‘ÒÕßD[¦— 5ò­UƒTœRÑÚH2`EA-¦G7rí@]«‚R@¸ÐhM)ˆ'[¤˜ç§žªÓÒM®ax%‹ÛRc/)À¡m©~T"C­Kgße%ÞA–ÊMà‚Ÿ‡egniãå»­éñµÊB¯,ØÍóuŠ(È«g©0ccðXªZ2¾öK»çl«Ob‚õEŽÐÆÏÉ3ÖBŽ….î) Oyl‡^¦ûI}¤IÚ;âžNYÝLºˆL›ÅÎÉstuÔœÌ*°ò0{ÝyG—ÈJ]&­·û¦WRøå‚Ž2îÕ–t5æjFù=¾HußR$\ûv^ R¡°i6qqÚ«ü>1uÒ¤Ê}'RŸ ®÷ÙüÓPI-í¹»–o¾aC«~¢4 (eȃa7¼øŸF–hëÁŠ ›t nõE=c*´Ì_%©á9‡,\ʧðþ–PàöVB9$#ÃíxB̘æÇ¿]“‚T+=‡Î•Ï!ñjŒ[þ2–ªÕé3õIt…ÅóÁâdÍY¨©zi7Dr˺À–ïT.µP#丨9õÒrЃà0ºQÜöIœjnغœøÇ£¢î:V\ 4NˆIì=½i|íaÜù}áÉË]àµNÚð]t<Ýu`•‘ -„Ò¦ìn¤$‰Žt4– IÓpïÒ¨ðÌ u´°ÞòQYê[†ÖrÞ­5 ’·KöOPÑúšˆë’{»CÐ{ªÿ'~sˆô{ä£Lñ…ËöÀÊh–M\n%rkºÐlnƒ’µ¥–é˜Ë9¸ÆÕÈNo±®sþŠ:bè«í Á¹Eñ)º³^½YÙT¤éÆå+÷»#lèÀ.q9!ÚUª¹¯8W€Î¬Oµ `êh)ÑóG—0ùÍØÞ2O“rœY£CþÄ3—AiŸtfœq_”Q¡5jükŸbî8§5;”6}.A)ël¤^ÒŽ–O?Iß öô-ÎÓÀ%k ¥Ëœ/Ö×B’ˆ±¨V´m×y†÷ˆ_ˆ^QÀ¯ ¨Â/j'-‘çLB,*²g±"sUSSsüK[ìvÞO?ê E¹Á3׺ֈÙu·ÐwŸ]Q©&Nùв C¬ç£÷áxX‚.·¶é*AD" †ä(LE|iç&dt2üìôÐUíÔŒ­M›n½EU^ágðgB[È@ìNI>æHØ4å tÓ$]xxÂ\àñ4$cŠ`vbÖZôœ߉èоÕz†ßu؈ý9&›Et5ò;•s_"3îñèiž•Ïü‰ä_Ñ“åTö™ÈÂRwê ]9Ó(°s/gG’®ÊøèÍö{×í3"w™PùKL២|Ó£CPÃÖÍõ‘œ%XÙë—Xñ¡P¼•‘ŽŒGÒ^hÇÅrvRu›ÖÍÛ’ ŠâWYÜfæ¹+qÌ»ÄyùèúNÚB^¸ñQ¿“¤M+Z÷ÊõwÌ ÊxRËû~ÈRP9ϸÂ<£X]e†EaW´`ÞÚN³Š°—.IØ5ÏÙQ‘¾òjÓðÒQíÛD,&!•È—å[öîr'®ýlTê„UKÖf•çBv¥wg–©FNÉW›«3nˆ<ê×kÁâo™¡Z’“TºÌ#¿¯ç9¦E£¬Ý{ ³±éIÍÏä757}H€Á6bÜúDÿý^`Å7÷S;ñD®L}mq±&m.nt–ãp€ün‡jð±%.ï^´Ð¼;Ìͬú>…+8A‡=y³!”ÿѨøÉßSÑÛd‚ëûù÷ Np§È¢vÔ¦š|N_ñPë%áx ÞI¹§]t§\öa'5éÌ" ª4{H [7.É+[Ãý¡èÒ!(v%«â£\ê œ"Í¡u(}ÍðÇ;JH9lgŸœâƒHY¯U;~~ì®z™Å¶åÍBç´B…)=šKq%ÓÉÑBåùIád5v6+ToéÙù‡öoJG£ìße̯GÖ;î ÕxBÝA ]•þGÖe‹xÜÓFwÂk4oúùVÊ ›6¤kâ¨'7æTvq’àîÜk9@3[SQ¦ñ¿1ó¥s ÚSŒNˆÌ½õÊ ‚Gc`²yøm…Œm—ƒ¶Y,\º¾#*“@oU/…Àº¢xª[‹šæ‡91`,EvÐ-@ø„”hÜ c>dó7Üðþ3«Ì@Uþد–§Dù†ÁæÖ’¶[ êÚku‘ Ýüt@"ˆóWuðg¬ÙåÓ•[–ý¯'ßH³L 4›ùgƒQ[òž’0Æ DzOxѵœ®*¯íÆ,2þ ¶\ºô›ÄÑ„ìð‡ ó sŽ»®Tc6êÙÞ_Ê|ÖÿGa§pT°[¢B‚¸r©+vù*²%Û+ù<ƒ *¨¢g"¼ªÛズçÛG½> ÙL»Ï——þ‹j k eŽ[ÃðLBû«ö¢Öß«¥ÞÌ~(¦‚Qú6´_.1òéYr/"³sƒZÔÇ? Í•^ÁA¹¥(s“ÆÐÌ<#°õcé^Úñ$P>L{˜(®væ>ºå5ã@RÞU͘VR ä•i,ì=)_œcIKÖäËsfDɲw2dY€7ˆaö:G*äO5ˆ_R%=S?;óìís1ã>É”x•? !¯èÈ››|rö)Ëç À‹ikl‘ªÍº½{˜Õ†Io…}‘ÇÒ l%Òsy‚¡[©N0w„²ÖÑ<±hÆb¾Ã*< &Æ`sžØLŽl±“‰¸G¯´ü£™…xð¬2VÏÒçêú½û*Jþºþ PS®ˆ‹Ýzûhò³ó¬^PóÉ­HÚèaT|j}›cJ\"·^S@¡¬„ÎYêà31=bèx³¼MÓ#Šåôbà}Ú  ¦S,AÉ–n'ź‘ïµä–*ù ’ïKî$dký2CŸ.·fÉ]üKÛÓtæ†)ÚïÛ‚³c(ØÞ`)òõ»¼²4Р鿢à"k»B2n™¡òç-Då!\³t4ø;!l yå¥Ñ„úN;¹¥»DŸ$~ü³±>Z,œ ë/Ù¥Xèâšî;5äèŸ8ºàáVByÇl °v%8iWL.3Š*o¨6¬ëúµ|tj†Ðá8ÑÍ‹kKÝtJ`ü`] ½#®°$.]0®”ÜÜÍw§ãÔû+Ç• 30+¼ÓLÃ\/W'a)ë¿°f<˜SÓQ?BQ ´Ùu,í ||bý5ï\Ÿ÷Y¤é…Œ— ‘£ OÂV/xñw˜!òN"µöÇ×Ü–žÖ¤Ü0TÄõ r·+ë Ò2-ݱ­©jág|“®rê{cÜe‹—«FËÞy¯ÂHÐa£Y•XÄ2‘£Š:41‚ð3¿Ìzwv´x€¸µ^¯ço ëÆKB¢œ§û«HÒL]=†€œ·¼Ë€WZ Ò4R/¤Í¸N3ââæ5Ϲ3±ÐãlÆ@ÍÈ@½ïLfXÇ (\(Ýô̧Dì¤4¸w¡ÆrؾݬøŸ¸ŠÍkæÛ;,…å6{—Ï™Gé0#ÐÕÉ›£.û›è£0§Ý-PµûD×<¶ÏI¶]'éÓ[ 7×’K½ÏÈh!eéë©p89!oZ¼Þ× Í5](J¢ð Ò‘ßFCì¾’ÑÚÞÿDÒšåE[8C¤íVL¿hà„ÄòÙ†•G¤pV%ȡƮ¨’µqk`³!&T23PgÐÚ±C£°˜©$Cø¤w5ÊܨÀÀ£‹¤‡]Ó:ÿé—f Ñ€1ŠAؼ†b£³NŠÏ7r„þÚ 2Ž%øj/¼AÍ] uŠ‘á+ØM^#F†¯x³Ñg£ çGÉö%k©ü¢—×bö—5nOulÅãà'Vo»'°M˜IBå²yË•&ñ휸 ¸V{/‹à,µ%:èŠÊÔðP¡¬ì©q{=ˆßÎù¸o]lO%ƒÓ6„fªyUÆùf8&®>‹sM|[ø€;f,ó3Q«sD¬†×Îí2Xæ‹K0«¸ÏDx¶2àIiÆ5 Ø’0¸ðÐ,,(R4úú\3öç;àc&Ž÷Z‘ÅÆŽ!hz­àgg#j¼Ä–¥œˆZóvJ»WO0ðö¢)õ†$ ˜CC4Ú¦áõK;ÉG3•®SË©ùŸádhǼ\E–ÙÝt?¥Ó+ò&–%"šrÖ!„T &ŽWË“°à> ôº*© .¬%ö Oµ v½‘ùº ]â"xÈÑX~¯¨^^ÑjÃ(ž×îoc'>ŒËzÊPÀEáªüÎb´oÍR—þ‰Ùàÿ¾FbÉüR7sm‰€—3… ÜO¢“¤¹fÛøb\ÞûœÝ “D÷åC ,™ô¦isøà ž„ci Ã"‚4d2/Ö×Ô‘ Ù,íBO“>q_4ž‚yåçÖÃ*€­/ÕÿÞ=ˆþ’–‹Ã²Éµu,•Ö¡ö»y¢ùÇ‘õ #áž{U VbSztË&“ŠéýûÛº?Û`LdnÐBF ÄdË: iüƒNlˆ†å·NŦ»‰ažôl!#¾K“Wq-M¿87éóB¿ x`^ L燇­‡5=™-CøsÉ¢b)ÕÅÒo„9£ö¹M-(¸Zø‰‡Ðí­ÁsÏ{Ã|]éRé¨`U"T‘¥ò#ýå<ØöW0?“^e™»}CNÿØäã[ª äH6QÌRû/{6yõÚJùã&mÑ%†ã¥ • ‰‹ éâê? '€ªû)z²F%¥ª|ðìòn.(ÞÆ#Èñ”ßQ€dõîœ]¼6M®-RîËf¡=nZAáuYa)‰±8’‰QHZ¿Ýç5Šúd«¬)·Fà¶ÙO«’¥;Ä¶Ê €,£¦.57JÈ1­GÒ«ÀŠ&=cVH/ÆÅ<ÌWaCØÖNN¸MŒ³4±/õži‚f±€¡ f˜þÊUäf¦A)U˜$ô)Á×bc—D—íA[)Øî­¹®êæËÌ÷…ßÞý ™åõIL'væ⺨¯çEÜd×®žŸ¢ÚüÛš1e¥LDĘ´iµ „P¸µÀÅùÊ÷¥ faï;‰ýMÀzÁT9ßȸœÜ’dOz  DD§pÐ,?‹(@“Z± ¼¬–ÚÔóýø7£%¿M+ó§#ððªOQ85rMÐK.3ä”ÒW·—^Öu+"*ÙãèL_+, )í±ú_cVe Õàñ+(­á Åi½Î¹æí/°褸ª Çmîa»ÀRß÷3 e‹F:± ád¸Ý¦7ŠÙIjÒfœå;‰ÁøXuPyå¤AÞ¯IÂw|̾·vXoò®Ê$Ëù„ì|Cõït}¡¼| ÚI¢w²öPUlDy1â"ŒI¼‚nß;[B&Ñ%ª}¡âÏ€‹<À:= 7Œ>þ•ÜÅ(H½¸èÕÌ8;how),š=ôõ“ËdéŒrø–c5¯ÄY–£¢ß€ÑÃÙ÷&€Ã¬ š¶:ý^L¥´ I!IœMн‰ª-*D¢â˜Ã|ýâß­2tùÕ*öË+·jž4/¼u¿)Ÿ[›-PD[|‚éϱh”U/%êVa­gޝ1¸úD´ ¢‘¡=G޺¾G¬ d÷%¶_²¶%é°³¶Ii ¬/]~—§œyºáU˜@¼\¸iæëïw³“šQÝ`"òJ4( 3}¢÷ g¤+åúD”e˾¼ @Yq\™¨~ËÚºµ[¨;±ýAoÓñœ›AÚ±ÝSC&Lh@JöK_ŠÃP}¸öN¨k MNCœa“Ö‚W;/´¿kIã–sYšl»ü`Ž£Ág^ëŽh•ØXýˆ-CÕpµûá­ÏVÀÚ:Gó P,ƒò4ÆÊa´FÔ.A˜½™5¹È¾º­$÷™Ñ¢;éfÙteÒ¡tC6¿÷L¶A{èµ`®Ž”ìÉÐMñ°¹²&n†4L΋iOC¾ú°¨LÈ$A–ÇVé† –\¯«WešxÍ(Ç4 ›Ä¸IÃtÈq:‘${c œõÂÏ¡âÌõš‰ŽÉ%çH\éç i}P‰M*ÝSæ[vš`Ÿkû½ëöí\û­Æ¢Úªõ mZÔ"©ëšèëÚðtù•±)›mµ«ã%†œNþYµ­±«¢s*> ‘Ò¸XœpyCÚª:ì¢S–¸6oµÄºè7l¦l —tÈ[nŒûQzà ¢DÔÎØàÄ Vs´]¥yÅ¥lzLå·Û:¹Qø±UƳ±pc‘mçˆVå,à  õôDC¼Y¥.ƒó" Sd7Nþš¿YÁãE3¥±‘èÏÜ·x³‹Nk<¥Bî<qÊêVãhÿp%ÝT0Ô‹¶‘FƒóðþGí*¤úÖ©·Á¢Óß<ìCK6=€"… m>ZãýÃakn>+èîù´}l?½:yiM :Á×,–ãèÁ('ÛÖ ¾Ê×ãûk£ã4}’ò¢*æ ^ÄýemȺÆÏB|Öd4¾²Ãc$@ Nñ¶šoø8ܱÑ,£0ØÛP è_FvdJOí¾Æª‡å§Gì…öÑR¢Ü?¡Åé5Í}G¹úë:ËsZ¦!«È§ÇÞ¤~RrDþòrßèÝ\oPðÆïÀ'¼=a}Øö§Ü§É†`’eÄõwU”gzÿÊEøa½ðËÇÖh~nØÕY.[¯sSË^dŸÙ”M–âƒLj]8} v_Ÿ}xÌD|ΔeK{V;Yë¡!8—C« ð'íñÙ÷¸êf[ê7zû`<ÓhªóžÝU<Ö!)#á_¨ÝvGT±¥=¸?,ÎÔ’.ˆIoè^¡–™³R†Þ¯´™.üs=^'1›ö¶ƒ) ²@c—ÞTºrØ´jɆËo‰Hª‰¨œpܼD%÷»m<â–¿Ð=.Ž™ÄÎB ì*î)ZȦgR=L½K`} \XAÈÃ@¬wlÚÔÝÆN‰ ö/ª™zg¦×cKp¾û“5ë ºhÝÏFƪ™¼¹ Å\b:5ì$2zÊc9ÌÆ¹#–y/Éóñ…§a®t{¹Ðñ"ãçâ•%çœñ™mŒû˜œ«câwÌûýÓ6ÚS?€ºU‰€Hð+nu<ù%È‹Ûs[²öìNÁ ÂE4/œµ]%:YÍz’†=Š(Z¿ºK¸>þ‡M½ˆ&Žd=ùº'ð¯;»%mŒ5@>h<-“IÚjA´—=}y˜qd( ÇeƒRd }ñ_…ÿ‹4¹ÝO…eÌ>aÄ!® –§„ú çZ~í FaÈU)7ô8R9Š]êÞ=øøOž³xì.¿_uåð·ËʂԀ·xùœIKþJèè@ßcú(3HzÑÅh‰xr¨¹+ëá˜GÉ*ºÆ)Åš¸ûÝe4+ƒÞ^ǃ¢×¤»–•û§tÐÜü¶º*µ™wZítÕ6Älñ† m‡epC÷0ÅÉÉÅŸj5·Ã‘Á±‹.ÐDÒƒ“å+ÈuË>ÔœôþŒê’à¥Ë|áÄK{†Ù-üÓE‰ÙŽÞ܉ú¹7 Aµöjý̸ÂÈæä‚sõå”:½(Uó/ص‹zEµ IiÕbÞ$ ‡ÆLúD·ôˆÐ#ñ˜éÇ™M‡¡e)uý¦ºg—B@`ëPž¹HÙ›È!°¨pËôYcÖ… gæóCj§C]Ê[R—¸¯èÌ §9zØÖ&—.0­Gªw;û”V<™¶Ý—•ùv“òÔžh­|fFNVN:äª´ÈÆÃh¥7›ýæßÙò~Q[T0ÇðÏ›YÐßL<mP yêS1鲓íM©û:“TÌRÍw ՜Ϥš§&F s°KR•ÆðþGøƒÑ…ú´ž¦o@\y_¡°è(Û¡q=‡[ëçõ”›X4Ò$ò•^œ†/±…fÒ×u·Ýºë{HeµÕÍqëÆÏŽ©)œµ>ÃÖßO`¯I’Kð*ÖÓYe@ pä¤p mpR§*¤”£ ÞYdö7¯”³ˆ‰ ”èÑ ʶªÅõ=wÜ=¤Œ¯ÓžÙ%˶µ·&"–¯ß2›gN3ËÂM©×é꿼yΞG—WKziŒ?îB§¶žFž§L§Ç.á;7ÞúßÖÒ’ˆr¾9›^¼âŸRJy?Ø‹ƒÂ L_›p?Ó“¬æ&cÖÄbw(Uj€:_Õ1ú¹+ó¼w ƒ¢R"êi:»Álô¡ä7꣓Ézm3÷¦›Âg›•÷Ôiã"ªÍú–Ó5žxŸÓºý6ÝïÜ4nSp§‰M‡TŽFã±¾©›]²ˆó*ö&`ЪEþ`"÷ƨў.| ,oˆ{V4«„*ÎMã:¨3ÒLâz'}œ{,£ÌÅMfH#n¸K-½OÄ(Zà¤mɤšBÌnOÀC²¯ƒ›3œ±Œqu)ÃS—®ˆ¯îÉKãFݱƒô( ——ø­wFXBæµ®›¨Žº )«àÒ¬d4ý‚´ c¾ÝàxÍ9©?*šÜ…ÒrË #¦~1ì†å±~ÉUÎcß?€&³”|ó8$˜9xÐmÑÓðÒDF¡0•]ŒñXÏD™÷سÚÜõ„÷ñXâ¯Ùµ&R:˜ÑSFÒuø’üaÉKr|Í÷ 5¬~ï½ àƒë’"D»Q›r6ÖQšÅfM0´ Feh‚²½tS)M«<ŠQ¸8­+l !® édÏ&T\}£°×P²‹Ð€HðŠ!E´úØ%O–ñæ¼½y;}íhù T®4?V±gÕáTdÍ 1‰˜” [·F!'¶ú¥I„ÜôèëÔ¾Øöé³u›œÀŽ}†cR”8]—~ý3p~`aÿ›Û×ïÿÎ-u¡_çøÍßBônÛYô讬X'ÚGªGíâ`yôa7óôó³ÌFǧÂ8¶=–ÏWÇý¡"ƒž¨C‚Hp‘ú.œá©JtzO_ní>™r‹¢\Œ}’IsŠvfÍê'‘~nîçú7AvrH—²hδk•ð#€7èõ™ÑØ3j7]39îûÈjQ`ž) >UjÈ‚…‰Iý¨qUõ¸5”9‘àÜ; 7&õË@ø“Ý(Zv2€`6]IŠdº5zô#MB¹ððC\› ¡1éQg$+”çùf ·&U؆r!˜(\zà°[D#êæf¥PIø+Zo“øê–ŽÆmlolÔYõë–ÕÍWÏ=æ.ÞüIå`óªS·¿= >zvo`ƒé ‡$uâèõoïc‡ã’‹›mŠ~@¶”çäœì3`EÌ£W‚èÙ÷[ØÃĹ «Ý"Ié˜<ÅäˆHå£ ±4Ž’V|ü·Bp»ïnTÓG"U3^¿ÊL@)Y/TY©ýMÌ’j¦[øq³?.«M¾e¡ý³“zK¢&x®îÃó\rÁ OÕ±…4UàCE :rOƒ=—øAZS¢*ÑvH‚aÍz®¥üM9Y£ÍÊÑÐ9/Nê5ü­L…¬;r½ÙIOx%Õ­NÃíft€þ=.eèàŒP -µyû G{f*¸ÌËÛqÁøÓá.Çôå/éwåÓϧ=Ö2W2t#D¼Òw?–c[ÉB°“°9p¼ÌéÿytYûÙ„Ö£p,sôApYôo­‰™Ï h¾˜Èÿch¤âß[5Áû…ûxRÐ8%îÆ®ÞÿÄ}†o²6ñçÄs²óö(pc<äÖ«#lÒîÂ[¯!´†ƒÐÏýLèk½ÖÃårÛì •øxúè¦açÏCh+ìÁSÉr`J¯uÜC¶Úr¾^ç¤)Ó„¥AðGÃû Ïm‚žÖ±æ>ïfÄ.ÓG6 §Ó·ŽâøJA‘>’F1ghv*!̞ʽ¬ß ™¯mhÇ7ÛFsðAÜ Nô[]*m¨#E«ú7Ú¼6w¸Y©es8›(¤ ÐøëÖpXõîH ºÍ§~þâ^hð¤zq¯‘AñÉ}—ºQËÅW%b·Ûgz38ìD©œƒÙK̉?E…<5=…þöÛxåb¿8æ—ò‘å?O›ÞÆ?»™™œ£›³ÓÉ­N£.¬9äÄy šÆK˹—Vþ¬å_VÙ)¢A³°mTeA YȈÈýM_.”çQŒ—TùO¨g„2ÂGŸ?J'˜èw±ýiå´í¤f¤ù¶GgÔPr:R_0šjá-íQ™Û7®¤gLÌa¦'àÂ`‘óò‹ùx6B&¬Û^±sâ+ h-›x)þžeË{uÓò·Ä÷ߦ›òu¹¨×ÛXθfü“.æa»pWŸ6gfŸ±›Ff;[½Çu¿L’I€¨Ÿr\ƒ=&Lp8äZY÷t´EÖ7'ûL©ÞÔ¾è4ù_Ò †hç–ö¾|³ÜOðd©Ò{“8þôO’B.», rl3S/pg—‹4ÄÜ{m‘Ù¦çºAHþlfŽwyRŽ€îß,¾wk‰ä%tëG:~å"p‹Üno9õ#CÑ,8~í’ò0úk¯Ùw£q‘ôúíÛ ôÑ#PT¶²Ââ(Ô ÉÔÞÍ¿A l C3öa´1¡jÝÃÌÎ`Ú ;Ò>2þFTÙ餅nIË~¡ê Ó˜µßkËɇJkÃ\¾hÓžÅ9ªëµOCùóTýcÙiË#Ñ«À! û9Õ?&ugâ;NÙü¥Ül¿Uæ APÔÝ?:;©Ö©``×ÑíoJg^ R|ûWy±‡$Š£ý} ‚3ÌÔöKƒÔ`槸gªEΑTs¾5}§3ÿCÿ[þÏO«=wN¨,brL‚%nCgP˜ÿCðYÁaÜ5'ä°|ÿ¿Þ§‚u1øWœùýný1ì9ƒu><ÄÇø;Cà?PBý@Ñ¢ðOš—u”ú@Rø_´ ª 1åJÎÏSxö¦R7ñæ‚Æ @éP÷ŽA–Z #ÒOaªITI†˜Ò ÓâY³f:Ú†Ÿ2Â’ >DNFqÅǯ8ÔÜ¡Å(­7ñóÃJçòÄéΞÁp8üáÏÜœ¿¾œXaR«mTñ§=üܘÛâ-Òæìõf—´ÿÉ3Ø]ƒ|Êœ‚/ÁÅÔÔX†ÄR:"ÉÉaînSn†´;oÉG©Üv”xšwǺU¨…^¡B›÷sΑb[¾‚Eבë {â¦f¯Jy£^ï Ý^òBþ÷f £™K2串Š8ñÈ;tÉ©Ø*eðO$7G+Vžp¿I ããÈÍ×þÉú$Û¹$ÈþZd|Òu:LÐù;f’6Ý­žÉàFha:\WäG€šb¼<À¡¯·vÐ L3'k¯M¥ó¬¶kN› èEÄ —H&n9AÒ°>­îYÿÖ¹~ÒÃUó•®y~a[r¹Qìõ?M¬.ÛÃW¹6DDú<±yÛ±(n¾?Cm¯ý0éš°rñ¬°-^Q/¦°6:óQ‘âÿWÛ]¹C¨³ÿlŠw×\oK²Ÿdu¤ú§@ J‰úZgJŽ^Þ­S¶ïÂ:9’aÎçô_‡|Æ_'…O±}ËßB±.‡×$ç‡ËqšF‚éDã$1ßôüÉ 4n+j/ˆà´ÍS3Á1 \ÅèÒÌí-÷—AvHø'±Ÿòô£ò’U58Ù9Ä©~<Ú‹ÀÍý”î®Ïa(*FwêñÕý»GBµå`éÝ>';èÎtsŽüªé/$Sc,cš76(¦n1`ÁÀÖS1á «ia`vÅ<ç$ç!òk[L7弡4V[Ò#µ«„O¯:M’Éný|e=„Л!…úÁ©Ö\ÁîÈðÑGžÕ»œšS«:Š[ïÀÌžYd{ò5øR[žZ Ø@ò]_îýü#ÖäZ;0âõº‰ J¹~K‰o0û®|0ßW)ÂYiZ9 êºõÕ½™ž”HAlÇ“ý4{§K dÍxƒ§^ªUؘé^•à/1î§*]¿m‡§EúÁëÙ“Û¥‚¡ðy• €Æ»Öo¬¼ÄŠÿ?§B~åM×/Ds¤ôÕµ@K*|ÆÙa÷ŽÍ¬†WPºõ™?«NüŸÑG>¶~ÁÆQÊø&&ŤE«NÅ®ð˜2o>óa§tK«Ó7@{fN.ÅLAJbatè†@~4—ZèÜiTI<ÚCX7! iS08 _H=û½c•[“¼é–Îssª¦üFá·ŒƒðÉDurRð‰A÷–’ß6B~x܂լCA¬šœ‡½{Ëà<ã]Ϙ¹3È¡>Û!`~‚¢Nm9è© NŽv-—ƒBïº^CÅËl©7‚L}e £ÏÆ÷i‘ÿ… œv) Yƒ7ñ þªìêGé’rˆø a¬Rá]ZJó„å… w"ö›ž<ûñ–3dÆÚTöWíЋì tÍçÏW/> ¥}+§!?¾èÍðãàímåË4„J×Ä$ª¥é¢•@ÿh»O¸÷ÏGªÕà$ˆ¤A­@ÿGy#³ÎÊ®õšœ1ÇOj…Úð{dûØükàLc#ËEΈ’~GC|ÏB 5’¤,)5²\/_EJ»`ð‚ŒÀ‰\»´5u3“ØÃaó0¾òV•\«Âeç¬`:€Á¸µL’An:Hýv£PZMšUœ©% áDä>£'Q9€ŸÀ) Ó˜z‹§÷ÆçëzÙ ½EŠ[·œ,)s¸A*{[Ò¥Y.!µe/úÕ½-4lª˜ã§swÓô‰+ÄÓóÓ8@¤™· ²ÂÛµ kPÉ®ÆÎ(KA9ä¢ó‹GVê&£S/»“XDu"ÆKZ¡ùˆpp¼vZ˧!gÞ«²ö* sM.œ)W¶£œêgÚ#Ã/Vƒ!(ìÊ‘iËl~Ç;ãx%cU42!]Ÿ®Ngù>mvÛn3F± š]ú Åútohp~8!—FCÇZ/»1ÀùRa{:†qÕT*ÅÞqEÖï*ãêßS|§~¸ŽÙŸjy8BãtÒô µ˜¾Xç•ò¬éà҇ǜY·¾œ »ñçÄ÷öWlˆš±žÛp»&Õ±!Vë0“ƒ²Éï!õ䥚²X¥Þœ— ƒéòiJCX‡?’âô æ®ot’P” ¬È¦^¡¨y-ù'‡áÁ¡Mvÿ{Å“Ðã9-ÞõæM›xc Ÿ,¹¯“k•F·2Ôjñ*5EF©ß£ÄXsÒJýõ›ã‡Ïp.ƒÞ“¯cŒž;üòÎ8‘ÿ%"îQpô¯5é²(vMA:›ŠŽBž»tèÛõÀÚŸê(¾†WÙ‹HÒE ¾É/U#ð_” B­óe: êPÙG_ì°Ó^šï5®Œ Â;Ð5&pÅuy:q3)¹Í¾iy¹Jzí<5“~ÞQIe½ç™1¤aÔøE~¿h>¥QC±YøÒY-ÚÈ)˜MP^òxKdæAj º Và‡Rd½´Å5wßÁΠJv£6™ Kˆ ¼‰Ak„Ó –ÆÅ[NI^׃rÁ’úËÄ_ü)çðcw_,8èh½°ñŸýPûm4„é~7QqާO*ç‘ÌØ‡ ÆÙƒã'͹PSá#Ó˜>"|oõTI4LN4tÑãIá$ùÁˆÕ+(]ߥ`LôÜdºµ;Kݦ±d ª:…páê-ei‡œÊ6¢£dî‹“YRH Ç"÷’ˆ•‘’^Ì󤫭Áÿ¢±H{ äYó¹X'ïã½…¸õ—G•źñŠ®;IºŒK9ꉴ2"kÇÈ–\CT3ZIhô–-›Û¢o`!^¿à¦OÖYŽûjð1F0U¬c~’¤6*Î]Ûoßxû=°àÔ¨úo•Rñºõõü–8kW²Ï¿Û#ù-Teruªm4 s#<«Ä6QÓ¡Í$–Z´ÑÔTëT>ë꓆×jü°Ð«À¤Rñ–RLÝÃ–Ü †£Ý «#GÆÎõB¯°A´{,;µ8~¾~wnTÈe·ÖI3Œn°þÊ[#£)õ ¨ÿ vºÝîà@¼¸Dx—nº}’ +n|-iòñÕëÔcŠˆª”k55¸lÒ7Ùö먕kÜ/´“"„Ù\_‰P°¢u‡šÕË‚`.­w‰ª·FÊazË;ëœ@7]¤>É4ÿ̈.X]v£!~F þw&»¥öâ8øp ƒ°±Ç¢OèÞ<¦‹èÀéz‰ÏÀ|zôƒA? Í…ô6m¶>¨Ž¶ÙÀÁÔ;ct»³Okß»2òéé6¤Ušp|ñžK“<î¬Íé×Á!,õïÓhC¸nY>è-ˆKƒù‹‚™Lj¶CÉôm|©ëV´’L¿ ö”# »$—™ &»1ŽÚœWvÔ:çKáX¥/±¿¢‚ôä|MÚ?¼G®Tœ”ÛŒãyEŽó6(ú5ëÞRÉ5_\ÀhPú²Ê4w´öξT¥9öW$®M“v–VzÅMí ò‹Ï€Ë‚2dsýú×—¿(k§U9fñëué›v²ëd]bß)g³Ã“º=–ýÂó!l¢V“’Ýö¤!i nÈ– À4ñ²ù‹å¦$˜žÙÖ ¾³#ÌœºÐt¦>Bë‘<æœ1‡êt)Ú„Šäkç’:©9]ƒNtòº ¸ˆ¨•Mþ./9uå›ÖìÙvp‚1—– ®ý ˜Ä´;œHjA%ôq0 ÑËßW¬Ô#’šêXɰaþH_«³\t¾ÆŒkq)¼ö[Ægy]jºñ1Û¿˜YëÕÉaÏÈ+Ýòùö)ˆ<’3Áéa¬á}qÚÚòDRاʸ²ÐqEwHÕ•±-9:…Ýç`l7Hy%äsïé5°ížXÅ£F”cëë[Èœõ6K«"¤•E|p=ÐUWc†‚¼§†zBÜjM(‘7¤Úv®tG䨚¬£Ð«f{u0!€‰ ÷ÔBAbà.YÆøë†A§›Hÿ°ÆÍBÜÉ8Ž‹;¾è ¶GCEÜšsu^¬‹!gµC*‘ÿmìk¯þî¾-¶o<÷³ïñOyHx Òæ§{ØñØ×Å7ù.Ñ}'”«wí†Üæ…{õŠ\qO8,¤ˆpë¯'è}z‘2]¼Ì“…üû²ÅÙda¹GTrRîЪ(ÛºzE£‚â+Oåh,<Øn ’·í¸x`—umÊ´?Ádð|vçz÷E|Ù÷yrÊ7ன¿$°©ê¾*Å}tkQÍù×§ ’vgæ7Mêà@q3!£xÜ xÓ­Þ®¨¯bB‡KMÁ¦•| ”ÆqìrÙ=Zª_2ë: À_«M±Ôçe8ïà\9Ñ1ÐíEiè§æ‘Åž¹¤ Û ¦ì7õ°aH©3XkRr½¬‚´, 0Á.Ÿù—ŒÓž 5—9–%” *¾Z¯™o5åVáœÝ’Võñ 8€)'U…ˆ<SñÈ×MýÀ¢­ÀHæ?ŠÑ®ƒ»¡]𢍀Ӭ¦ž™ž*¶ @ʤÑb ï#Οo?%»|¾Ü%3ª€Ó_U›j1M÷DÆÆéÐy t Vº¸wý¹È|V z u7Eü‰µ‹½næÙLÆù¹Ò"d·0Á3¸%™r}gÃ3o1Ë ³I•²­[4„P à¡ÑÄ]lÐú*,ª‘e¥8Ñq‰_ÛŒ;R±…³"Ýh¯Ân¤¸;9Kœ–» ¹A‰Q=%²”©‰¥Á_1§L6PVź„H?ö×>]Þ²]×=Y…\ꪑÿ¶XéÚ'poëW$øF+›ìÒWM6ÙAÐËÛõ6ŽN\K>Q¼ œ›¼É’jq‹´S“5É1  “´<~!‹l5.ã€v~Ž\£€ßL3"Š[QT2›qrAÏp,jdf*gsP÷Ž‘Û>Ùì#Ý\?\¬BK—$n¨âÝã™´êTéo*§nË>†jÒngÒÔk =UãøµÝÉ“oˆ„UÜÏËç'Ðêß°4f|óÓ!ìc'ê—¹&ø—0{çËíË}¥XîîѹJµ`vùE…3¡MIôNtû4Ò¿ÅÝï?,øW/‰r9x§'â†ÖN®g¼E÷©.­¥ý/™ËB_È“0{€êÃ0ÀAÀõ¿8ú6[‹ÜîËd’&­2¯ dàŽò*—™Ì.‰}¯ªÀIV3äˆ1Ø|º¨Å/»W\s»Ÿ$]Êc_Oc~‡AËØu@¯ÛÐY¤j>צ1ï.%šY¹×K`ñ«ù@ᜅ«°E’ˆ¿ìI;Ⱦ)Ÿ!7KHv¹ZêîjŽ>þŃrëHõb› jU&q×Hhؾã(a æß&…ljdO|:óLêÅeÂÊû:r¹hs$¶L‡ç¢@ü%dd4¶egÂ/sÏÂî­B6˜†C"*åb‰ÅÁGƒÍ$–Å0$AbP¹‹q‰tFÀAÁ]w¬ ¼¿@’íì\3<_'jæêÙYàt`ËDÁåšÉW„ýO£9*[z¦ûaz¸¯*ì”kðIôNî„WFƒ’è)¬þ7¨™ ÖÓ.%²•·Èñ1ù¿³Š^&ð–}õÛô7`_‰Âª§Ç"]^àÛ&ÙoD!€F[Ó§“ƒYÝæ«DtÓE«Ž^ÖJ¤Š©†5ÎWïs2ÈEm¨f¶ˆš¸[íÉÙ©cÚÒ@7TŠ”åÃÏ¢¤0¨Òh££Í;1t+ÍÝAXc+§DoeiA*†d6š ¨wŒ²4#ˆ‘§ÌOH}e[[‹ ú_œl4ï+LœÙScêh•ÏÀÜ'X°;h¹›}ÑÛᮃª”0³élº`zØÒG÷ÒŒæ@õ½2Ž[êý]Å {Þe.w‹õmgÞ vã2±!_Yþ«å.kAvfÕùñ•Sòæ¥f(“åf±Œù'nûrú}™æÙ¿€ÑÄqʲóæC²Ð%³êòðß “TcUrZ9È$Ù.M7 kϱsšþ,þ›½R ¥A:±¥r"Ê@•™iž%€Ê"Åq?cΟ…$A¾®qó´~Hï_ƒðF¥DøOØŒßè–ãúû_›Ç›VÖV!ÍP;®ø+GR¨žkd`áÂ'Á)kLpG¤ä¸eÐ Orc/m"ASFÁÉŒ*Q÷&0àÍú©… ¿S[¨‡¶‹Z¥à5éÛoṓ¼áѼM÷^Î63„ä‰ ÂÆ£¦©²êy·ƒ%¶Žð|Æpÿ0nɧ„2»øW¥a¾ h¦’ò›³ƒq³œ&¼HÇqg<ÉôË£·Ê H2Ö.ÉþUQ£S&ÁVRùò¶¥ÑkP(À²ì| ”ÌÅxT­?t@“¥ÙâFl}÷Â_ÂOÄ^ö\þðí¼"ôõ ‘þ“Ʋ™Åø¤˜œ87ŒÌøŽ„MÛ’€3Çé1±X1±Ð’)kß3÷v¯p( æ˜zQ\.v úCĦ)÷'žÒD™,%š. j =Фõ¤xPúÃi]¾Z…-¡P|$Ÿj¢ý®¨å˹8¤Ðí²7Žòb6ž»NJ¹VŸØ2]’ñhXõ§le3]äéÝð]«¶D¥~L`ǰ—íE‚@rVÏg wéPtœ˜£rl`šdŒpã†mBÝHtü=gŠ­4^î&eÍùYDñÖÞkrwKÃ%Ì•-Htfœf~r.z“Kª&@ù0«¼÷îÔÝÖuYÕ¨ÜõlÀ® ;ÙQX&1¦CÚöé‚¢X ï”)å®B©ä«V,P›åb<óÀB•Ÿ×5 8qåHÑ69‰tÌ÷¬þƒk²:YŠíó˜ÅN‹ §q| Qõ30lÎnkØ$ãª9ˆÊT·!€#ŽWO)rªçÌ^ìºòï2‚·%•ã¡hœD6£Áì¨-K¦ÐcÒzxÐõ@1› KXænÂ䕵¯‹žó`öTŠ™¼·U’$‚4ü3ªlFbŠlK8D'C~Š5C£ŸÉ–#_Psä;urÀÜ D;M— u•´#`ʧ¹]þ#Öé$¡Ÿ}÷mü± 0«9“LœKîÞY¶|ÊÛOß#Ý©¦ÿéÇ.‰ÖõmŽraÄw$ãi¯ŸÄÀ¶A¨°¹?'¼TÎ-oaÂO_dqç`”/ì ^BbD~"×úp»ôîâú„×Kõ®ódP^i‡•ÌÁ(Ê ‚Y±!Àl8¿‚¡¥‡hC—6NLWðÞ{ì~*!æpÜ gTïMÐÌ+¿“‹?Yº]¹w»ú/d”»Z/åŒpØÊ†øÞÂÏ[m÷â–S§•;w7nJi)aÄä+ë3ΡÛFõ‘¡O[Qb| OóµÊ Ú4ÀS¡qCÇ]ˆŸ¢³]T-7 ŸÂ(YƒÜ™#rÿ­ä•u@Ž@·|#°!FîõfP›¿Öj²ßW+09D>Fë0%b„UFÕ-ÖuSfö§dåß^Ü0ržºH €á1Ù›¥)†€N"Þ΂éoèE\&J4øáÀˆ8K­¨Û'nËSånW´x2dG9I„li4ëÐÃì¾:±VçNÃcþp»©!"Vo|£SV3ÄÙ8X™”úª'Ì®RgmáÅólPÕ“Qø$Y¼lEP Á‰MSŒsv –ÎsWvÌñn)¥.,¡¾í•Ô¯²ÙŽÖàÊ%s_å©.½DBìÒȹ£"þ¼Q êÌ>h)â 1€ZÍfwOy‰Ànb@ò~9Òƒ„ {mUä}zI@¬•º:,æ×?iµœæè9¦vŸÏÄüêÌ 'F@Õý.S»$XTdqà/òxþ¦­x–*m‘‰¾w2ˆµÁ¦ §L)JØd+šïpîë…Þ | |0ú#œIÙGÌoÃëø«‘׋lV¢xnÕLÞ¯ÈO%@[£…ú[šž¬eR©JVÞèˆA‹<ôÞ:>>!þdñÖ“¡äý.í^èc]ëŽç/è8Z¤AFÍË.kdž³ ’ÂnµÏ컵°­¯&T¨ú8ê— ã·ªºY`8&ÆÐoýêç`uŽ\L3†s;^m•©–œAE¼\……:&bÜ$‹ó|æPsâ"£ƒm$Qfztž¸+FhÆ F&mVg5ý\ùK¡5ÔÕM¹½Ô” º{Í>CFz‰ÎG4ôŸMI–¼×… µyî1sÁ½ßŸéIóÌtìŽ#E?0/31È+uƒ­5®@­”ÅD¦a†“:ë_/ÝóxZ.`%{qçBªkqä-`Ü?à;>ð„n›Jòk5äÖÌ¥Àwš–€lâ·ÏQq†!…d…Ø£iG“¯Ö¤ÐK?IZ©‹¨€ŽðJ( cÀŒ÷‚JKþÎ]tÙ‚˜;H‡FmÕ‰¾æ¤7\¢xþþ{x«˜ÜaX^×û‹Tªãß\ks¨ÜLw‚+æEŽHЄäÕÿAÌ[öÛÁUŠó’~ÔöÔ3Á÷¢šÏ‹8ñ²È„Ìbº‰Ñ¦nWp¹2ÇL7~‡WUºwŒ;¬²á ü4ˆŸ‰37t7ou[Ž­o ´5Ï„†ß¨ä Ù¡±Çužé”_°S`…ŠŸdw#tš÷CÃ…06­;X]Ì;u ‹+ð­èjß-œhIi‹c“yUc5Çfm3%Î3PÆÖ¡u¢YF/ŠÚ ˆ¥3‡“|¹³Ø`.öŸvbaÅ¡¥Ó¥±½Œ™CûÌÞ-ÚtD<©h˶­SÃÏ»¼ø·—»8ßiÝªŽ¨àË–7¶°59 Í¡îM/%?=ÝÖ²Ö²×fGxL+'¢/Aô8¬Û5€6Y5žH'Õös1 IËö÷V¸îBMœB^D+#V­¡ÕY{tØëM¼ü*¿'=f°JeÙn")ãöMÔ|ØÈ©‡ìÔ³•@ò¡ØB†Cži¡¾Ýnïrë4:ö6*Q&…º>fu CÛD»}d$µŠŸ"žãö«÷rc$˜`_/1„ŠŠ¿uWE `°äåcrü#貺PǬˆ&îÕªF®°çF€p ­ÆÉ`¡]móõyåÌ®;=ï…émM{ËJ##-@ nzO™+(ªyÿùUº³ô+FÄñÉ7Sœ@Æ]/‡ë…ÑËë¢L,Ÿ)RÞ]‘9Ͱ‹‰m#QnDZ~>4ìqlPi8ûà¶[·/]>-»Ä¦¦%ø§NÛDÑu#Ï ªi˜tô©6 waµ«:,9óoã®Rh|ÉÜ‹ÓÎ×úÒ]åÁz ]Nï)óÌ“!Ž­z.ˆ¡PbæÐ± fú4j¡4tZÏÖÝF¢0×óPy¿ô©©}2¾-sþnV¿8êÔB§ÇF›ÈH«º›pæ÷„ú‡¢ˆSúö’'š‹¡í5VÅ`£" ç¶&nÌǹ nîº}XfÎVÔå_›¡-xƒŸ’œ•RD ‘ƒ/úL³Ó×› Öž¾†~lçÍ wë¡[€ýæãòŸçûE0pÓŒé,y wE¯@´#µ lÃËÉ0 ÿ"½ R@Ïo7Ç׍ѯùãž–‡ƒdbõ8󚹋b|§JÈUÅÞ$>?Î,õnûy™‡Qóµ.æLîP²Úه͋"b˜Ï$©¡Öä#ÇŒ<‹ÍZHÑÄ$ ìݺˆÈßÚðúÑuü ¾dĈÐÏQuéqÉ—k¡Þ–&EËc~:V%ê¦Ð0";GldPÝ\ö¶$)nŠhNÆóŠ$ 9xzDuù¤Lä¹§NiÒvùãûH¡šô%lW@3wáNØ!oÝ’½"jyä8£;Ÿi¸ 8R~°¬öS Ï}Y*ë‰Dk Õ ŸTã…mŸÆ4R'åõÛbmÂå꼨™†™Ö°mfÊF˜²Þ‹=)ZV¯•¿7^eAŽ™·s‰/¨Z9i¨ª|ú>ÿìU6¢Ôm]÷UcXYÿ]·“b%-âYãFB«Pïc~/Ìú|Þ£'èF4œ:aÛwSm•¹ØI$þÅY`ÏpVïÚë yÕÊ«óµ"U ™LRÕK3¤9ª±{K6ÿ_¨Q­LÉ©Bø#Y«!@ö£÷çfRz'×¹g²¹¯Ï¾I¹Œ€CZïLõ¤@Z¦½sjBú“Á8[bY}?6ƒ`—ùnŽ-ÙDzA9Rñ×™U%eÌÂÚFêÿ;Þ±”n¨ÛÍ%&„;ÉÛQÿÿ¹YÓ5»Ü]¡otŠª@•A ƒ1ØÄÂ5ø¤â=ˆ?mSu»À©ÓçùØ‹€‡f®áj$nyti½S¾¾LWHÃ8•¬MŠ9¼iÐ<4W$Y7¹iÓ¸?øD.œ‘AB;è)­ˆò :[T"¸“«…§m)L—–ÉX$,Û Žºe˜ŽTÏ$«5°¢Ë%mf_ëºkxc"$Ö•҉~³!NÈzì ›¢½å¾Ô+'…ÕÎèÒ¥É+NjŸ\5ìÅ¢Â^Û›½Û TcÊZ¾‹v“=z!;ó±Iߥ՚ƒOR“–ɯ;tÑð³'°jÆòü&Ù&Ê»í]´w– ʆÌâQ‡~ÃÊßS{tÒt\Ïú[7Äù¡û÷!’5ûT$]ÝqŽîk´ÏBÈV£ÌÅ.¤× &&oÑ™ µSh›!ñ²GÄv4O}|(´÷õõfÉÒ„£ªL%HºÕ°­[ðdÛfie j†šP97¾˜ávÛ®à†Z²d˜r®ÒàÛƒ!“BZÉÇÊiU ¬Îk¨ŒvŸëE³dƒ§ë¶,aúå˜eDaÔ%`Ä!$䬪³LMÕ†Ù 0$ô$â ›Îo´ËF€ã’¶5v¼3ÆpÄŸÌYß…ÝÊ‘,v¾³º£™„+ä_ÔQµ#r†û9„ô‰Œµìe‹/8ÞQ~~Gçü}[ÿ†.û¯?ÏQN‚æ<†AùBªB@ÀÆP¹—B+¦îíÞøPà‰£,s$fÖb(=ùŒÂß{ï|{SÜ)ZlD#ŽƒmÊbøPPdܾOH>åšÄQ¾àÅib €yê­}Œ‡~VÕ¨ümÃÜËÏÎÿyÎÉZ‡ÕîéBŠR«15æQáFÒ)à;øß²Ž‚«kÚJ_Ô¢M VeŽªno„ÍmNVCªæWÙƒTÐ…‡¾jçБqÑÐ"7ê®;˜0·<²Â”q¶ $ ŒaÛ­4R’fý"¹Ñ6õ~ÐáJ"=uñ™H“%Ðݨ˜_³ë×]<+rŒTýÔídØzºõÀ^ ¹ î_n²#ú:åí’ã%Q®~ †GeåE¾[Z%$¶;õ„ÑÈAKíªs8"¦8|É’Ñ¢p4mȆÅe#宪z±­Ž8…GCŽZZ‡hçª)¥ö¤â?_-~œv&/¶ì'a Òºñ\†Æ‘[| æÌ~az”¥-Ñ1/0|ØõøÇ]/ØM4¾^E0± ø1ŒS8söÅ+›†œÉv†•ˆ+}‹‰m‚ʘΛ;¬M;à E'(Ö yâÓ¹^Ôƒ’hêd¸ÚÂV$GYÒ´u0”Öw,E£×”R¥Éb¼e[Ù|¸?xŒÆ¥.g~¼ ³¾8‡5¦eȉœy!ö8J‹NíB¹ ‰ÈD_ÁB2„µ/£[¾ß{ð^úVl‚f§?ÓßÒ¨9!=Ê2 9Vs{¸sÐÞrw0Ð]·ñ+ž­,:\WÔɆg >X"'«ê_±OÝùÏ÷@Y‚l3ímÔ;û=r´¦áØy!±³QÔaEl»ï3*`ÒIæmY‡ÈzŒl‘UPÕÛKÅùêx×áðE¤$žÍe.¨”q\e!_)®jï+ƒ›¤ãEoÚQ5—Pí{¡ ³”N8µxfË¥Ô_,‚ õ–­ÌÓšÛÎHÃàÀàáÑÓb×2„ìI±{¨õuUö}ª{‹§Œ‡û0úˆ@¥C7¯Y‰½ÑJ&L¹"È^S9›ô®…Z‚Ó€*¸^y÷Tµú¿1ÍK«båF€] hOëªßö>5™?JоZ¸ìô$S”¶Y|T`uf!Wé5Èô2ù2¡ Ú¡ÊäêÝù2šÅËB¢;ÃÔlˉ[3|!ë³§@è-Š–›¸ê;†Ûγ5ÐânlÜàIDzmn2 y^6¢drò*ƒ÷E§ 2¯Óýi…@oäH) ËÏ-e«…\=€…fqòKšŽkúu¥èô:µË åà;®*Cç¯ÃIÕBU³+µ”?WBÌ`ô„hmå™yüHª3 ÌmÈ3©õÞÌ>ÝDNâzXl0 1*9„Ú…>0—Ãqü‚ö¨W:¥l–Ì=¹’™(™% Òa¤:œAðࣹgkYH"9¹E÷¼Y²©úî]žkèªX°÷D$Åm¥iDh'žé¯³³u„ôÊGè<ü~œõ×2Óíë»öùk) ¨^¶¡0Ì#ºDçDÙð&qì)$¾Jn«“Рh}%€¹–¸ï4hÃó ³­ŠËÈÜ©ï«/(ì9RÀŠüºÆÇºXae'Jߘ tkÜò94›J3 ›l Ðq±nötÔK0UæÝgSγÍRXwârÒ›õ”K˜,Ä1‰&ó;iÁþÌ×eÌ{†­Ë$sÍAdñ†0ÍÍÚ¡®ú¿ÐU ;ÞµÉ)þêËOúÇÇ"D#ŽÒR|&6G-ÖØ_N¨éG1ýP²D„¦o¹çÌd×;âï6á(:7ÿ‰Cr§x–¡˜uCnßNآ佒 `<’$»Ë’7a¶ =ðLb«zg /t–E7*kbƸ!hm¦ñÏ£ãqi âX %wp³‚ÏL%÷ö‘pO¶!9@9!×ò>@xeü†ö¦ +^²¼Æ`çÚEÂK¹Ý=¿™ õwèð¬ Ðþÿ"à×õÙP’ÝòøDÊ6^4å;ëPaÏA‡¨Ó¿ÑÞ9óól¢=l!7vG£Ù\ýÝmÙÇžØN7ÏÉì^nO |¹$›F°{Ôh:Œ&} øÖyQ}žlçÉÆÖùŸ†+FLꌼ¥p.þ@¦g#.FŠHw(öÉÄ v6OªADB9? ¤ìñÖâšÉ3L+<r,_ä“Î7~ééʨcƒzs›ùˆa±Á4®[d†š©vY‡åA="ê§À¬,q*4äùø>•JI=¾ÅfÝP táù´]›ùx&á°³ ¥äšß—gûjìl(aÇ_¡}+†%òÐ-ù}ü½úF@éé.€Waš|kÏIgÁ9ÖªÙ"èA’͇¥‰Kðg±51\°0.]†lƒäN¡Ó™u2ª×D²š[—…I yQªŽ;kß‹?1©v„¼È´N*a-sÞkõ» B•èIºÝ=âæŽØÆ½t¬Ôák½ì"©Ÿ,7sµÏy÷_lÊ8»§áú%Þë ®'BhWk#Öaafù@¢ÛøŽôŒuj7ï‹ *–¦!–ïjûRªD²·ÃyZ%W#ãçÕhÒf¡,ñ3z™ÐÞ|16*‹T:¸«^I¦g'1º“½é©Ü!ÿÙ¿*!®yêµéLC]}R/Éft„þÐâ…×—&&ø9ƒÔ§[jÞ\ß§X|ظ€ü„ Žô¾½&PÂÿ‰%½Ã² »VºT€þŽòåØT¶a„²=— pÏ<öÞ•âê0Wã˜là[s‚]¥Õ§¿ëÚ‹}ß4€ƒG1Óú¼-Yaô¾8{€0ô¯…Ã`r03Nü*ôù#$zñ®.[ƒxu¡Þ›Ä\² „wHCU÷{-#§ÌY'.¦{•‡að 3"~†Z»Æ­Ü[¾#s·µú§:Hd2#i¤ÕõâÔÅ#ˆK¤$Õ÷JØÔ¾’\H1N¹*WÖ0¿A’ _ƒUâ«-%ìoÉ]þÏ?µj:'žbM9ijù\èÒRJ@7Õ) 1žK6—<cª4í…ªÐ6ÿÓˆô—7ªô1O¡PÚ¾1|ì‰pÜ¢æØ¡8{{ôÂÇ6&j³‘£èÞžrõQç|E.»nÇþ/”sé6σŸ°Òü£ h™(¬þ÷è„©˜¨¡£¿O^úk¼'†ca$(#ü‰¿±=âýÕºNñÄøô¯0Ë’tØ ÆÂ~¾ÝÄ3ËÆ¤4I[gё܌ûûí°¬Ùâ™·á©Ðm·@õÛ,°/¯&lŽ…kšÒt«1( ‘a‡± ó_VQOHúðÆÜZá9˜sc„ß$|‚`ÕW‚Ï‚èÌf2V}¾ke§IÛ7eÍ¥¤YƒUh`2NðîXÙy>Ñ7G£È<|"·0b‚lmÒkÊßt íÚ: Tzh7÷§×:Vûã¡ ^‰1;”Þ]%•^v´ã¤­iœ%+&Ä^ÙìK¥ÝYn±‹¡OäÉšüuåzHË{EÑè÷³çòvýYžÝ=©v„»èʇ¢‹Ô%ˆà²;©(mc¬×”’•s£q-=Ô†¢†<ÀFZÔ®¢ÎÖ±JÌZîœ6ÜR"rmIGPŠù%³¤I.tÝÅÓV­ÌIˆ‘[‹Àkí„fgUôdhr³ÕëÏÃj‹¬çQonõÉΖ˜<º¾ÄÏ+³ ÃÇ–ô…@ÕÓÀkU3Ù¹= i!ì´ö›¶…„ø)RÕ¢šIR_!®½5Ù‘Â0j+/º„LôÈãË#7¢!'fô$p’†m#CMÀ,$ŠïkˆiKÝSñ¹²F>Ž™ŽÚ%ãÒ•%Ü)6 P®_^Ç7ê’ë²À8Fu}K/[ú®{taà $/ yîäþ¨ehò]{sèÌ’?}¾)nYš$ @¶ª¹SYHM6¿RZ:""â³ æ,ÀzÒ¢ôÉf :Ú·µúè«oÝyïˆÓÿ`ÜŽÔlä·ku ´2Ê\,\4™Ò ÁÕÀ^Èmt©¦ÍrJ1M §ÄõÚ`ÝBæ‘x é›ê3¾³zª$wñýkö—÷™+bü¯U31mzö¦G/%æÐ²¤ þ —'¹Þ2ö_(ƒ± U+è œâù:N‚®Nò ¾·"ÌÎî2ù¡vc¸Þžd`GôÊ–Ú®A^ þ1S.{Y}_#;^$]Ut8?/ sŠÎ}§£Ù ?={³SR¶q‚xsiNù n Î(ˆEËŸÔ¹~K²2êÈ kƒÏsæõ'HJäRuÞälG¶L½«6"®z›­ìyQN—YcV¼BÓrÇ0¥#åÃdּ̜-¦"òØ7‹üÔPPŠf‘¹“à6¨ÅJ‡X0qt‚ïepNÛ9X¢o´Ü;R?@G„±g!·ß­ëþ™0â ?il ÚʲáüÖ{ðb¿¡?¥:_|îjXˆ _ÅÆêÝ0ÑθíRÇê:%5Ùj¾ƒkfš9x9) îM§iu ¡€Õ™RZÌÏUÅ™K—ß‚ð_˜À½JX‡Sòo†f8/qGë|ŸØ–”çö-)WÐÏ„*Rá&G8{¡¯çFšW_/á7¾JQê˜ÈÿQŽ™¹ã=RŽ&›Å_ÄJNj2‡”¥8Ñ(3¿…öƒ\̓_; {`7,ïê3“Ækgk±…:¥ø¼yû@w=N礻¢º$Ñ\Ô&ÿ+;Í{íûQÊk håõ4è{ªÏ^€W? ”\AÚñ`ñ·€lÏfOçôߎº2ndXžLþF¥œhW¥")ËÇèÈŠ8è“sIoÐKŒ(7â—vhd2ÜzÒŽ¡ ˆäÂD|&ŠÆ•x-\sJJIO9Ð)¨¼Ì¢Ø2NB•Íå¥ÓRÓH»íc¶™Y cG¦vQ1|¾†ÇÔp,ZÝ~Õ֨‹ƒ R/@¯bZš¹2$3VíU AÀü—–œ®§êvnÄ$³Ú¨…rMµdûn›F‹9¤=(Ö#|àâjCƒw”Ûù¯3|RÙ¬qN½)Õ†y%9 3¥‡_úåèÂü§Í¢ƒ¿eKŒÿ“œŒÜµx6:VÞ}â©RZ Á.Gã6F<)å ˆå¶ûFá¦Ú‰š]eIZY}XZY_ kl÷ð¸c½ö}±x®?ˆ•¤Ô¡?¾pÀË’§Lí°ýXsø…@oTòMº0åÐá½n©ÜÅÖ}žqû|!Þ e@á–"…i¨žÈyò©ÏÛ´T1AŽÎd‰|QWйŒXdV ˆ ðPJUÜu˜©”³=µèo¼x‘sä±É¾½È<*Ëg¤º¹ʯˆÄ ¨ïÔÿÖÁN‘Aè2mÍ* a;-‡Ñàt­›‰*ç¸ ªE-=Tdx4CµÞÿá‘ù@Û¹j*¡yé¿îxº¡²sÐ0.}Ìm¿g²AWO§d'åBA̘Gm L¡Ðá~Ù4ýBËâ?,´¼ÿ–’ä…2ÄKøl,¶µú·1ó” çFº¥9!“qš}_¼gøpÙBˆI~Ÿ0gõS+§Õù|…kã£ù »Ï7Âk¿c!ý ïÈÑò/g}_{ºm=¨F«Èj+XS†£ù‹Åš¨‡sL¹Ïš îBù@źßÀNÁ‚ÝZ×Bö‹Eñ–©ŸÈ:w z!KþhDìA0AÇÓ.yÛPœ¤ýâ!ï³áŠF¤k2p K@tO?ök\q-Wyd*Mb9¼‡sѽ3t”úGÙ Æ ¬÷YYeŽl¶à[õØèâ+Œî)_÷ÂqÒ¨®°ï[®¡Ão4¶ìHD$Äyó%f'yz&s6Þ›«`Q,4ÁEc¿]–8#$éÔÏš!kƒ<.|¶ú–¯´ó•ô¬í}Í!ѶHtYá¢xºF´›}!¨‘Â1jv®÷×¼tgÃ)’ŠU\ËOŽ2’Ö‚-L=xÅè†|Äò«²RØ›+>I¸ôBZ’´Çad¾3G°êPîÕ¤R#»²þ§"ù¶E)h]+ø5Iîa{"-.vUJ’\[Ïz^r+Ì.ÄT¸ˆ6A;Óß_q¢àMHWÎb4\>¨¤'µŸ’*Öv4má ŠàOE‹®~þUI–çvÝÊv}œ2 ÈœGsQǨõÜGÀ8gÙÊvS è  5‚)5í=ë‡*€DW™ ãõ–¹¸ÙF£÷ž·ÑÙ b§¬‘4K“K<˜©.¾Ì5\¿ˆTv¿ã0wõÉ¡~p…*R4iŧO9ÈåÜp W>*ïÿ k%ó_·3ÿOy8ÙNÀ„‚‡º³¿PòïD;1k¯ëƒ¿u¤®Êë:ÚB’,ydªÞÕÓâè±%'8ÜtE‡Ò¿3¯é^½ åÕžeËÍuÇAô××â8¬‹„ã—ÖGlY<¾A–á{U©¬VƒÜÂòOqÌn¿Ë25}üêÝâÚFU_¹sÝŒe\šæû[,©‘2élqUWÞ°%9tÊ­õEŸÈ⥩”Ót¸Äj¨ÏD‡Ç¢/9¤Pk¾C“CÖG"fùX†£®…ðŒw<CµŒ¡ÒzƒÏ3Öú M#7N+cFµ¥dvUV¯ß9¹-VyÍ'`áEÊ^êžÔÙe¬ë™ÉI¨Ò‘Ëbpþ}$ ‚5@† Nø u”}T çdòòÕÝj8•øé§V°Ë–…†é•÷höêĨ¡¹8%¡Ÿ63±ñNÀr½Žœ:dhÃÏÁY]´í[r¦7ßv¡OJ~ò±¶ò†1ØÁ ¢.¡æ½¾]úrÔéŸog_‰k̳‘üKÓQf¸3Õ °þ  5˜v{¶4ùõy ð¡újµËŽ×G2«ÍÄc]Ù/ÞœìŸA ™Ù~,QÊÍ¢SÑ4 µB]»OÝ›(YÇ”Æ4ò†×K™[ZõÿÀÝ«SîøB*A Ì¡ÕM ´Yæ*ê[¨òÉÉ/Þ4È%¼5u1~sÜÙ>Þôù°¶qœÕ]$)|ÃÙÔ{tT½ Þ‚˜Tê”Ü-5« †‡Ñj‚ÿ;/C z~·Ø×+ñC•É63Zág¸,àÕ‘eV©Ðºeõw~]´Èlíu« i‡_²3Ühdý2ŽDè ÏY©.¸Û•§”_=àÌ™©c1 e¹ŠýcÁ‘æ±…/û•ˆ?ÀFPßµÀ‹¸’ɶáþ†'lŠŽ@5@ÓµòÙéu4:ƒàØ}‚Ü—)”êÄñ5É&œÃNÛóé?úcsy»Ä8'ps‡…!«9]>¯ý~”ø K¦»‡óê MZÿžèµ0®¼¹N†' ³ CÄ|ÄîÄ»“eCã,¡Î)ŠÛ†^)ä,n?§ÑM¶‡VÂÇJ…#,œ)Y5ˆ²1á²MhýâÜÖ§ iÙŽ d²±£¬Ü Cm=z{óò…æo/ŸÍ—|*1óõ“XãùæëŽíÃF(À Ú‡® »ŠTŒô+>Æ^J]~†W°µ¨î ³?¯ÑÆ#o±Bê%|‹3Û¨ •ÄM+°z[°qÛåô°>–\‚ ¤‰.i¿®V.íGb µƒ%dâ›*ãÂð‚žeC8ïLSOÅç‹¥ÂÄa'è¼¥xpÔjÍ› .YÇ^gÍL=÷X%óJ‡YU=à/_–ˆŸòP°—ûž8h®B¨aß…`é÷H”߆ˆÆŸUKÆYaB@ ú0Õ"ç° @νްFß‘/²i÷Í>ˆZD(ºÝ‹Ùt¥0Ãí.n´G¡tlz® ŒòÎË–nD+ˆÖ};£i®|Ç‘uâÁ¨îÅz1E‹X‡›€x.ßù¿Ú%øª¿4’@?Öí…­-¼¾†Üß·óaç¸õŒµó©y9XAü°?i»¡Éi“ðœSAà‚¬Ö%¥Xý4ªþú•²"’¤¾W üŽX¾ÀÇ+ù+›Éño6{`¤"¬9›si¼Æ,M¤|ÀÁèͱZð·É„ðU;7š\hµâPFŸ¿››?J(6ý(ªËÁf®óÒ:“Ñ[žýiw¼‘·UAÜ'Pàwt°… ¹¥)ðnÁáeM ¢’+¯·ÃžÒj爽® o~‹Š¥0Ž9tŽÙ#a|­ez&o}ß¡*¬úKéãŽFxìD³Ø“½±£f…:‰²ƒZ͵',¡x¯Ácˆ**2üˆ­î¡ëÐqµ]DK èf,÷G.aw–%ñÎlhµþ^IÛN'rôl4t)4:ñn®èu—7äj’„³È:ê§Û(Ñ:A*òßîÄHÈ= ÎÞr¶·§9vÊÇéÔͬ¡4KAÆ£¦aög=Z6šy>Ñ@a¸å\y >èp¢ÿ˜Å¬‚ÐùÈ`v[v£Lén>öý@MõX¶•'ô~[xן†“YÑ,mð‹ Âæƒ]û9!Ÿ¿…¬þ~SYåëZ$i»|·LþÏ’>ްŸ´XøÏãtMåŠ`ضümÔ:âEÆ¥ðšMh›qö¾ìμìÞª.÷“×Ùìy”:$Mv„Î?_ ¸ž¥mz£¤rjk}Ô¼[,Cá—¥è24$ôR‹­ˆég‡´Ü+ÀÙ/Ë~3äùD.ú¤VÞ[y÷ÅXZ®}MÃ0¥ “’çÆçÏ—2nBÈ]È@Ôïûò2ÉÓ>¿QyäÍ’°¯šÂú/žZ¬ó^šø[{ãAÎXh6¤ç—â ¯_ÝŸ¡µò^PåA¦gYÀ^R‹Ž‹_›üÿ #ð}ÈÜú"½TtYP;ZMÛº1† Ö5òÔ ,:.Z£­¦FZ|)€O€‹‡ ²l‘7°wö̬§²vV Æ9Qйy4ú°“ËÌd{ÿíz%}ǨADBkâªÆ6G›'V< ޱƉYñØpìÆrz1vWX÷è a2">µÉ -ÝOeΨHá þb®f²\›ØË,wT’ŽIØQk¦Übÿ¡èrz|ã|Î=S•ú•¤èWÃòA󌕉TP§GFX½ÇM$jyü_YJn­:yªF1B˜ÁN‹Fì%y8¥ô7´. 71 %eÒ€Óž~c:Ë¢ %e!ê9ÃÉ|-þßÈqÇDŠRùåj|R³1#«t…B°°§·}ª›q† ½‡†ŸJz£µÔk¼!;‚9qg܇ÑQ­¦w$ðŽ>(~å^“ü÷¤¬4˜ˆÑH_TûšMåÁ]šDpot¶bÔ9ΆèF1pÄù“¨zÒ(Ê'®ÑI·M@g?ˆ>~ÃãÀkúú,ö]¼}ø¢{‰ÃëñŽA 0A8ÕqÅ`÷f߆’VÒ¬V)ÌŒg0rE67ØN=.àD—3„ÉuL"¤tÓ÷ÔNÎæÞÊ‚½}$g@>wøýÅ{x^[ôˆP½þ¼iª­á¼‡¹›èžâªçÉèÖ3¶¼x×9‡ƒÑs‘HQèŠóà\=³ a¨æ˜¦ÍHMh>O‚ìÚ\ɇÌîŒKó¡%å0–(Ú°®£kËÛÏB—h´ü{}‡a•ªmýļðJkÝ/ÉY(}•ÓÀ¨šSúhdÝ2P8,:u>™sÊ]fw•G×$6a½¹T×q&… %›`Œ˜éÞZsdƒË/ÆXÎÞ:˜WnáÎCy³ríùH”6#¢¹Ôâ¤ß{ üÝkn›’”…ÍñëìΚÓl‡uÀù¬ßüæN?åΦZÇ 51ª½cãáÑåbC°„QpÉ ²Üæ„V“f:° c† ÖY0h óª+ZZ¿?†j5ëkÅ¡J^öK±?A‚ê·«T¿ ä3 ù8NþØzëÂãÀEš´Í0ÐPëYˆš¬ÇÞ-¹é‡Ë“:´ `Vs‹ù%o†­™'kœý| º ©––¤}~gæxD¹×š¹ö~W9ëàoìí¾Ð4´ç\Ÿ«¢êñ ßm%z5kh~ ÅŸÛ•n™Ç9%m÷9ŸjÎ2n|¯cdmö{J<;ÞM8¯ÎŸe|™|•@É¥Ñßa[l- õ[ ?ô›¢«Ÿ6sšmf ÄÕìƒG' t§Ç”ëéó³ÞÚBÞâ”ú\õ?:6©Cà7QVdÀ{" K^󇇠äéôñ¢áé-JÃÕa‡ðïºï»é¬$â6Oüw!öúÐ5›>/>`äXqãp{ädÖ]¾*ü0egôZ:Ê;¯Úg;ÁÍ2NU·þ&|aãi+wS«Rpl“l…ú ¯žçI‹ó"ѦeèòÑœµòϾÍäªI›Ò4³Q/|–€ð“».B™ÇŠô»qã| ÔÖ¨ë–û¶hZý‘‚h0c4r¶¡ÈÚ~ó}ðã´ïΛ–¶Å91™'£Ðh¯u¿†3¡6X ´ÊeŠIÉ@`ËkÀŽn«MÕa¶XçRc1¶4â6-;U*@¨3Ϫ.mÏÊoÔ'é”Óy,ˆdD¬XE"+á¶ÉËçá|¿ñV`’Új¤—5HóMF>ƒGNG”„ídÜé†êÙt^(ÕËÄÑȳ{ ŽˆþÍñ¤]£DV¥t%Ë{çQ•yg`f8äDÚ‰ôd\¸ˆ/Zե食ºk•±O ÄxX–ØO…Êí‚&;G.6žT…ðv¶òYB‰3ÞN*Ø:C mu蓚û‰céSçD¼/FŒrP9Ø7´bºÒ43¬JuäÕ×H-áx‚ËGM²xášÞ†Ct· Æ¡Àû ÿåyóxœå»OŽºd”ÛH]¾ì“é­]—\ÊÃî¦]»~6•Ž—ôÎu÷ÔAÙîJHð•2ýÍ‘aFÞ°žîB«vF{Ë<Ùç|@-RЊ̑–Ìô-3Ä;L€&RACIç¶ò[Í£jHXE¸z3(“ìv–Ú‘V2Â…x ±‘³¼ê±x†ºZ7!¸UCö.ƒ Õ|g#»VUq!'€y—+Koý"ãØñüºþ@ûz/œí:J†4ö(ѳx+ÅŽªp°ø ,“* ˜rÁºŒÄ\Ô{=~É$7X&ú½,QþÓdš\ÈçŽ&½ÒƒÏËr™{¨`޶•xŽ'>¿‚ꇜãÀ"©=…¦¿ìëY«à¯v§f Ú±LP#–wbÞ¸±«Ú|Šáóå^xU”(-N.¶F:ÍR@>®’`îÞ~¢]ƒ+˜\òã«cÁ…8XnPÑdE¡ÎJð£(¶FAvý^JÆÈ½Ò}éÕˆ0†vX¥Nš¼xzßóø7ìaë¥Åd}òžËÞ¥ñv·Ô¾9¸eÇ\dÈ“˜SÀP…(- yB~»ÅŠÛ˜T,ôÛ©6ê9’ ôñCš\•ì¦5Â’ß³GÌþaèŸLzîÿELâ…¿ÞÓh4ô¯FŒ:û0 Õñ/ÁTË­ ;ß=dbüÏ£âf ;ŽË¹ˆƒ”b›ÎX´ `}!ŒÔ§ kª .ß&é›b8F¦80÷LVƒ•n»0)Š RãsØàÞît±Q$÷wÕ½gþáþ†cÍ•žì¼w“JjdÈFMaóóF´F¾ò²/7öõ\OÈŸg/?ò%»%¼þ4"EºoxdòZŒ]šm÷j:O½#+ƒ¢ÄX´&Ú‘t2!£pŸ<Í,i$.¥•újŽ83&ã‰yä3ÚTš(TÞ.8V vŽ|­»¹dqÚ›&®’™£¥ØïÅŠSRæi@+þ¯^¹ÜlÞ.ŽÑÒ64TØÕ·ô8p1­ÎS#ìô'¤ÅŠÔÔúœeªP§~IOäœ÷ÕûàjLêË9-§Y%ÔwÍ jÓ3yAO7»êoó¡Çw݈¯ÉÜ åÐ)¾Fï–˜ò’/Û‘€M ÷U‡›Ž¡ÁÙ=«­#ÀwË‘e“0O•%°‡ýÒ3 ß›¬vÓƒ€bÍŒ|\?T] ’í”§ÒÐæ¨Û$*gGhq.Þå“«ÿG)æFx±¼nvupLåä±™À•Ö>=cyÑO`˜0j´‰àïfx#}ÒbÆY6Oƨ|“4øãk}UrW²ÑãÐ1²·@òÖ+µ&¿m·ê}˜Qý½ýÆ%„¦,AÝË ¸®Ò¬(r q_1K°&œµœj­7@R.©ÅÔíŸvüÒóS~æ‹Ä·=®¨ù©~Y.Þ™5ï™ÊG¼Î²‘§C¸d}iJã±.©Šüy•6 cqFK«£lÒ§äö°ƒ±ï䟑¿¤ |ÑGÈ[ +â(Z˜¥}mÒ)×þË0éôÑh{å¯ÎÈMŽðв:kŸL5g&›~£j0–XqB–iDãÁ)!ºÚ@¸ýæ\—S¾~Šuûã×´ú`ôÖ œRL¼ï²wúdÂÕRräÁêâ\¯³vtÓgQç)½ÅF.$ÚögÌë‘,¢(;².‚Ã6<L€4g.¼ÕBz {±k± ‚™|äÇ«nVIžÍ?ˆî[ãSÂe=ÛTjõ“”vCÑätù»ÖbêbsUq™ù°)ú?2ÇL ƒ8ذP/_–Í€&ŽHÜt> !BlÂŒl‚É×MöÙŸ¡ÚÅIK/óò^¹Ü0‰ì:Áà—9Ì_ÓP6=Ëå}P«%% iýr&v¹ÕMÙöôä$¯h#3^ׄ†w®Q ²%Ÿ%îA–¼•ËRNËã;ÔJ®‡¹ŠRn(_-•²Bv‚ Ci. ¾‰2 Ðy Uô¸gЪ¶6fNK.[‰¨ò:\áîã¼(Ãû8VB׃y$3\³X)ô1à i!òw,:§ð)ozˆ›³èQŒ$¥æÕ€®x ¥š$õ}Ï\ÑÌ…·xYü¢Ÿ\*¶ÐYõƒ"/XZ[ÕùÄ‘ìSù¤Ò"%”dŒC¸iŠ›#Ñ%¢[Ro3W:ƒÁ´[e|V}t àð/ ÂqÜà…C"íá/‡ê¹ˆ®£NÛ«‘ó¾Â0tí"~’7Wvƒ7÷6pÔfêç4ȸ¶j;ô‚ßPÒç?Sš½t¼c¼­ä-ß¿‘ô-vP¬+-[“„¸ÕâåK]7ÌË3Žk—‡Âaä6hç¬ÇŽ¼Ë‘PÔä4Õ&ïç·È|Ý7E{Ý™Ùàd Ó”fÝäýÇp?òìÛOÉm$Ã͉©|&…¤¼¨ONŸÁ“ÚÛíëï˜Øe9l²U… ¯Ä8j‘¢JþÓ_¶¨Ú¨Ž«åò ›jGÁÛQÊþ¼†þì±—ž¦¡y% «N\R:æâÎr0Y³dšC”N„îËœå·òjÞTçðáþkh÷öŸÚ]˜ñßöV³úÛβBüpTÑK@¿Õl#t †É2mîoÂè §¹ JûÑæ)„!¼$NæÂø 2ƒˆûq¹YN´Ã6âÀzþJ/ÚÁñ§éê·ÔQCóPÉñ§e g…ˆ²O^DÇ{)~‚0{tcG²o»¹núÑŒ,¨ïm“rð¬èwg½y'`¼ÇUtŠ[É­>°žŒ(®ºâ;‹o¡$’¯d¨ÔóÒóÏËm>îGpFæKâÓûBPûñX+¡H‰œþÁ’‚«Ö'`™•Ñ&Ò¸ñ屄wñŽöÙ¾:C!½»ÍYÈö:NšN¸‡Ê :Ï"4ý³3AtÐ;îï’ ƒ.b=ƒ‘ÍÄôˆQ¢ A¬(}®žqj´bÿÍ_»‘ÉÀ+…ò×{iXgúZØ`/*ó³È·<Î7š¾f[³Ùƒá®}çHZê ß‘2$¤œö-ÃÝ3Km»ÍÁï;þÕܾɅ wY¿ÄLGúùÕdýÀå—pôqù ewbËK®¾'´hÑ3”NVDµ<1âÄQS(ñýØõŠ‹Noc†ÞÕ»7Li®§ØžÀ…É“pç«g3.áÜggod1LÝÜ¥ç·Ë|Ç~+´.Jé½—°1¿¢:J¾[ƒ•\¡­¥Ù{± ûÏ Â~¶$lrþˆÍ†Ó-¸ÌLe1þ›xîñ¿tÏ N;e¼aM¢ñÝzôš©Õaß>R­y«'î°Å’O`s¦œ_ë=m;U¼·¿z^32¤ç{Y÷h¹ópvèËB,DD@ÝœöWX©\as)-¤¿ç§U¿/ ¢n½»¥ïz=YEmLβ`-6Ù;f—A`<¿õÀà Šu6ïb2³tåj]"@,= ¸Š}ÅùCʶ$B…Í9'P%™UN™iÙâ*¬Ô©ÊÚ¦™i×Vbï/ó%J›ú€!¬›cXiœècvâáñb}U5j{Ú¤÷Ü\¥«¶Ö ýðq’åØò"]ë“–N‘\3Ê›!ü•'|jþjü¹‘3Í ƒ ‘eXè<ìc¾TäIÔ³°ŸõXBo¯.í$µOÕ°²GòaÀ“·„%èó4ÂV1BæéòËùרtΓ䌅Nfæç¬d46* ‹yE‘ôû6‰zQwb…\ ²98·§¾´˜Î‘N´IWF•¤> ¿7Ôf†¥ËƲרC¬ÉŽoi ÏÿšZ¨}®¤w6dD¯]Ÿg>«nÈøe?QqE7êlÝ.ýYeá›òÉãÕÈ µ&Œ*Ð6É×Ìg.á´¨ªdåM‡8ÞofÕ}ÙAš‚±™Ô¦yVæÉèëgoÖ3:Ÿ=]½ WÄFº‰F×£ô­›O†ˆWñ¥” *hMP›¥´Êö(EÑÉÁxg;·WÃç5†¤Àb1ÃèaȽ¾I(RYª()°Î­NB¸8ì×!Î*tÄ…+[£¦òýÆdõÝsQæÖ€óÊ~«E’ÞæM²Æ¢Zcw)U"E¡…mé8lf:UÜ&¿VZàâ‚>÷Èuöm³˜žßk3'óÀ±j¾QvÄ` ß'Ä’°W]¤®€áëÙtTCJƒ\—@+-¡WÀ>}Sצa7[ bd‘›ÎÀ‚” Ÿî›ð¥cãœÛ•ÔEt“¨†’å'cx(­%zÌvÉr÷;@å|¾OÍ[gUy\蔺En¢aÔú!÷ycwGÂJ<.üïä€sáxÄW¤MuÂtâ Bºç’ç J W'Ñe~À¯»ú5ýØ"BÆ=ƒ–*`“\+=DZ¼+¦yA\Zº6dœ×äl‡±j’ô4Àö %wÆ¢0vP•«ú\Mc®k‹*u,üÉ…(n …ÉäË,\8HÁnmFc¯3Ï~¢_å~ ŽT²]b¥3EIrnÇoâÏç Ó¶™Áª‹'Æ `\¯Ñp^aŒÖ­öÏw”ž¦ùf$ú%vAìñ¿•25œÐ {ô ë~à X$qÔQ•¡@ûšº·DjlâA˜ò(ätîJ°¼•¨ÙæÈ7‘pÚñÓŽs› *F\oÉÞS7HvŸg#`u]µ¨iBY„¥7û¤“’tËppDîÇæyÕÁ:Ó"sÙSÜÖt3ç‘CÇ8îw³íbÒ§#ÖÏ5• M»ìL&º–Fª1¯[ù!³Â¤˜5JuS¯®wro ›z¹5'Èm¤wp¤¡ü—ùÊP…½ì¸lÀk×w’Í e³œN©ÝɘÂ)±);]¹>¥²%»*NqHÔÂÉMLa ‰âL>Nƨº’ÅMî_Ë}ý¡ŸXj—HÂÌQÆãIOŸCð¹ô£1©t¢–¼Ð£`-\¶XË.¡ËèKó=$¤ØÛó{½~;çWýùÌÁ™Ýž8tø®´Z©'|Æ©?h=pƒho‰û@‹]èy„<ÅÊ))Ö‹0—ä»÷ª¶¶“[¢jŒM DØœïWpfÐÔ ‘õ’2Ógz¸a´ãšHeäçäE’$ “yïz“hÁŽl½fjª6<™í3‚àrÞ'‡×¼?Ÿú²€^ªþFžŒ1a2ö^hUH+}y/ªK€={w7æPÔhÄÕgB5ÊT>È ص&fÖûm†Ýu(¬ÆK¶VqJHÂøÞ)“e8èñÝ|ÃUBDWèJÔÇú‹le| ¡^3žG:ãµ]ùt’¬²J~õ±$›œ*±2çví‰êöX`šeôe|ãŸ<Å•âœåY"83rݹÑ(Œ*¶VÈ”ÿ¾3UѸVêå)ô|º±›AÐs©ç–®}›×”Wù×ËR‘ )/³Î ²&Bå!¿ùZ4Ò\œ×lçsÊé·ûã{Û°ù—óÍ4££ÏR+´‡—± 1ªÁJËsš 8À0Ôu h죈Oe€I«äEýo©ZWÉ‘æÚ£¬Ä{À$p¹-oõ¡¤Í©¬d3Ð)ÍP‘„BÑüP—¶M Vûljx¿À‡"Á’^¦âåEר#ˆ¹Œ¤NŒ ™à›öñFT³èg.u_À³Wó“\×.ºËÒI¶èEå)#¿…Ñ+§„\8~Xs“.:üF{ÂæÌpõÐt¦là¶°|Ä¥*ö« ^åÊŽfÒ .Ö† r:ÙFSÄÿjÐ’fí}rAŽ% šº ím)Ÿƒ­›Nê%°ÍÉ|Wë>_Û×øþ¢yÊ:ˆJ¤k}¶cÐ|ˆ9å…nâ³¸è ´®ô€|›Ï° «9@|ÖbÎXcvJf¾Ã ò}&Ž,±ZÝäî¨ÕS¡æ`]4»äý´E׃ö~ÓÃDž]—ëœ÷cësrD²_UÒq»4Þ•B¶=ë°4F^”„>oÕq®‰ÚR˯½7ˆ$£w+NаsÝùƒÄ-á¹°Qá4™ï˜õw@ß"1„¶mRU•†Ù¤s^ ÌXuïXN8Œû¶ÁèT^%º‘h"''jjeIoç³5«³êÂäZÂû»}âC²{‹ªˆ '²‹Ÿ6äMÍD“x‘ÊD,ÍÙ•ZÓÔzM4àî4l™ Ë>‘Ûl¶­g5›-â¸G/5,im*}0–ÎÁcó²µê<¢Æ^liÞd^°y.ŒÀjý“â "v à0C‚¢]ùVÛ xÙJ*#º9’ûê × o\â³ÖÿM¥âUëÇM y7SÙÒèUzMÈ çòs êf+G^ÐÙ}›ÂONGIó¹¬Q¨Up,û/z¾ñ.ýººcºhÏq¤ä5r)ƒ"ƒ”Û¦¹´ø¦Cú¼gÄp£NÏiÈ$Ø83ƒ ‚ÛȆü’ü²^!úx´_¤â÷ÄØ,õ¢ÖìK3¨4^Pc^:t¾?q‡wAmRRoVU˜jgKW‡¡³¤ >âÊ#©´>Õô,Õ€ÂAïÇ!²¤Tn3ÝÚŠ!ü‡ÚT0A‘j{jŸ¬Áp¼,UÐF§^(¹©€1;A¼Ñ‰n>F öÔó€’TŒbö !-CêÕÐu®Œ$cC¡À>0„¨*_åÏáÐÚ¥*€¹³¶B"¹“¦7éO<¦ÌÂJ ìè2ò@B¡&bÐqå¬T×™“äVä[N£Åê>®DÒÚŒZÂ%µuRYú•ZM7¸“¶×Ô¤”mAãàbJ]tù­½Y%c. WÝjö ùJí4þÍe«äMO†dÚ(Å8±ñ«"ЪJ:$¡bðäØd˜X@Õ hÊq^åCÝò¯òK s%F×=Z:Ë”íÕu?fgùÓ¼¶@8éÜç 8í$(H55® QÊSàÅÐË/ªwЭÝI÷²ÒÙÈý;Ñ7ƒF<|‚‹‰Y¹I³ê3>ÝÛº è›JÄÌAÖ˜ˆí¬Í˜*¡¥)Èo‹ˆY#ã½t–j½C aKÂA*Ú°eÚQ†—.Œ¥ˆ£.«Åp—Ÿ›ã#Rú*Z² Ã7D—''ʪ°ã?gEíSçy¡U ±æL¯ô„oÛ/× öˤ€±'û‘7Ñ1 ‘e±ÁðKŸF|0 Jn3˶î|Àû Ç(°šwcê”n»µØs¬û棢bq.ÞŽc)qÓ2ÛÑ+mcÜPDEVÕþ” Ôé& '1y…øÕk ʳعªCì1})/ZL$~uÃôkˆvð¦ô¶ ¦~¢lICÏTn‘ uPGPùÈû\W¨b‘òýÿüli$½w®¹îÜ=_3-RÉ^jà2€ŒAÏÏóª$Œ¯ú LËTµÁí›ßìc~m_ãT9÷¦Ži\)ýÊg×ïq÷’=°jªŽNìšOÌ l¯Lâ*½Ù$º¹µø¡BLP¤P­cßÄ_'Û€´† l3šærH~A…õ,Um`üö.´/N„„ÃÅs†½ $Éä¾Vž{”Áî"¤On&¸Þ¡ Y…t{zUìÞÍç5Ó"B.5$'näGO£Ú…†9]$ïÑ<³µ¬™Ö€EIáŒDôîA-Ø(ðmœu=,ÇØm_Ÿ«Ò2!c!ÜÙª[áã®Ik3v–㙯_ŸvK³ä‘@ª¼*µ ™8²Ô:9¬W(ÈUšùÚ‹õDƒùežy½xÖ¼õ§9Ï b5v“ïg½¼ú,Xý&fR+Þ‘V^Ò¶ªJ/VqXíØ*Íe&‹«!¦^CTŒí2k¯K|£Ä5ÂÛe|Gž·aWQî•äíÏaÝ#’W6åvàNî”&2ÇäéQõµíe»K.leR ÷'>sæÂ]YÃA»mcäÝÐn)ßdxή¿)) «_²3K}HNN’ëO¨êïà•b/­ŠÒ¡Á§m•WÊO"8o* ÉáÈ!]®=‚µC‹±ÖsA0>¬¯@]‘Q¾Â¹×Ö-ºQ’³FUôˆ¯bqØØæ èôã!D»_ x½ž$-ÉyÞ<,`V•)ƒÍî/VÊT&øÜs^Fœô/Wß:”ß|ȦËÔ÷¤«ÍÑC-ÉYÇW¢útrL¯uXV¢¢§¥À¼µ×™êv7_E°~B@ÛÀðò V§¹!vÅ4~ÚBÒ,ñµW’’ƒcÁìé ZyáîÇø~G‰ºèðšk»Åê —\%(ÖO#›W2Æíf£5Õ•é4ºÚ®›1×%]$“S/Xƒì%òf¨lÇÀ©(YúÙÉÂmåJDhvªÛ'a³ã«¼e´U´¥ùÄn=8|Ã& n|­ñ0 ÑW²ôç̤ŽÁ—¬‘î™Nœ(+v°“ÁHp¾$5)úï¯#;ËAìM¾°ugIQž!дđð«ð¡…dSàe„ ‰Öæ¶^Ò±|²ëËÄèåG²I½Ê  kØàµͶÉòv<Í…嵘÷`©×t#ÝŒ¿ËDŸ–áÜ ÎT…½\µ“Ò–ßžy1Ô•Ý…Ë%³–e»h€ÓXöê{¡ŽŸ D}Ó´9ðfwîÒé07ÊÈWýD7aF>J1ˆHu'ø¯4ç­ìžÓ‰¬ž×3giÏÿ.KaÓoŒäwL`Œ\¬%iÇóÞµ'«œ5 —66²è‚g ´×;ˆÌÝ.‰nšÝñîåf©ÒËOJ:BiE“º­BE0!S†Õž5ÂrŒ÷mÈfŪt‡¬4àÍy)C¾bU!Ã…-—++XæÐ¸|‹FïPB>ªT!Ë~?vœqëv«a T<Ã祌ñ®+O/xìZµ0G^«âŠ?¥KÊžO7ké«Wu'Á­æ n”†lÄ&ï…”T¹Wˆñº?+ „ç'Z ª8 Fd/áÍ5èÖ–¡Æ¡aÙ«4(\L™û°HSÝ%™Á‡#uoŒÔ¤¶¶T»ˆqõWP’ÔœArkÎãdÎÏEõ# ¨P˜‚bó+ÿ:Ì"mЋ*_B‡ÆØsÌSþ9ˆßtñй5õùúpìÚŽë/ˆPåªOYöϵbW—#Nà't£9Û˜zwúìØÿ/¦F8´ü ì.|îH±áÛIÅЗÈ`ç—¼ `ä9§Pl´7ÕÇÃ)Ð'f~tƒV<‹ÈØFnÑ E*éÒ®Cu5Í ~çú*uöï˧ŠFÇW Âj ÊµÛE´šA´Ç=ÎÝ|Ñrœœk§›ðœ®&é‘ñH Ydê9ü«<”ëEÂ(¯ŠÉT·•ZnŽÍÙc@«ËB-Jš\I™µR¸òú²5·![z-lÆóõ¾Ëbb bCœ¢k>Ã4Û]”uit8Q@aÄ2Ø×&s‘JÛü>ó‹ëÝ)VÑøº4”Å Q9|•j­÷HZ+…ÜÛð5Ïð.³Yd¬Ív7xަÏBDQc1+5¤tŒCyHp(òQ†G£p‰·;*`®¯ÁñÝ“w¾€„ „m X:5yò›ä´òÂö3¾ËÃW òâò‡SôOSJ,Vú.£¬w¬·va\ ›—NTg}Q3¥]µÚêݽǃZP&ÒQˆÍÀ߬ ʨƒ¬™×]ÍO¾V†œ9”q±n6Èj05â ¨§ç­2Hƒc`¶Zž õèå"_§¶7R:çë/°íhè­Q™ãÂÓ £t› ´X»–к”c_A`À‰$;䡉–¸›õÄËÃË`ði©DKBйr1p=!gU÷ zKû˜µ(¥ª~÷æFμi¹Ò˜.»xhÐ!‰}žd”á™ÒÙõË5NÛ¤€8½%B.ÀÛaá“ò;‚Éܱ ê‰Ö·ÏBg1|ØÃ#±›Œþ]x›ŠCæÇ=9áNÕ 5¾ÀeüÚ"3f£2Èþ¦ÝÊ‘™‘[°ßï—Æ, øÉ‘ÒÿvéL¥@Lƒÿ(:ú?ÏÎ^bèÕèÒƒ¶ ìˆ+ÁêûÖ_¨é"U¡ƒ•ºw´ýf’ÞXukTÍðÑóºN«ó@‰Ä?œ£Yb”.Ö&y™·Ÿ½]æ>Ãê|É…³oµôje L ¯blVËó‰Àæ¯M½ç}®ÓÒ¨ç0É’¾ˆò§ ®ºˆˆ½Š¸]è7$Õ»r%oôaqµâŠ€çœäÈ2,ƒWV1C®1pqÄ‘'»³*<¦if›®Â.V(µö¿Ã+=½ïÄdr•»Kèsƒæúy©ÑÒˆDí{-}½šÞòw¬*ˆR%¸@ö7¸‹ýwÊ”dîçüüà··#p©0ËŽ§¡8Ðÿ ´t¸+°ei¥1%øIG\‚Bf!¯w®Jä$mWc’%—l¼‹³:ßSg¯Ìw\«qU[þä¼7³¬Y»û©ëöèçÇLòx7å™âY7\ŒóÊ9w¨ub¯C‘Ç|´ÔšB%3þ Æê.Údl-èÍ3:*Iª]4¶˜ 5N*ÝbèJP³Ä®g59H.ÆkóŸˆûòöO´E”Ùd)ö¢»&¢+BÏT§—¬H½DÞþË{ ^<~]axV7ºÛ_ƒawöP–]Ji,¡Ü—x@{Q<%Ï!âW‘Ás¨~¤óêì¸ÖðX3:ûG¢êJð²°w;Y½ÞW7èc6>f”E—½Ïî‹VäÉq¢\å©#(1ÁÍuðò)i1¤]’Bsm©ÎæzTúq][aÉ–h¼Ð~ôЙ£±Á±`µÆï$ÖÝ5šîË£o›Ú¹üNÊ”0‹*$Åÿ†ýEº‚¤^ÊaÍ0búnÎBq ¿S¦D“Ø.þ76NŸfl¥9SÃÜdþV7|8Ž‘øpˆÉHà~GÓtGŸ°¤—ô%‚­0æ§=Wøc oÀèuv}…Ö87¿¨ÇBQgGÐÿÇ»P‰ 2(^I~2É)• þ: 9rºµç`<€>¢©ü±‰—Òí^ÂC´‘*‚¶¬e9/pøó|ÁýÑcËËøOŸ-è¤9Û1-¸éʇxþ/ÇÍEÉ¢ÖŸŸY|´ôzí ‘%Àùr7?oŸ`Úp[ãŒFË]D;pС°fÏÛz…ÑhîÊ•µ=g †¬ð,®ÔòÆg2§S½ñ]hbªj?,×!‹Ó¡#X>M>Þ`ZöîîŽ1K%n–¥¹IIhPõ¥çföÚR '+‚ÿ<¥¼Þ6°y*9Ê3מ!·¦ ’)A©@·J8½ ¢‹!²É÷¼xñ…ÖgšP Êýj® =<ò±7aêÖìè¯u?½r*<£T Š•c /£s8O¬^¿íFFCˆVØWõ ÑÎÅ[ÙQ²ýÙ+·=d†óU§2·¶ñgSþáÂÚ§]à ¨³€þ óé鉩֞ӷ•®>ÙT ~ÃÌm¯4;‚¯cMω_í4T à O,ôʬSÓe¹á=¿%ªee­¾3•Œ¹ ÈQ5l§àQ@ƒmVé÷^c÷Óx/–²âÑEûeè”ìl©,~Re1a<6X܈ ˜yç4œM–i CâY6·’“íôÕ>¨Cá+@ 9tp?ƒèÿ¥?VLjêžxÜ—ÅÆ¢/:q¢B¿x|ùý”™H•ÅÏì¶{U •7ZªxC¸Ÿ7kêiùz¼þº{q—œÅù~´ Þ¾Àr¾=7(¶Š¢~‹PUXíî<Œ/=sÚúskTGÃÊZ’–dzáåƒx8QÝ’üZÞäêåiæÓAGèÄ~KH+Û{šÅQÏ(—ÇRžþÕÌž™.7tÎÞR¯W)¢ŽXX‡D1…Óx!ùàÇë˜"Fû#0ŸIq'd«n´ƒà|íOu nÃÄ ÷Þ7wȨžMSò§xeLA_¥ F—û*¢Ó«Ÿ$&ì4æ ï°Ñ¼ Ž·%1Žò7>›È„(sÑ[äL—¤ÜïîL¨0Cbº[+='{£ ¿þèG<ñT߬€Ÿ’ÛÛn¯uo Âç 7Ë AÁP3†s y4KˆRG1¯¯I¯_}½üб|¢>¾ñ à'àlãXÞ˜‹‰y[ž7(nÜT§"ØSÜó²£õkÞhiUPWR_oG I/ð³ÆQrcƒ¹úV‰0‡senmæPÃxlýÇ]á[äiêz¹RL/À!Ô†ýßh?G`3d ¾G1ß7‰ð^s§Ä[Ö<«ä˜eyŒ…s'c Ù.¼ÜÌÜQQTÏWxóê…6T6éÙótƒ-í¾,œªPåRA5šëPó ¼Û ý#€¥CëÞÞ Æ’Š;ÓåË'<}"¤;ÅhïÍòõƒ‹ªË¦â1Ê=3âws…æò?˜]æò'« U(Þºr/ø¿]=µE@r‰Ì/wÝ–²«…Ñ&þÒXûªÐ¦ˆö=×Ü»® ™äa ¿Op [)£¤ÕP¶Y:ÖãJSû‰_ï¹› "×c³T×ÀÁ~r¢´ M`V ָוž¥ãýŒ<ïpüôiV˳À•ÞN‚öm›üåÚœ7¸a¢Aü; òË$²•‹ê'ò:„ ¿Í/¾¯ôæ :—»CvÑ>ó´ú÷—V™&Ä¢>?+’ÓÇÑ[{DFŸšJXîMœ-†Î¡j?oB4>Õ)¸lq‚bÌÿ¤eêpÄ×ÙôpT ÅZÞPlhäõšâH±’(JtÃ~r@ -+¢•Šg7‰´›@J»áv1É3ý¿ïB—yö(àíÖ|Òøh/r+‘ÚÓ¶I°Ýu웾óW=ñRp*h=Ôƒk #ÚõÕ‘‚H»HýFDG6„B×äkTœ.Ûò•ùæ†ö\O-LW ×ÔÂ×J?•çÙÈÖœ¢*¬)*O¾“{ø$M~« Ì ªp–Ò˜†9CŒ÷D{"”\ˆcœ=a-¢ÍÝß®;]À¤dTDtÞƒªœPÂtÒd7‰)¸c/š‰zUùUä1›ŽÍl× mšO9ô?slï!Ýz ÜËŽt™é¼ê32H BŽtÿ¦/-$Òšß×гgÉ@ÛJš•ì%YŠêìs<ú5ÎÔ$Ƀê?÷ïšßNU;7=ù;¼«Îïr¹ë|‹êâ{ÊK€=Ä}JDùÕ›+³rù«žY° “[Sëµ¹GCö|Ôkܺ"Cµ Û]IÈ%w, Œ›çoMñÙ€‡Õÿ! ¢1 ý‚ïšþÕÛ|Ï< >ŽC"J ‡U¬f1Öµ¸Ÿ‘’½Àiµ­W0rú?F±IAF‘²ÙçÑqñÁÝè}ê²úGs‚› ¬R¿Õ Ò¾À¨jà¤q®­Î¬Är¤JcÓš6í6;òd„G¸AË‚‡^7ý»ko^Ô.=GB‰²ô!CùÍ%I1íé§“À)øï¯ûpB_ÀLbu¦Da<‘©F˜oòCP|Öhý¦a£ú´éÈ[¢C3`"Ž­ÇT}N¨tÚªx‹ØÍ¾¿{ÙÀõ}óÃV'°}œ«Ä\M…ÐiY-ßgcÑ­–:D½5Qá&!•æKrÞ½I‚Om.=ÆœªçPÈ¢­-Òƒ ¯–Ó+ž‰Íþ±g ïŒ(,Ïlp˜}³ì„U þòés ñ 4(!÷Ø8Ô•;ŒšäX²LWlS, ¶€v‘SjS¨ïPQ«¦ß+^gžrÆGqÄ ‚}dƒêpßÃò—‚ëõFcð—T›ùJ ÍB£~£Ì^–$\­½»¯ŸšbN¬°<…j@s/EìFbµÀ‰så,¢z$V&z+ΞØ~’Ø^pYC‡Ä¹„fñV“Du©P^(iŒJ]W¥ZÖÒJgW%~‘âomÅáÌM’CFÖ˜øõC3\÷}¯“~ÁÖ9`IJÞs!O’’ôüïéå…ÇBè!¤z„Ytº’²Áì¢KŽ©…Îykƒ$öReôÝ[}¾óy…z@ž¥kí ï¼´ÏË„ r½;Ëw ãâoû²ÌB]Y» ’¨˜[ên‰gÓL™+}~ÿ’¼¯µ±N§AïZWËÔX¸_=áút¡\zk¿Ð]ÈàyéN`8>Ó¿iî=ýƒ:CæKo½ü RÀM ¬Ð+¿ÀC:…ìdŸ¶‰ôð†³ä6]ëÁÓÇZŠWú[çQ´j­Úýå[IÎ*­Ú澄mDÐ¥¸rKxû‹¬r§FUí¼ôÎÑGusäîôlòÍ(ÒcÇ%£Mt| JÛ:7 &…ºsÝÆ¾¯Í¡wrw®•˜kxj× hs+-GÓÍÀP5Ö–*’Üåçíµì‹Ò4b'd ‡I€VÓŒ{‚é.†ç{1r ê¤ q/³ØN–°ÙèËt6óô1†‘«úÖNF(ò¸æMJÁùüú7>´ÌºÅêfî9Û >§¨ú¤á5ËÕæ‹´ðÿ«F\Gr¥1\IùN½”’ÖzHºÌKùUp¯Î$Œ«æ$}]…*>ó*ß[ídt‹Kê¯úùƒþÌ·F£ç* ^p_1',GÝØ¡BĽÏwF»¡;ðÞ#.)Níe^ê" ¨È:»F‚õ]†_N¿ º>!'íVgùó]¨s©¦…ñ¤1ßJö§â¼(¿a̵Ôè.QØ—‰b8….ÃÌë‘ÉÛ1#åD¬%?ö#Û­Ïñ×8|0® )º»‹?^fY{óÔÄ%%ý¦oDöäžr \ŧÛç4}4ÇšY/OO‰HY‚rzÞ¦6 -—Plß7U”ÎÓ|þÚ‘iÊ6%1"\7t™o±tì²Å©ñ‰”>´s`6Þý›½º*Cõ#ùnb9ï6ìõCrÉ =É™*Aú¼ñ9—a"ìt„è“A‰éf» €9z`j}•-4º Ý¢ Q°Ú zçsÉšØEz› 8$ *€ ÙEu‡Ò˜[Å„¹ ÞÆ.›ÑóßfBËÙfÝFñR£Î¬‹¸æt:•&Pès¼©:îÞlÝíç'í˱9åfn-ýk²wôaÕœwL—NžF—D7D_Ss˜yvÄ£—¥jÈY“Ë6)öÍÔ$S*gºâÀ%yPÓMªM'”©a¯¸v1]?w›ÓU#ážË…çæË!ç²'ô%a‡0¼)»øö¯¥U9`&Kô˜Xë8Ë\÷+|Ýt·‘(PG ŠÁ¨3?]h|7 ‚N$qR·OA=³Z…Ö$ýÕ—Þš6š“«ð*@m¸ªg ‹ëì+òDÂ¥éWn1Ð'ŽK3+3ŸÂ{fô¹QÑyý®qÑ,gC›ÀùH<^Yu,<=»²>Ô[´„¹ÿr¬õÕªÕyà‰B­Ž¯™OrñJ!+-™#º`A޹Äò¯cè¯VüŒ¸_àA* cȱ”™o¸DþûÛ²û“ðÕˇÉšte-Q´™¶g©5®ô|&ùÊi›Dô5Büû¾y£î)± WI×Ý>ñÈ)–Üœ+9Ùä/áåª ~7}zŠî–eRƒQ[”A{–j£ôÞý´•ÄöÜyigòz- õò[þ]k¾¦Ý Ç~?Ÿ^\²ì9mØì^=a“9Ÿ©ó,Ì@æKFÇr\\}o‡¿~¾S“7µŠH™7‚Û"2ÎçN4‚á£èÎ^)ù5ã¬ñ-^•;¹N1ûJœÞ£ç\°†ŠÄ¸y²—~¿~«{Œ¡YÚ¯{9Hë¤( ‚7$—Yê†i`L†IšPÝÎQ´è+Œ´Ñf]ó»g:Ò²*Ÿ×(:³UâL8R¯V“Jr"úóI‹‹Vi2Ð2 (˜j 8Þ^Îç±b`nWû„y'섘šrš<”†ð ºæ»n`;5èèØØ?¸ Z)ÀiGr>NVƒ;ÆmÏbÜ|ýoœPUöéOES‹¡+°½ùz?Fßó¾ípã^MWAD8†£l„:¢pÔAŠ­ 2/ AÀª<‹V÷$z‰Í5êJö;FG&TPƒÕò·®p¯ƒA-€:Ž##™âÉÒÏf äðÅ¡ET–0C>Ê |—ôBE”â¼öË›pR=‚ Ûk pÕŸ ü¸s'oSɪFí¢¨+é?0Ø™8f{Ç}ßzÿC]¿ Ýá÷+Ãs”ý‰S€½ûƒÙ˜c¿…2Ü’Ö|z§l¯Àl‚ÉØÞméÛÇLªÝ41V­†9–‘Âp/GG”ÑQåptK"6»|º±Þjïêbô¶¬$ì«wÔõ0Æîøçõóã—ŸN$P £®ÙöìÙ\~æ5y{—(A/šD¦dÅMþ{ Èä/>ØÓŸ…Ͷðòdñ€#.ûå®Á’¨·¿âzáЯ4VßÁjJMê_Ï5Gm0^ý×ãÒ2zÉÇ_Ã+CÄͶp” n.:’° 3­ÈižþÙØUÕ‡µ›ˆ³è™«%‹3ÔÜ=,.y‹¯Ÿ¨jÀ‡@ч$Žg,܆>Ý×W?Ÿ/ì£ãPï»û†„XÙ쵂‘yn¸-ÕÊ8 4÷ÎÛ60îsÕ©„³#?–Céš××rÜ«×Ë#T>A%•ÏŸR ª÷–kŽÙ¯o~9òÍJ\J‡FÔîìTBCöìmù¸[jÆGelûÙRë—\M@7`ò¸éÉd%RZ%1¡i5ÕÛõ§‚XHíÚÈ<ãÉ<™èq«GË×>fßC¥j§r'3s!†ÿ4ôT\þœÂWG­ÕC}^çRÑsì)j"2³+ëÔP4öC‡ë•U­–¶ØQ¨*#žÚË í¥2ÅP©V‰;ˆ…ÑÅü“—•¢òÈo!v±Ž¿bUJã^6g–¨^ZÊ V8ç&CD#Ä £'›0šè¾_g1ú9í¼ÄNž@É.1—^škۭݾT+Eô¯®¨zR|¬·£¡;È. ºM—wEß ú©c‘ⲉß^}9Ë{iê!ëÿ_Íã„·õ&ØØ¶üÌ^\­×W›$—š`‰Ã(¬¡¬þx˜Ä'¦"Ékñý—r§ 5¼xƒ¶^)%¾%}]r€`÷; r‰R›:öm Æã—jm‘¶]Œ-þX(¦]ü:iÕœ1¹0Tã-R:N°ú<ùsÙÌ-ÿ|ÆPíë­Cdwü¢SQôˆµ¢,ƒÇ£õÌYóËP,4aòÿrÄþVÖ´7÷+½1¦Š°ðkwMÃé¹DZÅ5BV³ƒƒùv°~™Žø°Zn²èš %‹öáÃÇø#oŸ¿§ÌËï˜z¸bÎÍÔ$Ÿ˜áæÔ¯Pœ^.ý*ïß–1Ú8üÌ@Õc0{cýƒ½xô €ø?cðB" âî_³;“éˆ$4öç[˸x¸÷üâùѼùx†²îçŒ]CîŽ|.y0jÏ/ްý~vûÓ˜ÃzûNÜüš ˆf†ˆ€ ¨`Ú‡ 9ò˜ãà ØÚEؕћáD óPÇuÂêgëúw}OžpOúÎ54L¢l]ßíÄ•^ÂèZS\Í«$p•0šŸá»xãÎ A¼ާg”ón]) °­ôö,Òm¿o|h,©»Ñ‹§0õŸöŸJèÚŸM!ÆÑk™¨“† /W¼Í· VÆû´W)שQ½yVËÙxžo”WÕ=Y?Ç\“ùwòÆ*é¿M´ ˆ\u§(@a‘E4ݧ.»ƒTÐãƒñçè|™ð×ôõSMwû3«)q¹A„äv<.Ä&è¤Æ£ÏbK¾RVYstìrí6Q4¼¡Ò¼ôÛ2¤05uˆ ß>MÀ‹ñŸ¾?änϼijOxý±¸&ëæ­Þ$XDÝ{²3Nã¶õåßv~ÈìZÆùïöNY‚"ìy…(çUDÞ:ð™EêêµG*74K=ßQQXe¥©¯c6¤ç¢µ1Fçø,WêR¼ŽQj“/ÐÃgšÂ]åd=,°ŽÜ®E$/×/å—ÆHÊ¡š«Œ{úBähaæ[å•Ô´“ž´åÕ[Ä4Vcf1*×{8 oY‘¡ÛèNGÉÉ»¡¶kÅ>4P c×aSÜ‚EÒ‰”ÝóÛ¢¢r~U¿éTo§ìûtÝ\ã(Ag ÙòÁd— ÿo´æéõ,HhAcËÏË §aî(Gzñ‚²|ÚëÓ·¾U…PÐTÖd¸6tqª¼Êpÿ*ë¾C«vS(² Êü+#‚£VõÀ½ÖLÜ ¡è:¤«Ì†ÛJKØÆŠ1w¾èé4îŒgX XXñ–çSä=à”»í0ê¿Yu5CœEab`ïW(-dÏš9›½3ýqöCè×…,Îp§Q§ÇM9‹Ê‡ØâåO¬êKâ¼dKàšYò¬@´ö߇oà ‘º«zÙR„ ƒpž,Ó ¤·–oø—ïï?Ê>hÏ^ è3ŒÛÄ ·IÄ’á\–ܶGL´¯ÐOµ}ø!Ëò—D Âwhópêfû¥´T“Ö¤Rdtº(ÇØõÒ/ߦuÖYÑ¢U(ZZ±…×+B¢ä#£÷ëºyäÈÌ1iÂiÃï÷†‹ú%ƒñàr_´µ¿Þø›l޹ã×I”:ôëºg†Ÿ!m=¦Æ\¯§xP› t\C9f°+~&½·L‘«\º tè6tÛöu‰²f´V$? ʘ4ãù…DL&Ø@#æ>rr»­è5rgšv‚7.<ß’C¡Òø _Ôdîß݋ѽø€P@B¥ô$CÆ‹P«œÆ$ŽÞþ³Šv£[~°}!ôD«à Ô6ŸÊw^¿ø"JXÏOai…3Hµ÷(ÅñØÝÕÁðÉÞ›æV+"¯gXp;ÄØ#b嘄­B;õksP‡(yÛ›×Ôéh“Z‚Nì×Ô~‰ÁCmVHiÔ^¼“kÖ £Q…£i¯’„ò{>$ÔúiS¯|˜^´Ò‰>-yûÃûöÔ'áÓ¸|Akí»Co`«Å™ê»/Üãã+x]¼ãžðÁÛ$°´Lt¾¿*JóAî'š¬ËeŽrKgO.5|®¡ÁWÚ§ÛåX/ôS@gQûä8†ŠÁEŸUý¥.§ tÈq°Â ¹°Ó!$C´ôÊÇÂDc’ÿ{×}mÕ¯?Š­ ‹l¶å õ(EEóV -{ïu¡Mâµm´Ê}².ñ>Ûh`hÇ®›¸ÔD7å~R ]•=334í³é­g´A5ÓbRH"O}ôyO Ä«I|Úê Úð.Õ“¶- u­3=êŸ)ë æʾ†½C‘Ý­Í Ùù^%ó,Ü4¥JžÊYg’¢Ì—„%ËOÌ¼ÎØ ¤´ñ­¢œ’ÕEj9]‰Zè`PÖºhîDÃÚLõ¡uÆŒX x3-®/F;3Ý[A ôVyÇ;oíÞÚ£'r‰ˆ¹È'½•!M‹3Αs"kI2+ú‚ïÙ[Øéñlš…¬³YÔ”­w¯.ÈŠKñx“å±x+¸Pë<À†ÞÅÙ‰ºùî^Ù:Ip2•kЮsÂÔ-ø€sn±ïâ{Íý –O†ê>ýõPcTàµv õ°kT NÚ-#”N1À­ß(DZ¥äµOºjªË0Õ½žå%ã©xÿŸï]¯©éVFå.OfïkF˜dFÉB\l1Dó7¨Ñ ”‚œNƒ.V£¹Ìˆ3|I>忬>4ß«óñ$ú'MººOÈÖ(LÍ(íp¾.41丑½yv‹£ê—%˜„#¨ô{9ì‰Jº“èRËÃ΂òC®<Ú½>ÚdWz÷“ðÊhµlÇœÑú«€åذqB31Äë]ÉùКFíh¡¡¥¶ÉYžÁWmw´L¡æL(^r`z%ð”S†nþ_2€ß 1y½ƒi£Có¬âTÓíâ8¨uJÆÂo>šõNÔ†ZI±< ˜Ò³ ÒWßZ0\Ó @š—…)6OFðtGÝLÉr•s­.ä7“¹£4 +ÆË°3‡ÙE½FSThçPÆ VMô‘èÞcº€‰Û¢3y5.æ“Ô]£tAS½/W£–Ò` =†Ü‚8òÙ$‹þ?>n¾ûW EWGÚoo˜lö°}{¾,’óäHŸ–ÆM?}©TFhê `sìNìÀ|·WÊ{@×ç²:¡2ºãÞJEY5<;Ÿ>à³£©~Þ‰°ÎŠs†ë”vÐf;䨷ÌÉÛIû 3!'Óõi …+c‰¼3”×àÅØùÑÙ„›×MÓ’À¯!tFhå!Úb~'kë,­Ýïȃ£1@ÈÔîMm2”‡”ˆ]]‚—nƒ9xÑg߯Ä3Qúæ1§W*:Ïá·/kÏ:…쩲©Ï]|àmŒ+Á”HN†*gˆjR:¤¾Û­‰25EvRóvíiðíõ.•=‹–N¼_Xá~Ÿ7×é‹0n¡7sÐ3°¸ƒä{éÓî÷ËÜ9z>š é”{lLdñ=Éæ$¡¸mÕ­@Sü£ûãdjå"}|³[õó"„[çÎ'’àÙ†oÊ*`ÑâΫgÛÏ—´†éåQF³F¥i³pj@õÍ î9ÕÌ<ª.yVZËM­r2NµÁ0“¿Õ¨¾þ˜šPäl|hl/pÖŒ ™¥Qq|èWgÔüMÛmq½œ’+Æí>¯ó‚Ñû³¸ÓkçT\DŽ1§ŠSŠ:-Îê¹XÚÇXe^{"Ž\»±KCoŒ&òghLl›H3¨öO™v,¯Ò,ûk¨Zcž[`Ké<–1+#^Mù¼DòUçhÓA#¡¸¢k uQ¶ÖžCh‹e†>ŒÓ¼DÅ*<_“"ÛÈnNKNwvݸÎèåUlã4ƒ+CÊpcÓª _Vzña”ô¤fù°ö¡=ò^t¢Bü¿ÖM-ñƒ²âÒ×5ý½PR›—†w2´€€¡ýü![Œ‘r²E8‹—¦ïèΣËaejd² •³§Ø—)-z®müL¶˜²âµíš;´¬{æöÜ&J¹Úk€3?I›ìd¤%B·áaµ´É~¼×ft2VØD±÷.%˜¹?(¨Ü!¥ÚtZY åjt·É‚TÁ¸G·Jܾê¿•åó Á^sóÿpglÅ'#… |€1ýçF†‚Ôì?U}#8>ì‡eh‘ê³¼’Ò.°èoòø â$S¦ô(–YÑ™°¦ŸíÍdg™A¶Áí 5pBe¬!‚r§¨ wˆõ”—›‡‡G×y„ÇÉíÈ`ÞÃ.•8Ð ‘ Êéöe«ºóÀÕ0or“8ƒÜ—^¨? £Ð½ùoYÇÔ*±áa¯›AþÝõ¤Œ yŸ–@ÇÂËMe¦ ÑÂæ¡ƒ* $°·ùßÌâ“СÅâÛ“\ÈßEðexÛ:˜™gá²Ꟶ&tœ¹‡ñï7[;$¥WW â¤|SCáM^O,&󾨖:Íœ¨óB¾…¤X¬t£ãb9ÙÒ\"hv±Dù˃Æ(¬ÐL;xUvV„'$–ˆ¾]Í‘ÚìÚE€\ ZZó[ú›;4¹¬ÈÙºÿ¯pxZ$r¿\TT¡— •Ûñ|µâH…zLxS¶Ÿ 6éxvJ’9;³Æ¨ÇP{(#"!‚ÝO:õÖ‡Z þV‚ÄUÞód2˜i<)‹A–a6EƉ±mÝŒé ©ƒÒpásO¹Ëý_óbh3ªñ)i üLuÈC/I’2Ÿ±©©kµLùø‡Fæ±KSv"ègITÚSáHE˜IÇxþ‰ûfA½ð¦oâÂå¦å¦JUurµ¤À Œ¸D­–âšd¦ÀaèÅsÄ4±kZrƒ+ÅGýŠ£®ó½tc?W .Ú­WÐøÜÝ ¦Þ—)c$onOål°¿å’æÈÆÙÇ'ˆîêí¨Z"jÔþ+'põ©¶ž½·¨ ÿÕ5 ëAÒ¦'Hë9cŸ'Sú”JZ¡=ÜÔÖê±7eâ¿T,±úݰ½(Ÿ@©£jz|צ‰ñ€øŽLï×Åê°ô—ÙÓhQ;Õ¨ƒýÖ¹)~w¸kèLÉôg£Uà6€ç<~Ï—ü©hA=„}»0lôÖ|¿¬ü°& nóÝ^.‹>ÂóÓâü¾oí·TçÙtíàv6m'v¬®!@X|»‹ó}ºxQgÕ* îW›¯`E¶×Ì7ë˜ã{>®É=GÍXcŠÇ]¤EÄå·êšNœrÏ-ȼ  ©¥ôÒõ¢óúÉŽî›t¿…5…[pøŒ£ê¼úü`¾”ëÇe¨•©rí#O.CÑsL g÷|¦sw,Ü]Ù¡ðµ'>¸Zí®³Ó±oÐÍ?]Œò Eצo(î´ê>JÓ:<,é0ó‰·âäžÒïž,A’þé¢+ÌÒ£óóJw ‡^è릛*òé9ž¬ó±­\tÛ1rVEÏ–‘°ž1Ï1?˜‘ËEwðŒ†˜;5Äñ`ý¾²n¶zt»°™‘¤¯èzŒ}w­“¨éyý1QÈá“IrÆm‚·Øvæ®Îþ›ÉšîýºÛiä° O2ˆÉ.d4‚Í^Ï`°îº"2hFèäÕ>îg£âÌIMÖÛÇשaҨŔ\°îS¸7+ö»+\žVžjÔòT…qÄ—•\ÿ·ûdë‘¿Ó†› ĵ5¦è¡ó®|Âÿö æbp÷ÜäwZ4Ïr²ñœäJùúét°0åÒ«5zGA|ÇŒ’Hd„tbY͸ŒöM¤Ž³S°ò„ÝÁg¹ðmÉ$ˆÌ9reö^ÁvÑõuF:ï鈄°Õ´¹àl933Ä#H‹À¡À†&jêÏ?ûa§hó,FXpÑšuM5Î+s>ô]C7ñ ßFzx=j˜Úk×ÒQ ~á|Urþ»u–…Ô¹² °*wãè^ÓÑ å–ít>ýWÚ¡°rý[-T@< ³Wö&œu¬RŒþgpæ²€ jÃ0t‡x;ûwnU7L,ðaVü~“Dõ7´ü´í÷©$qÉJ¿ÌG¿7áIUÊò±úWô­N „™Ñ×7RÌÒã™@1UBÎ)ûÍ›§…y+r5BEÝrD-$5ñÓÏœ¦bó-U§³áè˜â0‘ÍÆH(5ÆKtNô Þé6$óOå cCˆ)( Ø37£¶7¨C}0²)ÏAÖ,àìN {‘n‘FFï݉:×äÎUKh8{stGÓHs°/bž«Ó|"Y` #gWL‰>Tƒ fhV˜¸ÌvØ¥;‰O&Yd¬› Ð>æÓKrãHR¯d«û/@UL> èÙÝÐF`Dñˆ—D´ƒëÂôA úmaó¢šãnbV»Ü ‘“Lj+.(ušÀKé¢]ÏWn&¶Ô‚ Î?Á­Š+ZE3FoÛ&Úï ôamkÎwhœ²¬Š¦á;Ë!D¿·ívß ±‡ƒdy—´†«gvÈÍ Ë‘ »M °bÂŽ6™Ú‘»êøF¾uÝðJ‰D­áƒ—ñ¨Ï:"T°dz¬}7Ê%kjL/BÒlTú¬}rÀWg9_ êÓ(cÃ(1†:šP5SŠš¥Z¯îUŒõ’ôŽ‘ÜudÏŒyM4‹ÂIdÌ`eˆ§”ãþƒlhçoqìá"Q˹™6ØU_u¶ÖZOn_/.|( „¦(²AÜSt;lpÙz2²*'Äns‰ £ÅÀÔÙ4waÏ A+®?/?†èÇópæ\–ñ¹ñ'oÙYL¤‡¶¤¹[:ñ. ûí÷“EO–{ròä^uÑáìo>ç·cWß³UQJ0ú£8°_cí·rÉã>àž!= 2ÚAðaç íx,wÔæŠïg,AÏŸ)VÏw·!v)&0$è1_ ½[â¿•«Ï]òïU¹}y£¼ÉH_ó-[àž77c¦òM û.Ëm÷+©ÙÓ‹ÑXSeBÎ@=¤“WVFZT—Ô€èný]·RŽ tG™/…T)+L3ƒÙèݘáêÞëÑ)"`λ‡Ì8•oN’ØÓ™)J=¤w &°;§náÂJ—OxbkÄsœwÝŸÂã›·G-j4Ðv½êjÊ‹&AKì»=Ë‘;X sFø›u›ï°ÐESúDà˜ï…ã%c¶¬Òr'Uü9«õ[¡elÍõo+¿"ìÓ{¥1” ((TcN8“¬ÌDVÝJ¥%ÒŸœ=U£TÚ<`SÇNwAXd[µ}»š°‚dzv‰®ôhLÅOtQ©d"¼R$¥»!ãH&Æ`ܬUQëϿǶk™r)ç—)Æù¤>•­»¦×\ˆ_nÌI„fJ!Nîµ&1B 2°ot¾B[ÙÒU’8¥@Ç8|`W/QØñ}—1ÓX”Ì]UÝñ«„„"Ê%ÍUpçaÎB²•JžÀvqóEBi•ŒX¹·¥Îñ$ `™ÐDh{³7çfÅ¡².·¯¼¿¥µQ8.'"OYL4‚¦f%ÐÉ‘€1ÔèWDn”$ß̺¤Øn³Ø×§·cç®,ÅÆ„#Ñ/WyÆ£—T¯r¡´.û_yÜ*ÙØk“ë3ž»ë€Òoc!‘>œ~µ¨ICÀqŽô·³i¦ÑÉfSÝñôSC3„BÂÝ9¼Ä.+ÈiÏËØ€TÚ¤Èùó d=(Ö„øHÞÄIV˘Ü#=@MqdŠš’P:ÏE{^qÃ[JyZÖø®°fY7ah[»Û æœIœ¸ïaD|í醢…½;µ/4^A¾¨ˆd»¹z¦pÇõi„CºR̖߀âÐ¥ú’,¼ÉÞqB<ê‚vÖh³RÕ9¶j±–5ÑLò‡áeдÜ:íøýjŠbö RÞ 7¢mï\ƒôCôeQ2€m¼aïý_^¹ùÒØ¡¾¿AÚUä¦ùóÕŠýsfÛá&ÊúÁ{óÞ°´ßr!cá„”ö- G~Š+²"À—„¸/Ũ¬‹éÖ` (.#BSª6pguP[ kéú¤°ò(EA”Zï‰s Šä™ÉkTælÎL‰›eðøvò‹êû¯¥œ²T%IAr4‡[nÛJá‡]XI%­HzßñÕúzCe5i¥þÛÄ,U—ÑëÀ4o¼„Ç}Ú†—eQH¤Ÿ´WÁ X=Eþ—MÔ6Ô9O<6wíØèÝ ¾Añ}ðˆß‡‰†—èqõ¯fªïÝ=uº®¤‚O˜&°g†ÉåVmïng Öé$%OäjÎíTu ·!Ó}e³SÜØ[ ¿Ú?2L6D"¥vª¤ù¸½×NˆYú­ëC 4jø~‰ë´xHÛ(>Ë'Š-ÍŽ(ÌìÀÍÆ£Ì‡Ø˜‰£c)|¸E•ÅfŸ‹šü÷¥FQF€+ß‘AHxˆ5¾r®& {™p™þyÜä Ì€‘á ì<ÝYË ƒ5JÛ›¢ 3ak>cFÕÔÖò9xï>÷GBe¡9Þú³^¤µ;}ÁE!גΫûàkÉ…ÿ]©«úcˆOyÔ¾L ×!ç¨ÔÚä~š¸1k<1¥$¸î*S¢ý`w³sY°>“£F¥Ö ú¡@•Ýæå¾©¡ch3ˆ5JÐVÍ?r¾ëÖýÈ¥Á»á H–!¼K¢ ˆ\|²$Êâ|ù ‡iŒüÆÒ<©ƒ€¼^–G„Ü~†H\(‘Ò¿K8^D‘:»½ÉÓ R–äk{eœîT$çl„h8JBk©•űpï/Blˆ.¼ð ÌrûÇ¢ò…¸Ïƒ[\cÐX‰rÔDÖÔ„4Ε‰õ„QÊrÓ$wÕ]ò΢•Åè²ÌöVR›*;‹A1áÎKw½C =Î6D$ »A‹'³â׆tÒ}õQÕ¤‡?Ü!•ÃË´Z }É…²¹ÚßêÞwøaÂ0í £æ»þã›E©{…÷Û’§ô(‘²ô…$q±½"’+²÷tärMg %º„}‚]å‹õŸÍ{à…¯ŠðUŠËÂÒÑ6¬[2ó.š¹-®–ñ˜ÜTÚ @u7vâPñ5Ñr„½^Ïör¬O’HˆÊòA…=Yí4¤È:¬ E¯ ;&ƒ0ôªC²¾ªU¢Voz*KH;0Zu=OֶϯG Ú`õäËËxÁCÊLK&¤óUÜÚæk‡hîÂv–TAƒ~aü7' ã¯FåïºðFc`=‡#äoåËÁ8KXõ7m›“,bÚQ!¬[NÑî‚o«Ô”hæÊÂUÂõÑ°Û ”¨rS#’h¤ 奼¿;,àœÏµ`ëjȾ“ܦsVo‰¯eSŽ.3¼NÇâÀÅ ógmßÙºe”,a„‡q—W€'šëÿu<Þp»æ¿ V²l@WÜ6ã4_ÔjéMîÒÉ[s S@Ò bûêsÒͲzcA°6y=Õ_xD¯«§M£®^€øiÞ·Yχmþ³2âóÄO~\‡nY1\J€‚úât­1㹺ólI‹ Í/Ú2{ä1ƒ¯†_§µDý–袼#W9n§QØ ˆ¥4ŒŠãÓ—iÒO¢çÀlKý>Ä‘„uŠ¡Ø«ÇR.¶ò2Qî„Ó…¼6šrQœ~ÀžöòOç=Ú…ÕwÖÐßðâøîƒuºjªTæƒQ¨gVâÈö±&ü¾:À²KbÛRÙ?™ä±*Û%U\ð@[Q™âœql%!àm¥-“Ö¤˜¸¡ÍÿF)ÉzЩåvv²º\¦7…„®o9Ò ¿8›žôlê¬c‡.p‘‹ëW\SZ ~n#ºs&ƒˆ«u—M¼ÖµB_·-Ò1z¹[k×–’à“JR$å†ë^êNÏ:ëb}Èš-©«Ëš?0‡ÓYáåhƒî¡wßEj•Gô|Jx˜%9eý‚¥ÞŠ¢guüù©Ò÷ÑõÅUxbíÇÙç¯íb«la¤%y‘™à*C¾·½€pÍ‚k•y”¬0ȱ’=Èr²?f«æŽSÛdÇêK‚Y…Ûòõ°\O+hçÓ±8cz4QVÕ‹<ÔaRñ¦ç#•ý¹bö£¢<Ì ÆÁÓœ£º`¥é”›§ EœÖÙÔq`£o˜ï:¥p}¿¢’n$3þñ{EÔGÆŠb÷V2 Ô¼‹W4GõM˜ö¥ƒÕÿߦ,ÒNƒ*5 ò®(ÍsÕDŽⰜ’·q‚ìsèo9ÅõEý6æ‚f!ðw0ÂÏ|U HÛý»~Ͻ {tƒ Qõ1½"AKöl=vCþy'–ïÈZGnEö¾MÔnú¢Ö ˆU8GÛTRw /|œkíÃvtSҚ̀SàѨ”–ö™ó,Bëh€óxž3õ·ºYYÜ™3·GІ•uu ‚í'°€f‚/375"­‘ 0‰A$w¼nc/{|´²$šb|c<‰ª2‰•äÌõ%ز”ÖÒ¨/ãw ꉲ=½;ÇŒõm^«mK%‡þí¢Â(x¦R7Àg(C</R–êp) »LpEŽÄ9Cc!¼`WHw):âìH<Ô€†@ØH~үà njdM_¥œúë¯ûh*YÎÏk“zN«×ü›1Ù*i—äàz6­–Ä•£Qâ758èøÐøXù©3?ÓÆå¾2…Jºd¶8ÕɇÂ5<†Õ° a!Rs½[=HMHÙ÷¤°¶Óz*º8¦Û숕ˇÞ"ùHXZ†T!zaþ¥å,"ÞFÆÙPåß̽­Œ¶“$ÕëÒS,é‚ÇJT1>Ȱˆ£zgßT¡ÌbV†T)ë~CûyBÞ]:yõ˜Ð‹8ÿÅ2ˆÎÀÝ€#›ž¸S´²ç8ˆeÿ‘¨ŠQt’M#@=*q›˜†E/íåçFu²dh´8®õ\Ê@F"‚­Üƒ'÷ºIÜ#¹Ú¬­Wš³ÅhžJ ÜÐÐ6¯)D}?ŠêóëxG’e³W…¡qpò»‡vvê&:çëS½C÷J!ˆdÃ2åµJã¥T++ò´·Q>€µ£fdšÃ¦Ý¡ÀÝd¦&bú‰&-ÓIn¾Ê὜'»Ÿ*iqŒMc‰®Â’›–Ù1j”î‹=ee1¿¢µíÖpW”;ì„'·sñÏCÑÑØ8Rý÷çÇIÖIB¾a†`¡KÊhV7,ãp®ã%ÁŽªÎë‚XpÎÊ[ä~¼ÑL ÓZfHZ‰«Ð¹K;üÖs@VÖ·h›i`ž±”*'àt|ÕÄÂö~Œy7Tq–cËc]{‡ràsMmnyH«µæù±(ê%èjGñÎAØ;ßId!¢¡íõ™p §F0v³¦åm¥¼¶\'cÌ–"ù”§Ñ ”,<™ ‚ŽîU;I&ÄH3½¢‚„ÁƒwÅ爼J¸ÀØÑŽ ¥&½­CJ´;>)}Do¨¯ fÁVw¡shÉv[óHݬ+µÛ½Ädýc'Ğʞ¡¢‘lDÕY„b\HÌËz¨­n¿®˜Q£îËêR'; `/"§Er†ßèšêURšà^ÊeùÇY€*¥ÏÃ@g¯aöîáæaï)Wíæ‡×¶¬Š1~±=» Šß+LKðŽi»ì”8ž„ug\æ™>Á>i]0eH¡ ZÏFáòþ4Íø”yæfy©;b;6JQὊ]}N"¢]å¯É·0,KO©àÖ‰¬Üøs¿Óè^ŒK:ê¿g`4BÛÊrÇî}-ݠǰ2“–±èž€5«®ü®ÿøõd°e 5ÇV‡‡/iŠ8¯¿— ä²Y8êcãùÌ££xI>oóî«€;Io$½/äó3/lë”(ØBeÊÎsb3Cš d=5Ë)$Ÿ”Å9`rD¾íÙ{»…¹éÜÚJšÔFKßÈGøÂùáôîÝëÚ¨´€_Ú-F/‘^¤”AQDeÔü]ÞªQÅ ¶çël úª»Ã;0Û#ïæácAK”¤Òt’ã/;g¾ÌnâÎæg»òÿçe(«|úÝ•ï—Ébì©9§xjãýzgƒ%‡€A{Ss³@ ª“¬ÝJ<Ú¾ðj8ÃT[ŠÑˆf\‹þBuH)P(N­ÁÌ8_®K8ª t:TŒ±s.ªÝ‡2ò±LèÕ§eähMÑ«l—ŸÕ–Œ*DÑõ -N¨óïj"gÏ©RìhÚÜh©d/eò™‚^¢nXØj(zó‹‘duS{¢þdÀR¾eFÅOF*ðØì^VR®â.Ó\Œ/BéÓ ;v²õ'T}’ /[h{•Òˆ®’jMmº½¾ùH÷Ïøþÿ£aØ×îEâ"RÝ‚öèVAêA®Õãnš†OÀ5¾ï¢ù<›·ÇDfoÇ9(¼âI®½@´ò#ÆkÃù×c-¤ElcáD•^RÒ1ÆR^”k´(ndͼÔ-Ão­X±c× 9äœDe•ªãu´8Ö³ñ¢¸Š7 ×ÎÁ‡ xá¬ÙTŒïÑ +ѹÿh"¥ë¼rÂù,|`µ5s!3ïŸ38ذQ¶L9^ +çyzV7oUÐÒÛ|W0QEŒ‰©¡>a.ÖìÕ®Hº+Ã(Þžúk/7™{tã‡? „ø­!ŒA²ª˜]u¨ãx>+ å«“kS ±ƒxGÕ`i n¸óW¯Ù¾út¾Öê¥ð5bf¿O³LDZ1zA<’ ìµøPxõáÙœGÓhòó*¶F^ <ÌrÄš–èFY'PKçŠôòðhF¬MØ0e[ê¨6#Yý:´h?LøH##á‹j÷ñ'8íÚû¥éo c¨UËÙÄŽÃÜGŒ}ù=ƒˆ.¨þt$žhùW›Û§-_)‰ätFð Ûâµ|@O§<Â- dhèBµŸECCɨ‚ŽUÆ`·”hÝu¡µù Üž"†»<d&ªßܣƪu õ¨—åOÔß ê»ÿWR:³uún·¬‚P”þ­¾Þõ;@p™zKDú]…¾ß¶#¢#ÓD>—Ë™³.æ"{«N8Ëàeûª0Iòôg£Ö`,€]j~Pö¿ÖUö8ò×.ªÎ@ŒwÀÄá%,mƒÐ˜/¡œ~lsWÓž½àB]H;Ô$l ë´6 X—ì‚¥Ã6€jSµ+›ÇZ³øó2è“6åS]»×­a/F×lŒ¹¡.ŒÎ+d](½æ¥}®,6W½t‡Š½>$1L§%ò„0ÇK4[GˆÔÛá‚à;7Ô¢ú/…®]0 ü£m|…߇æev”ƒwHµM{Èò<¬1P¢ïå.|„qÞ|õp¬H èÅÌá›þ64ÁËIm§œ×0C¢­…«™ëjüÎbcJƒmr3Ÿ"ºÒܦAª.W6wóW'<·Žµ’x\áaóñk‘-QÕµcǦðB÷PçÇc:…Õ³Vƒ¾'E¢®×,Ð hü(gÙù´Ò[‹5>ÎDwœ­pJ±µyŸYýªWˆñ2œ,„žtã~ÚÉõeF*핬X†õÖá]¸çb„ Ûž¶Ì „Øb¤èíì9Ät¤Z=$÷1†œER*ܶ´/SÎPBψ 9¾lCsv‚¤Ë<ã_FÑ™!ƒ/2³ˆYî07FU N2â{é†î5ëãVl±…fé_}Ú´ >8Mô(èÃ8Ÿ-u$ˆ|Lyè±G_:k Mu³9`DÙ2·›<€8šÔ²L/YÃP–fÝăEûQæþõë˜Jü£Ä²AÀ{õ_ã;¯„‘e’;K«YËû‘¬jèüáSâ":Kg\‰ &ú˜o©Ô²XäšT'¦Þc%ê(Γã+4¤Æ?µÑ[ðÐ'4™ hm® SÌܲÕKÀ(v†%‰ÁcáÇ]ÚÍÃêb ™|u /\ä–×ßß»šHyªBÄ î´/•7öúfl˜F8 Ü{¥% …Hœ\þ6íH÷«MRk.ÚM±¤˜(\¶n)ŠKªfª¸Y3óš¡x©.ß*úR€…ó5ðÄU6úœäÐ0„›g\þ]Irs>Å *j^[#å˜lÂïò½²ÔÚüe»K­×¦Ÿ²Îl]1ÝGâÕ·:[á/¿B¤¹‹è´!GŒÄµ9 ç·êTP%øë·þß>x|3”ÖººUœKÆ.yùï18§~äÚQi1ÊŽôÜsݯÀ‚)óÒä;G×ÅBÿD®>X úzp³'5*2<’Íé„Û- ¾Îù€t÷&ð™g¤ŒQkkþµ²ãÌ<Ô Â@£¨Ñ"iÔÚäg{!ý½þcöô&«‚ 8‘ÅÎà ;¼Îcrç{¸¡k«?ÖtT²~ ÷.kûº¾”ýIÁšGNä€ÀèºhË÷ûØ{w¼zÈô&®î®I´YÙW"©÷ßpÇ+‡#ä*¥/Ì#ÉÎ0ø Ã…"|ãæïÎõ™¼ƒÀÉ„Å8u™\—rT}Œ¦²Ù µ.«ÜÄéF©ÎoÕ{âòØÕpJ¢ƒé$#.5Ë,Ä)ó‹÷¼Š ëÌ‘QlnW3è2‚oíµ6zÕKM±k-€ÇTúÀ>• 6Ui ½>ˆ:©œYm#9Oð«¥Ðø•+Ž×A´x‚˜Ay¶ › ÐQwƒ%Rh‚.Ï!`ä.ª::~Dáá`¶¾•"ÿàf‹û¼"V—Ž€qRzOvQ‰e2æürÎþU »Gê‡ÍŒó5×$§Ðîç–¥èy¯×äBôý}y¼‚¦pv‡>–?%7Üxæ­¬Ç?Ìâz‘ÔåÊò&o<$°<‚ˆ@4ØTšðn¼eÝÁéÐÞß¶>ÁVéB8_à>cä£KÔôóˆ~eóW:®S,ˆ¨à3ndó\ѧVœŽDXÐß§ÈžWL×Þ)’6É:äljv€@ù‘º&Fê¥,R¤¾enE> v.­<0(‹´¼;¬…œäî¹O(Àb(Χ!Ð}s(ê%ÐŽŒ–KS¬íÊ'oc¾C‘q&Õa÷rƒbŽ«W¿ƒ¤7UòJ«‘?ÅùÚá9Ü`ÍxÛ¿\A+${Hÿ–~‰æÂ`PÓ˜âk¤yç¸96Ê| ôÑ‹JcCôd-Å7¿›¯ð¥ê(¦ÓÈwH`ˆº]Ô³¸ùxâøfW{à„œÐ€,~ó[”ÈdMJ«ä„ƒffHÇNõø¼oÛPçe\vLHDÔ4îßPbÑÕÙ˜Njv-YíóÄÑB<h«œäAÚ3ìµ0L`þk:Mß ò‚ó'#Æ¡èb¯€¿ßsö'®‹F¨ìvؾË?cyy›Í§«‚_4·ìh0xÕ±ž¨´©†$›C—êïö9AË„¼‚=ðÀØN_ß´l÷¬/÷SÓx'síO£z®YCoÁÌJ2¥±ðKË@ê@r ².ªbÃ…½ñŽ/pU.±}Øj¾ñ±:ƒ^M Ô¶­‰9êòÊ΋¾Tÿàû° ‘¥^·Ô¼ìmÐ 4¾ÌÆÍ'×´\|AšUž $¢u®Â>Nd4fÓõkC•û‹—!k9J:óÊ=ïó Ô;÷É9‘ÇÀßgZ‘¶C r»ì"óæ {‹„æü^QëÈ|#C#Ø æR”‡xÙðFþm2Iøq)—nÔôݼ‘œɈˆÁL!yÇXYÞÝúùxŽ[E_G4×`â¼”ÿd<²9"”ŸFü(=K»%ð§x¾²%€AœòFÉ¥¼ï´zBÀ.:Qk¬ºèK%ë^âxñ2‰&òúôµ '…E¯ÇÍ"CË;Ô$f´¹ÿ6² }øØöc¸éjtå^ž‰®~ZçL¡'’ßêûnC™%_CÉíÔmð!Aº…³ëÏCsûV¡e‚âAB'¤K¨œz‰“rcøÁÏÖ%åÐ1ìåY¸ä¨xz_¼&䊚±qéTÛ¶sáYÏ–³Ru¶[@Á˜–Ë” 䜤'@9/È+à£r.Fp¨çÓ¹ºtòñ×n Ó¥t–ÿk>Eé’M_exÐ9J–œÐª¡˜pm‘>Fò#ø"äJ^&MW9Ò‡š5«Ü.eCíšidaô£+Mììϧ7J¹[\²¼äî¿X±øFŽÌìÛ;t1šÜɧrèxÀ™o“õÃ<§›4‡}]¶  ±bèÕíßæÁŸ‹Ão?‰tÏËeJ¹[0…{yk…½UÉÑÐó÷ _éåb´I_+8¶°^GM[ö«†âüÑ·cBÙ]ÙÛ‹%êQjY¦‰D½:HõŠíò'];±Áƪô†KgšŸ¥#8sŽ©¸,j£ÕøÄØ6`f´4ü€ñÓ¾ÎÚð^ߨ#0;%E×[4Ý4Âa)§£=zç,ÓU)ÖM{½¬“a'¶¤ÉÖÈz ï+å}鳚«Ì™ÉÙí’!…\*þ€‹X_Þgìøê|ۢˇdjnHñl@j5ÈöW–mxd¡½BÒd¢Â#økÕGÖÄþ¿‰vÉöžQ[/×ÕeN>—ãâM´ò‚8½nƵƒWš,üµÔƒA¾êxpT ™€¥É€ÖT¹ u´fc_Í"òX‡ÜuÓUgϦÔ Æß^ýS¿Q°ž”:XÎÂ’À_ jH[™ '5i E9NY)ǧ¿2†%` ªzU÷ËÕƒÒZˆ`ö~ ìÉò‚ÕÇÃx¬Éü— Ë}Ä+Üájîn‚&5PM¡ABäŸa˜ë«—žaeM|ˆB$Òµ³Á…0ˆ[^kˆuÁߟ_ç[´N­,;ˆœâ^»ób’å²½{öïèÍ3íÉÉøý!7Á‚iöJŠ”LOåSïÍ{z#1†\ÇŽ²SûoÍiÖ*§fAfÏ£‘>©çôy÷ _¿±qõ!Èy“øŠ<¾Òw‡ª¶Qô»AÝGÍýû–—´ À׳¢tg~0X„+5Dª*ÓŒÎyɇäFý“ЮÐít?Â͵ð§ ^.ÙêÕ—–óÒýñ ^(º O ±8uj56p ]îg ?ÔÇ!ó/3­Mè™^ëÿx›„óÓ6í=í¥»†\N¶Ûi0*Oª‘IÅßPjPlÌqowü9z±r×%ñ?ìØÀÿÊhú÷F]JÁÊ»UË¿E¦\ØKZ]k†›»øúz!¸þ?xZ!‡ï,œ¢ÝÞéÏ:ØNßhÖ¤)¥qoú¤ýM¨žñe3”RI弉ÃÖû9ý¾c„¶~8¬çÅ0ƒf/vØß.qdúOvͿƵN•QÉý=Óm ÅK’^Ô [¯úá»tcqŸq°J6b?Ê펭~,GzsãoÕØ^<Þ8ó¼|d1È”y'ÊXÈßµ’‰SЯF#¸¨÷Pq.âHûÈóðÔG$áÚKùãçs—“㵡У4ã~€ Ó‘ÝQVµÁ·Ô]N3Ï Iö³^T¹Ãåbÿf'”¨ié÷ÿ`ìzÝæ}DÕþ¼!añà? càGÇ€‡W-‡®½'ñÇýqø_^ò¼9(ä©€²÷ÜwwHÿÈWd0Ôƒ#nuÑš8ò'‚YÔQñ„€-HïÆ Ýãã«û·¸ŠÙèöiÛO.+®KrÌ“—˜]O ¯äÃ3í®N(´èÖ̧?ÞblRqJç±M_ÖÖª„QîUùŸÛì,îGGa®ÿëí€æ|ÇMäß­TâÙv7…x7D?›¶99ó$ÉÛCrpc.û–¥šy Ú• 6%qfV(p*œQg„2°©\<›¡¿Ç¾„®³) ¹#&cÑ’5­÷œ÷g1Ü %ôž‰Ì? ßç•+Ý<¶»F+™ªþZ|Qã“RoÈ;î%“§ñ® ÃS«ïÇ? üß²¶gÒÏ0TãζŠP oÔO;ßù¬~º¡íôf-As *ä'¢ßË#¨eµfÐÞ¨—Áóå`ý²„ÊîÑIgaMT tJ¬°…YàÐÀŽ!|½*ž4Gß”žH9cÓ(îyžõð­ŽHý Qäm,êI¥Þ[§ÅÏÅxÜçÜ´¬0€U¦~•²úÎ1AgrŽY/¬5—ºF%œ” æÊ îËWަKHQøŸúßþ¸r–%•²½Þ™-¼·nè½!F“8·é„/PE}Ï#ê’sÞù`.–@cÈ¿j–vs~’Æø6w§+ˆó)îÐ|¢J@·×¼ì; #šò¯&«í[Aõ•õ ¯a!av¸ ÆGü.•î0IUÃ^|i}pB}(ѵðÜK©c—ÅtâÁ4÷ùíþqô_팮[ô>C^ë—ÿ„•‡®ëªÃ(Ú¸uà;þÇ;‘ºõÍZà]Ò–ý¢¶ç4{Hô}‚í8ï0j9j£‹å6œN?'ãÜk,†!î˜ÞR÷±åñòÐý­ŒKY~ Ö¿VHåJ›ôGX“=´=Õ ÷Æï>1ñ"e½Éd”2t<}õövÈGß­šR†ëŽ¢¿§;7hZXH¬äEÛ:ȸv™\L^ÜYª¯ÚJ€6¨ÇâóØ£(œC)ÁÜŲñ!j óK°s$c)!t-¯·^Ú¤?oá–¦Ö«’MŸ*R9"•Rw`‘ÍTôâøå.LEÎ "7Fûªª³pÕʼn⇛ ÷fã})%1͆m*s+ÝòâÚ'Éní©3w‰ÊŸ_mjàæã¨*OWöÞ—Ó,V åóèî˜Ùuv ¡ñ¶òÊÛ)Œ>·( ûzm\$¼³K‡# Ã!DÉKÁ@Xt Zm'h:íi+¥ŒÈ'åon­=k É‘ukë}§ƒ8Ä/´[£L Q”5¨Ž7Ð/¾VÏŒ5ˆå£+st˜ ”g–þêuœPœ‹Gã“eËF“d8³·(%Èñ¢Zʸ_Ùß”9ÅMÁ9–Œsî~¬Žû­ýä-Ü‹eeõJáè/6¸ù Šï»Ivå ¿wæžÔÔ0RªôòôaNB…d‹ø_Wd¬Å²Mf"O™Vö[œÅ‘¹)ŒnéàŸýõŸ,Q®ç)Æ­y#͈z™¦µqüf 1¦“3šÂ×ÀF½Œ™Í:»ˆd±oÄp™~±.ÕÚ+dGä¯-€÷ƒ!IQÓ*¡÷µN`@ÖSòÛ2;EûíÒ:«è‘’HAypü!¼²ÖéÄÝÌœ òÀë/GýÒ¡õKòÓ›„ÑúSð9Þzï=V«ò­Ú[ˆe>2)ß-m(ÚÆc¨Å—¢¹…,+mæµ›àèÞ4.Jÿ¯ILU »ñ˜W‰'ó¶Ò>fª¨U\‰O¥å‹·m¿˜G¼[9kË =CÓ>@͌޹äFk<ýô…Z¿K‰ü| aÃ9‘­L Ï % I~RW¢mYdµÇ¿y¢>Œï Á‚„ ÑEÑ5fè‘Xº›iV>O-«¦šÚòÁC.ë62j’ҳƂ,»à _b$Qdø­~ý.J(ºcl>‚ÅrÕwtj5cLÀEã©ÇÙÁf¶Méé›7²™‰ ÉD(w9ô)@|vŠ=©JFYÒ2ïÔ†u¨¬ÝAãºkÑùXpÊÿàËA?n*n¶Ñ¸!êÄÈfLά""G$h½Ñ-‹… ?jÓB=û_b°1†ñœrä‹U:!BU.4ù;Ã?{îå®`!»ž]G°³oAõñc–ywŽ'õ+´q i×O’¢m·jÉwqnÚJ&l ®OãÖTŒ:&~QUN3¾3㌭b GMi¢+%”8áŒHæSt`é·9s:ó†aIË ûBúÅP\·å6£*!&Ñ(ÝR4½“Ü©Cåx[iÔOäRz=Üw5~uù)Ó‰-hE‹– a’¨íÛȇÞbnj± Öl\rå«FN³0kÖÂ#`Ö·Ø›õdyW\Ò©}š-[›šbÑD°+Ô £VöŒ}«Ò¯É BV. [Üæ»8ÕuÉ®NdèãyÛ'Wœ}Ò…˜;ÿ‹.¸B+hjQêÎWD»w•w8VÝŠ‘f08Ú¶½P(‡Á95eý6³<9r' 0Ž$H}êÜ¿þгñìã}¿‚Âé‚<Õ¼ÉÌœ²î#\J†eê‘Gm"°Nk›¤6?¾?Zó–¦ ¹: ÇL- 5wŸJ!ù;GÏÆ=øGVü@KéAa• ¬sýÂûcvÄb±íÿƒfÀÒ?J`üó"2VŒ’[ºž“6a \ýAŒBa#‹9bwáaõcx¨™ýiç»ßó7 ,3VNÎom£®’ŽW_¢J²áEÕLú}Bå°,‚ÆnAµ¦f•Ͱy m±_¥zèÉL GxD¾J?øÚ`ÄÌ«­B'³žÊlÊŠÕnÞ‹tÛ"Äa­ŠvFO*í¸ ¥ªKŒš>² Ý4Fš@ò®%áËÖí÷b€Ýâ’øçZHR¸ó8í¤ÉX_KˆªßÀ¡i,XÊõ_¨A zQhË ‚5f¸£‰°Ùöj}„~ÿ{é0`ÚhÇK¹šòSÄqšÙ£2¯Ÿä¤¡¶y˜L€Z²A¶S*õžd¹”ÂHž}Ž´Ê â¸ÆYâNQ ô+‚mkæÖrÓYOm¤ŠcAxz%–‚3"W=ß «ä<Öi½{^RM“š@7)oÐâS¬t5zá*­ähn†Q'üg¯wZ¹Ô}vm›)Í•]Ôh`( èoŒV™qˆƒ¡®‘=Íó\˜’:D‘-rÿ`® 5FCDèk§'Š•ªS`»Æ“oBË>Ùl}Òÿ#F(ý–*ïb1NϱµzrÚÅ¢buYY˜:°_3à Ç- Ñh%û4zk(œ“-Át¯N§×_xóÁ' ÆÍ$i𙼽.±,mEë¡Ø1j ­ar ¾2Ô$Ž6Û ÆA Y†PsXc™st¨Œ yãný²sáj}7lÅÇìM]=aŽÚv«Qц‰°Ác¸t{£*‰5×úzƒoœ"•ÎñÌÔ)ŠO“,¯ëNôšù”Tof#wqßq[ˆÎnKÎqCÁ#T‡».çõ®&ÖÏX°‚*ßÞ ¼iÐLtñåzBÂbˆJ6Ùw²äí¨Ç  ºïÒÊ5S‡Y=- ]ï·Š%ˆ2 E1èq1x-[®oïôH=ÂÉ­Ô3Ž2vH/?Ž•kÅŽ}~:ƒUÑGµÝôWâs«Ù:oô½<»lÊíVZ?Õ ¾Í}vfX=¨NŒxh²Ê?w˜9M"5Izû³št ð¸¥XÍU/CôŸ"ª9r†P\:æY¤S%¡”ׯˮ„X›û"ÅÌduG«",¸i”0úÖ&÷…ô1\Ú¨rqþ™Þ9Eqï›-Sî3NrXº˜Ê vêBõòs÷0ì5¤3zr€zMD §ÁÒ·eÒð§xNôב ÖAxtÉ—)àÒЬV¡¡; û¹& ô^@Yú]5 ®M¤ƒ:.–¤šã@vm û˜u Hû8êe7ðÛTš£Z±À„êWPÏÜÒt#AžˆR4CǺ|_¢<3п&¤=ÞúH.ýÂïR‡ÁH¶ÅËÉÍI¿/¢vñwp³?aÛÕfæƒõôY÷÷WvD—£¡DmÓZ?7jƒ›Ó$:’¾ÇLã"‰¯#ºt4¸ãvÑý*†t?ãeÍÚt·º1çßVù¿Cà¨>xñùÔ›}+™Pâ¡– ,˜JŠªŒÐÔ‰^ yþ±«P) ñ;7ÞQ~ž.†ÁòGX9¿¤®¸)FûoÎYÜEl[ßÇš”#ãÛxü; ÷§ž»mâÖwJš´-*ï«Z›ÔôÕæ4(5iÛáÁðu®²ôë®õù¨i3¾6Q®íI,T›vˆ–öÇÊi>Zsßcç£Ú å^x¶ä,…V-û™]V\Š —EÑ`' ãAÑÆÚf‹ "ÙÁØcJã™MÊòX"P¤Ô™”à6Z4œ1@Æzf4Åi†ð-¥ Ú0ÞU½Œè4ü@AcV€6 Q€ í²l´Ô<û i¶D²w‘”f:K{ð—Öƒ£1žãnyŠÄWóòN§*šœ„ éèìï G>Á­µR).‹*{odRéufMAJ¢bQ=n‘FÃbž¤é.V 6&Q_Ü^÷œýB>Ò›eEk¸#iÙÒ ëË^ƒ\CÞ…x‚ù/,&ñh7ñï¢ì fÈ åÜ,ÔÄB •p›ÕÅ´XÓ$j¼“£®æ¶Ð›Ð!\©ë4ùìzõá”FÔ1'ƒ–h1ç$¦‚8:µ×yj Û18H>iÊsÈin­:‚ØY¼l!™zõ\QªQNìQBר Ôì¡xs9H_Ë$¥ã:°A;øõ®¦ü¡wû{<Ñ ø‰»"9츊1 ú´÷ʤ(§kÝ•¥—AÏå rE¥x%M • Ù­‘£Ü|8«©žΑ6'¸Ó4™ÖßiØoD¢Í ¿˜Ï-üvmû[íã®1ÐÆnxŽŒ@ý%‰ñ€O¿C7*œd-¹sZ}¡ ô‡Í{9s€¼"û.þÃe F§3D˜kŸsÑk¡+‰[|h¢ajB…šH2dÜÀ`Uäl?\:JBAº‹8êä˜Ø •]1xãÿÈa^+M®ùI4/ò3®f|³’ßæ]¦‡g«Á§IŠ 3/¸Ã£²iÝê7N}«•( LÜÝ}#gÞÕ8TñÊY>¸ZP—Ué<îHFÕj Á³›ôÁÔNqMÏCͺ.¨GÎÌõ£'®UC¢«)§•…n²Öªë ©áÞ™ôýb2¦A[Ú庰Œ€ Qî'=ªÄZý.‡Fߥi—Å’ÐßL­Á·VeZAupúð.‡Î¶æõ‹˜ÀŽ _G<)N °JÕ0›ÉªN36¾ßâ²8Ô}tÌ SyÎ…#e!r9ciš†Ël¿M&Uº´Ï<áž“Ëêj°¶®´—žAûsI·4ý+Uƒîø™·÷ó$ZÓ:·u®h²7 Ò,ÂÊ‹rD öøÂì›ñð[¢´sÑRÅJó´VwV«™ë ¬w9¯!ÌÏ„Åg6< ú^+µ' Z:d”…6/v`ͧ»UëG±mÊ/È_+¡­v´4ôbÅèÚrg~{Kdºó3ö€!”á¿ëZe8Y†kVÕ£› {hÒ­û%%;”uå&ñöf«T¦V½ ûcc${_h/Ç(;–ÞÓÕ{†bºpï;†e9«ðeG®uaJnÆZÕõûlÊ€Ë$Ø^dèkƒæ 0¯îRå )‘j¤™1<üÖøÚ â¥‹Ë7¾(ƒb¼gæëùΤ›»!×\ï4ŒGoŽV®ü½ó#* úÌïI‚MJ¯B•Ðîæ‚ĸaË{À/qÿ{hZ8üÞý ’ÅÑE>3j´O3•m5{9?f›C—ŒŽ2öêj— |û¯a%x}±®e=“É“Ñ.a£Ü2OžÖÌUÛ°³›)Z‘«Jç ûÖæ {ŽÑæ~jdë× ÈåbÍ«sLÝ@¨ Õ§°Ì…*¾×T?{Jiú' Ò«“¡ ¬§Ô/¹*ÚîƒBò5¾rPALìöÖ2ªI’åg¨÷P0,’LèáÑt©WTíôE9"ÇóÕ…»™ƒPÆðB„H}$Ä ¬”Ý b"¦ÞÚlEƒröx[êî´küKrË€¥N÷£"áJÌÇêæ ¿!₱*yC2zêvÃC@„&B”Ôr{“†òôzºiZLéðÖ_ðòóL}ù WPâ÷J1Ë+#š(jWr»ó?hì^³ÒP¶Ì ¥s»²A[É¢9ÕþCm¾Mê{­µÚr•NGÐ^ajŽÆ_/ wÈ/ók4ë'Ü¡Xc_ŸËf/zɲ+ëù"}O¯Q×T˜”! "ËDÙÜüêÞÁx|N—hõp¢D™Åq™Ì@ä¬aiA>™àEö)WíöÕ„»\rª)#ǧ}ߌWDç¡Ï>´2UKM¬JD‘›ÙïÍÕØ}Gõä_Ì—öÕ[ÆNÀŠ‚ `0ù^·¼yU<üÛ_>Có@ãn dõ÷¬Á>O\Ûü#^ÔÀ£Ì]FùdW‚”YB—]˜÷k/: ÄÌŽ8•Fé¢0ˇIǯÌ;hŽR‹Ó4SÎÌ\äAí|‹E€zêLÇFY!#‚ÛóÊåÉ6—È§Í ŒÂ°P¦+5cõÀv5ìÄÿú¯ @´¶¹*•Í •ÂThV ­]Úù7«'´ÑTº8:‡¸¥*çQÕ‹zP‘åœ`hµB³-â=šÃM8?^v<’—hÓ§ ʧRó¤ *q<ŒALjÏÂ>¢>õ•bìVÎâbvíaÃn:IQZ¸¼±GÇKÆ›×I·Èš'ß?hý®­þðªÕ-óÊ*[]‡Ä(Â,Œ·kà$‹Ã²‘6¸ÿÊ>%…Îp“Òµx¼¸¹uõ²ÄÛíÆOx³´ ¡² ÏÒVÛ²!–pÙo¶ãäìÊ!L‹‘o›™¦º™|9H&nÔ)éN¼ÈÊZÇ©kÔÈȹôœéh9}že¬÷—ôÈ{òj¡Ø›?ОÈÁhbn•KŸ]GãÅa>-íÆ”.qÃï‡¹Š¼€q{ÅÔ´÷eõIz=I¥El0ª•ÏEG¬=¤¨&­ó.Ô .f•’+$+P8šmòl؇>Š[¤Váãêå ½½Lg¥6ã¹ÞXõçýÓy„€_´Œû !ϲ—NŸu|¾*ÓD\„Öpsun­¦Ô"ú~Ý3{¶õ=ÛO‘|9‰€«¹2†|°9FJÐ^atIäŠ5 ZÑ;‰9ˆSh·âŸ·fŠg–ó:ë–Ó<Ëp[ÆãÄ*€¨bM¨‘E9Šæ¦Ç… Þ| {!mi Þ²¸F}6ÃêÓ€?A{ÌÚ~cÊ0žZ Eå”hn¾šªN¦öMX蟖Æуn²f¿%ýéV©¤á/zððû’W" ðŒW1Å Š—]¤Ù,÷½RØ8¯—ĵÒthÊ|ÆãX+œÊ¬[ ^MÝ988ŠMxiì7s49¥ƒ½¹ˆ¢Q\}ù×"<ïrpe¶öì”,LÙª$Ãp-'±<†tË ø_qÐÎUÔa¦RÁ¼=v7Fï% +‹¹ñª)Ý2ÝŽ&ÖïnAýUTÊËÞ1ò®×‡!î<ÿ‰–G @)db¥”Õ‘Üa4mBFLƒØœ—®Iü²Kµo¼ËݲFU¥Ðœ·áBI ¼ÆFê”8ÓžB¤ûå@ô¨ÃHHÁõlb%#á‹×œðÃËÓ#ä÷ñèÎyðÔWä©ã:¹ªŸ¡Fñ-…ÁÁ’¡¤Ç<ÑRxuK¯AµÔÛóa2E:9UAAg~@pïêýæðŸ’µC{ັ$Ýœl ÒÐL &­veœ(Ï$@Ó>Í€Ìþ9‘oŠòLóØÍs®¼î³ ›EJ¶ÏØ•I~\ÔG>]ã6rlç¥ì[KæŒ=:Fô›Kz»a²hÞDì&ët•MÒ›¯¹Ñ=.±çõíÑ`xÅÌÓ\œH‡YÆeÙ'Öš\hÅ]Ííïáb¢¾Ý0‹æN·nn’ñò±OV»[·¢¡´Œj€eÒIë I?oQ¥ØÈ r~£È=a3Xµ`!F¾ÈƧ¿“ÒÿI“_¸SØT3Õˆ2ƒ4x ;CÜW¼ŸMé÷&$Iq£Ãx©ˆž_–Ã~(û Ìž<´ëÓ^j{;)†k·ýQL+ÛGˆ9×µPôÛ&SÛ–iS\mìJÈ>_ó¸uuÑùt7ãßûŽGÛþ:æ5çãë4µ§·BçòNù²j—™”]•¨€.{¸,Ö‚h# iÏÕkž«RH+å$ÈS[Ô’qL@°ymæ=ìƒà™-—é±ãÒ É¹Á|³‹Ó6gnmE„E›Máö)£©î‚”FR!¥7Áß-*=4–ñMcÂÇ|k‰ûÜ‚R©"ËQi=Qæ&ê“ð×F”dá¿ ¹‚YçªÒŽN À*ÿ[”xœóFúVâZõÜêÅ(%dMôi‘˜cÄòÑ¢çh…W…èo»:·•´Í90J»¨yÞ0~Ù‚¶ã:4÷ß?¬]Nú³I5›'6¬M%"-KÑÀ…q;–¬Ë´Kø|f…X™„P#òüÆl‹¥”nÅs‹’MH¢¥ Ì_ã‡ãNâ¡ò>%Ç!|«!›£•”Ô—åh~Òq.eNƒÈድlúß‚`(¥KÑËJ†ÑëøðÐNô5ër!¦’ö•Å m_rŠ4ŒÊáÛ8GN´k—Î%P|Ì„yè­@ˆõŸš10±— ûaÒëí=Ó>¾(c¡–†tnwÔw¡WË·,¦ŠWiÍëJ{"Îò>œiD‹²©˜Àp……aì Õ f»R„Ì¿mæý›¾`1´ïVzåö£“ÎXtv»Ïšq$t¾`ö@D KÚ¿nšÚ"9"Åëlž­â]Ê5(Ân¾í\3©›“•…‹„ d¨u-ÑV!]9šÆ„˜£‹‡(öÔÖÇÏòIûŽàƒ?që/L2_]‡^Îè5¿ _ñ1›8”¤5ã_K‰ùÛCLŠ­ Qm ¾<÷ÂŽG-¶P·—ËWåpM(Ã$HßÜ,àFÉÁ-òÍ4fT¤Qú<àÿ™œ¨‹«öwu}H‰Œ+؆_,ƒS Ñ–'A’×F›ÝkzGÐ>AÉ:H$ZtJ4:öD˜º= ÍI“=`=ÙË1xfTíÈ„¨ù‹ã’Å>ŸÍîTŠ@«Ä´ÍjžC…4x(ÏDók•4W ½¨©Ò§1Åâuô”ÌZø@”Šï6 UèËùLJ„ÄðQ)@«¹R&QÇo¯ÚaêJSÜ„yJŠ5YËçî2fžyÙ2w+Ï µ“Ùð³\s•Ë'’Û ßc8ÌÀg\åÅ“ÂLW2Œ°é:d¯· mLž«ü¢­wþIÉ=ñÕ~X½’M”Ê™|_ú½8@Üãh åN¨ï ~vûFWTbÁÊ?q‰à.âèÂ[F±ÌMnSäáfÕÔ‚sC̼t¨È¨½F¨µÔö­²±gBÆ wôɾtyj/ÍsFêƒ^5~Ç'-#û(œÿ<ôƒŽï,yÞð˜‹â@îCÀ+òòê‰Þ.壽è i–ÎõFšÜŸƒ%’dÕm©«I¥Ü%Ü|žl)l‰òÇ䇳Aù¤{[†ÂÞ iIC†ï'ÆË±"ÃIt‹XدІš!.¯²ø+ê˜À¼Bl·Œ#Ifvõ\ðsîLÆñdÞ{Dܽ”|ÊCêSÖÚãvrE¬ëùŸRNÎé,½/yhºnSFÁd‚cÉRÀqD¡(x6Æ3« hƒÅŒ6A^& ¼]—Â'$õóÐäSÎ&óee¶ÿ§5çrŒZé T¥8¯më,  tÙ'u{v‡bÒòQ»e…Ë‹:z|0Úä¥"ýÛY±ñu0©$°¸+È,ÔñÛ·î"»ÈrŸúÓykéÚg¯Æ÷ßÑá7s3_ØÀ,iØF´W ŸœtRvZ¤µ,nO2ò«¯íý'ºõƹ¹3¸Ó*‘E`”hÁM³:ç"[!âzÚbKcÐÛK½ˆêC~oF»UidÅT¾”PÚÉ% €éÐ*2“CâÙùµvüm¸-?»û^#Nƒ§ ²ÂõcûðFÞµœ·Š!G׊洂*”w ñúaCž;÷[Ãiª eø©2»jÍk€ž Øìõô®Þ½¸ÖX 쪴ìè(¦c¹rTMŽ"ýtˆE7h2Ž¡—N"^îtŸk:ÿÑSš^âÖûSVcô0ëÙ9»‘N:{j愬 $ì¾2h=>—Ë^T¿k3~ÀÚýxQ¢›ñH6OH³…8Û³¹…'-Ñ25×ÌŽìIö+ò˜ œ¾ «d€ƒõ»ºNGLjí¡r³–ô¡¶=ÿL*:EÝØ|Ä¡£Lf1¿¯h½Óäæ ‡kØÝ怢Zþ)Ñ›&™3< òö»‰Qþ³.´eŸ¦jŒ.Á2okoÈû-ļ×0³Go3üŠFõk%‡Ü%Þœò—š+4P•æ¶fÈ>[&Ü%×NÌ÷s—)q"X3y ˜<Ð#ÆAôŽD÷ÙÍ[âÐÁ]èo)œdP$•žö¤–KÙÎö.«œÝ¸šÀÈ)PâæãÍ y‹Ã¨'XbZ[Žîùù 0ÕáJÓuV)¥çS{UKÓR[Dy ÍÀcë›Jy@› ¹± É0G¥@Æi·”µân ¯˜Ag—“^ Oå §ªÚÁ HHd¶C;½zé {nw€‰*uy=á‚è³ÚÝÝœ=G¦£qúDžññPVºñ× œ|Ã,݆Ý@o‡Ë!šý<˜¶2©Z¤¹b( r”+n…÷ à$±&¢½ödà|4ØS™vI$@‡ðât¢“˜êùÓË_M¯¶ g˜ê¡ß<‘÷aG†,\R-r,ZÆ´t#ÙäÄq×—ç-ÐÅ…Z–­]›ísæ;ñ´’™–E•= M>÷é® }º[[ˆ²–«S æU«R /™Ûçw•Ž22×\âÆ¦#êþ”cz†æ”Û©+rÏèͯ˜ÚÇAÚfp— ¢³ Ù~Vf‚ qã—x=Ú–aKäwË6Ië W¢.‘®º!ëNýü qìj&câ‘F´fwß ±¨’…?ÍÍ&|ÌsWžØ… ÿ(×NF}üªZ¾¾!­lÎïßíÆþ„õ384Õ.û’¯Z]æ)ã¸,“îÎÎæçï«ßú|Uÿ=_ÙÀe¨µ¼šÃqÂïAùË·ž‘"AžÏ ÊNSû¡“áÕ)˜~+ˆHÆÒ¼iäØjO·.•óÌÑòóh2dlÐùS³ãÖ-N©¡¦OUoAƒ,6XSøxv‰x|ývσ¥+ø¬#?¬bÃôùÃÐ€ÑæüËhÓ„ÍĉoÄ}&(S`ïÂHú0V[$¬ÅÜÂúÈá-évÚÙ\žSGânE3‰wë>"oÁð úEdß–,‹ëºI¼àÜZwèho›3:Ú—kFaçÖ|>Í5¥Ù‚¾­Á°ÖkïíªÙ}êhÇçtd´€$»´Øù±þ‡î_7÷í{˪ÐÎóÏL,´OX2»ˆ ©Ð\QH™ì;N(”‘+NÖs'ï†'úXß ðñ?-ï®É[«xÒ,yÎÖÌå›V””Ž‹£uY]wí\æí3Æ­â¥r:±Ê؉‹„ÞÆØØ(©BT–Êå¯%ਲSI=8•SC6A½âb +¸ Í[‘Üo«Ó¥½‰xªÅµûë–µâ—ÄÌ9­9 ¦×Úkªùî‰ p¨­[äî3»ˆ¡vi­’ìw 7%fó :‡l8…ôl9sµ!@$¶‹³äìÇN¬LA„Ž´_”èÃï°ÞþûR™ÇzEùÌÆ $Ð *W%pÜ|„Vzzö²f„›i›¦ ysÀŽ|ŠL`ùÂÌÈ5½÷t×¼ÇVuE-7d2QØ^v-ë¹ÿ@âÚYV0þ,¾´"&Gg£xÿN¿QŸé4mâPk×ùž}åéÌZ\Ÿ”Æ\þCq‚SûCiý–K gc}òèŒQÚ{ ¦ž7Z娵 މ5ú,!à|÷»L…Tલ§%s¹å˜òMߥùk\úqÇ3ôP5‡ä{äàbîN­)’kÕrVÒ¸ "éQÿÝ’ŸÂFoà\‘ ðOú¯0E`¤ñ¹Âþª%t,ñ)‹iÑ ÛØIùG„whuG4°i·«”ƤJínµ<'ÔC ö壡%ìTß6>UUR²fX 3«µ­“£ù^ei «I qÔÏeõÆPA<˜ˆégþîK¥Ÿu>•õ‰Rx‹ÊÒMÎDì§Þë¦Ájâí‰Á m‹âZpÕgÌ¡{>*Ô!‚•ætäæµeÑïéµ}ÝÍÂ͇~ÂüØa¶5™eæèœaÄhWvv‡g[´M3‰7‚!Ùš”Nå¡W…!i™u{ž›À·R|B×"žêÇ TÖ3ñJ6:²t8«FŽè¾&—4wbS\¯¶`…©ú·á§“œzì/¡p¢Ã[§0ÙµHÙQB”I Ó#ÛìUŸEî¸13|ÆTtŒŽÙÉCú’(Àêþˆ¶—_™®1Z&ݼf´‹»™:`ä ‰÷úÍiñzSK–´êþQÄÁ/d¤…(a|Þ²Hˆ¥9oGNâ'½bó¥òåœÀ#¥D®˜ju-òº›<çÊóÐÆøvØÇÌM„•[1!³ŸK¼ÙÁoñ”bf8oq) ì¾yrŠ_MruZfNkÈmÉUŠO“¡‘ô慠¥'in“ÜGG{È£šè¢N›ë©;}fQò1¸5ò’¯ÞF *°‹¸ÓýNëe¾ébé¤×W#«Ê\óc«œ{¤t\´j Jì°ËŽ7ŽVÝ6jÕÒxgÁ-éC´'·ÝG䀨ìØóõܼý¼ÍÄ3÷È—;XªÅ B—¯A —•ó‘tèþ’nªa­+¨Ž5¶PÌêÙšë4¿R±¢”M÷cHkU6”`°uT„œ|Ügʯ¢Z¤{NRȃ´ÝGlM;z-ìn&zÀÊèÖÂËùNóg̤ŸPîÒ<~$õ¾!¡Úš€€(6Õ¯fYp6~O˜˜ ×fg#tb㜙ã%ƒ-¦iÎL&iîF×4ŸLŒŸS73£Î%™‹øn¦¸="<@|ÂÕí)P7Äwæ!9&ŸF·'Ä>ÀGM×Id-NVrò]ˆÒ[h¤ù÷í£h<‡àŸã;Þ´Ä¡°-õøæõy€ÌîÒú—N¹Ny…ÓXhÃ70Fóe¾è fk*R~F¨\/ÜpŽx7ž¡y4M‚J¼ùk÷ú ɉv`Œsžsù¼M6a»U¥û‹9PµŽÏ6RC/š-O©·i=rúW4ÉIf2¦ŒU+ ºì ÕËj¸lm<â_72»L‹Â«·P-HŽT¤o»# ÝLy#sn¨£Îû‡+Aæ Xop´ L‚†­HœüŒ~ºþ”üÇH“/ÃSNŒ 柨’ðrVø^ª³Xƒœ©€a@«_¼£½S¼,7rL°cžwŸ2‰-Ú`æ3¦‚m¿tÔJìHdxC§Ðš©çËêÉÄ[ÕÔ}äƒnA;—¸ºþ+kÄ$ÀÓJtXµE7ÝðRÑ1àš’‘ó}¢Çïfâ ú4«dêI$WRÕ¿N±›ÉÙÞâ+bGÝ:éÆMHbÅ‘ bfÿj-ÄúIÎrÙ›Ý4§0þÚ’­ÓÀå.@.q» !pú˜É j›Æ3™B{–¬DÓ.M°Ömú&Ó»ê9‹w~\È‹¹­o–BSiƒ“…2¦ÊpêCŽŽ;bî)¢Gü‰‡Äé­³=­šª´zW}k–UL›s§ŸÑ /£?Ó<7µKP#²3Àu7÷¿GFlJئ fŒp•ûO]WG”}ØH¢/3iԇ˒…xÚM¡öLñ»Û.â­¹FSD8Ó4£ƒÝaj*G>ï•â­å'q°^A€®ÒóÛšhÃH îJü+ìx ¥sB²×–h‰y†Ñ]@NK܂ͻCY9óèSï¶´Z07b|4zÔ÷EöSçÎÃŒ¾ “§)¯ëþß.T¬hÜ7oÂÃc„JÑJÞ\O¼ræ¹ìæCzs(À¹kŽ~‡ŸstÉnI{WçÏ1õ¤Ù‘_GUÔöVûgÝûçèY›A\~¦“Ø>~©&ƒþ{Š{¤t²Ÿ¯½‡š=T÷ÅÚ$ c.h p©Ò!¨d7FU«-ò[·ÿOr2ä'7¥µWTR„z{ô«9ð¹çk-ˆ,wÀÅ-2¨cü%F®Ê†Ñ&økû½èM„–„k ;µk+i=zÖÞ?âô䮸و°§}mt©/tè0‰Åfõ%Ž®ÅÒÏn±C©T*;vîr‘ËxŽÓQëDÀ`ê´¢…Å9¼µ Ûd¡>~áâLTwjúðæ½¸ë'󇂱YuàðôvÌÊIïª$ ¨9ÁâaAÑýÞ"ºû>c顇OÛ AIvhß^Íáê@•w9}¥ƒ’ñ+³¦Î××ÅÉ÷òv6M:XYÏÀs¥å,ŠˆhÝÊq©XÊìÙãu‚¢®@[2{Uñ.áùÎWßîr£?:qN’oƒs<±HEšf܇2rÆMW·òàTæzû§¢pããv§3µLw°‰®ÈiPVª2?sº îÈëå—5Õ¿/³if¡èTQL7’ãéhߘgÀ‹é—粸‰®ü42†<’ƒ†í3Šóü³ÛnýX¸ôZ™f#a ŸšýM`ud¶Üs™ñ‡zÌvD„$-#u{ZÇ•'¾§i·ó!žR´/ŽÓÔñF`p”ó…OÒ¢ÝåºiB·Ã¥fW˜;u¡‘íÇÍ YØ} oÈUmxÙ©mõÅö߬ â… Ìx—:ÅÆ%Ò*š`Í`€qÊ©¤Ö­Ù>ëåÍœC jô ê"Œ˜°E¾eËá4QõjȦ;F¸YEHÞyk<5=Ç>IV)Ìå$”¯×Áî#Ù+uîôc ±‘&5Ô;r³^Dó slni•¡à¯JCߨÉÍ=†Í4¢×Žêq}ê>É~Úcšºk9¢:¿XKÍi‚Üx¸%ÑT!àNëÅ­1¨¬’—àýÆIùG]öLä’)Ì (p*'KE&V†›‚Zm`É0®d¨îÍ…‹u·w|_é½ÅY½YÀÓ9uîÒ±éÙ\.ž¾ÇÓ’ àºæ*bÿÎqyT¥sóüÑúŸIÞ¼ñ£k —ÎIèW÷[dÌ ¨×˜¯•Ĉ–Y¹? ôã¾hÃ&¼“âÔsDÕÐboôþ8ŒgÿP³¾|Ÿ †sH”]ÅM£ Þs¦zíÜ>’O”doóE,”hõôç—£H>» ˵oóòì\/RwAGq„ûû}Z(ÖåâÊ£r𧳨!Ô:¨™¬FÓ—ÓïʅúÓFƒ®~²+“ßj- †8ÿ‘î_YK÷ïÝJüã—bB–N5œùŽ(Ö5šãJ€@¡<¤Ÿ‡,“LÑö#*„ƒLd¤" 12§Ž,Šmÿë"Äù)/pOùa¯}ÏPû|4ñ-$pFaÛ†Àr ™ì—Ç£ Šé ;ìErS5,lÙ…q{ÂCºcG{Ñ·êgåZ;s(‰Ž]8± gaÍ%Âç;Ôm¤å ½¶ÆKÕûÛM•Ÿ .ÅhOìÞ´haj,½Hò8áh _‘‡ž±€º®ð4”F¯q«NB§6”Z!ß®ïŸ==á“d:!Bê,+h}ÝÀsúcÌ㜕ž4?»–\Ÿ•¸Ž,ÿˆ€=£óð––uÒ™ü¯ÈÀUxâÍÿP”=é°í^ˆy"(–Þu)±¦½|Kƒ'( ˜Ä­“±DBêÄ3ã‰êà ¯«Ð¼©G…#ƒV.׌¨L’Šd°m}\¤Q®¸|¦ûÅ‹¼K#º Úä!„5ƒyRË…2ꢙ|럀‹¬—§ä‰ßw\O³³[ІÚ3jR´JON ¼…’·Á„®²då"zo Ð~:+»Ÿl:M |jdÊŽÒZJNmð3¨~Ã_“Ûóa^iƒ=4wƒôYBæTt_l¼Šð—ÐøÑF„ YqŽ;vIUôÜ9 úÉŸI¸ÚlŸ¬+[3èÅ Hç’š'—9?[ÊZVC³OJ a½÷Z ˆ¦³À7.„ú« ð‡Rÿ‡+á¼½pŽo…i¥M¹®L»…Üe^XÑ6—oŸ@ö¯’Ëuø‡ýOKK›¼˜!—?‡méɆWM䨆Ç£ ȪŽÉQçø6}ãô0<¿dü¿Ã«¦È-^]ûy#€Œ>Þd¹!¢þG_$óòêÕ±osæ¨ú¿ »^sR;KÜ÷PO²+ŒgNö4Km^©¸18Éùû“"ô¥ÿÏàÅøz#²K@Ô‰|ãíÛRÁUppŒÑƒ2†uõwÈ&^ üÑùÎpJžÿJ7Dú2㦔©Mç¹×‰Lx}ÏË­bön¢Ùj׬`Ÿ1Ë›F®.߬Jo ¼çz<¸FH*Ŧ¢Hþ.iÌt téx 0cõ[x#'CÈ%BC|[´a;¿R2z-|ø¦Û$i§×>²#Õúó•$Z ︩*ü÷1Ñ O[6bÔVLO*ÞU;„³Ë|ntgn¬Š»ERÓj'ÂËÖr`¯Ó=:l×zbÊ‹¶»0FνJ˹ÈŒø0ÂYU±t5íæ2­C릾Né'G«šì§ÐKP¯§x&š´e5 PaH5|7¦¦'w¼÷³øîþÄ»ióvÁQJÇTp»kZ£Ð ¦Âñ5ö*Kð.åñ_×ø@êzÆÇÖ䃺54QÆÚl¹mÈŽ'nY¥…1Ì%‡ @G>›áˆ®»p$œ J) Ðç­ØÇé«÷ƒoœé’á ¾5±öΨ¬O¦+UÖFôÒC9Kà…õn»²ÉT«Ýü%¼a†'[É}¹®¿ÐFx˜_æ{:=1©žu @Eg}m•V~x‹{:ý~ú‚ÍŽÉDá¦Àm»á[W’¼pZzk1‡,õÎ=ÇJàÉRˆðdëwãPiÒâÔ&çºu¶áÒ­{r+šÆ”0H;ïêûÊ¡¬]*»¶W#$üyaš?‰®˜½¼>ÄiÍ|û(°K:Û  ±ØXJ-¶ýAÝ-8Ovqma]#c0Ú¯\ML h‰¥iwRA}v•îÂ\[p[ËwËb›#FÜ;óiª塃DkEÏÇE ²ú¿ìA¬‡ ÕVzh÷¼J+H2ô)ˆ‹DgÔ`7Öø‘±¼8úâÏqfTðÿ\ pŠŒÜ¯ŸbÓÎÕç(:qŒ,7vôãÑuÞ¡0uÖõ[¼é"$,+e`Ó û–dÅýs $¬œ2TŠ}/Á}&àÑòÚø:¶íðA²œ?8nùÂÇ Db†K­£¯ë[!Ñ1Ïòi¿ÃÔÈ?ÍÇAÅ­z $‰ÒjŒ²­žáæ°t•(ÁA½µ[á> ËtÍûrõUË%‘e@¨Vg|þpx4O¹Ú lwYHÓ¡ô>a F¾ÿí5`Îb©7û¬õi²qÓæžcåÕÿ8æÕˆ_Çdß~wß?¨Í>´0 Üõï\ºßT«®@içôÇëO‡€_ö¹N³ nð)ǵq @„Q¹‘(}äÑpr/ýAŠ£ ;¼ÍPïÑö9R‹æ{xQé×þú»O¢ÁïÞ´¤¹CBöÂÖùz¢r{HÒ~T ž˜"PŒa˜ùi†±£!,L¹ÖvFµŠW E˜ç¤Yc!µmh ø&¥ s[?!zâ8â™}𬜘,ÊÇ âÚ%B³ä!n^Â%7`¹#Ðk÷Ìû2XC²sÆó8%z‰Þð.Y!¼4L?^z]ÙÄå Hà·U¦ +b<ÆYOŒ¿ˆ-+(p‚.Û×ê<“¸¶,Z]k$Sk€7"¹”Dyðo2â n}91œRnã…›©Ž=*ÆÝeò€ÏLñýqH«…š×)s¾H—ðä>[r^<ºS¯6f¡lbÉ"íXžQ{QVÌM»Ä;êèoè¯@yv")ÛÐýŠ$ùcpÇÄ×&ÆoåX4ëÔQEj¦œø$øºÁ²[ì€<Ådžûˆ‡7Í>æ/{¤Õ`Aè5‰ŠØBÑ¡È{qh,KƒF»Ú ¹æuíyâz⇤\4÷( (áô„ •Œà"ærÙþ«Ql¶|ô ÁÃ$ú•òa3:„i€³SvíNÙt;ÒA8ANFÕÍ4ºwéÑ’i­Qÿ\=ª='-ý¯-;ñÌlœgÞ$\]d }†Ëæ•­v&j^ž“é‰Ñþ_!À~Œåö7«@j£— eAzñobêËöñ6+¥b̧a^^A(yã"çj±…/Õq ¬GcqgŠ0UXêoÕÄ>ÖHßÉSwSåИÝññbA'Ú·SÖíß‘Ûuóˆ› ‘^Lç´ÔãÉ¢D:mÔüèþ§ôÚ=(_öôÛ‚kÛ §=l@ZÉhh óßa5Ùê>¿@”I)¼yy&Ѳw!B=9?«’hCòÑùÛ¦Xzs0qÉ*í NP#³Ûô¯r>‡lÈÊ'×F½¥üæ¹X íI´ÔOø1i»‘mTê jò4²uý'©{²>·œÀuÖúQóETÖÖÉ0Bß_Iï˵[¨íæ,ЉíÓ¤¢Å]Ø E—2bÜ£í&¡TÝCXÈ=)×|¾7Ó{å…sZU]úßLuÓgf1 ½ñæ­Ï­B=׾߼n2èÂD éߢ ~hé7 kB†JŠa\)Mþ—k¼€pì¸d_߸ö¨?Uõ!ë^åDó"½.{½îmóNÒC)•‡º“±s `t×å‹Â½Š):ªŠ¿Õ³ ¹<"Q}8ñW.ûj5@ÃôPuR7 ÷š.pÈþxõä&7Ò“ц0=è•æ/o.Ô¿cd‹)¢(³±€Â˜ú©Œó|Â$°}>´ŒF'©—V¨jN~µ²NÛuå×wwó^Í‚ ÈŸÃ43!E<曟>SðVt¶¿U›jjPâþšìísçèumÆÝòµô<´ä÷øwäS Èý2Ð.Ùoòס²ñ¢ÞGfÿxò†á¾äaÓ#o´œÁ/øg®xô­”íu—ü®@ûŸ‰&/>=yš‰ïìÅrì0è"L]úsoJ®¾¥¨K#×ýïá)S<³Žâ¦Wü舾ãÕD ž¸ì÷¢M‰·J‹(甚 8£Pôs‡þé¸xhùOúå_ŸÀû„°ËÕ[GSúyA© ßÊ}WáEôPÌÑB87ÏèB,êÓèÒõ3P!hŒeÈi;õl…Ò—É%¶ž¡NùŒÿMx5ggÜšÀØeäÏ«É&âôh.j1šŠClHöTóÈ`§$yÚf–^dÍðÝ&ÁâC–œì›PC`DM†ó9<ƒ{\çôh‹:s´å®. ƒ¿"Wý.e}†á:ÐŽ¤„Ðê°¸xz" …ˆ?!•Vê>:ƒí¡&óLÝȽ̟T á8ºò“Wì2fb]s.ÑŸLÄ5VxI³MFÊnÎE X°P0b®¶òÈl×…»¦¼ÑÓ®¾:0ŠÕ„#•–„ꆬP¯ÈÅ ú¶!úä«ÝgËÒ€ä\Øék†iKѼkIêOQ.ÙÆKÌ!ª!Ž9JJ¦ÂDHTÜ»öØYZ%©¢®7A6#…j\:âmû‰éÒýû¶E Ÿ.{HPyVÓ·c±xÓ r“º c4s Ý4’Ûée¤e ¸&ß'xR³ÿ!hºYEì Zv9$G}'/|*'Jîçsö¯‹Cˆ>}˜Í;.xîO[® ì±LgÁl'嫨%%#(J·sѺåÍ â#‰ÆH^½L¤ö³þ$Y·©ÓôýñD ¥!}P3Õ$êeÈ#ÖJcn3À«ò?³Å΋¥wV¹5¡é+°† ‡Z|,‹Œ‰Ï©TÌûvG?Ò¥"#Ü=—àÇÖ .OW `¦|ñóp|]o`Poæá7üf1œ‡ÛZ˜3_P€ìC­R.Vÿqû_®Bµ¦. ?¯?\Q/­™Ù¥ÀÊp† …\ãŒôJÛ%åÀ¥Bm wîmoŸ ¡:O„Œ—XÖ>½¼T]_̗͋žšY_}›Ð­‚ô_=«/2Š+r0 EÎn¬>Àxô)\c>¯†®cWÔë"Kë 37‘ÛQÝbBŦ„0ý'P°î‡É!öØ$²ƒü6¯ò ‘ºy—u }Ð;¦C©9‹M%¬'ž(O¾ýÑG„L,ÝKæÌá¶QØàó£û©0ž®ýHÝÖŸ—h:QUEðì€mñN›¾f€gŽ/QëD7.óáwõFKŸ*V½ŸËAÌø¯ ÄË)s¾&À ¹†Ž°>™áì„õmXÒŒ|‚=ÇØ„˜Þ@Gê¬l‘&‹°Y- ™ÄácŠMÁå·@Óœxç!¥6ÆLÈßIpuo¸‚·ûO›ßÎBwæç5÷ëªÇÏhÒ–æ˜,å'6úþ†ˆ{µ‚ØÕ†ŸnVº$œá˜¬÷wù1 š=Ú¯!”î§æ2èVej³7¾ Æ mÂ2¬k¤ |àQG9ÍGúô`FM\¯äNv}í·f$Q|‚cçš6˜òP4v½y—~ÎëH%Æ{AÈbÇS…ÌÔ‰w­ÇndÚÍî=ÑvõñÎsÕÚž·Øî"M=Ó­Á‰ê cò!Óµ—ïDF\Òr†B–ÏfƒŒ÷p]nú³62«øÿ›ì¼B¾ô”Ž´2³0GË-óbanùr'Ë\ÒÓ”>¯‡‡Pe/s¦€33s—.ïûwËÒ§‰y{2DÉĤ¤7Þfp8·únï¤ÿi<óÄ—ò~ÊÚ÷õ4ó¦Ô òÆYµ¦`oº\w ¢YÈž„6æ×¬ÙQ¬o4èÔ7L%¦ÁíÇœ8ÏÔ=I+lb…¶Yì~ÀŠåŽzOEIˆ0*J²eÞbcJ …*CÞ’R,…QÅ¡ ˆQ=ŽàÈÄñNU!ê C¯ ¶²RÕr"8¼`LÁ´¥œÌ:æf¼rú@¡ö&Âõ|Ьƒ^„-©Úâ¬l]{7Q””Ç¡‡öa ÏIDüpà4ò] Â5’½–Y,º’†èZ++rĦg­¦6“Þ©EÕØFÐRû{òÈ¿Ai$?%º­tÒ½ó#qN(×îon> õ©ðNw€ÒL/;à¥X/»òy~N²À^ÿÜ`öæ4“Øåõz·#}4¾‡h|½”x/#µ –™—~ËX+1pù þ?Ìõ¦Ÿ›{D^=y| ¨€ø1ˆÉIfÙ÷éªù‡™G’Š>ªÓ¡W™Ÿ‚×åmy›ug¼*jfbÈþ¹üo"78¶È,ô P ‘àCãì-ý_óO'aÆÛDòFN4PÏã4F >:%uc@8ëÛÛËïÂïþñ€%èT—ÿoÜÕÂùY%‚ù«¿ÄÈçêÃ’lîím¢LÏëQ›¨wù÷cd|ÿ¾,íâ‡ó-ìÃfjï}8É*Ù®žX1u.H¢Á>:c3£ŸF4fœ¹=ÞOKˆ ’±ä"Ñ î1ŠRKµ8§AaRoô«+XL ÎÚeUÖ ÅbŒÚÜ€ÓóòÙ¦|.ü® t’Œü–ÓK¥Z„l7F“zu7X $ƒËÈŠz™Ï „Xc†c»IݽW¯61cQÝärˉ“@\&$ºúÿE6÷_ltÄ›¿K± éÜóÜ0d]ÇÊwtÍ^qOi§…Юï;IþçÇ­“IQ…ðPa¯ à½î2`Z†»æ3À‡¯fÊAß»Qùµ‰=©ÙlN¨ÌÁÿ"v†{ãÆYfêCksjD£â–&â:Æ «H •ŠÄ½Vµ*Ö™ý”m'áÓ´¬°°|Ô2¿þ?^ Ž9ýzæãV[ç¾XñM#ŽJZã¤s‘2û n.\L»ó„p-)çö~õ>R‹«oE—Q‰…>Û˃ÂHˆ»dÇÊ_1Ș¤s/D—ÝBÞË,¦%ÀÕ ò:jWÊÙHH,L¨+§réÍÍSçphzÖ¾å…Bhý\€G¹…ƒ>Å96™Eªû@fɸŒäªç¦¿ç˜ðTg÷¯»ÕâèZ[6¤¤³àt/ç§ðÂ×ü¶ å£Kç¾r$P¿£ê& IRlaá%v’Ôåƒwõ~A …LÃÎ ë3Vv Ç0óÇqë;ñÇl­m`I±?ÄÛmá áù :=ùo@ú4| “x*ý¦FŸXÀõqÅíZ Ööõ_HxECR¬ø§£°…¾ÐËv/ƒyÙþ³‹‘ЈïšÞè*ÅÓd™ü grý_OÏ=8)uÉbMŸ9ƒ=ñj: ®_[É\Õqò~÷%ç˜[Üó5¨šÔ2å9öß1ç0@*üa‰öS‘º¤øz‚6IÍ#’ …XUò޶Síý9T0­3a¹2'%·Uœ~pÝ`ÑŽR¡Vr®„¥ ›È½@«¼ê•WiÙùœ–eà ßKkxÑ5Æ€«Ã”àÈÏR͟Ĭ¶AÔKÀE”+Œ B•µÛz•el ­ôˆ1âŸ%ßeŠè첎3UéaWXëëk*Œ6i¹ûÑÂïBTZ %þðtM¹÷Ó¾o­6”bFi¶ßåéΣ]šIÊ"Ë¡ÿ2:,r7õn´Ë/®!äMí*`afbî矩ÄF‚éª!²XônÞdu¨XâhlÒ¤¥ÅîùŸÒ äßµls’Zd”rËM_´ze“$S6D‹+Z {C² Œ·­öÕ1âѽbnö8q³¤3‹Zäº“ŠŒÒà¦#Ú@9QFs“µþly%IÓRÚ_&ÓøásÙˆïULI>ÅAÁ§(u’5D`-ÂðkM2ˆØ±jC[?R™>ôVYÌŒinN^>ï*ŸOÒ ¥ôG¦ÃZ’ùšŠÎÌp`v£Ñ¥xù´7ã’«(ŽÙÀ:¥ôÀ&~U’K&e¦^.+¢+,5™ÛXãÄvCãlâDùŽT,¨üH88, BAf ¹XôÖæ-?.¿$µºç¶œÃCÂùE)ÿã\l ¢¦  Œ‡‘:¯Y•=ü¶ Ã’bPò¾ñB^ùtlîèòõ´K݃/¨†dÕrD¦ÐçÛ.›¨%½¶¦+¢‡.´Få}bk’\3f˜% Í­ŠJŒ2Qg>ÏydÞT³·²-liÐ`µ_{új¾ÄTùOh3  ,”É/…?…õ‡1„ªÏÐ! ¾A£ùvè­ž…Þ°†`¶|ïrŸ˜¦í u@¯ÉZs±g i3€YÙƒè¬÷Õê¹²JÔKà8€G~l7!h» 7ÕX}B(ôE[TëìÄæY߉˜$w‹–¼„<-[\× «Éñæ›ãÎW5«®&“ç’ÍþÊ”³õ…7Ryòᤠ¹ñ‹iL„­/t·b1á ÚPgø!7ù[7ù‡Éëê)_áäŒÊ0ó<þÛqçOå‹3–àÙNîÿ‰Ÿ ÷˜‰ÛŠrº¶’JE@Ù`po@ô+•|·ª´C†|j ÏZ&ÎLÚ,P±œ0G2°‚f ¼CXŒ7TxñZ¿Ô”6ú¦+¯Îa¿Œ¹FZJ[Д£P¢ž×ŸZë†Ç{0¤¥Æ¯S±ùH ]ö Ømj[Àì"Жöа¹C^܆%q†¯ÁÖºì;Å‘&“?K€é~ ˜ý“¥T™{?CÆ%wV¯v¡‰?áŠ2WHhiZ¨²ÚŽ•{;túhVÐ/òhïÿ³ÊcËQ\cå§"r83Ô=BƒÓ4æMßëM»«sÖ‚Ýs šË2Èhí´üG®9öæ—;pvsÜŠdjÅ9“ßÒé.áš ™î'lóEôŒ»Â/Sm/í 6É¢±Ë ƒ)8lfÛ‡w@zt5 S2Çæ>Ì¥{õ¢¤DŒXcíšE8ùò$ ê¤ô¾3ÓWƨ߫¥sì(òSr¨kλ‘£¹œ„¥šÂ°ãpu,'Í"ˆHÈÉS¯]ϘúùYkQœÜÙÖ® ”$ƒe‰ÍÓ/ÖÌŒ/êbœ·ÏÕŒtðMÄî;9cf!ºWª¼Ž´Ý âv!¾‹<ôlÕc‡°¯áØS€µxj‘ -÷syö$é‹,Ÿ½y˜BTßb4¼‚Å×À`MxïÁ¶nzÉ0-<æ·hô-"xÅ]µfw;k ÛuÜjç\“!WÃ1Ë‘õéÀ³(lB57€ßM¼k^¹Š•&Òcøh^¹©l²M±Ù¼Uæ»p ‹ÔÔ™ì^¿ ¾²óšÒyÅÐ'­"°k*®TH–93n¨U-{aÇiÎ#5Y¶èÚQ‡^\yáàÒE^s^=L'0Pëµ!4È4øfi#Sà2 —!àV†*4?³Ké;c+=Ûù1½oÇeŸ¾ä¥)¨QxOW·ÆlL¨¶À”9Cî¯,Fcõ£í¦ñZqHÃQ§Gp(g±Bnªz*Ço¡0 äR(y_–t½ö>s{lÍÙ’vv~ô ¥€}o£°S” àu… æ´Õˆª70a°«¯-¾A¶£‰S îë(ÉÚî’ÝÃuŸ9µmý~¯—f½Õ( Ú¬Yû(1‡E¤’z’83—uK(îC­?VÒ"å¸q¬Å(y@‰‰Æ–Qs‡è!·]P6…Tÿ2™4ücóqÎr)1«¸K¹TöhpaÝ8ôÿñø‘xí˜#Ë2φ¢ŒèÖwϰù \¶ždoME8ag×(Ëw>1å‘.k@G {¦fÓqñ3-wλªaÆ Ë,YaN¯—ЗásÝdÎ@FZèN+ ‚ÚžAÖhs|tº,ÚüR3¢qžüÍ{ª,cº„¨¯hœ®tÈru»0GñO­ U ñ¬r©m£É}ë)“  b“8<í:T˜ºGÞÿ>•é“Ý.£×§jfLo¥çÎŒ>–NRøò;üÕö‡§5GmôïV|2¸FÚrf(wÛ‹LÎäܵñã$Ÿø÷*P1eÈ}SµÏ(…³ó|OÙôcÜ Ïtã&›RußU·Ï‘Än¹Àviæ)‡jmòÙB€ùk{·=»rØF§OfºØc%¯ÜV­·¾ OWýﻀäô•R– úzyR=ƒÊPï—OÌAA!æ“Ë9㤰’9³Nó{ ¤š¶ÙÿoM¬ /©Í© [›Ÿ*ĦÈHç¾¹{J‡ÅDtŽ–³Ð,â2e‚èfÔVS¯úÂ}¢³^¶4Ë0Vé#EI®j.¯]fë¡qЩ }sîƒ|„„™ƒP‰¶KFç°r¯)à!ÊÛ{g#ð§) \N³U¼A›'à<0.õ¿uò¶7Ó¦•ŒÏfî¹F–âLÓc’ “Þ 2XP’hç~›¹÷LÛå!ò6_O«ÁÿÕøÀ£­ } ËãeP™4 Ø1[œŽÆë~†ô9KûtíPJG¦Ù£ê x.!'œÞL„±…@x~)+^x‡‹Öds]3í|X™&=îOnP¯Ë˜*Nul3@‚уTÏF~Ç¿»ÆRYôN‘ Î–Îx ¹¤[—›Et³e¸'ß|Œ¸4áVªtp?WB‡=>o<+}ÓŽ)4ÕŽB@öÜ¿BÌ|úWP¦Ë¹µ´¶iH‘[ïr D]}2–‡ä—# Pþ´˜…ê#¶Í» O¦¬ÌîRؘÔEâfî9ÍGá”l¥4£OÍ"òÑ&ÝðñÏu‚ž­ù!E°òö=ºë'isgŸ;†Ý\fÏWú/føí'ðr$%7ƒ¾ǯHƘú¼5²eœ ýa­ð‹‡Ý¤ù¹0!ÝËNú·˜•U¤l £3`‡+j³“ƒÄ_æƒÅ‹ÍÎq63ªjhg±¼Ø?æ’ñGÓÒÜÆ²­ˆ¶ É‹„ÃHWmˆô&åÕz8ÐÓ°ÓkÜšçeÙæ’ 0—§¹—Àn¼ßxdnoRÑù´¤µN²Ò ÎhÅ‚*¿lèá>Э£¡ †Áù´@ÇAjd·éˆ ذ,!4§éHÚ ’„k#›‚™ÏÏœJ‹Lôâaס}w<Ëí8~G5aÔjƒo/mȰjb#)gDç>G qÍ”hC=ÌxCLpT¥~ûq „~k¼¬$ƒ5/qælòôò+ ¥®þRKt ,[VSªi^+  èó-s“ ‚ð4·=G¼‹·MÕI˜ÊK¢è’(̲šn‰À}‚Enz+0ˆ‰ Ѭ¼/#Z×ÓøŒ>Xî½u¥î—, œR¿Ó´šm24ÏžTÂÝ_ç£uh‰MæN(ÖÆ\Ê }Þ^É?Ì¢ŠOøZŸn̮۰ÂçÐ9- @ìsä‰ L7^ˆª´V®7‰?±4®×ÿCXÇÞ±½Ú¶.ÔpŸ›ååãÎ2æµM- ünÊ!)‚"²¾ÂT™¤i$„7À6#¼&‰|'—%¯Óc|óµìP‘ãÖpŒŠg¥wÃu©uÁÏÔÅV gÈuí'êxyʉ‘†$ññvÂ!*¥*RÒ Ó¦Ái(C]'ÏP´4¸J[E¦Ø²$qòíŸá+[‚ç©ÖbãŸñ\‹Ï{5àSh~[=/O•wËц—Eä#ö””È3•>Eٮݛ×KxE3•jfC1-Zìd¹LUŸç›¶àûÖ³~t©ƒ‘î|ÿ•õáE÷Ó‚üº£ö÷¯A/ø¡ù|9¿Ÿ†eé3½Ã–À‘”E/=c2¨é‘<Äbö†ýó„(޾Hªlb.¸ÌbcÈT/ŒÒ ™$ ¥e ­*ÕAnTó£¿Ë)Vvz£,Ãì®` Ø{ª@<5'È->n¬Æ5°_[4Ô*zKeg±BŠ=ì±'Óòtæõ…D9qxH *È´Ÿ^­ü } 2‹\-«ØBˆŸHèKy„¼øLQûnW½ ÈpÑÚ¾mYÜ*W·Qz+`?er}•š;òú>tƃËÙ¿U.ò]Ω$~÷Rø·,BL¬9ÈñîŠ[ÆñXG4^ÝfŠõJ VÀÄäC3åa÷Es€n-sæà`\ê•ÐHñÃB ³QpöáÆ™Ž×8¦a¾c]A¯4CŬôË{Ú,xœñ匔{«j€¤”YŠ€C°Äbg†î¦¡døÚbÀS£i©ÖI‚ \šûp\ç~Ú:Vvƒˆ@¤Ý™2ÇÒkZ££ïO7Ö¼&<š†ù:îtYä:ò9Ê%N€«¬QX¾‹î·pØG8kOMâ:¼(ÄÈ%¶5g $¡óЇ誀`¶î¬q ôXQI­u%BçšrDkR!Aü23€îª8Ð׈øîæ$t¯Ûhs?.LÛ௸ûäeÖܧl팃9s…>E¿ë3õTçh+‚È@ˆWœ'TY²ÐÀ aéû͉Ùåv›šu½Á¶ZËX×¹ ”® †‡Rô?éÒó\Ücó‚-Ù”φB8Dú°%$/®I§#}NÞÍt A°Êü#WQ†½Še\ÊéA|Ó)Ë0ô#™›6Ó9qëi«YzlßDœÝ¶3*^GÁ(Smâ½â@ù*Ó§®ÍÞFŸ:5ä³Ò“²Žè =À䂳O³ À!p²q‘œâó̼döG?T·ì¯G¹÷+íQôIÔþ2]¹ô]œüYË’˜ƒ˜/‘dRbˆ·aô¹9å€Y"¸\F1] Û½É}†í"¼5TÓå>fÉÓ0Òù1X,í£¿\£]‰ÍËN(‡Rxe,ŒÉ]¸T…ê`‹õêÌgÜ7JîT~øT$,gOŸÐ!è=ž~ŠŸ¼{×Gšcʳåf×ç@4Ýhäw¼û’úußÙj¼5 ÏЉözsc[Ë€Xð–.ʯ¬G›¡„`ËóäY'ùµøÿa–Ô! RÊ ²ø¢â€ftíæ*² ²ÊþqTZšV»gÉ?j1ÃT½3©&àU€zõæ &ß{ß"н5áV?Ã(9Ūé­/2ø>üØ:ÛÐ:ÎÍÂ6-ÔÒi•çÇwg/®:µ¬ >—žŠñÉfLò 7†bèô@™Yo,{£X€ë?rcUcŽ“oj<ÛÒÓŸíý;Ó)Q\IÄ%Û?–×!ÎhšFµP»"´ªÌ—qþ(›-‹lÊšt›æâCkÎHµ¬,‘är¢<]4‘EÎl.#5oj¦Æ¡ìÊ!-¶UCž` ÔÅ{3k1þ ë%ƒ²¿ [äéWœPÑßaÇ>R×-¶ºë¼àÀdNGŸ#o>“?ys@8¯G^H<±ÆÍFÜ¿BjUYB;ÚƒÊèŒ4IºžƒªåO•1ÚñáákºK?-Ÿ EÓf\Yd1BÞ¼ó„GŽÒ\RâóY@wŸn'£z¦ºdÔ}nÉéú¥ÎTO#å×ä!½×+õ-_U`—i™?NH¶x医©d\Ö<¨¬MRDZ]¹¤7äÌîµjUìQX— Ñ™ŸEvUâšs(¯çv ×€.ê©ýNžÊ¼ ö¸š¼6ˆ—F‡³:ËdÓ)`3pámôó OÖ$ÅZv™¬jQ%z yb>á£Çñ™"-?‰)Ðïï1c÷hŽ ‡‡KÙš-¢»•@6ÀØ)¶‚UmÌfT“ü‡Î3ó!0Ævý«àÆ‚3DNMྷ‘„®³þ5Ñ ÖÉWHëì@*ŠQc»µW}ßA¼î6Þs>£èÑë×+©‘"TüDŒéÛ9q’·Ð²i#È˱­Ç0Úš¢ŽÊÐâBOºB–›èQ¯-îã}¨Á÷Ž, 7#ÓQxÒÜ«º\Û.µ8Ò¸bS)#lÎK‚‚íÔúóólF§)oúÕ‘ŒEÔo¶“ hSlxžzòZ $·Ë: Ö ^ÖÙŸ‚L TY8 ÁEÅöºÕ,ß“Z%ºo c/¹fÞü—¨„þKíâÉÕ ’1£±ðž•ÜŒXʼnµNWø&îD·¹´šx5º¯'5Ÿ œ¼@¡´-Èv>Uwè5ж¶*w 67úRàÛ¢ñ˜±b¹¹¼ÁaÌøa@£_OÄ!Ý×ĉ ]ôÞÔfY±¦Ì`]º³3aÛež »ö¸}u‚hrê]” ŽÂ…ŸŒÈuÕ¯>_^ÊÍv^¯‡Ùè’ÎN\ŽéIÜoµ™ßÜë,Ÿ,1nÃΰ÷HZL*7eØÄÉ›zFìü½jª;GåÆ¿#(Ä×:»|…ÌóHL#¯ß¹êVˆçTú|HÁ›ç!8ÝÛQEFjÆþxå%l¯1t04Ç”>¼~`áàƒèì<¦ždÞëËíò©×0ê@ ijr˜@3SÈl¸’d×.ƒ¾Ðp§2!7¢Š³ Šâôˉ€xu¬GâJÄ(£T•ð\²Õíf'áð±˜Ï²*ð}"Íô¯k“Ùº°à„¥ª 2šfëYkÞ÷oÍÀÄäḰO‹uMùd ËŽÂüÝ­:=SnˆqfÙm âb%ôÌØkH#ÐEg…tÉŸ!J²=’¦ºªùè‚b&T·–¤ÒEX*Íôx§‘ßû¿1ÛˆOSJ¥TðŒ$A}ëüv]åJš«Ô½‹Ci‚ziQM[ifăxªÞ†ô¥КÄû¡<Õ´–A:² ਿ”\¤N=HÒ¾„žÙ;žu×Ïගʗ¨"§¬õMvZ\+阸‡ßH¢ç¡¬î »Aìˆ*;+•_ˆê’NfDÓw½Tvh<–K§O§ùd­×$|Ø"t™Åùžà°s•ñ´v8­Y“®(‚Ëm뫨‡(jk!Y}NþP-n†ÞXI¦Ö™31“m™¸Ó*@2}î]/˜$‚­;5’¹:˜µ$yê,fŠM?^Dö¼Š"ž^çt ¼2Oצ+>Ac@Î@‚dÎÝ5™,òà(âmâ|®¹Îþbû– ³ƒ €¢Î´‚^ÝÓ/‘Dä–¿ 2ÒštÁà×*!ý{GDQioh…ñZ˜]E 2šß<¹cά"SçuS›ã¤ù»¥SÕÖ3Y`OêЧ@e°eÖü%šXß䵦H'%†šÏ‘Ãõ? Œa*z7„ŒÁàåç>A’I¿Vdz}=Œ·¼pÉÙÍ Ï¡šmºP.–†NSQý d"Ç-ÑÆNÚC“ßwɲ‹V’Êj5MI„ðÅôWÚ'î §Ú°ÞM„˜Ò—ï@´¿¯«'x‡ÜY4Y4^+|ì㜑f 8ïH‡H²24P†pêҬͅ™vȪªI•ñ§ˆè«_<ñAs5ÎÏSO¶ãá¾–»Ø[þ¼5Ÿ®¾˜ñö*u«µäAš¼Ò 1¦Ó””+¢ö=̤&)¤ŽPóîM%áÇ›˜u³jÙCa!ÄoX¼†ÊGÞ–:Æî ÍŸÌ±DttPy I-ýCŸ, ðÇ;Îû b`E:[Á¦°¤Ca9æ®Ã¶¼KZ|^‹L—BÓß%Õf¥Ù‰ÝûþÕËùç)Tp:=TÆ·åy‚Ôz 7Dᑚã Xàù3ĨEC-S_ÑèG®wW?Dù|8¨uyzshdðhm³ì:¸7¯«ŽTËŠIÎ[Ek[„†*ï'´Û×îÏyÑôAmLz8"£2HÈ  ·~ Ïóé¾×mà÷¦óè*Yi¬8`4nƒw“{I…ðk15®˜áà°—µMùM§ÿ²qëúyv†ï³™» “hS_$¸r w°ó÷ˆ••ÕqÒÂ+á ‚ú_Ú*p ðrl ²¦Ó@ª0µ3êx÷U¯B`¥Ñî¯æÚƒiÅ•rŽj9Ýœ5 ¡?þ/@$É(½u]æ mùï©i[®ÞJ—‘úy¡ü1Þw5käu¾±Á–+uÛ31þå.O„½è{Y2*”ø’ÄŸä3²se½} W嬒…híN_è#K]Š:>À¢Ù˜þ¼O$î7}~cTx@uéº>Ú~g‚•LÇù;Ï\Ýy|TV¸¯£J½Ý–8Óàƒ»voO!K‡ˆÅü½(øº¬aî¦Õ‹p&fa¹–àe¢—áôçÊ$ªfõãJ<ܦÙx5 •ö—³ñ¼W¤€“…Eê5š’:6†ˆ^àrË_—_gc{3ÅÒ]ChpÏÍmb«¤(aЬûhœå_‚¶ |Á_G¯1+½NqEˆ>˜ââ ¤y° ûq]7êåÈÖ‹e_ŒÈŽ »UÀSŽ¢¤ÇÔ¼k—¬¸|ÍÍß—;=»£XT[Ý=û€A‹³µ°põAæ•`ζÃxr6: „Ÿ ÒD ¥’Ôµ}¥W'çºPD×2äAkvpnª¦µ?vº÷~[/]6ò²ýPì€÷У<m­¸2²a#v‚l—‰Æä ¬ƒ×¶sìµ´QÃoN,ÉEä£á¡ZÅ1ô>e¦oô¢öPš¼)C|ßZ÷7èuά¹qHä âÚ C‡ï§Õ:Ç=\‰Bä·’CZ­b °¶½›„» cr'vwß‹\«\ÖQÓdQÁ%›@íeè”ÍGTÎâå R=×=òμ”Ÿû0(²êöÙ\)Ó&¤ù>´þÁ {1ùsÓ8e*b _×2bº ªµ«¾¼ç X ä§¥úÄJÿ"û×Ô5_¾Ø m[s4IæÕ>~ñ±³?¸¬[ßì¼üùžô ³^›™¦"2–Ó 8·5äsô‡—ãgÀV_«A.WÕ¶Ùk²#ÚÈe²H’ß;X¡ÝÝ”êºõ‘*›÷ðl‚1he‡Utï¥^.«÷¿¹ß—“Ñ?&C¼Ö#¦FÅBFâõŠSØÅ}NÚÅð†qG5†qÉ _¥¬ ¸¡Gü›©ƒmµ‘c¶tÑ86Ô×T ÍBé{+lÞ¯'¯Qûè&¥`P§£¹c¨xb—`êò šû?cvØž°deNÞÝ8oS¢ÉøËzúÈè¿%L<ˆ‘³ÓÓÓvA4M‹a‡ÅZÒúíæ z®›9¿··st;$Uã?£ ÊÖè’:kx}x­#ó[ÉœOwȾÂϘÀŽ“p¨J×x¬*H |]<@Ñþ—r³Ki¢å‚‹lŽàÎLÃiT –èb€a“?,xZÙ¾sØÅ¿L·‡6ž˜+å†O{q¸^Õwpœ?P˜Dc×(Òú*Î a Ì& hãí k¡¨15 (Á8÷‚ðiü©ÛæÞØPƒFÜ?E:§PGU“BÂ.½IO˜a{›ñZž{ó]·úw”Ë'B\ŽX6³YÍ­3ØO'Ù®nW\Ęºò$é>fR±e©°F9¹ëXBÙ±ÌdÃÃ,€Ÿ³Ùç+… ÑPuó¡tLƒß ¬Ì.ÊÆµò>£Ým6ºTú,Žj¼ã¹“†ÄaI懲ÝÇáb+©Ê€$ÁA´‘}D.=õùÁ ¸æ7(“íˆl§ l>Zœœ/Ì8± }€é8­Iîž„ÙèS@!×uêBÀ ¿Ã-¢ ˆhw 9Äd \ñØÇâͪW“‘ÞîNv-C| ×ÖèDn3/2\E¨ +íóÆsoJÄÛ-)¡Ó“fÆalØ|_Á`U^Ì™UÊðŒSÊ—ÝÒÈuo,á /Kxû7X6@:±=j‡2ìË}ÝKÚ“Æ1c±sŠ@}^Û°ëUðxhÛ“—ÇLÄ:S›1<È „æ7(÷ÐxÍ%|“›—t<»Û¥ »f]ɱÑÙŠ‘U¹òó”L«[Q?M¾«êƒ^6ÏVÁJ[R†2.Å•@{Y»¥²hW +CT"ª¥Ù¯T¶ÂcØŸ¬WllŠjL¸«¿)Îß…4èulZγKwäÝ…·Z½’ßhºÜì•㫃÷`Åõ‹^‡á{íE&§ÎNêÍdÅŽè»B×\P -õl^£ ¨tÏÃŽ÷V xl©6yu¬³7zó©ú@RguF)~7¸Œ‘iõù±÷AG\õRÐL[©žÝ ÓÿšN„kú%Y䥰!)„Ìdà‚U7Éý¾4Áê1€À«Ä‡°Õ/¦sª~ ?Hý¬Û°ùTZIõJôÒd Hð¤D}€¿«‡ìDoÎU@;ý]?ä*37£xU>‘û»Jqÿ_O9TCm‘ì2’‡'ë[Z'®”N$ŸîœÞž«CÖ\ÇH°òuâjzo H–¾Ž—êw°°˜})=9k(¹¢Ç¨Èà|Dxwç²[¼™²‡Ã­íÞµ uÍqæGíÙì2£™Žàr½wq ¸Þ9æˆ1s‹ÁòQ«Ï HŽ™­¤eMCKadŒ(ÿ‡嘟)kQúëü:"vFyuw‚ ²‹m'‚ÏG|ỶÖ!”h8M¶»f\èÆ82Îü™žÛóO`Cj‘U“5äüç;6߃µÖÇŽ‡vRx@íÄîòúí!=Ö‘1SÉžôNšÀ]í|dêðé©Ù¸OÑÁpzS³x¿Ó;1¸·$o¹ÊÈË«M&™»ÄkŽ<'(”.N>Ø·àM>õ«Yß]Ø^¸b)tÎ…Í芷ZŸDWi®˜5,È€ûa›_$´¤££mH„˜]`BÇj4}—ì@)ZÅVúüž<ôÙ| ÃZî\¶Ž h~VÛžÖd×,…§‚à%@´i8º=ÎÖ2ô)`=z,ƒª™úþ¤'ˆz{b)·¯ÛjÁ ~³Ð¹{åž|¬@˜¤–„F¯kÖ›¾ª60ÑŽ.g[6( º=ËÐ>ƒÝ~½&u9;)9âÜ!N…HÜ`3_85ï…8ÑÕ|öÙrèËÈIŽ:Ü£ aô™È)j¸X·¾Os±ã„Ï!iK϶;ˆÚÁ¡‰_jy}Ç–xœ±Ã)gNÆ—ÕŒhÓbÞùõ–`«h‹¹ëµûQ0l´{’d{r¼ Ißíwã¦Ú¾t¶X@à¼ÞŒ ñ28ªéuZ¼Ðp†8iÁÿ¢‡”æGÂ1#¨ó®cƒêöÜf!o*·%;¸6­äê†p“Ù@S¸JÅñ”ŸŸ×ß°A$ŸlSt³ˆ›/¼w‰pùÜ3ó'úwo;ÖÓ+g*rÆ*†íék`õ=àMù½9*ÔM‰Ö–Ð(ÁŽ€5ã©Kùàˆ¼’¹l¹Ðçé!Wï7_^PUšíÆé C1Ž7 02÷/ ¢XgÂËÇ zYÁAüYΦž_p«h V[vß–¨úvÛj«D3ÁîQ8mÇ9ÌÊ6©}…:ºÒXgìÊˉðÃ'=ç,|Žg™ÓyÞŠs`Ý…,åÙ[ŸOM'çϾèÛÑ9ž€°eŸ—tQ‡Ó=/RÜ>\ô ßÕ§É–lA(§Ô?VÄGPo`‰þgtyOXZÐX}Ô·…,NËï`”éÅíåÉЦ¾¶7÷ø~´,/&{!w°ÅOÞ ;A¯ ·(ž­«ÍûÒŽà fÐ…û¶¶—kØšâŒ0ØAߤìU€ëBÞ %¾¢rDbºéòõßþ‹'¢ÀŸúiñì=³òø‹Ÿ¸¯3‚ŸK{˜v6èCZÓ*Ó[ìlRI3“øÇu{A¡G:Ý #˜½í@àŒ@Aì-5½5Ô¥^PŸ톚UËÌÿ_nnŸÊóõé7rÙúä³ñùþ ÚDXÛá…O£Èé@/]û¦ãª c2E¿aÜÅ-ðæ‘‡ sR;¤h˜tà¨Ê^T;þ!ÉíVÛµi¥5FUz5LL¥%]¥4‰¤%˜`hfóbÖt}ÕÕ"õ£æÁjb»6ÔåнySÑ4xmUÌ»Ÿ2’¢ï`2íÂîàuý'° ä~wX‘­Ã³¾îT”¥6ž‹Q‚äû<Ûí€ rj%†Þä*ÇŒªì<*=–\û (ÃLônÖ©­“Ý­²2Ãäï4b_ždooù‚ŽŸ…ÃÝTJ•°ÔÚõ{íºt3W‘h$xv‹•; Å£ºXÚ†ß{˜y懙Á¨öúSe¦ÓÞ<§f˜– „u!ù+¯ã)]l¾F‰rr;\ÛÙ¾÷› @Üz[Xîèè‡Mm#ǹíR“¹¦‡?pñ´ 5K¹Ïá RÊeÜÞ,ŠJe‹ãa˜CX]LÍ;ÈÕž‘_¼MZÐa Ï% ß3õEÖ æ3H» H-º^=[°QhF—[­•0Ô¢÷² “ýƒaC÷÷±WÍA b'ÏL†Yœ½¬Ì•œK~s†3ŒòF*À{y‡ŽÛ]ob «7gÑ¥HˆZòߥ€ùÆó¼té|ÑY­ãRpXW½Nü¸;§tO.çA)6îw Óke©÷ÎkïÓ1h ]waãkÕ"•!Üôé~¥7;Vx ,Ò&Û|j¡z¾,Ñ¥I0­×o©Û‹j’Y}ê‚mËF ƒ¦êÝ%dŒ2ÖÈ v[- ¯o&s‘p»© ðÍòÐÓá×>ÝTò¨óמÞż”uÈ­z7[€W·ãð›´ö&b_9ŽU,*YI_W96cSåpqŽßÓ‰õŸŸhù·J@p’îTôµ~×@0 ͛КŸ¯Õ®pÌã! :žÐI×<©½¶yâר1ýƒŒhMâæ+º´müè%·­z#ò‡pit`½~k¯¬2kãß°û×=Ê O¨@¸„3ŠÂÈ)>s0j°Ñâ×\¾øß8•+±Ù:»óÈ=‹ïˆUFšÝ‹[GApè[‡óvGqT>Ó›¿_U5ÕD¬O€)A(Ùd(&óÇ,“Gƒ2¬®\Å!R’.„Ý¡Âg1€¤«rWfK§Ù!¥u+Òé‰ä9 S‰Æì\ÖátEQÇòxb#ž¨ô¤Ü—Má×h›0-¯$–3•ú»)òrbËÓ®½à‚{°äs9 Ê’àò™|šÆ[ë{·ÓQ’9 ˜Rʬ/x'+ƒx`Î akð‰{ô’°Ÿ}ãƒé¾Õ”÷ †×ôd£P´Ì^™!lmF?§æš§¹ðFx?ˆª•Ru=ƒJ0_4Ø–Šú“(ón´<Ò5HB\¿rO–üu<ÈÑä׃ƒˆ=]ä¯H¼a¬~á œ-|Äp*{ú9 /D qäKï×&•Ñ£_Œ»HkFÉ¥¹Mäi0öØíJãÁÇ7 ¯õH¼G÷ˆ¡#ó¥z·^4¤õ@ëð[zªCõ¥IP=U nœ¼œçëÌa¯n‘m§ÆIvz“c=žŽ•ì¼8*È n•Ç:. éÑZUæÎ˜;»>Å6ÝrØlî$¾mÿúð*wïÂñšØ;ÉÀ¾š³Èé?†gCù ¼BxF%n{£”Çæiùz-dûD¿2ùWêaHŒÓâ˜uåá{>C ‚ËÌQDÕâ’÷‡ óÇà^[G7c®4HÂܵ[úAh¾âïåEÀ]àR^%Ûœrfðx)­gŒWútÙèM ɾ‡ðTL¸»\‹«ýÌqßté¼­ªF˜ùm’th€% —Y(ŸÚ£»üî+® ù‹Í[£GPvC»<s½—“ý¼î^`(\è#¾ï„J–C™¶aã7P’ ËÔfÑ(žÑͬ%þ&Ip6K Èäo1XŽhU$ågÝå½+ßm³(8YþlùWlT.E2h2*w¦½nÓvÎG|vëÉÛ¿à„j°Ðj{÷kăܪ”‡Áx~]¹µúÃ9Á×xŒ7вmZm`[b@?r~ËÏT¼gñf`Ùôµ®=’¯a’%¢œrfé›:tób—,l:šl¯™`¨âÂÂMIèÜ9Év§Ïƒ ï°:°;o_3­6}§ã {‘RÞ9’èž¾xü9v³:ƒ5$ô1ÄpôBÄ!žðcBrUTçíéèå÷¤üvN»ýÅÉEì·t(uêÒ\ “7à5÷„fºE;ûF¤Foœë5IøcÓ—ÜJènn~†Fëö ¤Å`ó0ˆ™Ðíçud7juG’‹\ÂBä³Þ‘ß½œX“{­ØúX‹iVýª·A'££úŽˆqp£"§«|yÀu’Ýíæ{õ:!˜>³ì””jŒU#¿mžÑÂaÓ­ÃNÐãZ4b¡Hzœƒ—"‘Âg¦—Â×â䯠(›(¨Þ»c53üé7c¦5Ç4ÞPÖQžiz`ËìÌžúëÛWmÊ0†›ë j†{×TQ4&ºœÆ“ݧ=¼ZmëéÎï9gÈRl­äUŸð~–Ì!®­ÉKÎ'Š‘ˆtÓ2]ù8LâHâ%al>·Õ&X•†­e±}ín•ÁÅ"Uºæ"+¢U4ïÎúWNp¿ø%”SÚ:6+ࡾ;ÿT¬ÿ/bŸõÙÞþm‹öŸœ AQÐK¯zq.43cöÿYÕNyØà­eÞ-ÅØFçæ¸ Ãâ? G¡© u®‰øœÚø«O?râ‚sùååyåñöw$;V¨Ÿ õöiE2 ê*ÌeŒnÆR[ã^â3† D·ë‘0GÏ+äú5B d -w’ÍxwÇй-åÚ=Îc|)¤ÁbW&®§©úÍõ§‡z ~b8'Öã0rÈc;‘„š¸•© ©èã3›ÁØôåîòëL’EM™va yú,¸Ì0y3?g%ù†CŒTؼbXAc£¨ÊTáªÌí˜?ѧ–´Ê'¯'NÕËô \5]ž]—ôSf­-í×§é+£Ý‚ÃâêÌß2Ô‹6|gÀXÝ×gêTlL¢Ëz•Éâ…]a–ëóçO‚[D W§ º…ÉÕÎ=n¡¼ßV ÜDUØH3o¤ê¾èê[)Ê „¼½2i°?@xLŽÈË4;W(h’«çáÔÌÂïõ?»ž‚^>”N¿ºë‹ŽF¿(¸t%~¶ñ¹äÔ|¦öò/Ç_Àž]™ÓƒÇÎÄôð$'fl.?-Øð¿“!%ú ýŸÖ¾¹!@)//3Ûã¹3'|AºÓNÍ0ü6§''uÊUì22ð–¤Mð9ÓuÕ¿r!ßÉc(\¡è•j|š=}uÛ:ÎÕh³»+e|A˧ Fûw†’‘ljÉ®%ëÓÊ>š'´×(è K¬öu…‚©8aÊ£(VcÂMh†Y;D:@ÂU–rç•L[쑊ÙÑnú«L€Àr@ sëÆC€…*Ô»jOVéÕØt#(Ó¦t<Á¸ËírJ¨z¡­qw!æaô®Á†ØPf1€mk HƒX7o·H”uRs™ž{|h?Aϧëiõï”QïɃå`ˆ²îþN·CLýñ'å>œ¤NPù¥2î¾áïÄ¡ &êiõˆ;nŽ :.i}N»ÌH <:OòØAÁ‘ü)þè%uçÙx%—n}³{‡Y¹ Y‚¬‘Þ|²ðëî·M«@ü†Aìs¿ [a·È=”ÂÜÆäˆÍš€yZ§ï£ ‡O!°-í“ý5çN]馥F}\Fué›&X ;¨ÅîA[„Q¿™:VÀ ÐòRø©ã¼ÊâÁ1S¶OOmÀ³À<0NÌvŽ·s Ö®öA©ô9ÉÚ yòS}{aZ"¨(N×0@ŒÛÛŒFKHz¸…_f#ÂìØFbBPv—mž)¬xžÒt±e•h褟QË 9$º’ú°•|O±FæmTϦýÿ>û^¡åì{ð÷èzr@Ûf›ž¿:’% Üáå2®*­>9ž:&]õôP0„ùÏ1|MEѳÙücµMÄ´“^ Êó¹ß­ó TÌFÐæÛÄü²hs @n~#&Û÷p/=9;½²Í´£ê9óBËéC÷‘ѳMÏþÈÿÇžHåMý¹;Ñ],)Ÿ$½_‡î¥²‰Ï%HÿXÛÏ~œê÷z"ÞGùHž®‡X6©`>šÃ _{¾Ñþ,FQçDº˜Ï2=ÒgÎí%jèÈRu¹–îï¬2öZjd0¯xîdSSb@ã‘ GÇ´iÙ‹B¨}ÁÜWÿžÙ¨^ê°'ñùŸ€Y·¥Yñ3=†—(vÐÜþAäo`> ¸äžhËÀ_ßÉ®YQ^þà¯WúKR%ÙÐý“&‘g/}’¡È@òË­ ÝÜLÐ훑ç¿Þ^ð2ñÃëÌ`“Ý6¡s˜31W‡[ŠÉv6y£º´÷ÞକSÖoέ'=’Ó›¡wÎÞ®á€ÍLn“!ÃgVö.™Ú月±|uNRFôÃT\& ìüµ“ýÐjfB«s=+zzú![ïÇ2MãÛÇŸx#ô‡Â°i7³®dÿWmŽ ìæqûp¹E1Rr°®_Ѥ¿uÌœž$ O¢W¸Î5…äTc…)\‡œ Ö?·Ûœ^1†£ ÖßKf‹‹}”‹ûçðgÀ–ÔšˆsìM²@`Ø€)çËžÛz¿ÙÚ•Ô>eXö™óU!éætœE)C½CtçMÔ•¡›ªÞB|k“›SLa•ßQ-çQÕéŒWë/Ö¬èŠrÅ×íëYdå]…³€Á p)4AJo$èBçsàêÇS˜®|õJöØÑŠi+B” õmÉY’4¯Û0f@¤@À6íÞAz8Œ0Ð Ã~þ}“/°^ívpßÜÜÝ3ÞéSƒˆ§ ²ÒFi¼óÏ#¼¦bÖhù áâÛ7¯QDx.6F`mö'Ÿ¬ þ«,™¥ Où}EP<:÷M ¸ÃI/ ( n-„Cä¢ÎC¡œEZ»ÃŸ¢²{‡qð„ò™d#…jQ è8\ø,ZΡŽa:‰Ö-ËåÓ¢â͵þSSë\ ™íÈSó+7‘²/jk€M…‰"Ú‹åÁùi¿>MCB<Ö¶%°Ð9òé}¾¦S+É)ªKÌ¿±ÂŒ8ü=ÄxIhïöWGTåΔ›QáÛ-ÜF´J$h‡2@$_D;ïó4rÈZÒUÙèRÛ²6Y€éfÛ5%sJ-ýÊd¯¥Ñ…uRØÉÙ• õ,¨FŠ èp&WE„ð[iiç€F‡9åþy À J”Xì®8À‹{ÿ·è•1õfèéÎf‚š+t¥gÂn´»å/ô#ÓûÄúzE>‚ŸODG䡉2~=¼ªÅg—OÜ>ŠOeÏÊUð7ÇŠ"‚õýÂ+žÿ8rÖÖàšÞÍù ¦šúUÒ¼$%ÈÞpUHŸx¢Ín˜ø“'¼Tb¦cÄ+8€r>ùX0ÆB7¬k£1\á`¨ÀØÂ/C"gÉ Ìðoªýæ MÁà›z8á ÍP>Ùã)sžúín°pn™Ã1f5 ô‘&óÖ\å¹?ãÉèóVÄ×Óô~ºKwT­/Ò‘ÓçãÇõÌv(¸ÒÝ_]-Q‰¹À”bíÝJï¦Þ6UµÃ/­Âv§¸ûò rôí»ÙWÍÆå,"ë) ŒÐc¬³Ú\±ÞòÙÛXª¸"©î®·}h³1UþrŒ]Œëöê¥ÐKó¬™ÂÊŸž$úwÂB©{äêsç¼7©<Ç*,®ua—Õª t¾³æíTŽÊ–…í7ýÖ£¸W~HŠJ(\¥æùkçYý¦çÈjÃïwIxX;(§KßÁ¶ß¦­wodzëk§8øÒõÉ”.žT®¦ð¾q_eò~ ›Œ»ô1^d®>G®ÊMg6¨@(ª^ÃN*ë€?Dà±HÍOyÿöžL'i°šˆ°7;å”(M؇r9M5×ì§LŸ“¼yGs 5››"%ónN¨ÄÔÚÂÐGAÒÂòîŒHÌs1édù|á=ÁÒbp’•ÙSÔ£’1Í SÎ$’Ÿ#|6J¶ê¢Ž°"꫆ y‹Ut{ó¹Kž!+O{ì{Ç¥ØØâAÙ‘$Rš³ò>Ì_/. ÐÍârÄ›¨ËyoÈf˜±®~ý~®ƒ „ý–lpÐìPÐl¸\WjßÞÉ8eÁVW@¤¥÷?ˆˆKL‹óÔSÙŸ/>€»_JÓéBÓ$¸ºp€@x$x(ÝŠ¼”yÑô~ï!Œ Í-Ñ»<»¬–öåØDtW¦` ,¸fŽÄ@s‡}L~ =ŽSnÓBÄ¢úyVƒƒNÖƒÛmaÊ_ h½ÑÒ>9>~x•Ÿ¿v›ÛíÁM,)Q&Ã! )ãbéê ´[³Ýû.»˜Âñ²Bî!òãi¶qÌ6 d%/…Ðò ^Ç}FüË9–S­· _,êâª}+0v9<6NA²ÞéI6+Ih¿(K=³RÑï=GÃ;&k]ë°ó±<{JœGxfå¡r´Âmw_S$bÓQñœºV©s$ÑjÛMF@-ÓD‚éuø9óz%b;^ŒFÀï_ÛàŽü»pÎÄÀ.9‡KÀaãÒm”õx­ˆ|rjëU¯d9OC;„6};á=)pJº§J‰[ÊIÁdŽ€ Â\5⦠ÇóuBŸ²CqtÂ,é³5i3 5o˜¹6‰zR³‹ë´]mígÝg²C+:bÖÎëO Ñ’J w“”§øx\ǵ$¥eJ†D‹”+D& ûÚÆÒo–¢{æß™A×0Ê“Va¿/­ìp|Ó5ëw…R¸•ÑA"oßçæ@è]“_­„ü‡1c„JŒ”„(]¬¸nfheµ>…¯ë€šá±sOÌ÷úÅ«é[ u»Üz6Ïè{¸x e¿¢øÈWÚq ¦a÷®š©ë«æñä¸ðl>ŽF ü\Ý\ a¯Þ+Ý#×·iZcôç™ÃÆòg‡¶=^ì˜ÚhS㹆ɗ×pn¢‚¿ãÖÚ˜t£è×èá˜vð5CŠ „àt^Ñóè&yÏõ”ÇFS$#(­6ñÊ›©f.; )$QNŸ\ªŠùÚ`ê[ô›¦Å’š‘†zÉXjN¼keFëØ¥MF/{¡•Zl[ô™!øºðß•Kzý«Óa,ƒÙ’ï¥â`¶¤„B 5_VþtÖ’KÇ! ö›¬»‡Ï†J)’\!‹€_RôÜô—uœ+¤qÖÙ]P5ó`} óTŽBRc}J4š &Á8Ý‹ÆûdÈRƒ·Œ\ž¨7š\Þu!ó?YYó„>h€ ®ã×Ç\L›༃…YŽÏƬ‹öUY½xôE_ÝôÁ‰ì›±• Æ‚‘¶ÚÀFA1gš§`p:_y§–‚û¥œÜÄše ”e|cÌÕŸcmt,úÂ&:p2’)%÷´µÞih”„J“£dpJëÊ» |ÿï,E˜+³˜ Ê~U }B®…´ö‚ú1 ñêmZˆ(‘KP( ¬ý|L? û’£&:þêõv¯ŸÚæ¸ÚÝI½äìza;³öªùv*mƒU@碂5F!@ ÃŽÌÏ+˜†ÍÃFžZ—ïHϤ­žlëÎÍ“HõZ”Ó»|¬g‰Ø–Ñô)_dÙ}âA¶«›DØ…f ìðæ¹ ‹I5æX¸³B–bôª5õ_Q¯‚àù“î[KjPt[åSÖ@Ð(ڌݨr26ÌÌâ~—EÉ -¼é4âž.:Ç Â¹vä|L›Š4š˜µÍc;+"tÖC¦x½ˆ ¶åF ë~î¬1Å»$êù#ÙK¼¥´‘³ R%ÄÛñK[@éR´ãÉÇØ"¡lîb-Éiôe”p+HŽpjç®¶Ÿm°2 ![ +Àø_M3~XtÝÄÓ‡SÓ¢úý¥h9kɵ!‚h§“ÈgâfæB ™êÂV ϺŸrƒÖ0LgèF¸ògئ¬û7rg£ø.Ixyæú Ø…ò•¿&Ãw^öè7HN\(Öÿ?0Ør»O]Û¶„µS‰‚(Û®ùðÔB Wö¤,äóM{òuÙ¢Xõ¥b¢g˜—á"1¤'öö5¦ßÖtn)Âd|ý·¤~Ús ¢–\XÃÀn`iƒD)$¢tt=G †—…µcO¦ 9…:ÕAéPg:6½c×QË‚@L§ï2)@'|–ü]=·*»XµiçV¦Ñ…¼Éì4wŒä¨¨@&ƒ¼tW²WìÆå²j&‚ÿ©Ó¾Î¹ÞeJ{NŸäÂ Ö à½~|AAªÑêMR:ɹ ަÌ}E®ë'‡gÿðÂâ¥O‘P•bèè«“½ ÕŽQÕQ…Q³Ì¾©úÁá¢ÈáO)èÇ¿ÒÂÖâÅH»¢®<ªn`3•£F!²+t¤cUpºò„&×ÏèÓæ÷Õ:5—ÄÛhMÿ „Ü¢§†[m&ºfƯÉþsÈKŽžR;þåw'¶ÆS…û‚’¼ >ÃÕ`öñ†rÆÝծ쨘W’ª'(ùˆ(÷šIn|ky]¾™éq4Î)>žYaø/áUM0cqÄ¢%=\M„N²%²úiýø¬-H½n¬¹% Jßm»;ËÜÿ7t+RUÆâ£ØI ™ cÅòÏÏãÆ…š"Ò¸¼{¦‰2F\¨¤¬b½ËÊÏM,ñ]8ê­ÒsÂ=·"…\>ÌkøËŰN¿¬Ú@ù%e®;úÕ¤Ö˜+í5ÃI„¤Íi~Au´¸]lœêb;[Çt–š„Ip!"¹Ýýºïf€Hp÷ÊÇó܃4ÖZ¦OŒ,¼ ÈV¬’+rï;=†ˆqÜúŽ…x^Éy2Ñ]o§ð±"ÖªåÌ™jgj†b’9æ9ƒgB!ÐEÿå!UØø};ã*t~ÃDGD´>äŽ>¬mªþCÝVppÈÅ‹>Žñ# Èih:ŸìGçn¼¼ôyã‹çðÚ]\–eR·NR_>b䱤ÚÈ–¹ÊœMÍ¡¯ LNj3ì÷w6W‘ÁC4ò ÇÉ"Ÿ¦M²›ZÃ(tŽTèRQýgëœ4oš33Nì©Y+.mâåÑý8ëï.mÏ‚ë`,M¡Š;tøçìÜ ”xP(XÑëXa©02ÆA ó(ÔkõwÅ.ÏMÖì"æ eHòÖÃdÍtE!]·~À/ç£u2ÆÂ jhµ;‰†µÐÓVœ5S\Fpc=I.©‹’1²+ÕǪ\päM¡íƸ¡ÖJÕ ªÏ l½9Μ;ix„z2“X½‹OCÚ8 0™(³^IÚQ$ï\Ìûbóaeß1Éæ0q°¶ ötDÙ´Œ˜tW d〮×Îò™Ô÷ì©Êq¯tòÕX h*FVå9½‹yw@Q—³¸Î>˜Eêä'£º=\âÿ¨Í„±F2•EŒ Õ^4WT¿IÂêïj¶ŠÉŒi‚òôcBdž{ÙÉ×¥é pM`è7»y¨dµÁhÀZWÚ^s ±:£jçbtÓÃ\Œa^::2ÐÕ@€ `IYƒðW!`pÕ#†ê»+²Ø•!'Á€ÇÍú2j«Û -”7¦:Öáä´' ö\é~íø‘ ±ùæÛÄx8nš1²¾×·(ÐS_7ì½Vç°²h2hN³ì»Î ÚH ¼Í Æñ$É¢h5†èÂnÔÆzze“2º@ù[+b°&Ò“?C0a*¹Èy‡ö>[¸ ß“Ë΢}Ç5ê ›Ïåž%ôõÐvO"ñ4¥!¬Edkµ©DXßÛá¾uüZüf†Í[ƒ‰¢&™-ó=A¥žãow¹ÉÓ|Ü&Òmc¼‘ËnºèùÆ~ˆÄÕÆªe 6?%´o¬ûwS¼çå*j£ûuªŒ • ?Y¹Ý L˜°¦ÁôõÜùl~|Xã¿ äLž šZ:h$éG” >š+q‹÷bbŒmDv×è»"qæðÊÔŸÁʹ¯®.ó=ßa$/\©‹óüÊm‚ÔѬ&k:üÇ÷Hâ.”§ªÉÙÐÉžŸŸE0õ9V@gXÙžƒ®jLÒ<\Íï¦Éƒz.õf”ZÝr6VD™¸UˆÞ—%Çì¸l}Èœ‰=lÕöqüù²½x¶NáK.| #ŠSujz±ÁƳµá%’È`ùCC­Ofü(Wÿ:¾;ob¶Jœx-ßunÅwËâĪÅ6 uVäôüšìI|›°<@ôˆøŽ¹4vË"[HÌà ¢ô3ŒT±ïD˃t›Y¯ž÷-¶…+Òr`d´±È‡ÀX±X»5XJÄ-Dáõ¼ÅiÜ!†“8¹¤}ù9@§»Q¦ ê¡^ÅÕ¥Z¯žl¢:Zä†Äñ©Šzôúý–ûñòÔ€‹º7¨U å2îAœgñÙ¹ÙÂù¡Y§ŽcïÂy7ÙbüëU(íÌ|»*6i¾¤ìÒf-†(ÇÏÆþêÎWÈNiÞ¾­fe€èàT ‹ý¤äRÜ‹¹×šx·  U/¤l -+–L y\[ÀW#ÙÈWx1T±!2±r^ÛQ_%^'6ÂØè\jÎvK–… ɲpÇ@?²ÚvæYƒ$ÒNRˆUË`<¹&É\Ð×[Wƒ"\· ã—ïwÙáГ]“PK¤=VB®–F™=%v_Û¢4 )%"ƒИCÖ -ÙÓT®}d\WâYËI[²Ðo8“´_–¼Zã Dx’Æ»¢öjµ-pæT±dVÔL.ÕàÀ§ò»¼zFg‘½,dbÊ¥Ì?6!ÑpÁá8£Áw¼Â¦Ïá…Þ­Ü­ð”%™“…vë.–´v÷™™cg”©$À›Cf3¼ñbňÓݺáZWÕ¥¥ÏZÖêÏM¦fû¡Á+ª™oð½À¡ü¾[ØDÐ ü5Ê uEvSežk=¡z¯«bz¤\“¡Ðt¹)WzÖJ¯œ[¥« £|`ÁB?G¥û&[YKó’ñÒ!M^Ä\*‚lÎdAèÚÃl¡{™±k‰†¤ahòù °wß™&ÚßdT{y}r´ø¯KÀ1\¬‚Nƒ• u¿RrjÉæAÀj2½gJj9MÙž™E” r®cwä$=p$$$X(ý©Ùÿ.y¶:/áˆ}2ä ÝV¼hWFpo/Bïk¨ýEá¬gÆ€5Ÿ7ËLÆõg¦RdñùŒ:½¹Ž™$ËB×Sž¦æE¹¬ó,2j6󴇮”ˆ‘²É³Ä }ÍêéŒ~Ó÷X&¸RÁ6ºì¬~íC0ƒ´A±J£æà(޳U*p=Ïv.Æ÷°#Qr4I¬ÓOg$3íÅbQz_Cå\ÑO"­"Ýá¯ÛŸEyZ(˜ç¦ŸCd÷(gvucMà–É€Oª}Œÿ¯ˆ ´Ó•ðg0µ5(ÉuU!kUý\*˜º|9$ç+ïÞ;éßE')Þ§ƒ %'½.U4y«?-œÞe¦òGN–`³}¡×…"ÁyÞ¼kËï¼Õ”òL$« jQ59sóË8ŽûèòyXft{Ò;ïÓ$IƒõÎé€ó4’†pl~]D‡¿.:¤pŒÃ)¥à£§„Á1ØîkÚJÃ*´Þô$1Múk&ÖHëÕ,Ø­•({î%0¤üÝ:î,LDu 8Óßòp®U›}yº­pö¶1'2ÙÄÕ$n•ù÷|È¿tÖ,Ê«¾Š¯¦·ƒÜÖpZɓɩ–‚¡µ]:tÀ½áP^›Ñ`bŒ~Iº+zÖÉ3Î,œ×UiŒjäKPX†¯è%BhLRšL»¶œ.¹©=ƒÒ>h­Ù%ñZ;ºpw\–ÛK唆_¼:a³IT¡ Ø­’7|îZ_ž¯ÁœëíÑ´D‹ž‹jœ8¤õe5OÐÍEÕfw#3 šHÖ´¥E´ú*®ãé’e:¥ r^ƒ5].fÓ¾¬O>æ[Û9¡A¡’ް·IdÖC>ÎE–ˆÃm9žñDž.ÀÙ<â$Ï©0¤í8¾òM‰´ú9gŸòm7<ËðšŠÊíV™Ÿ æ­ÍW³“ŸÐjå§?^þA`R|üG&æ ýl¸õz¶ëIºnù J¼Ñ¾çœÃxý.í0Þ;²Š ¯g“KZû•‘XóöFRЧÈÓ´r“K¼«™(ðĨjïLý2|?‘Þ|¾ÖD³N[›ÂÞuÞÌ0Þý[·²tÄ+¢Í¹4èâ_‘ùÀùæé8?à QJRùb½0Œá #^ÜFêo8²ÉCñEþõç°Fy²§ÉF6Ocîç!’æo"SD¹zë©õfäEà.[¨g<ûRG;jt@ì€íÉg‰ñaÞÍ›§æ0«‹$K™¢A᮳!„‹ˆówûdôç>—:(ú¾3[ØŠ¥CÖPOð>kon^â(ßêa»9sr$¥œ7Þ,‡#]"jEKs3ÓæhíÂ7Á¾Ëã=´jÛQ2ú,tvx½}ÅÉ ÎÙ†=MÒ÷€†ÑÃ…§¯%ÓÉ$ ¦çV$4]k;"ÿQ¦ÑÕòŸh’A¬5Þ\_ÍF)yWY8Ð{·/O1‹^’5V)D„ÅÉc’\ã%èÕ, PeTídP)ÒTD¶øé壎ˆÄŸƒhZ.Ÿ›W\…Xg GÅhÎá£jÍJTÒ Y-8åCkA›§c­µ.v]/R®Ï*Ò»MNõ˜\; ëHÓ>ÒC5Š—T§©æô•Þ‡FÄÓ­{\EÊ¢Å8ŽÀ%ò¶œ_{;éaï·ïû©ývSÁ¨ Múí§7næ›ÇžM\±¨³ŒRr·Dtë\Òƒ)‡lÈùdN]µœüð~e„žÂ‰&^TâŒ~åå"§gˆôi ¥×Wßâw.œ>Z4ÓI]l7D­¤É¶O÷ŸÞôØ}Å:¡7£>GÄQ¸ ÔÃÙ½d26è¶E܃ô&júÃ!›†±½4"ÊY»¹š„¹ r ö¬9:øon‹ŸÑ÷d²ba'س…ϧ¯‚J"wNžläQPø¹­ H†M 缘 ¢‰§LoBkgs}iÐW¾vÞº>@âb±Á¡Ú ަhQQËø¹#ЏTüìwÝ÷¨•æÑI?»7zà|Òpff¹SKG«V:D`6víÔ¦Ù"/²ÏÅ$ÂùÐmía;ÉË(Nc®ãhÊx/©ŠE'©Ó²Æ{xØ8'8ÓóÆ7—`mNüF:„Ç,aãçw7’<•èËqB¦óá›8Xûl ŽAÈÅ`SE0~Ýé5²Àëq)4“±ª[bG_6’ù°õ„óJÛ÷xÙ–d޶à4»7úµ‹i³I:YgÜ£ùùƒ¡]‘|:$¼À1˜'ó“I7;dhù'E»oj í­Y‡¤ÙÜBø­>©‘Þ£é û#NS»b]†Ù;\ì¸;Õò8²1iå.òLŸ œèäe‰î$áÏ&Y×¼·ðÍZ)jÝEæí„b{­ÈÎå3¦.%h‡u;ûRõ§« ×–¿iç‚yçöSaË|íí$bŸÔzg$K~M ³ëïsGÊ_õÖê†czärøÙ /ª¾ˆG—²´Ñ€æ*h£èŽXýnnèù jÔòû^;sá©„âšÔÙoFó[`7ºsùï“”äeh§k2Žò•{¼Ë㌜íʹµ‡Å9ú«»3צÝ8}sò÷Tyæ×ÿq__GÛ¦(¹/}ó3Xå.óG;¤þžmv^þ¿3Mµµ9 • læ£9uì™çmàwK¡ðý: Nš˜Á’øÙqŠÝF/óMW VÕôDV‡ ÝL#ðÃÖK°­¬5KM¦ãç±+;±4BÍwÌÍ$dD¥2s’“dûTýøÏ4Z)Û-“ë‰1ÿ×&ŠïC7ñ~†=Ù‘Øí³I)ú¿wžÎfU)_Ÿeå‚óÝÝvé°`Ï"ŠÊ¢E´ö/°&~·“ðå™(—dge%‚Iwr£@aJ¯zçÆs[m[›ÛßTY –ØWŒ· Ué¥#m7õ§Ð;t.ÊñÎ1H“yío˜¬Ø\k.ôE¤}"؇:’öKmÄQfD)$¡r¬4t×Yà«`B´]QÓnŒŠ¯2R/—³FÜ&ɾ?Ûo¸y¬Ï ØÃteÒ76rQšò£ÇqǦeq´îâëbÃ;Š¡ayD~ÜŽ>q.R^S7n(Šl«j"‹çŸ¡ûZ¡h¤öQ@óx5ΫVÄn ;%IzÎÄ~!”]Mø-éDˆ\¡M ®iÚ1ÜÆ«fþ `êà½{%”œ±þþ^6ÉD»¹1èØÁ*sÀò ö²7­š®¢/ö…ª¥ª[M¥XŒOSž×S|–Æß1¸qÖ•ÜâmÂÆK ŽçZgJÝúÝvÊ:=wv|ÆöÈe>[ýy§(²Øp¡¶lJócêºøñó#=B SÅ1?<jPñÕ° œœ¦¥X¥ÌAÏÜôJM.êe)Öô¾l:Aæýíä±·°â¾jeÜwo·á8~=æÿ_µ¬bűñ÷஦ó¦~«d÷¦ÉÅ4›Åb{Ó´ßz{€Ö·—(î©Ì€ø&|k¹VïŽCýÌjÆ8«õü“Ï™ ¾}›rj=ÄÔÔ—4u~d¯ÁÚéÌ™Š®?ž®ó4¼ ÓÔ¹`Gá« jœÈézGÔ=³ÜAd˜SE/ý"+ZEInû«XÆu'?œ4¤ÊÎ:‹QDÂx®C“[;‰šp¸ tQDÐã6»Ó¿ßÈŸéž–ÖãòÚØÈåÙ˜´\‡<ÄoÆØ£OêÏ¿ F~¾o^< »©QÓkíÄ S¼¬FHï¶"~»)7É{– OíDâî7„âÞTx[ÛÖ½f@Gå|ë|ÙûO•(þ ™UF:ÕÞE^í7îÏf:ÌËÚ´`¿É}eñÅV¿'N®G+ÄØÓÖ]"wn V§À>&ò×{` TlÔ,—žº¶™D#º¡”Œˆe©~SN¤\OƒmÛ¤”Þ•) ˆ‹BnܨŽG%:˜X­@=Uó0"yÚ6 Ö7“Þ²"ï™ÚÞò\æ+K]ÌÃ?ˆÞä¹=ÇDf¸œrêÝ{°$ ä¦Qzäç­ÏA»K:SÀC¡‹ªw>«FV é«GE¡æ&þ ÉÈdz&¹ÒYºáž]žê'% f瘤Ÿ¨¦ @:Ýp ¡ ¶TÃE ~óFµèQæG£prŸ!Ϻ°ûƒQˆè¥/PVFŒ­ n¯´ˆÂ/.Žáøö"1ã™ÿ©NœÎ^S.@-ò2ÞDD†ü2':–/WJ’cú$§)f ‹¢¸h{)%iaS²°¶ID¥">c(Yà`æFh©P׿M7Í“YîFS!朱;…ð÷s,¢õ;ƒ&ÍcJ÷°Z¤ÒÉCcKH4‰næá: ™NâžîiÎF,âTuˆñãè„ðŒqÔИ9 íHS7äÈÔöhÓð‘ÈI‹þ6Ìõ#GŃ’!X™‚¯E\U¢–ƒ‹Ï ò½òo¾r‡W;sÈ$øC—IXÁkNóvƒˆ/%~ÊtY¢Þí®ÍŸw«¦—ž]›‚öI̵¯Àz™¥qçñåQG¸ôl(‰Îµ)Ï€xï¾nCJA¶)ݸ |•jÂ{ ý}o@6x¬ºdò¬î@ó~~™Ù¤"ÉŠ™}: Csêõ7Ý‘Í á1rQÜ8eP¹«Òò¨&/ã\ìJΚL® ,¡ÍuK3 yP'x#‹)&öÚ†¹o醣A*óð¶|éfNL†-ªNAÁr™Ï–zÄ|è§Ð/ž2ƒœÀT œãJ¯¸zõ4)n°Û½W³xkåZÀœ²a2|šº‚1(ïA>DsJT{Öeˆì÷@̪÷qÿ72uÒHv[¬@!Â…˜–¼"¹ÉÚóZªêd¯Ÿ±“WWøíQ{©°¥5W‹â ¾ÇYƒ(VÕÎG…wJ¯]®=’ ÚŸd“OFGÒôùq,ÕäËÁÊ“5ûd{ü¥»èj=Y(l¯·bËG ¹Ö¶TóÉtD¯O`oÔÛ; 8†d¶ØÙo@#³¤‡9£" ëß79®"“„›æiéÎ;àvñê†0(˹`þ²ÎÅÂŽz $•ïtÝ­öX©`­Š¹µùad’ÒÄ e›9®ÆSò»GÐØ³ÆÔ˜`WE$ˆ.á禳'ì]ØûØù)šÙf‰¡ÉVxÓ¥yêªÛóÐØÛ—7¦8¸¹Æœ¹@·ˆV[OFyF¸•ÉÓ%ù’™‚&ÝÜÕA–Hc¦u”Wg«t³† Xî€s·Æý)VÜaqÕ? ƒÔhK©×pKJí¦§¡W©C_ÛÛÔû÷ÐCÔ)VíDz;§ëϤᮑ£xQýU0·0ü@oPâl¡5á°CR_R]ÙŒªõÀBìÿ¨¾ÊÊ ¦î{VT0"¯mÆÊ‡É¶lX»ˆi<*›}hÒª) 1—YíZóŠÕÆÌÇÅtˆ ©gì‰vòëÅa‘<ÀǪu‚ƒ+±Buf|ã¥mˆì÷ÊÔE+tˆ»+!ïKêš+ôo<ÖKtýJi®O(ØÜj†Ÿš·?¤kmÌ‘>ûà°ÞŸN— åƒyT¿¹}ó@Þ°Z.v0Ï”Aéf,Bá²·˜ÂYýóX¦Êé‡jõ(Ìu¡n^süúgA«ó’³AcO>ZŸƒ°Jäp=sâ _Ÿ¦ÈÝ »ë’qUHe‘΄š‚ÁØVq£‰ÓÝNM u’rá_R2¾’Þú4II4‰ªÊø("{Œôg¸$2Øcvn`KÜD8Œ •yƒ¾ž„¯éMzÞÌkuÜÌò¸‚þ¯m4HõÉ^çãoƒ![Ä¢óÈ7ºÉ‚ú…„ƒÂTs×p0 ÷3Ðí`.þ‡Ïý}ùç”2=8#»¹+?/,}ºœýiÊ6èR¶P¤8ï—·¯Š™N½T ¦ÿ´Zo<”'ÈzeY˜…ƒóè¶Zæ7Z-þ&/%àßË¢¡Š ¹=23ÍHJ0T>ÐÆ³d¹vÄJÉêæ@/a³Êd3?îÕ 9+|J‚©=´Ýg¿^„_Ú¯Bîð(òñ­³½ä¿ŸùbÍ´š•êc¥a¯;Ö!f3 ~=áåF¶E²jÂIùj;½â÷×*ìÁNå'‘3ô+=ƒ8Ç6{I¹,ÚãbÙ¼ÂóŒëº²ªCLäÚoŸ2¨46³’¦²os°VsÜ9µÆa¦¢øIÀû£HwV6)Ð7ÃçüÀ#ïÊŽ.ä‡ìäôŸl^,þÉ™ˆ» ¾eÉÏüèÑl·UÉæÑ$æ€kºú¬“dHlgÐ|Ýelô3òÉÕ¥Àî‰O š*_¢¼)©våhx°ž -Z¼@b§8uDì´{ÌõWHJÍr¥¬Æ¢¶cÛÂ×Ò÷Ça—3±‚|z0ìgÂj…ÜîzÚÞ­äcéj•²ÇM(˜dxLÜ &Ò-ƒp*jbÓ E7’^ྪ‹Ã¤ü ^Y”»"$h€#dbY¡~÷]`s¿`gí ܈¯Ÿä˧ŸNl¹VlºOD3a-¸6±¾Z>Ý5©ÛvŸžüôZ™¦gÔüÄæádÛýV£ìZ®yawo,Ü0ò³o—SˆÙ+<¾ca¶V©]ï¨÷Ã,@;²^@Vû;Ö%º<ñ …¬º¡!̱(³Š‡çÀ––œ‚Tdt9~Á^—¿Õ'¢@[Àj5çîžë¶]=paðO½–ôy:>º÷ãß{ØþO°Zùͺ¯XBüW¯»æ½dA<)'»5ZZÓë@ùQ° X@„’™k`9&裶÷3öµªFEÚd*„-'?!±A`žÇ#x”ßÌWÞ7txQ ×à²×¤€ Þú °qšÜkQ•fD «ÈuÏÀ”ƒí'…ŽöÏš/> žh0Ô=2‘=sÎrf\•/ƒŠË“4K=‹³®&r¤Œþ›¡@¶êP“·>„´Àg¼„á˜_ãuI¢+(‹i NÆ’B5;T‘„…ŒñzÍaù¦³çê!Å`›{ç~êd+»á’fÑ®Þ{Ûyð¦ÌmÞÁÝ€ïýû‚sjF‹Üt–ùÀø¶wH_¯À÷«Ëúý†G.À–°#,ï˜Ñ½bhB߆L(ßÀhïïK½“|¤J†¥Ãiw#RÒQ@ø*½‘ׯ‹`zÍL@aùSiR°'—L¸ì´öŽ@‰½) ]³0ŠàôéTµcøÇˆtËÀ8ñÚë_¡ûvãüéÓ™œI׎²è5RÁª “þP˜$yqêÏ9t-ÑÐ%ðcj~ ì Œèïpú!(_E¤Êá£SDÏNÕ@‰Ûè»l†¬T8…ž|>×1îóv¾˜³å¢VöàÚfœ@¯ùv‡Z4ˆ®¯â´³ Ó¼ø®•Df® úŒÁýb: ÂÄ)ãhÞºÿ­?†Úx­§X+Qm¡£ r±Ê!°L“Eh ‹vÍtÝ]o¢ìŽÎ%ºYÑ™ls…¢Ø§qÅõÙš[…¥àžé¡æ{Ë” ÌŸ ÛSªFµ·á$ä›h_lBÝð¥gš@Ôe"‹Ùôf¶mt¡>ªöõ›L Œ1•ö•%µ7&•4̰'“’í%qÛ”3m@/>ºÑ äe{ïœ;Í.ãpÏvž„§Ñ+Ϩ9ÇØXÓ“š=ãr‡¡öæúT;MX Êg ßl’ ëmÓ$«âñìËþÞyDïíÙ<ù›žãÄÕŒªp,y ç¤4ìRƒ‰ÇÍŸìí矖ÌTúµØ§Á2HØ;¡¥M»šáÀ=’{Iá¿6Ý/nïãp|Xó­UþGÖË}Ú¹*âSÀS0ùyO1Ÿ,§ˆ!Å] "têWÉ@º+Ÿ°Š~bB'ÌgBÂXAí¸ˆÅ ’€ YTžts¼»!í;êœ-ºVJJ¹öj·†'±\Õ&>€k†mîø ™ùÇJƧV&r¬£–ߨçnÞkвÎæi¢åèΊžÇ–øŽZWŸaO»[ÏêøÍϳÏÑ> ØL€4åùùa Á ÃPú}g°³Ë4ê Ÿ–Z‡\¢×‡TyxžÛ¢:q}@ „„ÄÜÞ6”³–M@§g êÇwTnYŽ¿“gb"—ªT.C. mÄ=W>„ §§ T¥U¢ÎKmæÞýôœ;ä†ïw’ÿÙ${£ÆîCz/ƒBËÞI$z!»3š=“Øeî"y:Ú)l*ÖÛµJRM òÌá¶ ¿…Çí¾k.1õ™çe ˜—),C©Å‡ _…X:)iKCWÚI»Pmq ÷#b!ùprˆÁɪöôô¬Wã'ísÎE"r~`Ëd«ÍêvwÒI 7ŽBm”Sfð"¢ö‡ë¿´^ö-ÂJŸKékwŠ˜Í²:=€ËjÿL&—ãŸå~i¹QåÛ^»><ïyôö±¥št×aߨîHŽ\3œZ`Ìb¾Ý©«KçïXÝû®Múçuß?4.zêþÙk²ÓÒ­T‰%á í?±–ÏLøž²Ý‡;äÊrà•à4Âõç ­ÃÕzþýÒ½lÔ"*Ì”«³rA~»‰ R–£Gh™ê&°éoQRØ•*y2¨\i>ЦGΕõ¬¤˜Çq‚øB‘¢nµXirJ+z”âè&åúÏè>ôÍÏâX‡ÀuôO“!İû$<ëݽHÑŠ¾I¤ÃŠˆÈ0{âNkœ=C—«Ž£Ï³¡Î]¹ñ ¨µÑ9Ö¦3Mßg"³åî?õ–nü=yÁäÕ„ «&§zö®‰å;Ås·š¹Ÿ Ê„† —óÖzßëǰÐù‚!ƒžbç-4胕’Œü;È?í÷2² .ˆ?ȺÐ&EKތͽÙó#/H}»ýš¡°Pàþ5|!Äß+K[„Q£è(Xo¾—7³c&›/ŸȖ<° ª¶¼újlÎ4¹DøXFq[@ÔÑç?=ªa K}433 ›–f^6n|zñÃyp©…$>ÒL¯×¬…@õ>³f 3;8*ª%ÌÀ=™E\ÛI‚ÖòÊ(ôlŒqÎm¿jí÷ƒ¯—gm·…úöW4¥^JÛ/h¢Ä9Å”éYÖðêuçÙÆ C qH$z¶%=Ní¹ÒaËr#t"?“7'ï¤5ƒ&—#/=k<·ËߊmLö#íü®ðÒÅ •à7uÖ»x‘îÕÇ—/,³«òü8yÅ!ØX;°ŸØo‘@¤Xè KªòD,u¦wþ^æ5<—=¡án8}«P|À`ÆA}8ûxÕÞ:uƬ¯ü»S5RïR›T 7¯eš¹E`d–å‹}†íƒšVßp‘9¢BNÕ5».'2øêc´÷Ü®3l|ÙÅ ‚Ëç8ãâ"0>‰Ý:¯—E¯rú 7еnnÊÎQJ©j%‰kz¥º=d[Õ±-`b” ÂJIí4ru´æäI’ŽòÙ¡¢%‚óο®$ñ¹Ì&ò×#@Û—1Ã|¡þþ´`}`WÈ图=ÃÚ4Êg˜b‹ç²ùW‡T-­ Bì/H]W41”í2G*R!<6Ö.üB#V¿¹ã%BàÅÇGÓå3xSQ»_eh¸›Ã,NYILðp"4uA}åºoe³¹mFrô'š$ìDÃ?h+4*9¥Š$wX̼vÖ´î¢-¬.žvЈˆðv×jü˾«åÎr~õéYÈÄuØÔEît²ùjÓ¼¸.tm"‡å )1œqRíRƒ°²6ÐÔ…çý))î st#=æð®áÆ0ЇÐØ%êO ¹ô¿!†cåÈÄK°=¾ÓÑ:µ< Jvç ù§LÍ(vð=žíÚôÎÚçÚ®u ç Š½&GÏl9¼79Öàît£9€ï @Ѓ™&%ÀêP†MP…ÖÜ¿¿»¡1ÌQu8ˆÄ>ƒü+ä~ínoVavø‹÷±Ë!Ùà­ú½"¢±òÈ»+wõäºìùª*Ûýô:¾Ý|<ÄüHÁ "¾ °|TÂn *DŽ” l~|“ýKjµpüúÐOgJçpT$Ñ<ȶYÔø-ˆýÒ¸'æùÆùe¥Ý²…a7a>žK×þß}¹¾^ÆeóLiil­'í^£éûŒ `ú>M9LJҵ§#v ‹:4è¦Usßµô|¹zØÚð6zœ¹}øsso—Fÿ?NÔÉt¹ðÑòBñ²¹—Ï‹Vì€Dã…§mÆÐ]qÇV’î_Î݃3ëzn<ƒí¤“| 8±ÌñMsÐ F@)¢¼„À˜ö–ÏæÙOiÄÞ­™¡Ž'®ì03]½¼6ŸïÞ剸› …;Œ8rn½Ã…Þ V¯—ZvÛív5îF‚_}by~Æìà¡vÇ]=ú š2FëZ‚ú§S+^šôN¬hóêïoNyÁàçà >b7.£Qbᨰncç”3t<ÏU  <±ü縈ñÖdW©9)lŒŽìº’‡ÌìÙC˜.¥F4ãKM΃Ò6EJÈA€—¸’”–Ë‘ä}-[’ugP¦ÃN!D‡b\Êõ|ißûz|¥f—ÓvÊia§üØBÀFàwÜm–w/;{ ê]¹iîcÇí^h Alk|“¾•ó„˜[S$(×^ÆTµÜMÌZ™Çié¤!÷œÖBb ç9$#ÏXªdжÁî2ÙãQ¨g)lQ¬ÝÚÉ,âã˜nbvŒ“1ªjÎØjÁz§dϲƒ½LEè‰Ê\̲ʥåí¥>š Ñ•¾J@^ØÚÌï!ΑԡÎ2ƒ£µ¼C6©]ák\tî!S°69âjЄ)ƫՈà÷<«[•ûŠa¼©oÒ%ÜÒ×crÉðÇ‚."¢‰¦,eÑnwËÁ1UJ[Xó”{#BEÍZ$Xtp‚š8CCež‹ M·,5a*wÀ¥ ß Gu¿Vc§Ç^MÝ79’齆ìP‘åú§¾:ß÷·æ7ó¼ô…þ6Ÿýc‰E§æ±¤ã‰»ÓÐXâãø›ÿš&»¤)YȦòn¼Tà©HÀ„Êj¦íϬg¯†w¥ÌÏIÜÞxj ˆcÆ‚\CEn2#ëãž°šœlºt2Žøƒ¬“¯—liÌí>‘fõPŸþmè¯*AîAÀDsž£ù`ÂÆ©Qg<xèYAHÏ´8LˆñAÙxëvj !¦ŠÖSÌû(Ë´7;m…O3¥)´³ YmÆ š^þl¨ºÅºÚâßdñ=Ò׃â-DØä% E½¬”»r(£Ë¾_ãñ#¿+Ù«ÞùÒ‚„Ä•4é½ÚÓCZ5ô¦–„@i,’ñ©u¿„G Ÿ•åøƒ·Q)vnد\’O›uø•=›[‹!êú™™\S­ÒL©ãÐíÊ×ë¾ûôß2J‹ü¯¾_¦ùÀû߬¿PÀ?P·¨À­úÏŠTÜ´XW•ÓÞ}‘Ð_ó?ÃÌà†vvÊ与hõ·ÛUFnM„ËÐ$ß¹(¤²ëזɶ1üì(§[±4WYäq?1÷ à¶Ý\ÃD Ó`wY8$[$@òÔ½,ÏlK§s¤½ðØÿÊ:˜'SÈÁ Bt^Üß&£ÏVÝÿ‹%,|dð5ÚÚ‚‘”-7þO@S cYüoÚ篇ôµq¨k9 \Ô ¨Š ÅTì áê»­Ñß@êŸJëÒä K*'뙃e!uKšÆöØõ>zÇÏÞ¼(¬ÄŒ˜1otø$cîÁmõ‡ÔYç˜Ï„J3è0sIu9FA«™6ÈË4 *Š‹0®œsáÀíÀ†ÅÂ="¼¼|CJ慠j¤Dj¹ga>˜åɧ ¼|gtбãl•X[¤òV<3.?bµÅu¨òãV¼µBlihsTˆé ШÔmÚŽÒIÂó_~{zwéÕÛ¹º¶”)ÊÊ‘×Øà(>¥ ÊÉtmÉ=n°ô;7!mË]ãšR úLx 4p ¢äìÂts;PDjžùÍÙç`(IX61¦"$\kó¦SdÆD²-y¦“eâÙ$KÚ¡ü¨t"Ï3Ò.t%»už·¡é-¨¶JP«oË L^½`’Ï Xä¹°oû÷*6+©Ã_‡e! @jÈ[º‚ ÇçŽc¶1>oŒ ŒÇxrüñâ/¦kø¨ŠÞüÚÒ ÷â±®[Ad·¾Ö¯»&¦Ù>ÆÐ„Ä%†eBwx0KÕIÜœ J‡aå¤Ô¿9 z…}š‘3žÇsËx‹ç/>mi`ǰEV HòL»o0;à7†ç™ Sì´èM…ÜT-ã[)mˤ=l)šœ»òWpÚØêçclEIŸÈ¹y.±å—V¾bæý‚Õ°5lh-î9Æ£`Â.ý'õr!6øœHZ4œ`äÔ³ £Èãp¸šJÍØb—!¥‡)²wØ„u/ôeG›]¾Gø’¶ ¨w@‘`ajQNF1xå1,÷D¬{NÞÉCüª²CAîÞb¥/‹1À½ÝÇnìa¢?©üZ©wÖA‘ùÆâ©2zjQIó1Ú ^Ö¶ó{εN÷ÉÉ“);9Œ–ìÞýxÓú%Ôðß§ÑÑsÿeþëà°ú+%Ç(ñ.›yd ›†,yìiŠÁ*“¨Ú§! G T³•ס×ðj `‰D™x¯ tLP=89U©Ä†CK»^Rè}°ÁƒÊ§…U«ßëu—‡¯²ÏK¦N4 Y`UMVà ëÖ°Àž©³±†tßGÆÛý± pê?c=F;’µ²¡nÓêA”PžkóÛîëQ—u,kdX,dÔèPtÐ[@S'j}§óÇyc¢:S¦Å Ô¤R|²à/h5+DèºØ;S!ÒO—YÎ%@ô„jÄþξ “Tc*ÓŽÜ#¤#Öçù¥PÖ“FÌæñ«œ¬ó´hûš7–J rþ<ûϻԂ&}%¹ý‚ï4v®Zå›0~>vÝ™v2¯ë£Æ®í°„uðq Á>K{ÉxF½ á†±ï]¦ÎµÚæ)D!£Ó1´ñ\P÷í@Mêe<Zšú=¨=dµ¹ÇÁÌ4ôò24_Š:5€ž¡ì!!oBxSímÐ löõ[•,nö$ˆ®ú·OKG'rLnR6-.^ð÷ Æ/lìÃA᎜öæ’¡ž;)¡6m1 ˜Àk†’¶J$|ì È\&d(Är™‡}k¢VH^»tLI‰ŒpdÂØà!#…M%MSgÜÙ*ò®ÜôÖ³êÜ^•o÷µ˜i>‰>!OKŽ”yLi THÖú–:ë±H ÒÀм¡N9gZråTãxrÈÛËœN{ƒ*Y{]*ª"2Й:‹>Ó›ó9ö LîZ9óXûÔà—+õç²-5tkÞ_®|ØmÏ:| 3-¸…ÓËtBùœ=GSo™µoQIŽSÕ!”¼”¨( çn²‚7ÕŠL1É'ùdÉþC)Hr0J¹Þ]*n›Äq%ùRçõv£%´(òîœÀ£ã*de»æÁ˜â’q‰ÏjQ\[M ¢Ìt+Mäýõ>£oŒ¢í‚:¾{S*wjè^îËÍ0tÔ»6¶ì|X†û<¬‘*ÕnÈ…Ý`¹t úšÊ'ôk ËQmWmø¿ 7_žž÷üàKDâòž²¥‰l†“7ø}§³ˆ¢] £…rôióÊf#Ì“àƒq ˆK¢P:Y2e‚Š]K«ýÐ<Ìí¨®àA.N !Š.²™Á:áÖt£NªLe‘T¨wäsÕX-n²ó± ’VFïOdÊYAE˜©PœQå)öSQÏÍY,êÜ" ¦fµ3‰cS:@aµ@¾ïPçÑFiM=çV.°%çRÙÆß·š9ŠïE_)€s^•f§'Áö?¯GÎ/P˜- w=Ë·uVzä¥c¿‹4¼tŽyáì,hª—á¼HÓ£ÉʾqßIå …£º2<.dù9¸œ7 |űãßA"œÕ»‹€ÔæŒ(ÜÆ=…']+Ú߃ÃËi 5œèã·6kx§CÆÑ]FXj½±äɦu¦zÍSž|›<ÊkrÜ5͉×H­I­H÷Q¢"\”˜Æöe9&|¦háÒ”uª‰[¹–Ø#ÁµWÝ4•&sÏègf¾Ãtc ‚¹ ¯¹™ð×z·µ OúÙIÐK~zû·ïõ Ó¥Ób£ØÑn¨®+Œä…3*P ÇÔ^ºÐ 戫qX6Ëç¶P܉°™™›N¦uçGÏCh*h³‚¡)"ŸbX¡¡ª+ƒ\ãtQ4Õ~ÄÆŽ8‰ Ò‚#´+ º%Tš9¼VR+Œ¸V²¤4CÏiKίúöÔ1L["‚è‹×‹rEK >ŠžP¨v‹gbϤ›É§—’ZirH!eœŸöðõïc—ÕþEf½v©X<žß«ûVA ”Ëã‰èX‰o/¤|ì^!¹1—›š^ðm/ÍH´0è•e®I3_,ýÛƒ}9 psƒa;¿qÈHn)=¨(í² ™n™HÓƒdé`«·|§®—L*".2×ûï`&¿®Õe>ªÐãÞF´µê‰lÑ“#ó SÁŒ5‡‰æ×PÚ7båªÒdµ¹ÊûŽ@,MÜî²FÏ¡ÏP~Î{íÖ#¶²>¯)æ­ˆ÷â˜Ä¯¢ÉŸ.ù,å9òýsK^}6÷=ŽÖµ»VçÎOéA¼SN6/3V5o…Å2«7mq>ªþi×Û˜¶Ù{-@M„(Ѱu{‹¹‹Æ\·º6·=öÛØ$“Õ¶s<`œ·Èx™È4Ó‚æ.3*·8M@×0§Õ¾½KœÕ·F-1f›Ÿœ-+ù¨ð{QEkõ˜Ð‰?“êâH€² ¡×›Öž¢/Dt)š}Ü“o\ÓžÊÕÖÎC‚è co©ðÒ®#R§AÒf?ëÑ ®Ãdù¶¹°]"½þ³r÷s.,¹‹;Þƒ2"|Ödæ+V¿ Áó”Œäºˆ0£ç¼3¥éU2VÝJ v²ý`t=zß5Ì„²ûŸ´ ¦PoL¤Q£T¿.‘¿á…À*ñøpvò"²ðÆÍˆÜÃDHMêc‰á„å“MϘPÏIÍë´ Pݨ<„ò?À¤“"Èû·¿6錆–çÁ0ä° ‚=Vxð tËÍ–º»øÎ‚ƒ:YúHˆ‡Õe© 9‰µ¾ðâ\ dk!=rÀù˜SViú¯sk–ZZ.g!Ë÷XM3¡'Y2eM2á»L°rr:ÜñÓ&áBÀD[­¦ •™Ð4ÍS9Ä”ÏLz˜íV^ÙüÇÎGÆŠJ!ǰŽH;Šªn‡#“ú'¡>Úøn^ ?œÇŽýäà÷Žv0~=Šî{?CñàÔˆNê¥ÁsæDóB"–D»š9àî¶«ûég†ÒšŸÐ-cÐÜ£yì[¼ aL1Ä$kîrœÂ ¯.óKEŒŸ]a-U$¨;g¾úlÌì•[£±¹ Í:†ÿå9/¾F©ŸŒÁ:ïKG= Û?r"æÃ¸©`füE&‡%¢ÎCq4«dçŸ@ˆ*©[sœcÙ·üÞ†Júï“>;¸”IÄ —Ĭ2%Èœ™¾®àFõÞCcHÂGÅš¤Úf ÌE*tóœ!Ës8__"¯LQ"Á+ÙUF´¡Á_šŠªÓϬu¯Â¬77ûцÓ³E–Ì܇ë Í-8æÄžÓC ‚ü¶÷SäꫦSáØ!<IJ«¯ûªèò¶´aÆ\b@¦'˜Íuu$Äqë©EÆ eƒÖúZÐä³p^ÔïÖ¨H­ „›¿V—b6㾂Yµ^¼Z 3`AR‘ÚÀg ŸÇ«úga‚»U"¢Ýc. Ô¹rOGq„š¤¦gƒïã2ñ“;WL=— €¸µà]× „Èé íÕƒ7  ÕkÖhÎ;6™‹ª×.™3ÚK:Íd…‹.™øZΓ¿&¿8áiÑ`#£Mb‰ƒü«ÞéÚÊôsDã#JŸ»z»^—^ÃÞÑÌj­¥ÓaªUÃsÚÐÞ¹ 5n@< ¦Ã¶Pqå]{«pk¦ó$ý>ɸi G„,Ômú¯u¿€ùËÑé9ÜÒê«ãiü¥>nÀ èà‹¾Xˆ·ÓV»p·‰Óiã}ˆìU˜VF£…Üà…çž Ž~žØgDÞºëÐ$Uxh›™FTw϶þ½ûWƒØ5BJrksÈü¹5¬qúi`_ÙŸ ñ${¹ÚvéPT$Ï]«oqD`ÒcuùÄâ>ô_kFÁ zÚ—ŠZ”(çÖ}˜5ôIü㯙ŸÕÿ Ö6bUËÂÌ]º- Ç‘^Uç-ˆ ^<Ím¼´1R6Ý^Ú?Öž˜aß‚O'%üã«£»N20ÁÕ¼Aç!À%:áŸc5Ý©Ôó§ŸlhñA» Ç1‹F_tlÃW’"Í™9ï~ƒÓD} ÒÍ¢û >(µ1ï2F{T¢$tHBå׃ÂÀ?ŠŠ !bVŒ‰Ì5æ{:šàý_‡,ÔýIÍ{)HyŸVëž.]&§þºÝÖf×GoÏ~Âç—ű…—È–_rj.s7B©<>C‹}‘,Tv¾\êâpÑ쿬¸N¤}ªœŸ_9§¦‹#ûÝrlûd¸ÈŠÚÛpQ+Ä-£–ÄT¡$Õ™ˆ½ûw¹Sç1ƒß.~w½r£AõˆÜ¡uÌá¥ä3É1 >š Zgz@nÏÇLm–d Ãåð÷Ø>Šá !ÔÑ'×0p ;‰Ì6|ÔN&ë tÙ5·=‰}Õà,ÞÕ%ÕkÕª,²€öкŠ^á6­Ý“伜E¤i„J ³by)•ì4fô-zû:( #µ5ÅuÒwñ^•çm«{ÄwJêBO¼£¯qþ Òkß;Óm+â<ÁŽC¹´˜x¤FL¸¥‘ŽVùÏòûq76ì(½ÝY…æzÍË–]5YsÈzùò{¶ç'Pïy­³~Àz´‹‡–fóh.^¥òÉ'W‚/3úïòb}¶-w†CæßK—ŽD˜=þÙr|œ¤"³:^X(‚A5y÷3~í3ó³äÒ£[oœvá0.~â÷ÂŽG­–+ÙªÜÛœ oÛs¶3+Bû|Jà€R„¼Q|IKVQ-8ß.?<øZ 7‡,cm²6omÌq¯¾þÀK§ê—èê}9Ž3?Vt~›‘¡û÷=ñx,w[ϗƉØ:É}¿C¨Þ¹S1’ψÉÌÝT!ç]$‹‚Ä-64]ï½n7XåBzåÑL×?JmŽÆÛæ ò’3ÃP@æÏ;xu)€ }­tú¦-]õ¥…5'qÔ uJº6¡œ9i„Sžøh·F=u¡ÂÈÌzJÌàm´>¡dmiÆ÷"LõX§$áà»±HÂ=’×·.$K#(ìû=:ž· sc›˜ý¸„áâÕ¢cƬ‘È‹A¥Ëå!§gÔþjÁùÂõëpyÙ»s3mÍù‹ý¤·ÜÓeg%j Am߯§¡15îÑññÐUÐÃZ"ÌÒoC-êDˆF]ߺ-—½åt|•mnãRìß=±˜a@¥Ié;„Ý ì{4¦àJƒÈ/DÇH"ÄOF#{XvˆJÇqåë­‚º‰yôÝ {€ÜDNŇ²÷¹Ž‡èÆÅÞZÛdïQ{)|ÇEEbµÞvUîŸX(èM”žÚäþ¾(ƒÂ?_ôô™#Ó·ÿbG:[{‡÷¡~Ä>Æ#ͬS}L“©:3Ââ #T ¸Çâ—·Î?†¦ ìº|dÑk85&¡Ù•%:†¨¼õ¨¤µ>)íwö!݉V„TÆÌê²(ÄðOqù¥¥LÜ›^i.á—½~­¸ šxÔúâ¦Üã©ËOEÝb 'Ù›°¶ûâ£äU;±¯°Ï a.°ˆ3BÒqË0¡±€CÑÇ^9ÓÌã‚Ó>“¾6ûæù|‰KÿÈqÂÁÝÈ|>ÍÒZ|'h¹ñE¦`ήªš–ûºª/~bYÈâ%˜Þ1kÝ`í À8iôbüüÜ!ÝMÞ=6ÛË ¼6ÍûLÌÐF¥ËD’ФºœÛ^ÎIB0sˆ¯°a_‹‹k¯jÿ®<úCWxåkQ¦,Ûúf <Œv®û/)ü†YÛ/ö´hôöUÌÐÙ!RºZf>ò­’Ê'/gŸö—ëêVÞ1£§íÊ[ôQá°A|ý0²í ›Ý@e瘮J´4Éð­ðJ%ÜP‚õ´>.Ò[Rü,¨BÂàÌdg1H< ªº7“ Œœk#Ù °mÊÀ$4ÒP!q N]„šjÞ±dЀTæM"A¤Rlª7õ RÝ!’sq¬‚©°UMÕh ®"òTU³ c©£¡` ‘8ýε1›Ï=Ýc’I®s¢å!ˆïíš0@”ÆÍãÆˆ y8tÀWd!Ÿ[}”3Ù¸Vãó" R@g„D’ŽyQý†÷÷Úw¸?º‹CœÂ~—¯¿Ll¥æJètÉ»2y%„M*ÓèH˜ ¾Ÿ?ÔdÇß,èfCYØžÔâ1Èž»5L"H¥dEïõùús2,&ü‰‹L0u6.~5‚½&†“9­¦ç>$•"y>vuçö3w6.š4U£['jH3€þ?A¥Ü0_VR#•[„UAñk2Ä÷ôûTÓ²”i;¹;¶§ »Ñ]¤áƇ¹]¾„ð| ­W´-²„&%LE³®`û9G5•â}/UQiŒ²Éé#k ›šeHµàwã~í̘Èâ’™öê“a5mÚE£hÉ8®* Õ-¹5Ää×|è‚àH•{q¹]6-µs9–ë¨"®`¥KÚÆ¯0Óp¥9ö9jS1lBM ® èbQêÓa%Ûkõ¨õLCu*7ËËS3-ø$Yò.€iNü:V8kQõ+"áÚNòol·6œcÃÏWÃVþö{øwäf*vá^þvÅ=N]>Ñ ç“¶uÞËæ ]“½FÁŠö;Ô`¯8|òW~V(E;¤|ÏÙœbSj¨* ¢b!‘€_Á3Ȇ£ú•o "ožøH(šzoÌ©\¤5¸gb‚HÿÏ’LæÑƒÅÖSÕ7íœöX’(µxñSJ ùô¿ô­ÖŸêÕÛ—ÆÒå纤XDð›öª3Ô ˆ©-p…I—²Î tÔÏì¤!aEÍÆvÆöuÔ÷)ã¦áàòß͈žÆ€*ºÁëçÆ44#Æ22÷›ÉANVèÚwZJ!gçØÍüÚ­•µ—B§xÆñJNÜ"«ÓŽÇµr&x&¦å+gXÍçDW~xóö¨æ3®vyo ªø7,ì‡coŸß|{µš%4/FI}QkÿîªήêÁb@Î5¨yÔûꦇw?ø«Ò×âœâ•Tî¶=[* ?Yƒp¤jL®;€³èT4Äç‘wÛu&O°ˆ@Ä•ß[ëU‰æê~•ÌÕGå·:+s–ì¢}à'ZÔbM2O´´3ŒdZŒ¾MƒÁ_@0ÐZô¤ÖñE{£ªûF…¼ô·3 DÏÆlÕÖ–T¡ßrlú»•׌NŠ-ˆbAÞÈlè¼Z«Z“@ý`ÿ'è²yjäNsLóa=76D.³¡8À¸ Ó‘H<¥*€ÔЇ½T·)çäâî`TPnæ>›¦¿XjÉ2n¶ÍõosÀ„ü×Ç;£rµjdwtQ2¡ÕÓ_ß{À÷¥¢¶9N_~`T"Öq¸„ev9ö\ž¢µ£ðäˆd¥ïÈc–^@` ÓÉü­àþ!âh.BLݲ97Û -D±¾GjQß‹<¨õEhT1ÛÜ­Á£þOA7MA”é¶ ¸öÓP‹ºAgÓ;IxÏ¡M>1…³'Ýw¾%’ý4™3“w“ßÏÌÒ[jõ¤²åfK*Ú©$¬y}VU¥ÜKÔµŒ;æ…OiË8˜× è6g¢E@ÃLÎZî$ÒÌzÅáÜ‚NÀ¹ïyg®ØÓÏ]å³ìž8šã¬øi·X07daõÆù;>%_·b Îå OV7?æ!·é’‘~ú géN~ùuwܾ¶ â{ê¡Á)ç.aë/$_¶óïÒ'SŠô´ºQ|¯Š„¸†Å±bSŠ.XøÂ{ &i\MaçrBcN ²ÇBÒ#qGüʸDÑÒ”šÉ=ÚòSß¾ÖjuôÐŒ†°Àkß# ;#ÏN›’5dêTn™ËéÙ…¯-µ¡*uežã®íB‰o)s·ÅrCû›"pŽîcóHèmè‚Mü%õ R ßQ`YÊC`ÀêtÇNô~¡ê?¡™hp9or„ËbxÇ)ÝVŽ© Òá6·¥ÚD„UÜ¥*áZYí/Ó8°ê¬Ä •ÜØ(2ôÔé4¼zúÐcU£PƒtÇý²OáxnëBL '@¥)íÊNUØ'X¦Eª<\Õ²DÃ"×Rˆ{¹EúØCy§5;pGOqBr\}s]²õÕdÅ•¾2( öÓM‰›séYQmôÛ“šâ}MÒÑL(›ß…=ÿJý_5Žê˜Çõ³ÙÎØ©¤ŽêwÁ§FIæš«¼¢›û´º)1…&_¦ § Öo‡8Å6Îÿ‚¹— Píµ¾žÉ¼\hBãšø³[+´PŸlÙŒú‰ºŽ¬™9SMapç|ܱÎùUÒ·[â4˜³âÂ\ʺŸìÁa«m;§{ÙÉÇßè/áFzIÇÝ-"V DS¬ºn‚æ!0œÙ2IGŸ'ft!ü»4ð 1ïµè7à.% ýyF¹TŒÓ‡Žƒž f†‡éæCNÁ%¦Å¦…ñ¿*óY·†¨ö?0hW|:z½A'Úu3™àE˜íð¯0—ZB]Ì´‘øU#ìFÉ=#ÑBbØ.ÕH'6ëbs¥‰¶‹çß3Ø †9–þd8G~x—äĦ›Ú¿ ©™ RJÀQtë˜75€ábP?ºº‚»GÑ+¾P—YP"(®§ò_7i,Úã”±™¿•w’ ™æJܳ ß2ÍÜ‚ 6µeòi¼ 9Ú“Ìä]S>Ë"iQï&ï[oޏp«FMðøEl¬åˆŒU—ž.™™-WØnR\|M¤k4Bx nbjul¼äNX÷׎ÞJ”Žk+|©0žìÞ÷Ýl{N£åαUõGnrC”P®tè=l½-OTÿz!p鬸LLf¦ ê[vÁ¼¾S?Üvz5?Mâk‚w‰Aè ¼ÌËpOvÜ. kÙÍ;+³ƒ^¡7e$sj¬úù½å®•è4'ÕC²ÒºÑ'õüà ´üEC±’¼wÝ[Ї—žvkcU(]ϨòÝò4Ö47 Ð2sZ#ǤæúëÄ‘ÌCÍžjP\«X³$ÐtL {rÕÁq’˜õÑWYû êÁ—ÏíÝÂZ#~A¹aq8°ìVŽTU÷ç››Ì3µ›md÷)!b”úܵcC)¬ë/OÞv?®s†”ä‰%Š©œ>™w?q;–mJ[ŸYPu÷AÔݰnËì[9„$ #}×ÃæÔ zÇ èQC¡×Ä:eí:C¡ 9˜Ç¥½™ÙVj <è@1Cñj¹!šÆls# ǯEÃm9›X ×D°ó¢V4´ïÒ?„œÑ2åÝ×â°ëŸ'ª)Íš°TÏIm$ò£|ÇE\TŽŒ‡_L¯º˜ù Ñ`ÛÄ&YË…Qk½`â#ŠŸ#ä©qêPMåFfõ ÙÏ«ÎÊ‹ˆ©cT¾‹2$w7¨|Ý¡<8ùßH3Þò)¿ÌFQ[„·wÞÏW:ªÝ‚ñU¤-¾>“úþ-¥6@>Ž/7ˆ|±dzˆ˜Ã`“O‰\äßNdº»ºñ3¾øn0‡o&$›îpéMÏŸ"ˆ*žŽE–ÔS§ª§Qß+1öø§7íYªq‚ʥЙؘ¡¦,CAfs3 »”ìóšÛp¡‰C4¨ ÅªSN#ÓË À$XÔ€Q$3 µM÷\fbþ Ç'`Ù  ñÆ@‚Ȥ%'³Qfê8g1¹¢Æ—RAèaMˆS¬€A®`z™µÌ‹£ Ì]Eàò“êD[Ò Òß\TZùõAÅ‚F ¢CN[’°fâ)šþ6%êmà÷a/]÷BÝ| =IŒÝç±èƇä‡YÖÃ{@˜(ZI¦1»Å[$ÂD‚˜ÍËc,Nv¿.ú\Äèæñ®éq€ *Ö¤dpS t]"÷õƒGâõˆM(ïÒLšVEî½*/j@û …º(”Øg…qWGpüìk„,ñ¹4¤üûsÑÌ1Pétñ-³_.q½¤ÉÐT¢æŠÑÝ~|mŒg3[’˜¥£1{kIÇáÜFåMxZç’ðÂr‰Ö 'k”ž-PÀAó1k Âõ˜K…©1-"“d<*6dWËW»ÜÔMüàâáTY†”T“/|‚ðÆgÈ ,C¬ZZèRÔO~A0)bF›Q¢MíçåÚO{À™r†ùÚGÅÝž3ý[‡˜V †ÂGÓké¸`M‡ËcfZ?=ú”Zåzû`­ã«{p «Ë ¯f­Z¬®@Ü"§‡8_Òýãì×¾Õãý¿¨´é ^±ŸùægQøBvö ž Ü5\C‘:hF…{»t—D˜`BXÝÄŒ4CÙÈ® W’í\ÀÓq´ž[CÊ´«2$Jžµ¥;Ö©Zäâ·ÿG •‡Ÿîí¨xÂçîÝmŽ(œ»r“ƒþËô磖¤©¦h×íµI¿ó&§ôJN™R·7Ç!wŒô{ÔU0èþŠÎ…Ø(u[DRÓ@˜A€9«¿ò*©þš¤Út¾uûŸ§‚y‘Ê(ïÁá}Bãxò!@šfîh~èæ£š¢A.úGåðåO§Ö§ù`~Øá:ºA)“J_CçðB>Ø!j«¸ö'¢–Qǘ(£zê15(ÝbnB!ÓÚB!B½žýêº:¹ç¢Ém@%¨~ÙÛ–‚ ›¾mÐúËɃ(ú›€îj°Ij\½°°&Ã_Q&]RñeͫϠÚú¼Ã¥¯BŒ±75Î6GÌ-afä1Yã‹ b{EA"΄˜oZú¬š7‘ÎSlfºªžÏõ†—r3è‚ŨmÁð™å0"ZÃE”V]ù‡…F¸“ÿí[8,ÿ3ÑÂy\@¾™^ì 1þ3è•"¿J{ßÀ¬³çÏýÅ®¯ö±v¨µ*ƒ5iÕ[+ÒLÓA™Y¡ 6¶¢ÓóJv['Ž¡›Ðö% :ÊÚGžûÍ'969XùApÙõã^(@MÔSd0Ð-Òºêû³ÀGÁdbí¾âÈÆŒ±AKKY‰ªtn­99#ØÐùåÁéªöî¹ymåÏ?ÅS9§ŸŽB1hÈŒ^å+Ï{wòºØÑ•mé–¼È š¥²äZ ÄS|&Bœv©Ì6pœo"J^ÚçpüE–’5Ž.½7r¿šÎgJ‡Á}Åüi-IJeë” ±,dñÁŒ€MªÈÌ Äî„.ÖÞ7.ÁÌÚ\Ù‰«Ï)EÞ´›TùUC[ôôøs.—h¾ëµöä­³%0 о¾k„³¥óP³û2PgüË31ÓÈkÏÁ«ù¡5ñ$ÈÍô.¥W–¦ù3Ø ^@ò½¸´ùAJ̼Èím§V{1éçËÛ^+È“hs÷/ ob ‰ºš™ô@ž¥ ½õ17`üowú‰¼z?:MË+ÌHÅêk›í~øúËÃ}íì#iàÄb>n·ùœ;–&Ý~ +ùG!íã™J®~E.á°tà‰…¥>viÌlÙÂðn†á—ÏNÝyÿ¨'i_@¯£<çס9rºý¢Rê)²+¸G«ÌUÛ@^;@O1¯# ýuäá1gç\ˆ„{ýô†é”Çõü>öðÀËš8ZQÂ)/j³Û#-¾}!ÁÍ*Ç\l nF½{2‘„^óð#\)©Fœú%Ú@ÉÈ-Ï‚ejŽéáã¶Œk½—Ú:b¹gó~®Qæw²´r7ØÖç’w²öߥä2K¦FÛþËêÙ ¢PuØ„Çÿ0âŽý+ø´Â1ﳷϳÙ™óš|Ê\\ åééÓÏá">]ÏßÍ Ù™Œò£È/3÷Oµóqp‡à=EìëÛQM¼Nß„×ÄZÝ<ó² £ÄþV|Ï>w8MŸ`'nj-‹qí¯ƒ†½_êÌø$3íhþa´8VÐä`úm×ê/,“te-!!ê[>&äì6ÌÅaØžùêí.Ÿ¾_ûì„ ÚQ»xGëçT¼9h2q™&¤IP æá ¾œç ù6’åMIͽ°”kÎ~yb/°•ÍÓG$ËÑu¶UZFÕÛP·ÐczN£ƒ3‚}³úcJÉ&ZìâÈJuÆX@yü·éÐC/,Ú‹ùÙË”¤F¤ÁÒä{P‡=çleNáÝ·zLÈn.À‡¥ÖÍ^ï;ѧ€—ßl]ÁyPP·{æ,Ì[«)+¨% ·ÙŠÏ»_×=qȹ…eY2{Vªv(ñ˜¿@c:\gÉ"Ó£K–ç›þ zcÖê+*»0 gßÙjúc^¢´«&TIŽ8ËfrùòÑúëï_QåÚõ'>Sàʇx6Ç'¾Ô/T˜gl> w\RQ ·™¢&%t;‘q›š4ŠäÈ`˜a—dÚcŒÃ ‚®)ªRÜK–ËÌê:9ï’²`ðöè6N5§bSZ9[ŠDaÓ&2C@×Õ€P kõ‰¦ºJŒ?‘^[²ír Ý*Ù9<\ Ð,•S$eò×2žâáEzö¾á͇ô™„úBœÎ<Ç&H2ëÏv¿b(;›žáiØCµ%…ðÔ­9Huëy`†87T‘ˆ ŒwQã¿f€²º%A €ò´¼ ~lÔy HÌ4tÅð´#þ>˸ÁO:dÚ®š(ÑšÜG¶à5gÓϡ糡HªëÏ~”K§cY2ÛseõÜv‘ÆI¾îÊPHÐ\DTŠÐ™7®Þ´ã…îÒÐ6dELÀVÜ1ÈFj³]¨+(Ê œrKCyüþ:#nšî´O–×lj{ñ¸0l‰Äºìø~èqK#2R‹Àâ…+ði3oQ¥Æ0S›d¢÷z-tÍ»}Ox“ÿ­É)tæE‡·^¼cè÷Ž—:S±X”gÎãß¡D ÃÖ uÁ’×I)n í*.!è<Õ£»»W&ãR|‡æ”u´énàG!t‹O(Ë>‰—ñº5S³‡^Þƒvpï¥ÐnI5î7à«68‹£KTF¦Ã"´Ï¯…$¶ñèn* M1XeD !§`‚Sxë–•öÔRÛj“¼QVè‰S«R*b ÕQ¤¤öOF˜/2¡×‘ç½òÄœêÄTçU&m -¢¬ŸéD&&í¬èl ‹ÑÅ\a(³×®çpà\_6—ËSØœu*¢~ݾŠW_Zw `qÞÞ¡õeRÒOÂQH Ï…«ì+ÅÑé†òòaKÏ}ÍÐBüdNÐoʤ7<ó&]×xð€€ò×(‘†»p.T×8/<;oÕ¨#Ãç,KI r‘Þ 1U“™Æb17a ƒ%ÿµQ¡E* ]Ɖ&A.ŒtT½#íèÕ¯+Ýg×rBQ6­Ë¢5È襌÷¢ÔÐ1ÙÂðå ÒV¤éænKh·úf¦”º»¬X¦‰/}nr… N&áŸ÷ ÌegÄJSßH!ˆ!‘ÎSâÜsÅ4VŠñ)Tè9БºE6HR({(‚´9ÓéËi®ÍâmµÕ•¨Þ@2Öˈ\Òèš–Äz]4@%Т–K É7 _ð ¶é›e¯_:Œq½As$Bïà}ÇÉá\Oì•:¡gûWå_æå* NBß¹t*bóÈ£«ï’†0” 7]Êãû›/g<°¬*°§3îmÝ bâ@m©ÑÓ)#ÿ3È”|qŽž7ZµeÖµ#œãAó¡õ´Ù$P³sb‚åöòšDf çÏõÅ:¨GHÉÅö4ÆÑXlÏ‚u²hË…^ÄL·?à ßr÷¶Ø…«¿¶Wð$OyÉ uO}7f‘‘,³Å÷¢'`’6x–V;RÉVìœö±1&“5ÛVÅOºÁ+Ou‡t ˜V♳84n c[;¸Í_lHâ)ÃÍu-íDZ.lø‘nt¼éõíÖÀÀ´ —ØFþÔÔÞàaÊÿâFÃUç™|ž>–Ë_9…·M»±Õ°­ÔZééÐM‹]'¾”#³\·æ¤ç"gÞÓsbbÌcÃÏã@ì)Ü“'¹a *i¡p`þ¿9s»Fm¿Ä­£iÎ&Æn7eJÃ;¶Y¶ß=X˰ŒÚY†X4³ÑÃÕó]é+æñÎĘ…ªÜŽsT©ðXE «YRF…bfS©î»0õ_ÕÒÚí‘JUdhÅY Î×`·=bÑkºì¹•¤gÀòy{;%W¤Î®-Ýfžl•=  x³fˆ~}ª­‡çpæ*xâ 1»R,zÊVòþ‰ q"òT·3e‡OI¾û!€†!ä9Ÿ«€Rlùo•ÿ`çíØôìí,‡´íëšïãÉCßÙG&# ÕˤÃlºú¹>×4`‰J4ª<ÚñcZŒûò —æN籆ëlûûX —ÄçhéÀ7¦ë¹ëY¨bü¸ÄŽ-Ž8é) ³'¬Õ–¦û5Ñ h³Ÿ˜€·%‹yK׬š•¼eÚb@5ÒH]®íIöÓTÝH™Õ®‰¦÷ép”©Šq™á1°È¹ÝèHµ"î{e+Ç÷©Ÿfw6—b—®óÜ$þ:N‚Þñ ¸4°‘R06+B.©¥-©^yhKgi÷cIÉî„蜛Ìg–1dÿ8Ù+"TyÔ/Ô6ºH°]J‰–CµR@*¤ú<ÒrUò 7Í´FùßÕg àsëÆi«bV-ëÕ H•5£–¾°ºÜ‘7(—¨>»´â ~wÞéã:ÀôÅ¢™4ÔK( _…Šë8ëZ]%Lh( €Áp› ~“šÝ³ûµ¶í¨7yöiAEe{æM7"uaCBˆ{@·9 ø_HlÉ=óxÌp=¤¬ïj6Ç…d´gxa¹ã7’qµ âšÜMisÔ€K(³\½nX ¤Ï‘ó'2ð¦[Xg„„üÇq-ÇBǃ½2»‰+œîm¦DL#h–G޾Áu—8(6öÍ×Ñw&õ#«RÃÉ Ë(´´:̹GS½:dJ[#ЇŠÇä|óÏ8[§ ÄÆH‡á“oABWÛ(ž˜¨±ÒpK¥ò'VczÞ‰s#Ïo‘ƒ‹Z<ˆ?’[`ñGüo AÏŠeÜ-éþ#gŠ}ãå«o2e5‚°Ùù¡~ž½úx¿S$—%ÛvX ÉZ V×ß}·ì{R÷ݬÎ@!Ò1ÆšlH™#qæ óýò™èþ†£TNInÛezzêö!:gåš-µ«õ8Óúi~Rné #0ìÈפŒH\Ǩ¦’¿“@”ƒ«g ñ›:²Ñ¶%Fq/Œá{â •A] 5.Çn®¾µdûNœÀxçÖò=sɇ5ܨZê‘ö,×ðÀ±Êñ ­L`§<ˆ˜*ü†X„AqÎÓƒ<^+g*¦U˜áñ£æE€j:H4ä鉅ð­ƒ$Ç].³ô‹EÊ«¦zêŒìR$¾~œ¦H·ƒ×}ȓԿÏ&‰è>HA'N€rqvN ø9±iNY8˺$曤\˵-°m{À ó¡l^dû’“L¿=ô+XjvËÃ/ùë4°tHxyl#ÀÙ+Dš„”‘ÖÛ³|\ TŽèo¦œìVR4ÊçG·á½%”6a~Ù}ðñ÷7öÏn¦g°›n¿6åtò'Œyd™zWôÿÈ®‡Žé)‰Ž¾ÜÅ!ϳ<õ¥þáa±iïXD$A×uN©wLç`Jª®à¸þ½JZ£Îˆe—.j/dƒ¹ÞÑ¿ÖåÜ›úŸÉÖhÊÎDŠÎ²p97éÿÉ@S½[ž£ùšœe.‡ÕŒ:JHëu¸ß>E5@‰ž~o»°Y —ÂQ˜ö±ö)†?Ý¥jÁX‰J,QÍyÌŸ¾á¥­’ žJ–C8Mý¨ÁìÆœÎvô3ÞP ßBîà“*R%eñ3ô¾@ýÔk¢–â©àà/ÞCŠâÍ%‰iîÞ¥! 9h’ッ¤oÌØ•PÏ`õÜþÓNÛ›ô&µ9É{ÈÉ(åUr1`”w&vf ©ƒüÒ ¶„ a É_?ÂÔSâCBžÙ†)®‚=ÝÓàChäøÇ[eÔ`"D/…æ® *ùÜ£õýËùǵGôEè\ˆñS*E+âf¡\ûÿ»*m*³²ŸçóѶZ§º_ ’ó¡,\ ÎÈ`å¿hÕÂØÄ…Ñ®c#eû'jÓCPS|ÝZȹl^ÇZIãc™øOqœBB¬ªD?N ,uÅ!À3F¼ËïZ†·äèY¤¤ðO³³CðýõÓKx¢áßÿÄûðÓ<­Ÿ\‚³„7Ô€B­}ùÚëre²ŠÔHÏÝ‚â:=MÖÎ UÂñv=ÓÛ(·QFÒeT¹Ñt[æ>„¹Q+¼vý khœ¿UÆh7æf¨3†…ò!¢TãË5o …"ö(öÃ|"Q‡ (‹™<¬½”Þ‰µj EôG·Ê™O—¼ÄÖÕôNL}m%‹Ú¥/ 28á!:ðú ¼½*î%ñ!«:FCF—QQ¡Ø©ïÌž’ø_¯–Y‚¼¯ ÷èÕÅGƒ¨ÑŞŬîº(Ùô:|3Ú}á£äÓ¥­– ªú †éÌKð>j–½ÀôÚÉǦíé²’ÎÄŒMÂŽÓuI€ôš"˜"‚Ðöж[N®ïÄœå"±>åºRœUcYâÞeå³ò‹ÝíþUŒ%"¾rµ:{q‰¤ï]sfÀåšH®»ì hmIÀË…Æ ¥ãiÐÈmÍ™´ãXL ´_ÒIjcå÷>ï_#Óu‹›4ž Ê0F1õQk8Ïø®û¨ÒëÛÕù¯h‹8u¶ŠŒEâÒOK¬¹%éÄ@ã߇ͧŠ"-n†~w=fÅ0 ~F6û2Í=OøV Cµšäá°ÍttQXŒmn=÷ßR­Ã™÷£µnJT£yôŽÖs2G—,¼+Dü £~Wt£)Vî"´—=.”ÎÔ}‚ú&zÏ¡Hø’jæïdø6üÈ7Àª¡Xü‰À_g ‚Ü4ª[Ø}c)Öƒ6e@3^Ù*-d9-èÉ=ÂD¦Aé 7ÎÑnÚà„Š.Ø0òö{¢UQëLJ$EZq-–óX+¹º^<ð2Tô¥åòòvß òìÐÿ¦^RÍ„C€ ÈÎòÆùeEãéÀnýºH¿øÂóg:^9\;SËÐîGÙKn÷Œðì.†¸8|½û" pµëu`=˜Àľè–:ª@ž/¦Ñôì²údW4£˜amÎ&]ºÖ̬«ÄFéë®eçæ²ž„š·­ú­}y0í$¾ýÁÆ yI½e?¸À ‹ñÐá‹OçãLÑÀÂÔ†6ø#‰€ìÇ~7fÝv;Ì£ c*4Ç(%ªˆIK*…*ìÊ•A މ;ßÇ*Áœműôæ^Ë¥´Fà ¼e¨\óÀìs÷m“šv^ÆFw¹II¶#@>Ý™ëæŸú?tý$lBô»]æþütЉF—p)dFBYfÃÆ¶i¸d‰­ šŒæäÀl–Ù¥^-aÑ}›‘Ó–‚IMM‹1.–lÆe1"ñL-.¸žŒÚ¯Ü¤xëò6¤/—¢Õ_X7Ý Î¥¸ëmy\<¹rq Cf»¨¦ÜÞ,[‘\$áîÃ*²8IÝd"M.³LKÃË6lÆn‹SèÛÉøZ¯‡/¢B‡×yE ”” M}¶Ú‹šÂ¶ï׊Ãý×ý•‰Vœ Ë[ᓪ$ŒY:—‡Ê²F¡Ÿ»L;6²Ç®sôGmÑö/ˆq«:<âˆ>V‚¤z.>/=©öŽÕH‡  –á#lÉ,k2ɼ”(Ýõ»ÚÑNË Ë|är©×KTÇö¬ß–œ 5=<Þ}1Ðùd\tKpèt%DÎE-ÁÓ8lƒjçæ¢¡-AZ2¥!l¹ *]uqk’ðs´ Aj°ÀÕbàµÿÙ9JY­¾Y#,3õÔ@ÐÜJP£·§ØQ„6õ‡Ø@›˜Ä Áº5'?,®dIi>]…d(×_NרB½t0p~??¸åoÍŸYqâSe9à[¡d»!Ë­VÄd׋ CÃZÿñ’ oœ×j Èðöñ•õ)?nÇ0iHo…:;¾¥¿1Ù¼+dË×ñtšÂ#…a>šBé Ä›} ”àn·Ò]3È4!£¥nž ê­tj‡¼6#IY[ü²SäÔÙE1ƒ³gÑRá©<ÜZËq˳VˆÍXžZ¾ÑAY ¤Àß Y DÝFÊ:Þp»‰kðôÝáê±íBéX=²9*) 5ÈÄh}ßèT}æù§{‘øÚˆ`M0ìÕÍæàÛì¹âÌ@D&Ôe”‡†"qHÉ’üpzeÐçð&h$S{¶Ë£í *nÁlÜ u£DÀIà5Fc«QÒâgk™å”¢Ëõc ­ð«¤R÷ ' Dó2R‚#’}[‡$jPxë]’óÖ¼ ã·¥’‡BDý}*²ìº…Å&¼Úh]êתþA%&­Âoè‡ò‰Õé_U—«‘=¬EöÙÃEà’@ à@ÝWm…,"zmÈB[„1¢ÂuYÀ†fi‘qæ$­ªðdñ¤|ä¦Tz‡–Ó þ7_L¹Á7¶†¯û¡aÉD2(5K.êº)ÅVNïøFàe‘u“È<„„Œý‘†ë^œ‘?'âD1H™lér™(¦1)©«î sgâf"Ã#‹Ø]žQÖÒ%ž™j–`àrn–¨bc@ÑŸf²èPò4½á ˜ì|I©”ƒ7’i3sd3½Þse¿àšC+Ñ…©ÞaÓêQVÞÒe¦£þbHå_+ÜúˆCÛ­s6ìf½XDf€q{… sÊâg›#Ñrª"^‹ÔEªI-—pש¹r<2wÂYO§™wmǺtó:¥ n»oÝÂôæGmž^ȱ'g'Ù|›àð)’-ò¸½G5˜mbþvj°åôû‰ïV‘ƾu®™eV ü7a7&M . Ž€Ïºðg:H¾]<ùæE›Që|ˆŠW”ÍÌò@ÔOžX»ô£X¥q.7Ê~W-@gùŽ­Ñ‰ó+ÿkÉàß]ÈÌ„½5éF©Ó˜ÆÚm/rI9´ ¨`iD¼´R„T‚mÃüC&Ü ág1þ·÷+ûqVyøÏŒò·£L‘oócÍ5UŠ»«Új÷ÛDÆœ;v9-ëç©ÑWÞât:IìÖùÚÞZ@IŒË£åâv—u;˜E/ŒòÁž´í%û¤i-,ÓÞ¶g¸‡ ‡(kQB[eL¬8&òÙš´VhšñÿÍuÑAjM%SÌÀÙõJRŽlX5èÄÌ*…¿³¸®x@™?Nÿ÷lK¥óÚó1”– ˜Rá[8áåsXY—¨Éý>dÿŠF1º¬QdÒ¶biLÏj=ÍíƒÎŠK^‘MRÉÂü«™þ]°í¸Ëk%žÊü¬tÜ5ÐZ 3@¸›æ{vuÓ¾O#]¦ÔÛ„²ø™"Œö_r)²2 ø?%ÈMCÜX*C{DÅGNžXRÎ*’}:•$šC·@G–íÖKLwÞl3Іd”§²<`úCT¶\k[˜pvi;ÑHOŸM{þ£Üø‘&_ØÌ‡ªutËè®d¤ZÝ¢ÌU纠yàùÑÛ–À½ÜKÜtßöc¬ýΤŠGRÑD!vÒü×oo=ùä+›sµm§+@_Ÿ 9öuS{yöpmu>ÓsÙ¡'ìÉ„è[3ö‰?o‘à±ñp:?×k¨>¿Ó¬ÁÏÞ›+ì*ô΄—o}»œ÷ÐwVy³8€‚vžŒ)@Ä^}…ªzz5ØUÏÆè ^úCתñÇ”O¯#¥A¦Ÿ¡‡ŠÝ?b„“X@Gå‡ ¼”GT#(IϦ5qÀå‹oÂä4M.¨@ršÆŸ70‚ €ô£½©¡ ôìÅoµ“ÓÕÏ#·7¨*E™ì°bvžÊ#ó]˜ƒ%تúš­AS€ÁÕÔÀ5ó†EÜ*¶¼u‡Ÿ"ÒiÔÚÇTø©÷ ®·Qwö"H>0GN‹s²b&³ª¶.Š<Œ ^é—«ÌIú^É7°`rÍ»aXÍom\§Ê g¤Î?¼èì‚S“K]k¨·ÖÄë¢!ÀÍh^”ߥFÚF”¢âêºõ¶UÅï*i;ã–—q M¼¹¦Åòõmœ!êò }œ6å€Ö,Ï7¦ÕBÏvRÈ(Гœ$fÐ_ 1îG÷VØSÛ,L•À¢^»Ž_„(Ræ®ë÷(KÅ I× ÉMå"º;à@ Ž¿}ä17wQ©Jd"¸Òyö*£vÆf°QqëòÙ±Ié¾#E³1øÓƒ>=з'46€þn¦"Oøv\Ây#¾Á¿d6è!ÌÆrÌN.]”|=£«<—y¹¼ýIGžýÂǽ:¥.QÏF‡Ã¸”eÆb6Í$C²yµ!MÏ`Ïä¥C¹×íÜ× %‹eä۠᪆+o¡(îÝšÃ9"÷äfÀ߇\À–â1z<+?DkTŽc@”¦ õïk½x.®º³x—HE-žŽTì@«Nl¤1ÛDƒ”o2äªkúJˆ Þ-šRØóc –•»»&æe&£Â¯ÅàÙõRÃKRüµ/ À¬)™ çŒÕ†g«D–Œ6Ý]ó'à¥ßJß¼£ҷݼü0®bdz-²¢n¾­ªLv×^ÙY”ž÷úo¥EùUQOF*"2à¹ÈÒ¥¿»BƒªÒ37åXf0œP1~ƒ¦IÊVN7\(ÅgàT¡<Ø&ö²píP]ú1ÇSjŠR{è  @ò ¸Ñ¼WÅ|·îè¹"ÒÃI{h\“-Šš¹ ã~üèöÃT×®¤“k£]ÖäªG’ߘ ܈@L岡jå §>š…χwvôÏ,ñ.JAv ¨ÏQt>íÝÔDËÛrëÏ…)ÎûȬ$ý¬Oœá³éç ¸¿µý‚ŸRyÔ”’W­Å¼ýýI¹,Ôˆg]¹ÁÙÉ?"ˆ”²¸7&íhºg£«°¯°Ë.nÆ\*\ ãîWKu›È#È=µk´Õsþê¹Qs}À´xu3k?ÄP¨í¿TÖº]1Z•¾é«á™ä÷¾R'Þµ9“ÜÞ3ÔY.$ï(ª‰MÒέ f<ñ!âP©QÚñ™H™ ê8 G®=B6ï¦_>j¨ßÛ„‚c©I$ŽŽ>¢„š7„8TzK´iÄFf Ù‚‡XÈÞ£ž˜r@fˆ-¢O”® ’q牊´Éd3oP„Á@còÕÎYÔ(Z9î*SêôÕ:ƒ”~ƒ}“Š©¯ r]\3o-mý÷‰JSʨò“hýK…úèŒPOÆaÞÊ{Ä{ÝDz´©2++$µù|©ýÚ A=݈JÃÉa7£ʨ3‰(ý[ÐÃ1:=V]‘ž~\rcxÂK¤2€•ÓBw\4ˆO.k`¼üäÓçñõ¡ÊB¼ðOÊ¿/"ŒIÅ 6:×PæÏÞ€üK7ô… ÚÏ®… P)Ì»M·–æöS"À{…ÿ¨¦ÓCÅUæ¡WT(:À èixêÒ>š,¸ópÏHp=B XåYzº„7˜Þ [õº1SOÌBiwE ÁÇÖO¨»:H#'Á-½R¢ä×Ãceº2T¤Êï”@±£½sþ‰SNifíÀ´*dò2-_×F± A6³Ž.±p5¨Íñ£ë›'prÓæÁ{•ÂPdµI<\g3ÍYlÉï¸ÝñÝ¿PTݯPën`¬…žÂTò½$¤ä÷@3™È¥Â‘½ «Hÿ³ö©}N§U+²Gõ¯Žf¥,¢iqËØ¢lòõëÊTI2ÌA‰ÝŒ4YsW–R Ý«¸™ìß=\ÿ¾ó•kÚõø¦`ªK“dZäTqÖûyŽßkĨë!’µÀ¯`Ù›ïLu{­ð ®MªÎ"JÔ“ …»ãb@‹uVàr8‘ñM¼ÃÄ}'½¼ÖÂÌÀ Z{C¦ltwt5³ £tك俞µwD—öhçºKÔAˆ,|¹XŽ”Ç,î3J@­ånI¶6¡>u9  ºIß3ëÛ|bõ xfØÀ&%G:ß[dýŽ#—,·IF'Æ…Að|º’JTL©# ˆz ¤C‚1€†w LJ븬Pk¦êN@à‚ž)¡U;ù‹Ù4|W¶ÊÊšÕò›§Ý~¡óÊ{yT_Lé÷Wj¦î„•5\5‘q“Ú¬FÞhï¬|°çO$èB©< ¤ógDãšʰߦ5Hƒ,,>ÖMû´Nø8=õÆ ¿_»þK7˜®c¼WI%À›~M¹ø¦Ü›=^Ä9Ž_£‘ØýÃ÷•¼Ì¯O9ÃNæ§“£t!î>¿Q7÷K(^°”£õûcžîrø Ù.¯X·Tó»~ïzÑÓQ•¹]¶~1»om’]­×}‰F±‘%íZ6Œ2:î©®¡Èiw/L5BšU‚t–ïJÚ­{˜V´ks‘»K$€ò_o>ãež=¬hEúõÃk¹ê©•A¤n¬Âü!7¤g”ÀÒãÿC½ILw8û¨4næ`îÓ¥WÉqžÇ§ c"Ì8%Óæ·Á(±%…lèá0îùuG¬KÃ>I·ïlqÌ:m‘Í`mefÅð0ˆˆCÀˆ¥‚zÑ«9û¯«Ÿ©Ý^TÐT»éLQ]®›h~¡Y* †ödᩪàõãç7W,Ðì´X ÜAꛌFÀû„Iµ‚“z­Cˆê8´ôvª/ÉÕ俏6^TJHÑ£vbu![¥ø‚/bΙs|Ÿ>ên"³$© FÉÞ]By™ïb}`Ägu¶Å±-±´ù\¼s˜]w²b­ž·‘ÊÛh—G­Ü|üTÏ2Ú¿Dæ&õtׄ€>í—™ v]([*°h+ßvÉG¥«3Ȉ \Úr –DcgäP Ê ºráãD„¶ï]9$þÆf¨½÷0 .˜UŠ*;Ayß½uâ™o¦°fbdV³ÊF–åLÍ~uÏ-Ÿ/ÓÛ‚˜bÚ™o‡$+¿R_0 zãRòÿÕä½~ci¢•D7 ®` lÓ¡±©Núüš:¨¦A<ËÛ†@°¤öK‘¤Ü7ÈÙ§Åtüë2i}³*ª'T‹ÙcA§åY¨/@@gúúß©ÆÜ²T‹•ôœ1ðX'Ty”SBø .R 3`Ÿ$¨»QlG‘t? ÄY*)º¡ JºK-†vhÙ,¹O5ÜT‡€8Ðás‘r«%kñ2æ+ÆbYÒcµç-‚'…°ÁšhhËÙr÷M‰C]–á¨bOCÛÊê8™­åW0ȳ×Û!kÍtûºZâïMµ8ëúkÉS_(Ìy_w%ƒÇåÌÍäå“Uåqï–4C€À˲¤T‚»=œØóf’ækÁÚz3ÞbIä…èá\‘滲—ånFh.;œgÑ6¡†sRdÄá 76ÝÞ̨iþŠÚG˜$¶ÿ«ÝÞÇ^Îü¨î¨çÀ£¥´a¼ r‚DnÔqðç7ˆÙ¨w™˜RêÒùM´y#ª—Úû WêCc­VPh WÉ–€B7Ú‡@CÏåï&ëC*h“¸Ä3ë®-ô_ +”«Õãõ‹}7êÅïhŸž³ÆÉõMW^n„Ež‚øOªÛVQ—à¾úlÜ3¾@¿"öbð\œHt²1(zWÉSÌQµŒi$û×ø)ñßnÿ;ö¡ån&Òàð£ú<  ³âÚô»Ö±Í†7-Có³Â¹`Ù$æ(¾›dHÊþóÍ:6rëu·Ód°D¼·Ï«’´`öè÷5aàɪ÷3e`Ó(Vèz@=Ò‡ÈîãÝW:Ô+Ú$Tº¨%öG¥nd5YMè¨D'(K xM ÄÛ7«Yå½JÃ6%ÌXyúøW¦…G'hFT,fŽMÌëEÃk¿øæc+À y"#­Ï/ê7¿P£‘Ô@[TâGœÎj¥Xä8d=Ñ×ÔÄÚ¯‰ÉðÜ_—@XÐúµ Èx¼5J{JæÕ4É=Ë —‘×¹-ôØž¬ƒ½Jˆ-¿ól³Â,4åç‘›‹¡Œ71[ZZ ˇ>ÄÐöXÍ6™£ XXëd?¹‚óuÒ‰4WÕ±ü`}mÜÀÔµ £ m—›­ß³&H‡‰‚C:x´ã©â'äfîë°îŸWö BÛáížuû½ÐPÑ@ïß½Ìiï’}:" ÐtÌ¥äWNz¸zc23jÖÖó76aå`ÕAvÎr+G/žLßžÇy3‡¶¶ŠTw—b££¶%ÍUk{Œ„²ªJ]¼Oáq“nÉ”r×Îü‚¦WJï¥õsy†þzñGÕ°_Î'T°8ž*Z|á^wcñpŽ"‰Ò¹Mèd)‹Dh²ktÞD&l¿—OgÏnçŒÔÁ÷ +ŒC êZ!#˜¼»> IBP£ÓšSÜæ5ôWPÈ_%]:—²gvQž¦˜ì>@$²Ä5C]‚iwL4œñ¥¥Ä¿rH%°¬šµÖªêœ¹•”Öã×Þý£Hò¸Ä¨Ð$£±bêŽúµÉÁ•åárXª;~ îÐû¤ ú§Ê~óü+Åcõ&aN¾/a!O§Â[²Æf{š{­Ï¼B pÃÖV©Ò~:ýSEÙ†…}l–ÚÐ@%%;1 B†>H(*K‰?’[Y@F 1íÝësÖ¾š0ùçò¶’ÕçkUèÛB­‹€P$Õ@ ——1È þ&qÛì´jÎõõ 6eÞQÙÊA×yúüó#¨‚¡·ÅAµA‡Þ‹û±HÇeaáZV"®åh-êÆmÙÍ)Žn­ÎHj8|×ü…ö %:çÐr ã5ž™ÕªiÔ =Ä`9?Pá¶ž?ÜVŒ}ajë›pRÀ”]ªa(C#Ø[ñ1);¤ªËQœÄ„Gã_ÇÛÕrKW{l»æe(>â'NP÷l;ßnõIUŽR:G·Gñð- _¤ºW¦÷é†]µ&*Ž™!_Sï¯h:-ú»×”ØèYùPèïß³wìò$xéœú ÉÚòÚüùOåÛg’2 e³™Ã>©ä®FŸ¯]nÍßèFZ ؾSÓ=¬|´¸‡>½8òèŒb9Ëéß—51‘ bÁËn¸Tž' ˜‚Ì>ã¡'‚ެþ ¤@ "¹ `óÍÿ?kö èo·”±‹*–BZKFÊ]*¡o„’o<£·§N‘׎4!:;‹R“Òjìb¤H0]DZ¿’{€-Së4 U*rêú™ªÍ­³aÞAˆWÞD&·f7LX*Ux·ÌQ’@Ɖ’dõ–æa¤ÉÊÿ_Fú ¼‡­õÀ/‰¡~ š¥Œ1ª&J9¢¡ î¦ðXâ†=š§+ÎKì3§gDÒ¸ÓŸ*t‚y7Ô¬¹_§{†»-a§X ^¯×׎œµÓ&h™ŒË¢l ̯8ó}ONe—V…Ø]\Ærkbr <ÀPÐkfà=[)º¨xÏl¡È>ymÇ0¶ë+vLñÀC 9qJÛL6lÓM±¿#0t©Äœ8H30ç6½3f䶈Ýè·×ýŸ&Ñ牴³ 4€×Ή=„j;n‚äÌÚò`7uÛ¬ºJ\xA>µäꉀÇçd`pvuý„Cš]¸l‡÷•µóÏd#!:=šñÇÓ„9[âq+ß²…öãr.çæ´Ä°ù5<„s툡›Yà8ÙU½ûr0ÏAb0ÿ:Ë­û’×K?Ú A]÷*ÎÄÃ°ç£ ¬7^­Ž,Ì2•nlŽ”Çu¤(Íê–¼s†¯?C:çz.€Š=°¡ÛP<\]ŸEhâôp99€JE´ €Be\ò`„qJÔîÐèùzC–aÜý‡y{z|P¥àX7é;©X2 ,ÑÌÛ°’Ú'oHš~›H™õd"ßß»áº'ç}54’W‹®NãJ³&êb\ª™ ÞÚ9šdƒí FÈz2®«¸Mk«ú²¯R^‘N”êù2cÐðÐÒüNÌŽ3ãO*U)øË ¨]&päD"£ÉuYwj>Å7ûæ¨ïÑIÝt.¡K,Ä£ƒ“݉Ný\š.¿Yãz0î%FèØÓX¶9YÓX 2‰¢ªbaðk!/•5é[~FÐøüµ¸!‘ß—JmæCœ@nJ|Åߘ Çm0¦”­t'‘×–z7; aÿiþ®Tß´¹ËPÔíÁñX»[e}–íD¥ÓÃsç§úÇ…½·NŒ©Ã#?ÚÂ\;>–Ê.5 Z ßv§³óÑ5$JöÌmÎ~³Ü 0˜ Jšæ3 È¢X›c ‘.éŸÄm&œªüAhà6«a!Jâ¤9HVMîÿw}ô«Ä¶Ò]šÙåÓŠ„cŒ;xf­^Ë‘-¤j$œ86Õ\ìêQŽÚ$3²îWhVÑ™ËÔÄ‚vµJA¼TØ@L¯íÔš›€ëìŸàìÐþQ/*zñyg–Ý]åù@†šèȤŠwÆsöÅ)@{°yš«\e ÕÝ”ð$Ðq5ïeŠc³ÀÊm•lJ;}ü›8%Ž›Ðü¶Ž,úZEãƒVtå­$íl×­õ_¿Ë.&ð ý–@Ê™}ïC÷ñбä’o½½@£ÇÓÿ®:”Öy¬¶`´˜ÆnOº…T‰§ ›ª4±øà:¬ÝPÖý«6Ö6 øka¤óÓI`ž’OÒûqÄÈ }ÕÈ–qÑ%¡OÑ·ËV;G"ƒp¬á*y¸4$‚–ùäÚ##þOÒ¨“P¿qÏÚYOÝÙM’MÔD%['³±‘'¢Uø²¤úož‰ÈÛÐ.»dÅÙ¼‡¶.äÄÐ÷¡x±õy¾¶™#@ìTI†4LÔÜ« ›†z`ùˆ.ã¤IžhŽ!lD¶Jú§N£ˆé­ÑÜ·fBÊ”¬«Î”-¬¦ª*å@Hñ^Ûrá>Þˑÿ©Ùxž¡¤ë¾A2Cbmäþɇ×ÖŠåáå@#¿¤>ÉÃSê¿i3t!ðÙ÷|¦€ Ã0ù´¨&¨ÀG€™åˆtÛË”/ /Qܨ(Íê]b‰KHËØàÿ8’ÑÕ6§EšcSÓZ;„xm× 1Û?­ˆ (Ða.¨ù·@¸Òm˜'ªæÝ4 n6R: '˜JóM±À“B2«óÑ™ž ×ÏdX×^+c…n×P ¸HÕÏ’µæpLN0j¶ÔUv&V6(!_çØÊ¥ä+FŠ•µ×XóCªŸ›ûç$éP[icµY<¿Î¡¸V ò¸÷,<­®yk]Žéo7€6W.õ,k"zâªÀ†|®#Á}úJ4¡é~·jeg‚×zËòE£ƒÖ9µuÛ¦“nâòÍ~ÏÈÎã“.Âã¤;'ÌýÕ (S†±æÊốV.¸QûÖe¹„ˆÄÄÌ1_¢ê- Ç(Ç9Û^ ²B »ŒÇMpnqkâénç½/«}àO)Œ[Ùûǰµ5nm×kçxÐQ ÍZPBO Úd8\®ï!\Ú¯^ú.s»H1;¨’Mn›…:MÙ_¡')5±!FaG$|­o9ìD0£y.~.ÍØÎïƒC6)~hNú©}¾¯¼e)Ù[Ц>ÅÖøÎüM‘1R´“Œ¨ÐÝç•JQx'¯V¾+]Lö¨tZ3< Aæâë­k•'3’’œð…¾‹ûÕ¦bE|ú³b>)Ô¨î úÄbá¸Óì:‡zÌ;η×[œnm±Ö§zšâoŽ3ëe!£j[‡«°m4ˆ­B`Lj"ïvÒª+m>ßâ”K–àöv¢ú%¹”8<çûI7õñ™{s·“úy 3SØñ˜ ¶)CY¹/ì‡'—`‘(ó ½I9”êùæ_;IÛ:íçÖOgL !)À0Ð$p´¥(«É7î#wF"’)]à00H°M „õÞdUôa”‡`j~î8!®Q<ôQ†hoOK o}¥qŽeô´µå¦Ö®Y‰G:9ïí=Óµ«£s3ÑRÐaÆ«y]¨ñºõÊÆæ…¹­#Ì›Á»È´uϰŸ½é\£6–¶8kÞ>Td†Û5õsè±Á…¢Ú<üóØ|¾Äàm {˜U¦6ÉAeËRq)­FxÒge¶tð¾ÉÕyÉKòó^ÒÒˆr•Á=®|Þû¡X¡KrÙ¦Š°4´R¶¶Æaïµ0Q KÕXgFåòÚEZ°'øþaP_³ïá­´<j ƒùoÏm©a· ©ÛÂâWˆÀëÍÝ÷‚ÕÖ„°WÓWÀE(Sû;'Ũ&ªÛänìžažÎиRÝÊÂ2¤‡ZiÍ ’zÒZ8i sµ]y1Ó,IÃQ­×¥Z‚]šŸ“4¨Å^`úÀÉ‘¡ÍÊq¾v2Þ&‘wq'Þör YÙPq_Œðà éV„†Ñb:87D{5Ü­/Š+f†·35;½µ!ÎðÞË S'ASkeeavÌB¿Î]ÆδwjžccœU@ L>p°vºñÐëUÎ Ô›gX'¯oËVñ ýSØ!ª[„yèA¨´ V»Ce/I·15o›‘LX¥}„¿‰Ã1¥ùâÌy·Dᡞ`£Ì¦è Â’¶xK+»ru¤ÁžCØIÕëT:G(dª‚ª¹ÅkJšiÁΤ§VÊÖÜÞTÏ¤Š’eG&x1DOŽDüŸÇ;¼Ýž£?QÔšG$£n\¯Að;©·ÇT“› "-ÆÃhبuæC–ØË Û=B9‚êêÓT}œ¬õè´Ð]´Ù–¥î"Ã<—;®qpðóª^]Zdõl}"ý€©EÉŸúÜ–G塯‚ãŒõî'¢TÕ¡>’€Î]¼b¼S̽€¤ ³ðKÕ7²uÿ˜qöbDz/ãá™ q¶\Îr .ð/Æ’+éÖ‹e•uOú½3¥3¸ahq L°â×¼³T/š>ëh:»ÁÞ®¬ÍõÞÞ_kÉY:Ò+=óÓ4Í\?­÷ñ˜Ùý—; ÜÕ¥p]sÊ»8^6ÈɤÕ1JrÙZ,’´w/ñáPÿg­\Úôt½y—§/Ø í¨”ZºÅ^g"Z@Ÿ¶¥lCE +TÄ~/ßøJu‡‹“ÀLÛ=Û#sbùøç–>Å(0…¿y¹úðó}Ah|%€4Æ)ÄeÉú¦çJˆv¸U[³ñBá/+"ÒA—Dÿè^õe|ÌÝyQéÍR›†[XC^ªÒáØºæDæïŽ£„k{êÄM³·ÁÏw]øué~ÓÊlK”¡C®!ª aˆe<Ú|0£eaûH- ›À{°)j{Vq<"îB>ª3*‰0‚¸ â#ƒý&Ënsr³å´šHjŽ ­XŽN<ôZŸÈ.º÷Å” N2Wfô¤ÁÂF£%}RŒÜøD{§¯™7ê ‰˜Büy·ó“/·¼‡®ö‰­DÞ™9‡k'ªK.ÀÊËÀû}ú’  Yb¥RkY[¯2„¡‹hÏjöí‘´J r(Àú&è“ÔfB‹êñþ2«kœB ¨º§%qþëûP³ùŽ#%¹rÓsbÜôsÙK'a>WÛH®ÕBNܵrž7îÿ”t'Ë£y\—ð·; "Ö_ܦ'Lx~ÐÒÄ&:v‚]SÔߢ};-½¶-V¯>¯<ƒ(‚º[À›Ñƒãyý2TRcMÔC"ÕB)cœjü˜ÆÊ¥ºdpi$§<;n _¢û¬¾ˆâŽ7<6¤¹÷Pž¤•Ä\z0»njÇ–Ó^Ö6¹r öÙx‘'bé#uFYW>´Aë^ãú=ðo–R¨>Ç›4çŠ ¥Fæ½¹ˆ³ñ™$¥7™æ›d½Ã“2/|qGüñÙÐgÿβŒ|Ûo\>(| øLCɳR÷¹5‡«M1ÏJF¤ìxž$®åïX8û{Í òÎ'ƒÊ]ØúŠ®ïP ¨Ìw ZUëe4m¢·Qëõ¥ƒw‹Âú;á3a¸; ÈÅ•¬þ£6Ý3LæÇpîb8§©'{7Ž9ÔO€Y¾q™l}£¦“¡ž8~Ãâî{¥¤•”l§14ž·¶VÀ8Wu t”ÐnÛâCKwM&W Šhû­t[ÿgúAÃ{WwrHF²HR},¼7v¼!3¡~ùmkB6ŠH‹/Z,¹µ$Px\x½u ¤ål Ýi0Ö*ÚdÀ‰Ë¯&1 ¶uÝÐqÑÖÙß'tóës²ö€ZºbÕ¯âåìÃeC`vB˜ü>'eðáþëIÌëdÕQ¯­#Ð>Ïx¼V¤×%üŒNú¿`²¸È÷eú••dà÷äDæúèyè4ìßzÅò±­„à)ÍS‚i_QVQh‚7·Òª ¤c£ûÛ½nZ†E“š^¯ ±ÞîÀ2þ‹‰fÛ1)~™º€ß·xäÔÜ®™á8ÓJ0¶Q²b&¸ÒérÄ<BãvuGmã¢Ûšª*ð1±¶@èÛ ³;3à(…̘Ój ‰ù§x2,èP£ÙVdKm¹ÆïGDïz>/“àAîXÍujgÿ•ôÒáå‘jþ3OïȼÐ/ÈKß»½·æÏ±±ˆƒØð3ˆcÖ–·°nž½×ÕÆ»çáÙ€ˆ. óÐ wœïéT^‘‘ø‚Û¤×qÜ­ã¡oÄîrbÅï R"DÊ£¢éÌZ“é Šј¸âã kŸ‰´aSMÜg†9hÔ!9¡‚q¿Nd­ˆuR0«p3$,–‹ž¼Fzà(ƒv0U.4gÉ Ì_0±÷Ó. NÐØ£¾Í|ðV÷<¶ê—‚ŒRŠÁ²TdQœ“â°Pݳê‹HáM¥[›žÙoFëPãˆ#"cÝÁtʯè,aÙH6«w3–wî%’²£€Œ¼]Üôì„‘«ûlšËû)‰PéØbÆ *çëþ}öÉExž/Ô)y‡JÀ¡€©™ÉPU°ËÚšK—‚QHÞÚèÛÕáˆäGã„IHäŠ^q·9Ú¸Ú»:›kbIÙˆmÊÔÇ)\è{€¬°-Ù5,X4Ö± 2#- ®»'8ªU‹ÍÐh“O=7[ÌWh `Ê9³$t_ôÜôt/Q쯸¸8L¼pªúJ<ð‹9ê}75ç+«µ×Vhg=Æ|†“©¹®6†ÊþÝ*æâž)‘ÛPÝÉש³«c…æ/ë*˜%ë‘ië ç…@Ž–;È ;<i-yKK^àÚ/Õ ƒˆ9Ìõz9Ç-æ¼ h_‚z†î›ñuÅV…g«ÔÏÖǤö@²Ð5:ÊSt p _ý’Ûãå'ŽÚB! Ú‹‰ãó¾î¡À ü4ߤ£ ¾§n æš}„¿ÿc¡qšü7×Ndþ þ‘Z»ÂbüÓ¤)Ǹ£ 'òU0-EIz¿”NA9aÎ5)r ^%ÊÖ)a7Gýkåü`©Öž,ìøîº*7›KÜð%h±¨ ÈùC]†?Ö¶H8æ$ûø°Ãó#À5¨ì\׋Zè Zyàü&Ò}]˜TT†ňÐGÇ Bp t¬Ö*&ÂaQ¯ÖeÅ{FˆN~ïøîV}—`7x.ÆBI"‹$r ­e -F€(lw4MHÑ™HÎU¸vûÅòT‘1ŒH"nkœ{¥Nî¡i~ÿEð@ CëjÇK8dM±‘°å"‹2º%Â!ÕÙÁ›‚M­¿-l”áWM› ~©¾DëätÆ¡pIŠ(‡“SŸ}¸QÝÅšn^ïó8ŒþÖ5|ås9Ë—w°›^¯öô`çÂÓ¿^úŸû®–é‘ÔãdÇO%3瞀ºcV€iÀ5Qz¡ „lŒƒô=¾,cm!{ºMFI÷=cós—ÜhPI÷y ÎY,gÛ«”Eò(÷ê³ê fM±#y÷Û†û©Á_c†J>ðÄ@V±)¬bô/fè!é*ö–ªíf#O ã ÀR7rͶ®ùãiÿ/ äUµñpÐåuµm‡B׫¾x?4EÊ.[æšU;&F¡ØXl5¬„V'ÿïæÖÑÖ® êXÔ^ƒîÇ‹ôà-l]0LÃÆ¶¬ZùßBûEƒ%éÅŠ€î“:˜Ü3K3º TÖ´´{£Pi‹ü¸süR÷ÈÓ÷¹Žd ½Î‹|åð=âPYÎ Gç‡f+æêâÊ$¢°î¢ YúUíC8uø÷.˜bä;j5[ØêŽ\óyÚˆ£´e)æÁ­é5„t,Vý‡·\*ùݬ¶Û>ÌÏ……ÌäÝ —pȆçøId˜''*NSýô6Lâ y¢#°¡xu¾ì‚F˜¯|ýU£ÓÐpa‹ÖT°„NßÁO¥”©3¤QÄ99mmúì¼÷÷'ÚæòS„Ñ»kT˜qcHº<8£ú}䉆ˆáö9Š™0ûÀÅÏbÛÑkH?‡–êê}mø¿µ÷‘áø:}ÌSà˜F-1+t!:—nÊ‘ósÞú*˜„„ußKóÎQR FŸÑ¤¡.¶?ÃЫÇ6ïV$N2Íû—Ù5|¨~ƒ˜@ëµ5¦ hh^ù®ð„Ú à‹ç°ƒ¯áç íkœ —¡Ö-šà½¶J°ÄF Ùm¶’æ…&:ÝÏû8 ˜t[–mM¦Ýó1SóY¥„–•寣ëPÃmOqÜøäHˆÆ JõÂ1l-Ë0R |‚2»–x]tÇk%g[S¬ZÎŽ~±uÀјÊ×Ô2G¿™EoèRݼ1këh2R/Ï‹9ŒIy÷¢vÔ·¸˜{›ÇöW•–ïQ?j…S˜â:á¿PÖ½EÿOX9é[}ZëÜrÃt”€Œ@\¢`å&êzy&tA´åHAL¢hŠ+P¾\– êñeê8å] ÷ÝcÃ-ó¿H» ¸6X.¡rÑóéš!²a¿•\ÉÐޱ˜èr«‘óMa–îp¹¥›PL.ƒªAMHðûSpÏëÏš¯1ÞWU>bÝ®Ñ%ë$樦Csªê¡F£v”‘k„WmŒ$e¤4mž¥œa=ôaÎ=•¤HÜ¡¢Yu¡öבŒÚ2à¼ywæšÓ¼ø¾ÎÎ`b<%ÅMZ/B¡ÌYÝ}zÈÙ &«Xî^“Œi9‹,¼l°bº¿+ø”$wZc ³^r]@ ÷´+°zŽXôÕ`šÉKJ´öp8nƒwa#Ûž˜¡· …k¦ mð².Ž1½ V`“ùwBChxíÄx\Ó>§·ž ´MÊ^/^­™»¨y\J"‡Åkñ¤i¡rƳOEâ6ã›Ú*‰{êR·õLÍ×åuLBßá3ä Êê©Üµ!ƒª ׺¸M!ËŸD׌E©ÓÑüÄž‰ç"æ•yÞ…‘Ô6P<ôÔV‰8HxêA@lcFx“åc¢¹ÍQøÅ[Èüö“ˆQ8<¨ZcÒ…TÝW>9Žœ@XŠ·à™ †AqI‡¸bå¸NÕ]bz TÇ™ËdÖVKܵÖA%eŽMõL ZTêÕµ þ$…t%ó²EB±Ôu«c"^™r Xý©WiÆ4;"ëìø®ÔCáY ZÄ/) èöx×e ”›=xƒYˆ­„´vý2#ÈE*>Ý$…ëxüê°“š»³Àz#•6”°ìEfÛ¤F÷wŽ„®ÜIÁf<È·€AAÚµ®æÃÞ©‚¹–¹Â˜Ê¬yl‚JÂYVᎮԱ¡¸W:ÑDz|FÌÎElþÆT„é6žºè¦Ž Ò^Tt.=5…('ßS3¾5oØPÉø˜ôn^ù×;ÔÞ¿±jF(Ñã1) ;PHDj—# Ú#Ã>¡ò2þý¨õ>ý#õƒý žôÅ‚ÜÂêDÉiÇÔÙ‡¢2¹\pùð³ös”X›qÊÝd ›‚‹Icp¯±»6à QèiËTPÛ*9+“ƒG0‡!Z?Ñ6¾µWÝHÅ3È=g¦G\õ‰'åï^(~btÂÖ9ëî§âhƒ5W8áxU¬"¿^ÂׇŒÉe¬§ÿÛñ¦«ðåâθ¯–âÀã=tHSl÷gGæ%úòo–³žÈ¼÷£µã4kƒÊ,*µkv»—f¦Ê÷7$ß0ÍCѨ"€¥] |¾°½ÍVø ’â†cãÔ^Et³ô„ –'ŠËà³û{sO¯–; ˆs&€p‘òÇc„€(’0/Ü’#¸nÞú–+É„‘•ÿÔ0¥äVE¹¿–@îsùÿ(^znÀsøÎè°/‡Ù‘ %æ"0"ÑŽó™ ‚mÐsIo;tŒãEOfÉÁ¹R€ô>=*S‹1<þÖâàèQT5];6h«…3ˆh„±! È[{èö¥ézç¡\ˆUvº¨~—ûÕÇâ<ÔfŽ‹ŒxSíz§ÄkrˆÊ6¬6(+êaß Ô<Ð5åSçªóƒ¢‹2K1y57­×Ï©Œáî餺:rZ9)ʰMä¥ÐŠk­õòBø × ¶Y¢$wUñå«ÙÓ!^Z‘oyèM‡©ú›Cõר¢hÐ ~ {yìGðfv¶îoéˆkáH¯(û§lЀeÄÞKe´ fÜC…ZQ1!¢'|¥0Š8…”õ`¡GÂ7TÍU:–æÄ°:ˆtÞŇ'Õá€,– !(·þo›àèù$øN‡—q¸~«þù¸kµÂž¥0 ͽ“™©:œ³‹E¸«×5s ŸÞâõP¹×$̽Lm·]˜®ÞI²ãs›ºÄ)ºñ$ä;Þf²=:½ $ü/룾Ϋþ3&&Öç0¤ä¥À`’`PW ï©qÐÖ[k‹OÌó;omјÃqò{s4ìªm ®hù“usp¹¾Z㉑„ÇU—Hû[,Ø)?^ „jíèλ«â)TO«Ö–¨µ\Äü\¯YÕ“D*Õw³ª÷ë6´üï“Cð°±äóV=¡úÊ¡®)ï/PèÝrÍbdá†ÔiÜt=_R”£"hˆÊh*¼Œ¾ap¾ÚL¼ŸÈ"Î÷¼´mÄÙ´g Äò)4~7iÞs§M×ë#±8§7^íö^Ï1ÙáJ[x£í ?¥V‘Ÿw¿ˆKvšxôÙUõ}`ˆÕ­×!ƒÎw÷Ø\©³Ø’uƒ(òËtaÑ ŽžƒIÀêüe ñ®ð°4 œ…óºßÑqå;2=mç jˆ¿Ão´>]¤-©v6Ê·|g¤ûóÛ;%:`åœ|tËÑ¿ÊõC2z \Ÿ«æxK´—éúm«¨­:×»)GŸÖ–%K‚Û Ð,':‹Ì„™¡¬NnË-å³Ô=ùz~˜6An }˳,‘èsnkÉûÄ7© 6¤ÊòT«Ò'›Kø ÷êi²!K_çIF¨`4{ÁÑFÛZWp…›ÃWÕòµ-ñLËSŦXë…$R­Dß.åRu6Q ÓSõ¾ßQD)£ZGörèjeÛuYEf€×íE¥‘ª†t&©ÈYf/&¶"ŒqÑŬ4<˜î‘ G˜9ó…*ú/íÃöƒ0“$– æú;ÑäÁ^×¹aÖ8>!Ï7é¢ I€¯9‘I¿¯ÙÕ¥c9—”µÀÄ`@TÄÏY,ÿ®ªåüˆ–˜Ê|æ^ÆÕrÙóƒ€ 4v©®¡wí è¥S­ý Vœâ›)–’ ¬«NÄÆ¼Š‚ÄD„âÂê„r¤7Õ‰÷\Á¼÷>p,çê1n»¥5-¢›³©+ÅšíÓK@²1ÎûÝEÕ¹»ˆ•ÑÇГ Œ¹f<У:"{*,-ŽÚ8å¢}¾Øu}*mØ»KLL(¿³ þ¬Žº&g™ÓÚ0~øïÂ]Eùl¥ÙÕýÚAx—›ì÷Ê ð€aÂÄPw¥ôÇ"ÃEƒT½¾uAŸÖ¹h]DZ'àù'âzìnŠ!Y¨çUÜmRˆÃå]Nö ÙP%ú–ó!’§oÊÏCu„ñ-±¯®¤ö-¢Þ&Q½ÓÒñIø©ôá5ZyVûˆ" \¤¿Â½fXeæ~Wœ¼íI2…Äàô²Ï©?_MóÍÒ£òn} §Ç+™ÊgLP¥qH+ª€±b¡TMÕêÿÑHÒŠÃHæ#‹ß¸`Œã.½šÒJ/E)ðKs¶üÚ§¨«qÈEÔ&&{y½ÙÄծΚ¶ToÜú9í=E^û'œ2©’C_kMdÇ>¢‡MRIqØÕÒ #UÕá„9<^ÒÝ/bÛöÍb,0%dPŠb˜ú €Fæm@²ãÌŠO™üVÅ]××_¶˜L¸Î)m¾Ïõè¶–SóÉYòv¿‚½¹Ë—ššy6kr^¼¯ÍHç2õ颾\ ÚJ¸¡]4áð>=[Áž×Ì.AYZW/*‡õv†öÑOO¦þz+4:ê›ÎÚg+IÃiÌk3ï*MR¡¯ñrºº÷À×[4”ÉÕa£X NÂôó˜ÛÓ’QýŠìm5_4 è#¶ùmJêl“Ý}cX1"{4õ¾½Eã1Ä]»/S%Ü\¡£éZ"•ÒIØ0&zHoèŒk6eOžœè̵,ï–«»òQj õmF’I{~¡ür}‘)'œ×¤¼êÅ â¼vq/–ü)ýJ'¥Ó’¯†V.®ßgP,½yl†‹îH¶èÛ=–Tj º“ÍûdÔÈ÷•«h½+Í.«Sè•öc/nCC4›¼f ï ¢ÙPÐn^–ØØo6lqîr]JÌøÈÖ¨«ö‰Xõ÷AÓ—w)`b¤=2Ðó“2Œ7¾#µ^§VX«ú¡ŠuÐÞñS¨‚Í%¯Ñ3LŠùÉB’F:­R°¡®Ç¯32_o—â-´aA'Ã×°¢®ÏV¨€YM®eûŠÔ¿ðï^ AÖiWJÈV ‰éõ·¶GÈ!+¶Z,Ûþ®[“FÐu™9föšž:»—NáuÞR#)!­Ê‚üvQw¤@³„÷xl•ž¹ÍïX±äïOë먋Žfý6}T{ZG¸­Q(^qR>=jF¿$$ùàåŠBîý8 lO/LyM|†yFFÓÀ¹¾°'>2 û¸ò}p'Ëø·}û§ê€ %òÛ”fêÛ禼{.êû–+¶Ù$v†L;ÉàðºŒì¦dW—#dÛÐ |æ»>²[+m™Dtðe𿘷«`€d€¡Z>¬B˜:‡ê}Id<,ˆ˜5¡Ðéµ\ƒ÷™ ,¡Y‚²œË)eÚ.ÓWÉZrÍ1 „ ÛYyÒ~jT Ûvƒ¤Þ%ÐF­ª7#òsª4é/£hŒ½Ç¢Ù¦}x›‘$w TÓU«V-4z¬Š$Ñì–©}Ä:áhæð9ýmˆÙ@óÀߪ·˜GIN@g7 Ï~šñ–˧r”of Ó=±ñwŒVäÜÂ='Èì6§Õ€4’ºQ£çl¾.O(Zaxƒ]À[zg+!u;}5ìZ?]ìétø–îû׬ž‚ŸªP7=CX"ÂpJ—¼»?›g«-2{8ñ0ërÖa2 ˜pœqˆ^¶5]"Ÿ¾Ù©ðeªE.H¬‡Ñú›7ÁLVú0Lm;®MVß<›5% ¨ôîh<óËdúËæx{£Õs±*VwŠõ7s• Ü‘cö{ À‰¹½Û˜lÇ-D߆n‡¼bb>#|d¨·œ!=úÓf’xá?Þ§åðµôæ™2ÎÕjŒ\y)ù £ -éÂÞoÿssˆù3^›‡¡Í ö¤¬e,< 2bÏü™û1T›¥áR2‡L7Ì âŒïr(\àQ J¯’ÉÇê1Öò"Ò§˜Õ4—pC–cø~lX$_ð9žì s$•Y¥ÃsùÂ#ÙUÊŸ˜‹™àqa|¦ÝzŽxŒ™¢Æ#_ªæýX!ŸØ=÷űó¢îfrýØÈ µŒ•ˆqÏš@úM R켨ͨ‚-µ¬Ök£³^ì«‚³àK˜_c8 "¾©¶UÈ5åx®Ý+ð >r«‘q{äE±Î=I>¡ëïl²Ô!ÙUÙÎR Òb î¸}Ûë‚6y‹`¥ß Œî®%†mYÑ9·‡û=÷=¶ÉcYTFõ,·¯˜+·6…0ùð4­ÆOÒãz_˜†x«‡ñÆð_áØ~…öÎEe¯0 ªÈ6ÚàEÞ€önw$Yà ¥¤G™N%c$À½Ò {ˆ¡ý1éà q !;l0Äa©yŒ›j. ²¥‘ÇÔ~¬€EçÆ3¦í~¢¢Þ÷ÐZ]4˜I‰£Ï‚Ó˜pÈrµÑ9&ýÜP-Ê‹ \ÌÆ3b$zB*ßïЗÔÖÑHÙ ·ámZ,»bT'_SÙ+Ó˜X¼Ã·UybëiuŠÞ^‡éê<ùš#¨ÑÒ¾†.€Hóï| 2uR@úk·&dèö³´!³t`üZV߆Œ¶Þº{·tÝ´TÃÔ[Æîñ¯—wP¾NÚèd™I" Iö¡ƒý"•³>þÝ.Ú`[Ì£,ä^ì„% Nj̘­—KxÊê‚]ÓGèýëto­)…¥köï ¤K HyÞóP6•ê—LÙ`º—(¦W}±Gp1–gZ0ä⳯Ùa×Xg±˜Œªd––h¦†Cd˜Šopуš`ñ‹ä æ‘—Ë8xk65É_œ§¾Ò±èf—î¼…ãF ·SÀ¬n8’Ú+=QD™v1Þ—‡¸RÎR¹wðüé4)ÞtûÍqpUÍœµ0¥ ¼\æàœ¡SÁå¨ô2F ]æbX.añžp… ]4‡{Äóf¸º®/øú~Œô`Úús\nÎM÷_Ý{vQ¹•ŒzÛݼ.#&v²Ð[^ëôtÉ,ÃèÕƒ¬Ñ”?_ÄöeÐo]KC–Õú²îQ·Ü™2Û…Œ˜R½(‹­–/ž‰䆸\K]ÿm®Åš”¶÷€VŸøö6‹ýõ ó(&ÂÓ)©èâŠ{º{cžô2$"D]‰O ,SíòçZïÂQñð…Œ>;*¤ìÃéDÑ¡œtÂÚt:P¾„D µÝ$ßD"¢LýÃO‡3­>±{ÄÓë7A©B5yÌ È,÷6Æ®bI^>wúÊÀËZâK¡lh±•ÊÍ-ë½|\¨ÇÉ}Õ8ˆŽ¸b}ê-X1Lj•Ó<÷d#a¸ù¯Ob­jˆÉ¥80ñ “¥Å¶$å´j®gáÂݸŽÿ—²ªH7\ÔªÊéKâ…;%eÒä!ng³ËÈÅ)ܨ‘í.,ÞüFå J¸ELR(ëÊCª›“>\afÙyæ•€ÓÓÕ\mUx ld¢|þ@…G6è§L>‰ÿW—]Ä.J控L9¹"Æ÷:÷=·ÅJ`Ïœ¯Dd‹4RÔ"*„$k xüº›/ñ ÁÊoÊ¿ || ×%¶¥¢óÓoªQ^Nó0PaÑv&èÇÎ*,”P{Ëá(Õ†å%'>tÉ=“Ò‘ï„z&¥ßÙ2ó?š3¬Ûy-½ìc˘µË­yŸ>³ÕkôrÇGc´«2èKÇ~¿ìR]O|¾­àTs|2Hy-A_qìÒSÈóT¨ÍúõáU„Ðm"+Ck=“ަ=³Én‘È9aA±Û.KRN…Ü7^h“p§`/LC¶ ÖrÐfß-gÔ¶ Pþ=…©¦3òA¬7CP¤=Þ¾’$éÚ§Î òŠX¾…ðÇÖ6ËÜžc(à^Õ±ì‰är¦î›Óa¥€1°Â“¹s(ùã­Qx*ÏØíáW–s¡Š›tX5Ëe+öŠÆ1k ² T?U=Ö^‘ð(¡x³(µ'mdPψs*VÞÁv¹ŽcðfHÙ¤Jÿr&­G0¶ï¡Ïh ”Ô|íÐ~•ÓA9yHO  Ô¿PÛŒíC'˜\ •ÌèKøQB5”Oˆ «Í¦1·.o2ÖDhêÁÕ¡À7•ÃGaêß GÎì°÷ïÉØÒï%9ÄA¡^^s.J娛›%ºwú¡¯šhä:0âH€`ÑÈóoú¦®u?”ÓhõõH&y&d;·CîRŸÉ¹DƨPÄB_\·½å÷—Á¼+6Hη?eùbìž|±Ò¤¿L2žœá¯ŸH’ù7”\Kw¼[Û¥ôÉó†Lãy" =¥ O±[ùÔGzCÈwoò^~*.{”S®Ö«çQy– ñæc㺻:ûsgô=dnºŠròÄd¥,*Ëš¶îP^Ìç³>‘°6×ÇÕæ°U÷Ó›•Í-<ì<͆ÐÃÚ+0%@3zý!ËVÁ:P’ýxµgôPp)è …¦#sÆô¹_3´¡š×gAÍYÈŽâÿa ÊËK˜Ý+­îÚCåØn5ÿÆ?>‚ç HiÃUXýe¾ç?¦¦aÉXæ dõ^nòé$?5Åö¬FŒJ}÷V×FùÆ™ë§m ÂÊV»:d9¬:šT6îÿ*ãxqÔéÈ®Ç,¡MÁ"SÌôì_.>ØaÓ&áÓJHá(û] © Œäÿ|ÌßMð±FøsA¶°ÑϺÇI)”!$˜…ÛtŒ´—àëh‡·Y\[Gõà,šidþ Ðo¡´ J—Þbl¢¬">E jS¡*ÒàXè7†ß±£©•fÉ|,î)9¯éwimN'§±A„Û!Ë…@Ä·R­¿¿uE¯'©ÈO2àút.–GŨɋñZ/Æ(p‹‡¸_È]{ÀšxÄ[U§ëmpóYrV¹o!Û#f%ðÙM³±Wšp˜DÔrÓªP¯‹ÂpAG´éqÔÕågui=Hš}òÂ鱸¤Š„‰'£z•6“%«“•$/ZÓv kNÝTŠq¸Ó·L‡cøàæ¦>G3±L6e|{và¾k¡X±‹bL¥ë”îSëÖ)ýÍ霘(ôl¦Ž_+ ^p¾å F°4„fÀƒfÄüŽh‡gˆäx ræëÖï]#ÅP±êŸJ>CMC%`3øGo“¯Œ¥zæiô ¿|ýïVöVÚ$ðÄ“,$ßlåäÝz~VTž*!ÇèÆRþGâË1˜T<ÁxÜ;^ J¯x»àôž].Ãr¨üŠ-JqïË8sntŸl?`¹ÊÜŽô>ò 3îS¢]z`»nœ4‚Q…jïQ Ì(3ö?uŒ©a›(Áç#Ê&­Â¢ «ì9õÞtdÊëo9Ÿ¶8jY×Ò=vpUò;è¦{€Ù½kÞ•Ú×%2ï¤Ø_Z‘µ© <7ÀÂ;§‘<=]Ñ¥|7½¢ë;1 â{uœüÍ$˜G®üÃvà‡”‡9ÆŒõmáJ””79ÊÈ`A±ïqÇö8&HÛûÙIg•Ù>îX‡úÈœ‡ M[ o†EÙ"°³Â”Úᑪ¬¼.ªnÎ⦔RðC¯êã×´{#›9tM¿N9wîZ÷ööƒ@£0Ç·–‹^¢r·fÔÕ ª™Þ BêÒd]Ììí‡2¤Çø#ºQlÒþ£-|ÖïÔÂÝCŒôn•èðÍš¤_³¬Æ›<»pUUxÒŠ ªsîâ± ÂõŠÃ½4¦}x"ÔPvõç¢Ì†[ÄKu眷:»paMßI@üêÔ•-Ö-[@ž™õÓ¾cšð=JÐ8澺ÀÇl§;a…Ëb𠆯>½F´Ä¢7äÒ3—^¬ÂÕ®lÿ‰<[×ÊKìРœÈ][ƒ”¬§@˜‹ÃÁˆ…ÒÒå°áÁncŠWã ÓÓ³ˆN³éÙR&"ñ Ñ‚+Z — œÓëšÐÏGüJœs‘‚O5&ß ÞÕëêp€tà¡ß>ñ`—:Ùy.nÌPã>² õ»tåÝÔ0·P·úéG”³V3ÕÕ|N‹!ór¤ý`)»#µau¿É>×D|æDŠs̳UlýuAÚ¯Eq7`Ô©j›un“±0Ï^©ÆŠs2/K+kÀÙPÙµq®˜ªÜ§Õ£‰3¬3œÆNŽÒï”#û††Ì’° “2+%>ïSšWÃ$±è”lµÏ*†Œ†(‰® :®¨ºP¥Ôt`Qp'øáƒÃÒöŽŒCAp¶à¨Ôšs¼ó›LJ‹ýd… xó§üÚ?%u‘=ìF|BĽ=ùÎ|=Ð`xzãÀ‚¡ø®»u(í! ›"pâ¢ð88ôDçrÝâ±''Ü}ƒ‰;§ !Y¢Å½â.QÓòLÊeü¥²âÈY|l¸O1ßË•çÄ_‡ÜØ<ƒ hª(O€h|û¥ï¸üÑ G r"dO­£t—'sÙñ¨Ý˜@c 'rþìxOFºý—èáLüf¤ÐãÆýŪ~þNƒË.Ó4E”l×ôt¦Ìuážò÷é´ óÝd€Ñ•¥®>uçÎüž`™"–¥ž…WÍ£$:f¢É±¼º©qÅ›Q}—9 7vGkXèj6CЗuªr«‰§:ä´2%²|Éân\ðC£wg™dH’ úªk”—Ëyb5oɆíÂQíÐ^}qw^‰î[±7Nï¢&öÜaÌHºåÄ^Piþ {T‚êÏ  îs™•âÞNx¾å9”é³É«|rÒïôÎÿ’#»Çµú ìJ\ÍæÑŸ˜ ´œôI³?C7¦ÑÐ`p¶ÇUOé»jt;žŒ֧˨¯\…â0uH k"ݳ/A#ohIÎé'XŠò]Kç.~9¬®AÊø‡§*&K†+’»yÑ-egœþãL²/ŸÌþZ„ý­¤å§7/ÒpÎïÑÑÀ£Ù44eîi›L…Ü…âÁ¬†½ ¶“úG^9^Q$òZFýa»»;FÚ4á7™Å¥½ &Å´µKj±œ ’ž3(Õ4zq‡™Xêæt¢ƒD}V»û/9'1O}7LûiPÈLjöç“a¡­]Ú=y¬…j”-;‡xrZX`ÉÌãëBj.Ü/\Bsæ“2A9e›<³» &iÃF8Ð?ËNi}æ\Ïö4–tt'›C–­ƒJYÞbçM©’¹Q1‘ cˆ+©"諭è¥PÄÝjRkWÚáÕ¨ú¿ ¦ÑÃA¶}i+! žíØ¢õ'N{š½6ÔÇØÔ¦ƒ·—' “ 8Jr#u:iÇï œ,nWßeX¾9#w))ÍùïoóôN™ó>Üg„H'žÜa\Ôy0$#©Ÿˆ[\ĸыõo€M)Ð_[CvV9¿M·HÚ-b*æ~YºÐðÝ”|~ãñÞÄÊ{ªËZs$±<0ø.7o¯Hò’„Ð õ±³4jô_ —@†“VðhÒ‘‚©¬S§©DËåµÅ0|¯E±æ)™³ÐÃ\ûKY[jò¥¾ŒÜ÷e¾mÜTˆl›le@{yDíǨ„V½D§°§OzðרÑ 9Ÿ¿(äÇKe*:3iq|YýK&¥ó(ø~™FB;[‰S/Á¢Û´–Å3$Ä£ñ…U‚/!å LŸ0"Ž$¾ôȦ âŒõ¬7ÆEœj4Жì±J(NÆÜ‘ÅSbsKÖ®œ+r™+SvŠ•9À#ÿ¦¹ë‰Ó–º–|¹é{l?j˜•ãƒÂƒÄ‚t+šéåÜî¦ZN{€õPy)/7B4W*‹ÓG¼ZpdÒ«‰YÖ¹µsÛ6Á¿_‡JVäòuÏ?+±j$-`ÎÝuù2ZÛÒ”ÊÓ‘Ç›Ãþ;yù ‹½8g›Âž€*Í®e}ùî•ïU·1SNZ+®húªÝ1þ1CŒ w½'A¡?½â2ÏèPð–µA¢òBÙfùœ:}É,cô­Lr÷~w„ —MìŸVëÈ Í”F„—°ß•. TÞE0½3YjË}È88ÏJà w„¸ýŠûÆ~X% "xôt²ö6—ò~¯"‹«uOŠ °Ä ˆagO茨¦ÜŸ¸”5³Ô ¨ŠÒ?•Ìd,LVI}œkæÈüq:p+ ŠŒ$,8½¶â8vw˜PQ¢«ÿ(<ñ¸ïù{gq‘{¼rç½x] Yß÷küNÉÛJñË?£@Û)¢úFÇüŒ)D¡ª Ï÷¶ÊžF7Y¼TtoÅRrøpKVoÀ’Ú©öw|œé㬹´eñÑb“î(bNÇ)ÕèVÇ…—¦(-qsÜ_5=U †ƒÌ“‰ûÓˆ¬™I€Z†™½àTY–ï• z ž:Mlä²áïÖÌÐìÒIÂŽÙù…˜îúBDZådlSW*1’gVEó?–¶9“-`ò?Á×xóœûRB³1OcôC"ONèèê|ì,ÜÁf5 Ò!(Q’M"Iý•½k ëpmìâdàÙá’ e"X¤ ™/o.§ÎcA·¯ºk€æU§TrÖ͸ÌAA`‰êxV8Òq©b‚rÌ`醃1A]¶×«ý˪øäoÑ ¨j$ú4LŽ›-ˆÜ{q©xFó¸ê&¹èä*H©‡!œu‚7vý eŠÎ3Úû¶%MGì‚‚›Q¡Ý4ÝçÌî]UÛ2‚RŠ]j•GÚ…<ê/„­* ‚{Ý*†—#¨œÉ›Swi¯íÇlQg²‘WàßÚ@MÏÌã;-Æ„ÞÝ´UÊÉ Nƒ€ŽЏÃäLƒ©Þ£¥C€©Y.é«Ú 9å°ë]AbZË$À„YU¢Å;ÅpºÆiÛR0‚qûD ÝT.\KÚª(hj— 8&s/nô¸, Ék&O¢–jÚÌ€1u\ä !£‹×“<‹»æ±•…œ5ny¤11Ã’a¨#̇4Q+OÞâ§ëù8!ì­‹™7ÐÙÚÏ}r“]ç¨×ÕµËd€>PÉòK¹ÑÂç62ü ^C- è!%Á,â<ŸiæÙlÿG(Z…¦ˆŽnaG®8丿É?Á½$:ÆJ&nu»‚—öåãYjÁ“ûîó%£áÅ囚·RÝ$ f9Ç¡4/7m¯ciÝ"Ø.h½~ctœkŠ£¡õWn¯Ãç¬t [¯%nI;Jf¬‡¨é¯Ž½ ¯Jô芴Û=±^Ç<%"meÏ(¨;2н¨‘ã•ઞ¿ãó5óˆïÄÖD=eñIÔÑ—©Ï!Ãx¨jÜ¿ÃåŒÀŠÀ±sÞ Ô*cÎmȵ°ôÖó¨wJP‡Š!Œ£útq‹g¯ìvéLã r`Z3γ ‚ÁÅ¿Q$ÝhèYDì%š- ©vHý?Ï[eP‚ÊáÖ®|ïÎâ¢Ù+¿Ruà5l›Ñî:Ñ£‰·Â9çÎß<«°¨|¿Méy›ƒ-ÍÅ8ݨa³Òó2¨“¸ÃùÇþð‚_rËÈ9¼c}Eʼn&ƒÉKrwΨN—áÃÔÈCë&h°I€($XD’»¶ÝPìŒðÿN¬=ŠŠÖ,y „4U–º0kKIäãÊõ2*eŽÂïYà ‹ž G*F)-z¿Œ«®gþÆP3[ŒIøÆÓËU“9žõe f˰Fö5ð-ÚF²=*>j£.÷Z'üêDòŠTŸA+õÍz Ù3#éßwÈç6¢¢Ú@%fõ|¸¯vk±Î·NIôkuÚåH´h³Ö¯2 „–­¡oÆrW>½f¾_H\e×,½T»à޹ÒÇ©ÆÝEK@D)”é#)nº‰&‰}ޘ横­6Ó+Ï]ô¸æ­Õ­*„‘¿8gòs,&ÜN½ú ôE|ûá{H†d73Nc}–No?xõåm¡vµ¶,~˟ܦÛÛ±­J%lŽ“g[¶êUÜ2¨É­Âá¿’tl–ºá¶'Á—IÞš±ié¢nÒÞîÈÜ¡Î\M:#‡u–°É!Œ¹ß1,>Û{é03ÉŸ;^”N[â6ÃPúYÁ,þÊ~'jX̘Åë‡ü“ è=–•mæàË%åÈûs°NÃÒ<,›)ìµsß„k Ð¶¦YÙ«í%'B”#ì Â'<äxèaZrÔsÐJãˆñ? uŸק9ÌUK!J·…µ#d•íâ¡§ z6krC<­½õ„ ’£›í5‘ûè!hp\#—EivÎÊÒöúÉ6ÐYC¸É)gJÚ ]‚ 9Ãb(¸²ûi­s –ŒCHØ^žZÊZ'PQBvµŽ‹(¸àÁÒß0‹É?]¶$>Nºk-—†‘t “J² i@ÅçØ{Qô$¦Ç¦/11îû_ðvç•1a™5ç>@Ü›§DñŽv‹4Ÿ§2×K*ZÆäÑš\ø ¢®Å)oSŒ—Úhù•KG5J»"å²³â”øgÆ‹œUÝX—G†~ŒãØÞ:¬8Kà¬= ËÄÖä<Ó’  |À8ƒÄC‘î¾óç‰ÉÖëÚk^ý>êÃÇб'<¿Ž‚á%çQ¿ðöÓèy—ZF'uºZµ×;–!n}q 0Ø ¯ Uÿ¥Ü¡ÙÞ Pí”ôEÀt—*ÿ ÄŒÚ4}tL0 ªdî† 3Ôp÷ WËÒeæ¦5. !ŒÙUG,o§Ph©Xq*½Ú˜º+™¾%3Àt æXC!,H}uSÖ…¾ëE@yÜ«Á*LˆÑqY×fM’JÅÛzUÄ2§ aÃqSJ®À ‚´òZ—æLšíPS­.ÖTPdåëÍàML5êÒNÚPšx|ßê&ä^§g ¼Q÷=g1ÛG„X™´_”˜`†7ú_äâî„x嬀ê‡×?í@P€ ¸õà,c y•-vhe ¨æ8”·:µ ¹E4Ö¿$éåëIw‰Kç"ä‘l²Pmöˆ¼j7ñù£{¸œÞeV0‚"¶%0AÁѪ†±ôäk<lk¹Tö.PN…£áÍoƨÀ½£š_¨^‰M¿šá\IÀé>PçÖ…žçüa…SÁ­ï¬ì Œqw¡†µ(•5l!nt7ûÎéð¼µÝÈäŒß®n¢ÄÓò.ÛX¶î£;+ì sÊdÂt¯PGÏçß6P–Æ?“á›°õ@ÛRÅ»2}<ÁzßG¾c¦Å0vuC®íŧ¾gÐ÷Ê$)!a JIrùŸ"¦­Õôìûrc²ÔZ'¿^)›‡ò³»Æîþ~/â©>ò×éâ‡s·>é Xåt'/Å…ˆÅ«w:>,FZOÅ/ãè“f]uBÁ eD¶ä 9‘%‘Z£*g>ìž¡ÕNúïпm'ÛeúHÃØ'C#Ä©ÍIÀ‚BžpM éi,߯K¿¼.v´z^êWR}_”ÖËé-ƒ55 W£—[]{yÝøï$G&KYïðFe½&ÞÔm<œÆ *U¤âh€3uüÂ]ÝBV­×Nå¼¾60Ö¡Ý5ÿ›å½é}Ì“¿¤&oÍŽO“0ѹ|ŠsÓÅ]Èìø6rA±µÍ¡%vY2O¢40¦ü£ÅË Ïž|Æ´m*¯ •¡.ôKzF¡âú‰<ÄI5)|w`Ÿ !¯^ ð«ŠÜuÙXyÓ®¹Ã.å¦Äð’·”çëÐÞ--öè)‘A’Ï4Ÿ'+Ÿ>\e¨’ZÎ:©Ž¬_ÐŽoCñmñöBt þWuþG¦¹yÁŠ@5…Õ•$Â~! 8ËH)¹@ÙŽ(íy¥![:,dŽÑ¿cì°sqÚùs³ìÅäP+¤‘»Ñ½‡¡4Ô÷è ðg•׺ê)sÂh~®¸3tØNTA½´¸ìÔª’]·RþGðãÃé^£Û}¾‚j ”çˆ)…eÐR®Ò ÔÉ©ÔÝùQ½Á G=þÑÇ"¡úÞa~ t‡SgŸÕyïXˆ ¨ë¯“x`ñ›DÒT©vyäÛ³´ªWømß½H´R•F¡Ê›od íè&Ãóå‡MÖW=­¸âÝ´;vÌÌL’ =0g˜Š'ÑÊêg;â>DÐMynq p-]§_๤*oYVæm_Óá^~¶JÔçÑÈÔ¨3yJ3ü`ªÛ\áªD݉äE&yî ²íF[5€@…Ÿ¨ Áf^£ÿã_lÔž5Nå ”É yŠ˜X6‘vþK¾4ô›Ú+Ož‰åãâ.(UxÈd/ˆÆî³-a::ƒ{3!wÔÛßþý¡Âs>]W/!C˜ç žJCk^jdÄ;|V/8rî­YîY GP_F@Žõ隃‘}D…*UÛ˯¼»–ömÞ—ñr?̽íå‡Ü£Y”¹íë K€. sOÌ#U»ŒŽ%‡€ôh=5NVY"4ö0Ëž» ÛJ‘¡n¹éá¶gšÕtö:£Ž´åt¬z?%«A£­š=‹¤E™(®¸©à 04ˆáˆ#væÔ2ã$°Aê3C]làŒ±qŒ<ãm‹XyÚT yÊ Ö±c—©|;Þ ޼U×Ü!û„ÝWAššsñe©[C–kÈU˜„˜“_£sòâ¯|dçx…’ÔuÙöÈ«€[™‰ZÊÞu¡Ÿ9ÈÈf‚N®¬1á:z¯‹|á•’l©&5„Å3bð”é§#’NÐÆñXfÛc í'"—ÖŒ{¬­$Q¹9œ›ÓØ,ÃPÁ H¢²Â9TA¹M`³Ü¦–ê[t÷wœÝdgm"%Þ[Œqнaâ©\CËgC­|÷Úa˜’P^x‡–ü@VH£ÈÍt츙;Ω4tñ­{ FŒK¸¹)sÔîžýHáHÛ…*g¢ñÛhî仾c¡¶ *†›1ûéÎÙ0‘ÜU²kyï -[‰H¿ïñŒB–á JáŸÄ)h¢Q}o)îýÏQ³Œk’«`Ycc„B8[ϯþý7ß7FKdóÆJeÝ…Ë ‡,NÔb™›´ÓT´Zm®‹‹rð¿œVÀÙùä°“1œÎ¶Fr4ÏRPòÜ’Óº#Ëú蔸XxLA‰ s6ÙT‹ÃçJC=˜ë؋뾠ŒX^Øz“MÔZùÞbŠ˜…DQtö¤œzÍ"IÃjãzh DÂÄ9 ¾Lè5šú¨&^Ññ®~¤ïw:]Þ8ΉœùÙcº õzäTDÑ^DÙDõº[,Ø 7îÈüX\£M`0夘3Áõfߥþý5¹Í¿PÉ)3ås~Z4tÎ÷´QU²…c øÇ3ôó†îW Ø_ÆŽêGÖo³m tŸ<™x4ACEÉ j[å—Qã¤pÛ«ôTÝÆ ÆpUÊ7Á-«`¯.YqK-É›’,ËAöj@<ì82ˆ4_¢9åHèW¤«¬{SÐ8c©Ò;0T…Jû÷-XJç¾y–¸<)àÉeüHÆ«vR(»©ÑÈî4Êl†5iâ›'VœÐ)™?\‡ËN¯aT×Ly×ÂWM9kà+'õDÂqsAáã•'&Õ’” šNYF®îä´ˆ›Â3Æ tAÓ¹¨éž2ÞCmÜl04‚kå©#殿uòwÂ\j·ø<»H}mÜçØÆwŸ%q‘7øDýS„hV´c9ÔÎ9b%•ˆï ‘åÍô/Ÿ†”kOâýµ«„µ_PèOyK¹ºéYÒ„M¶ú©®Žçì’¢V¤ÔñàÏÈ!6Dê‰/*‹4™-HàûÑØKeª²J5Çý.dDqZ.i£,(1O½pWLÇ…ÜÒäVjïk°Ð`_pp$°j§ÐïÈt~ T„Qwƒ¤óú!çF˜Ëê¸jT¯wúú¯¥ÄQ3S+1D26z»_ëQQAÕÛaT`Z^Ìî\’f“ QîϘn˜õ.vÑ–c#. 6;õÔ#‚…À•óàXŸFe7efa¬J]0¨4Gå¯ÁÇ\>_Ïl’j§Ž*¹‚r$|öO,ýƒ—5#¦²öçîY®aWë_†QŸ4VsgÛ‘IД‘Þ^¹t}‘:ßC»ËÒÁ’/ù¦úrµ…KâºóË¡cúc7>ÿ :Ï£`’^0V‰Ø-?;É~pö›¼']½th“õ D[Ý4'qL îÊÕÌcµ+{(ýòŸä3{rø‰¡’käŒèIv¶¬s]GH—(ü¨÷êM2\!U/—N&=˦%ã£Þ§­W«N¶P 3Ðz=gû°øä2'Íg‡ÚÉëQwÞÖƒˆ?«!!£B=Wûª‡=fÂ…®]ÓÆn} µ]kË_ع|#òÈ‹Û~Ý ÖäuȬ°@s4’÷SŽM{oÆÏƒgÒ.Ÿ˜%5-òáÃNœkId,’WÞ^¬ÓTÍ[’Î#”<ÍS !ᡸd:Ñ ÕRtC`ù•, •v2ë@ñ+“ÛKa¨õ¥—g”û(ys𙽄œäk½‰Í¥¼’ëó´pñ÷"t ù Zj}ìiϰ–“8|sÂ/ë¡"eIŽ9Ô°€½FݘOv·8oÈ€{¸*ßî kúƒ"Ú’ã•LJiB•`™ò-¡yÙ´s3Dþ3¸"ÿåA}Ï• €!±Jcë=îÇHÊýÏFØ x ­ :À¸9Í0Áï¯ò1`b*BDÏÍWh „õ]ts'‘$–4—³—ÑaûñØîOD9VÂ[£t0W«&©WΠì‡XR±ìà9"Þ¬fnÚ¬¼È—â$õ>s†@ܹÃ1Ýà _; :§ËÓîâ¹:!ã>Lú“Ó£uùv…ÃÎcÑ9æ.³Û$9è€;å BinäŸF[7kGw=ç/ ;>Š2.V]`pòì–è^-Ø YŽš¬ta ƒŒL04LÓ›ðø¢½î~ÃÕÝ}uó¸ŽÛ^k¥³&Œ„Cá§Q^ׯ÷–L‰}NÑó;‹âòè„rLWç•ìòŸ»Ë-‰$i!‘BÝw)Ä(˜³Á@›aMµ¨Þ&õߚȭ  üîSñgÖ.X©.ÿUפ ’Î÷p‹j²W–”‚©a`ËÈMëGlŠgÕÖ'ÔЬ«aœ3« Ê3ÑDDŠÖ{¥©í¥ý˜à=(¯Mà¼ÃÂ"Þ´ }UéÂòi‚¬ÃNýã%1òŒÖçÙ”ê3$`›Ú¬BÌ.)?0°f›Êe\‹+]¨˜¤‹ÃÌKn jÊÑ‚tìÛDE€éG²*'¯.GcoNJtú‘Ê%ñÿ Ä†© çͼ9æ[ñÊ%U}%ä ?›Ù˜Ð·¤,ÂÑ»úÙe׳‹LV +CMÇTz´ÄG{7FÕÕ¶CÍýdtzB¬Ë0<ñ›ù˧`áÅÅ€|IyÃL¾4$¦ü3¼½v²C™è[üø[À Ÿp8OÓ‡1ÀhƒlÚ=Ë”ZîR!5›I '¦Èû5ÿ(ç4]oÛQ‚ëçÖy¿€Öø uÇ»˜U©Vkà‡R˶j“Hz]gT3—”hè†Üf¦žtd=œH–+o¶z4¬Å[Õ?¼0œLñŒŽÅ0/†:žEiÙË©\4î~ª7 °‰ªLši0Þ\½i50¤ú‹Döjfw)¢x[0ÄyMõ¿+åaŠc2ÚâN8;Mãn±†@0ÈþgV"¬Æœ–ñŠÊ- •í=íŸÂ ¶OÊå´¨¢„öF- zÓŸ¯œÚúI"Ê‹_ ¤Û»Àa…YC¤" ÉLÍXÍ‹®<ö"QÃ9Tžž¹…ÌAÚ1`0 7®Ë{a»Œ¼†²­zîHšgÍ SNRšüˆ…¥ÛxÓ– +l yqdqæÞE+ñÄI ˆ xË#¨ØÜ‹)„¾~ëò…ù»¾°õ^”HzéX÷0ìÁúþ {ùd¡³Xwjpµµ¢þ¬-7 “#8æ÷ÏYtêÆ_&x/,ÔK¾†ñÒ…@䟨þ÷t…Ô‰íÃ*¹†á­ò'Ÿ_ØIü:DíÙüúó›:ɬÇ~ªèŽHHª%ÂX)Í–ìt ]SÛ¼‚w =¼Ì”Ω¢öüš‚þÑv{¡Ó¡ÓBÎ)O/xÓ‰ÔOíwBQbäLbL‰âï©´§«±u²Dœ›Æ6éoH—#yÙsôP€™Qˆ]¢z´£Êj‚}ð çŸ)ã‰Zz£›êbK=h7ClƒÏòXè•JCuh¥Kµ±’zøäÍÔÙ .ÜÑZ)ºŒgS=ÎiP×l¤a2÷䨖v"ZôbLÚséÑõøUÄòøp[GW‘"GÆ2´¹÷TT+è̇åE¨¯¥ÌTÝõš¡µq·¡Ù,ªeþÇì ÒEæ(sV+òòžAËC8¹N#gañ!åW… (ã¤9]Cö½L ì|Ø G L9½htA¼˜I&E]ÍoA˵xQŸÎɇXäa­L—-莜+!i/ÓÊŽ€¨ëZ+‰&7d7KÛMÛÌAóÝ:'-áÊR˜…›H|„ ÉßÚž,0j½%àP °¨Ñ¶¨=ù&‘ÉÑ³èˆ äS#b9ëo(l>§„uñA“®ÿ$È×°#µåì:ÓÄ{•ËØ¢Ç2Æ´¦/Ñ̤Ú-l±¯Ö øÓZŠ&Ëþ‰€½“—–œfSò®Ž‰zJZ Z¾²°,+ûò<’µiÚ­ÉÁ¾’<å¤L¹äsŠ9á8|”¦%ÎöÌʲ“ŒkS/µ¿Ne\ἆ!–Ý!»_zÈy8þ“€QA¤²"òK´Ð¿5 y‡°‚,¡"-dÆÏwqFúEA¿)”D?¤_NÖÜy?GÍO¦Â¥Y=LÆ» MÍwb ÀµZx­ ÜÅùë´ê:·mŸ­¦iR_-ÈÜJ¬š‚»ˆI2Rb—š¹IÛÈ|Àq¾™nßÀÍ£Ó\Zëà²åÖ´Ñü«s#Ù¢À,¾»E·!êßBz™µ ¾Þ …%ÍLûœÀíõXS´ª¼SÞQä7Úʈª ’ôJ=÷øü9ÆHdÞ›v 1´9ñšúªpà<³÷@™I ¹“™·iøós”´º‘] J*Jï¿0 O®…Õí,Þip¹Ç€+y*5®Êæ_“løTàΡŽZ”õ›ì=V٬ٱ̻ù8f0žáÑd$3’&VÜgÆBVüÔ”ð¢ƒÈ6Jú*ë-œ5ÎAÅÛ¸Ò êb$ GqÕT«´N-®M©'äÚw,ô è\ÉÂÕp=õPóŠ1¾f‰IË Ç³ª0µ¢)ŒšÙ½ ‘ÕUºÆŸiî­º-³Ú²gË.擎’a¿_Å%®µèÔP%q·¿\¼$e¶ê”rvÝslf .Ü4º|Àhº>¶áÒ¯ÞïÖžõK#0ç{XüBöEu”b¼¢˜çܢͤºñ’:H-Æ6𩍒 Z²}lŽÍéÉJöDÿ—6íjÆ?¬ÈÞmÑZ‰dÓ œ#AC5¡‚YrãƒdȲPÞ²-|Ö6é„í„ò ¦—}˜»÷Ÿ~^l0C^mÂõx¡B~9õÈÊÐ9ôUüªÔQx¨*~UE4­U‡y,DsyãÐÆ|I&3Ïk–&HY“¹áä+â¶2çÚÛø†¶@•,ï=¯ú;ÄÝi‚÷JxKØî•á=Ðt (> rºáoýR¸ñ¬Ye7×¾9‹+žG-P%î'giÞoÖŒ7HÛa#Ðú—¡Eáïíå·<‘’Ø– 2чùDõý<Éèáˆ!Gàá‰X†‰‹ 6ÝŒ šÚv_7åˆVW2’¢Â>sÑ’F97_´á¸Ä܇ÐrôÕÏ¿“PÛqo¶=‰~ñå!ŽX¥ˆçÊØ—é^T_rwâ5<‚½8 þpGÕâÓ5t·ºÕÙÑvC;‰!»Q¢Yo>ÂÕ§Àº »1å /ΚY†OU"ªµÇÞÑ@³Ó¢ÌTƒ†Vr×èdCŽ­êÇþmã67¢ôòH­b®6]ÅŠC2¤mÆx&‹yKB u–}x‹Tö¨ޯмý{rn~õ;]åÒe¢¥ª1&MDˆïï Ø¼ÉŸAã8¾¥â¢Ó>ùxnõ‰\ˆŸ­Š}v¤Øèö.}{ú¡º‡úŠÏ(ÄŠÛ˜…ìnÛu½¤ ¼×n¬ŒÃÎ¶Ž£gbçEKY£ ð1G@˜{ðio+)D§wdAtgx:Ý˶Æ4Åì>a6¾XHt ¸Ð‚Êm*ê%(ig™R]üÒˆ°(7'LÊrh¨ g ÝÜ]&?PÛ=æìŒ=9œ½/Ü>ƒÌeZN!åìQÇ~þR‘¯šPdCÙ¬½¨›†Û»ŽÒ9beÛT鮋ÃÞ¯áÜïEVª¾'Z¸RtP‡K,g|ß¾ƒ!–ª{ðÿsô ~lÛ¢bbæ¥1ë#CêðMYÂø¼»ƒEÅÿS{YOïã¸Õ¾\±]…¦kí~}0QÛ“&]²ê@[ß÷g—Š ä ÇMtIœ–è·ƒñ¢&=;ñÐ>q‚½°PÓf%}™ëÆØ^¬®yF–*ZH†uî,›W²K•ñDu9&YóòP/4“ËVƒ\¿ú‰‹ACvº°b‚AöÐPygr8,ç¨ãÑ–8åÕo1p˜Œæñ1N=u ²éÒùt`(˜ºóH„Ãbe«—\ÞW†š¹(\÷•r8¸Þ‰yÙ³ˆXI ‘…Ì¢."Ç£ÇÃÿ›´ªÞI#À=‡w>4ºî®l?!CBjÜß&s <ÛgrZ@*·êQ]f‹&Œ€ó ï…¸æÙuäQ/Ngtfûå+„H{ΘPÙp›4E§éÛBõW‰×s‡×³L˜Qe¤C¬,áÁiÝœ?°MõËòÁ [¦4†6ٙˑ—jNˆ5|CDÕ-"!0A¯ôë‹w‘³»€±á!µx 3Dº‰¶pžS¯¯$gqÔ2s†Û5´ôÕþ¹)ÚªRó0ŒVâèZô´„ñ3!Þ(–œ¤îNèŸDý:/µz ,ËòZ’¶'?ﻌJZ²—ùBRsÿ:⟖½fGݹ1L§ ªÎéÓ)õJò•f°‚¦Nλ8Òë‹[@¬¦Òxp™ïªê.ÍŒÒó5 Ì¥&h»p-s·"†µo¡h8g®ò~ä¾ÙéE¼`LðlÔ!¯©²d5:ÉÁù01+ú¤SÂ9“tæÚÜωPQ'‹É†&õ“ºx,3«üXd”bÉÔ…Éû6h¬]nÈuÁ.àë‰<¼§ƒî5ø?b …‹Ò ÖO Q:;õ½aëá®6›/¿£yò{”åØþ››ž#ó„ÄÀZÎy@[ˆ±¼š¬Ú™ÎmBº§ëï.P¤$ƒ¯´2G±ñR¡âèààüûr5¶Ýq}sµ#ƒ”/¾lÞ|!Cˆ¸ÍžÂ~p>‰@ù´Q/œð¾mN×Ùð2?Yóu”¦w¢_•¬2dif§×–Ò®‹È(ïlªƒq8˜Ä¢)yŽý.ì*Ÿ’P¼#޼ÆE© ѹeÞlflœ~|XÖuÅ ¯Y'Ë• éÒ—¤‘Du–ÕˆÆGØaþ¥Ži“XíiÇ#¡lRƒxÒlX#¹YÌEzaxÑôWN$¡{ÞAÔ¢6š L`&e.l^ l?”d¢æÂ;gž„) YÇÏ-õ¢ï¼NÊ6£IÓeK3bÙ°ßd ÙŸ'I1ózɃº\S¨€qW½1럅.1Ô¨'˜aÙ÷ÐbÏ£6ŽJ õªtvFÒWj6^n¤S:¾eQfX¬LêjŒœXi %µí>’WãnTPžš„žô½c ²GoR×NÒ| ‘£V®gêlœœQz7’Ω5±¸=CÓIÚ¯çÓI«xÍòKìTÔ-Ò¾të|(eZÇuž…Ð$µ^«:R²íLð’…8¸e¶+äè³C9(uáý€x‡÷—á>K1÷Ý슸ЀãS.9½¾çq·x ƒ¸Ê\Ôx)XN˜Jÿø˜ó²"•ÓT6S@’CŸí§ÎyW‹_îêѺeâ#Þ:ǘj¾-Ã,Ö§t¢Î,ù!W´Dx’ŸyÕ«iÄí~ÎC¹HËAZòKÜ<1¨ZZÄë—îH­Z€Ô—ö7ê˜Ê鹕“ŽƒH}‡jÏ©(R8H£ÉùT˜åíHØ-)ï&mÃË'\ªYè?ŽºÞ$P­QÊ(áCèƒÃ6Ø6oq4…ä ~ª`ä`Ášrì™UWÜÁ’v쮄{zœqPUÒžq$Uí]Èóã¢EŒÖ ˆdœ)ˆxH\þåšË–AÄÈ‘9/NðWs¤-¾æþ×6Ì£mà ½>¬‰:¤1‡,ˆf™Ñ–Ø_i¿ë´qÛÏëI‘Ú v·jw, >:db‚ÛúE]Í×~yiYp'VG ûfVvÁ!è…07é±Î}¢w]ó94yJÁ=”$ ;ÐK€üòõaU”¬&gIÒM<rGØ3JB–è áy˜a’3×±3• •i¼µ1'1~l^°ö ]Q]:T\Ó¸Vôn>8mï[ÍÉŸd°ïHùiÑËBjxÛ,Γ']iÅîä”*y>Ü+ŒÄ6iânïbòcŒGÔ͆¡Þ ÷ú‡kƒmåÊÜvr2š-ŠðƒõÈå“6,º•Tœ¢Hã’e0ÌBE”/9ê(´¹Âg‚…šÒÁÞ³Vó¤ k&P“ù\wuë»TÞðï=¨Çx›wФåò)UUû}ÖÀf_èØ%Öò/ ‘RO¼¨ßßJ¡)&ŽþÛϨ'¨À¨2F]·lþ·>Äåç’8¿ºO#”#GeqÔò»˜â«½eníäó×úº¨Ôä*øà¾Ÿô îªEÅ<–Ttû¢à)îœõŸ<‚üšôg):Ï–%P<>XãHü>=®nu`þ‘ÒðÉ3ÍÀ¯ÆLN?2Õ3ç+yfUÒJ2«EÄØW(Ì’êBÔ‰Ìz5½v9ƒïê;Õ¶ì Ó›^Mö†¦ž‰Ü¿8Vùfæ,‚Vq›*`g¿Hñ7¯Ú}ËüsÔ`Úµ ÑKòQˆ ²nŽî ô ý³8ÜÊPŽ‚–€#-aá,ŒL¬ÓmK `g—I!°ì¨A‚ 9fˆÓ(´üŠfõÈîu»c­ÚšC¼ŒJ˜ñ+òn£êB§í÷jœ>kvÄØkdXŠ4Ö6]ÊV>gQëºñÝä#0€baôJ®ª5IÝThŽˆÖK×ÉêpÑˉ­õ,ÉC#Pu½õÖHùÏ¢áØÃSQIú~NxtÖà=y™äÙ:`'ìÓ)‡ë'2½«5¼ˆz=|ù¦ Àh.XÁ<Ö}<$Q8 ; ÍF ù¡sñ<·°[ømùô#f©ü (-Ä»·´ùþ΄…”xM=•G®êkÈœiçÃÔ×ËØYàû›^·È—è‡mÔYo5ˆÚgÆœÙ>Ó^y‹UI´S·wÓ”ÇppqÙC£ÑZ”Âå—-‚ÌCØK‹çž›ã™ï Ú?õ_0çH=ÈMš!<ìú‡Sæ•‚ÁеÐdƒÅæbg¦†e¾ãÏ¡rîŽ0U Ú£€Å¶¥ò ÓU¤:E×~4eÙe³û¨¯Áó&_ ¤(¡ã˜.Ô,½(Í9JVÜ‚W?öÌœ¡ï&uLR;¹~×+ùPˆ!ªƒ×9̃oD´=¶z2på`÷’ñ¸p‹&bò³mÌÒÌ*P‘käàÀ›-ÿ¦Áª¯ *~ˆ†©Šµ‚©ThfmÄĎ£ž’´ª‘dëeØPüù”hI¢—«þnèc¦¡£ÅÕOƒtèë1WŒ­j[ZÍë빓îb»lð1\-ò`%˜€?˜®Ms ü3çë–t”é#vxL¶+ÈòŽ‘Ø&ôW5í§ ¼H é¾=v‹Þ/EaýcËM3/MøD7W–ݬKr¤…ûì+›“pÝ5CåS‹„D®fÖa,úÖ‡mõˆàq£C†˜Í‹27ýŠó¹Ž6>ˆàÇz±hsbN Àö—_ Ëx Õ¥vñx^çòdXšpƒ9ó»L»!aøÆMŠœµ¶Ô˶ þ­s×¥J½S:Mrê@œè¢y}*}·qßÚÖ`î›F]nã$ÊôiÄ8)¥¬a°ø€ÈN§ÅtîËÀÎÁ»ß”¬â»µáTÚ-H)ãO ¬6ô"ðé`mñbõš¯£* Èí°5»ù˜:kô&í…&Ë)Œé@-3ƒ¼ì¼½Eñ꽪MË+î¢tü6yYꮀ~”ÕµªÈ^‚.¾‹è.ù†|)=-¾ä0Mr¥ü"¼´¯“ƒ’*r˶}hì¸lâɱíú‰#pæìxV‘ªéÒ.ƒ¯ÞÔþÙåÃ7|ϹûóQfÇ¢ñ$fR#Û!©ˆ$PbX{|Óœ-v!Ã&/b6ŽrdXªgþX6u’b$h[œ+\Š:J}Q`@ЍÀO*réh…aœY fHC¹Æ’YìÖ“á! æYwØ)½S+I¼,…R¹©A›¯/¦;/–u¯MøxÏñ\šS1£8 Z™Ü“À𾬷‘Òôli¸./Ê»uÌ™=DràëlíèH<úqv‹êc´ÈN•=OÍDrô4Rœ$ÏN)Ï¢¥R°iÈŸ›´Z§bžé˜ì’š'ŽÅúûbPR[R7Óƒ*wv†8œ»r€vsCÒPÃÿ¡†' ÒÖ€§éŸ“ïtám¥6挃¤@-³¸nCx–°%³e`*.ì³wkæÙ±zŠO¨ÁËí6UI¤ÿJI¤FEv_'ñ× æjpYH¿°×vY†ŽîC G± U¬©³IR9n -ÕQT2λËAp!¸&²¸S/ËIÈÝëÝ8{IÝIý.Jôï¡GÜ÷jåWužÄ €nÙU"Qù- áডÂÙýy2£É5—>%¥òÁÎ"ùK†5b›Ç}fm™˜vš•‘£#¼ëÀå&ˆêŒ5¢u,@i¥‰pö4Aî5iX0”ib†¶€ÅÆqE#iæÚÆSOäýh­ŒN¨©ˆ{´nq©äŸúVF`æâ°ê•K&¬D¡ÐO“ êïÉšÅO:Õ•Û ´†¢36¨².ñÉóë‘Ú‡`%æK. @|K ávr é/|L’­)±{ÏâœFYh<³WÅ}ÎÊ}0'Ô@_18åMt18Õh^‹ò,š¡fDCu¨ !1Q+ø·oVzÿµomz_MN•xøRM•¢Say®NÊ¥/ˆ¹Ñ¾ŽZø%FƒáY¡&Ÿ­UÀ/IQÈ+G2Fc'0F_Uõ£<ø y@+TÜq»¦õq­×@’•¢³ªæ«Æ1m¦Aè²b/iilˆS2Œ+ƒkÝ¥“Q¦Ð°f›Ê G44(s.Ý7?O–£sÔnõ=£F'0ÙiةƟ% q^ ²@`žMÄÇŒ5 ¼Ôl£«M× €‹W®'mä¨]Èã.œì¦¶e,òÄSe”ª TÄfp”³ô[/^öfVýÒŸ! šFì7k†ïÿ²C²ª¥¼—ÕÚŒ»‘RáyÜ®TVí ]Ó‘–ú»è O§)TÆG[àak :¼5¤À'ºXþf((7ÏGÖ  )®2Q”’3Ö¹‚T¦”'I“žûÌä-Eõ¥•¼EûÓiS¢_ËoŒr¿¡ÿ šdÙ®¹{|‹1å æÂTÙ= LhVÞªœ›Z–µ¬Eвh·6äJ&Ái«eY G­Ìý˜¶2ŽU=S÷vç0åOETwaKM^õù$ö1‰ŠWwBÑ—˜µ†×¤b&½¦¬#Rm\|ë =:5é°Ã8 ¶ºÄäös–ò?5è|¯Oéü[8K·Aì¹Ï,”kU Í=  ÁÝ]tðZa)‡±nh‘SÖ97Qq‚ý¤ö«©¿yÄý‰¡}LWª&žwX!8"ò3Ö¡íÔµÓ9O¨µ}Ì#Í[>Žá:ž4_b&•i Z¸‹•:•xéûH«ëÊïY¼kZ)X¡ʳ–g1«Za:,i*8!ÁJø©thLŒ¥[HòârXï Ðñ(Ñ¡ƒ§ª·70³«™¿Ù\6Ì%Ü¥A+'@næqòú:œÏHNðöÞÎCb`³xêõOt“w˜*Ú¢žZŠp9µ2"@Czî¿ LíLcÕ™xh™fYã:Øòž£!?ËU$Fq–é¤ê½ÓHÄ D¶G“3ŽÝt$7p£° †½maTeK›£-x7X”ùéK¾#ŒR<¬"¶ž¯`›ó˜deMì¼ç„ZG„$Ü›i”­¿ø0Þ`­9áö`gpü$qôÑ§Ìø¤ALX—֖¡ Nk49ÔTû×ôÚº›»¢®V ¯»ß•ÄK=¦¡x6—Ÿi¸…(4ºÃÓ‰åg/³½U BXL±9´k†b‘@È«µ‰ÌÄåáGѳ®[ÿ`fçSm­’ p Q\my¸XÙ*£"ÌJH=B! TE­ö—»G5W`_8/žž–uvVõsÙ;Œ iRƉèQn [¥Ç³WÕ…˜“œ8þ‹·£íÓqØö¶ðƒn5p´œ^#š)„FdÙ¼MéÖGÙØs[—P±K΄à :Ëÿ@ˆü>u½¤:‰ré/'Œd!*0Wj L`Ö ið±‘Þù‚gËvn“ˆ1‹Æì¤÷òâcEê…`¿aÚHÐÚ Ð%®î¸Ó3ÎØà³wÓ0Ú› ÒN tÆŠL‘§! ©a Z¿?GÞk‚'Ðaæ4¬ Â¥s÷)˜MýA8üüFœ4ñ]mãÍ#Xž¼»6¡žO »qdæE§©Oz,Z4B©¢Šâ6<¬õsÑöpÙ„VßFGº“R­Jªå’g£|;ã1ÈÉ•'X¸èŒ-…ZŸ‘æ‘Í^Dswõl_zìõ#1’œ}î6B@r”Ϫǜ?ÚÒ˜5F¸)˜Á"Uii ü§^ˆ!vRõOû®Zï¢Dˆ’õ˜Ý·ÎÝštyµçÓL/UÝÒm’¥qAÜçÕÆ¥$±\¯: ú,eÓ£°&kS÷i½PófB5¹ +ÛµKJ¦¤1˜‡’ äQuÄB2~? .? й´“¡;æ†ÇE¾`ÖÍ÷\Ë_, ÷V×E,Çú,jŠ+¾-¥¾j4ãç}¦EÂà·¡¯(X‹Œdq-Ê[ÕRÉA§–Þœ -ÖwÜ)gLYTÁ”Eì@3™Vìþg‡ó}ô Uµ&×%Áz`zcÐ(}ŠìåÄõtƒ¦Laˆ\Ø3S6^Z¢–TĽM @Ï áN© =¯‰J54>Û(Øš;¨Ì˜'w”ÑìžÚªÆú€5‹çw ž¤ìZËJš8/ÚÐé›á÷áÍÎLÓv^ÑŠwV"àݲ[èÆ*IG"¹&4~bÁŸuPHOQ/Qñé?ò{Ýú)ñ)Ù`-?궺e*ÁÄ\ä&1h£{óËՈĂ·nTÙÌ+n§¬'-AJâÈj@4¿óß~m¹Úsæ-ÈÇÅs¡Oॗ$‰›=¡vëFfjÕ{´‰£çÀH¤§”75PëGžšì¸ÚŽ Új>ý=Og]ÄÇ” KϺu¹wNR¿}êœ)5öëyâ ÁÏ9§4p»Pj!ˆbHûèœ7jšâY“+¡•®|›&Õòn GA{JH²Ê¢.´ žp¸°¿µb“dåXö8((fƒ:Ïj ø,âa°-,:è²…~UòëMà•+f­u6˜†±Ë™ª´ðdåmJkØOnŠØ¯`BÍ0^$Xlï:Å~”¥s1ÄMXà]K*ukP‚%…SEŽON&°za]D5}5ØæCPçK70 Í4˜$ó1ää®Ëxµ)vø~øwåpϼê%dEL°±K[˜Ú—ÿŸûŸê|½?¾ýÑËKöV軇ͦËxP£ãì#Ÿyøøƒ¡1Ѐ„?OÑ"‘'Ú©ùþ4§ØÞ.u‹ð?³¾ß`ì(þ¥v=5oqèb{~ºŸ6ÄHoÔ(s;¹þ]ìa³w 8b )r„bÀR0"-cbƒN~ Mk&9o£Z"& »“†vÇ´'BèËzxFU._l-¡PžKë³#ãÖÃl{â´“:å¥-Î3¦;¾•*bóS’M³$–´Æ¡äºù®žXú´ÈQÉšNVÉR&¨ZOŠÊ]v4YìVŸ ´|âBh¤1^MÆéчµ«çÈ~ªÖf:Á«ål“Ä¢¦`@Ô,pjm-Êcr²u£uZtÐg!Ñj ÎoŸ´y,HÑ<ç>2ì{Ñ`âDbx]cÐÑŠ;ËtJ%öìm•tóÀì‹ö®ðÕÇk|º@«¹Œü¬¡{ºJOá§Ã´‚¿*Ƽ”d»z‹Ax¾¡êˆ´‹!Ç­yAJaÓXÆ_Lzï’jÄÄùe0ðvwt¦’Gé[H;zƒž'v1g+›¿ß¾ AÌ%Û6׆®;üZEüB’}Ò ’ñ¤[”±ÌLxÀØ ¾MMEÁå©5IK«æ·—lý%s®ã8PÖÔ>’ ™X_}Í¢»Â/N~õ²’‡œzåj‡¹Éø};T`ƒ%=ûw¾·¥ p[>ÿ†7½ "©G@=Zê…4,ª`nÈW›Ât‹{«‡í¼EíÐSVO°lh< =¸ÜøŠiéÿž e;¼ÄüIÁÂ.-,¦dcq Ö,ÎÜiÑÍM=ÏÌì=ºøƒ)•ï¹ùmØõŠid·U IžA)cº4¹úÉÀD‡+åÑÀÔ`GÚ{—ž¡½Xq—ûöCíw46œR§)T>íŸi¡U_ÁZUŽóýì»ø¼MOñû{f~0M6§”–"tùåJS´åt0ZG]z.›Á7À2²Ò" mÑx†}Ò%×W×NÚexÙb©$LeŒÊð¼–6›d©æ©ê8ýÂK&Ù=ûTÄó @|F:ٷφ Hxyˆ“ÎÏ`nù/êÀtœ™>¥iñ<®ŽÖŒïö:{ƒv¿6(EǤøz¼tÔô€Fš?Ë a%™¢IúËÅgâÒ¾yô¿ºCV³ °_Õ¶îjí¼ßyžã‰ ¡¡×…› û%Ek"Å•"^¨ìï¯úŒ^}^;(w·\¬³ðL%FUbly3$ˆn¯G†Œˆ|á^¥wŠBw°‡3?KU>JçÃÀw×C e¦¢ÖúÙ§ÏÝ†ã™Ø\(äÛE—šŽuÓº¯ÎOC8j9eþF¥ùvÈbЍÇ£ù4L¨ ÄÉZô˜ôæßêîµ ]*p{ßc}ÏÁÁË@%Äç~Á݉Ó7Œƒ„ œCK zp~J¬Õ¶_ÒåÖpK%Ÿ]M—R=q:–ÇM‚€Ú…›W}|97ªŽå, óÏÅZJ$ž¡ÑîJ’SeŽ8*8P­ó Àå¬)Ck]¿Mîj”ôÓÔ|*oóQ‡#\$W 2ôÖŸ5/>ÄÊv„j…ëûË.èRÚÌ34áB½Ž; 7P@YÐúEWyÃóÊÒO«Â©ÅÐ/WN$Yªq)©û… øb\â5}¤ ûLwd¯zƃaê?ö‡\[/–|òMÏõét¶½© Ø ÍNÛ€c>œúóþ`)À>\eë³Ú;®ïW˜ÇRz®…€¾²e÷½a\'+œ<< Ú)Jv?9jä}âæ8±M€èz ûtŸÊ¿_ÇGÔº b\Ø6ëæ—Ï\“Âß­æGõDfUÿY|ÓÓ†¡6à¡uº™ÄËêbÓÊM`â¼*6‚·\}¸_åX±úܨ p²ù(¥¡D“­ÂCoy|¤r­y=Òk8)­» jT¨ßŵwzä«úËypŒmºº«›!éE7¢œò+wÙГæ.lYGœxN‹7@Ù| x\˜¶$fZlÀõ{-¸é4÷õ+Žê QÈ€¬¯PËU½óŽÆÝÙ‰óg€Fìð4SZ§ÒK›Ô¬D´Kõé"Ju0²ÛÖמjÎZŽÇQ»»=‘2t{á S•VE³)†ŸæÙÁÖŒbªîJq¶d’”Þ8ºþñMb]NzÎÕ/\J)Ym­ž7þÐÆêxÓ¢¦ ñν‰DÔÁðøvÜ*¼’‡7i'«×ty´{ cl](J2wAÚêëG.oëö¸eO@®wnÑd÷-âN›!þì(yd%[.v°çDµFݱñ÷8òvîö‘†ª“2tïXMÖ©a˜nL²0ÞþL¡ +4hÆóþ“üðï<_0«»ú¡p>úÁnó-Ä–äÁ~-O ¹Üý¸“¤9í.wi¯™©ÉíŠÏ_QÇ “ ‰ zâ:cÁeE˜€€•knó‡‡ò.ÒîwHAòÂíÓì¯G.ާyú÷Æþ­ÉÌ’¼÷쿇’:UT$ÛÊ˜Ìøòôñez.z­µt‘ ž¸ær=ýÎ’5@+âåšè èÇO[JÙíµÈÝ‚ãew1ÂßÿÓ«—g¹¬ã ÈÓÇw†e¹ûgÝÙ©Œ¼¡'dŠß+à»;Dx+Ur 6Eã VêAs´áÌr–µ¿L±›q¨iÉk†‹ºèr$' 9O#ûÃOVVY7)¿Ãk?¼#l|ªèˆÙ€í¸—•p± ×Rœ xM¦­á3/]jÒu¥@R>›:žë[ŸKË’xTM×[ß¡Éç æ1S'îÑÓTXúòùy#´Ž•`y2•‘êó7¿›ºì«Š+抯 ךá²Ä&œ}^/I‹¢sæ ‘&Hù³—êú4[ÈæåÆ{‹X艓“µNé†{Æp@¸¯t’ðf'ž:µÑïÊ^\Õ™x˜€âª-ç1´2A2e(sËáÈç F÷®Ë×yÙ Zœ¤yWÓ¾ä–üÆÆOz‡Ù}’EÈ-®–o+û®ì³ Å!Õ³[ÃífnAÍ÷š²‚hœ»Ø9ŠkÃ\³ æ®>ta<Ä]'Òjz_Äcj#Å,²D4VÆ\6uÕGê¼VzÏ4³lÄ2|›×oxŠ&ãDQP°ÍèÀ%-C]´†7ƒöû—×s|f´„mhù£ Ü_½³Š0z*»¤¯¦G1ÙÆòú5R¨^#hÅ}þÛ°*…®>‚S@Ä£ì:ȪËzØJɾ™‹,Ë@mf“@v˜iÐÌ¿vNË5ÒSƒýšå3D?[ò¸í”é@Äp~q¥=‘9³B¨Pøön„L¥®ì,Ž8wE¼ŠšQ~p´pò „¶‹M–q uª0ÉÙTßÖ<|b.Ygâÿ]•êÚk¦ƒÄƒPŠp(;ô%ÒÆÝ®•éO=Ž tTã×"$üÃÝbGâÜÅ•‚ YÂ<â„rÐ$†~ãÓ߈¤2ÝÓ‘˜=VÃù ŸV±!B|‚ç–]ôõ‰º=þÌŸh0Õ»jÔ¿lih`Ð Q²ªdÑ.Þ‘‘aCÖ-ßà_E¢·ë˜žïèÙÊå èפð™íõϤöÌ9c›v<ÎÒ‹¯„]+muJ3¶cLºi2ŠÑV—‡²‘×Úïq×iSIF@/¶± 8ÕØ ¬›ä5' ð÷6h†iuf¤ðô$!ðP3@ܜĖá¢ZLk¿çøî¸Cq.s7q1–]M=¬ÿ5[CeRÝtlÉÉ¦ØÆY`Yµhíq¾Eo&$Ðá rúdpŽÁ‡ì.ý)>蘇Ê<ã¯GèvÌù¦øk‚‘†‡—7`J>§<¯Œ¹«Èíwt 1›‡9 cª‚F=G¯ÂUo¾›'wA-Òóö7œWä8{¿¤oïQv©ÛŽë_Çsrq”E–pdQ~¯JŽÄc3vF9;ýQ4ÏÂÚ¿‘ô™ýùUÅU:šð÷i»©˜0f„qBõ)b|5Sä¹ÛéOÁ~Þ¥ï–Ñ ,_iÌ óv  ;"™"ãê ÞtB @ìz±ÕùHØ@ò²ÑÕ‹hŒšL/BPüåiµíL¯!6![ûöYŒ° %GtÚó°äNÚ¨ú ×T%<èãûìÕmÉWŒ=ÆëûÅÿ ćåõŽÍ„TÈ}ýX|î˜GšM˜¢ôÅŸÓBu;áæSucç8ljò7=•^JF®gÅË.¢×À.>DDØ?g…–Vµùe¹Ã¥³Ñ ççáZìÜuxza»Ê^¤êW_E™]ÅÞÊŽÐ9§ÿcÃL¯uF:/¥¤è %p >yC´àu] ª z_5ík ÚË;\Ô~ZÃA¨{\T–W•N[Šà+q;]ßë(c˜»ã0óG"qcöÇH=’aUßÀ“ÝÜ­»|6ÑÔƒU³~¬Çè;§ˆý™ sÔ9_G±½9ôxqtÔ#£¹Ñ:îuAµÃö8öúoŒ9H๠2KTg—5ÏV+ÃA†ª"ÕhÔ¬k¡HiLBážJíôW4¦¸ÐÂx7|9y ÝM'2h|×¢Pø&ûçX0c×.“ÿ‹‡J θYe›ê{»D‘@|†Ïã½SyQ£øi§èZÞQ¥"Þc/B󌹅õ@æžJZ7t|Õî÷økµ#ů+nïa"ªÌåÙ”Ç'+¿-!KSnhsEÎþxìô…VñÑôå 3‹lžx¾Ÿ¤´ÉI¿òR\é¬Ð„]A ÂC—ˆš·R÷ìÝAʈ*àù°#PÈ,“{K{ÈHן ÞD¾ì½l\Ïz8YS&ÙÈ_Tæ®;!(“›b;ßj1ùX Üt¸ÇÔÄ‚„è1ñw#ÀнÜ4êHa««µÇwÍôIË"$‰¤{õ‰Þý—u h E+—M+–lXvöŽx^óÕÐÄ2¬:©| µIŸü€‰ïµ³¹„B‰¥0^V¨×¶Tòau•˜kä9ƒÀ³‡˜ !õ½ d4 °ÒiŒ[@±ò|X3ï:.͆ǹŽSð•ª× Š«x¦è«Vˆ¶ç.‡„*’š®,*%1uä55ÿ¹î©€I‘ÈC)µËå)˜ëS®žœ›“d¨+™9¡èå/^žÍö³ÛéȰäÀçl'<êû”J_)j‚e§¬•¤}ip§"÷k§,(î0¾;—jù ÛŠ2¤ÌPg3DM«b„S®¹öSÔNYD+ƒd˜Eµ€/J]¨ÂÔóá6ñº5t•Oj•ëÑåÕž¨¼ú3“0—.¡­'iß?7¨íVÝ¢PÊé&éó[߃#‰î~RÉé ùT÷¢þ™#ÿ>WŠË¤º­‘=’a)S²ã½%n’ù¼ù»¯@í„ÅÚ«û쟼Œy,¦¯ðìÜ£aæ)É;S©åÊlqò$yhÙ"Ü&pÍ™¬üº:ð‚–,¬ía>ʆj¢­niªhyY ’zÞ®ÖéÕɶõ±"<ÉÖ´9øøçˆWfŒkŸÆšÕ4ù¯‹Û¶¨òFF[›r¦º‘zø?èÒ¸ÂkÄ›°÷¢ñz/ÖCK6]B)cÚDVZ*U¼Û„›*(ÞhZÁ° #ÚÆEGÚ,©6É7ú4ºÉÚ ê–å´Œ:ÁÕnƒ€Ø‘³Ì°ž¯þµ.ÓŽw)“²×±žâðmKŠf¼7Q¿‹÷µ=c…9$}y`ý^ù·¢Oõûxô%KÛšOôÏV¸HT‰ê¾¢ÄŠêŒ)6ÿõrùœ“¯ÕöoÈš”!{׿©Q¢ž--øCvÙjªþh“5k-¸•ÔïgY¶Ç×"ËËD1á ²â¬lXLwÃgé¢ oßs'2÷o?м·Ù»ü½e³ZúyÖ¡éÁ5VN®‡ó×êÝüÉl†ðžU3^“uèçf.¨OWb—£ð>ÙW·&eƒ´ˆòVÔ^hÙÓuëÀ»;DÞÈ^Ê1ÞÖ+ %·êaöNÀØW9p»¹×Y‡B_i+³Þ°sÖsL\®›g>X§ÁÛãHîÐ5¬ßÔûþ4t«Hî3óç/áÐqËzÑ¥ì4$¡‡µŽiØ… ÈST:g˜Y*d‰»m£ûl“C$.Ö›’Ž'E‘æQ AvÞ*1Hý-–=çéC$}Õ®’»TK{VKQB¨ä|cgòO\*ÀƒÍ3Ûãgô0·J«!‡ Kã2Y²A¥â¤8ŽÌ‡ýözd¥?妛U|)\„<<}{0y…#ë)xWf´H[h¤µôœáHWtJ!‰)Q±¥){ŸG•–k¨¥½Šÿ†þæ5¢Gz1“í%þÃÝ¡ñ—]¥åe¶ád ÅµpÓ°Lëï°eN³ZKó½.W4!Ê\ úsÄ]«Û’¨Ðñ4×­Pz Âg™¸Z¡îRöfÜ01òèN\´;ïß[b( ýöâ¾åžÃ/5¿•¤¶(ÙÓtÏÚ×O û›n5è|h¢Ç¾ØHxdV]£K°Í¾Wcy]qtpölö¹zCÆŸ)z\ôÀo;?G턤(˜±X^ÚXE0¿@N ÷‘T…ݤxžñx„º° ×îW®úê‘ûÍMFÓ š²§kJpFŽŸ^«*vfêB1˵Aí]kdqïÕ俜 ¤¯Ç7¢ŠåØb%ñfÁÏ8K¤›®”SÍ} iEN% [P”ãdKú£cŠªð5”A þH@bM5„®«UÎÃgËÌJSt§$IÁǪêJ ÙÙ~> Ó—·»X*( X9ôUõéÖEíÊ÷ƒ¨ä÷z­¢±|Ÿ–’ÛÀ‹Ì§ æ ¢Œ[5çAؽ²ŒÔŸ;»ò;Ä=<à"4p:uw*bw©2Þ¯ŸF?:õ(›H9É2ž~¦d;c7‘#¯h¢Tѧ©¶uû›ØÁÕQ«}QsL/£Ï§(±#¬ÃW/p5¥ý¥´Îx¿Ùµ»T¾¬²QTr袵Ί! ¦§õZè™{ ¹ð í†÷›‡Ü7’Qqž³Ÿ±”˜r5‡¸hˆqViÒ: "ÃÍZе&»³ gÞÅ‘ S'¢m;ä;ž› ½ªÅj©»kÑoË ¡r~xÌ#ŒžhÅ*Wò) :Ü1K‰ÓüX«øa~n7¢bÅaO¾=¬û[d…E’R=!]ÇÄñwÑòúÃŽ47L¶/·™#;:âhïf/t­Šmõr00›6~úX¶0Ì’ŽÁ•ÞpÑ,àq,)ÈÍ)€×D'Òa\:ôÜþ—UvQ ¦ÛÓyo<-Å%ËÿeÆ#Ts©›cºèËôV ¸<ƒnF ï:e7©‚IîD—ªŠ-”–¹ÿ[Às ì‚Ó»÷—›ÒU'©ÉÐå-ºÓ#ONpÿZÄkÆš<”§³ÖÇã^€™3À¶¸#u&HòŸBò Žfôò‚HíôƒD]=·Ì} ž1•ËÝbê‹„ Å¿*OÀ‰ª~Fí+yŸº+˜¶™õ”\÷f_"4*°sª¤žˆÌ,.×Ñ’+ê¬flÎø•¦:±ÏqS¹B7 Ac¯$’B¥©ïÅÔíﺠ-P]ÝdÌ‹4Eëˆ7^øAÅ {43µS&ªŠ‘ö*5'Þ úX+ÎÁßûz˜Ü“¹-¡ìërè†=©fþÖK|,ò˜`ƒêc§ìj7ç’õµü–]‘#@ÄVMDohæ0ðÆwí×¶‘ä5D÷—'"ŽWníTÎL€@ID ›Âý½ÕmJ¬L×Îh> º€Rnüµï~R†š;ÅÃ-0 …S“·4Vœ¯fjª ‘—.ÜWÇY ûe9_ÿPBÑX Y¨I HÓ¬¾BíÃ~ç»vŠ•m|pżDDûoŜΎÎUG§.n´@¸ð]¬²Éå²sZ§§BϹ õæÊ1šV“|£ój#tíY½‘5ç{5['ZðZó-mŽŒuèÕ±?æ{ªNóÞùz 1:ôÃè ü–‚Ùˤ­½ËåiÍÉì¡ìæpSòù gz w7“ˆIÇ3Щ¼/WNœ@òðN÷\@sie½/ÔÒäTRK5*¯ÑóÄ€ðQDJ¸ ¥õÐÌèyèé¬=›É@«øž‰›r´(wli.ÅHýqdù¤Ñ¹ÍKÝã òI•Äyšê)\Q0컯^e&ª¡TP;¼ B#ýÑTV…Ü EõæIûÚ•éÍe¾›öÛèÍv'jª°ån¦& .Ô·°Èט|âÂMÊ7G…å¹ç¿-šþ¸ÂCÏ,V“l騡6 @¼õ<ñÁ[tBôBZ¿~õð4yù†fÏd®ã>ʵ@þ=óá}ÆådlM¥ 9kĈDÛOwYÓ̃! é. C=TCÌ9ùë ËM¼Q˜Ñçar3fmÃÜ+,ÿCÊ/Ìd+¨‘k=QjM.’œj³¯àxoþ@ëw=Š*æ)eÓC÷–&)ïÔð‚d¥ibRfÄqÑ„Çð†Ưë5¹‰2hã«í 0ò´‚:mYqǾ#î¡Ð¾œ³Î%DC²€\¤9ÝZâsœäÕl/še,éb4Ý}€Û/â¶•Û$€Åµ?[¿ÎÃ6B¶-ïNà ä²QÓvlÂ-t+”¨Z€µBuy„øéZìu5@€Òu…i9ØCvÉë÷î÷ìtV½¬-õw¡ì_ï=2CËwß‘>Ãø/NoKÅÎ6´àü¹,¼L˜í»—Oó¢â‡ñŒCB‰uÝßC§j N‰Ž ×g‡°àòÈn#fÕÅö‰ïN¢0‰:7Ýe-_ÜÐûä¦|ýM çv\»ö‡R˜SCâìáûL‹Ù£ª2ö„óxíd&"ÕÔflæ3Žn4ÎáëØ1ÚÑœf?øyôÁ¤K²¾£…eç>îz|¬ºÊÎM\àØ4Nj€F‘„,¶6bìI©Žˆ”ëÀl„<ûo¨Ì·,˜ÁÝ)hÔlÂ4–²ÕÎN2kÖ“Á˜a0çF”ÙMéËcy?)ÀãÅ­¿„=GßP• „í×CÅøÝÔ4óÒ:ïv.­´é27×–©Í nº+<½b”‚¡*Ev¶˜‹àý-¡0Wàõ9w: [ ê'Þ™ ë‡Õ0o–sc=]Áˆ¶aW#lØÍÙgãGyIñ4ƒ¥Ù—-8²§*·‚$2"×—2¾?r8ßWÃò@•!ºÔpÍ5™¥°)‰è9)ç“íÊ“'Cå}"Ô40ÿñG¯”7ž-Ô7³tp¥,KîD:5–i¼¦GèR9ht—Ø ­C%cú¿–üñ•Ç+ëÓ§Ôƒ9êDoäkJoumÿye¨¢ùóA9ïnàräa•zÒËÙeÑ.Šã€e€Í0.U¸æCV—å'ž-ü¦üŹߜ=r'e¬‹™'€CkÁ˜ÊÔ&ÜD×n«@É×è‡*Ž£ªqÇ3ܺ-2aJ ± j6‚iwÖ éÜÊ#>®ó´åé1%žk¶@q°IôWIÅøA‹‘J'¥{SGrÆ’|%i…v} ÷¢ù턬uvuo™dsÔ«ˆ£\x¨‘Ïö$C)¦°¼$ÊÄgÖ–ìùñ᯷)Þ‹à,Õ–hOa¦tÙçi·ySÕ¬µo~W®®åã«–SépâðØùTf Òy U"~Ò±²£á’ÐvóÍc-R+Ìêå&øãJ¸Šr7½ÅzÊW­ 0ž:d‹Þá Uuw%»¬kÑ0ä?Íþüû¿rý·qØ„ÏL HEôË@+¼û„£Ã Í6ò,ªy}|Íio„a^.S ÊIeü-èê­õŒÉ‰aqÔÝM¥‡¥ñQÞœ6,°¼âI fÄÉ©ÇmHÉÓxZ`åØâqáÊ|·k,I„Õ`;¹ ³Êä p³—HQyWIÔƒ#"“Xò=%$Bx\AÅÌIQŠiÀ†šiJ­"ƒ™†c¡ÿ‹ýI/ˆŽÛá×Núê' ös#  qƒ@”í¸DÀÙÏDéÎ'/…xæmБΣÓ"û/ŽŽ%“ÈF‰¹<¿-.åHÀÚg2‹Ë&Õôó Á3Õ “Ã/àœv‰wÆm)¹Ÿ0çx¹(8§ª‰ä”sj[ùÒ«g¬-ŽÝŸPš1ÃЙ=/p$²ân´LED;ï0{æ– ¦08)3VÔN“_ȵ…–êµ±;¹:Žì¦¸eõûyÖßõ3§¾åÔ¥‡~ƒÁì™ ¾–4ºŸ$ÉÓ’G?ñç~½Ýà§¿°e[ÊtÞ!àÕk—ËEx¢Ö S÷KÏœ5@.tÿ´/c4 ²lòàˆéÅ91_yÐh¿—)D)¤G'@ Òí¿ )ÅP1{zèᦗ1uP!$Ô~±šÌZ'tçƒ Lö¾„‰Ó˜41Ëþ8Ô×^îЫµ;TDÔîÀPòlÛ$D3߬žÕôðB¸¶ ŒÃÍÅ>{É7دxžž"¦I뿚;=÷H9¸lao‚DaäMq£?¬UÄI&±%4…P=3'Üë0âs'¾úQäÅR³ÑºFK¬"?ʬeí)3ôg:à_ ªøL4AJ=Š+ R¤îQVþKsÌÕn&‡ nÕY žTDâ%«OÄù€©ý-*ŽÇD»™ŠÖcÁ2HX¹ ^OB«|¶ŒLýdŽe§Øñ¾Û'5ÖÌçWQR¥W&.$“S¡ô÷oRŒc’nk¥ø‘¤ <–mpw!äŸå¨mfË':Ĺ¼çqÕ«Ê*†&©ð÷¦ó°¨Àè±Ü1©£tñ 7Ю­oßød ‚¦™Í½G |‹R: 3uöœ¿ßS"6—b–§—<˜žˆ`Ꚉkþ±|½Ws»! ÂkRÁ¤Ì%t¼ª¤^t2‹ª:ûQa!7ÉA4 v^0G=[YßÜ:.•Å£\#a.»þ^t²±³˜ÕÔ*ñ–ûC«WåÈÛZŠÔ×xØñÂÍù;å|Ì›‹œy;q¥½>ªsãú‰Ð=CÜ©¢…±’ˆˆòzn‚VËÖT µ% ±Ñ÷qYìÛ܉ÂýSÖ3¦§å Ujq÷×újNµ-Nc/«†3Ö0‰ Ðú­{))W)¡Bí@à€§Ëwà0ùíÐU¨٠Õ_ãª}1ŠiF#ȧ{øgf&jÑŠ2œÕKMÏt] ÐÓ©æ{‚J“IRÖ&Eê­³T˜ý ®å¥>µxÆþõK{äÍ^b4ao]¯¼ì/ÔqL᣿LkÄïþ¹ïÝ=dƒÚT!SѦnò|†N´Öï•® ¾NáYCd„œJ­œE\é$²ˆ‰â|1’ÏP”œ¤u´à6„ÄÐíœ5B‡îoÓ3Gáô~+ 4Se ­œC¨ò„Óý ¸ÆàüÓ…ï´skÌü'RÈI!h¾Ž¦¬‚, 'u$/^Œæ»µùßù.2Õà—³.-€Îïžj.,:>…¬nâ¾' È’ wUf¶RáÉDˆØ>ùq™~ÊôÒ äÅ;ŸµT߬½Ñ5ÂV,˜Qį;㣽Gßyfðm÷½½™ù5¨†ÐеÊÌkVƒä„ù<´­»ú`V`Xצj×"˜ŠšQ¶© íœBhð ¢W…®\ YÿÁnšß8½®YF–Éõv®C½°"â[Õ—"‚ïE>·”h”i_^ OD)@Uâ‘¾š‘ƒ©}ç5ËNð±+—Tp/MZ®nq•*Eµ¢ì‹u’¾2(V°e`7’I¡Ÿ…‡HÞÎú¹oŠ…P¼&q[þ1‘Q›‚õiùe±a¢„TË·µ™Ñ,cˆÚ[ åÐìU3¾Å.E¿ø­§;„:bVBk®oe!®ÿÔNؘ:@½§çüÈI!…žtH!’MlˆÕ¡EƒßD¢¡÷6ƒ†á–„ë\ÞÞßjuò[ŸÀD(q¦-l\„†XM(®ç·eÖmbªf "yœ µ°ßÙ»¹‡sg/5æAÞ€X/!ö¦²“öUKyàÚòæ¼ïB2 {Ó¿Uš*ôÒ”Ñ &–^&bÊ©LÃð \ a:«b^WÁ"ȽqD:€>A%®«{'³!ÛÄâ½Ìjž:åYåŠ#ëô1u–i(JxÙ5$~Ôì@=w¼÷ŽfX#3õpÁ LfdÜüÈö¾Ÿë½*GɃ3˜=ÃÑqLÍ´•­¬/êÏÏaæÔ ÍÖ¥qPq_¶ ’/…Èä(:Ò#ìYqñ ¨”¯qÑU‘JÌ…Ÿ¡½¯JÔ djÔØŒ€ŸÆœK-ùÓ3¤é!Qûtqeœ:3ûiVÃÀ„°L1=ÀËçkÄ= (¾à1`r¦aFXcø­‹ZÝö/÷Ä*ÔüHÚwÚp ƒôÛ{€ÖT½¢9=°º´]\È%ƒ- ¡:‘Y±¤m£Mšˆ¼Ù$ ¨ ^uØ– ­l×–0×E22ÇS9wpíj Ýd3BÍjÓáð‰ÕÕëe(çr ³ŠÆùÛ«1sλ&½û‰ZÙÇ4*ñ+˃ù ¢næbÙh§&BHÍ­–ÄØ)g–X(µ'­.—i¾Ð…|SFÞåÄ aWtžàéÁ™‹ÒhœÄ,2ÜcÞ6m×gyY>uíWÜX7òUue:•[oz9×2Éë¶#€Šw¼¦(Þ¨+X]‘Ñb0Ö„†ÔÇž$ÓosÄiÝü×G8SôeÀˆqÕ$­qºÝ´ V¸ú”s>h½£Þä’ô„»(á•‘dë{=ÏÍßFµœƒÒ;â²½äèߨ%Á¨&çj|ÚÝ0@ ÕZ+zŒ!œ m›…üïoöößoWð,Ägû6êÞ5˜ä!öu¬ˆBQŸøõ€@=o”Û ò(ý`ÍïõD€²…‰`û‰ÛnŸo\¸ƒs÷9‰ïð¢ÁðCÀž”zóöOÞï;µ†ý#üsYÓ’»Ýµ AesåV’duOˆªÑÃŒbF«ÂˆWC8%½pߤ93áò9¥oLå~’®žá¨©–ü°(µ?ëí“?æè.0Îäqs.Ýß5ó¸©ßõ°™f¬²ìÀ¥ ~À0Ö·`iñ/O´nȃú–´?!"1 `¯˜ö‰¿7í±Ú¨{ò—ä}·Òñ>p’ЯáyO¼I]‚StÆê<´ zåZzvV~Ng^Á§«Á=ºŒVßÞO.Ÿ*çWªÿËMSç;вA'¹W?*•±X?‚ëÌØôcɘ,\êO"oú9÷$rT{9>PþùrÆíK1)¿®} íi² ù’ÞÅÁ6›FÜ~Ç"w²1ÏÙdQPP7»ƒ«Ð3cÛ§ B’DküÜópT´&”µ° ð€¢»h^¾¸Nتꢣ\jWäjû‡ÝŠ2èÒ£S¢A+Øñ0F«£öm¬DÛyu´¶fAhýd¥ÊÓP⦭’Œ˜ƒ|áýFå2˜’¤ ìϧzÝ.å˜ã̓ŒÿÚJÍÅtvOÕÏV’wß&O|ÆtTzìÆÊ¡ñØc'¦è[“Lƒ¬¤Ç‹3sPÍ…%Ýã@38ëá;Äjå%ò[Þ2eVa$¿_nŠ1´îcâž’b$jl|°Öõ9žZ8T‰Lü!ºÿ±Õôª‹Eú¨S8c¦TßÙÈ[Z3Ûf2ßÓs§.l{‡n~¹¼“Ç)Ûé§4á´–¤Ä±[:ŸY56ú;’ïlÑrb´i¡ñ­ëÀ]è Í-Ì%$= ·&!(Û”hÈkR X3YÙó×È_(ù5V¬ßä8d%µÇ£4—†ìDlTìUj¯âT$óÕ==äH-©Ñ®ü8,¸ nš…ú£¸C–zæ°ÊÍ„ÿpMíxqáko3cê²bì¶>NršºvrÕÊ¥M®7÷_ˆ¶,PTÁ”ÅF†YÎÞˆIòx}+­bŽz»¬ýÝO" Döμ4ã #‡æþ),€ð«=щ^¦þô Ñžü›Zõ;9f9‚6Ihðƒå×[³H‘‘Ev¬N]qÖUçmÛG† Ú&{áõ£“@á+÷Ä«TŽ}²˜4ÖJ\“¦ìÇ‚z\G¨aµqJ¤A°þ¾ïøÏÐã &H8‡í¾ÞüCS7øo¾nΩÝùœ|È"9pÏß-ròÙéufi+ ¼ß=1¿ˆ ‰–<=ù1:ú‹3S0’hmHÏÁh½–y8µNÖo¿É`’€Ï‡§äû5ø­‚‡µ±n¾Ä…},VÝ‘±€³ƒÛH—~Y\ê¾þ³°ÿ1¯•KeF´Ô¼FÇz‡oûoi oH‡òÓaÜ6H„ÈÌtì-9|ÏR¤œC˜Fìþ–kΠÄévæï"ŸPà”?aLóÒ"ñÅ7‚¡(‹Bn¤æ^è$Þpz¾è}:O„/G"½-è÷‚Äm‹Uon™k®øfš·Rr§BsBüÅP,¼n —ˆ‰øÈV"³ä ñ$¾¥QŽ}JîåÉ× ßtÉ;WCO‹µ/ ìžåáuÅ E¬dpª[N[1æã”Æ·³HGy›*œ»°Úܲiý&įs~ýÛŽ2²ìwÞ® ŠsÚ}óõ‚é©uâ«{I}vxüÚS5»w—(Sæ¤HYò4ûæ]éΡUIöö¨ù8fCõäjÂçÑf`_Œ¢eÐAà·¤ïiÍ­WmlK,W‘dìò3‚Ÿ”мÄà:Ó},›cf.hXÄ_X–ÜÕÈꫳFó(|ˆœÖ|ªðüá¥8" `Ò t O\w›u$ LæBZ™¾v¨Ã„£¦ pZ¢Ò^¡£n±8 =/yw—Ñï[˜òN«‘¦á#HÍÝd½hLq!Ú]I„ãå ¼M _ÊY•‚žÂþv˘½½•ø/~LMB*áôq‘Ôù’ÇP,âëÄ*Ì-£ ¤+ tUë‚8)’„B{©"7ù&Àf»¯ÍëZ}r\(ì>YÉ-}Z†¼}zÃàßå7ͺ[ϦEï­“KDP-ß> CFD„\ùvp¹G²•ÍD;ëj°¬™•—¬5¢§[Ó¦qô‡ºcSPHŽÊåÕ#òZ.Öx»˜(ksS•`_È_©Ë¬nÃôDB%/ŒVÌjµªH²¨MÔ‘0Ù@.mFŽ†Î¹ö»È~ñ>¥d6Ñô8º{-š` öÙ l–³å ó6 õw·†½£„ŸÉžœgðë¦ C-OuÔj\´>l¥qÓ5ñ+_!íÀ ĵ¦-/#çË™}Wçbþ»Ï¹7H¯T'“©ZaSÅXuŽ$ux¦#$ß@ “õÛ ·xŽ+v ªo%uZÞÿŸš„£Ý¿ €C·Êw4掎.OÜ}òÐ /ÕAÐa rXåàÚçE7™”m†Šg/ÄÚµÂO„¨JD]M}šß 4„‘n_*²ˆû&rb«LªY€ÝD’‹X¼Níd\µ´t‘›¨xø(‰43ÛcÊ×ø™sÉ).ÁÌ3¨+^™‰¤h,{°%WP¸æV¼xÃqÎü9´¨ááHµ¼®¦'¸yO-²íì¾ ‹Ú‚Œ-9œ“Ì¢Üo2y…=U¶êU¡¯(ò˜Bã îkƒýE}‡ª¼†ªvg÷‘‚#þYtíX˜Ü›@’8ÜÞ]&¾‡|¸òv‚ž ߉•`é›äR¦xEe&rÀ”Wï% ²¿p–ôð¿<×[Ò‰*ó[ð—qĹ^ÞͶ(˜æ'™úìÓ FZVÉú[¡à©ÏE¢äõÓîÇí ×87ã:ö\ã-ú$œ'¹Bv!›‹Ã}u&‚Ì$à1…½‘òÅlÈ‚¥É6BGµê9ä¿…ïsÈï u¬ƒ98Vh婿úk¨ tç”qÆwê|øT+®rÏ#›/ÓyVƒyk…Xå t'¿ËóÕ§0%Æ]®?^ÛOæS‰$åd*ö@wFEÁÞd2ãÌ3<3‡§N[cEN1ÀŠW…<-dºsɉ$%?d…„ùçŒÿO5k¤üúóeè•+åDÌ,™ð¼Þ¨w“ÔDGÒkÑÝlÕw‰ êFýéИ?Åßœ…qì¢uYÅ™?z³©’`À~ÆåÁ@¿# ï¢a6›¯(þ"îµÊG{âÅiˆ×ÉhKpjòw=suì/ÅpNöØ0Fb9ú¨w×ÚYªÓò?£JwKBG7ú{¦•(èph Üv.(ÔµX1&ÛLÝU‰šd°!/9?#žÚ¡!Ì…Ïžb?B‚#9¼„Zͼõ!É®¯œ±~¤Î#áñÛ‘ŒÝD4BÍø&•Ú~[:zí¨=Ú®gg¦ªÀIUÆÅ1 /^9-êTÝfêé£f£'?È+Ì= 1ÍÙÌý5ê®ÝÐóñç ™è‹…|oïÏ»Iʃ:ý-àT’Ýí2D k;„…£œÿ奂=»´‘¼dø´Ëß@꜕+‡[[M:ƒìY}s´½ãª,f©åz…ß„ôàó…®w€RÊR¤Åb›Ö"¼ÍnôrXIÿ ˜s™{*"d“Ò±âßl±À2ï!€HŽ*ìhÛML¥Zæ$ä°Ù'-’%t«žÅLµ ÷OKm‚=slI°tÕu€¹²"Iz:{òy6­SN*Ñ0ýÀÚUˆò¾Ö|g\©p«MËÕ8\3!¶„w'r¸5éOÕ‚ƒ}º\Æ'ïkM € >zò1ýQ³—/H?ê"Éï!±€%?ã‡×†ÝûW8ɓۿbü/²›¸þÏ^ƒ÷˜¹Ôý\ƒò ÷aõåêmÜûi~´k*½Äß1&„`?xðDÍ&î  Oi=£‡iÐN¥„»TŽFÈiô 1gS“Ú©9/æÖ™–DÔ8bþ¦¥ƒ»¤›ˆ’à±9íYRÊÙÊî¶Yà/–å»Pǯ§daÕö¤;’àÈ«ïƒä~xF×±??Bš6=wJsn¨š²ÉCóä÷)`"À€«Œíu]¹M)>èݒ1ñÎ$Ð4õò‘|W繫°¼ƒ‹1y*úg~Éoqúr¶-åy¬;CTs@Ìiªù·keþ²ËuñÛ®›©ü4–ȼåѵ àù,«g¯éšSý˜PÚ‚_>—ûRçÎ&_¿>¯ºžÞ·©0UîXê9xëEO& ÷¥£7/¡JÐ 'æ P]ì-–[JcƦ™t2@ã3ιk“ðl¢Œ/Æ~nVaYR—vÜôðЦâO/9¯Ž¾_ Ìa vפ3}$üy{…jp­Î=<Ñ}ï"íïÀ¹$ØÆŽ‘«<­0ACflÏN¹ æò ”9S#er9 B)HW‚Þ‚îþ”rºRZ+™ó ŸÎåîŽû£sx¶nÈ›gèTóVäKÚ=ëãG¤l>Ïv£d{c n_Y×ã=\ãgn9Ý:tl‰•Ü©À¿Y!èõ9~4ã¿$”Â\$Ï)©"£×ÒÜÕÚÖS˜÷»QušþþV6>QQÔ÷_ýáÛ@ÍB$|›®z#ŸžPDoþ-¹õo&ü>Eã(ú[§¯K½90/Õ¯-ITi¦ ö˜€†6ñg–IÕå#Pzco€x§ÑÉʾ³üîw4Í!÷Õ’É@‚…ÿJ§LÐBr:â‰eƒ–ྉT,QÊÍ€Îû“éñíË¡:~¿)#Ø|¼Š>ý+ÜØ·åø¯›óG¾bPAByDYëÄA©v˜¤F|‚?9þŽí+@×FÛZ}Šª…~AÃÊÕîLÎ`ro™éŒ‡N'ô‡ÕV|›YSÌó—²f®Uüߪ/èj©ñ‰%ÂíÆãâë¥xÒÃcËN}öp¢}_¨êxö?æû9é¿;½~r±E—c3g<:²'I`Œ ںǎi¦Œè>o|[Á½¥»Z&Z^ØŽ˜æ–mè\ù9È-Ñ’Œ>QÙf‹ÀÛ4kÙ™±½ZaîìÀrEÒ-ær±Úåá©GÂÌFªé¸úº'}óTaŠá¦eÓKñŒmZ6M·†Ò‚&]ÖF·1'Òˆ¢^Ö¸$·Ú"Æi±ZF77AËaÚцë°À™P>½¡ŒsË|­ßQ›¢IDŸwµ[Ò«Ç%5\A {ÉäHŠ­úfhºj)"ò.«wé*9Ò)€rÐ2ÌzÇqEX‚jÂ[žïåNK3‹KÆ:pJ"c)z k©všÙe[œjù¥ƒrêÂWͺ¾‡¥A{zT|o»šM‡´½Ô¸±kb²“*ÙQ«K5&®Ý"õTÏÊÍáO?âeÂïHœpÿ6hÔü€=VÐFÜ3³d<Å]~•6ýývÀŠåÌÔhÂÃí~‚¢éÓ@‡–[<óôíÄA€œ]x¡”oõÊüHýAd1Ú¬ZŸtšV;ß;QV™äpï9t4>QßÛ£Ó)«oY­¦'êÛWv;i¦Býò-{{Q]#Ï‚43±Žë¼±U“íxjRÚç(]z)ÞC1©(Í}§:øD°ZD&þàÀè8ãÏ?fòŸÓ)Ö7"´GÚ# 0ò »7ÒéaóyIB\TöïÎÛGˆ(ç ¤M̧ì²ÔFGx¦ë¶`XfžcšdÝ$G xùh#÷ææÜnå¬:¤ÝµXÀª4X£m³Ùœ›’;±T¢Þh}¢ô>e@yJ¬“Ü£nÐÖ;y …a)域ZP*ŸævmŒd‚S,s2ƒÝÊFºßbvÙΗ=—˜⤠&£B¹Q*…Ç´;¯âü"ÏÏvÈÑXÑ’âK{ \ótšdÎ"²”ü…N>—MÙätmBŒzPÆ0¢žûIzÛkîgœÎÍÂ6àŠ‰qXà~ƲbqX¸Ñ~$¦æ” æä5Hô&ѾÎÞJK3­ä±¢ys–,WpáF˜˜³À9oåÞVå¦ ¶AÂÛp­(9¿/Ò3a´²`æÈŸó¥} ûsŒ¦§=ãç/üõÔ*©L·`ÀDk–dRV"á[XQK¬ë1‰h*Xà›ëå1駈vfåtÆÃð&æwôÓÁxã¤6 zt©7éã9¥èƒ0w¼&h,V–ry7¡ÏR èë ³òh¹{Üùí“rÎ 8™Ÿy“2ËY³f†°'?ÖNºŸ%¯v‰L“M–(µånd/‚†Žél=Krw¸U‹“BOñ»eð_½%­úº²ï0³H4:°ÞÓ„2ªéû«.'V]ƒ'¯2j‡zc4ŒblÈ+̽rh¹Šº2Z®Ý„bz—Qæí‚øg$Ázf·ÏU¯|™NÅ•—Ôš±"þÜ`Xlˆ<,˜2΋y1àË §E•èÔw¨.ÐÕ€‰t½ž‡]Žo®oU©¦u¬ÖÈÞææÛÉktªíΚÉq6ddM>(ÏœšŒ} Ü2£‚fÿ:åá« ÷Ü…!ÜY´PįÁ®ã½ñÐÖÑYc^~’# 8lÀì&œ›™¥õë‹Fw”ï7Äqw›J?Œ¬*êG,º$ŸyßÃÚq^Æç¯|bïq'IZÜÕ°¸V¶ ÉÄ£èJ˜P¡ØfæªziÝ\ôÜüß1 G°ÂÛu' F´yz©áeù „F03ÀÁr'ŽaÊ™xLè•þêÝ.ï½®JC6ìpÃ_Ûn¹fæ"¤üÛhÇž·ïÐÃ2nqÜ#±¦jl—hÚ `®‡é¬œ‘#˜®¾ªjxHŸ8ëñ¦‚vE&{+Æð;ëîa…î[NÔò› ê]=„qãHÙÞ˜Å|ÿr&%Uže†iêàk5™à¢sËðIŒ ¦šà\‡ïÍèc2lD$Ï„Úm™´Ç7† Ž&(îù{ý@ÃòDjû›J›q]JgnqõRs±„°)µržë!9 ‘œ;ïïßHŠ3Ë™tÍhÿ0´m¨B7T¨÷oh~A? 8^0§1~£7tCê¡KÉj3½ÈÅÐùOÊé†Ñý,?»[vΉý®Ö‘h)8ʦõ¾€]©šÛ’ÊÃ"j Vì7“péSºAõô!EņŒÀù<œ¿Ž ÁU–[ë;YUM\¦ŸA¾sÙRc}–D'–—ÔB|¬3^ÛãüNÒ÷<9Kö'!„1úöÉÌàbÃõ,#‚QB‹mF¥êo,G˜ÏN)â÷¢ÓVktÝw„§ØªÞ媚ܠwØ#Œþ»à¯5WÙ.P·Œ#£÷XYæÑõ²F»<9{ji „ëŽ<ì9J¤ ;H)»{Ńädß.0ÞÈ[PyB¼{f6J#ää¤],J¡¯!gÁü¾öóH0³z:f“¼¹‡ [Ù¥±ÅÿÔlh×wÕ ƒ•x‹46¹²Ò5s&l!PЄ»ÉKFï$®£9û{ÆnŸ I¸éØ1Û0ö8qŸÂ4 °l…Y=j/Vœ™ó@ŸŒ¼Rs—†*§9©Ê_Ôz· yº5Þ­˜­ñØ«–Hy`Øâµ ˜ÝÕÉ.¢”R8c4íÊìÈ©H¬w!³†TQ")Ea0¢"+2VF Ò& ¨¥,Gä‚)o}­Ï¹·s¾‹¡Ö*ztWx=… òÍ”äR­bp›©lmØßÕÀ û–ÖÝÊ4‰H¾½~=ÖÀ,Þk ’Œ<_#ÒÅ œJ:»¸C Ò[rç^ÕìYIØÛL¼‘¬«t­Zg¶ñÈö4&ßÅ?Q¥Ïß]¸´dЈ¦û”SâËiñ´›YN‘¥õ?*¿˜…*¢©z«PŠ@RžÜš„‘g’rÍ–—ÆÒ´½á8Zc^Ú7¬|K+‰Dø|§;nA…Õ@~ˤ¸k%5'NÈL<×cÆLx·)ª(ÚG‰Í†t”•8T籕®û(Où|î«Ð'Z¿ïsc¾Ï™èøHúG°_rÒ*eÏòMjŸáÛbj  g#È’Â1(©‘pŒTç©Í”ǯ‘±YMÔÚ%­^É%Åç§K¶”Ö·Vü ê³Þ(–b3NämÀ ¾{§w5ÕZy|¿½\èSN£ã‰ÀãlõÓÝäñ4WÃgcÃAl\’¤-+£ÉöÖ`×8*zs9ÕŸ2ÔC4 ÷ÁW¼9]ºô«s_Èì"ɨ¾:òê þpõlS1÷‡!´;Ñ â{­©6•µþɰ<©HBA^IѪT£ÿ¢ÎžyÑ9Ûêù®\½ŠÛ•{ÙÎv÷Ñ>¾aëŠYepz‘i}®Á§fàPC//=ÿ ËJ’×ãñ̲U:yò'?:nIP€m\“Åù6aÕÈÄò`X)î·˜jλªÖóŽ8uAZ&ï òÉÙá;±{ÇyÔ-.Ÿ›©D)Å-I §è$Jøáªç&²•rúG“j ÞÈO £à>7ÇèzÎe]!Ãæ‡4ÆâQçq…ˆøRgKñ8 ¸zÖ"W4òõ5‰¶¾S‰VÝ3¿[@PL (‰f°Â -ˆ´–¤»ÉM;+R³É ›{ RNÚ,kèÀV•èÚ6Õv—l)' }±ÛId‘èýÇEÙ•ˆcï"w bâÐy ïB¢£¦Åš‘9DÊDÓ‘”碶o@A °êšmD&øRޤG [êF¡à¹˜9woF:#MçMWû–µ žû3Jâ¼j²´½áF‰U Ä*áìæ)GÓ0æný:H+³:ÀW¸§«édÿ2‡#„(sÖ©0ékFÎR¹‹¾œ&@ ù­óÆGò>gÛ”r¯Ž¢ÿgd¦ˆÖ§ôr:”<(–V]XÒ‡˜–7o3ÇÕ§uóem¾Y–ꊇ^ Ï–ŽB»Ü8ºQý©À¹¿šÌÍ<ŽÎËî–¡ ®¶ÈYËiæ#ª|I, 5¸ä†—œ»:W ×A/Z ir]®ÉçpÌj‹Ó…Â>¨ ©Cô¨ÓýÇ#­öZn棸Ȯ0¾~?ÕŒÿhñìÍ?] ‚DÀ¨®Ã…½yÞ¥è@ÙÐOï„ÇÚ‡–ÚÚ£tkVªr¶NÀÈòZÆ(×kd ¿€~ûY¾Ó‚{žLõµ_m{ĦÑ,m6–m P 1‘tPÿk¶Tð䢉Ì$‰ù‘AÏŠ”+¾‚?Ë©E`i4Þdg±fý=co0°LM¶‰D¬?^ÙZw.GC[å…ªS} nWÏ@ë¦ïU^úeñI5v´Ä›ÓhØ%ÖJ¹µÆh®÷ó<5Cbë£òÏ,¶hLëZWv'3ôuÓZŸÛjŒš³yüžÞg 29Ž;D¨ÁT…ø±±Llì9JŠiÎ[TQ=N:=š³âÂÝ•­²±aãøwÒEn§„N.IëÖú'ùµ®÷ד6ÿ¤šr¾c¦ûõÇ8¨áÍ«já=$|d'aŸ žìhìqôÓ¦²H>?m—ŽÓxÒáM]_rÂøÕäZõžâý¦°ÖÒªõÜMT±=\ܲim¤‘’­‰àáʃ·lþôÎn×P1Ú¾8Š%Ì#’$‡ÈÎX[¶eŽŒ3/PéŸì×1¸jS¦`iü¥i 0îDdŽ]© puùK~Œ‹Q è&”zô· ½u¸µ .Y›w«Ý@}êöV²=ÒgAQ]gLã}×È\ß6¦ <ÞùLÜ+j.ÀïFÔŸM*É¢ 9­ÓÃO3Ñ[ƒSs@:•©Ä¡÷v¡ÌƒòÓ§úø'pØÀG²<ä¤Û3‰»]e ò ÒcMrž(¾ŒZÎgMDà°¼@»Íìô&ûG¯hæt¾»Úd94ên@÷û_S^¬únÕ2JóÇ ŸX›N…Ö› ‹úÑàp/iôs‘'¨&ñ¨ñ+doH¿W³†ÝHà˜ô9)ˆÉéfQ̦úE#´_;œ´¶ÂoDŸ¥¨ÂŽÚƒ0Ó|÷W:ФèLèÿw«@²˜ÖÚû;mEÈ Š’-ŸÀ÷cà)y´|÷ÁºÂì°œzjìÓ¬Ÿ…Íî•ù;ºY9…DÓ–GØQªÏmfs¼|M0z,XÖ–ûx7y„´UÀoÒ1èpvç|˜R훓‰”ðÁÎB9t-–¸s‚–’O7J'kº ‰ÁgvÅ£(yN`#ï; z/9v³ñk¨òåh w&‚¬N»sècplw"½š>öGi›+U8“WiªOKÕ'Á¤cHÕ¡#šÝJg!¢À2`k œ&úâ5tY!è ¦ƒðåÊ¥%ì7¸ï[^xpÝJ#FÌr=‰Ý™J9'fE`CàÞ¼¸£gkV¥*ê3ZI¬K£™•õÂ$Ƴœ”›êPœ¥¿IÎ2¹)qb˜“ÿ†Ì–wl„Ê_Í¡-)!S§ ÔUŒ ¹å‡½VŸ'Ãm7¦’{6£Mß¼áC+®C‘ÖÁ[¼3‡<)¯“”Õ½Œ3ΖïˆâÃ7ydËñÇÌåÃËÎÆ‹Ð3æÂ›{YR:š7£[ëAi¸ò´¼™U$6g/¦ëO: ñâ<ÞvIé¡ñ¤gÑc­©¨qLe.ä=­T§EÀÍT‘B0g_>Ìj&ä¨01?Ï¥7tÎ:v¨úuï¦ôsåÀb/Ý 6m¶,/kZª/rjx Ö~ÖËd\–³4œ è2ë E5¢hm”Ãt—÷À©¹}t®ep‹´q^愱6¶6`.+¯Ž²â=æ»h÷òç_-B‹Ïxˆ%( œÁÚ& J„~ÉNÜøDƒUŠ[N†c¶e>‹!NÑ¥õ˜Âû¶êáÆä´h¼„"n²ªÂÅ¢hãáYÀ°5{ÅŽu¤gÆÚ¥‰îú²8K•)2Ò½G8v…h!(î•#ÞÐ!Ré„…E¤U’tÎa…ª³ÓU›Ïé”áÓ±V\@uÇxÄÎ*èt4û¶ÞSÒ'KžsÁ£Ü/éx6 Û"³˜Ñ2$:×ñ¼áÈ3¢vRgHÎÈ]!¾ëÕ’z‚@æ :ž,ý‘B:ÄôŠÃ§UzF>+œa¼ F¹Žƒo†Cß!,‰;e«}[Ô>}a¬Š(ÊBVÀo㹂l&í;@.JwŽ¡}Šfÿt©5G¬ªe5 2j¥-žjèܰ6šhm}½ØOòEÓ’ÒN]1Q…TÉ= *i ½édàÆN¦à¯ãHaýi0Æ;ª§×HoÂ}锸ôRã6±mhå3ä6BíqÖ+uõ³12ˆZ«…lí¢ÞeÌi÷»[aFa2Õpw9È¢8½ü;£Ô_±Ð5]ß3@j[áBÍ«é" Îg©Ü÷\a|˜6IœwÉ© 1¦V%Na^xá¥)7/uÁzN[|·]:3hœæíuÓòOÃUß|ŽßÎyäÑõÝ&ƒ‘yyÌ:oÂ6˜Ã«›£7¸*]¹&²YÉ4R>EV'”IàW³S_%ãª]¢¥k¦©s“Ÿr|)ÚIĤ–¸Ô–SáàsIp½y·)¦²i1}hxÝÆ÷Û/à£ÿ1á•SuÂU¸¢49î´m»ØÃÀŸš ¨¸!Ê)læu-4-ªM"¼WœïdN4Ü*H•™ìlOAmŒŒ‚`l¦rÐó;Ía…gu´$j@×»KU!˜‡ÏLŒ3.xJéÀ# T/Ttmâj"Qaƒ¸,îÜFO—I+e¡Æ<5—@®©Tº<.Ãáè Äç²ÊÄ ¶s³{ÅÌ£Á NG¤€Õ,Bvå·´.:Wõ#V‘ˆ×\Ü!¼SˆH8ØÑï“ñ «SwÌ%úÚHúžÈçn€^XEÄÜy9‘p¹Úz­#Óù¥*"Y2…$}ù†÷m"ïz•¬@áì Ú%һʸVátÍGö4Q.‚2§Cˆ*0ãQ³ÜÒþøÆ´2ê6´: |Ó]{Wô&Z:ñ0¥ƒ“¸óNÄÝÝšM+Öí’Ú·bÎ2ÌÅz5eÞ SÃCžm©¡‹7ÎĪ‘Ne ìï XÅëéÿz²Þ4¾r–µÅ=Ò*ÞknHÙ¢cºÚ~¢1Äd(L åÄRµ±^Iêv¬°Œ=šiYGÉ—#ŸÄ‘ümÝ1iq\5Dñ×8“4;3 '%åʼnhì˜BuIJÚX3Îl€ ;|*)¥t¨\ô^¬·ˆ›+‘m…ºZUj=/$û`¦X?À,ß,¨݇µFçMdt­¼5×’/4»ÎÀo~“¤rr†æò`®Ý/™¢P8Ú{ÍpÑ:NyÁïØÒ6W¼°3ÇÁùç޲$¿:)³°q?ª²è4bn`œœÉg´\ £;€©À=±œ^zRžg@¹$º'½Æ÷/VñMg´ÈhødAÓH"‚²Úëwo,hÖ²˜„$–ÎÿbFHÑ‘  ‚7¨3}ˆã:f·GRúQÓÏD­U_çXâl+ÊkˆsÀY¿º3&MxõYc, v½)W$¥Zhp…£ºVe°µ`ü-±¼{=Á0 w·xßrb `™qEø|ºï.ªÆ‡4NÚ.G/ˆÃö í’'M#òöYº]: Ùa)«”3ts;Zt½iv}Ju‡¹ÐÓœè“é*ú[%ìö¦4yƒAW={Íô‰oa O¯<ÃL”Ü·@¶ Ãr%‡õxU4í_¹JxÁáZ»É{L5á8&¹±6ƒéŒÑˆ eظѓB‰’ræi\Qê/IW³¹±EÄ á+FñžËÀ*ê·n5o» Kkôð©¢Üá$Iax›¥²ÝŠDJ(Œ8UòÐÙõ‹÷e¯%aç'\Ò“¼ ÞoÕbá‹I%‘¯00¨ R÷aæÔ •£€ÔÙÊRŽñƒ‰/ª¶´“=ä6 è«Y@Œ–B±ÒOJ!1´ ÔÚ€µ‰sÆÎâWm?2 àP/5œ¼Ùzs*ó±¶EdÈoù4AŸ÷`%8[CB’ºAã]Îuch¼ B¶G•(`‘ñtAê°{õɆjÏt9özõkó|ÒœŒ[®™ 2¸jrÓE¢à¹EIÈ=ÀäOÑ-‘¥TÁÒ6|¸x¸åZ7ò©jS²Iõ{£Y†¯›9m“ˆÎ™UëŒáÆÐNµXŽ£g´Y) ø½Œ/W9xw3àe<6»çž. P·èäô;é©ÒžžF„T¯RTO¹?™v.í)9¥Ô]Qz¡ºSJÕÁ§ ÊÄ´©!…o¨ÌMõ‚"18b<9Ñ7ÏÒGÕÝI"’Ú Ë”qê8®¢›¸ï`C˜?—í8½J*ˆéŸeسÝó½Šv@äW…YšŸ)M0‰s½dÜ0oÞËK‚*=ä‰*ŠÄ‚óÑó4ŸuL'ÛV\å ýµàˆåmÑk”QŒzO«·lb¼¾;Œ+ŽÍŠòJ/Œ`µsè\†uy$è ŽÞÕ,Zp} ¥±Èöœ%ÜIþhÓx>Ú+rµd«“‚zÏ£˜²F |ZôY—¹{Ñ @nð$ŽKƒeÒã´ #\,³«µ+ˆ ¾‡ËiЛÝ"ôJÚŠÇóBIVv¡AKkŸd£†i ^d ¤®Øœ›;6)4ŽJM:Xt¢Á:kç/ñkUõ‚Mßõ ^ùê©"Ý ˆµ ΃-.Œi¸ñ”;;úv]>³¯I˜BE=6fDŠ© ¹0æ~g}3bB-f EcΙûnð|£ü_rU…›ÃØšèËŽÙnK^ƒe1€0†ÁcÓÜ_pNlÚ˜FŒAÔŠ½â…ô‚™p³•å¯ì7ax}2¨@°Þ¹ö†yk˜Çûßlüù;†fÄÇ}GZîå¦Ä°yËvK€ºMçý^^X[µ0Þ;Þ‰Vz m¢ÃÔÜÎõjŽˆ˜Â8Ôêy<ˆ"aÓÓrc‘ÎEô²%~âv’D°CHôIA‹7 o:E%5£ ðŒ oWÏ¥Í(ŒyÇÂNp€V»…9øa´ë£@Gûö£´E‚ÄlÞ¾Cù×—y98欱ØÛ€©ÙG„â µ™ûAêëË~iŸÕ«×fÈ Riô$ɢΠ˩²ag„Eü\Õ _OþžÉŒë÷6‰LápIõ1ゎè¼ðftÕVäX‰À `[þß©: yúyµRˆ9AÌ!¤ië3 DhÐÁa¼Î»@Û‘Oœ£Ä_5Ö>jôTéÓzÿn}$: i;òLíÛúŒ¾¢®Õ=*ÈÞϹ)ÓsŠEÔ†š¾ˆOPdCš|)â3¤úd}—)[T£¤i¢P´˜[0=¢|‚Yú­yRÖ?€ÛÄeu?Xè€{i¡B€'6/Q ÚXl‰€ß5’ÜgU>žq|²c‘^c5ú8[ œÀåq—6î ÙåBD½Ù¨"€”BNaQD 5²n[_Þë„|@ž|ôa3Ó#}îÈ~9VÈé “ÙŸÔ( |¤ Vöö¦a;+‘À ³kªŸ[d¡µà» ¿Ó¥¸ Ï(.jíx"~yý—‚8ºb¼qÚÀWÈÇÀ›r d_{`ôô–[Œ‘:R®f°Ö2³ÓÈÂÈLóf®‘“¹/ñ™ûPã¨=g–nºCRç(90;ä›­zö,‰áJnG : iþÔ³ÕXóA¶¡2Ä|„—,c襫}?ÕE»A_šÌHi×þ_Y^Èœtâ‹Ø7&gš¥âÚêW‚ýƒ”kM|d.«¼SÏB”A¢w¤`~ÿ’œ'1ý6åuÖùžò´êméÊf=]¹È¨ò9Tñ[š†çGµ‡.'óúSËw•·ðÌÜ”(>Ò‰Û®~cTMNK»(»L²p&…™ó,ja!§¬Gô49©„ Ã{'#Ä¡NÒ*¹Ißhù’1=xF‰§^g|ðtï2eÂë|”<©3Ü&UàgA¯¯E{s½Ò­¥©Î_¥ŒjÊ8Í@=-Àý¤S˜!Ó/Í÷³å.Eg o‘![…}ÜŠÕŒvÉÉŠô~_«íŸJ_®Ðq4däPÃi'ûåq/²Q@Ji0n·ûØ%s?L¥Þr¸OdÍiBJªÈ*<7Cap ­·¡(ck²m‰ÐG“Wä4ÍÔX2Úlòårní21:7ýtŒö¡é¿^Ì×”´ëÌ8òuõC½;ò± fâ=dö_@â'½8¹N²x˜èwêÌöbP%1 ÈE¶Ð›l¬Ômv&s=æ4=Û¯­0õó1 f€d§%è¼Ï•“ͼ¿êÎê®WGÎ=mƒó›I­E¨ÿPèÌ¥–Êa îý.Â7_‡®Ïñ;VvÑôö2LZ½2Κ;ÝÐöàV%úØ#_òagjt&-^ËÙÝ4P¯tíºe¹tæ‰p„×Ýš9F/“Ñ(kd( |ðì¶!KbʱPVìÁÈXÿ)·Ò~Q4A«= PÇÒpƒl¶"‹S'Aµ8èßf癵Úh6ø: ~M»³ˆ O(VdPG€—!цr6š´°P.LòËÅâÏ-n‰Óª(Ö**Bª¸ ŽM Æ&€ë€‹ à¶i'‚ÊŒÛäýµÙ²{ª¿³”îxÿ`šë*ÁW¤h¿*—¾oUú@ýv>aâTèñ¢­æ÷ã®çƒêX ŒþÓ~­tä…A°¬ØÅ€Õ=4]r퓬!t¸Èóš‹å¢\p,ª˜Ü•1•6?‡EXñ€4ª&¥Ì4rNkÌ›ò‚çS×ø‡døMî‘ôãOsE'ŽX!ò } Ÿ®™à¹¤ñ ÍÖ8€M‘ªY[ 7®cö=¹Vzï¬2[ªA{$—ÎHMØ&™e4è_À»PסB-À‰ðœÆ‰¤UÂl”Š«»õxü$6-QÛÚ•Šhòg7ØE`Àý×”òz… ¾‰7 áìÿY°¤9÷Ö#ö¢bQ[Õˆdõs»IøØÀצðÖvw4‡V7M8Ñ:¨ÍÊïZJWÚ2*!‰& ‘Æ0pð¦EPt&öô•üІô)sRXÛÕ‹äãvå°ï×€EÉDÈ$¡ÿ§J '¤U÷5„’ªÖs((³Ñ³Öä’´ˆÂÀ{ç"­%:#ñ+T \ûFRÙÄû[MhàZmæ^‹Ÿ¶‘lœâ-Æèo|,/mÆDH¹àÂÝ£yÙæžËyðU‡(ö#ì`kˬk½‡à¡ïÍ)Þ`ܘ³$Á!œÔPª÷yh+ü´þŠ=Kî½ç­=Kš‚v€>¼»ס”\‰Eõ‹Á†+²LŽ´o³ÄJïЇä4LЈ€ÎyªT1R¼½µô¨þ=‹¨sÿE2t¬ÇzHL-ÛÁkMâU“Bl•– ѱÜ+G?4 ¶`§É«ãûhuhd…OÔ„±mµ{|[Èz\ýýk\4vjÑØ;óÝ©]·å"àµãñÕ‰‡m9$¹\Ë"*_TQ’8Zäá?6·œ&þ–höæ¯jâ¦ïšÝ r¬ß7ä·ôV¥hÈ‚a ãó ïó]Êlh˜Ähس”@TQÒY犊â½àýï⑫̘àšÊ€TµqÅs"÷b¶Uá—R1Ý:7<äájiýY?U#7м‰$œ r[le_±¼ÍïœTʪí×-KSE ´4n‘_I û´LÜ þ„ªá= –ߟaœ ÑIqŠÖ~R År £™º}{ß øó+ûvϘ‚ ð ÊÌ´[ÝÕ&>É?_šñˆu®°¹È[KÌ÷´üj„R¾pA¶p%U°…P»ÀoJ#$- ²ÔŒ¿ë›Ü#ïg†€!"½­ñD.yXû]Ý3µ¶5ÜÉe‹°(d¨,®Ã׫…¨æîAngÓ 89Ï œLÉõ¾â¶,¬Ì,AÖª•BÙÐÈ™&Öm9_{ŠÊŒ=Us)¸Ç¿HñA( Ä.Ð~£>òN&ê­ëž Ý·iBö!Á—<¢hÙyîÀAÉó³Î'Ö£¶ÂËš’Ý;4nÆ6´õ”ò|¥Eä,/ÕtŒ0ç0ö]0ÕI vý”'&¨.iŽŒr¼ïß  Þšm§PYWïƒqºCÈ"2túöè¦ú«:Ä4Ï^Éo€Î³ŽÂì̲ õaž@wÚƒ$޵ˆÅèþŒ…w`^|?*TñBŸvŒ]ö…<±»ôV…uNMâõ#•B<ž„ê§htQH’Íy‹:*i|Á)ùÛ•¿(6À¾jæ””–‚ÿÚë?£öL”ÑÅei„}OÚ‡×Ëjï'[«qÁÄ y#PŽÈ²D3rM{îrª€êòKj·Mg™Ôö¥Xü°µ¨ í¤¤ùñ½ÓÀwHÕ¶$„²¼§p¤)Õ÷[ç„-Z&a¿m¯ž9PUv·$ý°)Z”×n=dНv¾fú¹"Ž#åDÝBxßÔtƤ [æéŠ©bÏD‡Ía^hß—¹%U;»7ùým·‰M^Ëò°©xÁ’Þÿ\´|1H&žQv3̪÷DÏ­m_†–€­…gEe{AÝœå–J%w  Uày(ûÕ96#y2h¦¾ðiN†_Ó—¸Ö§c7>ÜLñ’è9:¢2-…ÙúPA]/?z¾AIâVÁàÉA L´'¡ÏFNN„†ét6}2©lyö˜ÙÄWH$¹[KVÙñ¤q{†}ø¼´±ôã5[…ðBœêšÇ¹±Ãmhó±+ŽJ! rÿV͹á*úéÅrÔªóM)^S¨ÖºéÜfÀk¢‚IAŒG¦ªœùÎ/á/Y_VÆÎŽºåJI€vÀÓãk0ˆR´tR×ö×£-˺QÄ샼eÑ∥˜BÑkd3ø¤N>bcà"–hž™‘÷Oeja §ç ž2ŸµÄh}#n£“aË–¾L”2ëÚΓ¸nU-±^·g® &‹8¹mÔ%_Ÿ'©<Ó¡º:c)¸ða`ÝYf_½aŒ@Þ’áÿ|+j <ïM³Û Ai« ½Â1è'–ÌÕºüÔ£¢³Y“ ZJ(;Œ*{m0gÒ \î6 ÕözH³ ܇Jv£FØ'˜)vÄ`èžx1­C“bünqÑg“Dù°ð3Ç7 yŸ%µ¼d8€âž¬sÕŠ=l[ß7ŒóÎ1¬3ãlÍþ]’”‹Çu‘»ˆ_mrMÿ)ͽÝ.Ó±òqcðÝÞm=Juö‚´êiÕ%¾I„Ugh¢ü•æ¾Î²Q&›æÔM0-#*ÆÿÞàƒ&¥ ]‚ônãq>]‡vE·U… ©íLﺿÄu43¥´þ<õšfS[àÅÕ°Z:9&f‚Óòßi®qõ5ÞQx ÂÍá'U®ZŒ@ ¹UÍRÐ £€Œú¡dˆX“ô¨ö@¶Ë­0µñºUólse ÜçH{Õ>é‰ÿŒþXã”Å_£ó„O褥\ËcxÞ| UH=ÉFeÍÃ2ø@9 R!³xN‘óßÚ¶“sŽð\Ò4èƒEâ—·ž 4?‰räZ{#«5sÄ:Û¦ö»ŒX,K' AÁ¢v€.CßµŸ#b¥ÆbÌ1à’Óubb‡Gi [”Žÿ|¸ùDk+(5€Ì•f‘&®Q— {˜•¨ç|°4_‹òH•ëÐ*O•˵:DT…cÑ× Ïà|lË:g¤~*˜“Üîêbë¤c›h]^‰ãA»§Îø&Æ"CšaåYҿظã·j˯¿$ŒÝ{‘k¶(¡dqÙºbkáûÅ Ô÷˜P7®»ØÐoÝ96vÓ·¡K²Ã·»Ü’kûÁÁÆ•ÀÅ@ŸÅ^kº„KOΗ"r,ºmÔë‰ØÕKÛ |Y“v·$ ¾»öíàxññãPÜ%m¬£itpƒö?Z¶ÉaÎˤí¨+éô;«Ÿ-ÙËAãW_ënï]”ƒ7‘Ü™XNH÷!ôn`‡¡zõ?…£»UÉ/m9šwè0ÉV~»2m0õèÏ%#P7&„þ£ßm¹Ê5&Ò×+†©dutíà’wO§VvëKÈéÑßÉ‹IŸ) †|þÁñ”¯Â­¾î[|ì¨Ù€@ùSé·=6[]éjÂóÔ‘!>{11k‹±Ê”sÿVÏÿ̧Nöκ)¬uäÈÞj-„ö‹Kú÷ç\ìò1Žû¥“‰ûn·…·å1p$TÁ3O¨/†«³žï‡Z{ªÚM™œd­É=†c¬òJ†¹%G4”è‚Ð?ÓÅÒë#YÒàN 5cš¹­* ^Ñw¤òÓ\AûÊüW£gzŠsìÜ;Þ᩽3å7=Bâh39#‰néVÃúÂUû¤åRL½øŸ…^»h^¡Ù™s–½¯ÓÙý^ƒ¾?Ç~è¹ãÍÅ;޳\$¡”Á™N²£Ä–^4¸'Y YÇÀ{)?zxÑüÏÐ?ÏðÈþ8=»ß½¹ý5Úó –Ôã:æÝée«È’ójc.F¼Ëä»§¬Z2u}z•ùY¡¸$×aë²C SF$EVÎxTlz=6ãg¸àÛ9JК¬Àš¹KiO~$«=–yéÀÀk)<á9açLl µ:.óE¦˜m‚…ôŒä›òf%Ô)²µÖtÑ”Ê=ÖÜééy7ûøÿ7‡Éq¹ÿ6Ó4v.×]ô†ÙÚ<7 eAn4¼‰(ÝŠzª^íæT´í a«f¨:>§m—ßB¬nqׯkÒYæÍ0‹6ªþ¸­ÐPÓÊW£ %‘‹Þ µ[œ †öuˆÔË?K/rí¸5§VÖ:»€/|£iô´ñl‘nxJ¨Õ ˜üÝG€Xtð'Gd¯Y~×ÿ½m&nŒFñWPÇÛð tŽr·•^J BuòµmªÕⶌഭçAL \Ü^ŽpX _˜¤P©!K¥ŸW’/Ñÿ|Êzs¾ùw^åô×êÙ'.åÞÿo3ãt‰ÛÐ$ÏáÝ6õ:w˹‚GÜcîÞÙÝ4>˜8røçóÓ-çÌjûÿVÛG°¸îQîÈõèäg枥Íx*9€§ž‹Nê„>>œšæßG¯Æ;ô߬ү-<¯z²” vÂ`#²oel} œU¤ªk‰»¡t+z…Ò!ž5P?¡¿*ά`ˆ¥)µ^~¶uÍ>µçQ³HßbÙ|6(ÛÅäåZ¢G¾ôŠWÅMF=( W{/9½tç|H0fR­³p·×hkaf±Ã†x†(kè¥ã¥`ÕøÆ•Ï¤Ë˜ëN…¼2ÊbœÌî]i•S€iÌ“Ç.‹œJZ(,ˆ“`¥)éK´Ãùœ"vUe8÷‚îÄyìãé¶¿­x´K¦6;ìwÝÝ®‡#> faÔ…’šVn2-ÔjÿßÞ¤ ä}²3Ì.SÜ#ëXœv&D=Ï>“I|ÅCpÀ‰Hy–Íxhõl")íç7t2­ÿC -0?,[lj¨ôY±\, ƒ cÅWo "`Éí?¡¤»%TK»¦ðá}½ïæíÐî»i߬B : áaH'²LÀß)`^¡¯Á{øÿËá伨xqM‹õkË{`CSrÉ6ãϼv¼XlÉÏ®›±'ó4+ó_Wx‚ í­\,Æ™vPë… ›ÃmwLõuÂwè¢$% Óm#>¦Ú›Sí½Xé¾û×Bá-iyEª¼ÔOÕ˜^£Êiu”2VÒæ­cQV¿Á•Ç‹4‰Ñ‰úz•’å°|Õx÷zΣ:N7šYÿ4{ëÑâÒ˜…ŠÈ1 ×Mé”IÓ²ü¼_E 3Þ1Éžº#^,k-vQ,@>T¨ac¬ý„\Ñ3nµ´$ÀR•æíñ>ë4ó޲M;>TèP/-®§“·0ßkMÔ-•áJ V›q˜›{ã\ÊQÆœŽˆŽIìÈIÝàôæ/Æí â.e’#‡¼NŒ<_OFc§tQ›»¸A®bƒ—Å‹.\³S”Š´䔿žÃ¤m¸?·W8Ñð—Nàžg”òH ƒá^L²(Pc&&ær›G‘¥½íˆ°u2<¼?¡¯ù6_®\Ÿ\÷ÐÜ,ur„F„`ê弿·)£ tÌ4™z+6¼ãK…˜ŠÜ4fѨWz4+¶˜ãûùÆÌ¼­„äs‰xvêyùX³¸’Ê÷Ho]>æðLJåŸÏs¡(DCC¸hù¹œú?q•®ð±>R î*veüvØrÄŸ…+Ñ· Âæ çy”Ó~ÿ\Ô%Gx‘î"ö§|²W–_Ezìuï©ÍñØwÍ ˜×™ÎK=ö€rÓlŒõ®Ìø—åÏVBôÓ¯¿5Ç‹fHè‡Hv¬ùcó.e¤EF(ŠöªÒšw(¶¼ô½ÉÑ»DéúTŽX¨å œ‡–Hôáy“bł؎è#3Èâ#Ê‘ #ƒ‘OïGôtYZ«—{WgÂñÖõ€öÉÌ‹0FØèÜß!S“Yÿö•ÉÂùŠÐ¨®H†òzV³£F;Êd/ÞeÄcg´iA7MlÉV #*3“IÂ5¹®bŸ’hÙÖØÊhÁhÊm(yį›kd±jQM0»×HrÇ“ò ôAz^ÖkƒKŒ5¯ºé„Á¡R«LMèîÊ+œ ?{†Sƒ zBÑJ3„ppî ÿày;ÂüO©Š2¦ÑiK— ¸2P"‘ó¿wÛx¨!-íJY埫7ïÚ¶ÒE|•¼µ­“¥ìýâű¸ñ4LB-/õ´ngiy…#R·~¬}EõÑCof³¶ùå(^D[CÞíOʼOÈÜž7e*8Æ%ˆ®ƒß{¹'6Î9 dS3O¥?kEf},ÅÆ›Æ&¹v¦ùk¶i+ÃXwi©¢1ïÛÝ:ØqÆ€¹«„ðo ‚ÐÇ}ÅëÁzÏ]WYeˆÐâ)Á'UâkIúQ'/·×2b'–ãrÕêú»š˜¨Á«0êⲂÃÍî;«¹8·¨<—ÃðD¨¤x¶xÀát#ýN%~·n…ÈÃfج£õ¨JZ:Ó™& ¸Â›óyÀ~bGåÖ+¶CÑv<éUÔÀýÝærâvNuàdf6NyÝݵ³â/á95+]å‚(ãt‹×—žÖs—µ®ÈÛö•æ5ÿh«½´|1{Òµ}4ïw`–S¨Ê…,Kаvb&ìð9X¨àÌÅÜɸöö„ör³^ßçJ]5H(ªÇTœÑ(ÍèÞé õûϸ_`X¬ØöWxûᆫáβìÑ¥Q>]ë’Êó’Üol?ߌP kE\3%ä¯ÐÁíÓªºpGN¸¶•W¯c`àBK pqàãŸ/Fyk¡‡-lÉ,»)4m{¡a´éq J*›¯7ŒŽ5„ʡѿI‘²+(J3›xFÀ@&:›…T8uÔ¡èiË2ÔoOl /-ÙVî (6ÐV™nqªúÌ [¢$î0M­¶ák‹ Á ¸ærç<ÉÃðóÀâ÷íeJ: ¦½ `[‚…4hú€¶.çK…œ;ÑF¾Íh–9ó]Ë·h¼ªNDœyØ(e¹‚*¦)Ë9¦v•VÀè ‚0Ò=ïNwfÝÝx6d¤žSéõ1ŒÌKªâ)ªæoæU™Âk¬€Êm…a›XUâÝN8EpC¦,+¡²Ñ‘Þ@¬ÓX–s=x3ŠCZJ—õ3ü`†C©s‰Š©dVB•s©Ñé¡„|#‹,ÕZ‰"yÐב=:]yùv¾ñ|ø×.ªç«³FœPõký½¡V¥Et.ì$8QU±o=F¹Œ½03VkµŠ?Ûñs`æC†²j¦¸£µŽ«1Äg2–öùîpõ‰œy•Ö5«ámuz}ÝM`õô¾õçËg]š ­O69DoÉ—KmÎÚŽ=o/ZbI+ñB| š#Œr[’4e‡Mü:˜xs"*뀅–0…Ϙ¼Y—+ظèP>k¡”‘=x¿‡bZó'ãêÏTõ°Ðyè›Ì ¯ÅèríN½€2ð( gx.Hk¢:‹$]¸žxR(Ev´84[³HoJ›#ÌÐ3tŒ‡åI¨ Ä:¥´•S0¥(¥³ƒIŠM0‘›§’¨Âª®kÊ\ì)­sÅMB\»„™Ò9ËáïF °æç5zQaAÒì^⤠'9C^‹FèçSÁÇi×AC8uˆW\¢Î~JÔ„éFð¹YÊ“M‡§óR(q½J8—žÂZ ù®{ÄÔYð#ˆð] nž¢—aŒNû R˜„IÆÕÙªF»çiK]JsŒòu•dÚ/BbíÄ¥®é¶n,ÁÐSÃR’Âë •&0È Ž@Œ",´QIo-Þ(ùÀ!3¾ö@µø¬›ÃK,ÆïW}jÓ‚G4+3ä .šQ³l£ÙiN‰Ž$/¥àcº ùÒTÉ «sØ•¹ê*¨bÅî,ÖxYL±5Äðyƒ¥‡dk‹ Îk)¼Iá\0%+‹ôÃ¥«Âç뢀 „tj!ÊNøéx©nL˜räw¿3¯­§L"ô4¥l°»ˆQ l7š½÷Np¶>Oâ³êö8Êu§)i°îB æ«¡ °VzÖO˜¶›?ÈŽþ0xx°Ð™ã¾hžSp$©~ï–6< TœÐ‹·ÅùÝ<àõ({„ØÙôÆ:¼dz¯?Áv5}L›…«Ûn⎶‚9ês˜eJ^Œ·\a©hMòªh3k¶œFרvBÍl’dž¡\)8æ7sÍïè40ëú^’Ës”uoÃõê;(ÁñØ*poÙð%¡±Ê#eñ¬ {£¡ûD–ìf€»¶rîÃ,3¢r‡ô®oÕ¢v®q0ZA´ëÞDéÚÛ ©H(𠶤ëàÚÏ)ÁŽsúN/:hª*àÆ|L™¡\Ø·8^´–o &å‹®z·²Ìãòj÷[o+àÙmP~Ÿº,JPÁÇ v¨°fó©ºáÄñþ½:ÆHS§' øF+Î5F‡Ì•pé·EeAë81ŠžåZ½†¯ÏÈ‚Ç0µEëxÆ“QŽåxÞýíØ &Ö¤*¸ÇÌçtåԥƎ ÈædU«…š\械»ý~§(в‰Â<ž×e v^Âò‘-–Ðp—Äjº¦·Ð ¹Ç‰YsÝpí£Â¬î¼"*æ½¹»‹Uxöõƒ‡Ì7$ „Ô¦H_}¤ºØŽNþÓΓ$Fh0'‘êõ\Áú ^dϸFʤy˜õ&\Jú“C'h{Ð2-,åëD¢ƒÅ¥ílP FêÈly£/ÿ½¨UØŸrQhˆä6§[¥É^zXc£t¥“žÓ¢õ6é½#@ÆhÜ®: µ5o¥y†©j†¢÷Ã\nÒ9œ’3$&m¯JO²›L¸£OúZޯй‘‹@áÇ¡çPÃý;'ÇëÜ×O9¯™g§ºâí'( éÕ:9'ƒk·²!RT áBôù|£BT!B®», l‘NßÓ<¯4¦}«tÕB'ËRú›f‚ÐÉ5AÉ}•´lå¤^‘/8‘Æ2IIÖœßÁ¨ºGVŒã[”†<PwãPa%¦Qëf”m{£EÒù«ëJc„3‚HW&bôPéÅrqÙ^ô›²¤¥°CCóXƒ\ÉOQ#^²¼›#é C3FE9A¡Qr”ov9­ëy^­Ýãäëžam†ÏxÓÉU†œB‘0@IËC.t¥F©Â÷£+€q\P:S°¶qù§Á¤¾U²MGˆx‡+ßÿ\®Ã!8ŒErB …þÄ%œ<˜AÈ™„ðGXdÜѸ„ŒA T…€¡Gð§é=X‚‡Ð— §£¶i˜î…åÏ)݃®QwMÍîR,Å<„L%®ZFäóX](š³Bu«œë¡“N #DU‹îŒUvdÄ1Y¤1W»¼Æù šel³. ¿¿i¬¦ÎŽˆÄç“÷k¸q)òÈù´µ¿w†)˜ž©L ©enënåÓV– »‡›ˆ¼`+¶Õ ¦UFH>¥a”ÑV«àÁæ@ªúi®`Ña¯oÞËeÍ"¡3¾òl— h±£~ Tbé1b›cS°4Äð„5G¾àfÑýÝïxzt¶ß±#qËYpAÍqu+~÷­ Âݬ"%Ï´Ok‘˜úo"çщz„ ›ü YÐR#ƒ`b.ôg?ÞØ{ÜÏÊSd…‡ŠùᢩÀïgÌ<¼kð„©häs¢õ æ¯L˜;ÔkФžàÌ#Äí;ÇNµÁ;*Fr¨hï¸Ü^^¤*è·¦9¦%Ú=Ù£å¦k^Di7û±÷ØÂ“T±²Ô€×“HåÃÜ1ÀM÷7„ÝΫ/í·6Í*æ¼Ç‹ñBÊ¥Û. EÞ*‹šÎÜd{5²X0”0qßQUiÆÅÉ¿A#Üg yuŒ@- dÁGºôÜͧˆäQíé¨>Bå7Ì¢ZÃŒÆiM]8èD_ÐT†¾Œ![²3È¥´µ0˜x#K¡NZesðô n9Âlé˜Z´Õã7æEƉñ¦ÅÓ¢Ö°jR=ZBìÎ2É¥EJäNÚ„…ýbd2ò˜Û^«òâÈ…÷Ö%HÙCƾJp.€“Ëˆìø·¯,Ë™†W‰«Ëê¯n`4hî9›˜†Ö‰zöÕ$Dõ˜AdDà=KÕ³DÒ=âˆñi%uŒ+XеRÚ‚=TrÖàX5«žò^Ô¸Ÿù¦IB+ÃÀŸ5&„æ÷Ün—x!<ßW $tcÛ5:ל¢0d‰G/‡æôæVf³†5×3dÍmÌ"£±zBCž:ã«[Â_[~+«Ò7#±»uÍg9¤ÏeZscnAòû]@¡@ò”Ô'pë…ÝT_ ˜2[&Šk8ªæ¦ΆÃZ‘€åí]H¬»†”ΤúR؆¦Õ$ÎuJx0 ™bZXAˆ)þ/ú=¹¥ç0e YÑ Ol’­—¶UæëÜæÂõOŽS:ÿ?ÿsþ/Nñ‘ñãý˜øñ‘äCö‡w,ÇðFþ/·èèc#ÌÔœãjN*’bT†¸4ÉJ:a« â!I¢Ñj¬¨Ž²@n«ñª§u w?§Ž‡˜<îÕ¼£먹1¹á/FÓ7é÷¼ëÕîÙ\¢^…Nn™;…±:¬„E,ðœó%vs¡ScNcÜÐÿaÑääPêp“m,”*”nm[…š1}a:¨“àÛVª¤•ý– *Õh›¤(6¢ ´›Ï½}ü™³Ý¢Û^ÙŽÉhAM¦Ýëá 1ꥋP¨© ú ¾€î RBDr~Z Ï ¬l’bZ¾o˜r’¡ÿÿ .ì|ÌÓ/.§Â^ÞKéã&EÆÄsCâÓ®Aà… Ün4Çw˜Nw…ôH$â˜Ä@Úê˜ç8='cVDnw׈±E¢%fï_×ä†T¢×‡Ó‰À¬^°)êæ>Ö‹R@¼‘¹¹m0>­?ö¹JD/™bº•"9ßÍž~¥Ä2ç5n¶baPiý”0K ß?,m~~ô÷ÿG¶'æœ**¿êÙ¤ÕމÆ6Øx*(ÕÅtp‹gÏTUÆÄ+Ò«„(±¢ –ƒ×E|10ó~õV'|)w•¿—ÌÌKùù G"…•ZÒv’øÈ%†˜Í)Áàý†c”4‹wæ+D$‘&!¼Lañæ"Ù®±6v¿ˆ®Ò•Ç -~Ófn}„ˆ†½ˆ:ãgÉ«§t¥[ñ¹GûNZòòö)§ãòÙ½ð!'ÎÓå©¥ÿ]V^»uëóè(Å[ÜžßûÿhSPvSGßÓ°Ýú+›2Û·Ûýö’¦Zƒhƶ6¦Œ¨}ˆz'ñ® hɷΔ,3ýÍE¡N¡=íŠ ªû™8î«fÄëæà73,MÊ/Zþ½È³xúeh€[pR~Ey.½~­Ê¼fƒGU„®²úí·Ô$¡ýº»û¤üÍÈÆ¢­hZAUz­jçqEYäÒÏÏ«gÏ7"‡×‚8E~ÒkT¤i:d cgDzÚk¯Ä~m|™$øŒo¥Z± 3Ã}G׸ÃRùuvgLâŒ02¾L«¡ÝHÓ~CSŒ’áåù_ãŸ(‘‚ì(‹Í„Ãtt懈õ÷öÌ™¹ÈÕ œˆwßt'”)$rˆÝ†œÚ“èºX é¯LÄ!"z\ªÑ"šawO˜AÒìv‹x‡l¤@u‰ÆVìµ)¾r™³DòÒ@œ:ÏËò¶óEóÇ1tpÜ¿Õ\@©Ô`žþå<‹â*í~V @½Yå`·˜ÚúÖCN/zEÞÕºT†üÓ:úeX0TMnê·3ãDIa'÷ªnèq ¾½«ù-·“8¬Ÿe­!\´—m^fálAòÌ{zÜ/êš–$ö:UFµ_¢tï̺MÄC½NøW=înc‹±Ê¥¯°Ta.C’Õ/•>l–&ct¥Ñ×+Ä«ÊqË[‚¸]š¥7 çR»f9–î–ó}2÷¬{c½'&ÍjÇ9‚ç]šIYÚÖ)Q“ÍÄš2KJ0.Êôúª§u֜ڃ…T$£…ȶ•&lä/~ aCúùðbkT6»ú?Óm¨í)¡‡m ±Y—‚ ˜T¨ÂQ9Y¤jÓBø?¸hgÖGéÔý0.œ'¾ûú£§'K˜ºmËTw•-|ÍP+¦r¨ÑÔìF,Ä…¥áÃ%~w׳ӓo…ˆ7üXó*Fø³<ÈŽá yt÷S¯W²]1ÊÏé“:Ù¼ $¶÷ ƛԯƒ%­—ÑÁêœû …g½ÔEÓð¯éç‡_{q¯@ãËgé¸Õû£¸í_P«úÊ£7ž—.MÜeg^[J€ 3¢’Îa×êp4CÐ9LLªmÐø«ôÉ}nYr?}R¸p‹Ÿr8L¼<‚GoÐV¸»ÚÄ>xFN`½Œ²ÙMEóÌ¢H៪f€‡«µašv8 ×ìžÕ[¾HNÙC`4¡cŸ)d"~2Zåæÿ™…Ó®5ð¨ô"9W—((±8žfq³¾œûøcèÇÁÞ²fÛè1wt3ÃÈ/¬•†ÑÜd |§…HU~:Øò³ý˜µâ`&Ÿ-ÄwsæwRÇGõûóOT3é¡M0NDóÔueÈ1-tñŽŒåS ù§ zŒŠøû>–î4ùXQåé/ÃI?I.½Ddw¸)óÂùWÌʧV*6kVw äŒ È@'g´{É×éÝ>v©¶¸aò8_ªo¥Æ TO ?Þòl7«Í£(eNä³¶AgÛÃJ1üòª5^=rQCôÙ”6®….›Íc™ = §@â´ƒz»v®6‡Õ±‘LL!e‹:POÑ)Êß\ÓÍle}3ë®g>»H u "AJxðØðœ‰¬”í×ä„Ò­ -"ŒÎ‹ËpÕ·ÆòšŽÍàuìQ¨BÚ‚ÚxÖïäúÚ`kå&–p‡É'ç¬C‚–³¶FÄﲞù¢eïv6™#b5¦f­Ê´omæ@8© }Âx%¤ÙñÀ6¬¢ÂÄ i‚’ž;0 „õMÞ‚.™ö6<¢-²Ñçñ[Î+ž·Žìd}Ó;·V %(ýH…ž¬úufrÏ?E¸'ëåˆ{™ÙóqÛ˜‡|õÓ t—&<‹}yŒ73×òYó VP'+ØL§•£˜)ïââš½}ÇϬ</Uk§‰«w]²•Ì,Eêˆò®¦j¹xx)‘ÓÅâW’tÓ£•ÊJª‘Ç<Í…Î{‰EòøÖˆ‡Ht×·q¯³umƒÙ’;qÝÒÚèŸmÈã¼³ÇÁ+¤Iv¯¥'™žú¥BHLWÍ.Œ§qŸ2¡K3Ô)¤(¹ø® Q¢sÊ}¿ýç㨋Á|ó ==rp©QY]Ôè͹x`áÔóçuµå-˸¤íÓÆ‹0o‹EÂà rE΋¥ä«*A9à/_ª¾õ÷x¸£Ñ”Ä‘‚„+qŒ©A•X¸gñkúü)AóZ§i.ÿ*{¢·ò™WãÊý|¿¨K·Œt«ÙÆüœˆÕϼNpq¤•dmä”ÞÑ­zׇîðSò|Ú^c¾7¦?uŠÈÍWÚë;+Τ©È¡ªÊ‹#¬;¦!Òc^‚5zËÁ'ØJ5d2Åáy5î|AèÈšîïy_¬R—Å(tTÈpÙÔ%ïáZN²vù¡"sÍlfõçÓÐÑÊÏóÛ”c_0ˆ‰åpv6z÷ÕÖ|ï0Ðû§ž†ù`w'¿-Ý+YŽRO÷UâóMçÂÈXoÆû¤ÜOÌBº’ ÇäªpiuIqW"yƒÊÁU&‹–Îö¦®)ØþØ!¼bõ;€é¢Úý){²šC1ÿÛÖHvYòMú©¤uõ‘¨ã¼ 6‰ê*æÓz¿ÂJ¤—wDä‘Ç·ƒ$Á_‹ó‡êÈðƒ³»]+Ù3e%³_Úæs×Unß\º|üœ|޼oWåÁtCŬ€¿#n¢SYûÄ»—…vðtNª†±Ì]i±8¿VMòõ®iÃÄï:Ò˜º£(š;ëm2m»?NȳMðéÁ×_^]cqËAŒë’„ýs²#毛bX/EaAÝVz|,ÞDú3®£–×@qŸüzôŽ‘Ò+ʶ…^ÑT =D´eà"9aí#Ž äW³@¯–,,wXÐÁ šúT†ÐBÝ#-!·=™XÕ-bõ¢OqÁC·NŸ¼g`óë>†ÌÊ™¾G!±à:ªÅñÍŸSÐî­±•:ÐkÝù¯#Ê×l/üéù-’ê|‰]ˆ;dOB‰g_ "rôBêË€ü{ÝÄ9á߆Ñ.òïyòFm¯V/äE¿â»>3ÍB GŸŸ±ÏÕ<Ôz?Úaü‚úE?¤pþƒ”ÁÌ™á +È‘äË2âè…¾œé:“ɶƒZ“­Àxªà{Ø]é–•È‘S¦«””ŒóÏ']¾jŠ]ÜqÞ{mêÔ¶×xWœ6‘þ'ûÕ6lÆ”¥1NAœç–ÔèáÑlhš¹°ºj ²Dúˆ¥2YA¸^Ý¥2–•AöÊAó&ž¹0_—EÀ¡ïíÅ9E‰+ëÜŒ$<8º#æò¼“éºÆ¶6zEIJ: Ô¹ÀÁ‰A¹·|B½sìHb[ñÑ}fËRCí+ñ -w#ÔÑBñÏM*AÇqéÑû{Ÿ’É…äöò¦í;>-Geø_vî|±ÐïøQǽ,sŽF+ëË ð®5㬠±ƒmbê³ÀÙ%AnYï”ÐÏÎýK 8±7|vïÉLåØÓŒ¸ìô…9s§virkpU—CËY÷Ï·'V°óÏ># û§K†Ï=V± l¢XƒÆ«mCˆxa{‹¨•Ÿ0åMo‰Ö}û¥ë9È:ŸnæùÆ‘Ïx°ùÿg QëgøÍÞßT¯³‘€ˆá€;äæjšD©—·¦]Â>fÚÈ€•¿t‹Ë õF {ŸzÃñ)á;RMш£{‡Âع:Œ¿^‡S©šŠWX÷h3¶äÒøÇ ÓÕª#Üä\þåáAõá Úç ’qƒKÍ×2®ŒÉ%²›º;Òµ¾~š§Ùj}àz—±dnú×Q¾àH4W—x\øÌ²¢B Ó¡ëVp?[A¡2ñeúÑBÑñ«59(Z¯¨HFRi)]ÍÔ”IÒHb‘{3ý,5àÅøÊ…uðèyž…GOÍ µÇÅ>ðTÀytª –OÇŠ×2™Ä“‰‡¿þÎïiÿV%Ç[0÷Ÿi'{Ï›Us2 Š¼öÇZ¢fÀlÞ#§ü|±IHñE­u£è…òF¯1gú UÊÏ Å“Jç­âØ }òÑ–µ²©Ò {QËM÷Ì/•Úª…ÜäÛ‚Ò±KF1¤:ÄTå8 Q÷õý~æÎù[È-u–`÷8FUíÕ¨FÕžl¶|ö#@¯'÷r´ç—²•t*»üµ«„jyèËŒ0¡+Qj5“ØFCNn0:SÞ;M§ Ö*Ù?"^ÈUŹÃÏ;@^^´q5¾M ŠXa=aÊ¢F.&ñJ>C˜qy—¯äܤ%<!äÒ´±ÇVÜy ËZœ,CÅgI',ú[óg~+¾Ãuפ, Eˆn5$4ç4±½h¡ Ö/Ãøo^ÕzGx¯¦ñCžÅ?@ïN‹³]ͼ ¶u:G•,‚pH'ïÍvÙ~(¼æõ-«^3žuŒÉ£=H؆y™…@çvÓúcBïÒ¡ÎPÝJh§ÄÑ ”õ||²ûà Ç—™Åƒ²àÉ*Ä þ‘ñqï’+&OQWøÀYhÜFbY%ŸÞœÑ¢”£:IÇ·Pk$ªÒVôÿ€šÛã›´Ù%ùçË!ç&×mÕ¸ší€M¿5P˜u ›^,34OPÏ/_7µùP-ÕW ÕÑ£j{™Z¥ˆWcÐŽ¾÷[òÌVzê3FÍFˆRUƃpÉvc}ß“6[¹0jB™"`?*Å##6èÖéÛ‘EsÏ÷®ååðZËrÌm?P©ÛtኮëQù¤+ ¥uädß%}.'2éFÛ’ÜñCå;@»o={²ý„ôH)(Ï^Í•QÐyw–Z»²76]&ëÀ›Õïä%·qk‚ò°u ünÊ$ª¦–å#ßv[.IDktHÞ. fÒýV$eàEèÛÏeM»)wf•y.M®ã£ýþý(\¬7ŠÃ¦ó9ÖÒqâT5êÅ »ê²$¢·KƒÔL·ð½;Ü”—ÑÅÕ«\Ƙ~ãb 8ùwfز)'·¶Î|õœß±ãÚ7%Ü‘ɽh9 ;[æwrèy›ÓN›º v‡pQÅ BW;_¾þ`Ýóµþ²¾©Íxåƒ+Ëù>7Æ…‰ŒãÆ/î ¯ö3( × '™b™Õ§;Ú'=1T”'5²ØáÜjYͪ¡´¼þ¯~Ê!2»Qu*½B¼zäq•Y$è¹ÌšdŠ‚~Gßä~Wš®¨ëÏÈj0¹–÷W’Û]Lµ_p ©©xª«zöráÊ«?¢ä|•%>Ði¦Ë¯Öæúþ¤ß-Û\Ê­ö,tXÝ M”-¯¶E€à=Ç=Áw5Ùô”wkû‰ÎÐÞÙ\S"víDõ°øÞœ@·.kÎÛÚŠËYƒ°¤JÔ.) ¤²ÒŽ|ÃEµuåˆ*‡³6˜]­î hì=1&žƒšå–äÛ!â<‰jε·ÊöYÚá÷5XÆ63 W¾sap(ÃíÇX³uKU9:G³Ü•}¹"õWzžìÄUæE/¢VºÏr¿_7¤{ ZtœI$°¤Dâërq­c²Ã†TÕŽk3€¾4ƒDqébÙÈáé ¾ìÊJÏÉéÎza6—‘]ÌTšÔfÉu P‚ÄýïÎAêj, t+WS(JŽí)#Êí:7ZºŒD=vBÿ*•æ µ“R|‚è#¾aœ«© _$Ô3'7‹Ã<śͻ‚ÀÔ³‚úÕ9 >ä,>–Ç~Z€×Þû‡^¹?8QFFñôˆÏÑà^tìŸ åq×Ã97và_ê G"´åuŠ|Ÿ<ÏÐÙ—ÝT›Âò@ð«)Î?’¾NQm•Áqë°ðe™s¤6ø3е)@¤×“m±¢¨+VEÚ ¦èA.pŸ–þ¯”$­›ÜøÞ+N™2]²»Â›ÀâÇlLvÀ+ßÃW&àâ×T¾É\‘ñ¸‚i3¨WT^qpŒ‚Ý‚“Y0q7£*ßø>+ (éz`»Z³gR˜r™›]–YŒœmÃD§97Y ˜¦00!3ðoæaº&þ½'Z EÞ¨KÅ®§<`óûMÎÙ–¾KõŠ\…Ygýég¹<$ k±nz½ÏDÒH¢$Ù²ÌIh”Pøq1é Þ€ãåY0§ÉQ©Á5ø ¬ÊÜqŠPã-ù¶ú5.û÷w¤ð;ùse9 *VªZ&7ùåäæzÈúGÌ-ï¡Áª?¡±¼Úû ?nšK“F™…>&˜íü'p†Q¬¾~Õ8º_jتu¼ ¦AÓ\žm¤˜ÿ×—ÌíÎ 2rÎÜAƒê(YÜÁ΄ŒîéÑD`¶M{/«zv=Ù¥€¶ÅööÓ¼d‡©ÙA»}QëE‹54GÖ•gcäð¾ì÷ÉÁaÞU¢àʬN3 k¾¶ÖuëØø‡åyι„×ͬÖèžå ‹ñ“ß è—8øî[ñDÊ<ì…±¬?¾«& ­æÍ×z³Âe°1vnjðqªE>a$ ìò¸Û³¼|™ÚÂP"°¿Z­ù„^ªu9º$ñ2tLñ:ôt¤Ðí(¿=Á–q ñsœùÆvJ Uð[+ò;‰àÑß¹ëHVHsºÝÿ,jövä+dΦ;¸Áåy¿Öƒ WpÞw‰>#Ž Žø°òuu„/©E"<OÅFCžh¥B‚#mÆMÏhÁé\²¼÷!R fÐ#€ªÁ¦†©™Ük'D¢`°õÁ3×wÇž“@M¡.Wi§ÕŸûµ2Vh͸ûVƒv>»øÏK¦-' ¸&4ÁÉšyU÷w›5ŠÀ•ù^fA˜¤ÌNniÑÌÔâÕÁqÅ­EAú–î(1«zƒç­V$·iAé pï;;g&šÕfÜ|GE¦6×QE5Wê©É„(‡7& v™ð(".Wó«fµFˆË ±Ê÷µãDZPa¹?ŒwøÕû3”ðqe÷3= ìü”¶YGõJ‹ŸÀ³¦­K¾Š©ñ]9É+±ÁdÏÚÀMè”™d‚ÔïH3AÖÙÍ(­@8ÃWž¥óÂXwüïÉZΆË\í¸郌}¥úõWÍRq¿¤ÍÃÈ\´ )2Ó+po0ÐÍÑ&‰®€{4ªÇ¾æ+›Öuut5;:ô†î~¡5R•Í1EƒÙ+e“šäL¶]]“qý!ž£óf±+„‘”)ï-/äÝ&]Y-o2hSŽ Ò.Ÿº\œËcìa?µW ŠsîaláézáIÍÀ—ºš^/CnH@ÜzTt:XI[ºÃäw¹ Iv¼˜Ö«WÝ”™ÐÉEMßE“"ŸV¨öÙR7(d¿í‘hè[Š1b¬•ì5 ×'§=gÑ\} '¨RÓ®î ÊÚ¹ÎðÙ‰ŸmoER]ddÔ?»WцyŒ°mÕ±,  ¡À®š|Œ…{ «Yù½àÀ¸Š¿é­…a ¸¶ð”þcI‚ ¤¸D1¬Ûª{(žù¶~Ìqž¢.ÃIp60Róv§ã³ñ’U+ÉÜ¢¶@­`œ,»TTv† òqü’UÔ¥lŒlè\û]è9PŠîCÎX:à\jáÇ¢5ÀÉ­xD²†Eª™gÂö(Ê5ah›Y4 ÷ÊÓ(›ö%øˆWãòPíåòx<^a®Ëk¸ag;åDU§ù3X9Ù´ö)HçÔàÈâhÔ§}AÛà¯öuìŽìaóx¢€*“Ò½ ÄM‰gÎ66'²õjÞ¦r’NS³Ÿƒè4±½Ë5êZ÷Å‘øîdp(ÍÃU Ô´ê¼"""[´I›$QY˜º.±ú:?e›Ê)W~âp½ u-"…Yñ”*š'wÉó1*ë~Í^_ïie¤$n ~“&G1Yyž`Ü6O³Ì·N·(N-<ñw7«`å„ÂñEm„²¦a– $ìÚ>i4Î0XˆóH> Þ¼ð’F-"€Ö ìì ðSÉV|›ó¸Ð4˜v2çS-Ì1 åÎ<“VD¨ÒŨBû—7 |Dîrüî^©ù"/É'~Ȩ’ MH#à»Ò½´?é[Z¤#Ló…¬’š‰›×Š{ÙŽ€SÔæ!ÑØæé‚) Ü'yt«xQÁƹƒ’¤´/k0zª¡¹òvÆ)˜Í,´Ý½Öç›ú+IMÙ$+j™… ^±Š3QfW÷îr XJÚ8°HUÖ¢©C¶žJÊ{AÓ¾…†YØMq&¤ÍшmjTMMYŒQܤ“ÜŽJ|ÖYŽî7(¼ð}”ᬠÖX‚{q!0¶ïBµáaç†ËŸ’4¸CRh•§€tíAÝÅøk;©–d)Ïp¬fðsïÏ'wÆ5›t“Þo~«Ï÷œÑƒÎ/_[ ó]t évlnß@Ô)½¨b[„ÉÌK˜ä<æÕVIMŒ”-š=š'!Õü˜Šòó¼Ó¤ Äõj‘$\0Žcºµ+æ+†';s—àÜ5\†5´åŽ W{Ü9Dž2R­,UlkJÂMBs8Åö(H «°_÷þ'´îŠƒ¬èBèµÔêÔR\øÖ6L’V‚é%#<ŒY$™PìÄÀØcŠÈتP]J¬¬ŒaìF§¡ºO_KN>'‹×rÄhç+'Gê~½þ,™8©ÿ,Ry¥;¢vuý+C§i×BH±x¹'寑U%¼W”B³ßrAÓy T&Ò’D¡DtÂæ¼Äd$ѱIô£Ðd8vtwš’¨2©4º ™Në—ú°u¹§˜µ:º/89cs|'žïËÑèú¼æL #ñ E4'iÃíÕsÓW”ùâuŠ—[VN¤+š8~‰ ·Ž="ãÙOƒ;;¨=?•ªzvºl«uqØ'V4aB)Énª¬œ;$ ñ<% îUóßWÅù{ðQuU%DâMtÔk`%ë"è»`¨B±£U â]Åc¥k(ìP|ž)¹„³Á­î‘¬‹ÆÕ,êt×Ñv` ²•l±´za—Ýwå Àɯ Ï6Æg’ÚÐ-Ðå` hÃc@,q)Ðb 1/¨R&x²o xöIÃ>‚'»ö,I^l¨›æ*¯1Îæä^Ï/ºáýuuãÕ1‹b-4Ð2æ‚NÔqDæ…C!Uã…°8©Iðbj)\b íÞp,òò£76´$®ÍÝ…!`l“‹¨¾‘±b&’h 3[<å3‰åøÎN—ho̳ Q3ã­›C[ÕÕ¨ZécQWöÌõ¥¹CçÍ«ÅUþ˜pÂÊÙ=ÊŒFcä"Ô–Y¯æàÓcN­#†çœ`¼¡!o"^€Ä-oo- Š ‚Òè"J'W]æºM¹¶ðT[k'ìm.Okg7HõÚúbô%šAAžªÇ3©¿Áˆb@6Ásðˆ\u´á”Z«ó1[¬%Ù§JR\T5'q¯ Tc+‹4Ÿ 6¦o'§Šçƒ‚+*+¦ùlšRr‡Ù×TmÞB©Üœ"( œÆ;sé¾1Y½»ÉÐ<¼Ü¤ø–pWvžójBØD"!hF“ Ô}aA׬Âg ì‰Qά¯>>c·‰sO5 ìÎi±ÞT3¢ Âå+ÄÀ℘–—qP”÷ºÊo¤¶Å›_48e<î3s 4>Z TI’ùMnI¯ÞYއ••SxJ†ˆ&/ƒ'EdÂN›õ-œíTAlCrr@¤Ö•/`Wá×ÌÒ2uÊBƒpÃ$è\ŒÃ¼ãã¼³®Àá0:Ë Ü7‡È5ˆÎ(ëˇ;r)”ÑIYÜ•Ÿ>;=#FåNÙ“ßþíCª:–º…Õ³¸Mc‹X wÝðøPóâ ÉØ“,^+ÎO’X¬RѰ€Ì¡Šb§—„\¢,ùE´Ð;ÿÓ+%Ž[†=““VÃbP»!+U䣱=ßÎ+›÷HLÅ­¦öÛõz¿³n6à“¹ÄLÌ|ʲѷ†ž3¥VI\Rœ ÌãæÞ¯}$’û HÃÅ.´ê‡­U¡1 ‰Ò”˨ êæ¼3¥–G^ÉÎå˜ZŠN ׃ªfט¶3¤FqJÌPÕ¨V˜¥‡z®fT­Q& X]Z¢EhüÚgWÅ%%]¢ACéjm®0 \@íÖˆ‹és†}û4Éy4™8 ܛ˵á„vy乄D­ÙO£¦QþÃËGzf½íÄ&¾Iïp×TI]yŠ—4¬œÝÜáæ$€T% Hθ ³ 9©<î<‡—Hy7¦÷4¸Áåš¾w‹Oe`ŸQ‰Ó1ßs”–akлåéYfyšÝÕ/½)ÃâZ[ ÷ËRÓÆ68 óß*[ÇœéÜʵ՛êõÊ”oÈ®(ú['4nv')eg¯™ÆóÕ’M9®û*ªáMIàÝ–¦Ô§7Ö–Ñ*AÜ;q/²&J›ŽõüÙÐzžáõŠû¾®{ê5Ôu'Ѫ|0¢–Ths³¶#ZãÌBù*8»œúC4ò¦Â=D`´"NѸðÏ£IÁ%ÍIôûJ2µ¦ç›¬Q‚„g:Åj£ÉT‹sYM1žô|ôÜ\•S·3 ɨƒ#ЂP\ÈŠuÐ=Fj\ÝcôÎþñ .wFèú—A@³Ä† ·Dù^*¨÷kl4ëRÜádü&¤_:Ók¦Ç˜¦ÝAìé"Ya ÚIjo‘K\Ž ª=g'9 ¦ê% ¹]‰ò{ÇŒ³W0 ÆJ iÍß~"›“ªÆ`AÄŽ¦h·«-3Z¤RÆ…¡Ú R"G$2;1Ú®á4<¬Çl"<CK’¼ Ñå‘’ñÝ+œXš\÷GÎñþÚGÛºÙä|¦#K³Sþ~˜C+ìj¹’RSÙN^#]Q+*©Ý kfKò€eÑuß:…qp¦$§J¼)XbÓ…Ípÿ5¤ò !m‘2UVœ¸Ø›Õ«˜!ÄS³'<`Ÿw¹*û‚ÇRH kP‡b¯*¾ç¹×Œ&È($êY˘gž.ðU;xüiii`(¯³ÿOÙõ3©ws nN»´û&“H:áði˜st¦?{îè}5+ >d/ŽÊ1Ir -òÌP´­$ìœ?\žUnƈ{ ž 7[Dg{ó>¢Õu‡E˜Ô \iÝ:gkð6èdnÖË+¶ùU·C1~nS3¿¶†Ž·9‘ƒSì ‘2tâ M¬A•vŠ ‰€@'@¶æä¡‚»1¥wTÙþnh¦É‰§Q­» ¤ À<PÏô Ó0ÃzMqåÃCœ%9Q½çºc¼ÃzÐÐôÑÐåMÁW2Öå²'¨Õ0Föm3Uu1«–¹G9›Éé ?Y “a౎„™Ïç÷mÑ’öÙÇ[ÊŽ8_Ä•Ê>hi².õ””£¸¤á· Ø™`ݯܵ~xÀàh瀘ZITÑà:Ï£c†Ózg´ŒÝ ×z¾Zt÷c0Ö³»åX¸”õV¦¹rÚY¥9ÀºfǧñY+«cB|ÊmuC{lråªD)ßk[,}¼ÒP),&·[z^SÙÜïa*#gêOÇ«èVaÕ¢Ñö¬ìÁa3f’˜˜ÂºEûô+6'l_¥QƒU¬ƒJ¼c7‰³2¼ä±¾ã`RS„ÈW©U/çÓ™¾ei£D‰¾T{VÝ—5Âmià gy8UC5IX{¡^Ò$¬1æV+È—½Ýöâ| 3³"à'âLg>J$x«6C4·7“ÀÊa-­ßÈÍñiE^!iíñ£Þ?ב¡ĆC(lq*D)~o¯Q5-©¤:HâÖ4›<ЯS ÀÞ»¦Ö£Ê7ÅKQγu¶|*ã~kÜ< øŒØ0DÈŒ÷yú€Ú™S1jWƒ,¢—RÊ›²ÌÀJL7ë NŽ~§Â¶º 5¶[QcNñ~²³ãí¼ÚùŠAtWõ¼Ó eÑmKyÓÆ–Lœ^…t溣0½„y#ùB–°+¨Ö-œ¢Þ6•æ N=T¢]$+³« ý¹^y‚cßBš¬›# {Î'txÀ  ’+«*šÜ=äÇo¶a‘"±\õs‘‡¥ÐGÇsê"Q»ráÃ¥8L¢´"1\âQ¥Ñ==kMXûZN‚_¦ÀÚLMµ6z£§ÄùÃ<¤æ v˜¸—Eô´®QåÚ%ÂLZù*X:§¤ ˆ()€¨Å¿Ïþ«ü9ç|èµ¹azÞ˜b`JÝ0ßÁðЀÖˆÁƒp1LCk5 Œ,“À¾,ý³~ãÇWXöôySƒýÕYÛžBº×É?3PŸËáäÒKw;»Ü“—™©÷µa°ûnÓ‡gïõCdy* äq‡¾ˆGµ_²ÛÙ¬ FÜ£G-’ÐCÿ¨X6ÆßbÏií|ÕÊ‹ÎÖŒ~gºöI*uäCz;ÌÚRó™®ý/Õ7Ê=3Ó`…‘ûHrÒc?,D<“®†Ú(ž”õ ’·…‰ž §¹æ¾~Qô¥Xá¤1åf R¸ãlµpá„nŲ[޹|9¶Gmy5ÅrË ’©Ií'jpÏFFH†ôQZç³@ÀÁÈPQí×£¨ëü+þÓZKœíz?G«^Ð>nª9•xÈòÓ^ۢͣ¸f'wEÆ- ´3o¶DjÆUËâô„eUlÎiæXS°ŒÈgË£w ­·(0š'åI¡Ò( öW?•ùÈ©òÛÛÓà¼Ò×r ©Àø>ÝJ²ÓOUuãD8Ö”„WÇ÷Ü-Ÿ¯®Sï(|ð’3oݨ£Ã›ºÝÀ^ú@v s7åðºŽmˆÅ|xÚ¬°gŒ Ф=)dÇÕÍö˜¨.*¿v01_†CÓÍ=#”³Y.®[ãÒIÓ9A×tIBD…_}'|›¦ÕX˜©üå¿_8)ÕUŽ[lS>Á’Ç3i¯•¨•·¼ôùØðüTõÑÔ21Na*š’AáÍŠ!ô/+(Á|4G‡Dõ0é–ú±ôÌZ–À[ =¸#‘~ìÚ²ª®†%söÖþˆ'\$†ã-žúGÙàþ¥b‘—ŽâËðÿT·´-…˜/E–Oþ ÊRÖwgÕR(¹ÿÜ™Ëzde¥ÄN;r$åÜ]Â\ÃÙù v€í·Õ?°*8Ü}uúZ½°p¼`öM!é?€g(8TA« øxÛÑ류Òu%á^ôÆ@ª¼ØRøz„¼S«Î¬¹‰*Nª×d¹¼7:‘Ý’¢d_€ŸJ¡û$€•™ÂF²K[¹u.">“É˱;,³ß™Ñ¤”väÖïi•fÚ¶‘xùýP,Û#–x°{ªºŠh¨UÌ#Sªt;Œ¥jdˆ8Šêµ¾‰í—¨o û«·e±•ÝÍ\ÄPž:¤ú"í«|$ª ÔZ#­g&êí¹Ì`3ê&:Z‡®ßÐjªí¼ªµeÈõI}5tŽŒ™GÞ]K~fêÞ §›v'Õ%ìNÚ—’´ÞAKxRÀ½‡¨Oq-¿‰^h´¯Í%»¿I½µôw‰r³›!È?O)Âm£G îÚ-ç¡i™ë¹ÜÊÕ«4mºJM—ì¯EøáÐì¡¥tb¼5#'2ª/|{ææ yкqV4±|z/nTþÓº!„Œý|ÏÚšƒàp }/¶F(rNµ >æYÒk*{e¢º d 6T±”Íh VóçО@Û7õ!]Z±%ò›o±¥ËóXî÷¨:Ìn`Â\vîk7CP`ò G9¢šs¥Ð±)X&Dô¢Eö¥ýÓ£øÖæâ‘Š=‘D·Nž`5jç}'Û©ƒœwM6:âaûeìbÙ—wÊQh Èšn3u Ë t™£/T#êoäb €^)ñô.õ´¸{+äeÜÖ€¢ðÙQÁ^:`ܪNüÈšå#päæ.˜^37b—1G@•I>ë§„Ÿó×Âj GOŠø¹`À¤Bz)æ’yu2_ ºü³_n\ôFv/W`yyÏ¿}ÐN‡R­†õz«ŸœÖVP Ú"dÃMy%Ð04Ž. t´CÀ«nê²y@eI[ÑÐc6åUZ”ÕZNŒ¿Tûñ­Ñ3GÒtmÅcó_úý\¢ÆÕ|%$ ½|÷O—Ý0?n5êguÄB^Rf—ø öå.)âàpû„Ì[}z‡TÖ{ \Áʬmì­â'–°2üË,)ˆRÛ {V'ôÈ‚•&–¯³{y`³¼¹‰pîƒï+]$í’nñv4ý „¨V°Vê?9ÿP^lòì¶}’@V™‰Äd®Úg‘æ|uôÔúÍ"žðŠewýuB{£îF…ÓÀ­ Šg6 2\J>¼­ð빞ÉÙóFÝ­%…L³<Š•0/Råá,:…½TD Ìrݸ̊Sb¾OD|_t™ËA4hÀÈÅ4œ+ˆåÆxˆË™s …d“Œ¢ã¼;=a˜Pt ¿æ-®XÛÍÛF'k›üuˆ¢¯BœFP±ž»ò•h|õ HaÐ_Ü›«2í´Šþ=è!óOÍt±YàK½(¿«@nÆÉ=ðÙàR £N™µ4kdÀDsSxñrIhÒ:ÓŽª=÷kù»äõO MvfMås•8ïvÇÊSÑXJ'®.!D-Ì·¨Fœýå 4’¦R‘Hã綯Ûu0ðL£Ó-FÜ µHêtÕćlª§®ƒ#‰îSÛF‚N$¸:%C&8䎪bG ÒöJ’è v›ð-ßÍÆÆùﳌŸ-®Xl㉗Þw[_›û|ÕŠÚ}“Û@lñ£Œ'—>¼i±=P¾ñ>ƒ_¨!Œ£9‚Œ"˜’ø{@j½~)¢‚ý}Û¾®yÑù1Çé³Q5÷y0²F~;µ–N´ÅµFP7 híõ!z°{C’q39êÌ“šÝ®ë3±-wKÒ¥)÷qƒ3e“•á®–KX‹Ï+Ý:féNâ¿‘xw2G•ï­¥aúzþ·î¾Øcø…=µ32"½–ËÃß‚cñBH/^å#Ž î‡~¾Ž~’÷âî¸_ã))©3½ ò¨ßk¥fiIÅ0&ü˜¬úŸ#n\ÿ,¯…p=€Žôî °#ØHÓ¾±²ýy0Ñ x¹l Zò<ÈÐú7MrïÚú¬V©!ν.š£-#µF; ¢b¹Œ«åѼ3‡+õì*7“»Û¥„r-R’¶@@ö?BT Ñãn…^…o‡¦Äð½øãE7Àî€3øžn®[VñÉ­sü‰M =2z¤ê'ýÎÈ8“« p]J(ÿ_|Ð÷tyw|Aù©ËO÷Ø·e¯>Ñ:oè¶½A.‹Ó_ÙÏ€ÙL¸•nàZ 8ûålEPVº5Œ¬¦SߣN}ƒ¥%âZ)»¤–-8ÕTG”礴7MQÿHUÆ 0_È­¸3f!h9{ÔsãJ4 gᬔÚÀtŽ<¼Ííc•¶Õƒ}­Ÿ±LNQ¦ø:Yá–~ËA·W—upÚŠb°íwïaÿëLôöKy0g«(…Ê&bU‹.£»-ÞNXËÚÈ’ 8n Ä\ž)e9ÁÅÙˆ(M ê‚cÅ*%8³-´i,[Q§XGÓ84«ò6œòÆ‚º».로¬$¹âê‰D§øñ{¡n§š½—¹¶jÐGrXÝ ßûZÓyXºAÛg¥êâî=ö;u¨A>>åwóP,Š@Ú#!¡US!CX´“øCíføÉAàŠÕZÚJ^ÿq;zÁFt3óÿMÑ 6õíÇ> ×ÑëÕ{6àYa³ßhziD>d&Ž’G×úF¡ãõú |çÜâ b¶µKªñã•d/î³®?2m ž–¿–ó6Fï.Ù`<’ˆ'CôÁæóRŒ Óœý_߸“í1VV¤Îj„*Se'“r§Š¤p :`„Tvr]y!Ç•&T³ƒâ£[ÔßVp3S7Z÷rQoç…5Â@Î^´Û\íHžè‡Š±ì“‚À‚·ˆ¸ôÜvQ/шÔÕ¡šôKèIÒ ÂƒËt™W@൹¯ß%avI²åq× ¾]Z¢qV+ 7V=gµÊÏwÞé›a‹€(/ KW<º¢*œ¥ŸÉ¼¨$‘BH›>…׆•a‚®På@bÒÒØÙÐŽºéÅêÏGϽd#.`Bi:»‡Æ¶©äe¡8àÛ@ÂUQ…R³ÚªyŽ:£œI¯‘ù(Ë z^™ønZ7æhz§â^i¯½”™òÖ±¨Þ@AÛÈ ÜÄ´3ËzJ0`ýHÑÞbÊUä‚ꮺu.Š(€ÅÚÁ$Ê®Zj¢<“`©‚ìÌÐeíÖçÕ½èx ×Ç b®‘$(­ý(¦ŽCÕÈÒÏ•®2/Rm»SnòñÔ ê‰È"½ZûÜ“¹P‹)'mu’ì ws-b’„ž¬\EºRFĦÑAÝ;¶ÓT.5¯Sõ84¶\ÒÄg,ù·)œwZàbÙŽß¼)²Ð”]ø¤ó“…­*’â0Läi.´K2žmºH§0q¬bï–¼ÉcšFڪワrsФê~Î{Aœf»º¶]Oô¯œ‚°”è¡Øh‹%W"äFF˜Z±œ'Ñ]³iUÈ öp·Ñ$ž‡ú„Ü?"a]Í¿\#ü!DBÙghðue˜õ³¢aˆÂ­Sô“öxX• ³b¨‚í²Ç(çºë0‡L/ pÿ.¥†àôæ1bäMѤòä‡øÂ™WÚò§Òýs!²v¶ã1nƒ·ˆùjïYÈ0³ÑëIr”Ð>:@‚ÿÚ»ùξÁàØäI4:¦jË~Ÿ]ËÔÝþI<à™'¼§–|+÷?ßn±$I½°©vc@çé q§°£½÷Ò—P*©6ôy©ÈÙ,¬—)Ï¥š(v'9¯é³ŒºîÊ +™ézÉFKŒ`IQä+€Š(TRŒš5pƒ(3@±çúmtÑâú¾÷JK¼}\vT¿(7F”£Ùt(åŒÖGçIŸ£þOöjgæš2N@¼-âŽÙÒ Å7ºõE¼µ¼iÕâS—73ù]¬"”;VºäPwë<ó—¡g¸q ‚ºúºÉËÌ4[?JN¦1DñÐÕ´Ðø”Ðj7ã±Gi|àgÅX›È\¹í×k–¬D0â™ñIžú7"Ž 4{%©¹'¬cŒ&©!ŒªR¦ª—°½|TówÂÂùjì¢æ Ó8Íà£íËFÑŠ.Aª¹|dÀ59塬îPá¸ÉêvIéòJε'^-is”0NnR ÊWH0-}j ÐÆ!$NS4Ä­§ŸË@ÐB2ufÚÍ9%º$Iø„Õи8Ï_tƶ“õåKà}áÌ¥¡ÁÒY–#õÝ8š$ewñˆL)šð¥åƒe›UT »ê½z?C4úMpp¹rü6­Cú¯™ýrž„B°“ŠŠè[•¿:¶NFbš+Kè9ŽÑŒX†žùF…®jÓU§[Heb9Ï"U‡™¥{¤7Kuã†lƒ¶µ%}LŠÐvÛ¡H¡ÿ¤ÿ ˆ[­ÚÚå‹»7—=tÔ…Š‚„XHœ2…¬•¸µ9{A»š¦sê¡gòßCæjêØ¤V¬ö f ,,.4”œÉ%•l%5ÉÎ…Èi’ÇQ5âÐS®ò¸r'qïN¿@ÿiJ[.Œ„{-œéœ·éÛŽ1GÓY}ÞHs(“y6§”–B ô@ÅHCr𖱯9†`¦Î]«lR/¬räJ³Á¾Æ·/ÔIžìË:Cwžõ#2Q‚Ú¥¿yûK,#&¢]ZG`RÓüÚGyg½ß>¤é@©€òmr¥ÅA¤2 F“Ÿøß%6¶‘‰JŸ!°Ë3&ŒŽ…[Â3¸ — ‚Ú|IUba)¾Ä6´ ™·Ø,‰!T=ÙbŠDýœNK„Ń-O°ÎhoR(,F²¯½göá ·ÂZÂZ Û'­^g¡ÕÊÄt„Òñš›S¶~aGªÖû¯€;ÐgÑŒðPÑÔå×¶³÷b™%GÂmf¸Õw”÷AÜÎ!¢ 8¨¯MVŠÂ‡Œá9Æ—Œ¨Â0iV!£('®Íƒ%S@eÝWÄLcF=iƒrU˜Ë0¯s€ÕT˜ÌìG†è=\½|Iëš Io\ÃœŠž³?‘ ¾ê÷òÝúŒ}a¯[ª`¡oUH½CBŽá­ž_ÃÆ–ššDþDG‚*ak&Ði«TÓ»¢Ê‚(1-KfJáPl6Y ºI¶‡ —n:” !1ÖÈ-­‹™2¼X0ö YEÔâ]MŸjs¦7k\./p´äÜÇJN©f/V"bn6À÷zhÚî# ‘E   â{gÌ/æÜb“¿H[Œ|`Œß©`'in{u—x…#F¾ï¡: „ç¹Ãa¹|Åb½"¸@š¬D·{k5^¤/éfõÐãˆÒ¤†}•b¥ ­QU9yUBd½õ¾z qhê鈔J¡– éwÞñËÖ%x_@p¶y€G‹sÅ2uÐB !=Þ‚¿BËðv6,K¢©±ºí+X:çqÚØgå\ÝZgÒ9W{±Û ü§´‘ŸOõ¾ÑiÖ{/|ˆ&Ÿw¾|Îd],lZÎ~M oõ¸Ó‘BL6ÿ?ˆfh„c½Yá²Ùú&eÖKqYœ/PS˜ô·w¬ä„›àËÀl­Î.$¶* LùFF¨¼d”—‰eBáÁ‘Î.lu©rÄ_ÒudvL‡&Æ)š_59‰yÄ m¸Å¤Æ‚]“ßýýŠ˜;v?"FŒN2eNâY©P,Ã<(žÔ¥¼Ð[NƒÇI?*Fcˆƒäj¤ 2„r»‹Ë9%5‰Æ`!åyeá*h¨©‰×Y(†Í-¾”\5suæx)jc{:)=Ùë3!IqjÈ8r4JÁkÁø-8C‹Á TÁ:‚U[ˆ[4¯6âÒ†Êw†³d¯)FÙV) šÞa!Æ !"„šaVGO$¸kaPx¶î±:U«\«“qÃóDx×Q™ü«÷ncgµó¸W@~NeÁS‡çš+†Ó¨E Gx¡Ud57ã^ê¡Ö5I#»ÙR}ï_û×^MáÇ“„¾2¸ jަO&ú#ô!M§´X&©°ËW¸óè5\ØùÜt§×X ¿üF¦g3­ßË`!ަ „r厑 ç¿Rd2¾œ±´”“xµJá<ÞnH⢒’4‘ „#„# l|ËÒ’Ñô)ê£Ò…£Ô–—ù}a˜;j‚*;5‹¨ÈNJ‘1à&ýNkl%î$ÖJü+Ã;Ö½£3©œ&©à—Ð(5KJqDé%O|¢¯>».3p›»ºl\„Þ|ÇË´îÀ¾%"½ cTõÚ4YæuŸ0j@¯LT )ÊÑC(H Uj­Þží@§Q.óËðoùË›ëZŒÍM®é»éÙ4ªÈ‰}Ëq~õTË·s}ïBP®V)n_‚BJMF\ÄXÞ·U`{ ‰»¯/”*NB–)FÆÄn7Œ¿²tÎFm›’bâËÑG]£¼Ýµ “ú #hæòö×µ ˆ cÿ–tf?7òK{´­y{¥²WP’¥<ñd]îy$†(ôLÖd•ûn1šO%Œˆ¼­¥…}…ƒ'q3 п-š4%1…ñZq µé/¡•‡-q;s¸@ aZ›æÒ–GŒÔ ÊÑ~A½ìãOÆgïçýÀ±tùǺBŽ»«êuÓ™K¦„â=LÈyUu.eÁl¸°ëÅJ÷ æI ~ï¼7Lq}r‹ø,†}+ð]ñ\Õi$Ÿ`¨—¡Q¢g«ÇH€þ tÒôñɑ͛º[Mf_iþ^t&-^9Xk'÷ÓU׿}€èïÀL'ÔÑ íŽt ½5aÜĽ–æÞ9<õ BÀÚ#{=3êÇeÎõ+øè¨£øâš9 i±+à¤aþVjÊéËC RK  X¹éh„TêêÂsi¦É´Ò¤qkY±™5ŸŠUÀ.sœÇE‡7ûÈ óºdei£ƒŠ 8Íï›=õºÆ—¹ØãVÚUáxì¦sã¥ÒRg£¬µþ"¹5 @J+¤ògÉYàç½¥ŠÂ:9ÊILÒ—ÍSŒ“÷Pʦ42n€¹ŒYVm ±¼RôŠI®*)mX ÌÒÂÎ+WÔ^ɉÊ5@¢“8ÙºÁ‡]H#Q»çŽ7±TšNùŠ˜Bþ ŽÐN)ÿFçµ3²·Ës})—£;UXUS«S“dvc^¢ýj×èå Dâ`o‚¥\ڻ̌·Lâ/{+$Ç©®ÿßß)¡v–©,ŸÙÁ-£H¼öl]à÷FJÀ % <§0fùÔs™~—¿&Æg±ì¥±Â)D–åt^ûlˆ£ihB؉۽ٲÁ„[ù[Z/¹A PÇ* Sû¿÷|ô4Û¢h¯-ñ;%¸LÉÇ1÷iì ÄãEˆÌëš¿U<‰½ÇÇäªkw3ÍKàô/Í pï6Ò¢ÖA{äMs=CTQ•iU>m×å4"úmŸw «¶*n3¼Çá+ ,•v&‹‰íÒŽ»•…åz&XÉJê]ºÍ®uÄó=mftèZ ´tP¡¤Ôÿ ²I([íçB&fçšï®!)µà.ŒdÿJˆ*°«ßvpÊQ:Ž©akYÖ<•ëDao¸Ž.Ã(¶V™ÆfLÙwËôâ RžAz®ØÝ@J¤Ò»]Ï™F«ÒñºOmxÑT®à>(Ö=2ò¸ŒrØŒq TJPG™AÇaÉñ•gÛ’*1} Õæ Ôªg'ss(ïwãØ©ê¡lKYÑ0¼½Ý+פWí¹ZVl@|±{•ù ”Ò{në¯À˜-#i $}„þ*v6” S€”›&‰rÚ†·Œ¥1të˜I cV3sÙœëÆ›¡1”ú™å ÂÀ2÷EÃK¬6ø"qNËpÅ$íúËwGBdz¢=àÇæínaªa'P…o‡öñsýÏža7Jã¥ÈÈüy…H$tTNÖ Eûù_Ÿö±8iÀáq†œsd„‰ŽIfµ3]$ƒÚŸY(·ô/ËÈ*·ø @|½ÀñÈØ ¹‚߆4o3Àó$aÕìÌ›Ÿ-Sá2ž„FË­¬Ñ¾a ôi¯jRí#¸3­º×d¡ÀTWÙ‘ÔϨkŒ›,"¸¥,Ãd‰ ¹ÞíºŽ%—ôœêƒ˜\oJUc™ÃÁO»jW#ÓärƒŒU8?bym;¡ÌAT­IhPhà%53Fªs‘¾42ÂWW²6–Ø’ÂèxÓ£íb*E õÅÙc—e'G˜)LaN7¤J!ÑS9Jï ºµª‡JU§­Ot” ‡±á2s'¯4½-€Ú­Jv —$:ÛP`¶æŽÝBuÜôª) ë†^¢ãRc*ªˆ:'Ö=:‰`L³’J–{êøy(v¡M8Ù +i`G<[ïPpÀh°ŒÍ6f¬¥š•Uõ,•±t^G%C#™Ý)š¬þ>* ¾¯œƒFR*ÜZ R$´…™ˆ&0H¹Y?^Ûó꯲éÒv6®ùSLǯRñJ°çÛ™[^îw¡‚^~kÙÕ Ò ª©y¯q± ýd|hñ0„çX{:[7ÕËÂq´rÊwŸ2°ó~7²©Á%ïÀ¶jUÈow2$ƒ‰¿2œâSÑTŸdë!,FÄÎÚÚô8².¾#É×…fy¨n%ÿÕ‘[Óã—äŸ3pV©s¼v¡Ü}£‚•?Þ$$ø¾‘ªf‰ëÌ*ñé w’RzÚ¯t–,äW¥øˆá@Sù(D£hO¦ Ÿ ÆÜ…ˆÝËä½”˪±\2ïnOù<º¼ô1#f¸è¤nR²KxÀÛË»µ(Щ];Æ’±ª£èÿÇͷ̓‡šÇÚØ\ÄÐGf†$Ì&éñ[X˧Éð§°Š «Ã¢ØëÕs”F§ž¯<0Vзy O[;ô͸㑒#“õ8PµGªs³¬%{:†&-5®Î{›h§V®^U®+3+ÉŸ1s¥rc:’[ÉÙ; \%²à‡›Õ¦2¬K®Ž´¼ZÕ(u±HV…Û f³˜ºíæ.l׋E &×O+ú<¥«@9õÁY0_+%ŸmdBÄM;ˆ@iýä8uXm,€½ 9~£ŸQqAB/_Âî0¬SU<ä‚<ÀÈLîžÊލ=礯¹**UÉX–˜4,áèÅ̈úkQ@êmÖ™C$¢Ï#­&{“Éê¾$ëmRK–‡ Ù np»mµÐ¨-¥­˜Æ×¿mž;zDÕ(_–pÎÄ>F,XðT¯Lb‘aüß5»">«ÜC‘xã¹yåŸåáµÈ5œp[‘S>X—'¦¤©¯•'Cð¹{,œ†û‹6ã{¥{˜ë*óœ«) ÒÁeM½–ÆQ$Ûc ÷»x Æ[ÚcÑ;{ϲӕފ]ÁAd÷{VëÇmÅ„ÛF “j‰NÌF¯Ä¦pJ.fçâhʧCb/vÓ5Ï´”|ejLJ¯"?aôޝcÃ.ôzó88höÚ¥˜ÆUéc=Xu{æ£%fÞ„r\¹½ù_Þê®+¾ ãUiI,Úþd!?–é5s&&„4¸ÎŽ=馯Do!Ž„¤J8fŠýí ܨH—•YIó²ö•5D± 3ª¦‰L2½ ¦ u1ÙV1묲Ã×)|ßÎÆî!åòZ—Ô8GVë$K!ÔØšQ¦HÕ:袻ˆFÁ-žÝdeXЉL§ü§n£•Ê™M–›>N¸ë‡ñ S¬Ú¨í¸nÆÖš> Žñ(•tã÷»Êló”*Ó٬܋ںŒO_¾»ëP WàzWƒL‡Î]αݱIÓúÛzW_t®œ‘>EB*Y×¹¥4Œäì#ÂwNá”fûŠøRUG!‡¾ÉÔ Ñ ÀÅ•Z›wéý ;VJø¨3' °ð\2Çi&I$\¹“Š1VÉKm™í¢9”ì/'4·X&ö8O•—ìÁ–“žñžFy GÌý yžM|Çu!ÛfoŒ:\Jp‡ÅãN‡Ëš¥H·¼3$A®©žóté[¹£Þ*³qNÇd¬ÓÕÉÖŸfÔp¥]r§)ÛËÿRk8“4-Ô’õ« ³\š¯c`Å4ñ—`âô*È9Ò$÷Ðn…æeSØ> ‚§(u g¿4T–æy\dØ-Ÿm, awÖ@–—)¬Yˆd§¬Âæêµ‰TrKkªÚ'iPÌÌp’B‘Dçþ3î’…`x à ojÞs{¾ãr­íZŒšì„Ž2ØrUŸF2ÏÔxõÆØk¼ìb×;¼ËQ¿‰©(÷@ªÐ—dP,ÁŽ./,ºré`´Û÷†Ù$Î(%ç,ò™ERi„UõšÔ-kÏ —ÆÁ¹m½mQБŸSÅéÝÜþ(ù2XíÓŸáubGLy€ ЫۜM¬RÀ…Æw¬“¦LQÚòÿVœâ<'ηB`’\k—è§S„¸™JZ Àׄ ãqB3l»Ôe´ÜwŽÜ‡ìÀÕlÜ^Ò•ºë%¨ŒHW=éB[–6W> &õ×üiAÓ¿²],q cÎx£¹­.R{¢m¹×ËÜî®|ZˆB«Ãù×—ÀwÇg´æâÙD9OHˆqµ‹6–øƒØx|›8Ũ‹_é„‚ù„åhË TCe¦±PóŒ³0v¦c…*,KÄbö!,TèGt–t„îü¤´¥ÖÐT…ÏÔпõ–”ñ¬~œ’Ü:nü¸9ç˜]YÔºnb¬MîŽa¡"µé1hÇ^HÖ°iÏíAØ#ß®cÛL)ævºÌqiFÇXÍ3lÎÂ>m´N* ÏVj¶Œ¼A` mã:u0tP (èUæ"2ðžP†"˜̪;IOµ/+L¸è_¯{ÁcÕì‡(Íôh:G,Þ’X9fyVÈøðmÈζ¼]Eu'9 èݘQõ•/UÏý8øðBÑF‡í­f7»Ãëö}”Sôb‹Žmû½8íTV 0ŽÚnlu{Ru;¨Þ¿™?œ<ÿ@®ªµ^rð8ý²V~~DÉiíß‹å8uµC ³ý÷¤ýS?=ÊÀ4qÌ Ë÷;×ðµ:Ë»ohy…Øü¹ç4Öð.à“ÛÉ®&iÍ܉^H£ÅV±M,õæN&É‚]>©¯Ö;Ÿ@éçªó3{nºå¼Dr*ÜÍ¡&ËÒë,Ù´„]DNrݨîBÓË<ÓÐF½wOo!iÆ\KH®9t€@G"L̪LµÓ-cÈ={CÃRõRhbÙ “D´sÀ*qÜ.¸ÛØ¥X3KJùaZõ`æˆ{tAmÚ[(ôœ|vŸjó!ôyæ~)ã6”ÜÖÞéh9 i†ôtÐê ÑYéÜ*Þš7¸Uä >¤b9‰ÝŒ¸!i Çgß2 š9óèKè8ôŒÏsÏ.¢é·2ÒÓù¥V᎘K>Ä–SrÈ`²Ó•é@µ.˜ÁÑÕçÆ~A×꣭ÔéΈ‚ÇÚýßOBtQèf,kGªƒ[j\äS©§ç›i- mO ³‡> çõŠñÿ7™—Ïš$L,]wbqk“–e`22J1 ¶—!_)Ú$‹åå΃IAܘˆ”Rxˆ£¢W¹lâ –÷n¯ '2‹z¹mۅϾ†[2CE‰ø¼xÙÕ@ÝBOÅQp†ªOŒ¹e ™–ì׿2tÄ3-ö®n•Z •1lõËIÿˤÊlÙÍÞWf;ð¼ô0gÊëˆH>ÏS}Ó…-TŠ4¯I‚ÚR´ÎçÆý¾³5qÞ½«ÆÁ¨å-ÒsÉ­¡‰†¢zD÷²7fTÆ2ÅÑuBZ\mŠÒ^&ìHŒlLõ¯¤›|aØê=¯åØ-ó7Qô0¥27¿²ÓvüÚJã>Õ@®'@ÿUŸ¯«¦ÁìtwÛ^:A<£Õ8i‰+9ë>”ý6]\`<‡e"ì˜Qò ¤ý®p/Fkқ͛t^¡å¢ Ýüw‡][Р€jW”ßÔH÷@Á¹[ÃyÕð—a *—Õ7¿{ßzáò ëcÔÞˆNÐEÕ5þιðöׯn‹Í'Ä„ƒVxW•pßYmöcúsŒ8ìüÀ‡>úxu/’Øjž‹¯{¹{pº ´ëŽ”õ1ë Ë)$á(× Ÿòõ¦°D®ï“É&Ÿ@èÆMÒ2óJ6jàgæ/†É' fÆÝ'™u¦ȸ ,'áQ¿JŽ6+Ï¡þ°é½§í’fÜŸlõ‰ðxý·Ó8Ppߨº¨´#ÐÎ_aH¹wKca‚XDôØ`†KŽŸ ufJP{Ú'JW ˜(×ð¸'"©Ä$ÐÙ²-rN$Ú øy'×—¡Ý ËÒltæã†½Ûª¬/”ÈeŠAu8Fã}j$´ (  ‰|I¥^A T–Yû¬ðÛÌHàºWЙÔ™ÛŸÓ¬Ê *SqNy±é{®ðÌ`½qF‚Q:eC•4ØŠk衆õ »Š˜=õ¢ò6Gðºh<ÍQbO~L.ŽU£ØÉR&\ª\õ+Ïåêè§âþ0I~Eœ2÷ HSÆ™Š7ƒdf¬âçàØ`ÅqLÁŠ4²§#ÍžTz©bæAå1…ÀK%¿2ÐBH ÞNŒLKéЬwB¬kzYµËÐPgÒ‚Ж½`阴_1¾éÙ1Õ]ÃfÇE¾æ—cÉË^\àž¡ä2ãB NÞdîP°|‰n[qäÙ¦ŠíÛ"+6“·,ccìGÓ¦6NAÚ½ºª`;Œ³‹y¢8í~º¢]7äüß{ŒEa•ô‡Kõ÷LiªÕÒߪ¤‹÷ëAHbkE=F»ßNÂdŽ"´O¶Ý•UÍIK4n؉r2´s¢(”_E±@+ø‚»w±‡ž-]WÓº¿­ A„Eº6öí°Ä^-KÓ'•&‹ŒuÁ V '°âô°^Í þ@[¼r\(œ Ÿ]¦û`Z„±DŸ¢/§¾È·C­s˜Œ÷Á]}x¯¦š·xŸ–IÝ®–!OluæÔ«#CU²EAÕ}JÅzº¬HÆÞˆ×€øC U/‰ß7ÐÇ|Í%#Q,É=¯±ñ®¡\4ø„àåS¼–BIoJ~6^Ý,KÆßHa Bxí©ˆ ÄŠ|[ÒôÛþ~zé–Ǩ`PÊ0¡¬ŸWÕ±Õ•Áw‹·ÅÇHLS "Ù¾=è$§SEe‘’¸~ëšS52Ø{™iƒ½dù®ëå$˜ÌÝaZ9 &Y©ûNÌýòFþjü5ÞV Ó2¦¸N-X$à‡áÛ[V:“Saä dàÈ!‚Bä¹€ ƒ¾@©¸úXùæ5¸ÓFº[cõ®é$Â@ƒ¹@ðîWË4ãÎÎy­©2AÁ+Nzqާr=Gð»”=œÃ®úuè8Än¬ë“@°>bd¼hjKBö(–V‰ËÌ êþ÷P\Ÿ¾žú²jȆèÜšg»/,+ZÀ²®O~WÜpktmÙ5ôE2´ëÊò8“§ªåòá³Ò>·dÞÜî²¶Ëàç³óAf£\^\h\‰oÀàŠÏ¬ÐY–¾kÖÓ'î@%“Í¿6Gãiª‡Ç|S§0¯ãÊäw"®m,6?¶·0èÚr!ÌøI ù»‰ßn´3š=ÒueÀ¬VÈðü­L RCÙl®ø‚aÂOß¶ES«½KÌV7ÊÚáÏp)°æÞ¤vZÔTç˜$ÀRC‚xŽ(@ajÔ ³fñe©‡‚çtì ¸VZ pÞ`ÿ6®ƒÙ…Åhµ:ðöÿÍÓ’µÓ1Ì‘ÏJAí‹÷o >Ã0¶2'³O,`¼ÑØ•ò§)UˆWEž1?±zÔ’·Òµ­÷ºì¬ ⛀¯ Ä]X16òòš6ˆ›Š¢Øp%kÞµlÂìc)4¸¢hBB‹˜#^ÿ…ÁZîÍ1'ôðQH«ûï)3—®­‡ ðÇhBâl­úiä­ô•NÝëÝ|Rýð›Éw}ðFYô,™^±HºßÞ¨¯'‰È–h©×ƒA¥a¶w6¥IÿòP%©‰x Q3‘'@úm鯞Ÿ •"^\ ˜ úÈ÷?(É¡ »ïÔñW¼HÔrÎBû:½«‚å*,2l%eË•ý3õ§HázùGå#<Ê´èT4õZL’fü ]¦Ë¤ÜÐc…™ôb f s]ÃVÓ¬GÍ9e9q5&&Åá3EŽM«"¼«¼{[€o!VéøçWí.qlF(#‘¹^¨Ûó+Õ&]óv®aV¼%—G=±Iè Ÿ35MÄŽÁ(¹Æ0 ͸] )†Õˆkc™^„^-tdØ-׺k‚ D¤Xävégé3vaí §B+®üw‹ò"‘;¬B}EláÓÒ«Ž3x’Oé{·µÔ…©*$t¨÷³½~2Ù¸±Yhïç'\êO8»W\¼aH–¢PâÃQ䨣Õ_ÜÆ×cKfÞ‰nV¼5S9ZÒðHáì]H™¬ä+aá~µk¬³…{´ëø{Yïåjë½Ü¯yv 0ŠÁ²<·#{K±K˜ÛŸŽSî!óQ(võƒ 3Hlä(ñ¦šä&´Ý6m$°e•såžÃPj\^†8¹jD€lIjè•_Z­8Hu;è?%j”H´îfå,ù‘ôšÌªL ÈqŒtä¸ïDñÙ:šmåxr•€H–‚œ÷bC²b“ÀEº³²íåGfõ2LËngÿ=k+ÕŽÅà$VÅÉm×Cµ¤GY º•AØè·¢ún)ƒÃü”üó:ÿ¸ñÕ|ODèüÅ"JÙT_¥î÷Êyö†Bï MDG¼_Ïú«¢¬A 9³Y»Ä弊û+ PÔй´æ»Ç8áBj@'ØE˜ÿg'ÌUà Ø›ÉÚÿïÍðšè‚S\¼ÂzR,=_IBàŸ¤”$‘8Èð ŒÓxN?û¾ŠÖŠÝF|E^1ë~`†¤Œ±²–YòÍbÔH4ÿHx)Ú7Þ"äøóÖ$F*S£'ú +èÝÞšØä­T}'a{…D þ¿b®M³©…ýt¿WïñärÌBô!äìPôRɼõ‡Ù¨oÝä¾D¼ÒUõNGDëÍ…usŸdü™ê£h J!~cXørE¦ë¦GA Õh7(‹™¯bíS’ÕÁ_ù í_ðuÐÁ Â(|“$k«: ·X#e¥0f«—nk9ŠLD ¶ót^е¹e_J5…Y_ S¼ª—ã=KÿAæûÿVTöÞ®Îëa“QöL£r\R5Q²©±È%¬™òkµÐjPm”/µÎ°o@»Dq½žU6E7_¡b¢ljš3‹PºçÔ A‚bµ‘V:Çnå*Ô¤ºËÜ5ÀÜ@âà(*Ô”ÿP1ŠK‹uùXƒÎwìoµOªîÂNNºêR(~‰VS+ö\w~Þh>ÓXD †= Œ=øG'›AP_K™O[t¾å!-Á²6Zü*€ñr {cŽICÎt-.­Ý vHlº lZ󤿉(ͳ l–›á6Ü•´¾ow)Ó-0ì“YçÃ⌤6ðEØB¯É!QhɲKu‹uþNãôê]ýçç$ǯ3-Cš4ÅÍÚÈx_¦cµ\³Lú5ôÈú¼·1üu$W̳IšÉ¥\9Gvö…í#áš6â!Ð\­ôX×( ÆUX}­[Íê5{ý¦Îy4‚§yT6ÙBnù†Á‚PÕ+8ö[ÄqI½‚+K_gó²Qì¸%€ä›µˆ§föüÇ-–¨œ¦ãÈïM5+ÉÈ)Oޝ$p\Bê@Òxæš@ïÞbÉš=OYfg1ÃgRbWrJ Ç]ÒPè–Â^ÝŽoøÔt“D[¤µiÏu êèÈìp–±-*ŠŽÛžW³™¡ ±–O£Üø'õ6,ËXci»fùs©˜èiÀ%ñõԟ¹s…¸¹õ¼8¶NËî?coäý¹dxNÞ®VÄÓ-òðωn:D¬h©Xwl’/<•bG\MÙ`¥Õȱc:¿tÜm›ôú­i‹>]Íå^K¸ŠGó%:¿B—µb<óW,†¡*LäÙanA?³LQóJ7Ž®H3saĸ!ÁÊë tÁΔyH›Œ#›Þ‘Äî¹jnã¹k¸°F£®îJ ع¼á™¹_NŽÏSDu}ñriÇ«}­Ù­NŸcbñÉÃi2½Èkߎ¾+|Å—è^n‘p™±Nx“qc^‚š ÀáOCW•8¾©ç¤ŒJÐî¨|Åe°Íe_˜@¨ÒpàäÂÃÃ2nØ#kW’o¶vûmîî3äUzG×$‹¸©ä¼§FàþCà ì…\ õkk T òFÀ% ?J*buR6E×o#¬i¯1sŒ*ý¢ÌqiToyÃÌë»B)[&¹ÂéÔ›a$”ÂoÌ ±¹øXª…Ex©³†°æ&Ùj^’pÌGI¥!v‹Iµçç=_èqI≫°q*3)©‚á"t°ruNJǨÃ8åï1Ý1k±°Îj~ÃE§êJ\¥+T¨uþ,¶X´‹@ç:åÞ\ü§X‹§‘í>±jÜÒÉn¥Ö”÷訢U®y2ÛôE˜‘fðqnÖA#Jäxè…>{°Wná}_ ‹JÛÓòýºo¹9'F¿WºP—Y@ïM‹Ú&wÈòûïË·ma´Í2›ÙèL ˆŒR3¶ô;Vć'ÂÇ0ZôTm¤²/ðZx Äm±ÔÌ—+Ëdu$wª­(s“ÊO¼É»¤}|û©‹î€uØdâ#öîºWxÉGßvðÍ{"µƒdôC…E{{À…,çCʾÉy©%s¼QÏ:"7°šçyÕ);„MÓ+ B‰Ã¸"êÜ^œðEÜ|æÎ…¦x -å Z¡¢h|úæ™ q C¸ðb´Ü3GÅúvfG™ÓækdsàL+’Jë“á&~‹ÚÊ«m8„.u‰Âˆ_&õÇB…6ÌŒÚÑCpöÑxÔûAlA¦uÒ™‹ÒUô+&ÛÆ·‚ÐKs²»³YR0!qÕSÛkˆ0ŠÁîâöô9ußàGª“. Ê¸Äø»’cçFåV>N9£’ð`ЊÑ ³_žŠr`jo‰˜&…ÔúÔøG«îws.ùwÁJ¥Ü!kù.|>Àº/>»¤üœkWS³¯ã¾zÏV¬@·ÖÃÿ±kfþél¬OË·YW’t"”zóö.6IOKEB(·45¤ùqϪFzæ“Öå$Ê,ÄÆøZ*cIÁJŸV”B: êæÅÐ7¹‘ÈEX<ÎðOt¨CA•N Ø»¶­=ò샜¨ jxƒK¥ c 8ÕšÂUH¿ Ŧ~‹ÝþË×Câ²Ð–Þl½à\^KD/†‚þnúrñ¬xŒ ò»<×€ufÛCj¥<÷U‡±-œ4Cb¸çäF“^¸‰cÞ[¥:®;Ñ ‹Ä„†°#: ^ôôs츺 è®ØóíÊêÅŒž°¡ßœkÔXó`‘õ •,5Ž'}9%3 E0à›žòõÕoË’ñ•Oœ·ŸPb­‘é£hÊ[Ý9H1O[>b<)?L,25ã˜ÜÇ™‹ŽBØkÄÒ÷ªþù%!“$‘=B’p‚P‚¯"ÔI#Zð5ßc”®áE„ÕnÜ#XÞ a¶ ›º¨—ƒÎ €’µkÎAcx¡’‘9~’3!Óá7‡Ï¦c8La:¿DŒ.³ßa1¼Ø,µŽéjN0à‹<$iÄ• £œ#0ZÚš4¸ÎâɾP^u‘žÌ+$(L¹Å™Gg 3 “›¦ºædû#'ÑÔ)üòƒœ |E¦ äÒÙ` ðÓ°-R&†Ûm?Ed^Ó õb­/é:ð’xðw½VšYµ¿É6«$‰b¦8#„æô¤+ˆR(Ñû¹øêÍ^=R%™]C&#uO˹ÞHßTº‹‹[rp?MÐÕý©Æ;’¦©ƒH±ù$û`RUÓ?÷ÑFÞ±F€9w÷¡´:®?Í5ǵ­€hÎÂnÜíÕÑñ"úm«;ðP8POÞ+~Õ/O ¡kÜ…;ð¤äv®ŠZ]TÍÝ{¢ ž·ÆOµ²6žàgŠÊ­Ñj)("5ܲ„ euЧ_ _Æšá’ÝN{Jµàú›¢Ž´údêà©R~³»F¦ì»f’;ßÞKе&é={V…¶ä÷h¸hð·d$Ú¨Mí’ÚsȘߌÅÑæò T‘¸+Ááäk&çÌ1ìëÊŽÊÄ+4•(k¶ÔÉП[¤YÍ‹¼™mxÈŽ yÇٹꚭiStá5Ûîûqy©ô ªé”#™š §Ö1^x8a¾çˆ…ßwu²Ê5~Ôò‚AÎ H¥†ùâw®óäoNGL¼ªum·'Ó»P)£¹Z·äxÐÁ]޹ZÙ…‘ÑÓn퉋¢ù‡}ÝoæÅgo4 ÈŸh6&®Ä2‹H²€Û3-ÕôŒÆçükIz=GˆBê|¶›É:XS1%5_é q$uíÅxÕ:Ž××Þu9¬Ñ®É,‚­´ºtÚuÃUä÷ÙÀ‹ïé’«øàÀÞñŠHÕ(ФXæãÌš.[é6%U13i X]Â'LšºGôÞ?®wöÖ-r8)iNƒËnNìb§6¥,±½¨d.£ÎîÉN•ªGm" ïqRŸÏ8õ±â6€ÊÄhÁIåªlrŽC»‘R3[IÍXšô°ÈÊKn˜2ê(mr7Ü·‚ÝF=)mæˆõf=ã›FN)›ÄoÛ»\dò…>© “‘67 &G™,œh†Nv«–lõém%.ÅDÝ“kÑÛ[‚à _ÎûdC±B'OŽBÅWètâÎ’½&º½ó3”¶”·Í xsTäáÀ‰ü’ncÙI'N`hÁœc5O3H´Ç|SsGv¬`ƒ-˜3ðDÏ0Ô3ˤ§×©ß¢¼³Õ –a;=Ct÷Ò6préîƒböÊ6.rM0†ë@3zÐ7 š+¯JXV ¶{]³•²à¼’Pk}¼ñCMe¦ˆùñB=ŒÕBÜÙ' ³üÆàÜ;h½ië~­È:*úFõJú”ºžïÍbJÓ‘æ×LQݲ«üsµödk´se¡¨[âÁ7ñ*Ôé^VœÍç#fe í.MFN{%gX0íð”ª/–­ÎÑ)ý§ ^e Œ‚X°ÂÄéáy„’ÊG9šMIˆÕ71UPnO¡¯1 ™KÌøt±]¢¤~¶šÂ³LålÈñ±™…tÖx‹w“‰ÀkµµSNÑz(‰™ëCŸ*o§%—^Ûg]O.ŸŒÝ‰<)ˆJ;ÞÇ]Þsrاå¨×§ÛœFwŒT Ç¿ôÛáåLÍñqÃo‚÷xħt<Ű?ôtiF@»Hí³¼“KÙþT>WëÉ9¨2èçU¢n±P¾hãÑ-#¡Û¬cϪ¿1ÂöêoxBâ9–Œ©h9¬á¤–r©;-´­rëŒôõ C+A˜Œ"þŠªçÄUêoûNØ¡éÁXe©2©r€¾2‘Ò°*£­ž ëTh¸ÔŒIËA؆ã¢BVý÷}ãŠIcŒÁw•äÅÑ h/Nª„‘Ä%A¡qrŒ+äþãšhÝN:Ž·JízPœ¥/±F†]¹ÑÜ Bë¨E§µ8T'13”Í‹lO*6Ñ„™P-,>%Ð^ëA¾Ž)oWéÖ¾TÞ]JVb”önõVÚ¼®Njª ©)Ñ®2Çeú11yɵ:á÷Wo)Ò®–®@£'ÕõàžC’AðÛ×Eµ&9àð¦_ :âša¤£8Ü[3œ ÉÌ¥-^"„ÌÕˆd¸þC©RÚkë§)¾À·©ù‡œvftóß±Á›vìÊ{}hÝ4ì3htèÁ¢ô¶¡_@f#ëÉÙC?;÷»åØÃ.ªb|½N™9‚áø9dZÖì¹Q¿QÇ(z¸¿cþ·­­VA®7àñ l.owoŒIÐ-éêôH F<›×£ Ct)•O4âAˆ´ogÕgç}îóò!QK=RR{îæo Ž¢«†Iy" ä­,ˆ^ÍTœ\°r fYl9°hô=þ—Êñq¥-‚5¶’#iW´:´ºP“ [TP$‘—2¢È÷Ö1Ʊq£K^€¯6ˆElnž¥ÿHÓ|V„‰©ž<Óe‰ éÚpbVSŠá%I<¬]¬†ÔÔàMMxWòìƒkUãÝè B‹¥,É3K ³œ{íôŠ,g妪ÏÜ;+-±2ÔÎìùÄÖåTG#À`M3‹Þ´ö¥••Ðp¹2±zÁßħLq‹)#èë6¸fn@Q̪¼¼ãhlëÌâ–²­ Š_NìÊhåÝÿ¼¾Eƒ«#:ÃS8ýø%¿ÅÁÛ˨7’Áß—\µêïvž±3[ìéC =»·OGC¿`•óéXt!¦Ï™hé»3Tߩ䃜är•P²ÕG¬>‘«9¡ÅD®Ìà*•Ĩ!×Öcövugë…Åb“þ$v9ß䄇ű>Æb¾’¢ìŽn7ê>{Qœi±£‘Þ§¾0' „1HûÒÙ B û0GM$-z3Ð0*îε ÉS}–p Ò'ÌbVõ¡™XÚ°â¸ã&OvEì"Ôt¶ïѽûeÚ•;qœrâJ°8ß»”èfQfvk °½ƒluHiœÈ´Œ[šÏ‘¶ó[y3ƒ/EMmÔñIºr ZOŽž/]ö%Õ¶1ýž°à s77TÉ`¤RÜ®¿Í³8yWHc¾­x÷$]F¯r^~>x}hpsÏhØ(:Ù|lq¸YÑ«%Ц¥Z ç¶Oµ`,ƒ™Ã1ÓHÚ9'¦Ç4ÂÄ÷í+Î<óÎx—:Èj?í£ÆÁ†ü×{®ú6ñܾñI᪼5|>õ{ãŠ8ub3†ß!šQ³"LD*°„ Ïb”(ÉT…öJ CßÎîø¸åÉØ0EÍ­Yóu“õœÑ#’ 2Y M¶wûÏžähˆáêVa!ÑF:6#Œ­…ƒ»Âb.ÿ ˜£ZA>üž*+ØQÿyM"P#oÿ—M=Ü×”$¤QD€ÍíÁûØì/_s ÎG Qð— /âg4cÉoºׄ¯®^ÄÏÉ#¸…ÉáysÆ£¹mÈ ~_»àaF Oq“ûD@¹ð;äOûÃ3ŽNåFO’J6«ö¹õÒŒ_ºžŠÅY©µƒØËfÔçfD}lÚ: |ôA×ú–Ôs~eœ]©Íq¨óèãœªÓ Y«ëKl0rÓ¸ß!;LDµ$R„×^g ˆfy™®KÈ` fš Xé†e&º©‘[D¶ðÙQ i}.²¦ ŽIŠ²Û¨Ÿ, ä“U ª¤ZAv„ ’Ã&X臼AVx›²¨±òÁÒµ+$Éo‹ð´^ÖÞe4ŠµÆ·Ê]e'¢oÇÚŠTàý2ÞÖüçˆáa‘XÄüóTe"Ap+—¸‡tåÞÛïqüßU‘p.ôõíúý~S’yÑËJtaù¥êÒæµtð4g¼6ó[w呺ö€‚¢è ýÍ) ª]Ìt œîÍÆ'@)ì +êf¤Q‹ÀóG$zöè÷`±—<çˆ-à†UöÓž~Çsa·›Eú Œ7˜aÅt D¿:^—n>R#ª àƒ÷!ìèê ¦äó˜Ùþ_zNCJ¢XmÞ«Ên©(Å"XPOšAÉk³ “†È¾!õ¨´æº‚B,d.ì^øOkÐwŽÞnJ(–ÛIOX•)ÊÉß 4¢iº"°+hÅÁ†ÔJ–“dO±?›†‡jõvªÅ׉]¢FœÈïw.én–ie´Ñ¬t«¥HÀ)ÑæØ…o W}iÅå jÇP¬”ª~ü¶ÚERfwIÒ†]EÓ±9÷»H$þ]7x‚Ǩ^UqÄØ¥]Xv—•9G®Yý3µkÎjíàA|¼³ß3]O71Õ˜=q…–,ŠATºÎȲ]çX¸)t舜ͼŒ'¾‹·§SúTÖʘºîU‚P§¶§z^ªqn$û´œ*p²ùP@ac¸XbpTÄJ¤Ùe-Xÿg­gg6eIæÌîZæØó$sÀ¬'Ôûï;½ïà°ù¬2kEjQ¹ŽŸ*?~þ¦’®ph{‰uÓiî~/æçæUθ’¨Ìö)M9/+q&ØX¸á!mÎöiÕ3 ¸À¡‰®C¸âÄ&ÒFï8‰ Uî”’”RJ»ZÈÑϽF ‚$-‹V¿&R¸ˆ1Í€ Óˆ¼áú1ÒÑ7^ê%À¸²#˜JI4¤V -…®»¾,2hÁõhÎ5ðVgXÚ‚ (´ ã^¨.BÝht* "ÚÉ‘¡Ò ç¿ÁjYÍp4F/Ö„{)´0]ce“pè<¤$ ìÙ°©WÁ9y„äÇMB­/±‰êtB‰î…â;¬Û–¶b ùú’ûbèú‰Ž ¿ê|ú¿Melp8•·ÐNeè¬(*µòÕYµÄ#އg1'RÅ'ZûÚyåj\F€ÎJäëQä +8ósÕŸHW²Ù.~ަTôïE.x¶_¾¥<$o`¥Àý1¢ÔµIkö–Ï]ž3¦»Å5˜ŒwY>0cÁP¡¶ 1ìӼ€:4Iiý¬š9C~s.ŠX>É«L„˜ÌòVlK3°"¬è7)جÃâ ó:û:¹•£O\9ûœÎ˜n¨l­V—‹¸ÝmNN4¬Mÿ‹=3é’Î)i S 7]‘ˆªÚžÕµÚLtº±’0º¹SнêÞòH-€GµÛñ»ŠjÕ;bü¹srÒ!*°M'Ž­ågÄ ’ûGý0 ¡ðÝ„pP;M`ÖœTÇñ|…Ö^µ¯ÅäÞRÁ8ìäOu.«Ú!!ƒwMõ9“±U~ÿÕüÉ ÿj¡à |xõB=´IøOÝu BØäøÿ=”ŽöýÃÃ_ø?‡éý¯é¹&|¾DûqÔJ$‚ †óOPkæ!v/twÀ_¾o3þã*$~gŸÃò_¿~ÄçñgÔuGUƒ ’yĨoòÔ¹mÊ­n³½~„•žœêÎCô ›„y<ß(»T½¶; £cõxÜŒ¯% êzóüysI§~OÃêst~¹+Ôÿ¨Lf–¼$ªöÂf0±ÿ÷(«šyÏc h2l,ËMG›õ£°+¼&Ý’ÆCBôò†¾g•¾3„3ÕÛ,Æ«E¦9ûÅšê^MßE4z³àǤ)•º–ýbr,AãÚâ—4Ü`¶ûÇ—5¯œÃzZ©¼6ÙtF} vã5ÆòÔ¡zž0&IâÎÈÏZ³!QÅçß§<ˆ`l¤?ª5Чp85e„]ñÑï󡂞Ǒä…ÁMæðí‘Ù[ì•Ë ºeƒÖ¼XÛv8ƒúv,“Á—i'~m“³pמæâ#q$íRåëiq­w>‹½ 2¥€e ÙP9ú“W-çDx•;2Ý“°Lžz‹([ÉEYé°¸ 7Ýô¶ü’¬ñãlç”?ù b¿zäU%£ç.¡!t_# 0Fˆc©µÓKxO†©z…Û—ÔM÷ðPxçŒÃW™ ÛùÇe•VÃ`S8ÞQçn¬!¹×ê€uEQ#MÏ_*3eó-Œ~™ÅmÊ=oìÛ˜=¹¡áH¤F&½È¨H¸ŠAd¤‡“Ž~ÇpèQ/~0yT"ÀÇ·A’PwuôZ¸máH&ÙÛ¥ÊæNVÑ–Ÿ<5AR°ïŽ–¡ø˜Ù²4IGu yë£ÀÙ¤J–Ò;œ-t{S˜õGžÃ›!ÂäÓ ‘´"^ì® ÌCâ@æzj¶BŽ´agÂû‚.ŒT†³%ši+,ý ŽâOP¡cÑÝÎЙ³·(KÞàYý £¥°ûv“º¦:†VE¼§M¯Ã^{dMhU¢‚l‡¡ E,Ñשýèf5ïYÚ €¸µ¾þ”!'ösP몕o -’a`ö{З5=“Èi'ñcJö.‚Ëò£U׾ϖ}µéÆ{’ÙuœË2&rîŠÍw ΙÛlc4#Ÿ.\`òMóך ¶üØfì¡§+ÑËŒùCø¤éÉѨ½Fþ?ªJ©¾z*ý›šx\MÈ`$ÆDåÆrŸûjº‚ázö¾"œK\¹Ðܸj •Âk6¨Þ-j¼ÅÈhá„ÄåÈò@>¾\úœ;wÏ.¨sÊ1ÜÀîyDúëÉ­rlrÊ’¢Ä—€^ +š G[ik˜ë×<<ž by9ið^ýO¦:¤ïc,zíÕG³øM°Œy_œ¾L¦€ Zej@‡`û©Ka”]Á ÔM$•Ù“å9G…%ñZÈHç;$ôÒÅŠ÷k^ÕXI-î ¯thϤÛ¯Â^3"ðÌ«0~Ú¾‚3z΂œ& –hÎ Û¸1|‚’ÖÚ°œºf7˜nš­}?p×1MÖ46Ù_2¬ ú"!håY\~Cv³Ñ¨ÛÝ¥EÊ<þ κ¦÷,œw¯ŽÞl^X>\ áÞ§§Ìž®:%B^… ¥N¥ÜP`'q{šŽ‡nóOfî»Ík£Ù¯)Ñet:'Õ)]ƒ½º¸àOîÖtÞRÃv„XªóËB£ vT÷ðOâæVÎ̵FrÛr$¾]ï^£.¨|ÔŠçà¾jçÙZQ'{”†‘s?»fð›»Cj":Âù))ƒ à5a§Q0ZÚŸ­5'?óC 8:ô”ì^hHU‚e¨³ƒTº9~A7¢öáW4DÙð3X1 ®û;pJ¨¼w2¸Øu‡ ØyŒëˆy©ÆéÜQnbƒÙº±-1íâ–91$¯H"Å㣛i«Ap)4Êü÷߇wÿn‘zv»ÃT¯L'“æÙð]Cd§n¥×Še4uÞ›¥0V¦aðw-–¾‰b@îm-”‡w9¾7*|ZèÙ†•C4̪×ã˜íAD*ÿ'íËÅB<ú9kq*挕¸˜¢½ˆE«"ôi ,‡K¢€¸L í^olͧ_îu"u°üÉéÔ"6Âè¸ànà_ )…Ѹ5„mõèÈNZ /TX¢ÝÏÍJÇQîžaçU³¥d®Ècf–O;‡!‡vž&ãû›* }k©Ò{x÷¹k…êzÇÞ“é\þ>ÃɽûR il*ÃКJ[ô°Sz1ˆ 2$NÙzƒÖh@Öê4T¯ZÀy:Ï~fN§:®‡,¹UJf™7™¡6²áì;¿XHx®ÝË3)T§o…Î[ˆŽGYØp±‡Z1áæoÄù7ƒ¦‘J¨.7 Y›7¥ÖSwXõØÙxnÁÌ Uõ¡ˆú¿?Ÿ:/»vÏYÀ`l5ê‘ …nÅÆÐµ†æ”k øÂyr‘ÕV ßGûk1ñ¯E/ðóþò.)¨Ö\ºs? žŽÕSýýéÙ¿ujR„á¬$̉êÞϾð:©Ú ¿±+;À@TÀqaਹwEƒ÷¸¡´®ï:¢“bO» +’2qF»ì‰P"Ú“?'™¡rýÆ]ØÄ78+Ó}Šè,íº“›ž€{* _#>mtHj©æ—4¿(vëƒF‘¹{¤ò/Ày0ó|½¢Sqf<„Oø«â"iuØi´ƒtirw¹å+«BÓ‰jž„\A×Ä'˜ŒYÀQrB-u=ëLw²’…x&\4Ȇ±EH×1‚þY#p3 õÏÌ[fÛü²UEvá¹Å](5 hZ{ìã‹1ø¦S“‡¡ ±½Ò ˆº`lž Û½õŽİžÕ\aªÙF'SC³JRžlçe,0þøYa`›¾ø!€ŸûÓVRéphÕ SDŽP÷Õ]zÁzô£¨Çäîd¼™»œùYlH(âÞ%”¨¯¢â¤ÐOrínµÉ>®™ï2¶ÑMæåYX n›œAì0m3|©¨0…†bý¶ï¹2YNˆ¸@dÜìù1ÉG ŠÕª N¦’ÅèþÖ›Â899sºw<ñˆÕ/®Œ¡…åB{6ëù^8½'ÊI)#®S#ìÀr&Õ×Ñ<&¯çˆ \¡¢Tž:CÝõû5§¾Øò{óZs%ï»*Ši×7ˆ_Ž ¸¸à‹ËL›çJ'æ‡7×FŒFÍ›2£«jZ|T$OJ˜ÜH˜„Ì·×&•#;𩨋³âg~îÔˆ«^å¦$¤Ô¨KÇ?¹àÛÝDsõ¹ž<Í]¬ÕF(ÆL³ÓŸðÀîm T¼ËÍS5,\÷Ñ^iZYX¥aXm)=áÂÀhãQL\µžŸ@M!ªV5cQÔ¾nóF’Nä|òhù‰ˆ/Tž‹"ÔÃæŒ“ŠÀy{ç}ÁªíÂËô¸J+1 ,éüÇÌ[– öŒÔTÙÆK(©‡`ÿ „lk.efòB@ dHå‹û\À PzSçÓ›º|gZw)TV¢‰¼§Î¥¬d8\_D§«q yDóy9Щd5N–t¸î®­Î/Ã8ݲòò³6ku³ |ûô÷¯Í³zŸê7A¼ 1à*Œ ¸= ({˜ð£æ6ñ9·ñŸAOßÜ=]š1*ãzeJº*J ‰«¿–º|g‹“.}n‰ÜJC·a$$øøªIÀ¥Ú?õãìiÇÀ5Wº½/K?ðØrWéç’çõgŠZciÅ[çÆô1"=ÁHß½û¯÷¸¸zPêFç—!èB‚r¬ÔÙp¤ê8íGŸ¯Óc>À'¢¥±ê;Ø5h>h”¹ÝeäQzpUäTÚFôåýÎDWNyÓtÍË|oºææ'W‘­H2WçRÿ&•hyÅÓÍÕ©)…ÄÖB‰2”X.÷,„H"唉¥Õb¿kva¼Wi¼oåPðÇÛG­dAN/Wihýyïšfoãtˆ%¦Æ©¢"]”鿏¬€Y™ÍH÷;SOÒ†âåzf׳ä%&FLÍ“[žà‘·ïu… ?—нÙ:ºÍS ÅŸIæµHZ»9™Â‹‘'Ëò£Gj†kÄÜHË0hXúÅN•\ÚŠÙ;˜`‰ p.®% Lõ8 °BfI˜BorLt'N'GNBãííö{ûÄ«¼¬à€:y9ô*‘Qù™3ðq2¯¶P–xX~ÊíãÞ%Ÿ â™f”)•+{ðQíØ¡;Rë”ûf¯Ùùí™™lžp_ñ¶Ùî5}¹<åÅ–¸À8ø(™ZþSf·Ÿ ªä¼ûzE~"¦™ Ö+‹S°* âB‡Þ•-“ f–G[唚_'tŸeÞ®öUâeuãäuž«”yÏoH|Éþðï*ÕCâ80æ¦îiÉÈám*žÏò:N"û¨'òJÒ¢4ÃÔ Õ»å WÈáÔ$ô19lÓF~ÑfîfO½âç«8n'¡WZ2°*Z=¬sªtbŤÁÐà#"ÞfÄôA\ðVHOWM:?àUx‰º¹‚88y`¦•Ñujì¸ãbc×S¿¶aH­ppCãwDëeè)&¢Ý- Òó´s#%ArÜ•¯5Û¨" Ù,¯:âúê¹Û+‹bÕGŠDoÄjå€Éz¢ÙáŠÚCR™½Õ)a¼,£eeÔÿ&œ3A‰»!’œÑÇîY¬#{z^„<øä•Åžxûã%ž/$æEÀÏÏ3·}iðãf8q¨8{a<Í9'qì¡ÔæP–ÒcÕ16$‡à¡.ÒŠ•¯øW€°»²YÄ*쨠3ÃYÍ6ZûD=·ŸmDwˆW¯N‰Èªïõ+@ÌÊ_Ž‚¬ž*œ®oÀÜôoq0ž¶Ÿ$£‘™N&¸*öNDŽŠ¢a€ñê—öfŽƒ¨öÊ`%¸Õ[,ÞŒp=øÐö‚ÃÝõèZm=½3t¨¿TG/6I)z»¢æC¿M Áº¼Yïdä–Œä²òº>jQ; o•s'0«ÊB¢Õ–BñÙÏ´¯T”éSž¡ªõ˜ébDZDÕ¿?Ì‘n-­ÊvX>šŒƒ%j"™ ”T@óq£‰%~/D›w0œ ™ó9‰?yrgëúó!”ÍÓãV-‹§•jèÃu<´#Õð‡ntŽfοÏ W®m¾wü(_¬ó©á9 Ž%½·Ï¶á™ï aêµpä]’VÏDAèy7<ŽÌ#ØuÚÏþ<Ñî²Ór;Â]wÕøê°:.ÔÙ]Q¦‡©AÞy k\äéÕ]Ùn® ÉïE­òÜ"/'²ã¾T®£ƒIôûPÇYƒä¥ ¹gjEø•óáñâaº±çUW:¶Ó›‰éb)|+y¶¯{åÆqL0 R¤£¨¨Õz,HRG< @‰R¹«¡uVƒœôK"èê¶Ôdã¨õ9‹ù„îܺ’•mïŽú[ŒB À¨ÌzDÜÒK·[pÕbï"ÐW&«.äXEîdhb9NÞ´â0N8é÷±N­Z¨]l´ÇŸ-.5y…þúm<&J×5kb¸Þmz&*m…®tP´<5¼5tdú:ÔJTªCd¯¢sƒ•1Pnùy…‚ ©“ª¦Ré<ع@š´‡qÔ”¢µ²¶M-E`~Ïám ÁЧèʆ\½µl Jt‡lé_LÌ]’hå‘^êER×J„Z1íèSó ´4½á>^¥è>Â᪽Vµq HC6§þϧ4󇋨±Eª÷$ö»ÙòCŠŽƒU×måí@z¡§_˜ªÍM£Euó5p$û8|ñ\&ŽÁ˜Dkí KÚÅÚîg£…)ø[”Ì^ò‡Üâ¥qõÙÙ­û´Ñ’}ž±ÈfxÀUô½(d룆Rip¦nØz]ÍÊŠ*qNÅŒ?FׄÈ&ØlèÕ£¹YϘÝRŽŠ1HaÔÎ1ê¼[!ʘ—ôÎ=kž9{¶ŸBÙžyÍyŒ6e×8²¼okl@ȸ³´cÕÌ*¤Ÿ‡F„U 2ªu ØRÔBNÐÕËŽ&±j™m9Œ_)ë”Ýõ46Áê׸…“Œ£jÊ‚˜>Ñ6³*>ñŽKlgý­†ÉÖ·|tÚ·©~HÀÞÏ©r0Í=½q2q|`1gçY¼b\àkíGàc!ôv8Íݯ;N:HÑlXeè,ßö=úů:0úYN5ÊR,¬•¾¬‰*%š4V“ '¤ÏQ¯p’ź°!€–uÑ8©£öÄf%Ï®ŸÏ1pïY¸­Ó^DSÁõ-ä•v,<¸ri;ÑðhXô㈓§i;ƒ:Öµ4X±i"HçÔ¼ºË Xê%Îî·Z¦k„€'0äêaA/¸Þ¼ût'zbáB^f÷LÎ×BPåÆüu$> Â8ÛÄwýM>Ì[”C‚V‹X|ÌÊ #‰ìNÖi¼ZN˜žL­c„²ÚÕ¿¨„!ˆ@ˆ8 éKîŒhU™bš3;Ñåϳ²Ÿ\ÂgÒñ¡º¥„Ph`¥áÅ⻺Ïÿ/2I®ž¦¶Xa•²·»_ÌF¡,«bâÙZP¾»-‚Sr•<¾µÿ6“¾ál…d@ì+ OE<¾r¦ü¤ÃÔ,ð­ .ëÂC*4žú Z%K3¯ $ùQêJŠUsvJ@ë;[Õ¦—sáº]ÙtkyiÒ÷©Ý(³¡4.XËÈ;‡!›Pô~‰Árx¾«‡ÄUñ,†„ÐÖ2ˆI èë ñ›S4+<œÿ>ÌöõãŸ[ ñèÆÇ Ny†fÂÈôüÆþ³–w\Â1¨Ü£L° ,ùç10 ò%æSà;‹Žlƒ4([ -›Ã{Öjé½\%Ç/HíQ[äµýcé{ÍÁ s0àIÐÊ¥î.ÄëŠqí: ì@}?]Ï3îA ¡\ƈ.Gñ ‰`'F2þÄ÷DÚlpXdÍ?ítEpK… ·­Ò,0ç dï¤%Ý[6½sк„ps®Ëa.­Ï#¤¹“?p~ë q^1?ºÜκ…xà°“Ö´&ˆÛ´¬èУEÙAmWÅ.ÞÎpAµŠi8Œ´±Q“l›sRË $äêí%<Øi]‚`ô“”Q¡´oR6ЦWCå‰ÜH–£ €“ÅË@CcjQˆöÑïáv“תlóV®–À·i^}QØs®PJœV%=GýÎí;Ÿ Ф[Õ¨ö¨€ž;Ķ@P£ úq= ;à0Žßn5S¢Î†Û±TÊ‚ ©,ÅJ2^ᶆ"o¥ÿœ8>ò¬g•œK彿á[™íAþ±zº@ç܇É#€©hQ1ùÝ'½¨ ×D/iS/:!ÓÌ8áZahµ¦v8!RZ{wJÉ]^o'’žÐš÷¥F­"‹ðVIÍHp‰§p\¶šþ3¦‰”[­ÇGÙÚß„‚Ë=¯Ñèлi )j–3BœŠÊRgïiWĦæMT‘]p»V¼0NFÅÏ\?oÜ»rú&Œ³,Lœ.é¤ÒóÏÉ©ÑDåQò¶ù@c&ˆrkRB£{æ‹{…rµà]k]4¬‹oPÙ»{5(æõì®O áøöÞÜ8û(¼ª£w"56šÙƒÎ‚ª…N9êoœÏáö¨Ž¦×‡£”¦ érIxær†B…š÷„„Ú`‹ l-H ô½+è’’pè¼UÀk¶‘nh•šÝ&¼IÃ87kÇ ^$ƨÜpƒnò¶ ƒCU a˜D Ô Ç3FîSr¿Ô0¾#ê#åÑŸ©úr+ C]Nc¿™ªÀf9¿VIÚí¼rÕÙXÒsÍ´u–‰˜L$aW£‰TZe‘¥-Û* °¦ãt¿2¥qõ.eI¡Ö& ¬Ä´`kzÕµ‹è2¸–ntQ‰6ŽÅÆyÙ[’qdø &”E³(É¿<½È Béh¦**¸²êÉúµÐ”£sàüÞæÍUÀiÿž*»»¶Òhä¦F©oåâ—€=Fîßzt4pmB@Ìn\XˆW2ŽÞ÷^QA'¹Ó‚ }DPÕAΣêt˜¤“ÖÙµ—+%f™Ä£+pÒ\†à–‚ê^ߺ±G:3÷Úå‰ß¸®œŽVJ8®i£¾'nÕr‘d´zïÇyà¸u‹O³àBo³ KÔvõœº^6ò 9ÔH÷Í4¡Î./n««>Ñ ÂvY%ó/W“fiY5»œèc.4ñ.ò4Ѥ]ÙFiÚÒCQzIKËL²PBáP0³‹ªë˜£y«Ù.©±q•}Zƒ)a4ãQ ñ¼´qű™F¹E¯2ˆSÑ„/€¿QÀ?»Êâ„ÏD¿±x8²ÑÈ%~ ¶•¶¹e¬Ç¼ºJ@£³\Ôm•ÒhòEÁîÆ¨PvzBn¹)š„M' ‰n½SargÈÍÓr߆áäÁañ»u:NF!®$5¢âÇö:Kj¦ÉOß8’OÍ!>ó×±ÁAÞò×KÍôF\ÓÇô–ƒ{7Ž¡ÿÃù~ߦOáß)#÷Cڡ̶F'êæçÍtà–8á NXŒ×Ü·?WcÆÒƒHm³`—ÒGswü^Ó…Û–&XÚêJNÜË•ê©}EüFÝAÅÏËœÀÇ9ߢ¶Q^*x2 4®òV,³Í¼:¶®Dô@} b1µUüaá´›¨"51”íÑ×¼äa té}?t°5’ºŒ_ƒ…6»2ô âYùoXŒx(Íq3ùkHm›f7êñ[Fƒ[G‡.r»â‘¡UÔ·­hB)Ðq›gXÖ[xÝR2Šae£ 4ªQì“ æ°¤@IEáwðçU¶¾1vóÒnàhÄò(L¦d´œÉçÛoÊó¤Ôqsîôÿ¥Ë–ýË ‹¨Ì­®[³÷Óè€lK|ÐeKq²Ü@‡Óe]$¦ÍÓšù0¤‚Р»6bv4è—»2\1Y¾ ¨’ŸJõç‹î8ÚÕÂØÅë¨ZÖr³º@³i¶ñ`y¤qa™:½U©f¯Y38=ÖHšY]RŠ>¢`k:ÜÉ9ÈqMEâxjŸËäb6Ýî²ÑÜ×uJ6´'Orfœ»¶7);\èCŽ{<8¶â—‡Ø,–N…KV+R­«³¬¯ýcû6|jâks8ëE^.tŸS«´’"—8}»°B*~#•f§‹f¹D¡ô'»:§:È•<É+˜Åïi×íwg‡ÁÄbÚx/ÆÛ®Ú‹n"ˆ÷¤ÁýMκßh4Ô±®GM3aΡ+¯ç»J)#<¨»Ûû£v2^uXmƒÚ¿Œ$z"Pž¨xá 8iMWÝøLR´ I<3$˜çƒ6tiéqQ3·"l³®0XöW:ãL– Æ"f‘•)ø’ŸVk¯ØûÍ ÞÕ;Ô1ÔNFÜ­wը賈ô=Áx¦¡K›ÇJU³ëœ>±ó‰Ú] ;ÿî3À´£G«€©²'|·}¶sëí?ð#¹UÞˆ«mSK°seŽ˜Ð¦‰¤äIŠ&”H*™qs+n¾G‘=$¼JÑ´ßuȈS¢“çC•åpHŠp˜AïCáѱ¬²7ËQh©Q’ãƒehµƒÞ º4³aQD¯•ŠÙ Ù+ÆRklñ¸aÙâÃþmK€áç’»æ#à¹Æ!{ø&ZB0Á1M’ 3Ü4”„ÖšeY„ÐõPß¶IÕ‡XiS1¾ásÃÎN á\½aAœ9 5?ëº)ôüÍáD$‘ƒˆ—˜´òOwøZ„’"(P¯5²ÍëA.6ý&Yæ¹Æ2ôÅíi„Qð<'ðÚwÞ8L¼Ô â6ÇpwªJ:ŒX)ψW[rö àfíÂÞé{χßs·ÅÕCº É´#FŒ ëŸ3KqÁ¡ðú X;g²ÑåÞoEˆ„Ã-Røwz„débq­c…F²JsXÓ&ÒÚ¶lNX?RÇOƒðã¢Ô`9†&éÁÚK>»;º‚1KÊĬìwcFIu¥¥>ƒ,Ñ–O…@4CªTq\Œ›+ôÑŽ´df töÌ„ªµDœ81&¥–¸³9º3nЇö~LË…0ö˜ŒÆG3ï‹,Q…:2ý QÎÁ¼ZC³æ“‚Rä|%Oí8ð¾çÿ‡úV€xˆøï²ðb#ãÇxøýÛ… ø]o?Ú*CÏ)—Ÿžü»‚¾[¸¡ò>åËÈs]g´Hè†A‘b7òŸêcº¹uŒ¹\¿¾µNBM[­¨bà%ŠúM7Q‰žÏå QX†§ :CT‘–T¾¡ÿ+˜5Ä9]#k¦WU‡4âÌOås^¸gå lÜšðÚÿû×\+Eê<‹ë¿.Ú^´åµóv}<ŒV¥Êm{‹tìé~µõèŽnîc>žoƒ 1â[¢ÎL^ÀÉ`¯¼D[­dO>bV*¨SrD-R©ø®«A€œ¾Þ¼º_uÿƒ=Y’.&ÎãÏqšð§øëÛ×õ+óL1…V«ÃUE„Á·ÿ>ºª§PÔ^(ÇDKÅÔ4¬Ì‡u¬3ø¥°ëº-ƒä¤Â}Í*˜±v­ƒ5ÌÚåè´û"G¤Þ—}ÉHTÉVÙÙàh7j(“L ,{ó“yk”$Uk;yÂ+ìk x~Sß°ÍïÕrv†+ªÇQòñžoìùñŸÛ%;þr|¦©I¾’øH-wTÖzvq·â •>ëÃËŸ©;Š5ˆŠxøNb^cðü^nFSdxŠÙ”åÞýþ¡€!& ÔЭ(?êˆËÏ¡la2C B*µò§èá$B~dpd|oçÊã)Žp\›z'×cß§BÂ@Û!°§ ·ü«‘JtmðrÉÁc çµbžæÓš[$¤8fì'=ýÈ‚G@—ûÊ»‘^Ƹ(+ç:`©Ït®7ßDù #(}Ýõƒ—q9ȕĪn¿µ(;¹î®Ë²zºJAßÇR.ªEEÖsºL—Ëh_6TªUIJV=6ßUÛTŒŽÕÈM<ÆOèÂç‰óÕ\7±‚ÌÏ5¦!3´—Å.Šæ>ãâoLku•dž?Ð?©°†ÊÕøcQêP~:çËÁ º˜6ýÓ—@€ŒB–°1L—P9y5Xõ— ‰– vtã¹Ïä^k6Ú ½­äò)¨Ð䬊iÐÑ~¢jgêrÒºÛphðia¢TFaÔÎâK òã± G² æ ‘ÿÍÌzzß]ì¡W'!3ªLÿ]Ü}Éh€UCà èq×~3‰² ãQbÚ{`BóŒ0mÂ~Ò©B±·6àAÇÏAÑ6]‘Ò§£U&’è3ÄΧt™îלöGëÁ~¦¶¶“ [Dn×%‚æ±c÷SÀ†‡«SŽÞÔºö\XãK~¼@!ª}Ñøo~}k¢ñënÔŠG+‚up`T~µó˜^Å<§/u‘ɰ±´pµÒÊÛ$ラ‚$•ß:w‚ç‘c0&;³ß±xß_—I-(ºžÒ22ò×À OE:+l›ÀÛ幘;qß©Ú@!6×…Oˆ8Yj?ÍõË-÷²@À®ZÅ Y$¶Æosë¬ÂÃwJ ®æ2eÖmÍ(Î×|í@…¥ *…NX?Ea¢Ý ½±Cš· _VÉa3ÂÖœh®Ÿ€?Ü|¨O¯BÑ蜤ë„÷?Ê—~ëÚUèRÈÙõ2JÊ.ùí<8‡‰^ÎAE`IeªVë[î3î¨Æ•¾E#C̶kSžwþ#Ûœ2qŠ^ ×Ú^ræ…jö¸Œ±rJ+L·5­ûÄs`Ãú]2÷Ö ¾7ˆPÓ‘$@ÒÒ½œE˜G8ÝÏm"l'c²ʉîO«éG$.) P0|£°|({ÞÇïX2 €ÓKð:‹_Ö[$åœô±Ïlá´\ ®_"oë×nY!\a)àòççÞ0žÿûJá•F4“@åäNØbÑa¯kG6»í:2ÛÉû­o'z2üâ]fÙ`>Î;ö–Ò÷ G–•-Pm}4&´tñYŠ1\ˆ_H}ùüÖÏ † Ï:ˆ¹ÏÃ>þ­Ö("Á1àv*Ä⠰í¨ãú<ÔO÷º…Ý!­3ýL'…½jFZ⻯³€Òóÿw êc™æƒˆz˜º…~f9J1v/QuyTsEô$÷÷§Næ,tèùf×YÞ^‚þ±Æ°9¬œ­{çnÇžUІÙ¨LØ´n,‹µ‰¢`h·‰ q»SÂÁ^åYƒnœ‰;l›Þ=|µ€oÖØýšËzò¯õŒ;á^2}µ_1 /P0œZ8eBj$r~bÅ‘•ýº>u0/¨‰¶,|¸ømÖÐ7éÜu‡Æ«óI<”Ö¾Z.€­>JxÎs¡-éœü• â‚O#Í#ùNóµ˜ (ä-Ñy¢4ä”×ed)CözÖ–ªëäY]“4k<òÄ,vSª-8|ƒ³y¨!=Ôš•ê¼_7,8A,t°¸¼®3Rߎ“"+-•I"ß;3IUªrˆ~â€-´±¨t £±-vC2Zº² ùP}ïð ê…íÿÒݯ“hgpä ¥esl/ÔkÜ[=¹5x½®¬ØFC=ÂEU|­+N…Ë@§0¸¢PžS×NϨ¤ÌS”¶ë°VPÕ2‡RE˜JcÎÏÇÌ­ |®¨B™ŒX÷ªWÊV‰mÌȆ1 ๎z§Õú-¾j gª>õØ×4<Ƨ-Á¤´Vˆ§:M„6ªÔ%ËüûkO_BÀöÍä‚’á¿7yâBµåñ™9AÄvŒné£e?œ´ø’'i„Ñ ª‘S$i\VÏå6€:•)8âaC·üŒ¡–O$òå¬t‹8‡^è ”mr3”-öÛàéÐÖÔ•&ΡÜj¤ Á€üÆp#‚Ñ5é…*:t®fé"N»ˆßVÜÕÏ]f@¦@“(YÓdšdp$Î<^Heòù›¨´Y0…h6blfB÷†$½¥;øÃËŸIÞ¨¼–M¬ùBTçN‚¨Ó”èW² l¥Íãå,2}¾*á}›ƒ\šdE%¨Ö@¿,Bá¹å™SÔOaÎÏ®äbê¾òÿñ3TZs¬†!Õ‹­HÀmÚGvÄüðô cE®r#b“F/;-ž×j¥P]ù˺õ(‹&wšíž«ðÏ=áR9uÈWº0 uUõFZ‹['. ®dJõºª:Ý2¶½uvR•1‰®’>ìy[ùz )PutL°ÔÅŒå¾3 %Ε9ŽÑ@õ5ôPÍðK;±=4Cí舸F¡1ù&躻¤Z`0K"ǰÓÊ[êí+®Ö°a=UZÔ™iÿŠØìªlkFœBŒÉ¡®ëPé—‰sóÅ5«}5³ñ+j:±?íê»°õõ™Ââ…f×Ñ\ÖAu«Ó—YÇK4­xó ÙøŒ8/ …wzkÍ—M«NÃYX@¤RtiECˆ{îîáÇÇôGYKX\ n"ó{ËþÛRƒ• r™ª–TƒØ?þ=è ó9q8¢Í*MÖ×džIÂéE6±¾DIôsˆ¤!K;Ŭ†5y ­ñ(òÅÑV€Áë P³Ëy'MÁÌj¾Õ%¸ ]EÚ±’®‚‡¥/Ã|¬7Û²IèÜÕ[Í9¡¾K¡$cÄ9x‹cd4 (LÎnk¦l^ý}K`]µôRY!hE’å¤e rÿ#¿8¿_Gl!’<õ™Én4|Ô!Äú†žªVËÿ‚ê3$Š‘pœYèðøŽ·!E'^¡ Ôü—´­R3Vö!²NÝEÍWY?Û+ÞŽoÎÛS“º™úmYf1â½ð'<þ4 ó §ö1ÂÞÖu–Q£I Ü]//ð„¼ÿÆŒ8|:#λÑR‰‡Ú‡<²4} Pòšoy£¼qÓœ?ÓùäáëIs7¡B;3õkŸ’®_´å"›?ä›ÝýÀ9J;„8…Å©¿Ê”@õÃ]ÃÊnÊà£ãçRNßIû­K‹AíM¢á± GÝjÿ‚A°g*sV^hOø~]ÎeLa$½ùÃX:Xš—±Y¤ œL°‰·“‹VqÄ1ib8•Jl¥5?9NQ»­|CùV¯O ’•MyŸÕÔ:¹éÕÕ+ξº{½Ï·£¢‘ˆìš•´—þ  °åh5g²eà;ß©=Kߣå/2P!hZ8ã}9Q“2M¹Éºóâñ˜ ÚCûGŠQÞýIü³Î±[Ç(¡G£;´rž®.óÊïQ2b¥ÔáBç)ŽÂ0õ™ñ¢<ÔˆëjĈ™iqwËCBׯkpù6Tøò¡ùÓ-Þæ½:5.JµEâ”ð¥f˜ßp ÝÚ·¹”¦ÐLÇ,ˆ5k€r¥Q;­úD«¢œjýXÂ+S˜2;h³-´ qÉ.[/ˆ9ùœy-ÉÓ›—Ûì•jm:Ór3å½Gh´½ky╘+¬ª¼1g—»Eðu×ÛY®â1оUJ䨴b}8 ï»äVÊÒç ^ß¶ÿgx¨ªèý›4ç¼âK’ðí^.$…"1L-uý¥ Ø­Ž3@;9Á9 I¤5·j3à–ÊAóán –´}²öË»KŠÔmW¤&ÕKÆö–jðƒÊ€fMGÊëG»æl宦ŒE`i%wª®mçS„LÁæÿŸ‚ÅÂ¥óBa—•¥` ÕHh¹v‰Ì”™›UWëz—HÔÉzÒÞõš¦1€D’a^Jƒ…‹æÇþÓŸ·&}n-„öî!S2OÏ–ýÂ÷¹µ-PýwÓDg÷†“'½ä›†UÙ"V¢.Tˆ1èhÒ٫ׄÕÛÑ—¹¨¦î©þñ¨ ’w¶Aq¢ íù nsž¬\;‘Ó‚³þ>ct{ÓÖ ¤æXTçµ }KÈŠ(›õUË-Ùmÿ<½+ôN[M…z/–X¹–¹Qèc•B"­s);W¡Ælh3•ExÝ‘†_6ݰ’¸9t*¿‡ŒíùQY2ŽÜܺW8Š*¼ Ðž‘ÜFû• OÈ\¨CÜËžw Ð Œör7R«4µqÈ‹Ðß¼Œ¨Ó󹯶í| ”êêÍ‘‡ÞiÆ·ÙÀòu"ム¸ƒwØQц!.ñš_'Mvæ°[z-437®®¯ªÊD+}^(wgñ †+}FZ mÅËß#Ôl`z`¡Ã²ÿQ:JD5ˆêy4ËŸÎIR+[9ʶ£UA‹ L¼t-÷wn“eñ^Ñ`DÅ™D3Îñ[tp%m– |êPh·dr” ò£Â·) íŒW)l'+Îf÷šÆ­(fvB)’ÃTÔ.ÂÔn­ … \  ¨.k;ñú}¨~Ùo*Í­;qyg%=Fl‹ƒªúü­y5î•ìƒ78ø §%ÁS«—mJH]óÀ’º¨B4>ÆØ,Í÷—B@­¦÷©â‰Ôd×ÐV”o*Z6£"»0 }`‚R+'%IZ©ÎV¹?Ep‰màZ›Pa¢Å§?§¶#2¿Q“=t¶¶7}=fÏG]O¨iι<áèkÚb!ÌÄ•”ñ–\E]sJÎ%ˆVMȈJI"ZY*’íóT` ±+ÍS+œûQ¹Æ¹”/- ¶/œ¿îhQháŒ{ˆÝ#¦Èõ\ Ðäf cÑJea"ewÀõáŒd6 «CCÜ0“÷Z^ÏùÊ0£Ùç\‘4ˆq]ÝVI¤ÚÅñè ƒ·?êµW¤ž‚kˆJ±¶{ v%A.Î&¬´®ùfC‹r‘˜:1$ðrMâ–£R-b°B﬒§ýfØäYFIZ…µA0U ¿‚`QCÌi®—ц ¶wÊ—±JHȱgÆ;2;Km«[µè]}ÎkJM¥Z¿érØ U´aÖ– ‰ýíÈšˆ½D“©íw'm)`¥:Ä£S‚ÊÜÖdÔ[ò)/”Tª06ã´g‰¤Ò¼‚¡Ãhõ=óÃçí$š÷yo˜i¦çÕá—äYÄÔŽcQH~qJë¤H"3Ùy²{<3?xb¦yöµYÓeÑ«ÈeDôÙÌ`‹H‚ãŽó«ˆ‘£ k…‡ÒHGŠHÄcÓÖ´«½PK.³C9Ìõ~\G#-¸Ýa(]£’8J×T‚Óïm¥³cu‰*-y"v‰“üáÞ£1¥é¹:ˆSI‘œxÙ狉°æÅ$Äʵëü`¢­Î;…}b£R¸ÅŒÔ0f£†eö 7ô$h ^Z¹öΣ)–!M×MÂîýŒ°ÿ™ƒéÒ‚ZØÂYúöÙøRîÀ\XtëÃ+·õK­!M»• ãüJÊÕ2X”¤Ö‡=Y(UyƒNè!,Çpä(šª|V/ÒPE'†¥KaFnr$Ê¥å†COïàlAQç)Vo³$ÖEš›ßËÏ5|äOG°6#aS°?dæVˆã*íÉ„–A—x¨ã‘¥T »F*=t¤„ ®•cì÷ï›öªû¦„©ºaÓtò¸EËÉñ“dœÿX "ìó„qæ•Öo;x™ÁôAGêi4TåË*†Ñ¢Ûxí'¹Ï”w5. E•©%œt³Š’]8Ûuò¼¨ûµÆ•í;­ û•¥A‰É”—ãh L5· Ñd¼\ØK]/\¡¯Z^vNÐ Àùp4F·Eœ’ôXXh/´[n̦¾o9²¹æ†Eiô¨ >éêé³UÚqq§ÌÒÆïêT¯-Uñ›9¥T´M/-S†ÀÍlSðüQÒ7ƱyiYeóP™ÑT*'Ðb3o«U°ËL-‰+G_X`ôË6ºm…3¦î×ÜT ¸]M)»3.D3hJ#ŠJU7ÜÇ'‹P …W4J(u¤ñžjôtä9•Ù=`ÑÖÒ†ar¹_"²R[VOø1 ¼-eeŠ)š;V<´ËmÁ 98¨(Ì£|3¾4Iûé@Ü œCË ±é†L ‰È$é+÷Œ’nlP¥Î̓ü¯0¹lÖÅ‘üe¨p"ò1Ö:a‚Íüfk¡d=ƶy˜Íï\dÀA-Ø{è0²)‹ŒÈWu,mxFèt¡¿ö§ûOFÁ„> ÏF7³5NØÅЩyØ£›¨û[½U°_„¦åŠ%é¨!Ýê2^›zË‹>§E“Ò ˜Kh±mnÏÖKav}Ù~1HÆW9›]‹ƒ#³ ZÓ‰ Ùó‡T•‰ÛÇÕ.ùÿ¦Þ˜œ$k\6$N)VA€ÚTj6ω´¸Û„ϰ`…Z”]Kuþ±Ó1›Ž™¿©+¬Tß›ô©6¶bkˬ%ºû gDqJŠu¬4(AºóNVÆ¢¼¹ªëçm»EB-ž µ¡gK5âìÐ ‹—ÃjÙf,E r½µ¼Ù2v€¯qh)šŠ“¾4h<¦·ð3 GÚé1ó«`ƒM§ï¦Þ}§(ÞÅ\•* ÄI‚º3fIÜ£qQĽ•$ž¥5_%W,pN`žÛH«Aò†H|1Í Š)cq›Nãýò™5°©A7Ðä†Tâ–´ó°…¡HC*A³“’!£hö:ØK„§Dßp˜Àšƒ\jä¸ãò‘R3LùP“3ÿCòѤ å4Ê<öæÄ2åàâXMîÕRëX*´.Zù+EéKm'¬ +žç¼$0„^<‚ç¶%#ÆZÈAª )2J Щ/´ŸF´Eت’¸;:NP£ÖìÁ‚«±ÿNž5†f«P|u2ÇvÅ*©''D®Õ³Ü ج·9ÎÒ:D³¯”ZwXH¥~6 ^1ž¢«J‚U‚0„Q Í‚g2 W¥6*ŒØÚ´dshÓ¹‚æO}éÛ[¢ß Ç>Ó <¥ô:€—üEØ$ˆÏ<ƒ%ui¸ñ ¬åvƒšLŽÌT5¤ £dâåíÀ¹t˜¥#vjÔpÂ@—˜¢§GtZÝ2î䔿š®ñLÅ`Š“=QÄ-†MS—@{¸ÊÁŒ òÝô• Ü„ù‹‹-¾ŽP6Y»XuBˈUFx•Þê$SPlÝþåuö-ñ¤'!…©qGÓÞ@mnÑ_%U°»¾‰œ¥:Oä°€<¼âí¼W¨}="ùbú9+n°µ­›+¦ÙÊÙf$Ô/‹y\êµÂ—KºÇxí,_sÛ¨š¶ò[G‡FÛŠ/WFxÌž^<ΔN ׈.ЩßÏ1:¾ewtŠ s,1j!Rò«e’« ©‰!|ðt]‘m9–" ”5cÏ—–ñ™a÷2ÏnöJä'@#2­Ï)­¨}–ÓZœD¯ªì‰4Ùzf¸Ú·H—kÊlJdhš"T<éð¼ój[†ÁV°Ø*“¼”M×' dÕCÏ3ó #ï¥ââVÑs‡ÈMç™âÇØ+¹˜IÎ<Ú;¤Má& ÃUÛ•®Û|´ÖGZ3òøsƒ%jZXKêÙE× Ä4äW0Qÿ‰=J.JøF‰ Žº›ÜTd.pÕM?£'¸-k –H.Cx㨻NÒ%º4–4ª°ñœé IÈahþo—q=4Öï™dõ’n*rÏn}q ´µ9Åf÷ŒÀ˜÷ê⣧.Ìh•XLi£ƒM(Ò‡…ëMÞ^ãÒúêN}ñ¾Šb&‘ÔŽ´ÐiY˜rwºŽŽÓ ]r˜{ ´ärœ®R•IšÐåa›•‰)ö’Óx®],ä3|ä‘£Ê\êù`å&cýyÂ@Cjç† ðÌãÂкnØY£P]›ý\Ðw"€µLÉ£ÁºDú¨þ[O@eÑ1$µOŠxr)ˆô …05¸2J–ã:®ÎNd—¤ŠÏŠQã,kR7BU‡•ì+Ääkg¥fÐjê F†ß§·%t«µ+#†šG«‘ké3òE)™qi%³-¹ðIâç⡘HÐõ½íÞh¨pZBË’V\Bƒ¥œ ¯‰zë:0ë— ç¼, ˜ƒ[“ÎôðÔÂRIí´Ò„;XmwÚ“ ;1Ò8¡ «²Hí(œ«Ë¦îF–| ÇNog¿þ¦«#>8õŸí˜tÓ–5b4¹ãŒ%ò}¥2FC“œvÞo¯³N5øòÖ}§Ö:¨MöÅ…3$‚€‰Ò¢YCÍvíLp=›•[#^9›šôªÄ$^˧[­-Œ©†hJKªk”œ€ $ËÁWo0A^΢ÊAºS\àöMÇV¡‘5>„¦ßêü»hÄH0ŒËÐYòÇ— å B=+7°®Åò ·2)Œ··Ä&áÉ)ð«ìê; ›‡'åëä“|%ûß±9)¢øçÓkŒÞQ;Cý–8Þ^#Aà9ø3?ð{LuÄö¦>üZ .Ëm!b\FLþ»Eªi+XŽÑ ذǻa#Q½]€Y×2‚s=t²BÏ›"(LjFgûýÂ@РƒùQøOà×}Ø£g\c^:©ôÐÜesSKÜæ 'UH mƒ Ô²#¸±’3²Y@¤®í¶¹»­ºX^œž­$ãUà{zf¹(;µËÉbs­Ïöσˆ›C³'º/æùO,ì~p¹Û"áÀ®¸uÜ Gw(D}à¡Õ•¼eYÆ6Ý¿*2W‚K\Þ+9àøþ²K M0}®ÞcþÉ‚#ÔõúÃöéóé[ÌôÃþÃF>°½­;%Üóº¤ã›ö®G4æ˜ÿ—ÿLh©iâØÎWVZ©«§èßLŸ sª·¦„?þÿñ·`ƒøÁ>¡}D5üÂfb‚žŒº-‰'§d~×fùŽ[}åû5·ë± ©xH`öÓ¿PF¡”¾;ϸ"ß²P†–Þñk÷Ü-}¼ï§T^û6Ñÿ”']U 5èÌÔ®ÄQA´tê4“vBnœ°&ó㱃o¦X¿âï>FòĈíoKkÕ‘ÕÿÚ­C!€™]Ÿ"Æw”Ã`»©|4݆÷V³wãõõè5ÑÓUï&‹VÜ¡Öûh¡e¸oɾå¨Ä OÔ¡ –×’_ž«Œe:‹öêßâO“CŽ^ü~Ê{T‰X3ø!C­;ŽÊ ˆÄÏfT®ôùW5çTdöÜõqàmªSÎ8õNÞi®B";jPVî w‰û?ãùrruÞÉÙ¥<|Ê êþ8@sÒ~¼Ñ¨Þùço0è§õ^J¢=y¶ñ@1¨ á+סC°óšd9f±¾ µ¦1 Ê<îJbCÎuÒ ¯3“Gz¿TÜÃß/ï•‹Ïõ™Ö÷yÙÚ¯p±%þ^Qlhljlá—(ö¿ÄŒ „<|ã´°½ÓŒq[nH¾=£ÓŠ%KGß"{3ŒC=‘=ꃠ‚Ë]¢¢çúŰ%×ùÿÜe\Áïç¤þFÞõ®ýœÀ½FF ¼ý~Z¨|Ä<[ãq?­:¤nºÇ¼t {nÏ;6 @O«»œÁ’˜8Ê8ˆN ܼƒ -0qªf]4õ*F!4É‚ÁåEå ƒ>oyAûüm¼«Ê“¨šä¸ Ïú‚S÷}mË®þˆÜUó(Ë-`êqAÐh¹ïȉr ’ÃOP^±@*”P+fŸŽênóœ-¨©=×G.®žºÛmŸÏBû Ɇµš×^£é‘§s’éµrшB¤»-<Ô·¯tq~GJžäh]³#l,‚騠5¾˜›@°!Vqèdlw(3€šºÀ’`d” 1ÆOŒÈ)0š±Ðɽr'pÓÍe!±åÖþMZrØü­úêhŸPNæÑLC¢—¿T)“…j§ú­ƒ…t ‡,-¾Äb€!°–IÓc­Í0/£ÇTñXapR÷¡½ñUøÃy ‹ ñç° yÂ…­ìLP£TjùŽÛô¦Ütß«sçÌåëôÝ“MÐý6Ý£WLÄ‘míÆÝ~o—6²˜–›gM 좹œÒ÷§AUS)ÃUþ¿ &ÛˆˆÕÊb<«„3ª§ã8qÿ G¼·ãÈ+f®CBуBP‹ó@/¨u&+Ѹ© Ý~²Y%A“¢¥”u”¬¶ô?fìà,½K`yÇ–W BÕaƒ(Q¿'Ôg`kˆ'S¤Ù6æZ]Б3EÐÇèoE¨VkD†ÑÖ”è® ˆÂ²5 ØôlÀ¤öy' Á[6P½>Ì6sÈRC«“пÓ?˜˜4ç™LM×Ý8g»•ªP‘y6ùý ¤ Óìÿ2¯[Œ·Ï»J4’ªŽUîÎ<&@_~«©Ôæ»°¯«z0Wè©ï|ö³Ëžfr÷5¶»Z¶-[]U^ÿ{á­Õ !H¸.aÍ]²Üv¶A5HˆJNg–ÿ9~íuºÏ¼G¦ý¶ 7Â=ã>ÐÒŽÑëLƒ±… f–K ¼ÎÃ]ÅWʇS`±BBŠ!Oûr]à3KÝmò”¡TSaØ¡”®IŒŠ¡5¥š§ÿ. P‘e?é¥â+wEÚÎm³:uÍbzeh§>&mVxô<–Ë{ü­t·p§}èØP?ÖÙ2ÕY‘óçØ#1DC”kÙ%À©êÀš: Ae ¦i}NLëßHõÄú3'|#ð…Â#‰0@¼ K0mïfÏ ˆìMMzicL|³k‘gi<ŽÕÿ·¾.Ø£K䄳HØ'cÞ¢”ˆ<ϱóóš÷§Iz«”ƒ‡!  ht‚.c#šÕƒšÆ)œ«xβ9ášð¾m…Àxyó*éf)¯ßitåÁ@î©>/Ú 7bž¯—N]˜XCp*üD» ò÷ÕœínÑÎ\áÿ§ÞòuŒE \BòåiÎl˜lß’ïÄÆOF•ªr$I×O3E^™£–·1³ÖFäœã¥ŠÈ},–1Ò­EèrÛB£‹Œæ ”¤'ó T›4‰Ü¿´Ê„*Ao¢;—“‡18 o)€É;Ý[h€Öƒi*GA›À6ª‡¼¥8Í`®‚Гu‡At9„ =¹MÉ¡­¥û"óü8g“­sJæÎ™ùÚé–i¦Ûp úFŠ*ã[¸æ$™XÛã«­ÍñÓ©ÈD6T\gŽøÆ›YÄ« ð€ôözŸ¶à¯·ÝtðË6xèm¡„oâbÒX¸js´©Í¸J+Â5,­ŠÀ•/0pGI…®$‘P®]<¢Ž`¨ø —͉-ð':1Øi=Qäür FµòrTÂ]äsˆ4/: MSÔT"t))½¦Up¾|‚‚ôY?Y­ r¹IíLüßÊÅeû‹ç#†¶ÎøH‚ÕÒànâ¥c\$^=Ö/%óÎûˆ6nq\J8óY‰ÒÝj´|íƒà)7D¢t(wÍ.xµÄé¶q ½ -f(ë…di7¯à$Ëá»G6Q“–ŶgÁé2e%.ó?5j×c3wÁÑ–KŠ«Œwš ôI2PæOþì.šXúÁ= (š° ¡ÆÞ’³0ŽÍñÔ> …¡:tp(#Ÿrf'äÍœ^êF!õY(W„Í‹µŸY}¾³vw8qL×DÿÃŽNÖé1›©ˆº0甕äÿûY uÆ+8Ã$ë^¶aÜg,‘ÂqBãw 0p÷:Hªïßd.Ëï&%#|ðWx2´¨iÞÍý5dÛ#„u~MRšUOšåL^t™ŒxÀ 9tš1Ý(æÐ°N|9fó´)‰mC8ÒU+ °Ën1G9­ ±Þ¯ö:Êj-™LÃë5p ²1D‹USäÁûÍí{ÆŠÿê5 {¾Ç’œÂ–ìu"v…ör,“³'ªÚ¢MX£ï£p"¡¼NøÊ™ øÊGÝËxh SYæA£qs«€•G 8" )Þ *Î‚ÜæÁðdƒñ óÛœx8E|Ë£°o¾:ZcŠEJŠÅé6„ˆ¯•a Vü¸]kß8×_æR ÈÔ@ËqªÐ5.Ž¢à[|js¡ËÌd+ŒÒ­‰m•%üœ^Sˆà…¢²”%Ÿ`÷r8x×G,¼· $¢ËÌÞ©¾á µ,³ p÷ì¢OA>ñlÜtÉy?—,óš_Šæ¹/ùͰcbHÆ QÓsFRg™ë \¶Go$n¹{×|ï8âiò{jîÞÞ|îóœQ 3 ,a+r3Õ:XV¾‘õSNRZÌ…¼§X žOXL4’eêëcôÝÐËnÖöÝÍžñ7Llþß78t%-˽½¥ÐÄ×r2¹!iuz¦õ ;ýιÜ$÷žÎ›Xn‹»Ü+(Ǥ­VÁ9¦O ºv´³+û%êöGg4‘ÀÖ{ÎÌX>«5¡2P›SˆöšoF8ƒ[9—ѬœPS xU ® ØAæ½¢÷qEWC«Hvçè«É)Bìa8J":MÜõ:>>—LÏÆ1m™IÔ}&5>t Ïüw6ÓL¶9;n¡…"ó£ãAOãÞ$Á²‡+»pQ["¿g;M"3 +BM¹~¦cæ,6×Öäc0±+[7õ^¸ãzŠîÞ1΀5Œ_'7¿Z4s'¨1`K‰Š,®îÁŸ«_ (#S7*ôŠQ¹^3 ´÷OâáÕÓΈ¿@ÆUÙ«›ÝWÞY¡kwjñKS9]N£#@²<σ8ÉfÈJÚç´PéF+S.80½,žËF4¹¬" ßö¯kEø–Òs\ ^9>+ÔŸvkgŠ'ØBì•GbO8›ôÜ"[1ûw¹2NÚ¬3UŸ`ࣛMõ„U5léŸþŒ™°ÙVãe¬¸¤V…¡L±3'¡ó`Ðìr ?Rl•a¨ à±h½Ã„Œå˜X2èäF(âš1—åV–“åm@™8D¹z£¨<Ù?ÁCòKÞÈÀbS“O³ðr¬›¦nHüÏçί `(Õf§ED•È#r‡PšhCk7Þç‰D ÒÜÒFI4xµL„e|èá ¥âŽYAŸ—í͘¤ älk¹*ê}kœcZå”/fìmÃbÌ6q©¿ØëÕ¨1-”¿YÑÊ êîM÷„‚R.¼õúUàÞ½'’Ó¬Ô=¯Æ\ÞÚJ !p¢"p^ÓÆ¸O ÃjCÕÉõW/÷œËÏŽ"5cç?†–þΠ0ÆŽĤހÜ#HiÓF¾ªîDœ Ù ÓLí%Utd,Ý,5Œ¼¯DsFi2 ³XˆWÈ^ñ[ŠÝêãž´€5ó¦b æEÎ,%³Ýt ùÌqË@,ãå¤Ò=÷ ùtßZç°¢ò{ö%ĺA„ZÔ²È!ÜrJƒPV¯Ôi79d<=—Œ¤%¹¨ÿ§6݉ Û VŒ'é‘eˆA 9^ PÔ`ò¡Ì-Ðþû[IЭyRÃòr¶[ã»V4¬"*¡žM²8Ö’‰ç pci'y=òkÌLN”^nÏ è8ËŒë+peç!XÔ}„©‡ÖË  ø\C($ÛŽ–¦–&êvlrÄqLk¬Vȱâ·ù)bi¤_Ó68º|1GÄ’‘蟇<ÎN?ð7åUŠ÷8Œ’‰TE.…­ßéÔÖº„ùTĊ߆,w¡¢ÆŒ°þi 8£E|…I¡–5bªôZ¦|•£'ð@©T'x“ÜúR\‘¢‹ßCOóÙæøíIUû1k–ŠÞ¨+f/žI½+$U¡ü2¾¨â­:ÍðGNFb¿\51I9ÌNÂèP'^´›œË‰]Á¼<µ’Ú´ty<—r¶½#GV7• §ITæá58¤¢¦è-öÿ»Â£((mÓw.-Ò$$Žqæ*ŽÝÉ{}nKNNíÈs7:TêÜþΡ@}å½­ú_¦Þœ ð”‰ÝXãï^cCq·E¡ÛÉc³FÁÄ艸±^É&Y³¸\3 Ôݵà’-,‘ܨ»œŠçxõ¢EÛ´íMÀ@õ'‰ÉYAJÉM¡0´A6¸ÄžH¥ûhèP‡¤£XV1Ñå¸b„¢X+tÜÚp¸ÀÖ¯ÁRÁªÆâ7jZЈëÛFÖ[Bcòð•"µ ÚhÌñƒJÀlÁ*Ðp‚0•Y Ö¦(ήq Ö÷ì7H ŠîvŸñ»Uׯ¯ç'T;Z°V›ì½5" ˜òHâ¼÷æÍh&}kÒ^Zá·NVt÷ùH„hûÂ(%uZãaf/P qvâñô0¥GÏ]QwApô®ôq€g¡$Ÿ%ª+ܸãÅ*Çã‡Tó‹šÓ‹©±g™Ÿ¡Q‘¡­ž ¼d¿ÆL&Tà5œh®sbQt®ØÐ[4$t8´„J¥îÐ t¾•uvzçMR«zÓÞÃï~×2,W-]Ý%Ý_ËòO“…á`åßš]ï£[Î2Ž€Ç\Î(ЦE¨–%þU\jPŽÉ¼o!ôÑT€„x(Ó®F EDÂ/*Þ¬n%ŸÁêÍûÏêÑÐ>™Œ®5å—FÉ=ÊUC«7Œ5zFžuXôâÞÚÂÇÉÉ£H*ÕÍ3b\؉çó@”‰¸u¼3”¹ÄùïT°Âç‚ÑÚÅ·Eb!I<Áca„ã}½¤oMž]:1¼ßLF­*– 2!Ô2ª*2Àó€ÃG »(L@%ÄbƒãIÔ³§0 aÌÝhy¥ß¥ÄZïÏDzG—á#'Ñ÷î¼R2ç¶}ùÕ0LŠ“ò¸qxAé ñ¿0°»ÉƒËfuJÍ-X@©O'£@“|^ÖAÁòoâ'%·o÷f´Ýëú­h´Ø¼°-f** ¨ ÷õ–"Íu§Ù9DX¡TÂ]DNoöf‚´aå’™¦ªÜåÀ?0o¢¯4•áJüí—1ü{³?ƒÈa¦¼é$vúþâ¬ó3¾qÏE†Œ ²Šcáþ#¢ÆÆ•°uV'ZýT$a•6 wýs}ÏuÜ:j‹ÇW»™þÔ«ð;Ùžg!&¯šòΕ–ýOúèXé¨À‰!Pi묠˜Lb„ÊMJ3àÙÍoóä[+hë_Ñ=%¹}×&p#¤p/w´V†#¤–ãzJó¥újϨYÒ Òo8Ò®'ÂO‰ø¥ý†­Ž6ùòOƇ"ZåEVÏçç›Bªok>ù`nˆ“‡0±´STÉ¥ëV³xäc/gp–ͯ!Ãgj³¢¸øä„$ð…:´' •ÆõÈ¢A5|"B'Dµ¤iI: ݱţ®H³1ÔôP­Ÿ`á×5ºò\Á©‘‘Päæœ¤ ±p;ÈÜÑJ<"£V²PÇ0S=27)”Ïͽ¦¢UtÅT¯0;9æ*ÍKÈYº7úâã´ËCá50n­{¶ëaéü²¡Ãe£5'®ÎÍyT’¦j,/Ì*å”hQÍñSä—^p¡»Ä©[f"hr&ujhN% Vf8£°7T¬Ã™D$-ôþˆ|Ž'dh‡è³‚U‰Ó«ÇUõ>%Hº€l§¯0ÞÍ^"ûæ¶ Bï(Bëig¤º‰ÀãdéO{[Õ–˜J~¹§•æ0 ÊËì—ëŒï‡óåW©¹gVXo¢¯3¢õ•ÍÁÖº` 8i½LJ,1F™Ë×—]æ ØË3("„жH þyeÓó«ã›Ã Qؽò ó”ÅG2H·q ¾nGôüIߌ “a’¥ã£Ž¾c„Ô)¥a¤?äÙ¦æÂ õ¡8*NAe‹Øi«°žU.AY¨Ê“¿™e›ΊÔ"†d¼ëŒA©¬©ÏJ™£¥Ì ÓFh”&;ÑØt¹Ž–×GßpÀ"ÌHœà²”âE À?Úîö³Öfàû-éÕ]‘ul®tËû½M ‚3ðÊ‹I4'/%ûI¿ ã³ f+.“®z†[J¾Fêlâäj—,à¬Öy=˜‰…6S#ÁY…0ÝÇÛwR˜• h‹‰.ôdç)´a–¢'ÔAüì’/vk#>Ä{Gç…â {°Š°*C˜Ké«€?Uæ“ró½K´0\§5Ñ]Ae+CÓ:^‰&YpÝú¸R‚Õð/…b˜†Ç $²)eÐy»^´Þ™ŽŒ¿"€}9få&ªêP%GÇ-’Pã*›:¥YñßµšÞa¸‚q^¡)sG>?fœ„G"c OdlÒK^q@žÑ¥Üi»Yš21 ”öÝMÂ6~c¥I.µŒ¨*KðMº¡§+§zx!\q‹@nn’ð°^þ¢LLè!1·¾RM ÂÙã‡Ê,`ÇÒì"µyR«ƒójÐdÆFÇÏFTfoF1\5ê^Y  ²Ö.er ™Íé"ÉÚpK›v'¬tMDôˤ°‹ u‰Ü®¥, á˜qUpFßæ•+p‹F!{<ƒ ‹Š˜ÖÀ¸¨Ä¨Šp¨Ù:ƒÖ$@È"®Æ©…˜3"¨ÐHš ã.\Ávþî…·óœvÿG¬Œë.İdXÚdKa0ná´ëº6X$c@êÌJ9´«ƒ ù‘¥r³‰•uçÕ’³~÷k“™¸í¡Û/¯Æ$sÇç^Å“Y?¼s×%¯y‚°ªwÓq7™`ŠÙbq<³ÞQ:ƒíWBl1.‘‘8eÉl\dtÐêá ÄRÅfuAAÜó¯“ߦ“9£ŽÑ£+ˆ 8Áã[³•ôѤ Ϫ: 8òQG2òVÄצî9_OHâ²p=Ѳ_æîÔ•ñ1#K<‚¶ ì<ÃeËMÖ#éÜYTJó9K© L"™Ò6¼¶8„D_láÓäq¬‘Ԍۆ€*æ¼yœçëˆ 4Dz¹Í/|Î*ó›HÉí#9Êe#¿ÓËuX#Q5 =×G²å×|[:F7”„ÊÖ@RÝÑ!l¶6˜Ã(ë<Õ%ħÙÀíM¨à7[ŸA®ƒ|ŽÙ@¦«n&xpZ7uÄ8Ç/`GÅRÁMR®‘k#¨\ˆ`©ÒÌØš7/xuáLJ3?Ü`S|-rhó˜>mh®±;ë4ÜB6XšytŸ8ÊïàbqÚ¦bÆÃÖ}Yîôµÿ‡ƒ‘ÏɸPPÈ_PX2²4[„žc¦x¹$Ž{„†\)¸ÞBø¦YÃXîƒe)º*°±3ê`|AâCÁÀ“ýyûn” _0ê6«oXGïhu)(Œ…]+-ŸQœoÛy$?ˆ8'±ÌèË«ësy&Vm#XéÇ﨨ñ|ÏÔ_˜Oc[óÔF‹ ¹2#ÁÒ3*b\L§ŒðµGÏoC]ý2þäpq«ºUÁMŒ§ïƒÐ§¹OŽÌ×n'ÃlóHí°Cq3OMÍï ²Ó–ú7æîxrOº¹Uè«Æ qÁ@ܱ›è`o²@Ø€Z»(Ê¥mÂlç[gZ ºÏÔèº ‡?0mïËá@TFI›×ÏksèÑøñ>é¿¢C}7FŠ'k±…Ñ08ßÑ+ßy'5s:Û}5á4ZÛõwgy“¨NÔ×twã«Tƒ êİ>Ÿ‘±ØÙ]ŽÑÐÎ 0Òw=;¨¹ åé¡HýC>Á™µòP÷ÒŽRÁ¦À .³.õywé-@|üG3Á6|êÌW•HìŒ×s)¡HXDäÑì[ÒâÏ`˜ ƒ©¾¦j|‡þ´y`üÄë BƒÈ_ÙÈÏ‹K4ƒk7t¿Ã8TÈ{dhèõp½~‹ªw.°Óg…RaÆFŽMÿeë)qº«EþK…GQöPùеöÒÈÐf k˜— ÙF؈ÍõÝÓ©Z©f4R\·qn5ÖÇëð0ôH©ar2!l¬{—·‹Ë•ÂñvŸ}’ç¼Ô60kv-×4Žéäò”:‹püT aÇ8¹ Õ°œ„ÂàýÉ` 9;PAÅð+éÅÎo(®&V§üÓJ\ê ¬„? +ž2‰ð‡jè‘Ú<ùt’*oœÉrb_Þ€Õn1*5tM7ù;¾Ñ5퀇L‡zÃ儜Š_³ ªÿÅU:ØXŠœ?e¹Ì:.ï™™ìdFÂnûðãpG÷ vÔqƒ‚?(åLö‹hdße~#Qƒ£9źEÓÑ êŽ.—‰ÉjRòèNéOßÑÕÖÜMpωV÷¾À¿/îW,ØÕ¶£iãkÀPøì—оñëÍ—FþÈkQÿNÇÕòÏ.uBå©×ZßËJŽxÒÞ«´4XxkÛP’ùÂ54:#K¯úŒƒ€º³ü4ßl”&$RDÎt¸–X!˜’IpÆÉ¹´RO)F,YФéKÐÇ»äí°òúø'¥ýŽÄO|Ý|)³ÏϬ‰“Ð&ç¬F? ÔQŸùúvôï¹ìø1‰1ࢀAò‰øFMeÅË NMx<¼B±n¿vúÎÊÄÔ›óS›Rz¨€ªVì#ejݹ*R0ŽO ֣郧»¢R¥]zIá^Já*„këÖézßPݳÃXdÂCqžÈòÃ[/¨/7ùOÊõÅ}ÕE]SÏø¢ ½†§Œ`W¦‘°Š` Tí4^º,ž“ë¥ÂíÆéÒ¬€ø¿aÙ+›xÈajMƒ¼A'РæË¤¿Òöó7™±IÂ@’¡ú ¼âAæEõ Š>:íÍܲ¤+YÖóPÓ‚O+ö›çǧ‡3·Tw"«¯þÛcÛÌe†§•>m¡9ÂhÏ;Áê1ÓÇÊù΄ ‰×EϬIú+cíŸ&4ëã:ÓïaÇŒyMèéÞÙ, ôQ€mà Zƒ£’CÆ …¹¼®%ô(Ò"Š,ôÃ;n«Ìi"FÇ=Ë+¶9o5"ŸŠs‹s„!³®&&÷“¨&€¿#YŒ¼0¿gª¼ãO<5Q“Ö·9fœˆˆùcc ®“ Ù³{»ƒgQ=d.F³(ºîã0{B^Pþ` Z]\É%ÚKþä¬y³]—NG”åÐ<ìðDzî¬Àd@Õ,>‡Úáž:Gñ=‰Ç®ç¤~¶~26ÅÛå‹l£òú£ïðÔMƒaê&iÆÞËGVÝe²Fë6 ëtk-øL¬àã%Â.rx˜å!I*¬ëÞX);CÙMg<)z ö^¢ùub勜–ó¸*NB%SÖðpSZcY°o§1™ø+6‰8•RJo-1´Ž†”-“ßr|_xÏ7j4ƒ)B8ÕU ë\ÙJíIA?þ¸T™^.2Ò(´É3þ’% Pµõ {è-,}b=À¨õ0”áCO8ùBL¬O•9¼¤N¡ FH¹ÅûzPÍ©¹µž­*Þ¹…nó(@Ö+PÎHOÔ¢Æ(ŠGÝF‡+:ÃWR›†F寻êÇéCOÚKuk‡ö*4t Ì"\ïÆ¸Õç$F- [S$®1êŒxãPé[ D2·`f#f<æn½üÒ±¶#N§;êrååRµ¥ÁúGQa(ycºCX,ô.lÚ˜ÐÄÕ–1WIXvË#QODD¦ä7…®Y~ »*â”Q¨ ]:APAûàŽ± .ÒVW+Ç‘TÑ€49ÃÕÍ¢Ùü15èšʦ°éNP„ äÑiäõo÷Ö†:ÃD°'Uü°s޹Wá¦àÂm‘^2e]Šž&µrT…›ƒå»ÂZ¹sÎ.f®! ¦¡&s5¦P`ˆ Øœ Î æ |EÜ+‹nœ¢ÞêüRsÅFVp² DzLs³ î€iÎ34·_wiïΰÖNê˜<Æ ö+…0MÆPƒÞ›ŒÄœž‚AH_õïWôß…¡”zõ—Fux0C¼'3?ˆ>EÝöJР< wíÁJËpÐG—Û@ÚÐÒTùžª¨&’8E—pÛ¼¾cfÏìU8-IS¦4aG®SðuÖw~¦DiÛo £pˆ-i3õ¡Ê`øîدc).í^`ˆ’P#Ãpà–¦ý"CÎŽˆàé"å ¶Î8j9ñÁÅ)xÝ¿×)×  ¢SÕ lØI*‡ÈÄGTÀ6SÆÍ%¡ÎÔ\Àm­,\R `¸›èËITÜëY ]ËÝgEïkàÔTªŒçô#Âã…'oµEžÎ }|±|Ë»å¨UIÊ9‹7Nÿã³`x&Ø’p>%c¦Ûª¯rܳ³–ˆ¨/ÚK&€'6-¨YÈ-²B Uð,‹–8ª¤syB8›Í†6éyͳ̆Ó:'òTÄ’1:b¹YßÚ/o$aV"Íw·»¬±^ÊÿùÐÐØsy‘ëŸø|»äfpÌ=ýÕ­7¼É{5Ú¨PAu8'ˆqPhiß‘;‚V׸R¬¤Ã˜K«Z1þNü¾(Æþî<•×—Çû»•X[2cIÑ!ú†m0JÕƒ|‡Ëä!”»KÅq¡\œ=­88ŒâtP’Ì]ç ¹…‰(’V*üÉ8Z‹Ì°¡”NÔÚh⪋­KÕäݹÞaƒú›˜í.¸n¢;¤¨ù/X¨åAeTíãyä WQKJ®¡RŽpYpΩGHDÄBî?y~Á ŒÝƒkaÔ• c¦æw”§hRü]k7åVáF#9,ÏÛÜ{¬2‰Þ6³òþ_,Fg)³9­åMÔ‚Úܽ¯Ž8’$ÃñL+DÉ 8ܳ uM÷+"ÖV‹eÍbÕ£¿\ÞðMÚ•voÛœîâX-²™Ñ´u 7®*—1Š„ž.¨Ô!#í¥žd¶ ]ÒlÐV 0‘Q‘Kƒ³tØ–b5èże6¤‡ªah¸x¶Ÿë!‹2ü[7J±+Š2†ïØB:5ŠenžôË-­ÀV`9°0LœD´`?í[;‚Ñw)ÇÙß>˜ÏƒÃ´è@²Ùû:§ÿ |xE¢\#qèÛQpâ¤IÄ›‹<ª3Ÿ)¹Æ‘b\P&ÎocÓ*Ƚ2m*Þ@¤9ý®hõ°c(“v¢¢×Z’áN$!ÂÍ…—ý·)ŽÆ¥Ã÷‘½Qùç¬Ý[ù®ÉyÙïΛ±´7|²EN†Ÿ:Z¢ED~qx(crtî}f &¢÷¹„â|F‹Ï—›>Ó˜¦YÚ¹’é«÷Çk3qPÞüí*õÁ0˜æ=Æ"­Â6w’}ÃÀqJŸÓÒ5uÁLÌM@©§@æ À×j*_N¢;!¯‚•àCª&"§;ñÆ™¤"K Ubëbô‚ƈ?Ò’a‚ƒŽ”¦NHöæÑTæ¾÷‚^%LRoÕL„h”§I‚a<ÜÿÔ ,²(` MWQee‹ä|-JLêÃQ©¨²H$(izÐUóýZjëI$(ƒ”ÚÁ&F|Dn+\ñ|€õx­ªE®Ãµwa¥§:îò…Š;"Dp.§М…J–§”5½šêòˆ•Á¨²R¡@;}†/hfÄ€¨¡M騍Kàʺîîjó¢,»WÄ/­ʪà;Ø÷Y[lDÙÞþrkMØ‚C(_Md¶ä[9Naœ%…\%T‹5%K!$'~°xul/¼°ÎI=› ¢Í‹S_yA:|™Ål!˜%m”ÖÕÙ¨‹Ò-r´%/‹?©ßòkг°Ì5T¡þ,ÂYdfšSsV0ê‡P©ß^ÔȤØÚ+qJ"¨ ŠÚô`a«²”Á;$óUÆê[ x±Iy»¢‹}qúc@m|,«™Áî2£¡ÇHÕ@#Èi"Ï Ⲫ´^¢‡UŘ3v–P-n_Ü1¸XM#”JÀ‰¿½d°¤=]Ûs]È%å܈V¯ŽÔïêr˜Øšƒ¦[ Ì×0:l ªV¶A`Lë‘ q¹„ÒðJÜrŸK¯c°A˜t]Ág-öÝò…Ó±Õc1RíBSœé¡ò^X#'`(¨zZH¥•£khKvêÚs\ptÜ$ëª': ÓÆÂFꃅ‘^çÅÞéÐmV:ÉT˜ìNÊ+x°©ÔLÉAÇš“êm[ÔâÖi)¼ad@¬ÏI¹ bgêÉ–x]Ó›NNïü(Ûp×>ç!~#aÏ;'O€Ë‚dÄ×P1£ $ýSÊ£ˆ«Ê%&s%:QÅQg¼|PОñœ°ÊŠõ”ç =(“ŽÜ”c¡\ðúÆFvŒ$nmùÄõšeQ’\~ͺî¤)i¼î-nO(?8ÃI1?sOs8fÅézb¥{ÓQ‹Zâ 'ÈÝK„s~™#®QJqþò‹žóÅYŽkµs/àOb›bÖÒÓQZ!|Swì ùPÓ/²V;óÖŠEéH‘ytÆê«-­àË,õÁ`߇\Xò{D¡‹Ðô@Wk7ûXfðhhÔÊ ªXc«Ñ‰ kýak/E-f‘¸™"÷Qt(&»Ø£¾…v½s0™< a ”0àòÛƒ¥.CøÑZc iAìÕ1PÁC9¬(qyzÏ+g'a¨¤pæékÎbë<ñiViq‚ÆN t¡…ˆJ"¶Üs ª~ˆ=ÒN”I1äXëtÝPÉÐPŽ“·¶¦–~oÅ¢kŠÝ`zûŽDÈ 0æ1&u cÕx6yœ' xe®éÖçÂp5ø›·^E(Ú…¦5í"M&8ÑÖ$ôÌzWÇšs(½!”Ö$xÌ:µ]7Ôm*¬lÈ= ʈŸ™>xK; câ”Ì_ÈkOhiHÌ„EˆHË‹:¸‘oO²î"-Ç&QŸò‡Ц+£\fpàrV¥ÐÞ…$؆®j„Ú°’Åèæ|Þ°IÊtrJŸ/v ÐAtº+>¬÷f j–#F¯SHTŸ™ÈÓB íœêÙÏšJøb)¶>¼´Ddㆨ»ðÈýâJ8Š:d·Ö&V¼ñ)/DÍh\üVuÊE÷ 0hÁò¦;™âFúe³rjO<%¸„(ø®²eN¨]Á껬B— Äí©æ¾ðk× °£ƒ™f´cwpCâ|»²–D8_ºe59§­®`É{jÁ)ä“‹¸m¤k÷\´'ß&‹&üI†Æ¤Rš,n¼ ö•4F(n¿Àþi{ÌFY›L% eÒÀê¢pe‘•uÉÎZi̤ÖëÚvþ’Ù<êpægó V?õDìFû6y/¹sL§2!mv@n)7'©ˆDŠÀr œsDQÄö=±ÊiZ$ÒÝêŸ+N5è¦ Q •×™…p €ÉîläÄ*8ï ,÷ ’vËÁÓËb-UJ6Õ¸BcÊöâÜ92r^B~ÓyqJâ€&D-Æhhþá.|Ù÷Hâ•ÙèéWr–£ÊÍ3m?ÊÙ)KéT¸‡pV¬¯–h3°‰ÉWªŠ+Ï­FsPG@:‘ʼPsÞwBm½F´] p–¿k¨^߀IÍà¶ÿU¨‹Áäȉ ¤ 4ðD!•ŒÒ‹Ç k/L'Bˆs˜Žêë”…_ º˜;/V•X™¾6u²ôHIÝ4¶åÝ%ëÁÀ ëŽ*Dá 5hz\¤¡ u ­=‡¤gMZh£Ÿ¢Éó§MŽY®:dwjT–2ÏGS¾‘òPàÍÀ°¬Æ\”4j74ßZ;ûal¾9$’W•> ­‘8ºË¬1?%ÅŠÒš yÓ”ªJUkòÄìúÚtµj—~'êû=Õª…UM¢a;¡´Ô‚\û­1zŽ#:Óö]?FԻơ!sXÆø3¿È¿è×FR¾íy:®‹,gÔžy‰›ß% ª™×ÈyG¿ÖŽQ˜ÒnÎyLêÓQƒU\U”úŒö¨FÂ[C$ZçW´å™Ïé(•þt .+†/Ó£º8^˜Öz}¢%ò®Á. #+á/9Ub¯Eú9 £šÊö‹ð]²·²4ˆ&<†Ž˜{÷Ôíw›Îø-±O]Xã‚£•wO5y{’¥§5”™â* m]»“þÒª24-¸ å1›7¼*5$‰*±DŸ–™?F± ¯¼´¥ò_“‘sL·înR Ò’Ç âå ‚C:x? .ng£±(MåÎbõ„¸ÚÑR«áæGÕŠs¼}¯Iº6ž”ÝCwOuj¡žÌôEí5ÖÕÉÁ³ƒ>@âMXI(ί‘Õ+”,zÉKra¿ôÿVõÜiæ*Æ/A øG.È/žÑ»«ºƒÏ«U¿+¼ Õ›«*“®ÿ}὆šü£@ÓØ­ ûb˜}-ž„ÔS’ä },o§Â¤ÚŒ{åV!&õYlŠäàÌ’ºvJnÅØ$­`d€}d¢¦Jc'h¹Ë5ÎMsDAB¤¾ üÒÚd‚ÇgK)W:çÃìå^¼”Ñ#ªCáe·Â-ɾHýdŒ!©í‘ØifÂç4|ÉAkkÆ|Pâ×ÊgDL`5—Ô2ôˆªVvŒ’ßMµmýŸÅ8}_‹±j~:ºBÌ=n-~I8ì5ƒ¨þ‹C9¶'µî¶ŠÊ¨ŽnûQàoLb>k¸C¾90ÄÁ'|5š´¢ÙaX›ž¯}&Ø{Æ“ÁVcŸoõEòKH¼ÊEŽÅúK”0Awbzá—é·ƒ½Œ ñ”{vÜsœ¢è}&®ÅÍ!?”}?{>Wó1Qè)´~¤¢Ê(\d|ÓØQrŽWòQk–lòç×b]ºÚÓÑýuÝ!b‹©¤ÆwfÙsç‚ Vž.ºÿNz¨i@âê)‡×.]ôä‚,ì/ГóžZÐ!é¶k Køú‰ýóDÄ3ü¯àšÁ°-UrwèNï7Zs×|l—Íû$L×Hª¬z›paÑAPRÞ¿E¼øóüoa#©huâÇeŽçÏÍ·(¨ç€Ä¯Ñ‘‘’xay"ŒD@"ÄdŒY:û¾À¢jGßê4ØNqêJ>á’1*î¸8YE€ –¥Gçú žŸ`ŽŒS éæ(¼ÕÙj–iÕà”oÓ>•Ù…g4ž@Øaed‹ÍÚÜ®&§wL4ÀâN,u3˜a0Ñ|¦}'ö€ËÇMØme{‘"Û6lÆë¥ÝúÑs8šä¤5ÎàëJÞ6`Ÿ &)×b‰*Y) 1yl^ÿÌo$×â.áS=  à܉Ó9=â]ƒ=NSêÉÇÜÂîT‚1’rAW'òXÂõ8¼þµÎ_\I ë«–At©,ই,@ÈÖ*_déUPÉ~[Úþ9t¨ŸçÝ•žý ü©žû-§ÑÚ„ïçïzTÔ¼ñ3 Ø»˜±99u©Á›HG:‘4ÁÔ ò(EÕÃâfAìnî ±¡T„À€)…–Ÿü`À7¹½ç@mÅÖë•_Ós^ãÔ<SµÌ v’îk0B Á¡+»¡=xi2âl–¦K_ªOe`‰ fsÅð¿©NÚeVL(Öó…½ùó_Úg«\ú¨&Ä9bò crc!›,áì.ó¡Ðb"„¯E1Eªt‹M|¥uŒÎ‘n(ä9±r;UÜšñTϵwÃU;ìœØ kCžíM¯»ÉÒ“«FQU17ÉC9ÿ†Ã~[t”#5àšõØêûI•ÑÞS‘¥õ`¼Rz¹ÎT1ÔŸƒ»û~A$Hß jˆ"p¤4^Šz!ZÅw”HG`´7ÕÒå;UId¬¦ÆW¿ÈÉßV/dÆ<­hì¼Ii´7~-Žs‚âŠE¤÷zµ¨×¢~ìÉÚÕrÔ›IäžR‡ò’§=E)&ìv¾º(±ýÊÄw~aeGð~¸ŒQãÔãÒœ¥Å)„` …|áPÝ“ÀР¢w é¸Å±*G ~KÃPNè3ˆ Îo ØÆ/5JŠÓ¨â"v)5‰’ÞE7¸·x¬µStÞ¾i\¢ÚÌ€yÌÉÅ:÷O°sN¡7Ñ4hÛŽaÍé¬ò9–é:rÉùVC@bQîšÞ'tséSÝiN¸{¦ù›Î(=µÊpéÑ:‰JE V·²ÛùÕ–à“i >ðÔµ,LPÇ;“ŽFUÅèQŒ p«‚ÏSp ‚já{¢4Æ"BKøa±ŒnL•LÁÔ7\/¼¥­n¨ÄÝ£àÕ7äbdá],CAe,ÀŠã¬$qÑ‚ÿc‚ZRe‰RjØ„†Å\ø;„<=§6¸[gÕÙOËóú‚1+¢]ói%ÖaBŠ·Þ1Á5¾Ñh–—€ ”Q )‹õL¯pŽËY%Ê$JüÁ蚸¿°»}-ô¡¨Ú Ã%&v͹ßtƒr.+[Lôˆ"¾ªOEv I'DT Ÿ$ÔÄ…ìYRÛ‚×zçR=°šÛO–"=ÊÚ–>ÉÆózhñ¯ÏgO"çu?U˜Õþ* ¬9œàh‰ºG³Ñ‹¥rö­Éo]F`tùÿÁƒIÒ0¯9Ÿ‹2/ÅéÄ=Å˱¢ó;5–[ÝóÔÁŒ#ï­ŠOÔZ¸ ƒP‰ÙLîÞµ¢i®Aƶt'-3³¡XOIú<â+qSÑ8M\¥½+¯ò,ÉDÄÇóÏšèëÔ² 寓?ê6XU«Z$ äÜ !¡ *Í«JeZ e#zûFO\…¡ аƒb¦Ñ§Áˆ‘„Z*üo麥¶÷òš¢Š•ìÛo)3¯@”_JbŽ ì(ÈD)ñy==ˆÚq}óÒ¼Ä6440|0άEéŠF Z  $1ÊÄi:”Jãd*åžè[‘6ó3 ¹äÕÑänQ}°uD.+é… @ž2~K\©&ßBáÓ:{ƒïù‹ñcÍÊñcãsV9…ö?âõ``¼Š©4‰( ;®’hb‚|^˜ÀÕ²=*ELÕB Š0ãŠãá^êº{,&ëR›¯bB‘¬$¨É)×T Ø‚“õYÄ2cqº…B%WVq)ãm:1ƒEŽgOøN; «ê"Õ>].èÚP]A-H _’KÔGG  ëN¹Š6þâÒËÑ´=žóÀXn¶Y7šÍIß`±è­®F5JÃ)òùµLBv5Ê.j’ºO9-©ÄÞpäŠÌ°*þ ëdT,Ûüö±ðãEUŇEaQ Yu+$ôž«­D$Ù 7‹À^rê¼³Ý_÷¨CK>Ê‘:VO*vjµ8mð„Cla›“}8Žô¹„i’ƒ«“uõËQ®\»É=÷&°òÆ.\^ðÔîléшO^¨é:×M¶¬érN OOQؽûÜÔŽAªÉÏÖ_ߎ»ç† òÊ\ÓøÛ*ûø±‡¹@“IVòFy)Dy•q,ÿìSÍZbaç!ï ´³fvB`”uaFpÁÞ{r¹H¸L„èŽpo•;.ÌI „K‰=@Þö•N ¦R€ÍUÎåϯ1ÛìêÒô€$3Jfw(fˆ‰~|jkC¯®YËeþKÊ~«BŒáÜ ;†ÇòÕUŒS'‰.¯Zš÷Å¡0'£¢Â|?*6<\BÁçq³Xæ33zFM_c³®vîâqoÕ"˜„XHá*¬¤ñ½oÃÝ!ç³ÃøPÕù¼ƒö'}kÁx¢¿ry† éz”µ5ðÝ-!IR©õi±Ïd¶',ºq@øäI ÖÔ$&Ë ö=¾EÂVÐqâ®_GiõU¥ðËqØxmNK'|£BÜKLó,µ¤J}@ôõ•y?ñé<†LF ‘ZõsÚ«½m2ÍÖO®­!C>qÔhõn•ï¡ .K§Ù{$ðKÉÇ1¹ÉšO&ýed%È!°*[–R+£©è*Y‘&…³«ÀÓ ä΂ üÁÉv)ÄXæ} râŒÝ2?ËGqRxó)wÚÝG,osÑ(-ÍÌ«7Ûò»îÂpt!"\”ÄÙ(·§V¯¬¢‚q‹Ù•Ó0 ×dbá"èŽ(ˆz’ʶäC8‘å#1oÄÀøµøÒÌó½Qþ*÷ ª¥9TÓ§ìi>¡ÑÞ ž#}‘"ƒ©õ ;aÖË @K,ëáÒOK[F þùäÄ_'|Šiú•-žHFŒÀR.C `µ ,¶ç0¢¹©0•߆³}®ÄHçŸ#$GÃiæš >ÄÖ(ÚîÕ·Z°7¶ö5 § R˜qßÀ—èÇüŽßé'~’\êa.u èp Ðsùž¦î˪¤àó¹„ÝfÄ•Ý Á p÷4¸ºW5œë•‚P”Ú$† †D8‹?SÙ±Œ¼žÜªeuÊ‹»ÚB7µ19ñlZÊ:ò¶u†Nº>K+䑨ð0tèXË’—au§ 3òU`¶3bcæéÔ¦×P+²¡(Œ˜KN•“B—¬´‘üÌjnkäZ¥5‹&­$Á8!ƒ¨(Î,¤ë;þå<V”¤/jºF®”î]ÕZÍQü¥‚[t²jÕ˜Çði¼#6Rß«x¦\÷“3³wƒ;˜@)ÂDc^¦ƒ‘kµ«BÚtR _‚z9]ÞVZ9V7Xô†è,®äïƒ N€e…‡¨2™¶[ÅQ7‘¥‘vbU„Ý”®›FŒ¸óTdÞ€Šýàô÷»ñxÙÔ3rÇ{“3¤e I#NïÑ­BAm-éžþl‘¾+Jr§]Þö¦Œ’ ê»Þ×t=¸Jk]«–'˜é¸CÛ¦­+ªÏuÅ0í³ÒÒob7bà®îꎮ÷J㸤«F€e/d;HŸmEn‡Sè”ãzHïU†ŸàÛËÐYº†O²ÙÙçHƒÚ|›“’tî¿ùÏHf!UóCvƒJ/µyÕa8?±˜¨AK ;k‹úù•F}ä~Ÿcá@³^Ìì a„\?³'¾°`àˆJŠ%& íÜkÌ,øcInÂÃŽ™ÍøÚóF;B–¥ Ø<>Ñ9»EtÎdCGRSÌç$â¶\ëHŽÆÅžlkèC ÜÓ™¼W2Ó°š*FÉ×˨H‚q+‘y±ï"ƒ¸g÷Wb,Aì=K1t»â”Ôƒ4ƒtÏq?äZXC¯}JD…ÄâïÊ·Øù^w‹ »|~%F³ŽØ³Ô'›ØØòÊ&v'·¯…hiîuá›Æ)©5?¥kÜ_H™œY&gGF˜1êª- séc3«8!xòNÿчI:[çuáÁ»g¤\¬òÕ’8`øe ñÆî» TJz6¯‰#TáäêÕBÑ6¤:‰Àã´¢ê\Ʋilе¥ïA~Q¹t¾Ùš_™ÿ‚¤*â!‘f)•Ø_CÔû»x ãw) lÛú’ljÓÚÊgôžIÙ:¬F‚ÞšØ$€³uG;Yhp-x””:ÙÓ¬}zÔìøâN²MT¢^}ÛƒUÆÉM"7L!üD¦§C°2C,Šsk¸äõúÌ= žB3@ÜÈEóãRÁ3k×8žßœåè„{,²}$N3+$”öáÁÅì@’‘eÁ⢼Ó0‹äB—« 0†â¨Žáâ‘$¾´~´¸ŠÒ’â¹:rëÕòˆ âåJÊsÊÅ÷“Iq8؃R¡•£ídÆ®Îìž%,F¶-™JDÄ÷ q,¶¶ìòªOˆ (cqA…Å‹PKX½ !n¯bcU(-*é+YÎ7•™ÃZo4«@)@ÈÅäïeˆ0¶“åø½z ­rË“ ±@fê:±Ëä¬*‹ /)†d¼:7çGq泿õõh?}‹\—ª:Ò<̹Y…@´\DëC”ÜSHˆ$Â2saœuE\–¸gkÞ ±fåg [è^×!3ã6‹A‚Æ(ÞD·¢1üßÂ7—9¬vVõæªè®•*cYK–Ç=1apþì‘’Þg¹ßרÄpœ&p;&bš-g¨py<¥W@=ÓqE­ 8Ìû£kQWQGáÁ±ÇœBø¨0Lë~igxÿXiIfNŸÍ°ˆ®ŠÏÉ_¼¡Ê ¼Ø°ðX+ŽÅo£U¦HÍ) pLæ4f£tþ·µÜi)UÈ¡3l«»!þHp,âŠ3¤w ­%¶î©!–_ ïi¶­ðy²”BErVÎ t3êY®ªh÷æLf Ã@¥¡5ôoˆÆnÍ=˜"nž4Ëõi²Ï TQä[Qµvm ¾u*V(dÈA.yL3ᘄ‚Qp¦q>VAv|è Ká .‘zÔ Ih`)qÆ·¾µH“­PüS((á±…7ÍÆõ¨L„Õœr¬ òÃ.,g)0±b:%Âú´ì—½>¤@1¦2Pxÿ¢^jBÂa#8®V> €Š=Ȇsƒˆ•ñ¢PzR1«ùGÚµ9¾k;YvoѸf’%æ˜g•1IUO{¡bgDB©Ðb‘J!¹,hÝ ô%DðÇÔË ¯ö̱~L. ¥ôε ŽÔÎîM£:è+'ÒL^Ž R2ã•Z/Ñ’î¥Ì¢F(,´|O+ˆºûy¼å®&–£p-k¥ÏmO%˜éwÕÂæÀl.Œ¹sÙòw"O+2Zyk°DõÓåÊá=ôY¤µ0Öʉ@Îeã€âÄ £¨…ªùÔ\o|âM6a…ª²Ã©…–①*N¿éàÔÈcÜ©EëkpŒús=±OYÖv^Yi7• MaåqÙxìt8Óˆé ¤Qhˆë^µ²Ñ¶æ€‚’F(©!Òoh#ÏÇsѨñ[Q™ˆ!«Ö©}*q‹c\= †á! Ö€&´‘þˆ]!Ýè¨yzc²þÙº³‚-È×}—¢ó'€—S‡¥ ¢çŸ7‡ wŒÄâ’ÌÝ…Zͬ 16ÑyÍÛó»¯";uøã*rÓ´¢gi@²t®Q†¯R'×-=ÏäÍ Ç‚™ÁÆ~Ò¬åëMWßV’q[ 5Ÿ{ÝÅwb¯Š¹€æP=(0rûUùÒ¼3 –},€]ɼŔ!Q¤¢Ô€\£ 5 ¼ipDñ3WÉŒò!Þhý(È1:<ê ASLÄðèÄ_³ £ƒB¼‹‘\JÒ¨N4×Úë¼i©JWÇCY®"uDº³¹«Y·¾ÒщHâòZB3RÊ^ž€²„Ò?j +@^IéöAñCIÐÄ•,1L•ìjr§ƒÝÞÑ=«C,Xjì©áØPí½Ä÷ÆP%t’BáL¹Ì%‚9R¡:VŠx‰Eõf´otzÐp•©Te"#(UõÎ5hƳ»ÄåÿaehFh uuçÞ­wН<9ecº€áoúg )—<ÍWá ˆ‰*J’uÒé3N†3}ÜÐÙP‰¹{Ø,9å›Îú§l´qQÝ,pPñ™¿†„]:OStóþ³­$ý…êU«^­-î/{˜–8‚Å^à5Ø0Eò+­@Që0>9¤QË#uÕ-3“©ˆ!¹Ú¥#)űÆxaöà23¶|¿sc!‰åsÊúÒ"¸ŠÅ9Çdï§@=„åY1—'†w‘=yÎC¬J k "ÕúÊ2øÑËàê‹™[Üw©JLî*^¬«a`y@í°n`rÓxêžH­QõuZˆLÓ”y¾¬®Æ" jP"ÛgÂK·¾QR8L@–'bA,»•©½‡Vþµæè¶9[=›þ|šŒd,#ƒí‹g‘iM$I Qšž‚»µÑÕ«*Za×i²2bÓ CÿÍ¡:•¤ÿ­gÈ =~¬¯tÕ³…¢*Uä'Æ€Uª%e–bBwo3mN Q ý¬‡oWº—ñš³.ËÇÎ诉A2&ü sVE£÷6.&ëÁПDüYø\¤‰"2àüƘb”‚¶ gZ½#dª?ûù{­¯G^™˜ÿ¼(AÎ H~¯ûõþày§é漿B¾ßQO6ó¡Rýš‘9ÔÙÜɇ¾\×ó}:.¾<Š!ZdÓì¼×er€—ûiÈѰûŠ"¦š0«Þ‘þHxRÍbLAÍÊÜÍ ¾#ÌøŽ#Ï¢²äMM9›§•Ž5”c óâ%"›C²9¿·æü4O« ÿA§ZcO|áþT€lÜ9uçÉpÅ·‚|aÛ2€‘ÐBM=<».¹&ß‹ÉÕ>ÈùŽJPª: g¤Ö'ÌÀ}×±bÚü6 %ü}‡N2ºqɟȃ¸Ÿºs¯¤6¦[sÐÄvâ­§xMSô+µëÚ²ô0âþ‘ c¾GjGÎøâ€_P/ ä|êGC&‚ѲEÒ\¯=¾{Hdô^%Ñ>7‰D„‘ÁiÚÇßI†›3¡mPõ€ÒÁ|Ií?@³¶íˆüÃÊ5߉¤øUûìèÓuMeÂUª9›¸Øl…2*3„Ñi!ŸA—yy.0^†÷–iy‚ER3Å¥J3ÙYtWȲÄI¢÷BôB”ƒàu Þ8kÊ’á3 ¼bU|›Ë¹yz•Qü4fR±ÓæºÁútur‡\!FÐÄ` õçÛ‚Õ,T•NRÚDóUÎ1Ü­Å ˆ¨Œó$˜ß¯9ö¡ÂïõµI58JîÆÊa-:§š¼'2ÅÊ•isÄ©ŠÅ±Gxmj(ºµ‘š.¥˜ÍøR&êGš]Ð=s O0z<‘éÁÀtT¦h³Ý=E’ª’©F‡d +œ*y&Îv¨…,zÑ5zS_Ê7ýøêPÐWÓ’"Én¾À6‚¹tÝæýsZ¤<Ž»ê\¿Q›¥ L $RÏõz?e`™( Ú²…b–Û ±ƒ¥‘‰?`/ÕÔ_9VÄH ñRjsSÆÓC4Ä(õ½ªb£HdR·0R4CöSéå5Œ©XeÒ&ãê—„R­l_ÛþÄPNšÖ¡T¬åËE´ÉÔâ#¼ö“ò»ä4¼ûEV‹ÐÕàåsïÔrk‚‚\hì\Çeøœñ¼« ¿ƒxï¸yZÓ†é•ým'zøùƒŒ‚Îv˜˜¼nÇŸAÙ³š¤9í'Bu`%DŸr0¼(ƒù÷«¡zÁê®4±©xãr¡¬Vš†bsx`Bâ.I¤-Rõ¶|ˆ­è•×û"ÞHì ê42’ªfqˆÕÒ¯X?¶™ÇZ}ýT&¥$i5áêÜq­S·‘•b¹H¦ë½TsX œ}d Ó#(Í]×Ëîòàf Òð-ó¾M„ ¤êæÑ‰qj“Ì© Ü™QSþ]&qps‘Fžw.&î ÛQ9r’­µ Á>žìWó|ÖîÛSÐ4'?Á"<&ìHW¶Ÿ¬NÅ™ËÙ`Ò9+Ñ?eQ‡ã‰,H¨1(&4ýJqñÐ8÷ƒi)rÈ3Ž4îÈ#!Ó¢~$dLÆÐXз=¬>HâT[èeø+B67Ñ÷•vô‰^âïQ2Ë-–\\Ôu‰»*ém3[<ž“„˘&bç|?”c‡Œbug‹†bl%-í’Ëë›34ÐAªÙÕ1\WuÐÛ5‘j†O¦œšŸÿrºÝ@DQH­åeóý&nhæL-×üÌü„}!ý«gxwÓ±hAѹ’•¡j ¦%ä”¶}ðuLÉ#ch˵—t;  ‰á]–‡&ƒ\˜}/ý&[BCðP Z]@‚~4!ÀgnsÒ‘.\ˆ $ýÔ>?öÕ°ÎüÊvc¦²9H‘j3ªD‰ËJ|^që>CuôŒônäˆUHt)­t{lÆîž ¬ç~“–\C%Dz⫎Ž1 ?ºBMãÂæZ~-H²¡YTÉ Å”•Ÿ|YswF³Œv™lR^™Ò(H¢u`ªKãøíKr3΋4-¶[R¼–?$¼¹‡¶'(ß‹!ö9lõ:…_gqG”0C}ÎÆ²XEæéY–˜)Š il››çjæÉ“;ÌÄ4P¾(ɬÁ™Óô’ÛGâgf‚‰ .}bÍAÈ®=;r»Ÿ‹Î•½Ué$0¨Üôòù‹¢NS‚BÛ’Jt{ qgQós–G¨µ¿Ü>œrÀø‹ æŒ$—>€L2ÝØxB•4Ïü#ÌàÑYʼn=%|J(ƒÎU[¨QaÕ%œ¾(?ü³µVÖ1Bþß• ‚ÿr|‹öh:_›—S‡My§^DRA:Œ¥Ö›²ÜUºÙ}Ìé˜ÝƒKPmn~609Á I¯w|Šª‹}¨U™÷vY8:b¬žÈ£}Ò¶)¹Ã8ì0‰Ÿ³OùÚAzbƒk3u abÇH“H²ú˪D,ÇÃJµP‘¡9%¾1ûiÅ0/ÇVãë•x+oRß `|„Ý7¤G;£¿J(ŽÕñê¬'ÐÊÈöUå:wN‡ãЕõtÝ ø¯€:HuüÑM‹““F‰ÅÞ‘B»0=]°”½Ç´¥iÅ18jK'..f/ˆw©îy±têI "1Ãà´‹¨öô…V0 ¹Ò¢X¡!øTókF tž³e?Ó!9㊖Pέ¤g{“Üô‘:UÐØ´Îá(¸B Ò5[5b€ êq 0º~:\RÅ©†š²s@˜p F‘ÌÅ”æ¹u é8³g FŒÛ–ÌÆ¦`æøµ+Né‚JÒ‚ÍTg·Ýx ëhqqp%ß Eó¤!hÓ4¥1¶jÉëËA/MÊø“NãÐ+ŸB$BG!…õÄŸzS¡~ÝéwKN©9‡Cñ&¼ï5–£ûϘ¸&eº¾N•!fuªÌoÄ:+­ã y¢¿½‹›–±‹UÊw&òˆç¿¦yfJ’ç"*ºŽä?Û›?Ž)ÐôÌòKp ™úΡ–Y’o&B†`ÝK£˜ƒy $v¬ @£i;­`?x|?ÝaÓ¡Þ7<îæÿöQùg0ÎÉEƶL ½5®=Í1Èös­]Ýk|BXÙ…QéäìñZIiÙ*Éóx¿Û›ÆÌVŠWs““÷Û'°šhö¸ !Š:µ[‹YÙÀUm²À læj9Zwœ* ’u­©L)´Ù0*ÚíÁ“É6G™eF9@E4΄ÀjÝÚ›U¯â0Åàs y×Éîô&áÇ3«¤ ©Ê ÃFŠ×8´¦…Œu{•/*­æÁS§ù¨ë [–²Ï÷Ó0æ·I¾lE5~µþž#w œ O»!6T«'³F+¡Éƒfg§4¿ê¥Œ×¾Õ=¥ Qq}|¯—2Ú»t.‡:[ï(– ÌeO3=fh†¼e•ŽJ2D(8"yš¸•Åš1P¢2q¾P-ª‚E“©"«mŠ’^ —%P#¼A Mwy¦ÌŸ†iÜoÏ5ÃæðÎîçÊU·–PUó;8/,ŠÉ¢,kóAÆ+90R1/Â%ü/…Öž¨$ô”œŽ®-°ÚigË:Žo8Qf{“¨·DtLÓ(æŠ ftG>Où©õË·„WŒv1È™[Ö¸¶e~ª—jÏ…iư)DPLôBax öóõæ^”4òÑ ˆî­ž¨ï•˜j·§-%9Š0Dö€#H¸Ò%2x:.á–‘"BŠÄAå‹á\rs’ƒEýáÑiŸÌ&³¥'ϽÆS Ô&ÁuÞÈójAC¬âJN€ ½B¨á ÎM•L„BéS¼‰Mú@žÒ×)ÉïDê â¼x¯äçÐI®êR4XZ.¤ƒW žC#…ã•0”ìk©Ì£ºR÷S»¡R òVâ\"ƹuÊÿ^¬¹µ4÷]4š–ò)@pí§Ò’ÏöºAºE=…fûd©jƒ4å<¼fáˆñüh ¡!ÐÜbñ¯ž!ÅÚ[¢‚÷+ã„’}¸:œõæàä·ˆdWVÌN(^êl†î ÌԯάæBlÒwžøŠ@&Ä«³X¤i&œ*xç£p†ÜUÓÏXS®«t ˆDãÒ—%;¼Ls„ãi_tŠwð൲$ÊV3(9çW ;×I¤ÝsÞ0:®’¡Ç¦ÌÞâ’JörßEòŒÕUfúZ´.iAÿýz}Ö:õ3ö6(yÍÃCQ!Øâ’Ý1ŒõÄ£nnµÅ,Íq,|V.˜ÈÚøƒ¬q<³2ŠBÎqO…`h«bA‰Êc¨Z˘B»ký4UÁácÂgA?#”+ŒnP©ÎlŽ jÐá§_{rêæzXç!h`ùÄàÕY¡3<à¤:“*–TÌ9æÛe•Šš”â^²¯‘?=d¢ÿg7YAAæ{„â‹RêÍ >½!Ç{U ”áð8gªO,UÁ9ÌòD¦¥e›m¶J!µIZ½Eø=¿Rmu@@üͱ87èÍ ¯§a‚$e{œÚo\tçš¾_æsˆ#ê<1T]B³¹Vè¨Eª–¡™r" 6[-h4©­&P¡\͉N÷ß2’Z¢ +˜¸Û ˆ¬1H½Þƒ‰!&¢RP÷T N’˜¼¡k˜C¨äÄÔ0œà±0,ucãÚ]Š:Í §$QGgVÕ¥¼¼ÏcÔOr,ïkÆÏ“ã68¨ljó0:¼é뙜íhÊm€ÂøM“R'’:' 5„ -WÆ#$2ÂùX#ÜÌtYp!ÂVvˆJ‡{ª%†¥€Rƒ,c—Ûiž+̯ñ-ÝüÛpvøv¬Ëí®˜¢#Í¡£RÔËg½H:ÀÖM} õ™ŠbWBuË(½ÖÅ[ssÙ%nL`töJTŸ…0ÖFb9èò}³=æWl)e ëu Ô6&Ar¢4Ì'×­•¢®¥a£jå§D5.aAH¾ øÂa uK),Z‡U»Êj;æØ»Ãºß«q¸ÅØÔ•¶—F3º…÷ÁîU¬$Æ @z§—„ÛÖŠ=Û”ÄXQvl¸}aÏô­©9Š6Œ6RêÇj/R0ÌŽMh:±Z>lÐg01ôµßf©çà¶‘›÷ƒÜ› ˆ1¡†Êåe;ºxRò»17Û†¸´9ÒJ% ¤T> Zà6up£Ÿ^ÑÁ< ê¡¥²¯B©%DPrYvÂûŽäk7ô¿äNZqämdË0:7JóQ•ö67)´¬ëO-žZ Ì5äRŠw—¼Å”t'HÞ.à€‘d[y*Ñõp¨¼F¹|*³ðUƒ¼ˆ”¸s;¸2àCR·P ‚1Y- E ”£ÂÞÖ¾°ço°."ͬ\c$€.g`Ò´‚BôÏdéíS‰Ø¯’ŠÚ¾ ©ô5n¶¿ïÏÔ"Ã=Hòä¦ s‹Âü¸Û(ªU+lÝ(2“{ÆeàóI އ‚E]Ѳф™Áƒ«E`N$áå’]J3t_CÝ\ïÅj½Ž)®‚Ö¥c >„ÛByIÂ.¤ó„.ntÍœKTNðõ¸×æP†.$TuË2“¡:@͉Xã Ž1ð|–“ζÞÈm…²lV3²-`ÆÄ˜pº‘ÉJýæ]jÔ½ÇϫޥoåŸAHÐiPëq9ƒ=RvQ¿C9Aml^¶)mNx>± †æÉJÎ/à©@mZh‘$Î »0Û»mèð«ÄšÍ) Ò-2›¬oCµÊ,¥WÉ*>Î'Ü3uC“p[º>Z=ݧt5B¦«ƒ¢_/jæñGÆbdñ…Ÿapî7¡™i1m©£‘ÒvÞçˆêå§w‘‹ £@£Ä:@ÁHg ´xÜm¤|›’•ñÀÞWjVÆ…NoTv™ðÁ‘Ž ‡àÚEfÚœõݳhJ—¶ö×GÝ/ŒØÈ_ ¯„ǻߪf’•¸Ë(Fx¤E%&x¯ÜN(èûZ°΢ø‡Š)¬¡[,²‹€@¥"/¥R=3¼æT ¡¡ $¤-‘»çëˆ3™úå¡ »®n!€ë0åXÊZ$X}j¢9,Ö¼ZLþ¶‹Z2WÓ±‘šnL‹K©þ»2öl»þÌ‚ì-ØÁoÉ @Æýi*"ù€‘hABaj 8®%À‚&¨Îg"Þ#K¼Ž,¢¬‹8^…±¼ Ñ¿©IbÕkoºÂS¦r4HÄ–ª'ZHÛ9J¦ÐyTxÜQ×IŠ=ì¶2ÏÍ–v 2¬'y ­wÅšƒ|Ò’*¤8ðs´eš‚,(6ÚÄÈB3Öð’*Vq”vî&‚`4–svt7xEä5Ìò âãf;Æ&a|–˜rð4ÂL¤ú•d×^ rŽpêŒà)T ‰ÂlòüÉ@Â0X„©œ_q[ÇÝ„#¿t—J$(ºô‚9ކ ’uÞäJU¥Ü;8sa“d²‡]³{ÉÄ2CÆHèà^‰0è¨ÂÀ¼,š_ìRuÂ5£*˜%!9Õù0¤JbΞƒyÿU‚篇§QÛ¬¥(˜a8rfˆPÂYCB€J6.!0'V '¾92/$0'7‘ úZâ42M¢‹ ,Uš*¡.±~‰XCýáI(ê{5wx_XÍPîÝf óÆ裔թIšx²ö mP£Á‰'6bãÿÝý¿ýšøžNÕÄeøn—ñ"3þ¢Ð…ënƒë" ‚€„¥‹¨„É*0îde`Ý)¡ÏJ%^‘$êÁûÿœoÍ©,þºÐØ,¦Ì ³è4; õ}3Î܇o(„=fÅ´¾†ˆé¶QÑf·jwöcDUæ÷ÇǤ(Ê"hÐ-v˜°ôÏpýH»Sž1K^˜ítéI ý}Û\GÏZ¥Íðú’RÀ† ³Š|ö1ÂàÉmóœù~²ÀlŸÊ7\G¶OL<¶Á¥Ï,u§ÎçêðêÒÞË„Yá£R‘_ ’5•ÝË' A–EoÁÆ=Ü+ÝÒè̼ºº=u„ݽÞïJäÄ©Bf›dŸÞ´ôaÀö§[…#wC–¯Ç•3o¯Ìñyž¯êÿb9B¨ƒ‘^JïØL*4¿è0͈”Ò‡$A#êKQÛMvíiÇüÿV£|Zõ>A MR…[ιå…ü,¹lØWå.èß‚¾ÎÂÉ<#1k`Þ=´ƒ)€t[“ü¥I³”Î|æâ7F„¬!=ÞrÁÒ ¬[Ü‘þQ™û—ÛÛãÔÓ~¹…È€&N À®ßå çƒ~óÈ­iŸØW×xúãÈ. ž]Ê·š;…Ø©úû7‰za)Ës0v,z·‘“yì6(α:8fžÔƒ#:UÅ)â'Zœ'&˜¸2øÇ 4C›ÐNH¹aßüƒ@”äºbÓ†Ø*6ë]´Ì÷þ¬se…ÜõŠRù8|Fxy3QÓ±WðÖµ¤õüD*)>'pع›ÂÌ–`ÅÎMÙÂÿ=þËádRÁ–PéÍI’ÿB¶n«¬Ó#2èFµ«ž½ž¥ r#gÃZ]ÒJ Uø·öŒÉ_Kk×ÑŸÀÂ`¶”ì%ìXŠSÕåÊ‚€œÊ×”ÙóHT¾Ÿ5WiÐ)UäwQ—™X«‘níYÛ½]¸òJd¸¹“š_h=úñðœtéz:¾Ú)ãTrçzŠŸsÅi|ÁY™¬+á0`þ§9Ö1ˆ‡Ð‡kEbj$tM¬ØíŸ†!¹üË¢ðÖÎa7 ”Ã,ÝÚOPÒúãœÙÃiÕT}g ]ÃÝLLP éa?”/º…¨‹™ú¥ž„6•›©…á2H2¦hÖußA „¥Ô\@êq¨;«…y:£b@ÙÌ…­BÜĽԂP#„!ŠnÆJñ7é¯ B;ZQN‚2JÕ¶Ö2Cƒðɧlr41 ‚éuôøœ"w]£pT¢R^Âóƒäi¹4©÷s£ ³²ºk ¹JyìQFØ@á¡úˆÏ»õ¶v-ðí#•Kœñ,´nâ7ƒ&ÁH²á­‘£µ«ˆ”¢Žõ%(ßÙ†Sªöç±§ˆuBŽû™ÎéâA)kR³aï­e´T`ŽÝ)%u}‚2~ß—É$IËÉíƒ1sd相ßn3M^)Ök#С|Á.Î'¼CŒ2ÔG ä¡d¿¨m'þsb£P¨ÁlS©½Ë«ö’´Ý3A1‘cЯɻõöhè¥&¦ ¨Y=€(—2ó“€=OšqËX&KzC¹…·øEW!\?z½Â£LXã”ÚÒ[ `‚qe‚ØlU}üá˜#ÞHñGL‚t)ÑPª®$5ÔýÒ ¼Ð lŠôÍbñJjÈÙöµ[ \$JÜ ì ì|Êoˆ^#ŬÈ8 éèáLµ`K#62¤¥sŸE>)·Ño"¾<Ýámàr£÷4çôºŒ.6q½·R:‹4­!ógxã8Ä¥DY í“˜˜¼"Ì‚Û!nzVõ«Í©1:wàm‡ÖÒ(Ž?€ÝEÁR$ô:Þ¸6u€Â˜t+jóí*nÕð,EÜìi›A=^nó¦£ðmƒ¨yB¢WÞø`‚Tãn8âŒûØï‚¸åäå%¡¸—,•òµt1ý¹[HñpsDb4ÜO lBj­e%“õÂ$#+f::ÿׄ«/b¨Œ4ÒbL=\ÂÄD-D]p` ¶‘$“.é`teÀðoàíA…L/èÌ]œ ï=S&ï Òꌳõ!v}ˆø¦!œÊ¹‹qŽcZ J‡'…ä—‰µ\õþQ²Y7Éÿc­â— ô²±L­ŠÑǬ§³ê?» 8"šÚ¤´éuŸ*Í{ÔÆÃátÇ íÂöǘÁ£vÏ J4´ðô£3‰ßi$ Ò¾8Æ+œ^³œ‰îPލò§6#gbèµ½Õxùy£§ÙbÏ›åc…ËNCuÎêñ7c'`—éôTÖªÕœ½Ý#“hª†x5Ðr?#¥=Ï4á"xÙ0\‹#\ä—\RÖ6ÕW¡Ø4XvBÕ:ä ö|ବ!: ‰¥‚v„AoöÜÚ M{}T^Sp•?–‰lúüÄ¡Ó.ÒµÖ}5&¸æ`¯²Ê‘„Èõ _—AòæI›»,’Å5†¨CËÐÿù& éÒP9©zëÑnæl"ém¥±¸-hñ|zc”ˆOì0”s Ä!V²]Þ"‘jÑšrA¬ä¾•‹‘I¼šPhÅ I†H¡)öâ­h’ï‰ ‘ÎOp®¸µSWJ¢­ &Õ“žü=ðûÔ0%·š+Z 8kq9B©Úh›.4ÒCótp¾¤iX4ÕöYò*˜LœÂ‰î˜VÝú„I Ü^Ö~Ì^€‹ƒÅ'_®R!p~`H ^£»ð1^ÎwØÛälû„]Æ!™—-ÒÍcûŠ©*CÉMÅ… 4äo~mcÛ&J·4áV­•›Vó)Æù,„ÑØ‹èq-²4SÀ.£l‚Áòñ…?3'QÿÎݧØÍ$8åùÝ3=Ư Ã"#‡@ºã,–Èy|ý!»±!É•+1 Q¿ ‹’Úä÷ÝŠDS´š@FÔ'ýÔ…Y0@œ«áÙÍÈex-ëDÝ`8"ŸÉRˆ}ariܼa#âÐ:ŠvVi‚Òõ™©ÁÈ&MËNWÚâÉ(e{¼'/©|5…ˆHAå Æx–äê,"’µìíŽÅ;™¤) ,ý¹‚4È#Ð×ßrÇ©žŒ)‚Ìèøt)‚¥îìœ}¸t¼“ËÁŒK-x…°Â1'¤ÀŒyˆVëP#3„(5#fñü_8Ÿ§\r6I¤·"çWÆĉáºIB8U…€ï3 1KÐÌF„£C)clhÜ*νÕù õV)œ§\Ã^57g®&*)Ë—q7Y05°‡Åw­‡qXâ5TÛ7ÌÚákfÖ:9)f"`å^oËÑâÉÂÙ‰\¶3lÝc§«;›› A‘À”j2Ò&·×|…¦wiÁaD±™FœOKLf¤²¾uF`t)VÅ7êSc˜$©¡Â1Âåø˜Q97q¥ ȧ¦[«LK;“ýýðÊð™Öº|¨”´xK¢0¢²ÓÌÄ^¢ˆ ›VJ¦.êó‡EKO:ÒÉqÝÁ\ˆpÔnjŸ·n¨’Ok¿…ªø9@è[ù “7=—–œANZ€˜Äõ®·ç–²À+dÔ~Š.ꨧ½–¡¥8^·ðçJðÃ>V™§6ó¼Ö³Tª夘– ~N¢X0D´ë3r{Œš×ÿñØÁä?=çF-khçsÓ´“àˆ¶…nóÔ^N0!2±™N®·hÜÈ9W­šG2S kxB6!à`aˆœ;âKYÑȤD8Á`l¸0‚!ñ+ ^¨ÁBLÊ‚\•œ„6òSjtÓáDsmÕý:¸®_ÍH,0@ý/åù0jƒ²4 @Û‚g±ÄZÜÃl”ç1F†Dó}4ß‹’ÀJï¹Fâ/¥N¹p±\âø±Ç39Fdá~océå6Q[½«9ä.ægBÆj¡aKÁAãF(DtéAï*zç0˜ x5k°KûäæVŠ>ê$Rdþ%sZ®fܳAÜOäu¸rÎmÑ2ÓW]¹ÀÁwàÔ÷úR7*° Pk:Ã¥©¼T›>0‡KÒqwÒ±X–ãxAó´eJ:bžüÑÜV0Íì&`)ÌŽœ8’âx)EuŸ»­²´AþÔ¿³0CA§ jGië ³d}O)ÁFÖh}aeJZPZš¹‚z"ZDÿª?ž Al¹p% C^Ìݨ5©–k¾‘¤*²§Aâå/\¢jO´ú8[Ô2cŸY>1ÐÛòÛ'BY®Rñƒ“A"êÎß)np h^bc§#ËËî”´#$7FVu#ŒE¤°y‰ÕLKjNF7¬›'‹ðR‰€‹"Õ³ KHabº²¡YEø[}3™“Ñ¢4ÆZ!eˆeý˜åêU¸^¹"Dí­J<¹,´Ð½–¾kE N¹3«Ñ,›Y{ÙÚPR ¬–Šº 1V!†HHK¿2X„M)ÌjKÖjø1ì´I)9 0Qœ{pc‰¼cŠEíCl¼ÿg™Dø'œ¦Öó#ç{–¿ªs(°v+i>Ü+$+ +-µ³Æ²/‘}ò·rúPÆÖ½Ö"vÜc½»4 Õ`Šñµç6°…†h1x=ã}¾-(<jêpª´-ñÕÈBXj2`Ì’¯&ŽäNáÂåg{nvŒ þ‘#Í–È—áãBPE>D™åHâàWnTÌLô%ýÜT&þ'¢YON ²<»¡Gy MB'O‡¿¨Ž3*^’´þxÉIYô“¯P"ÂHZñ°1œ¢™Oãv;$M'„æ©giáW­Kg9Ÿ*,BˆŠ–ËF:PØídjº"ùãßuiãŠB»ñq$6Sï'1"½’;’»mâãq ¿LÊÍÕ”’ŽIžŽ¤ø²Áv8üa×Mž÷’¤ÞÀ˜i|³;+»Et걘.˜à e1•r¸ÛÀ âa_™óè­Í¡]y‹‹Š·-ѧaÄúN:.³ÜþÛI  þå¨ÎÉ2Wt¥üqÿˆø6%rY+ÑM‹0£×¼¿ð£¸¥§©ÕduôfûÙ ¤†EDïñÒW‡QœªR³Î½i¬E ”c L.…~çÌi#PJÓYêÅ5 ÑBŒ§t& ÓS8·œâ%ÿ‰˜Œùu£(U±.ƒZ¸IûÒšFç B'’}ÍÎ …¶³n¥~©2}DP@+‚û¤ðA/ùø3Õ]ÂA¦ÉE'í½È–ºzd”. ‹={D°Ê.·t”!OÁ‹>(MFSàFH±N!­fxÌÑ€Ñ̘¹ÝÊòAºB_8¬ë”âypêÎråË <‡k\Õ,ãFæ\Žü_˜i#<%ÆõÉ…ÇÖ¡´l¡ç—UіϤa(O„µø½jËI”ö/»ÝüÈ_øeä\= cE ȇƒm?xÄŸÉKcß®/)ŸOÍœ´“¿ŸÕ%A›ðÁ"ç¥ëÝ×ÈÏR¡<ã•KsÄ—VÊ ¿¨qvt¹ÉÇŒDŸf¤žl¨‘ÄW3kNämJ¬¨TŽe æKxÊ$H72-+*XŒ˜º$樦FÉ#ÃOñ—\ncÇ6Ãѳ‘Íú<@‹¦”guKòó£ãt˜}söãp@/#RÁÈK2º†ÎÄ{' ™ÎbUUrXƒR¼ÿçš—úŒFZqÒ…[È‹ø„ݸ—›êã+nh†Oíø»æêœ4±Œˆ‘ï…+’CDŒÖˆ7©€Õnc¹8÷E5ÓúÄ! ×)J03m¥cÏø¡} Ú§ˆQ¹ÅØÅ.×~îhD•ço®êÐmd*-ÒâU“º…cGòȹMsK˜ƒRºÞ˜ã4‡ ”ú–™˜ÌQ!ÀГT;RD*†.03l¥ÅN ]˜ÒÔH^Õ*bìÞÒP `{‹rX¢˜üÞPØP¹l•²”×D ˆ]Šî[äY§ ›Ö0ãËT"¼šEq/ËË¡¬FR>b'-†H^QC«ïLS‰ÍsÙUòXëKÊÂ=CN€À¹z5˜â811ËÝ’|Ò‚nŒåJ9]q­mE„áD´#G@΢/ iegb+ÑyDyk„gF‘¥ ´žܾ3„”ËŽü)g51 ÀlAnà+SXy8 ¥,–æ+ÜJÅÓ;dê™<ÆË«Yº¢ Ð¦%gر9 Qú«Üî›ÎYxøØž¤ôY’(ø„Œ@LŒ„’bÊÀÑF)£ãD œ/8LÔüÝü~HëڼݞÕ•tQEKŽ׫“¢E%PÔÇsSAIƒ™!¼¼ìÌ6d  JÏ•µ%Íx¬ôÉ\(½Ï©*êÁÌË)@â-1¥%žœó)¸Èø‡wpfÚÉáõZòZ<¬Ü¤@Sáš-à§)PUr±¨®AÃ4ü A h©nÓâØ­ç{Âã|cîÀçÈûÃÈÔ¡¡¡XXe+Ȫf’ùæ2@ª4ºÕ¤ ÔŽáÙ’­)’ˆrv6a|°'ŠáÎ-É“hbôNÖƒÌÀÅè’C•íNlrRËè~(ÔxD&@ê»C X)<ìsèK¼ºë u!™=Ž#.AÁ³žZ&Ô0å…àϽ’ 72¡^j¾<‰<´„ªÐU”tü¾éC§“ Ôª2ÞŒNùÊêu?L^}FüÇ M}gN '/ ÇnÔ ’ðá Úæ¾¯Ý-n„4øfT•ôh€¥—Eéàåq|÷yL êœpDwL¬ya;+ê½ ÜN.š¡^¹j¶Äk7 ³$‹¾@a5Þ˜ºê[›a',+Â`7<ߥ“hŒÝ” äÍÈù@‘†jzÁÙó¨„uÌlŠ:¼ÁlttZÔ/Œ\ÁKÏHœÄÞrÔY‹Ÿˆ˜ K‹Åœµ¸%w$ª6~ê»Ã‚˜Ä¥*½Ò 9¦Ç!Pf±ç& çÅ©>`Òœé È–©IÀ+Äœd´ çÄ!Eu&îÉÎrP}Š¢†#œRxPà蘚ÈÄÚìTÀº˜r5iÏ`ïG_]Z ©º 9t h׳­á¯:CÄfl‰{µ ³AHâZ|KoV$‹f±êht—1ĘÊ8bNü5c‘fÈŨºÁÙb“¤’# 5ÿÊè«ÄEc<7Z‰‡‘G.Ž5jèM,ƒÙÊÑvâLF ”J®sD«öZåËÔ¦Þ7iD•·úÕI +›äe¸ûœC‰ZoœJЉaA—™M£;¶BzâtŒ›A´rÝbÌdª8ÄŠ7ZB I¿T#Hƒ‰,^¢%dÍ ãï_íE_ |Ñ^Ä‘ÕŨݲqrð.]áUªáÔ¡F ô±yCwbEu½E|bN™nIN½Ù$źOy˜HµÁ‡5˲¢ZŒbu!TÊRÅ£8K}+šü@×6£â Åu&|ÐP_MYó©QˆÓ7óRf!Þg'8FJŠPÄ¥yÅãï;´ôRéî͆¥ý5eÕ¯¡M-ˆÛ¨@ÿ÷ogKlf¸M]ZÔ¡ÆypœPÃÕáÛðœŽaXF5ü¹'Ì'”OšW-<¢„ _…çœñ^#Šq>¢Ï¸Qd9îT2®$"»cLh^¢É™v­a\ÓN^ðA F§9mçïîÚ¿ŽÁ!u%i ¾æ‚¬k;n)!¬â´J·cÓNZyÞüÍ‚9”Jî#¬¡y?¢ŒQM5uKõu4Ò¨p[Ýè­²VæÎA’k©½ù6KÑjʰµm~å¦"é&ï_íŒÃjBÓ€rVockÊŒ`AzT±l@™²¨½àšJَ̬´f"$…šª1eEsÑÒƒ›’xÍ ¯óe[¨ ’¾Hi@JÌ>RF¦T’ˆJÑã`nqì#˜Æ:€[[³¡iàrˆ–¤ 3£œÊH¡4¹$ÃYÈD8½@r] ȳždê9±{jê!%ÂÍÈoZsK¼ þ×ÿ/ýÖËOþoóÇî\v¿éï5죃¾OÍœìïÓwìXCßÌtúÛ£ÒH6Ý(ê1X‹O•X”¥TåÝ·ó:ÂýQÿ…È:ãböîϨN¼ä/?Ѷ éW¶°Ý¯»2n°9·æÇbf§«ØDæÅ\GJrwíã¾·R?Œ˜'ÔE -+?ØÐÛ«Ÿ}Å·7÷ö› ÿñTϱ@+@¡¡¤@oX˜©PPÈË¡ÏýM¼´-ÂcXIâäíUÔÌØ–"­ ¸÷%] ó_긊ˆ×ïï‹\; ®<õøô=º¬-´^BRø$î2Õ“K£“Vãè€B)Œ+êòX.I­³nÚ'F5§%@X–‡m¤K[RILÎPÜ÷飷ÀCý4Ôp‘$rˆ=r:Årž-ﻳ͡ ’÷Éæ5ï=p˜8ˆ1¼|v“HJ_!½$’øx´Ä‚BäÌVYyIúÕ<‡rKâhëЈM=š›i==χ'0Hg,¹ŒhHf:±:Íûhl»‚„ãF ”Œ äâîPtAîŠà£ਉ1aàÃÜS×ô?¥^}õåÁû7x’E).Ðû©S›S´4 E âгšºÂ¾Ïìø‚ {YŸÆZ† ÆzÊFá G4éxÌð¢ª9Ô\!å×Üò!:“Y1ÄûyÊq¶hyÕ#ÖMOŒZ:• §'LÝz½Å}V-]Á a'ôOê¶Ù‹ ë”Èæ÷õIMÞ?pL èˆ8!ÚלÄbޝråÊTæ©,‹ÐÝTP(S\º=ÚœܱŽƒuè}J¤®+ìN{EÄù8ïµVÿj, ‡Uµæp Å˜–¨Ä€wMÉ*šƒ4ú³ËqÃo%Òܬ‘„«ÌÒŽ¤Ë±¢TÕ)ƒT] Ô¬!¬SÞ—LºÞeÙ¹X³'WÖŠº© •‰EE!)H­Ý—XYŒPAÂç÷{$é%Ä©b…á¬ÜŠP2!Ñɰ–ãnªÀžWL³-,£Vë}äÄȨ̂ù–y RÔÂOT~QQX$ ôŤ{è8FrTÆ¥UÇrq3èN'û² @ßLÆÁN£éÎ(É’Â+JÙß…Áî㨚¦4€ääÕüã9ŠRdbƒB¤†ÑZ³ŠÑ(Íp¤¢q„^ ³5Œ!d($!aªã{*EObˆÌF@©+û”5>-c¿“iå$l[´®ž¹@¶õÿ‡y¸£!ïßdjFJC#£Àx#WÕE($íX»S>Ž ¡ªßée4?ϽhÐ=Ø –IN|{2óO˜ü.«u\PJÛn1Ô1i),Þx~)x¥sŠn]däA“ÉÂË@Ç•if[…fúz42ÇÃF˜G¢=ÚºÔp$ðc€=\’Ñ?”ÆèSúÝ:øµ‹ˆ‘1=_¤.µ=Wé9·ËÉ/b†xŠÓuS Þo@œ‹=såFNq™ÞQ%'xþ…ºþ r.¿³Rî#ˆ0ÒöSɼÃýGþ–õUUŸd?¨˜*»”‚@ öŠK ÙæÏ(Uï2?gÓ´‡è­'ŽH/ /ÍnæQ.:H¦bŽv…Z&ªùæÚÈ›UÁõÃBÖ>“ƒØfQ †¹ufý•ŸšÐ  0[ÔÜvj½\â‚Æh¯¹MÁ8±Ò m(° ¸É*º\›Ž*üßòìæŠ$—FfjºŠ4R7µ‚,Õ¤J8“„ BU¢bÃ6i7ÑßäÞm ËCÌšÑE¦ªDí¤ìÏ÷^*Ø* ÎYÇÂåàó?9Äw÷¬"mÐÙ';[Éú­×téF‚á‰k/” ›ëæ®i¹ØŽŽ´ÉµqP3¿n»áqˆ=lpp%ËÛM˜­R†€ V!Ǿ”QBŽÖðñðRÛã»Cw¿œªRÆrÿ|Õ0¿*hË—‰Îf´hŸ:P.t«û"éÒ„Á÷ž<”^œö•$Ñó»É˜âi/|4íæ\&ƒñVtìmÔ x›!föö«áÕÀ¤¿ñIâÊFç×ðL² [çƒ/l´¬&¯Áí{úäŸç«r!}W“6çQ³$IÇxåˆk?“’¶&ëlÃN+dq(B·Ru3拜~(PµŸ´TªL?FÀîïn£]pζpO|Î x] ŒüB4%ࡸÈÑ[(ŠÀ‘óµ®m7c¾8Ä¿[¬!%ÌÊ ª24Q|áñuíYŽhµ×P5 Bp¦œ×œÛ¢2½"$ý$äÚ*’– dpei¨Ô¾¢æ<Æ;ñ4jaZ"çŽÇSðw ÙF´s·{[éq~g:Ò_ÛÖ9Ò¡×Ä%MÅÏç&¼½ðÄ¢þ9!sÔQDŒ_ÏIh\„*("É6©èî"¼(_«†$*¸'¸Ah¿Ä¤ydƒ- Ó=×ò|‘AÖ+ ÏJŠ!HœÚê9¼šÐ£Ûù G_I”°ýu'?R©[{OUßæ7Ï «&¸ägÁ§Qñ®­-áüœLf+7™j™}æ¸Áø ŒºƒL¤óœ1GSlttµúYöåë5v JC’¿áœ…R7 f| ñZ!Ëã,©„îés¢zKÀë–ñ<ºQô™qêQ`â´C†rõuets©€˜¯©'ÌkF*ëR¸9ÌêZ5wWŒèžjRñÜ>öõD“»eìêáíÀØtH2·3X“œ×UÞ†ë81;,ê“‘ŒÙ¥º²§Eœ¥å\(Äq ÁÐnt²,ZyÉ&Œ'`ø¡GþAx|‚%=Á{Pª€¨·ΚF±'h¢­PÛýÙ;Á³âm^\ϸòøñËyß è¤~m@æï`ø˜KÁ«¤¦9!åđ̚OHÅãR Q®ð¢²¦mC–) ­!éÐÒs9»øRa*¯Œ‰‰¶‚>w ®Ë8¨ª¸¯›-PYÉ»¬dP‹Ù–©CŽN~p <ŠãÂc©ƒR¦Þ¹Ú8,XXöËÒL‹5Å×ø‰†Êw(Ù9òæ¯I&^@CFÅh qŸ(áOý²¶qwåñª9ÁX¹×¶œàb¯Z8“´h®´åIQåraÞâ`¯¬EÄf3ƒ®Kü¹ëõÃ\;ËA$§‹†gpeBË<`îS Ĩö‹2ÿ2¨ö½-Y[‚!| äA@7}Z‘éÖ€‚7qKD£|È(~NR-BŒkz¸ïÁfhhyœ…ô]¶6è´„ ŒtµYÅ!°èd-Ìÿ±W!BpîûÓ†ÕÁÁ,G%ß ”ØéŠñ0¼ÌXØÍ\5ßA(D8u):60Q2˼Ò®Y…úKížäm€Í/¹›â©"c†ë‚_–˜ýHÃ Ñ "žoÑ5ñ…£ŠÝšR{Ú­¹%åÄE[PâoÄ){ÜêÖjÐaé-ãW:΋—¦aÏæò KŠ“£‘‰›îêÙ©J©BuHèÔ¢O}¢C ­ÁiiEÁwÜ]Zìg0_”úµüOÖÀ_w:GÄo]ÓA¤Ã³Î50:Ö³ëRi‡ÐγZ 6—w+º±®ú›¦Z#¸TíË•¨X5Ñ÷¦t!#’Nb뤸þ¥¤G ñuÖŸ†ð3q=À‘W¬®n3W]ÜâéÁ’ñÁB1©p­COÿžq“o»BN÷8ªï$&R$ ‹hES‰"ôkV¬©â®µ^ŠÓœ#‡Ý×dÆ5†è³œZÉ`Á+ºÿG^Î mCÙÊtµ”á]JñôàOHœ„^ø¤ ‡Íåͼb#…†‚¢—½dèø|bËŽ,ë–ä¹w³â`ÕGE6P³tæ¢8A¦Î²(ß3=Ž6‡ˆŠÈêýeœç–­‰e äV¢:´/Zãrl˜gbS"õb¬->4æx®ª—<ñJs'œ"˜‘õ“yZ©xÓâ§©nö&–ã\׳ÁÄœŒø!Úã*MÀnT³DÞóǨ÷U¸9ÓÝÄ*ë-ä‘9JàCCqåHˆYÂ…áϯ4|ÉAð#º€ø¬eYö÷Áç©Pá2$<„[B)°`2žá¼ÚÓ6è&ǽRc¨G$©p³ÅÀM6¼‰¢AN5:~§zÎYÕ& †[†½`¨ãK:YÒx ¼iÅåJÅÆ'½ ϤÏ3Þ¡J3Ÿü–±ƒzu=‹x·7Ž)•Ú¶³Ä_ (@/AˆK+3°ƒýÑöRW§xJÜÆò/uέ8fÈâQ i4êÅ¥z#C³9Fö Ò9„éÁú&¯4ݤ™ ÜI³Bž&Åh\wdæ©V}í'¤ÉóÜJPxT¯k›¡iÍTÚ­ÂÙ6pJ”58º–1›k‹n80¥^v«±kIOö>Iƒ %"cÄf˜²°p9çC6!1º%™¦àŸz¦öUôœ©9DËB‰zÞ!ß$Oƒ¥_DÅ.¢”}¦!‚’ok&:tè§å ÚaÑ6ïT«d¿Z€f¯i(®“"˜Mðto¹2ŽþbÊ·mÔ«!i³ÌG¦ f1ÆäÈÙý€dŒ^ GMi1)–Ý/1“¹ÈBï {Ç8}ÃUȸ\ÌêÔ ‡;½á „ Ë8¡ÆåT^‹©wµëªT•¬ú¬üdƒ=žJ…A¡É9… •X†o„.1ŠU¥{JH‡ c‡Ú˜m¼XÄp—¸îQŽ !¡ÿ X›ÖwBÓÌ4s^Ñ8ÚZ÷TúáÞŸJÒ€ $6Ã79’Ò|#Û¾N$a7˹ý÷æúzQ«4Ò*eWòÏÿ5‡RI¸º£¬U’‘¦„tŽ‹¸A¯Fðö\sb¦ £äÍ·W£0o6w\YD›D“““€¶—ÂîÆôF[“ή‡Êm_âvëè HJå1ˆËÞT)®Â%f%õƒ}{üìA!õb;ô@É•¹«ÛJc ,}Ó1x¥ =Ôî·Ç£¿û¤ŒçŠÁgšMa{+æìˆsZ˜.É>ÉÄôûÏ êæA‚ mÐ5@H˜Ú€“BÐ]’s˼š<… ›n¨ÑŸæ§ISæe]H >¶ÑXØ÷$‹ÌR&èÎ2)C“‘ôx«á’­ ÷¼,'B¹Ý;³îÅZ•€Ð WyÞnƒóžp*´1nù¥t )9`»P™Š´OrØ‹"ª YGmŠæ€ ¬D.]44ÇᔼwÃÖ"Õ-½Ž”A«EÙ"(\]dªMa˜aéuª<T#Z.fûä²u¸´¾RM^r&‰uËÁÍG‚º#H¢»`*fâqvÉÝÖR¨¡PO_Ÿ:½•P¿ l&7“Ö‹"ðþ’¿SÓ8óâÂF³ YРz#v3Ùv¤ø‘εORüÎ Â!i<¡…Vy„ŒÜáW3>ë7±¼Øc?K”œkR2AŒmÕ:(…ö§òm–ˆ{Ad¤Í%#!‚Rw®U ‰­‘Ò|q«Vsq¢G »Éƒ1U2Œgr3±5פ‰%D¼GEôª”eÑš0z08ÞTL ¨ZÊÚ®ÖÕïs4s2Z<ÜT)¶ÆK ‡‰Åã’ßP&såˆÂfcYÀùrÎoaAðŽÑ‚Ý- ^ße7r í-ÜcMòMíi¿có—¿Ÿ¼µf,EsàØr|VÑ+¬5×·qÓÌ"¤O´*ò\êô•â]½dX¢§È¯á _¬VáÅ#Æáaªu°H½êP+‹p_NÐÔï˜Ü^Â-Z×äeÔß z{óµrM¢Å5¤OŽêNy#?«DF%ÄݪgHWWÐÐb…éûøÅöF¤Zv=-¢ÉŠZH×F-šIß=ÏÌÞìÃó/¾‡´ÓóG…{,>‡ÁÑØbHOfN0•]ºwp (R$5ÈÉz§3R 4’­i:h‘Òp슖×X[ŽÜ¼H µÃžLQÕ¤pÕE΄Ý)½…`h¢q(ÕŽÙÛÕhèÍyÓaêF —a(P²,÷kAдŠg“u(û>¼}Tî †­5«î¢]Qm%‹#hÁR¡ø>ffÔw±Ãn”#Òß©Vxª¼Ñáø ”)ƒõZ!½˜þ+­«ˆ-)7&Fk6ÕŽhè2$Ù Ü-µD¯£A ›‚!ÑMÜA•Ukb+¢…x¿@láÄO{+F!œ­(õ•ˆ ­*ÿ¡–Ö%ÐKœQÚŒœvª¿ŠXO5%áÔŒÉÄà ÜÊPœÑV–‘M¦Ö ²¨G&°ê $pklV«àýµ ØíP̤·®$á»Aõ¥EöŒT¦9+09Îy”¢A‡¥OûWÊ… âfùáýâW¹<‡è’»c ÆØ$tß wƒ‡ Õ´ç„çÔÅg‹B†ÇK¢ªÙhjÁÈ„—y×Q‰ÓQŒbwuÝKæNK:Ñ ?u&×hâDF-‰²_«9"ƒxUÒ ž €„=ǬDܬüô­I²D˜5Y´ô,ÿHN[ÈëFá ¨  T”a™×„Þ k; h>—Ö¤ÂèDLï=AiYj bóí™Ø+~q[ZJäÈ^§;#ðN˳$& ZôÆ]\.”·KDv%Ñê¸â“ÄZñm.œv¶ˆ*ïMJŠ—iÅÈ´ИÎÄ)GFáce†óBÁEºZc7ïž gÅ’WyÝçÅ,ÂSdÃÒÃÿÂU×ÌJ6xÀ UaI¾õ´i©k+= LeÊãyâI@˜ÌˆöôÝç@ äP¶ì¤O­·x‡ LqUÌV&þïe/´äv:5&j[œQ0Í £ ÂѸîËÉD]I¬Ù¿jòDÂ0„Ž ‹Ã‹P–[x¯'Im„•ÄogÊ05œ™’hÆæ•ë?¾Ì%šìü/ÿãò„<øüÄGÀú’!ðCàDÀˆx€ðB""|øñ €‡‚Âì!"  >€>l^@@;"ðÃà„CÀ˜øð" !àGÀxðbà„GÀÀHDÄDGÀ‚/b"&>GÀ€°ø!ð"ð^8·ÛHïðãÿ"‡[¨ðë0|ØJ®Ü¬ £ÎŸçê Að‰ô·Nx>‰ @ tµ‰úv@v/Ó]ÿ‹”¹AP —¿— 8åš3Ö£D{äO\*ô½›a·~OØÿUaý»T&—é€B=¤]ïö£Ð@EÜ”†jCúîd ç€ÎÁC*³»cM à;}®k\ˆ.å\d›*qðFF–NÎ,©ÌÐM»¡ëH¾Ü¸°¬=fÛó!÷S£j÷=ûWX-ú _qܬ0+[€¼‰BHŠÒî?‚³_“®¼(§K°wâ[þæDžcß*¹bG£^Í7 “Õ®»™…_ ±2ˆ-²Ž88Þ–Åð˼]Íðƒ€ Â&."; RÍ£Ô´N„§Mb]RnŠfÑr(€ˆ{ŠÆJýdâÿQû¬·Ç¯ÎÍtÊj°á™$+]—9«(Y ¿z ³Î\ wÝYlöív°@Íž^ WwÊÔC¡±'ÆŒ!"ç¡!DÄé8ÓÒêQùsxŒ`âÖ›é˜ç™¦‚Í! æ[8¡ã¥‘8†GáæqH‰‰Ð§ô^ÙúÂþ¦teÙ/tZ'[š ãÿÞ,XEØHØ»½rî­¸¯¯i;±O˜w,Û ð}3'¸÷Zê)JE.Ïìï Œ£”˜ß:£. Þ%Ï«îÁW/goÓ÷‡G@:1º†ìÔxESK‘A‘lD—‚=Ä€g6(5a÷±¹³óµYo‚å¶¢pwÒG\”±³6r¶FÑÜ0ÇîU [sc‘F7ÜǸ‘ÇôªL_9Vp-;›–0+FÉX3VqqÇ‚@v’‡ÌsÉV†wÁFäH@½­·YýEÓÅÓ* ‹y8iæ•¶MÄ´S˜ Í9Jþz(a=øtŸ`á¥vÝ%-«ãƒ7érNê'cˆçÎGÔ‰ÇQƒ#¡'ÓÅuàÇ›kœâ,kvP°ã•ïÐ…è¨Ë!Ô¢ÌÕp¬..½ÝEL‡ÌØ´ñxœân b 4Ô@-.©`´º¹žxI2j‘CÁœ©{AçPÖ;阸±)ç%˜¼©Ü÷+0¸ y²9µNj”Yœ4_M3ÏÉK=¹pkm•v‰ž6í âñŠ‹.®¯v¿ ¹;œj\ƒ=È©G¨d°›™b“I~ÍÔ86¦1*i>»Æý|9Ã哬/@PÔH…Á!+ÊøÕ¢/'“è>Z'‡ëQÀñlfakÚ1ºe\¦È{b¥²A .0D¨ºað»?“—+—¾J‰ú$SNZ›—%у«ûYŠ"éÆº(Q—AaZ>šÌé8ƒdFÐbA –7˜‘wEwb㼋´ ·÷ë0D·É‚ÅPÒhÅägj ( ˜D`ya„£AœÝ8±ÁÕla«[‰Ê/ÀaËQ§‚PÉ>¸Çúáù›ªÜ'ˆö%|èC‰©ùXq0µ~Ðe*LŒB³èÀ­–÷]ÛAøúu jú¿•dë›ÊO‚iÀ²… {1Û¡#æ„2"*ôѳ6Ò#'J€ˆë‹3$ÂHºÜÜM†N!V.±Nv¬±v:øSc²IlV¾ýå*”άa ‘ ßwãÍ±i݃†{²`]Ø„Löä4FmÓPYù„„jL¼V—³VØ¢¸þÅC?.§åGUfÕ¤Uâûdg¥êz{"p!šVmœ]1‹Þñ ZuåNÜœ¯MR[#1Òl»9 M³ BhP ¹2‰szO(vY‹ÕÚ·¼zÖ8e}ðQ¹O4J¶øÊÑè!†Ÿ}pê®±3Úò‚/Ê”žP…m5JѦAÜâ!^„î Â0“<”ÄæŒ`ùÁÑxÁ¦Ñœ`_ÔVïªK@4¹¹ ËgæÖsÏ&ý{™ÊÉ»ØDñÕ]·ŒF޼¢"q'HâŒjt¥ öhLèµG”hèQݸ$[‰žÔz\RBNþÁ;1¬‘ª÷£ñ8Yï ‘5Åî„vXÃég2i ÒAuÔü-@Ì]ËF¡s"Nm†’%tÑ/aGš1xX6«˜õI¬¥%8Ô&ªûR–´¤„ù»$ølዹ” ü&+çjé|‘Ó94‡¸b‹h8Üwˆ$Æ·n.¢Wô yNé^^¥/DÍ3Š¡2/ClÐxj‹g¤¤"œª¦ïNg2'ŠK ÷àî‰ãÓa¡Fµå‹½ÅƒœÚ5rJÊ€’sYp>;ÉoFaíÑ~J~³Çagñ,˜,ÔE¬j0S½8iuÕ›|CaXTp3(™¨”D«Q6Çkqì˜^,ĬN” ’€] áoþ­Ï®7šoÈÀ0.;æ™%,1˜ Û}b \n–?ÖºŠ†ï$áf4.Å@¨q~3˜ºÑñåÄáˆÏîTßYÏÛ\ƺ£ããË!¯“Çñ°•¤x›Rƒ §§[6:2ª¸»Ô¢_¼6ëÒòÆ&ÂQ½®ø°µƒ0C‡², -IÎ/£Ôä¼(œ%t ®Rq{Ýç' üMV*d~Sƒ?Hr‹ù‰P-ƒ·Ù»Ù±î@ôÁ„æé2MVsç@¾#­JŽÉºŽx“ÞÝèÄÜ9D ppž]8P$o,$íw ¥~¶^.¹¨îØŠ9…Ô<±z‹ÞO’À»i&©8G¯‡iA„”¶“ÔÃ!¡B¯QÙé~ IP…BiZýNž4>C †'ãÀ³¥ùóç W̽áÈAü¾¦€°H×Ï/!õ¡WL‚&¢m"TÄc?O a‚!lYÝ ÕMNo‚YHãk‰Æåyàj!Gª!©+çÕ=ã‘áŽÅ)>±“À¼§¿ „¥›f0 ¹ ×aˆÙrˆÌWlwI¥t‘ìÎX–˜T)œ°á€åmFÚœXÓ»Æüë bÑtºD—8‚%†Ç‘‡,ç+‘ÊJ3µ†ËÄñÌ9þµðøªŽÒp ^Z“‚ä½ cu…ƒa 8áÞ®B⃈IÔKGª¶aˆ;pëNí,}N,Ì[^ŸAÅ+Þò›»™õ¯/'úGe` ˆÍ‘,>𼜽sÃô´¥)³UŸw XLéj½!Rq¡)réˆ½Ç LÊ O)ÚBÛŽèø´Ð[Ücw°¯’JÅó† ã y¨—º¢ð9jQ"½óÃc7Iêdr¤lu¸¤ £T )">ÝÊUG¡{1M Ÿ„™JŽ .µÈÊ-OÎVì¦tŒ¤eöã1hPíÊ@éÓ‘°±†ÚÇA$ †jé,—4|Õï^)3w£Þ!CÅqlÃé·iêD5¬-z9ír¹‹ e€¼J†TB ¦–A&SíW±¹Æ)¥¼¤† (Î2”G¦m4eI†³]òf­}hÀÐA¦WãV”¬é†Ÿ¤ñ¢ ÎT;+Ša °H˜œg9í$’#Ÿ%¢ñ…ôòàS‰iý)䆯GnKàøo2'ÔC|òanˆMˆb()•%--?Rn©%B:;oÓÑÀòuº‘šг㠼+T%ÍÙÂ^'”Ä€žBs‚ˆGÓä\¶m]â¾åˆØ|¥lØ™œ,QÉzuþ%x~ýîñ¹,ž³#9«!ÈPº‘\ V)E_0ŸLÑ„62ZÍд.à*ÀfÊÿÀ’®Vr0äèôT }QÒµÆÏ &¤9ÝH©Ìª¼y¨S~—ͳ×!— "55b#E¹å“¬–‡~ƒ ’C@] v3­1{=ÊÎØÞ°z%žÖ„ZnÄR!r¡”Ò’&yß[ç,ûÚ³BþáHZ§ mŽ£·Ôæ*lïZwy׊/5XW©+»¹“‡@¥œTßH:êCÍ“áUâõ–‰ƒ³S­…œŒ+›I®´­*«:•*#$&õ=€i¬j<ÞµR°,åjR³\b¹VB ¸çlñÆâDá~Ö4»¨B(ÑCq \Ü–?ãè¼Kƒq$ÄÚ¥dr•€GŒt‰Œé¤{~G73S^¤,²ÔŠ6A~Ðr„Ô5G„´rN!¤†™Ó´‡ŒJïèÀ2l}Ó¡ ÏмõŠS˜0D—€(/W,h£ #Ùša“«æŸ€Èy›ò±3{ˆ.Zu›œúäˆêƒh Á'‘˜ÚBÎT‘í­¨Æ‘²;œx±([‡5ØupKŒOòue+j>öTŽä‹Ðf;è™ö×2=@aOŒNÜ9nz{qƒbLSÉéŠ.d:ýnç¿R*ÂHÌU5áe¶_Nm³î¢ï0¥éä’sYCHmL8eѩŮ’‰XZò8.·B}: ùeUf~2n†é"«?JœíùEjûEDRîìoT„¤GêÏ” OÓ‹˜ñyÎ’æD9'1æ`×ñw±2Rî}BhäÁ—‡‰œ-w„¯ =&äZUŽÓ„pÁ?vÖ©˜Ø¤”—5„±´–)WRž^vpÄG/u–;’È;I‚Hø$Ì·ìí&NxžZ–ÞäôÜ0v®VÊJ†¢ª®Ä]fƒú4‘VÉ„6q'ÒÏ|ÖFÛ‹Ô·––¨@ûBOŽ ÉÄX¡äMà¨àŽ®>’¸%¦.Q¨0Äñ—oT|e/1Ê%EO õ]ï‹ÚÑ€@À ôpýF‘ªz+ Å[­nrª‚dÌáaÐT™ ¢‹U ÎwƒµAŒš•;¬Ixê·{:4]ǵ–$A ¦ø»ÛÄð%Š+·r“9¥§Y4KŽJÓ¥eƒbeúuó%»lQäCJ¤6Æ—qãÈ•¤5(X"°Œì 2%y×T£?dø“ÐbLÂ,ˆ¼5=$Z~œ.PH¼Ã™ÔÝB˜›â8„`€äN£,á0XÑ p{£9„BÍÛº°ºw7¡5¯ ‰«…]3{9õà³:’ÊV[–oƒéEXA`4s:Ihx4\¡` 14H%'$鳆j±›©ðÍj+žÅ¯KZt@‹¤ L 0H!À/·!cõ¤¨÷ìJáë@PÀáFÄÅZ´¬š™àηÍMNg}_{‚Jt°Bêši®‘RÈ×É»^{ÄqYè·ã)н¤NöF6¦Î"³$Â>s„°64ˆÍë^2î•Ò»4‹’±Ð˜ÙfÂÈX†„]»=r1Ýa¸Á̳”$‚Îÿ[¤ûšW³Àñ3o±ëA2Îê <¶éX”໿v«0_l0{Ù†1jÇÊë¥e †‰§¼î†kŒ=fH à¹@ªô¸\LòrLl‚hA®E¹=¢ö?q°4c58ÑLv­&âTœ]®¡âÍ“¼å…­R„–´MɧÄÉ_ÝHò‹:úŽÖeð¢+ÇFž7[£ÉR´”ÍOx? (/©73Eû=Àæó$õ t¨0F‡0<ónœºÁQÆaéÄ/ÓIãx„žÒ."ÄãÃy@!s5@ÃxS7dÇ$®2‡¡¥Þ-Gß»I øÃJ‡!,?Š™Iºv̲ é†T†6·ƒ‘—Q–‚_¯1kmÂTªù1”’O× °’þèNKhjöQ¿KFBø»ci=Ûµà$9Å( ³"¨íÅÈÊVºz0Xï±Ó-ž—Äc-9h²°fçÈ"<)bžJÀ½ñ“ÎñsZ¢T3 EÇ,Ò¹P.ûÆ>ŸjVt›QQNã»O·ìÆ«!ÁøPž âc8—‰h%*¥m^G£Q¶ gº¾÷'…R«‹'‚í×>¹¿Õëº.aû«™¦Ó›EØæ±´:B™Ë(ƒÉñWqT²88VºPGØÜ3ôˆ!HjPD °5¹Pg504×1LRP•´y˜ jª-*å&éQ<C:!K7ºÙÊ,#Å/Øß¨$ŠtB9‚)¾ÂàO€»²ƒí°qCc ´sLJ¯×¯ØÓ”Іè|Ôà¨Õ¬‘‹Î­ÓyÕW4!¥k¢§Ë‘ …‹ *ÇV˜ìfØò Z­ÒÉlC°“Î:VkYÀ "¡–ç:ý£©Iìx¡iiïmµÜ±Ê¯‘„h®ÙÉúø‚XÍÖ¯‚Œ Ö ½k©!éc-®–!C6£X Jôãb)`íÄ‚M AþîéÖd"æ,Ïß<l–wq>4Ù.a¡UX&zFQw'¦ÂÖhöÏVø¹Ø¼ÀIƒ`göE¹«;‘Ϫ‚¶\<Ǩ«u C9VÈzÄã&Ò#BÏ·û:Œõ°“ôiÊ4]¢Pâêo W…fnênh£4ÛæŒ»"$tß­«>ÊÛX`x†º¼3c¹CŠ™ILEܪõ¨¼,êÕu©!€—ÛFòjCsg¶µj$Ø¥ RøÑnÌ„ÖÚ˜(®BoáæZ*p|¤þ„4Å ÀÌà¨@”4&ÀA…ê wΊ’”jyš+eJ™Åÿlyï%XÍ\Fù ¹ÖVÙcE‹`ꨰN`±œ$±Zb¡{5 U'˜Æ¶a—rF"øBËT#1 ”'B•òq+ F±Ä¤,ü+UtWzêUͨ³]˜BEÄäcˆMÅpœÉÒO ÛpZé›åBÛ¡ÛEákˆ´¦\zãv¤f»R¬tÆQ.ßâOÙÚ“øù¿‡ÇwWî¯JŒ  F)'†SØÂ ÷8IŽ’yÈÞÌÎi’Ê”–5óB¢ŒÇÞv¶¦ƒÜ)LF«q&µ_qp+ж·8Suª}Ê9¾Ÿ*ÁKHx2u45:â‚bˆ8ÑU¡ùô$l:9ëc.rêEÜðM±ÁFT¬ß[@u®‘•ÃÔŠ“ ·½ë€up÷ÏØÂ[½uÄ7î×rÓ?JvªÈ10PóÁ~]ôÏŒú¨Žºy@òàµÊy¹†Ò!dyØçW™$’Ä­‘J gwxéYUÕO|º%ZÀj9§ùy±ù<¦ú:’£Ÿ ë"¢(n‚w¨E!-Ú–7Éh“Ne–‹§I)mõ;SB`Ψ µ º‰cð»hQÐþaBÍæfv¸ÜZ¢•(&&Žº”té'R üÒƒî,âM$k™¹dµ¡Q ¡”VÀ÷,‘S~˾)+RØ 1G……kiºÏH jA pü£°FN÷c‚\E3Ã=ðû½ïvÒÃ{òg_2X¢ò\!Ï›K$$Eýj®„ Ñ¡)³Nhå²ÕZªæõŒß7Ò³´q+¹#ÃÊ'j4>ægWvP¦)P6ɤ£,ÄX$ر‹BGÕH±ÿâ.ëy¡ð@¶.K£—ð9¡Wã!òuiš¶Býñ¨OpÕ‰ŠÓÅi“ÕDù§' Ú­i ->*ääÖ¼ÊèáO¨­TA-”´bãTE5åOdÐó(IùÜ)s§vĄlj¿5~XÉä®SÉ´hP¢N?-ñš½O‚''”(iÕ(˜:>- \äŠEŠ„ö€¨é(¿x£ « :&N͉œúÞu­mÔë8$œŒdW­Mô,Ü͹Ï@¥¦bâ ˜¾ a,#Šˆæ”CËdH&‰!˜¡é§j*Ìñ°òòЋ;­.à@£Àã5áüW0ÉÁ@D.%² +:Q1ÿ³‰é7Æ•dÈ©ù™;$–åô¥  ¯„Ê­â—"íÑO¸kƒu´#lGt‡ÿ‘ŽPí˪ºO#°¹DLA'i–ÿ]"ç0¹ñ >>M„8§ ÷Oíý%‚Š¿ÀäR™ú„ºQ“ |˜!áÉã\Iùc´úxn¯¨ƒèí&bf”»üUÁÆ 7Ð$N”ZUàíPªHšã;¶µhµŒìatˆ ÈNoƒ3I„öFi¯4³¿ôêªâ»‹ZzÚ:Yº\W)Yò¼3xåæ»Û8Íüe÷®nqf~'!¹ggRì£C ĞƷE}‘Ó– 7ÉÔ%A -q2ˆæ.e9 $!uïh]•¤fs±"@†?Feh$Io˜ZÈ!·Êܱ·À/@ª¹›ôKÛ…Í%H¬à7ŠrEìnŽ5'¹ Ò2Wa””1!5€å‹œ4ÎͲ +šTëÙ[¢U´Oc×—¥™ØHc´™Tqe53ÊA\D â¡Å´r5ñš:ÖYL© å’º³4ìѵ LЄèKÜ H!¦2• l¨BT¼š¯´’ÒË«ÞÏ2‹´°÷߇qˆ›[LI@Ñ û!q¬c­rùÿe²€IpšTê4ÏË­-*q wo¸ñcBñÈÎs̘ØEh#<72º´Q”$@ ù8œ%BHºæu¢ˆ ñ·¦o=¹Ðy½ÈÁæÑçU¹¹BE§b¦€¿FP›²k@ŽýZ’ƒp ÁÁЦ†¸õ ¬†ÔS$±Mõ¥¹ätñ»…µ}¥™÷ÏQM!!¤Î’s Üy‹ôB(Èy¡9îÛ’öžG¤·Y3”ç™Úî`3yÑív¡·‡²ŠO3C§>„¬‡1ê*ŠH g“~éþ%¹ÜgkÓeœ3ÓC8YtC·Ûn´±$BŽa+Zo&°†øƒ½8‡º<9·$x-NœãQTTÆUTIðhn<¢•挣!îhïë0i¹Éª¬W oNÓàÎÉÉdxBÚòôàKuÕÔ}_¼EηûùÏò½qÂ]oÂÓe ‘TÛ%iÌÓyéS»B btè¥=# 䜑bË—=^mŒa­:×hùË—˜Íç æðz/9†aeìƒ\¤$A4«!’A%qcÐá‡p鿈-KÎ -Ì­x˜ ô… K• R à\*éÌz^¤Ž¤_žáWuMˆ>Ò˜9é ®MÌwÅ£LV²ÅTÀwHáBKƒ©Kq¶ïÅLDPâ7ÇãÍrКÚÈ1`<èÛ#Ìñ „q\¥V• ìט-h$À2öL®i+Ctt ­\]=D÷(j®’Âk`A Ðü^Á|Þ#º§’l4Bn)sÌàaˆÆp_*ÿ‚¨ªDWµ®J]`T”~‹“¹²‹Q¦I«ùLMGªÙ8š–\ñ7P¢¨´T§öНKhÞY“Eó É0(7„jËìžrõÔÕX¤¹['&¸©³§ŽœƒÏ&ð%*½—|•ʦí±Ï'T2¤`uŒO.Ò8$u|J«‰¬0ÿ<Çy)Œë HTvgÜ÷ ô%æ\ínŠ•†Ôج¡x†‘Šõ9Š»RÜèq‰Õa„¥atF#r/Ë• …ô þÖ‰fUÔ è‡h[~o(Ú<”ãðë§Isg*)B”g 8ÉÑ[mðŒ§Þ)Û~½]+~á´ÌØ•§xIø3\ÉÓ%5w ³ç®˜€vÓ™¸k™„ ê“ C6'©æ°WƘ_Aƒ³S€(nØlBÎ…—þ6tlFâÐÃBNbÍJ¦óôª`¹Aüi0óvˆßfrÜÓdã\œFªóœÊÃe‘”Áš˜&Ý!©U»:A›]A23ÄðPª8'2tDtæ3t8l¹\-E²8Z?Ëbè»BvUÃ,¨9k7ÙešZŽC:£Ÿ “±YüXåG¡{ÁfY\†rˆÑ±X¼Ps‚³ ‹Om›r|¿¿XÉFZñ߬» ü‡xGh—¿1iN‘—MFmÉD‰ô“DHg2$»TµÔ®ôtR ¾P¸’hÕš8RV7%GbéÔ¡]³þüÂÂö…'œÑÙ¦GÁˆfË„žÍ®to|6( óÑÎ×d0<àŠC,æ›[ô÷{ìë\ˆr*—Æ¡Z>øÍ4þÏftàiqª: jð´P Î$’Á¦ìVÔ›MWæõY«ZKku6‰õœ$%ižQáIIÅü­Køet±PÐ ËoAQ’8Ïw¶ ™à[%ÀÈ]”à*æ×c°ùÿi­­á²ìužÌ(äw!p0„nwBÈÕž ®x{øðÁÃÒÄN©r¸‰Ò¢&ütµñxÈE0¼äŽ­¤W>0¬†#;ºOP%ºÂ°d•4¤Ý"Á{''ð¡Å¨ý(b¦zÕ_››B²sÛÔá’E²¥žœ)RƒçÞ ·ŠLåG¹qYXà³#p½&*Ô5æ8IaŸGNY§ýñ |ZC€ÇvÆ]Y›B€÷höþ­®¢É'«ìùj|V’œÉç o®Ê‹ô¤?C6ÔîºL•Z3 ?Øe7§#XMP3² Œ”Üe%ì_#2• ñQó£üžñgä+qÁ•Ò uuDUsÌ6ÐÉBt; Ü‚*¶¿´ŸÖkPµgh-€E¯×ÁÀWì×ÍT¤CMk •F4„ð Çe|· …cØh»³ÔsìÖq™?Š hFåW«›—+¦èŒ(“YÊ:’Ù)!¤KQ…%Å!O$9^éê“>ñŠý*´‰ÔóÅ9ö–í™2– Ž'ËgÃࡦÀ'în±žãW¼Æˆ?ÏS¯v^Ÿh”8Y‘nö]=ð•R³ß°÷3mé´3àC~ÓZf‡f¼|ÔïÌ !hEЃœ‹Nû™¡iýFŽ8å¯<š9Е_Z FU|»W”Û¤§RuåH&Ô^HÆ&±YMÀ-bÔ3}Þá R™NÒ«¦Ùq ‘™Ô£…;HŠO=¸¯â§T8LÁä3ŒÄPPjE…Í>»PÃú3•Œš®")Mî …Þ÷ W«Sƒ#§Å#J™ÚÇZqqpÂ+á7„ÄÚÔfÉ;­ˆ!­­Ñôsó·…‡Åc¹>jÍÎ *"!Ë@ îP$”÷u`. óÝùRá'<ŒF×O4®«™1¡¥låÔ€…IÍ“eÕÄõœ-VA“Þ®™4HÀêñ”x{¬3©˜( Ú—‘´êg‰ÅÉCåˆÂ‡ <AN:¬B/(·+cdÙ¹ñ™ß7{ég¥*qÛäü¨f²T­pbBSq9(_i=íþD¾õiuVŸÉ§Äá¼°c©wßE§^`#tW¬ðêÒÒ8ˆz¿Jšg˜Bñ½`08:½{ hŒ¦„i4‚fnYÏwIê|3˜¾Ç–csa¯Ã¤€×ðˤ(ŠfÑ­õ;„ß{)º4ÚS‚áíT\j§B³YB£¨<Õï°×™:«U¬#iÎo2éŸÆ \"hìÇ)PN/A±)‚ó[Ç8pìJÀSðjt9¤"¸•ŒšNt8-ÿÝ™£—ëî8¯|: F¢tŒ$¤0`ºPÆÍ­Â@ðË;,qâ•H]TI„õY>æìeP§0aÅòÆ+òRKÉÕ5ņ9"e‹ ªòµ2\ ˆÅ‚¬ñ1Ð8 YŠÕPÕfÅ)ŠO¨¤æÙòg;™8pN¹ŠCØÎBìas)N‰Íê5uL®UhžF4Ý¿/p¡P§º$ØÅ sJQõƒŠbÃ`ÏZŽ£É˜ÕñvFË‹ÝÍjÐL”®÷ä,NŒ¡|V"3`Zª©9fœdVü‹Å´„Ì2q¶²¶Ú”ª\Va ÷qazZó[Ê!ˆ;P¾íiq#¼‚H¢ƒš`Êør™"ÂØh^å⩇^q %Jï7d 1™k9 XNÛç“­#<ÂEˆ(l¡p)Â))Í¥²¹¸lû3òt3-à-] †‚Ô¶.ö‹ †"Âê‚Ü&ŒÕ%ý#e¡Ÿ#’éØõdÙ® ­?àÙ¢o6¼8¼X'u*JˇŒ¤}ªÌ§ršNšc¬VÎ{˜Ð-ùçý6Šòn,´4é kf¶Ên{Š`ÑÙy5òҶ‘^LiÚP{?Ô½¯BÞ“&v2Úæå‡æÇ “²Ô{º‚½Ð ²x%ßJ±ÿo@àzGßcÈVÕ­lñiJ;H«+qz¹ðjªÀ„) û*7W e±ÌéªCäA-šQÖÍÞ«ó§{±®¤\(0¨=ÚEGDÀ¢WÉa¼Ä{b¨âg®/xÜË_œ¹„Z‰‚3L!™ ìÕ”C#rп7µ¤ä *AHphÈr( Öþ S,œÆÕÕ•c˜-¿ô`ÇRÌ(Vsœ(Ô«Hc *PX‡9VÐŒfÀ0Ö†‚çJ•Vˆi2›é£<ßt£˜' Ý×x;¨ÐïmJk“À+&ÅòŠuîPˆT˜^âÂWêÄ0Ž>båpz½•“®±>žâ¬T"ÚÊnÌê„<פ g V¾õª­%ÓyÄœæÚÝ5lÍ 7BŠŒ»Ô—ÝÙ[ÛA&ÔdÂGÍÀO²œ Ö Œ8s…ª¾7ßz´$õàiB+È?¹ÐXä–•dÒÂYÈ©AŽ;Û'Qàƒ©E›yFÉ)ùU{ÑÚ¯­À–Ç4Äo5H¤XbòG¸´McÁÕ„,N’n’TBÒšÆ5|ãøÔlÂS°Å ‰Î»(¸\A´2¸#…è÷cf«Gÿ³yÔ¦øœöIÍ.‘Š•Šb³Ý˜Q¨!ÐÍôJ©ÎAMŠ}ˆœ.Ç0¥Zr÷r³Áásfk*Så‚o«®¬‚¬F ‘%ñ 0’¨¤Í”Si,Ò¬2‚.'ˆoJ˜*Œg‹lÞÀ·zÓ'Tp^ÃaƒFÖ+­k`EKû o:‰cTâ¨9yÆÁ–ü„A¤b[çËìªñ’¿½q@€‡jªÁà_½ÊÅ6-±%«Úæ·y"™ `Âù,$I}u{0&vÊ¢‡ÁŠFÑÁ½@É]@¾‘-ìµÌf¢CÓ:š<^9mÞ€î@iRâªd J`+f‰Póª®îGBt‘D‰î„˜â©+ág¡4Û­¸•¸ˆ7niŽp¶ªÜç™ÝõàB"%jL¹õZ ÀÎ9VSˆ=ì)qL†¦ÊO‡ÿf0oz¾=Ó”ƒx¢=I-0; Íïó*Šºãˆ>²™òža6H¾Jgåge“&04·h³æˆ†(­hü¤ #~Ì9œ‚\ §eŠdšÐ ºµ¤mGºñ‰–XãÕÕ„+'F«˜À DcáÚÇ!º²b·¥Ñ°µ’UŒÕÙG XÙè ;ÂLúTÕÅXÝÏ¢ßyÆ_ÍAﯳPe S­ (ƒsžU†/C¡U“®J£ ?Zº•ª@ί©ž8Q؈,…ãw¢ÿϦœžx£Ñe6.F̪:ôÿd; {?ƒ˜•¶7ú[ÊBœÊÞ¢i~wn¯õ¬i˜†ù8V·¸ÉDZQƒ„¤–É ^CµšÚÜb-§Ps2ÎD?„ˆ¢ñ8Ø¥u ¢L‰Ÿ‘SAGA]#«ÄÑèá)¬[Œ¸š¢aÅß? ·~Œò›eœ&Q¦”ÂSAOè‚ØW‰bf`ÌVšìAâÎ'lJº`Œãjm(<á˜Í® Føœé¥gYaÉ:=Áê5 Šá³Dÿ¿Ÿä²©?@SÁr`MɾÛp_ÖsDé¸|OD|~ý¤ºà±¡ØÏ…-V‹s»3Š081”†Ø¤½ˆ:ÙRÕv°Ù(,×ÑI‰>T¡¼Í–$ò|}´Òn®€4(ŪŠ ÈŸU&ŽlQQɱș;¼ü"ÐÅ sмb¼½ rÖ\ZìàÎIÂb.+PntÔÜ‚¢BÔ7˜Hò3W?øªå¯H4æ¾%LX^ªt,Á½+ùœ°’H\Ôâµ°«€lDH-i’ÖœåV„È%D%PZoL 3y¨eWÔîå–µ0È!ú&p³ÀóŽ¢jñ›ÁÓ4“çó4!¼è~hµ`'éLc IçÜî1?qÌ7–„ÚIE9qÅO¦DЫÁÖ·C':…F PéÛeC7‹‚éjÎ$ø³Ã¨m&#‡ã! L0‹Gß’aì6æsG@|C¦É“]ΔáeA1h³u•š†¸%'Öäk£N_æ6G»˜$!q›Œáså o->¶ç„Æ{Î[)‡ThÏ„–ÜèòZÈsH?ýäc¬À‡xº´¿á[;–M–GÁÏôÒϰ…^¬0Ë wãfh†»Ì£õ¶£ÅÎsSÅÒ*ï¤Ý$vØ]‚´¡!Ÿ"‚çY… ea’A¦7qŒ)Qª”žô!{^DÁËlRà·ãâ´/ÀÌmb}ã|é™"§¦€Äö0Ö½¤£SÈÌë|:ñIžmbÚØ00¨ð÷"ìp.¤sÕ¡OÀßÉ2÷ZUõ7ºlìQì˜+ð±ƒNgø@gÆÃUÿ2Ū)WP²GT…Ü»~xÝE²-iMY6Fa7Ô¹’¬Ù ·}"+KMG"‰ç¨”µPÀ Ò8 ÏÉÄÒŽ‹:hµx±R<@œNil¹ܤlF'Š0­&õK… µ-¯„ å\ù'AÕ­nåD*w*«, ß»Ê>Õ¥eU j/Ð̰謷”0Ïý>›æ“£ô;‚˜Z.¢Z‹Ù½LçΊTŠ ”©z:„¯Zd“vrn…Í¢DÒ2ÔæÏËþ&Ëe¤K·mé)ô6êÎp ½"Z%ÀÂ'˜ÔhŽ<” ö“›ý…[+é%,Ü—³¤hÖª yrjÕq :±Gú%ª–Šn€Ž)§.r^v„³*YV+2h£òÞ3 EÍTµÞuˆûóCtdO7X/wÆó)–b2Ëâ‰éÙsŠB(Aê ;ÙtøÊ&ÏÌc ‘ð¦G0ngŠUUîcÙ¼×0ã-+>v„œ)*‰ì£(¹éü‰´m„HDÖ"G¡f;„M­5 «¦!8:*$i)Éñ4~+7?*…¸> 8S‹M R)¨ŠŒFÑðÅè¦e 2"B»‚Xô“TÌ'2­`ï‹–6­&þ§^OVô‡Do¬Ö).ŽUÁþ"D‘tgÂQµ’MÞ¹ÆOÚQ…iEsCHhIûìi3hµÎyCÖñaX41QI$BO'œZé¥ õt2©$$‡cצWëqé¶mIÁÕ¦õi¨ž •q¬8DCQ¶ä¯áDô¯ÅJ† ̵ŒÉF½Ýa…£ˆ2b²T<©Þ’×=RL%ºäsMeDÈ.¬¢•ƒx¾VŒëŒ¢Jë^zK #«6´ïB´%4¡»(óJÜJ0˜Ê—) ’Û¤ƒ«àÒ³urZ}îö­ÊáyâM– ¾:F •ýÚ’ÇP|îR©Ÿ#{ìá ÐÍЬŸ#â8-(‹¡ÄfJñGÍÔ%TBU®ÐM)Z¤¨¢ ò*ÝÆ%¢}4­¯Éœ#q&¬f¤šæíÊÄ-T‹Ê„ærHËGNð$+Ej3¬æ…¨÷ÀÔNÓߊž}w-jç>2x22¿œÑÎ ZâüXçYæIEi3Ê*OwtŠh²k¡ÜíJØÂß7œÖ ”RtABdg:€d$kqÁPÒÕsãcl7sà1˜1Ò{ µŸ¬@›™¤X™Š›¼T™…ˆL#oùºƒžÒ¥Ë¤ç}­E2ì7#Tæ·¯I-m#„A1XÊ Sñ¬jN¨Å‰­²\ëk}ÚPàC2e污Ó8L%\š¢9Â@ •N [—²sɦð^j¿{˜¾ wÄ#I:º“°/H3:hQ}f!†Uämf#xBN¥íf°Sqq—ˆÒ”’aRd¯™dD#Ê ³Kjؽ#FšgIàéFÆèNs’™¡ásJ…ãtà·*W&¦úµT°‹Ú(\e‹§AµÄ^.@,\#™Y'~ òáç‰F2ƒÜÆÃ¨”uRŠ˜e¤`ˆÃGH¡ ³…¹Xðˆi¶]æ¦SÍO*LêÀÎRR¦Ôâô¼àp^‹pt‚J.’ÔfldR­ŠzÁ4¥ˆµ«ž ãP&”Ÿ»‚€ÑK5ÈÚ Ò:•eL v:Å%1 ÉÄ謒‚øÑVÓ³ÞD+IƒÔb0|u33u&ò€Má£ä@bWÃ'‰>Ÿ½Wº³‰Õ&hÓL- Àcgpó­uªiÇ1*P³«—­+§9Œá£4µ+!ͤ®+õóˆáÅ:>¸|Ù»‹·:\2ËbÔR£e’!¬‚%a¤Å˽”ÎV'®eD·U{©å 69o3+›Dtõ„ˆVºTìNÀQȤj1Kܼ6«'e à|AçÜi.KYÙÓ9 $,Œ˜£µ±p¢OFÚ­-GÛZ'g#?C‹ÒS}™¼eˆ¬0~!Z+è4-Ìn z æ«ß†²*ê]ï¥1X¼)B!i©@'—ëtÄ„¯YÞÄÓAC…€ŽíbŒ&ªZ0ÇäûA¨E6¾fZ+ÂД"ǼòEu+8ŠPµM˜d+D¬È „è’ŸtŘËIgÊP¹=š H(÷dëv–òEîçd Â2b’xHuxÍ€,QÄ.úš™aÃNƒ&u"nBrVH t†Ü]F¬FN€N‰´§Ä`ºÖ¥¤…°hœ¢´>Ü­Fà&­…ÛÒ¥I@c¹##qR$ Kbò1” ]Ë`¹Le#DSÌ*ô"°¶nj€TG5Ò´I£pÉi é8âáx5z™{…³³Ó$4ÃêóÓ;9âXd`Œïè¦hþÇ3”Üz¬ªéoU¤&Ä¥HMð£0¡ÈœZCÒ>gaÄcXÎ#†²Å™(ó‹£GÀ_g=âÐC´^ĺXk=‘u2z?x`Î;Ì­~¬«Ã¬\šÏ•é«&^%HÞë”pÐ¤Éø–³‹L“ Šý¸h(ÝAî³=¨/¢ÑÁŒZo‹Pº'79]ƒžÒÖ¤âô¹ žDµAÁâ°±0ŽB…i½áõq"Ç4-ÍAË øt7®°No€0ðaa)9\vY¤°ÂB¢l¶oÿ«eÜ\ÝM|æùç>«^/.UUü˜K-Eqƒj ÜBçz’,"”¥àP”QåŽ`‚·Î]å,±ÜÅöMFkM'x¤Î É-UzÂq˜^lžiQŠIp™‰«šé(MåÈÊCfý^¦ó^fy ƒ‚‰\¤X›‚1¼Ÿ&æŠTÃÕpã¦YáK¢UJÏŒÍëaœb/5œã¾w¼è®'JÑà«)X_4–¸ÓßÔƒ4ca7šÅäa J:q7ÊŠVU]Ɔ€]Ž€òP¯C .˜ÐÑAèzzô W^îãéò½€èé€Z;ŸC•R>Ã(‰ªë»Fƒ ÙÝ÷5¯A»^Ý(-‰Ô€éÎÀ݇^žƒ¶zYÛvÛi£®Ÿ{µ[g¢©Jk§×§¡ iG• õH@ ½€¶ôètvë¬ëP]fsÒ€Ð^€»57]Úç[v6kLîÏ¡Þg»ÍÖ4d(i³=ï` i=‚vv³ÑÐ}=o±lIY€=tFû)OMyVhÐi÷½ËÙªkví¦åŽŠƒ]–m7gCK`]ÕÔ a£n꺻´º÷Œ<ƒîÞ½¯»ÞÛo]Ú€}4÷˜éÑNµM©@mnÞî^çQÕQK½Êèz¼Øh:Ó*4iT6ûŽ€;Ö+ >ž”žÚ2¶>ûôÀnÀ»( éÖØ^¨o}ë½}ŠëWÝ«q¥:/¶vôë§Yt;±®»‹6îç]ws@¶îÎÌj­»mP»=>Š_@@Ÿl4:70¢ƒTdmsÐÐzW ®ƒwrìDvà£vç[:nŽ[µ­¶Î±×A½·³=Y6éÒïk;ÛÜvÁ ëugJ =Œ«·¹«{s«yÍŽžŽ¤Ü{Z­e(t.žÝêØhÐïcÕ…Wf…:SAÓ@×­4OJ:hÈKB»ïp {Ì4c[žç^(õ¦¨Ûg¯N/n®:ÝÞñvuíšïrÛ¯FÝ´îéïz»Ý­t¶ÓÛzU*—°®nêtëFíܸîŠ4 v/{h÷½ÉtzîÚìV¹/w (¡ï°9‡@*@ºÚè;·\šÈ|íè[»»n­·wmÜt;¬»+ès°×­ÌNßZ÷²C££“´Íµk·pzÞ½W:èP³×§zÝÛVæ{Ú{=¶‡Nw»·¹CÛ5£v½½wD½z:¯tm»‹°}o^í˜k í¶ë¾Îž½·×tñmn¯SÚÝ»¡›)Ïw=.nZJlnÒ;°¯»Z2o°×¹G@ò+;wsU÷{½i»¹¡·º»×\:ôRî¹K¶­îz/{µÑ]³¶4ÖzÒöîj5C¯³ºû}ìÞ½Ú(/uËÚŠÅZîܵ§Zówuêöë{Pè(7›Ö»Ù] 纷oC»Í˽Þõ*÷ºÙÒ¤ݸtQÐéïe^ÃÓÓUÞÍ ôЧ¾ŸwÒÚ‚ö-« }lP¯­§Ñ¬…ëmv¥ŽŽ•gË®{€{œãÍÝÃ6ݺ—GJvÞÚÛw®­Ž©è]™ØÞ÷ŽìW^÷q×O6½Ûy{ÝYÎê€ RçLîZÕ³#––µ.Â+Ó®^M°ÞÝ/;kÕÝÏvçfÖÝw=µ =í§½‚î¹ÇuœòÛ çq‹¡Öí†Í1SÛziU¯@úû°÷Ûë'@öÁô@¦vè^÷;Ùœg/{Ü=íé¹íî]à]Z(,ˆïaš×bÞæm¯[Þv‡UYémîæ½˜ lfºrQëÒ;gG»ºžÛ U˜-ƒ§=º®s½êô³y»ÛÍÛ´÷²ó[+×v ½{ÙØ ]ÜÚË·^‡¦»ÚlÕ]¨µ­”ÞÇ;zw½Ç‘µï^:iÛ·¡— )Ý‹;”:[Û(>µï³È{o_B–½ØÓè ½˜ö³¤ìë=Úâ€vî/Y§§½¯{wAë¦;u»tëÙïy%òËw{{´6ó‹ÝÕí¶¬šÇ®Û®µïsÖ-êm´÷oZTw²Û¶“Él+Û½ÝÝåyײ¤ë»s”Çl£Ï{IÝZsݨ®í†´Óv:jÌI¶mm:Ýì^Ú{ÛK·§@]½ @ô=fŸVÁEٺêsÞkµä¡¶Ú©¹m»“±wvÛÙ¨½Ž½ÌïVô×{´ÛÝ¥°{nïszVzuÐu¥½Þ¥Ó»»o{¼¦µ» Þín·p·nSFžU»vV5ëÑ^÷·½³º¤Ð]½°öÕîò[=Ìë¥)ˬ“w+›Þïw{·µØ[u£Ö½÷pÒ‚Ù×Gµ‡ =ê€w·ô}F—n‚9©_\‚ÖÓíï{mÕ :ìïw¹Šok«Ûžž;»JvÞŠîmžî Vö÷–SW°Ó-îÝk»ÞyÛ›NŽç{Ç/^´v÷zìÚnž^]Oaî™è÷ºè÷iw¢ŽzÞöÖ½$^gJ]Þ÷]ÛÝêÓ"èÑì÷µ¯D#=9vôØ4{{‡¢®`mÝ o`t =:€ëѽ¾ƒÞÅ-š÷gEVƒmÝ÷ õßc]=¶µ 4Ý¶Ø mözn½Ö6ŽÇkoojÍ7­v½¹ Û×k·sv{ÝÝÏvom]º4ï0t¹»n=z½ƒ¶È\¬ž7]MfžÙí¼–¶´¼ñš­v°zê™®ÓÞðrîÕÐØZhu®Lº®v¨èR¨)Û]g­UÞnŠé{ÝÕo1è7cQ]‡yíq‘åܺ÷mê/{ž…= é’ Þí[7v;º'²ìëfͺ]íÛ·{²šª]ŽžìsÞnëV×3sÆà;ÙÞÇ»zé6»ÛžÞ÷·c×{5×»ŽÎ÷½êì4Wv+ÛtÛÐ( öÊ hk »Pw;ݽÓëÐõUõ¦ìÓ¹šwÞõæÕ=vbµ“NEïyà¯u‹ØèÐ÷lw^áÖ’×›jé¶tSzΞ‡tÞÍé;ÜyÓÎz^÷¶óµfÙÞ=ÕHyjë¶%··={níökëîè÷±èëZ¯OB½ ëÖíòó¯^.ñ¸t¹§etõ]ï;Ó]½ÂµÛ»ÑÞ½Ô§nWk·sB—ek¡žñ¹µît:u¶ÀÝwVޮաMænî–î”zÔö=PQ·uïrƒËªhvcÞ«Ó×ugC»º¯z³Ñ¦‚ºíìôyPô¯@îÛehzzk×^vk×jÃK³M=Þî¶:©%(= ÞÇM{¶•èg·£½½{o=¯c{Uè.Ω@W»:“{Þ¼··eÖFìâ¯ug 5WºïG’v¯c“F[Y·wm—T.m4Ûr¡žaÖÙ]íÐö÷gj×wwg›Þ»Ï-î÷¶÷{k¡6êær‡`×'g§£N÷ºw¸Ûªö8÷®k »uÖØô³wWmÞ¢´iÝ®Ôw»Èèméîïtè— @hë ÖEwoG¥^îîÀÚýæãF–Vé=ÞÏ;Ý··^{¶»Þô=ßXûoOm{¼ëÝ­ÐvÖÓ·{vowj¹éËšÐ@tÝCS7¼ðw¶M Ô©FÛ»¶¸ Ò…ÝÁ³tï`zöávÕ݇«¬ Û¯B·yÏ@Ww™æîk¯tõ¯{µÝÎã¯wwwrõ{;Uô;ÛÝ÷z÷»Ï.öçTÛjœØtîµÎî{¹Wvs¶·pzèí–SÜö¶í@(½”ÝÀw·…@¥{Úöì]žóSÈÚÐǧWw¼tÞðuîž÷9Ñã½ë½s»×O{^vVë{¯[6ïvû¾óoMÍMN{^ÝÎlôo£è=ÙÇ\‚ì×TÜÆív¢”úëÝ•ÍoUw½ê+»nw¼ÛÅÇG^ÉÜuíêêz÷³BÚÐÏ{Þ×'šÝØn=ÚéW°¹‚÷ptn÷½íéžµ+G€=ت5{¸6Ó:kSa tŽ]6ÝìÓv.Êô=ìמí= ì×—vzöõ½×‡·{^7¼/+ÍwšÞ®ó½ëf§fö w·±¼gœÏ=íí=ÞஞÞãOlõrÛÝǯ@]yv÷elîÞ«»»]˜–éܦ¹ µ;¶ÙÐkw»ÔôÝó›ƒÞÛÏçnË=tïqÃÁÏ;Ûxëyïo^ïG¼ïu:=áGªSÕW¥ÛÛrV»Ù»VæÓÕzÖëƒÛU»Ï` æ'¡¦æ PªvÅuѶ y¸oS¹qëpï{½ÝÞžnõ^Üåhìì÷‡[ךáÝïjÛ{ÐocC¶zïKÜ׫·½¹ÞíiïmîÜ{Íy‡¹Ý-vÀ(æ÷î­[Úº4àtØÔØ4«u‰ۮ÷rµÛ=é½ÝÏg½»‘œ{ºznî©ÜŽwg»î8“×AAÞµo`öõp(Æ‹·v4OY:4èêAClŠÓ@F®PéC×]tͬ;ÏsÞÎ÷ ÎíÔF(íípõÞö÷ŠÞ×s1ÛÖæ½»Žì°È=æènmØ0˜÷u^Á½ž[Üê5@§­ }àúRB„‡M÷Öãݼn÷—qÍŠnÞïn;½ÂlP5ÑA¡­ª »T÷«¹w`¡íÜ®÷¹^µ£*vtå UP Q¡ww€}Øú4ûo’&·w8M©žîÍ–ó³ÞwUƪÙC×zî+° vç@ë¡ :×'GN¨^«žÀ * »ÑM<Ð:+®yM·{Ù—¼Ïww­ {zônÆïn½¸ÀS{èht a +B›mH¥S nÁ`tô=:ðj›o{·®ÞžÏq­)Oln{  ì@([Ð †@j†¨¢‡ v4° t­ +Æ—nÅ«à×{ö :of†Ì + ôèô€@ô: P@2í€ÛÜúêyõ½V¶À7°¡èô!é Uµthèh h F€h óÖìzÑAÐÕÐn겆€@@(wœã®Þà(‡TÑ­: QGwp4ª®€nÁÐJ:Å×®ŽÖPÐäsØhP šÈ £­.À¶–Íh  C@ ŠPîÀ:hl6À+§N†ƒ@ Ð •Oð€€MÐ@& €šM¡ÉèÐÚ§ê @i“&‚ Ъ©ÿ€@  h4h‰¦Ò`zAˆ&dh 4›#C@¤Ú &И#L4Tÿ@ Bbi1¤§¥?ñSÕùOS*oTý)ì©ú§é“T=ª~©ê6PýPöÂOPzš~¨mM¨Èõh4ô(ýPÐ ÐPÈhh ª€a@  ŸªžÄSýL¦h¦OÊOHhóTõ=<©êl§“D=OSÑ”õ©=G¨=!êOTQåêz€=A ƒÔTü0€ ˆ˜€©ú§´§´“Töj§íLBcžjŸ©¨õ=O)úPzŸ¢(ýSÍIíP4(A<§¨ÙCOPÓÊ <¡äG¨Põi =@"§à@A„M4L5 •?ëˆóxÿ±ÿ`˜CÀÙñãÇÿðCÅÇÀÞ?ïÿà ðáãÀùbæˆøcþp€xÿÍôÇþxøÿHCÀ逦>?äú€?ú‚òDþP‡ü±ÿTCýaðÿ²!ÿ´!ÿàÿž><ÐÁx!ú?ô¼éÿÝÿÞÿñ€ÿùþ™ùD?üÀ…ãýpÿóú`.ÿ³þÁúÄý¿öBGÿíÿâþ2ÿäð>?ýÞ?ýàÿðð>ÿ”DÛÿø‡ÿ—ÿÍWý¯?õ|Ö0ÿ®ÿÌ?ÿ 'û`?†$üF!à‡þÇ€!ÿ²ÓxéÇØ|ôÞ?¥ñý‡€‡ñáâðý €L|xÿçðÿQ䈄@ à#ãÀò€ ?í€ÿûˆ„<Üñàãà)/Àˆxö¿«)€€0ØãÇý¡ *^Áà<ô€ð¢?íõ‚<„ ˆ< xñàB<(kÇCÁˆû¯ñAñB*ÿXˆõø!.Š€€ˆ0„DD?ðxð‚b BLj‰xðÃãÆãñãÀx<‡Àxð À0€CÜÜ÷=Ïp Á÷÷Ö¹îfÉŒ0 À A¾¹z`ªèVÞà–{Ÿ¼"ýAú~È~Ç€üÞö|Œ<~ðCõï<À¼ï3ú|-T%?_%}‰G·’|yxW·’’ òø{#Ëfü<…;|åñO—“Såäñà<<|xð"áÀCÀxñô>„?hAHˆ€Cö¢Ï>ßû7þï‹–<‰µ)_ªáô¢ þºÁ€ö›ÿp5!oý¿õ¬¬SÏ…EKÿߘ'ÿë÷4=@qʰ\¨{h{äÿØti Sÿrì̦÷ÿ1g"oýÙ!cÜhA° /ÖrÄLZî\ÿ/ƒ_ûWdÀ9Å -øÿè¶9ŸþðfƒfÓeqz¼±â A0 #qü ÿñ¯ã^Õ¥V…Øš¸=ü8SIe.ZgÕ<‚$¢q€Ýº[… ÿðŒÿþ¹—ÅE|·Ö¦xà^øÚÉÿä{‚a\q¿ùÁG  ÿÕ¶ilT½:ðº&ô8‘ÿà¤Ç¿ê‡òà`l…ÿðäâ‹:†ÄKj?Kw3<üG‹¸X®ç39z+€Î/œ£›d% °áPöã%"´”Ñ)±Ðç?þê—\t åøÆèèssŸù.ÿõ/6^= •8®JÂÉMåEDl†êØÄçåe×µî1ù‰Ñ¥/ý˜Üºk™6Û. üz)•ëçã™(µiðè«¡›«‡Ä|þךëTG¿Ä<ûט¿‹R­Ø%UòNâúÿú- 󕬄»ü„ cfÔdáTäÖúQÆ÷ÿú*ñSÃìÇÿËž¼ƒ3Ö§ÏåèÁ/!úbé^þoþ°Ñ>©®©aÚ¿òuðƒ©«æ¦S&ø•B¢+€¨Vkæmèˆ Í%éÁË¢îÞ6‹š‹®¶aM»â1Ÿ)œøiÕæ­ÆìšËKFÔârd›¯~ß'ÿãÿªMf¾ä[$Ûs-oNР€I|aCâš„Ný?Hèñå_ˆô.,äìögýûÍê%òëë—Ïã]"ÒÔ b½ÍÿÓCFÈg‹«|Û@MxZÿ]Ýt¿-¾Ðw¬ÃÙup%¼Ö#ÙÿÓg ìíÛŠ5˜TÞSvè6Ž­ùºò:…a}†K H-±(¹ÿªôê=/ßd&³Bi_ùÏGÅÞ0ŸÏý&Ý à’ËÿÛ2€xEåz»T&âªo•Ý þ–>.Ýå|{ºˆ¢9ùu×ðCÚ> ¦dò<¦öâ@d÷ôþܺ“ÕÏù¯àyAWu W“€³ÉÚn^h_3üô"9U¨X—}í¼¼àÖs*¦§ˆGPÛèc4ßþº¯¬ ¾éJþ_àסï!}ô^Íí£ÑO¬ZË#®•O"A«ÁƒÁÙ´d}Êwâ/å½Á²7OÃð½HéšßØTÐ]Å{JXch&¿v3ÝžÚ¤!˜A+ÿ°Çi¥b9¤¨“—i à|½²âò @§šoY»È½ŽÓ¤ì¶àræ{Ån»|¨Oÿkîÿï;Þn0 å÷‹'Ç#«¶iÿ(žáÏe’öo6 ôóÅGv¨²˜úÙÐui`®ý^Îìá"0ØãÀþînßàÎGØ·Æç;Iî Ù¼Âï´Hõ'„`æ8I£Ó“»Ÿ (êÃ(Éö’óÿä?ßsˆà¥åÕ°ßã§;oü]Rt2WÖB"þea<ÆnŽÉ\®å Ü Ò·XæQq‡Äåç®èæÌr}$¡Ò§ÐÏÂ1‡ªœ•1!”5Û¨V5G·'g5ÏëäDƒV‹‰Æ'ÔüÎL¸Ø? ¡gh=bÕöåû¢“ûŒÆš(sÜßFG@ëª|ß7ÓÕœ!:.‘Å“—>­íצñ}ÖŸŒ+½Cy-âäòÐ%¹ÀW|+s)SÅô`W*úãpÛûÏBVti¿öç¬<ˆ×ò9h;UÝ`ЫÀÝþ¥5š×ÿíX†„Ì(”'–øFâMD>ïhÂÈØîU¿Vmiƒèªcøm'–þâo1¶X£æþ±Ó·óÏ Ut\VA:“q Wê#ê UwXþ˜8F_tñ@íü!c9íÁW¡Òƒ¯l• ×û°.vàåÑpÀ¡o meöK@Ð¥V°+˜+g–!: 1ð jÝA»Ÿ¯rÓͪѲ¶üÂNÌhПFæÌbvꜳ£Â "¡‘_á7/ø.™“ÀÝí[ãPÞ³¶.´mÊÇ2µçÎ{ácÝ–Ù‘˜ËƒèX€š,–;,P©y]š—ƒ»tÁ/)»3¼Bç ¥¶Quô–™|‡—Ðò£ÀG×2ªÙ·—Wááø÷r·Ë4óË=úÃÍßF >2ú«°oü8¼åØ1ªIÓÂö$}þ6øÒ¶™ÐéGW¾•õÇØ`«÷Ao/.¬/ò‰å" $fب÷ü¹ Û¦+|BùÄôâW—`ïñÿì&â­¶Å›¦ÔÚ ½.#¼xÜ"Û>=à”§Yžvj¬lvûBNÿƒ1Áè?œ_†í>™CÑiOãOàƒ¤ k}سy[ë¹8xù¯0qý!x½Ú¿õ±×Áÿ“Ù$J<DÍÒ éy @ ^†î[u˜'ÿ[ÊâbU²&äÀ~ýº ܼ؛4üõIôÀ> Ìð}B((tçÃÏ¥¤Ì[WušKñÏ}¦x}ày8Úk>òDJ_“‹["ý ôa£Ã¶ìª=€.ô‘Üyert%ΰa‚b?‹Ap—С8ZRªH !' …Oæ¸á)øMZÿ¯'ˆb-Y—~Sà8„ySR ö•\¾iAÒœ¾n»¼ê“qÛ xxX©‚gâ<›÷Yåÿì -$EònÂÀ']Û=«2úåæ´Ñÿ­$Ê/HÀpþSíHrK‡Ù²$?[fæò‹ýµû!wø2ÜkÞ³9Å‹àknú5ôoÒ3üX7=· u¡m:‰XL¾Æ”ÿò*¸R½+…) Jž]¹•È=LÃXS×`žc’>Z\¼ˆm4Aõ󈮰(ÌÔþ)..„Öù¿–à $©u ºïëÿï´·ÊúÙ”k÷µÊ2÷H,9îiÛ²ÊÐϺîÕ²ÍÃO*Šžã.À„Ü UƒOÅ»¨éOó ÏHM]^Ž2#Ç<]ñÏóU¼;=úá=ž}“)sø2ؽ¢l*ÚꋘtùI Ž‚1M z6÷¦»sDüÂP!6’Ïô @¶_{ {ÅlØâEÌ+¯(¡áÛ¡ñ“ö~=–ÈÇ ™¯~ ÞÔåû:û@·[ø/à‚ ÓMôð‹Œïm¬}€™"óÿøO0ex¤;©ßǯYŸ¸lÀ=®N¥È2ƒÿâL<'š¢½Ü_šúIô7­‰þa¾âö‹ÚÉÛ£ùùý%_™ëû0 ãЊ~ν\NtJ}!Û‹Û¬šÇ°ö½EÔ *­–’ºoŒ¥ #ì>>Ž×þíãAbëûU¡¨°^¾ìhøo7U a0÷–½Iå2Ç¢Þ4ˆ¯ägW?ýbé¯ã<_µ6¢°@¿Ác¿ ÷õM“èRὩ·ý°»–>+'˧0=À¯z}›îüT5•¬ÑIJXÀ°ZOô•ïO—HÍÿÙ(¸¤^{(¹ôÁô\Tž£Ï´Ë³)&Àøe|ꘅêø®Ëúk;ã·Vâ¬ý+¯'›³äÐü8ã˜sªOÏDêSol3.Þ=*öÖ¥§œŠ,×ý˜3É”rá·—Çáw AùH€6ÝÐU /X¦Ü.ß7:—ÛmîòXý(jð½BqE‹åw ð¥=~ˆugÜá)[ø^cÂËðÕ“–@²Ü y‹1–J̇X¯ˆwÛ>°h^—ñfØ[øýŸAÒŸ 8eãÛ']#âÜqdSE—®óoв–§Šñè¥Éê«×bSo€5´ d¸Oopz—Dpnø\Cæ¥\žÐ~”K³Ÿ½Q9ôQÿl!ÕïþD¦[WV‹ÌùD_o]7 ¶æº1ìÑÄ5×D¹«ŽJîû ¨cY‹ó?oÿ Cxçã@}¾M<¾ïëOÓÛÝý!~­8/Cöäò³öð\æ±bò.%¯³‘þð+¬|÷ÞœSòÛÕ(K0f š çÏ×ìDEbà?b³Ãÿa>’ÇáërÛ–L˼Rz$<{;tiæàBü•üWžðÛ¼=¾×8BaœG¯þÚJa‰†ýÅcËÜÔë]þÅ4ޱÄåV.©.3€¸¨ã$á²èÀÙÏ%qz4œ™x4ƒ²Ó…¼Äèuï1VyÖ » çˆô °p€qp½þ1kŠœÞUn £ŸÈTËd ¢²Gcb… qÛzÜ~Q?ý¦¬s ŒKß..ŸÏø£¸·;jí³#‹’¼Þï“Ý’V‡L¥äçÿ̧”BJû6™Ê#—ž)H¹¥|Ù Ú:~~Ã8¨úrïù‡77Ï&€zè¾Ìþ÷f#mÈ86–K÷òŸ¦îŒûvQaë%å–q0y0Í8K'g|×㊌MŠEÕ =’ÍÅëKõʑȥ¸R΋è{é›ÿIZÓ„ŒPóãDpÿ=Ì‹ø•bY:çq‹«#.ÙÛ3eáø‰-ÑåÏUW®àÕ¿6^=8¶Ç–m±¸/å6ߟxR9³ÀKø{·üÿÐG‹³e*çå‹R¹²t†¼…‘M6á´òŠ–¸¼Ë|?Iyüxqh¯fßÐ 9ñ(Z‡IçæŸ…J ðë'«ŒâB`M¸Ë^ÕKjývù¹õŒ½Þþì‡]^ÈHRýî Grd8µV \Ù¦ÊgÍ™Pëv ´x»åmC/É•Ñh¢WÉl²)/Ê–k©r!tŽøm#rÒ â7ÿCa¿fH}}s?ÜÏ=áu3еõïeŒ¶+a´]ŸJÓÅŸï©C­÷“J²Ã`Ä[zÆãÿOloÑ,¨y ƒFå–ðfâ+j#°¿`#=«iïÈXjµðwî„góŒaf?¦4Þÿ¿éæò1ŽJˆƒÂ‹­ËK ×87ƒa¸dɪãâ0^”˜¾»¢<Ž+`1úôg6ÛGÕÎŽ€CÿæÉ ˆtEmšÿ®cÓ—òÁwWƒ«"Ïò+Z` ¢mJ¨†tZƒŸr|î`}dÉ‹Iàïñ3Nq‘ÅSƒÈ&|;ß×Ð!±}»/fÿÍÈ4p°½åFdé\A„'^¡à; @²x¥ô+ÆM~T÷1^;G­­ô‰¯PüƒØ˜#Yɇ,§XGí2‘Vð,lúp½Š ŽW¼˜ßÞ7÷@Щžéä.™ûœ+¯{pà-‡ò÷»kmÿ‘V"|oÿ+«_®hJálpÁàΞ~¶¶¯ÙâjÇt#£›>'C“Œn ¯Œ²ŧ¹eHCƒ,UçË^ï‘_}þ{y¤—;²Í«ïšÁ„øù´±ÕÒô‘%T¸Õ¸êöƒ¼Zë ]¯mQ]ÞzƒÓB¹²òG²SèüYBÊ|¿û˜u¹0bÝ©¨°I§(˜jðFLÔ©Dƒ‡hŒÇê>ïoê ŸÁ{»šíÛy¬œ²'Ó–PùŠ7Þš">Q`ûܹ{Œ›ß 2•O$ }z®(3 ‘ ÔV^_{º¥EŸ¥\Øq/Ó£z먑(§ ]û¼cq8šÊ]žùÑ”,ʸ»ñ‡ðw¤RlïÀ¶³ëœÇ(æúl’Üá©ÏNØ:…wmÐ:œ•Iâ} ýއ[LÅûý8£CŠušâ~\E¶g¡Aâ¼¶X'B˜ýð6oš>ò9ˆnÎÿ£Wº±?†p&ó:¡{žú‡dÛ|’U³Ø”בƒ“ó{êû©øú–¿Ôgðþ[ì¾i÷s'8¿éËÙƒKF[¿Ù) sqÒÿÿ²îGý“÷²g×\/èèó<÷‹¶çƒ¯ÞBË^`ô;·§:Ïž^ÑàµòZå´­ Ì1"}åptr&¨\}Á½l³Ñ*°ÇG™U>ÿÆšòÁ¶ãR¯Yà„B¹Ð«cîÛZÈAàŠ7# ‰aÊ- |’W­ ÛEUw§åü°¿‘ˆD /|ü Åg·jmë!‡=õ‡à¬Ÿ(åç‡!p‚Hêñèûø­ÓhH)BÁ†î*#ãýL —ƒT{jeQ^}I—Õ—$mP»³ü.óo¢Ó›"o.šy‡Y¦ìÐ)ÄäX­y1qî{ÀgØþÏ@`çÖôýžWMëz~?üÿO®åÕ¹êü<ó¢êHéÞìqƒ{»FµßÇóŸ§fÚ'›Žå¶Šóë… :¢´¹×æ…ׯ{Ãñq‚;×êâƒ3…6³uùˆÌ~wb÷›¶Øcz»|Æ¡~.3—!‡Ì7KgËo«îHhè,h0»þu2òû¯~ƒ®›và•÷Ó6??ï»ý,]MõÁ§Ù­Ø<ó j1y8²íþ˜€^o³q[WÍ>üS Ü ÂÕàº.~üªòH¿wV^«ê åPúÕ…‰r²ßC¿ú#nàÂÚ*žJ¾.Å®FIÈ`¿N¾ç=]‹~G—ÁÍêëOȘs p+0ÓpÊ= (9oT÷ÿÒÀëê^ð…ßð~ZlÄ<Î{L°—ànì¥áR|(¶Æßhs`“‹™ïÍ£âHZ“ÿÏŠâŽæOÆîÐ)§ª@àÆËL ò"ÙV“—Œ2H×Ùð'œ¨´Æ ™éß"¼L>eÝ6°Ô–2âUÆÞð åUtˆÏˆ(ý+Éy‚wRT›,xœñ1„cPˆ?ý |ÚÆ³ÃùߢÎàÍÄÖÕ·êq…?|¿>@X{88L¿€Jò8ÈÚU™œ–í°pAê¯pñCšÿ„vòM? *ÀrÉWá…ÔÅnVlÀ@ùž3*1ëFäñ À@Çt`‹)óûÝQã] ›?ð6mÛÖêÏïàÍ¡›-íÚ´‚ïW¶ÜóÃ’«WÂÖ“–`à ÒÅË`Qåc2p$`hˆê/Èý‡ðaô xŒ5–y¨÷³mðg¾P¥fuPåÓK¦õò¢<÷5JYU¢¤Îþ.À7÷óF{<£þ,›µÓî'÷EW>¦[Ë!}d÷ïIìR=7­‚ký…ÏçëÎfþbÖž<I>)üÕå¸7ðæ™nxûƒ+b+ä+ßgU_ø0qyAªJ6Ïh ûQ¯Û¦0\6"è¹hO2—®­xÐZOþ±òšÑ꣓Á°¤Ö˜%›mdÅ. 6ËîÒì¯ÅùQ$×oû³E! ˆxŽ~‹ù¥¿Ç»ƒö_–K<ø=Üj36G¨Ãm¼3Î~R~ôx +y5ÉQ·qL'Ë øzI!2Gu×I®NG€5L"|]x†b*æò嬯½‡×*Ñ\bÙ¹››ݦøð n†ºöDki×eit\‡2@v¦dÁ¨‘èPhHÐÝp¹záTìò?’_ýã8ˆyCe°ÿbœ_ý‘m†7ö7xn"\YišÖ}ñxÓgï¾qçt…Åë‰76q¤Ø@­ñ™m>¬[/K¶n*7so+çy?úò‰Þüˆïb8d¥¸„šì¥û*ÿšâÔæáß´¦KÈ¿ó¼µS™Äí:,­ÏyR!›~yŠk–Ζ‹÷ø÷.ǃðŽ6懗-¿g¯ï­6îLÜò}|–™p1*³g, y<{Ö¾dm›•„ K͆¶w48ï¾wúÎl­æ)œ£øï-æ&úñÄÝ ‘àØ]ÂÎTêÍÁUåá|¾7-ùoV€ÿ?¬(o~érXŒh DfçþübS7£ÿ¨|Á5œïÔÝèÓ8hG‡Œ~Ë~÷1F8w»þ_iJÀ„\z–ÕËm`xL}sÅíäý§Š^„ðÈkÖu‘Të2 ¢ùˆEAô…ž ºë€¿OÐòÐoAÜÁ„æ( Ù¥ðúÚPˆ„´¹îþ,b|Bq¯ˆ€"PàÎOÅì^Ù¤sc L2èg ªvzþ¤>Ѓû‘Û)Oìní>õ².öa Ï| Dÿ,ƒUNÑøú½œSqôåòÞé·gÝç²ó‰Ì%ÿ¹µq艣Ž/ýýZÏmžß (eîyL¹ ¢iÔ8ÄDß»ÿ*Èæï€€ˆ|A§ÞÌ&G|Gµ×ë[P_+¾Ð0Q÷‘m¿Ý2'nù~ quÀC5žðz€³í5kvœz0 í# ¶y‘@ÂáæÄêÿ_„Ô3üçw‹M#RÏš¨cÝG¥&ªÄtx•Ŧî§F$iÒn2f[gš<šIÄM¹îZ)ç/˜q¡¯R?a‚pÛüw÷üxù59ÑÞä¦þ}&¹v{[AñðÁý§²Ò¢]kçý¯5µ)‡?äW¿ÈKs˜{-í«„Dx!‡ó¹…ŠEòYüߣ W&`4¼³wtŠß\àîF3˜˜Ng¸‹•òFÅž.Û#ZF/Oõ,Š(˜ŸUV±ˆŒ|nã¯þ‚.÷—×å>B~ÎŒ(L*{CU!éï’Yøz.)Êè’\!ñ5·‘£«`¬ {oŸ~sy‘&"!¸±žl*‹™,c<ͲƒX,¡ót!yÁI¡x`ÕQUŠgó¿TÓ|Ü»Þp¯BA°"eèŒÈª›•ö¾*“kOsºmä£ÀàLP\(Oñ«; ÅkŒÙ Há“I¿yïÇÈäcÙaÅ|ùÏÕÕïßk{sµÊå`1"Éœª‚4ëx2Ÿ?ö”†xë97¸¶Ñ{Ý“ƒY˜|“™3•‘P4×W¨âÅG¼ª¼h ÷•ÀNvAеg&ô<(AlL¤%Ný>0} à Ó媷yõþ ôºy-’%Z»7sà'7pÌÝ^ZÁ,˜– v¸Á|¤}6%ÛÊbõëð·êɃtË€·Ç‰@NÔ\«Šƒ=ê{¹n¿M7Ò¤t6un§d Óf¨¨µãKÓå‡õ›{OþF®ÅÖ¦²õÚ¦a¶>TR|naÆÑíH ˆyÚQ±yùÂÓ¦üjŸºÒ hvÿšŠÖ?»ž.":v`ÊdËÇ•¿}hÒn#<”„EðÛYÆ+­ntÿ'7ýåEÕîg[ Ýl‡ž/mÑ<åYP1scwû8¸”Tô%”[C¢Ý³uÅ-é @úå´&ȨšÜQ Rª€†Ãi!´˜”vT¶›÷Ï“@É©ÍÖveF†tÓ¤géšïMqrýá]<áÝh¶ƒ+ˆ¯'?¾è¿ÕÚ€°Á¥yëü+?ÊnE%€±ŽÎô†äâÞ±¼ ”f’0eZ$•^°ú;bÿ ‰²fÔ,¼¶ ²¼ã<*)d>cnËtmŽ%‡íȶ¬“p ZQæ±?Ùô_ØÀº¹’¹Âl?JÕã~ ÊÝ#'»lo”–‘8¼Ók/1m±|"-sß/kV>£‘*Ñ pò"måÀ;$-Ës*Ê"‰“Òÿ€€CÚRŽ´(ü„8 RmÛy¡ñ1‰}Oú~©árÜÓùÆ/‘ üî²øKº4çáñ€Ît:`Á{Ÿv  ¯óãI=ž (æ´Ë¢gPÍuVœq›Õ©>{ˆã»lÓ@QŠf(}0¢¿E¥ mI5d0`R<¡hf¡9ÝõpR‘ø¨7ûñunÞœ£—›Ð‡òæ”—¿ë¶DѺõ¢ð4Äꌎ °ã§²äÚˆ~‰ª p¹â ¨†G“„8hTs^vÙ·x>»xƶcù ØßzgýrP=™j¬Å1Éó±'R3- ·t¬¯i¹n¢|KnøZÛ€ }¤mêáÊð,g‡(V¾rtÁØÊÏ2±†ß@‚~ÌâS¢Û[}?ÍBÇÀQ‘›ï"It©ñݸ¾à†ÖÓ/9ݾžÌa†ùÖG³÷t»Ù蹪âœËI÷¢53qn¶Ú»Ñ? ñÐ~jx’üx[C(B¤¦ò‚;È¡$÷K­§lñ®pÇJ&«¦ék3™HheÊ…š à˜Š$ŽÔå Há«&./’1WÌÄ«!t[÷ˆÓvp]EüJ¿Fæëæß()ÿƒ§=Ô£‡ÿ$¸£Ü ¶_«Õò#fHÑ—v¦ìËh¤HKLêûppFo0ž ¼#ëHEoÈׯéÝðQø“æ€l#Úë  H‰{s <Œîç%CðZäô˜¾Äû–Óx ׯDÜŒÿ!ºßG „|pSËßCáf=2ã̈•Þ¶ªG\VÎû?ÔEhÌ·Œûû^Aüݬ“FÿÆæ:ÄpY*T+”R™g§NûÅâòo÷¥C<ÜKx¸êÙ}ü76‰sæ0ëáÛò|dµlÄuþj”À ßw_UÄ4xmþ"äÍ輸ø‘7‹ã¬´¼ìy=è®ðs mUéÏ¢L÷JÞyçäàôréÃ{è& <ûAŸ-L^)•ÛA4IÀV(®ú&Ú•¿”î»[Cµ˜Úé¡’ä…BYƒZnù´ C2KÂ.}Æ%›FI2ﺗÃz³B¡ßóñ]>"`蹋y—ø‰–œŽ,öªN2’G™¼ æÕ¬ £JŒY) »Àx^œ Ùq‡®‹ô›õ·qüÇÛ³žÖ¶¾|-˜.«IV²¼R”%Šò 7‡¦ŽZ·›®hâgù½¤ˆ)eóÉ ¸ïKü^Ò²SLz¨ðd’Êu"ž „#Æ„{Ö³`ñûr‘¶ˆúø^T¶ÊüϬYß…¶Ûñzóáè³Õ>ØÔŠ6·º'…ÚØXï>(¹Û~ŽKáã¾Kà?Á41šîÊyÚã½Êª¹«ÁQt 6MI¯§ uü./'ý˜5‰–ÀP‹K ý«Iéên O)‚sræQù0©ø´?‰¤Cm2'?•˜GQ¿ ‘ƒ„´:90Åi6.$[6È–Ì“©ûà†+@³²èTãǨe3øÿõáÞã︓ߎÖ@x#e~òœ‚Dƒ¨utx×`>O† ¼À³šŒÅÇjéÜúg½…>(T8;Žºe¿k_x>>ùC¨¶¬Ax;ƒïIoCµiðŠ·³’ÙÖ¬¼$Ö^œ ­ÅòeÙÝñ›5ðMÕ;ÈÌÈ·ÃL#¼X„hB,4|Ü×ûE³Dq_Ÿ'ò-’ýäöiÁï󇵼b¡7F."Öt./â×á<1Qk„f‚Ù«ü»âÿÍnpÊÊ@§¿íÿgÉýñ0žãÿÝý?åÿ!?øGÿhö?Ô/á7¯üô¯ó?wü¤˜Óû"ÿåþ`øý¯ýZ‡ý!@ ÿÈ/üïñý‹üÓ+÷ÿßÖùgü…ˆè@³†ÿÎ<ÖÑñ÷"¨oþy_úÿÚÂb×þ÷°õL¯§où;š7JÔf˜ïòëêD8ÿ¶ßÿý¡Gtùš½0ªÄQ]ýÃG‘0Ò [(õrÞ3”où_ö’ý·ö€|w­ý†PC"ÛãàÒý‚ÿ#¦{ú?Ã÷xÿþ¤G`ƒ€ß˜±WF+õöë37© ÐþJŠx‹sý_û?/pÀñÿœ köÁœ¯–˜=³ˆ4G³¾i—6Õ›zvÑzë õåÐnfL'T ß¡6Ž4MRŸÜ?•5'ÏÏDÛ‚•'?ý¬¾q¼ŽÅ ~þ,?«ù}ÂãwOüÏ/2¡ŸóÆÝýHÉ?—yiÓ¶ÄŽžêùÇšÁ·@öR+Oþø¦B¥ÝHªe Ž¿ó(?«Z–‘~=¼‡Õ _­D›‘™©ª_ͽO=ïí`ügnd‚ ¯Þ+õGÿŠlýðLÂóÑâ¦÷4a·J„žTò<6ùr'™  ªNó‘ pLŠ2Ì×þY9w0Áå÷ý2îþ…ÓìëëÔ$š>Íá“âLçùAŠQôkúÌ!ö}T“åþ¯ÚÌëËçŸÃØÊ€ÅÁDÿÂv،ćåŸÅGræ~ÂEéó¿Š{ÆËÿï')ÇŠÑAÈ B Ê¥œ™ñª|ë¨Ä—Ä8Âñú(ÍÀ»h.Õ%6ÌNŸˆw& Ø”Š®ý¹(ü¿ @ÃWåõ$x˜sÏÀþî[,SÝ*J¯í£±lçÊýqŒ1“:O¿ü@â¨1yKsEï!è,åÊ(€·{-v§•ÉÓá±píœ'ÿ»Þ×ÿ~Äu3ëŒ äÙMfÕÄa@ÓÿÊWÿ¢Ë–Ëv[úñD,r[ uã GEþÙÿ°ã&Ï›GQ 55>Œ.`?žôw­_„»öÚk }ÂÿŽ2´>o1QóU4• ý÷Ã‥I?PB†Ÿ€À\,¿öß_xÉE †ý%„0’ÑV­bˆ³pR0·î¹âÎ)3ç&zÖ8±<Š¢…N›ƒ ?ÄYþÝ"2CƂ؜ÍP0E¸gh%2ß•ç¯û¿¬ý¼ypá}óŸªã—ë¶fÎEæø0½³XÔÿјžøO»+Ø1ûoý?µ‰<_ÀkNt±‘²Tב-ú”DQ_•¢£±¶§‘}kJ®ÍYЖ&&ª Úæjè‰+ͯ׹¸Ó"8IYл‚ügÿ±Ÿ"ò§š=Ç'q4ÿéyhÁ°cÐJŸ ‘Äâ“~û-Â'—Ç f‰0-uQa–ÐÔ\m£Ä BŒŸôq3øúVë¯÷Àùþè¿™ßóŸ1jðßê®®¯Î‘ÿ¨oé»þF¿±TûCI_ëÿc݇ý©‰GP5:?‹îÚÿ„oòkhMÅýO¦×ìåÇþ‹OEj+Ýe1áQ¹WSýT\Mk?ßýW µ) |!Üïéæï}ÌÌ=½1¾áX*KúïDwã7cu_3ç8ò‘Ïýë£U6ÿ”à¾ò‰Ö/%ÎØxȤÍÓt0Çqs^§ÿ“:†¸,öù è•Æl!µ …‘Àå :ŸìAtäµÙûG@—÷y¦á`‰¬PHoæ}ñKj 8·$4ŸÈÐ``w/~à€ p°—ÓÞb?ÛÿÊÿØJ7MË=ø`ÿP#O‡Ø5WY´jý€ßÀ?²ÿú í«kyµ .é¡«§‚‰xñþü!il{ „äêHaV^tø8´À²y+MÊ·5°žÄ ñ4i¡çž­ÐÖ…ÅSFÕã€Q¶§25Ũ|áŸÀ'¡nf}MßS²|Ôÿ­w‡U瑩ø5W”ábÞuõÿ†¬ÁNV‡­ÿÃð$ïe½ŸãÛn‡ÕWþæQTßôÝ ¾ n¹'䌘wW~OwvÌ =!*1„÷<ŠûÅ%ÿ'¡M¨õ€H½Ìµ“3¨s¾TÙ>Gü}]4ÞÒ·Ñ¡l{Š ø!ÿ{’õé°O…ôÊÐÑêeÍ Uï…Xõw‡ã{çãÐÚÎ •¾RýªD¨ ŽÞuãjÖ=Å]žƒªÝ(éó»)"y|YMkœö4ñÜZø‚ï›C#F;„¾Ñ‹éüV`.÷5Ää|J©jäe[Ýf®€²5‘ë.òc €1OþÓðcÄRÿ9ïæo™ ÞK$¶dØ&ݱ!%žpÔ`ÿ ýy+Þ ÚƒÊØqéP¯Þ¹›‰0M’.Méc˜Å­Î=‡ÓÈ;‰á/W%';þhSÛZ£¨¹‚f_\—&Ü5¿±ýøK•×­(IàŸmªåÇþ+¶è²hëd¿:|´.ØÚÞOÙJÒîŸdŽ¡”êržpè˜×“Ö¶p‹þ•q±w5'ù9™Ž>t{w˜+³zûù[b^ú”Å͸b*õ¢jÛ×gÖ&:¼£áwHvÉf¹YÿÍ5Î  £åéÕ(ØDq‘Ï)ݶ©óèö q<4wÝf.nûZ…a’/ä·åÁÍͬŽ1»Až¯(”Žh>ö«æÿß÷Ø_îÿÔŒ€¸{©•¼zÐÇÖé!ûÖøšV³ñA­ý6ªµó²/+¯ü¶t±žº»][}q³ÍÀ¨¿óUç…l……·2ÝzÔƒ¯Ø¯ *i &m˜(@2W·Ø~2”`‹‚B1§Ûúxºº¦ç¨Õî Ç=€^þ÷¡ õÏ…æ€PüËÊüùPOÕ›»ùS¶ìQ¸ÇXMÆäBq†Â4‹IaD›š¸3A.=qí+lx¼š|²¡Šv¸®gß…?Õêý1Œa¾VÿCpʈYƒ¾Ñ¤¬FˆÆR¡ƒpvà(E\ÐàeöÛåÊË…ñoId w˜‹µjö”ˆ¬,.˜ ¶¹)ýëãàGƳ* Ú…HK£ê¡Û¦µÒ…d51„5ü](sOÁí^wFiëR‚aŠý{n׆é÷ŠÜw'¨£ÉlŒt­Ó~#å"N¦óÏ…Ê`–ÄåýA_ê4.¹³H.¼{l Pø³«xOX±ŠFŸÍá7&_*\`»—9]Ú/Þî(ÓŠ@÷°`À/Œ_w/ áƒêÂ/ƒx§(Ÿ—Œ‘B-ì!l²Û )ïñ‹©œºõóï žV2)xÄ+Æ C³Ÿ\±#âq˜3²•ò‡ïÔ^?šÒ˜ÐŽ·wÁ\CŒŒõøí—G‹î7•÷Ø^..µšž¾Â×ÙOv¾Ù<£1·ü¾Ïw·ê÷Äý€7¹î}€°W_î9ÿU¾Ý·=¼%tPÇF/½à–ïÅÉñküÚ6èÛèÜHÃÄCÞ°½O­ïý±÷yÌß««¸dF#Ö ¨pwa£±-æ¼Y¦as×k€Ê¨ìÝ{Û* aJ¯¼WD”9]>F…Æ%Ë1œ«âógŒ?!=ÁÚ‘ðO¿ø{ÀëMæQ,N9< $$>˜p»×Å–^Ø€–¯¿˜`ýãNtŠí]§hH!¯[ù/Z‘&Ö{58É%DÕ]:\ßëÎ2Cza]ÿ‡Ñy{wol hW¹t ³”– Jù¤ÇåV@ë5ÊN…“[râˆ/–úVŒä?8˜‚áV’í1Ã[º6ŸVßá«{Ü)€U@ügÛajð}¥Bÿιž½yèKØOvÕÀå¨=êSS25ÆgÍ›…¬'¬\¢&€Vµ`àípp€×n\0À=­@µ«}kyq˜gçbóþ†¨.A{.¿Ñy¬$þ­Ð?èn¬À` ®Åˆ« œI ›`õ8OÇÉÐ<À&Clk¡‰¼ÌƒÈÖΛÉz½9:,yýŸ8«}ëŒù‚áQ^¯ƒác{ŸwðAÚr·Ù€Û‰w1ý›d¸uxmÚ_ýLûb¥G™^ºòlÎ ¡háÜ]™pG‡÷´tÅ…¨[{£.aä—õü:k“Wtl¿•dmóÁ~ÀyØ€}íë}V¢Ôg‘._꯻Ñûæ}K}Ð>ÀD““ß§ºYs‚$¿ Þ”Äñ_¯Çí) <¼ÑÃÙ“ìÌ‚9Τ~ìl-I-ù°mß™"òäÎŽ¹<yô}Š|ß:ÞJÜNðÚˆÎS›a?[L@é½ó÷w–V@½ü_ê­'cí8pÏz†TçP„¢>L-ú¢á?ñýº.¡ƒ«‡/ä^‰ã7lcî\ŠØÿî`ì)”!5«lÉ“‡é˘ ߇%®iûï`-¼Ö[Ðà ·±¼GG&Ïb'L pûH kšÁƒ´áS(Äÿ˜ä jJý¶8eÙw÷yÒUÿ& VŠ!¯‡†çÅ`·%@‡ŒOõŠÌ/ѧtŠNé'N¯0Î~ HLŸ¸U¨¼šJñ]¿¦£OMÛˆ®}{Ïï䮿 #1ŸÇ‡æáý¯“¬T>„ø†øÀ~ÖØò¹µÏzù0ùí×ÚÈ}[œ –=þÚÊ|a¹oNâúøt‘¿¨4¹ú7Oâ‹í9Ö¥„ËÚ‹øí°U¿–›×:S‡à®£à›ÉÓ< äˆǃã_TÜ}Ëææ|ä†ošê¼-€²S‰«Gc7y*K$‰EBnÒ>âÞK¾‚]ZTâ“‚¨Õ?)ªØÚSÕ¡N;cråÊí»Þ§Õa¤ÛäR‹\Q\™wËŸÓÕ³òÔ5‘^<]Œ„úÌŠ:5y\Qqï‘„·Ý¾Ý“Áû?¦¾$v[çt§æ­=öuêöØnEu×8¿ÇîìÝhÔÆ½üZìî¨zDó|½9x?›÷ÿÀ°ÿÕõõo´?æ½I'š÷d^߯Î5‘tÌ#÷ù´eúfCïñc_ü|쎷­4$7Éïnû-³›Ü|ýÛ¢ã÷nqÂZœ\ Éo݉“ßë‡t¸ü»HìQŸM4z@ÿYe“èrqøóÚ6ÏIþ1ƒúl¿÷~u/‡…¸ˆÝj/VÛþFü³üS{Þ5Õÿz>‰xGÛ‘_²Ž–vüeÿÎw·:{r _b÷Ë ”ã3ÃÒ!µQ¬¢N¹nÓø‚Á0"…û¶wk6 3—G õþÕßm …³ï´¿u=Ûãù‹· ®³ÆD"ý_ü–¯ýîý>5yÁÜlô ¶ýÆ}¿*ÌN\„¶ˆPnF3ñZçV¥a‰À×aÂìÃ:€;…ÏüfÊÜ,©‰ Ñï‡æêx$„ÃÖÚŸ#¬aª¼j‰¼+ ºC&oŠÆz?·\µ”dý-ÀíÐ,ŠÕ"õwº€Ô_MQ8bo!m⸣ Oœá3}ÿ½ÁZtä_Ô}­/ÐŽ'GsdλC÷E#Ó3Ò*-¹Ë·&Ãp ¿YϬfH…©®½ö›ÏÊÐw¿7ꔈxö‡NO46¼05'/!äoK×f5pÖ,cÇ>ƒ)#!¢áä<À8r‡'x(! 9ÒAß²Õ/Wl¥ŽíÒ–$™oÆõf]ÉßÕ>>¿@òäÏ·æƒ6 Q’'<éÔ×Þ÷“IC§ûxÉ¡Gî£ÏÇ›ìîÀ=!Î-@œæ9œm;µ4>¬Èxz?(¤v¤ðé’bíª Ÿ·ˆ·Žƒ—«_£ê=¾p)1f Óü2Õù1ûèàÏ_!÷x+-Ã7¡£Ce´îœ2,@À?ôÛáQx4Mü•ëUÕQ;Gk‰¾Eý8õrkM1XA¿4 f­NÓCó[Ý]àÂTÔ-Rp€'|qëÙG‚¼ýñÚòO`ÀÝ»ÚN‹ÖuðE³‘téy r_.Îm‹p~eí{wÉ$>~ à i·)élxÚïKËùùÆ8ØÓl´R _è¡Qhˤ[η¯õd_´Ã ‡Ä~eÛ÷¹@ðx1áú ?ç†ÖW>µÒ÷thòi=MEÀ6nõL–ÔTÞD«Í¾òøO5N ¨DòÄUQey0²yfVf9á•YÚ/ùÿ$“ðÜ‹ ªèøI&«p@r3íÁ… NàþC!FRï\¬¡‹·$|“ÕŸ°—^¸.S'lÿì](€Ë–ïû›Ä$é³ ­{milz®ËkmßxúzlŽ?GOõ/¨ÿ{¢>ì— —<&°w&ÖpžJÞS|?Ìb* ´;ý; oÉÍ£‘°7×^k‡…Aðòº¥$n“ä_ŠùŸxà]2Î\ªET ùóU½ n¹šz)£¸'v ÷ø™ùhÏx‘FÉ3S˜®¹wòCèÈÏ|ÙhzÔ‚t×#‘zïxò+eÛég7ï&jw«l~±$G,ê l©ð¹ê`§ÈMµ±4^2c­ÁíÃ/T ÃÛ‹¿øÏzòFjž7ž|ÛÈñÏo稕ö-/æÁž°É-2ÊúË,Ìa>ˆŽ">!˜ÉaÆf(Íɤ•ÿfOÉIxHÐÆpóâ ‰½zåêTŽ­ˆ5«úF ŸJBáEë][{a&'^bèô°ôö¾§‹Yƒ^ºgƒŸ?ñZóÞ4~/ À4ü?h?W#}Ä´|:2êôê²öúø j)n©>ý -`K`ýÍgôoÄÝ9໪}?÷tk &žæ¸À bîmÐxvøˆ{OŒ]×¥¢,  p¿gñ °ŽDƒ‚gÇè|K¶‘ÛÌZ¼ zÞ`¿Ksa•;#ËB0äùs$²ñŽbét=××Xx?˜/Æìl2…±„ŒÔwVäÐk—D”·Î¿üÊ3ñòIèã@©u»¤UgUÁCÞIéæ?—m½§NµÚ^?!}‹ý×iþ°±,±¦u^¡Ôâ·‰Ô¹@gï?xزˆŽ8ÍsVzîi+_¥2€ÄøÝ@øÄþ¤e8Úøñ32võÙ‚”!è…>&«Ã[P¹­Þg¥ 7ãƒq|! ¾>X â?]Ñ{üç{ ÓÏ«Ž×¶L›=ºÀË|C¯±v„Øis€-4peÚ¦Êg á;ÜË’éIör/¤X‡×!ü7«Kf8?N<kñÀ‘<Ð'"ƒäÒh nÄ…¥Ãëßð%ߺʳ&ç¹£Ô–LFñÎã>3ÊW<¿ÌXÄR¸‘KAÀ’Ô;·xvôÈœ¹…pV/<«F+„¹R~>- ,<¯ÉÊÔ“½WéªÇR M‘ `a²@8Б”?J]ÀÃý…í¸ßB Û´_ù ‚ÒÀýM•I‰÷°¿™ú›)¬dôÄ nQæ`5hQf=> Dä.T˜ÙtE¸õ²áGò¸Ä@ì÷bSÚA›þRªK ÄMEÍ"¿Á, “ïGÓ Þ øhùÈo8®%0¦Ñâ_“þ9ê‡Ùyl–PÓ8¾2W´ Ěפ‰•³±=­ÝX„U0†½ÒA7h¿Éò€×ùø¾ ˜Bý>€Áâþ°þ Dæö’/ÝïÅúº<‚_Ïû¼Ç&k>.kÖ”Ýxô¾Ueÿ¸ o—šøhÄŸÍÀªxðwv¦=ÄÓ SÙ¿ÑËHtýÝ´»Ytg´Á¼Ó¹üxkÛn²W¿¥T//Wȇ˜ã1¿åáE2£¦¨%Ѥð&x¨˜úPfÛIÉ åg‡¼öIL/-ºÎºÆâ¹ô7v`»Kbò‡hŠä–ÒÑÖÓȘ´øÐQŽDȬ·G&mÉ^´†ÝøiôT“O’”úÄÆ£-ÓVõø {ω'lÙcL¸±Øÿ TõqÜYn~K·iú? ?ï׌ü6ËÓØ†œÔÕAöýS6ºYv} [q ¯zÖt‹R•Ôyßí—Â>Ü×°+šßÅÆLÀüË«k‰ýFÖx  ðÑ"·H¸2“Ù‡¦²ÞJº£¸íÿ¸æ¥Œt³b± ù«c ÞVd§¦æH Lâµnmó<¤+@t쮣0bØÂ<&å×z Gže˜ v†1²„¨ -Ô^¨T]F¾²Î뙂o ôr4 š‘x÷ŸðG 碻N=Qµ9ÙÛ·.•h· l“˜Û¸W¯•Ó¹@¹('˜Am®êM¨N!éýeÄô%Ù]ÐÝÃ7·y|&¸3VñrnÉžòãsfM Ý-“­­ cçÞ6϶2±îà¦YSÀßï µ|DùýGÄþÑ3‰2Í—E`G,sä‚ñEþtϾpLºôsÉ^|™èµxNÞU|­ë•Á7"”Ð\ÿ÷I³v[˶òJ L,öKÒ$uö×£ƒŠ@ÛìÈ&´Ñç±ç@a²ú1yÃ…Ø’ÿÆt)! ö“þÔÙûÍŠ:þþîT3~)ÙÏêñˆ¬ZZ{˜!ÉÇ&þJÖmQ$ ¹íGú?íÓ ôd>?E¿‹W…ÅkGˆæ’öh©j#™ÚÇä›^~­Jú“¸R¯GãÛÍøx¿ø¼…õ®cþxÄuïäïÃçpÉ'ù û¦þ»t ¨niÿåW¹æ! Û®'7» ½Êã|B»ƒàñ^4³.—šQ¹và.¢I¿Åê ð\jßÂZ’;ÐéÞ_ý+–zÞ³H«ì@äÂêÕ3á¦ÎôìéÍ}ÌdP][ëÎOù+öï~®ˆ-„˜,ä²'–×)$-Ý÷º¿ƒšI²:.À¼¾ÀõVÞÐ:pçʆàÇ|{Ï}k§wˆÐ)‰áúò(,V`)€xw’øÏ;U>&H„Ë=+aª , ¾Œ¡·ÑZ²y¾}åW ÄŒNZ;¢töFXCz©ÂߚтmÅQ1Š©ü^ š¡à'-µµd)À»4 O,_‡³—Å‹‰ ŒXÙ`¹à¹­¢uä} ½-‘j£Â1´^Þc‹fÚiBÛšþ³¦ ıdû )£ðÓïB û‡=\;‚"ç£ÎZ5ûëÝîã Þg¸Y 2Öh[èK^Q½¤23D o7OpèFlÝ6µöoÐwcÝXÝw¼Âduô÷î½ÆýÝ0­Àéôx¯– w¿¶Û°.žmí}ã’´9ø_Çï!¼ð9³{ºÿJéÔ.HÅBóÍX•_Ååeã¹$ ×ÉÐS×3þ×»aáÁjû‰ª=™ krƒuGñ¾ïì—ŸEÚ8|œNaàɵ,Í÷©`w,NÂuaäî‰/‰Oü„maKgYÕ¡½X—Hx§ÃÖˆM§ þèöulôàæg°_œ+Û_ë8Û–µ¿Òç_€êG|n䂳þV¦®rœMVn6}¿e%åòò»ý‰[ûày¿€-½A~?‡Ÿ58:>Ü|m!ƒý0ÞÊؼÎßâŽï`À`özص‘Ño¥ÖæÙ°šó^ú$à œo¯I_G—#~ï?°å òõbRïg Ÿñ…àëw×ü%†ªÖþ§yA~Åï{¡$o+Wý&SÎq]ÝHXfx™AàK¯NÀÁ˜›ª‰éâ×3݉}½øøWuÛUúðÀ6?µž-q¸[œY‹Šô=«ä;7ްàol{ŠÅC`– !‘|°?⯛….ŸIžL°{å‘,0ÇqLz÷DêÆË—¼Ž£ðh¹ð6M­S˜~ u‹Ã—ªÃÁøFµïÝݽæ|7Ù½ôåÙ¿ê¡'­–¶„[à{fÆoA%yo ÷Ÿ~"qT7a“×5Œ)ÅDhè:8ÇF·Ý¢Â®]7*ÅD‘ˆ}ŠIi±Qˆ¡@Ôðš†éÌJB”,ÿˆ=o¾û”ÆIõ`|˜ ¡OH?º7AþpÍÁŒb“¶ôLÏö·*™Xôí‘:£f;³ŸG¹škØï±ø¾Üê,¨WK¬ö7%©s3(Žþ‹n`=4s+÷: e¾‹Ç ž¡ðç-¬U wšN!añ§˜äƒæû¿_ì6j7¢/ž÷±]Y𺼬Œn=: ßÈ)¥§–äIÃË£qÕ{_@‘(¦Þk8y¡ÝGfexö'!:^@Ûïþô5A¤|Eù3S(”ÿI&/cÞãh¹½/m¹s‡QxpËíéñRèn›Åd¨y 9‹év{üdlÌŠµiÐÃ5¶¸×å™ÿ4ó{íyIüü—SÑæþš.nf1ÿ\õø¬åãó¿¥X+1œœ<¾ÿöøäEêÝôõ¡’Ï’ãÖU{íã¸ßN‡b,hq§W£ûsØN_vz~fš‡Wð¥RXÿ¸{ÿêèû½ßÖ÷ƒÿ?Ú/ýÐCßàŸÇ§ÅXxüÞ?T¿ÈoŬ.Á²Þw£à§nÌÀâÄ·ŸfS×OjŸuïÖÙ¼›ïÔ½â| ü#yü®ûÿÆŠgM)~ ,ù²‡ÑÖ#ÜW¼­#Õ­3}逸 üÝ]ªtò+=ˆñàDbmP‚óÉz.ÆoX]Þg]³æÖIá„¢¹ÉæE+Z6½ŒßÈü™ŸñVf‰×è$+[=>U7Ê4ŭȯõvLý=oÑåÁFMfA:zƧƒó”É[ÝiäžÞ/ï*êÿV+|Äé/›<ºíü½[ëEý>ñ8ƒ×ÄK%F ~•«Å}‡Ùô‹Íö’oðoAøÄ‘Ìã@û {çÆu&®ßîÊ÷öquè•”Á›R?‹ëïC¬±pÿ9µ•bWAzbÏ´üÉN±e¢®C-p‹¢(ÁÔïð(>Š¿€oÑ«ïý‰ÓüMy0bÓî&ÛìgÝ­Ñü„ÍI sWÇÌw¼T™ömüºÿ÷þwÓûÏ­xÃ7¾BV­JBè÷²D²(#î™þyÆzÛ‚]Ý/3?±Á¸ã/ÎÁ>‘™“’â Ÿ£™­‘ðt}¥ä–Ay1fÕ]¬dl~ñ•U—&;Q&r2(m«`ø¿LUáŸßbÞp£Z瀟?M½¥åñˆ;DùeŸÚ½Y܆h›®ižˆÑdÁ ýÍ‚@õéwHØâ—NÛú;¡=…Qû)–X ùÝPàRÎX[°·Õi^KìЦm–ÍL$/W­¯èõ–Ë-IÝŒÙ{þÒñ¦ ]á¡‹l dèÂÖÚ %H©ÉŒíc6_˜üÅd×_k Io;kñåèå¦Eþ¤>ÉðâœÏцóJÆÊÈÂJÜ,ÌÜpO_Q¢¿×%H‡UÏøúžÖþåzÇÖÂ?íï€ã òå“û€ÿÞ˜aöïž}\ÿÍw=Ìß»Åç·ËZ8¼¼~öA£C”¼©Š÷¼¹7jT•Ú†?vŸ«Ãõ)Í$ùfGYØ­GöæÌqËpùü¥}¦'òµà“ï6¾¦‘[¨òùbbïŸi‹á«% ðÁ™ÙßEÑm&dÆŠ…š´òw•âò>›:4B¢ÛàŠ»Ž ³B·ˆ²Y›ï‡ãÄRxï…ÐŽ¡$å½€ù®!¬üˆ_}ÛJ.š¨|@yNáÇ6ŽrßRºõ×;Olr"¥¥Ûá_ÄD>7²:NÛŒ>îµ3¶È4ç<žêw…ôT>y$Jñù„Õœ\Ë(j¬ÓÕ (!¦ý? õ s²£ÃæÖo}®Ý¬sï»&„³Kßv>ßðÄw¶¥)áìfƒ™gŽâö±bË0!Y»‘œ|Ÿ:êâ¦,¿‡#Jq÷;ÿzåÂÛ,EšB.òËõïWîáÊr¸„ï›þÛá Lafë¶µ¶möž$§óRÓ—Ò˜~Qû4¯›™ßÆŽpjÅ1Aÿ0Ïtˆ×æ¹… +j'§k<˜Ü2°‡ƒkS, Z¾°ˆc¹"O_‚áÆ“)Ücq²† çi‹¼,1…‡ù™È‘åOS]híŒ1uÿ'ÄIz‚³žÜÆÿ“|MÈN5ÓÍáöÿ¢¡œi¾ÐèÍLZªÒû/eõDfA7¶£•0Bc",éƒðÿ=³ë„5N/ðÇê)º¦'…Ó¯{:ŽãJ™V>9´r¸¥B Ó²*Mûáßå§<|„¼|-©¦ ¿Ô$ed…=Òä|?‰ŒAçSýãŒÍ°O÷ )˜íŒð_««Þí¥Îq$ð¯—zQ¤°ÚAÔDjÈe0áÆ|Ú ªÿš87?æò|ä˜]èþ¤ÄE&DÃÇëãWnÝ98.Ôƒb©ºÔòh>3ô| øûÿï±"þìDE÷cüøüî~^M]¡þF ÙÙ–>ÇñH·lÂl"gqÐ.{’¾õXñ¼] ¼ß2¶~ï‡æ7îÜÑ·~tðþ5µù‘Ò§‰¿Õ&w†‰\Šfå{ûjfj;º[Üé2ÃnÎo7û|>½:-ßðºTÈQì—ò0p~K¾G›º_UŠmÓù~úŸhä`Ûä“ñÿ'=¼ü—6Ÿ¤J«$ê½'œôˆ±ù}áõµÎ?߇E”,ªÒ[\K˜@ƒÇ˜8ÿ/pc»¹®›óaS8L×Ý®Ú)HûŽ{<’Þµ‘ôÑõ©Ë¥¹9|vŸW0þ°ˆÌX n!pp¹Ëﱟ²||!çzýQ\s¥mV÷aC/ÇÃ>ê^í œ¿-GüÇÁYÑÅàÝ…¾$µý‡Qì[óºõl£"[hKù.,n¿Ôý8# ÷DÈg]BË&tBÐ  þçË­ÌûÉ¢ã,;…{´eA;@8ÊÜ®S-@eÒd›MŸX¦a¼.£mX ­žFK¢+GÈËJxíñ WJäxñ^‚ím¶oÁujÜ=ëÎS ‰À¥ü”ÙV7D|# /´¹øÉ»¿¶»M$ÕÎõ6ÅåÉvLã`ã9âBS²¬Ej/D7Ƨ×Ö â4ŠŠùSûÞ} ;nì–æ˜\à ïoD_п_Š£™€ÀXD5¨$¼MÿøŒXb¿‘#Õlÿ³‡„æŸãtÖÈaôˆ!ŸðóãïàO™\6¼ü[DòVo“]µ±Ä{†)@À¿vÅÍß×Ì ykSTâ $ -¨ùá6æ+[_%(›Fh BÖMcÂÄÑW[;à±Þ;XR_Yno$éûÕD„º]»É^Kd&)K?¼J¬£=ö`GÀÃ|ÝÏeø¸8¾>YÖÛyƒ¸ºùƒÈ\ÈþÓ®çÐζµôÅp~@:½LdK-Í<›OÇÆ{_‹ˆýÞ<¿£v)/”cÜËöÕÈg‡ÀG‡ëäøKCýÝ|ìËþ\ýß~Ÿ¿“ñø? ׃³™—®…´ß˜Ët««¿úý<ßPô§±)+ð7µd<Ãç•ôQ¬/@qìáïñÍÛ…Ÿ?Ë/¯3œ=¿ñys çf ðe¯H×~aµî¡ûª4µ3%åIÌÿ¸-¯—W£ƒ$Mÿsžè—<Ì|ha³âP¡øVdvù-DÏrô´ þÑþoÛ™4•f\'ðô!ÒJÞRÓ÷Ø{Ò~Wš½¯6g¬>žÑè Ú¯ŸU¨ÍÔ¢‰‚wýÊ à;^ ¥!ÆzØââ*À”‚ ƒs–•QòGXù>­õ>ˆ¾á#6'Ç-õnPpšÎëú!î ¯£†3Ö">zSŠdKý3FЬº•¹¹ÁÄ n’ڼ΀kFè’‹íК[IÈlÓ EÆ“/IDÌ7ÍÖ6%f} aê%ºHà FÄ(Lb¥¦$ ª .;!ói<j&‚Gqn¼e%‰vU=‘¥Í@¬1˜ÿ¿»ø~úñKç÷-da–Å+óHÔ3zÝà2þ/‚ìZ\,­sA—²’n5nÕX´4m;d IpdŸD˜Š_ëÑ2ÏʹæOƒŸIÖ`WTZ¥)Uá9;Ÿº“u™0ãÙ)Iž>Jƒî¹·‹–ä¡n·¾®A+©kÍšc[l9AÈ≃Ïð‘ 룾G«Ìèðî6òÀ $ˆ4Ó?p‹©6†¡U¤þÌÒh8-d€ìç61ùÿ¤¬6#Εa4Ù}l©šŸŸÌB/ðý×JLøÎ&qs›É&?²Ç{H#IÒüÿõ[NŽŠæ;It?jŠê#ùùY¿¸ï•cûùK¿— tÑ0dvo—UÏÿžÓ#«ÕsŽ4<@Ÿü™ÈòåN‡Í†þôǵK;þy'Î; u o´àù6N8+ª (Á¹O¦ÿ ˆpAOyÊ»zöÀÀ\_íøÏ§Ág'Jÿë‹p·0ò&ßÕÀsðEÅÚŠŒ}ß·õ Ïx ýõB òö~OvFË>צ×Fv¢Ñ¾È/Ns?O¢O™Þµµ‡|íññüûÿºþ~Þ®Mí~Ûàoð1ý$IÝáŸôq¤þ’©o—“÷ù;òYôŒD÷ÿÜøSþžÐöþh‰÷Äh”4&ëÝ*=qŸå’úÓýhwl¿RŠn÷x;ÒƒƒÑ[;ŒúôÐÓ„‰æï ‡ïಎ9HòüÏúÙçÅW÷Ìðo1>0¸½s@Ãíæ'ý2ŸÄž .k_sŠök†p„ÿ §öÖOÔÁ¼À>Xð-—°Þ0ñ¡V¯ªZÅál´p¹4®PâûÕ»ÍÎÖ~ý±žÓ}¢ð¶äÊð_"W9–ébà\xˆ×;«D8J•Øç jû7 -ÉåÃiï† Ñ–øä„"ÀÇl:E1¶Æs&Ð4ZM­»ûg‹ jÁ§Án#n=ÃåÍ×â"®ÚN3`Å•l·Æ›KgòKÿ@~ÎõË1Þ  V’ÖAÆ.MoÓ|7Xóâ/¢ñÙ³åÍw+Ó©î´€ËÙŸ{×£œ }žÓCÓÖUÌï`†¯7E<ÞËôE ?¿¥ú`´‚NÚÁ×Yúx. \OöqÑkRb}ÕH>’ûŽ/ê娶Z ®Î™!?g+¶øÑuVÁDpèå˜03’+œa¡kU$å °9cw$wk"XH®û£öõZÝ?Å0ˆ5”¸±·ükMX3µ¥-®Þ…VÃæÎ[ê“É5vÑ0ÒÙü†é7-Éñ:46Ý»%<ˆ:Z¥)žŸí_&Œe}{o&¼žSÓLå¿Æ0öÚ/‹‚Ý¿ V±‘ª3 ›+>‘µb<EN 缓Ø?à?ÕÅQ=[ýEŽ>µ3Ë‚ó¥6s¹KŸ©ók’ÐÔKgƒ7ŸL{å€@ÄêbÝçåOo CQ©t¹:[ÏÀ©>cwö'Q|?R÷p¡ <î=‚qú>ïò{¸l“Ë._½ýŸúòÝü…¾—PÀõÏø߃˜¾œ6\˧ƒÃG€M=ë¨ð!å´-ç7”¼ÿÙ/ëû¾jû Ÿ1•¶Ç»êóŽ,¼¼‡tNd¶ ß/•ÒªØ’Óø~tSD¯øÒñMØeÀRð…´N}²Êõ ädAªJÖ$¿ PBû¿yá«–Ix8ü&ÍöB…¯i dߦ_™´üR{ÉdBóXУÓðø²­ &Úó`âsºÌñæñëÕ퓌í¥}âÉ[¥]dŒ­Ð½Q!õïz¾*s"LŽº[¹ 7RW¬øÿ½mì«Ògior Rå#8/ÒAÖ°*§;iÞ3‰›iZ½Ö)þü®ì ËþSÂðUaåÕ×áŒpuŽ[rŸp&›ô®]:H‰ãñE£“]ÐÑ<(å¾n¥?ÚZDZßkà´yR‡!'¯ d³Æ¯ã+G}NŸÅüí-ÉÛ*Î÷à,_#3¦[Yû¥ä¬Üc„D‚Щ¼o . tÈÓþlüœHÀxÿÒ^FÍæŒ!dúº„áëãdûÆ öZ¦ þל^-£<âÈ„a7¿7 FöKmyâO«±r¯WÃØ^ß¿¡â2xÞàíàÔ…îT2¹Ð¥ÛЧû¦6Ø5~Ô™fÓ$5 ´j‘ò»j× §. K¥s)¬‚ޤ6è=r~odL’¸ s¨=9*¦,—”+`– ý“>ÂAí 7ùí}Îæý|ŽWþî¢EÒOcÌo4ï dè¤PñŠì+~ …@ÁïF…¡Ëíî?ì;q4^·ÇŽïOŸ¸ÑZ^¸„ pö:\ò²&gMJ¡y7õ‡¨¦ z—”ÏjÝ-G_ƒÉkúÞòÞIù/ÓÌž°w:3š…_´^Þç|‹{³’$uÿf¾ ADO<ÞsRï&È–¿šÛVé;Ÿv†øOzïê2ßz|™¼.êåø­òj•Ì„)àW»%ä0Sð>´®EÔHc@¦¾pv~ØÈm'Gì‘Ì0W7Ê Àð9DÏÖzXè}þÿ›OÎ&;˜‹ÑÐÓ?ϵDUÓ‚¾"£äƒø‡›NUƒ¢†ÉßãÌ~ØRá'Û{üéZÿ¸þsÿòñ¥§ù†w¯ý—óŠ7wç@Bí~Iþýï¿»ýo]³ñdûk»óñÉ÷üOÝü`éÊÙÙx½íëö|* ¡Ûþ»Ô,¸ð‚˜ýyRtK<¼¿¯$ÏXwWœà J-;aôÚùLöûË=`«Q-l×Þ÷÷­3 -ÚÖì::)6QǘͻƒòÉøœÏ‰Õ~÷‘)¾Ÿ/>Y:MýžoÏvÎq<+u^â|+DüZجÒl»–dB%˜«Àc×ñô,V¢û­³îŸÞVÃ=M­ò¨÷± ¶|ÉñìÌÍa N©O;òÚ/­€»¬bC<€rŽ!7™Ò%©Œ½gB·yÎ%¦ ˆ37£U2 á:ýÞjÁâCn'‚Ãzýñ›Í7Éa*"yª"OÆ82±9³B9M§âGÌ$]XÏb0-v”gÀØÈ°²?ŠÈo.ˆVQ˜„ Š.V~é„d{)ú?.Õ²qrè¥l:mUé–ÆåÑ!0Û·ëÛ(/Šóܿ䝄™þL(ÞIõ¥/¶¶Gûq’ó ‘B™Ë5ŸÑWiã·µß +°¨ä³š˜±ç9˜j®Ä‰}’†çA!®ëëÎð™VÄ„üÞ¢º|ø:j˵¥’Ä©í¤,³Eú­êØAá¿Ç ¯]˜$¨ ;8ÂãcÞ“üSø¬=¯v¼\1+‡·VžÙý?ÈHúzU´¢¨›^zò©ßs¦|[8è[—ƒMäpyÄС¹o'‚rç¼Uìš±â]÷IöŒ’ã3œ–ª¨Û‡ýW0øÈf2>e?_4ƒe¿ààïÿ ¿Oˆ_ÝÙ^C˜ü¿€áoßV/õ¢7Šcï;ö¥ræ,ìáͧq¾¯£Rž=Ø•ž=žÆÔØ£FxÁ ãïb@–÷Ïà+®þ½RjÇC÷m«HÿŽU’ Ö\Vb¯ùŽ»Øb‚ Ò«ÔL?¡äMÝLæÁ9tUÙpµ&EH0R‚<û‘¸¾0á±ÉãÆôF^tóÃï%ûJûcÏü»EîG}¯óÍr#ûVÕEÉ—ø?¨¼”ôŸU°|g߯š—„ãHl`³>¾"ø°øÉ"˜#ófúb∣\þË£þ'ÏÀשdĸˆ7Çߢ1? Ê3ý¶¬Âãͯ¾:Wßç+hÕ.ýK˜¿^ïüˆ\´¹)E w±‡ÿîÅãB`õÀW#Š˜™Å·Á Ä~^x³Ô[fsެ¥z4VËG­úaû{[«uµ–ó—ð~ݮߡú|Ïrý Ëu7RDh ¹õ°‹Ò?ëÿP„=Ýþ¾$g¿hÎtntUV›<~.Õ-üÃVç=Á\™Õå÷ýïWê+ZÎþ|ù ?ÎýÿÒ€ÛçÖ?¶äp»†Ó­œœC—ÙGÙØ¿ì×·êµÍwËÿ.µœ‘•RêvÜk“®"ÉÓã+¢±üß/l-þk[7"P™Üí{{&E1íèþÆ«sµÐ<Î{ð£øìOµA)•þ_ä‘´Úðñ §ÌíÅ?œ­±ssx(„},b›¾ã?2µääG;ÒìýŒ^á–ôè·éîE Î×ñ•ð—HYñß¾Z”â‡xÿ+«€Ç:«%]†rÔ5ÈìwmÊÄ qþ½(d¬>¦¶\ ²ýuÖz/§B„1A•Å-ž5d´È5ÿ…Âõ\1’ç?ˆám²UÖmbÁò.EÄ» »…Ùý¼C2jû2nð{õÅèMS,=½|ßg\àÊ_/Š\´F…i… qþ$ñ9¿&õfÌ~¤ÚØ“zË‘jŸt1Õ,]8Œ$µõ?v$_Ïæä«%·gݲò± Ãa;Äʱáq1¯({$?'U ]„?G‹s°àÍhÌs½Žb‡ItþçzjÛ` ¼ŒûÉ+÷j W·/·}oy˜æžðÔv1?vtYL“%í€+ ö.E°Ÿ‚ïm™|Oä¿6n/o+a»¿—Èþ²aw©Å>¿îòõ!ÄUô§ôQßàÕ@ h³ð\üaBè`¿üÉ1í"ð y0òx¯ó‹üÏæGñnêöMo5!¾ ›‹ÐÜâÕ훕®hôsà}öD9å‡%ë´­Ì? ?„‹Âm<*ýmsÙ}Ž/2›Á›µ>ïÞµª‚(«÷þ)ø¼øQbüÝYrøFà϶Á¹T»·ÓMÿŽßð<®l 5á¼y±Ý¶"øB·¡,ñdå&x«~Ÿ–5¾¨È:VžÆßG‹;OöµñÜ%zZyÍíõ¢ûçÂ÷ã°%ºÎ‚Ï/€í°|èÇÅëþâ’ägnpæÃÑ™(\ª‘ý´VbW©Áƒ _rwA)¢¹¤ÚñÔÝu*lk†Aç‘ÊÖ‰Óã#á,!Üð ªB··šmLÚo'_~–bÆ|–]ÑO‹Øbà;-0È qƒáº\[4·Íè­bü?7ú“ñ¯®ïŽõ§u6NŸ kÂýÿ;p…ósî—Òk¦Ç‘ Âyùù;óÞD8¦µÝÇ„ð¶F±ƒ.ÖÛÜ‚™ççÆ’@xZÓpP`ƒÊª@ñ™[…zï¦O»­O¹t1 0+»õñ’X™NùÃñÉ=J”~?Ò;›W ¦ÚUÞ[üÈiæ”+ [·ÅõYþ?)]8™[Øñ "iÕ—ÜEý ‰Àq'ÏÝVo‡šz9ªûþ¯¹{V$vµ~úž ´±å•Ÿ%èže­1ƒPÕƒ¸Üü› dôlàØz8Øþ•w&Ë‚%æ?×ൠcï&n9—kK9»4:Jßàw{’EPO\ªfÈ#)·G?C8ÿ:Ýãqø¦˜ênk+TšK(„aX'zPxé&Œz½ü1ÚÀ©FÑa“[j·õ"\KMâ´…¼Øšäø {Þñ<†¹¥ûž¦¨QI4-nãÍÓÒ íjóÛ.JÜ#£ú ]ì=Çàƒýc®1>£À+8Ã+$z–ŠÛÅ%#ãÙ1®“Þïv=82t¹ ]Ã=ÚÆPÖñŒRý94¸õÏþßÄιñvc Q;ÖŪ·ÌP.·ãçèIRúQR'7 .ÁG©ÓRÄË[ ÏÒ¯¼µÀJ‚} T‰)~ä|¾Ô7Þ.Èû¯`·®„˜Ð„ /Ãñ–KÞ N¸I³ã7ÇäâèØ½oÙ±?ôÿÍø¿Øaÿ(M‚?ÇÿŸŸæõüi=º¿<·Èõãø9ë»göâúýü^P½îkÆ…¾SQ¼Y£?â<(C‡÷Cø~­pMi%ùÆÿGî yw³¨^q÷[ä½ç÷þ.{Åvq‘õž¯Éz/Ü÷B[]_oÅs¶aJ“²×•²„ÛeD꽬_LEgþ ¾‡å›ã`õß·ÎMáõ|>£ýñû:£ßj¹&&F0ß·j'ö«ÔÞÉHçÿ†ÜÃÝSà=®Õò ®Õ“7"ŸóðËdÄ/äø??È'íaÍN\/hÌú¸Ã_'×â¤O².÷'§xûí÷tõ®Lß)xo¡Ço¢÷íÀgÐ…Ë&nåC²×àŠÃÊêpNC+ˆîä?W4ÿ»)/ÜvÏ+KÃw #“—›“¨:¨s²ï‹ÀQaÄœö~Á|-^¼>NI6Ñ.«bìhÊ!ÞÓzƒQ7£<ýšëù?>N’þׯ•,ôº¶>k¶™^ 2ÝM¯”Š–5> ‹ñ÷¢¤L¥c‡½‡¹Ýƒíºß‰HÕäºH’…säÅp² ðߦ¾‰Ñ5¹t‹U+²BNi‰ö"€;~ßD—׃Þ£âΧs,ŽjbÓ‚Æ0ê*ðÍ™ÎÞ%~>E‡%ÂÌ–+sû?LlqNð ¯2\×Çþc¾ kßOpÿ;¢v©bø®Ö°É]«‰òuÆ®Ç ‘OÜ b>–h*F…|»Æ©z™……\/vé'—ÙÄʃñR™‚· *+ÉBÿï4¹->ºn9>V³é"ŽCíÔúɉ´8Sô…Õ5´Ðpú±Ÿu,¡Î¿›.~ýÍ› ò×yDô•g6\©›{¶b3ñO'Ç€ñÇôQY¹rê¶/Uõ©göqf—^þ ¢Òð¥~©”]q©.Õ4®›vºñj7nS3w1KŠó ‰&7®‡‘áÇ©Gf0ø ñ¯¦>9%äö®5~ØèáèqsJ.ÎQè™÷%7¼<öaSÀS çýýRégÆçñ9‚³¡’±xmáîÿ‰ö:Û¬/16ÛïOy+…GýB^¡ á^FÀ™pa|`1o<£6†Ð{Øu-¡6·ýŸÑ§ajñ[áO6¼„j½ËiÆp>¡«çW }{ñõªü`&ÕuBï¯ÞIëß›Î#ø¿áü}¢{…“ý⇣²e:ýá|>Û±;ûþ7òš=tø æq ×½ë‘KoÕ®8íy&à!#¹]’¤ÔçùL¶þ ýÛ½ŸF*r3¨|wd”föܤ²°%”SX–#]¡î ¦„ï‰{u\…ö«'»öûRéK'XìÀuL$Чř2§^é‰ÖšóëÿdÛyðüÙç[d­¨Øøv[Êi\¹ í›Ü"Ä;¯Œ_¿nO¯ß”?R¿oÓdû@3ÏÁuÝL̸:µµåÐþapcŽÇYM£®~$k·á£t;mØúÉílÚ‰ÚØ6\qàÂý¾ÁõÜ‚ÞK†¯Ñšh OjÙàÆol;’è–›šaëЧ/ ^0ôD|q\s€—¸’çƒU¯àÕxß$ÖYâî·k‹ðzSþ\vŒguù£ž7× ²>QÒjÝDáã:ØŽé§äm»Ø [Hïó;jŸU³ïƒ dôøwn7ì¼ÎL$”X¼™GoØû>}LBóEÃþ8ê‡S¬¡©3NÈÑ&¡rc»‡´­‹ö\×ê¦Î“ËOki³·¨-øh‹ÈdQ›Þµp¨¼ÆK‹´þ|>md$Þ߉ïãB¤©Å‡×N7*´l6yE0ëccÄ)ŠpÁ]Äмâ†Ì (—)ö¥‡±ÄAÀÕ "¢`ð Ìl·‘¹Êeh0É›Vuoº3\´«ºoÃè©¡:ˆK<ì=»Cá¶v%ž ¬]2¤üAb]Q€—›B{,ò`Äg‹ðº‰gw›¯ {eæ<ÀÇl\´ú¾î`Lù…Íz<7K»NªŸã(gi¤ RQ|Å– êã¶!&^Y¼ûËæÕàNÓg±¢ØýÖòÕŃƒº—1ÁéXÂd?6Hà‹“Vµô;0cS 5½ž¶›Ì¨üÂdŸ€˜¿è k!rÕ}ÝߘA›ë õrÞX½k”4b5ö·½Þ¦‡ºØœÝœ{ÉngÒîÚm^«ò˃gûÒèíñWû¼ž]°yJøIQÓÈ«™Ìá Þ&OÙâFgù°³÷­Qþ{?þx ÷“Ÿë*¼_j Âxë(¹]ð!4< Þ+ö“JS3zt>Fa7¼<|ع•ÅêÄ¿ÇymßIégöÄ—T­ÊŠéÔ1Ú±%ÇDµ³T¿ï¹F)xrŠR|3åC·Hnf¹•»Š†Q܇˜ªã¸wK 'ÖŸ7Þd·ðCd?(‰Þj™Ú+éùOªÓøeQvìH6¦ï¯·ÞE/è*¶FÛrü±Þ\žÏhO ÿQüýRqàßözñ™‰ 6¿¡ÍاÛáÆ#‰ìøsci‰üx“d_¢PHtÊ}‚æÎHAÊ[:ùä›)‰óO›ž6LËêi*ôƒ°Í“‰íåc8."ô3AŠR]kmKO¨¬))ï™ãñ r« ²@̬Á&†‘–)µôÌÜM€mšnqEKüûÄò̉o,FHÉMø"¿oLëT»É™çÁ[ƒšR¸B¯çWùÏßç‘¥8[£UÙ#VíÕ€ÆÍe8O:Ükßd syU!¦µƒÓÛÑÍ‹Ž¾/E@‚Ø.oal…v½IǤÓLÂoÙù: 3ÏÃl¨1!ÙZZÙÆª¥¹mMàeïà¿'?¯áœ28…0y0†¸BK?û-»ƒ8߯]ê6%…õÁ™ˆŽj¸µÉ2áá ŽmÚ%*SjµËÆÆ RÁ¢Ÿf[Çø¼³r +íí^^ãî½Ç…X<œDQDZ‘ýnÙhaiõDZ›ó¦¡œ¢ÎÇÞá¬û¬æ®èòz§[ƒ !WšW”?¡îÛN茮]<1ÍÈ‹uŠZlÀ¦ŒíY”2T}Õ›Š+ÂÈÞ´Ä =ëO±’÷‘‡°£DGÙíe:.;w÷·Oq`ÂDGÕÉÚ»Ô~ûw× _ôR~Èð1»ß¶OAJ\ÿ95žàÞ=«Ddåí_)©U‹DKõrÉÕêýµ ‹‚,ɶúr®Ìœ¤cž6©’ú¹TçxŽ~fƒÎzÿQ©«IüÇÞD¶Ý¡£3Iˆ™©?½™ˆ„&u,^ýÜ\d&Ë=ê¾î©Èi«CNyOt‰Çü­æ)‘«ßö%÷dÕ5ù?ºÂò€XÅÌ8WÁ÷â ùÜõÿómçÁ7^›‹¿Ùø¼†ëÿ9ìþ¯CÇ_S¡Qúü\TŠPõò™o4Ê ÿ¿_o•þ[ÿ³;ŒÜÛÁ³ƒÅ—•Ïø:€ðü³ÀWtøWï\^§º{¨JòZmÉ‚ù;>Ñotæ²Ò #.ygÍVõó‹×_Îâ~‡` dB»þ2N¸îíïV¼s^ñ5÷(ô÷7/¡¿5/yO}V¡Þ'Wax2ém=Êú–o‡c$ßgðç¶‚k(Ðv¤ƒdà~;×x,€òþÛTƒ -› Ó·Çv›ºjðôê=Ÿ·bÕð( ¼†ãpu3HPÑ+L)›Ã:¡ÜxûõÞÝ„k?ªº— ðÎu¨¸ƒô~°ôûövfãP´K÷1çñÃ'’&­iÖ[ÉGXÔAƒ·Bÿ }XrYbiþ%ZX¨­=ší³esÝ%}ÜÎê5v¸ÕްËÝäØx‹a̬·Ojîï{.·lî6ï.v¶^Äÿn(Á¨ðp¨óÜ&æ;EÆõ2æŽ|;€ÀI=/q{7Ú"©Mð (buðuQmÌÓö ,`ÚkŸû#µY,Ö °Óy¼|"…žÜEV5!óÂ4ûtcåÛK½–¼í1N?ÒNßÒ€B€B+õè9ËÌvøTèÜgÉÓbˆ$S”ZÕOŽ,¡îvbã¿É—¯Lø0wåWf:̤ŸÁ„Ñó€©eu?ûÃè7¾°ÉWs% þ¡LØ`Ú 1Áz§vñj£«¥¸îMx•ï^ä 5gVb´¸ZûÖ£_á?^äãÓÙ±u@^§Of4¿pC+ùŒ‚ñ¢ÿ”¾Sø_)^ŒèD¦›ŠÂ©ƒÀYÁ.ÝÇз¿ôœ~7Cª¯yK¸¶>½®;ýœØxDfî~TgÕìGÁbÈ+˜„…±ªðÍ"Üšy~§ò*ð:èóß§!™ýÑBå+€šòµ…Ñ&Î\¿G·«'ü^^©h^ý9øÄ¹vùñ×ò«ž+|"``ŸÐΜÓî)i¹~C¾ 1vÅå+öºðrùü§aQ¹Œ‘~þþ!¿ ‹ùâê£zŸó¼p?I7Õá¯Î8 ©s»ßàú0~OóôøŽ«¿éCÛÅâ«ÙÙŸév>ßÞ¾¬¾¾ 3•áöËsºJ¾Û8zYûˆhÃÈÕät3ÀÿÈOc½#d+-篧9Ÿ†û}êÊýqŽ„8Âgžƒ®kðùàÄ{y>Ø Êõ^ æ7±ñŸs^þ>@Ùk>cAìõ®dê VA…¾³6"(ÐHN–«,z Æ÷£Á»q‡s£Í`÷Þ9F”©ì Ýà1>/¦;ßåÿ ¾ áLi–5kÔêÿ€}\Ÿ‚ÿ%Ñ(G_a’Îjþ›ð‘÷pž!/ÖËØÇW]AgU¶L}®­é  lcª®A¹WgcÕ§Ãy… a`Qá §B]¤ÛŠã;̘Áã‰3î·½H¶Û-ëøÆ‡ùy†Yâ1ò!Ó^M¿°\57Çwte§ÅÐêW2fñ\Ë"å_¨RX‰il#Ô§)=iv­ì´G5FE‰Øì÷Xý¤»Gx9s¯Û‡^ªbÓÄÕS‚c~þ þ0]f@þ]ØÕãéߪ´­`Ê„ ðô~Óü9œÓv€ÁϺW -º 9»ÃZ«¢sÌÿA'ôB˜ ÑzhC>Ð8ö~Ë6YγKîî[LáB›p¥ú¬ÈE ¿=Q3{pÃcdºµ«º¤ø»På"V¯Ïw©`#P—.¯qûøº´¦B…êc% â Þâ’wBe㽨ô· “К?ï«ç=‡G¿ayÕøÄ‚Ôó»µ] …„hõë°»Ù«ÔŸä[óê”±ƒ»´Kœ½–ÐX¦ ¡ay#›2â„ùpó‰CLÜî¨Ô–ó˜ÇGv³YKG'TjD¤7Õx@×£åÂ=ß»Bl¹¼ÝåAvÛä`èìV߯táFÚù›H‘àÞÑíoú¿ÃÍÓƒ‡&œz©þŽ] ö”V˜„Ì|zyÿ?IzÿŸò ¿ód @ï—å§ãY™ÝêæñQåìßíg>Ÿ»c(í‡ ߟà|}î?Ã]§¾#jºë!ÞQ¢xwêìQ¯ý°ÿg“êO¥*¤äå&?—zÝ^VóxxîÆWÊšBòìHˆx×-K·ùšúÐûB­æ§ÚÈY àþZåUÊÄTOp€Ý¹ÉºôjmñGÓñ›Ò„NÓð)åÒ³ápòÍääø=y1õ|,ñð‘§ö 4ç,ŠU7Èï@º‘[˜EëÖ‚o 4pâÇB¡G[Úu,µ§ú™Ø…¥­g‰-Oõ:_°³þ—´9Uâ¸d²çº“® ÜÎzÕ¤D‘  ;Œ"í¢+'ìã¿_y‹‘÷ÿ²ç"žÔ:xxö¬–eí8(à&Dv•(y2]^}ñ|燣¢™Sù·¨ öØÈÚýA#.‡d‚ÖÁV b"èŸÅ·Ð¶Ý>”;z oåE à¦÷úf¥ÁãÿY<¦s¾¶[ž4¥©%]†®g0Lc¿rÀ>ÅNÊßüͽÇVÙ3»_ ú9>ìÝê!?m½‡øáT³9å&í5y?£¸2ŸÂÆlÔû†_ãu/Ñ´ÒøóY’ç’qAHêLF—2¾3™Yâžcðc6›P#¡NÎî¸&;uÀ¥jùkEšCUBXëý®‹eZ‰\žðüx—òqsïô_Sª_·~ vZc(xPæW2RfÈPé/ʲÛë”–­9$ïÑŒó@J1¶V­ç>ð‚+¥â3ÚÞèBq®a8ÙÆdˆ@ðS˜X¡Yë1E­& EÝÍ´P ŸW±@a0 ý£SH¦õÑä6ÈA%C©#&›u-}üSµe©bÞÑ×Ggè Îf8#ôò0’’øZã´7ˆ[Ý/¾0"¯±š¾BB“³}4\Cж7‘Ú¹ÏE??Pvi¬^®—aö«ÀÝû½I|ž¾~®µiô3õú=wû{w™GåËéJO5ÍØmæ ¢@h<*#üïðvîS¤Í+ôÂ{ü—[>•|ý\0ù¡< œïä/ï›/ÀEúXêæ¨–׈W5êßöÕ»¥C°©˜ÕœNÈ)má§Í=%ιõb6÷ñ^ýÙ§Ô]Ìù¹¤og ˜Ý·”óL$pþþ^f1~%U/£ÂHD ø\ð/¯uˆs^†à°Ø…WšÇ5Rüs¶°Gåýë’üg/úŠ$9~ 4Ýn÷2x²•¡l§_s[ò”˾VîÂB/Û`kÅnÂÈ×ÑÓp­üë"‡–¾?¬óÒ²/’“Â/¦Ã2Î>÷q3"`Tµ·:9â‰#(VjŠt5%ü0Z©#¦põTÕÏj—ë|Ï./÷òÝ16à´4 J± ß”^;u•)wx)àŽ11Mò÷^Ýû·³§†æç ˆ€îeÊJ¹að¢piWÒl%ƒÖ=àq'ö§%|ü¦nyœz=çøµ3¦F:—W†äW;13'°4ï¢Áyˆ²µ*ßÉ­ú~º”5wÄYì¯Ä_7Rïü=iðÓ×uc§O6 » ¢í× ü†û½å±ÓÓ¯†Jã žã‡IŽ5ðëÛÆ¯Pï×Kت5mîïS÷Q)µoå˜a5|Q\ðIá7(ÔA+Ÿ ÷o/.ÇNþ‚øžP¤¨´×NÎRÇÚ¾}¦ôYÚFYêJÔ3¤±7:™ Zh=FL^ZǨ_äi‰Ho 0/Õ5Ö'Ú®¢°"W‘(µÀ_ð¸÷]ÆÕ±ÀЀ!À›´Ð—<¼À`Ò¿þ{$xÁ—¼årP‹¤ ‰½›dFÖdŒ÷¥þU¥„TJuÕc{-$¢çõ9Θ4{ûYÃÌŠÇù§ƒ îu¥ú¨Äæ欫1v.s²Ø+ÂW‰‚ý"i«`9ðXõßê_úø¯ÝÁκçÕÍçoˆ}1¯Äp@ä8mækÁó ­D a£~²Ù¾à¨ßÓlì¶d…ŸÒt³0näRÿ.ôýk—­3s«øÏÌ><úí[ô|¾bÈCâÓƒgå[ÖQ^« ,•Ï◦ɱwÕ#c£¿ª<@ªÝøØW­&â‹è%mØïà@Óà°Õ“ÏnŒ¸“âóŸà_¨Vöv¿à drx“Z`'í'ˆNSy)W¥ `÷Ëùü þ?p¸>ÞÏÇÛλ÷pæý<Ü~~ч»Í±üâe”¯ÅÁrûty àïï?¥»xàOEàúµªF­»Ñî°_ìòáZÒ<^g |çàáÊ (µò§õ˜<ßnœ2Ýͽ]Çôfê½w‹¦O5ïþóM]«ºðì"E\Ø®F4gnOgËïÁ‹È¯ãnµÚ¯ yfx·kɰn@Äam"#kÝB„¡ÀÝ’ƒú £¹( œ±};a…õGåÈðºI)Üi™Î®Ý+¡q9Ž‚Fy÷çùz¿Ív¤M¨ nøßR×yBöÝ.íØ‚+ªWeà`ÎÔ3kS×ÅFÅGKbòÁàÖ€}~~–:2Vž²Þ ¹ä™z¼ä»€¢ç“ôàÔ+ýµóWÑØÇ ¶¯Ê8iÜE3háp†plÛÆbÇ–äLÆÙ¨¤©­9jÒ‘k¶Õ«-p¶b•§&­Xq Œ‘1IÛ?%1HdV2„™ïês¨ÿ7y³CíW÷žÂëɈÂmu¯e!¶÷ºÏ);€¶M^?ÑÂlw¹.@ãÑðþ 0c.x+;Ÿ5Kñx;‡ wO¶FXøƒÈ–÷µob¼ ^÷8.¼a5‡?ëu­WÝ_™ÏT9T~ÙD¼¥ó¼GòÖ46Ð:T¥ÃŸ˜°î±ôIÉ– •€©á—þl6à9ŸwO5[ŸçH~â#ÔL£Ãn «ˆP}õ­› ×cù(EÏ÷·á(/âæ*¢pÖ¸H¹—׋V[xòç$÷§“EõÕcƒ<n`à¾?3Œ%~ÒGÞØ|xo¤Ç]9—ñƒÑÙ³3$&˜±ßíÊÓNƒTõfŽuý'ÛQÑà5,.&ôA¢žÛbs9ÝÙ0ãÿ”)~+w;{z‘¢‡•ý£iô3ÛQ´É4™¦øõ¢óñÒ:l/îà¦̰%™^°•7–ÐÀm€ûÆr7Ú²—¥‘ÏE÷³ßL·gfs¨¸Sàé¿ Óãqód„EòÇ­^yΕõ"©þ¡ò¼âåtVyr’zþЇ§<&…oCØ7Q›{„&Â@¶[àõüè(ç!?ð¥æ9φV‡ýã/l(ýÆç¬0«êɦ5µú×,V8ÿÕo÷_ÉÚK3Úù½ùÿYw>ª"çÉøº%Žo/fC”µùføÜzHõ9ãøõ¡ƒ}ÙHÚÃ?²ù™÷u^Ææ Êã "åùGCòúR›Ÿ[¸cˆmmpã [®/o:ƒ’×ÛÇâÑÍ  P϶Lkºž¨áøx¿¢¼oìºó[ôy{?¡ÆUsz¬ÛçϿƩ |PìÎ&|üü xþ/‚g¸?Žø3!ÏÞºz.\Õïxàmëúæ[`„>†¿øò3¼«ŒZ}¿”Ú[ûÿ<Ì9½Ãªl1tú|~ŠGtŽîZ‚ïã<ÏŸø³h#7…/)鯻ï­V.Uxü“¦'€¨€¿•Íp­¿ƒñ-çäðî÷½ß+¼>wHìœxRó T’Jòø¾þ ›g?ÇÚwðöÍþ×±h×ðõðýúT"·.qÄ_íäy!l[x`²tÞ)2‹(Ü,Y†.ïÀ¯ÃEÒplSý{Ä–«Ì‡ö*$60?Üã u \cv-²¿ø ü„vd†y3û¡äöóvÃ&&\œã!ƒ%ÄÌ#XFO£6ötåŸéÔ´>ò+H·ø^ÑjÍD?ïŠs^%¦ÐñûÅüQR>™¥è c‹oPüz[øóž»]‚«{=€Ÿ_ƒÔH›ð~DâWMÚÀ{^~›¡Z"ÐHFÿ‡:>IÅ£±G’ ÔÄŠûÀÇã|ô*—«å¶(ï`pÅZo^°Îâ3ÞSWñ PÇä.êlj}¨£´hüš.â ¾ÀÎ Q ¦ägBé|¤S’¦—MšµÓ—Ç÷-µÕqØ@FðƒƒYU}Ò öf&¼ˆ'ÿ+r^ý å€ d‰Búm+þD{Ñy˜(ñáÅú­” •V 3+ù|¤.=Ÿxë\o3žàhwûÌþ#úÊÍ¥R•͸cÒ4…¬ VâØ×_šÈ!âé…#R dos…­@|ݼ]=ŠoK «üÈÅ#E+zˆà±µ3++ ï½hÜk½8íÚÈ¿‘ï„û[ƒ´Hx~Â!× ¤>W` ¥\Hûª·´Ž›9¬]ÄÛ¡u?B I6lƒ©q¿Œz¯d¤’X¢¾Ó"¨K(zêé8ù¦¶(ãCˆëÏ=}Nįˆ;ÄÏ}íÙv¨*íüæ Ixï`\òÕW`væ¤#«KøƒÖ‡¼ yºÞ3 ‹Ü,¨Žküά5ÝL!÷Š™íœFÑ„>Ô²û\Ù„ËJD¸Dl03+Ö†Yò±.ÈHÕ%Ñ5¶¢jq*ny2Þw_«ëEý§j˜öѼŒéè¢Å/ÿK¢ZÇã™ú%’Û£örÊAgåâIOiøÈlZ'–1­sÛ°Y¦q0SÙ¼ˆb-ð¼îMôœÙ <Õ¢  5çûü}Vušõò4÷¬ _å¦Kõ»0ögÝnvVÍÍ´ŽÆ8Ü6Ögdækm‡1"Öä,FñŸ›F1ÝÅP\¬Œ–ýfTZoèûöøç²¡áE˜/Ïéÿf´¼¶bûî§Bž1E¹Ø¾ØIÒ Bt$ô`ŠËš÷ROBʈùÎG #jX˜8ƒ•R¿_ÅûgÂÇGñßLÝTÜOÖ2ûÝRL]Ü}H òòOöѽÿ‹3|i+Zòƒ{' ‹iaMד‡jÝø|p Î0ºêŽÔyiq€OèÃo_F[{ïð?û‹æ\ÿâç ûÁþq8÷~ß•2~<ÝO•ÇçÃ@„Ò´jGîf¾õ|Dwg“}è·¬’Ž{ رÿ”ü¿‡ô|a~‘¢ã¸gVWÂ3õ{9þmN]qot…‡‘Î#=›¿áòûÅ_‡ð|%| Mƒê9ÆþǤø²f¿P¾ºµ£Átÿ»E±ðgç ¶ÏcÒ{x¥v]â¢è»–ÜBgj è‚Ñw€óra»—Èi+T!kig€°×4\`>p¾ENüS”³ÆUþ5øù4ÿ~{^­¹N¶t[º°y‰õ^!_©;‚Uò#^«æaß䟓ëJ4z†ÿ˜µÿ;ùŽÿ=¬=\átí<ßqŽ/vòzô p×ÓlÓ#N(ú®^<Ðt…._ Ôg^ú¤`p!uá³WÈöžj¶´3> @òŽà Æs6l°:ù„ÂàG䢋E4 ^xVûíã}‰Z­@Ýh‡ ýp*ÝÇ+e¡º“žé_¼õÃN ÍZ»ñDÅdÚ³çòjnô¯“ÍwÓä5n«:Igÿ .Ö§às®>|_¼³ëÍ{ J ´”r½Œ® S ¼8£á1œñWoKÖXrÿoˆ%K¦8†[áç+•dVíL˜0$¼Þ¡?q±n‹…q¹ƒ*ŸÒNƒ¤ƒ2 ;5_#6/ðJ®~?7LKÌ·^^>cW(-.sy‰B(Âçá½Ôd…º¶­|ôc0½Ö­wË!þú;5qâœÙ™ÂÜ.ïñayÝü"ZBlz1•©µ‰[2×èY6e^†¨>@ÅÖB°h>BVÝHÆ2#@gšH­™F&ûRg_‘V‡£­øíAµo·Ñð+(™§¾ÓX³»Å.ù- éÿ((7ÏXå‚hs–03EÝÅß¶<[業Ýu|9ÈlmzõŠþ¿eü?§/ÍrtoöNLcɬjÒp³ºž,ðÞPJv4=S$Goþ,©’QÙyå-„ûfç$¡«Å€'>lk£y,êŒG®lt/¾ëRòت‘MÂuk'ŸÊÂÈ3$[µÇA>TÉÛ;çÝe×}ëǰ‚F˜]7§ºå»i%„‘ž® GªCÀ†žJuz=¦ù}ë­øˆŒdýAÎÆEgÅ7—©‹©PH!ü~€ô^b:O‚åVís(9Wê]`j’WT gÊ÷‡FXáiŠ÷lø Úå 3º:c×4"¹ßùÐ5™ò1•$·Ò§~ÿ¾Ùú¸ØĉÎÂ;voî`—>‹¡ZÉpÕƺ‹r4ÿŸ÷%n+˜2[7Òkß?€ÿ­S/òèqþ†zeà9CäíïÏîå vý Ûã~w³ ×t±Ûæñ¢c lÇTÃô5ï×íÛàò«Š˜e䇣ÁÕÿ>¿Ç'̇º'ûx?/æÔ¿Ì'û2Ò‚zºµW{}ÎuaëÁÛÝåúR@ŽÍËs}þƽߛ×/ì¦ÞÜÿ _!¯âwTr}£âë±_V§œGó~Èèöñóù¹¯ñáðˆ·Ûê2åo÷SêY« zs»Vy º]LJ€1âø»OµL—þ޵¥\ÙØ°!ÂxãM|¯¢ß¶ã󅤬R¯îäwŸZ_—ðâèZ4§Àuí„îìŃÒ}7ÓU¹¢¸p3eôËÌ®N@°xuy3ÓÁŸXÙ!:ˆŽ(0Ú”:ý¾Ó£kòÛ)uò-îÚp„sòb÷û·:Û·$· <Š3‰ÃðMÑíÎV>∳!·“™`N êÕɰéØaÁ>Rvõé û7MÄ‹õ½›¥ t1Ú8´^Œ8&•AŠ˜À"l£z­‡Uƒƒ˜x/¤A߸Z>ÛpDy´<ù è6V8 Ö_`MúQ¿œÚh‹~¼‡- ¾•Éòq`éCIâàâ-§^í·ÆD_ÆOcÛmÍã(4€_OPN"l6tzâû¬;)§ò™Âæ{yÐM—j·©1ï"íÛ,-Â1òçýÑhîgZ0ÔÁ–pH™n’ÙTsn(§Qì¡9ºù¯u#´O Z0”!Eáëù‚ég´>Ò~ëw"1dyv^ž ö…§¬+Ô+¦ÞNBÿ]¡0läÄ´×Án#ØíêC“ +Žƒ~¶6x°åâåÜjÆ W2*zTx^š»¡w:#ŒcÄN›ó€0Ÿƒd!+ûÙоƶ++&.ÿC‡ž§Å©ßlƒy¿¯¤^y÷žúX€Q¨Ê:ƒßÊðÅTæEþñõW@#0^­0²/,ƒ‚T‰ÜM7PãºE“ß`GùÚÔ÷ÍN~¼÷ø°X…û@MëLQm¾ý»aNò”&F1×ì•fñ͈Áºu¿T'ɰŨ†üPhQTEňš(PÒs½M¬Í$È´†¯¸SÉš( {ÿB¬í#2AK ߢ¤wË4g[=W=Ü€»’"~Ô6yçŠéhòÛH.Úy!zCÐg5´.ˆ!îÏKqXw‘ëOˆT~>²69'ïBÎßnøó­~5n˹}y»†|‚ 4(8§”©…ÐOr±ÜžÖuß*·»·U`cuyÐjx_!?ë®eáÂu¨„o¦ÜËiÎ`fåů-ÇÄÆïb9Pd&)”Ÿxÿè©Ê‚î1åñòÞ—›¶ÏC<âH£¦¼¡ãYÔÉ(wr!ëé…ö˜!·æ '!\óE‹Æu|8®!<¥Šñß›µhm"Xíc+¼Ð…E°í~rÓªž/³‘¥ëÅ8Ç_ôçKý}¿|q{ã{dß\{ö~w8?Íkì³åø9¹¹¸`:¸ªò|Xwy¿Vï/%Ztùuvx/‘”ÃÆTmB)£Âh_ü¢ôø9µ~Ú· äèê¤LšrüQ›ñ\ôÇWwŸrqËq¸ ЬOtëtÚÚY­Eð'—&êE¸î÷ž«\Ø?üUuäcSœ°ó´ œ}’Âx¯À¢ âvݘÁp‰}OpúâŸäÑ_G‚¿1ƒÉ禙ã/•¨À¼Íšîf‡ëŸgEÈ}MæÌÕ6´\¹k¿F&vc~@ÓCrv©ÅzþVI¼À;Gv/žÐ•*ŒÔ¥wü„ &:‘Y+ç7;”9 ͩ݃×ï“îýzí=ºó!òp,= ¹ÁñúêÉ,q‹T)éœÀ3 CµÞ¶RøLšq–zÑGùÅîè–›ð×Û©?·bœš&ŠzÂÔ>L˜@·ÅtžÌ¾- ;#¨{KÜ2¥ WË… ¿Q3Ë”^î‡MÂóÈÒY_›ås~«Û͆íÁðTÂ*ˆ^:®p÷tãú)¶ \Úãã°à% ¸$u¹Éæx¡á´l-”ÊIòÕÁÕÐÄ€¹²¦YPå árЀ«$`­’Fý8%,»”\…àP•7I¼•a=Ô=^ a­¿œßß²ŠÒÇÂK­Lªˆé„MwMÍfèBž®¹<í/¤A$IÄ»cWaw&/ôbòÚñ‡U}Ô“‘¼"S6ĨÒ9u >WÏr916Œ™BLKZ)#ÇðŇ­KöÕÿ0D>‚+Àç‡=¼ÙL²y”Lð5•ÿ¼lÂ.›U€¦§P¡„CþýwÚmØl'HOøeò¸SVuç6ßãŽÅmÃz´õ¸ƒZbŠ+&µFÆ®u‚¿ëÑ;%!ù2¯Y "ÍÈ âÐé]ßåFÚøL¸/À®q|WFd½í?|A3ÚëŒÒYø’êxlÒã û±Ë/‹©Gx=XèÅaß‹Œü‚\á½ Õ±ù—I<µÚc– sCÆ3¹LÀ< ޹‡QÝ‘“ãõw`*žÚ޶[` ¥ÿ…P¬íÚ$;û>.”çør2 y4Òz?VÒýqª”dÅ”œ5)þ<Ÿ&S¼ A¢ü©áNO{ϰïO‘iþ3yydf¥RÖaVh‡¨Ø0Ï«ƒº?v©C7ň6i¿ŽiÉÄÓ³·—‹õͨ‡ú?Wþ!öôx©ü2uò}®NÏÜÿ_ãþå‚ÿLüAˆã gOÏ6|ÿ' ÖÊþ¼°ù7g‡ü—ñøÅÙs´ïN~Ý]„Î/éý#òùúX¬ŸƒüÝÚVîåì"¯ÊŽmýwšèDSJªöÎO§éø°IŠ^^ñ/ˆ·Ô~ÊÇÂI<ÁYxù»Yòø9¿‚|iåás2à ¿ÏNø [QwJ•\âIJšQº(RÕÞ]÷kôìñßDôìj„€Â3DâW*Ô9ÃÆÇÿ´1êÙ—ƒNezчÆPb?˜Žs*\O'ƒ½"LR÷ßÃÊßü¤‘¬Ìž¬é fh{.(ãnúëp_b¼ný¤þD(½Kl'ì2ìEû„ã3%ñ4\lQ5lv°qž¹9'YlM̓šêMuV ¥ÆÞ¿ôުĚ®œÁÏ`0hr 8x Ê\ ;Múˆ Œá ÑÝA¡4ŸëO†ÇIv@Q­Ît¥öI ê8 þM·áA5•SÆI-¨­‰­µù;ªô˜«æ 2àz£Ýp3ðE®”v›[\‰^ŠÚ–õòbƒs6¿"ñΦ÷Úòÿ{£»ÅsŒÝèL¿Ü¸R\0ŸûzÍïÑ™|ÎòÏ• ا¨Òÿ>ésýhþØànÿ“Ò­?*~Þ#©Ž ¿»æw£„²Àí÷þßä0âN£6Ð'™ß7d;‹…W/|GòwšišðïÅý÷£Ð}œœþ÷VÏKÛÅ-ƒÚìÔNõÿ Nxø¼Q¿ðW›à¨•D*z•ð¯ŸÉÏ.@|ÎáÖ¨(³©ŒÇˆ 5–ÖpP@âüÁF^¾1ÏØd-{¾L·ò°ü=#â#¿Û¸û·½×nçKW Ù4qƒóƒ?‰>¸/Z•ÅüYEYDýÛ tÁgȈÍY·Ë$Êãé“*àýÅ„?¨dõ "DÒóª/øàpÊýQ2Æ—é3ÍFÊ6èâ¦Ó=³GIåvobjÇt~ Ç]äì펃í‚*ƒÔÝ ŽÞn¦ˆ÷„#†§â?ìg=d}Êfï+À_X2ʯsat Ë °7ܨAÓ?û¢ù{êlÒdÊdÓ#¦êÊjù—w2â߯걉Åbè]tÇ‹ïf@ö”–ÈïÜáXÖ a†CP6¬Ñ¡]'¯0æv˜)®nL=hþ 8G¿ýA{ø¯0Þù!½•Ùç¾F$Kì•‹‹+íVûm# ”ŸØb)[ÇYŸ`WimLa…åàTþÑn_Ê”„bwýÈ-l‚SÇDpzÃÿ ¸í…ùËì£îÜ6à™»Ð«s*`SعG^½ÝCRéÁƒñ~–‰'Ù ðgÍ3½¯©h÷îbõñÎø“·?;±2-¡±m?¼ºÛ÷8[Ï W¸|14ÝpŽN¦¥"H¯.2­Ö˜itª.#zóu»ÛÊcõš\ë™À§âý% ø/Þj‹²&Šá[-ê)…3Ë‚5™§¯Û‚Où™nM,–æeheb`¼‘Ù_²PÉØÊ¿â±SzßbÚÊé…µsÔöŸ|‰;ãoÉœÁ…åÙ>7-,Þ`Ù¤,¡qÿ/gF6Gí2]Lý»›$àr'%À k|×qÁ—Š)Y%Öñ„|Šnîíž30qál[àjL1Štü28°í§fPŸ(<„þ—pûæ(vÍ)èå¾ÏÁà¦Ã_™~2{óë)éÍí# C8vˆŒL ;Nšï’0k¿œPËÈmžŸùwÅJ®sâ´Šs]“ÞWáRÛ  I —f½$?7>åP¹2984ä÷ÝÁGìŒEñQ¾Õ«V>^÷e×Sëî#O¿eä…â?Nʰ4b¾0L‹|ÈÙ×όñÀyBnaŽÏ‚­¢Ü¥ÒP/-¦A´ºfJÈK@~@²ˆjâîGÉÌGŒ´>ŒS`–ÜËzcwî1^Oâ8Ó\6ý,U¤œÈ¸íûn-Øz³N65|›ûÜ‡ÝøYÄ#ˆ‡X~aƒºëDw9 ÄWìahT„ßvŽÚCœd·ò¥ÛÛA㳿µ=8öŽc·èþ_jÒ*Ý¡*#DèU)‡ Bfr«êÂî¶ùÓ÷úØÍËçs7êäRö=²;ïzÝ¿ßçË{ïsËU|Ÿ6û¯£ËÛÇÓª7HãûXzçú;£û1Þ»½À8¡5 à§ìp £^Ÿ Ö5]}€Oñ!ú<.ór!ZßWŠî%4±©ÏÈU|Kò Å÷5tä’Ç`û”»½ÚšWþùL0·•9¾Þò~¼ÕûX\Ðÿmã2Ä…ýâ;âbZ5ì‘–¶A¡1 _bãý_¾ÆÿÛÁë$B`¿ÁŸßÃp|žÀîþŸÈõÀy¶ãô#÷ýÙ¹uóüìNÆømò }¨†úVöv¿¢|¯Iòp Ñ1yÁ9Ý÷R)W½ÜûþÐè=œNcøV­,kkwH¾Q{©°û%&ùº :¹ß„¼lÙ…PþÛÚ“¶ƒâf¾ÙòÇšæðtëwðÓ›!__(ÉüHè¶xÓÕ é×`¡ ò}¨8¦0-öèÖ}-‰Â;<£#.ÙñçhO»Š"”¹óãï‹¿Þz+á—¦po0ûË«‰ÜèfdX,ÃÓ) Ùûå ˜NûZAmí.MûRòéÅU…íàìý½¶ÁKǵŒ~{-´ÈW®2=©.þ‡÷¾ÈýÍ©'Z=\׈̺•ß‘.ƒ‘®ù+,È9•áà,ŠAZ¬óާlAXÕÈan_è#N@’ظ~©³@FD´à©Ã™Ç†÷i—ìÔ3ª¡±øvº2Tm& XjaFí‡NIÇ`ºr8ׯYq]Îäîk•Óö(߉‘ñŒS0û¯¯i"Ë +…{©¡˜~ª@Àä Ê0rÄ‹Áo‘kŸU.UŽã+sг{žëO!º~¡‘Æd¨ÎfÈ&S=åŒeÂh·¤ù$cŒƒî—‡˜öÍbô¨A`|d qæd„$kvò©¼üÉ" ¦%óó‹HÀ>~¡õAŸ‘ûöA¸Lð¤ ~g»}üíaíæ g7fîÖõ%Eî„·{¨‡‡jYv]˜0ŒeÃ2ßÌ(íÜ(­Ûpà‡ŠÊßlµL°^çЏíÆú»§ÍSn ”8 €Ïò‘Fß`¹–éÀ~ qä ݵmØ5¤Xa™ €VtpóòÜ0ÈþfL¢lj¸Ž|³ô%xÔs¥Þ—ƒÚ¡n:á#Ö>÷N9F5ãºT£¹ ×Çô€O$§Ï‚ëÊQ˜Á4ÅÁÃ%à=—çµ!ºl|$‡šæóqcÔ>œÍ0ð@j`Ì`WÖ„Þ.V/Qœû}o°&ÖWP`ÅŸ®ÔóË(%b۵ݫ9Þ±»ü˜jýÙÚC¼Ep€Ì@é€D¹o$_:A:µà&ØPÍ—/½”Z’¾?÷‹uC÷IBv|WŽ¿7€uŠ‘k‚½DqÓ~Ás‹î–çËÊÜ“ÿ*6žöšñàܸ1hfî$È ¶sìµØia?ÉÍàq©•ÃJËéN±1%ŠN}ö»Ì÷ºñ—'‡Û÷B×rñ+Áâü!˜¼þ‰ÑkÄ—æ“(•¾„ÈKéÙÒk;ûȼcY{—éGãøÊ‹n]ù;MäóþïZ^>.95d°íÒú5Ÿ‚žüaãÃ.J½vF¿>®ñè^åÁ[=¸Uÿ‘JV uñœð^Ü„à@€køÃj÷+_ã3Ð`^÷d¿=ÖÓæô3·\–W¼¾Êl¨øý÷Iðçó9<PWŠl]þõÿ )]³òƒP|’¹‡ðÿˆ‚XûzC,0!ò ׋í{¶|—æÚx—𹑵»ÅßóóVŸ%³ðœ!ºê3_f\ljòü8ý¶ú~HÑ%'‹wÃZ`@1/£ÙõþÛ{>~ýtý¿gW->ÿû%ô|^'~žžïDæÕUŸ8|Åüâ…§øÌªÅÃ÷­ÃuømùËÑ’†öÕôyÃɫѕÎå°MãïÏÜ’»—Œ§99ϳTúç¿×‘ä&‡‡ºŽp†N¸9þ_ƒùQ{OIõfº£¢Î,vòÙÚK^ÁóxG¸—“9̰y­pGGöu£kþ îáÞiÆ—øQW2ø¡hÁ$#C‚"U†ËÓkËøôåo ß‹ŽÃ.)3>Nþ5¤oäË܇×z[ ü@‡ûdÑÉp>ôùgˆ˜‰»0Pè5Ò†`j}10[‘¹t5€›*©½\VJ| ù»=G™¼ë^Ã”ÞÆ¯ÃéËÛØ¸Ú\6mÕÐù|†N¥`r.™xG!cË–#jગˆB94id‰É¶öË}=œOÄRˆëGC¬Ùý+9Ø b§ªãT8üyµzÕ[ ÌÑ-‚â1Ú«ŸP±Öá5ÑèŸÁŸƒ¦ °ù‘Š0iÁÓñ†(ÍçIb´Ü‘²ã@£œ'SÈ»Çþ3¸[¿kjeÀŠÁäm‰øïäXr¹À˜gõ)) ý­†w ñ}«Küji(£|}á*Y¢ø23ÁYWÉ{Ço ÎÂ’OæeIœ_·³(2=Ùí¼.C4€ȫ$rð-+NÂWCt€‘¡3È^02–œ—FøÅwû*ÖÀ, wçb³ôF;•³æÈ~4í´mÞ4B¹á6ÓÅ j‹`3aÝ.ïæþëb_8et(“Ƴ¤ú…ͼF !Çdò™‡øÇ¾!ØîÚ>ž=]Öâr&Ig0)Uî¹Ò ð;®öHÈ;ovEݲ4J,@@¬Ì¯¼ÙNÀ—úâÅe™v'/î¨ÉžÃUóhí¨¡q)ÁÂG™Jô Bœ$·¹ð)–»‹›hrœˆt|[a(t1­öÀàmÙÜÔBI≈Ð0J8¡,EÄSå_ÛÐ/ïýúu‘C€÷^A¹ÍÔWÕo¬É}ÒXgbJ‹Ô~è{P¡ØZL½h#óݽ¶§M/fÜ­·:"yi Z9/ß‹e—Aà.2ˆ¯‰ðÙ_9æA{G^_)·› Wdñun†ÁA9·øÍnú±»t/‚­WSÊy)Hì&/ªŽe>òåkˆ›BÞ ž,ÄþjÜV{ø‹§´>…²Tgo”šÓÙÁÏÑíX¾œÉ¨ÁøR’á r,¨wú‚_M3/à:Ìû>BpB½eÄ>Ì·Û8+éß»«ÇR…ØTBpŠ›Ð”ßàãç{U;ñÍÖT·dD`œ¡q…è‡Ç´òÝc Ó¿Õä–ýà,’ó-Ÿ±D#Ä´›9A`•çKf¬Édª¼!ÝÅd1ðZ }CXw F¼ åOO©r¤ÍT*`!Já0´axÇõ@ªº¤p,BŸ¦Du5ùؤ®ÑÎ6m"4Òü ýc,•½/­e)È,—Ë€î^ëC ÝÙq®^™Ÿª,d™€©4S?ËDZ?Kä‹$­#"†|>:MQj“˜óå íǸXV]RÕðcµ7WÛÿØ¥¿È„uöæ6–ë—³=ñqõ{îïí®ÞŸÈÊŠŠïs¢-¤ ‘_iOÔèöÐîÀo;Ëþ¸HÁʽÙWoß í'¼|+w”nïˆ2ücƒÖ;]ž¤³™žbÖÄ>Ýʱˆÿ~¿w÷xÐÚöñ8˜ÆýR_ô{0nC§áJà;þù×)áS£X¢¦w^é½8Éùcω ö°s)s%ÅŽÞH û<™rP; )µÞ®*¡}î~+ÙTF\Ÿ¤S”H3†+ÑÒüH4i“îšn œ£n9¼þõ®éñ»–´Ruº ]#UØe÷ÿ3FW÷5«~Ážw´Õ‰:&K~2.p?B;Àƒö%p–}ÿA憕y‡pЪ{(çÁøüwWð¨ û¤nO „æñ8ÒÎt)+$ZVÿ0-p(mÁqîh¹/þDížm˜ןmàýOû]VÝÝDñý6òøšaë€aœ× 6$¼0‹ æå2ƒû¿³ÃØÙ3keF“àó½‡jÂØ8…ÓwÈ@†ÿ˜Ê@äB<–‹‘‡ÎÅø"_Kñ¢?ñÎ1ö«ü¶¤Ë¢ÞÏ™vÚC{Üf}è Ô“†ámykBÕ¹ ŽÂ®×fmCk¯i{/†÷­÷jÇ#xo¼‹ó…½{tgß2Ûœþ'®Ú¸q)©GÆä†I<ß‘³À¶"hÒhŒiºŸË7Š-€{6P¿§E.Ö1èѼ,ê`Kp%´¦ªH?—¯R®u¬ ûIh4Ê ¿9†ÍSö°BžÛL_Ûth/ ¼\'Éuoá±›J±þKß.Õ¬'ç;®ÙI’Ža1–îñXäÞÝ"˜t2õ@”eùèQ|sðè$¨DBÞ\Q¥|µÜnÂ,%"…Í¥„¶ÔÂîö“^²‹Eý+Ô’E&82ø„tƒgãA}²õþ2¸ ¢‹ºÄ¿ðôÐ&…à«ã¾ât©­$mµj?Ê Ê°s¼IN—& ZCoSôê"sàN>DÚûA…Hç+ˆ/“ÿ*2{v1Ü%¿Õ 0KØaMdÄε¢[W¤ MA#eÏ>à ¶ÍDÏQ•[ Ù÷… 8%û)ÁÿMù ‹ eÉ“[u…՜̻–$Ä¡$ý^B ÷5ÃÊV ¥Ÿ§‡¶ÚA)’ƺµ‘Ö$†¾­ÏƇÀ‘ô+-sÕ=w| û+Úëï(ÜÞÇ0GºŸèFT3ÄaJ;ŽSçŵ_0é¿é @Ù}Äí}b3Œ¸!²?+@q›àñØ=Ûœ…ð “° Møó"ñç¥zDù• û‡Qbªåÿ :)@ZÝäK‹h¯?³òE¹”Ó4dñB¯wи½¿“”L³hÌ[v¿ÀCŒ·óïSND½uk;ýÎêí£Ì B©6 ®ŽÞ’ÍÏq`ØÅœ?Ì&$ÚÍBmPÇuãñƒf̲Ÿ0íu£ÿÇ`M[ À3sG_é¹08…E¾½ÞõýdKŸÌq–Þ¯Ýå n?â»ú&°Q˜ÿFà¸w/†õè°[¼G™ìO€c%–÷'RÔ%È7ˆtŒÒ]ÂÚ¿^5~WÇ<ƒË²Ø’qÂ0þI-Ì߈¦ü îA!yšk¢ž¬½¾¡Ú­XèG¡åJ0_E‡¸#Ç—è?¯iÐu…Bã…°TT¦QBƒV•Ùã*`>ÍrÜvS ´üPùZÆÏ?Žž{ÊèÎáÓ+É6\anc=«ñõù¡Î.L÷ƒR*A»Ñn¹góðÜü$< Z°;më„Uñ_—7z-Þl_æè¨UàêÆØßæ¯>sëm\œ¾ý "wî¦ó­÷®[üöÏlw›×Ð[*M¡ÀP7ç¸äóæX/f·tœû2‡Ð"âÂ;ßJX‹U5ñ¡«9Ïí§XºÜ6KP;„L„ŽùSf;Γì·ÉhBôÕãOÿ°¶Ÿ±¶Áasîk[Û'_èµÆ^VJ¸—©Ä°TÀïä…6Šw8ñÚð[ alTI»ü‡ŸŸ7yÑÁG:²oĵÁÊH›É…å©o¢KïYo)*2¸hm8öþ„r¬}$°âlSDXN%@ËVY|ÿ£<ÊlœÙ”S££¤RÇÛ†d,¤šL޽6Lþy,Lðw•EíøÇÐãÀÆÅžð¶¦(ÍÈöC†ò&Ývô%º7NdWgŽ„t˜øW 8¸`v‹„OŠëZx ’M xAÿU­û˧J‡ÑjppGòÛýò vâç†ÈäN–­èHw‰_òòV¥ü–…ëüy1Ü&þæ(:jcÃ"ƒ½ö~£îTÜuOsÄ­7ñ—Ó~ê¸Í¤¥à1ôAol¶nû­iTD¹àã9`$Øå´Rnp׌!Ÿs©Þ š5¯€/VÕÆËíÐPžõ‚ªCîÁ­nLæË9ìþŒGò4tdÑ€±ú&Vbh%‡·’¸ŒÆž}1r7½Ž[šTùÊìÕ:ü<Ì”ž>ve ¨BÓ:¼¦OW_ÀG¼iHÕÉüYÿoÕÒ˜.uì£Ò3(„Kø¿W¼o×ãC»G^æ0óúѱú¿‡Ë©…ÅÇû¨?û`~ÏìëôLý³šwOÝåÜJžŸ4ž¾ê½_s-뢰öwüwø;1rÄYßÌVΟŸá»à|\Yy~}=Vç3›Ùìöq°7oðì;É‹ó7Ûø'ÏžL8<Ì Ïõu°— ??>è„ÿ-ùeÛ¨‚å~ZÞG•/±ÿ¡êñudìÆ]Úè¶:­Ô5p Ë“NñWœžV­ ò«n-ÒþŽÊ?ŰڒàB÷á&ï>¥Ç…~ÎN,Z2&T¼·3Ž8ÚN‹=xGˆ–øh½zà"e6]†U6i¬µ"rˆíóZ2T¹ø5„,`ÀPr ÈŽ¾b”E¯õxQ£kÇü< 'Ù«,˜yNÆþÌ\Q½œ Te`ÉxÞ,þ\·Ïòõ>!D›‚Yä¥D mõ`3P0›œRê1o #aÒ\ÈJõ¯^ˆøã¢”WÿºÓØA$üСF-œ²)¼>çVc§¾‚,þç¤egüYÿhm«›z’uÆsÉbSÎÕìÓßy¾³°^à5DáZ4ºzWzç'òMšöç.߆&ë ~®ŒåÀ8Ê›%,ûéã0ÒÞ'¹ô®c¦m4ó_dP­ú†â–8è´ÇzÑâ@Ø:òS]ÇF+—ø,(Âi˜ã mXS]³Ôg¨ŒrÕz:N#í •¦±)¡áúÑ:yfƒù¸tÕ¯k cVÒåòšzÓ²áX É&Qø¹«¾hæá½Ýü_­ÔçõWëþ´Ò]j!ŽÝѽD:â`ØG sž:êlãò@Ž¿Bx¼E“"`€X kÇ¡y…xœb@*}U‰wÔx¡¶`×ÚS—TÇ ‘՛Ȥñ#/´žÄÀelÖpOÑ«#˜®@´Þf ÖáM< Â@°46‰;†sœ%’!Žd`G5/ÚãôàÑk=©òi„(]2e×H Ï/96·n3˜‰Õ¯f=30¼ÆúæÁ¿BÓš;ÚOüÛqƒ¥…³Üê`-ÉzãÝF;ùò»ŠOa´¼T{¹ÙèçËfvG½§B™ûu0}‡[âe€½y‹õ_d+à ,§Qíü7™ÖBiþ%8aäiø*²e Ë04êèk÷Æüò"F0("a05n7£¶¿/²¹?ÿ|™·ùòòzÇBöVéUz£†Ö=ªÎM—q©¥ÀéXM¼EÏ'ôŒ‘; ç|½BØ—*ˆ!øu™š%~cTÔéE°8\u_8„k—^U•~Ø ØðîÕþÐö1K%ö’ó\«Óª<kUϻɊ^ãnnߢ$p_YåPêÁ˜7Ø»íË• ›Ñmž)8ÃòR^Œtº¸a:U|ίÔ7®ö#à†‚úxÛÓȆ•h«+Ë üG|Žß<-ùgÏâá8 >Ø{¥ßEö”#ŒV¥¡£r_~ªÎNÜ—$ Us/bùJ ˆÍýÈNð›Àb1É .;L(L±€„ë • ÈöÊ©*h"ƒD¨Z̃Êèžñ¤ »‰.Ôç61Ó]ʳ#¡­ee~&-)£P²/nlŠÜÌC7©Ñ‡ f ݽ·Ó¬EsÙnÑ]¯6ÇÙ¯ágLQ -6-Cµ€h“P±O–Û>,„{½Z.\æ{šâ\L ¹S…`5z³|WŲ¿)ÏdI½ñß™[hwhàb3Y†Òßh+Vj=$µ¦úÀ̉YL›P¶xÛcE¨¹gAP;iÅvØoÛ âµX"׳L“¦ü `lã¢Rì‘‹ÙZë1 tê_)*ÿfM©Pñ¿ ñ!w‘¶åŠ˜bLU’sû¤Q ~Àò“é°¾ÆÓžz˜zS˜@ì7HF<‚¶,ux5ià^df¼j—zvˆŽ&TÜ!M,eWÃIRgÂû6V2Œ ™¸ð7„Ë~«†ŒjÝ”…¯a§‰þ|H¡8ó6ê6Tk(Þõ £ÂylÝ}ËeíEnh´#ß=¯ÚÙ£Òe­L@î^K¼ØñU@矒q{1ÏtYþò¯¢ÊåÁ NÕíaïÐ-WUÕ÷£øo1†úÍi™nMÞ¼PÆŠÅNÅ{…þëLD¼)þ߀Ç:pà®Úy £{é ?ñ¯_ˆZïëÍÝák».lHï6_OO¬Ž¡²:užBTçáõ`ñ‹Õ‡×Ü7f^VNÑÊ XÙMHZ(Ž?PW4…sÂoÜïà¡#\R3Ùٺ؟'°<ô!ÌzŸ·ÍóÖÀU\öÚ  Œxø²ýH+[ØòOåÿ€/CŸñÀi½*\þrÛ$û-QËçé»Û cÀ›òkÏ-×›_;oËãNß{¤X™Ó×MÆö—¬¤šCæÛßõe'—uû?îtßWÞÍ%Õ.NÔ E«Ù㤨} ^ÙÖL:Ž÷}<Ââà0áBñp¯ÖH½=ôe¦’&Çõ[Ù3Çv¯;âhû_Ù€¶‘…èÞxß¡€8SÓço’þ[¸ Û ²&)9|kŒï¼¿²Õ_µêìâ]«:$½¬ŠdKÿºR÷Ñ¿?úðzõx9P‡&á¶Í#Ò ˆ˜Îƒ¿˜Þµ0ù1ES¾`X!»q¦÷3ä¸×Åá5ÄŒ¬'ˆ¿,à£ÃÓKz<Nɯ²q‰Më1á«'ÅA©8Äx(L´oXSÈ\ú¤È–+ByN {öÍö?³0ß)­ö¿ÜA ô‹âhÓêË™ùë Zíû¥¡ÔÍ?'G¢ô"µ(V„.‚Ù7°où·˜Y2ñÐÿÝ¡·s²L0ßË[˜óäà_Æ´ž4¸ nöúâ mÎ"óé_ ßíàÉk¼× ;ª5þÂ;m<Ápèé•Å•y=|Ó¸‚LÏÊ]Ñ‹tZ!€œÆ=Ó¡dy ½Ë.“Z(+r0\=¿+µ-¨£Ÿò7*F—Ü|¯„VŸÕÓ@€ÒÅÓ¡‰=Y“×V%Íyt­/çUÏwZ<6Ñôœùï++ªeÊA-c/¿œ›C4°•Ü&Ð~‰IxÍŸÜ'bëëÚ›ùÔwES!‰þu†n)§Ð†Hâ&ϰD¥ƒ•ßóÛãYå×–O#°ðq‡ŽN"jÿË#r*mv#1î5ï_Ѽ©›+“¥o‹Ê@œŸsÁõx£é~ûáBt}ÕÆ²£¤%¥ïD<¸[£€á”"ÊRLyÙ<#µSËx÷¥*ÒVCv0VŽ“GÈÄ›MY#Í«ìŒÊyêSäŒÙ@‰¶?""fÑ+x“ûµ‹ð\Àh+tN)²5çZóKÛCŒÖÝ‹s™uzH[»d'º¨> úš],çdõ”(t½}†d¯;œ4Cªµ¨ª›Ù»|χÛäÇÒŽtކ¿bÒ]têP‘×r@!Á¢”eLL£ŒV»Ëî0”aÓu›ZŸb»æ~+†`i ‚uÅ8òG©T¦ªTu-T5,ÂH†8í¥NŽlé „F²8–#¯ yKo'AÎþJ²áÁ’fš',º|µçä>$.kr{#AØÆY¶±ä{ÃÙ±%*à§ÂäÝo"ȶٽ6ï6a e þµ2]?#:ÛH’ñ*øhiáüœ"¹ø±ígkÝ[‡ õð@Ç>ۉϘ~Dûf¶‡R9ýßbÃÿJÊŸ>lžÕ@²Œ-!,ÿ%úXº:ðôøÔÅ¥ä8Hˆ#žîÊh;“Ï>HE tä|³™ÅËg1”·áì¡É^àBøZmk`x±Zìi¥qRKÊRFéé /„qKGØ~3 Ô9··‹pD‰b Ý´—¯)òtëöüOæ¤Ô3¬à=Wã“æAn~ÁäˆÐ‚öqA.d°±Œ;{6BÏæ6Šx(õM\;éú>zÙŽ $Æß«Ží;ÿ¹6ªÂ<ü»~ÌkØw¤=÷Bn=ñ Gå÷ûÒ_&~‰]„LBwõW-M–æË\oøÆ`¥Fü6z9bA+P½†—ПUT‚?QððjݹÐ~,¿ zÝœK ÙrÐ íŽHþœŒw N`²v¥ÎÆ^ÃîA…/Ì0c…ÿƒhéùÿ*Oäÿ›ÔÜoôhjÚy¶‡›~Üzºï¯ãºydh«ÃeîÍ¥°N‹lzQΛDUØnq}o³s\bj¹àô4Ëþ1`ºgÍ_•µú…Koa¥—Ï–'9U–/TÿV{ü©:yv1ÏŸ±ñ^K¢¬ò1i)§^g¥2}ÄúÒÕÀš)Ho]Ú9 ñÆåï.QÐ$hW¯ÂÄÓ[´Ù>&Aï')Ó—­®¦nÇš)VÄ÷—„™ÆÙ'qˆ„Ͱü¿ëÖÎXí›±ÑAÛÔ­ÄoàñzâÔÕfÍ-'? Mi'ÁÙœ‰„1W²K #Ÿ"àÕ ®‚sbFAO^?2ϧÆ»`m€·³’šÆP+çJàc1“+:=»ï]\ZB ¤}¢¯ t·lb‰Œ„0¨( ß½íHq¯‚Ó0%:gÊr(û½TŸ©#è¬×S|~ ·díîõjÍ’X´âœøÙ¾¾±ríŠl±ÒDý±NÒ^ýWšÓvWS1†“ò^Œ”oƒtÁ?ET;-Î]Ç-Ö(ÅËÄŒó½RphŠ¥1ÅŠ1Û¾\VP{¬®±Šà_ò+Fk霻 $+ "¥ÕÎ(†ÄCk“Åõ"a(`Ï(*¾Ç²R“qO¾„B”Ëãì*È Ó÷²+¶Þ^óá­sK¶q¢|3eƒpµmgJÒÇ<‚ C€iùä+‹eüÞ¥Ÿ@WïÝx = :³!˜ÅÛ¯ë? ÃWªpç®Xáe2Òüð$fŒ oÌážÓä q(¥·ÊlÓÜp¨ãx¼<•À´"Re—Éåsá·è’\ܤ¯QÆý¯¯œÃÝßþBPÀTøµÍ§®›˜¹S#ŸUÏo¿èùà%|Š ­6Užó¯bZê­mغþxwÚÐèÂL ±³uËöÊ»…²8.ŠþRCóçÂŒ²¯Iý/õ¹ï©L@N'Ë÷¡¿jûqâïØÉ³ ý]FƺS£‹z¦Ò¼ågY}8ÝâA¬ª•վץ숗˜©JoŠß*¨ä@Ü݆€JŒËÅ•ÈãÙ‡SžÚ!‹® †ðÕFW‚áúm>Û è‹…  F°¶©„tÅRFÂý_èÉ’åÂu3`U64¬cáÐV»£âb‘óyuÄ ~8‡iÜéžþ¸\çV9¹‚@ò³Ï"+ðBIQ*itàü¡]À|Îbq«Dh¨qî/,=Ú壷™•·öÿhYê!a< ­´l6‹42´3èx€L¢8´±1­åUs•sótÞnh¸L¬KÐPÙ )nkw³DFÂzxtÐðôÀ¥A¿Qçà;Me*ætçVïí;!û×mv&ôÜSCRÕ¢nhÞˆ¢Ã÷aÇÁW3 zì‹ì8!Ÿ‹>-oíòÑòf”hÏÖ—ñe×]üäiGá:Ø%3±H³9 ·0Ã:ÊÍ„µ(ÆfÔ7—Ð-=´®6%8'{´…Ö ò\­°Njo¤ÇjMÖÉ^À˜Ó®?kÜ,’Jñ#‘®t³7êÑ»÷kïÃzÌgÄý%k%eø-hãÕVO,ÅùËÅÈÐìýœá&Ê1‡ôôXVñ·÷Rþp«ÙO_`iÃúó+&ŽØ„\Üc~ƒ2gùôà†(2íÉ:Uá3ôãíðÐuÜߢ]Þ§Ôòº}jtÿt~±`+✞<ßÑâîÊü¥*Ük½£ÂG«Õ6¾‡ü—âó~ Þ±‘Ê?‘Ž}ÏØ-¡§nMô¾=˜ïµ–ôæFN$> Ø;OµM_9Õß~8¢¥Ò„Šëu|Ä yjRdLºîK4Ä—¬Õº3c,Áu—ý²>ˆ0…=}è‡Ý…1©¼šÒo^Hø])‡‘ÆÓ¢LU Ò êA+†ù9)eµáŒµ‰;²á~ÏQHP/ÔÒ²HuÃM„Æ ðÓ²:bÙF¤ßžêNí›"´éjí¼a z¿@ÙH¶þ7uˆ.î[hNŽ{F­4ÔF”“5­ƵÁì=Í¢˜zT…V9iDmƒ~kzþ¶EqÌætô¡þßlµðLS¯‘>+º\¤AI=þ—…õLœpr z¶M»ñj‰%®M¹—™ÔpÙ’[>Oöo„¸@g·C¼m…–—o*an’˜ç*T¸le[·¨4ë˜]&{÷oÞjÔí€Â< Z"$Ë äwÉŽ«°MŽ\ÓÙ©¹ c·W5EXÈèÚdB?'­a¡•±¸f&…’£“˜ó‡ãªá7G0궪øë˜„B-0é߉m| / ð¦ñ'†Ì½µ!`©ñ¶SÇEüLÛÜêwA£¹0Ü€I –4Ã÷W¡Ò碨(³áO!<Á/F é´ÿP#Üyê«LcßNÒ£½þ;Çù¾ôÑmh–àÿëÀ(Þu¥á­ÃÏkˆà]jt*ºûvê”ÉA‚Ø$~Ö«Oy ÃY187å¨&·ÎT¥EMþf}«òàGøÒ7ú,ÁV…‹›¿hrß??™LýÒ$)9±Ð]ôÑV;ôÍ•[¿Ë Óñu3w6æøR2îÁ®œk›+¤qµ} BÍ1YÖ¥¾äÿ¾@¿³Å bSY©•ãö‡X ¦"þ«Ï—± 5BršEbL!JE®ç‹´Úî(€%'ðê¼ãá7çÌö4%žùuëvߥÎûk¾°r9rhi¯\£›ÒW¢öC½é/¿äšÒ(G_åÜv Oƒýo[½âæ9ùü¶]Åy›G|\7Øv¨{ÙÁ_|,ZlΨsõîæõÑQs¡ü#?ûÃGû_*?¨´UÿxRÇòþè¾ ¿Ýü?7ñ€”‘^‡éôŒAÿ‡ø„·[|ó|_4=‡ùß"í õƒ»žÿÛókóÇ¿‰oÏ«º_wÅ{ðú”ü ýþ|KÞ+m±Çõ W‚‰Œ‘$7’_ÁF7FGº*+üÓáøkCâóµiQïøýÿÍän¾æ|~÷n­§¥Jß¼^'¿Ý£xÛCø=døù@KPbœò[@ô‹0n Ÿõ|î C¨Ç£ßž×o>,7mZ^¿™,_?Ï0ÚœCœþˆzòÅ×,Cjr㦛Œ®ÀTþ¹!/¢àEý‘7L<¸M£ß±’á ÉXod´¬ u3,‰^ÓÑÛaþLµ ïñ/§¹ñþ®¤ì˜·e6æ<þø žÌ[.qŠ- S½©dÉ_s‘â‹lÍM°á<ö‘6-~¾ÿkù;bg³@7@K:Ê×ø@²w)…Sˆ·ô:B¨w˜o;?Éúî®íé?®ÚO%ô<|bpcÅ>þ/‹÷>„)“‰U.R¯ Ñ©ûkè­a°­Ô}ƒSᶆ8nªÝü`­ÃŠÑ¹ÔkÎЪ*߯v½`îU ßÉÄ$¡ ~Û‹=þyiÜå3^Zo.úH²ÌN¹Ë™\ÚòÊåVÿn«:1%- žÍ‹ÞñŠ-®«g\HÁ`3”aÎT™†ç{ ” ¯Y~_©÷ï^3›•]VʱàæâX¨Ãç¸89ð¬T"ðH5ÅÊèÏØ&ƒ<ˆäýŸü0uÛVø‘jã¬2mJ(è4wJbˆaÜ—bLöh ­j¶B¯`Ãâ\ŠÐ8’Ù ç“„2_£+q|Ar&÷á9AÙ§ieÉÝ#üÅŒódxcì¯àå½2uiUáæË\j-Æò=‹®r„‰ƒSœŽ÷ê“úÁdb ‚-‹Ï:®ä¸ô(FȘgFðÎk~,ëÌj#¦È/Ö¾R秊ñžMÓ2pJ¬TJLjÛ/€fu“5BpJ¥vå P`97*9·ƒ L$"Q'|sf{‘:Dâà•Å ‰¦˜Ú²§{I—ÝN%da[êÂÀ @ñIe²;ò›½5ǰeq~uê?£~HÖ¸õR;aUé˜G¯·)¡§gÚd¹šßÓ’õÄ·:Zc¶Œ^;o Ô&@_OáÂ@?ÔšR©ËkÖš™SÙׯIq¯Qy­Ìk”\ìiãÎ~ÔæßBš&¢1Ó˜M¢FÃs ! 7=à̆™|“(¸™óG&âf Ó³Lv«‰ë–u.8Õ°´/“' eOsµù^7›z´í2ÛqB°æ‚‚ÜæP…uâôŸ>ûy®Vb¥)}?K4d€½šÄ¦Á)‡ ËþæÁÆÕìÿâ$f+”ôùÌIV֗ӫˆ†ô¶yɹYáA}Ì o\ðßu-ka=±®ïðå#Ôøà¨±Õ1á~TóàTÖ`—e¶¨­éöuü<>$WãÃÅ)w¸„Þªïï7¦.rÍo€ª¬W-Kyá»>ÄM#- %ãÏ«ÅnÄ‹o—<0ÌOQJÄØ )õêpV²?¶É"}úo s LÔÑ„Ö a³–ðŒXöZax܇&áŸrñØ‹mwÈ…Ãm:°ŠÒîxÈÁÞ&ÖB3Â:G‹´SËcƒ1j5ºÕ6)aU+¾ähÞ7®³›ÀsWÒD¤ycZ›ù—æ<ßH:ÈÏhù±ÊÂ;»ú_âû˜îàƒÇ¿Ž£Û‰L€oAÀ>¢;­­iœå¬Q|U µÿ¡s{ó{p½I¯„ gïs@w ¹d<ÚE·å~•-p-|ç‡ÈæUcòèC ¼ý¾¥s$ùØàÅH9 õ ³/’ý+VÄ,·œ¿£Ú^>PXÕ½Û~鮚`:F¶(Ÿ§)ðÖÓÜ¥¹é ïn¯¶qCUÒº=rnØäzU§Of¿ƒ‡6;ìD¾j5|Oßørp”JóPÓ»ÑÁ©¥œŸfTƒ 2çîr’ 0Δè'Y²`1éoãTM‹¿k)bM]Hœ'Ý)‚áEìBÐs± þ"’¯ÉFCã ’Õ•¡ág ´ºî›À£ªdH'YV›Ë <…‡_ÞXšÙs0qàAÀ¥ÑH â›P‘é_g•-žD“@gRö¢¬À;„Åé`u>²7ÅâC¾å½võ\õ„$jø¹]P¾ŸáC„XÁ¡ R„Ì­¨óy޵’¤j|²1ùÑè]È MÿéÌLc›.ÝLªñ¬g ç£ ín6¯Ó[cÏl3¡Mš³ÌÖ"[Ë4OÙaf?‹¸™SÎÙ ‚_©Q̉‘_3¯ÏÂõ7†µëäÒªS¿ ;Ðôð§Ð ÚAŸHðyªÝK$ÿ(®— ÍVå÷Ì~¢]üÞ¢.ÕÜ #¶¡9)ƒÕc…ä(ÀŒ‹†P•ê/„XÅH±£V`Ú®îb±BÌÔ”¸}ÆZ:e–]ðà#9ä-ûس¾=aèªÖº¬O )d…·_ËRËÆÅX'Ä?¼ˆ¬x>èö% ­ÎeŸê œÐ€2]eÀ/?þua“:«àk ¦ˆå½l¸Ÿ$m÷Ëùyqã¤<ÇÌ„€§ù \ò©‰/DøX¼X$ê¸ÎL( mÍu«›ò¯_«N#>?ÄÍw¾0þþI›éü.¥à8,¯Þñ]¬†–¾%]2ñ\S–ûÏüšâê{‹÷Õuunx¼ é:ò8Çÿ*þ0ÿVªY'ö´‚±4¿·ÇªŸÏîäÕqN¦9FÑÒ»>@ÿÇìß; »àã¶³JF€@„oÿ*Gú×ë#ï£ËHì’«íÈܼü'|^Õ€To]õ?|¿¡ÅÛn;[z›ŽZ2##+ãJ`|â(ˆèø¼¸]ÉÑ”.s­ºo3¨·eÆ|«taJ;ŠQfv•|x.}\<ä\sæ MÀ®7&jøzÑã’g4 C꺈pÁõ!˜«HïÌçÉMúÂV¸-‡ì÷`ÎLxvq zØÀ¼å/„ÕÚh·|I/_6n?éÖÁÆ¡³ j%“ß¼½ÔØ÷ï’!6 õ<3dïÕ¥øGs!⥥ðµ²1ûÙ$MˆÛ1«£½P©Cåç›ïë¹]÷?¼>#QaÓ‹/.ëYýê;Ľb!ío¼#\Í¿$rÑÒ`L†Õ7~ºhÛÅä*Ò”siN"ã›/Öç_=¡µÒЫo ’¤ãºžm…ôÅÞ"|zÓËõãÛ¬¾èÚo,4/ÜÎþ·'1œjqp"6G¹8áÓ-p¼³--e»PñÜO Ng¨²±\5¬·ß€’3ä+&“[h9ÜŒø´»ŸeAbÊ5—5èø‚Y6U÷öæ¥ÎïxŠŠcDÜtÐS?’Áà«·éšïÁ°iC¤,k™—¾Lp)¶³_µ˜G1/šu³Ž‘[>µeaÿ>hœ°Ý;‚½ãá»IPl8a¿€KD-`qŽX.LÖÀÃõ‚FÃÇ¢êÜ6w\Tà(ÛIZ0/dY¡PF©Ÿ ¾ƒ0Ò=½¬³}S˜Á=*ûœÍ³pñîŽM¶,Ö·ìÀ)­~GÙ. y7e4Ælh|ß·nHï«[&aS#`  ÁòÈz9é%ë³Â'9 ‚ÚYxý|™Ñ…Â1Ä8ËøÓ6³ ²Rå=Tcª; ¥`˜g ƒ²¾‘Sm)Ïòñ™+¦?†lm—1×ìÅ€fC¤^†|¦1UúigZ²òËò0!ví≇Ñaˆ.Ò,æj{·ˆÚ\V^·rR! a pš"!ësOÜIXBLº$ ?ÊHð @þ ùœ[ÕÍ~m›–‰¼SxØ–båS‰Ûžu0K±Ì‰åê™øŠP/,÷ƒƒØ ™†U¿‚ØB=ýkI1 ¿<- ¹oc¯Ëñ¡{c5'ŠŽ[™v$–~„$˜ÀUóÍù]T¢:NL§Lp‚Œ]µóðgx.y±ÖŒ.€ø€ ×Y€¸…p¢3[Rg;ð?V+ØÞ½s ïZ}\©è]³9`ó0mv|wçËUºŸ­ïÑð˜h Š^.–ª9iö(hØ ñ8Øùa1 .ÿI\b—û¥ºæÍ3ž ç æL(:Ü‚àýÿÔg0ïÏBØì—²Ï|9ò5Ç3KgW…Ü6û’^<üéáªÀý E°lÝ¿>TØŒ”Ù3Åøú@Óºït8­d[7¬¡9ê&=üQ’Tp¯÷Ê rSâµ´«MгDÔÿˆûÿ£No•OWídÈ?g3ë+›&àìœÝBö¿kåþÿÄ–¯J"Ýs™³÷ÂûÁ€Kæ¿gŠgü¶^üøÅ÷p›Ñä4<&£ï"Nþ `]Œ]Þ@z`I 2ž[–Û‡x>Óô€ºç1,4÷Oº ¹#د;üyÆÛã]j˜wõ6\ç­Âߘæx+~–ï$ò\ÇôŠ½ÜŸ;ÓwêL+EèIxQ}ß#¤õ§) ü¼X'̃ÆA×08o£ Øô¼ùÒ^ùíªo®B û-Úa?Xô>î ãX¿ã‰2‚¿‹z p¼å–/k‚µñ¬0}቞}3Ä\`Tg!GT7¢õMÍ1cVù¤µmìÙÙ´›ŸÒÏŸújŸŸã§{SY/é¹ßÏË k4Kx2ÃÏí‘Gú s÷>Ñø‰,s¹½gpH—N|Ø­ÜÅ]ÖS ’eòàûA[¬T¨Ú›æ\àéþ·è¸îjYYÙÚÌ ÿW! ÜØ„±Í‹S´7hÔò×gââ§{'¿M kX¾€CòßGC3w¸ðš|I¤ë’?X¥Ÿˆ¶ð®‘:ʳ”Zêj[œ#èÅeù¿º7r¼ÙN-Óðxÿ\¬9Ôid2¼àº50ý·ÒHM‰— ­„³Mªƒ›½À¢|W\h݉žç‹Âº¤^ö¤8C-%S"÷)¹¡xõÚeE¸ŽwX@Pù€Ê™”¦ZWÒå†gª†n®r‚£cAøÎ4<@¦ì˜ÿÐeÛwEÁ¼fu‹ 8\s€ª§Ã†BÇà¹Þk„ÎÛ§|⬿–2•ò}°^-t¸î+·‘|¦ü¾S¿ËüôæâÂèéÀÂx…Y(.Z\ƒ&ë×baÑ)óT**<çÔ€_±†P*ìViÉó€±QÊô 'ÍθrN>tåÇ×Õ9(ŒÛÁïµ{¬t wAÆ7 (¡¸\oœW,ÅPœ§Ü*6»•¡/ªÆxHǺ=£ó8"¸ª‡T<®¹<¦Øä =åŠD®ÚÇf¥ÂÛjºqß~ÆÕ[­jMäPU¯RåÂH¯ˆÔS}þt† O¢ÝC“Ætñ0´*ÅsáY‰Ñ ñ¤háR#J¸ ®}QÅÚÊWr}¬ igM©ËE±ï¥2€ù·Ôi£_z9f¬¨„ ÂH“\8¤ïÞúZ@Џ¤œ  Ó‚Bü„J[Èõú ¾ŽúÆ–ÄàKÎïå¬MçDóAñ„›BïÕ_·þwìÑljP¿™èéÉ(¿·Ãã´O3OçÚT­ýÿ_¢…?Ï'͇nož Ð}Î\N[íÛéå¢èüq\<]+3‡oöb÷†ÃÚ¿„)_ø»øêþ'ÅwÞþ^÷]ß=÷”â‡Wä1XîËyGïþBAólô¶Üø’䘔 BxRƒÃÈÅui\MÁŒæ9ãNÜ{.n^A–ŒRS5û`GSÎðëƒH\·<ï-˜ºˆ8¼ƒäv41¡‘PžÒƒ#}ÒËbÚB& p¿Tüf˜#†[‹Øz(rPΘEÅöáC”M’Ñ®Ø:(ËÁ„ñ1ã,uŧèŒxcM4å¾PÈB qR.rÃD ‚Z±IÐ,K‘Ÿ ÃqAÜJ’÷ ’(q›ÐìQ™l„=<çŽLIœ½ÛAî‰Ü2ÎÎܦ·¯œ¯ð…ÛšeÖDGÕ Èẻ·Ÿ.©R±K½«ÃO7çjè ŠFQËöpðâI¦ôÒ.ÂBFQ-ˆi2ÿ@Vð1\ÖÁxP)èÎñvH*‡rn ê¸m$€¡aaðoÁ©›A¡ÿïð±‰Â¿–6±IXÞÞÃ…ìWØí‡F¼D·ÂT°B·/EGÈ›«…ˆ–¥ü5‘0äP¦}¸©á¦…œ=x\ŸkJçp}W‡j ÁRã)€¥˜rš¢Õ[Â{.ßÌJ-*š‚Ë.ìÅhê°ÚI`j)›Í`JT¿8Óqƒ5Êuâécr¦muë§îíw#]ò„Fä f¶ ±æÉVñ†~i‘;•Õ”‚[sÐF”QrÓ-Œ±2±”@ôZþf; °¸dŸî¢nÐbºORK0ƒdh{»öÑÀ‹\Â%鼯µ5±CágÕ%4©´)¥ò¨P†kÅbˆ~qùÁžÞMySc‰ ¾®l·bR\—îbw˜aHáKJ‡É=.F `ÿ†Ð¯ûò¤)Üß'ƒ:töÉKIé?‰.N<Ü6îÍž—9®æ”aÚ‡Éý¯]?ª¼ZøÂ·<Ä‚( â.g°â´6–²î0‘é“÷¹Û˜„|V˜ù×SjÿéR5C tM²un–àeï‰^è"¡aþY·ZGópO…Ðfo/ü°ú0vkÕQߨy“d(ûåøu!a öÌ=—œ;_O'y£©Æ ®þב"~ù^“[ýݾïå§>¾$1`¡ÍOý¤ˆ˜Ø+èíÓž¤¬SΛS?¡~Ö› žuž‘½øpfkò«ð»í”N¹á×Ñæ€46§ù?¬ÜÁÎŽÿ#M1Îu„þ¿ºå^ùXt ²s‹ßØeŸ’Žé¾°%ñ÷ƒ§ÑóÙ‘ÜòñÛž-Åeª>,2m>^€lÛÏ"bfàù¾‡2ƒ|6~{¤“.¯æ°íuA‹¡¿¤a~+Àd %Iûº{+³íÀ"yd†<žƒ‚èsäï¯C8´-›õS'%;˜!¾ƒ•í3ísîˆ5 5Q†ƒ>V*›ÑK_X–`Œ{Õxàᘄ—J&¼W_1éà µb—‡„éV9äÇtتð^Û¡ÚŠª\7?byM¥4Õòèüãt¬+ñQ~szÈ‘`;¿Í:“d^õ>žìØî ¡—E!Š‰Ú ¨äÂäÌ1.±·ðCÁË|³qu^[VˆùeË‹sô„Má>8, RM= d‹h›% Æ{Mï!GÎã¢êq‚‰U$¸Òejw‰o%ùœO°¢ôh¹u áÛçɉ_si–òU Ñ—T#Nª³®#JÃöhµ”¨…óŒÅ’ÞL“"f $ê$}ÞÄì kŒªf€Ë31ƒ+€R’¿ÔàI„ÔŽ€ÀèpºÊ”,\†‘i£›XS]‹ñ[8µ>ÊÎ¦ÄØ,ïÚeb‘s›Äí@ÊãÞ>X#·º®Ì´6I°]3«qϳC\’/¢ÞDÇ0o¼‹’FvFDšH ¸Ù½Q &¾y,ßÄõùìâ4b ‘S­LÌäÜÛñÁ7×ÈŒˆt?‰Q´ÇàÙà%A98oˆÕÖüÍÉøãnB²É«ÉSê1d<’Îk¯¿†ž£qï§ .,"bAºFjpk¤b0åÝTcå,dfPâÔÈ$ VH|QfÓ*ØÖ>¦Û8 ß¶RNôFzÜ ¾#æÍâ^ÊÝ€($i…„g•9‡:ÈŠ"Ñ”ªz›µ1»zŠÇ‰d ™î>±g%ØÁëgKÃÇã ç=çÏD²ôŽgƒ.àÖzÕŽ\M*F-–TþWKºÐ*YÑcw\Yé2¥* lùü1»má-½A×ÇK2s÷Žö*mÎЭ%…k“õ^ìÆ'ça·|j.‹§¢ù Æÿ\ÚèmÜdže¥~›ˆ“ŠD|q+?­É^3éÐÃWsꈜ%`8[;¨¶ã6æ…°O‰Ÿr‚HË)k¢-Cß`ùSž`ÏžkøeI ¼y¿¼ nä0's*È“×ÆÃÂŒ`W–Dò- Äà‡b꾘XnÒ ÈbÒD‚¬;¸c( TXÃØÍÂò3ÖO²jCÆ6sbËšRd`êVrÄCg ñ16EË'&½N©·)#[l£oË-PxU¾Ì¡¸³›€¬ £ “gýÿ;#Wn`Þy¦ô¤‹ó«/dåTŒè„–VY̵ÖJ-BÉ™à,r©À·¾á7éM"SŽN ]ž… þ+z´´ybŸvÒp­L9)}x]?Iّ¶øI¿Žû8óœ¤+¬_?3àk·ÐIž½N)Šk縞€ƒFÞžgSÊbFRéÕŸηŽ<÷{†>÷1Ã1¨\A‡}k@Wúç9D^qG y´ßzŽGm¥É¶aw|oÄ¥;ýøL…¬¸q’ò—»îx—J|3ë’ì€i¦û¢#àÃ¼Ž…ûª…x@;.“5êöw£3{ÊVÿIg2f(œî2¾qui¯L­Ç§‚öˆ¶Í¤kÔNFæøˆÏ+­5{ìý‹ÇuN3ZÚM»xù‡q1·þÄú4œ¼}¤plþ1/íÏéKzýþÚ¡ôÿ·òË*ÑÜ ƒî†×çû„…ÀÊwøª½¤zpý¯ú0ÌŠë­ÊÏÜKFô¯\;¼Üc{ÏZÍÞßÚð!~ÐXÞ#fèR¼?ôuch ×űÎÜ£—†MÊ&€kîö_îðÙéø>ü>Cqôóg+vBí—À­Qéò¿Ã0Y‚òD×£5l}›ëWÇKÓÛø›ès_ÆÅ¤-v°ïåܧ4±V3Mº(ß"€Er»\Sçé=>oÎ1 ÑË9þ_=>ƒØÏ)Ù/.÷{û;ƒ¢Ÿuç ›¤fpø<çë,/£å þ ÄéB+Àêa•?ŠHF.»/È~a‰0¼Ï† O®…i+ææz¢®»>·áC ÀêÞ“ý ¥ÖQÌ©„íÿ ÌvWPÂëÎdÉO R†öŒAs\½×x¼×Õ/­‰;õidÛõÇsyYq#ÃŒeG(Ç(u'xѨ^5sL - n—d|º* Úv¯wÆ2?=Kü½ûÖc–Då\á(aíË' øÈÝh.P­žÓþ™b˜8Ÿ…2#Ë &·ÂNÀ‡Á,lªØADØ[¾·÷àh‹7!@ªa:2¢u@èäú¤„I(=¸7Eܹ0ý)nµ€eyjl¶¨°Á!ëhÐ@dB.;R–㤠*êš×¥ÑU±ÙVÌîƒq¥Œƒ!B»‹”räMƒYÛ(Ž$Ÿ)cíÇVœJ1¸ÙÁ“fÊéB.x® Gš‘\¼\\¼ù·Ë¿f<ý™£tæOFzºÑ6»M•ÕôÀ¹.]oÔ|\ÖìÜ”ï&eu[öêŽÕ½5îWsHÛˆoa¹¸ÆÅ7cÚõ î`A!È)ž!ª2-@½Fäeèô„äð,r¦âåc¹µLõqk±®8 …G®ÄÈü™¿¬"âª4”Z­¥%úªÔÑ ò‚ië5cOů?*=*—«¼(>ºð]0 ˤŽX.î Có °I‘Þ%sF½ÃdžÆò·o”,àºÔ·SÁ¦uÑ‘UV›$ 7k ÇÊb„à¢E—wKƒâMLÃ…c¸ïäŠkún²,PDÓ‹w+ΊÝ%¡—î¬w ¬ŽtPu‹j‚ùqZ«æqW-(CÎÙ”µ¦·TR˜CÛ„“~Çìê€WÈ¢4]i¾A7Ìî1íwK«‘'Ò™yÝÕ³ ±ef@½éB_¾‡Hae$‡lô¥¿d@n@WæÎLOâ!üââîPLC¾™üÒqþÖ0‚”hå4ò¹Yã„Gi$ip6 ¯¯!æ‚O=ÏWw•å*(݉`**ãm¹xÖìåx®†ÓÑqìÄùÊg­.¥ÇJ¡ ÚR¡šÝ†.=»Z:) ÅfY… «øJH¥%m“À“t;Cêðœ"‰G¡­ºiåX¾ãñûZ0^›¢$GW ­&ö?Ó õÓ´G¼‹vS–}äFv²xÔµ %QoXVþ‹÷Å~£ ­Ê xÏœÁåB«Œ¬Õž•~ßtNqb-“î4p©†«ÁV°X¯b÷£Š‚ˆkí !‚r&`ÀÜZГ(‘XO{,¥¡ší˜‹«øøíÇj´¶5 —kéC˜w#6×ëÝ{‰pÏÑS lÊ»w“悳Aj,¡ƒ¶8L_xÍN_SâK€D9 ƒ†¢c¯ óò]1Ü]ó ϶7á!·€Ÿ=êè¹Üo’‡P¿ºÞÉÀÅgz¡ P¾ùM NŸÌvy-ÕZÑ´AO }ËÍDq ´¾*)üL¡œmM{ܳh´i²ö©¼Yç]¥uM/,VqA”žkü@EnÍ’Í#Ú}·Ý-)Þ[tÓ aù¦³p©ì¸v¶WoCË~(âÄÖ±=AÈÏ5"¬mküP áò²çÉügTu^ÎÜIww0ƒù¬˜çÿÞ"B“ùÊŒËX:+ååìø"®kûæû{ÙÆ. 1…6õoc+Eí:Qè9è$†«òøu1ªÿGÁÌ-×ßÔc>Pz‘_;pp¶Ø6b\üs‘ËÖhPþ·†SÓÔPÝ{ûWÊ&®Ž#ùô$f hˆ)á¶æN}oŽ‹o”^+îä”Ï¿ò^´—‚ztY8E§ÖËà TûUß÷ÆyÛ@,ÿ²ÕœD%¿ƒç÷ø¾^&’x4-.#DýŽúJçËÎ…È[2î²nôÕ³VŠoѽ_œdôÄÖŸ4Ä;è7‹³ñüòàŠ:„I’Ȥì^!n:dF]¦5â‚´ßM¾lX¹&è3•ªÝNejDÁ l5€K_> pºYqÁsY˜¦÷¯%øüTPG½¤'ÎoÆ#Aûþ‚3.Ÿ?o´ÉŸ˜}ݘÕc«2u—¬?R;ù6ï+•ÐóÃçJî•õ1ê½hÕnÿV>U¡šñ;æÜ ¥>@sªŒ«éO•^¥èµaãà›³¦ðù„['JYñÏÙI~L²ûÈ!ìØfjºµÇ9¤4û ñÞ¿›{N—U{³½¦ãÊSŸ~ÞÕ&¬ã´âID°Ìf¢áã^QÄ9ºo~6Îr'|\8¸i4ëׇ˶l.ª§¡GÛá¾kŒ‘°P‘ŸÆð’ºòÕh`–ÇjXp(5étõ«ÖøMTQZ ;‰EP)ØoÍA>Üîúoûmý„ ~ÍïŠmÊŸå ´)W[Û”ësd‹‘ÇÙéá·ÀÉÖëºûÈÔëƒ]Bk…;Ã24§Ž3ùÅì[Mºi%=6«æ¿ù0‚“Cr¿ªM„–·‚P îK¾òÄw‘2^ô&fÄô$/VäÁ\÷¦z€#û¿z¯ÍŒN8hTæÎ„ Äœ_ + 4½çÑž~ÞCìSµ˜Ãym ‚%°;¿y[¯àfÿáüí:™EHœ‹ÕËu §(2o…1(Â6Œ¿ùõ5¸:Ž ÅJ9í5‰àÿ*\€2µòY“”±<¡Þá{ðÕ4È3H{BƒDoš-Œð·¡ÃÒE\Œ‹®œth:£yTP§·q%ýÛFX¶¬hŸ?<¼ê¦Ð^$¬œË†-© ¸`s7ò^~4fUº(íP²byë³=.$Çùæ¶h¸Íš4‰(`œ%EˆqýB J¥âÜé0ÁIÛ`R•ºsòDÎvZ(¾øe-â‰]ª5ëÔƒDKX(Ÿs,¾ÅË~”5…®ÌU^.$nqoØq‡EuhžÚ¬Äy mŽuèïÿ³¥ôMõ]qnÒÓ Cë3 •u –ù²ŒqKºê'Í”·¦ ÷çÇq’†ãü œÙf>Õ7ð,PCш§…,ˆXlÆ@‚KŽ“& Ç×^ÿxVûø³"wÓtH•¥è )4q»£ðWßµˆ…$è5Ú/â«ÈÑ4I×x‚æQ2£|(JºÒÏ¥’'¸Hᬛ³Lw˜öhPÊÛ ÑÕŽ"¼¿  ¥0ƒ™GS È|°½2¦/Œ}PÌØø—íMžK‘ËÒÑ­¼¹•B"ó"ñQk¸‡Ç²Œ¾µÌB>ä“l»¨é¸(Àûž@1«¡Ý­(mŠ«Ë=Ê6y/]L×½(;cAÞeçDq€mo“-Ë>ähClÎiÅÙ²‹Ÿ£UúŸUx ½N·ÃHd"eEElWPbå.õªÄ2“‚¥–1 Áð¯ 4u±k[ÓVŸß»F!€þ'}Ñ$W‹{ÒmIx;j¾íž–áý'd˜isíäGPÜÙUzÍìJ9 ›ûn 1;R%%›‰I˜Ìô,_„xÚ‰Pe£”¯ìÒÚ„B`µ·!Ø{ØJ—fúëS›8]ÞõKóéâsQ©aä»P}Éœáý<àHÇe{9µ…-áWØ|[¢”_™~œJÖ¦œ~ï>ËûP—4|ÂOb‡}a±‘[¹>z ål$vE"QÆrÍóÕÄh×b¨8‡ÐF6ƒÑq'Ý.òv‡mrO^ÁÁ†Ø’<ðÛ‰§ÔȽØü/éÚ“Š;—Ù‹Œs¡·Çp{/*DŽŸœM™ø’gö@gŠpòê›=Ü3g>¼9 ˜¡ jÇ‹±<ºÖkù>àŸw—8ÚS88l›w‹ ÜècWÁéääŠïëÃÁîÚfì·ü‡Êógþ+|´‰^ÏÚö}^ê‚÷EDãû? ;8»÷¡Ž©=#~_¾Ñóúýï5Ï̦<7yûüü9¼ü_ Æ~#ÙjÏH"ïM|åB¿p.wiÿ&Òøx; šØaw¬ë̉©/›;óH_ þlÀL‡O„o±vêì‘Ê\Ýæ6ékª®¡Ý{ê—¿‹¯î".,âÄÎ >sá—Ùärýøù®Ee}~=V|Íâð…Ø;@ À`?:-SòO‰k“b aÛ7Ýt57G,̸sí­†XƒóˆÏžµñŒ1q€ùVõÆ!än«ngbÄZy`§ÛFfó¿–¶·À,²>D_ÉÅÒþÿ‡ã z A-cOʦêƒÇV·\¡?þ€¾Âþó>®Ùl<²’Â⫝̸Ek'˜3Èï)ļØvû7’Ê£”ìøöͰWZÅ–`º{¸–Áq<<+ŠšdtIac´.¿Â­Ì5±V7Ýu:Ä̈_'ó_© ¢ ×D‹Qb¼=Ä& Î.-[Š5@ýUäÉ`¸¾’«û xA±«¡T Ìw ˜é®ú?'q–4Z2FóF ´âmÀ·… ¬«fŒLGsü ÖN”‹CÌ ðrÞ)¶æ‚íGÔ€©~Þ%–`ý¿¡ë‘ Y5x›ËÆOuëwØèe?®;þ;¸çÓmêè¥/NùBæ<´ùh¹ Yj ¹x Å kR÷¢è!ùݬQ´6&Z½™`hœ¸G”î|â»¶¨nGìÍÈ´2’Œ„ý;íú̬•3¸ŠË@ 3ÈÈ¢sÕWðo5‹5ÒœcJmñpeüq†2Àrñ'žõù¾5KŒÉi¿ '@ñ)|÷Î\H]öo⬄–/^>B…‰&&ôTÒí°C ”àªj”£è)q-Ÿ2% v 'WÖWâøUFI/5Ž $6Þ:@ž[ÂA*Û3&ªAñOÅhàªÆ,B€{ÏòïôwÒ˜NV5aŒ¡3Äu –âcxÃBÒ{HFùsTlF÷ú1 ù ¤šÎL=Ã…šÕAîä&CÇÞW¼Žtšè c¤œæBݼ¼—xîåZÓÁ ‘9œÔ)d¾hƒ%#`ƒ;„éû×Û ›ü–ÚµC½è¼.¥B‹8Ú¡­._F35£¿ƒ¤ê;|×|Ãm…Ģʑs(ë…Zheɦštß2t åK7)óãÄÎ5±¸ÕÊTц1gLW‘ªð! ZÃ(zdhp¥wÖ™%ìWx™ã1­ŒÊ©æU#ÓžÆ0°öhCºO@‡ñ„µÙÅÑ Ô˜|(yØR\46%Sh}‡ÞRv2¸&oãÎ:¤6 ù²ª†-6ƒˆÔÁ&H3ZÜAl»á=²ù  p§V$±?è§ÈººŽf kùÒ™ÂRÚó5âòKw8çÓ{S÷€÷ÅWœvgòåö<4ÅfL$MŒ°'±óûÃ6ßÀ˜¨ ŠI¥-a>ÔÝ\®v†:’Ç®>r¸XœR"$Ù5\$_V…ß(½Â`«Ø¢FûºÞØò:é»l“kã¬Ñ›ÆÁÐOëÈÝ"¿ƒ=ôšØ;E^Oñ~RÇ2º‡€1Fy*.Šyxî\|sÛ&ŒŠP~f§Ð\„Ô:1®ˆ"gÕQÞ7ñŸÛÒhS‡²#‰ÏrÌÆáÑ=¶ó‘sãšTïzŠ8d2b䘦ï¿%ÌRùö€|÷¤´“–zvÀhËs5q ¼7†©sSà3•ä½(oHF´ÇWJö3é¥o¼–jñT{¦­¦¥¾ÖÆqy •„D°0ñB[]eÀ&ª­Ó±+,øéÐ'HãÉ>Ÿ£Ð¾I,З‡Ï’Ô,ƒàÂ%ZÀ8G£äh³Äü‹UÅQ“D:*KˆREyÜ­Ì|œÇ± mePv©}ëòCÒª-è½sþí·ócL»:5ë„D?ã[þ½Hôìµöò .&†Ó@5a<šqáé'—mþ=Fë—Å)¼¼ñ¡oþêd/¯&[h‡_›pÇDßîxýþ#Ïñçý§;ôa¿Ùú ߀´ÅûØÅÄéy¢g2>î+àæg×(R“|¾!Ê¥÷ô¡Ÿ«“„K-ûv¿6<ûü“¾]}˹”Ùh߇«¦þC<órxAô_¦ïƒrx†kŸDŒýVUÜ?­MøvõX>k˱k¶%ÍäÁ ÝúLøxqjgËÏ#ž,¡]«¢òf/=ïJž?ß*ºmm¯Ì ]?äÞŒ{Ÿf€x÷ n+óàQu(;Λ &£xôÓòÚר_B‰]š…pþt'p£®Z A•û—8À|DùâaO’+'`ˆ¶g]…ÃlRÑû¼”'5¯Rý÷EïS¤ØË? îGñuŽ7T Ó%Óî&JÚ-\ËÑŠZG ¸P»‹›ôÃðkίš†/;oy'â~®Äm(ù£7nÁÃÂT(ã„kPéë¶oÍ¿怙”³eix~åç”ns¼Æx5†áÉò8ä@¿ò²Ã ŸxÞ|„÷— ¼ìW„ ÇØ¬Í¶EYRÕÅKT@¼”|´¸s§¼çiàÛ8.гW~Ò‘Gó¾=KdLÕ¾›NÆ‹["Ô³H~ZLŽècâDV„à²DÉh„‰€‘^L‚ýY ?Ô ¸¸åµ\OÝ \’8b†Ã(C"`Ïm¬yáƒ@‚D ˜ˆ8ÍDlt"£*|öëˆ5tûAеm&:£È'³µkÉMlJC ׯþØñÚT°¿íGú|¼ìB¡§ÒRo+)ðâ{‰öóœ64Û8`Ì ‚Œ»àéΞT­ Iòø}œ3„¼‘xO*Ê;1}ø±kÒtPG ޘユ¯ÝµsDznÕ•KÄŠwýÑ€ôVDƒ¢¡—³&7ð]·µþ· RÁ§àGaðBÚ“:œd%„5Ñ™ åšP‘+°­—Ùt·³B³i•¥oXdö¾i² h >¥‡2~ðëZu½2é×ËYe2e´€« 8Ïdiò¨u‡Ú|óÃÛ ÇBv|ð,‚/ưâ­«ÆH¯^¥]|ïw¸ÖÜ.ÞaÖªF –Ù׋§”¡+›Ú¡8Tf™%‘”æT„Fø`âœFÓN¦q‘®fIU Û|YŽÃŒð§¨7ƒl§„5«³˜¿‡Y^þÅhÂî50Z}YLjÉÌšÝsï {±ÃfÀ°*‹¦m÷šU 7, Š]¨—ÂhXÏ3 *`åÆ˜Vfê`k>VUÙÚž/¼Rb»N2ÀQ!LÃiûÆß71•q1ö2õµÃ`?¹IÚ´.¼%àÇÍ¡¸…hèV¬ø¦¶"2–é[µA¯M8eõ¯)ti†ölá …ï;…šäÇ-ê&¢> ŸË&]  ÎE²„Ø©y±m ˜6´t瓪Ýçfº[4§ËØ‚Ò$P‡á(Y+qqð»3¦òÝH£5³%Š{íèëu$F´‹c)®»^öx©qVZv)1 æ? $š”1p¾;¨›ÌDJ`« ú´Œ®-:dnëN ­»ÜÂRùwXÝ>½eš}ö[IŠ WŸZ\R®ª ’SœpS„}gÍ…ç‚PõYÇT…”úÃ)d逸d´“h vÃeÞÄ|¤J ¨}ÔÊZ>%­Û )ô-€ð¸kuÿˆ:ûîˆÈ‚áv'y^[††X©¥8˜ápã,pM4—>LHŒD†‰÷¨¤ÖùÈÿ¬úþ•/Î9Ê&¡²[ز·cy9!MÐuJ¹bÂÐG)ÿY4ös®Ç-މªï4?ÏÉN<áNN|]Þáíè‘u“7È ¼ÍIÌdñäÍ–ZÚ@i%ÍP¢¾±<Ñ´áò óscñ§vÐæññb?±˜åõ^2þ4¼Apxÿ³î#]p`j,Ô#Öà#JoLj ˆ ÁbÐ&J#‰OÐ<ø®ßÐÊ`…½Ï&7Áä!—"‡<&j5£œgÅ9¢8œ¤1öš2ïãù5 ù¤ñðyÔqùÓÒœäk^I;ÁÂæòuá×ð6/“J_ Þø«ü×ù—2o›~ã!ÝãÝËóö)Y qy¥½Í;å~]F)mªG?ÊvØÃâ¬Þ[Ž,#’³d(wå¦âcîG Yº7‡Ý¹áÙRÜïèø<øI1»}N¦ÿ©ÚòrÝOí¶©­ ·¢ ˆ^Ë,̯kÛ©Mi±Ç c”X¿>dô7€ÿj€rÛT!5}Cz:|;õr…r½ãü|–ŽíáÿGùqËül!³ø~Œ_â÷4sÞ „Ý÷ºIÜž¬”xV1¬âÈ÷W„Ûþ ƪd>Œ«É÷DR Çâwßg‡z?<d¦2ÄY»$ËJ×TN³7\¹u+n @0€*½zŸ~ää7‚ä Û*¸Þ–€8l?H“`Eš ¯Qœò†6’d“Ã9-˜ †ÙŒŽs±/nìÀ^%bþ0”Ûáwþý¸<Ó9B§q€¢Šµm $âu´ç.Uï/,Ðij¸ï<Å|Ôà"èà]_Ûe—Kœ Á?ÈšQZ5Ð%Ä_Ã%ó2Ó† l-×TOeP…oä[ÚZ£”z/\µ˜%L¡ <p‡Áij/£(LZNÇsñ¾ÝoL¬©_}åû±Í’fA2qNXai™%.´÷KšJ°éÖxv¬M—o÷/Z¸z““éˆh¡Dí ‘Š¨Mä6˜\òÿºžuçf¢ƒ!‘‘»jìfî8$ÖØÌÇ|ø=5ƒÎG“I=ÖV§Ê¸©Í DÄ„ªþ1JµëäPúWq¬QÊGD ‚ì€óÂC¿Zi–j@åÁGT ø„4LƒŠÉAdCk…†¸ëè°Úæúb!W\]§¸–ÇE«iØV éøjBB5Z½ bÀŒIrN{«.kú2 âUÎÚ®¡)Ñh‹˜ð¸x΋m4øŠ©AáC½rkÜ)Cë±ZÅðý+.íì{îÜ0ób4ñ¦®ØYÏ5ƒV“txôÃöøpN»Š”ª‚å›ÅÀIsñÊ!ÄÄÄÚ¨bna¡=1¤ËVS¸Ff©Ë~ð ‚¨Ž–Î²¼xn“ 6C§„Îßœ>oê ¬Ö¢Ó59°ÀE;âûÑ|u•ÄXøöýÏn·| Mñ.ÊiçK’ùÕ˨û~LÞè?7ìÿ^3Yo ÅVƨ¿ÓèìéàÿÀ?¿÷ýÏì+õuypˆžêÛk壿Ìk¬…R]ü}AZå3`dfcоáßÏ£bÿ ãƒ+{!3á^T%Ú„Z–¦àEb>¦ —‡¶ºÃÎMð&#·nùëäa®¼ ™Ík+ñëÀYǨø€$„{òúg+«øÔ› _sÈ÷ã¸àkH&<"Ç—›Ù$˜æ™âïÅL€TëN¢6ñ@ýÇ*3~:ílEh/z`’Àõ’:)c¸œFlšÑÔÜé{~KìA9÷ 5â*8†Þ¼G <çrp}Ä­î½çs>mÙ7²¤¢W÷À7&aÁ„q9 n~w'a|²–nd_ÆVÛ¶«(ûÛyî@¤ÐãI,*Dk0“x‹O¢'0aöÛ¨ü¼r¸M®v&Ljˆªà©þ+aÀqõ•ž2I{ P.a…x†+}_ç¦Ë†_‰^1ŽÀŠó­Ÿö­¶EpQq2ÙÚ¹lˆ703)ÕOÜLéç ÄéAÖ†µ¼÷Çûïý¢÷*Ìz9J´~ m`)`Lç\:O q$î¼XŸ´Re àbïÁ Ûˆ¶í)Idz¨ëGºaõ‹ ˆ«Œ±¬ä[ ˆª¨óÍ6fèÔg«‡Ž¯‚´±¦—ÂbkÜ»ÍåØ÷H}õ™`Nò_ ®D<ûÍo13pµ]µA R˜`uBò’¡{bxEØvÀÃÊ2æOM)•›qÈÌ8s‰!ª½¢âP Ad r«a}›,ÌUÃVŠËf_P#]åJ¹ÆÂ0Î/^'Æ:dy”-À´aÑÛR×ú-¢û––+MîÂöF Àµ·Ë°ÐÀ“ÇuµõOY!ÀáÈ3¥™TÔ—_ûÐ*ÿA–Ÿ8Ü À ZRQ”/ß IF6˜$9-£xuR¾`P âË$ba¼Ù-6E[ üpHá Ìýo\‡ȵk*jTPkEè²ùÆŠÅœ¨v¦IYfUÑ*¢¦Ê ê(ïF˜VŒsµ‚ý‰\+ƒ¼"l[ y JV@Iôàúa*Ù¤ÄÙSÆãx0}Ѐ*¬ w—|RKÈðdBÒø¢¨FðPSúíŽ%ð-ÐE!sÝK#@ ! joýƒiÁ–Û¼¡Z::€2×\¶œÙ.ƒ^n[Êqƒh¥x§œÅÔ¤°Ú©’,É{°v!ÿ"lÒ\ç$P™ƒü¤‹|}y" 0•1¤)F]Ë%VKî«M¸¿¸d.ÛFæ@à=†¿0VHóF¤Ç9ÞD’3<#&Ï„\§0š†(F”Õ,»Pž8õÞQ“À†J– ©ëE$–WŠ ×iÆÚB{lŠùV:‹kñ.=ü<âÜæ%°Ú÷hŸœ6îÛÓ1¶°Û/`'®»3Žž¶K´Q×7Ââ _Íú ;Ðkıö¬Ye½©*ñ!äº@iá'G‡Ó‘ÕNÂŒÓätD@7ü“‡®ÞH0¿VÒÖCøMlˆ²h? K¼SŒ¹Ÿ¡Ý“¹äÝIîmãñÀ±ÿQ\œz¶$tˆ¨0*Ðð¼FP¯½`ÚèÄ岆‘”_k¡ç¤úx×D¡Á‹¤É÷ŠÜ‘Іú}îÎ)i˜P¿ˆUYå±û­Û*Cù\0ÒÜËWLoÅvá¨xÁ~-yDnχÞ»ûÉÙ¹­ý‡ R93+øä¶j`8 ß7/(<'RBoz‰–hËK!°íèæó’ ƒ[OÀgš¯—o7SGå0).ñ¬dä±Õáá’ÚklŸ¼ÅÔ†œû9A<OåÿˆC0;h¹tö\ˆEƒÂâ…WŸ¼Ÿ÷-…žçâ+$+ùó.a-²ð¼>90-–"¼Å¥kÃX…5 Ї/O¢6ôÚŽö Æ)*q >ŸôÅç+Èdô±[0Ž™0¼šK¡Kqi~ –K"ÙQD%Ÿ)-Õ´¾ ^1¡¦™×8¾Ï‘Y#8Oƒ‹+k'… ñœOÈ· (¤Ä=㟧æ¸Õ•ç•»MøÞ3µÏBä‘Ç~Ö;Ñ_܅ͧ÷ú‚jàÃõ=ŸükóxþŸ€¼æ*»•žkDÓûzöË™«ÖÞƒŽáLT•æ82jãM£ äNÈ­€äúG¼VYAgLR¿—vÙ”ÜÞ&²òòøþ¼× ·ÍðŽ2Ó¬v ºÓ,6Z:Ñ9žC÷ª™®L¸·­›>.|SôÖUˆf€Ú;c± —éû¢`Où?°QÕøþø}Ðæ›Î?'­“Ný™òæ3ƒJõ?ØyoCÃô•ÍGbö­—ª÷³bôXï‚n>Þí^ÚÆéN³}äùx:FÓ³VàççYKÀ%g6î¶zÎñ[Ìfe|™.#('|*Ü»ð)Yö_ãõt@o‹ñ”ŽA̱C†~ 1 ñ ZUS‚#(þî1´<]{:¯ Évp²mW•ÛÕš Wrò•O~Ué‘ü_6¾og{B’ÓŒp‘Rð^/gŠh¹Lƒò0àÞQ‘wœHãe¥ìÖ Àlþ^Šy ¿Î>PyHùþ mP‰Ü^3O,Û!˜wÙºÄttj³à]U§ðkšëí§Æ/Ó¸ŒkKóϬȓ)Ðmoù˜Ø¹ÀsÈu×Îÿ-J9Á§}#dzæhRG²ó/6ƒOœeªáÉŪ^múÊïD}²Û  miM% ìè´Î†w,Sô]tŒ­¼®{Ó<ãx®¡º5ŒŒ rz%ÑV{Éð§{%£3jxÈT_ŒüÉ=9!âvtbÔ $gM™´ÿqL€ª\ £uïONÎvYÅ£Û}÷€õz†Vâøs]q¥½ŽÂoŸ’Ë€GÝ»€î!ܦé4›[µMÓd¯^] ºý5ÙÙÞ8“3}°WŸÁ•!fôË|vÆP*d—síþ;ÎÚêm®ÚO6¸ö¬'ñ0Ìs¿ DµÌ½tžé†ˆïˆY-`º.¡`"ÌÑÊr ÕˆÌ U­nˆXi!nÙñëê¨IA©r@B¬®ºÐe¥J³Á¥ñ#\7g°öU¨ôɆ%¤³ŸŸHeäá¿Ê!ä-| bôŠÂΜûƒKö—AÃ_€'F°baòô@Jem8×®'í0_´´6Ý õ_³GÀØ}2hP!òˆ}¡"{gB#šIÂ…¥‡%Û†ow0aïséáa1 Ö4Ata­„DX_“{E?@Jç6ä†Ùh„8£/ÿ(D̪~mâ_dÅ„ëbÈÀí峉2uCÆm…cL·I’¶ŸS¦âR\p!¹ñç¥@Ïn»;bð-ò œÕˆåÅß×vÓY1^°Pàé$dén4ãÂQ ÷ë÷§Ú S¤nÔr.Jq†oEóžG}¦§4Xª B1ïæ¾VÖónÁ·Ké…n¼Ê ØåiQ¦·5ÔDMÂT›®ôÝmVŽs3W( ûµãœ”±?Ä#ƒqÃ(Ó©€3÷x¦RPª„Èæ#Jzó.=@Á½âc˜±%k‘ÞëX¢­‡:äÀL²'øH¨’!û{g÷›É"kêù^ý¤™ìä%â;/¤gâŸò±Hø\» .CƒëäšRgiÞÒÓ¯k6Zj*n·Ð°+„ãBŠ@õ1!Þ‰ØUí3@‚>Hô«‰Aw §¿¤ú|¬ÚŒ–/·i0ºË.¶y]„SKq†“¼´`S¼p0ïÌñ!:9œáÂMR¡§šs9Ë)fh”%'„Ǽ²_h…m “:Œ>/¹¼p0@ø8µ:^k@–{Íà7ÞðúÈïßrná/¨Ì>QójUü~/ô<Á3å´Ç³…¤’AÛùTØÕñ%†ƒè24ÿjä'óÇètÂrӀ݉t™Í Òo\Nß6ðËàg[|s-ñÿR¤zü÷5…´.7 13ÁW!Ža,]`KÏ|/‰ŠÀÎGJLDéÑ tvW0=‚RDз\(ɤˆÌ(%ÑõSˆy4gÇóyƒþÜìl„Ó™Åï4<3]hkÚDúpöyý®Ð¢LUýááûãüå/CD_¬a`:~d±©ü¶Ç+>K¶ß¸åT-xïµ(fZqùÔŒãõg`+úœ €BÙ=Ç‚,h¸¢Th¤:cU±Ø$qE‘íÄDôPòÍ´mÙÛkë8!WB­²ûò·Aت0˜eN†÷  =0'|ÈÁ›¤žƒxÈ…¼©:..RdªµÄg™› T^”50óâkÂ`¤þ¦ÄÞÎA„ô_³êÒX¯ìi[šÛL•Œ•Œ³X²V™)-ä®$Hy8Ô ¢}ùÙçˆèKÚqfrøN˜7‰ÚSrX³1ãkË­–1ùG¹}kWð’à$Cþ´¢7±¢ó”†{·À‰ëÊ;פ¥À±T EnXkº°äFI-`ǹ=tª“î1u lW×Õ-Iá±a^ÜP‘^{D³v¾R’5¯†dn`qØ2S ’ðçúsf¼`R0¶¿HhÁÇVÉF­z³°Ö“»`^IO ö(ƒ¸QŽÃ.ø.v<Ø+êkóà‰B0¼ãD‹yÒlbÑzÂ…B0Ié“{E–ï˜Ûp {LDÚ ¼*³¬íA@YÃ€È  Om¦m­vÓû"Ö7Ž®0Ò9L±èùéí(' v3Kê(O ዌ4½\äQ5­0G˜©gô±Ew ‹ÌË,*;i¨¨bŽw}¤RPžs·¶‘€?òÐב_›f Õ5"÷1É_b›¢ëˆs<Ó1P#/͘ïA:TZ¹ ‚öDD4E>È" éÚâ‰Á®s€Z×ç*”FÆX±š>ÐZ§ŸkÏB¹¯‡:¹ÏU7Ù¨ ̳*1s>f#eŒy–Óu'_3³D娤d»Bè4Ë]G¥àKˆ’±¬BP^% I‘Dg!² ²@Ž^u‘¹¦ÐÆpOAIg‡+–?{ÐËu†i]x²N÷õõ½Ã}f Ë5šF¼=Ëc°")õÑ{îÞ7EW%Уܽõœ?&»gñàR)-p£ä,Èñ#-y_­Ø´-Ãðü!ø÷'é¯0ƒ[Ì´Q¨Ú¶5Š‘[Ì˂ϻ ÚB `"¾ÉïGlwCc#J•«Óš £õ_öƒr4¸{íg¸|¾…eˆqe|»”·V|\™ëbãÝCcðl¸çï)‡ïWz…ú²Sâñ^SŒ\)Úô­Pr¼¡æÈç{³Bb&|ì:›`i§Sn.‘u;²u¨ùTü*<•Ò¿ÙÃÕ  Z øÂµpéæ±Mþþ 3±æ¿§ã½„S‘ƒÕ` GÕ=ª"¢öP•†V•¬“»Íƒ¥\åÓºðƒß¨Á¼@{H±ûÁ–eì5xRú9™ÃG¾Ì¼Ñ#÷þç—ËåÅ{v¨¢áø¼4Ô¿_“‹&L¹°Ð꾆ÙÕ"Ïí¿Ä&w}ቇ³çÛ\ÃZ‘O|:r ÛZGüDÔVþ?oY²yÜm—²îI¾q{qûâÍJ®•Á~EZ»ð[7t¦¯ð&üòïVºäÊŒ*‰¸Ѷazq)+}ÍäVÜb‰e)æ90›ÉŠ•²@_NzíàĀܛ¨;·yûp¬æ.!Ö4J¡R”¥}!øþaˆZr„ò }(,Ð"FòzgÐç-u# .rv·¶®^W0 +¶ jÝW4û-{ÐOl“ÉÂ展Hš.P¶›2²‰µˆØMil¬žH_ñ¥Fª'®4ƒfóË›Bñ«–ân$Pêד¬Ÿ-”Ú6~Ëß&k13×J3›§²ô÷ß©h~BmàŽNQ¢Ã÷¹‹^s€˜îz=Z9cYíÙîŒwÌåføh;BºÍ^ «\Ô¾Æ1ð±W!"<ûÒB„„äÊA[˜È(Â+TËd;{¶šv_ü·!û&k"¬‚¿©C®DFšººB·(W@„Ì2^>SGR Ê1¥Š­ée\rð€Ü%߬–×*ÚÁQb£:­AŒöcÃGëòÐn¿Òû\Ô¼Ôý"lFt^øÈÁ…¥&6°«a‹¢oAÖ¸¦Ý/%ñó”á¿ÖÁ‚fÍIaK$ÙE‚õãq†ñCf· …áEgö|Üb3ìãlÛúíb K„•Þ=¹…×*uííÉC!»zÚRÔØøÖöK È9ÅR)Q?¾bh€þ½ž¾û^0KDÎ’\V¶0¶}·+ã<Ç»Í3š}H¶$8Ô¸ÚP='wåäé-˜ùl×%ÔsD*@»¤á8ôˆh&(1‡#ãdï©s–(CR‘ãg„Zµ§@`bÓ{–þ‹EWß,ò»‘çV`ĵPŒ}Á М"Õqìëà±QY䮬-d0²Ô¶ ¯ Fà…Ž(à¸ÒÉ3Q¡-Ýàj¶4Œör!٤\…M⻇h˜LØzÊÉP«ÂR9¬A<×鵡x” Ø]Yã¦Â¦Æ1q#S²IðÈþlŠ1fåÑLÑ·8Å™H"ëWËFŒ8„ÆwIí‘% ‹´°.âÞf'FFÚfŽBcâá1b0_¤„\vX ÑÞV›#Rƒx0êOÛ&õÃw-^q¾U'âk!m!hÃ.äÄküË•‹ãÔ& ­ž9E¢—3Q ©×YhÆ<8¼á ~ÁIzЛÕlùëöêo×Ói¹öôRl ™UÆ”³c¦‘’gA§¢òKD'•´‹BÖx S±þôÜÌ è› Û*òË,`#†ÛÞøÂÆÞeèÆB>‡R WØ!E…ùlIY—v”ò6æ÷ŽGQ¤¹Ú qcGŽá’ÏX¶cñŠ#&íâšk|h”§ùèãß®™š*†-þ+ÇC²P¯‘3Ò „'›…0,Q!&m”ç ˜]&O±š“•Ueè0éªÂ4'9;]|Ï·¿|(bž{Ç2ÙÚ™¨Ä­¹9Cê ˆÜ·„Å™’á|%EÖ_éÍô{¬£u};›~à×GCäS`–*ÁöM³ Ut¥¯¨D6lKÅçºäu¸¥„•Í‹¿¬o&ut0°E£$‘æña wÁ;¿Ž=fOûÁ³;ëˆáÏë’’‰záÏÏ;H.W&‡!pâüv¯ƒØiܘS'1X¡Öb`4Èdƒ²/í lê½0b íáëß H u¸ûÿCnמ@ï¡‚Ü»uÖ2y§Y¡¸&&m"ž!tÕ˜/— Zw1ÜÄÖ>Â+Ìœ?"b/¬¾´ã RíæÅ;}É•¦6ù¿,±wV+•ðo˜70þ®:ó˜ósÅ¢kNÛíë(ÌÊż,óØÛšOPÉFïOêZ—펺'ÎEÎ[Dì2Ï7•¥ûT¾¨¢ÿ5ã…Þ`U¿3^hØå«CŠÞøÝû“~ôqRD;"׎êVÃ,9\,ž£Wœ©í–gU8`ÜTûR®NDÀ=8÷’ÅtºQXŽyw'C»Wj‰ »Ç£Õç˜WþÌV¶“S>ôŸ­»Ý9⻄€øsñ2s\´‹um>èˆý̨»ƒ nç`‰RqÕ¢úkt?,•‡z¤›–ubMÌû°N'ØŸ/é–yvƒÞÀ«€–ágfŽR®ñ¬—bØæ•+WEо38–ýŒUô} SJ×}·/û¾T&γs8=ƒÚçêïš×’ƒ³éÕ(p_Œ“Sù0p`Ÿ5Æþ†‹áìñþ<¿Ký¿ hXÿíbd•?fš|m˜ª Ü|ªzéÐW‹'®æÏ·>ïÒñðx|fŽ˜EƒøýàCòý]æÐ^Yÿ8ý×>Py£ËÁFãþÛô— #øËoTPÝåmñoÃØZû|e-eöÙõhDDôù¯–±!íõ@`­iÑjm¤q@˜E¹ª<”Ø`%w´z#÷O>UdÀÇ% ¯åC¶×K~\¯îdÁU>LïDáu‡dùmŠßšsÏdLÞĪ®•gÍÏêöç¯m¥as²šäYYÊíÂèbÍŸÁà Åh;0\Ü8Y­O°¤”€<ÇžFj’ôX|}šµc]>2ö:b\¥ƒí0à"¨.Bo„p\'q2ʾϨ U=6;Þ0³ 9òÑÖO85ºù•=ΕTŸ"Ü ü5W€ÁÄç&ЄºBV=&¢¶TKh©Ÿ ¥Gz¼B€f ~çý»P:»3Éœfaœï1¼Ã,…ˆ÷™:"wä/pp<ð¹#‰2%CÅd|+t—yGƒM¨j¶*ÒáÚ†ËsŒxCÖÖ(+ìÁ€°­‡)X³Bò¾]ktã ·ï ¾ÎN:)‰{» ¥’ÈöA”i™¥ý¯äg[>éÓûKÌf“ÿoï ]®v¥<7øØt‡¡4ßv;¥Â¿"ÒøuõëL´|F§ Ø ‰-8‚X_¼eø ¹Š`ùðÆh¸áÇt{òkâ(+>œ[‡ØM®nE5ñïáoB†SUž\*'à?¥C6å¸6ëåŒs®µŽ .ggcê¨Ò¬£ ÀÀB1N=âòš·±×p˜Eô°3§‚kL0…Eô™–¹íå¸w¢]ò­”²‡’±ºüxT°¥~OMÕaàa^þC ’·“2X"}Úʃôe í 0dV[Μd0ÕÇ œÉ$Kl][„â(vU=,â‚rªP1TtA1ŽßæM¤Èó&Œ>¬:ën‚NpuѦ x‰Õ_°ñ«¶úÄv1¼ôŠG€‚M±QŠ/$ -@o…@ò½U¾ ÌýY¦fscmóÊ™|îºÖ»‘Ýn8"adá̆{F|ǼüÁzUÕiÀGBnp ž$÷Œé£Rò3q†ÄK­eqª2ˆ(§•Àƒ‚~ÀýoKÀú¨¦aÛú²+›ú·þ!k¯6Ÿ V'«R•³zù¹ ÉU8Ÿ›“âW¥hq¼˜]1aÑGŒ n™ÝÁÖ¶¡}ˆ`3| =£î¿xÔÓIñF#[9e]™nVæ¤Ò—®¦ztM‹Ëʼ‰Îuì@Ųx1V“OÆbîNˆÿtÆÝñ>EÏo»3Ÿ4Œ ãוlñăÉlƒvÞæÔˆà©viɾ±éq¢ÄÊ#‡N;õñ¬\ÙØGX”ó¡á:òÇŸöuÿ.´Ôö¸z`x‚芋œÖ:}¸W HÏw§1VUÕT ¦w³H¨Ý ì`[/—j׊›«‡çH 4?Þ£¤Ò¡d„cÃ<Ì.Ãôcä=ìÝDCÇ`ו¬#C}åÌþ„="ãeæóJË L™L‘“b\“ˆ@’®X€öž¹6Õ%Ò}ämQwâ©3j5B/„¬³!„!Z‰Òîö—(* ý~.j‹Am—³°(ñljö}=ABpÐþÙ+¾ùZVÒä=цlfÛÆ{È'ßPN>|«î›moF{©–p\#öߌ‹nÙUœV~¤%x-©Ê*ì퀌¤°å p¥ÖTš–¥3Á/ÖlP:¿Qœv;ñòÊr¨¯¥ÂäºÎ¤GÞþ-̘ñtr…–E kpI³…‚9b‚ #]/Äw‚W1‘xð‹nŒ¼ñ¯àÙ„ H 2}…Âo%Øû(ƒsÞî¤ì÷£¢[x›ÅÆxüV“rDÇ4˽Ы0[%úü·ñqù+—®X$šzÓã•4záyéd8­Œ©Ôn®j™â‹T(òf¨›¡˜°ê\"¾¬Ó¬C§Ãpî>PjZEëˆ/G‰òÀÎx"…Áøàócc¾é§Ì‚1,IÚ¹c†°áÑ«†öþ~sލš}½¬2_å k˱Á…Œ]–€Ïl¸m4Ûà 'G¨~Gc¯_dêm†lé‡fß0©š˜éö„wDÛ5sY±õû?~a=¹Ö®^0ëä=¶íoÖÄNíñp‹:˜0qCN }:ˆ>09(fñïÜ?=¾ìTºŒä0nà†¾v“F‰wW¶9—ørê¢f¾®ùæýT÷8ךð\?tªª®að^IN £L:wJ¿›³öîCñ•þß nˆbAîL6”Õ–yná¹i]ÿ³åÃ@?’42|žù‘/Ì5¾oˆÉ¢ãï?]¿§Õ…Qü_Yäÿ(,qaæ¯H^-ºwh IZÙËÚ^O뾯¯Þ§E/ƒŒd¼ÿaFB’S~4W¥À}©2iÕo9¿A^‹–žçï ï"­æÎ¤X½ÒOIß)dæy°öjÒAv÷¿u<)  2ʪ‰fX_Æ\ªGÛw 0Íó8uF|ÛæNG~°‡7òõ¬ß†¾¡ÏÂG§ê_ËevÊÔŲ¾,¢Ý¥`Ÿ´5)óíŠK¹Ÿã°ïX}A8¿ñº1ADýùG½‡ªÚ]"kŠ!&ªíÝÌE|§û}Ú¥#Á¯ÆdB2ii¨…òL/‰Æ‰;Êr6î_ÚýV•±½Ý*ép\üêoÝÉâχ0H^@:ŒxnHBð=®:ötÚû¬Ó¢ÀŒ£×bå‚ÉÚlC…ÒíP€ÙÐ-ŠNì0R÷9š»X4®ˆ ® м’Ë@¼œeôܯ„ïÑ©_.¢kJßËw4pè—Ãö²îG¶^‹XR:™z ?B·!ËGýÊå4(£Šð¸8± tÌo5‘ññî• xkf%Õp ÂÅÊŒXð_[-‹+÷ïå|&¹-Yx!ñV*€FßÐ “ŠøoíÖ¢#âUdÞ´x«ÁNM6£T™`Â!ÀøèŽI`áOÉ5•÷ÖêP޶¸áa;…´þQ @J·uû†®:~(CL$2ÌŠ‹¿Í‹Ä.*£0%A`¢u“CÖ „Acšnï'á:¨kaQ]õÔéOX¿MÕ›.Ml¹¹EJ* €´M4,BéF4ª3’7y…–lk.½<.„f–Ú kyUÎuºÔJí¦–i2lÊÃt<|ù/F-ÄÑ|AjJq<)ZþX­á$ê’,\9æ¾Ö¹Íg<ؾÉ!TwÊäkÁÇi”…K hXUèð ƒ Jì$Ø·²’t»ŒL‹×¥îá=r\ApÀ“A›…{,~/ëèÁæ:Q™?˜Q‚èò¬'JÙ²½Â/, †3͈še#G^-$,'%ÃvØ×ú‹dGu×’Iâ—4ú|=“kÒvôõ·ƒ¯£{ejã¢À¤á:q¤-ej˘µÞNl«q ¶-}K…©Ybéû–æ…“û1œmNl*z„46若ǸIFL‡øÌ—b˜2h€˜'1à®kA޵˜³ë¦ÜõË«².­„4 «Ü¤6#@»l#^L/F±Ž0[)šìA<ÌËq5MW,oƦçŸ ˜b€AZÃzòWjc y J€)BÙškܘ“èªä¢RKž¸`iÐ1›\ʹ€¾¼?1.—=A‹-:D,’Ã^êytŠc@Ì„`ñí²\¼ –ÀÈ8Z«ÚmQ‘¬EŽÇ%ÁôÿaHžY±Ð… /ÚqdhÄ6xÅ€ÄFþ0<6Ž!Áï1ªuyIU$£Ô/Jz„½¦½ƒ¾‘º½¿„“ó|Mÿ¹4tY™)€‡ŠÛ[6q"lxà4ê –‘ÇBm5ùD&º†Ó¥á?!b*€ jSá ”!¦”Y_25  + ìªm8NÇ¥$8åÎSŒ1{<ÝöŠÃ{ÜÞ·Ž –£Ø ßlõê÷—HLtC Væ…ƒOxfͺ–¡:q½žò'°-X¹4 =¦@´]µÉR¤/‡=×@cëÊâlOÿÙÃ%èÆœ*KI/ûü«H× WÍD|åA¸/BÞ±>LéPÔ9$ „2oìJ;Áæü#vÙÝ÷°éB‡­é·­‘.…W„f¶¹µW76]†bÓVRù¯w™qOÉx>4÷Ì\؇,+ù0wŠŠTj?îŒiœÇ’úË+sê?¥îÁ·†º§Jz/’Ücdé{ùôbh½°Psa*°7üùøÇKñd=íÉ£Àk¤.Ê™ŸwˆÌB"…”Rm|þ¨ÛƒfØ¿1s0<‹¥_»À±žk†ãn0ƒdV¼aS7f41‰¤ ªR¹³KÒ§uþ±õw`P©A(n´ž H³=¬^è™FH¹ÌϾ€5£D3¢GeäeÏ„º¢*SK¿]74£-ë8=‚žÊ<ƒ5]¬W}ˆßçÔ†‚×óùæéQðRH¡l_EËîGïuk[óàêt€}°úiJ@l›‰± U#¹°àÃÞ嵘ÚˈÉÛ­hkØÑyrÞ.ÈŒ#‰';49”m„wŠ]ïÐ"8h¸$:t§ÒpÄìvüñ(ô¨ ®Y‰°4n+&xSêù•—[>§ÓbiGųoãÑÈÂ>ª};aãNñfõÞûŽ×Õõ¹²çß®Ew \ž ÃÒžyH ¬Üñâ]WÌ%ÚðbωÂüµ°W¾?ÑÎÒI+m÷›GwÄ„ûË#8$Qt ÌÝ—_¿Ïò‘ÒW&¸²t¼//bº5ZuC®phò B]en³Xx@[£êµ§ ´¼½€¹Xkírèþ²øN%¦:±BŸ³ÅÍ">GÙáÜß±=Óöèó Ø¡ËKú‘ OÇjø@þóˆô^¸øÅâÏ]ÿ:’žIàl³HÞ–‘úµëäÁœŸ›`Òç°s§È9Ãö?Å>ô./MɈ€×;~ð“ÊO5†—5ÊèõÛ{€ç‡GÀ9 Ô@\z Äÿú¬"ô2Ø¢1â câ–!h¯#ODÞÇÓJfS/¼GñôLÈFD<I°¡¥èêˤƄL2¤ÍÖÂh%RÎÌÃWt£¯CBõÛEÇ„®i€›1ï QmÎ=ìúï×Að3Ì¢~Põ²bÎ%§)¿#jf¹7ŒVåÂSÊKõp M´ö£Vì¹o-º,‰, „,`èBèb•pb>i_¾ ô¼1ßÂB9œé7F#3ŽñÀÓÙ‚~ð‚µãùèÔ£/âL½ÇÛ"ô‘Ò— êmÒq6ëŒHÚ}zl´§7„u?;zQƒ¢!H‹mŽ•Èy.…`¥Þ’Z†~ Øä¾h2aH„胧_¨stíÌúíâ8 bèúLb‘_BØÙSôu“a›…:Ê´Ï!ÖV^EHÅ",/djÖUN.pì|UE6B\«(BÛOEý7Ì ¶mJ¿¯yR C)ÄB±M$[Œ³Ž~56WÒhÆ·yéXâÚB(ç£6òÛbcš™ÕÓà²æÞO%0·,ØÞ¢DŠ_ãF`Åüã’q®<ªU¹h_—N\½”u-_µiª7S#}ÌJä0&"3ÁlâŒHŒ«1@Ÿ|ó$7¥Ô÷P“6¶p =숣å@ðî‹›â4hÏ‚€,½Œwbö…1„ç´fSËIgà£}Š ~&mq*sœÄº¸̓/18„º Åî 6í tà–Ù‹†_÷¯˜éI=‹T(p7y+xp` m¿HÖ,#÷Gy%ÍDÅհІÚì–0Iîõ€Ôh‘p'¥ó1RtYd›æå?4¼Èa\¡œ-ø‚ñ•Ò૆½éu oÕ&Zó£!¬E›†ý›=»áŒzqIz;+ fˆž5Êpûœ+ºwmF>ìó¯oœÆ[‰Ì®Þ¨óÛ´ÙÌ[¶¯±: …Ú ƒQtL,/Å8iÐ3¢·M¨ŽÕìI·€Hñ&Ì8$Ó´í@O_:Õ•ï{ãïê+!$÷B‡µÑ uû²kÞÜœ:-çÊ8¿¿U¬÷ƒì–|§ÈÎð¤8 ÆÈ³·¬N0låË}³&ÂÀps˜yÄþÒ>¨ó*YÅ0ÇAÎ*E {(ê÷æÿUmÜûþçÏëÖ—˜_rð>àÄçÝ ÜüÞÂ8>½9{ieµ¯Íß(‘'ŒL¥Üx5¥ôxÒ žR8T ŸtmÙ´€¶º\ŒN.¸ !3¡àYô÷ñè ¤r…/On%wn8>Ôwáߎñþý°"48[ी_¦÷ÍãõéWÄä‚—%îJ®ÇØ-^ƒå@ßžBóA#1šùL³Eª]¯$x˜kDWQg\”ׯ†_-w†ÁYÞØ¸ hú°ƒé0À3áé4V¨¸þAvöiäeG߇ïEnÞHWIôqûØñ}–Ë j‹õ Õ6x1^Ã8UèfçòÙ˜4STö$ßHøÜü¥n_šI¢ZÄ£ÓÞ]õ‹Ï,½ßɵ¦É=¾«Rß>Zé—eû‘šw#>Hh{áê¿>c çû¯?v«“?À§VB`gdã÷º·>ÝO‚‚žk &$hh¸gç€hyIÃ+«ã^ûäÛa–ú£ÈPÍqüHÏÂKXo(…•ºP/ã†åƒ—‘³Ù±ÉÊ$~4RáµÉ-ü±¢€R¢˜a9އ£¹KK“ÿ¬Lâ ñ§ue¿R‚¾ý$×§&°EÜa÷Yd.fjfilÀ.S”Õk¬'ÊlHì_Ÿ©Ë‘d´~3v—rkÓˆál•  "Pp—‚|²‰ûád2<,bQ0pÂTWP½TVjœÐlúÔ&ôÕ&ÄŽœg3Eëoß2µÒeü4“a¬´ÐÎ?ŒtµÝrЀà9X˜{mTV²H%˜­ç¡(±eÍ–ØËIM! ¯„s§€„ÚEd6¡˜øî•ät–l‘ßcŠÁ|6ä ó +…„UbN¹.=ÞòdR€! x–6Ö[,é7 À%]M«¢$EïýffɈÀ vÀÄ3‚ˆ[¦š"ñÂûÍŽ¬˜©^£Ò.5¥d¥†Ð+†.Zéa=<éÚ Ù¦¿¬÷£¸3Iý9Bdi~¡¸â r \PÇ\|бi’HC(Œe >KªI¬²ï †œµ¼Ö§€e ¦Àá=0ѽ”ö'Df—îÞ+˜: _SØzgÈ2WN¶ÇWñy³ÖuèN Ò‰',úV£–ø­cÞiÖA6ÕCü¢JúcÇ Þ‹ù_ põÓë.qÆ×}XÔ»¿Èjm_«.}šp¦ øµÖi"®Ò‰@ |"”lÉ&²!.iÚá²AµiÄ;¥ýÓ3!‘uiÀlá| .U8“'>^1Ô±§g–‘ûµîï5™ù²Œ«—*8Y••îðŒàµ³\ÖdÉ9²¼ã€­Ëcò7Ѻî>åݽ¸‡¬¹¹ˆ‚ߥ£ƒQŠEûM“GãB#™bi‹Íâ W´“ÅÛ,–'¥sd*28ÃåZÐæº­Ç hÝÊî¼ísDtiãXes*žiq ÆFqD wp8 4,‹Ã±œ5¨³Äf *|È—|/ m¬Ë¬/ùVâßñ¾’,`†x׳Ÿ`“ø,¾AC&¿l2!«k»ƒ½¯Eø%rMGã£%ÃqƒP—Ó¿’á7‹¶ y¢HÎI¤Õ¼KìÚ/¿d•5»¹„ÞÍU+ !½ Â;³p¥sNa@aYíܳ'‘Áæµw&G‰•õ0uoç°ol(~ó6ô×'²VDd…“GÝ./\öúÑâç4 ÎÍLÍõ)I7xmºö»ó¼s'|JH²ÑÏÓèϨ®íî gê,u6¼'“YHñ…®0îeãþN idV' ¤Þú±{¼X¯Ð¤«cÈ7E ¡Éö¯2h)àÈ/Ô9' ®¼$EÄÎ@1àj>*7øTðÎ EŸŸžäQKõ1"æÈ¯¥u°Q`èÃ]¦³&õ{ÊbÙÔeªñë½Eÿ¶ƒuƒ™ŒðÑ¢è·Mÿƒ Ë蹎1-6;™rŽý$â¦;7gX\{¯’C¥K„ŸJEZû¼Uïz ³Rù Ì¿Œ ù¤\HA¸€}Ï´psh! ƒî0 ?t sÑ«Ù\ãcì`ÇPN´ÝHx¸Ø«œm“…M¨< ò™ÊRþųJu¯»Œ¯hŠ.ÙŠ%å;ÞIÈnÿysßçV°áu'§ÃR1Nb‹ÿ g¬QFí/Å‡ÂøŠçqA>QþOJ0ÿšníívŒ-aý" ê#[çø#ƒ¦-»‘Š¡ôu‚‹vî‘\B=‰„ÆDÖzžãœœÐ­c_5{H#Ã<¢eÞ»†á NöN¸ûâm0Œóg(· !p˜™¢?œBÈpñ,Ÿ <ªëþœc~†8¸{/\ÃŽΚç±KJ8©ÈÖNØ„' o%EÛõaÖ_ÈD‚+äÄx|ÿ+¨H<ù, `Ф,šËâ¡Â™úÆÓ­^i›X… Íʑױ˜Õ%d¯[(ë…•†‘`pÜu˜Û'ž²Þ7F÷‡?ÆmÀg¿uHu<ȳñ„$ä3~Ù3„¡ÕSÍet¿l©ˆ|·âMGÏPYÀúø}Â!·0QÔ•±†‘§È‡…óLV©Ÿ‘o+¼3+Æ @Œ½¦”.¥¥ç….c°‚ñÂÅ?…+fÐV£ÃÒýWÞ@6¿£-*Q w³í" Æh4ê›ó¦ÿþd&c¤\{È`À§Þ ¹ÆzîqÝ"|-Vá ®ƒ“ƒbo¦¹Îö›­*UÆUTb•¼81Ä•t-t—tæ5IûÌ|…ŽC„МÆ&®’%_ËðH>ØÓŠ7".M)Íé=d0#i„úeuF÷ÕÙÎ)ùõmFF“™ÍjÄrtǨž%ÅBßÐd8;0cxtålá˜â’ÒphäÀ¡Œ$a¿~#†¼b3h1]» Ê”oÔ CÓ"ŠÈ¹‹&˜…"&‡˜¾å4?#ìèk¢˜¢‚ØHƒÝëË…¼e°Ö@Aû" ÒÆª *›¶ñÁï2`ÌùYK.v7q‚P‡Ž ªÖ-¾v²’Å>Ât<ƒÀ‚’ri4e-Еm\3p\ZÒ ))_u÷r[Hs¥ÎË…K)MÕ&ìã±Þ‹Šß,p¥g?¼×œYDœRÐs¤€òU„¡q4lsjMÞ)D™å¯HJŠ4vîyÜ3U²e6Lº×U‹ŠlÁïR ŒQϜ䈳 ™gÇšÐsu‡`/JÑb(Äe®ÎÉâW¸à$©‘ý;„Ü^‡Ä~kènr±C¡‘`A_ …³¿ÄYt5‡…æ‰Héƒl†f ·Eâ5B ´ñØr/à 7;+ŽhµÁЦxX4¶b´½äEšêÐþBì'“ù×$ g‘Ödxnš»­ÓkGšÀí2 ÐÔ˜Í4§K8s\® ÇÛÏ \Gö ñ¹våüVŸ}ǰa´\Áë½ÛI˜ÇaBÀÀhÂ7är‚ÈTmÙOG ¾·ëL°è³$æ\¬$‚½pB›c‹6FzĦ «:jWFIP2\Á÷@Ʊ7^ÅÔB:ð¦:Ê!^y×ï½6±ƒãÎ8û›@@Y¬ÁÎ<äó ‘¬X±g%Õ·äzPÛ ±,ñÂc?Êq{¬¸S©‰‹-' Š ¢ænøêºíì%$º0:¦áSߦÆÂÁ—àCUçxݵ¶›zßð†FL òQâÜÐ1:˜ü†íJaßJà³>Š"éq·É Sª¾A„¹µðÕ;{qǛʣä›&BR›ØåWy Œ€°ÍÉ÷Àî’b/6Ž„iÙ0r¯aÏFVcPI’ ¥tJ½ ´©mÀê6¸A¿½†¾Q¼XoR¿C|¹¤©…D•ÎUÒnåt•ÖÕ•õFbN@†õ¥±k‹½ÂÉ-«-ÝUÞH7ç6r¹/ $w=¹_¿ø £ Î–"Y €­ÃêÅøO§›µ-E Ók÷Q׳•zœê¨†i-¹vß! d³<˜ñ€1ÁŒ w^Ü9SþJ™àÌÎë-ã·Ê ëð^®C™Iá7iÝ6“}Ü{4ßßÓjî0X7hV£wQ"å¼úÍÕ ;ß­±Òö;}±„bÂÂ(Úr…|¹°×ÌŽîœÛ—7S•dz™!Éúµlñõêfñ®¤§á­P.iÍ¿œZUߨ9*¹ºP6÷±_åÉukYßBÙ¯è‹JT»c Ñ/…/ßYãŽñ MAkŠg~ó{ìO¸Í8Ït«è2%‹^€lþý¢Aœ¿€D¼DП»ø3§ý5þ*¶×ºuƒäÀÄÏŒX¿Ø€èF…î{‚ {€ãÜHëîfúkà÷µ¶pØïuðèÐ`"¤­¥¡×x~osL)À¶:„t²ï-Rx™aaCñbá×Ü#7Ùñ&Bq]%›¸ØæXLØ¡f*`½jCÏ¢ÄÇâ䫎¼ì|5ã8Øü‘u7Ò¸¢Š7϶ó*³•;<&©¼½ÍoëÈ€E_ç~“æë‹[¨z¶[¹¹¹øimmq zNkÓ“ÔS5NUFACÝ1Yí[wÔ3žDÒîõ‘Ýò+§<²•¥ƒ(ëGE3.'Ï·~[d„‚§×Âz€Q¥)ÏÁ¥öí˜2k¼YÙD°Õ'4'àE‘ë<5pp¾áÔâ‘`q]ñ`|5a%½I®®ÉêÛ-žw¦'"¬ÉIÀÌY…/à…г>…1¼†R1sàϰžž1‡€©ùƶ{ ┦«žÓ9”$|¶ì;­Â)ÙÎÉ.°#:á¬:V¥NöÍ4Á ;‹›æ ˆåM3oŒ Ø´Yñë/ù Kܸx à· óÀb«vãOO.©1¼€¢Ö6â6f !+K•œP¦£þöI½ŒÌÚ¯hѼ5#ÖðáeUÕVþˆ°É;Ô)–Íó-;À±zNdZÈ.g½?—]gl¯hÉϳŽÀMěޗ–^蓲‚fi’€VK³ ¯Š;÷lâÇy‚cjXV=û-\ã`E±ÑÚhÔE&|‰¹Cä{ €®&ÈÇMu«gšwÜmEk ä„dûg}¶vç¹À8ÅHëN r°n ±r º-lPA¤ü´W¾ n•m5†f¤lY­8€vpM‡UÄPXjh«qÏÉð¬jɺKv*A²îƒß‰¶êe.tŠè32ˆ¤rÍh—ÇUu¶Ç¤FÃm@¿e_eŽrô0.½@—h+ñܸª„OC²fñîzöÈQ2êmœØUZ`¨óg,ò]Ó%÷'ÜßiQ ßÞÜíÿD.OT*äí;ãŸï*çø ?h|ã ½°ªxÔ|mÁ€¥”ûÊ<ØÅ&TÊ3 ¯Ú§¢¸A7èŽôxn&êÁä83 a§Ù,ò˜]¸„í ã…y2£FÜ-Ž´ …nhæþ /* uZÔ¸7êKÆðr˜´úÛR‰:6.Ozé?0…Ø@BÏ6³ŽŽÓ¿ë4pv•Ëÿr#Öt !ä ï8×sÚ/¡«»ä-¦% /Q7i„%rŒ@ßN!ÆæKYa"BnÀž@*Zó`AK³ÚíPÀ-œBŒOÓåQˆr$°CžÜ狌a«Èò  3ݬäw\gE) ÄþcŸ+Çb¿¢Àq®½Jk2WÙѧ ë¨yªÓú‡ñ‡Æ€ÊQ;aÂ)¨YÞ*Ìt³ž.ƒvt~߀|¶ä¡ÈcÀŧnÒú˜Þ|}±bŒç|Õà‚r}ã ÿÌ7è¶v{|ßjt ˜K̯·sz|,MÍÁœÆÍµöµøèÏྟš/½ƒ ÚãÅá‚Y4,}»»t÷æÙÍͧF'åºÉfý¼Ao 7ì­ã)âÕlQ„VáºàÓ§7þ€óo¥0„ô–ϸ±;gˆ©½_¾= 4h˜Žóýlèä_G6¥ <–GGvp8;²=äkéÙ&FNŠ ên#Ôuï=WwS¾ký÷¯™µ}P¿,ÀÇqëYÚÇÃA&ƒ4¶¦\HÞ£(ËsøÒëiÌ"š>(Ä€³ú3…Ò ci‹Þ™wúŠ – Öpf<ÚàÖ¸â8f_&àçð )õc›bËÉâTGÎ ø¨Ñöt@ÞnúPW Cäø¦àÆ(ºâxÐOWBÛ.[™}ý¯KDð]Æfˆ£)X¬ŒožõlFV'fìy$É–;íèxÕUߨJjoA“8•W™ ø2<èc‚K!”…õñ %UÍï(½úµËõKxögþB±Sfà¾Ý¿¨ð‰qŠÒª'òÆóÅ*ÌšŸ¿ÌÛ„vor_Ê *ÑÆl”¡ÍÕ«B!} ä4u{¾vÆPcU"§õæA¤ÈÖ€‰qYÇ(j³^4»E|O9šgU~åù‚…B1’–ò¥"Ò18 Ú,´GØ ÷D¿¨.–T¼aä—`J%¸ðÏ ŠšÜol”¯R¤Åó»r;{n{P¦sGOE²%Gã"ÑÑ*(‚ ‚^N1¼º¡xj]ÁôRxΩepÑSÍ INÒÏa‰ÜAТ‡ªù(bHœ@Èr„é(ç¾ñx^·qÞ¡G²Œ­Õ>𦄽0ÈÈØŒa/ÄÕ¢Ïõª|P{eDWÀ½ž ÔU–Ù<ó¶¤1¬hÉÝÔGP°â*æµB¢¡g Òf¥³nƒ¨ÇJ·¢ #1®&Á€e"$2’µPáHRŒ‰Fl9”GhJã ¡b­Ù§G fµQ˜ÖÈ*¯®MCg¬ò޵çÓ­Ó@\ƒ^ÉHMLoV&àhdX© Y¨HƒHRªou òŠ úqžêèœðe͈¢]C€ò¯®ƒÀ5#]¼…6,„C ÁiÚYU2Ü9)†ÐUŒÐ¯‚Y—À ¢wìI…D6-A¤}ÐH°KO†,ɬ8L,”¯?xXÙl5¥êH.Š©Í_O UòŸ$·pQâéAÂB±õ“ÙQë1ã§”ÁÅ¥ªv<‚¹Ú® j"²†ÖA6Œ2bÄ_[ä‡Ò\hR”"‹‘PÕ#ʽ™qe"r Jöü†]Ó˜ØI‡rÒÍ(ãèÞÌWæ®CïÆÜX@5ë«\=†;óP%xçL5Ct¾‹O^8å‚°Ð[M(Á.p÷…@ j%æ-*î«m£oî•øILdÄH4„„.ÐI¡U‹MŒûá­"åŠb|Î14Mß@[åk^ê¦J– fˆ«¼¥x  0b@ªá'€f(ÜÓ€ÄfX¤dÆ‹@ mp' ¬"¼±É#».³¥8j'ò*U°V…Ã) x³BªgÏÒÛ³,>¦?|to7ä=†Æ-(ÈD¤]ü~8JWv‰/î»Ã.£«O—šY&¬e$è$–-Ü…$2õõq ”R,(="ø)Þþ¬Œ8ƒP_©ð5ß:\*X–±ËȰÆK9„‹a”¾<¯ÒAAZ aÈÁÌzÖ§£<UQÛÆB£EjÌ·5,KHÜhs®OàÞÄ BÄŽ(.„«Å ú‚È:ôðÿÕ#@qP‡Ò¬™¹‚äABuÅÚé £ÞÉÀ®gpG¦íó9¾˜¯øó RBÚ:ŠÁ'$u¡¸H‡4y¬˜g|l!ñL,W$à´‘ÌPGØ3l§Î:ß[ѸóDšÿ»XÉñʯ8…`jŽ.ÄÈ‚½â-2ûó•'q‚*8ì®Fq?äïlÚBAÀT j©¯ê¶ßä:¶Á²s¡g hTÊ{Á¦Ó5ÇÄÐÕW>ÿ–qcÊäbågC<Ù<mš7äê}úWtFêéÝg:÷ôùXé+á# êgÈØ±“>+ —1» W+;L…™˜)ëu‡êŒG4®&·½›erဠÒü•fºee®`Kè…£B—1v¯$™4íâ¿8‰ †9Ô09:/`60,`Ò´§ƒ$R™ Ù]vKTì¡ò‘2¥äÁ™¥UÓdN¾±áÁ˜|¡-•„h:HµÀ†KÃT’âçÀ"qíçËó$;-½tª¹…žQλf2ËŸÚSéq»®òž¶ÑV²F:hÂåirV>8ø_{DÒ—ÓxG”Ã@Á ´¦eåISH ½šç|ºð:´8ÖHsút<¿à=)Z0ÿi”=⺹õò)ñWïåù]yç úv¬ž^ü3 5(~°‘jô#7ÜŒIà°Ô“²ËoÄ8ðL/Ž%ËëW >èïï:3›ùúø[¿ÌäÎ-Å‚£²€Kb²H_¶Á¤w]^¸‰Ðm%'ï^2ICx}I»U#ºÒ[7.šî;™ÅR~¢dHð 'ëP\€ÐÐÂ(„Z‰f}à’Jï]î¢ÊˆF·£`òÍRÜsò#è-T”+L""§B: hvâ)L:û¢eóƒd£!¼z­tþîoÚ3ä]·G<½{_…‹m¸ÅÃú° —6Ê’ÏZòx Ƙ="jÀljá]¥¦{I"§nò`>›™xÄÐèéǯ}†[=€!&É ©, ½x¥]Iÿ z”ñä A¥ºcÖÕ«œyÕ6FÄ•W÷çzÈ„%ßÁí‹=6;’ Ni:¥ŒòËÏ**Ž`+„Knpxc¢U-2‚o„BlÀÖÈw݃œX™7™ÛÄHÉl £ë ã#Mó`Üíò³ä¯æ­Í´^›‘´UÂÃ…y…€D<ƒåÐ0v´ä%z 9Â,Çû?®ËF¯‘;o‚,JdZ-–H§ÄåéO3%%Ëj•eaõY¶B㳎QÄ;~ëZLðŠø¹³Å@rz®Z縉ž\û©çÅ•ŽÓXàѬº* `:¹çØŽjv5yBÆúO¹0ƒ3]ýÕÔˆŽçâ‡<>}’V.Bÿqò`~}MK/0ñ'MÝh•à„1TÅ»Î.!müU"‹¶ø²™¼4hÄ˶`$Ž(×HGóßx¼ë-'Ë'K:§©ÅU/‡!ãTÏ&yo hž«{¶–‹Ö-ì¢5¦e™G+‘“líGŒ,(Ì8%{Q?iôÔ¤·Š·£yt=÷ÐJƒëd¦÷êÜËSÝYjo´—n·–ÌúÑÑóŽ»,‡Å€Äž_±Ø\¾£É±WÌFs0[Œ5u,fo ¯‚róUЪ· ²ØF± øÉaçÂŽÂÜåÅ9nŒƹs(b4I$f²ÿÜŒ§=sÙ&rã÷FÝ"TãV˜&‘üÃ5µ™®¯Eá¼Aw켕l s˜£™ŠGŸŸ]ÞTX¹‡0¢ø==Öq!›.kFB¥! â~“ø~Éø^âÙõzØ…Í[&C—çDH&µð¥{ò»­=]å¶Ü+ü\ýÄÏñ½þÅv«·÷¹¹8 8wm0åµßd<û,Uj ­}Å{4³†ðx§~~¹ûtþaÂèca‡ ‡nþæk_Q>?"”¨T¯‘à‚Þý­ùå~e½*èG²;Is›å½žŒŽ÷éWB4Tüq a8Sq/c1©ÎP?º§#¯Íֱ̙ß-Š1tõâ´Ê(•7‚¹ÏòšWÞd¤IPR²)‹öü´`“Ïm;8líùÕ+øÙ'£,)zÊ=>{­ÐíÏœžMv¨fî<¡mÏÀ.sÅ)ƒ°sIÑšDØTòÿ¡…¹VÐ@C™nÙþtª q‡ÈÙÐGDx *ƈeDb L¸6YÇ›ˆûž´ Ù>!° †ÜœaÕ¨{úµ"Wß~F'©Òo89“‰q‡ó|à*¸ÒÂ6=Jµ‰¨¬ðPÔ´ë@™™5ÊåñT»Š¤Þo˜+-ÐåšåM‰kHàbbæZú$¾oW±Â„Ýl$Û$|ë¿FH¦^ƒ®Ú¼éÒ„y%x’(¨]I3n—d÷³OÏ›]¶ P†eèm-•MN :,CmggvJäÓ6£5”ÑÀ˜¥>÷ G›Zù)ììV‰Þ¢™Å˜Œe:©0¡ÎÙèÀe¹P·X¤ñÑt\hÝ€á¹G–-<OçIì(¯”±oüe_D„éÓ—õìÀ–qãÙFfÈõ?9Ýv­Ÿ+ŠÕvÒ‘Þ*Ð6–ª$¹KVœ”st ÚWKb7¸iøÉIyÔ ¬UIq©í|á]L ž4YžÍ;D`ñ$ñ"ÀݶmBÝ-šÀôz—&¯Ö–b•ò¹)/Ý‹¹dz›¡…†·B5iªX/0vë%•ÕpWž>Ã0ô“+¢%!OTNÀFÝÕEËZµ¢Î_µÞô‚ã®ü‹–eú .ƒJR  K—®Î\Ë‘%3R<¢z§Os ˆZ%5r0M xŒhñÑ2 ¸ü ¤*­„TÍ.‘_D¼r !©gÐ× XËILäí yÑD¨¾éLËE#rÃ4"Z°å“¬h$÷ÏʼnÉ…Å%T¸„”‚PdAÚ¯A¶¥™(sS Ï•ao8B[™-{ìêI{¦pÏ b#†„ƒhüwÍ.•6ìÙI£T{JIJÓêð¨ñí6~%q-°gA\¶¡ׄ{\ŠÐê“!áx8,ãÎ1Ø<XÊôCJm@Oà›aª!ÌŽô¤Kvßq»°àŽ …+`—^cȼêp¢ÃoQhõÆÕ2jð¤™f®•ÿMr‚ëYüißÙ‹&ô,c.}”¿S)K1 ð·wr]Mº0ÌÜ S3†F0ÁQqέ,¨•¶ÝØ,Ýmô"¾S‘%5~øÕ"˜D1šx¢æ€{~ý0”™ÄxŘ[) %¾2-„iѼs€"ù0XÅ©Äe ²Â±%M¨d™‹b/Æhþ3G%á¬^I©¶«®Óa(×vBNkÏ!®¬J°»ìS‹ÁÚMÎcs¾ºn[O¦Òw"^aMIR¼ýÃ’¤ sÍp×zžÊų†6Þ8,MÝj¹X Æ [+ûW¬è‘RÄM:Ú@èj¼¡„:Øu×(—U°´3’°´P Wuoæ\I‰€ÁA æc[¼xaÇ@Êó[¾ž4q–N‘­ŽÛáðDA¯O-7Àb7ƒáˆÚ" ­½ ÐܶAâ¦KÓÕµÞnWD(ÊKvv >¨|ƒDÕ 3¾ëÇKQénxeìÆŒ'´®’—¹‚ód–êg˜1òjXñm4¼î,KÓöŽ)gžLè¨p·³,P$ŒøSej)' ×mгà,„Ù€ =÷〙fu=.Ó˜~ßa1‡Àm±e÷SkïVEælÒ{#Áj(î×,º&,ŠÖn‹”Zz@Öy˜‚QA`…ãQMÕËÃX ±c2?=]Ç#u:z3š 7LÍ· lÅñ‚Rðƒ…i§Ôa ÔÆ¤Ðß3RŒ¤-cgp€m÷Ò1vN{ Ôêì>pÄ;zòŒ8YM’‰Ë!C‰Þ#ø¡ÎñàÍ|é( ÉÐó*_b;µ\…¢¹1}fŒ'HÍ&P­Ð›NPËÛW%ÓÎ``ò¤zÆ;‡®ßÛêp¯ÎÜþÖÍ ’°IpÇM‚vàØ¿…ò5»ŸÊÛ›™µš û£Ü˜ÕÌã„Ö’ñãÀÇwÀÌXa~V‚Ô…àj¤ÙÈ p\awL©§6@tü$L¨û­ÍKwX °² Ãæ´®© ¢pТ±õï<ìë€Z©Ã¶;nt¹ Ò¢‰‹CÒ¯¨‚—_ 8)ÄsF©‘Ò™ o,ÔÛÀ«Æà²EÐ>•¯¹µ‘•Q˜Bl+Å6Çßtáìùý7Îè RùKì³Z6¨´Èônø³+1†@aŒÂWä¼)N±³¡›µQQè=æfq”ð-Ù‡ËØ54±€ã-(P¶v޵-ÛÝ86qÑOù—^Ø•I£à߃Ðo4ï™=ò´Ý_^…gÓž¬º’¥ÜòóCÞ$õu‚ÏV„½ßɧ‚í>lÞÉñiî²½÷pÇlˆpÈ1ßc!æ·Ê¿Š­IxŽo˜ÿhÛõüS•÷ÞâUeXzà†Êu^-o!°A3þÄÍ·üÕ$òLë5ã×>yø—ìÆ]æxuBQD©§ƒÐ®™»bã*÷F_óùYàørs›MzW l—ùDøÂiôút—=çX Õ¹ŒéXÄ--‹G(·¨á¡‰•øL-ñ`Àü|R¢ (t¦ˆZ1ßÅ4óbåÝ[{J×¼'C¼BŒÖ`IÃ`”“bU]=cÃS°Ó‘óÿ=¹:1ß½Y–ÊÕ$§´¶9GF–>_Àå&3 Ë€¤ok‹40-’%+„g4Wn?À–ïÝtÝÉ-íèÃQö1ê:”Ü>ø‘2&ÝšˆX˜+`®˜-ˆá!:Ó@¶’¡åŠâ*%Äζ—óIàmÄÔv!m©;?k£õéD‘QÄ3Ë®ï tP5iSÙ‹ðIªÑUÆKýrƪ€A,Q˜ð®ZÒ“@=Šb(ÁcM”Ñjb(»©À'…ƒ ©”Töåá…š27–eó)ûZÑ«óÙ_Ã׿ÅXŸïÎiúu˜é˜6ŸqP}.ßêã¨W‚ê缄+ O½Xb¥Êkm†‰jŸ( æ]-Z$äÆÍÀbAÔQ”¦¬¦')Â\E['€Ú 4æHJ vÎ:Ä…>“ ³#ˆ«¥4y†íáSp0H9+ÕZ6[¬‘)“9µñ_¡p°Rh¶æ3®b[j&Ì c›RÅ5ô¢ ™x.4!N¢‹³Îˆ ãZíëp ZùŒ‡ÂÒIaqÊÔuöê†}°Ò îˆüÑ̆ä`û‹Þœ‹HäÔæÙ/€ 'ÃÄß ±c±ï šž|t.ÑÑ«”O#ãà‚ø©˜½*´ù(Ì%4;2X¢Ö= Ž$xoŒ%òÊF8žÛyžB8âÎ<0T]¢*4h‰Š-|¥"Šd!.A‹Y¹iËrKY)ö*ëS­Ås\ö¼· µÄ™7§tÔK$ h24o€Ë—uŒ3¿Ç¶-ã øÉytZ .̺½‡(Ûß}€žB{Lø:!£è>šlèÏYp†íÚ7WdNËàý"ä3‘+Ü,Âã#Œà–1ºŠN‹´- &õ„l)2qkâÌáJ¢“¨Å’z+Ì[”%‡£GMYÖ }ZW'¹Eïl«·¢òíªÚ6ߎÌU2A‰ÎRæÿyÛß”öÏ9 Gs Çâж(×ÙGjR!£ÛuUwÜ^ö_pVÉÆ›Â{¤à=¦ÜÌAA`‡4Y-«zacÓžaLè¹c…ç SŠŸpãÑ‚ÅVJgÑÆÈõØ$u­(Æ'QH2ªVU£)=®Âü]ëcadìÌjö$𳄳vÑ7hvM]@úÉ&ØO† V0ÙdÜíñ ¦ò}´kõ@ûãmJÐ ›bÑ~Ò%ÜÖ¸„\‡™Ïˆõ!"“„eˆXNªo œ,b2S!QõôìÍ3@¤:. œdŒðê…æÊ'é ¿Ê ¨y¥d“ö ”ÍäŠôH8+qÂ4H6ŽcCç=·æ„M¨ŠNÓƒLXùT›jeGÀ¯)I÷a¨àºÊ#á«›ö·àƒ„–£Ú„x¤æ·¥¼ùÆ1ÏêHô^;Ùm;Gp©È˜ƒŽÄäÜ?Ð6i¶£g¥ãJ WƒdÅsU烤YœÁ0§( DÈm¨Çpƒ©º­RfBÍ!Ks0ï3,oì·Ò{!Òp1å")SN䆖ápîtD†´qIq?˜þb0päÃD^êDü7"ÖõeÊÌšJM’mwRHƒ„ܳoîà Ð9x ÖŠ¨SÊ·”\ÊÃŽ¡3òzm{Îôj”T¼ðP˜¶æÉUëq’ëHŸ,VÖ©Óg‰U)Ò£ñ=(ˆ½(N˼e®…¥µ[ØÉàs·øµÑì“ÉÉíSÓˆZ†€¨5þ‰éåØ2ðþW-·Ÿ€ÆorUø€µ¹¸rlŽ5½æÕ «œä™(œ QÊÎàÙ‚{ÀfÔO‰ÄIíx,¹ˆÄs8kªv;t[¯I#ò¥^ÉÊgÞáØi€têŸÌ¦.–£É›"øöh›SÞ”|Œo6/ÃøŒ79Ï"!þAp9ôa ÏáGö?A½‘£›ÃÃðoË t(ö ÝÙF¬~Ù_ƒ°d—ñ÷ÒÞm÷þ9¬o?ÙWS”Y+™o8φàþwð&¢ò+‘ÖGˆ3_î#âç+ŒÏqÛ­©Ö娾èxõß’KH¶@ê×y Y´§{yzQ3åko”r¢GÚ¿‚Þñh+‡ÃoÒq=&{ÂÈ펈’‹¥Ò~wÿ¨A@2üØjeuƦ´×㨥ɾ¥µ(`P÷ÿÓŠøÅ3ir[ðŸ~%Û´ÁAù,EÜÍàa¢.)ƒÚµí@4 geÃARÑæeØIT“ì‹>ÑSÁ@f{¨%8⯛d{’Òóе$!7ç1oªØd¤ðàÄPó‘ä Ô¯¬@ŽÑÜ‚ O>âо8°cG‚`§pΡT£žá²{‹vnƒ)Yˆ;î6Ó x¦M€¸ûÉÀÁÈ0¯ª²¥]uÑ,r9 J. WBw)!+IŽ5­tNý¥0H¹çÜx]ÛVô ®,“o&ÿ¾BWËû6ØK ÚÊß46@Iáý½@«W§Bµ¸úˆ"OzT™ÿ¼)——M 3hh¯„9³²(kÂò,á,QPAÅË…£ó’=ÂÃ*¡CHígY¹naÓæ[ Þ‰p±®Xö'N÷ a;®¥Y®8 ;”…@ÊÙ»£mRÏ4!Sò  ©Äó/D`h\tkÏȉžî®=(’Ö®Ýe^WŽØÐQjÂ;ŽUðÒÁuÓ$ã‹Ô ZÔí:ý‹—®xç›Æ²âÊïb6êb¾>|é3mÈYàet PÃJO)û¢ À¡ÞX q%tcT"è`Uv!hs%WR;U–ÉjêÏbè± Ï2eÎØõã0'ÅLQx5Jµ *3SH)Aê¤QÌ´€XÅø>œ†-Ö´BÑõ˜ÃŒi,§Ñ¸¯Ìñe˜™öüÇÚcÊ5ÞkSFë¥Ä[‡’ÉDqß.TtˆòÅåµ´Á-3à¨â‚”ý«7‚ßßz[ãB ½øÆ•„à"0bð8é†3^R`FYØ!F3Uñkb@ì…a8‚œinÂã.[ÌâF¨震Šÿù~Cñ³‘%3U…ü·©gwç-GVcÂÐÄ;ˆËiD\ð‹àâ™g­<6ŽÚÇ]ûâ*{@Õ¡àŒ‚Þj/¿+;¢ýü•kGg„`]c£TJ›¸<1N“òk+D¶ò[LÔÚh©´/ØR®Y~èOeíVêi ›\SÁ”Å‚RÔ8²'K¡Y×\)¯Ò$ý ‡°ÍhjfXXž8›Ü°WÚò!X,ß½—ÆyfÇ2u_Y© ÆE#S¾c\ 1 }9€…S><¡ yÇØl~± dµLr ª#Æ£«u¬Ì˜h~ÐÎ`>AD^n¤XÊ(QQ-»Q°¾†$Q¶ÖT0ci£:qp>¬•3 &ÔL* Ô@÷°Ò.•ún݇#bNPö'ÓÝ ×ð9©šäAGRž˜w&¤†¼¤£3>RjˆFªÞÒÙ±ÈÖ’¨?âÑ$h{wuoÊÍè‹PÕ½¸h¯£®x:ž#dt·†žˆ›í­Ç\ÉÇ ŠÁa®9ŽÒ@ìc©QEt¸XQ"F"³áÐAÀ¼PéÝÐ!öaj¢zX .zDlh¶&FLßF6-\†“]üÕ.”u[E¨© ¶ ˜®„üT’™G,Yé_±ò4’m«f2žHm‰h)m6ˆ©È(ô†®¨Z¸G:!pb>Kò»ŒT§)2ÎÍÙ‚‹¹59â¢8+&$æ½—ËÉ&ˆ‹‰‚…55¡Fl™"‰ÎæQÛ/.]ñ(K.Åx(t&é Z$ÓLá,‘¥ìM³:_IË:ÑÛ¾žh¬².žŽHÅå2Àâ2Á ¦t-•'$¹_ÇË{EÎ ¹,)…܉‘ˆ‘‹ÕÐêç¹A¦É­gGMñtF¥ø‰6Ýgk¶õ¦ÞdÆ3tC–é ¬úù͘c2\P‹¯ªï•°­7-È¢ø¢ÿŠç„À#£a€„Ã9Áˆ‚ª€kU›c÷R„:ó"PÛV£ ˆlö`ó˜‰pS›Tæ/‡2®$1§ß÷*ö0*˦Óï 9‰UfÄšB˜0õÚ‡¯OvXâ (YÇcÄt¨»‚µø’*0«qؤ)tF*¥Üw¡ÀFs9‚Ë_9°®fT]¥°d„X\á§÷Òßñ•´˜Y±TªT[báþó¦®$‘ —ø‡Í5n]yj½4=°js2üL(¸ uÚS82¾¿Ç¿]þ*ᤠ®Èe€ÀÍ3cpO$gsØ…¯‚ei| ÌF1TÒ¤e]K¼¶’˜¸Sºv`(T.ÝAúéÔþŸ¯*oxêrf¦?[$”ÃŽ TàñÁ'KÃQ„g#94xYQU…«w2 „•¼æ=%ðñÚ˜áÓÕÞž °ó¼P¯¥ÆõY³šh;\¾› Ù3œ²ìVc_\yv·âÓÃÍB<¥…{bäáí¸9ù¨Þ[÷¸½)¶Cð¾µÊwð§©„rJÅP7R\«ªÍyÕ#}¥ QVFð+±äÐa›ÝOIËñy6µÛzˆ–ó2fxç€y²ݶŒûx-Úñ¾;uí.Á™L+_Cû×߯öü0R†rbmi¶u{ÓG¦“tà–(yÎûô¿Òb\¿¤A6oÔ½ÏȺµó§7$n?7cEÝŒ©¸•ÓÅÇ"¸³>1›zD ò±mÚXÀõhïêÃî®Nòw/Ñ×÷ýç^nþj3eáCGv;b:¿_g‘åGÍm=€ª<&Ìë°ü¢ßêúÅ  ò€öx‚Ðuë…_ }ßpßÄ¿ôÆUÕ nÏaˆþŸ&0«‹ôbÌ—´“/y|bs 7£H—Ì èo q:Ìd;e÷Äàï’Nñ<Œiãìl\¹ý1;èµýy¸Ü±BUî+È£†»¸ îõçòøÝ:~ûv¤6f²Fš"ÇcÐcÜ—^ð¼R¯Ý&ù)˜ÊØ<£šþÔ» 9–’bt `>U0„ÛâRù÷uvBœá,¥ãYòQÜÌ6q"ŸÕQî®ÙÕ™Öšh’ÝË-cÇáÏÆJPêl£]//¾Œ.l+`‚Å#Jpg“? Y«\`†˜Q|DAÜlúR¡|( HGhÜÞKh9½lž“ÁÔVý7Y¸ì¯˜” jé1*¸•´~=À›½ †¦ ˜¦K®û2A’¬Ï“] Ä÷BfMjZÀâÃJ+’¥EûˆÓ¡Åš¤ ùr“Ø9 »4ïV#D²ø·‚v–QÄ)ëJž HHɰ§ –Þ)°^a%ëAÙ†ÑÃ,Œ¼ŒBÐL^Á†ís.‚€RhNþÊCewtaÙPŒ˜ÉXyœ´tÄ;й :ÇÝêEÑAÇMºËªø.yƒàVîã€ÒÍ8®¤–Ð¥ÛÓÝ}zªÖ¾ãvúë¹Á×òŠ áÔMÒØ ç,‹³-4RÀcn$ÂMA×!+äM<éÓÎiX.YR¸F¸qy'˜šÀc‰gÝ„¡Vw…!MiüÊžµÊ“°=G‰C#h–W‚—6ÓÊuZ!S× 2,ÎÈ”®ŸðO¡v(Þ{.ŠŸ¦RC¾Š®,¼BЇXO†¸|GJ¶”eîEX2èYÆŸðã8 ỂhöV0/lkFÀÊÒ•ª¤m«m%Ñ!À—å¥m<ë¯gô â ³o0 áx§¼Å·¶â/’°óä‘ÐæO*Ó @ý ÓôÏÊ©¾!-ÕyÈ@"!•8uçQWl>ω‚4<% p@ózäâO n|—©1®Sº`Ä5ÄòÐ’Õ D¤4ñ bªûq YPXý®b;8Œ¯ 3FŽg>P™ÊùK;š~¸ J Aåö?×srªŽ­A@—#O¾ËPV,-Ðun# x‹XÛ!lM)Ä'íDkºI2MR`®˜³8Ñyç„b>O‚ãØjF÷´ô8 “j¶_uåòpJ>M,8„”¼³™š†ëK¢ñn({Œ¬ZTʬJž)\…žmÖq,‰ë)ÊÖ4RŠ$‰âcnȰ§T7ÞÀ4u §ÆpL¨”Ä‚Ñ4éÖ0]²ƒ[ÇÈ€1Àô"—iM €ÖáM4Ïê!0Øéâ6Þ=> YÌifS¸Ê×.#®‘Ú°M©úŒœwÔ ð&‰-—ŠÝ^‡PëùÒµáivˆ†îa]@2ÉÒøvð²¢áÅ„%”“$™b ÷4b ää¶£$’ë 7>™éwÆô®ðIcîÔ\# ¾ÊÌ™› âhØI ’ê`õ’ö,e'!¬ß$eO´xä¸òKX8»mø–Ú>¦2œR“ª%U†€®ù’5Ù&'¾RÙÎOQ¡àk^$÷ÎBâä®Ð‚ Xôi·>Lã?wž®†ŒR¬«gØ\C&çÃ|u]ÚX-lWpl€umXðRL<ÐQ—©ñvc¶1Xb2½ ‡ç¼µµ¼>C%p´ëÌPß²í˵ æ—U,u‘C¼Î׈ÕÓKl|c´¿øŸ‚QjÀ³ì¼{¼¹%ŒlÉ„8âªQèßÃË„dƒK‡¡ S@ óíçD±®$±ªô¦Yp[‚í\=DÍ\;¯¸açU›k«ë\ÑÀ(,3,ý7QH'¢6®;Zg}ÔAGipú\=[v«]y6™+)­ 3 =¹-1uˆG^*=QaFÁÜ9;ê É1;ýØ" ŠÆögõ¥ð†Cëé¦U¾ÐDÆ€>úCíîÜø èί¹ÞXsæáŒ6šÚ¬üÛ_gÉ^®ÜÐ cÙvQAÅài ø¸7¡ÏhÒøÈ ¡#“€¡T†ûyø³r¯’ÜÝ­%·ž~镪+&ÀÞþî°‡vBž.¦l»ï èŽ6ìz¤ˆ¥h˜¸ Dµ4À« ãŒWŽd“p‘!¹ü=öO扔ՈϦú¯J—äY“ðD-} Ç!Ó]Ó9™eI D{rx·‹‰+VØÊE´¥ð^íÎdÕú!™;Ì+ñlj­ö7øi í»Ûq…Ü«#™ëÖ¸z-xdM‹x·A"Õû²p3Ü8—°±”ñ†Ë”ÜQ ­£ÛÉHÀ»8Myü+FôWΠ̑;û™ÓŠÔÀ£Lþ„SÔ£ÄZ*«y¡ÆLÛºg9Té&ÝUò\aS&iý†˗༠ÖÑ!dH¾µ“¸ùÌeî3öe.h‰òhÌø ÛXSV¼ÜÞGô1Øt+Ê$± HyÔ0kÒüCŠ7bÂî’j»¾óoå_I¥(Aý E-¶M) ‡…<cíò*¸@ǘ¦¦›xš}9†£– Q«…»òKò660i<¬‚U‰¾í¤ž •2ϹƻsÊ4P×kåsçIPOÇ]5?#2ªJÂy˜ìr®EãmEYÂIÀ|,ÍÝ+«4V€^°µÃÓQ¶d.,0ðåHDÄݲRQÃ)±« Ù—/±ß—r´+VÈW‘ Ó ™Z#ƒ*ÚÖz‹ùùÚñ=5¿U˜’‘iéÖ=Ög­¨ð‡Áp7) p7 ÈC)Á‡Qò§Œéî“Èæ+O¹Ó>‘®-ž ò<ñƒ¦q¹*?‘L&ÞÓ¹ÔÕX±ÛŠá]l—  «m¼ð ²ëöÁÓ`½S¢fß|L0ò Žê}LΉ ¨£‘"¢¼s…ê‘BðœÇ®­¿áò§ÛÛ1§ßõo=^”äYvû/ÞÚó;³#ÇÉ/u¨1 ¹(«Ík_ìƒr8±QPâ'mm¤Vl*‹9ê.õ ‰\¯ .’¦«Q΀š©î£|Ô•”'¾ Ò–s ކ¡$°ñ¦ÃJJz€@6&œxÁ—«Øf½fdT\fýp‚Y Pw8Ezf/¿8Jh4¹â()K_ÎàÐ=»¶x}Ù¤E¾÷›f aY^gµíc±ÛÉ8ªcÄ=‰Ì¼f*~`÷fHBW:>ÿI› /ËAX” ”CjáÖ:Ç ä“ÇUi7l(ßM}äÐ U..#~ˆÊc´#+8ëŠQÞV¢³¿u( xé­7Bá|¢$DRxã­8¡5€d²¾©C >uA/œÒ„bàã|%ä}—`¨ß …hÑ/T.¹(ÁÌ‹«Gk×1(xQ©¤ziçå< Ÿn>…ÍRÈ—3V†Ûd°L94¾~p·¤È78ím’>ýd%¹h:wkÇr‚Re%ƒ‡2dhDq‰ª»¨RÛ`6²²:涘  *5Ö:à58i Íë [¾:Ü7\/ ‚ïK°x1FøŸ©¸ÀŽJ2Ü€NQ1*ܸ؆[˪úƒ‡-±¯ [0²s»ïœtöÚ~u“ôÖ:ûr+-ÂñA¹«$Ì{\Û=¶à*Ä2X^‚VÎ9é‚·6Îb2ïĉßÄw@Oï©~ëA:žœ~šyZIù¢c-„‚È$hïtÞöÿV«­}Ô<ƒW"U¡É¦üù‰³´æì¸ïý z\Ÿ0ýI]úÄ÷žîÍ1›^${òGæŠ!®óë#Tn!Æ«3fÅŽ÷W§𲼑cñi -ä¶\Û¹°îŒ‹óÄÁ]ØÚ ¨âM ò„Vñnã› T|U®Õ4.rŽyñ±!CWZ™Áp¶N0έ­Ç©àh>g{¶GU²;+Wº”áC›öí¼¸øÅ~´§Í›~ŠÜnW#äkøk{™Ã2Þ7r¥nÝþÉ×4…‰wx³Þ;0…6¡7À<‡ /¬­þO!Jw–ÁJ·ä­®vEüÝ<Ü|ý·vO\‹gyÖä<´jYÙd(ªn‰°›œ¼²Ãú¯Þ®¿oãYߌ†)L¼|_øxýˆx±`ý³ _ÝýháG–¸=NõÃÑçòpýZ¼¾¼|çŠoV´øDß ´ýGA¶¦¼9‚ç/ßÙÒ#í×§ùP7~?žÙÁUøg‚Ýö¡™‚;s{<þ úr÷NGoÑÿ>zÇ [„úÌØ¬’Ü&.1ŒU²‚·»Ãš“-xûJèPþ‰›Q^ Åóýк—ûM<‡Ö œ:Fê”)~÷c³xìÃOš@ÓIºm¤¨†ÑÒêÑïx# ‡Hg!骡¤<7Ó’UÄ:d2›óu¸ÂÈ‘¶Ì·”¢P…W.G3ÀW§“Љ¿] ~”—À ðš%†£úe¿‡Ý³­b]0´\ ÉÔb_,c{´f'ŽJÂ@ù*ÞVW´£ú etí`/6ãW0Ow…gÔ`c°h_…Ëçü} ŠÏ CKI !újq›YÁxFDlt¥14!¾ËdõL ºÉO6µ­ˆÀ>P÷C·Dvýû‚_H(pÁ±ÐáØGƒ)-¦mVð'ž"C!Ù…ŒÇkѳˆÉ¸.Ø4J¿-ÛNŠñþ"!üôÍtã%â Æ‘„â‹]Pì*𷀩ÏJ%Ä"ï\risÅ ¦@•(În »¯¢â4cF›|h• ÜæÊ UªÝº²£ÇÒž¤¨¢@UK ´qW­a©*ã嘸ÛJiuõ Âè 7Xú«ÍZõà.Õ…ªyË̾Y,æHþ ¼2 ›`Ç+Õ¥ë!5Ž ËÃÆÈñJ7 GÇnÐu|LèQbü ?Æ#i!$÷, ¬æ @’Ó­P Vó‹#¤ZI¤/F —_°cçWÚ"âã&WòuˆD€×.y™íðß:8ݽ¶™8èRd1®DƒçCzyfÛ™¼E¿Æ+*p:øÍ¯ä®Àç‡Õ·ücŽlälµ7Ïñò±Žˆô8Óè0;Lÿ[mR÷ym³ùÅ9Øä0ÉœWä!vãŒÁ¦ôŸË’Lò9Ì0Ãd{HІHfhT¨ h6'²-ýÄ{­ûPŒùÛPW~Ç`¹L^b­Ž'ÁãsY&TBÆi5Cò<þ ãé™|0cdúÄÍ´áxÆuæí#D3w² Œu¤Ó¶úU®Ù(abÓÅíÄ%žÍd.äʆ0¸k ¹£q¤Œ\2÷zÚ@¡—¤ÖÏ D²5— ÌB¡?Ó|™UU°M0tDÑìX¶ì-6­†:&’]ŠÛª²)¬Eò9Ê(Ò'š‚ \ÖˆÜjÄQòºÒê/~„tÞ@˜•w"1AB$UˆuKŠ$5‚Tž®EòÂ/&Š£«”N­0BŸŠRJu_s ¼¬ÂƒJŽ{ɾÂç:Œl½_™mÏÂ΢JVé km´1Í €éyfþ˜Ä”"ÙŒ5G×â–᣺aÅ'MD6 …[Égšêæ_^ õ-9æÆB4'#Îìj™*ú»í##µ ˜¬ž–{ÝA¢¤ƒ […ØÆû«¬ ®‚^@F+eê…ˆ“Qóå]U\m$—W öϘ‹ú7!Ë Y‘€zÕxACè†ôZ¨€@ß]ËÊã‚›ÖÛÁ~Ö*K˜&ià1m=ð¸:²ËÓ Á7UŒ7™á§@Òö²LX¢èj–ý±  $®:Øî¾.TW±×vl‚ºÏ“º”‘‰Ô²Â`æ ™åZްuiºùÌ6<’ÎLÚˆŒuáY³˜&®xk¥Pìv‘ …^c#øG=ºÝâÚÇ-âeA4ðïæ.äá"SqŽ.”µ{’J< Hdê~·åÆÑ… ¾‰ÍÈ\­ )­Êâ¥qúŒÞË`gŠðæ’;ýx²fË-n¯¶|Ã4ı³Wà,×,™`S+„8 HÃn™……Pn”…”Ñ>½g4(ð!ؾà …-,ʂ̲Én¨æìÆã`Fà],cê8’¨ebzvUÒRùxXN´úvµq–íj]H-‹Ð1IyFÍÁ‘$/Áê:–~ì;’Iø«;L+Á’5@Çt.äÐ-Ü!3¼†UÂ-LŽ|ý‰]€âôØ®¿ T$+ŠñnÀs-FPçº ÍÖWVáÔ_êqe6à@Bº.ȉU—bÆ‹8Ãðò;C(û±®¼¼4*rò{ƒ£~dž’í¥]œ¸æY ÷Bæ)ÁµrßµŸÎép"S3H­˜3½²æ9¦ƒ §.Ú@H0?ÙÂv›jÆyzûø*޽Ž2·OKëÆê¡ˆ„$@T%—;Fb޲F–À0èGê­DµÖ‚v1@¥Ì\éÝÏœë8ûO_‰ôùº© ø¶p’hyØv}€Ð~¶³3wPßLãºR. €¡g%q&Ïrp¬%£d#ü†²Öí mˆ.ýæ‰ÔqŠ„"˜…ümó½ä._+Nu‹\‚5 ^Rb–É.B)Ьõy½·-ª»žgz_@€'Ö*ÜæÔF¡"´’AùÊ8pDY€%k3rl†ËÈ4•ÉOá*ú9ñ0×:;t»mAIºevpÿ^†¶GKâÞÉ”…s€N΂\¶óðî ˆ7¹k@ÌQ|&…J$_©;³s;*6§òìzy2eh"'[Ä4OÑ÷„Õp¬žtŽ“¡x™| 4¥ìþ?ßPœgq®$oAƒý'û›Áß§ÆËOByk¯ô Ã2 Z c¼µAeÆMŠìóÃóŽZÉï4P ¼H;ZO™G09?¡(ãZ0ÇÍÈaØAb±~>†–pJ/7}î:/›Óé&9Á$ÐØC £N*%„Û~¾ˆ„âN8Äc*,²Ê]"L`2àš‰·U¡„P‰`fA‹É/Ñ,}žpçɚ뱞ÎDYéuˆ«ÍÞ8ÑRJÀ‹ ‡ˆ– yÑpNÊv\m¬GW…nRådÙÓCa¾Ž†_n‡Ù[òç&Ê vëˆé|쮆|2" Ä=òpÎ¥Ùn‘ÎêÉ3p˜ŒàCC~óBiÖXtÜмä \Þ±…ßYO£’P7™r0ÎB®8{–¯%úÒBIV$u…ab¨-ºáÌðÜLtLkRŽ÷/ô"Ë•^^ÑX†œW¥tœTžëT±˜Ä‡].PxÅ~Ì„‡‚ôuŠÉ°ë-k“ÂâÉ;£ÂÍIÛ¿ëRë·‹-¶E@{Ë]´Úƈ¸c ôk’BšÕñlv׬„'Zõ n×VÆZªÎ â ÁmSjLt’ 9Q¬ÍBå÷‘ ã.¼ Øš A[» @ž¤PIW€-X–@©? ãщyiEª¤;²•=@Ϧê¸1Úyâíć^Õl–î¢kªWmÕžpU²[—0ëbÖý²ºoù4µ‰`AÂiµÞ3-$3‚7‚o p¤k$bœ>¤Òƒ Èó-lLFªÓÚ¼ XÏiš²c|„ñ¥â¾&0qŠaä¼Ó³¢Í0ZDÉ Ýx§@QÄsW¸×vÁ¶XëªÃX¼S·ô[ÑFß›}÷ô˜Sôýã­Ìg¯±ŸÙÆy,}z$<¾Êõe?a›f=ZˆÀyðN{UŽ:K¸Ø@2ÜàŒ`g| q¡˜ y5.UL3¾©G˜4tK8b†ç ÄÄDºg¼ÆÔ]¹oš.r ~™°ks™î¤“ñÆ[æ-ò…„ÊŽ6p5õy p®ÉRá¢Ïb.ëô‡ñ•ÜÄ+³žãE4ƒÏÛãi{¡2z®ÔÄ¡D"ÜP˜~¿îi±Â-"=æÂÓž›ˆˆ°ÇNl?J÷`Q’É )à ظÄy'åü,¯Ëuó)ƒ6k@¼8ÌZSxƒæ¨ƒ=Ûƒ%~ǽ­©@ÖËë Ò Êy‚&F–R̉‚ø¢L  >â=ƒºøúš=  ΂¢1ØÜ„ªLÈa²O˼¡>¶85·¥lWFy¡bê´Bl*_ž8PÚ ¤üXŒ#m8dƒ‘8×À$Ú‹?*„œò2æü³ ÝøïvØ»0% #;×máºÓjHb‹y îL™LéY£FûF> aöÍpÏtóT$”¤B“>Vh–"™Üˆ“òç6»¥TLÎÈËã˜Ù¬e3ò\"óJ›á‰©*FóûÖöz!ap:³Ï¢Zôp@kg­Üãz Ì,Gæœ,’0@< Â8 í6c5Žå±FÈÌáæ ÉÆÀ}ô‰\%¡uŸÂ'€´Q—‡–Ì?Ù¿ÉœäíÃJ{!ÅÞÓk~9í;‚« yy7ÒR÷ÎT]›gu˜œ©B~ˆäÉ` ]•q TS·wÛ— ÎtÕo¡F¾˜0£Â‹v\`Ìjj‹æ?Ö¿œ& ì9 Ÿu÷8 3¥¬gK°  ÷¬à+âö¢ù²ç÷y&Iô 5z¤EkE“S&ì”hs¡·cÿtÁ~ÍIã)ëŸ sаJqß»q6ic#Ѳ²%=ùÒLT䉧C·áÒË?8¦0›Y™8|¸ w1yLsßÖÊuÃu$Q­C 5ßÚìJ}•a €kl_“å-'0‰Ràˆg1$lß[M\(•Púï=u8Nl‡žK”&¤ÈiKô› ðÜ·Ñ“ÖG›ƒßáìЗ4û¹d´íJ—ËLËa:¹6àP:£ÓÅh1ÏæÃÇ¡®¥´é2¤ÃwB_0&Hór¥mìØ0JIZQ*©+‘´®ë#¬yF¥W*“„á+£·_4²¦ßD‡zkT¨4Xrƒ&¥@¿LuS#EòqìHpíc0™ÕÆeàö̶(? ¸W–t<»e÷°P™vÌÌ¡™]pœ T8@RuªÓÀG~ÏÅ€¯¶ï›!¬U€5ךœ±‚MÃçÎ9]íôüÊØ.&¨Žu­³•:[爛2C—b{qú`Ä“½úŽµÈ‹Á=ñâ­ª…ñ~߯¢º‡ˆëôfä ÇÔ–œð Œè6Â!™‰<4ëBñ9-ŽU`®€îÎôÀˆø/ëB’mLi‘Û(sž"±¢î9ŪêmÛ»8äÑ–h_¿|PL‚–-^6é`ªV\`—@Œ¸4 Q¢ö|À¼ÆZ —OB—g»…ÐØ¥@2pãØ&ÝÆ¦Q&Ò¹ÿhÉÊô÷Æ©Q’]WŒÔ‰º­7ЏH]ÑZvÕ} ù ÕñÝÀ“Á‚)ƒòx٠̾MƒL Åq”ë—¬§©oñDåeWÄ©*3 óøp¨ÆqÔJJŽšä3$R†Ò´®ÞS¢g¯ "¦2Ba¢Öù”g@bÔ¼-º]% ¯@j¨EÙ#õ—ã <¸ X-”܉å“V.2ÜzûÙkD]&øBŽ®h2׎øÉï\ˆÉ µQ—)8!¤ÁðÆÓ äu%Р…t(†PRê.™ëØ¡xÈ­‰ÒèîŠa œÍg±Aœoœ"ÚÀmx\”†È9…bt—rW0„ňÒÐh*s~ER!©´2Â"96&HЃ] Èd9 Ή”—Yb,ÉÌËØî4VÂa‹h’rŽ¢ðNz,k–0Kã–¼ìÊ•(¸ŒB£d¡QëôÏ(+Ѳ£³äŠk5¢W/gò·ÓéööûS Ø&6¾}»ÅRDø.Ôó³õÐIÿgãø²L{zØn‡Ýb°þØôtÆÓ:,Å&q…@ípŽÿÑq4Ó4´ÑY¶nÆÀ!< ~v’SâxÏáQ–(ÅuªcY‡p9%ÌŽ”‚¥1`‰‘‡< OÒŒ–vy]=[Ž«© FŽ‚^s¡þ›¢Nö‰ôjO”ëPœùÙ]ÌìÀ€ÏQINÛ)/ÛÓ»Ý#]Œ¢¢šyó?÷`Ɖ<’bº«-Ø#ಷ$.àäÀg²^$Ëu³U‰Ö±½Âf @ßú½&ggtŨé‡Áðs¡¢Ð¶p\¶^}‰ÆN•OË'P~ÆQDh"ã¡ÈHÓ¿°Oçž•iKiCV‚ÇJ}µ•éYÛ·í:CÁG¤ð„ÎXSK> žeõ ]‘°_)ay¶ÒEˆKxÕèDPa5YLǘ¶ VÓ´ÖŽM">#¿åÂöIÃÔ–q¸÷7ëœféx0­.[©åHƒ ã@“õ>¢‚)ØùË´]l¨%Õ™ŠïCf¥T¬µÌB—uünM~†1cÝPG¶”gäFÒ»»ðË¡¸Bþ— ¹–í•&ÑRfž³d˜Á ¸¢Š('’{‚’嬡'°™ucÆá¯[ýc_vD"]²–•äã4‹\íºã,^y à0`„4TsE7¾¤r¦8Ïs~„•wÉY’Wþ©šÁWâ–<0âO¡ØœÈ*j:¶q¦_ŽÔùeŽ®ãnZ‹žq¿œ!C9fvÃ4•ò=Å%Çlè¨FÚ8]…ob¦#!4çÆ12¢yÀ8²@jh1'^xBtÍc=†óê!½ª¶ƒ†›Žël»¤éðS‰EÒÕ ƒ/ˆr½'˜G¶êfŠËyÍ^¨™ §Æ Y TD ˜”ñõ'áZbŠw:6ðRnG£D(`øG2ËÈSdªÑˆÄמª:c´ +GÎ"ñ4TÞ@í– xPÉ`Šˆ*<‡Ù«……mY¼ùí´mWWèm£A}ųF ÖlHzî–Ϥ&aNæ²(!Ç3í§MDK“¥¦K éÀjyWbTŽçãLø\ }»®*$R®Ÿ7[_ €#y¤­2wddºž(3j/Ë=)ùãhª 2½»¡´*xÜ<p<…“€õÈX¢Ùy¡:À XgÝÑ%Æ×Ô!d¿¤±B9s–-—U×Y܇ Šc$ŒþÿŸ$ðªL/@sÏQ®€bÂNO ²$;A‹‰P刨 í\_ áÌ»hrWÓ‹2àÄðjr¼€ tvªìÇ…‘€™¢#)¶c€ŽÝ°S7»»°û„Zc)=çØÔ Ú…yHojÁ ‚W å0H 7K•×åŽHZÄÒe»ö#hć ˆ ÑK*Áœ¹XX†"—‚šh2@$+XŠß×–ÚGLÞÓÆp „! Æ4m "Â3÷CyâÓPë¡þÅß&Ö ;(Ç Ÿq¹ JMbb·O Û·ÑBqùÌ-!m ýÖ2äl"Aƒ^ŽAk&%ÁÚ¼¤PHÆUjYŒh[)!‚yF‘¸5ë,L+¦ºêm !a^x!@ D $KjZR„¥cÄa˜M“¥Q}3ß_¤¾}_ƒ(Ä›LÄp% 8¡ÂÅòYéMˆåŒ CCê_<âT*¦ $‡n»F] &>§åÜ"[Ý%„;†%\™,DK\S*&„â <¹ J`±M]º«„Þ¯!q¢Ä®? æsösÈ¡lDn(y¸ Ø{€ o(“El­k•ôCÃÁ{×·I¤£€k'ZÝc Œb'=ÆÚø0Lló RxXÖ¤ìá ¤¨_Ç[B¤´êUT6>¾¼­‚Çu#,“ås'€êÈMX-çB5¼,˜L'Ú‚ÁõĽîÊS›˜qºf-š¤@U·uìØ!nʈ+dK+[Å¢S•Y*×Pa²:¤€-L FýN¦/#þMž}‡ÀR)ˆ"GS{k:øXf+8ñ©* GfÐò°N¿  ¨Ÿ†G³UóÆP‰^Ð]ìTe¹IœV19q‹$Z1½dî{´Æ(TÜ$‹x³@´I£ 6"„¾¼ÌB°H;|¡-¢`È“Ý9.\xVXÃYGË…ÝD(Fõ¨Pu<"ÅÆËN$“Qk8á¾µmX t¹Ûi .Ê‚Òì®A}ŒãôÕSô†F$_ÜåJâN—¡­aÿ9äŽpîØVŽ‘Ùð^pÖ.'Ž(±ò£¤ï¸ S2zÛ–ò´NÙnU (+¨;¦²ò¡j’§¶«wIщ›GN(N4Û"‰öàM'|,šóðqåbÆ_ñomjA¼uZšu¥r£K1ÅaÎ*Ï+ˆˆŸfŠìÄÎ&kð³hg‘d“32ñ`†ö&׺ƒìVï ¾¦ n3Ö}@PQA—68˜ Ú´Oxî(R3ä8÷ K‚V1ñÎ8Âa† Yñ—Áòc*{ ï×’ƒrWuå),¾¾Š.¡^ˆËþ¦h=Ùöa†OŒÉe !Qû„ó¶ÿÈÂ=†{Á#Ï1¨SÎÜ6Ë^×eWDƒd¤ûrLé¢ûâ¾CgV9º Ý‹ì,Ol8¤Öå …”àÄéÝžkÙB©I \àQŒHTæJW,T늕¤ÕáÐ ×]â¨àyÝçmrg$(MYQLgI'UøÑ9™,øàɈªîÞN’ZŽ)³$„¡2Ðw„ñ†ðÈ)… ?"‰È´VòIñŸ-ºjØ ¸‹½ ¯±»€‰«53ùÈ=wOk@'„¶]Y,N¼˜ä™«a–í>gב~wä™Âd±÷Ø<ÕðÄßE®É³:8¢îe:QËYâ8ĵ—Ó~áÂbjJ#‹ÐXñ!;‹øYdèÕÈCºÝƒ¦äcŒd…Y!iÜIWèžÙ¸ÄàÄ*Øãp©:n–~7 ÍS°Šx‹ðo8Ô‚ËP‰Î“•m*š.Ó"ȵAäÆ_–±p¥ÆÈ'Te¬³æÞÿÄT`k¶…q壂<[+xL-™g ØÑ@ø˜ýÏ÷ź‡âj(žË•f¹ºòA¡¤ˆÜYiÊäjÀ–|šbñ/i¾½cÛ$¯u‡И¨+Q±fwÌãFØvà=O%µX*ùqm_/rDƒ>¦—0(æ²Õ.€Ôëíwëm9Î»ŠŸz÷CHáVÕžSÁóˆ¤þ™ÐZk±_Nø—Ì‹=·ë[‡:-§œé¸ÒÈû²²¤k9|vˆ×ÚÒ²ƒ†0@×c=9òßjqmE«dQ¤ÎmBÑ N´ºáä÷´‰¿®ÍH KUÛÆXsM„Ù³v…Ø)3ÚiÙ6]¦‹n†tb–qi/Ä“*àr'‰Yí:AHñáï °<[2õ>ƒ„‹*îûˆP4”è"»“7q0ao¥†i&’¢S:æ‘!L°ªÙ’Ü8ΚƒÑI™x_%ç’³ÆS†¢GÎRCìœÑ`×mCýŸ2~/°Ú"~e/¡~Ÿ4ëAVDz¸,%®¤R·ÛéªÄ(?¤«ƒ]ùã`Ù†©fÓï³ ø‹Ö°nrPM¬ÁtKè€KÁR%Î=C,3SÎ-LPBynÈO•kaÒ !**C¹<í¡â’•ÕV m®Éé øÁ0ë5@Y7ÄR¢8amïÐb ú¥ÕÉpÝ-Æ ¤/µ íRL¦Ï6›ÅSz -€^ifr¯‰¬Êx¸ }šË|u°h^¸i7÷™Ï•ùÇÙçä¹lÄV彯óð1{SÁLÞÀÍD·¸p·fÉÿþ2¨g4:ZÁ=â¯Ú fáôü8¨¸ç.µ»¶ë$“%¹•Õ(q"ÜnCéAûkH4šŒ¨A)w…r„©´`ÐkŽíý[F@“䨘óYE)Ã?чËlNEyjJüû³2DåJCÀ…[劧6i oÆôeqG4ÔƒL?BÖÔׂ™!¼û{™©C8“xQÔé¸a‘Ñ,Ëhá"Û÷À(ùXâ àä%±Š˜è:dFHx$éëm¡ 5ÂüþTä`ðúu |ô$ùïôÀÈ:´`RéÈ øgŒ¸+†dóš­º×G†²KµMR˜!±–Òdr¼>90Ú˜q)Àò8•·Z/*qˆ`hIê(l(b‚ÑâúÛ^hñ*,ÉpKyxR MJÌ/B8ˆø¯T•§Ð)ìµPð`Ñ’ô±Pe'_<¸ß³Åeò`2ddüñõÄ#e0÷Ç´ ˆ¦P½ ‹`&´*+T¡ˆTp“¹ ¬M“#MAx©P–©ŸiÑÑž!¼}HuÄ+îñÂúN ZqA«J8éOÖ`1èR]JÉA&ͤ÷üKP0Ížz¢y2Œ4•€#VW`±Ë£‘Yg ~ ËÉ~!„ÙjŠÎåâý9Šå'ºY¥4"%ˆ™¤ka@I8 ðh¹zÿ- ÆÀÊ*…°B›)ªiUDÊ]Xºl´Iã Lb>ä]aÁ‡æ+L+,Ž.lÇÐêC¢ÃŽâ.9F€rÎÑ,'ÎúR”Ú±)UYqÃdyä(è†Í½@h‚×Ù£)¶r­…0…ˆá±*ƒ™Ž–g¤eØZKÆU|ÛÖSafÁ ÅÕl¸Af¤i·æEªÅaG|DåùÃq7aÌÙõ¥@Ôßà8¿!è3Ï€# vµ ºÅ“®5ãØí°Õµñ?=*ÜX£%I¶ZWâ2ÆçX2–e›•ª]$_ò]Æù—®eŒ‰m‚¼ýôK(¬Ê[ªþõátŒÔ ÃÌ¢lnM¶ÿ,"ìnˆªÅæ:¥…ž®ì`ó`ôNøš”B9õ‚“°Dr=?Mâ'm;œ¡Å€üvóÐ]Pª4‘dU¾{˜lQaóM>ª @¨lZv‚Û‚eOÀ1:Á¤è ×þâIwQF‰ƒ¹A¾}øJYÀ½r\¸XÚpAû°#s[^ë¬ €]K\}ŽD¶o¹g*˜£zÁîÂådHš÷¸UàfÄ*ÜB€si!£~„ò hˆ…BNq̈1`Þ»qÑÎıuä¶íR,èÔÑÁY¶%r @÷튒Z.‡ñ¢ú‰ãÀ¨è-äPyx›~hÃJš^Hf|#ˆ#:îóš©ÐHH i¥£‘NÕ›4F‡ˆ˜›Ç¸ĆBL6Ö¶¨ l†Vúd o·òë ›/ ˜Eƒ5å6å[Jäe '¥âkTix;åæ\{æUš –ju²ö,$©Nň¢81¶Áˆ ­d <£eôt¢ßó —âÖP¨o±á0󀫪Æ0 8”%ž"°68×h e|-ËëÄÅ`g$L&Káß&Þ†Gqã§Å*ªªÚíû ǘü‘òŸšÓø›» ¸ª´E˜4OÐ/õ]Ïÿ¢m")êç›â벂~"¢’/ ¸w™‰žU£š#~Õx1ä<·Tò¨&2–­æž%ª™Þ´CdSœPŽ ÷QBÕ+i͵k%æ4‚øl`ÀHöUÅU‘j•/óßu60‚€N*oIÔ÷”Å|Y²^ˆÉt“-•DNrç°Ã’B³é> ‚*¦"—ʲKr† ‚–W§©€Sq&îJ‚ÊÕà¡‘÷_™‹pÄQHð  `ÑÀ’ão#Mk«£S–OÚ|DÛ±ìTº3lqP !ê PÇ2)K~W"0Z c[3wY߀“Ž&éPà=i¥оU£\yÖÇ€4K´úÔ½£z#©T{òŒBs/3hLvÉP¨¶¤¯ÊLt²C[Œì\g¸ãV3ñÀY‹|Ð'Vò½Ó6ûñ¤Ø w‚€ž‘B&®«C´0[Š«÷ &m™†í72Hò$`î6ž²+v³q¹à¾ñ£n(LŽw\0À&÷i[¯½?¬Ê‚3ôEHf¦sKj ¡|‰ÄŸ"ï‚£G%I!_6Z_`“ÏFè²²­+RëJIÀ¦ËòR9€P‰‡³‚T ɈL(¿VI!¶jViüi€ÁãˆYøƒdæãi¨•Ü@ŸÆ‘6Ì …ï¿ÆðJßf]ã8jÌ!!M\»©"±,&`Û‹Žö°Ñ=›ypj½æ°œ¾73ç½Tð³ÝhøëèŒ3È8êÛ$¦æk7C£Ôët:ÚÛQX͇æÅ•—‘›~0ëUÏÝêè ÆJYUD—‘Þn¡ñÄ[8܇ËiòçàT¶l.‚£¡Bà\zT‡HhÏ|Ï•,8Hd ·F?ŒÐÉ'â^Ôæ€IãÇ]l,ûËôÐ)¬J;Íc[ÚsgZB0ÓIâi¬Eñ3±L5ËÆbÓhyîÑÀ:M)2˜M¨ZÈ>âŒfù‚0ýäcÑ![Ïe$†¢Õ†»ç s³t|,ù ™ >  Æá]U°–êϧE–™èÏaд…P t"¸š± \!h4`ãv1Ç,GþóJX¯0Ï0å ZžYíiºÜxLŠÓ³9·ãyVH=iQWœàDšáoFL¯“'I%›K™]!¿ÑËâа§Òmþ¥¯Û˜æ›Ãìþ«Ç·kú:)°24ðœÓ”ÿ&°”Í@“3Ž CßA¯ ’*±Í3’P²º’’ë@¹ IÐö*Hü¥<œR¼É6…Û¨¤¥_$ÒÛgÊ&ìÊj0vcqé Ò!´Ý´$q¶‚ßc–*PÍÙQ]L®“ËÈÝoûä ¤â'—bW^õ:xO½{¨ÒÚ¨QoÇò žÙ­¹p¯QwæŒV…¬ ‘WW§Û>t9\6&ë§åñk¿¯' Ä¥ëÏë·ìF¢h¥é5Qk¤¿ÑiЉlÜ©ìA*ü¨,à ¸£ÖóÛõ”ç°6¸Ùw÷&åûxP•ùüúv €¿ íàÂæ×ÓRŽý-Æ+÷Cê{I“O—½ÊÐ'wycC]eB‚j)"·@€Õ–»ôî㮹ÉB–·pµU\#bU Ç\ÄàƒÛ¤à˜Ó¼o¸›IÅ¡ÛXOh#ØdÑ?Y‡ƒyÅ ¹R¹ŒÑ2(ZdÙ]eRH׿wˆ™&—3™RLYèX2hÝ0k3!’}ĬŸÀJë¡é.@“'¹ïÎsص•€#’( M˜Ï–EcP›\&Œ’ë.ý (²¤ÔÖîòÇDÓ>t"€* ~¥àùÌ@«VãÆx@ØP¢lm„3ƒ®cB •Ê B´ 4#>ãÈ@"_«C ¸5ÃeEÑwhu¨bU+¨±в‘½g•úË1ñ°ªFpм0_)ÆšiÄ ]äðØ)’qóðN²ñžv®“ vâfRWè@“#ÑS~Aï`ÜìBãT‰ …Ô¿KBŽƒÃ*h‡º>gQmY%ösE‘m?¢äw5£^b½8X5 zHX*Zg!´p@àe-8ɈC‰ÂÀó@QÀž«lÌj7Mû`é“׿QBÉ„0é €¿iùŒ.‚î61`7ôŒGÃw­BLˆ"_wæ„ô.6ÄÌô5¯Ü±ðª ¥¬SÎ8>Ìí‹¡#QìZ\()H*¼ˆ1ÙA~£”‘?§mžK“<¹‚·r9@’¢c,率!Ná®ø‹saÝÒÉfœæ…”ûÄ™Hò‡È;ºC„;WO§²?»Ë%ô¤½Iü¸øø5zï\R6Ô<è=~è)à&ymõóæÞÐt?1é=ùk¿¡(a`¿Ô>%Å«·ÌÿZºõÊÜð}LÿMrHÌÊz·Cè —ŒèÔÀäÊO@?)ŒÛ Êæè"üП& Œ²„+`é°ÕÁ;z…Bò¯è7ÜËÒY=±Õ߈÷. ê_ÈÏ€ A ÝÒ²˜¹×<½<ÆÓÏáe»ÐŠwÑù Oþ§o±nÒçù [;lÏÚ´Až À•0™9³¤uò–·çuýn¹ì’ MFÁ"ÂJ€ 1_™gΜ@3ù®óá)2_%Yæ!ª_t©b™ÎD… BŠ}¢|†ˆ‘ ‡>V/>_³©†[a´ä††ðB§Ìø 4Ù<åjŸDº*#×Ú1Bú³>²¿ ©è÷’¬¾*n ÝÃð[Àºô€„üñ¿.ñÉ!Eq„¸¹3ÂÌYßa Aå‚Ð"…FØ¡µà;w³ëÈz‘AÏJ½ƒ.Æa5ŽxXæ~, £`&;Ð;ÝP˜ _tâçð¼JføŒ¬•¹.œ¶f´ì†\±zš€Bä¥Ë|7(Ê•fjNÞmñ Aqƒ°°Vª=vÎDÚ§4×úÏVÀbªI¤ TÜã–0¾´üÂZ¾[¢GfŒÄáHJÿ@pLHr ëåB4% Oa³ºhö„#8GX‚լǶ毺vÂL+íÔ*`eg IƒD7ÍÄTƒ¶FÂd¸‘á(bbAÅx/»¼ú0Ví£,w¿D°ZSâæ“[DË\Þñ]صeæˆÜ<™yÔˆÓd=Ì óá¹¥Ž»5…’6“6lV̹¬G<<°"žQg×_h¢B_ípLe]ð/‰HŒ–j©[ ¬µÒ7÷Ûê4Ó·´°u\“1«0w-xòÚâ8C¤K˜š8ˆ¤A!X!ñ—ŒÑÏ Nq¾ó„YRJÀš¶ÖBžPÒÓP¢TtÞíF*ËeˆøèUÄ[ «¤EaÍãö¸¹ËqRi»Œ•®˜æÁÅ×Px/ub³ö…t…­ÞRÃ3†c`“p 8g'‚Þô(ó˜Tþ‡oÞ²†ã¶õšçìl¬¿§ÎÑÀŽŠÊ¹ „9ˆì¹n’Änñ&è…ÕœDq™ÐTµb£­àÓYOáUD1ÛUBTÑA#=ä¿ÜaŸü(ó G"ÇâœÏ'$r¢¿H“/p~<§oÉÎHß&°¾ÝC wëåÂÄ­tB¹\ó‚3öU¯øQÈŽŠø2BH&™ED‚`–6¨ÈÖfØV\· ãÀBüœ›ÎB›¾ªØ¯Ç0i0*•±Û•¡*0 ¤q”ª jè]èLØG”®ÑÖ·kÝ£¦–,‹g-KmÜFñR¶jçžaZ¦P,+²e‘ ¥4¦«ÔqÆDÓôÊcÂoäPÈã„$u0D‘–‘qR«_¨‡2Äcyt”éØM6`JCªåž8oIIZ>À–X вi<²Áû†B«Ãôq},â~Ò?>„ù}$kþÄÄh\Èê-¬G~:áLîå·Ç\×ΣZLß1×Q…3LÞ,¹—9 «Êz¼ lÌ¡‘E!gx U×ÚZ&È Øé¦)ynŸ  Õ¬†Ä‡7çxÕÍ+:ç˜Y/2°BÊê}âçû#&À&+†Tp4©&ðcNè<™ãå|…=³2àÈ:X LóO ¡Ì¢«dÝ3c¡**5³s”Ú¢œH`WÂÛê)¨S\B7¼iÝXx8ØVìÝ…Aàט…Ä|´g=€EÍVÝ|Ž¢†hᑪ®a6kÅU€³~¾Õ<—bT@¬>ÒÌÞé t{²äúOÂ)ëíR÷ˆ4ä–Â.ÖÙjñÖD|¤ŒMðí…¸iNà Á*@Hk.˜ˆ‚( š¹Õj]ÀÌfDíWßûâÆ19€é}…Ãl3”ËwvÚAáõyéIuæ>ªkÂBd·šî;©šð5q‹ƒPõ÷h òŸXªå™ÑoˆGi[ÌÕç•Â/žcâ—ce¥*†VÚÒš.¸t²Ô)2Hè6¨K¯@Fƒàü€ÂX\q ½P¢Q;iëD¬§1íQ¸uLUPA”‰TPÃo ƒ}ÓºJ@¥Œ)¤‡rJ(‘l‚)b˜U2TµèJÝÞ¦jxó¦:ŠEÆÛEJ î_8p4Ç=¼=Ñh$¶é—éA5YÍÇXäÌ2г¨-Ãzâ- r¡¸’÷pd(ø…qº5¡i„e2ß3å_H¢à½PáªìO†1äÓ1ž!À›§EPª‘kíçƒ;–¨\ý¥·Ä@y€?ëÞMû·¡^ú‡Q…ã4d选&ͺƒCå«êdâçÝRö‚høR¡ÌN]”"­$©˵|p „êzï‘t'ƒ† E›®Í„:[ÿâèM>J÷ ëC—±a*nà°‚/BÓØ0ØsI=ÖvÈLq`x~䮫Ênxd0$Úz®,ÀBî Í@m€!&ø¦¥‰ y²mèVd8ž8T2Jä]ÀäċϣÂdßB xœ÷ë,¨‘³ ç£%h©3Å-TÙQ¿zO$›’í¥Ëo¬“ 3ð ‚Ï ÅTãj*ÊŸFÅL}M°êF ÂP`Ò¥£Þe×Ì2ôê é"’Ì\f†ôAt-A´[Œe_OCŽ6iOñÂ}­þ CâýôÍ~”‘ÈKÒ8Œ]š‡fÅd×,¦Æ|Vn5:Ú ±ãÚóKu’-­”Ô¾”lìøùdœ0!MõŒÖû0Öu퇔±6Bb 9(IYÅÜŠóYeFjA„ÿ‹X+ºº«$B2ùcÀ²%‹‰èG‚D±“=”u|?2 /ßzÓ"©!ø°µC(•×®Bó ]c€ÑT¡Îž †5¤+¬BeÀæØšJ AeH°^I–†5ñ"„·²Þˆç¤‰ÿ3ò·%¨ÀDeU±²SÐmC–­a‰( üï„ä””ŒN¤ß:z?qC"£o:øFð¦­!7‚êøÑˆ Ì1’ ‰ÔŽƒâgÇ!eHÖ RƒIÒ†gAŠƒ“ oà (ì&ÁæéäÑ´F6|õÙØ)¬9Ø'äý>+tèãA—ÚÆËì[8‡‰]ÖBÝJJ·Î~L¨¶]!GFÈV,Ün¹!E°5ŽâÃ>r±ÑGhˆ¢à ë÷_Ýñ>‹³ýßN!Pñ N£²_pr ’ Òâ‚qi¦ŒLÔkP³Î^B+–ÇIóá¨örc¯ÄŸvûà¸]r…7ð÷Ú¿³Õ˜Ò£,…˜¾¦\@EÕYZ~@jaº‰HðÍš;a¤Ë˜|sÂQøè…äxš™å¹†ÃIŇÛñóâˆý´5U¸ÍÌhô©¹þ…e@ ÷[#Ÿ•âÞÆü ÚUð¿í@þ?s‚»âÌá¥ôºÊ Jkªœq‚Ǽâ0t¡%´N9µFºÀC.»S®©|%OPŒMT¼øŒ8…Œšn>ɰR$œáN<È+0À}gÖÂjF4 @dˆ™[wç¯gÝ.JNÐ0(1‰…l4'2È“¬C‹2¡ QI.P©RÂ|´òœ4'½y“žñÖa`8™Q»f@·/Â7¬ £>Ò‚e¸´é…ø>Sžcª7A\>Ù¿Fvð¾u³Ö5ò"RŽ"ìÑŸÇP¡ð²Ñïó!BUMBŠ5å¤]%(jç€ÐKBó ch#“”½Áš±p¾˜ ÀM(ûFë"Ó;c˜ÇåÉŠù‰ €;€˜†8ÜëL@`šYG€cÁXS!óPè !½‰Æi¨W`Æê¨ÄÕNd0÷ÃΉ' 1[„Æ,cþãB(9DoiDOÈÅÓ£6¸‰›Ê3Œ¦à\W-Êl¸TxQ«g‚ia+„ÈÖ›,CXÄt‚ ®ps˜ô_pK¼m3Qsæ ’Ÿj©›¼9’Î{‡ ÈQ¤²$S‘Éiç–)ƧLë_ÄRÃm6sq5<Ð2äßì bñ¦¢@Õ@cŒa)¬c*ˆRc–’ÙºÚ¬>Ž$ß±"´`µŽ§/~"SuAÓ^¢q X¬ªöƒ9`Kë q^Ä”iòF9IƒîÞ¼áÔY’¬”:?«'·ŽëwÕTÞEÃÛóÇJëšDò­¶úÛ·4Ôúh5:ÚX.ËQX m’ ™02ÎÐø èahM—ÇBγ$þ¼s¢7±4`‚»w¢¦ú1´¹[tHFîðúfˆºç/ˆž¿²ÒH´£Ä8>I¸F¨mˆ 1é2` Þ„šëùˆÄC|˜&w¨ö)˜°® wmÜò«vEQ•]ô$¨-V/0ÚœàAÉ3Ãħ¥Ž*ª›F˜ÝÉÎp]A“ÔÓn0£å hÒe·Š{Aˆ­<Ð.z¨ë|ŸØèrõ>ßü¤à";~^ÿ÷£½½aÜr¥s§D½ÔäÏEÔK6ü±$(ËQÅÀ€Å‚ѰUû5@Ã,1JÓñÐé‡ã/ß1RÄ<:ôÚ-cVlky•Çèªó'z¡ä¤!‹0VWî2Do yÅ2„Ü•VNÎ ürûæ,ŠìÜ €Š©¹ƒ€øEpôòßoÃûý˜Ç×#8ýX¹¿ ɤ¿ßéÞ¡çÁn– 0Êþ‘ò¦qFgZ,ú9©ãÙ=âyABÛãTª(—lB,ç‡,ó#Úëè‡Î‰=hé¡(0´šÌun>Q['¼ÁäD›䨈N YwqQ,,8ônUã¶RC?x&8DXö²&Bf¶$˜¥Gk:é¨ÚT`ªíôîß}Øä|šExú½ŒˆÍQƉŸëóùý³ÍÚ„ÇËÏךgçP+*Åi‡‘¼ôb„wuÖyçnKjÄÂm™‘C3‹À—>çObüMÄ9Í]@%@n”$‚ "Äg¡¸-ÍÈ!òýJË¥f­]U´o ¶Ó*ø"ߙۚ–"•µQÅ´ ­rÖB^=s§iˤ¤ hKqÀŒ‹t=éQ>âq \9µJb•› &»³C(CXÅ•Ö;¦ 7•m$ ®€9A‹‹  ¸ÓÎõÊ ÷Ô&¥Q5.Ÿ~e ‰8÷d¥"À4#§·Æ™çAtséúO}é’~[þÐ|\¼‚;Ïélþl²Øe?æh ApÓŒÜò¿2{ë÷í9Çö Î!¢5õ?Ùô§ö.÷WáèÓ6øý‹í/s_ê½*#+·< NâËö½–Ó±… ƒÛ¯ooÖ"C¬B$P29GˆT„º 6| L±QÉ}#îœdýŠÏ…Ò|š“Œx‡{èðFºéÀÅL)ÄïÐK“²‹œ• 1É‹<ÂÖM[Ä“7(L3uªøŠ¢)4ÄÁÇ©Ú=Y¶Ìû9SR%±£•¶bêÜiLµTª¨Ë¥Î|,­…pMuLç ÆÛ¥n+ƒŸ1§¶<4’Ê® \sJ?®‰œ·E@^ñ…Vk\ ÕÐŽ†E†þ¡Ì:¿*! ¶ŽÕzƒ{¡7çNú¼@›óš¼´Yl(hA×RIðeÙ^X €ÇÀ☑!ƒ©KϘÔȉ)Ú¢öf̶ÿÇŠ¨Ž“„’c(‚âÖ+ÏC’–>ŽŠšh€Î\Dð’Z‹¬²† Û³Í>Lëò·ªöùGc™ðÒ¡š”—*­m¹$Pk᥾ºä£5&Z´„*"Pª¼²¦Sð‡U=/'ÉÚa,#Y[€o3x2‰âé½— ŒŠŠLí‚GY^9cŒzgNBØ"šFÔuu?&iGÚâ*™V0§ ¥ºH)dœâ¦¦*qìâÖŒ&lZ$<Ì÷9ð€ï¦ ÿ‡*ç7ŸB«@°å€›/ªöÃéé mÅkLsu\‰¶\·p8´bõ—D#õQƒ¬aãñgñÓO¡– TÃÉ9{Ýî¤.ohFH§x‘Ú·"™Ã¼C¤?G’Ü¢m.“2 y÷—ŠÕj¤Á©<LùÅmÀLsä)âíkÐ ‘3f–qGŠÉ éf‰6#qHX¨ƒSKGaYÄ(ÁÓá\hª;M¸:î¤ôjÄ Ë©B[ ÙF„³¢•€¤;ŠA.f¬Å\Œ$Z+b¢;°Ðãë~XY72¨ŒqÈb–Ž<¿€rw´|˜Ž²eA±†e€Å)XÉìM¼r¨{ÆÌøH.A_x-#T‰î4È9F_V¾¬Ïè1!€åVÒ§[¬(Ô`¢nùËN.‡ôu²Lxq¿u¥ ÝôT’’ô.Ë&ßá¡k˜Kf~Ñ=>…𚫇K‹ˆ$Ñ…$¾È&Rqv—ôǽñ©Ü´/‰úPA³ÄÝéÛ¡éDj Š8)3KìéRL²;¬Ò(³¡Ö0 I”§¥$oŒ-öÈU„÷ÏÔ[w|—Ð4ª”c•¼<Ø±Þ pš‚– ÖMdúA´YÆÃ ]pÑj„†ÏV  ýPd*7~$Ÿ¸þÊ¡ýë ß_Øóõ.1åï´dQÂ~ï_:»ÆZVÆ-ZÕ:ã’tÍ+p&ÃöHÞ"F;d:È·Ð tl«Î²`P²fâ‡'IØa)Ð\,¶Ó1‚ÌA ó†WÖb6E¿c0=c)‰ú1œ×‚ê{^ð:i}±æ™=MnÖ›™35w—Å_â¯æûöÄû !;ßtºûº4X ©v ¶DU¹¾^€§çáÁÑ0f)Íóª!oõòìi«øšA¥ùÙ 5Z4-üÈè^öwÙ9à›Öši›¼ðê„.QØ ­ÔNmİf.ší‡‚ƒÝWda;·öOÏYÚ³~¿ºzþmÀ³ÍêÎ×ùa¡ç tÅe3켘dt;Ô¢Æ6²ïÒlddð{óü¬T±Oÿæ‹P¤2u>¹;b¢h’„ZTÌÀ©Ñ üjzÅ®äcàð…5¤ž †1Ät‰×ï/\'V]ºN¶°ö¢œ5·m>·œÈ> $`’ŠÚäü–\í™ËóŠIá ú%‘¡ï\ªÒkëë´uvÉ Ü7·>„>-šÓ)QÕo—\»*·K43=û¯…œà-%Í}(“pÒœÜ(2Ÿg®\Œc5¤9”}‡øÌÝѪ&Ú‰nO ©N¤¨NUI µ"¨2£Í“&p1˜0ó!X?y>µ‰86=nƒˆ²½S<³Å.\Ò½ˆõ=¤¦ƒ˜”Q•×ÎÓ”œðÀv„Pd&Ki Ü`'k‰Ü&VÅ…‚A|k}áÀca$ñÀÅCð„h ÑHí,[öxø°:¥:„aAM ¡œaýãÃó7CD'ì”GN q3Çá€Áuonºk×4e{ÇÒI9>Æi¿L~ Ÿ ¿˜x›ð™¥løHpn #ˆc=¢_­)$ï<|Ž$ÁŒÊ“œÇ@ $›yTVõlÌ®kYI=sKkm¢ˆÐ¼¤Îœ¸”ëŠééÖ»sÛ1h¡VÙd5ÖcŠÓ#Ÿ3v¢A>Aܬ…ó̶›FHèÚJpde;‘q²\¾ªh&¯ÿá.Œ½°KÌmº(d* àBE ±Å”‚ðÔŒë‚GÊ Y!Q FJ2mÌ›aŸ>)Q`igp¦4úÃ&m›4<Ý&¿ò]ì{wd“WûÑÓóãtBç…}¿ž/áoúÓ“oèzµ€!§_IôßÝãrkì—q—õ"»~XÌõçèLÄT{ ש¾b\•Õ/ºÌ·IÏBÕn.¶‚+iç|áDP*b´ŒÊõHR_…£6:¢Å‡Øþó"‚K¾{ vĉPëuä¿I D`uÅ„…­+aèsžFRQ~†P‰™üU lÅPtJ‚)|&Ýq#ˆÂs¾Uã"‚–+8çvŒ`‘&&­†1ëAñRDQÍ8п{¼!Q%iÂ¥¶™G¬,63Ãñ?x#:Ó±Òu$•M§FZ7NI¨ŠÔ4â–±)ŽZm3Èkx Þ8€TÈ´‰AXƒñMo¡Ú@Õî²’à¯@¤‘“Gé&†D,V5A:U¥C¹†ÒäBÉ@"ÎL*à@Íhµ?y\˜€øxÐDöK8e%ò46HupÀ!Èz=©ž¨*îÒ\òÊN_CüEàŒàÐ6ÎÌ·<òFmñ‘sQ|77ÝòR㣻Ô,‹ƒ×Q&^D¡¾è¬üd& œZäûóúó9"P-ã²ð³À“\%2êPCTáŠCòRP[¨K½¾QIº6ô"8i²y ¬&ÐÆB ¼â¢è)F@Tr*éhœãˆÈõ²^9’¢.æH´º6Û…XÝ46¢f›k1(d&! á® -œßYy7.v‚zQMÇÃlYÊ ÐïmX›L75‡·1Š€HC@‹d¤hâ£ÉÛC~¡¶(A@N}9Š9Æ]fF¢Ÿ»qœÇ2ÁÝàEûJKv%Ä&ìC„ ÐK0F„i-<$™i]áô¨ph#³3¯Ð‰®0K,,(Eq\г€=%}·îÚöñ©Oóoqf†+ø¥Ëwˆ%ŸÓ#fOs¾õül‚=èõŸ]«ë5Ä™ês†ÐPî6¹f V‰]ñìV0WŒA6¿ygWo8¢?É 3¡+0 % ~ââ˜:e`öí[*Lv"/E´¢žOV ‘˜Ðâj=qŽP2”ú˜‡ d  Ð+gŒQ„}T­1)áM¨ýôÄk©ÄÐlñ¸­_Ýœp 4[*2„1Ä9ìj1;¯Ò{A€€! zH7æ 3¸èžÝ©ñ+þ€Æº­þJÑTŽýK“¼½+ 3¶ëR1È[gÅV[„*Ñ×rYäÃCö²ã#~wgøÎ϶´ˆ´üŸÐ¯OLE¤ãa{íšO$]‚ÝeCLC^rÈQ($¼†Êè6±h“ ª•ö¤49ûÀ’ã›YœÐW€áœiäsúçK…”„K9äY¼™Ê„f‚O+¹!ýàá|O“aì*“Û2Ž Œ’´B4Âd aè>ªgWë:³¬Õqc‚j“€™ËE*/¿:ôŒ›£&N–¤ p).®CUoÃ4‚ùdãc²ÑÇIvúÍX†Ýz/lüòôúàðh÷™häƒÔøB‚)DÉÂ/DTÚ_‘UM­"üCF>°Ÿ8jõÝú‡—¢ŠÕDÇ8DáÛËf6{|Šé__'â¼’§z÷Rpïâ*N¢å¯ÞJR‚ý¿·×gTÿj§’ÃÕÍ€í?/Ž‹ÛánMœ¥Ò×sônfËöÚ ‰‹3¾êŸìKRþð»oÐWÅ6÷Oóã.x‹yéÚÏAš’B«0ù· ˆ‡“ämNŒ¢¤)¡*̃5¸,´¨ii"»•k%ÓwéH\%)çBñ¼¯HRvØÏâ´þI¿l<8•iïH㢶•»PãËX„¤8ïåÍcVŸv’L]ÔÜñG‚ôEÄÅcKÜEG\™W„VÈñ#vÝvèbQã’©'ꎌœÞ$Qz,Ó%XYKç¸A#~ëýòT»~$õ¿O!´æ¨‘-ôÕÓ¬³75€“1Bó;J¶|lº‹¤þ®D‘\ЊÛJQ¶;ä,O`¯~&ë•ü`\lÄîNË݈0Gâãò[éû_vuüqE~¿pó[9 ÇXc‚Yˉ`nßµa€ƒÒò)¡‡4ªò$ó…£ÐR¬žä‚Çå¦ <"Ö®C”,³Ø]I¤dúJ¥ÉHq®ødm Y™W2Ù4X/¶’åTšé ,-•Ç­O Ø$‡$JDO€Dkx¤ÂûšÑÛ§'@ÿ¹—=ˆÂ?͵:Hb EWÈØn‡ ø{½à.牸N?:¾t¾4³nô3Kâ«pêrÔ+¢ ,S-HwJqÉ’H@Å ÒáÏØã UžÄÞ0¿X" c£7J¬CTaÓd=,½é îÉ÷Ut1ƒËú‡GÄåF ‚µëPw쯢>ÞR…ͤXEK]¶¥Ox@¡1HÙ¬Pµ=Ÿ„…h†øQR¨ŒÒ U7s¶Àj¢ø:¾ôø˜:+þßÅ‘œBû]€q<€H³àÏÏ' òVŒÊr5Rë Ù©ÂÃŽSW­N¸s Q‡ §BÃ~ÁË.•¯íq6SKý­¹}j¥IŸÄN1õýôn>Μ¹qpS4ë7½9+’Ùà –ó>To(r”§€A-hdˆ]]èc U¹wð·dÖCd Üt†=é@"T¢Ý!â¦QI<}âk¼¥1åQÐÔ¾õ¢j'–Ù¯Ðøf°yÔR‰Ä2‹n:¤žè³ `ÀÑÛŒvëY·„™ˆXu¡t×PdØíø/ ' 8+> ã3ª ôÛ.•–hgÜ)¢•eÅœ*4ñý⑽ïÂb©¨ªŽBp¢‰\™… UnU¶¾²(Êv¤„Kha8É^<,w‚8.øØ¨Â`…ÂîlÙŠ,CˆHm5xaF|¤Ýcаœx01ͦ“H„‡Ã„\)ŒS,E"²ˆSPæ”° v  ø_‹0¯rø¦`ÂÊ+å9NÜÈ}>Õõ[PoÇ£LCýo0úG8 s9"^`8<%jº ÿ@ìð«Š7ûü¿T”މ‹O0#ä.´5è›YáërT‚RxGƒÌaшþî)õœ¾©KÀkf¨Àó,^_¹¼ÚÆ(ÜÔ:p¼ëœ’9^„Š®Ò˜Õ±ÄäËmÓ¤æZÔ¯>r¡?!0Ûª¨pUqÌÁ†€%ò°¬ÇøãzæG´¼,/ãO8ºÔŽ›’õ„â$3~ {TµòÉÞq£4@ŠóºƒÂ è༦@ÍA(™ØºË ƒR5ÍŠ¨uÄÀp#Ð9iÜ 'RVs‹uBI$n&8  Ñx•ÛÕKÌÁ•´Ô¾(ûf&³ b¢óæ¦D`Î{ï4G\e‹HÈÊlCJØÊ·9ðz-–Á'ä÷D´b6±^¾Ø|ÀÐ’í€SY T&.b'ÊkÿJ†"—/Úl%$%1½ñ HØ-q0‹£/#¥£âo8+k€“b¾´ŠG£…Nšøaý˨ç?ª»ø®ÐËÈÝÌá³Â° €¥Ü6²G¢Rs‡Èå Ý7j„‰Ù®ËG_Øá _is*Äh7Ca2S ¾;ê`A²ü¸}͉‚˜o ¼ë‘–c2 ª)ž`ÒQ¹‹ºýhFmiº…"‹ÉmA<¥Ür§ØèÏ<#¸MqŒ02ð(ê;/5! uJ¸åé—ª£=ö„ú¡zÚ ˜‰—þH8Ÿa™¡••—TâY†›8ñßâ„åå‘ãI?¦å¤àKµÔ±œtêe[®„§î«5W1È‘UL¶ö¥ 6¥Ò–½ÇÙ“ ÇCMˆÖøšÉЛϽþ9è3ùøïI[VpˆX;AŸ@¾‚e®4,\Š û^Ñ=g˜7*1ÊîÌÞ+—1à »©è+Œ¢ ppÛÛ·ñ#¶Þ¸³s×Qk˜•°ÕHó†ß±Fm-2:55ïSˆc€†k ñ;NÚA¦¸.õíÂÌ’Y{KûX±TS©Ò….ÈŒ’k¸ù{g)km?‡ñÇzyÖ Ü\„‰Id%ùè7¯;°ÝDþÑ,a¤MI/ (¯™x ·Ð0ÁÔ¶VÝF¸}#‹CÈèÀ[EŒ¨Iî%9s„•_\‚Ñæ >å4FrÉ)R.Bó•+,:íPªÒL¿©ôDFh%3Ž24;^iÏĤ±âü˜jx~m¶ðI»sȵôÚ|&!<ÛÞçºÙmƒ ^C|'%}¤bçÝôÿ6ªžyv@_¿ ßxê䂹PÚ–`’Ä¿8o;Žœ! DÍ›°¬ËÍRŒŒ>C…Xfâ´Þ• "$|Jó ÌwÍ3¢ háIäÎlITHW¾„œùy;v?ºýæü±uÍ :¿ß$tçûa/„¡¸Y<ýÂÿ.ïÒÁŸ Üæ¬Jš:dæ®"DbKóÀ„r ¹îØU5 fÍ À‰:[F¶Fz› à‰>Ÿjs( ’H9Üñ[H¦kˆy¶ßêvCÇ b¶¨xA(ÄÄTŒ§Aå;bX±ƒx2YÉDNºø&éíðÏøïÌh«ñ}š¿F(±L† ÜÎöQÕ~®ÿPþñ†ÝÞ(Œ>ôRÓ.#kT,«±*$9ÕD¸ˆÍ…'Å’"t?猣ðŒg¹r€‰'”s’ ¹+òÅ[^ÕÞ¬FfìyCøo†ÄÅó™¦äxû8a`ˆ¸µ ýUÞ¼è0‘]!gM 7ß}?“ªa&|t]_pá6ôâ~¹:’‚ã/—¯¥âÊ[¼u Ê„§®ý/o‘÷ŸÜÖÝÿŸÙk[¾ gUŒ¨ b_·—ï£ŵœ×ô»5)eü ¶ªÇWÉ΀®Or`ÆwqÀ! ´Œ@ÃÌØðVCëa%äðÿ-v…ŠyÀfÝù§5Ej8¹u2è?§—ƒôå²Åy™ EÆ<œÐéÎ(×Ha¤@|è´[ åá’G€uãd¬}Aå0y‘á%Ôê‚ ‡&NÖ@Â+Ä5£‚ä¾±hŠsê(íK™—ÚNFŸSðtµˆVÓP°ÈVÇELùîFcž%lÜ:LÙÐaÛ«ÜbÍŠ¸"£•ä1²²¯>Cå-2^LÐ ç\KߢG\Âg¬©9áÏD!ÖŸ~Óä%LÆt3á‚–®"¤Ùâ.…\{ƒ†F¤@£*748 YÄ8ûŒºè™ŸhWàÏ\«ÃB‡Î`—9i¶ÎØËA €Œ6üÿ†™WÕñ«.•íúHN‚WÄÛWU^éöØê­—ÄÔ7ÇÄ»žaee‡æ©`/Qó5v$ÒÏšGÇÕ {1åÔ ’ Bkx)ï`Á/í'þ5 21jŒ°`#Ð ^Nà (TƒAã†Û­·éøîU'©˜ïùåÒý~ÿ÷T–Ê”»ü%-GÞê²¾’¦}pÒê ÄA¢MíIN‘ÙÞzº¹0þôØ“Õn €ŸT„q‚a(~g‹,ƒφà"P€Ú¥ùe»„KvXXg‰.Æ™i K:`jZݧ$’‘Kg;§3º_òßÝTE¤Rø ©êÿÇY2[׊~²Ï`|éyνՒВ¨FÆšÙh$”°L©Ò¦êLMñdz òÀ\—M#r ŠìIî&|ºyhQøñH¦MòœòËÓÓaãûöÚ²þÉø>‰M¡[#;?L…ë›´dÃ×uÊÃKÓÅ…è÷†a^Z’¹›•b§1ÏVã¯AÒ{¦8Ø…ø@¡£]²’6UÊ€ [-L‘OêÌ—uDÛ¸$3C[âTR5"T¥ãg ÐGhØONcã>Ls*hË| M}³ÙeÈÊtß½yüYUɹ o؃©M¬Õ_ÍùB¡ûª^^ô×fUGŒþñ?Lù;¹ž¤^ÍbeÎÓ4ôª«§óþœå»Ä§ûœ^çzb£ÆÈVOþR—·Ñhý¿Mºîh§¾ï.&eXÆD([‚ ž¬BcÎ^Uy ãF˜¶øš\‘ààÃØ›NBáégÌj’ÐPªL(7t$:X¼ê®½!x„s M&¢¢¿ßrÜ u_¯’`¬±ŸØ¶yÍÃX°Q©‰êÔ ƒn”ÛX/NÚ'D%CfONŠòþv#ñ³v:Ûõ÷Iß½ØÏòp¤ËÏRóv¾õ³z=ÅõÃ0ż†Al&|ÕìF:ãýù~"ûd Ül”’/¿*M_ã6@o‰(fšÊ˜Ÿ÷¢eޤòuÌÒC&ð+ˆ‹]íö2">›jq$ý›F\RD„œrñ+!Å–üã!Kîß`qƒÊQc]¼èÌ„…åŸèPÆ_;´52Q*æ;[ ^äc2¦ÀŠC¶ÑK³(T[ -®HèanûwXþ ÝxÈã_^ÈYU£©`dDÿ;ýžsCeOÒ›þ£v·öÊí½½ÎK®c—Î<šÚªìÖÒ Ëe…«ÛÙ‹Ö_5?Æš#´u'ë¡ò» ´~Gǯ—8ñC_Å•c_5¤-Ž3ŽyÄÈ"B–$ìðS8 5+=©¬:Êþ—„Heˆ‰/ )ŒýëÇ0mv#<Ñßà_÷ýrŸï–ûÁà6ºçO'è„,??ÀÎãXhË@˜|ªþ¨Š½ìf²m zG ²Ä:gQuÁ ‰§2D‡?d–PsW!¼¸Q¸F®^©Qo7”z*©G }˜Wp¤¥â€Óßò8yqï1¶¯”5£Ç¿ÐÆÉ¢ßY­:Wžrbô¡?ýTa \®AÞ)x#iY$ajÍêTøð©.9@¦¢‡`¤¹‹Ý 4ù½x‰¤s¥,‡Ñ­:£öįæ Nm¡~›%Äv¾õ -ÛgDJí;ùO`°'Õã!%÷©ÐZá)BN¹6\ž1Gx:D-#Sl18õT2¦ƒzü ‚T˜Š@ íøf&'à ºW¬i® ÑÔe㉣  /„Þl¾Í¡še_ªBœ½ƒÎh:Û{ïi¹Wî‰~ÿ¸[Å=g[©ë-”²j(túc8øÒ>cúü½›òf<\>q7¬ù^w¿nbSÞŠ¾[·¿•ø³ž}†•nô¢¹{©ïÝž¤ôt–*ãëû‰Ÿû%iíŽ?y{i(&søv—¢Ào˜£F¹1ÜD|‚¸²LO]ý ã“×ü?ű“Ô[O«%?¯rü½W'ŸO}T lÆË=Î*0ô ÁD›¦WŠÂF3 Ú÷>†oÂKª‰±ð+Tؤ@šσ„mæôïÖþáÉ"XL ýOwÀڀݿeÂ|ó„ÏC‡oémºÿý捻Ànï猡„]ÉÏ6Nò J®:+QqÁŒàt-+Íü æût쟀¿Žéë*(?§V¢øV‰y³e!PÿÅOwÇ£AE<àEÜ}BˤD°t ^ÃË,ã8 ó“ÀtÄ›\´«í¡4±NDçœ.Q0Wýkõþ¦=ài©“},òÃŒtNØ™Gä7CGÒJtÝKÏ7Áª§ö—·á$ÌJ¼†÷!Òòæñ"1ªh`ñ% ŽÖuÖPfhëÝÐR • A9Þ\nZ- ]†ÿÜ{,@È@SGäLIJy·²’™÷H.][ås‚J_è.ŸWçK=§å…!=½Âš|í5]¹=ï)?!}H0:eK8k×§-7ª¯°5´'©¿/>.š8›ßñ\î“Û¼+ÇËÓéäü,VT½s!3­K e©y¬H™Æ|dŠXˆT‚íix*‹ ÷•ÐÕy)Ð2œ$[¤Ô¯ÎIiE\@F´Hp˜½JÅ`&j·RÓ÷i{³nq± xø •XZaÜ íi.컨pû¢>cÍôI“˜ ˆ ÊÄ(I™ÆœO¶`A6?3c °D0?0(3PhÚÅmx϶Eùiok§`Ü’í•& Ï‚¨›o¶£‡N `¤¶Rb& bÏLÕŠ¥ XHÜ ­§Ù ò!œ$ ÅG.U– ¡’NtsA4­’")`ÓVšs"C& öÛBw Ò~åVÌ]ÅY‚"¯óƒâ⎹m<N@±;Cñ\ýá°î³ˆÁò( >˜,¾qoþ¹ãøßsççxîü÷jý?Aµæ–þK¡¨(¦ý⇟³»û4g•Þ1oöüb°ûÌbåxå?œ¹åif’v’ÀíeýÚ%8€™ð*t›Íª (aåŒeÚ°ðeðý·:Ý<‹q YѸ`‰hmûf‰=ûyJm*±x@:UjÅt¸¬(¿kB  €ÿÁ$ (¦$ÄÊ%%@ð Z”â«f2I\€Y’Ù8‰–å¨ÏÕ2OCRÆâ¤é@K¤Kæ·aD½ú÷7n;7ñ~XgÞ@EØ¥×]ôõŽŸ8_}µ8ÛÞ×D`¸@]^PL‘À‰Ú=…«¤ ÜÅ$-‘‹Ó ð¶˜B²Lb˜Õ²ÜÂÒ†)KHfÖ8d”CZɈ±Ì,~Ú Í¼ö-þb½û™|u€ ÔÀ/̧ÚÖÏàdûßÓàhã“fûGÒ/õUúõ%ÎO o‚5újQÔmþ:¨ÿniý¨þ~~ßü¾’£ª‚¡ÞEÄ›ÄÔÐj£Ã BʉС³',8FTÀÉ µ‰kb°z?üÝÿi±×7¡¼ÙÊöúþSÉ¡±ûìÉ…–cW³«ßó0¼êÎ›æÆ±\ˆ°J/ž› Ét3u7 cí ¶s¶c9ãâgUa×Q†Qrr´«¶LÆwÉФ])’”PŒfžì|üEGcß=щ7'å(1˜AÀÁ($F0p¨§³1Ä¢õ¢ÌpI¼) ”‰†F^HÇò_nælIeIí\S"AÓJ›{áüE¸Ñm¦£ŠV”‰5×ôðÐs#?lŸêpëëõ»Ùvp=k?c \cް¨¾cßÓ1ÏÝLÚÔ Xh´„%œª¨L”"ˆ‰ ÚëQ]DÎ áõë@ÖGYå¿}ïW8i=ãìÍá'eš©Sù{óܾiÇòñø°üãâ'”fÝaûˆ/òTžÌÓ[}¢â ‡ {Ÿ–eЧ½ÊDçyàå ⎃ˆWYkŘRÉŒw­8&×¾qòÜM¬ 2#8‚KŒs̨0Ù-á°ÚÁ<‹Ð$c ¢Ò¿†à¬ª8DëR¨K2 |ªÈŸ¢U˜Â„NäXI“Â(«qÖö2K…Ç$9ÆÚ%ËWå½ÎÑÝ¿‘™È9Ê Þ¡EÜ2ï»ù¦mèž°Ñ#ÑÃV”!Ö «ƒC¦¯¤直‘Gެ*g²4ä¾ k ¸.ÄÕóó*&´áÊòç´Âå\x"êCCæ4ž¦nt°‰-Ǫ׀žæ=è²fño®V$ðrˆeA59üŠÑqØvÀGØütÁŸl³ 8GÆ3RfÏ7JÎöƒª"Cþè¡¡õ2`æháâºIA?ùNr…W^¤ÎPÎlE_ >4ªÀn°H*¬‰Y)TiqîæNª,ƒÈðç[%Á¨ \¯þ÷,K„A‘™|Áª?  Z,éXó”dB|Z1e,â¨TËÃ5êÎpÒ£Zg_‘7]>£Ì+Ò²‡¨,P~ž,¤¦´ »|·%SSéSÎÆ£(â1uƒHdÄ%*ȶw)d@¹ 2|‰'‡œµxФ…‡c=k–¸'ø‰"ä‘H€im ù1 uÉÁ·ŸÕè'¼p/¸_©%¹#ï¤xËÉàh=Oͽ³ôæ1´Ag¨¯Ü-¿$5–úWpêyåÔ9Pýy'Ÿà |’'(dÍÆ£EYiDÞ]|/»ª3T—$˜ƒ Ð(‘¤$›cㄘni2*‰zµÁ\%% PnÈ#¬O *3¤>}ûh´Õ´T¯"j¨é§¯þÞ çKXO÷gž±íDAä¥wK&cÏF²ñÍ<¸?oŒfáõuv_‡auu|äàý—ÖNÉ,MõM=Ÿkòý_Xù…‡?Ó, ÃŽ)X³Ö$ÐDØf¢d²KWʺE>XÖBØèåÀQààl g±@ŠuU¯Øg¾¥½©£9^èqØ8ÇMf›®Á‹¾hŽFªùÆ@Nªsâo:gb[…<ñ&e'Ð| ©%í°eArM «LAñ[(5’ִj©2ÆÍ8V 0-¦ó G”·\ÝÏxû'0í°¹eóïrÏ ||œÓF¬9üÊÓ%/gf1-êYçú[×Íû£}ç~Ü&ÂhÂGõrí–Ÿ/'Aâî,ö÷Ý|,ëk‹"ˆfA`Äc×÷´ÜÉb1jÖqþ'~˜—íjÀhB,Ó óÔ é 0̪3¤åV5BZýgZ²#t¶£Œ‡ìšG–ÎþNÑíÑ]~½:‡é…FÞßvíAZóOlÅã®O¦˜2´8;mh³tÑÄëË  þo·?˜‘OÕ‹”Š~--¥“9²±-$øàؤ¹¡³3ºd&z¡¢68‡ƒòz&÷Gd'Wch‰hÜhC>­b)RLŸ…Ùz.LŠ¥¦ðÊaI;º :ãbE†¶ªwè€V:0"™z£;ã ,:7§+ÂY¤& Æa ­ïÇkñ±ÊdÊ zÂ*ëË€’ò¡ÐM’ºæ"⹄¾`£"tÍ)@ÊC¬ŸÊiˆ/Fߨ5ëC…,óœÐv‹TÖ & 2ÁyD¨&á†}ô's”0ô^JÀgx¤Æosr-(E†rIB¨+… ¨§—k¹ 8bO9ý¯`xú!*‰‚æi‚b#ÞÞ¿bYrqCÄ¿-?§ÓÀÀgcTÞ»&ߌ#Š¥þ>“isç}1Ôõå|¢TI’¤¾*1élÇ –rÊ2\A3l‡uªZŽF}H›±¹kåçã¢áýWrî©Ü¿}Ó¾vto²n¥UdP×!ò¹²‹P%8…¦£¢ zÿ@}ç ¿1l ´ 8¿)¾œ¾èüP™WvFÙhq1Ûé >6Æ„HN¼’­B`6éÝ 2ªEû¤Ä“ÉH‚”®×?­Öø·;‡(vêÄD% Ç÷ü†aÙÀZ©=T_‡’ W+R¼¥`üÀ}êí>‡nbcó¸¯Ù Ûº!åÃV’šWËù97>gëü}Çöˆþ°ze>a_ŸXïÇÏC^¨HxÉÅøŒŒã굿9VêÝ?>NÊoüæüïiròæ:Ü8,}:“¶Úü_‚ʼùù”Ç;ƒüÉþ2êij‰œbJ:ë%$ªMvâpº‰5±"¸¨d9$‹—ÏöF¥8« zjŽq“©Ö®SÑŸ?™ˆv,K/÷|¥=3·š2WÚÞq×’8Éžÿ­‹ñipçÈ0ÙÒOIñ Éóëg¨§è jIq¦8+ÀIHúÌñ™€öv Ho™ tGïWe™èòPMÑÀt…ãÉWð/Öxõï’#È:nü'§º€¯«9î«™¨$õ,‚û¦K¨>hsKÎ)Ö‡Ðл—ÂÓc÷Åðº+ys"6„•Xt"Q&‰$ƒB„l­±à9@Ã+·yg5ˆ5s]¡ÐTHHu“§`32:ö LËJÆÅ6Ú]@!6Q x‡D~nS¹rÅÚ)fY3#rf¸X‰ûÍ”ã‡CØ Ý'‹yB\?¤Œáç¯.1!p…£»Ø $Ê,e4P;°]°$q¬á,³M ‚/Ürtçc°ÒÍó+bÓ/J]*Ái˜'ø¡: ±¦…4<Ç"”‡w´€¥ÒŬäÌ<¹aî¯s¬K}c{›ú‘Õ§§l|¢Óoø¼ÑÞÞ0SŠQ’4®¸áB˜zÏ3;Ήh˜¡A„P{'JO»7–|V1ô’¨à<046ðŠÄHU,s<¹‹d‘“´}LJÆÑ¯Rbáê¸] [FHeö£Ê§;ã/RÕ=ÏöDéƒá4 ¸WåL?úMd–_JPbà„1$KÑ*ˆ°‰³ÿ ý¤¤ÿ©ž‘å@uBY&‘ã:+k.8+ š¼ÿÇ›¿eTôwóWÞ¯™Î¼ŽÛ,³>F¨~ª»u5§‰<;ï|˜D„Sȯk/΄ þj9{S~\íîåCE5÷Qµˆ+y_ÒÿÞ*ÆŒ÷DIqÊÑZ$…qì0±IžŽSRˆâÀià~ŒšÑ\ 32 hÂj숃P[¦–A$²‰ú/šbI¤˜”Šr$ƒuP@8V FñIÿ=×êÓõºÐ:Ïè6i~º,…_³Á!þëóY³,Q~WÚ<«Íïc$ÆaOxhP´ã8ë‚D% %ÑI ú^PƒEMý~àÛÌLÜ9ÙÿŸP°¤üŒ~%ÚÂKËj~Pòß–­ü'á<ŽsÏÔ¾¦þ¶Óà’/ARå²ï/oz6ó÷ì´ù;› ,sçÏÍ•·’}çn«˜W˜µœ?dÑù~Ù‰.›r×.§1(Ô†mI¯•›gÿÕq®ö‡–Åãp¼=fÍž›ü{ù±Ì±!\~驇ýZñ.a>ì`ÎDMÒ~Y.AsH¿l#[ôQy $E\H›éÚ(cryQ/Ù?’ÏãhsÆþhN¸‘ôε( OuxI1]&¡›çüL~íîxg€8¸zMvvJ×ÕR61rB"¢Ã~V[î_;—-bÀ?eŒê£<Ø€²Ø¡ é5¿„ê`M}r´r~df@£ ´ß¡ ÐÜfEpkX,VE)“ <4…P¨,é†!À$´Çá¡ô e”ßûqö ü,*rúŸ ¾é§ëüÔýôøýlâ*ñÇg¸É×Ïáù'¢ÙÅŠËî’ˆy&‚ñç²ÛÁ®BÐñgÃ9DÓ÷|þÒe >4­+iãÐ ò›Æë”²K;-ÿFå]\•·Ç§è§/z¯7@ËÛ Û-K¹ó"ò*ÃðÿÅåê²o´´Ž¿I 1ÿ6+™9‡8˜K¨´¢y–JÇlÂBÇ.GŒ}m¸™b²éyaç‘Íž(O蘳HÃÂV2öF•ÞΗ·Í¨ë©­¬tÆ|½0ÌS÷ÐÂír=ٛÄûíœÝ²ðÏë™ÕÙ%§™?hÈ–Q2òiZ>®8ùÜþË}[Ñ÷ņ°…¸Ý{3âoìv!“áIpÉ¡\ªùÜ¿kɯ5[iøæ)ü>„P·×¿^ ‚û§)òGô˜$ ,ž³Œ – ă¼â vÜš"40ø £¡3/—T{aÖ  Rd[O‡„©+sGÖòÁø/zHð•Gb´®rq‹4Â.¢„1Üay Ôa`§|eñ/ öƒp†ØXZ§­Ö’8CQžd!: ýù¹ËÒ…?bqJR±&eÝ´jØGÙÆ|ЯDSä/7ã[µ|°P&p•©è¦˜Ôû`åò 9~xÁà†%ö´ÐÈÜBb—Ï’Uý¼¹[[¿$ðáÄkNjÒŽ¡¤Ý)ûì2%Uï¹ù‡%[~>ßíñ|«õ: ùetJÍ~Áí—5SNùñîòù-‹ù*hDz±=ºoüàý‹ä˜è¹yeýŒXíh4ø ;2ùDǘOÙ壷 ùCb]‰ý‚}MIÜ íÏ@®ÕÏÌ>Àèáø •["?Hs·µRù¼oc½;i˜ø®¼ý<]Ÿ¹Æo?ã¯k}t›0Lj)*Í…ø÷¤§&©S4<¹Î "JC› —Çʯm$9Æ)tB¹)o dLrŠn›é§ë¿‡­P)ý€t<¼€ò=sÄ‚ à.Ô»½ðº+u:lä'™ ï/·Ïävµs[Êð¡¹SÌ?³úÄ~§Ë—-yœrÓ^`Õ?ÊnÔy{˜x/…ÀŒƒKžB¾àsÒ%Áu/DeÊ[[5’È5ÔfP@¡›§ø‹:œáaó.€ë}©…›“â©RF7‰¦ú%ÔªŒcÈ|(tü}ºóFÞâ4þÙ5ŸÔX™VÑ L°3à4#í:ôúLwFÏýìõÑ ýþ]G{ž[%Ô˜`Α§5åþîb<kwz$ÌÏÇ[ èiŠ?xA" ÷Õ±‰L³kN´Æ,î4Û?Z§­ˆ˜5¼s)„ððÞ},ÞH-´Hü*» iƒRç;|S¿½2¤rQÕHÁ¤Îʇ† 7?9ïè£íò¯Ê{Þ›>žùêÉšÑÑ–çûdûûÿ)ûl_¶ê @ÃÛ÷5üÀ÷ì â]i~)‰ßôKømüvöpÞt™&Ô…Çåo6w½ ZÿFãy_øÿ=J½X ´–à^ƒ7/ݯ…Œõ@‰|Pù¬3ó42--†¢(Þ¶ÐJ¡Âô÷I €êrô%ÛA…YŽ+=B¤U®Ùµ0›ÉÇ‚­]•X­ãã½— ° 2—=èÒÉ+ó  Xh)~é©Èxµ(çD`ŠÕU„QÂõZm/rú²§1 •„2VL¢«‰˜ñH%uÏ4xNã:}X­Šîþ×}ð×®øÅ»”0Áþ’$yKåYs­”C„ Úr'êwX¶,J Ý+㜰 '<+¤1o}‰ÉGVSW.ê`$‰ëµgùE<Ã3¿oNÃŽèå?:†{í-æ&ó¿´ ¹ô©R ¾‘Qì d´V¹kÉDtK bÈP'~¹þwÄÁêx(ÛKÛAIÇʶ)b„C©0ÞS8nü(™Ø#àíƒ'…ù)rBªyMã&Þˆ}6¯øÅ{͘½>¦ ¨—¬°4oHLÚe÷Ó àqx.ˆµ™«£øéë@’½ã’²ÅðÛ`U{UÏ-ã ƒ¡¾ KÓ@ ‡šQ“€tæ %C¢R9™¶ïÒœ(€TN[Cô†œØ^031ÜÆ^Òï´}Íúר¥ó'PìqØÆ¯?På²é‡)/çúR]8ÖÏÏ/SáäË­/óo´/ïŒd‡ÒSÙL‡A6<Žoͨ6÷z9[TþP,?pJÛ¢«ÔÉJvgžj”ËFE1r"+TéÖqÀ²ÊшN PZ2§$:²ƒæfJ— ]w‚$H%Kw¸6¸"ãTÍÚÔ~äÁ| *S<¸ƒ9AŒÙ(aÂÖñwM¥&NA¢AŸ®èÈ2Ö0oU‚!%aœ|@’+Á#ú g)#€N0N¯ ÑŠVž-V£ ¬0¥ÚC„é… ¾¬V’A;A\+8 GÙWÕ6%MÊ`tIã´ãÐÂí^¢}C°•£:ªÂÈ·Œd‚—yôkL.‰ÉWÞ !ãÄ+iœ…Gdl¨ÚU]è¢Þ7†QFb_ J‹DÓRH_Õ LP;$+U!$0ʼn"Q¤·ÿ*_ÎÛ›œÓ™5©Þ9â¬åØx†,ÂhP*9H©õV‚ˉ’´©…!”Œ|ÍæÉ֣לLV»u~ÿ&râÏ”ô™‹@;þ·‘—~¤óþf·þ‰lrZOŽnß ñ  `>À£CßU˜ËxAÑBµkEÛ†P•ÔÐàÂ[™¬ëÁš8yšYCk®D¡µ†ƒÍù®óBãÕÀÑÒ+Úõ è~Ô†›\Ãßìš=82}<öëWˆŠ´äüœún€ @þ_ã?ÞSkfrœ„HQpÄe.C4W‹×ï*àp÷Àÿ§s|k‡Ká™` 7çDl&†$R@ €,q× ¯'aNÙ7Ñ\Öéu1_yä™txeŠÂ\ _BB}›Ía=Ù¡Ìjˆ¯IiîJ`™4Y.ºn~V^,§IUJå#¢ƒ4²fÚ©Û®¼äA•§  pN–5bådÚîwk,”mla/hH›r;äûŠ‹™‘ú'÷¥‰õV͆ÖççÏ#ËŠƒn†¿"´bDFºJ0tþar°T±×îháèÏw¾ÒâB©vs¯Y}mÜÀ—Yÿ‹ñ²–Uw¶?1’Þ__õ“æÒ¿ì íåÆÎeÚ´.2W’C£Aó„Ǽ׎^åŽFð8­4¾×vRªNšò äÿ|ñü¾Uú´™`˜Œ®¼É¹øå¶z7ÑsL(tPÁåüÞ ~ÞŸ ·ƒr…XgtŸ»{Ü5¯™yò$ú•…¢®•ÿ>R…µ.Kˆó˜·FïâU÷OÖïÓ·½¹+ú|º#…+ ¤±, SÕ09dP òPpç#ЋŒ³'r[iy´Ù4Q@~qˆŽd¦ Ø›F™ @ç&1à^Þ2>e²aì±WþFC¬{§#õP8Sàë ÐE¸š$¬4¬  QXPïT¥A¨):´CGmç  ˆì4®+O­ñRÌP6Њ°¤Á¿äE'L¶Zƒi§²Ç2çWK8ìjyÇ3f‘R“”Zxj 8Êå¢ñ‡%±ˆ8qí™À)™_CŸÞ€(\§¤?¨ËÈÈ0‚½àûþÕ›ï°eûS߆5ÿÕö¶”ɸ¹æãI¸^ú–}Èâ*Â*ˆgîÆ«$ŸBXJ¤ÕzÐ ´DB…t 8œÜ@tuS”•äBTæpël=«4V8fe ÐÕyÁ³Æ YÎ΄:dv‚cЖѱIÉNÃ@k¦Çš¾¨Ci@¥oqÆŒïÃJó¨è™hÔ¼¦\¡œ8¾f"ò qDPɬ&ÕyØ@610;c›˜(Zˆ%x¼“/®Wó=)u –€¼kø¤x/—¿ÝÅt™"ûGà7¿ÞŠ/Oý=ŽG^ÝWÁ'©3nƒ.Ëô)+ñyÙÿn÷þ†…ÿƒŸp5¿aR6¹ñØ• vy`¹Ü.G_”DÆ>ra+}#ãXORßX ó·I-8!D¯ƒ[¢vùýA‰Ëƒ_b&Xç2tþ;£ÙöüNL “½ò•aœ–U·žJçaU“0!6».ÅB †hP› äõªRp S؇àõ9¦'¸{œ‡;3g¿ñw‹þN²nà|‘M7OÞÔÙ>>Ü‘ˆx€„É-¸ÒE)P¨§²ão©åZÎq4¥œOÕ`ÕuNÞ5'd¬-ÝÄ•±•=Õ€˜T™$aq„´!Äð¯Pì3¦aÏ=æ­”(÷üqAÎ4ÚÖÑÖë|‘¤óuë£ÃÈ$(D!ijã ‘~ª¹}ßFþ¤nÏðy\Þb_Ûé03­¿ß6f'¾Íy$Àa¥Ÿ{KŪcØJÛÉú½p˜eâ`iSC×øB}7C7¡|O–Ž\$ˆ¸VÖy/Š]i{„­¨0hÞ`ê‘ÙPA&Å:#JÈt$Š @²ì̹„Œ…Ý>ÃÆ üHØZz@ 6fŽ}µØC꺺ÎüB\wB‹ÃÜÐé÷m ìn5ñKMy<#(6 ¶]µ¢ÂD§Åú“ ¾Üƒ‹lÂШ.eI©;Çš@NonãT\à3ûÄ» jˆWiÚN•e„½ÁL  o!2T1s•“62¸`S3•ŒõÕ’Pâ,me3Qgëæ#’l»Äm0ƒøþ¸[ò,o|2ÚW9ä ÍF6BUŽpNOknŠC.Äë« ̱¸£²»÷Å õV 0F\b?ø±éP›‚ïDžXI•ŠAga\¡Ç.¨£ AšCBÕú¥HÓfC›àAßÎE2Ñ´89+›!yž)€x$¯à öˆ «‘¬&¹¢û`8â Ø¦œ@ô?Ò¿hÎà“Ëéõ­’?–*ÉaŸD{Ç/4áð€öë_ƒÇ¨/HÉ«š€ˆ0BU˜?è|®MešC¿·ïñÇ-ÓüóßÖ;k}‹^˜á(×7¾ñëªò„qGI±\E_4ÂJ;ƒ>]A–ª%íRðàÎ)¦²IH ?X%èd+&Ûì™ïÔV!‚Mð #ôÂp)L¢6ƒ,w˜ómÄO {O\ï:±>{T@Д‹ @c·•,‘b „âÇŸçŸÖRUoFl0cï"öý]ˆ¹;=òpÅ6»åúý”I¾0ûŒ`pÎÐ~€ØM^C¤ ÚÎÁ3úÐX@þH%gC¤ ù³—Tã3–ƒÐW_aòÈ0tóïÕÌèôñáðC vrâGä£îÿÔZ,oUº:™»¥Tÿ>hBsù@úñÒÆ‹‰ÅÍ©£WG,~aOçûñúL;yãH.¿ ŸH5å–Àøeù´êú´Ùu¿u†°U[€Ñ ã˜ënÆÃQ”ÐÇE‘s6%øMÖ\XIAU@ãTƒˆvRÎHC´w·F4sЧ…÷š•[r¨)œH¬ãh€ÒXg¤~±¤æ=¬äHnes3ÖÆqõ„c€ çzwûuà~Æ÷÷ôែÈÚ?4u¶x·Gy¥œ Å6õóqñ×PfSNŠ(…îÅþÞ¬ÿpQÀš¸äjEîø^º¡/Æ+¾WLJÚà´!ˆ“CK`8A<.² d 9ÂJ!´ˆEÆzûFŠÀO“D‚:QŽ…÷´:@Pò Ì=ËÝ•~ÿk×O¡³Ùb­’yE²-7¥¬w-â/„˜ïU^âH³qn)ÂVAéϺq‹7¯“ññ-»€åÌb°ÓC?¹à› =·}#¤“ô7Ó=‡ïž}òl…æ¢(EÇVt#µár4Œ¦è­ˆ(ÖEÝ6 ¶Ñ…#‰`†`6Ú%X¨A‚›¢è9áÍ’wà7¾QÏêY&e,p€2c8?3O ún`«þEøiùn]\]¤‘ÕÀG¸ü¾^½|øË2ý-ËÞCàt”À‰!Ÿª´¿»Ñ>Å>û~GŸ+¢ŸTÇð­¨~²z—úø–O•¡3­ì2àž ùÁ+Í߀ús‡CÅ/Ìñ¨î§ùÜúaMWÙ ³(#ÝàãVÛ?¯LÿÍüg‰ÀIaÊûž;rÿˆý)Qçò,sBx9þ„“,TS]£ÐÆ&BAÊp{Ñ<ÇÇa±&<Ô·ÕjÒ¤Ó# Cîêú Ù*÷r7¶ª¨?nH×ßêsÈ¿qƒ2ø˜$p5á7}Sǽ cžJèÜ¿²T#äg³e!ÆÏÄž?¿!ý´C÷©Î ýÓ–|3’¸™_KäiÏëB—’ÿ[g"Óø~þtòÜ~Û<øMÉ¡…ï»+ÀòÐs–ë¡h/_TL¾;ê½Ck:å½Èëð°ç}5ŽÃç½%Ï5¤Õ %9¢6‘¦¶J̉²åሠ…Ê?‰>¬BêI  ܶï‡? ‚<¼Ìܸý5²b+o4×1±¼¡I¶DS`Ñ”1€Ž ©³›ðpŸ–rM. éiÓYÇÃÓö<à|#sSð]J×(}>ÂX=),Ãö1ggCWxIEœ!‘’D„ËTþ½ÿ˜ÝòìyÈŽ?ãݨzpS£ÂÉk‹á‚ÃS I1ã—ØŠv-)Þ#Ù°åH ÇŽˆ…:ýÉ&HJ5ϩָddBû¦@?õ®W5ÖÈ¿oN€èÄiÈÌ"Eáÿ~°*ö°¿r Ý/t\`1i€Uñõœ=óûÎ…ÞNwXcÐs΋X0¼PÉB%’|鯫6¼ÿÂ÷¯¤]á«¿lÃ<òP"¢Ôß,¹NðlZ8Ú“­e^‰ÿÓI¤YôïBC™ŠwΜùM #nи¨‘œÂÔžâ ¶ØVW”©C\(ÒDäÈtVÊ>B×!ÝåQû—к…6 Iíú´ø‹.=Ê|[}¼Äò!翺wQ;#½ÅQ7Çšz)w½¥Õ#™A¬½áP\­¬¨ÓüŸµ p¬=J;"ý奫CqùÐÌV±Þψ S¹âµÖžGûl fUK\Ob×õˆ*O8cýöÜA I£eÙ3;D(¡7ÖmÜ&©®±Ü´›ïuôüE¯lL°â2†±/õ~v–¼ßWºýK¦{-¨³N̘üÖo³§åàÒŠ»1¯ó̿ɒjŠ•(+Ú106$/ŽÉˆ5J—x(>®2¦£ô°žMÞV…<)rÅcÑÐþ¡BŸ}¯¾Û<ˆ¾ð—ÓY >a®“±¸ŠŠfÑTr0%ëèR«ó,=ž=õŒ¼hI42“¾’8‚oß^4[55ÂD}n™§ñ~6?³¬ßi yþy¨sÙ›Ð3ó©.êH•§¸• ùVLUTï lQ§0…±K—©HÐ:ÕCD“ ‹­+å«8QD3y\´ dî$)©äj©¿AÌüb+}92Uì ŽRË`Q„1n -BÙ‰ŠÁâ2ˆI ¶Æü%[ETLgÉI¼dx¯Ã\g_G…×A›7½‹µÁs³É@îÜ*êû¨·*Ø %yB6€)0àÆTµt‚š´=6ñ‰_¿PJÀ&!y+{bUÄ mÅR¶¤È儼÷Ÿ[¾–Ù<ë=¦2€k.¶ÎrÄ,)u]EÇ}6,ч858ø°›ùº;:Ö2`)…^úØ;Y5& ­4›mg‘t£’zà\ÿD7Ž¥¯q8ÄÓб.â†0eóâ~ô7‹ÂèÅé„Ueñ ¢3ñ]}Ù»ävëù*ŸÓÊÂÞ9y{ÅûW/týq—âÝõØC9zßE©Úâ‘$$M+؈ÏèlÓ×xoŠ4°¨ÄrÎÁ;Ð=¸¢ "^"&^0Sî)NX·¯ ‘+‡…éÄ¥¨`­/*v®•þŠÀèøOdØáúùþ=~â{òÑŠ…"9ÝwØŸˆ¯ŒÃ@ådC-±ÿ'í+­jVEÔ^·¤ÛÏñ:©JBÕ«É-²šöÙzMòýM?oqµÃ3…Fß?O^ÒEöOÑ ý˜OM7ŸZƒƒíYvßPcjsÍï„É!𔘌(t@Àr†ª¬7RÃÛí¶?ˆ¨Y«Á4ƒ™wO‰(QÑÞ¼%†XÙ-„\a)ï<ô :í…%µFÓïÌ:øª/þá0ÁqkÓ¨a³,üVƒ|ן˜á†´º&‰hé<²9ñ­!mîõ®KëÕ…Å‚=?uq§–Jý沬IãNùð}¼óÒâúú±ßŸ|ú¾¨’ra©ííΓtuÝkqîšßÇÛ0ñW5L‡ؼ¯%$lŠ›wÃNùï—Ö©)³ €Œ:P ñ ŠÒ‘ÈDlj4Èêõ"ûÀ^¼á”^:¯B ¤t°Þ Zaëõ ÐˆF%£!ž‹~s[ S0.Àmj-BËIo2ÊN9ŒI½=÷вµÜÁ‡=X]/Þd×+iû‡¬7õÇÏYêf“ß÷u_šØZIz‚õæge,™éÖ]tÖÛÈc½£L'F’4áïÔ¹4ˆ(¥‡‘µ¼ZŒ*£±°# kMRš TƉh$ ÑG(¥°N§Š0Èv²Ri`'ÔÒ0h_å0˜ºm•<ÉfOem P+#¦u¯Šwéhµ\­Ù±FB•$’€¦4ˆ ¨"[̶×pf:qÍ“äRS² ¼CTn¬æ¢5upH.ÒL°£5@ž<3Žƒ¦Ð¢ánæûwæ.´«š¾ýóDU÷a®ûðøR¬ÀnÔ÷rëO%“O—=yéëK-CΟœ‡¯É©·Ü¹N/£9œªŽ‚ê s¼L þá þP?§©:}™8÷´J5Ü„%aóþcÔ`œÏ²ý©›Â¬ˆAªv&Ë1k;´Ò4äo›"˜úáEúy²Õd}DBÕ¥ø–•tNMJ”=þù5Z’€æßOfx×ÌéõËß-eäíìDjò…PEóü^cW/íf•I©!äŸ'Á¡üº{}}¹ôàMØ¥œóîò¶P|ÉÔ®ò3FuÄ4ƒ`·P,fjBZÈ"Éd,†70ÙP º¨+ë˜[ìb+ˆÊg»è[E}H&ªШb³Äж7 hÅÇN(½‘§Ð R½2ìsYçí¹"ɪG¤-™?Zúš+ öüF½ŒDªÓù¢ô1å—¿cä &ΠT*ñNŸ.[úWƒÄ{ÌÁHØP ,¸¼€šàæ×d×°—¹Q&4¤º|I»(  Õ{¡þ½¸Ó[8?Ò³wþˆ~týÈöƤý¼î¬ì©‹­ðŸ“rîhжNžý%öóüClHÞñŸïœ^ð˜!¯w~ǯîbñe¸¾e"þÕ$oüN·ïø×èÆh7¦ìÁ2I ´c`¦‚410+lŸt¨ÍÖþŠ™7hRl«Søg¹¢þc|ÊPžkD„/êlrŠ|Š%ðt8"°°¢wáx3H–h@å²=€h—þâÎ/˜ZChE:›LZ /yÁ¤".Ð@ˆÉ:ãt`s©J@2‡š**ê…²·–PE÷½ä?.gî¯Aœ©«VaÙÓßá²MÛæ}û®gûªýQiÄWL-Î?ùC„‘àqÔãš1ƒµQˆ&l˜T”ŠmÒ¡ê-pË`{{Õ¶Ô£0E=³žÛ•´!@ú†ÂªÈxÌ%A…(éM’i%.<šy¨™ "g4“g–9œ¼a!‚  ‘Ÿ$&íCv +2+*†‘‡™‚$—ĶÙã¬w®>›IM‘uûrx3%¿‰`l1¦"Œt$þ¶®žuQaG 9“Ÿˆe%´%+êH$B… 0TK¼¿¼š€— & \K_¦:g\¹|>þ˜ôJ½”­*`Þž`@LEI>Ÿè‡ðó0?M$Éœ˜¬)WÖÞ$ñ÷òKÉ‚ ãV‡âwÃ`òÝ6ˆ ¿ ÿÌ_>ê¸ø“¿i· ë|Ó‡lßÉd0ƒÇ¼ã;yihP kðÅ€a?²4â11Bܸœ ñ¢Ê@k“r(£ŸÊl迹*Õá%AêF–ú¸6ˆ rEvL93úcׯ 2Gö2ßç}3ÍDNîªí /å t¸¢«X—žšòÐ\¾ÀiNëD'£JEj··ÐyÊÇ…ûl^HFĽÝcóëØ û3`á 2»™à¼Ò§>”¯•î|“||¿—ÝM·Ä•[-ÞH×׬Åö)Ëí²×>›»ñtº¼É݇®;И³1‹Ž0ÐgÌ Gº®%çbÓÓ¡{EáØ>2Ü<ºiÆv#-Š[Ÿ#­Fª-8„àÀ+ü!0‚öÚòh1Ç0ÒH¨—(¢q3+ai…¾T"h-$èã¤ëÙáH-Ã=Ÿ´n_£ÐªT” 527)A$æŒýÙvó3n¢J‘çd?¬ѵ3DØÒè)RâB¡ð-ámŽä8† áDÚÏßI©6ý÷ŒuÇaNÖañÌ2`€ÔÞ@ÐcD`‘óÕhÂ"šêçÕ~%6ïömñ•óMÿ€£n\{óÁ78:âÂ]Ò_ºHH»Tlµö=îž S ˆ™Æ›4cÁE>Ë ™æêeÐ]12H8Sh‡Ñ+¦hÉîË15§í êóì÷ýçSÁü‚OÓ'ºŸsúØzŸÏ—'¡M3ˆY#/k€â_¶H†àdcŽŠÎ`Jå9;I«“Ûr°‡l#à±ji@k‹}Î¥œ­Oæ_Kù}>à•]p†J&8OÀÙX“˜^ïÝ¥ÖŸ¹Ö‹ý å¨ wŠ¿£ŽV=ÛrÑ+âQA* OÅßf°ƒÌª4C’-Éây¢ †û·Ü„kÔ;y× Axƒ®KúÇMzô:rær…®ß×Ì~Yo Ê[Ì¿GR ŸÆÿv]ð]¸ë›u=‹ pÆŸä'Ø­=|Ïë­®uéÑ^m_wîH$Ùÿ…Ê S¼j¶´gýÿ·Ž_vgAˆ‚ Ð°èº¹ò‰ä"ä|0ÅÆÊ ÃÑ·„gl>³ÖŒT ·ƒ""1ð¤:˜@¸.ò~iÂTfä ³äÀ×°Í˱z—¶Eo0 ­¬tÚF¯ŒþVi<_v„F|¶ŽÚiàȽ/ûb*ãO}4AÁ0O.vÕ|zû-OçÕ;\x¿AELe~‹ÊA§”•7ý®÷|f¤ÐI~Nw^òòÆìÐ×t@¹¢‚ñ˹,ôþªÎ}n/—;Ö•|rl’QÄÔ8?"^Ó„fýI”N'H¶J`‹;rõÈ«ò,„¡’jgŽê"ê´ü´l±'2I’„£DÖ˜¥äa„ÿt%ÉM<`ðd#Uæ1Ì¡%žß‘‘óYo›jÂqkõ“<íþ'ú£ë~ûw†}Õ¿ìn Cpò4E¦œíø/ÁÓgÏnßd'·éÕâlÒÔü}Åä¼Ë3{!7*2ûµ|¶{qߟÓ×™ïüæÓ)÷ýÕ7ïö òøn§åùræûí¯èNÑzd’'|ÍY]îH.ö¼FËñuòsãïÏ:xuìÆzœ[}3ñ¿ŽZ1 n’ ¼—<Áùˆš¿Ó÷{ˬFc®àòˆÑä0«/ÝJµE¼þßÏ íoç|½©À«¡ÇÖBzTy¦«ûdÙ}4°ð-d¾]zæ®-&Kž ?6Qï>’ ¿˜Z¥fLšÒGöT9>æ8U‚sd…QªF¢ŠeeŸbAîÞžÂéò¸:z"é†ÿ>øEhs^Cé%ÁW¸» ±—t+B¼áÊj[ªP°›i¼|µ´÷Øô£Å~;F$?»¥ôÿ¶¥¯2U¨+ëîë7åìÒ¡|±è·«|ªÚÐEjøÃ}Ý14ÿm& ·éó,ø¦óÑT8Ý,ïìú®Ò졃ïoñ`Ö…ç“t¯Æ 7¾Qib\ÆÂE—é±ûCËì`?G£ÛJß• Ã}dhVÁR°o;[ËÄ®Ë Ú¡Î…©z #Jlޤ‘Q Åü°=ÄJ©ÊÀGÀ儾[C¡8=Èa!ˆÇŠtj˜-ìÉy¶,c̾×+  A-=‡Ï—ãF‘ü¨ ƒSº:ü}×Cè¼7õÓ[ŒtÊÿ_$ýá3a:rWÍz 8g“ýFŽžÞÔoV qáâpÈAn9Y>åkyÄ1þ‹ãËz;!ñç¬õõš~¡f]ùeETâÓôò']—1UÃé‡ëœcùßlW‰VHÙ;"ä½E 4ÃÉDš .ÒSà”#E v÷ÞB=MüûF—nkùê?¹ÚõµyEÅÓœ¡PüG²óüm?ü -¸h‡§¾Zp¾Jwõ1gÅfXXW_G7’Àz¾ÿ¦ÈÔŸ£Uéïq6Ñ2ôÒgHªã,$Ø úþ.²ó;‰8ºAý¶õ|;kA oòÀùÎ~i.]o3pväPãî?ÅV/UÚ¢eý6 ^./̬*‰pÛ/Óá¤Aù;Ù‚ðØ©‘ùã™ç¨ÿ(³2ÁzŠÁOŸéøÇÒu¬/Á·qü3— “´5Ã}ÆþxW“{‚>Ž` ´U ¹³÷ÝÜSOËàÒThkô;°æÝTl–„ѧ4ÏûJ Ëì·¡$Çßœï1ï¯ëüRÅBo/Ç*ò§w†¾A´q÷Îhy;ÓLèØˆr9˜U¢€è}&> I4@uŽ.QaŽ·°¼ÆËß Óc eŽ×êÞ–k|¸çópáADw_åaxýE\/Ö5d éæÏh§ßôÑ?À߸ÅÓ«È?óÎÅ(È Ÿ4OÝ©¦lÓÉ0Ô¼ï …I §8w4¬ÌQuŽàu5c¾ºO„Öå® pºž³w¬³Å8DŒ×¡•¡¸i â{îX$“ÐÏ€‚H,(Œƒ¤ ËÒï…N `ƒË`t u±-ˆ«¯8Ìù Ò@O¾v—š¬“/NóMrőƱ £Ž?9J¨Ä3À(⸖Eã‘°ÿ8]”ÐQló "Î@Ú~x÷ÏMxCãM tAü‡Žß²÷*^÷Ùî2—Ô¢ ¾¥ómæ;«Øy5lþ¸cîgt.Ü çôôU>ô'öû(â*Šb6&7·» ìëDœ™K¹@ÌBÒ×jE¨ÖI˜’&Ââg ¹ÏY‚á¨ÍëŽÒò 6kÉt›uÛPëp(qÔ¨A‡&1Q„DB½.êͦµòdÖÃTþUr)šÁB"ïß'¥+öç÷ÁŒËáv9ȇÕO–{C¬UÂ3bÏØ* ný…˜²ÀO11…iå­?÷áíåʲޣ7…ùÔþ<·2lùtd÷¶uèÆˆÆoî5`¶O›ΡnkGìæùUNø×ÆóT&ecÍáä÷ŠÑAL9U)ýÿ;rºï¿ò@Y7tÿ/®æ¿:„Á½¢oµúþ×ÀŒ·'¦Þí7Ë"ge3²¼Žª!9KŠý$¾{KÖëó_¤q&Ö}äµ–.c¼eƒa@J·ýÓ„rŠÂºF>]yž™üû{Ž©ÅúP)¾‘â×ýL1’]°ñµS "KpÅ«~:¨JÕ&ÒŸ7 Єj+ðÒHV×Ú<ÿ‹Òcå¿m³Á„Ìm;óp¯·§37ÄœJžZå†|š›g¶G§ç½¹õùgwlÝ^ –£)ù–E ß…öÓ0½byW·”¶s@£þõÅØƒ5ò15äù¢Ãz1¿Ä„Oäª}¹áQN¯ZnÏŸ×ñ¯Iìøòíü à¾öòðÞJg×’O“›x}^»Òå^R_Ê4¾®²ûLþ@TM2öë fMN7ÜQöLr^sp¼k…w!ÃHdgÞ¹*ÿˆ1è!0Õþ&ð×ÌôÞžQè…¾mêêtŸÅQiL£œyüP K'˜ø<ý37P¼dójs(x$×ÑñÑr¸•âç&>_#C/.¹ÝgþŠÆú[žZ½,òÔ¾\˜D_j!8ROü[búØ’zCïo¾i F•ãNùÄ ÑTaÏö0ý•®~?9Èÿ+÷T)»ÃüoOrò}xûaj]ð2 É/Ãb^\¬¾µ©}þbÂj¿y.EîpǰÄú4ñüÐ/ ÷ºWf„ç5ü·Ê¿¯ãŒÂŒf5® Añ|e[Z´n‘‘ò¶B«"y '0x_Š$)€ƒYG€.² |ÀøÍ™O¿¼É·EtâÉùv¤lÓûäe®N|äô°àP¯\29㑉Ó÷ÁåŽeûµüãi€¤ÏÅ/e{maäµc} 7>ëþ°„è—öιü:F^$É"=_¿ª>µxèÐ5.“¾ŒÕýçPû~¾æ=¡Ñ&ÏàM|zii‹|ßÉeÒ.ò$ /ö_5 ¼‚BÝÅö×öªGÐ<ìC°BKïˆÐµb¹È‘ƒ8c]O²e¿œ§±{í}r¹úèxÛèSžQZ²¾Ç?³Ïö÷a´«ýh2Þ ¡1â Æ(3l oŸ¨ÖœÜ’ž›kÇ÷wRð^rÀ„ÐI*æ$Ìä ~ÆCÌS V(¥wFæû ­ÎCÒv…`G È/`%ùŒãÊÑO€k­Ôs)`j!ƒî69ÐBÌ"ÞpÑWuíwÆÉ=”™$§<*»E³á PÃ5£M¹nwõ:2RËjŠA™ú𦪦ö®'­ŠŒÈÒݸmÓG(XDad–³Ú ײÉÃ+ãîîÎ ö«##ÍWûSZ=þʼ0&ÆòÙÊ:ÿ ô>ˆ$ѧ\²ò8üôwröÃKÉ[fsqÇ66&å~w@ Ý% `×klž\€Dþüåàé5ƒ2£ë—ö}ù›ÖoaňIþ¿5yüç䓟•>Mü^ß™&No?€~üÈ.‰P™à÷ 4JÙxÛ•tD'&z„$ŒÐ’ Ì‘ Ã̲‡DH(.(e CEÒÛŽž-Ì ,ËÀ›EƒÉA4q’r¬Ÿ0¥² §ã¦> ’ 3_‚2¤UÑóɱ¤Œ¶¸†DB°¨þò튶,À‹( Ô<¾SŒÜ‘pÀ¯½@œˆ ¤‚/Ô˜±9©®t¥NÓ=à īê@§¡‘nˆ>l'4qÂ…ZWEªö¯i€;6—d«ˆ€z3Yã0 IY`\mÑxb+m¾Eé›×»¬P5î>Lì0Ã&·ªÜÀ(q ˆhqf¹úA÷À}ˈ 2ç@ép˜S€O¢9B×ÀŒçàiB0ÇÀ8ü¢Að²ÊܸÌÐR3Ý”E\Ä øÔ‡Œs”ÄÆ°Ë&+@\a†BË@øÄUûE,aÈqš2·ù<í7Æî8¦œ±DZ‡`™Iž.-äX’ \¢ nÅŠž‚ 78Ø`¥ýúÉóÒ®˜òº9md Ë(ݺk[˜Ê ø_åq&ßÒù¡%uëØV­í*B˜ð¶ÙWä.Ôª™ÜIQ\D4P¸ÙŽ'-,ÊoFÁÌà!l­e©ÂjCÙR2¥ŠÛpÔöÔè„a¼ºçêeÊßNŽˆrëÛï&s3?"r­‹‹äuóêç3 ¿Åù“­ƒå­Ç· iõÖ^eýÎ]SÐ??ñ¤@²(¶V.Bî0¶ðoÎиIh£R‰Óp³„•rA¶PBÎ2#à ŠqØÉÀq‚IÁ­æšPàQ cÈ$;–6oл÷_aW!±iLÒ_vƒÅ‘8D@ÚÝ ²¿²ƒÿç…ŠÎpPpÞú¤E1/w >TÔ¹$5¶,åH1§Á/ZÙì¦Þ¬ÄU³ß-¢LTäUÌ é|’ŠŸKÉÆ| –=ûÞ3Èvµ»Kïý¦þ,Á/|ºû`ªØM_¢ä ›ö–ùÜI¥¿Xbi`²c1-ñä&£… ""7”-¢IÖÔC1ÃqmÏ )“R”š[œø¿d Ü²¶Yyú¿æ¾t|¢;§çõËöTxF?õ+ªËˆ¹ï£= žyTÊ&˜®7SØ¢÷WWú –Dãör ¯nJ¬`öÍ[û³ÐÁä÷³ØJéijé‘£ß#aŠ/ý¼ÈNÐÀðj^ŒxL û8³û=!p›Ÿ¥¢9¬•Í-ü‰íî]é¿_CùˆdVw-÷FtçÜñŠŠik qï2Ô°ˆ:FI "°Õrj´dØB‚E=1–“w]zâ~]<úóå*':e⮉Üv_¥ ¬ rÁ…Ó‘Ê*?䇜©16#÷i=?¼Ônñö¤ê¿µ~,ÀçîGÛÞðè¥E6²³¼tš”èiÈÇ@#à)Àa”ap 0’0|IIc;>qÁüvú{æy.léÞ&Ý‹ç%F¼þÿç~ üÒ(„Þ± XtDTÆB1ÒÀl>.áFIF<Õß)ë"ÑÈñWBã»tŸ„ÖÞÒHiŽÎR°ø(îhó *¢¡“µòÈÞƒ|ÇÕqug<VpæÆøåjíH¾g®eD0ˆm56—Zª++G ¢î'S#à}#Y: a%¾ëÌ|ŽO¹â+EÐwªxtuò@W/«²wãhþ_«ëûÓ'Ö¢ˆ‚ ½ˆ uu->Õˆ )a&¦“¶¤­ÄØ/¦;Ï´1“Š,æ>ì¨ +°n]9qo:Q¥¹´9š=tÐL" âΰ2wŠYH8Y€¾¥°„)¿¾É«cT†.H†ðiŒÐ…n;µŽË [L.$¤v{™ûú¿½˜µ‡ Õ9gå5‹4l­Žï°ôúóÞU8úa ™-Ä0TÊ%Ü>\ìçYQ†ÂÅPw¦Y¨–’‹ä’ñC´ˆÏ@I&»UY3—ËÞ©²¸ÌÕ‚ÃãìÖ’2„½kô?©Uà§°÷Î’žŽreˆâ!¥»PD ´%ÅâxÃÀ¤†+þ–Ä´ú[±§®¼‚5\®‰äD @Ÿöæãcðä½YÇÙíמg g{‰É-¾ß2ê²ÜLººÇ©|·0¶¿‡çíGX›yEÛîy D_¸º1”Å!ýï¬ØF¶=ÍÛ™ýÉá'E7 õ§;ETÀzÞÿÌMlñ÷˜W5¾DåŠõʤ¥î)K–‡'5ôî‡ñ™ÅYO§Û—ȼGåî— sш½i’lŽýBç÷SûlÃ<’ž[w?)^Ûs!“É—#óåû-áz§ìó‰ö;ž7-Çù«×ñcÁ+ܺž Ï˜¾i Á—ŸæYCùÅrW)]à“Ùu‘‚rôG"YEÞšV¬ûþ/Ȇº"ñY€ ´àÖ’¥×Àv²(E0UuÚ®ä°æ¿-ƒ¤b­?꣱oztCeííß&†jõÿ5“DÎBs§î“F-ºãÒŒ‰›îp~ðP¥»Y T,ºÃTzxª0“HÃ-:íÅ^, =uIGo}ã>Xç}…&…ØRðÚ•_$±o-¤ c0Z°¬NãªQóQ€™×,bŠ-3‡@¨Ð3¬hIyVm€ù-yɈ'pr¸bÊ«Qˆ[ˆu³¾ý*ôŽ1a–—1I—LéqŒ3øf'ÝåörÀŒ¡êJçû^EÛ/9ãß66'/è¸}³wŠ‚vä_Ot_Ÿ¿¶ûSû—_ó‘tWzçËÈ3Xo“õ—÷]q±)°&ð|M³€Ï߯H[5h ½©— /òM„ãDüÚï}³æÉ¹½Î¡2D6÷ƒih”kˆÛjyQÍEÇ®¾ÃS„±\Ž'UÏw[8ãQåé”8¢òê½eåΡÙö 9åçÔZKút®‰Ãá)iD±{îë }ÌâñÛÐh³éNÚˆ foÑM] rñ†ïÜâä¯5;¥ÿÒÜž -¬É ÙI±,Å`ÉóËg"^åWÒûúûS($Ø%±ý£.çCc³”N`WmE²¾eÆ@Ëf –OAëòæiÍ iVx¿˜™òÕ²e¢7NnþqÊ 1‰H5ÜÀ¤Ïø§ozÂe¬CgÖ>dÓ­° 4Ÿb¹ä6{²šü_ë@±^DÀ{vý !—m¼C]€ë †›I {ŒˆHï¹8ÁÒDÄêQÀ–@.„ÁàJnyž}üÕÎ0b*?Wi5%ʃ?dº%Õwê G£¢vâŠñ—ÇÝçCÙ„}h6º#›?g,¯¼vXù~,³óg3“šëÎOA}”Ô _ ý¼ÄùÚ B§ý?DR~DTˆ_Ÿyf°CÆÙ»ÎÞž<…/À¿Kªíl週2e¨· >—êy:~€S“R‰ 4 8 ®¼ g.CÓBHYÛlJâ„1ˆÛm»B ~ÇØ0fΞ±×Š~aÿÞç¦þŽÐWTNüË¿Ez‚ TĬ«ž‘äá‘QçÏÝQµ'“Ú8"ºyåÀöíÇ6e‹)G;8¤üó­Èóó5|âðßÉÔ”«åA)!ëîþH蔃ÙkäúÒ«LçÊdµß$·¦Î„s¶{õæTd¢Mù>Ùíó{Wòá`Ûn¯ø¸ƒÝÇãùïÑ­ýqHWíêè%èäÏÍŽã ÏÜðrÍQæñENÍcÏíšÚžÃwe{ëê{Ï– ^þ üPtú¤Â”­ø¼¬b‚Çgís¢l„"?ïy¨e(™Î¡ä pÇ2wzCH¢•.§/«Õ1*65!Jˆ+Wu]²ª üŒ2ý¨ÿËÝxÂsx—R Ä?¦ ”©Ê-{nÏrVó§"㜿ø± þ´É`“sç±OÙÖÊÊ%Ü•ýóý²ÓØ$ÒqtwüŒ5žY…¥:û›2'§ã7ã“;{{'L?ës?Û¬Äò?§Öî—‚vUÈ ¸Š> *Óu@Ùncç‹ ^k¯éiëO®_Â/÷3ž7B…‹#úu/¶<ÈܼvµÌ¹@?nœöGŒXþYqKªPÛW|'xy'f¼Çû/ÔŸÛˆ¤NS²°£÷äVÛÖãšLŽêgKÈù¤YàŸ¶²Årâd”猽'ÌA%Åæo(ÚøRpûüù”ÿ‹ôòtjAº·ac¬Α·í—ÞmWÐù{D³uø›ü]¹µYšÖ<åÖR=º}qjâÒ­f„çû)v‡HAÞ¹ƒ´/€ä@’|þ°¨½'s‰8ÏW 7Kg·àòûܵ@:G}êQKñ_*yæªÐ½a^Ë}ô‘¹ò­>DõX Õ¤¥­]åéáßjš±MvB"/”îê9ã{A…b³ú¿°¬ÜîªUh ñ{rü«Ïàzqš‡Ô€F{ñ Íôœü–Ø‚ëÏâry°º‰uíïÊ0.Ðóì‘|L³ü™)ž Ÿá½ƒ—w{MÆkå#rÐU-ëÌ®6Ä›]öÕð‡›´`ç{Buì’Lÿ¬,®Úå„ Üµ†‰óƒFó%ž½I¾4å7 ¿n\þgå ‡ò4W ‚ÍÇ¿0K‘ñwø ˜åûŽw¾o?ùh]½²±EÅ{£ŒÀUÖ¼yÈ]‡e©u‘¿Ò¥å^¨õuÕÉ­9ûßÐÖ¶áÝÔ’?äñG_?ozc¥ù} R ý-Ü}Lï‘’|»jNÞä¤)ü¼Tù+Ï7ÊœqØœþ£ ¿G@)T˜¡±xX }øRïo[އIØÿ1·Âã¡€Š@ý†Pn VýÙNÑ¿Íÿyt€ÍÄÖVñ•5MÓØÃ;þŒòã•ÎkÌ»ô£$œh–…@[öŸñT¿Üùejfm7§¨¿j@^ÚÇ+ó/ì¼°Ýh+ÁöòóÑYþ~GWdŠ^4ÔÝM´÷¶ŸçÑ:ßGž”û›ä»z~8eýí×·’þŽÒdÚEQ×uS€ˆØ“¯(\ç1 ã®qN^Ü8½àŠòùnù­ôü·Ü"A¾oAÛèdtðó—ÊP‘^asÙOÿcŒM°ïÃGíÐ3goÌxêþÊEٗȆ åÈËcñ‚ÏPy•l¬§å5O±Ø$©à׫¯N>µíiT„8†0R U9ü[lBz]+Üú¼HÁªÏ„Æ ;K6x@¢ÕÔ*T\+Ü(uÓ$اXümµ#ð„9ä1ðÞá’Œ]2w(3_ŠNçÛà‰Kð*_ü‘ ˆs…òðîôö ùt6ÄYªL·ÀÅp&Ý `EÕüðq°ý¾žöÞ©™þïŽ3ßÏN¤×)»Z–²gE¹†J…fFÑ%ÚÊÔI3o¤õx‚UÖG‘îáÞŽú2µÅƒß5ä—,Òû3¢ºŒÎýþvr&¾^BTȾSK8§ >æÈªyùÿ±÷m¼Åöó²=¹ŠUg»èš•Vkê.›u¯”¼¿®V»¦µ˜9ëÉ$kÓjŒ=4û<¤S»4 ˃hÁ³ñÁŠUóìœùýVVþ9ìßç0êlÄ9_´å9½/‘´¥ÎØù¨<#oØ¡b`BsÔ궸NvSv[PJÕg¨â_+R9ókRÈŠ* .Ò«»r}»¡+;ƒÿ+–7œ-D~ ùÜ+|½þ÷yr0wþ: ‹šrúvÏd'éë°yö6éfªð³x %õï­—›ÐØy Ê À²°“KmTKw‰n@s±l‘Ôù–ßæïñ¢êŒ½ìÌ€¢RàÜõòn3öX“ÿ€;ÏáiC²ÕEŽwÏ"EïР9Ÿ=Á¡z¾ø.èŠÏüêz×>\ÉaR‘.@K3HÌ7×€n{Ç ö°‰’â®b8 §uºÄíšmnh^MÒçù@gO—¬—³ëx$ŸŽrO…Û;¼%€ý>.3\˜eù$J³ͬ@ñÖ*óÕç.¦ùdH,mø|/Á¹·5nWîåd_µéÒbè»…eÇa%PrÈL-ñÄ4…½?ò}È‹uaµ¯oœJFƒ™°±[þøµ50z '%ºêi¿©ŽOm§u>^ääåavË”Ot¬(áߥ«19+…ßmŽÌ­(Ðn'È¢×\H¨ŸnÅ™šgöˆÿ›÷Ùëœ=ñ‰ÿ³âÿ_ÏL´¼XûÊtþ±B¸±8úÂeÒq‘ ÇìÙ+f!¥Šøoªy‰ä{3ÝDœ¨âå_,ÅêúT 'î©a”J¾¾PJ?/Ÿïæµo‹P îo¼¸ü¹&ü~–Í÷餢3ÜËòKÑïDPá^]ÑNÏ”ž]±öÀòZW3pz:P¼´¨ Á¼ÿSÒ /³¾ô#ruö¾ÄÙ¿oç /`zÉ0ã+×ތȡ…â)M^?[«h½Å—©.àü¹~…J¿Iö€²)û"ÃO[Óë&ÐZ7fýÓGF¸U,ø{$ö3"?ã2pþn`ÏŸÀÑ–Þ<$ôª>·ÎÆ{'ù¦mÝ· ½ÆëW„þ~†Ææ}rK_¯/»Ó¶‘že/3Üp›ËÁ.nA‡eJf7ÐýNšF)'÷÷=6GQ Ï[ 9.h…ä‹ù!ö¹£Ôö!D± ßæï«O»åÃý}xJìÅMûmlzØx3:ÀŠÌ Ôþ<Íà™ÍLÒ,ÿÓéëÈ[›×: ,Héô:¬™æY9‰ònOMV¨Ç3í÷Í’ #Ê çP­@+¶ ‘4ÙQ¡ýÓ þêìLSšò#<¯©!I‚4¦»&°% @×ÑÄ,³'8þù] ¸ƒÉ|ÃÜŽætyH¡—á¤zeÿ‘Ì´—rÔ2ª1Ý=?/Nj9¨ÝTÑ‹ž š'‡¤X¾G {õ«pj¨†Ÿ¸þ¬–»ÂâÅÈŸçwÒ±Ùò£d<Ön´Bb·R¨85¤‰’Xœc „óÔÀ TKˆãºHW)ÇÇ*R{W IY(Qrèé,hœYAšŠŒ"sˆ]dÆŽ· m†·þ¿¯¤>PBdþå)£û€ùm “ïËdñv£Õú„¾í”›çÏQç ¿ÊFlÄ÷z‹ÀѰe”†p‰õ©Êß#Ñyù a¶ÕPÒ'm[ ¼ÆÄ¯(ƒƒ©d2Λ\{ãÙÖm %y“Ö,ƒîwÛØØ ªaõy^ËF­Å&2…ƒ°qÄ i”bûD…°¯'1¡.¹‹Ù3J`…'0IÃ>é'Óä]ÒÆ·O}À©nS$zó8%²e¡ð}/™6,ï¤bàåŒK`ç2•g `Ä?Ð/ñÿ× ê¿aŠÐýG‰8!'òˆi€U¡O÷‰p—,Ô;ÔÙßzCÈ‚#ùóÎx¾ ñÙ`ÏîãÕp&?&Z{¼{º ,~$1 IM\mnVM¡Z1‰RS ò-,mÙb±äiÝD5g­Œ¿Æ°É¥ýÓȾ#3übþ<ò/j#-Zl'óË·<}¯>Œ—•ÔȚȂL/wí|¹JžÐòq‚5_íÀ¿ƒE¥Û([‘ ›ƒi›P!oÅÎkîn‚‡nÀLQ­ûjR¹"éíY»»†ýCòËÈ3p&«ØV|®w¤Ò<ñ?„}$m“öKì·ÓŸ›UR4‡ã r ù¿–ÐåÅ c’ÊD $$ê)’ÄThËtcMvþ+“Fļ $\((¡Ë1@¢È ¼:Ä»2&€¤É.ÔZsJRIòot™.µp] Š"¬þ-ìÑt†Ü²òÓLü"__uÝ×Pa•Hp d^&ÝðhD ‰¬¼vS°Š/œÑÒ£wä·Aü!óîÑNŸ5LÎðÿ¹+Ç_e¥È}tŽPZ¡Óö‘ò‚)öís°­ßâsÞ=Óõ½>îþÍ*?™2fFb9êï¿—‹ÝB`},È÷¾`9º”™ƒÏϱ1ÿ ©˜-½&p©¾H³88è¾4ÍBWã% ÓãL¶re+8mЪèP$Ž£ ¿:9”ûmŠYÜΰÄí 1¯p_¤¢¯n{Ow ¿ „ïkÓÍ‚:OcÊ‹v_‘ÊâÂýÏÑ%ø”Y>¾ÂÔ;ÓèôþL}³t°:¯GÇ1¦å×oOâäN¨…â€ÜÀ¹iª ÃÉšŸÈ »Pý­óTƒ¯^¦/qkvúöžj§¡¸xªš°jMìæÐ`ž‘P}>ù¿Ù¿=¨o˺ûxÙ?û1Olƒmª~|ïåî(¶|\î©xxðg–—wÔÛ;uœí)ž.ÆOjm@]®–Ÿ“ójš-cifÙZ€üUÍgÕÏÜ™˜B„RrµðFÀÝNà³ÕtìÞ»hÍïÓ\é#ZUúñ 7b‘³cv¶Ÿƒ’Ãí³EÜksd|3š6xzn]¢ëœúûüåª7· $][s£33 "g>ÄRåî×b „{-†ï:›RV?:/õ 3ÃUÿeqÜkëK —RÑÓL49ú ñB1“²6lG lÂTµïõÇôÿ•WF©\Ïþ±ÛÛVÛÓt!€?Úå%tJ3ËÄŸ®ä%Ø®r &E*@7£ýêdÊÓ-ÿ¡Ø-Ò¯èÄSÖT•¿˜E‡µj3D“´œjdÞïîSÞjúÿ!ã®løa?-oðþ÷ ¾ùAñò¿æ6ï 5Ë”^ ‘#üÅîÌd,W?×Zt¿ÙBµ „¿x¢P1£M¿5>SÜ`&½BG¸ßå%NѾ®×ÝåʲMY›ë.¨:ÿwãöìµ×¤–«¨eüi®1²[¹òì]¡ªÚ—\“¯í&'² x<çĽaúÎkFWÅÆeüªÄmyí·lTÝóÝùñÐôdýÖ›…G¦{TK:á1ßL¸®$ŽcOQ&¬{Œò›8*( µ"(S­ŠÿÒLd¼DUžË"ÂŒºˆD¹ ŸÙ°w>o‡ZÓ@o@H>^Ó^h×%Lúh'ˆ„ýèbœô4©u³ô¶Äþ!¹ð·'€}¾ßhÎkÿÍ)üž9•pÝeøo,æÀûtœ úÍxÖ’¼_¥¶e8mÑ)&kÇñAl‘ÝÙH’»¯²ñª@׃fé%” € ‰¬+1‚J/ÒÖÅ%u¤Òac˜3WÍaÓCAWÏRЦJT/«xìé¤,uFIÓ† Aɶ‚#“V3+ð–Á`ñ8q®ººÐe,¥¦‘ÐØZH„+Ï­ ÁB1ϽŒ 8II㜘Á…, ãÕ;$Â8DÏ#Àˆ0•IS*ÈH~à`†ÉÔŽðª=õÑš^q’ ¥ÏœðEjˆ%*uŒ ±Ä·+‘0Wßà°ÎQ• )jEÆoÒÂç8m íÉÇÿ¼Œwá1²¡=Ví˜K±mä^nfc”Òß!¾çK@¢eKð]µ€ äÀÎ]¾Iï{Ð`"ì¢J“™ømTPB:I¤ÆdÅ ”‹8„_En…$¨©ÏnŘfxFi¼õo´7‘7öT4ǰK¹sjhTj­\’.”Çs0d~ó5= >TÛ­½nÜvƒ"Íæ:Ôª ¢%^„z‰<5‰'0$œIPŠ'’“â¡…»L"µ7D¨ŒS¤ˆÈ˜éºŠí*B"ÞšeHr—DI´Í¢§µªËTP蘒¨ê9r`¢`¦§ÜM3ƒˆžu£ôhIÁ’¾‚춦[ê®ûÏØ *7 t„Poß ƒøp•Ù-—Bž¦Ñ†Åâýuùôå?}~â ZÒxë›_](ÝÞ¾ùË:í– Ô¿¾ývîv•z–Y%w›E;W!à[{å¤áu€ñ¬.<äVžÌ{Á J4:•Æßæye3ð󑎬P‡;õ~ÅØ¾È™9ÿ‡¨~¤æxW§¸]~í•äy@^ò=mfv'êõG2àd­Ç<ýÕ?çŸl¾¼I°Zýqä•R3|³ñž„ }IÞ%6›¶ØA³§¾*´Ñ™V$ûtý L­u,¬7+TéL8!ßš ÜrrH°)ÎX£Rð¡õYB08¨;U`ÊeLÇFX hÓdZ75L æÊ¡I‹O`œoûj≶ý9÷b>F¦øgy?ŸÙG$»r}íéÐW YöIK_ÝÈtìC%@È9 ­ù\¹ñ—ì$¾ö£QWõåúrK±º ›PS‡Íû¢€aÃÏF"ŠÒfH 2ý;}n„„Нí¦í#$M‚0ضĜöÙd‡0$DV…†2“†1§O0Ñ ‘ŽH}Íþí‰Ôþå´3[yäFó·wÊÅöò_ÜOYõv _^ü•š»ºØÈÌB£ÂK^€3?•Нo-È[Äþ+ç¿•˜JÿEm_âÕt>Xé6Ü,úî,òͶ©¬d9y|’a`ÀÅV–m‡IÉïáI@,tÃ=dïÆ[X¹ãËø®ÍXt•þk6ó^«/Ú*þ¢z|1€Ÿßdz tÀÖKØÄ·’ž«JHl ´o°v@“P²‚ä¶Ÿ9&.CeT‘Ì$šC¸@L’Â;8 ;ÐhÄÑQŸžrüF< AtFÔöÖrù‡˜°‰¡<úr¿®Åni×óÛiqןpšïX$˜k©Yõ‡ü^Uþ2í$¬;Ëo=÷m§A{–>ZÏk ù‡øD1”¨„2ü½y—* û¯õòÙøñæÄqûöòåîNI/.R½†°Â‡ùü"M~µ:¼ëô<5–•ÚJªyl0÷ ¢*ï¢r »}Yà2•¡11 qû;ËVB­aqIáá ÑXC Æ[†0Ô@,%dˆ8Ê/Ýx3”ÃI[TõèÖ_Û÷­ ҳʟۥ=wnzšŸz}:<ßÙ„ß«¬ñ´@“¤ûd gàT-^±…òQB¬[­¶ßdcY„˜^äú[°âY:aÓ÷Z„JÜÊËeHøRÀg°‹>ö—óŽtÅØÐd!JQ½>EFÓÌñþì{­¨ iFbòC-ð–l÷°.ûO¨tO¥êmÃõ1Miâ'“S«÷ÞÒ¨¹› ¬~zþrïüÁ@fOäÙyh~c»ôêŒ+ÄùD>³òfž>KÂø"ܸ z==:ãË1çŸ9δ˜Ñ&ËÈß•c剸kÒ`ñíñuñµž¸i»çýDìÅêælÉÂ׬ýÜR›Tç7Håa¤9]ý×O_ÛÑ€¦Ë»‹M#jU¡$O(ÊÐél6Bq•(U”‹Lq”_S׿PlNÞ~Ì™6×ã5»ÝMR+sÓ=š|¶!®µÿæå3ž1cIÕl$ЦP0„÷ÖÇ#cHwO «’®ö ^ò͘¡qvDúÓLý}ñF)¦„tòøNä÷œ6ZÀã:Ø“yd¯6j„Í®d“¹ ½ ]H œ/¢i£ØÙU]i7-+ v e´ràÒŸʼÁÖü ?ÙVí1Ó Ì¡‰j.> ˆïéгÍWÒéüö š,+çÓÆ'—„¼TRÃíÓURJ¶½ã2þ¡ÈíùT Xþ‹qO¯y‡ç$ô£2õ¾q宯ŽóûEðÝ0NˆÐyü‡ ûN'÷_h#^QftÊ ¤¤«{Ncôw½uýbâ|„ð^Ó᪀ªx¿TãcBÌ ªuÀÝ+ÓÅ8‘‚]£ožl€+e-âpò¿¯0¬Eçô0‡@€òCÓzZá÷RÏ1Ø•%Dÿ¢¤K»íþkùmê±ç»£ûÙ¬rS4Ï/ÉÛ¾3Ì79ükÁ¾öqG·1yü¬¤ç¸¯‚¼°šöˆ%‘tù~Ê]ÎŽ$>4«J}‡ù)>‚š áÁnø»Ý}¥/$°‹æo@2ˆØ>†· Ÿòeã4¸ãü]·¼Pmóû…÷S^Iœ“£E¡ MÛ}-VÁù˜›pè³ü’œjèeFá´ŸÓUÓ#åõJ¼´_ܼ­TVBÊùÍËp¿Ü‘7Èý¸^Û@t3pÜåøNd|zàC0m |¨"àÞ#+Œì¦0â©,Úv£R ”>ÖN[#DF$ »Ò£¥ =Þ‘0<¾ÊþCŸ?Ä]öõíôÝ…ލïŸÜ›CX˜«U$ç)œÙ`2ó$»Ad:É á„¶ØLTðŒ²B©0hq²ižÐüþì¢Îs¶×_œ‚€|QdüAùHUd¿tMîw0YÃó6« )ÓÅþ TÖXþ^g’tâ[ñk×~³Ç=¡NÁË„þÉMÖúå·é{¾W–B™Ã6 Af­7^h‡×úŸå¨ž¡¯Š[‚¶ïè:iêxâÕ$øØ)úI!˜@ÌHWÔei†µéN‹Šd…[ Uh`éÏ¡³ж›ªÉć)qPp¯"Pö”jrZEiÍ -2„°¤I:¤Š$ÿ^›lÿ©ùçö¢&´Œ¸s6¼zýƒì}:òתà8#¦ùSt‹œ~(Ø9s,S6Põ_ê¢+î¾Óefzž´ÂëÇÍh̃¶Ï7Úõõóiùrè2Õ´v]¢Îs,™`k«æI»v›,~Ûuf3æNn¿+Ö‘*ö6C®Ë LÙc9ÚÆ‹?có§Õ‹?y1kÌ`ÔÜ‘ò|–k´õj'@m›w,[Tß3}ü|³e>'2¦(È8ƒ¥|ˆ 3pú]M?¨Èß%íðxõƒõ éúØÏ•Ö¿N|±»!?úÙ.rpF#šýJE$80w¬;†9ÿa#ì¾a¯ü߀2ÁUúâ(ø„}|öù¢ðEÔû‰þ(>-^~I%~ÞÖ¶³?·ìÝS,H|øŒ«ïÊžõÑñì(‹%)Y}€ÊJt¥q±ØG ÑÝ%cˆ£¤°VÀÎ1h!¬%Å>òXÉá>˜ŒÄåÁ„…0H)öÃ…ˆf i( c’¦ØkÜ ‚È+Ý8 éý”´ðc½3«EŸðy¥xÏUÑðÔŸ!>?˜z1;Ú ’k¹¼±ÇÀ_¤¸‰%ïzS'û•êÃ#~‚ ·hò¼#ï¼=rûP\þ¼•Ò}àÿíCÓ2ŸAD=R¨¿ÚƒŸñÐò÷jâ‹7ý7Ú%­½FQÞ«zJôË÷þ?¼XCÐ]ú>²{{éEmè ÷q^[#ÿ(Þ£ëëþßÓÕõóêàø±ÌIµ:Ø¢ÀE”âlº‰SsWgíðìÜ¡¥ê™\¨”¼S2"êlÞºY`°Åë®!o&l˜=ø$áæO´ ¡{ƒ_œ–O’–Æù½à=æÄ(†e2lʆQa ³ÁbW} µç‰â/»àÕÄB1yù#Ї¥6å9‚üNEd°³~‡îM|¿°OÍå>O×'í• ŠržÁÞ¹ B4¿Ê/ÿC%%~Â+*8Ÿ›_™Êƒé1ªöS´…pþÉcH?ôýŠÁ¿po÷%žŽHl0A ̺múY#܈\ `¥pPC´¼,ù2g÷]0?&‘›ÓiçùB¨Ý±òUU@¿Ç'c£àŽy#¶¦³Ð¸oeÏXƒýÃß?Q[ö¥ý³G,I þ瞃2 —È5˜æ¾Pê?̼SϤyXð§ö¿RíB›?Ë®ºÀA 8ûfÈÏÃñÅ,¨ ®œáx:?µõ÷ÎÅ!óˆ9'š× ; 7²×Ê?¯ö/×Y0†òj(m„ˆŒ‚ý3éSãŒÂ8âßT¸K~G‚òÁ¤T„7ÈÙ†´ìÃ’IÏP@Ñm½‘;Jb*lNÁŠ÷q~aкõè?e¦?ˆE~„¶ˆ'8ò^ç ð-™|ýKÉ“ ÝŸ I—ÊÒ/>²ÃGò~F1‰ƒåPÿdû~°ËZ؃eg7ÿé‹ ‡™¿q4eÿAüiM”ã/€üw ЇJ¸;™<Ûôs“¯ï¤ i•¤údlÈ*·_0A¥ ŸÅ]Ý‚%¦CMb_hß÷>KC\#‰&ìq ?btç “ö&=ü¬te`.²ø Ó?Ýøo¶3ŸÏ22Ó.ŽŠÛRV÷¸B´£Ò3qåh¤{Ïʃ C!ƒqeð;~§‰X¨ˆºÓ$eïË÷òÿ?íä7Tl溆rË[«Ûæâ™¦Îõ÷y7C£ª\èfxz¨ÆON»Ó8ãã.vš…s(F©ç"æEÓa c¼W·ÜQ$_³.Q˰;š^EÃVB”[˜ˆÊ:m –>΀[›’¥” :XØ.5:¿N~­Ø­˜KÏ_Sø.Cè\Ï* “  oHüÄo{7—=¶h%ò%NÞòöó‰J%ki¿·$¾D2.ê:”QV™(þûO<‚Sí(´aX¾VQ‹ÏE-¼/*£=†"ðM8Ôl ö¯Ö±}7ut°@™>#«fF±ÒÏNHqÅcú"-iÆMh Ì_öÚ<…9#@úl÷Êb$šŒžÏ¿ðuÒ=Ÿño¨J¤“”iëùÞÇtkz48¸zµ´ÊÖ)ûvû‰oÌG‚ó†ylIüê̤mRÅcöh^ØélHK~|ÙZI ­VwMÛ™{äÎTÇ·ž©üC}ÃÒ¤Nk_ßT…¶¼5£±5oª³¼ŸÃD8ú¤ÑÊöb:sgdn«žqHóà½þ[þ˜¢ÏNž½¹,·øÏD(¸á;ÜÖ°Q·‘¦§ãøhæêŒÆVËð—™ûºÕ6Ä6½@èÂ>ëª\]éW)ü¹:T‰¡Ïö9áGÆãMÛ«³A‚͉ý]gÊdËrhYçð€Ž!"©ú¨FÞ£Ù•‡’ ™Ã»838fÄõ\%ŠCiû˜ÑÈÆŒøÒ`òg㧸8ïÑžüÓ>?>ûo¹=ùcPTîüˆU»ëüª!ËŽNŠóßÓQº˜ÿÒ…üNíŒçwµ#Gó%„-kd8 (=ÁôÔðèNs2~õÆ $ óN¸ ¼Y1¼‹DOySð_L4BpŠåC)ŠAio–=á¤ÁŒ ǯóW"kD”£óçïù}ÞqPÁ=]h@»ý푺„Í^Š×¶ôÞ_á{ÚÚ'ÏÔ(ãx,KîÊ®¬[EŒÏ³¢Ì6\­êd$¸ÓîIç´Ï­ZÚªssÊ@ÿÓ:Ëu7qðm³ÀÊY¶»bY&éÁ.²Õ±7éxœÓŽˆØY,ÉFúÏX\=÷ßÈn=×ÏšñŸ¦øèµgÝæk'4rÂîÅèeË a%! ¼…×5v;T¤®¸"Bm˜ê„ßã¯(ÈËÊsò?ð÷l¿G*u­øf† ["œ×/{ö8‡Ï´âcÐb”VÞ w(rK¾«QšŽ_<„¶;Ή5È9¥¦€¹aköj_¦?nۥ₞ÎýXN]fÏÌç!}ù/}Þ|öåõ"?ÆÂ>¾Ïì™d&‹ ;æÛTâgvéëozÏëèßÏ~<½=|4$Ä ìq¸¸M^Wø¾Š§òê ch$>`[Íιޞ*Qá«_;Û’:j…%+¯ ;þ„…H]3ïáõâ¹Ì9ä$ØP‚0 >·ðè¢%ñçFi¢j3ÿT´—à­‘T ÀoJW‹mÔ†ñ'ÊVz¥’þ´D¾´…]ÖK–‡›KXë5>úÂÝU–´/‘cïÎ3ýuBÜ®¯ðí åŸdxˆM÷ó™ -¹œIÍK–vëÛô·˜ Tp´ymñ÷"]Œ±‹#ê E¾k÷±y!±êªvš`83ïÖ'G2ì4ó9¶Š]avq T›«ñðüœàòQæ9[ñÃÍg§ ¥Ë)9  n¼ƒxÿ7®ð)”}Eó8ÇP3øûÃîêæ(?Ñ$ô–¬ÿ@v"0VªöXÜhŸ*¥I™×¢Ød§³DÚ}äåýkŠcÓõho¤ý KñbM9ébÜj¨V_É­¡/YµMÙ1ýR¯~*‚Š>ø|~7Λù°­qkÈŸë¤_“ð Pôü‡-Þ>NÓá^ºÃDËa o|ÝŸîeºm¶5ÇêN÷t€,¢Ò /Ô&ê~¹¯0j(E‚Féû_2\ÿXGúè¬KÐîEEÝ0ý¤„ 'ç XªŸKo‰ÆÚî×s%Ï·¼èé‘ àÉH1¹wþB—Û_ª9/ñÖsÓ¯…0P»öNì”dmÆZöÝÁò>QRñc×ú^¥ß·Q ehX4L"¤#8cÍ(q. ™žœÓû¿¦¯æ©é ÇõómléÞ(ÏÅò S—Œ|Îfc¶°%dÍáíyLQ¿UI@W?ãi¤‚Ç1!DF]QßOÁ\µë±‰Ùvà)ËðvF]·# šÒee6ùcFæ (ózM!¼‘ûh# à ?˜i÷Îß}} 3ÉZ+üÈ\zûý»"êbÆâ²—¡fޏáÌN±ÜO$ú…*е„z*]X€½iao÷ ôk2 ÎqM|Vˆv•þŒQßE!ÎéÞÝ…È,áæ;MÆO›‡/|K(zÿÁz±S{õ…ÿŠƒÀx|–ÌYºab÷|} 5‰/ ±Ê1#OÆSŸa05i¶t[òL¹›lÿTÈËÊ ð4ËëOà”Ÿ çhÉkwÿžîÝò$"~$õœ¿Œ]_Ù"Ò¹w8½³K3¬‚^[-éMÛX$NH}Æ!h÷ €©¿r¤*·¨C“ªŸƒµ´K.=?DåBŒ‰k‰‚Ä¢´K†vä†ýµè¹juöpÊÏΈk?i!tRbYI’A56`/m–hLAäìºÈÊ› ñ‡-áöxÛÌtïò¬ÓoëìÞtÜž^Ê¥)Ðü\uðêU(Èœ¯¸°Š¯,Ä¡WK»´wChŸfy¼!k‹ñi[º{M :2ïPþ)£ãÏíñû×J.'k‰N˜Ïüš¢¾[Žšî.}ÇÛˆWÆ©á.{é(‡Ó˜…ë-ÔXßq+ÙYtw’Eö AôÑá$Fö9ùÄ›”Âç³y3õqªöû#1S…•QX£áÙ3ÎÖ½yuĤӇ ›ø-øÌdöP‘'´™Ù솽‚{f*?¬¿ˆ¿\ûØÚ p$ýµP!DáXôYñršeßD‰¥R®<ä¿xBàÊ©=t•Jy¹|$E<Šé¯ƒœ¤¬íQû FÑ[ôíû6 ¸ò$ä;ë² –÷ÓõÌãË$äðùàL‹ÑôGž¨´R;¤2pJŠ8ʾ€Ãµ´ºÏ­!§¸¶ÐÚGƒ2µÔ™Ë÷¥¤ÃTMôˆÀc¤VÝ‚›‚A¾ ¥-IÝÆ¬&Ó¥¶ýÒÏÎ%/nÎÊÃM¿–’Ç8k?`¾­/ù»4².068=÷ZyñHY’ÛüÈSêR=}¾õÌM‘PSiaˆŸ(ó<¬M{uqmø"¹ö$wPn€2F¾>yyžÓ™PÆ’Lý],šg†„+ÏëtH°Õ·/Ýõó‚Í’묨}Âiø‡¶¹}<6>2Úp ñ’ê@$‚÷Ú£d8ó¡=Ð?UOë(À» ôDòJv_©ÀiÐb2ÿ«üüëå!Oˆ¹ô£)í"Œhª?PÔŒè$º×îØ`€{‹ÜÞ˜o^[•¡tEüBK—+&#"Ûï?±œ ÑàÄß6>ÇK2FÞÿp´Ã5VK›ì ržNsƒöý1\¯ñ;º6ŸPGeyÁ™dº¥>/ëãòå R¨m$öc%xXÇôû»±Ó”Ñy©gx"ÿ…™¨’t'¦Æ˜„œ“ N­Wy6e€0ôÝ$~ÆïÏF²’8ù^ÎÇsê¨8ª•åmÎp”Ü«7 ÒS#3–zhÝŠßìmVà%ü¿3›}PŠË…±“°ìîÐ¥(*j+ëšE½BŽPcÁ f‘ J1êþÕª‹õ€zïãÃÓûˆkë¯ízFþi$rò‹|'-f¡b§²Nß•¾=ÐÍQ¯ƒÆÇK¤ Ü?Ë7¤¢ØF ½J~^wª? i^xtBTD´3ˆ€jëW)p`Fá)&ðL±KŒ´À`Ð1BH^©ýRpúÑ_j ·8ñŽÎšP#ùø9¡?—–_¯ï¸Q(jvj¯ÚñïÊ`Ó,@?ƒ²x—”„U…S6žÄ;iþŠh=w˜Jei{Ú\%±Pž¶»½µ:ôgéõì ï¢HxºÄ/Ïå¯=Ÿ~C#Û×ÍËÙ ­ÂPÔ˱`“a뾑&ÞCT(,÷7¡’3–ä¿ÎÎÐ3XD2 õ)ÁQŸOéßlã#XfÏ?×¶ç±±¬…í!qùËìÀ*Ë?ØmÕYಯë:hýGý®¦Ó=ä®ÍVvé&hšzœ­}.NßÔ‚?ßH½§´'ùSù±vÛå¯o…r³Å,ŒbõÖ^Æ ¶M‡ÑpCUÆìÌÇlÍ1;lª,Èêwì2£Ⱦ‘ÑSþ2}Á.ëÏN~%‘Þÿó²/jû'\‹éfL‚+äë'U•_}É8B éœÆ¦cí iÄ*Så K/ô¤êN£çÚZ{«*Âpþ |Ÿð îlWåÚ:ýFÍgYšÙq'A÷=À/X¢Ò|&¦XÊ}éB¼ ¹$ غ‚FD06°pðø Â(4‡ ˜NIìC»ðH;%ê`¿r|ð¶¢Ûãõ~_^¤¿ 8ÑëÑ»`ÈccNYm¦V©xyÚO[õ,ܲqÖÄecÚdB5ð^b½°­ê´Ù§€Ýé$>3d%˜Rµ=ŒSŒ0`b‹·’‰Ò@ ' øc¸ÙW°[F Êl(„%]ö—JÜŽ[D²'þEJœcö*ŽIÔ}E€¨ ð|”·ldîâ>wî¼ARI³ß¾RÇ"ͤh³(°€9#®Òe~¼ B[E( Òˆ &Ê V…\2ÃÆª×¬iÅ‘»a¿[t±QÒ“û\ÂD1ü#á }Û>ܶ/Ø•¿÷Sd§;/fߎû=m‰úËú!yµãjížèÌŸïfé1YxÂþìÿÁ{üâÄ€!äß@3#Ǭµ‘ÀïÌ–,õ?¤){b¼/Ê…õ \ûNdïSüµãóÉ}¤!¾ž2Ux8ÌZSÎ^”Ú’ Al"‰,v€„„HcÄð†I%®h˜#…x$cn†‡zyE²Ñ¬Tg ÁfFÇQö^’L­¶xÕ²¼¥Mœšßn_XDi`Þ„ô”< U¥Bÿº@gé}âS7‰Œ²DJ/0·ÔUsà€xfjàBüy„0¸Y`Ží6&„QWÒ=jð‘€8¢HF°ÈÓõÓ,C>Ò2s=¹¹Ô¤Åë ÖÞ«scDK72+·¼b¡<’˜y¼¹³äO§Òͯڿ{ûg—½MÅçÏáŽø‚ð&¦aOD&šNÄ jÙ§Ù*¦/)«kkÂäˆ N×3`.³Ã0k¡aI *N¤%€’èñ¢@¤YÖi,4’A¦¨åãÄŸ§ýæ^çà£õ{!.‹÷G÷×.[nÖñÈyÃÌxídÚ?1ë8'ØÉ›3èßs?M=ü< ßÖ^\²|mM* ̦;Ò»}|üˆzS” #fÈ_ŽJsYóÌ =wÌ*b9dÛþa}—è8—7ô9½åûƒCƒíùþÏ©ö‹h{lD|qËÖNi;¿7ùåÛ˜P½„¤Ðk-ðWšŒ?ܘ¶qüp¿JErS îî Dwˆþ¿:Áü¸÷秔ϫƨ7ga /õ3CYëË·„wãÆqï¹GÈ?V?JöÝ(…Ìõª‡(²@A„‚RÓľ-e!‘L |Enn–~Ó‡,Áþ~аƒä<1S úïù£¯¼ñéÎ÷y¥GF_aüg=›ûü[‚àZÄHË/JÇÛ\§Ù»ßååûùOͦýr_ç ¢ÉØØ¨Ã‹¼)¶£QÖ#h̺ˆ¢PÄl0KÌKŠéKÎã‡<%Å óooë¡·öòlHÃ0ØJÅi6zG¥}ëâp”Ã08üÃ)L øf ø2ª‚.é\‚¿ Ý&ÎjiGrÝÓaö>»ëôIzu»Î¢6ÐMno\=ªÑyŒ\ƒd\(Oì,¥týn òÉoLÁÌÔ1~ÎÛIš ¡Ô(_GtÇå÷Oà¬ÌÜ`ö)×俊QSa9ûžÐµÛs`côç}´÷œ»ë—Ì©²¾˜Ó^PÝŠõ¥íw›·ìÓ.ÚöÏ–_îýæˆ|? ÃF.Þ]ûù‡DYÁ¦KŸÂBòUA¯»¤6ìOZ‡q/?Aƒû‰%< @‹û+7¨|…F7R¿%R}9éã߯fÏ‹”¼L´®Òg«[ÇS6߯áãÈ)û=º’Îæ,åØÐ<Á%\¯ÈÑñŸÈ¦ =;û¾) =”æcª\ ’ÜYu½̳𑻩U7]Pž>Ïhœ7 ãiý-–ùœ…|jGý‡ìÙp÷üøÚܰïsåËÇ—g ko9##èòæGÜ—óvO*дž†í´Š$‹içÍ^xü¿ã³ôô"/$L4óæµûùšu~eý17à&òºþé6§¸ã¿ø¬8]ù ÿú\_ƒÀ¸þ=ÕiDþPȈ~NäŒEˆþù€hþ#¬(b{øÌtÿÊz§îo/ÔŒÇ €„“ÌÆ }WÑFâèþndÝL}‰P?¹¸_Á6 ¹8›U¡86`ãÛOн>‰öþÆË}…Æ$ô âDƒE vî»M—ü%Ì|¦žºàCþæš4`¾ÜËéËÛ—Æ)ƒËöE§—€|BMĵo‘%ƾ¾i^}D±ŠÛÈ¥ }ÿÝ.ùOÁ¡`ÀºÙMzŸO¤ÿóAО¿h ÝßÕµ£þ‡?ßñ¡ÖL¬&þ4í|ÝFU?Û%ûl—¿P «µ8åï÷Ÿà¢M|ñ}‡s?%peÝìóÕÞ‚ønüé—ôÅÔ&ú ú}y ?&´Ÿ ;on:ƒZ´ô»‘†ð‹À`Õ«¶èCæ‡×H)8*½©5¾ôQ¢\zܨ¹ÉØ][ÝïÏœáF-é-RiùÄÀýÁ¨y8›j ŽìÏæIT¸?ÞóêÂâadÚg§W¸E^…$?–ÅÇS°™ÅìßË™Lnlëbòÿe·Ø¶Ü”:HUø–¿®S¹*¿¹øéå%ìèq=Oåü¶ÍW ðS2¢)àZã÷µáù”âåÝÍw”9‚y}ýÅè9•H]‡BáÌ"‡Øj‰,…^ÙßrU­@9¶KæâxbZA“ ÛŸðŠœE/ò š×ö—ìì౯Uó>};{1€³B?é½ôo.-”VMb—³¶ŽÌ.fv}¼f3þÔ¾mé׿.Ë5ãIË›*s0…,ÄÝŸbÈ‹¡þª°kÏ©«½:KÜ"©€…Q=—žâ‚}z|ÕÝ»‹…Ó¿Šƒd,Ù]úHÁôÑ:‡ùÏ"?rk¿;µâ’J?´î—†yxòÝ`×ðì-p2ò\«ïæ#ýeZP`9‚—8u<š-ÖèÇ’üü‰}ñ% ‰ î Ù@þi|ŒÉøBJcœ?*5Š»²J 7Iïôà›IÇä_ë—f£6z=o’ú2ÑþT…1¡n•\-…F‰N椺ás4‘iŒà‘Œ+… ØAžÊ ¸* o—\‹hÖO¸+µÑÙw} ŸIªÚ# bŽpS:ña&ࡎr¯Ø+B]Ü*ˆª1½ÂÈòÀ´Ry|^Ð7 ¡A¥ØFµ’{ÔŒýð«™N/Ž6eÿ’O6.ØûGŽJ5ζëhtþV¦µøb¯¬Þ%ži˜ F^O¿š9.­ð2æ(?»Š:œãp“¾ÊoÞùænä׆/Cè—¢%ôÑ<ù}#ž|k®>Ð0­ÐÔ7¸Õ´²/âË,’¢­h?i«‚¿¢o*~KÍÃmŧ1?ÍÎléZ/ªÓo©”ûÂ&l¥¯UÛL¥ª&²ÐöÔ¶óÇ‘ OÛú©×ÇwCF,øIã˜mÏšæ}4\3¡ qu¡OèHfÂùpZÌíjlüÁ4¹="v©–^„òÉôÑŸæþ06{6ß o޵ôw;mT'òJ™ ÅÌÁÃ4l‰ôÊ.Ûn³#΢^ˆcFëk]§+s¼ïÏBYÞê#•)ýg0úŸþz«f‰©Mæ ÓÇ™ÈCä„Ï bdŠÃ?äÒà–ìÔü×~ÿ àÀ[‚g ,½Oëá¢VÁdxP&Z„_Ç.¸íã åjnS9úÄAýEC’gúˆ ùïMyBe|ÙÔ9$2ëå÷® ‰Ü²LÂPñ•&â|ƒ¨J¡$YkÚjûB½t*h÷#VË"—DjdÀM¢¿vÍuo¸|©önÛ¤X1*6߸WÑY 1å¢,yfˆk¡¢NRS„†èƒRˆõÍÀ;;³Šu jo4°êsü…®¢g¬Õ¢¦éUÝ æY{Ð9O4þ±;ÓNDA‡ïÖ$Æó@=ì0{}1ÊâJš(»Ì¿}y7¯Æú›§;Èà ¯š Sgê ¾Ò6¦Û1%éîö \œf¥ŸÞîçY„;æ¨  Çî=ÛF^ý5>›q ë•dl 2[ßä¾Wçöz¹çŽ:m”Q¯/M~ß ïœA¨;μ++«HÖuñÓŸÈöÐN­ãÝ ÓDaÖ D<¼µÉ“)6$‘ÿ>-è (ÕµêÕ“Òhð™B8`”£íò0[ÇcvÅBBW°9m¢ô©³ >Áü힥¥×Fs(7Obå鎗ÏKm­¦êäYßÓør“¼×dÄ¿N­ƒ¨ð`‚ãf%;€=ˆ0ÂÓ?'À*+ÌåbÌkJ˜ Æös_Ç|j És1Ú¬|j ‹J³XZ"…ªml ¾I+4Ë “}½‹gÌMJ%¸ ¼ô÷ôбÊÖù›…¤³>€¿ázg?O•ðgi£â¨ÈÛïð‰òä#u¸6ZçÔ…ó™Æˆ# tÔH—¸ñäóŒ:ÔÍ迳N§>=ÎÚSÒ ¿²Š ¿Êýí+ÇÖv·cSoÒáCxÆbס÷u wr¡æ¦tÞ‚X¹ó15^[Kɺí:¤3¦­­„¢ï¿Dr/_îç¬-uu4Xö9×÷Ã_ÊËÿub®íÏ¥U8J\™~zs?â‡È8’þœ¦/1È £ÇQÝ\DŠ"Ù.ÏÅWý=ÀÖ1¼À¤›Úô›ðJ/óPGÈiýãAtËÚm_¨õ1Ô7rDå–ØQÁi@>8Šì3ôóÈblÅÏÙÎ÷åå?‘m­î첿NêÏ÷Z½ú_†:ÑÛI¤Ìä„®B'ˆ°§ÕC×T9D•’®Wž N fåä[ d/'¶ªvêÝÎ"ôé§çãÝ1úq­úxLDrâP=οsTš1û¦@?È`³ Hrõó”Vì¨F)PÍŠŸ“Oî½ü…å Û®{Ê~Ùìvó=z¦ë…7[$â¦zÂ#£Ló Ý¿Z°B„u¾ßUââÖõ€Ù(hæOÌrí]Äm馸-ƒ±…WÜwâ<IjÄÝó³dy)¦}JChNpÞõe÷ôôû5×ÃÝAÕÉÁ!âµÏ=lÐÞ²"Êøò\wãÐé¬Ýõ·Î7Ždæá¿¦x¢ÁL}ÞçâZêØ'Ö°1 ¸ž¹ó³š@ó ¤·¾oú÷™_=ñ‡Èzú§ãdà‡‰GB÷†#¥@ÜŽ¼æ “.Úúw…¸ª.‹mÉF$wî§>[?U>¾ûÎ=©û0|óèÜ…álÓC§¸±² (5’ùàõ#€N8í¤FÄûWÝäë”ß«O—©¬O±¡ýÍ#|‘±»åX˜àhcnwJf†ý…£‡! Qî2¢®9t’#6|„кTÀ®Aª¯WdÀî@e^´À_X¶Vã ¿³}ÇO-<}—W£°sKÛC,ûéšúóæ sxsLÍy‡ÒPÛ™ö*üö!Òä>Áš~L« ·ëâïÚGv¨ˆ‹fª¤¶ÐFžóé"4+¨Õ÷œ›æwãg©d˜Wg? rV¿¤WMݨôeäÕÝãõì;°ºYvlƒOºÛ5$nÍ ›A3r'S¾ÆX3sPœ">Ëß’Î h7nèÛ +É­_A­X0AŠ“ð{ê”m÷ &Q &`&¹.£ D~ñÅì¦õcЈCy¿0ƒ>ü®`0® UDVkN3 yØp¨ï6)f1d)ë-dŸ¤YÊa†:5sœ_ô*øa]•lcÂçÃMs<Âv„vÿAsßNvãùîòb¾Ü\œë@0 É¥—æwtY®cÑu«sõp. H'×eoò³ZT=ÇúaKðöÚx ÍZ§À‹û´ ˆCÚ>öw4A×ÎÀ¬óôÛbaƒÏ¯/€¼,HÒmyô9”×üÕò·íüÖ•êŽr-µ=Kè 3¥üµ6†·I‹Ur> ¸ï5êMîÉÉ6}÷§#æÁ¡`¹0ap[ÍæÜxK¡níV1RiÎÌ}Lr¦¨ùªQ0ÚéÚÓ•ì”E³Ò,Þ‰ „åíÂ9˜cÔ[…ßÜgo¼ƒ‚¤‰Ÿ,ûbûÊç=¼Ì8?P·¥QÉz.JG+ÿ¾ØFŠä+d-Î4ØM'+;þ¼½_à›˜r÷Î+bÛôþ´ê)¥€‹ï4JÈ9 i‘º£?«Ð¼<n¾$p4æê]îH[ºCÀ˦.: yuÀÍcReoM®ÃRÓúá½^p~$7ÂJ}"ŸçObÀàÞquKñÆý·„ù#…üåÍÄNÝL,ý]ÈÄÓ£¼xü;7S0ýĸÙhÐPn¾O ‘³4–WòûÎ_»Æ¶/Ú"ÜpSóÇèåp„tRvp‡É½#•’ƒçc›?žíø,¡ß3½ÎtƒJõѺ˜/lïyžÿ´#äG¡3ò­á2)É@»nÑEmm‚|¬ ¡Ç°º¢"Ä ÎvÛ>*m–º¤ÂàÃ@J!¤s,¤µñvÀãÞù±Fµ›ˆ/‰4{S ]ç¶\Y³—áÒ”¯–6¤Dˆ~Y-ß.4ü³¡¹X1Rêlô÷©ø¬ï©^Á{Ø~÷¶kÒ_Q,¼z]åôÇõ[B­pKÿ¼j #·51ýhýò#¶£†þv©B†ô~r»ÑÄ‹§ó±~j&­3¹ÖÈå_çÞ›‚°¼ õO"KQÇü€&T ÛÒ0 Ÿ·å»;Ë—.Åù5}±Îù_Þ­R´ÆÅŸ!!ð*k´ZLˆÑý…í#®—ªQ–ݺ ­PBj_USn‚\«vT3>µ4áÈ ´«_T„îäÎÁõ[²„”lÎÍé4‹“˜ݵ?̯·FìûîÚ~*LÇg½‘Å Vfå.ÆG&ñ¤¦iç°Ó–Ißw“fŠó Oy#kò ~*3ÈM ®KŒô: °¸yÞ‰¸›"ºø–Ï,êˆ$i5¤ 3Ðê&¹BíHiò4SHƒŽuë5›¶ØEâú=qåí§˜sº¤‚Ù18þ> YZö·Á·‹ŠÀÏiãÞP! ŸÑ’ñæÏ#Ÿ¬<åæø(U­4ùç…º°ÈCæ#$ñiOà †¹iJz]³ÀØ¿Ðëxœfø˜_ùŸin€³V­~JoñE&É_äú*ý«‚é/økXÿÊkãsd{ýŸà•Çn8„{AIQÛ{¿Ú|ç½mѲÙôO5]3üvdC[îÇü©îS)­di6¶&YÙÇ:z;ì3œ 6N´Ö"‰bܯ BéÚñ šB·Þí/ÄRÒûcýâÓ™õ·êátЧÞ|äÉѷß"@ ëµê‚À.ºu¹À¶ (ÏñÖÁ‹°¶îÀ À×;…×óÜ®ýï.ZË5ƒ¯(øçÙr¿M?¼¢²Ž»¸^;5 Úi#wÓ"ýþÿ•Í5Ž=¼ ñ Ëµø¿Èqð pMT5>jÇ}žÍ=lO·ßúÖo$Ã%#Ô{K²í×A˜¼k¿å–o߉Á±åæ”é9; ­û¾=S©’ Ã(Ø¿™¾Õ¤î‡Ù‹î(žGÐæ2ÔúMõxÇ@K‡¦‹sÁÌyýÛàtäÉt¼‹ÚÎuü•U˜0üèñ›Åq? ‰µ¦ê¢ÍÆümëÛ#ë|t÷áEÊ©ýœø4«Ï ¦n舣3Ÿ¡Ø÷CæÊ:à¤ý¼^ñYOõ¶I4%0âþ¥ï³èá¿[HçYÚ[{ì­Ñº9EvmyÈò³CæàE±Ú™Û×ì8(Å-ìëì=~ßsWŽnÿž~÷©]÷qï—a%èñ åá"ï¤ûs ¤cÄwNFÍâNê-Ôg'Ûaìš_©Ë×G¹­—Œ§°C¦—‹ÅBŒŠ²E6'Î.›ñô¶ûëM$¦\£ÅÞõPÐ+iöNÛD\Àô®füŠl”ÿ Yz‘g=-üÇÛÒ ¿{ÀcxçÂÓ"¿ÏÃÉâmpU¢“Ž‚ua_šÕn*Dä~OWŒ3¯å•ï•Qef-¿RŒÇëÍ$‡õÎýR ÈkÑBgÁ‚m™ÄñöÎÈf_ÛŠ"ênEwe¹£ŸÄ©~¸~±ËêqœóÅàèŸl´p|F«=+Uò/ŽÝŸñh¾´1R é1wE Å_'äµqw%PܯÔp÷‡Ïû™¸‘kÅ£_7!ãntúé7æ¦ÚѳJP:ÜòŸÐWúÑ0KžûŽ9ùŒAörõCÐèLP§ Ž‹÷·®ÛjüÞÛÖ„óÖ ð!—~„ ¶p>óý¯ö…ÿ ü·Þ%*èCî®@ï¯6ŒÎæ… áÃ`¾á6Œ±ò–CdX•»¢<(ÓDϸÇ9ÂI{‚Zãû„%W—Ùòü:^¬KÕôÂ,™Y‘_)½¹Ã"¡>Ÿg3ZbE&*qEw4¯raz§/æ ÓùFq yýº§ãüµÜ;|„уÄáÁ~o*P$n(”þ>B¦€†á¥ŒEž!Ðß¿3bx ] ¿íTÉ:A+äO:Ê…ú×3oµó•gÆÙÿp[¯VÜ €¹`°R?)ÄÖÉ„ üKz<‰^ŒáaI ’²oGÃàN^ÞYhÁŸ‹l¦°íàÜ÷rRNŠœ õêtu2r¸æ= —Ïó oô`í°NÔÅí¶ÉåDu˜Y';®úu§N×¾U¡:ôÌ0õó÷©„Æò‰wé·~þŒz/xÉÁ_΃J-¤åÔVàÏ a‹Ùž8_w.ŒÔVøB>¸¾º6OŽ~O Škæ?ÚéŒX¹’ùâ.~¤žzhæwK¦±¢aˆEå¨ašÜÔó™y–æTY@£Ö4h’{¢¹8Iâ ¡g…Ì þ†þ]r_Q+1µ{¸ ›²{#ggÏT`ºÑ‹ø;^¹È&}Zû 9bŸ­úbtô÷‘K–YåþL4Ö b ¼Sˆ‹(>F¾ÏòŠ_ ã?wwU`×¶¸¢®r‰º`òåûpyÇ- >>Âûº—Ÿ¢ÃªvX3Dv¢'÷nKfñ¶/ÚeT?è!uåF­ŽIqŸéŽoê,@ÈݺÈÎÁ»^ý£tö 7VÛ6 ÅëM“ªˆtæ÷|û5ÍóU(Àò;ŽÌ2ý¹hå¤&k|Ïí”üÍú(WZ0Bï®/|h•ÄA0Pn窡ÍUÁ pnÒ!ßInôÊp¤—uà@eâÉiàV“ï°Ûã’ÿôíE KWDt_TkxÈ«ê3$¼7Ù@è`Su!Á÷/Þ™äæÂp?°H ?N~ÆBèM˜­@£ªyP=Œˆ9&‚+°&‰%‡›sõÒK2û‹À‡‘àJq 3Ñ…òbd ¬ÀÂd@“™4]0VÏÕÆã÷êßyTP!0ž6Œ†9rY›¥[¢yŠX7 ƒ.dgh™¥A•q"\Ù\ѹ1äÀy…7*' `qK¼}ÿa¸ýË=œ¿´ò{$¿¸•Œ™øz(ãëÆ®j•<¸l8:˜®œÙyù¨¶æ£ßxþùµeíµÉüF~ÀŸ—J–Þ唀 v"Np`¿L1­á”Œ$Ú.pïþ°C÷LðìK¨'#=…B0²ÞxdVbp‡p»e[•¨…0›’)î&¹ît  ,€Œ܃µuŠ e!e ”KÞÆIÇ)T*8R‚w°`!„R^ló®q 9R´É°Ëe›¿ãÇ©àÓ‰™m:«4""K@ç¢'œ±Ú$&¢…®åŠ=ÇâV$¥‰˜–°@žñ4EÁß•3Ôä €|¬Å×w| ®ÀÓEƒóÎ2úÕŽ¨ªo2쬚Šª>}‡» õ’ó쎫½ì‡ªW࿚ìwå/îqq¶ÇŽ%çü'Ú8Ö¥°Š#4tæá¿uÔ¿¼{8öÅ(»…z <9Ë‘¹âƒB€5gyQZ›ÆAÊ¡a£í¼[#¿áÐ.[m`Â7Òõ´×o‡» wœ KšLÏY4õ¡À¥SG RÃ…>gˆË!à'ŒTZpti„N…Ť&çxè‡nÖÉåÙ@’([ä½k. 0UN !…¤#…ùmàa*—|¢×ëñl@¡M -sç-/ÏeÄÝ;Hs 8i …¥HºEšYÛt.}ÁЈäIZY@“eémÑrÿ2B@H>… =âÀ D¦¨\©Ì’VJa….èADv:Nœ Lª«%2¦¤É­Ñr254m¾d¯ ú†Å2/ «© /o¡²o9þ^LÞñqëý­; ¨’ùÊÏC9 •Á9ZƒÖ€Z®®º8œÂ¢ÑQL1•¯×Ë–!—ΞŽÐS¼'ÞÎHåÐ"º ¾òi­*’’ï³bûÛ¿²†ïÄÅ_~¼›%]›¢ ª«>ß³´³’/<-_‹?y/·Jœh³8/,s‚ b…*;å6B„>pÕ²e.F`±Ubúʪÿ!Ü¢Œ¨›“á·PêÛ5*ÎP7 aûÌÈ€àšÐ²ÃÚî‚Ú~Ø_±ªCÌ„ÙË›Ex»N±â~§½™î·ûìV€Ç¾å?Pi±ã2r¬”AIÊ3ò¶¯¼2 ¤]Ä ¥³3øWn¥ñåàÈ;¡¦_Noß›}ú§¹AÈÇ'nõ2·n&ÞËf÷íä¾™ÐÂïäE¬Gr}ÇDcs˶ÓîDì>ý…ôübgz¹;3)èè'ËNؽ毯^úÄÙÜíØ.]0í³P~ŸrÒŸÀQ|È”œp! ùýƒkÂdŽ}ãgW%èú=õë¹þv HB®mÈüIãùÝk°÷{J3—%“ÏM,%¢ÝR?q$>4Û>­Šd Ó®yéhì©Â'Ü“—ÜMþ—[ ~moÎ܃RtvAúNëj·ìP9˜ >`E%çøûý48<%±e •f™¯miþ¨zÇ…°éÖf«Pù´Ÿý}‰È᪼XåuùSÓðºxÎQò®äÐ_y@= EüblæÒä²¼žß2Ð3ߢ|ñMŒ ‹ãv%¿AË í´#ÐÙè1Í][k'^‡nЫË6áíîñ–‰Èöð,£ÿwyõÓûtpE‹»B4±ªË#oû=3ò¹é/' ‰³:¥)tÿ¿Ý&Ñáô†yDFÛëØñ-5ïü<[ÎÇä¯ñ•l0ðžÜwœª¹“ô{«Žçª&(ðŽüy7ï¿ßË–MÆ÷û5Ÿ¯²3„eÑ›ZÙfõö +ÉÚ†²Ÿ/vÑZ²«‚Ðr(a§ ¹ŽìY w\k»½ˆeÚrxvÜéËü ©UÚ7Òe×o:鹚y¸…) ´—øHº-GûJÊ¡†úߦâ“«ð/ï/é¯7ñ˜ú|óÑÛ†3ë-IÄvöÐ ÆÉSOÍÁ¥|H(áÀφq±èKS¯ª<í’ò^ <~]µ—ûò›@web2ƒ ð;Ì&€Ci‚ dŒ¤rçMâãU³¡&æŒKˆ,óû÷6KëÄ!Ø0-Êný@5wúw] á ŠD/Kf/S–dqÛ–è¬ä£ˆÞ‘‡/›"ǧ:š9v8ðïû±~ß±A·‡¥¾Z¸ü5¶Èõ‘Ìh½G8èjéȇŸ1gm†“è—³êõ Õ^ †?#·ù—g?“›–ªW_vrä™¥Ï þPêp†>ôð}Š-¥Ò&-çe˜Á©}{ä-©ŸO‡N‡ïV„À²ÐíÌy²”é¾<¹~Y½ÂG_·æiµ?ë6(ò,xö¢ìyA$†ŽïÎA¦ÿXO¯vN=Ç×á¢#Òª¯Cû‚ú—šÄðè¹ì@“úŸfÓ7=q±À—Võf‚%>\ö¨¿ Ÿ­õ2Œyº?ÜÑÁðÚÃIJà`c4)\Ú¥ °cßt£gZDQ(¶àwö1–èàK±Ú±‹Ö_^ßÙ@¹ï]9ßcßËO_‹bKœ +DOÛŠIÊ/jÛ£½f4‘B˜ä¿å×’þŒç"w\azüÊ.Š3~gÒ~ÿ³û6©Dž¶zjJA:aNM¬ÊU7è>èêq¨ãf߯ÏÄ­bø2‘°ÿ^ÄÅŸµ]=@ò:Òéil~Ús_«z(hà•”wŽôÔù4ãXï+î6°üÒ×ô’Çã´nEËš‰Òr„óÇæB¢ï¬[ŸnÄÔë>kþk>ÑÝÜv5ÅÕí,ƒeΰi@>_ ¨tú¸a?§Ýp¼#ÌHš·q"rü£êÒe“`Lúˆ±çñ»ˆ?{¾ŠÛL‹nè–Ç]4 ‘¤VÌ$vf×Ö‡”¢ÅEwúDg>Á(pRqض處æÿ:Òˆ7š”Á}§Ûõº¬H‡;´!!A®¤L­Ž“ÑÙÆ±} ÏÜ9»î͉ü2³³ Ëç5yêk«»>¶䶴֓麧­ç¡ÚãÃ=GÇ,°”ò3S`?NºÃ+•͆ˆ‡žÞ§Ý ÐhׯR"£ùi’i̧ÌGO›!£šhò;rÍÐÝt–ºå°ˆz¤2ši|á7Gh-Íð~J›@yX7£×µ?¢JK3gV3~ »ˆÓHe‚~Ëeº|ü¸(“ó¿&ª¥T¿.@¦z¶ù—Y> ‡v”A,8Îf»À!›´=hàU‹êñWê©ÍDüFt­•»?P—®±„ö{n8~bn¦/2¼RÀ\aXyØ…*ï€çÝ,óãü5B“)b'ÓM`ÊÎÀêAè6û+Á¡èÖS0!"¡”hFÝ4^÷pjí_®9òyÁ„ºPêóøþ¾ éõÏ—aŽx° ¢7LyHZuˆ^{îHX6K”¶Î}ƒsP#®éo{ý$Êf÷<½l'QßÁòŽZj¹ýÓJÛ(îÝ%ïy‘¯r¥%¤˜á‰ß.ï†}¬ýÌ^ö8#!r ßtX¬Dþ2Lãò›´Ì]ŸI,…~ÿi (©q ó>ÝüJÙ§!†‚»Ú‹ð“¶xm ÞØ8øaçq FÜÆþ‚p¡xæ±ê)ÚMpˆ‘ÒDRRƒóX¾ìl”>ZKã÷óŸëôÛ÷R^4ÐÙ¾~Yg¢Â¯xÉ|\PØm7|‰ë>}~IßÀ¿U‘Ø©È~I*²ë5¥]!¢.âÞgÜ88ò^u „ {ÖäB8‰\a^eô7)×ö¦žRgæwƒðsq0ùožÑØïÙ¹Œ%›û%‡]ªisùîhfæ ~-h˜=Õ1äE¾äµÑWӣ̛gÒ——oËLã˜éË‘ºœÆæiZWïœ_OVMPuÛ}ßH¶;±«g–X:¾bBéýŸÇóŲ¦Â5üëïÁ»$Fá7o¬™öê'Õ¤?Œ÷íß¼)p ´Ò‹÷[GÉÂz’Øî“}gwq:ùiް¾î®ft#™¦é²“w.^¡j˜úáIN§è¤¼×¤UmÛ™å¡ ×í¼†Éóˆ ¨õ¡óØ-²²p­ C*Ù´ÆÖ[oTø ÊdS1é-cˆà¨uÔ%Âû`EBDóæCBZ¹˜1Pÿ/¾8î¦äŽ9jÛq@¢ÉÌÁuÉü›¦ÄOßìã–×xë\µ5wHØÃh–²þõÿ¶:bÿ©\á^âG¾Jç\‚ çþ®ÿØãìö’ žâc÷J?i”î=÷‰1ßä¿¤ºªƒ…• ꈳÇ¡XÅʤ;R— yT‘maü`²ÌŒ4‰¡º½EôMä¨eJý0ßÕ…xplôÓ•O^MOÐ>W‡,×¶wü¾ôb|€:°Dãø:"Çßí]·Û~ކÝÜiãêk—~? ×›5Ï«ÉÁžmæ9#P-¯ŒW9/üAóÎh§;+Áy[dKúù'$B1žhöcÇ ö,†Ì¢ŸìߞęלK¤.Ôo×+/ ì×½Ô@†YçÆo^!Èî`€›éêî&®š«g!š2y‡ø÷ÞEÜQI4ˆ0Ëk# þú Žå’£¯»Õé­ím ¶ôQø±œ:çRÓCv{ž¦ çIØžåÖJbñTÓFVwFMÄ„‡É¤¦¡¢sÓâ7ðm'€êêEÕ74~y„» ¾ºßñ†SR7 ”-#gêç›0/Žjí:¢Ì“…·\qúØ«‡šš×î&ç¸Wâïäh6ôØ”pú K¶Ò)SÛË.Gþ uÈ^¿m_i!+·G[þ-rðɰ*QC›Qš?ÅÝCºUjÒf÷Á[:rRäävFñ5Z£$[™ùð`§ª¿BÅÏ]‰$ía>-×ü)+Û,ãm(Ö€AÒWK1=>*P¬‡ßî䟭 &=ZŒm”¶éAç½`¦´÷ƒVj´­=?ßæ¾bÿ*òûÚ J§ç¹ ¿Vؘi±ù 3€èçaTfyòô2tLk'áQ#Œfš‚Óµ–ðôn¸:6vÍ$A['q€~Ìyür¥œwóK€SÁ²!‘9}qcºˆmØF€ýžBíhÚÿ”5•£µFMƒ€K­°,|A°£­6Q¶\{MrIvèóè ¼ý ƒå§VªÙuqœ`‘Wä%[Ëþ2²X%÷UQöù’ÄÈ6?úÙgoà ¾,ÒlÈ-øóJ‘ ý…½O/ÀŠÈ\tS»1zX\÷ 6ÑÅmúò¤†Y¦¥¸¼Çk0ót8 â`©…îû©.ñÝ£*¡{Z²üŒà­TÇB²ŽfÆÝ‘BYGWBÒ‹JYÀå?I›’Y¿èsÀà tÐa⿾ºf OÝÏQÎΠ.fòÏ—ãµk¢€ë6ÃA̬á»ÍnØ9šÄã(\=™õ>|‡Jþ±€wþÑ]Ù™O³ Aë 8y„› 'à‰ì8'øã© s—Ÿû.çÒÏä¼®ËñPŠŸË\º¦¢Ve ²OÙ®-0û¡†º³A¸>LŸ‹9F¾ì¿5yãhä¯J“Þo‡Ò¶^GÏ ~™­ƒ`õªš›•MrÇÓ©ÙJ)®Ø(˜u” .ÈÕ7ˆ ¯×ÈîP=O¿@”ØØ;Á¾f^¯YßP27âý̸gÐcÇÊÓ™fêÞ£MÓVSC]û¥!+)ŸOu JMO^²Ï~,¥’¼Zî÷-c®Oðôóµ½ÉuÝ~Ë‘ƒ/¹Žè óËè;aë>ç3_üãîE¼gcÎà>£Aši œ¿  ½Ô̤4GªÁïEr¨gûxÙ‹g)Ìé«oyØn½»²6tÌÁsˆ¨³`“Ü˹Ù,ØÚ̶C ¬8\,!ÙY¤!9:„RNNOc5ë¼sá)†iVv) æðû¶ ½›ƒ83>Ðá†Mäo(E pÃ]¡¤ÿˆù¯á¡ótLë+W–úåÛiUäY»yn¿Òƒ%þ¼=âŽ#ò'ó´”©jÇë„]Ò/˜m°{Þò)Jõ›«·6x¨÷ŠÛƒÁŠ€gî??TbÕTžØÝ2¡ýLÚïq·È©ÜÌšóŽbØ$¾l霸›‚A]·cß6²ª¤Í… ÈÙl=v÷×åAGI/Þ_‡'|²‰·¥qv‚ûú‡A9É#¶jÐÚš srDy ‘[Góú`næÌ%(3¡“_„C¥lj+Ýùê‹•+òÖÄ:|üª_E//Ê;“- CßCrƒk-!4Š´¦»|×ÛÝ6>7SbaßË ]¡» ý ¿ "P.ì@ƒÚ…ªøã‹<½ÛG G!Âwm ÇwþGRfªtÓÛ“½ÑwŸ0w0ø²¿špìHz ÊkëÃ+T;Üþö²›8ÿœ™}C¤_Ù7ÖÏôÄM“X)nLÜ~“y™¥ú¨éúËBpØgyeÁsÝ“D‹lþŸ ILˆêƒ=~ZRÙ‡Ôe«T7Óâ]Û•ž]ëÃ-\…¤}"Ú"œ:X>íÑ#@j#êÓÈùÿfR7^D…¥F¸^ ð ‹x,V&aµ‰;Ć˜÷A”‹èÇl*؆†qþ ·&`kÙÊ襃ŠŸÁƒ2 {'²îgï÷3Wl36nlõvޟÙ?xO,d˜Äß“‡;C€‚sÊB‰P9DÂ಺ áZ!j¸G&2ʱŸRœ=…kÕíè—6ˆûœJÖo»’2ÿ¹Ô ¹?Ë iJÛXµõí×._S‡ˆÏ* ï‘@–¸ÄõúÄ'½#÷eÃûuÍÙà6 Möëª"'5åÏ RÃ3aISÁ¯3œ¨1ÔÁ?hæ€ã:Ït邌ñK"Ž W‰^Té$×qä ß(K¾Ú¬`^&ZF´…ZÜ6>ŒUÎÖ@/™þh0ü0ŒÖíd-Lw¿âŽ9|ò¡âßd G÷Ð’15Ò¥1€WÛ/›!KÐý]E ·›:§ô uE¥y¨àPÀÝBU?Ô}ZF~¢ë=ŽÿÞU*—s1º'û“cᇳ÷w"·À’xé’D=¦Ýqþ¤”³Qß+Z ‡´QãºâÏŽ´òQÆà¤<½¹d3ñ†xT—'û!eðt ¯…Ò½ z€'”’fƒ» .†ë´QæšLÚ¹¥&·'÷]^Gƒ@T—Ð§ðA¤8*ŠÔ‰Ô«,OfDxÊE碢)î=ubíxÝÖñv35BAV$À ÚÙ~Á>Ó«Ýz’?Ñ™`'] \¯?Ù™]â,N$,åï€ä^ùŠ·ˆä@Òú·}%ër*¼Ku©þ2GkiÚÞ&uJØBÊvk°åîï…µ;åî½<Ó§äážP^§Ýdf,wýT]Û–M,\Þ•Ôáß’ëAÅO=50-àƒw7â—…²1ê²Áw€÷…Ïî·8­Û3¨2—ÈiÌ;Æãr{¹Q; Ç{Iºí_ó’Çg!¾Ïíiå.掼~éòÈe]ÃSH˜Ÿ‘f¥ímŒBèu™*¸H’õ6§Hw–ì‰ÿ5²‚¡iõ%ÙJ4Šshá¯õrU„þ÷‡–“@ÎànÉës³Í‡Ì[·ú­ƒé.¯O],pr,áØÑ`öqž4LÞ2vø:N7 [8\u Z–ÞgìÒXPW¬[ õ"òø}X…©ÙP’†WÂIÕ?,™ßÖs!â WXͦvEô¨àóæ|Çóï(y)4!xêF ‘Š€2WKzãGƒS`+"h Éæ„ã;"!Ú’ §Qu!ÜÌ­:0®M6•ÒÂÆAú‹âu=È ;<@&ãͿފ¦ —rG«KË)\0¹«s‚ôî?<{ 'SéU, RÞ?Œ2îéÅ!Ñç³ËÓá‘} ¾ŸÎ–œvJ¹—÷_úò5zÿ´¦ÚÐ~BÄT/J`ÄÕmíûQ+ùž+ZßÀâ}ÿ”sì”~·CBK©>V<9ä5§¨ˆèt¯“uAÅ£”z¡8.{ÄäHéúR*ÕøóbÞ1.®Óý?ºŠ¢kýŸËú¾LóÅ=âÖ×L£fü2*º‚ Ú¶3SÜ?ɯe˜¤˜ô…£¥>b*l’4N¾L?¶J €xíYM~¸_vÈSü—ß&lþµ|A÷~Œ“å½?A#ð |3§!jbÌG“RajÏ>™52Æ%;¥¼ àŸw‡”þìnoAá‡7¼ôj.g_¹ÂÓä¤a>⺄Ëòû³ô¥ôw0ìyw£~XÔr Ö@…!æŠtXš§˜¥'ð+솕ž_#æ*V>ŸÞ>W‡i§1fþ¿*›å0YªÞW_€xE:Q:^¢S.4Ôö75ê"LQv ‰;DøŸÜR©']Pý(7›Ä—¥)Ry¼jl G[5Q²þÞJ"G ¼Ã5Çe&O£À§oY6°Fìÿü”éà$Ñ€“%ðv£I^$ Þ» %Òê‹1–ÕBéUô¢ I¦ëËY«îlp~é›õ;õmûzWjþ nŸg7Ò†’¦@ü>³Ô×ðûÕÐøíñé<]ãQñ¦c»´W•wƾz¢¿´\ÜB,PŸïèUfµ9ìÙªƒI<ž>Zu+»UjM9e¯m€ €Ü4™žq(7¢­VjL´D,#Aô.Óš¢D~l JgYÉqñèúå¥1n‡Àßßøšx&>Yîxc%;еø?8* Ø9Ì›‚ˆRØí\!ù;À°?ãr‰4 b~ø×s:¦Ø¥7föo1™mÒÏäÐÕ-nïÖ<—P÷ósbßT¨¥^õ[=Øopuû£ap„›¬Qý`+~¢èIóÈ7“É–àA@çû¢À®üvoâ^¿ fïLG?!ÏW?*îÀ¤¢¡‡ñ'Ò¾e²}E7ô· €ÇåÓ(ÀÅןüŒO?$)רÄ+FWß­âÊŽ{Œ®êS¼ö§ÔùgBÉòmùLí.)ÊtMMžRêƒ7ÙΈ?dL?ýwÞ÷ôúäÿ5Râò}å®÷Ã%—*Œ¨ß"[X†f'd‚Z7{—h]è¬*ÑÈÝ??nuËò8¬‡–ˆæËœ·oIÅ µõ×Ï™”áw2h× ·F !ßîÒ¹¾ç…‘m¥°Ó§”ÑèòœƒO·³#ç¿yÓ‰ŸÉ ú;xoÏj´âÊ{Ÿ±9ÑA_󬣒¨—ž·ÿ3$ÛÛ­n²Œˆ y‡Î êŽéò.©ó\Sq÷Ly´àYR†ýb¶‘†L2Cµó-ëxãÆa¥“cïç¡tÚÙšËg÷žÉåö"¿½ŠGžZ‹7zœ‚ž-a×¼L¼©‘CÃrþÛv¢„^˜¤ÅáÞ|ÐÇ•Ûèg¡âo¯äìþ@,~ߥçNÚ´fçÁ¾?Š~œgÐ Ó–¾¸Ve35ÐESrj²ÃWbåø_ íð¼pÏ©\Ù’±zÚëª:&×14%)¾<ýþ'ºÕê6ŒŠ?ÐúAŽ$osõx-¶^ü„åü˜î”ç!e ÷Ý €õè)ä)ÞûF$ƒ‘.k¢„ ä)WfÎ\ë|'æ§éŒ0˜ú«†×¾[µ®V‰üŒ¡Èï?ÎÜ÷÷mðIô,¬-f¤v? `#§:JQÚ[ƒ4ÌuJޱl“xBK;|‹ÄbŠuŒýá*\tÜUÉúêñLO8‹Ô=´{ 2¨.­’p¯†¦,(XÑ+5s¸õiú¨…6W30&èç}}ý``ïÈ­A3Úïzáf5rä+IgU:×û4Ùà©¥b'·©µ ‚ g<š7iÊÙ£L£4”Æï Á³ÓcÚ=Ú„­´§³€\÷Œ6å}Ø¢Bg™pAõa¦'o¢«ØåšuÑÎû¡ee*3Þ.z£ŽZ>Ÿ‡©2°j¼C¤ÇË2cÉöùï¡ÔoUðºÊ_À­½ ÇùÙõ¼1ãŽ6>¡Ì4fe‡«d­UÏfaÑÊ™´¼L§‰%}0ÿiìQ|y‚÷v?]á'YC?öŸÑ~$¯"s {F)Æq´uþÏ‘Iª9 #Ã7 ;9&ßʉ^N8úhIŸr áû–™‡Ðû>Õ³æ“ûZ\7·Ø«³¥¹AŸ£ûÚNþó²ÿÖ±Y[ZÔ„?3I@Ü­‡; ËîK›°þÃ_e77'ìåEøÇ‰ˆHˆ¬â’øÀCš}Yœ™ý´ÞúÇ?Îù2çŠî3c1ô—2YA‘Écw1Ç,¨^ÒÆÖC32Pß—‰)š0]‘z ü·º--¼ƒðI‚CÁ«žŽŸÑ–½¿>A>Äô>9rôÛbÔ~ôw\-·™ßžƒ‘͹›{µr§ÖçyõŠAzá< ³5ìP$Vw‚ö¦<ù“(ógäÔp–c[iäC Ï/ÒUõÏÏ.ˆm°®ü‰å傃ße{¢'ñ›ûùCl®=kÿkgz!‘ÒpËãg†y‹ƒÍÌuÛŒ¿Ã/Øõê;žÓÁ%Àw7»¾ó3¥¶ÎC)%›@Ùõå£/§ÉÎìÉ( .Þyúr¬ÁËsÖEoÔÜ36¿¡íè_ysÂCL[¯xøPìšk`Ö¿3Ÿ™níµûNÀ³1Ý9ߡټ*Âý1<ì^fa÷»ØÀ’=~߯?†‘4&ÀÓl¹ ˆåp\žš«°öySûd”X­&ŸäÊÇö£,´«ÞE'öMo_„zÑ*oÏ®~™öÎà"è!Š‹%ÉÈV°_€‹À½ÇÅ$w‹Q€a¬ ˆVlnº¹áÚ¹rÅ ]uÚwÁtǰº2á(¯ A@òæPÀñ©ÖĘë÷Ÿ€Ùª÷Ì”oé9¥2‡õþyv²ÏÛ"å-m‹ ›óüw¿Óîx[öéÇc¿‹ÒþÉ„Õ&|¡©oèOBö7mA¾Ýzð™ô9Ìv´Ôi azÔ¹óõÓ·¾;€#ñ=÷—Y;è­ç÷ëRÆ2u£ÏÖüo.ZðØŠ~Që=§w#‚7Eù®1"™óg§<6¬˜dË·1üdÌpμ{£r]¤õòcÝHŸÞ?S·­øŸv1Ù ýIüÔÄáŸ,•ïj„Ìeåî{–ìÜÿ¸›ª0:F Û Ú#L’äDU3¦+ú 9w¢”‚’ý€¬äˆ&mÂ`ÜU;¹ùf+‡æZ¯ªY ¼ìlb`àcy¬`Ñ0}7ý>öpò_Bô( ƒãÀL|øð»Û¿‘O¢±ëøÒ-~oÝþ õ'Ô%Í@+œ€Œ¶{QÖ@±)yŠ„éQ{œŒ&<ù# Œõã†d²'UOàGXT™”€Wu*TèF±5RÊöÅH—Ñ!2~K,x2¤˜« ú°<›™îÊÃßÌæZÙÐ É1õ«$’ÓÏL”ŽJ± º‹ð™X,¹Û©‰ !Øšœð¡zœ*÷ƒ‚QŸ}Ý&Nl¿æ@uoSuT{sHýE.€ä±ÜQËõV½&ŽN<À2o¥ícúyÈ\šs™Ü2>{hÙª!i´Ì6Ó„¡tK¹Ðuà0;Q3ÄÒov$4ñ(…«K¹ì¬úmÓ ­êxŽØúÝ6JD¢O³=“ß“R7EâZÎ…˜²}«-»ÛÜ”}ú:ߺÞÿJèf€GÎ讯:ª©Ðã “œÄY%1©TѳËùD,t#v¨s ¬ÄE• JUÎÓE3_ƒ€Æñ–q…íeÕ!ðOÆÍX$?î24Œ€[€n'IÆ !…®!užhãòè^ÊqGLÎYFûþ¶<ÜC¹µ½µ&àÅùYϤ쒭ƒ x™¯>IbCD÷Ñ)æ„h‹â/1ÇŠÊ|çâå# ùÑ’äg¾´c֯Ϲš®Ž@•àgôCý"•ºz®ÌÛ/u°Ó Ñœ¶÷ï—ýLÏÂÃ)žtØÇ’šÐd_xÅ7gYÂ(* Œ GK@™9ÚŒ‹§(„Ph…á'L od²1Ë/Ú«F²¹*òêr,$ܵY '–à6<ÅÕe¥; õOb[ã5Vßv9d¢ÒH°áÇâ‚›À.…¬cC»×ú¬î¤_«íKkt"{„UG|~`ó"§ª©É0úu{ÝÌhÏa–ÐÜ™þ$Ãúý<ýB½¹a 2Œ%dJ²j¾ 4öwë3}6NÙ3ðœè“¡EèƒNlF§å¡¯üc|çúÁÃa7Û”ûÑÚïJ#Íe–½~Ö`¯Ç÷‹ûúYir4X%€ -Y-޾RNªíÂüQОãçì=ï¶?¦Û´Õn7ÌíÐÆÓŽ&œÎé%R"~O]îÚ ®{ß·zÛŠoßv`p@yßvõ_Êx^RŒBŽò]c¨$âq0b4ñ“û‡²—)c)9†DÝ©Œ9b: R2ìÉQ¸p ¯ölw.#}æ×÷KϞùv˜[Šf”ç—¢fA§•Cë¤.‚J-ð§°ˆWºKŸ©S EÔÑÆÅÄ鯲ÀDŽ}ÂóF¢ðÊ}±—7ŒøñR€‡Xá«‘Éè€ ú6BŸ˜ºC?éÕÑV*Ì’ìÕŠ¿‹‘»451^išd5É7‹ #gžžGÑÇ {£êGöGs«Ÿ“WäîaWMæ&¸óI©Æ=2~ß ýÆ_oÉñ-3wÔU‡§’$Z•\©ï†qdú(Çû®ƒ£Û2!Ù+(!ë–+Úß)°W5pÑ€ˆhˆPÉe$•3mòƒÓô&.&’DU`/Ü™„~)Ð#öÛ²}ÌW€õVŠû3(û`ÜYXþ ãíç÷;†ç„b~|:—][ß Ç¿9Ïݶ§¯Å+{_Ëa˜)MV-¥êüß»§Há ìõ7x/öìˆS•ÎJïøÙòò•¯?Ì÷7j“øí Ø-ËÆhx³ò" Ýcÿ3ìóøŸò/jþƒ"iíO5J”6aBr7æÛñx/zº­­¿Í= ËI¡}FÜý¾ Q5Y¤˜+TäÄ`ö;¶ßèæ?%û+‰M“%AS"'Š&ãë©ÿ~LOÇÀ¢Ç{£˜œ‹·¨¢ÄÞUWFòúG„ÜÝ¥¤£Ëד8ý¿âønÉÚ”Ê~؃z†ëtèÒyS‡×¸› ¾ŠäžÒˆSv ԯ߸‡©ø ùß¹\ ”üãÏóÍV°Óð°œkë‘Øëjd]`Ï0ˆðõ<q¨Ãáˆt~ÅtÈaP¥XÜœèÍ.BôBÐóÉЄ€JnÌLD!sêiÂåÙ }èñõ0‚—Ž$þq|Ú™}_˜_=ß]É.{“Hd0ª^NúïÑ©ùG„ÎU+Øé:~Jã61J€¹t··Cƒ£>îL,Ao®nœæ*ÿ²¾A–šhâ‰ÚîÏpWëÆ ùÚ “ñjPIm™EÞº 4ì;–ï¸XñëŒ(ž&â¹SŒ>º¸k‚7±<æµK-ãº7Êk ^™ë•jhœ†ÆPeš°,5«ªrªP (­zȃAÏ(\çÚ³ÖsËà[S/kÍ>óuoÜ¿1É(-Sdgì†ê·'gÉCs‡f=þ¢óÕÖ:­¢*ò4ðyõø7›éÛ‘8€ÆìžðNõÙ¯A¾ÑÌ}ùai#û9´<¿]8á˱ +ÝïP0»éUn'$˶•ÿÕ™šš£³ ÷ é¹|È>§±Ü•A@¯ˆ„ÓsàÓ4ãOÝ“`Ð5ÀbœÖ ¼vádLÍÖön@·æUCÚ_[Ê<^Ÿ~ÕZ×~‘ö?¢2…_Ç*È”ðý‚°Š×{¨Ó îO8{²¼3‘ó^ÜÁ~â~J»á±»Sìßß‘=pýø–N&Öòcö>²ÏÌf9‹Ë„@žaºªÒRʾWoŽ{î×&(Û÷#n ‡å«²@)|Õ(4dð%%=öJF‚‚PjÐ,†'ÇØÑÿìb£‰£oçÞ¯nÄ“ZÑ[Q!'Ábmk¥¹»þk“@drhUìŸFó?Š–¨2÷Nß7vk·ÁÆžJ?cô¦ÿp¸v~ZçQ«Pßáž+ÁéÑ{„Æ[²%Â?A`^!1f?;‘õí4ƒÒ?ŠpRè--—™wÖ[†ÿúµ˜‘à€.À*¼çï@‚ ýñðá,ýý GÌÁó'\¹õ–À‚]9÷gÕ•ÏÓ!¢xëAx€ÛH{¶úÉò$>³1÷ZÚgÐo¹3É`À4Ô„» Ä(9h‡úˆ‰²åƒ*oõÍ ÏJXÍZ{„§ÙçÌMNëÆcô¤(xã…- Ο¥€Ñ)eN¶’Dˆ×:¦ N)¨Wƒ€´;£XíÐÓ* -a‚J/92½òö‘¹w'x‰ð6¦ƒýÌÄ´~N¬wåÙŒ3þ—«¸øZ*™¨ÜÙç÷]Ò©·ø _Ûó!% æ.‹ç“…ôP‚J!)ž{ŸÚÉ#8Å||ë9’ò¹¤Ÿð&z¢P^ÇœÌè,ëý 8Z|ÿ@;êHs¬ìð«"žH ¶^øVĨQê3þ8ZMŠ×YMžüL9úÏÇ` ÌO†“ëÜC˜–`¢}éÂö¡w<çñ¥ó%û9ÐÖ¨ƒ– 4‚0ñ_#Zö`·%šÂLWŒ”-ࣧvõK¦¡%ŸÌšÄN²'t¯ÖeˆŸÐ؇\¶S ³]‰Ð,RKwþ:õ(4I‰UþYu ¦>{ábº$fÝ´<Å‹“šs (Ä“»Þ˜–/Ö‘óp½ÿ¼š“˜æ½ïsžYж¿+ý^·ç7õîÕÞ<{s–6E{ 8Û×ö”ÎÖA†sê™PØâp–xq…þru)\aKrG ò{³»g¶:}7ÓYD&ùXî4zH(©Eåwj Ú£ÌÈ Ä7é||„–$T§›ÿd!‘Túø9„Ø Cf¡ø®‹¦·À*I+—’ÇxX¼Ò² ÖUCÉ¿§!Y{ ´ûç_ þçe­Í?bMæüHŸ&2þŒ™ðª%&DEëÚW}d‡N×™ Ì{OòmÐb™ùwÔ@×|é2¤02œ tÌtíO¡Ïù» Ê¢Àc˜w̵ЗX8ýÇ©JùRÙ•Yý#Ôd”#Ûì*>Ël¥Î(NÂC©Z‰Z(§/•ãš[¶7#†6mKHF89ü7®HÌáݩ֑ӕ1m`št7)õ&ƪҬ‡˜- á:ì>E´9$e‹” @C> Dó :MGÆí©]ÄuEX4Wô{0LˆÿwZL3ýΚ+ŒÍÓŠ½­¾º¤>½ÍÕM™É}ÆÏdËr‡Üb :ØKº9Ä)§ÝÆ!‚m÷ÙLX¼~"÷7áw¼€Û€?‘‚êk=n Ï£…7_·ßúzˆ¡Ø¸üsjMj$†^áÇøªwÊdáÂOÂöZH»¶V© ?¡mÌûC”8¢97Â#Óù©àǺ•nµ¶A TdT\ü“±•䀿‘e×åügK÷î ·³\¡Ëúç÷hw™\›ã„òÞ>Þmc’îÉ9þô¥KÚD2Ôn˜ö?·ëùÝØŸ?¾šðð°tZ"Å\8v{Kãé'U%žÞê5]¶ ûâ¸AØÑ§’:7„äâÔ\’9³ž œ;QsÃ5À.àB¿†®ÜXÓÿeŠUÕJ¢qôÉqÙh,Mšc™€mÍùƒ‚˜—­5ä›!”4³ËN8f)¶bð¢“#ÐÞjû¯–ä2p¹u&XÂ4Ïw5“ñ¦¤[A™Á+ºŸuóI4D=L_Òeï‘ëB~¹½_©C}ý|)¬zç¹yŒJ[Ü…üÄsäL…•Ü%X~ôaDêÖÖŒîÐPë;B°ŒÚ½Þ¾°"´½âƒŸA"$‹ vKƒhº*Û>Ý×í5ø ý=;@¬ûD‘õt|Éhy£:o«Y™å—óƒÉ_Ý+ùŸDºU<4k¹ß¿Bz(cy„$nÞIrŽ„ rݺ˜[Q˜™*2nöÊÐòòvrÏ•½J9zM›—}”#m!¨÷"ý/•»h‰EÈлs„Ý$ Òç# 't‘Ò¢%VÒÿÅÒ"ŸNÊO»)¸DǺۑ¹¼UvMOÄ“gnçîgï>ß›€}=ž\š….¤–ÇÈ0Ÿ{ÌeöÆ£7;ŸNUø±#÷yæ–/EAÌÎèà†Ä·~}#ÚjŠXßç¢Àgrõ;x5k¶¿bò¹ï™z4-C‘Ï?âO•Y  ›ácjìIPØÃëAþ/ŸÍ Ñ?qî‚—®.\†ÿz`·Ž/ü/aï/\ÜÆmm—xÉ`¸×öReî9|MàÎäÀõ—Ùh§é}—G‡±ÿã$½¶ãÈ×èŠxm|ñð…>ØÄg2±çå\l껹­; 1ˆ`r­Ô!$ÏèwÿÖƒƒ Foý¨ñpëÔyøúÜ…ŠˆÈ¥´0mÛ>fgvI7˜v@k³Iñ¢ç²«ž¤MˆÎÕ]äBå„Ü4~jÏ3_Žþ»=ÄÕ *-HKµ²¾=vß”í¶ßë9¯î#h¼Ãš@òcöþʃü,IÊÛ¦Ó©_¼FšXt«“èJƒb{Ý_"ÍÝaß0dfW¥ŸPBa§©ê0ùeæRüIaC5~äÜŸb„¡tfY·)·UëPÃíð<ÈŒdH¬a´(êååËÎCÙTl¢hÝ+îX.Û"ÒîÒRVˆ¡Xä$ÄÛM4»—Au³\\k=ãb€J&—ëë2¬ÁP8诡Áxƒc ¼J²jƒ== ö7u`n’£î_:ãjãNC:ÛWñlïÉ[wB àe±Ãj2ažŒÑ;öGÛnúÁ´§G‘éî§ÏñÒ*§ ÝoåË«iR”þ^q²Xß\@/:º_î$”ó‚öȘj4óÕíô r²j¹…6ä…_CÆ–uØEkÏÓÅC„ÎÚ @ášÄ÷lÇòê>óäÇqtï7 äGç^Ú¾ÿc4êË„ ”ó\Ã笧àNýË#³’ÿÌi/Dî\¹£ò?L¡y¤Ý x;ùëðN¸[¶oþGrñ9&P°~¯ÊIÑ0ßöŠFý¹v¸ùë·¬+îEnÑ÷ n§Ž¥P„@ïp«*™9ÅöB‹eöïGë}$£ùOªëos§dq=ø¼‹FuU‘µRÔÖ¿ø_ä#Ón™¥™FÜŠNƒpy͇hOqæÓY7 ²¿Ï5Pý—m¯ÆÒ7ŸÃa& CtGûa÷(±6£fÍ–’sc'ä.“x¯#¾„||…&\]Â|¹Ua>$¶…ÂEÀº d'­cpqEWÊ=‚Iï+8û 0è!:9º9Ô.žúf¦úTÀ n}‰ç¶üØÐašà·0ó¹á¶ÆÄÝ>•:÷C RõŽ‚¼Òjäø¶Î•·ìÈ U â¼ ·MÉ>¬‡LñøN E-í+Q§Jk×Ižz•=?®è=Ù+ðÁã«ôȘgW9Á©Sr8@½¬‚Ÿ&vɬ8=˹ʸL[”å+I›†iûή,!ž¯èm2jg– ˜õ»Ó¨sW»Ìë1Z$ä>Ôsã~ i^™Õû`$"jGSi>É.€Íó¿'8‚쾂¦åžÅ÷ÖYÕšÆÝï| ¿ßK;àïo'æŸÍtyêQ¥7û‡’pŸÃÊÄz\†8ëöëãß”g›]r:P®ƒ|ΰŸoñÍ_âÕ^ ¸Twê1|Ëúªþ„#©79ÔÈàþaC”èE z^–Óm/¼Œ×sr.xþ SR b¡”JE ‡óûÿµõÉÛĘ9Œ•;—w}ßå÷-ŸñNK¿mÀßR×ÓTµ#UÞ×ùš7oK9º í(•!‰5¢+~jêÛ`¹¡‘¶+®zF)ñá”ýXâŠô=Íà4¨×y|eå¾üÒë6ùè4®PPhÒDïg×htt™Ì'$B…¥ÙPšeøcJôL±4ƒ[]e:<ÆN™÷øzjƒK#ŸünQ+ù|öÿi âý#ùµÊU‘?—}Ž®}ËÓ)ÜV§äé°‡ñ-Àà>vn3¤ÓA~Q +%"’Ì(™­rWù)ͬ4b§iÂp-OoƆgÊøzšƒz¿µõ6‡Ù¿õ‹'ŽÆ¥‡·DIŽJ¨•íó$MûÑf‘ö5†÷õKÞ"Òb>¦h^ ÇÕ~ëtxW9Áº\n­¾Û•£¼ò¶Ád}Ü8k<Úk¾gG:4IðmHªpë}¦}crNlsÇ?“K(ÛöQˬþL¡Ä˜áîè¼~oÕ™ŸÍ)î.s5bPD#Xô˜Ì@ã$ä (ð’QãKíÙ\–ïÕÝ•e['%iÌÐK†’_¯ÁÁ “Ç›Á{yˆÞùò%ýƒÒ¡Èl€O·/¶ƒ¨•éËe'5jé%šÖz|=çý~öR¯÷¨vÓ:#?Îó'ɽ‰Ì!Ø£)×>ŒÜQýÄ4gÈ@Ì©'R‘é÷×Ï»ZîŠ ¶)µÏåÓ©{*:xæÚªÅ&C¿Å€K£Qÿ¯"r8d¯Úà^§k‹çUs%ú½½+Ù^8L;&y'¶ €ì ì´=ù3Ö¬yE‰qg½h/'&½“õã1enfÙÆ¸ÀXñhù=mƒ¨6Pá²"µ(¥oÖˆ—ñ§^qÓCšò´8µÞê0Å,óeH#š"Èye2ÊFÀØ8Z]ºOL£$žGìêŠÖÒIûÑNJËô³ƒÓÁâ#ØÄÖz_ͬ… '”àŒ)ê8†b«¿žpÄa-r8í(ü«×¶Ö~TpúЄõ.©s%Ž™õ·ú‡øöpð¨î7KRlS~ýVÝ•ªHÕÙ}÷ñ›ªË,-aÑÙ­£ n€íÜ}ò´qèO¥w£¯œ4ðq)vXH@ƒ·¨²(ó;@tL*ß Õ’\9§·øçEoÓë™­…Dvº™·5v}m£·(>À‰¤‡s ʆ4xþ·¼ƒUÍçØÙþ§8ÐN/ÒßvÎF[t)IŸÁ”[y•3:Åv&–ŽŽ\Áß­'Ň÷ªì )³oˆ÷2b"ÿe¿Ëz_,´3ö¿eä=±GËÊ¿¤¶¼ÑQ_Å}ø&FþÕ¼Wðíqß´® xjtý7ËRäUµ8‡ÇÅŠcåõò"ån":¾žó“#˜ø÷Å— ’j=}Ç‘%SÔ á) ®~ª¬B˜1D¾"²(IÕ þFHkr¾‰‡A'yb=àâ µQ‚)œx—;IË·‘ë{þŒþÒH7¨Ô½Ð“J5òbÙ¢ÂUò´‡Oç»·E²ñ#ºÏ‘ò•Ž¢¸<€ŽO‡¯%ÜîùN½`^ 0JøÑ¦€@• O>ÂN¨vpñ¸ºß¹luÔÄ;óÛ¡ô’XØ|ªfCð§Ó[G,w çL/WqÔ°Œªþ/“”,Ì DT +F’!ô< 'ÓtvùvL—¸qÄH¨Á‘Ôûu^Kº÷HWÓmWË›ìîÙ´Š–Ýk4µƒIüT†º¡E¼´¸ï-LÐ/Hc|“;b¯\¬É;®(EÅ÷¨Ôñª"`hé ÿ±<<Ó¸õõO0Ÿ•Ç_o‰#NqääѨ Àˆ …EÆÙt:«»‘õ9Œ<­é+?ç^ f*©mÖþ¦.'‰æD•)Á_žlh©¨Wèê4qÆit(ã1?|œí»MZƒ(p+À}ÐO¯ÕöS»Ù@4Ÿhö6Ò 1|Åý›Þ^åâŸ\¥ØN¶R3þ»9ÚŠëüÃ4¶!+|ó—V?LýÌ–ŠÊîžõ i±# Ñt·~ÆÔ¦R„°I˜ä1ÛrëûpVÆÇu‘ÚOÙr ÑaÅz¬¦,Z²þúW0«Izü&¢ÆNÈOè’» سŸ(Á9¿F±AþmóÛZ¢QYd#‹·!O^Jœr+rO!Àaê¦dã¸}ÝH­›Z4¥'–¨Á²#Ek WA%¡°A÷ ˆÅÅkH¬NË«•ò4sºÏýƒgJã†Ùòoµ„=ÐÊÔ!þuVØABOqˆÌ/",5ÊkDqî] ZÁôçÈ.ÜøJ>uÁ—óŸØò£+¨Õœ–ž@{'kÂÊøÅE¶H~h0šT¥"ô‹ý«âe‹€U»gù7Åż¥ +‘þÊy»H†ñ³þnWŒÕ5)G‚©â‡IŸÛ_”2|»-ÇdMÆõ2\±ÅÄ}Ò¯:3Xõ£4Îí»Â0(¦àÞò6†¹·XÊâ#2_‘¾Ô³î|ÚÆoÒÐ|Û2ÿfO+‚óƒ38ËU€¢ar€¨ü¿îv;}úQ|ƒ®Ë~3õáNc³ú¾å²G%Øõ³ {8ºÔämžÆ_÷Šéû½§øÊÝ=§Ã~Ù?•`/Jòî#öÚ$7 ÿFÀõÞÐëÆ^Oåݱn>¼¬lå ¦¥íåÆiaöYÚAßÁ¼¶F OB)ñ››”FvéÕ¼ß4¼®ó÷×€S˜Îaßp5˜/5øÚ>Aø“[ý·ñ²íCè æ8Óî]#P†-¤ˆQ®¯.ª8ÿ{Ù|n\¸GÍ}b&‚¡(ÛùO,4ËNï}´©íušè¨ãÄgÞÁïÏÊäþ´Ù*sþ¦OÛº\@þX«öbüômí›K½Ü„³a$‰%"0ê³½u!‹Ã¬º1‰†÷{ˆ#r/çr؉– õòߣ¢91Èßb7D|þŠ5Äl3§H4êøÒ|Ä1Mü ¢µVÃþ7õ _u~jÉrQP8®ßGh!ɺâçE¡(ÅÕ²ÈñG0‹ ô†ž·ãg”†XÖ«³“ÄbLDŒ¨ŠWâæM2ÝwËú£_Š!§¹ç5;¾m»Ôjrr„X€?&E$=ŒDÔYOüêÛ¼H·FêØûCð/¯{ƒ*ÝF ÷õÔÊ‘tz=Êu&0\†cÎÒ.le¢&¤çež}\:«iX<{¥»}}ü½¬ÒŠI…ç¤ ½¹p…ßé¿\õ‚zÙÿ46ò¯:üdmW×¢ç ¹Ùb6Z¹ê½¨ ‘ šœ3P†6ãÅ|_m¦kj¥! ûaNÉþÿLýæÎB§A¾TË'rPTt&•6(PWB ¯¿·üÏøpßqÝÒE2­I Õ,R~JË»4i°;ëí.NÔ¹º½$ ‚ÓðÒÿÜ«Ûf9¹-A¸ä+FuìE änƒ»,ŸU'èâÉNõʾ²»7ݱ2“«æZóÄêSa+‘Isþ!ôÍ[‡¬vý¿Ü_'u©PúŸH"J“ó7 ÷&˜°ÃöUøÖ’Y߂×!40üg>(äßíΔFiÕ»äÞ]­Gòy\(o‡fnÎÚmšk’­á–pè¶Ry–R®rß4ѺÔ6Pƒ²KŸÂ ¶—³ª¡w¶w%„è½I‡B:“ƒó껊a?ð¾ÔH:›¼;_H‘e;²}â 5(W¿qÀ7ñôшßúÎn÷ó¿G}<¹Üt>¿M¢^år›7 rß'AÝ#hå·/×vÝÝÊè׫lè”–Žº,Ö§Êö“9 \­ˆ¶JÊáFè‹8“š•Z6p–—Ot’ÆîUFXÞ‚´4g% žŠSš[1Uôm6‹C‚&ôˆ^¦Ah°·:=‘ôÊÚ1~UŸ ~/¥,J¸)±™Ïo7pChÉ ^ó J‡Ð5&ÓÃ4E Æ å/‹±enè €æ6w|V•¬W_5™{ÙÚ°;Qu°.ÍR‰*й¦… ñì4K>ö•ö¶U{E—c»\€ýzð£ìî[YFnjbÂ¥)'Ö´jÂ7ã¿hrCo­ü w{Ö9¸Ûjç©ÆÍã(5áqÛž™-`Å¿î§/Ä놑‡#¬j|þAÊòéWPW[ËŸtüôeß™˧ÒàR’d˜*êSØÏÓšêÓÛüªøíõð¾¼´œÜ Ÿã‡JºA2’A²€8wc ìòê*7Ò®*?íÃ+ø ‰Ù¦å nµø¢`úØÖ0ìYl½M›ÌjêO©­Ð÷æ§ÖvåKwíe½¬Mu$b'–Ÿd;7Ûßï—ÙH¸¿Éq £Ä93TrKODbë |‘éu¿?3¯“üX_ípfInso7…›šypthÁ¯ýÆ¡› 8á*éßsÊ$Bºÿ]f—’HäÕl—È”`ã{šøª@1L[ ñ}ö…CÿI€²© ŒK Â–Ȳg±»C?UÙÝHGœ5ÅbÃeKsܰYôK5f²<™¥ié&bÈlÙ\"ëÄÀ#j¹ê”¹ï†P¾T~¨óùŒþ¡Ú§ò8éðѧcY:WBtˆ Œ×äòÛeêõ1ªXP˜¿#¯ÜjóÊ­öû›åøÚô C¢©«f?@°èµÕœ«è}ã¤}’<´)=4iIî:XN’M¶Ì¡õ6µs©÷±œQãò(Z&‡¶T¸ìTûJž¦…¿À¼ã¬4Ô[$Ú´Ód·ÖñõcÍ^K_æqéíŸNå•W³“<o{´²8¾… >XÌe7ne­Œç0‰Ë=Å[|E¶;gØ#ÊûˆÊý1ôœR`>CÈ×ýêSjq)äóëÚ6œî4¦ù‡Hu‡ñ“‹±Â±4@ÍÖc—YÏô6}[òßQÓª;ÅHâ8€j¹–@VN§’-š·AͶ· {YÕM—òC«”Ç.ÑʹLáÓá Xá¯/¼dÑII3ë€åfHñ¸zñžþ2®8‹hÃ(5bÕR´1Pä&ù¼”›Ê\J¦å æÍ¾Õv}º @¿”øÝç 4®®Ž…w»güG{'¦çfU#œÑ ‘\¿)ËÇl3B@£Iæsþè ¥x‰Ø¢k—ƒ Äy·n´5f*“`êSýÈÔWê×ècÖ-?Ñ 7jþ%%[×üîûžr1Öî^¢ÈFíþ¿ÛE±*ïü…aú[œµg·õhJÃ3{ÊŒéq2ò«ÔX8¼«,!\öÌ-M³©%Ž_°0Fo›Š—CûebA@!šÜª®Ée„]9QkºÑzH#Pn„¸U[Û÷³UiôG)"NþY!˜ÒeŽÍpæ¿Ã_×fð-Å€Æ ÝuËßÛJÃo­Hû¾Ž•d¡¼=@ã>´Ë|6_?âú¢¨ØÛŒ+ÄMô õþœWÉÉ‘.ÖÞûËñ\“ÉÓé–kè—}QF ÍÇ1—#Å€ŒãTÈ*s·´ªEŽ(];ù4§Hû‘³2i÷û’€7i™±¢ÇÓªn|=b?Y­Ï¼wÈ "”è–˜‹7–²´6Çì".47r¹ î4Eõ­iŠÊh›·FïÚ®2éUþ/…ºçÂŒÖÀ°æ.g»›¨‰uòp ”‡³{.´ûìö÷Ž>µlòüÞ2Nˆ¸ä…ã ŸƒíêÅuO;úRoMoD9s~Cþ®3¼=´ów¦Y¨›ÍZß/fãªS³ä¡Y£ïs¸‚ o¥Ñ6ðË´G.X¼"Šn‘ u`M˜XÈ>§›RÔ– #ðmª¼ج\}æ~ÃO¬`o¤õº‰~ò±„0ý‡ÆÖ­òãóÀ æwNÁ —ˆ×?yœDŒ,æ´f\'ndïäU€ÙÛùkßí÷ûUoâ5åÚ&­mûsöÑ^˜v˗ѧ%”9ù #Àpy¾Uô¦»K„ª££MÖ«þÞ¾{­ÓuâÛyRÍÄV_°tTn#¾8é´ž\jÆÄkÄ&¾œd(å“7Ϫ9}š6Ñ4[ÿåM ø4¾,üÍ:½i]l ÓnR&ÂHb6/ñ©ÆüïJ*’–f'f))^ õö–qX~†Æ8ÄœÂ6I} ‹ ðL¦ïHG¾gòóÿ M„œ;ШÝIöilˆ`c'¹Šã}’ ]¦­x:Ü"hÔäûÊŒž}à9+Ñ+ŠX•j_ #ßž7öoZ—òP•«>|fP‚}_º÷Ñÿwì,~ˆÌv|•O­à’6«‚o¥æÂb.4þшý¿(µK«Þºû@¹û3y×FZT´}å<¢Ùð— k"õiSp ZãvžˆaªPÊe`#uUŒ€“R Ã­ÿLçÉÔ;D¬P§Sæ‹Â1ìÊ(1,}ö€$âQ#mrÉ2"]éœY”65haI=ɾ¤oº e“yFׂÛDøº’’kw¦ÑYHÅp:m¦”ä"XÅA ŒbæûF)Á(›ÏËÅ‚o™³B뢟ì¤þ0Úôì˜Kã¯×$·œcñ –Tÿ ðsìž\þŸ-1£òjÃÔç²è÷ŽX?•nùGâZ¼_Ð?ÈOÜ%9?ÖúyÇ¿swÑ>ÃŽ^|í7°íïmóÙ–Ø}>á{x’ߟÚŽ æàÅ™×ùÉÝÃtFõG×­Ð_xð¶ÕB??aB{ÿ‹V3ˆR<ú[ýr¸³Ò`€ úN8¯¸Ü™Á ¥?©ÜÛò >pÖ¾oɺ. ëÊÕWÀcßå)êå‘…[<åu§³þÜœ§UÅöor—ÈRNpJ_OË~í•ã}8Ú¼û|`s8ûvXT(t|,« Æ’ACò×´ã&›vIW$KîîZ‹hvˆº^™‡*»¢HôF§O/h¢Æ¾•ݸt< ÷ðM¨ÊÇíØŠç×4u:î²Ü)ú©a‚Æ#6Yþ¿¹zÔèÊÛø»Š¦6¾[ú{xêòWO-Ø}¼Š4€°àÀd…ó¶ ÍÛÑÕ·ŽãëåFW™‰µQž\ó–1Ûª¥3sÆuÏ.ÿ¹_'¸I¡0š»ÝÇÕôS¿ÉêJ!Jî?o7ƒO!~ß^ÚNÂÛ܈Øî¶íÓ°?.Mðâ:jÇ^ž:Á‘Ý*ÕÉŽH\Ç¤Ë 2Yäh4pM' Lo¸1Þ26AEQ‘Êkh1*JZ¦àYYþ6ìÔéA;Åà4Aùbâ?.Dø1à#ÌÎhý:ÇoõN„²3M9å©ÇŽ+¶¢Èß Šd#˜öòžü«ê9å 0Zþ=B#Ä‹6’HEìQÔX>Ã*üóI¸ø† ñÒŸµ„„Ë´÷4çÚ\…[³{“Oé¢þ=¦œHîè¿´Èòî£û«GÜØ†AØ~áÌ2®"s]C>«÷ÆödA'õû¤J¶n]9ÉÎçl¡ódð(!Ô Q m¹Á|›É& Fëx‡l1¥Tß…u%UšÏv~’çëL¾¹7;Õþ Dܧ$DÅÙûþÆÅ0¬’j;…9†¦hGÖ“Æ`Húã/êŒx á…|x™Kð: PÏU.ã/k™cý£“ðó/Ðj¹‹ŠÿwàJ?øµÉeæÊgòÊÀ8ëÙÐæ¤&{}xˆB¥Ÿ_,¤ÜKÕiôÂ2cb¾ß_ªIqkñÞ“»×Iψ Y ¯¯o»¡¬ä[ùoã ØþÚ0ÈËsÌV⾇AÚSvìRb¨ÉmãôÝåÓò…kªP<áD»˜ð/—m~Ñ MV}uü~„ÚöFˆ–á ÁVÓ?çqæ‹´õt”>ó?36ôŠºý4Ó¿îC[ÝYï&SÊw©LÀg¡[+ø KôJþ`Ñs¸þyÿ´Õ½öèéü%Ο‹ß0K˜l³ý:»¤r,ŒÓdÞ¶ÙRÑgE[è™fm€4{â¼…þ°Š~N’ý$½z–ý[ïl“½câžþó×Ì<¥ïp?ž‹?äˆh®\PI¤spاåK×ìTçæë”ótoô…㚪“wP†¾ŠæwÚDwA~XÖÞ) ´6Ïõå~íóCvÛ„bû$reœ³V©ÊbÎ߯=û›ÖÊdÝ;º3I–¾Šöÿa¢î6ÊG¤Tv¢OÓøôÜ¡¹®h¿+Sãm]ÚÆŠÛ­>Æb?™Lð–£Â-ýì+»¿Ù¶;NÍÝ×zíú•^›ó¶Þ÷Üÿ ǬçnúË pÀ¿/ÛðbŠúeŽìn]§ní†í‘-%Úiþ17ïSkæÏòµ Ë`²ÓÞü}(E~©Oá÷ãd)Ádº‘3qÓùi÷˜&Þ^Æ0TqEXûæÙ%á^kd{5íÀÙo‰óbî‘$C®í³K¢z‹‘ÆÎûO¾éF¹tE¸ Å÷ûëw/Ó±±7ŽAË–¼8•-?N¼›„ò`ÅAŒ>¹±0åüz¦¥µáB®DêÖn;Áë*àÛ°z˜×÷ÖVõ :RWc3Ê+I½@ó€Fª¤•LHšµàç å2íÛ÷¶ÿî…Ú¨O…›ãË¢‘ZSçüªiv–^,ÎTÞtøM×Ýy0‰ïÊß—aÞÍËFÔ䟂өÿBãò¯²ÐÀÏDˆÂ¸Ôߪ„Â&ªR ¡=ÊÄ©«bäNŠÁ ì!ÑËäòéQú4*i¢§ß(©ì¶Mˆ™™$å&ø/‹ïB2Çî6i¢2Z,³|¿´Â‡®êX\jvc~h0sú¥_˜á–>W¯xj]ºl$˜áÈ¢vO¦~Çã[¥KþÑGç«CßððJú¼ƒäþ¯¿ò^"SgQÿy=&³íúœ-âJÓžhgÑ” gÖÛ‘P;/hÁ…öšP¯jû! ùºßµ™·…ÅOfkýœlS(„P$ì§F|{KL»KøI|îtìZz+»]?¦ØÁõMcþžýšl¢ƒÇ5¿XË·o¤ ˜¼Œzþá×e6Ì2n³KÙyýŒC§%ÿŠà]Ââ$6'$M¬L§ÜhÈRw\<ÎÔyGŒdzÏ[Ž=‚n'ÝÚ: ÿ©P~žŠÐ;l§,Ÿ¯¥D°uÓZ,ÒsWÕé÷‚íÃG§þ«`G[Ø«Þ(bŠðåž·.5«™Eu Ÿt5Êûs·oTؘqGŸC€!2íúk‹”­uHdÀ’•Xtaey¹Ö vÇk«ú ¹¢ gž‘KùvÌþ¥ {¬§èLÜ4@Ã:¨±€@7~Ëh=}ã³9fî’¬»(eh¯òs/,uæð˜/íƒÂµü³^LT$ó¸°_Ämü-v¨YáÕ©zûÒ ·_ÇÞ×IM®È.E8ßî;$±‘Œ¬æ€bŒþü‹ùOÌfØ0mýO}Õ} Ë÷ƒÂŸ™ýÙ{ú-ö?íwå#vê1Ľn§@Xƒ/x)ˆ|ñ- S>Ô§¶OFh‡Ý xTcsT$±¤Ýi!ÝÍ_÷¬’°›:!"þF#Müè\ßfÅ¿Ôôž”È‹‚-ôC±%$)ÏdPP.Ýž QŒÚ$¢‡rgOÒoºH_äXÓ»„2T‚zbä ¡i¡Œ=?Eµ×±!vÏ!GûV¯è^ÊŸúÚMÆ{2A.x‚Y¼gõ¾‰à¤(e:Š;~a¡ü}Ö¦>8E *ì¹õ²*Äv‰ÐEÙý’‘«),:Ëw©uü 0~ä®CËÐzšCÿ¼ôãòZ†ì]eœ2&qþqÉ¥¿‰T½ži¢‚KùùøÏ§÷]]šìÂðà~ƒð5ýÀk áƒûL6ÎúóÑñgäøs5A!°‚U¾#TjÉ\!è°'î}ÝFÐ+ ¬ð&Õ(ÿA³Ç>¯Æ?Â5Öhë>ƒn¥³¿¸¬¶è¦8Ÿ¨¹ýoÙâ,f/¯ ï-æ„{;‘5AÿÇ(_C~ÒÀõ¤üÅì)«ó¿ŸçÐO¬ðiá>îŠÅèMø8i^#j!”4|»ëêÍýz{1¢’ô۬ѰÁxªvŽ±Ý Ê¿¡R&«K˜±ÛEuz-ûN^²,™ltÇjãUþÉÛŒo-pé&ãýƒAâ›W`žÀO4.¢T OwzìVôr!¾ÔkõñØÈ§FR—Ÿåè{f´[ ²/8žë¸ú«°Æwã°™4>7pŠ´Új]‰)¬G4>ëÕl¿ó—º¦Àó‰Å×,a Žv$¿ŽŠÿþ椭;<Ï ~¥šg¢>ªÛô¬«tþ08•ÿ©(tf]'øäÇ£’ú]#ÏòIäóÝ^9Uåh!ìO3Í9—‡Ä™‡’Âdv0³ñD¨†èA¢X•d}pägù)SË9§Œ´’ýmfžà™a4åç~0û™f½hÁœ…Æ\š QÊЧ,’ Š „ï‘Y)a1|â–Ÿ›Dì  …~Ÿ²6ô¶Î̸ÓR;'sPJ?ð Ó/t­ Rð».yn[Py²¶ÓÂcò19,‡<ÿ3,Ñà7±»j*ÿY<é É›K¿Ëž†pV'/n8ÚUÆ y‘Þ2ÝY`—ÓM=ßnù‡åŒÔÖÁn×IÄóN«×õ9>¨·¾ƒâ<"ˆxÛ?±ª’ùmd„,8Àr…½²Ö#¥µ­%Oê{ÒФúÑaBnq94åϾD{/ÏvµÀ|­¿i ?V‹'˜ÄDxõ ‹Ùã7Ñ|‰om;S—øû§8|Ão±ëÁ‡¸ñîЬÓec-þK^µTìz6\ÂGÀ?°Ñ!e ‰ü侪ž$úÀGàQ y‰Ú/U4I™úµéoåö[`Ëâ˜/c)A³?9²ßÑËä>ß'”…›onœ?¢½›ÇÙ•ÎzAPò3£ì}~»ë¬¾6n¡ÿÏËÛbÐ_¸ºùg§#vmñйɹÆ¢­²¼™Ù„¤%{ ‰ÌQ>¦¿·©¸;Ê߇Aa­¯0¤xÆ{©£]Íá‡óØ‰Þ ©t„{|#ÆÏüUÁ%î^D†@Ž“t¸ÐòŒn~^ÿdü¬Ð¾b08k÷þ³ M dÅt„Ï]¥s+Ø_aÓV~}Ù¶_B ¶o5f}n•Ž_ª²[WÙ{­LÏØ˜~«IdÝðèÅÓ~jPœ"[ûW]¼~/çýÌ65þµ\»ŸM28.J$þPGÆz™)è{•ê"íÇtMfµ°EfŠñ ÛTîkè¸Ý_ f?¦P~Ê/²‰1M·è×Ñ(/‹½=C‘m[#Võ~àCÉÇF¥`‡ç…U6âB»Bjã…9Mnˆƒ4‡šÿ¾o~Àý³@J?†×º¶œRëWÇ} ù¾ð¬ “Rz-Ìý´þD÷ð[z{Ý—ýv‘,²O/ñÂu¸)O0¤Íîý¨>ï7†‘ÜÉÓ• ޽÷2ÄOR£ž… _ÇRÙYUÄ-TI„ÑŒ¹— aÊíǪ mÆã¡ürN¯É䨽–hh!uÞsìlóYçó ˜ÌÂÊsÖé‡QÕ:Kûk×Þ™¶êš1SÖ“:u ˜bôaà-Ï,½OôÇÏF‹j/™3Îðhb(×heasÌ: qœ+HmbúÇ‘Èíúr¤ãázßDgZOWk†eÂ,àA¿ô$ÏZQ!”¦ªy6mßøW7“/oÈ£1©$ þƒϰ;ÞôŒ7z’ ·y<-cúîQ–ÀÛð«=œ€¼½p\ƒ#`èô×’®£São*Ùˆ{ræRʺ18À zÁ_ކØSÜú”ˆ  ?ØIó¸wdî*÷ÜâVgJ°6{•:{W'Öz¶k.@ÆîÌ!%XÇhªOOà-”w?’ðL {¯—Ÿ÷gÏpiˆ‹ýêC”s»ôCìó^… ‹ã[s<:Â>g4Ý×)ÃlܶÂÝ, ºÔ÷Ó—ºÝƒýºù»ybI1.³hjï ëÚWF”Wsâ"bÇm ßýâ…¾¶þ9fç¢"ÔLN›h®±Ì«ÙŸ2j•Å ?çµ”ùóîÞCjYß¾•ŸÝ½Üiw¦d–qçmÍÿ©‹\ýðÝÑ®z(›çe'`Ye ñ\E'þbX ú5‡þâÁ-8Áv­ gA”“" É(ú>'”*’\Œ)§vöÒ{ïL´ÍŒG™¸Æuîøìþ€—Y›"©èÅÆ‹ŸãUõæ¼ôÁ V•¤¨Ò>í°­‘"üK6W™ºÐüèP%õú‰íýËt›ÔwßÑÝÎÁWµ5 Wå—Ù´˜¶mÈ`˜cÈ`^ ¢7/æ@Ú…þÎc"oÊŠwÜHiÔüê~gHéø3hññ©FÏ¥€ Ë±€>…5·Ýï¹@Õ™Æ÷QÈæúÉ l G'ÖCÍ ÿ2°²PÖùÎåƒ*àvrчíȼbûBW reÄKùÜh±u éÆR²àicâÌWÂgûþ9þˆZ“iÓ‘ «ïz"#:¸5$z÷Rך{Ìž4?2ƒ4ÙÝà³4z>·ø?ôyfY&÷cçGs¡eêŒÛ¢5C,¡–A¸zjê 7ôò³§÷ÇÆ¡êÈs|€¤d.×$‰ Ͳ_Öe²L‘»Ê¦×!+g–S[Ýé'4Ôo|Ë”·ûÝzÑ-[m] #bŒ¶¢]4£šç¤ŽÓ¬ú/(4ÖIzÅÕJ¢«ú}iäi”Ǹ9xéÔ¬‰’u~m+‹ßÊôÍšhB¥YYƒþC$’ÌK¯ÛºŒaÕ*`ë¦ÔFý ~ú1GDÇSA¦|†Õò¨½ôáÃi÷`”žt!Uœ—Äu‡W°¨i¶è'ü¤9CH„!2æ{2kl²¦'¿IT¡ù*ûè°©.èHô9ì;ÖGʉ³ˆü¸å"Ÿ¾’[`³yÃqJdr¦rU;8¹¸IÏøçDä{åsý§þ½æv[yˆ”Šr¼L>xä,þeÊ*r›ß’5®[’àIvþ'?Ço¸Ó)"9É$ñär§Ý¢xCøf'‡ìd¦ÔÇ‘[ãO&*°z@˜†UtõäºßdèÞ2§¿-Ö¸V·4OaŸ£WŠ„^ÓÏe€ôûÃû“˲ÍíIcžëç¨IYÈFç(ð°æÂl÷ÿÌ? Ý»MOæéN-#O&ºÒ mqMÄÖÄšT¾²—•ˆí£5/NÙ*ºr)Owãî.À§¾5nù1µË[QÞït.¾ã˜ÀpT±óB,TOªî®3X“OÅyyÉ9 ÒTÌüþ qŠ03$Â|ÛÔ·ݦ)ô¡ªõ s­I]F*H&ò_‘ÇQ¨ ·É«ºxþ~u·(‚æÃw&æWYÅXÌzê0=ð[Êô‘{þ–9ÒÝzŽ%¦U†]|Ǩ\¾œ}ƒŽ!¥æYșɕµÃ…°^Bìs'b[–Üå@B@ÔÒöê%"HÛ0ä0œÅ^ –n}­ET‡‹"£MQ¨/s¯ ¼®Áª8 &+OÛJÒäÙQí••¿ìv‘Ívišü=}©ã*¡êFûS—÷¿Uøk’FfTœ:w3ýÄ 5+e˜MpÑrׂ”J' iï÷Í•¾y,Ûº§Í½fð+N5þj¯Á”6HT²2=Cc¡Ì¿{€E‘zéíóîN©Íp‘É/ô’w¦îèÐfžôít1€Ja#L¤ò4Íø3(0?¸é-D]yÉXù)r ¶HbŸ›ë·1ó’CÛßóšçÜY Úe´vzÏ­C>ílL†qïêHíªÝììsa|Ž:äL^u뼟cþ¤¾•^<|ˆ£Ã'¥šAM¿Zx47€As§Jú °‚¯§å(úÃx#—Ù1м³$s} Å~¦Öö׊ªQ$¿xM‡ðÞœ§ðšï§§’¶á Ÿ—ç‰nÄPÕæ­ÿžp5ƒJ3aŸÌ–z×]¤JøøouÙÚµå7àØ@{!¥€J#œ³¢‡Zú$QW¶8O¦î¶}v>ñÖ9‘EKÎù•P=óàFŒ€ÃÖL­[þBǪǮ>ÊMçWh0²N¦Ö2?Œ*ÁûO^ÌHa´½™.– Çô˜“6ý1„Ú=Söw·[þS7™’y§fêòæÖxã“ÿuÊ›Gžÿ/DØøj.¾ëWìì°ïA¹LéÏݱ =A›ê@«r§² w—˜}hÄ9 Ç€Nåé¬è逮æEâ¾zÄù 1lÿÉò3½ã“ÿ1¥öB™ƒœ×eV>ªwG®I¿ýZ—JoÑ×?5f|ì(®´.DG=u5F‹#*Û´XK`E5±7[‹ò:,åzÆùPùÔH1 _ã˜ë‰Ý曑‘[íùãȱ­O†‰1ûôY€zR#J0×`øîñ¡þýRѯÜï•‰Ð°ŠµL@H!Búkök^™ˆñ6¹øêqå,Ö˜÷»švl?â‚VaÊU½ç[–Y¥ Ú¼ï ‚ýìÐtL:þ€÷Ï®òØo×É”+†p¤—K§ÊùmüÆóh1GCC¤}olj 0ûýyûšä³DéüðÒŸ:ÆQ‚Î3ùï U(?‹'¥­kWËÚ¼ýqÓNª?Ú¸’âþ4“¼ˆÊ×Dp¹µá(92‘Z*Ø®Ú,!h|Hèé½’¢—é«HFMQÔÙû‚¸jšÐa»ÏÌøH'«Ua_µ•'ÐçÆÃ‡E,{Š]5„”Ø<ÒÝ·Yl¢ë~vNoªúb çmÜ–n ¹O¨0Î9nÎ7yÒÖnO5(„¬¢ú#%lµ,¡HÐÞS6°êÏ(¢çÚ7egŸï-¬íIC©ß£Ö šƒö-X—Åïëî1”oH#gX—-Xk¡‡·jóŠæ\X:ï5œ³Ž?¹hô$øÞˆf:ÎR&;ÿq5X©&®“¤BTDØÿ ý|ôaŸ£þÂjëÃó‡>½1“xDUë¿à‰ŠÁ€¯Ìiá‚…Ì2.©ð6®[ß™6bÉ´¦»d쇲&TUÂÝr²žF2þÒ)˜–8ÇùË'ø¬^ÆEýÃiê²c².Hk®]¼e¨6¿éF€Õ¨8u@˜í ˆ.J H?&•v¯ƒj@gƒâeLàȪžµN½uvy,l¥¤ÈÁ7Œª—3)w`8]Xá£í®톜÷e¬õ½ó–ÕGg£‘6Á“ue#Ñ•…¯¿D÷Àê犷øbB<`è¿;Æí”4ª¯yÁq£V…wv¢†F;uÐ/síGìm0ûm ‹Þ„ž½ºO㆜¶‰?¶Í ¼÷Ò~nˆÿ¨ž§õÝ4à™j￯N ÓâÏŠ^¨ó‘µrqT#°íÕHªD”6¿æ'%ßá/‹êZ–3'ãùz(@þ¿:bý/ÄCSqŸ<•¤ýX”™ …S]‘á|ñVçWëwª^Ãê\­ÏºO$åáÖ?Æ,þEÊî /7Ÿ„œÅÜ®0„®&“|pÀ‹«óSr»õö0ín«/¬ªåWÎ+æøÿ†#MÞ‚K÷^<éQ®î̹ï‚mE¨z‚0&þ¿Ò=o”h„Æo#Kz¦kì±¹þS<3n;Ìwß{£©ÃÐÕåÆÌãLFË›8‘@S¦ƒ 6â¬Û`@*ÖêþJ‰þ˜ì§Rî9u6¶·ƒ?H˜; @rÌV¿}ÛÙš)«è=©ǧژ—ýß„}7>BØrÕqrt7‰ºëÚùD}è‘ÎçøÝî‡õ¡dÌIYÌÎN 1£^)nìiÅ“Pl¬S}I©N©îÉ·äíÿ´ÿ°Ñ®ûÈ£yûhRŠÚ+—†a•àxY¿èu-¹­²¼Û{<ÆgÛkú•ÌçÐGÅaåÖêG5qY" Ø=wìk•2©%,šryTßÍ÷]Ç”±¼uåÈ*4ú«cØY×›v1J'ê )¯ç–¥ÃRû¥+eÔˆûqrF>ž˜&>]`YaiÕ^÷-SØU…’Œæí¹€§=+Ü—j]Þ€wF1wר¼àh ®ê¯QÇ!á10[øÆ"tÊŠ‹°‹L¸xÙ× J[_‹s¬Rp¸ÐíÇÞzqì'Í0Úi‘ù ÿD\y9DCA]úó=6Á6Ü#Ñœ gÁÁ¢~;$}_âXþ“—pEž¯½›Ýr"lÍ\xhÓ¡9º$ö;÷ù†¦‰‰ßÐêYCêžaÏ›zHRÀ“ÊUb{ üÙµ2ºr’4ÓõÉ€ A2ã¿Í›Ié_æ¢ÓWœAÜ…^o!›Ûpp=»A þ nCÓ\°Bb7‡¹+GßßžÈ9üe{s±ê›‘Ÿ™9'+ÈE¥ûr±Y ÆKoÆò‹à³^~&óÄ0_Ç…Å.2sï¿Â/ïú¹Êü»ãדýxŒ;_ø•òÌn’3ó¯ïi ü·Ø½²óËËNåöt¢Yìµ'p'öÃð(ÐTÂàPŸi])¸§pÄpãSÓÃæ*H¬õÆ|—ÛWŸ?”Nîƒ@`·¸yFÈ6¹(o>å–óò[FUÆc;tÆ•÷™Ùƒk;lRhZ»-m‚GÑcç3Ü×­ÁqÙägø©¼Ûó²+j·áIlãÉ_ZyG–OJ2“b­LlŶ3Zº‹Ä™‡Y+8&×A@ÍûéØ7m+¼ž(ëâ× Ú7õ&Õ¸%tJ±ªôÎ2¸ )©iÝ+¤£°þŽy=FÒ¿ž£5‚±mwR«axfFþúF-T’TvzƒãW”½X‡¦U>UÉ}.-IÕŽ'à öºWªÑ/òs¸û%A6ŒS—`œ•÷n>øÈQ«¬Ä¡sOÂ)GWT/`o6w+›qCt§ŸtFÁJð5˜Œ7›ÍЊh¸_ÃJàõ"!Hª-îѤÃ×k³¹‘'ÉÄ)º[> ˜Ìwr \+uã¢@eó“úÍ(S`+ðŸYÿñ^ü áå¶]5p¼Ô(‡¨óF;Ü»Ôxý)I2WÜÈ/°DõL>q+ ­‘O%ZÉèÜÉí´+ú•^‹+H(ô˜7ídN¸¼{ ý´É™––è7Ÿdß™7‹Îáé×ôý-©M,>4ÇwE ¨æ­ô8Õì¥ic…1€†8$¹Ïwuר¬ïçšã–©D¢ ÷„Ñ™®°ÚGØšRú4¼Ä P;º “c¦—× ¢ 1‘”N ðÝeNëD‰º³DG‡ny$wpB®_VËä ®Ðã`dðgÌ ç¾³o³d–Øþ#ÕüÖ`5Ãt¬õÛ¡VÖO%VWJDÞª;þ?9¿«„ì­È¥3‚ Ï/•Ê®!5|$Q‚Óq2’ˆ$ÓJ7wòó pZo穆7Ø“ªü¥›*-„5­ÐG537ììuäNôm|3ÅH1[Ìíú'2Ü!ÝrêEŠ®«Ê|ˆ$hªŒlyQ;u‚„9ª«æ'®‹_ä˱­älþÈ—NDL¦ i§YU•‚rŒt ¹D‘ÝÎÐùs¦‹$岩2°°¿&’…U¼ß4ÈŒ“+s5ê¾3¤‘"?ê"v€Aý Àx£«ºî3¯X*ž»¯>2,ù~¦«¥ì¨¯Œ£géÜã’7Sƒr¸,<ávèàVýJOsø¶ÖÈLbkÈ?É)Îár)ÍY»}.Z"§Y!j¹(>ö:TŒ( ü±„¢í^5Yþ·Òív¾n® C\ÿäý¾ÊÙîÓ}W˜:t4 U˜œ<ÎTbGØ£¿- ªÒêçÈ8êR޽/Q–iáJý³oÑpô…‚#NZä}c­÷^âzz!:Ã"Î<‰¨MÉnRE/^‡‹¨‚X&Pßs¤…A1<Þƒÿaž%€œ—™)O™âœ´J‚DC€ÈD‡ÆÎÏ›ø·Zû‹Ð4ÒvdøîXpñu>×¢³X§Zø0šlÖèCë05m·7ò‘$ƒe„Û v½läÎ4"V;ý>DŽÑÎË8*çÞ¸kWˆòWŽ‚H^x)–Ê‚sY¸Ûî°S­±ûïâ_Ò_µÉËéXÝ–ÚÉPõL³AÅ#»RnÆ÷žw€µŽb„,óåQYähqèOH¶‹Ós½ßäžqäa…V;%z‚Íߢx{uýŽˆÚ¨’­‰[‹Û¢,Æúÿ˜3²î‚sê4N©û›Ô•+|øê`xë~Ù !èí…BÈA·òà­k žÖüüÑG¦Z~R¿Óª±#||aÏTù†²ÑŠªkñ*!FðŸqônåhJDà%2{¿`v¼vÔ!÷&aÆ¥ÃGiJ'þ’rÁ†-Ù!eÝã1‡¯¤{:„¥CºÄöèħC}°¥“ø‚;t~«b ýPÖ;8¸Òî2î×¹%8©RQXsxŒ†–wM¶Ùæ ã†dh…F>É8p!#ä|wÂR¶²åŸïmÚ£ê°!8xÿítuØrUƒ'½ºÅ!¬£ýç(,(˜b¿LY ôé -Êù j€ö‹#NÏ‘ŒÐ]ó3·S( -ºÑÌ‚¨—>îürðc($ùT3€“"Á-ˆ(`G1B¾Ÿ·¬!¯=‘òÀ˜°¥Î.¦ëµéð୼Φ´E[ËË yiЊ!½£¿&üN4Uì Þ¨¶öäݯ¯„賕Eÿš>K×=!ûpT‡üG:à@ã/÷Yy¢·8>¼ùCo\ü>KüòE˜¼U˜iÆæèBý¤ÃÊFçuO͈kºx¨–^¼ŠI0¼è¼·õ¥ÃLEŒ8nH6|eþú÷_¾ˆ8~¬¸GÁ¹SþÚKóçdbHtòæGEæ-wC;}óo «“ÎQ¿‡°ˆîiãâf馚 ' Ÿ„„ÕE]€~R÷DB³²´"VðI^| mƒE迤;8éRkô1 PSø{¨‚_ô.Œú­åjŠ,Ÿ7×fÀˆ™Kã!È[K$¡á09×wë²Ç…“WÜ€ PÂ{5á¶¡ÝKe¹èþÒ¬@Ÿƒ¬ÊyȰHërÜÁçz3ÒláÅ)ôH@VeM}Û Ò’AëbZ›³÷†ýÞ™áö7¯÷6äâvífÛ‡³ÈîNB„9˜ÁÛŸptàr^…íãÆÚXâX…&"Ã+ aGxÁ ¨ž Eâ"TW꺚°í%'»= Ù³úAG“së.S=Ûž¿Hv-¹lþ%–¯à—=Îq^¶gk59å|M^»¦Ã?åôÆ|ù¢d`E¤ ktŠ=eÈ ˜¬-g·wÚk]帔¼wòýRS„Ç=ÄéžÇ\Ñ1FsÌ1ÈY'l3$û3å«÷”E¨²pOK èe—¸IÚw*\ŠåÆúEìÐÊ2Ú@² A^­©%OîæyK@ºt Æf€5Ÿ,ÿÅ×pºíÃ=íü¡â K¿îâÌnWæ Xd­½p¥¸FùªvëJHÅ –šfîFnH;‚æ dúPR/õQ—CåýåñÙ_‡Q^;;g¾Ðé±Ôï›Ð_«4ÕdCð/©M9z„ÕíÞç¨\ºù¶C‡ÒÞ_„¼¹&;Eé£FŠß¼¨èw*HŠ2ºÙ8Õ™ÏAíÍ‹è¯oTùày)ŸÍÊ'µÐcTf´©QK2bmø‰Mµ;ßhynm“lï¦ÃdÝ/ï^_¡šÎ<ÿ¢âK€¯__¾EHÝha ûÊÞÌf¢S¯FæA¢1}ÎÔ«o7l¿'´_ùl6RíkaâXŒ-ãGö?[Cý6Ä£7…ݳvogù_éñô¿Æç¶^z¸`×—¾A²V5ŸN`ß< Qwx9 o¬ý'ú«5o¿¿™<ƒÚ¿À]ÈqÌ5!kxd­ÛQ¿‡Ž/iŠ¿žžöÝÝXù&l*þßítcOè!çÈ77åðÖîž½e|?íÛ”jj´|RÝ%Ë c)Íá#ÝÓ z#q“Ç2&‹73üÈB;D…kø‚áeZ˜UwárHªÀ KÌ¿A×ø– þ¼Iús{kîqþbŒ?ˆ!úGÀ„ÇÀ}Àô#¾,v®¿œênŸ1üW´ÍD|£úÌü“«Ú<‡'/Pò^õÞþ¬å ·ËðÚrÐ^èã¼3'*'\šÎóãíÔÿ¯Ñ|îÇüSŒJå;|û§êü¿ÊŽ»¯T}B¸Üüìx÷¿2Œ FgîhB…[dÃ.uL6“Œ0þЭÍYy#cŽ / Þ†B³¼“cjè, ÑÜbˆàb(sÁIx¶¡ ”û­ã €:Ý«eºUþ ³ H5˜Ï’ÝËf'ÎUÆ£QxF ¡P¡a6‰ŒÅ¤"ÚC 0ï70±ì &.ø3§G¿É’°›± "OŸãì zN}áw'Òh‚òû/ù#¤¬ÂNwj¦1}âÝ€ ÿËB%È"ü .âýÎÝãžïùþæI†â¹ÏøÈ,¡’`äÀ{"Etš!c’Ázåc9 4‹Q×…ûZ†aÚÝÐC´ˆ(#Ð&ùA„芑xgN†cØmñÈ€e5ՋΠQik§Û¾ä‘Ψ؄•÷Ö¡´Ú«Dý:E·EÔ¨O¿’xÔÛü—r—Å Ïï³*­¸œ½ïÀä”­`¦`G ™:«¿À»çôµ²wW¥_¿N~Ÿõégg×¢¹h(‡mïIVÿ¾[ò'Õ; Æ$kø‘:A@Q`[\Úš¤Ê•Ȳ™u¶{†[~Nw׫WDÌJåD ØŒ%ׄeµVÓwy¿ýXrB˜€isTIG“ïO²zÛ£úwäu~'(1(z<_Cš±Oã <«ÅAzú‹q;Û8Œ&Ø0ƘK8!®\h;`êP@CJ Œ€÷¸èt·)¸øEh^Æ´õsf¿/w¿qü{ø4b¿vò“š9x®¥¦³Œœ[È^OÁó„{Œž½yMa}¡p’ª–2ÙëøÝýS½D¢HÊYädõëìéõé§Æâ©¹óuð_øÎþz_ògpIt3ôÖ¥e7ýÒ,ñöýžïg„äOϦÁÜ—~g÷›û¤ö¬ŸS¸™SŽkðú›?W F›·Wõ™ÜÂmIµ˜ÏfÍ’ñâO?æò“a6 `¸öºH*~!ŸNáϦˆ[~øSÉ¢þ ù´”ÁóÓTË ûÛ }UÛ~7›2æ láSS~ ¯˜ãg=zútŠÿÑL²~j3ø}9ilÿÍ0FÖŠ#'=ÔòôYåD‡õ6ˆ‡eÉ>Q’{œANê¡õ´¦Æ¤4îÉ2E§åõ÷UU% IÊ•Kjè-m1`mˆ0ž3j+ ŽÌ«k,bg^öPqçŠîK,(ûA?-:…~p6_g®#Q$BT~j,?]œ=¤ùY`qvÚîiª'Ÿ“‡ðfkúiö´ï7Ö.ô®)ÇC¯ßúy©S—ˆ‰<·¬}úO©Îm ½4Íð8ˆO¼ˆ6Åä¡ °©+N±EL‹?¡Üõ+W1[Çú–ÎúÅB#—.½øý3½V®R­A2ñ±…mø¨Ê÷ûrz¶ÙÑ«Ÿ— 1„æ:¿½ÈÏæªUÈiiñ øw¸«ÝÃ[aÜ‘}x½ºóu`á©ýî¸CÀ‰/ µï¼öØ'½j뙟HŒäëŸí-;un_¿¿gKÐX¦Æ=2|t´ÈïàšTwv£âDG¶^:™­ö' cso¾Cc%Èxù þE½Óèæppo¡Zêri4þ»7å¯o$å·¬B{ä‹§kcØ4‹X‘œexq¡>N{UÿÊŽÞ»¦mUŒÉ |ºîo’’sûyÁ[>LƃÆEiÑùïzˆ"UÕ3iš“ÚŸ»>³ÑìžÀÝ‚û3èà,2©üù+Ïr |ÂÝø0ˤ¦ »æ¢À¦Ÿp÷k½˜ËpÄ!Õ½ƒ¿~åÝÕäBqZ6F2hÛKs¸C™‹áŸÍÔ"̦¼•µ¶õkƒ”–É· _kÂÅEÀO= ª×÷Úá ¼¯²ˆ×ŒAûž¦õý8ûè#›U?@À}øœð[veQÆ¿©² ÇØù‚ƒз÷ýµ¢ˆÛ Uoý&d”æ!p€…çðïõú»z|u»¼Õ½X–¾Ÿú ?ÀŸNfÒÝ9Çl;ÖÇ\WÆõŒ”ÀØ\'îBšÕùá³am$à‰Ä(›¶†š¡Ã®ªÝÎ<Ϫg”[ým꟭²YþÛ‰´ó)kŸQSë8ÌI&S©ÏÝ1éåbág›ÀØÆ"—ü­…œ3JºŠÚ›)ÒõÚ'{µq#Á2Û Õ¸ãæ±·oz„ÒÛÜ}ÌÊNZgcmF®ã¢í5rß TL^nˆÿoôGûÞ¥2ø¹¼¼7ölØíXsj3ùt椀àÛ…NFâü™ÿŽ= ï£Dýœ!šÝÅy{ #ñ»{3QÛ³Òâ}&„ë(ü^Ëñ¾ŒvŠbÔp&Œx@âóLõÁî,–›]ÃtËŒ?©Tü;X±9yìOzr÷+ _ ¯C«Èæ5ðÕć\É’–%_A‰U9’)PAðîkUy®ÐƒSÍó*¡zÆþæ<*¸ÁÊwò8ç€BÖ)p 6ãÝÊp¢Ëíû qS:n`)?M™+ƒôRÚUAä¼õcñ|–ÎÖå¢m~ ôoòüž½Õ¢'Ü{f´Ì­Å¨æ,f¶ÆèQü9èf®'¾ÍŠªâÞÈÝFÝ$ ëPHªÊÞÇ\Nˆ•wÖrÑdç÷³ÅOáë*o®p‹›¿Ôœ×€ßkÕ§¨2ÿ™æåÉŒ¸_[\qÍíaçN¬Ã|”­]–â2Ò.®_}¬µ%ˆ]¾TÝtטÍ~*ÒÞÛÅ?½¨}€ùŽ1”|ƒlãíä& ¡÷éˆü¨z·XõƒÿŽ’šÌ<»+º·ì1U•ðÇ‚”Œ'™ÛNÆÈιÈí'Çiû2µšüy[ þ þHøž‹IÎûþ)F=Üÿ…ÕÝúê¦×—(‡/y5[6_ øìµ8AâDÍa'dR ´¯*iø̶õVº·ws¬î°mM¾k½zÜÚKbúèëdÌÑŠ¤mÏò¯ŸD°w¨Í#àr¦½0±…±öìºë.'Yß·.0oîæ'8 t&“—ÒLž2V÷ðôéšÊªÕRnõ1Ç´@fYJ—ÙŸ†âëXýï—í`DC!=”‰Án¥ÃJ{<)Ý÷£ÖLJå‚ý~=¤ ä‘VQ9ÇR“±aצà»/짆ù £×lÞJb 숒ͫëN 1"fZ»sYûí”Ø%Ï꺤çG5/š .ˆÛâzAöôçƒÐbsû„Û‡ù¶>nUµŸé÷'÷Ø\ÛÔâåŽÙ¿¯sRn(¥ôë1¡|®³8Ó ¶À!Û*úOÕ;)‹ (@‘ï%¶Ày‹£€64û(ä=7,¡Ó·.!kjöyà—¶•5:ÕÁ¡Èi-±%†ì:›–îa‚ýswÞ»þÒÞØ¸@Ÿ«¹†À²F†òº H¬ËžŒP]¥žS¸5†.Q@’²[Ì«Í)`ÄÀñžÙ;™²M<šqÿª$Z‹4Q}yê<’+É M" .x,‰ãà¿ÆÿðVêrjT·ê˜±p2q¹ùzÜE³b…=Ž©¶¤ºá]Ì2ðËSÓñ¥ªD¯ ™*Ë\Kú+tƒ/„æQË™$ÑõFÛâ~šRJ–ÚÃԾتiîh*Æ­q €Ô“¯ó:ÐÝ<8wÄÁÏv'$ðµè¿ b êà‡–ÉÈüGwŒÃôQ¯—+µ}‚žŸ?´‡¨Oy¼^òq,y~‹ÑÍMœ^Ž!fàáA|†Ñ…'…:uE½UûˆA+O›Òg/³JrÝÇ„ÞG',jäºúÚïñÈ|½cuôŒsØ”Emq³71ÝC«Ý¶i)5ìFí½ÔúNZ{f:ÒqHÁÝOöÁj˜Á¥Ç \‹$Rwr^ÑHª|q¬I[ñb Ü“âÌTdª‹\wF“s ¥qý´}¡+Õ²†ðVóÚj Ùa2‡RÑ@‚™K“}Pßß7g¥Jh;ŠVLÄÄs²Ã Œ}YYÊÑ`2¾¸ÉwivRƒaO CºÌ—nçÂÈ|u}'¸&z´¸…BÈ× M­[u Ð}NÍJ>s8é4îcÔ3ò‡™x­À÷i5”Om“ qÖ.²¶ÍÓsm¿ÑÕFä’””Ý!‰Ä¾>‚6ȤX€&{§ÍUƒNs5ýÐͼ¯ÆbùŒé¹Ž**Uþ±¾ì·XV‚ÆQ\´gï(ê‡×wæC÷½‘€ßÜ¿Y|Ó©g4O!bŸÚ»rÇŽ$•7r~¯vCîvJYLinzKQƒ©šÎìb²û”Ä:³h›ÞÑ«Ç|Þ"ö?\'H.5åúD™Mk”Ô"xË#úŸÕªãUmýšü³oÛË=Ò­#Šy\­°1ä¤ ¢Ñ(æŠ÷J}s¬Ïþ$»cl» ü?~yrÊ_²|?ÀäýA'ˆõÅo&^û±¨¯ãócß$HJs¹ÿ/5}ØòjåO0ÉŹK (v &`Œlr;hTÃÝÏ« ‘èO<2µ.*¦Æj¨Æ–ïaˆD(ÜË3!\5È šHá6RºDVÚ/=ý¯ÍÍL«ê}òðUÊ5÷×§uUUq0d/Û’–Aáyø§æHGgš Ä ì±Í¢”íÈT›µ=^>¹7,‡c›m‘mW2™l4|à?3‚ Õ‰É0jDBÑC4Ý5rO)¡4ôÊ;† €a²2÷´_£Hd‰¹òbÜ ‰´DøsçÛãát?×_‡EPñQíåç¨`¾­·<»²õâç2rŸïÓ©ålVd)>h£z0d¦l²«úç Vë|ñ[œEÙêz±oÅ]èÅy„ÈÌŠ$p%o¼Óš08€úËXRúdÑ0ö»6AX¥Îa¹<‚É ùë )eÈ,Ò­=Iž¶.¬S„_ *›É}¤Ái 5ýn÷Ú—ø†µã­ƒ›´^•Š­Úoûù·‘¢°‹‚71>@EqEŃà𘠛 ä¾Æ ßËûÙz C”yÖ`ÌGÖBe4Ó,'1I ³¯£IÛgªáj¶Åêð"˜LñYgÛÒE0<{j%*%p¶ @Yb‚¯©Y4¹IåÁùõf©¢µçaúP¡¬Ì÷ÒÔ.‰¸¡…Ÿ³ ÓÇ}uÿ,eœ{”öwVð#ŽÞÕãÊ7Û¸6g àpãÖìÖÐ­à˜ŠF2~Qì÷¶™Ó‘æºÝG2àâ¶WàµvŽ™Áú>’½{TØD§÷ý4øèk€ÿF«I]§PÒ<Ž~\ào‘÷­’Á^ <ÓϹLjº ¿¦“ï3‹ëYV¤oïçߟÌUšæî0 6œ§b9;FöO ªˆV ¨N!DeÑ$ ›äÓWd‹Tb©U¬“J‡“•ñ¡.“’ѬW»äUŒnŽñ¨ÊÃ{†‚¨ùÔ£ýwÙë:ïxîZ¶¶UK£Ñ œÌ3|Š<™#¾Ó8;T¿ƒËjnÓ ÕñG›ŒÆ²‹‘+´¤.èçØ£±£ótËwÜåÇ=yƒ£äJ¾7OÉ‚øDÈð’˜ÛšrO9@Ȱǭ*ßÉ«ÓVä=¬àëÒX1VnA~ÿ‡‘Fq,º/ó€ Ї–ꉴØåÜÀ»ÆWp²žIp ­„㮾GÐf\'Ìøè¸3]& ÝÊ:ä×°1eØÅApâ½™¼oësu{,ÖvªæÌÃqÂ2»9ºïÙNœ% è LY–ç­ÎûåèÃé-Åß Qt„Äñ7ã ðBÀÜr|ÆG¿ïË*¥q¥a«¯(Tçm†ÈYDã°*0ÜŸ _QÙåfʨIn[ y¡Ë ¨,&ûÊ¥Ù‰„‘Ë'o%'_”®QXÝ€ÀI£ÞôqÞ °âÚb¨´ØDÕö¼²~åÉÜè{„ÖUÉÜœ»Ýi¯ôàdØFÃqvGbÃ2§¨Í¶ ’Îö6Úux.¸L¬ÅøÓôoñ朂¤åÏ1šJV^UþîmèQ¨ÍÈ ò” ET^X,³ T0Ù9 ½Z’s亻…œ†¦© ÞÖ‚}O2ÞÕœÖß¾µvšMÎÈ¿ß/9/M©¿Lë({lÏö,qxtøtåT¸ ÈëÑÉe†«§ïË Ã%Ü¢3GWk¡ö]€´-š,ËÈÇI·‹sÈžÿÍMìá2À­Hì" n€€lÛ+ò¿Å`c3»`r(Müÿ1’'ŸÍåÁH]= ÷çÕÞ`ƒ´3ê΋Mq·ç±óR› ñDAe¹Có'X\9ŽsD”çÊíeHV¦-Z›,wTï”!Ö)çú§`‚›–ç¶°É;8¤ûvyeCæ¨YZCªÒ‚½Î\8ÝÁ ê—?'Ø?~†ßB‘@ÚÚœ¹U™«OðYœ‰ºih ö,nȬõw$¨7÷»)óʳŽBܪY•Ò·Luš“ܯ ìRZ ŸŒá&t,Ÿ˜Ôç«Y3sÔFY„¼Vتè‘†Ë )×$ /×­Râ®IÁ'(ƉԶ·Ùʶ¥úè±ÖÔumBàâX™%Ž3ýånÿâwÔÜÃŽ­ÕµÍŠWÖÌ9ka*“¦e!`3+©R¡Òg,æö褾Ñ<Å¿¥¦{ëhÐTA€é9$À†ºB}gShiã0¹"4œo~K÷.C_J,½ØBçãm€’Àê4½ ‹…(}ÛsëDZd KÇãú›j­(Çk+Ùª†óºÕ¬üï+û»¢K`y³óºÓ†ä>Ñ®PCBJËBÅe‰º}Ùð æ‰=1jÒG¼ ŒEÉ~žÊ–^ñ=„ˆ×IÉq{ì±Ï;3ýÅ7Ú’»Œ•kh‰¸þsÈ!yÐ&ª¡‰.)4ùv© 'åõ9da˜!äíì/< µ"+Q<5øŠG#܉`šþ¾kçm»CðnK¯UûP·/l#üxzã‹eÛ‹yËŸ‡¢l­•ÈjåÐA=Ó ºXÍ É¢Gj滎ð¤öÄÔ©÷ßÖèÁLóÂµ× íK toæÀšRãh+TÑ)Û¨^ôIó™ÝM™|L0Úéªø/ë4äú³ãq@£’>="Ìq\x¾ô"ñÃݬ"äíÊ}·['_ îÖ§×xBHw·¹Wl [Ff®Èè0È«ÝÏJ™‚ªeÃÜGÏS`uT_åæùùXÓá0R£>ðT‹Ý*´¨~}àQÓ-C·!¢)KÕâqz¶æ]òG_œ)«5¶LG qØJœñ‰ÕOUeúTÛÏ÷‘H0äõ«ÿqc3iè@:œ÷AÃr¶l‚é @xÍož–èüεJõkoʪÊûLBÝöJìƒc0,¹ÕF'©œ&Á`n„È6T?f sÛ3€föŸ‘ÍÖEN#O±âÌÁ¡‚뼕£áj] Uœ‰Ý§i¶I‡ØñIxSÓÄâÅ·&êmÂ7àU tËv‹ûæ\²o‡,Ù¯÷SåÍ?r ·ÿ¬B]ѹ9wÆíü„¬˜(Ó+—®i‹Úz9 ’²ÕðþG`{Ö¸ðuÙ6ÂwC›Š«Žu&Ñ‚æMÌUCò¶³É ¢Ô˜üË‘p¼y8ˆ)ܦíâ¶×hxÙ„ÃG”°DîYvÙm2w™3*À:A‚àÿÁ&Îôfˆ+£Ê~K$梺ÑGÜ›<¡ÂÝ·1éÌl®ÈSžÀ ìÍ¡®MU k‘.íÑLèå€$Ov3Øëìô}d™ó7NsšHS"NB/X9åoÝpîŒx:dÜ"¯Õ#Z¢ ûò8ÄF-ʶÄ7Ð×AÈ6,ô œnÉOÕׇs¹{liµÉð÷•xÄ;¶‹]¦½¶ ‹Î} ëÏ~äv6vý©ªLk—¦ŽýÊ;½ùüµ aú1ííŒÛåNF“‚Õ……ÜÙHËc>îëCä3ÒJÊ4Þ\‹2À>¿»~Åu;æ'ß -¶%…ͺý–_§4}Dó;9д/¾„zC˜°ßÏó  6?[G?-H|9è¾ÈF™ï=»îwwa7T'‹1_ä:ØteílL"îBÁ|3þšm®ñ|ßšþ¬‚ÈÑ‚5[+…».O(Ï@iÚ‘v×óB™y£vº 9ˆ—ƒ¸ÙLP/Ê÷TÛ’×ĉÑCg$Ê’ûROzÄÄÅýM•ƒØ+ÙzœSA)‡Š2ÄnÄåwÀX‹AŸF£Ùt'ó髸fsdª²öÀ‚` ¾ôÿ¥°4ñ#\>/nT F1Å2;’â’ŒŸß¬º9réoŠ uœD{ùý,½Î¸¢–͉ˆ½‘õØðD"Žgy'æ¢æá÷«v¦.€È›tD6%~Ô LÙš¶f™‚;ݵÉÃI9ÂOm4=Èÿ.g–^í®l2ùqèæ÷?¥-™CU³a¾‚û~µGHíScØM>[V¬Àsή Ýòw5c}œNEˆ‘$SÆCEp;h‰+½îæ¥È7j›OrúY`²V Š3I£Ê-‰\…´À¬ ßÕª"º-Ä~3îàê(P¬\ î?¥™®"±ˆù7?(oÓ xà^4s$ŽÅ]ÆQÅ3ÆÙ—)•¾,üvû<ªüû¨cp_ €¼fŸ®iÝ=Þ”©LÙ:<£óÖsrƒ>øœ@0FáPwôBí£¶àuxI€„Ç&±@K@·_ëYp“á–òG’]o=T®¬ …h‰z=CÎYàKäLÄM@Ÿf>ùä‘’çaœàkÞ?AÚ VÓÖ~ÖC°_›võ·ó½†?$ºüû©6ŸðÃØ_CHy-iûÂ6êÈöMQE~ ïè gÔ?Z?`ziÎªŠºñ“¬ÆO~"]¿((à<“N¤ãV!­†{ÊzÝ‚&>ÊßBã?vŸÕ¹¼!:²ÚŽ´ÅžòNö ¾§^Ë$8˜|¾eÜ̬»þüŒDU–_m=[1ÜÖÅs×8D¡L÷âAU„VJqyQdÈp¥Gº¹Ú­]`ùö²ºógèÍ4‘flš‹¼ÞÄ;0¾ù_ÿóÂÉóI½Êr6nTU„éE˜‘¯r¬ r¥dpx @`0p>JE4šg§AA¿ák º]ïÍÌt™ ¹û_Ø$ôõªÎUB©ûºþŒ êyÏ}KbëtruΘâÛH‚‘iÕÊi‘X ‰u'f¿`»LKeï8ËxJŒù3Týß«¹v3Ž1)™ºgß—Lºµ×ã¢Q]º!þmp8öõŠÄ”O'/«$£,‰GH˜ÿ‚&öÀá•xCSüHYѪ7gÚÁÐ UÆï”g£x#g®AÉÞ͢„f§.Ò€®r)BøéÑ„´xÝ®‹q7”4ñAq€yµgSÔ|:YÛ1 êäø>¿æðŽ+¥¯—QÖsÅû®éúb¿õž~à²IÚÔÞŸþ.n™ãJh6¢Š-âõŸëñ÷ EG¼ß¤scK­ÇRÐS¥Íc>!¯äd¢ï’é›ÙÁü.m^BՈ͕.f%‰„.XmEaúß8d¸E"‰èhì¡Æ/¶©´ÇS–{›FSrôÒ‹a¥»ÎIèŒâŠ)L\Ý™,‰$¶¼Jlî¥ÿ:W+~ÞàÑPiˆYó‡ÂßTs„ŸŠ±Ry`Yò¨TýAw˜Í‡åá¿ìÿφlÊ™8·UÌq· þ¦±‚á-^†vLŠñØWùæ’¹Õ´e‘"SDqË\ßìó Ðè?½?[®C奖 (â †ôûR<è¥48›×tä’É¢ž~o…‹$Od{”û‚Ê\³­ßZ7,ÿôÕoÆRV4&oM1™0­r+yþE¨pÝ*‰¥Ï™à3%®ãSì´UZÀŒ¹Š<ºq1êY~ÖvmÉDàW+µ_q5ºqía‡öEº<¿6•þìžp :¿~Kݺov°Ëù2nä”÷[2Í«(ˆ ‹P)ý˜/3CwqÜ#ÚPéÖåsº4 »3zÚ„ÎVvØÛ5Ï͈â:|BßúQS2béfì#Û•²x ³î-´åÀDfGwÉÎÿ§û7W£h‰-€‚l÷Ó7~4KAì«‚»ÎhN tI®»dñPÓnËdÉ!éÓ²TrϬ-Kаä8’ G£€ƒé62 p€¢ßººÒcùÜ«r%s™¬î¦þÏ6};"æ]ú¢²B{zWÊ׌"‚*t¬ŸEÆ}>²—{:¤Õ¸#EÁÂ3/ãllTÓ“è› ŽŽy#a«rS–XÛ¥.Íâ¸Ó0Ñâ©!p¬0Yô,÷1¿£ 4ޤ¦zqƒþòM‚ cß2)Ÿ…~§ªVeÎËFtüŒïÆ¿·ã#Cº@â[?É€@LsO!á™Ç0= #C¢~Ûîa–š#RÆ`•¥”]7F œ‘a(]H›(¨#{×›œ°°y`ßxÏ24Éd¿Çm®R æÔœ9RP`l‚^Ð=Ew.»YÂ.Þ²Ú:¿ê'ú,®šæØ¾»Ot±ò¸×kïíUÀ€fÙþÃZø%9s8±-âúZÍÕX-Í\V¨ÿ=ó¸tšÙ6CñmBÿ€RVæqR\Ýó;ZÏ.»ìSˆLÝÞçXq!±ûµ®“sk³.—‰»üb¶Uh¡}††þU¢~ý¾[ØaMÀM‹Yæ)O*ñ‡ißíCä&–bˆ—x‹ÈGv…Þ¾ó?ÔázÆ íÉ“²#3¹n¯- zór¤Ú"uïÈ…ý ̰¨e]VN%¡¶¶ðT/×4?ÉmJçð ®5zX¡u{Üêå1o÷(<Òìô 2JØK€£i¼T=Iá=uÓT¿ÁÍÑÈñÜ?úEãé“öéŸåÏúÙþ;m†+;e”HCÓel•‚6j¹-½}Òi½<‘íW Žq)ÞSJ$€ß?ÔÜ‹Ä[¡|qMÐ߈6‚œoÈXÈ*÷Þ5úÀ:ª ¯”Õé‹7Ì÷³úü–ÂNRΊy&§€ôDà×$y’rüûÇS€¹{™bÜ>±_ó4¦Ì=XÁq` ¸Ë—D©%ɶžà…Þ¦Û|Š` #Ä$„÷HPg–¬½ Wï U–|ïLÏ/è|%Vî—ji1ÕÈexŽÅ̆2¼xÉPvÎK‘>ìÛå¸ä°“ëãúû"1ˆÑšØv]Óˆ÷Û@t\f2’ø“PPô•etbŽ)PñÓ}΀ñTkªªwfK \ʾ¶î#žNb›ÆMá|Ú)ÌLLŠZ¸Î­Sz”f;´(Ce…—•‡Cnû™çÀUù¶œ|]ÇùÏÕ£¬3_š¦tÒäfUPl0Êxm÷‚ÿÅ+Ê™ïAÖƒ"U<ê©Cò§úiýøòg0é j!Wâ,qÂÐ|\Š‘Ï]Þá¿„‰©wØM×{ ]ÒÿÙ"ZæQ®ðS12W“ wKâ<²7~>} ×Ëš¨zy=PñDzoãVrëÔêJÒcqn#HvÈ{ÌGÊGYŠÏí¹)%+n¬8Vƒ!ùÌKúCªm=TºŒÀÒû“¹J5 687-J ¢„µ·Lêtzr–§=5„ù‡m dÄa]å¯âH[8ã¾²ø—Út†ÖI¼#¨¹piŸ³¢âîaS4 ÞÙ†j¾ÂQ×&$ÛSSfY~ÃyU7¦'N–ß"{º+ª¦ÝŠŒü3w9ß5å4HoŸÃZ^òq“¦0·H lϪõ0‡µ£Ñý¦ÅRQÉ‘"EÜ´ûMˆ$‚´–í!…¯TEüÍì§!ÍÕÉX:G0—‡ Ã~´6õ̘ žÖ–IO­}ªyÓTin¡¸Œ‹’2k Ûœgð8‚Þp]ÈBã5ÞçD _!Û‘µÄ¤þ§´¬gô:˜æz&wé±K1€Étò„áÛƒ”ßrä'úÿ¤Ë’µ¥Z^ÙÜØ®|¢Z݆—~¼-„ˆGÙÓ©¤dd‰Ðûx“²dF Â〼5¢YÆ’ŽXÑ-XʇÂ=¡K0NsöõþcGt÷|©P5¸<²t‰#uå²>ÃjЃ%byEÓ¢EÅÎÀ,Ë |öǸâRmÙ车þv6ˆ2¹["!P^P±}k¼ÚJá‘îè¢ÏÈQr7ÿOP8¼–œ¶'_¥r?4x„˜îâÚF¨ãuŠ+’ѹ]rŽI/¾#RžÂöþ Ñ­±~Äê¨IFmMÁµO98[rÝ„+NÕ3—­Dóª‡:¤ä«â¹NBF §Eö¢B|"î¯à<>j‚,úÊ•sÚ7 xò=u4s@?í©e÷wA.ºÿý=Ò‹C scðf&üÈ UÀýŽ2öOëÍ ‹¹A 4ä–7Å;÷<Àôd™Ò sð¿ÈÞ3•r‰È!! Ðtf<þiæÎ>‰Qåwß»’û¤¥]£‘Ÿë6äU[;;¯Åq.RÆ ê„G’âÍT‹ÏëÞ¸~þ¹Êj“s`ÿ[r„RFWx=Ï•¤¶òüzÒ'‡]d­ ñ8óó0ÂÆº±a¦QÁ4m&Eò8Du@ÌV•"*ñhÓÒ‡ôw>Í%-24g#‡Â[‡–Ë.3ïó‹«Ih57Õ1óyÍE¯6Í"=„Àqè¯^9äÄÆ&áWcüчìêk†DôÀÑ–Ñå$K`žÍë›ØJ¶Èý£‹RÅŠ´Fð³9-ðT‚ù–T.ñE‡žù/vTÃÓ¾Vj5Û—óSXp³dÊr˜9þX[L¶`BÇñtÉR$ŠßË$Õ_ OF>ZÃU€¢ È­`4‡ä¥èdnÂþØi§ðNç{ÝS£å¿¦ æÝGª†¢‹ËmÈR¨d÷ð /öÄ)÷Ÿ˜žÞg+ö•Q+2–槸ֹ¿‹rßÛ0šl™´-@?㯷MëEAžÈmÏ뻦`ä_…ÍdÍ©)ÆGÃðíû2ר»zŸø½FEïejlº¯îAoð¦ò ÷jý“»?²¯2~ñÞ)£Q?¢þ€Ý½ùù˺F4Ù´ðiÈéò,¼š †ü~^½êƒ÷=Zrº,'PgP%¯Þ­\¨D(˜9Ö/˜n슭°”´>xö0L`Dš· 9‘^^YOÏ/ké„,û‚t„Zý?_ÍLïD«ó3òæIzÑP<`–NT É+Àå5CÝjäI#5º¸YÒÍ6Zãñ'Ò%Á¸Nz!Ä ý «Ý¯7Ö¨†on[·#€G{ œ ~}t—ûa“ò‚ІBöÄk8È <@Hm`…ÒÊ"û†XœÕ•ç)6Z¸S'ú€óCö™ êð«êú·ã˜É®DÉiÙßc†ëçbñäéÃ7ïžtvØ¢‡ê~y(~¢"u”¿ê÷rg}¹ï6¯*:|ù 媫ÎS/åÒ¹/r,]=á»·bpy‰üªð0å;嫞ªŽ:¢1Гp(ΨD~µÀÏ®‚Ø´ži1+è,ýsæ~‡?òØÅ;÷‡ýyvãæàŒ@Rýeoq–r°v>ú¹Ð'êÏ_^íÄŒ}ÿƒüXß\D@ÛV@]]å”ü g!?OÀr:ÞÇ0^^èCáUì_¼+”›$S}i—ùƒD»åä(D®Geâ€þâ{ØŒâ™üŽ¿œ¢øžÅO9¶ »Ø§‡Ôk_dñ޽ŠR¹âd¼³÷þ¹°Ÿ7Á{Í–<3!¯“¿—;þðýÕ8ðv­—Ñou‰›ã·V\Fƒ>ɶ¹ÇÐ]};êߊñÙpç“õ±aà¿¶Áy–ž@þ(?åÓì£[Æ\u~¶‡…òÍã*²½Îßhf÷þÈå. å?ÄT'ïú]¸Ö+hôñ_àp/_k)ñð ÷sïýC¿îçuKÃí2Ò*IóÂfÛ‡ÜL³îƒ¸Èï×4{sy²[dtسL}É2¥„­ÕÚüë̆ˆ”ÉzÿG“9ÁÙ}–ム~ôÅÏ튌ñH¤÷yÌ)!!3Á£ïŸçõÄ2š…O€¸€€äÜÜ¢"ª´ÂÓÑ‹=rÁ§ùÔò†ýQVŠhÔ(ÕùLYPß^…ëüzln¡]çü‚ëôà«å8a˜–äØ'‰ýð ‹¥éì-#m$Jž .8ßKqÓÊ Q‚ŸY#Þ' ÇÜÊ9¨£·îœéã}´Fž©‰,¬Kóued.‚ ת·òó‰¹>ÈYs[ì‘?«ìO°à>î/{Þ¦[?Ocó_ ¾™¼S†Ð4³å!§Ã\00ÜDÿÈ ޽MäÁeöæÆÁ˜Ÿš€[K{›A¼Örø?):à÷—Œbì¶{ÀËÀ’°@ˆ¬AašÃÌP=$w”Ô )Ù"‹i3Á?r–‹ÅôßhùrºÀ;G˾zϹ|þý2óCTü8Ù¶Y¿¼ ¼%ÈÉvQ;­ŽvcÌt Ö;›Ç§S±Ñ {E…ÌyS¨7«ösùäCþ>u_ÇfñÃÌAÇ)«˜ïÜÞ]1²ñÏEV„îYŽÁ¢“!«‘*«9X«,ƒ¢Ÿò ùÓî¼ú²{"¾ºøáEû»mÇÇCõ²è"&ÅË-÷aÐ `Åä±$Þ›~'_…?)z.¤¡R$Ò&ùAø·š¾¸sŸbÇÒ¢+í.Õ|‹ã±yÔRÍé)9f²A–€ÒNÈ€HT›IàæÁ­$õ|åaȰþIH7äïôÇú¤ž)¯_µ€ó½DçÙ Î!åì/OGP Ë©ˆð×ß…°òû§qàP7g¼P·—^‡Í×àÍ®ý†ØOúrèꧪ½ºy„ZG ÷å!{þ…‡º|*ȵü”½.)=ý ð†a y•5ßûDŸéEÛ[É ÿº~"GTÅå‡É gz¨#ø÷âý9üz¹=x²Æ#ÕÄ£3Û¬hÑ–üµçP/² 4£ð‡xïv oe´s“’OG¬Dý3ûdƒxYãqzNjôŽ ›Øé§¤c™?@ÞIñÞ<Ä wÌj~ÚÊAñÏpoŸ›‚ÝU}Þq"aòYÕôd|Þ®iÛIQ€éóÏáÒ•C¶s*G‡UŸ¯_DfIÅxû›H‘&SZžÑoè¨övÍÌ}ààˆ>*M9C“%«Î‡g·ü’Æ Ò£! AfïèpG«)ay·Û.ŠÄå’ó‘M‚˜ñ<´~ÞHNzävLf:Oš ¾®ð¸pýÈݼ0e87<1F#ê’N8â åÕ% Í?w—#¬î‰ue3§´–6íÉã¯Mûqjÿ™¡ð¿Î>Šf rH´q  Hh©îÿ&GËn µ¾«8Ju?¢AKº,ŸÚgå¿›}´¤(¨Ç ïßVÅ­]½ÙÛÔLwŽÚO°ˆ[ÃñÕó²y¶{ë·©^d•'{gùÔž‚}îlm(ØŽcRÇk˜XŽÅ{² ³(@d.ª—x §Gisj?ƒNY4!]×¶ñÅ?vNùô’8G—$†Ä7^ãótêÜüf7‹:ãléÖøu8)÷GXÇ´’A ‹\y›? ?EÜs¯ÝíŠgï'èÜ!òkº»n±V®Ü»xÃM)Aõú”ø*!¥!}CòíNúl;ƒM´Mò–š6¤ç jöczþÄ Ew9<›ßë™xP/ð§ðc–è$œ„ìQG‚óK ²ÚdÛT9Îøö¯.CÐÿÕC»®|á×½‰£À‚5øîÌ ªä„˜¡îû ‹xáë&· >ùbñ¬?eh~‡(=ÄÀÕJ n$±žž¹48uà‘_cv'.Ä–øE y¤÷1ðûðɧ״êÆ|À¼‘'ô»ÕMUÒ2Tæ —ËÞ÷Þì8ÁeöD|° år“ÝÐSSôÈÞùnpLûj=P*Vá/ïç ÊŽ–ß4‹áíï¾Q ÃÜB}Ô ÖCŒ’$|Íår ì¾­Öõ—.X8 ¿’®g‡•‰ä•Ü‘ÝiÜׇz‹a‡:¹4ýL1¾ÛW®Z¼®%^^ÓM‘g]Ížfw™`©1Æ÷>ZhÆ¿>i©wsá›§jÊLŸ~¾u<(BŸoi$k}ÁÛ†™±fd”ŸÌ¶»ŸOÓòF—ÌÒ3hÉ6ÅdéÐû‘ó£×÷O}­áªa†”:ä]*­½1Å ? öÑ8 ‚óè®_E>4Ze¢ü”‚ñ´—nþïæ¼ô_ãoEòh´`Ï«u´bÀ$v­ˆ×ü ‘ôë%óo-Ú§òÒìæØõ4ßÏ6µñÔÖ±ÔRØ´Q–ý1¯r½?è]¬ã.qê•v†»0ÿ· e‡Œû‰ o½‡æ¦ÿ‚±û²›':…{^#¯H™Žñ”•ðFuzÕ÷ïJõ5ÊÉäÇÒΧrïóqŒ~žŽ8–Œè²BÚLMp¿;›"_ Å4ñú7a{&nìhW1s΄Èa?dX9Yœàòߢ»c˜§îÀýQ_oµÞ£ãNf~ˆ‘|”öÖ–’ßwPpBîœV#’Ñ—M·˜$óþ܆”—¡K³¾k½ÕYYÞ³»­7±è$¦!;þZ³uZìÌ5:|¿}ÚYÒç×ëɨ­#LÏÒ_bŽšie€œ¯7Q+S´È/ÉË6² ñš%˜’àQ=õ¡üWPZhÒX î•‹·OO’• ¿(Vã ¡w Vjyü¯Üƒ°Ï->ï~Cî¬îšïZÙͼv[ÿ½qtw™4ç!ÑqãÏ8a?‚žnSh³ÃTžªóŸnea3áÌö5ß©•¯ñ÷ÃãØ‹„1™ ¼ýý¡íµÒï‡Ë1óìzë˜ýó¯ÓçSÆüƒ0‡›PÀw±O4/äÏeßÈžtѾ.ßÕ/CÒ,R©÷qžËS®GëÞjǤ²óF EA·ó÷ò±O¹úÖææô¶2nŠ$lÆäõ ¹XÚfnÁ“ø:Pÿ>¤žAôž“fèPÖpSã)hè±íž¨J¹íŒÈþ6ÑBlÉ/€v`ç¨Ù+û¹ÈvÝ{j´¦xû{®ÔÙ\É&ÔønA×Lûß(}f/¼¤ƒï#~bñý°¯ã G4„âbOöçé4$R¬Ô÷÷YÔ“Ö……d¶‚yþ±ÇŲNŸÆÒ—ìKr„ùÐež `fÞÚ—Oï•+y!K÷‡ó§û j„Æ|j*k%Â;©ûùR}¬j+. “„Z þ›™._K?b8Fƒ÷-Kâ¶U>ƒûSНõпhO|wâ·$xÜj“ù»ìYÛg»HÛö"Jì‹r9Э|J²¢Êp¯é&¨Àªòþ8BzeÇy* GÞñ—îe¿-¦’¬:+p5ñNÉä1#krwƒnesqgÕÏ‡ÛØß£ÆÅvÈ_’'ÊðÀÑY˜û)Q¯lÊC˜\ÝÃ0eƒ|Ò°Uî÷ì&ò©[ ~§ÚIΗ’pAòôlê¦Ý¿£B™3Tmiµ¼þ*Mì²7Ô1k–Úg"kçÏcüo4 ¿}áó6¯jírò»xfKˆéÌéãL~Â*Òóè!ñb«óðâ»îs*½+Ï–‹XËÆ(%¢…%žÁõÕêv[ÛiއÖFü2ÊÝ–,@c‚Í! ˜·H¥ÃÝnôH#ÌKr;t>ë9™.1®¿Ç)ÈlÛÆF ?ò¤r‘pÞšé¹m«A¶Ô0Ï GépLÆ÷ˆûp\Iˆ¹í˜£:vǪ@æ'¦ƒréªèoàâgyÀÚÉûb­Á…ññ9a¦,õŸî39 9¡²Üå»Ëf<ñ¹{÷«ÑŽóî–¸HÏ?Xy}Wä»ó½M_I}ŠfZ˜Ê¦Ql¾Zæn¦ÈCÁ i¶œ‘ÄfïÕÛú?ŠI®]IèO2ÉXÈaY†ÇÛ­ÙE%™¨Éк,âº=X.²šc”è–ƒPÏ:Ó+÷xÀ°™ßLŸ©…ôñT «:Ë…žDöš´ÖYÌÙAl°œn$äÃÒqrŠÍ1çþ-ºúê”éÞ‘í#ÕÇtn£ê¡r±S”O‹‘?‚$ÔIÙõŸÙhr¶W_UÔ‚ûSéÊ»ô¨¼Ù™Õí¸ ‡‹ç§žÞFd/›yjrrItÆèN"" WÎÞQ"dk}±Å9gŸB à"$x%`Q*½=þ{˜ †ù!ÌÐ’}~"Ï-øÒÑ€>æ…'$j OdÀ¾Ã@ã€Z:¿d•wšR¶{üeìî2ö—?Z›/M²•q¥/†çw=ñsvC:“&‡9ÈÛ‚¾ÏQ‘»H˜Ü–óÞ(»*fCÍYÐ~½=ëç)àˆóXFHœ›]œ½¶úýÝõF«’: þ×dÚƒwmV¬=k)àɈ2茻»(Úei©˜PxEÀ#žT«–ÞÜå*˜jµ·}'†ÜÐeM–%‹‚Eàä0Q{& ²—ì,Yaì6dN.ry¡·j*Ö!ÙÈP™ÊË›Ö7({ü4̰š’Æï'—~¥¶K`^‚» ¡§=®çBéƒmÂi¬øŠ,ÍÇTg³>†‘ –)Üê]cÍfR4ÚÁ™™rë¦ÑÒæ¤.Zš¨õXíMï‡ZˆË';$l €äëµG¼ÿUj¸'u>´ã›pèùÉÑí?[AóY +>ö¥V´k.eºiw¤¤ƒ&)Žf9géD+F-ÂG*šÎ»ê*jì—•j|tqdÒËTA)ó ãæ÷x‡' y&öË5þúð?7AOpˆ gÅ&ˆÌ„¸,(M²¶Xˆ)2/U=×!LÙ_zEÁìr18¹ýmz7÷ë=D´ÞêeJy<’#mÜñ y~Tx€Ò_c´Ô7öøWÅ÷ŸË^ŸW´P1ó÷s’ýW«Ó¥¸^1Ê”rÇlزõáψ@ÿáû7’I¿ÉLT¶g#[ï6¥xËý”‚2…gõL„-™Þ·&uÛÞ(:ê˜]’è­öN>Je*ħ5 k49¬hm­Z=ŸõªËާ«w¶ùÀé9ʨOãmÒñ ÖÍ´ý\5Üž=Í£k— O]®誨Â[°ÄÄS[ G6eX´vY›Âýýê<.:a[Ïš3¢þ ‹è\ÄШæ³Úý蕌§ó{ £Š±èÎeä.1#1  ñ%¨)ɇ¦ >I€Ô ,ê~”¿VN…ôšÃöÉ·% ñæÙÝt¦ýþ³»{ä,¥«ê ßðƒ÷ ô‚ÕguÃ2Æi]ä¤A_jÔ2^ÂÈ\M×^”‹':–› Ñ=œpÑœ¶#YÛ/J?ÕôAæräÓ ¢‘‡‹\óÌTp3 "åqÑÞ©Ã%*ýIµŠ;ÀʃžWEω ­¡WQvÑnë@7˜¦’#?iöí0 Ž;×;‚ì‹”Ê@Þ@‡­aˆZžLbß:#Y:ÖÚyÙ%±Œ§¨ÅŒOOjWàH <‰Ò|© é…]g²L†ÿdw„7Õ¥²Љmê5_6·òù‚ Ï©<½'Cð¾—²;š2fV8ç«\ÜuNvÈò Jý¨£- ÅÅ¡t{ê’ø½ýæ¢,^uzÔ¾m֔ϭN¬ý«§zT2}k°¦ÎcLœjJ0E8ߦ!}ŠÉ`Ãô­k\üÃ3_ÿbf”¤(ø¶Í0yõrSm‹ûó",èݼ:Jö‡EÄ œsÆúŒZP$Ý/ËaððG?1AWߪFXR=%Úýº!ÞÅÉ(~y룢i3aÇa‡€uÃM·øK Ëo…ÏÚ(y›XTëB¸{äO.®×&1£nd•èÑ:;ˆ{qåT,²H´{9¦<{du ‹ Î…øW£û-âN]ùŸáʉ†|û³ ÜYò-‘RCsÜ#Êö¡T5wR9TÆ‹¤D¤¥ÏUÍNEü6Ï$ˆÇÃ¥iD0Rn:,­-4ý,ùbZã\¡Žhæ—´¸¥ÓI³•¾0¸Dêm:‘~6¼Á@ü0×㟽>ë&æ Ä^M‹øšA”ÉÉmœfø[q ñ¢…²¬v¦Š»=yÜ‘¶À^Z¢¥?˦Y e\¶Y¯ûq‚÷ -¦Ã÷W:“+ì@SrF<‹_¨Ôõðæ«±ò80u¸ÖÂÓjPIð°C.—vZ¨DÜèz¾gÖ(§›QAÉϹíE=Á¥?·ê$AÁµ`˜›ÂÉx¢Ž´ NàhŸh˜ÇǤ|bÇžDy†}gÈñrY —Å!DK~“ù´ ä 7&ãƒí÷rýb’ùøú¢!¯¿Rñž9Ï¥fHm&Áˆõ™³ÿSꜳӅ‚È¿LÊ;ª üFOúÚ§¥Í³ö¤ÎÇIæoT_µƒ_æ2Ûqb‰ÍRà »9ÌÃÅ<¿£§ærù²¶²˜z  g›ü¹èèŠdÁç7 ’ØD0{©,gHZ"Æ?0‰|4Í1pÚÍH±õe?Š ­Ùoû‰Å¡0ô¿ß´€v·šò†~¼o•KžH†¹Ng}e[j c¹¹^šÑî˜A2Ô³˜«çÊ‹b¤åí{gt¯’æy™öí'5ö³Þ€\a½@TmkŸâo® .Í¢hÐ3ùXMÜZwùîvþ– gƒmš’‹.‰ÎòëÒVhàÐÕ¡± ]zš.Iù ,–Ó²EÂß’ÁÎå§ý9 Ys• –9Á\&H¡ž’-€Ûõç¹”¬}¸ÑÐaO4‘`5+ü‹\—˜ÅÍô–…þ“¿š’9@憖€¡šDþÅ»Œ“ñ¶>×Û¾¦;¢˜I_,¢Nba†ª]ÊåPÔ,õ›ºŒÙ%ÈÃ?êÁð…»äou%BodîPd¸g²ê …úyÕ’*“§ q„ã‚ʪº.Pþ}Y-À WÌCñ¢\®ì£ûY†òäúb‚¥œ’È¡òSKÇ<þcNüã+ÃæŸQsw ˾ыMÀXRu œõÆÔuýö²xqYfËÔëM³ÇJˆ¢#i÷F‚E#¤J>4’ýáñR‚“Õ€K/ª¶//á”P’õ„thUK‰IgB0uŒÙ¹%Ë~FÌùá0 l ®0 ̺®“fÉ?·ñÌ„Þd6î¢(ùG4ÊéÑ0Å£ÕnÞNÝã(#%ÞA«Iÿ›Èß›s»–¬9Œ ‡nÁ>b⿎%«4Z30ÍõûI‰÷­üÊ•5—A7먆qñ™”2xnÁð>uû_ÝP aõ RŠvˆÆöĽ &8Ëuˆ¶/À½y´3I5'[.S4IëÉE(R´‰± +ª „Jã€<­,öO@nÈJ .rpcùx¼ˆFÛÝ_ÝuŒ´ âj@mÿ…‘@È8, šŠìÎýF)røç«UëS* ’ÒD†È÷¦Ý­i?–pqÓÙyŠÛ·êËWÔ A†ÏÉôa X¢´¡û„ÌèhbYa^iƒrÝ'Ã=ÐÙeDä~/É¡ût¤ÎiŸ‡è6jüxupà%ŠuÈQE"~À8¥tnLx®çACÏõJ‰Úž ÛÕ§&U‹(`Ë‘+¬ú}˜¢¦ÄÖÒ+ \ôXÚ$‚•3ÆËµu6`)ƺ…&†[‹Çæíú gU9:ƒº¤î‡§½ýÂë&sWAGݦ¢{±\…ìÕU“`rÖ™ÿÇþ3ÇŠ jïÌ·ÐâÍWUæuR‘‡³ê¯^Ê©nêSªô(±§L[¨.•÷t@²uVç. PAÅ_±„,Ó Ì¯ÿ —Õ>ÓÙÓdô£q`Ÿ3&q•Ÿ_=“Q†øqË=j'x‚6óC­ÌàÓL8e’;ç2?·v:ÕáÏr´“šÎéøá]ªÐVD½“§«’Ñ<œy¥Ð>Õ~*¸€ÛÐZA;­k<%ï૊ÿÀ•,ú³©²î›Ä—ñ–{ RÊvP‘Ž~®kiã"8¥ b8LxW¤æœ{%P+á’ôÏ­»ÚÐQâ->̉ѷù–Ò þœ¡@m(Q°ÔK:D:}û¨øííýdÙÑÝ}m?ThUÓlÃþ!nO’u×ÇzM¡‚4>Ä…¨S%¬%@ Y¯}sðD onãŠ,å]J×Qr‰Iî3ÂM‚eÉqÄúµ})ëòÏç{ª%H·øðÅ0ö‡õ¹X&)h{‡lßÎ¥tjP‘;vls ñ”T»çÁDó北óêÕæŒöƒˆ?òÑ´}Cÿg–úëú4E.¼dzà`)Qç3·C¥Ów^3Ž÷ ‡°»0íN“ÇlÍÅ_à`Z?,å¼Ó#ì ÅõÃ|¨Ì$!ç•ôÉ®’“sà*EöÍ~@؃ú¹›{ÙÇ8Ä­&mØ ×³ú|vd°ñgº»]M¹AXÍ\/r¬¾gg>âNã@ê’"©Œþ¬®ÖЉT´"?´ :#™Žúñý¬ÅšWsv±–ËŠëg[%jº;#iB6FBÖ0æÄè™ %§ž8\ˆý¡~³uþTƒBƒF_Ö¿Ó–ü@£’Ýv5)CméêaCÛÇl²Ïá¬+QˆŒr 8; êüÇ€ƒ­,ÁIDÒiƒÊ6&u.6“[®…Ð9­Èç4–süžþÉ̃mbă¹“UXy°ßtñÙ?ÍÔ@ç²Q»ªuÿ‰´ùã·j=òú¬%hnRêÄvþ!EÌ|ñkÏ/›äƒ½a¦Çå$ÓB-À€âó*CØ?c ]¶êrtù[1Ì@‚Û®¤ñÜëÀ³ûLæöDƒhö†+V³ƒNz›ëP­Þd¹xLTä„“Oœ§/´W"Å|.!Áå%´­_|d¦Ø•ñ­XdÐÖXWÚi›óZ‘KbÜê@ÿkg~­Ê‚¯ëS OZï_I“Éœ{țݘÀ›sCüzøswgn·º íQï/Õõ®>‚Qqk¾ìéðŒ2Næãç°æF“üœá¿™T<‘3‰Š*ë¢Wþ:#ó÷$m†CÊ;NdžÞA¹HCÚïÒ¤y|ëåOÔ:04­O@ü"T ñË̳gÃ.ò‘ ©Ùž“,ŽMípevùÆz=PLXr.VTa.8>«° TÒð }â^?Š"ô‹OŸ=Ž]!„v¬GÓ+á6fÎ5b3àQ¾"²F:€S2yu–ûø'ê³ñfæ™_!-ˆ n-Ô}º‰½{ ÌC|RA¥¯˜‚]ÁöLôH’Â¥]7‹IVH×b|ÿËΙªD+zu UUK nòÛSŽE¥Ñ*Ä$ðüE×nm]rêK¾#; ¹óžŪV;œ`°‚‘?¦(škl¿2™ÖérøÞ´¬…ÛgkDhÖÙ3F)ĽAêkž…OØ> )²ÚG\C5lÅ1\Ð(i%ßEüÓÖѵùwÀr -9“H!qñ_?Ó‘èÕ¨˜´¢;Õ<0øÙÄ£‚ý]Ú÷å1pú^΃ª{"³UÌ––åÐsåñZ!@”XÄ.Ö•ÿwI+¡u« jNdhŠ»tŒ'âØµñÙMZN„ EoCw gD8Ã0rÓÌ>šu†«ïÈóÆPNdý9'2/qá';°¢ñÈQH娟lÙªã÷ȹÒÁ4¶+ûFî#²×·Ù•”Ž(%—ÿÄW åwÃN¬гBÄô7àŽ£™ŸÙdÄ”Ç$auGct¾~ò½héØðØöƒä=ÈN±ËJ™L×¾)ÅJ–j5+6~e§wŠ–ýæ9ðúÏÆ] ·Á™ _u´1‡³ªöƒÁÏmÛ4sPÕ.G[€G3š»KëóÈ;Ì1ÍÌ<¹M4m|º9ƒ›r’%P¹ -nÁ†W3Ž”ßAÞp _$H¶‰zkÄ D‡0(úñW"ŠëN« ‘¾¸P‚ÀÜ^DÓµlNõÔ{,Dr Ö\zHÅæ{њĞe>Mý«Ë,~6ÄNPŒA=oLÑ,®üc¨Ù°¬ˆW0FÚ#ü½¿»§…A7ˆ[a£óÌdï`ÔÉöGÿ9ãà7ŒÙ<¹ãq6\‹]yK«!OŸ3ûwëØ!»y÷½”DMšMee/i˜i‹wzÕ‹ªþè¹)ªñï6¥ƒo`d˜"èM˧%[sܪϋÞTNM–­¼-cf¾ºÎòÎEˆ06ê‡ÉóN—œhs QPj!>úÒ?2øß³òè¡ãy×[ÃÅ2D9‰Áæü@©Õ,Šò©«íÁ'æÏ“˜kÌACe²½zÅÖU·` S²éÓw¹œ³S+o-ÏBZ,´¢F·¡*jã•?'œ5i?h´“Ü2ÍFÖØº8.S¹ÍA´Ù«ú‰2ê9Ï-Ph^Kš8TQ .;\}yYm`ÓI‹5RÓÈÀ¹æ ²;¸$‚Ø-µA/úê‰í&B°C`›BkPD즪¦{×>b£4¹Ì¡]ùÉÛ ¤pa1áÂ8Ø^ «Ôfʵ,¸³¤ÿ>‘1K줩|Ò¹\›jÄ÷ŽÀ²LµÞ÷G˜§œS9¶Â?gv¼ÕYÎ2‡–݇h†#ž›¦ ¨ØÒÞ/R¼?§Ç\³³œ¼G"uXYëù± e7ùŽi’¯0ª¥ºÇh‘Ý ÞbÐ¥ÌIÜo–Éíš°;8¢IU”+¥mæ²»Xšv™,F²Ðøg‘*~Fy{ÈÓRg d `¬ V˜ƒ,ýf•Üͪ€mOÌ¢0‘ñµ†¹âWw|ÒæóZ¼öühW”(®úh6»o{"{ÃûÉöyr„®¨.œÇ{M[òWQÓ|ñS ê"}дp>û–pCgÊq¤kn&—>¦ç±þ¿$øTR“5¤æn] ·8 ‰ 1ì÷mT‡TÆ8I‹7v·>‰W²I2ç¯Y»QœíÕåé%X<”¢4E‡Y{EÇu:í¸âN9 ‡ °o×JXß…[MIÉý­,DbæÔo u©¼òÜ[¼ô7^«'žVë8µŸf×\©N”ʨåg†‡ ú2#.Ðë}¸d Ä÷YÓÆçaÎÒ.‚‰&1´ ÒÅ BvŒŽñã‚%—PO5W”nð»†[ÄÿÔó+v ž6 S¶»¸$ÿ„Ó£t³ŒÉ~uW2ñæ­á_üˆGã`•cr éT:6±º=ú;eeÔ< {Q<é©NîC—Ô'I*p·TGe9ÅL[Çþß·ŽòvöŽžÜPk(Èú:É÷ðu…:!ÿ  wŸ!ûeú¿WcrzÈšW¼2ñ¥Û‹‹6qcÙçê=VÆ’JŸõ¢î#ÈÆò+,¼wÿöB¾h¨çžnüÃA [·Í;hëF/mâ̧5ÔN¨¼9ŒâÊ«û_.©®4CEAÏ pòTH2¿‚—fÅôÚš>$À«ÓëÁN´FIðŽ ”íZ_&iš^ý>_YØ[!Ie›n;+DÖßÖ±ÆvbŇS+ïk š ³½…:Ðh‚ûOr*Jp¼2³ÐO‰æøÒràå3 ’ÉD}#?¶Ÿ-dÛ|adìÃ&§~št“b]íîzÚáäy2 ¶ïìCàžˆý9åÔ š-cW“È '¸5Ì{ €(k t´A’DT‹TfDŒ cd¾KR+o›U°*Ÿ…‡°…¦X¨p1Z¯ÉÆ~HËÛ'ø¯ua9BôÅþ€µA´•ðð^Zûñ Ö|”P7M#¸\uýŸ¿Zºí$ç èp|óŠURc™äÚ³|îk˜•ë™Âó¬AÊæð“ï"¨¿;q¥l‡V\½OlŠ”Œ­ü¹M†‘VÁ@!^ÂîBYêýϯfå=åÂZ‹aþƒ·hÂ!´uZ‘ÍyŸýˆ_ZõFÕͺÈj_rk}ü´ÚÄýwVÖOéRõªIx;ú´›‚[Θìs™é–ãäv¹ùÃ/~K²‡põáf2ZåbTÇ#ÇQ‹Äö­#eÍ·p1ÃË¥¾qÂwØýÉß%2¹×@r§5m÷oÒK›ÞO Ê«[ÈÔh3 N8ÀK޲žNÿQî -…öóuw.ÇwÆí sÛœAªY®W†scѬl €ýøpS›0Ißf°öH?ïULR÷)ÿ¬ÿŒÖZú¯h‚¥eýÃ68õrB¿LÛã¦TrâsU?PËSvø“’º±ÃÅþÖr¯:|æ{ÌßØî‹²B\]†¿ˆh,‡­Á‹€sÛí…$Šc"¼ÂR-I[%-.ÆÍåÊïÎãD^öèòƒ»0åÿô•¹ e‡BdkV•÷Ä}fÔAàÃK~_È="aS&3-4*8N–à3ŽUár™¾¡ým&‚µ xÛò¿Àª ³"•‚€0WêP$iýtð…+!?5ß·° +^³:õJVoÃî¬èá€q‰'CØÀÕMpíß_*ƒ»Y¥:õdR¡#q’`f€|B”ßﬣ¶r­biÆ<ÎAƒÓ˜‡¢Û‰aoÙ‰™O“êR䉶˜WcsÄ Ë÷cÕbZO¬½©‹sj ÑǪ§ÙŽÏ–›¾Ë’¨‚òY‹oÜ œ¶› +T(˜’'”L+½Z„ ©rõ5¢î\™h§T^)8*±?®ä ÁÕ¬ûøÇR`PJ„T;†¨³e9‘Ù£ð*V¶W(ûl3R&¥/‰ŸÌ0ô~NÝåÚ¹—{&3¨'èÿ#§à¨\™YŒ/O œ‘ã$]©3ŽÀ×l­#‚=bLP€Ã“¿ÄT]ôï:ÃæIé¸(Ç¡(µˆù9ž ¿Ô¦V§&å¡H1âÈo¨—HŽ Õ0™:»ìk¿( qzŸšÞq^E×$) :àP¼RäŠþ 0yŠøz^Ûr™¦ÎLœiÓ—Û.æL¨•ì±e«öàæS¬¤-¡‡÷ÂIí›kVNÍ0Ív…9f½c—Ì1‚²¸4ׯ3I8ÑçGŠ3:þÚÅÙ#ÿÏÀõèdΗۘäò†¤½‹×3¶™F¼ïÔéxöYÿ¾þ˜e_€óÈ=Ó‡»¹ŒÉ®çT{7Ø!þlrñû"v<æØõ„íäïÅT[[¶J”>Ãh$^ ÔÓŒà-JY+ö¶f•é‰^u•RM»Úžª<[ãwvrÓ“Â=ÚÑ3Õ§qÁ õaÉk;)X?öRÌÞšýzêÌÿHãeÁ,ùZX¡³]õyŸÍKvCô‚öJùøX#f6™5ú _¦¦¬fá!æ¶þ®"¹y›Cí©ùXûºJe–àr%tüC½gÅü‚šÔ‰dÃxY?òXìé3 ~Gdpî^‘ í*Ñïìp’›j‹{g3“çv˜'r¡$•{ý=Ã%úžù¬=íû]OÚ‚¾%Úyï~^u.‹>ÀÓâ@wC€áx^1çÎþù‘„öᯀÙñï+;ë®øóPq ìûðoMÆ»jbâ×ý–sælù«Æã2 ¿,ž, /ìø&†Ô`¹O,¦‰ç°°^Üêc8¶ÙŽÔ®ÕÅ¿’“à¦;}¾¿§å|˜‰1³O­‚¸{h†ȃJ‡ë¸3‡‰%ð廩!ññÙÎ/°híì/`‹ïÐX¶—ÇáPz»Û‰ÚÛIº‰2+¢êÌ}–£ØÔ¼$Áñrd;¯)M,ô·ó ¨)žQ;övÆ)U¢»mÊöêVGža9*‚ËC”B×-Hx‡ìµÖ`êžh!Õã‘èIYx'6,`.Ñ/ø/ÿÑŒTpõ!£o¨!Ì­ PU"]öÐZix$=Lþ|¿wfŽ”#Äý¨kó;´ÔdÐFõ´ w¹¤t¸eÄ5—ðúlô¤;:dÎ¤é ŽÍoð¬¸-è>‰àÚïW =ö°FÏËœµãšŽm ±)ŸuwÖ9ÀVX€V¡P߯‰•ÉAþÆaÿCåèˆ\bò«ó÷3ÑÊ$Žs“íx¹RKNÏÍ[}¼º¯'Ñàéï_3ÇÕîóß‹å·]túBè;ù‚ê\¿ƒ˜Â¾^Õ‘>íẗ©üÏöµ˜Mþâi½ýßñe‡dÄ#?4Äh|ò¨€?‚nÒ%²+ƒ’Ü~A¥ÖM4õgÆ^Iþtlp>¼_ËàC߯¡Ê)(R#RàAMô_~Œ]ê¯Aœsïþí¾ÿÛo>'æÖGÔ¼€ðãÿ!HB€[5tß§Äþn—Örár8ÒÅ› „m†ï³°ÿ‹°¡h+»Œ&-»“÷¿v½ ®}ãð<ÁêNœ“šŒœªòãüMÏ‘9ŒV‚Íq—W«˜°P]ùkŒÅß?øQ-¬—À )J.ÉÄðËÖÏÜa¿—öíudo¨íß·¤†-ÃDõ†x_èïüz²|w€oÒØhÀŒÛ m3 Ô~çY½OçåîF<»¡îÚC~ú Ð’þf—ðÄ—øÃ781?ãù‰ß ¦]íC ½h!(ÈH×(=|ì—¢_q ÄÁSxGy÷7p@¤ŒìŒ,PF$gB£mÆ8ï5L”±?úúìÉ€/þ¬§=ÛOéoÙ¥0ÅëÏ1fo–)~ªŽ=ǧú+ü‹?Ëæqùåûš’‡Œ“ÑïÄù|~òŠèÜ…ó(“‚Ý6ºTx( ¾Åå¶*Ô)rúgR¼`gßPe_—á4Uþô*ƒmó‡OÅ S, Ý‡É%ž±‡ÇœªºŒùŽbš*bšù™&8>_Íú]äˆ5%Ç5Ì•. ™b" :^'Î’hž#ãI™7 Üõ¿ö°û3öv´Ç"°„Ëtøe?«?ï Cø®­ág×Göä #?‰—åa˜€“Ñv9GûõNÈäž®ª>§mÇÉæ‹· E—Æ6CÌÿ·]J§ò•µ© Z6êƒèÆ@\…]2gL|·|É<*@¤³f&zª½Çk]4³G ,»êQ{SÏÑ|ÒÔ½5ð ®ù$Ÿò`e¯¯3åÒJk_´A'4„ Æßœ]•å®8·Ey}ݶ ¸@º|¯ÐõæOCëß4åê âÎòv¾vês Üh‰šä7´}ß…yb vp›dÇF+õÉ”!ÔÏÅÔ𯑬´ëГ ?Q䤟šxArÕ‡OqþJIÿ5E*—V\©¼íì{„¤‘ z‘…#ëž<î„v½°–j4^G zòh‚oF3ì€Ïô® ;½‘KìÏZòö8Ðß.³Ov¿œ—ë,,ýcê.~Òk×LëÄUàŒ~ÇÏ®¾ï@:ÍÓÄçA’Ôp)ê–çõçëë>~áà¹îÑë õÐæÏ`? ÌØfùå÷‡›k³¶öeƒƒñæW˜…ÂÀ²×‡ô6~vÞž¤>ܸ ú!©ùΚ¼t°•eöÐÁÀ#r„É"3uP‘‰åüÎ׉â@Ya[¥‡ø)Þ–¦³V½iê¶ýÊOBœ;ßÕõ_JA¤'Ö±EâýÎäch&ñ:pwÙ**GÎÔlÜ‹P¾…ߑǢ6b‚Çщ5˜$Ϊc‚Ò›yjÎ~´{ §»«]wìÔƒhè@4'ÏüoTcÈö! X[Q ²L†·ìÀY‹^¥`,ãkgÛùܽß[ï sgï¨%]n9Û¾O'W2=Qì ›jà+¦¿Ð€†ö„/de2æN\?†§ç±+³û^<ùÝ@>ÔkN¶$¶S3âu†ÖŸ¯Ø¸ñÓUµÜÒDê°™æ±3È—Få×¢;Zmæ D[Õq×&*… –—"þ¬Þ’}Ÿˆ÷­â·âMœªO^ÎåÕ"kñ ãó­G´öáEª`®c…¶óôÍþš?nž‹ˆ±nÿ­5½²¾Ówâ–n!SqÀ†Ç!ÜÜåeÁ¡EÆâ4òáIB4XVÒé ÅððIÓI'F˺‰Ìüû¸× þØJx" ƒû’Ýf;¡&Ëò‘š<8}&G´À¯àßó(¨Ü¼ùÌxõŽÄÊ,Úë±*—/÷…qü~-R¹—aúXÜëå·¼‘Æ5ퟄ§¡ËÌ¡ÓZec’\ƒ™2&øR+MÙ&Z”ÓM3àeþ×å+Øp‹:Ä™•#LÔ8düÍåüŸI¶,Ð8 *3ÛâkŠ“å¢@».È/î!È@wãKA‡¤M'¬üNnѸ~Œ|šŽ>éþÍ—“XA½,nLo¿KD˜î%Æ2 ©ÞǯÕ×- Ü¾œkBÄÞû'ÁB";¾ ™†…QüK‹ÊCžˆê±Ý´²Ëšùõ§ÇŽÃ?ðà4Ël„›Ó—C€BóŸ€É~s¯vvÉ -}Ë Ÿ*#m€.Qœ ù5£äñ-Ã-N}5Jô?¾*˽væ«p¹¨ÒÌé¡XÄ’®ŸR¿·1êh&ŒOý˜ýÅEi~qPµþM²îcjóxêJ“Ö_ïH6ZÔˆ/å÷^ÄYF^Í€k—wWŠ!¿ '['OÇ9­Éû^)°«ÙÑÜØŒAA`ÀT[åV€¹ÞhBýH¥ÂK¾vV(§rÁõ¹ìÞÎfVëŽ?±ö.i~4­~1ÛȹvBý¹]& ô|C»*×òUI ¶ÈÝÆ‰Oȸ5³:¶9ó/²ÊÜþXVÛl³Hª‡ô\ËBj+ äIc’Ø(àúžèÇäæJ@ÚážYEÉ©Vo°qDøgÂéÕ8bû oC‰aë*éý wnkÚô K¬­¦@'Õ{•% ¯ê”¤†íJú;tn<öûóçîÞü½7]í7pnu þ§‘¡ð›ñ¦¿’¢ˆfUìù±ÔùT_¹%eít¦£1á{rŸN3µ\pï¥.!¢1px3ƒ‹ß“Õo›Ž|tÂP%D©f¾=‘¸d©+*<µo;E³`¦/ƒR§äù4*ý¿"è™0—;-°þ$:èO?SÃLjÊnCÒþUö1uI·[’Í-ûùŠ*n}°Üãò£=Þ GN¦¬]B‰G÷¥°^Æ—ïª!BÏå<¼›õl†Ó»Ô~ ,O‰­™À¢á… ·¯f¿ºy]p}|°¬¨RÉ !Æ¡Së!9-gÕ¤e@Øc(Ï.Y¿ê¤0[´›°A4WÈKóþÓ”«;"whB'ñ|,`ÚBZ€ƒ'ò޹ÓBG‹p†¬ pGr!éñ«Vr#œ!åÞsþ¡ûówUÓ\…p‡E útbõ“Yòý‹'ôÐp7ï6.|Ç‘@"rH~tôµ°âº:•q6\Vª4õù´Ηóõþ&¾Í×WÉž/Ö øvRVÍ?òК}f™rEt Ag—RL­Rš—ÌŸCjÖhèhÝçàÜði.©‹B´J8Náízc¶£ÃÛðjq®¨qœº)g}&DlÝù$¼Û8ÌB‰/ðçžAæ?;F‡Ì±eùˆåÓC'Š×ã! ‰=€\ù‰g €»Ï-^ÏøÿškSÝwæC?آ㆖ãMá‡ææÛ&²&Ö§æÁ–ÖPØI¶^_Zs³ÝOÇd=¬¸|ʹÁ«iÏ1ì^T'ŸbïY,hƒ©ÖB#׆jž"(ÚÄ}“¬Obõ­ æhWCíoÙú¥£¦NíÌE~1*H&¦ù«.[Ó.ñÛ”BŽ$;s‘aª´Bh‰Øžvߘ:~ɃK_Úʲ9§H$wNIH$ É +Tñ`,tЬ‚uCÕ¸edTþfüÉ–xrJ»9°Ì£°O~Â[ßá¢r°,ˆZÉ#º:CPÃÝÊ{Fñ"'~k ż@­Fê2å˶iÙy=ÂÖ³¤Ï.æ7cjq¨q7ÚÞX i’}-‚±_ä ‡,Š:!T°©³Óø%»4„·’Óðß_3]ëWt/1(!Ìé: Êþ{ê³ëgC^6Ùë?ƒët= [䕌]|PYšfÞøþ˜ê/Aåœ`¼ÄþÌÍxË?¯xï–8Ù€YÉI{b:±Ô;úšF¿o@µ×—2ýÜ‹ø|ð¬“í–{j?yöêeùe‘–?1¹¢xƒîX$¤£H¨ý~z¿ðg^ ‰¯U^4“pï‰ü$“誱 ¬c–Vû¹kF5Xhä­ùeš• ·PîÊøÎ->ðçžâHöVŽdÎöçölF ÌÚzF=¶w5"ö–ˆmRƇQɵrA— k"âuh²6“Ýþa‘*báÄ[9üÄÃÓÓ%d¤]1hD‡Š›>Õ6j²­ãâ—`kf¥¢“PëJd#ÙC½—æs9Ç¥ö âÉYärÛa§e_6à ¬­oS)'î8Š,¬,Ç0Ò’eè'ì Èd¢›Çsä†È®Z#éjš ƒH†áæ!6è$%ƒÿÐ傃j* E»ß¶TFLÎ{-‡kèŽ÷†F,ïÌT9×gz&^uêõ8qª+ƒc˜Á0+‡ì3JÁÁÏ…µhX£&(X(§Ùƒh™ Cg`€¨¤qot „‰MІØÇº 4|ù|¥,´Ì*ßtex#ŠÊ¬øä‡i$­hX-¨Û«’X b’¢˜È#®âƒZòDHo€èÿ[ÍÌÊF‰è“ÿF+q½¶é¶P´£Ž¥÷¢˜ÙÜ¢‚bÌeÅA jôe±:5]<1úy Ÿ“ÿ tfHÙRèBK§n‹©®|õ¹ÉÕ"þɠ—_^.Eàp‚—äy“cˆˆ¿t­µÁèø“Û·1Mµà5ÉQëêOOD'?ðõ¶iŒ©\qdøìB3µ9y]Í¡â]ìž^a…ÎÛƒ–˜Œ¨°/k‘æ.‰b@……C-º¦VWktçÛ0cØý½©ÊETsngR®ªtfܼ°é¥@Ò¾„4¥~óø§i‹Â9¼Þ¶u„ ¯f·EXêŸ#ÔÛ;·¿›£|¥ïV²€_ˉ‘ŽC¶]’ºyŒlþZƒ•3ä.Eï4Ô!4³Åx>ÐV¢GåÄ R€Åáݯa;uF„«õ'Ò]ùf^°Ã`ê7’ö½r¤ÔR™ÐË?ó¡>2ÑÖÞ-iS^TÏ'vŸ—@±ø}rÊŠÕk,I}!¯=Ÿï4«IÀö&Ùé$L#ì s]yj€2æ–^C4-e‘5'-6¸b_æ+»Ú{Vb¹Ô»Ý($~ðÉO­Ê¡×~Dnj÷ÌÊF¯©ä|Ôoáðmó|o­ðP†Q3#ÔÆ:\ßR¦Éx6F,·¸ev)l£JkTø]ÉÂm˜ô=½ž©ÆHÆÉeé—á~”¦iKñ`ÖÏém¿xã£ìÈŒË&[dŸ""®ïNЇC ––þpH~XÉxfWÓ,ŠV´QáÃîHmDÏòö<¹è …Ô"ãvy¶·ßlåc*GGÌ*Hxèo¥%›OycB@QÒÄ)0z!†$×±€Oa3e"2áãN š=˜‹%È‹^¹©Á¹ÚT«ö~Óƒ 4%ð-SŒýƒ¨}@8Õ»d Û‡dü&ÝkÊê¾½tOI[}ò\NZo]—š¥u#sɆÜÄv£Y˜"˜j‡*‹#n‘Ø¥(Ýô»¯d…ÿô!¾¥ä–«‰y>x…;Sn!ÊÑÙ³±‚ õB–F}dfE¸MüÉó‡S-{hþOÏÇ3ÖÞÓ’·d“&Á\þ|HVù°íàµu •`nÍ2BdîÁÑϹŠF_§]ŽÝ¶Kœ¦©æÖ› ™"J'qAËÐ.Ärü¥‹û8M¡ƒÏQ–zsçû_%éϯ—ÃNYÏdáýsäŒs½ÍðT.*­‘¨!Ó×Ür–ý'Ç€]¬™:?9¸È8Ö@ãs™¨3{©Ò  =:éÀê1æð¢÷Cú»l´×A,l0j ‡–§ESæ-À¨vdìy6[oŒ(B‘ªÉ66¥–À%£Ç¾q9ù:ÓEˆôO¥fÚž€?JÃ/¿†ÑGÊŸ]=‚.oßÁàÈÃWJ¡¾Ÿ´?S·BøàO™>?_ð üM+½ Ãr™Ê0÷æ´¢ÆEˆ73T³—ê5AEyA¿(p´ïæïóEŸ.Ù¢M¿È>¹g?ѾúW^ºnµ'ÛÊd) u™ŠJÇ _Ð Ùè§g!Ôö ÜEÂóû‰N¨HzÜ^tiÝ&»JÅ ëü?±7}¾‹XªŠ|ñÀv¦§Ú ÊÐéÓ=JðTù÷ÚõF¢#سÐ@v‹nRµ‰€×"ÏMÔ8Œò·¹ù×T ôµQm¼ªP„ë’¤-ùCZZ*˜øKžæY Èΰ¦×1&ªg~üƒñÓ®Ô×:HT:#]Rk‡âWþ¾0–;Ý]ÀÖcë®Ãä[d]Šš‡p¹ºýÁ$åù!b®p bŒþ÷Ö¤ªëÕQ̼e U¨ãTÁwG}¬ÙÎ$YêV_néžÙš:0…—SGtÆö(by Anc{–RpF×"¢gÛG2g|Cqcë+~´ÅL³x 0 _ÐÆ(­ðCË»gæÉN} ×7É žyä6G45³¨sÒ–Kl¶Fê»FÌD~ÞÒÚ«j0–‰Ð˜Í6+6ÚLAi;6s¤¥) G¢ÑîAé÷—ƒkZxÚkH6ŽÀ;ÅSYxçìR°"ˆ‹¾ Ÿ÷£å°®6&0s`6!^/ƵýªÍ1ËÖ쎂£Ñ¿ÉŒ’RÔ\üOA„)“Ί6“ku“!hßÒŽ”ÍÜ›Tˆá*åÞvÏ;;|Å`ÃU‡u‡eÝBùSyè£r¯jƉ÷$+¦`ÌVhvY;‘ç°!t€­f'Sç¾»YÐàVËí%¸oô&¹•¾9åe-MOè-l­«³¢\/Í:õ%ä[åµ;Α‘¶é%¶yt?ÁSÜ7“¢€Ì±<È癟E¢×ŽÌ¥O}¤-«VRÉ™-Fò©“ùPì9DFQ wXˆ/%¼¿^&Ú#=1³\e­¦UýL¡"?©é@H×ß\¿ŽÔÒ÷®¡l*D‹† 9~^é²T «~rçCoÕ·Á'òæÂËœ8@xÒ22xU±“i=ˆO)ší¨²Í¿?~`^ ÒÒB™ÆCfÃó߸—çÉü!Auœ|x‘¸ðŒJg œm×: úÊl½š‚£ðœ~®c2…i\Úá?‹Èó c‹&ï4\ ¾ª…Ø{€­Ar­9L×vtE!ó2PS!ˆÄ?•u}e­3wQ:ð­8ˆ˜äþ¬9hñŠ¥¸®Ñÿv R2eD¿8³ÃNú2l7Áÿ~ ¡xM9›“®ßàä(|ÉÜÌeŠNxºëgÁ$äÝl£“BfÛ~úUA Nð½].›<)OnÝÿ¯+ÉoŸ…µ'âè®Ã½k†ù«æ‹?!YÇÈ”éÎ]GÒám®†¨†‘I?YyçsPðÎc¼èÇc†bû‰/Ó}CòØäDÇ®åßyWIm«î%ÚÈd>\²n ~D= K†ù½G¶Ú2£Êv{i';ð§oñ[@Ž+ÁÊàëi\Ï€²íòÀ¶j'Ç©õ>Ý8¿ ¸óxõô§Æ‰ÛDm=Ø~ËGsr 7FÚ¦ Û< !ìŒ ›a“é¤E¤F_žñœ{YYü`´~åôÕV‹Ó€MË$Ò!‚c”o …»ÄdkK‡ôLë¿’C‰q“9ú(¬ðEžyŠÒý¹±wÍf6üî_Ñ{奸Ó0ÊÆÍ»(_×d<øVªÍ"BBs„ò{tÙ:o±aêo#ƒ—m–XØê.=] æò †Eâ(' k$û¯(+Á?F¼ÕÆ4‘NÏ ƶg”Eéé[@ § b›“<¹Ô™j\ tìöÓÈ ¾#Õ“ÙÀ”®‘Ý‹œ¾~ti²ü¯ÀÒ…!?µ¿}5wås'î˜~Bï áZÀ´Í{,yf†Š ¶ §£áæ¬ ©/éOÿ¶dÜ€ôŠä¤·h<ŒÆoE¨ŸréÕ¢V±ù2{ }ÞpHÓäèü¯¨Óý1s*œE+ß"PM¿_FiÛ»)±”q¹éŸnŠ‘"ÆŒq‰Á’v6÷’¼¦YFí{Íj–VØÅ}íèx¯kbT^ZJ2’¥áŠÆÇÆº®ôGf®Õa¾×^€ºtþÑÓ\±e&ŒÞÎ/Jºï¸1ÿ±œš­Ã0d¬ê—(›ÙûGác/nÝv E¼t¡™CŠÆÔ‘»½²S³©%šÄ ¡“SyÆ2Þì-¥×[}¥á‚8„"¹r†µF‡OžøX“ ­U”Û¼à¡á<Óƒþ®å§Z"6ø;3Ѽ[îÝÓ-MÈ›‰9ÔøÿZv4âT#»(ø…j˦´A‘úÒ ~Ìy$ü/Ô(0¨¨p²'—¯¢©ïž‚ª±ePðþS Ÿì#Õñ²tç ò0È3‚ð{fm$ÕuüˆÐåÉÄÀ6¨ÿONva{Ñ»çøyš€jw-v$’‘pI%‘áï šaÎ ¸s†Èk5?¡å×ßÜ'E™GvÙ¥>_õjõH¶[YEŠùõšöDÂopZ~ê¾û’ߤºž¬&•el;m$Ÿè\@§I®‰AKct°ö^½Ø „Òæ+@fV‘ºÝóè›ÿ«/7õàª[Sj· ,«­ãƒ÷s:é:a»¢Üµ\m@16!\QOêDZÑ1 åF »ÊkÐ$“öG_–‰ ü’mçˆê 1Ê»+<ÚAÇ|˜å#™-=ìü 2ã.÷²nùbœdGo»+j ¬ÔP«zƒ ôä>% ëmí·7Çzè²ÏD3”­ŽÜ8£…ä©9›òÎE©4ÁÍß@‡¯^šŠ§©.×¢z/9¹?$k¨Í9èu^uëéASƒ*X)Š(B9©u‚NÛìƒMײ­†&'g >ÁŽ Ç“3»v<ʉ›Ù»Tm–ñGΪfò“&*èÙ šNp2\ä7 ¿nÇÜÓ ® ü,"}²½ª ÊJ”%W¯›~¹qpQ4#¤=a³S-¹˜ãž°o9›|ûõÃö!C"OÝ–úPÜ´‹ž‚W¥c¬S®:š÷Õ­0sdË{º™ÚÊ?P’½.Cx¨³´OÇç›·opé¨:”¹4ÒÈe-¯p2zåIÙôð^%ö©Á3Ûlí7m É/_]~;CC÷R‘üI@ˆí‹&G0|úwïªÔ‹žÎ› ÇùÜ‹’ã‰Ê‚Ó ‘Qþ. >Euýk(fCgÂr¾šu ŽOV›Ö6÷Y:;`ʹ5P—"ló Zà8Ö‘¸(^2Iš`µ\ }á…§X|%:£n¢¡5y €ȼi{Ìc«„ŒÄbyͺ= ”rgÏÖ&¼™®kÖÍKî Wc%—Þ·Ê`ÔõsÑŽ)²VcŠM=ø´ÿ†£( *f8¶ÆÕJží¥uDÀ©øÑ[ußšÏR }æ‘ÀÛÍÙ}Û¯IÎxv}F‡hL*jØŸÑ3Ô8EÂtžµªÀù³P[Ͼ)“±½¾sTñ|L²i4­äçªÕîÒŽØs3–,äÇ'ân߃tG…¨¥ë… dQó¸bU³HóTNÛãœo6ÛS"Iª“Næ7«@¨hâJ_Žú²ph«\Ó# Jt…Zò}KBæöW1žÚ=¥yÙÓår’"™¥§}ƨŽWz7-IÞÁܵ×(œÂÜZÀ7P(Á`ÖACe3Ë'Uñq›DÝ l^2q¨‘0ÝÍ‘„Ï脯H¦cxŒQ‹—¡>Öܸ^N¦RÒ&½Ô[ªðk~Ÿ§jèûÞ!®·>'XG…oaºiRHJYf.O;†©%ÕÛÚninÉr*2 L”¯ ~ ŒE-vWsƒ >I ìFËÙ$C¥p¥™N»æö£ƒƒBû+Ç:DJ ç"Bs»šº…iù´4H¶y “$ðÑÎ^c"4±î(­ ëkmÉ™ø²á˜ïûÛ·¢·ÐwÕÓå@~±òá®n.´Ž€¼àï*ZÛ¤´Â8¬&Ÿ?Òä¡ÚK‚¢f êñƒrqÇ-!Ħ&Zå2M YÚW¹Æðñǘ•Q/59›¨+LäÝCFJµà{Ûñp5ý)…Њ/u=úÙJ%ù5ØlŸQWlјçù8DÙ¿§¥™¶rËÆíž;ôè\¢.,*’¤jvhT^ªˆ no.¹Ý ý'ëù5‘ÓzH;®Œ*q6¥ÐFÅezUeŒË¿!ñ»Ê.ÿ/ ä´AibMíqØâižŠÇ„ÃàS"a–ìw®¼7¹Pº–% ù@$Ž¿‰¶úcñ¨JÅnÅ4XôT5^Sé©«–€ïÑ翃> ÒÁê&¾~ìkÇ šóºöVæ^ÛÑš?uDh¼¢¤C:@«¹ºÕ6±t4»°²ÉÉ ÉAò‹°îÍñ[Ž¢ € Á ¯cÞŒÉ8NW‹¤‰Ê!ŽñÆwL¡z±÷i·É, å¾o×r“:ó¦Ž,l—ÒÄ€ˆk£Úyëþð0U¼óÝã­÷ɉJ„Ïã_¥[â57VÍÛ¾FÛ’<™ì:IÓŠ(‘æ–QŠ:ú%RíJTN›{ó’—æà G!Œ’Á5YJpâ$šŸxæeíø!É- å¼jk=8ÆEÈBQÆBß\\ŸÚÝãV·žKYÙ˜PeEÙõåCÈ‹xPÑý¦vXIÙ¤•z^"µ´b‚r#¡Å E&Ò2`ì,±ÿ¬ïê>>®‰#Zåžz¿ÓAc#ýÑÄÓ\Aæ)fG GÖ¼UUúB:Nl9ñUÒhXîíãÈ”z3?ŸF’OÏìÈ– ³¹ÃhÝ/Ú”Õ»5§à¾éüQuÈϱd¯rŒ™á‘fO>ÒR_n­&sb¸JÙ²á²c¾¼ö ·á'ÔÁõ4Н†Ñ£‚‘ó»z`¥2)êQ£\…¬V:û –ðQAcÎí²Z·ï R}úO.ut=×$Ž\M6„v«å—ÑËýåH 5皈‘Ô >O:§&Óº;» ãÏ£©R—‡3“Ÿ)ôÑ'f÷ìð rŒ³7WóG> ¥àÉÒ׉¤v3ƒÿ æÏvzàã³­I¤ˆy‘©‡ü0þjêj†¬è¯æçjù„ r®Î”TÍγG5ö˜ð}Ü]ãñî(£gJÄTfûNSzû…EQ5|0Ív=ä)GMêÆh3¡V‚ ±ì!z¯4}¤W¸LŠ5ϱI1¸{͵0KsY:wMíÙM Ò²;æ+ëù¨=éÆý )½ãð×%" µ×lÃ÷«J˜-ömXc  sÅna÷ÔòD\ë€ë$ãâü¬ÀÍŠtZ36Ͷ)Ù°=F芋¶›]<E¹åž`& „€É+µ@–7×5+‚fíJÁÖ²®á5„@È\$+ËRD‘e¼L}VE¢G³Ö#¨ß²*íÚV@­œ$;-ª¤ˆîþáNf˜¯£¹`#ªþ|/w]&R“Ñ4J63¨-nãM` |cœÍ CÖ¬¡»v:`°±ÿ-VÜóÍèKl^ðýó¸v†?l~3’†WÖ±0FÓ†ç«z?ª¦ä´ìO¢Í‰|fMA€ëÖh%Èe9N‰ 4·tt¶:çnPtì9Ú„—€Ã£ÃYÇ”‡¢%Éw¨†–dšZwùõBóâ"³:Bæ ø;¨0™öÞ7?-únïÙ"H#ËàÞ_w»Æò|A=…nÎÓÒº˜nØõŠÜ¨àNiˆ™¶Û%skÊ£×ÖHo/,¢®PÐXøÁ»qºy£\°-Å+žÁ"©ðŸñÏ™¯ GÚ¢bø½MÒÀcˆž}AšÇÄGt©ïBך¹¦š«óH*æ†ÊïmÀ2¿Ä¿'u7ÝÞʸ6ýHåèwo‹8˜ƒRü,¤´Y±k.`Pé ÃS)ÔP‹bö‹ 1ÌaYº¸eÂ1´ÄÏʺ_!ó3i±ýÏ %~ûåhsE‰5ü˜ŠYÝ “Ê^«~¿TŠ© äx‹ëJÐ_»"žûÒÍ´Ú99öÑ]ô37g¶ÊÎkév)ñ$DþÓܤlø%Ü„jò¿g/2š¬7ß}ÔÎÅ´eãPÓøsHE{cpÚî'œ=ɾ?ìYi¹^þ•t-ÚÎOTƒÆívS_qc¬³:‹¨›:ü¯ZÃÑ%áŽ;teGΤÁqE¾Õì÷f¶(û¬f^4œFº¹­¤ƒnó3Çá OH~EV“JÌH?xçÓࢻ"8FiNJ™’­(½„å$œƒ(ªÖô Œ: ©šÉŒÑç\)’K»Š)œÏŒ,¸œ``Õ@ì¦ÆìB;»b­¾rtdʤÉÞC>1έ‡Sïþ ½uféOmFÜÀîT40‹'ÈêvÇ\†~…ªM”Œ:Ô§-)gz€¼èOß¡þ~»É³‚èçDþ¬©¥³ða‡jÎJ²é±Ál‹*÷ùI%ɾ”püK>Ø;E×)Q¹*ßÌï{ÁOÿE¤@ÍúêŽ^+PKaôãÌí,¡\1»Ââ¼»Ow©bV€C“¢ÆMzòÒ”jš»üÔRÜ|Å ›Ñ³¹=^Ò)«=Üdÿ¶ªí"å¡$ÉŠpÖýdï Ý8šT>UAÍrp¬ ^`úÈ. ÄÇX%úfì/ô…v±é6¦šîgéKc3åBCA-[6ÖèÑI¯ÈñøÂªB”gC$’¬ßÇgÖÌŠ^‘ZÞùuêíYûŽÿàOïJþýúqÞß×j¸GšÓ3ÔÏìû£ÿjÈ®}ˆº·…z;‘~<$*¯/½ÿVƒ½è!Ubc ñüê¹_À“Õûü‹éæ\‘pš2BøÛ¾úcñæÂá/ÞNxÃØ‚Ï1qhÄC£Éø#n•0h±&Eßì8Ìû$Ùœ= ”tk‚çЇ‚É}p¨¸\Ë…êRwU³ö pD+ÅË?ø¤¢„ J-ÃÅꡜº­y,Oß}%‰é$$ ƒÔ™ŸM#þv¶»=^§f[¥•QöhRACÇ·-{4‘ÿ‰nÍB°›n- CïEsÎ!37‡šm i‰)¤e ˆ¢Ð†V`ù4í:[HSÙh›«ä†Ü{OF ¿eë‘@ö˜ä>”¤anÖ>3Ž­uìŽg/ŽL°’Ï ­¼%»C˰¢6Î Ù¹e¤´ýЋ©ŽâŽ,… #p9o«`YŠ¥nÛÕ«‰i°›R‹ZÇòPcEDt*U;žb¢Ðg9E×äOƒÙ ¨óƒÓ¥AIØoWS&Ûl>e}ÓŒùm‚Ø\hÔý<ÖwOCù'!ÆÏ©/áòMÓžø-æêå:ÉÁKqT£Õ(S½z¢o8à0…јZ ªSèókÝ…¢èsqœ™zí…C"rD¹N*-¨14ŽºÇ/™³FïÍúW*fÄ5T[¨*c¼”½Zˆ)êÔH¸d³Ó±Ïbc/„Èú@ =cÊ=1 ºÐqj{²5´a¯“² Ã<ú Ã.I¸YÉyëÞÿmJB:sJMüzŽýƼBu,”Xþ6îiv'=Fð“} lñ?7–¦þ©/­Á-Y¯Ù¿§™cÅb¬¬@«¥ê¾‰Ûóãó̬į¼<õöîVWâº'åÖÖÍgÎrFJ×UjLÂÓ”SÒÊ;/Ûº o é]d3`ßÄÅŒÈ ±eL+ÌÉ>i»ÏP¹¸6°/Îz)-õ­éü"CÓÚÖ&h€þ˜O}41.dã-L;-y)KŸò g×eÞHf;Ž&àrw Í‹•Œ¯E(à«tHüâç¼ð¯@xúµõÊÙ¥Ê5&ÓààÒ‚¥ÎÈÌ YÕGö±q°v {&ù'}~[&»>ú¨±oµ‚bú_Ã-9ìB”ŸŠ½·ÒòÜgå8÷f?¿ò~ÜîeÛÙ©Ó­l“²á—’;Ö¼¦Œo‘SÏHsÁýò—ÜÓg%9|K‚-ê¤#H¯ÞÈÉXÇ 3ÓM:ᙸ¤üÔÐg¶°>¹ñKñÍ&M Z!QEÝ«,¦¼ÀΚ‹Þ/ï쀂zÌ—¾ª1Ǹ²ÔѬÂktn…` oc…êíM¹€uùhòªrŒKiÛ¹%ò–Ub@’àó#sï?rE·jÅ\ÄxC4åÓ8Bرç¢+z±lÌ^+_›Û¡ÓÒþ;¼Ùº5ÙÓÒð0bŠ,WifŒ²Ûo‡Ç\˜”`UïÎñ1@;AòÏè¹Ç`~%ÂÚh°ñáÛà„û)X `jºåß®ýzsOvë5¥(Bw/dí^ßÜš²Ì™¾ô–al%ð©ÕgšºšYWttƒu}‚ˆªÐ“åð!ë`Äþþ@ùùÆT„³L®iZF&eŠþƒïø§ŽÎ„½åÉî—[uãDtãÕ›™j…Ï<ˆPÞ¦Ó³Þk.§jhUnÑMù“-D“ýG¤´¤ „œO°Ì×y=ìÒ@¬¹ÊM‚O1w‹>ŒEâʮ˦æ{·J‚F…ÄPå€{¿£,0Úž eʽ¡˜ðµ9ªÀ°Þ€ñö÷ÛàÙϾv)j<ú!g8&R˜\ÐÃÝn 8úbüËžœýèòì pb²mš/\ {o¸šÁ²Ô¯ãE y£É8}”bæ¶I+É%ëÑ÷Ê577DlcI€u’&í‘¿ìÛäqrN~QÊîÙŠêÊ eÆúc% Í¨O–k»ÇL1T_MÄŸÊ­Œ³Vq‹ áª(«àB’ïß"®¯‰ÆÏ2ýN¯ôü²vî1ØÔß"Ú܃1° žÂÏÁÆhsw‚NßßùöýÍÀ^ÿ]­4›Ãß}!söyÔ“ºó°|ÇSÃÇ5xƒ9‰SoºƒO¼+<³í˜œx¿Ü%Xš»ˆxÏfKEiáè »¹BÕÇ$•ÀÞ…Ùܸo_µ'HaùYg}@×Í­þ\d_h}çÛá°>È´óŽW¬dE‡tä0à!J±h­ÁDœÊ)[(¡]Oß”h9ã´$>õ‹š•˜îµÝóƒécØÇ @á†eŠBé\0þËë©¢ddtÔŽû%Í?¡/½šlçû¬=2¨áº4,4:C¨N™ èç…­Õdy`DÜ: Ohþ -H×ÀYµ``Cží6sççlrêîÌt¥ó& L)¨Ý»$°!KýõEŒ#ôc·1^ù-©Ûž-eB²z“îþ¢}Ýfž=æÜoý%.ƒ`Šˆôü*‰Ý|[Ó©ýz ÙâвˆEHÚ÷ì'4ïÕ0ØdË_sýŽû×Û×t!J‘‡°ø­‚ êßm7%´x8òL (ÁÆå†„¥Þîp¦Ö[Fˆ–mf.QHéòÒ|œ½­ûxs2P(HaøãÿÝZÔ‡¥=~ÌŒ\ûõhé{¶øtEG)6á3ÅÖ À)rݳ´@¾é@@¼Â–kÓÈ'‹íüêÞåUžIM/L_“ï±~¿Âÿç«Ü$V(òs_²ÙŽBé{lüµ[Óû1Ïî$|H]±Zã%{W“1—6]ˆ{h€x¬¾ÚΊ}éûd°r_K]l×¼“£„¨ÿŒe‰ÍªÝÙaQ2zRÐJÉgp#¥³äž7¿ÂêI§6¥'$Ò34ŸîåÎdû1µwÎÀ`¹äårϘ§”ò.n²…¥–îÌÓÒ„uMކtŒ¬%„ebzÒ…’Í€Q6#Ÿî¨$#¬³Bd·îŒg'8DÛLËFŒOÈÐÈZÞ†Œ#Kä[)NTؽ'Ïßrìm®úeÊê[°ËÙ?™f­JwP"Z}åI}_©aãý`áváïB©åê›s¼ÚÌXòj9-‹>œ„ÒGVÅêžÅhÏñÁ’ù:@*ÅÀø3¿¹CX×dæ¡»iÄó´²³`Š5‚¸ëEQͱ+j’Çñ§?Û;mÝñŠHÉ•ëÏc½I–ˆ‘"<Ó( “óÜÙûƒ+£G~*Üø äó\¾½e«:3–2ZÜìc‰ÙN´Ó’¹).ˆµ®–!Ëq>Ø>6…´pÛ ¡Å£¥z,9,gêâ¾h·ûO<ô^ëÔmüƒq…k8·z‹5#ªÕênBa@çb±O“…O©aÇÂo.”ÃÓðïž*p¢Î§^¦5ÊFºùÆûˆ¹Q‰RÎnHЄû´ËzpèÇRy(»´øû‡û ™é°.ƃÞQ ªª!'¹„ÂÑG3¬!êS³À5¯ÁGOQ pW^†4œgüU̦OUuª¢è›°¤ «0FI ¤OcnpH]b0š!_ G‡«¯Éç{™KÝÙ¡Óyý“¬’9¬¨\O: ÍS±ö ¦é¸Lð¬rÇ –iªIï³eŸ±Åý(çL¡ V- öþ”ÄeFàMÃÐÀ~ðkàh¤ÌãÁþï¬ô^>)“ö1]Ó}"n;*Eî"7(î?¥•εFí/†kk6Êî“96Hí’¹\|KGÌ«?§³ 'N&RÊcµæR&Ê\AijeMk³*H,¾È·ž¥ð?ɹv?Ò$G¢Ùå*ÙÀ}ê+ =~ä<6OŽ‚Õà‡nä7~2è_Lß © Í%¿wæ¸(?ƒœË24¿ø<:T€ËÏŽKªà´ ðeq Íœc6KŽ#’í+<æ£Cúš˜ t–ýn+ÂéÇÅ—)DA;ý+) iG}m<¹/œ!—)ߢ8J=s¿Jáà‰Òjd=ðœ¨M¢ÆÖ—;T  ûÇ9 bÚX¿£Y|©ê#ñHÓú‹¢úSâGÌwý›Œßèïú#/Vñj>IÉûÅžuÛ‡vÆœmÞÀ4ª® ¸ sk]’q“öåÐí°Õ~Ívâø¦ ²ðãAX¦7›¨ÜŽ]\Å!ó>U·ék“ÆVšqÏ$lñÏŠ¾Ð²Â­ƒ)ƒ¾ËŽ1Gõ«Û£‚—òÉÓd ®xáëÂXüî6­” A?³‡Gä¾seÄ%ƒ¾Ž#È3”ôäÍ{> o¿.›¡b÷«ŽgÐÐg?à@v4xt¤v|È‘ªŽûÊ7¾‚žÙ ‹'3˜z!·Õ´1±^ö±;å²bÅ•erô¸-!îurެnÊ/ó$ ?ªïŽcÃ߸ý.)3¹m­"…{²ºÂÿdåA\Ql× Ñ):u—ú»rÏa›î6/ÜO”¹Æe•¿x’)=Xà”4=׬{“€òQº]€1Ôá"2LP­^b~s;Þ¿õÈéîgÖâé'TŸŸtiµÅˆâ"ø²ÏØ}T´Sì Z`d´¸VAÙÅqD<ÙSæ©ôþ—’cÂgª}'ö\x½Yj °y—Uz×É¥?˜CŒ“kÒ~Ýös{>Õ3/³¸¢Cù.Q·³3qº!Ye‡Ù?°¾=ýÁ°n´“$Ü*žŸô¦½ÙýîÅÍÇ·Åj‡ØÍö?#!ßbƒ\Ÿ’׬ÊÎC}Õå@-`ôýƒ7§·ÏâýŒØÑÂØBð`ˆ.ò3tïݺ±räÓá6PÐãPÖ-ó#.-bw‚š"¸ká,ñ»jÐa;³ÅúmpeI î¹ÐQÑxíån_¦Üþ²3÷”]=m}ëÐúÀäž/ñVIA£ÐÁ9&Ö &^HˆsìF Û”¸˜` "¼¢”Q#{ƒ…9À ~_û³ôû÷•ùþE^ÿ¥øÏ9- %à>H©>^HJP/Ζ„ª•ò¹®€0¿guÜêA†ÓBMoÞoNùóãÎ1U*D“ëæ<‹´í.®E™Ž9qäD ±4„~ûüy*ýà~×a-_!±+²@˜Íü؃JâAp˜ÈõáUyKeUÙ°áe3 …<é; ‰ó:É<¼·ý˜»<ŠÉ€ô)rq¾eÖžgíî,?3jÅSÒ¿ì'¶öxÞŸ·¿”“Øžßø;ðénmæB(ãÔŒ>| t;0'r>9q]X?úßnE ½-¹knU-¢ëòÈáÕÉ~à÷Ùoþ.¢òk§µŸ;7K„>òû‹_ÃÍ«åò$;–çИõ»?5„‡êƒ¼[i,ä`âTrœ}†qo @FJ“W{ÌÐE²'Ö> |¶öôå¹C—²Þb ¤A^U·ŽÌ—t]i‚?›Ý«´xþ.é´}š=86×_¸]âL~´çp_·ëç {_0fq8®Zl-ð\ßø„qõÒŽì_xOìWš´Ë„›Çôþ·:Í@¿¼Îrý«¹H%O™6ÁÓ[ë;áÿej{ÞÑð1ÁˆÖ¶ŽfýÊ~†‰;ÓÇ)^‹9Ä2%w¬Æ!¿Þjfúf¿ÁÐnß)hõI>ºúé¥Ä1¾¡Ì_„ûºÒ±—¡÷IecÍcÝtl]ykOR×9~_Õý¾Éõ£a­%¨ÿÌÌGí­@£•¤v£»KTl¯ù1k¸1Ç?‡p |«å™œäè ?«5ÌÍœ{~~?äÓAË +õüsó빆Uìj·}A¡0м\·Ùx`iÁ @üîI82Xª”ˆ9× ÑzŸN.ÝÃýp¿3| 'æ@)žÍœ ¯Á_¿^ /”¡ê|jR™"¡?Óò¿÷ n|]l¸Óüj½Á>ÅÆZ 8É^ŽQþ´®Y+åð*cü:PXë8çîgA‡­÷§&‚~bËCS,ÍßsZ’¼Â{\ÌÑÅWçY¬ê\Á: –›qÓbZMWú“–#q67X‰ÎW¨ÚO›ÜTú}¼#Ã]2kûñÚÐ6òG ÆhßeŸ-£§?GƒšýÛ»Õ™=¿~ÊÒý) 3ðýð#Ÿît»¹åH!C' åé¨äÿµüAWán†4 oÎ ± ¹òPšà}uô0w.>^}Ÿý=¹=›@ór\S,úӻ˹™˜'ô‰@®µF’.Â)p*‚˜g2A¸HCŽuþ)Ä  ÆJ—{§ëÁ›ù7U;>«ÛÈAlˆkm{|Ûoˆ /l±~|ã?6¨-´>*Ô/Ã)Áë3l0Ù¾)×xáñMo¤àÂú¨³ÂÖSî´44û†íx›âíW¢p©—ŽxAèOœ|ÿ≷$Ië§/$+3÷ÞàÒ Êá$‡ó>@v9qÄH 7ÕíºÿHxnÂBç°ì3èÁyt|¡OB¢c%§Í)oФç¶Ú³úxݺ )²5GzdRÐTýƲ€Nçœ~Ä"‡´;Î==x³Oä»+ÐÞ¿RÖ)’¼Ñ˯Ev¤ÒÞ[¨Mœ=Ùó·cg˜ôÏ4…á(ÐM)Pçlž/}4Ч<&DŽlÄžEN©7÷9à®T”sÿ}¦¹éôà ’uNB¶ö#KÖy𨹤ÜmýŠï›Ê«[ôq²[=«~Já3=£žGOáj\ÊÕ1"é{òÔeÄ~(¼‚ñœHÞ¾ °ÒNãCÑ©]j|$à¿~\íÌ…K÷ˆ™tû¯DÓôºÁ…óÞž&WЫæ`7lð%\ꈀ\ A†º™38®™& é7Ž~ì–£.Û'¿ø^$&ÒHS•|ÜŸ÷ü›­ªÿ˜]L?÷ Pêyͽيýi6Öe!€ÀÓQoJ~¡Ï¾¬Õ9·° A¢Zšï!5Ÿ‹ghDÁ åË哹¤*(õ?‚’†ÕäÀÏKþÛßß¿ngÉàÉù’´{³B*1³–ضyEÅÙÖ9­=‘iòÜħ£ýé:SL!¤2ó -:vaÆaÛœ2dþ²+…Ð`¶Êu~°Xrwêœ: ±!ÔGS\ãÞÚñŸ#g¤šË@NYN`Cå×ñy—ÕSt3zwoÎõ¯šG±ý]·.[§´$ ÃæY2܃Ç2òL½Î_ZðÚQàSˆ¤¯>Ÿ ?‹"…7ž¼‡QÎ+«tÿ0Íð6~©[šwßš3Éy“T["sB1Ò}tûØ%ìRkU`q°—½Á×$¢B ·&vzÎoØs# ˆùîOfÖ>ètªpÕ5W21ÏëÂä{†„&²7ÕZÏ ]Ò ÷ÝõÍÍ’^?i]è"³Žeç·Ð›³ª&F®¬¢z‡-ÂHì^â‡"`ÃOúšry)cüx3HžÕŸÂšŽމÕ7ÜSy?²”üj}ÊìEƒ!â?¢PþkçÕÞô¸Ë¨‡ÇŸ/á´¼¯è99=¥f„wÔsÙýæ…¦oGK%—n^ƒ×EþëæQ^kÅßÐ{Ëp\L,ÑŠM&= Œƒ5tú®rjŽI¼t RØÐ.¾´[ŠpX£ÈŸpu¾Ò Ð¶}¹áiÏ‹#ºu®íÄ[’ 6“K<§YªÁ¢ŠÃB‘lB» Ó•½ëÎ3IÓªƒ! %ã,ï?JX¹]Šüö¾™æ4BaþÏé©„ BM:rvÙË}§@7u«Ãa9mû*>è䘿P~gV¹@ 1 –7xÜÝZ¹ßèÿ²ž Ý*„}û1ÔÈ[„—2e­1røè® ìG5ãøÜãŤy¦7Dùàïævcê¾bhyój Ìq:~êð¯=©ó"uþµíXäCAf‹sÁFØå§äÿ˜DÕÔ¯Ûoô&P@«én &_˜ð4.÷<ªËšŠrÔûúƘ2º}ßo.ïHW>nÑ8º~ñc÷ËÉZgOgçä˜Zk>FÚoНldræß, ¶œçî¯ÑE ½àEèOýÑx„”̲¿z‘Ù±a Kôˆ"wf¸9Û/–¥ÜÙ«4ÆPüµÀÆú÷»Í“Æñ-\ñ×ð>Ñ⹃õµÄg¼†‰T"]µ÷ÇëïO§ð³bá@| ½“cªN Öû²8Wò`Ûv€ª‹ù7s{çX<ÑÌì@+†86ÌéèA¯%:^à‘âï·—žýйê1|Í0Pö :×"âÆ÷:¥7&ú‹Þ£‘òŽŽªŠ¥n}é:5q§’PT÷ݰŒ’åg3j´ÔÿËðmz,Eåÿ!?P£¶Œô§˜úŒì¤õÜÆmuÎD…èR;yû|Õæ´T8šØ¤àæ0cŒ·p? rZåâ\s#§? Ȇï']×î‹ynþyCKØëÃY´4Pa[%³RÓ‚LóÆÁƒ:Ã!²ÞE&eKM‹ÚجiH—; vŸãLô4âН¸ê²Ê‰Â܈óOYß3FŒ0±¥SìŒm{`§çP½a`Q£0Éb<9‰8NzÛ“µ“žêm÷˜Ø•žÊEØþeþp$§”ÙÛÄÞ÷5!"„@ß'uìõš¾2~¤[üÚø¾E¿«';Ó©•Ìz(c<A—dçÞO£{«œU^çÇOr\¹I÷#¨C!Ç}±î‚ã!þŒqXvý=ÓXìÒþýßÖ›yª S`:ïÐTÁÁê|»Ýp%$=ÒSºG…–¿ÃÅÞ‹kç v'Þ o¯ B8 êŽÊ7ô-¦©À{‡PËùw[%-PïÈÕŸ åÿrAèrôø5Ú~Ÿ€¯ˆY„˜‚—3!ù áßd^[…è;ƒÔT×›½€jº{÷ոƻüîW-SˆŽP¸ô`°‹òÝšþËýŽ|´U(ØœÖÊ—¥w ÚçÞÆÁ»z@Á ¦¥ô®à"ÍÖ„ÎD6öcÒÛ$L(WâçªÓ¸P z…×SDWõ¥˜fȶì 1ƲÙ+r0r—<Ý3ØZ€qê³GHeƒ9 +}ŽzìmtíTìOîoïqMĆñ;p!˜¬äw~~FÇê¥úxy!£ð±=,É_t A×üâcͳ è9u×È»"(¬JçÊ mµ4fycö‚×hB ½d=Sεéþ–TC¹‰Ü©$<4‰Ø¯w•ãJŠ €’Ôçòì2îëRÐÆ‡7Œ€ ¾=IÁêÖ6AÀâ„}¹ÄÌí\9¡éØ\#fqlÜ¿£pÇ6¾ñ3Bñ¯PÜ™~hÚWSø3K…ÔøuaTÃf¬À~H†^ó’¦gwoû†ú«¸ád ¨à_«Ö˜”>V‡i v^±g t''þéëºz nŠÑ¥1—ôÈíÓ Á1êMùÑzï„þßmyÒ’Ù:tæËçbÕ±í²b:îíå¥t´*È'\ä: ìIrØNw$ ¤å³Å5¦˜™Ë…"Œ&qnÛ'ãE7™bø¥â§ bİ!”¸ûtØÄ ì‰V«½ÂN&²íâ¼ Îǧrî TŒJÃä ž"hO]ÀëÔWÂo E#aÑêkoj,úëh° Æè 8 œcd­¸ùaŸRÌlf¨q–›E‘çp%±³jÛÇIùf–ÊBæìÉåá#‡0o·lˆ…CY|½Ù²« ÷KÜd|Ê=6N¢—-é¾O7ÃG·…£ØŸ°„¶ÅL<Š}¡g× sd¦Š:T2Aeà£ðúz,ñüa³mADfW:©­€f’~ç©ÚÓ/[çÂGÝ Äãè³%ÛD¿¤æ4Ø|zžÊÕ<ƒtk$€ì}ˆI‰û¨#Æc'&]8ÑB«–¥¹—ahuX´ƒ“£,…ŸÚj«õUvN!Ÿrf‹¤롽0¡Óä0L†ý¡;b/úšzSTèj¾@µ\Ǥºw1!døÑìàDt ’? »—‘BIÌ2XºrâWHøÉÕ™¼Zl0Ò{6q*(R$¡È ¢|9è­ß.ø›=ÞÀý#¯Gpzé|»ð¤HuÝ–O ‹Ôìå±<â' #ÐÙ!Ïm$Ÿs&kÍè*òJµ?ZØÇûl–ŽtÑÑí’ìúº$fytïN †(»O;TVëÀMq¢§|µ OŠ*rcº¯ä¶*Œû~|ÞNySZLD™@5øË‘ánRìšTƒ)ú ndõlBü&湃Ëǵ=ïè59àùÊK¨EPÄZ6í[t˹} ¯A-žhŽƒ>f»¢†iД¨®w § :â%aŠ‚¦Àò°ù…ÝÚ4¼(–ž‰Ä÷¦Sj4Í€7›ÿ9mañâIÈyÄŸ©02¤›Táà–Vé.ÁUýÚ|rú¯?¦š&¤Î: íÿgmuSzCà»´9ŸìÜ–ª}îÇžWá9ãDÁïDƒØÔ{ç£Òþœ9:'~î5Tý&+ ö”²xê¿F+Ç14啜Rï ¶/°ûWÈhÔ}ÙdϪüž5ÿÃ&Rœù¿ÚrjÒü2þ9G ©<§ ¹j†éýï'¢ú¹|¿&?žwìæ'³ˆô×¼>qõ\’p<ófYþ?žæ¯\b?ANóJ#äfÁ£BÓ¤e¨Oƒ¦Êvj`fF ^•-ÜmPÅÁ8fâCä²`={-‚˜kÊ  óí5Èÿ©ª›R‹©ÁÝ Î6Õy’¿q•™r²?ÄÆÈà‘š‹ýz‚ð`”ËúSé¢2LB¿¥}GqEÆÃ—fkn£úæf ÁaÔºÿÍwqËŽ+áÖúd*žÃYll|~Ñ#$ìú”sä'„;Ú‘¶ùVÞêÖ] ‡!@àȳq Û´ yÕ*ÊÎíùoÿ‘¯ÃI7Ï]©9sÆY­îÑ:{ý¨ÌóÉ=}qj”K&à›bz œ Ãøªxx€”Läç…Ê;ê<QR1‡N[¦Á ÈHWúUdbþ&ZaPÝ}X2tœ{ùh½,ú¡*-]þÝÊ£P‚P‰À7CÒáÝ[\àÈÇ}, "j³-t'WöŸÉÑÝ”Lg3Ž”,?¹©8g&¼Y —”“OF÷׫êø¹µ‹>ΜcÄ~7n¢U&r—…³Tþ$Ý9d}È5蛟"e,›ë’BúÕã,Ë?%I,XùÁwƒ¢7È‘Œ€×äÖ¤¬añòŸÉ0«í ØÜù¾pš‡r°Þ®"ÛZ«y5ú °T9¾^[AF7@-±Áö4‰ˆ,cˆÄ_lŒ~š|Ò÷ÿàãÆ—2z&cf׿f­ 7¦úŠ;øt“Ìf#Ê«n- UêsŽÃ…˜”°Z·¢å÷¾èE„¬æÝ£gå2q#¿¤W*×\YK~dÉßR±a"¾i ,iœ•’AF~U¿!L9¿¦v[m曂iLÒbÙqÒ–ÕE.®õ_QMW*‡lvlîÕrÜ;B€2ÃfÁÌüPÝ´VÔμ/»’0LÚZAÿÓrj×ed«UÀꊣ™ŸÑ »úŒîf4¡=Ò%š§eÒá‡ïÍ—¢ˆ¼IÛOÇ'¢h7z5ª .E«Èó ËÐ2kòÓЩÝAp’›l—%äØb©óÈV(²ß…C$£­•o2YhцæöV5ýÖ¬n(¶A’Ú‰vo\'Œ¡@Às‡ô¬gÞVžg P–Rùq Ð:´h´]‰ŒH¾cÖªÏÆ2ݶ©•I2êyÁ=õÛLàãµ.˜uÔµQ›™Y+ÂÁþ’yT£ö>ˆ¢øë 3)Y®$£?«p~ŒùlXvp#S…û!÷¿¤õûÏÜumÓ’†(+säUÃïœ9 ýýØ÷I:=žÞ3çheÊ'ÑvI5ªÊ¹†:y÷2 —9ÚKÕæ/wC΢÷‚Ed<º Û ™t…yK•á’Û»¹û§5~Ó´(r(–ª=DÚ³R™W«Äx±ÛV0“¸‹ Æ‹:zà Òß ê³ÿ––æSNhéˆÕsª.‡¼‘æŸÉ þW>´Î¾nø ˆ#c»_nå¹>¼“²*¶#û»n=̬¼‹DŸ.=UñÝwë÷ò§ßÒftý¬‹íÎFüe;}7*sLB ˆ‡¾Ï~]ƒP¤ìd- ó¿N~èc$YÌb¿»d¿,‡°Î£øöý¨ê‰ÈÛGsˆ¼ù’©Ìc­Æ¼ºÐš4ÿ´:}Æ}ÉFùPÁ±Ï€Ûà@¸ÂïËÄ®<úÔálIIFg°ºªSa?±Q'p~@þJ( ¦19­4_¬[ꘘ‘{q¡•RÛœ€Ê;9í¤ ‡³W-ÔJÞx _/¤—·C¾´÷_\MÚ%•©JƶXQ`“÷O6Ä£IŒZÆ1ò3µa¨fò`™öjV²®àäáaÛXŽ_¸IŸ#e§Û—ôÚ v@ºÉ•Z±¨ìè–ÄÞäŒi²ubIA8f´J^ /__ƒlº²±Ùë:'÷voV (‡¤<6³$úDcz»ànýÄK)5 þ3M|¾?ÛÝw_ü_¤IIð«ceœ ßÞ[’-Åkfù7Û Îö]nƒ—Ìw9HÇQ«…/BPSr‰ó󒆪š8A&CÅk·ç™tŸ®•f^žEñ<~º,+eÄbS‡bßÚ‚¾†ŸaÙˆY²) S—LdlÅ¢Èó¡z ³9#æÊ€}{‰?s2?x@ˆT ’±0Ü`â!ÃŒß \W»ä9ßphú­Fl›éÛš]oÝy&¨Ç›Ë'q:LSÔá²K¿»„a¥îš¥jzÂWôvj’nà¥Âþîu‘—€ë-ÈåˆÑ ‹’)Ç+‹„¦hÄÊfé·/ôCZÃB&E[Q‰¿‘ï¤û=Op¥µôÐ3MÛ4) ò¯ôÈ&²Ñòذ Ú.‘rM(©ý¦ÂJ9§»/ã"e³jwÍQ¢ê1$â2N÷Úú|É^Øú¬)çºg¢G{ˆß µò…ºxÖWyÛYÙ= -Íjû´27 b£º*šÏ`Î=ÎÙا vágPž€GÎO=ŸDW&ÀØ´!v²ÆiÉ»zl;r®÷KØO¼ÃuË´=Ï[Ñ&ìÒa1•NÚt—3¬)®“] Ή=‰ß‰yÊÎ¥¤ÈdzB5Úa]ù>d²»¾†ZLá)ªÎ^Þ]„Ì)Ÿ·ÿu_Ûs²aÉËf§„ÛD(™“Ð ÃÉÞyò`žh·Ä—êÈîk§—d>¾ëba—§‰¸®Ã«K1°Å}kSBÉ=LKÝ*) æ1trå‚ch-f‡ZÑ"ŠÜ|ÊšA:ðOp£º0|%ÊXm±Ú‹wÒg¥uV´¡Èhvš‰£KˆLídaè<ÂNîL›²â¦i)y~ÌÑ 91½ò“Zù š} Þ«³üÂnUÖ¯#¦!ž‰šµ R1Â~rœ–ÍÞKéGÊÍž0­NàdhH”ªÆv$Ë(ÓÄ‘§ž³éŽfÔ5ÒEb½Õ’¯›UFÚ*Í‚ñÖF c,Bì“@õ˜•Ö‹>ãœËê4|a,îš: vÏö76g£3Yƒ»cÚ·ç·ùÅÐ%Ì«´Å${[›ôñ]¾2ßé}ú³:د““ÜlÜŠÉÃ-ämýé…ðßYݳ…öD‘$eï‡Ô µgŽTF< ¸‹FlF>ýTÐçI泩è’5ëÈk‚r¿ù0ß³­`@ðŠð€eÆ›ßL2µ·xšU ë&–›»ÏåÁ™õ¥£4==ê•Ql‘aéHH:G=ïÆÙ_†2Æ–âx]£Æí X?;-6H¾u zÏž½v?/»@v”×R@3ôÛ°ß~|ùØÒ“ôD“ ~Èš` ˜‘2îÎ {QdpÍZÏSý»#ŠLüý¦Bbú'cÇ’C†SðüÕã×>û×ad|˜Éuå×ÑŠŸ>Þ4x»âp6Ì„Í$3ÄtASŒ u+t`B#"|ù±aÅ©)®±ð×éÐSxÉöAc“Òà ZÖqì÷†æäÞc³»¯ÀÝ?‘‚rºm«Ðë`ÄŽÆ>Ήê×¶ŒçŒÓ”HÍçÏ|6|h+€VÑÉ ¹›~±É…F7VÊ;×»Zb´Ï˜¼g•›%ÏÉcÙâS›[Ijª­³‹ü…M¸¬3¹WÁŠàQ&ÛŸu z߸b;½Ü‘euõ|e Y”+(³â·YF{(á?Dã‹›6~×%E…¯Úª±Ó ,fR虿B®ÔoI~JyŽîÑ€5§1ÎÉO^HÊH®Žä§q‘¿mt"mØ!ÌšèËèj»&VÌøz'\¾¼_$àújÔ R‹1êb€-+ZÝYtƒ~òAeÿ8q¹£›€ÏTiA(¯ CT|=Bj9ñ’À­b õøoS[¥U+ùD¥IåÁl]¶,MB&b–¦r¾À-YIÀÇó73·v«¿ã¡ÆV\&†½»Þ¦­×µU$Â&;±¶ ÑS“¬²c€ð+¬ð#á5e"ÕO"ôs¬9‹…R ™B ŸØ0$ᓪ-j-–&ïujCJ£>e³g'[lðncÓMQ˜%ÎúTÄlg¦ÑUaÏ&ÌÐp°l­>²-¶V‚µâZz*²àa´æ0§²ì[äÔg÷Æ ŒÞùš?ȼi¨²Çá£{r×Ý;ïôs°™6Iãs{Wš­Uœ±fñŒ-‚§-RšKéöó•[Ð*í–¸ë½û'²?ŸejEdo#fÂÚ8TœMàMOÕgHûd!0˜Áíû­L Ù<ÞÏ…¿Âøeß±“9á›ü¥¾^¡Ú ÍË|åë>š‚ÎÄa^‰~] nŒ¢ñZò,•à~ö ž² ^^ÖO7¸@45Š e†«{Ò´uÎVt­÷Ù2œ#šdùÑÞ÷ˆõ ð¡$sm*†ï#¢¤hÒõNy.}`ˆ;rÆúÙs󎛤KÚtNÅ™ÈtVôNGÌ—˜gB`miB¨Zš7t1Kê-ï˜<9–‘›ü´Œ€!>“Pê•×›mÌ¢£µÏêl,†Üj Åш۸eh“·^ÉÓ’'°X8w(ƒõÙ‰sÅ*X½‹"•¢¢ÌmQœÿ}büQ<8Ía$4°Á_ÏçëVpW—h˜NÈäˆG{0/VaäG1²o>†\ÿf}®ìò×—ÆsDFþîáʸqï¢SM¤/“К8®‡’`ÓCÚk{j Þx…ÜØLö8¡fêBÈÕi¶!Êúßaœ ÷¬Ñ,°­sŠÞ-ª÷]ò!ÄVÆA0¶ù“dž_¯My¡á»¢H‡Î5ÙŠ!€XZ@Õwcrç°ê§”=á`¿"’Eì]/'AùAÚ7tL›˜Ð<ëó0˜ÓŒ/¤Å |èÒä¡úâh±VìžV~­^Hš"¥¢=$»vpõ)K§7QSÁ“S~&PÌW¯ \‚4jšLàÒÞû§WÄâ[D‚æ±›'y @ß.®ÁB¸“–ø©û“æ‘ðtù*Ô£$ãø:|N„¤8å,;4ÿd”Jç\¢J壖ó¿YuA¹;8î²6dÀdf£²‘Ã7«™'-75³&9!Ÿ!\²·ßÊØÆU‰`ÝN5±¥I PÆçg>z€DJ°”][îÑäôOÕ.ª\†’Å##Ä¥œ¬lAX̚妬óÊê6i]¯èÿ 8¡eÿÁ™*C]Ò3ûíþ¬roÆPÖ3úîž‹ £³SüO—¹É§1¥8q ¨K*n-_âËj÷;Bdë4Ñ“POu@·¤r™À¦Ú´s#CRž¥Ò[Wå0,oÜÏÇ|«iQ!0,λi™eš&-)LJ¿b‘‡&¼â÷°˜ç/`–¸ÁQ/âG˜¢Î‚›î1†¦çö¶7|_îXÈÝ^[fý¼ö.«C ¿ô8nÆUCµÅäPjY}ÍjH•ïÎjh\·ÔïÞ‹­cÞ=44h0Y›Ø G ÙÚ@ü¹4s8#Éøsʆ 4.ñ$í†ÃŒ«ðL«ÆM™Þ$FÉ?s }Ape)L‡.Ì€FŒŸêÞ¢ªZFɉž¸÷f@¼WV–¥šØ˜¯’ÆDØ´ÿÑ™EíÀ Îáøªã2Æ@øôÈ Ìýµ bz©†‘áM5©:ñ4¯ò)ï“ýÞñ£7ùZ+¨LìžË6¤¯™vÑ/½œpkܹÉFÉeDý(çžôŒÍtþȼ` „ábžQƒzò hì?Ú@HÞ¶ü ¢àâ.=é  ””ÜöuÀ«£WßÊØˆÜ„ 6V¥L‰uS/Ÿü¢¥ˆ‰°qÉ€2±x‹€a0õî#¦×~"éÕ8þúé$ ìæ9{kvë­Ìú¨”öÕIpc‚Œ FC,I¦ÎcíùUã¾C7:«K¦*“Dáî†kñû+V½âÝ—Ë}âäÎ2¾šnÏVEM¼æ`4A›IY_äÓÏѪíãD·6ÿ4„Ä‹F ˆZyǘ‘ÿnæN¯Mjci7¥xxÙH—8é †ÖÌñ$fp®©^!îâƒß×ñ[î; f”§·]›¶›ÓÕMõ§a‚˜,( ¶\á÷\Jç£õ µ*…±Q0@œ¨P:¾ÂýBÛÈÑýÉ ø¶¾5uL] ]З?Cwæ…òep‰Ù^Ü è‹ñ4Z¬[-¿jGZgÙž®J„<³«…,©.A™“Šáª}RM”Öºèµ$E×Å`Bž¤­ ‰³:]„÷͆·õþ9üÍ˹ÊAƒb¿èpfˆ­Àn’O×ÓÌõõ\Ðö?[GÎ+íà;ÐiÑ(„³3fÕ$l®‹ñˆnKæ#.Xš¢sos‚ƒ`®lõ^Àô6ªè1ÁbHt°~ZTò¢å=5b-'œÄþøÆwZ6åyźʢIéfk|Ù¤MVƒ¢@@¢óëmét®/#kšyæ`å`GÅ[äc.¹OÝ]úvr³Š™PW©ECƒc@UdS>ž‘Û*ŽÅh äj™§BGŽ26ünÓû¿·>bÅèˆ×”›"âPªŠþç‹è—…¸îól«ŽOHwnöaG\ìt+~t xžRZþ¶×—OesL¹½Í[ý–N‰+@þ*§:€©¿¶qZ;¤o6Ÿ“ï ï—»øQxKòñŸ3!²O±QŽ ¢Ó4g—ÁjW"Û Û2"x—…?,²Âöƒ Õ±»…S¬ÖÝ„W³ŸýY¶bÚÞ3)#³‚ ö,åÕø-¥\®×æô_Oðíàp¶Út¢"}Ú¦ë 9ª³^’Œdn f}+.¶ • @7cÊAÄòxéá–½w" ÷VËü¼³½y@(Ç­hSïr“ªi˜*œÕìéêíuµû.`ì;F«¤klÉHÉF  Ây“”‘,†ïgŒØr(ºFÂÚvÚŠ2’"5sF‰ß걕øgÑ'žØ ª ±9”.št‰4{aB:DcÉt!ÝCÉr†*Wþ¾jÉ‚f™L4‚Dø 붨 ª¾†HÀvÖ˜ñmdyµŽ^Ssø»_­Ýß=9ÌÓû±t~Â%'ÏGäúëoíÉlVÛQæsL æLxá¨9ð¼'r¶7·žMQhÅŒ¼¡‡5bgAŠ÷Ñ4%ÕKK~Òµ(d’ îM¨¢‹Ø@ZFr?Ù¹9çÖü4–¢€æ—–˜À†ÊäÅÌ•Ë#nAØ·WçôZÐs¦ Nº%@ˆÝ™þütò}³íÜe/¼ï~5Ž/ ·=}ä¾­Ÿ›¼ˆ® ~ÛŒÏ-ì‰~¾¹¿ÆŒhRýÁ§\䃛² K8g8,J/е'&±¼‰Ý@‡ÿ²ÁÎEZ…‡kTÛõçjX``ö{úÛ„HÒ€ eL×e ˆÊ'L·^DÙ(ù’hfçû)›Ò¦x•iKaU2ü_¸nÒ©0é£'æ eÑ5ùv‚ hÌÞûÌCÆméŠÖÀî¹.gKp0g¦ÜÚU»«µ’j– y(lÈðT×X]Ь‡ø¸Ãƒ{6A秬ümãrfçÖëÈYŽãðŒkÕœ·YÐ}À0¹œ] >!˜¨°¢CY‚’†û `sE«¬p©=LÕ‘QƼ}5ø`¶J7«fV¯^U·9 8q¶VαfΗÁÔ]ÃL˜Ý¤ÜjôŠ™Ügæñ†§×®¯ÍîØ¦{QjÒ(+g™Êüá'©ûèèÖÔÎÜkZo)Yœ¤ÒÃaæ{Nè´9âw k0;_äHzê¹#t‚ 55‡³•ŒW½¯ $ ¾­fSžœc›3¹)Qh"Í· ü%‡OÑâ·|E¤0õ&ÞŸôF ,ï7rPÞ_ò&÷löïìmZH¦xëûã©ß•©ÉÀÕw1’l!NV'Y‹ åâI¯Sojì Ï!ìóð@õ¢‡N|¿: .,Ö¦ç¤M2Â}éÊœ 5«r¯ØÐ3zØ/8‡`mЂç£ÔÌNʹo*4m¼¡'J*Ër‡Í$ZZ¶ç³ÑÅòXIºÚ`‡o‰?º¿û+¸þæó^àä¢ßâÚCi½ÔZÊãÊ‹uÝEñh !ýñ–Õ&Ïáx÷f&Æ\ô¢WÐW?S¥ãÏmã{L¼»mÈôò«hÞÙK1í¾¢2=‚>Í%¥â.Bofôû]M²ÃNN¾o« y²"ñ‘Ò´MÁ$[…—c¤~Oe¸Ó›qéþÕÁóù?uÎÈ)äFfØÅIt\?.!†BÍBŽÞ"¦Ç7<™¾ÇÒª').MÚÏË·µªm]/>e'¬TK„7º¶¾ðÁI)鋊¡Ãúë!r†PÖ+Ž’ÙPUÅQFÕ!V¨Ž}’W¯C…ºß#ÔÖoaæbaä4éjö·{niZPª:zlle¶W)"M˜…\µtS҉à Vq¬°PM³xX$·)äz¼[aȪ-ô\z ¥ˆÖ!5 -îEG’¹¬!¼å5pEHü8`bˆggw&umADÃiãk°f¶ÉLÝ1]$÷V-üu fÓøË¿脚¯phÌp‹¿-W4·%Ú¤çÚæØ"Jó8ó ‡r|°"ð¡¶\8sEäÓ„mÄ;µúdwªGãV‘PÒóyÂäó~I™¾õ°ÍÈdK/1:õ)ÇZæò}“wá>+PêtLSËÂúФ=A.“dÎòßäáJCgGyyaQÍø—ù^"¿NãxÓ*y _ëÍÈ‹õ‰5pCwd›.œ¸J2Zy*ãJsŽ‘m{ì¾ÍÑ‘*“èØÿ1U ˜Pä± "]ÔÒkúœDWj6j¦{y}!üóš5Žÿ½ã¾O6ôÀy މ§[ú¾N[<½ß‡Hò |c«I9~?P= ±<ÂäÒü ‹Ê˜Œýmp¶nÐ;âÒðë± õÔ0×+&aháLÃ;ÙÇó™'¾)ßEüL‰Ôލ3Ád{o‘É¥á·^º&ü®£jç#$Âh­Dñ9Žoá9`ÂÙfšî¸D¹¢ª sž±©·eNT,ø£¦o»bN„›EÂÃ;ãªô™È®‘Œ×œ·Mòº¹.ÔÈ:ˆûO *ŠSOÊûš™zKu¾æÁ–ô7&§nŠ¥ã@ËÈìŠ^¥nõcO‘ОýΑ<»Þ¦Ýk¥Ä¤a|5M= »1yrr2©.[]:î}áMüLXݼƒ|¢nšŒ°ô^n Lr¨BR¤†¬|k$ÓÓŒm´¦Cþ'!Ó_#ŠTVTVœ›ã¡¸ìUð¬Ý0j› ÂauÌWühh:'…÷ŽJtäŽ:t<)ÐhÚ@{òÂ}¸<ÑlÁM·p‡EBê¶æRïI«PDJÒdY^ŽmC n7+÷$“îªÇŸ†Û"œ íÏߖ¬ EöqÛŽ6ÕÉ»çÃóO2ÉÐÚ¢Mêá ý¤€æ¨b•‹ÖhŽ­ø¸2¸½Ã:°Ef¬×§‡R³´í1›3D5•¿{ãFø™²Êû;Û¢p/Z‰Ã@mõ#Þ.h9#îÎÉ´½W‹þêïÝ÷Ș ²{(®Ù ì¬3•Û^¬@9¡'݈ÊÝìùLé‘*y ¦iJ¼ã…ðKýËã={gbKsJ@i^$ð6mm”Î÷ rZ/þ¤‡Y‹ ^œ*=`TDy×8#®¾±Ct,—ÛI¤]ìN û€lh´]?ÿwl•^M×DÞÍ›oNx÷V2'áEQF%Ëùg+ÀÄ$õLsõHvÙxK=1HíI¬¬ÐâËÌš.[ûn´Z/td0Ñ/ÿZ°ð’xÜ cú#‰oI‡Ì}2Ü稛…ï͆-ßÒßT´Ó5‹–³Gmb•6úJâòþè·/Y#ÇnÚãÄÁR=kž£­!Ðn·± ³¬ý“=7v¤vTÈÏÛÍ=¾LƒqÂ> Ò†WnãÌtI¦ O´}FLºá7×T,öy‡ q=nà¼NýšÎÉ+¿Ú+µ…ưã þ[9Ï++)¼ñø!vRë]18„Ëc5á»›™4@æßÙ³T:CW£lÒòg‰Éx›L/%"I^EèˆÅÂÚqK¨Â;ú’°ÐãÒꑳY½× Ï(bÖCQêÉ£”°*ÕÒ²¡Âá%‘’̤˜ó:S ½ß#XÖ %ó÷¥ÖDu¹§ºn>³‡ÜX˜ez-¤šO‹£k ÏŽZ6¤OuÙ“å’»ÞR1¤uHA(5Ì£ä»çO?އ–C èé^ž†ª[ª˜Åd$‚ކ{†’ñ¡ OÓ™ÊShoì^³‚êm…Ó?5¦©žTžpD@–Õm^Ä>|Ä PÜ%ï5>ÚŠ¸C#ûöÛXó§×‰úæ £ó°ò½Xßn¡qqCuÍ™çC‚ÆäµƒÝQd»Ä$¼u Š÷TM ÐàðRÄßw',xÝ9.õPOåìBìþRzW‡n‡jØž²†Züµ¤ŽîS ²9hIoÅ•ôÉSW¾Ù“±¦‰y{[¯~x½_Aò/r$ÄåÐ`ëÍ1~==Ùý §€Òën_NºÝÖ¦1ã}ë£Yux£éØ"ÈlªŠ!9J!h¿;1¤yÀ½™1´«pø\üä5Àr®ƒ°‘PPè¦Wq&ƒÔE%ÍÞ›jh´Lë‰OÁ+¶­¶ß•¿Ýå=À ExÜBòµ«œ¹[ÁÄ»‚ïsÝx:UÒ¢c…Þ\‰E[Š}wÇrL7ü.XÓf;ÓÔ—í/FÁ¾€Ð,“Ò%£ÄµGžˆ<ÿ1h®öäWø¶á5Õ]`{à]?“l%ÄÎö“ÉËO÷*™ûµ=Sï '[¬>ƒŒT›¢¦!a½’”'Ë^*¾»°çÂÿ`6P(_ŠLËâJÕGúƒ»°7äÝï7˜¸~)/%DšJ`²ŽÀÉ…3ú‰£—#“ªtÆ©Z¨~Ï´²Ç''Ÿ¬;öCWEØ¥å‹|)È'ÀyÍNt¾%¢hòH©AšÚ|ôJKK?©"MÏ.wíR!ÚÛU‘°nÙLGN1¡\Ž@¼yf3s‡í’çv+rÙqf‰=Nû; ÊX–ˆ;ÕXþâÏ´âÇÏçúܧmÚ~5XòOô•f„D3¿U„5/w¼+éÖZTÐÄÀR®\enžšëÍŠÛ<¿u»³õâ€ßÛœetôØz/ž½Î–˜\Ž¹ï¸¹#]áÇ:óÒ Â •Å\b ü¡.<aOb¹áXÉ|Â9ï v’؃Ú+Ãù鮶оã Ð{mU§«Ù®Ôµ:¥þ%ÚY\¦£ëz…R¯\Rð`•S™HÃ?[¨mÜÃr=5¯“ù|²÷-Ú“}ð7 ã·q©™QŸÉÓM¤Z\e-j¢\B8À€ˆ>¤‚­¨©·¢ÀŒÜ„”LJ.C€å&åáêz¶Bþ”å'ž²À+§I÷KèÚ­8º"ü±sìÝ~/Ø7Iº=ýŸÆñU=?¯Ü¡æû ó<åßÆà ƒû2<¾’ïPpUÁŠ2<>Pòãgvð‘KÌ™è²i²Œýd @1¹@d¥…ãïO2æIoŒÒ XàDˆðÑØ/(å!YEÌã ·;Š¿n¯ó_j?,O"¡YÖØØk­òÁ º\#Ýæ‹5/mˆ¯¤ym")b¡süÐÑìÓ΃ìíÉå®?Üí¢/ž:Kß^è^a^L:¢ZP·ß¹¬27¯?w½¨øÁC¾ÖŸ?Ja8ŸLtµIGK×ÞN씤³“ôβ«6UÒ1[|X?7a¡`èáwaåõ„sr£hk?|9†ÇÎ<ùÒ %+=8†©ÓUŒø†+¬H$ @UÅ®ê.kô°O”Dhø¼GYš¦zw\ÄOðš/×”¸†Û×­ 4o/߯ÁõªãÎÆ4 t8ÌPŠfú÷Å–o ˆKfva”_¼˜åÔZwñ­^n]ˉ=Æ5¢[¶ nS$  Ž3ôhÃ;Šƒ‰…ÊX™<2¼°UT¶Á ÓU–š[ŒlT°4¾Ä/N<ŸJŠX,Àp¤˜rÃ%2®â›I(?%vÉÎãÚMr &"£ŠRSóT|—Æ,'ºrÈâ–9¤db+iðZ3C󳯆&zpO´´¬w D„’9c­¾ôÒÔ÷«‚PB̦‡³˜wÒu‹håA€©5ݦ·ÇYLF /ßïü>|ÿ<­ŸÀÔª0ÆŠ! åy×÷¹Gaû­¸¡A'ËÉù§ÉIòC¹Ü‘µ­ßzë¼/?Ýw‚]ÍŒ¶5ÉŽù³‘&‰´3nÆ(§óôG1µQ’§`['÷ö×»5[„ƒü5ãÒîáJŸ!3­ÖNãa×úZ²Û»ýO|“; wüýš#köKß‚‡ÍôìÆ Sòò<û MæòhGl²”7ôå]')çEb£O;iÝL¡`Ƨ×Û»† zïDÛí¦åèí¢e£ ¦Ú5¡sŠ—º9ƒ µøþ¾š"?ãü‘Ú=v#ÈþsÌÆÑÚžà_ôãõ–í0êz@ð/2º@ÌǶ<¡TÿÝUö¶wr'³@ÏO( G›¾mÏIÖò˜¸e>–KÞ <糩ç¿1âÑŽp :v%z²ãV‘Šª™´}LY²ú!¼¼©Ã¦÷z¼ÚŠÈÞ.xý¤kh¼"È«ãîéØdäxŒ­Y¶Õ@þΧêd»ùlÒBõÇíÉ¿*Z…JKíX³'wéÖ#N*ŠÂâ)OU¬dŸá2!oðÍ¿ã˜U· MC§ yf_Wåô‡žº–;‹_?ÆÔ|WÍú4ØHg¯F‡L™ö4O‡ns@_CðwiÕÔÚž²µýËÌi¨|Jé•ë³Í¨ñooù½:Àõê²RKóã’½ëuÒz¦2_RKÐÕ½„?žì,y1Eí"nå’uC½‚ø„ŠÔ”Õ?BØ%¾5Å¥Sá¿®Ü0fÆÞ9wdu¬wU²á·5½Öl»S#i(iøbcZʉ™„duÖa³ÆK½I€zzg~–4?‚¯»$== ¯?ߢ®è^ì–cmá•Bƒ£/Ü+ºrÚÔ3&3¿¿ë¤6k}ŽÜeüþÃÍ£ÞšÓǨ¶q¶Ç¹yî&9Á_.K8~^ëóÙî‡Y÷w5Km¦PVAû›]vE>4]ŒŽ²vŸ¼mò¯¢Yà_Îå8h‰0)/¨„üûÅÛ#9¼`ÚbônMf»d2±~fFðî–‡™fS_Rì © ÀfÐ@ð,£¶NÇŸ¡Otâ+†„>|=€™‡5qþïü-ßy^–¹Y÷Ȧ¿ºø·ëÈ}Íú,Ê÷“`!]¹Ñª.¤=‚ G¥¢ ¡V=ïèLìy/¸öÖf¹OÆOÜM•¡F HY0;LWÓ—¤rázM¾»Q è ‹d9C€íå~­IÚl—€}|G’®<׉ûÜZ9Ê¿fQól†kà~Eªq¢ôvíZoaòØ€ëƒå#ËøÛð#eöœoËÚ½:°FÞJJÀÀAª‚±Ú’.’>ǽ!dÔ$Òie´SʰÊ„ô‘—3ô’5XZ·l>Ù(VC=¥üÒE>§fµ™ÐÕŠžUô]±«8]Ärì˜W.AÎá5¹xƒÅÂñ׆Xm$ÃŒÏ_ƒí^ë;K‚(JÙš¦¸3ÃAá>ûOé­ø(@ÓÃ%=YR¥ô„Zf–)ZBÕùò'H•BɼŒ”Ý@æ4iPÑ™ gmÌ[ `£‰:ÿ£××ÖÁØï1¯ÍÚË©SÊŒñóW1ƒ§ê¿\¨\wú`2 )(Gtó×£+|RÕ“‹;Y5äf@ºœ°áöÇ7ûñÒñkñ±Þ*PáÓ"Útùl¼Ëf¬jÆ9ÔÖ‘=PÍ›€ÔüÍþ±~;¿Ï¶Õg¥sbal‰·¤ÇùØ4ö/lþy¢{~ÓëûHu¥BÀ÷>œ”Òv®9Æ©[%”ôÚIùœƒö ÞüÅÔqû`ñ[Iâ üRý `rmϨ^FôyúZÊÒoÉ '"-V°c­î+…ÿÖfç1ƒÝ˜{ä˜ÖˆK‰ûïÞ$6‚ãKŽ‹eµ|—Vk°/k‰m—~Á(þ*c.OVGxm®h?=ó”¹k›¢û6kˆSO&jÿSÊCÊmç•|<£k÷YÈãS-Þå.JyTÁ÷#…¨m9M±&89ñsU$›”Œ@ùÞß–ó§½…“YØ‚×ö `\²˜es?B¡ÙHý½¢“#’Ĩ Ö+lXá4sôO{;õ‹dxÛ÷p2nES ÛŸ7Æþ‹öð[³é»S>Zgæ7þÀ®¸¹.Ò¢‡Y!¶ï_ýl†\®¹2½Ë%‰ª&jßm&Êð¬ÔyBp–¯h„#Ù¥^ð¡s§fJ\JsÞ¾e?TÇâJòôgIˆ¥¸lC`ýÞ½CŸæ0³'r ³@‡¢¼ºY}]‡Á/6÷ýÀmMÐkd#ÚâDŠ›¶Lû_#œÌt \¤%™#º§´ž–š¼]¦ãCd~¥æÐ¾ÊP“¨IdÙ×PÕ/Lͪ-]Ú¶Y‡Víßð J+H}óåu@£”Ï4Ô>m¡¶Äû»ùU)Ø'Ï)ïÆH[]Fÿ%2[Z©LÜpsº¦Ü’kIm$œ…3Ü$&`¦RCk>œqWÏœ ©’ðÃØô.cQ£L`JG┎Ð×´`× ¹£”™“úø[ãÆDGäzÍ]¾Ö+&ŸûÊØpµ*Œ3üÅ;¬ÞßX3×¼ýãOO6v×Pä{s½ØI«8B/«"M— ,”ôc¦A¾ò*b:®ºuV×*Ýv_·eÛ+£1Êþjqän²ÎRà5ÕÅéŽÿŒ§xf½‘yâZe袓|ÀæÕ(Hô—Òe_ŒÇ¥6û8ÅãR­¥€ÔÃÆ·œ¦Ô¤Å,Þ½ ½Xk Ó“ô%Qð¾S1MJèh·™êgü:fhŒ)–ó3ºû éE×ñVw—üŒ)|À‰½éLرºZöБÐýÓ·{j©kÃníà0GGªAìù”‚GAž‰)”{‹±÷W Õt,¡z[xò3}²’‹ 7Y*øD~JÏCÆ›2Ðgî+H[ ºà w²b/Í Aj 5ˆË¦TºlXÌ 6±^WP·¿M>G¼MW[GX—ˆá_3QSI ‘aN‡1ÝþÄØIº-S2®'+zO÷¨2ÀQî¬E°Ï?à:!Çí5&¿ó‹ÇÈ}åT"õréÇ[à îÇbùÇõî` {·¶²× cüu·¸Þ{ûƒÃ‘îʾ¶”õÄú©Lø™µ‹'t§H™$gLn½Ûk<±EßXb.Œà˜‡VvÑJ¾Tªª'=R1?ù–‰Æ´äy ˆ>ìŒË–?ÁbÞìµ äo×OÊ×á ìžù|/§vGPrÁó^’ðÚJšé74²‹§“¾ß^KOžU¨’!’w®ŸX#}ÎíG´ÿt=º•0jËUS9—¹¹#£h—_Œµ¥S.r3íõ«u74¾|›®ñ’¸Üp­«}”ê|¡hî˜9UÇÔó{ÜÏÃa×!Î ¹eâ2ïÃÕUä°ÅFEX2c^sǼOã/p½}äiÙ›6H±KŽ•sný'¶|ªº=ÕP9ž*‚ã:¦Œ%r< ¶Qµ1Ò½¦­ñ¾ZàSKéw‡-wo")rXЦ´3b?|jõmq’²µõÔ:ÜM8 Lµ,}R v¶aÅ9õÃ>@ÜlwÇs0ér4©Ü4H3Â9Nþ¸T1Ÿÿë1JúÃjO{Qø3x©xL9®®€›õiϾ-K=L6¢òšÜ~}ï_!)FªÍÏ>Ów‘ðÇA¥foáC‘༮㚔Èû-u¾†qi ”½íóõé2¯æs5%ö /=ŠvBzB†$¬rÌäâ"½Ð®ª ùŒc ß«â5øìîO•¢Ø >CGq¦²Ù“ôùcãéÑŽÌé4D÷™ù¶]ôÓúý¸œ3¦Éו –SÎS>T± e¾â žÿ²öÕ±¯ñÅ`R.?} ·«˜srüf¸²š×‘xOÑêDШ<¦†KÃ#ˆŒÉˆ §`a:œ®…AÓËtÎ%w>èÏDÅöXÿbë±5–J™Î9K˜ŽlUÅŒdlþàZß?»¹W—ïëÕŪ’xLÐ>Éd(‰2Vä·Û™IÚÇŒXþ›C]Ù6Æ~#:îÜ)-ÁB‚ëC8lˆ×,’V£Bš.Ï-µº*l¬«qý˜‰Âæ2ò.òê£ä“¦4zlº¤šˆŠÒG|æ= ‡¥JPä]šG‚È_%ó•%–û ªB|üFQ§Lø&ò¥™Î ü ^Z¹ê•xDm·;܉ƒ·ËðÍ ‹‰ñR± _ú²ž”“â,ðYÍ ‰^އ<¿Æo}#»‹ÅìÃlŸŸÙÞÎ9ZBp˜Ób{ôƅÁ¾­Ø‚VºÄàÏ=g'·²€Ï`Œ‡µ…)ÑW@aŒŽBhúÂíæÖ.û0s¥ÿÈB‹xò¬»cªp‰õÍà®Ñˆ¿¶ã&ÈÌ-Ý=v[ß!lÿö“?¶Ò䡜ofŸ0ˆ#È0Lª”^Ù: ûÌ«}ÚL« ÑB\pi,{2Ë—Z/ä¹ÑB÷÷ £cèVø(Rðg$~X^mè@'·ÔëÞQ;Å}6Ã,’òdJx‘]{Á-zð’†s¬…Z)ñ/nNXÖ±TZäŸ[r2ß2ÑŽ·6Λt`²DÓ͵sDÒðÇ™+hT¥À=¢õ¢ú´@•yOr¨ ×è!Õű5´r‰2Í#ñ³¡p y)-Q0Æ™?*C¯}á¶Žqñ‘"ÏRVäôó~®³¶‚ì&ò@탮Y2ZFY3>ynŸId© î”ô,B¬ÙÀКÏkÕÜQ$í*¥o™qqŒŸô¸2@šœ¯Ëf eÐ]%¤ÛRG—7æ}JÄ?|šf„GJ¹DÆÙ>¹ åVÈw“ÛÇi=s@m{EL‘g‘cúˆÛæHÌc¯>†ŠœŸÕ¦H~o°v“CuÈ´:¤Aîmèù¨,‰Ä¤qn_¨ÔÐú`}íXø\ç‰b€b…^д¢ñDŽ‘Ofûá6@#G×rfo龸5zÎeø¯ŽÙíߦۨ¾úfлÑ#þÍÖæ¥›.ñ=I È€š0r|&gOUÇUž3¬° "[0³Àùö0“Ðñà@¤l9° n­ÓNiê_–HÿmFôØCpÕOóå¤(ˆ "w]o¸›@«ìÂh¤Uhiêýù~ìÑ€Þ01rMÅ~À åažýr7"Òx]èâýa=²saÄ™q+5˜®qeú)Šj>VÐ<9dâ XY©FÕ[hŸ_¡Žœá&haÕÄë6ã Ë¢Iæâª1:ƒRÌ•áì$µ1âh.ˆRzš¼¼}ËíËC¦]! Îÿm3Z YQ¦íñW…ÍMç0)ì؉Aã,#XBÉÒù™ 0fc§¡Ÿ±¤ÀÞSxÙT¢ü—h8D€ÀèS*µºØ"(+3bÁÞö®‹W—áצ3ß+haå¥?BH@ñš¼L×ʇ!¼“œNi““ûñ66ñ¨er²y bœYý'~¾íÒ/%Ên5²|ôåºô˜ rŸ³3;i¾ZX&ó ‚~ašC²56i®ËB¥dÄI#”"´ÞÕG¯f4ûKxÌűˢÌö}l¹6{r†5þ=.=´>lÃÞ*,!×üì’ÛD‰ Ђn°X¨Øµjg9«`šP·zκS,£¥PT½´¬üÁiÓT]å7Ѥ¤(ÑM?+i[µEÑ Y+ê‰GëÏß8+E¹@Øö=x+>?¡šj g&’pí–þ4>Õsýœ´(|wýÒ9Ú‡US«Í£¿,‰q§6®)1o;†„‡¼äç<ØJ©¥éq6EfÜ„Â/îÇÁœy!&m ¶päRc.w8†\ÙÔ)~J îÑ ëe50W–¢á÷Úã5dT¢v“¼~\ÍnáNþ~TØtRß'·h[¬ÔÕ0 høÖE¹À÷ä­ï~´Þëã…dè·2+ŒÜ ù ¹x{b¬°_½'åËü£•Ó;n¹²4n£Ð:õ›óKâÕF„Þ›t¤jD–üRCriwÎ’‡¥ý&ˆUS¼*ÇB³²‡íÅ@òØ­~<¹”i,qpBÿ7Ó€¡Vc$ðÉS¾ZäÝ'GnKÙψ„yÎïˆE ¸.+0Ò=$­‚S„raS'‰$_8ª­Ö¥d}ªf¼óï(ÚÞƒ:gˆÖ9#wT›5 %„Ì‹ªOÞ[ͺœYSQɼ)ö'|Šß©ÑšáY”–öZöWâl Š?¾Ó›D'ÜǯùÚé'ÅùyЧè‘‹ðØw}ì(±á3SÚ|‡ °q«øði¯üöIQ†”‚ﮃõýj¶×lWo L²HSt¾… ÙdTªp¦STO†¿Æ¦†ëâ„f°ß?d[s,¸Ñ£‡SIwC¥œ‘nõÁóëÛìõ=I«@T &ÞËé$G™eUQÐágƒ)E¼îüììEŽË#Aº2"Tåmãžæ–0††›ª8öâD¹#zý®NÔï“V#\ #7-Q\hì›ô7üцПà D±!O}\WÜÇùË:¦»Bú”áZ20ç~ù¡P‰ TQSva°kC¡¹^Íêa¹®ÍwÇÓnö-^Ì`_¨5ÿ¦uá@*çd—ã;uè’#_NºÊ%q's@ÓL‘#󻪞ibBBÝ=.49¹éVÑL÷¢,ƒ0‰Y$ýF²?=ã£P1 CV9†Rª®›9vPË‚iµvÞ6œáW(Œ²oáå“Ñ&žžÃf£3ÓuWRSE(v³pæ\.sØÛÒ©Þ…òø¦‘4‚[ü&1„åŠyªØ¶3ij®ÇÔÏx§ã—¼nT3nÑìŠsP'„„Ë´œpÅ´P:l$þ@¦ÅzÌ|”mâòDm‹€åô ù^ÊÜoN~É«Q:æøæZÛ¼]|­ËZÏJ:èÁ„-ÿ—¦Ü+*ëÙ‹Ï=Qéøµ‡´íë\¾¼ÓÛ§ þ¸.ÖãO]ÓÏ6ôà°”Óí rRAS’—<OOn}=פó?]Gr8}Êm۫˨9£Ì=òÑÓga‚ã.•$×Fÿ>2bPk?›iàÆƒ ´Ã­ÅYôPüJÆèËÒªôz ½|ÿd­Ä7hµb4Nc‰±‡6<“&²+Kñ”5 Š¥Á+v ¿-ÄÉÑW’\G$rÏy%ª¾üÊKe2…jU¼ãû>ø„êƒLÞCC<Áu Î]|zèÏÔ^›ÀZšoiZm:ê~–H H˜Ëä*Eî1Åž7ǯÄjmÙm!ééÓÄ’Ç@Ãj5iÍŸøvCÒöpù5ð» {>o¬ ¿§(8Í-¡¹T믞[I™¬›ÒßĦ‰×EÛ5ä=”eLѾlãK{?žP ¹=y PRxA6¦ªë¡¢Àÿå–Ž¸l¿99†¸êDcåÎÍq†!]ñ›+1žJæèŠA¶ù6ÓC„Æ|™Ö'ª‹à (ÄN8½“ ˆÅ½­Ê)J*Lònü¡é%\Lëµ^w½@¾¹¸ß«‘µš.Ì$§tFöIˆ®„óªExÌ9å^ÎÇ_êWžÉN‚G”çe‹áŠWˆU¸¢µÎ¶XHÄ Ï+IšïÆÈæz¾©Gü•sV¥j°L6¯rî¨!sþ§yDLà{*¶XVrd±C"¯£ö,ë|ªvâ¦æX´4ø•èP@P“1lðDQõ¿N²ÐÅÛ¯ ðKÛìíß{nE=mٌ崹,΋ìÉÛ~¹§¤TáV[ÃJÚ1àÉ‹øïc0—éW¸ÀŽe9½¢5ZÏ¿c"“ÌçèÚš³è¤f†£Nt-Ö a;F’¤ræ´àî$´÷·]ÎíK@f<ÞËñ€v]Ù²w€gd¤ZzïGy³Bº\!ÀRÆy@ÈãÜ^ŸÙá. –›4BžE»Âpkݲ`q%S,±= ,ÛnÇ!˜D<_gàñEÞ¹̦~”RÐ¥*v«>Ç‘R’a¤çÈ%²*˜³æHïƒ|¬Wt¾Jö.ˆƒ%¢÷½Tñ½I X¨ÜeRäЮ›#Ѓ¶\¶·&­Lþ æ-u» j]‹>Žj?"ÝQD÷,¥žˆÈCœ¤„íU›ŽiD†G:ÖÿMîÞó›9Sgƒ™«7_ì°_}_tJ8ÿÑ„N‡Â®W <õ^^(›ê-ÔwÏe³ó~=õ:Z~¸P”jœÏØäl¸X«óp$uš‚´{ÿS\7{;˜V'VÏ 7ñËKexl?LSƒž9¾SrÙžÏmÛô»0Ô4ð&F3¬Ðå"å ;>¼ô™0ˆ`’âÌZÒê:ù˜ Þéƒ)EìøHJÕ%if Ð@ŒJËGç­F®n2èĘóÄ?'áìKŸX–úóàìî}¹4+½[Ÿ’iZ˜ˆa)Ài×Hrqû0ÐÓ°$·h¼„[ÇžÔÙ4¤éì©dõ„lò“kÿ°¾%·Ö/þ»ßY›`sæF’x‡ Πã~ÍDµâKË69 æ‰^Läy³ŒArû^ŠpwÂmº·(nWŠrðò³äs')ë!&ÉŒÉå›õÆT, ¨\) =@é á© P=¨N“ì3Ä'ÿà¶Šj]W'ÞÑ0Üø†qHf³?Vw+1A*Í~¹—+¤é{]fsp·»Ubr3íiI —­Ý^³;‚ MHo‘[ABûŒÙÛv«‚î˜ïqÝm–Š•ÛöbúäËÈì«…¼²ÜSŠÅ,„²'òA€è‰ÇYHÃ1=а>ã*:3glÐIg%d@òÃÒÃîÚ„0,™œ+•òŠ/Óým4¸‘VS”¶1®cÇéù– µ v…/¾>½®üù‘U_h6ÿ)4~Æøo“|_n—·”$íáR±,Ø]ImT”Ô‡<æqˆøÜaw@‡3ÖcšÖ-z¹¼é牜9T°›y­\{áæ¶‰=s¢®F¹C©lq^Æé d š dEmÃ’ÈOÈ¿:~ã¼R.chžR0ì”ÿËÛzj¡°l@@”¥Ì b¦zå㌬Çi—nS}­””%ÊLùÍ"Q³þ·?m¦Ü®Þ›Èûi½H,Úç­€-mßÙi!W´]`Õe6îeš«³Cy¨ìd4’ÄK¯»¦Pp/\ªm[ tÈ<ø$C¨ì\òæÅË š31A¬y#]ç+¸Q°'êýOxмîŠÌ0KÞ1ø£—BÇ®ßá³@6d}Ò,§é·•IÓ›<¾’|ÎÃù—‹ŸCÌD¶›wÇõdÀ¼þþм ¢hÝi”gËÖ¾Iû­$ðV_cù6Ji¾ýM9…õ Šå7bàc\M†õK<$UuXÆ’šW]C™KœðA¨’]«N¥âÐSÂ4ÛÓc¨Ë´‰V˜Ž”†Æ¹èXMöAúœ:%¹ƒåt›~ªâ MO’4²´“©ƒWQ¢Xð¬.K3,Á¾ømÑ´ ”…WǶ«gö“žÊ˜lðš¼þcFEË¢K‘@p3Þfj.Y±NOmyQ¾w 8¢^ò«ÐHèÖÕþ 7f0¡Æ'6|èÝ‘ &/‚‹¥P–.Ðè¸Ö¨–ÐýTÈ]õî{^ìí&cVHD¨ œè¬e—콄FÀ»`QÂcˆP¢w÷í‹õVêFòÒ<Ä2u¥@§q¡Ï¸xó$ß'Hhiþ#Cî—K¯ð§jú"ÁÖâ<¤úœðé—ð$÷¦kxÖKB¨ÛùŠEåL¶p3~I‚¿aO®s#ë»Ûð1Á°ÝQ “(ºÚ+÷ç|qaÝɳÑ(þ7£²‚/»…†*xhh’ð†¾%ªký‡V“ "á´Š<ˆ8œ“¯NH–Á¿¬`8d{V‹ô‡•ÕDüfLþ§è'XÅnNyÇcƒù³\4\p³Î ]’ú?^Ä,¶ØæÅÊ4^m¥ÉÙí%´Ø@Û- 'Äo”·d ßÈEݱ¾‰*8fü5‡Ûö—ÿ‡ßÑó x¯!y(Í`/f­}3l×,ìrˆ}DŒ>æ[öQuŒàQŽøŸ<L&‚ð› 9DHEúvîR1±Éß@Œ#|«-V*ä+W¬(†4¹› O‚Ÿ«ÑÑã—êg†o"Õ—ß+Vpq«G4äÏ@gØ–„bV¨¡®.ÔsÈ#…¸Æ ±Hí¶NÈN]R)áµ7sioè¼T{òH±¥›ù³qæ ˜’¬ýØãC\…ØhÙW1ÛÙà>OÛq ´t—Â_ÿ§'Ì(šhÎN•@Uáœ1“‰.K”¶žc¥ÞPGP¶‹œÃ›s“÷~pa!€|8Te¶ ódÖ·uªØ€ZèO×ÚÔ’Vìëk„äB@¯Ðò\놴‚I£•¼¢G¯Oc£=]$uïsH«S$Ñɧ µ:wõ;nÍx—ÐId¯Õ½á<^[wÙœwA#¢'FËô³çªD~¥Ý9•I}›yÒ±òXÝ醑¬‚Â9 ®4V§ÎÎ#³!Œ£è[ÌQÛ˜Zµ MBø„Ý uà2cÊaëž"ÇRZàå—[½ œ”ÆîøðãÎQg¨ªGÞÏd÷ìJNH8]³vªÑÒ&:AýsÀÈØ›?œòbj ‚°"„.V׫Äày'Ó¡ ¹KVôÈ…éòNˆéØ$èÁsë.›Ü6vSÙæê¹ÌØøÕ‡0Õd~Ò/54ò¾æÇ}Ëè!ßUª™Ã©F#£ÈÇ©ržÛØ9ö¥íC¢ëŠrF"ü‹W™ÿ,â}¹VàÆ€¸&0 ’{4Þ{žjxX‹£0äÜši«.ºZ Cî!”y§Žò&­$ñ{ÃñË#Ƭ÷ØÞ-õG—¯ÃWjwœvÚ}™vG!Tû9ºÜJc¹}åÝdòr}jX¯âA\FIC7_­yÒUZÊ\  Ñ딼Òd{ž­öVÖшTîÐÍ­ÌÛc$0é‹Vå)ˆ'‘–ÝLœm×/Ràn‚²‰²›ìMx×W¢ô„ L×YQþ©C5Fìh¯Üåß°þ‡v´c·%ÈÏo%¨R†·^Ý ßJ$ç„TØ7Ú*¬ŸµEK›K­$Ä0þÊl+ÙjRä‹‚n:ÇHµ£§ïIkäÁ1Äì-5+x±F§§f Á<3ï)EÉÑÚÐË2 ]Q‰e„]èÇvnåbÿÐ 5” ˜Æ”Ú˜œ†7¬óˆyò—+ˆ÷œ¹7"ü68˜)ŸLššÎàEVLy“§×.il“ÕwiŒ' "¾=fN$Ÿ×šöÜ¡‡o‘ÝÚFÆÒ×Fñ²6I‹²‘)Gr”ô f$†×@ŒÁxèLQ¾ÆùEíŒøô7Xqd;Ay,М‡btÕŽyIŸ`^ó0K¾ñ˜ëËr7ƒÎˆOü´áIÊX³ƽáß“aögNºïÍmàhî—~„1 e6èwãÜÿ!Hå îÐC¯>€gQSDÕDØ[_b|D’Q`Y’§4ÃÇ@B@qQΦȺ´þÌþ‰¦Ù|¬Žý4úƒŸ~Ç|Ì˾]´ôûÌZr÷édéÔÜ—öŽŸ‡¢‘hl,þ™-hïÝB¾ôtO¸™ Ô3Ÿ1ë娲Åb$­ÚûQsLQ;\ŽgúðŒi €¹Ý±iP8Œ‡v‰?) ŠÐt…€C!V7šñÓ ]Q”{ÐY›ºÛo.HjÎíaÈEþ|‘÷&ž¥Ö_ýð}Á­vi–MÎj¿xž¯’æßàRIÏtÎÅVäâÇÌÇASøËæðÒ¹ŸúT¬Ääcy‘%5¾"º:,ƒÎÇÝŠ,•i'Gy§ÿOÂk ÓAØýúÍuÕê<Ú7^e'ntuƒø…vµ†wÎÕ¼ëE¶›ïŠK›±šqR±Æ}B ]’8÷È.iÝ™RQš. KEî) ÑìÂ7äŒ#èÇŽ¾,Él¡ñæ)Ç­3;ö½ö>#×Öñ©;*lE`ÅÞÝ\žC´S¯¶/HÆ;|Bw˜ColBaBãÚçŸmò^BB× W$êÕLj;¥xlRU!Ç*aOÿÝgÒ×[”<Ýþ¼Ò ¦èÑ›°É­’zŽ2„gã=Gºò\Fç±YG ÄéŒÉ1‚YDø­½ÿ” ”øšT[“D4þõ»ê&ýÏzÉ¿î„2BÔØ¨· .ïÁ"6C†ßÐh –Æò#›­´òàøšš,3Ù™¢1 ™wýE@¹gj>ø°¹BµwG\þÅ÷úƒ4?I¹ï¤ñx »jس v;Ó…>‹¤}ò‹L‘ÝDh«u»ye,’Y×·sH.ÓÔr…;nëƒVÚ´(ÅèN,ˆô;aJùž2€‰€>€Ø±én°åXF¢>à` ¦æ eè¶±~y2f>SÏ6g Ô¦ |….R@ÄŽ7žF€)•„%êw#šÄKz¢H§…j0Af·¤vÜdèq¤;ó–CúˆçŸzƒ¸Èë¦Ëå«wÃJ<ÝõÎÙ£mI§÷¸ž6¦:Ï4±£ÙÚѲ†ú2¾EØXÝòˆ¥"Õ©|û"¯Øn‰G´rLËžÙ\Ñ^¼BINÃè’åJ„êð4J ¿¸J—Ï67µ2²ã/>%«ž¥¢ Îr¡”p¨æië¢y²™"?*Š„¶´àé¦RÂÒXS6ó@FPõ"oòt]ܾ³¤EWRÔWÞy{µéª3È“Œ æ>0VÉitÀD;8"ʹ´àðI‰Ë«®>˜c±{tçˆ1àXß ÙüVºŸŸQ·Á! eÈÓ%"»èäN˜y½Ò^câó ƒÅ¸ŒTd“RFÕÈô@¥×^²ÈêãÌt€U€ƒ_Î;ħ#;4 nJ,9rn>I$Q¦úNÁþŸ,÷ÝúÜ‚8WFªº1ÓB_c Ðf×^EÝôFñl´„Ëy$Å T ƒ:+“¬ sÌ _™p«'DÀu¶jPVn£sáÝV¢Îñÿò^P™ŒèÚU~p.©¿ hI‚w¤Ô´§âV ÁЄ"™#„‘†W{/"‹$J?=ÍÕ¾{r'@ÛŸéç%—ùH©ztU¤ áúÕërC™5ºßjÙÂ+Ȭ-󇨯ÑÀF–àêµí°ðïhÔ²€1¨CyÔeD_­æqñûŸwÒüõ õ²»ƒ7ÙXëeóçžÕO2·ÁêDÞ—ÝßšZT|EQ¡0ñh¢j5}x8ќڰX8œÞK‘ªUݘôOÒ‰ ¤»Ø“L°|"ö tà|bhƒâ¤u|,’Þ°\äsŒô ‡‘Ð#vZÝÚ‘X˜åenãÓ“DtÜãg±y!es Žuò»˜);|Þ6yÁ:!ƒ¶²¤De¨!7OöÁ^Ï–Sʵh?#7¦Ò'Ϲà©=âžBM³©‘»,´b§ÌcnŽcw¶6TÀäADféy¯Ó/’Ñ´åZ/¢ô@扜œSÙífã«Zä´Uìr²ÎošNw¹¨¥N™I„¨›äã]^pÔEnüòØ6Ó*ŽdÀqø¦-²¤À¹ÿɆÂÑûÔAwÐ úèl•jœîÉ!‚™7žû¸ë}*@Ô¹(ý‹Êté.…¶{H+“9±Ð4Zð.Rr%¾ãºœÀŠÓ¯õån*°òšwh?ã™ø8›7nu\ž˜þÓ¦ŠÄɳÈ" Yš "å÷&GvµØª_w9so-²-Z'p<ÕpQþ#Ñ“ãé=²vÎ8ÁQš•£&CNË_4XÛpÆþhŠjH•ÝÚòl†Ê´ò;c͹ic‰ÍñŠ%zÜ Ï¥`VäQ’ZŒES½——/=vDL;i(žíxk¡ÛЧ1ê[@ôcŠAÑ ÔÛåòÁö‹)æO¨Åt;ë­‹*Ñჸ©Z º)óso™¿!Wp"y¶(³sË6ägäìXÇ(µÜ÷ùÑ&8ä™§3p^.´Þ·${ÌÚ'ÚŒºßë%Ð¥!Í^-ƒ©äKu°ÄÀ$¿àó¤\蜹…mÉ;®)§é‹‚óH‚Ñ$­žÁËv+x7'ˆ ãù2>i´^#`Ò¯:É-èP;«Y18Š=‘‹|’ÑZ \›“×;‚ÀÅ&4í¸; À>òî‰ã'÷¿6 ÇÖ×*Ua!Ç2¦Õ (“¿d )™‹ôÕL Ueþg†²?•)Øù'þuÎô$±Â ÿÙ9É–µËû^í~í[û‘áuàÖv”Õ#ÍN~ÑI9®¨ìÂKôâFR÷]DËb8Åù }e„ö;†NiA®:¢<Z‚Ó&3P~•YFéy "k¥Ϫd÷‡a·fIü<—!'¢¨¥¶.q1uÒBú‡YâÑâQklk¯Ùö?#îÞ@lEîžÐàí„s… Iw ÖqSÄ¢r #Û2cò’WS6¦yP¢n%±0B¹|¹± בòM’Dà}-sØÒDB˜rƒÊªya®Í,Sÿ-²DŠý½L4 º\»úp’«Œ¡ÈÍûCi¼½³Wo& ³Äá:R{%@I@¤ò BE’/؉Íׇ!Âf%3©_¯èx\P¯Ër*Ï`‰Œy(zË3‹4v~×$²¦Ð -{ ù—ÍâÀPilÕ”8ŽÙc<™¢Ü:¼«–ð”ƒH¶ˉ ø‹%¥™Pª¡¼‡0fo%î3<¤ÃÆ=¨æê\±2æä{êÛr*,•“ªÔ¦çV“¯‹^”`¤ Dan¼ª“ãqA(ÁSÌ\ŽU{Oc"îLɹÓzFU”•èóïU~ëü6½.¢$…”ûåÃÂ:õ½7þdæ’")f ßmª”“ X6̨҂٘¢tB¡i‚EðД3˜–Qž[*ú4µßËög%Ó4Éô²6ë9#MƒJíU™™ÓDŽ:&ƒ§ ‹æ§l¸Ú;´,3ƒ"éÏsßÞ° ·äÌéb¸õ¹rö¹òâÙÓwÌޣײVh[¸›¨"—¹‘Oåò·dG@žÌàˆÖÖû'û:i´gP2£t÷ò—Çg2‹>¥óä¢ã•X‰ëeßå4!ö Gº`Ÿ‰7·XÉiúÞ/ å »­>ÉŽ¡f•r·ƒ4/|ä imF½[e’UWÔLø?Bj¾Ób¾p¹ŽR&O¿Á^ãòÖf@S·’®«_…/N¢/teÚ’ÞV&b ®S-ýB€¾ B–ÐÍŒŶqìœ ¦=Ö<_ÇÏ,‚Gïs™N`Êç=]‰£"Qõ^¡TqTîøâ¢ú¾i$ÕYXgåÆZžrT‡½ ·{•ôqIɃ¢™ÐI€*ÍåMÈ)1ÓD;쟑à“gã£Û³I=Lµ\Zkë=ÊvÖÍ7 û>Éå*ÐV•ö©§²»‘1ä]×7éÞÎ]&¸ØÕ@%¢ã·Æ¡ ½9Jï&m.“ Õ”“”‚OOĺ ;?ÁŸ(ã³F¶à‡Ú fœOÈDTYAy1CîÜÛÜøÁþ´2 ê”:„ ^{&¯vûW•©Ÿ_× ÔZA=.`wª‰î]¼%{R¥Ì›}“וS—ŽN®(ÊaæTÞÏDy¦ Í#‚5+±rø.aa×0’ Õ´ñ>ë̓N}¤{>_^ŠÏH$ÙHåì²'ÒÖÉÌ=¢}Ò­yŽ7˜Í Lø>gK%NiO£X ¤J T°·Q(?ÓÑOöo)!ºÑö vן©hN‹6.:"ãÈŠüH‰ü¤ Æ2]œùìŽð¦ÑŸnìhM.;“!hzy·D²!2éû¤»‰É1ݶ('Ï(Ð…UÜšÉ7Åóǵ‚숚mÌ‘ÉV‹›¼§Ébñ…WÌàÊ„ÐÑTp†¿×‰êC }5L‘á¬jLÓxA×OÛM7ëÐ$ÏBˆÔ-ª=,44ÖM@ãÈ‘Ë[¡©{mÅÀÕ€‘àY߲鲼¾* £Ùd¥¢MzÐ;°Ú¥˜Y34’ª–¢ñÙ§¶—qÏ7t~—Áˆû#[rpæ® Y©­"Îfœ,Ú£p²Ž{Ñ°Ž•á\ò–J|º‡+Á¶ØÏrб–¶©žk"‘¤=ºÈ ×ÈY+2ýB ô^Ç¢+‡­z!GÏñeg¥‰ÝÿsÑùÆovG=“(;ð±¡$ý¬³SDöèÞýÐÛÙÄÒÜ%‡õ^oEVhòª&óZŠÛ˜·µ :©KdŽõ÷È–mªëñëègàðY“ Á=Þì÷óW³/P¨fmçšë¦2ËJ;Üw,àYžGòãÿ–gH#æA0†¬Û¼’˜òÉÞ—Šëyø—^U¤³€×© üøÉšeB³™1{¨Úž™-˳ÇáÅRˆÓ«´5gšÑk$ùÃh>ú˜†CÛxP~µ>°EFƒ„²\“+lÞåtŠ…úK>u¸dŹ«ôÒ½Ú€EþXRkÆ{²‹§™TÙ™º×^e èAŽLníg#“Ö@çRE9j©ˆÃ‹|pgåSÞæ™ÇT¨ 5°O]pxÝ1E±8´S4Ìk*¡÷EÄ·+â,ɯm킜ü× ¬8r-¸v¶ 7^4ÏT{MA[^Ýòw8Z-|@6Á@ÌAA•zsOàß¿XèJ+X;’99 ¬¯âh¯ÈŒÚõaÆ© ³$ ;\‰ï’®c`YÑzä´ßIÑ¡ôÈá·CÂ|¿E.‰’¿¿ƒþ"òNŠÀ]Xg•B: þ99Wdié®ýP¿²ìh~¿ÉMi3{1jò>4Fé2b©x¡U/ÚÒ;Ðù͵Z‚Qƒ×s©À ŸÞ_mw‰Ë"¥ÞáoQÏ[³.²¾§—Ò«/U´æSòß1ÜuêRƒÅ›;Ý]žWz« ¿¸KAª›ó^yØ× s^²#è/ËeyQÕèÃU 7–s§7` áR@?þ¥öˆ¹ Ä…åç'TÇ ñ^C ¼wWPS»« Q+‰˜¯ ‘E2)‰M“ZToÕÑjt&,Iú¦µt…în/È#¡|²`É)©¡8é©xÎІÁDlôz©Çx|î¥Nl1.ƒ_Q½ÞvO(›ÕæHÿ0Ÿ1âû™ÏãmùµÆ5a§nÝ-™ZÌhS>g€FŽõ»"ÊjÒv•AB«v'd¢‰xze«G¾Ç¹Õk‰ãóãu¢OrIIÜ ˆŽé‚a'ÐÉ9.3^tJæ- iˆÐ6óFœÞ¤ ¢-–`qD{3;žÂÒa›é‡ŸÎ8·aÃÊ aõŒ¨7¿HëýYì¬.BR§]òe¿×%jÃXkk-Ë··œÑ "¬p˜€Á_ßå®™ƒ¥¦[‹N¹híÿ‡¶m°&EÅ Š;z¸`Û'ßoTÐÂð_?Ü1gÌ„ ¾ ¹/8ä^‹F_ê&/wq87œV.¼Ååá×VÆ…GkçÊ~»ùn.ÎeãcÈ~ÓÖñ8g¯¡ÏŠI†‡Öa@G}Ðþ7”Ó©é<)-!ö aÍ¿8Öô„­Km½šÏȳTJã!r¯Ë!9< {•>û:i¥6·íÌj'óuª¶ 'ðªs¦ê".\t@‘Ë ÎFàÉ82Ðg¿£“:œÃ@Y7~PÍÕß#¢e)Éýkµ>X{sÛ;¸‰5„eõú4É¿Ò_8[ì:h´šf²è«·A ùa3r~Ér*pDåõ@%¨wœ™ª‡z<šº)=}eBƒp°çÐmš£´_ ìNåÖÎÜpÊÄ›ME¤ 7°sÀ#k©H‡o»Ö¦ûúâVükô;±µ}YÇhzJ”ê.•{µ& Ýiø+[¿9’Ô'µÂäÃÆŠssâ@žFCýˆÅõ p9–Ë%“Ç;"ÞH«­ïŸmë¿9ï÷pÙ[m 2H=Â\aX}ßÕ–“‘'–HtŸ³÷ŠÚ¼Ö2=Û ¶IyÐt.íás'ÞÉÊ­öà¬ûZ"ÕÀlUØG&`+¨ê?Ûß1¿ ô‘¡­ÈDgת^M¿Ä/ê²Jl5ÎëÍœžZîQ˲ufÒd©,Sû@atm‰¡0Ý«‰3à. žÅf}W6ñ¨&’ß“S-(™ËA!ÆYKE4ÛJŠç=Q!‡÷ZÁˆR…õßDÔ^û § Gqr;¨ÛØqn‘>zž'­'¿ùÃráÅ^ÀÍ0Iwç΢;I¬hí’ÍÑùoû¬bã&#§$n)êª|†3o3ÕóÙÐaÓâ ó¥Å à*1|sé  ¼*~lA NìÎ<›^гFíGÛ"^ξ&þÃÀQ£ƒ'A#S€ZW ,ħ!„V칈x@ú ®Bê—C ¿ˆM¶²º&…£ôÎqEJó[¸òžìÄr6µl¹«d7Ìd æ”Í㌙îrO3fÀ“[»ßá ·kž"2j‹¤Üó¤¸OpÄ ÚÇ:]­ìiäç+?jª»†y]/åºiê&\îƒ %¾xm-¸Ôع½BÎkÆ©éò‰íï㟿ž{úøFưž¼c(>ƒäáAõN Ú\;ý VB¾™˜p€sðÊQꂸä˜dWr4¹ƒ8u-K¤“Z TãÓÐÝþÀ¥À,½—¡[)*ž„Ù X.Büßofeú/=¼º˜…htƒz™œ¨oš“bÿÝd/ö}U|Æ/æû©ùƒîzä–t,~$Ï¡AÖ6QvPäŽ?n/š[ê)ÅB¿´‚[ý¤ŸC¼@.ôö&H0C&H°(Á‰€1q¥`ŽsÄÆøÛzºþSrW,¢n08;í"°GhÙ¢2=z`Öž¿€Ó2%A‰%YdoSÓ´ÏÃY‡Q\f9ÎçT'Kr¸­v泪*Õ/³:FÇ$bØJiš¦is÷Cš1b˜VŸX_ñ_ÓDVÜ–\œ±†ãŸQÁ*”NÍr Ë´÷ÉŒ7Ë={ h.™AHêÑÖOs»æi0Ìg‘zdÄ7Ò#ݩŜb8ß+6k¢:»ñ¹ƒ]]r7Ÿæ¥eúj¬,¡þ·êË—/ªþ’s[¹Zk}3ã>«XùŠb’’Ž!` ´6Ãfn€_ØCߕүˆÈ¢®0~¡ Ñ„µ‹re…ùù ‡ñþf;×6R¯½=Ä£³~wËféœMrýãIgÖ ŠP­·Éÿê½,$ÌÙsîØu/ 0¯³¦dœEœJ*Ïj †KöîÁƒ,Ä–iDS†hgêÿoºiþ×®‰ -Š~²é3vR!]Í‘2Pp>’õ÷ý4{ÞæYy]—§Ùrܽüêªù¤{zI™3ÞêO˵ròt¢K.ãO#!ž¸$Apaƒ U6vߤD†i_µ¯—vóeÝ• ¶“#W0!àÖÒªôȬ¦ãWuÙH¥¥òr¶bKˆæ¼­œÙOADŠ/—UVSGŒ ËÓ‘÷¼èõJÜ$Š•™BÖa¼tcwÌdÇký§¶´,á ŸK+5œS´Ó¤l I1Œ DZo¼ÿXxñâsG>…Áû|Ìš@HàG Gè>Û×Þ0zrA§Ð#Ž®7ÉX/&Þpƒ-Hc½†SW‡ÆãÚ öˆe29¦ƒ½ê‹}û$ X~&©g«ØzÃe¸/sˆZ“0´ÕZF}ôØ’ÃÚ@þ÷ÁÑXL‰éê©«\á¾Õð߆È\ö6Qœt>ý,0„ Øç.äØˆ/'úB}œ¥I-A?&@&5Ñ?ÓBI‰ð\{ˆNݩ尟9šB'“D4:Ô=‡‘.…`áÔ¨~R ÑXê°y¦ePÕs‰ÛM¸5’ÁóBÑ¡šBtCL††Yû·RÈwAvk‰^qÔjÜ쇱Á¬wah;‚N{<Ûg±Y"¨|¢œß”Ik¿Œ§B¿% \¤'‚“[QN¬ƒ¹3üÄ;Õ,ôÛ]È-ë·Q‘áÓðÿWùšû¿‰}7ŒöÃ;lËîµF;Mê_.Æ5£.ÜÊFU¤žJïqjx@xy‡êÄzßámÒqÒ¹L}ǧÐR‡[%þ»o÷1Dþûøeÿ´œ´¸ËVÄDè.^‡q: ¼É³ÇÖF¼LYñ»?°ruÎY;ÆCÏÈIìĵYS2hâ3G毯"á¾ ZñE‹†:è¼#qœ|‡Çá2´:eɉµRåä« *G\Ì ïdëƒÔá¿)7«7JÊVIÃb¿Š›Ð?“hËUÿ=Ч[-íûq4–$|ÂΆªOˆo#>2Q鞸;}Â̺1ø˜¾=hjOÌNܼÉÙ®D¥Ìyrƒm‘ã Ê£=¤íÿwëž¼ó4ï8€ÛkmW5Jfßæ„ð°ùÞª£,óý;ôu?ï‚}:íìÂr¢Š¢Œ¸ïWÐÔl{ØÞG8ô„Ýå—Æ¦Ý¶Je·6óûS9¤ªqÔ:Dì—dq‘«ë¨àÑ¢ÔcœòŸ1„É…§ïìvÏ%ñÁÎ$ð”Ö–CæGà/?Ñc(í:|¤©ø½Ñ0˜9¥Ç ®ñO@‚LáÎzˆý¥†jœZ¦V3¸cpÓqNùh™Í½7óªCšñå­5Kf”þï4›äÑŠc­Þ¹rÁmÑûjBìBƒÏrÓ¥óêÿ.e\S¸+áüïIK+‚y|!Ix¯–|Üûå¸Á“?LÚóå!ú8Uv– © š„¬~ôŽº„<ílB¦d\ý/ëÔ©p \« !˜-|‡Ä7$"ô À¹F°’%Òw)î­JJçÆx@ñ '“)0µ¡Õ@جò»o²ùî0$Š9`Lϰ1Ù=Ug5B!$)o˜rÔbœ¢  ð 7‹Ú‘Ë’êã°ŽM²ýÛ žRõ«—‚tY³& h&ç5–Šx³è®GÖAT˜žËïûbBZ°B.ëˆRÏœl­üDAÝÌù0Àv¼T¡È›‹GAzH‡Z8j`Â.;¯±¦Úå14 »»N Åa‰1 U!ß¶ú9–9qçï*ôKh›—ÓýņoAOª’Û&R)Á„ºþ—xø„÷¿ÔÚÛ¨(|Ì!Ó˜¹vòŸ ƒåHÁvNnzCÆÎ¹^óˆ£ée3äÜÁ²~Målð‰Pà!0Ÿå“=Ž`÷×(W»tf•ØVªN߈٨¼·ûæ êöi!$¾£…®pBpt’9¯²d¿hõ(œ¾)Õ8Wšl^ÍÝ=6¦µöÙèv]£$˜ÀLŒÐäÕ³›¥†ã+FÑÕ ]ÜY= Xí%6Âõ™ ‘⎫äÒ¦ØeôUŽ2©¸|ÿ„¸×jó½s?ƨ}N½®mÄ_Ó"…í³àÒ†û ŸG°%Fñ1«mK±Àñ %‘ód Çä#±Zr»Oh“É=8þØýÞMؾßÒ¼o½iˆX® ¨#ºx“Zºñú ýYƒÃÆJã#³“³óŸå·K9–»üVÑ’ûvNüðÏCåëúû¡%D~¦Dðò&ßF“Ng1Nãí_²öÕbRõ”ÌÇrÌoÆÒ;?PüûY¼þ±ÈO–êH–úz¿¾û‡îølÇd6CCSÛÞQ¿—W/ÿRHÀòA7.ÒØÕ™«[|sâkCòª`€p4cµ4ÎÄÍËͽߧ›wŠÚ–Ië5É\Óа‘ëöØ‘2³{’L¿æõÖ›²(ù±;þ7ŠÙòVß÷¾)ÏkAp=ÂÄrgš@û‹ÑqCÎË ¢o7?D– ³À3«„›Çç|îrvÕOÕ+ʃ ŸäšŽ‹Tñ)Ÿ…%g+UHÇ’ȶ.(Ánë©eùYƒídcfv“kÎøpe–üµiÍ&ô¢=n@:$­‚Ãþ]9ŠnÕOÖräV€À̇¦V;Ã0§/Ûšá8|dÐH[rN™XV<"¼i?Ä‚‚hÀ H½iÙFÛ sW›¶ó±}“$–`!]¹U© 8”¥Ü.ÿƒD“$¥…fu\=NŠŠ¥–Š#å×oCzSî4Ÿ5¯Åùƒö]ú§–0a²öÉiKg…!z¢Õ*ça-Ñõ¡t´EÛ`BM{ùòзÅÈÍ-AÁ•ÃÍGœLäjù=ã·Xò5ÿ\jí°:j×}ü‘±תd3øú—¨3k™2ù2X‘ÏËaç”Q³”ųÒlÃÜÙB³§¡>®’?‹ƒ»ùê½Réï<Ëiå¯ôþù~#‰I £;lUÖ…åBÍSCªl:1x¬WþñŠ(¤>ZŒ¸a)ý·§ ÈÒ+a·H§—PúÃß=t7s›ƒæ¡íÿ½Ç´r°¯„QϨ…Ñ8¾ñø¨ç·ü‚iú¨ÎöͶKÇÃlå‰/ð[kÚmRió9 -ÚNP #ªi’°åvL û%s.CXÉ‘F¿Çth„ÈXJ=¬°QþÀz}¶¾tá—‘¢rZ^õí¦É@ú·#cÞM©o& ·½*Zã­]Ü8pM ;‡¸¯­¶àÏQ%ï®KI(kûx£Ÿ±ÙÚ²¯7´švÒ¼sÙÎwÓQÊbÓƒo€)!ó½¼]ýâõ¼a„É@k€õÏ#PEìӌγžc·,·}#˜IÐñ´\J© ŒX‘Nž˜ÎÜŽN¢ò{bðÚS7‘Ê©ÅMñe=m5ÃXÀ¸ÊÚT€TgØZÊãfPR&Ãà[FþS '–bUR.¦œG¨fsI.¥æ;ë¸ù{øò HüYHî© ïsu>Ñ>²£a›ã>‡NsבÀbs×Ï[ú·á_¢tòFûI$×!,U 5ËBUÙÉî\UšÍ1‚Co„‹«‰u½¬jª¤p¡ï”?[mI×41Θ‰Aý|hš££È}W!{΄‹ºEéé°?Dëå?-œÙÏYÑCB“üù‡]·ä£Fô6ÑHšoÒÇê&ÀÀY!Oö‘6‰`~aO«IÆH˜«X»‘n‰b¹ùqM'fÐ4MMîÐôPñ¼sf7åâžÑÖ°éöÇ`ŽœWªJšÁSÑ6ý?G{àç9åÌOêýׇÌ¢‹°˜~jøcbUi^]-m@t‘9Êý 4Šô·ïÏ쯦¿[*}(ßMˆðòØk“JtëóÅ÷y*þ—ùT2iiÙÏìdÂûmÛHöôN—gÍœ…C+Ps9­‡ýóÒ†ç¢f¬ÁýLÆàÚ''@Ÿo;ìàwÇXÙè¦3Åà¤E³2VóÈ 4B Ö {-ÛÝž”,Ûwi¬†tÑ.‘×c°h$u‡: ¾Q$}ùÊÜ©ó Ï/þÞŠ!–î,’¯¸Ô ¸°³Ou°ß:ŠFÜèîbÆÔ@Fcw1Ì Hœn)Jb$R>£ýÓ(`†;~ȶÜöTSCyP©ª`\‡íä[·Ç7ÙéÝYŒg˜Ù0Æ—›Ð³W ƒE÷¼HøF€î³‹(ì—´~U¡\à AÇN6|+öq ¸ºä2: ÀžÂC½wæÐmäýlæ…-@Ø2òߤéDàÈÍúSÔì¶?^l­ÐykuE,z@¸{âN(^ð S%G»Ûìåñ‹¢²w}hÌÜ•Ml r fœÙ¿œÃÕ6q€ôH ¢H>ö$v2]/Tgm˜/¶>Fí]ºLsn£×ìm™1ƒúîeT´ð±VO§Ž±&U=„8–*Ö¼Þ¢üà-óO–âBÂD+yèoµ#ròÓÌpf¿©r ƒ­YX%»Àƒ)Sàÿ’¢çÅŸ>Ô'ç.´G0e¸ä-+¤t(Ñ{ÙHš´l *GK›ó»¼œ0’wš xC—ñ{µ²/Ò-öX\½¶z]¶ ³%B‚|½if¬bR2žÈús \¬å·OvŠÏ­z€„= ˜—Ö¼†Æ×8å0&)½S>ˆßps3Ÿ}›ÈÆHßK &ò2OÇfsrÓŠ7˜Íñ–x ¯ uÝŒrŠJ­/ Œrèwv4e§çA67¥Û ø¤»»H+m RðÐÞ¿jäêêj|×c0¬QõVAÔ'÷„¶y‰e yBâR"Oç°nP®ª/èpNRßCk]_H­‚ÖÊÛ+Es*‚Í«ÿG«Âò8HâÍ–¦  :pÅë’WÆd €|9Ìô`,nÄÃuS|/ ìÅNɪ´Ù8ñÛÙ²Ïùàí¯¹öá Åf%÷k÷fì £¸U»BñbsS¹Ü/2¸j»Š¸u•’ÔB6Re R;:ˆ°a¬dM„¦5ãONa=vª—u‹úÃc€JÃäȇÜÓ9oªÛ€1òzwªM·¦åCZvíÑ{VAt;_b.EóëÞ:ÓºØÃŽæ´¯wØiª‡,Ë*ø)Út£ì:G…ù? D çKW!O9ÇvapÆ>™RAü}ÖõÐYªOøõµÙ&"ÔUY(Ògá/ztê-9f½º:„õE2X°º0$¯²Ìô`Ìq–H‡Åæ´Úž(W>ë}‚‹˜óeíO0Æ´=êÑ`*•‹ñ‚Šõ…â$Ó6Ô¬8LˆFfÚNZ‰¸³L¢'vp¾£ä§QKâ ƒ¬ÒŠéi9ƒ —î[lå¬*†_ UE‘ÞôS­‡s˜ä®(4Eä_—7µ9‰t6 Q3ßîå% @¶dBZlbßýrÒI~ÂX(cÚKU ŲÝÒ1ü½€ËšlÄ«$²èÚ‹„±'˜B.Ÿ¤8S$o1¤ÀI|ò‰(´½ã :£”@Ó•œ“{¢ß©ñ¢Û蛫M‹8-Ä9ÁjD¤b¸Çh“† `NZX$B}T¯#ÃÝae‡%‚ŒPÀl*FˆNP(Ÿ÷j²ÔX[Y²óØ ô,0OŠø8}š?–ªz›Ä0È÷¬âÛò¬¾*ëÚ6+g}{sZÄ`Ú½±àÖH$À+-:³Úšçƒö8ÿtb¬˜rK-R ÈÀs[VxkýÅrì´UØ_4¥HÑ£5€m‚g‹UŒï+®çbTK)Ù®R LγMÐÂ2RBû&;nf~­Zu,]hÄ繸ˆ.Ò•ó¢¬À5$‡‹¨âwîo×rêíÝïx¹pìº8²eD¤ò œº@˜ùc³Ž­v Ì-ì¡æqø¬sÛŠ `fº‰OK›1YQH(JA '…”ÕthÌ?ß&:Y>£³ T/Ü›*×:‰lž!1ÍâÔ}5Vzãà+º>¹d©|ÚõÏbtÏ–{N Ž¥O©¢5Ñ%Ę6Žèf¾»fR9œz·Yñ-$g|e®Þñ’ºÛ©Â,Š!–]@‹Ž²ÉnKBb¦†  V×Ú°Ï ÉQ¹”»†A²gF¿Jšt. +…wÃtz«¡­Ä;°ú¬ôöh<‡Aë°Æ(éŒ63-ÑÓ[=ç¦â<(G«é¢ŠU¥R@‡„>wtžÁ„ldïâe°DÁ9x>X.Ù%»ã!„MØ¥6Á„¢a¨›yç²V „ÜFÜmžÙoz)Ü­ÌV/øGüF¥à$¸¡È G#ÝzîðÄc™Æ ›‰S™¢ÛfŠý:Çß;¯©üÒæ*NbÆWe#¢Mò8{®§ôlæì»“0ód¬–?[ˆC$¼¶„gΡÂîÙcßñ× $º›½bfµÃÆQŽ©QcVH|ªqãç Ñ658Ѩ ƒË|ŒèÙø©£èEŸÍ2 èüë)€Ä¬³êS/×g‡üég³ùŽ `yšFØã(E˜£Èe•@üIç~±!ÀÅ&9c¦Ôƒ­“šLmù jj­~¹^ÁRë4ã¤y°¾Ø"¦ù¾K±°|uÓSŦÔÙñ29¦aïÓÏõ ƒ»œZž3‚Rí[2,Y0qH[jN»Ñ;éº#3Dwd­¸Ø4Ná‚îá$™(¡†g#×VÏK zžø«Z¼FÛðùcñqL°0öЩ®’B¥%aâ9ù¬ VùkÀ5ç†_ÈéX]æmß+Ær± ¬IY»MDHØ q‚”æÒ~á«ù2•C)¢Úš÷-³eKvJK’Ø=ÞÐT0ÕÚH_É&kò%h1íCç/§;ºšå«2nFL‹ÁI ÂÊø|Üõ²†€½|æá.kè ì°ÃîÆ)Ï4à5{^ž­*¥çGgó÷)Ó<'ÅT:Aþ.>˜„wÀtƒŠ‰ãÁ?gnì½ÑYpBgøp¨õ´1ëc.hHð˜ò ãGEçÍÙQOž¢³.UD‘Ž´ï³t¯uN–×X­Ë\ã<`ÑýǦ UØË,ìü›µï¢_0%¹:sxslÈÒ™æG9­Éˬnëø·L£(¦è+#…†a?A¡ý^ËVªý€À¶ ÃDÐz¬cd(¡Y2¥¹ é³k"…º`o™‘;üJúØ€gTo(çåßX^Tò[ÃÄÎ.ÑiP}†$™(ç'±ÜÀñE¨Œhmn×üt„iºß,bŠ™Èƒ:Årc¨48„·C±´AÞűs˜²a¸ûT½[®ÿªûP(ÆG6 1]r]’ÄøÁCœtÍ͘²Tæɤ&ï0fáså w¾žýŠ[ž§EÿIª”×'/*T;ò\ÍxžÜ|7ó¬›Ï€yCç>Y(ã:™ã´V÷>‚¹±¨îâŠé™²J5J‹·Ã®ºøË†ZZ¨²%#È‘œß;#ˆp¾%œh˜ž&¾ê¾J-¿ÌV<Ûaa+ÜÆE’Ÿ Á‡ÖÔ«÷CAK ò Œé È3x=ÕÞðÖ*³j‘£q â–¬Ž´‹ëIê-}´<@öqÙ‚™ùuk-ÙÿkÔ*\%ž(‰Ð‹ vU‰&mÃÙÑÓ ×e¢¹hùÆÖF•›$YQÕ†¨¬°n‹‰Î[³ÝUŒ(\ 1Ç#‰D6Z1¼’¼äG9Ô…’«x¸Î« 7yNjnµÕ„uÄŸT¹˜‹5F¤KÉ*x|˜ç™c æT’BÍO§×K^4Ïä[ÆÉB‚íp¥µÿ‘ÄëûùMOÂ;?K‡ÎAVø ¨`ßW¡(,¹{ÈÀœi·îuK`ØÑ6ù3n^~A«Óí Rd s¦½WÑœøv¦äþÕ²)>©+òÕ¾³`Õr v© ³>»f–«&„Ž>7Ð%Ë%Ù!]‡ö8Ýxõ[c”·(.`ëÓ±{0ü ä./K4#§ã€ÚƃfìäÑšÚg)ŸìDñ4¨(Ø[4) 75€!­…/‡i$ØŸšáŸxy„$ß †–“ÜŠ¯ëÍ vjåÁ+QP5¨`¯†5‹™QÁ¿$Ù1·½VI*Já„åÜÆ—Œgq̵¡¼åå¶o…ÎÄmP®„Èÿ1ÔR”¹¨´ffDG¾M}›Å)IÆñkæ0B×ÞQLäPJÀÒ¨=êc í[<Ž¡æÛX‹¨•Š'¸>^°EÛ$Ï”kd|³jõtÀþÃq(´¥•a–cÕÁ°ìt8)½, yÚæ³±Ú—ƒ0©ËC_6ê×"5ŸG“²w:¬œ*W%u¢ýe={i$. ŒwÉŒ¶‡«˜®jid7ÿ†–8_á ü3×=¨ Нp‹[=ž ¥&T!)›tóÒ=tŸ"Ù"­pȧ™ÖÿJ®3U#`šöüM{ÜAö$&\HÎJýI:˜²ïò¤*)(^åâLÑªÝ ËÍï[~I{€,à[è =´ U{ð¾ÛÏ=ó€²ßñNåÈ[ã€-µ.½4rKõÂo#¶A¿l9¦¥Mv { eÉ]Y;ÈÜðÔ\Ëå^,DÎó^|0á¢+¶VEØE4>G¸·$M‰BŽ…Ã¹’²É Â:úÎ~W{nQšXÄš¿qèao±Î˜³ä¼×õâ$=— wÓ/9 ùYÂ@X'¨ƒ`P=â¶ v6"¯ì[]Í«˜0un À–£l¢Äÿœµ‡‹zg•ܬԪɾ›<¶ŸP¿–-¾ªaê%dFäªÎ[eÃã+žÏ¢¤ŸÀƒ±<0öI–^9r~dÄfÃú0p”»S‹–®ãø„»Ú6;'F×íYBáûgÏÑŽìǃ(6‚úrKñ„Z("œùçû³ƒ&œ×/QOl0£fKYPèÈ;L6Zã1¼Â΢ÜP4ýì2Fr?êØ‰"öнKì=”`\áÇF¾¬uöCvä}½ý8P®*I‰¿±ÍÊ·p7ÛžŒX…tÕç÷¯}L‹‘Ìp¢e΋2G4ÿÐFoÿ`§ÛyéPßM.ÙÊvQþòw 3ÝØpþi*·!Fþ½í2U—™¾N6d„À"r1;·Íp8B»tëÓ j~lfL…)ÄöÞišÆ 𸇔øå-uíG O[£  5¯¶éP$¼?3‹F’· äzÓ0,jÁ0U!¥jB¬…omK?ÞT6¸þ¨Ö<×9Eu’ûZ³¡G8ûézp3¯eEî4àã4ñøízj‘>º¤¿ÞõL©RvüÞ€€Þ1J{­)¶!ëå`à2Ûo— “çuCL"¼x ÷|™Ò‡nô.}ø§ÿ²?A³›P׎qHÉç¦kµå:n§DÕ¥°Â?Åíl”;ý¸²­ééøÝe:0ôK²!€%ðø¥t~4Ã,bíò<ø¼•% ±$#4ùù¨‰Å “D¸9²ÁÄJ¢p¡‚*´Ð ߯$Ñgº©KÖ¦Œ ªA¾¬c¶uj<{k<¢‚½üQ‡mdýK?mˆÌ–…-› 2&µyÿΨÖ|pƒ¤þh--e>›ÚSi…h–ñ<; ‡Ü€ k‘™õ­]¥¡«¥2v`´È—$7ÀiÌŠ±ç*ÞãêÛ¨Íþ¿nŽ:»O‚^œHäÉøêd{ƒc‡&cSÆà;}Nï2àˆÚƒ÷…ø}:Æê™£§ù³ªÎƒÏÇDt^ÀbŸÇ5º;I¯ÌÁ¦?HûLÒûH”þ`PùÖ^JœÌ9þ”Ášº;¤£¥³ýRãŽëj´K…)S~+†3C¨Má§Rµ´ê`W°²i„Ì=†c RÕ{nSùê­6ž}Ë%àE åY)*½±‚W ¤N.Ùþ ¸@>³;Ý¥qZŒ ¶w4ÏÃ6-1vtK®‰rµÉ³j gο¦ˆT8â80à Š@ ò(-ìãñP¹T•Í<‚P‚Ý1£Íµ^'ÉÒFð |º» t3ÅrÅ6à¯ÝŠˆ™j«v•É8ñ!ß"<áþ­o—³ºíñ.¾=kç®u ’HT1;zyV‘È&<8®è'^"³„IÚÓ ^À&⢺¢Vòn!Ñ¡ Øv[‘‚ ¦A;zâ» z©¹°S3/¾²{ÐÎ[Â3•ˆ^ {l§¢l¥6Gª’~ö·6lëÞ…ƒæ‚‡d‰áUÆIXî¢OL&‡UAaGŽhú[afÅMEë̓†Q‰¨È4³ÊVcPâþ…šXCõá=ÛžlyzçEDø[#ëæýÊÑ4–3B›6“ ”〠a¨>A”ÓQbplYô\âٹϫ¹e¶†5/·‰ÄPŒîyŠÚi|®¯ãjàC¤¤nªŠÛ@(RƒÚU‡…(o0 ž)|‘ ,†uo¶+©KW]*§ŒU©óÅ$âõ^†çf8f ™nñ"Ἡóm=#¥C7Óã3~=SqÒb*r ò1;§gwìˆd}ßÖˆ‚=¿„Š‹¶$¦^ ܹ¹<Ë—,¼Ê Š„Ý~þº¼¥«ð‚ZS £AL>ÕS[Â$4Þ¾é4ŠÎJtçbÙZ”rÃîþ‰$TÕÌ“7©Gfr0ç¼·?nýWÍ Í5˜‘w¾°¨èï0¯(‘ø†ë§ÿ$3o/*ŠÜ‡Ô.†ÙëBíB‹GÒÄ ÄÈÉO$Ç•Q6šÌ ùŒhþ7±T%øpôq8©¯qju7a)1øk ­“¦¶²xMJz‘‹A6Ìù‡ !VILy}¯dLA¦³)þq™ÖKàr5TÿÓ\K9+—‡TU˜Ô#Rž{gää]0I[Š{K"ÓñêzyÍX$APXZæ 0Í•Ï5­g9AÃA˘ö­ÈW‰® ‹éÑ}&m²Zâ‡aDæ®d],„§,)okòºÊ|¢‚´ }OýVk·ƒ~éžö,#zŒäÜD-P]7ï‡×äõ×5Ýbì‚Ð…€°ÒBæú«K¶Wx†Ä¼Åÿé¹§—:uGÐ.œFnÔ–mä3iô!Ý%À²Ä*8 ó z¹€MYe‚㢶p¿Š¤Â·«ð¬§)åhˆO׃’4’´¼aÒ˜¸U‹äùç½—[aT òõÆÌ[Z¶„™ó÷ÄQ[ã™Hó0%òü¤™Ë\¥2M†®>ÂÉÅåÌÿ²ÍH ûmã¶=6¥­UQFoŒù quðM çtŠ cTaƒ3Œº ¾ðô.ÙŠlxMIž[Ür±%<áS«±»o]u¬¨GÖ_ßTÛç91ôaôËe'a/ìH‡…¡ÍZi0ÀÕÝ ðÿZ ‰ê({ØŒK=ó®ï*f4nŽf÷Ê]s5ËÏ0ŽŸªÛ(÷[µ„Þ¿Á¶ÑôÜ¿ e‰ªÐ¡p®ÅÂ(æIÃødÌÕ¡†x›ü¡Ïb;dìCT\ŒÄ®iÕÚ.Æ`®(ìÔ=¾R¹rä%VËyÔDŸøŒdx˜¡ú Áã.wÆTJ$šåAf¬¾k&¾I;Iÿ Z©He:Õ¿¶é’kñÑ\}_ïx}zuÏÌ6j¨6+˜œ× ZÌIÚ³|; ™CAýýްö¼¡:/»F|ö{Ì{c ·ø™Ý„…Ã0§GÒ´ÔÖõ;U¥-ž™Ç¶g4ìmZÈìB”û ¬.‹SŽ ™aG”‹+¹§|‘ŠþaÇ{Ä7G~³òúüVgúWâ©Ð˜VâL•뫚8Úøà°u}ÛíÊD¢A%!ns!4áuõRÇ&²€©¥%жb8,ŒçKã ùE Ÿ§0ÆjÆõÆÝVclÓ¯5Òœˆ~”‘Czg,ô3:¿hylÆ~Rš£\ã’S#¾I?/%¤ñÜšikÓãùVŽLzÐï ¯j­ù‡rÇEaýÐâ¡Aˆ34lI–®)QA lëYFâK‰„ëÏm²³ÓÔÄÍ·Õ&yþûÕ{q–Ê1JÙöä­ANäJ ûU…9ˆ8ÂzÇm£±ö/¯âùet!|F¥m¦b:Ä›;6a&'»õjÚ”¨¼œèê÷ogÔ·. Œ¶•wžÚ[¤z•Kç3KØÂ@çs+Ueô{œ³†|¾ºGBŠ«³ Z(ó_Kõ,öÊŒÿA`ðÃ?§¯>ÑSº…£˜ÊÝzç°sQ\r°Ë>š[ž"YmEr‘jQþ$;¡÷åî°ÁŠäÍ/ŽÁ†˜Ã†ÕìKÆs›Ú õD”ß-ª4Þ%Ï,•p@ ¢1*Òo¥=°“?몴™Ÿ‚~Jâ*5yP è6D÷…EP+Öz9”&^"Z6𷜦¾o¯£ë¿ê§‚ãç¬Û:;0˜fñ¾­x£Œ:×y3x§ ÍñjK3ÒG°˜áFÌòŠ`ˆÉ&ºÓL‹ŠêöîÎ{zMZ³=<ÚQï¢V™h7;ì9ÛP•H r/Ù˹H†ðËç7&VUÂ`Hj-×%ù2s/ 1îW~² ™gÞoKñ.E§òN>)vAÎ6€%”ã¢@n)ø¬áî_5Eô~¹ûê¯uDÕ?áùŸ*SÁ-îÝ/åðZþ²Ä™B}Ú¶ŒiùŠPúú4áå[?q¶.IZ>¤¾|²1ñ¯¡“ƒ±êQ¥÷ÏJ®?c "ÛCÉ‚ÔÈÞÁ9Ùzœ¦~nÀ¢V"ç@(Ml¤‡¸ÿÚúÒ¾¨d³¿ÀG¤ï2€SIÁÕ½ô²ØHöÊf6Æ/;LÞüênrh»}œ3±mðئÊrÚ j–\#<åe‰‘f¬øåÝì¡Õb´9-¿5ÆóŠgDUù .ñŠf÷Ni1ÿcdM‘Ù°áVµI…žÓ¦GÐr»ë4føÏç?~4;=û5l»ëÉJ.f“BVž1>×ÙÚ 4\âk+öà[libw¶"T“²úäSTuWÖ?T¬®º70×VH3ʰ¬d‚ë³€¬¼„@ºBŒCN"`uÎ`9--‘o×xMÆó܃•In¾´¬€S¹\Á04'¬ß^´ø¹m0íšÆðÌØ–ÖMr 'ts¦ $,¿|`éꉖëÖøô0zuDÍàÖÁ);…ä<öiÓ²!e Íéƒëý¾·ç…™pe7’èw¹j ¼ù¨}qð{òBó±*¨V9-!(m¹¥Q>Á¤²–¿ˆy«Øf_ò†!å•Ñ01½ñáÀf…·Ï! }¨Š˜ªü¯Xöç~Ím¡óéóÒc`§S‰†åa'ý)²-=*Ÿµu pG0„ˆµiäà_«a”,²Êß#çìdì{ȇ…Ó¨Ýpâe¨:ÂA­"žJ,Vp[#·Øg†'»mSyÌ«à4¥»P ÈÁP2¦àybÍåþmÊG„Âw~éÿW”îöâJåà|c3qA]I€—*cµ´ä2É‹$üûIu²!€½ÏŠŠ»®|ç;3’Ø…ß|ãûýf¡’׸õÕù¼=ünå,ƒŽjDØ^M±«AÔ~EäŠgI˜Š%XM¿˜ET³»û #NàôY³W ëÍüD¨ ¶v‰Dº»ƒÍß3Ÿ3y¤Ý™ . † 'j-†f¥Ðœj~™{Eñ®K÷³”ÞóXR¯ºH1ò6úMÎ! æ?G¢G¢gž”C<(•oeÌV²º¢ø¤öËbM¾Ê¹¦gÉqîÚwHkMtGåšÇŵ§=ÌK(8™Á{,²Wù9/Ö„ä³g)R¹WRÄó~ux ’26xŠuèfýt&ˆ·nŽ Ç.T˜NUŒ’òcI” qK¦¼‘½1Ål˜•Äe£|·óÇ?Ÿõþœã<÷lãBU8ø°lc Ÿë °h"O|_CUOç‰þgÞƒüpÐC‡ð&ÄR>[­Ù5 Îç$òÕÌèm–ÀQRË¡QƒqçŒ:–w¥bFýð–FáÓ}Ã24WÔS£2ãH¾h½ç‰¢i[œú,ÿöêl(¿ÅÝN~úÁ¨»‰mäõ#_$°Ž´úÂN‘ªUG¦™­7ãê„Õ/ˆ’{æ¤EęߨP=Öž O7W®]ª¨ˆ£ªzvÅ ‰Õ˜ [»†ý§¼ªþF©Ðl[{/}§’^Í Ï`J)Eò68€¾ú vx,Ï$vîß ¡B-aôÕÏl«`A¢‚ë'…=Ç=5ä\UìÈnmów®ÿó²Öªf Hp·é‚S]bYòNc?é›×^ƒ^êÞÆ!¾§Ä“0½¬3wËâÍ)^“3éâì°øºfnÓÄ8µ«q\«ÓðàZ[ËBí_SD1†ô œÌ•üˆéH $ÓÉ8Í¢©o­Y6ÛŽl .J€<Â(¨uPÿV´]ÏŠÁN.nØûµ‡å ,Uÿ·‹„! ÓØÓ¾XQvªÌ;K4À­½ º¨‹´]ܼåWíý´ò;Û‹`ÓK&^®@ËGµ9†ÅW¿xʦ`Sj³üi ®šÞiCd”œ÷ñ„DñýKè¥Í†„?ïÃ#“ÏËøÿl4ª;þ§m§*´…›ôã˜]úΞ+Xì^òj¢¥­Ã¡€˜ªvî:~-›?^‰œœ]gó‰ Ü0ÿ¢§'ãJ@_Âòúqò+J¼+ÞHþ'ÎÄ]¶Wºº6ò'‰?š X~¯–ß§Œ’nž‡3Qïÿ"`)™²¿¹Ï¾ ØüùçïvúuåúhÚº*œfs¡ÓI;¬üÆWc¹=¤ ª{…jGÞ'Í({ïœ$å£ÏoÅ^&`ÇÒ( šé43„™„Ù!îsž€£‡$%Bašñy³Å靈>»šÚ½¬kêí°èý„ÅŽp2L ¼Ûí¤¿,ؕڄ'¿z@×±!ôáÆsH;êÑw]˶y7P—´©p©­²¾ ‰w÷z”r›¹+\ÙX0ÄålAPÆå3õ§’\´îL(kW9i¼–Õ?DQ§3 H –Y<’ÜèÂ5{^¾œÍ‡¤s¤r‚›üv=œ—–Ì2òÑG¾( Q„!‚‡ôÂ$’é!|IRª“x¤ä±ˆQC"ãêìšôn&íñ5ˆO‡Cúï¢@ÅRÅŸì(Iµö3Á6Ü$ÉÈM‡Æß6°:5‘j¶Ô`7h Ê×a¤Ì7/ìòZ´îÏU0ãoî3LZÐý¨PT`p¿F÷'”ß%òÖcÚØœûbrœfG±. (ÒWH9pÁƒomZ†è‚ŒµCR’`›k÷ 긤ƒœAÙÉnbË­Ë8Õ¿¤Ê’ý¹\•±¶í.F¯=6m™„óÕõǪ8Øb mf:¦;Ô9è"ÖË„^‹¡¦—r‹ü*ÅW— Æ)^š2Ú‚—õo ÅRPC *¬²x¡©ëÞLp:ÄÒ3y>L£¡“×vº¶:›itÊm×@! 唫WRϦ礀ç[jÅønëü¹‰Ž Ò$ýð¹ÏŸ‚ç«u£3Ãr´ˆ@*tO<½1G¼e¨Ë4Ñâj¯¬/–)ÂL •<€ê÷;˜dç¶½ÉJlx¤¾ ¨]\’V½$°ñ- ·YÄW,t:"^h¨$¸.¥ÌÁìˆKˆâì&½‰ß®>ŸIt¢ªZíeËô!t‡·]ú¹Û¼.{Cyä&Ûü‚ûñÕý´”B«¬ÝÇ1ÓoB£´è‘'Ró8V)ËÁFƒ¼¼¼A{]2- ÕÄN‚å`¼0ÒeRÝ–A2à´E\!বÚ‚M„tFó#¤>IND[Á“`–i¬î2é`&Î̆T2Š4áA Ô’ S2K®ÄúK0ã÷6bIÒedR“ùÄ…»z­Aß3u§³lè)yÁ.eÖnP=5òÔm{®ö?ßÖªœ6@Ë̉#~ñ§2 i‚”¾Èw°E²&¸J˜¯CEåÐ\fSæÂ¶â>l\y÷`G)gÛ%7ºÙ™œÄËNƒËcž³D?‚ÿ5ÒôžfdB­žU'çÍ”jøòÚ?DÁ:ÚÑö÷Ç)(éû9r ÞÜÔ¿Í o!¿—0²ÿÑ{=ûî$Úi¿›=$/ô¥¶ÚŽü‚#—¤®YnJÅʯ”½õ›]õÁp÷K´1£ì±Ì»ª±JG ëëšÒ¾Óc½¹‘gÚ6s«µ*ïÝû´Eè6²NÊX<ëòÂÁ¹””—FÿÔγ6R·½ oÏÿPtÆì1¾b(þ.–ÛÈ%»5_€÷ä@Ú{MÊgUi8Pì÷³Á”w€}6™+•l¨’·~îà6:Cr)C†0iÜæRÕ½C ¨ªMÎ) (èµ…3qè°ÔýbxÈ ›±ƒÖ ,åèÔ<ÒÔœ¦q˜­H͸X&ͦ˜b`àEû#™4CzUdCyk’À)~‹‰oß&Šk_¬ÞX i’ŸW¥­æ\HM`Dâà5沇©"Ô.-5ÑŸ»\èU¥CÆ5”æ&kaw±y…¸ •÷‰zÓkh½ž€V÷œæy¨$%»áƒ¦ˆ½¢ö„ʼnn`®À¹ùa°QOö?(€ yOÁnP‘¯„ùËð„ªBgdÙ1RWžw à·±e&Ÿw,> Ç ôT¯áðvÉ×;T‘kÓfY¡&Ôlˆž› PsƳÙVʓߡ2ᆷîU Y±@À“ÊÆ+/î—¹i]jÀ(‡&å®ëÚÖHò™CiJfõø‘²¼ îøuQlãy”Ù ÝUÎØó¸(ïG8j=¤{•uÖh2[ ‰õª(΃…®3¸ÀIGkÄŠ©p>7´î«‘¢W¾¼Yx Y`ƱOúF‰ÍèØHrç¢1:ÇLÃàåA›»œãþÝëm/`ÝËà”ðzOÎqô÷bz(œqWªmK¿½ïxNÕu‹‡µíb»ä~ž¥C–x®C<r™DR¬Ô X2vfXʨIP„ŠìÝú«wCÞ¾qRgΛFGªêbSvY#±A«ðWYE<`ŠÉ‡a;ó*îßgœ¦)"Ì0·±J ìš”+èZ=l–}“ñ¥ÿ(á;¢¯@œä«ªªt¹W".ÁÉÅRÏO¾}Øþy‚­£…Š`óð^ýFOƒ|lÇßN!gN×I__öx¶£žU\Šƒ†œ¿™Æ›:‘®|l$xsciœE³-é”èž^Ô¶ÐàÙ8¦‹Þǹ bÒ¨2ÐYÄõ›Úó‰ Ó¤¦ó£ì¤ÕjÂ5;Çè»á]ª ªËº›¶²ºÍuÊ×O€¢Õ¥á5$[í;h·dóªh´ƒ3ð>Ÿ_MajõCmÝ€¯uï©L0:ÿµ Ôä‚!²OSÞ•‰¸}ýžÁ¼ Ð €vî-.©¬ìÔ‹:pëªÓk¼9g66ÅÏô¾úB–””å%sBòˆñá¨Ãnk—9Ã×e­{!ÖNØö»¼…€+l;V×dW;Îìz{@€=3³lìð¡‰ÈöQþ ]7-F¢pxaÁ‡ÐG.´.OÕ/#$˜Œ~ú'$Š8B—âr2@Uôï a¶õ[ËÃÉÈDš1fqm~¬êiUg.b¹á.Ìú|A½4[Róë,x».ÞwàÉΗ27{s•ì‡ ’³´CÀ ô¯,Mó÷VéÞ+ •©l¬èˆ¯TDÕ~ÒG…%JóDZ—}OQ{îÑœMÝä­™…ã´t°]V³Vg~/êÃYZ¦V&äà^]Бƒ’ó 3Ÿ:^êóëWTÊB- êɨ1Vtg 9â¬ÕQgÀ*\Ë0õßFÊ’ªe!bë ñDá༼_M´IËK|GkXÃvn¡ÙׇP¼ -€þ{­—-kû*<ï_ßìiJ¬þ0—måt™+`gÝÉè¡ Sô7e“MJÁs=Ÿãʺˆ3Ó²pCm’¿KŽ Eq‘÷S'h3Cî—Žß #ˆQ,ˆ&¤X­‚ñžFö$ÀÛh¼NHˆÂ/ŒÆH#0üD3›×Öœ ÞlSëG¶Mü/“d°V¦‡ÔN°˜B‘˜Ã'½thöç µ 0¼k‘ãª8;´£Zž­f•ñX}Ê‘ÁÍ=Î×XÌ(näÿ½\ËØu“ô>~=N”f¾iòy5JÍ¥ý.¾Ž;¹2ÍQðRæT’2pÂ{?tΑëŽs˜ulðl¬+ûPö.¥N«² Æ«WÀ1nßÊÑÂAܦT°‡¿ØçX­â—Á^W!ØgÌè¼~j§>¸`²R ßO¯´~ƇZ…WgÍ\0á„¥­°P¥>¤©y(ío¨Ë!{Å‘ ”ضZ úüpµ›‹Sá%'*'—£®Ñ¿wI½|Ú¸lÙ% F™4QÌ^Iimšÿ^»"àEHv>a’8Î,aþƒ‘QØ*¥|‰wÒ&<©òÿ6â(@‹ò¾ÂÞ©ò“7òhoÑ×LÿuÛévÓT~Âçw¿{r–JfÜw%uöï¯)ͯ|íFmwíì&Þ2¸Eû >¾EÈêGëU¾*u‘mxí§¤3kDÒõȾª1Y6°Ä²'¥Ù–Æ‹1=R«GÖ©;×#"I³éx.޻žÜZØsbÖØÌœ! áóS<ÑUIf®†üFWC˜-¾ïV·jëK?£ï@˜K–xê±"n“G,™àf•Ö¾î{+7“Ç(fV”}|¤VLg×1çIºæ>h¿wa¾rΫ' vÄ@¢f”DÆõMR}¢…»<òi×AOé¿ÁÃ3"._àw'Ìyç!@ëšöèn\è¿_6¿ÖSdþl|þHÏ÷hÄÅzv®¤È´Z‡3ŠÇ»Mµ›îa©ñlµZÑåÝ¥½Ø´žç z,µýÇÒaÏT+]N¶hi6ŽAÌC–ž¢‡)Á±²5À^÷X[‰Ë4áHϪ¹åd8Ò9Ú z'o«3¥îoBÉ9«³ïzt?ež wè;â!½<µQ†»ƒ3¸£µ 0BR¬¢ËOY˜ù­Ò0‚Öc‰¯ädj‰6b2‚@{MÕ"ë(EíÓ•Em7™\¹A°îR5_”/²T¥Q¤ñ²agêLê:æmyDõÉ(×3 (½›C7Å–énrwjýí ÎGFeá\@ …`XÞ¿YaB™VéõÕukŸ/¼þ¶ÎNjïÍ0=‰-‘Q3²ž©é'™:ù Þ '•¶6ðF×MJ>«bÒžmXøª¼§6úÝð¯^®.ÙyÙµ9åÆ ¾ëì/p€X—qUeijÎ]üg‘Å@U¤÷¿>¥vu4hÿÍ4µ;ŸºYÏá &°‚6éŽ7ä°-%V£Ò3ÉÚÝã°ï5´ z¯úªý‹`<¹L0­©“Dúæ=!O‹}µÜe4¶a~"„|ɘ—ü^­ì¦9¶Ãù{»Å:c­yu.áç˜c¨Ÿðàô"¶ô¿O/qÀ–vÄözBë1%ŒÜ­ü­á¹9ôÓ§àóÒiåo/)÷aÜ—¡¼w(Ê1gÓ=ÊLT¦jцé¬}N61ÍÑÝh%´Ž$Œ ;Wì/Ù¶q>=Õ–¶”ÛŸ”™”¥o4i"ĵÓÙ }oñÍ ý"»4ûÝ–ùítMÌÎ[ƨxüòü³F~K÷#“f·N[g:w=쥄YþetYñ ùs_´½ŽGõ_Ùaë¼ð,‰sËáÉ]SGxÖÕ¾añ±ü²Õm+ÈTÿöç>9„‹ÀV=ÿOý調ãzŠã$Š™­n™X$¡OM_¿¼5içÔôê¾ÿ7—;¯;·ñÁ„¯H—&©•R‰o¡aû0ÝÍÝËÍ vâ›3*¨àopõRƒ¿KÙO—d­½©©ÿlÑâ=ó·uz÷('=Y5É.k<3/Ù¯t\b»SFX¥ý»ŽUVí(iøRÜ‘pˆj„ÂTXÂAéxú`¨Ë‘¾ Ly÷ó^?[ <®mæÂ•mTÎî©§&…~Daì›ÄÙ¨äÆ‹D1G¢Ðbje–¬v@Ð×NÖú-¶•‚ä„ã©+z( `ðg‘Ngb |±Ó딋~–äi´^Yï£-¹üˆnl˜ÑOqàX <x4†p†ˆäYñ-T9ƒ¹f¼#hÚ]Ÿ@6€#¶ÙYˆoß¼µÃ¦Ó˯ã7÷W]q*½ó6ºÔšr$þù:9[ääyƒª²1œ®³':õ%¿Qšz£wC4OzŠç2à6ˆˆ BàC<Y2°§Nð6âm¤p´9 ™ßj%¨=òÇ/Š3ðûEák±† XI|N‰zÂGzmÓvr„eÙ¯kG<‚ lÐOèËøë®|¢ãV½JÞE7®V¥M¶^`äjͬÈ[¼NáŽI„yÿG¯<ú·£ó½3öhí ‰!à… Qô¹ù‚<™¶0¥‹ñÿsØJ/äqº–Ø™Kþ*¶vÍÓ¢qFQú™D‚¡ÿEEGþ…L¿Ö’[÷îö ¿û†’^ »Ñ¶¬ö²DØ–¼.†Å¢Œ×$Ê Õ'|HQåz¢¦=ôœý´ÊÍ>²!¨ü­è´ü^yqÓf]•ûH¶‰Ú;Ãy<| ” ¼‰õ‘÷r•Ë`Í;f§(7¸’¢¯×p`-Ìa¼zC Z¯ò”2^ž¢ò5 }†œ“«¾ç§­_‘ãî.Ï#0#ùþ_ë$Ô ¾ye÷Åy<.låžKÔzˆÓG½?–üí3³¤Ó-—¸lY…eíÙ\¹!à µ×dǤÀLZÖÊÑdct‘Ç¢ð„;šr±°Âñ÷*²Ñë­lëEµ¨®]‰p¬ÆäH4$¨£ˆ^OU@S°úÌbÌ·¡ì>wòž÷}y¶´¬!³LLo|¿¼îc²#Ö÷fçÛpððz Šî"õËñÂÛ¸ÁÑ&¢y’ÿm§£r\S "A_JP,Üìÿ+}PÜØhè<Ðm–S,igaIÙðØb<ä›*²@'Íß•>¡)áTr ò˜4k³™'píÎp2"ƒó²ñç›6ÕSâûå‘v9:g_Õ¡»+§·T.jPÿsÇ£fàYí¼]­÷M–Â&¯Ûó¤·U]"´ÍŽ0!‚6@ƒ¥£v-0û}t&—n%©¬à.5Å@ŠÁ(>S>UcË!íH7¿RTàÖŽJÖ+rÍpã"O ó½ ÖšCkÄÛH —öÆ%7‡F½_މ4nïTút•gÒ(‚…1í\êBè¼58»Œ¼ð€DpSm†Ï­þ½ò ² ˜*–©KeUŒ55'Ä0 õ ’ìÈø;Õ€K³¼_L{ÂS”ênGXô¤R7å˜ :‡6€ÿ{·âËTü¡uÁë‰ØGs_½O^(y°” oycêpC[&_ ˆàtKÕùöi³ÔŽ…b·Åkk+ë È$χõ楊Y/‚¹ªŸzGT=ÁP£”Çy%È&¶0ù•ÁµÚÒ&lä}ùkÊ»W×SM°£ @èšhœ|ØÅ“þãµd‘3Àjšº\¬=7–7ëɯu¾Ùô¸¥C»Bf!stI¤¸ê H%ù yŽ.n‘–õl¶¿Ê¤²«Üò¢ìdò‡zílõA7à—ë¶ç$%œDVûøü.øvÍxvÏ\: ¶½!­TѸîBf»† ö~Ê›N*W±|ݼÂØ§U‰ âèÚ# ^¤¨2£ëɇå(ߌ§]°ïˆF/Kƒ?Á9{kˆeÌzâÄ4“\S•uCB)f`nÃ2#@ƒûn¿%u™[6²ª#g]æÜÍÇŸE1†-Q¿bå°aå¸Û¦\ƒ):]ì~?œ¤ÜIõd~œ >÷m×›ã—PõÞtÒi)x€=ÖÕ 0e¢Ü!õjy”´ ±™:)\$é>–Æ™ ¦ñuà0ÔG$à÷JÞÿ¹ ²XsðrÀªw¡ºå’P¤~9¹“Šã >>HãËyÝâ ¥Äu«ªgZ$jxå.J©ÆO(βƒ°I1õ;Îøžk0˜ÂÛYÀÖ7a´Šrµ)˜5ózu!iáanª¯˜sJø'vd*ŸÚu릵Pg,;H™àù-€‹6=â× ×þ÷è¨+Ýk拺4ÄùC|οëfæOMøO™Û€H;ÛË<û™nj€~ù>xT_<þ-ÕzYõsI˜rþk#Q2|…úM†í};Jƒ,f-w1yWM×$Æ=ṳ́è'C‰P“y”F¡T°TGi85f, Gà£[Õž£A0Ø@ÎïT%‹.aѳ-S¦xdDÙÖôI¬çfn¤ÀÜŽû_ô ¡½ö¼·hšh€f#Âq-} ¨5‹´@”g¶YjŠS¸ì÷¸ÕSfòõ«s»a›ƒegäíRàUñ’>I9‰¦ŠÕ¸ =Ü)ˆè”ø;´*AŒlÕ½ßVÌ鉼r‘K´£&ƒˆçGbËaŸyø,ð'@ŸêŽ-–ðËz6<Ö.ÙÖ_Cž¿©ÜZàìB­#|l AÃw*‰÷íÛª?gŒºë=Ç.ÕlD„¶ÞÊ[‹ß˽´Ç—¶ÙtIŒ£›×„ãð E=´ú¦·t„ãE#’¢@ï7:B¯ÿo€| §©å6 ÁVz¬(eâ/v{)^•vœîXû§ZD” /éÖ‚ ŒÉ˦ãÉfìõúmé|€62¯P+C H¨ pû¼¦”Õªú)û*¾õ Áªªžõî*§`ˆƒIê4UDŽÆLÞ‡5Œ¶T2‘Q’þÌ(gÜ‹•-Qg¢÷Í(B¸ãQá)Ê[é·û“öKÇ6‡fþÐÍØôgd is»pÔx4g~;ÀWÛÎëñ›ˆÅçÐVeÑM†Î2€ÁD/â“áèCùy8“Äíý½Ñ¥Um“êõÙ^ÂÎ Ó{­2«mÒZ@Io)ëÜäÁïð³ìIÍXfÛoŠo½TQ(bH`,9ÂRì£kÔòš¼â«JÁôëÇq–y:Xç[÷á½h ÄšµW62ö^ék‚¾ìDÉm!+‡wmJåÊžÇaAìv«i÷h…ëÑh¿É)ó5ÊÎ fó¢L²ç´Ô¡Ì/“f L/HÞ‘X–ƒ»öÈ„Þ'Æât…h×ÉŽ5sê¤æ7o:7´ë¢ûJ>œ¦8z«‚¬¼M®äH²y•Öå7ãOÂaøÖõsák ”• ¿Y …°¢UcÈ»§×ôo›]Ê¡é’YÏzÚzQÉT޽aøùÆÇT諭œŠ OÎE—bð¥å–ù ?jvŸCŠ’Eˆ&ù´OåB6¹•?ÓÐpï•™Niï™G—R',Ù¬Òi%s˜¹òÒ¾ÁWÒîNj>í—Éaß.Mß??¥4eýÍñ*œÍK¹ã¥¸‡2.9vÕnùøøOl‹ÖËÙ:Ë›ÉLúˆ&[C*«?4ÍJαd‰Œž®÷ùèX!=¦^²Å•êß|šÐCïÐÑ {·ÑÕz¬¢#À  z2 •z„é2NÞÔÚ±IÌçWÅ£8@9xš{„Ö¢ïëLvÌjU¯¾¢¼ÏGßK×ÏHÎˉ8¸Ý•ö‡£sÒgd/0ÂPÆTêzŽ.èåœ!Ûªå7@­5`û±óu2 Àq »dMºü¬TžÐØ’ŽI#Ú¨¬Ã·f]Í-L–‘åOÚù£ýuX>!Ž{Cµ Â_Bd’CÚM†W,P°l€>µ«j™ôè§NøÁ‡K냉Çç¹\¨$3')§ s+;µ‰™©¡ÙkKÅXµn™±Ï4¥-ƒ¨Ói.y´–äSÛÊXmèÂ`¨ˆn1ºñ •®‹LÍ3+åÎ2Ü Ã…©7’n”3 ?Û© Ä‹©hU#§ˆòh:¥qÓq+þÓ?6f×O±2 àéf“ÁÞ#5”æ^d ¼v‘;Clq²]fˆÖ{2h( suÑJ#…q¬È‹ƒKÿÒ–W˜þ?GXúú·ÑÖ¥×a½ß²K„±ü‰› (@øÕƒîMyïHÎe¹Vö{H´ÛZÝË*¿B}Ù-]˜yÖ. p!ç…þëFÔaü¸{tº‘§˜¶¶Á=+œ$f.0-¦ìçÏKQ] Ý@—Y²­*€ù²Lk8w¶¹W©ØÆ Ä*€jAÔ´‚L!5*ÊP2†ËÌg¯™ûÑ^\uç»¶nᥦq ™†ö„˜ZU>Y±Î|Ë)Ó¯}gWsŽ~Š!"‰ØÖ>§Z½‡¥MÐH&É,dý“1Ô7-£–Õ®‚¨±± /:Ô†h‹aÖÓ9¯ÅänÍHÂE<öoîX å³v2x%r/½eaEqéÈE_hAˆCÑ:á§O}陑ÀZšW[Ÿ!?éß\£ÑÑÕ>;àŠØF§•…íüë«EXySB^²oz’t†âÈ—>ÐF› šbáJ;G†O²Íh#+6]@‚êÆZ_{‚´—ÞÙ~Ú–L$è]_-%qdí#ˆ–é5¯ ¨m8ÒM–cv“’óy#L£Ž¶äA&~oÃL;€‡~4OæUТ!í÷ÍfæêŒt• •;0<»¨éq˜%`lW¿’Í×%‰Ã±ùåµ1ʈ©wgIèîó 1 Í(äpip ‘¸RCž¢½œÌ¡°­OQ=ö¦åwN·R,;²ý0\üvöH¹Çœµ–ÂHúæe0mÜㆀǞùë¾Â脎pYxs8R Â3¦Ò5)ÊÍ„’ ‡ÌÀT¯ä_dŠNà—ÄZîÉå1t¼‡Î´Ì}'˜àbc‚„yiuáäÐÒydvŠÂ³°ç§µÔV^Éí¹ØÆJÝe§’’´«wC÷ÊS•¾G©}0xRŸ~i+w5$tôf˜5H¯$*¹¡GÐóÖzÓÀs<Í6,bvyPèöTÍ4—5ZBð Ø+E”¨3>%¼3tŒÀ§Ï23¿^Ýjˆ ¥?¯<ó)ˆ_b6}N°1¬Ë|©Ö§ÓâŒÿÛ§)§¦ì<«c%•dôž¢ÀðqkÈÞäžA0”s•cÂs¨ù~»DdB̶¤àzVœ‚Y»õ-d¼ð¬Ñc<;Ì,öãf'46›5ëAá‘’½D¹•«›Ù±çœ›è–Pà]¶±å0“€LCê’¦rÂMÙ´ O[´×Å@lç¢XI½|/"‹•’P`RÕRRÌßÄ8Ñ€üÏ×cË1ÈBÕ ¯¨¡DiE‚5®C4®(=ºUp5 µq ›_ìHòkwjqÊŽJø»!#2Ù¿iÐðé&NàMнîþ0­/¯”#am×¼ÌàbÐBLÙ¸0hH›W'ÆÚ;¦vλùÏbµr!CIóÍm<2VIŽÜæ…FÈM¨»=Ðï•”lŸÆ¿–™lŠ›éŠP{ôf/9èxŠCz’îØc ZvåÈ%ãœfÖÑ)÷²ëáø‹;Û'QegÞAi:*›¹o/ïøÌñ\ð@û¿YEžzÓ „S‘¡žñÕÌkÏ"Ê ,EÌùºmè,sƒ"”e…°ë­„H‚ɯk< ¿ a÷ˆÆ 8¸½ÜœS-ITaÞHÒ)šþÛ²lÇ”2fóVDs—± ©ïu«'¢_BïÙ Ñïq_Nt7ŠU•§rgÊ˺ñ+$KÏ$ÛaÇïâ¬f³S¦ñ E_õù¤›i£Ç ^·æŽœ|†œœ²¨‹”=ý„”»*´¤ÛV˜5oØhý)SPjÆU¨HsmYÚZØòåªömëH‹»O7ëà-ë ›IÃôú6L£dsÈb8xˆ"1uaò˜Ñ¨F =¨:Í­\àìÈ “c="•yˆ"ª¾ålÏv½ì‚zÞ€tºk¢7+û¢‰ëxê÷b⤉©E†¼Ÿ©®˜h|ëNô:|šx´#œß0ƒÃ7š†ìmý yEóLVÏUÈX ›çïé&ÑîVL–G Àÿch`ãcÊMPC¶Gbe3²ŽµdóÇ)€ø¯Úó¤Üwš)¢ÆlÀ¨¼Ê}?Û™Ÿ¡cÑÊuâS¯«XÌdãäE©v‹‚ÀjžBÔíŸõµûº`\ÊæJ29i9ËÈ>«(iªEQ n.O9×™AŽaY™·‡3âØêÛÖQó´vÙ‚ÝÑ*Z€èQI„ÝÆ[êvƇ†k–¨’°æB€;|´SvP'tîî R4ð;K&ö´·¹JY:Ìh‹¤ó…C;òIÜOÆ1PUÍïÜØyQ¹9®Q¶Ê¹‡›1GGgRT9U¬MT²ØŒ>ÜëÊ!.JN™#Ó!7!M©z¸ÞÒÐ…0˜ÛR¶[ˆ²svªÁ€Y’Ç)S’K öb!U[Á,»Ð6¨Ëå“×n»ê#¬–¡â²6¶9iîµs|·hÌÿ Ê”JRÃ?ì Aî0nqÎÝ% Ê©Ÿá Â6“¢º@"•Ê"­.®æøØÍb[òÖ5[)™HuD$ÜÔ Ý•5äÙÍ8[9ƒŒsc]6-Ö&‚Õk>é« 2±eÝâÉÎ÷—•êù炌¯°‰ˆ©VM!ßN–Ѻ}Ñ{ ÌÈ6Û¬ð½5aÝžO5¢[V›n»²yr ÙÉ\I¥¢ —ªu*U%¶èO|†‚{Éû^àsíÞ Yކ³™ú‡Cä2]e£€ý¡r0ƒ['B°PYZgÆ4L2 g9+ºMšÁÚÆtdÞY±3àºP|m4š¨"ÕÅ7¦š2zò‹Á4b‡hŠà=·_ìÅÉ9V}õôJ}˜Ÿ˜§TÕ—[sYÀ.Ç&Æ´Ÿ9ìZf_–Æóa·Ó3.g—Hþ>õ9†eË`Éþ E?vWôwý¡€Žj·—§sÇCÆk*Õ·OxÅH区í[ò—¸e×ÔË(-á÷:ËžŠŒAâoõwI6æóÇ*ð*ƒÛu6x„S>žñ\‡ ž¾ZkêÓ/]êÝðáôiÜ?‚&r¬-ý: øufG-OA~¡Ø@ëË„­6¿µ‘™ÌŽlì\¹ØfÝ v;6V¢ Õ0K´ú=9v†¨$Ñy Šn:¹3@Óýs€´”’E¬ ¢åx&pÝdK×TÈeÀ]¡ Ϧ©=Ê{€ ;@¡òEâ8aÆ[àêeÁ*¶Ý¤K"Jq"‰g±ÇñÕGù!Œø¿ÉßåÝîô(¯ÄM³Æ [çÉÚC\‚|q¸©4ª–%a Ò dëß hy§«N¿¢G®e‚´#:¦Œ«¸¥{«Å†ÕáXšÑ_ëVÁãq=0âU¸]ÖJ“{ˆNfæø5HiÙ!™TŸT5¨«fP’:G¸wNôæ(×%c5}ÍÉ×s6¤ü3v1¥v}DÔb¾çú¬|[« Ù ps"ð™\^yìAG÷”©Å\€Ünc˜”K­Ñ¿w몭"Ô"[±’Jô”n•l‚&‘ihQɽ.Ê‘U俈í á6—Ýùè't×ÓŸ^—Ô90•B_>œ;·ÑÜ‘¨ÈvF ›–w(äöžj߃@¼z‘-‰9SDíCoHé® :Å[%K±Í'-ƒèl[€h~1b•u+x¬ß,Î)xØÒî#çU³Éßœ'»‰Õ`Ém){®CYSÑGºez/çÙÑLx…Ašðèw;Qÿ¬¡|ˆæÆ©j£)²½9Ü9~ñråN 9Ä©U„5a’u2ª%b~öê>rùZTÒ3™¸3p[IµàâSžŒZþmÓ7.C qwMb”¸PÌF´¸ÍÎÝhï#½ô‹W?´a!M ”f{å¼ëR†U+ßÚL@$î`¸"7šR[L$¦½›©ê‹¢ I¬Z^9ë †v½¾!—ÔÉBÎ Ä«/Ë–äöD†WëêJ|iÏór¨´ûΊ ›©Üœ2B÷dG1ÕÛÅÔ)ICß§Fï‹JÌkÓ£ffáSÔÓ9)AÌ BRßœ 7i"I·è¬¶Ç [ðNßxjë%i§ÍBå=J{#½Í“M;'ãøý5­¬|žq°Ît…ãUÅ»P>Ç·„…n3%.õf½.ï… ·7øËC+“làIDbªÃ/‹)ù(§®8ñ‘ñPË øÃo¶37|£"ãë>‘nºsèç½Ó‘=3¿¿Û¿Æ­Ü”ÿ†9Hêó¨NÇÌεP>i\GMŒ ëâ>Õ{V”iLép8)¼ŸlÒ5 "H¤3-Òù# ׋ôIÔøŠâé{ }ûk÷B+•®\$Ÿx؃L6X½>,Š®Ž_]¶ÔíB“ep],Ã@Ò‰õ3V£ ŽR.Ø\>ŸúTE+×r•²v,¤¢‘Çí-¾ö|Ô:Ç:×Ûù¦'õ³å0ÑÆ¡ò¹j,&:A2p¡0ýò=&m 8ÁÔiõì§að£Yw ƒEÂø¸AF!ÂbO³9902œéA¦Z*aHAë¢Ç„Q}ýE;š&±Dh†ž©!eI’s4š:õ'ØŒgÊ ®‰$l`ÄY¶áµ/gÇn´AD{ŸArl²õ"^e$L¾¢„žc.¹ž‰‘±£Û¯}²¨#¾×’‡°ÃîLù«È‹¼Î¢ÃÛ¥‡'¸˜ æ*>’† ZºkRÊË—U|ˆPa^ä‡òÄá³h·L]²¯’÷ú2~OàvÜ q°kTí7Å#hÛ¨Zö5¹!úQÿ@¤˜–êê ñ8,ªînx´2Hœ"0w?4°@ Õ]ŠÆ¤mED•Ô}xƒ C>l]`ô`+á‡}Pq¶g-a nq\DŒÌ8ÈjBåÞÄG|RÌY2 QîCíÖ±ï÷šÍ§Û°È0sŸú…ñKï˜9P€@÷’¦¢µ G7ò¸ƒkGŸ¿'µåèÓüÉÖV\%¨nI(c®SöyhUŽûCE[³âÛŒÞÿœŒÔ´¡bm‘Ló#WƒÌêS ZHø¦.-µÓ¿ÔåÑ…•ÄýÓc'j¡TÃþgålxñõO ž§¶©ˆ3f–{™D¦0¯ÖÜ;ÏѶSV‚|¿ãÑ+»ȼù•¨Þú›ÿú.SxÐ9 Uz¾»˜÷Pò?üR®.|7]JÞ䊺"¯`»¶àÓóŠð:œËN‘îŠ)ò™f÷Ÿ³.É+ŽÔÉ”m>‚‡¥[«à(ÆÈ—²kjϸÝJ.àÕú8ªÍ~ì¹sßE3KMvœex4`X³A=M{>È;æ¤oÅ—¡:6­BY•E‚>¬ÒÑ3°ŒXÔT^xy¼³YCÂ1gCÃuìD›© 9¼ÈâfÙ5*Â@€¥Kh2ÁBÛÙØ7]hb‚«ÃöƒO±úRâä*a#+»NváÅMayXàWë'è%-o²=`©£š`²N­ïÉŠFjÒ}Øps<÷¹}Æ"†qÚxa`qÄl`Iƒæ 0ÞÛdEí‘lq¬ l%O°”¬S–Nã}êÔÛ5±ñÛ)™eZØ~̨|Ô/"U=´š'“Ǧ IeèF†¡Ê N Å@åÕÛ&|+#fd†x‰¢RBðN£EíMîÕE(qcJm¶´ô ›PÕxBðZ f+ÑÂc0g‰*µnG¿ºèÜ:ÍÆ–vWnDÝÑ2ìž9%êò"ç«×ÛEªQh!üF®ôäLêøè{«hš×P ?÷{UK+Ë/[=-SÄ›:¸…Qü‹Äsðöb£'ЛÇ”d¬3ç³,ÙßNch_bzB\ SÎ~·ÀF{‡âBÞ‰[ÀòÓtb.ʇj†%ÊN ©Ú¬Íq„Ìüãè dËù,mDVò?ü°ö»' jÙmÊ(]“cYY§OZ7£Òj‘RM«ÅÐX²g?,ˆ„|ï~1%õ¦üü© }F|q8 W`ò±Ð†'ÂTrUÔnã¶IÂoD¨¶Š4|÷Ã*Àô=”#RïKR‰œ ıH~}ºCÙÕ\•§g%²¹˜hr<¹!l¦¡hµ§fŸpäíýšW¨(0ð¹þ*²@\1ˆì×Òu£YiM9ì¼Î(d³öEfÈO“˜O*Áì:!δax‚ºêÏ–·M^å‹á/î1|7ïÚ D[òÔ5c7RZX,ØPxËÇÄèdjLä·°ÈNbW:LË®^Ñãqšë†í…—Á‡ÙœR„8qIÄÒsŒ©ŒtÀ•B‹ÎöæE|£ÅÓJ³Ê;bµN‡{4nŽÆ·àÐLš™BX^ì}ÕÓ+Ö«£à´T?²]t+«3–¨ÝPf¢W·ýeç–8œ†C‘¯j&ñš¾–!àƒL78y²ãQ@úŸ^NÅúí´7NÖ*6|‹Ü`cæÈ^€É÷|sp£ÁÏY¢ $x7f…ÐÄ Ùe¿úÃÚæ0e4ä o·Íbíюù³£""ˉýâ 5kº¼¶ï+õ[¸¥ÌD¼þóÞ™<}ú;ý¶G«‘ë>„)ôÓ>8c×;\‹“7›€¾g/”c{õM9(ã0µ¿MJ;ÝÔ)úæ\ˆ¾ñ@©ÁÜŸa+Ÿïš$h¡¾:ü|5Pžr®e-´2û\Ðä‡jôâJf‡ÎÝ(¢r¥â슀¼žz1`©ð¢¦lK­hï_9[EoîÉž=6’é­4凘Zí"¥Ù ™5¹7¦¦oî*˜M~€s@pÃõäUó©0ÿ¥X °¡ÄG%F ¸!$!§I'•ªåÔ{¶§€fÂæÞ(óW·]ŒÚÉš¬Z†æ™ ÷l†û!ÐÊšÍ8®2ÎëÑ IÕ€V½óž\Øóèo+/~@¸]Ê FÁ„¢XºšÚrƒ¹@GRåfÌQ|ñrÔ²Á>EwÉ41:bâÝ´' °¥#LèìµëV½ŸµËJ"Ôá8¸K"dÜd.&¢BÜo–2D‚œÆ!¦‘Ê©Ìþ±‡léÄÕ-`×C 8#E9ŸdŽ}‹å}¬„ÎÌev-¹Ý1B‰TKz`¡ƒ÷‘[cxfÍ“öÚŒºãny)Á¦rf'qºL;uê¼ò«å(­¹¼ü!µk¢­M3ŽºÒ뎼åã#j‘é#X‚Ȳ{Çm,Yjð{ÐÖ™øÿªp­AR-M†Ü‚ÏVv6µŸeBö‹u[í¢5P X ^ƒ”u4f&y´æšx¡öò´¨!Dý‰ºt†T!ø¬¢·ì 6·Q‚‰¡ycÇgôþ ¹\–A„"q·Åß?â òI?ɱ’ôö<ãeíÈÜÜ÷+˧ä'ðÍ‚rÞ? XÏ¥5QÈ>“"OHr .T7FÁ'ä$?Ë|»pØSR¦œ„Héf·,¿Î›¢ËAõZKKPM\Ý z¤u³ŽR–“g‰›UfâÍ]€õgäxq4U¼ÚîDSrä•åë‡)êÚæímÓý{¹Ä/Záìêù:®*·®'g€³ÔXÁ’Š<60•[ɸ%ƒ‡qíÄŒ‚ð<7BúòÞ&uŸ¸±}µû‰eIY]‡Å!WkJ)»RŽ2ÕŽ/ÈZGÇÇœŸòíÛéà”šª@Ró“(ðüû7"ôä%.¢ŸKxÎ([eV©WUÐ@üãT€€ZÅÖБ`5ÊOYzŽ·ÃR×X4”޽5ÊÿÀjßï­ê}“DÚÚ¸%Ö"8ã`é»ì¼áÎÉ„ç$Îê¿’i8J=?ÿ@0¾>ªï,OÇ0dA,Ëd·t@:©~—)½/¢.St ¯"× |n”ÄÇFM’ƒ1°œþpùz}?£vsf°e*‡äéH¦ëóµÈ¿"àM~Ã[IÄ}!,(r5ŽÅéf#éFÙã0ñ†SдT¥C“…«ˆÙŃfâ6cÊ´.šùäV^²9²kh^? Û’·H á ýâ²pý˜ºÌPá«t±‰§=1ž#„UçÈÌQd Ã!NŒU‹|fmÊGpo'ˆ°ÉÚQtá()×LÂh±\=YêÃPtC7œLU~1î»5.rž_:p‡Î\~EW3÷Õ¬§'öÛ™ñI‡NÃ.fÓfÖÑø›ÎÆ)7\Íç=ȪwZT CË|IËçP—ÀEVëï·*^iüƒ :'a“+9{XFñÌa7é Þ\}$7À!­ðìù)óN½[$ñ;Ü©ÙPpÉüÚóG‚Õ€’6ë6TÄ•Ëià¦L—ÿs^°XTÍiKXAm¦\ޱ!uÁÖØö̸¬w4UÊC‘V¯_[EyÉÌb??}°@²…σ+Ý€àY•Tžtï>l‚‚Ñ´-¬'ú±]iª§Ü‰VØåPJéký×ÛšÔ»|°î{’®ììE{u„ÔaEýŒPGlޑӽ47!ÝéÀŒFõVªÛÛÒœl`s,¤ýHÔ—=DðµÁ§iYu2…´†¡£Öƒ0ˆú¦´Y}& 5^÷÷cy0â8¥.Fˆkv¸)ÝÚoÊèâ(³àG¯Œ“ËÐN¢Ñ¥%¦§Y;UÅ!äÏŠ¬ù(°/-Ãö·Ýþ5LEuØf™$Ú°»ì¯¦¸Œv´-ËîÄý‡ïôŽ<£Û õmº cMеc~IÿyÐaue%—`1í¯/êpŽ{ù˜vFÃ|f^vÏ£Â&•bƒKx7פ2,øeƾ½¾¾\Ÿ–ŠÞ6~ÏÌz‡®½ìhº>éo•H`–y8”€ /NCC]ƒr¨DÑ,úzyÀrrå6mù%*u!ƒ¶3ÀpÒ¼&`ä²Uû×H9ä§ÏÒ ‚>T¨Ž'gï›[¿=žŠd=7ì÷×z¤(U·ƒ´–IéÚ2ÄXéaê-m‚ÙH¥WrXƒEÐ8ÔzØŒžgj‹'‡Š0¶ºÊ ¤.³tI6 Uå„¶Î:H²3­/9dÁ,6U<ÜS ¢ S.M¸¸dôÐÊÎPà ×±!‹¸xå“<Í6‚|²ŒÜIæÚyÕZ@¥P¤ê ©×ßÅÈ{ŒVó/ÃÖOe‘!uïR”B9,kî©"/bˆœ®£ÊÁé£WY¯ÝhÏû([ÅkD-‡ZE9–DQX¸´ì¤G¢+’›Áo¨a“(ü#F¼oŹ-´ Óbä¨TÕ÷sd´Å’1•—óÉ4ÈÁP0P^ay*ÐHôš«ŒÞÔLX7b͸/vU´‹}n~‹BÀ|¹VL+õAÃ>nÔ’÷)~ ï1½·"².Eä¼byß /w¯]'®Ý4Má+Û‚ÿÏzoAŸuÂIw—c^òäÆìMb'qÐÔŒÕÚ s(¿Ûɶ b¸=uR¦´ÙåÜað ¡Nµá¬Uµ?ðta+ˆ™Ü©F¨¥xÞ7Ult…ó9ã§ !AU¿O¯¼¤X‰ËF´XÊ0àŒf…/×], z2'a@F-š2QÄØ~tô‹âGÊœØ,úØ?…“MÕy–,7¹Â_µß8˜jÄU§Q$š,tÔ*ÍÙ™ÄužJyãìçÆüC ~>dåöiïËUoòSÛF=×k¯2Ï#œ‡ßò£²&ýÛú³è ÙR÷¢áh¢ÜyåÛr[°Òs&,¢ä°I G›¶ –¼ƒ"MÕ„aƒýir=Š5|Òê =ÕµÂ(*d:Æ=´€Ïq\•tòv»ÙÐ9Ì$:Q4KðÒUäŽ+N¬šÖá ÌãÏ úƒR$5¥åéÕ± ‘Pô”s@^¦ëÚNààÕ8Âo¯NQ€Äè8l™däZ·~ËÓVþTn=Šëk^ʲò|Æ3²ïv£.èÿÏCÀ4â6!c_>\m,Ù"µ£0‘N¹óÈ78JÃ3УO&¯Éž9mµ¼ž,žÚƒW* àN€‘ö_”ré# _ žSiT ö2¥ž…RÔ£ˆÞö]¡³TË—&¬/Õ?•2Z¢Ò;ZfÝ/ùo¾¨sþDàdùÁ ´Rу.9p´‚u€¡ƒ§ˆÈÕmÐï dJÅ‚aòÜϹLú^,l& Bžæxšt{Ú Pv4,žoIÒÇhßI ]‹ÞhI´gúô; ½¢ ˜`1¼ áÙé<"~o…/©G»8àÅuó¯ò´örÿ\E+NºÃœî»®'Õs{ͽôÔëÐjåœX§|߬(¸Ýp´RÑùWD{Ð%5®&UÔ¬ cÏúÖÎIv4Nµ˜õ†Ì®„Ø•ÿ~±q¤ÍL‹Š²ÏƒŸ­uš'·Ö¬àkÖÙÍÓh³~ñmÀŽ4‘.1_›º§€áëŽW™pwØßª 237r—Syáò»‡ƒ×ΈRÔÕ7´cj‹êˆ•ÒÎß2Èó|×;ïöQpå¾ôÍèsb•ÿmP€–·š½©§Â?~wN)pY²düàOµ':ðTZn´%W00+Hž>R«yE?“ôý5wß½L±Ÿ:mæ|_úmoãùɃH¢Ë¨·MßïÈ{ûOó ü¼÷úëS4œe¸åg½_ŒúÚOÈ4?ð±—0…\³(¼¼ˆã¸ÈÈU½sŸ?V;ר]å~IŠóÞ¿®"»ª<á$®á\»‚¤Ûœ"V¯-2Xk™º¥™KÈ5_tA;A l xê²sø%)î¥_=+{«ƒÑ7fj<°‹?r íˆ=аBf¶&£5L|ݷ«ˆkšx‡8ð Ú:¹Ð'E›ˆXVrjaÁ?ˆ¤™v\Ðç:?ˆ“fº*ó¬ûÓî«ëo8¼ŒÐ<÷¥÷_5”¹§\'ìÅ ñÂE<“ü²”reôîQ˜£ÔBfe#™9Ó¿+ç—!Ú ¯Ô7{…ql˜#Ñ;/4/v4b›S‘r'–fmÚJÓŸ¿5! Ši˜gðS H-vÛN1CÊí¥G:Ø®†n’P¯ŠÙàÄ!€ÙöGª“Ù '–^ÂøŽ{I?þêÔ¾s ˆÖ'ì L®ã[‚‘‰ñ¤Ó7öP"mû!Ž…åî!‰ä*«JL ¿³ÇÇñ?ŠœÆ6wœS›AL•Þ¥¾kj%Ÿ†M!2ÔèI™#¿ |rà†ˆ0öÒˆºŸò|ë!´ÑÒÔ‹ëfZWHiÉ7ÆÙá+{ÿà(»»C49å‘§\(IhTÌ"zºon{JäÿŸZa ùv™Œ{:ú˜\Ý{ù°ÁÙ±~ùÇ_ ;¹©"÷‰'n/_4ùh%ùsöõÏ>Þ?{º œjó×¶I¿ËS¨  “¯¢‰a8ä^ÄQf“\ʳóôĹVeº/U!I|a‰ž˜fDSYj¥;>œÁ©ƒ´SZÁ9;@<hø$‰9Xl¤k±$–ŸͬO%¥‰SÄÈr)@¾Pòï^Œò_™ë>2;g’K !“°£ä]ó²~Ó s¬åÇÝ…”›Ô&Š ÞŠ•§óõÆþ`ëÌò y*iÈ=cí¬OÐáGÙåî©‹Œø…fëXèšÄ‹k=ÙÒŠçó·ºàj¶£_+ð¢ê {™ËÂvÙ—æ³8ðçP‰fiê›…Û€…·‘“?ÅÎp ¯½óÛ™÷•ßíà/Ô™º³¦ùÌÙq«¿¦N&ë3>?œkËÂßÑ›ú|c·:|ÓÆfæ.£§èÝ~³ðy¯§«h\ᦳ…D‡û hO3¯ÕÃß_O±ŠI°‰ý:Ÿüý,%õ·†5 ã@eÍG¶†s—Ÿ?F-2ÙcÌM,¥Ïw U×TpM¹Ð“g¬¶wwb÷È øæ)˜>—,ý90!„­yl¶Â_¶7W’hmFrMw0×wíþ2w¦úŸÞAÄ9ôþ¢Îj2 Ó>æà(#Цí(—ï‡Ü¤5Ù«É€ÌúˆhÃkod@]…åŠIsmƒÈÒ>Š÷p¡7‘{»\f~+Sw:MP Ó)i×MuÓÜRd$ã÷3×0Ä8’`ú‹â.¯Ûì¢7Ð_‰µøO=+.ÙmMsè} Z÷æ+6WVCÃÇRÀ\Ý—< δ¦š ˜Ø[íjÕO†B7÷êvÑ'tRÙþ™q¹qf¬˜è´Ž Â$ÿ=P5¼¸gÙÍvvÚº.>äï!ëà´g!ÒRмï±EÔ=þsžÂ„¶eÛš{æ¸j›iç>á^ˆ~þÆ*öÿ;Æô8qæ(üó|at jO3“  `S§[ІM•-ÒëÉ€ôì¼ $œCшxÿÃh»ôtª†Î‡‡•Hë¿Ç¬KéWßõ¾ØíÖ¨õ¨z>A°þzø4ïð¯({ÕûŒ’µý³{KE°B¶j“œ:E_ `/>½e®àÀþ¡!üð<P`cà*><€ |Ž?kíÞ—Ì ÇÊU¡þå·/ysŽAQ$KQÒÐ÷ºí§4øVi?–ÑgÓïNŸ–%ßÊÁ0GåäK{( ü*ˆòW[/¯èåh*ç O™ø—ŽÖçÛOÃQ %ƒÚDÙåÍ åžÃ0+~Y¹ÂÆõ‹ †–“Hï7òþHÛØFÇb&½Éá/üT¸¾N(Ü ‹ñĺùüŽ/³ßÓON\o!œ~M§B¨jW_qcL—ð³ ë7³„Ô–lpuðêëÖMG<ê2a,ó‚©–=KûÓàðŽžb³b±;e¿°ûóûþyQs×÷½[çøo/kôÏ?s…:ÁÊSb¶©# ±-↟8-œ¼7Ö>Ü­›Xè·Á8£ù*!Xi³eù6Ø–5ðÓ¾û½Àð*% ÝBCEDyWÖãò÷ô:¤ÿ@5åKç:Žõ‘?p»¢Êey„;»,שIÙaÿ}Ÿ½Í´ÎÝ àË(U24r)ÌæAùÏ¢~ö·kº,„ß6ùô8ä ¨{µ£Mü¤øÐÂÙêuzüÙ¹ ®_ÖÚ&—Ĺ.{¬%×}“¦Ý!Ð\øfÖ[Gç6èÇ>ï4åI–@©jãߨâe ‹æ•"®Ñ\Ê7ã!þbd³¡úñðò¸miªX_=¢o¯öûÁ­Ž¥Fcäõ,7úïñ/¢)ºÀãeþÀžEu=îµø©¶q“¼–|Ãô%xÍÞ®F¢Z*¢[ŽóÜ£·ãL7Œè×yú}ßyIÞº#œØ “!Ýáý/öýï-mâ¿véS{ʤr?Ãgtà_ët†ß…]£ª}¼3(T¿ž-çô7ïtO}àœ‹Ü~çŠ÷gœ^) hOµÝou¬ê|y²§óù0”dΜð æÁÊuÑΫ{Þ篻bÇ‹?|®HÚÐ~c¼“¾`¼æVJ´Ÿvû½°™8o—Ð䩤Ãþm|—ls÷{èÄ`þï ?ØyãŸæóÅÌFplñÊñÎ8G¹G©SÚ(Ë:óÍI…2³-ÒR4‚…x¢ÿSøÙ‘ÙM(WŠ]©J;ü=/ûGÇ ¥·Íåáb(rVàæ#JKÉG_ËìÍÙ! 95$f± œÓëËóå¾ÈÑÏ^'-4ö .@£NX3rD]Û?Oy­kÉQÒùûŠ®‡OúÍ÷ÄûÁñ=µ1°O|šP.ž©‡Šµ÷ÂÀ=cÚ±(¨M\Ìþ='–俈ia¡OÐ,Æ ˆŽòø:¡ýÔ:†½“€ƒïo—ëpê[Â>ç9;?&oL¡ùöà È-¨ûk.£8!RÒBHÚ/±Ño*M3m‘öºÀ¢2icíW°%õ÷7qNáÏÅÕ|Œ÷–PÅþ…9½5ïǨjLM0INrF0G§%ìD­üœB8ÛvƗȱdµ[´#iš×á‰ÃQÒÑúþš ÷SÈ_¼Lžþûg=…nq8H3ˆ@UjLó9÷;Ô†ºFƒ¯ÍÉ´Üžô³Ú£+–¿ç#Ú_‡†ª»w©†*Åra[ñÔœˆÜAª”_ \8|ƒ"8Ó'/Añ¬ÎÂ:ÐÙ¦…Ö~Õ¢m 4óKlj>Søcîgσ¿–vW~3§î™õØÕõããö¢Ý—*y3°ŒˆmMˆ›õÍð -K¾Èà]Éõ~ðÓ{!å{[Ö–`Ѳ””OÞì‰7F:3{ ŽlQo|Zò*R‹Áwñ¿]¯p½ E- Þ³ßy®ãi·=ÑŒƒfÈüÔÃ‘ÒØÃ'X4Ƹg[.S«ò d°+)€ªuj2¢k\Œ|w’~m”¬ 5NÀ×`Í“s+.ÒŠ32^Û ‘«6myªˆÄ’YF¼O±Ã­”‚JEõ5.NØ›o˜ÜÙön¼‰q“ÑsòªÞá<&[“-l÷)9qà’i ~Îlhem4œ;Ô¯¦Z›*ýJ^2ÐÓ µ}SÏ`Ã*ŹùöóËYKPÍ“áø)[­vðœn[Êú• 9}z¶Ð<`)äÃe¿Ÿa–›Ù Á_(¢+Ø+¾cÄ$fw2¬ÊÚ—AÉc WšáÑ^“?]T](šT¿.}b§>ýyì[%Aê {=ræ~9¸y>ÛQyŽyO(jÄm÷õwO.ÉÔ>-n…xÊ,p)$·ê‡4®K€hˆïìŽNà¹òc>±êfà—ü$v-"'¶q@ËÏÁº19´Öu¯a3«âÛ»B"a»ˆwùŸ™_3qË~Ûf‡Ÿí–×ЪÓ`’ƒ–«üØÂ«º"L1‡k .R¤ÉœƒÁDªŠÑ»s{–1·ãZÞÁ 2o3Zƒƒˆ rS)^2PŠ«¸5`,¶[D4öƒÁ—›£÷ކô_äKÚ4°ýI¾…ÀÚi;>ó¹J âc¼èð…ÔÍ8´¥óå/Açfš÷ñ|,ª5Ê @:HÚ_×úigÍ(=…57ĵª³ïˆílqjMdF$è1é×¼!æÑM‚JŽsÇ$ù'NÑyÝøC 3}Ù9v9Ì‘ hAÕûAZi„KDî©Ï©òy6p~OŸ§cæ!9Þ™m˜nIÁWc'=VàßתłòW@LL˜q®<Ì{;êØŒr¨tœÄÑÚXö¹ÑTó{ E«±³ƒ°EfÎó²[YŠG¶YÁQIÉ€mõKQžyú«}³Ã &ÆQ*!éKU©r"³@Iþ ³¡È6Ú<*|c®ö²ÑAEóZ=¨xfB³xg¦ˆÈèýO1Z´3 þÀbùý³_YV÷ïÊò{mm—ÂrËvªgTH%)ãÎïhOúÅ ÈÌ~f¦Þɤ#6eŽ3t0JÌQöûÿ}¦õÚ–Òl§¦´ŽiÃY×=õtÿwž·"­™>Àú°­€ßÐF‚‡ ~¼Ýv’¶Ô表ƒ°Í;]&´æï†ý»HÎÂкäƒ*ÛOõ³ùo¶v*2Ûf·:‹=‰/77àÖÉ a¤-øÆKaåkö3á=÷;u²m-º,DByáæ–ñ ¤¦d³;à¯Dð­•Ä–ËÝÌ}£Ag€Æ U*ó§&s/ýgÉÍ:¯ER9šÿC)reAÞ4Tl:„i‡x¨y§´$¤ÊÀY‡qaI¥ZJ«´èw š£Iƒ9MêHS%[ì–r $üw&f\óçùñ—‘Í(¾Ãù 4PEw^+WE«Ù‡ä}4ÍlÂ8tu©0‚&Â(T¤÷­¦, ÈÄA‡‡5O¼E3íÝ¿´ÉÈn~©”|)döh‡âØž{hÉ\‰ŽOx˜$sÈ‚‘£s4¢™‚K”݇›Qá2z_@dò#~ì_8µÏýÔnëØ³R­¡öÑWr´ª¢Ú[!b-´º‰¤¢ÕŸ“0´3æ ‹[˜0bÒ§†ßç^I žsòìs+OSÖRÐöT™%Ð0ÈXVjºYDõ8­Ì[v®ûÍZŒnËqJIJÏX¢OŽ÷ä‡V9bhw>ׯ*uš®¿*ˆ"Þ¾ÌÐÊMènAL9ýƒÜÛ¶:é¡-Sð¤_EVÚÊðŒ¤lHQl"ÁHçÏ[ÁâùdœÇ:7o@kEÇ2›KÒ'1ÿAš V7ƒ2T·G‚f? Ãsl*üN糈—dh?É¡©nÌÞ4É@´·=³s%ÈæöÈÏ^¬érˆ§Å¡žùpô¯‡Ä^7îe¸šþ±ËF¯tî"lÁËÕ<çà&º"•·9 #ĸ7>.¦!+$4ÔµQÜèÆ¬ WA59eè^]r;ˈ.@ë yðÀ_tk ž„½ûì9»E‹åÕ¢ øYÍ‘äksŸÖШy¥Î©ù!-}“{h{^z VìýÙÜìºc„h%YÍ•=N¤¿£D¦ž—§"Ç€½ý"šJ…2,¡²Oïú9ëCñ$Qo$ìê7Ü`î$Ïÿ%³+‘yþMö;æª5̤¤½Ä‰øYjô „W£ £`^P©ç6(š×5g“Í{Ö¢ô½¬+KsÐË uú˜|yã=¿u³|µ·†p\{9 íÏ0æƒøóºÔZ°dÊϨݽÙ6„^Û¤ ÕÙ¿€a;tÒuÀAW™ž¦‹‚,pù[7Ÿ0hW HJŽ—6I:‚oñ•âÃÅ<¾j~…˜‡)}u›OŸÑ½ª6Z¸šûã$æ:IsIrÍ͈õ6Š˜ùç·Ë’F7¸ìy°Å4u/G¡ŒG¾”¨¦¦ÈB7w!ôü@§Âœ‚¸Ïd§0e;­éEÜ7èþ:w‘Ìo«ê½m2–ïQF­|„‹¯³Ž3 b³bõS†^¾C h’‘¡ŽÕ™5BXQt<»ÚÞ2`¾uyylmeSho®³Ÿ<cô„‡W§ƒ 0A|܃U¿ÉÄ­®EcWX ™µi oòéq¤:,¹Ï@¤M%_^(å)ŽaŸ:¬3*d;!©à µ%óh#‘X–óHïÄ'çëjøðû­äUÂwü,¤.ª ÛŸØ]¶ð+·ü¶ÏžMà$ÄÑœ¡+`çßθÌN/`©Õq`MjC²„Œ(}÷ùËûˆO»!Ø]Ÿw“ËW¹Lþ/‚êÎøKâ'¹†Á3ñÇè1_ :Ú¾2kSÏí”y\:òç®WQ¢õưî8% ¥ ×tEŠ*ĬÅðÄ5áwoØ1ó[¼n ìëœûÂD ”FÙ`/Cê%¬<èd’Ò NA;üCœq ÜDzJ¾lªñ¥Õ<ÿ‚¶#ÃK78B‡k,_?Ó³Fé ëi/Œ°D¤tÿè(áÕ\+=w€"Ê¢5hûœC €›`=9˜YÑ?µžÜ‘Ñ\ïjàXä.@•b\n-¥éE%elÔ-+VÌÈNl ɰýõ×bRqX YlvJ¹m€-¸cÁªûÙ•\v{8¥Kd¨«|ìÀ™È­¿|E‹ù LR:ëYé—m®{;Mâ‘q˜+é=}²½C„ „.îdÞ1zY7œ9™¯¬Ùd$\À’¨ F^Òf§”sœÙ(v [×i4ZÔP#7Þ8‡“ómè¿0@p¯\òоÛPò¯1KòBÛ× "B‹À%§ª¡Ö¹‘Ù€tbÁÞ9Þ_xù¬Rǃp¼9³4¨Ï0PR‹~ 7Ù¦91*™LçúÒ'R‡ðɾdÑz¦ÆI2:¹jÐUÁ÷žÝÀ+Tæ«tª"G^F¶£TÊ¡eiÚ I¼Ø‹B« ÁÓîÔA”ÐîñŒ~Ϊ›ÅÍñ¶#¨P’ôn¦©´µfD©IÜÒ{œBãìX”Ùº™…cþS>S­!ƒ–“\F'ÇSΕ¦Ì S¢K°Q€w^èíÚü÷9Vø¨ÎM_B¡¥OQìÞаw¬ÌM!¤‹"&–léäWš× U²`ÁؘÒÕHl5Ä&)3A)üfT3QÀY+xÝ?Mÿ@gÂ6G¨þâÒeî§ñ èFõytú£¶ü ¼Ö,è9+u4ï#O]èÈq <+«Ó±nw‘Á1ÄÆ$”èÙ˜9 Ä€Å+Þ&Ùh4œì±P,ï[ %IÄÑîH_®7»©A¬–2²Y¯%·†'sÆ v1ûivÏðæuãÔO¿MP?憒Íëöª•}“QJV”ï˜L z«Æ…Q«³Y&ÃÔzé­}ké%žsÅçq ¼cцa¿öŠGSá솉7k‚„ŠôBÞÖKƆóQâñZ¨¿&µùIƒ¥å 4ø`!P£tî¤ÜþÄ*–·æÇ§¬Ò¡õ ÒߘOC%„¡›QÝ(n➇oa´‘aA@TcÓnOR¬¢½AS‡}uC*üg9LÕV5 èž„P›¹Uxìú ßtÜ·…0)ªu>dö&#ª§Ci²ÂØ‘JoìuŒžƒ'wÑè«f‹Üœ56Å;§t½÷ÜJ2]]trÛ½Æ2eÛU„Ô*Bb“ÁK«÷ˆ‚E»A'±¬««(D–´ ªDËáÐ×t2bO·ó  "=‹EØT[…»ìb»´GaèÁ ó2‡&®.š´tP¶Œ±«E„c¤&ýæ­å¢Ò£ÓÞÈ®:àXÝÃĪÁïÞ‡<+"L|_7yP¥ sÐüƸ=W†X•ÚL±ü—D§ywÖŒun@ÐΘ.2¤ôŠ‚ê¨ê#Ã#ƒ_ú¥g&àÃÖð’˜,Ý\þ_­éj†I;žV%ú2 ƒ)£˜tdòMÞ*2QYùþ:ôÿƒÈøéùƒ´ŒŒò±+®*|DUðN½ª®Ùí8œ~%;dy:=Èrj¥ÝR?£Ÿ8°gFâ6”¾_² ‘!¾9y²Éh| ò麜Y6#Ï_¸@¾½.¥jáÝ`ëkÂá8˶;ÛçÅê©F­®3Ö(H—ÍON+Þ%’9eÃð‰;3ͼbÃD¥ I‰•pfÅCQ÷°ƒØUœû ™À픓ñÿ’ÓÃÌÛjn4\ÍÌ”ry[?Q®}Ù°È ]Ò¼úϕ܇[bi$<ˆðíiê+”=x‘×þŠ‹Êø|1èrRq.µŒÐƒ·Þ¾™B“h¤vêqS§O¤üÍeÇiг¾5t•;Ö¯õŸ\—28PݵQ* %˜]W\õ¹#ºÊþµ[‚¹$ÿ ,±8šP™JàuÁrŸ³“h~W ·¡ø„9»xÐ*¡Ž×ù†É4­º¯ O+›ö›kC_û=—U¹ërz⛾­„´ŠéoUkë­¾r\´jé>%}…C ˜’3µý“lO.7 ·ÑàØß€k½;üÌó.l˜§iϼçt1!$Æ“TT| 0\âÁ‡obª5I ­ˆtÆÿKÈЖd~9‹‘,˜Æi„sJãeSSé³fˆèô7¹·’Uö±¢¹ê ƦXc©¿ˆt Y0ñ¥ƒsÏ«‘L(sܲBUÇÆjÚ6š6pÖ='ˆ‹iWçTš ›WBNê.”ÒNûsaHŒºùËõe¹v.êþw!ìnFiÈ^™;.s^ Êïn]îÚmV²Š…XQ €B—^ o(²›â*oBJaèÃ-¹¬fM€‘vÞ©f}—(È=ŽÃCß±õ.gRsº—$åY•”~㛸ÏzïINL{쟽R´´î8N"¶W7áçiï¼±Žn Ã8j¸@}Nè9@þ]ó mµ™3ÃÆ y d­F…FÁ+JB­bõ·Á®ýÚ«²¦/7ô¹,ÚâKdùsb—Ô©Q¼ONˆþaáœaèE¶D«Mõ¹q»xá|–é²Ü!/= ¨8È}4ÎM¢rcœ¬zW–†o]·xûLzr´œ{ÛŽÀ%á¦ò)±OùM€66¢hÕK´®B÷oO3ù”dèòçôð±×)pþ!¹ðÜA€‰ê}¡CÍoCØj]¦ÏëÃ;À¶I¸»¾ÅBN ®ÆŸ>TðŽÇ¨w„mI(m†ø‘\ÝÞ?5ïöYRê§U³Åª´Fe:9žñzX#_L©²øéõ¤GEÀî;jã½ ]©!Äg”B+÷ÆýÝz­â=V¥ ž~µY ‘veìˆ×ÙŽ…a ›žŸ{oEçØ{þ‹ž‹Ÿ‹ÇBb›Ïf“ôí³žßlëëï^’2#øZ8b†Žò{‡¾’vŽäZ#×Àa5CWÎýâð‹×‘ê+£–8û×U©`½-”Ñy@Hfë±X²]Þ+´Üq<¡½”k:Æœ¬Ðjt=ØŒv¹ýçõš]ÔÈ 'lù ­Þ’æÉv>œ“šÀhx¸Æ­yUÀ&·ô·´ v'¢Vƒæ§›>bñàãpÑ _j 4hŒ¶„ŠØû füV²:±äÄ¢Í PÑün‘‘ê0?`àX8˜%Èüsˆ÷ ·Ø¸ôTe®·":øù†¨ÛAå2!S¾dfeÈBõ×#ð÷ß_9;£ÇaÊ6<¡—/ès=í¯gÌä{ÿ[[ dñëÁ„¡Ç•5Aúo!„7´óo·ßÜw‘¿_šP–ŽNä ì µÞÌ™ÖTFö¢øµ ý·4”YaV«ê;Êå ÃqxÅ•×ú%§t@„£àêE1ª3Ä$a_òm·Ú$?\Nú¸šlˆn(JY¯çGâ'úr:ƒCE){Ô}e䂤8O¼@îPÍß}ÝÓù¤Vª5†jj©ùÄ·«×nT GuLC-Põw®.žÝÔZÉ R:šÄq `T‚åï¯+Åj· ù¿…Åã…9†–£ñfÐëÿKaHÝ Á±ÉG6Ö­a÷4èdOz­’È9·Å“ÇŽ¹Ùju|NTû¨)nºõ)¾Áù;JåX>ý/ÁJº9 &éJQι·›Xê3`¾,/*ñ7ò$Ù—#¬0²€)‚ÍlCÓ#rÅ]wÖ©Ô¼Åk>èÞÂ^ödïQœ”í€j³DVƒT^dö_Qo®¨D™/"¼µÀ^A¦­$<’€ýðb†£!íåß¿U€<*?†åþ/NC–¬Î²w¿“UX€·=,há¢M†Ç«õ T‚¾Lƒ¥cèI6Æ¡sÈѰ”nÌŽ;˜ñmv J¨<ºH' m}ôɹ¥æu>‚ˆÊ6ý„ŽP hï:=-ª9ØGÑáÐ÷ë[€/Zö [ä;w ük-o‹®ÇÝöP1ˆÕ†¤d0”ôJJö¨j0:i@TÕ}úÆ GÇ;ü^I¢ ½,·Ü=ê¨æ2Ì!žÚ\ŠÒ^>±,pœAo¦ÚBÉsà<¹“mi23oäF{5!vrÌÊêªóT-‘÷H¢PÊÒÉÁð&¥|Jʧy¥ëp*J;Þ*(¿ìr/’€ÔüRÍÅÅÃÒµ*8ÈDÐ ¥‡Øpm…,œÇW™í ÓÜñŸJ+ÖÌXÓÙæmuexž6È[˜âЙñ¨Dy c Š#¨ì×užïËib!p˜Îãmo`ˆÇ¨õ³+ú{õm WA’¥*]Ll%w‡Ä»¼ˆÖ2…t³Å„54Nf¦røÃü?º˜N[¸@ËÕy/i#dlŠ&ñž†º_e °ßj‚Ü!þÖ²íórø?wÍsê_l:¾!i¶£%äeh©} "lýQ¹êFÙÄ'òö™ˆžþ ™ç’ûW¢M{p8Bt>å³…fâ©Ó18NÅ9j© ª[4Œ‚Æ ç ?¸3Y±‘{jº5"„j¯Éô¾òºÛ"nàå€.#¡­Ê3 à">\œ3ŸôÛÎŽ:Á TnuE"B°Ö>Í´‘(ã¡@Ÿgäö1/¶”¨~žž[§^Ù Ýä|>ɵà]†iÉ¿Ø/Pr6^ÇwdN“,쮦\¬äÔ6ÖŽEže W*Zuî+@÷²ˆ3œ€X‹Ocˆ«uÅÏ1BÂ>Jz{ª.Ø”ÝÜ?+¼ˆÎ kùÐäl3éaÜ™0„Õ·š:h$Ãu¿[w\Ëü*¥6±xk„‹“Çù8ôaø‡V§ö^Læ "ãk±zòuw̉?@an÷äÞ¢Âa5P2¡nµZIÈZdÖ¯ßz(,k@˜'‡ IÚu¶/g#¤ŽeKÎÎ \ýW!Žä2­ÔU™Pq^»©"AýkÖ?}DO­cI:'ö j+ɤÈÈï¾Ðê¸f‘³9u"-v4¶‹¶GB[ÊnÛ<‘X#XæS‚’š‚íØÌ¼eÍX'¤(HËËo~‘ðiµuÛÜOSÒÄJ¡ö1K!1?ÉܬÖg§ùÿ ZSs%]¬–vp3Á}¹zã8ýœì5Ìjn±“\G¤{ôŠ&ˆ+½å$¯¹ÀQÉ~3¸°hšÂ&ê©ÊZ²ã³›ÆJß3eqå_§ù3ÇÉ'¯TŒ¨»MZêáåÄÂßC­ŒGí¯d볡‡bPƒX,ÊO4E†S¬_3¸9\Ô¿s;²Æoè“]5“\hê½¢œrf™ ŸP…”»­T(Åq¨ÞEe1ÛÓE¾È?–U£œÿ<„ËÕë.:›+5ö ²j®{i$–¯kíLÍUi¥Õ\Ï-¨ü&a×Á]8/_›®Š~s ±; ˜8Xyl­wÔZê–òÑ4u'9p:žrJåÀ¬­$î³ /×Ù cm$5Òé|Ô[3‹ ðâkÌ<|÷hÔ†)v`ãË.û¾8JZ1²âmQ äôB¼šC wŒañfQÇDm»‰[àèâ[šð3]ÈK û €ï´µ+®r}£FIÒè![ëK$úù&ЏïÉlNÌPXò>ifÚMVÜ-&¥ê’'%<¹øÙÅŽ©p5®F¬zË;(Fûªv¢#$Æå0C= 0¡€“ȬÀloÃg‚D‘uXWt?löºHÄÝ´–<§bŠhÙVáeé³Ö•&ñ8(—@Öû'øÂšKøéÉ»o"«Ú“®4ô Í—–KG7æÃþxféãäô7±sضVüì š˜æ úx0"5}ÙPîÕƒJÈ뚬§ìÐâ؈Üt„Õ±fà°/?|Ñfªs)DµÌÐç콟¦·•ƒÕÞº‰Ò~Ü]¬Oa²ß ¤í“npJ]®ò±l3$¿veÞ5¤šéK’öH[¯WCÑ¡4×@ ™1U5M«®’^§ø|gjó0Ú÷»ø!sF\Ü˫䨳‘ùdj;6þ𺸩'©¶r@.[C‹°q6y¥×S“—׬ôËœŸxòÄüuô?ßðìÄŠÈ ]N.â7Tkæ¸GN£ÀxsOÂ`·ô)Éä*”›ÚQNh`c+?ò-çˆbÇóJ9n‘_¦ð·qOoÞOu_ÄÛé>J¨²Í"¶ P?Ô£0 ÿ6>¾/Ƀ„ö7×k®øo0†3×U3üß•~[ÉäÔ\ 0@¶3/exÕ\› ’~/éð1ÇYÌK·Qìâf“û2‡ƒzº4S”×ászé/·Žáku.ÏäºÓTwÏšºBº€ÍÑð<ß*,^jmØ¢œ«¶È´ uï)™FxÅ›Ñ]öó'P±Þ ¢“!y98„É„b€}w%<Ø’€7qàbäi>ézI±ÔnƒþÌÈtà¤^“¾åbì,û¡“²"L}pù½å[¤#àRÖ\@óAîìÿ+! ÕLˆE ’ñªq)¦o,Å•â27hÍdžæJºñFÞIòÑŠ¢U‹Ý Ä…•‚šÅ¶ïw j%øÒŸ8]¡j…eìGbNü7«˜ì7Çk2•²isÀË¡–‹{< k"¡´X¯×LÁs±g*×½‚mSÝÛP–óÜ8Õ9’F3Dv‹;;‘®Z#u=^^Ùxµ(mY¶‰5ÜY\WãnÁsÀ"õPŒÍØâÔ¾L!ðŸÔÛ4îË›$Üd£›¥D³¦Š˜^aTÇÆP³ÕîUŸ§s8@wuAMNú(ð}„)ù¿ ¥]=r=k¦°%Á¾ëÆž@t:?Úš²ÚmÏÓUo¼ÿ?,deôÒB¶j¡ð¨;wÁø© ±GPàT)H eXA¸Jã4Oà9ãouIhl§€¢“ÀpŒg‘4õË k«_ÝC\Ý:—¡º’ Õfó…«~VáÙ‰`ÕsÁxhó‰¤3vÉø|Rÿ_q?û6É×±ŽðWŽ’Ë=1Ž¡âšfÕCz%Uh´¹ô$hŠÏZ¨Ôš*®©Îðnëì-üDÅ„ü—²Që_Ÿ—«_ÌBø'iÍ,øD@0@á½M5¸×éÃLχD¨\Åhìû6c$nÖŠÀËW©<È3W…G-§i^inÉu1+.Ul(ñéô^÷™ßòÛd;s¤7ÏMæ²íŽûÛÌÀ@»#TÿBßä¼;¢ Fýéᕦ ½¹“ q€[Ÿõ:ï0[HéÑ=Ùûž›vß+uBKs@Í(ÇÌÜ“EzÅ3„ÿXøý îÿ„Õé[œ%­/oxšîL9¼üN’FäÖ”Œ†[Ë?EQ:,h¤™}–B?€5=ÁjÂÿ(c†`•ù’ …¹P^Ó¯Y¡›§8ðS8ª·¢!©Dí %޹ «¡Q$(‚ ¨žÎuTHššŽ©]åQˆ1蜚Ä?Ô(ÈèO×¹qvÁå {)9¹ Nu¨Ódv©¹BÐdîFœXe›‡ýã½þÙ Tq*çFwíN¬6W#„P2òÓ–yÑ £@æePtFἄÆ[Цòc]°Îýͳ{ã7Ê&Í#õÛ4 Ëkw!œ Sõ®© ¾›Ý9e²¦5Í›èÚ ä%w¨†‹%È¢Øqk“ï©LA C&֩͸T‰î õ5¤e\iû[¶‘ǨdÚÌówÁL¬ÝC1nôÓç7}V S)3‰&ðÆÚ)8ÕÉbhÊ‹‡™ârcðxM†œó]xœ™ÉzEQ™ Æ›:^_ãÖVM^BÁœŠóŽÓœf¢Òk¡Îh¸’Ú$x è—éIè (úÏLw.TT'ÖŸ…¡FSø§{!mõ×! ÈJðCrÆ:àeê0ùÐaA÷¡ê.NI¶OfïăùúÙÐ3K­`4ݬœ’`\¤C1ˆ²Ëú3©t>hÍÉ›W­’tÃy5ç6Kk¦Z¦Ë'«½‘^ý3x¸ÉÐLî< B¤`ÛH¹ Ú§öùV3e;¡¡Ã \“½÷Á+”MQ —z"Ô~èë` oFe•žÃ†I˜„a¥¸Ò¨\ÝÑ’ÈúÏ&ÚJ÷™¡2fÅÿ²Ž4‰÷îcÙ?®ƒŒr–„ŸðÖ¦1g'Ž¿YŽ}÷U¨9¸xÎ\ŽÆxS¨¥r:æi +s°ÖEi€Ÿê¸ÙãéÑ m–Û0o”ÂOvt8»¶´Úž ®‘Ñç-‰MÖÎ ¼9¨™…mïì´%ŸââÞSÂ*oFfÇ„lañÇ üþº/=u{F;ŒeTÑ;hú /¸¹U {†—Û7Ùé wÂúÒéÒvj¬(†…6‹ÆS\­˜ ,ù¸|lƒ0fæ#z=Â÷'Ð*Î!Á}Z,2šÀÓ&.«”X£úä&9m1ŽÙs^Zc¶Ò\éIýX¡†ú±—Ýì`uL"lŽê°F ßB¯¡iÿv=Ve¼¾ÏeU€qüþ®ÝÌŠÀÊK€rX2ÐÏ0üúi:1«ßrÈç, f§ ÷´*Œš]WW‘VgE5∹{»ôu¢°ejùý†)™0°}Àôë¶QYõQã8%è¿=xMŠ§Ç¦SžÂ iþë™aÚ ÑVä °]Êœ:úµà+·›žÀ®«\ðå`p®·²Ô”éۧ˳jýÊ6÷É™ö¼V’_V‡ \C ½ñ-º¥¼Å…yvhï™ L¥(b€ÛP@ˆ‹Âˆ§ó=™Åº$ë_éÇ}‚c’;8*ÿ\´1ÄÕB(a;Ýsò…²OÙ• kÜIdHÁJÂ=ˆ‘Ì;E¿Ò(ÂúßÃ/´H®ü)œæjŽ…Øû°ø6SI.Êô+€ï×ÜMÏ—ïÜW7îØûÎ$Yæ1—<àáðû&éÙÌKµ^â]>‚Ü1»›;Í‹ÃÓT„“ï7ò|ÓEA„à‚®Ù‚·¼r<‹An—h䫯S=3 À¤´ƒöpû„«CÖÈoJ}›7Iš¦; Ðu³ 'W&–·W{ð(ê…°¨Çw:n•Á!>YûÌŠ¹Üƒ9 ®ê¨A fµ;ÆHÇx”.·`œõ {K v<º‰Gëoe3G‚¤!Fà çæDƒ0rbFQN¶ŽÓóS¥°Ú·µvœ"~Ü¡˜ ûA©FÚÑj ~¡:'œL]«S/\+qæÝcM¥Íû움AV”êä >pÞEiúþXœZà¤%ȱ»–#´n¤C_oÏ…†N#gq™ÑZ–Éã°YŪïnI† ØÎ^ëW¤qM]·|ÃŽÝk=]uÍÆ}&W9Oü½<Ô<øq’p&p‚§”oÍrÓ½a7@”´CO[µ¢Ð”øÐ.DFˆ¸C $@)˜0n5: $Úõm–#-ñJMþá™Ì½{s<¿:é¶è¡Ë¬V¢0VòîŒöPAS´Ù–Á‡™ƒ !«ÍÚ¼eËL1|:´ ØÜ ñö…£ô¼\Ã’×hH’ tõS«"e`÷`N¦B¹,"JöÐO»TQífÌ Þ}ÂÞ~ål;eAÃ:ÂÌð‰ô”KK£Ãñ–Ëá­jSm¾žü³¬ríEì|t¾ t•^^—ZtÏ3¨³js _±—5I±=‘Ç­F‡¿“+c„6ä\{óñkœÞ¾c}êìgBâŸÎN¦ÿrgʱOòŒt_5íñåíG*º¬UŠû²Td«˜}v†çµÍ&dØ©²6·sΓ‚_Lœ1­ú×(>ÿ:a´œè££„K”®²ÉÙ:ùô·±\ dÎcgíØ‚+ST‡áãðCyÏzäðQ( v¥ÑîA “_¹~—tΛªØÙGPΉmŒ8‡ˆ‘«‡¾nÐÄS€/A±™_>A„Ý‚¥+ ¸ à +„±ª°p€3Õ‰_­£–Ù`õ*r\ÂÓ8¦’† ï»Fqž„£ š`‘b¦gö"žmС¼´’‰,{€Œ×›²ž…ç[Äó®ý`ݹ‡®Œ×ÏŠ.ZÄ¢x`ÛUŠþÛª‘6äÏöiƺ|zk^ëjatIÚ¡_—GAÞ—¯GJÝ—™È,žåºÙ<6®÷f®fÞ4¿¾ÛÑ00¥’ì&S ¦ÑjŠ |¥’ö–\=Ky&;Z‰²¬Ö8û¬@"¡:·AÜùLX{B²Ò ¼Ÿ¼e¶s—r¸%B.æŒl†ÅóJqìÜ…šX$ì·QÏ+MúËl¾—ĺÌ_~X'hì’.ÍÛ4ƒ>pL  %©fÈñÞ‡åá¯nH¬çe•÷ÍrP®˜å çAÈüÙ&™¥BýôZùÔœ¸@ÚÔå¢3EH.öÊS$h` ,ÇèÔ(åY¤<JûÓ<ÛÀÜ–C‘o¨*´CP ¡/ ¹I/‡ëK¤þÄlܬúŠ¿«r ¸eÛvì…ÁúéyG{(‡UyŽö';8¯aýVœº0º3qäfÉ!\‰øW Ñ/„æÁS-é‘Ã) ;ý±¨Y8ÊÚ´ð–*ú\Æ5)áÚ‰Q‹ˆ4ÓÚó/šÔ ¨·Èϱ`1$_n®¨6 Y„4«Wàü/)÷¡·Tîý…§Ø‚™‘ã¯"\xè9õÁéN™ôÅRé ·ºO+óéß`c‘¬pÉMÌ“H=4¦:ƒû²ì•·¹]siIVR x‚Ògƒ×— ¾t²ݖé~z¶elç¡È‡’M¶Ëï%SdÊÇæŒ÷ä–ÏPÆæš`ÔáÔÅW\µä1EŠIÂ84­ˆ#ì¸FlÂr¼@6ojo¶‡`”¬×} ’…y~Ï¢xðyŒÒ.ZYzHª‘2Åá=EÌ%Ï}›ÿ½Ë ÖúО3´‚ 'ÞuªÎ­ N:žÎex ö寛Äܵú"4O<£ j>» ØÌXþ” £˜m¢®Rjý^ªì>fY[ 4KëfŠŸA-5^œ44nš$ÖÚ½v¨Ã 8‹I«*Æ}×*ËÀgOjÁqï‚1çŸSIªÂa«0ËIAíý+cס¸8}趬Gê¡¶¬F6HnÈB2Å/å¡Ë¡Ä§‚iß=ÍŒUÖ/^BcHÖˆù{¡?©¦¸NÞiv›dκVGK¬­ž°8žÑ†Â=N(š/ ”cÕ#×$þSÓi¤Ý„û ²½áKÀ—à @q Xš1¡½Æ0:÷nj@àäÏê'‡B¼ËôšœÁº®l¶œedˆß®51 ¯%‡Ç1S^À¹¾ó™rçOŸÈDI~=Y3ý¾§0 è…ÔŽ5!ëúE¸dàgúrÞ3ÆŠ¥+œDP­ý’±᪂ƒV]g¢[hÑÔù†QÄÖÁRÿ2$ÔÞ?41’øäX2燑œag¸µ9®!8]jÜ+Ô)ßÅ btJƒå#e>7툟û÷vœ­~Òà0~A‘ùÑôÓæv-^QÛvu6?FGØÖÊzPyx{6›i¢y–ì@Á†ŠœòÊ¿I7ÑN]µm¦’¤Ì$îzÚ¿Uj‚*®³-Ž^¸*ÀanÒ³¾#d€æQ»À•:‰n—|´,Çßi˜Ï|ŒáŸÃÖe°˜–l÷!©À‰â$0¶PË_!:½dÅ·bލ²{?ÜòBù½†˜£øp9%fÔ:ièθuwD×¢¹/a—UÆ]Rl銭Ƴ}½²¸Œ{=Iâ[k©./)¿½ÑCÒ­n4¶¦ŠJTK4ãÔTôg¹]Ýò$…Ü4-ã™E4îñg®¹´¹€õÐ'çªÍÉ.¹ _æ¶&RãŽz. Š&ÒÍ‚0ö¢«J ÐCo¾huRõøTuæÈQ¿ˆ‘Ó…ÞºßË]0VšÁ¬v«aÍÔ­`.  Ût÷}Ꞌ怞$ú´›dMüïÓùEr·ù_ïONaä‰úyT£¸ù1M?)øK¿HìÀÜ’­»t›ô_“¿QøÃÒÇðMä´Û>£.³å¿Fµ%†RN†Í*à'i‹YU¢$–ÁÍ™'IªyÆÃv”T²ëhs¼ï–V±ïN ¼i6wˆÊs=ÆR¸:mÊÄìf4³6〕c²î ¾Œƒc7Ç%1Ÿóv;hù¤_l]¤Ó3ìæ:Ç1ñž™4qëÒŠJÕºçÆÝJ(¦(=uÀæ—ê¥;ÚuÝ®¦§Š”þEQ~ÚsÂÙD9®æ·7‰§¿ cŸŠ6À”"\4Pu-6`n†v?½«y.MÈp oq²U|,¡¶8Á¾ŽZõMþ)4ÍØßjdl§?ؘТ\eÙ@í ÑÅ\ÂpàK‘’„NÁi¥œX«SR'ÁÒ:þoQ Ù`±yÄé!ÀnQèQ ŒjæÀMT+ÔUmtçe§uy2â(*¢Å™x‘‹ðª®^áÍ(váBÒò"ñöô9C'3y?Ÿ’ ½yA¤äñЇ$Ôø!9uP8†C¬ßüÐ÷yC¿¼`ža/Õ…°Ù9cŒ†â÷nD[94qîý>®Nþ`«n(wr£ºWygí];ï$Ëúvþ¬óßwð€{?Gäž$Qì)>^]¨- p£Žÿ&Ö}éDyl:€ƒ?2kLß¡™JðÝ®¦x‡ÕKZËò{¸xß Z…U×!ßâ ‹<-¿WçƒÇêZÉ›Ò :4Âa§t8—>n¡›€÷±S á3ªµ>˜Pe#ë7 è6(úßp‡Øc(¬€:Ôánm²ûðâN¢½#„­Õ1Ù–Œ>Çÿ}‡ìTµGéùärZ"Ÿ—œ5¦€OúâP¤šÌu¶½côó®ÇÍ5“@ˆ{â[Zë䓺…U“õXeÄ‘;]Æ‚‡K@Ô?³4ªø×ò™Ü¡ù¨ß¯n'>°ÈÙ'Ã-jxŸJœ/gÙ‚+L¼Ö¸0Þ$ÝzO«˜ªFùt³Ïr0Âø{u@È›åªTÙ&ü¬ûúÿ›]9ù{·IŸŽ®–ðžù8tQêÕxUy­ïiÉ TƒG#ð©KÍQÏݒܵk‹ûÎ.GÂÓ«êjtq~¸ÑUž&·7ÓýóéDÛ H=ëÖ¤ògò¯}äéîÑöñžèS³'C!êÞþà-9ÙÎÎ[Û Ö-Ì€QÍ Hò¡g±ã_’Ý-x?‡éÝDnêlUf^oM­°Ñ##@;uÍö‚‹aSuy5àĤRÕ9—:Úÿ&äˆL{Êw5$*,ïψ,VÅcVo³Ô9é†òï“L´!E)‡[ö̾bK¡:þß;Ïξô÷ϼñzßM‘z÷ÍÎ_¸•±o ù·Qæí¥¹|¼zäÞÀEÑvt·fþ‡ßÓ®(e]Ñß•»KÇyF |/˜Ä¢,JÆçº|ü’3Ê~ àq€(Y>œDÖ¤—‘¹7ÛÚCN SÐwóT¾–ð‹Žwcõ¨úgeòpÒÖj½ Ñ ±1tõ%£»—Ÿ¢é§G²»Ï‹ŒôDÕÌ¿1=ªí$‘‰ê«¯dbŒµ5Bz7›ãRã;Åñ˜9ŽËk‚uõÄ^жؓ_ê×z×—VX !Œ2XUØ?ËÉþlØ -âýëdÝ8™éîLž§‚׿”U|>)Pz ÈåáæïdÀã¿Ò g°É ŸÏ|¾ÅP¬¤IU`r̨Iu)皟È@W­û+/©³9¸ónBAtÏŒ-S¼e°VT2ã×.]“ z\¼gäpïæTrÐ`XP+{…–Tyy@|x”,DéÀÖÅlKâ–Ò‘=ÛêŸÈE7rNÈ•HŠó·HsÑMá轞1Þ+¾ù§OsdŽßÊìæŸˆW‚¤²®Ï›»¾t(bÌÝðgŸ07D GP,:¸ä„¤F©ov¿‡·<ߟx[_ÚNzóÐãè^ "õ6“2É‹<\ðhjö&lÅÌ'ÚUÔÔ+–>¹ô­dÄÖýþìóåè4w%†)~Îúwæ]«rÙ­®ëî¼%ÿ{ƒNºÇ»°]jo!ñàÆ½"Æhy"Ìæ¸ÃÂ|,ݪjhçÙ—þ‰¬ßs™^5FÐv^ïn¼ Þ»Œ1ó6ýa£þj¾Ý¬¾ËŒ³ÕÚ@@DµÕéG¨ Ì;3ÁeþI‘Šó»Èð$¥ôroÛ}R]ÿcÌCJ5Ãz©‰þŸ+ü/ÆaG&G’îŠw¬& sín-†þ{ÊWùû¹˜Œg§.Lëí5kë­¡êäõýЋ— éæ®3ܤA|‡Þû;І¨?^¢w$í¾ÏR07ÝŽþ<x×¹ö" ªçä4¥–YæbVd¦¾Ò„3 l(šVÃh|£†NëÇjnÑI³cY}¥‘8$rëêýLBG¼“ªäXÒ?Ø_’œÈŸ*¥ˆn`ÒøwÁúþ!·T¹¥4õ =Ï.¨÷S_[tN™Îc6&¾l 9›à±)È60Kë±}âö~œœÂuד9øî;¼¢\£·8*(RßZ=È4+ô÷·lÓ‹×#ߌIMPbRŽÅ¨|D±ðâ/׿Æ.&éÊÑ_“Éû¥™,ÝóÍ!¶çÉf–Q· Õ0Á¶g¯“®¦ïeÍ õn/VmÉ}GæâZðDÉЪ` ž}—´b|`LbŽ ¦ãí*1ÌPܨÚaC2Î\¯›3;†ÙÒÚ Å¤ºd5û2x¯ÊÊÃÈ*‹«™šFR š Ú Ã$l¸Úiª 9Åq"ò"6+ÉŒMËŸ?h‡ðé6­>…úÃê4/õq@î´<ºÓìÂb¥lT1*¾^eÊXp«„}«å·Iy“¡`Ð %gåó3NDàå×8•î¯ÒXùèí§ç'ÌÁÐz¸ˆTð²{>< ƒù ÈâÍœKŒög@YV¸=ë§Ëó-𹵺4aø¢ŽÑóï¹>h" @S~k%î ½½ÿ7OÙQÊ~žËqÜ–}j¹¦U–`CÁ-ábwͺƒèw"c¹­7É}`€›àáf²Å3¯ -Ø@ç.O…â"ƒ–Ú¤;h‹1'˜o§ÏWõ8äšFb¹@žÉèUAU^ÏþÃÙQ—/Â'Öè®mx¹NŒ´ïnLÌ@ìÕˆÛ<xü½%Ë€[Cñ1¿º¶”E¿M‘2p $åSžòÖÚΣ²¸¡*‘Kûrâ©Êa(üÕe ðm”»±)èÇåtS¦ò޾0Âc¢“žu€oñú 4ž=6í^{øÇïoÀôÊ÷ýwq}ûÚLÞ<·›åÁT]÷9ˆŸ#;n©ÿ×Q¿…«éyo©³Ùs¡N)f#[€nÏê¥[]ÜM’Oàú固#ìû-P)íu&Kz>2ÙŽi^{‰’«¢m]n·ÓÊ|K¥Ñ‹ÓŸvQFrHG€³¡^¶Œšw-"k,J=†ç”Ç!”讌zõüDð¬+,¿u!×ÝÞÙ„™£“`:ì|Ì'ƒ<´MN7ãÄ#uwÁ»SJ häŒ aUgÉõ÷ýçVZP!É™œÃ’S|A{ÿ$i3´W;eá™I§ è.ù±þNrB0?wL³\CHú®íåô”“J_¿hܲ/~®ÄìÆn‹˜îèõRÀ~¿©íì~ë£=[…È ñFµëÔÏ©3ž?X®Óúìhb¥ Žd¾]ÓØ$­7h6$öhÑ#aô¢úÃi] ŒÈîI¿æY+Ù+3¬4ÄœÀr5ài¥¾/ãÑþyžUP(;GUÉ=˜ÍÏ[?/™"}ÓHÉï§iý4(t¬P‡©Ï™Å9 ¡…ÕpT7`;írœ^‹É²{¶'$n9Ý’j>møD‹’é¬í“U£Lø­Wʪxvý\ K"C²²s¡Éz·z× ;¯iæãG$áÄÇU”2>ëQgÖí5oc…e_K¥:ÉÐN²PŠ5þ$Ý^WSSƒÐ:áí Láø\u\©%<8}ÉW„íù6þ^x‘òü>ÒU}±ÑÛÚ£eÝÖ€ ˜R^¾ò©‘ûþ¶²‡Yîl£‘™ÅôÉ~©HŠby`•.nùöI ½BÙdÑë=¸f)¿Ê½~VÓÒíaä×@?”ƒ‹Ðã»’†blð{<Ò7°gùS R>«VIz˜˜ hŸZâ[L8•Õ<ÏìÇcÄRׯ‹Š{KÙ~ŒöîQ‚ ïd«z¨Ø.. q-g‹J>K©æ·Åÿu Î /¯fûwå¨Pï=jlº=oi凉Yçkæsý„@q–£lÉÃÖ¹žÓÍåÅÙÔ’7NÍpPïaE‹nø\)­«g®·ÜÊ£†u1jmÏûÃ37fÊꄃ׵@¥&”²²ôX °àRº—U¬bÅ*‰ÒÕ¾"°’H!|7µïj“ã• ÜBª€Bz4‡Wð8jA_س.œäÇ‹Œ³çþHﺚصQ‡Xå|#c³™´ a[EÕ ½n·ÇyÔäF®pŸ¾9Þ®YjDÒë+ËKú’¡pvá¯ëÞrË›G9óQjÇȤMCëM1õì/zð]§[~ÉT”®¡U}ÏcWÙ í4é/ÑÄKÈ~ï½ïà÷’É Õêñ‘Fçè!Ëó /ý6Õû„ßjÀÏá4­¯‘«DËN °§±–ûot»»‡¶T€üàèšÌBJÌSf6åL_rt}©_ùŽïä[Tiïq³±FX–׿¹Ê¯švA‚¤ô‡,þðð”^Ð}¸ Flq™Ö—P¤:Õi~­Ø,Z]MÔÝ*×Îheb-ÆÉ„¤'Z€FÓ8àȰöÉ€²•N+2i‹ òVw\±*7ˆPM™®ã–KÏ8¥Ø P6%Ó™wK·,(õ]¬w¢ä³—:|ÊÞ"ŽOরË:<ÿ•öòër_UíDÖàÎñqOSNË^x2Àý¥;î|\5í ‹G[46û«›áÞ¤¼ú$Ÿ$ÆÎ«&ÔNÌ4þEZ"’|N¯F)Ü®W¢üÚÊ#äf^}¼´M¿Há«óhµ÷S?«"À@" ’ïn§‹¼ÊÄþﳌ+?¯¢¹íº•Ùß¡y®Û=Q+!…íÉèè©§xƒ&ÆNð‹!ŒE¹‡Ä€Áô‡îSrn©JÈþøbC{ß$~¹ÄR\n¤rÙ<*ÚÇØŒÅùót >Æ™)x6Â;å±óèTÈ`³>^¦‡ÕY3âœkʺÏx&ùF­1ÏØ}Ü|ž»±¹TˆVÈŠÒs3©+Þ î[®àî”gµŒf0‹6Ëüw˪ßÍBËש¸¥M-ö³DM`¾ Úùuäÿ#nxAnf(ÒC—®¬y‚áIÀ':MêC…vÉ“´ÜjºúÛ6ñP’+Ö%Â#BÊb™æ2ãëD®Nk¯Cä;ÕØY¯gêdzòÐ ”Ø@‡ÊH»êŠ—ÍhÐý$¤œ·Åáˆë¸®žHk7:^cÕéÒBÁÊœE¦Po®’¡ôh(jMqý»°Øþ%¯2VßMzá±?Tñ,à»ç®÷VË¤Ý¶ŽˆJvÀr>h}BzQ€ qoà)¹5lGßr¦T¶I$ÊiæÕ4°ä«W#lñ™Ô£"Kóß|NãN|^ôªx÷Dq¡‚‹W¥·ÿæFîËEÑhq}3±f^’ƒ° µ5ê¡ GË’ÖI‰ma–­‘åqÓ\í Á×UšŽç—¡3­ˆ2ð"úeüÈ[ÒìN ODfµxIeîd¸%í×ÛšI–R1 Án¹µWó%óØàœâ1‚i©…‡y€ëvÆKzgq`ÉüºEÃ…0È»T½ß뙕ò•‚‰lÇè횟=WÑáêÿ`¸îíqš´^®ßdWzšˆ­&a5£?í² ÜËo¾ü Û°˜Šª(ÈEÒ°SýsË÷µ^ñ¯ïЪ‰ÏRŽ s.¥~ý,íPþ“G}“HÈ‹¯Wdƒ9õG!˜pÉMi³ta|çÿV èE¸½„ç<€š+ï¶G_M9p0U¤°i ÊV«5¶¨ùüƒE»µPDbxc49ÂçÏ‘ÝFC!çüþ»ÑëšͲIk¾YFN ."—#&-á5Þ%@7 ~âfú ùtÀ¢œ¬8µ«IIƒ® Ahß+T¬ÅÔÕ´¢ñŸõüY7:d¬ ½B”bAB$™©9ÁþR(´`4I8RoãÊ<[[´f]â1«IÒø±XUs”;|‰}xoœ`'IfRDA€¾ÿ1ù‘k*æ}âˆïž6£N¸ÖQ“2ZVe– Fì}Ê@üÀÆV)®ÙZ·Âá2óÇØ}Þ-`Mttžî3ë¸0³«ÅÄ[£ŠOϤ ˆð€¥î×%H5éÉ+¥ †N7¦Þhoà 1OXó–öènŸF½ P›P3a|òàèåÓ98²½`H\æ9øT^Ù ¡äË—S B£³…7‹: Ðr1w.8¼:gk¡­¾I¢«_2jÔ-†S^Ç"LÈÿ ­úÌ’½Ý)nhã­Eǘ•Õ4üà{Zp§ARG ˜›{ïXsó^kí>JÍ™E¿>:ïßË-é²ÇcœOËõ%0‘Ç.Šg”îæ€¡øå¾› .Ѿc¬ªdW0>[A?¢ÙyuÄU–ªÔµÅS£SVÒ÷†ð^1Š~g%¤g ^¾Šb—hÑõ„cƒ_0Í2y"1œy9™ÌV?aú”Rìå[n€¾‚RDf º ¨3?° ÀÜ®yuGl¶ªÜÑj¹ç"·nsÎ`äì3Uïe*öçÒͨÁO´´5G¦àð«r1ô`˜ò™ÊÎÕý| ‹8Ä·”™<²@ÖdŽä9qÀÁ¯Õ­]C6$Ez©KíÁqžÃAŸ“G—Ž(Y¯L«î»2±KtìZ&}åœ,F¨êZ¥ÑG‘Z>Eo†.X–ãn–cȄҤcrNr·l¶ !«XÇ¢Ì Faå1Sjva2ƒWõï dyµÀùÅñ´«f»ÍëKO|øâ…äÞ ü2 û?š‹µ¾}>Ÿu™ÄÏlžUÛ‡æ CÕ³þu,köØ$£çÜód¼™§Ò0·êÏ ÓüßŬÎÞžå2<jxTP(䲞iy°&†)÷2ve3$ŸÕÁ¦nZíò_xÏ‹7 ,Ü2õ\näšØ*o×$!H"›X8—h1À¿Ü-.¦©Ñš>ÑQù;!ª²ç„µ£õ¬”“æ«--’ S§_§iHäôWTæ²Ç°× ò»”¹må(US_äqöp–ÿà±± ‘¥8\ÉlÝBÄž„k‚ššEMΑ&®f™Å’Ç( ž7n­Îz9«MdÐ7¸o"Þ¤áâÆ(™P‚Š˜0EOlß÷ª‡s`V15|E¸ç+,™sÇÛoÇ÷a ÞêÏT‰e™—B¼ã,Î]¤ÇpI>ÂFIÅQ`Ú[cqª—bQ§r±35Cñ~P˜¹e]aµ¤zT1„H9F@ª{ äè´gdªiL@Sà>üÚœù$O(½¡¾we}eÑb¼ç§Ž¿ÇbôýÓzO¯†ñ3W†6 >0cé{caÈt¤G󌗩´ï«]8&‰ªÓyQ6†Ýò@|ñÉ/IQ<ó+ Á ¦f•xs™ð 8¼é’5“%Ç—3S„itu§«q>á*¡Æ`»‹*³çÁhõÉF¤½"5èv**’êþF–ò‘ëv,aááµ°b"º±® Jb¢à®YXÍ8D ³`§dÞõæLpHÍo¥«™€¬©›˜¹åûMÀ{ó$*oƒŒ{ÑWXƒ É^G…¦ s”…¦!Ú§žh;þj -LO(¼lˆËab"а¢ ò² Ë$Ò› tÖŽKu¥¹“px®‘®S°Ï¨Ì%{š! Ë-õ¼sÔ.µ4ÁCU ‘O²_Ç`¸_-àžÖÚ—# ªDº²Ÿ€fwo³’¨v©®%Öè6‘»€‘t\¼“ÃgÛœF±Û5a­HµÆóQÄd5”sC1Y¨™k˜ÙV­ßy.1•T.awš!:¼”}VŒ¥°»T#ɶÇ|b&¨'¡{4¥ÜD>­Œ‘Uû:Ùx‚£:¡ãxÄ^OxhDe„Oä1zŠŒ¾ óòL³Íæ8·¹ë;:‚¬ð¹Ò瀞›eo9Èrt¦ø" ƒ{ïø¼Êë‹Ñ¯Vƒ^ÛŒéœp€¸‘wCœØ–§žË÷U°úæØUÝ8–_€mËCæå@ŠïíG?$šÛÂÙüYŠÑ.b³Zž4ÛÌ46½ULŽ¢ˆî•AqrMõ9¢§9 mb]™‰«§ "‘CÝÑp@FAŸU@—Ä*%¥áOªq†ÀÞ°"Γ]„Q5q˜3ÇnIx(l¢+"êæHÔþwáü0ÊuVy  l¬~>ø)Œä›Ösõ~Z1€5¶ÌZ¥,î—ûG–ofû¦vÎc›(m¥Ù¯cÏØTz"ûYjؘÛ5M=áêW °¨¢‘‘†?’)bo~‘Å=%ëAoò11¢0§u‹“Ü’'šS{07#âEŽ\ Œ»ziȯÓÐ,¤$€( Íì¯[•cЉ˜¢íP™7‰kaûó•‰Z˜’yò«dGBº‰ØB„â×`ŒFéÜ+©‚üª(,-±X±32!Q•­+¹# ”Ù•ó½Ã"š!ñvdýj‡ÞHòZ)ûëÔ‰õÉcxòÙhËCËBŒ` ~Áé—ÀW‚©,'Cë×ÃZ3‰ÆSc‚5}¤u‚7’MFÁrhk”‹lÆvûz]MPÇ9ç“ë¹ÛœÔrآŠ©ñƉû¿ò«R¶¸Iç6èM!¸Ã!'=!õÛ¨~ °å<Ý&7î_5¢7J>IfšŒ²1̓aëbLŸ-tç;§q%ôagvÁ¥°•²åœã $÷É=„Mö5¿1eÍUÖ’¸¹‘¢kœ;²(…ržÀ?~ìî¾É%Š_¾z«¶Cs|’‰œÝ4ñ  ÆÐëÝžªÞ”an­ndÒð ØyBð"ù‹”ð×Èë‡Ôc%gíË}¤©‚àèk‚­4ä긖ŸIBþQ² C &xwC%aÍ}Éîà60¼Ó—ˆÄ]¡¹WU3;¢K™f²ëIc@¶‚qL&&J9E7ÅP“Ð_mRìQùæmcÁúêBkµíÒÉÄÕ•K“€›eW.xK÷‚Ò¬ÂäEÁmPJe›‰z¸×Ijžçø›´«˜~ìҙ΃"P Oíæ0i?øöÊÎ*çÆ¶ `$6£ ¢r±MD”ɵö¼rÒÎpóËÝ ¤êÊþ´JÁíœê©÷:òno±..ã[Ø#¸V Q4råÿL>ý˜|‚à\¶/ÌnÖÝ)¤‹ìˆä5œ5(²'•/Ú¸s,]²ž¶w\qÑ€poÈn£ešÎÕ5U„×ÒRQ/­ ¡¾Ý ‹¹”DðŠT¨žóEsèpbòÒç½– &6 CC¶ö_ÎuÀCïîè¹Np-ˆ{…hY1̓É¡’øz@ÎÚÆBÙt¦ºU^=>r~µƒ–]¶—xz€;6G{Ɉc_ å¶ÓÀæÃ^ª6¡] =Ò{Á^4ã$ŒýÒ£ì½õGÍ3é²Ác#«DIJmµ6DÕЂT‘òþ¬´™¸æ)³‚$&œ³¥º¡€‰˜ëäœÍɇÏ=lNÈaª;'cqB'ʉT3äØCvt]»%fæs°ˆši²Þô¢ŠÉRÞ¥©*ÛgI¼Û9gCX/AÃìZ®;™Í(µ‚æÖª©—Óóg™Uô>úF2~qSÆÈ¿rÉÞ{hÄê×9¶<ÊÈM /ùÞÀŒÒ¸,õë0è£ƒŽ½ ¿¦ê+ø×œ¬ %Þeø†rnwaåÎréÙKû¶“8î‘Z=›Û-µ™©i†|°É'´Ó>,YR£øH`\ÌK8ÖÙLP¬ÛxÍJ¶xëuƒ³a_d(!' ^žã ÉÊKGÝË@fQ¿–¨Å@#Ù*¿®P‚| =4ÐÐ YFú sNV¹¯'¥’Ýi½Û¾/B‚¯Õ”É*+y¢c\*Ê ‚ò5¦]°Ž$±¸YúÜÅpD€¥K†ìÍž`bÙæ«‚¹ë“Ë”¶u4)UÞ¦ z»¿ë®±NÍ»A¡÷a¹^ ÛÎf»H@ÿÅé#åê9†÷ËÓG B æU6™ìµ!aÆ3Ç„6aíú?ß½€À`ícŽÇiä=Ï0Jõò6.„€çµø›žþG³i^@EüÉGž&,!Ù‡ †I "B]±RáûböôZކìQ®NnwXÒÙšyèöÄÝw6O¾`à øßµËËÔ)Ž‚ª"ÿ1v[-™ÏLú-ôuÌU „ ³]¤êï_‚4ä%” ­eÒNR•a4Ù,ÆùVd؈»9t—R5u`ù:•þc#Œ²ìæÎ²¤E#ízçdc:å‰ÏL÷ÞcENú[œ8¿ôVîÜ»Žd¯+÷Ï^Ü\r•ÂG“%J}ü™`Ñ+KÛ³›y±R½¥Â7ËáFêZõ¼jâIš#;ƒ¶$ÅŽ”º-è3·9‚ݬbDʼ6T‚ ©¿ê< õ{5½ 8ünkS4䤧PW6åî%Á;þúvB…hPÌ”þ.+ðPè( *N¦f[ ùY"´ ‹g¥,òÙkE³ýü]›H*ñî.ü«µÿËÀ³Ý‘1>0`hЗ æJWaçhÄ-¦é}J¦Ã_(ç58'© qn8rák¡9”i$ÆíÙ/¬ÝÀŽ;vZ|ÈW’DSš ìBï:Ç}Nšâˆ#3 UÁ‹ƒoEDÚ«z µjÎÏšY 8ÌQ8VC%ï¶9¬V2­UŸC”ÍÎ:Ѽb¬ÍÛDø1æ04lΨºŠ*›ªyE¿‰X[·%@Ç èÙ+ºÈê@ඃv¤døÀTc‹ah)n'1ê}’S å­— Îüø4”iý|°×âïs(]ž$TS–ÖøŽŒ®Skdøá÷} ?‚¬ùË â•uO жz68"‡ešA×G2àpØB–¯iÞ´ük­4¹é*G"\:É8Jä^_+Ëx˜¸@ÀHg¤¤ë'3Ïb°Èê$’ÐjTj..a±¹Ùƒ_+-çENFEùÇÙ¹5ÜuGU‘DNs¦y9ÒD/ú°QTµçaïÍl>'êÏYl:⬃äqÛïåWjpèwa&Š"7 Éœj >ÿ;÷MÏ#p;Fœö—*ðPÅÖLa>ÈÉS‡¥ØÄ~ÄÈW¼wÂùùíÍŠ·®J`k²h§êѰ/j¶o\-ä M>3’%£,ZJÈÖÝ5™2¾chI¹“pf3^•©mœ¢½2&M­ÿ¼\;IµÕ×ó#”SÈs$;p !#û°¹ÏÛ¡çj;ì¯uóß.™»¡ùóðƒ­gžèizê1€ÝÄ©§G™·2"û%àfÒuQ•X¼=™ŸwûîÙϘ9ö‘[Dª÷ÁEbDV||Ÿ[ÑXG:?CµÕ¯rÂ"ËðQïÛmê Îw©ékíÎ@ç¿£°ƒè¤8ë¬Tš;ŸQČ窻.›'9Ø[-­+f! ÀƒsnpÊ÷!øåY4ºÐ—>{b[ y­Î8 Y2Ý´ ¶×:©Fݡѣ/pó’jM1ãS³v* Ljf¬¸úëXK>Fuo*U\ív2%@p{G“}8 ” ¤ó›”“PW„Ö:¹…XÂq&={eÜ»-ké;Ãwìk;=±An$as«ðl–Hú1¾AK,ÅÚà¢À}’© x¢ºgü,¥)3•>—Þç(É¢n  ú9œuíõð0›¤QÃ,ÊÁ­[¹4ÎÏGD-M«”þ™‘õJkp*D¼¦Åù¸:ŠÖbi7„ážnzrÌ%¤Ó¸4ªåá ~ÜVëd‚£¼zïm:ŽÌëúUè¯BBÂ.AzïQ^ï(²ò~zC×Ö”m'ÿ6¬8 ïŸÌ}ðô‡\k|ÅÆI’ôqh´ ‡üš%.Âà¢Æ{Wb( Ò¸^‚a“üñ})äôþ!±PÒ{ ípW#±{¤ÖƒI¿‘þ’ÒË~‚ q×>†€vXÁ[Dc$pÒæñž í˲2g ´rÓMÄlø…ÉÍg¶.!«·$ ù{7O]é4) ¤z0ç/Yž/%ÿ³mSÝðÛý`Ýúšb°ÊUÌüM@Á€·seÁ{AxÊ3qG“àw«ëÀÄU¿£\°ybD?ðs]à±+ªÌ‡2{«8d²)ng<š#†·Óo}ç<†ä‹ÎR…—TvµÕì#2*ÄP¡aß&NV_À«?Í"ËÇ›yüßÕ2µ•ÂÊZ˜a2S{Úí콩қ•eë8_ªYª °—תhûþ/ÎÔÚpÃIFûPðÒP@ŽFBâ4ö@"â<ÜNǓջäÉð“œB•\ÎXWg«kˆšáY¤‰ítËÑôïQ±†jCÍ:ªfU\¡Ñ§Û?ÀmóVÙnA«ªƒ.¿‰oø_¬µN¿—ã4 ¦¸Š~IAáœý; ôþ?m²YS‘ü‰s1&Z¨ÙR£Œž‘èÆ¶›‚~ŽÙ¦õE1ô¾Ajì¤j QÙå-†(ŸÜ9=Äf<Û¿»ö0 ïK|Ú ¨—ЯKGÖq_‰#Ný’‡œeµeõLµ$gdLÀ÷$¸a˜sòi4ÏŸjãÍJÆ:š#Û%™}¦uŠ =W7š_á1Ëq5ÞmªÖ n‚¬9NEÇ:LM´põÌkAÕw½'ò×.sÁɵïT²6(.²pA³V¶;žäa‚8;=iDtÄPäjÎuºÂõ¼9Єi°¡<Ö>C97ª@…HðÍíÀ{s‰ÕÊgs3 p2éµìĵnYÌlõ˜Ý–wËÞâ¥èùßEâK_w;9tJ™@ÍÍ©Ec3ÈwµœÉÌ‘œ~áIgœo£uÁqØâ® Þ,Թ܎JŒ2…ÒŒp)ð礧…¸,QþžZ3ê‚ÝE¯ÄÿÙßõWºùŒ‡ŸÓ}ë•R:›‚u±Þí*#¢„ƒ¸ˆÞÙòª‡Ï¡ß1UJwÁgqì——{¨Ñz>‘4àl¾o`]$åÏ yª·ÒQ´´†qöp!|´ úGðCÃŽuZ¹çMúOú©-Ík-éу«oŒ'¹¯ÅÅ]GªsôUX{(õíSôs§žlk™æå%ꂬo!ç&±NùœÓñà/"œ¶Z—@Ey a¼M0ÄxÐìi~uë’ýДªÉ+c\ND¥£‘¤ã§4Ác‚ªo„âÅôõޝÕRzZ½­ŠÍ4Y¿|Ŷÿ“çÄ{.%ÌÁ6S(@|BêSWYmÍÈg˜<ÌFÍw ÑÑzg@·¹]â2ž³6žÈ‘#¿t|1BÉ(QßCæUÙfñ*Jò‰è¢8j¢00:Q31‰²f\űÐ2w}<åK(I'õjÑç‹>ãçO&”Ѝ¬µ„„U‹GæñˉQD<{ùöAŽlVÔߥâ\ìÐ4Kþ°ßƒö–•Ž!S…°:±¬&o aq ½:Xµ™N¯Õ²?b¬'ÇÍöVˆ>:Ó·Z7þÚï*¢Ò$:Òº6* §*Eª„Ó{—¯1¯)ˆ‹˜„aíò~óÄR=½„Žî p‹—6 9g™{µš)÷—߀iŒ²µâ¤ý‚=H*+ò¬˜€']Þ_#ƒcF¹Ze·½<Ͳ¾ËÓ%üG¼:@PvÃÕ“"Æ™Ô{Èù…Othýg¶(Ð:þóÈ„ä­Í´œXûÂ,¤ÐËÛÿ¼¹J‡Þ˜] †zy-÷·JÜ¡VVg-%¿gѱSи}©/ŸضK)PŒ\œQÄñÐc# ›}ÓNs¼Q`ÿ žòTTt²ë_QvY“ävß8ñžIuÇïÁ+1Ð`OëÎÿSx4×MÒëlŠã\ À²² S’ßeH|¸úû0ÛÙ:‘tÓªQªÈ Œ¶–ÝÂÑ\MÍ‹Á–ˆwÌï.Ö™ï¤5™Êüy`TM!fR0¶LvVtF&–MéLÇ~Ò AЏU®eÂún>ÃÌ6ee­W\ù'âZäyѶ*׶ݹõ)%;¶ú°Q'7»Ï$ß±?XB Riªü(˜õÙÈn,†e2ÞÇ£Î÷ŸùM“T—NÜs‡Òʆ_é,]øià;--g-ð•Å‚vâ…ˆBެ¦­EQ†rrI*“‚Ptz€ÍèœÜ Æ *AŠ€jÝâQµÞf 3¿½Ï+~¾|ºEæú±ë4eþ%”ݱžOÁÕƒ™7–ñHwi¨|–]Õˆjá-- ®å¸€¯ŠOÚ× m²¤™ÎzÌ1’Ay?…òšùMG½Ž‚S.Ф4[6dq±µl¨z±&Q1Çð¶‡ô|CaØÓ‡JÉ̃¦¸-#·n"uü,„.h89èóé*°\¥ª„˜ƒ°£ãGhkKÓw%FânmÝÇQ¥¤.R£i7umjÔ!¼h¨K Ý×?^îs‚æ‚XzúÜR"ŽÆ\ŸìW5d=7w#5нìa G8âBs?Ù$_$³3#§>>è'ôn¸ðÈ"~dXq~‹tç]ÉùŽQϪG6h _c„¸˜û›áÀÛã¶ÏèS(ïm™Â™~Ø^dŠN|ÌŽ‡‡W€ r… ‚™!Î 6Ï¥l}ëLa°¶_•(UÒ×õú÷Ò´8æÓNÜIÊ7  òÑš:“"Ò?«h{Q¬¼þÈšÞ ¹‰¦ɸ?¹ü%¸Üª†C"Ñîû½Aâ ÇÚ©%©Í0Å$œ(ÖÉ‹u÷lç1‰åÜn½Ø‘Ë)ó tÙ=y£“‘ª˜}å\¨鉹KoÆp«Òݨqì’‰¸o‰ØœäuTó$'š4û\­ ¯Œ/ñBjýl×j KË~Q3ø¥à;sßpîŸл¥é™ZY¹O[´šy“€·gXK­2 x ƽÏUeÊU‰8÷V¤=µ¸²üÂÕ:vÃ%j%°î,lB´7luÖKSŠ lËñ'8S`œ}Ma’.Í$1y>ÏÜ- „ôÜü«ÁÉ)œè^ §¢þDBÙ—º˜¬šþŽ SSå€ÉwL{µ’¼à7k!‹ðÂNëÄa†,f×|«”tJ‚Æâ“ ò‰ºú0hìˆTÎkE±¸¦g+Œ}5˜(1ÌG©ÑP5È¿œÆŒ&zlj*¯ÝÍ —Ê']µôuTš>í0t#¥›æ­G ų™Þû„·Ò¤À‡2Í ®£+_y!ð¸žâ\¡³—GK²œqª𲜛 Yêdš=j}— ‰ö¡eYroó…¼ç¢Åƒi­eV”l¹,ÜŽM&L^2F^“áÀR|×µ-©“¯†¶LaRèƒT=$ïÇkô\[“P l7×.’;:X[q|P$×nhϰ?;1šå`˜µ—³M^k,MÃ÷ÄÑz»i²Ì\ÉM³ôß} ›U¬ Ф Ü1×âdi©þùŽèàbüHŒÚ/èá™t…ÝæžN¤Hk íû‹§ñâ´ÿ¡©b•!–¢‰ËݨUÓ¢hq¤dâHúµû9¹²HtvÇ"òâ²H ŒSãêãç®=eF+ñRí7¶"&Äÿöu>±q2‹ŸÖIÀš›œÓÅ‚ŽÚ ]“n&¸·YbÍWbµEô¢TiÍa£¤Kp1•³ø$õå1\^dVAV?(%QÝ’§Y =dñœÁõ½Ó¬A2¥*A~”‘™q$Ž@*·=RŽ´áP6é‹ðÈ ˯GÛ;ÕÏ ½nÕ*eŽf¡i1¸ s´zpãT™IIÈ™]vqZªR䝯DâÃjÎ7+edV«†‹I•"Ùâ™Q€ÈãJv„˜¤6ˆ« ZZì‰Ó“FUR¡§Ä>š+RÖg^4f©º ¹F«KÑÒ_\_ãoCL®vlÁNSVˆ¢Î1Ÿ Æ{“ùÊ`à”XZѶÖîlXd:&Gt§$Õ¦€±YowÒ;M2ŒT£ó…¦ž¾/,²nõsE•ÜB©ò[¸¶ñ‹žLТxÔ™JŽÁOÐèÆ'{úoŸ3µ®.Z»×=¡ˆ‘^bËo>A¥@šÛ6váЂNÞäaÊ€,¬o%µRó‹ÉGF…“äE®fí©7;arêâY.K!~˜ =ŸL]ð¦÷Ô‹')GQv§7¡€Óei¢‘ÚŒ€¸_—aà™ÏÙ„Ó5êºÙ#ßAä€Z‰NÒæQìD_—bS„Wé õ “U=yù n#ؘ£Ó¿*Ç#ÒâläE,-=k¿Þß$é»ðl‚·mH©#åfž‡Ñý’ã×UµÐ(ÏÒ/`ƒSJûAX‡Î‹ÊÒÒïìµ—(³Eä‰w¬¹KÈ_»‘#WçÐq: §ñæn¡À‚qêB*Ь ˜lróTѯÉ}†ÀKY*™:‰iQ2OÁ°c´Û]wúï)3àjü8„³Ð‡DÝQI… q´~oü; ý³–Ç®5¬Ï!Í2‰Ø„ûÈÛ.­6Ò]©è½Ï™³ë¢Ïªž^í€Ⱥïedd~ŒÖS·a\Ä}‡ÈxbE¬è?â¿ÙˆÎËpŒ[sŠê‰ÔH)®wJÀþÄìYÃKŒv’ÐÏ•Ir.xl2»“z&ïØ™Ws€DãV '°õWmꋆ/ƒkVí"Ò&"ù6 Þ¯_ï¶íÛ@ŒaE›:‰ƒ ˰‹|S†Üèù°ÿw—HPúo¥ò¢±õŠØ/ R(°Üï£Ñ‘)d2úI³‘3H"šÍµ2>ÞJ\j娖È3¬hX* Ôý3]gÙ,P”èzCSœCWVÍ‹þ”õo‹oçdÒŽLÕXž}FDÞéíZÚeÔ:ýtø53£ÝõÄâgŒÇµ— ™v‰K!¢Ñ¥x¹y­?¢¼$¼…îýeñnÃ÷‚½õáâHÜu孳ޛйÂA«xžÃÍ·\Y<42è—'¢Ø˜žõ]ÚøàÙnò9Ÿ½=ˆr¯ržv~RòóÝf ì"c}-ç‘M˜BaX•>S‘¿n_Ëõ2öäã³Hìn¨ûs.`óP{ÛŸYÉ ¨ÙnF$`ù‚è°ÿ;gýÀîÓ~â UP¢Ç-²wÂø_a[yžHÙÎ#yµDôV7$©àTÑ"c(©Ò÷ª?nùVò±¶×0ÎC)„‹›B+´dJPYvÄ^Bô’[ŸÛÔX”Ã)y„Š ›%§•×`ŒÚ><š€ŠÖ³$©ßn%œƒê@t5m^ÆÛlÕâùá~B¾Ê”A¶šæñŽ¢>Ä8 n6ÕlD·¤¢£å褓 Ž)Ř„ezœñ×–.â"ôüé™ÀÐê,­cš—4fŒ¸é¬sYš—ªULÌÔ ˜ŸÃ˜N7×]Žæ±Tb™8?úÇÀ+çãw–9/³3ƒ+fo?ÔQíOÓ­v>„›£4"/Æ–(VÍAç¡ý;·ùÞ°î¶Àô$¥Ìæî­éơۉ@/â&¥+ZÁ€&Ö‰Ò‚{ƨ—W½wF¶¯‰©-ŸíÚ™WME yÈjÊ`USÎDkÁ΄èþlýÄ‹šò Ì'ñóŠ¢@•$ÙÂ"\/Ñš.êuÇÉitÌ/µ¥°Nn¢½¬ y5cÎŽè%¤^UÊúоúDÈ"%V‘h0f]òyú~ŒfH«‚ªï£i5v{í{ÙMÔF§Þ5^¸¥ṀØý(û¦ZX"ëYþÇdN¥T´vHoÏþu󦢨ŽE»ŠÒùÃèDlEr')øéMÖÛKVçØ°bôÔ~šêÖ³ƒÜŒÝùnIÂ<¦×?’…4X§ÑE§Q‰UÀ_ðv1øÜsÇñOGúÍ¥°Ÿ'¹§2 ¢Ç5œb¯ªÒhYsè}ØùuGÐÉq‚A!;Zü&4Øz=^¢ùö&áH“ x%=(«ÞÐö=ð}WqbN3’…†ý´ÍînÊPºnÓž¦ ÀÈÆYg…fWÆé£ê‡Œw‚àê‰[þª/ãá¤#îžÇÁÇBÈÃKM®ªšbãΧfÆË2vnņ(¾MjvïÆ©>>Ë8÷®®%œCeʵ9k£ÜŠîNE> D~ŸS7 —=L„Géiê™E"ÌÁ‰z”¯°EHI5.8 iÜëÄëÊýz»ïqLŽù¥.cýËxìÕã ÝÜ›] žè—fQ|û1w{ë”L öÄau¬Q°ßy£$ÂjAyU>¡.IRÅXc¾;ÙA?¸VfxsŒ fš/+…G“ñœ!ªévøâOÂY¦ì7°4·½Ku±V˜rá?U)ûd-”Ë"¸}„ÑïÕƒ2Óz˜mN‡×Dš‘/Pƒq9QsZý_!±gç5]qkª\¤è’äpF¯Xý:hë!xÈ÷ØPgÆAƒ(nNT?)ﱺ‚œ–„'F²†U†Þ5m1»0ÉXpÇW)Òµ„Yã@¥b^ÿgô_ùæ³çT(YâFV·øÕMìšþ—¥A[_© O'{žòIi]ýJ)­ÎöÉ\éŒ]è-¬]D’=ä]uˆ=ì£qïòî^´tÉöÊCeµ@2™Ëò (•¥Ú’ÒGãË}Èâ>ÎÃÜ~ú{QO,Åð••šy3"˺;‡Q»]s-üÙד8‘ÖÃ@>£D\4‰tÜoE>Ë'€5”sõï]YE˜Û77»íD“ßmu.DHþ ò‚ ÒØû=EjQï«ÖÕ­G:hx,ö­·MƒÑgqžQà ˆbNܨh©£IjUÆ´øðUK!éÎÐÞûS­Ô ôSŠh©)«Aº!âîÖ23ZP×ë2ÃŽ®rëÏÛ¾¹GEK±íÅ©è^Cã;îö¶!úãë¡W·gÑl.Î{ÚŒ†ïð™†ÙûIÓ„¶Ä™ä )˜4ZÛóV¾5÷|¼ÑM*l ŸŠ„\ÞìçPk»îPŽ/LlJyŠFŠ"V‡½¿@~ eß';¨&íÍ9iË~ &ñ˜£¿štƒ»‹·¿î#¹107ìТû".ž…’ÖÜ¿Ì탖³ïîWZÛbÐ~œú¨Ÿ1sÐjxCWw1'œ=Ý8w…C¯½œyïá©'Ç;°¤ø–FšMàNÂ#–ñßD 7äþg[%¤DäÚÁ¸Mþœ‰b{éÙFØ:nj›5äÿ€ìo]” à©ãºZ•„øÈÛ[Ð×ËŠuGA™¤ wdßœ@a,`l@øÚAö_u¶tzÀ +wÜóøŒŽùéUk²cåI=ùk»Sd9^DVr­&9)ÃR§®œN+ú°iÔS”šÌß!{:³Îôs^']ÆY kM31Vï®acPÄÈ: ž‚¼ù[ü.á4D8,àËÄ #øI;Í½ŽŸ+à.˜*Œâ7 …ˆÅéê C -1ù*p—‚ØíÛ»<îNT-æ¿lZ_Uÿ”WE“0‘~þ‘²võöÈ6wBÁïéìÃ7vñð›Zvx¦vX±sµ0“ 6ó'“ 5ñÖ-j£> _rŒ5#I-5ºÔ[>È|’<ÆZ]~óYß§÷<…š­ÃWÐ[U+#LŠh벯Õ|4,}].|–×R·¾»‹j ݞƢ1¹àíý“®}Ò3Èã´Ì®ó½wF¬“ûùå3’ÿ3ƒn9¦é=•îÀ—¢3,¿hÓ ”œrCÑóîá›|°ž@&¤Ð\Ú 5Š÷¬Ã1º{ªr`àœÑöÉ¿>_åEúcÈ{ïô&x_2^KÁ×±qž%öÂæ­ü[öÁ Èo^¹öA÷H3çM9?WîG´øìmtdÏÏÜ$Ëò·hê{YhjIúÊ-Ê †Ö¢B*…Ö‡B+&È üF6ׯŒ02•¾[(Ì.žýI!þ}¢ìÖ©Žz ÅJ^².jåb÷ó’÷˜Íº@LÔyƒ$çÍÎñ>XúÏ“0µ@”éÛšsïD³¶®Ç,·[ƒªv«4ô¤Œ/Þο®®žõ‡PöK2(ÆWj0ª“W „© ü<µ0>=Öí ‹É}÷iá7c¬—Î_Ï}·T¹z—ä?)…Ÿe·ÞÅ“¶ˆâD§o3sªEwØ ¥<ºT[ò†˜¶çë”Z ·_´†Ùæš^|‚QÏ»áLö^9á¼Wxk³g¨-]»ì×7Ü«6\æ½D<‰¶þªþoq,zžýîn—ÒzÎþíKÊ:¦{v>ß6òè‡ìåÞáD€lð„èŽÚÉ0Ö!tú/b!ð‡"ÆžÛ9¬´åÿ 0±¾þ–/Û'ÛÆ!àX}#â&07þ<·kf· mÎåÿ7cu¨>_¾¶ýí´ëÉÀl|SynÿžNn[iÓ)"<¬9n €\(…_øCâõ "1!ýÂÞKUö'ÃÙìoîë÷_l{ýý·Ÿ¼Pßœ?0 ýc¥<*­.#°ÑV¸“ûÎ#6ØéøèðôÜ{7›ÏÍ‹õSŸ¿ö×£—ˆÓuè··îšgÓzŸ¦IüÔßןSZõ=ÎæüÞРq2Qãdw^cöŽÑö>3=5|Û=söo'”Á-Ð"UsŒ}LnAwŸ¦ÜUi7n—ÓìgYÏ˳bñ+£åÇMrñÉ¿buË;,œ!tŸ¬s½ûödÇ“ˆraoGiªùu‚2êDB]sÿ-\x¯8J 4òÓ›ª)=Xõ"Ìæ/輺ÙÈ^~¬^ñÀÄuýy1¯{óùAÙ§Ç}ö¦Œã®¢ÂyùiÈÔ†[kjÃí;LÆ,Žg'¬\bL1²Ÿ#0Rئ'÷ oŹŒpÿ GÏ5w é˜)ë°óRÕNIóCÆcåµuãFÙ'°‰îÎI1OÍ ¯PäŸ9!´oF‰"¿>|UÓ“>²Òë¹vâà›¿ÙÛl’íjdÕ}®¸/¢Ü¿Éè$híV¾GT—¯1ù/ w7Xcv屺nª+0wdãߨÝîÓPzZ× C>'ÉÝT¸Ç/$l.´0KÎtwØ•y`ë&IËVK9ÿ{‡° o> ¢´’Ñlv¥£VÖ³3÷»œƒâ*¤HtŸ„òyøu¸–KεWEü©ñkÈ”bæœ ©‰¶S¿ÛT²z q;Dµœ„[Qll`¨ŸRÏÛ÷9˜U Ý´˜‰éÞM[¹Õtñ6Ãù”çO%h¾Äúˌ͊SŸhª‹“íT£8¢ ,0É=/ö” ÅÛ¯ËåþÖw¢ÝœÛr‰ì‡0Üð’,îªìC³pökôC±ið;WªJ;Ï!ðNÎíªkemy[‰ôr«,T(ÍŸ Jê¯iºâñ!VÒ¾¾ÉfÌV²à•i˜‰‰§á6)§»šy}A=µ#9G)«È5épÙZ—híiøø0õjî)©{랇Р܂×)À G‰:êu;P‰´œk„¬c\^ÅÍÉ.̶7ųå˧)Ý9È£\0±A^C°_uÞ—ˆ8™Q›Ê”aÐ(·mO~|Vo3vp!&"ä®b¦šKº%#†­z°Ò׬ɶ4 eVÏòFœH±'oÃùèáó®0 Úêh¬Ó‘œ"ÅÅ…UAÔš©®y”©•2ÍYü© îÂ᫳¬Ûná­­YÄÁ‹+•ÇG ­rå–Ôx£Ô™˜Gë,Ás€*›UAsdaɃRà+ÒþÁÊš³Ñ =þV2aµ¦b¦Ï^œs¾”$:¢®V5GDçˆ3œ8 z³¾Fb««é)á‡rÜ›ÎÏ[ŒêˆsB¤‰ ~rö£ü¡nKr|Û'‹½¼òÆ‚É3º$·õ|ÎQÏEþoõ_Î*zÄ’/¹~³’~:B"'@á×r}ãì²MŸ!¸€—ïQøÂžžvõƒÃDT'5àÕÇaØfßä‹aðåô„¡*¬I‹ H˜’Ö“6ù3r£–ߦéßœo·0Æö¢ˆæüt ùuäÈÌŒt z5å¾! ³ÞTZôA ø×"Jèóz =qç€-Ò>‹ðª¾B=aǹëÖîfØútKIKí½T!úþb£|oºM}nƒµHþqkIÙÇ ,›ž06y¨€20}O¢ò•ÅCáªEÛÙ!¦¢¢Š…HdNálWýï’Þ|¥Å“Iïé±÷`±ÓPëä,>Á(i1¾d“!¬ÉiP<û%׬Ñ'éN=Àz9ÇW AAkKžË1 ûÄ¨Þ ºâó (ŸR#ì}%ÖnRî4è…7_÷ ̦Ê߬˘?17Ÿfç+Œ2±Bi\¹“{9r©úàÉñTºSMn%WÍÕ8 éþ—•‘è§Žu®¯µŒc%”ÆìŠz8†$»'¸r¯¢LüÆ$Å^×[9 jƒæá‚¥ÿ9£š©Yh|p¼u¡ñ\ÝmN¶C-5/Ô½YSoá£½Ø g6Sp« !‰–JÃ"ßèp?L¥Â#W­õkÒ½ÄoÑ4]œz[ ÇÊ–+Zô:òf#ðêÑ9ö¹´éœ±yü›TÄ`—·ß6«[?Öåe!Ña¯ýÚ4ðĮ̂íÀÕi¬ÂˆK+D}ºßŽ »TÔƒ¤ChQ;~;WX²à‹‘ŽÒ£÷; ¶Ï7.%œ8w 9odNr6v¾i”Flãr¼ÁŪø§UoóÕã”UÝVÃiupƒñáFve6Íò¡HïŽâö{wjt>+oÈÚµvÇèûuB  o×+éøë`­KJm½ÈB.¥R#65oä±É÷W'Ç‚{RÛYOÊð2c.Q3ÄÎýÁ€­Io4—Þs}úO¼XéK6ë2æ­M¯á@i°`tŽŠº–èByo´‚|‘eÝE‘’ ¹ÎÒ–uþ\ET'i̪“ʵEb+œÄçÆý¨Ô‡fm±•ïî ÚðË»6&Ðh³«þƒ ñaË$hô›Ð÷¹Í72ÂH¸l”‰;óçÕJ䣠 c¥ö’äfò=¨;EÌðA Q DŒ¨ pt½…}/ 6$çî™AÄšrL[\ô+á€oïž©e%Ä>ÉžèÍ=I}M®¯´(ƒù¦KsC~Ù:Å0â¢îxpB5!Ps½í> ýcz,Tá ·GÖ*$ÅJSQupEO¯5d÷‰¿ÿfyØKOÓšW&›…ŸµýQÏ&Ç·/.úŸ­ @ò*Ï ¨, Ë/%¯˜lTÑPöi™} ¶”Õ–ìdÎ~*ÚõKx½“äjúIFžŠáBÍÈ?Ӣ߫ ·‰U°N9û(n²COõòg-þ},i¥Çžùã¤ËÇŠYÚÀîÖFØ-QÔk-H÷ :àß“°ˆ'˜A"üÞ6©ã FÆF°?‰¶˜ƒUŒáŸÉŽ X*\Äʹ\ôüYÃð]¯p•Òèíƒ~圲ƭ0Þ¢‡=³6‚µ÷¾õ-kª¡PP´6¹«2‰LOºEéñÀìÅHå^üPe`¯ìˆdó…¯,*ë«òà‰&!©{zÖõXÄežó:†Û} F™kG¿±’ÐZ&·eÅi)Ì;d0œÂ4º¶ol2a#ÖA¢|Lï†û'n·r,^È6Û§51r·Goz~ãTt ³ÚmXh£7âWüf=§@ñ¤°ô¥À˜Ì¼€}€È–ˆó>»ƒâ]`ÚuÍß΂ӕlkë€Àtå;6h6qTïé˦™5Š›åT è&›‹àÄQÁÄ× ©L5Ãö Hq‡¼´V!ÀŠ®)Ÿ|sBìžõ¦ª>KpqåÞÔ`i³lBYÔÀMÌR‘7V‹OVì_È}¶tIþ×ë‹«>HäVZÅýÇ „Ù Ü‚ffþŠ›Œ= NÁæ…àßó” #ª€ÊØy8Vß¾?\¬ÅC¿/+Ύȸ¨ƒc“E² <ÿêð£øc ã[¼€»Á×O¶ñC3 àÔt>-êõ'­3F­"CDÓ×óq-x×»–ÝÄi¿À±-w\u4³d6ÝG  ¸{ï9žkúj³G]JKÌj€oë ±–ß‹¦ÿüрij`kGšDêÌ|ÃN‹:ÌÂ6ÛÊ&´R\wß+J¡,ˆŸw&rªpzfZ}ú-E?¿Y˜äàL‰3©s —qW¥N™wC|Ó¼àD¶^QïòJ赕£ŠÀÔR"F$.™ÏÍ”ýËc,¡å7¶Ø…`ÿ†›îï+ø×0¯m)TD!:¬« Øé_/œƒµÍãæóE£Mp½Fu]%¨äÔt ܂晴>‰õ½ÜWb8 ¿qŸm|U{¡³ŠG˜§žð&«Ç¢ «$};]Ç0³õÒâ3ICòç{Š»NðL„€E;­Ï3-1'òêf£?D ~ºüó]Ø™÷(´Æwg ?öh£7‘œ@è­tS“oû¸6ÂÌŒéþ¾ùéIY_CžÓ>N&& ƒZ´.äAB”_ÂÉa·F©áËÁrh³Vy˜\+ ~x®<pzݺÙÕÈ~pèe¦eö‰›im¢ÑªxX¤Ù³ë þ•¼Cò„Ðf`ErYÞm6ç¾¾íz² šà{Œl![E›ÔéEù a³›žörÎ:Hƒ•%W¬¬O‰äÆ¡è•~ã_Ã÷zÃ2$*–ÆEóZ4¾› ê\Û¾Šý¸Âz&·“8“ÝY5š¹€Îêßù‘ 4aºpùïÒGà ˜… ûý^ð\눯[HBæsâļªµ¥ Aø!t5”ž¾B« ,E$ï©k¹/)Óž>êðöÏÀ^ ’"¯@^ÃpúçuÈIÅ/½eZœ£(`òH°/í2ßh(ç–-gœB„ºEkÌX¦\+{Ž™œx„ޫ֦æèƒ UúFMA…nlæ‰ÓöuE1(³ñ:3k‡ƒÍǸã$Ÿf¶aj‡T^b?GœnvYƒ.«eNf?^œÆ°ü±L5 Œ ?_'a4Oû³ÂzO$ŸˆQ'ƒvÿæheI«Ä[ãÐ[‹$8¡ö‹K®/¯[Õ´¹9u³Ù·è Œ6Ý'eìš%ƒ—|@ˆVšØ™ÌÀ –Ùáø¥L1sÎsgv‚œç°©7r­{wg à{å›ÂÞÅ&z{W~Ûpò¤!KØÖŒ«¹.-ìáÃN÷åÔ'Û{;zã'^ÏZŒ˜éNpp¡æE Šå`ˆÒ0®´ÌàæÚ?4€ÇWôI ‡:—¾d"Š?ô¾ØS”ZEvÏ™¤saO‰­PZ™È7Ù(Þ‡£%g)à1@ñŸK£ûD:báP­Ë0¼ù¹ .]?©ÓJÇëª/˜S5Šõ5ägrüæ§è±Xz¸Ó¥uþ^sß|⢚ìµêŠ‚rÍEëÐÔö`0~uê³yx’ãA™£S®”Õ)‡Â,Ø }ÔȲ ´†okÁfrð-á ×@‹°Ôlö‚ªï>4´Hþ¯°·&Ó¢ÕG|jÜ,èD“ü:#©ÞÔ‹dö\¦Ô‚iX°ÿ~`|57N­÷ µC}I1dH û¡ÝƘ±ëÎRxÉ¡Ë=¨Íë^tq ·kkHír½ììM…©lÀ»{5«¶a)h..:¯+Â>2ô²ÄÞÿª>‰\ í\fÆPl¼þÃîßAñR!Œ(ÉjÈ4í˜4•æ%‚š‡€%å0ÉìBÉÛÿrlÒ´z„Ù(æÎ¨g®$¨ÜĆû¿ªŽaUÑ ¦JŸÓq‘àB°ˆ‡†s£6eWÆ¥ºÆüÊ$Z”kJuUAÂÛÄl Hÿh-°*K7ª2ç ¨KJÝ ì®#6?ʤÀƸøm|³®5æ§="í©öRæ±|J×ví°µïk¼§“¬@/ßRŸÛò¨‡¾Úh"SÔJo_ßäá%HµÊ"kÞC=·£—ÂngPÞuÐã&f뜞ú`ØHgžý´ÂVœ6f’né7šìˆ· 4)F2!Ð5†‘{Öl¡¼’ŽwùFÏźF-z®!+€fw»¶IjøŠž·ª4îu‚{-z’©à¦ƒ”í²w  èäÕ%Þú·NÔXR Í3|y©ŒDliëŽO;Œ=&ò”·Fn€°çÍ»)©^sTÙÔ°à•ÀWÑ[ Õ‚Á!q>·ÂºB\–ˆ[³³âTü5+Š)¶.žöØMsÖ« Aï½¹¯œß¼^0À` 9¿ÊȤè'_âµ§r§KÚ]Ô,]ÕHBöjÐQ‡\|šUcx~ûr±oˆ%iæà[¤G’çUb€c³v²ù*?d;Ul^ ÝÌ8ç™Lê¡'Õ¨XäMS[æH_´Q£¿lòKI±VÖÎîÊ«³ÉPœ ÁCô;Þ¦?j#äS³Ü†ü;’m9›tù&¶ésÈqHr”6þ´§‘s¦vÉ׫qåÿiSÞ‘ð YÕ·²Uå±¶ùÆ•ÅÐðàbœ·GC ÀÌ:î:Ág~ó"ÙÎßyrXW ï“æÐfµ\’cÂÌ å¤5ù5Ìc¾r·‹4^îd»ô§øÍ‰²pA6ª;¢´ýXaý”œEù©á„óSà„¢>¯¤˜¯x (_úþpn᤟ٓèU#ìqUu›A,] ÏúöÛ½½9gÚ€”Òþ¬³T]8AJ®Ì,ygu³Ð¬Ô_!¡½ª@ –ʶR|ù/ßy·¤ 0ïÑËôöŒÊøÐ•š^ਊ4Ìð]=ZcEݸ‹RVÁáz#•}ì €Þ€ëÚ½¾ÖaA]¯«©Råf1âZmzAœvÚ†x pjî±|Óm¬¡V˜{úGçtPÏ„EMªtü ”t  ‚yüÁqGq“$VúZMSÏÃÞÄMƒÕÑM‡xÀ#VÁÁǼ?ùöåÚ1ç²ïûöKÀŽŸÞÁJd篑ö«XÓŽk%Ïb¬û¸’ˆµ`=ómÊ*TUA2pî:—3Ó@¿WäFC}¦qˆY9ð¢Zx^ ðAœø’M´×£עȘÂ=áläv´‹{—¡R5܇,†#†ß‘üú17kÌ Ï'C&Ï(±°Ouõ.ÀsUYT@I<˜´f…,=Ý)ð‰gɪxlzØs¶VÜ{1¹ï™U®ÇiI«$Ã)¾ˆ;è=­$Ù?~w›Ê§ˆ1 %DêMÏ5hÄ4-[a‹1*\ `Þ¶—ñm\lÆL¼¸ ùˆœÛ©&ٞɚMaÅ2”Dù@ƒ#}/’íèÒ$ Pºó =²8„%¾{¿4E<5óAêtü¶51E˜4¦Ò5ðªÁ>ÚLî¬çÉuCÓîɶƭµßqYû9èœÀZhÏ©M'Æp*ï…`ýêxfTàÿ©˜CÒE¾äˆ| q¤Ü#ˆµÉC8²d÷W„ཛྷi¶ŠFG³f¬JåX5Û©¶þEœÉš/hò†1Ó¯*r}¼o(¢ÇÒ¦ó[ÌçêÁ„ÄÌî5wâòË&‰î¯ ^¨Ü2#gÖÔjynù±ÏrIxñÕ"Ež¨k:Ý•ø_} ™î5m‘º§Ns¢݃̕u%ýbË»ŠLݪ†]Ãiš…(¢¸=ÿI}!Zûçu¦ÒÀ^ÝIBsÜDB"v®!,ÌÙŒ›ômNÑÏ…r>híbv„F]:ªΔªóVÇØgØYl]…“°VjèÑÅÊY?RÁ¿FU‰Û£2#í]ž‹…5ÂŽÁèÆþTÊ;ò5¦˜½_ç†;…ãiâÝ ®gË<ã–!A̬ÏRÄa?PAý¶Ã_ì4Ü_„¥Ã¨'Ýâ*ƒßé¶žZ¬:6h ¥• Ump 'bö á=ÝTÉòÛ¯&SX@Á+ÊÀ|Á ÍPˆåT'ô¢þXó[$¨òLÇOP0‚ìE…º–&sQ’O%—𣀋ÆüøìN­!‚é×]©ë–<ØZ«{ú ¦ýri«•›è¾…êý$†¢ >ÒÛ¡ã‰Ë3Q©UájæÛ8/¹¬¾§$DY­ô{˜ÆøJ¨xqÜݶZh; Ë*‡[Å]3@¬ÂüÓ±¥_ÀâÃÁÀï,|ƽ6s#Vßß%^º?HÍ1mÂÿ-Ÿ+0œÕ¢**F1´v©×^ÒIÐ*ªº¤ãwa2¥ÓE^´´=?iÝŠÃÊQL¼£ Ë—£ç–ŠÁWQ=ù¢r4ÁÖÅ’ä|g¼_uü¹µ&É%7h൯0vn:™zmD’1°פ“ñÉ3Q ¨—®Hp™àÛ«êø¹g—ŒÁ˜¹­Á¬Ë$Þ—óÓ›¢ŸŽ ÙI³~¯wAÙ—$Ú9Ù÷_¦Dx(Z /¿íß™*z…Î7wfÒNÚAìÙF¢cÕ•)4C95T©É{QÜeŒÛÅÖ˜÷%Îж©zÄÁˆ~hþË´¨›?O†Ý;¶(†Úq~3l‘’u]•”Å9TðͬþâJå&Mè7Ëã“»#ñ½ù@&†9mñŒæÈn…øõsx½½³±>3!_C‡Ðîúï/€Ö> Ú­áÒ„ª3 Eno3ËAÒX]z–]²ïjØÕÚ6„ã…>`‚îÛêK.íÛC«+6bûÀÿÝpý2奔ÁйèLdDGÝ1‡kl6ç <;O…N,žúÖá?("´Ãv6 w‘ä F<Â7-­xݪóƒcsQApGGcPîZjÊr_¨ippŸ®êþN ­ä<¡E¬7Ö”qSG6{.hÓ¼¡“ù玴SyY°I ¹Ñ–_wL±š:¼Z`å ’Z— rKKŠ·€Árä 7$ú¡ôe‰Éùñ‚×Ê*›µo>’¾•CЗqƒ1¨tÇNÚg»'X¡GšÏhj‚“±…–¿}îŸcú„(È"{49ª¿uÁÉ=„ 7BÀØÁ(“ò»´G³C4Øà¾PÂBƒd?JÝÏ>´]o‡¬ò¸ÝßJ¯¡>¦ä&®ý)æÑvcÜ6\pýŒ'£^ÂÁ?ÔÏ(ùžV³”ž’vßy›F›Ÿ‘NíÎ~_Ñ'D6Ÿ9|-‡¦X$®Þ9 ÷õ«Õõ»oL Y јûÃ;øV‚Ì#SåöEnâU[ñÀ'ß·¿€¦|¶ì¬¼jf |{jÒZ*ÓÌC Ÿ(ɦõáïOJŠbø§-ðXÂ×5†I“†œ#=o$²ãZú}h“-G’ïUIvhª±d|=þ"Ûjp¤g8­˜\ ²«È•ƒ¹d¶1sÎO(‹g ÍLl¿s{²œòÎ"ñNWÈ)óî0š³I¨ÎWôÉ«vÙB³Zñ€QD'6¹±Âp¦ã])0Ú—ÖÌ´à~QRƒðÇrÿȹ¡_WÛÑ]¹†NÙ+•«vdIYo·‘Ów!gŸÚ*}¹RØ\æl¾ufN¼l”lË7X.n9˜×a?;ã2OE‰|—þkc½RX\ú(êiHPbvñc ÛÉSˆ¸rKé? ©ÎšãÇ¯à•²­OF•$>\0É‘‚ø1¶¡Ús)R4œòŽt‘¹•yôhšäÉz$™ÂÚ¬Üz­*×Q_L>Æ9R֓ɤÄÚi÷ŠÐ×*láܺåï|g£ V§°ŠêFN °r:®È2^úEÌË(;¸RZW0˜.Á©õ³š5µÙþÉÝÛZÕP=óéF _Kº[ÄÏE8®•pˆj#­Câ%‚ç”ì9g˜+¬—\ŠBçƒýh³‡L jŸDg °‚{ÖkH 5CÉ2–{.qÜcÊÛ¿ÙwvãHÈ݆!Ëæâ0Kdžx†¿‚ÜJBuÖõ[,Œ±N7G’·õjdãbB¯1èâ|”7˜£LR\j°WO>ª[%îÏ^€w&¼“YOðV7Ùþ%35²ÓEÉ&F½ÒV!‰GõâãE6in™3²±ë± û¯Sáɪ6éÞ"(7°]‹Æsk†q™tKŒªw8ñ\×BØO*ƒëõ«dǼ¦KoJî1¯Gwl\)$Vå’W„zzt‚©+´:¦µJ³AÅy‡[ƯiÜC ‰Op±”XÓvbBõhvX©óYöÉë|0— Ü3­ã<¾ì·'m*Ü{#yØá~Å¥´¡>Íúà,!¥&¯”„ëåáÇh¶ÀkàK¥„‡c±;°X§=Öy¥½íæÞ}½¹KÊ‚ˆÛÙþnqDÚa¶AÖrETo Áó\¥ñðJ ™·’Í#”]\dM‹ ‰Ý|ˆ“×Gå®/ l%@ÒÂ%d7 žzìRDV/–-eÊ¢:vØÒÈ×CR²¤k¡²˜áù*nè)þѯ±øWˆ'åw©¹’µ]zOœ•FÆËè_ÌÒë.‰zam“pè§Q1gÉñáý¿…ÉæAÌæçÌl5U•¶`]ÍœÎPnÔjjãZŸ'ò‚`¡fšÌÈ3%⦭œ s‰Ó­,TñéñXwSB¨·G§0)¡U¾€¾y“XcÒÙlÉë+‹L6ˆQ¼@*âÕælÕ´†åyå±&ìeG3–¢u½ÇZ®ú$W¢NÃõñÞãméǶ&›<ÔËnÉØü›:s×a{AÿnæÝS‚P&ŠÅÈý$b×ÑÍYX~Ú¸æ{Ê%©Y¸x5 Ù~GîçrÀÇ,—+HJ2ÍcéGáû¤¹»Ð] Þ·£!£®HæcS0’о3ï¿$-L»à&¦˜[á}ÛTUzÓ“Èxàäp©ûí ¶Ô¶ÑEÜ‹·}L)«—³+²m«0¯@ÓTÄÙg Æc=§Õ§Cýcú=üBÁ˜. wgiÜ×PrØsg¥ˆøƒ|>°¢V,—De†>ßîödÀÝ€’ëÄc"!lM´rn:åËâSSÈ2nOÉ4ª‹3Fišù”WnªÒüøXt^)F¡øhªŸ†+l/ 2Æß!Ž{*Þãi)¹QöJè Š(Ö¥jnRÈöY¦ƒ<êô¡ ±‡SGŠÝËáf8ß¿nŠ`Ú\ÊDfsP¡±½ÚÔøÃÝÉãâ»fPtÁY:>å?ÖŸ.¿²…Bç¨3aÎüºß2j*2÷µ+–%FÐà5übŽKÂéf±·^ÈwÕ"rxq©%ÍQ|0ˆºQÌ'×Áù'´˜°öùß«;ȪvæDOóÌhn¾ÅÕ_Çp á¤ûóÅ/÷øKj~=ÿGÖ³Ãzw= FLÈWÄ–’~¨ðc‰!æ’:‚O©ìIJ¨ë@r–ÿ*Ÿ5 ÂÞ¹(W ¿BÙÑYŠ´Ý«FFaçàà«yœP'u‘È¥ Z&ä«€ÚˆUiáÙªYƒfѪGmrý«Þ£¨Ž+D(IÚ-ì‰óñ¼ÎAGiIÐfxíf°vïÊ—mu˜)ÌHÜSˆH·Q¨5=]l•¾¤™â¦Ù6ŒŒ`–ÿá¸Á%¬;+0>ºK{Ò<“8í.™u¾Vµï ËYl`™‡‹§Ø4„ƒòø†áQ»WÚ_CoÝr›ÅdòÌpaù ñž‚Ä!Ù¯tÜŸæ9ÕœèjSRä)@7÷È^Âä¨k+¹ ÿ$f ZøD`ñÚ²ÝFS˜žŽÉ}ã%‡šëw¤Š‘&™ë݉å,‰&U$~,ó}uL%}…l¸7>~ {kÊã€têýHö'y [H_JÔ«K¹¾0³4ÜG–ÔUo"K~'Dl‹ÕrJoe‰G<ØQ ˆö¤ÍB1s²—wYPWXÇ‘A†”ë5†;ì‚þÇÔHp Ž§§–:[3µ[Õ“ÒµG¶5Õ8n ðµ¶_ÔôF@Õ]™Uu¯DÅÒ«”¨"L’ÃÉZnvÖ #¨ÓŠ-ò_z/»¥Lð¡i˜J…ä¨(!jbóä`(¶èÒ\dƒÿO˜ŒÝRf¯$¤uþÌØð k¯Ø[wr Y#_‘0^Ó‚Æe¨!Ê9mìÍÄ’,€Û%ê’ ȳc5I¨Xû·x‘7$wx“é,KÄ™0ë”<¾‹™]üãµÁC`ªPbnӚч!) …m"Ͷæ¤1°¨¾!PèËr޵X*‰EÙ{›ýŸz§“ÄVs+3ާ[XÀe[FX(…r0ÕÏÁüf .ÅV¥zŽ]*1½SJÂŒj ø63ÀåJ Ë$:l*µ¢€Ìݼ¨3ÊÇ–99¤<«s þ.³¼RNXW[ò£÷î|K€ß`\†6!vÊý’ä9 Á± dÒ……'Ý‚Á⨟ƒ½@ºé&^¦ºù^@ ´nT½8 u²‡ºòXmÞÖÚÇëý)!ïÈyW“X‚+sNü³Î+`$Ù³B¦.ùQ²H@æàS9qö„§ïh"K˪½œÆU.‚6Xô²©æÞ»Šã§Ü:齩tDó³mxÄ]‘W§‚‡Q׌MœÎAlù ø\E±ÍívYUé_*íIó^$1ÒGèmn[C(¢„ñ>-r9#‰$'¹ýÂtöw¬Wç¿À²æ¡ýçñ„W+@pã çå!C˜}dwNaƒài¢UM5°«ì›B‰ 1ÃÜæåøtΤ­e'iý»y¶†hÎwê±ï)_}?K4‡¬Ûè:§8®»k•ÊNʾrs¸]SæhŠÁêj–s2zÖÑçXšÑ¤_h§}{Ä©œ»¦ª?˜2ß2UÇ$HÑ uû¤] ³ÇAýÿ¨ ¯©åºX?‚Àñ}F{sŒ©]¼¬$c¥¾¾{äŸbr ×ì6ÃåÔSìíþV‡£ºõ uP‰D=€¨1Òuî£Ï¥—dìÍ"!}ñ°¾õ4h}IkߓۛEÓ{Dd¢‡|1-F Ù”UP*É£T@l,Bm!Yˆ¶Uk<îxÑøÆṵ́ ǪY¸ŽÔ0SS7„f ²Ù²ËXÕŸUP,_H{ᥥ%ñc¦_€0–>²Æ|FÒ¡MŸGj=A¹DÔ‡˜õyLEH‹¦Þ醕0Ì@åTX+|ÆÀI3zŽÒ5@qj-ù~ÙI$" °˜`XÚj¤<Ø`òw´Ü3¬{{ÅbŽ0|tÏ—N‰G -BÎÞ@U‰Š»Í\;º ºõ—“ ®Ö›í”¦ofq›»híÛž·â1ã[KyÕhpâñ+ šéòè"̪ƒpÂڇغ˜•:Ôrà‚õ5涷Ȳ͋EÆU²¢â?HÜgb°[ê"R, ³0~ªë^ùY¿IîPN›?‹Þ;yýáR„û4J¹·Y'n3Ók5뤘EË¢”(Ø6É mx7˜¨§ ö”³Ê¯/ED¶ÑÁqÙ”‰7PY©†¹6¾¦>E©5Òb4§œ»NÈßEõöÉz·ùÊtaHGëbO2)Oho(ÑfŠølL1e ¼XB-=p[bFAèxgS:ó±™Ñ¸>†°U“åçÌŽç ¡¿øïÏ|Ý[%çþwòý;ë`yq‹5"×¢Seú“ƒ§— Œ•bH3Ù”æ®[6Wáé*ŒQ•a¨A(üu’<$µVJå‹ò úÈ%0,ZYtæ`v>,£µ(ˆkNÌ´ˆL¢Ž /Û†±OËìÑmHxqë+¹®ý…JŸ “?ù]dŸ=k’‡ZP ¤Vb}¼ê‚$`ânþ2†ë|IÕtg’zëºâF¶çèíQa™hä“afdÞs˜ Òµ!_ÜzAßò?/ÅÜÉR:=ØÜà g%Z+áK†FŸÐüðÑ'RB9`´ÐpeðIƒ}Yêòf}?qÎn_Åú­C‡“\ƒÅÏ(W|²Ì|nô0d€±†‡Í~NZ7ŠQüähB cWQ¨æ±ãÒâÜÓ~ä§À¥ @‰RÏ*BäÈäøSðR´yÿ ýG%b~qpä½A$ H¬Gj$M†íÖŽñÅÕ9ÙÀj¹;øDÒ–G\–A.ë:ØL6âe”)Cò·¢¤#'ÇrÒ.r]âJ«¡{Ð_"ž³ÄãÕâý1³Ãå§iu¬ãÛ¶šP’y"æ ˜`w.ƒÎàíOrÁ–ïM¡Mr¡É'cÝšvDç's@L— ð±Ê)æx61U Ü=&Ãð0†žñŸ"ï*n·š"ù`“:9’WFÓ²¤'‰/ÂFçAs›*e¤Å‚FöåÀy¦¨$—‚¦‘ÅÞ¹[^3ÕPÞ–¨ Ó/!35§ý.GæÅÛÄïx+£\”¾½ù¹9T‹ÐÌ´»¤Œynf G¸« ‰4kÿnf¬± ãŠDº¯6•´v¤›ÁÕío«•ÍÕ›K0™U•æbÆ2iöwçb2ŠÂEØOøVÐSÜGÊh™F²Ô&½¸“S´ä°ºkaŠ+ ñ5Œ=BPýxÆ,ÚÇ;&m.ÅšÚ øƒLƒì÷ég÷=µêrrV"»Kƒø‘…>Íf5ŠYéX3žl#­®6l©9ž>[W†¤Ù{@|9°Jâ×ñ4ŠÆr^Boõ‘½µI²œï°ÊÖ“Þ(5ÅrÚ12_½dçaK1¥g®’ÛõFrÉ6aÚªñ¡˜ aâµÀ ׉ã–K­t¶; S}&‹G&Ê®¹œ$gBî}NÇj%P?Á÷{c‹yà”û/“°F¯_©²EešÈoÝ:QM9‘¼rÏÖ™yDG–JRû¹ØÿËo‰õ¡ tó4ícL…­©¼R÷hÇÜ$áS`d_b”ˇ¸'¡ïÁ£QÚÉIsµ¾©ñ?åóh%e5«Ô)jŒº[ÞÇš8ÝŠ.³Úc£&-ÑKŒ¦Ž*|å—2kð¥ŸàWË;”,I"ÑË«™6š\IÍxu²CónrW8O“ cݪ˜èÀ±NcïŽ ²ô{~n³”Ò^Ah žcª´À?æþWIe)NPB¢`äNÌ7SW–䦘J1¸WÚ(æN±«5¾ö¡$xJ"Y•Ùt1ºIRˆ"bõì|Â/°úë2Ÿ<'‹²ö½ÞÈþx·Ý •*4èÏd×YíàÕìú`W¤@7ÿ5-l5¨‚Žoöˆ²C<­ï©5¹¥NW|éÔù(\ Âéí²QrÊG«—`AzùP¨ÔebBÖ.ŽœUê¿Áó¶F•Êg­á–OØ_®+êÅåøfÏ;H¡ÆÀµpCPuq‹ª;®DÇí£S,AêSG}e`*YßéC0õ(‡Þ|ëÅw; 2Ýûéý¹gjŠéðV ®­&ï¸hÑŽØÍôÉÏÔ{­pTœë{Ôíèñ½ƒ2z¸Â]kCBc5(<»±³¾êϾ¨1ŠÃÖ¡3Xˆ3›’/QÙLám ^CW©è\ U»Ó×WôÉãCfíÇ»CÂ\€Æ)ívdF·Ü<%OmÙâuHDÏäͧ¬q–NëEL‘þ{ÇÚ†ðË8’'Ç!rè…‚a?/¦êA½µïäŽÙ‘ Ý~U<77! 'ÞŽ×.`’ý¯O¤+Ì›Ô úí6¢=y¸.hïîÄîd#Ï?Z„§X}<œ“c“àÁƒÃÅÉËHT_ãè]3DÉæHïg~¿\ùÓáHõ˜Ú­å@eh-äïLhßVò%g%QH »XZëPbBÖp)p±“p;–xþÎ!ô0ÇÚ¦’”š÷ƒ±÷%DÁ?‹`—/í,è<‰}½2ZQ¡'„–›PR;ÏêÒæ?kÒ¤7ÙD¯$ºv¤–]©šIgB¼†L/S!o ë8 +9„¬³ž¬LØkæìÎbön©ŒeEH ”[aÑÙ…LÎ-iÜà4]y6‰È…î’w˜sÝñѱ|¿² Ë^m[Ç%:54CDVQSè6eÎmÀ\‡–«Pr®g².‚æè7ݲ^–FNÁ( ê±gd•J4Ÿr)ž|´A9é‘'®¢ôª)°CÚË:¶0¤Áh©jŽC="b‡l˜8»$Ùd ñË‘Í#Þm¥‹jCÀð³Ð;,›øú tÓM–ö°%r“^vc锑{ï}'D¨Øí‰¶ÕÿW›h¥q0UÈAkP³ðSB›ásLôÜ%ÒôJN æ¶Aô úŠï8ŒÉ»-Q´d‘F:æê¶4ê„ú¶Q¢–1A²Ö­íÙWd;ä /*°7†5cã^»ÃùºäµýýŒºGàj°c!•*‚Þ†NÎW›t?Ì1Ï/1g&ìAê·×dÖhA<ØÛ„ç„ͤ®³ó£1ªe½³—òåÝ翊XSH Ž.ثƎ#‰qJ@\Pyf2b‡Pþ?&nÚAª´¸TÑubóƒË4öÏ*H™–Jlf¡ jW÷¿°e$8ÝË9'i°ÒÝ•²–Ú„»slöx ïœƒÓ~¥8¾c—Fšy_ÆÀÐj—0] Îm Õ©fÒBk²ø’ÆÙ@¢ …X9w8›‹U`[¾«Íé· Ö„uzb:âËÖ€Ll&¾5Sùªg †äºlÙÁ?T?tÊôoí%rã…ì2Õú{;md^êÞÆ°VÔÉP+¿çÁè¿ýçŽp@ (À–,™0¯uôÌìÑMv»%ö‚·/}Tï Y÷¡÷EÄf:± Î<&4ÎNø ]®f%N«iØÕ[8ÁîÓ“Urà(„’aRÅ,X Ü”mÕ¶Ðåk¬`yé´‘¬ÇÓÆ&W_fŒ üûE‡Î1îG&(ím›ñdõ¼>Ä”Æ:° ¯”™oj ‰Šó`f7?à’ÚmüyÄCø¦\2Yé¥aR 4.ÌfR6옆;%2›YÙdÌ@ÙɤíøÖõ¥¼Õ]/-Ð¥k´/œ.NVKíxTãÛY~q9‹{;ôY'«‡Ï€¾ Î5ðŸ»,爫@vý*º×y‘äßD³¦ÛØZ Ñc> ÝZðL"(O­%5ÙæWLTp6ÙrMiæw´% #¾-Í© O:œz˜~Ò~eo…¥·¬åT ³¶«Þ¤B P_1©…¡fÄ=˜ðÂ{îþ›˜ԌÈKï©Ï¸ŒeÐÁ̜ݶY“]ÅËVn[ƒ T?YN›ð…¤ìÁ¯ÆœÔd5°×É›¨\ÔèÔ¸>hùZeÇ7ûÝ |9.;ñ7¶ :€é¬·Ó @_Ý=¤ÝÆõZÓµ©²¶úòsf¯ÈðÆOŠÆ.g ÁVeT ÙNìM6÷Vò¶QézB!¨ÍO¶ïŽÓÕ’ ˜­ÀÉ€ ÒŒïH»Hžð¾øWŽ‚)é'ì¬Õû:¸Z€)C¦ ¬U‰jѯ}&,AlA÷‰›9û¤¤'À×D¶¦ÓvX&ä-“—<Ü:iŒì7eBÏ™±5tOv sð„}’í»4ë1rQ–¸$™œè‡*†9ÃT¡)Y šÖÚ¼Ò'iË'ŠJ¸ßçDÔõ¸øÜD\ºV™‘úúKM&Ó{õ§>_5ôX7; Ý•ðã4Ã~´—BúÞY+=£§–¦'ƒ°¾ÛtÚ)5÷w§› "·«_£‘’Aî)Þµp Dš^x¿»„žçá,njªL‚]ÿ8ƃHqúŸ´“ßúo&¿¥\åknkmSjØÅb*ðw¶¦N/”"3LøD~·˜N9s#(Ù×øks8äùåƒò£Ñž`'Ƕ½Ñƒ'(³«FŠòó;‡›Rû9¹JÃm¡g-hïfŽßù2ˆO]šÛàå¤b§£$ aG+œ}4ºšÁ ®õëy¾¾Ú4÷bÆ­Æ=]íȸpàÚ,›ñnËe"7Ô´áô¶ LL·4ÜìÄúŸ)¼`jŸF2¯õù ŸÍ‰M¨i9ëxÙUàö(sH6}J€á¢Êך¥æt:ÓÅpí¡Í:©RlÖ~b+é2, :¥|7v±AR^•oZ »ïÌIá~8•õà®E¥´ÏvOzq{¶‹Œ‹(´Øƒbñ«4†qØõë'J„£UÈÁì ”²ÁÇU4HÒ€3IRç–1«DaGC邯às;Ò*\zšý¯ŽÜÂPj£Œ}‚1[¥âÓïÑlªÎDÌ>pÒ¯I«¿ Æo¾Âé–£D^ÕãßÂR‡]sÆrw Ì.†z<¬Zã,á°MÜÜpIš£k‹¶ 3y‘L—ÁÌ‘Ú]ð³Ò=ŸµI=‚WNðv††eÏ^vçgÅ LB!•Úh–~{m‹š2SŠ;M©ÕOi¥ñƒBFÉýˆŽAÍ‹xÖ2*mßý´ :}ÐßÃÞe¶ñ’ŸíZöVÄ™z$”wÓÜ:— #ÒKü> îrßûn÷{?¿—Í~}y„cz<\­ ýA ·//|J>–;GÃØG€ARh*í&—‘~ðüß'¥óóí½Ú[äÊ—Œ|È€çúx­HµsùÑÀÚôÛíª½X!Ç¥â*ØÁÃÝTI|‰Mˆö´ÍjÏÎVá™Aû¥$çpo%ÄYÌ 7£V†šßž'Mtï¢ñ\X«XƒH¢¦w‘À3l·×5Øp!påZ?!A u/¾>¼­ÙjÒá ]<Qå”+÷+ž’¢ozºC¶¢ÛÛÞ6¸t&½Ú~Ku“]~!Öÿr$"âí]—3ðt‘óJU^½~×éÞê¿suä=U¨ºx§hβN¯4ºŽ(¬®÷e×3» ¸4Î/·Ú§«2€—ÇwÔI<²×J¥ÇjqrT€Ì?car–) †B‘…!Å‚oÈÎrRÿ.µ×àQM}ؘ hÞ,B0®×b…øsM@@Qy÷P¸†é(Ïø×ŒuÓ ÿdx¯G:Ù êCž!‡³Á™ÐT{ãäàüf³Ñb9’?(m \ÃÀ©ËÖèHø„îåÅnZ6Oø0eÍ‚w=Ý<Ò}ÝžŸ2’ŸÚÖL/âþ±ÖC1ùñ{p¿:œùe–ý9<å0:°lبù¨H\¨/ÕñÿŒ¤|ÊÖ Ÿ¸ü©4‰|ÛDƒ.ƒgH¶¥Z õ‰)÷GvrM­Ô`/FÐ]E-ü­K»í¯…×ù3‹¼ú%—Œ¦ÌcϲyfyóŒ‹ÓÁ|òßž½· ±®²÷O±/M›Ïû~=\ýŬãþS"Úècí¯"5c‰Ëù¾šüA8ûo¾]#§É•$Y_>ÿâáÎB:ëïàY¨sˆN@íŠëQ,úF׬bˆZ ØA”ã´h—[«G߯ Iföcl:Ìç :‹Ñ=Ô p0/#÷”ªÙÿùžà|/ýD‚…&˜…ÓâUSsê|L$JI60sªÂ°Š"ÃÆÊp¶îB£ü6ÿÿôÅÞ}8Kr'Ú,Ñ€Óø~"ö‘éåäa½ÛóñÔZwÆXW©ä ;V÷ÒxgGeÍt Ö‹{¼}I *ma‚¡ÊëP$}ôÉ D êՂܳð¡ó˜¶o#Õ¬ío%RX¡aÓÁ‹!zæ¯3™Ç»†\qôŸ‡GâÍÏ5Ç¡NM½[ …*œùª²Ñ`UãFƒók¿W4ÿㄼ€®_^N矆!dó¿cò@=ÿö09=Ž6Aò;õåËvxáC†b°ØûyÙÔ•~¾‘…†ž<ä¥à“Ù-­íäy)ù'Of¨( x&bƒÜ^[y3ry ÂÜèþ ·Ü(ãíÒÂì^…Õ¤øê'z® ŽDÜÇ*lñÏgÞúùú .±G9¡gƆå¹i«ÇA”,ê–›ÇnžµžŸ'k’ÅH/€†7=þÝO¹ýÝ]ò¯§\·IÎPó>}7@/ÜžÞŽÃŽKɧJ2©Èég”®<Ž5ô PíÈáŠ'7‚ŒµhŒMæÐiÙ'Dò–) ;ˆé²ºT/q«+Ó6BÛW@åŒDå&px—¦ššš -¶jô -º§GÓm¤¢î „ÀåêÍ´#¶¹ » ¿@MQ+"GÇ÷ýÀ+¿^ÌW$ù·Ç$Ѿ4ø°ö"HA Îj›CÜ:º%ZÇÖ ? lW§¥ü¨ß­ù[÷Ùo è| KÆÀv   >Áˆþ8ÓÛ´ý`µòž{ïÍãAã?’ÇšXN«‡ ÐÎ0 ƒTQÀ«Hù ¡¹,epU0Å9‰4˜lÊP=ù.Ð{/Hä¾Aažø–?…5*q@B-¦#$Dëv÷#½C¡P´(Ü5ˆmÇÎ7ª Œ%v"›H) lù3)}eP‚Å1F‚7ŒJg¼½'§@1¦ÃÆÔ³XF ×ÅD{‹J44ÃtÑC–ÑÕk:”Ѽ#Ç-hqK,Â/ÛEˆ|ÚÞ]BÁ]$8…Lƒ4H¨ó¾äê?tÛ ¹ïzC¤r÷~oo®Œøçµ'¸Ý>»@‘ç%ß7)þÍþ¦tìpJª¿î59«v!JËÑ#a?VY¤>;C\ÛþòŸƒvêý7Èñ­ç•¢I6²â¿ð›ü7°]¸§§ŒD›mX½½Úƒ6 7Êàò¿.9VÚ~ž<Ù¢ƒFôP/(ËàÎkk9°!Ɇ2ò ê r fÑžn©ã!:Épâ+}9ʈ/­¯8Ô;Âyƒ>½íÒ±Ú]ꢅØ;¹ƒsmÝ«,{ µ ¦KíF™’¡¿³¿êõ\óëE¥Î`v~«¨ð¿é#]pSa+Y"ánÀsL^^§§Î?ƒNçç²Å½F¡E¥?Z-i㧈Rþ|’ú´:GnUV Ù’÷ÑAúé¼x±ÔЦú¯ÖG:ýf7l-%þ~µ¦*áDv æÀà'ÿ]²²¨W¶ê»gf¥dOu(R§Ì9Ôü©êHÐÎ>°Nƽ2>N{kùÎ@³Æq‡­-ad£Kÿë/Üýsä>Cúq‹¶$sÐußž\ƒT‹‘G~‰½^Ü9–õu-㤯Dxæßq…þ#ÕèÃ(ƒo;î*Š¡ÁpêÄ5OŠl’¼´ç(Ë¥¿7Á«•'’ÿr~.&Kâ™=Œ'±Jq‰Ø™ªïQ¦-üQšî§îÙUÑ¢'øÐÒæÇ…äOV‰tÔ™0™BÁ¹F¢ñ½'æ}ââ Y:NÜ]ǹ`OO.ÄÌ{Ë¥glMáˆV6@ ©‘-ºû£HjYû2x´ æÍC–ë¦'¢2NáFò†c›Ïžé>Êy%þ ^®¸ZH ˆaÔ¬´T¸O~ —ëÈRâ¢ÈˆmeGžVTì®,m@6É#Dq›Óy²ÿð”Õ#ÞÕ@¼ô_’ åSHnŽêÉóÈFª›uD„¥C.RÀ9ÉK«GL‚¹F§J1B´q3T:ÿúa…µ\ e ¹Õgâ íÀ‚„–P† hÊ‚'&Aï¯ß ¹Á .>¨w@ñ_†:옂WÆfù&e.C ÊF¬$µÆ‡ûùHX)?W“éy*)œ89ŒÐ˨UÇö“lâ$™˜…EÔ£Öq²ƒ´=­; +'VaË}2mÅ&=b䕿[R(Ó䶪“ÌÒÂÇWÔj-a™°€xûòt8N0_ÂÎâ¥QÅœÁ²hv$×¾Y+Déù6‚€ùq[ñ #@|#3»×nt{·æQrùÓt* ÙæIêã÷tIÍ'dsƒõ|tÊÑ"íéügãÑ]:3iíΧI})^æ=÷û*"=‰E[AʪÇìð Û¿^G_-{ÙgFuXw2B–¼ÿ:Ž,µ` ÄC¨j€Ò«Fûô¤CÇjUG^RÃ>KSDúá0’½B æ’âvFÚhóJAý`ÒÍó#®ðý$f–œõ%s¢& îBÿT"Êñ Yøœ-8D zò¡›W‡Ä4ê:‚ÕÒ@[äëqîjIÂóÝG¥Z¡º[l›&÷köM³7CøEÔk\U#”¦qõmðWÜçs§Èk® Ÿ„ÀêÏB¡·AøP >~rò/5³bƲÞslsßòìwz¨hÙñh:žˆ-¾J´XoÉØ»/MÞŠx¨¼¸TfÖ^ø±HÉÇs«/UßîÂä=í-­#»U7/>eQ»3=Ó;ÿˆ¢‡Gñö¿c>Òªv‡=Ff¬yAò`&ó•)9ÕQBâæÝ²VOª?ÜŒDð/Ÿ«‘Q7󦈅²êŒK™Æ™jK^[cüƈ…j2IJߓs @¶7 \èƒú®!»zJJb|âRÛ4¦Ãm¤„] …"XQx7ÉJrVã*þ)PÍ[…ëâ?m)šÞ×…q <”ßsÊ’ÂmÏ%ä65ÇÑì߸™"Ê? vk]îX Hg£<«Zpe©ËíÀH¿÷m6 T“•¯¹ rû¼£pKÉìÔFÎ'Ú¦Ü9 ò`‰ê6@¿°-ûû÷s©*M+B ·q¯Û;N¦Rd5«C+_ÉDusöD1ƒÑdŒ2ÉD x©\èZK@Ö°g{ò1BÁ4˜õ“¥ }ç“î/”Äà?±$~å^úã9Û<·Vª\¼ÿ+@ÍSkç'y‘[?¾ÛÙ ¦ÈÓl@Ì.¿åqýZ¤-æt²Í#ç†c¢2ÝʆêB®îƒÊ­Lô@íiÅYñ©ÃÆa£ÔÖlp¦Aª b|3ž¾? Qû9Äk¯”a‘Cq¶‹Ðj¥¦IÍÆu"Ðw…<‰ñn¶6I]D^!ø¶žð‚Ã4aåO‹;¾V¶é3ò*lÝöt, —ØëÊ*tÒŒçF7Cr7b亦¿LàJ#Ñ™Ÿž’ëÎp·úPͨ©XR`=ýѶ6·¼¤UµáäïtíQ¹”HΠµ¾6Í+ÁóŽ —ê\¼Ö[iÚÇâ:ÉÈ8ŽÌ*Hú´­ÖPèð˜UÖj"ãTïä£Í·+\[&˜<;Ãfò7<ÕößÜÔDséëõß#ô(DJ¬&9h'À Õ;7ß †!â]_2ˆ±ê€k»È{ 쇋>ʽ&ûºcvðGšV`hÙUP‡˜œvSp VX*.êÇj«GÅPgöPœxްB=Ð̉'£ÕTjÎÂKñKÓ„/=Ò°‹’Ú„8~ÍÚ—ŠÒ¥ŽQüêPjÔbL±2Ûè©J=vÛ‰¢%á‡Ìˆ¯¡ö7½.PeÒrÓ,)7Š,#X&¼µ:Ž® ²C¤òïÛ;#e+lÂ1¡&Uw¦x: óL-¹Ðã< ç&D4á‚êY€Ïá¶ hâv®{Dy 0v1]Ü‚ÍÉ\ylî/†§RÊVj(Ÿÿ7¯ï ï+ÚÖ¬Ö¢×Yã&+ÌA¡· fúYgY&:ªÚŒÁ ³’Œë¢îGxÜÎ-àœÓ4†X¬ž´ œpGäÓ†¡Ö°54 yS”7ô}èðÈ7y›¤Æ²†R‘µáû,8oV%õ‰ü‚L#"+~x„ùie‰‚Iä¹J&Óõ`›ˆcxEE¯/œ|M"}?.góTš>Qc³C`D®ä±-¼½ðràã„ Þ•ÅG—¥—lÕ»ÔÄ.B¸1ã=t›XÒßDÑ8#®‚f›S[mí¹þƒˆªVõ{8Û«M"Èed³¿ F§Ï1רÜjyP Y5“™<}9¨çÝϓּ5ôy&ÑÁ.VØævÛÆUYŒÚ¾}&R¹LRð¢ëôSG­Ü€²Eš&iªF[uç[,dK«Ð㕣ܻ¹A£Éµ…ß:NšêÈé(çºL‘ÊÆJ·Uϱ’/Öi»ŸŸU° Í*xo‹AUÝ|s°¸hÃ8†ëàš& 9—DkË@Àg7lg\¬s8M ΑJ½ò€üBc(8çrø Š‚üÉnOÃJ©Ëöˆ¯Tå„XZÐiC=~3É=å0€Dï6ð®¢áˆ¹Âzªyćœû ÁŸ^ùrú%ÙÎg}Ò # ¹DžTh}%h³8,ÖÜP‚Êû¹ïæ‘E¸ãŒõ(öbä͆¹û4C áLÄŠ ¿±ÞñóôÓy©^bƒ´qªøf/’ÈUíp[{ø¸ꄟlÂå$%Ô¦2ôñ¬´y+¤0Ž“TÍ×lØŒ)}ˆ×º¤¸Xˆ²^5¡œV‰•èn<‡'½––C«v tb2eÁµº–TCòk¦!eAP±þ\kSÀ½CùÈö7|0b럗+’[4»·á¶L­eãu÷°3!ËŸ‚;ï&ãÈ,LÔšçŽéóC‘Dª”‚ŽnxŸÁR"‡mns_÷p›C% öiäMR°£1½šÇ Egt+8hìí«¯Û~ GˆÂÃ’åiíZ—SImjWæáCÑJL@¦]‡iíôM¹½M¹wŸ(åÕ•=h™r, *ìjªl y¾mu”åRgKÔ¤qß«§À¶BÔI‡L¯´è7Q5(­C#ùFûZrØZ…X8’)R\9Í|(¹öáLŒ<†J^’©—‡¯!{ΓM´"cw»˜hª7:®Æ$‚í+>>'ÇI}¢-îúåéµ…È׺[y°ÉÎ[4H”JÀË#8×ZÍÆC90+ˆÇú¬rO÷“Žúçû™—D\6Òh^2Qâ$^ë])Þ(Óxéâ”G 2ˆÐÐ9uiÃv+lP!eúnÑ}C.íESù€n÷áèoÑqoßíB"kþGRÔ§©v]SOPjõå í«šqF†z´.üªì¾ñïïÕlg$ŽÕ çÆ=<ÿåÞñ¦™#Bî¹ë§ÕØýP*ßæO•¢hûóøÅ™„àt æ%ß ¯04 ø¥Ðái×^9ÓmZ2«ƒ½A—¢+ª‡;Á|®H¿L nÌ9ÓØüC„á0’9ho#Ú¨!¦[´p¹†  dz_î;+œô'Iœb6AfÙ§À,m¥g+u XÍOÎs]êÓ£&NÏ“3ÄQ®wØÙÎ@xøtr„=Í €ZO¨-µ Òéb®ä4DmRäöðVH¼S5Z„®N™8Ƨ¹™Ù'™FB Q ÔtR··{E³"%1xXlÞQÈ ƒ:¥œ•¬”ñ ébE»ˆz‹•¾~‘TáÆ°ÝBdõ6à’ùLÓ3uß’-͹®úáÆ²ef¨ ‘‘¥ ±ÀÓi»ŒB £|ú×€u%@uƒ. ®‹b–9Õ¹ œŒÌ±€ÆNϪO™œeCÍž"Ò4 jÁc¶¢4Ñ´ oñ•d„i•nF¬­ªJ£|ZîØ­HeP,ËbfU·vkŸŒQwó‘2>!´˜‚hF¦›+[vT<ÙxQpˆ¬i:ˆãÏ-t ê;ZÏAÚÖ³HÖ±Üll<ûéÃk·†¢Ë¿Úz˜¦„°b¸™öÊó Åó9ö ÙžVÙJ;‚:þÍ¿ÔÛ垌^*Zw¯K¢ë¸jð䟼v7LòC‡Tiõ80ñÖÔÕÆ´æY#&íT ·fÛ¥ÊdfrÝè'oEÑf‹d#Z0õ2ú Z§Ö]U@A¦ÝÇùFï´ ¥jUç¤àQŠÝM"BáÉ[lÐlÒ®èF½ÿÄšndÇwe4b 8'fl‘$澯§gÅù0€Ÿ=Nƒà¡ “þbFkvF &&!ˆº4¼¹[ÆgÑŸV­È8g4.Ú¨<»x½„…œ8¦Çr0!šÖÄQ½*Ž Í¦Úëû‚£Ù•09WG°Í7êŠv¼åy¿ú;B‡ìÌm²B,ƒk­ëzèù,Îc2¾µ-ð0'yÔb%Ç´ºÀÇðã ëÈ4~ß§Žaú˜5á÷ªžØ¹Öžâ "œÉvoÁØÁu‰Æ€¾ áʰ’^lö–PöG¹0þÚŸFvÕÚt~XŠg?7\Hq{ˆSØ7´YY«E´¿MU8pÞu ½ƒƒ“Óªºíƒ†¦uòsf×þ6V;„”­Ž£%ÓŽ¥6/øi¡åÜ€s@=žˆñ×”Á7ÕbP úIº*…„àÛ&ºéQ8üÎ[K•ó%EŠTKàÜ¢½þîj:½NA‹â®k¶AÜÑ-GfxëFŒêËKÞaܳh¥ÄêÛN†€©%Yeõ ®½vŽWjE¢+sž`‰kù€—Dh†).¹=è…Ë4%JúØoÈé'NS_fÔ¸I3d8úb)µÊ2f|æØcl¨ÖUjs<ÖuJ@äXþ­&F©JéøVÐ÷v¼È¼us‹Ú©ìd}sUó¹5vË©QªÒñ[6rŸMùûúa™Ø(!·GÅš<÷ð­¬{!iÉ{,»G“¹°ëßå©°uˆ[ünN»ÁÿÉ₊r ümð¼²ômñ­Ýä íYóëÅø¶–9b-ðýóδ<Ÿ¥ÄÄ ó~ŒÝéÄrñ°מÈzCئ»Zd®8ÆI:""0Ù; ™ðñ<™ ¬«³ŠLÄÝDÇ*Å ®‚[¿xâsÊhw)øÉTÛ0ꉕ€uƒ½YÃl(9mð¹&kßG­Ž[c8HìÔ«šw·Èrþ¤´Ê"ðø Ü€,åöj¿mðûNä~p#@à¶µFQU!ºÝ§b$Ø·ÔÊñ-Yø(†Vâ\’A#NŠ©LÏ Â/¬u <š™Á9b ƒz¥ê(\ãÀ³´ÿ&æöm­Ö6û=V<èUm¤ùïç=Ó\rÔÜÎøtpèýk&ÛDÜC‘¬)%uç1Km'žÐ£«¥cÏ b¥ý†©R¢I9§­4Ì$Ø«í7EÁ§ 1ÉŸ6KUÑQs8wù ߯dø{nÅécl–>Wƒ']>ï!|I>z‹G€µ„ýkË<Œn‹•_l… ñI¼‹25C`Э¶zûÃÎ4ëEœ5MØ'EL"ñEQv]a´eb§VRR«¶6K‡(¾A%X6³‘dA¸räÁI•ÚoD$¬ŠÀÜÐ{«$Ñ>¾ŽÚîy›9ì2D66 Jpçže‡Ê•:u{"¨’°m°)Ô™Z^AnJ‚œñt5Æ÷_x"êÔµ™*eczh­uá7ˆ(dÜÄ11P³ÇþÁš>ÿßn¨…¡+mÏ*—úc†Â¥†½f2Ï“@ÈÊ÷®ùÁ̱Y’’¤ 3Dƒ–i JbÄ׬å- úu‰.ëâhß4Œ ” ¡ ‘X&º™¿Yü’,—[wí¦”¸"¬Émã}nÇçŸ`&‰\ ,ꇣ4[Y³£>|¿>¶ ТĢ÷‡9/åq~Öà²\³:Ï2.š¡ÉrÉC³<"fú_ÆG¼ÔIî)Kn†¢ïºÒæµ¶—öPxPç’ ›^s1ð*ë}Îs@o¬ `076йd¨oa½öp %°`¨Gk/žë:fø‹ß™²ñ ±È¸šc¨!¯2êº28zH'Sfî.û-\ùÔËïÍIÃ4v~&ÊDÇ# ø¢A™¬G·cœBËIYÈþo9r©Ôb]R ùt·=ERÖIgE á;ªA!pRü9#(•Œ io´H¯îP-J+m mKÓãkwõÐ2ÛøŸ¿Ý¯ñµ$æ|íÈfƒ0Êm£;¸öÁJR„{iQŸ…®ç·°Žwpû6‹H¾ÈΆß@Ûe¹/Î[v—c¶¥.Å©¬OE¶¥¢×šº¢Ѝe[–\FJÌ«2‰Ú@ËÞ¨¼@q›w[\;…A9Ô(Æ,NViqÅI8«`̬0 =ßTŠ­q7Åül-;D4ô]vþS—c!3ë è2ƒÌ¤Úõ}öÌ9Êe¼ ˜x¿Þé-º#Lê͆8;[Z;dvS\šZA±Þµ*b~ug¡na›ìqÌ7_Ø¡4¿EsضM ´NŠœùHZ@ܺž½%9-'D]È„ ’õ­¸ÍNt6XRéÖÝEsý‡X™¨ª[Äiš¾³zOŒüN·[§’i¹ù=ÁÛÒ]†Ñp>îw¯õ¢ÄuweʰZKœsø§›Aö~ô@¬‡´ô‹ã¦Œ>¥‘€h{{~ ‹Ét[GX4·íéã"ì‹ìÈDFC³¡xžÊfêI4±ÅN7; øâõòsù–ð)ŒÞF(ócc'VyÅdŸtkGЪiŒ¥xÒ“r> ±ìˆ¥p¤à—„˱ì§ä˜ìPÖV‹Ó©ŒrÀ^ö«fê!üÃ(Z¿¡¸å7ìÈãËrÖm6Ï)è†]bÎiêõöéFÆb ¼«ÆPјdñ{Skex gÊùîAಛ¯T“hà΢̀‰¦áRÜØæ§°’Ä£fðTC†Õµ‰;#r#“ b¿0œôº ôªF!·&qbZÔ4C‡®æïp™ ‹D’‚aK½ä´09 uí©Qsˇýf©·o{5˜Ì"Ëœ×n¤ÓßNäéé5(ÀšüiK¹ÓɼVÆšbêD:Ø æO Šÿud±•‰"œ’w€:}Û`6pp5VµÕ£†Ö¬#º˜cíöÞôöM%Ø·Ltä¡z[„ÞוԈý/2öÔž•œ1³g8!®}?$ $nê‡u¿Üs˜ Ÿ!öjc®»7—“ÎÖBºš:„!ižü ¦Eoíå4Q?.À›&ý>8„bˆ¦Ž»äÿ¢Tc¶l•º6 CÐ`èVIÞzÕkOGZ¬D-5­Ý¤Çjº%[¢ëš(¾ÊˆÐaرŒc¤z u¸“ó&ÐÒP‡Z,ú%œF´&x^,pÿŒòù«Ÿ 7^+æÓ»8ðw¦Ý ,ùk>)²Q'T˜¥ÓsDy[ÓÖ«ž’T"Bd©‚¿ôJGö›¸OFG=N396ŸN(aÑÅ‚¤D⨼yÙ@‰?£ÒêÉ}‡#ÄnßL£,wák ÷{<}ØÉf2ÊkV%ªLؼŸ«P5uOò"!.÷ Æ ‰RUxß`þ.,ÉL¸A~ânÉõ¡ø‚èö¿ßT #š¶-Ç>Ëæ2D±6Ö íÓX`uE.ÕL.]2ã#ê ‡!ŒMhŘÚá7)„ëž¿LÙ;Q˜(¡Åðšu¨¾tôÒoÂwcedˆ…&J°¤·¡ xEljŠEñÄß,lÉçb…н&A—m2å5Àµ@Íi‰H Éz¬Ù;È#™L#ÃÎ}ƒ'HðÍð.á‰Ô¬óo’a˜®/Ahê9‚¯@ËNä2)øò;­¼÷gu\S «PßÕŠ§Ô}­RD.|PòSÓqˆY9Å[H ¢òå"‡ òàèÏ•yìRŸ*¥ƒÍ~|ýä®s¬zgªŽ°•ƒfΫ5Ás’èPš\Y‡´N„m3usBñË…ô†Èaä5 Å õK,sZÓÏ…îЖ‡IͪTd«Â¬Ûë¾ej¨¡ÁÏS3òlLÎyÝ¥7èšÞµÕn]*уÄ*ÿ$é¬=!Óö› ø’¯Ïe…%(àsˆRe—T÷{ ‡RbÀø­Ùp¨ÚL\‘1‘–ETöïÕ½‚û"‰ /Ò°.LÈKŽæò~”Z ¨JZOW´Û†Lûœ³Ü“%ÍqóJ3°Fvü­KÊ%E[LbÞÉÉNM¯àèÁ¸Nvñ×ÄB= ‰gV†°Æ§)–%ïÈf~¯´ñYÓ9gÁãgkÂÔÊ5JöÓŠ³ø¦QÙU—kTF±Ñ< ïÞ„’°He£í‰f0¦‡±÷IzØ+‹bUÉ»-G³›DÜfŠo8êÕLßûz¼cHó‰èÎ-Q®Òð<<'š2‹Uªg-CZ­ªI°„(£3Ýž(;"¡fÒÙŠ·¿\°S´£ë¦,«BÂÕ‰B€´Û€¢‡¨6ì4,šÀÕŽ–R(±Z½É¯”*‡°;q‹rÑs'|G§sÙLj'¤Õ±ƒ’j†åI.ã݈Æð1íXëÔ`|rvÿY¨îÁ»(_½nw|õD«½b*Märy<-9T‡Bg6dÜ xøtrF´²™ÒÇN K¨#E*Bká¬B&„¾3äO(sLÐ!î ªpÉÁ{¦ÁÀ˜±Å9BíÁJ† }¼ûÁ~ïÅï*‚ÅéÁ©¶,ŸÀ&9²QÈ–çÁXÑÓ<ùOš4®fŽ ‹q+ÛÛqi‘̦yD›ÿ’!¿«á³pŸ®[†eƒX‚,é§iΉN„#¦L¯öaÍ*}˜Ç³¥Ž”â”óL8‰)Õá­\$–.¿N@¿Y1SM7µ)Ez¬IÄ&Ì %N°v±Œ40hßÈô Ã⣠Ñc. ó·¼öÏPF i»©Yó&åYcYLx÷̧_Z\AIl ÌÌa.FóœøÈ·Îí¦²–˜03ŠaŠhA—I$q¼Õ¡`dߨ3“J8u§ÖÕõµÌ†~ÐÚ»WÀÂ!‘ÃË=N<â^êÿ¿Y »Úzéœ-O,aïïKuF¼_hD}ôà«·ù“³O…ì·°ËÚà¡DJlÜ€@Ókꤡb>úùN„.ýZhÞÉ]kÓçA¤œcâpêrt°vzPœMIÖw¶N¢ˆ[É& ÆûõsýÚì¾_Ò?C¶8‚M{¦‰ÇH82ŸŽºt'€åÞ%´8{äý/ -»œ–ÖòH³Mc¥†NŠ2Ø õS1Rð!?KˆßfH@t&©­mßY.KwT)j˜ŒÀÊŒ¬6ø>«•òS=9ÒØCŸ˜0x®›©Y(xØñ¹Fp¡á¶dÊf‘eìÄ“Ú Ü)ëªÎÝÃL§bŸê“NBbù£‡<9Ó£¾SþÏ}ë%ØÑ)-ªˆŒC9ôo}ÝuêÓ’rùÓ¨Ao„ù¡(Z;áÛ̇–dƒb;p àèþ~|¬g8ù£ÍÄ”,:äZx*Õê`Èo1(FyìÛ&Í•\‘ø´:ØqÏ.L7ÞÛ-Óà8n?åt9[¡ ¿7÷’¨e¾ÙÖ,0rÍ0·†Â«·oæñó`èˆhÐs9QWßbÓ¨UÕ êåõuíõúE¯©õêénNÞ) ‹KÕ&0ŒEün×Ey‰3Z4f÷5Sµ†D}õmàåK1Z#"w(]QqýRÀ3ÝEÚ;‡On‘%zãë| 9åa àâÙ{¥™ž7+vNˆ@¤çöBõ±¸ò×Ulñþp#Ò!ñ3ü0#}¢^RyÍ^™§—¶¦ŒFà‹4³]Sðp×|øMCLÊ·†£ŒHëjñÝ)î¿ ótNKæÇçf£ØÆ!ò'‘s‹ï@SE ¶ÞB"ãb¡ùBE˜Å!ð"]ÐÇÚ¾²»Ó¢£½ßP@  4ËË5ØüçUI§ÉQ>‡îYutÎ’ŠCeH–·) Â^§!/^í¶¥‡cí#ODzX}S?´(å º,¼VÑUl ÉA ªø`¯õuŠU³ B33ŒÌɺPLoÝgÍþ'xXïèÂ?éŒdµ×ÚMȺ¢“šå—ù W7ê:# šýc=f˃”þi·¶If¿E«r®’sÙ ‚:}IöyòÄŽÓhX)…¨<ÙKºÛ›7›à4ÚÑaamˆï Ð¨š²j\W™IËM%:¥áE%†.Ï€T抬d¥§6ý‹êY±¦f‹^kÈy« ‡? ^U˜NÝ¢‘}4ý²øßáXHP½Sæ=FA +†_;ûGBàæó juµMÉW)“<Ë<¼:@¨EsÌévº»¤¶Í›8ŒÎ¼¥öcÆ•:ËJÈ®" zŽL“;ÊV2ãEføjõ”;Å¢àš“˜ŠNôô'2ñô¯ %ÓÚå"%Öýv*ûs"üPµ$‰$Dɱ«R ¡k±åh¾k×îîãÞõA–oEø‘Ð4?i꬚ktÅþ(Æô‹ýÃ[»G}ÁU-N’u/}ù0Z±.y†y³ê F§a —GIŸ±L÷Ø8¯àéâ€xë9Ói÷B1p‡¶æ•6*Ô»eC¹ DÙ˜£·þÂ0èm÷Å®å% °õ1mZìŸÐ®~²GlƒŠ™OÏJŒ{=n´¢)æK[ðµ°*Ò°ëæY‡4p@ä®ÄGtfHˆt¼$ñÎÁå ó0/ˆ]ÍXï‡ÈØ–·0l pd±FZ¤hÿ¶JYòÜa®wGÞ;z"n¦ú¯ÁÏóO‡Ø¶Im6À&ê–€£*éOè8íóaulØcÎOBSºN‚yÝ8”;•oLµ3‰­¤œÊâC{®BΪ"kw›69÷ܵÎ#VtvWSt?$§´VêAfª "ª!gÉ<:·¸õ‚$Â"_{œò ›¼rfZÑú8¨è½ïC)¿"YºÖ, ‰WØðãs†¥’”×[Ì‚5€ŒÕ— Ý>’®¾B´Ó–Å,ƒM%ùΆ’~oC¼ïßÏ)9H©C5•Õ(ÔH‚‹© ÚRkö‘õàSÞ˲§9 †tÇ>ÂÞ³µ’d»®É…¨f·âvËA¡®’”à¸Ð'SìDÐQ@Å>{dyÓâØÝ_+½[ÜdgáñÅJ>x¤PˆõN®­yfëY}”=åñÒg›¬ÈPãe~E4̓#²—õšÊ.™fMr‹Nž—áðp4 ÷o£F|À‹^š®”Ý¿8¬¿%,mžâ…Y É’SW6‹ùÙG[:…G6äðN)9wÁ"™¨VÛ£–?¤ñG,µ3]…ªs„lßGfe—Kê-ÿ=¯Ù©/(RÅrÅ~éN! J&ó’Ù7¨Œ’Çr©#‰5ÍÃðØ*Ä ­{ @Z­˜—¦ÚGÌé‡&7,¢…mþá@ %ú•ÉNUÞd¤Û²ÒÇå˅ëîÚíG.dñ ;Ç\Ô·o?w²µ,l³©à§žp®¾nXl¯š¦\´‹«ÐX s ;ê‡ïò™õ›²WÒû®–Œ­!´½ÁÜ4FÈänÄÄÍ£²»‘¢ÁÀ³ I¸ÃXÊf‡ÞnNòbŽÿph·AøDj2’ÊÀA±Ëϵ ïLzm•Þ.£ÖÉTHLÈ4híV€- ƤÔ*¶5øÝØ¡ÖauåorfBR¯…|,üA5ó *ÏÛ¸.æŠÆ<›áýtrÿ5o¯‚~~jöݲ¼:sFõÛøGïÞÕf+OS´£ íVaöM8ˆW.<ÔiMP5B!JŽÙÛ- e3r%vîD–Ñ$(ZeÅQž¼y­TWá|…|D%;Ü'0j ÐÄòGžž®ëûaëÈé-@Ùpj’Mkiæž½F˜-­ˆ5‰k”~RVQ÷¯dƒRÇx µåoÐ<¥C³:š½Çž'œŠCº˜áWè*Æb`3Ø•XZn힤Ð[å„Ï#owNo:ÓÁ’WŠ–kP°·tLÍoPŠ ŽÅ-WâLY¥A΂±ÖZÁÁÁ ·^ Buýåžé¬^ƒÕŠÅWÇÒhëâ:¿q¸ö\a¨Ó”tßm.ùpZµ_áóÁ4¸]¸‰ŠtÅï‘y%ÌõªË2B×ï§!ÆaUîf3lÃk‰ÄYm7²sN ìžìŒc­K°ŒAøÚ™?¡•YÈ—õùoslñ{Æ·@N ”ñä–ô¿U)Ægé…-@‹ï¡õw oLÜã0áò hPM7<¸€N­’Y5É2UV©¬¾ 2b¶Éì’`½¥eÂêæÑ%ß[½ö:áÇ/Ðçé!E8qs:ú©Rèr¬¸MšmølÒ^Lìò9³{Ÿ> 7¨ê0^ ë;%ºhƒ´ù-¡H5ðÓ*—¯šI}|rQ|‚Tăɵõ¾ˆ-t÷™Õ•ÕRY† ÏÚ®uë$dðPßK¡Æˆ5êµIÆ%RlQq¼¢¥j¼Tâ%j”ç6?ã<òDYFvZn ̽±N¬Øï8ø€–fn{«vØGŠÍUȧ"H‘µ—K4Iqy¤š©KÅAiWö爷ÆÏc÷r×:QmDì0s ’²M–ï…@"iL/røÏseeìèÈ6FdŒeI!/i]öI·[Ú„·’,Q{?˜¦ÌFÿª9±-š»&Èa¥?œp„Û¾›Dóê_ú®i_î»yÌÞ‘fë—á•«å+eàæ‚Ô‘q3Ÿ“f+ÓÉôº“üfïWÏ4Å"çsšUÈDp̓I)`IÁO™bÝHâë´þ×áJ•ç& ÙŒŠÖŠCí©6fÍÈz¤ÆG˜k“9Í“;CuŸÒ‰'ö˃™Ú7†¨®G}ßôF—üèë]œ,E"×CH­0A¹f#¶º yêú÷\Ê%«ëik[–Æ—Þû#Çüiô–(ç{±Hã=|‡ñÝDY$>{#k¤‰Ú½Óéƒ×d1Fž<šUŒ,‘ä€-:Öâ›–)4y6)Pmç}B/Š2ñ270ø".É@}É-òm¡Ñq©·šP/­U82«6ꙉ`òu vÝ£™ÛWÏ[tÿ Éã$éêY.S@¥'C³Ê%çÁy­¥b/¸Òß’ [îöôŸ,g•Ãt"ÌMNIAtö¥rI˜*/%vS…:¼á.c”“án½éB¬Ê°R~r§ÛÔ’q¢rG 1ýœ·ƒðõ‚­º•F,—ÂÃݘ5)å=ÕQvšI §Ïs8ÑnSûú¹Öç’‰#ôŽN¼I Tº/ä«3þšä ¤ô‘Œ§Fþ~*³·öÍ—Ó(VkÐ{ì×訩ø`–‚ÿ”AådOÜ–”O³ÓqjÝJtô&3>#ðêX¹6"·ôø'ЗWšjk2ž|ëÉ006`íãoÕ¢6¡þ!ˆdkí ö÷z›ìÕ„Lyøoϧ¿½èg5=½¶f°¬9p¹/@Ї¤º–2[ÁOµÝïMr 16mœ°VíŒGÜj¼I /ËëÉ`œ)‡E˜e†nsx]x~»¯é…dæ;=«Á[9…‡\ͯ“\Â&©WQ;:kœR¼'×ojµ•5œm€5>.”$ù¯ºWÎï•pOŽûpÁÂÄ·ãYçµFŽ{/áI𙂂ìøE5cq8è•«£0ãÑo¤9/¦ë·Ê~zNT7—S„òíàTóÙß _ý å®Ò ‹Ìv.µÎÞlP`ð!š^ƪ4âZÁŒ›åæ¼5› ¬bɹ?˜Ä‹‰”±%òãn±ƒÙ+*Ýô)”ÀŠD¤­¶,Ð>Jõ†FÅ7¹è½ÐdÔ1¦£”Ô”%èÁÚÃ3ä‹0ÁÁ‰!¸‚7D“jjän¹yÅÞ£Xã«÷D*½ðìÇ30ËRõÖ¯ŸG¥n ™Æô@ç5H”Ã*2@Þ› æM“£òõjÚ/~èbѱ©ä¿!P Rÿfàw4×yõùÃW•3øíÛ[ÙZH{2.XÑùs*0f7ê¬vÀÊ%ï,Y¾Þ¸¤ß(ÄYúÈ¥{±;»Ïg†QÏ[ 4gh:fïo7ýG í¼"øŠÒ£`C:ÏÕ‡/ÖØ*E=ð1³½Ìûâ<¾'óœ]³ÞRç¨~ß§©¾R,a/ØF|'”̬0×ÔrÑ\âK~ÙK鶬}%ßÍœQ …ò¦HÑÎåÎ¥y@WÇõúæ[—Ÿž›\´È¸Ý]€‹ˆÜαé@{õ6Á^L™Ûä“ÒÒîK-!þ» ãQ ¢>JÝ>èi4r5Il±æäÇE ™¡áØ×¸I&A‡–{އñ<ûx¢±Uç+djd¨Ð$ïÆ½'k*HÐÖðXáHØtßet^Í]ÂÙÁSËeë`$ߤ£?€ïÙÏ~I\FÛUŒ<Ök\^ ÌtèDïŇºpÞr›S=[,e&táfîªÙºÖ‘ñnRÏËq\ébat7ˇŠ¹PžJÎáz*ÜG-άõž’=6Ŷî[¾ ×ùëV¼”¸ã rܰKyhÊ3w#ÀæŽCám7¹š¨F±à21ܨ9מvšà*O¨ò«Ñ[ªÅåäŒÖ*9S;:©Å°ò.š¬Ž±OÊJ˜>(Á#j1d¦'‰¼¡B»¢ÓÙx.AUÄŽgÄ JñarXxÐ\x–ì 0` ŸilU©‰äà×G(Å줪CT>”¢ã8§Ž½w5Å›t§Í×H¯;Àïÿš)#GÇv%Âo¦4ù»,V' Ë2õ‰É·»eãöCò;úÄûK³Í±Cù/¾÷F|Ó ‹ì‘×ò©YßëoD-øÜ>ýˆ?VBci{§ÓÙº ¾fõ.ÛXι4y‘×íH+§qc„>6ã*>ÂÝ(‘hFT+±ªa0ÝÝu…ˆJ(à-m©µˆöGsœœŒ—2µeyª}ÊB…)ï8Ÿ‘?‚…Õ4Ý\ϸpì n«yå>x•öš±8Órç]}ªL_\‚žR 1Ô.B•QÖËÀ.{¥®Ø<ãƒ#!ùRMrÈþÏr?º•NVüÈß,œ,/—uø¸êNM7o¹G–cœÙÇ+îÁ fŽœÐàæ@&àîC{à"N…ÁRÒOÓ#„1)Ð.S}ó„ÊFªŠ^K#ão_7Ó ±ýY€^"àwÐÝlÏ3¿ ÛO£¢&z§ªadðg’ù6hAüyùr˜øucò}©þBûGÜì褜îÎúšŠ ùÜ]“¤”ÏV Ÿ0Í~Ù˜{˜›Q=¹eVÆ‘Ü^ò^ó{“\1D:Y{~tpRñ  ÕÏ.tå)"œÄÅyÈV2ïæÿÚØjão^_,}+Mœ¾½r2ðJ—då'KêûK _Áæþ9ºȶZMÉžg1Ê¿ÞîuÑY üu1X…éþ<‹ï>ÃÀ/ž  £¼6¯Ó.0ª‚,a$Û‹ßZ'_¥¹–WÆ=3¤|xbǕH¸Ì.Z¬Ш ‚tïêJHñÖ’y§ðÐØèýô}lœï?e¬Gg=AO ?ŽY¼è9—p-èÉÏ77wZmJeG: p"Ëâö5 ¬¬ºÅ†·¢(^oÛ”ƒ³Sý{ɱKNÚ‚ƒÉ@ÜA^c Mì£|ÂSœÁ-S…ôj‘_Ìb?¡ýšêW¿ šád®´è·'O>†Ø…+nQÖ²v#pèìnß5¥\Ö³rém+ÎBfŒxÞ/qŽ{ÙÅ‘lK¤ñÜ'Ž`¤=‡-§É0É¢¸oí_Éx€ÑšVˆÿtÚÖQ›± |­´!Ùî”C­>N~*á-Ö3¤`¼ &hªýuBR&ôg© šR±žt¿ÓìGd#žSZ6:à<é9í-:ÑZ°5?(ã!ܳè0+“©˜¸þ©551<ýEàuÎ9¢ã¾Ö_mwVTp)hêùàN׺ "Q+³° —$S—s|Ô-d1ÛDˆBÉ^£iF~ú:k%í&ôJæ<~Èâô¥î6u¡ß@+þ‹þ-)EKð#k$*Źù(oø”¸wS nݘö]:ô»Sä«òŒõdÕ,ÀØŸèµÿ4n<¿|—ë=î³/»âªÞíROb$‰s¤Œ‹O5©Eå<Ý!‡J¢AñŸ.)ÕK«å]Ì¢6ä:e%ÐÆÉϸs3nSwPÞ(ÔϲÖjvG¨}?^Ï›`²Á'Èò˜Õ‘å±ç°Ú¦I¤F>&JXߟîhÚ6ÖXðn•Ò\Üá¼;{êxç°“Òƒµp )úËäY«Ò˜ã(ƹ‰usíQé=¡ØZl§jBÈŸk”äõß™Xk÷Ô?ÿ®ø_Û¯üÞck·çóv¯=ÈÔ8-§ÂGäHÄ>7Ø*ªÞh <Ê.eGcò 2tô á0\‚+·ìá-Å·{€'£Pº§‡qÊ+ æò°7 o¤c‘*Ä4Q2"M©Téx~]ZR`9=`Ú/W¸+“²j1‚=—uèÞ)€d(¶©Ë‹.îÔèJKS¼?>±ý¦·R‡äð¾4Ýæâ†ØýG|jŠ¡l é]ÈÚ·"9ŽçJ^B>O+xzònºFK™ä.—_D󨪪@}Ü ÛÑ(ÙoÉÑ(ˆÞMSð‡¡BÏÓ;;!}¤!ë–uÀSoÈÆ.tô%¹!tHw‚7Èb€*n€¯¥ã „ë<þnY?*.Ÿ¬îY{‚ög¹{’y¿–IQ[ÜñÝ@=ç´,"ïð {”ÛÜ=áÍâôwÚqsl;LZŠÏñjì›YöŠéý6èJÛkÛ"ÍßsC"¡Í€¨ôúÌ@6J%@U'Ù¦d+²Ñ½*)r_“¶´#-·º'Ĉ£9Ʋð(W¤3Xàójõ2¯¡S‹7×F{GÑÓP"tI£bßË”¢çMªð°7§§š@{æLÙ4¥?Ì¥uÕV|ô\ u¡ãÃÎð(š‚Ìôé’Ï×¶’÷Ç–¥‡>¿™‹Ï’<à·$pÊ唄ҦžóWå¹Àcèæó.`3Ý–ÎØ bÏËož£óì>•‡Ÿƒi?'ôëî‰&—…õöìÿOIUŸ…øí¾,¿ÅþÔƒ”+]µ cŸ{Š¥kglÐÔ#R˜·x}LìîÏïšü©˜Oæ: b#&sžo‚ÒË^xwcÉÔTÇK«ßoµcń߅õý¬z¯ gyë›UôBõå›Vwü±^ Ý PTµ2ó.„_~ €°®þçÓwO)|’®yvÊ +öa£A¨)’oáÈ(Oò‰v‘úŸ 2Çâ@­a«š¿ óéóÓ–^bfL›:¾tª;ƒíQ|eM 'ÀÁ@”.¨ZžÜŒè1jïôõfBÿ N=Ïãס¼+tØLŒ‘åmŽè+¡Ã΄n,‚¡È?\ÓnÄɳ“ËÝ{¹òó…>ò¼<ÅÃbÙŠY^>g¹ò|>¶§ÜÓ¥Õ¹V;ÈÚ?Oiê+3ׯiÅnT•ˆ¬϶O2í?@%ϩĎiŒ/c#ƒz £ºõ€Aiã~ÝTÝYJõ`¡·"þðY@ò_f—Г‚K›° xM¤ÃûX‹Ýõçéo.ý|9,â`Ëa|¸l´h…,‚Mß-‚>}.@N]7óš‚ÿ.[R<çäž~ët‡¢Ï|?¯|ǰº „X˰Íw„æ`'9¡²P1ˆAX—R/6—„²W–Ü;\~êhbç«+Bª ¼žÔ½ùÐm¹‡‰¶zuÈ#rÓäh |¡3õ´{ªiÝ[dw ÍmòçÃ]‘¹jZòIJó/`øT$©±þKS‘úXÙDèo _\¨”–rÒ«x^ ÞFÚ—G.œùIÆ¿“ùñÛ¼J2íáýÓ=–­ž ï´ÏAÜ_1íBr[œž\œ†{ê j+tõO†¢Hs´'aŒ£âFAYÿ‰ÿÜŽUå×p÷‹×Isœy~=bGþž§×Ó™¾ÄL øó?êC‰Ú¶@ùÆ? ”`ÃçþŸš”·&nóë!Á‚ÅßøÃ¢WèÓÖ)åÓËŸ†«ÝÒñªÓ½· 2?Úž<žñ‘ë£?®_0Z´ÔüÒm—8Äž=C™èX®Qœpò¨ìÿ;zôÝI¾Šùm¸Ëçì½¥~?Å—Z‡ë.Dï ?ÞOä6z”}U=Óת#–|ïÆƒ¯¤©ƒŒYÑC¦ðÉ? w8cÛê‹‹ž`¡æåÃkY¯’Ô½Â57Dë*Ÿ*C]ÌÑ«H§Œgx0iÚîôm‚í7äÙ±ËÞÆÞÁ£w¯‘¾\ó~ñCg}£DGÀäj”®\;yjb1ÃË<|yÆ9¤l¬°[ß‘?6DñÊMµ¡òŠ ˜²$ÏÖÔwíð½ÃÃß—wArJs÷,ǘüÍns,Ø8WCgqö'%Iª¶§¸†HýgöPùöáýñúãàЇƒæŒ–Äçïþï¿ åUýÿ^>“TÎîW/ˆ´¾±úûš,Èô€?{ßÔoÀŒ)>ˆˆú†¸Æ’„D¦ôË0×H¨y Q0ÄDzàúè‰D5¡]h)Ⱥa÷娵æÝÛá>;ùP›Cô/NÜËÖÞÆD+¥ÊÞ§*µ®Ûbôc’Ÿq×É®Í?°õ;§>SûüèÿCá}IJà Òi!»Ðe›¹ïO&®¼>,Ë\õŸ[yçwJò!íËð\»¾®½M{Ãݸ˜ešÅ°lÿ7‹E²[µBÙ„9u×§Ià#zCêÜ̱ˆ¼Â-´ÜTÇœhbO1ƒ¿{<ªwE½m$i)gåjuéê­7¬n*ëÝ:µ­šlü‘Ö÷GLÏQµ¡Î‹-\Ùv‘«ãF>ù­€0è–ˆí'š ©’Á²üî¢ÙOÒìÿµZì÷û´ÂÆŽåÏ®ŽÐRYMrõ¸PHq"#„ˆÛw3#®À"g DÇè"ЏoãzUï²ãb·#â±wÀ/‘KûÿõùY:¼rpäúk·ë¸*TQo¸²ÃN¨©Ò_"/þÑù£H*—Í=Å >l;!)&"*±µG&{š»Þ4ðßLû#Ñ9}þ2gÄ›MÓ–0ÎÒ 5âûÛ;ÝÔ½áMPeÈóœB}ÑÛiûË\jÍ1¯Õcçš±§MB͵F”ÖÊÉç¬(ãaÊáÂÓ¢N"­‹!OJ™CSÔÒÓ~R ˜®`s†Ñ>š›]ºÚk‹nÿàºs†5݇٦GΓÉD )»¡½­j š U«¿Ëµî~2"UÐb°PáD…AµÒcâ5ùµE³Æ¾¥ÜpBu¾DkGë$°ŽÆG>·°ÖÈ<äz~?â÷´qõE=Çs¤X¶iêþÄ0Ñ­ZZ!uS=Ü[˜„^Côõ DI§O'¥±¨:’7qïZΚj¼ßóRJ{âÐT†QX|ü Ã0lU’\‘U§‡ù¤Yæ3¢MȨÂßsJ¯òÖà!b´='jH‘î6ÜØ²±×ªŠÍBJÔWeåÂ}t­|¹$ÿ<ï÷F6û²w›]õ¹'V‹kþ2”;ƒì µ#£òJÜ x3Ä’ªKíè‘óWd¥§Ü]‚ÆÁËÞøõÿ _ðâÚ|Wè ž­ ÚX¯¡h‘[õ¸õQýAÔdÄÇöM‹íÞøÙ™,!§wŸ:ý©VRÁä G êpž¾ìã>GJ sI­9³ ±ÿ@šŽkæÖ°Þ›Æ‰÷Ñt;V0“y.Ñÿ4]%jtŽTA®ŽE¼Tß8S&»dòžã Žy=4Ò±<¶[¤¦èŸAà[•““¨ÅCÃ[誘““Ï/ÊLº#ÊD š'æD8 UtÔ-áIÔ%m=ù›hµ6K;M¼“4¸Å’^7§zCa‰šþ…—ÁFÿ ĉÐö,Þì};߬l¹¨;okyr˜)µÌ'ƒ•.Û¿$!AæäyØc?DrG»¤\Ù…kùÕZuˆ©±bÒvž‰ÍÊ÷:¤6â: õ ‹Ï£Æ"ZÖ Ø>ãxaÔÞIaÓ…ãT¹r‡hƒVkÌ×£¼h#Ʋmv®·ÝïÚ<ñ¡Ì¦sPÑußnªJõÀ¤+k“Ó®*<òvD¸Bý0¿01±êG3ÊuÕ\µ8W½Y ¡¿$äÉÈ7£4m#’æ9鼃Зiˆù±ƒ5Z9ˆCÂ#‚Û2µ@tó™çðÄGd7fdE^¦B;® .G‰kª~cgl‚o©–¨•&4ÈW¡õ—æj“¶°˜æ“•{WH£ƒãI6}ÄCP•%þØú(>Ãã1Yíƒ6ÛšîB´›–†W‰ê(qÎÉØã13-SäµKMT&·"NÚ"B&ÿÁQú·ýýŸõ¨­Úi6Ư|a²F¥Î˜3½©¾®¸_¨Å¹,IeÆB¼Dõt¦¤U9õ½™÷©~AêØÛZ̆WwöínÙî¢lUꟳл“'†Qxf¯îI§Ì œQ/Ög¿ Éò] L²å9¸A)b+¤ûõó±,ÄÔmùæ†r7S«2€Û¹ÀéF‡yËä‰þ]˜®,è é™1'Cƒžï±@“:“†¦Wë“3•¾ Ñd¿ÏFQQ¼Ö¡ó,?çµ)Ì9i”ð‘á.ۢȖÇ™ÆbZ™—žKe•’±vÒþPóÐY€°Xu,B  Í ÂþuÀ#ʲD@8Q42rqƒ ™ð©‹îšJûŠÆó²ûMµºAÙ—±Æžy×Ë=ñ"º Øä&åMÏ>IŠû|vãp‚6L«F¤Ý3Èy¶–‚R ìùš­…Ñ’ð1äž)£™PæîžK 7îQ“÷ÆnjzXߪ<åú¼«²ÂK[» B"‡Jxò¬0#ü‘ü×0wŸqæe-ºœOZ¤>潘ÜÅj¯i•×ÒØ#ñrï‚Î1 ¥ö÷£«]Û¸_¾ÁZh»1h­S8FRXk¸§j%jõW´…§4˜H‹Ýee|•åacý´¾E¡ÈJtÒ:hÌRaåP[¦Úz~×>±”=))E<£3VîÆ}õÕ'5ÄÝĹŒp1ë_°T¨ztÖs÷ar ú};¨”>¥!*~ÞL¾á)ÖûDûùF{3~Mu¸<Âû”´J)Ú_€âÉð};šô¼Yf ©y…ÿûï¶Ôr1·‹¤fÈÈS¢9°}]I)Ê«¿$µo8ÆCÇb„§ë¦Õ—u‡Ë÷Þ@ƒwÏX-öÕËG†­ÏC¹Ü4Z‘£Ä…ƒVh<0ô“¾ñêH—4mÐcÜ_{ ‡šý8¾CÕ·CÜxÝ¡ƒ›Ï}⹦*:Án–PؽŽGþ©ÆIµãf=¯anÕˆAyìÞvê`­ÒõŽŒ¥ NĬß9"rRï?„§AËyÁ ›ôØí… jn¼„â^+@ž6 ]q)œƒ„¤´öç*ß÷ÕeÝ\+ü>ömjìNÍW¡ò×éµdm5¥^T2LÄø g œ’µjªµhªììAç FrºãPUTBÎf›ØÜn(ÒOC†ö®tË9šTfƒ'˜ÆE²÷kö,LŒÈ¥ Ü!z1ê_jvÊpK³œ·^†‘‘6Ù—©ðySx±“KLîSù—I² c¢/¿²åØ‘eæ­¹Œƒ$¦Ý:iäÄ7“_ƒ‹&Ž&”fù£|¥(dD¸‚È}/DIÚÆÛݱøzÑÙi··GýGXÛAaå¯MÊ ·~ËnYåh¡·iÊIn5@Ô#G·õSÙ¦ëQà€xa„wNâ Nx;»Œ­Ô_Á¼èÔYÝ,ß[¾övuÐwK0“áõ“↉Bƒ}¹x¡Tý9Šý}ôéHRùÇ hCCÕ"ÍPÉj!‚o²êÎ:d_} zÁ‚JB’¼UÁ›²¾!®;9¬Õ-Ylݰ7êä@2­üÕæ«=`œÄæÙjn{ºŒl¡ÊÑ¢Ûý9ØW™¦/–6Æ£6¤Õ®C®øR¦¨ò.®Zø ‘5$pЊ3=¼¯àgȧÃ2r|(é—àT†l**g“C,¾Ž´Ï¢ ²gŠ[7ñP$EŒÇ‹¥ÖäIè6Vì¯Jʦa‹b¨ulY? ~¾™ ‘>{:Pk0Tv1Ó«³yR}þ%çâOuö—ÍÁƒ°Õ`›Þtâ²§’¢fl(­ñ |йW—€¸G@Lj™aWúïÃRô)iÍÜZœ ’Y¦…w; I§–óC_ª©¤Ý¾<ÚöB3c„õã…ÕÈÐz†E(ò>}° Â(Z”Á9‹ˆLåu¾C¿j œÖç]Ñ`?^ƒB+Ÿpÿ‚)Â!Öž&¸4.`zQ§à1ìd3¼’ÎB± 2ÈC^òË>>ÙMûåHôòvÈna:ZÕ/ƒsØ·ãF%ËÝ 3†D:»N1žsäµ­¦CÆ_…'­’ÑŸ” Ø#S˜×§zeî| ~cVˆ|¿¯ÏX‹òˆ+zâ–q†¿Êa719ì©ÚóÊôÞÉK Ô/U!dòÙI:s¬£^Ôý>@éóͼŠ#$Ó“ÂQÁ¨š¼Ç»n­ ÎkkbÈEB¸í>¹>‡ÂpÆh¹XR‚OÓ³Œ ìÍ­—LºW'ñ½¸Ç#êLY¨:Sþè°iYù–±FñÙÀ.yšššø_KD…‚#ñéRY¤´’ aÜ:Bák»ƒá–¬£$s µÝæÙAÏá¥{¸õ´ápÐÚk?‡¾øÌõ“ wáÜJ°]'Xd•ý©7{¯þŸ Òeìäd«”óG¯“š¿·ÄúxÏîxÂB:œ6G©@‰P“ì;¹õ„–Ü3¸çÿ—ë8#㩌Ç̽/+?‘ Sžâ ªž%ƒW»îQ®M‘„Þj³=æg4YW°Øt¢ùª[4£f‘§Vv”° D‡Èm÷ѱ¯(ªνcjÌwÎ"‹³5°ŒTÿÀó&†#Ù`Ç\ôÛ,˜Lo<°\ɬȧý?|­$½gM#<ž°¿’A{k#¨-°Ódä­Ü鸕ù˜(ÄÒA¯@/ÕÚ•.ÂAãXk§VríûÍ”2³âÒD‹¼­É`"]Ç”3­Å¿—f09gG¼9.¾¯.¿k&VÏš4€¤‰>ɬÛ<—2Îm¼8°Ô ûÖ0Emö} ¹{ªouxÁPÓH±úwB?Ëæ†±cj‚ç5²Ù©kc_å¡%}ópÅò•×ÐØ VM—‘­žKlPH&_Ó#ùõ¹ „aOÖW¯ÅèÇã¬3f¾û€¤RW.üRÍÐÎÅÐÙƒH;¨Á7[¹;óúÕÉúÆaâç¶šN­`6Q¨>!" *õ埊4ôà)~a¸ñZ¬’Nï*îÆ r`N‰ _EÕ4óh—Ö¦²ZŠI8s gx¿¾š#£ÔÙ5©mýÈÉžørÍÁêYLý4HrZw¨M}UƒÔ©ÊÉÔ`*‚ì2íî1 GŠÎVá9¬œå­ZðæÔ´œìVó!eMª' ?c¦/ú¤ª¥)SE=i¦ØE s]ž¸ ìˆ+2sì9ÝbÓ$Ì_¨œy%ƒ“¸ˆj„Ñô˜nø1D5ÁÇ3%>BœDÑ6Ioy²ªßÚHbýoíGNlv÷‰‡Ÿ’òé#Héz•´R[åC²ˆÕFâKcÏÔ4Ü ?m©ÝÌaò¢†‰!HH¢ÕT _ ŠzáÊkýÝEcº¿ê4’ÝÀ¥1MQ[Úþ9C =1]eÍ›BeG«Ì²NÑûCñäy aè¥ÈduK “À(RMASlÏœÞX¼Uª&Ž~qíà\Kµ²|Eôx0dUæn]ŠËiÎFµ±¾íw¬*Y@¡Íl3M¯ü Ò Ÿ¼Z×¥{Ü¢ÖøOr˜3RQGÑw°LèŠÒ'wì‡}’YDAAùGÑá~±€ÿI×–Í!½áã¦û%OMàc‚ ^ôIË“mëÓëš6ðróÇF96ÆHMãñ ÜR‰eÚ“×Ös?¼/¿óZ^r1ÛóEwb„¶©¬è6AàcZv{¹’—×ß])æ0[îÄÆ»Ck„zäÂöAÀ…wR f«ä¨ŒhÄ·jáãâÈJ+6–Bç†mÊD“ê\×@áÁú–Dä!©Br0)V¤¦ÇŸ õï+ à‘ç¢ì¼(e¾YÚFÞl¢Ðd£Q;Ÿ¤^u±â¢©Xc”úOLˆë-IJ T/eF–ӭЕ΂²w›$?pz•ÛÖ[Ï[W#½µ¦•èh~ȧ&棨õ\:ä,4ìÍqˆ")ýÁp«ñ_µ,C4¢É09¤F –Éæ*÷ªæŒ×_ Ìd™’WH éOÝêëñÎp¬ ¹C>À¬“!E…IY>P©|§M²÷O T–ú?‚p Ú*¥(X3×Ï'í,’ø]¦€†Îè”VÁñ¤úõM„ ]Þ¨ƒf€×¥6f°7§Å!â{t¿FÒû©uC3…Có¿ºóŸ“Š K~áxŒi•ÚÙ»ÂLðj¼A[+ØeÁGNˆêà&v¿Œrí½l÷ æîÒçKÁ‡ñ.qqgÊ‘sž‹Ì™Î^ˆÙy;qU×¼l}3d«q½ _-ю±JÁr\/bÔ$S\ßûœô3YuG›GF÷¾‹þéeAAÐØCO/̦ý‰9ëÚµÊäE¯A|nƒŽ09T1Èvx çèÔ "þæF³5ÐZ14—€AÊ~!@îè »üLX,íÈ`6q8Ž½Ø’Lj¬½¹†@}JYAû»© 2Êd¸[cìs=:2‚ Ñth®Ç?±ŒB-‹_]ælÞM…XûʼnªZ æÑXµ ·~n2Ö^Yø¾H»Ybů¡N\ò‹IЈXýË5ÆYÜZS§aIZ™ ä.ív;ÄŒñmôýµÜFƒ«ÆY2Íóݱ¾cæ"™q7µôFk€5š›ßl/lm¬·¿¥ÁÁñ|ÈÝ«Ë4ä3â ŸöÃV]6©µmåÒÑ YíRþ@-Bd³€¡Lè»›hŸmU:x´íâ~(ô”'uzvZüÜ#˜wzYˆ€×0cA\ T-¾N‡=‹¶ÛYê{cɧY•Ï´m )æÃÛœÓãx1Ú–¹S&½¸Ô…ÔÕò]Ê7P§7 ³µ°dÚÄ–ÿ»àóg#„F(`ß]9ÈzÇ6Zƒ\»&~=åF‰Öñ,¶»£B[0Õîk6“)!—Õ„Þ}W Ä#è‰E€e«h²hq0›Ùp²/ ï3ÆKG]ﳫK7QÈÖ,D!º9^K:vLV»#d¹ßú:!è,”š¬aU|í°`ù Á&S MŸþWÏž$¬”ÕaQ‘o& ƒd–¨ÏîmÓ}cV±`J$ÍcC6Þ¯¼z †³eäïñY³ˆ>¬‹ÒqrË þõ.Î$s0rÊp,ö*z½ßšºÌ{Àe©›–B¡óOq2+®–JÍH gAxT­­Ùeˆ“%ÀkMM©‚žEJèqݶ¿ -"çØ!ç¹jÿeêXæÒ#PE¶fÑqñð~xxY7_¦Ûõ“*Æ$¼òÐüüüMÎç—°¡T_C1í`äǵÑU ¾Êp——Ø¡Š¦£“É}Ðw–2S¬ªÚ~Fk3ƒ.GÔZÕGTWëÉz{C)ì7êC•ßEáR“>¸ÓeÒ¼qÙWÀ <(àÏ Dkõ°èu½#ü£A=ž†!ކK8ØfX„©|GR­]P㓠ݸÃp:¦¤Àl%&¶Ðïð ÜŸÊF^3d‹#†Úôs9„’jçG]þûOè°á;aš>VýÎ9(üJC¤õ"ùòŽ×dåÙð{{Kzga+鯲CkpK`Z!ŸdµVÒ§róü'ÞæâŽs‹|Ã1ZŒA ïx¿_eg–{ê©Ê´ÀÃ4'(ýÍI³²Ë5ªÐˆïpŽ¡k%þé¸?—808\q2p75†NæÃáÏDEE¼^¼a¥–¡,ÈQ·°…¹Ê;8DB·d$¼"¼„¡`ÉyÏW»Á2}êæœ ™©¬Ç5†œL ƒö›#òç:f‘^É-Øl¦ã̉‚˜ êÀ‚ØÕ#¦ñ ËÒæÌÁ:qf(ðIë°3®jQò „§¢'#q|âP!m¸cè=BQ\Í ®ooãÕ Ž±9#[GWmhnÔQPMÌ—¤´’‘½¨¾Ùº·!„8ppîo!t2;Þ¸?¡”¯âê-Âéá¼+jt¶å€kÔzRh›¢yùG.90y–¯ú¶sƒŒPH/$¡#öq;›hâ)é²øó?]f+žqf´BÓöftµNH+š£Ÿ ,ùçŽK™Pë?õ¾fÒi…I&þW Þ.ŸÛ±zyߦM=ó7Ћm, ½‰!•¡éÈ›åì32 t{ªcžÜD¸ÌårsØÜ‡Ögî‘äò¡à-×9¦Jɼì6?õÎ>¯Ó‡s Âç£õDv®±¾Mž@ q£û‰üŒ¨dsˆ„ØvÕz`UžxKèÖiLjàÇ7Ÿ‹•iöp·% YNjßÂï†Ù»adTµ` «Åà Ýèes˜å§Ö q%ì|Ù´v%M”ݤçú‡ÀLØ…[¨j,È—Z-æ­’ÙÞøïi{°ªù2Á)­áœî] °¹œpôçËF³ó–u°ãù®=W%_êm àäÇÐÀ+#hräÓN¹.ª;‚‡$=µèšnéÿ»vã-ƃCk–²§ qõ¯×ië¶ý'¨Þ­Þ§ð×”pÝ›õãšÊ†!ÏÐd2íºà|´ôï=¾{(RÂŽýúiö&‘üùÆ=xªí#æ‰h>EØ›té. è)¨çÓѱ`.ïsçMVާŸ*D˜RÅS§U)ÒG3#[âs8õf߯’n º¬¬[t¿L$f¨Þ¯3ê¯'¸õਸm³2ª‚¢¡yßkecê!ÀÄ€„ýM|cõweøu‘ø©ê²æA02õQw+ÆNè«+¼`àœø\U„áæ“×„]}çzÎÒûy×öc° å¿ß¬ŒD|ÓsßGjF²ÖY2‡Z4¤•'Axc•ølpÛ]QÄÜ`±%"ÌðlÐN¤;€ÉA½ÃDX±^ "ó¿ÔË~ùoOL8¯)HÂñ†â»!÷g<ýUDs¾ÿq3®­yTWy=1¦“«IÚè±CÒ©˜t{Å}°mòlÕ±ŸÑ³˜¶µˆALk–ÏäŒPìÆÌXÂ᪃Œa’@û ‚¿ HE"ëæHšb«Z“8±¶-;Ü=LÀìÀÚ#ï×R“ˆ\9î¾ãBH_ôŠMt­2X8Fw÷¨ÝHÞv«?äT†LÚwã£2¸zlo2¡J"\d™*°Að³qÀ^ºëÞ'ŠŠ8º×ȼtÌÎDéíêéÙ5–ÿ’­ÈHcÕ݈è¹7ž™€M$ë3’”‡%^'H¶S.(›ÞØÞž`x`©ÈbÓÜÁ–ÝM÷¢3ñ¥Š_‚Ë1˜WV)Žº]ë¶ÂrŽrq ¯<:¥·}ל6‹šìÜÓËm^I7!KNðË™Š 2· ®òf-Q€=íÐBØÖرNyŽÊìZ ×—ÒɃÓA$l–SçJùŠå¯Ô%^|NKG"È>éÛ+bxpÖõ`'§‘‘±6 %Iꔢ²%ËVɉIO‘Lf·œ2²SïýÎn+^Ê1ÒY^]„Œ£º¼.ác'eM|Ѓ ¨‹™ªÉÈ…Ëÿcþ4ñD?qƒ¿¿[·Wò—[.Þ„Ó>¸2ú_P›T›r\%¹¥Q2 U\f45Y" ïÞŸB@¾^V0êú¡ô};[¦ê‘7ïö뫈‹óŸEËhá Bƒ¯ ã'é0/z9!'ËõiUÒ8ltŒ{H`—Ã!›\iØPÚ$>tE;¸{}9ïá\¾’#’!U¡ª„¡)Xx:ìYêËÜ.'u“$h¿Õ( Ý™¤ŠLJ©Hžç¯¹çlʭƹ‘ïÞyæÓ&ýƒ :bš;q¼çɉ°A¤ Ê"-jëLÆäÌ'‘ÂR‚_‘—QVjç¡8î³Ê›Õ…ÞœOG6¬yô”¼¢g%È…£¯Úo‚æKpj§ H Z²çˆn¿K»4 Ô…Ï&ãäÓØ»‚‡0–ïoTˆqIó» ìâ)ðIÆÝ‹Â•¿'`šN†õÔ:|85ve[ýã,rAj‹ë¨ ƒÖzž³UG.‘6!N/ýê›ya »ß‰$@]$–¡¤øm•ßvdŠXŸÞúÚª•P·ÃX­ÅʆÁCÄØ`JÝ«oÃW±¯&ªC ¨ÉܚΗ 0ÙÒp@ÖìJkq,w¨Au~"òä»§Äé½2 úŠåÑÜE«JzhÅî‘–örŽÜEûŒ.ˆ'Ë\ÈåÌ>Œ«ŽÈB=™`o §M22LÝô~7å3è£bnié¸Ó3=Ûx?´NÎ3£ ²—RDÝRZAŽYš€‰¶n|²\Ü™`Å¥YÕûïy!ƒãgÙ}Škáp²ˆyÄ5<¹\ž€‘ŽÎ¾L%òf¹05‚£W\žLX*s!¼ÙM£Éò)Ū‹"'+¬F8ZÅe|p™3¶!ÛSë{÷Ö0ªàKaàÂo½Dÿ´Ân¶ÂF›³g’›dØ0;¡¨ôo„»ßˆ£#]¶¦â… qNWaN^tI} %'…fâÆtT5\õJæ³?´¨@]ƒ7…gpº“ωÍ+’„H¤ËI}|{O®áòÜuÆÿÀ'pä‰îm)ê?Æä¡JúÙʼ†’¤îÓŽýÑëãç-‘î=2ìÛŸÎ#¢tQZ¥ YdÚp'pÏBaÑ1¡úÆ­AkÊ ãí ´=+‚JTœÁ^|c\‚j‹™æÛcõ-\6’eÏóîÊfiÎÆ7NsÓD=ŒZ®Ir‘)°£j‡©­qlœâ_üŽCVréŠKLrvË7Ë :ÈϦzŽ¢d޼ò05#æßªÜ®t†U#2 l÷¾°œõ d}”ô|µ-"~_.§‚Æ™Éø·xLý±ÍEvG?J|Ê€ÆÑ¦œCæÏ;<ê¤×ç~®ÍŠrÚˆ1d¬Ñóqè°¥ÖÛbhŽeçX¤p`Õ,àXeVœíò=»+(>²ñ‰£Ó¸¬mÅr€LD.Hˆ©ûÆc}î £›WGŒF'Ë7ZÃp5N:%§]›W‚‘h«wež»ì ‚?°ØyÛFÒ6}{ò à"û+ªô…ƒ†¢z"0|éAiw³m´*³¡dí´Uy>XŒY¢ íÁjWyü¯iT5˜/›)H®Qlc”Ã^èÞkÎê웵|ðCªûË/YrÇ3 `ÒÀ¡e…Áwíw²—ITf#ßÁömýT̹•C*sò—·Ÿ?fq[è#IôÝú3ÁJÀ€ù°æf^š¹ËËÐÄÉG&÷y ¿5¬ Í9sÂçb3}½…]8µ-ow"^S㑸òÀ€€10Zi˜j›y´x{v †²^ 9`f{ w½˜,zMø+.—¿u†5D„>ØÎso6Skwñ%Šª¤Éa\¸zÃί‰Ä¸‰«Ó™‹eñçx`î%±O®§›ïÝ©ÓüQÔhœ²Û1D‰ÊrUS[ûVÃl¤)~þÜÈ8&7R¿¾îÀÂüÝÊG!Ôš®ŽÛDOƒÈ™ÉÎCß¿C·7’4éÞ€”ÞHvÎ\›ß Äl¥KfÙÐ"Í~T[8ÔþÅw,µs[­…$r L Ä­²ÊÈMJüÅN»ß`Þ“:A' AÑ«¦:bDšî+4ßµ†·MaߪXõÔ\cïBÕ¿óëêÇD‚V©G-MÑfbocˆ;ȯ] ²ÔsÏM¤Ûõ €àû-r^áAÃZÅ,ÐR{†ög{4àõè«3/‰žÜw;âŸr~/›Ãð%J'f–qkn:<2jºzàÙ‰ÒùDÂÄÞ…[P=ú –~(ˆ/wËêMÂ:ZP K CiœÍû 3=öm“ Æ5ÍÛ‰#"ró¿ÖÚÞ¥ž&e(å•©v§‘InNä³qÆÖ`(”žVЭ@+¹Žò×Mšž&$^èhã*“¬LO”WMãäºxÞçÛŽ&.Ypt¯ò`Žˆ¯mQ2gã°+Ð<Ñ,¼’–æ“Ò½=fš:Dv–þÜ7jDíày73{ÏÏŸ–>vô†Ìù8|Lȇ*­ß¨‹‹CB|Ÿ3 ½§øI)-ìÚ!Qkz˜©jó!ê—SØÝOz/ªWîMáScEo›ÞD+kwè«„†rFô"p7ÂÎÝ€ÒG‰G¼©Ê´"&¯!/†êå$€?G„E§™ûÝvAv3‚çšÐÁŠÊ qA„wNù¹ðÔd3Ž|'?]²Hð*ö>U˜ŸD·N®¤¿‚n+p# eL÷—~U*)¾¨Ö‘¶ÕZBzTÛ b{†CVŒH«C'µYáq^:9w€§©OžhŽ,‹ž'àÙò×Ð7ƒªŒ#ñil¬a<0h”Þ¬`iăµ¶cÖr·qÔ OF(ËÞ>Õ-ÿ¾ŒµY{ˆ„񾮮àu!jä¶•¨âÔA=Užz³òªT@NwŒÞ&-¹ø‚­atŦTä}Çgîò.²+ >rb[±ˆÉñq‹ì‘dŸ‹RÌûÁ¹ˆRF®$ãçXíéÙT*îH²ÌÝ4áY±«ÈE¦gO§awRÜ’ÙÚa`Õöš0Å×ÚçSËgk¶nö¾º\¸®.ù9rÜ-ØV¹QÄÓ´ãÜ+ç‡G‘xµZÖ­$ªÝÎÖ¦œ¨ÀO kÆKþÁÕH½1W¢²"¾>6©@\éÓ§QxD÷ØÆÝ ÏÖ—Tð”ýýv}jǵ¬‘JîÐVt£<¸ò• ¾‹à_•Ì@· QœÜÎ VfAåꪣÊyz÷QRšCýÓ‚€f2tmýöɼýܺ㈶XøƒÁAð%¥Ë9î5¥×«Ž÷?¸‹”~D§ÚÉ̵úlo^Áe¤Z]SÑa¹É~yƘ~wê§{Õ~ÇéPÛpy½÷³{õY*Edcú*ÉaÒ”4ý¦ž°{ KãlæªG!ЮÓx|˜1ò *T¡ã%Ê($¦¬klÕ(×IÎ'tFàz`«³Œ‡P㻌–‡T¯$Ò¹ëlVÒÈÆòþÆìß½uTqyÆ„q|l°Gßnüÿd‚Ÿ;p†±µTN†- ½àñÎñqR+Ž‹ž“p—º­VWê—Êj˜í* n€~¹Ým+òv…=Yቄ»3…iú™,[ŸÌ r‰@T/£° ¥jè—{Wœ‚*¿…om×V†ÑZu²ÙÓr®IJ:¤f8î4,6´‹—×ÏR8‡=²w‘õ—ç`¤˜>FƒðO× B9¼{EßdWs×謸˜”JèÔ_—b€ Õ#Ñ= @"¿-üÊ ÍH÷¨ó†Šó{µ;¿C•6=fJ¨ŽmëvŠ'5T¾;ë sÆïrÖkŒ¾?Ë){ܤ¯ÖÛ0tK*áüómy±•$7â~+¥Y–QŽ ªÑP.Ô üŽ—Z;IOì­6Ì"£—AMæ¼ÞõÊõ‡ØU(®‹ï˜»âÿK£yžâȸeõ5§ªŸ¬+[ñí)Ë£zTaROÑ}.M?w­"Àp}Ȉ' Kötà²{Ñ…áóÁ6¿’üÕ&[Üp¢³´Á yÉ]kþqé;F½ÉµˆЖÑÕÜ€Ís´‚ÊÛHF†¥²B&†.ÌÇÐñÐ*høVÒ,rtÓýL§@ÐZ4LÛ/o¿×jõ2^FæMÀƒ!ž¥æi²ó@åA_™g:¨š'œôóBf˜GOA’Yày¯)Lî*:áqŸsXù·³ú¹ÎÉ\fxe ŒôŽ!üþèäýÍÛ‹‰°¨S½vkMðbƒÆKãþúããSA:PÑ:]›t_½´s{/Áw+‹an¸Áâ 烫i×»|¨á{sá!ÕèvgUYö9é£oоˆYpõË6gš¨èæÄ¯báYzÚ^ €yÔ§ºR º7$øŒæý€ÌDT®²¹ÂkÊzÓ+ìãüŒ–¸ÐÉÑV9`SÉch¼Åz¥¹°Ü¿àÝ¥žœ²eTMÍÎë=¨8œp?74ʤï[xO}o²™Ãç1 Ü+›íðuB”¡¼VpÎ"Ë•Ai¼çxW€™¿ØïÇ/@rí™(¼Þóˆ­µá›m̾Ô'#Æ•¯¶:Ÿ¸Ò„ ¿u¬æ–µéKR„¸"Âþ>M¦ƒtŽ>eäs¥2|SHM#Ã?½ŸÂHäíó~Ïøá‚gr ÷K ,¯éû2&ü®(‰œÔlÛ]jƒ‘x™‰»ð‹¶ÏžnO&ˆ½LƒÍ¯¤'ò÷üNím¯ƒåç•c¨ë—.N®+Á=uêuI®]šƒàÜ(:j¾'«¯‹ñýžŒþZ«§V4òÑ'Áí¼‡µÊѯ_A!ŸTŒ^¦ëÚ»•äÛÏÿ—Îå9‚¡L0Aóò“íSÚU=©{°îªz}~<]3D“{}ÜiBæ/Ukub†ìm¤{TëÈvZÛ"ˆa®A©¾Xƒ%ÆTižŠ ];i9¢k³OFˆ¼»¾œ]LBÿGã¤aç¿'`c®÷B8X)Ë'itL‹iÉbPQjBÕÑH 83[,ÓS®EþòL$¡s…E™Gð­kg ᇢHPsꄘ"cõ(Ó#޹PŽKÙ&0Û´ò·.5”­u¥mk*Ïæ9Éq¶0atg½D‚SLɈڇ |¼bëf ŽaÖÔ¾À{·ô ÁG‚ãLÀÜEŸÿ{ŽcSÀ°œ4-÷Òy8V:Kè2Þu ¥®›~Ç4¸cÀã±Û% U*-ø"¾¶y×N¼Ê<"™ ¸Àx/Y.½’Ƚ¾urËæUx¬Ú¢ökî™®)‘W¥v¸¶³9‘ñ‰«wAF¯²–q/³ÉRâˆûm¹~É“—Óš“³OÌ’Ž¨N—røg˜ÈÞ¨g1Æ ë®¨ûõëÇ•óðFÙééÙG‚aÉàtŽQ3úÓ/lçà€$Ö- }©è`¾äúËC'—^¾è KÛ³JVtø,‰¿~{öK…/1ióq{{KÈöY¥SºnB'숫RÌvŸÆŒÀ(±´Ò˜ÞáEZ”D6öʘ5(Á­aBP%Ýqøh?4pÉo ôÇ8û»el™h'žpžæ÷x¶—g9®aŽÀßU\¿·zW8 Ì÷L"1Qù±H $[dÃÊ[•§§UØÏæ WJhÌžúOË…ò#ÓâÊ 8öçx–)=ìöÛßɱÅ^ý*À âЬ²0í2ÏO,'HVqFû¨$=v™¢H\}Q©râ]¸.ˆŽ·*4!hÕ#5m¡º“$ÛÃÙÈÄýrˆB•0›[ÜJôÌ¡öÀfv’×I΃ª‘ò^ö0îgM“4XIHYrT¶È£`/ÂÌ« îp {ÁËd¡¿ÁŸëò•)°´¯ŽxXâ2ã7 f)äœsadî4Ž ö?ø¼Óç]ÛÄ=%{<1èÑeâ½:½¥Õ+ƒ-FµIlG(æï3P{騿 eæFTJ¾¯>Öî†sÿd Û-ï™Iõ³wÀOD}ùí¿y7.‰×Þ§PxÜ›LÖ”­ÐGžuúóœ¤töZÖ£¯Ê®ú=È-€y %Á{ÜkÆÑ‘ôÖ•CÜšçë#PlæŒó``˜ø¦P(\Ž?iÑÜ¥±ó­oœm |‘&?ÙBŠÂrxË4Wª1mË7Œôvš@ÖY†÷6BhÔy›û|q‡ Ô«»Ê³U³øâ˜eYí¦òá æÐk†Ò.²Ñ=Á¶X*XìPÚiÄ9¦MÆ­mÇ^L*ÞŸºwýZ¸ÿbiäМ—­›í©¯¹ˆm0}Šà=8õºxg"kæ©æÚUãýü³åëÓ-6n¾µí·|6f3lûoøUx3ý“UÍXؽ®äq,Äq<ÜÏ£êB°‰Í·Íäßz0¾ ÏÞ‚Œ¼£Sd=Gž£9U¥-ÕÍ3EËÓóaæS˜m0PÕS°NJê© 1 ëæ$IÓ‰8~¨:„…£±ŽÅ>¡fà ^AƦ^ äí*Ž–“ˆúª ³ÏÈCÍÐc‹1¡þßÛhÝ£öîsyC‡×_ÙxúÓDÑXP: HF‚ŒwkI 7dFˆž4¼Œ‘iŠ–³|½/Gt•ÕáEù‹øz³ðÒ BK—"Ý’ößgÃ{ïXG&ƒ¢’n¶5Áv”ø‰šD±0fROá$ IZÃtPÞk’¾ûoô'ý¹g¼‹]®’»{uN[N©÷VQ¸zéÊÃX(2Ñ®èϱ­Ú`¾ŒñÉÕ‚ŠjßßðÛïR4s}.³…è Óªþ²wIW¨¡Î {Ï^[o³ÜSͦ"7áÖÉÈÜÇŸÑZöV¦)ÖŠZ¹~œ¤Cx¯ÛÏöçÉ‘ØO;yù³d[´˜sŸ¼?Hš ~¨ ޽ئ™_?È¿oiÓeišš„‚mÃ3¬ DLTåÙvð¾äÂĤÕP­ßÙä<ëB”í<ð…­Éûxè“„,öúp¹JîÈt½¢…ôi6fެ³ÛïÛâ¹K¶[[W"Ú¬¸Pcù©³7ÁNN’œTp–M+B‘Lª/ÙnÍÉÙÂæVL¬ãè*ò7§ Oè?–tìÄé¦}záù:2ÔU¡*º©…£æ>½Oãü+/Íù\‚$¼×ø“ŽÙÏÏ2§jîEû­º„FFr¢2'|X¤„³RkcŽ-–¾ëÞ¾QFÁoaá))sàmW–¡I»ÝöI¦qG4qyýV|¼B•©PV¥û’µÎˆ9¶BÕ8À§,‘~Î{ >y{4Žf=É> wM£dlÁQÖqñ; ª(6¼1-\9žF•Kv¯¿†54cÅÒŸTü«e¯o­î¶Ã&Þít6â€^‡›S±2Ë<€ä»¡çBÛêÌær›²ºÛÚÙN°oÛSuó’:êÓ˜Y˜ìÚnqÝPÀÅŒ¾7èŽ1¹ó ôDuȬPøØy™` ÖNAU¨m Êt®KY}†Õ Ù¬«·.)~;ôÜh½“Cd)‡'„je‡íÚ:FOB¢»jÆÐÌVÀ¦$ëÁ1µÀ ®r(ˆç“æö±’–xàÃæn};%Æ€ìò:å¨msX ¶3toD/Ç+ÚγóFñ.Sê…Ùã§l3õxH ´ÄÆ!È Ùéxo<`b¡ÒêUH.z”º®”ÿˆkšËÍK‡§0\ü¼÷Þož{ŜǫZàqïïñO@%\먙AªÜâÁ·›ýýý-Ù–YªÍW›Å68|¡#V!B%ål€”ÐÛ§OЦWtr‡…Ù]foy…Ðý®ìšÎÛòQ³*ýÛ“¤óvÎ[ò”ÓøŠsäïÇIÌ{tÞ­Òµ6ax„7[ÄH}bk[fI„Ãúí+%G‚˜ú£§ËXÑ–‡dd°(üO‰¸<°7tÀ>e¾£¸õè\;f$e*x.è¬ È4Pšƒyj½ëAï×ß¾;ìÚjºhaú:=@£ýÛÛ‘ÜTn'nŸaðwŽç“3 $qÀ'Ç‘‰J®Sª‹p ñ_YUxŒÞâ°nyqß¡DDAΧìàw_2Ç?%mÙ½(6¹Ô'— ® µtáÕ¾x?îa^gX<×?^àmþÔ'¶ÀH”¼Á©Ýº?K·n¤"ú~/¨Ú[¿¹‰ä^CºšoÌùL>RÉ_åÎþê~Ç^ÂÈVÈ =ü¹õ–ÂAñèrV_ZLt’tæžßÐø©ûºÚêëÔâS¯%þvˆ¡ÿ‘)ä"ºí¤‚Ûqµˆ4¤14 ø@Ÿ0ésàóë®cëd¡Ç¸~D^éúÐ"S$~B_.Þè#ƒÑ~Þijõ캯=ù¨®éºWfä+ûË«»`{p§æ¥gàuhÇ×d³×a=¾[¿âõ±„œ{Ú|3'Ø8DC]!1"Cýÿžõ»)ß0ƒ…ÝYl$a‚X²3ÔêÇwÚ ?r’þí"ŒO°Fófd|>ð&FhIC¸;cT™#.y!üYÙ‹6ípRWŠ%¦ *áËTY _!⥧#Á¶w&‘.ÒÒÌžÓš“ˆR¼Ÿ’‰–^¸´ÿæÇlÎRpfš ÑØ,(½Ö¼mçÝñ¼ä0׿Ÿ–x|p Y›†¼‡ü‘yua¯’šØ44_Ã_9m‹¶Ò°&Ë‹SŸp›ò›„¼ç5w ‚†k>OS:~Ò'ê¢Éãß³ü\Õˆˆ€øÎ lŒÿcù®ÿ©ã?²g܇™qù‰‹º9ŒºÁ áP·ß@>e A³Ÿ‡‰ašö}<ào’)¶¯ ï@Œ8Ñåà-÷10¥G_jO¬•cmÃÒs{ºÔ­æ¢#P_m£G#ŸÖ瀰ûzÞø£³ºØLkJæ•r†ý=-£ ¼--^Äç¸f¢SŒÂ¹¡ð„4MMx¨h¬ÏÖl?EÖØõ#½TÏÐIíßËŠ$&j<‚_M)S v6õp<ß›Ôrvó‘+·ì"Ãn…<Þ¡¾÷Ë.kí6nª/Ô´!ëy¡"õ2U§axѳîoMYÿ&~gùVÙeÈÎHç 'Võa’@Çx“ž«ÝÉe3€Tu®o)c¥É–Ü‘æ‰í÷RY¨C;œ0 ¦“‰Ê;*¶oÜ£ Rø—cB1Ô¤çtHQ–J†û!8Áo«ü7Ç­¼ÿÓ&UçÝMµºf$œ¶ÔVNÅ>±ñ“$é¦r q0'÷e¶›§Q"QM]`n¥ÕlÍ£[t0žBˆÎô?Ã'vqe½¾eÕÙ;ÅK%¹Ù'ÝÝä[=íq²òssN–üvc~G?ÜT1Ü´ù ߦú°†ÿb»< ]ÔWø·rGb~¡Hkë½´2Ñ),Q‚Q¸^`¯È½å –s¼´©ÐVú²ýl;ðîЇ‚É\É$ùÌ-¸V$Ä4O/w.¦ó8‡”G!ÁÈEv¿˜†=æ3’þÝB¿èñTóå”@áˇ2{Ëc‚§ïܠߎ£—Òu=£Î²±¿­ÌtY ЭU·†û>TkŸ$Ò–Od‚jRö¤}WØÔ ´ç „Iý‚)¦ Ø¢dæ $±H"›™w'”€u|'5Ã¥ŒÃ3§‹ ?ß“Üz »=‹}e!€ѽèÕGE¶‰ûéãj 3QÛ( £;¯0‘ö’ñr ?f(î²>åï÷îÃ,[sÓ©8‚ÒKÜq'Ø`ãm8ÆOÄR.Æ J¨@X¼¥Z+8j/á êìð¢k4š\^>…ç^ä‘\¸´²bûBÙ[ÇnES6Ç^›Rü³¸Öê½LåÀf1zášdæ$i:ËEß KUÞZ9ù?u¼ý†åYÀÎÁÓú\®’#hâzÖßïë‹~«y5cz7¦cà~ÿ‡~°ç²¨ Èfqͺ$¸0ÒÝ›dú9 I.s  {J‰Üùo˜&¦_\øï8̧ Àì-ª-w7?6Ô338ßFa–Ú ¯àép&×¾”â•B"løU1ÔA½¬ ñ±qmÒ/ÆŽóäÔÜ8ù§ìâ™àn:+NßHq¯Û“¹J݆ü—åùÙëЭ쨩fá{_~Xg9Xb¥ÿ<1ŠÖ¤žïÏ j¹À(ø„o/KÍ:в‡·…üà"k÷µS¸=7QÈ’ÜuÉŠHê´Ø?S²!8(O²R©š±(¦R‹ýD€sƒ žºy¿ßŽÅWp+_Ár¶Í:6-µ¯ÂJM±ÇÍITü ›ü³„®sñއ.A… «©Êuçĵl; +è¼¾oOYšÁsy™ë÷S®ŽaÖ׿t¤ w$K°ð¯& ê6„Ñð&ÿwO"ƒb9e¡’ŒòCÅÂÖ†·i¶Õy¤Y~u®y¢`O–Yrå`­ ÐxÝðˆ,õÌ@ Éör?©ÿ’Únï˜ ¬ZŒ7JÌ¢osú›¿ì Eòq€&J ŒÃÚxDõÛª ë%:Áuœ„Â/#õMýÙ  û„Î_ëë¬5|_¬v ^QÐù «ãÒ'âØH­übBë8vk6ZL¤Ä˜­ê8ÕžpS'rÒ0ˆSIy†8š†šú’ÃÇ;†q0Ë Ý*[žÀæ:¶— T8rcF /Ëp%¶ËȘi÷'7d癯 ¤^;`¥aUéšËߦa™‚Æÿx´cŠÌ… í¦£2dö©J &ë°ÿ¥†æY~úU©Îï~C.øÑ1·T¬§Ë;°=sçó[¹ámÜ:§Rí»À¬çû?5•â‡ùZŒÍTÛÙ >Óî–ñ±mvf×nhŠŠjCä0ù ÍUñM{l„ðS±^x“xR¶‚°…•}6ê¹GÍ4È6pÝyÕ$Qè1„3t™ ]ØüÏ„äÁ×&|X[;65R% â?Ð!óK,¬wy5Ë7˜ß^È”Kr O¨¹|^t&P^~:×··Ó% n#F÷_}«‹ÿ%™¤VœiˆVÌLOèÄþlˆÓ±HÒFî]O²î²ÔKˆ»]÷Ãz?nþâ´ oÈ{úu 2}9/+PîzUw‹-ÿÕ®¬‹{™%‡[H3¨ž#¼Ü¾¥¡í$U\BtºˆŠu¡RnζúçH:c|›ª2ÃÕ¸ÌùÍO9³(SqYbh(.ß­š^Z¥¢rbYg¿ZQ÷’Wœ Üú|™ÀT\â†ÀíUð×9…O°JŸíÿÓµh#Camüd¯Jâý´žÂ¹fQd Ë=瓼§zw0×¢ýº¡pÅy^ ÷DÓÉì,éÊÕs5GDkºä‘Å(ãŠynkN·`Åk,¢bÛIƒ%˜Ìóï¬Åõ¦Y§£J¦¡EÅædÛÅÚ ¢Ún{,¦<³ÞÎã‚÷ný·ó̯ÖÜTóB ›%ÏoóyŒk öFœ€€ª<”iÁ"Y"í5ïŒFØ x›üÐí ¸rã"ë!ÕS©®Ç©Î`3߬"N‡¸h…K|Ìí°v£ WÙ.bÂ6¶f!pø‘®Ÿ²Ôì6¢Z`'Í[Yb×7¢÷¸Ý8‹l¾0é‹A–z3ÁºHòëi¬+ñ§î3Hgb u¯T¹’á):‚™äÕjÕÿÄ!»”I[n•U)BA@I˜¨AûrËÀ¼yú8½c¤Ñïž)}Ò"™Ÿn»Ë.´Ñú¯Þ]ü!ÞA램±Iüo⇤ŸÌƒ_ð—ÕçÒüãÄâë ‚Ën`è­Þ|É^W2:‹ÚM»×DkÒ%)JPvöd3F«ðÓ»‰¾¾åUë]û2ùèn‰ŸG,…åñŒ¤®p*€°Ã÷ƒê~›ì‹Ù°ä3%Ò~‚sœXÜC½°÷lœ„¿,_öxËÆAO’ožMuBÂböã!±ÈµÐ®¬È¡ø C¶ Ò}“©ØdÅB'«¤ÆòsÀ•^úŒoÁ±t}£ð[3 Ž,ÁÇ OÅ‚0J\ŠÎªh^ÛŒóTgr©äQÕ¼l[QáñDQ³×ÂàH­Kˆk=š–"B$õ;üx‹}ΉI2›tœ]¯l[žâIã k Pºòì bp¦¿ú9PûŠ¡«Ôì-uVqc•oÄÈ,5„3Ç:Ëu¬±'áì™Irkú&ñA«Ç†õr6,U/ ͈õ{ÊszUœ‰ I%£Ðœg™ºÙ€óæZq‡²³Z§ÒUC¬‹%û4‡|œÆ@šÚ(™›_¤.Æ_ +}ºIˆååcº^.–ŽÑÞ2tÛˆ«äB†N ìœÙ5úé²cÑ沜¼çÙHê“LN¯g‚DÜúÁœr“  ØãoÖ²[-=^Äís™‡ZP^‘LÃjŒ·êG[¿„§9;ò)o~ŠåKʺ%.sS„ù—ó_~ÅÈÁAìek¼p—d‚–¯Á°[IvüGò0ÖDô%mE^$L¤4•ìæþ­F=Q€ŸOVPµ-&õ•à‘;§©Ü™ Å˘³[jf2ZGt´¹úh³¾ÚèŠ,­ÉݳúˠΖYIvhGt'C)Üx²¸)CU4C/‰†~[¼s‹š¹rg[«XCgóà3©G,—¼l13T:ë&Ëwû/ƒf×i1_ —øà+?žY7q‡§qó, €Œ±}Ø6ðY/ž0åè lt3Ò”´zþ¤*½´7}li6l†^½Ïh¬¤¡±à\[:Œê¼…•êýtâ}ì¸ëhûíaîTãjuà!4s;Íœ^!'7Þ*<Ò—¢mª^DÕsÚ(e|:݈ãd°”UVý€`õS†¢ðòW˜§¢BCM4T¦bQôÕén}_ÀÕ&#m»?.õoV@•`G ¨Ã\#Æõ1Ÿ^k…IÛíCâu›&e}“ÄkPG¦ÅºNIÙÉ¡»£&íBQÉeIç}$gâˆë’,=-І8la3á"J{¶4)̳ËPPÝ¢rk“_9^ ŒŠÃFÙú”–\nF冞Î)¼ÊüÝM9&K„Õ¦#q ¾ej›ÿ÷)þ2ÏrÝÊFÐbñ7§}†O 앎Eî_.°Z~Í0ð8‡.‘"9Í`VДù=TÞ7©>(/wY—ˆÛÁzð£;,±Ìe+8´q¥§»3ƹ×EÅý,BÀaƒ‚$Âj¶ÈQj¼2 . JcR8'½W7¬X}Ù2ÕÌM° .þ“È'.äêG÷oÁ×Ì1Ã3[«'ùªp^*ÎWT _ðóZòJó¢©À;²™ÙY¬tÙæ­`UÜTŠóïóu¶Ô ³Â9 bÁä2ø9¨·>WžErÐïͧQ6‹+š J·.GŒÓÂÂd•·|¨¡¹šh£­‡Ò ;vŠ ‚-C0M© “·šîšs ;UÌæIg}AµélDì‘MQ›&×põ€M 0ÜÄÌ'ShXî)ÁYC™¦ë$A·œs´vSÆñ«ï°™SEº9kÃrÅ9eñ“Ê÷sÙ©¦]!½3èP@ÛIEˆLöp†$£«FNYšS¿•U¡°eŽ“\Eo$ A­òÍæÒúFWßL-ÙŠ+nN%´*²Í9¿­3>4øP…[‹*} y2°Öì®íÃ.Ä{Z¦É^*'ØË ¹( ÒŠZ:ç”é½NCâ›w/>r‡˹—|‡ãŠÍü‡Óçᑞú§Êv,Ã7¯f†ÄóB˜¸ÁÈͦ\Ç€lêˆfðMíÛ9NQZ‚Üh{0Þ1 Ëc­ÕñJÙ‘GŠœ"þ)I³\:fº$*«¬[Æt±¨|ʹ»QckY’É@·ÛZY™vJ³~le‹¹*XšÁ{ö)·<¯èµf­âZ¸œò`x¦žDæ‘(Ö8È…@kG³ùwôèâwý­}»F'ÊÓ­Aj®÷l„Ü‚Tƒ!WÓŒìÅ`’ÈdfLàá±ÎÔÁÄöŠ•~6€aò`ê È`ÔXtù¿¾eÍ5L‰†S’ŒdùI0¡ÊN›],çxˆ"TÑÌÍí:UצŒs‘йl‰®qeáo»Á֜Ù箩Ò=¨{å–™|êJ£"˜ã'Ù˜†*ÙÇÄ‚4w!%ÕCQíªáaCh‘€°Aœb…)%9lñ«%I•ýp€TL¨ê•ýè¡Þ¢%C”‘|Ô r¼@5–éd°F1íš1W˜8†Ò„þeŽÒ3'´ë.ËñaâçŸH»i§à„ãUtîð€‚¢›í…˜B¥"\™ðÏ'5 _¥ñ“ºM9N=™’X”fâÝ*®A'é_ñ+f6«ëŽÓï}¡E™áUãn —O¤W‘—pöÞw8#fÓ)^ ¢9\õo&¤¦o2°¨Ô qž–ðü;’ë<ÊÁÏX9Êé×4Ó‚T9„Ù¶à ,ê+´Êï;¶$ö Ê)Þˆþ£gp…@Há^ñáU8õVJãJ+±í'>‡+ ¿ÝV‰4Cl0®Þì$͸NwšÃ>¾‰ç£h·øwt0.¬÷ìëhe‹!QÁ9¾ÌtôrÀl…°€uí}¬p-”BÒ(Q«¥—˜½ôÊPÎù*òÈM>ÂÎÎÙlM=²‘|jÐs£Ñc*º?êlæ‡IŒL…÷´G'´QË,Þòy!n— ©ú°?I2Ö³†(ùˆyE£iF¹®Ûýç’Õ–¨¹"ËÑsáÙÔs:Ë-™ø3gÈ)æË¿Æ®í'uh;ж8ñÓpùµ…¸F^µˆSåHÛh€3{é†L¥…ºæÇeÃÞÌ%Ÿ{Î[ë ­¢b%}èG$.7ÈÐc£4ŽqX«õI1îUúÖ×ÅTÏ}U¥V'$’z¥3MÄ9 Té!`±Ê&8ÿI8zYÍJ+µcˆ ¤‰ f#+^™‚°Ø‰õmªTÀÐzRÕ ï!’×m‚_N7ÑÈO¸»€Ëƒ(ó—v[òbÆ­õï(B³Þ«Š}£UµÞÇ’½üÌ®Ó>G™°y_ûµâ}Úwý3Ç Õ2štJ¦)æÇ‡úMÊ£·ŸlCòܽôs†éǃQœÈBQ ….¼öüÆ8*Ñ…BÛÙ~MÜÒÚ€G^ó{qãüÒ5°â-ÝzÊ|¯˜µ—4ë<¯«îb"”¤º YÖÑÔ0+ëýw¬Ýl+Æ6í'lTQêKPÙX·sŸ´„¨@vž ̇=K Ë'•ÒfH•*±uØÓ‡²$7‡ÕM®~µ‰É®#˜ðå±–+p³"¥ÐÈoÇ-ÜõµìÙ©ü’¿7ýŸ‘ëÁ,HÝ7h'ϧÍÀÁREÐãŽÖ˜.‚˜Çt]š 7ëKÞ„ÒýǦÑ5>°‹¹þ‡£úeÐ>ÌÂ"Hc Ã¬Š“>íŠB¬!‘Õòu‚duN»™ª&<2‹@WQ*>]oZ7ã&BF:à$ZòÕÖq›ç1)øÈ¡©¢×»k‰ÜÒ<»º„Ü”8©)û«6®¤8ÌAøëÕw-ñoUõç0{VØÜ4GÔV•äSÞâK%{ϲž cqÎ “¡*§Ïð\K¢"·¨öî/-èTj>a•›•B3wŒPL@]9r…\ÕŠCwóUü W}R0ƒœ|r>[$ž:¤šÙöDà¾|{oé%"ÝO¬_NÙ¹6§î¾ xMV—”¶Œ¬Å$ŠG¡Î›æ2 ©å­v¥WŠ.³Lúìߨé"V©é³\Â$#p«ý‘¢ÕmÕc$è›Î¶D¡VDxf®R 1Ú†[ .FaCSã»èfçñ\ÚyRœØ¯~~Ù[­l\c¤W›7äKáé€Åá™tŸ~‘Ùœb„-®spUß‘¡8T å…ñ¸"¶1i"»]˜µª„Å.‘vòñÎL5‡u û“’ˆØUœ!pYš¨§((í °Z#è°›!™+ˆÄ€ÐûÍjœ÷üìò†Üâç×”ZS£ª½.&È‚DDi“E䆌œÙqâ>W°³ðqøðg—{‹3ÃóÎa–@MíLƒ]DÆ`¹™>ŽÁ#f)f´Þ /×Ï¡S)Œ¿@…Ï<4¼Ξñ†ºª»÷ÑËÛ8ÐÚÃ(mÜ6½ÌKFÓ˜pñ‘üØZ¦G¸ÁÅ_‡BU'KØæCŒ+/ wGÀƒ…pZÈZÎñªÐ=¾4ww:ç²eu> Q ëT¥v>Ê5tÀ9uèiMp¿8Ùîú<¸)èÔ(¿]"*GB6DËx?=Š—•[%ä‹:îH@±(0ó:ô²©«Ù™ýá4d:áèàdõP*YE)A¬rM¢£«A^qìØ_\“M0ì†w€6å"56¨…9Õê“GÌ¢{‘AÐ(cO]|†0ø 5aѹž о–Ü"tv4¾­)69Bxkdž› ¨?…¢J_¨§–º¸7ÈF&MGx¸·Wb={Í1‹%¢o¢:ÄR”c÷’y2 ÙéËávØ—Ü<Þ@ƒßçúÙx$€¸î öÌ·zî1„»ÏóÃÛ5ÙÙpÐ6;Ïú±ä}´É¢)V¹!Š·A7yÞ¾ƒ¶ÎXïAoËâÓšqÈ+ [duª}¦G§²Í-YáØ/ƒ ˜Ä]w­_;ÕêJCZµR%GÖQ3à«Öê Àw‡cZ$^‡ß¯ÔZŽõ/˜7^Ç?˜d _pêá¨ÁŽàÁFÛûT¨³ŸùtÏ:ë ƒÜnL)fó{5DÁý³š…­eM­"‹°µ ñ˜7 Û…Ó!BJNØS»šjNVj¦µòle¡ÌxùáµÃþg”®sciMÉZÄxЫ^NË­êù™E6@ð*…B•‰<7µ¡j€aH,|¬ Äx‹H‰è”Ëb“H âÜ4‡-.Þ»2[ûS1*ý7Ò5:ò,LµÍVH°hÄúÝáEãˆMÍdÍË !½G¢9ó{³PÎÔ½\4³+Àéµ0íREµ³Ù¥„’BU +ã ‚‘/UouZ£¥òGÿ åÛ)@Ñ%Èy Û#a0 ˜AONðp–þ®Í6bmÊ d± ÊÓµ:y¯ÈÏ:6 ŒÏX^ŠF.Ò”ñŸ ®D‰¦:Pà«·½@Õ©N™—m‚/à[m6 &ñ“\¶Á¢tšÔ2¶¼‡*Mw/ f‰kní[?6O ¼qßEf«Šxé2З‘ m±³»ñRÙYfNù×\ýÖT0v½PrÒ+›jþ~†\;CbQÙR¤4áOï‘HrÛ-6Rk]­a z™ÚÒ*ÄžNþ PÀˆÓ>Œ—mR öò÷Œ`N›Ä^¦úé¾w}AÌœ¸P[†<݆ÖJ^|$P OÅ#‹.%hò@™¾¯ÌóòZnĆB½×43H0#,ß²± ’«×«3OÈà3ÌI}ôX#ÏåûÜâEˆ ¶Íp„÷ò0hÜŽ k†| ŸßÍB“í}ºv‘Æ*êªíR%«††Ø<õSLŒ>×—ï#MÚ|n’qy®™?dWgK‡ä\=G0It¼ŒÀ…|µ ؈½»-&t0#dÊZè;ÄF–%˜[°Cj“ÔcG5G¥íià,€‘S—¼M.p´à,!µ'`R '’ïFSäÙf•%1[r .?³µ9¹‚ÃGçP¹böµj{@žêltlš|G·ß·o÷™èèÄp·²Z{#¦EäLPWKøÌÍJ<¥0rŒdO#VîrÒ ù‰»bTû®6Ä//%K™¢0Òêr“¡‰ÔËò–îgW¦–µ@Ä|çl’OÓ cdè üÂà0&á›’}jœâ$Ùûr6G%ºÏøt÷í)<-Á)ÛmÍïáüBâ/Ò€ÇBŠøPdF™ÁÎ.Ì¥=¬-…ÓY–tV:8¸X –ÃWœK%EÒÇ‚à+—àhIZî#Ö-hk‘¼B·Wʉ°à9b~ÆÓ€ã¹B;'¥Œ¤{z1Šã—ÄMBÊOl+ÇÄÆÖÕڽѧoüÁ@TÕ†W™nîHf¾K©¢º„°®IX–PwKŸ/†MIé as«–$yeAUc5€36=w»†¯³ô-.±’dºoŠž"Ñy ÆäÇÄ!’òO›æ’XM.ªç> ׇÚp¤Ó È–Pë1¹àï7òHŸD+/NP.ÄMT2Æ¥×mJÚoÖ­—œmé}X”k5ùæ {ù¬0ˆ™]2vâ_(Ô¬“¨ú»¤¼QeŸký¦¡j`®V¬0áJúž®g™ùþßœpÏN” «úhª­Eú%G= wÉz>Ÿz˜öGƒ vðÁf£‰dÔè¾D§¢ñ~NìÛ† >ƒW˺=‹†õ£Æ‹Ü™O¬jw|±á=Öójök}ÕØÇùéÆ#Ý¢õ1I6.qSûÔD¶†{¼ )GzüÖJ't; ‚Ur»ö˜\{µGžÕ] “2¹¼#ýžBÇ—CÓ j=7Ù¢—¦í2ïHŒ¾ÍŸÌ•Ú9­‹îGH­ÍL¼3a.Ôý!·ûÓ_GÆJ~4eúSÉŸ#‚Þ|/B(ÏÀŒ9“Èë¡Ö‡/qì lî—dØ[ÑBˆž¶ÉoC9tlüÎAV_1WNe{:7gƒ’}DEÂXÜ«N›©.Kš¸Bºi¢›¯v‚Õ{³QÒÂ]òPŽxñFÓ-yåøÚ«Ðkuî’œªný±¸‰éï–fdµÌ6ÄO6!ŸèÇw½ŒG6í¤0oä&¬‹9H´§)§Ë[9›?o5 S¼ÚL¬ñ¶ÔXË]ÊYè$} ¦FRž³¾>‘8Al•0¼?Ôâ ä†ßµÐª´ê¯Lp²CôÙ)}ÝRû±²×kwö-¯™”›ª»…d®š»W8ˆOHéÖ„»lšÂ?#㉞5*Â5©eÆþo<¾ŽÂ"•%=Ë:ßS+e!½mFKfŽi-ÂT£„ãØŸã׬¸˜æÅƒûkÖ0|)zµ¹:uÒtWûª¸•N<»wNFø)LQ~»ÏXv+9y¤Y^\H‚;>uÏ©uùìVãÏ+-5w6‚6–ˆb1-°¨0àZ„÷Æy4š<ñÇbXÆZz2Ef o„P,¾Õe¥³ÐNcÅÉ’9d“п,±Ã¶NkéN&§€u899|˜~ P§ãÉ5Le.R¿æ«åÞÆóí¦…è7øhKsåOñº[»{n’ ofJÙç |Ë­|:qÜ»AÂPÐ0ÊìízøKºš]£&Éî$,,Št2«™†WDäzô¾…ã0¢ À<€{ûÒÏ{õ“!þ°;™ê%l¯ ž&F@;Í~0bôøË2 Y~& <Ž£Ÿvèž,©[œ)9ÃTš ö´ôÞÞm¸Â°½ÉMÃT™.‘;ŸÐ¥?°o [4i¬¨) ¯VŽY4›teEiy´ƒAì lI »ƒ¬h¡©…~ùÃH³,„SS‰â°{ÃY«ˆTý®7mBÒïʯS ß¹Ç÷ˆ@ ©Ñ/lWßÒ“È­ñß•—´þìD²fYë!É&à±mÛ8%€ìƒZC”[ÞC£: ° Q‰çyÑ/ËÐÞú:iÔÚæŸGÕnÇ÷d]^«L5hK®–x­ÜGsíßÎqæc:ÁK æŒy? U|Fôòg¨0Ji„v“áž ~[‘ÐÊ’ÊQ[&ÚÙ6¬…T&éd(A#BŸæ…º¤ˆâSš}‹#]¦c#$ée­m{:£4…\Æ|ÝYmL<ž,Üû*°™!èÑF§Ñ­85 Fw¶D1Ep1ï³\èWj e>Vª(íZ¶ÞÃ(B97›­Ii F.vp¬¾bÙIhΕD¥óœ­;ÀV‡voQå1<.»bÉÒ3Ð ¿ÎI]·|‡X·­õМ°ƒ”…!X»^ꋲøÆGO?}².(ßJP3+TRGÏÇ—r[ î¿áûršD MŒBOŒÉ’¼›ã§ö°íŸ®ñ)wì6„ë·xÝôjGm0›¯Ûyc)ga_$€¡ëÞêH'6qêQ0Öç·¡¡}.lg˜·¨„¨ßR¢n…~\nl`ù©ºD8¶ã,¾æh5n-]0býñ!…²/ö°áì‹^©4¸iÚþ§ö˜%ÙòEØùŸ·9ºOxD6X¦f}¡¦” ½_¦¹}g}@Fÿ.á$×±ºcµÙe¤k¥³)òtá’Hš®F³–Hóy»Ç ~i#{ߟ%šEœ‡µÉŠ„¤MÐèá… BÚÈ‘½’¹ËN£‹lÏÿ‚¦›tõjhqÁRþSI†26#èÛÑÀfÎ|ìmáDrA±W2(žŽàGcAè0´Ûº‘Mp_‹‹Ï^-…]ˆ„çNoÎÆ•†{óÓ %h± HÌúýýÁÍ:O£òdi`Wµ¹|8;‘}¾OÕ}ƒ³î—Å­iñBô;¬L¤áuùÙR{Q«ç…¹„wÉ™9<%,*šâtev—5d‚)Üpú¼ ™µ7·äÔ &1¥¿]ŸöDº^ªÚ2õ‹àÖÚlÖ!ÙÀ)õÎpÈéôçÏ&UŒhsÆIé=‹c¢ý6àe ˜!<·ô]ŸG 唡ù~@t•¢ÀPŠMší{ekᛞj‹0ÅQ£/èZ±æØ¬yÁ(Žß¬¢1x²–[7],€NÇ'ÿâ{L`¸… \ØÉy¥o`Èmš¶(s¾¦€¾FƒDm}ÿÎZ®&˜y±ÌWŸ·ÌG-’²z%|úɇÉ÷>YìZQ=ã×ʾ£•ðüPDv:p¶ø+MëáÄ“âm1‚tá¹&F×åà²Ìë Û×›g››^‡¡O»29¼asÙáênÛw ·Rî¶ÐÉÕøúò‡SÇ~Ès „¦î´‹¡…uVXNzÛÕÔ!3ê-¾ýKSñŠ:f–o/*öñ¾œ'/î7“Ê:mÏY-A<-§||ù"£Ï9}_ù;æ¾°à£Í!Ó'§KÎe_±÷-w죖ÄÌe»ÿd7xþ°jt‘ýM…Õ"´§äÍ7w…¶yë{üŒÐñŽóþ±-ܪz®ŽÒ¨JõßÒ©YÁ}‰´”ªɉ¤a«çë‡O]ÎK~á'Nܬó&£4e 9‹é¢OT £FMH›Nœâ¯áw¸á8üë«òtÚ†˜¸‰@7ÇfZùÌ­YUZâd|RùŸ¬ÊÐÛú–NÙž®(è@äÛ˜îY WSÅ뤨ו‚¬ræ7BéÓB ³6“~QXO úQÙK5 Á)¤øÒÏ­®‰ù&7˜#É>ãý•øÜëJÿlͨ³/¦}"iÊÄóDÃê=¨æž¿y_˶7@'trë_2¥™Ãªö~O0–Ïä–³Ò¹À8IU™+ï™q§rÈõ–àRµ’ˆÐ(}‰É ‡Q–‰äÎ$À樄‚rbWl=,ì.Ž“LhØü²RÔ¼z Ï­/4к $fÓ€+•U°×\ú¸„ž¶;f%qÝJáŘ•[ÜO'Šß¹‰=¨œÍ¬!WÙIQÉ%,=”]N© E´Ò£}Ú$/Š:¯>Ôràdm-rÖ&`µïé/ Ž­ª®Ž¾ë#Ù¸¤ËzõúÖàI%èp+s56¹¸^Ïé{ÉÒQna8 LnÖOäyõevɤ¼O'W#¸ÑŒÒ}xtŸ¿q´zsA‡GëeGâ©ÿ͎ܨ·\’Ô}„èjêqgˆ#øƒó V”Œ%ܪã<Ÿ›øaà"cžmzùñ¹tBF¤‘Þ1é‘|GÓmDªãb»‰àL›òMɘ¥ƒØ xÍd”Ü:»‘iÍN;W\€,°qÓØ|SÅÆÙ¼Š¡3¡ñº»ÌpîZ³u¢NÞ6hmf©KÖ{0иí…Éknï”é°ê±21¿vʼnŸ˜«‚6y®I¤èΑr0ƒþó*²ü$-c0¡¿‘g«Ë€ü²ŽÞO¢{'%‰tTß2¥zçæãäw݆vñ%Â\Áx%«#ë:]ü&×N£JN[ái>Xy¦U™7b µ˜XãbQó[•ÕWdäO:3±‡AãýWï¸É»u%òØà°×„ï_A¿¢ùåПØCŸ9GY{pèÏ¡˜‘¸¦€It`nšJÐÓW–Koª·Gû>eÉ'åPȼºáO³®fÛ¸¹…ÙåBÐ=ÆØ u>¼¿2íuÙh¶}ÍÓž@øŸÿ;6ðx®$^y¹ò€þœ’j€Ÿû6Ÿ²ûwÏñ.Ǔƒ CØ_°Î]Ñ3 ‡&ý~ãBãì饭/¿+§ÙCµz;Ôþª’$…&ÔÀ”@Mó åWuGÈ£GhÀ5Ôæâ9töÛçÞõ(Ýn ´±,ÊWàͺr¥VÒ]P{ØX¤~XwÅqÊo ¨îSÜ.Ã23®Á-xH„;‡©ÃòáxC àwÙúCÉiqν¬ÐŽÒï¦ì6ÏgÞ[J*áXh·ê"¶•fõõŸæobôoÒYá\ÌbèhÆ¡#´\^km"dmnÍù´È¢ÊüÄ=B°–I´q½ò0¸‚S.ÏlóQP{+X ·’ŸÇËÜ¢N$pÃ/];×½lÖí¦ïźK£Á¨oòó¸ÞŠôH;ìî²¹;Œ "!íVß—)æëä†8 WûíͬbÖçVÆe<»ô1Ë 6*Me¿ª½YÉ;-‡Øx¤TJ:SÏáÐ#ì‰ôæÏ´_ãN½}{i¼¢Å™/§1¼/6®Ûd)˜ ·6È"„)»Tì™l¹Ý`)û•ƒà;Õ^NåÛ¼3öÓÑì©™&^BêC ©ý§“~cú‚1¡^]NPœ=ÙâpyZžém¯Âá$î~ Rn9!mœˆŽ´ÿt¢Yкu޲3­š‹AŒû™+ª—0¾V>±ŽÛÆ:ù!Hæ[íõbÎÉn[¢Z›vœÀ¢üÈP<âÃTÕw1[Ê9jü§BCj~ÑGð¯/Î3ô{ë½Ùµ­I‘“ÕU¡J 6°È]ór‘gRSöRɪ—zOlívû¸Ž-h1ћޔ4jMµJŸi‹M+ohy Áœ2`·Ìk Ï ½>ßRP»ó½Ñ¼•­IhaZ[ËëJ¡- ¥Øa"À:§˜dÞ(îófv™Òé™EŠ¢%§\"#~f¡½üJ“"`2g^xˆ„óYè9'Ãæ¹7)呞2ˆðØæ/°„÷)âÑÉO’]ÌÀÛ·1Û Ø‹ªŽýNBûSUÌùÚÜvn¶ôÜÆ›à/}Ö–÷7¤ØiN¦ãÅú!z=b–Û¦wE§.¾œ½üád6š­õ `e[èžñ>çg§Êu""Tn¡S ×ζ8æRí) âûzy{ |z d4¼óÞús„§Ï‚_¨Î«»yáÎ9!ñGä/ k “'8x{ >Ê\ð¬ @ø¾>í ù{gJvØH–Öeê·¯ALâñ¢Y“­’Ħø´*¨Ñ©ºZ³©Ø€÷cOîõj=ºÂ!vDNlxYJw*F­ù^º÷Et‘°Ò"ÃÎÆ>,ÞF¢é䋦Tƒ:eCs[ƒ˜…Q‘NñSÌRYcÐ!j9=È’CŠ%Ú|¢j³ýo½;üÍ5l/Ý!ªs{ì¿å°s5¯!/eoãƒ2¡-ÔJÊ‹OÍîçæ6á·ãɇô‘TU†;¿gAv£)_Æ#% [6¨ƒËÁÅæU€WäÛ>ÂQæÍj x§P¿@)–ôòVâè{6ÎKˇâ~g¤ç±© <ïì¾á÷õ‹S¿²”2n¹Ñ`Ý=ï gN¯RºòÖ·ƒô§JtŸ^G¹Ý}ÚÌ™ 7ÚÎ!ooOÈ·ø:‰W1ÐÓPà¼[’6 äC³‚Q”nAÀtZ54ËÒîÕK”.ÅïÑu‘v^â<ðmAE&ÞG¿{Áøò踙Ż‘W`d3°/»¾fÄ+<½Õ7)\Åi쀗ˆ{ùæ‡Ó i _ê ]ÆGk3ÄsX«ð›3ŽÇ<ú–Ñ»!1.²¾xV/ìprÞê!0O9F¹[•ƒQâ®…ÝoT\-”Þ,uÙÌgB²ÎÒI'OYdЊܸ_!âÉ…·uû”¬¸FDêÐ&1á’²a!aN]€éò{§ZáAHŸÞ˜Ù9Í+d)Ç?Â\R—”°¡Åª°¬5–©ôsRxúEb÷HTž(ûà Ì¥žÜ#Ø„›yùe7Ã_uäÎA¼™-j uªæY¼´a&¦šsy†U&*j)\k‰6çÔÛœ–xˆ¨#³áÄÊÛ¢‚5Bì爔#­Å?N,0úÇÇQ™½¸¿2¬_ðkCj° mÞCæ%–w't²™›_t¹‡³½jÀú+Û—2B×`í¨Ù[Ší´V¾ÖwªJJ_&¸øo _–×GJNÏ0œ]=Gç$$ Z+° î÷Å–ÍHa`©DVœÉç¬÷Ò¨æoêû¹ìÌÛÃßÝ€R×ÊG}”Hr·Ž;3p†2 ¬[Ú Y@kô Ü]Ç„¶Nf,ÃGÒãÅNJÀïðå¶&¶ŠÓœuÛ2Ú6äøw‹)9c jH-ºOM‡Þ6¶Àn‰ ÐGÍ"6½ë„M†ª­Ždj9G‘|¼³OvKv¦´.ÛðÝAÃÊ¥*rs«KùFµ}và*ë†H(þ)Þ—D‰ÉôÓ–Ú›ªkÊb Ð™k´ðéi€°`“ÑóF`8˜õµTR¥£#ºt‚ê–õ칃§N9tž#Ç}Ùç°kÂÒK á ¶*1i7¢ÑÑAJHX„¼úªkªNßP—§54Ø—èÙj Ðþ½<ûæ§ÇÏn߯­€é¯–ãWi"ðb¾‘ÛÖŠ`¿ÙBoÝ`°.qjâ¸ÇÔã›´qÄQùäX•-øxó›Õá«{Ê›5ûÑ‹æ;Àèãœ"®LËîc¾½Ëº`ü埨P3#ý"Óæ\½5ì”Q¥z>£ZûÄ öúÈ ¯l+œ½œþþòo÷¡ ñíºü»¾xÍ y¡´ù/(ÝWÝN9€1ÂJ÷òHßf–¢/R×Õ`F§Y¿êÀ¿ž\ð–ÚýÃ̯›U¨*^Oê[²,v6¬ ([¹—)´GÁ2Qb<£æ_Øû²ìêŽE'#_#Þ°)tiÁ ϶[€l†Z2p·{ —Ÿ¨CRêÇ”Lhu7ÜòêˆҎΠÖsÌ(W*ÒFä!yÌ$C¢RWkO*Áx”ÊB­솥¯ «éÙP¸V›-\u¼8ö½ý&¼ú?$áܸëî2òç¢Æ¾àùp^|‘·mñA@tâ—.öS²³! J•´€‰<@g#j·vîyò÷y¬¤€Q¾Z8"A»UéZï‚8‰9žèlk¤æ„iC+ „xYêw$5raù_×Ò³ i]÷$yÆ™ö^Pâ\D΄µðJX„9Ù‡›}÷¯IS«X©欼–^¢ x£nñeõqÖ¢Ž×ðíEœÄÁzåD)ß±l"ï4Y«ùP…׉xÌv®Ñ±îE]Ñ<óâÆ>|q¦%¢9jwçê7P¥Qdíöõ$5š ÐÅø7C1˜©Òà[>8ê„òd#º»}Ã9¢$o©šÙ# ;Gj§/\ãÐÕVè_nÈ¢¶×¼–FqMJtϰµeÇ\ÝΜca\—~š ^´ÖD‡Ÿ_~™¸1¼¿8Ìï Ë¿^Oàã"q.˜N*ôjW&–3ÏŸbi³ùÆ?S]š°MäñåÇ)r Õúe½ú$™Ü k´σ¹˜ßKŸv1Ù®•zW‹²JœdvAã],òÞ^/ן1wÐOçä¢<âcî2yùl ì.ÎÄ5ñqÊ-'€ J®Ï›{¥C²qöÌÃH¡IjD¡|ö²Oå¨Á`v¡«Ô–€½}ÀÞeó&˘žy%’<暺Ò=¡2…d€í&ÖÁ”aÿ³èd•ƒVÆ×竸² ƒ¦ž<²»Y.оFÄe¹ü’FÍ»š$D’xr£O¯{lº›‚¸?…­u+Iüúq–ßGrãGý§¶Ã ö:1I›~Ôy!ý.o ;hÞfÏ‹ a_éÜâC€eô³,Âï±…ð}ßæ[r >SF|a˜§-蜣…ç ËzÜ~ Ú*z1½žÈ «^lÜs]­èù[°’ ¤ÂP‹¹'½95–Fq,Ím­qI¨ñKUġϭ³ÓÉy1ãÀ«bÎ…¿EΫø¥vœ–|û½Œi@¦œæþ4àÍz$i»›žMçE±zpÆáû²®¶ 2ÍßÚÞb>>À”1Êš›œʳr¹v¦<…~P×ú†èš¡%4 ™á¸ÁµÞkÌÖVææk©µ›U4»BäXÿš(#>¹ Ó¹ö(ñÞ> õ{îuÙ/ÒÒ‚-Q`—7-PÝÝî¹PÈ•{/ gÁ•C¼Íê9£×iI<£Û¿“{ð&üÃrî:³^TÏiå„ÙÅeÅàg)0ÅÓ˜R•:ôw ðÈËêÒbÂTäŒæXÊ_Ÿ°ÆjØ0QÎHXµ‡aEa(Ëtï¼Ç™èÔ©¢tÚªE&¤~曄¶„ðô5¬_F«Ï·*Œ gW¦ó·mj¿ã4Òºœuí¬‰OCßþË?®åûè§?>âŽjI=é1NCUo_B¦ãva{ª·_ÏäX†Fn/˜ÃôäÉ [­ŸP…©klà¹}G GLWü©vŠv¹UÕ¢Œ^~ìMɽæYmš4T³¹À;ËWeçLÒV'© ýJ —ÒŒfÖäß ¤d[€ÿÂÛ3P;E±xžì‡šÊÇCl3—R9/uáÌá1ßéͧoVB5¼0Þȵ@}¿¿¡d6Ý´ôªº9f3AèA‰ÊŽ6OÜääÆý!LJ¯Lwöeù€@]£­N$Œòä^kížôPÖáiHm3n¦³@ÂB¤š=–‹@:^ò*çÉ\ÑyŸ!h:ÍLØ‚\5§-”²ÞÚUþnþ'.©ír§4ÿÌÁsÏ4*ÅÝÉY¶À²;=!Í}Æ,¯JZW *Åè`Z†n@/"’!´mj7xð†ÜV ™,.9Ǩ: Ø.€ª~-ˆÏjĪËc§Ô^ªzOĈ믪Ê™Hº øl%¡ŒZ·®Õ ²_'Ä¢vÞy §`8ý¼Ëù?1økG:f]yªl ¶zÝÑý0,ÿÇÞ—Dò¸-W_Áû˜Ãéõ8$Z®ã"ØÕÀ[îý6µZ,ÓV½¸øòÝ ôÐJb!(ëf &u<ûZ~¶”÷wïX$¹ªÈ™›ÞùÙðwJÏ¡™LñÊ•ø›·›h‰ƒS\(ðX=zU×I¡l2Žwmjôûf lMkjˆPß+&kÆD ¶lÔÄ@eô:]k6,Zx™jÃÓer…öüu{VI!&j"†T…‚üÔæis‚f æXÆ Sø‘s󗶤ÜJ[âËì1¦¦nk %h}þPy·Š¿D­Ù¥È‡$dý&ñ4t-t17+Ò¹¬ïqÙ5 Å;M®)ëÙÝdÛÞSH2Ç-¾¬îe²­ÝšVC*iî·fæä»”³Û‡­œ@GŽb>’Ä ³5 cߨFUðÐY.WdLå³&P!æ:à 篣ᮚ³wžÈ]¦3ê|ª%(oxG}ÛÊ\(EKÒò‡çˆhÀ“4DÍLìÿƒ.<‘Ñq¦´æ®‚ã>ÂN$[ë‘)üï£U‚ì(˜·bäi AÔ8ñ · $1…éì[Î#žG®'Eo, gu&û#Ñë:àžØêâ¹*W+"|lÌŒ£Ê joØÕÜ'ú2äwmÓlì{ŸQ$k6n+@’‚·ä¡¬<Õkø–]3ÿ5[¡lð¥k€f2ªI\sùîre¢ÎXÀ!N\œöùN¬åypw!˜+t>XÙÑÞÖ.pk‰qaÁTI$»)*¹Sè²1)ýomKtž¸ôáÕ bŽ–Qv^äaà¼Â^ÕuµúÐY#ç¤Ç¨g” ¶¢š&Þ7â˽Y½B®cÒ¨ó¤M›ï!Ò6.éJT’9s`1c6-§OŒ µ£´ÁÆ®ÒÐj³„!‘²¨ç«µÔNDÚǶBQ†x¹\B•I\¯ aÐAös ‘Jˆ²ZýŽ‚¶¯"¯„ˆÀÊ{FUáÃbÕ\¬a\{-EAMT0ƒ2-IÌ­¢À:•¬³­,ìÖë¶}áÀÀÛ†R€ŽŠÅÆ:XÜŠó›W æþhTá‚Luh9¦AÑÖªMø ­6þçàÝHÅÉæóÎG%Ì}48ººß0ƒ{ß°ê†ðft|š (}&ÿ‘ÎgŒ]fN¨ÀÁØR È :E‡#XM¶× ×rá—ÂèÄ‚¦7£)÷e kj*”6KgfB=5D¢nªAp[JBõ ù¹äëÙƒ~ùâD“òÂ8xJB[¨RÛÆ@~Säüc­©wáX¼:`àÂ?|Äé”%>jöG4F¨ýàíÜîiüT§"}åb濉þðôíæ•Ý,<3ØæÈûhøÿ6 ì®ä¥9Æ= ~¾”¾!©|àé@5’aj£¹ª¢<–V“é‘¿%î–ˆJü“$ÏŸO°jå5Ù)Å&BÚü•¯¢×]Øg‚¤+^á™O¬3p C  ÊãÄÿˆ^k‘S¸L®ŠGü—¾ú§EDd ‡\üSYž2>ŽeŠ‚Ç‘3Þ*ºR_c$\UE´:àwD‘xuŒ;®p(Ä&›v¸Âþ]{u0%0ªU--2ÏeÎ\< '>¹¿ß:Ì¢‹ò"éMl_àÇ 8ò‰ùòåèC¾Ö`M µ¤¤l nK-…Ý·Æ7AðîþM))kü²|M, ©¶`ã(ç+Dçid[ÊGh:ìGìq’‡#µ¤ÄX­?1éí,œ>Dèô LBÈñÛe©T›· "­­W™J@å‚HB¡Ç2V¬'3t£ßàæ£#ý5‘8NPšw>ÚÙîO&8b2HÀz:ª˜ÍD €ƒg˜Ae„ÊFø€$UêïÑChí-¥Ý„Ø×1JÅìÑÖhVâî3´€YN0Hržh‰w“#"ºã 8tRû”úknRËž°>|¦ÄìÅÙ»L„ –°Šb0w1)ë Ž^u†É+VBô-[¿h­&וNe²{(fÑ(Ášb]LµeÓ´2‰Î´…s" 2‰™JUØ‘&Ço=póØQví"´ê#~…þ›µW²±ó_2Àþ\uÏu»ÀL§î²n³56@é åFEáz¶þÍ\º„™öÐ rቻÈrCo$*Íã>}y.+·{싆ûN_mPv† ¯ö^hýÿq h¿›ºTÕiHÉ®F_.üüån‚ r9Žt]×øûl•òoEÉÃ0°Ç^™v~‹Š›¨Ÿßi™:ÅOZ.‡2ùÈe€°yRÚ}Çø§æH|ˆ«®¾æq5‹€èfù)IòvƒÆÌî¯.ïm?P=‹ïa&ØFÔ¡Êɸ1F½QÍ9|´‰?Â)$ˆÔÛäî›øe®®²‘sIÊn޲tp½]ć™¶bùV…?µ|lûEûÑ{{«x¾ÇÛ˼×™_³’; 1 “bèXN®S=4õ¦÷ô¿« övñS&,Í^Åv8/É1ør¼b÷fÊáíUt§¾£kòb›:çç:•hº6xtå ¯ˆæÞ3‹.ðÜ ¤¦µ÷ žˆÁeMª‡ò«C5Ö·"ÈŸàõàuv¢ZÁ6ˆˆV5>ÚÚ\ÂÆ©NÞLÍÛ.¥m+qc¾0tÊ’ Lo–KhÞŽÊ0mÂ3µKÆRº×Œ‰yDx’ȳãI¢¦¬äÕÛðǦÑZò0J*®–ôg‘ƒl«ibPd‰¼ˆ(B—!E½µ¡M/ÇBRu©“‹f8»“fËd |8g+m©)Ž%,ÑP~÷>8%ÖýJ=ÑþHê³<*eJ·”*+ ,ñ–É­6êIâñ9›ÞeÕ7eÙt}8~¼»Ö›/±ÀçÊ30Krk=Ñ ™mš„-tÕ¤¨;[!—Ý®ÿBsYÃÏ^¤{¹ O$‡ ·ø£ô s ¸,¬b5>}È®ibú»ÕVõÛC Ws÷ÄX–¦¡@háÍÝ­òî ÒuK Ä"øß~¾ŒYœÉzp/¦eÄL59ÃýxšBS?›¶¶ÉáÙ²p³@D!^Àz4@Ùd´†n©Š¤~”üݬ´eFÁË!Hc¿9FøhÎâWöPRc,lšc¹IìÂ(…™–fÐà”p‚\è÷³råå-‹Z›iÞ¿ìúüûë¨×»Ö—¾T¥k¤\¯’Ú<› }FÁºÚ…NfœÄ– 1ÆuDB„ ÊEï†];² ô©ÏšÅ"ÄšÍc“ŽNÏ€Ö/ßÏYGAÒµÏkNfȦ°dM3xq$PfH`¾ éKOCŒ¾=á ÷ýq©]]ö“”ì»Ð°õêì ò/iÔ9¢×¾­ͪá2Òõ \eB-\Èkš‘U€Úœ±`FAÚP‚ÐÐlœáž~SWÂýb“VºéÌ©±~Ö;kËŠ…ØuG/XDï î$Nؤ*WDJÕar+ß,ø8 ›¬e©ì׌>¬@[? ¦Ìpýªß,± )·z=4·vªˆ0?›Oïs‹?è@šˆ yt¹®ÔR[ÙëqÈ ¢L˜“s2' Á5wo24´uY I³”oD˜ò)oµO0Vö™LoÞOƒOÑÞšˆ5ùG$ü'µxdÞF:B¨c8œÂ‘×л$á‚@²´Ÿ—æÂ]–YÖ>ž„”?§„ln$ùߌˆÈ…ß7yxk±ƒ:²ÛQP4§­‚à’Ⱦv‡¹¨÷r*A²®ê¯iÀÏ`jõOÅßg3Ðã°{âÚ4ƉÉ.äu¯fo0Ì \¾~Oáɵ|‡ÈòâohæÞª•ÀP¥âà×^\õ ͸gÎÀyÅë&3Ôsk%¶8Í—ã¶È²‡lÌñv!ÎËLó1jµ³Óm'¨ NNOÊýo¶³G#æƒÖÂEF–^`‹M¢¬õ÷vaºhŒõE3j“8LD¬d§³ôÏY;ÅqSºé¹cbÃÅVóÉËK-Šú9úàî3 ¾ŠPD[ò¶²S4 ˜7QèN1•‹›œQ•ê çÂÿã¸t‚‹â¦X`R†3öo«æúÌ{Älô×ö纄ä9”ÃBý¤.”ŒAF{ökζí³^ï,l"±Òñ5«3˜ (7qñ2¨iæ|ŒÂ‘ßt%ˆbQD08 j¡ÑÌÐ9r"'€¡Òé£gù ž}¦ CÌB‰ðmó ]4ižê T‚îCEX¾TÓÏÌìd9¿B7]‹Eèn×paíº«ÕÎä¿®µu–:’sg&MøYªÖÜè²Ð³.ÕMáªL/×4“Q ©ôg»$`­5Åðv™ŒÁæª#@OšÛ MòJŠ[¾ÁŒÇ}vjéëGCgjÍ3Ê×î3w­Dœkà*_cND=kbCe.Ëtˆ±Å§ë Yù]‚êËœæŽâƒÅð'«`0’‰õú­œS6Zõ絡A3ÐçË™G˯½Â:×RZgÊÃÞR’ Ù‚dœQÀjjXµ ž¿Nh¹ST¢~0ù˜EIľÉF+J¿¯É´Œ uF¬ö-Q& –‘¦ë0à2z)›LA´üF¤ÊÚñ[lW‡LcJÕ¾Mm=ŒôÏÉ_àk2f_\ðvÙ­¡Å~äZĆUz‘#(-^¦ÊlèªÍ—Wzvü?“<í»õÚ&_o9çØÕõ óU£2‡+]ÔßÉöÞ#ƒ  2½êí$A lÜ_U/ê̾épE©R}3æt‡ëõÒ W¼"÷‹$ë~#wì¦ïS0h²;²ˆ^¬:LâkYÝUEå# v™—dn{ #ò+”Ä©×!±þ®t,CàÞ»ë×ðÕfœ/@ªñ©gX:”ëô[hµ "·ÏZxy¦!¥ÆoÚ÷f¸žlZ ÎëüdU ¿åbŒz®Bö6îÀMQ7í’¹>]çæõ†D׿Ñay¨—%¼E¯I4ˆ-håØ=+B­t&ø¿# ÙuùapøBâHG‘eƒh,s-:$ÏË`ÃrÝÁá6Iv…LG~UË~E…]ã4–PFij¢ŒÅüê½ûW¥{ïŠÊVú‚gÎUÝvŵW¡ÂF—A"\’.HVYc…á2Û >õÿ‹»ðø* ±Y;’“ºÄ¨.c]{}èg]±¡Ö…º„É¿döÒïg~ºŽ ”£«ÓÅ3Ë’qšðwavºÍ‚ýlT¥|‚*ߘ'0qûhtÚyd=‚|ó¤Áùëóy¬«Õü¥4…R¥ÿu6·`ã~Åc™Å¾låq¬kg 1(ÝòOõÀ¢Ðëù{,J«Ïs.¶ͨLGD3¶¬××iÔâЩµ…0élZüŸÓ]œÝDîÈèâ–V‹ }*uOÍÝ›øÏF¬ãn‡¶tŽŒÑªç ¤ölcˆä;W¤ÿ*ÜÔ~åßf”ÌM_܃²Œò‡äRŽÍ ×ÅÂ+-¿@§ÿ 2/=PÞx½”ÃíZý=` ]H~œ’>b’2ˆý'Íx…õ·@Öì‚Ztûù n©¹¸pô~fÏZ< ׫¬¶óbª~­‹pcš´@ÎH«·e:ßz"µLÎy?ÛËçnA!¸ˆ1?FÞKbU¡£4ÉXuMcìzo 먷g =+aözFó™hhªÿ +ˆ‚$¶–]4ÑÒZ 9ÖR\ÅF9¢ªPk£à†¦—(çôïaÆ´¤BΩ™›‘)" „ž[±`*åbAÐ0%¯‘ÛJÔ+jQå’Ó)ÐiifoÝðGï8—Æg+¶1üÇÁ`pBÖ›«‚¶ˆŒ4wÝI´ï”¾½¯…GBQêã‰Yƒ{áÏ—¢Æ1”2Çù ŽèÑý Áß^…[rœ ÐNÏ•°™€†úµ}.Ùªãr†er‡Zk›ñoRž`§Ãi½hì–3•»P¹ö ¤šÇ”Gt&unŸUï®/¯6C‡I„{°UÞæÝ^PLJáå`HòZ~Qi"êS 6«‘¦?¢¸„ðƒ…Cx@ÀçÈ_ÊC)ªàÜ ÞBÙð% j`ZFQŠÍà¶Mæ ‚Í­ï .X±XÅø@¼;x€ž¤¤ÎU§9¥Ì%*Þ€œ•+b}hQº0JRQu(÷ýêÌœÔá ä´'¶GÞ¨ÐóàÛþIŒ¾ÅÇH§ß <%«màíÚÁc¾Ú35zÃmÔ,cäín¨SÖ{H ¨ÄÙ%ö¤DykÑ܃gˆlÅiZ*™ª=ý2òÁ¦ð3¡ãðÛ¥¼9¬,kûÙó® ¤% ¯‡ðíUš3CoÈ{¬ó[Ì"êÈ¡öàtfdôƒdø9¸r÷pÀéJ5Ûè*y­%åšeˆ±æ¶ÏÓ=JDh,éÈ(J…'NvNà±ß1*˜aƒk„Ï3C²âWI.É„*ÒBÁúj¦l’×Y]YÌ`ÚOï²ÉZM›æHì}”HV1ÌÅ•V[e-F§ì Õ‚±I7å"ÐÀRœ¢€‡ò³n™¸±uÑ*Ìzg Ì(ô~ÿ-(QÎ;¿ä|®Íg@˜‘Q}œus’ð1 D«… À®Z1pýƒh~QVB"Ó-R’ƒå“6?fÓÙ¥Œþ <+^øI ¤6•â~›l³JäI%unÎü°¢ÔO–`ºž÷0 Ø¬mèîš7ú‡–„´ŠUâ¥q3Ni©ÄÎI¨$wmT‚½bŽHJ¼Ç?»É>ž—ݳ>‚Û›ßnUeÊ*€ÆÝ=Q¦ßŒÍoMò‡#1‹ljv’oŽü™ª« £(=°4ŠŸ¿fï8õ·5VGŸÔÄ»þYZLèÎ¬š‚¢®°“Hž”Ÿx2à†·í÷Ã!jBò3øÔë/^D},ýh¼½ —ä~ˆÝâl"x#αæ‹Õ’…õ󵿼ØÅeTvq‹ýJÖ—sðŦc¾ öÜÎÎ/Julæ©i·UŒ´ š1²÷éƒ ïk¹ë;T¢ ÿrì,Õªñµ¾õ"‡Û÷Úþ @§º°úƲԹ¨G[Ö¥KRšéP“ÉÍs§DEmas‘ò\¢q‹Ñ?EôRáx•ê;à L;.™ó= Œð@ΆrC”ÝÙ_¯"¡ÊϬÙbÖpÃJ€Iu‹½š‘÷HéjyyË™€À3"ÁX»°Zšâ¯1¹•`»°jßÄl+73›êñ÷ÅÏÊ’’t‘!]â(%0¶kÚÆŸ˜m2½¸dl‰ù[NöìJ(‹!5‰µ·ÀÖfq3 Ì7\æ¾"Ï}’Ôs®qä*}Ï\ê’œääØ\¿5knÑÎ)¬€^rnkfÔÈ _q^ä¹Ã)ì–¯ËX'º@äúû ²w)·Û¥¹ï„e@¼5jl4rb7É+‘S Ãe…õÂÀæ›­”a°Í¦¶’éGV(‚D³roŒ= ðÞ£ÙdQp;’²Ž”žÖEŸ¦›ÞE;š2ÀAXm†1€>ElâýŽlü,,È«—<û<³À}Œ¥,È"3B&ÊÛeê4ZXã-–/‰ú'AÞyêM2”h/^ Y¤<{NBh6Ãîé>ò‡¸KR•+YÓQ‡ö Ëå*y…ÍÊÞ­”ÂD>ðYxûÊn„4TW¾Ð/·S±…7Éañè-F’Û(™{|&ÿ6G;~c(-ƒ‘X £›˜ßŒçq‹”¡ŸÉ•2@µàuðsC`ŒÕâlÒÏ”rèÆ?¡Îý¦¡Šõ8©Û‘ýç©1~ÿ~»ï2í[Aøy+ˆò‹ï¸Î]lD±EK<àÝ© æZ›ž*:åŽÖéÆH'$UU ô(ú*ª6Öš«`ÍÎßD¿ì6püŠYfrÙ°1›ˆÓÅ€%>Ø¡'*BÊu>wQâqì°¹^õˆ~ÿ<Ëo§-þ u×[ y×€îÈ$Ú‹šøТçp˜–ìkç8k úVÄúa‘3Ôô ío$‚@bnÂ…7ÊÿX¼†®µ- 'G·;m«xøõã²ü†žŸÓòâºËmߢ:c¾®÷|J¥t‡S +¯Šq(z¯$V}°ŒÝÎ{ÓõGÖvM©vÚú†™±o_O%gydp/ìüürìÝ’ ºÏίõ°ñdSVh†Ìœ,™[ Æ! +5+ó?åíŠ7¨ºvòRýü*G¿Ž¡ >·»,‚Bú&^ìŒütEØŒæIáÖÁƇQ±YÐ]j3'Á @1îJýÊô3~«@Ÿ¨m> áTÆVO kù¹šÌ” ó«W´Ý¶Kð"D7êÓÌë\žáûV²·îÊxÁÏ]v@“ ¼)ñF¾ì’$€kwÞOÉâSô!È!Újä! $ ´ÉEŠŸºM¿ô¤Ï¼y9 $‡Ö!•”ƹÁ6˼ÕɧsFÏ‘'¿P¶Ú¹˜O¼7ck°îŽg'xh>%{èä!9¯DÎת§ èùëZ‰°3£YíqJOØàîRÿvO³!å‡{Ûž"}1L¼¨hÖ%^ôÄätç&ÙñZ«cò+XŒ,|Ƽƒ–xÎK âvä©“™8`tÌ“”A5Nƒ/æ>_Ãv§ã®ˆ¯]‹CspщÐÖSÜï—á›í ˆ|{‘”y¹Y§–¼áhCþ‹õ Ñ”Úì² ÕË…ë\6x)1äN¹È Ù +ðS•–&?8ÆÝ«ZóóÑf"ù|ˆhÔSÀ›;ef`÷Û´CM…êó¦Ç¤ þ¡È®~þ9mØòò&íç-€í \C^˜¦2¡Ááü» ëŸk Í¿÷eëÙ¼ý—|˾™ó6zÌÈÍÎÏoMä³4Ù^ío3S®gé ²h2º;¨¡ˆ¨WPG¸¶—o¼¤åÙù€ü Ì6k'••Q-|fT®KÃlÂIišFKz •ÕÚ-ØIÁ04#(èµU_YCT5ØÍ^aóÝD¹ùÃzÝôäµ;#:#Ôǽ?â,µ&l¨0æÊ¯C»2WjCÒˈ¥+}2Ñq`˜"ª²§1¨!Ë"Œ¥ew¯+jãûQzžêeÊ2²LšÄXÚff"ظ¥ ŠUñ©Iç2”G^‹¼Ùêv¬ä¢O¦c_)ÃØtå¯5í([:.7D“]Lª\Ù¹ñ÷”X=vÅ™Œ¦345–ɹõ »¥À•O¬ÂD=Q&?U,ròm4Œi>CÙ” öÁ°YŽ aǾu¨@, )Ú¼øKÝ7ˆ 3.ÇÇÏ";Ë|ÊzçÖV"ãGVpö™¦¾l1¦H!ÄIk«-ô¿JY>t!Ï7°fåFˆS¢0ºšŠ1Š\ûE˜rgªÆŸ1®ê tÕmSoNeáÐY"ü-îïÎÝ—w-×ãZÜ*€L÷ﳂ»á¾ÅâiÃ[ÇÖR~+¶)Ð{´V¿ÎòQVys>ƒVhͤ³keù/bj:' ¤üå"ªµ~ç³–âõn;ßÛØvë¬O»vÞÃ×Ñ-·­šD†ØŸª/‘ytýiõ_t'd?¸hª>pœÐ;ÐUÂ,‘O„ýx•ânNfÇsÚ5fQ™è×ß•la¸o&-x9ÁOY5‚J®Ê¬A‘dR½¥]‚“T ©êÁš:_†Ì…2¦‡¯ ‘Nü åˆWÇYè‰\t§oÉìÄÐÒáÚ‚CëY3¡ä]–‘Ï+ê5ÒrohÎ:\d/w¶[´iĪ—rrÅ÷©§ól¿EC<Nlò¿T ×}Ê“ãýœkÔèð$Ï ´öJ¼Êûÿ= «—8­ÍA5š:='’7 3%¼eèÀŸt®õô£«ÜJ‰¾Ö‡±ñýöÉ9O4w_™·¥…»L'n4•!w…çVrǾ¢VÑ:ÀaIGö­ŒñSßϲ&ŽŸ.²[Ûa÷ÈšžçæmäÂTÌD/Ž ü{X å*ò&ÅŸÍs{êè'Y£ýâ­Ž´¾Ý#’2C:zÍé¶©>4MT%À$2BQã`(`Å#Ρ­ÅÓ¸ÏVØ@ÝÌO_·R±Õ÷]õú#ÏŸ›bÕ)ö?•]¨³e~–¦†ä"É÷‘—× f©žao?Ò¥±¼È.Íär`-³ÏÖmI7¬¹+°âEõ¦éΩ¼Ý†®Þ·ÚÛ_ö³5©ÑÃýÿ!>^èãõÛÊžÏîIn—k¢› Š“Á(Î9e>¹š(w›^2ú÷$Þ¢y°s6»¥Þ»ûÒ#¡YJ`8ÝjBê^Ùðý’ª—:ê-Ü(õ­œž/ïk¤ÑÓN& Ä±z³’ $çÎÊ (l—XÈ|°jƒsÓåÁƒÒ1ó¾ùÏ·_ÜL÷epué—B_¨¬yq¶Ü׉2~‡tQϪÀ¤ñWuåVUeQvú¹'¸zZŒŠ0²Ž`[/fIiü6­e"¡‹Ês÷‚}sEà™ ï¬2ù×¹ü*M&ð^Š&hÔ\r(ù“šy©åp;59?u¯‡Ã¦ ·k·¯”ŽÐ=®ªñž/½HMÅØ|0×y_Bo;ÅÖé+ˆ)ÇS9¯O:šÇÁày“¶1A×SÏÖGìoMzv¬· ¡„äAÝZ¸ÑU»Éah±sÍó w+¢ÌÏ#¼„ØWçåZÎ!Uˆº­£Úíx¹øÈÏ1鱓ˆ±Ê_¯,^g9óðœ$A.e/”–^RNOÊÊÊy¥\žNl†i=WH^Ø¢{ÃwdmoÌÚ_šLB. D¢Ü ,{»‘@úVMb…Õý7Û,Á´Îí{ßùš’&t™ ¿è]d««L½aÔNr:‚ˆâzBH¿ ÑWTUBªô…\ &XÚ< Ñ|…3“÷Îh¤o«x¦…ßz0SS+_êå?óyË£ÛœtRA]ýº6ᣘt.ÍaA„lºùŠ©:¹ %‹Î%éÇ?•TP¡Kúür9o‡þ¤íúµNEå¹8¾S~+ÓÄEò€UQl^¬¹²8-ÇoؾzmÝ|¸ZŸ= ^W%³ÓéÁ>`ù-FšÊ¥½Ýá¨D{‘ÔIÞÖÔêª  ?êÒs3x¡e ÉñöŸ¬³…m„ëGÒ1·Ý·‰Ê±6¯c„R‚("g7‘¯Áßhê\蛋/*tâe<™±¯XÚMßr³ ¶Dn^.©™˜„ÞµÕtýê%Òh¶Ŷ¹ëæ(lf‰sæÒðLÔ ñǧ WöÛX‰ËOC‹õ†TÙd/‚âþçãQž ¯†q={ys xãrk¿_èµrM~:|ÖúªÅ}E ZÞ7â ˜YÆœž Ê'ª3Ijª%꿆:1OA_`f‡t^¸xÞ šá<€¢–ðz_¢E-:×iÌr¡3±™RŠð½=&¿é–Ŷ©g.T̤›Æ(6[W@*,Ë5žQ¯™ ­å¬‘õ€úÌæ†ÇÛ1Q…ÿèi.(•Y¾C]}En8½ȼ‰+\ºÈ÷˜Å#ÜŽe–|˜¸ë襫<š÷' ‡Ï·6r<¼šû“#¥/üÈ믾Úê~)Ü”`7Ø„™Ú„ÏÈ ÷Ê»yõÊ^‚y#ã¹2JŸ7VÇ,UìeeÀÔ//gk•êޑθ`¨ÒôŠ?œ›¦$Iú29d1F¹-E…fâZÓ™k¨Í/ŠsÀ“¯NPN¹)ڤѣ4°dÍXfŸ•‡¢ð¯$IXŒÌ#`foUéǘÛrnh¡|Òò9þ‘sUfcˆõÓ#Ë:®‡2=˜Âø½‹ý+õ`|ð~—~®˜ SÉû~\ó=“îBÛ¦“kvÛÈtZ¦IÏ6ñ¼+S)½œ â6Oc#“Ä<½ŒóTh©h* ¨Ë̈çÞ_B†K2ûŒO þë;¢ –ÚÈwÍ”RLLw@ÉÇݧ^q…e<å"b+î¿€(q£é­¼Íînø·Ž†óòaÄI·ÞV6„;ˆd2‰¥Sº°9ýJsy¿þ‹dÒíÛ°Ù×k_\I[UžŽÂu*'Ü: ©SÎz8Y{y<™º`%(Á9_qô*=ÔJÔÊdÅán4Î|U| pRÊŸù¤QÎbìá>bØ2‰{„­xä¼+JT.Í@:k¦#7ës,j×s‘­Ê#$ŽX½}̶®cÚþ}s–â\+þ.ÎêM <ûx'ç$¯jóò<Å('(_ƒ„&:÷ý, _ÙL*Ûª¼àíÅ SùÍC ž„×ïïˆWú(¢ÆÉ~#žŽ·Sø’–0`{1x<°mԼ؇‡Gz`¤¢bf„l΋$NkxåWûòIEÈJgÒн×ÒŒõV~iÚw,ǽ„é•,:Žs-¬ÜÞœ›Íq1‘ Q•¿8#,(`Iû—~—ÛrßÐúX=Æœbf‹HzâW®Rì,ÿ ùÒ½-»)feœsIÞtìC -YPñjúàö¢²Ûˆ³ûößßÌP _OúÔ–ýóíÔ¸V¦kð´ö޼ÎÝ{ ºúCTÒŽ]À7°N†Î@(`çz‘ºrxöËo[«3 ã­Z†@ÊãËæfç c¸+<æ&%ë×ÕÇZŒ@}©‰Z²¸¤ ÕžrÑùhtîŸg8`5Á}£Á‡¥2^Å!›á…Â~P‚Ï ÷ühÞ}3Á±qçq…ÉÁÇ-²L å4 å7;iµ]„:¸l8§EìS Ã5»W3§”õ ¶÷ž’ôÌÙ ‘A÷‚kd[1’Süà°V± zÐrzŵfd,ù¦UÊŒt@<€y³/,¸rd VõW©Wß÷—§Óƒ¯ñ¸ŠkÀ[(5+ã j7ËL—oä?y)&¤%å£w‚ rg2 ø-Q—™2`ÓC®&…xNÉÃØä" gL9é¡í&­C…ª,!OÚjº+Åg’0ù‰@X{Ï*¤ìH+_t6j‹§åëÄîˆ>å`áQñ—¨¡iÇ?0›]Ëûÿ½9>‰Nõ”Mðzñ’HÓÃà,!àÇÃù Á öWü. ðr–ó™þlyúO²Ñê˜ÇÉ­K÷Ч’"ü¯ÍrsšÞ/¯ÞŠÙÞNɳ·å²_ñšÿ”n¿òÃReuóÍ Ø•Zâ¶PýýËꀧs~ó…èèö’ÈåóÎ&³¿¯5z’çÑ´.Û<'OÑS'ßy²høz/bw•Þ›Lê¨9‘÷z©8ôPæ?‘.ÅGxRÑ3 {jZ©—D¸¹ÎE)só­Qì$Ûø/}èïW“Üøt¿[f›/b5èCM[1é£'Zá}µhb‰éó`7Qwzqñ›<µkö—\oþiý5ñR4PíH:߃2â‡ò¢)(l>ß›b>‚ÉÛ-gâ²ngé8¦\+÷Ÿj¼Áø Bipšw÷ íãßD:znGíîxü Ú‹ŠL†¯"ˆ¹Á¥ÍP _³îrÏÃNUˆ¡rd›nBÓÏB*â hÝ (z-ˆ;ü,ïh&õ˜ýÙ!¼9{ccÆ»ZcÜÛ)mø›cεfÇÒœ–£Ç\ »2ö i .>ßL.§:ÍìxЦ\Å4[œœç¿D…ÙTŒ6ºpDÊ/H,2Âüç» ®NºC7vÆ_õH¡(º!íüÄr ŽŽBÊ¢h¥)§Üøà)Õ$CAû¸u`ú[öuPG&=Áå»(‘Tv€ 0Ì­Âö3òÊmOÀ€êß>%]¶“ü³ñOW s|“ë}clXcIí¿¥²o÷•&ÿŒ•Qge]ô0îaä‹'Ý.Ar:eZ`/g‡™rC®×ýRÔaCK¬´óïÖiP©šW‡å êœú"éïNbÔcªib˜¡@{‚×ÌU«-’ÕȸäÏB€úoš|öævFeyÓü¢Ô¯h3)OU¾}hÒ5„¥èáÇä·¾ðpõ-ô‰ÍDÊãæ¦¿¸½ç´nb¾_‹œó㈶ Yÿ’äÌ:î ¶,×Ð÷Ïs®JÜÌÐ0P¥ÉHB Ho¡sÎþPÑ þ+HØö#5#«äm'×+¶a‹1«4ÜÙ燥3ÝüLôñJD89:âf™7'0 øîÙ¼—„š‰]‰ê%„‘eíýë…"ø*¯ÝŠü›"ë(ëìáh.Lë„8¢9êæ|§$Àtåèá\OÖZSq⪪X×oŠ˜~œ¸ëLØåQÕ!fÑëN‘xVà䌂zóç@q°sòŸH) ΃›ú`qê/OWY•ä¶ï€Dæú<øL¤‹D¶zw{Д K¯ªß¼ò×gNÔY+ÿ «Y'hÎùù“Wa¼+è;…»¯i7Wß[I«IÎ9¤Ç#¬|í6È)°ÁºÅžbX¦(_-]£…άŸ"˜«QsÖÔZ05‡…° §d^­“YQªJr‹õKŽ×59aR«ô‚D/uržµÈG4Åuc&_Š-;ḰÎñ(h·[ª âHq)2ú°&rb¡2þÊoªPã¼áɹ†Ùî $>âö5ý§l(©QÔ!àÄÎ|t˜; º5¤×ŒöŸ¡§*nTËv•Ñ¢¹Â‘µÌÈœ‡fp`—±ÜiÅQ%ì“m‰‚óMvPGµ&5©Z€JÑaÌÃ/<ð‚¹Žó%Ÿ4GÄe]G`*LrÔ»3Ô&¸àæD}k~ž&‰?0…ø|]ŸW6ÓƒFIK6·^o.¡Ï0lÞ“’f|©ïÔ’u´úqÔ<×ã7ó‹;.ïDü† ÌZ„qâ ¡I,·tÌ8_0æÐ.AItö6MiitSjŠü¹Þa#†Cõ­É9@$ÖbYáìYœ þ !ìàKê”>ßi[¢Ùå(8týKȕȩ8ŒgÕ>@ð´U4/šÓñW±&¦fÕa&S^l!qN7dl¦Yª)IVóŒh³ØŒ.kh[’,qç³±ø±tEs™¡¬õΠìN ÷¯ž~;b/Xën ®/ùÈʀϟóÇ6Šf¦|zæ&£Ž õ dC2ÚÙ`ç|©¥yc–N«:Þ4“~{¼pMÌŠÉñ2KÚûÏHD¢*7Va9ýVì%^5\`;«™¤Lˆ%ÆŸc-–Ô††•o†¦a‹¯é`ä5CslË T¥Š°bê:X)ØN‡ž!ª`âèÀtª âØûòÑSÒ°ÿ ,•ùþ¦(žÓä•?ŠÛä5ÜZjqÆü7Wqó!í5î“ YãäàBÂ1Q× ñ}”ï¾\h ™š¹&Ç•}ò³/9`ó®›µOžiî FHŸB¶^Õà¯_½þ±ä¼!cüS¦1¶ÃË9ûŠfòâÞ%+Ðuj$Œ6%Lä}ŽGº¸%g«eñɤԢ$½z#'L’ˆÌÑ5¾]¹e8ÛÇ¿1æ$[$*ø‘Q±HnÓ©âSXj=3DŸ ›B ½ËŽp@€ÛÄ”º. L𷯲ËIuéØYˆÔÛ…~<"bUdٱ'h ½ÃÒ œuØq EÖü×"S­TQF ‘Õõ¨ŠlÄ$AHÝ„†²OŸ;z•û¿$g+‰z… Õè>D™Á»8@©Ä3¼ÂÇl…ŸB @*  S :8±+Õ-|vs7bõPIé=ªHXœ™«þN&iô ¡ÞËE*…6¥ÒÝà#¬Mùë‹úìgi+Ñ­4M¹¶ÖIÏC¦ÉΠêwG´X?^¹n§DÑ”´SMR¢ælI.j ÅÅ“#©­d¨izŠœäJ»Š¸@-¼u»jŧ>—V¾o@'|ÝC}-Ež»€Ë §Öfâ=<¼{®úîàÇ`ŸÁ•1䶬ˆgèšÆ-WCÈÊ·šÿ=âdŸHÉ–¡Í5Z´~ŸØHÂ…èÑÓ¯ZI›lo. H_Ÿƒ‚é‹:+ *7°ª®½Nâ z^07³ûõú‘¯A@ KªB X²Á¬ÀJ}I×së ôyi0 XóΕ‡¿GÍ[_.]Mâè{ Õ¤c‚ {É´/±ÎöᔩŒ›5¹¿ŽQù•Ü&S^•eñb¥E¦Ã{AUxpÔ·#|„Æ}9ü(»›[Ѧ•Ë4…ZîÖ«-—èÐ¥ƒ–äº:¬›¹x ü˜3ŠÂé´l¶>æt çUÎòenÁ/DØqeÈ–[¯['f¹u|”åë’ú¶#l'y·d_p8Vä%‹t\"¿ÅoUúr›ó ûãÞÞôì<˜{£¨ñz-™ë ÝÌ.zÀ{ä=%¦õE/d i“ØNøUáýÓBŠäÝy ›2g¯=—(ö.T¾ºÄ+¯ù²h/,Þ1màABÕž€¶3&¸·jçdë…¯ k·LŸ;»‘4÷gm!Ù5\–XàKβÊNáÏ€Ÿ ælª5¸Taužºr =¢¸É™›¦9´bZÇ›H/†÷r–ÛÀn·ù~9Λ ÓQÞè§1¿®›ÁmÒ£)·SúÒŠ§[N"FL|.¯¸ ¦ø†Æ«=óøÐpûo´ž‡ì!:>„±‘´zéÚAÙåd,R3ÍIû¬KÖOgž§N±[>8x´ÇÊAÞ¯`ê*–Ít&¢šÊpñÆh¤T·3¢µÆµÞ4­RTCsdÇîåUó>‘5U‚¾½´žòžÚ^v  Œ£Ï$ÀíÛ¦Bï–d‹ë›‡&ð³¡ÒÂÃ$žõh¦à*…º·n°ÚÔ(!UŠmÅ[eÿ»z$, Tòjˆ‚ºÔ£'a¾ c4:1¿§5š7ë‹¡/ª2®†æ%%ŠŠÂà ¸ç¿®\'ekËI‰ÐÉ«¸ûçŠÂÑÏÜÆw8<<£F£ (ºRQ‰8ã‹.DéÞæKqQ éDk 5¶4™Õ"Uoʱ‘‚½6ÁpÈVj"‹iơɦ\û:›(luϦM€NŸËŠ ÔºZcCæð!-­26IØF.€*‡×ñÉV¯˜ä‹Ò54Mk"5-MØ ¶Hð#Ù´‰6i03Tc€¥]ò\¦ÁªœåÁi|}{Ž[¶ ˯|]<¢jç6ïíŠÇÈtãtZ¤¨ e—´¸ì„á´p;vÔM{*w-îtr.!ÆþfÕröEöÕÑ&™æ%‰:}±õ# |å ré«'ËÎS  \ÌÝ4IÓAgVO¡.}²çt·X.©uR³@–›«AXuv¡îBŸh,{D»Œ‡ÜÖÿݪË(f$…Ÿt4bާ´^Œ{Äõgº½•v/ˆ|2èJ±ã2¦ï¾` üICÍ·"êˆ:Š3ØãÙ n¹Ÿ hn]“…ñçUžMÿeù9“Ó{ž¾©ËïÚ³€AÇ¥Å&®©aÑÕ–j$Ó­ÊàžpÜ^ñ‹,{šÑS¿—b«¯#|kÔH­ ¾kzt?¯ ;¿>ž™Â„ˆ{8c¬ŸÚãª5ßj9gé‚äE«ÞÑ c¼°€F‡+ËÒÒ¡}ÁY—”{áX™sÔô¾Á¢KJ&UÍ"¯¡;cPp‚†è<"ì§nhiïj¹¾Ü—¥ X$tÖB¥¦ìÄ>‹¬¼C,²XB¨vsxÊ›/<2Ë)²í’M“Ÿ{k ¶JXH•lzoXš …ö GÕ)¿éMXø BI\ßͳ(©w^Îâ’*Ž eá@”€Í‡1 Õï,R}ŠdÐŽ73íïbÍÞ!¿²ÃÅ—bÇTy˜Ùã K2a"kïû}—+w"¬ÎeÝκ÷`΢YØþ¸?¦íÏÄD»¿Ðç,óêUPl’lˆ6íç‚íÓX‚o*1«Êm“x£{5R'âžoÙbê&{ì´l“¨è\bv¸¡8QÝy#7J%%L¥W£ ÌR» åôkmƒ)DŽ "«D›@r¾Y;–BˆM¦²Îï§Ý›ÌÓÅTU´Nó Œ1]Èœ[³3«T©¥bišŒ $ÂZ'|SYÌúþ 6ý9-êhd,zÃlq.¨ägï‹?cЬ +< P’ŠÈQ[´Ë®ÉAC`°¿¤çUIU\våÛ{O‡©9¶õ ²uà˜¦ÑÚÙt~ðØ —Qu_°¶«Jñ¶u"T‹êé3`Br&m¢6ëìãè ˆ¯qæ.´ ž‹²¦•O›e§Ùµ‡\@cË;8”E5Úù` P°Ê\8r íÛ\¯ÐW¦ì§B*ÜÆÐuà‘« ›;掖^Y’ûùr—ûÕ'àd¦+Ö±Ä q"ãÃx¶‚€h½%Á!¬D–£¢ÅP­(ÁÂgÈ´úwªÒ JN0#·’ ;{Ï}®“z˘ •¬ç©ÒÆÉäQ;@Û|´Re ˜ÆÑ¥Ô"¼ø­¢l £8ž‹×4UaåEús>Íbž(y‚L¬“åù^«nû=ô`¡­+éŠèš³^â(@¯ËTåRí‘›r‘Æ —Ý¿a”,f%£Hék) PƒBߢ:{cˆïäÞúd‡U±µwqùÐÆ©1ZÈí j,jõ÷TËM¼"¸0⓻ήdœè²$ø=CÄ 3nnö»Ø |« úL^û§™Å“âò¹(ÝϦzë]ˆ‹Ý[ôÚ¨^8£a›‰¢)%L² «ƒô2…‰¼ÑGOâÂfô·4;6ÅW£uøƒÓ´- 8Poj%¤\Z)m,8CÆ?!¥Óþ»–Š@BJM!í‚<“³µ]C™¢óSÏ3ôC}¹‹ö-(u†Óä7nPM›é·Q–vƒ—ÄÉM38|ã vëV Ï¼¨ 0oH¼ „t°€0(¥Â!Hz±NB¤¤4÷ T1?^ÎêFêpV‘\±–×Iøu­v”!$ªC‚ñsõIBç€gANaqà pÜKù)y6£^E|&Ã1õÅåÔ]Òô·×DZ€)½¹fgVùC4ÞEèŽÊçp|µpbt~0^z´”·E8ºiÈ@?¸‡ÖQ«‚œx ª•2>OUƒa¬&ò§™Žv"I¬ll*oB£¢µóÍ=KÉÈ\¯‹òBAµý^ÙS æðÖÂ:Éê>EæV‹ Z*Ztœ[ª£×'˜Ž‚w—dÓž™›çðû{âEª…ØN¥çîì|ÿ'¤¯Þñ¯n Ô¹3¿ž»eŽÔkɧנŠûÌ_z Ð÷æxcÁe±- ºx³%œ€»|ãÏo¥r„Û¼©“G´XKÏ5¦ [¬]ÏTÆé× Ç‰‡Þ–vý/HG7ý=ªtTpÉf×)¼Êûõ,ä1H~ Õ£²X´”½”<ËS°g(:ÌayŠIûòM/ZŒ# RvA—îg»-4xTÂ`À„!ež{1 ;*É‘÷Mƒ‰±~C3¥Ðü,2XدÅê\F€hU–u±øCiÞ£µd,F®L»8˜´óÅD;¬QбÓ\6ÜN¾bø'®O^Ã%¤¾Ù¼wh(MwtZüU¾e:&ܼªNwù>ð|\Býæ~懊$ (‰·)@&]¨­¯ëÚÄUFûHŸ©ñqÊíÈ3 Ù‰¤Ôj6.é4’}Ûh¸/Ï•.P*zUÚ)ô-4Ï’NbTD»:íÚ2‘Ú!Nâ60îHŽ-1éÊ'Z€Õyq™èé<òÏ·éÀ2;K÷P«µ™ÜÈbÌ©EJË {;3“K_tøþ­Ø1¤¢Î…ˆa—¿xj—]T¤;'‹;íˆkR¾‚Ü»ær‡´ë%j×7`÷…KN£ÒL¸ŸOtŒ ¢!mVM"#zA&Ûɺ'u™r“–ÿ ³=N<¦E˜wfìF7æö°xá[äÚúe±@“W·õ.­×¼ü<¦ÐnÖKÐqˆ"å!ƒ°xš=оž[´¹ÿ5Ÿ£/"àöc>²W‚?é¦\¾Ù½½¢ž Ý 0`R8ñßO‰‘‹¯J!Þ&ÒüÒŽ‚ù ØRɸÿŸäl½ÁO@TUd~UädG¹ÖÛñ?Ù7F*!ú&Ó2ã#¢däfPaݹ‘CàŒîI—Àâ3Ôôo”™Rdá.Íî3‡z’é8 ó=lþY ß[0ÄLKÜQ¾Ÿ÷ƒ¤¸¢Ž<ägÒK(À([–#»½M¨4¯ ö§Vë获…Ù”Eˆ§»Œ>´c¯zþ¸ÎcØ"¼7÷·Ìk•ÛÙÙˆË R*kž4x—ˆ(+j&ì¶cþÅ­Ø Ž ôò‡\OúIõ–͘•„™<‘gpzñhÁYYˆÔaõ×Ë3iÛFí¹AÅt3a ƒQΪU­0 B“HÎGs‰×…;‰–A‚f¸½Ï÷*m$]ïñ÷¾Æ×Sø”»0…Æå¦kì¡jÃPGÇÀ3kl0)× ?AEº§n×ìt¶ÎôwŽÚÖóâf?Áìÿ–èg7÷Íá5ä„fsè¢ù®;)ct®ЧuLS˜´±Þ€ª¡Žýà¤ý±¸[d˜äaèòÌe1ŠŒÁ-§Žû+䡸¹-Ö´‹ &¦Ý UÈò3Üí ’b‹lUè¾1ìV¹XÕY_ƒßYG'á’ñÐ/·$l{³önöÛY‹kNc6l£˜wO=¡utážì‹¥õ K£²\îkÂÌæºbà6Q¬ª$ Š…ùT¥Œ¤ä¯s£~_jõB`ÚeqØ­ÿ;W^¯/9Úå@‡EúìÖBâ‰O/fUók¶F2­fs(œ¨ UÁíêÿ7sÛ¹.¸v.1\•@&Nù6G^¡×¼ë=›Ó¯Ö]ãæ‡·šy¼÷’[ô‹ …²‚PC°ð¨IÅN¤Z5$¶& Ó ïc?/aÌ]cä—ªf S>9ÄKêö‡N,%Øô5tÝ_EóÁy%ëú¥XJ€j÷ÔöÖ&4º„–ƒL¨p@ÆÚÇ(’%¶úÝAcHU¨«{È1 ~Úí"A€rÈù)Õ‚W¶{[ ÖOŦëæÖªÅÉÜäb/,ò¬^æ[ºzå²-U ;¹ÒHœ «5§b„JhäMZl6LY×çJ3R¡ÍU_M±ËcQí¸.: Äßó<PÝ¡áMܤÓnëF `ñã9Ìx£pë´˜¦Ò°Ìp†ŸtÁÝ`ŽFM[XöÔÏ€òN£R\EЪÞÐàïÑ©jé.[Åfî oîÜŽYÝ[ê6Ÿ`[Øvlrz×B`=›¤ð}CN·aó1§q`P¢Zùkŵõ•± rQbL‹óÙ¤T¹«øN•QS€U…€´I!á5ÍÕY% yúnH†—8êI¹© .›-_CmAe¯Ôþ½9HÑǵi\ B£l·ÒîÍ÷ yŠ„8ò!oïbŸ!e7¡z ×$ÉA<œX펳sµòR/ŠÝGÚ¾˜ ²ÿqUY"K ïŒæz ÄÓw× Ìqòd ÉM‘¢¾Ùç‘E¤'†.ç–44Y·ñp.͘Pë,\{¨“дfMœŸvyXqñW "¿Ô!.!Ëq8:ž‰™ s‘b˜8û@YD¨M!ã}`b˜rÕüäx„ò4•ÆPÌq €¯–Ǽ*€Ù¶jZª-·Œä΋B2)9LÉD)ºï *¤WJ!Úòc¼8Ÿ|‹¥ldÇ2¡|ÿ†-TÝÈqϺ²c*QšÕ ÞÑ„v¼Îwœ7I¼5ºDr²ÛB¡zÊ$¾‘ѼՆÏNçT.z ¶†Z³›«fµmox¯êØð6g†–f{¯<³:½À®žð¢™õs,ö™üWïGÆ–Ä(ÜÍ!÷Ñ¥¢A8žÅD8L%—ñ6:9ý(ë®|1 „…k›DòFvA£%î¹}t¥ê´vyÔÊ"þvä…Š•튅X-Æ”àò4割V÷l’KQEXóf„}¼}<ŠO’Êç0'ÎTX‡ÂÎ+¶Œ©Êm¦©@¢¿Bš@j)D@’²„hŽ ¨¡¯Þ{$©!›Ùâë@@ ¡éÇUr*øtÀy¿‡T%Œšuˆ°ô¬IûÞöh`ù\iy3HS›UýDŒ¨/©h@6x9ýTSéâ`.´nù†±Œ¨Ì˜³¶»7´5º³µ¥vuÒÅœ#'éé\² "ZÙ&'Üðà5ÖŒÛ1›J åó‰rwDzsxgaŒJ£ìAߢ:$B`÷êÖÛ°÷ ¥ÙNýŸäþf zvcÂ,P(âä³Î­ñ`t²èœËÕ?ÍGË*¹x3”ZE …òXá„ Éf]¯(‰õPrÆ:½>‡1%­F«¬ã1š;w¾nçå,ÆN±íØìm¡ã¿žã(ße¦Õ”ŒaiwÅŒŸ ÔN9s…l–? ¦Øn'Z‚Ò«Õ@ušÕ5]G‰¢Î(“©x¦¦hÏÎ3?>»€¥Ó:‰Æ7pTó‡ $²hW§~dè¥yñ…‘àC'(VÉlÖC ¡Œ»ã-Nû.`žàU8g©ð“½©‚±½ó/Ž•Êž&ÁNy+Aö‰ÞÓ*0D(•ão.ý€¾N£½cÄatÑŒv2ük0ÄDÜÝpÆš,¢È3 Ëgr$!–½ ²Óhµ#6äT-šOÓ‡Ã]Ya¯gÁÍ—iÞ­Äq„C(ÿ `}.ºG±¸ …fòe¹>‹ï\åÉð@5[0xü/W=¿_[JëzEo‘Òç윹hœ™‹tÌMpð¾Óé;¦wmƒÜ¢NmíVû½-&X^«P\DbbªŽøôc³ãK•hºòù÷Qc`æ;5xG‘qí”"/–·E²kÎmBcØv'„'øLTË’î6É‚/¾o#·W"îF‹m¾5 : Q·˜?j;üé+–Ûè?‘W ëÆ×åÏ„‚$XØXI3çù‹ Iv+fø@-þtùŒ*¤H<ßÓ·a{†2Ü<ûÄ>¤<Ç8,“Ý£#ÞàŸ#2*Ò’ÏÓ¤á/€ÁºSè%4І€Ö ªÍö©ëê¦d •ô¿ÙS´'Ä´ä5(s{èMðžê@†K ºÎ{Pb–pÚ¯Oó›-r>`d‰"ÐÁÔ`ì:V‡¤VâoYrŠSVÉ€C•“=îC¡êø'] ¨MBQÆ`ã‡×º²ÂGL-íD>úš$yÔ²ƒ2"\ ±dá”dž¿6M ä°¢Êd¾Ë²d žMI‹åQ’ æñ'”Yö„G×ï5;º`9 ‚Ñ×<2ó$SG§i¶H,JèRù "×K´Üyj ‚QÎê#ä2tS'4¦¡ŸƒÈ} ëŠtèÉ’8¿7¾0z[%éŒÖY!%¢>áf/²eTG(ÙB\¼Ì™…M;PD©ø¯X(ÝÌ*Ìü }óª ÚâŠé ÂÄÜp³°ýuá«—ŒˆkNÃåm¦èœZZÞe•' ª9âí#{ã‚d!Ê%Zp½LƒdzÆ-ì¶0áfj¤–®¼ÍtÞ2hT/0¢Sß¼/ÐïMÝ{¼Î~<ó çî¾ 9@ýgGyÅßSA{õ ê^™hwT`‡U®¸ð’ˆ~gí·§;ú$6Ì1”¹Ì—‚stò²Ék‡A±„ø?šô6s9ðýÈZf©Œc±§®ž-(­Ï/d·á*ëK’#~^ì½­çáMMÁŸG9'¬lÀϯ8HøD\Z jÛmuÉ«jµ"DŸÖZe»Ñ¸Uï¤ ÄÓðóÍ{p¦`[üÑ+{Ét˜R‚LShŒ«î‰h,FÝ,ZîÙZ詵"ÞìóffFT••Û‚ÛÝÉÌÏÑÚÍO¹ÈMZ‚_MÆâTOB2¢xÅ37 û£=§%Ïš!eî›%C;Ý¿\âõeºÅf˲IÕÉ1t`‘Ö‚÷H9 ÛO ¶­ÎÐ ®âgçsX¯©¥jvËzto&²5JA• WbÍ6@Ϝطª"T1%ÒìLs0 ·WÄ%‚tŒãPîyÉÅ¢'a~ýܵ0SËX˜žºí&X.ʸ¶Ÿ×Œ;« @×]Ñ„#ošÓ†‚dQÿk–á˜üé^Z¼PÓ“†  ÜDdŽüœs<¡`ns Ç_³{0RdÖ€Ó/Õ,‚Ô–xé¹~cá…Àœ/¥$ <‰5Ì^GHø°ÁS‚‚Å‘&;ܘU…Ÿ|‡»(ÏVžì™»°2¯š°îÌÙ­ 6C±åcë†X“s!ŽDw—w  Å`çpÄ)>:g|ò+®Š[Ó!Ë!8Û”“*â°½­zÐXy<5×:¾7žQƒ–VpS®íÜ­Öt‘^}¬UÀJØ@oüwþ´Ñáa¢öf˜WnËÕ>‡<1} p%µÕ+©‹™Ñü¸6Œ‘–ï¹ùà*.Æ¥Š¿º UãϰÔQñ]‘ !ç`ä°(šàÍ9Òòµ¯C® õºKŽÖùª]¬ÞÊ Å7-‡¤ØƒŒÖ Ñ0ZäÅl—g|îèòÕÀ_ÄäSçè­›ð/»nÅ"X¦ð´Œd¡Ðy^¦ÀL>@î î>œ»-@ligPW‘u§?á¶äÑJ{@Xx²ûœ(†ÉpŽ€µ„ø+sh³h¦L¨òÈì÷›8Þ–¨>4DÜÇ(×{·xZÓCND ¹¸Hc”™sÀŽ‘~% Îf:#§,Œe¦µàµådn¦ãÆ™˜P*œÇ« Ž"v #µß’zÊúSVbæp 2ŸÇ§h…Á_¸_‰ØÄ)©bh6?Í-9‡‹ •SeD’‚™ 1ü/úè¹µí¡ë˜3ïÇæØTs˜•mqšìÂò¸e‚V-/^Èq:Õx"…ìÓ§7), 2AàNj;pF2X7ÚœéØ‚)&ð§x;äù’ã’Nä,ÑŠû}IhVÝä¶Ö7\©°'Wï_‚VÙ$)‰¹í¾å´ýý¥À d¹kåLpvÜæðûsνv³®J/1£ Œ9×”Ðò¹°÷8ðÕ‚ob&HÞöEÙ´@Õ8]y/ñ_¦üçJòÆÔ ò¬Ú¤ ƃB;˜‚_ nœ»æÈ•tæÝ·ÕmdÀö +Ï¢§)[ƒ)!%K’@È…ooæÝDæÏÜžî^)$Óý Á´y Šõʼ'X–¢B´¥i‰+‚°úHzûôñUñÞ £vϪîÝ7ƒÍ"´_¼:'Jåüߎ޺ÈYé¯ùš›ù7>G¢ž61°7ÆÏâ"\¿u3ê¸jX·ØSc¯Ä%P”}-ÑÓ’—MÕh'ãUrQü»ùt7^ïÛâì ×Ë«]úK£¾YÖ½õ9›‡à“5—agü瘟u,ò"õy¢ gÕés°D±E#ÿNÑ.kRà¡ë…Krjˆ2ÂÀ©!¹|²˜çØÊ¿—Z9°c9˜`å=uÑD*Ç}ùù0¹U:“fÑI²Û®éæIl^/ŠžÙÍ3"¾D,è3‚!éî&C%´ì²G#2ªP_ü0éP`;{$`2ñ‘)ôfºz¶Î1ÞN_‡,²Òz#¼Â±›žÑsØáqrv%M+rûT\”;%˜HÒ“£É¯.ÁØeK¹á Ý±Çúí<‹¸PÊþï•9¢Ó#ô$¹ÚP-‡˜E.o;·¶jQI¬†ºdu¯TŸ„VeטÞÀ6é!9„dYjsd…(BˆùnÙ]r—AJ5ªNR¢ í·§Ê¥áÿ4è÷&FøìJÓÔµ[ˆtK-¡çȨ̂H\ÍÏyÃIö î5"!2“µQwö^e‚åÈ{IÚW»§Þ=ç×;r_Úiëמ2…ꆊq×¢РÖ]ŸÊÁp­xè<õׂ%Y§Æfɲa»NIŸâ´¸9û’#_~ÒkTc B^ÓP«¿“ÊÈ­çE\‘™ú±â¤ô 4o[Ýxeb¯­wkcëØµŸ•Ožc+ñ]#mÑ%D›ù·ÜõL4ƒd¹ŸÓ1Kv¢¥4³»JŒj‹_9†ˆ F¨àsröE‰¼ a¥óÊá_jÁ˜2‰tÐ^jǾl¹‡ô±ªÒ(ùdüù*êO¥*µw‚<žßg]eÍ]W§³Ì(NŠ]wGwi3×k¼.˜M¶e'†ˆâDeÌêDfZÇ\›ë´Àöûi,ó7¢Ë"K꟠ŠNnË \Þ=4Ó6¶ùɦu“‚¡obË[?Ž|–‘æÙ¡A{AcÎÁ¹ÞyõàG¡&ÜŽTz´Å~¤±Œpù ˜ LpJ9î’¯žg6-3SÌ;75JIZàxR¦þçö ³×–DõϽpÄüUä¤&÷Še™ÚÝ<€eÖéRê›ÔCÕeW§ŠW²ÇÜYˆ$†¸òVMKmÖ›h&¼ÍÕ²2`‘÷îi ·$!Añ3õ "9ˆ} –= ì&ÂÇ–Gõ_ëB>НÅÇßÑÕÎÍ›Ûò±Ì¨a·Ø‘)W‡ÍEP(ñ㆙v¶¯@ÏMQÙ j½‰:s'dþe!Ø9žáñUÇl´5CÎl9Sa€>|Cõy+˜Í\çëèýÏ/fxÝ‚/m6Óp?Vö~œhÌå¯##¤=¼ºw~à†yô¬lD`#³ºÖeFo‹ê—wì~xY¦ì­¸e§±ó=ä¬Á)êë›ug<óÛ›z‰Ð"ý#¸1’ ‹Šð(3A«š9)Ú· Þ®q‚ñ`Ë)¨$Î]®B—K½”WŸÖiбrËDH•‚P K=W$CtÍMhºs7°ÛÎý¦Sà³¢æ×C>RÙñûù•‚™`|l[K™¿óú¨¼ &ëY»½û˜ÙdeàNóà}¼·/l¹Ê í) ùÄÞN˜â†Rx†!-‹Ó`3ä`’ˆ•û[?%s°%¼ È#Øc5´õèÁ+>vFpÒHãÏ$#†ŸS½ëþ}òr‰³ýlQÇ¥ÅbãÒ½ÏÜ«Ó<¥šúª³pE>ÞR7`{‡¹ìÉ>CKË­ƒÖm²“BG`Ç'ú&Qõ LÂþà.¡å¨Êśӟ5x'~j0 Cwfù;ª‚¡¦_r}9Ué¦)Úš°G Ïv ü‰Î|…ó—ÒòèÅê¾ÄU»µÕM»‘(Ù”ñ•ú¯XÏŸ¼»xðt¤B{ÇÌxy†š„C‰tO}µÒË*تm¶G€«2J­)CIǰ£Õ(?sä7ˆ¥×Ûz7 DmÆ#ŸP‰Rµ*0\ÝI‰üR 4hu@ îÙ‹¸ëæwxæÒzˆ’ÉGáãó{^õ7Ðâ$Ý'$9O‰~ò‹ÌïBä!1¦ñ¯ÁªÌ×#“iû·ì/û+è¢L<­‡b¨¨!iZí¬ù\ñìßbÌÛ^¾]ì*ÌÂs?ŽY¤­Ï9¹xc…§³¤$œÄc‰oäë}(¬²Ö©uB/.Å gI²oý8ë5Û/7|/ÓÝb¯Ä=þãª_ï´Ð ÛøšzWTx!¼hn-RäH .ƒÎ'k¹2[ܨøFòJÍ»3\•rOD)ýÏé‰Ú `±Æ‘7×[­*]ß6ÞÆ˜ÓÛûÕN·Ùó&.Äû÷~köËNq]¦ýg¬Ä£Õ‹ 4Á‚알Ç@…¶Ê/»ƒ¯Ck ºkÓiä?M~›nwÌM Ã<£ö&Ö^梲ÞëV [¨¶Fª‡Í\i¥GUü¥°õÍÆÕÇ"z×ÖVë] 0ýEÉÃ¥ZªŠ·työò³$Õ²¯$ÚÙe´ômoêøÉ;Ôô«{HJüyMúk·A󀙚·žF>áú "r?+ó{œVÞ®ó'<œî…³­È®£}ï.Ñ@qGŽ޹!±Ñ)êÓbe[îd½}oÜdJöñm§è¹ÿìiˆÖ±Ë†üH“(¹j69ÑȰ“6_ëÕëÇœg¯CÙ¹/ôS¦ó -fÁ76«‡¨ÔwŽÂrUøf%¶DùQÓ©bU8 Lìe±âË ›¿~þíóåÌ£ÏÓ×|üx T>ûš<41‹ùzÙ'VåLÛÜéæXè‰5e˜´@*wÿŽ‰î™ w‡,Þ¹-ؼÀ>ÊЦsšå¶ùC³ ži ¸¥ºv¤\&ƒF“r‘« »ÁU¡ØðnØ÷V*bÔ* €¤¤˜Ž ¡dê¦/u·B±Ú3ÑE6€{67‰9Œ¤è8l O%’–QÔTXÆ$n:mu”“ß–`6ä(Ež›»Ãì¿/ü¥éù¦í¬ÑŽ‹Ñ¾úÐÑPàÑiÛ22#UË¢V¸ÔRµ5¤Ìe Ñ¶gÏjsÂMÑ®Ãë©ñÁ[‹U lmþy{d~§/¨Í .W1?‚òë»UNýôF·ã±I«$q³•,ý$Ç ÕÓc`‚1ø‚0†¯ùu)/*½9xБ"|Tþl÷f‹ÇlÙ ”VX÷]|â “;ÍJùšØuÜÇ$)&–WŸõØB›G €Õ­Ä¸e zg¾rÚ'@敤ÔA*¶çAç—M\@ѹÇG íÍŒo])9’uè_ªäp¡o)(d.D÷*—†…a4¿,r/&wF}kÀVuã^[’å°Î…Im׺Dnƒ5"êtðAä"tú¨ù¦Çؾ†µ›”´‡'UÅJ0P@>„­lˆQàN ç©sZYF> ‚Ac©TÝ^{nœwªl„-Çz¤Ö*Îâ> ;*ÖçÞ>]:XûµOænEï:„ƒ˜ùë¢N´ßf)Ÿ™dUlØ0 ¤Fô,Z½”ÓÓÇZ®8t°NcެqÕžžN¿kÍåÝçþPœT­ª£»yk¦RÅFÖO@Vìc/_W*›õN5i3¼ ž‡rhŠJå—ëa;ç‚?Ãó»\Ð?8:*Wp‘1O.Èx9eš ZëE¼(퓜rgéÌL#LÊ„×v­žý%Èzk‡’üi<óv)=3 † Yä&iZ¶ •qWOk–ѤC Âã ‰”’%-|FM®¾cBÚºdtmd—ÔVg¯rà C‰n[JêT«6€DJ‰ª%/¤²uá@&™ ‡‚@ÊÇvºUGê†D;Ar–™aÒ™ª7ãùµØ3бÈ[83hZhŒúÝ9%wÑBÏ3­Ç1r†Èà µ&üÌ»è-˸®·Æ’Ò³Çly ûÔQÕ_€^}oHYókùë|ú_ó!·éƒÐ i°CØ÷ë`òYØ9„A>}Íåw NCwvõ.º÷ºôûƒ5_ ŒºäÐW09áóÛs”^·]OáV×Ùl€4_WÕõ (~ {Ýd; kН9s#\CëÂô{îH^\þQ‘DŒùÎ==úûŠÿ%wkrÖþdÆ}¼²¾ ËÚ#$EHN“7mF²SWà|¯¾ÄaZÐ~djüE'@t‹8ƒ„öìT ¼‡EHÐçã”:nõˆ÷ñÇZ<Ë·öHî ¿µòu³•ÕïåÑ%NþS½<…ûÈ]ß ¹Ÿ’è‰lû~†‰L`Äbp7éŠø¢l6Ý5DØ;æFõRÌN`þsÔŒ!ø!¿Ÿ±¯Èª¯»eJ ‡°—ÎÍ0@ç$îC±NÈñÊ(Ç,¶¾íÁôÄûáÈñÇElÕ§oß¡’ÃÚ´÷òfÎàîÜJº1ÔuÛBüÚ¹:™ÎÂøô1¾5€õ–è«Á„c1kãž´Üöý©Â’fÇp” c"é–¼rvÖÿgé¤IÂÒð—„Ò?ß(&dpM9˜2Û£×°ôóºÀ¸Ü#–lCÕ—¢Ðü=ûš%©ä—Q#Ój¤7vÒx´ä?â·Õ­;Zå),;wà’fÕS3ÒFŸ7 AN_¶9©ÕF×ÕLuƒJÊÆXÉÁlüä¹bdÎÕOÜ…@(ê¿^R”MÒRï‚UK£q„sÍ£(/t”Ov*ìuG$e†Pßc4¹§}¾/æÃ¹Âí2ä÷‡b¤HV {§ŸÞ2{‹ò¸9CT„ h`Ÿš•ar²8u†ŠÝË%eºÄ!²o‚ÅrgÇö“Î:¦j"yaÁà”³W'½Wìñ1²µ A B¿³†›MõãT‘´Ü¦lJ/K ásÆ%îB¾Ý{ºÀnß#J8Ç`ëRa×Ôäÿ­ùYÎ×D–7 ;€.©'Q5_:`ZÄ2ŽŽ7m‡Ñ~š=P·(Ø&õ«‡Z[óÖÍC‚C·æfv¾`ûq÷Sw:{&«ç­ÚFŒöôH¬ÈÁ9[¼LÐ!ô,p â\ä±xÏþ†»¬EŒê[šae—;ßî]$…Ðò£ÜÏÈ졟ɹMæûì),Nrà}~U#ÑÜ)ŠÄd>«Ñ7îVVÊj¾kÓéæœtì›wÁüq<½Â ±‚ø¼§Ùd–kÀÇtzý¼ö?¢nôôíC°(wžZ,s`Ñ¿NÎ)ÌOµwÒªƒL±ôöZ°Á‡~ZÛt±NkIdðÃÞGÁ§b+Æe,Ðe»±9¬ÿâ–ϵS`­÷}Pñ¨Ð´äÓÁÈòFÞ¡Gâ<»£¯® gmÜǥܴe÷VÃi#Üñ¥FˆÀIí®ß Îè5®†1ý†UœEy¼v7ÞWdAÈðLƒ$FõŸ‰÷„NBä§ìÙ8+w1ë}t‰t cè.QÖƒæIŸ‘Ú Å}*ÚU[V#£‹cç s1 ƒ…´Ï ?K;CTYù$—†ß­ûijςÔÏÖO%¿ý"–?M\aøoªKÍÇÎÁÈ[„UY·ß™¹ôÈ`Û!Î|urŒU‡-+kKÒvÿQ‘¼&ômñq‚i€.º×Õi’Ñöš$ EØ’F\4—Å^ÒôFªQã·Kåa-ºTk»—Kâ­ÉÆDF°ns»lÙpùÉà P¶öFÇß!JÕ£|†UŒ{‚«Ä”å8Çßíôó-“¶­E&m‘ü]–‰óvãÔnqtäòñáðRL`gªÂƒÒÝvC•ÔU’_Ôè#La{ÙŒÄ[I>˵ÅÄ/ï-Ö±Ðdå°$âu.[ÓeN‰šßÌä¡ ÝK.¯º NOÚ5R” `ÔÂaàÑ?–nçòÛKAú0Ö [õšK·LOè~Àçû[ç£(Îlz^®P/3‰FÇF@åæ*ìf,ɱ;™îÜbU^;ùŽÐˆ0 ›eÃ1/‹†·’ÓóVVx×v\ÌÕ÷U @ÇÒ¶¢Ú_4èP¹ÏáÝLãÜ_P@0 Ê|z6Äg¸=âž{‹¯!gÝ›ä”Q³‹`ٜ⮪òäÿŠP˜ö,¸L2ls~伉igjþêãÎhÍRÆn‹Áìg{D¹%û=ʱu† B˜ËkT8§¥™\›Zž…CÚk>,Ša,*£Þ–WV)õ+¹Tü>“XÖ×­Jå¤ÿÒ"q€Žë±oÝò8¯D«ªbn@Ñ2vçK‰¦­üñëÁLšË—S¸½,¢GžQ7¸ï°»ús2µ"Ï„m¨€¹åKÈݨv˜\îzDsϾ¹¤L¾5zêûÞÏ\ã{ý`,L|X–t®‰ÝxºT»ù]›É–Œr×!°“Ã=ãµ)" E"ëMˆ È Öò9h jå2œyÑ ÈÖþ3¯— -Mý.Žmº\î…í~ó™V|o–¸MÓ¼q¨ ¯×ü ê>E¸1u–tÏ„!§øgxçÖÀr¹Þ£¿]í•S¾€ÐIXaM^¯T1cA®Zš°÷’ÜNu…„Œ’ý Jùr(ÈP" x¬íôæi¦sÜŠÎ+J·Ã²ˆ,v­ZÆê!¨Œ帊SÍÀµÂ.~¤*~–CYïcXa#©rlDÕ‘¾n›Bð«uÅb$º<'O‹êb„0»_»E~‰ H Ó¹<·’’¨‰´Š«àÀ¶¡èÞ»vL2Œ¥éøò'3ñ£ëÆÂðééÐûŠÊÛ*õÀÔ(}‹T¿‡` .„¾•ïጫe6¯Ù@&ðŸöþª[ø r '?zýXÙ+9<¾¥v1Èë¬æ‹€iVê±—ïv-cÀìÜÓ3±S²9ÇA¥„«þÐý6jLxM>rxS@ë{dÄóö –YÓÇnû°ðö(ÁY ¬¼:%)G›!–/ßn&ˆï¼Á=«6ÎC±Y{Z…+)¸›fÓwd|æ…//˜'¤wlm̸æ &H£ð4èÅ"ƒdë M¿Òc_`"bj'ò\ó°G™>Å ‘Yvv™Z^‰ßI²Ù×8iÌÆ-‹€‚ÅÇÅjJƒp9ŒQ÷ªl˜9C‚ʈ§Æ¬—Éi7_ßÁ^nUø‰Ã¾b3UXJˆ³äxÑf´ýg°ÝüFZk }†ÝémWRxû©Ž|]KLné– ~7  gí±NÀÖzv¼qÙ(-xöå|BÏ÷O'è­¼ýÑŒT!Åbè}EAääˆâìAd}vÑ~ ¿ÁòñÛhz0­ÌÉpý$Àí9ç0Úï®cÿ¼ëÒ`uˆ/<„”£šH.E¥ðC£m+Ö¸[Žo–Ù¥CK·b¶K6?5GØ 7F¬M®Ddý^9h§_¢uݲlìªOú;pgàÚO'íWeÆ.Ç€~¼ëæÖ ï÷Dàê|ô²?î”°Ž™fwVRáÕ”´¨Ý.sI`½¾†ò0Z~lSÍÀ]jÊH,('öÅ5/E‘â¾ÊdÈ»l²º@çkͼ×ëS"ð¨<Àª1Zm0 ËH5¼è)Aux°Feß¿lAMÃí¬Ÿ=hÖ"Ä¡}‘€ ðA’švt¸¯ÛjË^B©à·Sdy&îòG ý!ç>™¯ˆNü½I—/–<˜Ò:ß뺿à¡t²ÖÁ§4øÖ:!9ŽÕˆ áŠyëÒ?]Ù‡¥™¾p¦Ô…ôbËœ›cÄÒã—¦{y¬¹äÁ­O²ùÔÇ=nâWYÕ§x¯õE‡V·jÿ* 9WØ=rDÃݼæ]¬é<ªÌQ7ã$i"ˆ@SE-íÌNË9 !K#S”Þ …p¦Ò.ð[’; .nWbÝTâR·úCKò›õûvò…ö$âäIsg칯iÂe Ÿ?YL<µÝ¥*Ù›mÆÝ‹}Ë-p¼*³X›(˜ó­¥—7ñ«Àë0¿¿ŒÆKÊd8'ù=ð¹ä‘ßXu›NÒî¥~}H­ìšË¾ÖLA»·eh…ÒÑyœTîH;[Emm¯ÓÁ<›XÏI>mA„pÌÖPo5=fËLŒÌ’ÌôÌÓ~¿·S£Ý[àW!û‰8 z…ê;õ¤ 9·ÔöíׯS#ÕRc‡—’Øe½i›õPãϽï=Èâ%ÉmðO_%÷j¥ }%hçžô$ÁþyxÇžtÎ忊{Ú¤ÁÛ4ûè ¸À`¼½„3äŽO¤(*éïÚ‘ˆh n@¨ç;ÀƒîÉPš–:s:€ëðfyW9…‰Ó³A°Ø\\8Ó&áí3åæ7 æ9ªùûí<õu$‡¯§O‡np°”ï»ÏÂ[!›hæ”g¢9(‚Ó›Þr\ö³uÝТq­p]TÔ•peMJ¥eì–Hæ¯Æâ6´A§lª 8öÉXtª´ ¡«¯Ç 5ìàß–¦K].Ij‹@òÊ@¹ü³üi(ÁÊš(”0ÀB˜`È[(°z:þ2å5½ºçèòÖÐ#­#¨€Ý–,ŽV a‘i%÷¨öM0Ò§¤—¦B(Te·ÙШÆ/B“Ú³=>cЉ ؘ‡lShn6¥w7ù¹ŒÞ$qî8Ô$*xé‡'MZµ§ n_°=kjè©Cú䨰Ìoù.¥§Ù3F^vax áü]Ñ^k‡ª›@,!pžæHÔe¾ÒÚÎÉeZô‹Ka$@„ˆ/U×vá®ÔXMŒò ‚|ú¯A¼Ú¼ú8’=QBš88íìuË ŽUáÝ©á ª4Ë!3)ä€ r*'¹œî]½Ãè²Í'ì‚ „%[`ZŽ“\µD1Ü÷ Ó¹}rX¸~»Ï凤P?Cò3Î^†€r=´Kh5á¿×±þán7ÅóÿZêŠëƒG‰0{f´gÙ93è†öÑÊ^3ò–ॵ…9‹È¬N,’>th&CÞe —Áíß#tˆ‘$Ú–±U¾n÷±,É=¬?%Ç›¢´K¨ÛÚ‚,à|þWu±ÐØM¸ ×_LÝw8fW§k“ª·Úgv"3¢Ÿè+¶¥ys]@NZ¨Ú7I<¶ §_¾r.¶2a{ôýº\ˆê¾æúŠàà¼UücXÁ僮‰b-j†ßä-´µLª8°89F© €É«Œˆ&öžS\ïˆgR±µŠch$ý«tPå'²6ÔŸ„éœT‹Àe§9“µ«öÅÈ»ï À4Ÿ‰ ù¯nø’—â5Øà®:-1¯åæ:*Ö'ia¼•uåE¥ÀQ%”ƒ îå¬à£‹ª†|‹£4i¸"îFÚ¼ÏkLÀgfKí%Ne˜òжf狤 f¬IÝ!a6FôsÙ©ÓØ‘®-h<öèa¯~šRiyOOqÊKxLj'0»82áÀ—AIÖXôƒ{i›$Œ½S®ç2Žþ©Y¼cDù` õ  žÜ–ÍÎLµ4Ô[l‹åóÙ^L«-½€úÉgÝ=º ›—#=»Yöœy‚—ô¶ˆƒf‚f S“VÄÍ×=šk½€rW½c£˜ìÁÒç–Ë6¬f¦³‹)H-bhÓãH©‚õŒ@èÆ<îáôŒâïV¼Í¼ÞîÀÊ&›µÖܺA³à¿M¢áCF/‘®~ŒŒ0«_öäò€z;˜»u…{o±x–çî¸59û{n Ÿ°ùÚM10f1Íêø±qÈ'ròZ$ÀqŠ’Þú®@{0USû ™¦ŠE±ÀÚìQLÚœö¢ÒÑ Ùý­]™“ç&åª}06Ïe^õŠÏShð F&NšŠ¸d#¸Šã/2û¸ô£ŒYx»t¾‹mÅÊ5/—/»h/Mé¨WÒí‰iL!ài“ÞËaÄ•ÙAqzN#ÕÃì¶ èmmàÅ% ³Kbø€E=([`Tƒbk„Ħ-}óéðÞ¤†YZ×Jz9'öÅ0øZ¦lÏî÷Nv¤Ú€² ¡c…a^©6p¾ÎR††™±¶XTŒSòs-‘Ô;âxè¶U—qõH¤K±bFÅÀdpØ}í£°ðéK~<il'”zÐqÌA¦šß7ÝéV£6Iõ+<,ʳ,ÉÕ°B­íÐÍŒü¦üESnâh»eRÑýü?0v”Uº! '÷ýiôŸ/!2™§•Ú©gN¼Ä-Y‹Á«¸A ’ëz²Üîù\k€AÁ× ¨;~~}zýGô>i7­[KÈrÑ>¦n|XZ½ázáºà OMHÜ'¼Ç'jˆ;4u<ò’/Â,aj!¶è¦Zrû` û>½XÎ^ËÌɪ&yiŸALÙqé_ǽÉ$õ ¸Hµz&î¬Àøó`Èûè ½O˜.ŒÄvòé¼wYþ¥Úñò;Ù'SÉ‚¬™(aæÛÞêú8cñ4 £H. ” Îóà­vÑ“L‚0Ù/ˆH•~œ‘g«gœ/´óƒÌ°‹i„ ªÚ¦ÕhÝÍÛyÌ%E.º6!IO¶hI^ÑP2y—˜L˜œÍ A Ù+€©r4BŠ~-²´$m³«ø¬‰XsËræ5§}Þ÷–PÚJÛ‘nmãÒ!´•6ëD'sܨ%żÜ^HN7KzSÛâû™æÙå³¢$¼öÀƒŒ¾;íòŒ³î â$ƒ;±]`ªKPì;•måÞUj>ÉrÄög*,ìjáÿLw“-Ô¨Ìñ×Ë,{;5":E|2óa{È9i,Vö[ ÇA#½X8´¸Ô,i ª÷–] 0Wq£f®>Ô¸*×&ø}ö=fR$J« í Kµ‘³›ZÓIs’×ñI ¡•‘ÇRí•b×-[ÔŠ#ùna\qòÛI¶v«ú^pê¯ÉSæÍ­Öé\ñsIe.ûLö:#Q¼»³°um;œ—nÚ¡Eë±U^Žl'l@^þ/Ô Š1\;1”‚å`~E{O%ñœ˜Ë+š™VÒ!or ½ÊB6ðÏ"Ü ¿·ŸÄ)J;`5yŸš-Om×Ñ¢Îé¤Pö~ÉòßK—6@•ÿz®¦Óß²–܇dÓRÝ{éÿà“Ï«}ýD?M`ÂG”„HÝhšLì“|Í4¯²§æ“)óOÊ|ŠÞË¡âÄu;Ï í–óÈ€bòxÎ@æ}žùöÓퟻ‰7W]ªœ,ú]˜ˆ:$‚d“3zoÖ–zÓùÎD8±%}9ÀÓ«VºÕ7š¸kG‡¨±u¼¼O_ØTÖŒ¯¥Uµr›]áyaûn%yÆ›E—m±x2@ñúJ{ŸH;”žññeÆ„aÁíˆõ!À郞Gt›Z„㆘ÙÛNðî_]ns!ÐñÚÕtf ÞÕõtª3sÖÎÒsŒ®®_U6:Ý$mKŽÙ[BË”Ôð¿Æs\%ÚYÁ7?Xu¸ é,8“o•øãr»'T9(\–Y¥sÕQÔâ*¾W_³Læ9 y¥a@1Dzø§&ë&ºËÈý ÷ߤÀAB$„„Uf¢…fè o>w ~oH[=ǦÃï‡ôù.«Óeí¯^ìË@Š î/¹‚†'h(s6ç1«¹WÇt([ڡݽžó‘»Çb³©9h®лéõÊù«e[·}ùuv–Líqüô6¬.óßL‰ÕˆqRYÀ0.¯8Á%ð'uq\Ìa)£ÙêHh ……гnnúüÔW]/|ìò¯ u׉®ß@|™Òl×®uíNžÌ’¸`snøÕ>{ƒd©4Ú|^C'ZèO#lºm® ö&"îPXXß”øÃ,ýà‚ð1‰j´§•,Œ21 ¡<ÃsF¥$¡4†ñ/r¼LÐÙ½'T¢…)æB‚ÎFú¤U:ì݃ ÿ`î¶RI?ŽÚ®Ï¨GÃp\-Ë5bÌé ÇvŽ¡-Þ­ˆ `Þõ$Yexå–Óý–Á= Û½`¯’[R_,]‹Ë8 ÎÔ|÷#ÜñcVáðæ°9»>/3‘¹ÙTŒrα.H¤)sð㊵9$ ¾}j ¬5”’ß5´³(¦ªbSÉYöqnZ×&¿G¢ä/8µg×íµ})÷È›9дT ….bîL'UÑ-mF7ÕlVÞ«GšÛ(²² ‘Î*Ü {1@ž—¹%"¨u-É;ôH@D†“bùãq€ ®•9£csÞ7v=:ʾ½(©±t˜,«>gÈNãÞG_-^Ni ô .îI^Léy°6çÌó5ÏdÕÄ…\¬S£G‘¹ ø*¼vg §ÑѸT@zà¼êÿn<½p/}ùd Øg/o>•ÝšGÁ5O½ ñdÐ÷O±]ŸnEéƒ–Š¿WÛmH½phúF Ê<[§(ŽÏt^ad÷9dqKeœð¾õBºvìÀÁ>{¢=¢-ÖSØyòʇãc¡o"eöQ ×=\ÙnkÒ€QxÖÇ´—dWZ š™ÑAÿƒá-ô”øb??Tjsq”†2SWjweÏžq.¡›qNµ@z‚¤¥N‹•Þbj³Üº'I‚Ï+ó¦saûøòÙ‡td´€—p~Z(Šæ òBzj­Ñ¢²´L’ãš7B*2><¤ž^"苞¦ÄàÆ¥îd²B·bcl%ûz|‹ª¨¢N¨•r‹HÔÛBùN.Ókk,â>ëÕ>«˜silÈÆ‹û TЬmP¼4×¢ïÛ‚\Z1yVS è ü“½$Ù&ý,iJKT\Vç6;¢O7ªdGš`oÒn\¢9çéréTQ¥nË­òÊ÷†’É–…«2œI¹¦Íá UÔÉæáÔM è5è–œÓÍÚ…_P§=ÞÖfW<.Ìw×&¸I8Û‡ÕÞm$Æ®þláÚ¤6äzn€uB--l[*ämm™Ü"ªG‚¨”ïI3FÑ£‰#ìMrf*VÀ£F4;>‰Í s6db2“ß´‚Éu†RRêtŸ¹'±;á·¡L"Lg!ððíÚb‡" NÓ[ÇÑËé¹ äÊá)õEöäûŸÖŠëÑÇAEÁ9—¹© ¹kÉØÖÅgYnl$…ˆÔ¹ŒÍ—:^¾‡Çm©—äS½Z›ô´ nJhÃf#JÎ2ljkA‰Ê^'Äê‘J¸*‘œ‰Ä¼¼%ÄÕä\€ÃˆƒÝ…ʧèø,{YêÌ]"\Y0ô9×Næ+Gž%’p§Ýu!*7Èû^ǽúÆ'J:{ú5“i£ œÅdÙMy7.æñ§²dþÒÓ}¬§ ½F Ø/Œµ}¾S<Þý±S#ê®­).Tør{apì;°OC×+¶V•9æÒœH’mU¯e$£àk(òŽºùpW<éÍ6 Fﹲˌ9§$/i1ÙŽjúìÅéŸN!в!lTÔ ¸g#*Àê´Èd½6ÝÏ]_A`6ÏXÆÏ~©w’­–u¦â]ííu†{¼\V^ÀòPèÝW•aŸÐ“¤ÁèdþŸD?WeK¯ší×:×ñaõ,¯¢k]ÊìÚ Œ0yžE~fÁE6K:òÑÔÝõ9 [™ÖÀîÌ~.•{ðØ…}_ow©piƒ¨&ñå¶™«Ð==ŠØ8Nï—l¸N¹tçL× +8¸å|Âë#%¹¸àG”gÁ’MŠ×Z¨öþi+Xñ`9ù¾ÍÁ$_%1ŒÞñ¢çíÞîjŠy±] ùð =ugH:Éц¤ÚjTã®øà£0Ön0·]DHuÊ~òT´ÓÃðíÉÂYDCó,ŠÍÛñ5¼oô<ÒÀg¯~’:øê÷¡³_î²ÊsË.¼®ù' i’ñÚÀ_Ê @†â¯išçgÁ¢Åjalµ¬þ;DBâñG,Oß+ œø7­Õ'TW4é>çÏ"áR‰ØBœäà툟Šé]Õ†$ס¼òÓJ ß0àS;Nð+¬¿íàÕ;ç2ÄH Ú§é<ϤÖ9¬wGÆ”ˆr†;sPì"õ¶òT;#»Åt gök@ðH{”º W®ìù–ÌâJ©1>žu:;Ûûú‰;røk5«éXOži‘O“»ÎÝ8# Jh£Îo­êˆµP·h7‡«Zò^ÌhJHÍ(µ * 6ïïT:é$Rà‘Õ i6R<ÆL5€vœaº3Ýz7IÉ('bFÜ¡1«ßï>Aòk¤Á˜iªzׇ±u>jkn.FÔÅ"RéÉÈ!fCîèîT )í« Á¥¦1òqŽzEg›Ë ‚ÊM&Á5Nœm öÇ"ç²ÔÝ =ÈOÅ„r¾kŽ6]¹óÊ•»y”^ òOMZ*@J”Ñ+äá¸?´†/‚§„IçE•“[q´6Ö[ö$ fP{s:9Kg$:´÷㓨/1™Æ½£¦Ö$IfêûJû—Pø“ŒØß0+,ú “ì× J%Å×ÿ¼À9 o\]ñv>¬óEÍ=¿ô¿í½ÑZÁÉÜö¾rìÝ‘¹h¹ì\ À¤²7j¾BÖsØ_íÞÆêƒÕÕ0,îU»_›G#ô¸Î2Âb’\|ÔnIs¨IŽøõ\{>1 "q(¨ ‹°t8½6†õÞgY/›ŒÎØbé° °d2Šä_ýAâœè<;$è.S„´%Ôt¸“ó"µËfè¤'3ü÷å>‘Ëokj(fò`Ñ5Zßã±ç·?nUŠ©„Ýü²ìuâÖ3\ÑA&ç¦[›…¹åÛp=÷Íûºr¥9ÝÅ,å¢(V$уX·ã:§}%Ÿ»ôÉ¡Òî’¶¾[ÑyûÿiDZaó>oÖ‘޼='²õø+É$\EН#а’«ÊI@Ö¨rG¹ÊÜ (dšü};ýg«çƒßÇžC´%¥6¥³æ{ žü¤NN?±YÛº.)ÒÓ“ÍÌ|´ ¢½…F×=y.§Ø3ž´¸¤ÞЦ1 #²k8B.7ñ+nªT˜P:IœþèÇ’t^¨GFòÓyßZÖû¤*"=ý°P-CNå]ÑMîH Ÿ³?€{ö{cÐ:tû†L9—K}êvá+¿D/Eaø9 rÙü=ô…¸Œñ¢£^G¾ÍY€¾€Cõ“$v!kY&^ä2QÆÆ î#ú8fí¡­ ‰’„›„ÚšŽ£´ZJÍ d“ìš ËS®}ÉrjÖ‹ï©ZæÎ^Ž£¨\µÝt(‹’`"ü­o%ˆy…*ªEv)A„#¸¯¨t³™mX¥Q3RDô¸Zvgk*&+š‡œ Hî\ÐW—ù)E½z¡`Ñß= ¬ô[ÖõJèÍJmU¥[ß⪠Ÿâù{fß$#´šqÊYùÅÑkpÌO_>¹ô?}!>öGœ¹W¿ÏL˳LT/úZ!ÃÖ§Šɹsi!cHº¿S] 9QX¿›±#¿3wº »ÝÃÂð±¬2Sy§ÛeÈ#QhÈκr%ñ~mhr4äǺ ÍP[–+ˆrÊܕޅȀæ$Ë5KjâkÆÚt °¶ÎncÏ3ƒj]?bÌ’9ôÞh‚DýI¢¡‘Y×Ë0sç±¹úÃC“ÐoO±}Bt/dõ\s•X6uz ~÷Ÿ(piÞ°]ͯ&H a*lJ¢7D*L‹§€|Š™¸òº^èSs‚ ?ꉆ¨><ßÓl±ÇõüŠ#à@æ`e¥@]0òÏìÜ÷aâ½¹eé×R´üÒ¾]@%›)^s£²»7àòIÉVßí”ø€j¬.<Ïd쟨“äf¼#;SªõtÕja -EZbö£ŽB&×…@5 ]á´‹¹Ì¥H³°û²Y"YË`$¯´ˆ¹q#ㆻ%¢YR—¶¨-›(¢D†ÉÂËz?-í §¯É^ü¾ã2¡8vÒ®‘Å«@Zh¾à=cfícºì¡ÐE‰bJc ÛWñ%GUÒ×»)X¸%ºù{Óq@!:Ÿp´ôÂnoÂW R>KÎû¯‰Ÿ§²¡¬[["c„ú½ÂŽç+ß>ÁÈOBÛ¹•äÔñ8ò®Ãdë»< Û¦N«0G…ÛtÔ; ê›U äÍ…ËUû×oc»ÕñòÞ IŒ/À7ÐÑ‹-0Òî~C/ÇG1ëX¡ª„Ö"-ÂT© ºZ±¢:^h¼ÙÕ(ÉŠöQÅö`˜± ̵\Ù–Áë§©·íéssê¬'·Ùªwg1Aì6yÌHHØï:5‰õuc´Ù''eîkk5ó)CÃ˹rÐþØÞÓª%XçEk¢@ü0óNy§·nÙñ`R×H4†'áº\³´”ÖŸKKîwöÏ+,²ÃÙô/FfÀŠ5O±òcÓþd<ÿŸ;zCŠ9·ÅƼ|K¹ Hhä{; ÏËý:¶y†¬BÁÏ`mP-áÿ›^uänZ1[ãÿD-fõÛþí'õϮ֋ØÈ3f0n}Edwü‚'—NãôQS7ðlC H Ñ”:OêG=ƒ(sëÛÌÉúà!ØŽ"ÞÅ[T‡ÇÔ¼ºh5‹¹xN;Ô`ü09(ͧ"2•9æ«ý,…ùæËkóï¦7ãÛ‚û…΀ëh©[óz ~zÇáõî^C^×!ËÉÐGå ‹ˆ"(ÉrñÇ/ìÕ SxÍfúž†âîòù·j(*©Û¯-Àû¡ƒ-·!Î*†·mß;&ÔÌb&¤Ýb®ø·$⇣êƒ"ó0+ÏÍ N‚]üb±idÄÔ¾ÈAQ˜tøj5å"m¹!fÄ{*Ïl\íÈ耂˜Ê—·QÈù*8;n«‹š( þ}ßyÁ4ÕĉÂû€1YqKɨkƒKk”“_G—â‰(¹óž2“šjêë+×nà ÞO¥©=/Ìw0ÊY†¡@“g†S £ä…ö„¸ÍTn#,ü Ç0³õ0øõ×öÞ;ô¼¹¼`¼;«;9ò{MÆFF V ›¹›eaÛøÕ ‡w#ilº»`[ùnµ¡¹hýàB%’@’hÙ=ø²aVÿñ1”3þdø¥"Ô4aÚ3¨Ël®uÎÄÒüþ–s§ ˜g=é:@Ç`LÆÁüd%j §PÏ®eZªq/)…Íaã©…e‡ù+;àak™æ¡ç¨èø¬Ò‘ÛëÁ#¡„ÙòËž@â¾wKDQê•RQ"4öeÁOeT‘ (鎪ö­|d&‰Ï”zdw:<çrlNAzÈUliAoù+϶üÎhxß>Ð,-Y¯yÝÞwù>(òc‡õ¶ –£æëÖ¨å€Ќ؊–¡UÛ3Ék0Ÿ1åJ@rS“j%3-ºßVlJÅ›AêöH{bÂÃuߟcJm·ùî£#Ó˜8€ÐXQW,òg‡ÊP–š¡ëPœt‹u#}mY†éaQÖöÀRE›”\¦zÓå{á­™´™cd0d°Xà˜¼“žÌœû;¼^O¨ë§‹-Ei–K‰ëra’“šŠ–²{iUh^ÚV›žêçͨ^´*ÝþFl|-érãÏËÎêïÌâbR÷ç§îo\ïÄmËXuåCG^áŽi 3éñÏ–Ð\C·0+ij¸í XXžH{9Qqö"jEhU VØÇÐÝL7kcÿc[ÎX)4¸…vVMZ-„V!59ŠÙDJçÁ°0-¬šI4sIoà7ïãV³†×>¥oPúÔ5”rÁ'hdY-™ÚoQ1ªe¦ÏdN@P¡kØ÷Ö]žuòÀG`âõtuNB°{3ˆ*›gR5—5bhdQßGp{žKÝWnÉ´tçWéå²^Ð+?Î[ížý…PÃÒöa€@¦•íÝGå¼rÁHÂýwE!ì|O±‘Þ™¤èz„åÙêìÓÇÕÞ$¹gfm¯&"&r+ìt™zz‡0´·SÙØc…PxSt)ZÔÛèD½cyz yæ“ì̼‡L>CÏŸTðMfµôïjJÍK–Û®ô³c­ ˉi¦ûÜÍckÐÔذaÑ0Óà‹iü=Þ¼ r>[_‡q\øŸ® VJÌ ›}Á¨–s×*Т{¿fJmb [ìA˜<†˜ÆGuIs$­h,Ì÷q²™a9(Ê6o!žoQË7ðñdû}œT5;˜¡Œ¨ò<ó°Á‚vMõ»9žÏ_¥@ÝL‘vÏ6ÇÄ‘ž¥ØÌb/3’¼» ÁšC)ÊêÈzeÑÍvÒújÜy³Ìó•Xw-öq‚EìK;Î+Áýªœ :ZÊ<ˆR(åuÁ_ǘòå©õ¬|˜ÆüKÃÞ?#ßßJ–™ –`Ë4&wdvÀ£üüöäEÏ^:é<ß&ÉÏ螊NδlïJ¦ïÂQªï·¿œW’QÂw|}Øa e²Œy; 99.`2Ô¢9ëƒJìï#ãmtÈÿ ŽjИ¼ÖÁÜÉE`Ixf&â†ÎÇRHúVo"|0JÖ­Ðëà[cIH®‚cUüÒé6ÇÝ!ÙæháÍžŠâ|qg ¤'r>‹öy±f©·ü Xù¬3¼¶cTê® `©EôA…¦’|J®U|št9° ¶¨º~Óª‰H6DÆ$dùßæ´Ð¢£Ízœøñþ-v>ÍÁs¾ ¯s…üùõFåŽ'ŸKEYH2 s-É“ ¦Ç„i®ÈΉ?žotûÓU£D#X¨­¸xŽàï…zG9³\RH!§Ñ¤ƒ&1Lœª ¿køÊF8ÒüH­(8æ¢fЭ¼ˆÂ‘GW[LµÌ•#Da/“}Ô3ë…ß~+=µãpÞ醭ÒKâí4 ÙUÞÐdôX¢ù4©µOÂIÌf¤€Y®Œ ¬ »EtYe€˜ô¢Ûk¬w{KL[ûùNIÄWE"ê -t¶$»ÊšµL•0ž2㋹Â"ÃøýoO €w ªlæ&§¾NÖáw 1›Ÿ¼Ek*ßò)|Š]dòek·-8x‘¼tŒØ¹¥Kf~‚xJƒÐŽþ}tµ¹†tÖB óL†Ê]͈ã[’ÊÒ"–ŽtÂk.©¬¶OLóµæÓOx¹uYË„Üc£=. ñª/˜Ñ͆ VJ§xœ8 úe{Ð>ñÛ1¹$0¹HX%xRP)Åò{ …aàéJSÕÿçÈ('Ð𴮊+o¼?¥›„‚Ьèÿ|õB   i“÷긋â&äÙ)Kcˆ œÛ”íÚÃ`2¯˜ ‘ð¹>ó‹=Ï«”©\'¯ˆŸIº³ë$·?¤÷ö¬sR»ÇõQ(òG&+É>ŠG•ÉHF|îfH7ëÉœ€W Cåm QdVMêR W /=åäÐNãûÖpﯞ•–Þçç$w»¸´Ýèƒè” ¨t0™wä~’‹õòY¯òg9]ßuu.…NµKJD'/±+4Êwcêó3ƒ£ƒ¯–;¾×yð22Ô†ëoÚ õî”þÚ ×È9KÁ&…†+ç9n}ιfyJ‘aÑ?_ý‘.W¿§ñ”h'ÍOæxôÀúÏÃeOçx ¨\NEÃÈìÁÌO’þ®j]Ï€éFÕ¹rλ¨i¤ û?ïë"Ù×Á™ÜW, å&kly(TåÏÇzÁ¶°(ñ_\ \(jâКA¤’mûG«ü ‡(ÐR6A¾®Os âÕù4—Kè;ß™ùåŽ;’]_”ùoè½·.äç\û:º­’X”Ë‚…Ÿ"àá[€hoÕ\¯€îÿÁ´6Ϙ‰È-¢Û†“Mõ¤Ÿ;Ah8Õ>uC›XtÙÆf£[àÖzÀXwòKy拌!þI5ÄË¥QÆ¿®8o—ü'¤dÉ”ç ÌwP௰CP~áÚ¾ŽIþퟧ]¼ù£Åuä¾ìMnrúYÃVm­ ôôEïºÉ_™^•Åý8a­Žˆq¶³A{h.Λ2H÷šÉÈóÑtW'—p9ï&+S‘×î JjÚÃ3ÖÛÈ£†çÅ¡Ò+½«þŠ÷-À­zx§‹Ð‹ê5)uWÔKˆž¯ŸD¯¹þ‡c 1fo˜œä‹wŸ™þ›£tø„t©bÁÒùܶw·!ž¹±p¦ß©]Úã1Ü߇„QÏ~Æz,D«ôú¶ˆµ‚©å±£BPÜÃÃ-R³q³åÙ¡åšÀóà…¸³vŒSy¡B¿-¥´r’žlïŸdt»ì*½º '~¢\¡’4îÝ©mX[iÿɸñ¾Ë¼J½(bº“"ùä ¨Á‰ëݶèaª•ËžóÅÐ|=¿á'åææ™*ù­W‰"ÑÁrý½Už¼¾ý8—¡¦þIßQ7þ(î\)=ĵš_mcÝMôªâóTÇžÏ÷ÿ›ŠìÐvôäÈ×âªF:] …:Ÿ—o1MÀůNÊõoÁ^)Â^:30¾ÜV¯åªQ\œk›G‚Ldw6TÕÖoº‡›ÁA#b j\E}IèÜxmóï…ÙY…`·?VOl…&‹Nˆ×¹Ègÿ×ïÈ›[zSVG?Õ÷ŒÕ´ÎŽ•nùÒáÅÉØ„o‘‡Ã~«ës¨—ÙF\ãÒ‹åo¾ÑWr·X Õ+ß¶þÜ=u‹³eä>Çs–?Ü®]Më )©Þ|ú¦s§¼˨eÙŠåSÌëéc§‡¬ øWh÷xÑsôØ‹‚_Šlu`jÙ‰b$–V³Üeù-ûN¦yÍI?e¯…zžß9Ë D1Ûh³l©µˆl©Å™ ½›5϶Lg\„Ô.[É;©HÃ{ˆeª!UqÄÝr¤°æ7 ³Ä¿»ÆçÎ ›³.ù=]óWÅ\”öSY•ÑŽU9Ïl/oPë"T|‹ª}6•sîSô ÷Ò š®2Í¢M‹œï¥zGŽ>Öß&'ÀG¨Åƒa™¬‘UÇB®öj$*Äj”Ø¢ç`]Í'ju5‰=_äã73›SÕî¾–V°ÓýÆ™T*HM­7¶úGĦ´¹ŒOUÊtatF¬ŠM­aäÕ>€ö±K,›^ŠŽû…Õƒl‘¿yêu‘á#E-Á‡ ÇÊ&5W90YÔJ>¤È7¢hyËÐBm–:% ½û{ÌŒ†£òä %ìOf³¦qJv9ùV wŒ™‡EªÍ9N5y(\Ý–õoMÙø°*õÒÓžAF̳ ˜PÈ‘6šGgž<á÷óX*ã‡ha\ÏÎSFÁ«3°œІ£¬$°Ý“?Íüfȵf[Ð.ªù?Îìú^Ë êYÍyqÄØ´8#TC(ÄNÔÜ&ý. ™b|Œ`ÎR°]ãFP~Þ·§"¢—¢©@Ú­‚\™nf˜8 CŠìTãÐ6°³iØæ¸D¹¡£Á.ŽÑ„áNtMXÈêR¼3dd¾k1;Âô`©î8ò îì H’b$]\¾íy?ÆÈâö_ÁE·Ë™^ðÃ7{²\ÎxŠÄ¦d€g´G³…:xb`v5AÁâú(úRÏ8ÆóÍYè+Bl»µ‡wßõÈÇÿ®Ìü´£Ï×¶ÜÍáØ‘mÞÔ\Œ8³î—l  ÿHb/âYQíä´VU‡] ¸È6"MûŽÑ´fJ0/Äú‹Û}_,;£‡R)I¨1xÐÔŒÓÖE|©O3Ñèê®y¹Åz}²¤f£ÄXV‡ž ï8ùÚô@Öï­[^ïSàdfvïÿy”‡Ó{—— 1òìlŸÎÆD×[Ø”¾½èChy¡>ÌŸ=xY+m¤D!©KêN«¾èxÈ])-e"ãéyŒ5ŸW1LíFØ ©Þ1PÆtÈx óIÞq äɲ(VˆÉÕ÷áuL–Ê|8i^”ž˜¾ÌNUµÞ•r’6Hò2C“¥¬]š ž”ç½ÑÏs5ÑánÝ}tuÓ댸O~ÄrAQ/.óѾT¿ÝZ˜ý8ÏÎa7cÐ݇d-akXÁÌ„à“¹ç Ó\¼ì ‰×Àdõš¿âÍøè¼[<•P({Ç–Á`fÔ@ 9šPÌnø0OÛ:ṇ½ÀÑŠ3Ÿ‰Ž™}ŨyŸf­}7'QéžÊIÓ^wЛ´:©„eRÒm ðpLƒ^´{ôÒ÷…u$ÿîÉ4©®ÞEš±z8Àæ ^R¼¤ Ys#Õ-ÊúÏ͖Ƨ%¯£Î„°¦‰$ @D âô©œ+ @QC~µ/‰Ä ÎQPqtÄê›6$áË1դŠӗã|û›Ÿ/ËŤÀù¯xj´« D‹ÒYVè3– X$ôõ&Þ{kî®j õ¦É-þì²zL½™‘TrpC´ûKÆBvÇÜøÕ*'æ—œÛYåüçÑœþO&lNÙ†y.WŸ‘7áJiJ%׺sÕÉJKw(ä°¡ÉE^GçF«}ʰè+ßoà …Ses-û©¯ÛôÛï‚«—%47¾Cl0Áªïôz¤ô™‰é§iç;Zé±$*\Ò°Ò[æƒNeªé2ƒ79…bÔ3{ÞŸ¹Û”:õÖ±|á'´$‘m•¬ÍUY êýÓ(ZmV%þÓ+Bͬ„Ñ”‰‰I ›ÛØòj6¥çA®#6Ü\ )Dì Q—Gòó¡É˜7^›Á£ŸëUK²†Tã €Ce³ße7‰R¯7מâ‚I>9*£¹8þºR”ÜnµG.òOf[D_í1uMË·6Nf»_%M‹õ:åóÏ7¿XGŒ_g߈€7ñëÆk*¶bU|$ ÑñgF^ëò â®f"O¸Ô Êmå¿g¼¹Îm ë´é5O åÊÁÚþT¶Ú+„V¢ ©Øš6_ÓVÎtê·~|ÅÆóÏÍ‹ìî` î[× ƒ¡m€ HçUð,¿´¯&zu¼+ÏÊB’Ä.™ùåP.—>à ˜Îü¸O¶lFl‡iµ‰ÇÙ7|L@4‰g²ž‘˜˜;!¡à¢‘~d×›â÷sÐæõ¹l©aPåd}i®˜íL¡¼ ìHML.A»04 ‚‰¶žfŠ—]>÷SÛ—Î( ݬ•o§>#ÞCEå-qyqmРе‡ b¶'vîê>hhË‹A*{ÆôK9‘D¥S\ ~°„îºÆ‘‹HÊY"gדV ‚мcM¤s¼_¤½/–žÆ+€i§w`¯w(î<ÎEò÷¤0âåm¬wEåMI­ùÌ7Åð‹ïŸæPˆ­èŠÕ$OKyòÏÔîäF=yÒ|Yê²Úªü’•©¾eâ\×ýA2ÖÝo&ÊÏ©±?ɺöy V+#z(`:>½»rÅ"žâ.4Ò«HDÀ¶^{ þÄáß6kœA¦úåT1È0+|0ýXÄPÅÈ"ƒÀ– ½'$ÍÜ¡šÕQ”e83ÚÒ -â3f…sj½÷¬’IlU¤Ä;îXòMV+V±Oô }?iéczRiØÅ2½¾„‘Ât÷–¦™0æ©—… =H¦²RÙ*Uë¦ðpÖªÒöÄs–H†S@9.™`{Ú½´?^d‡I'J %Æ ?V³ï”õ4šI¼œ¾Z¹š#v8Î|pÁd\I©¯”Šv¸èlqÙŽÈÐþ¡ëwÒÓÀQ:„rc]$mwC Z/-œÊc‹Rl>»ŠF+ÓîÌ´‰ÒltÊ6“ :ÓtAä$pªNDXÑ"Äa«åHƒ„ˆöL£K H.ˆ¾d dSé>óUгŒõ—³ÔÆ…A¸F848±Î¥å1Ý£vœ7†d_)lÞ|sݸ4$—7”KHK 'Œ/ÍSàFé ..ð4Ê=-Eì|3 ‹j¹8j¹RqÖ‹ˆn)_ÑK _>±t™ÆTÖ"þàcQÍuv“O&pn¶¸WIä¼Iž¦œ®Q,Œ‘D¨½&™°\lçŽ VÎÄýì uÅõÚ-B³¥€«ë2rXgW7\8…Os"mBøöN2Qž¨(AÍ¡¸Æ%_>IÖ=jJ´yÅC³<%wß( zT¬>§ç&Š%Ô‹ô(1q¢T]öh4ŒkÐ5É—BORî¥=¨Ì¤hÎ-XyGS‡¦ôÀ–i’qÝEéQK¡h,é›8"êö7K‡šõ“wü¿5O{ŠI·ª¹¦R߹ߧk Y‘P&ÜMÜ@ g´fÐÿ²©Íæ~x`l5e aEY}Sh:ã²»MÚr!ÊUy óøƒƒM ~Ï ;–@ÀC^¸Á¤ºN4ç’dåûZ9‹Qê©)y0%–#tL5C sI@óí[“/¢ÛŒàTv­Á9OGœÑÙ€¦ª6Ùngµ§*CƒqU+]Ÿ(iÌWÍL­‡é¡Ä¥;ðÂNvfº¥L¢Öf¥âiÌᬠ_–ùhÈ/9¼=¦ÿã¢<)¼%ê<Õ ‹dXb»ï͉ß}¬Tß{1ä©dmEÚ»¬EȧЀÍ[ÖóusN>V`*޽䵼†Cu%¬22¸äZÇL­ ðˆfµhsΦZ‰ÀK ”+<ÌQ]ÕVm®Bße‚GIÍ=&òÔ’ ŒŸ–‘ùðPnxGaÊVøËGÂÂä"ÚÏávµï¬Ù¿Àל¶7+ñÎð¹ÝGÛý2ÚP•Ú†ój9õñì¾b^ÜHû4܇—nHÛD³æŒ·]7åÒ8  MõbÉ<ÏÀéÉÛ ¹mß ª‰Gûê”ÕHfÎðÊcŠŠùïú”ǽÿ9<â¿<µ”#Á«Ò$~i‡ª¶÷ì÷ÇÑ'–QP=s6÷ñôÝNhÀNŸ)«ü¦â\–¯ײnf^Pøz TuRÓ'ç(”g”òK ‚ð¸îÉ©|*“Ö(ÍòEc\,ÙéH=H;ð¨üð—éWôp\×¢Xµ°ŸE•U^>ÆN\lrê-~Çç®LÓŠ‚ ØÅÀÙq ¨ä¥bL–}œ”PS¦Ei¤i7³Æâ*[ŸK—ÛR×ÁÉ6Ó#ïnXzQÉ“vŸ UÌŠ~<ˆ-áã0K·È È`K†PãCrVÉm1”"‘(12¿«Áïjç(“‡#•“,ðöy¿§uíªªSgZ׫4×JJeÚ ïƒò¸Þ±¦ ˜¢ðìBïVoL‚•A¾8ÀÉiôhþ©˜;±êa”t|_Õ+³:6ZûUK:ìf‹YÚíwì €ÿ2™Lä$ÜÑÙ 'ûƒzÿ¹5›—øe!qð‘z/ƧHNùkšcö Ó/ hLÝ®4±‹)M$6àé `ŠR“-c %„U»#Ô Ì&'OV¶µ=°Å$¢D»P°ª[uÊ«€6j'¢B•A쑱ÍÔ÷¨ zã.`(Qµûйó†Ûaœ‚ z_~B·Þh‰«?.Z, 3õZ¹ûz¨ (D˜Áü]óT&¦ókñ–¤ã#õRŸªW¼¾½UTŸÅôÆÏ@ÙŠ`ÄGߦF==ô SGÔ=em+øjªò2ÇZù¤«Ö‚`-ªê\ƒ¬“%2»D&ùö x°¡é.¥óÚC$ÿPn :œ… £²ÙŒ­$ÓkÛ­–y hGR€û Ã3ÅÇ«ÍÌihzÎÉB—T2Å%lKçÒĵâ]¦ZØž¥ÉcUÍHŒº<ùEQFÈ—‘„Z¯†•!a•òÓŸª|ªä,¸(ÿ™æè»’”Êl@1†ÇS]C”3CJ†"ãîʆ¬› 0¤›¼ªµ×¸ŒvYªÒ}ÞäÍσçnœ§–@9p.PÓƒø`DGl˜ÞŠå¯Ÿl•Ï ÒÊÏÃ;ÑZ:­õîê…„šQÆD±g¬³,ú90uˆÝ=ŠÂ/:MåÿùaW/ÀoaŸÓ¸úÞ72¶EbCÓDªú›ož¦ää`++â% Œ@ tº;ðjx÷cݸ¶¤ŠåüǨSNˆŸ(MG>Dín »Ï•ëßbNõ£ÈlH÷¡Dvoß3£‡Z`*b7ß¡\šÕÝ3ng¢ŠÙï¼D|gKÒ¼‹¸£¥vé+ÊÇ?£ðÆmºÙã\ í0 Y©pÒ x!:æ†[äsäÇDZrÏ{'ÃqU3TMàd®”ÆT:mÿY†Ù–*ð¡Œ.Â;SµDž„ ¦ øD•äl…¯s&H"âªð*Fˆem*DÒßL-¨7¤²kò(u°CŸb¼—ËkéõášÞâ¥wäÖ‚Ç­ºkB8G˜GÿsºØN‘¸y ò„VÏÛ7…Ašúüz/ÖZp(&jeO¶˜ÇžMé· ]}z3uCž#¨o‹€Z­âVý³^[«í.ë×JÛJmÀÛ

‘h4:}YK"3# $ u(7A¬AAì!1X-mL37:’K}þä9@(,ÿù›.•²*+´!+²!* +³!$ +°/´+³+´+° /°3´++°//°Ö´+² +³@ +³@ +² +³@ +±0+±°9±!±99°°9±±99° °90176325.'#5!!&'#.#"32632#".&Z€<; I3 ¢þQàEG2$i!HG‰U² Bn0 PiW´Ö0W AA#W < È@5–*P7 3-"Nÿú‘*…° /´+² +³ +°/´"+³+´+°'/°3´(++°+/°Ö°$2´+°2² +³@* +² +³@' +³ +±,+±±99±"±9901#".4232654&#"#"543232765!5! 69x$2/6•f(»H@;mZ*LM?l"€)þ —@Mq.?e(>% .5?=>8B5/ÌAAÿúŠ"² +°/´++°/´+°/± 33´++°#/°Ö°2´+° Ö´+°2² +³@ +°± +±22´ +² +³@ +±$+°6º=üð+ °.°À±ù°!À°³+°!³!+³!+³!+³ !+² Š Š#9²!9° 9°9°9·! ........·! ........°@± ±99±° 9017>54'#5!##5#"!5275!0% `ˆAXeb !²JhþÔ >Ñ,±(,>AAýÀŽ=ïG!.¬þR=…,Qÿø¥"œ²+´+² +³ +°/° 3´+² +³@ +° /° 3´ ++°#/° Ö´+°2²  +³@ +°±+´+² +³@ +² +³@ +±$+± °9°±99±°9014632!5!5!#!32632#".5#"[+#þ­‡þžSi(~ )Z5Id6H>5RJÛAAþåoz0 .+*QdEÿöˆв +°/´++°/± 33´++°/°Ö´+² +³@ +°° Ö´+°± +°2´ +² +³@ +±+±°9± ±99±° 9°°9017>54'#5!##5#"3270 g’Œ@Y_b >YEhèBŒ-+2AAýÀ¤=Ù3.5fKQ<\ÿôÿþƒ)¤²+°#3°/´+°2°/°3´++°*/° Ö´+² +³@ +²  +³@  +°±+´+°±'+´+²' +³@ +²' +³@'# +±++±°9°'°9°°9±± 99°°901".54675!5!!5>54&&Ay!3%,.‰PþïþÃRˆ  3 wm]H1=A.B/[—AA—Y+" A=1H]ÿ÷š#t² +°/´+°/° 3´++°2°$/°Ö´!+²! +³@ +°!± +°2´ +² +³@ +±%+± !±99±´!$901732>73##5#".54654&+532vOW75Í@Lb(X@)L%*-óH AýÀ°E(( Ë '7!5!5!#!">3274#"26wE–l1þ#¥‰þÏB2% *)A$?Ta!W+ZQ>90MO%;tAAµ>&!1 &G8;I‚B1)+*ÿ÷}!*d²+°/´"++°'/´+°/±33´++°+/°Ö± %22´+² +³@ +±,+±'"± 99°°9°°901!#5#".'>7.'#5!#!352675#÷Az&Q^ %5!I††þŠ?>§§0m ²9_Vv3E32/ (1AA?S-¿þ.;oJÿ÷z.8¹²+´ +² +³  +°/´2++°7/´+°"/°%3´#++°9/°Ö´/+°/±+´,+°,°& Ö´!+°!/´&+²&! +³@&% +²!& +³@!" +±:+±/±99°µ(5$9± ±,99±72³($901!".543232>54'#".54>3265!5!#3267&#"*pP6`A(; -hi); $K4^HKþ-ƒp^yþì!)1I,=Ij+!1'=*a-'+,JPaAAƒ]:!WqO!&(<ÿù¡‡²+°/´+² +³@ +° /°3´ ++°2°/°Ö´ +² +³@ +³@ +° ±+°2´+² +³@ +±+± °9±°9± ± 990174>54&+532!3##!#"+"[giÊŠ@þé&)5YD?o?WEAÏB)AýÀƒvÿúí"—² +°/´+° /´+°/±!33´++°#/°Ö´+² +³@ +°±+´ +° ± +° 2´+² +³@ +±$+±±"99°±99± ±99±°9014'#5!####"&'76732=35!f `ó‡?•''D˜'@9g+5Öþsä RAAýÀi$5 m*O|Lq“#K_Žãÿúÿÿxp²+´+°/´++° /° 3´ ++°/°Ö´+² +³@ +°±+°2´+² +³@ +±+±°9±°901".54;5!5!#'26=#"t;‘e‚íþH~…K7$æLZ]i—=l˜AAþeYM?0&Ó(=bbÿöÿü³€&*޲+°&3´+°2°/±(33´++°+/°Ö´ +²  +³@  +² +³@ +° ±+´#+²# +³@# +²# +³@& +±,+± µ ()$9±´#'*$901%2654&##'"3"&5467'#5!##!©BZS>]\?T%/! \}iIN‘½“MGj|_Q|ÿ{:[AGY««^B%; >}][p ’AA’ qZX‚EÿÿÿëÿóÞ 15²+°13´+° 2²+´ +°&/±)333´'++°6/°!Ö´+²! +³@ +²! +³@!& +³!+±é°/±é°±+´.+². +³@.) +². +³@1 +±7+±!± 99±µ$%*+34$9±±99±& ·!.2$9017#"&546322654&##'"3"&5467'#5!##!R3‚BZT>\\?T%/! \~jHMºæ“NHj|_Q{ÿ|*!& [AFZ««^B%; >~\Zq ’AA’ sYX‚Dÿÿÿùÿý‚+¥²+´+°/´+° /´+°/°3´++°,/°'Ö´ +² ' +³@  +²' +³@' +° ±+´+² +³@ +±-+± ³$$9°±99±°9°²!"999°°$9° °'901!5!5!#!"3!#327#".'.54>­ þ?‰‰þ¼$'+Nú +6%8 ;*)H/"+)=ÈxAA·.0@.= 1*?5 4% #)ÿùª%²² +°# Ö´+°/´++² +³@ +°/± 33´++°&/°Ö´+² +³@ +°±+´ :+° ± +°2´ +² +³@ +±'+±²999± ±#99±#±99°°9°°9°°90174>4'#5!##!#"&!54632#"&3/.$s±‰Aþñ  )z$Ú!Z]wpˆAAýÀ“Etvêþ!ÿùª†² +°/´++² +³@ +°/± 33´++°/°Ö´+² +³@ +°± +°2´ +² +³@ +±+±²999± °9°°9°°90174>4'#5!##!#"&!53/.$s±‰Aþñ  )z$Z]wpˆAAýÀ“Etvêÿöt x²+´+°/´+° /° 3´ ++°!/°Ö´+² +³@ +°±+´+² +³@ +² +³@ +±"+±°9±°901325!5!##".54>;#"v!6U.]þI~ˆ01;…^ 7$1(LDG3` AAþc.D"L„F #*@ÿ]ÿdÿÇÿÎ *°/´+´+° /° Ö´0+´0+012#"&54}&2%ÿóú5D°/°3´++² +³@ +°/°Ö´+² +³@ +² +³@ +± +017##5!#—@dBžúFAAÿûè¥j² +° /°3´++°2°/°/´+°/° Ö°2´ +°2² +³@  +² +³@ +° ±+´+±+± °901.#"3###5354632©98G4œœ@}}kc43 âL:_ˆAýÀ@A:ƒg*P6ÿ"B„j² +° /°3´ ++°2°/°/´+°/°Ö´+°± +° 2´+°2² +³@ +²  +³@ +±+± °90123###534&#"#46;^p¯¯@\\<@78@P„ah:AýÀ@AuQ+:F\ýúÿfÿhÿϰ /´++°/± ² 999010#"'5327˜  Y_cUX^r (A('ýúþíÿhÿÊ8°/´+° /´++°/±±99° ±99°² 999010#"'5327#".'5327˜  Y_cUX^iY$G%cUX^w (A('µ' A('þ ‹ÿz¡"°/±é² +³ +°/±°9012#".'&#"54þ7=}!h&=!4Z(¡J&x)$*3!#'ýßÿ|Õ(,°/´+°'/´++°)/±°9±'°9014632.#"&5432.#"þ7Éýê+#4hL=Š]j&%T*)%(")("2;#M¡ü_¬:T\HP &  @2 þ!¦ÿm«A° /´+²  +³  +² +³@ +°/°Ö´+°±+±° 901".1&#"#".5432“  -U $) †1+½+/-#4 9ýÏÇÿ‰Õ)W° /´+²  +³@  +° °' Ö´+²' +³@ +°*/° Ö´+² +³@ +² +³@  +01#".54&#"&547232632#"'67&#"þÅ2] $I/a3E& C!+2+ 5/)?4&5$&K,þ®þãÿÅÿÌ °/´+° /°Ö´ +0153&þ® #?1&#il8# 10 ±þ®þãÿÅÿÌ °/´+° /° Ö´+01#.'7; #?1&#iå8# 10 ±ÿó‹ $.¼²+°( Ö´-+°/´++°/´+°/°3´++°2°//° Ö´+²  +³@  +³% +±*é°*/±%é°±+±22´+² +³@ +±0+± *³"(-$9°%°9°°9°±99±°9°°"9±° 901%2675!4.'#532!53##5#"&'76#"546323%\þè*q  ik0' ɈAY"=˜" !32Ê š/^) A[\·AýÀ®33X[þ¨0ÿúÿô  !*ž²+°3´%+²+´ +°)/´+°/±33´++°+/°Ö°2±é°± +´"+°"±'+°2´+°±+´+² +³@ +±,+±'"°9±%±99±) ± "99017#"&54632746;5!5!####".73275#"_\Hvþ‰@…ƒ7!5!#’<^TA8,h32#"&547#".7"32>54 0W8eh  8M5w-I+ ÝFW#4)29'ö,3%e]'Ü)E8/³aRb?(0$‚?2. ,p+ž#e°/´+°/´+² +³" +°$/°Ö°2´ +° ±+´+±%+± ³$9±±99°±9901463 #"./&543232>54#"#"ŒiþõŸ C^!†>;h2!^H*l‹{\¶%t¼4;7[5~H2=DJP1+2)[-3?YI.,t9 $ !*))ÿÿ’+5IJ+´4++°//´+°*/°3´)+° 2°6/°'Ö´+²' +³@* +°'° Ö´2+°±+´ +² +³@ +°°, Ö´+±7+±°%9°2°!9°,µ"#$9±±99±/4²999°²!#999°*³ %'$90132654'5".54>4.5474&#"32SZ]`Uj«"+GGJGG,!©jUNPQNŸžÙ5ZX7Z@"“%? ! 5%.C!!C.#3 "@%“"@þm<..<`òk² +°/´+°/´++°2°/°Ö´+² +³@ +³@ +°± +°2´ +±+± ±99±³ $9013273#5#".54654&+532¨*$WOMe@@Lc7nCL%*=/<ä(‘8HFý°E&9Æ'5&'&54632&54632#"&#"yH; ]#<`VJ9pÉ1!éAO5mY%47CHK @ -(/(þ"=$7@0 G/V" ^F#7" q BO D DB )$< G˜,K²+°/´+² +³( +°-/°Ö´+² +³ +³* +±.+±±99012#"54?>54&#"#"546Qi *"9(E*&u8:Fh–K*kJ66  ,‹—z_!;4,*!$"4-^GN-C`+" 3=YX‚"o²+´+° /° 3´+² +³@ +°#/°Ö´ +°2²  +³@  +² +³@ +±$+± °9±°9° °9°°9014632!!32632#".547#"V*³þM-IS%/k4dmQ4@ü2TG@"6`jK1 #=]œc j7¦²/+´(+°#/°53´+²# +³@ +°/´+² +³ +°8/°5Ö´#+°2²5# +³@5 +°#± +´+² +³@ +³ +±9+±#5°9± °9±(/°-9±#±99°± 99014632!&'.54632#"&#"#!32632#".5#"V* @KG @ !-.#`þÎ#K‰_%/kc’R1@ü2TG%) 0H (*7 ZxB #>^‰wHþÑÃÿè£Z°/°3°/´+°/°Ö´+² +³ +°± +´+²  +³  +± ± 99±±99012#"54654&"#"&546¤BJ0=R= 1M£B5 IC!.1#?I 5BþœÃÿàB²+´ +²  +³@  +°2°/°Ö´+°±+´+±°901#"&532>7 YHIY 8J7 UilR$1 4ÿö§!&•²+´+² +³ +° /´$+°/±"33´++°'/°Ö´"+²" +³@ +°"±%+´ +°2² % +³@  +±(+±"°9°%²999° ±99± °9°$°901767&'#5!##"32>2#"&35.’wZ±ˆg75F;8«L$>! a0nÖD-{©»VZgnAAó . e# 'boÑœ³ÿùã)/;·²!+´9+°7/°33´++°(/±*33´)++±22°/´+°323##"&/47#532674&##326@sf*cbLEt'L4ަOzŒy29Z,kaA±6FLt#9A#-SP0!4DE"AZn"Dk65 в†$AAÒQþb7[î5 ÿÉîØNfrxƒ|²:+´‚++°}/°3´u+°[ Ö´g+²[g +³@[T +°E/±)s33´F++°'2³nFE+´a+°/´J+³ J+´+² +³  +°„/°^Ö´p+°p±W+´O+°O°d Ö´l+°l/´d+°O±B+°G2´s+°'2²Bs +³@BE +°B´t+°s±z+´7+²7z +³@7) +°7° Ö±…+±Wp³[agn$9°l°Y9±Bd±RT99°s±@H99±ztµ:J5$9°7³02Lx$9°±/99±}‚²O7W999±u[°59°g±2Y99°E´1^dlp$9±aF±&99°³L$9012#".#"#.#"!# #".'&5#53>32>#"&547#"&54632'2>54#"%3>74.##32È>sI, %4\;@z  #N80$ )  !fTBhC1// {yM"‚ý ) +\FMOdhihWÇ,4$†„@²t‰u4.?,^>+ ,;:) $($A! "! EkI]+:iNƒ>: AŠ™]ELü÷w7 AMD$&  É t}Hh Hÿó£M N²+´C+°/´ 7+°/°Ö´+°± +´+±+± ± 99±±9901%#"&546324&#"326£`MKceIHeI9+);:*+9 LacJGfdI)<<)*::M )°/´(+°"/´+°/´+°/´ +°*/°Ö°2´%+°2°%± +°2´+°2±++±%±99° ± 99°±99±(°9°"°9°°9±±9901#"&546324&"326"&54624&#"326+):;()8= =8R::R$§)89():9*"÷P:;'(:bXÿòP-;HZ;²+² +±,33±Xé² +´F++°L/´M+°@/´++°&/± 33´17+±5922°[/°.Ö´)+°)±#+´U+°U±Q+´1+²Q +³@QM +°Q°I Ö´1+°±+´1+°±+´C+°C±<+´+±\+±#)±+,99±QU´ 13%X$9°I°9°±599±°79±99°² Q999°&±7S99°1°3901%#"&4632&#"#4&##"&547#"&546326326324'&#"326!4+532654'326PkZVloU@kG\QiY+K"1cEdyx`p4„µ|J)+K¡92ž€´H&78FH96@ýSj))*8WLB$<âeŠy´ƒKPDþ­QLI L"T F*AS•n’^‰cŽF4]¬}µSSÇœ@=X;=XVM=-(:(D–Lj.Yÿò.LXkz² +²0+±;33´i7+°W2²+°/´++°\/´]+°Q/´+°5/±$33´@7+±DH22°l/°=Ö´8+°8±3+´f+°f±`+´'<+²`' +³@`\ +°'°- Ö´Y1+°Y/´-1+°'± +´1+°±+´T+°T±M+´+°± +´+±m+±38±:;99±`f´0@B5i$9°Y°*9°'±$D99± °F9±T±H99°M´$9°±J99±°9°0°9±i °:9°\µ MT-$9°]µ*3=8f$9°Q²'O999°°`9°5²FJc999°@°B901%#"'732654&'#"&5463&#"#4&##"&547"&546326326324'&#"32%4춮&'326ò¨†NH8?g‡NA][V\u^6YIZQcX!&%$/_FjvupŽs4„³{P**H—C=ˆ¤Iq‚ý$GV82qýgLGBG+&:YMA$aK:LS.=3$3 ƒGKk.Wÿ'Õ-:Fñ²+´++²+° /´ 7+°./´D7+°>/´(++°"/°3´47+°82²"4 +³@" +°G/°1Ö±Aé°A° Ö´&+°/´&+°A±;+´+&+°+±+±é°±+±é±H+±A°%9±;µ(.>D$9°+±"499±°69°²8999°± 99± °9±>D´+1%$9±"(°6901#!"3!!"&463!2654&#"#54&#">32#"&546326324&#"326Õ®zþf%74&¹ýaWFŠBq{Œxm?‡LTdXEYVA*D 9= E,?TYESfd1'%23$'1þi/'&34J1”þàþé0][8TV‡z4M((M5z}^`x]FC\1#¶¶%/^CF[~"&00$%84'&00$%86þlhhn .Yÿö#./8CѲ+²#+°3´A7+°72°3/°;3±é°2°/°3±)é°-2°D/°&Ö±>é°>±9+´ <+° ±+´&+°±+´6<+°6±1+±é±E+±>&±99°9²)#999° °9±°+9±6°9°1²-999°± 99±3A´& $9°± 99°°+901%#"&4632.#"#4&#">32#"&546326324&#"2%4&"326#jaIjaH,P [@ROR@[ P,I`dO`j …@B†{£`?)(;9Týþ:R>=*+8ékˆa˜k* X|H=þ¡_=H|X *kLN_ˆk‡¾RRÁöT>@R:c*??)*:8Yÿ#³/4;î²+±$633´-++°2²+´+°/°3±9é°/´)++°2°/´3C+°5#"33#"&'#5654&"&5462354>3 5#326³‰5;3Ñ325#326Ï¢*a:1 (Cw^Rt4«OX@úLY8:VX3j€WV‚G—i€Ÿ, Lþ¢ N*º Sm3FQ^-SYc›_F3þSBcÞ/"X7PL8a 5:|TuvSF%Fv¼u‚v5d6”@0ÿÿYÿ#n/&Ä»VÿóÊ/-9À² +°3´7++°2°/±é°° Ö´1+°/±&é°:/°#Ö±4é´&+°4±.+´&+°± +°2´&+°*2² +³@  +°2±;+±4°9°.± 99°°9° ±&99°°,9±7µ#.4$9±1±,99±±*9901%#"'53254&+532654#"632#"&546324&#"326ÊSD'%$U0$?8$5Òo(DGW_IWY»¨JvNFIþ•1()13*'/ƒBN IQ&8O'!hkb0]JIdŒf¢¨"S>RT-=9+-@=ÿÿVÿó«/'½±“ÿÿVÿó·/'Ìã“Yÿòº.&/6A¯²+±33´?++±522°:/± 133´C+±#'22°+/´7+°B/°Ö´<+°<±8+°2´3&+°.2°3±0+°'2´1+°"2°± +´1+±C+±8<±?99°3°9°0±99± ±99±:?³$901%#"'53254+#"'#"&546;5463232%54&#"5#32%'5#"326ºVP"as+Äv&`HPfK8rYRm6PhþÁD34BííxuþË'{/(!.¨Tb Jn^øQQcNJ_XrvTYY6NP7]·^X_-@9WÿóŽ- +·²+´++²+´)++² +³@ +´ $ +´ 7+°/´7+°,/°Ö±&é´ &+°&±!+´+°±+±é² +³@ +°±+´1+±-+±!&± 99°±99±°9±)°9°$¶ !&$901)5654&#"632#"&54632334&"326ŽþvYt`\ŠUGWWF]c¬ˆ¥>ËPýÞ3P23')2:9‡f‡ˆ\GcJIa„i½²„w?ßþ}*<=+)<<YÿóŽ2!{²+°3±é°/´C+°"/°Ö´1+°±+´ &+° ±+´+±#+±²999± ²999±°9°µ $9°°901'654&#"#"&547325'4632ޤ4Ž\M{y^l„¥2‡YJ…qYs¾V3?¬YzÄP`}£vÔR2B§V„¹^\}¥Y?.%.ز+´"++²" +³@"$ +´$ +°&3´++° 2°´+° /°*3´7+°2°//°Ö´ +° ±+´+² +³@ +°±+°2±"é°-2°"±&+´ <+° ±#+´&+±0+± ² 999°°9±&"±99±"°9±° 9° ³ $901)5#5654&"&5463235462!!354&#"?ý)õLWtVI!m€WV€’ÚŒþ]3OþÏYLN]º($\8LJ8R"<6zTvvTG"Of~}gyßþÛ9OcbP9Wÿóê-:Dî²+°3²+°)3´7+°B2°´C+°/´7+°°# Ö´>++°/°3´/C+°32°E/°,Ö±@é´!+°@±;+´&<+°&±+´1+°± +°2´&+°62² +³@  +±F+±;@±#)99°&±/99±°19° ³39$9±µ &,;@$9°>°!9°°99±#²1699901%#"'532654+53254&#"'4&#"632#"&546326324&"26êhJ;6U-=oYWqU:GhP^>Zw^I[dLW^œ„xHB‘Y‡."Pý1R45L6“GYI2+YGP-0>8þ’m4B‚_F]IKei޶NNXK)A _,<;*(><Za ‚²+´++°2² +³@ +´  +±é°/°Ö´ +° ±+´&+² +³@ +°±+´1+±+± °9°±99°°9± ±9901)5!2654&#"&'463233aüùG0KD./D NsNLm8âPCH.-@A.Mlk˜*ÝZÿò-6Bö²+´++°.2²+±@é²+´+°/´)7+³;)+´ ++° /´47+°C/°&Ö´!+°!±+´,+², +³@ +°,±1+´+²1 +³@ +°±+´>+°>±7+´+±D+±!&°$9°±#)99°,°.9±1°/9±7>´  4 $9±@ $&,17=>$9°;°99± )° 901%#"&54632&#"!5!2654&#"&546323&546324'&#"326r]Pko]=lc…F $ýG0MD01FL sNKk6ž.²~´J!<7J@78KågŒUa}I…c‚9 2CH./BC0MlhOQ%Fz}­ÄŸ?>XvUUWÿòI-5>GN²+°3´M++°<2°I/´ ++°&/´F+°B/´ +°/°3´+7+°/2°O/°(Ö´D+° Ö´K+°D±?+´#+°#±+´1+°±+´2&+°2°2´6+°6/±P+±KD°&9°?´ %BF$9°#³+M$9°° 9°°-9°·/8:=H$9±26°49±IM´ 6:$9° ±4899°F±99°B³(2#$9° °9°°-901%#"&'#"&54;27654&#"#54#"632"&546326324#"264&"32#"32IR:0K MºfjøÛP6?@5sP“].7DbEya~7.|Va=?GEG*:(þ 0!89.£æÀ|:P3&Y4A…"E5Amuos$ ?01BI;YdLLkXQ0*C>>))$#;@3Yÿò/CMî²+²$333´4C+±=K22²4 +³@48 +°/°3´)7+±-B22°N/°&Ö´!&+°!±+´H&+°H±D+±é°± +´1&+°1±7+´:1+°:±?+´&+±O+±!±#$99°H°9°D´)+$9°±-99±71°9°:°9°?²AB999±4°#9°@ !&0?DFH$9°)±+A9901#"'#"&=4&#"#"&547&#"&54632632326533254'74'326xjW0M,_‹qM!-HnLQhz #Phj2„¢|;11^h“YD-4P3*~3–üAbj73/3 x K -rXqLl 'EW–^™` ‰ZO2\¼~¦&&|awDZR8^þ¢4VÍ­G2[ôz[MˆBghWÿò>-;EP²+²+±+33´C++°N2°I/´%++° /±33´17+±5922°Q/°.Ö±Lé°L±F+´(1+°(±+±é°±+´@&+°@±<+´ <+° ±+´&+±R+±L.±"#99°F±%+99°(± 199±°39±@±599°<³ 7$9° ±999°±99±C°9°I· (.<@#$9°%°9° ³ 3>$9°1°7901'654&#"#"&547&#"#4&#"632#"&546326326324'326%4&#"326>‹.l€W"!/KkXZez(?XZf?Uv_HZ`KVdž‚‡FB8@CVv¡þÀpt<84<ýn3*+45*)4 ½[.K˜Z‰ &ŽFcŠƒc›cA8þp5D‰ZF^HKef‹¹NN&&«¢rcRƒDeg,;:X<<YÿòM.!z²+´7+°/±é°/´7+°"/°Ö°2´1+°± +´1+°2±#+±°9° µ$9°°9±²999±²99901%#"'732654+"&54632&#";2M‰g«Y1BB`ybXq‰hªY1DŽA_yhVlžTX]5J31IOLUW]5J31NLYÿóš.P²+±é° /´7+°/°Ö´+°± +´+±+± ²999± ³$901#"&4624&#"326š«wv©¨îaYX}~WX€‡ì¨¨ì§þãX}}XW}}Wÿð 40œ²+±33± é°)2°/´7+°1/°Ö´+°± +´<+°±#+±&é°&±,+´&+±2+± ²999±#°9°&°9°,²./999± °9°¶ ,$9°²$%.99901#"'#"&=4&#"&546323265332654'7 ˆow:9qhƒI>M\„*¡‚nfsNE9KTU9KY}(£y¤XX€dhDc„[›D8WÂ|©“rUFQN;^þ¢7RyW¥G;WYÿò4.7CÙ²+±33´)7+° 2°//´A7+°/°;3´7+°52°D/°Ö´+°± +´+°±#+´&1+°&±2+´>&+°>±8+±é±E+± ²999±#°9°&°9±>2°9°8²)/5999°±+,99±)°9°/±99°A² 999°²,2999°±$%9901#"'#"&54'&#"&54632326533267#"&546324&#"3264¡‘F?hgp bLS#¡zs‡)K=8LPoGYi J)EZbKZg`;()44'*;:‰¿RQzjŠ%a‚^–D:VÀƒ¢t:¬@WX:Qþ;H‚b,dHKcŒ )<9+*?=Wÿò..2>ײ+° 3²#+°3´<7+°6/´++°/±33´(7+±,022°?/°%Ö±9é°9±3+´ &+° ±+±é°± +´ 1+° ±+´&+±@+±9%±99°3±#99° ±(99±°*9° °,9° °.9°²0999±<°9°6² %999°±99°±*.9901'654&#"#4&#"#4#"632#"546326326324&#"326.¢'|^RnPK>=HU¦TrY]Hµ£…xB;xo?3lo†ü61)*34()2ÍW=C¦[s‡þ¡_?IJ>þ¡_‡ŠYF`FKf÷‹ºMMKK ð,=:,+=:Wÿòº-(3©²+±33´1++°/°3´"7+°&2°4/°Ö´&+°±+´/&+°/±)+± é° ±+´&+±5+±±99°/±"99°)³ $$9° ±&99°±99±1±99°¶ ,$9°"°$901'654&#"#"&547&#"&546326324&'326ºŒ.mX$0CrQZiy#(Yyp1‹µ…M36[w¡þ¿A.1Du4; »]/L–Z‰ %“MY‹c¡a †]—L.[½¤**ª¬Cz !xD `W7. ^²+´++° 2² +³@ +°/´ 7+°/°Ö´1+°±+´1+°± +´1+±+± ° 901)33546324&#"7ý Q«ŽceŽPaBA_&þýc‹…bþüBabBÿYÿój-(“²+°3´ 7+°/´C+°/´!C+°)/°Ö´+°± +°2´&+°$2² +³@  +±*+±°9° ³!$9°°'9± ±99°²999°±'99°°$901%#"'532654+53254&#"&54632jhKN""0->qZYrV;l~9F;£Ž[…/M“GYI 2+XIO-0ˆph{¬WL&G Yÿò .$Z²+°3±é°2°%/° Ö´1+°±+±é°±+´1+±&+±² 999°°9°²!"99901#"'#"&54673265332654'7 sr25lo_N&ƒfQ.?TI4Nd„(M_y¤ST£uf™%=?­VrQ3`þ 5OyTª==$–Yÿò .$v²+±33° /°3´"7+°2°%/°Ö´1+°±+´ <+° ±+´&+±&+±²999° ° 9°²"999± ´ $901'654&#"#4&#".54632632 ]O%‚dS1>RI5Nc‰-M`’rq33mph˜%;@®WtK5þšf4JxV­?8%•ex¥NN¡9ÿò .(4·²+²+°3´27+°,/´++° /°3´&7+°"2°5/°Ö±/é°/±)+´&+°±+´ <+° ±+´&+±6+±/±99°)±99°±"99± °$9°²&999±2°9°,²999°±99° °$901'654&#"#4&#"632#"546326324&#"326 ]O%‚dS1>RH3WY]HµŸ„r33mpý¦1)*34()2h˜%;@®WtK5þšf4J‰XF`FKf÷Œ¹NN¡ï,=:,+=:YÿüW –²+° 3´++²+´+² +³@ +´  +´C+°/°Ö´ +° ±+´&+°±+´&+² +³@ +±+± ² 999°°9±° 9°³ $901)'654&#"&54632!3WþIS98UH!o€WX€N/%U7LK5R!=8xTuqX92ßYÿüw-' ²+° 3´++°2°/´++°#/´7+°(/°Ö´ +° ±+´+² +³@ +°±+´'1+°'±+´+±)+± ² 999°°9±'°9±± 99°³ $901)5654&"&5463235463254&#"wüüLWtVK!o€W[{¶„haŒJ_DBZ*(W8OK9V#78xTuqXH#ühˆŠ`þþþDcdCþWÿó³--7ê²+° 3´*++²+´6C+²* +³@*, +´1, +´++°/°3´!7+°%2°8/°Ö±3é°3±.+´&+°± +´ <+° ±+´(&+²( +³@ +°(±++´1+±9+±3°9°.±99°±!99± °#9°°%9°(°*9±6°9±1*´.3$9°±(99°°#901)5>54&#"#4&#"632#"54632632334&"26³þW3FXJ5=SfE[k]GUaI¯£‰ADQz€GØPü¯0R31R2/$ITuH8þšm9@€cF_JId듼II›…vVßþ},<;,+76Yÿí„/8·²+°"3´7+° /±6é°32°//°,3±é°2°/´'7+°9/°$Ö´+°±+±1é°1± +°2±é°)2±:+±$°"9°±!99°1°9° ·',6$9±±!99° ±99°6°9°/²$1999°°9°±)9901%#"/324#"#"&463232654&#"&54632#"&#"32632„je^=@qjJ H /BI-:]=t}0G3¨”îT8 2 ?? 8 5SgA3PZB\H'$xRŠ„‰¥•2A)(GWt.b²+´++°/±é°/°Ö´+°±+± é° ±+´&+±+±±99° ° 9±± 99°° 901)5! 54'4#"6týã L>fEVGDHÓû3þÓ¾¾ÎdS›5)n€Y¹…Zÿðþ-*6¨²+°3´++°52°//°#3´ C+±22°7/° Ö´2&+°2±-+´&&+°&± +´1+°±+´&+±8+±-2° 9°&²5999° µ+$9±±99±°9°/µ ($9° °901"'#"&5463263232654'74&#">&54#"32þ³’Y (_™ÆaTc-7}Vv†d‚V=gþÑFDAG†8Tá~a.8—q.­ ·”dŒNN‹[°`•i{N3cQfbL›Ex¯eŸ§kXZBPZ¶‘L‚\FIþ}+! ,.!*–BT'!%DH@‹TSJH+ WI8U=?MmW€Š#Tš½(-J‚2T/<,Z=*(W8OL8T":9wTuuTE&‚hW?^¤}þ è"D‚W07"6EWÿð3.˜² +²+°3±'é° /°3± é°2°//°Ö´&+°± +± é° ±+±$é°$±*+´&+±0+± ²999° °9°° 9±*$²,-999±' °9° ¶#*$9° °,901#"&=4#"#4&#"&5463263232654'7utlw“yVP?LZ-¡‡o€74jo„IBNM+®†ŸtZ“‰þ¢^?L|V§B;YÊx¤LL{jeJ^{b¢@7TYÿ÷{..Ʋ+°3° Ö´&++´+´+°/±!é°/´,7+°//°Ö´+°±+´$+²$ +³@ +°$±)+´ 1+² ) +³@  +° ±+´<+±0+±²!999°$°&9± )°'9°²,999±&±99°· $)$901'654&#"!5654&#"&546323&54632{´!‚kSWqB0þ]HR:9SF!mT\y­A xsž ÉK>=™Y€wYJˆ1*_8MJ7U%<7SztYH"PƒyŸ«eÿ8W T²+°3´++² +³@ +² +³@ +° /°Ö´&+°±+´&+² +³@ +± +0133!!#5eN¤þ¶N þ!AÈÈUþÔä圲+±é° /±é° /±é° Ö°3±é°2°/±+°6º?;ö+ °°À± ù°À³ +³ +°³+³+³ ....· ........°@±±99±±9901&#"70#"'732757632äG32úmm`dNC3‰‚:DOnYjmƒ¢tf9WÛÎO<\všÿ“Ê-L²+²+±é°/° Ö´&+°±+´&+±+± ° 9°±99±± 99013#4'"#&54632ÊMN!0 PVFDWQ1B!EXQCÿoÊ,o²+²+±é²+´  +´++°/° Ö´+°±+´+°±+´&+±+±° 9°±99±² 999013#4&##"&54632'4#"32ÊM0-#?(,AbI°É%&&%}/6()>B,?K©..+HþÖt.s² +´+²+°/´+° /°Ö´+°± +´+³ +´+±!+±±99° ³ $9°±99±±9901#"&54636544&"32tVCBQH1)T< Zs*1?99°$°@9±M@ *0EJ$9°²$499901'>54&#"#54#"&546326327#"&54632654'&534&"326ü    $ LJeJbQA:P/jxkL69 $ ¬9N7>"(6‹# # GG "($ #]mYGBTW:GjBsEf€’E +%*A+21,";1YÿöÊ-'…²+°3´&7+° /´++°/´7+°(/°Ö±#é°#±+±é°±+´<+±)+±#± 99°±99°±99°±99±&°9° ´ $901%'654&#">32#"&546324&#"26ʧ*~€fb… O/JhkQai¯Œ‡¯þ¹9*+<=T9ý³T:@fƒ‚a!*cHM`†mŒ¸«â+>=+*::Vÿð/#'/ž²+´7+°*/´!++°/´$7+°/´ C+°0/°Ö±é°±+°2´,&+°&2°,±(+°$2´+° 2±1+±,µ $9°(±!99±*².999±!±99±$² %99901%#"&54632#"&547'7&54632&4"4#"32kL}{MjB42F!HUUH!E34BJXX,**,BO‚ŸQD2>>0($€VW€$'1<=½VVð..-ÿÿYÿö|-'IJÄÿÿýÿó-&½ÄüÂÿÿýÌÿð/&½ÅývÿÿýÿóÔ.&ÌÄüÂÿŸ-Ûé4°/´ C+°/°Ö´ +° ±+´+± ±9901"&54732654'3Û\„\I2H2HÔDccD &88&:@ÖÜ 5²+´ +²+´ +° /°Ö´ +´ +± +01#"&4632Ö+" // !, --@/-/ÿóÔ.&®²+´ C+²  +³@  +°/° 3±é°$2² +³@ +°'/°Ö´&+°±+±é³+´&+°/´&+°± +±é±(+±°9°²999°°9±°!9° ² $999± ²999°°!901#"&'33254#"54#"#&5432>32Ô~ZtOk½‰)9XZ:*KÁQ(>?bn…¢[L^ÛÈ9*bYnHK'5×C'ŸWÿa.1=ITvu²e+°^3´p+°t2²n+²v+° /±Pé°X/±ak33´Y+´j+°L/±$é°/°)3´G7+°;2°A/°53±é°/2°w/°Ö±Dé´"+°D°N Ö´<+°/´N<+°D±m+´g+°g±> +´&+°±b+´a+°a±,+´8+°8±\+´U+°U±J+°22±é°° Ö´&+°&/´+±x+±mNµAG$9±g³ejkp$9±ab´$LP r$9±8,³XY^t$9±JUµ)/5;$9±eY¶JNUgm$9°p°r9±$L³$9±AGµ&,"$901#".5475.54632#"&'! 5#"&546324&#"326%4&#"3264! !2>'#'2654#"#54#"&54632632aWFŠBp|FGxm>‡LTdXDZVA*D 9= D,@SYETed1'%23$'1þi0&%43&%1”þàþé0\\8a;  &<@"9"YJ/'%-KTV† z5L)(M5z]_y^EC\1#¶¶%/^CF[}#&00$%84'&00$&76þlhhn --.  TT  (3#%%Yÿ½.=IT²+²+°/3´H++°S2²+°/´++°M/´)++°B/´+°#/°3±5é°92°U/°2Ö±Pé°P±K+±,é°,±+´&+°±+´E+°E±>+´+°± +´+±V+±P2±%&99°K±)/99°,±#599±°79±E°99°>µ$9°± ;99±°9°°9±MH@ ,2>E&$9±B)± @99±#±7;9901%#"'732654'#"&5463&#"#4&#">32#"&546326324'&#"32$4&#"32½¨…TD:?eƒ^[T_u^e>NOR@^| L0JhkQ`j¦Ž†*'€žIqö& GT62sý¼9*+<=*+yË.>+£rÉ%8Hj‚p[c‡9H=þ¡_=Hƒ^")bIN_ˆk¶WW ¦)XAbJ9M;V>=+*:ýqþÌE.9?â² +´3++³ 3+´<+°/°!3´8+°/°3´'+°+2²' +³@ +°@/°$Ö´>+°>±:+´+°±+´+°±+´6+°6±/+´+±>$°9°:±!99°±'99±°)9±6±+99°/² 999±8°>9°<µ$/6$9°3°9±'°)901#"&547632&#"#54#"632#"&546326324'&#"32%4#"2LB5> &?KADf+@ %/?A3>>oY^dX=<@# +:Kþ_24f…JdJ:>,2,$ãæM>*A03DZJ[z;::9a!3!L3324'#"324#"3 lW52$* %0>A2>>nYS(A‚EU­ !1:þu253F_‡!5dD.M #R57a2"äèO>-A13E\J\|> S q5%@$2v:<Mÿò¯!X²+´7+°/´C+°/°Ö´+°± +´+±+± ² 999°° 9±² 99901!"32654'3"&5463!¯þ€JUVIKVPa2yÒ{ƒrmØxUV{zWpBLfw¢¢w{›#ÿ6µ1i²+±é°2² +° /´++°/±é°/° Ö´+°±+´&+°±+´&+± +±³$9±° 901!";#"&546;546254&"µþX2&¨³>WO;@ƒÀ…KZ€X?!$EN<;OöcމbüøCbdCöMÿöü-t²+²+±é°/´C+°/°Ö´ +° ±+´+² +³@ +² +³@ +±+± ³ $9±± 99°³ $901)5654&#".546323üþ±spYXoRC/M\œwu‘Ká:FŒ\|~]Ry1"b{¨¤z‡>Uÿò-)²+²+° 3±(é°/°3´++°#2°*/°Ö´+°± +´ &+° ±+´&+²& +³@& +²& +³@ +±++± ²999° ° 9°°#9°&°(9±(±99°´ &$901)5654&#"#4&#".54632>323þ±sXE8JLF1LcU>4IZ‡m5Tb:e{DØ:ES…P:þ¦Z6X€SQƒ4&–bv§4)(5©uoVUÿðš®!‚²+° 3±é°/´7+°2°±é°"/°Ö´ +° ±+°2´+°2°±+´&+±#+± ± 99±°9±° 9°² 999°°901%#"&5&5467534&'326šUIELZx_4o vImyKPK&#'+ÔZŠ~W’a~H3`ž~¹‚ˆ»‡fŒþî4YbPÿ(¦»:¶²#+°3°2/±é°/±é°/´(++°/´87+°;/°5Ö´ +° ±%+´ +° ±+°2´/&+°+2°/±+´+±<+± %°#9°@ "(-28$9±/±99±#³"/$9°±-599°µ %+$901'654&#"32654+532654&#"&54632#"&5432¦T:DÁš Ê?dXwi@@1:U?_t2@7œ|^€ML¥y²ÁïÅ·ë‚"p‡Ìܧl©kaQtN?2=Mgkv†€¯pYu #‚o‰ûÁÏñUÿ'½1;¬²+±)33°/± é°"/±33´/C+±4922°54&#"#4&#"#4&#".54632632>32½]­j49*/UŽLXX3CMH43KLE2K\M>4IZ‡m4V#z*P5v€ßqÉ~Fj¦\q˜R7þ¡k4IJ3þ•_5T}VT4&–bwª4'[[(3ÂSÿ'¨-#-²+´-7+°/± é°'/´++°/´!C+°./°Ö±*é°*±%+±é°± +´+±/+±*±99°%´ $9°±!99± °9°°9±'-´ $901%#"'732654&#">32#"&546324&#"2¨`¯k55),‚¯}hay I-GabO]b¤†…¦þÄ4():9RárÊ~B Üp–b!*cGO_ˆkŒ¸¿øT?>*);Uÿ'@-%š²+² +±"é°/±é°/´++°&/°Ö´+°±+´ +² +³@ +° ±#+° 2´&+±'+±¶"$9±°9°°9±" ± 99°³ $9°±$%9901!#"'73267!5654&#"&5463233@‡-8*-]Š þÅssWXq‘)§›vu‘OØKduEJC:FŒ\‚ƒ^¨65LÈ{¨¤zˆ=ÚTÿð­'1®² +²+°3±/é°/°3´C+°"2°°% Ö±+é°2/°Ö´&+°± +´ &+° ±+°"2´,+°$2°,±(+´+±3+± ²999° ° 9±(,°9±/ °9°+³ $9°° 9±%°!901%#"&5#4&#".5463267534&'326­"J2II6=KF1K]K=2IY‡md82gJmyJQK$%(+Ô9fE}XG:þ¡_4QzUT€5%—bv§]YÖÜ»‡eþî>O\,ÿ'Å4+t²+°3±é°$2° /±é°,/°Ö´ <+°2° ±+±!é°!±'+´&+±-+± °9°!°9°'²)*999± °9°°9°° 901#"'#"'#"'7326733265332654'7ňow:9qZ?‡-8*-]‰ RNE9KTU9KY}(£y¤XX2%duEJC%þ¯FQN;^þ¢7RyW¥G;WUÿ'v1.‰²+° 3°/± é°/°3´&C+°,2°//°#Ö´&+°±+´&+°± +´+±0+±´ &$9°² )999° °,9± °9°°9°´ #)$901%#"'732>54&#"#4&#".54632>32v]­j49*/UŽLXX3CMD2K\M>4IZ‡m3VQ4v€ßqÉ~Fj¦\q˜R7þ¡_5T}VT4&–bwª3'(2ÂYÿò*bKû²'+°23²+´++² +±Fé³*);8‹)Yx]”PKcL=þ¡_6U}WU€4$™cy¦YYŒk I-GaaO]b>°j ]²+±é° /´+°/´+°/°Ö´+°±+´ +±+±² 999±° 9°±9901"632#"&5433254#"jý‚d()?B,?K¨D$&&$ NZ">(,BcI®ì..,Wÿò„ Aï²(+°3´7+°2²6+´;C+´"(; +´++´.(; +±.é°B/°+ֱ鰱+´%&+°%±+´+°± +±é³> +´3&+°3/´>&+±C+±+± 99°±"(99±%².9999°°89°3¶ 16;$9° ±@99±¶  %+$9±"± 99°.±1@99°6³389>$901%4&#"26%4'267#"&547&#"632#"&54632654&#"'632e3(*23P4Ë\z;b9TjTScƒv§Á]EY^HSbãÑ0}$/ 96/2sGM/tž+?;V>&+°>/´I&+±N+±3±'(99°±*099°-±%699±!"°89°°D9°²:C999°>¶ CDI$901%4&#"26%4'267#"&547&#"#4#"632#"&54632632654&#"'632e3(*23P4[\z;b9TjTScƒ56GP¥Ts]EY^HSb¢†zA5mP3$/ 96/2sGM/tž+?;V><Yÿòâ6@à²+²+°3´>7+°/° 3± é°$2°+/´07+°A/°Ö´<+°±+´&+°±+´;&+°;±7+´<+³37+´(&+°(/´3&+±B+±² 999°°"9°°.9°;² $-999°(¶&+09>$9°7°59±>°9°µ"9$9° ±&599°+³(-.3$901%#"&547&#"#4&#".54632632654&#"'6324'326âiSTe„A0AOK5NbQA6Ma’sq33sL9$/<6.6pGL-sR^x9319Û^Љ`Šs R4þ¡_6PyVU€4&—cx¥NN!,!8:-UZL7:b®ŠPbvAcbYÿó¼'1º²+°3´/7+° /±é°/´!7+°2/°Ö´ +° ±+´,&+°,±(+´1+³$(+´1+°/´$1+±3+± ²999°,² 999°¶!*/$9°(°&9±/°9° ´ *$9°±&99°³$$901%#"&547&#"&54632654&#"'6324'326¼dSQb0jƒd7w©ŒG9#.;3.3nFQ3nPZs6016Û`ˆŠ_‹r ‘nwK0_–¶!,!89,U\J-Da¯ŠPawAcaWÿòZ<R[²+±"33´P7+°Y2°/° 3´'7+°+2°2/´77+°\/°$Ö´&+°±+´W&+°W±S+±é°±+´M&+°M±=+´<+³9=+´/<+°//´9<+±]+±±!"99°W±'99°S³)$9°°+9°± 599°M°49°/¶- 27BP$9°=°;9±P°!9°@ $;BSUW$9°'±)-99°2³/459$901%#"&54>7&#"#"&547&#"&54632632654&#"'6324.' 326%4'326ZiSTd/ &*_Q?/KrQZi|/Yzp0Œ´†O0Jp|T)&!:6/6p’5zR  9319þrsqu3<Û^Љ`(?> $!$’FXŒc–f‡\˜K.\¼‡œ)-+#7%6:-U«9Gm*4- Acb;VP…Ÿ_Yÿóì3=̲+°3° /±!é°2°(/´-7+°>/°Ö´1+°±+´ 1+° ±+´9&+°9±4+´<+³04+´%&+°%/´0&+±?+±²999± °+9°9² !*999°%¶#(-7;$9°4±2<99± ¶7;$9°!²#2999°(³%*+0$901%#"&547&#"#"&54726=4632654&#"'6324&'26ìfUTc„-¤~_lr¦1‡H’@dH=#-9<+6oGL-qR'3{:d7Û`‡ˆ`|yÛ:_~œ}ÑU1C§\|W\QdŠ!#/!8A4UYM=:e¥OT.fi@caYÿò½-:BJV² +±33´T7+±8G22°O/±0C33´C+±,;22°?/´C+°/´$7+°W/°Ö´Q+°Q±K+±N22´E+°A2°E±J+°;2´1<+°1±.+´+°°' Ö´1+°/´'1+±X+±KQ° 9°E° 9°J³!"$9°1²5999°¶$*,8$9°.°)9±OT³ $9±?±)99°°9°³!"'$901%#"'#"'#"&5434632>7654&#"'63224+326'54&"#32654&5#"326½RGc'yv'bFSéi\Dm ($(3"@C)9yKTB>" ÒG},$)1ðElFùù9Aþ¿&|/)#,£NcQQQQcN©dK7*"1&"7C6UZL;C=-)¨_4(&6?Õ8OP7I¸^ZZ D_-?5<Ð(\²+´+°)/°Ö´ 1+° ±+´ <+° ±+´1+±*+± °9°° 9° °9°²%99901#"&547332>54.5473vuc…PPH-?!0::0P 19?2!x{b0310IZ%BG+4N.%#(C, %+!07Z<0Ð#²+´!+°/´ +° /´+´+°$/°Ö´1+³+´1+°± +´1+´+°±+´1+±%+± ±!99°°9±!±99° °901%#"&54635#"&=3;4&#"3260”ken P ÃKbPWHJk\KJc×hoqc_q¹N%ùnQGPJGJQM<Fä'3²+´1+²+´+³+°4/°Ö´.1+° Ö´1+°.±+´+°±(+´1+±5+±µ+1$9°°"9°(°$9±1´"+$9°±9901%#"&54>7654.#"#>24&#"326F–miž/(6!-%1,Pd˜N'++P\KQreHPmæj|~g#;*$ &/',T>blfM@,I0Ka^OH^X<óä2>ª²,+°03´+°62°$/±%é²$% +³@$ +°%´"7+°/´<+°?/°)Ö´1+°±3+´1+³3+±é°/±é±@+±)±$%99°@ "&,069<$9±"$°9°%°9°°9±<´ ).$901#".'.#"#.#"53.546326324&#"326ópX/M3 86v(V47LfWY7=jWlP>:=E@<@>Ys#;I)*  `@¡\á2"  P0‰LY‚NN~T=YZ>=UR<ä"}²+´ +²+´+°#/°Ö´&+°° Ö´1+°/´ 1+°±+´1+±$+±°9± °9°³ $9± ³$901%#"&547332654&#"#&54632Ùo„ P QLJEG;DEPy^Zyùù‚o ))!Nf]LJ:?M@]e^W<ä%›²+´+²+´+² +³@ +´ +´+°&/°Ö´ 1+° Ö´1+° ±+°2´1+°"2±'+±°9± ° 9°´$$9±²999°°$9°°"901%#"&54733254ᒐ&#"#4632tif„PPH4D<ð‚+ °.°À± ù° À³ +³ +² Š Š#9° 9µ  ......´  .....°@±%³"'$9°°(9±*³-2$9±-2±99±"(±9901%#"&54>7#"&546326324&#"264&"326ã‚dg{ -@B]oLGg 0CbX{þr9)*=:Z5>P„TSADPâd~zg-<M'YAJ[YF#¥Fl)2:*-6>þÂAGRBAX`P-ä)€²+´(+²+°3´+°!2°*/°Ö´%1+°%±+´ 1+° ±+´1+±++±%±99° °9°±99°°9±(±99°± 9901%#654#"#"&=46326324&"26-1P1\43}hovxmnF,rWOþNŽNNŽNþ‹_xc5„H6þÊk‰„pün†ZZnZþÄ$I[\HþÜI[\<2ä>²+´ +° /°Ö´1+°±+´1+±!+±´$901#654.#"#.54>322VQW$G01F$1&P$3:dABd9¤³ÝÇÉ-TR11RT-[ÜYVäV>n]77]n<ä$}²+´+²+´+´ +´+°%/°Ö´ 1+° ±+°2´1+° 2±&+± °9°µ "$9±²999°°"9°° 901%#"&54733254.#53254'5vigƒPQG‘0# \ADMP0!ïnpeI88CHW©#32<qr< aFc,\<oäD˲:+±>B33´+±22°0/´4+°E/°6Ö´1+°±+´+°± +´ +° ±,+´+1+°+±+´1+±F+±6±2399°²04:999°°<9° ±$>99° °@9°,°9°+²*B999±°9±40°$9°µ 6$9°:±<@9901#654&#"#54#"#54#"#&'&!"53&54>32632632o/Q0/0,2AXW@BUórsa^w>£AYeLm€rZþÃ>TZA@V\Pä(ˆ²+´&+²+´  +´+±  À/´C+° Ö´+°)/°Ö´&+°#2°±+´1+±*+±´ $9°±99± &±99±°901%#"&54632327#"&#"6324&#"326„cg€PgT;@ -va?e\PXA?VSD@WÔasyfCeIP[Î>z]AZS?EZVPÆä"h²+° 3´+°2°#/°Ö´1+°± +´ 1+° ±+´1+±$+±°9° ±99° °9°± 99°°901%#654#"#54&#"#&5432632Æ1P1\34P43\1P1°X3/d¨ô‚^yb5„I5ÑÑ5I„þËby^‚(ÈLLÈ<ûÐ.‡²+´+°/´+°//°Ö´ 1+° ± +´#<+°#±+°2´1+°*2² +³@ +±0+± °9° ° 9±#´&,$9±²999°°,901%#"&547332654.#52654.5473û{\eƒPSCAH//(`:8QQ8P(=F=(S+(¾Zdkb#BMMA(1<0*"'B, '3?/KTÐ.­²+´+°/´%+°*/´++°//°Ö´ 1+³# +´1+°/´#1+° ±(+´1+°±+´1+±0+±#°9±( ´ %*+$9°²999°°-9±±99±*%² 999°+±9901%#"&547332765#"&547332654'5673sij† P RK5--8b7;J(B_PV"6/¶+Qåi|†k0)!Lh#$b–9)8A? M! 0 < H<ãÐ9а/°3´2+°72°:/° Ö´1+°±+´ &+° ±(+´)1+°)±+´1+±;+± °9°²02999° ±-599°(°%9°)²7999±°9±2°0901%#654&#"#4654'&#"#&5467>7673632632ãASD480"%P.29+$ZE{zŽ PNŠi` -A*J=VWlÞk_Uo;U"#L  ' F!K47t*ml€§64#X(,#K2/+$OnPÐa²+´ +²  +³@  +°/°Ö´1+°±+´1+°± +´1+±+±± 99°°9± °901%#"5332654.'3ŠbáP”DUPÐ`péçþ­VD$8+);<Üä2>Jܲ+´+²++´6+´H+ +´+´!…â&.1'%15Â+75'%/+„ä<¾²+´+²4+°93´+°2´.$4 +´.+°=/°'Ö´,1+°,±+´ 1+° ±+´1+°±+´1+±>+±,±$.99° ² !1999°² 4999°°79°²9999±$³ $9°.°!9°°79°4³'),1$901%#"&547332654&#"#54#"#"&547332>32632„')†o„ P QLIC -"*P 34;P*%( +Z>LùZNQ‚o ))!Nf^K]15."‡™> A47 $>N><ä7Cß²+´+²1+°53´;+°$2´A,1 +´A+° Ö´7+°D/°/Ö´>1+°>± +´1+°±8+´)1+°)±+´1+² +³@ +°°! Ö´1+±E+± ´,1;A$9°8°9°)±'399°´$5$9±,³ $9±A°9±;¶)./38>$901#".547332654.+532654&#"#"&46326324&#"326A8o›pDvWT hSXi-$<9/>>0&> zU[„~ZeC?3N`IÒ<ðä5´²/+°33´+°2°&/´+°*2²& +³@&! +°6/°,Ö´1+°±+´ 1+° ±+´1+³ +´!1+°!/´ 1+±7+±,±()99°´&*/$9° °19°!±399°°9± °9±µ ),1$901#654&#"#4654'&#"#.#"5&54632632ð5I.79/! P%$'9=LCBz|R PLni4sAq€h\b6;dQh,c_aO54&53 æi€PTLJEA^Nd#P#I2')Pïïxh*01N`]Lõ:_MD@AH1:I4 6 =ä"-¨²+´,+²+°3´+°2² +³@ +´ & +´ +°./°Ö´)1+°)±+´1+°±#+° 2´1+±/+±)°9°°9°±+99°#´ &,$9±&,± 99± ±99°°901%#"&5463254#"#4&#"56326324&#"26=‚zgŽ’ibDX?!P1#A6IO&-]ROPbGJ^a`üz‚ldfn=ÑpI^`G/"Z3<OXPoä"-¨²+´,+²+° 3´ +°2²  +³@  +´& +´+°./°Ö´)1+° 2°)±+´1+°±#+´1+±/+±)´&+$9°±,99°#° 9°°9±&,± 99± ±99°°"901.#"#4&#"632#"&546326324&#"26oB#.P!?XDbi’Žg{OR]-(MI6~^JGb`aW!0G``GpÑ=nfdl‚z2Tb<<3þHPOFGPN<wÐ#.§²+´+°/´-+°'/´+²' +³@ +°//°Ö´ 1+³ +´*1+° ±+±$22´1+±"22±0+±° 9±* ° 9°³$9±² 999°-±#99°'´"$9°°!901'#"&547332=#"&54632537'5&#"32wpÛn‚ P PMŽOM;YU;E[PpppÀBD%5/!I/Áïxm+*)!Pd®³9@9:E=±±\GHhO4!"PÐf²+´+² +´  +´ +°/°Ö´1+°2°±+´1+±+±² 999°° 9±°9° ° 901%#"&537324&#"32†^h|PÏ^‘^~PQ?BVT@?Ð\t„häþ®wvœ~XQA@Z<<äIê² +´+² +³@ +²,+´!+°6 Ö´57+´B  +´B+°J/°)Ö´$&+°$° Ö´1+°/´1+°$±+´ 1+° ±E+´1+°2 Ö°G3´9+²29 +³@25 +±K+±)°'9±$· !&,$9° °9°2´/=B$9±9°H9±5B@ $')/9H$901%#"/#"&'332654&#"57'&#"&546327654+53232654'7/eCW5aÀ 8‰t—$'À~ #L'²78DùMQ9MTVH+7>-.? 5{©G.!E$?>AM_¯a+Fl&(cô*) 4<Ð7² +´+°/´+°"/´#+°8/° Ö´1+³- +´.1+°±&+±22´4&+°2±9+°6ºú$ÀE+ °*°(À±0ù°2ÀºõÁÀÓ+ ±*(°*°(À±0ù°2ÀºùRÀY+ °*³)*(+°0³102+²102 Š Š#9²)*(9µ()*012......µ()*012......°@±&.´ "$9°4±699±² 999°²999°"±99°#°6901#"&547332654춮춮.'&53$!?)EJ(Y†PU>9S4]a66ad0;JX4PVVþèò¤/9y°/´7+°/´'+°:/°Ö´4+³$4+´+°4±+´*+°*±0+´+±;+±4$°"9±µ !'27$9±7µ!$*2$901#"&54>7>4646<54&#"#&546324'326ò„c]+922&'&)C \BF<I2F¸gBD[HaoiZ%B-&  $48')*AK^k%.98Gm5(‹AL[þû–¤0=¤°"/´#7+°#´ +°/´;+° /°43´*+°.2°>/°&Ö´+°±+´8+°8±1+´+±?+±&±"#99°³ $*$9°8±,99°1³.$9°°9±# °9± ;´&,$901%#"&547.#"#.#"53&54>326324&#"326–lZMg1 -&BR_XVS C^[-YYk‚#T?ÙZkcM7,-":6C[00%'7-C!FO¡:dGEEtXAY`=QRþ衤"l°/´+°/´+°#/°Ö´ +³ +´+° 2° ±+´+±$+± ±99±³$9±³$901#"&54733254&#"#&54632¡dbQl,F,H7‚4>-9FdFKeKcjaP>=5E7I¨/@A:-4!&.FTUJþ衤2”°/´ +°/´+°/´*+°3/°Ö´ +°' Ö´"+° ±+°2´-+°2²- +³@ +±4+± '±%99±"µ $*0$9± ²999°°09°²$'-99901#"&547332>54򂂮&#"#&54632¡ÂRoFF9*:> '.8.5@FiQFg5.>(0ècQ@8==9G&&@0&<(2C)-6;5PUND1J ]Vä$0º²+´.+²+´+´( +´+´#  +´#+°1/° Ö´ +° ±+´++°+±+´+°±%+´+±2+± ³ #$9±+°9°°9°%³(.$9±(.±99°°9±# °9°± 9901%#"&547#"&54632632$4&#"324&#"326Vg^QpJ,A>QeIG^:2QLPþÕ9/.13*/ 9@B?D>?9Ú`ziQf¸(T>HZUF=”.{ì^=D0*9þøD]lF?Q^À¤'ƒ²+´%+°/° 3´+°2°(/°Ö´"+°"±+´ +° ±+´+±)+±"²999° ± 99°³ $9±%±99°´ $901%#>54&#""&546326324&#"326ÀSF&-:7@(n¶rv_Q=8SQcþ®C=GCCDE>äs])t89P429\wu\_t==nS=RXIFYg£¤F°/´+°/°Ö´ +° ±+´+±+± ° 9°² 999°°901%#654&"#&54632£;F;@xA;F;mVWk×pSNv?[\>tPUnWvvþ蟤+€° /´+° /´!+°'/´(+°,/°Ö´+°±+°$2´+°2² +³@( +° 2±-+±°9°² 999± ²999°!°9°'°901#"&547332>54&+53254ȔŸ!*, $L:Us F D<, '((A&C*BC2CUF9NI%cT@55@Ù°+/´,+°%2²+, +³@+' +°/±33´3+±7<22²3 +³@ +° 2°?/°/Ö´+°±+´+°± +´ +° ±(+´'<+°'±+´+±@+±/±+,99°² -3999°°59° ±%799° °:9±'(³&<$9±°9±,+°&9°´/5:$901#654&#"#54&'"#54&#"3#&)53&54>32632632-.F.,(SF'+(-F"&a7M*CRþßÿTqN:L!%V#>%TATMUKX+Dbhg4-5)le)<¯1M1&¸”:Q¦8bIII) I`£Ð'²+´&+° /´ +°/´+°(/°Ö´+°°# Ö´+°/´#+°± +´+°´+°/±)+±µ  &$9± &± 99± ±9901%#"&5463254#"#&546324'&#"32£\]Zrm\K5urFiSP]F(&-@>A@xÑ_ruZ\y?´…„ R_]PþµX!!`CB[£Ð*‚²+´(+²+´+° Ö°3´+´! +´+°+/°Ö´+°±+´+±,+±µ $$9°±99±!(±99±°901%#"'&54632327#"&#"6324&#"326£k^F:=&%-A@Ó^u01}OIZCnÃ:w[B^V@d##]Œ¤(_°/°3´"+°&2°)/°Ö´+°±+´ +° ±+´+±*+±³"$9° °$9°²&99901%#654&#"#4654.#"#&54632632ŒI2K2:&%.3) $>0[%+þè¤.–°/´+°/´#+°//°Ö´ +³ +´+°/´ +° ±&+´+°±+´+±0+±°9± ±99°&´ #()$9°³+$9°°-9±±9901#"&5473325#"&547332654'53273ÂWgSr,F,E9ƒCX4V=;QE($!&,aK<>jp_R@;5E9G”­) 4;>B9$)("/H@ŒÐ1ˆ°/°3´*+°/2°2/°Ö´+°± +´ +° ±+´+³"+´!+°!/°3´"+±3+± ´&(*$9° °-9°!²/999°°9±*°(901%#654&#"#54&#"#&54>53632632ŒI+°8/°3´2+°-/´"+°A/°Ö´ +° ±+°2´;+°/2°;±5+°*2´+°%2°±+´+±B+± ± 99±5;¶"'$9°°9±² 999°>°9°8³ $9°2±'99°-±%9901%#"&547332654&'"&547&546324&#"3264&#"326¨³•²KGLxu„JT%IzKLLK;9O7q…ñ-%(0.(&.*%)2-*(+B—ý‘t{~sy¡®y]w(5>XW>Q)%W;SR9B.–&53R=@Ï%97)+7:þèQ¤<¸°/´+°#/´.+°/°3´4+±(922°=/°&Ö´++°+±+´ +° ±+´+°±+´+±>+±+&°(9°²#).999° ± 199°² !4999°²7999°°99±#³ $9°.°!9°³&+17$901#".547332654#"#54&#"#"&547332>32632Qqm;mL@cEQWK$$<#:%1=&F&#*(!T89#n‡+[=:/)@CNiSJR4&‹‹--+4+;0-$,%$))#@J9þ蛤.:Ú²+².+°/´+°/´8+° Ö´+°2/°3´#+°'2°;/° Ö´5+°5±+´ +° ±/+´+°±+°2´+°*2² +³@ +±<+±5°9° ³#28$9°/± 99°°%9°³',$9±²999±8°,9±2µ %*/5$901#"&54733254#52654&#""&54632632%4&#"326›xfhA VIœz9A//[k jmPf53aDMm76þµ>65C?=;5=5E8H¨0$5u:N=Šþü ¤6“°'/´(+°2°/°3´/+°42°7/°,Ö´+°±+´ +° ±+´+±8+±,±'(99°³%)/$9° °29°³ 4$9°±99±('±%99°´ ,2$901%#654&#"#4&'&#"#.#"53.54632632 4F446.$ <'<6jT‚%u#VGj]2{[9AfZ(C:dI[ï=QDF8O"3aq9 eAf„ 'b1C ;,‰H[{+$Okþ衤$q°/´+°/´+°%/°Ö´+° Ö´ +°±+°"2´+±&+± °9°°9°´ $9±±99°°901#"&5473326=#"&5473326753¡a`So,F,H7D>>BJ\3F39/%C=5E8HWGâ2ZJPHEO0F% Ÿä$/²+´.+²+°!3´+°2´ ( +´ +³+°0/°Ö´++°+±+´+°± +´+±1+±+±99±°9° µ !%(.$9±(.± 99±±99°°901%#"&5463254&#"#54&#"56326324&#"32¸dX\mjZQ4$", 1 1?),C='P>9F;@??@A?×Z}v][v:ù"-5-<22:=F)??T@þ?†]^BC]šä*{²+´"+°/´+°/´&+°+/° Ö´ +±%22° ±+´+³+´+°/´+±,+± ³$9°°9±"&°901%#654&#"#4632#6324&#">šKFKA9-S |Gi6#E95/þèZ¤6{° /´+°/´+°7/° Ö´+°±,+°2´1+°1±+°"2´+°2±8+±,³ $9±1³'(4$9±±99°± 9901%#"&5467332654&+532654&'&'.5473Z9.05•lŸšE9FAAx~Qk=;?B;<(*!F'77'Ë-< P4jr£XµJ[®e›SOC,y??@;9?B?u=7.2518,#ù:v[]v{\yAS??)þB^]†]\þèÐ%/–°/´+°/´.+°(/´+°0/°Ö´ +³ +´++° 2° ±+±&22´+± $22±1+± ° 9±+³$9±² 999°.°%9°(µ!$$9°°#901%'#"&54733265#"&5463237'&#"26wYmQl,F,D9H<3Z=TU@J?=5E9GSKKP=?NP|þ~TonoY6#&78£ÐQ²+´+°/´ +°/°Ö´ +° ±+´+±+± ³ $9±± 9901%#"&537324&#"2£mZRl<’N_]kF>@{7‚ÏZunRþ•£dw¡†`šF`þè¤M̰ /´+°/´F+°/°83´*+°:2°N/°'Ö´!+°!±+´ +° ±I+´+³>I+´6+°6/´>+²6> +³@69 +±O+±!'± %99°· $*$9±6 ¶-AFK$9°I°L9± °9±F² 999°@ %'->L$901#"/"'5326549'.#"&546327>54+53232654'7H/@&c‘+8V„HM0*5.$«P )11J9M#T¨5}Š$=,¼] 33<[.:OÍqB*@F#=.+)#+Iƒª$6779LI¯‚< 5!Ç':$H¼Ð;²+´+°/´+°/´+°+´+°±+´+°/ Ö´6+²/6 +³@/3 +± )22°°% Ö´:+±G+±° 9°>°9±/²#999°%°89°°<9± °9°!±#<99°)· %8:D$9°*°,9°@³/6>$9°°2901%#"'&'5767632327654'&'53254'&'532654/54#"6XUC_NC12+V-ËöJ3@3 P4E7E6/XmT/;8Hþ¤)1¡X+"l[ 6lSy-•WþÇ@; 6 :+ 6)7@E5D8#>?*z3^EKDÿûlŠv²+°3´+°2°/´ +°/° Ö´+²  +³@  +°±+´+² +³@ +±+±´ $9±°9°² 99901&'567&5462'4&"6lWPQV1?iXXi=3A6`6ff 56jHZZHj6º3993Z..þî…x!s°/´+°/´ +°/´+°"/°Ö´ +° ±+´+±#+± ±99°¶   $9°°9±³ $9° °901#"&5467327654#"'7#5!632… (rN_$ 'D5NY$!„Ð*‹ …4r/=YL'6)/4A1"W—Ü4èþîˆÇ:Ų+²:+°/´+°/´+°-/´#+°;/° Ö´0+° Ö´ +°0±+´+³&+´++°+/´&+°° Ö´6+²6 +³@ +±<+± °9°0° 9°+·#()38$9±²999±°89°-³ &(6$901#"&54732654&+532654.54632'654#"ˆhXL^*!A1>FT<--%X5LL5NF"#A1g+ W´Ê(3°/´2+°+/°3´ +°2°/°3´(+°2°"/´+°4/°Ö°2´/+°$2°/±)+± 22´+±22²) +³@ +°2±5+±)/±99±+2°9±"(°901##"&5476;5#"5476323#3'54#"35#"32´OUFN^2/S\\´0/MHSOOO†dr$FNNE$=5dxGUXMO,(H™M(&MEn4H|kaf>þÛu@5;ÿÿþèò¤ ŒÀÿÿ<ÇD ³FÀÿÿNäs8ä05wÙ:²+±é²+±é°/°Ö±é°± +±é±+±±99013!2#'32654&+5‹žŸŠ¼¬lppl¬ÙÂþ¬ÃRŠ‹5ÿö¸Ù'Ʋ+²+±é²+±'é´  +± é°(/°Ö±é° 2°±$+±é±)+°6ºÂð+ ° °À±ù°À° ³ +°³+² Š Š#9² 9µ ......µ ......°@±$°9±°9° °9° °9°'°901%#".+#!232673264&+)(=X, 5)p]-luE<<7 þÂCKKCÂVG-:;:-þËÙogHeaF65DxDÿê&Ù:²+²+±é°2°/°Ö±é² +³@ +² +³@ +± +01##5!7]ð<‡ýy‡RRÿéÈÙ,4Õ² +±é²!+±0é²0! +³@0 +²,+´+++°2´4% , +±4é°5/°#Ö±.é°.±2+±é°±)+±é²) +³@ +²) +³@)+ +°° Ö±é°/±é°±+±é±6+±2.³! '%$9°°9±°9±° 9±40´"#$9°%°9°+²)99901##"&5332654.#""&4632675#5264&"è0Dk@!ZLNNTF$-/S5?O9X~XX? 6u4Ë&6&&6ÙA~=]l9c‹sX~]B-UJ-><9gZoo´n„Aþf>>f=ÿé­å &‰² +±é²$+±é´  $ +± é´ $ +±é°'/°"ֱ鰱+±é° 2°±+±é±(+±² $999°°9°±99±±!99° °9°³"$901"32654&3254&#"#5632+ &632|tŽtsŽåN1 {=GLÀþÄÂÂŒ¹“¥þò¥¤„Цà:Oš1N ÓÓVÓ¤5’Ù6²+²+´+°/°Ö°2±é°2±é± +±°901#7#5’]]]ýúÓii*ÿé?å2ˆ²-+±é²+±é´- +°%3´++°#2°3/°Ö±é² +³@ +°±+±(é±4+±°9°· #&-$9°(²$%999±²(2999±²99901732>54.'!53&54632&#"3##".'{)˜-A";5,ÿ„nuz¢;N%m3=%Ödi5oQ(KJ=žc2,ADYaWo)Je)$!AI\&=<";)$ÿéöå$.i²+±é²+°3±*é°//°Ö±-é°-±'+±#é°#± +±é±0+±'-±99± #³ $9±*´ #%$9°° 901732>54'7#".532'654&#"¥=E:CH:%•*&A>#Ò’/VSE4¼-@Û~0'ã2G!1HqDÚBJ6T~L¯æ-KeŽU'D_6å 0’JS[zN5¼Ùu² +² +´ +´+°/° Ö± é°2° ±+´+°±+´+±+±± 99°°9± ± 99°° 9° ³$90125#"'#37&' pA@3/c^^?iiBIþúÙþœ]ÿé{Ù=²+´ B+²+°3°/°Ö±é±+±±99± ²9990174>732?33#"& G&Lòq¹¸oþ­&U@Ud-#, åþ…{ý_OGÿêfÙ ,²+°3²+´  +±é° /± +± ° 901%!#3# ³þçMcxhepxÛÛÙý')Lþ´ÿëÿé„Ù?² +±é² +³@ +²+°/° ֱ鰱+±é±+±° 90172653#"&=3·@0]o_^m_87TMýÝ_nhY@/@D5@Ù J²+±é²+±é´  +± é° /°Ö±é°2² +³@ +³@ +³@ +± +01!!!!!’®ýõùþdLúRÙRéR æÙ"›²+²+´  +´ 7+´ +°3±é°2´ +´7+°#/° Ö´1+°±+°2±é°2² +³@ +±$+±² !999°°9± °9±± 99°±!99°° 9017###"&463233!$"32654©ÔiþÃ]) L42L )]=ýÏ8###{ûûþ†{2A]€\B2 þô-3"#32$#äås²+²+± é²  +³@  +´ +±é² +³@ +°/°Ö±é°2³+±é°/±é°± +±é±+± ± 99± °9017#32>54&#"#4632¾^^&C@&\C3MTv`o…3XcÍÍ~`%J5cdV>jwކFi9ÿãÿé¢ð.9(²+°3± é° 2°/´/7+°3/±)é°:/°Ö±é°±+± é° ± +°02±,é±;+°6º?°ù­+ °"°%À±ù°8À³8+º?¬ùˆ+ ³8+°"³#"%+³$"%+°³/8+º?¬ùˆ+ ³98+²#"% Š Š#9°$9²89°99·"#$%89........@ /"#$%89..........°@±°9°±99° °9° ³)3$9± °9°³$9±3/°,901"&473327!#"&547332>32!4&#"Ò;LO,fþÝ %=)7 327&54623267#53##"'7654."Ëbl$<   ?0+/wgªgw/*2@6Â/ ehRLMM_bI 6) H   ,.»«ªª«½KIAAb„11Ÿc¥<_7$ $7_<¥Ù u²+±33²+² 333° /±+°6º=Áï2+ °.°À±ù°ÀºÂaî¸+ °.±°À± ù° À² ...¶ .......°@01!# #333Ôf¨£f»h‰¢d¦†hWý©Ùý°Pý°P ÿé7å2{²++±é²+± é³++°3/°1ֱ鰱+±"é°"± +±(é³( +´<+±4+±"³+$9° ² %999±´%(1$9° ±"990132654.'&54>32#4&#"#".54&Á%1(BJ 2:"B+U[S,%Y(88(pq AL9&™%’*?"LI+.6Q*4 !2(]l5BR!D=CZ2`‡ !5]<½2ðL²+° /±é°/±é°/°Ö±é°±+± é² +³@ +±+±°9±° 9013#4632#52654&#"]‰c)MH+p\58S8CK#\q.W32#.#"32654&'#53gKwG/0GyLî+_^Wj{€m^aHSFF~}At3Ni`12bjO4îNN¢Œ‰¡O:A=QìIo_(KA'5ãÙ F²+± 33²+°3° /°Ö±é°± +± é±+± ±99±² 99901!##33#¾bÏXØÔXcýÙý…{ý'cñð`² +° /±é°/±é°/±é² +³@ +°/°Ö±é°± +°2± é± +±±99° ±99±°9014>32#5#"&+532;4&"+HL*c‰]SU}%%YK†H;W,q\ýÝ–`R$GZD@ÿþÿéSÙBµ²#+´ 7+²4+´3++°62´:#4 +±:é´?#4 +±?é²? +³@B +°C/°&ֱ鰱 +´<+°±+´B1+±D+± ¶#).234$9°±799°´56:?$9± ¶&)+,$9°:².0999°°9°?°=90132654&%4&#"#"'#"&5467'63267#53#32>32"  439³++"6 X'>F9>)PW-*b67J² C 3Â6(!#4!M\k'2P) -CZ"d”*%,%R,.#‘6D\-hBHf7P>j_pAA=R&/&ZBÿé‰å|² +²+±é²+²+±é´  +±é°/°Ö±é°±+± é°2° ± +°2± é±+±±99° °9± °9°±99°°901463233###"&"326&¯ž«x^^v±•Ž»Mt|~qr}}a³Ñ°—;ý'L¢ÁÚУ‡¡¢¢5fÙ ?²+° 3²+°3´ +±é° /°Ö±é°2°± +°2± é± +01!#3!3# þ‰]]w]]Lþ´ÙþÅ;ý'ÿéÖÙ„² +±é² +³@ +²+´++°2°/° Ö± é° ±+±é² +³@ +² +³@ +°±+±é±+± ± 99°°9°² 999±°901##"&'332654&#"'675#5E0Yh}k^pTkENMDMH'V4ÙA€˜u•k`~j]bo<,G‚A ÿé§Ùa²+´B+² +°3´ +±é°2°/°Ö±é² +³@ +² +³@ +±+±° 9±° 9° ° 9013#32?33#"&=# ÔC&Lòq¹¸oþ­(S@U8T8 åþ…{ý_OG4JÿéÝå e²+±é²+±é´ +´7+°/°Ö±é°2°±+° 2±é±+±³ $9±°9°°9°°901#"&632.#"!26ÝÀ žÂ Á^‹pmýþ ‹ÔŒa¢ÖÓVÓÔ}•–|Fu‹Œÿ~æÙ}²+±é² +³@ +² +² +°3´ 7+°2°/´7+°/°Ö° 2±é° 2² +³@ +² +³@ +°±+°2±é² +³@ +±+01!535.=#53533#353æþá¡‘@@]¼¼8HA]‚F<[söFÍÍFè09 ÿé·å$›²+²+±é²+±"é²" +³@" +´  +± é°%/°Ö±é°± +´ <+² +³@ +° ° Ö±é°/±é° ´+°/±&+±²999° °9± °9° ±9901326=#5!#'#"&54>32#.#"{$9^ìôM+ °°À± ù°0À³0+²0 Š Š#9´0.....´0.....°@± ° 9±-³ !($901#".547326767672#.#"56 H,/B N>>-b   ¡[Ž "ŠþÍ;3)''*9g)h $0=þ,Š M+2 Y5Ù9² +°3²+´  +±é°/° Ö± é°2° ±+±é±+0132#54+#’ f‡]©‡]Ùþí„VìÒ¢þŒÙ;Ù ,²+±é² +±é° /± +±°9°°901!!5!59þL¶ýÕ¶þfÙTýÍRR5R ð!l² +°/±é°/°3´++°/´++°2°/±é°"/°Ö°2´ +°2°± +°2± é±#+±³!$9° ±9901#53>32#5#".'#53#;4&#"ÞÂ2 OZ4c‰]3YN 3Â.mŽKCpGAA>Pq\ýݲL32#"'#"&54>7327&546zDUKˆ‹LJ4_'CI)ClE./`DbDAUqx+$BI3)-Š=ED]‰Ã?E?jg;44z{'C2I8$GZ&6K'hÿéÀå*9±²!+±3é²+°3±'é°2²' +³@' +´ ! +´)+°:/°Ö±*é°*±#+±-é°-±8+±é°±+± é±;+±-#²!'999°8±%99°± 99°³ $9± 3³#-8$9°°9°'´ %+$9°°9014632632#"&'732654&#""&547&#"72>54`HC<"7> BQ/.WH¢Hb!4Ì@  Ô‰ˆ11mXZd.18#%51C}¹³¢¢³Áz`_`_—=^8# #8^=–ÿørå1²+²+°3²+±+é´  +± é´/ +±é°2/°Ö´+°±)+´1+±3+±)³ !$9±°9° ° 9°/±!$99°¶%)-1$9°+°9°°901!##"&'732653332>32'7>54#"#"'>dÁ#[CZA5(#*d¶c0 3?„,  1 2?: EkNB#18hMý›eY23h!3E  32& ÿéð?§²&+°"3±6é° 2°/´=B+°/±é² +³@ +°@/°)Ö±3é°3±:+±é° ֱ鰱 +±é±A+±3³&./6$9±:°89°°$9° ´"=$9±6&°$9°µ)3:$9°=± /99°°.901.#"324&#"#4>32#"'#"&54>7327&54632GN#*e;ˆ‹LJ4_'CI)ClE./`D`H@Tqx+$BI1'H8(P3-"‡?jg;22z{'C2I8$GZ",=no9$ÿé>å6š²&+±é²4+±é´&4 +±é°° Ö±é´ &4 +±é°7/°,Ö± é°2 Ö±é° ±+± é±8+±@  &/4$9° °69±± 99±± ,99± °/9°²2699901&#";#"32654#"#5632#".5467.5432Êx™]A8LBa$O8]ID:2)>[*DE0Ag>(E=81ù¹/GPg,IRf0.3 ,+Q @3+=%"3D=?l85„2ÿébÙ I²+±é² +°3² +´7+°/°Ö±é° 2°±+°2±é±+±°9013#"&53!!3265]™€‚•]vþŠeUXdÙþn‚oÍFíOOTJÿélð*2¦² +±!é²+±.é°2/±é²2 +³@ +°'/±é°3/°Ö±,é°,±0+± é° ±+±é°±$+±é±4+±0,²999° ²*999±° 9°$² '999±2.µ  $9°±$99°'±*9901>32#"&'"&463275332654&#"264&"è2¤K³°šŒew +W~XX?2N1_7'YoŠ{;}#Ó&6&&6l@DðÌ“¸sjZmo´nG>†t"0H-"¼26þ­f>>f==Ù \²+²+´  +°3± é°2°/°Ö° 2±é°2² +³@ +² +³@ +±+±°9± ± 990133##!%5=]]þÃ=Ô_zþ…Rþô Rûû5UÙ :²+± é²+´ +±é°/°Ö± é°2° ±+±é±+01%#!33232654&+U‚dþÆ]¥–ˆþ=Ô@RQAÔâcÙþêxf“R=@PÕÙ‘²+² +´ +±é² +³@ +´  +± é² +³@ +°/°Ö´+°±+°2±é° 2°±+´+±+±°9±° 9±°9°±99° ° 901"&533273632#4#"#A:I0,^'A:I0*^'LLNnþÎLLNþ¨ÿè›â =G˲+±é²#+±Cé´43# +±4é´-:# +±-é°H/°Ö´1+°± +´F1+°2°F±+°@2´1+°&2°±7+´01+²70 +³@73 +±I+±F±99°¶#>C$9°± 99°7±-<99±3³$9±:4´ 0>$9°-´& )@F$90132654&7"&54>7.54632>32#52654&#"'654&#"|13($Uz.<S`Mši.*@78G9B@ 6M\XE ,++:KR(02@3'#<Ä&* ^6HftR0L6"-R3;UV>ZB;SQ"*1<@!*!%J5FÙl²+°3²+± é´ +´5+°/°Ö± é° ±+°2±é°2² +³@ +±+± °9±°9°°9° ±9901!4&'5254&+#!2å­f?8™KCÂ]-luOC•wÅ _€:cniÊcýddÙý—)@²²þÄþÓiý' ÿé4å5”²0+±é²+±é´')0 +´'++´0 +´++°2°6/°Ö±é°±+±(é°+2±7+±°9°· &)0$9°(²999±)³+5$9°'° 9°°$9°±9901732>54.546323!53&#"3##".'p)˜-A".JYYJ.uzPq7ÿm$W3=%Ödi5oQ(KJ=žc$=-,-3H*aWXFAAPe)$!AI\&=<";)ÿéŒÙo² +±é²+±é² +³@ +´  +±é°/°Ö´&+°± +±é°±+±é² +³@ +±+±° 9±°90152#"&5##5!3264&À\p"²+°3² +° /°Ö±é°±+° 2±é± +±°9± °901##535Ì`þÚ``&Ùý'Iþ·¹%Jû ïÙ M²+°3²+±é° /°Ö± é° ±+° 2±é² +³@ +±+± °9±°9015!##535m‚`þÚ``&…Tý'Iþ·¹%J§ÿóZÙ!²+²+°3°/±+±°901!#33]dþúdÖÊcÙý—i ÿé4å+Z²&+±é²+±é°,/°Ö±é°±+±!é±-+±°9°µ &$9°!°9±µ!+$901732>54.54632&#"#".'p)˜-A".JYYJ.uz¢;N%m>]m]>5oQ(KJ=žc$=-,-3H*aWo)Je =-:9X3&=<";)#ÿéCä,7–²+´27+²!+°&3±é°2´,! +±é°8/°Ö±/é°/±5+±é³ 5+± é°±+±)é±9+±5/³!$9± ± $99°²&,999±,2³/5$9±µ $)7-$901>54&#"'654&#"#".54>32632%32654&./4*/_W K,X0Uv2pY;X+>nI@dEXW^VMýî<.+E`° A)-CŽD*?4T `Ls­bšZP|I21clLHvKgl ŠTYÿûÿè¼æ3<E©² +°-3±8é°B2°/±é°F/°Ö±6é°6±;+± é° Ö±é° ±0+±?é° Ö± é°?±D+±*é±G+±6² 48999±;±99±0 ³3$9±?±"299±D ²-=B999±8@   *034=$901"654#"&54>7&54632#"&547'32654%3254[232œDRJFY($B'MQQ>?QQM'B$(YFJRDi±S<)3.)<”>&0/'>þ¶RFaiFJ<8+77 J>DNND>J 77+8<JFiaFRO‹NH><6,66,6<>H2÷åN²+±é² +±é² +³@ +°/°Ö±é² +³@ +°±+±é±+±° 901"!!4632#54&ÿ@0hþ;o_^m_8—TMþ\R_nhY@/@D5úÙ,²+±é²+°/°Ö±é² +³@ +±+01!!’hþ;ÙýyRÙÿé“åc²+±é² +³@ +²+± é²  +³@ +°/°Ö±é°±+±é° Ö±é±+± ²999± °9014>32#.#"32673!".0GyLî+_^Wj{€mZ``!þõKwG/d2bjO4îNN¢Œ‰¡ejþß3Ni`ÿé«Ù&‹²+±#é²+´  +±33± é± 22´ +±é°'/° Ö´<+°±+°2±!é°2°!±&+°2±é°2²& +³@ +±(+±°9±&!±99±° 901#"&=&5463233%54#"#3265«ifžbËPC=P´]þš9"´],+‚N~]piXŠMbW;eWþ©NZ5,?Wy„XIÿéå(7Ȳ+±1é²%+°3±é° 2´% +´B+´! % +´!++°2°8/°"Ö±é²" +³@ +²" +³@" +°±+±+é°+±6+±é°± +±é±9+±+±%99°6´'$9°± 99° ±99±1³+6$9±!´ )$9°%°'9012#'2654&#""&547&#"3#53>3262>54Jbl\@&'=2+/wgªgw/*2@6Â/ ehRLMM_åjSUg\7(84»«ªª«½KIAAb„11Ÿc¥<_7$ $7_<¥5CÙ B²+²+±é´  +±é°/°Ö±é° 2°±+±é±+± °901+#!23264&+Cq[å]-luþOÂCKKCÂ]qþËÙoãDxDÿé‹å'x²"+±é²+±é² +° 3± é°(/°Ö±é°±+°2±é° 2² +³@ +² +³@ +±)+±³"$9°°9± ³$9014>323#53.#"32654'7#".-EvLq‚ÔVUOir€mC_6FŽsKwG/d2akO4jnTTDB Ž‰¡D,"O?NOq3Ni`ÉÙ S²+²+° 3±é°2² +³@ +° /°Ö´&+°±+± é² +³@  +±+±° 9013##5!#3¿kL˜„M`þ[…g»TþBý'5¿Ù ]²+°3²+´ +±é°!/°Ö±é°2°±+±é°±+± é±"+±²999±³ $9013#3%632'>54&#"#“^^V'%*/ 3-'$^þÿÙþ¬Æ :')1E  ( þ·”5xÙ 0²+° 3²+°3° /°Ö±é°2± +±± 9901#33 #’]]kxþ×,nþÿÿÿÙþqþ×þPvÿêíÙ B²+±é²+´ +±é°/°Ö±é°±+°2±é±+±°901%5#"32>+"&54>;™@RS?+@ ]„bb„/Ta:jÖ›ZA>\ 30ýþd‰‰dA_4ÿèå&I²+±é² +±é°'/° Ö±é±(+±±&99°@  $%$9° ±9901%'#".4>3277'4&#"32657§R2AžIvD##DvIžA2RH/wRFnV_qq_VnFRw/™yS‹Kvz€vK‹Syoºys@}¡‹Œ¡}@syºÿ¥‘å+ƒ²+±'é²+± é²' +³@' +²+±é² +³@ +°,/°Ö±"é°"±*+°2´<+±é±-+±*"²'999°° 9± °9±'°9°± 9901327#"&'#"&54>32#.#"326=£0?,82FVh+‡?“±2KP}¡_qStŒ3iJSˆL¸MTF \Q27Ó©0ajP5zoFQ£†2_b<‚^1ÿùÿéYå,8I¢²*+°&3±é°2² +°3±Bé°32°J/°Ö±é°±+±Hé°H±<+±é°±+±6é°6±-+±!é±K+±H±*99°<³ ($9±±&99±-6²3999±*°(9°B@ !-9$901'7327&5463232>7.54632#"'#"&4654&#">54.#"WO1!dHQUb<28>"BK9 sWFBcD8cwGcO><`{!!.þ”%-  Ú MYu󢩬O¥@!5sRui:eŠ»i243ˆ,w^4/;Cþç4ˆ;<_7$ #8^=œÿéÝå ,§²+± é²+±é´$ +´$+´ +´+°-/°Ö±é°± +±é±.+°6ºÂöìÁ+ °(°'À± ù°À³'(....³'(....°@± ³#$9±$ °9±² 999±°901#"&632654&#"323%3267#"&/.#ÝÀ žÂ Áj ŽvNw“2 -&þ• tIr"";# a¢ÖÓVÓÔþí23ЦNF%!€;Â*/‡¥F>2/o $ÿéüå-7ƒ²+±é²#+°3±3é° 2³ #+°'3°8/°!Ö±6é°6±0+±'é°'± +´ <+° ±+±é±9+±06±#)99± '±99± °9± µ!.06$901%2>54&#"#4>32#".532'654&#"’:];'/# R+1#Q])R_/VSE4¼-@Ã=E:é~0';+E_b4`’8MBX-Å‹Q’~K-KeŽU'D_6åD2G!ù0’JS[zNÿæÿèEå"P²+±é² +±é°#/° Ö± é° ±+±é±$+± ±99°± 99±´ $90173267.54632#"&'%654&#"8"c7CetnuJId+PLU˜,í/"#8KÊFIfT"‘Wcƒ‘–S¤‰VdY >EecW>;b$ÿé"å "O²+±é²+±!é´ +±é³+°#/°Ö±é° Ö±é±$+±±99°° 901%2654&#"632#"&54632#4&#"'QP\B;b V^6jƒ~~xŠ‹‡sjXBIž7TFEU@4^bH:}dm‚¡˜êÙwa:P ÿéðB™²++°'3±;é°2°/±é² +³@ +°C/°.Ö±8é°8±?+± é° Ö±é° ±+±"é±D+±8´+34;$9°?°9°³=AB$9° ±)99°´'$9±;+°)9°³".3$901'777'324&#"#4>32#"'#"&54>7327&547' A4434+_'UKˆ‹LJ4_'CI)ClE./`DbDAUqx+$BI3)MhQQQQœ266D]‰Ã?E?jg;44z{'C2I8$GZ&6K.:ÿñTå 5ž²+±#é²+±é²+±.é´)( +´)C+°6/° Ö±4é°4±%+±é°+ Ö±é²+ +³@+( +±7+±4 ±!99°+³#$9°%°9±#°9±(¶ !%4$9°)°9°.² 3999013527&'765462#"'73254+5254&#"'2*!hÖp!4@ŠrgT:k=Dªª<Ç>F)3X75#5à0Qt2ZLNNTF$-/S5%U@.UXE1*€J4ÙA€ g…Jc‹sX~]B-UJ-tŸ”'½ hŠï"ˆA2å^²+° 3²+±é´ +±é³+°/°Ö±é°2°± +± é° ° Ö±é°/±é±+±°9014&#"32#54+#4632žAER7 f‡]©‡]…b`„F>E\0„VìÒ¢þŒ\qkVÿéOå*—²+²"+±é²+± é´" +±é°+/°%ֱ鰱+´<+² +³@ +°´+°/±,+±´ "$9±± 99±° 9°±%99° ²999°²99901277'.#"326=#5!#'#"&54>lKnCRH/wRW`Qr}$9^54&+Uvaþ·(=Z-eF?}’´´/1>D?ãÐ^rÙ$;;p/Tèèþ³+49Eûÿÿ2”† %2{Ú"²+²+±é°/±+±°901 %!ÁýFIþ\†þâTý&ÿÿ2{}&ŠÑš2{Ú"²+±é²+°/±+±°901% !ìþêþëºü·¤TâþTÚÿÿ2{v'®lÏŠ2¤Ú'²+²+°/°Ö±é±+±±99017-†{þ…TrŒááý²Úþ“ÿÿ2¤'®[Œÿÿ2¤'®—['®Ç[Œÿÿ2¤Ú'Ñoÿ)Œÿÿ2¤Ú'®Œ2¤Ú'²+²+°/°Ö±é±+±±9901 Pþ…{TýŽNááNý&mÿÿ2¤'®[‘ÿÿ2{Ú&®ˆÿÿ2{Ú'®Ôˆÿÿ2{Ú&®Šÿÿ2{Ú'®ÕŠÿÿ2{v&®‹ÿÿ2{v'®Õ‹ÿÿ2@Ú&®Œœÿÿ2@Ú&Œ®šÿÿ2@N'®ñ§'Œœ®ÿÿ2@N'®U§&Œ®šÿÿ2¤3'®‘å'®nŒŒÿÿ2@Ú'‘œ®ÿÿ2@Ú&‘®šÿÿ2@N&®'®F§‘œÿÿ2@N'®š'®ª§‘ÿÿ2¤/'®qè'®†ˆ‘2¬¼n°/°3´+°2² +³@ +± 22°/° Ö´ +° ±+´+°±+´+±+± °9°°9°°9±°901#"'#"&=326=326=3¼B.3""3.B6"0"6"0"6.B''B.ææ""ææ""æÿÿ23*@&®ѯþÃ2¬Ú#²+°/´+°/±+±°901'!5VUþ¥­à––4.2¬Ú"²+´+°/°Ö´ +±+01#ª;­ÚþÒ.2¬Ú"²+´+°/°Ö´ +±+013#28­;ÚþÒ2*’Ú @²+°3°/´ 7+° /°Ö´+°± +´+± +± ±9901"&53265’g’gF>X>ÚIggI,>>,2*’Ú H²+´ 7+²  +³@ +°2° /°Ö´ +° ±+´+± +± ±9901462#4&"2g’gF>X>*IggI,>>,2¬â B°/´7+° /´7+° /° Ö´+²  +³@  +°2± +± ±99012#5264IggI,>>, g’gF>X>2¬‘ O°/´ 7+°/´7+°/°Ö´+°± +´+±+± ±99± ³$9012#"&46264&#"âGhhGIggI*??*,>> hhg’gþæ>X>>X>ÿÿ2¬Ú'¦†¦ÿÿ2®ïÚ'Ñ‚Ñ23¦§.°/´+´+°/°Ö´+´+± +01462"2"0""0U0""0"2¾^ù(°/´+´+°/±+´+±+015!2,¾;;2®^Ú R²+° /°3´ +°2² +³@  +° /°Ö°2´+°2² +³@ +² +³@ +± +0133##5#53ª;yy;xxÚy;xx;2®^ÚF²+´+°2² +³@ +°/°Ö´+² +³@ +² +³@ +± +01##5#5^y;xÚ;ññ;ÿÿ2_'§H(ˆÿÿ2{'§^(Šÿÿ2øÚ'§áŒÿÿ2Â'§«(‘2{Ú!²+²+°3°/±+±°901 3 {þ\þ[_FFÚý&ÚýÊ6ÿÿ2{}&¸Ñš2{Ú!²+°3²+°/±+±°9013 # 2¤¥_þºþºÚý&6ýÊÿÿ2{v'®jϸ2¤Ú²+²+°/±+01 5 2rýŽÏþ1Úþ“þ“Zÿÿ2¤'®[ºÿÿ2¤&º'®—[®Ç[ÿÿ2¤Ú&ºÑoÿ)ÿÿ2¤Ú'®­º2¤Ú²+²+°/±+01!  ¤ýŽrþ1ÏmmZþíþíÿÿ2¤'®[¿ÿÿ2{Ú&®¶ÿÿ2{Ú'®Õ¶ÿÿ2{Ú&®¸ÿÿ2{Ú'®Õ¸ÿÿ2{v'®kÏÃÿÿ2{v'®jÏÄÿÿ2¤Ú&®ºÿÿ2@Ú'®šºÿÿ2¤N&®&º®[§ÿÿ2@N&º'®š®[§ÿÿ2@Ú&®¿œÿÿ2¤Ú'®þ¿ÿÿ2@N&Ë®F§ÿÿ2¤N&̮ȧÿÿ2¤'®lk'®œk¿2¬T"°/°Ö´+±+±²99901-TþÞ"ÒÒ¬««5vw2®mÚ)²+´+°/°Ö´+´+±+013#2;;ÚþÔ2mÚT² +°/´ +² +³@ +°2°/°Ö´+° 2°±+´+±+±° 9± ° 9014&#"#3632#ä! &66 4&86#0(‘m€+0!Ç2´Ú9²+± é²+°3°/°Ö± é° ±+±é±+± ±9901"&53265´ÅøÅT•°•ÚþJv®®v¶þJS}}S¶ÿÿ2´}'Ñ6Õ2´Ú9²+°3²+± é°/°Ö±é°±+±é±+±±99013462#4&"2ÅøÅT•°•¶v®®vþJ¶S}}SþJÿÿ2´v'®ÏÕ2¶Ú/²+±é²+±é°/° Ö±é±+±±9901!2#!5!264&#!2A…¾¾…þ¿Ab‹‹bþ¿ÚÖþÒÖT¥è¥ÿÿ2¶v'®Ï×ÿÿ2¶v'®mÏ'®Ï×ÿÿ2¶Ú'Ñdÿ)×ÿÿ2¶Ú'®Ö×2¶Ú/²+±é²+± é°/°Ö± é±+± ±9901)"&63!!"3!¶þ¿…¾¾…Aþ¿b‹‹bAÖ.ÖT¥è¥ÿÿ2¶v&Ü®9Ïÿÿ2`Ú&®Ó¬ÿÿ2^Ú'®¸Óÿÿ2^Ú'Õª®ÿÿ2^Ú&Õ®¸ÿÿ2^v'®±Ï'Õª®ÿÿ2^v'® Ïáÿÿ2¶Ú&®×ÿÿ2bÚ&×®¼ÿÿ2¶v'®Ïäÿÿ2bv'®Ïåÿÿ2bÚ'ܬ®ÿÿ2¶Ú&Ü®ÿÿ2bv&®'ܬ®³Ïÿÿ2¶v'®&Ü®Ïÿÿ2aÚ'Ü«&®¡®a2m«6² +´7+°/´7+°/°Ö´ +±+± ±9901#"&46;#"3ªÒEaaEÓÓ,55,³FuªvFOlNÿÿ2%Ú'ѸÓÿÿ2%Ú'ѸÕÿÿ2%Ú'Ѹ×ÿÿ2%Ú&ÜѸ2ÚO² +²+±é´  +±é°/°Ö´<+°± +´ <+±+± ±99±°901#"&54632#4&#";”€b€‘eb”R^FE_`DlARPx“Sþ à:nB45Jÿÿ2}&ôÑñ2ÚO² +²+±é´  +±é°/° Ö´ <+° ±+´<+±+± ±99±°901532654&#"#4632#¼lD`_EF^R”be‘€bARJ54Bn:þ ôS“xPRÿÿ2v'®¼Ïô2ÚO²+±é² +´ +±é°/°Ö´<+°± +´<+±+± ±99±°901#"32653#"&5463”lD`_EF^R”be‘€b™RJ54Bn:àþ S“xPRÿÿ20v'®ŠÏöÿÿ2—x'®ñÑ'®!Ñö2ÚO²+±é² +´ +±é°/° Ö´ <+° ±+´<+±+± ±99±°90132#"&5332654&+¼€b€‘eb”R^FE_`Dl™RPx“Sôþ :nB45Jÿÿ2)v'®Ïù ÿÿ2œÚ&®ò~ÿÿ2ÊÚ'®$òÿÿ2ÊÚ&®ô¬ÿÿ2œÚ&ô®öÿÿ2Êv'®hÏýÿÿ2œv'®¼Ïþÿÿ2œÚ&®ö~ÿÿ2ÉÚ'®#öÿÿ2­v'®Ïÿÿ2Év'®‰Ïÿÿ2ÊÚ&®ù¬ÿÿ2œÚ'®öùÿÿ2Êv'®œÏÿÿ2¬v'®Ïÿÿ2ÉÚ&®¡&®aù«2l7ÚZ² +²+´+°/´+°/° Ö´ +° ±+´+² +³@ +±+± °9±°90132#"&533264&+‚+ŠR83H8# #//#+Lp6:7(÷#42l7ÚZ² +²+´+°/´+°/°Ö´+² +³@ +°± +´ +±+± °9±°901#"326=3#"&543ç+#//# #8H38RŠL84#÷þñ(7:6pÿÿ2’Ú'Ñ%òÿÿ2’Ú'Ñ%ôÿÿ2’Ú'Ñ%öÿÿ2YÚ'Ñìù2ÚE²+²+± é²  +³@  +°/°Ö´<+°±+´<+±+±°9014632#4&#"#2‘eb”R^FE_RPx“Sþ à:nB42ÿÿ2}&Ñî2ÚE² +²+±é² +³@ +°/° Ö´ <+° ±+´<+±+± °901#54&#"#4632R_EF^R”be‘224Bn:þ ôS“xÿÿ2v'®¼Ï2ÚE²+±é² +³@ +² +°/°Ö´<+°± +´ <+±+± °90175332653#"&2R_EF^R”be‘È224Bn:àþ S“xÿÿ20v'®ŠÏÿÿ2—x'®ñÑ'®!Ñ2ÚE²+± é²  +³@  +²+°/°Ö´ <+° ±+´<+±+± °901%#"&53326=3‘eb”R^FE_RÈPx“Sôþ :nB42ÿÿ2.v'®Ïÿÿ2.Ú&®ÿÿ2ÉÚ'®#ÿÿ2ÉÚ&®«ÿÿ2.Ú'®ˆÿÿ2Év'®gÏ'«®ÿÿ2.v'®¼Ï&®ˆÿÿ2/Ú&®ÿÿ2ÉÚ'®#ÿÿ2Av'®›Ï&®ÿÿ2Év'®ŠÏ&®#ÿÿ2ÉÚ&®«ÿÿ2/Ú'®‰ÿÿ2Év'®›Ï'«®ÿÿ2?v'®Ï&®™ÿÿ2ÉÚ&®¡&®a«2l7ÚF²+°/´ +²  +³@ +°/°Ö´ +° ±+´+±+± °901#"&5332657R83H8# #/Ü6:7(÷#2l7ÚF²+° /´+² +³@ +°/°Ö´+°±+´ +±+±° 9013326=3#"&28/# #8H38RÜ#÷þñ(7:2Ú/²+²+±é°/°Ö´<+² +³@ +±+01#!5RþfÚý&ˆRÿÿ2}&,ÑÜ2Ú/²+²+±é°/°Ö´<+² +³@ +±+01!!#2ìþfRÚRýxÿÿ2v'®¼Ï,2Ú/²+±é²+°/°Ö´<+² +³@ +±+01)5!3þšRRˆÿÿ20v'®ŠÏ.ÿÿ2—x'®ñÑ'®!Ñ.2Ú/²+±é²+°/°Ö´<+² +³@ +±+0133!2RšÚýxRÿÿ2.v'®Ï1ÿÿ2Ú&®*ÿÿ2ÉÚ'®#*ÿÿ2ÉÚ&®,«ÿÿ2Ú'®x,ÿÿ2Év&®-«ÿÿ2v'®x&,®îÏÿÿ2Ú&®.ÿÿ2ÉÚ'®#.ÿÿ20v'®ŠÏ&®.ÿÿ2Év'®ŠÏ'®#.ÿÿ2ÉÚ&®1«ÿÿ2Ú'®x1ÿÿ2Év'®›Ï&®1«ÿÿ2.v'®Ï'®ˆ1ÿÿ2ÉÚ&®¡&®a1«2m(Ú0²+°/´+°/°Ö´+² +³@ +±+01332;»mmþÍ:2pâÐ B°/´ 7+°/´7+° /°Ö´ +²  +³@ +°2± +± ±9901"&463"3âIggI,>>,pg’gF>X>2m(Ú0²+°/´+°/°Ö´+² +³@ +±+01#533(ö»;m:32mÚi²+´+² +³@ +°/´+°/° Ö°2´ +´+° ±+´+°2±+±³$9±±99014>54#"#63232%56%B4r2@3>3¤m(A+&/7{:.&F).22ÚX²+±é²+± é²  +³@  +°/°Ö°2± é° ±+±é°2±+± ³$9± ±990134>54&#"#632!2)AOPA)P<… Xãe~3NYN3\;cE<89L,9I¦öt\4fKK8;P2–ìF²+±é° /± é°/°Ö´<+°±+´<+±+±°9± ±9901332654&#!5!2#"&5ýRJ54Bn:þ–~S“xPRblD`_EF^R”be‘€bÿÿ2–&IÑûÿ2–ìF²+±é° /± é°/°Ö´<+°±+´<+±+±°9± ±9901#"&5463!!"326=ËRPx“S~þ–:nB45Jb€b€‘eb”R^FE_`Dlÿÿ2–ˆ&I®Óá2–ìF² +± é°/±é°/°Ö´<+°±+´<+±+±°9± ±9901754632#!5!2654&#"ýRPx“Sþ‚j:nB45JŠ€b€‘eb”R^FE_`Dlÿÿ2–ˆ&K®dáÿÿ2–ˆ&K'®Êá®úá2–ìF²+± é°/±é°/°Ö´<+°±+´<+±+±°9± ±9901%#54&#"3!!"&54632ËRJ54Bn:jþ‚S“xPRŠlD`_EF^R”be‘€bÿÿ2–ˆ'®ŒáNÿÿ22ý&®VGœÿÿ2 ý'®dVGÿÿ2 ì&®ENtÿÿ2–ì'®ðENÿÿ2 ˆ'®áRÿÿ2–ˆ'®ŒáSÿÿ2–ˆ'®öá'®&áN2l qS° /´ +°/´+² +³@ +°/°Ö´+°±+´+±+±°9± °901#54&";!"&5463284#÷þñ(7:6p¼+#//# #8H38RŠ2m’Ú@²+°3° /´+°/°Ö´+°±+´ +±+±± 990126=3"&=hHdH6g’gÚ½2HH2½½IggI½2l qS° /´ +°/´+² +³@ +°/°Ö´+°±+´+±+±°9± °9015432#!532654&"Àp6:7(þñ÷#4¼+ŠR83H8# #//#+2–ì9²+±é° /± é°/°Ö´<+² +³@ +±+± °901!#532654&#!5!2Î224Bn:þ–~S“xR_EF^R”be‘ÿÿ2–&\Ñýÿ2–ì9²+±é° /±é°/°Ö´ <+²  +³@  +±+± °9013"&5463!!";úPx“S~þ–:nB42‘eb”R^FE_Rÿÿ2–ˆ&\®ðá2–ì9²+±é°/±é°/° Ö´<+²  +³@  +±+±°9012#!5!2654&+5ÎPx“Sþ‚j:nB42ì‘eb”R^FE_Rÿÿ2–ˆ'®2á^ÿÿ2–ˆ'®˜á'®Èá^2–ì9² +± é°/±é°/°Ö´<+² +³@ +±+± °9013#"3!!"&546ú224Bn:jþ‚S“xìR_EF^R”be‘ÿÿ2–ˆ'®ðáaÿÿ22ý'Zœ®Vÿÿ2 ý'®dVZÿÿ2 ý&\t®Vÿÿ22ý&\®ŒVÿÿ2 ˆ'®dáeÿÿ22ˆ'®ðáfÿÿ2–ý&®V^ÿÿ2 ý&^®dVÿÿ2–ˆ'®2áiÿÿ2 ˆ'®2ájÿÿ2 ý&at®Vÿÿ2–ý&a®ðVÿÿ2 ˆ&®V&at®2áÿÿ2–ˆ'®ðV&a®¾á2l q=° /´+°/´+°/° Ö´+² +³@ +±+±° 901";!"&546¢#÷þñ(7:q8/# #8H38RmÚ /²+° /°Ö°2´+°2± +±´ $901%7'%’’þúŸŸ’$L65bUW_442>Ú ²+²+° /± +01 ->þÐ0ýô\þ¤ þÐmžt[«°½Yq2ÆÚ3²+²+´  +±é°/°Ö± é° ±+±é±+01!".=3;rAo[5TƒUhE3rThUƒT5[oAÚþkXJ£Eh<ÿÿ2Öv'®0Ïxÿÿ2>v'®˜Ï'®ÈÏx2ÆÚ3²+²+´  +± é°/° ֱ鰱+±é±+012#54&+†Ao[5TƒUhÚþ»43,J?A=à  +(.971"*%1:8;2mÚ 3²+°/´ +° /°Ö´+°± +´+±+013#"#5463Ò1;+:1\DÚÒ%%QGCA2m˜Ú %²+°/´ +° /°Ö´+± +01"&=3;;mœ6‚]Qm›ndX]‚62W Ús²+²+´+²+° /´+°/´+°/°Ö´+³+´+°±+´ +±+±± 99±°9°° 901&+532#"&5432ËDA7FZ44,|4%ï#È’9C5@)*@' 2W Ú}² +²+´ +² +°/´+°/´+°/°Ö´+°± +´+³ +´+°/´+±+±±99±°9°°901#"&546353#"32654.pu,44ZF7AD%%ï@*)@5C9’ÈO@ 2)Fw²+°/±é°/´+°/± é°/°Ö´+³ +± é°±+´+³+±é±+±³  $9±³$9±°901462"462"2#54&+5Ò$$º$$(D\1:+;$$$$¢ACGQ%%Òÿÿ2ÀF&’¿ÿÿ2ÊF&’Üÿÿ26F&’ùÿÿ26F&’2 Úc² +±é²+±é° /°Ö´<+°±+´<+°±+´ <+±!+±°9±° 9±µ$901%326=3#"&54&#"#54632ÈE42GR~MLE42GR~MLú;mT6‘¥NzŒP;mT6‘¥NzŒP2 Úa²+±é²+± é° /°Ö´<+°±+´<+°± +´<+±!+±°9± °9± ³$901%4632#54&#"#"&=3326vLM~RG24ELM~RG24EúPŒzN¥‘6Tm;þüPŒzN¥‘6Tmÿÿ2 v&˜®ÖÏ2$â+–²+°3±é° 2°!/°3±é°2°,/°Ö±$é²$ +³@$ +°$±+±é² +³@ +±-+°6ºÁlò—+ °°À± ù° À³ ....³ ....°@±$±99±!±9901%&5463232654&'52#"&/.#"ê„XEn >,-?@/WloSVa H%1P %*TT ×w‹TT~=+GNPTSur|K^|64PX- ÿÿ2$~'®Aך2$â+–²+°+3±é°2°/° 3±é°&2°,/°Ö±é² +³@ +°±+±)é²) +³@+ +±-+°6º>½óZ+ °"°#À±ù°À³"#....³"#....°@±±&99±±)9901%>54&#"#"&5463326?>32:*% P1%H aVSolW/@?-,> nEX„êT -XP46|^K|ruSTPNG+=~TT‹w× ÿÿ2$~&œ®A×ÿÿ2·Ú'—«®ÿÿ2¸Ú&—®ÿÿ2·Ú'˜«®ÿÿ2¸Ú&˜®ÿÿ2·v&®'˜«®Ïÿÿ2¸v'®&˜®ÖÏÿÿ2´â&®šÿÿ2´â'®šÿÿ2´~&®›ÿÿ2´~'®›ÿÿ2´â&®œÿÿ2´â'®œÿÿ2´~&®ÿÿ2´~'®2k ¦* °/°*3´+°2°/° 3´+°%2°+/°Ö´+² +³@ +°±+´(+²( +³@* +±,+°6º>Ñó¾+ °!°"À±ù°À³!"....³!"....°@±±%99±±(99012>54&#"#"&546332?>32†  4 0 ?86JG9*)? I-:Vš¡ :4##R=0QJMS6743/DS77[OŠ2ÒÚ+²+²+´ +±é°/°Ö±é°2± +0133#!kgùùTþ´Úþ½þiCÿÿ2Ò}&¯Ñ22ÒÚ+²+²+´ +±é°/°Ö°2±é± +01!#3™9þ´TùùÚþiþ½—Cÿÿ2Òv&¯®Ï2ÒÚ+²+²+´ +±é°/°Ö±é°2± +01!!3#kþÇLTùù—Cþiþ½ÿÿ2âv'®<ϱÿÿ2Jw'®¤Ð'®Ôб2ÒÚ+²+²+´ +±é°/°Ö°2±é± +013##3!™gùùTLC—þ½ÿÿ2âv'®Ï´ÿÿ2mÚ'­›®ÿÿ2nÚ&­®Èÿÿ2mÚ'¯›®ÿÿ2nÚ&¯®Èÿÿ2mv&®'¯›®›Ïÿÿ2nv'®È&¯®Ïÿÿ2mÚ&®±›ÿÿ2nÚ'®È±ÿÿ2}v'®×ϼÿÿ2nv'®<Ͻÿÿ2mÚ&®´›ÿÿ2nÚ'®È´ÿÿ2mv'®‹ÏÀÿÿ2~v'®ÏÁÿÿ2mÚ&®¡&®a´›2mBÚ(²+°/´+°/°Ö°2´+± +01#7#533zH››;ÕmÈ¥j2mÇÚ D²+°3° /± +°6ºÂîN+ °.°À± ù°À² ...³ ....°@01'#7#'ýV@5l_ai4>mÃÃmêêþ“Ã2nžÚ R²+° /°3´ +°2² +³@  +° /°Ö°2´+°2² +³@ +² +³@ +± +0133##5#53Ê;™™;˜˜Ú•;œœ;2nšÖ ''7'7p*ŠŠ*ŠŠ*ŠŠ*ŠÖ*ŠŠ*ŠŠ*ŠŠ*Š2 ÈL²+±é° /±é°2°/°Ö´1+°±+´ <+²  +³@ +±+±± 990126=!!"&=ƒEhI“þ¿}¤xÈÒE_`DÒR”b€€bæ2 ÈJ²+±é° /± é°2°/°Ö´ <+² +³@ +° ±+´1+±+± °9013#"&=!5!265»QzPR}þ¿“IhEÈæb€€b”RÒD`_E2ÿþ ÆL²+°3± é°/±é°/° Ö´<+²  +³@  +°±+´1+±+±± 990154&"!5!5462»EhIþmA}¤xÒE_`DÒR”b€€bæÿÿ2ÿþ k'ѾþîÍ2ÿþ ÇJ² +°3± é°/±é°/°Ö´1+°± +´ <+² +³@ +±+± °901#54632!!54&#"ƒQzPR}AþmI44Eæb€€b”RÒD`_Eÿÿ2ÿþ d&Í®½2úÚH² +²+±é´  +± é°/° Ö°2´ <+° ±+´<+±+± °901532+#3264æb€€b”RÒD`_E‰QzPR}þ¿“IhEÿÿ2úv'®—ÏÏ2úÚJ²+±é²+´  +± é°/°Ö°2´ <+° ±+´<+±+±± 990173264&+332+2ÒE_`DÒR”b€€bæQEhI“þ¿}¤x2úÚJ² +²+±é´   +± é°/°Ö´<+°± +´<+°2±+±± 9901#";##"&46;úÒE_`DÒR”b€€bæ‰EhIþmA}¤xÿÿ2úv'®ðÏÒ2ÿÿúÚJ²+±é² +´  +±é°/°Ö´<+°± +´ <+°2±+± ±9901%#"&546;3#"3úæb€€b”RÒD`_EQQzPR}AþmI44Eÿÿ2v'®wÏ&®Ò‡ÿÿ2–v'®ðÏ'®ðÒ2m%ÚT²+´+²+´ +²  +³@ +°/°Ö´+°± +´+°2±+±± 9901#";#5#"&46;%F2A@3F:HWYFT¢(F"¥lFpK2m8Ú /²+° /°Ö±22´+°2± +±² 999017'5572’’ŸŸþú’#L65bUW_442>Ú ²+²+° /± +01-5 5%20þÐ þ¤\ýô0mžt[«°½Yq2ÿÚb²+²+°3±é´  +±é°/°Ö±é°±+± é±+±² 999° ± 99± ° 9±² 99901 &5462+264&"ÿþ\þõdŒddF‚Fýå3F33FÚý&Ï3.FddŒdâ6‡F33F3ÿÿ2ÿ}&ÜÑ 2ÿÚb² +°3±é²+´  +±é°/° ֱ鰱+±é±+±² 999°±99±² 999±°901!#32"&547264&"ÿ^þº‚FddŒd Õ3F33F6âdŒddF5,ÏýóF33F3ÿÿ2ÿv&Ü®ðÏ2Ú`²+² +±é´ +±é°/° Ö°2±é°±+±é±+±² 999±°9°±99°² 9990135'"&4632%"32654&20ÜdŒddF/1ÊýÖ$22$#34^LˆFddŒdþîÜ3#$22$"4ÿÿ2N&Þ®0§2Ú`²+²+±é´  +±é°/° ֱ鰱+±é°2±+±² 999± °9°± 99°² 99901! 632"&="32654&ý,Ê1/FddŒdÜ0ª"43#$22ªdŒddFˆþ´(4"$22$#3ÿÿ2N&à®0§ÿÿ2¢N'®š§'àœ®Cÿÿ2šN'®0§&à®ôC2yŸÚG²+´+° /´+°/°Ö´+°2±+± ²999°° 9°°901%7632#"&'6264&"œþ–è#22# /Zµ<΄2F2*2K2´Út²+±é² +°3±é´ +±é° /°Ö±é°2°±+± é° ±+±é±!+±´ $9± ±99±°9°± 9901"&5462#"'265264&"´ÅøÅdŒddF-)•°•þ&3F33FÚþJv®®v FddŒdyS}}S¶‡F33F32´Út²+±é²+°3±é´  +±é° /°Ö±é°± +±é°±+°2±é±!+± ±99±´ $9± °9°± 9901326=#"&462"&5$4&"22T•°•)-FddŒdÅøÅ.3F33FÚþJS}}SydŒddFþôv®®véF33F32´Út²+°3±é²+±é´  +±é° /°Ö±é°2°±+± é° ±+±é±!+±´ $9± ±99±± 99° °901!#4&"632"&5462264&"´T•°•)-FddŒdÅøÅýÒ3F33F¶S}}SydŒddF v®®véF33F32´Út² +°3±é²+±é´  +±é° /°Ö±é°± +±é°±+°2±é±!+± ±99±´ $9±± 99°°9013462"&463254&"$4&"22ÅøÅdŒddF-)•°•Ú3F33F¶v®®vþôFddŒdyS}}SþJ‡F33F3ÿÿ2´v'®Ïçÿÿ2´v'®Ïè2´Úw²+±é²+±é°2´  +±é° /°Ö°2±é°±+± é° ±+±é±!+±± 99° °9± ±99°°9°³ $90135!264&+"&46;2#"2642^S}}S!dŒddF´y««y‘F33F3T°Ò°)-FddŒdÔþÎÔ†3F33Fÿÿ2´v&ë®Ï2´Úw²+±é²+±é°2´  +±é° /°Ö±é°±+±é°±+± é°2±!+±°9°± 99± ±99°°9°³ $901)"&6;2"&547#"3!"264´þ¢y««y´FddŒd!S}}S^‡F33F3Ô2ÔdŒddF-)°Ò°23F33Fÿÿ2´v&í®9Ïÿÿ2Pv'®£Ï'휮ÿÿ2v'®Ï&í®x2mhÚˆ²+´+°2°/´ +°/´+° /°Ö´ +° ±+´+°±+´+°2±!+±±99±°9± ± 99°± 99°°9°°901264&"#";#"&546;2"&54ôB)33)¤¤>-,?†. . n19,+:,4–?-,??,2mÜÚ'/7˲+°#3´7+°.2°/´+² +³@ +°/´+²*2222°8/°Ö´1+°1±5+´+°± +´)+°)±-+´&+°&±+´+°±+´ +±9+±51°9°°9±) °9°-°#9°&°9±°9±7³ &$901326=3#"5!"&546323&54632&264&"264&"ûW85)`þ€->>-,?J>-,?¢ . .þÞ . .819,+:,4–?-,??,,??,6. . . . 2TÚ'ƒ²'+²"+±é´ '" +±é´'" +±é² +³@ +°(/°Ö±é°±+±é°± +±é°±'+±&é±)+±± 99° ²"999± ²999014&#"3254&#"#432#"&54632#oNRk<5oTs2I+L1Vužsp¡TÌNoTKLKy&“S,$D=%ƒemƒŸoþ42TÚ'ƒ²+²+±%é´  +± é´ +±é² +³@ +°(/°Ö±é°±+±é°±+±é°±"+± é±)+±²%999°± 99±² "99901#4632#".54632#4&#"32654&#"†T¡psžuV1L+I2sTo532#"&53†oNRk<5oTs2I+L1Vužsp¡TNoTKLKy&“S,$D=%ƒemƒŸoÌ2–fd²+± é²+±é´ +±é°/°Ö´<+°± +´<+°2²  +³@  +°2±+± °9± ±9901!5!332654&#!5!2#"&5–ýœdþgRJ54Bn:þ–~S“xPRRþülD`_EF^R”be‘€b2–fd²+±é²+±é´ +±é°/° Ö°2´<+² +³@ +°2°±+´<+±+±°9±± 99015!#"&5463!!"326=2dËRPx“S~þ–:nB45JRR²€b€‘eb”R^FE_`Dl2–fd²+±é²+±é´ +±é°/°Ö´<+°±+´ <+°2² +³@ +°2±+±°9±± 99015!54632#!5!2654&#"2dþgRPx“Sþ‚j:nB45JRRþv€b€‘eb”R^FE_`Dl2–fd²+±é²+±é´  +±é°/°Ö°2´ <+²  +³@  +°2° ±+´<+±+± °9± ±99015!#54&#"3!!"&546322dËRJ54Bn:jþ‚S“xPRRRþvlD`_EF^R”be‘€b2m Úp²+´+°/´+° /´+²  +³@  +°/°Ö°2´ +²  +³@ +°2° ±+´+±+± °9± °901!5!#54&";!"&54632 þ’nŽ84#÷þñ(7:6p¢8þã+#//# #8H38RŠ2ÒÚB² +± é²+´  +±é°/°Ö´<+² +³@ +±+± °901'5!";#"&5463 |BþZ:nB422Px“SìztþÀ^FE_R‘eb”ÿÿ2ÒÚ& '®¸32ÒÚB²+² +± é´ +±é°/°Ö´<+² +³@ +±+± °9017!2654&+532#ø|þ¾¦:nB422Px“Sîzt@^FE_R‘eb”ÿÿ2Òì'® E )2ÒÚB²+²+± é´ +±é°/°Ö´ <+²  +³@  +±+± °901%#"&546;#"3!5 ôS“xP224Bn:¦þ¾î”be‘R_EF^þÀtÿÿ2Òë& +®(D2m Ú?²+´+°/´ +°/°Ö´ +²  +³@  +±+± °901#"&5463";5Œ)697:A÷¿ó>25B6A:¼L2LÚW² +²+´ +°3± é°2´ +±é°/° Ö° 2±é±22² +³@ +²  +³@ +±+01333##5#535!kgùùzzTxxþ´Úþ½ËTxxTw2LÚW²+²+´  +°3± é°2´  +±é°/°Ö± 22±é°2² +³@ +² +³@ +±+01 !3##5#53539þ´xxTzzùùÚþiwTxxTËCÿÿ2Lv& /®zÏ2LÚU²+²+²+° 3±é° 2´ +±é°/°Ö°2± é±22²  +³@ +² +³@ +±+01!!5#53533##kþÇLxxTzzùù—wTxxTËþ½ÿÿ2Lv'®<Ï 12LÚU²+²+²+° 3±é° 2´ +±é°/°Ö±22±é° 2² +³@ +² +³@ +±+01!##5#53533#!gùùzzTxxLCËTxxTwÿÿ2Lv'®jÏ 32mRÚQ²+°/´+°/° 3´+° 2°/°Ö°2´+° 2² +³@ +² +³@ +±+01#7#5#53533#3¸HpkCC6DD§m‘i6==632¶Ú _² +° 3±é²+´ +±é°/° Ö± é±22° ±+±é±+± ± 99± ° 9°±99°°9013632#"'#6264&"2T1=PrrP=1TT@\@@\Úþ‹#s¢s##ò\@@\@2ÑÚ?²+² +°3´+°/°Ö±é° 2² +³@ +±+± ± 9901#"'#3632ÑtMP:TT8NSrSn8þuÚ76v2ÑÚ=²+° /°3´+°/° Ö°2±é²  +³@ +±+± ± 9901746323#5#"&2tMP:TT7OSrÆSn8‹ý&76v2ÑÚ=²+°/°3´ +°/°Ö±é° 2² +³@ +±+± ± 9901%#"'#3632ÑrSN8TT:PMtÆOv67Úþu8n2ÑÚ?² +²+°3´ +°/° Ö°2±é²  +³@ +±+± ± 9901463253##"&2rSO7TT:PMtOv67ý&‹8n2Ú @² +²+±é´ +±é° /° Ö´<+°2² +³@ +°2± +01!!!!#2ìþfšþfRÚRóRþ½2Ú @²+±é²+´ +±é° /°Ö°2´<+² +³@ +°2± +01)5!5!5!3þšþfšRRóRC2Ú @²+±é²+´ +±é° /°Ö´<+°2² +³@ +°2± +0133!!!2RšþfšÚþ½RóR2Ú @²+² +±é´ +±é° /°Ö°2´<+² +³@ +°2± +01#!5!5!5RþfšþfÚý&CRóR2ìÚ^²+²+° 3±é´ +±é°/°Ö´<+°±+´<+°± +´ <+±+±°9± °9012>=3"&=##$ , RHŠHNRÚ½ ½½MccMkýxÚ2ìÚ^²+° 3±é²+´ +±é°/° Ö´ <+° ±+´<+°±+´<+±+± °9±°901354."#546233ú , RHŠHNR½ ½½MccMkˆý&2ìÚ^²+° 3±é²+´  +±é°/°Ö´<+°±+´<+°± +´ <+±+±°9± ° 901!#335462#54."$òRNHŠHR , ÚýxkMccM½½ 2ìÚ^²+²+° 3±é´  +±é°/° Ö´<+°±+´<+°±+´<+±+± ° 9±°9013##"&=32>5úòRNHŠHR , Úý&ˆkMccM½½ 2ÿÚ (²+²+°3° /°Ö±é± +±°901 ##37ÿÑ¡T‰ssÚþ“ý{ÚÉÉ2ÿÚ (²+°3²+° /°Ö±é± +±°901333#'2Ñ¡T‰ssmþè…ý&ÉÉ2ÿÚ (²+°3²+° /°Ö±é± +±°901!#'#33ÿ^ss‰T¡ÉÉÚý{2ÿÚ (²+²+°3° /°Ö±é± +±°901373##2^ss‰T¡ÚÉÉý&…þè2DÚa² +±é² +´ +±é² +³@ +°/°Ö±é°±+±é°±+± é±+±±99±±990146233#"&54&"2g’g1-TTU]6L6 IggIFo†ý&˜q&66&2DÚa² +± é² +´ +±é² +³@ +°/° Ö± é° ±+±é°±+±é±+±±99± ±9901#4&"+3265462DT6L6]UTT-1g’g &66&q˜ÚýzoFIgg2DÚa² +² +± é´ +±é² +³@ +°/°Ö±é°±+±é°± +± é±+±±99± ±9901326546;#""&2T6L6]UTT-1g’gÑ&66&q˜ý&†oFIgg2DÚa² +² +±é´ +±é² +³@ +°/° Ö± é° ±+±é°±+±é±+±±99±±9901"&54&##32265Dg’g1-TTU]6L6ÑIggIFoýzÚ˜q&66&2{Ú ,²+²+°3´ +±é° /± +±°901!3 373H¢^þ\þ[_ÒttÁý&Úþ“ÉÉ2{Ú ,²+°3²+´  +±é° /± +± °901!# #'zþ¸¢^¤¥_ÒttþçÚý&mÉÉ2¤Ú ²+° /°Ö±é± +01 57'72rýŽçç;”Úþ“þ“Z‰‰»°Xÿÿ2¤Ú'Ñÿ) Mÿÿ2¤Ú&® M2¤Ú ²+° /°Ö±é± +01! %5¤ýŽrççþÅ”mmZ‰þ쉻°X2{Ú ,²+²+°3´ +±é° /± +±° 9013 3!!^þ\þ[_90þFÝÚý&ÚcTþ2{Ú ,²+°3²+´ +±é° /± +±° 9013# #'!7!^¤¥_9ýæ0ºÝÚý&cT2¤Ú ²+° /°Ö±é± +015 57%2rýŽPT+€Zþ“þ“Z0Æ1þœ²ÿÿ2¤Ú& SÓîÿÿ2¤Ú'®Í S2¤Ú ²+° /°Ö±é± +01% '¤ýŽrPTþÕZZmmZ0þ:1d²2{Ú7²+²+±33° /°Ö´<+± +±°9±±9901 33{þ\þ[_RÚý&Úþïþï2{Ú7²+±33²+° /°Ö´<+± +±°9±±99013 ##2¤¥_þãRþãÚý&ïþïþ2¤Ú ²+°/±é° /± +±°901 5%!5!%2rýŽŠþvŠþvÚþ“þ“ZêRê2¤ÚL² +°/°3±é° 2² +³@ +² +³@ +°/°Ö°2´+° 2±+±°901!#5#5353!%5 5¼þù;HH;þvrýŽDmmRmmêZþ“þ“Z2¤Ú i²+°/°3±é°2³ +´ +°/°Ö±22±é² +³@ +°2°±+´ +±+±´ $9± °901#5462"7#64'3%5 5™ gz#.##.í‰ ‰þvrýŽ–.RB2++2).êZþ“þ“Z2¤Ú ²+°/±é° /± +±°901! !!¤ýŽrþvŠþvŠmmZêRê2{Ú N²+²+±33´ +° 3±é°2°/°Ö°2´ <+°2±+± °9±± 9901 3333#'#{þ\þ[_šƒRƒšÊSRSSÚý&Úþô þô þ¢‘‘‘2{Ú N²+±33²+´  +°3± é°2°/°Ö° 2´<+°2±+±°9± ± 99013 ####353'2¤¥_šƒRƒšÊSRSSÚý& þô þô^‘‘‘2¤Ú <²+°/°3±é° 2°/°Ö° 2´<+° 2±+±°9°° 9015 575#535372rýŽªªªRŽŽŽ€Zþ“þ“Ze…R…1TRTT2¤Új²+° /±33± é±22² +³@  +² +³@ +°/°Ö° 2´+°2°±+°2´<+°2±+± °9°°90137!#5#535335'5 575.ŽŽŽþß;..;AªrýŽªêTRTTmmRmm…eZþ“þ“Ze…2¤Ú  ”²+°/°3± é° 2³+´+°!/°Ö±22´+² +³@ +°2°±+´0+°± +°2´<+° 2±"+± °9±°9° ´$9°°9°± 990164'5'5 5777%462"&'#5ð ¾rý޾Rzzzþ¶.. -C,xqZþ“þ“ZqIRHH)**))B.R2¤Ú <²+° /°3±é°2°/° Ö°2´ <+°2±+± ° 9°°901% 3#'5#75¤ýŽrªªªRŽŽŽZZmmZe…R…1TRTT2 Ú:² +±é²+±é°/°Ö±é°±+± é±+±± 99012657 &5†¥è¥TÖþÒÖ†þ½b‹‹bCTþi…¾¾…—2 Ú:²+±é² +±é°/°Ö±é°±+±é±+±± 9901%4&"46 ¸¥è¥TÖ.ÖTCb‹‹bþ½T—…¾¾…þi2 Ú:²+±é²+±é°/°Ö±é°±+± é±+±± 99017!264&#!'!2#!†Cb‹‹bþ½T—…¾¾…þiT¥è¥TÖþÒÖÿÿ2 Ú'ÑÒÿ) eÿÿ2 Ú'® e2 Ú:² +±é²+±é°/° ֱ鰱+±é±+±± 9901!"3!!"&63!¸þ½b‹‹bCTþi…¾¾…—†¥è¥TÖ.Ö2 ÚE²+±é²+°3°/°Ö± é° ±+±é±+± ²999±± 9901% &5-2652mmÖþÒÖmþç¥è¥ÚÓÓþi…¾¾…c¢þûb‹‹b2 ÚE²+°3²+±é°/°Ö±é°± +±é±+± ²999±± 9901!%46  4&" þ“þ“Ö.Öþ“¥è¥ÓÓ—…¾¾…c¢b‹‹bþû2 Ú1²+± é²+±é°/°Ö±é±+± ²999013!2# !264&#!2ÓÓ—…¾¾…c¢b‹‹bþûmmÖþÒÖmþç¥è¥ÿÿ2 Ú'Ñšÿ) kÿÿ2 Ú'®ª k2 Ú1²+±é²+± é°/°Ö±é±+± ²99901!"&63!"3! ÓÓþi…¾¾…c¢þûb‹‹bÚþ“þ“Ö.Öþ“¥è¥2 ÚJ² +±é²+°3´  +±é°/°Ö±é°2°±+°2± é±+±± 990126= &53!5†¥è¥TÖþÒÖT2ÑŽb‹‹bŽ þi…¾¾…—µµ2 ÚJ²+°3² +±é´ +±é°/°Ö±é°2°±+°2±é±+±± 990154&"46 #5!¸¥è¥TÖ.ÖTýÎ Žb‹‹bŽþ÷—…¾¾…þiµµ2 Ú@²+±é°2²+±é°2°/°Ö±é°±+± é±+±± 9901%3264&+%!2#!53#;Žb‹‹bŽþ÷—…¾¾…þiµµT¥è¥TÖþÒÖT2ÿÿ2 Ú'Ñhÿ) qÿÿ2 Ú'®x q2 Ú@² +±é°2²+±é°2°/° ֱ鰱+±é±+±± 9901#";!"&63!#3Žb‹‹bŽ þi…¾¾…—µµ†¥è¥TÖ.ÖTýÎ2®^Ú>²+°/´+°2°/°Ö´+² +³@ +² +³@ +± +01535332y;x®;ññ;2 Ú^²+°3±é°2² +±33°/° Ö± é° ±+±é°±+±é± +± °9°°9°°9±°901%#"'#"&533265332653 hIO77OIhT7&%7T7%&7T²Jh>>hJ(ýØ&66&(ýØ&66&(2 Ú^²+± 33²+°3±é°2°/°Ö±é°±+±é°± +± é± +±°9°°9° °9±°9014632632#4&#"#4&#"#2hIO77OIhT7&%7T7%&7T(Jh>>hJýØ(&66&ýØ(&66&ýØ2 Ú R² +±é² +±é´ +±é°!/°Ö°2± é°2±"+± °9±° 9°°9°°9012#!5!2654&#!5!2654&#!5îGk##kGþD¼$88$þD¼$88$þDÚ€L*__*L€TO)(OTO()OT2 Ú(‚²+±é²+±é´#$ +°3±#é°2²#$ +³@#! +²$# +³@$& +°)/°!Ö°%2´ +°'2° ±+°2±é° 2±*+±°9±#°9°$°9°° 9012654&#!5!2#!5!2654&#!#5#5353î$88$þD¼Gk##kGþD¼$88$þù;zz;–P()OT€L*__*L€TO)(PmmRmm2 Ú 0¨²$+±%é²+±é´ $ +°3± é°,2° ³ +´+°1/° Ö±$22± é² +³@ +°2° ±+´+°±)+°2± é°2±2+±)°-9° °9±%± )99± ´$9±±9901462"'#5!2654&#!5!2#!5!2654&+64'¬#.##.6 g¼$88$þD¼Gk##kGþD¼$88$» T2++2)k.RP()OT€L*__*L€TO)(P.2 Ú R²+±é² +±é´ +±é°!/°Ö° 2±é°2±"+±°9±°9°°9°° 9013"&5467.5463!!"3!!"3!äGk##kG¼þD$88$¼þD$88$¼€L*__*L€TO)(OTO()OT2 Ú`²+°3±é° 2²+±é° 2°/°Ö±é°±+± é° ±+±é± +±°9° °9°°9±°9013265332657#"'#"&5†7&%7T7%&7ThIO77OIh†þ,&66&Ôþ,&66&ÔTýØJh>>hJ(2 Ú`²+±é°2²+°3± é°2°/°Ö±é°± +±é°±+±é± +± °9°°9°°9± °901%4&#"#4&#"4632632L7&%7T7%&7ThIO77OIhTÔ&66&þ,Ô&66&þ,T(Jh>>hJýØ2 Ú `² +±é²+±é´  +±é°!/° Ö±é° 2°±+° 2±é°2±"+±°9±°9° °9°°9017!2654&#!5!2654&#!'!2#!†h$88$þ˜h$88$þ˜T¼Gk##kGþDTO)(OTO()OT€L*__*L€2 Ú(²+±é²+±$é´% +°3±é°2²% +³@ +²% +³@%' +°)/°Ö±é°$2°±+°&2´+°2°±+° 2± é°2±*+± °9±° 9°%°9°$°901!2#!7!2654&+#5#732654&#!3532¼Gk##kGþDTh$88$£;ŠÅ£$88$þ˜Š;Ú€L*__*L€TO)(OllTO()Oïl2 Ú!0 ²0+±é²"+±é´0" +°3±é°2°³+´+°1/°0Ö±é°2°±+´+°±+° 2±,é°&2±2+±°9±°9°,°)9±±,99±´)$9±± &9901462"72654&#!3#!2654&+64'!2#!ù#.##.Ò$88$þ˜` `h$88$n þ²¼Gk##kGþDT2++2)kP()Oð.ðO)(P.D€L*__*L€2 Ú `²+±é²+±é´  +± é°!/°Ö°2± é°2° ±+°2±é±"+± °9± °9°°9°°901!"3!!"3!!"&5467.5463!Lþ˜$88$hþ˜$88$hTþDGk##kG¼†O)(OTO()OT€L*__*L€2 Ú"o²+°3±é° 2²+±!33°#/°Ö±é°±+° 2± é°2° ±+±é±$+±°9° °9°°9±°9°³ $901'32653265%#"'#"&553?¹7&%7T7%&7¹ hIO77OIh TÄ„þj&66&þî&66&–%·ýØJh>>hJ(··2 Ú"o²+±!33²+°3± é°2°#/°Ö±é°±"+° 2±!é°2°!±+±é±$+±"°9°!°9°°9± ³ $9°°9014&#"4&#"74632632%#“¹7&%7T7%&7¹þóhIO77OIhþóT„–&66&þî&66&þj%·(Jh>>hJýØ··2 Ú$X² +±é²+±$é´  +°3±é°2°%/°Ö° 2± é°2±&+± °9±° 9°°9°$°9012#!#53!2654&#'32654&#!îGk##kGþD»»»»Š*$88$  $88$þÖÚ€L*__*L€CTCþiïO)(OTO()O2 Ú ,†²+±é²+±(é´ +± )33±é±22² +³@ +² +³@+ +°-/° Ö°*2´ +° 2° ±+°$2±é°2±.+±°9±°9°°9°(°901!2654&+#52#!#5332654&#!353NŠ*$88$<;wGk##kGþD»»»»€<$88$þÖŠ);CïO)(Oll—€L*__*L€CTCþ½O()Oïl2 Ú2´²-+±é²2+±é´/0-2 +°3±/é°2°/³/+´+°3/°/Ö±-222´+°±+´+°±+° 2±)é°#2±4+±/³.1$9°±99±°9°)°&9±±)99±0/¶&$9±± #9901462"732654&#!!2654&+642#!#53`#.##.d$88$þÖ‰ ‰*$88$ Gk##kGþD»»»»T2++2)kP()Oð.ðO)(P.V€L*__*L€CTC2 Ú$X²+±#é² +±é´ +°3±é°2°%/°Ö° 2± é°2±&+± °9±#°9°°9°° 9013"&5467.5463!3#7!"3#"3!äGk##kG¼»»»»þäŠþÖ$88$  $88$*€L*__*L€þ½Tþ½—ïO)(OTO()O2mØÚ²+°3°/±+013732EŽŽEÓÚ÷÷þ“ÿÿ2Úÿÿ2Úÿÿ2–ìZÿÿ2–ìGÿÿ2–ì'®øÿ~ ‹ÿÿ2–ìa2 Úc²+°3±é°2² +°/° Ö± é° ±+±é°±+±é± +± °9°°9°°9±°9° ²99901%#"'#"&53326=3326=3 hIO77OIhT7&%7T7%&7T²Jh>>hJ(ýØ&66&»»&66&»2 Úc² +²+°3±é°2°/°Ö±é°±+±é°± +± é± +±°9°°9° °9± ²999°°9014632632#4&#"#54&#"#2hIO77OIhT7&%7T7%&7T(Jh>>hJýØ(&66&»»&66&»2 Ú R² +±é² +±é´ +±é°!/°Ö°2± é°2±"+± °9±° 9°°9°°9012+532654&+532654&#!5îGk##kG……$88$……$88$þDÚ€L*__*L€TO)(OTO()OT2 Ú$ƒ²+±é² +± é´$ +±$é²$ +³@$ +²$ +³@ +°%/°Ö´+°2°± +°2±é°2±&+±±99± °9±$°9°°9° °901%#332654&#!5!2+532654&+j;;„$88$þD¼Gk##kG……$88$„×,lO()OT€L*__*L€TO)(Oÿÿ2 Ú& ‘®ž2 Ú R²+±é² +±é´ +±é°!/°Ö° 2±é°2±"+±°9±°9°°9°° 9013"&5467.546;#";#"3!äGk##kG……$88$……$88$¼€L*__*L€TO)(OTO()OT2 Ú,p²+±é²+°3±'é´, +±,é°-/°Ö±é°±+±)é²) +³@) +°)±$+± é±.+±)±99°$°9±',² $99901"&54632#".5332>54&#"3Ylq\i‹/N†[AypCT%:MH%=\=([Ey>3jYW^bžpM{}S4$N`xþˆ>a;&2>\W32#4.#"3254&#.Ylq\i‹/N†[AypCT%:MH%=\=([Ey>3pYW^bžpM{}S4$N`þˆx>a;&2>\W54.+532#"&54632¢T3)kkN5Y6'&;a>úú`N$5KsCpžb^WYü3>yE[.CPA%HM:%TCpyA&\dR5‹i\ql2ŽÚ+{² +±é²+±é´&  +±&é²& +³@+ +²& +³@&( +°,/°#Ö°2±é°±++°'2´*+°*± +±é±-+±*+± 99±² #99901#"32>54.+532#"&546;53#1AikN5Y6'&;a>úú`N$5KsCpža]A;;myE[.CPA%HM:%TCpyA&\dR5‹i\qkþÔ2ŽÚ-‹²'+± é²+±é´' +´+³-+±é°./°*Ö°2± é² * +³@ - +° ±+´+°±+±!é±/+±± '99± ± *99°±!99°-³$901462"'"32>54.+532#"&5463("0""0XkkN5Y6'&;a>úú`N$5KsCpžb^z0""0"yE[.CPA%HM:%TCpyA&\dR5‹i\q2ŽÚ+p²+±é²#+± é´)# +±)é²) +³@ +°,/°Ö±é°±+±é°±+±&é°2±-+±² #)999±)±99° °&90133254&#";#".54>32#"&T3)kkN5Y6'&;a>úú`N$5KsCpžb^WYÞ3>yE[.CPA%HM:%TCpyA&\dR5‹i\ql2UÚ&}²+± é²$+±#é´$ +±é² +³@ +°'/°Ö°#2±é°±+±é°± +±é°%2±(+±± 99° ±"99± ²999±#°&90132654&#"#4632#"&54?!5!ü"- uOGp1" TUA=f™ru£ òþn#±(!-7aZ0*6&2Q[cQRŒZ´\ŒTa2UÚ&}² +±é²+±é´  +±é² +³@ +°'/°Ö°2±é°±+±é°±!+±é°2±(+±±99°± 99±²!999±°901%5!!#"&54632#4&#"32654.‹þ§#þnò £ur™f=AUT "1pGOu -±ÈaTŒ\´ZŒRQc[Q2&6*0Za7-!(2UÚ&}²%+±"é²+± é´% +±é² +³@ +°'/°Ö°%2± é° ±+±é°±+±é°#2±(+± ±"99°± 99±"°&9± ²99901>54&#"32653#"&54632!!5‹"- uOGp1" TUA=f™ru£ ò’ýÝ)(!-7aZ0*6&2Q[cQRŒZ´\ŒTa2 #&w²+°3±é°/±é°!/±é°2°'/°Ö±é°±+±é² +³@ +°±+± é±(+±°9±²!999±±99°± 9901#37632#"&5463"32654&#"[ÈaTŒ\´ZŒRQc[Q2&6*0Za7-!(Yþ§#þnò £ur™f=AUT "1pGOu -2 #)”²+°3±é°/±é² +³@ +² +³@ +°$/±é°2°*/°Ö±é°±+±é°±+°2´+°±!+± é±++±°9±³$$9±±99°± !9901#37632#"&546753#532654&#"[ÈaTŒ\´ZŒRQcE?;;06*0Za7-!(Yþ§#þnò £ur™f=8Q LôS 41pGOu -2 #.²+°3±é°-/´( +° /±é°2°//°Ö±é°±"+±é²" +³+ +°±+±é±0+±"°9±² 999±-²"999°(³%$901%32654&#"#37632#"&5467>32#"ë6*0Za7-!(ÈaTŒ\´ZŒRQc84 '"00"*Û)1pGOu -"þ§#þnò £ur™f=2M0D02 #)ƒ²+°3±'é° /± é°/±é°2°*/°Ö±é°± +±é² +³@ +°±+±é±++± °9°°$9°²'999± '°$9° ±99°² 999014&#"3"&54632#".##2326¸O/)/&2Q[\PQyW>rTKHTAkI=54E(5IIn0" TUA>e˜sx \„ƒ\þA#3RbcR3r2 #&w²+°3±!é°/±é°/±é°2°'/° ֱ鰱+±é² +³@ +°±+±é±(+±²!999±°9±± 99°±9901%3##"&54632#52654&#"32>ãÈaTŒ\´ZŒRQc[Q2&6*0Za7-!(ÊYýÝ’ò £ur™f=AUT "1pGOu -2UÚ%†²+±é²$+°3´$ +±é² +³@ +°&/°Ö°#2±é°±+±é°± +±é°2±'+±°"9°²%999° °9±²999±$²"%9990132654&#"#4632#"&546?'5Uþ§G/pTKl1" TUA=f–u|œGY,ÌÚaþþ5E=2:?-*6&2Q[cQOqfXSnA ™aÇ2UÚ%ˆ²+°$3²+±é²+²+² +²+²+´ +±é°&/°Ö°2± é° ±+±é°±+±é°#2±'+± °9°²%999°°"9±²"%9990135>54&#"32653#"&54632%2YG/pTKl1" TUA=f–u|œGY,Ìþïa5E=2:?-*6&2Q[cQOqfXSnA ™aÇ2 #%j²+°3±é°/±é°!/±é°2°&/°Ö±é² +³@ +°±+± é±'+±²!999±°9°² 999°!°901337>32#"&5463"32654&#"2ÇÇa™ AnSXfqOQc[Q2&6*-?:2=E5þþÌ,YGœ|u–f=AUT "1lKTp/Gþ§2 #)‡²+°3±é°/±é² +³@ +² +³@ +°%/±é°2°*/°Ö±é°±+°2´+°±"+± é±++±³%$9±°9°² "999°%°901337>32#"&546753#532654&#"2ÇÇa™ AnSXfqOQcMF;;#6*-?:2=E5þþÌ,YGœ|u–f=;SJôV 1lKTp/Gþ§2 #+l²+°3±!é°/´ +°'/±é°2°,/°Ö±é² +³ +°±$+± é±-+±$²'999±!±99°µ $$901337>32#"&547632#"'32654&#"2ÇÇa™ AnSXfqOQcP."00"$6*-?:2=E5þþÌ,YGœ|u–f=l&'0D0(1lKTp/Gþ§2 #%j²+°3±!é°/±é°/±é°2°&/° ֱ鰱+±é² +³@ +±'+±²!999±!°9°² 999°°901#'#"&54632#52654&#"3267 ÇÇa™ AnSXfqOQc[Q2&6*-?:2=E5#þîþïÌ,YGœ|u–f=AUT "1lKTp/GY2 nX°/± é°/±é°2°/°Ö± é² +³@ +° ±+±é±+± °9°±99± °9°°90132=3#"&547!5!  J:¡TŠk`zþân*Lž||u}|N8T2ÿÿ m\²+°3±é° /±é°/°Ö±é°± +±é² +³@ +±+± ±99°°9±°9° ± 9901!>54&#"#54632!$!  J:¡TŠk`z+Kžzzv|{O7T2ŸÚT² +± é²+´  +±é°/°Ö° 2±é°±+±é±+±±99± ±99°°90173632+53254&#"2T8N||v{{žL*òèþâz`kŠT¡:J  !ÿÿ2ŸÚ& «Ó¤ÿrÿÿ2ŸÚ& «®\ÿl2ŸÚZ²+±é²+´  +±é°/°Ö± é° ±+±é°2±+± ± 99°°9± ±99°°901%.#";#"&546323Ÿ*Lž{{v||N8Tò!  J:¡TŠk`z2 Úx²+±é°/±é°2² +³@ +² +³@ +° /°Ö´+°2°±+±é°±+±é±!+±°9°±99±±99°°9017#3!32=3#"&547#m;;­!  J:¡TŠk`zã®,m*Lž{{v||N82ÿ“ mx²+°3±é² +³@ +² +³@ +°/±é° /°Ö±é°±+±é°±+°2´+±!+±±99°°9±°9°±9901%3#5!>54&#"#546323Ñ;;þS!  J:¡TŠk`zã¿þÔm*Lž{{v||N82 Úz² +± é²+´+°2´  +±é° /°Ö° 2±é² +³@ +² +³@ +°±+±é±!+±°9°±99± ±99°°901#632+53254&#"#5!^k8N||v{{žL*m,Ÿãz`kŠT¡:J  !­;ÿÿ2 Ú& ±Óÿrÿÿ2 Ú& ±®Êÿl2 Úz²+±é²+´+°2´ +±é° /°Ö±é°±+±é°2² +³@ +² +³@ +±!+±±99°°9±±99°°9015!#.#";#"&546325à,m*Lž{{v||N8Ÿ;;þS!  J:¡TŠk`zã2/#j² +±é°/°3±é°2°/° Ö°2±é² +³@ +°±+±é°2² +³@ +±+±³ $9±³ $90153#"&5467#532654&[Ô€:E•Ò•E:Ó7HeŠeH–T!rDg‘‘gDq"TX8D``D8W2/#j²+°3±é°2°/± é°/°Ö°2±é² +³@ +°±+± é°2² +³@ +±+±³ $9±³ $901%#53.54623#5>54&"Ô€:E•Ò•E:Ó7HeŠeHT!rDg‘‘gDq"TX8D``D8W2Uýj² +°3±é² +³@ +°/±é°2² +³@ +°/°Ö°2±é°2°±+± é±+±³ $9±³ $901#53>32#"&'#533264&#"¿T!rDg‘‘gDq"TX8D``D8W)Ô€:E•Ò•E:Ó7HeŠeHÿÿ2Uý& ·Ó8ÿ•ÿÿ2Uý'®ðÿ’ ·2Uýh°/°3±é² +³@ +°/± é°2² +³@ +°/° ֱ鰱+°2±é°2±+±³ $9±³ $901%3#5#"&463253#.#"326ÈT!rDg‘‘gDq"TX8D``D8WÔÔ€:E•Ò•E:Ó7HeŠeH2±Ž!޲+±é°/°3±é°2² +³@ +² +³@ +°"/°Ö°2±é² +³@ +°±+± é² +³@ +° ±+°2´+±#+±³ $9±³ $9015!53#5#"&5467#532654&[;;Ç:E•Ò•E:Ó7HeŠeH–kþÔm!rDg‘‘gDq"TX8D``D8W2ÿ–±$!Œ°/°3±é°2² +³@ +² +³@ +°/±é°"/°Ö´+°2°± +±é² +³@ +°±+±é°2² +³@ +±#+±³ $9±³ $901%!#33.54623#5>54&"ˆþå;;Ç:E•Ò•E:Ó7HeŠeHŽk,m!rDg‘‘gDq"TX8D``D8W2À!в+°3±é² +³@ +°/± é² +³@ +°/°3´+°"/°Ö°2±é°2² +³@ +² +³@ +°±+±é±#+±³ $9±³ $901##5!#>32#"&'#533264&#"*k,m!rDg‘‘gDq"TX8D``D8W);;Ç:E•Ò•E:Ó7HeŠeHÿÿ2À& ½Ó«ÿ”ÿÿ2À'®^ÿ’ ½2À!в+° 3±é² +³@ +°/±é² +³@! +°/°3´+°"/°Ö±é°±+°2± é° 2²  +³@  +² +³@ +±#+±³ $9±³$901.#"32673#5#"&46325#5!#ÈW8D``D8XT"qDg‘‘gDr!m,k)7HeŠeH7Ó:E•Ò•E:Ç;;þå2 $‹²+°3±é°2°/±é° 2² +³@# +² +³@ +°%/° ֱ鰱+±é°±+±é°±#+°2´"+±&+±°9°°9°°9±°9°°901#"'#"&53326533265353#5€`IG77GI`T/&$0T0$&/¥;;ÏþãJh>>hJqþ'55'þæ'55'qlþÔl2ÿ” #$‹²+° 3±$é²$ +³@! +²$ +³@$" +°/°3±é°2°%/°!Ö´ +°#2° ±+±é°±+±é°± +± é±&+±°9°°9° °9±$°9°°90174632632#4&#"#4&#"##3¾`IG77GI`T/&$0T0$&/¥;;TJh>>hJþq'55'þæ'55'þl,l2ÁÚ$² +± é²!+´ +°#2´ ! +±é´ ! +±é°%/°Ö° 2±é² +³@# +² +³@ +°±+°2±é°2±&+±°9°°9± °9°°9°°901!2#!5!2654&#!5!2654&#!5#5!#òJh>>hJþq'55'þæ'55'þl,lN`IG77GI`T/&$0T0$&/¥;;2ÁÚ(®² +± é²%+´$+°'2´ % +±é² +³@ +² +³@ +´" % +±é°)/°#Ö° 2±é²# +³@' +²# +³@#$ +°± +´+°2°±+°2±é°2±*+±°9± °9°°9°"°901!2#!5!2654&+#332654&#!5#5!#òJh>>hJþq'55'à;;à'55'þl,lN`IG77GI`T/&$0m,k0$&/¥;;2ÁÚ,ʲ+±é²)+´(+°+2´) +±é°³+´+´&) +±é°-/°'Ö°2±é²' +³@+ +²' +³@'( +°'° Ö´+°±+°"2±é° 2±.+±±99°±99°°9°°9±±99±´$9±&± "9901462"!2#!5!2654&+532654&#!5#5!#Â"0""0Jh>>hJþq'55'¯¯'55'þl,l0""0"a`IG77GI`T/&$0T0$&/¥;;2ÁÚ$²+±é²+´+°2´ +±é´$ +±$é°%/°Ö°!2±é° 2°±+±é°2² +³@ +² +³@ +±&+±°9°°9±°9°°9°°!9015#5!#!"3!!"3!!"&547&5463l,lþ'55'þæ'55'qþJh>>hJNQ;;¥/&$0T0$&/T`IG77GI`2 Úc² +±é²+°3±é°2°/°Ö±é² +³@ +°±+± é² +³@  +±+±± 99±³ $901463""&54426n\B+«ð«+B\zªz"C_T- þéxªªx -T_CþêUyy2 Úc²+°3±é°2² +±é°/°Ö±é² +³@ +°±+±é² +³@ +±+±± 99±³ $901#52654623"&54&"Ð\B+«ð«+B\zªz¸þêC_T- xªªxþé -T_CUyy2 Ú[²+²+´ +±é´ +±é°/°Ö°2±é°2°±+± é±+±³ $9±± 9901!"&533!2#!"#463!264&êþêC_T- xªªxþé -T_CUyy<\B+«ð«+B\zªzÿÿ2 Ú'Ñ–ÿ) Éÿÿ2 Ú'®î É2 Ú[²+²+´  +± é´ +±é°/° ֱ鰱+°2±é°2±+±³ $9±± 9901%!2#4&#!"&463!2653#!"TC_T- þéxªªx -T_CþêUyyž\B+«ð«+B\zªz2myÚ>²+´+°/´+°/°Ö°2´+°2± +±²99901!3!#2GÙÙþ¹ÒÒÚþÉ672'y i²+°3´+°2² +³@ +° /°3´+°2²  +³@ +°/° Ö² 222´ +²222±+±³ $901333##5#75#5357·6ŒŒŒŒ6…………M FÉn6FFÅr6þÉ!!""ÿÿ2 Ú& DZØÿÿ2 Ú& È uÖþRÿÿ2 Ú& ÉÔ2ÿÿ2 Ú'Ñÿ) Ñÿÿ2 Ú'®® Ñÿÿ2 Ú& ÌÕà2 Ú*²+°3±é°2² +³@ +²+°&3±é°'2°+/° Ö±é²  +³@  +°±+±é°±"+±é²" +³@& +±,+±°9°°9°"°9±°9°³ #$901%#"'#"&544326533265463"Â_HE77EH_+B\.%$.T.$%.\B+²Kg>>gK‡ -T_Cþz'55'qþ'55'†C_T- 2 Ú*²&+°3±'é°2²+°3±é°2² +³@ +°+/°*Ö±#é²*# +³@*& +°#±+±é°±+± é²  +³@  +±,+±#°9°°9°°9±'³ #$9°°90146326323"&54&#"#4&#"#5265|_HE77EH_+B\.%$.T.$%.\B+(Kg>>gKþy -T_C†'55'þq'55'þzC_T- 2œÚ*}²+²&+´ & +± é´& +±é´*#& +±*é°+/°Ö°&2±é°'2°±+°2±é°2±,+±´ #$9°°9±°9°°9°#°9012#!"#463!2654&#!5!2654&#!"&533êKg>>gKþé -T_C'55'þÿ'55'þêC_T- _HE77EH_+B\.%$.T.$%.\B+2œÚ.®²+²*+´ * +± é´* +±é² +³@ +² +³@ +´.'* +±.é°//°Ö°*2±é°+2°±+´+°2°±+°#2±é°2±0+±³ '.$9°³ &$9°°9±°9°°9°'°9012#!"#463!2654&+#332654&#!"&533êKg>>gKþé -T_C'55'á;;á'55'þêC_T- _HE77EH_+B\.%$.l,l.$%.\B+ÿÿ2œÚ& ×®2œÚ*}²'+²+´"' +±é´' +±é´ ' +± é°+/°Ö°2±é°2°±'+°2±&é°2±,+±°9°'´ #$9±"°9°°9°°9017"&547&5463!2653#!"3!!"3!2#4&#äKg>>gK -T_Cþê'55'þÿ'55'C_T- J_HE77EH_+B\.%$.T.$%.\B+2 Ú )2³²+°3±/é°&2²+°3±é°2´+ +°!3±é°2²+ +³@ +°3/° Ö±,é°2² , +³@  +°,±2+°2±#é°2°#±)+°2±é²) +³@ +±4+±2,°9°#°9°)°9±/°9°+± 99±± 9901%#"'#"&54435335463"#3265#3265Â_HE77EH_+B\¥T¥\B+T¥.$%.ù¥.%$.²Kg>>gK‡ -T_CccC_T- jþã'55'þã'55'2 Ú )2³²+°3±é°2²+°3±&é°/2´! +°*3±é°2²! +³@ +°3/° Ö±é°!2²  +³@  +°±+°"2±é°*2°±+°+2± é²  +³@  +±4+±°9°°9°°9±± 99±&!± 99°°90146326323"&=##5##5265734&#"34&#"|_HE77EH_+B\¥T¥\B+T¥.$%.ù¥.%$.(Kg>>gKþy -T_CccC_T- j'55'þã'55'2œÚ )2«²+²+´  +°+3± é´ +°"3±é°*2´  +°!3± é°3/°Ö°2±é°2°±+°2±+é°!2²+ +³@ +°+±/+°&2±é°2±4+±± 99±/+± 99°°9±°9°°9°°9012#!"#46;5#535#"&53332654&#32654&#êKg>>gKþé -T_CccC_T- j­'55'­­'55'_HE77EH_+B\¥T¥\B+T¥.$%.ù¥.%$.2œÚ :Ù²)+²6+´%,)6 +°3±%é´/0)6 +±33±/é±22²/0 +³@/ +²0/ +³@0 +´:3)6 +° 3±:é°;/°)Ö°62±(é°72°(±-+°12±é° 2²- +³@-/ +°± +°2´ +°2° ±+°2±!é°2±<+±-(±%:99± ±$99°!°9±/,°!9°0°9°3°90132654&+#5'353326544#!"#46;5#535#"&533=­'55'1;AA;1'55'Kg>>gKþé -T_CccC_T- C¥.%$.llù¥ll.$%.T_HE77EH_+B\¥T¥\B+2œÚ Aä²0+²=+´,30= +°3±,é´670= +° 3±6é° 2°6³6+´+´A:0= +°3±Aé°B/°0Ö°=2±/é°>2°/±4+°82±é°2²4 +³@47 +°±+´+°±+°2±(é°$2±C+±4/±,A99°°9±²!+999°(°&9±3±(99°6°9°7µ&$9±:±$9901462"764'72654&+32654&#2#!"#46;5#535#"&533P#.##.d '55'­ ­'55'Kg>>gKþé -T_CccC_T- T2++2)..$%.¦¥.%$.M_HE77EH_+B\¥T¥\B+2œÚ )2«²+²+´) +°3±é´#2 +°3±#é°2´ , +°3± é°3/°Ö°2±&é°/2°&±!+°*2±é°2²! +³@ +°±+°2±é°2±4+±&°9°!± 99±± 99±#)°9°2°9°,°9017"&547&5463!2653+3#32#4&#'5#"375#"3äKg>>gK -T_CccC_T- j­'55'­­'55'J_HE77EH_+B\¥T¥\B+T¥.$%.ù¥.%$.2ÛÚ#*4²²+²+´#, +°3±#é´% +°3±é°2°5/°Ö±(é°(° Ö±é°/±é°(±+²$222´+²+222°±/+± é° ° Ö±é°/±é±6+±°9±#°9°,°9°%µ $+$9°°901!#5&'35.546753#&'5>54.";¯X'1:-$[M;OTXIVGcV;&+&f-5  U ¦)4¬:&BTVUSGF ¢%QFWN”)"ož,  2 Ú6IJ+°3±é°2²!+±)233± é²'+3222´%! +° 3±%é°-2°7/°Ö±é°$2² +³@! +°±+°&2± é°,2²  +³@ + +² +³@( +° ±+°.2±é² +³@2 +±8+±°9° °9°°9±°9°±99± %±69901#3265#32653#"'#"&54435#5!#35463"u¥.%$.ù¥.$%.T_HE77EH_+B\¥ZZ¥\B+Ïþã'55'þã'55'Kg>>gK‡ -T_CcTTcC_T- 2 Ú6IJ2+±!)33±3é² '+222²+°3±é°2´. 2 +°3±.é°%2°7/°6Ö±/é° 2²6/ +³@62 +°/±,+° 2±'é°2²', +³@') +²,' +³@,* +°'±$+°2±é²$ +³@! +±8+±,/°9°'°9°$°9±.3±699± ±99°°90134&#"34&#"#46326323"&=#3!535##5265É¥.%$.ù¥.$%.T_HE77EH_+B\¥ZþøZ¥\B+ '55'þã'55'Kg>>gKþy -T_CcTTcC_T- 2œÚ6¼²!+²2+´$!2 +°3±é´',!2 +° 3±'é°2²', +³@') +²,' +³@,* +´6/!2 +° 3±6é°7/°!Ö±)222± é²'+3222° ±%+°-2±é° 2°±+°2±é°2±8+±% ±699±±99°°9±'$°9°,°9°/°90132654&#'326544#!"#46;5##335#"&533=­'55'­­'55'Kg>>gKþé -T_CcTTcC_T- C¥.%$.ù¥.$%.T_HE77EH_+B\¥ZZ¥\B+2œÚ$1>à²+² +´! +°&3±é´$ +±3733±$é±%-22²$ +³@$ +³@$0 +²$ +³@ +³@5 +´ +°23±é°?/°Ö± 22±é² 222°±"+°2±&é°22°&±0+°42´/+°62°/±*+°;2±é°2±@+±"±99±*/±99°°9±$!°9°°9°°9017#335#"&533!2#!"#46;5#332654&+#5'35332654&#†TTcC_T- Kg>>gKþé -T_Cc·­'55'1;AA;1'55'éZ¥\B+_HE77EH_+B\¥¥.%$.llù¥ll.$%.2œÚ$,Eõ²+² +´" +°>3±é´ +°13±é°E2² +³@ +² +³@ +°³,+´(+´ +°73±é°F/°Ö± 22±é² 222°±#+°2±>é°82°>±&+´*+°*±B+°42±é°2±G+±#±99°>°;9±B*²-999°°9±,"±B99°°=9°µ%&)*9$9±(±49901#335#"&533!2#!"#46;56462"764'72654&+32654&#†TTcC_T- Kg>>gKþé -T_Cg#.##.d '55'­ ­'55'CZZ¥\B+_HE77EH_+B\¥2++2)..$%.¦¥.%$.2œÚ6¼²3+² +´3 +°.3±é´ 3 +°&3± é°,2²  +³@ + +² +³@( +´3 +°$3±é°7/°Ö°2±é°2°± +°2±.é°%2°.±3+² '+222±2é±!)22±8+±°9° ±99±3.±699± °9°°9°°9015#"35#"3"&547&5463!2653+353#5#32#4&#‘­'55'­­'55'Kg>>gK -T_CcTTcC_T- —¥.%$.ù¥.$%.T_HE77EH_+B\¥ZþøZ¥\B+2 Ú. ²+°3±%é°2²+± +33±é² )-222°//°Ö±"é²" +³@ +°"±(+±é²( +³@- +²( +³@(* +°±+±é² +³@ +±0+±("°9°°9°°9±%°9°³!$901%3265463"#"'#"&5443265#5!#É.$%.\B+_HE77EH_+B\.%$.ZZ²'55'†C_T- þyKg>>gK‡ -T_Cþz'55'ÔTT2 Ú. ² +±+33± é²)-222²+°3±é°%2°//°Ö±é² +³@ +°±.+±)é²). +³@)+ +².) +³@., +°)±!+±é²! +³@ +±0+±.°9°)°9°!°9± ³!$9°°9014&#"#526546326323"&54&#"3!53u.$%.\B+_HE77EH_+B\.%$.ZþøZ('55'þzC_T- ‡Kg>>gKþy -T_C†'55'þ,TT2œÚ.˜²$+²+´ '$ +± é´$ +±é² +³@ +² +³@ +´ $ +±é°//°$Ö±22±#é²222°#±++° 2±é°2±0+±+#³ '$9°°9±'°9°°9° °901#3!2654&#!"&533!2#!"#463!2654&#†TTd'55'þêC_T- Kg>>gKþé -T_C'55'CZZ.$%.\B+_HE77EH_+B\.%$.2œÚ6˲(+²+´$+( +±$é´( +° 3±é°22² +³@ +³@5 +² +³@ +³@ +´( +±é°7/°(Ö±22±'é²222°'±5+°2´4+°2°4±/+° 2± é°2±8+±5'³$+$9±/4³#,$9° °9±+° 9°°9°°901#335332654&#!"&533!2#!"#463!2654&+#5†TTz;¯'55'þêC_T- Kg>>gKþé -T_C'55'¯;CZZll.$%.\B+_HE77EH_+B\.%$.ll2œÚ4>á²*+²+´&-* +±&é´5:* +° 3±5é°2²5: +³@57 +²:5 +³@:8 +°5³5+´+´* +±é°?/°*Ö±722±)é²59222´=+°)±+´+°±1+°2±"é°2±@+±=µ&-;>$9±1´%.$9°"° 9±-±"199±:5´ $9±±9901462"764'32654&#!"&533!2#!"#463!2654&#!#33Ö#.##.d '55'þêC_T- Kg>>gKþé -T_C'55'þœTT= T2++2)0.$%.\B+_HE77EH_+B\.%$.ZZ02œÚ.˜²+²#+´ # +±é´.# +±é². +³@ +². +³@. +´(# +±é°//°Ö°2± é°+2° ±+²#222±é±$22±0+± °9°³ '$9± °9°.°9°(°90153#5!"3!2#4&#!"&547&5463!2653#!"3HTTþœ'55'C_T- þéKg>>gK -T_Cþê'55'—ZþøZ.$%.\B+_HE77EH_+B\.%$.2 Ú&Œ²+°3±é° 2²#+±33±"é°%2°'/°Ö±é°±+° 2± é°2²  +³@ % +² +³@" +° ±+±é±(+±°9° °9°°9±°9°"³ $901'32653265%#"'#"&55#5!#?¹7&%7T7%&7¹ hIO77OIh ZZÄ„þj&66&þî&66&–%·ýØJh>>hJ(·cTT2 Ú&Œ²$+±33±%é°!2²+°3± é°2°'/°Ö±é°±&+° 2±!é°2²!& +³@!# +²&! +³@&$ +°!±+±é±(+±&°9°!°9°°9± %³ $9°°9014&#"4&#"74632632%3!53“¹7&%7T7%&7¹þóhIO77OIhþóZþøZ„–&66&þî&66&þj%·(Jh>>hJýØ·cTT2 Ú(Œ²+±é²+±(é´ +° 3±é°2² +³@ +² +³@ +°)/°Ö±22±é°2°±+°$2±é° 2±*+±³($9°°9±°9°°9°(° 901#33!2#!3!2654&#'32654&#!†TTg»¼Gk##kGþD»aŠ*$88$  $88$þÖCZZC€L*__*L€CïO)(OTO()O2 Ú #0²²"+±é²+±+é´ " +±$,33± é±22²  +³@  +³@  +² +³@. +³@ +°1/°Ö±"22±é°2°±+°-2´+°/2°± +°'2±é°2±2+±³#+$9± °9± °9°°9°+°901#5#!2654&#!#33!2#!%2654&#!353²;)Š*$88$þ˜TTg»¼Gk##kGþD»$88$þÖŠ);CllïO)(OZZC€L*__*L€CTO()Oïll2 Ú6Ʋ5+±é²'+±é´ %5' +° 3± é°2² % +³@ " +²% +³@%# +° ³ +´+°7/°"Ö±'522±!é°$2°!±+´+°±+°2±1é°+2±8+±!´&6$9±°9°1°.9±±199° °9°%µ.$9±±+9901462"764'32654&#!!2654&#!#33!2#!`#.##.d $88$þÖ‰ ‰*$88$þ˜TTg»¼Gk##kGþD»T2++2)0O()Oï0ïO)(OZZC€L*__*L€C2 Ú(Œ²+±'é²+±é´! +°3±!é°2²! +³@! +²! +³@ +°)/° Ö°2±$é°2°$±+°2±é±22±*+±$ °9°³($9±!'° 9°°9°°90153#5#!"&5467.5463!#7!"3#"3!LTTg»þDGk##kG¼»aŠþÖ$88$  $88$*—ZþøZþ½€L*__*L€þ½ïO)(OTO()O2Ú1²+°3±é²+°3±é°/±+±³ $901%"./#'.#523%+?¿ûn2Ä(,D¿ûnþÎÄ/TT! äþÕmêT" ä+þ“ê2@ B²+°3´ +°2° /°Ö° 2´+°2± +±±99± ± 9901''7'7 hh gg hh g gg hh gg hÿÿ29Ú'ò×ÿÿ2îÚ'Ð ÿÿ2òÚ'Ô ÿÿ2ðv'Ò ÿÿ2‘Ú's ÿÿ2£v's ÿÿ2ðÚ'Ò ÿÿ2v'Ò ÿÿ2jÚ& .®Äÿÿ2ØÚ& /®2ÿÿ2Øv& ÿ®zÏÿÿ2ˆÚ& 1®âÿÿ2ˆv'®â& 1®<Ïÿÿ2ØÚ& 3®2ÿÿ2Øv'®2& 3®jÏ2å^ž1°/´+°/´+°/±+°2´+°2± +015!5!2,þÔ,c;;~;;2‹^ør°/° 3´+° 2² +³@ +°/°3´+°2² +³@ +°/°Ö±22´ +±22²  +³@ +°2² +³@ +°2±+0153533#3##5#5352x3•$$$2¬ThUƒT5[oA„2$$$KþkXJ£Eh<2ÆÚ  ²+²+°3´+´ +±é±  À/´ +°!/°Ö±é°±+´ +° ±+´+°±+±é±"+± ² 999± ²999014632"&264&"'2#54&+é$$$2”Ao[5TƒUh„2$$$Kþ»"0""0ˆ0""0"þ˜æb€€b”RÒD`_Ef0""0"2¤Úu² +²+±é´  +± é° ³ +´+°/°Ö´+°± +°2´ <+° ±+´<+±+± ³$9±±9901532+#3264&#462"Üæb€€b”RÒD`_Eþ„"0""0‰QzPR}þ¿“IhEþÌ0""0"2¤v"™²+² +±é´ +±é°³+´+°"/´+°#/°Ö´+°±+°2´<+³+´ +°±+´ <+±$+±³!"$9±³$9±± 9901462"532+#3264&#&462"2"0""0ˆæb€€b”RÒD`_Eã"0""0U0""0"VQzPR}þ¿“IhE›0""0"2|Úw² +²+±é´   +± é° ³ +´+°/°Ö´+°±+´<+°± +´<+°2±+± ³$9±² 99901#";##"&46;462"|ÒE_`DÒR”b€€bæý¶"0""0‰EhIþmA}¤xþ{0""0"2mÛݲ+°/±+01 #ž—–?ÕÔmþüpþ2m’Ú:² +´+°/°Ö´+°±+´+±+±± 990154&"#5462\HdH6g’gm½2HH2½½IggI½2l7ÚU²+´+°/´+°/° Ö´ +° ±+´+² +³@ +±+± °9±°90153264&#"#4632#‚+#//# #8H38RŠú84#÷(7:6p2l7ÚC² +´+² +³@ +°/° Ö´+°±+´+±+±° 901#4&#"#463278/# #8H38Rj#÷(7:2m(Ú8²+´+² +³@ +°/°Ö´+² +³@ +±+013##2ö»;Ú:þÍ2l qS°/´+² +³@ +° /´ +°/°Ö´+°±+´+±+±°9± °901#"&5463!#"26=p6:7(÷#4!+ŠR83H8# #//#+2mÚ >²+° /´+²  +³@  +° /°Ö´+°±+´ +±+01#5326=3#h6B&46VFm»70K>VP2m´f( °/° 3´+°&2°/°3´+°2°)/°Ö´+² +³@ +°±+´+² +³@ +±*+°6ºÁ]òÞ+ ° ° À±"ù°#À³ "#....³ "#....°@±± 99±±99014'52#"&/&#"3&54632326‚80:<*,2 .%  ~E-%9 æL2B<;@)0>0')2p>G-+?#2m Ý ?²+°/´+° /´ +°/°Ö´ +±+± °9± °901/&462"dÕÔ]ww"0""0mpþ6ÎΉ0""0"2m Ý ?²+°/´+° /´ +°/°Ö´ +±+± °9± °901/$462"2ÕÔ]ww "0""0mpþ6ÎΉ0""0"2_­Ú R²+´+°/´ +°/°Ö´ +° ±+´+±+± ²999± ²99901462#"&3264&"2$4#$ „2$$$K2f¦Ú5²+´+²+´+°/°Ö´+´+± +01462"2"0""0ˆ0""0"2¦Úr² +±é°/±é°2³+´+°/°Ö´<+² +³@ +°±+´ 1+° ±+´+±+±° 9±³$901462"'3#"&=!5!2652"0""0™QzPR}þ¿“IhEˆ0""0"bæb€€b”RÒD`_E!úvn²+±é²+´ +±é°/´+°/°Ö°2´<+³+´+°± +´<+±+±³$9±±9901462"3264&+332+!"0""0ÒE_`DÒR”b€€bæ$0""0"ýOEhI“þ¿}¤x2 vl² +±é²+´  +±é°/´+°/° Ö´<+°±+´<+°2³+´+±+±³$9±° 901462"#"&546;3#"3—"0""0Aæb€€b”RÒD`_E$0""0"ýOQzPR}AþmIhE2XÚ'š²+±é² +°3±é´'# +´'+´ +±é°(/°Ö±é°2°±+± é° ±+±é°±!+´%+±)+±´ $9± ±99±'±!$99°#°9±± 9901"&5462#"'265264&"462"´ÅøÅdŒddF-)•°•þ&3F33F+"0""0ÚþJv®®v FddŒdyS}}S¶‡F33F3þÏ0""0"2(Ú'²+±é²+±é°2´'# +´'+´  +±é°(/°Ö±é°±+±é°±+± é°2° ±! +´%+±)+±°9°± 99±'±99° ±!$99±#°9°³ $901)"&6;2"&547#"3!"264462"´þ¢y««y´FddŒd!S}}S^‡F33F3T"0""0Ô2ÔdŒddF-)°Ò°23F33Fþ0""0"2XÚ|²+±é² +±33² +´ +´+°/° Ö± é° ±+´+°±+±é°±+´+±+± ±99±±99± °9013#"&53265462"V;;^ÅøÅT•°•„"0""0ÙþÔ-þJv®®v¶þJS}}S¶þ{0""0"2¶v i²+±é² +±é´  +´+°/´+°/°Ö´+°±+±é±+±± 99±±99± ±9901462"5!!2#!5!264&#!:"0""0þÖ,þÔA…¾¾…þ¿Ab‹‹bþ¿$0""0"þN::ŠÖþÒÖT¥è¥2¶vi²+±é² +± é´ +´+°/´+°/°Ö±é°±+´+±+±±99±±99± ±99015!!"&63!!"3!462"Š,þ¿…¾¾…Aþ¿b‹‹bAþ„"0""0P::þ°Ö.ÖT¥è¥Ð0""0"2ÄÚ „²+° 3² +±é´  +´+° Ö±é°!/°Ö°2´<+°±+´ <+° ±+´+±"+±³ $9± ±99°±99°±9901 #"&54632#4&#"3462"±þådáb‘eb”R^FE_`D("0""0“þmARPx“Sþ à:nB45J 0""0"2N }²+±é²+°3²+´+´  +± é°!/°Ö°2´ <+° ±+´+°±+´<+±"+± ° 9°²999°°9± °901462"#"32653#"&54633"0""0‰D`_EF^R”be‘bádü0""0"þmJ54Bn:àþ S“xPRA2öÚ'/¥²'+²"+±é´ '" +±é´+/'" +´++´'" +±é² +³@ +°0/°Ö±é°±+±é°± +±é°±'+±&é°&±)+´-+±1+±± 99° ²"999±+/± 99°±99014&#"3254&#"#432#"&54632#462"oNRk<5oTs2I+L1Vužsp¡T‚"0""0ÌNoTKLKy&“S,$D=%ƒemƒŸoþ4ˆ0""0"2ev'/§²+±%é²+´ +±é² +³@ +´  +± é°//´++°0/° Ö±"é°"±+±é°±+±é°±+±é³)+´-+±1+±± 99°²%999±³*+./$9±² "999013#"&54632#"5332654#"326462"T¡psžuV1L+I2sTo5>hJ(ýØ&66&(ýØ&66&(þ{0""0"2 v (j² +±é² +±é´ +±é°(/´$+°)/°"Ö´&+°&±+°2± é°2±*+± °9±° 9°°9°°9012#!5!2654&#!5!2654&#!5$462"îGk##kGþD¼$88$þD¼$88$þD"0""0Ú€L*__*L€TO)(OTO()OTJ0""0"2 v (j²+±é² +±é´ +±é°(/´$+°)/°Ö° 2±é°2°±"+´&+±*+±°9±°9°°9°° 9013"&5467.5463!!"3!!"3!462"äGk##kG¼þD$88$¼þD$88$¼þš"0""0€L*__*L€TO)(OTO()OT$0""0"2XÚ (‰²+±é² +±é´ +±é°³(+´$+°)/°Ö° 2±é°2°±"+´&+±*+±°9°"³  $9±(±99±´!"%&$9±$± 99013"&5467.5463!!"3!!"3!462"äGk##kG¼þD$88$¼þD$88$¼D"0""0€L*__*L€TO)(OTO()OTU0""0"2Uv.¤²$+±é²,+±+é´$, +±é² +³@ +°/´+°//°'Ö°+2±é°±+´+³+±é°/±é°±+±!é°-2±0+±µ$$9±²*999±²!'999±+°.901462"32654&#"#4632#"&54?!5! "0""0/"- uOGp1" TUA=f™ru£ òþn#$0""0"þ¯(!-7aZ0*6&2Q[cQRŒZ´\ŒTa2¦#&.˜²+°3±!é°/±é°/±é°2³*+´.+°//° ֱ鰱+±é² +³@ +°±+±é°±(+´,+±0+±²!999±°9±± 99±.´(+$901%3##"&54632#52654&#"32>$462"ãÈaTŒ\´ZŒRQc[Q2&6*0Za7-!(c"0""0ÊYýÝ’ò £ur™f=AUT "1pGOu -à0""0"2mæÚ J²+´+°/´+°2° /°Ö´+² +³@ +°´#+°/°3± +013#53#53¥A´AAsŸ22 22l v0°/´ +°2°/°Ö´+° 2±+± ± 9901&#"#3632ç# #88'8(/#“ 2m1t|°/´+°/´ +°/´+°/°Ö´ +²  +³@  +° ±+´+² +³@ +±+± ± 99±°9± ±99±°90146;#";2+532654&+"2,¨¨  m**®® mB+2/B-2 ÿÿã Øÿÿ µ òÿÿ&ÿëQ¨oÀÿÿ!ÿéðÚÿÿ6Ü Ûÿÿ â öÿÿ6® ÜÿÿÿéÇÿÿÿHÿ3œ LÞ ÀÿÿÿéG áÿÿ6æ âÿÿ’ ÷ÿÿ60 äÿÿ!ÿé(æÿÿ6¶ çÿÿÿÿÚ $ ÀÿÿÂ éø Àÿÿ° ëÿÿ6ÿéÉ ìÿÿÓ íÿÿŸ îÿÿ® ñÿÿzdóõÿø„*áÿÿi:ðøÿþ†*áÿÿuMw²ÿû…*áÿÿ u&ïÿÿõ…*áÿÿ ‡¬p ‡*áÿÿ-wŸç ‡*áÿÿ,†bæà†*áÿÿ"†ýæãÿþ†*áÿÿ&óöðÿþ†*áÿÿ ðçÿø‡*áÿÿóbð†*áÿÿ)ó}ð†*áÿÿ&†Eæÿþ†*áÿÿuMïÿû…*áÿÿ»rÿþ”*áÿÿvó-ÿû†*áÿÿ'w6ç `‡*áÿÿ(vIæ.†*áÿÿ ôcå3ÿö†*áÿÿ E7æ4ÿö†*áÿÿ &Kæ5†*áÿÿ}:pKÿû†*áÿÿÿ‹Ù#}¨üÒ$ÿÿÿ #}lüÒDÿÿPps#|«§%ÿÿ<ÿéÙ#| EÿÿPÿ\pÙ#|Žüø%ÿÿ<ÿEÙ#|€üáEÿÿPÿ~pÙ#q…ý%ÿÿ<ÿgÙ#q‚üðEÿÿ(ÿ*„'YJ‰ÿÿÿ*Üë#vŽ©ÿÿP’s#|¿§'ÿÿÿéóÙ"|^ GÿÿPÿ\’Ù#|‹üø'ÿÿÿEóÙ#|WüáGÿÿPÿ~’Ù#q™ý'ÿÿÿgóÙ#qYüðGYÿ1›Ù"+в+°3±#é²+±+é° /´+° /´+°,/°Ö±#é°#±+´&+°±'+±é±-+±#±"99°¶  $9± °"9° ³ $9±+#±990132654#"'7#!2+632#"'32654&+© ! . '¶‹žŸŠ= &)B9/N"¬lppl¬…%UÙÂþ¬Ã1# +2"ÿŠ‹ÿïÙ)5£²+²+² +²)+²&+±*é°/´+°/´ +°6/°#Ö±-é°-±+´ &+° ±3+°(2´<+°´+°/±7+±-@   &*0$9±°9°³ $9±*²(099901#5632#"'732654#"'7.54632"32654&ïJA+ &)B9/N ! . 'gt{fl5“DTTEBPPÙý'E,*1# +2"(%V˜~}—Qþôp[\on[^oÿÿPÿ.’Ù#iŒüß'ÿÿÿóÙ#iZüÈGÿÿP[Ô'X¾P#q¼ƒ(ÿÿÿé÷\"qrâ"HC^xÿÿP[Ô'YP#q¼ƒ(ÿÿÿé÷X"qrâ"Hv…tÿÿPÿ.[Ù#i¼üß(ÿÿÿ÷#irüÈHÿÿPÿ\[Ù#¾ü÷(ÿÿÿE÷#tüàHÿÿPÿ1[¨#{±Ìäÿÿÿ÷Þ"{råÿÿP9s#|¨§)ÿÿs#|§Iÿÿ(ÿéÁg#qåª*ÿÿÿ&ê"qràJÿÿPq#|Ä¥+ÿÿ<ÜÙ#|‹ KÿÿPÿ\Ù#|Äüø+ÿÿ<ÿ\ÜÙ#|oüøKÿÿPo#jÈ£+ÿÿ<Ü^#j†’Kÿñÿ1„Ù&…²+±33²+°3°$/´+° /´+´ +±é°'/°Ö±é°2³+´!&+°±+°2±é±(+±¶ $$9±$°&9° ³ !$90132654#"'7#3!3#!#632#"' ! . ']w]]þ‰ &)B9/N…%UÙþÅ;ý'Lþ´1# +2"ÿßÿ1æÙ.˜²#+±-33²$+²)+´C+°/´+°/´ +°//°#Ö´<+°%2³#+´&+°±.+´-<+±0+±#¶  "$9±.±)99±°9°³ !$9±#°&9014&#"#632#"'732654#"'7#3>32#“C)@N &)B9/N ! . 'S%K8LYSk70aPþß1# +2"(%UÙþë0'MBþtÿÿPÿ=Ù#{Æüè+ÿÿ<ÿ=ÜÙ#{püèKÿÿÿöÿ\0Ù#ÿñü÷,ÿÿÿãÿ\Ù#ÿÞü÷LÿÿHè&YZd#jÿìŒ,ÿÿÿô „&Y2&ójÛøÿÿP“„'Y.ÿÿ<ø„'Y´NÿÿPÿ\“Ù#|Êüø.ÿÿ<ÿ\øÙ#|qüøNÿÿPÿ~“Ù#qÂý.ÿÿ<ÿ~øÙ#qsýNÿÿPÿ\Ù#|Œüø/ÿÿ:ÿ\¢Ù#|ÿÇüøOÿÿPÿ\g#q’ª °ÿÿÿåÿ\÷[#qÿÉž ±ÿÿPÿ~Ù#qŽý/ÿÿÿåÿ~÷Ù#qÿÉýOÿÿPÿ.Ù#iüß/ÿÿÿÞÿ.ýÙ#iÿÊüßOÿÿPþ„'Y^0ÿÿ<ðë#vPÿÿPþs#|§0ÿÿ<ðÙ#| PÿÿPÿ\þÙ#|ûüø0ÿÿ<ÿ\ð#|ùüøPÿÿPŠp#|¤1ÿÿ<ÝÙ"|{ QÿÿPÿ\ŠÙ#|Âüø1ÿÿ<ÿ\Ý#|püøQÿÿPÿ~ŠÙ#qÄý1ÿÿ<ÿ~Ý#qrýQÿÿPÿ.ŠÙ#iÆüß1ÿÿ<ÿ.Ý#isüßQÿÿ(ÿéèÞ'YrZ#ë•2ÿÿÿéøp#v™Œ"nèRÿÿ(ÿéèè#ëœ"2jéÿÿÿéøN"ní"Rjt‚ÿÿ(ÿéèÔ'XÜP#qàƒ2ÿÿÿéø\"qhâ"CTxRÿÿ(ÿéèÔ'Y,P#qèƒ2ÿÿÿéøX"qhâ#v…tRÿÿP^„'Yæ3ÿÿ<ÿ&ë#vœSÿÿP^s#| §3ÿÿ<ÿ&Ù#|ƒ SÿÿPšs#|¹§5ÿÿ<8Ù"| UÿÿPÿ\šÙ#|Çüø5ÿÿ;ÿ\8#|ÿÈüøUÿÿPÿ\šg#qºª Ôÿÿ;ÿ\M"qà ÕÿÿPÿ~šÙ#qÉý5ÿÿÿæÿ~8#qÿÊýUÿÿ0ÿém#|¢µ6ÿÿ"ÿéËÙ"|Q Vÿÿ0ÿEmå#|©üá6ÿÿ"ÿEË#|LüáVÿÿ0ÿémè'Y"ÿö"6|´ÿÿ"ÿéË^#|M’ÿÿ0ÿémè'[¨"6|¦ÿÿ"ÿéËT#|Pˆ#ÿÿ0ÿEms#|¢§ Üÿÿ"ÿEËÙ"|Q  ÝÿÿZs#|Œ§7ÿÿÿé@"|×tWÿÿÿ\ZÙ#|Œüø7ÿÿÿEœ#|üáWÿÿÿ~ZÙ#qŽý7ÿÿÿgCœ#qüðWÿÿÿ.ZÙ#iüß7ÿÿÿIœ#iüÈWÿÿPÿF€Ù#jÉüâ8ÿÿ<ÿFÝ #jnüâXÿÿPÿE€Ù#Êüà8ÿÿ<ÿEÝ #hüàXÿÿPÿ€Ù#iÈüÈ8ÿÿ<ÿÝ #icüÈXÿÿPÿé€Ô'Y^P#Ї8ÿÿ<ÿéÝl#vˆ"nèXÿÿPÿé€Ì#qÆ|"8jÊÿÿ<ÿéÝ?"qlâ"Xjosÿÿvn#°¡9ÿÿ æ¿"VòYÿÿÿ\vÙ#|¯üø9ÿÿ ÿ\æ #|HüøYÿÿš„'X@:ÿÿ Èë#CœZÿÿš„'Y†:ÿÿ Èë#vëZÿÿšo#j8£:ÿÿ ÈÚ#jÂZÿÿšs#|4§:ÿÿ ÈÙ#|¾ Zÿÿÿ\šÙ#|6üø:ÿÿ ÿ\È #|½üøZÿÿ‚s#|ª§;ÿÿ ÒÙ"|P [ÿÿ‚p#j®¤;ÿÿ ÒÚ"jT[ÿÿ—s#|ª§<ÿÿ ÿ&ÔÙ"|R \ÿÿI„'Z =ÿÿÈÙ"iTô]ÿÿÿ\IÙ#|Šüø=ÿÿÿ\È #|Müø]ÿÿÿ~IÙ#qŒý=ÿÿÿ~È #qOý]ÿÿ<ÿ~ÜÙ#qqýKÿÿÿéB"jçvWÿÿ È#}¾Zÿÿ ÿ&Ô"}Rÿ\ÿÿÿé ò#aZDÿÿ€#|´AÜf²+² +´C+²+´++°/°Ö± 22´<+°2² +³@ +°´+°/°3±+±±99°°9013#575#5354632&#"7«SFFFFA: :;;70@0QDY8?E5®(@(Ük²+² +´C+²+°3´++°2´ +´++°/°Ö± 22´<+°2² +³@ +°2² +³@ +°2±+013##535#5354632&#"3#«SFFFFA: :WW‚DHD8?E5 D]ÿéså$‡² +²+±é²+±é´$ +±é°%/° Ö± é° ±!+±é°° Ö±é°/±é² +³@$ +±&+± ³$9°!°9±$±99°°9°°901264&#"#4632#"'53254&#^S>KIRO]om†+,B~jM.5=–^\±8f=KCþXynS:K j/€]–O:ÿÿÿð ÙGÿÿÿ\‹Ù#|¨üø$ÿÿÿE #|müáDÿÿ‹É#¬#Ô$ÿÿÿé #¬ðDÿÿ‹è'Zª'Y™d$ÿÿÿél#vòˆ¤ÿÿ‹è'Z»&Xd$ÿÿÿé l#Cÿÿÿ‹è'Zª"$¬ðóÿÿÿé t#¬Œ¤ÿÿ‹Þ'ZªÿÞ"$®ÿÿÿé c#r–¤ÿÿÿ\‹„'Zª ÿÿÿE í"ip ÿÿ‹è'Yd#{»$ÿÿÿé |#vŽ˜Åÿÿ‹è'Xªd#{±”$ÿÿÿé z#Ce–Åÿÿ‹#{»ž"$¬@%ÿÿÿé ”#¬ŸÅÿÿ‹#{»¢"$Ã:ÿÿÿé q#r¤Åÿÿÿ\‹|#{¬  ÿÿÿE Þ"{n ÿÿPÿ\[Ù#|¸üø(ÿÿÿE÷#|oüáHÿÿP[Ð#¬+Û(ÿÿÿé÷#¬îHÿÿP[…#´¸(ÿÿÿé÷¿"vòHÿÿPvè'Z 'Yˆd(ÿÿÿél#vñˆ¬ÿÿ*[è'Z´&Xd(ÿÿÿé÷l#CÿÿÿP_è'Z "(¬âóÿÿÿé`#¬—k¬ÿÿP[è'Zªÿì"(±ÿÿÿé÷a#|”¬ÿÿPÿ\[„'Z´ 2ÿÿÿE÷Û"itö 3ÿÿSìÐ#¬oÛ,ÿÿ:Ó#¬Vóÿÿ_ÿ\ÇÙ#|ÿìüø,ÿÿ9ÿ\¡Ù#|ÿÆüøLÿÿ(ÿEèå#|ßüá2ÿÿÿEø#|jüáRÿÿ(ÿéèÑ#¬cÜ2ÿÿÿéø#¬êRÿÿ(ÿéèè'Zæ'YÊd2ÿÿÿék#v釶ÿÿ(ÿéèè'Zæ&XMd2ÿÿÿéøl#Cÿꈶÿÿ(ÿéè„'Zã"2¬Gÿÿÿé/#¬²¶ÿÿ(ÿéèè'ZÜÿì"2äÿÿÿéø`#p“¶ÿÿ(ÿEè„'ZÜ FÿÿÿEøí"il Gÿÿ(ÿé„'Y6bÿÿÿé/ä#vcÿÿ(ÿé„'Xðbÿÿÿé/ä"Cdcÿÿ(ÿéÐ#¬gÛbÿÿÿé/#¬òcÿÿ(ÿét#ë§bÿÿÿé/Á"~ôcÿÿ(ÿE#|ßüábÿÿÿE/w#|jüácÿÿPÿE€Ù#|Åüá8ÿÿ<ÿEÝ #|AüáXÿÿPÿé€Ã#¬8Î8ÿÿ<ÿéÝï#¬õÿúXÿÿPÿé„'Yqÿÿ<ÿéjä#vŠrÿÿPÿé„'XÒqÿÿ<ÿéjä"CnrÿÿPÿé­#¬E¸qÿÿ<ÿéjþ#¬Ø rÿÿPÿéq#̤qÿÿ<ÿéj²"nårÿÿPÿEX#|Åüáqÿÿ<ÿEj‹#|Aüárÿÿ—„'X´<ÿÿ ÿ&Ôä"CF\ÿÿÿ\—Ù#|®üø<ÿÿ ÿ&Ô #|Æý\ÿÿ—µ#¬2À<ÿÿ ÿ&Ôí#¬×ÿø\ÿÿ—u#¯¨<ÿÿ ÿ&Ô°"Wã\ÿÿÿó5æ" $wDÿÿÿó5ä" \sDÿÿÿó5ô" 1>Dÿÿÿó5ô" >FDÿÿÿó5ô" 2KDÿÿÿó5ô" ?>Dÿÿÿó5k" 3qDÿÿÿó5k" @qÿDÿÿ‹å" $Ù%ÿÿ ˆå" \Ò%ýÿÿÿòÖä& 1 %Kÿÿÿóáë" >¯%Vÿÿÿï¡å" 2­%ÿÿÿí¨å" ?œ%ÿÿÿñŽT" 3äê%ÿÿÿåˆW" @Øë%ýÿÿÿöÓâ" $VþHÿÿÿöÓã" \`ÿHÿÿÿöÓô" 1,HÿÿÿöÓô" >4HÿÿÿöÓô" 28HÿÿÿöÓô" ?,Hÿÿÿóšå# $ÿ)?ÿÿÿî‰å# \ÿx).ÿÿÿðDå" 1ž)éÿÿÿñ2å" >­)×ÿÿÿï#å" 2­)Èÿÿÿñ/å" ? )ÔÿÿÿJéñ" $r JÿÿÿJéô" \tJÿÿÿJéô" 1=JÿÿÿJéô" >OJÿÿÿJéô" 2|JÿÿÿJéô" ?[JÿÿÿJék" 3fJÿÿÿJék" @xÿJÿÿÿñ³å# $ÿ}+2ÿÿÿ÷¹å" \+8ÿÿÿò`å" 1 +ßÿÿÿøbå" >´+áÿÿÿô^å" 2²+Ýÿÿÿôaå" ?£+àÿÿÿÝT" 3Ðê+ƒÿÿÿÝU" @Ðé+ƒÿÿ,ÿøô" $¸Lÿÿ8ÿøô" \ÂLÿÿÿôÿø&ô" 1¢Lÿÿÿ÷ÿø&ô" >³Lÿÿÿûÿø!ô" 2¹Lÿÿÿùÿø(ô" ?¨LÿÿÿËÿøk" 3¾LÿÿÿËÿøk" @¾ÿLÿÿÿñîå# $ÿ}-,ÿÿÿõíå# \ÿ-+ÿÿÿòŽå" 1 -Ìÿÿÿñ‘å" >­-Ïÿÿÿñ‰å" 2¯-Çÿÿÿóå" ?¢-Îÿÿÿà6V" 3Óì-tÿÿÿÞ2Z" @Ñî-pÿÿÿöå" $gRÿÿÿöå" \rRÿÿÿöô" 1:Rÿÿÿöô" >BRÿÿÿöô" 2GRÿÿÿöô" ?:Rÿÿÿïÿéåè# $ÿ{3ýÿÿÿôÿéîë# \ÿ~3ÿÿÿòÿé¼å" 1 þ3Ôÿÿÿóÿé¹å" >¯û3ÑÿÿÿñÿéUå" 2¯þ3mÿÿÿóÿé_å" ?¢3wÿÿ<ÿòòæ" $`Xÿÿ<ÿòòã" \hÿXÿÿ<ÿòòô" 11Xÿÿ<ÿòòô" >:Xÿÿ<ÿòòô" 2@Xÿÿ<ÿòòô" ?4Xÿÿ<ÿòòj" 3bXÿÿ<ÿòòk" @bÿXÿÿÿîçå# \ÿx8Pÿÿÿïå" >«8øÿÿÿôÇå" ?£80ÿÿÿï[W" @âë8Äÿÿÿ÷ºã# $Æÿÿ\ÿÿÿ÷ºâ# \Ðÿþ\ÿÿÿ÷ºô# 1œ\ÿÿÿ÷ºô# >¤\ÿÿÿ÷ºô# 2©\ÿÿÿ÷ºô# ?œ\ÿÿÿ÷ºj# 3Ì\ÿÿÿ÷ºj# @Ìÿþ\ÿÿÿóÄâ# $ÿÿþ<÷ÿÿÿñÉå# \ÿ{<üÿÿÿñè" 1Ÿ<Âÿÿÿïè" >«<Àÿÿÿó2â" 2±þ73#"=3} !1JL %*Oc2( ÿÿtAÌä¶Bÿÿ lGÔÿÿ yG„# %°jÿÿÿ8éë"Í Üÿÿÿ:é"ÏJÿÿÿ9éë" ÝËÿÿÿJéà"mJÿÿÿ8éà"Ì *ÿÿÿ÷å" P×)ªÿÿÿãÈå" [‘)mÿÿ?å" Pð+¾ÿÿ,å" [´+«ÿÿP\Ù# #©+ÿÿRA„ä# P“ $ÞÿÿBAhä" [E $Îÿÿ 9Gj' %– $ øÿÿÿÍÿøÞ"{¾LÿÿÿÛÿø"q¿àLÿÿÿãÿø*ý" NÁóLÿÿÿïÿø6ø" OÍîLÿÿÿÇÿø¿"ÂòLÿÿÿðÿø*l& &ãèLÿÿÿý*„#{ÿî¨-ÿÿf#qÿæ©-ÿÿÿå-å" PÅ-kÿÿÿâ$å" [-bÿÿDAsä# P‚ \ÎÿÿQA€ä" [] \Ûÿÿ 9Gl' %˜ \øÿÿ<ÿòòÞ"{^Xÿÿ<ÿòò"q^àXÿÿ<ÿòòý" N>óXÿÿ<ÿòòû" O>ñXÿÿ<ÿ8 å" $~Tÿÿ<ÿ8 å# \ˆTÿÿ<ÿòò¿"aòXÿÿ<ÿòòk"X &\çÿÿ—„#{°¨8ÿÿ—g#q±ª8ÿÿÿÚ-å" Pº8–ÿÿÿÉ7å# [ÿw8 ÿÿÿó§å# \ÿ}5I"li  G²+°3±é± 22° /°Ö´<+°± +´ <+± +±°9° ²99901#'#5!#5¾A:aSES žžISSSSÿÿ"li ÿÿ PñäC ÿÿÿ9ºë#À äÿÿÿ9º#À\ÿÿÿ9ºë#À åÿÿÿ÷º¿#Ðÿò\ÿÿÿ9º¿#À Tÿÿÿ¿ÿé$å" PŸþ3<ÿÿÿêÿé$å" [˜ø3<ÿÿÿÇÝ" P§õ2²+° Ö´ +´%  +°/3´%+°:2´  +´+°D/° Ö´+°±+´+°±#+´(+°(±,+´+°±8+´=+°=±A+´2+±E+±³$9±,(³ $9±A=±5/99±%*µ"#278$9± ² 999012#"&46"2654&%3#2#"&46"2654&%2#"&46"2654&ž?WX=>XX=%56J55(BþuB‚?WX=>XX=%55J65B?WX=>XX=%55J65ØX@=XY|X<5%&55%&5Fý +X@=XY|X<5J65%&5XX=%55J65B?WX=>XX=%55J65ûÅ?WX=>XX=%56J55(BþuB‚?WX=>XX=%55J65X@=XY|X<5J65%&5Xé °/±é° /±+01"05>32&K·Y9€UV€9Y—Y@9229@Y#ÿ7“3#'#D>‰š>{y>âûÈÈÿÿ 6Ù' ßþI' ÿâþJ ß2¡^A(°/´ +´ +°/±+´+±+01!5^þÔA  ÿNÿìZÙ²+²+°/±+013#>þ2>Ùýyÿ,Ù!J²+´++°/´++°"/° Ö°2´&+°2² +³@ +±22±#+±° 9017;#"&=47.=46;#"Æ%.49R.$94.%",,"V¦'AE>¶x&FE¶>EA'¦F; E <ÿ,ºÙ!J² +´ ++°/´++°"/°!Ö°2´&+°2²! +³@! +± 22±#+± °90174&'5>=4&+532+53265m",,"%.49$.R94.%VE< E ;F¦'AE>¶EF&x¶>EA'ÿÿM)å#","ÿÿMüå',"ÿÿ|å&".ÿôœ 2²+° /± é° /°Ö±é² +³@ +± +± °901#>7!5QJbFaþœJg”cT{‚W0ÿO ÙS² +´ +°2² +³@ +°2°/° Ö´+²  +³@ +°±+´+´+±+01####532 mb@R@9ú^‚é^ƒþLJü¶J@‹Jú L°/´+° 2°/° 3´+°/°Ö´+°±+´ +²  +³@ +° 2±+017".54>3!#33îB`--`B 99ËRJDi>=hF@þª@–þªV Jú T°/´+°2°/°3´+°/°Ö´+² +³@ +°2°±+´ +±+±° 901%!53#5!2#3+þõ99 B`--`‚RRJ@V@Ci?>iD–þªÿÿ(W" þI?ÿm¨ O²+´ +² +´+°/´+°/° Ö° 2´0+° 2´0+°2´+±+017#"=3#¨7"ihhhh5%&ƒx¤h;XÎ +°/±é° /±é°/±+± · $901%270#"&'5"5>32&K´Y9€VU€9Y··Y9€UV€9YgY@9229@YY@9229@Yÿÿ(Wå&  þIÿÿ<Hî' ¡î'yÿåyÿ%ñ€°/± 33´+³ +´+°/±+°6ºí ÂÙ+ °.°À± ù°À°³+³+² Š Š#9°9´.....µ......°@013#"&/&#"#>32326Å+H>/-##5+O854$0 #91  .14 ;ÿ4Xÿß °/±é° /±+01"05>32&K·Y9€UV€9YsY@9229@Y$ÿòï½ay²6+²+´LQ6 +°3´L+° 2°b/°9Ö°2´3$+°2±c+±39@  .0<>`$9±L6µ(.+>AD$9°Q@ #%GITV$9°´ Y`$901'&546276327632#"/#"/#"&54?&'#"&54?&'#"&463267'&546326q "." m! *™» $$ º›* "m "# m  *™» $$º›* m¨º $$¹š* !m "." m"*™º $$¹š* "m "." n  ™ÿÿ<ÇD'yÿ'yùyå ÿÿ1¶GÌ& ' Ì' ™ eÿÿ<–²&yåO'y×O'yÝÿyÝgÿÿ<™Å'yÿåÿ'yÚÿ'yÿåw'yÚzyßTÿÿ<¤'yÿåÿ yÿåÇÿÿ<ÿ9– 'yÝþV'yÝÕ&yåy×ÿÿ<)  'yÿåÀ& 3'yÿåÿH'yaÿHyaÂÿÿ<ÿÿ¤ 'yÿåˆ'yÿåÕyÿåÿÿÿ<¤&yå'yÿåÒ'yÿåÿyÿåýyD/J°/´ +° /´+°/°Ö´ +° ±+´+±+± °9± ±99014 #""3265*LI•ð¶Z/-SÜßin‡­®U[ÿÿ*†b`L†)™†Q/ `°/°3´ +°2² +³@ +²  +³@  +°/° Ö° 2´ +°2² +³@  +² +³@  +±+± °901#533##=мÌ.CC>ê; þð5d™ªªxF/“° /´+² +³@ +°/´+² +³@ +°2°/´+°/°Ö´+± +°6º?Hön+ °.°.°±ù°±ù°.³....°@±±99±°901#632#".'332654&#"#7.¾&.BRXE%98I/56.1#4"/4wO?CU, G4./7(èxG/$o°/´+°/´+° /° /´+°%/°Ö´+°2°±"+´+° Ö´ +±&+± µ $9±²999014>32#&#"632#"7"32654&!.)5D8?14&C=OTAšœ*45'(30G8W1 ;4@SN/L;>Qç1()64(+1†G/ 3°/´ +° /°Ö´+² +³@ +± +± °901#>7#5G•$=QR÷/,¹Äh m4xH/*„°/´&+°!/´+°/´+°+/°Ö´#+° Ö´+°#±)+´+° Ö´+±,+±¶  !&$9±!&±99°± 99°± 9901#"&547.54632&"2654"32654úNVCDUN#M<=LJH++H+$V44*,4e"H:IJ:G"'1@?2&‡$%%.%&..&%xF/$ƒ²+´+°/´ +°/´+°%/°Ö´+°° Ö´ +° /´ +°±"+°2´+±&+±" µ $9± ° 9±²99901#"&'33265#"&54632"32654&F!.)5E9?14)?>NTAš›'30(*55_8V1 ;4@SN/K<>Q.5(+23')7ªMæ X°/°3´+°2² +³@ +² +³@ +° /°Ö°2´+° 2² +³@ +² +³@ +± +01##5#5353L†.††._.††.†† 0S^(°/´+´+°/±+´+±+01!5Sþ¸^..ÿÿ S¤& ËÖ ËFo!ý„ ° /°Ö´+± +013#.46Ù$YY$199„þ¾‘@¥š¤ÿÿN!Ü„ ÍK¥Àÿÿ'†7åQ†)™ÿÿÿ+Dá Âý²ÿÿEÿ8æá{ý²ÿÿÿ8Fátý²ÿÿÿ*Báuý°ÿÿÿ8Qá Äý²ÿÿÿ*Fá Åý²ÿÿÿ*Gá Æý²ÿÿÿ8Gá Çý²ÿÿÿ*Há Èý²ÿÿÿ*Fá Éý²ÿÿÿeM¡ Êý»ÿÿ ÿéT Ëý¹ÿÿ ÿ±TO Ìý«ÿÿoþÔý7 Íý³ÿÿLþÖÚ9 ÍIZÀÿÿÿ1UŸDÿ@)™ÿÿÿ-I›Hÿ<)™ÿÿÿ-H›Rÿ<)™ÿÿÿ8/[ÿ8)™ÿÿÿ.Gœüÿ=)™&QÛ#§²+´+²+´7+² +³@ +´! +´+°° Ö´7+´  +´+°$/° Ö´&+°±+°2´+° 2² +³@ +³@# +³@ +±%+±°9°°9±± 9901%!!5".54>32#.#"5!!3E þ®±ó!+ °°À±ù°Àº>±ó!+ °°À±ù°À³+°³+º>±ó!+ °³+°³+³+°³+º>±ó!+ °³+°³+³+³+°³%+º>±ó!+ ³&+°³(+º>±ó!+ ³)+°³++³,+² Š Š#9°+9²9°)9²&9°9²9°9@&)+................@%&()+,........................°@±(²"#99901#7&'#7.54>?373#&'>73'&''O 7+#7<8&9];7,# 7BTk=C Uüv .t"OiKU@C[|6°Y/_fO8((<\;~- ýù e_þçL;ýÊI~‰ ÿé9å)¨²$+±é²$ +³@ +²+± é²  +³@ +´$ +±é°*/°Ö´1+°±+±é´&+°± +´!<+° Ö´<+±++±° 9°°$9° ±99° ±99±³ !$9°±99014>32#&#"3>32673#". (>fAÏ!RZi?8M$C( TT”S ‚q@f<(d2bjO4ÜŠ¢Œf‘O_;3UJgg³€†3Ni`,Ùx²+²+±é´  +°3´+°2´  +°3´ +°2°/°Ö± 22´<+±22² +³@ +°2³@ +² +³@ +° 2±+013###535#53!!3ÎþþSOOOO£þ°þ‹B7þî7B7RÅ7ÿéÙ9î²+²+´B+².+±7é²7. +³@74 +± À/±é°2´!". +° 3´!+° 2´&'. +°3´&+°2°:/°+Ö±é²+ +³@+& +°!2³%++±é°± +´ 1+² +³@  +° 2° ±5+±4é±;+±%+²(999± ²999±5 µ.7$9°4°9±²999±7'°+9013#3#632327#"&#"'67#53&'#53.54632#&#"“& ˆ}†Y;?!h(+*9J+†#580e|nQ"‰e5>,X„@M ,> 7(62Z'B8.%BW>6!!791![{ 1W9šFFÿ§úr&*Œ²&+±33²+²+° 3´!C+°2² +°+/°&Ö±%é´&+°%±+°2±é°'2°±+±é±,+±%±99°°9°³ ($9°° 9±!&µ'($9013>32>?3#4&'#5#54&#"#7FM"K4a,#D0<7>58T'#’T•7Ì3.3HT„Y'1 J/*P*$W[ I;þwi+5Õû€Ù*˜27P9þ·K‚ GG“Ù#&)»²+°3²+°3´  +² 333´ 7+²$222´ +²"333´7+²'222°*/°Ö± 22´&+± '22² +³@ +°2°±&+±22´&+±22²& +³@ +°2±++±&µ!%($9± °&9±°)901##'##5#535#533333##5##3'##3'“3]ƒ¾N----ZйO33O“3ï˜2fO::þ±@@7FññññF]FÿÿÿÿF]]]]£lUu[ÿéÙÙN:²E+²:+°53´C+°2²F+±é²J+°3´?++° 2²#+±)é²)# +³@)% +²J? +³@JM +´C:M +±é°O/°EÖ±Dé°2°D±+±Jé°J±=+°K2´ <+°M2² = +³@ +° ± +±,é³, +±é°/±é°,±+±2é°2°% Ö±&é°&/±%é±P+±J°?9± ±:99° ²78999±,°9°&µ#/5$9±%°09±E°79°C³.2$9°± ,99±)?°9±#°9013264&+#327&'332654&/.54632#.#"#"'#"&5#+#!2353¸ÂCKKC–VX5E7C$-4Y?YY«X&0'1S6PDucz2> 14CiKå]-jt8LZ>3 +(ŒDOþËÙjcÿÿPÿéxÙ'V­525Ù#'+.141²+°3²+´$3´ +·  #$'()$3´7+·,-/0$2´  +· !"%&*+$3´ 7+· 23$2°5/±6+°6ºÁxò^+ °.°.°±ù°.±ùº>Vñ€+ °.±.°.À±4ù°ÀºÁ¾ñ)+ °.±4°4À±1ù°Àº>Ùóé+ °/.°.°/±ù°±ù°4³4+°³+³ +³ +³ +°³.+°.³.+°³1+°/³/+°³+³+³+°/³ /+³!/+°³"1+³#1+°.³$.+³%.+°³&.+³'.+°³(4+°4³)4+³*4+°³+4+°.³,.+°³-.+°³01+°³24+°4³34+².14...@+  !"#$%&'()*+,-./01234...........................................°@01!#'##'#53'#53333333#3#'7#!7#;'##%#3'˜W9©7W5iZF78X3KL>;HGÈ6CF1_nn\_2NNKþW.eRSdcRUdÈ?ýØ>,'ŠwqˆIŒ?))ýJ??$ÿékÅ0s²+±+é²+±é´ +°%3´+°'2´ +°!3´+°2°1/° Ö±$é±2+±$ ±99±+°/9°°.9±°9°°901".'#73&547#73>32.#"!!!#3267¤>g@/S7O?/@l@c^3K,DsEþÉÿxD)E9G-AQ=;;9QA/CI&d_;;\k"Y+’ÙL²+°3²+° 3´ +±33´7+± 22°/°Ö°2±é°2² +³@ +±+01##533333###¬]77]F%xþ×ì¹ùn÷ÿÿgH*þÖ*þÖHþ™gQÙD²+²+±é°2°/°Ö± 22±é±22² +³@ +² +³@ +±+01#5575575#5!#7ò]““““ð<ï™F]ö¹_F_f_F_ÜRRŸ]F]fÿÿÿ8ÜÙ'T¼("ÿ8'× 3²+°3°3/± é°/±(é°4/°%ֱ鰱+±0é²0 +³@3 +°° Ö±+é±5+±%³$9°²(999°°-9± ±099°·%+-$901654&#"2654''#>7.54632#b5( (Ghq;'j…C%ZK:P[DG}R§\F(%3ýÙ."t”êssPu@. (! K[J8e¤c¦aM]'šÙ!&-¤²+²+±&é´ +±é´ +± 33´+± (22´ +±'33´+±"22°./°Ö±22±é²"'222² +³@ +°2°±++°)2± é² + +³@ +°2±/+±+±#99° ±!9901327!%#3#+##535#535!2)&+!654'¸ÂQ%þÈâ42<fFå]4444-Qlþ]3%LÂM‡1¤0 0=Fþ˸0D0}@=+[DZÿ£“ "+˲+²+± é°+2² +³@ +²+²+°"3± é°#2² +³@ +´ +±é°,/°Ö´&<+°&±+±#22´+± 22°± +´+²  +³@  +°° Ö±é°/±é°´+°/±-+± °9± °9°±&99° °9013#.'>=#53#'#5.54>7_Blu¿2:xGPOxkÜ 52JÎþ¨4 @;V@7T2 +<753#.'>73'b;þú(6N0;lh_8CL=`oy;YP~hd"=H;;*64`sG9ýÀDaˆnT> ˆ…þñ äÙ K² +²+±é´  +°3±é° /° Ö±é² +³@ +°2²  +³@ +°2± +015!!### Äþ<ij]´‡RRRRþã ÿùçÙ'޲ +² +´C+°"2´ +´C+´ +°&3´C+°$2°(/°Ö°2´+°#2² +³@& +°!2² +³@ +°2±)+±° 9± ±99°°9°±9901#"'.'732=!5!5!5!#3#„K6 :y3 #'1@;J>þÑ/þÑÛccc’3BT“ 6")4E])-).XI[II[Iýø.ÿîì°/´+°/01!67þ Z^O S$Mpb ýø.ÿîì°/´+°/01!&'7!ýø– O_Yþ S bpMÿ6ÿòÿm¤²+°/°Ö´+´+013Ê7²ýNÿÿÿÿY#²+²+°/°Ö´+´+013ã<ýèý÷ °/´+°/01.#"&'67>326•D=–0'zc€$ 4›GM¥i27<* / $zl …#+=;ý÷ °/´+°/01>32&'7'67.#"ý3¥MG›4 $€cz'0–=D•6i3;=+#… lz$ / *<72ý§"ÿ÷y ² +´+° /± °901!&'67 ýû OAbbAO à$ bM^^Mb ÿÿý§"ÿ÷y ýžœÀþwmÿ’ J° /´7+°/´7+°/°Ö´+°±+´ +±² 999±± 9901$2654&"7#"&5462þí:-*@+ÞX;7!.'>7ýÁô*$!#=##=#!$*þ *$!#>##>#!$ç,+.*#??#*-,,,,-*#??#*.+ûrÿnÿÿT°/´7+°/01 !…þ>þ< ûsGJÿýHæýCÿÃÿóí #ýdLýœíüÖ*ÿÿþÁÿòÿu¤ Ýþ{þPZH~2°/´7+² +³@ +°/°Ö´+² +³@ +01#!5HHþP~ýÜÜHÿÿþ)ÿ_ÿÇ'yýÒþ|'yþ‰þ|yÿBþ|þ0÷¯>°/°3´ +°´7+´ +°/°Ö´+°±+´+01!#5!#Gþ¿HÐGgp¸¸üBÿÐ" °/´ +° /± °901!&'670üå2y#d——d#y2781—#ww#—1ý®ÿJO###Jþ>GÅOþ>GÅOýN²ýN²ÿÿýûÿ ÿñÿÉ ýýé÷ÀÿÿýøÿÿîÿÌ üýæúÀÿÿý¶þâÿäG ýI@0ÿÿý§þàÿ÷ÿâG ýž{ÀÐþÓ6ÿ˜ò6² +°3° /°3´ +°/°Ö´+± µ $90137''7'7ß)E F-!()!-F EòI':==:')ÿì3å4AfT²_+°3´V+²V_ +³@VY +²+² +´+² +³@ +´&>_ +±B33´&+°2°g/°)Ö´;+³;)+´+°;±2+°/2´ +°2° ±d+´S+°S±J+´E+±h+°6º>šò±+ °.°À±0ù°AÀ°A³/A0+º>¥òä+ ³5A0+²5A0 Š Š#9µ/05A......³05A....°@±;±&99°2· ,7>$9° ±99±JSµBMVX_$9°E±Y99±&V²EMd999°>°9°µ )2;$9013#"#>32327#"5#"&5467>?654&32672#654&#"3273#".546ë:ýŽ:ŽN< ZK8E.  7    07N]I.,@43"0Q…8E='"#7,%P!= #A)&8 yÙýÁC<>-$Ù/8   1,0L  “ #2!R>,  $#1<+*1[2-,s—)ÿì>å0=Ay¼²\+°@3´g+²>+²+´+² +³@ +´":\ +±E33´"+°2°z/°%Ö´7+³7%+´+°7±.+°+2´ +° 2° ±_+´d+³Bd_+´S+°d±l+´Y+°M Ö´H+±{+°6º>šò±+ ° .° À±,ù°=ÀºðzÁé+ °w°sÀ±Uù°VÀ°=³+=,+º>¥òä+ ³1=,+ºïÊÂ+ °w³tws+³uws+³vws+²1=,9²vws Š Š#9°t9°u9@ +,1=UVvwstu.............@ ,1=UVvwstu...........°@±7±"A99°.·(3:@$9° ±99±lS´EP\gq$9±"gµBHPY_a$9°:°9°µ %.7$901"#>32327#"5#"&5467>?654&32673#4632#454&#"#"&547332>54.1'.N< ZK8E.  7    07N]I.,@43"0QÓ:ýŽ:]J5A<" )3=7/(aP?G@(&,    58+­C<>-$Ù/8   1,0L  “ #2!ý ;Q/&  ( &!AM1, %0ÿé¥å!u²+±é² +³@ +²+± é²  +³@ +°"/°Ö± é° ±+´+°±+±é° Ö±é±#+± ²999± ²999014>32#.#"32673!".00GyLî+_^W6+/:Z``!þõKwG/ªMd2bjO4îNNýÖejþß3Ni`¶×Qž—ÿÿÿéÉå"r‡&,3­%,—²'+°3´++²' +³@ +° /´++°!/´&++°2°-/°Ö´*+°*±!+±&22´+±22²! +³@ +°±+´&+° Ö´ &+±.+±&!°9°'³ *$9014>753#.'>733!5.4%G1JC> K K CIØþÞ1G%­/45n$GI3PP QCþµ& Ob ACƒ3GG‚O XFCW0ÿìýå(:L¼²2+°3´;+²+²+´+´! +°D3´+°)2²! +³@ +°M/°&Ö´+°± +´+°±5+´J+°J±A+´,+±N+±&°9° µ!$9°°9±AJ±)99±!;±,599±´  &$9013#2#654&#"3273#".5462#"&54>2>54&#"¬:ýŽ:Ò8E='"#7,%P!= #A)&8 yÈ?L /Q2=K /P#8,(#7,Ùýø>,  $#1<+*1[2-,s—þ K<AL=)K<@L=)þ£"0<+,1#0<*+20ÿì(å(?A²*+°)3²-+°3´:+²:- +³@:3 +²4>?222²+²+´+´!- +´+²! +³@ +°@/°&Ö´+°± +´+°±0+°22´7+°52±A+°6º>™ò­+ °2.°3À±5ù°4Àº>¡òÑ+ °*.°?.°*±)ù°?±>ùº>Ìó¨+ °*³+*>+³=*>+²+*> Š Š#9°=9³+25=....·)*+34=>?........°@±&°9° µ!$9°°9±!:±0799±´  &$9013#2#654&#"3273#".546#7#"&5473326?3ª:ýŽ:Ô8E='"#7,%P!= #A)&8 y.7 ,  $#1<+*1[2-,s—ý):*% #þõ F:Öÿÿ(ÿéeåR+ÿé å$£²+± é²  +³@  +²+±é² +³@ +´$ +±é²$ +³@$ +²$ +³@ +°%/°Ö±é°° Ö± é° /± é°±+´<+°2°±#+°2±é±&+±#³ $9±$°901#533.#"#632# 33267#KRRõ x^W^_+îLyG0/GwKþõ!``Zg÷Î>s‚NNî4Ojb21`iN3!je“~ÿÿ(oÙ"r‘)6ÿêºÍt}k²;+´M+².+´"+²+´u+²+´FA; +´FC+´5; +°3´+°x2´_; +´+±r À/´g+²gr +³@gl +°~/°>Ö´J+²J> +³JC +°J±e+´+³e+´b+°b/´+°±1+´ +² 1 +³ * +° ±|+´+±+±bJµ;OSXjo$9°e²Pgr999±²Q_999°1°\9° ²7]999°|¶4x$9±F"² >J999°A´'%*1H$9°5³OQUX$9°±\99°_°y9±g´]bo$9±ur±|9901326?623>3232676;2#"&54?#"#"&54632#"'32767#.5476?#"&54654#"+"54632%"67654!'\&™ä€jÃaG14®tIc9#U( <^$:9L@<.yAÃP9K0#!$ ?4d–+HŸ\  VÒJ3.)%4$ i'!&j3–bÜP0@73%•þÕ©@6FI?fE3K8 FD60TkY¨[ˆ)& @"×>YkyW963 kU™…pD+-ÿ‘OÎiʰ3/´.+°S/´Z+²ZS +³@ZW +°G/±é°/±é°j/°`Ö´ +° ±]+´M+³6M]+´++°M±D+´&+±k+± `°Z9±6]°9°+°J9±DM@ !(.13BU999°GµD32&'654&#"327#"&54>73254&#"#"'63232654&54>7>58A � *-0Me4(,6 # +#$! &8   Q`K N (2$ %D0R  +'³ W,!  -"’p)EG,,6 0#"0(4 $  Á[n?A1M+ S+$!7)!8.YÙ u² +°3´+°2² +°3´ +°2´ +±é°/° Ö´+°±+´+°2°±+°2´+°±+´+±+0133###3#33ä¿¶¶¿¶¶7HH-Hž;ý'Lþ´Ù6ý“mý“mÙIJ+² 333²+°3²+´7+°/°Ö° 2±é° 2±+°6º>ŸòÈ+ °.°.°±ù°±ùº>™ò®+ ° .° À± ù° Àº>šò±+ °³+³+² Š Š#9°9³ ....· ........°@±°9013>32#654&#"#·T9/T8?HPTI/&Dd=TÙþò,$C;þˆW &/`RþßVNÙ²+² 333²+°3²+²+´7+° /°Ö°2± é° 2±!+°6º>ŸòÈ+ °.°.°±ù°±ùº>™ò®+ °.° À± ù° Àº>šò±+ °³+³+³+°³+°³+² Š Š#9²9°9°9°9¶ .......@  ...........°@±° 9±±9901>32#654&#"#?3U/T8?HPTI/&Dd=TzVWT ÃH“,$C;þˆW &/`Rþß?HR3ÿï†ÍMé²K+´+°/´C+°"/°G3´+°:2°N/°Ö´+² +³ +°±$+´+°±=+´D+±O+°6º,Âð+ °(°*À± ù°À³ +°(³)(*+²)(* Š Š#9² 9µ ()*......µ ()*......°@±$±K99±=´"9:G$9±±99°°901>74632"'326?&547>7632>54'4;2#"&>K(DO4_'M*3<þy/#!$( v?ž=^5&xm£5LtG)(Hq Q;Ý\:NU;!y:UE# ,Tþ«?":{VWAL6G,0ieK[xG *W| \‚(ÿ©O»8½°/±é³+±é² +³@ +°./±(é².( +³@. +²(. +³@(* +°3/±"é°9/°Ö±8é³8+±é°8± +±é° ֱ鰱*+±+é±:+± µ"13$9±±&99°±(.99°*°9±.²999°(°19±"3°&90146323254&54673#"&#"46323273#".#"BT569"Z 'YD1Ž``1J(!0TO>&B';"#W?Z4dAJ#+?GaZ€4% Ž{ !?.l#)# !J8)ÿï_âDMW8²7+°23´JC+²7+±)é²+° 3´N6+´E<7 +±Eé´B7 +°3´B7+°@2°X/°9Ö´H/+°H±+±é°±U+±é±Y+°6º<íìg+ °@.°À±#ù°RÀ°@³@+º=”î+ °#³!#R+³"#R+²"#R Š Š#9°!9³R!"#....µ@R!"#......°@±³7BL$9°°,9±J7°49±E)³'9HL$9°<²,+>999±B° 9°N²999°° 9014>767327>32327#"'#"5463267#"&"327&">54&Ö7B 46:EID]IAN>{W 61@6K'*@#VCw0¯gX@d) [{'D,D>Æ%5V`á">,- E.4!*3Ћ740XZB 91&q$3%2b,P;%†cþÜ #  &qXz1ÿõÆÖ$-"² +±é°(/±"é°./°Ö°2±é°2°±%+´1+±/+°6º=£îÆ+ °.°À± ù°*À³*+³*+°³+³+³+³+³+³+³+°³+*+² Š Š#9°9°9°9°9°9°9²*9°9°+9@*+..............@ *+............°@±°9°%³ "$9±(´ $901327#"&54>7'7>324&#">Æî  /)=@k/5 4"o #63P !#!E?Xt )a) BN;02'B )9LS.A#- K9vl?QÿéÊÙ)§²+°3² +±$é²+°3²+±é´ +±33´+±22°*/°Ö°2±é°2² +³@ +°±+°2´<+±!22´&+² +³@ +°±'+±é±++±'± 99±$² 99901!632#"'####5353353"32654&]þë9ihx|hk;KXTDDTXS’BPPBDUS 2©V”‚ZCný’n29999Óo¸ooY^pL†Ù P² +°3² +°3´+°/° Ö± é° ±+°2±é±+± ² 999± ² 99901#53##`w÷÷Xiþ‡X¤ý¹˜äþƒ}ý'Oý±Ùÿÿ@ƒÙ/R˜.f133@8ÿÿÿ'ÿòùÄ/çï¤.t4ÿjÆ-6«²+´ +²  +³@  +°/´4+°/´++°7/°"Ö°&2´2+°'2°2±.+´+°±+´+°±+´+±8+±2"°$9°.²)999±²+999±4³".2$9± µ$&)0$901%#"'332>54&#"#"&547&536324'326*L2m2!'8 1B ?,0(,0/+(((2s–JUþ–9!þ.ZR3š.<'BD%IX$-M/$7\30CG.iWDjT*÷zþ’>X8YG![iÙ ]²+´+²+±é° 2´  +±é°/°Ö´+°±+´+° 2°±+±é±+± °901+#!2%3264&+3iq[Џ-luþªgCKKCžJJ]qþËÙoÿDxDý­&ÿÅæå!(‰²+±é²+² +±é°)/°Ö± é° ±+´+°±+°2´#+°#±&+± é±*+±² 999±&#±99° ±99±°9°· "$$901'#"&632/7&#"327%654&Ý/iVižÂžÃg?.1;@54@85þèW¦O2:W3ÓVÓÒª¬q58½ýÝ*ÕS——‰þ9Y‹N|ÿïyÍ ‡‘h²3+°%3´E+°2²x+°u Ö´P+´>93x +´>7+´mX3x +´m+²Xm +³Xd +´ Ž3x +´ +°’/°6Ö´B+²B6 +³B; +°B±p+´U+°U±(+´+²( +³" +³f(+´_+°_/´f+°±-+´+°±+´ +±“+±Up±E399°_°m9±f(±Id99°±*L99°-· +/Puˆ$9°²999°²Nw999° ±x}99±>E³(6B$9°9µ"*@$9°m±+99±ŽXµ/I-$9° ²Lp999°Pµ Nwz$9012>54'%32676;2#"&54?65##"&54632#"'326?46367&#"3267>=4>32#"&547>3272"#"&#"6fDnnp*"0>+ "K]/ ¦" OQ4""J>ÌU;P/#!# >3;Ž=[Ž<{jç@7BF%?&  m1&:8=ûv…J2 $þì m y@'U¶À%E/(+0i(GD…2#qHnX€'$<" wU€ ¾f,wZO4 615 K:D()*H)/?NVˆ/  ßÿø­å!H²1+°3±8é°2²81 +³@8 +³@84 +²)+°3±Bé°!2°I/°&Ö±$%22±Eé°F2°E±?+±,é°,±+±é² +³@! +°±+´$+±J+°6ºÀ9úª+ °%.°"À±Fù°HÀ°%³$%"+ºÀ­ö¶+ °F³GFH+²GFH Š Š#9µ"H$%FG......²"HG...°@±E&°49°?²15)999°,°.9±°9°° 9°²999±B8³&,$90123273#".5>54&#.54632#"&5332>54&#"[Ž‹),#  P42(9#!&%O[þÀaMLW*L9-YU$&&/ åNF)M+.EP70 16'Ev…`4' š)?PuY‡¼“GD, ?FrbK.J!> ]§Ù&*š²+°3´*+² +±)é°2´ +±é°+/°Ö´*+°*±'+´+°2°±+±é° Ö±$é²$ +³@$ +±,+±° 9±°9±*°9°²999°° 9°)°$9014&+326#&=4&+#!2#*LCˆˆJE +q:>—¶Pks6þ‡H H6û<`&0* ")8.IAC?þÆÙe^>Rþ®Sý­]ÿÉ0Ù%.{²+²+±*é°!/°3´ +´ + +± é°//°Ö± é°*2° ±&+±é±0+±& ³$9°²%999± ³%$9°+²999°*°901#7.+#!273#.'4&+326_ ð]Pks6=!%\^‘" Hq:R8:‡ÕGQJ#ÄH6û<]ÿ˜§~$(03œ²!+°3²"+°3±'é°02´3(!" +°)3±3é°2°4/°!Ö±1é°'2°1±+±é°- Ö±é²- +³@ +±5+±1!°9°@  #$&)02$9±-°9±3!±199°(° 9°'°9°"°9017#&=4&+'7#!77#;2654&'7#Úô_d6= +q:>y˜8",ˆ\±•LJED<ð88E8YLdX>R&0* ")8.IAC?þ^SÙ'þŒûû Ö°C3´0+°Q/´b+°k/° Ö´+°32°´:+°:/°T3´S+°±-+°Y2±Dé°D±K+± é° ° Ö´e+°e/´+±l+±:° 9°S±^99°-µ+067>`$9°Dµ(AQb$9°K±&99±)F°+9°0³-3:K$9±Q>² ST999°b±Y99°´ ^`$901"#".54>32#"&'"654&#"3"&54>3232732>54.#"#4>7.'6732654.ú9D0  1Z9FQ7S[06%*3& !8 .'++' 6!!  +J.S="1)! ;QJg %@j!E-! (2D8(.\=Bl 4Q-*A%!* .!<&%/ S7 / 4D7'n6  2[G %-%ÿÿ ÿÿâL ÀÿÿP“Ù.ÿÿ‹Æ‡ÿò‚Ämxƒ€²k+°I3´+°]2²9+²4+´+´k4 +´C+´TOk4 +´T+´,k4 +´,+´e€k4 +´e+´wyk4 +´w+°„/°Ö´ +² +³  +° ±/+´+°±"+´)+³Z)"+´L+°L/´Z+²ZL +³ZQ +°)±a+´F+°F±q+´A+±…+±/±k99°L²,999±)Z±%99°a@ 4DI]gnu~‚$9°F°9°q²6?s999°A²;>9999±³ LZ$9°° 9±OT°9°,°F9°°a9±€e°9°y±Dc99°w²/n999°@ "%)6>Aqs$90174632"'3267>7&#"32>=472#"&547>327632#"&54632#"32>54'#"'#"&>54'632"327&/"!$( B6;=IR™L?yoã96K:uA ­`5,7<öv†I4  5T78ÀZ /rX'A% !,oL%D5F?ÍU;NÏ(SM€'+   $/><" yVgm¤8'xQL5Any m5#7.54632677'"&464'327632"#".##"&">54&5467&)!!/2 LTs^V*!es!  &L'D1>A   V %P?$85BQJH CT!$N% 5 1²a·E 60!v$'* -$+-?#+A  Y   Aq…k^¨1  +¡.?Q0ÿÿÿé÷Hÿõ»ë V²+´+°/´ C+°!/°Ö±é°±+± é±"+±´ $9° °9±´ $901%#"&5463232'>54&#"D._p;IÆqe¬s 0ZlCV# %SŒ+lL=“Úv=j(HÁ$&R9ÿø³ÄZcI²X+´>+² +´%+´EPX +´E+²EP +³@EK +´a4X +´a+´.]X +´.+´ X +´ +±  À/´+°d/°Ö´;+°;±M+´H+°H±+´*+°*±[+´1+°1±C+´S+°2°S´+°/²S +³@S +°S±#+´ +±e+±HM±>X99±*±699°[´.4EP_$9±S° 9°#³ %$9±E>²;S999±]a±1699°.°9°°*9° °9°±#99°° 90174>7&54>2#"&54632#"32654#"632#"'32>54#"#"5>32#"&4#"3269WGaŠzRe3&Y* !D-#S|+X<%3$?%3R.N=1Y6 a'N _1##>zJ216o+X P ]+J>TP JND3/.@:9^6 =n+/ "2OF<  ÿêÀØS}„V²Q+´+°/´C+°F/´H+°N/°3´3+°2°{/´l+°ƒ/´8+°b/´[+°e/´X+°…/°Ö´ +² +³  +° ±T+´j+°j±o+´x+°32²ox +³@or +°x±J+´A+°A±+´:+±†+±T ±Q99±oj³{$9°x± N99°J±2e99°A²5LX999°µ*,8<(~$9±± 99°° 9°F²999°N±>J99°3²7+"5467>763267>32#"'"547#"&4>3232#"&#"32654&5463#"&>5&#" 0#!$ ”+bV:@z ¦R *&,3?&  $'#C!t 7(/ûgF`Ù~¼TBÄ? CÃ@G…W5A\{ p#4é-;@"@;_K&%!=J;!.&A5,2 537!.n¶(˜>aM'M4MU!5{>"Gz#E !ÿÿ)Ù)bÙÀ ÿÜ«Ïn®²_+´+²+´L+²3+´?+²3? +³@38 +´glL8 +±gé°o/°bÖ´+°±N+´+°±B+´1+±p+±b°e9°N³[_gi$9°±L99°B±S99°1³DJU$9±±199±gl±bB99017;>7676332>7>?6332676;2#"&547>7#"=>7#"&5463632#"'.: *Y:s IV<kþŒ "*1© v-“/G-o  Gl'+-?IvFþô-47…B@Ca"Z—ò¥+ °.°.°±ù°±ùº>•ò™+ °.° .°± ù° ±ù· ........°@± °901)!2 32654&+3þ¾›-fm?dz[è¤4#"+ÿÿÿôgÐ ›¹À$ÿì‘Ù E&²++°3´6+²+° 3²+´+´ +°3´+° 2² +³@ +± 22°F/°.Ö´3+³@3.+´+°3±+´+°°% Ö´9+°9/´%+±G+°6ºÀ{ø++ ° .° .° ± ù° ± ùºîwÂs+ °=°<À±! ù°"À° ³ +³ +´ !"<=.....@  !"<=..........°@±9´6$9±6³%.0@$9°³$9013###3#/%2#654#"#"&547332654&/.54>µ:ýŽ:NÍXH+VII‰ /C"?n:=KY'+{$,-VÙý~ž ýóÖððt'( N8. # < '8-!JA 2.?-" # 5" #7,!ÿÿ#„ )½ Ñëÿÿ1ÿì<Ù#uúþ|# ¡1{ìªÿÿÿì[Ú#uþz"t« ¡mÿÿEÿì_Ú# Åþ€ lÿÿÿì_ß# Åþ"t ° ¡mÿÿ$ÿìUÚ# Åþ"u© ¡cÿÿÿì_Ù# Åþ" Ä © ¡mÿÿEÿìVÚ# Æþ| lÿÿÿì`Ù# Æþ}" Å § ¡mÿÿEÿìWÚ# Èþy lÿÿÿìaÚ# Èþ{"u © ¡mÿÿ&ÿìWÙ# Èþ}" ŧ ¡mÿÿ4ÿìMÙ" ǧ# Èþy ¡EÿÿEÿìŸÚ"{« ¡EÿÿdÂÙ,ÿÿdØÙ#,,ÿÿdîÙ#,,#,,ÿÿdŒÙ#9,ÿÿvÙ9ÿÿ]Ù#,›9ÿÿsÙ#,±#,›9ÿÿ‰Ù#,Ç#,±#,›9ÿÿd˜Ù#;,ÿÿ‚Ù;ÿÿ]Ù#,›;ÿÿsÙ#,±#,›;ÿÿPÙ/ÿÿ(ÿéå&ÿÿP’Ù'ÿÿPþÙ0ÿÿB–ÙLÿÿBtÙ#LÞLÿÿBRÙ#L¼#LÞLÿÿBÄÙ#YÞLÿÿ æ Yÿÿ ŠÙ#LôYÿÿ hÙ#LÒ#LôYÿÿ FÙ#L°#LÒ#LôYÿÿB°Ù#[ÞLÿÿ Ò [ÿÿ ŠÙ#Lô[ÿÿ hÙ#LÒ#Lô[ÿÿ<ÙOÿÿÿéÜFÿÿÿéóÙGÿÿ<ðP ÿñ®ÿ #²+°/´ +° /±+± °901!&'67®üå2y#d——d#y281—#ww#—1-;Ž #²+° /°Ö´+±+±°901!#'67&'P81—#ww#—12y#d——d#y21ÿñ¿ÿ #² +°/´+° /±+±°90175!&'7'6712y#d——d#y2Ü81—#ww#—1-ÿê;x #²+° /° Ö´+±+± °901367&'781—#ww#—1xüå2y#d——d#y2ÿñÿ!(²+° 3°/´+°"/±#+±± 9901!.'7'>7!.'>7‹A82%6/^66^/6%28AüþA82%6/^66^/6%28DCF @6a00a6@ FCDDCF @6a00a6@ FCÿêŽ!%²+°"/°Ö´+±#+±± 9901%'>7.'>7.'7òDCF @6a00a6@ FCDDCF @6a00a6@ FC]¾A82%6/^66^/6%28AýBA82%6/^66^/6%286°/°3´ +°/° Ö´+°2±+± °9± °901%0#654'327#0#(ýt1 X"q¯S@(ŽS¯q"X 1ÿÿ‡ “ÿü&À@ÿÿ “"+Àÿÿ‡ “&@Àÿî«@²+±33°/´+² +³@ +°/°Ö°2´+±+±° 9010#5!&'67!53«8ý2y#d——d#y2ä8î1—#ww#—1îIÿ0^ÀW² +°/´+°2°/°Ö´+² +³@ +² +³@ +°2±+±° 9± ´ $901053'67&'3Jî1—$w‘v"˜0îÐ8ä1y"e——e"y1ý8ÿÿ0ÿî¿ —ÛðÀÿÿIÿ0^À ˜§ðÀÿñ®ÿN² +°/´+°/´+°/°Ö´+² +³@ +±+±° 9°°9°°9012#!&'67!254&# NTVIý€2y#d——d#y2}i36æG;DD1—#ww#—1Q#+-ÿñ¿ÿN²+°/´+°/´+°/°Ö´+² +³@ +±+±° 9°°9°° 901"3!&'7'67!"&546Ï63i}2y#d——d#y2ý€IVTæ3+#Q1—#ww#—1DD;G ™X3°/´+° /°Ö´+² +³@ +± +±°9015!3'31TpoT!7þ[¦¦nÿðZu8²+°/´+² +³@ +° /°Ö´+± +±°9013!'7!#7þ[¦¦nuýÏTpoT Ü®ÿ°/´+°/± +01!67®ür‰’#y28v­#—1 ÿ쮲+°/´+°/± +01%!&'!®ý2y#’‰Ž×1—#­vÿÿ8ÿb\ñ‡ Ÿÿ\À@ÿÿ#ÿ_Gî‡  8À@ÿÿ ß®  ÎîÀÿÿ-ÿô» ŸÛóÀÿÿ8ÿ‘\ ‡  Hÿr@Àÿÿ ÿ’D!‡ Ÿ ÿr@Àÿÿ ÿG¿©' ª ÿVÿÿÿ%vć §ÍäÀ@ÿÿ ÿG¿ª' ÿV « ÿK® 4° /´ +°/´+°/±+± °9°°9°°901!!!&'67&'67®üå+€ /) üå2y#d—‡VV‡—d#y258* :$1# 81—#wcbw#—1ÿnäü8°/°Ö´+°±+´+±+±°9°°9°°901#&'#'6767&'ø82•¡&85“$‡vmmv‡$“5’3x„'üä6v$m|``|m$v6ÿÿ*ÿK¸  ªØkÀÿÿÿnäü «òjÀÿÿ ÿ»e& Ÿf ¤œÿÿ ÿ•®X& £V  ©ÿñ«-² +°/´+°/´+°/±+±° 901!!!.'>7«ýQQèýHM)B\[[\B)M~5PP5b!QaVVaQ!b'7,°/°Ö´+°± +´ +±+± °901'>7'#'#H!QaVVaQ!b5PP5m)B\[[\B)MýHèQQý¸-ÿìºü-²+°/´+°/´ +°/±+±°901'7!5!7'!5!'7Á)MýHèQQý¸M)B\[[\!b5PP5b!QaVVa,ÿí<z1²+°/° Ö´ +° ±+´+±+± °901.'7373!QaVVaQ!b5PP5)B\[[\B)M¸ýQQèýHÿìÿþ2²+° 3° /´+°/´+°/±+±±9901!'7'7!.'>7!7'!ñ8L(PXRRXP(LýÈL(PXRRXP(x‘TTýoT}_"`^KK^`"__"`^KK^`"þÃVVV'ÿŸ7!.°/°Ö´+°±+´ +±+±±9901'>7'7.'77'7H!QaVVaQ!bb!QaVVaQ!bÕPPPPÿ)B\[[\B)Mþ(M)B\[[\B)MØ0QQýÈQQÿÿ ÿø/ ·OþÀ ÿø/6d²4+°/° 3´'++°/°3´,+°2°/´++°#2°7/±8+±4°59±'² 999°,³*2$9°²!99901%#"#".'#".#"#52>32>3232>;&'7'6¼`w:<=92), (#7A>9;<9D= (#4g2y#d——d#yãgNc bP>I>"854Oc bPcc#1—#ww#—Ù ,²+²+°3´  +±é° /± +± ° 90173#3#ÚKhÿxþücMÿèxþÛý'ÙÛNþ´XÿuL]X°/±é² +³@ +°/± é² +³@ +°/°Ö´<+°±+°2´<+° 2±+±± 9901%#"&54632#4&#"3265LŠph’’hq‰RWQJ]^IPXom“gôh’ŽlM[^Jþ I^[L+ÿéÅ%j²+± é²+±é´ +±é³+°&/° ֱ鰱#+°2±é±'+± °9°#´$9°°9± ² 999012#"&54632.#"#>"32654&#@G3!îeƒz_i:QL.> X k]@JP=>RRÅ3R^þ¦‡hc~O‚‹83Wbþ¦SGCW[DBSPJÙ C² +± é²+±é´  +±é° /° Ö°2±é²  +³@ +±22± +01!5!5!5!!5!íþcþdùþLRéRý'RPÿœJ u² +°3± é°2² +³@  +²+°3±é°2² +³@ +´  +°3±é°2°/°Ö°2±é² +³@ +± 22±+±±990133!#7#537#537!5!!5#35Õ7[þ|)7)?`fÆè_þºgÑ _~ Gý'ddRúRéRýyú;éé(ÿòúÆ#²+° 3±é²+°3´7+°$/°Ö° 2´&+°±"+´&+°2±%+±° 9°"· $9°°9±° 9°·  $9°°901#"''7&54632'"&32654È2SSÔ•‚bO6RRÖ™}aßq²?O€þsN^v¨Æ2Sg•ÔQP2Re‚•ÑQ °p^Q@sþp?¬s` ½Ù"²+±é²+°/±+±°90133 ! &d)þ¦Ô§Ùý'hýê ½Ù"²+²+±é°/±+±°901!#7! ³þ×d3ÓþYÙý'q7hU²+´7+°/´ 7+° /´7+°/°Ö´+° 2² +³@ +° 2³@ +±+± °901!".546;#!!;~Es\3³˜”ï”þm-IP4Œ!FyR˜žFÊF;Q)F7ÿ¯!E²+´ 7+°/± 33´!7+±22°/´7+² +³@ +°2°"/°Ö´+°!2² +³@ +°2³@ +±#+°6º=ì±+ °.°À±ù°À°³+³+³+³ +º=ì±+ ³ +³+°³+³+³+³+³+º=ì±+ ³+² Š Š#9°9°9°9²9° 9· ........@ ................°@±°90133#3#;#"'#7&54677#?t7}”BÖì76YŒŒ^E7%užˆœ.p }Aº¯GFÑF®F[tM¯Ž þ’b¨Ì²-ùÕ2°/´++°/´ ++°/´++°/±+± °901746;#"!!;#"&-^íí!/% |þ„ &/ íía~ërxD9+D+:E~ÿÿ7ÿÿg ÀIgÀ7ÿı&<² +± 33´7+±!22²  +³@ +° 2°/± 33´7+±22°/´7+°'/°&Ö°2´+²& +³@& +°2³@& +±(+°6º=ì±+ ° .°À± ù°À³ +³ +° ³ +³ +³ +³ +º=ì±+ ³ +³ +° ³ +³ +³ +³! +² Š Š#9°9² 9°9µ......@  !................°@±°9013#7#537#537&'#5323&>7t7%Œ2ZqD7[q>·Î<2D”P?4 >/H@'±tN½QxF"<32&#"327#"'#"&546\*$@PU?#'KTj  !+#@UPA(ccd`9NK,LH.ra  $HL "aaY59Q|±”$.`°/°3´+°%2°"/°+3´++° 2°//°Ö´+°±(+´+±0+±(µ  -$9±"³$9012>32#"'#"&546327&#"2654&#"§Tj  !BLN9ccd`9NK*$@PU?#'Ä&(("@UP”a Z05YaaY59Q,LH.f+.HL>K 2²+´7+²+°/°Ö´+² +³@ +±+01)3!KýóFÇ þ9âȲ+´7+°/±+01!!âýëý8ÈdýâFÿœâ2:²+°3´7+°2°/° Ö°2´+°2±+± ² 999013#'67!&'7!4&LP?H^c 6 ýØ,!1,þùz>2fR= WF400 5WþõM‹2ÿè/C+² +°3°/°Ö´+± +±³ $901%654' ''>7%5%.'77­þã\Bb =þ¤^9`A$}IQPH˜¼$O3&·E¸&2O#YabFÿò‚¤"²+°/°Ö´+´+±+013F<²ýNÿò¤ !² +° /° Ö°2´ +°2± +0175737#P! ^dHB0Ee3V„SZsRBLÿÿ<ÿ ÿ" ã ãðÿÿ<ÿ Wÿ" ã# ãÜ ã¸7ÿ žÿ 6z°/±é°0/±+é°7/°$Ö´ +° ±+±'22±é±322°±+´+±8+± $²999±±+099±°9°0· '.$9°+°-901%654&/7#"'732=.546754632&#"P+%U$- 'ÛN8%<>! ^(: BEdH!0>H¦ W&<  >/&/ zJYpEe3V„Ž ,6+2°_/°#Ö±]é°]±+±&Z22±é±2U22°± +±7P22±é±CK22°±M+±Gé±`+±]#²999± ³*,$9±GM²;@=999±X² J999°SµG#OKZ[$9°5±&D9901#"'732=#"'#"'732=.546754632&#"63254632&#"5654'5&#"32'5!%<>! ^$&+('51 ^M[[MdH!0(+&$dH!0P``PPPU#'+((+'ÏHEe3V„fN8X5" V„€V43V[rSBLk‚ZsSBLX45WJ!98!ÉßÛ!¨"21ÿÿ Ð'yÑÿ)'y9ÿ)y…ÿÿ Ð è ÜÀÿÿI± 'yÿòÿyÿòÁÿÿI# ' êr êÿÿ2Åî& Êy£ÿÿ2âî& Ê'y#£y"ÿÿÿ/ÿê î& Ê'ya£'y`ÿ'yÿØÿyÿØ£ÿÿ!(Ò & ð'y|Ây{ÿEÿÿ!ÎÒxaÂ#ÎÔxt°/´++² +³@ +°/´++² +³@ +°/°Ö´+°± +´ +±+±°9° ±99±°9°±99°°9012?632#54&#"#"&'3b*'095u175?E:%!EKFNKzòŠ%±°/´ +° Ö´+° /´+° Ö´+°&/°Ö´+² +³@ +°±#+´+²# +³@# +±'+°6ºÂ\îÇ+ ° ° À±ù°À³ ....³ ....°@±#² 999± ³#$9015#"&/.#""&5463232654&k†C9,4  >9?A7.2")Q8‚?J,23 ' A8?::F/;1+#,!ÿÿ%ÿ÷Ϩ‡ ðÿÖ@À3Zä†t°/´++² +³@ +°/´ ++² +³@ +°/°Ö´+°±+´+±+±°9°± 99±°9°±99° ° 901?'&#"#>32733253#"/‘O/571*;AJ3563'*3273326=3#"'!!¦E;t›T7/571J9@H590#(AþÀiF•$NFK,e‚ !%:EvFÿÿ2$& µ ð( 2ÿí,¾²+²+´++² +³@ +´ +°3´7+°2´ +° 3´7+°2² +³@ +´( +´++²( +³@$ +°-/°Ö´+°±"+´%+±.+±°9°"@  ($9±(°*9°±+99°°901#7#537#5!733#3!"#>32326=3#"/&ÛE!…®=ëCŒµ<ñþåF/571u590'*b7FfF11FfF±NFKE!%:E?2 .·²+´ ++²  +³@  +² +³@ +°/°-3´7+°+2² +³@ +°/°)3´7+°'2°$/´++²$ +³@ +°//°Ö´+°±+´!+±0+±²999°@   $'*+.$9±$± &99° ±99017#7#537#537'&#"#>3273326=3#"'3!!!¦E?c5˜¼@N/571`)@6 5902æþ÷4=þ  FfF2NFK8Pk!%:E bFfFÿÿpÒæ& ð¢ ðþn!,Ô:β+°7/´.++².7 +³@.3 +°/´ ++² +³@ +°(/´++²( +³@$ +°/´++² +³@ +°;/°Ö°2´+°2°±1+°"2´4+°$2±<+±±99°1@  (+7$9±.7°:9°°9° ± +99±(±*99°±99017#7&#"#>327'&#"#>3273326=3#"'326=3#"/”E\ /5715I/571]>@L 5905>590'*=,£NFK_/NFK7oŠ!%:E `$!%:E'ÿÿ29& û2S Êÿ;ÿÿ!4Ò1& ð' ðÿf ð¹ÿÿ20& Á ñ(¢3Ò5m°/´++² +³@ +°2°*/´++²* +³@# +°02°6/°Ö°02´+°12°±+°"2´+°#2±7+±³)*$901$"#>7>2#.'.267>73"&'.'3C[Z# Z[Z "µZ[" [ZZ #“ +5  5+ ñ +5  5+ ÿÿ2o & Wuÿÿ2ÿ» & 'yÂyþØÿÿ2ÿ¸& 'yÿÛÃyWþÕÿÿ2ÿ¾ & 'yWÁyÿÛþÛÿÿ/ÿÄ­ ' —'yÿØÁyÿØþáÿÿ2ÿÂÁ & 'yÁyþßÿÿ2rŸ& }}›ÿÿ2rn& Gu%8T@ÿÿ2r¥&  ߜŠÿÿ2r§&  àŒÇ ÿÿ2ræ& X84ÿÿ2r'^ÿØò ÿÿ2rç& /G(¿™/HìÀ™I¯Á™ÿÿ2rÆ& Pdøÿÿ2rë& "¡‡¸2ÿìØ<²+°/°3´7+°2° /°3´ 7+°2² +³@ +°/±+01%!#7#537#53733#þþ6K6—´*Þû3K3ž»*µFƒƒFfFwwFfÿÿ2YÁ& Ê”& Ê% ʶ(ÿì  L²+°/°3´7+°2° /°3´ 7+°2°/°3´7+°2² +³@ +°/±+01%!#7#537#537#5!733#3# þÓ.K.€ ½Ú ú(K(–³ Óð ŸFmmFKFKF__FKFKÿÿ<ÿÈ  ' Ê & Ê W& Ê ­ Ê ÿÿÿ2ÿõ' Êÿ0¥ÿÿ2ÿõ' Êÿ0!¥ÿÿ2ÿ†˜'¾ ÿÿÿ2ÿ„Ÿ' ÿ!Åÿÿ-ÿ÷Ú'yÿÿ-ÿ÷Ú¼ÑÀÿì ?h²!+°0/´=++²=0 +³@=6 +°2°@/°)Ö°62´(+°72°(±+°2´+° 2±A+±(³/0$9±0!°9°=°901367>73#.'.#"##7#>76?&'.'3323lKE+" %?&U5 "Z-FKC1# (D&Z8 #Z- ¥ +5\5+ §Ÿ +5Z5+ -ÿì ²+° 3°/±+0175%737'#?-&@K0hJÙõ0K;/ ÆE|™r,O;°ZOhsŽApA-ÿ¼ð² +°/±+013#75?'57YK@²þݪ]OjÎCCCCéBj>-ÿ²²)² +°3´ ++°2² +³@  +°/±+01!!#7#5375?'5737ÿTSþK.KD·>õGKR$y°ElÇCCCC¡=OK”fOt§ÂAT1ÿÿ2ÿÔ' ðÿ¥ÿÿ2ÿÔ'!¥ ðÿÿÿ2ÿ:'!ÿC§ÿÿ2ÿ9'ÿB!§-ÿ÷Ú)² +°/´++°/±+± ° 9°°901752$7&$-|mTqgkxIfþøÆEs\OL@DJOZuÿÿ-ÿ÷Ú#CÑÀÿÿ1ÿÿ[' Êÿ:#ÿÿ2ÿÿ\' Êÿ:$‚ÿÿ-ÿµ+&#Q ðþçÿÿ-ÿµ&&$L ð8þç-ÿÚ@²+²+´ +´++°/±+±²999°² 999°° 901752?367&'#7&?-Š—MK651\;!3R3`vGKRo‹ "ÆEK¸€#)OTP<4OU7©Ã)-ÿÚB² +²+´ +´++°/±+± ² 999°²999°±990133"#756?.'567&PK[qeŒ™CK+3.Z8#2Q2^u$ $Ù*EMŸe!'OQS<3OS7]7X6²+´7+² +´7+°/°Ö´ +±+± °901!".546;#;~Fr\3±–””þÿ'IX9ŒDwR—•FßB\2Fÿÿ7X +IXÀ7ÿŲñ² +´7+²+°3´7+°2² +³@ +°2°/°Ö´+±+°6º=ì±+ °.°À±ù°À°³+³+º=ì±+ ³+³ +°³+³+º=ì±+ ³+³+² Š Š#9°9² 9°9µ ......@  ............°@0133#;#"'#7&546;Ÿ7XoŽ-<ŒŒE97˜±–Ÿˆï²ZFþ? FJ\DÇ—•þ ­ Ø”7ÿ¾«ó² +± 33´ 7+± 22² +³@  +° 2²+´7+°/°Ö´+±+°6º=ì±+ ° .°À±ù°À³+³+° ³ +³ +º=ì±+ ³ +³ +°³+³+² Š Š#9°9²9°9µ......@  ............°@± °9013##7#53&+532654n7%’°•7_u.@ŒŒI:‡é«vFÖ–BBF¿ FUþUÕÿÿ$ÿêº' Êÿòÿ%+bÿÿ2ÿë·&,_ Êÿ&2ÿ±î$²+°3´7+°2² +³@ +°/´7+°!/°3´7+°2²! +³@ +°%/° Ö´#+² # +³@  +±&+±# ±99±± 99°!± 9901%!#7#537&546;733#;#"''#þŸK8W,z±–+K>È0BŒŒP?» þÿ0F99FbJ²—•44FþBFF£¡ß„2ÿ±î"v²+° 3´7+°2² +³@ +°/°3´7+°/´7+°#/°!Ö´+²! +³@ +±$+±!°9±°9°³$9°°9013!!#7#537#53&+532654¼K@G¢‹Jþ—K0Oc‚½=nŒŒyO£ÅîKˆ•/F::F.F¤(F-tþ”ÄV(ÿïÜì O²+´7+°/´ +°/°Ö´+°±+´+±+±³$9±°901!&'67%3 &=33265/þõ!RCffCR!pHÌþäÌH¬fd®K&!fQaaQf!¡´ƒÆÆƒ´¾b—˜aÿÿ(ÿïÜì& â Ñ\ÿÿ(ÿïÜí& âyâG4,ú8°/´7+°/´7+°/°Ö´+² +³@ +°2± +01%!!!!,þøþM³òGþÿÿPHó6|ûÀÿÿB:ˆ' Êÿ=6ŽÿÿB:”' Êÿ;7ÿò¡ÿÿE7ù‡6=-À@ÿÿE7ù:|úÀÿÿ+ÿñÝ£&Vdiÿÿ+ÿñÝ£& Ê]dV+ÿñÝ£ b²+´+°/´+° /°Ö´ +° ±+´+±!+± @  $9±@  $90166  7'7&#"654'32+ÊÊÊþâSBD¹”»¼RjjL»¹Dk¹¹Qhi»ÊÊþâÊQhjQ¹â¼¼Dk»¹Qjhþ·¹ºB+ÿñÝ£ ^²+´+²+° /´+°/° Ö´+°± +´+±+± µ$9±¶ $901 '264&"6  Hþ &`þ>«ò««òàÊÊÊþâçþ &`Jò««ò«þMÊÊþâÊÿÿ+ÿñÝ£'WæÿçVÿÿ+ÿñÝ£/ Сj9™Vÿÿ+ÿñÝ£&V Àÿÿÿ+ÿñÝ£&V Á³*=ÿÿ+ÿñÝ£'á<VLÿÿq">²+°/´7+² +³@ +°/°Ö´+°2² +³@ +± +01!!#’Þþ"F"äFø"ÿÿÿÿD"E!ÀÿÊŒlD°/°3´7+² +³@ +°/°Ö´+² +³@ +² +³@ +± +01!#!5!ŒþäFþå}&ý¤\FŒ¢F²+´7+°2² +³@ +°/°Ö´+² +³@ +² +³@ +± +01%!5!3ŒýƒFFFF\ý¤LÀ">²+°/´7+² +³@ +°/°Ö´+°2² +³@ +± +01!!#’.þÒF"äFø"LÿìÔ$ M² +°/´7+°/´7+² +³@ +° /° Ö´ +±22² +³@  +°2± +01!!!!#’Bþ¾Bþ¾F$ FpFœ8Lÿì°$ M² +°/´7+°/´7+² +³@ +° /° Ö´ +±22² +³@  +°2± +01!!!!#’ýâýâF$ FpFœ8>>ü°/°Ö´+±+01-5%>þHþÕññþ}Š>>ü°/°Ö´+±+017->þH+þÕöñ~ˆŠÿÿ>!>Ž' Êÿ\L’ÿÿ>%>“' Êÿ`M—ÿÿ-8_' Êÿh àÿöŸÿÿBT' Ê I ßÿÿ6d' ÊY àôÊœ²+°3°/±+01!##3ÊXüÿXMþ›ÿÿÊœSèœÀÿÿ=ÿÝ¿VüÊÀ=ÿ®¿íA°/±é² +³@ +° 2°/°Ö´ <+° ±+´<+±+± °901%#".5332653¿M–\^˜MR—YaRèLŽ``ŽLý÷X‹S W.Ó« .°/´+´+° /°Ö´+´+± +012#"&546”&$$&«%4$%(@m–² !°/°3´+° /± +±°901373'7@‚))‚j(ii(6||L}MM}>ˆü 1° /°Ö´+°± +´+± +± ³ $901?'%%5†ššH%%þÛÝš’okþšöÎÎþ ÎBÚkÿÿ2œÛ& Ê× ñ0cÿÿ2÷‡# ÿá@Àÿÿ3ý‡#<*À@ÿÿ-ø&WGÿšÿÿù]4Àÿÿ0”ä& 'B ~ ÿÿ!…ä_µåÀ(ÿÈ ˆ#G²+°3´7+°2² +³@ +°/´++°$/±%+±± 99°² 99901367&'!!#7#537ȏ7£K53.\:$4S3axV5þ¬KYxbnc‹˜5 !ˆu!'OSP=4OV7ÀF77FÚ(ELx(ÿÈ ˆ$E²+° 3´7+°2² +³@ +°/´++°%/±&+±°9°² !9990133"!!#7#5375>?.'567&mK`h]ƒUkþvK#B=<75I)9V6f~#ˆ×$ED¿F77Fˆ&.O06C>7OZ8YBÿ¸:îy°/° 3´7+° 2² +³@ +°/°3´7+°2°/°3´7+°2² +³@ +°/°Ö°2´+² +³@ +± 22±+±±990133#!!!!#7#537#!!èK3:^´þÊ']þ%K%,P'wsØ´þöîfGþHNFJJFNòþVcþBÿ¸:î{²+°3´7+°2² +³@ +° /°3´ 7+°2°/°3´7+°2² +³@ +°/°Ö´+°2² +³@ +± 22±+±±9901%!#7#537#53!5!733!3:þ~$K$+O.}¡³þ¬y-K-4þÐ.³ÇFFHHF\GcHZZþ\þcÿÿ2ÿBT' ôþèzÿÿ2ÿB-&!S ô þèÿÿ-ÿB*' ôþè#Pÿÿ-ÿB&' ôþè$LÿÿR,º/'yÿû—'yÿûÿIyÿûäÿÿÿƒg&y*'yÄyuÿÿ-‚/'y*ÿJ'yv—yÃäÿÿ€,‚/'yv—'yÃÿIy)ä'ÿè Ï#²+²+´+° /´!+°2°$/°Ö´+°±+´+°2±%+±°9°· !#$9°°9±°9° ·#$9°!°901 32654 &#"#"''7&54632ŠþJVt·ýÙ·Wq·‚$[\ט‹fa%aYטˆh*þFJ·uþ÷I·qâ#[gŒ˜×[b%bf‰˜×Yb~Ù2²+²+´7+°/°Ö´+² +³@ +±+01!##bÖFÙFýmHeÙ2²+²+´7+°/°Ö´+² +³@ +±+01##5eF×Ùý'“FÿÿJfÙnÈÙÀÿÿbÙoÇÙÀ(V w6°/´7+² +³@ +°/°Ö´+² +³@ +±+01!# þNFwFÛ!–ÿ8v„ "° /±é°/°Ö± é±+± °9014632&#"–dH"!1ÈZsSBLü“ÿÿ ÿ8ê„s€¼À;žXI °/±é° /±+01%"05>32&K·Y9€UV€9Y÷Y@9229@Yÿÿ;›XFu“äÀÿ::ê°/°Ö´+±+01#:ââ;ææêþ(þ(ØØÿ:0ê!°/°Ö°2´+±+±°9013#;ææ;âêþ(þ(Ø(ÿ8T ° /°Ö´<+± +01#57>7T_{RJ(R:…þÜöó¾b†7(ÿ8z °/°Ö´<+´<+±+013#(RR ü(ÿJT ° /°Ö´ <+± +01#.'&53T.:R(JR{¶7†b¾óöÜþÿÿ,ÿ8X{€XÀÿÿÿ8X zÞÿÿ,ÿKX!y€YÀXÿ8MN3°/±é² +³@ +°/°Ö´&+² +³@ +±+01#3#¤Lõ©ÈLXÿ8¤ °/°Ö´&+´&+±+01#0¤L üèXÿ M 6°/±é² +³@ +°/°Ö´&+°2² +³@ +±+0103#¤©õ ü5Lÿÿ7ÿ8,O„XÀÿÿàÿ8, €ˆÿÿ7ÿ , „XÀyÿ8ã 8² +´++² +³@ +° /°Ö´&+² +³@ +± +01#"#463%M94ãA'üÙ(>E2ÿ8Í °/°Ö°2´&+°2±+01#4&'5>=Í$.RM",," ¶EF&xþ èE< E ;F§€ 6°/´ ++²  +³@  +° /°Ö´&+² +³@ +± +01%#"&53;.49M%E>œýe'€ÿ8Í °/°Ö´&+´&+±+01#3ÍMMÈè2ÿ8Íã 8²+´ ++² +³@  +° /°Ö´&+² +³@ +± +0132#4&+2.49M%ãE>üØ''€ÿ8 °/° Ö°2´ &+°2±+013#47.5€M",,"MR.$ §F; E E–ÿ8ê °/°Ö±é±é±+01#3êTTÈè8ÿ8íÚ ²+´*+°/±+±°901!!#8µýÕP‚þ¨Ú`ü¾J8ÿ~í °/´*+°/±+±°90153!8X‚þ°+‚XJü¾`ÿÿ@ÿÿß®/1%¶Â/8)ÖÂ/)Âÿÿ3Þ±/6#´Â/2÷ÚÂ+Âÿÿ3Þ±/7,×Â/;Â6#´ÂÿÿDÞ¯/()¶Â/7,×Â;ÂÿÿDÿÿ߯/()¶Â/2ÚÂ7ÿÿÂÿÿ:ÿîê¯/4íÂ/1ÖÂ(¶Âÿÿ4Ò®/$0µÂ/&ÚÂ.òÂÿÿ=ÿÿÕ®/%"µÂ/(ØÂ/ÂÿÿÓ`np/6šhÂ%¸wÂÿÿºe‰o/+ŸvÂ7¼eÂÿÿÝdhq//ÂyÂ)¦dÂÿÿ¾d‰p/7¼dÂ9¹xÂÿÿæd^p/)œdÂ)ËwÂÿÿ»f~o/&®rÂ5›fÂÿÿØbxq/6ÈtÂ6¤jÂÿÿÝdo/6ÍrÂ,ÀdÂÿÿLÒ­/(Â//,ÞÂ'1´ÂÿÿV­/';´Â/&&ÚÂÂÿÿVÇ­/';´Â/&&ÚÂÂÿÿVÿü·­/';´Â/&&Ú ÂÿÿVÉ­/';´Â/&&ÚÂÂÿÿ@Ò®/$úÝÂ/.òÂ1%¶ÂÿÿGÿÿʱ/1ìÂ/67´Â<ÚÂÿÿNͯ/(3¶Â/7,×Â%øÂÿÿ=ÿÿÙ°/&0³Â/$ ÜÂ1ûÂÿÿÅlyh/(ªoÂ0tlÂÿÿDÿÿ×±/64´Â/8 ÖÂ%ÿÿÂÿÿXÿùå®/(=µÂ/61ØÂ&ÂÿÿÜa}p/)ÁwÂ6©iÂÿÿ¼`}m/6©hÂ*¯pÂÿÿä_}p/5ÉwÂ6©gÂÿÿÌb}s/6©jÂ8±{ÂÿÿÛbkn/6ËqÂ3œbÂÿÿVÿÿÊ­/';´Â/(%ßÂ/ ÿéÙ !’²+²+±é²+² +²+±é°"/°Ö°2´ <+±22² +³@ +°´&+² +³@! +° ±+±é±#+± ±99±² 999°°9° ´ $901"32654&'632#"'#57537.BPPBDUSØ9ihx|hk;K??SBÍo¸ooY^p~†V”‚ZC2@2zN3@â¸N²+´ +°2²+´7+²+´ +°2°/°Ö´+°±+´+± +01%53!53›Gþ0HHp¸¸pÿÿm±º/1FM /¦    ² +°3° /± +017'¾GýºÚGýºüüHý·ØHý·¤üù±aåm²+´+²+± é²  +³@  +° /°Ö± é° ±+°2±é°2°±+±é±!+± °9±² 999± ±99014632#4&#"#54.3#±taloU8I:F%45%Z%54%³ZZ%XhwsJR?3#=00B%7/ 9-1Jþqh#ÿóòÂ! ²+´+² +´+´ +´+² +³@ +² +³@ +°"/°Ö´+°±+´+² +³@ +°´+°/°±+´ +±#+±³ $9±³ $9013##52672#"&546"32654&ˆ%54&#"#546322#"&546"32654'.þßsG/3)(0=T@BW=Z) W‘ÑÒ•–ÒÕ˜–bT¿ˆ‡¿l+r©4 QK.=.-97- ?ST@9P<Õ’•ÓÓ—”Ñ!l\|‰À¿ˆc'-#ÿóòÂ2>Mâ²9+´F+²3+´?+´93 +´+´"!93 +´"+°'2´.93 +´+². +³@. +°N/°<Ö´C+°C±+°2´+°2°±++´ +° ° Ö´+°/´ +° ±I+´6+±O+±+@  !39?F$9±!² 999°"´ 632#"&54?32654&+532327654&#"72#"&546"32654'.66@&=PDQTC32"32654&2#"&546"32654'.3)19 L;LS>%C!M+en)67*&//‘ÑÒ•–ÒÕ˜–bT¿ˆ‡¿l+rè ^Q DSAE\'9nb<(1Ö=.3C<15?EÕ’•ÓÓ—”Ñ!l\|‰À¿ˆc'-#ÿóò %²+´+² +´+² +´+°&/°Ö´+°±+´+² +³@ +°±!+´+±'+±± 99±!´ $9± ´!$9°°901!#>7#72#"&546"32654'.î8SYDmMþ¢‘ÑÒ•–ÒÕ˜–bT¿ˆ‡¿l+rH*yÇibã\¬Õ’•ÓÓ—”Ñ!l\|‰À¿ˆc'-#ÿóòÂ"-9HÚ²4+´A+².+´:+´)4. +´+´#4. +´+´4. +´+°I/°7Ö´>+°>±+´&+°&° Ö´ +° /´+°&±++° 2´+´+°±D+´1+±J+±+@  #().4:A$9±#)±99°µ 17>D$9°± 9901"&54767&54632'"32654&"2654&2#"&546"32654'.ÊUU‚S/HN<;I)Q&..%&1.+)46P41&‘ÑÒ•–ÒÕ˜–bT¿ˆ‡¿l+rnX+´++±D+±@ "%(.4;$9± ±99±"¶ +18>$901%732767#"&54632#"&'&"32654&'2#"&546"32654'.194!O:JS@T(D'95 s(..*)46‘ÑÒ•–ÒÕ˜–bT¿ˆ‡¿l+rÕ D8)hDSAD[M8i–=${<38==/4D–Õ’•ÓÓ—”Ñ!l\|‰À¿ˆc'-#ÿóò +:Þ²&+´3+² +´,+´& +´+´& +´+² +³@ +² +³@ +´& +´+°;/°)Ö´0+°0±+´+² +³@ +°´+°/°± +´+°±+´+°±6+´#+±<+±µ &,3$9±· #)06$9012#"'&5476"3254%3##5>72#"&546"32654'.àŽ-'=9"4*'>T.*RþÊ)fŽ$2°·± +³(Px$2´£+³*Rz$2±É+0153#53#53#53#5353#53#53#53#5353#53#53#53#5353#53#53#53#5353#53#53#53#5353#53#53#53#5353#53#53#53#5353#53#53#53#5353#53#53#53#5353#53#53#53#53„2ú2ú2ú2ú2Š2ú2ú2ú2ú2R2ú2ú2ú2ú2Š2ú2ú2ú2ú2R2ú2ú2ú2ú2Š2ú2ú2ú2ú2R2ú2ú2ú2ú2Š2ú2ú2ú2ú2R2ú2ú2ú2ú2Š2ú2ú2ú2ú2¼2222222222d2222222222d2222222222d2222222222d2222222222d2222222222d2222222222d2222222222d2222222222d2222222222dÿ8èî #'+/37;?CGKOSW[_cgkosw{ƒ‡‹“—›Ÿ£§«¯³·»¿ÃÇËÏÓ×Ûßãçëïó÷ûÿ #'+/37;?CGKOSW[_cgkosw{ƒ‡‹º<+A  $(,048$3¼=+A !%)-159$2²$+@   $3´%+@  !$2¸Œ/A hlptx|€„ˆ$3¼+A imquy}…‰$2¸d/A @DHLPTX\`$3¼e+A AEIMQUY]a$2¹< À/A ðôøü $3¼+A ñõùý  $2¼ìí<% +@ ÉÍÑÕÙÝáåé$3´ì+@ ÈÌÐÔØÜàäè$2¼ÄÅ<% +@ ¡¥©­±µ¹½Á$3´Ä+@  ¤¨¬°´¸¼À$2¼œ<% +@ x|€„ˆŒ”˜$3´+@ y}…‰‘•™$2¼ut<% +@ PTX\`dhlp$3´u+@ QUY]aeimq$2±M% À/@ )-159=AEI$3´L+@ (,048<@DH$2¸/¸dÖ»$tÄ$2¼g+»&vÆ$2¸g¹Œ +»Lœì<$2¼+»Nžî>$2¸¹` +» pÀ$2¼c+»"rÂ$2¸c¹ˆ +»H˜è8$2¼‹+»Jšê:$2¸‹¹\ +»l¼ $2¼_+»n¾$2¸_¹„ +»D”ä4$2¼‡+»F–æ6$2¸‡¹X +»h¸$2¼[+»jº $2¸[¹€ +»@à0$2¼ƒ+»B’â2$2¸ƒ¹T +»d´$2¼W+»f¶$2¸W¹| +»<ŒÜ,$2¼+»>ŽÞ.$2¸¹P +»`°$2¼S+»b²$2¸S¹x +»8ˆØ($2¼{+»:ŠÚ*$2¸{¹L +³ \¬ü$2¼O+³^®þ$2¸O¹t +»4„Ô$$2¼w+»6†Ö&$2¸w¹H +³X¨ø$2¼K+³ Zªú$2¸K¹p +»0€Ð $2¼s+»2‚Ò"$2¸s¹D +³T¤ô$2¼G+³V¦ö$2¸G¹l +»,|Ì$2¼o+».~Î$2¸o¹@ +³P ð$2¼C+³R¢ò$2¸C¹h +»(xÈ$2¼k+»*zÊ$2¹‘+0153#53#53#53#53#53#53#53#53#5353#53#53#53#53#53#53#53#53#5353#53#53#53#53#53#53#53#53#5353#53#53#53#53#53#53#53#53#5353#53#53#53#53#53#53#53#53#5353#53#53#53#53#53#53#53#53#5353#53#53#53#53#53#53#53#53#5353#53#53#53#53#53#53#53#53#5353#53#53#53#53#53#53#53#53#5353#53#53#53#53#53#53#53#53#53„2–2–2–2–2–2–2–2–2–2„2–2–2–2–2–2–2–2–2–2 2–2–2–2–2–2–2–2–2–2„2–2–2–2–2–2–2–2–2–2 2–2–2–2–2–2–2–2–2–2„2–2–2–2–2–2–2–2–2–2 2–2–2–2–2–2–2–2–2–2„2–2–2–2–2–2–2–2–2–2 2–2–2–2–2–2–2–2–2–2„2–2–2–2–2–2–2–2–2–2¼22222222222222222222d22222222222222222222d22222222222222222222d22222222222222222222d22222222222222222222d22222222222222222222d22222222222222222222d22222222222222222222d22222222222222222222d22222222222222222222*ÿ8è %)-159=AEIMQUY]aeimquy}…‰‘•™¡¥©­±µ¹½ÁÅÉg²+³:>BF$3´+³ $2°° Ö³ $3´&+³*.26$2³)+³,048$3´J+³NRVZ$2³J)+³<@DH$3´+³^bfj$2³M+³PTX\$3´n+³rvz~$2³nM+³`dhl$3´+³‚†ŠŽ$2³q+³tx|€$3´’+³–šž¢$2³!’q+³„ˆŒ$3´"+³¦ª®²$2²¶+³º¾ÂÆ$3´•+³˜œ ¤$2°¹/³¼ÀÄÈ$3´+°´%+³¨¬°´$2°Ê/°Ö³!$2±&é³Jn’¶$2°&±+³#$2´+³:^‚¦$2°±'+³Ko“·$2´*+³Nr–º$2°*±+³;_ƒ§$2´+³>b†ª$2°±++³Os—»$2´.+³Rvš¾$2°.± +³?c‡«$2´ +³BfŠ®$2° ±/+³Sw›¿$2´2+³VzžÂ$2°2±+³Cg‹¯$2´+³Fj޲$2°±3+³W{ŸÃ$2´6+³Z~¢Æ$2°6±7+³[£Ç$2´+°´+°/³Gk³$3±Ë+01!#5##5##5##5##5#535#535#535#535#35#35#35#35#35#%35#35#35#35#%35#35#35#35#35#%35#35#35#35#%35#35#35#35#35#%35#35#35#35#%35#35#35#35#35#%35#35#35#35#%35#35#35#35#35#è–2–2–2–2–222222222d22È22È22È22È22ýD22È22È22È22ýD22È22È22È22È22ýD22È22È22È22ýD22È22È22È22È22ýD22È22È22È22ýD22È22È22È22È22ýD22È22È22È22ýD22È22È22È22È22 ü222222222–2–2–2–2ý222222222222222222222222222222222222222222222222222222222222222222222222222222222ÿÿ£è *kÿÿkÿ8è 8kÿ8ô,.°/´+´+°/°Ö´+´+±+01!!ôþ ,þ ÿÿôÿ8è,?ôÿÿô,è ?ôôÿ8è 6°/´+² +³@ +°/°Ö´+² +³@ +±+01!!èüô,þ èþ ÿ8è 8°/´+°/´+°/°Ö´+°±+´+± +01!!òþèþ þòþ þòÿÿÿ8è ƒBÈ À@ÿÿÿ8è  BèXÀÿÿ,ô ?ôÿÿÿ8è ƒC ÿ8@Àÿÿÿ8è ƒB ÿ8@À2î¼'²+²+°/°Ö´+´+±+01!!2¼ýD¼ýD2î¼<²+´+²+´+°/°Ö´+°±+´+± +01!%!!dXýv¼ýDŠý¨X2ýD2î¼:²+´+°/´+° /°Ö´+°± +´+±!+01"3!2654&#463!2#!"&5®,-Ã,-ýÁH4Ã4IH4þ=4IŠ-þ>,-Â,K4IH4þ>4IH4ÿÿ2î¼&§J2î¼ e²+±é²+±é´ +±é´ +±é´  +±é°/°Ö´1+²222°±+² 222´1+±+01!!!5%!5!%5!!52¼ýDPýäýäýä¼ýD6PPPPPFFþpFFÿÿ2MîÿÎ@À2î¼ #'+/37;?Cñ²A+±é²!1222²B+±é²&6222´AB +² -=333±é² 0222´AB +² )9333±é² ,<222´AB +²(8333±é²$4222°D/°AÖ´1+²222°±+²222´!1+²$(,222°!±"+²%*.222´11+²48<222°1±2+²5:>222´1+² 222°±+² 222´@1+±E+01%3535#3535%5##3#3#373535#35353535#3535!!XFFFFFFFþ*FFFFFFFFPPPPPPPPPPPPPPPPæýD¼–FFF–PP PPðFFPPPPPFFFFF–PP PP FFF–PP PPþʼ2î¼ n²+´+±22²+´+±22°/°Ö´+± 22°±+±22´+±+±µ $9±µ $901% 5#'5'35!!›ýɶþn4þX¿þ‘åFŸ÷aáGš2ýD¼25~þIXýÌŒ¨ý¨qŠç¡¡XþŸ€áššýv¼ÿÿ2P2îÀ@2î¼  $(+.26:>ADHLPTW¸²+´+±B22²+´-+± 22°X/°Ö´+±)U22°±A+±22´+±Y+±A@* "$%'*,-024679;=@BCFHJLMOQSV$9±-@*  !#&()+./1358:<>?ADEGIKNPRTUW$901!#7'#77'73'7'3'7''7'7'7#777'/3'7''7''7'7/7'îýDgw<^;;çz=c@?@jF@FX55ýÌ{=b??÷xiFEF#F@FÍ@F@FFFÂ;;šy=c@@@$@F@ËE@E(@@@Ê>>¼ýD¼2<;;š=@?@iF@F55÷>@@¡#FEF#F@FÍ@F@ªFFFL;;$<@@@#@F@ÌE?E¨@@@M>>ÿÿàµIÔàµ8°/´+°/´+°/°Ö´+°±+´+± +0135'3#P€°°†SS/¯dá¼ $²+´+²+´+°/±+01!!dXý¨ þÔdá¼ :²+´+°/´+°/°Ö´+°±+´+± +01!5%!!–ôýÚXý¨ÞÎÎ/þÔÿÿúA&™‡UýÀ@ÿÿúC&›‡VÿÀ@lè`°/´+´+°/±+01!!½+½üÕ`þ lè` °/´+°/´+°/± +01!%!!嘷—ý"+½üÕ0þk•0þ #Z²+²+°/±+01)ZüÉœÂ#ZÂ%²+´+²+°/±+±°901% !ýþÂþÀÛüÉœ3ýá3Âÿÿ€°[o° €°²+°/´+°/±+01%'!ÂsxEþeÎßÐÐ/bÿÿ^ÿÆ ý‡[^ À@ÿÿ^ÿÆ ý‡\^ À@ÿÿ´†"‡[´3à ÿÿž“0‡^ÿî°À@ÿÿ^“ /‡[^@à@]“ /q°/°Ö°2´+°2±+°6ºîDÂ+ °.°À± ù°ÀºŸÂy+ °.±°À±ù±°Àµ......±..°@017-‘èþ3ÂÕŒŒþ¦›Îÿÿ#ZÂ[}ÂÀÿÿ#ZÂ\}ÂÀÿÿ­[.àÿÿ€°^ÂÀ^ÿÆ ü ý>üüÊœ^ÿÆ ü°/°Ö´+±+01 ìýâ4ý>ŸþÂþÁÚüÊœÿÿˆ„é ‡[és àÿÿž’/‡^°@Àÿÿ^„  ‡[ s Àÿÿ]“ /d}ÂÀ$ÿóòÁ²+²+°/±+01 ‹þ™gg ggþ™$ÿóòÁ ²+²+°/± +±±9901% ‹þåþäþ™gg?þâþ™ggþ™$ÿóòÁ #²+² +° /± +± ³$901%'7 ‹ŽŽþåþäþ™ggÍŽþäþâþ™ggþ™'ÿòùÄ v²+´+²+´ +´ +´+° /°Ö´+°± +´+°±+´+±!+± µ $9±µ $9012#"&4>"3264%2#"&546”_Žd`‘–×x|±þÙ‘ÒÔ•–ÓÖP”a`‘•¾“=¹ì»µòðÕ”•ÔÕ—•ÑÔè ²+° /± +01# ÀÀ>ÀÀ   ¡èþŒþŒttýT88þÈ'ÿòùÄP²+´+² +´+°/°Ö´+°±+´ +±+±± 99±± 9901"3264%2#"&546 x|±þÙ‘ÒÔ•–Óֹ컵òðÕ”•ÔÕ—•Ñ'ÿòùÄ %-39?IOU[agmÿ²)+´-+²#+´+´EA)# +°3´E+°2³d)#+°3°n/°CÖ´H+°H±*+° 2´'+°2°'±+´+±o+±HC³MOkm$9°*@ JLRUX[\_behj$9°'´#-(),$9°@ .147:<$9°³ =?$9±-)³13Y[$9°A@ .069"3264%2#"&546“IqnILklG_Žd`‘–×x|±þÙ‘ÒÔ•–ÓÖprnJJp:”a`‘•¾“=¹ì»µòðÕ”•ÔÕ—•Ñ'ÿòùÄ '²+²+° /° Ö´+´+± +012#"&546–‘ÒÔ•–ÓÖÄÕ”•ÔÕ—•Ñ'ÿòùÄT²+´+² +´+°/°Ö´+°±+´ +±+±°9°° 9±± 9901%2654&#4632#"&v¹¶yþ˜Õ”•ÔÕ—•Ñ.µx|±þÙ‘ÒÔ•–ÓÖÿÿ'ÿòùÄy ¶Àÿÿ'ÿòùćyëÿË@Àÿÿ'ÿòùćy5ëÀ@'ÿòùÄ P²+´+² +´ +°/°Ö´+°±+´+±+±± 99± ±9901#"&54632%"3265!ùÕ”•ÔÕ—•Ñþ˜uº·v|±þÕU‘ÒÔ•–ÓÖš´z{²´y'ÿòùÄT²+´+²+´+°/° Ö´+°±+´+±+±°9°°9±± 9901"!#"&54632‘v¹/hÕ”•ÔÕ—•шµx‘ÒÔ•–ÓÖ'ÿò–Ä'²+²+°/°Ö´+´+±+01"&546–—ØÖÄý.Õ—•ÑÿÿŠÿòùÄ ¶ÀÙ <²+´  +²+´+°/°Ö´&+°± +´&+±+01!"32654þpühII43JÙý'ÙþýIhII252î¼"l²"+´+² +´+´" +´+°#/°Ö´+°± +´+°±+´!+±$+± ±99±±99012#".5467"32>54.%!!J–ƒNL†OL†OSÔa¢^] ^^ ]]þA¼ýDƒRˆLL…QT‡JJ‡‡\ž^` ^] ^] ^ýD2[î¼ I²+´+°/± 33´ +°/° Ö´ +° ±+´+±+± ±9901!#4&#"#2!462¼Ê‹”Ícrªý¾µ¼þŸŽÏË’(²vt´ÿÿ2îaƒ ¼À']–Ä-²+´+² +³@ +°/°Ö´+± +01#463"c<Ö™x»]–Ñ7¹ÿÿ’Uùć…5ëÀ@ÿÿŠùg… ÄÀÿÿ'Žo‡…ëÿÙ@À']ùÄ F²+´+² +³@ +° 2°/°Ö´+°± +´ +±+± °901"#4632#.•w»<Ö™Ò<±¹w–ÑÔ“y·ÿÿ'ùg‰ ÄÀ–R¼²+²+°/±+01!RýD¼ýDÿÿ–R¼‡‹–RÀ@ÿÿ–R¼‹è¼Àÿÿ–R¼‡‹Rÿj@ÀKÜEÖ P°/´+°/´ +°/°Ö´+°± +´+±+± ² 999±²99901"32654&2#"&4æ<,,+~hIJ34I¤- +* !]J52IIh2î¼<²+´+²+´+°/°Ö´+°±+´+± +01!%!!,ýv¼ýDŠý¨X2ýDÿÿ2î¼ ¼À2î¼:²+´+²+°/°Ö´+² +³@ +±+±°9017!%!!a[ýv¼ýD.\2ýDÿÿ2î¼’ ¼À2î¼ P² +´+°2²+´+°2° /° Ö´+°±+´+°±+´ +± +01!3!%!!c/ýv¼ýDŠý¨Xý¨X2ýD#Z G²+´+² +´ +´+° /°Ö´:+± +±± 99± °901#5 !îhwþÂþÀÛüÉœ"hhïýá3Â#ZÂ%²+´+²+°/±+±°901%!ýþ›üÉœ3ýá3Â#ZÂ%²+´+²+°/±+±°9017! €>þe›œ3ý®Âý> ÿ7ò R°/´+°/´+°/° Ö´+°± +´+±+± ³$9±³ $901  .64."26x憇çþò憇-uÍúÎvuÎúΆçþò熆ççþúÎuuÎúÎuu2î¼ ^²+´+²+´ +°2´  +´+°/°Ö´+° 2°± +´ +° ±+´+±+01!!!!!!2¼ýD2Xþí2þí¼ýDEþé\þ»Eþéÿÿ2™îÿÏ@Àÿÿ2î¼™ ¼Àÿÿ2™2ïÀ@'ÿòùÄ |²+´+²+´ +°2´ +´+°/° Ö´+°2°±+´+°±+´+±+±°9°²999±² 999012#"&546!32654&'–‘ÒÔ•–ÓÖ~j¤ þé °q|±¡oÄÕ”•ÔÕ—•Ñ8 ¤j.p¨µys´ þ¹ÿÿ'ÿòùćëÿË@Àÿÿ'ÿòùÄ ¶Àÿÿ'ÿòùć5ëÀ@j„O °/´+°/°Ö´+±+01%!Ï5þ™çþþÉ72þÿÿœhO‡¡2ìÀ@ÿÿœê‡¡ëÿf@ÀžjƒO8°/´+°/´+°/°Ö´+°±+´+± +01!%!!ÐþMåþþ2þj‚O.°/´+´+°/°Ö´+´+±+01!!åþOþÈ|X :²+´+°/´+°/°Ö´+°±+´+± +01!%!!ö4þžþpèþ¸H$þpÈ|X 5²+´+²+´+°/°Ö´+´+±+01!!Èþp þpÿÿœjƒO¡ ¹ÀBÿ?_ Œ–'°o/° 3´+°2°—/°ZÖ´b+°b±r+´+°±O+´J+°J±+°Q2´•+°.2³C+´=1+³;•+´E+°E/°j3´;+°2°•±6+´1+°1±+´Š+°Š±+´%+±˜+±bZ°X9°r±W_99°°V9°O°T9°J²HSm999°C´oux$9±E°h9°;²@|}999±6=· ‚…‡“$9°1², 8999°±*+99°Š±)"99°°(9±o°X901654> 54.''#"547&'#"&5475#"&547&'&/.54>75&'67.5467.'>7'>54&'ˆGSRL#q 08"5"( ;N$V&[&-2F >3'  x))[&V# ;,.'6:s(2". U_^T%  T`acMUTH)xnABp`L_þÖ P #-(86C# =**rY-{/r2)T"5 ] ]#  04 T*1r0{,4G=:J-?xIWP!‚LJ "   LMpB@n~YT#ÿþø¼C^²+²9+´8+´*9 +´B+°D/°5Ö±<é±E+±<5°>9±±A99°*µ $9°8µ '<>$901"/#"&'#"'#"&54>?&5463273327''7654&'7Ê jAUHmF'    1#6e&:ïI]›ŸYö0zO€¦Fi  i)>4 p     0YðH]™Zõ*ZY²- ´ƒ}Aj #ß¼ !,6µ²+´+² +´+´ +´+´(" +°-3±(é°32°7/°Ö´+°±%+±+é°+±0+±6é°6±+´ +±8+±+%±99°0µ $9°6±!99±³!$9°±99°"± 99°(±9901$&#"322#"&546&#"'>32'"&546322"&54632´·|³³}}ŽÐÐŽÏËý-=7#"I(,C$þU,T 4R5K,FJHGKF-K5Rî4P* 8vPJ5-J=BkCBjB>J.5J#ÿò“À:`²+² +°3´+°/2² +³@5 +°;/°Ö´+°±,+´+±<+±,³ $9±³ &$901.'.5463267632">54&#"#".'&\Qm<+U>U22F=W6EžÄ1='5?&DJF.84?/ 9K‰ŽOY/?VK,6"8T;8pWÃ/F4%KFR 7(/hX[c/398 /!*J"ÿò0Á  ²+²+°/±+±± 9901&'67>7.(¸8F¡!J¼ÁE;——;8-“Á0ù>PÜ<„äé6jµ¶j1°?0É#åÁ8ž² +´ +°2²'+´ ' +°13´+°72°9/°$Ö´)+³)$+´+°/´+² +³@ +³@4 +² +³@ +±:+±$²"&999±)²'+999±³"+$9°'±$)9901!5>7#"&54632&5462>32#"’ ".F-þ-F/! O&@\S;""']‚]'  ;S\@n%%9%./$:#,"(_CA\ 82?ZZ?28 \AC_"OÁCв)+´+²)+´*+°'2²9+´0)9 +° 3´0+±B22°D/°3Ö´+°± +´?+±E+±3±)*99° ·.067#"=!2ß8"L2.@,740 ??;%@.K((,C$þU,T 4R5K,FJHGKF-K5Rœ?('Ðt?.!7&//O09Z40='.?J4P* 8vPJ5-J=BkCBjB>J.5J#ÿò“À!² +²+°3°/±+± °901>32.'.54632\Y6=W5QTMQm<+U>w0JFT;6phi†BK‰ŽOY/?V"ÿò0Á ²+²+° /± +01&'6(¸8F¡!J¼ÁÁ0ù>PÜ<„äé#åÁ/h-²:+´+²:+´;+°82²W+´+´H(:W +° 3´H+±g22´a:W +´a+°N2°a´"+°i/°KÖ´%+°%±T+´+°±C+´0+²0C +³@09 +²C0 +³@C: +°0±+´Y+°Y± +´d+±j+±T%³("HN$9°°R9°C´AV$9°0²999°³2W$9°Y°[9° ´ ^ag$9±(@  %0CKd$9±a"²R[^999°³TY$901%3.32654&#"654&#".#"32>!5>7#"&54632&5462>32#"„!2ß8"c`%G<$vLB44A2.+8!?D(.%  ".F-þ-F/! O&@\S;""']‚]'  ;S\@nœ?('¨H538 l6&DF$e#A37G )(H%9%./$:#,"(_CA\ 82?ZZ?28 \AC_7¶ L²+´ +° /°Ö´ +°´ +° /°´ +°/±+± °9±° 901%#"&46323B,-BB-3"S%..J.-7ò¶X²+´ +°/° Ö´+° 2°´ +°/°±+´+±+± °9±°9±° 901"&46323#54'&BZBB-6 ‰T‰&÷þ\%..J.-7mC”88m7™¿в+´ +³+´  +² +°/° Ö´+°´ +°/°±+´+°´ +°/±+± °9±°9±±99± ± 99° ² 99901#"&4632#"&4632"F0/FF/:#F/0EE0:"kþs&--L-¬“þ'&--L-b7™¿’²+´  +³ +´ +²+°/°Ö´+°2°´ +°/°±+°2´+°´  +° /±+±°9± °9±± 99± ±99°´$9015%#"&46325%#"&4632€þ¢wF/0EE0:"þ¢F0/FF/:#­==þ'&--L-Úþû&--L-¬BÿëpÚ i²+´+² +´ +´+°!/°Ö´+° 2°±+±é±"+±°9°°9±² 999°°9° °901#"577>324&#"326p;W_&(  FNW%'30;b,C|R0Ç þÊ VOcd‚‡’• ¢$9°¶¿ˆ³Û9—™$9¸6»?^îL$9°A±C†99¹ìHºFÝR999°9µM0H`Íè$9°fº>aO999±ÒcA265jmxy‚×áåçD$9°q±o499¹^”±‚’99°šA!&†–DOPYjlo$9°¸p9¸fA 23œRW$9¸9º|hr999¸-¹4>99¸¢A )06ILdsu ¤$9¸H¼5G0ª$9°Í¹üœ99¸ºþ&§999°êAxy 6î#…‡›¬±$9¸‹°ð9°Þ»è!xµ$9¹å€A¢³Ûá¿çòó }~‚$9°ã²qÒø999°Õ²C±Â999°ö²FÄ®999±¥Ù±H99°7°I9° @ SÉÊ$9°a±`Ë9901&547.+>7&'32.'>?/&54654'2>2%2367>7632327#"&'&/.'&547#"&'>7&'>;&5477654'4?&54?&472>54'#"&'#"32?632#"'%>7.#"327'&547.'&'6324654.'.#"3263232654&"#"'.'&'&'&'32?6=#"'>7>7&54672>7327"&+"327>32&#"54#"#654.'6767›94OgB/4PB6Ê*'#C  / ˜Fs3IJIž  ý¦  +b] ‚i ),/KImL W!+a>E,'ƒ Y3q2VU U (%# †  (Ø[]DZ ¯A'$04[,  ).P() -2þ >…c`* f…8''j)6 -M01$"" 8 9+ "# vpn #AYI[ o#,ü&g!!jV0D9'0*A   H ! E"   !   Å:## H% þG " # O0•:/B4G/93NF W  >FH ¦   ˆ*{/ ) N !!" %5T ¡Em*a &x18_ Mx'+26LL !!%!.x憇çþò憇,þf©æþ+þb èóž©èך å†çþò熆ççþrþa èõŸ«éÚ™ åñþg¨å ÿ9ó!!'b° /´+°&/´+°(/° Ö´ +° ±+´+±)+± @  "$$9±&@ #$9012".4> 654 32%  &#"œÆ¹‡QQ†¹Æ¹†QP‡nþÞ&mŸþÛþÛ¥¤þ$þßp¢!"€¢¢!Q‡¸Ç¹‡QQ‡¸Ç¸ˆ~þÞþÛ€¢¥þ%þÛq£$"¤¢øþß"mÿÿ=ÿ®¿í'WèÿŽV=ÿ®¿í“°/±é² +³@ +° 2°/°3´+°2² +³@ +² +³@ +° /°Ö´ <+° ±+°2´+°2² +³@ +² +³@ +°±+´<+±!+±±9901%#".5332653##5#5353¿M–\^˜MR—YaR¦8¦¦8èLŽ``ŽLý÷X‹S þ"8¦¦8¦¦(ÿìã ²+°3° /± +01''7'7ë1ÇÇ2ÇÈ2ÉÊ1Êá2ÈÇ2ÇÉ1ÊË1Ê(ÿø8N²+±é°/± é°/° Ö´&+°±+´ &+±+±³ $9±³ $9016264&"462"w"."".qPpPPp—.""."qpPPpP8ÿð0è b²+±é°/±é° /±é°/°Ö´<+°2°±+° 2´<+±+±³$9±±99± ±990166  !."!268Þ<ÞÞþÄ‹RªâªDý®ªâªÎ<ÞÞþÄÞ¤o••¿o••8ÿð0è ‰²+±é°2°/°3± é°2°/° 3±é°/°Ö´<+° 2°±+°2´1+° 2°±+°2´<+±+±±99±±99±±99± ±990166  .'))>8Þ<ÞÞþÄÇ dþ®e ePÿdÎ<ÞÞþÄÞ¤dþÿ´dþÿHˆØ (²+°3° /±é° /± +± ³ $901!# #7H@ðð_ÁÁ_ð[‹‹Øþ”þ”$þÜlÓÓHˆØ ²+± é° /± +01)33'ˆýÀðð_ÁÁ_ð[‹‹llþÜ$þ”þäÓÓHˆØ )²+± é°/±é° /± +± ³ $901)! 7'ˆýÀðð@𼌌‹‹llþ”ÔÔýÈÓÓ0ðâS²+² +°3´+°2°/° Ö´ +° ±+´1+°±+´+±+± ±9901462"$462"#3\+>++>þ©+>++>ÝPPy>++>++>++>+ý²Ø0•ز+°3°/±+01!# #3•UÞÝUUcýØ0•ز+°/±+0133#0UÝÞUþøUØýcý(HˆØ @² +±é°/±é°/± é° /° Ö´1+°2² +³@ +±22± +01!!!!!ˆþðþðýÀØPôPôPØHˆØ @²+±é°/±é°/± é° /°Ö°2´ 1+² +³@ +±22± +0135!5!5!5!5!Hðþðþ@PôPôPý(6ÿøÞ#޲+±é² +±é´ +±é´"! +±"é´ +±é°$/°Ö°2´&+°2°±+°2´&+° 2±%+±· $9±³$9±³ $901264&"462"264&"462"!5!ñ"."".qPpPPp"."".qPpPPp,þèm.""."qpPPpPþÉ.""."qpPPpPLPHrØg² +°3± é°2° /±é°/°3±é°2°/° Ö´ 1+°2° ´  +° /°3° ±+°2´1+´ +°2±+013#3###53#533Šè˜˜èZ蘘èZØPýÈPDþ¼P8Pþ¼HžØ 1²+°3°/±é° /°Ö´ 1+± +±² 99901! ! !iþïþðVþî§þ¡KþµØþ²þ´JþWHÿöâP²+´ +²+´+´ +´+°/° Ö°2´ +°2° ±+´+±+01462"462"462"t+>++>þ©+>++>++>++>M>++>+þÿ>++>+ƒ>++>+HžØ ²+± é° /°Ö´ 1+± +01 ! žþîýªrþ¡šþ´þ²ØþµKýx©þW8ÿð0è i²+± é°2°/°3±é°/°Ö´ 1+° ± +´1+°±+´1+±+± ±99±±99± ³$90166  >4&8Þ<ÞÞþÄwo––oPo””Î<ÞÞþÄÞ¦©ä©Sý®©â©8ÿð0è#p² +±é²+³+±é°$/°Ö´1+°±"+´ 1+±%+±°9°"· $9° °9± °9°· $90146327#"''7&&#" 326548Þž†j080TÞž†i/8/U3Qf|°>Ýþ[Rd|°lžÞU080i†žÞT/8/jt>°|fQmþ[=°|dHÿöÜâ]²+´+²+´+²+´+´  +´+° /°Ö²222´+² 222´+±!+01462"462"462"462"H+>++>++>++>++>++>++>++>±>++>+>++>+>++>+ƒ>++>+0pز+°3°/± +013# #`ðð_ÁÁ_Øþ”þ”$þÜ<|Ø O²+°3° /±é°2² +³@ +° /°Ö´1+°±+´1+°± +´1+± +013#333#!ŒPøPøPþ`”Dþ¼þlDHˆØ&²+° 3°/°Ö´1+±+±°9013#35373#¨`ðð_™P™_ðð`Àllèèèèþ”þ”#4@ìP°/°3´+° 2°/°3´+°2° /°Ö°2´+°2°± +°2´ +°2±!+01462"462"462"462"X+>++>++>++>þ±+>++>++>++>—>++>+þÿ>++>+W>++>+þÿ>++>+HžØ >²+±é°/±é° /°Ö´1+°2² +³@ +± +±±9901!!!÷þ¡PVýúˆþWߨý‰P6"¾¶M°/±33´+± 22´+°/°Ö´+°± +´ +° ±+´+±+01462"$462"$462"*+>++>þÛ+>++>þÛ+>++>M>++>++>++>++>++>+:Ø ²+° /±+01 %5-5%íþÄmþ8=þÃÈþ“–Ur„K¤VrrV¤K„0pØC²+±é°2² +³@ +°/°Ö´1+² +³@ +² +³@ +± +01)5333pýÀøPøPˆýx<ÿð<è i²+°3± é°2°/°3±é° 2°/°Ö´1+² +³@ +°2°± +´1+² +³@ +°2±+± ³ $901"3"&632644#<|°°|žÞÞžý|°°|žÞÞž˜°ø°PÞ<ÞýX°ø°PÞþÄÞ6ØŒ²+°3°/±33±é±22° /±33± é±22² +³@  +°2° /°Ö± 22´1+±22² +³@ +° 2°±+±22´1+±22² +³@ +°2±!+01!#5##5#535#53533533#3#'#3PZPïïïïPZPïïïïPZZïïïPZPïïïïPZPªZHÄØ 2²+°3° /°Ö´1+°2°± +°2´1+± +013#3753#˜PPÜPPÜØþ_ÜÅý(¡ÜHˆØ4²+±é°/±é°/°Ö´1+² +³@ +°2± +01%!!!ˆýÀ@þPPØPýÈZªØ"²+°/°Ö´1+´1+±+013#3ªPPØ6Øf²+°/°3±é°2° /°3± é°2² +³@ +°/°Ö± 22´1+±22² +³@ +°2² +³@ +° 2±+01!#5!5!5!5!53!!þ¼Pþ¼Dþ¼DPDþ¼?PïïPZPïïPZ&ÿ ºØ P² +°/´+° /°Ö´+´+³+´ 1+° /´1+± +± ³$901462"7#3&+>++>GPPµ>++>+àØ?ÿðgØp²+±é°/´++° /±é° /°Ö´1+°±+´1+±!+±± 99°´ $9°±99±²999± °901 &5467%!5!32654.'†X‰”ÿ”O<þmþÂKIf^]g&?4¼‚_`v{aI~,ÉPPç6]B@L=I,D'6ÿøFàƒ²+±é² +±é´ +±é´ +±é° /°Ö°2´&+°2°±+°2´&+° 2±!+±· $9±³$9±³ $901264&"462"264&"462"…"."".qPpPPp"."".qPpPPpo.""."qpPPpPþÇ.""."qpPPpP8ÿð0èN²+±é°/± é°/° Ö´1+°±+´ 1+±+±³ $9±³ $901264&"6  ˆ°ø°°øÿÞ<ÞÞþÄèø°°ø°þ6<ÞÞþÄÞ7ÿî0ça² +² +±é°/±é° /°Ö´1+°±+´1+±!+±³ $9°± 99± ° 9°³ $9014632'#"&"327'7654&7⛟ÝUL8Lh‡ Ý}z³®cSÓ9Ò>®j Ý⛇hL8LUáÈ®y³>Ò9ÓOgz³HˆØ O²+°/°3± é²  +³@  +°2° /°Ö´ 1+° ±+´1+°± +´1+± +013###3!8PøPøP Øþlþ¼D”þ¼<ÿöÐâM²+´ +²+´+´ +´+°/° Ö±22´ +±22´ +±+01462"462"462"<+>++>++>++>++>++>M>++>+þÿ>++>+ƒ>++>+8ÿöHâ'p²+°3´+°2²#+° 3´'+°2´# +´+°(/°Ö° 2´+°$2°±+´+°±+°2´+° 2±)+01$462"462"462"462"462"´+>++>++>++>é+>++>é+>++>++>++>!>++>+ƒ>++>+þÿ>++>+þÿ>++>+ƒ>++>+8ÿð0耲+± é°/´+°/±é°/°Ö´ 1+° ±+´+°± +´1+±+± ³ $9± ³ $9± ³ $9±³ $901462"$264&"6  j+>++>þó°ø°°øÿÞ<ÞÞþÄM>++>+Æø°°ø°þ6<ÞÞþÄÞ7ÿî0çd² +±é²+³+±é° /°Ö´1+°±+´ 1+±!+±³ $9° ±99±³ $9°°90146327#"&2654''7&#"7Ý ‡hL8LUÝŸ›â}~®>Ò9ÓSc®³k›áUL8Lh‡›âݳzgOÓ9Ò>³y®8ÿð¾è'/7˜² +±$é°//±é°/±3é°/±é°8/° Ö´!1+°!±+°2´)&+°02°)±-+°42´&+°2±9+±)µ $&$9°-³$9±/$²*999±± !99±3²699901%462#"&54632"&547&#"327&6264&"264&"®PpP6SX) Üá›%UW9PpP$ y³®~ $O"."".""."".ž8PP8,F'á› Ü%H.8PP84)®~y³)K.""."z.""."6rØ O²+°/° 3±é°2² +³@ +° /°Ö°2´1+°2² +³@ +² +³@ +± +013##5333#üPvvPvvDPDþ¼PHˆØ ²+°3° /± +013# #3(`ðð_ÁÁ_ðð`ÀØþ”þ”$þÜllþÝ8ÿð¾èBÛ²+±?é°/±é°53#4&'#5#46wŒµP‡jPi†P´‹‹´P†iPj‡Pµ À  a@r ¼¼ q@`  À  `@q ¼¼ r@a H˜Ø²+°/°Ö´1+±+013#3#'˜P_ñ` Øþ”ó6Ø+Á²$+±33²+° 3±é°2² +³@ +± 22´ '$ +°3± é°2´)*$ +°3±)é°2°,/°$Ö°2´#1+°2°#±+²'222´1+² 222² +³@ +² +³@) +°±+° 2´1+°2±-+±' ±&99±±9901.5353>53!!#4&'#5#4675!5!wŒµP‡jPi†P´‹$þÜ‹´P†iPj‡PµŒþÚ&Ì  a@r ¼¼ q@`  8P8  `@q ¼¼ r@a  8P1ÿóž²+°/±+01 5žýðý“ŒWõöW!W.ð<8#°/°3´7+°2´7+°/± +01#5!#5ññ8HHHHH¼rØ;²+±é² +³@ +°2°/°Ö´1+°±+´1+± +01353!3˜ŠPþÖP Ìþäÿÿ2ÿñp&!J'y¹ÿy¹%.kʰ/±+°2´ +°2± +0155îîî\T\\T\ÿÿ?ÿèïÍ š<ÍÀÿÿð4Ì&jÿÿ! Ò¤&}P aÿÿ! Ò'y„Ñaÿÿ!’Ò¶&yz¯aÿÿ5ÿ,¦Ù& ì ƒÿÿ&ÿ,—Ù&  —ÿÿsQ'yÿ¿ÿ,'y´ÿ,'yÿ¿y´ÿÿRYÞ‡ ³Z@Àÿÿ&Y²‡ ³îÀ@ÿÿ_r¢&yÁl'y³l'y¹ÿ|'y¹Wy¹l9éåm²+´+²+± é²  +³@  +° /°Ö± é° ±+°2±é°2°±+±é±!+± °9±² 999± ±99014632#4&#"#54.3#9taloU8I:F%45%Z%54%³ZZ%XhwsJR?3#=00B%7/ 9-1JþqhÿÿKÜEÖFtÙ%1å²/+´0+°,2²(+´'+°*2´/( +° 3´+° 2´/( +°3´+°2°2/°Ö´+°±+´+°±1+´,+²,1 +³@,. +°)2²1, +³@1/ +°'2°,±#+´ +° ± +´+±3+±°9°°9°°9± #°!9° °9°° 9±³#$901264&"264&"%2"&546!2"&546'#5!#3!53‚mþ%34H44¢%34H44¹›r››þŽ›p<3%$34$#43%$34$#4à<<ýŸ<<FtÙ&19A²+´+°2²+´+°2´ +° 3´+° 2´-= +°43´-+°!2´'A +°83´'+°2´ +°3´+°2°B/°/Ö´;+°;±?+´*+°*±+±22´+± 22² +³@ +² 222² +³@ +²222°±$+´3+°3±7+´+±C+±;/°-9°?°'9°*°,9±3$°"9°7°9°°!9±A=³$*/$901#5!#3#3#3!535#53#532"&546!2"&546264&"264&"?›r››››››þŽ›››››Ý%34H44þ¦%34H44†þq<<<<þ<<<<<<q<¤3%$34$#43%$34$#4MFÿÃ^Ù2å²+´0+²+± 33´ +´+°2°3/°Ö´+°± +± 22´)+±(22±4+°6º=šî¥+ ° .° À±(ù°&À° ³ +°(³'(&+² Š Š#9²'(&9µ &'(......³ &'....°@± °9°)±99±0±99°² 2999°°9°°901%#"'#7&54>7&'#"5325332?373327^5R.($E8A":!Dƒ<Ža?VC4B!;7>謬¬§÷DA,=3,`… .FÚÙ!µ²+´+°2² +´ +°2´! +´+´  +´+°"/° Ö´+² +³@ +²  +³@ +°±+´!+°!±+°2´+² +³@ +² +³@ +±#+±!±99± ± 99° °9013!535#5&5#5!#32>5+X‚þÀ‚åo‚@‚C6*# :LS ôþH<<´Ž2í<73#3!535#535#5&'LS þÓ„‚@‚v9&*# ‚‚‚þÀ‚‚‚åO,bDù<&<<<;> þÀ<<<<<<<Ž$ƒFÿô å%-5=ÿ²+´9+²+° 3´-+°42´)$ +°3´)+°02´! +°3´+°>/°Ö´'+°'±+´7+°7±+´+°±;+´+°±3+´ +±?+±'³$),$9°7±*+99°´!8=$9±;´9<$9°±./99°3³ 05$9±$9´<$9±!)µ '*/2$9±-µ &+.3$90146323>32#"&'#"&5467##"&264&"264&"264&"FR:2L œ L2:RR:2L 00>RtR>00 L2:/B//B/B//Bþú/B//BtR>00>RtR>0þÎ L2:RR:2L 20>­B//B//B//B/ýøB//B/Fÿô\å5=EMK²+°3´E+°<2²*+´I+´"* +°03´+´A* +°43´A+°82´* +° 3´*+°2°N/°Ö´C+°C±'+´K+°K° Ö±é°/±é°K±#+´0+°0±G+´,+° Ö± é°,±7+´+±O+±C³@E$9°'³>?$9°³"$9±#K²)IL999±G0²*HM999±, ³ 1$9° ³ :;$9°7³49<$9±Eµ6;>C$9±A"µ7:?B$9±I´$',/L$901462"$462"#"&'##"&46323.54623>324&"2$4&"24&"2((((R:2L ì L2:RR:2L X0>RtR>0X L2:/B//Bþ1/B//B./B//BR&&&&{tR>00>RtR>02 L2:RR:2L þÎ0>­B//B//B//B/B//B/FŠÙ²+´+° 2²+° 3´ +´+°/°Ö´+² +³@ +°±+°2´ +²  +³@ +² +³@ +±+±°9±±9901326=33!53#"&5467šI4DŽ<}þÊ})u4Mlw_?`):e<ýc<<¦>謬FÆÙ¤²+´ +²+±33´  +´ +´ +±33´+±22°/°Ö´+°±+´+°±+°2´ +±22´ +± 22±+±°9°°9°°9±°9°°9012533#3#3##"'#"5325LŽ<°°°°°ì,E Eƒ<ŽÙ¬¬©<¾<¾< >>謬FÿôôÙ:D!²+´A+²+±!%33´9 +±.33´+² ;222²9 +³@9* +°32°´'+´  +°3´ +°#2°E/°Ö´+°±!+´"+³>"!+´+°/´>+°"±D+±%22´ +°&2° ±)+´,+°,±2+´6+±F+±°9±">°9°D²A999±,)° 9°2°9°6°9±A°9°9±99°'°9°± 99° °9°°901#"'#"'#"54675#"'#"532532536532>53323265Ë)9= =H%DOOŽ‹e,E Eƒ<Ž<Ž>H9 C^t®?[È>>謬¬¬þo‹#2992##29=A,-6eMFÿôôÙJTa²+´Q+²-+±1533²+´ *+³0 +°33´++°'2´ +´*+´I +²K333´I+±$>22²I +³@I: +°C2°´7+°U/°-Ö´.+°.±1+´2+³N21+´!+°!/´N+°2±T+±$522´+°62°±9+´<+°<±+°2±é° 2°±B+´F+±V+±!.°+9±2N°)9°T²'Q999±<9°9±²>?999±FB°9±±!N99°°L9°I±#99°7°9°+±99°°%9± 0² )99901$462"462"#"'#"'#"54675#"'#"532532536532>53323265´((((û)9= =H%DOOŽ‹e,E Eƒ<Ž<Ž>H9 C^t®?[È>>謬¬¬þo‹#2992##29=A,-6eMFÆÙ²²+² +± 33´ +´+² +³@ +² +³@ +´  +°3´ +°2°/° Ö´ +° ± +´+°±+°2´+°2°±+°2´+±+± °9°°9°°9± °9° °901!#"'#"53253253353#5#Ú,E Eƒ<Ž<Ž>謬¬¬þ]CÄEúFÿRÆÙ1ð²+´++² +³@ +²+²+±#'33°/´ ++²  +³@  +´0) +´0+²0) +³@0. +²)0 +³@)+ +´" +°3´"+°%2°2/°Ö°2´+° 2°±#+´$+°$±+±'22´+±(022°±.+°*2´-+±3+±#²999°$°9°² 999±"°9°°901"#43232>53#"&%#"'#"53253253353#5#®>謬¬¬þ]CÄEúFŠÙ W² +°3² +°3³ +°3°/° Ö´ +° ±+´+±+± ° 9°±99± ±9901573#573#NÚÚ<<þÒÚÚ<<”€Fý'”€Fý'FÿôÀÙ~²+² +´+²+´+´  +°3´+°2°/° Ö°2´+°±+°2´+°2°±+´+± +±± 99±° 9013##"&546;!5#"3265Öê<®r¬rrVŒþ¬TŒ5‘Q>œ>>N=Q< (!6-E9j9E-l-E9j9E-6#óJ_3333`J+1"]”k{{k”]""]”k{{k”]"( FJ‘09Bí° /±33´+±+22² +³@ +°2°?/°53´+°$2°C/° Ö´+°±+´A+°A±<+´+°±"+´8+°8±3+´'+°'±0+´+±D+±± 99°A°9°<²999°²999±8"²$999°3²) 999°'°%9°0±+99± ±99°?µ"'1:$901%#"'"'#"&53327&546227&546232>5654&"654&"‘Q>œ>>N=Q< (!6-E9j9E-l-E9j9E-6#Ý2(æ2(óJ_3333`J+1"]”k{{k”]""]”k{{k”]"( JzIaaIzJJzIaaIzF>§‚#“°/´*+°#/´ +²# +³@# +³ #+´*+°/´+² +³@ +°/´ *+°$/°Ö´+±22°±+°2±é² !222°±+±é±%+± ³$901$462"462"462"#3!!!!©&&&&&&þ<<‡þy‡þy((”(( ((òDÈ<<<F>§‚в +´*+°/´*+°/´+² +³@ +² +³@ +°³+´*+° /°Ö´+°2°±+°2±é± 22°±+±é±!+±³$901$462"462"462"#3!!©&&&&&&þ<<‡þyÌ((((d((òDþü<FòÙ [#²+²LP333²+² FJ333´ +³"3DH$3´+³NRVZ$2´, +°3´,+°;2°\/°Ö´+°2°±+°2´+°!2°±)+´+°±+´.+°.±9+´+°±+´>+°>±Q+°E2´P+°G2°P±M+°I2´L+±]+±)°+9°²%2X999°.²,3W999±9²4;V999°²5BU999°>°<9±±UX99°µ ).9>$901>54&">54&"#5##333327.546227.5462;333#5##5#"'"'+*4*þn<<<<<< 6-7n7-l-7n7-6 <<<<<< N>>œ>>N )6)FAAF)6))6)FAAF)6þÇ……Ùýèýè"#(A)f]]f)A(#""#(A)f]]f)A(#"ýèý'………3333F4Ù=®²4+°3²5+°3²/+°3´:+°2´%4: +´%+°>/°4Ö´3+°62°3±'+´+°± +´"+°"±+°2´+±?+±'3±/:99± ´$%-<$9±"±99±/¶"'27$9°:°<9012654.7253#.#""&54>7&#"#3>326½! *.* !†)k<<n.6-' DrD '-6.n<<k)N>>É ,(DCCD(,”9+éý'Š;S"2)(d__d()2"S;þvÙé+933FÙn²+° 3²+°3´ +± 33´+±22°/°Ö°2´+°2² +³@ +°± +°2´ +°2² +³@ +±+013333#####5 <×<ÅÅ<×<Å‹Nþ²Nþ²<þ±Oþ±O<FŠÙ +«²+´+°2²$+°3´+´$ +´+´*$ +´+°,/°!Ö´ +° ±+´'+°'±+°2´+² +³@ +² +³@ +±-+± ´$*$9±*² !999°° 9°°'90132654&#"326=33!53#"&54632#"¥!4"8FI4DŽ<}þÊ})u4MlyK+9H1>c' t):e<ýc<<¦1•`²`•'L~:CG6ô&&&&­n*™[D?`˜*o>;‹ZzzZ‹Â/\§yMKIO€F‘Ù@IR²+±33´"+±.;22²" +³@" +°2² +°3´*+°2´)O +°E3´)+°42°S/°Ö´+°±&+´Q+°Q± +± é° ±L +´++°+±2+´H+°H± +±é°±C +´7+°7±@+´+±T+±&±"99°Q°(9° ´$-JN$9°+²).999±H2²/4999°´09AE$9°7°59°@±;99±"±99°Oµ&+27AJ$901462"$462"#"'"'#"&53327&546227&546232>5654&"654&"H((þÌ((EQ>œ>>N=Q< (!6-E9j9E-l-E9j9E-6#Ý2(æ2(–&&&&þ0J_3333`J+1"]”k{{k”]""]”k{{k”]"( JzIaaIzJJzIaaIzFÆÙÒ²+´+°2²+± 33´ +´+² +³@ +² +³@ +´  +°3´ +°2° /°Ö´ +° ± +´ +° ±+°2´+°2² +³@ +² +³@ +°±+°2´+±!+± °9° °9°°9± °9°°901#"'#"53253253353#5#3!53Ú,E Eƒ<Ž<Ž>謬¬¬þ]CÄE¾<<FÙ/ ²-+´.+°*2²+± 33´- +´*+´)"- +´)+²)" +³@)' +²") +³@"$ +´ - +´ *+´- +°3´+°2°0/°Ö´+°±+´+°±/+° 2´*+°!2²*/ +³@*, +²/* +³@/- +°*±+°2±é° 2°±'+°#2´&+±1+±°9°°9°/°9±± 99± °9°°901$462"462"'#"'#"53253253353#5#3!53?&&&&‚,E Eƒ<Ž<Ž<°<<°}þÊ}Â&&&&d>>謬¬¬þ™CÄEú<<FÆÙ'ê²+´+°2²+± 33´!& +°3´!+°2³ &$+°3´# +°2´  +°3´ +°2°(/°Ö´ +° ± +´ +°# Ö´"+°%2° ±+±22´+°2² +³@ +² +³@ +°±+°2´+±)+± °9± #°9±"°9± °9°°901#"'#"53253253353#5#3!535##533Ú,E Eƒ<Ž<Ž>謬¬¬þ]CÄE¾<<¾EÄCFÿñbè19»² +´+² +³@ +°0/´5+°9/´+°/´%+²% +³@" +°:/°Ö±"22´+±!222°±+±622´(+± -22±;+±°9°³ %0$9°(°+9±0±99°5±99°9±-99°±+99°±(990172653#"&54?&546327654&"#4632#"&264&"±& .D29T:;P&3R:% .D/>QtAHHAAHHAé¼,G+/8SG[5*”+6gD+*>>QtAHHAAHHAþã= Fÿ«Ù Y/²+±33²+° 3´+°2°4/´.+².4 +³@.2 +°J/°F3´Q+°V2²QJ +³@QM +°S2³&QJ+´+°Z/°MÖ°2´N+°2°N±S+°2´T+°2°T±C+± 22´"+°"±+´)+°)±1+´2+±[+±SN²=J999°T²>H999°Cµ :;>QtAHHAAHHAé¼,G+(4J59ªˆ>G[5*”+6gD+*>>QtAHHAAHHAFˆÙ+²+²+°/°Ö´+°2±+±°901% ˆþ¾Bþú··Ù·µFrÙ GQ˲6+° 3² +±F33´+°P2´@6 +°3´+°J2°R/°CÖ´+°±<+´/+°/±'+´+°±M+´+±S+±C°69°<³5@F$9°/± -99°'± +99°±)99°M´ !H$9±@6³'/<$9°³)->$9°´ +C$901&#"32767632#"'#.547&'#>54'#"&5463232654&#""7 "d\CC\3`);H1)0 !00H4( ;QQ;,,H8+# 0)1H;)`§." 7=^+ 3:EE:~J1+G8D-paU ]Yv0SF$HH$FS0t`R !`Zs-D8G+1J› +F™Ù"*½²+´&+² +´+²+²+² +´* +°3´+°2²* +³@* +°+/°Ö°2´$+°2°$±(+°2´+° 2°±+°2´+±,+±($´  $9°±99±*&±99°° 9°±99°±9901264&"462353#5#"&5467.264&"‚EfEEfi–i2á<<â3i–i.&'-/°Ö´+°!2°± +°*2´ +°+2° ±+°42´+°52±?+± ±<99° ±:99°±899±<°9± &±:99012>532>53#"'#"&532>532>53#"'#"‚ -:- < -:- 53#"'#"'2>532>53#"'#526=#"&5332>5463" 7%- 7&'#"5325332?3327#"&ø((x((©":!Dƒ<Žè¬¬¬§÷DA,=9X.+?|Fÿì´ÙBi²@+´;+²%+±)/33´@% +´*+´ @% +´ *+´(#@% +°3´(+°,2´*+°C/°%Ö´&+°&±+±)22´8+±*722°8±+±é°±+±é³ +± é° /± é±D+°6º=šî¥+ °.°À±7ù°5À°³+°7³675+² Š Š#9²6759µ567......³56....°@±&°#9°8°!9°±,99° ´.;@$9±¶ /0=$9± ²>999±;±=>99°±899±(#²999°³!.$901462"462"462"'4>7&'#"5325332?3327#"&T((x((x((©":!Dƒ<Žè¬¬¬§÷DA,=9X.+?|F\Ùy²+²+´  +´+´ +´+°/°Ö´+°2°± +´+°±+´+± +±± 99± ±99±±99013632#"&=#"32654&F<þp2::52:x‡<«Ùþnè<42:<5IŠöóF\Ù".±²"+²+²+´ *+³ +´#+´" +´*+´)" +´)+°//°"Ö´!+°2°!±+°2±é° 2°±+´&+°&±,+´+±0+±,&±99±° 9°°9±#)±99± ± 99016462"462"'3632#"&=#"32654&ú((((Ð<þp2::52:x‡<«ü((R((Ãþnè<42:<5IŠöóF¿¢5²+´+²+´+°/°Ö´+´+± +01462"Ffff%fffFÿR‚²+´++² +³@ +²+´+°/´ ++²  +³@  +°/°Ö´+° Ö´+°° Ö´+°/´+±+±µ$901"#43232>53#"&462"®2³ +°43´+²:A222°±+´+°± +´ +±D+±/*°&9°0°$9± ±"299±±99±°9° ° 9±&² 999°-±"99°;³$27$901>532653#"'3"&54654'&'#"&532653654&5463"64=8r8ÿ²+´*+²+´ +²2+±33´6*+² +²+´>:2 +´>*+±22´.2 +°3´+°2°?/°!Ö° 2´(+°2°(±,+°2´+°2°±8+°/2±<é°32°<±+°2´+°±+´+±@+±,(´$$9°±99±>*±(+99°:³!',$9±.°$9±26±99° ± 99013#264&"462353#5#"&5467.264&"$462"462"Ñ<<ý±EfEEfi–i2á<<â3i–i.&'-32#"&54>73264&#"‚=H<( h9dtƒU|„=VR–/iFVOK5`¶8Gd6Q9KUuKYw¾¾C„Y:ý¯NafQsFÛ#+ ²+´+²+´+' +´+*+´ ! +´ +°,/°Ö´+°±%+±)é°)±+´+±-+±%²#999°)´! $9°°9±+°9°'²999°!°9° ±99°°901>32#"&54>73264&#"462"‚=H<( h9dtƒU|„=VR–/iFVOK5`c((¶8Gd6Q9KUuKYw¾¾C„Y:ý¯NafQs/((FÿôÙ"*2<² +´9+²+± 33´2.  +´2*+°2´3  +°3´3+°2´&*  +´&*+°2´  +°3´+°2°=/°Ö´+°±+´+³6+´ +° /´6+°±<+± 22´+°!2°±,+°#2±0é°'2°0±+°2´+±>+± °9±6°9°<² 9999±.2± 699±°9°°90153#5##"54635#"'#"532532536462"462"'"3265Æ<<°OOŽ‹e,E Eƒ<Ž<Ž<*((((‚Jh((,6HŽþ¦F^t®AeÁ>>謬¬¬þoJ((Þ((K.-6eMFÁÙ q² +°3´ +°2²+°3´+°2°/°Ö´+² +³@ +°2°±+´ +²  +³@  +°2±+± ³$901%"&63"#"&63"Á•ÓÓ•~®®••ÓÓ•~®®<<Ö.Õ<²ü³<Ö.Õ<²ü³FÚÙ+ò#+´+² +´+´(# +´+´# +´+°,/°Ö° 2´+°& Ö´+°±*+´+° 2° Ö´+±-+±*· #($9±#°!9°³ %&$9°(±*99°±+99°±99°³ $9° ° 90173264&#"5632#"'%&#"327#"&46325O;SUllUS;BLi””i+'F;SUllUS;BLi””i+'ý& )H) ?MxM z…þÛ )H) ?MxM zFÿôÀÙt²+² +´+²+´ +°3´+°2°/° Ö´+°±+°2´+°2°±+´+±+±± 99±° 90133##"&546;#"3265š<ê<®r¬rrVŒŒ53#"'#"&53327&5462'654&"ì!( >N=Q< (!6-E9j9E-V2(†1+J`33`J+1"]”k{{k”]"OJzIaaIzFÿÐ09â°/´*+°/°3´$+°2²$ +³@$ +°2°/´ *+°6/´++°:/°Ö´ +° ±(+´8+°8±3+´-+°-±+°2±é° 2³+´+±;+±( ±$99°8°*9°3²/&999°-°+9°±99±· $9±$°9°²&/1999° ³(-38$901462"462"2>53#"'#"&53327&5462'654&"-&&&&^!( >N=Q< (!6-E9j9E-V2(((Œ((º1+J`33`J+1"]”k{{k”]"OJzIaaIzF1Ù$•²+°3²+² 333´" +±33´"+±22°%/°Ö´ +° ±+°$2´+°2°±+°2´+°2°± +´ +±&+± °9± °9±"³$901326533253#"'##"'##"&53325hT"27&'#"5325332?3327#"&":!Dƒ<Žè¬¬¬§÷DA,=9X.+?|FëÙ,ײ+°3²+±33´) +´+´# +´#+²# +³@# +´ +° 3´+°2°-/°Ö´+°±+´+°±+°2´+±&22°±+° 2´,+°2±.+±°9°° 9°° 9±±)99±)°'9±#°9±°9°° 901!4&#"##"'#"53253253632#4&#"632­,4<,E Eƒ<Ž<Ž<#+4S>,4",4S 66  >>謬¬¬þhT> 66 WT>F´Ù#©²+²+±"33´ +° 3´*+°2´ +°3´+° 2°$/°Ö´+°±+´+³+±é°±+°"2´+°± +± é±%+±°9°°9±²999±°9°°901$462"$462"##"'#"532532536((((Z<,E Eƒ<Ž<Ž<Ú((((¾ >>謬¬¬F1Ù,5>À²(+°3´)+°02²+°3´9+°2´>( +±"-33´>+± 22°?/°Ö°(2´;+°;±6+´ +°#2° ´,+°,/° ±"+° 2´-+´+°-±2+´+°2±@+±,;±999±2±099±)°9±9>°901"&546323>3"32#".5##526733254&#'4&#"3dt\Q(:38 Vkf#,thAdt\Q(:38 Wkf#Fº²3@qOKõ3@qOKOqK]qE‰eL…P-3212bej)u+=HODCQQCDOH=+u)jebǵDEJ?T0-u'&'&-&'&'u-0T?JEDFpÙ-Ʋ+´ +²(+´"+´( +´+² +³@ +´( +´+´( +´+² +³@ +°./°Ö´+°2°±+°2´+°±+°2´+°+2±/+±³ $%$9°³ "($9± ²  999±"²$%+999012#"&'732654!#3!52654&#"'>32Ü2bej)u+=HODCQþâ<<QCDOH=+u)jebǵDEJ?T0-u'&'&xþð[þñy&'&'u-0T?JEDF¾Ù!u²+²!+± 33´! +°3´+°2°"/°!Ö´+°±+° 2´+° 2°±+´+±#+±°9±°9±!±99012>532>53#"'##"&5‚ -:- < -:- 53#"'3!53d+FTY< -/8˜›<›˜8/- 532>=3##"'#"&5$462"462"‚ -:- < -:- <<-D]22]TY &&&&.RD))DR..RD))DR.¼ý'/;yy¦ƒY((þ2&&F6Ù%-5Ö²+°3²+°3´51 +´5*+´"  +°3´"+°2² " +³@ % +° 2±) À/´-*+°6/°%Ö´+°±/+°&2±3é°*2³ 3/+´+°3±+°2´+°±+´+±7+±/± "99± @ (),-0145$9±3±99± "°9°-° 9013#2>532>=3##"'#"&5$462"462"ú<<ýˆ -:- < -:- <<-D]22]TY &&&&Ùý'.RD))DR..RD))DR.¼ý'/;yy¦ƒY((þ2&&FÙc²+°3²+°3´  +´+´  +´+°/°Ö´+°±+´+± 22² +³@ +° 2±+013#3#3!!!!F<<´<<‡þy‡þyÙý'Ùß<¢<Fÿ@Ù%Ʋ+´++² +³@ +²+°3²+°3°/´ ++²  +³@  +´%" +´%+´! +´+°&/°Ö´+°±+´+±!22² +³@$ +°2³+´+°/´+°±+´+±'+±±99°± 9901"#43232>53#"&3#3#3!!!!øþ(!//!:RR:0þ磣<¡ý/B/32"&6264&"6264&"‚\€\\€"Y}Y:cc:Y}Y²<\€\\€^\€\\€N‚[[‚[þ!92~²:00:²~29Y™€\\€\è‚[[‚[Fÿòjå08@1²/+´4+²+°%3´+°?2´ / +°3´*+°2´/ +°;3´+°*2°A/°Ö°2´+± é°±+´2+°2±+´:+°:±6+´,+°,±>+´(+°2°(±é°/±B+±± 99° ± 99°±99°2±99°´/38$9°:°"9°6´4.7;@$9°,±%*99°±±99°(±99± ³,25$9°±1699°±7899°´"'($901$462"$462"264&"47.4632>32"&6264&"6264&" ((ý (( \€\\€"Y}Y:cc:Y}Y²<\€\\€^\€\\€†((((ä‚[[‚[þ!92~²:00:²~29Y™€\\€\è‚[[‚[FúÙ 1<G¸²+°3´+°:2²'+°+3´E+°2´B' +°3´+°72°H/° Ö°$2´+°=2°±+°B2´7+°2°7±2+° 2´+°.2±I+±²"'999°7±)99°2²+0999±² 999°B±"099°E²$).9990173265"4&#"2>#"'#"&547&546326324.#32634&#"‚"UoKj5<"UoKj5#"'#"&547&546326324.#32634&#"ú((ý0((>((((þö"UoKj5<"UoKj532%3&"3&#"•ò´@<Š@´ò)R1<;1%:ýöºŒôºFEîþ…þ{}þƒîk/Q<==<#/E/9sssFÿìÈÙ7ß²,+´'+²+±33´5, +°3´5+²5 +³@7 +°2´, +´+°2°8/°7Ö´+°±+´+°±+´+°±/+°2´$+°2±9+±°9°°59°°9°±399°/°9°$² 1999±5'³$)*/$9°°19°± 399°° 9°° 901273>7&'#"5325332?3327#"&547&'#"'‚†<A :!Dƒ<Žè¬¬¬§÷DA,=9X.+?|Q"%5>ÖF Ù^²+² +´ +´+² +³@ +°/°Ö´ +° ±+´+±+± ³ $9± ±9901!#"&54733273Ñ%u8Ml\PpI4ŒF<]Bpknm):GþFÿö4ã/ײ-+´+²+´+² +³@ +´ $- +´ +´(- +´(+°0/°Ö´+°±+´+² +³@ +°° Ö´+°/°%3´+°±+´++±1+±³ #$$9±±(-99± ²+999±$´ #*$9°(° 9°±9901264&"!5>54&#"#46323>32#"&¸^„^^„˜þÔ*i66J.75<\LKi;,Tä |Q[[T|„^^„^ºS!K'46$;@!*;LY^%A.6 <Ok¶pFbÙ /5²²$+´+±22²+´0+± 22´5$ +° 3´+°2°6/°'Ö°-2´+°22°±+°02´+°±+´+° 2°±+° 2´ +°2±7+±°*9±°9±± '99°5±*99°0±-9901%#264&264&"32+"&5467.546"3r+°2°>±8+°2´+°2°±+° 2´+° 2±D+±,(±$/99°>°!9°8±99°°9°±99±/*±!99°5³-9=$901326533253#"'3253#"&'"&'#"&53325#"&53325#"'326hT"2/°2Ö´+°±/+°2´$+°2°$±+° 2´+°62°±8+´+±?+±2°)9°/±(499±$° 9±8²999± !±099°³26$901&#"327632#.=#"'#>=&5432654.#" I ½<+-ƒdÀB!!H) 1%$1<H."Àdƒÿ I㸠+!E#þ£o!!GÂ=> ]Yv0MÂ;: !`Zs-!!o£õD!+ F¸Ù P² +´ +°2²+´+°2° /° Ö´+² +³@ +°2²  +³@ +°2± +01#5!#3!53á›r››þŽ›<<ýŸ<<F Ù ²+´+²+±33´ +´+´ +° 3´+°2°/°Ö´+°±+´+°±+°2´+°2°±+´+±+±°9°° 9°° 9±° 9°° 9012533!#"'#"53255#LŽ<ôþÐ,E Eƒ<޾¸Ù¬¬þ”þ“ >>謬ýcõõFvÚ² +´ +° 2²+´  +´+² +³@ +² +³@ +³ +± À/´+°/°Ö´+°2°±+´ +°2²  +³@ +² +³@ +° ±+°2´+±+01353#5#3!53##53§“<<“}þÊ}é<<”þÙCÄEõ<<BÄFFvÚ%Á²+´+°2²#+´# +´*+´# +´+² +³@ +² +³@ +´ # +´ *+³"#+±%# À/´ +°&/°"Ö´!+°$2°!±+´+°2² +³@ +°±+°2±é± 22°±+°2´+±'+01$462"462"'353#5#3!53##53Ä((((9“<<“}þÊ}é<<Â&&&&ïþÙCÄEõ<<BÄFFvÚ·²+´+°2²+´ +°3´+°2°³ +° 3´ +° 2³+± À/´+°/°Ö´+°2°±+´+°2°±+°2´+°2² +³@ +² +³@ +°± +° 2´ +±+01##53!353#5#3!535##533ké<<%“<<“}þÊ}“<<“XBÄFþÙCÄEõ<<óCÄEFŽ… ² +´ +°2°/°3´+² +³@ +² +³@ +°/°3´+°/°Ö´+² +³@ +² +³@ +°± +´+² +³@ +²  +³@ +°±+°2´+±+01!53#5#3#535##53#Ç‹<< EÄCëEÄC`EÄCè<<è%<<FŽ…%Ų+´+°2°/´*+°/°3´+² +³@ +² +³@ +°/´ *+°!/°$3´"+°&/°Ö´+² +³@$ +² +³@! +°±+´+² +³@ +² +³@ +°±+°2±é° 2°±+°2´+±'+01$462"462"!53#5#3#535##53#Ò((((þÙ‹<< EÄCëEÄC²&&&&5EÄCè<<è%<<F3Ù3²,+°03´+², +³@2 +²+°3´+² +³@ +°4/°1Ö°2´0+±!22°0± +±22´)+°2±5+°6ºíOÂÊ+ ° ° À±#ù°&ÀºòÁˆ+ °° À±$ù±#&°&À° ³ +°³  +°#³$#&+ºïÝÂ+ ³%#&+±#&°$³%$&+· #$%&........· #$%&........°@± 0±,99±,°/9°±)99°°901732654.5463253#5&#"#"&'#3‚@.Us0L\]L0„c9s<<_gKd0L\]L0’p=F,<<’TA,8$I6Sl2ÿmWK9)4&L8[s2F3ÙCU²<+°@3´+²$+°(3´.+´ <$ +´*+´<$ +´*+°D/°AÖ°!2´@+±122°@± +°2± é°2° ±+±'+22´9+°)2±E+°6ºíOÂÊ+ °°À±3ù°6ÀºòÁˆ+ °°À±4ù±36°6À°³+°³+°3³436+ºïÝÂ+ ³536+±36°4³546+·3456........·3456........°@± ³$.<$9±<°?9°°9° ±999°³*+BC$9°±!199°.°,9°$°'901462"462"32654.5463253#5&#"#"&'#3(((( @.Us0L\]L0„c9s<<_gKd0L\]L0’p=F,<<ú&&þÝ&& TA,8$I6Sl2ÿmWK9)4&L8[s2Fÿÿçâ/7§²+° 3²+´,+´  +´+´37  +´3*+°8/°Ö´+°±1+±5é°5±+°)2´+°"2±9+±°9°1°9±5·  %&,$9±² 999±37³&/%$9°,²)"999017>32'>54&">32'>54&#"462"‚1?oxATyQ*+"HVv|qMY K3ZOk5TyQ*+"HV;eÈkÛ&&{+0F"eN8H *6)4C)J;Oé C+?%eN8H *6)4Cp]1((FñüéD°/°3´ +° 2´ +³+´+°/±+±± 99±± 990146323>32#"&'##"FI3+C Î C+3II3+C Î C+3:fI5))5IfI5))5F+Ù ²+²+° /± +±±9901 3#篮¯ çæçkþíþêþ“þ”mF1Ùb²+²+´  +°3´ *+°2°/° Ö± é° ±+±é±+± ³$9±°9° ³$9°°901462"$462"% 3#Ñ&&ýX((¯®¯ çæçZ&&&&.þíþêþ“þ”mF Ù M²+²+² +´+´  +´+° /°Ö´ +° ±+±22´+± +01!5!!53'!Îþxˆ<<þ´}Ú‚ý'¹bþžF¾Ù)£²+²)+± 33´!") +°3´!+°2´&) +°3´+°2°*/°)Ö´+°±+± #22´+± 22² +³@ +² +³@! +°±+´+±++±°&9±°9±)±$99012>532>53#"'3##5#535#"&5‚ -:- < -:- 532>53#"'3#3##5#535#535#"&5‚ -:- < -:- 75#"'#"532532537#53265OOŽ%N.1,E Eƒ<Ž<Ž>謬¬¬þ¸;ö—";&"-6eMFÿR‡Ù9Dü²+´A+²+´++² +³@ +²*+±.233°/´ ++²  +³@  +´-(* +°$3´-+°02°E/°Ö°*2´+°+2°±.+´/+³>/.+´+°/´>+°/±+²!2:222´+±322°±7+´6+±F+±²(999±/>°&9°´ $A$9±(A·!45689:$9°-°"9°*°&901"#43232>53#"&#"54>75#"'#"532532537#53265®>謬¬¬þ¸;ö—";&"-6eMFÌÙ¨²+´+°2²+´+° 2´ +° 3´+°2² +³@ +°2² +³@ +° 2°/°Ö´+°2°±+°2´+° 2² +³@ +°2² +³@ +°2°±+° 2´+±+01733#5!#353#5#3!53#F<é}6}é<<é}þÊ}éÒ5}<<þí}þË}þí<<}Fÿô5Ù <þ²+´+²'+±+/33´8' +´8+´' +°13´+± 22´*%' +°!3´*+°-2°=/°'Ö´(+°(±++´,+³,++´+°/´+°,± +±/22´+°02°±;+´ +° ±+´5+±>+±(°%9±,°#9° ²!999± ;°9°°89±³5;$9±*%°9°'°#901"3265$"2654'##"54635#"'#"5325325332#"&54ÚJh((,6..ŽUOOŽ‹e,E Eƒ<Ž<Ž<³0<<30< K.-6eM*(*)*F^t®AeÁ>>謬¬¬þoI64GI7!FÆÙu²+´+°2² +±33´  +´ +°2°/° Ö´ +° ±+´+°±+°2´+² +³@ +² +³@ +±+0133!53!333&2°!±%+°B2´3+°-2°3±+°2±é° 2±G+±%!µ*+056;$9±#±!$99°±3899°'± %99°A±0;99°±?B99°±(-99°E±>C9901$462"462"462"462"264&"'462"&5467.6264&"r((((ý¸((((²EfEEfi–i-'&.i–i.&'-=&5432&#"!&=#"', Iù<+-ƒdÀB!!ýÕ."Àdƒ* I f_Z1%$1ãD!+ Áþ£o!!GÂ=> !`Zs-!!o£õ¸ +!Eþ?¾ŠŠF Ø,7Ô²+°/´-+°2²- +³@- +°3/´"+°/°3´+°&2°8/°Ö´+°±+°2´6+° 2°6±0+°$2´++°2°+±+°2´+³(+´ +° /´(+±9+±²-999±06°"9°+°.9° ±&99±"3±*99°³($901&#"654.#"353#5!6=&5432327632!&=#"' I ª I6b<<ýÖ`Àdƒ<+-ƒdÀþÝ#<1%$1㸠+!ED!+ ýæCÄEÀ!!o£þþ£o!!ež–mmFeÙk² +²+´+´  +°3´+° 2² +³@ +°/°Ö°2´+° 2² +³@ +³@ +°± +´ +±+01%##535!5!3##Ï<ÕÕþ³‰–32#"&'##"q&&&&þ¸I3+C Î C+3II3+C Î C+3Ê((:((’fI5))5IfI5))5Fÿô<Ù(08B ²+´?+²+±"&33± À/´+´84 +´8*+´9 +°3´9+° 2´,0 +´,*+´! +°3´!+°$2°C/°Ö´+°±"+´#+³<#"+´+°/´<+°#±B+±&22´ +°'2° ±2+°)2±6é°-2°6± +´+²  +³@  +±D+±°9±#<°9°B²?999±48³<$9°9± 99±!°9°°9012#5264&+#"54635#"'#"532532536462"462"'"3265°:RR:!//!šOOŽ‹e,E Eƒ<Ž<Ž<*((((‚Jh((,6HRtR>謬¬¬þoJ((Þ((K.-6eMFÄÙ+˜²)+´*+°&2²"+´!+°$2´)" +°3´*+°2´)" +°3´*+° 2°,/°Ö°2±é°2°±++´&+°&±+°2±é° 2±-+±³!")*$9±³#$'($901$462"462"462"462"7#5!#3!53d((((þÆ((((…›r››þŽ›Ð((.((ö((.((×<<ýŸ<<FîÙ5ë²+²+±",33´  +°3´*+°2³ +´3+´ +°03´+°'2°6/°Ö´+°± +± é° ±+°"2´3+°#2°3±+´5+°5±,+´-+° Ö±é±7+± °9° ±99±3±'099°5°(9±-±99°±99±3· $9±±29901$462"$462"5##"&532>532>53#"'3Ž((þ,((2À+FTY< -:- < -:- ?$9±±/9901%3#3!535#535##"&532>532>53#"'3462"$462"`‚‚‚þÀ‚‚‚À+FTY< -:- < -:- 532>53#"'3`‚þÀ‚À+FTY< -:- < -:- +°*/´+°B/°Ö´+°± +´,+°,±3+´+°±+´8+°8±'+´+°± +´ +±C+±,°9°3±.99°²*999°µ!156<@$9°8²)999°'± $99°°9±>± 99°@ #',.38:$901462653"'.53&654&";>54&"327&5462327&ƒ¯ú¯&)532>53#"'3$À+FTY< -:- < -:- 532>53#"'3`‚‚‚þÀ‚‚‚À+FTY< -:- < -:- Ù'/²+´+²++°3´'+°2´ + +´+´#/+ +°3´#+°2°0/°)Ö´!+°!±%+´-+³-%+´ +° /´+°-±+´ +³ +´+°/´+° ±+´+±1+± !³#&*/$9°%±+.99±-± 99°³$9°± 99± ±99°³$9±³ $9±'#·(),-$901$264&"462"264&"462"$264&"462"^;R;;Rw^„^^„º;R;;Rw^„^^„þ&;R;;Rw^„^^„ÉR;;R;¦„^^„^bR;;R;¦„^^„^ÉR;;R;¦„^^„^FÙ(0¿² +´,+²+´+´"#  +´"+´0  +°3´0+°2°1/°Ö°2´*+°2°*±.+°2´ +°2° ±&+´ +²& +³@&" +±2+±.*´ $9° ±99±#"±*-99°0¶ &).$9°°9°±9901264&""&5467.546232#5264&#264&"‚EfEEf´3i–i.&'-i–i2þ:RR:!//!þEfEEfS~JJ~Jþ²:PSrrS5XX5SrrSQ8RtR+°2´+°*2°±+°2±é° 2°±6+´0+²60 +³@62 +±B+±>:´"'($9°±,99±32±:=99°·059>$9°@±/699°°"9± ³%*$9°±9901$462"462"$264&""&5467.546232#5264&#264&"ë&&&&þzEfEEf´3i–i.&'-i–i2þ:RR:!//!þEfEEfÊ((:((‡~JJ~Jþ²:PSrrS5XX5SrrSQ8RtR#2::42:p0Fæ×)3;C²+´+°2°;/°B3´7*+°>2°/° 3´+°2² +³@ +° 2°(/´-+°2/´"+°D/°Ö´*+°*±/+´%+³/5+±9é°%±+°2´+°2² +³@ +² +³@ +°±=+±Aé°A± +´ +±E+±5*´"(-2$9±%/µ67:;$9±A=° 9±±99±-(°9°2±%99013253253#"'3!53#".54632#"'3254&#"462"$462"ˆ 37{<ö<·T'}þÊ}'T%<%<428;544U&&&&08³³³ï*þ®<<R*0(>#2::42:p0þ?((((Fæ×;EOû²+´+°2°!/°3´7+°2²7! +³@79 +°2/°3´I+°C2°N/°>3´,+° 2°P/°)Ö´F+°F±K+´/+°/±+°92´+°:2² +³@ +² +³@ +°±+´A+°A±<+´+±Q+±KF²2,4999°/±!799±A±99°<² 999±7!±99±I2±499°N³)/$901267#"&54632#"'3!53#".54632#"'325374#"326%3254&#"/73 5;824<&:%T'}þÊ}'T%:&<428;5 37{<ö44ýØ44 80 :24::2&;*0*þ®<<R*0*;&2::42: 08³³Í.00F\Ù;ز6+´7+² +´!+´ 6 +°3´+°.2´6 +°13´+°%2´6 +°3´+°)2°32#"&'##526=€/B//BýÓ/B//Bª L2:RR:2L UR:!/[ L2:RR:2L [R:!/ŽB//B//B//B/n0>RtR>0Â:RRtR>0Ã:R32#"&'##526=##526=¼/B//Bý—/B//Bª L2:RR:2L ½R:!// L2:RR:2L /R:!/^R:!/ŽB//B//B//B/n0>RtR>0Â:RRtR>0Ã:RIa53#"&3!2#5264&#!#×B9901%3#3!535#535#"'#"&5332653326=#"'#"&5332653326=#"'#"&533265332653–›››þŽ›››&AhhPS32#"&'##526=##526=##"&4632¼/B//Bý—/B//BÒ L2:RR:2L /R:!/^R:!/# L2:RR:2L ŽB//B//B//B/20>RtR>0Ã:RRtR>0F§Ù?GO².+°$3´/+°%2²+°3´+°2´7K. +°B3´7+°2´?4. +±)33´?+± 22´32#"&'##526=##526=##"&4632$264&"264&"ŠR:!/aR:!// L2:RR:2L /R:!/aR:!// L2:RR:2L p/B//Býˆ/B//B‹Â:RRtR>0Ã:RRtR>0B//B//B//B/FÙÙ;²+² +´+°/°Ö´+±+±°9±² 999014&#" 632'6/!"¢áþþþõ¤(;23#"&5467&'!#26'3."´EfEEf³4 e†e 44 G&.i–i.&G (ìBZBäêAXA~JJ~Jª23#3#"&'#5367&'!#26'3."#26'3."F4 e†e 44 GF 44 e†e 44 FG (ìBZBäêAXAâêAXAãìBXBø75#"'#"5325325373265 ŠOOŽ%N.1,E Eƒ<Ž<Ž>謬¬¬þ¸;Ÿ;&"-6eMFøÙ|²+´+²+´+´ +´*+´ +´+´  +´ *+°/°Ö´+°2² +³@ +±22°±+°2±é° 2±+01$462"462"7!!!!!!((((ÜþŠvþŠvþN²²((j((¹þî=þî<ÙFÿô Ù1<ó²+´9+²&+±*.33´ & +°3´*+°2´)$& +° 3´)+°,2°=/°&Ö´'+°'± +± é° ±*+´++³6+*+´+°/´6+°+±<+±.22´+°/2°±+±é°2±>+± °$9±+6°"9°<² 9999±°19±9±699° ±299°$³01$9°)°9°&°"901462"$462"%#"54>75#"'#"5325325373265>((þ0((úŠOOŽ%N.1,E Eƒ<Ž<Ž>謬¬¬þ¸;Ÿ;&"-6eMF®Ù!ƒ²+´+²+´ +´ +´+°"/°Ö°2´+° 2°±+´+±#+±µ$9°°!9±±99°°9° ±99°°!901264&"&"32"&5467.54632‚EfEEf† fEE3Jji–i.&'-iKI3~JJ~J,#J~JtRSrrS5XX5Sr6FÿRÙ7ß²+´++² +³@ +²*+´+²5+´ +°/´ ++²  +³@  +´$5 +´$+°8/°,Ö°22´+°!2³,+´+°/´+°±+´'+³'+´+±9+±±99°µ$)*/5$9°² 7999±±',99°$°/9° ±299°5°7901"#43232>53#"&264&"&"32"&5467.54632®2² +³@ / +°±;é°;/°±1+´,+°,±+°22´(+²( +³@(. +°±7é°(± +´+±C+± ;±32"&547&#"632"&547&#"3!53ð<‘15"0"&JŠKA5"0"&AKªþpª† . *!//!>³1 *!//!<þ×<<FîÙ?²=+´>+°:2²+´#+´ = +°3´ *+±&22´(7= +´(+²7( +³71 +³=+°@/° Ö± é° ±?+´:+°%2²:? +³@:< +²?: +³@?= +°:±+´+³.+´3+°3/´.+³+±é±A+±3:±(799°³#15$9°.²!0999°°9±±99±7´ 9$9±#²%99901462"$462">32"&547&#"632"&547&#"3!53Ž((ýº((p<‘15"0"&JŠKA5"0"&AKªþpªf&&&&= . *!//!>³1 *!//!<þ×<<F•Ù7ã²1+´2+°.2²+´+´561 +°*3´5+°,2´'1 +´+³ 1+°8/°3Ö°2´.+±)22².3 +³@.0 +°+2²3. +³@31 +°52°.±+´ +³ +´#+°#/´+±9+±#.±'99°³!%$9°²  999° ° 9±'6± 99°°9± ² 99901>32"&547&#"632"&547&#"3#3!535#53á<‘15"0"&JŠKA5"0"&AK›››þŽ›››† . *!//!>³1 *!//!<±<<<<<<FßÙ7?G!²+´+°2²+´!+´  +°3´ +°2´CG +°>3´C*+±$:22´&5 +´&+²5& +³5/ +³+°H/°AÖ±Eé°E± +° 2´+±#22² +³@ +°2²  +³@  +° 2°±+´+³,+´1+°1/´,+³9+±=é±I+±1±&599°³!/3$9°,².999°9°9±=±:?99±5G´7932"&547&#"632"&547&#"$462"$462"›››þŽ›››<‘15"0"&JŠKA5"0"&AKb&&ý¹&&´<<<<<<Ò . *!//!>³1 *!//!<&&&&FÙ#,5½²+´+°2²+´$+´  +°3´*+°2´. +´+´%- +´%+°6/° Ö± é° ±+´+±$-22² +³@ +² +³@ +°±+±é°2°±1+°(2´!+°2±7+±-.°!9°%°9°$°901$462"$462"73!53322654.2654.k&&þÅ&&ªþpª<€l$*+#m`P381`P38ˆ((((½í<<4F*) '*G5t~( º~( FÙ%)«²$+´%+±!&22²+´(+° 2´ $ +´ +´ $ +´ +°*/°Ö´)+²) +³@$ +°)±&+´!+± 22²!& +³@!# +°!±+° 2´+°2±++±!°9±°9° °9°(°9012654.'2654.32#3!5!#¤`P381`P38å´€l$*+#mªýø"<ã~( º~( ýŸ4F*) '*G5í<<aýŸFÙ!59в4+´5+±1622²#+´8+°2´4# +°3´*+° 2´0 4# +´0+´4# +´+°:/°Ö±é°±"+´9+²"9 +³@"4 +°9±6+´1+±22²16 +³@13 +°1±+±é°*2°± +°2´-+°'2±;+± °-9°°*9°8°'9016462"2654.'2654.462"32#3!5!#Q&&6`P381`P38&&þð´€l$*+#mªýø"<ˆ((w~( º~( ýë((04F*) '*G5í<<aýŸF®Ù-5ݲ&+´+²+´5+´& +´*+´1& +´+´ & +´ *+°6/°(Ö°2´+°.2°±+°2±é° 2°±+°22´#+°2±7+±¶&+05$9±¶ %14$9±±99°±#(99°±99°1± +99°±/299° ±99°5±.399016462"462"264&"'462"&5467.6264&"Ê((((dEfEEfi–i-'&.i–i.&'-54.#">32'>54.#"6!2'>54.#"‚<š:Í00+&D, }ÃXEË5Í00+&D, <×2™ÿÍ00+&D, }ÃWƒ';*((-=»%4ƒ';*((>/ØWƒ';*((-Fe:7?G²?+²)F333´;*+°B2°5/±-133´+±$22²5 +³@ +°'2°/°3´*+° 2°H/°Ö´+°2°±9+°2±=é°2³=9+´+°/´+°=±A+°2±Eé° 2³!EA+´ +° /´!+°E±*+°&2´)+±I+±9±599±@ 3:;>?$9±A=±199±! @  /BCFG$9±*E±$-99±5±+799°µ &/3$901462"$462"#3326533265332753#5#"'#"'#"'462"$462" ((((þ<<<98=8898=89&<<"]1-dc-1]Š((((ö((((þ&Û÷ eLLeeLLeêþ%ª ____‡((((F3<Ñ'°°'/°3´#*+°2³#'+´+°/´ +°/´*+°(/°!Ö±%é°%± +´+°±+±é°±+´ +° ±+±é±)+±³ $9±³ $9±· !$%$9±#µ $901264&"462"462"462"$462"&\~\\~˜{¸{{¸,&&.((ýN((_~\\~\÷¸{{¸{E&&ýß&&&&FNÙ|²+´+²+´+´  +´+´ +´+°/°Ö±22´ +° ± +´+±22±+± ³$9± ³$9015!5!264&"462"Fýøþ*{®{{®­˜Ø˜˜Ø<<ýc<<Ä®{{®{þÂØ˜˜Ø˜F3Ù?L²=+°3´+²= +³@ +²+° 3´0+°@/°Ö°2´+±222°±+° 2´+° 2°±-+°2´,+°!2°,±+±$(22´:+°&2±A+°6ºíOÂÊ+ °°À±4ù°7ÀºòÁˆ+ °°À±5ù±47°7À°³+°³+°4³547+ºïÝÂ+ ³647+±47°5³657+·4567........·4567........°@±-³0=$9±=³?$9°0¶ $':$9°³"%&$9013#5&'#35332654.546325353#5&'#5&#"#"'Þ< << <.MQM0L\]L0b_FJ< <<<@L‰0L\]L0llO..2o!t¨PE,8$I6Wh7 2ÿmt¡&„)4&L8_oFLÙo²+²%hn333´++°[2³"+°k3´ ++°U2²8+°J3´1+°C2²18 +³@15 +°F2´=8 +´=+°p/°5Ö°'2´4+°4±.+´;+°;±G+°2´F+°F±@+´M+±q+±45°%9°.¶"+ 8$9°;²=999°G²999°F°n9°@@ >JRS[hk$9°M°e9±"³'c$9± ³ RS$9°¶+ab$9±1=².;M99901%4>7!63232>7#"&#"#"547>54&#"#4632!654&#"#463263232>7#"&#"#"ÝGv%þ§3$<"    &3f qE=C4*=NeZC4*=NeA(W"    &3f f¢@!Q2T   N 88 ›e,;VJ!:myT):<';VJ!:myT"Ul>x   N 88FkÙ&.7@®²+°3´++°32²+°"3´<+°A/°Ö´)+°)±.+°!2´+°#2°±+°2´1+°?2°1±6+°:2´+°2±B+±.)°9±1°%9°6·8<$9°° 9±<+@ !$'/8$90143267#"&547'#"&54737&3265732654'654#"hu7Br%J" (u7Br&"Yu7B²<\(pv=ýV=QV=3¦\MXE0 < DK¦\MWG0! ¦\MnQqþ¨$B¼+±:6²3999°°09° °.9°°,9°°*9°°(9°#°&9±.8°9°µ$(,069$9°<´5:$90164623265332>533273#5#"'#"'#"'#"264&"F’Ð’/= = &<<"KNMK!"„ShVožoož’Ð’’hIh"*484**48þ ª 6666MbIžoožoFÊÙx² +°3´ +°2²+°3´+°2°/° Ö´+°2² +³@ +°2²  +³@ +°2±+± °9°@ $9°°9017'7%3!53#5!#%'7'9>4›4?þÅ}þÊ}}6};?4›4>l®lþôl°þ<<a<<þ°lþôlF€Ù7@IR[Ò²+°23´<+°N2²+°#3´E+°W2°\/° Ö°2´:+°H2°:±?+°C2´+°2°±5+°!2´L+°Z2°L±Q+°U2´0+°&2±]+±: °9°?·  AE$9°±99±L5±99°Q·#)2(7SW$9°0°.9±E<@ !&058AJS$901#"&547'567&5432>7&543267#"&54732654'654#"32654'654#"Ä'h(u7Br&H'(u7Br%%i(u7Br%J" (u7BrýV=QV=nV=QV=w' DK¦\MWG0 < BL¦\MXE0& BL¦\MXE0 < DK¦\MWG.5;m)A;ß5;m)A;ß5;m)A;ß5;m)A;FÙGPYbk(²+°B3´L+°^2²&+°33´U+°g2´ & +°3´ *+°2°l/° Ö± é° ±+°$2´J+°X2°J±O+°S2´+°)2°±E+°12´\+°j2°\±a+°e2´@+°62°@±+±é±m+± ± 99°J°"9°O·&+,QU$9°±99±\E±./99°a·39B8Gcg$9°@°>9°±;<99±L·>@EHZ$9° @  +,.87&543267#"&54732654'654#"32654'654#"0((üú((ê'h(u7Br&H'(u7Br%%i(u7Br%J" (u7BrýV=QV=nV=QV=X((&&:' DK¦\MWG0 < BL¦\MXE0& BL¦\MXE0 < DK¦\MWG.5;m)A;ß5;m)A;ß5;m)A;ß5;m)A;FzÙ9Ú² +´5+²5 +³@59 +²+°"3´+°*2² +³@ +°%2°:/°Ö´+°±+´+°±+´2+°2±+´.+°.±7+´ +° ±& +´%+±;+±±99°°9°2³ $9°² ,4999°.²"*5999°7° 9±5²999°° 9012654'"&=.547&#"#4632632#4.#"26=3=:=X\6EpE4D^'-!( 32#"&'$264&"264&"[ L2:RR:2L ì L2:RR:2L þ;/B//BÏ/B//BO0>RtR>00>RtR>0?B//B//B//B/F\ù'/7º°/°3´*+° 2°/°$3´++°22°/´+°//°63´+°2°8/°Ö´)+°)±+±é°± +± é° ±5+´"+±9+±)²,999°±99± ±'99°5²$0999±+µ"),14$9±/µ!(-05$901$462"6462"'#"&46323>32#"&'$264&"264&"5&&»&&Ï L2:RR:2L ì L2:RR:2L þ;/B//BÏ/B//Bž&&&&Î0>RtR>00>RtR>0?B//B//B//B/F®\,'/7ذ/°$3´++°22°+° Ö´*+°/´+°//°63´+°2° Ö´*+°8/°Ö´)+°)± +°2± é°2° ±5+´"+±9+± )´,$9±5 ´$'0$9±± 99° ± 99±+µ"),14$9±/µ!(-05$9±±99°±9901462"462"'#"&46323>32#"&'$264&"264&"¡&&&&c L2:RR:2L ì L2:RR:2L þ;/B//BÏ/B//Bè((þþ((¡0>RtR>00>RtR>0?B//B//B//B/FËÙ H²+²+° /°Ö´+°± +´+± +± ³ $9±³ $901'%%XÖ þ¸=Hþí×f{þ¯¸þ¸G¶Hý¸á{RFËÙ²+²+´ +´*+°2´  +´ *+°2°/°Ö´+°±+±22±é± 22°±+´+±+±³ $9±°9±µ$9° °901$462"462"'%%Y&&((Ö þ¸=Hþí׬((v((„{þ¯¸þ¸G¶Hý¸á{RFÿÿçâ/}²+° 3²+´,+´  +´+°0/°Ö´+°±+°)2´+°"2±1+±°9°· %&$9±² 999±,´"%/$9017>32'>54&">32'>54&#"‚1?oxATyQ*+"HVv|qMY K3ZOk5TyQ*+"HV;eÈk{+0F"eN8H *6)4C)J;Oé C+?%eN8H *6)4Cp]Fÿÿçâ/–²+° 3²!+´.+´ ! +´+°0/°Ö´+°±+´+°±+°+2´ +°$2±1+±°9°°9±¶ !'($9±´ $9±.¶$'$9017632'>54&">32'>54&#"¾<<<‘TyQ*+"HVv|qMY K3ZOk5TyQ*+"HV;… 2þ¢3Šþ£ceN8H *6)4C)J;Oé C+?%eN8H *6)4CF…Ù +5ز +´1+²+´+²+°"3²+²+´  +±&,33´+± 22² +³@ +°$2°6/°Ö´+°2°± +°2´/+°2°/±4+°2´)+°2°)±%+°!2´$+±7+±/ ±99°4± 99°)± '99±1± )99±±99°±9901"3264&"&547##33&54632353#5#"3264&å3EE34EE4Ki3â<<á2iKLi2á<<â3iL3EE34EEJ~JJ~JýcrSP:ZŽ8QSrrSQ8Žþ¦:PSrNJ~JJ~JF…Ù)KU²*+´Q+²;+´ +²+²3B333´*+°2²8+²>+´ * +°3´*+²1D222´50* +±FL33´5+±%@22°V/°2Ö´1+°42°1± +°2± é°2° ±-+°82´O+°"2°O±T+°'2´I+°>2°I±+°2±é°2°±E+°A2´D+±W+±O-±/699°T±*;99°I±@G99±Q±OS99° ³-INT$9±±#'99° ±"(9901462"462"462"462""3264&"&547##33&54632353#5#"3264&¨((((ÿ&&&&û3EE34EE4Ki3â<<á2iKLi2á<<â3iL3EE34EEÖ&&Ý&&&&Ý&&ÞJ~JJ~JýcrSP:ZŽ8QSrrSQ8Žþ¦:PSrNJ~JJ~JF‹Ù-39?E²&+´>+²+´8+´)& +±@33´)+±":22²) +³@)+ +° 2²) +³@, +°2´D2& +´D+´ & +±.33´ +±422² +³@ +°2²  +³@ +°2°F/°+Ö°2´*+² 222°*±(+² 222´;+²/4@222°;±:+².5A222´#+²222°#±!+²222´ +°2±G+±:;@ %&12CD$9±2D±99017367&'##33>2353#5#353#5#"&'##3%#26'3."#26'3."ƒ4 FG 5<<5 e†e 4<<4 GF 4<<4 e†e 4<<\ìBZBäêAXAâêAXAãìBXBâ[/2ZddH]]HdþüdZ2/[dþüdH^^Hd²3::o188þA199m2::FÛÙ=CIOUh²6+´N+²+´H+´96 +±,P33´9+±2J22²9 +³@9; +°02²9 +³@< +°.2´6 +°3´*+° 2³T+´B+´6 +±'>33´+±!D22² +³@ +°%2² +³@ +°#2°V/°;Ö°2´:+²222°:±8+²222´K+²?DP222³K8+±é°/±é°K±J+²>EQ222´3+²!(,222³ 3J+± é°3±1+²"&-222´0+°$2±W+±8±99±JK@ *56ABST$9± 3± 99±BT@  *$901462"$462"367&'##533>2353#5#353#5#"&'##53%#26'3."#26'3."Ž((Š((þ3\ FG ]<<] e†e \<<\ GF \<<\ e†e \<<„ìBZBäêAXAâêAXAãìBXBZ&&&&[[/2ZPðdH]]HdðPZ2/[PðdH^^HdðÆ3::o188þA199m2::FÙ K²+²+°3° /° Ö´ +° ±+´+°±+´+± +±² 99901#3#3#A<¿<<þ‚<<Yþ§Y€þ¨Xþ¨FÿRÙ!£²+´++² +³@ +²+²+°3°/´ ++²  +³@  +°"/°!Ö´ +° Ö´+° ±+´+°±+´+° Ö´+±#+± ±99±± 99±² 99901"#43232>53#"&#3#3#®5332653#"'#&'#"&5332653ô<-&<2?<55332653#"'#&'#"&5332653((ý§&&<-&<2?<5 +²%,E222´ 6 +°3´ *+°2°J/°>Ö´?+°?±+°2±é° 2°±E+´F+°F±6+° 2´5+°!2°5±%+´&+°&±+°2±é°2°±,+´-+±K+±±;B99±FE°99±&%°29±±)099±B;°89°±299901462"$462"462"$462"3>5332653#"'#&'#"&5332653((ý§&& ((ý§&&<-&<2?<52°O±+´+°±+°2´+°2² +³@ +°2² +³@ +°2°±"+´#+°#±C+°22±Gé°62°G±)+´*+±S+±OK± 99±°9±#"°/9±GC±-&99± °9°A±/9901%3!535&'#"&5332653#5!#>5332653#"'6462"$462"462"$462"0›þŽ›]wSZ<532#!12bej)u+=HODCQQCDOH=+u)jeb2YO=DEJ?T0-u'&'&-&'&'u-0T?JED<<FÏÙA ²+´%+²8+´2+² +´*+³> +´,+´ +´*+³+´++´? +´?+°?³?+´*+°B/°+Ö´+°>2°±(+°/2´+°;2²( +³@A +°±+°2±é° 2°±+±é±C+±+³%28$9±%³"#($9±+³$9±?³$9±,>³ $9±2 ³/45;$901$462"462"462"%2#"&'732654&#2654&#"'>32#!Ý&&&&u&&þ¥2bej)u+=HODCQQCDOH=+u)jeb2Ø((((d((=DEJ?T0-u'&'&-&'&'u-0T?JED<<FÙ=ð²+´+²0+´*+²+°93´*+³6+´$+´  +´*+°;2³ +´#+´7 +´7+°>/°#Ö´+°62°± +°'2´+°32°± +°2± é°2° ±<+°82´;+±?+±#³*0$9±³ $9±#³ $9±$6³$9±*³',-3$901462"462"'2#"&'732654&#2654&#"'>32#!53#5Ë&&&&·2bej)u+=HODCQQCDOH=+u)jeb2 <<Ö&&Ý&&=DEJ?T0-u'&'&-&'&'u-0T?JED<Žþ¦F‹Ù-»²+´ +² +´+´ +´+´' +´'+²' +³@, +²' +³@') +´& +´+°./°Ö´+°&2°±+°2´+°#2°±,+°(2´++±/+±³  $9± ²  999±²#999012#"&'732654&#2654&#"'>32#!3#12bej)u+=HODCQQCDOH=+u)jeb2<<O=DEJ?T0-u'&'&-&'&'u-0T?JED<ý¥F¾Ù%•²+´+°2² +±33´ +°#3´+°2°&/° Ö´ +° ±+°2´+°2² +³@ +² +³@ +°±+´ +±'+± °9±°#9± ±%9901%3!53#"&532>532>53#"' ›þŽ›+FTY< -:- < -:- 532>53#"'á&&þÅ&&À›þŽ›+FTY< -:- < -:- 532>53#"'YþR6&&þÅ&&À¹þR¹+FTY< -:- < -:- 532>53#"'3# ›þŽ›œœ+FTY< -:- < -:- 532>53#"'353#5È<<œ+FTY< -:- < -:- 532>53#"'!!#"&535#35#'35335‚ -:- < -:- 32#".543264&#"J9:!Dƒ<Žè¬¬¬§÷‹:&IWuKYw7[8W´%)afQtF¹X! °/´+°/´+°/± +0175!5!Fýî¹<<,<<FÃ|²+°3°/±+013# #ßI›EzyE|þ„,þÔFº`,²+° 3°/° 3´+°2°/±+±°901753'773#''7F†C4CC4C††C4CC4C’?B$9°9³<=@A$901%254&#""&54632#"'#5'#5&#"327&5462#"&546325353j‚-(,/B/_A@Q]aml<<>d(Œ´L€"(*!//!5QO7Qk>>d(Œ´LFæÙ_².+°3´+±!22²J+´+´5D.J +±OQ33´5+°^2°`/°;Ö´@+°@±2+°F2´+°±#+´(+°(±+´+°L2°±+´ +³X +´S+°S/´X+±a+±@;°B9°2±5D99±#³.I$9°(²!J999±S±O^99°³QV$9°X°9° ° 9±.°,9°5· %(2$9°D²3\999°µ;=FMUX$901327&5462#"&/4&"327&5462#"&/5#".54623275462327&5462#"dN&"0"51ˆ+,{®{N&"0"51ˆ+,?35"0"&2@˜Ø˜@2&"0"53 B!//!* *‚W{{Wþ©B!//!* *Ë" *!//!)tl˜˜lt)!//!* F¾Ù&3¸²+°3²&+± 33²$+²/3333´+° 2°4/°Ö°&2´ +°2° ±#+´'+°'±*+°2´++°2°+±.+´+°±+° 2´+°2±5+±'#±99±+*±199±.± 99±$±'99±&°19013265332653>53#"'#"&53&5>53&'‚553#"'>謬¬¬þU, $FÂÙ0ʲ+°3² +° 3± À/±33´"+± /22²" +³@" +´) +´)+°1/°Ö´+°±&+´+°±+´++°+±+° 2´+° 2°±+° 2´+±2+±&±"99°°(9°²$-999°+°)9±"°9°²&+99901%654&"333#5##5#"'#"&53327&5462;`2(à<<<<<<"N>>N=Q< (!6-E9j9E-6"ÕJzIaaIzºý­Sý'JJJ33`J+1"]”k{{k”]"F Ù{²+´+²+´+´ +´*+´ +´*+´  +´ *+° /°Ö´+°±+±22±é± 22°±+´+±!+01$462"462"462"!!!&&&&&&þ&Úþbb¦&&…&&—&&þÃÙ<ýŸaFŠÙ Z² +°3²+°3³ +°/°Ö´ +° ±+´+±+± ° 9°±99± ± 99°°901573#%3#'5NÚÚ<<þÒ<<Ú”€Fý'E”ý'FF@é2²0+´1+°-2²+´+°2´*0 +´+³0+³0+°3/°Ö±2+°2´-+±22²-2 +³@-/ +²2- +³@20 +°-±+´ +³! +´&+°&/´!+±4+°6°&±.ɱ.ɰ6º½Â:+ °°À°.°@±&-±*99°³$($9°!²#999° °9±*1±!#99°°9±² 999°°901'%632"&547&#"632"&547&#"3!53ŒþÊ‚ƒQ5"0"&JŠKA5"0"&AKªþpª›T:hG7 *!//!>oD1 *!//!<þ×<<F·Ù’²+´+°2²+´+°2´  +´ +´ +´+°/°Ö´+°2² +³@ +°2² +³@ +°2°±+´ +² +³@ +±+± ± 9901#5!#!2#5264&#!3!53á›r›:RR:!//!þò›þŽ›<<ôRtR/±"33´=+±!22°T/°;Ö´A+°A±+´%+±8=22³I%+±Eé°E/°L3±Ié°P2°%±+´ +±!22²  +³@ +°2³- +±)é°)/°03±-é°42° ± +°2±é°2±U+±E³GJOR$9±)³+.36$9±>Cµ:;$901%"&463"3462"462""&463"3462"462""&463"3462"462"R|°°|cc†((((†|°°|cc†((((†|°°|cc†((((A¯ú¯<Ƨ&&#((ý¯ú¯<Ƨ&&#((ý¯ú¯<Ƨ&&#((FÿôºÙª² +´+²+±33´  +´+´  +°3´+°2° /°Ö´+°±+´+°± +°2´+°2°±+´+±!+±°9°°9° °9±± 99±° 9°°901!267"&=#"'#"53253253!~þ˜h˜h<‰Î‰,E Eƒ<Ž<Ž<¤h€€h†žž†ñ>>謬¬¬þ{F™Ù <²+²+´+°2° /° Ö´+± +± °9±± 9901!!##PþöSþö´´<··Ùý'þðþF Ù%Ÿ²+´+°2² +´+°2´  +°3´ +°2°&/°Ö´+°2² +³@ +² +³@ +°±$+´+°±+´ +±'+±$°9°°9°°9± °9°°901#32>%!#"&'#"'3!5332>5d~( þŒ°4F*) '*'ªþpª<( `P38m<€l$*+#þ{<<a`P381FêÙ'ò+²+±!33´ +´*+´&# +´&+´  +´ *+´ +°3´+°2°(/°Ö´+°±+´+°±+°!2´'+°"2²' +³@'% +°'±+°2±é° 2±)+±°9°°9°°9±°9°°901$462"462"#"'#"532532533#n((((°,E Eƒ<Ž<Ž<ÔÔ„((((þ˜ >>謬¬¬þ]<úF…å7̲$+´#+²2+´+´$2 +´+´ $2 +´+°8/°/Ö´+°±'+°+2´+°2°±+´4+°#2°4± +´+±9+±'²1999°°)9°µ2$9± 4³ $9±±'99° ³)$9±´,/47$9014&"2264&#"'632#"'3"&547&=.5462"/B//Bò7//7‹@AkVIWa?“T1+J`##0>RtR>08B//B/þ·=:=X\æ**^TCDQ^'-!( 3232>7#"&#"#"5.5462Q&&&&þöRtRRtXH"    &3f Iav¤vaIÚ((((™tRRtRý­    N 88H qJSuuSJq F¼æ$µ²+°/´+³+´+°/´+°/´"+°%/° Ö´+°±+´+°2°± +°2´+°±+°2´+° 2±&+±±"99±° 9±°9°° 9±³ $9±² 99901264&"%2#524#524##"&4632ÔtRRtRRè>>¬<¬¬¬¬ qJRvvRJq’RtRRtXƒE Eqn¨Ž<ŽIav¤vaF:Ù‚² +°3²+°3´   +°3´ +°2² +³@ +³ +°/° Ö´+°± +°2´ +±22° ±+°2´+±+± °9±°901333####3'3"< << <Ü<ÜÜ àslý'1þÏ1¨€FþÙF Ùu²+°3²+´ +´+³+°/°Ö´+°2°±+´ +² +³@ +±+±°9°±99±± 99±°9013'>325654&#"#F<ÜÜ)u4Mlw_šI4DŽ<Ù€Fþc3232632"&5467#RtRRtXH"&   &3f Iau¦uaIŽtRRtRT  N 88þ¸ qJRvvRJq F®œ/»²!+´+²)+°3´-!) +´-+°/°3´ *+°2°0/°)Ö±#22´*+°2± é°*±/+°2´+±22°±é°/±1+±*)± 99° ² &999°· !,-$9°/²999°±99±±#99°-±&9901462"$462"264&"7"&5467.53265N((þÜ(( EfEEfç-'&.i–i.&'-54'#"&546326©/B//BòŠA@‹7//,0>RtR>0##`J+1T“?aWIVzB//B/þ\X=:=æ* L2:RR:2L *IC@L=Q< (!-'^QDCT^*F1Ø5=µ²*+°3°"/´ +°8/°3´4+°2°>/°2Ö´<+°<±/+°62´%+°2°%±+° 2´+°2°±+´+±?+±<2°*9°/²)-4999±%° 9±³$9±"*³,-$9° ±099°8³26$901654.#"3276327#.=#"'#'76=&5432&#"Ð Iù<+-ƒdÀhÞàH) 1%$1<HàÞhÀdƒ* I ãD!+ Áþ£o!!}Ó€3 ]Yv0MÂ;:3€Ó}!!o£õ¸ +!EFÿþêå!œ² +´+² +³@ +²+´!+´  +°3´+°"/°Ö´+°± +´+°±+´+° Ö´+±#+± ²!999±´  $9°° 9±!±9901%26=3"&=.5462264&",!@!75#".=3;.54>;#"{10_XPWOAQVT) !!ARX$*,: w9B-=é°>±+´(<+°(±F+°02±/é°/±$+±é° 2°±+±é°´&+°/±H+±>±8A99°(°9°F°E9°/°+9±°9±A0°19°²999±&<²+999014.54>3!!!32=3#5#".5#"#5#"&'332>7u+3+-,Qþ¯/=ŠWO:k$9% µ6**T) !!AQX$*,: ´6&@&$þûBÕDG«aþ³JU'!1Ü%&+9þO8G6™þ-+2*Aÿ8Ñè@º²*+±/33²2+±;é²+°63±é² +³@ +° /´ ++°A/°5Ö±8é°8±+´"<+°"±@+°*2±)é°)±+±é° 2°±+±é±B+±8±2;99°"°9°@°?9°)°%9±°9±;*°+9±° 9° ²%999014.54>3!632#4&'"##"#5#"&'332>7u+3+-,>]dOX49*-X¶6**T) !!AQX$*,: ´6&@&$þãGhaþ·I?>"H3þl%&+9þO8G6™þ-+2*Aÿ8ÌÌ4<À²+° 3±#é² +´C+²8+±33±*é°2°/´+°;/±2é°=/°Ö°-2±!é´5+°!±+±(922±é°32² +³@ +°±+±é°±+± é° ´ 1+° /±>+±!°9±° 9±#°9°*± 99±;8°-9013273#5#"&5#3#".=332>=#"&54>;%;5#"œ10_XPWOAQ\V®=_6I%Xn*-’eX%O;êþ–C=’’€ þˆ0%‡FýôS]F4Dý¼8 E;C.¸¸~"H3ÂO;,-À2hAÿ8§èFز0+°3²+°83±é°A2² +³@$ +² +±<33±"é°&/´ ++°G/°;Ö±>é°>±+´(<+°(±F+°02±/é°/±$+±#é° 2°#± +±é°±+±é°´&+°/±H+±>±8A99°(°9°F°E9°/°+9±°9±0°19°"°9±& ²+999014.54>;3253#5#".5'###"#5#"&'332>7u+3+-,ïï+@ŠXO9l1D$–Xž6**T) !!AQX$*,: ´6&@&$Üþ¾BF«"ýóJV%D7-àý}l%&+9þO8G6™þ-+2*ÿÿ:“‘X&øÛÿ5”2- F²+´7+² +³@ +°2° /° Ö´ +° ±+´+±+± °901273#"&'3–J GRC@OG*ÛRIPPI%-ÿÿ8•WX'Þÿ %X^² +±é±22² +³@ +±22°/°Ö±é±+°6ºÂ$ï—+ °.°.°± ù°± ù³....°@01%>53+533"4fW,?L:ꥋZNT<vþŠ3R0! L :@X3² +°3°/° Ö± é° ±+±é±+± ³$901##=47'3>7538¹Á}þrAZW¸ÀzFVW¿“{±p"zGžx±þ)qA––&X:²+²+°3±é°/°Ö±é² +³@ +² +³@ +± +01#!5!ÆWý·ó ýô LL?4X :² +°3² +± é°/° Ö° 2±é°±+±é±+± ° 901#.'!53:{lWAZþ WXamþ†tQ: Lý¨wþ‰9ÿÿþX%²+±é²+±é°/°Ö± é±+014&#!5!2#!5!265§|Tþb¤x©¨yþ\žWysBWL…Yœ[ƒLVC%íT²+² +±é² +³@ +°/° ֱ鰱+±é°± +±é±+± ±99± °901!#467>=!53!öW$C;6 ýaWŸ>MWS`12!/ Há•™1P+7.H?5X 0²+± é² +±é°/°Ö± é° ±+±é±+012!4&#!‹˜ý Ÿo]þ„Xƒ[þ†Xýô+7^þ@%éX ,²+² +± é° /°Ö±é² +³@ +± +01#.'!5î{mWAZþ>Xamþ†tQ: L#uXA²+°3± é² +°3±é°/° Ö±é²  +³@  +°±+±é±+014&#!#525#5!2#[Pþux–<ýoŒWtESþ¿gdLzFL}aþ†2ÅÚD°/´7+°2² +³@ +°/°Ö´+² +³@ +² +³@ +± +01!5353þÏF FFÏÏÿÿ<ÐÇ&èÿÿ<ÐÇ&éÿÿ<ÐÇ'ãÔÿ&èÿÿ<ÐÇ&é&ãÔÿÿÿ:ÿ}FX&Þïÿÿ:ÿFX&ßïÿÿ:FX'ãÿôÿmïÿÿ:6X&ðãõÿÿ±X&ñãµÿÿ&X&òãÿÿ?:X&óã1ÿÿ!åX&ôPãÿAÿÿ<X&õãÿ=ÿÿ=:X&÷ã5ÿÿ×X&øFãÿ'@ÿÿ&ÿ8ÚX&ùãùÿÿ9X&úãùÿÿ%!í&ûãýHÿÿ0:X&ýãCÿÿ3FX&ÿãÿuÿÿ=9X&ã/ÿÿ9ÿ8 X&ãMEÿÿ?X&ãZFÿÿ3X&ãžÀÿÿ>ÿ8&X&ã)ÿÿ%ïX&ãÿÿ<ÐX'ãÔÿžÿÿ#{X& ã‘ÿÿ>•Û'àÿBôÿÿ:6Û&æ0ðÿÿ9Û&úæÿÿ?Û&æ8HFí-²+°/°Ö± é° ± +±é±+± ±9901#53>=3>Q;”fþhWå):W¿D‚'ÒD©•þ»Z9–ÿÿ.ÿþË®/2!²Â/%:ÏÂ-7TÿÁq #0°/±é°$/°Ö´  +±%+± @   "$9014&#"34632354>#3 r]NVYD-:/8**H**HH!þP°¯íGS_\;A2)1''4,&-$'<þÀSu°¯þQ o¨°8°/° 3´+° 2² +³@ +°2² +³@ +°2°/±+017#3353!!#5#3&$uâ$ tmþ“&âoA}…}/ ÿf€  •²+°/°3´+² 222² +³@ +°2² +³@ +°2°!/° Ö´+²  +³@  +³@  +°±+´+² +³@ +³@ +±"+± °9°²999±°901!#5##3&'5!3#'353€þëi Lkg%QpÀæpB-'d#www m~%E!fþlC)þpkÿþ 1²+° /°Ö´+² +³@ +² +³@ +± +015!# F(ê ? þÿþæHE²+°/°Ö±22´+± 22² +³@ +± 22² +³@ +±22±+015&'535&'5333#5'5e#Be Eæ]`;`]!e¤#8¢!;W¢7¤X¡¡\ÿf\ '2°° /±33´-+´"($2² - +³@ +±22²- +³@- +±$/22³@- +°3/°Ö´-+²- +³@ +³@ +°-±(+´"+°"±+´+² +³@ +³@ +±4+±-° 9°(² 999±"²99901!#5##5##3&'5%3#&'353'353\þòlaV!K1: g&P d—¾P'j f¼pB,& b#ww[w3D m~'C\þ‚~O aþpllC)þpjÿe ƒB² +´ +² +³@  +°/´+² +³@ +°/´+°/±+01#3!!!!!‹OA~þ‚"L`~þ‚#Il~#YC("T b&'Ip%{|*d²+°/´)+° /°3´+°2²  +³@ +°2² +³@ +°2°&/´#+²#& +³@# +°+/±,+± °'901##5##33533!#3!!{Ñ   !yJ  dyZÑý‰þ£e%%h]þ£|]1  uH  kq fÊp|t-…'=²+°/°Ö°2´+° 2² +³@ +° 2² +³@ +°2±+01.'5!3#&'53w   fq g(S!tœ  !]¼[þ©WQ!ÿeSž"j°/°3´+°2² +³@ +°2² +³@ +°2³@ +°#/°Ö°2´ +°!2²  +³@ +°2² +³@ +°2±$+01673#&'!!567!#3!5'5!È&F aþð&Nþôbþú&E[u b/'Nþôiþç&EV&N eækXæ´ x²+²+´  +°3´+°2² +³@ +°2²  +³@  +°2°!/°Ö° 2´ +°2² +³@  +³@  +² +³@ +³@ +±"+0135##335&'5!3673#&'#Ë=k 6=X ;8)B\8øu 8nN6p)Lþóaúÿdò­:|°;/°Ö±22´+± 22°³ +´ +°/±33´ +± 22°±7+±#22´6+±+022²67 +³@63 +±(-22²76 +³@79 +±!&22±<+0175&'535&'5333#5&'5!5&'535&'5333#5'5e#Be Eæ]`]`]! Eq'>e!Dæ]`[`]!e{¤#8¢!;V¢ R¤X   <¤&5¢":W¢ R¤X  \Ý d²+²+´  +´+´ +´+² +³@ +² +³@ +´ +´+°/±+± ° 9°° 901%!#3!!!#3!!Ýþ¬#H\TüFWhþ˜[ ahþ˜õ#S cU &`g&ÿí?÷1²+°/°Ö´+² +³@ +² +³@ +±+015!#'7"%7"''4™ i'þ¾þð/å¾;`þñÙ aþ€€d¾<_þð¿¿þð- R²+± 33°/°Ö´+² +³@ +°± +´ +° ±+´+² +³@ +±+01#&'#'#&'5o(O&i%pp%#T eþQ bþllþ"GÿþÔ f²+² +° 3´ +´+² +³@ +°/°Ö´+² +³@ +² +³@ +±+±²999° ±9901#'5!#3!!Ô 8&u ýM K€þ€ê 1þkþö R&Ô>+²+°/´+°/±+±±99°°9017%37"''4¬9þþ)-—¼¾6eþïê@ªòXŒ$>¾þñ/ Jñ>° /±33´  +±22´  +³ +±33´+±22°/±+01%##5##533533533##4¤ ;£0*X£X¤Z¡¡ ;p Dd22å^`_`^!!C O…J° /´+²  +³@  +°/´+°/´+² +³@ +°/±+±±9901&'3!#3!!¸UX©'.—Ýþ54#%%hÌþ4‚Ë7éN¤ÿP“%¡4)|r-…†€0°/´ +°/°3´ +°2° /±!+±± 99017&'5!.'5!.'5!–g/Wˆ•$"!W†þì4W‰Ïd%(% % (& Ë3 ((‚ Cý0°/´+°/°Ö´+± +±°9±°9017%3¬Vþþ)-—õéòÿXŒ$t|0²+° /´+°/´+² +³@ +°/±+013!!!#$hËþ5ƒÊþ6% &|t-…†.%!B² +°3°/° Ö´ +² +³@ +° ±+´+² +³@ +±+01#'#&'5o%oq(S!hþƒ}kkþƒ}S  ¨2°/´+² +³@ +°2² +³@ +°2°/±+01%73#&'!#3k _þn&E `§tþôj&N hÿepK'0°(/°Ö°2´ +°2°±+°#2´ +° 2±)+01#3%#3#3#3#3µl(& €»j '& Ù9P(& ~â[/(& âf#(&|p'W‡™l*Wˆþ;\W‡\W@X †2j-X …ÿd—Å%.:^²+³ +´ +²+²+²:+´7 +°;/±<+±³+.$9°7@  !%&)*$9°:²#99901%'.'5!>7'67'67&'7"&#!567i>Ü þ)2#W …þD.ƒô‘ 0ÇtRü”ó‰,¶-"þ© ¶Ð1  (&}Ãó›,› é þwTñÂ.'%v› ²+°/±+01''7237'"#'677›{z|W£UWX \— X|„}z|W^!¢TX— ^V}   ,°/´+² +³@ +² +³@ +° /± +017#3!!! `€þ€&  h'&ÿd !f²+°/´+°/´+° /´+² +³@ +°"/°Ö´+² +³@ +² +³@ +±#+±² 999017#3!!!!!#5&'53‹N^~þ‚X d~þ‚#Il~OW"$@åaUg'Xj'&Iq%5Mmm$6ÿff8"{°/´+± 22² +³@ +² +³@ +°#/° Ö´"+² " +³@  +³@  +°"±+´+°±+´+² +³@ +±$+±" °901!#3.'5%&''foý£X!k %   RŸer)x&P iþ?X%r— %   ýÕ—b iþi˜s'Lþhÿdò{:A”°B/°!Ö±&+22´ +±3822° ³ +´$ +°$/±).33´ +±0522° ±+± 22´+±22² +³@ +±22² +³@ +± 22±C+±!$±<=99± °;9°°A901%#5'535&'535&'5333#5&'535&'535&'5333'5!ò]!ee'>e!Dæ]`[`þô]! Ee#Be Eæ]`]`—X‡cX  \¤&5¢":W¢ R¤X   <¤#8¢!;W¢ R¤O‰(&|,ÿþ9 1²+° /°Ö´+² +³@ +² +³@ +± +01#&'5!9S'Y êDþtŒC#†²+± 33°/°/´+² +³@ +° /°Ö´+² +³@ +°2°± +´ +° ±+´+² +³@ +°2±!+±±99±²99901#&'#'#&'57#3%!o(O&i%pp%#T! Z‘ýo eþQ bþllþ"G  a(c,,™² +°3°/°3´&+°+2²& +³@" +°2²& +³@&# +°(2°-/° Ö´ +² +³@ +°"2° ±+´+² +³@ +±.+± ±&99°´')$9°±+99± ±9901#'#&'5%##5##33533o%oq(S!`Ñ !y ! ! byZÑhþƒ}kkþƒ}S Žu    iq f`, •²+°3°/´+°/´+² +³@ +² +³@ +°!/°Ö´ +² +³@ +°2° ± +´+² +³@ +±"+± ±99±°9°°9°¶ $901&'5%#'##3!!%3ÂS!Y%or'U bþþòVþþ(.—}S Sþƒ}kkþƒ i'þßêòÿUŽ$ÿþ—|e²+°3°/´+°/´ +²  +³@ +°/°Ö´+² +³@ +² +³@ +±+±±99° ±99015!#73!!!# ^(¯$mËþ5ƒÊþ6L#&êSþýx-…†.N&ÿþ< I²+°/´+°/°Ö´+² +³@ +² +³@ +±+±°9°°9017%3'5!#¬Vþþ)-—^'õéòÿXŒ$õQþ  ² +°3°/´+² +³@ +² +³@ +°° Ö´+°!/° Ö´ +² +³@ +° ±+´+² +³@ +±"+± °9±°901#'#&'5%3#33'co%pq'VœUþþ),–[dûû)iþƒ}kkþƒ}T þíéòÿX‹%„l)) Ø,&.‚°/´+² +³@ +°/´+°' Ö´,+°/°3´ +°%2² +³@ +²  +³@ " +°2°//±0+±°(9°'²999±,°)9±°*901##5#!!!!#333533%3ØÒR!z& W€þ€lZ€þ€&E`z\ÒüÝVþþ'/—”R#u%  _&uc'&N iq hþËêóÿQ“$„b²+°3°/°3´+° 2°/°Ö´+² +³@ +°±+´+² +³@ +±+±±99°°901%'#%3737&'5%#'#ÙUë—Vþþ)-—ë),–xT!n%or'óéëéòÿXŒâX‹%ŠT fþƒ}kkþƒ˜,"ž² +°3°!/´+²! +³@! +²! +³@ +°/´+² +³@ +² +³@ +°#/° Ö´ +² +³@ +°2° ±+´+² +³@ +±$+± ±99±µ $901#'#&'57#3!!#33'o%oq(S! `€þ€!ÆZúú&hþƒ}kkþƒ}S  h' ýûa)%^!–²+²+´ +´+°° Ö°3´+°2² +³@ +² +³@ +°"/°Ö°2´+°2² +³@ +³@ +² +³@ +³@ +±#+±°9±³$901'#5##335&'5!373ÈUó8'=k 6=X ;8ó),–éäúøu 8nN6péX‹% C,'†²+°/´ +² +³@ +°/´+°° Ö´&+²& +³@& +°°# Ö´ +°/´+² +³@ +°(/±)+± °$9°&° 9±±9901!!!!!#3!#3373#/Bþ‚;.W€þ€l'C€þ€&E d~ûàZPï*,––VíR&”:9_&u'J'&N kþM aë[‰$êß&õ|",º²+²'333° /´+°/´+² +³@ +°-/°(Ö´'+²'( +³@'$ +²(' +³@(+ +°'±+´+² +³@ +² +³@! +°±+´+² +³@ +² +³@ +±.+±¶ &)$9°³$+$90133#7##5!#&#5'5'#&'5$lááƒßßP!&ç ;4(V9l'p$L$'Q|w.…†.S%í=/þVUføøk‡%Hþ‚~%DÁ r²+± 33°/´+² +³@ +² +³@ +° /°Ö´+² +³@ +°± +´ +° ±+´+² +³@ +±!+01#&'#'#&'5#33' O(O&i%pp%#TZdúú! %GþQ bþllþ"Gþfl( .{² +°3²+´+² +³@ +² +³@ +°/° Ö´ +² +³@ +°2° ±+´+² +³@ +±+± ±99± ±9901#'#&'57#3!!o%oq(S! `€þ€"hþƒ}kkþƒ}S  h'!ÿgÆ…'–² +°3° Ö´%+²% +³@ +²+´+² +³@ +´" +´"+°(/° Ö´ +² +³@ +° ±+´+² +³@ +±)+±¶ $9°±9901#'#&'5#33#3#3Æo&oq'VþÛN_úúZ_úú#Ilúiþƒ}kkþƒ}T ýØN)h'\h&&Iq%ÿBò†#+Ʋ+²+´+² +³@ +² +³@ +°/´!+²! +³@ +²! +³@! +´  +´+²  +³@ +° °) Ö´$+°,/°Ö´+² +³@ +² +³@ +±-+±²%999± $°&9±)³$9°²'999015!#3#'#'33##33%3å c'þH c  l<^úúRkúýáVþþ(.—êWþj&o(ég'ýÉT#}%:éòÿUŽ%#ÿþ™ z²+°3° /´+°/°Ö´+² +³@ +² +³@ +°±+´+² +³@ +² +³@ +±+±± 99± ° 9°° 9015!#%3%5!#Œ ^'þëVþý%1–ý¡^'êSþŒéòÿL—%÷Qþ.!.ز +°3²&+´)+²)& +³@)" +²&) +³@&# +´ # +´+² +³@ +² +³@ +³ #+´ # +´+°//° Ö´ +² +³@ +±"22° ±+´+² +³@ +±0+± µ&)$9°´ $9± ±99± °9±)±9901#/#'&'57!!#7#'73#'53!!p%oq(R"l~þ‚V ¦ bôô%ï a~þ‚!, xjííllííSÑL< GH¶F" ¶€ p²+°/´+² +³@ +°2°/´ +²  +³@ +°/°Ö´+² +³@ +² +³@ +±+±±99° ±99015!#&%3!!!#¨_'&ý $hËþ5ƒÊþ6L!&ðTþ%×r-„†/N#ÿþì Q²+°/°3´+° 2°/°Ö´+² +³@ +² +³@ +±+±±99°°901%'#-373%5!#UVè9Vþþ(.9è%1—ý ^(ñéééóþUŽãL—%ùSþ¯|L²+°/´+°/´+°/´ +²  +³@  +°/±+±°9±±9901%33#7##Vþþ%1–ýT$iááƒßß50&4êóÿN–$Hs.…†.73€!P°/´+² +³@! +°/°3´+° 2°/´+² +³@ +°"/±#+±±9901'#%373337##zVè9Vþþ'/9è++–,%jààƒÞÞ . &1êêêòÿQ“äZŠ#Or/„†0 . Y %¬°/´+² +³@ +³@ +±!22² +³@ +°&/°Ö°2´+² +³@ +² +³@ +°±"+´!+²!" +³@! +²"! +³@"$ +°!±+´+² +³@ +² +³@ +±'+±± #990175337&'5!#5#%5!#&#5'5# ^ö#T $L%ö¾ o(O@l&p¡ê ef"G%Hþ‚ðúeþQPføøkÿ϶L(ƒ²'+° /´ +² +³@  +°/´+°/´+² +³@ +°)/°$Ö´#+²#$ +³@# +²$# +³@$& +±*+±±99°±"%99±'² &999013'7##%3%#'5!0$háá yßß !  &ºVþþ(.ºþá]'u Lr/… |/ !  $éòÿUŽÖOþkÿCé‡#,¢²)+´,+²,) +³@,% +²), +³@)& +° /´+²  +³@ # +² +³@ +°/°3´+°2² +³@ +² +³@ +°° Ö´+²  +³@ +°-/±.+±² 999±),°901%#5#/'73533'33###'33#„”VöJ#I cJö(.”]úú)ý>jùùQ ^ùùvvéß&IkìUŽs e()f}%R%[ég(³ i²+°/°3´+° 2² +³@ +² +³@ +°/°Ö´+² +³@ +² +³@ +±+±°9°²99901%#5#%3533'#'5!N¹Vþþ(.¹]úú&þ~]'u }véòÿUŽr e(&#OþkÿAÏ…$-¼²+²!+´$+²$! +³@$ +²!$ +³@! +°*/´'+²*' +³@*- +²'* +³@'% +°/°3´+° 2² +³@ +³@ +°2² +³@ +°2°./°Ö°2´+² +³@ +² +³@ +±/+±'°9±$²99901#5'#375'5!3#'#'33#33##]'ö!J Zöt ‰f  l:_úú‰iúúQîOþá Uawk”l&p(éh'þk}%T#0&Ų+°3²+´ +°3´+°2² +³@ +² +³@" +°'/°Ö´ +² +³@ +° ±+°2´&+°2²& +³@&# +²& +³@ +°&± +´+² +³@ +³@ +±(+± ±99±&° 9±° 9±±%9901#7#5'#5&'57'##335&'5! äíp%oq(R"þtM]tX bM(®jííllííS®W fZNXZÿgÀ…!‚² +° Ö´+² +³@ +²+´ +² +³@ +´ +´+°"/° Ö´+² +³@ +²  +³@  +±#+± ³!$9°±9901#33#3#35!#N_úúZ_úú#Ilú* c'"N)h'\h&&Iq% WþG8>°/°3´ +± 22° ´+² +³@ +²  +³@  +°/±+017#37373#'#/# `’ð*,9è'/––Vè9Vð’!µ hé[‰äQ“#êêêá ÿŠ  "…²+°/´+² +³@ +°/´+² +³@ +² +³@ +°"/´ +² " +³@  +°#/°Ö± 22´+² +³@ +±$+±°9± "°9017#333'5!#5#'%3'# `÷%nÞu ^'ÜO!&÷8 yÜÞC h(vkSþQ$,0 | ÿAÄ…#¢²+²+´+² +³@ +² +³@ +°/´!+²! +³@ +²! +³@! +°/´ +²  +³@ +°$/°Ö´+² +³@ +² +³@ +±%+±!³$9± ³$901#'5!7#'#'33##33]'u ‰f  l;_úúNjúîOþk”l'p(éh'ýÉN)}%ÿþû &/².+°3°/°3´+°$2² +³@ +°2² +³@ +°!2°0/°.Ö´-+²-. +³@-* +².- +³@.' +°-±+°%2´+² +³@ +² +³@ +±1+±-°9015!#5##5##335335%5!#î ^'Ñ% !z  !\z ^Ñü  ^(êSþÍ$   t   frjkSþàF²+°/°3´+° 2°/´+² +³@ +°/±+±°9°± 9901%'#-373%#3!!wVè9Vþþ(.9è%1—þ `€þ€!ñéééóþUŽãL—%â h' û †² +°3°/´+² +³@ +°/´+² +³@ +°!/° Ö´ +² +³@ +° ±+´+² +³@ +°2±"+± ³$9± ±9901#5'#5&'53!!!!#p%oq(R"_þ 7l~þ‚V xjííllííS…G (L<ÿǪB R° /´ +² +³@  +°/°3´+°2°/´+² +³@ +°!/±"+±²999013#7##%3%3>$láá yßßO!&’Vþþ)-’ÖUþþ),–Bu.… |/Q$.éòÿXŒ&éòÿX‹%ÿþ»}#,4‘²+±*33°/° 3´ +° 2°-/´2+°#/°3´+°2²# +³@ +°2°5/°+Ö´*+²*+ +³@*' +²+* +³@+$ +±6+±°.9±2-°/9°#³ ),$9°±$'9901333##'##333#%5!#%3ô$AÙÙ‚ƒÙÚc&J% &$hL̓JLõ ^'Vþý%1–}C-…‡.e(%!|t´† #SþŒéòÿL—%ÿù&Ò,1:@KT]cز+± 33² +´1+± À/°3´_+°<2²_ +³@ +´. +´+´Nb +°>3´N+°42±V  À/°B3´Q+°62°Y/°F3´%+°*2²%Y +³@%" +°'2³@% +°d/°Ö²5=C222´+² +³@ +±e+±_²;^999±QN°-9±Y ³ADU$9015!#5##5##7##33533533&7#35#35#35&'#35#'35#35# ^'§TLV!Ú %   &%nÝ]I]_üøƒÚÝÏ^¥¦Jl§¥76l¦{!- Þ^JKJlKI!- lLJ7°Rý¸M<Q=º &   |w¸DKDþÍ… †F5¶L(DLu# ¹F5·Lœ# þ‘L( ÿùÒ',5;FMS[cû²+± 33²+´,+± À/°3´U+°72²U +³@ +´) +´+´IX +°93´I+°/2´a\ +´a+±O À/°=3´L+°12°R/°A3´ +°%2² R +³@  +°"2³@  +°d/°9Ö²0>222´+²9 +³@ +±e+±°9±U²6T]999°)°Z9±a\´(4G-^$9±R´¶¶ kuy€*Hty€,Fÿþ«ô_²+°/´+² +³@ +° 2² +³@ +° 2°/°Ö´+² +³@ +² +³@ +±+±°9015!#673#&'!#3Ñ _'Û&EYþnO[êTþ&Nþó gY bKÿêøj =²+±é° /°Ö±é°±+±é±!+±´ $9°±9901732654'7#".547&'767¥Q/0I]SIâ89{R;Z2Ä!D;J(¿:AF7y€CvîH‘]Zu)AI%—Ÿ!4>/B9ÿìIX>Hë²"+±Fé°/°?3±é°(2°2/°.3´++°2°I/°5Ö°62±é³%5+±Cé°±+°2±é°2±J+°6º>ðn+ °6.°9À±= ù°;Àº>—ò¥+ °.° À±ù°Àº=xî,+ ° ° À±ù° Àº?]öý+ °.°À±+ ù°À± °³  +° ³ +±°³ +± °³+º?\öù+ °+³++°³+°+³,++º>ð=+ °6³769+³869+°=³<=;+²769 Š Š#9°89²<=;9²,+ Š Š#9°9²9@ +,9 678;<=.....................@ +,9 78;<=...................°@±C²2:999±³"0F$9±F±%99°°9±2°09013267&54>73326?3&'#"&5463237#"'#"&54>73#"326”8  _= ^) ?*$`n>O‚ %$1"*<6J _fH*96®P0D 81V ÚþòRNkPE@>KF",,SP/=?4þç#%7IÿìºX 2Ú²+±é°$/´7+°/´)7+³+)+´+°3/°&ֱ鰱+´!&+°!±+± é±4+°6º?Tö¾+ °°/À±1 ù°0À°³./+²./ Š Š#9´./01.....´./01.....°@±&°$9°°)9°!±#+99± °9±$± 99±µ!&$9013254&#"3267#"&54?#"&54632>?3Ÿ)-&,$R&>)OQ/>rIM+>(.! Z4< ))!±%5`?OX0 hZ$x 6FG6=@2 ·þÊZ7íXJ²+°3°/°Ö´ +±+°6º?Sö¶+ °°À± ù°À±..±..°@013#’[X^Xý¨7ÿì²Xβ +° 3²+±é°/°Ö±é°±+´1+±+°6º?Rö±+ ° .° À± ù° Àº?EöX+ °°À±ù°À°³+° ³ +³ +² Š Š#9° 9²9@  .........@  ...........°@±°901"&54?'#3673327ñ@_i?BZXZ .kZ5MPQUU(xxFYþ?X7?6XþÊhZæ þÊ6ÿöb,ײ+°3² +±é°/±'é°!/±é°-/°Ö±*é° Ö±é°*±+´ &+±.+°6º??ö7+ °.°À±ù°$À³$+³%$+²$ Š Š#9°%9³$%....µ$%......°@±°9°°!9±*³ $9±² *999°'°9°!°9°°901%32>7#"&54654#"#>32&#"632-$ L@d <)`AVU6S(-6H.- & ,W ¤%/GH>þÏRP-C'þ÷ nT$,KA:<F6FOÿèOp D²+±é²+±é°/° ֱ鰱 +±é±+± ±99±± 9901"32654&4632#"&cFsT=FsTþ¯«qaƒ«qaƒ¢`R€¢`R€þò“Õ¦z“Õ¦0b=²+²+±é° Ö±é°/±+±° 9°°9°° 9°°901##"&#"'>32327Ì]¬$2XB .P 2v5Xý¨õ F#0ÿìöl'a²+±"é²+±é°(/° ֱ鰱+±é°±%+±é±)+±³ $9°²"999±"µ $901#"&547>54&#"'63232654&COdiSejJ;#"*;2KZI^~9:.69RrdSOqtWK\7),)/€J<;~>E'=E'=32326?26“-¸KQbGY"(%1  > % =%&#-¾CMTPQX[N2t¹Z  þz#/<?ÿìX)3F²+±1é°/°*3± é°2°/´++°4/° Ö°!2±é°)2³. +±é°/±.é±5+°6º>—ò¥+ °!.°#À±)ù°'Àº=xî,+ °"°$À±(ù°&Àº?Zöè+ ° .°À± ù°À³+° ³ +°³+±"$°!³"!#+°"³#"$+±)'°(³'(&+±(&°)³()'+² Š Š#9°9² 9@$!"#&'()..............@  $"#&'(.............°@±1± 99° ° 90132?3&'#"&5463237#"&54>73#"326É+&>%^) ?*$`n>O‚ 0L1Y _’fH*96´"4)ÑþòRNkPE@>KL(WL0D 81þã#%7:ÿì’l*4´²"+°!3²+±é°0/±*é°5/°'Ö±3é°3±+± é°. ֱ鰰 Ö±é° ±+±é±6+°6º?Qö«+ °".°#À±! ù° À± #..³ !"#....°@±3'°%9°.°9°°9±±99±0¶'+$90123267#"&54654&'#767&5463>54#"ÇEQ „$)-XYWKT,/# _!1I:71lH7.HQA &d‚ ’¤TI-+2W¾Èm>7N-G¿ 1)9ÿìTX).² +±é°/´"++°*/°Ö°2± é°2° ±+±é±++°6º>—ò¥+ °.°À±ù°Àº=xî,+ °°À±ù°Àº?Oö¡+ °°&À±( ù°'À±°³+°³+±°³+±°³+º? ôõ+ °³%&+²%& Š Š#9@ %&'(.............@ %&'(...........°@± °9°²"999±°9°"±9901%3267#"&547"&54>73326?3L-&,$R&>)OQ$dD _= Z4 %5`?OX0 hZ*n)TO0D 81V,µþÊZ=ÿì!l=GOa²/+°%3±Dé°2°;/°M3±é° 2°P/°1Ö´A1+°A±8+±é°±(+±é°±K+±é±Q+°6º>dñ»+ °G°6À±. ù°Àº=Ûï’+ °*° À±ù°OÀ°.³ .+°*³+* +°.³-.+°G³5G6+³>G6+°³HO+²>G6 Š Š#9°59²-.9° 9²+* 9²HO9@  *+-56>GHO.............@  *+-56>GHO.............°@±A1°9°8²/999°°,9±(° 9°K³ %$9°°9±;D@ (1K$901'632?6323267#"&54?#"546?654&#"3267>54#"—FO40X9N==x‚l4[¢*(þÁ/ )!2P2íX"Ù²+±33°/±é° /±é² +³@ +±22°#/°Ö±é³"+±é°/±"é±$+°6º?6õù+ °.°.°±ù°±ùº??ö2+ °³+³ +³+³+² Š Š#9°9° 9°9³ ....· ........°@±"°9°²999013>327#"&5473326?3#7&#"2 #5#X-092D_5$ZX_)1*"5NG-4‘ Q:9FA.I!ý¨CPt5ÿñ°g's²+°3²+±é²+±%é°(/°Ö±é° Ö±é±)+°6º?õj+ °.° À±ù°À± ..³ ....°@±³ $9013267#"&54654.#"#>32Ø+$$)2R %A*A^(!<?_F+D+OTÂ@£9$7i‚2B]7)[Z3¨#"›þŽ&FC(^9ÿì©Xš²+±é°/±é² +³@ +° 2°/°Ö±é°±+±é±+°6º?XöÝ+ ° .° À± ù°À³ +²  Š Š#9² ...´ .....°@±±99±²99901732654&#"#3632#"&5P,D+2)_,Z0-E%dYBqžX>K8V1·-GH!c…ZAFÿìl,Õ²#+±é²+± é² +°-/°%ֱ鰱+± é° °! Ö± é° /±!é±.+°6ºHÁ+ °(°*À± ù°À³+³+°(³)(*+²)(* Š Š#9²9°9¶*().......¶*().......°@±%°9° ³ #$9±µ !%$9014#"'>3232>7# 54>7>¾u_ ]%H2ul\S > 1Q=$\ ¤þÿ+FB$SN¾UG(+R_BX +6 # Â*@$ =9ÿöX1²!+° 3²+± é°/±é°°. Ö´$++².$ +³@. +±)22°2/°'Ö±,é°,±+±é° Ö± é°±+´&+±3+°6º?Pö¤+ °!.°.°!± ù°± ùº?Sö¶+ ° ³ +³ +°!³"!+³1!+²"! Š Š#9°19² 9°9³"1....· !"1........°@±,'°)9°³$*$9±± 99± ²999°$°901363232>7#"&54654#"##"&54733267&["%,W -$ L@d <)^<#52D ^=XæF6F%/GH>þÏRP-Cþê‰*TO$29)V*OÿìçX0y²+±é°-/±é²- +³@( +°2°1/°Ö±é° ֱ鰱+±+é±2+±°9±³'/$9°+² (-999±-³ $9°±/9901732>767#"&5467&5733254./3#"'©J7" N&QM_u"*BZS: _ZD3C¶0@',THvX3M'MZs6%"!)Œ-c7Iÿì b$/t² +±é°,/±é°0/° Ö±é° Ö±.é°±)+±é°±+±é±1+±.°9°)±!99°³ $9°±99±,µ %$90173267#"&54>7&54632&'7>54&#"¢C9@UT…WZ! #H;6/,B:9F)²/=„lžpP(D!2V:HŒ,.. 8Ç "+.+ÿìÎl%_²+±é² +±é²+°&/°#Ö± é° ±+±é±'+± #°9°´  $9°±99± ´#$9012.#"#"'73254.546# 8"83#.CB.}P‚TB2K‰.AB.Il 2'#?25L.K[_9>U847K(9fNÿì¯XN² +±é°/°Ö±é±+°6º?Tö¾+ °°À± ù°À³....³....°@0173267#"&5473§-&,$R&>)OQ/Z4 %5`?OX0 hZ$xþÊZ8ÿñÊl [²+±é²+±é´  +±é°/°Ö±é°±+±é± +±´$9± °9°² 999014.#"32$4632!'267#"l,"/D6.SþïlTBT,þþRK +>[a'49;87A¼u&ShOþµUPO0ÿö&l0¼²'+°&3²+±é²-+±é´ " +± é°1/°*ֱ鰱 +± é° Ö±é° ±+´&+±2+°6º? ôë+ °'.°(À±&ù°%À±%(..³%&'(....°@±± "99± ±99±"² 999° ±99°-²09990163263232>7#"&54654#"#654&#"0+mOQ)",W -$ L@d <# -Z4-& úrhZF6F%/GH>þÏRP-Cÿ6Z(%5#3Âl ´²+± 33²+±é´  +± é°!/°Ö±é°±+±é±"+°6º?Tö¾+ ° .°À± ù°À° ³ +³ +²  Š Š#9°9³ ....µ ......°@±±99°² 999±² 99901632#7&"#>327654&#"Š+mOQ/Z$T"_ #5#O* -& úrhZ$xþò“1Pt5NG-(MZ(%5#D´lµ²+° 3²+±é´ +±é² +³@ +° 2°/°Ö±é°±+´&+±+°6º?XöÝ+ °.° .°± ù° ± ùº?|÷â+ °³ +² Š Š#9°.´ .....°@±±99±²99901&#"32673#7#".54632hK,D+2)_,Z0-E%dYBqºX>K8VþÏ·-GH!c…ZANÿì©X'›²+° 3±é°2°(/°Ö±é°±!+±é±)+°6º?Tö¾+ °°À± ù°Àº?Nöš+ °#°$À±& ù°%À·#$%&........·#$%&........°@±!°9°°9±°901%3267#"'#"&54733267473¡-&,$R&>)U)+QOQ/Z4-&# /Z4 %5`?OX0 <3232>7#"&54654#"#7>54&#"#654&#"0+mOQ)"9# L,W -$ L@d <#Z!# -Z4-& úrhZ-F6F%/GH>þÏRP-C $Ȫ "!ÿ6Z(%5#ÿÿrÿèrpÒ#ÿÿ7ÿìÚlâ Jÿì l'ƒ²+±é²+±$é´ $ +´ +°(/°Ö± é°! Ö±é° ±+´1+±)+± !°9±µ $$9°°'9± ²999° °9°²!'99901.#"3"3267#"&5467&54632” +4+343@OE=9WQ6`;T€6"2wO?mÜ%'27].5?–U+c`@g_@a-GAJG41ÿöËX%β+°3² +±é°/± é°/±33±é°&/°Ö±#é° Ö±é°#±+´ &+±'+°6º?6õû+ °.°.°±ù°±ùº?6õþ+ °³+³+² Š Š#9°9±..µ......°@±#³ $9±² #999° °901%32>7#"&54654#"##7!!632Í-$ L@d <*`R•üþù&,W ¤%/GH>þÏRP-C'þ÷RR‹F6FÿÿnÿêjÌ#Aÿñøl!,„²+±é²(+± é°-/°Ö±é³ +±+é°±%+±é°±+±é±.+± °9±+°9°%´ $9±°9°° 9±(µ "$9° ° 901"&54>54&4632#"'3267>54&#"Yz$A-DSF&S>39[Tz‡,fV%—ò¥+ °.°À±"ù° Àº=xî,+ °.°À±ù°!Àº?^÷+ °.°À± ù° À°³+° ³ +³ +°³+±°³+°³+±" °!³ !+±!°"³!" +² Š Š#9°9² 9°9@   !".............@  !..............°@±±990132?3#726?#"&54>73“5&2^)  '?S:[O +<9[ _´!5&ÔþòK[X.% P`^F#VM0D 81.ÿè p7²+±é²+±é²+°/°Ö±é±+±³  $901632#"&'732654&#"qRdaƒ«q=eS,JFsT=<4X¦z“ÕF=1Z¢`R€<Oÿè,p8²+±é²+±é°/°Ö±é±+±°9°³  $901%#"&54632&#"327éRdaƒ«q=eS,JFsT=<4@X¦z“ÕF=1Z¢`R€<NÿìéXµ²+± é²  +³@  +²222°/°Ö± é±+°6º?Tö¾+ °.°À± ù°Àº>óôt+ °.°À± ù°À°³+³+² Š Š#9°9µ......@ ..........°@± °901"&547332>73=žQ/Z4-& 7&'7'6_ I0BcJ W['N6("7fˆ A/3,=ˆp$dL¥E†y[7,AXN@,  0Lo‡zw~`Hd97šP§° /´+° Ö´+² +³@ +°2°/°Ö´+±+°6ºÂïÿ+ ° .°À±ù°ÀºÂuîo+ °³+°³ +² Š Š#9²...µ ......°@± ° 9°°901%'>54'#"54632'&'32š©J >‹BcqÃ%=Jg!Tæ<5|N0$¿µ[DV<d'7ÿµR3²+°/°Ö´+°± +´ +±+± ±9901'6?&CD5ª5-TÃ6¢ˆþ»S Y^fþT‚ yj7йP *° /´+°/°Ö´+±+± ± 99014632&'#"%&'327”$¡5 (TG~.&E,*6pÃþÖJ 4PKW4IQ7 mP>32&''67''67&'7>Ž #‘~4G8' %=”;wX%'°*IvgT•àþÿICC-(:°k„R)#ºD4œ7³RI° /´+° /°Ö´+°±+´+±!+±³ $9°° 9± ° 901.547#"&54732>?M-9/=1CC':L#9 (H-"1,RTzW_‡\2*(/#2=*+ ,+PU7U“P<² +´+°/´+°/±+±±99° ± 99°±9901267#"."'>32Â*Z1cn!A'%1N .(Š'3%0‹o<É‘>I>7ÿþP#+²+°3°,/±-+01#"&/7632.'&'67'>\ T‹$233 BÀ< Š4  p%?¦'^è3¢Z'©(_yü~Œ öüþò5!"( 1Ë?$Öek_ªh'" ¬7ÿ=ao/b°#/´+°/´+°0/°&Ö´-+°-±+´+±1+±-µ#)*$9°°9±³&-$9°±9901%&''7#52672>54'7#"&547¶ ,'82/&6 !.+Î4kSB$0 4KVi4GTΉ|Ä5î6tb7<+$,þ‚]£•08#2D1†‘qEZM«ƒ]-Uþ— 5;7 Ke s²+´ +²+°!/°Ö´+°±+´+°±+´+±"+±°9°± 99°°9°² 999°°9± ±9901"&54632654'7'67&''7&0Qr6“ftb 3S7,.Eq2nlN  fŠh$#-(¨><\=ýö7ÿ8½©0°/´ +°/°Ö´+±+±°9± °901"&54732>767'67¬2CF%5?,G; 3HÛ+1»7IÔ.)>@(/' -!!Øý×V;Ô™%7ÿ»¡ f°/´+°° Ö´+°!/°Ö´ +° ±+´+³+´ +±"+± ´$9±°9°°9017"&54>732632'>54#"Ÿ-;Xmf 5›‰d?F%%#3lB4)¢ºÕ= bþÑá 0#^"( F 7ÿ8ð¦°/°Ö´+±+±°901.547376?'>'´3JN'?CJ3?:B74é‰.3_‡<=&3©0&NP&@8´š #“ý…àSÕL^7ÿ8JÅS²+° /° 3´+°2°/°Ö´+°±+´+±+±² 999°°9± °9012'54#"#"54326æ,8é*Ü-&BŒ1$A&ˆ7-ÊþÞ"¸.7$EŠM7ÿä dB~²+²0+°C/±D+°6º=pî+ °0.°.À±9ù°;Àº7.'#"54>7#"5467'632>’S.‘”@_– 9#5%"84 ~0" %" $4=>({>3 (")»$˜'/:¥_W_(aW\…$$1C)# *" 'G$‹%ƒ ,# 7R?P Z²+´+² +²+°/´+°/° Ö´ +° ±+´+±+± ²999±± 99012#"&543254&#"€pOJ<5M6-O."-PD57#".'&'76--%5 ^ (/<"l/Ï'5 0LPKK19WDQ [JþÓ/g 0bd7ÿ8 ¥#-6i°/´3+°&/´+°. Ö´+°7/°Ö´1+°1±$+´+±8+±$1¶*5$9±3°9°.µ$(*$9012.'#"&54>32>4#"%"327&Ì$³V\P+*1>ViE#+(@=RX/M07& &þæ !bíýèA7]C¥/!=þÝtÀg";V37º'-$ !_Jš -% P >ÔKYu 'x7ÿåP6²+´+°/´+°/°Ö´+±+±± 99014632&#"7"327&7–)06Z3/Ap:P{¯ i>A38~"°53#"&54747.0;6$0@,Ly6W37©X>:X.kH" /KnNB7ÿ8]0°/´+°/°Ö´+±+±°9±°901'654#"'7632]1-(_DÇ3 ,Q•r.C54=GþR<® 2Ç7#ê¬ °/° /°Ö´ +± +°6°&±.ɱ.ɰ6º?õ+ °°À°°À°³+³+°³+³+² Š Š#9°9²9°9µ......µ......°@017>77%)!5!+&7WËM HþýØ[7ŽPF²+°3´+°2° Ö´+°/°Ö´+±+±°9±±99012'67654'"#"'732<.$  v YXP+ 0 8 6 7©…P8²²$+°)3´/+°*2²'+´,+²2+°9/±:+°6º RÀÖ+ °°À±ù°À°³+³+°³+³+² Š Š#9°9²9°9·........·........°@±,$°1901>32'>7#"54>7&#"#"'732632” LL6fŒ* +9O8, $  Y ! Y V#,™ $ go 5$4  $  5 07öÜZ%²+´+²+°/±+±°901>3267.#"7{$,)i4WN,?‡98!!$"-•K*g(P+7#‹¬ 7>7'>7Ø%)!5!+%Ô%)!5!+&7XËM GþýØ\WËM HþýØ[7#,¬ %>7'>7'>7y%)!5$($Ô%)!5!+%Ô%)!5!+&7TÌ K QþòÆYXËM GþýØ\WËM HþýØ[7Í­ .°/´ +´ +° /° Ö´+´+± +012#"&546}!/)#-)­,".,! .&/10²+´+°2°/°Ö´+² +³@ +±+0173:>2>7#"&5467Y6   CL_˜bN\ÙLD  :‹hjÃ3!ebÿ²)y²"+´+°/´+°*/° Ö´+°±'+´+°±+´+±++± ° 9°'° 9°°9°²"999°°9±³ '$9014&#".547323267#".546¾&<(*2,2MS1 O_?/ C/G#^"5  !$ " +=;/“QBx  :8QFY¯ÿ5QM°/´+°/°Ö´+01'%Ë  5&ò&þ†ÿì_. $a²+°/´++°!/´"+°%/°Ö°2´+°±+´ +±&+±³ !"$9±´ $9°°901'2'32654&##5.+'676753”VG E`\)H.2'[A!M)ž©?E)#ãRDP(#$*þ¿GN70C¥33Sÿé—{e²+²+´+° /´+² +³@ +°/°Ö´+°±+°2´+± +±²999± ²999017253#5.#"327#".54>Ü1G33 c$7B &"1(þH$éþ…C%c.5L0 5$,@ þ'(f#g°/´+°/´+°$/° Ö´+°±!+´+°±+´+±!°9°³$9±²!999°° 9012#".'732654&#"&546{ #-Uc‘#k3='I] „<ÿÿˆr4ª°(/´%+°/´0+°/°3´+° 2² +³@ +² +³@ +°5/°+Ö´#+°#±+´+°±+± 22´+° 2² +³@ +² +³@ +±6+±#+°9°´'(0$9±%²+99901#53533##5./>54#"327"&54>32=>?&&3>>3?[C"/># .!-% !/ -;P¼3DD3ýÐ,HB , :(&,*!þäÿÖ§.#'K°/´+°(/°Ö±$22´+°2°±"+´+°2±)+±"±99°±99013##5.'&/753632&=654©©G4;E  µ491,$€r^.3ðþê1*1vZKW(=>E_/**"$*GDýìÿ(ÿ#<U°/´+° /´+°/°Ö´ +° ±+°2´+± ²999± ±99°±9901%253#5&#".546þV.H$33=_%&+><21_þðP‘ *1(#CþAÿBÿ%m)° /´ +°/° Ö°2´ +± ±9901%'673#5.#þò ) J±Ig43Q+0   54'#"&543367B5oXO˜34P- (0" 0!'!C   LE;H_«b@L3 4"668& #ý‰ÿ9ÿ0”j°/´+² +³@ +°° Ö´+² +³@ +°/° Ö´+°±+°2´+± ° 9°± 99±°901.#"#"&5473263253#þýC PYM.9S 6 2833’( W6-( -32 *ãþ¥þiÿðÿÄa%{²+°/´$+²$ +³@$ +°° Ö´+²  +³@  +°&/°!Ö´+°±+°2´+±²$999± ²!999°°9°°901'63253#54&#".#"#"&54632Ì 33**!" .9E%0‡ Ñþ±(  $*(-7,*@ÿíÚé."*°°/´+° /´#+² # +³@  +°/°(3´+°/°3´+°+/°Ö±'22´+°2² +³@ +°±+´ +° ±+´+² +³@ +±,+± °9±°'9°#³ $9°° 9°°9012654&##5.#'>75#5!#2#"'7%25"h <"3$4M(/RLýüÌJB5'$þù1@ wB'*Õ&/5('33T.*'; -q7 sl)¨²+³+´ +²  +³@ +² +³@ +°/´$+°*/°Ö´!+°!±+´+°± +°2´ +°2´ $+±++±!±99°´'$9±$±99° ³!$9°°9°°'90133##5./>4'#"&5473267Þ>;C3<<3 w/4D 5#'+!-Í$4CU>3þ¥+]2-.6-  &- 6 Ê”.,s°$/´+° /´+°2² +³@ +°-/°*Ö´+°±!+´+°± +°2´+±.+±!µ '$9±$³*$901253#5&#">32'7>54&#"#"&546¡(G.33Iq%E!-8)A&2 J&U-.'…þù$²8, $&%8K!9 1!'2[ÿî >.)…°'/´+°/±33´+² +³@ +°*/°Ö´+² +³@ +°±+°2´+² +³@ +±++±²#$999°±%'99±'°9°±9901275#'47#5!##5./7#"&„ 3    ”V 9P3[6 6 4¿( 2     Þ 33þ¥./@:&ÿèp€.,5£°/´$+°*/´+° /´-+°/´+°´2+°6/°Ö´ +° ±+´+°±&+°02´+°2±7+±&¶ $*4$9±*$±&99± ³($9°-°9°´ 04$90147#5!2#"'3267#".573254'#"&72654#y6Ç:1, +":#_5_>%34b6U)2*4š'(+"ZMT3,#2940_yHjv1 :ŒjI,=8”%ÿî¢E.r°/´+° /°3´+°/° Ö´+°2² +³@ +°±+´+² +³@ +±+± °9°°9±° 9° ±990172654'&'"&'#5!#he97GWÝ2JƒÕb+ ú @33"55Œÿç8h.l°/´+° /°3´+°/° Ö´+°2² +³@ +² +³@ +°±+´+±+±°9°°9± ±990173265&'.5#5!#3}1rrF #c2œ!ƒ?‹$~<]þ¤'m33 9OP¥ÿô`§.1C¶°/´+°/´>+°2/´++°/2°+´+°#/°&3´$+°D/°!Ö´<+²!< +³@!# +°<±+´+² +³@& +±E+±´54.##"&=#5!!3232'".'32654'CB * $W3:J C$6>³þ¿ !5³  m0;  3+R3< +7’33 -B ÿæ—./±°/´&+°-/´+° /´ +°/°3´+°0/°"Ö´#+°#±+´+² +³@ +°±)+´+²) +³@ +±1+±#°$9±)¶&-$9±-&±)99°°+9± ²999°²"#99901467#5!#3"'327#".'732654'#"&l'¼Šf‚ 3 $7=G:'>) 3PE($"("3J 33G* _57T<-ƒ•0+!,ÿî ¸m!°/´+² +³@ +°/°3´+° 2² +³@ +² +³@ +°"/°Ö±22´+°2² +³@ +°±+° 2´+° 2´$+±#+01675#5!33##5.'#5.#7Psé(3>>3 3l4°] ] ‡D 3Ú /T?3þÍu?"Sc, >£%:<O°/´+° Ö´B+²B +³@ +°F/°13´K+°,2°)/´6+³6)+´=+°P/°Ö´+°±3+´,+°,± +°%2´ +±9?22° ±D+°N2´+°2±Q+±°9°3²999°,°19° ²/6999±D ²H999°°9±B°%9°° 9°F²DH999°Kµ/?@$9°=¶+.39$9°)°9012#"&'#4.#&5473263254&#"27#"546327>"3254#"532654Ø,!I"?3 4?54'#53&5472654'lF~c :'7G}v4'* 9*13­.Q32*9*2=*S-8' 3?6+2%ýÿM7<=2Q#Qÿ⣡.$…°/´+² +³@ +°/´ +°/°3´+°%/°Ö´ +²  +³@  +² +³@ +° ± +´+±&+± ³$9± ± 99°±"9901"&=#5!#267#"332654'ß$À¿Ì8!$^Cª*3 !:"-?6:!33}6K&4d82R<-G'!ÿá“3.w°/´ +°/´+°/°3´+°/°Ö´ +²  +³@  +² +³@ +° ±+´+±+± ²999± ±99°°9017"&5#5!#32654#"'632r2ERÚ (I  & n“5#33þò |& (0 C %;6°/´ +°/´+°/°Ö´ +±+± ²999012.#"37#".54>–#> f$8C .- ;;-*Qk.5M/>.,6&  mm-®°/´+°$/´!+°/° 3´++° 2²+ +³@ +²+ +³@+ +°./°(Ö´+°±+´+°±+°2´ +°2´ %+±/+±(±99°³#$+$9±°9±°9±!$±99°°(90133##5./654&#"327#"&54632Ü:+33::3 $ 3 ‹!=-,;Î*8R?3þ¥4# 7F 5!$05  W3$[°/° 3´+°2°%/°Ö´+°± +±22´ +´ %+±&+±°9° ³!$9±°901"753##5./7.54632&u  Vm:32L8B*"  d(6&4/! 053þ¥=252-"( ? #!ÿèçz.[°/° 3´ +°/°Ö´ +²  +³@ +² +³@ +° ±+´+±+± °9±²99901'5#5!#6?#&54C+G1*k`ÁCV? 3 ‹*¾33‹9 (&+/).ÿÓ±1.a°/´ +² +³@ +°/´+°/° Ö´+°±+°2´+² +³@ +±+± °9°± 9901&#"&546325!5!#þ<6!(E5<þÕ^3 v)2+M’3þƒK.K9#e²"+´+°° Ö´ +²  +³@ +´ " +´+°$/°Ö° 2´ +²  +³@  +±%+±³ $901>3253##5&''654&#"72767&#"KK;\PÆ“2 (+8"?Î!J_T3¤:  ( 5 & /ÿî‘».*…°/´+° /´'+² ' +³@  +°/°3´+°+/°Ö°%2´+² +³@ +°± +´+±,+± ±99±±99° µ "$9°'°901#"'73254&##5./67&'#5!!532')3l*<&I8Íþ¸/. ,2$%=0g21%þâ11@ /!%033(* #à<ÿî‘7.S°/´+² +³@ +°/°3´+°/° Ö±22´ +² +³@  +² +³@  +±+01675#5!##5.#"75WmçI/3 q(0!Q $KxD!33þ–?c :Š "ÿï´œ..2ް/´%+°,/´ +°/´+°//´0+°3/°!Ö´"+°"±+´ +° ±(+´+±4+± °9°(´%,$9± ,±(99°²*999°´!"$9014632&#"32>7#".'32654'#"&'5!u '    %4O:-K0* 3h=(1%<)4†­ 1  (>?P#3SC1 jv:-@:‡33ÿéÕ. *‰°/´ +° ° Ö´#+° /±33´ +°+/°&Ö´+²& +³@& +°±+´+² +³@ +±,+±&° 9°´ #)$9°°9± ³&$9014'#32%#5!##".#"327#"&54674\#µ U:þòeìa,)#G7 $*›4,75¢3309)5))30#(ÿê‘L.I°/±33´+² +³@ +°/°Ö°2´+² +³@ +² +³@ +±+01!##5./67.+35b-3h)!=,V=”.#DZ4.3þ–6/;)8 <*>Aôÿ5QM°/´+°/°Ö´+01'%Ë  5&ò&ÿÕò×.%°/° 3´"+°2²" +³@ +°/°3´+°&/°Ö´+°± +°2´ +² +³@  +² +³@  +±'+±°9° ±"99±"±$990125!5!##5&#".#"&54>326 þ€O3&)+#$$$3 4"*-Æ%Z33©>?$7( "E$)/)ãÈ.0š°$/°3´)+°2° /´+²  +³@ +° °/ Ö´0+°1/°,Ö´+°± +°2´ +² +³@ +±2+±,±!99° ²999±)$±&99°/¶!'$9±0 °901263253##5.'27#".'#"'72654&#''/ #!7j3# % 8- #/IK[3þè‹34 0 +#,1!&30ÿÎ"¬.!{°/´+°/°3´+°´++°"/°Ö´+² +³@ +°± +´+² +³@ +±#+± ³$9°°9±³$901327'654.'"47#5!##".x/b1a4«Þrk7 $Ž%Y( MK$33-;X ,ÿ×J.%‚°/´!+° Ö´+°/±33´+°&/°Ö´&+² +³@ +°±#+´+²# +³@ +±'+±° 9°#°9°°9±!µ #$901#".'#"&'6732654'#5!!3254'·:(4 "<6 " $Ø7þò8$=û",6(‚3!'@* 33$H8 (ÿî[\.%)L°/´!+°&/´'+°*/°Ö´+°±+´+±++±°9°´!$901&/32>54&#"&54632%5!) (zš/,"2 5%"H!'.þÏW†([6'†37 ("1 ,X33ÿî2}.(2©°2/±,é°/´"+°/°3´+² +³@ +°3/°Ö´+°±+´ +²  +³@  +² +³@ +°°* Ö´/1+° ±%+´+±4+± *°29°/µ ",1$9°%±'99±"²'99901"&=#5!#>7#".'32654'4632"É"¡» 3 !/!-*0L) 3e7,=$Z$+7~33{CC#$9" 8NbC u’@#!Kã$ÿá:.'’°%/±é°/´ +°/´+°/°3´+°(/°Ö´ +²  +³@  +² +³@ +³ +±"é° ±+´+±)+±" ´ %$9°±99± ±99°°9017"&5#5!#32654#"'6324632#"&n -@Yæ0A+a_ ƒ7 !33þÝ"g+ '$*@„Eÿñ‘M. #}° /±é°/±33´+² +³@ +°$/°Ö±é°±+°"2´+² +³@ +² +³@ +±%+±² 999°°9± °9°±"990174632#"&&+5!##5&/675O /CA \532{ +/0P>((Ç B33þ–6Q )-m(E(ñÿ5QM°/´+°/°Ö´+01'%Ë  5&ò&ÿî‘7.S°/´ +² +³@ +° /°3´ +° /°Ö± 22´+² +³@ +² +³@ +±!+017.'7'675#5!##5.#"75–D++DWmçI/3 q(/!R $Lž9 0 6"±D!33þ–?c ;‹ "þÞÿçÇ,š°/´!+°/´+² +³@ +² +³@ +°-/°Ö´+°±+´++°+± +°2´ +°2² +³@  +±.+±°9°¶&($9±!²+999°³($901'233##5./32654'#"&4732>54'r=Y3ll33P]+ 4]?? 9/( 0GC=W3ýê&-!?2 JJ3Z0Hÿÿù..'|² +° /´%+° /´+°/´+°(/° Ö°2´ +° ±+´+±)+± ² "999± ²999°%±"99° ´#$9°°9015!4.##5&/7'7632#"'7326Bpk/&3>’(y&)djF4Lf< û33À#þnAW6P!4#>#=>G83, ;ÿ°X.M²+° /° 3´ +°/°Ö±22´+² +³@ +² +³@ +±+± ±99017.#'675#5!##5½ /AT&‚‹Þyg4Ç,~›X:<*6g&+33þ: N6òNÿFÿo.° /´+°/´+² +³@ +°/°3´+°/° Ö´+°±+°2´+² +³@ +² +³@ +±+±² 999±± 99014&#"3"&54632#53## R! *5'72B¸C3[? (&/7ý33ýtÿY©.Œ²+°/´+°/´+° /°3´+° /°Ö´+°±+° 2´+² +³@ +² +³@ +±!+±°9°³$9±± 99°°9° °901'463&'7#53##54&#""&§5& 3>wíC3]+ ' )È(3 .>3 333þoZ((ÿáÿåý.j°/´+°/°3´+°/°Ö´ +²  +³@  +³ +´+°/´ +² +³@ +±+± °9±° 90147#5!#'>54&N2Ÿ;ACZ+3xK833G@­EE0 )! ®ÿÕÿÿ¾.>Bß²+°/´$+°3/´.+° /´+°)/´:+°?/´@+°C/°Ö´+°±6+´,+°,±+°&2´+°<2°±+´+±D+±°9°6±!99±,´$03:$9±±99°°9±$±&99°3°9°.²1999° ´,6$9°±=99°)°9012'65.#"#4&#".547326324#"327#"&54>326%5!M*9!#)/3=TFRD )7=&Q7-%y# +SaU7ý¹éuG' &(0þí9+'+°)2²?> +³@?% +°>±:+´/+²/: +³@/( +±H+± °9°?³!C$9±:>±2499±°9±2´ F$9°7²4999°@µ !/5C$901.##".547326325.#"'675!5!##"'732654&##q"<.!2 .)#ƒ >{™þ£ñ9F0/#)( Z63›,ƒ/"2)/# L3D0†6`*.33.(L1#B%''5NþþJ Q4ÿ™ÿ„A²+´+² +³@A +°° Ö´+°/´+°#/´.+°?/´<+² +±C+±& ° 9±+± (99°@ #)17$9±°9±´  9$9°°79°#°9°.±499°?²&) 999°<±1(9901.#"#"&547326325./>54'"&547326733##wCQLZ/EF<46³86q4)$1( ,(74#"#"&54632533##yCM /E#.DG 6 28V^!F O",&"'*& N  WC9M.3CC3' --$1 *;) *<›7#)"5"% $%1^5HÇM3ý³ÿôÿ—ß.+=Ò²+´+² +³@+ +°° Ö´+°/´,+°%/±(933´&+°>/° Ö´+°±"+´<+²"< +³@"% +°<±++±822´*+²*+ +³@*( +±?+± ° 9±<"² $999°+´$9±°9±¶  08$9°,°/9°%±".9901.##"&547326325./7#"&547#5!##27#p#l1D.*"† ƒKN &Hcë<3& €  Þ34O:0% L3 2>] (R8,33ýœü $ a0 ÿóÿ+.-5Ù°/´+² +³@, +°° Ö´+°/´.+°/°!3´+°6/° Ö´+°±+´.+°"2². +³@ +°.±-+°2´,+³1,-+´)+²)1 +³@)! +±7+± ° 9°² 999°.°9°-±499°1°&9±°9°.² 999°³ +5$901&#"#".547326325#&'#5!!#2654.'o+( t "+.*" ^K§þÊL=7(3¢(¡Lg 9 ;(.' P1ÄeÔ33=() "%+?þƒ £8 ÿôÿ7<.KW °/´+°° Ö´+°/´+°)/´L+°R/´9+°./°13´/+°X/° Ö´+°±,+´U+°22²,U +³@,. +°U±O+´&+°&±+± 22´I+°>2²I +³@I1 +±Y+± ° 9±U,²999°O²)999°&²A999°°99±±G99°°F9°´ EI$9°² A999±RL² >&999±.9°T901.#"#".547326325򂂮./#"&=#5!!32&'#2654'#"'}C J0E#./´!+°/´L+°E/°H3´F+°U/°0Ö´1+°1± +´ +° ±B +´+²B +³@BE +°±:+´'+°'±+´R+²R +³@RH +±V+±:@ $*7>DI$9°'°9°±L99°R²999±±T99°°9±>7³':R$9°!°<9°²$B999°L°O9°E±N9901.#"#"&5332632&547".'32?#".5332654'#".547#5!!327ïA t"DH2 *"!y '$#XX&$*%*`49?1 3*7!"@(1'2KåzþÀK9<!--4bW6:4 k6]X)1 B!-"$,!@R7Q‡TV€@&6'$&1/a1337'!eL'A…ÿîÿcó'O9²+´+² +³@O +°° Ö´+°/´?+°D/´I+° /°;3´!+°92°(/´2+°2°5 Ö´%+°P/° Ö´+³+ +´0+°±+´=+²= +³@ +°=±O+°2´N+°B Ö´K+°" Ö´9+²9" +³@9; +±Q+±+ ° 9±0± -99°².999°=²(2999°O@ %5?DGH$9±"B°I9±°9±± 99±D?µ  FKM$9°I°G901.##"&547326325#"&5#5!4&#"#"&547326323!32654#"'62#m#<'2D.*"Š?I,'¤œ!5l3G!*`"f1)0þÓ:d$D-3h'P9.' ('3 ¶K@&O3,# ?/). >13þ´6‹E$"1'-4þÿóÿíTEQ!° /´+°° Ö´ +²  +³@ E +°/´F+°,/°<3´-+°:2°R/°Ö´+°±0+´7+³P70+´!+°!/´P+²!P +³@!, +°7±)+´K+°K±I+´A+²AI +³@A< +°I°E Ö°3´D+±S+±°9°!°9°0² $999±)7µ+.23F$9°K´ :=$9°E°9± °9°°9±±99°F°9°,µ!CK$901.##"&547326325#"&54>7>54'!53&5473##2654'r   g 2C.)#ƒ 33=EV2 þòñQ6& 00ƯE 3r7F<"G/­P90% L3)§:ZD N= 3\H8J",O63o.BA!"þ†x@TV>NAqÿÙÿY.>²+´+²+´+² +³@= +°/´ +²  +³@  +°(/´4+°-/°03´.+°?/° Ö´+° Ö´+°±++´2+²2+ +³@20 +²+2 +³@+- +°2±>+°2´=+°=±# +´9+±@+± ° 9±° 9°+±99±>2µ (4$9°=±%799±°9± ² 999°(² <999°4±#999°-±%79901.#"#"&547326325#"&'332654'#"&=#5!!3267#DPLZ.9S 4 56*3m†3b[;RR%(úFþç^K3r' M@'. *32 +ÔÁ°²[3'&?.É33ÄS2lFþáÿñÿ&ú.:Ö°/´+° Ö´+°./´3+°!/°$3´"+²!" +³@! +°;/° Ö´+°±+´&+²& +³@&$ +²& +³@! +°&±:+°2´9+³,9:+´6+±<+± ° 9°²999±:&µ).1$9°,°39±°9±.·  )068$9°3°1901.#"#".547326325#"&5#5!!>54#"'632#p#y "+.)#ƒ ?D 3© þÔ .q,.3¥' :&.' (&3 ²M/7’33þq \&"!<5>þƒÿåÿõ./’² +°/´+° Ö´+°./´)+°$/´+°/´+°0/°Ö´+°± +°!2´ +±1+±°9° ³$9±°!9±).±,99°$µ "+$901!!4632#4&#"#"&54732632&#"327"&5ýË͘6 3.*ˆ>L, Vx'&w  >%.3Ù9‹!-þ]B4]I/A*3$"m&$ -ÿßÿVU.GK8²+´+²+´+² +³@F +°/´.+². +³@.% +°&2°4/´A+°H/´I+°L/° Ö´+°±<+´7+°7±G+°2´F+°F±1 +´D+±M+°6ºÀÛõ‘+ °%.°#À±&ù°(À°%³$%#+°&³'&(+²'&( Š Š#9²$%#9³#$'(....µ%&#$'(......°@± ° 9°<±99°7±:99°G¶.49A$9±°9±.² 999°4µ :32#5!’B Q/D#.DG 7 83%.":,'3  $2BLF57 + 8&Kc33þMvu' ,.), '<) *l0'F+R'*7;X/:\IFa!#'" '}º>þó¥33ÿý†Bð²+´+²+´+² +³@B +°/´+°-/´(+°#/°?3´3+°=2²3# +³@3; +°C/° Ö´+³0 +´&+°± +´5+°5±B+±:22´A+°<2²AB +³@A? +±D+±0 ° 9±&± 99° @ *-238$9±°9±´  :$9°°89±#(² 0599901.#"#"&547326325&'&/67654&#"327#"&546233##xCL LZ.EG<46PB`,p'@7) ? (V~Q]$iJ4QQ4<( M@*+ .;) +BW68;"*$3- 2DJ=7Q(ZïX3ý”ÿïÿþ.+¶²+°'3´ +³) +´+°/°3´+°,/°Ö´ +° ±+´+² +³@ +² +³@ +°±+´$+±-+± °9°° 9°² 999°°9°$²'999±)°&9± °9°µ $$9013".5472632&547'#5!!67&'"Ž '0!1-Hh'#* ‚d.žþ¸e•,-.(5*f@*/:!3:gV³2"33ê†!S|^P "ÿ™þ55:Ʋ+´+² +³@5 +°° Ö´+°3/´0+°& Ö´!+°;/° Ö´+°±+´)+°)±5+²/6222´4+²45 +³@42 +±<+± ° 9°± 99°)°9°5µ!#8$9±°9±3@  $)./6:$9°&°#901.#"#"&547326325./7&54632&#"753##yENYM.EF 6 46FkMq_<+( $y…R3yUwW2) W6), .<) +EFL)[E/(8 DJ3ýž325!5!##{B OYM.DG 7 65"5- "!4>)b3þ|P3m' W6), *<) *ë/:'' , '&D2;(fÌ33ýcÿáÿæ.Hè°?/´+²? +³@?4 +°?°= Ö´+°/´+°)/°,3´*+°I/°DÖ´+°±+´+°±4+° 2´3+°3±& +´/+²/& +³@/, +²&/ +³@&) +±J+±D°F9°°G9°²?999°4³=$9°3±#(99°/°-9±=± 99±·#2DF$9°±&/99017326325.#"&54>323>54'!5!##5."#".5472*"…  9; ))&)H2 $þk>j3 k "*.È'3 æ-" !2% ,,>33-&5þ™4  ;'0%  ÿ™ s1<Ʋ+´+² +³@1 +°° Ö´+°!/´2+°:/´'+°/ Ö´,+²,/ +³@,* +°=/° Ö´+°±1+±)22´0+°+2²01 +³@0. +±>+± ± #99°1µ !'28$9±°9±!µ  #6$9°2²$)999°:°8901.#"#"&547326324&''654&#"'>32533##267&#"‚CPLZ.EG 6 462»$%.# n6…F3VV3þÏ # S34 ?2( M@!4 -<) +) WÁ"&!$ $1P‚ÑE3ýž ,+R)!ÿùÿ„.>ò+´+²+´+² +³@> +²+°2/´7+°+±+22´=+°=±9+´/+±@+± ° 9°>¶ $)$9±9=±2499±2´  +$9°7±499°<µ&)/5$901.#"#"&547326325./67&'#5!!2#"'73254&##xCL LZ.EG<199b($fp”þ3@&69tMƒh," K94F' M@$1 *;) *IA] %M#6@33)9&1,&bNIg2 1 #3=ýÞÿðÿ™á.,3¨² +´+² +³@  +°° Ö´+°-/´+°/°3´+°4/°%Ö´*+°*±+²-222´+² +³@ +² +³@ +±5+±*%°'9°³ (0$9±°9±-µ %'*3$901726325.#"'675!5!##5.##".547„ƒ  Ÿ8"z˜þƒñ@4#:/ #*.) “2" H,Š6`-+33ýž5 ;'+* (&3{I`!ÿç!.8<¿²+°/´&+´)+°./´+°/´4+°9/´:+°=/°Ö´#+°#±1+´+°±++°2´+±>+±#° 9°1°!9°±&99°+µ ).46$9°° 9±&°+9±.)°#9°°9°µ !,17$9°4² 699901"32>7#.##".547326325#"&54632&%5!ï 9 !1- -!49;$1C1g7aD0;3%þí:œ 3 !þ]#"J5214B "èU>0!+$+_33ÿéÿhA.FJ²+´+² +³@E +°° Ö´+°/´#+°*/´9+°5/´0+°2°G/´H+°K/° Ö´+°° Ö´+°/´ +°±-+´7+°7±F+°2´E+°E±& +´B+±L+± ° 9±-° 9°7°9°F·#*02<$9°E°(9±°9±#² 999°*³ BD$9°9°&9°5²-3(999°0² 2<99901.#"#"&547326325#".'32654'#"&54632&#"3267#5!œA MLZ-EG 8 38 %9bC:"9%”T,P"5R3O)4! K%3!%33þMXc' M@*+ .;) +w1Jm_:“¥Q?3Z7?#00):2G #!9 D8þê“33ÿöÿ=è.18а/´+² +³@1 +°° Ö´+°!/´ +° 2°+/±.233´,+°9/° Ö´+°±$+´+²$ +³@$+ +°±1+±722´0+²01 +³@0. +±:+± ° 9°$² )*999±1µ !&2$9±°9±!± 99° ° 9°+²$799901.#"#"&5473263254&#""&547.'5#5!##5|C H YM.EF :56`#/*U.C‹ AMLò93ì?59.Ž( W6+* *;) +ø‚5+P,`)‰%""33ýB¾73Nàÿøÿ™ì.'5“²+´+² +³@' +°° Ö´+°!/±$(33´"+°6/° Ö´+°±'+±422´&+²&' +³@&$ +±7+± ° 9°'´ 0$9±°9±!´  4$901.#"#"&547326325./67.+5!##zENLZ.EG 8 46)“9-9Ye nô>4¶a/:R#-2) M@!4 .<) +;CR 89CG33ýžbN/- /jÿíÿ™…K²+´+² +³@K +°° Ö´+°%/´ +° °/ Ö´*+°6/°H3´7+°F2²76 +³@7D +°6° Ö´<+°L/° Ö´+°±2+´&+°±K+±C22´J+°E2²JK +³@JH +±M+± ² ,-999°2² */999°³':$9°K³#%$9±°9±*²  999±/%±#,99± µ"'-2:C$901.#"#"&547326324&#"327#"'#"'732654&+53263533##ENYM.EF 2 56P%!, <" 4#I5)*N3QQ32) W6), .<) +Ms/6 +:')01=3k_  $ÀW3ýžÿëÿ™è.*.5š²+´+² +³@* +°° Ö´+°$/±'+33´%+°6/° Ö´+°±*+²-/222´)+²)* +³@)' +±7+± ±#99°*µ!+3$9±°9±$¶ -15$901.##".547326325./67&'#5!##5&'o#g #*.)"† BdE*g-~IýF3ÖLŠI;0{V2 ;'+* (&3 /]G:%R#A33ýžb{šé(?+7qÿìÿ\ü.6?Ų+´+²+´+² +³@6 +°/´(+°/´<+°0/±3733´1+°@/° Ö°!2´+°±6+±>22´5+²56 +³@53 +±A+± ³ "./$9°6µ $+7$9±°9±²  999±(´!">$9°<°:9°0°.901.#"#"&54732632.#"#"'73267.'5#5!##6325”CPLZ.EF 7 29 :(20A,- B_853þß@5"'2n' M@*+ ';) * N4?4j" EK7"33ýaŸ84E®ÿ×ÿü.FN²,+°7/´+°: Ö´+° /´J+° Ö´+°"/±%G33´#+°O/°?Ö´D+°D±+´G&+²G +³@# +°G±,+° 2´++°+±L +´(+²(L +³@($ +±P+±D?±A99°´:B$9°G°9°,²7J999°+°N9°(°&9±:,°-9±7± 99°° 9°²?AD999± °*9±"Jµ(L$901726325.'#"&'6732654'#5!##5."#"#".5473254'}†   2 "<8 " $Ø7W33   k "*.*¥8$=„ è'‚3!'@* 33"<þ•4 ;'0% &'3w$H8%ÿóÿPó.:>½²+´+°° Ö´+²6+²8+°$/´/+°;/´<+°?/° Ö´+°±,+´'+°'±!+´2+³:2!+°3´9+±@+± ± 99°,± 99°'°*9°!·)/4$9±±799±$·  *,24$901.#"#"&547326325&/32>54&#"&54632'#5!zDNYM.EG<64‰¦_:&9 VB0d/7k•¥Y&4þyà{' W6'. .<) *Uy79!(# )7#$*9,JZ9o2Zq!!œ«33ÿíÿ¾ò.)-4°°/´+² +³@) +°° Ö´+°*/´!+°#/°&3´$+°5/° Ö´+°±)+³!*.$2´(+²() +³@(& +²)( +³@)# +±6+± ° 9°)´,1$9±°9°°9°*@  -/4$901.#"#".547326325.#"'675!5!##'~CP/D#-DG<19š:!~”þoA39Vˆ0 %ˆ& ,-&- /;( *%-‰6b++33ýÃß@>e X,ÿóÿqà.)18Ÿ²+´+² +³@) +°° Ö´+²+°#/°&3´$+°9/° Ö´+°±)+²!2222´(+²() +³@(& +²)( +³@)# +±:+± ° 9°)µ -15$9±#·  *.28$901.##"&547326325.#"'675!5!##'.'7l$;.2D.)#‰š: !~”þ‡íA3X_:,n6”(†Z%O:1$ (&3 o-‰6b++33ývµ&Q . I7QHY*ÿÕÿ™¼.M`eI²+´+² +³@M +°° Ö´+°?/´D+°V/±+I33´e+°62³'eV+´.+°N2°1/²4^a333´2+°f/° Ö´+°, Ö´)+²,) +³@,1 +°±"+°^2´Q+´b+°Q±M+²Ua222´L+°52°L±F+´<+²" 5$,3#3þÇY%( )0" ÿéÿÿÍþV6²6+´'+°,/´1+°/´+° /°3´+°C/° 3´D+° 2°K/´T+°H Ö´+°W/°MÖ´R+°R±9+´$+²9$ +³@9C +°$±A+°2´+° 2°±*+°E2´3+° 2³3*+´+² +³@ +±X+±RM²>?O999°9°P9°$±T99°Aµ"'6;K$9°²/H999°*³.1$9°°9±,'´$./39$9°1±";99±±99° ´>?$9°°A90167723##"'73>54'32654#"'632#"&547./675#5!4&#"#"547326c' 'Fy52\Â,0!K  Y8H%%P #'Ks93@<(2 DoïW1 A™/DRkAYø)<3!7!H, F^iH8#Q*&%4[54'32654#"'632#67AC K55 .